// Copyright 2020 The LUCI Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.33.0
// 	protoc        v5.26.1
// source: go.chromium.org/luci/resultdb/sink/proto/v1/location_tag.proto

package sinkpb

import (
	v1 "go.chromium.org/luci/resultdb/proto/v1"
	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)
)

// Maps from directory paths to extra fields to attach to TestResults.
// When converted to JSON format, it will look like below:
//
//	{
//	 "repos": {
//	   "https://chromium.googlesource.com/chromium/src" : {
//	     "dirs": {
//	       ".": {
//	         "tags": {
//	           "teamEmail": "team_email@chromium.org"
//	         }
//	       },
//	       "foo": {
//	         "tags": {
//	           "teamEmail": "team_email@chromium.org",
//	           "os": "WINDOWS"
//	         },
//	         "bug_component": {
//	           "issue_tracker": {
//	             "component_id": "17171717"
//	           }
//	         }
//	       }
//	     }
//	     "files": {
//	       "./file.txt": {
//	         "tags": {
//	           "teamEmail": "other_email@chromium.org",
//	           "os": "WINDOWS"
//	         },
//	         "bug_component": {
//	           "issue_tracker": {
//	             "component_id": "123456"
//	           }
//	         }
//	       }
//	     }
//	   }
//	 }
//	}
//
// N.B. This message is called 'LocationTags' because it was previously
// only used for tags, but this is no longer true.
type LocationTags struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The key is a Gitiles URL as the identifier for a repo.
	// Format for Gitiles URL: https://<host>/<project>
	// For example "https://chromium.googlesource.com/chromium/src"
	// Must not end with ".git".
	Repos map[string]*LocationTags_Repo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

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

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

func (*LocationTags) ProtoMessage() {}

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

func (x *LocationTags) GetRepos() map[string]*LocationTags_Repo {
	if x != nil {
		return x.Repos
	}
	return nil
}

// Map from directory paths in a repo to extra tags to attach to TestResults.
type LocationTags_Repo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The key is a relative dir path.
	// "" means repo root and represents default for all subdirs.
	// Must use forward slash as a dir separator.
	Dirs map[string]*LocationTags_Dir `protobuf:"bytes,1,rep,name=dirs,proto3" json:"dirs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// The key is a relative path to a file.
	// Same rules apply as dir.
	Files map[string]*LocationTags_File `protobuf:"bytes,2,rep,name=files,proto3" json:"files,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
}

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

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

func (*LocationTags_Repo) ProtoMessage() {}

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

func (x *LocationTags_Repo) GetDirs() map[string]*LocationTags_Dir {
	if x != nil {
		return x.Dirs
	}
	return nil
}

func (x *LocationTags_Repo) GetFiles() map[string]*LocationTags_File {
	if x != nil {
		return x.Files
	}
	return nil
}

// Extra tags to attach to TestResults for a directory.
type LocationTags_Dir struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// If a key is not defined for subdir, but defined for an ancestor dir, then
	// the value(s) in the ancestor is implied.
	//
	// A key can be repeated.
	Tags []*v1.StringPair `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"`
	// The issue tracker component associated with the test, if any.
	// Bugs related to the test may be filed here.
	// Populated to test_metadata.bug_component.
	BugComponent *v1.BugComponent `protobuf:"bytes,2,opt,name=bug_component,json=bugComponent,proto3" json:"bug_component,omitempty"`
}

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

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

func (*LocationTags_Dir) ProtoMessage() {}

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

func (x *LocationTags_Dir) GetTags() []*v1.StringPair {
	if x != nil {
		return x.Tags
	}
	return nil
}

func (x *LocationTags_Dir) GetBugComponent() *v1.BugComponent {
	if x != nil {
		return x.BugComponent
	}
	return nil
}

// Extra tags to attach to TestResults for a file.
type LocationTags_File struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A key can be repeated.
	Tags []*v1.StringPair `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"`
	// The issue tracker component associated with the test, if any.
	// Bugs related to the test may be filed here.
	// Populated to test_metadata.bug_component.
	BugComponent *v1.BugComponent `protobuf:"bytes,2,opt,name=bug_component,json=bugComponent,proto3" json:"bug_component,omitempty"`
}

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

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

func (*LocationTags_File) ProtoMessage() {}

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

func (x *LocationTags_File) GetTags() []*v1.StringPair {
	if x != nil {
		return x.Tags
	}
	return nil
}

func (x *LocationTags_File) GetBugComponent() *v1.BugComponent {
	if x != nil {
		return x.BugComponent
	}
	return nil
}

var File_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto protoreflect.FileDescriptor

