// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/payload.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

// Defines a single build directory in storage.
type Build struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Build proto.InternalMessageInfo

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

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

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

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

// Define a signed ChromeOS image archived.
type SignedImage struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SignedImage proto.InternalMessageInfo

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

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

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

// Define a unsigned ChromeOS image archived.
type UnsignedImage struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UnsignedImage proto.InternalMessageInfo

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

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

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

// Request payload generation to be done with a source and target image.
type PayloadGenerationRequest struct {
	// 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 valid to be assigned to SrcImageOneof:
	//	*PayloadGenerationRequest_FullUpdate
	//	*PayloadGenerationRequest_SrcSignedImage
	//	*PayloadGenerationRequest_SrcUnsignedImage
	SrcImageOneof isPayloadGenerationRequest_SrcImageOneof `protobuf_oneof:"src_image_oneof"`
	// Target image properties.
	//
	// Types that are valid to be assigned to TgtImageOneof:
	//	*PayloadGenerationRequest_TgtSignedImage
	//	*PayloadGenerationRequest_TgtUnsignedImage
	TgtImageOneof isPayloadGenerationRequest_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.
	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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PayloadGenerationRequest proto.InternalMessageInfo

type isPayloadGenerationRequest_SrcImageOneof interface {
	isPayloadGenerationRequest_SrcImageOneof()
}

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

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

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

func (*PayloadGenerationRequest_FullUpdate) isPayloadGenerationRequest_SrcImageOneof() {}

func (*PayloadGenerationRequest_SrcSignedImage) isPayloadGenerationRequest_SrcImageOneof() {}

func (*PayloadGenerationRequest_SrcUnsignedImage) isPayloadGenerationRequest_SrcImageOneof() {}

func (m *PayloadGenerationRequest) GetSrcImageOneof() isPayloadGenerationRequest_SrcImageOneof {
	if m != nil {
		return m.SrcImageOneof
	}
	return nil
}

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

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

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

type isPayloadGenerationRequest_TgtImageOneof interface {
	isPayloadGenerationRequest_TgtImageOneof()
}

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

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

func (*PayloadGenerationRequest_TgtSignedImage) isPayloadGenerationRequest_TgtImageOneof() {}

func (*PayloadGenerationRequest_TgtUnsignedImage) isPayloadGenerationRequest_TgtImageOneof() {}

func (m *PayloadGenerationRequest) GetTgtImageOneof() isPayloadGenerationRequest_TgtImageOneof {
	if m != nil {
		return m.TgtImageOneof
	}
	return nil
}

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

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

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

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

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

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

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PayloadGenerationRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PayloadGenerationRequest_FullUpdate)(nil),
		(*PayloadGenerationRequest_SrcSignedImage)(nil),
		(*PayloadGenerationRequest_SrcUnsignedImage)(nil),
		(*PayloadGenerationRequest_TgtSignedImage)(nil),
		(*PayloadGenerationRequest_TgtUnsignedImage)(nil),
	}
}

// Result of a payload generation.
type PayloadGenerationResult struct {
	// Whether we've completed successfully.
	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PayloadGenerationResult proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*Build)(nil), "chromite.api.Build")
	proto.RegisterType((*SignedImage)(nil), "chromite.api.SignedImage")
	proto.RegisterType((*UnsignedImage)(nil), "chromite.api.UnsignedImage")
	proto.RegisterType((*PayloadGenerationRequest)(nil), "chromite.api.PayloadGenerationRequest")
	proto.RegisterType((*PayloadGenerationResult)(nil), "chromite.api.PayloadGenerationResult")
}

func init() { proto.RegisterFile("chromite/api/payload.proto", fileDescriptor_0ecdf1e4e8bef7a4) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// PayloadServiceClient is the client API for PayloadService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PayloadServiceClient interface {
	GeneratePayload(ctx context.Context, in *PayloadGenerationRequest, opts ...grpc.CallOption) (*PayloadGenerationResult, error)
}

type payloadServiceClient struct {
	cc *grpc.ClientConn
}

func NewPayloadServiceClient(cc *grpc.ClientConn) PayloadServiceClient {
	return &payloadServiceClient{cc}
}

func (c *payloadServiceClient) GeneratePayload(ctx context.Context, in *PayloadGenerationRequest, opts ...grpc.CallOption) (*PayloadGenerationResult, error) {
	out := new(PayloadGenerationResult)
	err := c.cc.Invoke(ctx, "/chromite.api.PayloadService/GeneratePayload", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// PayloadServiceServer is the server API for PayloadService service.
type PayloadServiceServer interface {
	GeneratePayload(context.Context, *PayloadGenerationRequest) (*PayloadGenerationResult, error)
}

// UnimplementedPayloadServiceServer can be embedded to have forward compatible implementations.
type UnimplementedPayloadServiceServer struct {
}

func (*UnimplementedPayloadServiceServer) GeneratePayload(ctx context.Context, req *PayloadGenerationRequest) (*PayloadGenerationResult, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GeneratePayload not implemented")
}

func RegisterPayloadServiceServer(s *grpc.Server, srv PayloadServiceServer) {
	s.RegisterService(&_PayloadService_serviceDesc, srv)
}

func _PayloadService_GeneratePayload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PayloadGenerationRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PayloadServiceServer).GeneratePayload(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PayloadService/GeneratePayload",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PayloadServiceServer).GeneratePayload(ctx, req.(*PayloadGenerationRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _PayloadService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.PayloadService",
	HandlerType: (*PayloadServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GeneratePayload",
			Handler:    _PayloadService_GeneratePayload_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/payload.proto",
}
