// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/payload.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Defines a single build directory in storage.
type Build struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The board of the image "x86-mario", etc.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The version of the image. "0.14.23.2", "3401.0.0", etc.
	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	// The bucket of the image. "chromeos-releases" as default.
	Bucket string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// The channel of the image "stable-channel", "nplusone", etc.
	Channel string `protobuf:"bytes,4,opt,name=channel,proto3" json:"channel,omitempty"`
}

func (x *Build) Reset() {
	*x = Build{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_payload_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Build) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Build) ProtoMessage() {}

func (x *Build) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_payload_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Build.ProtoReflect.Descriptor instead.
func (*Build) Descriptor() ([]byte, []int) {
	return file_chromite_api_payload_proto_rawDescGZIP(), []int{0}
}

func (x *Build) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

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

func (x *Build) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

func (x *Build) GetChannel() string {
	if x != nil {
		return x.Channel
	}
	return ""
}

// Define a DLC image archived.
type DLCImage struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// An instance of Build that defines the build artifacts directory.
	Build *Build `protobuf:"bytes,1,opt,name=build,proto3" json:"build,omitempty"`
	// The name of the DLC (e.g. 'terminal-dlc').
	DlcId string `protobuf:"bytes,2,opt,name=dlc_id,json=dlcId,proto3" json:"dlc_id,omitempty"`
	// The name of the DLC package (e.g. 'package').
	DlcPackage string `protobuf:"bytes,3,opt,name=dlc_package,json=dlcPackage,proto3" json:"dlc_package,omitempty"`
	// The name of the DLC image (e.g. 'dlc.img').
	DlcImage string `protobuf:"bytes,4,opt,name=dlc_image,json=dlcImage,proto3" json:"dlc_image,omitempty"`
	// The type of the image. Currently, always 'DLC'.
	ImageType chromiumos.ImageType `protobuf:"varint,5,opt,name=image_type,json=imageType,proto3,enum=chromiumos.ImageType" json:"image_type,omitempty"`
}

func (x *DLCImage) Reset() {
	*x = DLCImage{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_payload_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DLCImage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DLCImage) ProtoMessage() {}

func (x *DLCImage) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_payload_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DLCImage.ProtoReflect.Descriptor instead.
func (*DLCImage) Descriptor() ([]byte, []int) {
	return file_chromite_api_payload_proto_rawDescGZIP(), []int{1}
}

func (x *DLCImage) GetBuild() *Build {
	if x != nil {
		return x.Build
	}
	return nil
}

func (x *DLCImage) GetDlcId() string {
	if x != nil {
		return x.DlcId
	}
	return ""
}

func (x *DLCImage) GetDlcPackage() string {
	if x != nil {
		return x.DlcPackage
	}
	return ""
}

func (x *DLCImage) GetDlcImage() string {
	if x != nil {
		return x.DlcImage
	}
	return ""
}

func (x *DLCImage) GetImageType() chromiumos.ImageType {
	if x != nil {
		return x.ImageType
	}
	return chromiumos.ImageType_IMAGE_TYPE_UNDEFINED
}

// Define a signed ChromeOS image archived.
type SignedImage struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// An instance of Build that defines the build artifacts directory.
	Build *Build `protobuf:"bytes,1,opt,name=build,proto3" json:"build,omitempty"`
	// The type of the image. Currently, "recovery" or "base" types are supported.
	ImageType chromiumos.ImageType `protobuf:"varint,2,opt,name=image_type,json=imageType,proto3,enum=chromiumos.ImageType" json:"image_type,omitempty"`
	// The key the image was signed with. "premp", "mp", "mp-v2". This is not the
	// board specific key name, but the general value used in image/payload names.
	Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"`
}

func (x *SignedImage) Reset() {
	*x = SignedImage{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_payload_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SignedImage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SignedImage) ProtoMessage() {}

func (x *SignedImage) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_payload_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use SignedImage.ProtoReflect.Descriptor instead.
func (*SignedImage) Descriptor() ([]byte, []int) {
	return file_chromite_api_payload_proto_rawDescGZIP(), []int{2}
}

func (x *SignedImage) GetBuild() *Build {
	if x != nil {
		return x.Build
	}
	return nil
}

func (x *SignedImage) GetImageType() chromiumos.ImageType {
	if x != nil {
		return x.ImageType
	}
	return chromiumos.ImageType_IMAGE_TYPE_UNDEFINED
}

func (x *SignedImage) GetKey() string {
	if x != nil {
		return x.Key
	}
	return ""
}

// Define a unsigned ChromeOS image archived.
type UnsignedImage struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// An instance of Build that defines the build artifacts directory.
	Build *Build `protobuf:"bytes,1,opt,name=build,proto3" json:"build,omitempty"`
	/// The type of the image. Currently one of "test", "recovery", or "base".
	ImageType chromiumos.ImageType `protobuf:"varint,2,opt,name=image_type,json=imageType,proto3,enum=chromiumos.ImageType" json:"image_type,omitempty"`
	// The most recent branch corresponding to the version; "R19" etc.
	Milestone string `protobuf:"bytes,3,opt,name=milestone,proto3" json:"milestone,omitempty"`
}