var file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDesc = []byte{
	0x0a, 0x3e, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x64, 0x62, 0x2f,
	0x73, 0x69, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x6f,
	0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x61, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x12, 0x12, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x69, 0x6e,
	0x6b, 0x2e, 0x76, 0x31, 0x1a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x64, 0x62, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d,
	0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3a, 0x67, 0x6f, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x64, 0x62, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76,
	0x31, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x06, 0x0a, 0x0c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18,
	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x45, 0x6e, 0x74,
	0x72, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x1a, 0xd3, 0x02, 0x0a, 0x04, 0x52, 0x65,
	0x70, 0x6f, 0x12, 0x43, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x2f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x69,
	0x6e, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61,
	0x67, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x2e, 0x44, 0x69, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72,
	0x79, 0x52, 0x04, 0x64, 0x69, 0x72, 0x73, 0x12, 0x46, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73,
	0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x2e, 0x46, 0x69,
	0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x1a,
	0x5d, 0x0a, 0x09, 0x44, 0x69, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a,
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
	0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x69, 0x6e, 0x6b, 0x2e,
	0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x2e,
	0x44, 0x69, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5f,
	0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b,
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e,
	0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x69, 0x6e, 0x6b, 0x2e,
	0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x2e,
	0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a,
	0x7c, 0x0a, 0x03, 0x44, 0x69, 0x72, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61,
	0x69, 0x72, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x62, 0x75, 0x67, 0x5f,
	0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x64, 0x62, 0x2e,
	0x76, 0x31, 0x2e, 0x42, 0x75, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52,
	0x0c, 0x62, 0x75, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0x7d, 0x0a,
	0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x64, 0x62, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x69,
	0x72, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0d, 0x62, 0x75, 0x67, 0x5f, 0x63,
	0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,
	0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x64, 0x62, 0x2e, 0x76,
	0x31, 0x2e, 0x42, 0x75, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x0c,
	0x62, 0x75, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x1a, 0x5f, 0x0a, 0x0a,
	0x52, 0x65, 0x70, 0x6f, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05,
	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6c, 0x75,
	0x63, 0x69, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x69, 0x6e, 0x6b, 0x2e, 0x76, 0x31,
	0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x61, 0x67, 0x73, 0x2e, 0x52, 0x65,
	0x70, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x34, 0x5a,
	0x32, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67,
	0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x64, 0x62, 0x2f, 0x73,
	0x69, 0x6e, 0x6b, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x3b, 0x73, 0x69, 0x6e,
	0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDescOnce sync.Once
	file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDescData = file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDesc
)

func file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDescGZIP() []byte {
	file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDescOnce.Do(func() {
		file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDescData)
	})
	return file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDescData
}

var file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_goTypes = []interface{}{
	(*LocationTags)(nil),      // 0: luci.resultsink.v1.LocationTags
	(*LocationTags_Repo)(nil), // 1: luci.resultsink.v1.LocationTags.Repo
	(*LocationTags_Dir)(nil),  // 2: luci.resultsink.v1.LocationTags.Dir
	(*LocationTags_File)(nil), // 3: luci.resultsink.v1.LocationTags.File
	nil,                       // 4: luci.resultsink.v1.LocationTags.ReposEntry
	nil,                       // 5: luci.resultsink.v1.LocationTags.Repo.DirsEntry
	nil,                       // 6: luci.resultsink.v1.LocationTags.Repo.FilesEntry
	(*v1.StringPair)(nil),     // 7: luci.resultdb.v1.StringPair
	(*v1.BugComponent)(nil),   // 8: luci.resultdb.v1.BugComponent
}
var file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_depIdxs = []int32{
	4,  // 0: luci.resultsink.v1.LocationTags.repos:type_name -> luci.resultsink.v1.LocationTags.ReposEntry
	5,  // 1: luci.resultsink.v1.LocationTags.Repo.dirs:type_name -> luci.resultsink.v1.LocationTags.Repo.DirsEntry
	6,  // 2: luci.resultsink.v1.LocationTags.Repo.files:type_name -> luci.resultsink.v1.LocationTags.Repo.FilesEntry
	7,  // 3: luci.resultsink.v1.LocationTags.Dir.tags:type_name -> luci.resultdb.v1.StringPair
	8,  // 4: luci.resultsink.v1.LocationTags.Dir.bug_component:type_name -> luci.resultdb.v1.BugComponent
	7,  // 5: luci.resultsink.v1.LocationTags.File.tags:type_name -> luci.resultdb.v1.StringPair
	8,  // 6: luci.resultsink.v1.LocationTags.File.bug_component:type_name -> luci.resultdb.v1.BugComponent
	1,  // 7: luci.resultsink.v1.LocationTags.ReposEntry.value:type_name -> luci.resultsink.v1.LocationTags.Repo
	2,  // 8: luci.resultsink.v1.LocationTags.Repo.DirsEntry.value:type_name -> luci.resultsink.v1.LocationTags.Dir
	3,  // 9: luci.resultsink.v1.LocationTags.Repo.FilesEntry.value:type_name -> luci.resultsink.v1.LocationTags.File
	10, // [10:10] is the sub-list for method output_type
	10, // [10:10] is the sub-list for method input_type
	10, // [10:10] is the sub-list for extension type_name
	10, // [10:10] is the sub-list for extension extendee
	0,  // [0:10] is the sub-list for field type_name
}

func init() { file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_init() }
func file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_init() {
	if File_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocationTags); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocationTags_Repo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocationTags_Dir); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*LocationTags_File); 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_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   7,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_goTypes,
		DependencyIndexes: file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_depIdxs,
		MessageInfos:      file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_msgTypes,
	}.Build()
	File_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto = out.File
	file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_rawDesc = nil
	file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_goTypes = nil
	file_go_chromium_org_luci_resultdb_sink_proto_v1_location_tag_proto_depIdxs = nil
}
