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

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// The types of images that can be built.
// These correspond to support types in lib/constants.py such
// as IMAGE_TYPE_BASE, IMAGE_TYPE_RECOVERY, and so on.
type ImageType int32

const (
	ImageType_IMAGE_TYPE_UNDEFINED ImageType = 0
	ImageType_BASE                 ImageType = 1
	ImageType_DEV                  ImageType = 2
	ImageType_TEST                 ImageType = 3
	ImageType_BASE_VM              ImageType = 4
	ImageType_TEST_VM              ImageType = 5
	ImageType_RECOVERY             ImageType = 6
	ImageType_FACTORY              ImageType = 7
	ImageType_FIRMWARE             ImageType = 8
	ImageType_CR50_FIRMWARE        ImageType = 9
	ImageType_BASE_GUEST_VM        ImageType = 10
	ImageType_TEST_GUEST_VM        ImageType = 11
)

var ImageType_name = map[int32]string{
	0:  "IMAGE_TYPE_UNDEFINED",
	1:  "BASE",
	2:  "DEV",
	3:  "TEST",
	4:  "BASE_VM",
	5:  "TEST_VM",
	6:  "RECOVERY",
	7:  "FACTORY",
	8:  "FIRMWARE",
	9:  "CR50_FIRMWARE",
	10: "BASE_GUEST_VM",
	11: "TEST_GUEST_VM",
}

var ImageType_value = map[string]int32{
	"IMAGE_TYPE_UNDEFINED": 0,
	"BASE":                 1,
	"DEV":                  2,
	"TEST":                 3,
	"BASE_VM":              4,
	"TEST_VM":              5,
	"RECOVERY":             6,
	"FACTORY":              7,
	"FIRMWARE":             8,
	"CR50_FIRMWARE":        9,
	"BASE_GUEST_VM":        10,
	"TEST_GUEST_VM":        11,
}

func (x ImageType) String() string {
	return proto.EnumName(ImageType_name, int32(x))
}

func (ImageType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{0}
}

// The various channels that we release through.
type Channel int32

const (
	Channel_CHANNEL_UNSPECIFIED Channel = 0
	Channel_CHANNEL_STABLE      Channel = 1
	Channel_CHANNEL_BETA        Channel = 2
	Channel_CHANNEL_DEV         Channel = 3
	Channel_CHANNEL_CANARY      Channel = 4
)

var Channel_name = map[int32]string{
	0: "CHANNEL_UNSPECIFIED",
	1: "CHANNEL_STABLE",
	2: "CHANNEL_BETA",
	3: "CHANNEL_DEV",
	4: "CHANNEL_CANARY",
}

var Channel_value = map[string]int32{
	"CHANNEL_UNSPECIFIED": 0,
	"CHANNEL_STABLE":      1,
	"CHANNEL_BETA":        2,
	"CHANNEL_DEV":         3,
	"CHANNEL_CANARY":      4,
}

func (x Channel) String() string {
	return proto.EnumName(Channel_name, int32(x))
}

func (Channel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{1}
}

// TODO(crbug.com/1020615): Drop this from chromite/api/toolchain.proto (and
// here) once usage has migrated to BuilderConfig.Artifacts.ArtifactType.
// Meanwhile, keep this in sync with chromite/api/toolchain.proto.  The various
// toolchain optimization artifact types.
type AFDOArtifactType int32

const (
	// No AFDO artifact type specified.
	AFDOArtifactType_NONE_TYPE AFDOArtifactType = 0
	// The type is orderfile.
	AFDOArtifactType_ORDERFILE AFDOArtifactType = 1
	// The type is Chrome AFDO files generated by benchmarks.
	AFDOArtifactType_BENCHMARK_AFDO AFDOArtifactType = 2
	// The type is kernel AFDO files.
	AFDOArtifactType_KERNEL_AFDO AFDOArtifactType = 3
	// The type is Chrome AFDO used in release builders.
	AFDOArtifactType_CHROME_AFDO AFDOArtifactType = 4
)

var AFDOArtifactType_name = map[int32]string{
	0: "NONE_TYPE",
	1: "ORDERFILE",
	2: "BENCHMARK_AFDO",
	3: "KERNEL_AFDO",
	4: "CHROME_AFDO",
}

var AFDOArtifactType_value = map[string]int32{
	"NONE_TYPE":      0,
	"ORDERFILE":      1,
	"BENCHMARK_AFDO": 2,
	"KERNEL_AFDO":    3,
	"CHROME_AFDO":    4,
}

func (x AFDOArtifactType) String() string {
	return proto.EnumName(AFDOArtifactType_name, int32(x))
}

func (AFDOArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{2}
}

// Facilitates testing new Goma approaches before rolling them out
// more widely.
type GomaConfig_GomaApproach int32

const (
	GomaConfig_GOMA_APPROACH_UNSPECIFIED GomaConfig_GomaApproach = 0
	GomaConfig_DEFAULT                   GomaConfig_GomaApproach = 1
	GomaConfig_RBE_PROD                  GomaConfig_GomaApproach = 2
	GomaConfig_RBE_STAGING               GomaConfig_GomaApproach = 3
)

var GomaConfig_GomaApproach_name = map[int32]string{
	0: "GOMA_APPROACH_UNSPECIFIED",
	1: "DEFAULT",
	2: "RBE_PROD",
	3: "RBE_STAGING",
}

var GomaConfig_GomaApproach_value = map[string]int32{
	"GOMA_APPROACH_UNSPECIFIED": 0,
	"DEFAULT":                   1,
	"RBE_PROD":                  2,
	"RBE_STAGING":               3,
}

func (x GomaConfig_GomaApproach) String() string {
	return proto.EnumName(GomaConfig_GomaApproach_name, int32(x))
}

func (GomaConfig_GomaApproach) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{3, 0}
}

