// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/toolchain.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

// TODO(crbug.com/1020615): Drop this once this is live in production and all of
// the users have migrated to using BuilderConfig.Artifacts.ArtifactType
// Meanwhile, keep this in sync with chromiumos/builder_config.proto.
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_7ff43bdb7436d394, []int{0}
}

// Does this artifact require a build?
type PrepareForToolchainBuildResponse_BuildRelevance int32

const (
	PrepareForToolchainBuildResponse_UNSPECIFIED PrepareForToolchainBuildResponse_BuildRelevance = 0
	// Build is necessary to generate artifacts.
	PrepareForToolchainBuildResponse_NEEDED PrepareForToolchainBuildResponse_BuildRelevance = 1
	// Defer to other artifacts.  Used primarily for aggregation of artifact
	// results.
	PrepareForToolchainBuildResponse_UNKNOWN PrepareForToolchainBuildResponse_BuildRelevance = 2
	// Artifacts are already generated.  The build is pointless.
	PrepareForToolchainBuildResponse_POINTLESS PrepareForToolchainBuildResponse_BuildRelevance = 3
)

var PrepareForToolchainBuildResponse_BuildRelevance_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NEEDED",
	2: "UNKNOWN",
	3: "POINTLESS",
}

var PrepareForToolchainBuildResponse_BuildRelevance_value = map[string]int32{
	"UNSPECIFIED": 0,
	"NEEDED":      1,
	"UNKNOWN":     2,
	"POINTLESS":   3,
}

func (x PrepareForToolchainBuildResponse_BuildRelevance) String() string {
	return proto.EnumName(PrepareForToolchainBuildResponse_BuildRelevance_name, int32(x))
}

func (PrepareForToolchainBuildResponse_BuildRelevance) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{2, 0}
}

