// 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
	// Release build.
	BuilderConfig_Id_RELEASE BuilderConfig_Id_Type = 5
)

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

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

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

// Indicates which manifest a builder should sync to.
type BuilderConfig_General_Manifest int32

const (
	BuilderConfig_General_MANIFEST_UNSPECIFIED BuilderConfig_General_Manifest = 0
	BuilderConfig_General_PUBLIC               BuilderConfig_General_Manifest = 1
	BuilderConfig_General_PRIVATE              BuilderConfig_General_Manifest = 2
)

var BuilderConfig_General_Manifest_name = map[int32]string{
	0: "MANIFEST_UNSPECIFIED",
	1: "PUBLIC",
	2: "PRIVATE",
}

var BuilderConfig_General_Manifest_value = map[string]int32{
	"MANIFEST_UNSPECIFIED": 0,
	"PUBLIC":               1,
	"PRIVATE":              2,
}

func (x BuilderConfig_General_Manifest) String() string {
	return proto.EnumName(BuilderConfig_General_Manifest_name, int32(x))
}

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

type BuilderConfig_General_RunWhen_Mode int32

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

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

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

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

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

type BuilderConfig_Orchestrator_ChildSpec_CollectHandling int32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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"`
	Manifest             BuilderConfig_General_Manifest `protobuf:"varint,7,opt,name=manifest,proto3,enum=chromiumos.BuilderConfig_General_Manifest" json:"manifest,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
}

func (m *BuilderConfig_General) GetManifest() BuilderConfig_General_Manifest {
	if m != nil {
		return m.Manifest
	}
	return BuilderConfig_General_MANIFEST_UNSPECIFIED
}

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

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

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

var xxx_messageInfo_BuilderConfig_General_RunWhen proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator proto.InternalMessageInfo

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

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

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_ChildSpec proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_FollowOnOrchestrator proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Artifacts proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_PublishInfo proto.InternalMessageInfo

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

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_InputArtifactInfo proto.InternalMessageInfo

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Chrome proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_BuilderConfig_Build proto.InternalMessageInfo

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

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

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

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

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

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

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

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

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

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

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

var xxx_messageInfo_BuilderConfig_Build_PortageProfile proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_BuilderConfig_Build_PrepareForBuild proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_BuilderConfig_Build_SdkUpdate proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_BuilderConfig_Build_InstallToolchain proto.InternalMessageInfo

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

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

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

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

var xxx_messageInfo_BuilderConfig_Build_InstallPackages proto.InternalMessageInfo

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

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

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

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

type BuilderConfig_Build_BuildImages struct {
	// Image types to build.
	ImageTypes []ImageType `protobuf:"varint,1,rep,packed,name=image_types,json=imageTypes,proto3,enum=chromiumos.ImageType" json:"image_types,omitempty"`
	// Whether to disable rootfs verification.
	DisableRootfsVerification bool `protobuf:"varint,2,opt,name=disable_rootfs_verification,json=disableRootfsVerification,proto3" json:"disable_rootfs_verification,omitempty"`
	// Custom disk layout to use. Note that large images can damage the lab,
	// so don't use such images for hw testing.
	// e.g. 4gb-rootfs
	DiskLayout           string   `protobuf:"bytes,3,opt,name=disk_layout,json=diskLayout,proto3" json:"disk_layout,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
}

func (m *BuilderConfig_Build_BuildImages) GetDisableRootfsVerification() bool {
	if m != nil {
		return m.DisableRootfsVerification
	}
	return false
}

func (m *BuilderConfig_Build_BuildImages) GetDiskLayout() string {
	if m != nil {
		return m.DiskLayout
	}
	return ""
}

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"`
	// Packages to be tested.
	// Defaults to all testable packages when none are given.
	Packages             []*PackageInfo `protobuf:"bytes,7,rep,name=packages,proto3" json:"packages,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
}

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

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