// Location enum; whether the resource is inside or outside of the chroot.
type Path_Location int32

const (
	Path_NO_LOCATION Path_Location = 0
	Path_INSIDE      Path_Location = 1
	Path_OUTSIDE     Path_Location = 2
)

var Path_Location_name = map[int32]string{
	0: "NO_LOCATION",
	1: "INSIDE",
	2: "OUTSIDE",
}

var Path_Location_value = map[string]int32{
	"NO_LOCATION": 0,
	"INSIDE":      1,
	"OUTSIDE":     2,
}

func (x Path_Location) String() string {
	return proto.EnumName(Path_Location_name, int32(x))
}

func (Path_Location) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{8, 0}
}

// Legacy artifacts, handled in cros_artifacts.  DO NOT ADD TO THIS.
type ArtifactsByService_Legacy_ArtifactType int32

const (
	ArtifactsByService_Legacy_UNSPECIFIED ArtifactsByService_Legacy_ArtifactType = 0
	// Indicates wanting a zip file of everything in the image directory.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_IMAGE_ZIP ArtifactsByService_Legacy_ArtifactType = 1
	// Indicates wanting update payloads.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_TEST_UPDATE_PAYLOAD ArtifactsByService_Legacy_ArtifactType = 2
	// Indicates wanting the autotest tarballs.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_AUTOTEST_FILES ArtifactsByService_Legacy_ArtifactType = 3
	// Indicates wanting a tarball containing private TAST test bundles.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_TAST_FILES ArtifactsByService_Legacy_ArtifactType = 4
	// Indicates wanting a tarball containing guest images and test bundles.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_PINNED_GUEST_IMAGES ArtifactsByService_Legacy_ArtifactType = 5
	// Indicates wanting an archive of firmware images built from source.
	// TODO(crbug/1034529): moves to ArtifactsByService.Package
	ArtifactsByService_Legacy_FIRMWARE ArtifactsByService_Legacy_ArtifactType = 6
	// Indicates wanting a tarball of the Ebuilds logs.
	// TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
	ArtifactsByService_Legacy_EBUILD_LOGS ArtifactsByService_Legacy_ArtifactType = 7
	// Indicates wanting an archive of the ChromeOS Config.
	// TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
	ArtifactsByService_Legacy_CHROMEOS_CONFIG ArtifactsByService_Legacy_ArtifactType = 8
	// Indicates wanting the CPE report.
	// TODO(crbug/1034529): moves to ArtifactsByService.Package
	ArtifactsByService_Legacy_CPE_REPORT ArtifactsByService_Legacy_ArtifactType = 9
	// Indicates wanting a tar.xz archive for each image created.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_IMAGE_ARCHIVES ArtifactsByService_Legacy_ArtifactType = 10
	// Indicates wanting a tarball containing fingerprint MCU test binaries.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_FPMCU_UNITTESTS ArtifactsByService_Legacy_ArtifactType = 27
)

var ArtifactsByService_Legacy_ArtifactType_name = map[int32]string{
	0:  "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",
	27: "FPMCU_UNITTESTS",
}

var ArtifactsByService_Legacy_ArtifactType_value = map[string]int32{
	"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,
	"FPMCU_UNITTESTS":     27,
}

func (x ArtifactsByService_Legacy_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Legacy_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Legacy_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 0, 0}
}

// Artifacts which the ArtifactsService endpoints pass to ToolchainService.
type ArtifactsByService_Toolchain_ArtifactType int32

const (
	ArtifactsByService_Toolchain_UNSPECIFIED ArtifactsByService_Toolchain_ArtifactType = 0
	// Indicates an unvetted orderfile for Chrome.
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_LLVM_ORDERFILE ArtifactsByService_Toolchain_ArtifactType = 11
	// Indicates a vetted orderfile for Chrome.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_LLVM_ORDERFILE ArtifactsByService_Toolchain_ArtifactType = 12
	// Indicates a clang-tidy artifact.
	ArtifactsByService_Toolchain_CHROME_CLANG_WARNINGS_FILE ArtifactsByService_Toolchain_ArtifactType = 13
	// Indicates a PGO artifact for the compiler.
	ArtifactsByService_Toolchain_UNVERIFIED_LLVM_PGO_FILE ArtifactsByService_Toolchain_ArtifactType = 14
	// Indicates an unvetted AFDO Chrome profile.  (Generated by HW Tests in
	// the benchmark-afdo-generate builder.)
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 15
	// Indicates a vetted AFDO Chrome profile.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_BENCHMARK_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 16
	// Indicates a vetted AFDO Kernel profile.
	ArtifactsByService_Toolchain_VERIFIED_KERNEL_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 17
	// Indicates an unvetted AFDO Kernel CWP profile.
	ArtifactsByService_Toolchain_UNVERIFIED_KERNEL_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 18
	// Indicates an unvetted AFDO Chrome CWP profile.
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 19
	// Indicates a vetted AFDO Chrome CWP profile.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 20
	// Indicates a vetted AFDO profile for release.
	ArtifactsByService_Toolchain_VERIFIED_RELEASE_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 21
	// Indicates an unvetted AFDO perf data file (from HW Test).
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_BENCHMARK_PERF_FILE ArtifactsByService_Toolchain_ArtifactType = 22
	// Indicates an unstripped Chrome binary.
	ArtifactsByService_Toolchain_CHROME_DEBUG_BINARY ArtifactsByService_Toolchain_ArtifactType = 23
	// Indicates toolchain logs for the compiler warnings for werror monitor
	ArtifactsByService_Toolchain_TOOLCHAIN_WARNING_LOGS ArtifactsByService_Toolchain_ArtifactType = 24
	// Indicates a prod Chrome AFDO profile for Android/Linux.
	ArtifactsByService_Toolchain_CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX ArtifactsByService_Toolchain_ArtifactType = 25
	// Indicates diagnoses for Clang crashes
	ArtifactsByService_Toolchain_CLANG_CRASH_DIAGNOSES ArtifactsByService_Toolchain_ArtifactType = 26
)

