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

package chromiumos

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

// Used to control running of special steps.
type BuilderConfig_RunSpec int32

const (
	BuilderConfig_RUN_SPEC_UNSPECIFIED BuilderConfig_RunSpec = 0
	// Do not run.
	BuilderConfig_NO_RUN BuilderConfig_RunSpec = 1
	// Run.
	BuilderConfig_RUN BuilderConfig_RunSpec = 2
	// Run and then exit.
	BuilderConfig_RUN_EXIT BuilderConfig_RunSpec = 3
)

var BuilderConfig_RunSpec_name = map[int32]string{
	0: "RUN_SPEC_UNSPECIFIED",
	1: "NO_RUN",
	2: "RUN",
	3: "RUN_EXIT",
}

var BuilderConfig_RunSpec_value = map[string]int32{
	"RUN_SPEC_UNSPECIFIED": 0,
	"NO_RUN":               1,
	"RUN":                  2,
	"RUN_EXIT":             3,
}

func (x BuilderConfig_RunSpec) String() string {
	return proto.EnumName(BuilderConfig_RunSpec_name, int32(x))
}

func (BuilderConfig_RunSpec) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 0}
}

// Type of build.
type BuilderConfig_Id_Type int32

const (
	BuilderConfig_Id_TYPE_UNSPECIFIED BuilderConfig_Id_Type = 0
	// Commit queue build.
	BuilderConfig_Id_CQ BuilderConfig_Id_Type = 1
	// Postsubmit build.
	BuilderConfig_Id_POSTSUBMIT BuilderConfig_Id_Type = 2
	// Toolchain build.
	BuilderConfig_Id_TOOLCHAIN BuilderConfig_Id_Type = 3
	// Informational build.
	BuilderConfig_Id_INFORMATIONAL BuilderConfig_Id_Type = 4
)

var BuilderConfig_Id_Type_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "CQ",
	2: "POSTSUBMIT",
	3: "TOOLCHAIN",
	4: "INFORMATIONAL",
}

var BuilderConfig_Id_Type_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"CQ":               1,
	"POSTSUBMIT":       2,
	"TOOLCHAIN":        3,
	"INFORMATIONAL":    4,
}

func (x BuilderConfig_Id_Type) String() string {
	return proto.EnumName(BuilderConfig_Id_Type_name, int32(x))
}

func (BuilderConfig_Id_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 0, 0}
}

type BuilderConfig_General_Environment int32

const (
	BuilderConfig_General_ENVIRONMENT_UNSPECIFIED BuilderConfig_General_Environment = 0
	BuilderConfig_General_PRODUCTION              BuilderConfig_General_Environment = 1
	BuilderConfig_General_STAGING                 BuilderConfig_General_Environment = 2
)

var BuilderConfig_General_Environment_name = map[int32]string{
	0: "ENVIRONMENT_UNSPECIFIED",
	1: "PRODUCTION",
	2: "STAGING",
}

var BuilderConfig_General_Environment_value = map[string]int32{
	"ENVIRONMENT_UNSPECIFIED": 0,
	"PRODUCTION":              1,
	"STAGING":                 2,
}

func (x BuilderConfig_General_Environment) String() string {
	return proto.EnumName(BuilderConfig_General_Environment_name, int32(x))
}

func (BuilderConfig_General_Environment) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1, 0}
}

type BuilderConfig_General_RunWhen_Mode int32

const (
	BuilderConfig_General_RunWhen_MODE_UNSPECIFIED BuilderConfig_General_RunWhen_Mode = 0
	// Always run this builder. The file_patterns field will be ignored
	// when this mode is selected.
	BuilderConfig_General_RunWhen_ALWAYS_RUN BuilderConfig_General_RunWhen_Mode = 1
	// Only run this builder if any file in the input gerrit_changes
	// matches any file_pattern specified below. If file_patterns is empty,
	// this option implies the builder will never run.
	BuilderConfig_General_RunWhen_ONLY_RUN_ON_FILE_MATCH BuilderConfig_General_RunWhen_Mode = 2
	// Do not run the builder if all files in the input gerrit_changes
	// match any file_attern speicifed below. If file_patterns is empty,
	// this option implies the builder will always run.
	BuilderConfig_General_RunWhen_NO_RUN_ON_FILE_MATCH BuilderConfig_General_RunWhen_Mode = 3
)

var BuilderConfig_General_RunWhen_Mode_name = map[int32]string{
	0: "MODE_UNSPECIFIED",
	1: "ALWAYS_RUN",
	2: "ONLY_RUN_ON_FILE_MATCH",
	3: "NO_RUN_ON_FILE_MATCH",
}

var BuilderConfig_General_RunWhen_Mode_value = map[string]int32{
	"MODE_UNSPECIFIED":       0,
	"ALWAYS_RUN":             1,
	"ONLY_RUN_ON_FILE_MATCH": 2,
	"NO_RUN_ON_FILE_MATCH":   3,
}

func (x BuilderConfig_General_RunWhen_Mode) String() string {
	return proto.EnumName(BuilderConfig_General_RunWhen_Mode_name, int32(x))
}

func (BuilderConfig_General_RunWhen_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1, 0, 0}
}

type BuilderConfig_Orchestrator_ChildSpec_CollectHandling int32

