// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/bot_scaling.proto

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	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

// Specifies mode for a bot policy
type BotPolicy_Mode int32

const (
	BotPolicy_UNKNOWN_MODE BotPolicy_Mode = 0
	// Collect stats only for a bot group.
	BotPolicy_MONITORED BotPolicy_Mode = 1
	// Generate configuration updates for bot group.
	BotPolicy_CONFIGURED BotPolicy_Mode = 2
)

var BotPolicy_Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var BotPolicy_Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x BotPolicy_Mode) String() string {
	return proto.EnumName(BotPolicy_Mode_name, int32(x))
}

func (BotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 0}
}

// Specifies if there has been a change since the last iteration.
type ScalingAction_Actionable int32

const (
	ScalingAction_UNSPECIFIED ScalingAction_Actionable = 0
	// There is a change since last time.
	ScalingAction_YES ScalingAction_Actionable = 1
	// There is no change since last time.
	ScalingAction_NO ScalingAction_Actionable = 2
)

var ScalingAction_Actionable_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "YES",
	2: "NO",
}

var ScalingAction_Actionable_value = map[string]int32{
	"UNSPECIFIED": 0,
	"YES":         1,
	"NO":          2,
}

func (x ScalingAction_Actionable) String() string {
	return proto.EnumName(ScalingAction_Actionable_name, int32(x))
}

func (ScalingAction_Actionable) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4, 0}
}

// Defines a type of bot associated with a bot group.
type BotType struct {
	// The string bot "shirt size" to be requested for the group.
	BotSize string `protobuf:"bytes,1,opt,name=bot_size,json=botSize,proto3" json:"bot_size,omitempty"`
	// The number of cores per bot. Will be used to limit quota usage.
	CoresPerBot          int32    `protobuf:"varint,2,opt,name=cores_per_bot,json=coresPerBot,proto3" json:"cores_per_bot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotType proto.InternalMessageInfo

func (m *BotType) GetBotSize() string {
	if m != nil {
		return m.BotSize
	}
	return ""
}

func (m *BotType) GetCoresPerBot() int32 {
	if m != nil {
		return m.CoresPerBot
	}
	return 0
}

// Defines Swarming dimensions associated with a bot group.
type SwarmingDimension struct {
	// Dimesion name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Dimension value
	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SwarmingDimension proto.InternalMessageInfo

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

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

// Bot Policy to apply to a bot group.
type BotPolicy struct {
	// Bot group controlled by this policy, like, 'cq', 'postsubmit',...
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot to be requested.
	BotType            *BotType                       `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	ScalingRestriction *BotPolicy_ScalingRestriction  `protobuf:"bytes,3,opt,name=scaling_restriction,json=scalingRestriction,proto3" json:"scaling_restriction,omitempty"`
	RegionRestrictions []*BotPolicy_RegionRestriction `protobuf:"bytes,4,rep,name=region_restrictions,json=regionRestrictions,proto3" json:"region_restrictions,omitempty"`
	// A set of dimensions used to validate current Swarming allocations.
	SwarmingDimensions []*SwarmingDimension `protobuf:"bytes,5,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	// Set whether a bot group should be configured or only monitored.
	PolicyMode BotPolicy_Mode `protobuf:"varint,6,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.BotPolicy_Mode" json:"policy_mode,omitempty"`
	// Number of hours to lookback for Swarming stats.
	LookbackHours        int32    `protobuf:"zigzag32,7,opt,name=lookback_hours,json=lookbackHours,proto3" json:"lookback_hours,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotPolicy proto.InternalMessageInfo

func (m *BotPolicy) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *BotPolicy) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *BotPolicy) GetScalingRestriction() *BotPolicy_ScalingRestriction {
	if m != nil {
		return m.ScalingRestriction
	}
	return nil
}

func (m *BotPolicy) GetRegionRestrictions() []*BotPolicy_RegionRestriction {
	if m != nil {
		return m.RegionRestrictions
	}
	return nil
}

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

func (m *BotPolicy) GetPolicyMode() BotPolicy_Mode {
	if m != nil {
		return m.PolicyMode
	}
	return BotPolicy_UNKNOWN_MODE
}

func (m *BotPolicy) GetLookbackHours() int32 {
	if m != nil {
		return m.LookbackHours
	}
	return 0
}