var ArtifactsByService_Toolchain_ArtifactType_name = map[int32]string{
	0:  "UNSPECIFIED",
	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 ArtifactsByService_Toolchain_ArtifactType_value = map[string]int32{
	"UNSPECIFIED":                           0,
	"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 ArtifactsByService_Toolchain_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Toolchain_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Toolchain_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 1, 0}
}

// Artifacts which the ArtifactsService endpoints pass to ImageService.
type ArtifactsByService_Image_ArtifactType int32

const (
	ArtifactsByService_Image_UNSPECIFIED ArtifactsByService_Image_ArtifactType = 0
)

var ArtifactsByService_Image_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Image_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Image_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Image_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Image_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 2, 0}
}

// Artifacts which the ArtifactsService endpoints pass to PackageService.
type ArtifactsByService_Package_ArtifactType int32

const (
	ArtifactsByService_Package_UNSPECIFIED ArtifactsByService_Package_ArtifactType = 0
)

var ArtifactsByService_Package_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Package_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Package_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Package_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Package_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 3, 0}
}

// Artifacts which the ArtifactsService endpoints pass to SysrootService.
type ArtifactsByService_Sysroot_ArtifactType int32

const (
	ArtifactsByService_Sysroot_UNSPECIFIED ArtifactsByService_Sysroot_ArtifactType = 0
)

var ArtifactsByService_Sysroot_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Sysroot_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Sysroot_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Sysroot_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Sysroot_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 4, 0}
}

// Artifacts which the ArtifactsService endpoints pass to TestService.
type ArtifactsByService_Test_ArtifactType int32

const (
	ArtifactsByService_Test_UNSPECIFIED ArtifactsByService_Test_ArtifactType = 0
)

var ArtifactsByService_Test_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Test_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Test_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Test_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Test_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5, 0}
}