const (
	BuilderConfig_Orchestrator_ChildSpec_COLLECT_HANDLING_UNSPECIFIED BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 0
	// Indicates the result should be collected. Currently also indicates
	// that should the orchestrator terminate before this child finishes
	// the child will be killed.
	BuilderConfig_Orchestrator_ChildSpec_COLLECT BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 1
	// Indicates the result should not be collected. Currently also
	// indicates that should the orchestrator terminate before this child
	// finishes this child is allowed to continue.
	BuilderConfig_Orchestrator_ChildSpec_NO_COLLECT BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 2
)

var BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name = map[int32]string{
	0: "COLLECT_HANDLING_UNSPECIFIED",
	1: "COLLECT",
	2: "NO_COLLECT",
}

var BuilderConfig_Orchestrator_ChildSpec_CollectHandling_value = map[string]int32{
	"COLLECT_HANDLING_UNSPECIFIED": 0,
	"COLLECT":                      1,
	"NO_COLLECT":                   2,
}

func (x BuilderConfig_Orchestrator_ChildSpec_CollectHandling) String() string {
	return proto.EnumName(BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name, int32(x))
}

func (BuilderConfig_Orchestrator_ChildSpec_CollectHandling) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 2, 0, 0}
}

// How to handle the uploading of prebuilts.
type BuilderConfig_Artifacts_Prebuilts int32

const (
	BuilderConfig_Artifacts_PREBUILTS_UNSPECIFIED BuilderConfig_Artifacts_Prebuilts = 0
	BuilderConfig_Artifacts_PUBLIC                BuilderConfig_Artifacts_Prebuilts = 1
	BuilderConfig_Artifacts_PRIVATE               BuilderConfig_Artifacts_Prebuilts = 2
	BuilderConfig_Artifacts_NONE                  BuilderConfig_Artifacts_Prebuilts = 3
)

var BuilderConfig_Artifacts_Prebuilts_name = map[int32]string{
	0: "PREBUILTS_UNSPECIFIED",
	1: "PUBLIC",
	2: "PRIVATE",
	3: "NONE",
}

var BuilderConfig_Artifacts_Prebuilts_value = map[string]int32{
	"PREBUILTS_UNSPECIFIED": 0,
	"PUBLIC":                1,
	"PRIVATE":               2,
	"NONE":                  3,
}

func (x BuilderConfig_Artifacts_Prebuilts) String() string {
	return proto.EnumName(BuilderConfig_Artifacts_Prebuilts_name, int32(x))
}

func (BuilderConfig_Artifacts_Prebuilts) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 3, 0}
}

// Used to indicate artifact types that should be uploaded by the builder.
// Must be kept in sync with the dictionary in:
// https://chromium.googlesource.com/chromiumos/infra/recipes/+/refs/heads/master/recipe_modules/cros_artifacts/api.py
// TODO(crbug/1034529): Being replaced by common.ArtifactsByService, to
// eliminate the need to update cros_artifacts every time an artifact type
// is added.
type BuilderConfig_Artifacts_ArtifactTypes int32

const (
	BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED BuilderConfig_Artifacts_ArtifactTypes = 0
	// Indicates wanting a zip file of everything in the image directory.
	BuilderConfig_Artifacts_IMAGE_ZIP BuilderConfig_Artifacts_ArtifactTypes = 1
	// Indicates wanting update payloads.
	BuilderConfig_Artifacts_TEST_UPDATE_PAYLOAD BuilderConfig_Artifacts_ArtifactTypes = 2
	// Indicates wanting the autotest tarballs.
	BuilderConfig_Artifacts_AUTOTEST_FILES BuilderConfig_Artifacts_ArtifactTypes = 3
	// Indicates wanting a tarball containing private TAST test bundles.
	BuilderConfig_Artifacts_TAST_FILES BuilderConfig_Artifacts_ArtifactTypes = 4
	// Indicates wanting a tarball containing guest images and test bundles.
	BuilderConfig_Artifacts_PINNED_GUEST_IMAGES BuilderConfig_Artifacts_ArtifactTypes = 5
	// Indicates wanting an archive of firmware images built from source.
	BuilderConfig_Artifacts_FIRMWARE BuilderConfig_Artifacts_ArtifactTypes = 6
	// Indicates wanting a tarball of the Ebuilds logs.
	BuilderConfig_Artifacts_EBUILD_LOGS BuilderConfig_Artifacts_ArtifactTypes = 7
	// Indicates wanting an archive of the ChromeOS Config.
	BuilderConfig_Artifacts_CHROMEOS_CONFIG BuilderConfig_Artifacts_ArtifactTypes = 8
	// Indicates wanting the CPE report.
	BuilderConfig_Artifacts_CPE_REPORT BuilderConfig_Artifacts_ArtifactTypes = 9
	// Indicates wanting a tar.xz archive for each image that has been created.
	BuilderConfig_Artifacts_IMAGE_ARCHIVES BuilderConfig_Artifacts_ArtifactTypes = 10
	// Artifacts used by the toolchain.
	//
	// Indicates an unvetted orderfile for Chrome.
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_LLVM_ORDERFILE BuilderConfig_Artifacts_ArtifactTypes = 11
	// Indicates a vetted orderfile for Chrome.
	BuilderConfig_Artifacts_VERIFIED_CHROME_LLVM_ORDERFILE BuilderConfig_Artifacts_ArtifactTypes = 12
	// Indicates a clang-tidy artifact.
	BuilderConfig_Artifacts_CHROME_CLANG_WARNINGS_FILE BuilderConfig_Artifacts_ArtifactTypes = 13
	// Indicates a PGO artifact for the compiler.
	BuilderConfig_Artifacts_UNVERIFIED_LLVM_PGO_FILE BuilderConfig_Artifacts_ArtifactTypes = 14
	// Indicates an unvetted AFDO Chrome profile.  (Generated by HW Tests in
	// the benchmark-afdo-generate builder.)
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 15
	// Indicates a vetted AFDO Chrome profile.
	BuilderConfig_Artifacts_VERIFIED_CHROME_BENCHMARK_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 16
	// Indicates a vetted AFDO Kernel profile.
	BuilderConfig_Artifacts_VERIFIED_KERNEL_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 17
	// Indicates an unvetted AFDO Kernel CWP profile.
	BuilderConfig_Artifacts_UNVERIFIED_KERNEL_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 18
	// Indicates an unvetted AFDO Chrome CWP profile.
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 19
	// Indicates a vetted AFDO Chrome CWP profile.
	BuilderConfig_Artifacts_VERIFIED_CHROME_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 20
	// Indicates a vetted AFDO profile for release.
	BuilderConfig_Artifacts_VERIFIED_RELEASE_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 21
	// Indicates an unvetted AFDO perf data file (from HW Test).
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_BENCHMARK_PERF_FILE BuilderConfig_Artifacts_ArtifactTypes = 22
	// Indicates an unstripped Chrome binary.
	BuilderConfig_Artifacts_CHROME_DEBUG_BINARY BuilderConfig_Artifacts_ArtifactTypes = 23
	// Indicates toolchain logs for the compiler warnings for werror monitor
	BuilderConfig_Artifacts_TOOLCHAIN_WARNING_LOGS BuilderConfig_Artifacts_ArtifactTypes = 24
)

