go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/analysis/proto/v1/clusters.pb.go (about)

     1  // Copyright 2022 The LUCI Authors.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  // Code generated by protoc-gen-go. DO NOT EDIT.
    16  // versions:
    17  // 	protoc-gen-go v1.32.0
    18  // 	protoc        v3.21.7
    19  // source: go.chromium.org/luci/analysis/proto/v1/clusters.proto
    20  
    21  package analysispb
    22  
    23  import prpc "go.chromium.org/luci/grpc/prpc"
    24  
    25  import (
    26  	context "context"
    27  	grpc "google.golang.org/grpc"
    28  	codes "google.golang.org/grpc/codes"
    29  	status "google.golang.org/grpc/status"
    30  	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
    31  	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
    32  	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
    33  	reflect "reflect"
    34  	sync "sync"
    35  )
    36  
    37  const (
    38  	// Verify that this generated code is sufficiently up-to-date.
    39  	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
    40  	// Verify that runtime/protoimpl is sufficiently up-to-date.
    41  	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
    42  )
    43  
    44  type ClusterSummaryView int32
    45  
    46  const (
    47  	// The default / unset value.
    48  	// The API will default to the BASIC view.
    49  	ClusterSummaryView_CLUSTER_SUMMARY_VIEW_UNSPECIFIED ClusterSummaryView = 0
    50  	// Include most fields in the cluster summary, EXCLUDING
    51  	// daily breakdowns of the cluster's impact metrics.
    52  	ClusterSummaryView_BASIC ClusterSummaryView = 1
    53  	// Include everything in the cluster summary.
    54  	ClusterSummaryView_FULL ClusterSummaryView = 2
    55  )
    56  
    57  // Enum value maps for ClusterSummaryView.
    58  var (
    59  	ClusterSummaryView_name = map[int32]string{
    60  		0: "CLUSTER_SUMMARY_VIEW_UNSPECIFIED",
    61  		1: "BASIC",
    62  		2: "FULL",
    63  	}
    64  	ClusterSummaryView_value = map[string]int32{
    65  		"CLUSTER_SUMMARY_VIEW_UNSPECIFIED": 0,
    66  		"BASIC":                            1,
    67  		"FULL":                             2,
    68  	}
    69  )
    70  
    71  func (x ClusterSummaryView) Enum() *ClusterSummaryView {
    72  	p := new(ClusterSummaryView)
    73  	*p = x
    74  	return p
    75  }
    76  
    77  func (x ClusterSummaryView) String() string {
    78  	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
    79  }
    80  
    81  func (ClusterSummaryView) Descriptor() protoreflect.EnumDescriptor {
    82  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes[0].Descriptor()
    83  }
    84  
    85  func (ClusterSummaryView) Type() protoreflect.EnumType {
    86  	return &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes[0]
    87  }
    88  
    89  func (x ClusterSummaryView) Number() protoreflect.EnumNumber {
    90  	return protoreflect.EnumNumber(x)
    91  }
    92  
    93  // Deprecated: Use ClusterSummaryView.Descriptor instead.
    94  func (ClusterSummaryView) EnumDescriptor() ([]byte, []int) {
    95  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{0}
    96  }
    97  
    98  type ClusterRequest struct {
    99  	state         protoimpl.MessageState
   100  	sizeCache     protoimpl.SizeCache
   101  	unknownFields protoimpl.UnknownFields
   102  
   103  	// The LUCI Project for which the test result should be clustered.
   104  	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
   105  	// The test results to cluster. At most 1000 test results may be
   106  	// clustered in one request.
   107  	TestResults []*ClusterRequest_TestResult `protobuf:"bytes,2,rep,name=test_results,json=testResults,proto3" json:"test_results,omitempty"`
   108  }
   109  
   110  func (x *ClusterRequest) Reset() {
   111  	*x = ClusterRequest{}
   112  	if protoimpl.UnsafeEnabled {
   113  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[0]
   114  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   115  		ms.StoreMessageInfo(mi)
   116  	}
   117  }
   118  
   119  func (x *ClusterRequest) String() string {
   120  	return protoimpl.X.MessageStringOf(x)
   121  }
   122  
   123  func (*ClusterRequest) ProtoMessage() {}
   124  
   125  func (x *ClusterRequest) ProtoReflect() protoreflect.Message {
   126  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[0]
   127  	if protoimpl.UnsafeEnabled && x != nil {
   128  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   129  		if ms.LoadMessageInfo() == nil {
   130  			ms.StoreMessageInfo(mi)
   131  		}
   132  		return ms
   133  	}
   134  	return mi.MessageOf(x)
   135  }
   136  
   137  // Deprecated: Use ClusterRequest.ProtoReflect.Descriptor instead.
   138  func (*ClusterRequest) Descriptor() ([]byte, []int) {
   139  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{0}
   140  }
   141  
   142  func (x *ClusterRequest) GetProject() string {
   143  	if x != nil {
   144  		return x.Project
   145  	}
   146  	return ""
   147  }
   148  
   149  func (x *ClusterRequest) GetTestResults() []*ClusterRequest_TestResult {
   150  	if x != nil {
   151  		return x.TestResults
   152  	}
   153  	return nil
   154  }
   155  
   156  type ClusterResponse struct {
   157  	state         protoimpl.MessageState
   158  	sizeCache     protoimpl.SizeCache
   159  	unknownFields protoimpl.UnknownFields
   160  
   161  	// The clusters each test result is in.
   162  	// Contains one result for each test result specified in the request.
   163  	// Results are provided in the same order as the request, so
   164  	// the i-th ClusteredTestResult corresponds to the i-th
   165  	// TestResult in the request.
   166  	ClusteredTestResults []*ClusterResponse_ClusteredTestResult `protobuf:"bytes,1,rep,name=clustered_test_results,json=clusteredTestResults,proto3" json:"clustered_test_results,omitempty"`
   167  	// The versions of clustering algorithms, rules and project configuration
   168  	// used to service this request. For debugging purposes only.
   169  	ClusteringVersion *ClusteringVersion `protobuf:"bytes,2,opt,name=clustering_version,json=clusteringVersion,proto3" json:"clustering_version,omitempty"`
   170  }
   171  
   172  func (x *ClusterResponse) Reset() {
   173  	*x = ClusterResponse{}
   174  	if protoimpl.UnsafeEnabled {
   175  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[1]
   176  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   177  		ms.StoreMessageInfo(mi)
   178  	}
   179  }
   180  
   181  func (x *ClusterResponse) String() string {
   182  	return protoimpl.X.MessageStringOf(x)
   183  }
   184  
   185  func (*ClusterResponse) ProtoMessage() {}
   186  
   187  func (x *ClusterResponse) ProtoReflect() protoreflect.Message {
   188  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[1]
   189  	if protoimpl.UnsafeEnabled && x != nil {
   190  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   191  		if ms.LoadMessageInfo() == nil {
   192  			ms.StoreMessageInfo(mi)
   193  		}
   194  		return ms
   195  	}
   196  	return mi.MessageOf(x)
   197  }
   198  
   199  // Deprecated: Use ClusterResponse.ProtoReflect.Descriptor instead.
   200  func (*ClusterResponse) Descriptor() ([]byte, []int) {
   201  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{1}
   202  }
   203  
   204  func (x *ClusterResponse) GetClusteredTestResults() []*ClusterResponse_ClusteredTestResult {
   205  	if x != nil {
   206  		return x.ClusteredTestResults
   207  	}
   208  	return nil
   209  }
   210  
   211  func (x *ClusterResponse) GetClusteringVersion() *ClusteringVersion {
   212  	if x != nil {
   213  		return x.ClusteringVersion
   214  	}
   215  	return nil
   216  }
   217  
   218  // The versions of algorithms, rules and configuration used by LUCI Analysis
   219  // to cluster test results. For a given test result and ClusteringVersion,
   220  // the set of returned clusters should always be the same.
   221  type ClusteringVersion struct {
   222  	state         protoimpl.MessageState
   223  	sizeCache     protoimpl.SizeCache
   224  	unknownFields protoimpl.UnknownFields
   225  
   226  	// The version of clustering algorithms used.
   227  	AlgorithmsVersion int32 `protobuf:"varint,1,opt,name=algorithms_version,json=algorithmsVersion,proto3" json:"algorithms_version,omitempty"`
   228  	// The version of failure association rules used. This is the Spanner
   229  	// commit timestamp of the last rule modification incorporated in the
   230  	// set of rules used to cluster the results.
   231  	RulesVersion *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=rules_version,json=rulesVersion,proto3" json:"rules_version,omitempty"`
   232  	// The version of project configuration used. This is the timestamp
   233  	// the project configuration was ingested by LUCI Analysis.
   234  	ConfigVersion *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=config_version,json=configVersion,proto3" json:"config_version,omitempty"`
   235  }
   236  
   237  func (x *ClusteringVersion) Reset() {
   238  	*x = ClusteringVersion{}
   239  	if protoimpl.UnsafeEnabled {
   240  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[2]
   241  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   242  		ms.StoreMessageInfo(mi)
   243  	}
   244  }
   245  
   246  func (x *ClusteringVersion) String() string {
   247  	return protoimpl.X.MessageStringOf(x)
   248  }
   249  
   250  func (*ClusteringVersion) ProtoMessage() {}
   251  
   252  func (x *ClusteringVersion) ProtoReflect() protoreflect.Message {
   253  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[2]
   254  	if protoimpl.UnsafeEnabled && x != nil {
   255  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   256  		if ms.LoadMessageInfo() == nil {
   257  			ms.StoreMessageInfo(mi)
   258  		}
   259  		return ms
   260  	}
   261  	return mi.MessageOf(x)
   262  }
   263  
   264  // Deprecated: Use ClusteringVersion.ProtoReflect.Descriptor instead.
   265  func (*ClusteringVersion) Descriptor() ([]byte, []int) {
   266  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{2}
   267  }
   268  
   269  func (x *ClusteringVersion) GetAlgorithmsVersion() int32 {
   270  	if x != nil {
   271  		return x.AlgorithmsVersion
   272  	}
   273  	return 0
   274  }
   275  
   276  func (x *ClusteringVersion) GetRulesVersion() *timestamppb.Timestamp {
   277  	if x != nil {
   278  		return x.RulesVersion
   279  	}
   280  	return nil
   281  }
   282  
   283  func (x *ClusteringVersion) GetConfigVersion() *timestamppb.Timestamp {
   284  	if x != nil {
   285  		return x.ConfigVersion
   286  	}
   287  	return nil
   288  }
   289  
   290  type GetClusterRequest struct {
   291  	state         protoimpl.MessageState
   292  	sizeCache     protoimpl.SizeCache
   293  	unknownFields protoimpl.UnknownFields
   294  
   295  	// The resource name of the cluster to retrieve.
   296  	// Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}.
   297  	// Designed to conform to aip.dev/131.
   298  	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
   299  }
   300  
   301  func (x *GetClusterRequest) Reset() {
   302  	*x = GetClusterRequest{}
   303  	if protoimpl.UnsafeEnabled {
   304  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[3]
   305  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   306  		ms.StoreMessageInfo(mi)
   307  	}
   308  }
   309  
   310  func (x *GetClusterRequest) String() string {
   311  	return protoimpl.X.MessageStringOf(x)
   312  }
   313  
   314  func (*GetClusterRequest) ProtoMessage() {}
   315  
   316  func (x *GetClusterRequest) ProtoReflect() protoreflect.Message {
   317  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[3]
   318  	if protoimpl.UnsafeEnabled && x != nil {
   319  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   320  		if ms.LoadMessageInfo() == nil {
   321  			ms.StoreMessageInfo(mi)
   322  		}
   323  		return ms
   324  	}
   325  	return mi.MessageOf(x)
   326  }
   327  
   328  // Deprecated: Use GetClusterRequest.ProtoReflect.Descriptor instead.
   329  func (*GetClusterRequest) Descriptor() ([]byte, []int) {
   330  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{3}
   331  }
   332  
   333  func (x *GetClusterRequest) GetName() string {
   334  	if x != nil {
   335  		return x.Name
   336  	}
   337  	return ""
   338  }
   339  
   340  type Cluster struct {
   341  	state         protoimpl.MessageState
   342  	sizeCache     protoimpl.SizeCache
   343  	unknownFields protoimpl.UnknownFields
   344  
   345  	// The resource name of the cluster.
   346  	// Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}.
   347  	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
   348  	// Whether there is a recent example in the cluster.
   349  	HasExample bool `protobuf:"varint,2,opt,name=has_example,json=hasExample,proto3" json:"has_example,omitempty"`
   350  	// A human-readable name for the cluster.
   351  	// Only populated for suggested clusters where has_example = true.
   352  	// Not populated for rule-based clusters.
   353  	Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"`
   354  	// The values of metrics associated with the cluster. The map key is the ID
   355  	// of the metric (e.g. "human-cls-failed-presubmit").
   356  	//
   357  	// The following metrics are currently defined:
   358  	//   - "human-cls-failed-presubmit":
   359  	//     The number of distinct developer changelists that failed at least one
   360  	//     presubmit (CQ) run because of failure(s) in this cluster. Excludes
   361  	//     changelists authored by automation.
   362  	//   - "critical-failures-exonerated":
   363  	//     The number of failures on test variants which were configured to be
   364  	//     presubmit-blocking, which were exonerated (i.e. did not actually block
   365  	//     presubmit) because infrastructure determined the test variant to be
   366  	//     failing or too flaky at tip-of-tree. If this number is non-zero, it
   367  	//     means a test variant which was configured to be presubmit-blocking is
   368  	//     not stable enough to do so, and should be fixed or made non-blocking.
   369  	//   - "failures":
   370  	//     The total number of test results in this cluster. LUCI Analysis only
   371  	//     clusters test results which are unexpected and have a status of crash,
   372  	//     abort or fail, so by definition the only test results counted here
   373  	//     will be an unexpected fail/crash/abort.
   374  	Metrics map[string]*Cluster_TimewiseCounts `protobuf:"bytes,10,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
   375  	// The failure association rule equivalent to the cluster. Populated only
   376  	// for suggested clusters where has_example = true.
   377  	// Not populated for rule-based clusters. If you need the failure
   378  	// association rule for a rule-based cluster, use
   379  	// luci.analysis.v1.Rules/Get to retrieve the rule with ID matching the
   380  	// cluster ID.
   381  	// Used to facilitate creating a new rule based on a suggested cluster.
   382  	EquivalentFailureAssociationRule string `protobuf:"bytes,7,opt,name=equivalent_failure_association_rule,json=equivalentFailureAssociationRule,proto3" json:"equivalent_failure_association_rule,omitempty"`
   383  }
   384  
   385  func (x *Cluster) Reset() {
   386  	*x = Cluster{}
   387  	if protoimpl.UnsafeEnabled {
   388  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[4]
   389  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   390  		ms.StoreMessageInfo(mi)
   391  	}
   392  }
   393  
   394  func (x *Cluster) String() string {
   395  	return protoimpl.X.MessageStringOf(x)
   396  }
   397  
   398  func (*Cluster) ProtoMessage() {}
   399  
   400  func (x *Cluster) ProtoReflect() protoreflect.Message {
   401  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[4]
   402  	if protoimpl.UnsafeEnabled && x != nil {
   403  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   404  		if ms.LoadMessageInfo() == nil {
   405  			ms.StoreMessageInfo(mi)
   406  		}
   407  		return ms
   408  	}
   409  	return mi.MessageOf(x)
   410  }
   411  
   412  // Deprecated: Use Cluster.ProtoReflect.Descriptor instead.
   413  func (*Cluster) Descriptor() ([]byte, []int) {
   414  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{4}
   415  }
   416  
   417  func (x *Cluster) GetName() string {
   418  	if x != nil {
   419  		return x.Name
   420  	}
   421  	return ""
   422  }
   423  
   424  func (x *Cluster) GetHasExample() bool {
   425  	if x != nil {
   426  		return x.HasExample
   427  	}
   428  	return false
   429  }
   430  
   431  func (x *Cluster) GetTitle() string {
   432  	if x != nil {
   433  		return x.Title
   434  	}
   435  	return ""
   436  }
   437  
   438  func (x *Cluster) GetMetrics() map[string]*Cluster_TimewiseCounts {
   439  	if x != nil {
   440  		return x.Metrics
   441  	}
   442  	return nil
   443  }
   444  
   445  func (x *Cluster) GetEquivalentFailureAssociationRule() string {
   446  	if x != nil {
   447  		return x.EquivalentFailureAssociationRule
   448  	}
   449  	return ""
   450  }
   451  
   452  // Designed to conform with aip.dev/131.
   453  type GetReclusteringProgressRequest struct {
   454  	state         protoimpl.MessageState
   455  	sizeCache     protoimpl.SizeCache
   456  	unknownFields protoimpl.UnknownFields
   457  
   458  	// The name of the reclustering progress resource to retrieve.
   459  	// Format: projects/{project}/reclusteringProgress.
   460  	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
   461  }
   462  
   463  func (x *GetReclusteringProgressRequest) Reset() {
   464  	*x = GetReclusteringProgressRequest{}
   465  	if protoimpl.UnsafeEnabled {
   466  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[5]
   467  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   468  		ms.StoreMessageInfo(mi)
   469  	}
   470  }
   471  
   472  func (x *GetReclusteringProgressRequest) String() string {
   473  	return protoimpl.X.MessageStringOf(x)
   474  }
   475  
   476  func (*GetReclusteringProgressRequest) ProtoMessage() {}
   477  
   478  func (x *GetReclusteringProgressRequest) ProtoReflect() protoreflect.Message {
   479  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[5]
   480  	if protoimpl.UnsafeEnabled && x != nil {
   481  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   482  		if ms.LoadMessageInfo() == nil {
   483  			ms.StoreMessageInfo(mi)
   484  		}
   485  		return ms
   486  	}
   487  	return mi.MessageOf(x)
   488  }
   489  
   490  // Deprecated: Use GetReclusteringProgressRequest.ProtoReflect.Descriptor instead.
   491  func (*GetReclusteringProgressRequest) Descriptor() ([]byte, []int) {
   492  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{5}
   493  }
   494  
   495  func (x *GetReclusteringProgressRequest) GetName() string {
   496  	if x != nil {
   497  		return x.Name
   498  	}
   499  	return ""
   500  }
   501  
   502  // ReclusteringProgress captures the progress re-clustering a
   503  // given LUCI project's test results using specific rules
   504  // versions or algorithms versions.
   505  type ReclusteringProgress struct {
   506  	state         protoimpl.MessageState
   507  	sizeCache     protoimpl.SizeCache
   508  	unknownFields protoimpl.UnknownFields
   509  
   510  	// The name of the reclustering progress resource.
   511  	// Format: projects/{project}/reclusteringProgress.
   512  	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
   513  	// ProgressPerMille is the progress of the current re-clustering run,
   514  	// measured in thousandths (per mille). As such, this value ranges
   515  	// from 0 (0% complete) to 1000 (100% complete).
   516  	ProgressPerMille int32 `protobuf:"varint,2,opt,name=progress_per_mille,json=progressPerMille,proto3" json:"progress_per_mille,omitempty"`
   517  	// The goal of the last completed re-clustering run.
   518  	Last *ClusteringVersion `protobuf:"bytes,5,opt,name=last,proto3" json:"last,omitempty"`
   519  	// The goal of the current re-clustering run. (For which
   520  	// ProgressPerMille is specified.) This may be the same as the
   521  	// last completed re-clustering run the available algorithm versions,
   522  	// rules and configuration is unchanged.
   523  	Next *ClusteringVersion `protobuf:"bytes,6,opt,name=next,proto3" json:"next,omitempty"`
   524  }
   525  
   526  func (x *ReclusteringProgress) Reset() {
   527  	*x = ReclusteringProgress{}
   528  	if protoimpl.UnsafeEnabled {
   529  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[6]
   530  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   531  		ms.StoreMessageInfo(mi)
   532  	}
   533  }
   534  
   535  func (x *ReclusteringProgress) String() string {
   536  	return protoimpl.X.MessageStringOf(x)
   537  }
   538  
   539  func (*ReclusteringProgress) ProtoMessage() {}
   540  
   541  func (x *ReclusteringProgress) ProtoReflect() protoreflect.Message {
   542  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[6]
   543  	if protoimpl.UnsafeEnabled && x != nil {
   544  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   545  		if ms.LoadMessageInfo() == nil {
   546  			ms.StoreMessageInfo(mi)
   547  		}
   548  		return ms
   549  	}
   550  	return mi.MessageOf(x)
   551  }
   552  
   553  // Deprecated: Use ReclusteringProgress.ProtoReflect.Descriptor instead.
   554  func (*ReclusteringProgress) Descriptor() ([]byte, []int) {
   555  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{6}
   556  }
   557  
   558  func (x *ReclusteringProgress) GetName() string {
   559  	if x != nil {
   560  		return x.Name
   561  	}
   562  	return ""
   563  }
   564  
   565  func (x *ReclusteringProgress) GetProgressPerMille() int32 {
   566  	if x != nil {
   567  		return x.ProgressPerMille
   568  	}
   569  	return 0
   570  }
   571  
   572  func (x *ReclusteringProgress) GetLast() *ClusteringVersion {
   573  	if x != nil {
   574  		return x.Last
   575  	}
   576  	return nil
   577  }
   578  
   579  func (x *ReclusteringProgress) GetNext() *ClusteringVersion {
   580  	if x != nil {
   581  		return x.Next
   582  	}
   583  	return nil
   584  }
   585  
   586  type QueryClusterSummariesRequest struct {
   587  	state         protoimpl.MessageState
   588  	sizeCache     protoimpl.SizeCache
   589  	unknownFields protoimpl.UnknownFields
   590  
   591  	// The LUCI Project.
   592  	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
   593  	// An AIP-160 style filter to select test failures in the project
   594  	// to cluster and calculate metrics for.
   595  	//
   596  	// Filtering supports a subset of [AIP-160 filtering](https://google.aip.dev/160).
   597  	//
   598  	// All values are case-sensitive.
   599  	//
   600  	// A bare value is searched for in the columns test_id and
   601  	// failure_reason. E.g. ninja or "test failed".
   602  	//
   603  	// You can use AND, OR and NOT (case sensitive) logical operators, along
   604  	// with grouping. '-' is equivalent to NOT. Multiple bare values are
   605  	// considered to be AND separated.  E.g. These are equivalent:
   606  	// hello world
   607  	// and:
   608  	// hello AND world
   609  	//
   610  	// More examples:
   611  	// a OR b
   612  	// a AND NOT(b or -c)
   613  	//
   614  	// You can filter particular columns with '=', '!=' and ':' (has) operators.
   615  	// The right hand side of the operator must be a simple value. E.g:
   616  	// test_id:telemetry
   617  	// -failure_reason:Timeout
   618  	// ingested_invocation_id="build-8822963500388678513"
   619  	//
   620  	// Supported columns to search on:
   621  	// - test_id
   622  	// - failure_reason
   623  	// - realm
   624  	// - ingested_invocation_id
   625  	// - cluster_algorithm
   626  	// - cluster_id
   627  	// - variant_hash
   628  	// - test_run_id
   629  	// - tags
   630  	//
   631  	// Note that cost is greatly reduced (more than 90%) if exact matches for the
   632  	// cluster_algorithm and cluster_id field are both provided in the filter string.
   633  	FailureFilter string `protobuf:"bytes,2,opt,name=failure_filter,json=failureFilter,proto3" json:"failure_filter,omitempty"`
   634  	// A comma-separated list of fields to order the response by.
   635  	//
   636  	// The default sorting order is ascending; to specify descending order
   637  	// for a field append a " desc" suffix. The dot syntax can be used
   638  	// to navigate fields and map keys, and the backtick character (“) used
   639  	// to escape field names that do not match `[a-zA-Z_][a-zA-Z0-9_]`.
   640  	//
   641  	// The only sortable columns that are supported currently are metric
   642  	// fields.
   643  	//
   644  	// For example, to sort by human CLs failed presubmit descending, use:
   645  	// "metrics.`human-cls-failed-presubmit`.value desc".
   646  	// To sort by human CLs failed presubmit followed by failures, use:
   647  	// "metrics.`human-cls-failed-presubmit`.value desc, metrics.`failures`.value desc"
   648  	//
   649  	// For more details, see aip.dev/132 for ordering syntax, and
   650  	// aip.dev/161#map-fields for navigating map fields.
   651  	OrderBy string `protobuf:"bytes,3,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"`
   652  	// The resource name(s) of the metrics to include in the cluster summaries.
   653  	// Format: projects/{project}/metrics/{metric_id}.
   654  	// See the metrics field on the luci.analysis.v1.Cluster message for details
   655  	// about valid metric identifiers.
   656  	Metrics []string `protobuf:"bytes,4,rep,name=metrics,proto3" json:"metrics,omitempty"`
   657  	// The time range over which to get the cluster summaries.
   658  	// Note: the response will include only data for the portion of the
   659  	// time range that is within the data retention period of 90 days.
   660  	TimeRange *TimeRange `protobuf:"bytes,5,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
   661  	// The level of detail that the returned cluster summaries should have. See
   662  	// luci.analysis.v1.ClusterSummaryView.
   663  	View ClusterSummaryView `protobuf:"varint,6,opt,name=view,proto3,enum=luci.analysis.v1.ClusterSummaryView" json:"view,omitempty"`
   664  }
   665  
   666  func (x *QueryClusterSummariesRequest) Reset() {
   667  	*x = QueryClusterSummariesRequest{}
   668  	if protoimpl.UnsafeEnabled {
   669  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[7]
   670  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   671  		ms.StoreMessageInfo(mi)
   672  	}
   673  }
   674  
   675  func (x *QueryClusterSummariesRequest) String() string {
   676  	return protoimpl.X.MessageStringOf(x)
   677  }
   678  
   679  func (*QueryClusterSummariesRequest) ProtoMessage() {}
   680  
   681  func (x *QueryClusterSummariesRequest) ProtoReflect() protoreflect.Message {
   682  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[7]
   683  	if protoimpl.UnsafeEnabled && x != nil {
   684  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   685  		if ms.LoadMessageInfo() == nil {
   686  			ms.StoreMessageInfo(mi)
   687  		}
   688  		return ms
   689  	}
   690  	return mi.MessageOf(x)
   691  }
   692  
   693  // Deprecated: Use QueryClusterSummariesRequest.ProtoReflect.Descriptor instead.
   694  func (*QueryClusterSummariesRequest) Descriptor() ([]byte, []int) {
   695  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{7}
   696  }
   697  
   698  func (x *QueryClusterSummariesRequest) GetProject() string {
   699  	if x != nil {
   700  		return x.Project
   701  	}
   702  	return ""
   703  }
   704  
   705  func (x *QueryClusterSummariesRequest) GetFailureFilter() string {
   706  	if x != nil {
   707  		return x.FailureFilter
   708  	}
   709  	return ""
   710  }
   711  
   712  func (x *QueryClusterSummariesRequest) GetOrderBy() string {
   713  	if x != nil {
   714  		return x.OrderBy
   715  	}
   716  	return ""
   717  }
   718  
   719  func (x *QueryClusterSummariesRequest) GetMetrics() []string {
   720  	if x != nil {
   721  		return x.Metrics
   722  	}
   723  	return nil
   724  }
   725  
   726  func (x *QueryClusterSummariesRequest) GetTimeRange() *TimeRange {
   727  	if x != nil {
   728  		return x.TimeRange
   729  	}
   730  	return nil
   731  }
   732  
   733  func (x *QueryClusterSummariesRequest) GetView() ClusterSummaryView {
   734  	if x != nil {
   735  		return x.View
   736  	}
   737  	return ClusterSummaryView_CLUSTER_SUMMARY_VIEW_UNSPECIFIED
   738  }
   739  
   740  type QueryClusterSummariesResponse struct {
   741  	state         protoimpl.MessageState
   742  	sizeCache     protoimpl.SizeCache
   743  	unknownFields protoimpl.UnknownFields
   744  
   745  	// The clusters and impact metrics from the filtered failures.
   746  	ClusterSummaries []*ClusterSummary `protobuf:"bytes,1,rep,name=cluster_summaries,json=clusterSummaries,proto3" json:"cluster_summaries,omitempty"`
   747  }
   748  
   749  func (x *QueryClusterSummariesResponse) Reset() {
   750  	*x = QueryClusterSummariesResponse{}
   751  	if protoimpl.UnsafeEnabled {
   752  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[8]
   753  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   754  		ms.StoreMessageInfo(mi)
   755  	}
   756  }
   757  
   758  func (x *QueryClusterSummariesResponse) String() string {
   759  	return protoimpl.X.MessageStringOf(x)
   760  }
   761  
   762  func (*QueryClusterSummariesResponse) ProtoMessage() {}
   763  
   764  func (x *QueryClusterSummariesResponse) ProtoReflect() protoreflect.Message {
   765  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[8]
   766  	if protoimpl.UnsafeEnabled && x != nil {
   767  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   768  		if ms.LoadMessageInfo() == nil {
   769  			ms.StoreMessageInfo(mi)
   770  		}
   771  		return ms
   772  	}
   773  	return mi.MessageOf(x)
   774  }
   775  
   776  // Deprecated: Use QueryClusterSummariesResponse.ProtoReflect.Descriptor instead.
   777  func (*QueryClusterSummariesResponse) Descriptor() ([]byte, []int) {
   778  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{8}
   779  }
   780  
   781  func (x *QueryClusterSummariesResponse) GetClusterSummaries() []*ClusterSummary {
   782  	if x != nil {
   783  		return x.ClusterSummaries
   784  	}
   785  	return nil
   786  }
   787  
   788  type ClusterSummary struct {
   789  	state         protoimpl.MessageState
   790  	sizeCache     protoimpl.SizeCache
   791  	unknownFields protoimpl.UnknownFields
   792  
   793  	// The cluster ID of this cluster.
   794  	ClusterId *ClusterId `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"`
   795  	// Title is a one-line description of the cluster.
   796  	Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
   797  	// The bug associated with the cluster. This will only be present for
   798  	// rules algorithm clusters.
   799  	Bug *AssociatedBug `protobuf:"bytes,3,opt,name=bug,proto3" json:"bug,omitempty"`
   800  	// The values of cluster metrics. The key of the map is the identifier
   801  	// of the metric (e.g. "human-cls-failed-presubmit").
   802  	// See the metrics field on the luci.analysis.v1.Cluster message for details
   803  	// about valid metric identifiers.
   804  	Metrics map[string]*ClusterSummary_MetricValue `protobuf:"bytes,7,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
   805  }
   806  
   807  func (x *ClusterSummary) Reset() {
   808  	*x = ClusterSummary{}
   809  	if protoimpl.UnsafeEnabled {
   810  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[9]
   811  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   812  		ms.StoreMessageInfo(mi)
   813  	}
   814  }
   815  
   816  func (x *ClusterSummary) String() string {
   817  	return protoimpl.X.MessageStringOf(x)
   818  }
   819  
   820  func (*ClusterSummary) ProtoMessage() {}
   821  
   822  func (x *ClusterSummary) ProtoReflect() protoreflect.Message {
   823  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[9]
   824  	if protoimpl.UnsafeEnabled && x != nil {
   825  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   826  		if ms.LoadMessageInfo() == nil {
   827  			ms.StoreMessageInfo(mi)
   828  		}
   829  		return ms
   830  	}
   831  	return mi.MessageOf(x)
   832  }
   833  
   834  // Deprecated: Use ClusterSummary.ProtoReflect.Descriptor instead.
   835  func (*ClusterSummary) Descriptor() ([]byte, []int) {
   836  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{9}
   837  }
   838  
   839  func (x *ClusterSummary) GetClusterId() *ClusterId {
   840  	if x != nil {
   841  		return x.ClusterId
   842  	}
   843  	return nil
   844  }
   845  
   846  func (x *ClusterSummary) GetTitle() string {
   847  	if x != nil {
   848  		return x.Title
   849  	}
   850  	return ""
   851  }
   852  
   853  func (x *ClusterSummary) GetBug() *AssociatedBug {
   854  	if x != nil {
   855  		return x.Bug
   856  	}
   857  	return nil
   858  }
   859  
   860  func (x *ClusterSummary) GetMetrics() map[string]*ClusterSummary_MetricValue {
   861  	if x != nil {
   862  		return x.Metrics
   863  	}
   864  	return nil
   865  }
   866  
   867  type QueryClusterFailuresRequest struct {
   868  	state         protoimpl.MessageState
   869  	sizeCache     protoimpl.SizeCache
   870  	unknownFields protoimpl.UnknownFields
   871  
   872  	// The resource name of the cluster failures to retrieve.
   873  	// Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}/failures.
   874  	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
   875  	// Optional. The resource name of the metric for which failures should
   876  	// be displayed.
   877  	// Format: projects/{project}/metrics/{metric_id}.
   878  	//
   879  	// If no metrics is specified here, then no filtering is performed
   880  	// and all failures are eligible to be returned. Over time, we may wish
   881  	// to migrate this to an AIP-160 filter clause, e.g. "in_metric(`metric-id`)"
   882  	// where in_metric is a function.
   883  	MetricFilter string `protobuf:"bytes,2,opt,name=metric_filter,json=metricFilter,proto3" json:"metric_filter,omitempty"`
   884  }
   885  
   886  func (x *QueryClusterFailuresRequest) Reset() {
   887  	*x = QueryClusterFailuresRequest{}
   888  	if protoimpl.UnsafeEnabled {
   889  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[10]
   890  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   891  		ms.StoreMessageInfo(mi)
   892  	}
   893  }
   894  
   895  func (x *QueryClusterFailuresRequest) String() string {
   896  	return protoimpl.X.MessageStringOf(x)
   897  }
   898  
   899  func (*QueryClusterFailuresRequest) ProtoMessage() {}
   900  
   901  func (x *QueryClusterFailuresRequest) ProtoReflect() protoreflect.Message {
   902  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[10]
   903  	if protoimpl.UnsafeEnabled && x != nil {
   904  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   905  		if ms.LoadMessageInfo() == nil {
   906  			ms.StoreMessageInfo(mi)
   907  		}
   908  		return ms
   909  	}
   910  	return mi.MessageOf(x)
   911  }
   912  
   913  // Deprecated: Use QueryClusterFailuresRequest.ProtoReflect.Descriptor instead.
   914  func (*QueryClusterFailuresRequest) Descriptor() ([]byte, []int) {
   915  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{10}
   916  }
   917  
   918  func (x *QueryClusterFailuresRequest) GetParent() string {
   919  	if x != nil {
   920  		return x.Parent
   921  	}
   922  	return ""
   923  }
   924  
   925  func (x *QueryClusterFailuresRequest) GetMetricFilter() string {
   926  	if x != nil {
   927  		return x.MetricFilter
   928  	}
   929  	return ""
   930  }
   931  
   932  type QueryClusterFailuresResponse struct {
   933  	state         protoimpl.MessageState
   934  	sizeCache     protoimpl.SizeCache
   935  	unknownFields protoimpl.UnknownFields
   936  
   937  	// Example failures in the cluster.
   938  	// Limited to the most recent 2000 examples.
   939  	Failures []*DistinctClusterFailure `protobuf:"bytes,1,rep,name=failures,proto3" json:"failures,omitempty"`
   940  }
   941  
   942  func (x *QueryClusterFailuresResponse) Reset() {
   943  	*x = QueryClusterFailuresResponse{}
   944  	if protoimpl.UnsafeEnabled {
   945  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[11]
   946  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   947  		ms.StoreMessageInfo(mi)
   948  	}
   949  }
   950  
   951  func (x *QueryClusterFailuresResponse) String() string {
   952  	return protoimpl.X.MessageStringOf(x)
   953  }
   954  
   955  func (*QueryClusterFailuresResponse) ProtoMessage() {}
   956  
   957  func (x *QueryClusterFailuresResponse) ProtoReflect() protoreflect.Message {
   958  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[11]
   959  	if protoimpl.UnsafeEnabled && x != nil {
   960  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
   961  		if ms.LoadMessageInfo() == nil {
   962  			ms.StoreMessageInfo(mi)
   963  		}
   964  		return ms
   965  	}
   966  	return mi.MessageOf(x)
   967  }
   968  
   969  // Deprecated: Use QueryClusterFailuresResponse.ProtoReflect.Descriptor instead.
   970  func (*QueryClusterFailuresResponse) Descriptor() ([]byte, []int) {
   971  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{11}
   972  }
   973  
   974  func (x *QueryClusterFailuresResponse) GetFailures() []*DistinctClusterFailure {
   975  	if x != nil {
   976  		return x.Failures
   977  	}
   978  	return nil
   979  }
   980  
   981  // DistinctClusterFailure represents a number of failures which have identical
   982  // properties. This provides slightly compressed transfer of examples.
   983  type DistinctClusterFailure struct {
   984  	state         protoimpl.MessageState
   985  	sizeCache     protoimpl.SizeCache
   986  	unknownFields protoimpl.UnknownFields
   987  
   988  	// The identity of the test.
   989  	TestId string `protobuf:"bytes,1,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"`
   990  	// Description of one specific way of running the test,
   991  	// e.g. a specific bucket, builder and a test suite.
   992  	Variant *Variant `protobuf:"bytes,2,opt,name=variant,proto3" json:"variant,omitempty"`
   993  	// Timestamp representing the start of the data retention period for the
   994  	// test results in this group.
   995  	// The partition time is usually the presubmit run start time (if any) or
   996  	// build start time.
   997  	PartitionTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=partition_time,json=partitionTime,proto3" json:"partition_time,omitempty"`
   998  	// Details if the presubmit run associated with these results (if any).
   999  	PresubmitRun *DistinctClusterFailure_PresubmitRun `protobuf:"bytes,4,opt,name=presubmit_run,json=presubmitRun,proto3" json:"presubmit_run,omitempty"`
  1000  	// Whether the build was critical to a presubmit run succeeding.
  1001  	// If the build was not part of a presubmit run, this field should
  1002  	// be ignored.
  1003  	IsBuildCritical bool `protobuf:"varint,5,opt,name=is_build_critical,json=isBuildCritical,proto3" json:"is_build_critical,omitempty"`
  1004  	// The exonerations applied to the test variant verdict.
  1005  	Exonerations []*DistinctClusterFailure_Exoneration `protobuf:"bytes,6,rep,name=exonerations,proto3" json:"exonerations,omitempty"`
  1006  	// The status of the build that contained this test result. Can be used
  1007  	// to filter incomplete results (e.g. where build was cancelled or had
  1008  	// an infra failure). Can also be used to filter builds with incomplete
  1009  	// exonerations (e.g. build succeeded but some tests not exonerated).
  1010  	// This is the build corresponding to ingested_invocation_id.
  1011  	BuildStatus BuildStatus `protobuf:"varint,7,opt,name=build_status,json=buildStatus,proto3,enum=luci.analysis.v1.BuildStatus" json:"build_status,omitempty"`
  1012  	// The invocation from which this test result was ingested. This is
  1013  	// the top-level invocation that was ingested, an "invocation" being
  1014  	// a container of test results as identified by the source test result
  1015  	// system.
  1016  	//
  1017  	// For ResultDB, LUCI Analysis ingests invocations corresponding to
  1018  	// buildbucket builds.
  1019  	IngestedInvocationId string `protobuf:"bytes,8,opt,name=ingested_invocation_id,json=ingestedInvocationId,proto3" json:"ingested_invocation_id,omitempty"`
  1020  	// Is the ingested invocation blocked by this test variant? This is
  1021  	// only true if all (non-skipped) test results for this test variant
  1022  	// (in the ingested invocation) are unexpected failures.
  1023  	//
  1024  	// Exoneration does not factor into this value; check exonerations
  1025  	// to see if the impact of this ingested invocation being blocked was
  1026  	// mitigated by exoneration.
  1027  	IsIngestedInvocationBlocked bool `protobuf:"varint,9,opt,name=is_ingested_invocation_blocked,json=isIngestedInvocationBlocked,proto3" json:"is_ingested_invocation_blocked,omitempty"`
  1028  	// The unsubmitted changelists that were tested (if any).
  1029  	// Up to 10 changelists are captured.
  1030  	Changelists []*Changelist `protobuf:"bytes,10,rep,name=changelists,proto3" json:"changelists,omitempty"`
  1031  	// The number of test results which have these properties.
  1032  	Count int32 `protobuf:"varint,11,opt,name=count,proto3" json:"count,omitempty"`
  1033  }
  1034  
  1035  func (x *DistinctClusterFailure) Reset() {
  1036  	*x = DistinctClusterFailure{}
  1037  	if protoimpl.UnsafeEnabled {
  1038  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[12]
  1039  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1040  		ms.StoreMessageInfo(mi)
  1041  	}
  1042  }
  1043  
  1044  func (x *DistinctClusterFailure) String() string {
  1045  	return protoimpl.X.MessageStringOf(x)
  1046  }
  1047  
  1048  func (*DistinctClusterFailure) ProtoMessage() {}
  1049  
  1050  func (x *DistinctClusterFailure) ProtoReflect() protoreflect.Message {
  1051  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[12]
  1052  	if protoimpl.UnsafeEnabled && x != nil {
  1053  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1054  		if ms.LoadMessageInfo() == nil {
  1055  			ms.StoreMessageInfo(mi)
  1056  		}
  1057  		return ms
  1058  	}
  1059  	return mi.MessageOf(x)
  1060  }
  1061  
  1062  // Deprecated: Use DistinctClusterFailure.ProtoReflect.Descriptor instead.
  1063  func (*DistinctClusterFailure) Descriptor() ([]byte, []int) {
  1064  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{12}
  1065  }
  1066  
  1067  func (x *DistinctClusterFailure) GetTestId() string {
  1068  	if x != nil {
  1069  		return x.TestId
  1070  	}
  1071  	return ""
  1072  }
  1073  
  1074  func (x *DistinctClusterFailure) GetVariant() *Variant {
  1075  	if x != nil {
  1076  		return x.Variant
  1077  	}
  1078  	return nil
  1079  }
  1080  
  1081  func (x *DistinctClusterFailure) GetPartitionTime() *timestamppb.Timestamp {
  1082  	if x != nil {
  1083  		return x.PartitionTime
  1084  	}
  1085  	return nil
  1086  }
  1087  
  1088  func (x *DistinctClusterFailure) GetPresubmitRun() *DistinctClusterFailure_PresubmitRun {
  1089  	if x != nil {
  1090  		return x.PresubmitRun
  1091  	}
  1092  	return nil
  1093  }
  1094  
  1095  func (x *DistinctClusterFailure) GetIsBuildCritical() bool {
  1096  	if x != nil {
  1097  		return x.IsBuildCritical
  1098  	}
  1099  	return false
  1100  }
  1101  
  1102  func (x *DistinctClusterFailure) GetExonerations() []*DistinctClusterFailure_Exoneration {
  1103  	if x != nil {
  1104  		return x.Exonerations
  1105  	}
  1106  	return nil
  1107  }
  1108  
  1109  func (x *DistinctClusterFailure) GetBuildStatus() BuildStatus {
  1110  	if x != nil {
  1111  		return x.BuildStatus
  1112  	}
  1113  	return BuildStatus_BUILD_STATUS_UNSPECIFIED
  1114  }
  1115  
  1116  func (x *DistinctClusterFailure) GetIngestedInvocationId() string {
  1117  	if x != nil {
  1118  		return x.IngestedInvocationId
  1119  	}
  1120  	return ""
  1121  }
  1122  
  1123  func (x *DistinctClusterFailure) GetIsIngestedInvocationBlocked() bool {
  1124  	if x != nil {
  1125  		return x.IsIngestedInvocationBlocked
  1126  	}
  1127  	return false
  1128  }
  1129  
  1130  func (x *DistinctClusterFailure) GetChangelists() []*Changelist {
  1131  	if x != nil {
  1132  		return x.Changelists
  1133  	}
  1134  	return nil
  1135  }
  1136  
  1137  func (x *DistinctClusterFailure) GetCount() int32 {
  1138  	if x != nil {
  1139  		return x.Count
  1140  	}
  1141  	return 0
  1142  }
  1143  
  1144  type QueryClusterExoneratedTestVariantsRequest struct {
  1145  	state         protoimpl.MessageState
  1146  	sizeCache     protoimpl.SizeCache
  1147  	unknownFields protoimpl.UnknownFields
  1148  
  1149  	// The resource name of the cluster exonerated test variants to retrieve.
  1150  	// Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}/exoneratedTestVariants.
  1151  	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
  1152  }
  1153  
  1154  func (x *QueryClusterExoneratedTestVariantsRequest) Reset() {
  1155  	*x = QueryClusterExoneratedTestVariantsRequest{}
  1156  	if protoimpl.UnsafeEnabled {
  1157  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[13]
  1158  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1159  		ms.StoreMessageInfo(mi)
  1160  	}
  1161  }
  1162  
  1163  func (x *QueryClusterExoneratedTestVariantsRequest) String() string {
  1164  	return protoimpl.X.MessageStringOf(x)
  1165  }
  1166  
  1167  func (*QueryClusterExoneratedTestVariantsRequest) ProtoMessage() {}
  1168  
  1169  func (x *QueryClusterExoneratedTestVariantsRequest) ProtoReflect() protoreflect.Message {
  1170  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[13]
  1171  	if protoimpl.UnsafeEnabled && x != nil {
  1172  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1173  		if ms.LoadMessageInfo() == nil {
  1174  			ms.StoreMessageInfo(mi)
  1175  		}
  1176  		return ms
  1177  	}
  1178  	return mi.MessageOf(x)
  1179  }
  1180  
  1181  // Deprecated: Use QueryClusterExoneratedTestVariantsRequest.ProtoReflect.Descriptor instead.
  1182  func (*QueryClusterExoneratedTestVariantsRequest) Descriptor() ([]byte, []int) {
  1183  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{13}
  1184  }
  1185  
  1186  func (x *QueryClusterExoneratedTestVariantsRequest) GetParent() string {
  1187  	if x != nil {
  1188  		return x.Parent
  1189  	}
  1190  	return ""
  1191  }
  1192  
  1193  type QueryClusterExoneratedTestVariantsResponse struct {
  1194  	state         protoimpl.MessageState
  1195  	sizeCache     protoimpl.SizeCache
  1196  	unknownFields protoimpl.UnknownFields
  1197  
  1198  	// A list of test variants in the cluster which have exonerated critical
  1199  	// failures. Ordered by recency of the exoneration (most recent exonerations
  1200  	// first) and limited to at most 100 test variants.
  1201  	TestVariants []*ClusterExoneratedTestVariant `protobuf:"bytes,1,rep,name=test_variants,json=testVariants,proto3" json:"test_variants,omitempty"`
  1202  }
  1203  
  1204  func (x *QueryClusterExoneratedTestVariantsResponse) Reset() {
  1205  	*x = QueryClusterExoneratedTestVariantsResponse{}
  1206  	if protoimpl.UnsafeEnabled {
  1207  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[14]
  1208  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1209  		ms.StoreMessageInfo(mi)
  1210  	}
  1211  }
  1212  
  1213  func (x *QueryClusterExoneratedTestVariantsResponse) String() string {
  1214  	return protoimpl.X.MessageStringOf(x)
  1215  }
  1216  
  1217  func (*QueryClusterExoneratedTestVariantsResponse) ProtoMessage() {}
  1218  
  1219  func (x *QueryClusterExoneratedTestVariantsResponse) ProtoReflect() protoreflect.Message {
  1220  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[14]
  1221  	if protoimpl.UnsafeEnabled && x != nil {
  1222  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1223  		if ms.LoadMessageInfo() == nil {
  1224  			ms.StoreMessageInfo(mi)
  1225  		}
  1226  		return ms
  1227  	}
  1228  	return mi.MessageOf(x)
  1229  }
  1230  
  1231  // Deprecated: Use QueryClusterExoneratedTestVariantsResponse.ProtoReflect.Descriptor instead.
  1232  func (*QueryClusterExoneratedTestVariantsResponse) Descriptor() ([]byte, []int) {
  1233  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{14}
  1234  }
  1235  
  1236  func (x *QueryClusterExoneratedTestVariantsResponse) GetTestVariants() []*ClusterExoneratedTestVariant {
  1237  	if x != nil {
  1238  		return x.TestVariants
  1239  	}
  1240  	return nil
  1241  }
  1242  
  1243  // ClusterExoneratedTestVariant represents a test variant in a cluster
  1244  // which has been exonerated. A cluster test variant is the subset
  1245  // of a test variant that intersects with the failures of a cluster.
  1246  type ClusterExoneratedTestVariant struct {
  1247  	state         protoimpl.MessageState
  1248  	sizeCache     protoimpl.SizeCache
  1249  	unknownFields protoimpl.UnknownFields
  1250  
  1251  	// A unique identifier of the test in a LUCI project.
  1252  	TestId string `protobuf:"bytes,1,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"`
  1253  	// Description of one specific way of running the test,
  1254  	// e.g. a specific bucket, builder and a test suite.
  1255  	Variant *Variant `protobuf:"bytes,2,opt,name=variant,proto3" json:"variant,omitempty"`
  1256  	// The number of critical (presubmit-blocking) failures in the
  1257  	// cluster which have been exonerated on this test variant
  1258  	// in the last week.
  1259  	CriticalFailuresExonerated int32 `protobuf:"varint,3,opt,name=critical_failures_exonerated,json=criticalFailuresExonerated,proto3" json:"critical_failures_exonerated,omitempty"`
  1260  	// The partition time of the most recent exoneration of a
  1261  	// critical failure.
  1262  	LastExoneration *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_exoneration,json=lastExoneration,proto3" json:"last_exoneration,omitempty"`
  1263  }
  1264  
  1265  func (x *ClusterExoneratedTestVariant) Reset() {
  1266  	*x = ClusterExoneratedTestVariant{}
  1267  	if protoimpl.UnsafeEnabled {
  1268  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[15]
  1269  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1270  		ms.StoreMessageInfo(mi)
  1271  	}
  1272  }
  1273  
  1274  func (x *ClusterExoneratedTestVariant) String() string {
  1275  	return protoimpl.X.MessageStringOf(x)
  1276  }
  1277  
  1278  func (*ClusterExoneratedTestVariant) ProtoMessage() {}
  1279  
  1280  func (x *ClusterExoneratedTestVariant) ProtoReflect() protoreflect.Message {
  1281  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[15]
  1282  	if protoimpl.UnsafeEnabled && x != nil {
  1283  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1284  		if ms.LoadMessageInfo() == nil {
  1285  			ms.StoreMessageInfo(mi)
  1286  		}
  1287  		return ms
  1288  	}
  1289  	return mi.MessageOf(x)
  1290  }
  1291  
  1292  // Deprecated: Use ClusterExoneratedTestVariant.ProtoReflect.Descriptor instead.
  1293  func (*ClusterExoneratedTestVariant) Descriptor() ([]byte, []int) {
  1294  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{15}
  1295  }
  1296  
  1297  func (x *ClusterExoneratedTestVariant) GetTestId() string {
  1298  	if x != nil {
  1299  		return x.TestId
  1300  	}
  1301  	return ""
  1302  }
  1303  
  1304  func (x *ClusterExoneratedTestVariant) GetVariant() *Variant {
  1305  	if x != nil {
  1306  		return x.Variant
  1307  	}
  1308  	return nil
  1309  }
  1310  
  1311  func (x *ClusterExoneratedTestVariant) GetCriticalFailuresExonerated() int32 {
  1312  	if x != nil {
  1313  		return x.CriticalFailuresExonerated
  1314  	}
  1315  	return 0
  1316  }
  1317  
  1318  func (x *ClusterExoneratedTestVariant) GetLastExoneration() *timestamppb.Timestamp {
  1319  	if x != nil {
  1320  		return x.LastExoneration
  1321  	}
  1322  	return nil
  1323  }
  1324  
  1325  type QueryClusterExoneratedTestVariantBranchesRequest struct {
  1326  	state         protoimpl.MessageState
  1327  	sizeCache     protoimpl.SizeCache
  1328  	unknownFields protoimpl.UnknownFields
  1329  
  1330  	// The resource name of the cluster exonerated test variant branches to retrieve.
  1331  	// Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}/exoneratedTestVariantBranches.
  1332  	Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
  1333  }
  1334  
  1335  func (x *QueryClusterExoneratedTestVariantBranchesRequest) Reset() {
  1336  	*x = QueryClusterExoneratedTestVariantBranchesRequest{}
  1337  	if protoimpl.UnsafeEnabled {
  1338  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[16]
  1339  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1340  		ms.StoreMessageInfo(mi)
  1341  	}
  1342  }
  1343  
  1344  func (x *QueryClusterExoneratedTestVariantBranchesRequest) String() string {
  1345  	return protoimpl.X.MessageStringOf(x)
  1346  }
  1347  
  1348  func (*QueryClusterExoneratedTestVariantBranchesRequest) ProtoMessage() {}
  1349  
  1350  func (x *QueryClusterExoneratedTestVariantBranchesRequest) ProtoReflect() protoreflect.Message {
  1351  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[16]
  1352  	if protoimpl.UnsafeEnabled && x != nil {
  1353  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1354  		if ms.LoadMessageInfo() == nil {
  1355  			ms.StoreMessageInfo(mi)
  1356  		}
  1357  		return ms
  1358  	}
  1359  	return mi.MessageOf(x)
  1360  }
  1361  
  1362  // Deprecated: Use QueryClusterExoneratedTestVariantBranchesRequest.ProtoReflect.Descriptor instead.
  1363  func (*QueryClusterExoneratedTestVariantBranchesRequest) Descriptor() ([]byte, []int) {
  1364  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{16}
  1365  }
  1366  
  1367  func (x *QueryClusterExoneratedTestVariantBranchesRequest) GetParent() string {
  1368  	if x != nil {
  1369  		return x.Parent
  1370  	}
  1371  	return ""
  1372  }
  1373  
  1374  type QueryClusterExoneratedTestVariantBranchesResponse struct {
  1375  	state         protoimpl.MessageState
  1376  	sizeCache     protoimpl.SizeCache
  1377  	unknownFields protoimpl.UnknownFields
  1378  
  1379  	// A list of test variants branches in the cluster which have exonerated
  1380  	// critical failures. Ordered by recency of the exoneration (most recent
  1381  	// exonerations first) and limited to at most 100 test variant branches.
  1382  	//
  1383  	// Pagination following AIP-158 may be implemented in future if
  1384  	// more than 100 items is needed.
  1385  	TestVariantBranches []*ClusterExoneratedTestVariantBranch `protobuf:"bytes,1,rep,name=test_variant_branches,json=testVariantBranches,proto3" json:"test_variant_branches,omitempty"`
  1386  }
  1387  
  1388  func (x *QueryClusterExoneratedTestVariantBranchesResponse) Reset() {
  1389  	*x = QueryClusterExoneratedTestVariantBranchesResponse{}
  1390  	if protoimpl.UnsafeEnabled {
  1391  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[17]
  1392  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1393  		ms.StoreMessageInfo(mi)
  1394  	}
  1395  }
  1396  
  1397  func (x *QueryClusterExoneratedTestVariantBranchesResponse) String() string {
  1398  	return protoimpl.X.MessageStringOf(x)
  1399  }
  1400  
  1401  func (*QueryClusterExoneratedTestVariantBranchesResponse) ProtoMessage() {}
  1402  
  1403  func (x *QueryClusterExoneratedTestVariantBranchesResponse) ProtoReflect() protoreflect.Message {
  1404  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[17]
  1405  	if protoimpl.UnsafeEnabled && x != nil {
  1406  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1407  		if ms.LoadMessageInfo() == nil {
  1408  			ms.StoreMessageInfo(mi)
  1409  		}
  1410  		return ms
  1411  	}
  1412  	return mi.MessageOf(x)
  1413  }
  1414  
  1415  // Deprecated: Use QueryClusterExoneratedTestVariantBranchesResponse.ProtoReflect.Descriptor instead.
  1416  func (*QueryClusterExoneratedTestVariantBranchesResponse) Descriptor() ([]byte, []int) {
  1417  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{17}
  1418  }
  1419  
  1420  func (x *QueryClusterExoneratedTestVariantBranchesResponse) GetTestVariantBranches() []*ClusterExoneratedTestVariantBranch {
  1421  	if x != nil {
  1422  		return x.TestVariantBranches
  1423  	}
  1424  	return nil
  1425  }
  1426  
  1427  // ClusterExoneratedTestVariantBranch represents a (test, variant, source ref)
  1428  // in a cluster which has been exonerated. A cluster test variant branch is
  1429  // the subset of a test variant branch that intersects with the failures of a
  1430  // cluster.
  1431  type ClusterExoneratedTestVariantBranch struct {
  1432  	state         protoimpl.MessageState
  1433  	sizeCache     protoimpl.SizeCache
  1434  	unknownFields protoimpl.UnknownFields
  1435  
  1436  	// The LUCI project.
  1437  	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
  1438  	// A unique identifier of the test in a LUCI project.
  1439  	TestId string `protobuf:"bytes,2,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"`
  1440  	// Description of one specific way of running the test,
  1441  	// e.g. a specific bucket, builder and a test suite.
  1442  	Variant *Variant `protobuf:"bytes,3,opt,name=variant,proto3" json:"variant,omitempty"`
  1443  	// The branch in source control that was tested, if known.
  1444  	// For example, the `refs/heads/main` branch in the `chromium/src` repo
  1445  	// hosted by `chromium.googlesource.com`.
  1446  	SourceRef *SourceRef `protobuf:"bytes,4,opt,name=source_ref,json=sourceRef,proto3" json:"source_ref,omitempty"`
  1447  	// The number of critical (presubmit-blocking) failures in the
  1448  	// cluster which have been exonerated on this test variant
  1449  	// in the last week.
  1450  	CriticalFailuresExonerated int32 `protobuf:"varint,5,opt,name=critical_failures_exonerated,json=criticalFailuresExonerated,proto3" json:"critical_failures_exonerated,omitempty"`
  1451  	// The partition time of the most recent exoneration of a
  1452  	// critical failure.
  1453  	LastExoneration *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_exoneration,json=lastExoneration,proto3" json:"last_exoneration,omitempty"`
  1454  }
  1455  
  1456  func (x *ClusterExoneratedTestVariantBranch) Reset() {
  1457  	*x = ClusterExoneratedTestVariantBranch{}
  1458  	if protoimpl.UnsafeEnabled {
  1459  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[18]
  1460  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1461  		ms.StoreMessageInfo(mi)
  1462  	}
  1463  }
  1464  
  1465  func (x *ClusterExoneratedTestVariantBranch) String() string {
  1466  	return protoimpl.X.MessageStringOf(x)
  1467  }
  1468  
  1469  func (*ClusterExoneratedTestVariantBranch) ProtoMessage() {}
  1470  
  1471  func (x *ClusterExoneratedTestVariantBranch) ProtoReflect() protoreflect.Message {
  1472  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[18]
  1473  	if protoimpl.UnsafeEnabled && x != nil {
  1474  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1475  		if ms.LoadMessageInfo() == nil {
  1476  			ms.StoreMessageInfo(mi)
  1477  		}
  1478  		return ms
  1479  	}
  1480  	return mi.MessageOf(x)
  1481  }
  1482  
  1483  // Deprecated: Use ClusterExoneratedTestVariantBranch.ProtoReflect.Descriptor instead.
  1484  func (*ClusterExoneratedTestVariantBranch) Descriptor() ([]byte, []int) {
  1485  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{18}
  1486  }
  1487  
  1488  func (x *ClusterExoneratedTestVariantBranch) GetProject() string {
  1489  	if x != nil {
  1490  		return x.Project
  1491  	}
  1492  	return ""
  1493  }
  1494  
  1495  func (x *ClusterExoneratedTestVariantBranch) GetTestId() string {
  1496  	if x != nil {
  1497  		return x.TestId
  1498  	}
  1499  	return ""
  1500  }
  1501  
  1502  func (x *ClusterExoneratedTestVariantBranch) GetVariant() *Variant {
  1503  	if x != nil {
  1504  		return x.Variant
  1505  	}
  1506  	return nil
  1507  }
  1508  
  1509  func (x *ClusterExoneratedTestVariantBranch) GetSourceRef() *SourceRef {
  1510  	if x != nil {
  1511  		return x.SourceRef
  1512  	}
  1513  	return nil
  1514  }
  1515  
  1516  func (x *ClusterExoneratedTestVariantBranch) GetCriticalFailuresExonerated() int32 {
  1517  	if x != nil {
  1518  		return x.CriticalFailuresExonerated
  1519  	}
  1520  	return 0
  1521  }
  1522  
  1523  func (x *ClusterExoneratedTestVariantBranch) GetLastExoneration() *timestamppb.Timestamp {
  1524  	if x != nil {
  1525  		return x.LastExoneration
  1526  	}
  1527  	return nil
  1528  }
  1529  
  1530  type QueryClusterHistoryRequest struct {
  1531  	state         protoimpl.MessageState
  1532  	sizeCache     protoimpl.SizeCache
  1533  	unknownFields protoimpl.UnknownFields
  1534  
  1535  	// The LUCI Project.
  1536  	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
  1537  	// An AIP-160 style filter to select test failures in the project
  1538  	// to calculate metrics for.
  1539  	//
  1540  	// See the description of the QueryClusterSummariesRequest.failure_filter
  1541  	// above for the format of this field.
  1542  	//
  1543  	// Note that cost is greatly reduced (more than 90%) if exact matches for the
  1544  	// cluster_algorithm and cluster_id field are both provided in the filter string.
  1545  	FailureFilter string `protobuf:"bytes,2,opt,name=failure_filter,json=failureFilter,proto3" json:"failure_filter,omitempty"`
  1546  	// The number of days of history to return.  Maximum of 90 as only 90 days of
  1547  	// history is kept by LUCI Analysis.  Note that the cost of the query scales
  1548  	// linearly with the number of days.
  1549  	Days int32 `protobuf:"varint,3,opt,name=days,proto3" json:"days,omitempty"`
  1550  	// The resource name(s) of the metrics to include in the cluster histories.
  1551  	// Format: projects/{project}/metrics/{metric_id}.
  1552  	// See the metrics field on the luci.analysis.v1.Cluster message for details
  1553  	// about valid metric identifiers.
  1554  	Metrics []string `protobuf:"bytes,4,rep,name=metrics,proto3" json:"metrics,omitempty"`
  1555  }
  1556  
  1557  func (x *QueryClusterHistoryRequest) Reset() {
  1558  	*x = QueryClusterHistoryRequest{}
  1559  	if protoimpl.UnsafeEnabled {
  1560  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[19]
  1561  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1562  		ms.StoreMessageInfo(mi)
  1563  	}
  1564  }
  1565  
  1566  func (x *QueryClusterHistoryRequest) String() string {
  1567  	return protoimpl.X.MessageStringOf(x)
  1568  }
  1569  
  1570  func (*QueryClusterHistoryRequest) ProtoMessage() {}
  1571  
  1572  func (x *QueryClusterHistoryRequest) ProtoReflect() protoreflect.Message {
  1573  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[19]
  1574  	if protoimpl.UnsafeEnabled && x != nil {
  1575  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1576  		if ms.LoadMessageInfo() == nil {
  1577  			ms.StoreMessageInfo(mi)
  1578  		}
  1579  		return ms
  1580  	}
  1581  	return mi.MessageOf(x)
  1582  }
  1583  
  1584  // Deprecated: Use QueryClusterHistoryRequest.ProtoReflect.Descriptor instead.
  1585  func (*QueryClusterHistoryRequest) Descriptor() ([]byte, []int) {
  1586  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{19}
  1587  }
  1588  
  1589  func (x *QueryClusterHistoryRequest) GetProject() string {
  1590  	if x != nil {
  1591  		return x.Project
  1592  	}
  1593  	return ""
  1594  }
  1595  
  1596  func (x *QueryClusterHistoryRequest) GetFailureFilter() string {
  1597  	if x != nil {
  1598  		return x.FailureFilter
  1599  	}
  1600  	return ""
  1601  }
  1602  
  1603  func (x *QueryClusterHistoryRequest) GetDays() int32 {
  1604  	if x != nil {
  1605  		return x.Days
  1606  	}
  1607  	return 0
  1608  }
  1609  
  1610  func (x *QueryClusterHistoryRequest) GetMetrics() []string {
  1611  	if x != nil {
  1612  		return x.Metrics
  1613  	}
  1614  	return nil
  1615  }
  1616  
  1617  type QueryClusterHistoryResponse struct {
  1618  	state         protoimpl.MessageState
  1619  	sizeCache     protoimpl.SizeCache
  1620  	unknownFields protoimpl.UnknownFields
  1621  
  1622  	// The metrics for each day.  There will be the same number of days as
  1623  	// requested in the request.  The entries will be returned in sorted date
  1624  	// order, earliest day first.
  1625  	Days []*ClusterHistoryDay `protobuf:"bytes,1,rep,name=days,proto3" json:"days,omitempty"`
  1626  }
  1627  
  1628  func (x *QueryClusterHistoryResponse) Reset() {
  1629  	*x = QueryClusterHistoryResponse{}
  1630  	if protoimpl.UnsafeEnabled {
  1631  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[20]
  1632  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1633  		ms.StoreMessageInfo(mi)
  1634  	}
  1635  }
  1636  
  1637  func (x *QueryClusterHistoryResponse) String() string {
  1638  	return protoimpl.X.MessageStringOf(x)
  1639  }
  1640  
  1641  func (*QueryClusterHistoryResponse) ProtoMessage() {}
  1642  
  1643  func (x *QueryClusterHistoryResponse) ProtoReflect() protoreflect.Message {
  1644  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[20]
  1645  	if protoimpl.UnsafeEnabled && x != nil {
  1646  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1647  		if ms.LoadMessageInfo() == nil {
  1648  			ms.StoreMessageInfo(mi)
  1649  		}
  1650  		return ms
  1651  	}
  1652  	return mi.MessageOf(x)
  1653  }
  1654  
  1655  // Deprecated: Use QueryClusterHistoryResponse.ProtoReflect.Descriptor instead.
  1656  func (*QueryClusterHistoryResponse) Descriptor() ([]byte, []int) {
  1657  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{20}
  1658  }
  1659  
  1660  func (x *QueryClusterHistoryResponse) GetDays() []*ClusterHistoryDay {
  1661  	if x != nil {
  1662  		return x.Days
  1663  	}
  1664  	return nil
  1665  }
  1666  
  1667  // Represents metrics about a cluster on a specific day.
  1668  type ClusterHistoryDay struct {
  1669  	state         protoimpl.MessageState
  1670  	sizeCache     protoimpl.SizeCache
  1671  	unknownFields protoimpl.UnknownFields
  1672  
  1673  	// A map from requested metric name to the value of that metric on this day.
  1674  	// The key of the map is the metric ID.
  1675  	Metrics map[string]int32 `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
  1676  	// The date that these metrics are for.
  1677  	// This is a UTC date in ISO 8601 format, e.g. 2022-11-29
  1678  	Date string `protobuf:"bytes,2,opt,name=date,proto3" json:"date,omitempty"`
  1679  }
  1680  
  1681  func (x *ClusterHistoryDay) Reset() {
  1682  	*x = ClusterHistoryDay{}
  1683  	if protoimpl.UnsafeEnabled {
  1684  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[21]
  1685  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1686  		ms.StoreMessageInfo(mi)
  1687  	}
  1688  }
  1689  
  1690  func (x *ClusterHistoryDay) String() string {
  1691  	return protoimpl.X.MessageStringOf(x)
  1692  }
  1693  
  1694  func (*ClusterHistoryDay) ProtoMessage() {}
  1695  
  1696  func (x *ClusterHistoryDay) ProtoReflect() protoreflect.Message {
  1697  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[21]
  1698  	if protoimpl.UnsafeEnabled && x != nil {
  1699  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1700  		if ms.LoadMessageInfo() == nil {
  1701  			ms.StoreMessageInfo(mi)
  1702  		}
  1703  		return ms
  1704  	}
  1705  	return mi.MessageOf(x)
  1706  }
  1707  
  1708  // Deprecated: Use ClusterHistoryDay.ProtoReflect.Descriptor instead.
  1709  func (*ClusterHistoryDay) Descriptor() ([]byte, []int) {
  1710  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{21}
  1711  }
  1712  
  1713  func (x *ClusterHistoryDay) GetMetrics() map[string]int32 {
  1714  	if x != nil {
  1715  		return x.Metrics
  1716  	}
  1717  	return nil
  1718  }
  1719  
  1720  func (x *ClusterHistoryDay) GetDate() string {
  1721  	if x != nil {
  1722  		return x.Date
  1723  	}
  1724  	return ""
  1725  }
  1726  
  1727  // TestResult captures information about a test result, sufficient to
  1728  // cluster it. The fields requested here may be expanded over time.
  1729  // For example, variant information may be requested in future.
  1730  type ClusterRequest_TestResult struct {
  1731  	state         protoimpl.MessageState
  1732  	sizeCache     protoimpl.SizeCache
  1733  	unknownFields protoimpl.UnknownFields
  1734  
  1735  	// Opaque tag supplied by the caller, to be returned in the
  1736  	// response. Provided to assist correlating responses with requests.
  1737  	// Does not need to be unique. Optional.
  1738  	RequestTag string `protobuf:"bytes,1,opt,name=request_tag,json=requestTag,proto3" json:"request_tag,omitempty"`
  1739  	// Identifier of the test (as reported to ResultDB).
  1740  	// For chromium projects, this starts with ninja://.
  1741  	TestId string `protobuf:"bytes,2,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"`
  1742  	// The failure reason of the test (if any).
  1743  	FailureReason *FailureReason `protobuf:"bytes,3,opt,name=failure_reason,json=failureReason,proto3" json:"failure_reason,omitempty"`
  1744  }
  1745  
  1746  func (x *ClusterRequest_TestResult) Reset() {
  1747  	*x = ClusterRequest_TestResult{}
  1748  	if protoimpl.UnsafeEnabled {
  1749  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[22]
  1750  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1751  		ms.StoreMessageInfo(mi)
  1752  	}
  1753  }
  1754  
  1755  func (x *ClusterRequest_TestResult) String() string {
  1756  	return protoimpl.X.MessageStringOf(x)
  1757  }
  1758  
  1759  func (*ClusterRequest_TestResult) ProtoMessage() {}
  1760  
  1761  func (x *ClusterRequest_TestResult) ProtoReflect() protoreflect.Message {
  1762  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[22]
  1763  	if protoimpl.UnsafeEnabled && x != nil {
  1764  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1765  		if ms.LoadMessageInfo() == nil {
  1766  			ms.StoreMessageInfo(mi)
  1767  		}
  1768  		return ms
  1769  	}
  1770  	return mi.MessageOf(x)
  1771  }
  1772  
  1773  // Deprecated: Use ClusterRequest_TestResult.ProtoReflect.Descriptor instead.
  1774  func (*ClusterRequest_TestResult) Descriptor() ([]byte, []int) {
  1775  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{0, 0}
  1776  }
  1777  
  1778  func (x *ClusterRequest_TestResult) GetRequestTag() string {
  1779  	if x != nil {
  1780  		return x.RequestTag
  1781  	}
  1782  	return ""
  1783  }
  1784  
  1785  func (x *ClusterRequest_TestResult) GetTestId() string {
  1786  	if x != nil {
  1787  		return x.TestId
  1788  	}
  1789  	return ""
  1790  }
  1791  
  1792  func (x *ClusterRequest_TestResult) GetFailureReason() *FailureReason {
  1793  	if x != nil {
  1794  		return x.FailureReason
  1795  	}
  1796  	return nil
  1797  }
  1798  
  1799  // The cluster(s) a test result is contained in.
  1800  type ClusterResponse_ClusteredTestResult struct {
  1801  	state         protoimpl.MessageState
  1802  	sizeCache     protoimpl.SizeCache
  1803  	unknownFields protoimpl.UnknownFields
  1804  
  1805  	// Opaque tag supplied by the caller in the request. Provided to assist
  1806  	// the caller correlate responses with requests.
  1807  	RequestTag string `protobuf:"bytes,1,opt,name=request_tag,json=requestTag,proto3" json:"request_tag,omitempty"`
  1808  	// The clusters the test result is contained within.
  1809  	Clusters []*ClusterResponse_ClusteredTestResult_ClusterEntry `protobuf:"bytes,2,rep,name=clusters,proto3" json:"clusters,omitempty"`
  1810  }
  1811  
  1812  func (x *ClusterResponse_ClusteredTestResult) Reset() {
  1813  	*x = ClusterResponse_ClusteredTestResult{}
  1814  	if protoimpl.UnsafeEnabled {
  1815  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[23]
  1816  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1817  		ms.StoreMessageInfo(mi)
  1818  	}
  1819  }
  1820  
  1821  func (x *ClusterResponse_ClusteredTestResult) String() string {
  1822  	return protoimpl.X.MessageStringOf(x)
  1823  }
  1824  
  1825  func (*ClusterResponse_ClusteredTestResult) ProtoMessage() {}
  1826  
  1827  func (x *ClusterResponse_ClusteredTestResult) ProtoReflect() protoreflect.Message {
  1828  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[23]
  1829  	if protoimpl.UnsafeEnabled && x != nil {
  1830  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1831  		if ms.LoadMessageInfo() == nil {
  1832  			ms.StoreMessageInfo(mi)
  1833  		}
  1834  		return ms
  1835  	}
  1836  	return mi.MessageOf(x)
  1837  }
  1838  
  1839  // Deprecated: Use ClusterResponse_ClusteredTestResult.ProtoReflect.Descriptor instead.
  1840  func (*ClusterResponse_ClusteredTestResult) Descriptor() ([]byte, []int) {
  1841  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{1, 0}
  1842  }
  1843  
  1844  func (x *ClusterResponse_ClusteredTestResult) GetRequestTag() string {
  1845  	if x != nil {
  1846  		return x.RequestTag
  1847  	}
  1848  	return ""
  1849  }
  1850  
  1851  func (x *ClusterResponse_ClusteredTestResult) GetClusters() []*ClusterResponse_ClusteredTestResult_ClusterEntry {
  1852  	if x != nil {
  1853  		return x.Clusters
  1854  	}
  1855  	return nil
  1856  }
  1857  
  1858  // An individual cluster a test result is contained in.
  1859  type ClusterResponse_ClusteredTestResult_ClusterEntry struct {
  1860  	state         protoimpl.MessageState
  1861  	sizeCache     protoimpl.SizeCache
  1862  	unknownFields protoimpl.UnknownFields
  1863  
  1864  	// The unique identifier of the cluster.
  1865  	// If the algorithm is "rules", the cluster ID is also a rule ID.
  1866  	ClusterId *ClusterId `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"`
  1867  	// The bug associated with the cluster, if any. This is only
  1868  	// populated for clusters defined by a failure association rule,
  1869  	// which associates specified failures to a bug.
  1870  	Bug *AssociatedBug `protobuf:"bytes,2,opt,name=bug,proto3" json:"bug,omitempty"`
  1871  }
  1872  
  1873  func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) Reset() {
  1874  	*x = ClusterResponse_ClusteredTestResult_ClusterEntry{}
  1875  	if protoimpl.UnsafeEnabled {
  1876  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[24]
  1877  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1878  		ms.StoreMessageInfo(mi)
  1879  	}
  1880  }
  1881  
  1882  func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) String() string {
  1883  	return protoimpl.X.MessageStringOf(x)
  1884  }
  1885  
  1886  func (*ClusterResponse_ClusteredTestResult_ClusterEntry) ProtoMessage() {}
  1887  
  1888  func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) ProtoReflect() protoreflect.Message {
  1889  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[24]
  1890  	if protoimpl.UnsafeEnabled && x != nil {
  1891  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1892  		if ms.LoadMessageInfo() == nil {
  1893  			ms.StoreMessageInfo(mi)
  1894  		}
  1895  		return ms
  1896  	}
  1897  	return mi.MessageOf(x)
  1898  }
  1899  
  1900  // Deprecated: Use ClusterResponse_ClusteredTestResult_ClusterEntry.ProtoReflect.Descriptor instead.
  1901  func (*ClusterResponse_ClusteredTestResult_ClusterEntry) Descriptor() ([]byte, []int) {
  1902  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{1, 0, 0}
  1903  }
  1904  
  1905  func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) GetClusterId() *ClusterId {
  1906  	if x != nil {
  1907  		return x.ClusterId
  1908  	}
  1909  	return nil
  1910  }
  1911  
  1912  func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) GetBug() *AssociatedBug {
  1913  	if x != nil {
  1914  		return x.Bug
  1915  	}
  1916  	return nil
  1917  }
  1918  
  1919  type Cluster_Counts struct {
  1920  	state         protoimpl.MessageState
  1921  	sizeCache     protoimpl.SizeCache
  1922  	unknownFields protoimpl.UnknownFields
  1923  
  1924  	// The value of the metric (summed over all failures).
  1925  	Nominal int64 `protobuf:"varint,1,opt,name=nominal,proto3" json:"nominal,omitempty"`
  1926  }
  1927  
  1928  func (x *Cluster_Counts) Reset() {
  1929  	*x = Cluster_Counts{}
  1930  	if protoimpl.UnsafeEnabled {
  1931  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[25]
  1932  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1933  		ms.StoreMessageInfo(mi)
  1934  	}
  1935  }
  1936  
  1937  func (x *Cluster_Counts) String() string {
  1938  	return protoimpl.X.MessageStringOf(x)
  1939  }
  1940  
  1941  func (*Cluster_Counts) ProtoMessage() {}
  1942  
  1943  func (x *Cluster_Counts) ProtoReflect() protoreflect.Message {
  1944  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[25]
  1945  	if protoimpl.UnsafeEnabled && x != nil {
  1946  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1947  		if ms.LoadMessageInfo() == nil {
  1948  			ms.StoreMessageInfo(mi)
  1949  		}
  1950  		return ms
  1951  	}
  1952  	return mi.MessageOf(x)
  1953  }
  1954  
  1955  // Deprecated: Use Cluster_Counts.ProtoReflect.Descriptor instead.
  1956  func (*Cluster_Counts) Descriptor() ([]byte, []int) {
  1957  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{4, 0}
  1958  }
  1959  
  1960  func (x *Cluster_Counts) GetNominal() int64 {
  1961  	if x != nil {
  1962  		return x.Nominal
  1963  	}
  1964  	return 0
  1965  }
  1966  
  1967  type Cluster_TimewiseCounts struct {
  1968  	state         protoimpl.MessageState
  1969  	sizeCache     protoimpl.SizeCache
  1970  	unknownFields protoimpl.UnknownFields
  1971  
  1972  	// The impact value for the last day.
  1973  	OneDay *Cluster_Counts `protobuf:"bytes,2,opt,name=one_day,json=oneDay,proto3" json:"one_day,omitempty"`
  1974  	// The impact value for the last three days.
  1975  	ThreeDay *Cluster_Counts `protobuf:"bytes,3,opt,name=three_day,json=threeDay,proto3" json:"three_day,omitempty"`
  1976  	// The impact value for the last week.
  1977  	SevenDay *Cluster_Counts `protobuf:"bytes,4,opt,name=seven_day,json=sevenDay,proto3" json:"seven_day,omitempty"`
  1978  }
  1979  
  1980  func (x *Cluster_TimewiseCounts) Reset() {
  1981  	*x = Cluster_TimewiseCounts{}
  1982  	if protoimpl.UnsafeEnabled {
  1983  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[26]
  1984  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1985  		ms.StoreMessageInfo(mi)
  1986  	}
  1987  }
  1988  
  1989  func (x *Cluster_TimewiseCounts) String() string {
  1990  	return protoimpl.X.MessageStringOf(x)
  1991  }
  1992  
  1993  func (*Cluster_TimewiseCounts) ProtoMessage() {}
  1994  
  1995  func (x *Cluster_TimewiseCounts) ProtoReflect() protoreflect.Message {
  1996  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[26]
  1997  	if protoimpl.UnsafeEnabled && x != nil {
  1998  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  1999  		if ms.LoadMessageInfo() == nil {
  2000  			ms.StoreMessageInfo(mi)
  2001  		}
  2002  		return ms
  2003  	}
  2004  	return mi.MessageOf(x)
  2005  }
  2006  
  2007  // Deprecated: Use Cluster_TimewiseCounts.ProtoReflect.Descriptor instead.
  2008  func (*Cluster_TimewiseCounts) Descriptor() ([]byte, []int) {
  2009  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{4, 1}
  2010  }
  2011  
  2012  func (x *Cluster_TimewiseCounts) GetOneDay() *Cluster_Counts {
  2013  	if x != nil {
  2014  		return x.OneDay
  2015  	}
  2016  	return nil
  2017  }
  2018  
  2019  func (x *Cluster_TimewiseCounts) GetThreeDay() *Cluster_Counts {
  2020  	if x != nil {
  2021  		return x.ThreeDay
  2022  	}
  2023  	return nil
  2024  }
  2025  
  2026  func (x *Cluster_TimewiseCounts) GetSevenDay() *Cluster_Counts {
  2027  	if x != nil {
  2028  		return x.SevenDay
  2029  	}
  2030  	return nil
  2031  }
  2032  
  2033  type ClusterSummary_MetricValue struct {
  2034  	state         protoimpl.MessageState
  2035  	sizeCache     protoimpl.SizeCache
  2036  	unknownFields protoimpl.UnknownFields
  2037  
  2038  	// The residual value of the cluster metric.
  2039  	// For bug clusters, the residual metric value is the metric value
  2040  	// calculated using all of the failures in the cluster.
  2041  	// For suggested clusters, the residual metric value is calculated
  2042  	// using the failures in the cluster which are not also part of a
  2043  	// bug cluster. In this way, measures attributed to bug clusters
  2044  	// are not counted again against suggested clusters.
  2045  	Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
  2046  	// The value of the cluster metric over time, grouped by 24-hour periods
  2047  	// in the queried time range, in reverse chronological order
  2048  	// i.e. the first entry is the metric value for the 24-hour period
  2049  	// immediately preceding the time range's latest time.
  2050  	DailyBreakdown []int64 `protobuf:"varint,2,rep,packed,name=daily_breakdown,json=dailyBreakdown,proto3" json:"daily_breakdown,omitempty"`
  2051  }
  2052  
  2053  func (x *ClusterSummary_MetricValue) Reset() {
  2054  	*x = ClusterSummary_MetricValue{}
  2055  	if protoimpl.UnsafeEnabled {
  2056  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[28]
  2057  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  2058  		ms.StoreMessageInfo(mi)
  2059  	}
  2060  }
  2061  
  2062  func (x *ClusterSummary_MetricValue) String() string {
  2063  	return protoimpl.X.MessageStringOf(x)
  2064  }
  2065  
  2066  func (*ClusterSummary_MetricValue) ProtoMessage() {}
  2067  
  2068  func (x *ClusterSummary_MetricValue) ProtoReflect() protoreflect.Message {
  2069  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[28]
  2070  	if protoimpl.UnsafeEnabled && x != nil {
  2071  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  2072  		if ms.LoadMessageInfo() == nil {
  2073  			ms.StoreMessageInfo(mi)
  2074  		}
  2075  		return ms
  2076  	}
  2077  	return mi.MessageOf(x)
  2078  }
  2079  
  2080  // Deprecated: Use ClusterSummary_MetricValue.ProtoReflect.Descriptor instead.
  2081  func (*ClusterSummary_MetricValue) Descriptor() ([]byte, []int) {
  2082  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{9, 0}
  2083  }
  2084  
  2085  func (x *ClusterSummary_MetricValue) GetValue() int64 {
  2086  	if x != nil {
  2087  		return x.Value
  2088  	}
  2089  	return 0
  2090  }
  2091  
  2092  func (x *ClusterSummary_MetricValue) GetDailyBreakdown() []int64 {
  2093  	if x != nil {
  2094  		return x.DailyBreakdown
  2095  	}
  2096  	return nil
  2097  }
  2098  
  2099  // Representation of an exoneration. An exoneration means the subject of
  2100  // the test (e.g. a CL) is absolved from blame for the unexpected results
  2101  // of the test variant.
  2102  type DistinctClusterFailure_Exoneration struct {
  2103  	state         protoimpl.MessageState
  2104  	sizeCache     protoimpl.SizeCache
  2105  	unknownFields protoimpl.UnknownFields
  2106  
  2107  	// The machine-readable reason for the exoneration.
  2108  	Reason ExonerationReason `protobuf:"varint,1,opt,name=reason,proto3,enum=luci.analysis.v1.ExonerationReason" json:"reason,omitempty"`
  2109  }
  2110  
  2111  func (x *DistinctClusterFailure_Exoneration) Reset() {
  2112  	*x = DistinctClusterFailure_Exoneration{}
  2113  	if protoimpl.UnsafeEnabled {
  2114  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[30]
  2115  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  2116  		ms.StoreMessageInfo(mi)
  2117  	}
  2118  }
  2119  
  2120  func (x *DistinctClusterFailure_Exoneration) String() string {
  2121  	return protoimpl.X.MessageStringOf(x)
  2122  }
  2123  
  2124  func (*DistinctClusterFailure_Exoneration) ProtoMessage() {}
  2125  
  2126  func (x *DistinctClusterFailure_Exoneration) ProtoReflect() protoreflect.Message {
  2127  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[30]
  2128  	if protoimpl.UnsafeEnabled && x != nil {
  2129  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  2130  		if ms.LoadMessageInfo() == nil {
  2131  			ms.StoreMessageInfo(mi)
  2132  		}
  2133  		return ms
  2134  	}
  2135  	return mi.MessageOf(x)
  2136  }
  2137  
  2138  // Deprecated: Use DistinctClusterFailure_Exoneration.ProtoReflect.Descriptor instead.
  2139  func (*DistinctClusterFailure_Exoneration) Descriptor() ([]byte, []int) {
  2140  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{12, 0}
  2141  }
  2142  
  2143  func (x *DistinctClusterFailure_Exoneration) GetReason() ExonerationReason {
  2144  	if x != nil {
  2145  		return x.Reason
  2146  	}
  2147  	return ExonerationReason_EXONERATION_REASON_UNSPECIFIED
  2148  }
  2149  
  2150  // Representation of a presubmit run (e.g. LUCI CV Run).
  2151  type DistinctClusterFailure_PresubmitRun struct {
  2152  	state         protoimpl.MessageState
  2153  	sizeCache     protoimpl.SizeCache
  2154  	unknownFields protoimpl.UnknownFields
  2155  
  2156  	// Identity of the presubmit run that contains this test result.
  2157  	// This should be unique per "CQ+1"/"CQ+2" attempt on gerrit.
  2158  	//
  2159  	// One presumbit run MAY have many ingested invocation IDs (e.g. for its
  2160  	// various tryjobs), but every ingested invocation ID only ever has one
  2161  	// presubmit run ID (if any).
  2162  	//
  2163  	// All test results for the same presubmit run will have one
  2164  	// partition_time.
  2165  	//
  2166  	// If the test result was not collected as part of a presubmit run,
  2167  	// this is unset.
  2168  	PresubmitRunId *PresubmitRunId `protobuf:"bytes,1,opt,name=presubmit_run_id,json=presubmitRunId,proto3" json:"presubmit_run_id,omitempty"`
  2169  	// The owner of the presubmit run (if any).
  2170  	// This is the owner of the CL on which CQ+1/CQ+2 was clicked
  2171  	// (even in case of presubmit run with multiple CLs).
  2172  	// There is scope for this field to become an email address if privacy
  2173  	// approval is obtained, until then it is "automation" (for automation
  2174  	// service accounts) and "user" otherwise.
  2175  	Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"`
  2176  	// The mode of the presubmit run. E.g. DRY_RUN, FULL_RUN, QUICK_DRY_RUN.
  2177  	Mode PresubmitRunMode `protobuf:"varint,3,opt,name=mode,proto3,enum=luci.analysis.v1.PresubmitRunMode" json:"mode,omitempty"`
  2178  	// The status of the presubmit run. E.g. succeeded, failed or cancelled.
  2179  	Status PresubmitRunStatus `protobuf:"varint,4,opt,name=status,proto3,enum=luci.analysis.v1.PresubmitRunStatus" json:"status,omitempty"`
  2180  }
  2181  
  2182  func (x *DistinctClusterFailure_PresubmitRun) Reset() {
  2183  	*x = DistinctClusterFailure_PresubmitRun{}
  2184  	if protoimpl.UnsafeEnabled {
  2185  		mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[31]
  2186  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  2187  		ms.StoreMessageInfo(mi)
  2188  	}
  2189  }
  2190  
  2191  func (x *DistinctClusterFailure_PresubmitRun) String() string {
  2192  	return protoimpl.X.MessageStringOf(x)
  2193  }
  2194  
  2195  func (*DistinctClusterFailure_PresubmitRun) ProtoMessage() {}
  2196  
  2197  func (x *DistinctClusterFailure_PresubmitRun) ProtoReflect() protoreflect.Message {
  2198  	mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[31]
  2199  	if protoimpl.UnsafeEnabled && x != nil {
  2200  		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
  2201  		if ms.LoadMessageInfo() == nil {
  2202  			ms.StoreMessageInfo(mi)
  2203  		}
  2204  		return ms
  2205  	}
  2206  	return mi.MessageOf(x)
  2207  }
  2208  
  2209  // Deprecated: Use DistinctClusterFailure_PresubmitRun.ProtoReflect.Descriptor instead.
  2210  func (*DistinctClusterFailure_PresubmitRun) Descriptor() ([]byte, []int) {
  2211  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{12, 1}
  2212  }
  2213  
  2214  func (x *DistinctClusterFailure_PresubmitRun) GetPresubmitRunId() *PresubmitRunId {
  2215  	if x != nil {
  2216  		return x.PresubmitRunId
  2217  	}
  2218  	return nil
  2219  }
  2220  
  2221  func (x *DistinctClusterFailure_PresubmitRun) GetOwner() string {
  2222  	if x != nil {
  2223  		return x.Owner
  2224  	}
  2225  	return ""
  2226  }
  2227  
  2228  func (x *DistinctClusterFailure_PresubmitRun) GetMode() PresubmitRunMode {
  2229  	if x != nil {
  2230  		return x.Mode
  2231  	}
  2232  	return PresubmitRunMode_PRESUBMIT_RUN_MODE_UNSPECIFIED
  2233  }
  2234  
  2235  func (x *DistinctClusterFailure_PresubmitRun) GetStatus() PresubmitRunStatus {
  2236  	if x != nil {
  2237  		return x.Status
  2238  	}
  2239  	return PresubmitRunStatus_PRESUBMIT_RUN_STATUS_UNSPECIFIED
  2240  }
  2241  
  2242  var File_go_chromium_org_luci_analysis_proto_v1_clusters_proto protoreflect.FileDescriptor
  2243  
  2244  var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc = []byte{
  2245  	0x0a, 0x35, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
  2246  	0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f,
  2247  	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2248  	0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e,
  2249  	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
  2250  	0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73,
  2251  	0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x33, 0x67, 0x6f, 0x2e, 0x63,
  2252  	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69,
  2253  	0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
  2254  	0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
  2255  	0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67,
  2256  	0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x70,
  2257  	0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e,
  2258  	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
  2259  	0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c,
  2260  	0x79, 0x73, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x61,
  2261  	0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
  2262  	0x74, 0x6f, 0x22, 0x8b, 0x02, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65,
  2263  	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
  2264  	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12,
  2265  	0x4e, 0x0a, 0x0c, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18,
  2266  	0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61,
  2267  	0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2268  	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75,
  2269  	0x6c, 0x74, 0x52, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a,
  2270  	0x8e, 0x01, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f,
  2271  	0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20,
  2272  	0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x67, 0x12,
  2273  	0x17, 0x0a, 0x07, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
  2274  	0x52, 0x06, 0x74, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c,
  2275  	0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b,
  2276  	0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2277  	0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f,
  2278  	0x6e, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e,
  2279  	0x22, 0xea, 0x03, 0x0a, 0x0f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70,
  2280  	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x16, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x65,
  2281  	0x64, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01,
  2282  	0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c,
  2283  	0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52,
  2284  	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x65,
  2285  	0x64, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x14, 0x63, 0x6c, 0x75,
  2286  	0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
  2287  	0x73, 0x12, 0x52, 0x0a, 0x12, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f,
  2288  	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e,
  2289  	0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31,
  2290  	0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69,
  2291  	0x6f, 0x6e, 0x52, 0x11, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65,
  2292  	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x95, 0x02, 0x0a, 0x13, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
  2293  	0x72, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a,
  2294  	0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01,
  2295  	0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x67, 0x12, 0x5e,
  2296  	0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
  2297  	0x32, 0x42, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2298  	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f,
  2299  	0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x54, 0x65, 0x73,
  2300  	0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45,
  2301  	0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x7d,
  2302  	0x0a, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3a,
  2303  	0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
  2304  	0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
  2305  	0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x52,
  2306  	0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x62, 0x75,
  2307  	0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61,
  2308  	0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x6f, 0x63,
  2309  	0x69, 0x61, 0x74, 0x65, 0x64, 0x42, 0x75, 0x67, 0x52, 0x03, 0x62, 0x75, 0x67, 0x22, 0xc6, 0x01,
  2310  	0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73,
  2311  	0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d,
  2312  	0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
  2313  	0x11, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69,
  2314  	0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73,
  2315  	0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
  2316  	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
  2317  	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73,
  2318  	0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x65,
  2319  	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
  2320  	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
  2321  	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56,
  2322  	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x27, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75,
  2323  	0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e,
  2324  	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
  2325  	0xbb, 0x04, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e,
  2326  	0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
  2327  	0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x02,
  2328  	0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65,
  2329  	0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
  2330  	0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
  2331  	0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61,
  2332  	0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74,
  2333  	0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52,
  2334  	0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x4d, 0x0a, 0x23, 0x65, 0x71, 0x75, 0x69,
  2335  	0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x61,
  2336  	0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18,
  2337  	0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e,
  2338  	0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74,
  2339  	0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x1a, 0x22, 0x0a, 0x06, 0x43, 0x6f, 0x75, 0x6e, 0x74,
  2340  	0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01,
  2341  	0x28, 0x03, 0x52, 0x07, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x1a, 0xc9, 0x01, 0x0a, 0x0e,
  2342  	0x54, 0x69, 0x6d, 0x65, 0x77, 0x69, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x39,
  2343  	0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
  2344  	0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e,
  2345  	0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74,
  2346  	0x73, 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x44, 0x61, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x74, 0x68, 0x72,
  2347  	0x65, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c,
  2348  	0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e,
  2349  	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x08,
  2350  	0x74, 0x68, 0x72, 0x65, 0x65, 0x44, 0x61, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x65, 0x76, 0x65,
  2351  	0x6e, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75,
  2352  	0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43,
  2353  	0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x08, 0x73,
  2354  	0x65, 0x76, 0x65, 0x6e, 0x44, 0x61, 0x79, 0x1a, 0x64, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69,
  2355  	0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
  2356  	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c,
  2357  	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e,
  2358  	0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73,
  2359  	0x74, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x77, 0x69, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e,
  2360  	0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x34, 0x0a,
  2361  	0x1e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67,
  2362  	0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
  2363  	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
  2364  	0x61, 0x6d, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65,
  2365  	0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04,
  2366  	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65,
  2367  	0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x65, 0x72,
  2368  	0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x72,
  2369  	0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x65, 0x12, 0x37,
  2370  	0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c,
  2371  	0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e,
  2372  	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
  2373  	0x6e, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18,
  2374  	0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61,
  2375  	0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2376  	0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74,
  2377  	0x22, 0x8a, 0x02, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
  2378  	0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
  2379  	0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01,
  2380  	0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x66,
  2381  	0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20,
  2382  	0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x74,
  2383  	0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x03,
  2384  	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x18, 0x0a,
  2385  	0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07,
  2386  	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f,
  2387  	0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75,
  2388  	0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54,
  2389  	0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61,
  2390  	0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28,
  2391  	0x0e, 0x32, 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69,
  2392  	0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d,
  2393  	0x61, 0x72, 0x79, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0x6e, 0x0a,
  2394  	0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d,
  2395  	0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d,
  2396  	0x0a, 0x11, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72,
  2397  	0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69,
  2398  	0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75,
  2399  	0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x10, 0x63, 0x6c, 0x75,
  2400  	0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x96, 0x03,
  2401  	0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79,
  2402  	0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01,
  2403  	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c,
  2404  	0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49,
  2405  	0x64, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05,
  2406  	0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74,
  2407  	0x6c, 0x65, 0x12, 0x31, 0x0a, 0x03, 0x62, 0x75, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
  2408  	0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e,
  2409  	0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x42, 0x75, 0x67,
  2410  	0x52, 0x03, 0x62, 0x75, 0x67, 0x12, 0x47, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
  2411  	0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e,
  2412  	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
  2413  	0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
  2414  	0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x4c,
  2415  	0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a,
  2416  	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61,
  2417  	0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x5f, 0x62, 0x72, 0x65,
  2418  	0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0e, 0x64, 0x61,
  2419  	0x69, 0x6c, 0x79, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x1a, 0x68, 0x0a, 0x0c,
  2420  	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
  2421  	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x42,
  2422  	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e,
  2423  	0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31,
  2424  	0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e,
  2425  	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c,
  2426  	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43,
  2427  	0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65,
  2428  	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18,
  2429  	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a,
  2430  	0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02,
  2431  	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x74,
  2432  	0x65, 0x72, 0x22, 0x64, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74,
  2433  	0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
  2434  	0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01,
  2435  	0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c,
  2436  	0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74,
  2437  	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x08,
  2438  	0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x22, 0xd3, 0x07, 0x0a, 0x16, 0x44, 0x69, 0x73,
  2439  	0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c,
  2440  	0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01,
  2441  	0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07,
  2442  	0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
  2443  	0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31,
  2444  	0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e,
  2445  	0x74, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
  2446  	0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
  2447  	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65,
  2448  	0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e,
  2449  	0x54, 0x69, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69,
  2450  	0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6c, 0x75,
  2451  	0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44,
  2452  	0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61,
  2453  	0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52,
  2454  	0x75, 0x6e, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e,
  2455  	0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x72, 0x69,
  2456  	0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x42,
  2457  	0x75, 0x69, 0x6c, 0x64, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x58, 0x0a, 0x0c,
  2458  	0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03,
  2459  	0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
  2460  	0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6c,
  2461  	0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x45, 0x78, 0x6f,
  2462  	0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72,
  2463  	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f,
  2464  	0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6c,
  2465  	0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e,
  2466  	0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x62, 0x75, 0x69,
  2467  	0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x67, 0x65,
  2468  	0x73, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
  2469  	0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74,
  2470  	0x65, 0x64, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x43,
  2471  	0x0a, 0x1e, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e,
  2472  	0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64,
  2473  	0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x69, 0x73, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74,
  2474  	0x65, 0x64, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63,
  2475  	0x6b, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x69, 0x73,
  2476  	0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e,
  2477  	0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e,
  2478  	0x67, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x69,
  2479  	0x73, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01,
  2480  	0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x4a, 0x0a, 0x0b, 0x45, 0x78, 0x6f,
  2481  	0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73,
  2482  	0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e,
  2483  	0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x6f, 0x6e,
  2484  	0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72,
  2485  	0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0xe6, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62,
  2486  	0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62,
  2487  	0x6d, 0x69, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
  2488  	0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2489  	0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e,
  2490  	0x49, 0x64, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e,
  2491  	0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28,
  2492  	0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65,
  2493  	0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e,
  2494  	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62,
  2495  	0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65,
  2496  	0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e,
  2497  	0x32, 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2498  	0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e,
  2499  	0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x43,
  2500  	0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78,
  2501  	0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69,
  2502  	0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70,
  2503  	0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72,
  2504  	0x65, 0x6e, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75,
  2505  	0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65,
  2506  	0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
  2507  	0x73, 0x65, 0x12, 0x53, 0x0a, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61,
  2508  	0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6c, 0x75, 0x63, 0x69,
  2509  	0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75,
  2510  	0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65,
  2511  	0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x0c, 0x74, 0x65, 0x73, 0x74, 0x56,
  2512  	0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x22, 0xf5, 0x01, 0x0a, 0x1c, 0x43, 0x6c, 0x75, 0x73,
  2513  	0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73,
  2514  	0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x73, 0x74,
  2515  	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x73, 0x74, 0x49,
  2516  	0x64, 0x12, 0x33, 0x0a, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01,
  2517  	0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
  2518  	0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x07, 0x76,
  2519  	0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63,
  2520  	0x61, 0x6c, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x6f, 0x6e,
  2521  	0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x63, 0x72,
  2522  	0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x45, 0x78,
  2523  	0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74,
  2524  	0x5f, 0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
  2525  	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
  2526  	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f,
  2527  	0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
  2528  	0x4a, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45,
  2529  	0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72,
  2530  	0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75,
  2531  	0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,
  2532  	0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x31,
  2533  	0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e,
  2534  	0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e,
  2535  	0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
  2536  	0x65, 0x12, 0x68, 0x0a, 0x15, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e,
  2537  	0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
  2538  	0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2539  	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65,
  2540  	0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74,
  2541  	0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x13, 0x74, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69,
  2542  	0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x22,
  2543  	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65,
  2544  	0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e,
  2545  	0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20,
  2546  	0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x07,
  2547  	0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74,
  2548  	0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74,
  2549  	0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e,
  2550  	0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e,
  2551  	0x74, 0x52, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x73, 0x6f,
  2552  	0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b,
  2553  	0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76,
  2554  	0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x52, 0x09, 0x73, 0x6f, 0x75,
  2555  	0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63,
  2556  	0x61, 0x6c, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x6f, 0x6e,
  2557  	0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x63, 0x72,
  2558  	0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x45, 0x78,
  2559  	0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74,
  2560  	0x5f, 0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01,
  2561  	0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
  2562  	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f,
  2563  	0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
  2564  	0x8b, 0x01, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2565  	0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18,
  2566  	0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
  2567  	0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c,
  2568  	0x75, 0x72, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
  2569  	0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12,
  2570  	0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64,
  2571  	0x61, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x04,
  2572  	0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x56, 0x0a,
  2573  	0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73,
  2574  	0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x04,
  2575  	0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63,
  2576  	0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c,
  2577  	0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x79, 0x52,
  2578  	0x04, 0x64, 0x61, 0x79, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65,
  2579  	0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x79, 0x12, 0x4a, 0x0a, 0x07, 0x6d,
  2580  	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6c,
  2581  	0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e,
  2582  	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x61,
  2583  	0x79, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07,
  2584  	0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18,
  2585  	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d,
  2586  	0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
  2587  	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
  2588  	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61,
  2589  	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x4f, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74,
  2590  	0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x24, 0x0a,
  2591  	0x20, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59,
  2592  	0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
  2593  	0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x08,
  2594  	0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x02, 0x32, 0xcf, 0x07, 0x0a, 0x08, 0x43, 0x6c, 0x75,
  2595  	0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2596  	0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2597  	0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
  2598  	0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73,
  2599  	0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73,
  2600  	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x23,
  2601  	0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76,
  2602  	0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
  2603  	0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79,
  2604  	0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x00,
  2605  	0x12, 0x75, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2606  	0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x2e, 0x6c, 0x75,
  2607  	0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47,
  2608  	0x65, 0x74, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72,
  2609  	0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e,
  2610  	0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31,
  2611  	0x2e, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f,
  2612  	0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79,
  2613  	0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73,
  2614  	0x12, 0x2e, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2615  	0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2616  	0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
  2617  	0x1a, 0x2f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2618  	0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2619  	0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
  2620  	0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73,
  2621  	0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x6c, 0x75,
  2622  	0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51,
  2623  	0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75,
  2624  	0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6c, 0x75, 0x63,
  2625  	0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75,
  2626  	0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72,
  2627  	0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9a, 0x01, 0x0a,
  2628  	0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64,
  2629  	0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x6c,
  2630  	0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e,
  2631  	0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e,
  2632  	0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e,
  2633  	0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x6c, 0x75, 0x63, 0x69,
  2634  	0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65,
  2635  	0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61,
  2636  	0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x52,
  2637  	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xaf, 0x01, 0x0a, 0x22, 0x51, 0x75,
  2638  	0x65, 0x72, 0x79, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73,
  2639  	0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73,
  2640  	0x12, 0x42, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73,
  2641  	0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72,
  2642  	0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61,
  2643  	0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71,
  2644  	0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c,
  2645  	0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75,
  2646  	0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65,
  2647  	0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65,
  2648  	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x0c, 0x51,
  2649  	0x75, 0x65, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x2e, 0x6c, 0x75,
  2650  	0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51,
  2651  	0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f,
  2652  	0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x75, 0x63, 0x69,
  2653  	0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65,
  2654  	0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79,
  2655  	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x6f,
  2656  	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75,
  2657  	0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74,
  2658  	0x6f, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x70, 0x62, 0x62,
  2659  	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
  2660  }
  2661  
  2662  var (
  2663  	file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescOnce sync.Once
  2664  	file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData = file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc
  2665  )
  2666  
  2667  func file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP() []byte {
  2668  	file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescOnce.Do(func() {
  2669  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData)
  2670  	})
  2671  	return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData
  2672  }
  2673  
  2674  var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
  2675  var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes = make([]protoimpl.MessageInfo, 33)
  2676  var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_goTypes = []interface{}{
  2677  	(ClusterSummaryView)(0),                                   // 0: luci.analysis.v1.ClusterSummaryView
  2678  	(*ClusterRequest)(nil),                                    // 1: luci.analysis.v1.ClusterRequest
  2679  	(*ClusterResponse)(nil),                                   // 2: luci.analysis.v1.ClusterResponse
  2680  	(*ClusteringVersion)(nil),                                 // 3: luci.analysis.v1.ClusteringVersion
  2681  	(*GetClusterRequest)(nil),                                 // 4: luci.analysis.v1.GetClusterRequest
  2682  	(*Cluster)(nil),                                           // 5: luci.analysis.v1.Cluster
  2683  	(*GetReclusteringProgressRequest)(nil),                    // 6: luci.analysis.v1.GetReclusteringProgressRequest
  2684  	(*ReclusteringProgress)(nil),                              // 7: luci.analysis.v1.ReclusteringProgress
  2685  	(*QueryClusterSummariesRequest)(nil),                      // 8: luci.analysis.v1.QueryClusterSummariesRequest
  2686  	(*QueryClusterSummariesResponse)(nil),                     // 9: luci.analysis.v1.QueryClusterSummariesResponse
  2687  	(*ClusterSummary)(nil),                                    // 10: luci.analysis.v1.ClusterSummary
  2688  	(*QueryClusterFailuresRequest)(nil),                       // 11: luci.analysis.v1.QueryClusterFailuresRequest
  2689  	(*QueryClusterFailuresResponse)(nil),                      // 12: luci.analysis.v1.QueryClusterFailuresResponse
  2690  	(*DistinctClusterFailure)(nil),                            // 13: luci.analysis.v1.DistinctClusterFailure
  2691  	(*QueryClusterExoneratedTestVariantsRequest)(nil),         // 14: luci.analysis.v1.QueryClusterExoneratedTestVariantsRequest
  2692  	(*QueryClusterExoneratedTestVariantsResponse)(nil),        // 15: luci.analysis.v1.QueryClusterExoneratedTestVariantsResponse
  2693  	(*ClusterExoneratedTestVariant)(nil),                      // 16: luci.analysis.v1.ClusterExoneratedTestVariant
  2694  	(*QueryClusterExoneratedTestVariantBranchesRequest)(nil),  // 17: luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesRequest
  2695  	(*QueryClusterExoneratedTestVariantBranchesResponse)(nil), // 18: luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesResponse
  2696  	(*ClusterExoneratedTestVariantBranch)(nil),                // 19: luci.analysis.v1.ClusterExoneratedTestVariantBranch
  2697  	(*QueryClusterHistoryRequest)(nil),                        // 20: luci.analysis.v1.QueryClusterHistoryRequest
  2698  	(*QueryClusterHistoryResponse)(nil),                       // 21: luci.analysis.v1.QueryClusterHistoryResponse
  2699  	(*ClusterHistoryDay)(nil),                                 // 22: luci.analysis.v1.ClusterHistoryDay
  2700  	(*ClusterRequest_TestResult)(nil),                         // 23: luci.analysis.v1.ClusterRequest.TestResult
  2701  	(*ClusterResponse_ClusteredTestResult)(nil),               // 24: luci.analysis.v1.ClusterResponse.ClusteredTestResult
  2702  	(*ClusterResponse_ClusteredTestResult_ClusterEntry)(nil),  // 25: luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry
  2703  	(*Cluster_Counts)(nil),                                    // 26: luci.analysis.v1.Cluster.Counts
  2704  	(*Cluster_TimewiseCounts)(nil),                            // 27: luci.analysis.v1.Cluster.TimewiseCounts
  2705  	nil,                                                       // 28: luci.analysis.v1.Cluster.MetricsEntry
  2706  	(*ClusterSummary_MetricValue)(nil),                        // 29: luci.analysis.v1.ClusterSummary.MetricValue
  2707  	nil,                                                       // 30: luci.analysis.v1.ClusterSummary.MetricsEntry
  2708  	(*DistinctClusterFailure_Exoneration)(nil),                // 31: luci.analysis.v1.DistinctClusterFailure.Exoneration
  2709  	(*DistinctClusterFailure_PresubmitRun)(nil),               // 32: luci.analysis.v1.DistinctClusterFailure.PresubmitRun
  2710  	nil,                           // 33: luci.analysis.v1.ClusterHistoryDay.MetricsEntry
  2711  	(*timestamppb.Timestamp)(nil), // 34: google.protobuf.Timestamp
  2712  	(*TimeRange)(nil),             // 35: luci.analysis.v1.TimeRange
  2713  	(*ClusterId)(nil),             // 36: luci.analysis.v1.ClusterId
  2714  	(*AssociatedBug)(nil),         // 37: luci.analysis.v1.AssociatedBug
  2715  	(*Variant)(nil),               // 38: luci.analysis.v1.Variant
  2716  	(BuildStatus)(0),              // 39: luci.analysis.v1.BuildStatus
  2717  	(*Changelist)(nil),            // 40: luci.analysis.v1.Changelist
  2718  	(*SourceRef)(nil),             // 41: luci.analysis.v1.SourceRef
  2719  	(*FailureReason)(nil),         // 42: luci.analysis.v1.FailureReason
  2720  	(ExonerationReason)(0),        // 43: luci.analysis.v1.ExonerationReason
  2721  	(*PresubmitRunId)(nil),        // 44: luci.analysis.v1.PresubmitRunId
  2722  	(PresubmitRunMode)(0),         // 45: luci.analysis.v1.PresubmitRunMode
  2723  	(PresubmitRunStatus)(0),       // 46: luci.analysis.v1.PresubmitRunStatus
  2724  }
  2725  var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_depIdxs = []int32{
  2726  	23, // 0: luci.analysis.v1.ClusterRequest.test_results:type_name -> luci.analysis.v1.ClusterRequest.TestResult
  2727  	24, // 1: luci.analysis.v1.ClusterResponse.clustered_test_results:type_name -> luci.analysis.v1.ClusterResponse.ClusteredTestResult
  2728  	3,  // 2: luci.analysis.v1.ClusterResponse.clustering_version:type_name -> luci.analysis.v1.ClusteringVersion
  2729  	34, // 3: luci.analysis.v1.ClusteringVersion.rules_version:type_name -> google.protobuf.Timestamp
  2730  	34, // 4: luci.analysis.v1.ClusteringVersion.config_version:type_name -> google.protobuf.Timestamp
  2731  	28, // 5: luci.analysis.v1.Cluster.metrics:type_name -> luci.analysis.v1.Cluster.MetricsEntry
  2732  	3,  // 6: luci.analysis.v1.ReclusteringProgress.last:type_name -> luci.analysis.v1.ClusteringVersion
  2733  	3,  // 7: luci.analysis.v1.ReclusteringProgress.next:type_name -> luci.analysis.v1.ClusteringVersion
  2734  	35, // 8: luci.analysis.v1.QueryClusterSummariesRequest.time_range:type_name -> luci.analysis.v1.TimeRange
  2735  	0,  // 9: luci.analysis.v1.QueryClusterSummariesRequest.view:type_name -> luci.analysis.v1.ClusterSummaryView
  2736  	10, // 10: luci.analysis.v1.QueryClusterSummariesResponse.cluster_summaries:type_name -> luci.analysis.v1.ClusterSummary
  2737  	36, // 11: luci.analysis.v1.ClusterSummary.cluster_id:type_name -> luci.analysis.v1.ClusterId
  2738  	37, // 12: luci.analysis.v1.ClusterSummary.bug:type_name -> luci.analysis.v1.AssociatedBug
  2739  	30, // 13: luci.analysis.v1.ClusterSummary.metrics:type_name -> luci.analysis.v1.ClusterSummary.MetricsEntry
  2740  	13, // 14: luci.analysis.v1.QueryClusterFailuresResponse.failures:type_name -> luci.analysis.v1.DistinctClusterFailure
  2741  	38, // 15: luci.analysis.v1.DistinctClusterFailure.variant:type_name -> luci.analysis.v1.Variant
  2742  	34, // 16: luci.analysis.v1.DistinctClusterFailure.partition_time:type_name -> google.protobuf.Timestamp
  2743  	32, // 17: luci.analysis.v1.DistinctClusterFailure.presubmit_run:type_name -> luci.analysis.v1.DistinctClusterFailure.PresubmitRun
  2744  	31, // 18: luci.analysis.v1.DistinctClusterFailure.exonerations:type_name -> luci.analysis.v1.DistinctClusterFailure.Exoneration
  2745  	39, // 19: luci.analysis.v1.DistinctClusterFailure.build_status:type_name -> luci.analysis.v1.BuildStatus
  2746  	40, // 20: luci.analysis.v1.DistinctClusterFailure.changelists:type_name -> luci.analysis.v1.Changelist
  2747  	16, // 21: luci.analysis.v1.QueryClusterExoneratedTestVariantsResponse.test_variants:type_name -> luci.analysis.v1.ClusterExoneratedTestVariant
  2748  	38, // 22: luci.analysis.v1.ClusterExoneratedTestVariant.variant:type_name -> luci.analysis.v1.Variant
  2749  	34, // 23: luci.analysis.v1.ClusterExoneratedTestVariant.last_exoneration:type_name -> google.protobuf.Timestamp
  2750  	19, // 24: luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesResponse.test_variant_branches:type_name -> luci.analysis.v1.ClusterExoneratedTestVariantBranch
  2751  	38, // 25: luci.analysis.v1.ClusterExoneratedTestVariantBranch.variant:type_name -> luci.analysis.v1.Variant
  2752  	41, // 26: luci.analysis.v1.ClusterExoneratedTestVariantBranch.source_ref:type_name -> luci.analysis.v1.SourceRef
  2753  	34, // 27: luci.analysis.v1.ClusterExoneratedTestVariantBranch.last_exoneration:type_name -> google.protobuf.Timestamp
  2754  	22, // 28: luci.analysis.v1.QueryClusterHistoryResponse.days:type_name -> luci.analysis.v1.ClusterHistoryDay
  2755  	33, // 29: luci.analysis.v1.ClusterHistoryDay.metrics:type_name -> luci.analysis.v1.ClusterHistoryDay.MetricsEntry
  2756  	42, // 30: luci.analysis.v1.ClusterRequest.TestResult.failure_reason:type_name -> luci.analysis.v1.FailureReason
  2757  	25, // 31: luci.analysis.v1.ClusterResponse.ClusteredTestResult.clusters:type_name -> luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry
  2758  	36, // 32: luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry.cluster_id:type_name -> luci.analysis.v1.ClusterId
  2759  	37, // 33: luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry.bug:type_name -> luci.analysis.v1.AssociatedBug
  2760  	26, // 34: luci.analysis.v1.Cluster.TimewiseCounts.one_day:type_name -> luci.analysis.v1.Cluster.Counts
  2761  	26, // 35: luci.analysis.v1.Cluster.TimewiseCounts.three_day:type_name -> luci.analysis.v1.Cluster.Counts
  2762  	26, // 36: luci.analysis.v1.Cluster.TimewiseCounts.seven_day:type_name -> luci.analysis.v1.Cluster.Counts
  2763  	27, // 37: luci.analysis.v1.Cluster.MetricsEntry.value:type_name -> luci.analysis.v1.Cluster.TimewiseCounts
  2764  	29, // 38: luci.analysis.v1.ClusterSummary.MetricsEntry.value:type_name -> luci.analysis.v1.ClusterSummary.MetricValue
  2765  	43, // 39: luci.analysis.v1.DistinctClusterFailure.Exoneration.reason:type_name -> luci.analysis.v1.ExonerationReason
  2766  	44, // 40: luci.analysis.v1.DistinctClusterFailure.PresubmitRun.presubmit_run_id:type_name -> luci.analysis.v1.PresubmitRunId
  2767  	45, // 41: luci.analysis.v1.DistinctClusterFailure.PresubmitRun.mode:type_name -> luci.analysis.v1.PresubmitRunMode
  2768  	46, // 42: luci.analysis.v1.DistinctClusterFailure.PresubmitRun.status:type_name -> luci.analysis.v1.PresubmitRunStatus
  2769  	1,  // 43: luci.analysis.v1.Clusters.Cluster:input_type -> luci.analysis.v1.ClusterRequest
  2770  	4,  // 44: luci.analysis.v1.Clusters.Get:input_type -> luci.analysis.v1.GetClusterRequest
  2771  	6,  // 45: luci.analysis.v1.Clusters.GetReclusteringProgress:input_type -> luci.analysis.v1.GetReclusteringProgressRequest
  2772  	8,  // 46: luci.analysis.v1.Clusters.QueryClusterSummaries:input_type -> luci.analysis.v1.QueryClusterSummariesRequest
  2773  	11, // 47: luci.analysis.v1.Clusters.QueryClusterFailures:input_type -> luci.analysis.v1.QueryClusterFailuresRequest
  2774  	14, // 48: luci.analysis.v1.Clusters.QueryExoneratedTestVariants:input_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantsRequest
  2775  	17, // 49: luci.analysis.v1.Clusters.QueryExoneratedTestVariantBranches:input_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesRequest
  2776  	20, // 50: luci.analysis.v1.Clusters.QueryHistory:input_type -> luci.analysis.v1.QueryClusterHistoryRequest
  2777  	2,  // 51: luci.analysis.v1.Clusters.Cluster:output_type -> luci.analysis.v1.ClusterResponse
  2778  	5,  // 52: luci.analysis.v1.Clusters.Get:output_type -> luci.analysis.v1.Cluster
  2779  	7,  // 53: luci.analysis.v1.Clusters.GetReclusteringProgress:output_type -> luci.analysis.v1.ReclusteringProgress
  2780  	9,  // 54: luci.analysis.v1.Clusters.QueryClusterSummaries:output_type -> luci.analysis.v1.QueryClusterSummariesResponse
  2781  	12, // 55: luci.analysis.v1.Clusters.QueryClusterFailures:output_type -> luci.analysis.v1.QueryClusterFailuresResponse
  2782  	15, // 56: luci.analysis.v1.Clusters.QueryExoneratedTestVariants:output_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantsResponse
  2783  	18, // 57: luci.analysis.v1.Clusters.QueryExoneratedTestVariantBranches:output_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesResponse
  2784  	21, // 58: luci.analysis.v1.Clusters.QueryHistory:output_type -> luci.analysis.v1.QueryClusterHistoryResponse
  2785  	51, // [51:59] is the sub-list for method output_type
  2786  	43, // [43:51] is the sub-list for method input_type
  2787  	43, // [43:43] is the sub-list for extension type_name
  2788  	43, // [43:43] is the sub-list for extension extendee
  2789  	0,  // [0:43] is the sub-list for field type_name
  2790  }
  2791  
  2792  func init() { file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_init() }
  2793  func file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_init() {
  2794  	if File_go_chromium_org_luci_analysis_proto_v1_clusters_proto != nil {
  2795  		return
  2796  	}
  2797  	file_go_chromium_org_luci_analysis_proto_v1_common_proto_init()
  2798  	file_go_chromium_org_luci_analysis_proto_v1_sources_proto_init()
  2799  	file_go_chromium_org_luci_analysis_proto_v1_failure_reason_proto_init()
  2800  	if !protoimpl.UnsafeEnabled {
  2801  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
  2802  			switch v := v.(*ClusterRequest); i {
  2803  			case 0:
  2804  				return &v.state
  2805  			case 1:
  2806  				return &v.sizeCache
  2807  			case 2:
  2808  				return &v.unknownFields
  2809  			default:
  2810  				return nil
  2811  			}
  2812  		}
  2813  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
  2814  			switch v := v.(*ClusterResponse); i {
  2815  			case 0:
  2816  				return &v.state
  2817  			case 1:
  2818  				return &v.sizeCache
  2819  			case 2:
  2820  				return &v.unknownFields
  2821  			default:
  2822  				return nil
  2823  			}
  2824  		}
  2825  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
  2826  			switch v := v.(*ClusteringVersion); i {
  2827  			case 0:
  2828  				return &v.state
  2829  			case 1:
  2830  				return &v.sizeCache
  2831  			case 2:
  2832  				return &v.unknownFields
  2833  			default:
  2834  				return nil
  2835  			}
  2836  		}
  2837  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
  2838  			switch v := v.(*GetClusterRequest); i {
  2839  			case 0:
  2840  				return &v.state
  2841  			case 1:
  2842  				return &v.sizeCache
  2843  			case 2:
  2844  				return &v.unknownFields
  2845  			default:
  2846  				return nil
  2847  			}
  2848  		}
  2849  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
  2850  			switch v := v.(*Cluster); i {
  2851  			case 0:
  2852  				return &v.state
  2853  			case 1:
  2854  				return &v.sizeCache
  2855  			case 2:
  2856  				return &v.unknownFields
  2857  			default:
  2858  				return nil
  2859  			}
  2860  		}
  2861  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
  2862  			switch v := v.(*GetReclusteringProgressRequest); i {
  2863  			case 0:
  2864  				return &v.state
  2865  			case 1:
  2866  				return &v.sizeCache
  2867  			case 2:
  2868  				return &v.unknownFields
  2869  			default:
  2870  				return nil
  2871  			}
  2872  		}
  2873  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
  2874  			switch v := v.(*ReclusteringProgress); i {
  2875  			case 0:
  2876  				return &v.state
  2877  			case 1:
  2878  				return &v.sizeCache
  2879  			case 2:
  2880  				return &v.unknownFields
  2881  			default:
  2882  				return nil
  2883  			}
  2884  		}
  2885  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
  2886  			switch v := v.(*QueryClusterSummariesRequest); i {
  2887  			case 0:
  2888  				return &v.state
  2889  			case 1:
  2890  				return &v.sizeCache
  2891  			case 2:
  2892  				return &v.unknownFields
  2893  			default:
  2894  				return nil
  2895  			}
  2896  		}
  2897  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
  2898  			switch v := v.(*QueryClusterSummariesResponse); i {
  2899  			case 0:
  2900  				return &v.state
  2901  			case 1:
  2902  				return &v.sizeCache
  2903  			case 2:
  2904  				return &v.unknownFields
  2905  			default:
  2906  				return nil
  2907  			}
  2908  		}
  2909  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
  2910  			switch v := v.(*ClusterSummary); i {
  2911  			case 0:
  2912  				return &v.state
  2913  			case 1:
  2914  				return &v.sizeCache
  2915  			case 2:
  2916  				return &v.unknownFields
  2917  			default:
  2918  				return nil
  2919  			}
  2920  		}
  2921  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
  2922  			switch v := v.(*QueryClusterFailuresRequest); i {
  2923  			case 0:
  2924  				return &v.state
  2925  			case 1:
  2926  				return &v.sizeCache
  2927  			case 2:
  2928  				return &v.unknownFields
  2929  			default:
  2930  				return nil
  2931  			}
  2932  		}
  2933  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
  2934  			switch v := v.(*QueryClusterFailuresResponse); i {
  2935  			case 0:
  2936  				return &v.state
  2937  			case 1:
  2938  				return &v.sizeCache
  2939  			case 2:
  2940  				return &v.unknownFields
  2941  			default:
  2942  				return nil
  2943  			}
  2944  		}
  2945  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
  2946  			switch v := v.(*DistinctClusterFailure); i {
  2947  			case 0:
  2948  				return &v.state
  2949  			case 1:
  2950  				return &v.sizeCache
  2951  			case 2:
  2952  				return &v.unknownFields
  2953  			default:
  2954  				return nil
  2955  			}
  2956  		}
  2957  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
  2958  			switch v := v.(*QueryClusterExoneratedTestVariantsRequest); i {
  2959  			case 0:
  2960  				return &v.state
  2961  			case 1:
  2962  				return &v.sizeCache
  2963  			case 2:
  2964  				return &v.unknownFields
  2965  			default:
  2966  				return nil
  2967  			}
  2968  		}
  2969  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
  2970  			switch v := v.(*QueryClusterExoneratedTestVariantsResponse); i {
  2971  			case 0:
  2972  				return &v.state
  2973  			case 1:
  2974  				return &v.sizeCache
  2975  			case 2:
  2976  				return &v.unknownFields
  2977  			default:
  2978  				return nil
  2979  			}
  2980  		}
  2981  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
  2982  			switch v := v.(*ClusterExoneratedTestVariant); i {
  2983  			case 0:
  2984  				return &v.state
  2985  			case 1:
  2986  				return &v.sizeCache
  2987  			case 2:
  2988  				return &v.unknownFields
  2989  			default:
  2990  				return nil
  2991  			}
  2992  		}
  2993  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
  2994  			switch v := v.(*QueryClusterExoneratedTestVariantBranchesRequest); i {
  2995  			case 0:
  2996  				return &v.state
  2997  			case 1:
  2998  				return &v.sizeCache
  2999  			case 2:
  3000  				return &v.unknownFields
  3001  			default:
  3002  				return nil
  3003  			}
  3004  		}
  3005  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
  3006  			switch v := v.(*QueryClusterExoneratedTestVariantBranchesResponse); i {
  3007  			case 0:
  3008  				return &v.state
  3009  			case 1:
  3010  				return &v.sizeCache
  3011  			case 2:
  3012  				return &v.unknownFields
  3013  			default:
  3014  				return nil
  3015  			}
  3016  		}
  3017  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
  3018  			switch v := v.(*ClusterExoneratedTestVariantBranch); i {
  3019  			case 0:
  3020  				return &v.state
  3021  			case 1:
  3022  				return &v.sizeCache
  3023  			case 2:
  3024  				return &v.unknownFields
  3025  			default:
  3026  				return nil
  3027  			}
  3028  		}
  3029  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
  3030  			switch v := v.(*QueryClusterHistoryRequest); i {
  3031  			case 0:
  3032  				return &v.state
  3033  			case 1:
  3034  				return &v.sizeCache
  3035  			case 2:
  3036  				return &v.unknownFields
  3037  			default:
  3038  				return nil
  3039  			}
  3040  		}
  3041  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
  3042  			switch v := v.(*QueryClusterHistoryResponse); i {
  3043  			case 0:
  3044  				return &v.state
  3045  			case 1:
  3046  				return &v.sizeCache
  3047  			case 2:
  3048  				return &v.unknownFields
  3049  			default:
  3050  				return nil
  3051  			}
  3052  		}
  3053  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
  3054  			switch v := v.(*ClusterHistoryDay); i {
  3055  			case 0:
  3056  				return &v.state
  3057  			case 1:
  3058  				return &v.sizeCache
  3059  			case 2:
  3060  				return &v.unknownFields
  3061  			default:
  3062  				return nil
  3063  			}
  3064  		}
  3065  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
  3066  			switch v := v.(*ClusterRequest_TestResult); i {
  3067  			case 0:
  3068  				return &v.state
  3069  			case 1:
  3070  				return &v.sizeCache
  3071  			case 2:
  3072  				return &v.unknownFields
  3073  			default:
  3074  				return nil
  3075  			}
  3076  		}
  3077  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
  3078  			switch v := v.(*ClusterResponse_ClusteredTestResult); i {
  3079  			case 0:
  3080  				return &v.state
  3081  			case 1:
  3082  				return &v.sizeCache
  3083  			case 2:
  3084  				return &v.unknownFields
  3085  			default:
  3086  				return nil
  3087  			}
  3088  		}
  3089  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
  3090  			switch v := v.(*ClusterResponse_ClusteredTestResult_ClusterEntry); i {
  3091  			case 0:
  3092  				return &v.state
  3093  			case 1:
  3094  				return &v.sizeCache
  3095  			case 2:
  3096  				return &v.unknownFields
  3097  			default:
  3098  				return nil
  3099  			}
  3100  		}
  3101  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
  3102  			switch v := v.(*Cluster_Counts); i {
  3103  			case 0:
  3104  				return &v.state
  3105  			case 1:
  3106  				return &v.sizeCache
  3107  			case 2:
  3108  				return &v.unknownFields
  3109  			default:
  3110  				return nil
  3111  			}
  3112  		}
  3113  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
  3114  			switch v := v.(*Cluster_TimewiseCounts); i {
  3115  			case 0:
  3116  				return &v.state
  3117  			case 1:
  3118  				return &v.sizeCache
  3119  			case 2:
  3120  				return &v.unknownFields
  3121  			default:
  3122  				return nil
  3123  			}
  3124  		}
  3125  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
  3126  			switch v := v.(*ClusterSummary_MetricValue); i {
  3127  			case 0:
  3128  				return &v.state
  3129  			case 1:
  3130  				return &v.sizeCache
  3131  			case 2:
  3132  				return &v.unknownFields
  3133  			default:
  3134  				return nil
  3135  			}
  3136  		}
  3137  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
  3138  			switch v := v.(*DistinctClusterFailure_Exoneration); i {
  3139  			case 0:
  3140  				return &v.state
  3141  			case 1:
  3142  				return &v.sizeCache
  3143  			case 2:
  3144  				return &v.unknownFields
  3145  			default:
  3146  				return nil
  3147  			}
  3148  		}
  3149  		file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
  3150  			switch v := v.(*DistinctClusterFailure_PresubmitRun); i {
  3151  			case 0:
  3152  				return &v.state
  3153  			case 1:
  3154  				return &v.sizeCache
  3155  			case 2:
  3156  				return &v.unknownFields
  3157  			default:
  3158  				return nil
  3159  			}
  3160  		}
  3161  	}
  3162  	type x struct{}
  3163  	out := protoimpl.TypeBuilder{
  3164  		File: protoimpl.DescBuilder{
  3165  			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
  3166  			RawDescriptor: file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc,
  3167  			NumEnums:      1,
  3168  			NumMessages:   33,
  3169  			NumExtensions: 0,
  3170  			NumServices:   1,
  3171  		},
  3172  		GoTypes:           file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_goTypes,
  3173  		DependencyIndexes: file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_depIdxs,
  3174  		EnumInfos:         file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes,
  3175  		MessageInfos:      file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes,
  3176  	}.Build()
  3177  	File_go_chromium_org_luci_analysis_proto_v1_clusters_proto = out.File
  3178  	file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc = nil
  3179  	file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_goTypes = nil
  3180  	file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_depIdxs = nil
  3181  }
  3182  
  3183  // Reference imports to suppress errors if they are not otherwise used.
  3184  var _ context.Context
  3185  var _ grpc.ClientConnInterface
  3186  
  3187  // This is a compile-time assertion to ensure that this generated file
  3188  // is compatible with the grpc package it is being compiled against.
  3189  const _ = grpc.SupportPackageIsVersion6
  3190  
  3191  // ClustersClient is the client API for Clusters service.
  3192  //
  3193  // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
  3194  type ClustersClient interface {
  3195  	// Identifies the cluster(s) for one or more test failure(s).
  3196  	//
  3197  	// This RPC returns the clusters of each test result, using
  3198  	// current suggested cluster algorithms, configured failure
  3199  	// association rules, and ingested project configuration with
  3200  	// a bounded staleness of up to one minute. (Returned clusters
  3201  	// may be based on project configuration and configured failure
  3202  	// association rules that is up to one minute out-of-date).
  3203  	//
  3204  	// As at April 2022, the implementation does not use stale
  3205  	// rules, but you are instructed NOT to rely on this property to
  3206  	// allow reversion to the faster implementation that is tolerant
  3207  	// to higher QPS in future. If your use case require strong reads
  3208  	// (e.g. you want to call cluster immediately after updating a rule),
  3209  	// please contact LUCI Analysis owners. We may be able to provide a
  3210  	// request flag to select this processing behaviour.
  3211  	//
  3212  	// This RPC is a pure query API and does not lead to the ingestion of the
  3213  	// test failures by LUCI Analysis (e.g. for cluster impact calculations).
  3214  	Cluster(ctx context.Context, in *ClusterRequest, opts ...grpc.CallOption) (*ClusterResponse, error)
  3215  	// Reads information about the given cluster.
  3216  	//
  3217  	// Please consult LUCI Analysis owners before adding additional calls to
  3218  	// this RPC, as the implementation currently calls back to BigQuery and as
  3219  	// such, is not cost-optimised if many queries are to be made.
  3220  	//
  3221  	// As of writing (April 13, 2022) this query reads ~1 GB per call for
  3222  	// the largest LUCI Project, which translates to a cost of 0.5 US cents
  3223  	// per query at published pricing (US$5/TB analyzed for BigQuery).
  3224  	//
  3225  	// Changes to this RPC should comply with https://google.aip.dev/131.
  3226  	Get(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error)
  3227  	// Reads current progress re-clustering the given project. Re-clustering
  3228  	// means updating the clusters each failure is in to reflect the latest
  3229  	// failure association rules, suggested clustering algorithms and
  3230  	// clustering configuration.
  3231  	GetReclusteringProgress(ctx context.Context, in *GetReclusteringProgressRequest, opts ...grpc.CallOption) (*ReclusteringProgress, error)
  3232  	// Queries summary information about top clusters.
  3233  	//
  3234  	// The set of test failures used as input to the clustering can be
  3235  	// specified using the failure_filter field on the request.
  3236  	// The returned clusters include only the impact derived from the
  3237  	// filtered failures.
  3238  	//
  3239  	// This allows investigation of the highest impact clusters for some
  3240  	// subset of the failure data in a project. For example, a filter string
  3241  	// of "failure_reason:ssh" would find all of the clusters where any test
  3242  	// results mention "ssh" in their failure reason, and show how big the
  3243  	// impact from these ssh failures is in each cluster. This is useful when
  3244  	// investigating specific problems, or ownership areas of the tests.
  3245  	//
  3246  	// Please consult LUCI Analysis owners before adding additional calls
  3247  	// to this RPC, as the implementation currently calls back to BigQuery and as
  3248  	// such, is not cost-optimised if many queries are to be made.
  3249  	//
  3250  	// As of writing (April 13, 2022) this query reads up to 10 GB per call for
  3251  	// 7 days of data for the largest LUCI Project, which translates to a cost
  3252  	// of up to 5 US cents per query at published pricing
  3253  	// (US$5/TB analyzed for BigQuery).
  3254  	QueryClusterSummaries(ctx context.Context, in *QueryClusterSummariesRequest, opts ...grpc.CallOption) (*QueryClusterSummariesResponse, error)
  3255  	// Queries examples of failures in the given cluster.
  3256  	//
  3257  	// Please consult LUCI Analysis owners before adding additional calls to
  3258  	// this RPC, as the implementation currently calls back to BigQuery and as
  3259  	// such, is not cost-optimised if many queries are to be made.
  3260  	QueryClusterFailures(ctx context.Context, in *QueryClusterFailuresRequest, opts ...grpc.CallOption) (*QueryClusterFailuresResponse, error)
  3261  	// Queries test variants in the cluster which have recently had an
  3262  	// exoneration recorded against them. Only exonerations on failures
  3263  	// which are part of the cluster are considered.
  3264  	//
  3265  	// Consider solving this use case in future by a standard AIP-132 List
  3266  	// method with filter and order_by support.
  3267  	//
  3268  	// This RPC is useful for projects using the legacy QueryFailureRate
  3269  	// API for exoneration.
  3270  	QueryExoneratedTestVariants(ctx context.Context, in *QueryClusterExoneratedTestVariantsRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantsResponse, error)
  3271  	// Queries test variant branches in the cluster which have recently had
  3272  	// an exoneration recorded against them. Only exonerations on failures
  3273  	// which are part of the cluster are considered.
  3274  	//
  3275  	// Use for projects performing branch-scoped exoneration using
  3276  	// QueryStability.
  3277  	QueryExoneratedTestVariantBranches(ctx context.Context, in *QueryClusterExoneratedTestVariantBranchesRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantBranchesResponse, error)
  3278  	// Queries the history of metrics for clustered failures satisying given criteria.
  3279  	// For example the number of test runs failed on each day for the last 7 days.
  3280  	//
  3281  	// Please consult LUCI Analysis owners before adding additional calls to
  3282  	// this RPC, as the implementation currently calls back to BigQuery and as
  3283  	// such, is not cost-optimised if many queries are to be made.
  3284  	QueryHistory(ctx context.Context, in *QueryClusterHistoryRequest, opts ...grpc.CallOption) (*QueryClusterHistoryResponse, error)
  3285  }
  3286  type clustersPRPCClient struct {
  3287  	client *prpc.Client
  3288  }
  3289  
  3290  func NewClustersPRPCClient(client *prpc.Client) ClustersClient {
  3291  	return &clustersPRPCClient{client}
  3292  }
  3293  
  3294  func (c *clustersPRPCClient) Cluster(ctx context.Context, in *ClusterRequest, opts ...grpc.CallOption) (*ClusterResponse, error) {
  3295  	out := new(ClusterResponse)
  3296  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "Cluster", in, out, opts...)
  3297  	if err != nil {
  3298  		return nil, err
  3299  	}
  3300  	return out, nil
  3301  }
  3302  
  3303  func (c *clustersPRPCClient) Get(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error) {
  3304  	out := new(Cluster)
  3305  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "Get", in, out, opts...)
  3306  	if err != nil {
  3307  		return nil, err
  3308  	}
  3309  	return out, nil
  3310  }
  3311  
  3312  func (c *clustersPRPCClient) GetReclusteringProgress(ctx context.Context, in *GetReclusteringProgressRequest, opts ...grpc.CallOption) (*ReclusteringProgress, error) {
  3313  	out := new(ReclusteringProgress)
  3314  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "GetReclusteringProgress", in, out, opts...)
  3315  	if err != nil {
  3316  		return nil, err
  3317  	}
  3318  	return out, nil
  3319  }
  3320  
  3321  func (c *clustersPRPCClient) QueryClusterSummaries(ctx context.Context, in *QueryClusterSummariesRequest, opts ...grpc.CallOption) (*QueryClusterSummariesResponse, error) {
  3322  	out := new(QueryClusterSummariesResponse)
  3323  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryClusterSummaries", in, out, opts...)
  3324  	if err != nil {
  3325  		return nil, err
  3326  	}
  3327  	return out, nil
  3328  }
  3329  
  3330  func (c *clustersPRPCClient) QueryClusterFailures(ctx context.Context, in *QueryClusterFailuresRequest, opts ...grpc.CallOption) (*QueryClusterFailuresResponse, error) {
  3331  	out := new(QueryClusterFailuresResponse)
  3332  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryClusterFailures", in, out, opts...)
  3333  	if err != nil {
  3334  		return nil, err
  3335  	}
  3336  	return out, nil
  3337  }
  3338  
  3339  func (c *clustersPRPCClient) QueryExoneratedTestVariants(ctx context.Context, in *QueryClusterExoneratedTestVariantsRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantsResponse, error) {
  3340  	out := new(QueryClusterExoneratedTestVariantsResponse)
  3341  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryExoneratedTestVariants", in, out, opts...)
  3342  	if err != nil {
  3343  		return nil, err
  3344  	}
  3345  	return out, nil
  3346  }
  3347  
  3348  func (c *clustersPRPCClient) QueryExoneratedTestVariantBranches(ctx context.Context, in *QueryClusterExoneratedTestVariantBranchesRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantBranchesResponse, error) {
  3349  	out := new(QueryClusterExoneratedTestVariantBranchesResponse)
  3350  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryExoneratedTestVariantBranches", in, out, opts...)
  3351  	if err != nil {
  3352  		return nil, err
  3353  	}
  3354  	return out, nil
  3355  }
  3356  
  3357  func (c *clustersPRPCClient) QueryHistory(ctx context.Context, in *QueryClusterHistoryRequest, opts ...grpc.CallOption) (*QueryClusterHistoryResponse, error) {
  3358  	out := new(QueryClusterHistoryResponse)
  3359  	err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryHistory", in, out, opts...)
  3360  	if err != nil {
  3361  		return nil, err
  3362  	}
  3363  	return out, nil
  3364  }
  3365  
  3366  type clustersClient struct {
  3367  	cc grpc.ClientConnInterface
  3368  }
  3369  
  3370  func NewClustersClient(cc grpc.ClientConnInterface) ClustersClient {
  3371  	return &clustersClient{cc}
  3372  }
  3373  
  3374  func (c *clustersClient) Cluster(ctx context.Context, in *ClusterRequest, opts ...grpc.CallOption) (*ClusterResponse, error) {
  3375  	out := new(ClusterResponse)
  3376  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/Cluster", in, out, opts...)
  3377  	if err != nil {
  3378  		return nil, err
  3379  	}
  3380  	return out, nil
  3381  }
  3382  
  3383  func (c *clustersClient) Get(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error) {
  3384  	out := new(Cluster)
  3385  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/Get", in, out, opts...)
  3386  	if err != nil {
  3387  		return nil, err
  3388  	}
  3389  	return out, nil
  3390  }
  3391  
  3392  func (c *clustersClient) GetReclusteringProgress(ctx context.Context, in *GetReclusteringProgressRequest, opts ...grpc.CallOption) (*ReclusteringProgress, error) {
  3393  	out := new(ReclusteringProgress)
  3394  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/GetReclusteringProgress", in, out, opts...)
  3395  	if err != nil {
  3396  		return nil, err
  3397  	}
  3398  	return out, nil
  3399  }
  3400  
  3401  func (c *clustersClient) QueryClusterSummaries(ctx context.Context, in *QueryClusterSummariesRequest, opts ...grpc.CallOption) (*QueryClusterSummariesResponse, error) {
  3402  	out := new(QueryClusterSummariesResponse)
  3403  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryClusterSummaries", in, out, opts...)
  3404  	if err != nil {
  3405  		return nil, err
  3406  	}
  3407  	return out, nil
  3408  }
  3409  
  3410  func (c *clustersClient) QueryClusterFailures(ctx context.Context, in *QueryClusterFailuresRequest, opts ...grpc.CallOption) (*QueryClusterFailuresResponse, error) {
  3411  	out := new(QueryClusterFailuresResponse)
  3412  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryClusterFailures", in, out, opts...)
  3413  	if err != nil {
  3414  		return nil, err
  3415  	}
  3416  	return out, nil
  3417  }
  3418  
  3419  func (c *clustersClient) QueryExoneratedTestVariants(ctx context.Context, in *QueryClusterExoneratedTestVariantsRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantsResponse, error) {
  3420  	out := new(QueryClusterExoneratedTestVariantsResponse)
  3421  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryExoneratedTestVariants", in, out, opts...)
  3422  	if err != nil {
  3423  		return nil, err
  3424  	}
  3425  	return out, nil
  3426  }
  3427  
  3428  func (c *clustersClient) QueryExoneratedTestVariantBranches(ctx context.Context, in *QueryClusterExoneratedTestVariantBranchesRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantBranchesResponse, error) {
  3429  	out := new(QueryClusterExoneratedTestVariantBranchesResponse)
  3430  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryExoneratedTestVariantBranches", in, out, opts...)
  3431  	if err != nil {
  3432  		return nil, err
  3433  	}
  3434  	return out, nil
  3435  }
  3436  
  3437  func (c *clustersClient) QueryHistory(ctx context.Context, in *QueryClusterHistoryRequest, opts ...grpc.CallOption) (*QueryClusterHistoryResponse, error) {
  3438  	out := new(QueryClusterHistoryResponse)
  3439  	err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryHistory", in, out, opts...)
  3440  	if err != nil {
  3441  		return nil, err
  3442  	}
  3443  	return out, nil
  3444  }
  3445  
  3446  // ClustersServer is the server API for Clusters service.
  3447  type ClustersServer interface {
  3448  	// Identifies the cluster(s) for one or more test failure(s).
  3449  	//
  3450  	// This RPC returns the clusters of each test result, using
  3451  	// current suggested cluster algorithms, configured failure
  3452  	// association rules, and ingested project configuration with
  3453  	// a bounded staleness of up to one minute. (Returned clusters
  3454  	// may be based on project configuration and configured failure
  3455  	// association rules that is up to one minute out-of-date).
  3456  	//
  3457  	// As at April 2022, the implementation does not use stale
  3458  	// rules, but you are instructed NOT to rely on this property to
  3459  	// allow reversion to the faster implementation that is tolerant
  3460  	// to higher QPS in future. If your use case require strong reads
  3461  	// (e.g. you want to call cluster immediately after updating a rule),
  3462  	// please contact LUCI Analysis owners. We may be able to provide a
  3463  	// request flag to select this processing behaviour.
  3464  	//
  3465  	// This RPC is a pure query API and does not lead to the ingestion of the
  3466  	// test failures by LUCI Analysis (e.g. for cluster impact calculations).
  3467  	Cluster(context.Context, *ClusterRequest) (*ClusterResponse, error)
  3468  	// Reads information about the given cluster.
  3469  	//
  3470  	// Please consult LUCI Analysis owners before adding additional calls to
  3471  	// this RPC, as the implementation currently calls back to BigQuery and as
  3472  	// such, is not cost-optimised if many queries are to be made.
  3473  	//
  3474  	// As of writing (April 13, 2022) this query reads ~1 GB per call for
  3475  	// the largest LUCI Project, which translates to a cost of 0.5 US cents
  3476  	// per query at published pricing (US$5/TB analyzed for BigQuery).
  3477  	//
  3478  	// Changes to this RPC should comply with https://google.aip.dev/131.
  3479  	Get(context.Context, *GetClusterRequest) (*Cluster, error)
  3480  	// Reads current progress re-clustering the given project. Re-clustering
  3481  	// means updating the clusters each failure is in to reflect the latest
  3482  	// failure association rules, suggested clustering algorithms and
  3483  	// clustering configuration.
  3484  	GetReclusteringProgress(context.Context, *GetReclusteringProgressRequest) (*ReclusteringProgress, error)
  3485  	// Queries summary information about top clusters.
  3486  	//
  3487  	// The set of test failures used as input to the clustering can be
  3488  	// specified using the failure_filter field on the request.
  3489  	// The returned clusters include only the impact derived from the
  3490  	// filtered failures.
  3491  	//
  3492  	// This allows investigation of the highest impact clusters for some
  3493  	// subset of the failure data in a project. For example, a filter string
  3494  	// of "failure_reason:ssh" would find all of the clusters where any test
  3495  	// results mention "ssh" in their failure reason, and show how big the
  3496  	// impact from these ssh failures is in each cluster. This is useful when
  3497  	// investigating specific problems, or ownership areas of the tests.
  3498  	//
  3499  	// Please consult LUCI Analysis owners before adding additional calls
  3500  	// to this RPC, as the implementation currently calls back to BigQuery and as
  3501  	// such, is not cost-optimised if many queries are to be made.
  3502  	//
  3503  	// As of writing (April 13, 2022) this query reads up to 10 GB per call for
  3504  	// 7 days of data for the largest LUCI Project, which translates to a cost
  3505  	// of up to 5 US cents per query at published pricing
  3506  	// (US$5/TB analyzed for BigQuery).
  3507  	QueryClusterSummaries(context.Context, *QueryClusterSummariesRequest) (*QueryClusterSummariesResponse, error)
  3508  	// Queries examples of failures in the given cluster.
  3509  	//
  3510  	// Please consult LUCI Analysis owners before adding additional calls to
  3511  	// this RPC, as the implementation currently calls back to BigQuery and as
  3512  	// such, is not cost-optimised if many queries are to be made.
  3513  	QueryClusterFailures(context.Context, *QueryClusterFailuresRequest) (*QueryClusterFailuresResponse, error)
  3514  	// Queries test variants in the cluster which have recently had an
  3515  	// exoneration recorded against them. Only exonerations on failures
  3516  	// which are part of the cluster are considered.
  3517  	//
  3518  	// Consider solving this use case in future by a standard AIP-132 List
  3519  	// method with filter and order_by support.
  3520  	//
  3521  	// This RPC is useful for projects using the legacy QueryFailureRate
  3522  	// API for exoneration.
  3523  	QueryExoneratedTestVariants(context.Context, *QueryClusterExoneratedTestVariantsRequest) (*QueryClusterExoneratedTestVariantsResponse, error)
  3524  	// Queries test variant branches in the cluster which have recently had
  3525  	// an exoneration recorded against them. Only exonerations on failures
  3526  	// which are part of the cluster are considered.
  3527  	//
  3528  	// Use for projects performing branch-scoped exoneration using
  3529  	// QueryStability.
  3530  	QueryExoneratedTestVariantBranches(context.Context, *QueryClusterExoneratedTestVariantBranchesRequest) (*QueryClusterExoneratedTestVariantBranchesResponse, error)
  3531  	// Queries the history of metrics for clustered failures satisying given criteria.
  3532  	// For example the number of test runs failed on each day for the last 7 days.
  3533  	//
  3534  	// Please consult LUCI Analysis owners before adding additional calls to
  3535  	// this RPC, as the implementation currently calls back to BigQuery and as
  3536  	// such, is not cost-optimised if many queries are to be made.
  3537  	QueryHistory(context.Context, *QueryClusterHistoryRequest) (*QueryClusterHistoryResponse, error)
  3538  }
  3539  
  3540  // UnimplementedClustersServer can be embedded to have forward compatible implementations.
  3541  type UnimplementedClustersServer struct {
  3542  }
  3543  
  3544  func (*UnimplementedClustersServer) Cluster(context.Context, *ClusterRequest) (*ClusterResponse, error) {
  3545  	return nil, status.Errorf(codes.Unimplemented, "method Cluster not implemented")
  3546  }
  3547  func (*UnimplementedClustersServer) Get(context.Context, *GetClusterRequest) (*Cluster, error) {
  3548  	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
  3549  }
  3550  func (*UnimplementedClustersServer) GetReclusteringProgress(context.Context, *GetReclusteringProgressRequest) (*ReclusteringProgress, error) {
  3551  	return nil, status.Errorf(codes.Unimplemented, "method GetReclusteringProgress not implemented")
  3552  }
  3553  func (*UnimplementedClustersServer) QueryClusterSummaries(context.Context, *QueryClusterSummariesRequest) (*QueryClusterSummariesResponse, error) {
  3554  	return nil, status.Errorf(codes.Unimplemented, "method QueryClusterSummaries not implemented")
  3555  }
  3556  func (*UnimplementedClustersServer) QueryClusterFailures(context.Context, *QueryClusterFailuresRequest) (*QueryClusterFailuresResponse, error) {
  3557  	return nil, status.Errorf(codes.Unimplemented, "method QueryClusterFailures not implemented")
  3558  }
  3559  func (*UnimplementedClustersServer) QueryExoneratedTestVariants(context.Context, *QueryClusterExoneratedTestVariantsRequest) (*QueryClusterExoneratedTestVariantsResponse, error) {
  3560  	return nil, status.Errorf(codes.Unimplemented, "method QueryExoneratedTestVariants not implemented")
  3561  }
  3562  func (*UnimplementedClustersServer) QueryExoneratedTestVariantBranches(context.Context, *QueryClusterExoneratedTestVariantBranchesRequest) (*QueryClusterExoneratedTestVariantBranchesResponse, error) {
  3563  	return nil, status.Errorf(codes.Unimplemented, "method QueryExoneratedTestVariantBranches not implemented")
  3564  }
  3565  func (*UnimplementedClustersServer) QueryHistory(context.Context, *QueryClusterHistoryRequest) (*QueryClusterHistoryResponse, error) {
  3566  	return nil, status.Errorf(codes.Unimplemented, "method QueryHistory not implemented")
  3567  }
  3568  
  3569  func RegisterClustersServer(s prpc.Registrar, srv ClustersServer) {
  3570  	s.RegisterService(&_Clusters_serviceDesc, srv)
  3571  }
  3572  
  3573  func _Clusters_Cluster_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3574  	in := new(ClusterRequest)
  3575  	if err := dec(in); err != nil {
  3576  		return nil, err
  3577  	}
  3578  	if interceptor == nil {
  3579  		return srv.(ClustersServer).Cluster(ctx, in)
  3580  	}
  3581  	info := &grpc.UnaryServerInfo{
  3582  		Server:     srv,
  3583  		FullMethod: "/luci.analysis.v1.Clusters/Cluster",
  3584  	}
  3585  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3586  		return srv.(ClustersServer).Cluster(ctx, req.(*ClusterRequest))
  3587  	}
  3588  	return interceptor(ctx, in, info, handler)
  3589  }
  3590  
  3591  func _Clusters_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3592  	in := new(GetClusterRequest)
  3593  	if err := dec(in); err != nil {
  3594  		return nil, err
  3595  	}
  3596  	if interceptor == nil {
  3597  		return srv.(ClustersServer).Get(ctx, in)
  3598  	}
  3599  	info := &grpc.UnaryServerInfo{
  3600  		Server:     srv,
  3601  		FullMethod: "/luci.analysis.v1.Clusters/Get",
  3602  	}
  3603  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3604  		return srv.(ClustersServer).Get(ctx, req.(*GetClusterRequest))
  3605  	}
  3606  	return interceptor(ctx, in, info, handler)
  3607  }
  3608  
  3609  func _Clusters_GetReclusteringProgress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3610  	in := new(GetReclusteringProgressRequest)
  3611  	if err := dec(in); err != nil {
  3612  		return nil, err
  3613  	}
  3614  	if interceptor == nil {
  3615  		return srv.(ClustersServer).GetReclusteringProgress(ctx, in)
  3616  	}
  3617  	info := &grpc.UnaryServerInfo{
  3618  		Server:     srv,
  3619  		FullMethod: "/luci.analysis.v1.Clusters/GetReclusteringProgress",
  3620  	}
  3621  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3622  		return srv.(ClustersServer).GetReclusteringProgress(ctx, req.(*GetReclusteringProgressRequest))
  3623  	}
  3624  	return interceptor(ctx, in, info, handler)
  3625  }
  3626  
  3627  func _Clusters_QueryClusterSummaries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3628  	in := new(QueryClusterSummariesRequest)
  3629  	if err := dec(in); err != nil {
  3630  		return nil, err
  3631  	}
  3632  	if interceptor == nil {
  3633  		return srv.(ClustersServer).QueryClusterSummaries(ctx, in)
  3634  	}
  3635  	info := &grpc.UnaryServerInfo{
  3636  		Server:     srv,
  3637  		FullMethod: "/luci.analysis.v1.Clusters/QueryClusterSummaries",
  3638  	}
  3639  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3640  		return srv.(ClustersServer).QueryClusterSummaries(ctx, req.(*QueryClusterSummariesRequest))
  3641  	}
  3642  	return interceptor(ctx, in, info, handler)
  3643  }
  3644  
  3645  func _Clusters_QueryClusterFailures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3646  	in := new(QueryClusterFailuresRequest)
  3647  	if err := dec(in); err != nil {
  3648  		return nil, err
  3649  	}
  3650  	if interceptor == nil {
  3651  		return srv.(ClustersServer).QueryClusterFailures(ctx, in)
  3652  	}
  3653  	info := &grpc.UnaryServerInfo{
  3654  		Server:     srv,
  3655  		FullMethod: "/luci.analysis.v1.Clusters/QueryClusterFailures",
  3656  	}
  3657  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3658  		return srv.(ClustersServer).QueryClusterFailures(ctx, req.(*QueryClusterFailuresRequest))
  3659  	}
  3660  	return interceptor(ctx, in, info, handler)
  3661  }
  3662  
  3663  func _Clusters_QueryExoneratedTestVariants_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3664  	in := new(QueryClusterExoneratedTestVariantsRequest)
  3665  	if err := dec(in); err != nil {
  3666  		return nil, err
  3667  	}
  3668  	if interceptor == nil {
  3669  		return srv.(ClustersServer).QueryExoneratedTestVariants(ctx, in)
  3670  	}
  3671  	info := &grpc.UnaryServerInfo{
  3672  		Server:     srv,
  3673  		FullMethod: "/luci.analysis.v1.Clusters/QueryExoneratedTestVariants",
  3674  	}
  3675  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3676  		return srv.(ClustersServer).QueryExoneratedTestVariants(ctx, req.(*QueryClusterExoneratedTestVariantsRequest))
  3677  	}
  3678  	return interceptor(ctx, in, info, handler)
  3679  }
  3680  
  3681  func _Clusters_QueryExoneratedTestVariantBranches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3682  	in := new(QueryClusterExoneratedTestVariantBranchesRequest)
  3683  	if err := dec(in); err != nil {
  3684  		return nil, err
  3685  	}
  3686  	if interceptor == nil {
  3687  		return srv.(ClustersServer).QueryExoneratedTestVariantBranches(ctx, in)
  3688  	}
  3689  	info := &grpc.UnaryServerInfo{
  3690  		Server:     srv,
  3691  		FullMethod: "/luci.analysis.v1.Clusters/QueryExoneratedTestVariantBranches",
  3692  	}
  3693  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3694  		return srv.(ClustersServer).QueryExoneratedTestVariantBranches(ctx, req.(*QueryClusterExoneratedTestVariantBranchesRequest))
  3695  	}
  3696  	return interceptor(ctx, in, info, handler)
  3697  }
  3698  
  3699  func _Clusters_QueryHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
  3700  	in := new(QueryClusterHistoryRequest)
  3701  	if err := dec(in); err != nil {
  3702  		return nil, err
  3703  	}
  3704  	if interceptor == nil {
  3705  		return srv.(ClustersServer).QueryHistory(ctx, in)
  3706  	}
  3707  	info := &grpc.UnaryServerInfo{
  3708  		Server:     srv,
  3709  		FullMethod: "/luci.analysis.v1.Clusters/QueryHistory",
  3710  	}
  3711  	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
  3712  		return srv.(ClustersServer).QueryHistory(ctx, req.(*QueryClusterHistoryRequest))
  3713  	}
  3714  	return interceptor(ctx, in, info, handler)
  3715  }
  3716  
  3717  var _Clusters_serviceDesc = grpc.ServiceDesc{
  3718  	ServiceName: "luci.analysis.v1.Clusters",
  3719  	HandlerType: (*ClustersServer)(nil),
  3720  	Methods: []grpc.MethodDesc{
  3721  		{
  3722  			MethodName: "Cluster",
  3723  			Handler:    _Clusters_Cluster_Handler,
  3724  		},
  3725  		{
  3726  			MethodName: "Get",
  3727  			Handler:    _Clusters_Get_Handler,
  3728  		},
  3729  		{
  3730  			MethodName: "GetReclusteringProgress",
  3731  			Handler:    _Clusters_GetReclusteringProgress_Handler,
  3732  		},
  3733  		{
  3734  			MethodName: "QueryClusterSummaries",
  3735  			Handler:    _Clusters_QueryClusterSummaries_Handler,
  3736  		},
  3737  		{
  3738  			MethodName: "QueryClusterFailures",
  3739  			Handler:    _Clusters_QueryClusterFailures_Handler,
  3740  		},
  3741  		{
  3742  			MethodName: "QueryExoneratedTestVariants",
  3743  			Handler:    _Clusters_QueryExoneratedTestVariants_Handler,
  3744  		},
  3745  		{
  3746  			MethodName: "QueryExoneratedTestVariantBranches",
  3747  			Handler:    _Clusters_QueryExoneratedTestVariantBranches_Handler,
  3748  		},
  3749  		{
  3750  			MethodName: "QueryHistory",
  3751  			Handler:    _Clusters_QueryHistory_Handler,
  3752  		},
  3753  	},
  3754  	Streams:  []grpc.StreamDesc{},
  3755  	Metadata: "go.chromium.org/luci/analysis/proto/v1/clusters.proto",
  3756  }