// BuildTarget encapsulates a number of related arguments. At the moment, the
// usage of specific arguments is on a per endpoint basis, but will converge
// to support a standard set as time goes on.
// BuildTarget is a more appropriate name going forward for what we currently
// call "board".
type BuildTarget struct {
	// The name of the build target (a.k.a. board name).
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildTarget proto.InternalMessageInfo

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

// Chroot is used to define how to enter a chroot.
type Chroot struct {
	// The directory containing the chroot.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The cache directory override.
	CacheDir string `protobuf:"bytes,2,opt,name=cache_dir,json=cacheDir,proto3" json:"cache_dir,omitempty"`
	// Environment configuration.
	Env *Chroot_ChrootEnv `protobuf:"bytes,3,opt,name=env,proto3" json:"env,omitempty"`
	// The directory where the chrome source should be mounted.
	ChromeDir            string   `protobuf:"bytes,4,opt,name=chrome_dir,json=chromeDir,proto3" json:"chrome_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Chroot proto.InternalMessageInfo

func (m *Chroot) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Chroot) GetCacheDir() string {
	if m != nil {
		return m.CacheDir
	}
	return ""
}

func (m *Chroot) GetEnv() *Chroot_ChrootEnv {
	if m != nil {
		return m.Env
	}
	return nil
}

func (m *Chroot) GetChromeDir() string {
	if m != nil {
		return m.ChromeDir
	}
	return ""
}

type Chroot_ChrootEnv struct {
	// USE flags to set.
	UseFlags []*UseFlag `protobuf:"bytes,1,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// FEATURES flags to set.
	Features             []*Feature `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Chroot_ChrootEnv proto.InternalMessageInfo

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

func (m *Chroot_ChrootEnv) GetFeatures() []*Feature {
	if m != nil {
		return m.Features
	}
	return nil
}

// FEATURES environment variable component message.
type Feature struct {
	Feature              string   `protobuf:"bytes,1,opt,name=feature,proto3" json:"feature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Feature proto.InternalMessageInfo

func (m *Feature) GetFeature() string {
	if m != nil {
		return m.Feature
	}
	return ""
}

type GomaConfig struct {
	// The goma install location.
	// Required.
	GomaDir string `protobuf:"bytes,1,opt,name=goma_dir,json=gomaDir,proto3" json:"goma_dir,omitempty"`
	// The goma client credentials file.
	GomaClientJson string `protobuf:"bytes,2,opt,name=goma_client_json,json=gomaClientJson,proto3" json:"goma_client_json,omitempty"`
	// Path to the Goma client used for build package.
	// If None, goma_dir will be used instead.
	ChromeosGomaDir string                  `protobuf:"bytes,3,opt,name=chromeos_goma_dir,json=chromeosGomaDir,proto3" json:"chromeos_goma_dir,omitempty"`
	GomaApproach    GomaConfig_GomaApproach `protobuf:"varint,4,opt,name=goma_approach,json=gomaApproach,proto3,enum=chromiumos.GomaConfig_GomaApproach" json:"goma_approach,omitempty"`
	// The directory where the goma logs will be extracted.
	LogDir *SyncedDir `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"`
	// The name of the goma stats file. It will be dumped inside log_dir.
	StatsFile string `protobuf:"bytes,6,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// The name of the goma counterz file. It will be dumped inside log_dir.
	CounterzFile         string   `protobuf:"bytes,7,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaConfig proto.InternalMessageInfo

func (m *GomaConfig) GetGomaDir() string {
	if m != nil {
		return m.GomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaClientJson() string {
	if m != nil {
		return m.GomaClientJson
	}
	return ""
}

func (m *GomaConfig) GetChromeosGomaDir() string {
	if m != nil {
		return m.ChromeosGomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaApproach() GomaConfig_GomaApproach {
	if m != nil {
		return m.GomaApproach
	}
	return GomaConfig_GOMA_APPROACH_UNSPECIFIED
}

func (m *GomaConfig) GetLogDir() *SyncedDir {
	if m != nil {
		return m.LogDir
	}
	return nil
}

func (m *GomaConfig) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaConfig) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

type GomaArtifacts struct {
	// Goma stats file.
	StatsFile string `protobuf:"bytes,1,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// Goma counterz file.
	CounterzFile string `protobuf:"bytes,2,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	// Goma log files.
	LogFiles             []string `protobuf:"bytes,3,rep,name=log_files,json=logFiles,proto3" json:"log_files,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaArtifacts proto.InternalMessageInfo

func (m *GomaArtifacts) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaArtifacts) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

func (m *GomaArtifacts) GetLogFiles() []string {
	if m != nil {
		return m.LogFiles
	}
	return nil
}

// Message describing a package, The corresponding variable names are from
// https://devmanual.gentoo.org/ebuild-writing/variables/index.html
type PackageInfo struct {
	// The package name (PN variable).
	PackageName string `protobuf:"bytes,1,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
	// The package category (CATEGORY variable).
	Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"`
	// The package version and revision (PVR variable).
	Version              string   `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PackageInfo proto.InternalMessageInfo

func (m *PackageInfo) GetPackageName() string {
	if m != nil {
		return m.PackageName
	}
	return ""
}

func (m *PackageInfo) GetCategory() string {
	if m != nil {
		return m.Category
	}
	return ""
}

func (m *PackageInfo) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

// Information about the sysroot's profile.
type Profile struct {
	// The name of the profile.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Profile proto.InternalMessageInfo

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

// Message describing a package index (binhost) file.
type PackageIndexInfo struct {
	// The snapshot SHA
	SnapshotSha string `protobuf:"bytes,1,opt,name=snapshot_sha,json=snapshotSha,proto3" json:"snapshot_sha,omitempty"`
	// The snapshot number.  Higher is newer.
	SnapshotNumber int32 `protobuf:"varint,2,opt,name=snapshot_number,json=snapshotNumber,proto3" json:"snapshot_number,omitempty"`
	// The build target.
	BuildTarget *BuildTarget `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The full URI of the package index file.
	Location string `protobuf:"bytes,4,opt,name=location,proto3" json:"location,omitempty"`
	// The sysroot profile.
	Profile              *Profile `protobuf:"bytes,5,opt,name=profile,proto3" json:"profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PackageIndexInfo) Reset()         { *m = PackageIndexInfo{} }
func (m *PackageIndexInfo) String() string { return proto.CompactTextString(m) }
func (*PackageIndexInfo) ProtoMessage()    {}
func (*PackageIndexInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{7}
}

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

var xxx_messageInfo_PackageIndexInfo proto.InternalMessageInfo

func (m *PackageIndexInfo) GetSnapshotSha() string {
	if m != nil {
		return m.SnapshotSha
	}
	return ""
}

func (m *PackageIndexInfo) GetSnapshotNumber() int32 {
	if m != nil {
		return m.SnapshotNumber
	}
	return 0
}

func (m *PackageIndexInfo) GetBuildTarget() *BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *PackageIndexInfo) GetLocation() string {
	if m != nil {
		return m.Location
	}
	return ""
}

func (m *PackageIndexInfo) GetProfile() *Profile {
	if m != nil {
		return m.Profile
	}
	return nil
}

// A message to clarify inside/outside chroot paths.
type Path struct {
	// The path to the resource.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The path location.
	Location             Path_Location `protobuf:"varint,2,opt,name=location,proto3,enum=chromiumos.Path_Location" json:"location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Path) Reset()         { *m = Path{} }
func (m *Path) String() string { return proto.CompactTextString(m) }
func (*Path) ProtoMessage()    {}
func (*Path) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{8}
}

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

var xxx_messageInfo_Path proto.InternalMessageInfo

func (m *Path) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Path) GetLocation() Path_Location {
	if m != nil {
		return m.Location
	}
	return Path_NO_LOCATION
}

// A message used to indicate an output location for results. Specifically,
// this is used to automatically transfer files out of the chroot when needed.
// Note: No more than one ResultPath per message can be supported.
type ResultPath struct {
	// Required.
	// The result directory information.
	Path                 *Path    `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResultPath) Reset()         { *m = ResultPath{} }
func (m *ResultPath) String() string { return proto.CompactTextString(m) }
func (*ResultPath) ProtoMessage()    {}
func (*ResultPath) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{9}
}

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

var xxx_messageInfo_ResultPath proto.InternalMessageInfo

func (m *ResultPath) GetPath() *Path {
	if m != nil {
		return m.Path
	}
	return nil
}

// A SyncedDir will have all of its contents transferred into a tmp directory
// in the chroot before the endpoint is called, and afterwords its contents
// will be exactly what was in the tmp directory when the endpoint completed.
type SyncedDir struct {
	// Required.
	// The directory being synced.
	Dir                  string   `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SyncedDir) Reset()         { *m = SyncedDir{} }
func (m *SyncedDir) String() string { return proto.CompactTextString(m) }
func (*SyncedDir) ProtoMessage()    {}
func (*SyncedDir) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{10}
}

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

var xxx_messageInfo_SyncedDir proto.InternalMessageInfo

func (m *SyncedDir) GetDir() string {
	if m != nil {
		return m.Dir
	}
	return ""
}

// See also crrev.com/c/1929452 and:
//   https://cs.corp.google.com/piper///depot/google3/third_party/luci/buildbucket/proto/common.proto?l=147-176&rcl=257714215
// A Gerrit patchset.
type GerritChange struct {
	// Gerrit hostname, e.g. "chromium-review.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Gerrit project, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Change number, e.g. 12345.
	Change int64 `protobuf:"varint,3,opt,name=change,proto3" json:"change,omitempty"`
	// Patch set number, e.g. 1.
	Patchset             int64    `protobuf:"varint,4,opt,name=patchset,proto3" json:"patchset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GerritChange) Reset()         { *m = GerritChange{} }
func (m *GerritChange) String() string { return proto.CompactTextString(m) }
func (*GerritChange) ProtoMessage()    {}
func (*GerritChange) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{11}
}

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

var xxx_messageInfo_GerritChange proto.InternalMessageInfo

func (m *GerritChange) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GerritChange) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GerritChange) GetChange() int64 {
	if m != nil {
		return m.Change
	}
	return 0
}

func (m *GerritChange) GetPatchset() int64 {
	if m != nil {
		return m.Patchset
	}
	return 0
}

type GitilesCommit struct {
	// Gitiles hostname, e.g. "chromium.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Repository name on the host, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Commit HEX SHA1.
	Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// Commit ref, e.g. "refs/heads/master".
	// NOT a branch name: if specified, must start with "refs/".
	Ref string `protobuf:"bytes,4,opt,name=ref,proto3" json:"ref,omitempty"`
	// Defines a total order of commits on the ref. Requires ref field.
	Position             uint32   `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GitilesCommit) Reset()         { *m = GitilesCommit{} }
func (m *GitilesCommit) String() string { return proto.CompactTextString(m) }
func (*GitilesCommit) ProtoMessage()    {}
func (*GitilesCommit) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{12}
}

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

var xxx_messageInfo_GitilesCommit proto.InternalMessageInfo

func (m *GitilesCommit) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GitilesCommit) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GitilesCommit) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *GitilesCommit) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *GitilesCommit) GetPosition() uint32 {
	if m != nil {
		return m.Position
	}
	return 0
}