var BuilderConfig_Artifacts_ArtifactTypes_name = map[int32]string{
	0:  "ARTIFACT_TYPES_UNSPECIFIED",
	1:  "IMAGE_ZIP",
	2:  "TEST_UPDATE_PAYLOAD",
	3:  "AUTOTEST_FILES",
	4:  "TAST_FILES",
	5:  "PINNED_GUEST_IMAGES",
	6:  "FIRMWARE",
	7:  "EBUILD_LOGS",
	8:  "CHROMEOS_CONFIG",
	9:  "CPE_REPORT",
	10: "IMAGE_ARCHIVES",
	11: "UNVERIFIED_CHROME_LLVM_ORDERFILE",
	12: "VERIFIED_CHROME_LLVM_ORDERFILE",
	13: "CHROME_CLANG_WARNINGS_FILE",
	14: "UNVERIFIED_LLVM_PGO_FILE",
	15: "UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE",
	16: "VERIFIED_CHROME_BENCHMARK_AFDO_FILE",
	17: "VERIFIED_KERNEL_CWP_AFDO_FILE",
	18: "UNVERIFIED_KERNEL_CWP_AFDO_FILE",
	19: "UNVERIFIED_CHROME_CWP_AFDO_FILE",
	20: "VERIFIED_CHROME_CWP_AFDO_FILE",
	21: "VERIFIED_RELEASE_AFDO_FILE",
	22: "UNVERIFIED_CHROME_BENCHMARK_PERF_FILE",
	23: "CHROME_DEBUG_BINARY",
	24: "TOOLCHAIN_WARNING_LOGS",
}

var BuilderConfig_Artifacts_ArtifactTypes_value = map[string]int32{
	"ARTIFACT_TYPES_UNSPECIFIED":            0,
	"IMAGE_ZIP":                             1,
	"TEST_UPDATE_PAYLOAD":                   2,
	"AUTOTEST_FILES":                        3,
	"TAST_FILES":                            4,
	"PINNED_GUEST_IMAGES":                   5,
	"FIRMWARE":                              6,
	"EBUILD_LOGS":                           7,
	"CHROMEOS_CONFIG":                       8,
	"CPE_REPORT":                            9,
	"IMAGE_ARCHIVES":                        10,
	"UNVERIFIED_CHROME_LLVM_ORDERFILE":      11,
	"VERIFIED_CHROME_LLVM_ORDERFILE":        12,
	"CHROME_CLANG_WARNINGS_FILE":            13,
	"UNVERIFIED_LLVM_PGO_FILE":              14,
	"UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE": 15,
	"VERIFIED_CHROME_BENCHMARK_AFDO_FILE":   16,
	"VERIFIED_KERNEL_CWP_AFDO_FILE":         17,
	"UNVERIFIED_KERNEL_CWP_AFDO_FILE":       18,
	"UNVERIFIED_CHROME_CWP_AFDO_FILE":       19,
	"VERIFIED_CHROME_CWP_AFDO_FILE":         20,
	"VERIFIED_RELEASE_AFDO_FILE":            21,
	"UNVERIFIED_CHROME_BENCHMARK_PERF_FILE": 22,
	"CHROME_DEBUG_BINARY":                   23,
	"TOOLCHAIN_WARNING_LOGS":                24,
}

func (x BuilderConfig_Artifacts_ArtifactTypes) String() string {
	return proto.EnumName(BuilderConfig_Artifacts_ArtifactTypes_name, int32(x))
}

func (BuilderConfig_Artifacts_ArtifactTypes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 3, 1}
}