func (x *UnsignedImage) Reset() {
	*x = UnsignedImage{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_payload_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *UnsignedImage) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*UnsignedImage) ProtoMessage() {}

func (x *UnsignedImage) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_payload_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use UnsignedImage.ProtoReflect.Descriptor instead.
func (*UnsignedImage) Descriptor() ([]byte, []int) {
	return file_chromite_api_payload_proto_rawDescGZIP(), []int{3}
}

func (x *UnsignedImage) GetBuild() *Build {
	if x != nil {
		return x.Build
	}
	return nil
}

func (x *UnsignedImage) GetImageType() chromiumos.ImageType {
	if x != nil {
		return x.ImageType
	}
	return chromiumos.ImageType_IMAGE_TYPE_UNDEFINED
}

func (x *UnsignedImage) GetMilestone() string {
	if x != nil {
		return x.Milestone
	}
	return ""
}

// Request payload generation to be done with a source and target image.
type GenerationRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Source image properties, must be either full_update or the same type as
	// the included tgt_image_oneof. full_update indicates the lack of a source.
	//
	// Types that are assignable to SrcImageOneof:
	//	*GenerationRequest_FullUpdate
	//	*GenerationRequest_SrcSignedImage
	//	*GenerationRequest_SrcUnsignedImage
	//	*GenerationRequest_SrcDlcImage
	SrcImageOneof isGenerationRequest_SrcImageOneof `protobuf_oneof:"src_image_oneof"`
	// Target image properties.
	//
	// Types that are assignable to TgtImageOneof:
	//	*GenerationRequest_TgtSignedImage
	//	*GenerationRequest_TgtUnsignedImage
	//	*GenerationRequest_TgtDlcImage
	TgtImageOneof isGenerationRequest_TgtImageOneof `protobuf_oneof:"tgt_image_oneof"`
	// The destination bucket (defaults to "chromeos-releases").
	Bucket string `protobuf:"bytes,6,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// Should we run verification?
	Verify bool `protobuf:"varint,7,opt,name=verify,proto3" json:"verify,omitempty"`
	// The keyset to sign with (e.g. "coral-mp-v16"), if empty do not sign,
	// and may be ignored for certain request types (e.g. dlc).
	Keyset string `protobuf:"bytes,8,opt,name=keyset,proto3" json:"keyset,omitempty"`
	// Do not sign images or upload artifacts.
	Dryrun bool `protobuf:"varint,9,opt,name=dryrun,proto3" json:"dryrun,omitempty"`
}

func (x *GenerationRequest) Reset() {
	*x = GenerationRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_payload_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GenerationRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GenerationRequest) ProtoMessage() {}

func (x *GenerationRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_payload_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerationRequest.ProtoReflect.Descriptor instead.
func (*GenerationRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_payload_proto_rawDescGZIP(), []int{4}
}

func (m *GenerationRequest) GetSrcImageOneof() isGenerationRequest_SrcImageOneof {
	if m != nil {
		return m.SrcImageOneof
	}
	return nil
}

func (x *GenerationRequest) GetFullUpdate() bool {
	if x, ok := x.GetSrcImageOneof().(*GenerationRequest_FullUpdate); ok {
		return x.FullUpdate
	}
	return false
}

func (x *GenerationRequest) GetSrcSignedImage() *SignedImage {
	if x, ok := x.GetSrcImageOneof().(*GenerationRequest_SrcSignedImage); ok {
		return x.SrcSignedImage
	}
	return nil
}

func (x *GenerationRequest) GetSrcUnsignedImage() *UnsignedImage {
	if x, ok := x.GetSrcImageOneof().(*GenerationRequest_SrcUnsignedImage); ok {
		return x.SrcUnsignedImage
	}
	return nil
}

func (x *GenerationRequest) GetSrcDlcImage() *DLCImage {
	if x, ok := x.GetSrcImageOneof().(*GenerationRequest_SrcDlcImage); ok {
		return x.SrcDlcImage
	}
	return nil
}

func (m *GenerationRequest) GetTgtImageOneof() isGenerationRequest_TgtImageOneof {
	if m != nil {
		return m.TgtImageOneof
	}
	return nil
}

func (x *GenerationRequest) GetTgtSignedImage() *SignedImage {
	if x, ok := x.GetTgtImageOneof().(*GenerationRequest_TgtSignedImage); ok {
		return x.TgtSignedImage
	}
	return nil
}

func (x *GenerationRequest) GetTgtUnsignedImage() *UnsignedImage {
	if x, ok := x.GetTgtImageOneof().(*GenerationRequest_TgtUnsignedImage); ok {
		return x.TgtUnsignedImage
	}
	return nil
}

func (x *GenerationRequest) GetTgtDlcImage() *DLCImage {
	if x, ok := x.GetTgtImageOneof().(*GenerationRequest_TgtDlcImage); ok {
		return x.TgtDlcImage
	}
	return nil
}

func (x *GenerationRequest) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

func (x *GenerationRequest) GetVerify() bool {
	if x != nil {
		return x.Verify
	}
	return false
}

func (x *GenerationRequest) GetKeyset() string {
	if x != nil {
		return x.Keyset
	}
	return ""
}

func (x *GenerationRequest) GetDryrun() bool {
	if x != nil {
		return x.Dryrun
	}
	return false
}

type isGenerationRequest_SrcImageOneof interface {
	isGenerationRequest_SrcImageOneof()
}

type GenerationRequest_FullUpdate struct {
	FullUpdate bool `protobuf:"varint,1,opt,name=full_update,json=fullUpdate,proto3,oneof"`
}

type GenerationRequest_SrcSignedImage struct {
	SrcSignedImage *SignedImage `protobuf:"bytes,2,opt,name=src_signed_image,json=srcSignedImage,proto3,oneof"`
}

type GenerationRequest_SrcUnsignedImage struct {
	SrcUnsignedImage *UnsignedImage `protobuf:"bytes,3,opt,name=src_unsigned_image,json=srcUnsignedImage,proto3,oneof"`
}

type GenerationRequest_SrcDlcImage struct {
	SrcDlcImage *DLCImage `protobuf:"bytes,10,opt,name=src_dlc_image,json=srcDlcImage,proto3,oneof"`
}

func (*GenerationRequest_FullUpdate) isGenerationRequest_SrcImageOneof() {}

func (*GenerationRequest_SrcSignedImage) isGenerationRequest_SrcImageOneof() {}

func (*GenerationRequest_SrcUnsignedImage) isGenerationRequest_SrcImageOneof() {}

func (*GenerationRequest_SrcDlcImage) isGenerationRequest_SrcImageOneof() {}

type isGenerationRequest_TgtImageOneof interface {
	isGenerationRequest_TgtImageOneof()
}

type GenerationRequest_TgtSignedImage struct {
	TgtSignedImage *SignedImage `protobuf:"bytes,4,opt,name=tgt_signed_image,json=tgtSignedImage,proto3,oneof"`
}

type GenerationRequest_TgtUnsignedImage struct {
	TgtUnsignedImage *UnsignedImage `protobuf:"bytes,5,opt,name=tgt_unsigned_image,json=tgtUnsignedImage,proto3,oneof"`
}

type GenerationRequest_TgtDlcImage struct {
	TgtDlcImage *DLCImage `protobuf:"bytes,11,opt,name=tgt_dlc_image,json=tgtDlcImage,proto3,oneof"`
}

func (*GenerationRequest_TgtSignedImage) isGenerationRequest_TgtImageOneof() {}

func (*GenerationRequest_TgtUnsignedImage) isGenerationRequest_TgtImageOneof() {}

func (*GenerationRequest_TgtDlcImage) isGenerationRequest_TgtImageOneof() {}

// Result of a payload generation.
type GenerationResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Whether we've completed successfully.
	Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
	// If successful we may have a local artifact available. Generally this takes
	// the form of '/tmp/ioadwjoawjd/delta.bin'.
	LocalPath string `protobuf:"bytes,2,opt,name=local_path,json=localPath,proto3" json:"local_path,omitempty"`
	// If successful we may have uploaded an artifact to google storage.
	RemoteUri string `protobuf:"bytes,3,opt,name=remote_uri,json=remoteUri,proto3" json:"remote_uri,omitempty"`
}

func (x *GenerationResponse) Reset() {
	*x = GenerationResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_payload_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GenerationResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GenerationResponse) ProtoMessage() {}

func (x *GenerationResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_payload_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GenerationResponse.ProtoReflect.Descriptor instead.
func (*GenerationResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_payload_proto_rawDescGZIP(), []int{5}
}

func (x *GenerationResponse) GetSuccess() bool {
	if x != nil {
		return x.Success
	}
	return false
}

func (x *GenerationResponse) GetLocalPath() string {
	if x != nil {
		return x.LocalPath
	}
	return ""
}

func (x *GenerationResponse) GetRemoteUri() string {
	if x != nil {
		return x.RemoteUri
	}
	return ""
}

var File_chromite_api_payload_proto protoreflect.FileDescriptor

var file_chromite_api_payload_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70,
	0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61,
	0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x3a, 0x0a, 0x0c, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x68, 0x61,
	0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e,
	0x6e, 0x65, 0x6c, 0x22, 0xc0, 0x01, 0x0a, 0x08, 0x44, 0x4c, 0x43, 0x49, 0x6d, 0x61, 0x67, 0x65,
	0x12, 0x29, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x64,
	0x6c, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x64, 0x6c, 0x63,
	0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x6c, 0x63, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67,
	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6c, 0x63, 0x50, 0x61, 0x63, 0x6b,
	0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x6c, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x6c, 0x63, 0x49, 0x6d, 0x61, 0x67, 0x65,
	0x12, 0x34, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x69, 0x6d, 0x61,
	0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x80, 0x01, 0x0a, 0x0b, 0x53, 0x69, 0x67, 0x6e, 0x65,
	0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x12, 0x34, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x69, 0x6d,
	0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x8e, 0x01, 0x0a, 0x0d, 0x55, 0x6e,
	0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52,
	0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x34, 0x0a, 0x0a, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f,
	0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70,
	0x65, 0x52, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09,
	0x6d, 0x69, 0x6c, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x09, 0x6d, 0x69, 0x6c, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x22, 0xe0, 0x04, 0x0a, 0x11, 0x47,
	0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x21, 0x0a, 0x0b, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x75, 0x6c, 0x6c, 0x55, 0x70, 0x64,
	0x61, 0x74, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x73, 0x72, 0x63, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x65,
	0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x69, 0x67,
	0x6e, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x72, 0x63, 0x53,
	0x69, 0x67, 0x6e, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x4b, 0x0a, 0x12, 0x73, 0x72,
	0x63, 0x5f, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65,
	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x49, 0x6d,
	0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x10, 0x73, 0x72, 0x63, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e,
	0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x73, 0x72, 0x63, 0x5f, 0x64,
	0x6c, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x4c,
	0x43, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x72, 0x63, 0x44, 0x6c, 0x63,
	0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x74, 0x67, 0x74, 0x5f, 0x73, 0x69, 0x67,
	0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x19, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53,
	0x69, 0x67, 0x6e, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x01, 0x52, 0x0e, 0x74, 0x67,
	0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x4b, 0x0a, 0x12,
	0x74, 0x67, 0x74, 0x5f, 0x75, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x61,
	0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x6e, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64,
	0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x01, 0x52, 0x10, 0x74, 0x67, 0x74, 0x55, 0x6e, 0x73, 0x69,
	0x67, 0x6e, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x74, 0x67, 0x74,
	0x5f, 0x64, 0x6c, 0x63, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x44, 0x4c, 0x43, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x74, 0x67, 0x74, 0x44,
	0x6c, 0x63, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65,
	0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12,
	0x16, 0x0a, 0x06, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x06, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x73, 0x65,
	0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6b, 0x65, 0x79, 0x73, 0x65, 0x74, 0x12,
	0x16, 0x0a, 0x06, 0x64, 0x72, 0x79, 0x72, 0x75, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x06, 0x64, 0x72, 0x79, 0x72, 0x75, 0x6e, 0x42, 0x11, 0x0a, 0x0f, 0x73, 0x72, 0x63, 0x5f, 0x69,
	0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x42, 0x11, 0x0a, 0x0f, 0x74, 0x67,
	0x74, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6f, 0x6e, 0x65, 0x6f, 0x66, 0x22, 0x6c, 0x0a,
	0x12, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1d, 0x0a,
	0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1d, 0x0a, 0x0a,
	0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x09, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x55, 0x72, 0x69, 0x32, 0x77, 0x0a, 0x0e, 0x50,
	0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x54, 0x0a,
	0x0f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64,
	0x12, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x1a, 0x20, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x1a, 0x0f, 0xc2, 0xed, 0x1a, 0x0b, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f,
	0x61, 0x64, 0x10, 0x01, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67,
	0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_payload_proto_rawDescOnce sync.Once
	file_chromite_api_payload_proto_rawDescData = file_chromite_api_payload_proto_rawDesc
)

func file_chromite_api_payload_proto_rawDescGZIP() []byte {
	file_chromite_api_payload_proto_rawDescOnce.Do(func() {
		file_chromite_api_payload_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_payload_proto_rawDescData)
	})
	return file_chromite_api_payload_proto_rawDescData
}

var file_chromite_api_payload_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
var file_chromite_api_payload_proto_goTypes = []interface{}{
	(*Build)(nil),                  // 0: chromite.api.Build
	(*DLCImage)(nil),               // 1: chromite.api.DLCImage
	(*SignedImage)(nil),            // 2: chromite.api.SignedImage
	(*UnsignedImage)(nil),          // 3: chromite.api.UnsignedImage
	(*GenerationRequest)(nil),      // 4: chromite.api.GenerationRequest
	(*GenerationResponse)(nil),     // 5: chromite.api.GenerationResponse
	(*chromiumos.BuildTarget)(nil), // 6: chromiumos.BuildTarget
	(chromiumos.ImageType)(0),      // 7: chromiumos.ImageType
}
var file_chromite_api_payload_proto_depIdxs = []int32{
	6,  // 0: chromite.api.Build.build_target:type_name -> chromiumos.BuildTarget
	0,  // 1: chromite.api.DLCImage.build:type_name -> chromite.api.Build
	7,  // 2: chromite.api.DLCImage.image_type:type_name -> chromiumos.ImageType
	0,  // 3: chromite.api.SignedImage.build:type_name -> chromite.api.Build
	7,  // 4: chromite.api.SignedImage.image_type:type_name -> chromiumos.ImageType
	0,  // 5: chromite.api.UnsignedImage.build:type_name -> chromite.api.Build
	7,  // 6: chromite.api.UnsignedImage.image_type:type_name -> chromiumos.ImageType
	2,  // 7: chromite.api.GenerationRequest.src_signed_image:type_name -> chromite.api.SignedImage
	3,  // 8: chromite.api.GenerationRequest.src_unsigned_image:type_name -> chromite.api.UnsignedImage
	1,  // 9: chromite.api.GenerationRequest.src_dlc_image:type_name -> chromite.api.DLCImage
	2,  // 10: chromite.api.GenerationRequest.tgt_signed_image:type_name -> chromite.api.SignedImage
	3,  // 11: chromite.api.GenerationRequest.tgt_unsigned_image:type_name -> chromite.api.UnsignedImage
	1,  // 12: chromite.api.GenerationRequest.tgt_dlc_image:type_name -> chromite.api.DLCImage
	4,  // 13: chromite.api.PayloadService.GeneratePayload:input_type -> chromite.api.GenerationRequest
	5,  // 14: chromite.api.PayloadService.GeneratePayload:output_type -> chromite.api.GenerationResponse
	14, // [14:15] is the sub-list for method output_type
	13, // [13:14] is the sub-list for method input_type
	13, // [13:13] is the sub-list for extension type_name
	13, // [13:13] is the sub-list for extension extendee
	0,  // [0:13] is the sub-list for field type_name
}

func init() { file_chromite_api_payload_proto_init() }
func file_chromite_api_payload_proto_init() {
	if File_chromite_api_payload_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_payload_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Build); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_payload_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DLCImage); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_payload_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SignedImage); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_payload_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UnsignedImage); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_payload_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerationRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_payload_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GenerationResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_chromite_api_payload_proto_msgTypes[4].OneofWrappers = []interface{}{
		(*GenerationRequest_FullUpdate)(nil),
		(*GenerationRequest_SrcSignedImage)(nil),
		(*GenerationRequest_SrcUnsignedImage)(nil),
		(*GenerationRequest_SrcDlcImage)(nil),
		(*GenerationRequest_TgtSignedImage)(nil),
		(*GenerationRequest_TgtUnsignedImage)(nil),
		(*GenerationRequest_TgtDlcImage)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_payload_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   6,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_payload_proto_goTypes,
		DependencyIndexes: file_chromite_api_payload_proto_depIdxs,
		MessageInfos:      file_chromite_api_payload_proto_msgTypes,
	}.Build()
	File_chromite_api_payload_proto = out.File
	file_chromite_api_payload_proto_rawDesc = nil
	file_chromite_api_payload_proto_goTypes = nil
	file_chromite_api_payload_proto_depIdxs = nil
}
