// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/depgraph.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)
)

// Message contains data about the portage dependency graph and the packages'
// dependency source paths.
type DepGraph struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// TODO(crbug/1081828): drop when no longer used.  Use sysroot instead.
	// The board whose dependency graph this is.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// List of packages in the dependency graph and their infos, which include
	// dependency packages and the source paths.
	PackageDeps []*PackageDepInfo `protobuf:"bytes,2,rep,name=package_deps,json=packageDeps,proto3" json:"package_deps,omitempty"`
	// The sysroot whose dependency graph is being created.  If no sysroot is
	// being used, may be unspecified.  Added in R85.
	Sysroot *Sysroot `protobuf:"bytes,3,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
}

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

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

func (*DepGraph) ProtoMessage() {}

func (x *DepGraph) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_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 DepGraph.ProtoReflect.Descriptor instead.
func (*DepGraph) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{0}
}

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

func (x *DepGraph) GetPackageDeps() []*PackageDepInfo {
	if x != nil {
		return x.PackageDeps
	}
	return nil
}

func (x *DepGraph) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

// Message describing a package and its dependencies.
type PackageDepInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The package itself.
	PackageInfo *chromiumos.PackageInfo `protobuf:"bytes,1,opt,name=package_info,json=packageInfo,proto3" json:"package_info,omitempty"`
	// List of packages this package depends on.
	DependencyPackages []*chromiumos.PackageInfo `protobuf:"bytes,2,rep,name=dependency_packages,json=dependencyPackages,proto3" json:"dependency_packages,omitempty"`
	// List of source paths the package depends on.
	DependencySourcePaths []*SourcePath `protobuf:"bytes,3,rep,name=dependency_source_paths,json=dependencySourcePaths,proto3" json:"dependency_source_paths,omitempty"`
}

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

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

func (*PackageDepInfo) ProtoMessage() {}

func (x *PackageDepInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_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 PackageDepInfo.ProtoReflect.Descriptor instead.
func (*PackageDepInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{1}
}

func (x *PackageDepInfo) GetPackageInfo() *chromiumos.PackageInfo {
	if x != nil {
		return x.PackageInfo
	}
	return nil
}

func (x *PackageDepInfo) GetDependencyPackages() []*chromiumos.PackageInfo {
	if x != nil {
		return x.DependencyPackages
	}
	return nil
}

func (x *PackageDepInfo) GetDependencySourcePaths() []*SourcePath {
	if x != nil {
		return x.DependencySourcePaths
	}
	return nil
}

// Message describes a source path.
type SourcePath struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
}

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

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

func (*SourcePath) ProtoMessage() {}

func (x *SourcePath) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_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 SourcePath.ProtoReflect.Descriptor instead.
func (*SourcePath) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{2}
}

func (x *SourcePath) GetPath() string {
	if x != nil {
		return x.Path
	}
	return ""
}

// Message for creating dependency graph json map.
// Example Json:
// {"build_target":{"name":"board"},"output_file":"/tmp/depgraph.json"}
type GetBuildDependencyGraphRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The sysroot whose dependency graph is being created.  If no sysroot is
	// being used, may be unspecified.  Added in R85.
	Sysroot *Sysroot `protobuf:"bytes,4,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// TODO(crbug/1081828): drop when all supported release branches are no longer
	// using this.
	// DEPRECATED: Use sysroot instead.
	// The board whose dependency graph is being created.  If both sysroot and
	// build_target are given, sysroot is used.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The chroot to use to execute the endpoint.  Added in R80.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// List of packages for which to create the dependency graph. If none are
	// specified the standard list of packages is used.  Added in R81.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
}

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

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

func (*GetBuildDependencyGraphRequest) ProtoMessage() {}

func (x *GetBuildDependencyGraphRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_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 GetBuildDependencyGraphRequest.ProtoReflect.Descriptor instead.
func (*GetBuildDependencyGraphRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{3}
}

func (x *GetBuildDependencyGraphRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

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

func (x *GetBuildDependencyGraphRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *GetBuildDependencyGraphRequest) GetPackages() []*chromiumos.PackageInfo {
	if x != nil {
		return x.Packages
	}
	return nil
}

// Response from creating dependency graph json map.
type GetBuildDependencyGraphResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	DepGraph *DepGraph `protobuf:"bytes,1,opt,name=dep_graph,json=depGraph,proto3" json:"dep_graph,omitempty"`
	// Added in R80.
	SdkDepGraph *DepGraph `protobuf:"bytes,2,opt,name=sdk_dep_graph,json=sdkDepGraph,proto3" json:"sdk_dep_graph,omitempty"`
}

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

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

func (*GetBuildDependencyGraphResponse) ProtoMessage() {}

func (x *GetBuildDependencyGraphResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_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 GetBuildDependencyGraphResponse.ProtoReflect.Descriptor instead.
func (*GetBuildDependencyGraphResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{4}
}

func (x *GetBuildDependencyGraphResponse) GetDepGraph() *DepGraph {
	if x != nil {
		return x.DepGraph
	}
	return nil
}

func (x *GetBuildDependencyGraphResponse) GetSdkDepGraph() *DepGraph {
	if x != nil {
		return x.SdkDepGraph
	}
	return nil
}

type GetToolchainPathsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
}

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

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

func (*GetToolchainPathsRequest) ProtoMessage() {}

func (x *GetToolchainPathsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_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 GetToolchainPathsRequest.ProtoReflect.Descriptor instead.
func (*GetToolchainPathsRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{5}
}

func (x *GetToolchainPathsRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

type GetToolchainPathsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// List of paths considered relevant to toolchain packages.
	Paths []*SourcePath `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"`
}

func (x *GetToolchainPathsResponse) Reset() {
	*x = GetToolchainPathsResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_depgraph_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*GetToolchainPathsResponse) ProtoMessage() {}

func (x *GetToolchainPathsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_proto_msgTypes[6]
	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 GetToolchainPathsResponse.ProtoReflect.Descriptor instead.
func (*GetToolchainPathsResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{6}
}

func (x *GetToolchainPathsResponse) GetPaths() []*SourcePath {
	if x != nil {
		return x.Paths
	}
	return nil
}

// Message for getting a list of a board's package dependencies.
type ListRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The sysroot for the board whose packages dependencies are being calculated.
	Sysroot *Sysroot `protobuf:"bytes,1,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// The chroot to use to execute the endpoint.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// List of paths to consider when retrieving the board's package dependencies.
	// If empty / None returns all package dependencies.
	SrcPaths []*SourcePath `protobuf:"bytes,3,rep,name=src_paths,json=srcPaths,proto3" json:"src_paths,omitempty"`
	// List of packages for which to get dependencies. If none are specified the
	// standard list of packages is used.
	Packages []*chromiumos.PackageInfo `protobuf:"bytes,4,rep,name=packages,proto3" json:"packages,omitempty"`
}

func (x *ListRequest) Reset() {
	*x = ListRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_depgraph_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*ListRequest) ProtoMessage() {}

func (x *ListRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_proto_msgTypes[7]
	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 ListRequest.ProtoReflect.Descriptor instead.
func (*ListRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{7}
}

func (x *ListRequest) GetSysroot() *Sysroot {
	if x != nil {
		return x.Sysroot
	}
	return nil
}

func (x *ListRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *ListRequest) GetSrcPaths() []*SourcePath {
	if x != nil {
		return x.SrcPaths
	}
	return nil
}

func (x *ListRequest) GetPackages() []*chromiumos.PackageInfo {
	if x != nil {
		return x.Packages
	}
	return nil
}

// Response for getting a list of package dependencies.
type ListResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	PackageDeps []*chromiumos.PackageInfo `protobuf:"bytes,1,rep,name=package_deps,json=packageDeps,proto3" json:"package_deps,omitempty"`
}

func (x *ListResponse) Reset() {
	*x = ListResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_depgraph_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*ListResponse) ProtoMessage() {}

func (x *ListResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_depgraph_proto_msgTypes[8]
	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 ListResponse.ProtoReflect.Descriptor instead.
func (*ListResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_depgraph_proto_rawDescGZIP(), []int{8}
}

func (x *ListResponse) GetPackageDeps() []*chromiumos.PackageInfo {
	if x != nil {
		return x.PackageDeps
	}
	return nil
}

var File_chromite_api_depgraph_proto protoreflect.FileDescriptor

var file_chromite_api_depgraph_proto_rawDesc = []byte{
	0x0a, 0x1b, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64,
	0x65, 0x70, 0x67, 0x72, 0x61, 0x70, 0x68, 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, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 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, 0xb8,
	0x01, 0x0a, 0x08, 0x44, 0x65, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 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, 0x3f, 0x0a, 0x0c, 0x70, 0x61, 0x63, 0x6b, 0x61,
	0x67, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x61, 0x63,
	0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x70, 0x61, 0x63,
	0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72,
	0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74,
	0x52, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0xe8, 0x01, 0x0a, 0x0e, 0x50, 0x61,
	0x63, 0x6b, 0x61, 0x67, 0x65, 0x44, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3a, 0x0a, 0x0c,
	0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x70, 0x61, 0x63,
	0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x48, 0x0a, 0x13, 0x64, 0x65, 0x70, 0x65,
	0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18,
	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x12,
	0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67,
	0x65, 0x73, 0x12, 0x50, 0x0a, 0x17, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79,
	0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x03, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x15, 0x64,
	0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50,
	0x61, 0x74, 0x68, 0x73, 0x22, 0x20, 0x0a, 0x0a, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61,
	0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x47, 0x72, 0x61,
	0x70, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73,
	0x72, 0x6f, 0x6f, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f,
	0x74, 0x52, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 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, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70,
	0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x42,
	0x75, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x47, 0x72,
	0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x09, 0x64,
	0x65, 0x70, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65,
	0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x08, 0x64, 0x65, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68,
	0x12, 0x3a, 0x0a, 0x0d, 0x73, 0x64, 0x6b, 0x5f, 0x64, 0x65, 0x70, 0x5f, 0x67, 0x72, 0x61, 0x70,
	0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52,
	0x0b, 0x73, 0x64, 0x6b, 0x44, 0x65, 0x70, 0x47, 0x72, 0x61, 0x70, 0x68, 0x22, 0x46, 0x0a, 0x18,
	0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68,
	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f,
	0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68,
	0x72, 0x6f, 0x6f, 0x74, 0x22, 0x4b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x63,
	0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x2e, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68,
	0x73, 0x22, 0xd6, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x53, 0x79, 0x73, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x07, 0x73, 0x79, 0x73, 0x72, 0x6f,
	0x6f, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x35,
	0x0a, 0x09, 0x73, 0x72, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
	0x0b, 0x32, 0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x08, 0x73, 0x72, 0x63,
	0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65,
	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f,
	0x52, 0x08, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x73, 0x22, 0x4a, 0x0a, 0x0c, 0x4c, 0x69,
	0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x70, 0x61,
	0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61,
	0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x70, 0x61, 0x63, 0x6b, 0x61,
	0x67, 0x65, 0x44, 0x65, 0x70, 0x73, 0x32, 0xc4, 0x02, 0x0a, 0x11, 0x44, 0x65, 0x70, 0x65, 0x6e,
	0x64, 0x65, 0x6e, 0x63, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x76, 0x0a, 0x17,
	0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e,
	0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x44,
	0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x44, 0x65, 0x70,
	0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x47, 0x72, 0x61, 0x70, 0x68, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x63,
	0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c,
	0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x1a, 0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6f, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x74,
	0x68, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x04, 0x4c, 0x69,
	0x73, 0x74, 0x12, 0x19, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73,
	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x12, 0xc2, 0xed, 0x1a, 0x0e, 0x0a,
	0x0a, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 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_depgraph_proto_rawDescOnce sync.Once
	file_chromite_api_depgraph_proto_rawDescData = file_chromite_api_depgraph_proto_rawDesc
)

func file_chromite_api_depgraph_proto_rawDescGZIP() []byte {
	file_chromite_api_depgraph_proto_rawDescOnce.Do(func() {
		file_chromite_api_depgraph_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_depgraph_proto_rawDescData)
	})
	return file_chromite_api_depgraph_proto_rawDescData
}

var file_chromite_api_depgraph_proto_msgTypes = make([]protoimpl.MessageInfo, 9)
var file_chromite_api_depgraph_proto_goTypes = []interface{}{
	(*DepGraph)(nil),                        // 0: chromite.api.DepGraph
	(*PackageDepInfo)(nil),                  // 1: chromite.api.PackageDepInfo
	(*SourcePath)(nil),                      // 2: chromite.api.SourcePath
	(*GetBuildDependencyGraphRequest)(nil),  // 3: chromite.api.GetBuildDependencyGraphRequest
	(*GetBuildDependencyGraphResponse)(nil), // 4: chromite.api.GetBuildDependencyGraphResponse
	(*GetToolchainPathsRequest)(nil),        // 5: chromite.api.GetToolchainPathsRequest
	(*GetToolchainPathsResponse)(nil),       // 6: chromite.api.GetToolchainPathsResponse
	(*ListRequest)(nil),                     // 7: chromite.api.ListRequest
	(*ListResponse)(nil),                    // 8: chromite.api.ListResponse
	(*chromiumos.BuildTarget)(nil),          // 9: chromiumos.BuildTarget
	(*Sysroot)(nil),                         // 10: chromite.api.Sysroot
	(*chromiumos.PackageInfo)(nil),          // 11: chromiumos.PackageInfo
	(*chromiumos.Chroot)(nil),               // 12: chromiumos.Chroot
}
var file_chromite_api_depgraph_proto_depIdxs = []int32{
	9,  // 0: chromite.api.DepGraph.build_target:type_name -> chromiumos.BuildTarget
	1,  // 1: chromite.api.DepGraph.package_deps:type_name -> chromite.api.PackageDepInfo
	10, // 2: chromite.api.DepGraph.sysroot:type_name -> chromite.api.Sysroot
	11, // 3: chromite.api.PackageDepInfo.package_info:type_name -> chromiumos.PackageInfo
	11, // 4: chromite.api.PackageDepInfo.dependency_packages:type_name -> chromiumos.PackageInfo
	2,  // 5: chromite.api.PackageDepInfo.dependency_source_paths:type_name -> chromite.api.SourcePath
	10, // 6: chromite.api.GetBuildDependencyGraphRequest.sysroot:type_name -> chromite.api.Sysroot
	9,  // 7: chromite.api.GetBuildDependencyGraphRequest.build_target:type_name -> chromiumos.BuildTarget
	12, // 8: chromite.api.GetBuildDependencyGraphRequest.chroot:type_name -> chromiumos.Chroot
	11, // 9: chromite.api.GetBuildDependencyGraphRequest.packages:type_name -> chromiumos.PackageInfo
	0,  // 10: chromite.api.GetBuildDependencyGraphResponse.dep_graph:type_name -> chromite.api.DepGraph
	0,  // 11: chromite.api.GetBuildDependencyGraphResponse.sdk_dep_graph:type_name -> chromite.api.DepGraph
	12, // 12: chromite.api.GetToolchainPathsRequest.chroot:type_name -> chromiumos.Chroot
	2,  // 13: chromite.api.GetToolchainPathsResponse.paths:type_name -> chromite.api.SourcePath
	10, // 14: chromite.api.ListRequest.sysroot:type_name -> chromite.api.Sysroot
	12, // 15: chromite.api.ListRequest.chroot:type_name -> chromiumos.Chroot
	2,  // 16: chromite.api.ListRequest.src_paths:type_name -> chromite.api.SourcePath
	11, // 17: chromite.api.ListRequest.packages:type_name -> chromiumos.PackageInfo
	11, // 18: chromite.api.ListResponse.package_deps:type_name -> chromiumos.PackageInfo
	3,  // 19: chromite.api.DependencyService.GetBuildDependencyGraph:input_type -> chromite.api.GetBuildDependencyGraphRequest
	5,  // 20: chromite.api.DependencyService.GetToolchainPaths:input_type -> chromite.api.GetToolchainPathsRequest
	7,  // 21: chromite.api.DependencyService.List:input_type -> chromite.api.ListRequest
	4,  // 22: chromite.api.DependencyService.GetBuildDependencyGraph:output_type -> chromite.api.GetBuildDependencyGraphResponse
	6,  // 23: chromite.api.DependencyService.GetToolchainPaths:output_type -> chromite.api.GetToolchainPathsResponse
	8,  // 24: chromite.api.DependencyService.List:output_type -> chromite.api.ListResponse
	22, // [22:25] is the sub-list for method output_type
	19, // [19:22] is the sub-list for method input_type
	19, // [19:19] is the sub-list for extension type_name
	19, // [19:19] is the sub-list for extension extendee
	0,  // [0:19] is the sub-list for field type_name
}

func init() { file_chromite_api_depgraph_proto_init() }
func file_chromite_api_depgraph_proto_init() {
	if File_chromite_api_depgraph_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	file_chromite_api_sysroot_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_depgraph_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DepGraph); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PackageDepInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SourcePath); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetBuildDependencyGraphRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetBuildDependencyGraphResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetToolchainPathsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GetToolchainPathsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_depgraph_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ListResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_depgraph_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   9,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_depgraph_proto_goTypes,
		DependencyIndexes: file_chromite_api_depgraph_proto_depIdxs,
		MessageInfos:      file_chromite_api_depgraph_proto_msgTypes,
	}.Build()
	File_chromite_api_depgraph_proto = out.File
	file_chromite_api_depgraph_proto_rawDesc = nil
	file_chromite_api_depgraph_proto_goTypes = nil
	file_chromite_api_depgraph_proto_depIdxs = nil
}