// Message for USE flags.
type UseFlag struct {
	// The use flag.
	Flag                 string   `protobuf:"bytes,1,opt,name=flag,proto3" json:"flag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UseFlag) Reset()         { *m = UseFlag{} }
func (m *UseFlag) String() string { return proto.CompactTextString(m) }
func (*UseFlag) ProtoMessage()    {}
func (*UseFlag) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{13}
}

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

var xxx_messageInfo_UseFlag proto.InternalMessageInfo

func (m *UseFlag) GetFlag() string {
	if m != nil {
		return m.Flag
	}
	return ""
}

// A wrapper around a serialized protocol buffer.
type ProtoBytes struct {
	SerializedProto      []byte   `protobuf:"bytes,1,opt,name=serialized_proto,json=serializedProto,proto3" json:"serialized_proto,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ProtoBytes) Reset()         { *m = ProtoBytes{} }
func (m *ProtoBytes) String() string { return proto.CompactTextString(m) }
func (*ProtoBytes) ProtoMessage()    {}
func (*ProtoBytes) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{14}
}

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

var xxx_messageInfo_ProtoBytes proto.InternalMessageInfo

func (m *ProtoBytes) GetSerializedProto() []byte {
	if m != nil {
		return m.SerializedProto
	}
	return nil
}

// Additional information about artifacts used by PrepareForBuild endpoints.
// TODO(crbug/1019868): This is migrating to ArtifactProfileInfo.
type PrepareForBuildAdditionalArgs struct {
	// Types that are valid to be assigned to PrepareForBuildArgs:
	//	*PrepareForBuildAdditionalArgs_ChromeCwpProfile
	//	*PrepareForBuildAdditionalArgs_KernelVersion
	PrepareForBuildArgs  isPrepareForBuildAdditionalArgs_PrepareForBuildArgs `protobuf_oneof:"prepare_for_build_args"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

func (m *PrepareForBuildAdditionalArgs) Reset()         { *m = PrepareForBuildAdditionalArgs{} }
func (m *PrepareForBuildAdditionalArgs) String() string { return proto.CompactTextString(m) }
func (*PrepareForBuildAdditionalArgs) ProtoMessage()    {}
func (*PrepareForBuildAdditionalArgs) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{15}
}

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

var xxx_messageInfo_PrepareForBuildAdditionalArgs proto.InternalMessageInfo

type isPrepareForBuildAdditionalArgs_PrepareForBuildArgs interface {
	isPrepareForBuildAdditionalArgs_PrepareForBuildArgs()
}

type PrepareForBuildAdditionalArgs_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type PrepareForBuildAdditionalArgs_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

func (*PrepareForBuildAdditionalArgs_ChromeCwpProfile) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (*PrepareForBuildAdditionalArgs_KernelVersion) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (m *PrepareForBuildAdditionalArgs) GetPrepareForBuildArgs() isPrepareForBuildAdditionalArgs_PrepareForBuildArgs {
	if m != nil {
		return m.PrepareForBuildArgs
	}
	return nil
}

func (m *PrepareForBuildAdditionalArgs) GetChromeCwpProfile() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *PrepareForBuildAdditionalArgs) GetKernelVersion() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrepareForBuildAdditionalArgs) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrepareForBuildAdditionalArgs_ChromeCwpProfile)(nil),
		(*PrepareForBuildAdditionalArgs_KernelVersion)(nil),
	}
}

// ToolchainService Unverified Release AFDO artifacts require information
// about the builder that created the image used to generate the unverified
// chrome benchmark perf file.
type AfdoRelease struct {
	// ToolchainService Chrome AFDO artifacts require profile name.
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3" json:"chrome_cwp_profile,omitempty"`
	// The build id of the image_build.  Used to generate the location for the
	// image archive.
	ImageBuildId         int64    `protobuf:"varint,2,opt,name=image_build_id,json=imageBuildId,proto3" json:"image_build_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AfdoRelease) Reset()         { *m = AfdoRelease{} }
func (m *AfdoRelease) String() string { return proto.CompactTextString(m) }
func (*AfdoRelease) ProtoMessage()    {}
func (*AfdoRelease) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{16}
}

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

var xxx_messageInfo_AfdoRelease proto.InternalMessageInfo

func (m *AfdoRelease) GetChromeCwpProfile() string {
	if m != nil {
		return m.ChromeCwpProfile
	}
	return ""
}

func (m *AfdoRelease) GetImageBuildId() int64 {
	if m != nil {
		return m.ImageBuildId
	}
	return 0
}

// Artifact profile information used by artifact prepare/bundle endpoints in
// addition to input_artifacts.
type ArtifactProfileInfo struct {
	// Types that are valid to be assigned to ArtifactProfileInfo:
	//	*ArtifactProfileInfo_ChromeCwpProfile
	//	*ArtifactProfileInfo_KernelVersion
	//	*ArtifactProfileInfo_AfdoRelease
	ArtifactProfileInfo  isArtifactProfileInfo_ArtifactProfileInfo `protobuf_oneof:"artifact_profile_info"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

func (m *ArtifactProfileInfo) Reset()         { *m = ArtifactProfileInfo{} }
func (m *ArtifactProfileInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactProfileInfo) ProtoMessage()    {}
func (*ArtifactProfileInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{17}
}

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

var xxx_messageInfo_ArtifactProfileInfo proto.InternalMessageInfo

type isArtifactProfileInfo_ArtifactProfileInfo interface {
	isArtifactProfileInfo_ArtifactProfileInfo()
}

type ArtifactProfileInfo_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type ArtifactProfileInfo_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

type ArtifactProfileInfo_AfdoRelease struct {
	AfdoRelease *AfdoRelease `protobuf:"bytes,3,opt,name=afdo_release,json=afdoRelease,proto3,oneof"`
}

func (*ArtifactProfileInfo_ChromeCwpProfile) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_KernelVersion) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_AfdoRelease) isArtifactProfileInfo_ArtifactProfileInfo() {}

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

