// 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
	// Use these.
	ImageType_IMAGE_TYPE_BASE            ImageType = 1
	ImageType_IMAGE_TYPE_DEV             ImageType = 2
	ImageType_IMAGE_TYPE_TEST            ImageType = 3
	ImageType_IMAGE_TYPE_BASE_VM         ImageType = 4
	ImageType_IMAGE_TYPE_TEST_VM         ImageType = 5
	ImageType_IMAGE_TYPE_RECOVERY        ImageType = 6
	ImageType_IMAGE_TYPE_FACTORY         ImageType = 7
	ImageType_IMAGE_TYPE_FIRMWARE        ImageType = 8
	ImageType_IMAGE_TYPE_CR50_FIRMWARE   ImageType = 9
	ImageType_IMAGE_TYPE_BASE_GUEST_VM   ImageType = 10
	ImageType_IMAGE_TYPE_TEST_GUEST_VM   ImageType = 11
	ImageType_IMAGE_TYPE_DLC             ImageType = 12
	ImageType_IMAGE_TYPE_GSC_FIRMWARE    ImageType = 13
	ImageType_IMAGE_TYPE_ACCESSORY_USBPD ImageType = 14
	ImageType_IMAGE_TYPE_ACCESSORY_RWSIG ImageType = 15
	// Do not continue to use (or add to) these, use aliased enums above.
	// TODO: Deprecate non-prefixed enums (carefully considering branches).
	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
	ImageType_GSC_FIRMWARE  ImageType = 13
)

var ImageType_name = map[int32]string{
	0:  "IMAGE_TYPE_UNDEFINED",
	1:  "IMAGE_TYPE_BASE",
	2:  "IMAGE_TYPE_DEV",
	3:  "IMAGE_TYPE_TEST",
	4:  "IMAGE_TYPE_BASE_VM",
	5:  "IMAGE_TYPE_TEST_VM",
	6:  "IMAGE_TYPE_RECOVERY",
	7:  "IMAGE_TYPE_FACTORY",
	8:  "IMAGE_TYPE_FIRMWARE",
	9:  "IMAGE_TYPE_CR50_FIRMWARE",
	10: "IMAGE_TYPE_BASE_GUEST_VM",
	11: "IMAGE_TYPE_TEST_GUEST_VM",
	12: "IMAGE_TYPE_DLC",
	13: "IMAGE_TYPE_GSC_FIRMWARE",
	14: "IMAGE_TYPE_ACCESSORY_USBPD",
	15: "IMAGE_TYPE_ACCESSORY_RWSIG",
	// Duplicate value: 1: "BASE",
	// Duplicate value: 2: "DEV",
	// Duplicate value: 3: "TEST",
	// Duplicate value: 4: "BASE_VM",
	// Duplicate value: 5: "TEST_VM",
	// Duplicate value: 6: "RECOVERY",
	// Duplicate value: 7: "FACTORY",
	// Duplicate value: 8: "FIRMWARE",
	// Duplicate value: 9: "CR50_FIRMWARE",
	// Duplicate value: 10: "BASE_GUEST_VM",
	// Duplicate value: 11: "TEST_GUEST_VM",
	// Duplicate value: 12: "DLC",
	// Duplicate value: 13: "GSC_FIRMWARE",
}

var ImageType_value = map[string]int32{
	"IMAGE_TYPE_UNDEFINED":       0,
	"IMAGE_TYPE_BASE":            1,
	"IMAGE_TYPE_DEV":             2,
	"IMAGE_TYPE_TEST":            3,
	"IMAGE_TYPE_BASE_VM":         4,
	"IMAGE_TYPE_TEST_VM":         5,
	"IMAGE_TYPE_RECOVERY":        6,
	"IMAGE_TYPE_FACTORY":         7,
	"IMAGE_TYPE_FIRMWARE":        8,
	"IMAGE_TYPE_CR50_FIRMWARE":   9,
	"IMAGE_TYPE_BASE_GUEST_VM":   10,
	"IMAGE_TYPE_TEST_GUEST_VM":   11,
	"IMAGE_TYPE_DLC":             12,
	"IMAGE_TYPE_GSC_FIRMWARE":    13,
	"IMAGE_TYPE_ACCESSORY_USBPD": 14,
	"IMAGE_TYPE_ACCESSORY_RWSIG": 15,
	"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,
	"GSC_FIRMWARE":               13,
}

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