// Configuration used by a builder during execution.
type BuilderConfig struct {
	Id                   *BuilderConfig_Id           `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	General              *BuilderConfig_General      `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"`
	Orchestrator         *BuilderConfig_Orchestrator `protobuf:"bytes,3,opt,name=orchestrator,proto3" json:"orchestrator,omitempty"`
	Artifacts            *BuilderConfig_Artifacts    `protobuf:"bytes,4,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	Chrome               *BuilderConfig_Chrome       `protobuf:"bytes,5,opt,name=chrome,proto3" json:"chrome,omitempty"`
	Build                *BuilderConfig_Build        `protobuf:"bytes,6,opt,name=build,proto3" json:"build,omitempty"`
	UnitTests            *BuilderConfig_UnitTests    `protobuf:"bytes,7,opt,name=unit_tests,json=unitTests,proto3" json:"unit_tests,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig proto.InternalMessageInfo

func (m *BuilderConfig) GetId() *BuilderConfig_Id {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *BuilderConfig) GetGeneral() *BuilderConfig_General {
	if m != nil {
		return m.General
	}
	return nil
}

func (m *BuilderConfig) GetOrchestrator() *BuilderConfig_Orchestrator {
	if m != nil {
		return m.Orchestrator
	}
	return nil
}

func (m *BuilderConfig) GetArtifacts() *BuilderConfig_Artifacts {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

func (m *BuilderConfig) GetChrome() *BuilderConfig_Chrome {
	if m != nil {
		return m.Chrome
	}
	return nil
}

func (m *BuilderConfig) GetBuild() *BuilderConfig_Build {
	if m != nil {
		return m.Build
	}
	return nil
}

func (m *BuilderConfig) GetUnitTests() *BuilderConfig_UnitTests {
	if m != nil {
		return m.UnitTests
	}
	return nil
}

// Unique identifier of the builder configuration.
type BuilderConfig_Id struct {
	// The name of the configuration such as "arm-generic-postsubmit".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Branch the configuration applies to such as "release-R73-11647.B".
	Branch               string                `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"`
	Type                 BuilderConfig_Id_Type `protobuf:"varint,3,opt,name=type,proto3,enum=chromiumos.BuilderConfig_Id_Type" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Id proto.InternalMessageInfo

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

func (m *BuilderConfig_Id) GetBranch() string {
	if m != nil {
		return m.Branch
	}
	return ""
}

func (m *BuilderConfig_Id) GetType() BuilderConfig_Id_Type {
	if m != nil {
		return m.Type
	}
	return BuilderConfig_Id_TYPE_UNSPECIFIED
}

// General configuration for the builder.
type BuilderConfig_General struct {
	// Whether or not the build is considered critical. A failure in a critical
	// build for a CQ builder may, for example, prevent submission of the CL.
	Critical    *wrappers.BoolValue               `protobuf:"bytes,1,opt,name=critical,proto3" json:"critical,omitempty"`
	Environment BuilderConfig_General_Environment `protobuf:"varint,2,opt,name=environment,proto3,enum=chromiumos.BuilderConfig_General_Environment" json:"environment,omitempty"`
	// A rule describing conditions under which this builder should be launched.
	RunWhen *BuilderConfig_General_RunWhen `protobuf:"bytes,3,opt,name=run_when,json=runWhen,proto3" json:"run_when,omitempty"`
	// Time before which ToT had a bug that would not manifest at the
	// build stage. The CQ orchestrator should NOT reuse successful builds
	// of the build_config before this.
	BrokenBefore *timestamp.Timestamp `protobuf:"bytes,4,opt,name=broken_before,json=brokenBefore,proto3" json:"broken_before,omitempty"`
	// If present, this version number will be written to a version file
	// alongside a bot's SDK Cache (chroot). On subsequent bot-run where an SDK
	// Cache already exists, the version number in config will be compared to
	// the number present in the version file, and the SDK Cache will be
	// invalidated if there is a mismatch.
	SdkCacheVersion int32 `protobuf:"varint,5,opt,name=sdk_cache_version,json=sdkCacheVersion,proto3" json:"sdk_cache_version,omitempty"`
	// Indicates whether the target is a unibuild.
	Unibuild             bool     `protobuf:"varint,6,opt,name=unibuild,proto3" json:"unibuild,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_General proto.InternalMessageInfo

func (m *BuilderConfig_General) GetCritical() *wrappers.BoolValue {
	if m != nil {
		return m.Critical
	}
	return nil
}

func (m *BuilderConfig_General) GetEnvironment() BuilderConfig_General_Environment {
	if m != nil {
		return m.Environment
	}
	return BuilderConfig_General_ENVIRONMENT_UNSPECIFIED
}

func (m *BuilderConfig_General) GetRunWhen() *BuilderConfig_General_RunWhen {
	if m != nil {
		return m.RunWhen
	}
	return nil
}

func (m *BuilderConfig_General) GetBrokenBefore() *timestamp.Timestamp {
	if m != nil {
		return m.BrokenBefore
	}
	return nil
}

func (m *BuilderConfig_General) GetSdkCacheVersion() int32 {
	if m != nil {
		return m.SdkCacheVersion
	}
	return 0
}

func (m *BuilderConfig_General) GetUnibuild() bool {
	if m != nil {
		return m.Unibuild
	}
	return false
}

// Rule describing conditions under which a builder should be launched.
type BuilderConfig_General_RunWhen struct {
	Mode BuilderConfig_General_RunWhen_Mode `protobuf:"varint,1,opt,name=mode,proto3,enum=chromiumos.BuilderConfig_General_RunWhen_Mode" json:"mode,omitempty"`
	// chromiumos code file patterns, relative to chromiumos root, which may
	// use * or ** for globbing.
	// e.g.
	// chromite/myfile.txt
	// chromite/config/*
	// **/*.md
	FilePatterns         []string `protobuf:"bytes,2,rep,name=file_patterns,json=filePatterns,proto3" json:"file_patterns,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_General_RunWhen proto.InternalMessageInfo

func (m *BuilderConfig_General_RunWhen) GetMode() BuilderConfig_General_RunWhen_Mode {
	if m != nil {
		return m.Mode
	}
	return BuilderConfig_General_RunWhen_MODE_UNSPECIFIED
}

func (m *BuilderConfig_General_RunWhen) GetFilePatterns() []string {
	if m != nil {
		return m.FilePatterns
	}
	return nil
}

// Configuration pertaining to builders operating as "orchestrators".
// Orchestrators orchestrate the running of other child builders.
type BuilderConfig_Orchestrator struct {
	ChildSpecs []*BuilderConfig_Orchestrator_ChildSpec `protobuf:"bytes,5,rep,name=child_specs,json=childSpecs,proto3" json:"child_specs,omitempty"`
	// GitilesCommit to use if not provided.
	GitilesCommit *GitilesCommit `protobuf:"bytes,2,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// GerritChanges to apply.  To ignore these changes, use
	// $chromeos/cros_infra_config.ignore_config_changelist=True.
	GerritChanges        []*GerritChange                                  `protobuf:"bytes,3,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	FollowOnOrchestrator *BuilderConfig_Orchestrator_FollowOnOrchestrator `protobuf:"bytes,4,opt,name=follow_on_orchestrator,json=followOnOrchestrator,proto3" json:"follow_on_orchestrator,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator proto.InternalMessageInfo

func (m *BuilderConfig_Orchestrator) GetChildSpecs() []*BuilderConfig_Orchestrator_ChildSpec {
	if m != nil {
		return m.ChildSpecs
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetGitilesCommit() *GitilesCommit {
	if m != nil {
		return m.GitilesCommit
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetGerritChanges() []*GerritChange {
	if m != nil {
		return m.GerritChanges
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetFollowOnOrchestrator() *BuilderConfig_Orchestrator_FollowOnOrchestrator {
	if m != nil {
		return m.FollowOnOrchestrator
	}
	return nil
}

// Defines a child the orchestrator spawns and how it is handled.
type BuilderConfig_Orchestrator_ChildSpec struct {
	// BuilderConfig.Id.name of the child build. Would be expected to match
	// this name and the BuilderConfig.Id.branch and BuilderConfig.Id.type of
	// this parent orchestrator builder.
	Name                 string                                               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	CollectHandling      BuilderConfig_Orchestrator_ChildSpec_CollectHandling `protobuf:"varint,2,opt,name=collect_handling,json=collectHandling,proto3,enum=chromiumos.BuilderConfig_Orchestrator_ChildSpec_CollectHandling" json:"collect_handling,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                             `json:"-"`
	XXX_unrecognized     []byte                                               `json:"-"`
	XXX_sizecache        int32                                                `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_ChildSpec proto.InternalMessageInfo

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

func (m *BuilderConfig_Orchestrator_ChildSpec) GetCollectHandling() BuilderConfig_Orchestrator_ChildSpec_CollectHandling {
	if m != nil {
		return m.CollectHandling
	}
	return BuilderConfig_Orchestrator_ChildSpec_COLLECT_HANDLING_UNSPECIFIED
}

// Follow on orchestrator to launch, and possibly wait for.
type BuilderConfig_Orchestrator_FollowOnOrchestrator struct {
	// BuilderConfig.Id.name of the follow on orchestrator.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Whether to wait for the follow on orchestrator to finish.
	AwaitCompletion      bool     `protobuf:"varint,2,opt,name=await_completion,json=awaitCompletion,proto3" json:"await_completion,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_FollowOnOrchestrator proto.InternalMessageInfo

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

func (m *BuilderConfig_Orchestrator_FollowOnOrchestrator) GetAwaitCompletion() bool {
	if m != nil {
		return m.AwaitCompletion
	}
	return false
}

// Configuration pertaining to artifacts produced during a build.
type BuilderConfig_Artifacts struct {
	Prebuilts     BuilderConfig_Artifacts_Prebuilts       `protobuf:"varint,1,opt,name=prebuilts,proto3,enum=chromiumos.BuilderConfig_Artifacts_Prebuilts" json:"prebuilts,omitempty"`
	ArtifactTypes []BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,2,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Google storage bucket to upload prebuilts to.
	PrebuiltsGsBucket string `protobuf:"bytes,3,opt,name=prebuilts_gs_bucket,json=prebuiltsGsBucket,proto3" json:"prebuilts_gs_bucket,omitempty"`
	// Google storage bucket to upload all artifacts to.
	ArtifactsGsBucket string `protobuf:"bytes,4,opt,name=artifacts_gs_bucket,json=artifactsGsBucket,proto3" json:"artifacts_gs_bucket,omitempty"`
	// There may be more than one set of publishing instructions.
	PublishArtifacts []*BuilderConfig_Artifacts_PublishInfo `protobuf:"bytes,5,rep,name=publish_artifacts,json=publishArtifacts,proto3" json:"publish_artifacts,omitempty"`
	// There may be more than one set of consumable artifacts.
	InputArtifacts []*BuilderConfig_Artifacts_InputArtifactInfo `protobuf:"bytes,6,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Profile information needed by artifact prepare/bundle endpoints.
	// TODO(crbug/1034529): DEPRECATED: see artifacts_info.
	ArtifactProfileInfo *ArtifactProfileInfo `protobuf:"bytes,7,opt,name=artifact_profile_info,json=artifactProfileInfo,proto3" json:"artifact_profile_info,omitempty"`
	// Artifacts separated by service.
	ArtifactsInfo        *ArtifactsByService `protobuf:"bytes,8,opt,name=artifacts_info,json=artifactsInfo,proto3" json:"artifacts_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts) GetPrebuilts() BuilderConfig_Artifacts_Prebuilts {
	if m != nil {
		return m.Prebuilts
	}
	return BuilderConfig_Artifacts_PREBUILTS_UNSPECIFIED
}

func (m *BuilderConfig_Artifacts) GetArtifactTypes() []BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetPrebuiltsGsBucket() string {
	if m != nil {
		return m.PrebuiltsGsBucket
	}
	return ""
}

func (m *BuilderConfig_Artifacts) GetArtifactsGsBucket() string {
	if m != nil {
		return m.ArtifactsGsBucket
	}
	return ""
}

func (m *BuilderConfig_Artifacts) GetPublishArtifacts() []*BuilderConfig_Artifacts_PublishInfo {
	if m != nil {
		return m.PublishArtifacts
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetInputArtifacts() []*BuilderConfig_Artifacts_InputArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetArtifactProfileInfo() *ArtifactProfileInfo {
	if m != nil {
		return m.ArtifactProfileInfo
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetArtifactsInfo() *ArtifactsByService {
	if m != nil {
		return m.ArtifactsInfo
	}
	return nil
}

// TODO(crbug/1034529): DEPRECATED: see artifacts_info.
type BuilderConfig_Artifacts_PublishInfo struct {
	// Artifact types to publish to this bucket.
	PublishTypes []BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,2,rep,packed,name=publish_types,json=publishTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"publish_types,omitempty"`
	// GS location in which to publish artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	//   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
	//   %(artifact_name)s: The name of the artifact being published.
	PublishGsLocation string `protobuf:"bytes,3,opt,name=publish_gs_location,json=publishGsLocation,proto3" json:"publish_gs_location,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_PublishInfo proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts_PublishInfo) GetPublishTypes() []BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.PublishTypes
	}
	return nil
}

func (m *BuilderConfig_Artifacts_PublishInfo) GetPublishGsLocation() string {
	if m != nil {
		return m.PublishGsLocation
	}
	return ""
}

func (m *BuilderConfig_Artifacts_PublishInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

// TODO(crbug/1034529): DEPRECATED: see artifacts_info.
type BuilderConfig_Artifacts_InputArtifactInfo struct {
	// Artifact type to seek in these buckets.  Use the first instance of the
	// artifact found in the list of locations.
	InputArtifactType BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,opt,name=input_artifact_type,json=inputArtifactType,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"input_artifact_type,omitempty"`
	// Google storage locations containing these artifacts.
	InputArtifactGsLocations []string `protobuf:"bytes,2,rep,name=input_artifact_gs_locations,json=inputArtifactGsLocations,proto3" json:"input_artifact_gs_locations,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_InputArtifactInfo proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts_InputArtifactInfo) GetInputArtifactType() BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.InputArtifactType
	}
	return BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED
}

func (m *BuilderConfig_Artifacts_InputArtifactInfo) GetInputArtifactGsLocations() []string {
	if m != nil {
		return m.InputArtifactGsLocations
	}
	return nil
}

// Configuration pertaining to Chrome.
type BuilderConfig_Chrome struct {
	// Whether to build internal or external Chrome. Internal chrome adds
	// Chrome branding.
	Internal             bool     `protobuf:"varint,1,opt,name=internal,proto3" json:"internal,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Chrome proto.InternalMessageInfo

func (m *BuilderConfig_Chrome) GetInternal() bool {
	if m != nil {
		return m.Internal
	}
	return false
}

// Build specific configuration.
type BuilderConfig_Build struct {
	// USE flags to use with the build.
	UseFlags       []*UseFlag                          `protobuf:"bytes,1,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	PortageProfile *BuilderConfig_Build_PortageProfile `protobuf:"bytes,2,opt,name=portage_profile,json=portageProfile,proto3" json:"portage_profile,omitempty"`
	// Whether to apply gerrit changes, if any. Use case is to build without
	// changes after failure to identify the changes as the culprit.
	ApplyGerritChanges   bool                                  `protobuf:"varint,6,opt,name=apply_gerrit_changes,json=applyGerritChanges,proto3" json:"apply_gerrit_changes,omitempty"`
	PrepareForBuild      *BuilderConfig_Build_PrepareForBuild  `protobuf:"bytes,17,opt,name=prepare_for_build,json=prepareForBuild,proto3" json:"prepare_for_build,omitempty"`
	SdkUpdate            *BuilderConfig_Build_SdkUpdate        `protobuf:"bytes,12,opt,name=sdk_update,json=sdkUpdate,proto3" json:"sdk_update,omitempty"`
	InstallToolchain     *BuilderConfig_Build_InstallToolchain `protobuf:"bytes,13,opt,name=install_toolchain,json=installToolchain,proto3" json:"install_toolchain,omitempty"`
	InstallPackages      *BuilderConfig_Build_InstallPackages  `protobuf:"bytes,16,opt,name=install_packages,json=installPackages,proto3" json:"install_packages,omitempty"`
	BuildImages          *BuilderConfig_Build_BuildImages      `protobuf:"bytes,15,opt,name=build_images,json=buildImages,proto3" json:"build_images,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build proto.InternalMessageInfo

func (m *BuilderConfig_Build) GetUseFlags() []*UseFlag {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *BuilderConfig_Build) GetPortageProfile() *BuilderConfig_Build_PortageProfile {
	if m != nil {
		return m.PortageProfile
	}
	return nil
}

func (m *BuilderConfig_Build) GetApplyGerritChanges() bool {
	if m != nil {
		return m.ApplyGerritChanges
	}
	return false
}

func (m *BuilderConfig_Build) GetPrepareForBuild() *BuilderConfig_Build_PrepareForBuild {
	if m != nil {
		return m.PrepareForBuild
	}
	return nil
}

func (m *BuilderConfig_Build) GetSdkUpdate() *BuilderConfig_Build_SdkUpdate {
	if m != nil {
		return m.SdkUpdate
	}
	return nil
}

func (m *BuilderConfig_Build) GetInstallToolchain() *BuilderConfig_Build_InstallToolchain {
	if m != nil {
		return m.InstallToolchain
	}
	return nil
}

func (m *BuilderConfig_Build) GetInstallPackages() *BuilderConfig_Build_InstallPackages {
	if m != nil {
		return m.InstallPackages
	}
	return nil
}

func (m *BuilderConfig_Build) GetBuildImages() *BuilderConfig_Build_BuildImages {
	if m != nil {
		return m.BuildImages
	}
	return nil
}

// The profile of the variant to set up and build.
type BuilderConfig_Build_PortageProfile struct {
	Profile              string   `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_PortageProfile proto.InternalMessageInfo

func (m *BuilderConfig_Build_PortageProfile) GetProfile() string {
	if m != nil {
		return m.Profile
	}
	return ""
}

// Controls for the call to cros_artifacts.prepare_for_build.
// TODO(crbug/1019868): Drop this after all users have switched to
// artifacts.artifactProfileInfo.
type BuilderConfig_Build_PrepareForBuild struct {
	// Additional arguments from common.proto, passed into any
	// PrepareFor*Build endpoint.
	AdditionalArgs       *PrepareForBuildAdditionalArgs `protobuf:"bytes,1,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_PrepareForBuild proto.InternalMessageInfo

func (m *BuilderConfig_Build_PrepareForBuild) GetAdditionalArgs() *PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

// Controls for the call to SdkService.Update.
type BuilderConfig_Build_SdkUpdate struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource        bool     `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_SdkUpdate proto.InternalMessageInfo

func (m *BuilderConfig_Build_SdkUpdate) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

// Controls for the call to SysrootService.InstallToolchain.
type BuilderConfig_Build_InstallToolchain struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource        bool     `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_InstallToolchain proto.InternalMessageInfo

func (m *BuilderConfig_Build_InstallToolchain) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

// Controls for the call to InstallPackages.
type BuilderConfig_Build_InstallPackages struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource bool `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	// Controls the running of the install packages step.
	RunSpec BuilderConfig_RunSpec `protobuf:"varint,2,opt,name=run_spec,json=runSpec,proto3,enum=chromiumos.BuilderConfig_RunSpec" json:"run_spec,omitempty"`
	// Packages to build, or empty to build all packages.
	Packages []*PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// Certain builders (e.g., clang-tidy-toolchain) need to build Chrome with
	// goma disabled.
	DisableGoma          bool     `protobuf:"varint,4,opt,name=disable_goma,json=disableGoma,proto3" json:"disable_goma,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_InstallPackages proto.InternalMessageInfo

func (m *BuilderConfig_Build_InstallPackages) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

func (m *BuilderConfig_Build_InstallPackages) GetRunSpec() BuilderConfig_RunSpec {
	if m != nil {
		return m.RunSpec
	}
	return BuilderConfig_RUN_SPEC_UNSPECIFIED
}

func (m *BuilderConfig_Build_InstallPackages) GetPackages() []*PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *BuilderConfig_Build_InstallPackages) GetDisableGoma() bool {
	if m != nil {
		return m.DisableGoma
	}
	return false
}

type BuilderConfig_Build_BuildImages struct {
	// Image types to build.
	ImageTypes           []ImageType `protobuf:"varint,1,rep,packed,name=image_types,json=imageTypes,proto3,enum=chromiumos.ImageType" json:"image_types,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_BuildImages proto.InternalMessageInfo

func (m *BuilderConfig_Build_BuildImages) GetImageTypes() []ImageType {
	if m != nil {
		return m.ImageTypes
	}
	return nil
}

type BuilderConfig_UnitTests struct {
	// Skipped packages.
	PackageBlacklist []*PackageInfo `protobuf:"bytes,4,rep,name=package_blacklist,json=packageBlacklist,proto3" json:"package_blacklist,omitempty"`
	// Controls the running of ebuild tests with possible early exit.
	EbuildsRunSpec BuilderConfig_RunSpec `protobuf:"varint,5,opt,name=ebuilds_run_spec,json=ebuildsRunSpec,proto3,enum=chromiumos.BuilderConfig_RunSpec" json:"ebuilds_run_spec,omitempty"`
	// Whether to assume the sysroot is empty.
	EmptySysroot         bool     `protobuf:"varint,6,opt,name=empty_sysroot,json=emptySysroot,proto3" json:"empty_sysroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_UnitTests proto.InternalMessageInfo

func (m *BuilderConfig_UnitTests) GetPackageBlacklist() []*PackageInfo {
	if m != nil {
		return m.PackageBlacklist
	}
	return nil
}

func (m *BuilderConfig_UnitTests) GetEbuildsRunSpec() BuilderConfig_RunSpec {
	if m != nil {
		return m.EbuildsRunSpec
	}
	return BuilderConfig_RUN_SPEC_UNSPECIFIED
}

func (m *BuilderConfig_UnitTests) GetEmptySysroot() bool {
	if m != nil {
		return m.EmptySysroot
	}
	return false
}

// List of builder configs. Intended to be serialized to / from disk.
type BuilderConfigs struct {
	BuilderConfigs       []*BuilderConfig `protobuf:"bytes,1,rep,name=builder_configs,json=builderConfigs,proto3" json:"builder_configs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfigs proto.InternalMessageInfo

func (m *BuilderConfigs) GetBuilderConfigs() []*BuilderConfig {
	if m != nil {
		return m.BuilderConfigs
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BuilderConfig_RunSpec", BuilderConfig_RunSpec_name, BuilderConfig_RunSpec_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Id_Type", BuilderConfig_Id_Type_name, BuilderConfig_Id_Type_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_General_Environment", BuilderConfig_General_Environment_name, BuilderConfig_General_Environment_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_General_RunWhen_Mode", BuilderConfig_General_RunWhen_Mode_name, BuilderConfig_General_RunWhen_Mode_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Orchestrator_ChildSpec_CollectHandling", BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name, BuilderConfig_Orchestrator_ChildSpec_CollectHandling_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Artifacts_Prebuilts", BuilderConfig_Artifacts_Prebuilts_name, BuilderConfig_Artifacts_Prebuilts_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Artifacts_ArtifactTypes", BuilderConfig_Artifacts_ArtifactTypes_name, BuilderConfig_Artifacts_ArtifactTypes_value)
	proto.RegisterType((*BuilderConfig)(nil), "chromiumos.BuilderConfig")
	proto.RegisterType((*BuilderConfig_Id)(nil), "chromiumos.BuilderConfig.Id")
	proto.RegisterType((*BuilderConfig_General)(nil), "chromiumos.BuilderConfig.General")
	proto.RegisterType((*BuilderConfig_General_RunWhen)(nil), "chromiumos.BuilderConfig.General.RunWhen")
	proto.RegisterType((*BuilderConfig_Orchestrator)(nil), "chromiumos.BuilderConfig.Orchestrator")
	proto.RegisterType((*BuilderConfig_Orchestrator_ChildSpec)(nil), "chromiumos.BuilderConfig.Orchestrator.ChildSpec")
	proto.RegisterType((*BuilderConfig_Orchestrator_FollowOnOrchestrator)(nil), "chromiumos.BuilderConfig.Orchestrator.FollowOnOrchestrator")
	proto.RegisterType((*BuilderConfig_Artifacts)(nil), "chromiumos.BuilderConfig.Artifacts")
	proto.RegisterType((*BuilderConfig_Artifacts_PublishInfo)(nil), "chromiumos.BuilderConfig.Artifacts.PublishInfo")
	proto.RegisterType((*BuilderConfig_Artifacts_InputArtifactInfo)(nil), "chromiumos.BuilderConfig.Artifacts.InputArtifactInfo")
	proto.RegisterType((*BuilderConfig_Chrome)(nil), "chromiumos.BuilderConfig.Chrome")
	proto.RegisterType((*BuilderConfig_Build)(nil), "chromiumos.BuilderConfig.Build")
	proto.RegisterType((*BuilderConfig_Build_PortageProfile)(nil), "chromiumos.BuilderConfig.Build.PortageProfile")
	proto.RegisterType((*BuilderConfig_Build_PrepareForBuild)(nil), "chromiumos.BuilderConfig.Build.PrepareForBuild")
	proto.RegisterType((*BuilderConfig_Build_SdkUpdate)(nil), "chromiumos.BuilderConfig.Build.SdkUpdate")
	proto.RegisterType((*BuilderConfig_Build_InstallToolchain)(nil), "chromiumos.BuilderConfig.Build.InstallToolchain")
	proto.RegisterType((*BuilderConfig_Build_InstallPackages)(nil), "chromiumos.BuilderConfig.Build.InstallPackages")
	proto.RegisterType((*BuilderConfig_Build_BuildImages)(nil), "chromiumos.BuilderConfig.Build.BuildImages")
	proto.RegisterType((*BuilderConfig_UnitTests)(nil), "chromiumos.BuilderConfig.UnitTests")
	proto.RegisterType((*BuilderConfigs)(nil), "chromiumos.BuilderConfigs")
}

func init() { proto.RegisterFile("chromiumos/builder_config.proto", fileDescriptor_6fe67302c16003fb) }

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