// 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/1027720): Migrate this to common.proto
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
)

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",
}

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,
}

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 use if not provided.
	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 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.
	ArtifactProfileInfo  *ArtifactProfileInfo `protobuf:"bytes,7,opt,name=artifact_profile_info,json=artifactProfileInfo,proto3" json:"artifact_profile_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
}

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"`
	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 ""
}

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