// List of known location that firmware can be built from
type FwLocation int32

const (
	FwLocation_FW_LOCATION_UNKNOWN FwLocation = 0
	FwLocation_PLATFORM_EC         FwLocation = 1
	FwLocation_PLATFORM_ZEPHYR     FwLocation = 2
	FwLocation_PLATFORM_TI50       FwLocation = 3
)

var FwLocation_name = map[int32]string{
	0: "FW_LOCATION_UNKNOWN",
	1: "PLATFORM_EC",
	2: "PLATFORM_ZEPHYR",
	3: "PLATFORM_TI50",
}

var FwLocation_value = map[string]int32{
	"FW_LOCATION_UNKNOWN": 0,
	"PLATFORM_EC":         1,
	"PLATFORM_ZEPHYR":     2,
	"PLATFORM_TI50":       3,
}

func (x FwLocation) String() string {
	return proto.EnumName(FwLocation_name, int32(x))
}

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

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

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

// When to publish the artifact.
type ArtifactsByService_PublishCondition int32

const (
	ArtifactsByService_PUBLISH_UNSPECIFIED ArtifactsByService_PublishCondition = 0
	// Publish only for successful builds.  This is the default.
	ArtifactsByService_PUBLISH_ON_SUCCESS ArtifactsByService_PublishCondition = 1
	// Publish always.  (Useful for error diagnostics.)
	ArtifactsByService_PUBLISH_ALWAYS ArtifactsByService_PublishCondition = 2
)

var ArtifactsByService_PublishCondition_name = map[int32]string{
	0: "PUBLISH_UNSPECIFIED",
	1: "PUBLISH_ON_SUCCESS",
	2: "PUBLISH_ALWAYS",
}

var ArtifactsByService_PublishCondition_value = map[string]int32{
	"PUBLISH_UNSPECIFIED": 0,
	"PUBLISH_ON_SUCCESS":  1,
	"PUBLISH_ALWAYS":      2,
}

func (x ArtifactsByService_PublishCondition) String() string {
	return proto.EnumName(ArtifactsByService_PublishCondition_name, int32(x))
}

