diff --git a/docs/generated/settings/settings.html b/docs/generated/settings/settings.html index e91ec3d53b0d..815f15595ec5 100644 --- a/docs/generated/settings/settings.html +++ b/docs/generated/settings/settings.html @@ -99,6 +99,6 @@ trace.debug.enablebooleanfalseif set, traces for recent requests can be seen in the /debug page trace.lightstep.tokenstringif set, traces go to Lightstep using this token trace.zipkin.collectorstringif set, traces go to the given Zipkin instance (example: '127.0.0.1:9411'); ignored if trace.lightstep.token is set. -versioncustom validation2.1-9set the active cluster version in the format '.'. +versioncustom validation2.1-10set the active cluster version in the format '.'. diff --git a/pkg/roachpb/api.pb.go b/pkg/roachpb/api.pb.go index e9e008037c5c..82414b914f4b 100644 --- a/pkg/roachpb/api.pb.go +++ b/pkg/roachpb/api.pb.go @@ -69,7 +69,7 @@ func (x ReadConsistencyType) String() string { return proto.EnumName(ReadConsistencyType_name, int32(x)) } func (ReadConsistencyType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{0} + return fileDescriptor_api_e2607f120b04f650, []int{0} } // ScanFormat is an enumeration of the available response formats for MVCCScan @@ -97,7 +97,7 @@ func (x ScanFormat) String() string { return proto.EnumName(ScanFormat_name, int32(x)) } func (ScanFormat) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{1} + return fileDescriptor_api_e2607f120b04f650, []int{1} } // PushTxnType determines what action to take when pushing a transaction. @@ -128,7 +128,7 @@ func (x PushTxnType) String() string { return proto.EnumName(PushTxnType_name, int32(x)) } func (PushTxnType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{2} + return fileDescriptor_api_e2607f120b04f650, []int{2} } type ExportStorageProvider int32 @@ -166,7 +166,7 @@ func (x ExportStorageProvider) String() string { return proto.EnumName(ExportStorageProvider_name, int32(x)) } func (ExportStorageProvider) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{3} + return fileDescriptor_api_e2607f120b04f650, []int{3} } type MVCCFilter int32 @@ -189,7 +189,7 @@ func (x MVCCFilter) String() string { return proto.EnumName(MVCCFilter_name, int32(x)) } func (MVCCFilter) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{4} + return fileDescriptor_api_e2607f120b04f650, []int{4} } type ResponseHeader_ResumeReason int32 @@ -221,7 +221,7 @@ func (x ResponseHeader_ResumeReason) String() string { return proto.EnumName(ResponseHeader_ResumeReason_name, int32(x)) } func (ResponseHeader_ResumeReason) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{2, 0} + return fileDescriptor_api_e2607f120b04f650, []int{2, 0} } type QueryIntentRequest_IfMissingBehavior int32 @@ -257,7 +257,7 @@ func (x QueryIntentRequest_IfMissingBehavior) String() string { return proto.EnumName(QueryIntentRequest_IfMissingBehavior_name, int32(x)) } func (QueryIntentRequest_IfMissingBehavior) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{50, 0} + return fileDescriptor_api_e2607f120b04f650, []int{50, 0} } // RangeInfo describes a range which executed a request. It contains @@ -273,7 +273,7 @@ func (m *RangeInfo) Reset() { *m = RangeInfo{} } func (m *RangeInfo) String() string { return proto.CompactTextString(m) } func (*RangeInfo) ProtoMessage() {} func (*RangeInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{0} + return fileDescriptor_api_e2607f120b04f650, []int{0} } func (m *RangeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -318,7 +318,7 @@ func (m *RequestHeader) Reset() { *m = RequestHeader{} } func (m *RequestHeader) String() string { return proto.CompactTextString(m) } func (*RequestHeader) ProtoMessage() {} func (*RequestHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{1} + return fileDescriptor_api_e2607f120b04f650, []int{1} } func (m *RequestHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -378,7 +378,7 @@ func (m *ResponseHeader) Reset() { *m = ResponseHeader{} } func (m *ResponseHeader) String() string { return proto.CompactTextString(m) } func (*ResponseHeader) ProtoMessage() {} func (*ResponseHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{2} + return fileDescriptor_api_e2607f120b04f650, []int{2} } func (m *ResponseHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -414,7 +414,7 @@ func (m *GetRequest) Reset() { *m = GetRequest{} } func (m *GetRequest) String() string { return proto.CompactTextString(m) } func (*GetRequest) ProtoMessage() {} func (*GetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{3} + return fileDescriptor_api_e2607f120b04f650, []int{3} } func (m *GetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -454,7 +454,7 @@ func (m *GetResponse) Reset() { *m = GetResponse{} } func (m *GetResponse) String() string { return proto.CompactTextString(m) } func (*GetResponse) ProtoMessage() {} func (*GetResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{4} + return fileDescriptor_api_e2607f120b04f650, []int{4} } func (m *GetResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -499,7 +499,7 @@ func (m *PutRequest) Reset() { *m = PutRequest{} } func (m *PutRequest) String() string { return proto.CompactTextString(m) } func (*PutRequest) ProtoMessage() {} func (*PutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{5} + return fileDescriptor_api_e2607f120b04f650, []int{5} } func (m *PutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -535,7 +535,7 @@ func (m *PutResponse) Reset() { *m = PutResponse{} } func (m *PutResponse) String() string { return proto.CompactTextString(m) } func (*PutResponse) ProtoMessage() {} func (*PutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{6} + return fileDescriptor_api_e2607f120b04f650, []int{6} } func (m *PutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -591,7 +591,7 @@ func (m *ConditionalPutRequest) Reset() { *m = ConditionalPutRequest{} } func (m *ConditionalPutRequest) String() string { return proto.CompactTextString(m) } func (*ConditionalPutRequest) ProtoMessage() {} func (*ConditionalPutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{7} + return fileDescriptor_api_e2607f120b04f650, []int{7} } func (m *ConditionalPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -628,7 +628,7 @@ func (m *ConditionalPutResponse) Reset() { *m = ConditionalPutResponse{} func (m *ConditionalPutResponse) String() string { return proto.CompactTextString(m) } func (*ConditionalPutResponse) ProtoMessage() {} func (*ConditionalPutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{8} + return fileDescriptor_api_e2607f120b04f650, []int{8} } func (m *ConditionalPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -676,7 +676,7 @@ func (m *InitPutRequest) Reset() { *m = InitPutRequest{} } func (m *InitPutRequest) String() string { return proto.CompactTextString(m) } func (*InitPutRequest) ProtoMessage() {} func (*InitPutRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{9} + return fileDescriptor_api_e2607f120b04f650, []int{9} } func (m *InitPutRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -712,7 +712,7 @@ func (m *InitPutResponse) Reset() { *m = InitPutResponse{} } func (m *InitPutResponse) String() string { return proto.CompactTextString(m) } func (*InitPutResponse) ProtoMessage() {} func (*InitPutResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{10} + return fileDescriptor_api_e2607f120b04f650, []int{10} } func (m *InitPutResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -754,7 +754,7 @@ func (m *IncrementRequest) Reset() { *m = IncrementRequest{} } func (m *IncrementRequest) String() string { return proto.CompactTextString(m) } func (*IncrementRequest) ProtoMessage() {} func (*IncrementRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{11} + return fileDescriptor_api_e2607f120b04f650, []int{11} } func (m *IncrementRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -793,7 +793,7 @@ func (m *IncrementResponse) Reset() { *m = IncrementResponse{} } func (m *IncrementResponse) String() string { return proto.CompactTextString(m) } func (*IncrementResponse) ProtoMessage() {} func (*IncrementResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{12} + return fileDescriptor_api_e2607f120b04f650, []int{12} } func (m *IncrementResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -829,7 +829,7 @@ func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } func (m *DeleteRequest) String() string { return proto.CompactTextString(m) } func (*DeleteRequest) ProtoMessage() {} func (*DeleteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{13} + return fileDescriptor_api_e2607f120b04f650, []int{13} } func (m *DeleteRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -865,7 +865,7 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } func (m *DeleteResponse) String() string { return proto.CompactTextString(m) } func (*DeleteResponse) ProtoMessage() {} func (*DeleteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{14} + return fileDescriptor_api_e2607f120b04f650, []int{14} } func (m *DeleteResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -916,7 +916,7 @@ func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} } func (m *DeleteRangeRequest) String() string { return proto.CompactTextString(m) } func (*DeleteRangeRequest) ProtoMessage() {} func (*DeleteRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{15} + return fileDescriptor_api_e2607f120b04f650, []int{15} } func (m *DeleteRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -955,7 +955,7 @@ func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} } func (m *DeleteRangeResponse) String() string { return proto.CompactTextString(m) } func (*DeleteRangeResponse) ProtoMessage() {} func (*DeleteRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{16} + return fileDescriptor_api_e2607f120b04f650, []int{16} } func (m *DeleteRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1004,7 +1004,7 @@ func (m *ClearRangeRequest) Reset() { *m = ClearRangeRequest{} } func (m *ClearRangeRequest) String() string { return proto.CompactTextString(m) } func (*ClearRangeRequest) ProtoMessage() {} func (*ClearRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{17} + return fileDescriptor_api_e2607f120b04f650, []int{17} } func (m *ClearRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1040,7 +1040,7 @@ func (m *ClearRangeResponse) Reset() { *m = ClearRangeResponse{} } func (m *ClearRangeResponse) String() string { return proto.CompactTextString(m) } func (*ClearRangeResponse) ProtoMessage() {} func (*ClearRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{18} + return fileDescriptor_api_e2607f120b04f650, []int{18} } func (m *ClearRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1111,7 +1111,7 @@ func (m *ScanOptions) Reset() { *m = ScanOptions{} } func (m *ScanOptions) String() string { return proto.CompactTextString(m) } func (*ScanOptions) ProtoMessage() {} func (*ScanOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{19} + return fileDescriptor_api_e2607f120b04f650, []int{19} } func (m *ScanOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1153,7 +1153,7 @@ func (m *ScanRequest) Reset() { *m = ScanRequest{} } func (m *ScanRequest) String() string { return proto.CompactTextString(m) } func (*ScanRequest) ProtoMessage() {} func (*ScanRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{20} + return fileDescriptor_api_e2607f120b04f650, []int{20} } func (m *ScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1202,7 +1202,7 @@ func (m *ScanResponse) Reset() { *m = ScanResponse{} } func (m *ScanResponse) String() string { return proto.CompactTextString(m) } func (*ScanResponse) ProtoMessage() {} func (*ScanResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{21} + return fileDescriptor_api_e2607f120b04f650, []int{21} } func (m *ScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1244,7 +1244,7 @@ func (m *ReverseScanRequest) Reset() { *m = ReverseScanRequest{} } func (m *ReverseScanRequest) String() string { return proto.CompactTextString(m) } func (*ReverseScanRequest) ProtoMessage() {} func (*ReverseScanRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{22} + return fileDescriptor_api_e2607f120b04f650, []int{22} } func (m *ReverseScanRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1293,7 +1293,7 @@ func (m *ReverseScanResponse) Reset() { *m = ReverseScanResponse{} } func (m *ReverseScanResponse) String() string { return proto.CompactTextString(m) } func (*ReverseScanResponse) ProtoMessage() {} func (*ReverseScanResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{23} + return fileDescriptor_api_e2607f120b04f650, []int{23} } func (m *ReverseScanResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1334,7 +1334,7 @@ func (m *CheckConsistencyRequest) Reset() { *m = CheckConsistencyRequest func (m *CheckConsistencyRequest) String() string { return proto.CompactTextString(m) } func (*CheckConsistencyRequest) ProtoMessage() {} func (*CheckConsistencyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{24} + return fileDescriptor_api_e2607f120b04f650, []int{24} } func (m *CheckConsistencyRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1371,7 +1371,7 @@ func (m *CheckConsistencyResponse) Reset() { *m = CheckConsistencyRespon func (m *CheckConsistencyResponse) String() string { return proto.CompactTextString(m) } func (*CheckConsistencyResponse) ProtoMessage() {} func (*CheckConsistencyResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{25} + return fileDescriptor_api_e2607f120b04f650, []int{25} } func (m *CheckConsistencyResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1421,7 +1421,7 @@ func (m *RecomputeStatsRequest) Reset() { *m = RecomputeStatsRequest{} } func (m *RecomputeStatsRequest) String() string { return proto.CompactTextString(m) } func (*RecomputeStatsRequest) ProtoMessage() {} func (*RecomputeStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{26} + return fileDescriptor_api_e2607f120b04f650, []int{26} } func (m *RecomputeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1459,7 +1459,7 @@ func (m *RecomputeStatsResponse) Reset() { *m = RecomputeStatsResponse{} func (m *RecomputeStatsResponse) String() string { return proto.CompactTextString(m) } func (*RecomputeStatsResponse) ProtoMessage() {} func (*RecomputeStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{27} + return fileDescriptor_api_e2607f120b04f650, []int{27} } func (m *RecomputeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1495,7 +1495,7 @@ func (m *BeginTransactionRequest) Reset() { *m = BeginTransactionRequest func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) } func (*BeginTransactionRequest) ProtoMessage() {} func (*BeginTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{28} + return fileDescriptor_api_e2607f120b04f650, []int{28} } func (m *BeginTransactionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1531,7 +1531,7 @@ func (m *BeginTransactionResponse) Reset() { *m = BeginTransactionRespon func (m *BeginTransactionResponse) String() string { return proto.CompactTextString(m) } func (*BeginTransactionResponse) ProtoMessage() {} func (*BeginTransactionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{29} + return fileDescriptor_api_e2607f120b04f650, []int{29} } func (m *BeginTransactionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1605,7 +1605,7 @@ func (m *EndTransactionRequest) Reset() { *m = EndTransactionRequest{} } func (m *EndTransactionRequest) String() string { return proto.CompactTextString(m) } func (*EndTransactionRequest) ProtoMessage() {} func (*EndTransactionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{30} + return fileDescriptor_api_e2607f120b04f650, []int{30} } func (m *EndTransactionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1651,7 +1651,7 @@ func (m *EndTransactionResponse) Reset() { *m = EndTransactionResponse{} func (m *EndTransactionResponse) String() string { return proto.CompactTextString(m) } func (*EndTransactionResponse) ProtoMessage() {} func (*EndTransactionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{31} + return fileDescriptor_api_e2607f120b04f650, []int{31} } func (m *EndTransactionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1707,7 +1707,7 @@ func (m *AdminSplitRequest) Reset() { *m = AdminSplitRequest{} } func (m *AdminSplitRequest) String() string { return proto.CompactTextString(m) } func (*AdminSplitRequest) ProtoMessage() {} func (*AdminSplitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{32} + return fileDescriptor_api_e2607f120b04f650, []int{32} } func (m *AdminSplitRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1744,7 +1744,7 @@ func (m *AdminSplitResponse) Reset() { *m = AdminSplitResponse{} } func (m *AdminSplitResponse) String() string { return proto.CompactTextString(m) } func (*AdminSplitResponse) ProtoMessage() {} func (*AdminSplitResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{33} + return fileDescriptor_api_e2607f120b04f650, []int{33} } func (m *AdminSplitResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1788,7 +1788,7 @@ func (m *AdminMergeRequest) Reset() { *m = AdminMergeRequest{} } func (m *AdminMergeRequest) String() string { return proto.CompactTextString(m) } func (*AdminMergeRequest) ProtoMessage() {} func (*AdminMergeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{34} + return fileDescriptor_api_e2607f120b04f650, []int{34} } func (m *AdminMergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1825,7 +1825,7 @@ func (m *AdminMergeResponse) Reset() { *m = AdminMergeResponse{} } func (m *AdminMergeResponse) String() string { return proto.CompactTextString(m) } func (*AdminMergeResponse) ProtoMessage() {} func (*AdminMergeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{35} + return fileDescriptor_api_e2607f120b04f650, []int{35} } func (m *AdminMergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1865,7 +1865,7 @@ func (m *AdminTransferLeaseRequest) Reset() { *m = AdminTransferLeaseReq func (m *AdminTransferLeaseRequest) String() string { return proto.CompactTextString(m) } func (*AdminTransferLeaseRequest) ProtoMessage() {} func (*AdminTransferLeaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{36} + return fileDescriptor_api_e2607f120b04f650, []int{36} } func (m *AdminTransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1900,7 +1900,7 @@ func (m *AdminTransferLeaseResponse) Reset() { *m = AdminTransferLeaseRe func (m *AdminTransferLeaseResponse) String() string { return proto.CompactTextString(m) } func (*AdminTransferLeaseResponse) ProtoMessage() {} func (*AdminTransferLeaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{37} + return fileDescriptor_api_e2607f120b04f650, []int{37} } func (m *AdminTransferLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1940,7 +1940,7 @@ func (m *AdminChangeReplicasRequest) Reset() { *m = AdminChangeReplicasR func (m *AdminChangeReplicasRequest) String() string { return proto.CompactTextString(m) } func (*AdminChangeReplicasRequest) ProtoMessage() {} func (*AdminChangeReplicasRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{38} + return fileDescriptor_api_e2607f120b04f650, []int{38} } func (m *AdminChangeReplicasRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1975,7 +1975,7 @@ func (m *AdminChangeReplicasResponse) Reset() { *m = AdminChangeReplicas func (m *AdminChangeReplicasResponse) String() string { return proto.CompactTextString(m) } func (*AdminChangeReplicasResponse) ProtoMessage() {} func (*AdminChangeReplicasResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{39} + return fileDescriptor_api_e2607f120b04f650, []int{39} } func (m *AdminChangeReplicasResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2014,7 +2014,7 @@ func (m *AdminRelocateRangeRequest) Reset() { *m = AdminRelocateRangeReq func (m *AdminRelocateRangeRequest) String() string { return proto.CompactTextString(m) } func (*AdminRelocateRangeRequest) ProtoMessage() {} func (*AdminRelocateRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{40} + return fileDescriptor_api_e2607f120b04f650, []int{40} } func (m *AdminRelocateRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2049,7 +2049,7 @@ func (m *AdminRelocateRangeResponse) Reset() { *m = AdminRelocateRangeRe func (m *AdminRelocateRangeResponse) String() string { return proto.CompactTextString(m) } func (*AdminRelocateRangeResponse) ProtoMessage() {} func (*AdminRelocateRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{41} + return fileDescriptor_api_e2607f120b04f650, []int{41} } func (m *AdminRelocateRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2090,7 +2090,7 @@ func (m *HeartbeatTxnRequest) Reset() { *m = HeartbeatTxnRequest{} } func (m *HeartbeatTxnRequest) String() string { return proto.CompactTextString(m) } func (*HeartbeatTxnRequest) ProtoMessage() {} func (*HeartbeatTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{42} + return fileDescriptor_api_e2607f120b04f650, []int{42} } func (m *HeartbeatTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2129,7 +2129,7 @@ func (m *HeartbeatTxnResponse) Reset() { *m = HeartbeatTxnResponse{} } func (m *HeartbeatTxnResponse) String() string { return proto.CompactTextString(m) } func (*HeartbeatTxnResponse) ProtoMessage() {} func (*HeartbeatTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{43} + return fileDescriptor_api_e2607f120b04f650, []int{43} } func (m *HeartbeatTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2174,7 +2174,7 @@ func (m *GCRequest) Reset() { *m = GCRequest{} } func (m *GCRequest) String() string { return proto.CompactTextString(m) } func (*GCRequest) ProtoMessage() {} func (*GCRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{44} + return fileDescriptor_api_e2607f120b04f650, []int{44} } func (m *GCRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2210,7 +2210,7 @@ func (m *GCRequest_GCKey) Reset() { *m = GCRequest_GCKey{} } func (m *GCRequest_GCKey) String() string { return proto.CompactTextString(m) } func (*GCRequest_GCKey) ProtoMessage() {} func (*GCRequest_GCKey) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{44, 0} + return fileDescriptor_api_e2607f120b04f650, []int{44, 0} } func (m *GCRequest_GCKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2246,7 +2246,7 @@ func (m *GCResponse) Reset() { *m = GCResponse{} } func (m *GCResponse) String() string { return proto.CompactTextString(m) } func (*GCResponse) ProtoMessage() {} func (*GCResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{45} + return fileDescriptor_api_e2607f120b04f650, []int{45} } func (m *GCResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2296,15 +2296,23 @@ type PushTxnRequest struct { // up-to-date value of the transaction record, but will be set or // merged as appropriate. PusheeTxn enginepb.TxnMeta `protobuf:"bytes,3,opt,name=pushee_txn,json=pusheeTxn,proto3" json:"pushee_txn"` - // PushTo is the timestamp just after which PusheeTxn is attempted to be - // pushed. During conflict resolution, it should be set to the timestamp - // of the its conflicting write. + // PushTo is the timestamp which PusheeTxn should be pushed to. During + // conflict resolution, it should be set just after the timestamp of the + // conflicting read or write. PushTo hlc.Timestamp `protobuf:"bytes,4,opt,name=push_to,json=pushTo,proto3" json:"push_to"` - // Now holds the timestamp used to compare the last heartbeat of the pushee - // against. This is necessary since the request header's timestamp does not - // necessarily advance with the node clock across retries and hence cannot - // detect abandoned transactions. - Now hlc.Timestamp `protobuf:"bytes,5,opt,name=now,proto3" json:"now"` + // InclusivePushTo is sent by nodes to specify that their PushTo timestamp + // is the timestamp they want the transaction to be pushed to, instead of + // the timestamp before the one they want the transaction to be pushed to. + // It is used to assist that field's migration. + // TODO(nvanbenschoten): Remove this field in 19.2. + InclusivePushTo bool `protobuf:"varint,9,opt,name=inclusive_push_to,json=inclusivePushTo,proto3" json:"inclusive_push_to,omitempty"` + // DeprecatedNow holds the timestamp used to compare the last heartbeat of the + // pushee against. + // + // The field remains for compatibility with 2.1 nodes. Users should set the + // same value for this field and the batch header timestamp. + // TODO(nvanbenschoten): Remove this field in 19.2. + DeprecatedNow hlc.Timestamp `protobuf:"bytes,5,opt,name=deprecated_now,json=deprecatedNow,proto3" json:"deprecated_now"` // Readers set this to PUSH_TIMESTAMP to move pushee_txn's provisional // commit timestamp forward. Writers set this to PUSH_ABORT to request // that pushee_txn be aborted if possible. Inconsistent readers set @@ -2322,7 +2330,7 @@ func (m *PushTxnRequest) Reset() { *m = PushTxnRequest{} } func (m *PushTxnRequest) String() string { return proto.CompactTextString(m) } func (*PushTxnRequest) ProtoMessage() {} func (*PushTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{46} + return fileDescriptor_api_e2607f120b04f650, []int{46} } func (m *PushTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2367,7 +2375,7 @@ func (m *PushTxnResponse) Reset() { *m = PushTxnResponse{} } func (m *PushTxnResponse) String() string { return proto.CompactTextString(m) } func (*PushTxnResponse) ProtoMessage() {} func (*PushTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{47} + return fileDescriptor_api_e2607f120b04f650, []int{47} } func (m *PushTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2413,7 +2421,7 @@ func (m *QueryTxnRequest) Reset() { *m = QueryTxnRequest{} } func (m *QueryTxnRequest) String() string { return proto.CompactTextString(m) } func (*QueryTxnRequest) ProtoMessage() {} func (*QueryTxnRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{48} + return fileDescriptor_api_e2607f120b04f650, []int{48} } func (m *QueryTxnRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2454,7 +2462,7 @@ func (m *QueryTxnResponse) Reset() { *m = QueryTxnResponse{} } func (m *QueryTxnResponse) String() string { return proto.CompactTextString(m) } func (*QueryTxnResponse) ProtoMessage() {} func (*QueryTxnResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{49} + return fileDescriptor_api_e2607f120b04f650, []int{49} } func (m *QueryTxnResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2516,7 +2524,7 @@ func (m *QueryIntentRequest) Reset() { *m = QueryIntentRequest{} } func (m *QueryIntentRequest) String() string { return proto.CompactTextString(m) } func (*QueryIntentRequest) ProtoMessage() {} func (*QueryIntentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{50} + return fileDescriptor_api_e2607f120b04f650, []int{50} } func (m *QueryIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2554,7 +2562,7 @@ func (m *QueryIntentResponse) Reset() { *m = QueryIntentResponse{} } func (m *QueryIntentResponse) String() string { return proto.CompactTextString(m) } func (*QueryIntentResponse) ProtoMessage() {} func (*QueryIntentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{51} + return fileDescriptor_api_e2607f120b04f650, []int{51} } func (m *QueryIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2600,7 +2608,7 @@ func (m *ResolveIntentRequest) Reset() { *m = ResolveIntentRequest{} } func (m *ResolveIntentRequest) String() string { return proto.CompactTextString(m) } func (*ResolveIntentRequest) ProtoMessage() {} func (*ResolveIntentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{52} + return fileDescriptor_api_e2607f120b04f650, []int{52} } func (m *ResolveIntentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2637,7 +2645,7 @@ func (m *ResolveIntentResponse) Reset() { *m = ResolveIntentResponse{} } func (m *ResolveIntentResponse) String() string { return proto.CompactTextString(m) } func (*ResolveIntentResponse) ProtoMessage() {} func (*ResolveIntentResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{53} + return fileDescriptor_api_e2607f120b04f650, []int{53} } func (m *ResolveIntentResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2687,7 +2695,7 @@ func (m *ResolveIntentRangeRequest) Reset() { *m = ResolveIntentRangeReq func (m *ResolveIntentRangeRequest) String() string { return proto.CompactTextString(m) } func (*ResolveIntentRangeRequest) ProtoMessage() {} func (*ResolveIntentRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{54} + return fileDescriptor_api_e2607f120b04f650, []int{54} } func (m *ResolveIntentRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2724,7 +2732,7 @@ func (m *ResolveIntentRangeResponse) Reset() { *m = ResolveIntentRangeRe func (m *ResolveIntentRangeResponse) String() string { return proto.CompactTextString(m) } func (*ResolveIntentRangeResponse) ProtoMessage() {} func (*ResolveIntentRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{55} + return fileDescriptor_api_e2607f120b04f650, []int{55} } func (m *ResolveIntentRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2763,7 +2771,7 @@ func (m *MergeRequest) Reset() { *m = MergeRequest{} } func (m *MergeRequest) String() string { return proto.CompactTextString(m) } func (*MergeRequest) ProtoMessage() {} func (*MergeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{56} + return fileDescriptor_api_e2607f120b04f650, []int{56} } func (m *MergeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2799,7 +2807,7 @@ func (m *MergeResponse) Reset() { *m = MergeResponse{} } func (m *MergeResponse) String() string { return proto.CompactTextString(m) } func (*MergeResponse) ProtoMessage() {} func (*MergeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{57} + return fileDescriptor_api_e2607f120b04f650, []int{57} } func (m *MergeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2846,7 +2854,7 @@ func (m *TruncateLogRequest) Reset() { *m = TruncateLogRequest{} } func (m *TruncateLogRequest) String() string { return proto.CompactTextString(m) } func (*TruncateLogRequest) ProtoMessage() {} func (*TruncateLogRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{58} + return fileDescriptor_api_e2607f120b04f650, []int{58} } func (m *TruncateLogRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2882,7 +2890,7 @@ func (m *TruncateLogResponse) Reset() { *m = TruncateLogResponse{} } func (m *TruncateLogResponse) String() string { return proto.CompactTextString(m) } func (*TruncateLogResponse) ProtoMessage() {} func (*TruncateLogResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{59} + return fileDescriptor_api_e2607f120b04f650, []int{59} } func (m *TruncateLogResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2928,7 +2936,7 @@ func (m *RequestLeaseRequest) Reset() { *m = RequestLeaseRequest{} } func (m *RequestLeaseRequest) String() string { return proto.CompactTextString(m) } func (*RequestLeaseRequest) ProtoMessage() {} func (*RequestLeaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{60} + return fileDescriptor_api_e2607f120b04f650, []int{60} } func (m *RequestLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2979,7 +2987,7 @@ func (m *TransferLeaseRequest) Reset() { *m = TransferLeaseRequest{} } func (m *TransferLeaseRequest) String() string { return proto.CompactTextString(m) } func (*TransferLeaseRequest) ProtoMessage() {} func (*TransferLeaseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{61} + return fileDescriptor_api_e2607f120b04f650, []int{61} } func (m *TransferLeaseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3018,7 +3026,7 @@ func (m *LeaseInfoRequest) Reset() { *m = LeaseInfoRequest{} } func (m *LeaseInfoRequest) String() string { return proto.CompactTextString(m) } func (*LeaseInfoRequest) ProtoMessage() {} func (*LeaseInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{62} + return fileDescriptor_api_e2607f120b04f650, []int{62} } func (m *LeaseInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3057,7 +3065,7 @@ func (m *LeaseInfoResponse) Reset() { *m = LeaseInfoResponse{} } func (m *LeaseInfoResponse) String() string { return proto.CompactTextString(m) } func (*LeaseInfoResponse) ProtoMessage() {} func (*LeaseInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{63} + return fileDescriptor_api_e2607f120b04f650, []int{63} } func (m *LeaseInfoResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3094,7 +3102,7 @@ func (m *RequestLeaseResponse) Reset() { *m = RequestLeaseResponse{} } func (m *RequestLeaseResponse) String() string { return proto.CompactTextString(m) } func (*RequestLeaseResponse) ProtoMessage() {} func (*RequestLeaseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{64} + return fileDescriptor_api_e2607f120b04f650, []int{64} } func (m *RequestLeaseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3139,7 +3147,7 @@ func (m *ComputeChecksumRequest) Reset() { *m = ComputeChecksumRequest{} func (m *ComputeChecksumRequest) String() string { return proto.CompactTextString(m) } func (*ComputeChecksumRequest) ProtoMessage() {} func (*ComputeChecksumRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{65} + return fileDescriptor_api_e2607f120b04f650, []int{65} } func (m *ComputeChecksumRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3178,7 +3186,7 @@ func (m *ComputeChecksumResponse) Reset() { *m = ComputeChecksumResponse func (m *ComputeChecksumResponse) String() string { return proto.CompactTextString(m) } func (*ComputeChecksumResponse) ProtoMessage() {} func (*ComputeChecksumResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{66} + return fileDescriptor_api_e2607f120b04f650, []int{66} } func (m *ComputeChecksumResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3219,7 +3227,7 @@ func (m *ExportStorage) Reset() { *m = ExportStorage{} } func (m *ExportStorage) String() string { return proto.CompactTextString(m) } func (*ExportStorage) ProtoMessage() {} func (*ExportStorage) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{67} + return fileDescriptor_api_e2607f120b04f650, []int{67} } func (m *ExportStorage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3255,7 +3263,7 @@ func (m *ExportStorage_LocalFilePath) Reset() { *m = ExportStorage_Local func (m *ExportStorage_LocalFilePath) String() string { return proto.CompactTextString(m) } func (*ExportStorage_LocalFilePath) ProtoMessage() {} func (*ExportStorage_LocalFilePath) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{67, 0} + return fileDescriptor_api_e2607f120b04f650, []int{67, 0} } func (m *ExportStorage_LocalFilePath) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3290,7 +3298,7 @@ func (m *ExportStorage_Http) Reset() { *m = ExportStorage_Http{} } func (m *ExportStorage_Http) String() string { return proto.CompactTextString(m) } func (*ExportStorage_Http) ProtoMessage() {} func (*ExportStorage_Http) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{67, 1} + return fileDescriptor_api_e2607f120b04f650, []int{67, 1} } func (m *ExportStorage_Http) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3331,7 +3339,7 @@ func (m *ExportStorage_S3) Reset() { *m = ExportStorage_S3{} } func (m *ExportStorage_S3) String() string { return proto.CompactTextString(m) } func (*ExportStorage_S3) ProtoMessage() {} func (*ExportStorage_S3) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{67, 2} + return fileDescriptor_api_e2607f120b04f650, []int{67, 2} } func (m *ExportStorage_S3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3372,7 +3380,7 @@ func (m *ExportStorage_GCS) Reset() { *m = ExportStorage_GCS{} } func (m *ExportStorage_GCS) String() string { return proto.CompactTextString(m) } func (*ExportStorage_GCS) ProtoMessage() {} func (*ExportStorage_GCS) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{67, 3} + return fileDescriptor_api_e2607f120b04f650, []int{67, 3} } func (m *ExportStorage_GCS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3410,7 +3418,7 @@ func (m *ExportStorage_Azure) Reset() { *m = ExportStorage_Azure{} } func (m *ExportStorage_Azure) String() string { return proto.CompactTextString(m) } func (*ExportStorage_Azure) ProtoMessage() {} func (*ExportStorage_Azure) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{67, 4} + return fileDescriptor_api_e2607f120b04f650, []int{67, 4} } func (m *ExportStorage_Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3451,7 +3459,7 @@ func (m *ExportStorage_Workload) Reset() { *m = ExportStorage_Workload{} func (m *ExportStorage_Workload) String() string { return proto.CompactTextString(m) } func (*ExportStorage_Workload) ProtoMessage() {} func (*ExportStorage_Workload) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{67, 5} + return fileDescriptor_api_e2607f120b04f650, []int{67, 5} } func (m *ExportStorage_Workload) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3493,7 +3501,7 @@ func (m *WriteBatchRequest) Reset() { *m = WriteBatchRequest{} } func (m *WriteBatchRequest) String() string { return proto.CompactTextString(m) } func (*WriteBatchRequest) ProtoMessage() {} func (*WriteBatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{68} + return fileDescriptor_api_e2607f120b04f650, []int{68} } func (m *WriteBatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3529,7 +3537,7 @@ func (m *WriteBatchResponse) Reset() { *m = WriteBatchResponse{} } func (m *WriteBatchResponse) String() string { return proto.CompactTextString(m) } func (*WriteBatchResponse) ProtoMessage() {} func (*WriteBatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{69} + return fileDescriptor_api_e2607f120b04f650, []int{69} } func (m *WriteBatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3576,7 +3584,7 @@ func (m *ExportRequest) Reset() { *m = ExportRequest{} } func (m *ExportRequest) String() string { return proto.CompactTextString(m) } func (*ExportRequest) ProtoMessage() {} func (*ExportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{70} + return fileDescriptor_api_e2607f120b04f650, []int{70} } func (m *ExportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3614,7 +3622,7 @@ func (m *BulkOpSummary) Reset() { *m = BulkOpSummary{} } func (m *BulkOpSummary) String() string { return proto.CompactTextString(m) } func (*BulkOpSummary) ProtoMessage() {} func (*BulkOpSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{71} + return fileDescriptor_api_e2607f120b04f650, []int{71} } func (m *BulkOpSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3652,7 +3660,7 @@ func (m *ExportResponse) Reset() { *m = ExportResponse{} } func (m *ExportResponse) String() string { return proto.CompactTextString(m) } func (*ExportResponse) ProtoMessage() {} func (*ExportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{72} + return fileDescriptor_api_e2607f120b04f650, []int{72} } func (m *ExportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3693,7 +3701,7 @@ func (m *ExportResponse_File) Reset() { *m = ExportResponse_File{} } func (m *ExportResponse_File) String() string { return proto.CompactTextString(m) } func (*ExportResponse_File) ProtoMessage() {} func (*ExportResponse_File) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{72, 0} + return fileDescriptor_api_e2607f120b04f650, []int{72, 0} } func (m *ExportResponse_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3745,7 +3753,7 @@ func (m *ImportRequest) Reset() { *m = ImportRequest{} } func (m *ImportRequest) String() string { return proto.CompactTextString(m) } func (*ImportRequest) ProtoMessage() {} func (*ImportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{73} + return fileDescriptor_api_e2607f120b04f650, []int{73} } func (m *ImportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3782,7 +3790,7 @@ func (m *ImportRequest_File) Reset() { *m = ImportRequest_File{} } func (m *ImportRequest_File) String() string { return proto.CompactTextString(m) } func (*ImportRequest_File) ProtoMessage() {} func (*ImportRequest_File) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{73, 0} + return fileDescriptor_api_e2607f120b04f650, []int{73, 0} } func (m *ImportRequest_File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3820,7 +3828,7 @@ func (m *ImportRequest_TableRekey) Reset() { *m = ImportRequest_TableRek func (m *ImportRequest_TableRekey) String() string { return proto.CompactTextString(m) } func (*ImportRequest_TableRekey) ProtoMessage() {} func (*ImportRequest_TableRekey) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{73, 1} + return fileDescriptor_api_e2607f120b04f650, []int{73, 1} } func (m *ImportRequest_TableRekey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3857,7 +3865,7 @@ func (m *ImportResponse) Reset() { *m = ImportResponse{} } func (m *ImportResponse) String() string { return proto.CompactTextString(m) } func (*ImportResponse) ProtoMessage() {} func (*ImportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{74} + return fileDescriptor_api_e2607f120b04f650, []int{74} } func (m *ImportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3897,7 +3905,7 @@ func (m *AdminScatterRequest) Reset() { *m = AdminScatterRequest{} } func (m *AdminScatterRequest) String() string { return proto.CompactTextString(m) } func (*AdminScatterRequest) ProtoMessage() {} func (*AdminScatterRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{75} + return fileDescriptor_api_e2607f120b04f650, []int{75} } func (m *AdminScatterRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3934,7 +3942,7 @@ func (m *AdminScatterResponse) Reset() { *m = AdminScatterResponse{} } func (m *AdminScatterResponse) String() string { return proto.CompactTextString(m) } func (*AdminScatterResponse) ProtoMessage() {} func (*AdminScatterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{76} + return fileDescriptor_api_e2607f120b04f650, []int{76} } func (m *AdminScatterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3969,7 +3977,7 @@ func (m *AdminScatterResponse_Range) Reset() { *m = AdminScatterResponse func (m *AdminScatterResponse_Range) String() string { return proto.CompactTextString(m) } func (*AdminScatterResponse_Range) ProtoMessage() {} func (*AdminScatterResponse_Range) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{76, 0} + return fileDescriptor_api_e2607f120b04f650, []int{76, 0} } func (m *AdminScatterResponse_Range) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4007,7 +4015,7 @@ func (m *AddSSTableRequest) Reset() { *m = AddSSTableRequest{} } func (m *AddSSTableRequest) String() string { return proto.CompactTextString(m) } func (*AddSSTableRequest) ProtoMessage() {} func (*AddSSTableRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{77} + return fileDescriptor_api_e2607f120b04f650, []int{77} } func (m *AddSSTableRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4043,7 +4051,7 @@ func (m *AddSSTableResponse) Reset() { *m = AddSSTableResponse{} } func (m *AddSSTableResponse) String() string { return proto.CompactTextString(m) } func (*AddSSTableResponse) ProtoMessage() {} func (*AddSSTableResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{78} + return fileDescriptor_api_e2607f120b04f650, []int{78} } func (m *AddSSTableResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4089,7 +4097,7 @@ func (m *RefreshRequest) Reset() { *m = RefreshRequest{} } func (m *RefreshRequest) String() string { return proto.CompactTextString(m) } func (*RefreshRequest) ProtoMessage() {} func (*RefreshRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{79} + return fileDescriptor_api_e2607f120b04f650, []int{79} } func (m *RefreshRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4125,7 +4133,7 @@ func (m *RefreshResponse) Reset() { *m = RefreshResponse{} } func (m *RefreshResponse) String() string { return proto.CompactTextString(m) } func (*RefreshResponse) ProtoMessage() {} func (*RefreshResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{80} + return fileDescriptor_api_e2607f120b04f650, []int{80} } func (m *RefreshResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4167,7 +4175,7 @@ func (m *RefreshRangeRequest) Reset() { *m = RefreshRangeRequest{} } func (m *RefreshRangeRequest) String() string { return proto.CompactTextString(m) } func (*RefreshRangeRequest) ProtoMessage() {} func (*RefreshRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{81} + return fileDescriptor_api_e2607f120b04f650, []int{81} } func (m *RefreshRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4203,7 +4211,7 @@ func (m *RefreshRangeResponse) Reset() { *m = RefreshRangeResponse{} } func (m *RefreshRangeResponse) String() string { return proto.CompactTextString(m) } func (*RefreshRangeResponse) ProtoMessage() {} func (*RefreshRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{82} + return fileDescriptor_api_e2607f120b04f650, []int{82} } func (m *RefreshRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4251,7 +4259,7 @@ func (m *SubsumeRequest) Reset() { *m = SubsumeRequest{} } func (m *SubsumeRequest) String() string { return proto.CompactTextString(m) } func (*SubsumeRequest) ProtoMessage() {} func (*SubsumeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{83} + return fileDescriptor_api_e2607f120b04f650, []int{83} } func (m *SubsumeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4298,7 +4306,7 @@ func (m *SubsumeResponse) Reset() { *m = SubsumeResponse{} } func (m *SubsumeResponse) String() string { return proto.CompactTextString(m) } func (*SubsumeResponse) ProtoMessage() {} func (*SubsumeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{84} + return fileDescriptor_api_e2607f120b04f650, []int{84} } func (m *SubsumeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4335,7 +4343,7 @@ func (m *RangeStatsRequest) Reset() { *m = RangeStatsRequest{} } func (m *RangeStatsRequest) String() string { return proto.CompactTextString(m) } func (*RangeStatsRequest) ProtoMessage() {} func (*RangeStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{85} + return fileDescriptor_api_e2607f120b04f650, []int{85} } func (m *RangeStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4376,7 +4384,7 @@ func (m *RangeStatsResponse) Reset() { *m = RangeStatsResponse{} } func (m *RangeStatsResponse) String() string { return proto.CompactTextString(m) } func (*RangeStatsResponse) ProtoMessage() {} func (*RangeStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{86} + return fileDescriptor_api_e2607f120b04f650, []int{86} } func (m *RangeStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4458,7 +4466,7 @@ func (m *RequestUnion) Reset() { *m = RequestUnion{} } func (m *RequestUnion) String() string { return proto.CompactTextString(m) } func (*RequestUnion) ProtoMessage() {} func (*RequestUnion) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{87} + return fileDescriptor_api_e2607f120b04f650, []int{87} } func (m *RequestUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5817,7 +5825,7 @@ func (m *ResponseUnion) Reset() { *m = ResponseUnion{} } func (m *ResponseUnion) String() string { return proto.CompactTextString(m) } func (*ResponseUnion) ProtoMessage() {} func (*ResponseUnion) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{88} + return fileDescriptor_api_e2607f120b04f650, []int{88} } func (m *ResponseUnion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7166,7 +7174,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{89} + return fileDescriptor_api_e2607f120b04f650, []int{89} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7204,7 +7212,7 @@ type BatchRequest struct { func (m *BatchRequest) Reset() { *m = BatchRequest{} } func (*BatchRequest) ProtoMessage() {} func (*BatchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{90} + return fileDescriptor_api_e2607f120b04f650, []int{90} } func (m *BatchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7243,7 +7251,7 @@ type BatchResponse struct { func (m *BatchResponse) Reset() { *m = BatchResponse{} } func (*BatchResponse) ProtoMessage() {} func (*BatchResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{91} + return fileDescriptor_api_e2607f120b04f650, []int{91} } func (m *BatchResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7304,7 +7312,7 @@ func (m *BatchResponse_Header) Reset() { *m = BatchResponse_Header{} } func (m *BatchResponse_Header) String() string { return proto.CompactTextString(m) } func (*BatchResponse_Header) ProtoMessage() {} func (*BatchResponse_Header) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{91, 0} + return fileDescriptor_api_e2607f120b04f650, []int{91, 0} } func (m *BatchResponse_Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7342,7 +7350,7 @@ func (m *RangeFeedRequest) Reset() { *m = RangeFeedRequest{} } func (m *RangeFeedRequest) String() string { return proto.CompactTextString(m) } func (*RangeFeedRequest) ProtoMessage() {} func (*RangeFeedRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{92} + return fileDescriptor_api_e2607f120b04f650, []int{92} } func (m *RangeFeedRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7380,7 +7388,7 @@ func (m *RangeFeedValue) Reset() { *m = RangeFeedValue{} } func (m *RangeFeedValue) String() string { return proto.CompactTextString(m) } func (*RangeFeedValue) ProtoMessage() {} func (*RangeFeedValue) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{93} + return fileDescriptor_api_e2607f120b04f650, []int{93} } func (m *RangeFeedValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7420,7 +7428,7 @@ func (m *RangeFeedCheckpoint) Reset() { *m = RangeFeedCheckpoint{} } func (m *RangeFeedCheckpoint) String() string { return proto.CompactTextString(m) } func (*RangeFeedCheckpoint) ProtoMessage() {} func (*RangeFeedCheckpoint) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{94} + return fileDescriptor_api_e2607f120b04f650, []int{94} } func (m *RangeFeedCheckpoint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7459,7 +7467,7 @@ func (m *RangeFeedError) Reset() { *m = RangeFeedError{} } func (m *RangeFeedError) String() string { return proto.CompactTextString(m) } func (*RangeFeedError) ProtoMessage() {} func (*RangeFeedError) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{95} + return fileDescriptor_api_e2607f120b04f650, []int{95} } func (m *RangeFeedError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7498,7 +7506,7 @@ func (m *RangeFeedEvent) Reset() { *m = RangeFeedEvent{} } func (m *RangeFeedEvent) String() string { return proto.CompactTextString(m) } func (*RangeFeedEvent) ProtoMessage() {} func (*RangeFeedEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_api_0624836d76b24d58, []int{96} + return fileDescriptor_api_e2607f120b04f650, []int{96} } func (m *RangeFeedEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8379,7 +8387,10 @@ func (this *PushTxnRequest) Equal(that interface{}) bool { if !this.PushTo.Equal(&that1.PushTo) { return false } - if !this.Now.Equal(&that1.Now) { + if this.InclusivePushTo != that1.InclusivePushTo { + return false + } + if !this.DeprecatedNow.Equal(&that1.DeprecatedNow) { return false } if this.PushType != that1.PushType { @@ -11164,8 +11175,8 @@ func (m *PushTxnRequest) MarshalTo(dAtA []byte) (int, error) { i += n63 dAtA[i] = 0x2a i++ - i = encodeVarintApi(dAtA, i, uint64(m.Now.Size())) - n64, err := m.Now.MarshalTo(dAtA[i:]) + i = encodeVarintApi(dAtA, i, uint64(m.DeprecatedNow.Size())) + n64, err := m.DeprecatedNow.MarshalTo(dAtA[i:]) if err != nil { return 0, err } @@ -11185,6 +11196,16 @@ func (m *PushTxnRequest) MarshalTo(dAtA []byte) (int, error) { } i++ } + if m.InclusivePushTo { + dAtA[i] = 0x48 + i++ + if m.InclusivePushTo { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } return i, nil } @@ -15608,7 +15629,7 @@ func (m *PushTxnRequest) Size() (n int) { n += 1 + l + sovApi(uint64(l)) l = m.PushTo.Size() n += 1 + l + sovApi(uint64(l)) - l = m.Now.Size() + l = m.DeprecatedNow.Size() n += 1 + l + sovApi(uint64(l)) if m.PushType != 0 { n += 1 + sovApi(uint64(m.PushType)) @@ -15616,6 +15637,9 @@ func (m *PushTxnRequest) Size() (n int) { if m.Force { n += 2 } + if m.InclusivePushTo { + n += 2 + } return n } @@ -22979,7 +23003,7 @@ func (m *PushTxnRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Now", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedNow", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -23003,7 +23027,7 @@ func (m *PushTxnRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Now.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.DeprecatedNow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -23046,6 +23070,26 @@ func (m *PushTxnRequest) Unmarshal(dAtA []byte) error { } } m.Force = bool(v != 0) + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field InclusivePushTo", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + m.InclusivePushTo = bool(v != 0) default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -33544,18 +33588,18 @@ var ( ErrIntOverflowApi = fmt.Errorf("proto: integer overflow") ) -func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_0624836d76b24d58) } +func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_e2607f120b04f650) } -var fileDescriptor_api_0624836d76b24d58 = []byte{ - // 6211 bytes of a gzipped FileDescriptorProto +var fileDescriptor_api_e2607f120b04f650 = []byte{ + // 6252 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3d, 0x4b, 0x6c, 0x23, 0xc9, 0x75, 0x6a, 0x92, 0x92, 0xc8, 0x47, 0x91, 0x6a, 0x95, 0xe6, 0xc3, 0xd1, 0xcc, 0x8e, 0x34, 0x9c, 0xef, 0xce, 0xee, 0x6a, 0x3c, 0x33, 0xde, 0xac, 0xb3, 0x6b, 0xaf, 0x2d, 0x52, 0x9a, 0x21, 0x47, 0xa3, 0xcf, 0x16, 0xa9, 0x59, 0xcf, 0x3a, 0x9b, 0x76, 0xab, 0xbb, 0x44, 0xb5, 0x87, 0xec, 0xe6, 0x76, 0x37, 0x47, 0xd2, 0x00, 0x41, 0x02, 0xe7, 0xe0, 0xc0, 0x30, 0x8c, 0x20, 0x09, 0x82, 0xc0, - 0xf9, 0x19, 0xf0, 0x21, 0x40, 0x82, 0x18, 0x31, 0x60, 0x20, 0x40, 0x80, 0xd8, 0x97, 0x1c, 0x16, + 0xf9, 0x19, 0xf0, 0x21, 0x40, 0x82, 0x18, 0x31, 0x60, 0x20, 0x40, 0x80, 0xc4, 0x97, 0x1c, 0x16, 0x46, 0x0e, 0x4e, 0x80, 0x04, 0x41, 0x0e, 0x42, 0xa2, 0x1c, 0x6c, 0xe4, 0x92, 0x43, 0x0e, 0x01, - 0xf6, 0x10, 0x04, 0xf5, 0xe9, 0x0f, 0xc9, 0xe6, 0x67, 0x66, 0x7b, 0x91, 0x0d, 0x72, 0x12, 0xeb, + 0xf6, 0x90, 0x04, 0xf5, 0xe9, 0x0f, 0xc9, 0xe6, 0x67, 0x66, 0x7b, 0x91, 0x0d, 0x72, 0x12, 0xeb, 0x55, 0xbd, 0xd7, 0x55, 0xef, 0xbd, 0x7a, 0xf5, 0x5e, 0xd5, 0xab, 0x12, 0xcc, 0xd9, 0x96, 0xaa, 0xed, 0xb7, 0x77, 0x6f, 0xa9, 0x6d, 0x63, 0xb9, 0x6d, 0x5b, 0xae, 0x85, 0xe6, 0x34, 0x4b, 0x7b, 0xc2, 0xc0, 0xcb, 0xa2, 0x72, 0x01, 0x79, 0xad, 0x74, 0xd5, 0x55, 0x79, 0xb3, 0x85, 0x53, 0x1e, @@ -33564,7 +33608,7 @@ var fileDescriptor_api_0624836d76b24d58 = []byte{ 0xda, 0x5c, 0x1e, 0xd6, 0xe6, 0xae, 0x68, 0x54, 0xe8, 0xb8, 0x46, 0xf3, 0xd6, 0x7e, 0x53, 0xbb, 0xe5, 0x1a, 0x2d, 0xe2, 0xb8, 0x6a, 0xab, 0x2d, 0x6a, 0x96, 0x58, 0x8d, 0x6b, 0xab, 0x9a, 0x61, 0x36, 0x6e, 0xd9, 0x44, 0xb3, 0x6c, 0x9d, 0xe8, 0x8a, 0xd3, 0x56, 0x4d, 0xaf, 0xcb, 0x0d, 0xab, - 0x61, 0xb1, 0x9f, 0xb7, 0xe8, 0x2f, 0x0e, 0x2d, 0xfe, 0x2a, 0x64, 0xb0, 0x6a, 0x36, 0x48, 0xd5, + 0x61, 0xb1, 0x9f, 0xb7, 0xe8, 0x2f, 0x0e, 0x2d, 0xfe, 0x32, 0x64, 0xb0, 0x6a, 0x36, 0x48, 0xd5, 0xdc, 0xb3, 0xd0, 0xe7, 0x21, 0xa5, 0x13, 0x47, 0x2b, 0x48, 0x4b, 0xd2, 0x8d, 0xec, 0x9d, 0xe2, 0x72, 0x1f, 0x2f, 0x96, 0x59, 0xdb, 0x55, 0xe2, 0x68, 0xb6, 0xd1, 0x76, 0x2d, 0xbb, 0x94, 0xfa, 0xf0, 0x78, 0x71, 0x02, 0x33, 0x2c, 0xf4, 0x59, 0x98, 0x6c, 0x12, 0xd5, 0x21, 0x85, 0x04, 0x43, @@ -33573,7 +33617,7 @@ var fileDescriptor_api_0624836d76b24d58 = []byte{ 0x37, 0x66, 0x4a, 0xd3, 0x1f, 0x1d, 0x2f, 0x26, 0xd7, 0xc9, 0x11, 0xa6, 0x30, 0xb4, 0x04, 0xd3, 0xc4, 0xd4, 0x15, 0x5a, 0x9d, 0xea, 0xae, 0x9e, 0x22, 0xa6, 0xbe, 0x4e, 0x8e, 0xd0, 0x02, 0xa4, 0x1d, 0x4a, 0xcd, 0xd4, 0x48, 0x61, 0x72, 0x49, 0xba, 0x31, 0x89, 0xfd, 0xf2, 0x9b, 0xa9, 0x9f, - 0x7f, 0x77, 0x51, 0x7a, 0x90, 0x4a, 0x4b, 0x72, 0xe2, 0x41, 0x2a, 0x9d, 0x90, 0x93, 0xc5, 0x6f, + 0x7d, 0x77, 0x51, 0x7a, 0x90, 0x4a, 0x4b, 0x72, 0xe2, 0x41, 0x2a, 0x9d, 0x90, 0x93, 0xc5, 0x6f, 0x25, 0x21, 0x8f, 0x89, 0xd3, 0xb6, 0x4c, 0x87, 0x88, 0xaf, 0x7f, 0x06, 0x92, 0xee, 0xa1, 0xc9, 0xbe, 0x9e, 0xbd, 0x73, 0x31, 0x62, 0x08, 0x75, 0x5b, 0x35, 0x1d, 0x55, 0x73, 0x0d, 0xcb, 0xc4, 0xb4, 0x29, 0xfa, 0x1c, 0x64, 0x6d, 0xe2, 0x74, 0x5a, 0x84, 0x31, 0x9b, 0x75, 0x2c, 0x7b, 0xe7, @@ -33586,12 +33630,12 @@ var fileDescriptor_api_0624836d76b24d58 = []byte{ 0x41, 0x1e, 0xaf, 0xd5, 0x76, 0x36, 0xd6, 0x94, 0x9d, 0xcd, 0xf5, 0xcd, 0xad, 0x77, 0x37, 0xe5, 0x09, 0x74, 0x0a, 0x64, 0x01, 0x5b, 0x5f, 0x7b, 0xac, 0x3c, 0xac, 0x6e, 0x54, 0xeb, 0xb2, 0x84, 0xce, 0xc1, 0x69, 0x01, 0xc5, 0x2b, 0x9b, 0xf7, 0xd7, 0x94, 0xd2, 0xd6, 0xce, 0xe6, 0xea, 0x0a, - 0x7e, 0x2c, 0x27, 0x16, 0x52, 0xbf, 0xf1, 0xbd, 0x8b, 0x13, 0xc5, 0x47, 0x00, 0xf7, 0x89, 0x2b, + 0x7e, 0x2c, 0x27, 0x16, 0x52, 0xbf, 0xf6, 0xbd, 0x8b, 0x13, 0xc5, 0x47, 0x00, 0xf7, 0x89, 0x2b, 0xb4, 0x01, 0x95, 0x60, 0x6a, 0x9f, 0xf5, 0x46, 0xa8, 0xe3, 0x52, 0x64, 0xb7, 0x43, 0x9a, 0x53, - 0x4a, 0x53, 0x0e, 0xfc, 0xf4, 0x78, 0x51, 0xc2, 0x02, 0x93, 0x8b, 0xbc, 0xf8, 0x63, 0x09, 0xb2, + 0x4a, 0x53, 0x0e, 0xfc, 0xe4, 0x78, 0x51, 0xc2, 0x02, 0x93, 0x8b, 0xbc, 0xf8, 0x23, 0x09, 0xb2, 0x8c, 0x30, 0x1f, 0x23, 0x2a, 0xf7, 0x50, 0xbe, 0x34, 0x92, 0x21, 0xfd, 0xa4, 0xd1, 0x32, 0x4c, 0x3e, 0x55, 0x9b, 0x9d, 0x61, 0xda, 0xfe, 0x88, 0xd6, 0x63, 0xde, 0x0c, 0xbd, 0x05, 0x33, 0x86, - 0xe9, 0x12, 0xd3, 0x55, 0x38, 0x5a, 0x72, 0x04, 0x5a, 0x96, 0xb7, 0x66, 0x85, 0xe2, 0x5f, 0x49, + 0xe9, 0x12, 0xd3, 0x55, 0x38, 0x5a, 0x72, 0x04, 0x5a, 0x96, 0xb7, 0x66, 0x85, 0xe2, 0x5f, 0x48, 0x00, 0xdb, 0x9d, 0x38, 0x59, 0x43, 0x67, 0xeb, 0x58, 0xfd, 0xf7, 0x66, 0x2b, 0x1f, 0xc5, 0x19, 0x98, 0x32, 0xcc, 0xa6, 0x61, 0xf2, 0xfe, 0xa7, 0xb1, 0x28, 0xa1, 0x53, 0x30, 0xb9, 0xdb, 0x34, 0x4c, 0x9d, 0xa9, 0x7f, 0x1a, 0xf3, 0x82, 0x60, 0x3f, 0x86, 0x2c, 0xeb, 0x7b, 0x8c, 0xdc, 0x2f, @@ -33599,14 +33643,14 @@ var fileDescriptor_api_0624836d76b24d58 = []byte{ 0x87, 0x0c, 0x39, 0x6c, 0x8f, 0x29, 0xde, 0x34, 0x39, 0x6c, 0xb3, 0x5f, 0xd1, 0xac, 0x43, 0x9f, 0x85, 0xb3, 0x6a, 0xb3, 0x69, 0x1d, 0x28, 0xc6, 0x9e, 0xa2, 0x5b, 0xc4, 0x51, 0x4c, 0xcb, 0x55, 0xc8, 0xa1, 0xe1, 0xb8, 0xcc, 0x54, 0xa4, 0xf1, 0x3c, 0xab, 0xae, 0xee, 0xad, 0x5a, 0xc4, 0xd9, - 0xb4, 0xdc, 0x35, 0x5a, 0x25, 0x18, 0xfe, 0x3e, 0x9c, 0xe9, 0xe5, 0x4d, 0x9c, 0xbc, 0xff, 0x7b, + 0xb4, 0xdc, 0x35, 0x5a, 0x25, 0x18, 0xfe, 0x3e, 0x9c, 0xe9, 0xe5, 0x4d, 0x9c, 0xbc, 0xff, 0x3b, 0x09, 0xf2, 0x55, 0xd3, 0x70, 0x3f, 0x15, 0x4c, 0xf7, 0xb9, 0x97, 0x0c, 0x73, 0xef, 0x26, 0xc8, 0x7b, 0xaa, 0xd1, 0xdc, 0x32, 0xeb, 0x56, 0x6b, 0xd7, 0x71, 0x2d, 0x93, 0x38, 0x82, 0xbd, 0x7d, 0x70, 0xc1, 0xb3, 0x47, 0x30, 0xeb, 0x8f, 0x29, 0x4e, 0x66, 0x3d, 0x03, 0xb9, 0x6a, 0x6a, 0x36, 0x69, 0x11, 0x33, 0x56, 0x6e, 0x5d, 0x80, 0x8c, 0xe1, 0xd1, 0x65, 0x1c, 0x4b, 0xe2, 0x00, 0x20, 0xc6, 0xd4, 0x81, 0xb9, 0xd0, 0xb7, 0xe3, 0x34, 0x7e, 0xe7, 0x21, 0x63, 0x92, 0x03, 0x25, 0x90, 0x57, 0x12, 0xa7, 0x4d, 0x72, 0xc0, 0x8d, 0xd5, 0x63, 0xc8, 0xad, 0x92, 0x26, 0x71, 0x49, 0xfc, - 0x96, 0x7c, 0x07, 0xf2, 0x1e, 0xe9, 0x38, 0x85, 0xf4, 0x87, 0x12, 0x20, 0x41, 0x97, 0xae, 0x9e, + 0x96, 0x7c, 0x07, 0xf2, 0x1e, 0xe9, 0x38, 0x85, 0xf4, 0xfb, 0x12, 0x20, 0x41, 0x97, 0xae, 0x9e, 0x71, 0xca, 0x69, 0x91, 0x7a, 0x07, 0x6e, 0xc7, 0x36, 0xf9, 0x32, 0xcf, 0xb5, 0x14, 0x38, 0x88, 0xad, 0xf4, 0x81, 0x45, 0x4d, 0x85, 0x2d, 0xaa, 0xef, 0xad, 0x50, 0x3f, 0xe5, 0x00, 0xe6, 0xbb, 0xba, 0x17, 0xaf, 0x28, 0x53, 0xac, 0x67, 0x89, 0xa5, 0x64, 0xd8, 0xa1, 0x62, 0xc0, 0xe2, 0xfb, @@ -33617,23 +33661,23 @@ var fileDescriptor_api_0624836d76b24d58 = []byte{ 0xfd, 0x69, 0xba, 0x8e, 0xd0, 0x73, 0x68, 0x19, 0x26, 0xe6, 0x10, 0x31, 0x8a, 0xef, 0x49, 0xfc, 0x5b, 0x71, 0xaa, 0xcd, 0xdb, 0x90, 0x75, 0x34, 0xd5, 0x54, 0xf6, 0x2c, 0xbb, 0xa5, 0xba, 0x4c, 0x35, 0xf2, 0x77, 0x5e, 0x8a, 0x72, 0x2a, 0x35, 0xd5, 0xbc, 0xc7, 0x1a, 0x61, 0x70, 0xfc, 0xdf, - 0x61, 0xed, 0x79, 0x90, 0x4a, 0x27, 0xe5, 0x54, 0xf1, 0xbf, 0x24, 0x98, 0xe1, 0xbd, 0x8c, 0x53, + 0x61, 0xed, 0x79, 0x90, 0x4a, 0x27, 0xe5, 0x54, 0xf1, 0x3f, 0x25, 0x98, 0xe1, 0xbd, 0x8c, 0x53, 0x7b, 0x5e, 0x87, 0x94, 0x6d, 0x1d, 0x70, 0xed, 0xc9, 0xde, 0x39, 0x1f, 0x41, 0x62, 0x9d, 0x1c, 0x85, 0xcd, 0x36, 0x6b, 0x8e, 0x4a, 0x20, 0xdc, 0x1b, 0x85, 0x61, 0x27, 0xc7, 0xc5, 0x06, 0x8e, 0x85, 0x29, 0x8d, 0xeb, 0x30, 0xbb, 0xab, 0xba, 0xda, 0x3e, 0x95, 0x0f, 0xeb, 0x24, 0x35, 0xf1, - 0xc9, 0x1b, 0x33, 0x38, 0xcf, 0xc0, 0x5e, 0xd7, 0x9d, 0xe2, 0x9f, 0x4a, 0x80, 0x30, 0x79, 0x4a, - 0x6c, 0x87, 0x7c, 0xfa, 0xc5, 0xf4, 0xdf, 0x12, 0xcc, 0x77, 0x75, 0xf6, 0xff, 0x9b, 0xb4, 0x7e, - 0x4d, 0x82, 0xb3, 0xe5, 0x7d, 0xa2, 0x3d, 0x29, 0x5b, 0xa6, 0x63, 0x38, 0x2e, 0x31, 0xb5, 0xa3, + 0xc9, 0x1b, 0x33, 0x38, 0xcf, 0xc0, 0x5e, 0xd7, 0x9d, 0xe2, 0x1f, 0x4b, 0x80, 0x30, 0x79, 0x4a, + 0x6c, 0x87, 0x7c, 0xfa, 0xc5, 0xf4, 0x5f, 0x12, 0xcc, 0x77, 0x75, 0xf6, 0xff, 0x9b, 0xb4, 0x7e, + 0x45, 0x82, 0xb3, 0xe5, 0x7d, 0xa2, 0x3d, 0x29, 0x5b, 0xa6, 0x63, 0x38, 0x2e, 0x31, 0xb5, 0xa3, 0x38, 0x45, 0x76, 0x1e, 0x32, 0x07, 0x86, 0xbb, 0xaf, 0xe8, 0xc6, 0xde, 0x1e, 0x9b, 0xd2, 0x69, 0x9c, 0xa6, 0x80, 0x55, 0x63, 0x6f, 0x4f, 0x4c, 0x68, 0x05, 0x0a, 0xfd, 0x3d, 0x88, 0xd7, 0x29, 0x38, 0x8d, 0x89, 0x66, 0xb5, 0xda, 0x1d, 0x97, 0xd4, 0x5c, 0xd5, 0x75, 0xe2, 0x1c, 0xe0, 0x59, 0x98, 0xd6, 0xed, 0x23, 0xc5, 0xee, 0x98, 0x62, 0x78, 0x53, 0xba, 0x7d, 0x84, 0x3b, 0xa6, 0x18, - 0xdc, 0x5f, 0x4a, 0x70, 0xa6, 0xf7, 0xe3, 0x71, 0xea, 0xd8, 0x97, 0x21, 0xab, 0xea, 0x3a, 0xd1, + 0xdc, 0x9f, 0x4b, 0x70, 0xa6, 0xf7, 0xe3, 0x71, 0xea, 0xd8, 0x97, 0x21, 0xab, 0xea, 0x3a, 0xd1, 0x15, 0x9d, 0x34, 0x5d, 0x55, 0x38, 0x73, 0xb7, 0x43, 0x94, 0xc4, 0x3e, 0xc7, 0x32, 0xdf, 0xe0, 0x58, 0xf6, 0xf6, 0x39, 0x96, 0x37, 0x1e, 0x95, 0xcb, 0xac, 0x3f, 0xab, 0x14, 0xd1, 0x53, 0x21, 0x46, 0x8b, 0x41, 0x8a, 0x1a, 0x9c, 0x2d, 0x91, 0x86, 0x61, 0x86, 0x23, 0xf0, 0xd8, 0x97, 0x24, - 0x05, 0x0a, 0xfd, 0x1f, 0x89, 0x53, 0xf6, 0x7f, 0x97, 0x84, 0xd3, 0x6b, 0xa6, 0xfe, 0xc9, 0x0c, - 0x82, 0x7a, 0x13, 0x9a, 0xd5, 0x6a, 0x19, 0xae, 0x27, 0x7b, 0x5e, 0x42, 0xbf, 0x08, 0x69, 0x9d, + 0x05, 0x0a, 0xfd, 0x1f, 0x89, 0x53, 0xf6, 0x7f, 0x9b, 0x84, 0xd3, 0x6b, 0xa6, 0xfe, 0xc9, 0x0c, + 0x82, 0x7a, 0x13, 0x9a, 0xd5, 0x6a, 0x19, 0xae, 0x27, 0x7b, 0x5e, 0x42, 0x3f, 0x0f, 0x69, 0x9d, 0xa8, 0xba, 0x1f, 0xb9, 0x65, 0xbb, 0xac, 0x54, 0xc7, 0x35, 0x9a, 0xcb, 0xfb, 0x4d, 0x6d, 0xb9, 0xee, 0xed, 0x2a, 0x61, 0xbf, 0x39, 0xfa, 0x2a, 0x9c, 0xa5, 0xf3, 0xd8, 0x36, 0xd5, 0xa6, 0xc2, 0xa9, 0x29, 0xae, 0x6d, 0x34, 0x1a, 0xc4, 0x16, 0x7b, 0x1d, 0x37, 0x22, 0xfa, 0x59, 0x15, 0x18, @@ -33643,21 +33687,21 @@ var fileDescriptor_api_0624836d76b24d58 = []byte{ 0xca, 0x9f, 0x1c, 0x2f, 0x02, 0xe6, 0xe0, 0xdb, 0xdb, 0x65, 0xea, 0x75, 0xf1, 0xdf, 0x6d, 0x0d, 0xdd, 0x00, 0xd9, 0xb4, 0x14, 0x9b, 0xec, 0xd9, 0xc4, 0xd9, 0x17, 0x9f, 0x4d, 0x33, 0x8e, 0xe5, 0x4d, 0x0b, 0x73, 0x30, 0x27, 0x7d, 0x06, 0xa6, 0xda, 0x96, 0xe1, 0x58, 0x66, 0x21, 0xc3, 0x39, - 0xca, 0x4b, 0xbe, 0xe9, 0x9e, 0x96, 0xd3, 0xc5, 0xdf, 0x96, 0xe0, 0x4c, 0xaf, 0x4c, 0xe3, 0x9c, + 0xca, 0x4b, 0xbe, 0xe9, 0x9e, 0x96, 0xd3, 0xc5, 0xdf, 0x94, 0xe0, 0x4c, 0xaf, 0x4c, 0xe3, 0x9c, 0x53, 0x37, 0x40, 0xb6, 0x4c, 0xa2, 0xb4, 0xf7, 0x55, 0x87, 0x08, 0x19, 0x08, 0x6f, 0x31, 0x6f, - 0x99, 0x64, 0x9b, 0x82, 0x39, 0x47, 0xbb, 0x96, 0x92, 0x5f, 0x97, 0x60, 0x6e, 0x45, 0x6f, 0x19, + 0x99, 0x64, 0x9b, 0x82, 0x39, 0x47, 0xbb, 0x96, 0x92, 0x5f, 0x95, 0x60, 0x6e, 0x45, 0x6f, 0x19, 0x66, 0xad, 0xdd, 0x34, 0x62, 0x0d, 0x3e, 0xae, 0x40, 0xc6, 0xa1, 0x34, 0xd9, 0x4e, 0x5c, 0xa2, 0x7b, 0x27, 0x2e, 0xcd, 0x6a, 0xd6, 0xc9, 0x51, 0xe0, 0xe3, 0x85, 0x3b, 0x11, 0xe7, 0x54, 0x7a, 0x5f, 0x8c, 0x6f, 0x83, 0xd8, 0x9f, 0x90, 0x77, 0x1a, 0x26, 0x1f, 0x67, 0xcf, 0xbf, 0x29, 0xc1, 0x39, 0x46, 0x9b, 0xa9, 0xcc, 0x1e, 0xb1, 0xd9, 0xc6, 0x68, 0x9c, 0x22, 0xba, 0x0c, 0x53, 0xae, 0x6a, 0x37, 0x08, 0x37, 0x04, 0x93, 0xa5, 0xec, 0x47, 0xc7, 0x8b, 0xd3, 0x35, 0xd7, 0xb2, 0x49, - 0x75, 0x15, 0x8b, 0x2a, 0x31, 0x4e, 0x15, 0x16, 0xa2, 0xfa, 0x12, 0xe7, 0x78, 0xff, 0x53, 0x12, + 0x75, 0x15, 0x8b, 0x2a, 0x31, 0x4e, 0x15, 0x16, 0xa2, 0xfa, 0x12, 0xe7, 0x78, 0xff, 0x43, 0x12, 0xdf, 0x28, 0xef, 0x73, 0x57, 0xbf, 0xdd, 0x34, 0x34, 0x35, 0xd6, 0x65, 0x6f, 0x0d, 0xb2, 0x1a, 0x23, 0xae, 0xb8, 0x47, 0x6d, 0x1e, 0x94, 0xe6, 0xef, 0x5c, 0x89, 0x24, 0xc4, 0x3e, 0xce, 0x7b, 0x52, 0x3f, 0x6a, 0x13, 0x0c, 0x9a, 0xff, 0x1b, 0xad, 0xc2, 0x34, 0x67, 0x8e, 0xe7, 0xe7, 0x0c, 0x21, 0x41, 0x27, 0x7a, 0x9d, 0x35, 0x16, 0x36, 0xc9, 0x43, 0x15, 0x8c, 0xdd, 0x85, 0xf3, 0x91, - 0x83, 0x8e, 0x93, 0xb3, 0x7f, 0xe6, 0x69, 0x12, 0x26, 0x4d, 0x4b, 0x53, 0x3f, 0x81, 0x08, 0x36, - 0xc4, 0x91, 0xc4, 0xc7, 0xe5, 0x88, 0xa7, 0x6a, 0x3d, 0x9d, 0x8d, 0x93, 0x21, 0xbf, 0x2b, 0xc1, + 0x83, 0x8e, 0x93, 0xb3, 0x7f, 0xe2, 0x69, 0x12, 0x26, 0x4d, 0x4b, 0x53, 0x3f, 0x81, 0x08, 0x36, + 0xc4, 0x91, 0xc4, 0xc7, 0xe5, 0x88, 0xa7, 0x6a, 0x3d, 0x9d, 0x8d, 0x93, 0x21, 0xbf, 0x2d, 0xc1, 0x7c, 0x85, 0xa8, 0xb6, 0xbb, 0x4b, 0x54, 0xb7, 0x7e, 0x18, 0xeb, 0xea, 0xfa, 0x3a, 0x24, 0x4d, 0xeb, 0x40, 0xf8, 0x34, 0xc3, 0x17, 0x50, 0x31, 0x7e, 0xda, 0x5e, 0x8c, 0xfd, 0x2b, 0x70, 0xaa, 0xbb, 0x5f, 0x71, 0x8e, 0xfa, 0x07, 0x49, 0xc8, 0xdc, 0x2f, 0xc7, 0x39, 0xd6, 0xcf, 0x8b, 0x7d, @@ -33667,274 +33711,276 @@ var fileDescriptor_api_0624836d76b24d58 = []byte{ 0x8e, 0x43, 0x6e, 0x81, 0x92, 0x3b, 0x39, 0x5e, 0x44, 0xf5, 0x43, 0x93, 0x2e, 0xe4, 0xf7, 0xcb, 0x75, 0x8f, 0x00, 0x46, 0xae, 0x80, 0x69, 0x3e, 0x6c, 0xe1, 0x09, 0x4c, 0xb2, 0x51, 0x78, 0xc7, 0x4f, 0x52, 0xc4, 0xf1, 0x13, 0x1d, 0x94, 0xf7, 0x81, 0xe7, 0x51, 0x82, 0x00, 0x8b, 0xab, 0x82, - 0x50, 0x88, 0x77, 0x00, 0x28, 0x0b, 0xe3, 0x54, 0x83, 0x1f, 0x25, 0x21, 0xbf, 0xdd, 0x71, 0xf6, - 0x63, 0xd6, 0xfb, 0x32, 0x40, 0xbb, 0xe3, 0xec, 0x13, 0x5b, 0x71, 0x0f, 0x4d, 0x31, 0xf2, 0x11, - 0x67, 0x63, 0xde, 0xd0, 0x39, 0x5e, 0xfd, 0xd0, 0x44, 0x5b, 0x82, 0x08, 0x51, 0x82, 0x03, 0xb6, - 0x9b, 0x63, 0xc4, 0x05, 0xf5, 0x43, 0x73, 0x83, 0xf8, 0x01, 0x01, 0x27, 0x48, 0x28, 0xc1, 0xcf, - 0xc3, 0x34, 0x2d, 0x28, 0xae, 0xf5, 0x3c, 0x1a, 0x36, 0x45, 0x71, 0xea, 0x96, 0x37, 0x97, 0x27, - 0x9f, 0x6f, 0x2e, 0xa3, 0xb7, 0x20, 0xc3, 0x3f, 0x4a, 0x17, 0x99, 0x29, 0xb6, 0xc8, 0x44, 0x71, - 0x42, 0x08, 0x81, 0x2d, 0x2f, 0x69, 0xf6, 0x45, 0xba, 0xb8, 0x9c, 0x82, 0xc9, 0x3d, 0xcb, 0xd6, - 0x08, 0x3b, 0x88, 0x4b, 0x63, 0x5e, 0xf0, 0x3d, 0xc9, 0xb4, 0x9c, 0x29, 0xfe, 0xbe, 0x04, 0xb3, - 0xbe, 0x00, 0xe3, 0x74, 0x21, 0xcb, 0x5d, 0xdc, 0x7f, 0x7e, 0x11, 0x52, 0x8e, 0x17, 0xbf, 0x9f, - 0x80, 0xd9, 0x77, 0x3a, 0xc4, 0x3e, 0x8a, 0x59, 0xbf, 0x4a, 0xfc, 0xd0, 0x35, 0xf1, 0x82, 0x3a, - 0xc1, 0x8e, 0x61, 0xaf, 0xc1, 0xec, 0x81, 0x6a, 0xb8, 0xca, 0x9e, 0x65, 0x2b, 0x9d, 0xb6, 0xae, - 0xba, 0xde, 0x11, 0x55, 0x8e, 0x82, 0xef, 0x59, 0xf6, 0x0e, 0x03, 0x22, 0x02, 0xe8, 0x89, 0x69, - 0x1d, 0x98, 0x0a, 0x05, 0x1b, 0x66, 0x83, 0xf2, 0x43, 0xec, 0x45, 0x94, 0xde, 0xf8, 0xe7, 0xe3, - 0xc5, 0xbb, 0x0d, 0xc3, 0xdd, 0xef, 0xec, 0x2e, 0x6b, 0x56, 0xeb, 0x96, 0xdf, 0x11, 0x7d, 0x37, - 0xf8, 0x7d, 0xab, 0xfd, 0xa4, 0x71, 0x8b, 0x9d, 0xb6, 0x77, 0x3a, 0x86, 0xbe, 0xbc, 0xb3, 0x53, - 0x5d, 0xc5, 0x32, 0x23, 0xf9, 0x2e, 0xa7, 0x58, 0x3f, 0x34, 0xbd, 0xf5, 0xee, 0x23, 0x09, 0xe4, - 0x80, 0x61, 0x71, 0xca, 0x73, 0x0d, 0xb2, 0x1f, 0x74, 0x88, 0x6d, 0x10, 0xfd, 0xb9, 0x05, 0x0a, - 0x02, 0x91, 0xce, 0xa1, 0xf7, 0x60, 0xa6, 0x8b, 0x0f, 0xc9, 0x8f, 0xc7, 0x87, 0xec, 0x41, 0xc0, - 0x82, 0xe2, 0x8f, 0x12, 0x80, 0xd8, 0xe0, 0xab, 0x7c, 0x1b, 0xe8, 0x53, 0xa6, 0x30, 0x8f, 0x00, - 0x8c, 0x3d, 0xa5, 0x65, 0x38, 0x8e, 0x61, 0x36, 0x98, 0xae, 0xe4, 0xef, 0xbc, 0x11, 0xd1, 0x97, - 0xfe, 0x21, 0x2c, 0x57, 0xf7, 0x36, 0x38, 0x5a, 0x89, 0xec, 0xab, 0x4f, 0x0d, 0xcb, 0xc6, 0x19, - 0xc3, 0x03, 0x15, 0x4b, 0x30, 0xd7, 0x57, 0x8f, 0xf2, 0x00, 0xab, 0x5b, 0xca, 0xe6, 0x56, 0xbd, - 0x52, 0xdd, 0xbc, 0x2f, 0x4f, 0x20, 0x19, 0x66, 0xf0, 0x5a, 0x7d, 0x07, 0x6f, 0x2a, 0x6b, 0x18, - 0x6f, 0x61, 0x59, 0x42, 0x59, 0x98, 0xde, 0xc6, 0x6b, 0x8f, 0xd6, 0x36, 0xeb, 0x72, 0x42, 0x68, - 0xcf, 0xaf, 0xc0, 0x7c, 0xd7, 0xc7, 0xe3, 0xd4, 0x9f, 0x4b, 0x30, 0xb3, 0x67, 0x75, 0x4c, 0x5d, - 0xe1, 0x61, 0xb4, 0xd8, 0x2e, 0xc8, 0x32, 0x18, 0xff, 0x5e, 0xf1, 0x1b, 0x09, 0x38, 0x85, 0x89, - 0x63, 0x35, 0x9f, 0x92, 0xf8, 0x25, 0xb8, 0x05, 0x62, 0x77, 0x50, 0xf9, 0x38, 0x82, 0xcc, 0x70, - 0x1a, 0x7c, 0x35, 0x98, 0x72, 0x5c, 0xd5, 0xed, 0x38, 0x42, 0x94, 0x57, 0x86, 0xcf, 0x85, 0x1a, - 0x6b, 0x8b, 0x05, 0x4e, 0x28, 0xca, 0x4f, 0xf5, 0x47, 0xf9, 0xc5, 0x5f, 0x82, 0xd3, 0x3d, 0x8c, - 0x88, 0x73, 0xd1, 0xfe, 0xc7, 0x04, 0x9c, 0xeb, 0x26, 0x1f, 0xb7, 0x0b, 0xff, 0x7f, 0x83, 0xd9, - 0xa8, 0x02, 0xb9, 0x96, 0x61, 0x2a, 0x81, 0x8f, 0xf5, 0x1c, 0x8b, 0xf3, 0x0c, 0x0d, 0x60, 0xbb, - 0xdd, 0x2c, 0x1a, 0x6d, 0x44, 0xf1, 0x35, 0x4e, 0xd9, 0x7d, 0x5b, 0x82, 0x99, 0xb8, 0xb7, 0x1f, - 0x5e, 0xec, 0x24, 0x5c, 0x8c, 0xb9, 0x0e, 0xb9, 0x4f, 0x60, 0xbf, 0xe2, 0x4f, 0x24, 0x40, 0x75, - 0xbb, 0x63, 0xd2, 0x98, 0xed, 0xa1, 0xd5, 0x88, 0x73, 0xb0, 0xa7, 0x60, 0xd2, 0x30, 0x75, 0x72, - 0xc8, 0x06, 0x9b, 0xc2, 0xbc, 0x80, 0x6e, 0x43, 0x5a, 0xe4, 0x3f, 0xf1, 0x93, 0xfd, 0x64, 0xe9, - 0xcc, 0xc9, 0xf1, 0xe2, 0x34, 0xcf, 0x76, 0x5a, 0xfd, 0x28, 0xf8, 0x89, 0xa7, 0x79, 0xc2, 0x93, - 0x97, 0x6c, 0xf2, 0x1e, 0xcc, 0x77, 0x75, 0x34, 0x4e, 0x2e, 0x7c, 0x3f, 0x01, 0xf3, 0x62, 0x38, - 0xb1, 0xef, 0xd7, 0xbc, 0x50, 0xf2, 0x1c, 0xfa, 0x02, 0x40, 0xdb, 0x26, 0x4f, 0x15, 0x8e, 0x9a, - 0x1c, 0x0b, 0x35, 0x43, 0x31, 0x18, 0x00, 0x7d, 0x19, 0x66, 0xe9, 0x84, 0x6b, 0xdb, 0x56, 0xdb, - 0x72, 0xa8, 0x27, 0xe1, 0x8c, 0xe7, 0x49, 0xcf, 0x9d, 0x1c, 0x2f, 0xe6, 0x36, 0x0c, 0x73, 0x5b, - 0x20, 0xd6, 0x6b, 0x98, 0xce, 0x5c, 0xbf, 0xe8, 0xb9, 0x3f, 0xff, 0x20, 0xc1, 0xa9, 0x4f, 0x6c, - 0x87, 0xeb, 0x7f, 0x83, 0x63, 0xfe, 0x7a, 0x20, 0xb3, 0x62, 0xd5, 0xdc, 0xb3, 0xe2, 0xdf, 0x77, - 0xfc, 0xb6, 0x04, 0x73, 0x21, 0xf2, 0x71, 0xae, 0xfa, 0x2f, 0x96, 0xa2, 0xf9, 0x15, 0xea, 0x07, - 0x84, 0xd5, 0x3e, 0xce, 0x49, 0xf5, 0x47, 0x12, 0x9c, 0x29, 0xf3, 0xd3, 0x28, 0x76, 0xe8, 0xe6, - 0x74, 0x5a, 0x71, 0x6a, 0x49, 0x01, 0xa6, 0x9f, 0x12, 0xdb, 0x31, 0x2c, 0xbe, 0xee, 0xe5, 0xb0, - 0x57, 0x64, 0xa9, 0xa2, 0xa6, 0xda, 0x76, 0xf6, 0x2d, 0x6f, 0x33, 0xdd, 0x2f, 0xfb, 0x21, 0x59, - 0x52, 0x4e, 0x15, 0x7f, 0x22, 0xc1, 0xd9, 0xbe, 0x0e, 0xc6, 0x29, 0x94, 0xaf, 0x41, 0x56, 0x13, - 0x84, 0xa9, 0xb9, 0xe3, 0xfb, 0xe9, 0x55, 0xda, 0xec, 0x05, 0xdd, 0xf0, 0x93, 0xe3, 0x45, 0xf0, - 0xba, 0x5a, 0x5d, 0xc5, 0xe0, 0x51, 0xaf, 0xea, 0xc5, 0x9f, 0x01, 0xe4, 0xd6, 0x0e, 0xdb, 0x96, - 0xed, 0xd6, 0xf8, 0x9a, 0x8f, 0x56, 0x21, 0xdd, 0xb6, 0xad, 0xa7, 0x86, 0x37, 0x88, 0x7c, 0xe4, - 0x79, 0x4e, 0x17, 0xce, 0xb6, 0x68, 0x8f, 0x7d, 0x4c, 0x84, 0x21, 0xf3, 0xd0, 0xd2, 0xd4, 0xe6, - 0x3d, 0xa3, 0xe9, 0x29, 0xd7, 0xf2, 0x28, 0x32, 0xcb, 0x3e, 0xc6, 0xb6, 0xea, 0xee, 0x7b, 0x73, - 0xcd, 0x07, 0xa2, 0xfb, 0x90, 0xae, 0xb8, 0x6e, 0x9b, 0x56, 0x8a, 0x89, 0x7a, 0x75, 0x24, 0x49, - 0x8a, 0x20, 0x28, 0xf9, 0xc8, 0x08, 0xc3, 0xdc, 0x7d, 0xcb, 0x6a, 0x34, 0x49, 0xb9, 0x69, 0x75, - 0xf4, 0xb2, 0x65, 0xee, 0x19, 0x0d, 0x61, 0xe8, 0xae, 0x8c, 0xa4, 0x78, 0xbf, 0x5c, 0xc3, 0xfd, - 0xe8, 0xe8, 0x8b, 0x90, 0xae, 0xdd, 0x15, 0xa4, 0xb8, 0x9b, 0x72, 0x79, 0x24, 0xa9, 0xda, 0x5d, - 0xec, 0x23, 0xa1, 0x0a, 0x64, 0x57, 0x9e, 0x75, 0x6c, 0x22, 0x68, 0x4c, 0x31, 0x1a, 0xd7, 0x46, - 0xd2, 0x60, 0x38, 0x38, 0x8c, 0x8a, 0xde, 0x81, 0xfc, 0xbb, 0x96, 0xfd, 0xa4, 0x69, 0xa9, 0xde, - 0xd8, 0xa6, 0x19, 0xb1, 0x97, 0x47, 0x12, 0xf3, 0xd0, 0x70, 0x0f, 0x81, 0x85, 0x2f, 0x43, 0xae, - 0x4b, 0x38, 0x08, 0x41, 0xaa, 0x4d, 0xe5, 0x40, 0x35, 0x24, 0x83, 0xd9, 0x6f, 0xf4, 0x1a, 0x4c, - 0x9b, 0x96, 0x4e, 0x3c, 0x9d, 0xcd, 0x95, 0x4e, 0x9d, 0x1c, 0x2f, 0x4e, 0x6d, 0x5a, 0x3a, 0x5f, - 0xa1, 0xc5, 0x2f, 0x3c, 0x45, 0x1b, 0x79, 0xeb, 0xf3, 0xc2, 0x35, 0x48, 0x51, 0xb9, 0xd0, 0x79, - 0xb9, 0xab, 0x3a, 0x64, 0xc7, 0x36, 0x04, 0x4d, 0xaf, 0x28, 0xda, 0xfd, 0x8d, 0x04, 0x89, 0xda, - 0x5d, 0xea, 0x2a, 0xee, 0x76, 0xb4, 0x27, 0xc4, 0x15, 0xad, 0x44, 0x89, 0xb9, 0x90, 0x36, 0xd9, - 0x33, 0xb8, 0xdb, 0x90, 0xc1, 0xa2, 0x84, 0x5e, 0x02, 0x50, 0x35, 0x8d, 0x38, 0x8e, 0xe2, 0xe5, - 0x90, 0x67, 0x70, 0x86, 0x43, 0xd6, 0xc9, 0x11, 0x45, 0x73, 0x88, 0x66, 0x13, 0x3e, 0xe3, 0x33, - 0x58, 0x94, 0x28, 0x9a, 0x4b, 0x5a, 0x6d, 0xc5, 0xb5, 0x9e, 0x10, 0x93, 0xc9, 0x33, 0x83, 0x33, - 0x14, 0x52, 0xa7, 0x00, 0x6a, 0x2a, 0x88, 0xa9, 0xb7, 0x2d, 0xc3, 0x74, 0x99, 0xa0, 0x32, 0xd8, - 0x2f, 0x53, 0x92, 0x36, 0x69, 0x18, 0x22, 0xbb, 0x3a, 0x83, 0x45, 0x49, 0x0c, 0xe3, 0x3b, 0x12, - 0x24, 0xef, 0x97, 0x6b, 0xcf, 0x3d, 0x0e, 0x04, 0x29, 0xb5, 0x23, 0xf4, 0x3e, 0x83, 0xd9, 0x6f, - 0x96, 0x42, 0x61, 0x34, 0x9b, 0x34, 0x56, 0x6f, 0xdb, 0xd6, 0xd7, 0x88, 0xe6, 0x8d, 0x22, 0x2f, - 0xc0, 0xdb, 0x1c, 0x8a, 0x96, 0x20, 0xab, 0xd9, 0x44, 0x27, 0xa6, 0x6b, 0xa8, 0x4d, 0x47, 0x0c, - 0x27, 0x0c, 0x12, 0x9d, 0xfb, 0x86, 0x04, 0x93, 0x4c, 0x91, 0xd0, 0x05, 0xc8, 0x68, 0x96, 0xe9, - 0xaa, 0x86, 0x29, 0xac, 0x40, 0x06, 0x07, 0x80, 0x81, 0x9d, 0xbc, 0x04, 0x33, 0xaa, 0xa6, 0x59, - 0x1d, 0xd3, 0x55, 0x4c, 0xb5, 0x45, 0x44, 0x67, 0xb3, 0x02, 0xb6, 0xa9, 0xb6, 0x08, 0x5a, 0x04, - 0xaf, 0xe8, 0x67, 0xed, 0x67, 0x30, 0x08, 0x90, 0x7f, 0x48, 0xb8, 0xf0, 0x13, 0x09, 0xd2, 0x9e, - 0x0a, 0xd2, 0xce, 0x34, 0x88, 0x49, 0x6c, 0xd5, 0xb5, 0xfc, 0xce, 0xf8, 0x80, 0x5e, 0x83, 0x9e, - 0x09, 0x0c, 0xfa, 0x29, 0x98, 0x74, 0xd5, 0xdd, 0xa6, 0xd7, 0x0f, 0x5e, 0x60, 0x7b, 0x6e, 0x4d, - 0xb5, 0xc1, 0xb7, 0x78, 0x32, 0x98, 0x17, 0xe8, 0x90, 0x44, 0xce, 0x0e, 0xe7, 0x8e, 0x28, 0xd1, - 0xfe, 0xf2, 0x34, 0x95, 0x5d, 0xd2, 0x30, 0x4c, 0x26, 0xec, 0x24, 0x06, 0x06, 0x62, 0x69, 0x01, - 0xe8, 0x3c, 0x64, 0x78, 0x03, 0x62, 0xea, 0x4c, 0xe2, 0x49, 0x9c, 0x66, 0x80, 0x35, 0x2f, 0xdf, - 0x59, 0xac, 0xe2, 0x7f, 0x2e, 0xc1, 0xdc, 0xbb, 0xb6, 0xe1, 0x92, 0x12, 0xcf, 0x6f, 0x89, 0x6f, - 0x49, 0x7b, 0x13, 0x32, 0xba, 0xea, 0xaa, 0xfc, 0xba, 0x41, 0x62, 0xe8, 0x75, 0x03, 0xcf, 0x14, - 0xd2, 0xf6, 0xec, 0xca, 0x01, 0x82, 0x14, 0xfd, 0xcd, 0x6f, 0x57, 0x60, 0xf6, 0x3b, 0x38, 0xed, - 0x0c, 0x77, 0x37, 0xce, 0x25, 0xfe, 0xeb, 0x49, 0x6f, 0xd1, 0x89, 0x93, 0x0d, 0x5f, 0x82, 0x69, - 0x11, 0xb7, 0x0a, 0x26, 0x2c, 0x8d, 0xb2, 0x77, 0xde, 0x99, 0x94, 0x40, 0x43, 0x25, 0x00, 0xc7, - 0x55, 0x6d, 0x97, 0x45, 0x9c, 0x63, 0xa5, 0x45, 0x78, 0x8b, 0x14, 0x43, 0xa3, 0x50, 0xb4, 0x09, - 0xd9, 0xd6, 0x53, 0x4d, 0x53, 0xf6, 0x8c, 0xa6, 0x2b, 0x32, 0x22, 0xa2, 0x33, 0xc0, 0x36, 0x1e, - 0x95, 0xcb, 0xf7, 0x58, 0x23, 0x9e, 0x98, 0x10, 0x94, 0x31, 0x50, 0x0a, 0xfc, 0x37, 0x7a, 0x15, - 0x44, 0x72, 0xa8, 0xe2, 0x78, 0xa9, 0xde, 0xa5, 0xdc, 0xc9, 0xf1, 0x62, 0x06, 0x33, 0x68, 0xad, - 0x56, 0xc7, 0x19, 0xde, 0xa0, 0xe6, 0xb8, 0xe8, 0x32, 0xe4, 0xac, 0x96, 0xe1, 0x2a, 0xde, 0x0a, - 0xcf, 0x33, 0x1f, 0xf0, 0x0c, 0x05, 0x7a, 0x1e, 0x80, 0x90, 0xef, 0xb7, 0x24, 0xc8, 0x95, 0x3a, - 0xcd, 0x27, 0x5b, 0xed, 0x5a, 0xa7, 0xd5, 0x52, 0xed, 0x23, 0xaa, 0xca, 0x5c, 0x8f, 0x8c, 0x67, - 0x84, 0xc9, 0x21, 0x29, 0x14, 0xc5, 0x78, 0x46, 0xa8, 0xa2, 0x88, 0x54, 0x31, 0x0a, 0xe7, 0x79, - 0x60, 0x97, 0x21, 0xc7, 0xa2, 0x33, 0x85, 0x98, 0xae, 0x6d, 0x10, 0x1e, 0xfc, 0x27, 0xf1, 0x0c, - 0x03, 0xae, 0x71, 0x18, 0xba, 0x0a, 0x79, 0xe7, 0xc8, 0x71, 0x49, 0x4b, 0xe1, 0x97, 0x90, 0x78, - 0x48, 0x91, 0xc4, 0x39, 0x0e, 0xc5, 0x1c, 0x58, 0xfc, 0x8b, 0x24, 0xe4, 0x3d, 0x9d, 0x88, 0xd3, - 0x99, 0x2a, 0xc1, 0xe4, 0x9e, 0xd1, 0x24, 0xde, 0x59, 0xe5, 0xe0, 0x05, 0xd5, 0xa3, 0xb4, 0x4c, - 0xd7, 0x38, 0xcf, 0xdf, 0x65, 0xa8, 0x71, 0xe8, 0xc5, 0xc2, 0x4f, 0x25, 0x48, 0x31, 0x2f, 0xe6, - 0x36, 0xa4, 0xd8, 0x44, 0x95, 0xc6, 0x99, 0xa8, 0xac, 0xa9, 0xbf, 0xd8, 0x26, 0x42, 0x8b, 0x2d, - 0x5d, 0xb9, 0xf6, 0xd5, 0xd7, 0x6f, 0xdf, 0x61, 0x3a, 0x31, 0x83, 0x45, 0x09, 0x95, 0x20, 0x4d, - 0xd8, 0x78, 0x88, 0x2e, 0x7c, 0x88, 0xa8, 0x69, 0xd0, 0x25, 0x78, 0xcf, 0x28, 0x78, 0x78, 0xe8, - 0x1c, 0x24, 0xa9, 0xb2, 0x4d, 0xf3, 0x23, 0xaf, 0x93, 0xe3, 0xc5, 0x24, 0x55, 0x33, 0x0a, 0xe3, - 0x2e, 0xf0, 0x83, 0x54, 0x3a, 0x25, 0x4f, 0x16, 0x7f, 0x98, 0x82, 0x5c, 0xb5, 0x15, 0xf7, 0x34, - 0x5e, 0xe9, 0x16, 0x58, 0x94, 0x8b, 0xd7, 0xf5, 0xd1, 0x08, 0x79, 0x75, 0x19, 0xc4, 0xe4, 0xf3, - 0x19, 0xc4, 0x2a, 0x5d, 0xbe, 0xc5, 0x0d, 0x2c, 0xfa, 0xfd, 0x57, 0x46, 0x7e, 0xbf, 0x4e, 0x97, - 0x15, 0x4c, 0x71, 0xbc, 0x13, 0x25, 0x4e, 0x00, 0xbd, 0xcd, 0xbc, 0x04, 0xae, 0x34, 0x53, 0xe3, - 0x2b, 0xcd, 0x34, 0x31, 0x75, 0xa6, 0x32, 0x87, 0x42, 0x63, 0x3e, 0x07, 0x49, 0xdd, 0x18, 0xc6, - 0xd2, 0x28, 0xa3, 0x46, 0x51, 0x46, 0x28, 0x4e, 0x2a, 0xac, 0x38, 0xe1, 0x10, 0x67, 0x61, 0x0b, - 0x20, 0x18, 0x15, 0x5a, 0x82, 0x29, 0xab, 0xa9, 0x53, 0xb7, 0x4e, 0x62, 0x6e, 0x5d, 0xe6, 0xe4, - 0x78, 0x71, 0x72, 0xab, 0xa9, 0x57, 0x57, 0xf1, 0xa4, 0xd5, 0xd4, 0xab, 0x3a, 0xbb, 0xb8, 0x46, - 0x0e, 0x14, 0x76, 0x57, 0x90, 0x85, 0x2b, 0x78, 0xda, 0x24, 0x07, 0xab, 0xc4, 0xd1, 0xc2, 0x4b, - 0xa0, 0x50, 0x9b, 0x3f, 0x96, 0x20, 0xef, 0x71, 0x30, 0xde, 0x99, 0x9e, 0x36, 0x5a, 0x42, 0xf3, - 0x93, 0xcf, 0xa7, 0xf9, 0x1e, 0x9e, 0x48, 0xaf, 0xff, 0xa6, 0x04, 0xf3, 0x3c, 0x47, 0x49, 0x53, - 0x5d, 0x6a, 0x90, 0x63, 0x54, 0xef, 0x97, 0x41, 0xb6, 0x55, 0x53, 0xb7, 0x5a, 0xc6, 0x33, 0xc2, - 0x37, 0x1d, 0x1c, 0xb1, 0xd7, 0x3e, 0xeb, 0xc3, 0x59, 0x54, 0xed, 0xed, 0x99, 0xfc, 0xbb, 0x04, - 0xa7, 0xba, 0x3b, 0x13, 0x27, 0xd3, 0xd6, 0x61, 0x8a, 0xed, 0x97, 0x79, 0xd3, 0xed, 0xb5, 0x08, - 0x22, 0x51, 0x5f, 0xe7, 0xf7, 0x0c, 0x7d, 0x85, 0x67, 0x24, 0x16, 0xbe, 0x04, 0x93, 0x0c, 0xfc, - 0x02, 0x36, 0x4e, 0x70, 0xfe, 0x03, 0x98, 0x5b, 0xd1, 0xf5, 0x5a, 0x4d, 0x68, 0x5f, 0x7c, 0x6c, - 0xf7, 0xfc, 0x9c, 0x44, 0x94, 0x9f, 0x13, 0xfe, 0x64, 0x9c, 0x7e, 0x4e, 0x1b, 0xf2, 0x22, 0x75, - 0x30, 0xe6, 0x0d, 0xd2, 0x03, 0xea, 0x98, 0x09, 0xb5, 0xe1, 0x85, 0xe0, 0xd6, 0x92, 0xff, 0xc5, - 0x38, 0x47, 0xd2, 0x81, 0x79, 0x8f, 0x6e, 0xdc, 0x67, 0x11, 0xc3, 0x86, 0xc3, 0x36, 0x9a, 0xc2, - 0x9f, 0x8d, 0x73, 0x4c, 0xdf, 0x93, 0x20, 0x5f, 0xeb, 0xec, 0xf2, 0xab, 0xab, 0xf1, 0x8d, 0xe7, - 0x3e, 0x40, 0x93, 0xec, 0x89, 0x6b, 0x25, 0xc2, 0x13, 0x1d, 0xff, 0xe6, 0x74, 0x86, 0xe2, 0xb2, - 0x2a, 0xc1, 0x82, 0x1f, 0x26, 0x60, 0xd6, 0xef, 0x65, 0x9c, 0x33, 0xff, 0x97, 0x81, 0xb9, 0x99, - 0x8a, 0xe3, 0xaa, 0xae, 0x23, 0x0c, 0xe6, 0xab, 0xcf, 0x93, 0x96, 0x5d, 0x9a, 0x13, 0x29, 0x35, - 0x19, 0x1f, 0x84, 0x33, 0x94, 0x24, 0xfb, 0x89, 0x96, 0x61, 0x9e, 0x99, 0x37, 0x45, 0x6d, 0xb7, - 0x9b, 0x06, 0xd1, 0x15, 0xbe, 0xab, 0x9f, 0x62, 0xbb, 0xfa, 0x73, 0xac, 0x6a, 0x85, 0xd7, 0x54, - 0xd9, 0x0e, 0xff, 0x3d, 0x98, 0xd9, 0xb3, 0x09, 0x79, 0x46, 0x14, 0xe6, 0x34, 0x3d, 0xcf, 0x59, - 0x4f, 0x96, 0x23, 0xd6, 0x28, 0x9e, 0x30, 0x24, 0xef, 0xc3, 0x1c, 0xe3, 0x62, 0xdc, 0xd9, 0xf4, - 0x42, 0x2a, 0x3f, 0x93, 0x00, 0x85, 0xe9, 0x7f, 0x72, 0x82, 0x49, 0xc4, 0x2e, 0x98, 0x57, 0x01, - 0xf1, 0x03, 0x7f, 0x47, 0x69, 0x13, 0x5b, 0x71, 0x88, 0x66, 0x89, 0xeb, 0x92, 0x12, 0x96, 0x45, - 0xcd, 0x36, 0xb1, 0x6b, 0x0c, 0x5e, 0xfc, 0xad, 0x02, 0xcc, 0x08, 0x9e, 0xec, 0x98, 0x34, 0xaa, - 0xbe, 0x0d, 0xc9, 0x86, 0xd8, 0xb6, 0xc8, 0x46, 0x06, 0x36, 0xc1, 0x95, 0xed, 0xca, 0x04, 0xa6, - 0x6d, 0x29, 0x4a, 0xbb, 0xe3, 0x46, 0x64, 0x48, 0x05, 0xd9, 0x31, 0x61, 0x94, 0x76, 0xc7, 0x45, - 0x35, 0x98, 0xd5, 0x82, 0x2b, 0xab, 0x0a, 0x45, 0x4f, 0x0e, 0x4c, 0x2e, 0x8f, 0xbc, 0xf8, 0x5b, - 0x99, 0xc0, 0x79, 0xad, 0xab, 0x02, 0x95, 0xc3, 0x77, 0x24, 0x53, 0x03, 0x37, 0xe9, 0x7a, 0xef, - 0x67, 0x56, 0x26, 0x42, 0x57, 0x29, 0xd1, 0x9b, 0x30, 0xa5, 0xb3, 0xbb, 0x77, 0x42, 0x43, 0xa3, - 0x94, 0xa8, 0xeb, 0xba, 0x63, 0x65, 0x02, 0x0b, 0x0c, 0xf4, 0x00, 0x66, 0xf8, 0x2f, 0x61, 0x1d, - 0xa6, 0x06, 0xee, 0x62, 0xf6, 0xdf, 0x3e, 0xac, 0x4c, 0xe0, 0xac, 0x1e, 0x40, 0xd1, 0x67, 0x21, - 0xe5, 0x68, 0xaa, 0x29, 0xf6, 0xf6, 0x2e, 0x0e, 0xb8, 0x63, 0x14, 0x20, 0xb3, 0xd6, 0xe8, 0x31, - 0xcc, 0xb1, 0x9d, 0x0c, 0xc5, 0x0d, 0x4e, 0x63, 0x59, 0xa2, 0x7b, 0xf7, 0x01, 0xb0, 0xef, 0x2d, - 0x45, 0xdf, 0xaf, 0xa8, 0x4c, 0x60, 0x79, 0xb7, 0xa7, 0x8a, 0x8a, 0x8c, 0xb9, 0xbb, 0x21, 0xc2, - 0x99, 0x81, 0x22, 0x8b, 0xbc, 0xf1, 0x40, 0x45, 0x46, 0xba, 0x2a, 0xd0, 0x7d, 0xc8, 0xaa, 0xd4, - 0xfd, 0x50, 0x58, 0x16, 0x79, 0x01, 0x06, 0x6e, 0xd2, 0xf6, 0x25, 0xb6, 0x57, 0xd8, 0x65, 0x11, - 0x0f, 0x18, 0x10, 0x6a, 0x11, 0xbb, 0x41, 0x0a, 0xd9, 0xe1, 0x84, 0xc2, 0x47, 0xb8, 0x3e, 0x21, - 0x06, 0x44, 0x1b, 0x90, 0xdb, 0xf7, 0xd2, 0x36, 0xd9, 0xf1, 0xf9, 0xcc, 0xc0, 0x9d, 0xda, 0x88, - 0xb4, 0xd3, 0xca, 0x04, 0x9e, 0xd9, 0x0f, 0x81, 0xd1, 0x32, 0x24, 0x1a, 0x5a, 0x21, 0xc7, 0x68, - 0x5c, 0x18, 0x96, 0x54, 0x59, 0x99, 0xc0, 0x89, 0x86, 0x46, 0x83, 0x0a, 0x9e, 0x6f, 0x76, 0x68, - 0x16, 0xf2, 0x03, 0x8d, 0x4c, 0x77, 0xce, 0x5f, 0x65, 0x02, 0xb3, 0xcc, 0x38, 0xfa, 0xbd, 0x6d, - 0xc8, 0xdb, 0xfc, 0x0c, 0xdc, 0xcb, 0xf4, 0x90, 0x19, 0x95, 0xeb, 0xd1, 0xa6, 0xaa, 0x2f, 0xd9, - 0xa3, 0x32, 0x81, 0x73, 0x76, 0x18, 0x8e, 0xbe, 0x0a, 0xa7, 0xba, 0x29, 0x0a, 0xe5, 0x9e, 0xeb, - 0xb3, 0x5c, 0xd1, 0x74, 0xbb, 0x75, 0x1c, 0xd9, 0x7d, 0x95, 0xe8, 0x0d, 0x98, 0xe4, 0x52, 0x43, - 0x8c, 0xe4, 0x62, 0xd4, 0x6e, 0x4a, 0xb7, 0xc0, 0x78, 0x7b, 0x3a, 0xdf, 0x5c, 0x71, 0xf8, 0xab, - 0x34, 0xad, 0x46, 0x61, 0x7e, 0xe0, 0x7c, 0xeb, 0x3f, 0xcc, 0xa6, 0xf3, 0xcd, 0x0d, 0xa0, 0x54, - 0xee, 0x36, 0xaf, 0x11, 0x67, 0x85, 0xa7, 0x06, 0xca, 0x3d, 0xe2, 0x4c, 0x98, 0xca, 0xdd, 0x0e, - 0x81, 0x69, 0xd7, 0x6c, 0x7e, 0xad, 0x4f, 0x61, 0xd3, 0xf8, 0xf4, 0xc0, 0xae, 0xf5, 0x5f, 0x55, - 0xa4, 0x5d, 0xb3, 0x03, 0x28, 0x7a, 0x04, 0xb2, 0xb8, 0xbf, 0x15, 0x6c, 0xfc, 0x9c, 0x19, 0xb8, - 0xe5, 0x1f, 0x7d, 0xb8, 0x56, 0x99, 0xc0, 0xb3, 0x5a, 0x77, 0x0d, 0x35, 0x16, 0x8c, 0x9e, 0xa2, - 0x05, 0x17, 0xdf, 0x0a, 0x85, 0x81, 0xc6, 0x62, 0xc0, 0x2d, 0x3d, 0x6a, 0x2c, 0xb4, 0x9e, 0x2a, - 0xaa, 0xc6, 0x86, 0x69, 0xb8, 0xcc, 0xb0, 0x2f, 0x0c, 0x54, 0xe3, 0xee, 0x57, 0x05, 0xa8, 0x1a, - 0x1b, 0x1c, 0x42, 0xd5, 0xd8, 0x15, 0x07, 0xc9, 0x42, 0x1c, 0x17, 0x06, 0xaa, 0x71, 0xd4, 0x89, - 0x33, 0x55, 0x63, 0x37, 0x0c, 0xa7, 0x6a, 0xcc, 0x0d, 0x44, 0x0f, 0xdd, 0x97, 0x06, 0xaa, 0xf1, - 0xc0, 0x0b, 0x1b, 0x54, 0x8d, 0xd5, 0xbe, 0x4a, 0xb4, 0x4a, 0x3d, 0x43, 0xea, 0x11, 0x19, 0xe6, - 0x9e, 0x55, 0xb8, 0x38, 0x70, 0xfd, 0xe9, 0x3d, 0x4a, 0xae, 0x30, 0xb7, 0x50, 0xc0, 0xa8, 0x21, - 0x63, 0x2e, 0xb2, 0xc2, 0x76, 0x99, 0x0b, 0x8b, 0x03, 0x0d, 0x59, 0xdf, 0x66, 0x33, 0x35, 0x64, - 0x07, 0x3e, 0x90, 0x2e, 0x64, 0x7c, 0xc7, 0xa7, 0xb0, 0x34, 0x62, 0x67, 0x21, 0xb4, 0x90, 0x71, - 0x0c, 0xb4, 0x02, 0x19, 0xea, 0x29, 0x1c, 0x31, 0x33, 0x74, 0x69, 0xa0, 0x8f, 0xdb, 0x93, 0x1b, - 0x5a, 0x99, 0xc0, 0xe9, 0x0f, 0x04, 0x88, 0x7e, 0x9e, 0x87, 0xdd, 0x85, 0xe2, 0xc0, 0xcf, 0x77, - 0x6d, 0xb4, 0xd0, 0xcf, 0x73, 0x0c, 0xa4, 0xc1, 0x69, 0x2e, 0x2b, 0x71, 0xc3, 0xc3, 0x16, 0x57, - 0x29, 0x0a, 0x97, 0x19, 0xa9, 0x81, 0x41, 0x6c, 0xe4, 0x6d, 0x93, 0xca, 0x04, 0x9e, 0x57, 0xfb, - 0x6b, 0xe9, 0x84, 0x17, 0x4b, 0x0f, 0x0f, 0x7d, 0x0b, 0x57, 0x06, 0x4e, 0xf8, 0x88, 0xcd, 0x02, - 0x3a, 0xe1, 0xd5, 0x10, 0x98, 0x2f, 0x40, 0xba, 0xe2, 0x38, 0xfc, 0x4c, 0xe2, 0xea, 0x90, 0x05, - 0xa8, 0x27, 0x00, 0xe6, 0x0b, 0x90, 0x5e, 0xe3, 0x98, 0x94, 0x90, 0xd6, 0x24, 0xaa, 0x2d, 0xcc, - 0xec, 0xb5, 0x81, 0x84, 0xfa, 0x6e, 0xea, 0x53, 0x42, 0x9a, 0x0f, 0xa4, 0x0b, 0xb6, 0xed, 0x5d, - 0xfc, 0x14, 0xde, 0xe6, 0xf5, 0x81, 0x0b, 0x76, 0xe4, 0xfd, 0x54, 0xba, 0x60, 0xdb, 0x5d, 0x15, - 0xe8, 0x0b, 0x30, 0x2d, 0x6e, 0xd1, 0x15, 0x6e, 0x0c, 0xf1, 0x81, 0xc3, 0x51, 0x31, 0x9d, 0xd7, - 0x02, 0x87, 0x5b, 0x59, 0x7e, 0x09, 0x8f, 0x0f, 0xef, 0xe5, 0x21, 0x56, 0xb6, 0x2f, 0x20, 0xe5, - 0x56, 0x36, 0x00, 0x53, 0x2b, 0xcb, 0xf5, 0x54, 0xac, 0x75, 0x37, 0x07, 0x5a, 0xd9, 0xfe, 0xac, - 0x4e, 0x6a, 0x65, 0x3f, 0x08, 0xa0, 0x74, 0x64, 0x0e, 0x0f, 0xc4, 0x0a, 0xaf, 0x0c, 0x1c, 0x59, - 0x77, 0x40, 0x49, 0x47, 0x26, 0x70, 0xa8, 0xd8, 0x78, 0x06, 0x13, 0xe7, 0xf4, 0xab, 0x03, 0xc5, - 0xd6, 0x17, 0xb7, 0x54, 0xbc, 0x57, 0x9c, 0x38, 0x87, 0x7d, 0x43, 0x65, 0x8b, 0x4b, 0x33, 0x82, - 0x53, 0xaf, 0x0d, 0x37, 0x54, 0x51, 0xf7, 0x81, 0x7c, 0x43, 0xd5, 0x55, 0x59, 0x9a, 0x16, 0xf9, - 0x66, 0x0f, 0x52, 0xe9, 0x59, 0x59, 0x7e, 0x90, 0x4a, 0x9f, 0x95, 0x0b, 0x0f, 0x52, 0xe9, 0x73, - 0xf2, 0xc2, 0x83, 0x54, 0xfa, 0xbc, 0x7c, 0xa1, 0xf8, 0x1f, 0x67, 0x21, 0xe7, 0xc5, 0x31, 0x3c, - 0x2a, 0xb8, 0x13, 0x8e, 0x0a, 0x2e, 0x0e, 0x8a, 0x0a, 0x44, 0xe4, 0x23, 0xc2, 0x82, 0x3b, 0xe1, - 0xb0, 0xe0, 0xe2, 0xa0, 0xb0, 0x20, 0xc0, 0xa1, 0x71, 0x41, 0x7d, 0x50, 0x5c, 0xf0, 0xf2, 0x18, - 0x71, 0x81, 0x4f, 0xaa, 0x37, 0x30, 0x58, 0xed, 0x0f, 0x0c, 0xae, 0x0c, 0x0f, 0x0c, 0x7c, 0x52, - 0xa1, 0xc8, 0xe0, 0xad, 0x9e, 0xc8, 0xe0, 0xd2, 0x90, 0xc8, 0xc0, 0xc7, 0xf7, 0x42, 0x83, 0xf5, - 0xc8, 0xd0, 0xe0, 0xda, 0xa8, 0xd0, 0xc0, 0xa7, 0xd3, 0x15, 0x1b, 0xbc, 0xde, 0x15, 0x1b, 0x2c, - 0x0e, 0x8c, 0x0d, 0x7c, 0x6c, 0x1e, 0x1c, 0xbc, 0x37, 0x38, 0x38, 0x78, 0x65, 0xac, 0xe0, 0xc0, - 0xa7, 0xd7, 0x1f, 0x1d, 0xd4, 0x07, 0x45, 0x07, 0x2f, 0x8f, 0x11, 0x1d, 0x04, 0x82, 0xeb, 0x09, - 0x0f, 0x2a, 0x51, 0xe1, 0xc1, 0xd5, 0x11, 0xe1, 0x81, 0x4f, 0x2d, 0x1c, 0x1f, 0x54, 0xa2, 0xe2, - 0x83, 0xab, 0x23, 0xe2, 0x83, 0x1e, 0x4a, 0x3c, 0x40, 0xd8, 0x8c, 0x0e, 0x10, 0xae, 0x8f, 0x0c, - 0x10, 0x7c, 0x6a, 0xdd, 0x11, 0xc2, 0xad, 0x50, 0x84, 0xf0, 0xd2, 0x80, 0x08, 0xc1, 0x47, 0xa5, - 0x21, 0xc2, 0x17, 0xfb, 0x42, 0x84, 0xe2, 0xb0, 0x10, 0xc1, 0xc7, 0xf5, 0x63, 0x84, 0x77, 0x06, - 0xc4, 0x08, 0x37, 0x46, 0xc7, 0x08, 0x3e, 0xb1, 0x9e, 0x20, 0x41, 0x1d, 0x1a, 0x24, 0xbc, 0x36, - 0x66, 0x90, 0xe0, 0x53, 0x8f, 0x8a, 0x12, 0x3e, 0xd7, 0x1d, 0x25, 0x2c, 0x0d, 0x8e, 0x12, 0x7c, - 0x32, 0x22, 0x4c, 0x58, 0x8f, 0x0c, 0x13, 0xae, 0x8d, 0x0a, 0x13, 0x82, 0xb9, 0x17, 0x8e, 0x13, - 0x36, 0xa3, 0xe3, 0x84, 0xeb, 0x23, 0xe3, 0x84, 0x40, 0xfc, 0x5d, 0x81, 0xc2, 0x7a, 0x64, 0xa0, - 0x70, 0x6d, 0x54, 0xa0, 0x10, 0x74, 0x2e, 0x1c, 0x29, 0xbc, 0x3b, 0x30, 0x52, 0xb8, 0x39, 0x4e, - 0xa4, 0xe0, 0x13, 0xed, 0x0b, 0x15, 0xde, 0x1b, 0x1c, 0x2a, 0xbc, 0x32, 0x56, 0xa8, 0x10, 0x98, - 0x8e, 0xbe, 0x58, 0xe1, 0x8b, 0x7d, 0xb1, 0x42, 0x71, 0x58, 0xac, 0x10, 0xe8, 0xb3, 0x17, 0x2c, - 0xa8, 0x43, 0x5d, 0xfb, 0xd7, 0xc6, 0x74, 0xed, 0x03, 0xe5, 0x8b, 0xf0, 0xed, 0xd7, 0x22, 0x7c, - 0xfb, 0x2b, 0xc3, 0x7d, 0xfb, 0x60, 0x09, 0x09, 0x9c, 0xfb, 0x4a, 0x94, 0x73, 0x7f, 0x75, 0x84, - 0x73, 0x1f, 0x58, 0xa1, 0x90, 0x77, 0xff, 0x56, 0x8f, 0x77, 0x7f, 0x69, 0xe4, 0xc1, 0x77, 0xc8, - 0xbd, 0x2f, 0xf5, 0xbb, 0xf7, 0x97, 0x87, 0xba, 0xf7, 0x3e, 0x85, 0xc0, 0xbf, 0x7f, 0xab, 0xc7, - 0xbf, 0xbf, 0x34, 0xc4, 0xbf, 0x0f, 0x3a, 0x20, 0x1c, 0x7c, 0x7d, 0xb8, 0x83, 0xbf, 0x3c, 0xae, - 0x83, 0xef, 0x13, 0x8e, 0xf4, 0xf0, 0x37, 0xa3, 0x3d, 0xfc, 0xeb, 0x63, 0x9e, 0x81, 0xf5, 0xb9, - 0xf8, 0x95, 0x28, 0x17, 0xff, 0xea, 0x08, 0x17, 0x3f, 0xbc, 0x86, 0xf8, 0x3e, 0x7e, 0x25, 0xca, - 0xc7, 0xbf, 0x3a, 0xc2, 0xc7, 0x0f, 0x28, 0x85, 0x9c, 0xfc, 0xfa, 0x20, 0x27, 0xff, 0xe5, 0x31, - 0x9c, 0xfc, 0x60, 0xdd, 0xed, 0xf1, 0xf2, 0xdf, 0xee, 0xf5, 0xf2, 0x8b, 0xc3, 0xbc, 0xfc, 0x60, - 0x46, 0x7a, 0x6e, 0xfe, 0x66, 0xb4, 0x9b, 0x7f, 0x7d, 0xa4, 0x9b, 0x1f, 0x36, 0x92, 0x21, 0x3f, - 0x7f, 0x3d, 0xd2, 0xcf, 0xbf, 0x36, 0xca, 0xcf, 0x0f, 0x8c, 0x64, 0xd8, 0xd1, 0x7f, 0xbb, 0xd7, - 0xd1, 0x2f, 0x0e, 0x73, 0xf4, 0x83, 0xc1, 0x79, 0x9e, 0x7e, 0x25, 0xca, 0xd3, 0xbf, 0x3a, 0xc2, - 0xd3, 0x0f, 0x84, 0x17, 0x72, 0xf5, 0xd5, 0xa1, 0xae, 0xfe, 0x6b, 0x63, 0xba, 0xfa, 0x3d, 0x86, - 0xeb, 0xf9, 0x7c, 0xfd, 0x07, 0xa9, 0xf4, 0x05, 0xf9, 0xa5, 0xe2, 0x5f, 0x4f, 0xc2, 0x54, 0xc5, - 0x4b, 0xd0, 0x08, 0xdd, 0x7a, 0x96, 0x5e, 0xe4, 0xd6, 0x33, 0x5a, 0xa5, 0xea, 0xc3, 0x26, 0xa1, - 0xf0, 0xfe, 0x87, 0x3c, 0x21, 0xd0, 0x77, 0x44, 0xe6, 0xa1, 0xbe, 0xc0, 0x9d, 0x10, 0xf4, 0x3a, - 0xe4, 0x3a, 0x0e, 0xb1, 0x95, 0xb6, 0x6d, 0x58, 0xb6, 0xe1, 0xf2, 0x04, 0x44, 0xa9, 0x24, 0x7f, - 0x74, 0xbc, 0x38, 0xb3, 0xe3, 0x10, 0x7b, 0x5b, 0xc0, 0xf1, 0x4c, 0x27, 0x54, 0xf2, 0x1e, 0x01, - 0x9e, 0x1c, 0xff, 0x11, 0xe0, 0x77, 0x40, 0xb6, 0x89, 0xaa, 0x77, 0x2d, 0x87, 0xfc, 0x76, 0x70, - 0xf4, 0xca, 0xcd, 0x32, 0x6d, 0xbd, 0x96, 0xec, 0x96, 0xf0, 0xac, 0xdd, 0x0d, 0x44, 0xb7, 0xe1, - 0x74, 0x4b, 0x3d, 0xe4, 0xf7, 0xdf, 0x3d, 0x0f, 0x83, 0x25, 0xaa, 0xa4, 0x59, 0x3e, 0x15, 0x6a, - 0xa9, 0x87, 0xec, 0x45, 0x61, 0x5e, 0xc5, 0xde, 0x12, 0xbc, 0x0a, 0x79, 0xdd, 0x70, 0x5c, 0xc3, - 0xd4, 0xbc, 0xa7, 0x74, 0xf8, 0x9b, 0x35, 0x39, 0x0f, 0xca, 0x9f, 0xb4, 0xb9, 0x09, 0x73, 0x22, - 0xc7, 0x2c, 0x78, 0x63, 0x98, 0xf9, 0xd2, 0x69, 0xda, 0x0b, 0x5a, 0x11, 0x3c, 0x09, 0x5d, 0x86, - 0xd9, 0x86, 0xea, 0x92, 0x03, 0xf5, 0x48, 0xf1, 0x92, 0x7d, 0xb3, 0xec, 0x41, 0x91, 0xf3, 0x27, - 0xc7, 0x8b, 0xb9, 0xfb, 0xbc, 0xaa, 0x2f, 0xe7, 0x37, 0xd7, 0x08, 0x55, 0xe8, 0x68, 0x05, 0x66, - 0xd8, 0x33, 0x69, 0x16, 0x7f, 0x8d, 0x4f, 0x78, 0xc8, 0x83, 0xce, 0x30, 0xc4, 0x9b, 0x7d, 0x98, - 0x3d, 0xad, 0xe6, 0x3d, 0xe0, 0x77, 0x1d, 0x66, 0x55, 0xe7, 0xc8, 0xd4, 0x18, 0x87, 0x89, 0xe9, - 0x74, 0x1c, 0xe6, 0x22, 0xa7, 0x71, 0x9e, 0x81, 0xcb, 0x1e, 0x54, 0xbc, 0xc8, 0xf3, 0x3b, 0x12, - 0xcc, 0x74, 0x25, 0x5e, 0xbe, 0xd5, 0x73, 0x54, 0x77, 0x2e, 0xda, 0x3d, 0x1f, 0x94, 0xa3, 0x94, - 0x16, 0x12, 0xf0, 0xf2, 0x26, 0x16, 0x07, 0xbb, 0x77, 0x2c, 0x40, 0xf6, 0x32, 0x4d, 0x3c, 0xb4, - 0x37, 0x53, 0xbf, 0xf7, 0xdd, 0xc5, 0x89, 0xe2, 0xcf, 0x93, 0x90, 0xeb, 0x4e, 0xb0, 0xac, 0xf6, - 0xf4, 0x2b, 0xca, 0x24, 0x76, 0x61, 0x2c, 0x0f, 0x79, 0xa8, 0x23, 0x13, 0x3c, 0xae, 0xc6, 0xbb, - 0xb9, 0x34, 0xe4, 0x40, 0x32, 0xdc, 0xcf, 0x00, 0x71, 0xe1, 0xc7, 0x09, 0x7f, 0xe6, 0x2f, 0xc3, - 0x24, 0x7b, 0xde, 0x5c, 0x74, 0x2d, 0xea, 0xb6, 0xc8, 0x1a, 0xad, 0xc7, 0xbc, 0x19, 0xb5, 0x14, - 0xf5, 0x17, 0x7a, 0x1f, 0xc1, 0x07, 0xbc, 0xc0, 0xf3, 0xdb, 0x2f, 0x78, 0x8f, 0x9f, 0x1d, 0x38, - 0x36, 0x9b, 0x44, 0x73, 0xc5, 0x2b, 0xe9, 0xde, 0x23, 0xdb, 0x57, 0x7a, 0x49, 0x88, 0x37, 0xd5, - 0x97, 0xb1, 0x78, 0x53, 0x3d, 0x94, 0xca, 0x92, 0xf7, 0x49, 0xb0, 0x89, 0xc5, 0x13, 0x9e, 0x84, - 0xa8, 0xbf, 0x2e, 0x81, 0xcc, 0xa6, 0xd1, 0x3d, 0x42, 0xf4, 0x58, 0xb4, 0xd0, 0xcb, 0xb2, 0x49, - 0x8c, 0x9d, 0x65, 0x53, 0x54, 0x21, 0xef, 0xf7, 0x81, 0xbf, 0x36, 0x3c, 0xe4, 0x79, 0x8b, 0x17, - 0xba, 0x76, 0x58, 0xfc, 0x03, 0x09, 0xe6, 0xfd, 0x6f, 0x30, 0x3f, 0x9f, 0xe7, 0xc5, 0xbf, 0x40, - 0xde, 0x23, 0x66, 0x2f, 0xa9, 0xd3, 0x38, 0x8f, 0x5d, 0x45, 0x1b, 0x4b, 0x83, 0x90, 0x38, 0xfb, - 0x06, 0x11, 0x3f, 0xea, 0xf5, 0x1a, 0x7b, 0x63, 0x9d, 0xff, 0x76, 0x8a, 0xf7, 0x42, 0x1c, 0x60, - 0xca, 0x4a, 0x87, 0x39, 0x96, 0x56, 0x7b, 0xc3, 0x64, 0x8d, 0x8b, 0x7f, 0x2b, 0x85, 0x09, 0x3d, - 0xa5, 0x7e, 0xc3, 0x5d, 0x48, 0x3e, 0x55, 0x9b, 0xc3, 0x8e, 0xfe, 0xbb, 0x58, 0x8f, 0x69, 0x6b, - 0x74, 0x0f, 0xf8, 0x75, 0x1c, 0x7e, 0x99, 0x20, 0x31, 0x38, 0xb8, 0xeb, 0x67, 0x29, 0x0e, 0x61, - 0xa2, 0x37, 0xbc, 0x51, 0x24, 0x47, 0x7f, 0x3e, 0x3c, 0x49, 0xdf, 0x4c, 0x7d, 0xf8, 0xdd, 0x45, - 0xe9, 0x66, 0x0d, 0xe6, 0x23, 0x16, 0x21, 0x94, 0x07, 0x28, 0x6f, 0x6d, 0xd6, 0xaa, 0xb5, 0xfa, - 0xda, 0x66, 0xdd, 0x7b, 0xc8, 0x7d, 0x65, 0x55, 0xd9, 0xd9, 0x2c, 0x6f, 0x6d, 0x6c, 0x54, 0xeb, - 0xf5, 0xb5, 0x55, 0x59, 0x42, 0x32, 0xcc, 0x54, 0x37, 0x43, 0xed, 0xc4, 0xfb, 0xed, 0x37, 0x7f, - 0x01, 0x20, 0x78, 0xe7, 0x92, 0xd2, 0x5a, 0x5f, 0x7b, 0xac, 0x3c, 0x5a, 0x79, 0xb8, 0xb3, 0x56, - 0x93, 0x27, 0x10, 0x82, 0x7c, 0x69, 0xa5, 0x5e, 0xae, 0x28, 0x78, 0xad, 0xb6, 0xbd, 0xb5, 0x59, - 0x5b, 0x93, 0x25, 0x81, 0xb7, 0x01, 0xd9, 0xd0, 0x7b, 0x19, 0xb4, 0xe1, 0xf6, 0x4e, 0xad, 0xa2, - 0xd4, 0xab, 0x1b, 0x6b, 0xb5, 0xfa, 0xca, 0xc6, 0xb6, 0x3c, 0x41, 0x89, 0x31, 0xd8, 0x4a, 0x69, - 0x0b, 0xd7, 0x65, 0xc9, 0x2f, 0xd7, 0xb7, 0x76, 0xca, 0x15, 0xff, 0x01, 0xf9, 0x54, 0x3a, 0x29, - 0x27, 0x6f, 0x5a, 0x70, 0x3a, 0xf2, 0xba, 0x12, 0xca, 0xc2, 0xf4, 0x8e, 0xc9, 0x5e, 0x6a, 0x90, - 0x27, 0x50, 0x2e, 0x74, 0x63, 0x49, 0x96, 0x50, 0x9a, 0xdf, 0x4b, 0x91, 0x13, 0x68, 0x0a, 0x12, - 0xb5, 0xbb, 0x72, 0x12, 0xcd, 0x42, 0x36, 0x74, 0xed, 0x47, 0x4e, 0xa1, 0x8c, 0xb8, 0x2d, 0x21, - 0x4f, 0xa2, 0x99, 0xe0, 0xba, 0x82, 0x3c, 0x75, 0xf3, 0x12, 0x84, 0xb2, 0xb9, 0x11, 0xc0, 0xd4, - 0x43, 0xd5, 0x25, 0x8e, 0x2b, 0x4f, 0xa0, 0x69, 0x48, 0xae, 0x34, 0x9b, 0xb2, 0x74, 0xe7, 0x07, - 0x12, 0xa4, 0xbd, 0x37, 0xf1, 0xd0, 0x43, 0x98, 0xe4, 0x41, 0xdb, 0xe2, 0x60, 0x63, 0xcf, 0xec, - 0xc5, 0xc2, 0xd2, 0xa8, 0xd5, 0xa0, 0x38, 0x81, 0xde, 0x15, 0xff, 0xc1, 0x81, 0x4a, 0x1a, 0x5d, - 0x1e, 0xa6, 0x07, 0x1e, 0xd5, 0xe1, 0xca, 0x42, 0x75, 0xbb, 0x38, 0xf1, 0x19, 0xa9, 0x74, 0xe9, - 0xc3, 0x7f, 0xbd, 0x38, 0xf1, 0xe1, 0xc9, 0x45, 0xe9, 0xa7, 0x27, 0x17, 0xa5, 0x7f, 0x3a, 0xb9, - 0x28, 0xfd, 0xcb, 0xc9, 0x45, 0xe9, 0x37, 0xff, 0xed, 0xe2, 0xc4, 0x7b, 0xd3, 0x02, 0x6b, 0x77, - 0x8a, 0xfd, 0x13, 0x89, 0xbb, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x3d, 0x09, 0x8b, 0x49, - 0x63, 0x00, 0x00, + 0x50, 0x88, 0x77, 0x00, 0x28, 0x0b, 0xe3, 0x54, 0x83, 0xff, 0x4e, 0x42, 0x7e, 0xbb, 0xe3, 0xec, + 0xc7, 0xac, 0xf7, 0x65, 0x80, 0x76, 0xc7, 0xd9, 0x27, 0xb6, 0xe2, 0x1e, 0x9a, 0x62, 0xe4, 0x23, + 0xce, 0xc6, 0xbc, 0xa1, 0x73, 0xbc, 0xfa, 0xa1, 0x89, 0xb6, 0x04, 0x11, 0xa2, 0x04, 0x07, 0x6c, + 0x37, 0xc7, 0x88, 0x0b, 0xea, 0x87, 0xe6, 0x06, 0xf1, 0x03, 0x02, 0x4e, 0x90, 0x50, 0x82, 0x9f, + 0x87, 0x69, 0x5a, 0x50, 0x5c, 0xeb, 0x79, 0x34, 0x6c, 0x8a, 0xe2, 0xd4, 0x2d, 0xf4, 0x00, 0xf2, + 0x3a, 0x69, 0xdb, 0x84, 0x9a, 0x21, 0x5d, 0xa1, 0xd3, 0x7a, 0x72, 0x7c, 0x22, 0xb9, 0x00, 0x75, + 0xd3, 0x3a, 0x40, 0x6f, 0x41, 0x86, 0xf7, 0x84, 0xae, 0x3c, 0x53, 0x6c, 0xe5, 0x89, 0x62, 0x8f, + 0x90, 0x0c, 0x5b, 0x73, 0xd2, 0xac, 0x1b, 0x74, 0xc5, 0x39, 0x05, 0x93, 0x7b, 0x96, 0xad, 0x11, + 0x76, 0x3a, 0x97, 0xc6, 0xbc, 0x80, 0x6e, 0xc2, 0x9c, 0x61, 0x6a, 0xcd, 0x8e, 0x63, 0x3c, 0x25, + 0x8a, 0x37, 0x4c, 0xee, 0x81, 0xce, 0xfa, 0x15, 0x8c, 0xa0, 0xe5, 0xbb, 0xa2, 0x69, 0x39, 0x53, + 0xfc, 0x5d, 0x09, 0x66, 0x7d, 0x0d, 0x88, 0xd3, 0x07, 0x2d, 0x77, 0x89, 0xef, 0xf9, 0x75, 0x80, + 0x8a, 0xac, 0xf8, 0xfd, 0x04, 0xcc, 0xbe, 0xd3, 0x21, 0xf6, 0x51, 0xcc, 0x0a, 0x5a, 0xe2, 0xa7, + 0xb6, 0x89, 0x17, 0x54, 0x2a, 0x76, 0x8e, 0x7b, 0x0d, 0x66, 0x0f, 0x54, 0xc3, 0x55, 0xf6, 0x2c, + 0x5b, 0xe9, 0xb4, 0x75, 0xd5, 0xf5, 0xce, 0xb8, 0x72, 0x14, 0x7c, 0xcf, 0xb2, 0x77, 0x18, 0x10, + 0x11, 0x40, 0x4f, 0x4c, 0xeb, 0xc0, 0x54, 0x28, 0xd8, 0x30, 0x1b, 0x94, 0x1f, 0x62, 0x33, 0xa3, + 0xf4, 0xc6, 0x3f, 0x1d, 0x2f, 0xde, 0x6d, 0x18, 0xee, 0x7e, 0x67, 0x77, 0x59, 0xb3, 0x5a, 0xb7, + 0xfc, 0x8e, 0xe8, 0xbb, 0xc1, 0xef, 0x5b, 0xed, 0x27, 0x8d, 0x5b, 0xec, 0xb8, 0xbe, 0xd3, 0x31, + 0xf4, 0xe5, 0x9d, 0x9d, 0xea, 0x2a, 0x96, 0x19, 0xc9, 0x77, 0x39, 0xc5, 0xfa, 0xa1, 0xe9, 0x2d, + 0x98, 0x1f, 0x49, 0x20, 0x07, 0x0c, 0x8b, 0x53, 0x9e, 0x6b, 0x90, 0xfd, 0xa0, 0x43, 0x6c, 0x83, + 0xe8, 0xcf, 0x2d, 0x50, 0x10, 0x88, 0x74, 0x12, 0xbe, 0x07, 0x33, 0x5d, 0x7c, 0x48, 0x7e, 0x3c, + 0x3e, 0x64, 0x0f, 0x02, 0x16, 0x14, 0xff, 0x2a, 0x01, 0x88, 0x0d, 0xbe, 0xca, 0xf7, 0x91, 0x3e, + 0x65, 0x0a, 0xf3, 0x08, 0xc0, 0xd8, 0x53, 0x5a, 0x86, 0xe3, 0x18, 0x66, 0x83, 0xe9, 0x4a, 0xfe, + 0xce, 0x1b, 0x11, 0x7d, 0xe9, 0x1f, 0xc2, 0x72, 0x75, 0x6f, 0x83, 0xa3, 0x95, 0xc8, 0xbe, 0xfa, + 0xd4, 0xb0, 0x6c, 0x9c, 0x31, 0x3c, 0x50, 0xb1, 0x04, 0x73, 0x7d, 0xf5, 0x28, 0x0f, 0xb0, 0xba, + 0xa5, 0x6c, 0x6e, 0xd5, 0x2b, 0xd5, 0xcd, 0xfb, 0xf2, 0x04, 0x92, 0x61, 0x06, 0xaf, 0xd5, 0x77, + 0xf0, 0xa6, 0xb2, 0x86, 0xf1, 0x16, 0x96, 0x25, 0x94, 0x85, 0xe9, 0x6d, 0xbc, 0xf6, 0x68, 0x6d, + 0xb3, 0x2e, 0x27, 0x84, 0xf6, 0xfc, 0x12, 0xcc, 0x77, 0x7d, 0x3c, 0x4e, 0xfd, 0xb9, 0x04, 0x33, + 0x7b, 0x56, 0xc7, 0xd4, 0x15, 0x1e, 0x87, 0x8b, 0xfd, 0x86, 0x2c, 0x83, 0xf1, 0xef, 0x15, 0xbf, + 0x91, 0x80, 0x53, 0x98, 0x38, 0x56, 0xf3, 0x29, 0x89, 0x5f, 0x82, 0x5b, 0x20, 0xb6, 0x17, 0x95, + 0x8f, 0x23, 0xc8, 0x0c, 0xa7, 0xc1, 0x97, 0x93, 0x29, 0xc7, 0x55, 0xdd, 0x8e, 0x23, 0x44, 0x79, + 0x65, 0xf8, 0x5c, 0xa8, 0xb1, 0xb6, 0x58, 0xe0, 0x84, 0xb6, 0x09, 0x52, 0xfd, 0xdb, 0x04, 0xc5, + 0x5f, 0x80, 0xd3, 0x3d, 0x8c, 0x88, 0x73, 0xd5, 0xff, 0x87, 0x04, 0x9c, 0xeb, 0x26, 0x1f, 0x77, + 0x0c, 0xf0, 0x7f, 0x83, 0xd9, 0xa8, 0x02, 0xb9, 0x96, 0x61, 0x2a, 0x81, 0x93, 0xf6, 0x1c, 0x4b, + 0xfa, 0x0c, 0x8d, 0x80, 0xbb, 0xfd, 0x34, 0x1a, 0xae, 0x44, 0xf1, 0x35, 0x4e, 0xd9, 0x7d, 0x5b, + 0x82, 0x99, 0xb8, 0xf7, 0x2f, 0x5e, 0xec, 0x28, 0x5d, 0x8c, 0xb9, 0x0e, 0xb9, 0x4f, 0x60, 0xc3, + 0xe3, 0x8f, 0x24, 0x40, 0x75, 0xbb, 0x63, 0x52, 0x97, 0xe9, 0xa1, 0xd5, 0x88, 0x73, 0xb0, 0xa7, + 0x60, 0xd2, 0x30, 0x75, 0x72, 0xc8, 0x06, 0x9b, 0xc2, 0xbc, 0x80, 0x6e, 0x43, 0x5a, 0x24, 0x50, + 0xf1, 0xd4, 0x80, 0x64, 0xe9, 0xcc, 0xc9, 0xf1, 0xe2, 0x34, 0x4f, 0x97, 0x5a, 0xfd, 0x28, 0xf8, + 0x89, 0xa7, 0x79, 0xc6, 0x94, 0x97, 0xad, 0xf2, 0x1e, 0xcc, 0x77, 0x75, 0x34, 0x4e, 0x2e, 0x7c, + 0x3f, 0x01, 0xf3, 0x62, 0x38, 0xb1, 0x6f, 0xf8, 0xbc, 0x50, 0xf6, 0x1d, 0xfa, 0x02, 0x40, 0xdb, + 0x26, 0x4f, 0x15, 0x8e, 0x9a, 0x1c, 0x0b, 0x35, 0x43, 0x31, 0x18, 0x00, 0x7d, 0x19, 0x66, 0xe9, + 0x84, 0x6b, 0xdb, 0x56, 0xdb, 0x72, 0xa8, 0x27, 0xe1, 0x8c, 0xe7, 0x8a, 0xcf, 0x9d, 0x1c, 0x2f, + 0xe6, 0x36, 0x0c, 0x73, 0x5b, 0x20, 0xd6, 0x6b, 0x98, 0xce, 0x5c, 0xbf, 0xe8, 0xb9, 0x3f, 0x7f, + 0x2f, 0xc1, 0xa9, 0x4f, 0x6c, 0x8b, 0xec, 0x7f, 0x83, 0x63, 0xfe, 0x7a, 0x20, 0xb3, 0x62, 0xd5, + 0xdc, 0xb3, 0xe2, 0xdf, 0xb8, 0xfc, 0xb6, 0x04, 0x73, 0x21, 0xf2, 0x71, 0xae, 0xfa, 0x2f, 0x96, + 0xe3, 0xf9, 0x15, 0xea, 0x07, 0x84, 0xd5, 0x3e, 0xce, 0x49, 0xf5, 0x07, 0x12, 0x9c, 0x29, 0xf3, + 0xe3, 0x2c, 0x76, 0x6a, 0xe7, 0x74, 0x5a, 0x71, 0x6a, 0x49, 0x01, 0xa6, 0x9f, 0x12, 0xdb, 0x31, + 0x2c, 0xbe, 0xee, 0xe5, 0xb0, 0x57, 0x64, 0xb9, 0xa6, 0xa6, 0xda, 0x76, 0xf6, 0x2d, 0x6f, 0x37, + 0xde, 0x2f, 0xfb, 0x21, 0x59, 0x52, 0x4e, 0x15, 0x7f, 0x2c, 0xc1, 0xd9, 0xbe, 0x0e, 0xc6, 0x29, + 0x94, 0xaf, 0x41, 0x56, 0x13, 0x84, 0xa9, 0xb9, 0xe3, 0x1b, 0xf2, 0x55, 0xda, 0xec, 0x05, 0xdd, + 0xf0, 0x93, 0xe3, 0x45, 0xf0, 0xba, 0x5a, 0x5d, 0xc5, 0xe0, 0x51, 0xaf, 0xea, 0xc5, 0x9f, 0x02, + 0xe4, 0xd6, 0x0e, 0xdb, 0x96, 0xed, 0xd6, 0xf8, 0x9a, 0x8f, 0x56, 0x21, 0xdd, 0xb6, 0xad, 0xa7, + 0x86, 0x37, 0x88, 0x7c, 0xe4, 0x81, 0x50, 0x17, 0xce, 0xb6, 0x68, 0x8f, 0x7d, 0x4c, 0x84, 0x21, + 0xf3, 0xd0, 0xd2, 0xd4, 0xe6, 0x3d, 0xa3, 0xe9, 0x29, 0xd7, 0xf2, 0x28, 0x32, 0xcb, 0x3e, 0xc6, + 0xb6, 0xea, 0xee, 0x7b, 0x73, 0xcd, 0x07, 0xa2, 0xfb, 0x90, 0xae, 0xb8, 0x6e, 0x9b, 0x56, 0x8a, + 0x89, 0x7a, 0x75, 0x24, 0x49, 0x8a, 0x20, 0x28, 0xf9, 0xc8, 0x08, 0xc3, 0xdc, 0x7d, 0xcb, 0x6a, + 0x34, 0x49, 0xb9, 0x69, 0x75, 0xf4, 0xb2, 0x65, 0xee, 0x19, 0x0d, 0x61, 0xe8, 0xae, 0x8c, 0xa4, + 0x78, 0xbf, 0x5c, 0xc3, 0xfd, 0xe8, 0xe8, 0x8b, 0x90, 0xae, 0xdd, 0x15, 0xa4, 0xb8, 0x9b, 0x72, + 0x79, 0x24, 0xa9, 0xda, 0x5d, 0xec, 0x23, 0xa1, 0x0a, 0x64, 0x57, 0x9e, 0x75, 0x6c, 0x22, 0x68, + 0x4c, 0x31, 0x1a, 0xd7, 0x46, 0xd2, 0x60, 0x38, 0x38, 0x8c, 0x8a, 0xde, 0x81, 0xfc, 0xbb, 0x96, + 0xfd, 0xa4, 0x69, 0xa9, 0xde, 0xd8, 0xa6, 0x19, 0xb1, 0x97, 0x47, 0x12, 0xf3, 0xd0, 0x70, 0x0f, + 0x81, 0x85, 0x2f, 0x43, 0xae, 0x4b, 0x38, 0x08, 0x41, 0xaa, 0x4d, 0xe5, 0x40, 0x35, 0x24, 0x83, + 0xd9, 0x6f, 0xf4, 0x1a, 0x4c, 0x9b, 0x96, 0x4e, 0x3c, 0x9d, 0xcd, 0x95, 0x4e, 0x9d, 0x1c, 0x2f, + 0x4e, 0x6d, 0x5a, 0x3a, 0x5f, 0xa1, 0xc5, 0x2f, 0x3c, 0x45, 0x1b, 0x79, 0xeb, 0xf3, 0xc2, 0x35, + 0x48, 0x51, 0xb9, 0xd0, 0x79, 0xb9, 0xab, 0x3a, 0x64, 0xc7, 0x36, 0x04, 0x4d, 0xaf, 0x28, 0xda, + 0xfd, 0xb5, 0x04, 0x89, 0xda, 0x5d, 0xea, 0x2a, 0xee, 0x76, 0xb4, 0x27, 0xc4, 0x15, 0xad, 0x44, + 0x89, 0xb9, 0x90, 0x36, 0xd9, 0x33, 0xb8, 0xdb, 0x90, 0xc1, 0xa2, 0x84, 0x5e, 0x02, 0x50, 0x35, + 0x8d, 0x38, 0x8e, 0xe2, 0x25, 0xa1, 0x67, 0x70, 0x86, 0x43, 0xd6, 0xc9, 0x11, 0x45, 0x73, 0x88, + 0x66, 0x13, 0x3e, 0xe3, 0x33, 0x58, 0x94, 0x28, 0x9a, 0x4b, 0x5a, 0x6d, 0xc5, 0xb5, 0x9e, 0x10, + 0x93, 0xc9, 0x33, 0x83, 0x33, 0x14, 0x52, 0xa7, 0x00, 0x6a, 0x2a, 0x88, 0xa9, 0xb7, 0x2d, 0xc3, + 0x74, 0x99, 0xa0, 0x32, 0xd8, 0x2f, 0x53, 0x92, 0x36, 0x69, 0x18, 0x22, 0x3d, 0x3b, 0x83, 0x45, + 0x49, 0x0c, 0xe3, 0x3b, 0x12, 0x24, 0xef, 0x97, 0x6b, 0xcf, 0x3d, 0x0e, 0x04, 0x29, 0xb5, 0x23, + 0xf4, 0x3e, 0x83, 0xd9, 0x6f, 0x96, 0x83, 0x61, 0x34, 0x9b, 0x34, 0x56, 0x6f, 0xdb, 0xd6, 0xd7, + 0x88, 0xe6, 0x8d, 0x22, 0x2f, 0xc0, 0xdb, 0x1c, 0x8a, 0x96, 0x20, 0xab, 0xd9, 0x44, 0x27, 0xa6, + 0x6b, 0xa8, 0x4d, 0x47, 0x0c, 0x27, 0x0c, 0x12, 0x9d, 0xfb, 0x86, 0x04, 0x93, 0x4c, 0x91, 0xd0, + 0x05, 0xc8, 0x68, 0x96, 0xe9, 0xaa, 0x86, 0x29, 0xac, 0x40, 0x06, 0x07, 0x80, 0x81, 0x9d, 0xbc, + 0x04, 0x33, 0xaa, 0xa6, 0x59, 0x1d, 0xd3, 0x55, 0x4c, 0xb5, 0x45, 0x44, 0x67, 0xb3, 0x02, 0xb6, + 0xa9, 0xb6, 0x08, 0x5a, 0x04, 0xaf, 0xe8, 0xa7, 0xfd, 0x67, 0x30, 0x08, 0x90, 0x7f, 0xca, 0xb8, + 0xf0, 0x63, 0x09, 0xd2, 0x9e, 0x0a, 0xd2, 0xce, 0x34, 0x88, 0x49, 0x6c, 0xd5, 0xb5, 0xfc, 0xce, + 0xf8, 0x80, 0x5e, 0x83, 0x9e, 0x09, 0x0c, 0xfa, 0x29, 0x98, 0x74, 0xd5, 0xdd, 0xa6, 0xd7, 0x0f, + 0x5e, 0x60, 0xfb, 0x73, 0x4d, 0xb5, 0xc1, 0xb7, 0x78, 0x32, 0x98, 0x17, 0xe8, 0x90, 0x44, 0xd2, + 0x0f, 0xe7, 0x8e, 0x28, 0xd1, 0xfe, 0xf2, 0x3c, 0x97, 0x5d, 0xd2, 0x30, 0x4c, 0x26, 0xec, 0x24, + 0x06, 0x06, 0x62, 0x79, 0x05, 0xe8, 0x3c, 0x64, 0x78, 0x03, 0x62, 0xea, 0x4c, 0xe2, 0x49, 0x9c, + 0x66, 0x80, 0x35, 0x2f, 0x61, 0x5a, 0xac, 0xe2, 0x7f, 0x2a, 0xc1, 0xdc, 0xbb, 0xb6, 0xe1, 0x92, + 0x12, 0x4f, 0x90, 0x89, 0x6f, 0x49, 0x7b, 0x13, 0x32, 0xba, 0xea, 0xaa, 0xfc, 0xbe, 0x42, 0x62, + 0xe8, 0x7d, 0x05, 0xcf, 0x14, 0xd2, 0xf6, 0xec, 0xce, 0x02, 0x82, 0x14, 0xfd, 0xcd, 0xaf, 0x67, + 0x60, 0xf6, 0x3b, 0x38, 0x2e, 0x0d, 0x77, 0x37, 0xce, 0x25, 0xfe, 0xeb, 0x49, 0x6f, 0xd1, 0x89, + 0x93, 0x0d, 0x5f, 0x82, 0x69, 0x11, 0xb7, 0x0a, 0x26, 0x2c, 0x8d, 0xb2, 0x77, 0xde, 0xa1, 0x96, + 0x40, 0x43, 0x25, 0x00, 0xc7, 0x55, 0x6d, 0x97, 0x45, 0x9c, 0x63, 0xe5, 0x55, 0x78, 0x8b, 0x14, + 0x43, 0xa3, 0x50, 0xb4, 0x09, 0xd9, 0xd6, 0x53, 0x4d, 0x53, 0xf6, 0x8c, 0xa6, 0x2b, 0x52, 0x2a, + 0xa2, 0x53, 0xc8, 0x36, 0x1e, 0x95, 0xcb, 0xf7, 0x58, 0x23, 0x9e, 0xd9, 0x10, 0x94, 0x31, 0x50, + 0x0a, 0xfc, 0x37, 0x7a, 0x15, 0x44, 0x76, 0xa9, 0xe2, 0x78, 0xb9, 0xe2, 0xa5, 0xdc, 0xc9, 0xf1, + 0x62, 0x06, 0x33, 0x68, 0xad, 0x56, 0xc7, 0x19, 0xde, 0xa0, 0xe6, 0xb8, 0xe8, 0x32, 0xe4, 0xac, + 0x96, 0xe1, 0x2a, 0xde, 0x0a, 0xcf, 0x53, 0x27, 0xf0, 0x0c, 0x05, 0x7a, 0x1e, 0x80, 0x90, 0xef, + 0xb7, 0x24, 0xc8, 0x95, 0x3a, 0xcd, 0x27, 0x5b, 0xed, 0x5a, 0xa7, 0xd5, 0x52, 0xed, 0x23, 0xaa, + 0xca, 0x5c, 0x8f, 0x8c, 0x67, 0x84, 0xc9, 0x21, 0x29, 0x14, 0xc5, 0x78, 0x46, 0xa8, 0xa2, 0x88, + 0x5c, 0x33, 0x0a, 0xe7, 0x89, 0x64, 0x97, 0x21, 0xc7, 0xa2, 0x33, 0x85, 0x98, 0xae, 0x6d, 0x10, + 0x1e, 0xfc, 0x27, 0xf1, 0x0c, 0x03, 0xae, 0x71, 0x18, 0xba, 0x0a, 0x79, 0xe7, 0xc8, 0x71, 0x49, + 0x4b, 0xe1, 0xb7, 0x98, 0x78, 0x48, 0x91, 0xc4, 0x39, 0x0e, 0xc5, 0x1c, 0x58, 0xfc, 0xb3, 0x24, + 0xe4, 0x3d, 0x9d, 0x88, 0xd3, 0x99, 0x2a, 0xc1, 0xe4, 0x9e, 0xd1, 0x24, 0xde, 0x61, 0xe7, 0xe0, + 0x05, 0xd5, 0xa3, 0xb4, 0x4c, 0xd7, 0x38, 0xcf, 0xdf, 0x65, 0xa8, 0x71, 0xe8, 0xc5, 0xc2, 0x4f, + 0x24, 0x48, 0x31, 0x2f, 0xe6, 0x36, 0xa4, 0xd8, 0x44, 0x95, 0xc6, 0x99, 0xa8, 0xac, 0xa9, 0xbf, + 0xd8, 0x26, 0x42, 0x8b, 0x2d, 0x5d, 0xb9, 0xf6, 0xd5, 0xd7, 0x6f, 0xdf, 0x61, 0x3a, 0x31, 0x83, + 0x45, 0x09, 0x95, 0x20, 0x4d, 0xd8, 0x78, 0x88, 0x2e, 0x7c, 0x88, 0xa8, 0x69, 0xd0, 0x25, 0x78, + 0xcf, 0x28, 0x78, 0x78, 0xe8, 0x1c, 0x24, 0xa9, 0xb2, 0x4d, 0xf3, 0x33, 0xb3, 0x93, 0xe3, 0xc5, + 0x24, 0x55, 0x33, 0x0a, 0xe3, 0x2e, 0xf0, 0x83, 0x54, 0x3a, 0x25, 0x4f, 0x16, 0x7f, 0x98, 0x82, + 0x5c, 0xb5, 0x15, 0xf7, 0x34, 0x5e, 0xe9, 0x16, 0x58, 0x94, 0x8b, 0xd7, 0xf5, 0xd1, 0x08, 0x79, + 0x75, 0x19, 0xc4, 0xe4, 0xf3, 0x19, 0xc4, 0x2a, 0x5d, 0xbe, 0xc5, 0x15, 0x2e, 0xfa, 0xfd, 0x57, + 0x46, 0x7e, 0xbf, 0x4e, 0x97, 0x15, 0x4c, 0x71, 0xbc, 0x23, 0x29, 0x4e, 0x00, 0xbd, 0xcd, 0xbc, + 0x04, 0xae, 0x34, 0x53, 0xe3, 0x2b, 0xcd, 0x34, 0x31, 0x75, 0xa6, 0x32, 0x87, 0x42, 0x63, 0x3e, + 0x07, 0x49, 0xdd, 0x18, 0xc6, 0xd2, 0x28, 0xa3, 0x46, 0x51, 0x46, 0x28, 0x4e, 0x2a, 0xac, 0x38, + 0xe1, 0x10, 0x67, 0x61, 0x0b, 0x20, 0x18, 0x15, 0x5a, 0x82, 0x29, 0xab, 0xa9, 0x53, 0xb7, 0x4e, + 0x62, 0x6e, 0x5d, 0xe6, 0xe4, 0x78, 0x71, 0x72, 0xab, 0xa9, 0x57, 0x57, 0xf1, 0xa4, 0xd5, 0xd4, + 0xab, 0x3a, 0xbb, 0xf9, 0x46, 0x0e, 0x14, 0x76, 0xd9, 0x90, 0x85, 0x2b, 0x78, 0xda, 0x24, 0x07, + 0xab, 0xc4, 0xd1, 0xc2, 0x4b, 0xa0, 0x50, 0x9b, 0x3f, 0x94, 0x20, 0xef, 0x71, 0x30, 0xde, 0x99, + 0x9e, 0x36, 0x5a, 0x42, 0xf3, 0x93, 0xcf, 0xa7, 0xf9, 0x1e, 0x9e, 0xc8, 0xcf, 0xff, 0xa6, 0x04, + 0xf3, 0x3c, 0xc9, 0x49, 0x53, 0x5d, 0x6a, 0x90, 0x63, 0x54, 0xef, 0x97, 0x41, 0xb6, 0x55, 0x53, + 0xb7, 0x5a, 0xc6, 0x33, 0xc2, 0x37, 0x1d, 0x1c, 0xb1, 0xd7, 0x3e, 0xeb, 0xc3, 0x59, 0x54, 0xed, + 0xed, 0x99, 0xfc, 0x9b, 0x04, 0xa7, 0xba, 0x3b, 0x13, 0x27, 0xd3, 0xd6, 0x61, 0x8a, 0xed, 0x97, + 0x79, 0xd3, 0xed, 0xb5, 0x08, 0x22, 0x51, 0x5f, 0xe7, 0x17, 0x15, 0x7d, 0x85, 0x67, 0x24, 0x16, + 0xbe, 0x04, 0x93, 0x0c, 0xfc, 0x02, 0x36, 0x4e, 0x70, 0xfe, 0x03, 0x98, 0x5b, 0xd1, 0xf5, 0x5a, + 0x4d, 0x68, 0x5f, 0x7c, 0x6c, 0xf7, 0xfc, 0x9c, 0x44, 0x94, 0x9f, 0x13, 0xfe, 0x64, 0x9c, 0x7e, + 0x4e, 0x1b, 0xf2, 0x22, 0xf7, 0x30, 0xe6, 0x0d, 0xd2, 0x03, 0xea, 0x98, 0x09, 0xb5, 0xe1, 0x85, + 0xe0, 0xda, 0x93, 0xff, 0xc5, 0x38, 0x47, 0xd2, 0x81, 0x79, 0x8f, 0x6e, 0xdc, 0x67, 0x11, 0xc3, + 0x86, 0xc3, 0x36, 0x9a, 0xc2, 0x9f, 0x8d, 0x73, 0x4c, 0xdf, 0x93, 0x20, 0x5f, 0xeb, 0xec, 0xf2, + 0xbb, 0xaf, 0xf1, 0x8d, 0xe7, 0x3e, 0x40, 0x93, 0xec, 0x89, 0x7b, 0x29, 0xc2, 0x13, 0x1d, 0xff, + 0xea, 0x75, 0x86, 0xe2, 0xb2, 0x2a, 0xc1, 0x82, 0x1f, 0x26, 0x60, 0xd6, 0xef, 0x65, 0x9c, 0x33, + 0xff, 0x17, 0x81, 0xb9, 0x99, 0x8a, 0xe3, 0xaa, 0xae, 0x23, 0x0c, 0xe6, 0xab, 0xcf, 0x93, 0xd7, + 0x5d, 0x9a, 0x13, 0x39, 0x39, 0x19, 0x1f, 0x84, 0x33, 0x94, 0x24, 0xfb, 0x89, 0x96, 0x61, 0x9e, + 0x99, 0x37, 0x45, 0x6d, 0xb7, 0x9b, 0x06, 0xd1, 0x15, 0xbe, 0xab, 0x9f, 0x62, 0xbb, 0xfa, 0x73, + 0xac, 0x6a, 0x85, 0xd7, 0x54, 0xd9, 0x0e, 0xff, 0x3d, 0x98, 0xd9, 0xb3, 0x09, 0x79, 0x46, 0x14, + 0xe6, 0x34, 0x3d, 0xcf, 0x59, 0x4f, 0x96, 0x23, 0xd6, 0x28, 0x9e, 0x30, 0x24, 0xef, 0xc3, 0x1c, + 0xe3, 0x62, 0xdc, 0xe9, 0xf8, 0x42, 0x2a, 0x3f, 0x95, 0x00, 0x85, 0xe9, 0x7f, 0x72, 0x82, 0x49, + 0xc4, 0x2e, 0x98, 0x57, 0x01, 0xf1, 0x03, 0x7f, 0x47, 0x69, 0x13, 0x5b, 0x71, 0x88, 0x66, 0x89, + 0xfb, 0x96, 0x12, 0x96, 0x45, 0xcd, 0x36, 0xb1, 0x6b, 0x0c, 0x5e, 0xfc, 0x8d, 0x02, 0xcc, 0x08, + 0x9e, 0xec, 0x98, 0x34, 0xaa, 0xbe, 0x0d, 0xc9, 0x86, 0xd8, 0xb6, 0xc8, 0x46, 0x06, 0x36, 0xc1, + 0x9d, 0xef, 0xca, 0x04, 0xa6, 0x6d, 0x29, 0x4a, 0xbb, 0xe3, 0x46, 0xa4, 0x58, 0x05, 0x99, 0x34, + 0x61, 0x94, 0x76, 0xc7, 0x45, 0x35, 0x98, 0xd5, 0x82, 0x3b, 0xaf, 0x0a, 0x45, 0x4f, 0x0e, 0xcc, + 0x4e, 0x8f, 0xbc, 0x39, 0x5c, 0x99, 0xc0, 0x79, 0xad, 0xab, 0x02, 0x95, 0xc3, 0x97, 0x2c, 0x53, + 0x03, 0x37, 0xe9, 0x7a, 0x2f, 0x78, 0x56, 0x26, 0x42, 0x77, 0x31, 0xd1, 0x9b, 0x30, 0xa5, 0xb3, + 0xcb, 0x7b, 0x42, 0x43, 0xa3, 0x94, 0xa8, 0xeb, 0xbe, 0x64, 0x65, 0x02, 0x0b, 0x0c, 0xf4, 0x00, + 0x66, 0xf8, 0x2f, 0x61, 0x1d, 0xa6, 0x06, 0xee, 0x62, 0xf6, 0x5f, 0x5f, 0xac, 0x4c, 0xe0, 0xac, + 0x1e, 0x40, 0xd1, 0x67, 0x21, 0xe5, 0x68, 0xaa, 0x29, 0xf6, 0xf6, 0x2e, 0x0e, 0xb8, 0xa4, 0x14, + 0x20, 0xb3, 0xd6, 0xe8, 0x31, 0xcc, 0xb1, 0x9d, 0x0c, 0xc5, 0x0d, 0x4e, 0x63, 0x59, 0xa6, 0x7c, + 0xf7, 0x01, 0xb0, 0xef, 0x2d, 0x45, 0x5f, 0xd0, 0xa8, 0x4c, 0x60, 0x79, 0xb7, 0xa7, 0x8a, 0x8a, + 0x8c, 0xb9, 0xbb, 0x21, 0xc2, 0x99, 0x81, 0x22, 0x8b, 0xbc, 0x32, 0x41, 0x45, 0x46, 0xba, 0x2a, + 0xd0, 0x7d, 0xc8, 0xaa, 0xd4, 0xfd, 0x50, 0x58, 0x1a, 0x7a, 0x01, 0x06, 0x6e, 0xd2, 0xf6, 0x65, + 0xc6, 0x57, 0xd8, 0x6d, 0x13, 0x0f, 0x18, 0x10, 0x6a, 0x11, 0xbb, 0x41, 0x0a, 0xd9, 0xe1, 0x84, + 0xc2, 0x47, 0xb8, 0x3e, 0x21, 0x06, 0x44, 0x1b, 0x90, 0xdb, 0xf7, 0xf2, 0x3e, 0xd9, 0xf1, 0xf9, + 0xcc, 0xc0, 0x9d, 0xda, 0x88, 0xbc, 0xd5, 0xca, 0x04, 0x9e, 0xd9, 0x0f, 0x81, 0xd1, 0x32, 0x24, + 0x1a, 0x5a, 0x21, 0xc7, 0x68, 0x5c, 0x18, 0x96, 0x95, 0x59, 0x99, 0xc0, 0x89, 0x86, 0x46, 0x83, + 0x0a, 0x9e, 0x3e, 0x76, 0x68, 0x16, 0xf2, 0x03, 0x8d, 0x4c, 0x77, 0xd2, 0x60, 0x65, 0x02, 0xb3, + 0xd4, 0x3a, 0xfa, 0xbd, 0x6d, 0xc8, 0xdb, 0xfc, 0x0c, 0xdc, 0xcb, 0xf4, 0x90, 0x19, 0x95, 0xeb, + 0xd1, 0xa6, 0xaa, 0x2f, 0xd9, 0xa3, 0x32, 0x81, 0x73, 0x76, 0x18, 0x8e, 0xbe, 0x0a, 0xa7, 0xba, + 0x29, 0x0a, 0xe5, 0x9e, 0xeb, 0xb3, 0x5c, 0xd1, 0x74, 0xbb, 0x75, 0x1c, 0xd9, 0x7d, 0x95, 0xe8, + 0x0d, 0x98, 0xe4, 0x52, 0x43, 0x8c, 0xe4, 0x62, 0xd4, 0x6e, 0x4a, 0xb7, 0xc0, 0x78, 0x7b, 0x3a, + 0xdf, 0x5c, 0x71, 0xf8, 0xab, 0x34, 0xad, 0x46, 0x61, 0x7e, 0xe0, 0x7c, 0xeb, 0x3f, 0xcc, 0xa6, + 0xf3, 0xcd, 0x0d, 0xa0, 0x54, 0xee, 0x36, 0xaf, 0x11, 0x67, 0x85, 0xa7, 0x06, 0xca, 0x3d, 0xe2, + 0x4c, 0x98, 0xca, 0xdd, 0x0e, 0x81, 0x69, 0xd7, 0x6c, 0x7e, 0x2f, 0x50, 0x61, 0xd3, 0xf8, 0xf4, + 0xc0, 0xae, 0xf5, 0xdf, 0x75, 0xa4, 0x5d, 0xb3, 0x03, 0x28, 0x7a, 0x04, 0xb2, 0xb8, 0x00, 0x16, + 0x6c, 0xfc, 0x9c, 0x19, 0xb8, 0xe5, 0x1f, 0x7d, 0xb8, 0x56, 0x99, 0xc0, 0xb3, 0x5a, 0x77, 0x0d, + 0x35, 0x16, 0x8c, 0x9e, 0xa2, 0x05, 0x37, 0xe7, 0x0a, 0x85, 0x81, 0xc6, 0x62, 0xc0, 0x35, 0x3f, + 0x6a, 0x2c, 0xb4, 0x9e, 0x2a, 0xaa, 0xc6, 0x86, 0x69, 0xb8, 0xcc, 0xb0, 0x2f, 0x0c, 0x54, 0xe3, + 0xee, 0x67, 0x09, 0xa8, 0x1a, 0x1b, 0x1c, 0x42, 0xd5, 0xd8, 0x15, 0x07, 0xc9, 0x42, 0x1c, 0x17, + 0x06, 0xaa, 0x71, 0xd4, 0x89, 0x33, 0x55, 0x63, 0x37, 0x0c, 0xa7, 0x6a, 0xcc, 0x0d, 0x44, 0x0f, + 0xdd, 0x97, 0x06, 0xaa, 0xf1, 0xc0, 0x1b, 0x1f, 0x54, 0x8d, 0xd5, 0xbe, 0x4a, 0xb4, 0x4a, 0x3d, + 0x43, 0xea, 0x11, 0x19, 0xe6, 0x9e, 0x55, 0xb8, 0x38, 0x70, 0xfd, 0xe9, 0x3d, 0x4a, 0xae, 0x30, + 0xb7, 0x50, 0xc0, 0xa8, 0x21, 0x63, 0x2e, 0xb2, 0xc2, 0x76, 0x99, 0x0b, 0x8b, 0x03, 0x0d, 0x59, + 0xdf, 0x66, 0x33, 0x35, 0x64, 0x07, 0x3e, 0x90, 0x2e, 0x64, 0x7c, 0xc7, 0xa7, 0xb0, 0x34, 0x62, + 0x67, 0x21, 0xb4, 0x90, 0x71, 0x0c, 0xb4, 0x02, 0x19, 0xea, 0x29, 0x1c, 0x31, 0x33, 0x74, 0x69, + 0xa0, 0x8f, 0xdb, 0x93, 0x1b, 0x5a, 0x99, 0xc0, 0xe9, 0x0f, 0x04, 0x88, 0x7e, 0x9e, 0x87, 0xdd, + 0x85, 0xe2, 0xc0, 0xcf, 0x77, 0x6d, 0xb4, 0xd0, 0xcf, 0x73, 0x0c, 0xa4, 0xc1, 0x69, 0x2e, 0x2b, + 0x71, 0x45, 0xc4, 0x16, 0x77, 0x31, 0x0a, 0x97, 0x19, 0xa9, 0x81, 0x41, 0x6c, 0xe4, 0x75, 0x95, + 0xca, 0x04, 0x9e, 0x57, 0xfb, 0x6b, 0xe9, 0x84, 0x17, 0x4b, 0x0f, 0x0f, 0x7d, 0x0b, 0x57, 0x06, + 0x4e, 0xf8, 0x88, 0xcd, 0x02, 0x3a, 0xe1, 0xd5, 0x10, 0x98, 0x2f, 0x40, 0xba, 0xe2, 0x38, 0xfc, + 0x4c, 0xe2, 0xea, 0x90, 0x05, 0xa8, 0x27, 0x00, 0xe6, 0x0b, 0x90, 0x5e, 0xe3, 0x98, 0x94, 0x90, + 0xd6, 0x24, 0xaa, 0x2d, 0xcc, 0xec, 0xb5, 0x81, 0x84, 0xfa, 0xae, 0xfa, 0x53, 0x42, 0x9a, 0x0f, + 0xa4, 0x0b, 0xb6, 0xed, 0xdd, 0x1c, 0x15, 0xde, 0xe6, 0xf5, 0x81, 0x0b, 0x76, 0xe4, 0x05, 0x57, + 0xba, 0x60, 0xdb, 0x5d, 0x15, 0xe8, 0x0b, 0x30, 0x2d, 0xae, 0xe1, 0x15, 0x6e, 0x0c, 0xf1, 0x81, + 0xc3, 0x51, 0x31, 0x9d, 0xd7, 0x02, 0x87, 0x5b, 0x59, 0x7e, 0x8b, 0x8f, 0x0f, 0xef, 0xe5, 0x21, + 0x56, 0xb6, 0x2f, 0x20, 0xe5, 0x56, 0x36, 0x00, 0x53, 0x2b, 0xcb, 0xf5, 0x54, 0xac, 0x75, 0x37, + 0x07, 0x5a, 0xd9, 0xfe, 0xac, 0x4e, 0x6a, 0x65, 0x3f, 0x08, 0xa0, 0x74, 0x64, 0x0e, 0x0f, 0xc4, + 0x0a, 0xaf, 0x0c, 0x1c, 0x59, 0x77, 0x40, 0x49, 0x47, 0x26, 0x70, 0xa8, 0xd8, 0x78, 0x06, 0x13, + 0xe7, 0xf4, 0xab, 0x03, 0xc5, 0xd6, 0x17, 0xb7, 0x54, 0xbc, 0x67, 0xa0, 0x38, 0x87, 0x7d, 0x43, + 0x65, 0x8b, 0x5b, 0x37, 0x82, 0x53, 0xaf, 0x0d, 0x37, 0x54, 0x51, 0x17, 0x8a, 0x7c, 0x43, 0xd5, + 0x55, 0x59, 0x9a, 0x16, 0xf9, 0x66, 0x0f, 0x52, 0xe9, 0x59, 0x59, 0x7e, 0x90, 0x4a, 0x9f, 0x95, + 0x0b, 0x0f, 0x52, 0xe9, 0x73, 0xf2, 0xc2, 0x83, 0x54, 0xfa, 0xbc, 0x7c, 0xa1, 0xf8, 0xef, 0x67, + 0x21, 0xe7, 0xc5, 0x31, 0x3c, 0x2a, 0xb8, 0x13, 0x8e, 0x0a, 0x2e, 0x0e, 0x8a, 0x0a, 0x44, 0xe4, + 0x23, 0xc2, 0x82, 0x3b, 0xe1, 0xb0, 0xe0, 0xe2, 0xa0, 0xb0, 0x20, 0xc0, 0xa1, 0x71, 0x41, 0x7d, + 0x50, 0x5c, 0xf0, 0xf2, 0x18, 0x71, 0x81, 0x4f, 0xaa, 0x37, 0x30, 0x58, 0xed, 0x0f, 0x0c, 0xae, + 0x0c, 0x0f, 0x0c, 0x7c, 0x52, 0xa1, 0xc8, 0xe0, 0xad, 0x9e, 0xc8, 0xe0, 0xd2, 0x90, 0xc8, 0xc0, + 0xc7, 0xf7, 0x42, 0x83, 0xf5, 0xc8, 0xd0, 0xe0, 0xda, 0xa8, 0xd0, 0xc0, 0xa7, 0xd3, 0x15, 0x1b, + 0xbc, 0xde, 0x15, 0x1b, 0x2c, 0x0e, 0x8c, 0x0d, 0x7c, 0x6c, 0x1e, 0x1c, 0xbc, 0x37, 0x38, 0x38, + 0x78, 0x65, 0xac, 0xe0, 0xc0, 0xa7, 0xd7, 0x1f, 0x1d, 0xd4, 0x07, 0x45, 0x07, 0x2f, 0x8f, 0x11, + 0x1d, 0x04, 0x82, 0xeb, 0x09, 0x0f, 0x2a, 0x51, 0xe1, 0xc1, 0xd5, 0x11, 0xe1, 0x81, 0x4f, 0x2d, + 0x1c, 0x1f, 0x54, 0xa2, 0xe2, 0x83, 0xab, 0x23, 0xe2, 0x83, 0x1e, 0x4a, 0x3c, 0x40, 0xd8, 0x8c, + 0x0e, 0x10, 0xae, 0x8f, 0x0c, 0x10, 0x7c, 0x6a, 0xdd, 0x11, 0xc2, 0xad, 0x50, 0x84, 0xf0, 0xd2, + 0x80, 0x08, 0xc1, 0x47, 0xa5, 0x21, 0xc2, 0x17, 0xfb, 0x42, 0x84, 0xe2, 0xb0, 0x10, 0xc1, 0xc7, + 0xf5, 0x63, 0x84, 0x77, 0x06, 0xc4, 0x08, 0x37, 0x46, 0xc7, 0x08, 0x3e, 0xb1, 0x9e, 0x20, 0x41, + 0x1d, 0x1a, 0x24, 0xbc, 0x36, 0x66, 0x90, 0xe0, 0x53, 0x8f, 0x8a, 0x12, 0x3e, 0xd7, 0x1d, 0x25, + 0x2c, 0x0d, 0x8e, 0x12, 0x7c, 0x32, 0x22, 0x4c, 0x58, 0x8f, 0x0c, 0x13, 0xae, 0x8d, 0x0a, 0x13, + 0x82, 0xb9, 0x17, 0x8e, 0x13, 0x36, 0xa3, 0xe3, 0x84, 0xeb, 0x23, 0xe3, 0x84, 0x40, 0xfc, 0x5d, + 0x81, 0xc2, 0x7a, 0x64, 0xa0, 0x70, 0x6d, 0x54, 0xa0, 0x10, 0x74, 0x2e, 0x1c, 0x29, 0xbc, 0x3b, + 0x30, 0x52, 0xb8, 0x39, 0x4e, 0xa4, 0xe0, 0x13, 0xed, 0x0b, 0x15, 0xde, 0x1b, 0x1c, 0x2a, 0xbc, + 0x32, 0x56, 0xa8, 0x10, 0x98, 0x8e, 0xbe, 0x58, 0xe1, 0x8b, 0x7d, 0xb1, 0x42, 0x71, 0x58, 0xac, + 0x10, 0xe8, 0xb3, 0x17, 0x2c, 0xa8, 0x43, 0x5d, 0xfb, 0xd7, 0xc6, 0x74, 0xed, 0x03, 0xe5, 0x8b, + 0xf0, 0xed, 0xd7, 0x22, 0x7c, 0xfb, 0x2b, 0xc3, 0x7d, 0xfb, 0x60, 0x09, 0x09, 0x9c, 0xfb, 0x4a, + 0x94, 0x73, 0x7f, 0x75, 0x84, 0x73, 0x1f, 0x58, 0xa1, 0x90, 0x77, 0xff, 0x56, 0x8f, 0x77, 0x7f, + 0x69, 0xe4, 0xc1, 0x77, 0xc8, 0xbd, 0x2f, 0xf5, 0xbb, 0xf7, 0x97, 0x87, 0xba, 0xf7, 0x3e, 0x85, + 0xc0, 0xbf, 0x7f, 0xab, 0xc7, 0xbf, 0xbf, 0x34, 0xc4, 0xbf, 0x0f, 0x3a, 0x20, 0x1c, 0x7c, 0x7d, + 0xb8, 0x83, 0xbf, 0x3c, 0xae, 0x83, 0xef, 0x13, 0x8e, 0xf4, 0xf0, 0x37, 0xa3, 0x3d, 0xfc, 0xeb, + 0x63, 0x9e, 0x81, 0xf5, 0xb9, 0xf8, 0x95, 0x28, 0x17, 0xff, 0xea, 0x08, 0x17, 0x3f, 0xbc, 0x86, + 0xf8, 0x3e, 0x7e, 0x25, 0xca, 0xc7, 0xbf, 0x3a, 0xc2, 0xc7, 0x0f, 0x28, 0x85, 0x9c, 0xfc, 0xfa, + 0x20, 0x27, 0xff, 0xe5, 0x31, 0x9c, 0xfc, 0x60, 0xdd, 0xed, 0xf1, 0xf2, 0xdf, 0xee, 0xf5, 0xf2, + 0x8b, 0xc3, 0xbc, 0xfc, 0x60, 0x46, 0x7a, 0x6e, 0xfe, 0x66, 0xb4, 0x9b, 0x7f, 0x7d, 0xa4, 0x9b, + 0x1f, 0x36, 0x92, 0x21, 0x3f, 0x7f, 0x3d, 0xd2, 0xcf, 0xbf, 0x36, 0xca, 0xcf, 0x0f, 0x8c, 0x64, + 0xd8, 0xd1, 0x7f, 0xbb, 0xd7, 0xd1, 0x2f, 0x0e, 0x73, 0xf4, 0x83, 0xc1, 0x79, 0x9e, 0x7e, 0x25, + 0xca, 0xd3, 0xbf, 0x3a, 0xc2, 0xd3, 0x0f, 0x84, 0x17, 0x72, 0xf5, 0xd5, 0xa1, 0xae, 0xfe, 0x6b, + 0x63, 0xba, 0xfa, 0x3d, 0x86, 0xeb, 0xf9, 0x7c, 0xfd, 0x07, 0xa9, 0xf4, 0x05, 0xf9, 0xa5, 0xe2, + 0x5f, 0x4e, 0xc2, 0x54, 0xc5, 0x4b, 0xd0, 0x08, 0x5d, 0x9b, 0x96, 0x5e, 0xe4, 0xda, 0x34, 0x5a, + 0xa5, 0xea, 0xc3, 0x26, 0xa1, 0xf0, 0xfe, 0x87, 0xbc, 0x41, 0xd0, 0x77, 0x44, 0xe6, 0xa1, 0xbe, + 0xc0, 0x9d, 0x10, 0xf4, 0x3a, 0xe4, 0x3a, 0x0e, 0xb1, 0x95, 0xb6, 0x6d, 0x58, 0xb6, 0xe1, 0xf2, + 0x04, 0x44, 0xa9, 0x24, 0x7f, 0x74, 0xbc, 0x38, 0xb3, 0xe3, 0x10, 0x7b, 0x5b, 0xc0, 0xf1, 0x4c, + 0x27, 0x54, 0xf2, 0x5e, 0x11, 0x9e, 0x1c, 0xff, 0x15, 0xe1, 0x77, 0x40, 0xb6, 0x89, 0xaa, 0x77, + 0x2d, 0x87, 0xfc, 0x26, 0x71, 0xf4, 0xca, 0xcd, 0x32, 0x6d, 0xbd, 0x96, 0xec, 0x46, 0xf1, 0xac, + 0xdd, 0x0d, 0x44, 0xb7, 0xe1, 0x74, 0x4b, 0x3d, 0xe4, 0x17, 0xe8, 0x3d, 0x0f, 0x83, 0x25, 0xaa, + 0xa4, 0x59, 0x3e, 0x15, 0x6a, 0xa9, 0x87, 0xec, 0x49, 0x62, 0x5e, 0xc5, 0x1e, 0x23, 0xbc, 0x0a, + 0x79, 0xdd, 0x70, 0x5c, 0xc3, 0xd4, 0xbc, 0xb7, 0x78, 0xf8, 0x95, 0xe3, 0x9c, 0x07, 0xe5, 0x6f, + 0xe2, 0xdc, 0x84, 0x39, 0x91, 0x63, 0x16, 0x3c, 0x52, 0xcc, 0x7c, 0xe9, 0x34, 0xed, 0x05, 0xad, + 0x08, 0xde, 0x94, 0x2e, 0xc3, 0x6c, 0x43, 0x75, 0xc9, 0x81, 0x7a, 0xa4, 0x78, 0xc9, 0xbe, 0x59, + 0xf6, 0x22, 0xc9, 0xf9, 0x93, 0xe3, 0xc5, 0xdc, 0x7d, 0x5e, 0xd5, 0x97, 0xf3, 0x9b, 0x6b, 0x84, + 0x2a, 0x74, 0xb4, 0x02, 0x33, 0xec, 0x9d, 0x35, 0x8b, 0x3f, 0xe7, 0x27, 0x3c, 0xe4, 0x41, 0x67, + 0x18, 0xe2, 0xd1, 0x3f, 0xcc, 0xde, 0x66, 0xf3, 0x5e, 0x00, 0xbc, 0x0e, 0xb3, 0xaa, 0x73, 0x64, + 0x6a, 0x8c, 0xc3, 0xc4, 0x74, 0x3a, 0x0e, 0x73, 0x91, 0xd3, 0x38, 0xcf, 0xc0, 0x65, 0x0f, 0x2a, + 0x9e, 0xf4, 0xf9, 0x2d, 0x09, 0x66, 0xba, 0x12, 0x2f, 0xdf, 0xea, 0x39, 0xaa, 0x3b, 0x17, 0xed, + 0x9e, 0x0f, 0xca, 0x51, 0x4a, 0x0b, 0x09, 0x78, 0x79, 0x13, 0x8b, 0x83, 0xdd, 0x3b, 0x16, 0x20, + 0x7b, 0x99, 0x26, 0x1e, 0xda, 0x9b, 0xa9, 0xdf, 0xf9, 0xee, 0xe2, 0x44, 0xf1, 0x67, 0x49, 0xc8, + 0x75, 0x27, 0x58, 0x56, 0x7b, 0xfa, 0x15, 0x65, 0x12, 0xbb, 0x30, 0x96, 0x87, 0xbc, 0xf4, 0x91, + 0x09, 0x5e, 0x67, 0xe3, 0xdd, 0x5c, 0x1a, 0x72, 0x20, 0x19, 0xee, 0x67, 0x80, 0xb8, 0xf0, 0xa3, + 0x84, 0x3f, 0xf3, 0x97, 0x61, 0x92, 0xbd, 0x8f, 0x2e, 0xba, 0x16, 0x75, 0x5b, 0x64, 0x8d, 0xd6, + 0x63, 0xde, 0x8c, 0x5a, 0x8a, 0xfa, 0x0b, 0x3d, 0xb0, 0xe0, 0x03, 0x5e, 0xe0, 0xfd, 0x6e, 0xf1, + 0xa8, 0xc7, 0xe4, 0xf3, 0x3d, 0xea, 0xc1, 0x0f, 0x1c, 0x9b, 0x4d, 0xa2, 0xb9, 0xe2, 0x99, 0x75, + 0xef, 0x95, 0xee, 0x2b, 0xbd, 0x24, 0xc4, 0xa3, 0xec, 0xcb, 0x58, 0x3c, 0xca, 0x1e, 0x4a, 0x65, + 0xc9, 0xfb, 0x24, 0xd8, 0xc4, 0xe2, 0x09, 0x4f, 0x42, 0xd4, 0x5f, 0x97, 0x40, 0x66, 0xd3, 0xe8, + 0x1e, 0x21, 0x7a, 0x2c, 0x5a, 0xe8, 0x65, 0xd9, 0x24, 0xc6, 0xce, 0xb2, 0x29, 0xaa, 0x90, 0xf7, + 0xfb, 0xc0, 0x9f, 0x2b, 0x1e, 0xf2, 0x3e, 0xc6, 0x0b, 0x5d, 0x3b, 0x2c, 0xfe, 0x9e, 0x04, 0xf3, + 0xfe, 0x37, 0x98, 0x9f, 0xcf, 0xf3, 0xe2, 0x5f, 0x20, 0xef, 0x11, 0xb3, 0xa7, 0xd8, 0x69, 0x9c, + 0xc7, 0xae, 0xa2, 0x8d, 0xa5, 0x41, 0x48, 0x9c, 0x7d, 0x83, 0x88, 0x1f, 0xf5, 0x7a, 0x8d, 0x3d, + 0xd2, 0xce, 0x7f, 0x3b, 0xc5, 0x7b, 0x21, 0x0e, 0x30, 0x65, 0xa5, 0xc3, 0x1c, 0x4b, 0xab, 0xbd, + 0x61, 0xb2, 0xc6, 0xc5, 0xbf, 0x91, 0xc2, 0x84, 0x9e, 0x52, 0xbf, 0xe1, 0x2e, 0x24, 0x9f, 0xaa, + 0xcd, 0x61, 0x47, 0xff, 0x5d, 0xac, 0xc7, 0xb4, 0x35, 0xba, 0x07, 0xfc, 0x3a, 0x0e, 0xbf, 0x4c, + 0x90, 0x18, 0x1c, 0xdc, 0xf5, 0xb3, 0x14, 0x87, 0x30, 0xd1, 0x1b, 0xde, 0x28, 0x92, 0xa3, 0x3f, + 0x1f, 0x9e, 0xa4, 0x6f, 0xa6, 0x3e, 0xfc, 0xee, 0xa2, 0x74, 0xb3, 0x06, 0xf3, 0x11, 0x8b, 0x10, + 0xca, 0x03, 0x94, 0xb7, 0x36, 0x6b, 0xd5, 0x5a, 0x7d, 0x6d, 0xb3, 0xee, 0xbd, 0x04, 0xbf, 0xb2, + 0xaa, 0xec, 0x6c, 0x96, 0xb7, 0x36, 0x36, 0xaa, 0xf5, 0xfa, 0xda, 0xaa, 0x2c, 0x21, 0x19, 0x66, + 0xaa, 0x9b, 0xa1, 0x76, 0xe2, 0x01, 0xf8, 0x9b, 0x3f, 0x07, 0x10, 0x3c, 0x94, 0x49, 0x69, 0xad, + 0xaf, 0x3d, 0x56, 0x1e, 0xad, 0x3c, 0xdc, 0x59, 0xab, 0xc9, 0x13, 0x08, 0x41, 0xbe, 0xb4, 0x52, + 0x2f, 0x57, 0x14, 0xbc, 0x56, 0xdb, 0xde, 0xda, 0xac, 0xad, 0xc9, 0x92, 0xc0, 0xdb, 0x80, 0x6c, + 0xe8, 0x6d, 0x0d, 0xda, 0x70, 0x7b, 0xa7, 0x56, 0x51, 0xea, 0xd5, 0x8d, 0xb5, 0x5a, 0x7d, 0x65, + 0x63, 0x5b, 0x9e, 0xa0, 0xc4, 0x18, 0x6c, 0xa5, 0xb4, 0x85, 0xeb, 0xb2, 0xe4, 0x97, 0xeb, 0x5b, + 0x3b, 0xe5, 0x8a, 0xff, 0x02, 0x7d, 0x2a, 0x9d, 0x94, 0x93, 0x37, 0x2d, 0x38, 0x1d, 0x79, 0x5d, + 0x09, 0x65, 0x61, 0x7a, 0xc7, 0x64, 0x2f, 0x35, 0xc8, 0x13, 0x28, 0x17, 0xba, 0xb1, 0x24, 0x4b, + 0x28, 0xcd, 0xef, 0xa5, 0xc8, 0x09, 0x34, 0x05, 0x89, 0xda, 0x5d, 0x39, 0x89, 0x66, 0x21, 0x1b, + 0xba, 0xf6, 0x23, 0xa7, 0x50, 0x46, 0xdc, 0x96, 0x90, 0x27, 0xd1, 0x4c, 0x70, 0x5d, 0x41, 0x9e, + 0xba, 0x79, 0x09, 0x42, 0xd9, 0xdc, 0x08, 0x60, 0xea, 0xa1, 0xea, 0x12, 0xc7, 0x95, 0x27, 0xd0, + 0x34, 0x24, 0x57, 0x9a, 0x4d, 0x59, 0xba, 0xf3, 0x03, 0x09, 0xd2, 0xde, 0xa3, 0x7a, 0xe8, 0x21, + 0x4c, 0xf2, 0xa0, 0x6d, 0x71, 0xb0, 0xb1, 0x67, 0xf6, 0x62, 0x61, 0x69, 0xd4, 0x6a, 0x50, 0x9c, + 0x40, 0xef, 0x8a, 0x7f, 0x01, 0x41, 0x25, 0x8d, 0x2e, 0x0f, 0xd3, 0x03, 0x8f, 0xea, 0x70, 0x65, + 0xa1, 0xba, 0x5d, 0x9c, 0xf8, 0x8c, 0x54, 0xba, 0xf4, 0xe1, 0xbf, 0x5c, 0x9c, 0xf8, 0xf0, 0xe4, + 0xa2, 0xf4, 0x93, 0x93, 0x8b, 0xd2, 0x3f, 0x9e, 0x5c, 0x94, 0xfe, 0xf9, 0xe4, 0xa2, 0xf4, 0xeb, + 0xff, 0x7a, 0x71, 0xe2, 0xbd, 0x69, 0x81, 0xb5, 0x3b, 0xc5, 0xfe, 0x0b, 0xc5, 0xdd, 0xff, 0x09, + 0x00, 0x00, 0xff, 0xff, 0xe7, 0x79, 0x12, 0xc1, 0x8a, 0x63, 0x00, 0x00, } diff --git a/pkg/roachpb/api.proto b/pkg/roachpb/api.proto index 21ec4de28c75..14bc77196de6 100644 --- a/pkg/roachpb/api.proto +++ b/pkg/roachpb/api.proto @@ -734,15 +734,23 @@ message PushTxnRequest { // up-to-date value of the transaction record, but will be set or // merged as appropriate. storage.engine.enginepb.TxnMeta pushee_txn = 3 [(gogoproto.nullable) = false]; - // PushTo is the timestamp just after which PusheeTxn is attempted to be - // pushed. During conflict resolution, it should be set to the timestamp - // of the its conflicting write. + // PushTo is the timestamp which PusheeTxn should be pushed to. During + // conflict resolution, it should be set just after the timestamp of the + // conflicting read or write. util.hlc.Timestamp push_to = 4 [(gogoproto.nullable) = false]; - // Now holds the timestamp used to compare the last heartbeat of the pushee - // against. This is necessary since the request header's timestamp does not - // necessarily advance with the node clock across retries and hence cannot - // detect abandoned transactions. - util.hlc.Timestamp now = 5 [(gogoproto.nullable) = false]; + // InclusivePushTo is sent by nodes to specify that their PushTo timestamp + // is the timestamp they want the transaction to be pushed to, instead of + // the timestamp before the one they want the transaction to be pushed to. + // It is used to assist that field's migration. + // TODO(nvanbenschoten): Remove this field in 19.2. + bool inclusive_push_to = 9; + // DeprecatedNow holds the timestamp used to compare the last heartbeat of the + // pushee against. + // + // The field remains for compatibility with 2.1 nodes. Users should set the + // same value for this field and the batch header timestamp. + // TODO(nvanbenschoten): Remove this field in 19.2. + util.hlc.Timestamp deprecated_now = 5 [(gogoproto.nullable) = false]; // Readers set this to PUSH_TIMESTAMP to move pushee_txn's provisional // commit timestamp forward. Writers set this to PUSH_ABORT to request // that pushee_txn be aborted if possible. Inconsistent readers set diff --git a/pkg/settings/cluster/cockroach_versions.go b/pkg/settings/cluster/cockroach_versions.go index 58aa4b307c8c..c5bcc0baa0d5 100644 --- a/pkg/settings/cluster/cockroach_versions.go +++ b/pkg/settings/cluster/cockroach_versions.go @@ -65,6 +65,7 @@ const ( VersionCreateStats VersionDirectImport VersionSideloadedStorageNoReplicaID // see versionsSingleton for details + VersionPushTxnToInclusive // Add new versions here (step one of two). @@ -415,6 +416,7 @@ var versionsSingleton = keyedVersions([]keyedVersion{ Version: roachpb.Version{Major: 2, Minor: 1, Unstable: 7}, }, { + // VersionDirectImport is https://github.com/cockroachdb/cockroach/pull/34751. Key: VersionDirectImport, Version: roachpb.Version{Major: 2, Minor: 1, Unstable: 8}, }, @@ -436,6 +438,11 @@ var versionsSingleton = keyedVersions([]keyedVersion{ Key: VersionSideloadedStorageNoReplicaID, Version: roachpb.Version{Major: 2, Minor: 1, Unstable: 9}, }, + { + // VersionPushTxnToInclusive is https://github.com/cockroachdb/cockroach/pull/35297. + Key: VersionPushTxnToInclusive, + Version: roachpb.Version{Major: 2, Minor: 1, Unstable: 10}, + }, // Add new versions here (step two of two). diff --git a/pkg/storage/batcheval/cmd_push_txn.go b/pkg/storage/batcheval/cmd_push_txn.go index ea0b3c31f524..03bdbbb57b01 100644 --- a/pkg/storage/batcheval/cmd_push_txn.go +++ b/pkg/storage/batcheval/cmd_push_txn.go @@ -110,8 +110,14 @@ func PushTxn( if h.Txn != nil { return result.Result{}, ErrTransactionUnsupported } - if args.Now == (hlc.Timestamp{}) { - return result.Result{}, errors.Errorf("the field Now must be provided") + + // Verify that the PushTxn's timestamp is not less than the timestamp that + // the request intends to push the transaction to. Transactions should not + // be pushed into the future or their effect may not be fully reflected in + // a future leaseholder's timestamp cache. This is analogous to how reads + // should not be performed at a timestamp in the future. + if h.Timestamp.Less(args.PushTo) { + return result.Result{}, errors.Errorf("PushTo %s larger than PushRequest header timestamp %s", args.PushTo, h.Timestamp) } if !bytes.Equal(args.Key, args.PusheeTxn.Key) { @@ -183,7 +189,7 @@ func PushTxn( // If we're trying to move the timestamp forward, and it's already // far enough forward, return success. - if args.PushType == roachpb.PUSH_TIMESTAMP && args.PushTo.Less(reply.PusheeTxn.Timestamp) { + if args.PushType == roachpb.PUSH_TIMESTAMP && !reply.PusheeTxn.Timestamp.Less(args.PushTo) { // Trivial noop. return result.Result{}, nil } @@ -199,7 +205,7 @@ func PushTxn( var reason string switch { - case txnwait.IsExpired(args.Now, &reply.PusheeTxn): + case txnwait.IsExpired(h.Timestamp, &reply.PusheeTxn): reason = "pushee is expired" // When cleaning up, actually clean up (as opposed to simply pushing // the garbage in the path of future writers). @@ -243,16 +249,18 @@ func PushTxn( case roachpb.PUSH_ABORT: // If aborting the transaction, set the new status. reply.PusheeTxn.Status = roachpb.ABORTED - // Forward the timestamp to accommodate AbortSpan GC. See method - // comment for details. - reply.PusheeTxn.Timestamp.Forward(reply.PusheeTxn.LastActive()) + // If the transaction record was already present, forward the timestamp + // to accommodate AbortSpan GC. See method comment for details. + if ok { + reply.PusheeTxn.Timestamp.Forward(reply.PusheeTxn.LastActive()) + } case roachpb.PUSH_TIMESTAMP: // Otherwise, update timestamp to be one greater than the request's // timestamp. This new timestamp will be use to update the read // timestamp cache. If the transaction record was not already present // then we rely on the read timestamp cache to prevent the record from // ever being written with a timestamp beneath this timestamp. - reply.PusheeTxn.Timestamp = args.PushTo.Next() + reply.PusheeTxn.Timestamp.Forward(args.PushTo) default: return result.Result{}, errors.Errorf("unexpected push type: %v", args.PushType) } diff --git a/pkg/storage/client_split_test.go b/pkg/storage/client_split_test.go index dd5fa5f2ca64..1a792d93acce 100644 --- a/pkg/storage/client_split_test.go +++ b/pkg/storage/client_split_test.go @@ -2536,12 +2536,12 @@ func TestDistributedTxnCleanup(t *testing.T) { // normal or min priority txn. if force { ba := roachpb.BatchRequest{} + ba.Timestamp = store.Clock().Now() ba.RangeID = lhs.RangeID ba.Add(&roachpb.PushTxnRequest{ RequestHeader: roachpb.RequestHeader{ Key: proto.Key, }, - Now: store.Clock().Now(), PusheeTxn: proto.TxnMeta, PushType: roachpb.PUSH_ABORT, Force: true, diff --git a/pkg/storage/intentresolver/contention_queue.go b/pkg/storage/intentresolver/contention_queue.go index bab0d2754c56..0593e9597974 100644 --- a/pkg/storage/intentresolver/contention_queue.go +++ b/pkg/storage/intentresolver/contention_queue.go @@ -257,18 +257,20 @@ func (cq *contentionQueue) add( log.VEventf(ctx, 3, "%s at front of queue; breaking from loop", txnID(curPusher.txn)) break Loop } - pushReq := &roachpb.PushTxnRequest{ + + b := &client.Batch{} + b.Header.Timestamp = cq.clock.Now() + b.AddRawRequest(&roachpb.PushTxnRequest{ RequestHeader: roachpb.RequestHeader{ Key: pusheeTxn.Key, }, - PusherTxn: getPusherTxn(h), - PusheeTxn: *pusheeTxn, - PushTo: h.Timestamp, - Now: cq.clock.Now(), - PushType: roachpb.PUSH_ABORT, - } - b := &client.Batch{} - b.AddRawRequest(pushReq) + PusherTxn: getPusherTxn(h), + PusheeTxn: *pusheeTxn, + PushTo: h.Timestamp.Next(), + InclusivePushTo: true, + DeprecatedNow: b.Header.Timestamp, + PushType: roachpb.PUSH_ABORT, + }) log.VEventf(ctx, 3, "%s pushing %s to detect dependency cycles", txnID(curPusher.txn), pusheeTxn.ID.Short()) if err := cq.db.Run(ctx, b); err != nil { log.VErrEventf(ctx, 2, "while waiting in push contention queue to push %s: %s", pusheeTxn.ID.Short(), b.MustPErr()) diff --git a/pkg/storage/intentresolver/intent_resolver.go b/pkg/storage/intentresolver/intent_resolver.go index 5663f40ce029..d62b4b39580f 100644 --- a/pkg/storage/intentresolver/intent_resolver.go +++ b/pkg/storage/intentresolver/intent_resolver.go @@ -422,38 +422,29 @@ func (ir *IntentResolver) MaybePushTransactions( return nil, nil } + pusherTxn := getPusherTxn(h) log.Eventf(ctx, "pushing %d transaction(s)", len(pushTxns)) // Attempt to push the transaction(s). - now := ir.clock.Now() - pusherTxn := getPusherTxn(h) - var pushReqs []roachpb.Request + b := &client.Batch{} + b.Header.Timestamp = ir.clock.Now() for _, pushTxn := range pushTxns { - pushReqs = append(pushReqs, &roachpb.PushTxnRequest{ + b.AddRawRequest(&roachpb.PushTxnRequest{ RequestHeader: roachpb.RequestHeader{ Key: pushTxn.Key, }, - PusherTxn: pusherTxn, - PusheeTxn: pushTxn, - PushTo: h.Timestamp, - // The timestamp is used by PushTxn for figuring out whether the - // transaction is abandoned. If we used the argument's timestamp - // here, we would run into busy loops because that timestamp - // usually stays fixed among retries, so it will never realize - // that a transaction has timed out. See #877. - Now: now, - PushType: pushType, + PusherTxn: pusherTxn, + PusheeTxn: pushTxn, + PushTo: h.Timestamp.Next(), + InclusivePushTo: true, + DeprecatedNow: b.Header.Timestamp, + PushType: pushType, }) } - b := &client.Batch{} - b.AddRawRequest(pushReqs...) - var pErr *roachpb.Error - if err := ir.db.Run(ctx, b); err != nil { - pErr = b.MustPErr() - } + err := ir.db.Run(ctx, b) cleanupInFlightPushes() - if pErr != nil { - return nil, pErr + if err != nil { + return nil, b.MustPErr() } br := b.RawResponse() @@ -461,7 +452,7 @@ func (ir *IntentResolver) MaybePushTransactions( for _, resp := range br.Responses { txn := resp.GetInner().(*roachpb.PushTxnResponse).PusheeTxn if _, ok := pushedTxns[txn.ID]; ok { - log.Fatalf(ctx, "have two PushTxn responses for %s\nreqs: %+v", txn.ID, pushReqs) + log.Fatalf(ctx, "have two PushTxn responses for %s", txn.ID) } pushedTxns[txn.ID] = txn log.Eventf(ctx, "%s is now %s", txn.ID, txn.Status) @@ -699,14 +690,16 @@ func (ir *IntentResolver) CleanupTxnIntentsOnGCAsync( return } b := &client.Batch{} + b.Header.Timestamp = now b.AddRawRequest(&roachpb.PushTxnRequest{ RequestHeader: roachpb.RequestHeader{Key: txn.Key}, PusherTxn: roachpb.Transaction{ TxnMeta: enginepb.TxnMeta{Priority: roachpb.MaxTxnPriority}, }, - PusheeTxn: txn.TxnMeta, - Now: now, - PushType: roachpb.PUSH_ABORT, + PusheeTxn: txn.TxnMeta, + DeprecatedNow: b.Header.Timestamp, + PushType: roachpb.PUSH_ABORT, + InclusivePushTo: true, }) pushed = true if err := ir.db.Run(ctx, b); err != nil { diff --git a/pkg/storage/replica.go b/pkg/storage/replica.go index 85044f138fc3..acb212dc2359 100644 --- a/pkg/storage/replica.go +++ b/pkg/storage/replica.go @@ -1372,29 +1372,32 @@ func (r *Replica) maybeWatchForMerge(ctx context.Context) error { // roachpb.PUSH_TOUCH, though it might appear more semantically correct, // returns immediately and causes us to spin hot, whereas // roachpb.PUSH_ABORT efficiently blocks until the transaction completes. - res, pErr := client.SendWrapped(ctx, r.DB().NonTransactionalSender(), &roachpb.PushTxnRequest{ + b := &client.Batch{} + b.Header.Timestamp = r.Clock().Now() + b.AddRawRequest(&roachpb.PushTxnRequest{ RequestHeader: roachpb.RequestHeader{Key: intent.Txn.Key}, PusherTxn: roachpb.Transaction{ TxnMeta: enginepb.TxnMeta{Priority: roachpb.MinTxnPriority}, }, - PusheeTxn: intent.Txn, - Now: r.Clock().Now(), - PushType: roachpb.PUSH_ABORT, + PusheeTxn: intent.Txn, + DeprecatedNow: b.Header.Timestamp, + PushType: roachpb.PUSH_ABORT, + InclusivePushTo: true, }) - if pErr != nil { + if err := r.DB().Run(ctx, b); err != nil { select { case <-r.store.stopper.ShouldQuiesce(): // The server is shutting down. The error while pushing the // transaction was probably caused by the shutdown, so ignore it. return default: - log.Warningf(ctx, "error while watching for merge to complete: PushTxn: %s", pErr) + log.Warningf(ctx, "error while watching for merge to complete: PushTxn: %s", err) // We can't safely unblock traffic until we can prove that the merge // transaction is committed or aborted. Nothing to do but try again. continue } } - pushTxnRes = res.(*roachpb.PushTxnResponse) + pushTxnRes = b.RawResponse().Responses[0].GetInner().(*roachpb.PushTxnResponse) break } diff --git a/pkg/storage/replica_test.go b/pkg/storage/replica_test.go index 4dca107ae969..621e4faba05b 100644 --- a/pkg/storage/replica_test.go +++ b/pkg/storage/replica_test.go @@ -292,6 +292,7 @@ func (tc *testContext) Sender() client.Sender { tc.Fatal(err) } } + tc.Clock().Update(ba.Timestamp) return ba }) } @@ -1572,8 +1573,7 @@ func pushTxnArgs( RequestHeader: roachpb.RequestHeader{ Key: pushee.Key, }, - Now: pusher.Timestamp, - PushTo: pusher.Timestamp, + PushTo: pusher.Timestamp.Next(), PusherTxn: *pusher, PusheeTxn: pushee.TxnMeta, PushType: pushType, @@ -3227,7 +3227,6 @@ func TestSerializableDeadline(t *testing.T) { pusher := newTransaction( "test pusher", key, roachpb.MaxUserPriority, tc.Clock()) pushReq := pushTxnArgs(pusher, txn, roachpb.PUSH_TIMESTAMP) - pushReq.Now = tc.Clock().Now() resp, pErr := tc.SendWrapped(&pushReq) if pErr != nil { t.Fatal(pErr) @@ -3281,7 +3280,6 @@ func TestTxnRecordUnderTxnSpanGCThreshold(t *testing.T) { // will be aborted before it even tries. pushee := newTransaction("pushee", key, 1, tc.Clock()) pushReq := pushTxnArgs(pusher, pushee, roachpb.PUSH_ABORT) - pushReq.Now = tc.Clock().Now() pushReq.Force = true resp, pErr := tc.SendWrapped(&pushReq) if pErr != nil { @@ -4844,7 +4842,10 @@ func TestPushTxnUpgradeExistingTxn(t *testing.T) { pushee.Timestamp = test.ts args := pushTxnArgs(pusher, pushee, roachpb.PUSH_ABORT) - resp, pErr := tc.SendWrapped(&args) + // Set header timestamp to the maximum of the pusher and pushee timestamps. + h := roachpb.Header{Timestamp: args.PushTo} + h.Timestamp.Forward(pushee.Timestamp) + resp, pErr := tc.SendWrappedWith(h, &args) if pErr != nil { t.Fatal(pErr) } @@ -4992,10 +4993,9 @@ func TestPushTxnHeartbeatTimeout(t *testing.T) { // Now, attempt to push the transaction with Now set to the txn start time + offset. args := pushTxnArgs(pusher, pushee, test.pushType) - args.Now = pushee.OrigTimestamp.Add(test.timeOffset, 0) - args.PushTo = args.Now + args.PushTo = pushee.OrigTimestamp.Add(test.timeOffset, 0) - reply, pErr := tc.SendWrapped(&args) + reply, pErr := tc.SendWrappedWith(roachpb.Header{Timestamp: args.PushTo}, &args) if test.expSuccess != (pErr == nil) { t.Fatalf("%d: expSuccess=%t; got pErr %s, args=%+v, reply=%+v", i, @@ -5035,21 +5035,23 @@ func TestResolveIntentPushTxnReplyTxn(t *testing.T) { var rra roachpb.ResolveIntentRangeRequest ctx := context.Background() + h := roachpb.Header{Txn: txn, Timestamp: tc.Clock().Now()} // Should not be able to push or resolve in a transaction. - if _, err := batcheval.PushTxn(ctx, b, batcheval.CommandArgs{Stats: &ms, Header: roachpb.Header{Txn: txn}, Args: &pa}, &roachpb.PushTxnResponse{}); !testutils.IsError(err, batcheval.ErrTransactionUnsupported.Error()) { + if _, err := batcheval.PushTxn(ctx, b, batcheval.CommandArgs{Stats: &ms, Header: h, Args: &pa}, &roachpb.PushTxnResponse{}); !testutils.IsError(err, batcheval.ErrTransactionUnsupported.Error()) { t.Fatalf("transactional PushTxn returned unexpected error: %v", err) } - if _, err := batcheval.ResolveIntent(ctx, b, batcheval.CommandArgs{Stats: &ms, Header: roachpb.Header{Txn: txn}, Args: &ra}, &roachpb.ResolveIntentResponse{}); !testutils.IsError(err, batcheval.ErrTransactionUnsupported.Error()) { + if _, err := batcheval.ResolveIntent(ctx, b, batcheval.CommandArgs{Stats: &ms, Header: h, Args: &ra}, &roachpb.ResolveIntentResponse{}); !testutils.IsError(err, batcheval.ErrTransactionUnsupported.Error()) { t.Fatalf("transactional ResolveIntent returned unexpected error: %v", err) } - if _, err := batcheval.ResolveIntentRange(ctx, b, batcheval.CommandArgs{Stats: &ms, Header: roachpb.Header{Txn: txn}, Args: &rra}, &roachpb.ResolveIntentRangeResponse{}); !testutils.IsError(err, batcheval.ErrTransactionUnsupported.Error()) { + if _, err := batcheval.ResolveIntentRange(ctx, b, batcheval.CommandArgs{Stats: &ms, Header: h, Args: &rra}, &roachpb.ResolveIntentRangeResponse{}); !testutils.IsError(err, batcheval.ErrTransactionUnsupported.Error()) { t.Fatalf("transactional ResolveIntentRange returned unexpected error: %v", err) } // Should not get a transaction back from PushTxn. It used to erroneously // return args.PusherTxn. + h = roachpb.Header{Timestamp: tc.Clock().Now()} var reply roachpb.PushTxnResponse - if _, err := batcheval.PushTxn(ctx, b, batcheval.CommandArgs{EvalCtx: tc.repl, Stats: &ms, Args: &pa}, &reply); err != nil { + if _, err := batcheval.PushTxn(ctx, b, batcheval.CommandArgs{EvalCtx: tc.repl, Stats: &ms, Header: h, Args: &pa}, &reply); err != nil { t.Fatal(err) } else if reply.Txn != nil { t.Fatalf("expected nil response txn, but got %s", reply.Txn) @@ -5121,7 +5123,10 @@ func TestPushTxnPriorities(t *testing.T) { // Now, attempt to push the transaction with intent epoch set appropriately. args := pushTxnArgs(pusher, pushee, test.pushType) - _, pErr := tc.SendWrapped(&args) + // Set header timestamp to the maximum of the pusher and pushee timestamps. + h := roachpb.Header{Timestamp: args.PushTo} + h.Timestamp.Forward(pushee.Timestamp) + _, pErr := tc.SendWrappedWith(h, &args) if test.expSuccess != (pErr == nil) { t.Errorf("expected success on trial %d? %t; got err %s", i, test.expSuccess, pErr) @@ -5162,9 +5167,9 @@ func TestPushTxnPushTimestamp(t *testing.T) { // Now, push the transaction using a PUSH_TIMESTAMP push request. args := pushTxnArgs(pusher, pushee, roachpb.PUSH_TIMESTAMP) - resp, pErr := tc.SendWrapped(&args) + resp, pErr := tc.SendWrappedWith(roachpb.Header{Timestamp: args.PushTo}, &args) if pErr != nil { - t.Errorf("unexpected error on push: %s", pErr) + t.Fatalf("unexpected error on push: %s", pErr) } expTS := pusher.Timestamp expTS.Logical++ @@ -5204,9 +5209,9 @@ func TestPushTxnPushTimestampAlreadyPushed(t *testing.T) { // Now, push the transaction using a PUSH_TIMESTAMP push request. args := pushTxnArgs(pusher, pushee, roachpb.PUSH_TIMESTAMP) - resp, pErr := tc.SendWrapped(&args) + resp, pErr := tc.SendWrappedWith(roachpb.Header{Timestamp: args.PushTo}, &args) if pErr != nil { - t.Errorf("unexpected pError on push: %s", pErr) + t.Fatalf("unexpected pError on push: %s", pErr) } reply := resp.(*roachpb.PushTxnResponse) if reply.PusheeTxn.Timestamp != pushee.Timestamp { @@ -8247,7 +8252,6 @@ func TestNoopRequestsNotProposed(t *testing.T) { Key: txn.TxnMeta.Key, }, PusheeTxn: txn.TxnMeta, - Now: cfg.Clock.Now(), PushType: roachpb.PUSH_ABORT, Force: true, } @@ -10276,7 +10280,6 @@ func TestCreateTxnRecord(t *testing.T) { setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_TIMESTAMP) pt.PushTo = now - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, _ hlc.Timestamp) error { @@ -10285,7 +10288,7 @@ func TestCreateTxnRecord(t *testing.T) { }, expTxn: func(txn *roachpb.Transaction, now hlc.Timestamp) roachpb.TransactionRecord { record := txn.AsRecord() - record.Timestamp.Forward(now.Add(0, 1)) + record.Timestamp.Forward(now) return record }, }, @@ -10294,7 +10297,6 @@ func TestCreateTxnRecord(t *testing.T) { setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_TIMESTAMP) pt.PushTo = now - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, now hlc.Timestamp) error { @@ -10303,7 +10305,7 @@ func TestCreateTxnRecord(t *testing.T) { }, expTxn: func(txn *roachpb.Transaction, now hlc.Timestamp) roachpb.TransactionRecord { record := txn.AsRecord() - record.Timestamp.Forward(now.Add(0, 1)) + record.Timestamp.Forward(now) record.LastHeartbeat.Forward(now.Add(0, 5)) return record }, @@ -10313,7 +10315,6 @@ func TestCreateTxnRecord(t *testing.T) { setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_TIMESTAMP) pt.PushTo = now - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, _ hlc.Timestamp) error { @@ -10329,7 +10330,6 @@ func TestCreateTxnRecord(t *testing.T) { setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_TIMESTAMP) pt.PushTo = now - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, _ hlc.Timestamp) error { @@ -10345,7 +10345,6 @@ func TestCreateTxnRecord(t *testing.T) { name: "begin transaction after push abort", setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_ABORT) - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, _ hlc.Timestamp) error { @@ -10359,7 +10358,6 @@ func TestCreateTxnRecord(t *testing.T) { name: "heartbeat transaction after push abort", setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_ABORT) - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, now hlc.Timestamp) error { @@ -10373,7 +10371,6 @@ func TestCreateTxnRecord(t *testing.T) { name: "heartbeat transaction after push abort and restart", setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_ABORT) - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, now hlc.Timestamp) error { @@ -10393,7 +10390,6 @@ func TestCreateTxnRecord(t *testing.T) { name: "end transaction (abort) after push abort", setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_ABORT) - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, _ hlc.Timestamp) error { @@ -10408,7 +10404,6 @@ func TestCreateTxnRecord(t *testing.T) { name: "end transaction (commit) after push abort", setup: func(txn *roachpb.Transaction, now hlc.Timestamp) error { pt := pushTxnArgs(pusher, txn, roachpb.PUSH_ABORT) - pt.Now = now return sendWrappedWithErr(roachpb.Header{}, &pt) }, run: func(txn *roachpb.Transaction, _ hlc.Timestamp) error { diff --git a/pkg/storage/replica_tscache.go b/pkg/storage/replica_tscache.go index 2cd15737978d..577d712e2286 100644 --- a/pkg/storage/replica_tscache.go +++ b/pkg/storage/replica_tscache.go @@ -16,9 +16,12 @@ package storage import ( "context" + "fmt" "github.com/cockroachdb/cockroach/pkg/keys" "github.com/cockroachdb/cockroach/pkg/roachpb" + "github.com/cockroachdb/cockroach/pkg/storage/tscache" + "github.com/cockroachdb/cockroach/pkg/util" "github.com/cockroachdb/cockroach/pkg/util/hlc" "github.com/cockroachdb/cockroach/pkg/util/uuid" ) @@ -29,7 +32,10 @@ import ( func (r *Replica) updateTimestampCache( ba *roachpb.BatchRequest, br *roachpb.BatchResponse, pErr *roachpb.Error, ) { - tc := r.store.tsCache + addToTSCache := r.store.tsCache.Add + if util.RaceEnabled { + addToTSCache = checkedTSCacheUpdate(r.store.Clock().Now(), r.store.tsCache, ba, br, pErr) + } // Update the timestamp cache using the timestamp at which the batch // was executed. Note this may have moved forward from ba.Timestamp, // as when the request is retried locally on WriteTooOldErrors. @@ -66,7 +72,7 @@ func (r *Replica) updateTimestampCache( // to or greater than the transaction's OrigTimestamp, // which is consulted in CanCreateTxnRecord. key := keys.TransactionKey(start, txnID) - tc.Add(key, nil, ts, txnID, false /* readCache */) + addToTSCache(key, nil, ts, txnID, false /* readCache */) case *roachpb.PushTxnRequest: // A successful PushTxn request bumps the timestamp cache for // the pushee's transaction key. The pushee will consult the @@ -80,16 +86,6 @@ func (r *Replica) updateTimestampCache( // creation of the transaction record entirely. pushee := br.Responses[i].GetInner().(*roachpb.PushTxnResponse).PusheeTxn - // Update the local clock to the pushee's new timestamp. This - // ensures that we can safely update the timestamp cache based - // on this value. The pushee's timestamp is not reflected in - // the batch request's or response's timestamp. - // TODO(nvanbenschoten): there are some concerns that this is - // incorrect because this pushee.Timestamp was not accounted - // for in the local clock before this request's lease check. - // Do something about it. - r.store.Clock().Update(pushee.Timestamp) - var readCache bool switch pushee.Status { case roachpb.PENDING: @@ -102,7 +98,7 @@ func (r *Replica) updateTimestampCache( continue } key := keys.TransactionKey(start, pushee.ID) - tc.Add(key, nil, pushee.Timestamp, t.PusherTxn.ID, readCache) + addToTSCache(key, nil, pushee.Timestamp, t.PusherTxn.ID, readCache) case *roachpb.ConditionalPutRequest: if pErr != nil { // ConditionalPut still updates on ConditionFailedErrors. @@ -110,7 +106,7 @@ func (r *Replica) updateTimestampCache( continue } } - tc.Add(start, end, ts, txnID, true /* readCache */) + addToTSCache(start, end, ts, txnID, true /* readCache */) case *roachpb.InitPutRequest: if pErr != nil { // InitPut still updates on ConditionFailedErrors. @@ -118,7 +114,7 @@ func (r *Replica) updateTimestampCache( continue } } - tc.Add(start, end, ts, txnID, true /* readCache */) + addToTSCache(start, end, ts, txnID, true /* readCache */) case *roachpb.ScanRequest: resp := br.Responses[i].GetInner().(*roachpb.ScanResponse) if resp.ResumeSpan != nil { @@ -127,7 +123,7 @@ func (r *Replica) updateTimestampCache( // end key for the span to update the timestamp cache. end = resp.ResumeSpan.Key } - tc.Add(start, end, ts, txnID, true /* readCache */) + addToTSCache(start, end, ts, txnID, true /* readCache */) case *roachpb.ReverseScanRequest: resp := br.Responses[i].GetInner().(*roachpb.ReverseScanResponse) if resp.ResumeSpan != nil { @@ -137,7 +133,7 @@ func (r *Replica) updateTimestampCache( // the span to update the timestamp cache. start = resp.ResumeSpan.EndKey } - tc.Add(start, end, ts, txnID, true /* readCache */) + addToTSCache(start, end, ts, txnID, true /* readCache */) case *roachpb.QueryIntentRequest: if t.IfMissing == roachpb.QueryIntentRequest_PREVENT { resp := br.Responses[i].GetInner().(*roachpb.QueryIntentResponse) @@ -150,16 +146,35 @@ func (r *Replica) updateTimestampCache( // transaction ID so that we block the intent regardless // of whether it is part of the current batch's transaction // or not. - tc.Add(start, end, t.Txn.Timestamp, uuid.UUID{}, true /* readCache */) + addToTSCache(start, end, t.Txn.Timestamp, uuid.UUID{}, true /* readCache */) } } default: - tc.Add(start, end, ts, txnID, !roachpb.UpdatesWriteTimestampCache(args)) + addToTSCache(start, end, ts, txnID, !roachpb.UpdatesWriteTimestampCache(args)) } } } } +// checkedTSCacheUpdate wraps tscache.Cache and asserts that any update to the +// cache is at or below the specified time. +func checkedTSCacheUpdate( + now hlc.Timestamp, + tc tscache.Cache, + ba *roachpb.BatchRequest, + br *roachpb.BatchResponse, + pErr *roachpb.Error, +) func(roachpb.Key, roachpb.Key, hlc.Timestamp, uuid.UUID, bool) { + return func(start, end roachpb.Key, ts hlc.Timestamp, txnID uuid.UUID, readCache bool) { + if now.Less(ts) { + panic(fmt.Sprintf("Unsafe timestamp cache update! Cannot add timestamp %s to timestamp "+ + "cache after evaluating %v (resp=%v; err=%v) with local hlc clock at timestamp %s. "+ + "The timestamp cache update could be lost on a lease transfer.", ts, ba, br, pErr, now)) + } + tc.Add(start, end, ts, txnID, readCache) + } +} + // applyTimestampCache moves the batch timestamp forward depending on // the presence of overlapping entries in the timestamp cache. If the // batch is transactional, the txn timestamp and the txn.WriteTooOld diff --git a/pkg/storage/store.go b/pkg/storage/store.go index 1e605ed54d79..60d32af70b3c 100644 --- a/pkg/storage/store.go +++ b/pkg/storage/store.go @@ -2721,6 +2721,32 @@ func (s *Store) Send( return nil, roachpb.NewError(err) } + // In 2.1 it was possible for nodes to send PushTxn requests without + // properly reflecting the time that they wanted the push to happen + // in the batch's header timestamp. Ensure that this timestamp is + // sufficiently advanced to prevent lost timestamp cache updates. + // TODO(nvanbenschoten): Remove this all in 19.2. + if !s.cfg.Settings.Version.IsActive(cluster.VersionPushTxnToInclusive) { + for _, union := range ba.Requests { + if pushReq, ok := union.GetInner().(*roachpb.PushTxnRequest); ok { + ba.Timestamp.Forward(pushReq.DeprecatedNow) + + // While here, correct the request's PushTo arg. Before + // VersionPushTxnToInclusive, pushers would provide _their_ + // timestamp instead of one logical tick past their timestamp + // for the PushTo arg. Handle this by bumping the PushTo arg. + // We only do this if the InclusivePushTo arg is false, which + // allows us to distinguish between 2.1 nodes and 19.1. nodes. + // Since we only observe this field when the cluster version + // is not active, we don't need to send it or observe it in + // 19.2. + if !pushReq.InclusivePushTo { + pushReq.PushTo = pushReq.PushTo.Next() + } + } + } + } + if s.cfg.TestingKnobs.ClockBeforeSend != nil { s.cfg.TestingKnobs.ClockBeforeSend(s.cfg.Clock, ba) } @@ -3048,7 +3074,9 @@ func (s *Store) maybeWaitForPushee( // request may have been waiting to push the txn. If we don't // move the timestamp forward to the current time, we may fail // to push a txn which has expired. - pushReqCopy.Now.Forward(s.Clock().Now()) + now := s.Clock().Now() + ba.Timestamp.Forward(now) + pushReqCopy.DeprecatedNow.Forward(now) ba.Requests = nil ba.Add(&pushReqCopy) } else if ba.IsSingleQueryTxnRequest() { diff --git a/pkg/storage/store_test.go b/pkg/storage/store_test.go index b10aa63c65e1..656dbb973e68 100644 --- a/pkg/storage/store_test.go +++ b/pkg/storage/store_test.go @@ -1543,7 +1543,7 @@ func TestStoreResolveWriteIntent(t *testing.T) { return nil } if exp, act := manual.UnixNano(), pr.PushTo.WallTime; exp > act { - return roachpb.NewError(fmt.Errorf("expected PushTo >= WallTime, but got %d < %d:\n%+v", act, exp, pr)) + return roachpb.NewError(fmt.Errorf("expected PushTo > WallTime, but got %d < %d:\n%+v", act, exp, pr)) } return nil } diff --git a/pkg/storage/txnwait/queue_test.go b/pkg/storage/txnwait/queue_test.go index 1baef5b5778d..6d2bde7fdf83 100644 --- a/pkg/storage/txnwait/queue_test.go +++ b/pkg/storage/txnwait/queue_test.go @@ -101,7 +101,7 @@ func TestIsPushed(t *testing.T) { {roachpb.PUSH_TIMESTAMP, makeTS(10, 1), roachpb.ABORTED, hlc.Timestamp{}, true}, {roachpb.PUSH_TIMESTAMP, makeTS(10, 1), roachpb.COMMITTED, hlc.Timestamp{}, true}, {roachpb.PUSH_TIMESTAMP, makeTS(10, 1), roachpb.PENDING, makeTS(10, 0), false}, - {roachpb.PUSH_TIMESTAMP, makeTS(10, 1), roachpb.PENDING, makeTS(10, 1), false}, + {roachpb.PUSH_TIMESTAMP, makeTS(10, 1), roachpb.PENDING, makeTS(10, 1), true}, {roachpb.PUSH_TIMESTAMP, makeTS(10, 1), roachpb.PENDING, makeTS(10, 2), true}, } for _, test := range testCases { diff --git a/pkg/storage/txnwait/txnqueue.go b/pkg/storage/txnwait/txnqueue.go index e169bb52e63b..2e4599acbdd7 100644 --- a/pkg/storage/txnwait/txnqueue.go +++ b/pkg/storage/txnwait/txnqueue.go @@ -60,7 +60,7 @@ func ShouldPushImmediately(req *roachpb.PushTxnRequest) bool { // for transactions with pushed timestamps. func isPushed(req *roachpb.PushTxnRequest, txn *roachpb.Transaction) bool { return (txn.Status != roachpb.PENDING || - (req.PushType == roachpb.PUSH_TIMESTAMP && req.PushTo.Less(txn.Timestamp))) + (req.PushType == roachpb.PUSH_TIMESTAMP && !txn.Timestamp.Less(req.PushTo))) } // TxnExpiration computes the timestamp after which the transaction will be