// 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
	ImageType_DLC                  ImageType = 12
)

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",
	12: "DLC",
}

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,
	"DLC":                  12,
}

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

// The available delta types.
type DeltaType int32

const (
	DeltaType_DELTA_UNKNOWN  DeltaType = 0
	DeltaType_NO_DELTA       DeltaType = 1
	DeltaType_FSI            DeltaType = 2
	DeltaType_MILESTONE      DeltaType = 3
	DeltaType_OMAHA          DeltaType = 4
	DeltaType_STEPPING_STONE DeltaType = 5
)

var DeltaType_name = map[int32]string{
	0: "DELTA_UNKNOWN",
	1: "NO_DELTA",
	2: "FSI",
	3: "MILESTONE",
	4: "OMAHA",
	5: "STEPPING_STONE",
}

var DeltaType_value = map[string]int32{
	"DELTA_UNKNOWN":  0,
	"NO_DELTA":       1,
	"FSI":            2,
	"MILESTONE":      3,
	"OMAHA":          4,
	"STEPPING_STONE": 5,
}

func (x DeltaType) String() string {
	return proto.EnumName(DeltaType_name, int32(x))
}

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

// 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{3}
}

// 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
	GomaConfig_RBE_CHROMEOS              GomaConfig_GomaApproach = 4
)

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

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

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
	// Indicates wanting a test image tarball suitable for importing into GCE.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_GCE_TARBALL ArtifactsByService_Legacy_ArtifactType = 28
)

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",
	28: "GCE_TARBALL",
}

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,
	"GCE_TARBALL":         28,
}

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