func (ArtifactsByService_PublishCondition) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{20, 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{20, 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
	// Indicates Rusage logs from Compiler Invocations
	ArtifactsByService_Toolchain_COMPILER_RUSAGE_LOG ArtifactsByService_Toolchain_ArtifactType = 29
)

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",
	29: "COMPILER_RUSAGE_LOG",
}

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,
	"COMPILER_RUSAGE_LOG":                   29,
}

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{20, 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{20, 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{20, 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{20, 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{20, 5, 0}
}

// Artifacts which the ArtifactsService endpoints pass to FirmwareService.
type ArtifactsByService_Firmware_ArtifactType int32

const (
	ArtifactsByService_Firmware_UNSPECIFIED ArtifactsByService_Firmware_ArtifactType = 0
	// Firmware artifacts in a tarball.
	ArtifactsByService_Firmware_FIRMWARE_TARBALL ArtifactsByService_Firmware_ArtifactType = 30
	// Metadata about the firmware.
	ArtifactsByService_Firmware_FIRMWARE_TARBALL_INFO ArtifactsByService_Firmware_ArtifactType = 31
)

var ArtifactsByService_Firmware_ArtifactType_name = map[int32]string{
	0:  "UNSPECIFIED",
	30: "FIRMWARE_TARBALL",
	31: "FIRMWARE_TARBALL_INFO",
}

var ArtifactsByService_Firmware_ArtifactType_value = map[string]int32{
	"UNSPECIFIED":           0,
	"FIRMWARE_TARBALL":      30,
	"FIRMWARE_TARBALL_INFO": 31,
}

func (x ArtifactsByService_Firmware_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Firmware_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Firmware_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{20, 6, 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 ""
}

// Message for defining a release builder.
// Used to generate release_builders.star.
type ReleaseBuilder struct {
	// Types that are valid to be assigned to MilestoneMessage:
	//	*ReleaseBuilder_Milestone_
	MilestoneMessage isReleaseBuilder_MilestoneMessage `protobuf_oneof:"milestone_message"`
	// Schedule to use for release builder.
	// e.g. "0 5 * * *"
	BuildSchedule        string   `protobuf:"bytes,2,opt,name=build_schedule,json=buildSchedule,proto3" json:"build_schedule,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReleaseBuilder proto.InternalMessageInfo

type isReleaseBuilder_MilestoneMessage interface {
	isReleaseBuilder_MilestoneMessage()
}

type ReleaseBuilder_Milestone_ struct {
	Milestone *ReleaseBuilder_Milestone `protobuf:"bytes,1,opt,name=milestone,proto3,oneof"`
}

func (*ReleaseBuilder_Milestone_) isReleaseBuilder_MilestoneMessage() {}

func (m *ReleaseBuilder) GetMilestoneMessage() isReleaseBuilder_MilestoneMessage {
	if m != nil {
		return m.MilestoneMessage
	}
	return nil
}

func (m *ReleaseBuilder) GetMilestone() *ReleaseBuilder_Milestone {
	if x, ok := m.GetMilestoneMessage().(*ReleaseBuilder_Milestone_); ok {
		return x.Milestone
	}
	return nil
}

func (m *ReleaseBuilder) GetBuildSchedule() string {
	if m != nil {
		return m.BuildSchedule
	}
	return ""
}

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

// The release milestone. Needs to have "branch_name" filled out.
// TODO(b/177487002): cannot include prototype.Milestone at this time.
//prototype.Milestone milestone = 1;
type ReleaseBuilder_Milestone struct {
	// E.g. 86
	Number int32 `protobuf:"varint,1,opt,name=number,proto3" json:"number,omitempty"`
	// Initially planned branch date for the milestone.
	TargetBranchDate *ReleaseBuilder_Milestone_Date `protobuf:"bytes,2,opt,name=target_branch_date,json=targetBranchDate,proto3" json:"target_branch_date,omitempty"`
	// Actual branch name when the branch is created.
	// E.g. release-R86-13421.B
	BranchName           string   `protobuf:"bytes,3,opt,name=branch_name,json=branchName,proto3" json:"branch_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReleaseBuilder_Milestone proto.InternalMessageInfo

func (m *ReleaseBuilder_Milestone) GetNumber() int32 {
	if m != nil {
		return m.Number
	}
	return 0
}

func (m *ReleaseBuilder_Milestone) GetTargetBranchDate() *ReleaseBuilder_Milestone_Date {
	if m != nil {
		return m.TargetBranchDate
	}
	return nil
}

func (m *ReleaseBuilder_Milestone) GetBranchName() string {
	if m != nil {
		return m.BranchName
	}
	return ""
}

type ReleaseBuilder_Milestone_Date struct {
	// Format: YYYY-MM-DD (ISO 8601)
	// E.g. 2020-02-10
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReleaseBuilder_Milestone_Date proto.InternalMessageInfo

func (m *ReleaseBuilder_Milestone_Date) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

type ReleaseBuilders struct {
	// Release builders to generate _define_release blocks for
	// in release_builders.star.
	Builders             []*ReleaseBuilder `protobuf:"bytes,1,rep,name=builders,proto3" json:"builders,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_ReleaseBuilders proto.InternalMessageInfo

func (m *ReleaseBuilders) GetBuilders() []*ReleaseBuilder {
	if m != nil {
		return m.Builders
	}
	return nil
}

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

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

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

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

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"`
	Firmware             *ArtifactsByService_Firmware `protobuf:"bytes,8,opt,name=firmware,proto3" json:"firmware,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{20}
}

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
}

func (m *ArtifactsByService) GetFirmware() *ArtifactsByService_Firmware {
	if m != nil {
		return m.Firmware
	}
	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{20, 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"`
	// When to publish the artifact.
	PublishCondition     ArtifactsByService_PublishCondition `protobuf:"varint,5,opt,name=publish_condition,json=publishCondition,proto3,enum=chromiumos.ArtifactsByService_PublishCondition" json:"publish_condition,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{20, 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 ""
}

func (m *ArtifactsByService_Legacy_ArtifactInfo) GetPublishCondition() ArtifactsByService_PublishCondition {
	if m != nil {
		return m.PublishCondition
	}
	return ArtifactsByService_PUBLISH_UNSPECIFIED
}

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{20, 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"`
	// When to publish the artifact.
	PublishCondition     ArtifactsByService_PublishCondition `protobuf:"varint,5,opt,name=publish_condition,json=publishCondition,proto3,enum=chromiumos.ArtifactsByService_PublishCondition" json:"publish_condition,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{20, 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 ""
}

func (m *ArtifactsByService_Toolchain_ArtifactInfo) GetPublishCondition() ArtifactsByService_PublishCondition {
	if m != nil {
		return m.PublishCondition
	}
	return ArtifactsByService_PUBLISH_UNSPECIFIED
}

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{20, 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"`
	// When to publish the artifact.
	PublishCondition     ArtifactsByService_PublishCondition `protobuf:"varint,5,opt,name=publish_condition,json=publishCondition,proto3,enum=chromiumos.ArtifactsByService_PublishCondition" json:"publish_condition,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{20, 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 ""
}

func (m *ArtifactsByService_Image_ArtifactInfo) GetPublishCondition() ArtifactsByService_PublishCondition {
	if m != nil {
		return m.PublishCondition
	}
	return ArtifactsByService_PUBLISH_UNSPECIFIED
}

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{20, 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"`
	// When to publish the artifact.
	PublishCondition     ArtifactsByService_PublishCondition `protobuf:"varint,5,opt,name=publish_condition,json=publishCondition,proto3,enum=chromiumos.ArtifactsByService_PublishCondition" json:"publish_condition,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{20, 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 ""
}

func (m *ArtifactsByService_Package_ArtifactInfo) GetPublishCondition() ArtifactsByService_PublishCondition {
	if m != nil {
		return m.PublishCondition
	}
	return ArtifactsByService_PUBLISH_UNSPECIFIED
}

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{20, 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"`
	// When to publish the artifact.
	PublishCondition     ArtifactsByService_PublishCondition `protobuf:"varint,5,opt,name=publish_condition,json=publishCondition,proto3,enum=chromiumos.ArtifactsByService_PublishCondition" json:"publish_condition,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{20, 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 ""
}

func (m *ArtifactsByService_Sysroot_ArtifactInfo) GetPublishCondition() ArtifactsByService_PublishCondition {
	if m != nil {
		return m.PublishCondition
	}
	return ArtifactsByService_PUBLISH_UNSPECIFIED
}

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{20, 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"`
	// When to publish the artifact.
	PublishCondition     ArtifactsByService_PublishCondition `protobuf:"varint,5,opt,name=publish_condition,json=publishCondition,proto3,enum=chromiumos.ArtifactsByService_PublishCondition" json:"publish_condition,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{20, 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 ""
}

func (m *ArtifactsByService_Test_ArtifactInfo) GetPublishCondition() ArtifactsByService_PublishCondition {
	if m != nil {
		return m.PublishCondition
	}
	return ArtifactsByService_PUBLISH_UNSPECIFIED
}

type ArtifactsByService_Firmware struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Firmware_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Firmware_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_Firmware) Reset()         { *m = ArtifactsByService_Firmware{} }
func (m *ArtifactsByService_Firmware) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Firmware) ProtoMessage()    {}
func (*ArtifactsByService_Firmware) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{20, 6}
}

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

var xxx_messageInfo_ArtifactsByService_Firmware proto.InternalMessageInfo

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

func (m *ArtifactsByService_Firmware) GetOutputArtifacts() []*ArtifactsByService_Firmware_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_Firmware_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Firmware_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Firmware_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"`
	// When to publish the artifact.
	PublishCondition     ArtifactsByService_PublishCondition `protobuf:"varint,5,opt,name=publish_condition,json=publishCondition,proto3,enum=chromiumos.ArtifactsByService_PublishCondition" json:"publish_condition,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
	XXX_unrecognized     []byte                              `json:"-"`
	XXX_sizecache        int32                               `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Firmware_ArtifactInfo proto.InternalMessageInfo

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

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

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

func (m *ArtifactsByService_Firmware_ArtifactInfo) GetPublishCondition() ArtifactsByService_PublishCondition {
	if m != nil {
		return m.PublishCondition
	}
	return ArtifactsByService_PUBLISH_UNSPECIFIED
}

// 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"`
	Firmware             *UploadedArtifactsByService_Firmware  `protobuf:"bytes,7,opt,name=firmware,proto3" json:"firmware,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{21}
}

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
}

func (m *UploadedArtifactsByService) GetFirmware() *UploadedArtifactsByService_Firmware {
	if m != nil {
		return m.Firmware
	}
	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{21, 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                []*Path  `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{21, 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() []*Path {
	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{21, 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                []*Path  `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{21, 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() []*Path {
	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{21, 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                []*Path  `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{21, 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() []*Path {
	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{21, 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                []*Path  `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{21, 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() []*Path {
	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{21, 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                []*Path  `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{21, 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() []*Path {
	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{21, 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                []*Path  `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{21, 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() []*Path {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Firmware struct {
	Artifacts            []*UploadedArtifactsByService_Firmware_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_Firmware) Reset()         { *m = UploadedArtifactsByService_Firmware{} }
func (m *UploadedArtifactsByService_Firmware) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService_Firmware) ProtoMessage()    {}
func (*UploadedArtifactsByService_Firmware) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{21, 6}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Firmware proto.InternalMessageInfo

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

type UploadedArtifactsByService_Firmware_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Firmware_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Firmware_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []*Path  `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_Firmware_ArtifactPaths) Reset() {
	*m = UploadedArtifactsByService_Firmware_ArtifactPaths{}
}
func (m *UploadedArtifactsByService_Firmware_ArtifactPaths) String() string {
	return proto.CompactTextString(m)
}
func (*UploadedArtifactsByService_Firmware_ArtifactPaths) ProtoMessage() {}
func (*UploadedArtifactsByService_Firmware_ArtifactPaths) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{21, 6, 0}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Firmware_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Firmware_ArtifactPaths) GetArtifactType() ArtifactsByService_Firmware_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Firmware_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Firmware_ArtifactPaths) GetPaths() []*Path {
	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.FwLocation", FwLocation_name, FwLocation_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_PublishCondition", ArtifactsByService_PublishCondition_name, ArtifactsByService_PublishCondition_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.RegisterEnum("chromiumos.ArtifactsByService_Firmware_ArtifactType", ArtifactsByService_Firmware_ArtifactType_name, ArtifactsByService_Firmware_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((*ReleaseBuilder)(nil), "chromiumos.ReleaseBuilder")
	proto.RegisterType((*ReleaseBuilder_Milestone)(nil), "chromiumos.ReleaseBuilder.Milestone")
	proto.RegisterType((*ReleaseBuilder_Milestone_Date)(nil), "chromiumos.ReleaseBuilder.Milestone.Date")
	proto.RegisterType((*ReleaseBuilders)(nil), "chromiumos.ReleaseBuilders")
	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((*ArtifactsByService_Firmware)(nil), "chromiumos.ArtifactsByService.Firmware")
	proto.RegisterType((*ArtifactsByService_Firmware_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Firmware.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")
	proto.RegisterType((*UploadedArtifactsByService_Firmware)(nil), "chromiumos.UploadedArtifactsByService.Firmware")
	proto.RegisterType((*UploadedArtifactsByService_Firmware_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Firmware.ArtifactPaths")
}

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

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