func (m *ArtifactProfileInfo) GetChromeCwpProfile() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *ArtifactProfileInfo) GetKernelVersion() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

func (m *ArtifactProfileInfo) GetAfdoRelease() *AfdoRelease {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_AfdoRelease); ok {
		return x.AfdoRelease
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ArtifactProfileInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ArtifactProfileInfo_ChromeCwpProfile)(nil),
		(*ArtifactProfileInfo_KernelVersion)(nil),
		(*ArtifactProfileInfo_AfdoRelease)(nil),
	}
}

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints to dispatch the appropriate service routines to
// prepare or bundle as a batch.
type ArtifactsByService struct {
	Legacy    *ArtifactsByService_Legacy    `protobuf:"bytes,1,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Toolchain *ArtifactsByService_Toolchain `protobuf:"bytes,2,opt,name=toolchain,proto3" json:"toolchain,omitempty"`
	Image     *ArtifactsByService_Image     `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
	Package   *ArtifactsByService_Package   `protobuf:"bytes,4,opt,name=package,proto3" json:"package,omitempty"`
	Sysroot   *ArtifactsByService_Sysroot   `protobuf:"bytes,5,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	Test      *ArtifactsByService_Test      `protobuf:"bytes,6,opt,name=test,proto3" json:"test,omitempty"`
	// Profile information needed by the artifact handler, if any.
	ProfileInfo          *ArtifactProfileInfo `protobuf:"bytes,7,opt,name=profile_info,json=profileInfo,proto3" json:"profile_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *ArtifactsByService) Reset()         { *m = ArtifactsByService{} }
func (m *ArtifactsByService) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService) ProtoMessage()    {}
func (*ArtifactsByService) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18}
}

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

var xxx_messageInfo_ArtifactsByService proto.InternalMessageInfo

func (m *ArtifactsByService) GetLegacy() *ArtifactsByService_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *ArtifactsByService) GetToolchain() *ArtifactsByService_Toolchain {
	if m != nil {
		return m.Toolchain
	}
	return nil
}

func (m *ArtifactsByService) GetImage() *ArtifactsByService_Image {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *ArtifactsByService) GetPackage() *ArtifactsByService_Package {
	if m != nil {
		return m.Package
	}
	return nil
}

func (m *ArtifactsByService) GetSysroot() *ArtifactsByService_Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *ArtifactsByService) GetTest() *ArtifactsByService_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *ArtifactsByService) GetProfileInfo() *ArtifactProfileInfo {
	if m != nil {
		return m.ProfileInfo
	}
	return nil
}

// TODO(crbug/1034529): Drop this message.
// Artifacts handled within the ArtifactsService endpoints directly.
type ArtifactsByService_Legacy struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Legacy_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Legacy_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Legacy proto.InternalMessageInfo

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

