Repository: google/trillian
Pull request #2243 (2020-10-22 18:34:07)

remove the TrillianLog.GetLeavesByHash API
Remove the `TrillianLog.GetLeavesByHash` API, as it is unused.

This is part of #2245.

### Checklist

<!---
Go over all the following points, and put an `x` in all the boxes that apply.
Feel free to not tick any boxes that don't apply to this PR (e.g. refactoring may not need a CHANGELOG update).
If you're unsure about any of these, don't hesitate to ask. We're here to help!
-->

- [x] I have updated the [CHANGELOG](CHANGELOG.md).
  - Adjust the draft version number according to [semantic versioning](https://semver.org/) rules.
- [ ] I have updated [documentation](docs/) accordingly (including the [feature implementation matrix](docs/Feature_Implementation_Matrix.md)).


codecov[bot]: # [Codecov](https://codecov.io/gh/google/trillian/pull/2243?src=pr&el=h1) Report
> Merging [#2243](https://codecov.io/gh/google/trillian/pull/2243?src=pr&el=desc) into [master](https://codecov.io/gh/google/trillian/commit/6ebfaa2cf73ddb47c32aa6f80999e705cbcbba0e?el=desc) will **decrease** coverage by `0.27%`.
> The diff coverage is `n/a`.

[![Impacted file tree graph](https://codecov.io/gh/google/trillian/pull/2243/graphs/tree.svg?width=650&height=150&src=pr&token=QwofUwmvAs)](https://codecov.io/gh/google/trillian/pull/2243?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master    #2243      +/-   ##
==========================================
- Coverage   64.70%   64.42%   -0.28%     
==========================================
  Files         115      115              
  Lines        8672     8636      -36     
==========================================
- Hits         5611     5564      -47     
- Misses       2414     2418       +4     
- Partials      647      654       +7     
```


| [Impacted Files](https://codecov.io/gh/google/trillian/pull/2243?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [server/interceptor/interceptor.go](https://codecov.io/gh/google/trillian/pull/2243/diff?src=pr&el=tree#diff-c2VydmVyL2ludGVyY2VwdG9yL2ludGVyY2VwdG9yLmdv) | `80.43% <ø> (+1.03%)` | :arrow_up: |
| [server/log\_rpc\_server.go](https://codecov.io/gh/google/trillian/pull/2243/diff?src=pr&el=tree#diff-c2VydmVyL2xvZ19ycGNfc2VydmVyLmdv) | `78.76% <ø> (-4.61%)` | :arrow_down: |
| [server/validate.go](https://codecov.io/gh/google/trillian/pull/2243/diff?src=pr&el=tree#diff-c2VydmVyL3ZhbGlkYXRlLmdv) | `93.33% <ø> (-0.52%)` | :arrow_down: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/google/trillian/pull/2243?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/google/trillian/pull/2243?src=pr&el=footer). Last update [6ebfaa2...8c7b775](https://codecov.io/gh/google/trillian/pull/2243?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54b3eee0..77a2437d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,7 @@
 ### Cleanup
  * Removed the deprecated crypto.NewSHA256Signer function.
  * Finish removing the `LogMetadata.GetUnsequencedCounts()` method.
+ * Removed `TrillianLog.GetLeavesByHash` API.
 
 ### Storage refactoring
  * `NodeReader.GetMerkleNodes` does not accept revisions anymore. The
diff --git a/README.md b/README.md
index c404c8cc..da24751b 100644
--- a/README.md
+++ b/README.md
@@ -306,9 +306,8 @@ similar to those available for Certificate Transparency logs
  - `GetLatestSignedLogRoot` returns information about the current root of the
    Merkle tree for the log, including the tree size, hash value, timestamp and
    signature.
- - `GetLeavesByHash`, `GetLeavesByIndex` and `GetLeavesByRange` return leaf
-   information for particular leaves, specified either by their hash value or
-   index in the log.
+ - `GetLeavesByIndex` and `GetLeavesByRange` return leaf information for
+   particular leaves, specified by their index in the log.
  - `QueueLeaves` requests inclusion of specified items into the log.
      - For a pre-ordered log, `AddSequencedLeaves` requests the inclusion of
        specified items into the log at specified places in the tree.
diff --git a/docs/TransparentLogging.md b/docs/TransparentLogging.md
index 742b45ec..fc32376e 100644
--- a/docs/TransparentLogging.md
+++ b/docs/TransparentLogging.md
@@ -105,9 +105,8 @@ that percolates up the Merkle tree and is therefore incorporated into the
 (signed) root hash for the Log; the cryptographic guarantees of the Log's Merkle
 tree only apply to data included in the Merkle hash.
 
-It is also the hash value that allows individual leaves to be retrieved, using
-the `trillian.GetLeavesByHash` entrypoint.  The default Merkle hash for a
-Trillian Log leaf is `SHA-256(0x00 | leaf.LeafValue)`.
+The default Merkle hash for a Trillian Log leaf is `SHA-256(0x00 |
+leaf.LeafValue)`.
 
  - For Certificate Transparency, this hash is defined by
    [RFC 6962](https://tools.ietf.org/html/rfc6962#section-3.4) to be the SHA-256
diff --git a/docs/api.md b/docs/api.md
index 1cb7abd2..07cbf630 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -19,8 +19,6 @@
     - [GetInclusionProofResponse](#trillian.GetInclusionProofResponse)
     - [GetLatestSignedLogRootRequest](#trillian.GetLatestSignedLogRootRequest)
     - [GetLatestSignedLogRootResponse](#trillian.GetLatestSignedLogRootResponse)
-    - [GetLeavesByHashRequest](#trillian.GetLeavesByHashRequest)
-    - [GetLeavesByHashResponse](#trillian.GetLeavesByHashResponse)
     - [GetLeavesByIndexRequest](#trillian.GetLeavesByIndexRequest)
     - [GetLeavesByIndexResponse](#trillian.GetLeavesByIndexResponse)
     - [GetLeavesByRangeRequest](#trillian.GetLeavesByRangeRequest)
@@ -324,40 +322,6 @@ As an example, a Certificate Transparency frontend might set the following user
 
 
 
-<a name="trillian.GetLeavesByHashRequest"></a>
-
-### GetLeavesByHashRequest
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| log_id | [int64](#int64) |  |  |
-| leaf_hash | [bytes](#bytes) | repeated | The Merkle leaf hash of the leaf to be retrieved. |
-| order_by_sequence | [bool](#bool) |  | If order_by_sequence is set then leaves will be returned in order of ascending leaf index. |
-| charge_to | [ChargeTo](#trillian.ChargeTo) |  |  |
-
-
-
-
-
-
-<a name="trillian.GetLeavesByHashResponse"></a>
-
-### GetLeavesByHashResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| leaves | [LogLeaf](#trillian.LogLeaf) | repeated |  |
-| signed_log_root | [SignedLogRoot](#trillian.SignedLogRoot) |  |  |
-
-
-
-
-
-
 <a name="trillian.GetLeavesByIndexRequest"></a>
 
 ### GetLeavesByIndexRequest
@@ -675,7 +639,6 @@ If the requested tree size is unavailable but the leaf is in scope for the curre
 | AddSequencedLeaves | [AddSequencedLeavesRequest](#trillian.AddSequencedLeavesRequest) | [AddSequencedLeavesResponse](#trillian.AddSequencedLeavesResponse) | AddSequencedLeaves adds a batch of leaves with assigned sequence numbers to a pre-ordered log. The indices of the provided leaves must be contiguous. |
 | GetLeavesByIndex | [GetLeavesByIndexRequest](#trillian.GetLeavesByIndexRequest) | [GetLeavesByIndexResponse](#trillian.GetLeavesByIndexResponse) | GetLeavesByIndex returns a batch of leaves whose leaf indices are provided in the request. |
 | GetLeavesByRange | [GetLeavesByRangeRequest](#trillian.GetLeavesByRangeRequest) | [GetLeavesByRangeResponse](#trillian.GetLeavesByRangeResponse) | GetLeavesByRange returns a batch of leaves whose leaf indices are in a sequential range. |
-| GetLeavesByHash | [GetLeavesByHashRequest](#trillian.GetLeavesByHashRequest) | [GetLeavesByHashResponse](#trillian.GetLeavesByHashResponse) | GetLeavesByHash returns a batch of leaves which are identified by their Merkle leaf hash values. |
 
  
 
diff --git a/server/interceptor/interceptor.go b/server/interceptor/interceptor.go
index 065f10ab..ece9ba91 100644
--- a/server/interceptor/interceptor.go
+++ b/server/interceptor/interceptor.go
@@ -388,9 +388,6 @@ func newRPCInfoForRequest(req interface{}) (*rpcInfo, error) {
 		*trillian.GetLatestSignedLogRootRequest:
 		info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG, trillian.TreeType_PREORDERED_LOG}
 		info.tokens = 1
-	case *trillian.GetLeavesByHashRequest:
-		info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG, trillian.TreeType_PREORDERED_LOG}
-		info.tokens = len(req.GetLeafHash())
 	case *trillian.GetLeavesByIndexRequest:
 		info.treeTypes = []trillian.TreeType{trillian.TreeType_LOG, trillian.TreeType_PREORDERED_LOG}
 		info.tokens = len(req.GetLeafIndex())
diff --git a/server/log_rpc_server.go b/server/log_rpc_server.go
index 9368451e..990c9ecd 100644
--- a/server/log_rpc_server.go
+++ b/server/log_rpc_server.go
@@ -580,53 +580,6 @@ func (t *TrillianLogRPCServer) GetLeavesByRange(ctx context.Context, req *trilli
 	return r, nil
 }
 
-// GetLeavesByHash obtains one or more leaves based on their tree hash. It is not possible
-// to fetch leaves that have been queued but not yet integrated. Logs may accept duplicate
-// entries so this may return more results than the number of hashes in the request.
-func (t *TrillianLogRPCServer) GetLeavesByHash(ctx context.Context, req *trillian.GetLeavesByHashRequest) (*trillian.GetLeavesByHashResponse, error) {
-	ctx, spanEnd := spanFor(ctx, "GetLeavesByHash")
-	defer spanEnd()
-
-	tree, hasher, err := t.getTreeAndHasher(ctx, req.LogId, optsLogRead)
-	if err != nil {
-		return nil, err
-	}
-	ctx = trees.NewContext(ctx, tree)
-
-	if err := validateGetLeavesByHashRequest(req, hasher); err != nil {
-		return nil, err
-	}
-	tx, err := t.snapshotForTree(ctx, tree, "GetLeavesByHash")
-	if err != nil {
-		return nil, err
-	}
-	defer t.closeAndLog(ctx, tree.TreeId, tx, "GetLeavesByHash")
-
-	leaves, err := tx.GetLeavesByHash(ctx, req.LeafHash, req.OrderBySequence)
-	if err != nil {
-		return nil, err
-	}
-	t.fetchedLeaves.Add(float64(len(leaves)))
-
-	slr, err := tx.LatestSignedLogRoot(ctx)
-	if err != nil {
-		return nil, err
-	}
-	var root types.LogRootV1
-	if err := root.UnmarshalBinary(slr.LogRoot); err != nil {
-		return nil, status.Errorf(codes.Internal, "Could not read current log root: %v", err)
-	}
-
-	if err := t.commitAndLog(ctx, req.LogId, tx, "GetLeavesByHash"); err != nil {
-		return nil, err
-	}
-
-	return &trillian.GetLeavesByHashResponse{
-		Leaves:        leaves,
-		SignedLogRoot: slr,
-	}, nil
-}
-
 // GetEntryAndProof returns both a Merkle Leaf entry and an inclusion proof for a given index
 // and tree size.
 func (t *TrillianLogRPCServer) GetEntryAndProof(ctx context.Context, req *trillian.GetEntryAndProofRequest) (*trillian.GetEntryAndProofResponse, error) {
diff --git a/server/validate.go b/server/validate.go
index c8ed6272..6fe959f2 100644
--- a/server/validate.go
+++ b/server/validate.go
@@ -46,18 +46,6 @@ func validateGetInclusionProofByHashRequest(req *trillian.GetInclusionProofByHas
 	return nil
 }
 
-func validateGetLeavesByHashRequest(req *trillian.GetLeavesByHashRequest, hasher hashers.LogHasher) error {
-	if len(req.LeafHash) == 0 {
-		return status.Error(codes.InvalidArgument, "GetLeavesByHashRequest.LeafHash empty")
-	}
-	for i, hash := range req.LeafHash {
-		if err := validateLeafHash(hash, hasher); err != nil {
-			return status.Errorf(codes.InvalidArgument, "GetLeavesByHashRequest.LeafHash[%v]: %v", i, err)
-		}
-	}
-	return nil
-}
-
 func validateGetLeavesByIndexRequest(req *trillian.GetLeavesByIndexRequest) error {
 	if len(req.LeafIndex) == 0 {
 		return status.Error(codes.InvalidArgument, "GetLeavesByIndexRequest.LeafIndex empty")
diff --git a/trillian_log_api.pb.go b/trillian_log_api.pb.go
index ac8989d2..bd6ca0f8 100644
--- a/trillian_log_api.pb.go
+++ b/trillian_log_api.pb.go
@@ -1673,135 +1673,6 @@ func (x *GetLeavesByRangeResponse) GetSignedLogRoot() *SignedLogRoot {
 	return nil
 }
 
-type GetLeavesByHashRequest struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	LogId int64 `protobuf:"varint,1,opt,name=log_id,json=logId,proto3" json:"log_id,omitempty"`
-	// The Merkle leaf hash of the leaf to be retrieved.
-	LeafHash [][]byte `protobuf:"bytes,2,rep,name=leaf_hash,json=leafHash,proto3" json:"leaf_hash,omitempty"`
-	// If order_by_sequence is set then leaves will be returned in order of ascending
-	// leaf index.
-	OrderBySequence bool      `protobuf:"varint,3,opt,name=order_by_sequence,json=orderBySequence,proto3" json:"order_by_sequence,omitempty"`
-	ChargeTo        *ChargeTo `protobuf:"bytes,5,opt,name=charge_to,json=chargeTo,proto3" json:"charge_to,omitempty"`
-}
-
-func (x *GetLeavesByHashRequest) Reset() {
-	*x = GetLeavesByHashRequest{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[27]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *GetLeavesByHashRequest) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*GetLeavesByHashRequest) ProtoMessage() {}
-
-func (x *GetLeavesByHashRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[27]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use GetLeavesByHashRequest.ProtoReflect.Descriptor instead.
-func (*GetLeavesByHashRequest) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{27}
-}
-
-func (x *GetLeavesByHashRequest) GetLogId() int64 {
-	if x != nil {
-		return x.LogId
-	}
-	return 0
-}
-
-func (x *GetLeavesByHashRequest) GetLeafHash() [][]byte {
-	if x != nil {
-		return x.LeafHash
-	}
-	return nil
-}
-
-func (x *GetLeavesByHashRequest) GetOrderBySequence() bool {
-	if x != nil {
-		return x.OrderBySequence
-	}
-	return false
-}
-
-func (x *GetLeavesByHashRequest) GetChargeTo() *ChargeTo {
-	if x != nil {
-		return x.ChargeTo
-	}
-	return nil
-}
-
-type GetLeavesByHashResponse struct {
-	state         protoimpl.MessageState
-	sizeCache     protoimpl.SizeCache
-	unknownFields protoimpl.UnknownFields
-
-	Leaves        []*LogLeaf     `protobuf:"bytes,2,rep,name=leaves,proto3" json:"leaves,omitempty"`
-	SignedLogRoot *SignedLogRoot `protobuf:"bytes,3,opt,name=signed_log_root,json=signedLogRoot,proto3" json:"signed_log_root,omitempty"`
-}
-
-func (x *GetLeavesByHashResponse) Reset() {
-	*x = GetLeavesByHashResponse{}
-	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[28]
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		ms.StoreMessageInfo(mi)
-	}
-}
-
-func (x *GetLeavesByHashResponse) String() string {
-	return protoimpl.X.MessageStringOf(x)
-}
-
-func (*GetLeavesByHashResponse) ProtoMessage() {}
-
-func (x *GetLeavesByHashResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[28]
-	if protoimpl.UnsafeEnabled && x != nil {
-		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
-		if ms.LoadMessageInfo() == nil {
-			ms.StoreMessageInfo(mi)
-		}
-		return ms
-	}
-	return mi.MessageOf(x)
-}
-
-// Deprecated: Use GetLeavesByHashResponse.ProtoReflect.Descriptor instead.
-func (*GetLeavesByHashResponse) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{28}
-}
-
-func (x *GetLeavesByHashResponse) GetLeaves() []*LogLeaf {
-	if x != nil {
-		return x.Leaves
-	}
-	return nil
-}
-
-func (x *GetLeavesByHashResponse) GetSignedLogRoot() *SignedLogRoot {
-	if x != nil {
-		return x.SignedLogRoot
-	}
-	return nil
-}
-
 // QueuedLogLeaf provides the result of submitting an entry to the log.
 // TODO(pavelkalinnikov): Consider renaming it to AddLogLeafResult or the like.
 type QueuedLogLeaf struct {
@@ -1827,7 +1698,7 @@ type QueuedLogLeaf struct {
 func (x *QueuedLogLeaf) Reset() {
 	*x = QueuedLogLeaf{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[29]
+		mi := &file_trillian_log_api_proto_msgTypes[27]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1840,7 +1711,7 @@ func (x *QueuedLogLeaf) String() string {
 func (*QueuedLogLeaf) ProtoMessage() {}
 
 func (x *QueuedLogLeaf) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[29]
+	mi := &file_trillian_log_api_proto_msgTypes[27]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1853,7 +1724,7 @@ func (x *QueuedLogLeaf) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use QueuedLogLeaf.ProtoReflect.Descriptor instead.
 func (*QueuedLogLeaf) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{29}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{27}
 }
 
 func (x *QueuedLogLeaf) GetLeaf() *LogLeaf {
@@ -1944,7 +1815,7 @@ type LogLeaf struct {
 func (x *LogLeaf) Reset() {
 	*x = LogLeaf{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_trillian_log_api_proto_msgTypes[30]
+		mi := &file_trillian_log_api_proto_msgTypes[28]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1957,7 +1828,7 @@ func (x *LogLeaf) String() string {
 func (*LogLeaf) ProtoMessage() {}
 
 func (x *LogLeaf) ProtoReflect() protoreflect.Message {
-	mi := &file_trillian_log_api_proto_msgTypes[30]
+	mi := &file_trillian_log_api_proto_msgTypes[28]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1970,7 +1841,7 @@ func (x *LogLeaf) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use LogLeaf.ProtoReflect.Descriptor instead.
 func (*LogLeaf) Descriptor() ([]byte, []int) {
-	return file_trillian_log_api_proto_rawDescGZIP(), []int{30}
+	return file_trillian_log_api_proto_rawDescGZIP(), []int{28}
 }
 
 func (x *LogLeaf) GetMerkleLeafHash() []byte {
@@ -2244,170 +2115,145 @@ var file_trillian_log_api_proto_rawDesc = []byte{
 	0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02,
 	0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e,
 	0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0d, 0x73,
-	0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0xa9, 0x01, 0x0a,
-	0x16, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x6f, 0x67, 0x5f, 0x69,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1b,
-	0x0a, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28,
-	0x0c, 0x52, 0x08, 0x6c, 0x65, 0x61, 0x66, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x6f,
-	0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65,
-	0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x53,
-	0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x09, 0x63, 0x68, 0x61, 0x72, 0x67,
-	0x65, 0x5f, 0x74, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x72, 0x69,
-	0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x52, 0x08,
-	0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x54, 0x6f, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74,
-	0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x02,
-	0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e,
-	0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12,
-	0x3f, 0x0a, 0x0f, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x72, 0x6f,
-	0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c,
-	0x69, 0x61, 0x6e, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f,
-	0x74, 0x52, 0x0d, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74,
-	0x22, 0x62, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61,
-	0x66, 0x12, 0x25, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x11, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65,
-	0x61, 0x66, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74,
-	0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
-	0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74,
-	0x61, 0x74, 0x75, 0x73, 0x22, 0xd0, 0x02, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66,
-	0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x5f,
-	0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65, 0x72, 0x6b,
-	0x6c, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65,
-	0x61, 0x66, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09,
-	0x6c, 0x65, 0x61, 0x66, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x74,
-	0x72, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65,
-	0x78, 0x74, 0x72, 0x61, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x61, 0x66,
-	0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x65,
-	0x61, 0x66, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x61, 0x66, 0x5f,
-	0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20,
-	0x01, 0x28, 0x0c, 0x52, 0x10, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74,
-	0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x43, 0x0a, 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x74,
-	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75,
-	0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x13, 0x69, 0x6e,
-	0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
-	0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
-	0x61, 0x6d, 0x70, 0x52, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x54, 0x69,
-	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x32, 0xe8, 0x0d, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x6c,
-	0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x12, 0x6e, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x75, 0x65,
-	0x4c, 0x65, 0x61, 0x66, 0x12, 0x1a, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e,
-	0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x1b, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75,
-	0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82,
-	0xd3, 0xe4, 0x93, 0x02, 0x22, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f,
-	0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65,
-	0x61, 0x76, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x8d, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x53,
-	0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x21, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65,
-	0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65,
-	0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f,
-	0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x76, 0x31,
-	0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f,
-	0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x73, 0x65, 0x71, 0x75, 0x65,
-	0x6e, 0x63, 0x65, 0x64, 0x3a, 0x01, 0x2a, 0x12, 0xa0, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49,
-	0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e,
+	0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x62, 0x0a, 0x0d,
+	0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x25, 0x0a,
+	0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x72,
+	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x04,
+	0x6c, 0x65, 0x61, 0x66, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70,
+	0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73,
+	0x22, 0xd0, 0x02, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x28, 0x0a, 0x10,
+	0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x68, 0x61, 0x73, 0x68,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x6d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x4c, 0x65,
+	0x61, 0x66, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6c, 0x65, 0x61, 0x66,
+	0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x64,
+	0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61,
+	0x44, 0x61, 0x74, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64,
+	0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x6e,
+	0x64, 0x65, 0x78, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x64, 0x65, 0x6e,
+	0x74, 0x69, 0x74, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52,
+	0x10, 0x6c, 0x65, 0x61, 0x66, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x48, 0x61, 0x73,
+	0x68, 0x12, 0x43, 0x0a, 0x0f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73,
+	0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f,
+	0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x54, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4b, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72,
+	0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
+	0x12, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
+	0x61, 0x6d, 0x70, 0x32, 0x8e, 0x0d, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e,
+	0x4c, 0x6f, 0x67, 0x12, 0x6e, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x66,
+	0x12, 0x1a, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75,
+	0x65, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x74,
+	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61,
+	0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02,
+	0x22, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73,
+	0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73,
+	0x3a, 0x01, 0x2a, 0x12, 0x8d, 0x01, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65,
+	0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c,
+	0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64,
+	0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72,
+	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e,
+	0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61,
+	0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f,
+	0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64,
+	0x3a, 0x01, 0x2a, 0x12, 0xa0, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75,
+	0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c,
+	0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f,
+	0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e,
 	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c,
-	0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
-	0x74, 0x1a, 0x23, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74,
-	0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x12, 0x3a,
-	0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c,
-	0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x6c,
-	0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x75,
-	0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x17, 0x47,
-	0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66,
-	0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x28, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72,
-	0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x29, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49,
-	0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48,
-	0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4,
-	0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f,
-	0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76,
-	0x65, 0x73, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f,
-	0x68, 0x61, 0x73, 0x68, 0x12, 0x94, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73,
-	0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69,
-	0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65,
-	0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f,
-	0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x2a, 0x12, 0x28, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73,
-	0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73,
-	0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x98, 0x01, 0x0a, 0x16,
-	0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c,
-	0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x27, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65,
-	0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x28, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61,
-	0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02,
-	0x25, 0x12, 0x23, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73,
-	0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x3a,
-	0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x65,
-	0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74,
-	0x12, 0x26, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53,
-	0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x43, 0x6f, 0x75, 0x6e,
-	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c,
-	0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64,
-	0x4c, 0x65, 0x61, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
-	0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x62, 0x65,
-	0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64,
-	0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63,
-	0x65, 0x64, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74,
-	0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x21, 0x2e,
-	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72,
-	0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45,
-	0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76,
+	0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x12, 0x3a, 0x2f, 0x76, 0x31, 0x62,
+	0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69,
+	0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x66, 0x5f,
+	0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x3a, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e,
+	0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x49, 0x6e,
+	0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61,
+	0x73, 0x68, 0x12, 0x28, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65,
+	0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42,
+	0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74,
+	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x63, 0x6c, 0x75,
+	0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52,
+	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12,
+	0x2f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b,
+	0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x3a, 0x69,
+	0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x79, 0x5f, 0x68, 0x61, 0x73, 0x68,
+	0x12, 0x94, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65,
+	0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c,
+	0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e,
+	0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25,
+	0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e,
+	0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x12, 0x28, 0x2f,
+	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f,
+	0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x63,
+	0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x98, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4c,
+	0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f,
+	0x6f, 0x74, 0x12, 0x27, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65,
+	0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67,
+	0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x72,
+	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74,
+	0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x23, 0x2f,
+	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f,
+	0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x3a, 0x6c, 0x61, 0x74, 0x65,
+	0x73, 0x74, 0x12, 0x9f, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e,
+	0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x2e, 0x74,
+	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65,
+	0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e,
+	0x47, 0x65, 0x74, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x66,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82,
+	0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f,
+	0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65,
+	0x61, 0x76, 0x65, 0x73, 0x3a, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x8d, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72,
+	0x79, 0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c,
+	0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x41, 0x6e, 0x64,
+	0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74,
+	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x41, 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
+	0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74,
+	0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d,
+	0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x69, 0x6e,
+	0x64, 0x65, 0x78, 0x7d, 0x12, 0x63, 0x0a, 0x07, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x12,
+	0x18, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c,
+	0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x74, 0x72, 0x69, 0x6c,
+	0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x73, 0x70,
+	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x22, 0x1b, 0x2f, 0x76,
 	0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f, 0x7b, 0x6c, 0x6f, 0x67,
-	0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x2f, 0x7b, 0x6c, 0x65, 0x61,
-	0x66, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0x63, 0x0a, 0x07, 0x49, 0x6e, 0x69, 0x74,
-	0x4c, 0x6f, 0x67, 0x12, 0x18, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49,
-	0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e,
-	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x4c, 0x6f, 0x67,
-	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x23, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d,
-	0x22, 0x1b, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x6c, 0x6f, 0x67, 0x73, 0x2f,
-	0x7b, 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x4c, 0x0a,
-	0x0b, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x74,
-	0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61,
-	0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x69,
-	0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65,
-	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x12, 0x41,
-	0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65,
-	0x73, 0x12, 0x23, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64,
-	0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52,
-	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
-	0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65,
-	0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b,
-	0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64,
-	0x65, 0x78, 0x12, 0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65,
-	0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e,
-	0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65,
-	0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47,
-	0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12,
-	0x21, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65,
-	0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65,
-	0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4c,
-	0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x12, 0x20, 0x2e, 0x74, 0x72,
+	0x5f, 0x69, 0x64, 0x7d, 0x3a, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x4c, 0x0a, 0x0b, 0x51, 0x75, 0x65,
+	0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x1c, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c,
+	0x69, 0x61, 0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61,
+	0x6e, 0x2e, 0x51, 0x75, 0x65, 0x75, 0x65, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x53, 0x65,
+	0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x23, 0x2e,
+	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64, 0x64, 0x53, 0x65, 0x71, 0x75,
+	0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x1a, 0x24, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x41, 0x64,
+	0x64, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73,
+	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65,
+	0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x21,
+	0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61,
+	0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x22, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74,
+	0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4c, 0x65,
+	0x61, 0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x21, 0x2e, 0x74, 0x72,
 	0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73,
-	0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e,
-	0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76,
-	0x65, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x22, 0x00, 0x42, 0x4e, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
-	0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x42,
-	0x13, 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x41, 0x70, 0x69, 0x50,
-	0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63,
-	0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69,
-	0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22,
+	0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x61,
+	0x76, 0x65, 0x73, 0x42, 0x79, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x42, 0x4e, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x74, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x42, 0x13, 0x54, 0x72, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6e, 0x4c, 0x6f, 0x67, 0x41, 0x70,
+	0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
+	0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x72, 0x69, 0x6c,
+	0x6c, 0x69, 0x61, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -2422,7 +2268,7 @@ func file_trillian_log_api_proto_rawDescGZIP() []byte {
 	return file_trillian_log_api_proto_rawDescData
 }
 
-var file_trillian_log_api_proto_msgTypes = make([]protoimpl.MessageInfo, 31)
+var file_trillian_log_api_proto_msgTypes = make([]protoimpl.MessageInfo, 29)
 var file_trillian_log_api_proto_goTypes = []interface{}{
 	(*ChargeTo)(nil),                        // 0: trillian.ChargeTo
 	(*QueueLeafRequest)(nil),                // 1: trillian.QueueLeafRequest
@@ -2451,93 +2297,86 @@ var file_trillian_log_api_proto_goTypes = []interface{}{
 	(*GetLeavesByIndexResponse)(nil),        // 24: trillian.GetLeavesByIndexResponse
 	(*GetLeavesByRangeRequest)(nil),         // 25: trillian.GetLeavesByRangeRequest
 	(*GetLeavesByRangeResponse)(nil),        // 26: trillian.GetLeavesByRangeResponse
-	(*GetLeavesByHashRequest)(nil),          // 27: trillian.GetLeavesByHashRequest
-	(*GetLeavesByHashResponse)(nil),         // 28: trillian.GetLeavesByHashResponse
-	(*QueuedLogLeaf)(nil),                   // 29: trillian.QueuedLogLeaf
-	(*LogLeaf)(nil),                         // 30: trillian.LogLeaf
-	(*Proof)(nil),                           // 31: trillian.Proof
-	(*SignedLogRoot)(nil),                   // 32: trillian.SignedLogRoot
-	(*status.Status)(nil),                   // 33: google.rpc.Status
-	(*timestamp.Timestamp)(nil),             // 34: google.protobuf.Timestamp
+	(*QueuedLogLeaf)(nil),                   // 27: trillian.QueuedLogLeaf
+	(*LogLeaf)(nil),                         // 28: trillian.LogLeaf
+	(*Proof)(nil),                           // 29: trillian.Proof
+	(*SignedLogRoot)(nil),                   // 30: trillian.SignedLogRoot
+	(*status.Status)(nil),                   // 31: google.rpc.Status
+	(*timestamp.Timestamp)(nil),             // 32: google.protobuf.Timestamp
 }
 var file_trillian_log_api_proto_depIdxs = []int32{
-	30, // 0: trillian.QueueLeafRequest.leaf:type_name -> trillian.LogLeaf
+	28, // 0: trillian.QueueLeafRequest.leaf:type_name -> trillian.LogLeaf
 	0,  // 1: trillian.QueueLeafRequest.charge_to:type_name -> trillian.ChargeTo
-	29, // 2: trillian.QueueLeafResponse.queued_leaf:type_name -> trillian.QueuedLogLeaf
-	30, // 3: trillian.AddSequencedLeafRequest.leaf:type_name -> trillian.LogLeaf
+	27, // 2: trillian.QueueLeafResponse.queued_leaf:type_name -> trillian.QueuedLogLeaf
+	28, // 3: trillian.AddSequencedLeafRequest.leaf:type_name -> trillian.LogLeaf
 	0,  // 4: trillian.AddSequencedLeafRequest.charge_to:type_name -> trillian.ChargeTo
-	29, // 5: trillian.AddSequencedLeafResponse.result:type_name -> trillian.QueuedLogLeaf
+	27, // 5: trillian.AddSequencedLeafResponse.result:type_name -> trillian.QueuedLogLeaf
 	0,  // 6: trillian.GetInclusionProofRequest.charge_to:type_name -> trillian.ChargeTo
-	31, // 7: trillian.GetInclusionProofResponse.proof:type_name -> trillian.Proof
-	32, // 8: trillian.GetInclusionProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	29, // 7: trillian.GetInclusionProofResponse.proof:type_name -> trillian.Proof
+	30, // 8: trillian.GetInclusionProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 9: trillian.GetInclusionProofByHashRequest.charge_to:type_name -> trillian.ChargeTo
-	31, // 10: trillian.GetInclusionProofByHashResponse.proof:type_name -> trillian.Proof
-	32, // 11: trillian.GetInclusionProofByHashResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	29, // 10: trillian.GetInclusionProofByHashResponse.proof:type_name -> trillian.Proof
+	30, // 11: trillian.GetInclusionProofByHashResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 12: trillian.GetConsistencyProofRequest.charge_to:type_name -> trillian.ChargeTo
-	31, // 13: trillian.GetConsistencyProofResponse.proof:type_name -> trillian.Proof
-	32, // 14: trillian.GetConsistencyProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	29, // 13: trillian.GetConsistencyProofResponse.proof:type_name -> trillian.Proof
+	30, // 14: trillian.GetConsistencyProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 15: trillian.GetLatestSignedLogRootRequest.charge_to:type_name -> trillian.ChargeTo
-	32, // 16: trillian.GetLatestSignedLogRootResponse.signed_log_root:type_name -> trillian.SignedLogRoot
-	31, // 17: trillian.GetLatestSignedLogRootResponse.proof:type_name -> trillian.Proof
+	30, // 16: trillian.GetLatestSignedLogRootResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	29, // 17: trillian.GetLatestSignedLogRootResponse.proof:type_name -> trillian.Proof
 	0,  // 18: trillian.GetSequencedLeafCountRequest.charge_to:type_name -> trillian.ChargeTo
 	0,  // 19: trillian.GetEntryAndProofRequest.charge_to:type_name -> trillian.ChargeTo
-	31, // 20: trillian.GetEntryAndProofResponse.proof:type_name -> trillian.Proof
-	30, // 21: trillian.GetEntryAndProofResponse.leaf:type_name -> trillian.LogLeaf
-	32, // 22: trillian.GetEntryAndProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	29, // 20: trillian.GetEntryAndProofResponse.proof:type_name -> trillian.Proof
+	28, // 21: trillian.GetEntryAndProofResponse.leaf:type_name -> trillian.LogLeaf
+	30, // 22: trillian.GetEntryAndProofResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 23: trillian.InitLogRequest.charge_to:type_name -> trillian.ChargeTo
-	32, // 24: trillian.InitLogResponse.created:type_name -> trillian.SignedLogRoot
-	30, // 25: trillian.QueueLeavesRequest.leaves:type_name -> trillian.LogLeaf
+	30, // 24: trillian.InitLogResponse.created:type_name -> trillian.SignedLogRoot
+	28, // 25: trillian.QueueLeavesRequest.leaves:type_name -> trillian.LogLeaf
 	0,  // 26: trillian.QueueLeavesRequest.charge_to:type_name -> trillian.ChargeTo
-	29, // 27: trillian.QueueLeavesResponse.queued_leaves:type_name -> trillian.QueuedLogLeaf
-	30, // 28: trillian.AddSequencedLeavesRequest.leaves:type_name -> trillian.LogLeaf
+	27, // 27: trillian.QueueLeavesResponse.queued_leaves:type_name -> trillian.QueuedLogLeaf
+	28, // 28: trillian.AddSequencedLeavesRequest.leaves:type_name -> trillian.LogLeaf
 	0,  // 29: trillian.AddSequencedLeavesRequest.charge_to:type_name -> trillian.ChargeTo
-	29, // 30: trillian.AddSequencedLeavesResponse.results:type_name -> trillian.QueuedLogLeaf
+	27, // 30: trillian.AddSequencedLeavesResponse.results:type_name -> trillian.QueuedLogLeaf
 	0,  // 31: trillian.GetLeavesByIndexRequest.charge_to:type_name -> trillian.ChargeTo
-	30, // 32: trillian.GetLeavesByIndexResponse.leaves:type_name -> trillian.LogLeaf
-	32, // 33: trillian.GetLeavesByIndexResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	28, // 32: trillian.GetLeavesByIndexResponse.leaves:type_name -> trillian.LogLeaf
+	30, // 33: trillian.GetLeavesByIndexResponse.signed_log_root:type_name -> trillian.SignedLogRoot
 	0,  // 34: trillian.GetLeavesByRangeRequest.charge_to:type_name -> trillian.ChargeTo
-	30, // 35: trillian.GetLeavesByRangeResponse.leaves:type_name -> trillian.LogLeaf
-	32, // 36: trillian.GetLeavesByRangeResponse.signed_log_root:type_name -> trillian.SignedLogRoot
-	0,  // 37: trillian.GetLeavesByHashRequest.charge_to:type_name -> trillian.ChargeTo
-	30, // 38: trillian.GetLeavesByHashResponse.leaves:type_name -> trillian.LogLeaf
-	32, // 39: trillian.GetLeavesByHashResponse.signed_log_root:type_name -> trillian.SignedLogRoot
-	30, // 40: trillian.QueuedLogLeaf.leaf:type_name -> trillian.LogLeaf
-	33, // 41: trillian.QueuedLogLeaf.status:type_name -> google.rpc.Status
-	34, // 42: trillian.LogLeaf.queue_timestamp:type_name -> google.protobuf.Timestamp
-	34, // 43: trillian.LogLeaf.integrate_timestamp:type_name -> google.protobuf.Timestamp
-	1,  // 44: trillian.TrillianLog.QueueLeaf:input_type -> trillian.QueueLeafRequest
-	3,  // 45: trillian.TrillianLog.AddSequencedLeaf:input_type -> trillian.AddSequencedLeafRequest
-	5,  // 46: trillian.TrillianLog.GetInclusionProof:input_type -> trillian.GetInclusionProofRequest
-	7,  // 47: trillian.TrillianLog.GetInclusionProofByHash:input_type -> trillian.GetInclusionProofByHashRequest
-	9,  // 48: trillian.TrillianLog.GetConsistencyProof:input_type -> trillian.GetConsistencyProofRequest
-	11, // 49: trillian.TrillianLog.GetLatestSignedLogRoot:input_type -> trillian.GetLatestSignedLogRootRequest
-	13, // 50: trillian.TrillianLog.GetSequencedLeafCount:input_type -> trillian.GetSequencedLeafCountRequest
-	15, // 51: trillian.TrillianLog.GetEntryAndProof:input_type -> trillian.GetEntryAndProofRequest
-	17, // 52: trillian.TrillianLog.InitLog:input_type -> trillian.InitLogRequest
-	19, // 53: trillian.TrillianLog.QueueLeaves:input_type -> trillian.QueueLeavesRequest
-	21, // 54: trillian.TrillianLog.AddSequencedLeaves:input_type -> trillian.AddSequencedLeavesRequest
-	23, // 55: trillian.TrillianLog.GetLeavesByIndex:input_type -> trillian.GetLeavesByIndexRequest
-	25, // 56: trillian.TrillianLog.GetLeavesByRange:input_type -> trillian.GetLeavesByRangeRequest
-	27, // 57: trillian.TrillianLog.GetLeavesByHash:input_type -> trillian.GetLeavesByHashRequest
-	2,  // 58: trillian.TrillianLog.QueueLeaf:output_type -> trillian.QueueLeafResponse
-	4,  // 59: trillian.TrillianLog.AddSequencedLeaf:output_type -> trillian.AddSequencedLeafResponse
-	6,  // 60: trillian.TrillianLog.GetInclusionProof:output_type -> trillian.GetInclusionProofResponse
-	8,  // 61: trillian.TrillianLog.GetInclusionProofByHash:output_type -> trillian.GetInclusionProofByHashResponse
-	10, // 62: trillian.TrillianLog.GetConsistencyProof:output_type -> trillian.GetConsistencyProofResponse
-	12, // 63: trillian.TrillianLog.GetLatestSignedLogRoot:output_type -> trillian.GetLatestSignedLogRootResponse
-	14, // 64: trillian.TrillianLog.GetSequencedLeafCount:output_type -> trillian.GetSequencedLeafCountResponse
-	16, // 65: trillian.TrillianLog.GetEntryAndProof:output_type -> trillian.GetEntryAndProofResponse
-	18, // 66: trillian.TrillianLog.InitLog:output_type -> trillian.InitLogResponse
-	20, // 67: trillian.TrillianLog.QueueLeaves:output_type -> trillian.QueueLeavesResponse
-	22, // 68: trillian.TrillianLog.AddSequencedLeaves:output_type -> trillian.AddSequencedLeavesResponse
-	24, // 69: trillian.TrillianLog.GetLeavesByIndex:output_type -> trillian.GetLeavesByIndexResponse
-	26, // 70: trillian.TrillianLog.GetLeavesByRange:output_type -> trillian.GetLeavesByRangeResponse
-	28, // 71: trillian.TrillianLog.GetLeavesByHash:output_type -> trillian.GetLeavesByHashResponse
-	58, // [58:72] is the sub-list for method output_type
-	44, // [44:58] is the sub-list for method input_type
-	44, // [44:44] is the sub-list for extension type_name
-	44, // [44:44] is the sub-list for extension extendee
-	0,  // [0:44] is the sub-list for field type_name
+	28, // 35: trillian.GetLeavesByRangeResponse.leaves:type_name -> trillian.LogLeaf
+	30, // 36: trillian.GetLeavesByRangeResponse.signed_log_root:type_name -> trillian.SignedLogRoot
+	28, // 37: trillian.QueuedLogLeaf.leaf:type_name -> trillian.LogLeaf
+	31, // 38: trillian.QueuedLogLeaf.status:type_name -> google.rpc.Status
+	32, // 39: trillian.LogLeaf.queue_timestamp:type_name -> google.protobuf.Timestamp
+	32, // 40: trillian.LogLeaf.integrate_timestamp:type_name -> google.protobuf.Timestamp
+	1,  // 41: trillian.TrillianLog.QueueLeaf:input_type -> trillian.QueueLeafRequest
+	3,  // 42: trillian.TrillianLog.AddSequencedLeaf:input_type -> trillian.AddSequencedLeafRequest
+	5,  // 43: trillian.TrillianLog.GetInclusionProof:input_type -> trillian.GetInclusionProofRequest
+	7,  // 44: trillian.TrillianLog.GetInclusionProofByHash:input_type -> trillian.GetInclusionProofByHashRequest
+	9,  // 45: trillian.TrillianLog.GetConsistencyProof:input_type -> trillian.GetConsistencyProofRequest
+	11, // 46: trillian.TrillianLog.GetLatestSignedLogRoot:input_type -> trillian.GetLatestSignedLogRootRequest
+	13, // 47: trillian.TrillianLog.GetSequencedLeafCount:input_type -> trillian.GetSequencedLeafCountRequest
+	15, // 48: trillian.TrillianLog.GetEntryAndProof:input_type -> trillian.GetEntryAndProofRequest
+	17, // 49: trillian.TrillianLog.InitLog:input_type -> trillian.InitLogRequest
+	19, // 50: trillian.TrillianLog.QueueLeaves:input_type -> trillian.QueueLeavesRequest
+	21, // 51: trillian.TrillianLog.AddSequencedLeaves:input_type -> trillian.AddSequencedLeavesRequest
+	23, // 52: trillian.TrillianLog.GetLeavesByIndex:input_type -> trillian.GetLeavesByIndexRequest
+	25, // 53: trillian.TrillianLog.GetLeavesByRange:input_type -> trillian.GetLeavesByRangeRequest
+	2,  // 54: trillian.TrillianLog.QueueLeaf:output_type -> trillian.QueueLeafResponse
+	4,  // 55: trillian.TrillianLog.AddSequencedLeaf:output_type -> trillian.AddSequencedLeafResponse
+	6,  // 56: trillian.TrillianLog.GetInclusionProof:output_type -> trillian.GetInclusionProofResponse
+	8,  // 57: trillian.TrillianLog.GetInclusionProofByHash:output_type -> trillian.GetInclusionProofByHashResponse
+	10, // 58: trillian.TrillianLog.GetConsistencyProof:output_type -> trillian.GetConsistencyProofResponse
+	12, // 59: trillian.TrillianLog.GetLatestSignedLogRoot:output_type -> trillian.GetLatestSignedLogRootResponse
+	14, // 60: trillian.TrillianLog.GetSequencedLeafCount:output_type -> trillian.GetSequencedLeafCountResponse
+	16, // 61: trillian.TrillianLog.GetEntryAndProof:output_type -> trillian.GetEntryAndProofResponse
+	18, // 62: trillian.TrillianLog.InitLog:output_type -> trillian.InitLogResponse
+	20, // 63: trillian.TrillianLog.QueueLeaves:output_type -> trillian.QueueLeavesResponse
+	22, // 64: trillian.TrillianLog.AddSequencedLeaves:output_type -> trillian.AddSequencedLeavesResponse
+	24, // 65: trillian.TrillianLog.GetLeavesByIndex:output_type -> trillian.GetLeavesByIndexResponse
+	26, // 66: trillian.TrillianLog.GetLeavesByRange:output_type -> trillian.GetLeavesByRangeResponse
+	54, // [54:67] is the sub-list for method output_type
+	41, // [41:54] is the sub-list for method input_type
+	41, // [41:41] is the sub-list for extension type_name
+	41, // [41:41] is the sub-list for extension extendee
+	0,  // [0:41] is the sub-list for field type_name
 }
 
 func init() { file_trillian_log_api_proto_init() }
@@ -2872,30 +2711,6 @@ func file_trillian_log_api_proto_init() {
 			}
 		}
 		file_trillian_log_api_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetLeavesByHashRequest); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_trillian_log_api_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetLeavesByHashResponse); i {
-			case 0:
-				return &v.state
-			case 1:
-				return &v.sizeCache
-			case 2:
-				return &v.unknownFields
-			default:
-				return nil
-			}
-		}
-		file_trillian_log_api_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*QueuedLogLeaf); i {
 			case 0:
 				return &v.state
@@ -2907,7 +2722,7 @@ func file_trillian_log_api_proto_init() {
 				return nil
 			}
 		}
-		file_trillian_log_api_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
+		file_trillian_log_api_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*LogLeaf); i {
 			case 0:
 				return &v.state
@@ -2926,7 +2741,7 @@ func file_trillian_log_api_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_trillian_log_api_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   31,
+			NumMessages:   29,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
@@ -3013,9 +2828,6 @@ type TrillianLogClient interface {
 	// GetLeavesByRange returns a batch of leaves whose leaf indices are in a
 	// sequential range.
 	GetLeavesByRange(ctx context.Context, in *GetLeavesByRangeRequest, opts ...grpc.CallOption) (*GetLeavesByRangeResponse, error)
-	// GetLeavesByHash returns a batch of leaves which are identified by their
-	// Merkle leaf hash values.
-	GetLeavesByHash(ctx context.Context, in *GetLeavesByHashRequest, opts ...grpc.CallOption) (*GetLeavesByHashResponse, error)
 }
 
 type trillianLogClient struct {
@@ -3143,15 +2955,6 @@ func (c *trillianLogClient) GetLeavesByRange(ctx context.Context, in *GetLeavesB
 	return out, nil
 }
 
-func (c *trillianLogClient) GetLeavesByHash(ctx context.Context, in *GetLeavesByHashRequest, opts ...grpc.CallOption) (*GetLeavesByHashResponse, error) {
-	out := new(GetLeavesByHashResponse)
-	err := c.cc.Invoke(ctx, "/trillian.TrillianLog/GetLeavesByHash", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
 // TrillianLogServer is the server API for TrillianLog service.
 type TrillianLogServer interface {
 	// QueueLeaf adds a single leaf to the queue of pending leaves for a normal
@@ -3215,9 +3018,6 @@ type TrillianLogServer interface {
 	// GetLeavesByRange returns a batch of leaves whose leaf indices are in a
 	// sequential range.
 	GetLeavesByRange(context.Context, *GetLeavesByRangeRequest) (*GetLeavesByRangeResponse, error)
-	// GetLeavesByHash returns a batch of leaves which are identified by their
-	// Merkle leaf hash values.
-	GetLeavesByHash(context.Context, *GetLeavesByHashRequest) (*GetLeavesByHashResponse, error)
 }
 
 // UnimplementedTrillianLogServer can be embedded to have forward compatible implementations.
@@ -3263,9 +3063,6 @@ func (*UnimplementedTrillianLogServer) GetLeavesByIndex(context.Context, *GetLea
 func (*UnimplementedTrillianLogServer) GetLeavesByRange(context.Context, *GetLeavesByRangeRequest) (*GetLeavesByRangeResponse, error) {
 	return nil, status1.Errorf(codes.Unimplemented, "method GetLeavesByRange not implemented")
 }
-func (*UnimplementedTrillianLogServer) GetLeavesByHash(context.Context, *GetLeavesByHashRequest) (*GetLeavesByHashResponse, error) {
-	return nil, status1.Errorf(codes.Unimplemented, "method GetLeavesByHash not implemented")
-}
 
 func RegisterTrillianLogServer(s *grpc.Server, srv TrillianLogServer) {
 	s.RegisterService(&_TrillianLog_serviceDesc, srv)
@@ -3505,24 +3302,6 @@ func _TrillianLog_GetLeavesByRange_Handler(srv interface{}, ctx context.Context,
 	return interceptor(ctx, in, info, handler)
 }
 
-func _TrillianLog_GetLeavesByHash_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(GetLeavesByHashRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(TrillianLogServer).GetLeavesByHash(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/trillian.TrillianLog/GetLeavesByHash",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(TrillianLogServer).GetLeavesByHash(ctx, req.(*GetLeavesByHashRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
 var _TrillianLog_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "trillian.TrillianLog",
 	HandlerType: (*TrillianLogServer)(nil),
@@ -3579,10 +3358,6 @@ var _TrillianLog_serviceDesc = grpc.ServiceDesc{
 			MethodName: "GetLeavesByRange",
 			Handler:    _TrillianLog_GetLeavesByRange_Handler,
 		},
-		{
-			MethodName: "GetLeavesByHash",
-			Handler:    _TrillianLog_GetLeavesByHash_Handler,
-		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "trillian_log_api.proto",
diff --git a/trillian_log_api.proto b/trillian_log_api.proto
index 24c63ad5..5657750c 100644
--- a/trillian_log_api.proto
+++ b/trillian_log_api.proto
@@ -178,11 +178,6 @@ service TrillianLog {
   // sequential range.
   rpc GetLeavesByRange(GetLeavesByRangeRequest)
       returns (GetLeavesByRangeResponse) {}
-
-  // GetLeavesByHash returns a batch of leaves which are identified by their
-  // Merkle leaf hash values.
-  rpc GetLeavesByHash(GetLeavesByHashRequest)
-      returns (GetLeavesByHashResponse) {}
 }
 
 // ChargeTo describes the user(s) associated with the request whose quota should
@@ -385,21 +380,6 @@ message GetLeavesByRangeResponse {
   SignedLogRoot signed_log_root = 2;
 }
 
-message GetLeavesByHashRequest {
-  int64 log_id = 1;
-  // The Merkle leaf hash of the leaf to be retrieved.
-  repeated bytes leaf_hash = 2;
-  // If order_by_sequence is set then leaves will be returned in order of ascending
-  // leaf index.
-  bool order_by_sequence = 3;
-  ChargeTo charge_to = 5;
-}
-
-message GetLeavesByHashResponse {
-  repeated LogLeaf leaves = 2;
-  SignedLogRoot signed_log_root = 3;
-}
-
 // QueuedLogLeaf provides the result of submitting an entry to the log.
 // TODO(pavelkalinnikov): Consider renaming it to AddLogLeafResult or the like.
 message QueuedLogLeaf {


Test patch:
diff --git a/server/log_rpc_server_test.go b/server/log_rpc_server_test.go
index d0c7b490..626b5828 100644
--- a/server/log_rpc_server_test.go
+++ b/server/log_rpc_server_test.go
@@ -82,7 +82,6 @@ var (
 	leaf2     = newTestLeaf([]byte("value2"), []byte("extra"), 2)
 	leafHash2 = []byte("\x05\x37\xd4\x81\xf7\x3a\x75\x73\x34\x32\x80\x52\xda\x3a\xf9\x62\x6c\xed\x97\x02\x8e\x20\xb8\x49\xf6\x11\x5c\x22\xcd\x76\x51\x97")
 	leaf3     = newTestLeaf([]byte("value3"), []byte("extra3"), 3)
-	leafHash3 = []byte("\x89\xdc\x6a\xe7\xf0\x6a\x9f\x46\xb5\x65\xaf\x03\xea\xb0\xec\xe0\xbf\x60\x24\xd3\x65\x9b\x7e\x3a\x1d\x03\x57\x3c\xfe\xb0\xb5\x9d")
 
 	leaf0Request  = trillian.GetLeavesByIndexRequest{LogId: logID1, LeafIndex: []int64{0}}
 	leaf03Request = trillian.GetLeavesByIndexRequest{LogId: logID1, LeafIndex: []int64{0, 3}}
@@ -100,8 +99,6 @@ var (
 	root1              = &types.LogRootV1{TimestampNanos: 987654321, RootHash: []byte("A NICE HASH"), TreeSize: 7, Revision: uint64(5)}
 	signedRoot1, _     = fixedSigner.SignLogRoot(root1)
 
-	getByHashRequest1 = trillian.GetLeavesByHashRequest{LogId: logID1, LeafHash: [][]byte{leafHash1, leafHash3}}
-
 	getInclusionProofByHashRequest7  = trillian.GetInclusionProofByHashRequest{LogId: logID1, TreeSize: 7, LeafHash: leafHash1}
 	getInclusionProofByHashRequest25 = trillian.GetInclusionProofByHashRequest{LogId: logID1, TreeSize: 25, LeafHash: leafHash2}
 
@@ -688,154 +685,6 @@ func TestGetLatestSignedLogRoot(t *testing.T) {
 	}
 }
 
-func TestGetLeavesByHash(t *testing.T) {
-	for _, tc := range []struct {
-		name         string
-		setupStorage func(*gomock.Controller, *storage.MockLogStorage)
-		snapErr      error
-		treeErr      error
-		req          *trillian.GetLeavesByHashRequest
-		errStr       string
-		wantResp     *trillian.GetLeavesByHashResponse
-	}{
-		{
-			name: "admin snapshot fails",
-			setupStorage: func(_ *gomock.Controller, s *storage.MockLogStorage) {
-			},
-			req:     &getByHashRequest1,
-			snapErr: errors.New("admin snap"),
-			errStr:  "admin snap",
-		},
-		{
-			name: "get tree fails",
-			setupStorage: func(_ *gomock.Controller, s *storage.MockLogStorage) {
-			},
-			req:     &getByHashRequest1,
-			treeErr: errors.New("tree error"),
-			errStr:  "tree error",
-		},
-		{
-			name: "begin fails",
-			setupStorage: func(_ *gomock.Controller, s *storage.MockLogStorage) {
-				s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(nil, errors.New("TX"))
-			},
-			req:    &getByHashRequest1,
-			errStr: "TX",
-		},
-		{
-			name: "not initialized",
-			setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) {
-				tx := storage.NewMockLogTreeTX(c)
-				s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, storage.ErrTreeNeedsInit)
-				tx.EXPECT().Close().Return(nil)
-			},
-			req:    &getByHashRequest1,
-			errStr: "tree needs init",
-		},
-		{
-			name: "storage error",
-			setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) {
-				tx := storage.NewMockLogTreeTX(c)
-				s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil)
-				tx.EXPECT().GetLeavesByHash(gomock.Any(), [][]byte{leafHash1, leafHash3}, false).Return(nil, errors.New("STORAGE"))
-				tx.EXPECT().Close().Return(nil)
-			},
-			req:    &getByHashRequest1,
-			errStr: "STORAGE",
-		},
-		{
-			name: "commit fails",
-			setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) {
-				tx := storage.NewMockLogTreeTX(c)
-				s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil)
-				tx.EXPECT().GetLeavesByHash(gomock.Any(), [][]byte{leafHash1, leafHash3}, false).Return(nil, nil)
-				tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(signedRoot1, nil)
-				tx.EXPECT().Commit(gomock.Any()).Return(errors.New("COMMIT"))
-				tx.EXPECT().Close().Return(nil)
-			},
-			req:    &getByHashRequest1,
-			errStr: "COMMIT",
-		},
-		{
-			name: "log root fails",
-			setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) {
-				tx := storage.NewMockLogTreeTX(c)
-				s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil)
-				tx.EXPECT().GetLeavesByHash(gomock.Any(), [][]byte{leafHash1, leafHash3}, false).Return(nil, nil)
-				tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(&trillian.SignedLogRoot{}, errors.New("SLR"))
-				tx.EXPECT().Close().Return(nil)
-				tx.EXPECT().IsOpen().AnyTimes().Return(false)
-			},
-			req:    &getByHashRequest1,
-			errStr: "SLR",
-		},
-		{
-			name: "bad log root",
-			setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) {
-				tx := storage.NewMockLogTreeTX(c)
-				s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil)
-				tx.EXPECT().GetLeavesByHash(gomock.Any(), [][]byte{leafHash1, leafHash3}, false).Return(nil, nil)
-				tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(corruptLogRoot, nil)
-				tx.EXPECT().Close().Return(nil)
-				tx.EXPECT().IsOpen().AnyTimes().Return(false)
-			},
-			req:    &getByHashRequest1,
-			errStr: "not read current log root",
-		},
-		{
-			name: "leaf hash too short",
-			req: &trillian.GetLeavesByHashRequest{
-				LeafHash: [][]byte{
-					[]byte("too-short-to-be-a-hash"),
-				},
-				LogId: logID1,
-			},
-			errStr: "GetLeavesByHashRequest.LeafHash[0]: 22 bytes, want 32",
-		},
-		{
-			name: "ok multiple",
-			setupStorage: func(c *gomock.Controller, s *storage.MockLogStorage) {
-				tx := storage.NewMockLogTreeTX(c)
-				s.EXPECT().SnapshotForTree(gomock.Any(), cmpMatcher{tree1}).Return(tx, nil)
-				tx.EXPECT().GetLeavesByHash(gomock.Any(), [][]byte{leafHash1, leafHash3}, false).Return([]*trillian.LogLeaf{leaf1, leaf3}, nil)
-				tx.EXPECT().LatestSignedLogRoot(gomock.Any()).Return(signedRoot1, nil)
-				tx.EXPECT().Commit(gomock.Any()).Return(nil)
-				tx.EXPECT().Close().Return(nil)
-			},
-			req: &getByHashRequest1,
-			wantResp: &trillian.GetLeavesByHashResponse{
-				SignedLogRoot: signedRoot1,
-				Leaves:        []*trillian.LogLeaf{leaf1, leaf3},
-			},
-		},
-	} {
-		t.Run(tc.name, func(t *testing.T) {
-			ctrl := gomock.NewController(t)
-			defer ctrl.Finish()
-			fakeStorage := storage.NewMockLogStorage(ctrl)
-			if tc.setupStorage != nil {
-				tc.setupStorage(ctrl, fakeStorage)
-			}
-			registry := extension.Registry{
-				AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: leaf0Request.LogId, numSnapshots: 1, snapErr: tc.snapErr, treeErr: tc.treeErr}),
-				LogStorage:   fakeStorage,
-			}
-			server := NewTrillianLogRPCServer(registry, fakeTimeSource)
-			resp, err := server.GetLeavesByHash(context.Background(), tc.req)
-			if len(tc.errStr) > 0 {
-				if err == nil || !strings.Contains(err.Error(), tc.errStr) {
-					t.Errorf("GetLeavesByHash(%v)=(%v, %v), want (nil, err containing %q)", tc.req, resp, err, tc.errStr)
-				}
-				return
-			}
-
-			if err != nil || !proto.Equal(tc.wantResp, resp) {
-				t.Errorf("GetLeavesByHash(%v)=(%v, %v), want (%v, nil)", tc.req, resp, err, tc.wantResp)
-			}
-		})
-	}
-}
-
 func TestGetProofByHashErrors(t *testing.T) {
 	for _, tc := range []struct {
 		name         string
@@ -1883,49 +1732,6 @@ func TestTrillianLogRPCServer_GetInclusionProofByHashErrors(t *testing.T) {
 	}
 }
 
-func TestTrillianLogRPCServer_GetLeavesByHashErrors(t *testing.T) {
-	tests := []struct {
-		desc string
-		req  *trillian.GetLeavesByHashRequest
-	}{
-		{
-			desc: "nilLeafHashes",
-			req: &trillian.GetLeavesByHashRequest{
-				LogId: 1,
-			},
-		},
-		{
-			desc: "nilLeafHash",
-			req: &trillian.GetLeavesByHashRequest{
-				LogId: 1,
-				LeafHash: [][]byte{
-					[]byte("32.bytes.hash.a................."),
-					nil,
-					[]byte("32.bytes.hash.b................."),
-				},
-			},
-		},
-	}
-
-	ctx := context.Background()
-	for _, test := range tests {
-		t.Run(test.desc, func(t *testing.T) {
-			ctrl := gomock.NewController(t)
-			defer ctrl.Finish()
-
-			registry := extension.Registry{
-				AdminStorage: fakeAdminStorage(ctrl, storageParams{treeID: test.req.LogId, numSnapshots: 1}),
-			}
-			logServer := NewTrillianLogRPCServer(registry, fakeTimeSource)
-
-			_, err := logServer.GetLeavesByHash(ctx, test.req)
-			if s, ok := status.FromError(err); !ok || s.Code() != codes.InvalidArgument {
-				t.Errorf("%v: GetLeavesByHash() returned err = %v, wantCode = %s", test.desc, err, codes.InvalidArgument)
-			}
-		})
-	}
-}
-
 func TestTrillianLogRPCServer_GetLeavesByIndexErrors(t *testing.T) {
 	tests := []struct {
 		desc string
diff --git a/testonly/tmock/mock_log_server.go b/testonly/tmock/mock_log_server.go
index f2cca72e..acd81ce0 100644
--- a/testonly/tmock/mock_log_server.go
+++ b/testonly/tmock/mock_log_server.go
@@ -140,21 +140,6 @@ func (mr *MockTrillianLogServerMockRecorder) GetLatestSignedLogRoot(arg0, arg1 i
 	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLatestSignedLogRoot", reflect.TypeOf((*MockTrillianLogServer)(nil).GetLatestSignedLogRoot), arg0, arg1)
 }
 
-// GetLeavesByHash mocks base method.
-func (m *MockTrillianLogServer) GetLeavesByHash(arg0 context.Context, arg1 *trillian.GetLeavesByHashRequest) (*trillian.GetLeavesByHashResponse, error) {
-	m.ctrl.T.Helper()
-	ret := m.ctrl.Call(m, "GetLeavesByHash", arg0, arg1)
-	ret0, _ := ret[0].(*trillian.GetLeavesByHashResponse)
-	ret1, _ := ret[1].(error)
-	return ret0, ret1
-}
-
-// GetLeavesByHash indicates an expected call of GetLeavesByHash.
-func (mr *MockTrillianLogServerMockRecorder) GetLeavesByHash(arg0, arg1 interface{}) *gomock.Call {
-	mr.mock.ctrl.T.Helper()
-	return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetLeavesByHash", reflect.TypeOf((*MockTrillianLogServer)(nil).GetLeavesByHash), arg0, arg1)
-}
-
 // GetLeavesByIndex mocks base method.
 func (m *MockTrillianLogServer) GetLeavesByIndex(arg0 context.Context, arg1 *trillian.GetLeavesByIndexRequest) (*trillian.GetLeavesByIndexResponse, error) {
 	m.ctrl.T.Helper()