// 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
)

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

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

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