func (m *ArtifactsByService_Legacy) GetOutputArtifacts() []*ArtifactsByService_Legacy_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.
type ArtifactsByService_Legacy_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Legacy_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Legacy_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Legacy_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Legacy_ArtifactInfo{}
}
func (m *ArtifactsByService_Legacy_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Legacy_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Legacy_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 0, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Legacy_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Legacy_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Toolchain struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Toolchain_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Toolchain_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
	XXX_unrecognized     []byte                                       `json:"-"`
	XXX_sizecache        int32                                        `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Toolchain proto.InternalMessageInfo

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

func (m *ArtifactsByService_Toolchain) GetOutputArtifacts() []*ArtifactsByService_Toolchain_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Toolchain_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Toolchain_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Toolchain_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	// specifying those here.  Examples include AFDO artifacts and release
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Toolchain_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Toolchain_ArtifactInfo{}
}
func (m *ArtifactsByService_Toolchain_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Toolchain_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Toolchain_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 1, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Toolchain_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Toolchain_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Image struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Image_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Image_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
	XXX_unrecognized     []byte                                   `json:"-"`
	XXX_sizecache        int32                                    `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Image proto.InternalMessageInfo

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

func (m *ArtifactsByService_Image) GetOutputArtifacts() []*ArtifactsByService_Image_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Image_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Image_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Image_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Image_ArtifactInfo) Reset()         { *m = ArtifactsByService_Image_ArtifactInfo{} }
func (m *ArtifactsByService_Image_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Image_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Image_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 2, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Image_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Image_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Package struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Package_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Package_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
	XXX_unrecognized     []byte                                     `json:"-"`
	XXX_sizecache        int32                                      `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Package proto.InternalMessageInfo

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

func (m *ArtifactsByService_Package) GetOutputArtifacts() []*ArtifactsByService_Package_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Package_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Package_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Package_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Package_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Package_ArtifactInfo{}
}
func (m *ArtifactsByService_Package_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Package_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Package_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 3, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Package_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Package_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Sysroot struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Sysroot_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Sysroot_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
	XXX_unrecognized     []byte                                     `json:"-"`
	XXX_sizecache        int32                                      `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Sysroot proto.InternalMessageInfo

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

func (m *ArtifactsByService_Sysroot) GetOutputArtifacts() []*ArtifactsByService_Sysroot_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Sysroot_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Sysroot_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Sysroot_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Sysroot_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Sysroot_ArtifactInfo{}
}
func (m *ArtifactsByService_Sysroot_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Sysroot_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Sysroot_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 4, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Sysroot_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Sysroot_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Test struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Test_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Test_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Test proto.InternalMessageInfo

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

func (m *ArtifactsByService_Test) GetOutputArtifacts() []*ArtifactsByService_Test_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Test_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Test_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Test_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Test_ArtifactInfo) Reset()         { *m = ArtifactsByService_Test_ArtifactInfo{} }
func (m *ArtifactsByService_Test_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Test_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Test_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Test_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Test_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints Response messages.
type UploadedArtifactsByService struct {
	Legacy               *UploadedArtifactsByService_Legacy    `protobuf:"bytes,1,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Toolchain            *UploadedArtifactsByService_Toolchain `protobuf:"bytes,2,opt,name=toolchain,proto3" json:"toolchain,omitempty"`
	Image                *UploadedArtifactsByService_Image     `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
	Package              *UploadedArtifactsByService_Package   `protobuf:"bytes,4,opt,name=package,proto3" json:"package,omitempty"`
	Sysroot              *UploadedArtifactsByService_Sysroot   `protobuf:"bytes,5,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	Test                 *UploadedArtifactsByService_Test      `protobuf:"bytes,6,opt,name=test,proto3" json:"test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

func (m *UploadedArtifactsByService) Reset()         { *m = UploadedArtifactsByService{} }
func (m *UploadedArtifactsByService) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService) ProtoMessage()    {}
func (*UploadedArtifactsByService) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19}
}

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

var xxx_messageInfo_UploadedArtifactsByService proto.InternalMessageInfo

func (m *UploadedArtifactsByService) GetLegacy() *UploadedArtifactsByService_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *UploadedArtifactsByService) GetToolchain() *UploadedArtifactsByService_Toolchain {
	if m != nil {
		return m.Toolchain
	}
	return nil
}

func (m *UploadedArtifactsByService) GetImage() *UploadedArtifactsByService_Image {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *UploadedArtifactsByService) GetPackage() *UploadedArtifactsByService_Package {
	if m != nil {
		return m.Package
	}
	return nil
}

func (m *UploadedArtifactsByService) GetSysroot() *UploadedArtifactsByService_Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *UploadedArtifactsByService) GetTest() *UploadedArtifactsByService_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