// Information about a collection of artifacts.
type ArtifactInfo struct {
	// The ArtifactType.
	ArtifactType chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_type,omitempty"`
	// Artifacts for this ArtifactType.
	Artifacts            []*Artifact `protobuf:"bytes,2,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactInfo) GetArtifactType() chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED
}

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

// Prepare the build for artifact building.
type PrepareForToolchainBuildRequest struct {
	// The artifact types that this build should make.
	ArtifactTypes []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Note: both chroot and sysroot may be unspecified, when the endpoint is
	// called prior to their creation.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,3,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Information about artifacts available when preparing.
	InputArtifacts []*chromiumos.BuilderConfig_Artifacts_InputArtifactInfo `protobuf:"bytes,4,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Additional arguments used in PrepareForBuild.
	AdditionalArgs       *chromiumos.PrepareForBuildAdditionalArgs `protobuf:"bytes,5,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForToolchainBuildRequest proto.InternalMessageInfo

func (m *PrepareForToolchainBuildRequest) GetArtifactTypes() []chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *PrepareForToolchainBuildRequest) GetInputArtifacts() []*chromiumos.BuilderConfig_Artifacts_InputArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *PrepareForToolchainBuildRequest) GetAdditionalArgs() *chromiumos.PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

// TODO(crbug/1019868): Migrate to using chromiumos.PrepareForBuildResponse.
type PrepareForToolchainBuildResponse struct {
	BuildRelevance       PrepareForToolchainBuildResponse_BuildRelevance `protobuf:"varint,1,opt,name=build_relevance,json=buildRelevance,proto3,enum=chromite.api.PrepareForToolchainBuildResponse_BuildRelevance" json:"build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
	XXX_unrecognized     []byte                                          `json:"-"`
	XXX_sizecache        int32                                           `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForToolchainBuildResponse proto.InternalMessageInfo

func (m *PrepareForToolchainBuildResponse) GetBuildRelevance() PrepareForToolchainBuildResponse_BuildRelevance {
	if m != nil {
		return m.BuildRelevance
	}
	return PrepareForToolchainBuildResponse_UNSPECIFIED
}

type BundleToolchainRequest struct {
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir string `protobuf:"bytes,3,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	// Which artifacts are wanted?
	ArtifactTypes []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,4,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Additional arguments that were used in PrepareForBuild.
	AdditionalArgs       *chromiumos.PrepareForBuildAdditionalArgs `protobuf:"bytes,5,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_BundleToolchainRequest proto.InternalMessageInfo

func (m *BundleToolchainRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *BundleToolchainRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

func (m *BundleToolchainRequest) GetArtifactTypes() []chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *BundleToolchainRequest) GetAdditionalArgs() *chromiumos.PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

// Response describing which bundles were dumped to the given output directory.
type BundleToolchainResponse struct {
	// The artifacts that added to the output directory.
	ArtifactsInfo        []*ArtifactInfo `protobuf:"bytes,2,rep,name=artifacts_info,json=artifactsInfo,proto3" json:"artifacts_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_BundleToolchainResponse proto.InternalMessageInfo

func (m *BundleToolchainResponse) GetArtifactsInfo() []*ArtifactInfo {
	if m != nil {
		return m.ArtifactsInfo
	}
	return nil
}

type VerifyAFDOArtifactsRequest struct {
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The type of AFDO artifact to test.
	ArtifactType         chromiumos.AFDOArtifactType `protobuf:"varint,2,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.AFDOArtifactType" json:"artifact_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_VerifyAFDOArtifactsRequest proto.InternalMessageInfo

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

func (m *VerifyAFDOArtifactsRequest) GetArtifactType() chromiumos.AFDOArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.AFDOArtifactType_NONE_TYPE
}

type VerifyAFDOArtifactsResponse struct {
	// Status of the service
	Status               bool     `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VerifyAFDOArtifactsResponse proto.InternalMessageInfo

func (m *VerifyAFDOArtifactsResponse) GetStatus() bool {
	if m != nil {
		return m.Status
	}
	return false
}

func init() {
	proto.RegisterEnum("chromite.api.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterEnum("chromite.api.PrepareForToolchainBuildResponse_BuildRelevance", PrepareForToolchainBuildResponse_BuildRelevance_name, PrepareForToolchainBuildResponse_BuildRelevance_value)
	proto.RegisterType((*ArtifactInfo)(nil), "chromite.api.ArtifactInfo")
	proto.RegisterType((*PrepareForToolchainBuildRequest)(nil), "chromite.api.PrepareForToolchainBuildRequest")
	proto.RegisterType((*PrepareForToolchainBuildResponse)(nil), "chromite.api.PrepareForToolchainBuildResponse")
	proto.RegisterType((*BundleToolchainRequest)(nil), "chromite.api.BundleToolchainRequest")
	proto.RegisterType((*BundleToolchainResponse)(nil), "chromite.api.BundleToolchainResponse")
	proto.RegisterType((*VerifyAFDOArtifactsRequest)(nil), "chromite.api.VerifyAFDOArtifactsRequest")
	proto.RegisterType((*VerifyAFDOArtifactsResponse)(nil), "chromite.api.VerifyAFDOArtifactsResponse")
}

func init() { proto.RegisterFile("chromite/api/toolchain.proto", fileDescriptor_7ff43bdb7436d394) }

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

// ToolchainServiceClient is the client API for ToolchainService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ToolchainServiceClient interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error)
}

type toolchainServiceClient struct {
	cc *grpc.ClientConn
}

func NewToolchainServiceClient(cc *grpc.ClientConn) ToolchainServiceClient {
	return &toolchainServiceClient{cc}
}

func (c *toolchainServiceClient) UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error) {
	out := new(PrepareForToolchainBuildResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/PrepareForBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error) {
	out := new(BundleToolchainResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/BundleArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ToolchainServiceServer is the server API for ToolchainService service.
type ToolchainServiceServer interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(context.Context, *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(context.Context, *BundleToolchainRequest) (*BundleToolchainResponse, error)
}

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

func (*UnimplementedToolchainServiceServer) UpdateEbuildWithAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UpdateEbuildWithAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) UploadVettedAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UploadVettedAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) PrepareForBuild(ctx context.Context, req *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareForBuild not implemented")
}
func (*UnimplementedToolchainServiceServer) BundleArtifacts(ctx context.Context, req *BundleToolchainRequest) (*BundleToolchainResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleArtifacts not implemented")
}

func RegisterToolchainServiceServer(s *grpc.Server, srv ToolchainServiceServer) {
	s.RegisterService(&_ToolchainService_serviceDesc, srv)
}

func _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_UploadVettedAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_PrepareForBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PrepareForToolchainBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).PrepareForBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/PrepareForBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).PrepareForBuild(ctx, req.(*PrepareForToolchainBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_BundleArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleToolchainRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).BundleArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/BundleArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).BundleArtifacts(ctx, req.(*BundleToolchainRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ToolchainService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ToolchainService",
	HandlerType: (*ToolchainServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "UpdateEbuildWithAFDOArtifacts",
			Handler:    _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler,
		},
		{
			MethodName: "UploadVettedAFDOArtifacts",
			Handler:    _ToolchainService_UploadVettedAFDOArtifacts_Handler,
		},
		{
			MethodName: "PrepareForBuild",
			Handler:    _ToolchainService_PrepareForBuild_Handler,
		},
		{
			MethodName: "BundleArtifacts",
			Handler:    _ToolchainService_BundleArtifacts_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/toolchain.proto",
}