// Scaling restriction specifies the limits on how the group can be
// expanded or reduced.
type BotPolicy_ScalingRestriction struct {
	// Hard limit on the maximum number of bots to request.
	BotCeiling int32 `protobuf:"varint,1,opt,name=bot_ceiling,json=botCeiling,proto3" json:"bot_ceiling,omitempty"`
	// Hard limit on the minimum number of bots to request.
	BotFloor int32 `protobuf:"varint,2,opt,name=bot_floor,json=botFloor,proto3" json:"bot_floor,omitempty"`
	// Soft limit on the number of idle bots to maintain.
	MinIdle int32 `protobuf:"varint,3,opt,name=min_idle,json=minIdle,proto3" json:"min_idle,omitempty"`
	// Hard minimum limit on the absolute delta between request amount and
	// existing bot count.
	StepSize int32 `protobuf:"varint,4,opt,name=step_size,json=stepSize,proto3" json:"step_size,omitempty"`
	// Static number to request when demand is not accessible.
	BotFallback          int32    `protobuf:"varint,5,opt,name=bot_fallback,json=botFallback,proto3" json:"bot_fallback,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotPolicy_ScalingRestriction proto.InternalMessageInfo

func (m *BotPolicy_ScalingRestriction) GetBotCeiling() int32 {
	if m != nil {
		return m.BotCeiling
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFloor() int32 {
	if m != nil {
		return m.BotFloor
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetMinIdle() int32 {
	if m != nil {
		return m.MinIdle
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetStepSize() int32 {
	if m != nil {
		return m.StepSize
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFallback() int32 {
	if m != nil {
		return m.BotFallback
	}
	return 0
}

// A set of restrictions on the regions and how to distribute bots
// between them.
type BotPolicy_RegionRestriction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Weight to be applied to this sub-group. The number of bots requested
	// from each region will be proportional to the weight unless a
	// quota limit is violated.
	Weight               float32  `protobuf:"fixed32,3,opt,name=weight,proto3" json:"weight,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BotPolicy_RegionRestriction) Reset()         { *m = BotPolicy_RegionRestriction{} }
func (m *BotPolicy_RegionRestriction) String() string { return proto.CompactTextString(m) }
func (*BotPolicy_RegionRestriction) ProtoMessage()    {}
func (*BotPolicy_RegionRestriction) Descriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

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

var xxx_messageInfo_BotPolicy_RegionRestriction proto.InternalMessageInfo

func (m *BotPolicy_RegionRestriction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetWeight() float32 {
	if m != nil {
		return m.Weight
	}
	return 0
}

// Configures the root message.
type BotPolicyCfg struct {
	// All bot policies.
	BotPolicies          []*BotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_BotPolicyCfg proto.InternalMessageInfo

func (m *BotPolicyCfg) GetBotPolicies() []*BotPolicy {
	if m != nil {
		return m.BotPolicies
	}
	return nil
}

// Scaling Action that resulted because of bot demand.
type ScalingAction struct {
	// Bot group modified by the action. Should be the same as BotPolicy.
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot requested. Should be the same as BotPolicy.
	BotType *BotType `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	// Whether there has been a change in the number of bots requested
	// for this bot group. See step_size for more info.
	Actionable ScalingAction_Actionable `protobuf:"varint,3,opt,name=actionable,proto3,enum=chromiumos.ScalingAction_Actionable" json:"actionable,omitempty"`
	// Total number of bots requested for the group.
	BotsRequested        int32                           `protobuf:"varint,4,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	RegionalActions      []*ScalingAction_RegionalAction `protobuf:"bytes,5,rep,name=regional_actions,json=regionalActions,proto3" json:"regional_actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

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

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

var xxx_messageInfo_ScalingAction proto.InternalMessageInfo

func (m *ScalingAction) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *ScalingAction) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *ScalingAction) GetActionable() ScalingAction_Actionable {
	if m != nil {
		return m.Actionable
	}
	return ScalingAction_UNSPECIFIED
}

func (m *ScalingAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

func (m *ScalingAction) GetRegionalActions() []*ScalingAction_RegionalAction {
	if m != nil {
		return m.RegionalActions
	}
	return nil
}

// How the bot requests are distributed between regions & prefixes.
type ScalingAction_RegionalAction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Number of bots requested from the sub-group.
	BotsRequested        int32    `protobuf:"varint,3,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ScalingAction_RegionalAction proto.InternalMessageInfo

func (m *ScalingAction_RegionalAction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

// All the actions that will be executed by RoboCrop.
type RoboCropAction struct {
	// List of an action per bot group scaled by RoboCrop.
	ScalingActions       []*ScalingAction `protobuf:"bytes,1,rep,name=scaling_actions,json=scalingActions,proto3" json:"scaling_actions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_RoboCropAction proto.InternalMessageInfo

func (m *RoboCropAction) GetScalingActions() []*ScalingAction {
	if m != nil {
		return m.ScalingActions
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BotPolicy_Mode", BotPolicy_Mode_name, BotPolicy_Mode_value)
	proto.RegisterEnum("chromiumos.ScalingAction_Actionable", ScalingAction_Actionable_name, ScalingAction_Actionable_value)
	proto.RegisterType((*BotType)(nil), "chromiumos.BotType")
	proto.RegisterType((*SwarmingDimension)(nil), "chromiumos.SwarmingDimension")
	proto.RegisterType((*BotPolicy)(nil), "chromiumos.BotPolicy")
	proto.RegisterType((*BotPolicy_ScalingRestriction)(nil), "chromiumos.BotPolicy.ScalingRestriction")
	proto.RegisterType((*BotPolicy_RegionRestriction)(nil), "chromiumos.BotPolicy.RegionRestriction")
	proto.RegisterType((*BotPolicyCfg)(nil), "chromiumos.BotPolicyCfg")
	proto.RegisterType((*ScalingAction)(nil), "chromiumos.ScalingAction")
	proto.RegisterType((*ScalingAction_RegionalAction)(nil), "chromiumos.ScalingAction.RegionalAction")
	proto.RegisterType((*RoboCropAction)(nil), "chromiumos.RoboCropAction")
}

func init() { proto.RegisterFile("chromiumos/bot_scaling.proto", fileDescriptor_dbe70eabfd64e7ef) }

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