// Legacy artifacts, handled directly ArtifactsService.
// Artifacts handled within the ArtifactsService endpoints directly.
// TODO(crbug/1034529): Drop this message.
type UploadedArtifactsByService_Legacy struct {
	Artifacts            []*UploadedArtifactsByService_Legacy_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
	XXX_unrecognized     []byte                                             `json:"-"`
	XXX_sizecache        int32                                              `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Legacy proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Legacy) GetArtifacts() []*UploadedArtifactsByService_Legacy_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Legacy_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Legacy_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Legacy_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Legacy_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Legacy_ArtifactPaths) GetArtifactType() ArtifactsByService_Legacy_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Legacy_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Legacy_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Toolchain struct {
	Artifacts            []*UploadedArtifactsByService_Toolchain_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                              `json:"-"`
	XXX_unrecognized     []byte                                                `json:"-"`
	XXX_sizecache        int32                                                 `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Toolchain proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Toolchain) GetArtifacts() []*UploadedArtifactsByService_Toolchain_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Toolchain_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Toolchain_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Toolchain_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Toolchain_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) GetArtifactType() ArtifactsByService_Toolchain_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Toolchain_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Image struct {
	Artifacts            []*UploadedArtifactsByService_Image_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
	XXX_unrecognized     []byte                                            `json:"-"`
	XXX_sizecache        int32                                             `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Image proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Image) GetArtifacts() []*UploadedArtifactsByService_Image_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Image_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Image_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Image_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Image_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Image_ArtifactPaths) GetArtifactType() ArtifactsByService_Image_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Image_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Image_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Package struct {
	Artifacts            []*UploadedArtifactsByService_Package_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Package proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Package) GetArtifacts() []*UploadedArtifactsByService_Package_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Package_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Package_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Package_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Package_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Package_ArtifactPaths) GetArtifactType() ArtifactsByService_Package_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Package_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Package_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Sysroot struct {
	Artifacts            []*UploadedArtifactsByService_Sysroot_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Sysroot proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Sysroot) GetArtifacts() []*UploadedArtifactsByService_Sysroot_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Sysroot_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Sysroot_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Sysroot_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Sysroot_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) GetArtifactType() ArtifactsByService_Sysroot_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Sysroot_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Test struct {
	Artifacts            []*UploadedArtifactsByService_Test_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Test proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Test) GetArtifacts() []*UploadedArtifactsByService_Test_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Test_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Test_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Test_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Test_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Test_ArtifactPaths) GetArtifactType() ArtifactsByService_Test_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Test_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Test_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.ImageType", ImageType_name, ImageType_value)
	proto.RegisterEnum("chromiumos.Channel", Channel_name, Channel_value)
	proto.RegisterEnum("chromiumos.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterEnum("chromiumos.GomaConfig_GomaApproach", GomaConfig_GomaApproach_name, GomaConfig_GomaApproach_value)
	proto.RegisterEnum("chromiumos.Path_Location", Path_Location_name, Path_Location_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Legacy_ArtifactType", ArtifactsByService_Legacy_ArtifactType_name, ArtifactsByService_Legacy_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Toolchain_ArtifactType", ArtifactsByService_Toolchain_ArtifactType_name, ArtifactsByService_Toolchain_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Image_ArtifactType", ArtifactsByService_Image_ArtifactType_name, ArtifactsByService_Image_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Package_ArtifactType", ArtifactsByService_Package_ArtifactType_name, ArtifactsByService_Package_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Sysroot_ArtifactType", ArtifactsByService_Sysroot_ArtifactType_name, ArtifactsByService_Sysroot_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Test_ArtifactType", ArtifactsByService_Test_ArtifactType_name, ArtifactsByService_Test_ArtifactType_value)
	proto.RegisterType((*BuildTarget)(nil), "chromiumos.BuildTarget")
	proto.RegisterType((*Chroot)(nil), "chromiumos.Chroot")
	proto.RegisterType((*Chroot_ChrootEnv)(nil), "chromiumos.Chroot.ChrootEnv")
	proto.RegisterType((*Feature)(nil), "chromiumos.Feature")
	proto.RegisterType((*GomaConfig)(nil), "chromiumos.GomaConfig")
	proto.RegisterType((*GomaArtifacts)(nil), "chromiumos.GomaArtifacts")
	proto.RegisterType((*PackageInfo)(nil), "chromiumos.PackageInfo")
	proto.RegisterType((*Profile)(nil), "chromiumos.Profile")
	proto.RegisterType((*PackageIndexInfo)(nil), "chromiumos.PackageIndexInfo")
	proto.RegisterType((*Path)(nil), "chromiumos.Path")
	proto.RegisterType((*ResultPath)(nil), "chromiumos.ResultPath")
	proto.RegisterType((*SyncedDir)(nil), "chromiumos.SyncedDir")
	proto.RegisterType((*GerritChange)(nil), "chromiumos.GerritChange")
	proto.RegisterType((*GitilesCommit)(nil), "chromiumos.GitilesCommit")
	proto.RegisterType((*UseFlag)(nil), "chromiumos.UseFlag")
	proto.RegisterType((*ProtoBytes)(nil), "chromiumos.ProtoBytes")
	proto.RegisterType((*PrepareForBuildAdditionalArgs)(nil), "chromiumos.PrepareForBuildAdditionalArgs")
	proto.RegisterType((*AfdoRelease)(nil), "chromiumos.AfdoRelease")
	proto.RegisterType((*ArtifactProfileInfo)(nil), "chromiumos.ArtifactProfileInfo")
	proto.RegisterType((*ArtifactsByService)(nil), "chromiumos.ArtifactsByService")
	proto.RegisterType((*ArtifactsByService_Legacy)(nil), "chromiumos.ArtifactsByService.Legacy")
	proto.RegisterType((*ArtifactsByService_Legacy_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Legacy.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Toolchain)(nil), "chromiumos.ArtifactsByService.Toolchain")
	proto.RegisterType((*ArtifactsByService_Toolchain_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Toolchain.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Image)(nil), "chromiumos.ArtifactsByService.Image")
	proto.RegisterType((*ArtifactsByService_Image_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Image.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Package)(nil), "chromiumos.ArtifactsByService.Package")
	proto.RegisterType((*ArtifactsByService_Package_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Package.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Sysroot)(nil), "chromiumos.ArtifactsByService.Sysroot")
	proto.RegisterType((*ArtifactsByService_Sysroot_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Sysroot.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Test)(nil), "chromiumos.ArtifactsByService.Test")
	proto.RegisterType((*ArtifactsByService_Test_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Test.ArtifactInfo")
	proto.RegisterType((*UploadedArtifactsByService)(nil), "chromiumos.UploadedArtifactsByService")
	proto.RegisterType((*UploadedArtifactsByService_Legacy)(nil), "chromiumos.UploadedArtifactsByService.Legacy")
	proto.RegisterType((*UploadedArtifactsByService_Legacy_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Legacy.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Toolchain)(nil), "chromiumos.UploadedArtifactsByService.Toolchain")
	proto.RegisterType((*UploadedArtifactsByService_Toolchain_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Toolchain.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Image)(nil), "chromiumos.UploadedArtifactsByService.Image")
	proto.RegisterType((*UploadedArtifactsByService_Image_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Image.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Package)(nil), "chromiumos.UploadedArtifactsByService.Package")
	proto.RegisterType((*UploadedArtifactsByService_Package_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Package.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Sysroot)(nil), "chromiumos.UploadedArtifactsByService.Sysroot")
	proto.RegisterType((*UploadedArtifactsByService_Sysroot_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Sysroot.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Test)(nil), "chromiumos.UploadedArtifactsByService.Test")
	proto.RegisterType((*UploadedArtifactsByService_Test_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Test.ArtifactPaths")
}

func init() { proto.RegisterFile("chromiumos/common.proto", fileDescriptor_fa0b57c3d7d4c63b) }

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