diff --git a/docs/generated/http/full.md b/docs/generated/http/full.md index ec72a8deb2a0..b6ea98e01838 100644 --- a/docs/generated/http/full.md +++ b/docs/generated/http/full.md @@ -786,12 +786,11 @@ The underlying response type is something we're looking to get rid of. | application_name | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | Application name specified by the client. | | active_queries | [ActiveQuery](#cockroach.server.serverpb.ListSessionsResponse-cockroach.server.serverpb.ActiveQuery) | repeated | Queries in progress on this session. | | start | [google.protobuf.Timestamp](#cockroach.server.serverpb.ListSessionsResponse-google.protobuf.Timestamp) | | Timestamp of session's start. | -| kv_txn_id | [bytes](#cockroach.server.serverpb.ListSessionsResponse-bytes) | | ID of the current KV transaction for this session. Nil if the session doesn't currently have a transaction. | -| active_txn | [TxnInfo](#cockroach.server.serverpb.ListSessionsResponse-cockroach.server.serverpb.TxnInfo) | | Information about the txn in progress on this session. Nil if the session doesn't currently have a transaction. | | last_active_query | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | SQL string of the last query executed on this session. | | id | [bytes](#cockroach.server.serverpb.ListSessionsResponse-bytes) | | ID of the session (uint128 represented as raw bytes). | | alloc_bytes | [int64](#cockroach.server.serverpb.ListSessionsResponse-int64) | | Number of currently allocated bytes in the session memory monitor. | | max_alloc_bytes | [int64](#cockroach.server.serverpb.ListSessionsResponse-int64) | | High water mark of allocated bytes in the session memory monitor. | +| active_txn | [TxnInfo](#cockroach.server.serverpb.ListSessionsResponse-cockroach.server.serverpb.TxnInfo) | | Information about the txn in progress on this session. Nil if the session doesn't currently have a transaction. | @@ -822,6 +821,10 @@ The underlying response type is something we're looking to get rid of. | id | [bytes](#cockroach.server.serverpb.ListSessionsResponse-bytes) | | | | start | [google.protobuf.Timestamp](#cockroach.server.serverpb.ListSessionsResponse-google.protobuf.Timestamp) | | The start timestamp of the transaction. | | txn_description | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | txn_description is a text description of the underlying kv.Txn, intended for troubleshooting purposes. | +| num_statements_executed | [int32](#cockroach.server.serverpb.ListSessionsResponse-int32) | | num_statements_executed is the number of statements that were executed so far on this transaction. | +| num_retries | [int32](#cockroach.server.serverpb.ListSessionsResponse-int32) | | num_retries is the number of times that this transaction was retried. | +| num_auto_retries | [int32](#cockroach.server.serverpb.ListSessionsResponse-int32) | | num_retries is the number of times that this transaction was automatically retried by the SQL executor. | +| deadline | [google.protobuf.Timestamp](#cockroach.server.serverpb.ListSessionsResponse-google.protobuf.Timestamp) | | The deadline by which the transaction must be committed. | @@ -887,12 +890,11 @@ The underlying response type is something we're looking to get rid of. | application_name | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | Application name specified by the client. | | active_queries | [ActiveQuery](#cockroach.server.serverpb.ListSessionsResponse-cockroach.server.serverpb.ActiveQuery) | repeated | Queries in progress on this session. | | start | [google.protobuf.Timestamp](#cockroach.server.serverpb.ListSessionsResponse-google.protobuf.Timestamp) | | Timestamp of session's start. | -| kv_txn_id | [bytes](#cockroach.server.serverpb.ListSessionsResponse-bytes) | | ID of the current KV transaction for this session. Nil if the session doesn't currently have a transaction. | -| active_txn | [TxnInfo](#cockroach.server.serverpb.ListSessionsResponse-cockroach.server.serverpb.TxnInfo) | | Information about the txn in progress on this session. Nil if the session doesn't currently have a transaction. | | last_active_query | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | SQL string of the last query executed on this session. | | id | [bytes](#cockroach.server.serverpb.ListSessionsResponse-bytes) | | ID of the session (uint128 represented as raw bytes). | | alloc_bytes | [int64](#cockroach.server.serverpb.ListSessionsResponse-int64) | | Number of currently allocated bytes in the session memory monitor. | | max_alloc_bytes | [int64](#cockroach.server.serverpb.ListSessionsResponse-int64) | | High water mark of allocated bytes in the session memory monitor. | +| active_txn | [TxnInfo](#cockroach.server.serverpb.ListSessionsResponse-cockroach.server.serverpb.TxnInfo) | | Information about the txn in progress on this session. Nil if the session doesn't currently have a transaction. | @@ -923,6 +925,10 @@ The underlying response type is something we're looking to get rid of. | id | [bytes](#cockroach.server.serverpb.ListSessionsResponse-bytes) | | | | start | [google.protobuf.Timestamp](#cockroach.server.serverpb.ListSessionsResponse-google.protobuf.Timestamp) | | The start timestamp of the transaction. | | txn_description | [string](#cockroach.server.serverpb.ListSessionsResponse-string) | | txn_description is a text description of the underlying kv.Txn, intended for troubleshooting purposes. | +| num_statements_executed | [int32](#cockroach.server.serverpb.ListSessionsResponse-int32) | | num_statements_executed is the number of statements that were executed so far on this transaction. | +| num_retries | [int32](#cockroach.server.serverpb.ListSessionsResponse-int32) | | num_retries is the number of times that this transaction was retried. | +| num_auto_retries | [int32](#cockroach.server.serverpb.ListSessionsResponse-int32) | | num_retries is the number of times that this transaction was automatically retried by the SQL executor. | +| deadline | [google.protobuf.Timestamp](#cockroach.server.serverpb.ListSessionsResponse-google.protobuf.Timestamp) | | The deadline by which the transaction must be committed. | diff --git a/docs/generated/sql/bnf/show_var.bnf b/docs/generated/sql/bnf/show_var.bnf index 95e5fafc9b2c..f54f5f7d1946 100644 --- a/docs/generated/sql/bnf/show_var.bnf +++ b/docs/generated/sql/bnf/show_var.bnf @@ -24,5 +24,6 @@ show_stmt ::= | show_stats_stmt | show_tables_stmt | show_trace_stmt + | show_transactions_stmt | show_users_stmt | show_zone_stmt diff --git a/docs/generated/sql/bnf/stmt_block.bnf b/docs/generated/sql/bnf/stmt_block.bnf index 022e469b28eb..5332184aa5bc 100644 --- a/docs/generated/sql/bnf/stmt_block.bnf +++ b/docs/generated/sql/bnf/stmt_block.bnf @@ -215,6 +215,7 @@ show_stmt ::= | show_stats_stmt | show_tables_stmt | show_trace_stmt + | show_transactions_stmt | show_users_stmt | show_zone_stmt @@ -665,6 +666,10 @@ show_trace_stmt ::= 'SHOW' opt_compact 'TRACE' 'FOR' 'SESSION' | 'SHOW' opt_compact 'KV' 'TRACE' 'FOR' 'SESSION' +show_transactions_stmt ::= + 'SHOW' opt_cluster 'TRANSACTIONS' + | 'SHOW' 'ALL' opt_cluster 'TRANSACTIONS' + show_users_stmt ::= 'SHOW' 'USERS' @@ -993,6 +998,7 @@ unreserved_keyword ::= | 'TIES' | 'TRACE' | 'TRANSACTION' + | 'TRANSACTIONS' | 'TRIGGER' | 'TRUNCATE' | 'TRUSTED' diff --git a/pkg/ccl/backupccl/restore_job.go b/pkg/ccl/backupccl/restore_job.go index 828f5a5eb3d6..466a470ecabf 100644 --- a/pkg/ccl/backupccl/restore_job.go +++ b/pkg/ccl/backupccl/restore_job.go @@ -828,7 +828,7 @@ func createImportingDescriptors( mutableDatabases = append(mutableDatabases, mut) } case catalog.SchemaDescriptor: - schemas = append(schemas, schemadesc.NewMutableCreatedSchemaDescriptor(*desc.SchemaDesc())) + schemas = append(schemas, schemadesc.NewCreatedMutable(*desc.SchemaDesc())) case catalog.TypeDescriptor: types = append(types, typedesc.NewCreatedMutable(*desc.TypeDesc())) } diff --git a/pkg/server/server_sql.go b/pkg/server/server_sql.go index a13205b70064..99de0c38763c 100644 --- a/pkg/server/server_sql.go +++ b/pkg/server/server_sql.go @@ -39,6 +39,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/server/serverpb" "github.com/cockroachdb/cockroach/pkg/server/status" "github.com/cockroachdb/cockroach/pkg/sql" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/hydratedtables" "github.com/cockroachdb/cockroach/pkg/sql/catalog/lease" "github.com/cockroachdb/cockroach/pkg/sql/colexec" "github.com/cockroachdb/cockroach/pkg/sql/distsql" @@ -325,6 +326,9 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*sqlServer, error) { adminMemMetrics := sql.MakeMemMetrics("admin", cfg.HistogramWindowInterval()) cfg.registry.AddMetricStruct(adminMemMetrics) + hydratedTablesCache := hydratedtables.NewCache(cfg.Settings) + cfg.registry.AddMetricStruct(hydratedTablesCache.Metrics()) + // Set up the DistSQL server. distSQLCfg := execinfra.ServerConfig{ AmbientContext: cfg.AmbientCtx, @@ -370,7 +374,8 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*sqlServer, error) { ExternalStorage: cfg.externalStorage, ExternalStorageFromURI: cfg.externalStorageFromURI, - RangeCache: cfg.distSender.RangeDescriptorCache(), + RangeCache: cfg.distSender.RangeDescriptorCache(), + HydratedTables: hydratedTablesCache, } cfg.TempStorageConfig.Mon.SetMetrics(distSQLMetrics.CurDiskBytesCount, distSQLMetrics.MaxDiskBytesHist) if distSQLTestingKnobs := cfg.TestingKnobs.DistSQL; distSQLTestingKnobs != nil { @@ -506,6 +511,7 @@ func newSQLServer(ctx context.Context, cfg sqlServerArgs) (*sqlServer, error) { QueryCache: querycache.New(cfg.QueryCacheSize), ProtectedTimestampProvider: cfg.protectedtsProvider, ExternalIODirConfig: cfg.ExternalIODirConfig, + HydratedTables: hydratedTablesCache, } cfg.stopper.AddCloser(execCfg.ExecLogger) diff --git a/pkg/server/serverpb/status.pb.go b/pkg/server/serverpb/status.pb.go index ca36a0dd2540..7693e9f90466 100644 --- a/pkg/server/serverpb/status.pb.go +++ b/pkg/server/serverpb/status.pb.go @@ -65,7 +65,7 @@ func (x StacksType) String() string { return proto.EnumName(StacksType_name, int32(x)) } func (StacksType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{0} + return fileDescriptor_status_2d17127fb8c69067, []int{0} } // Represents the type of file. @@ -92,7 +92,7 @@ func (x FileType) String() string { return proto.EnumName(FileType_name, int32(x)) } func (FileType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{1} + return fileDescriptor_status_2d17127fb8c69067, []int{1} } // We use an enum to allow reporting of client certs and potential others (eg: @@ -129,7 +129,7 @@ func (x CertificateDetails_CertificateType) String() string { return proto.EnumName(CertificateDetails_CertificateType_name, int32(x)) } func (CertificateDetails_CertificateType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{1, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{1, 0} } type ProfileRequest_Type int32 @@ -152,7 +152,7 @@ func (x ProfileRequest_Type) String() string { return proto.EnumName(ProfileRequest_Type_name, int32(x)) } func (ProfileRequest_Type) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{37, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{37, 0} } // Enum for phase of execution. @@ -176,7 +176,7 @@ func (x ActiveQuery_Phase) String() string { return proto.EnumName(ActiveQuery_Phase_name, int32(x)) } func (ActiveQuery_Phase) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{45, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{45, 0} } type CertificatesRequest struct { @@ -189,7 +189,7 @@ func (m *CertificatesRequest) Reset() { *m = CertificatesRequest{} } func (m *CertificatesRequest) String() string { return proto.CompactTextString(m) } func (*CertificatesRequest) ProtoMessage() {} func (*CertificatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{0} + return fileDescriptor_status_2d17127fb8c69067, []int{0} } func (m *CertificatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -228,7 +228,7 @@ func (m *CertificateDetails) Reset() { *m = CertificateDetails{} } func (m *CertificateDetails) String() string { return proto.CompactTextString(m) } func (*CertificateDetails) ProtoMessage() {} func (*CertificateDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{1} + return fileDescriptor_status_2d17127fb8c69067, []int{1} } func (m *CertificateDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -269,7 +269,7 @@ func (m *CertificateDetails_Fields) Reset() { *m = CertificateDetails_Fi func (m *CertificateDetails_Fields) String() string { return proto.CompactTextString(m) } func (*CertificateDetails_Fields) ProtoMessage() {} func (*CertificateDetails_Fields) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{1, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{1, 0} } func (m *CertificateDetails_Fields) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -302,7 +302,7 @@ func (m *CertificatesResponse) Reset() { *m = CertificatesResponse{} } func (m *CertificatesResponse) String() string { return proto.CompactTextString(m) } func (*CertificatesResponse) ProtoMessage() {} func (*CertificatesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{2} + return fileDescriptor_status_2d17127fb8c69067, []int{2} } func (m *CertificatesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -339,7 +339,7 @@ func (m *DetailsRequest) Reset() { *m = DetailsRequest{} } func (m *DetailsRequest) String() string { return proto.CompactTextString(m) } func (*DetailsRequest) ProtoMessage() {} func (*DetailsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{3} + return fileDescriptor_status_2d17127fb8c69067, []int{3} } func (m *DetailsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -376,7 +376,7 @@ func (m *SystemInfo) Reset() { *m = SystemInfo{} } func (m *SystemInfo) String() string { return proto.CompactTextString(m) } func (*SystemInfo) ProtoMessage() {} func (*SystemInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{4} + return fileDescriptor_status_2d17127fb8c69067, []int{4} } func (m *SystemInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +413,7 @@ func (m *DetailsResponse) Reset() { *m = DetailsResponse{} } func (m *DetailsResponse) String() string { return proto.CompactTextString(m) } func (*DetailsResponse) ProtoMessage() {} func (*DetailsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{5} + return fileDescriptor_status_2d17127fb8c69067, []int{5} } func (m *DetailsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -445,7 +445,7 @@ func (m *NodesRequest) Reset() { *m = NodesRequest{} } func (m *NodesRequest) String() string { return proto.CompactTextString(m) } func (*NodesRequest) ProtoMessage() {} func (*NodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{6} + return fileDescriptor_status_2d17127fb8c69067, []int{6} } func (m *NodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -479,7 +479,7 @@ func (m *NodesResponse) Reset() { *m = NodesResponse{} } func (m *NodesResponse) String() string { return proto.CompactTextString(m) } func (*NodesResponse) ProtoMessage() {} func (*NodesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{7} + return fileDescriptor_status_2d17127fb8c69067, []int{7} } func (m *NodesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -514,7 +514,7 @@ func (m *NodeRequest) Reset() { *m = NodeRequest{} } func (m *NodeRequest) String() string { return proto.CompactTextString(m) } func (*NodeRequest) ProtoMessage() {} func (*NodeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{8} + return fileDescriptor_status_2d17127fb8c69067, []int{8} } func (m *NodeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -559,7 +559,7 @@ func (m *RaftState) Reset() { *m = RaftState{} } func (m *RaftState) String() string { return proto.CompactTextString(m) } func (*RaftState) ProtoMessage() {} func (*RaftState) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{9} + return fileDescriptor_status_2d17127fb8c69067, []int{9} } func (m *RaftState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -596,7 +596,7 @@ func (m *RaftState_Progress) Reset() { *m = RaftState_Progress{} } func (m *RaftState_Progress) String() string { return proto.CompactTextString(m) } func (*RaftState_Progress) ProtoMessage() {} func (*RaftState_Progress) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{9, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{9, 0} } func (m *RaftState_Progress) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -641,7 +641,7 @@ func (m *RangeProblems) Reset() { *m = RangeProblems{} } func (m *RangeProblems) String() string { return proto.CompactTextString(m) } func (*RangeProblems) ProtoMessage() {} func (*RangeProblems) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{10} + return fileDescriptor_status_2d17127fb8c69067, []int{10} } func (m *RangeProblems) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -677,7 +677,7 @@ func (m *RangeStatistics) Reset() { *m = RangeStatistics{} } func (m *RangeStatistics) String() string { return proto.CompactTextString(m) } func (*RangeStatistics) ProtoMessage() {} func (*RangeStatistics) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{11} + return fileDescriptor_status_2d17127fb8c69067, []int{11} } func (m *RangeStatistics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -711,7 +711,7 @@ func (m *PrettySpan) Reset() { *m = PrettySpan{} } func (m *PrettySpan) String() string { return proto.CompactTextString(m) } func (*PrettySpan) ProtoMessage() {} func (*PrettySpan) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{12} + return fileDescriptor_status_2d17127fb8c69067, []int{12} } func (m *PrettySpan) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -757,7 +757,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_status_0225a3e6e509791f, []int{13} + return fileDescriptor_status_2d17127fb8c69067, []int{13} } func (m *RangeInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -793,7 +793,7 @@ func (m *RangesRequest) Reset() { *m = RangesRequest{} } func (m *RangesRequest) String() string { return proto.CompactTextString(m) } func (*RangesRequest) ProtoMessage() {} func (*RangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{14} + return fileDescriptor_status_2d17127fb8c69067, []int{14} } func (m *RangesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -826,7 +826,7 @@ func (m *RangesResponse) Reset() { *m = RangesResponse{} } func (m *RangesResponse) String() string { return proto.CompactTextString(m) } func (*RangesResponse) ProtoMessage() {} func (*RangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{15} + return fileDescriptor_status_2d17127fb8c69067, []int{15} } func (m *RangesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -861,7 +861,7 @@ func (m *GossipRequest) Reset() { *m = GossipRequest{} } func (m *GossipRequest) String() string { return proto.CompactTextString(m) } func (*GossipRequest) ProtoMessage() {} func (*GossipRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{16} + return fileDescriptor_status_2d17127fb8c69067, []int{16} } func (m *GossipRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -896,7 +896,7 @@ func (m *EngineStatsInfo) Reset() { *m = EngineStatsInfo{} } func (m *EngineStatsInfo) String() string { return proto.CompactTextString(m) } func (*EngineStatsInfo) ProtoMessage() {} func (*EngineStatsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{17} + return fileDescriptor_status_2d17127fb8c69067, []int{17} } func (m *EngineStatsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -931,7 +931,7 @@ func (m *EngineStatsRequest) Reset() { *m = EngineStatsRequest{} } func (m *EngineStatsRequest) String() string { return proto.CompactTextString(m) } func (*EngineStatsRequest) ProtoMessage() {} func (*EngineStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{18} + return fileDescriptor_status_2d17127fb8c69067, []int{18} } func (m *EngineStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -964,7 +964,7 @@ func (m *EngineStatsResponse) Reset() { *m = EngineStatsResponse{} } func (m *EngineStatsResponse) String() string { return proto.CompactTextString(m) } func (*EngineStatsResponse) ProtoMessage() {} func (*EngineStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{19} + return fileDescriptor_status_2d17127fb8c69067, []int{19} } func (m *EngineStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -998,7 +998,7 @@ func (m *TraceEvent) Reset() { *m = TraceEvent{} } func (m *TraceEvent) String() string { return proto.CompactTextString(m) } func (*TraceEvent) ProtoMessage() {} func (*TraceEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{20} + return fileDescriptor_status_2d17127fb8c69067, []int{20} } func (m *TraceEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1032,7 +1032,7 @@ func (m *AllocatorDryRun) Reset() { *m = AllocatorDryRun{} } func (m *AllocatorDryRun) String() string { return proto.CompactTextString(m) } func (*AllocatorDryRun) ProtoMessage() {} func (*AllocatorDryRun) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{21} + return fileDescriptor_status_2d17127fb8c69067, []int{21} } func (m *AllocatorDryRun) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1065,7 +1065,7 @@ func (m *AllocatorRangeRequest) Reset() { *m = AllocatorRangeRequest{} } func (m *AllocatorRangeRequest) String() string { return proto.CompactTextString(m) } func (*AllocatorRangeRequest) ProtoMessage() {} func (*AllocatorRangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{22} + return fileDescriptor_status_2d17127fb8c69067, []int{22} } func (m *AllocatorRangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1101,7 +1101,7 @@ func (m *AllocatorRangeResponse) Reset() { *m = AllocatorRangeResponse{} func (m *AllocatorRangeResponse) String() string { return proto.CompactTextString(m) } func (*AllocatorRangeResponse) ProtoMessage() {} func (*AllocatorRangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{23} + return fileDescriptor_status_2d17127fb8c69067, []int{23} } func (m *AllocatorRangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1135,7 +1135,7 @@ func (m *AllocatorRequest) Reset() { *m = AllocatorRequest{} } func (m *AllocatorRequest) String() string { return proto.CompactTextString(m) } func (*AllocatorRequest) ProtoMessage() {} func (*AllocatorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{24} + return fileDescriptor_status_2d17127fb8c69067, []int{24} } func (m *AllocatorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1168,7 +1168,7 @@ func (m *AllocatorResponse) Reset() { *m = AllocatorResponse{} } func (m *AllocatorResponse) String() string { return proto.CompactTextString(m) } func (*AllocatorResponse) ProtoMessage() {} func (*AllocatorResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{25} + return fileDescriptor_status_2d17127fb8c69067, []int{25} } func (m *AllocatorResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1201,7 +1201,7 @@ func (m *JSONResponse) Reset() { *m = JSONResponse{} } func (m *JSONResponse) String() string { return proto.CompactTextString(m) } func (*JSONResponse) ProtoMessage() {} func (*JSONResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{26} + return fileDescriptor_status_2d17127fb8c69067, []int{26} } func (m *JSONResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1237,7 +1237,7 @@ func (m *ResponseError) Reset() { *m = ResponseError{} } func (m *ResponseError) String() string { return proto.CompactTextString(m) } func (*ResponseError) ProtoMessage() {} func (*ResponseError) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{27} + return fileDescriptor_status_2d17127fb8c69067, []int{27} } func (m *ResponseError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1289,7 +1289,7 @@ func (m *LogsRequest) Reset() { *m = LogsRequest{} } func (m *LogsRequest) String() string { return proto.CompactTextString(m) } func (*LogsRequest) ProtoMessage() {} func (*LogsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{28} + return fileDescriptor_status_2d17127fb8c69067, []int{28} } func (m *LogsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1322,7 +1322,7 @@ func (m *LogEntriesResponse) Reset() { *m = LogEntriesResponse{} } func (m *LogEntriesResponse) String() string { return proto.CompactTextString(m) } func (*LogEntriesResponse) ProtoMessage() {} func (*LogEntriesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{29} + return fileDescriptor_status_2d17127fb8c69067, []int{29} } func (m *LogEntriesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1357,7 +1357,7 @@ func (m *LogFilesListRequest) Reset() { *m = LogFilesListRequest{} } func (m *LogFilesListRequest) String() string { return proto.CompactTextString(m) } func (*LogFilesListRequest) ProtoMessage() {} func (*LogFilesListRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{30} + return fileDescriptor_status_2d17127fb8c69067, []int{30} } func (m *LogFilesListRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1390,7 +1390,7 @@ func (m *LogFilesListResponse) Reset() { *m = LogFilesListResponse{} } func (m *LogFilesListResponse) String() string { return proto.CompactTextString(m) } func (*LogFilesListResponse) ProtoMessage() {} func (*LogFilesListResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{31} + return fileDescriptor_status_2d17127fb8c69067, []int{31} } func (m *LogFilesListResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1438,7 +1438,7 @@ func (m *LogFileRequest) Reset() { *m = LogFileRequest{} } func (m *LogFileRequest) String() string { return proto.CompactTextString(m) } func (*LogFileRequest) ProtoMessage() {} func (*LogFileRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{32} + return fileDescriptor_status_2d17127fb8c69067, []int{32} } func (m *LogFileRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1474,7 +1474,7 @@ func (m *StacksRequest) Reset() { *m = StacksRequest{} } func (m *StacksRequest) String() string { return proto.CompactTextString(m) } func (*StacksRequest) ProtoMessage() {} func (*StacksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{33} + return fileDescriptor_status_2d17127fb8c69067, []int{33} } func (m *StacksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1510,7 +1510,7 @@ func (m *File) Reset() { *m = File{} } func (m *File) String() string { return proto.CompactTextString(m) } func (*File) ProtoMessage() {} func (*File) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{34} + return fileDescriptor_status_2d17127fb8c69067, []int{34} } func (m *File) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1554,7 +1554,7 @@ func (m *GetFilesRequest) Reset() { *m = GetFilesRequest{} } func (m *GetFilesRequest) String() string { return proto.CompactTextString(m) } func (*GetFilesRequest) ProtoMessage() {} func (*GetFilesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{35} + return fileDescriptor_status_2d17127fb8c69067, []int{35} } func (m *GetFilesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1587,7 +1587,7 @@ func (m *GetFilesResponse) Reset() { *m = GetFilesResponse{} } func (m *GetFilesResponse) String() string { return proto.CompactTextString(m) } func (*GetFilesResponse) ProtoMessage() {} func (*GetFilesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{36} + return fileDescriptor_status_2d17127fb8c69067, []int{36} } func (m *GetFilesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1625,7 +1625,7 @@ func (m *ProfileRequest) Reset() { *m = ProfileRequest{} } func (m *ProfileRequest) String() string { return proto.CompactTextString(m) } func (*ProfileRequest) ProtoMessage() {} func (*ProfileRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{37} + return fileDescriptor_status_2d17127fb8c69067, []int{37} } func (m *ProfileRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1660,7 +1660,7 @@ func (m *MetricsRequest) Reset() { *m = MetricsRequest{} } func (m *MetricsRequest) String() string { return proto.CompactTextString(m) } func (*MetricsRequest) ProtoMessage() {} func (*MetricsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{38} + return fileDescriptor_status_2d17127fb8c69067, []int{38} } func (m *MetricsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1694,7 +1694,7 @@ func (m *RaftRangeNode) Reset() { *m = RaftRangeNode{} } func (m *RaftRangeNode) String() string { return proto.CompactTextString(m) } func (*RaftRangeNode) ProtoMessage() {} func (*RaftRangeNode) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{39} + return fileDescriptor_status_2d17127fb8c69067, []int{39} } func (m *RaftRangeNode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1727,7 +1727,7 @@ func (m *RaftRangeError) Reset() { *m = RaftRangeError{} } func (m *RaftRangeError) String() string { return proto.CompactTextString(m) } func (*RaftRangeError) ProtoMessage() {} func (*RaftRangeError) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{40} + return fileDescriptor_status_2d17127fb8c69067, []int{40} } func (m *RaftRangeError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1762,7 +1762,7 @@ func (m *RaftRangeStatus) Reset() { *m = RaftRangeStatus{} } func (m *RaftRangeStatus) String() string { return proto.CompactTextString(m) } func (*RaftRangeStatus) ProtoMessage() {} func (*RaftRangeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{41} + return fileDescriptor_status_2d17127fb8c69067, []int{41} } func (m *RaftRangeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1795,7 +1795,7 @@ func (m *RaftDebugRequest) Reset() { *m = RaftDebugRequest{} } func (m *RaftDebugRequest) String() string { return proto.CompactTextString(m) } func (*RaftDebugRequest) ProtoMessage() {} func (*RaftDebugRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{42} + return fileDescriptor_status_2d17127fb8c69067, []int{42} } func (m *RaftDebugRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1829,7 +1829,7 @@ func (m *RaftDebugResponse) Reset() { *m = RaftDebugResponse{} } func (m *RaftDebugResponse) String() string { return proto.CompactTextString(m) } func (*RaftDebugResponse) ProtoMessage() {} func (*RaftDebugResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{43} + return fileDescriptor_status_2d17127fb8c69067, []int{43} } func (m *RaftDebugResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1862,13 +1862,23 @@ type TxnInfo struct { // txn_description is a text description of the underlying kv.Txn, intended // for troubleshooting purposes. TxnDescription string `protobuf:"bytes,3,opt,name=txn_description,json=txnDescription,proto3" json:"txn_description,omitempty"` + // num_statements_executed is the number of statements that were executed so + // far on this transaction. + NumStatementsExecuted int32 `protobuf:"varint,4,opt,name=num_statements_executed,json=numStatementsExecuted,proto3" json:"num_statements_executed,omitempty"` + // num_retries is the number of times that this transaction was retried. + NumRetries int32 `protobuf:"varint,5,opt,name=num_retries,json=numRetries,proto3" json:"num_retries,omitempty"` + // num_retries is the number of times that this transaction was automatically + // retried by the SQL executor. + NumAutoRetries int32 `protobuf:"varint,6,opt,name=num_auto_retries,json=numAutoRetries,proto3" json:"num_auto_retries,omitempty"` + // The deadline by which the transaction must be committed. + Deadline time.Time `protobuf:"bytes,7,opt,name=deadline,proto3,stdtime" json:"deadline"` } func (m *TxnInfo) Reset() { *m = TxnInfo{} } func (m *TxnInfo) String() string { return proto.CompactTextString(m) } func (*TxnInfo) ProtoMessage() {} func (*TxnInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{44} + return fileDescriptor_status_2d17127fb8c69067, []int{44} } func (m *TxnInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1914,7 +1924,7 @@ func (m *ActiveQuery) Reset() { *m = ActiveQuery{} } func (m *ActiveQuery) String() string { return proto.CompactTextString(m) } func (*ActiveQuery) ProtoMessage() {} func (*ActiveQuery) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{45} + return fileDescriptor_status_2d17127fb8c69067, []int{45} } func (m *ActiveQuery) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1949,7 +1959,7 @@ func (m *ListSessionsRequest) Reset() { *m = ListSessionsRequest{} } func (m *ListSessionsRequest) String() string { return proto.CompactTextString(m) } func (*ListSessionsRequest) ProtoMessage() {} func (*ListSessionsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{46} + return fileDescriptor_status_2d17127fb8c69067, []int{46} } func (m *ListSessionsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1988,12 +1998,6 @@ type Session struct { ActiveQueries []ActiveQuery `protobuf:"bytes,5,rep,name=active_queries,json=activeQueries,proto3" json:"active_queries"` // Timestamp of session's start. Start time.Time `protobuf:"bytes,6,opt,name=start,proto3,stdtime" json:"start"` - // ID of the current KV transaction for this session. Nil if the session - // doesn't currently have a transaction. - KvTxnID *github_com_cockroachdb_cockroach_pkg_util_uuid.UUID `protobuf:"bytes,7,opt,name=kv_txn_id,json=kvTxnId,proto3,customtype=github.com/cockroachdb/cockroach/pkg/util/uuid.UUID" json:"kv_txn_id,omitempty"` - // Information about the txn in progress on this session. Nil if the - // session doesn't currently have a transaction. - ActiveTxn *TxnInfo `protobuf:"bytes,12,opt,name=active_txn,json=activeTxn,proto3" json:"active_txn,omitempty"` // SQL string of the last query executed on this session. LastActiveQuery string `protobuf:"bytes,8,opt,name=last_active_query,json=lastActiveQuery,proto3" json:"last_active_query,omitempty"` // ID of the session (uint128 represented as raw bytes). @@ -2002,13 +2006,16 @@ type Session struct { AllocBytes int64 `protobuf:"varint,10,opt,name=alloc_bytes,json=allocBytes,proto3" json:"alloc_bytes,omitempty"` // High water mark of allocated bytes in the session memory monitor. MaxAllocBytes int64 `protobuf:"varint,11,opt,name=max_alloc_bytes,json=maxAllocBytes,proto3" json:"max_alloc_bytes,omitempty"` + // Information about the txn in progress on this session. Nil if the + // session doesn't currently have a transaction. + ActiveTxn *TxnInfo `protobuf:"bytes,12,opt,name=active_txn,json=activeTxn,proto3" json:"active_txn,omitempty"` } func (m *Session) Reset() { *m = Session{} } func (m *Session) String() string { return proto.CompactTextString(m) } func (*Session) ProtoMessage() {} func (*Session) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{47} + return fileDescriptor_status_2d17127fb8c69067, []int{47} } func (m *Session) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2045,7 +2052,7 @@ func (m *ListSessionsError) Reset() { *m = ListSessionsError{} } func (m *ListSessionsError) String() string { return proto.CompactTextString(m) } func (*ListSessionsError) ProtoMessage() {} func (*ListSessionsError) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{48} + return fileDescriptor_status_2d17127fb8c69067, []int{48} } func (m *ListSessionsError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2082,7 +2089,7 @@ func (m *ListSessionsResponse) Reset() { *m = ListSessionsResponse{} } func (m *ListSessionsResponse) String() string { return proto.CompactTextString(m) } func (*ListSessionsResponse) ProtoMessage() {} func (*ListSessionsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{49} + return fileDescriptor_status_2d17127fb8c69067, []int{49} } func (m *ListSessionsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2127,7 +2134,7 @@ func (m *CancelQueryRequest) Reset() { *m = CancelQueryRequest{} } func (m *CancelQueryRequest) String() string { return proto.CompactTextString(m) } func (*CancelQueryRequest) ProtoMessage() {} func (*CancelQueryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{50} + return fileDescriptor_status_2d17127fb8c69067, []int{50} } func (m *CancelQueryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2164,7 +2171,7 @@ func (m *CancelQueryResponse) Reset() { *m = CancelQueryResponse{} } func (m *CancelQueryResponse) String() string { return proto.CompactTextString(m) } func (*CancelQueryResponse) ProtoMessage() {} func (*CancelQueryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{51} + return fileDescriptor_status_2d17127fb8c69067, []int{51} } func (m *CancelQueryResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2204,7 +2211,7 @@ func (m *CancelSessionRequest) Reset() { *m = CancelSessionRequest{} } func (m *CancelSessionRequest) String() string { return proto.CompactTextString(m) } func (*CancelSessionRequest) ProtoMessage() {} func (*CancelSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{52} + return fileDescriptor_status_2d17127fb8c69067, []int{52} } func (m *CancelSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2238,7 +2245,7 @@ func (m *CancelSessionResponse) Reset() { *m = CancelSessionResponse{} } func (m *CancelSessionResponse) String() string { return proto.CompactTextString(m) } func (*CancelSessionResponse) ProtoMessage() {} func (*CancelSessionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{53} + return fileDescriptor_status_2d17127fb8c69067, []int{53} } func (m *CancelSessionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2273,7 +2280,7 @@ func (m *SpanStatsRequest) Reset() { *m = SpanStatsRequest{} } func (m *SpanStatsRequest) String() string { return proto.CompactTextString(m) } func (*SpanStatsRequest) ProtoMessage() {} func (*SpanStatsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{54} + return fileDescriptor_status_2d17127fb8c69067, []int{54} } func (m *SpanStatsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2308,7 +2315,7 @@ func (m *SpanStatsResponse) Reset() { *m = SpanStatsResponse{} } func (m *SpanStatsResponse) String() string { return proto.CompactTextString(m) } func (*SpanStatsResponse) ProtoMessage() {} func (*SpanStatsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{55} + return fileDescriptor_status_2d17127fb8c69067, []int{55} } func (m *SpanStatsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2342,7 +2349,7 @@ func (m *ProblemRangesRequest) Reset() { *m = ProblemRangesRequest{} } func (m *ProblemRangesRequest) String() string { return proto.CompactTextString(m) } func (*ProblemRangesRequest) ProtoMessage() {} func (*ProblemRangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{56} + return fileDescriptor_status_2d17127fb8c69067, []int{56} } func (m *ProblemRangesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2377,7 +2384,7 @@ func (m *ProblemRangesResponse) Reset() { *m = ProblemRangesResponse{} } func (m *ProblemRangesResponse) String() string { return proto.CompactTextString(m) } func (*ProblemRangesResponse) ProtoMessage() {} func (*ProblemRangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{57} + return fileDescriptor_status_2d17127fb8c69067, []int{57} } func (m *ProblemRangesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2418,7 +2425,7 @@ func (m *ProblemRangesResponse_NodeProblems) Reset() { *m = ProblemRange func (m *ProblemRangesResponse_NodeProblems) String() string { return proto.CompactTextString(m) } func (*ProblemRangesResponse_NodeProblems) ProtoMessage() {} func (*ProblemRangesResponse_NodeProblems) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{57, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{57, 0} } func (m *ProblemRangesResponse_NodeProblems) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2462,7 +2469,7 @@ func (m *HotRangesRequest) Reset() { *m = HotRangesRequest{} } func (m *HotRangesRequest) String() string { return proto.CompactTextString(m) } func (*HotRangesRequest) ProtoMessage() {} func (*HotRangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{58} + return fileDescriptor_status_2d17127fb8c69067, []int{58} } func (m *HotRangesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2502,7 +2509,7 @@ func (m *HotRangesResponse) Reset() { *m = HotRangesResponse{} } func (m *HotRangesResponse) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse) ProtoMessage() {} func (*HotRangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{59} + return fileDescriptor_status_2d17127fb8c69067, []int{59} } func (m *HotRangesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2546,7 +2553,7 @@ func (m *HotRangesResponse_HotRange) Reset() { *m = HotRangesResponse_Ho func (m *HotRangesResponse_HotRange) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse_HotRange) ProtoMessage() {} func (*HotRangesResponse_HotRange) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{59, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{59, 0} } func (m *HotRangesResponse_HotRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2586,7 +2593,7 @@ func (m *HotRangesResponse_StoreResponse) Reset() { *m = HotRangesRespon func (m *HotRangesResponse_StoreResponse) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse_StoreResponse) ProtoMessage() {} func (*HotRangesResponse_StoreResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{59, 1} + return fileDescriptor_status_2d17127fb8c69067, []int{59, 1} } func (m *HotRangesResponse_StoreResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2628,7 +2635,7 @@ func (m *HotRangesResponse_NodeResponse) Reset() { *m = HotRangesRespons func (m *HotRangesResponse_NodeResponse) String() string { return proto.CompactTextString(m) } func (*HotRangesResponse_NodeResponse) ProtoMessage() {} func (*HotRangesResponse_NodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{59, 2} + return fileDescriptor_status_2d17127fb8c69067, []int{59, 2} } func (m *HotRangesResponse_NodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2661,7 +2668,7 @@ func (m *RangeRequest) Reset() { *m = RangeRequest{} } func (m *RangeRequest) String() string { return proto.CompactTextString(m) } func (*RangeRequest) ProtoMessage() {} func (*RangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{60} + return fileDescriptor_status_2d17127fb8c69067, []int{60} } func (m *RangeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2697,7 +2704,7 @@ func (m *RangeResponse) Reset() { *m = RangeResponse{} } func (m *RangeResponse) String() string { return proto.CompactTextString(m) } func (*RangeResponse) ProtoMessage() {} func (*RangeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{61} + return fileDescriptor_status_2d17127fb8c69067, []int{61} } func (m *RangeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2732,7 +2739,7 @@ func (m *RangeResponse_NodeResponse) Reset() { *m = RangeResponse_NodeRe func (m *RangeResponse_NodeResponse) String() string { return proto.CompactTextString(m) } func (*RangeResponse_NodeResponse) ProtoMessage() {} func (*RangeResponse_NodeResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{61, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{61, 0} } func (m *RangeResponse_NodeResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2768,7 +2775,7 @@ func (m *DiagnosticsRequest) Reset() { *m = DiagnosticsRequest{} } func (m *DiagnosticsRequest) String() string { return proto.CompactTextString(m) } func (*DiagnosticsRequest) ProtoMessage() {} func (*DiagnosticsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{62} + return fileDescriptor_status_2d17127fb8c69067, []int{62} } func (m *DiagnosticsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2803,7 +2810,7 @@ func (m *StoresRequest) Reset() { *m = StoresRequest{} } func (m *StoresRequest) String() string { return proto.CompactTextString(m) } func (*StoresRequest) ProtoMessage() {} func (*StoresRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{63} + return fileDescriptor_status_2d17127fb8c69067, []int{63} } func (m *StoresRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2846,7 +2853,7 @@ func (m *StoreDetails) Reset() { *m = StoreDetails{} } func (m *StoreDetails) String() string { return proto.CompactTextString(m) } func (*StoreDetails) ProtoMessage() {} func (*StoreDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{64} + return fileDescriptor_status_2d17127fb8c69067, []int{64} } func (m *StoreDetails) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2879,7 +2886,7 @@ func (m *StoresResponse) Reset() { *m = StoresResponse{} } func (m *StoresResponse) String() string { return proto.CompactTextString(m) } func (*StoresResponse) ProtoMessage() {} func (*StoresResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{65} + return fileDescriptor_status_2d17127fb8c69067, []int{65} } func (m *StoresResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2912,7 +2919,7 @@ func (m *StatementsRequest) Reset() { *m = StatementsRequest{} } func (m *StatementsRequest) String() string { return proto.CompactTextString(m) } func (*StatementsRequest) ProtoMessage() {} func (*StatementsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{66} + return fileDescriptor_status_2d17127fb8c69067, []int{66} } func (m *StatementsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2953,7 +2960,7 @@ func (m *StatementsResponse) Reset() { *m = StatementsResponse{} } func (m *StatementsResponse) String() string { return proto.CompactTextString(m) } func (*StatementsResponse) ProtoMessage() {} func (*StatementsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{67} + return fileDescriptor_status_2d17127fb8c69067, []int{67} } func (m *StatementsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2991,7 +2998,7 @@ func (m *StatementsResponse_ExtendedStatementStatisticsKey) String() string { } func (*StatementsResponse_ExtendedStatementStatisticsKey) ProtoMessage() {} func (*StatementsResponse_ExtendedStatementStatisticsKey) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{67, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{67, 0} } func (m *StatementsResponse_ExtendedStatementStatisticsKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3029,7 +3036,7 @@ func (m *StatementsResponse_CollectedStatementStatistics) String() string { } func (*StatementsResponse_CollectedStatementStatistics) ProtoMessage() {} func (*StatementsResponse_CollectedStatementStatistics) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{67, 1} + return fileDescriptor_status_2d17127fb8c69067, []int{67, 1} } func (m *StatementsResponse_CollectedStatementStatistics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3067,7 +3074,7 @@ func (m *StatementsResponse_ExtendedCollectedTransactionStatistics) String() str } func (*StatementsResponse_ExtendedCollectedTransactionStatistics) ProtoMessage() {} func (*StatementsResponse_ExtendedCollectedTransactionStatistics) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{67, 2} + return fileDescriptor_status_2d17127fb8c69067, []int{67, 2} } func (m *StatementsResponse_ExtendedCollectedTransactionStatistics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3104,7 +3111,7 @@ func (m *StatementDiagnosticsReport) Reset() { *m = StatementDiagnostics func (m *StatementDiagnosticsReport) String() string { return proto.CompactTextString(m) } func (*StatementDiagnosticsReport) ProtoMessage() {} func (*StatementDiagnosticsReport) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{68} + return fileDescriptor_status_2d17127fb8c69067, []int{68} } func (m *StatementDiagnosticsReport) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3139,7 +3146,7 @@ func (m *CreateStatementDiagnosticsReportRequest) Reset() { func (m *CreateStatementDiagnosticsReportRequest) String() string { return proto.CompactTextString(m) } func (*CreateStatementDiagnosticsReportRequest) ProtoMessage() {} func (*CreateStatementDiagnosticsReportRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{69} + return fileDescriptor_status_2d17127fb8c69067, []int{69} } func (m *CreateStatementDiagnosticsReportRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3174,7 +3181,7 @@ func (m *CreateStatementDiagnosticsReportResponse) Reset() { func (m *CreateStatementDiagnosticsReportResponse) String() string { return proto.CompactTextString(m) } func (*CreateStatementDiagnosticsReportResponse) ProtoMessage() {} func (*CreateStatementDiagnosticsReportResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{70} + return fileDescriptor_status_2d17127fb8c69067, []int{70} } func (m *CreateStatementDiagnosticsReportResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3206,7 +3213,7 @@ func (m *StatementDiagnosticsReportsRequest) Reset() { *m = StatementDia func (m *StatementDiagnosticsReportsRequest) String() string { return proto.CompactTextString(m) } func (*StatementDiagnosticsReportsRequest) ProtoMessage() {} func (*StatementDiagnosticsReportsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{71} + return fileDescriptor_status_2d17127fb8c69067, []int{71} } func (m *StatementDiagnosticsReportsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3239,7 +3246,7 @@ func (m *StatementDiagnosticsReportsResponse) Reset() { *m = StatementDi func (m *StatementDiagnosticsReportsResponse) String() string { return proto.CompactTextString(m) } func (*StatementDiagnosticsReportsResponse) ProtoMessage() {} func (*StatementDiagnosticsReportsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{72} + return fileDescriptor_status_2d17127fb8c69067, []int{72} } func (m *StatementDiagnosticsReportsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3275,7 +3282,7 @@ func (m *StatementDiagnostics) Reset() { *m = StatementDiagnostics{} } func (m *StatementDiagnostics) String() string { return proto.CompactTextString(m) } func (*StatementDiagnostics) ProtoMessage() {} func (*StatementDiagnostics) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{73} + return fileDescriptor_status_2d17127fb8c69067, []int{73} } func (m *StatementDiagnostics) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3308,7 +3315,7 @@ func (m *StatementDiagnosticsRequest) Reset() { *m = StatementDiagnostic func (m *StatementDiagnosticsRequest) String() string { return proto.CompactTextString(m) } func (*StatementDiagnosticsRequest) ProtoMessage() {} func (*StatementDiagnosticsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{74} + return fileDescriptor_status_2d17127fb8c69067, []int{74} } func (m *StatementDiagnosticsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3341,7 +3348,7 @@ func (m *StatementDiagnosticsResponse) Reset() { *m = StatementDiagnosti func (m *StatementDiagnosticsResponse) String() string { return proto.CompactTextString(m) } func (*StatementDiagnosticsResponse) ProtoMessage() {} func (*StatementDiagnosticsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{75} + return fileDescriptor_status_2d17127fb8c69067, []int{75} } func (m *StatementDiagnosticsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3374,7 +3381,7 @@ func (m *JobRegistryStatusRequest) Reset() { *m = JobRegistryStatusReque func (m *JobRegistryStatusRequest) String() string { return proto.CompactTextString(m) } func (*JobRegistryStatusRequest) ProtoMessage() {} func (*JobRegistryStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{76} + return fileDescriptor_status_2d17127fb8c69067, []int{76} } func (m *JobRegistryStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3408,7 +3415,7 @@ func (m *JobRegistryStatusResponse) Reset() { *m = JobRegistryStatusResp func (m *JobRegistryStatusResponse) String() string { return proto.CompactTextString(m) } func (*JobRegistryStatusResponse) ProtoMessage() {} func (*JobRegistryStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{77} + return fileDescriptor_status_2d17127fb8c69067, []int{77} } func (m *JobRegistryStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3441,7 +3448,7 @@ func (m *JobRegistryStatusResponse_Job) Reset() { *m = JobRegistryStatus func (m *JobRegistryStatusResponse_Job) String() string { return proto.CompactTextString(m) } func (*JobRegistryStatusResponse_Job) ProtoMessage() {} func (*JobRegistryStatusResponse_Job) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{77, 0} + return fileDescriptor_status_2d17127fb8c69067, []int{77, 0} } func (m *JobRegistryStatusResponse_Job) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3474,7 +3481,7 @@ func (m *JobStatusRequest) Reset() { *m = JobStatusRequest{} } func (m *JobStatusRequest) String() string { return proto.CompactTextString(m) } func (*JobStatusRequest) ProtoMessage() {} func (*JobStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{78} + return fileDescriptor_status_2d17127fb8c69067, []int{78} } func (m *JobStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3507,7 +3514,7 @@ func (m *JobStatusResponse) Reset() { *m = JobStatusResponse{} } func (m *JobStatusResponse) String() string { return proto.CompactTextString(m) } func (*JobStatusResponse) ProtoMessage() {} func (*JobStatusResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_status_0225a3e6e509791f, []int{79} + return fileDescriptor_status_2d17127fb8c69067, []int{79} } func (m *JobStatusResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6730,6 +6737,29 @@ func (m *TxnInfo) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintStatus(dAtA, i, uint64(len(m.TxnDescription))) i += copy(dAtA[i:], m.TxnDescription) } + if m.NumStatementsExecuted != 0 { + dAtA[i] = 0x20 + i++ + i = encodeVarintStatus(dAtA, i, uint64(m.NumStatementsExecuted)) + } + if m.NumRetries != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintStatus(dAtA, i, uint64(m.NumRetries)) + } + if m.NumAutoRetries != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintStatus(dAtA, i, uint64(m.NumAutoRetries)) + } + dAtA[i] = 0x3a + i++ + i = encodeVarintStatus(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Deadline))) + n28, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Deadline, dAtA[i:]) + if err != nil { + return 0, err + } + i += n28 return i, nil } @@ -6763,11 +6793,11 @@ func (m *ActiveQuery) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintStatus(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Start))) - n28, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) + n29, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) if err != nil { return 0, err } - i += n28 + i += n29 if m.IsDistributed { dAtA[i] = 0x20 i++ @@ -6792,11 +6822,11 @@ func (m *ActiveQuery) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintStatus(dAtA, i, uint64(m.TxnID.Size())) - n29, err := m.TxnID.MarshalTo(dAtA[i:]) + n30, err := m.TxnID.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n29 + i += n30 return i, nil } @@ -6877,21 +6907,11 @@ func (m *Session) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x32 i++ i = encodeVarintStatus(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdTime(m.Start))) - n30, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) + n31, err := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i:]) if err != nil { return 0, err } - i += n30 - if m.KvTxnID != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintStatus(dAtA, i, uint64(m.KvTxnID.Size())) - n31, err := m.KvTxnID.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n31 - } + i += n31 if len(m.LastActiveQuery) > 0 { dAtA[i] = 0x42 i++ @@ -9372,6 +9392,17 @@ func (m *TxnInfo) Size() (n int) { if l > 0 { n += 1 + l + sovStatus(uint64(l)) } + if m.NumStatementsExecuted != 0 { + n += 1 + sovStatus(uint64(m.NumStatementsExecuted)) + } + if m.NumRetries != 0 { + n += 1 + sovStatus(uint64(m.NumRetries)) + } + if m.NumAutoRetries != 0 { + n += 1 + sovStatus(uint64(m.NumAutoRetries)) + } + l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Deadline) + n += 1 + l + sovStatus(uint64(l)) return n } @@ -9447,10 +9478,6 @@ func (m *Session) Size() (n int) { } l = github_com_gogo_protobuf_types.SizeOfStdTime(m.Start) n += 1 + l + sovStatus(uint64(l)) - if m.KvTxnID != nil { - l = m.KvTxnID.Size() - n += 1 + l + sovStatus(uint64(l)) - } l = len(m.LastActiveQuery) if l > 0 { n += 1 + l + sovStatus(uint64(l)) @@ -16273,6 +16300,93 @@ func (m *TxnInfo) Unmarshal(dAtA []byte) error { } m.TxnDescription = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumStatementsExecuted", wireType) + } + m.NumStatementsExecuted = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStatus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumStatementsExecuted |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumRetries", wireType) + } + m.NumRetries = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStatus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumRetries |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field NumAutoRetries", wireType) + } + m.NumAutoRetries = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStatus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.NumAutoRetries |= (int32(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Deadline", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowStatus + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthStatus + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Deadline, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipStatus(dAtA[iNdEx:]) @@ -16787,38 +16901,6 @@ func (m *Session) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KvTxnID", wireType) - } - var byteLen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowStatus - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - byteLen |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if byteLen < 0 { - return ErrInvalidLengthStatus - } - postIndex := iNdEx + byteLen - if postIndex > l { - return io.ErrUnexpectedEOF - } - var v github_com_cockroachdb_cockroach_pkg_util_uuid.UUID - m.KvTxnID = &v - if err := m.KvTxnID.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 8: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field LastActiveQuery", wireType) @@ -22045,383 +22127,387 @@ var ( ) func init() { - proto.RegisterFile("server/serverpb/status.proto", fileDescriptor_status_0225a3e6e509791f) -} - -var fileDescriptor_status_0225a3e6e509791f = []byte{ - // 5982 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7c, 0xdb, 0x6f, 0x1b, 0x49, - 0x76, 0xb7, 0x9b, 0xa4, 0x28, 0xf2, 0x50, 0x17, 0xaa, 0x2c, 0xc9, 0x34, 0xed, 0x11, 0xbd, 0xed, - 0x19, 0x8f, 0xed, 0x99, 0x21, 0x67, 0x3c, 0xe3, 0x1d, 0xef, 0x7c, 0x3b, 0xb3, 0xab, 0x9b, 0x6d, - 0xd9, 0x1a, 0x5b, 0x6e, 0x49, 0xdf, 0x7e, 0x98, 0xdd, 0x6f, 0xfa, 0x6b, 0xb2, 0x4b, 0x74, 0x5b, - 0x54, 0x37, 0xdd, 0xdd, 0xd4, 0x27, 0xee, 0xc4, 0x93, 0xcd, 0xe4, 0xb6, 0xd9, 0x6c, 0xf6, 0x96, - 0x4d, 0xb0, 0x0f, 0x09, 0x10, 0xec, 0x43, 0x36, 0x2f, 0x09, 0x36, 0xc8, 0x4b, 0x12, 0x20, 0x09, - 0x72, 0x41, 0xb2, 0x40, 0x80, 0x60, 0x81, 0xe4, 0x61, 0x91, 0x00, 0xda, 0x44, 0x93, 0x87, 0x00, - 0x41, 0xfe, 0x81, 0x05, 0x12, 0x04, 0x75, 0xaa, 0xba, 0x59, 0x4d, 0x52, 0x4d, 0x4a, 0x1a, 0x0f, - 0xf2, 0x30, 0x63, 0x76, 0x5d, 0x4e, 0xfd, 0xce, 0xa9, 0x53, 0xa7, 0x4e, 0x9d, 0x3a, 0x25, 0x38, - 0xef, 0x51, 0x77, 0x97, 0xba, 0x15, 0xfe, 0x4f, 0xb3, 0x5a, 0xf1, 0x7c, 0xc3, 0x6f, 0x79, 0xe5, - 0xa6, 0xeb, 0xf8, 0x0e, 0x39, 0x5b, 0x73, 0x6a, 0xdb, 0xae, 0x63, 0xd4, 0x1e, 0x96, 0x79, 0x83, - 0x72, 0xd0, 0xae, 0x98, 0xaf, 0xb6, 0xac, 0x86, 0x59, 0xb1, 0xec, 0x2d, 0x87, 0x37, 0x2e, 0x9e, - 0xae, 0x3b, 0x9e, 0x67, 0x35, 0x2b, 0xfc, 0x1f, 0x51, 0x38, 0xfb, 0xc8, 0xa9, 0x7a, 0x15, 0xf6, - 0xbf, 0x66, 0x15, 0xff, 0x11, 0xe5, 0x67, 0x90, 0x6a, 0xb3, 0x5a, 0x31, 0x9a, 0x4d, 0x9d, 0x8d, - 0x19, 0x54, 0x90, 0xa0, 0xc2, 0x34, 0x7c, 0x23, 0x20, 0x12, 0x94, 0xed, 0x50, 0xdf, 0x90, 0xca, - 0x2f, 0x09, 0xf0, 0xa6, 0x65, 0xd4, 0x6d, 0xc7, 0xf3, 0xad, 0x1a, 0x1b, 0x45, 0xfa, 0x12, 0xed, - 0x2e, 0x06, 0x4c, 0x22, 0x6f, 0xe2, 0x9f, 0x2e, 0x5e, 0x8b, 0xcf, 0x78, 0xbe, 0xe3, 0x1a, 0x75, - 0x5a, 0xa1, 0x76, 0xdd, 0xb2, 0x69, 0xb3, 0x2a, 0x7e, 0x88, 0xea, 0x73, 0x3d, 0xd5, 0x3b, 0xbb, - 0xb5, 0x9a, 0xa8, 0x9c, 0xeb, 0xa9, 0x74, 0x9d, 0xda, 0xb6, 0x67, 0x56, 0x45, 0xfd, 0x95, 0xed, - 0xdd, 0xca, 0xf6, 0xae, 0x40, 0x11, 0xfc, 0x68, 0x56, 0x2b, 0x0d, 0x6a, 0x78, 0x54, 0x8f, 0xc0, - 0x50, 0x0f, 0x69, 0xca, 0x1a, 0x05, 0x58, 0x9e, 0x3b, 0x8c, 0x9c, 0xb5, 0x4b, 0x6d, 0xea, 0x85, - 0xa2, 0x6c, 0xf9, 0x56, 0xa3, 0xd2, 0x70, 0xea, 0xec, 0x3f, 0x51, 0x56, 0xc4, 0xb2, 0x96, 0xed, - 0x52, 0xcf, 0x69, 0xec, 0x52, 0x53, 0x37, 0x4c, 0xd3, 0x0d, 0x58, 0xa4, 0x7e, 0xcd, 0xac, 0xb8, - 0xc6, 0x96, 0x8f, 0xff, 0x63, 0x5c, 0x18, 0x5b, 0xbe, 0xa8, 0x9c, 0xae, 0x3b, 0x75, 0x07, 0x7f, - 0x56, 0xd8, 0x2f, 0x51, 0x7a, 0xbe, 0xee, 0x38, 0xf5, 0x06, 0xad, 0x18, 0x4d, 0xab, 0x62, 0xd8, - 0xb6, 0xe3, 0x1b, 0xbe, 0xe5, 0xd8, 0x01, 0x80, 0x92, 0xa8, 0xc5, 0xaf, 0x6a, 0x6b, 0xab, 0xe2, - 0x5b, 0x3b, 0xd4, 0xf3, 0x8d, 0x1d, 0xa1, 0x1d, 0x6a, 0x19, 0x4e, 0x2f, 0x52, 0xd7, 0xb7, 0xb6, - 0xac, 0x9a, 0xe1, 0x53, 0x4f, 0xa3, 0x8f, 0x5b, 0xd4, 0xf3, 0xc9, 0x19, 0x18, 0xb5, 0x1d, 0x93, - 0xea, 0x96, 0x59, 0x50, 0x2e, 0x28, 0x97, 0xb3, 0x5a, 0x9a, 0x7d, 0xae, 0x98, 0xea, 0x7f, 0xa6, - 0x80, 0x48, 0x1d, 0x96, 0xa8, 0x6f, 0x58, 0x0d, 0x8f, 0x3c, 0x80, 0x94, 0xdf, 0x6e, 0x52, 0x6c, - 0x3c, 0x71, 0xed, 0xcd, 0xf2, 0xa1, 0x5a, 0x5b, 0xee, 0xed, 0x2c, 0x17, 0x6d, 0xb4, 0x9b, 0x54, - 0x43, 0x52, 0xe4, 0x22, 0x8c, 0x53, 0xd7, 0x75, 0x5c, 0x7d, 0x87, 0x7a, 0x9e, 0x51, 0xa7, 0x85, - 0x04, 0x02, 0x19, 0xc3, 0xc2, 0xb7, 0x79, 0x19, 0x21, 0x90, 0x62, 0xda, 0x58, 0x48, 0x5e, 0x50, - 0x2e, 0x8f, 0x69, 0xf8, 0x9b, 0x68, 0x90, 0xde, 0xb2, 0x68, 0xc3, 0xf4, 0x0a, 0xa9, 0x0b, 0xc9, - 0xcb, 0xb9, 0x6b, 0xaf, 0x1d, 0x0d, 0xcd, 0x4d, 0xec, 0xbb, 0x90, 0xfa, 0xc1, 0x7e, 0xe9, 0x94, - 0x26, 0x28, 0x15, 0xff, 0x20, 0x01, 0x69, 0x5e, 0x41, 0x66, 0x21, 0x6d, 0x79, 0x5e, 0x8b, 0xba, - 0x81, 0x64, 0xf8, 0x17, 0x29, 0xc0, 0xa8, 0xd7, 0xaa, 0x3e, 0xa2, 0x35, 0x5f, 0x20, 0x0d, 0x3e, - 0xc9, 0x33, 0x00, 0xbb, 0x46, 0xc3, 0x32, 0xf5, 0x2d, 0xd7, 0xd9, 0x41, 0xa8, 0x49, 0x2d, 0x8b, - 0x25, 0x37, 0x5d, 0x67, 0x87, 0x94, 0x20, 0xc7, 0xab, 0x5b, 0xb6, 0x6f, 0x35, 0x0a, 0x29, 0xac, - 0xe7, 0x3d, 0x36, 0x59, 0x09, 0x39, 0x0f, 0x59, 0xa6, 0x23, 0xd4, 0xf3, 0xa8, 0x57, 0x18, 0xb9, - 0x90, 0xbc, 0x9c, 0xd5, 0x3a, 0x05, 0xa4, 0x02, 0xa7, 0x3d, 0xab, 0x6e, 0x1b, 0x7e, 0xcb, 0xa5, - 0xba, 0xd1, 0xa8, 0x3b, 0xae, 0xe5, 0x3f, 0xdc, 0x29, 0xa4, 0x11, 0x03, 0x09, 0xab, 0xe6, 0x83, - 0x1a, 0x06, 0xa7, 0xd9, 0xaa, 0x36, 0xac, 0x9a, 0xbe, 0x4d, 0xdb, 0x85, 0x51, 0x6c, 0x97, 0xe5, - 0x25, 0x77, 0x69, 0x9b, 0x9c, 0x83, 0xec, 0x36, 0x6d, 0xeb, 0x2d, 0x94, 0x79, 0x06, 0x47, 0xcb, - 0x6c, 0xd3, 0xf6, 0x26, 0xca, 0xfb, 0x45, 0x20, 0x74, 0xcf, 0xa7, 0xb6, 0x49, 0x4d, 0xbd, 0xd3, - 0x2a, 0x8b, 0xad, 0xf2, 0x41, 0xcd, 0x5d, 0xd1, 0x5a, 0x7d, 0x00, 0x93, 0x5d, 0x73, 0x4b, 0xd2, - 0x90, 0x58, 0x9c, 0xcf, 0x9f, 0x22, 0x19, 0x48, 0xdd, 0xbb, 0xbf, 0xb4, 0x9c, 0x57, 0xc8, 0x38, - 0x64, 0x17, 0x57, 0x57, 0x96, 0xef, 0x6d, 0xe8, 0x8b, 0xf3, 0xf9, 0x04, 0x01, 0x48, 0xf3, 0xcf, - 0x7c, 0x92, 0x64, 0x61, 0x64, 0x73, 0x85, 0x15, 0xa7, 0x58, 0xbf, 0xcd, 0x95, 0xfc, 0x88, 0xea, - 0xc0, 0x74, 0x54, 0x5f, 0xbd, 0xa6, 0x63, 0x7b, 0x94, 0x7c, 0x0e, 0xc6, 0x6a, 0x52, 0x79, 0x41, - 0xc1, 0xa9, 0x7f, 0xe9, 0x48, 0x53, 0x2f, 0xe6, 0x3c, 0x42, 0x48, 0xad, 0xc0, 0x84, 0xa8, 0x1e, - 0xb4, 0x36, 0xee, 0xa4, 0x32, 0x89, 0x7c, 0x52, 0xbd, 0x07, 0xb0, 0xde, 0xf6, 0x7c, 0xba, 0xb3, - 0x62, 0x6f, 0x39, 0x6c, 0x72, 0x3d, 0xfc, 0xd2, 0x99, 0x9d, 0x16, 0x1d, 0xc0, 0x8b, 0x34, 0xd8, - 0xa6, 0xae, 0x4d, 0x1b, 0xbc, 0x01, 0x57, 0x1d, 0xe0, 0x45, 0xac, 0x81, 0xfa, 0xd5, 0x24, 0x4c, - 0x86, 0x08, 0x04, 0xb7, 0xef, 0x44, 0x21, 0x8c, 0x2c, 0xcc, 0x1f, 0xec, 0x97, 0xd2, 0xf7, 0x18, - 0x8c, 0xa5, 0x9f, 0xec, 0x97, 0x5e, 0xad, 0x5b, 0xfe, 0xc3, 0x56, 0xb5, 0x5c, 0x73, 0x76, 0x2a, - 0xa1, 0x00, 0xcc, 0x6a, 0xe7, 0x77, 0xa5, 0xb9, 0x5d, 0xaf, 0x08, 0x93, 0x5e, 0xe6, 0xdd, 0x02, - 0x2e, 0xc8, 0x5b, 0x30, 0x2a, 0x94, 0x0b, 0xc1, 0xe4, 0xae, 0xcd, 0x49, 0x42, 0x64, 0xb6, 0xab, - 0xbc, 0x19, 0xda, 0xae, 0x79, 0xd3, 0x74, 0x85, 0xd4, 0x82, 0x4e, 0xe4, 0x0d, 0x00, 0xdc, 0x98, - 0x38, 0x3f, 0x49, 0x24, 0x31, 0x23, 0x91, 0xc0, 0xca, 0x32, 0x63, 0x4d, 0xf4, 0xcc, 0x62, 0x09, - 0x0a, 0x63, 0x35, 0x2a, 0xad, 0x14, 0x76, 0x7e, 0x2e, 0x66, 0x12, 0x3b, 0x92, 0x16, 0xc4, 0x64, - 0xd1, 0xae, 0x43, 0xce, 0x7b, 0xdc, 0xd0, 0x03, 0x6e, 0x46, 0x86, 0xe2, 0x86, 0x30, 0x32, 0x07, - 0xfb, 0x25, 0x58, 0x7f, 0xb0, 0x3a, 0xcf, 0x7b, 0x6a, 0xe0, 0x3d, 0x6e, 0x88, 0xdf, 0xea, 0x04, - 0x8c, 0x31, 0x81, 0x05, 0xda, 0xa0, 0x7e, 0x3b, 0x09, 0xe3, 0xa2, 0x40, 0x4c, 0xce, 0x6d, 0x18, - 0x61, 0xa2, 0x0c, 0x74, 0xf0, 0xc5, 0x3e, 0xf0, 0xf9, 0x76, 0x13, 0xec, 0x82, 0x38, 0x03, 0xeb, - 0xf8, 0x21, 0xb8, 0xe0, 0x04, 0xc8, 0x9f, 0x2a, 0x70, 0x3a, 0xd8, 0x51, 0xf4, 0x6a, 0x5b, 0x0f, - 0xe6, 0x3c, 0x81, 0x84, 0xdf, 0x8a, 0x91, 0x4b, 0x04, 0x51, 0x79, 0x55, 0xd0, 0x58, 0x68, 0xe3, - 0x5c, 0x9b, 0xcb, 0xb6, 0xef, 0xb6, 0x17, 0xee, 0x0b, 0x4e, 0xf3, 0x5d, 0xd5, 0x4b, 0x1f, 0xfc, - 0xf8, 0x78, 0x1a, 0x94, 0x6f, 0x74, 0x8d, 0x53, 0xdc, 0x83, 0x99, 0xbe, 0x63, 0x93, 0x3c, 0x24, - 0x99, 0xf1, 0x41, 0xe5, 0xd5, 0xd8, 0x4f, 0xb2, 0x02, 0x23, 0xbb, 0x46, 0xa3, 0xc5, 0xcd, 0xfc, - 0xc4, 0xb5, 0x57, 0x25, 0xe6, 0xb6, 0x77, 0xcb, 0xc1, 0x16, 0x5b, 0x16, 0xdb, 0xbc, 0x18, 0x34, - 0x20, 0xce, 0x85, 0xa7, 0x71, 0x0a, 0x6f, 0x24, 0x6e, 0x28, 0xea, 0x25, 0xc8, 0xb1, 0x06, 0x03, - 0xf7, 0xb3, 0xef, 0xa7, 0x20, 0xab, 0x19, 0x5b, 0x3e, 0xa3, 0xc0, 0xcc, 0x1b, 0xb8, 0xb4, 0xd9, - 0xb0, 0x6a, 0x46, 0xd0, 0x32, 0xb5, 0x30, 0x7e, 0xb0, 0x5f, 0xca, 0x6a, 0xbc, 0x74, 0x65, 0x49, - 0xcb, 0x8a, 0x06, 0x2b, 0x26, 0xf9, 0x24, 0xc0, 0x43, 0xc3, 0x35, 0xd1, 0x7b, 0xa0, 0x62, 0xb1, - 0x4c, 0x95, 0xf9, 0xc6, 0x5d, 0xbe, 0x6d, 0xb8, 0x26, 0x12, 0x0d, 0xb4, 0xfc, 0x61, 0x50, 0xc0, - 0x36, 0xad, 0x06, 0x35, 0x4c, 0x5c, 0x1b, 0x29, 0x0d, 0x7f, 0x93, 0x69, 0x18, 0xe1, 0x64, 0x52, - 0x08, 0x8f, 0x7f, 0xb0, 0x3d, 0xc5, 0x68, 0x36, 0x1b, 0x16, 0x35, 0x51, 0x7b, 0x53, 0x5a, 0xf0, - 0x49, 0x36, 0x20, 0xd3, 0x74, 0x9d, 0x3a, 0x2a, 0x76, 0x1a, 0xd5, 0xe1, 0x5a, 0x8c, 0x3a, 0x84, - 0x1c, 0x96, 0xd7, 0x44, 0x27, 0xae, 0x02, 0x1c, 0x5a, 0x48, 0x89, 0x3c, 0x0f, 0x93, 0x0c, 0x8d, - 0xee, 0xbb, 0x86, 0xed, 0x6d, 0x51, 0x97, 0x52, 0xdc, 0x1f, 0x52, 0xda, 0x04, 0x2b, 0xde, 0x08, - 0x4b, 0x8b, 0xbf, 0xa2, 0x40, 0x26, 0x20, 0xc5, 0xb0, 0xef, 0x18, 0x7e, 0xed, 0x21, 0x17, 0x98, - 0xc6, 0x3f, 0x18, 0x97, 0x36, 0xdd, 0xe3, 0x9b, 0x61, 0x4a, 0xc3, 0xdf, 0x1d, 0x2e, 0x93, 0x32, - 0x97, 0xb3, 0x90, 0x6e, 0x1a, 0x2d, 0x8f, 0x9a, 0xc8, 0x7c, 0x46, 0x13, 0x5f, 0xe4, 0x0a, 0xe4, - 0x9b, 0xd4, 0x36, 0x2d, 0xbb, 0xae, 0x7b, 0xb6, 0xd1, 0xf4, 0x1e, 0x3a, 0xbe, 0x10, 0xc3, 0xa4, - 0x28, 0x5f, 0x17, 0xc5, 0xc5, 0x47, 0x30, 0x1e, 0xe1, 0x4c, 0x56, 0xb0, 0x14, 0x57, 0xb0, 0x45, - 0x59, 0xc1, 0xe2, 0xb7, 0x86, 0x5e, 0x71, 0xc9, 0xaa, 0x75, 0x90, 0x80, 0x71, 0xcd, 0xb0, 0xeb, - 0x74, 0xcd, 0x75, 0xaa, 0x0d, 0xba, 0xe3, 0x91, 0x0b, 0x90, 0x6b, 0xd9, 0xc6, 0xae, 0x61, 0x35, - 0x8c, 0x6a, 0x83, 0x3b, 0x41, 0x19, 0x4d, 0x2e, 0x22, 0xd7, 0xe1, 0x0c, 0x93, 0x20, 0x75, 0x75, - 0xdb, 0xf1, 0x75, 0xee, 0x74, 0x3e, 0x74, 0x1a, 0x26, 0x75, 0x11, 0x4e, 0x46, 0x9b, 0xe6, 0xd5, - 0xf7, 0x1c, 0x7f, 0x95, 0x55, 0xde, 0xc6, 0x3a, 0xf2, 0x2c, 0x4c, 0xd8, 0x8e, 0xce, 0x34, 0x4a, - 0xe7, 0xf5, 0x28, 0xb8, 0x8c, 0x36, 0x66, 0x3b, 0x0c, 0xe3, 0x2a, 0x96, 0x91, 0xcb, 0x30, 0xd9, - 0xb2, 0x4d, 0xea, 0x0a, 0xcd, 0xf4, 0x43, 0x41, 0x76, 0x17, 0x93, 0xb3, 0x90, 0xb1, 0x1d, 0x3e, - 0x3c, 0x4a, 0x32, 0xa3, 0x8d, 0xda, 0x0e, 0x0e, 0x48, 0x6e, 0x40, 0xe1, 0x71, 0xcb, 0xa2, 0x5e, - 0x8d, 0xda, 0xbe, 0x4e, 0x1f, 0xb7, 0x8c, 0x86, 0xa7, 0xfb, 0x56, 0x6d, 0xdb, 0xb2, 0xeb, 0xe8, - 0x4b, 0x64, 0xb4, 0xd9, 0xb0, 0x7e, 0x19, 0xab, 0x37, 0x78, 0x2d, 0x79, 0x01, 0x08, 0x47, 0xe8, - 0xd4, 0x75, 0xdf, 0x71, 0xf4, 0x86, 0xe1, 0xd6, 0xb9, 0xde, 0x64, 0xb4, 0x49, 0x56, 0xb3, 0xea, - 0xd4, 0x37, 0x1c, 0x67, 0x95, 0x15, 0x93, 0x4b, 0x30, 0xe1, 0xec, 0x46, 0xa0, 0x66, 0xb0, 0x61, - 0x57, 0xa9, 0xba, 0x0d, 0x93, 0x28, 0x63, 0x36, 0x0d, 0x16, 0x9e, 0x24, 0x98, 0xef, 0xf1, 0xb8, - 0x45, 0x5d, 0x8b, 0x7a, 0x7a, 0x93, 0xba, 0xba, 0x47, 0x6b, 0x8e, 0xcd, 0x17, 0xa9, 0xa2, 0xe5, - 0x45, 0xcd, 0x1a, 0x75, 0xd7, 0xb1, 0x9c, 0x5c, 0x85, 0xa9, 0xff, 0xef, 0x5a, 0x7e, 0xb4, 0x71, - 0x02, 0x1b, 0x4f, 0xf2, 0x8a, 0xb0, 0xad, 0x7a, 0x1b, 0x60, 0xcd, 0xa5, 0xbe, 0xdf, 0x5e, 0x6f, - 0x1a, 0x36, 0x73, 0x80, 0x3c, 0xdf, 0x70, 0x7d, 0x3d, 0x50, 0xa0, 0xac, 0x96, 0xc1, 0x02, 0xe6, - 0x1d, 0x9d, 0x81, 0x51, 0x6a, 0xa3, 0xef, 0x23, 0xb6, 0xea, 0x34, 0xb5, 0x99, 0xc3, 0xf3, 0x46, - 0xea, 0xdf, 0x7e, 0xab, 0xa4, 0xa8, 0x5f, 0xcd, 0x30, 0x73, 0x62, 0xd7, 0x29, 0x6e, 0x40, 0x9f, - 0x81, 0x94, 0xd7, 0x34, 0x6c, 0x24, 0x12, 0xbf, 0x8f, 0x75, 0x86, 0x17, 0x6b, 0x12, 0x3b, 0x92, - 0x15, 0x00, 0x14, 0xad, 0x6c, 0x61, 0x9e, 0x1d, 0x46, 0x71, 0x03, 0xa3, 0xe3, 0x86, 0xa6, 0xed, - 0xa6, 0x6c, 0x60, 0x72, 0xd7, 0xae, 0x0e, 0xb4, 0xaf, 0x21, 0x1b, 0xc1, 0x9e, 0xc4, 0x17, 0xeb, - 0x0e, 0x4c, 0x78, 0x4e, 0xcb, 0xad, 0xd1, 0x70, 0x37, 0x1a, 0x41, 0x0f, 0xe4, 0xd6, 0xc1, 0x7e, - 0x69, 0x6c, 0x1d, 0x6b, 0x4e, 0xe6, 0x87, 0x8c, 0x79, 0x1d, 0x22, 0x26, 0x79, 0x0c, 0x93, 0x62, - 0x38, 0x86, 0x0c, 0xc7, 0x4b, 0xe3, 0x78, 0x2b, 0x07, 0xfb, 0xa5, 0x71, 0x3e, 0xde, 0x3a, 0xab, - 0xc1, 0x01, 0x5f, 0x3b, 0xd2, 0x80, 0xa2, 0x9f, 0x36, 0xee, 0x49, 0x64, 0xcc, 0xde, 0x83, 0xc7, - 0x68, 0x9f, 0x83, 0xc7, 0x22, 0x8c, 0x8b, 0x55, 0x6c, 0x31, 0x60, 0x6d, 0xf4, 0x94, 0x73, 0xd7, - 0x0a, 0x92, 0x58, 0x83, 0x61, 0x70, 0x7d, 0x05, 0xbe, 0x25, 0x76, 0xba, 0xcd, 0xfb, 0x90, 0x3b, - 0x68, 0xc4, 0xd1, 0x86, 0x14, 0xb2, 0x38, 0x2d, 0x97, 0x63, 0x27, 0x57, 0xb2, 0x39, 0x92, 0xe9, - 0xe6, 0x36, 0x48, 0xcc, 0xaf, 0x57, 0x80, 0x9e, 0xf9, 0xed, 0x4b, 0xa8, 0xb3, 0xb0, 0xe4, 0xf9, - 0xf5, 0xc8, 0x17, 0x60, 0xbc, 0xc1, 0xec, 0x37, 0xf5, 0xf4, 0x86, 0x53, 0x33, 0x1a, 0x85, 0x1c, - 0xd2, 0x7b, 0x65, 0xa0, 0xbe, 0xac, 0xb2, 0x5e, 0x6f, 0x1b, 0xb6, 0x51, 0xa7, 0xae, 0xa4, 0x36, - 0x63, 0x82, 0xda, 0x2a, 0x23, 0x46, 0xde, 0x85, 0x89, 0x80, 0x7a, 0xbd, 0xe1, 0x54, 0x8d, 0x46, - 0x61, 0xec, 0x64, 0xe4, 0x03, 0xb0, 0xb7, 0x90, 0x1a, 0xd9, 0x84, 0x31, 0xf9, 0x44, 0x5f, 0x18, - 0x47, 0xea, 0x2f, 0x0e, 0xa6, 0xce, 0x3a, 0x45, 0x5c, 0xb0, 0x5c, 0xa3, 0x53, 0xc4, 0x4e, 0x60, - 0xa1, 0xf1, 0x2b, 0x4c, 0xa0, 0xc1, 0xea, 0x14, 0xb0, 0x5d, 0x3a, 0xb0, 0x94, 0x93, 0xdc, 0xa8, - 0x8a, 0x4f, 0xf5, 0x97, 0x15, 0xb1, 0x55, 0x0c, 0x3c, 0x3c, 0x10, 0x03, 0xb2, 0x2e, 0x6b, 0xa9, - 0x5b, 0xa6, 0x87, 0x0e, 0x5e, 0x72, 0x61, 0xe9, 0x60, 0xbf, 0x94, 0xe1, 0xcb, 0x70, 0xc9, 0x3b, - 0xb2, 0x76, 0x8b, 0x8e, 0x5a, 0x06, 0xc9, 0xae, 0x98, 0x9e, 0xba, 0x01, 0x13, 0x01, 0x18, 0xe1, - 0xaa, 0x2e, 0x40, 0x1a, 0x6b, 0x03, 0x5f, 0xf5, 0xd9, 0x41, 0x5a, 0x23, 0x49, 0x5e, 0xf4, 0x54, - 0x2f, 0xc3, 0xf8, 0x2d, 0x8c, 0x37, 0x0d, 0xf4, 0xb5, 0xbe, 0x9b, 0x80, 0xc9, 0x65, 0x0c, 0xcf, - 0x30, 0xb1, 0x7a, 0x68, 0x22, 0xdf, 0x85, 0x4c, 0xb8, 0xb0, 0xf9, 0x51, 0x66, 0xf1, 0x60, 0xbf, - 0x34, 0x7a, 0xd2, 0x25, 0x3d, 0xea, 0x89, 0xc5, 0xbc, 0x05, 0xb3, 0x6c, 0x32, 0xa8, 0xeb, 0xe9, - 0x86, 0x6d, 0xf2, 0xd5, 0x5a, 0x77, 0x8d, 0x9d, 0xe0, 0x70, 0xf3, 0xb2, 0xcc, 0x31, 0x57, 0x87, - 0x72, 0x10, 0x42, 0x2a, 0x6f, 0xf0, 0x9e, 0xf3, 0xb6, 0x79, 0x3b, 0xec, 0xa7, 0x4d, 0xfb, 0x7d, - 0x4a, 0xc9, 0x2d, 0xc8, 0xf1, 0x6e, 0x3a, 0xc6, 0x41, 0x92, 0xe8, 0xc4, 0x5e, 0x8a, 0x23, 0xce, - 0x25, 0x81, 0x01, 0x0f, 0xa0, 0xe1, 0x6f, 0xf5, 0x25, 0x20, 0x92, 0x8c, 0x06, 0xca, 0xf4, 0xff, - 0xc2, 0xe9, 0x48, 0x73, 0x31, 0xb1, 0xa1, 0x35, 0xe0, 0xf3, 0x1a, 0x67, 0x0d, 0xba, 0x66, 0x24, - 0x62, 0x0d, 0xd4, 0xff, 0x07, 0xb0, 0xe1, 0x1a, 0x35, 0xba, 0xbc, 0xcb, 0x14, 0xfd, 0x06, 0xa4, - 0x7c, 0x6b, 0x87, 0x8a, 0xfd, 0xac, 0x58, 0xe6, 0xc1, 0xa5, 0x72, 0x10, 0x5c, 0x2a, 0x6f, 0x04, - 0xc1, 0xa5, 0x85, 0x0c, 0x23, 0xf2, 0x8d, 0x1f, 0x97, 0x14, 0x0d, 0x7b, 0xb0, 0x25, 0x12, 0x0d, - 0xe3, 0x04, 0x9f, 0xea, 0xf7, 0x15, 0x98, 0x9c, 0x6f, 0x30, 0x53, 0xe3, 0x3b, 0xee, 0x92, 0xdb, - 0xd6, 0x5a, 0x36, 0x53, 0x8a, 0x60, 0x2d, 0xe0, 0x58, 0x49, 0xae, 0x14, 0x42, 0xa3, 0x8f, 0xbd, - 0x12, 0x46, 0xc5, 0x4a, 0x20, 0x6f, 0x42, 0x9a, 0x32, 0x86, 0x3c, 0x71, 0x92, 0x8a, 0xdb, 0x99, - 0x3b, 0xec, 0x6b, 0xa2, 0x93, 0x7a, 0x0d, 0x66, 0x42, 0xc4, 0x48, 0x3b, 0x98, 0xa5, 0xb3, 0xdd, - 0xb8, 0xc3, 0x21, 0xd5, 0x3f, 0x52, 0x60, 0xb6, 0xbb, 0x53, 0xff, 0xc3, 0x7c, 0xf2, 0xa3, 0x3c, - 0xcc, 0x2f, 0xc2, 0xa8, 0xe9, 0xb6, 0x75, 0xb7, 0x65, 0x0b, 0x7d, 0x8f, 0xd3, 0x84, 0xae, 0x69, - 0xd0, 0xd2, 0x26, 0xfe, 0xab, 0x7e, 0x4d, 0x81, 0x7c, 0x07, 0xfb, 0xff, 0x00, 0x43, 0xf6, 0x0e, - 0x4c, 0x49, 0x78, 0x84, 0x18, 0x97, 0x21, 0x23, 0x58, 0x1d, 0x46, 0xeb, 0xbb, 0x79, 0x1d, 0xe5, - 0xbc, 0x7a, 0xaa, 0x0a, 0x63, 0x77, 0xd6, 0xef, 0xdf, 0x0b, 0xc9, 0x06, 0x11, 0x46, 0xa5, 0x13, - 0x61, 0x54, 0x77, 0x60, 0x3c, 0xa8, 0x5f, 0x66, 0x4e, 0x01, 0x3b, 0xd7, 0xa0, 0x77, 0x20, 0x44, - 0xc1, 0x3f, 0x58, 0xd7, 0x9a, 0x63, 0x72, 0x8d, 0x1f, 0xd1, 0xf0, 0xb7, 0xbc, 0x10, 0x92, 0x91, - 0x85, 0xc0, 0x6a, 0x4c, 0x1e, 0xe6, 0xc1, 0xb8, 0x65, 0x56, 0x0b, 0x3e, 0xd5, 0x0f, 0x15, 0xc8, - 0xad, 0x3a, 0xf5, 0xc1, 0x7b, 0xc8, 0x34, 0x8c, 0x34, 0xe8, 0x2e, 0x6d, 0x88, 0x35, 0xc6, 0x3f, - 0xc8, 0x33, 0x00, 0xdc, 0x9f, 0xc5, 0xb5, 0xcb, 0x47, 0xe5, 0x1e, 0x2e, 0x5b, 0xaf, 0x4c, 0x69, - 0x99, 0x47, 0x8b, 0x95, 0xfc, 0xf0, 0xc9, 0x3c, 0x5c, 0xac, 0xca, 0x43, 0x72, 0xc7, 0xd8, 0x43, - 0x07, 0x2f, 0xab, 0xb1, 0x9f, 0x0c, 0x64, 0xd3, 0xf0, 0x7d, 0xea, 0xda, 0x22, 0xc0, 0x18, 0x7c, - 0xb2, 0x43, 0x9c, 0x4b, 0x4d, 0xa3, 0xe6, 0x0b, 0xcf, 0x5f, 0x7c, 0xb1, 0x23, 0xe5, 0x36, 0xa5, - 0x4d, 0x9d, 0x7f, 0xe2, 0xf9, 0x48, 0x78, 0xfc, 0xac, 0x58, 0x0b, 0x4b, 0xd5, 0xfb, 0x40, 0x56, - 0x9d, 0x3a, 0x3b, 0xbd, 0x59, 0xd2, 0x0e, 0xf5, 0x29, 0xe6, 0x6f, 0x63, 0x91, 0x98, 0xd4, 0xb3, - 0xdd, 0xf1, 0x9b, 0x86, 0x53, 0x2f, 0xcb, 0xa7, 0xd9, 0xa0, 0xbd, 0x5a, 0x86, 0xd3, 0xab, 0x4e, - 0xfd, 0xa6, 0xd5, 0xa0, 0xde, 0xaa, 0xe5, 0xf9, 0x03, 0x4d, 0xe9, 0x1a, 0x4c, 0x47, 0xdb, 0x0b, - 0x08, 0x37, 0x60, 0x64, 0x8b, 0x15, 0x0a, 0x00, 0xe7, 0xfb, 0x01, 0x60, 0xbd, 0x64, 0xeb, 0x89, - 0x1d, 0xd4, 0xf7, 0x61, 0x42, 0x50, 0x1c, 0x38, 0x75, 0x04, 0x52, 0xac, 0x8f, 0x98, 0x39, 0xfc, - 0x2d, 0x89, 0x34, 0x39, 0x48, 0xa4, 0xa9, 0xbe, 0x22, 0xad, 0xc1, 0xf8, 0xba, 0x6f, 0xd4, 0xb6, - 0x07, 0x6b, 0xce, 0xa7, 0x44, 0xfc, 0x9e, 0x07, 0x5f, 0x62, 0x23, 0x6e, 0x48, 0xb0, 0x13, 0xa7, - 0x57, 0xd7, 0x21, 0xc5, 0x38, 0xc4, 0xf3, 0xbe, 0x21, 0x36, 0x87, 0xac, 0x86, 0xbf, 0xd9, 0x51, - 0x8a, 0x71, 0xa2, 0x7b, 0xd6, 0x17, 0x39, 0xed, 0xa4, 0x96, 0x61, 0x05, 0xeb, 0xd6, 0x17, 0x29, - 0x29, 0x42, 0xa6, 0xe6, 0xd8, 0x3e, 0xda, 0x61, 0x1e, 0xbf, 0x0f, 0xbf, 0xd5, 0xdf, 0x50, 0x60, - 0xf2, 0x16, 0xf5, 0x71, 0x32, 0x06, 0x82, 0x3f, 0x07, 0xd9, 0x86, 0xe5, 0xf9, 0xba, 0x63, 0x37, - 0xda, 0xe2, 0x38, 0x9d, 0x61, 0x05, 0xf7, 0xed, 0x46, 0x9b, 0xbc, 0x2e, 0x38, 0x1b, 0x41, 0xce, - 0x2e, 0xc6, 0x70, 0xc6, 0x06, 0x93, 0xee, 0x1f, 0x8a, 0x90, 0x11, 0xba, 0xcd, 0x23, 0x2c, 0x59, - 0x2d, 0xfc, 0x56, 0x57, 0x20, 0xdf, 0x41, 0x27, 0xd4, 0xe4, 0x7a, 0x54, 0x4d, 0x4a, 0x03, 0x46, - 0x0a, 0x74, 0xe4, 0xbb, 0x0a, 0x4c, 0xac, 0xb9, 0xce, 0xd6, 0x30, 0x4a, 0xb2, 0x10, 0xe1, 0xa5, - 0x1c, 0x7b, 0x9e, 0x94, 0x29, 0x96, 0x25, 0xb6, 0x0a, 0x30, 0xca, 0x0f, 0xc3, 0x1e, 0x3f, 0x48, - 0x69, 0xc1, 0xa7, 0x7a, 0x16, 0x52, 0x18, 0xa2, 0xcf, 0x40, 0xea, 0xf6, 0xf2, 0xfc, 0x5a, 0xfe, - 0x14, 0x19, 0x85, 0xe4, 0xe2, 0xda, 0x66, 0x5e, 0x51, 0xaf, 0xc0, 0xc4, 0xdb, 0xd4, 0x77, 0xad, - 0xda, 0x60, 0x87, 0xe4, 0x77, 0xd1, 0xe5, 0xdd, 0xf2, 0xd1, 0x6a, 0xb3, 0xdd, 0xe8, 0xa9, 0x06, - 0xab, 0x3f, 0x0b, 0x23, 0xb8, 0x2b, 0x0c, 0x75, 0x36, 0xee, 0x3a, 0xcf, 0x62, 0x47, 0xf5, 0x2a, - 0x73, 0x8a, 0x05, 0x5c, 0x6e, 0xcc, 0x25, 0x13, 0xad, 0x44, 0x7d, 0x95, 0x2f, 0x25, 0x60, 0x32, - 0x6c, 0x2c, 0x8e, 0x06, 0x4f, 0xdb, 0x57, 0xb9, 0x05, 0x69, 0xdc, 0x4d, 0x02, 0x5f, 0xe5, 0xca, - 0x80, 0xe3, 0x7f, 0x87, 0x91, 0xc0, 0x4f, 0xe7, 0xdd, 0xc9, 0x52, 0x10, 0x96, 0x4e, 0x22, 0x9d, - 0xcb, 0xc3, 0xd0, 0x61, 0xd2, 0x8e, 0x84, 0xa4, 0xd5, 0x16, 0xe4, 0x59, 0xed, 0x12, 0xad, 0xb6, - 0xea, 0x81, 0x2e, 0x44, 0x76, 0x7c, 0xe5, 0xa9, 0xec, 0xf8, 0xff, 0x90, 0x80, 0x29, 0x69, 0x5c, - 0xb1, 0xe4, 0xbe, 0xa6, 0x74, 0x9d, 0x5f, 0x6e, 0x0c, 0x60, 0x2a, 0xd2, 0x9d, 0x0f, 0x23, 0x22, - 0xa1, 0x9f, 0x66, 0x4c, 0x7e, 0xf0, 0xe3, 0x63, 0x02, 0x15, 0x28, 0x3e, 0xb2, 0xc9, 0x2a, 0x52, - 0xc8, 0x49, 0xe8, 0xe4, 0x68, 0x66, 0x92, 0x47, 0x33, 0x3f, 0x1b, 0x8d, 0x66, 0x5e, 0x1d, 0x66, - 0xa0, 0xde, 0x28, 0xf9, 0x9f, 0x2b, 0x30, 0xba, 0xb1, 0x67, 0xe3, 0x49, 0xec, 0x01, 0x24, 0x84, - 0x0a, 0x8f, 0x2d, 0xcc, 0x33, 0x30, 0xff, 0x38, 0xec, 0xda, 0xe4, 0x17, 0xda, 0x2d, 0xcb, 0x2c, - 0x6f, 0x6e, 0xae, 0xb0, 0x99, 0x4f, 0xac, 0x2c, 0x69, 0x09, 0xcb, 0x24, 0x6f, 0xe0, 0x29, 0xc4, - 0xf5, 0x05, 0xc8, 0xe1, 0x0e, 0x0c, 0xbc, 0x0b, 0xdb, 0xe4, 0xfc, 0x3d, 0x5b, 0x37, 0xa9, 0x57, - 0x73, 0xad, 0xa6, 0x6f, 0x39, 0xb6, 0x70, 0x5d, 0x26, 0xfc, 0x3d, 0x7b, 0xa9, 0x53, 0xaa, 0xfe, - 0x57, 0x02, 0x72, 0xf3, 0x35, 0xdf, 0xda, 0xa5, 0x0f, 0x5a, 0xd4, 0x6d, 0x93, 0xd9, 0x90, 0x8f, - 0xec, 0x42, 0x5a, 0x02, 0x93, 0x87, 0xa4, 0xf7, 0x38, 0x70, 0x8d, 0xd8, 0xcf, 0x0e, 0xbc, 0xe4, - 0xd1, 0xe1, 0x3d, 0x07, 0x13, 0x96, 0xa7, 0x9b, 0x96, 0xe7, 0xbb, 0x56, 0xb5, 0xd5, 0x09, 0xb9, - 0x8e, 0x5b, 0xde, 0x52, 0xa7, 0x90, 0x2c, 0xc0, 0x48, 0xf3, 0x61, 0x10, 0x6d, 0x9d, 0xe8, 0x7b, - 0x17, 0x14, 0x7a, 0xa4, 0x1d, 0x1e, 0xca, 0x6b, 0xac, 0x8f, 0xc6, 0xbb, 0xe2, 0x46, 0xd4, 0x09, - 0xf5, 0x2b, 0x97, 0x13, 0x52, 0xc0, 0xfe, 0xf3, 0x90, 0x66, 0x52, 0xb2, 0x4c, 0xf4, 0xba, 0xc6, - 0x16, 0x96, 0x4e, 0x36, 0x71, 0x23, 0x4c, 0x19, 0x96, 0xb4, 0x11, 0x7f, 0xcf, 0x5e, 0x31, 0xd5, - 0xe7, 0x60, 0x04, 0x81, 0x90, 0x71, 0xc8, 0xae, 0x69, 0xcb, 0x6b, 0xf3, 0xda, 0xca, 0xbd, 0x5b, - 0xf9, 0x53, 0xec, 0x73, 0xf9, 0xff, 0x2c, 0x2f, 0x6e, 0x6e, 0xb0, 0x4f, 0x45, 0x7d, 0x05, 0x4e, - 0x33, 0x7f, 0x69, 0x9d, 0x7a, 0x9e, 0xe5, 0xd8, 0xe1, 0x0e, 0x51, 0x84, 0x4c, 0xcb, 0xa3, 0xae, - 0xe4, 0x13, 0x84, 0xdf, 0xea, 0xb7, 0x47, 0x60, 0x54, 0xb4, 0x7f, 0xaa, 0xdb, 0x83, 0x8c, 0x21, - 0x11, 0xc5, 0xc0, 0x66, 0xb0, 0xd6, 0xb0, 0xa8, 0xed, 0x87, 0x17, 0x84, 0x5c, 0xbf, 0xc6, 0x79, - 0xa9, 0xb8, 0xef, 0x23, 0x57, 0x20, 0x8f, 0x77, 0x2e, 0x35, 0xcc, 0xab, 0xd0, 0x91, 0x14, 0x77, - 0x93, 0x27, 0xa5, 0xf2, 0x7b, 0x8c, 0xe2, 0x3a, 0x4c, 0x18, 0x38, 0x89, 0xba, 0x88, 0x46, 0xe3, - 0x65, 0x7d, 0x2e, 0x1a, 0x06, 0x38, 0x7c, 0xd6, 0x83, 0x88, 0x96, 0x11, 0x16, 0x59, 0xd4, 0xeb, - 0x28, 0x69, 0xfa, 0xe8, 0x4a, 0xfa, 0x2e, 0x64, 0xb7, 0x77, 0xf5, 0x88, 0x82, 0x2c, 0x1c, 0x5f, - 0x39, 0x46, 0xef, 0xee, 0x72, 0xf5, 0x18, 0xdd, 0xc6, 0x1f, 0x18, 0x63, 0x6f, 0x18, 0x9e, 0xaf, - 0x4b, 0x5c, 0xb7, 0xd1, 0xbb, 0xcf, 0x6a, 0x93, 0xac, 0xa2, 0x77, 0x59, 0x66, 0x11, 0x84, 0xbc, - 0x2c, 0x4b, 0x90, 0x33, 0xd8, 0x59, 0x4c, 0xaf, 0xb6, 0x7d, 0xca, 0xa3, 0x97, 0x49, 0x0d, 0xb0, - 0x68, 0x81, 0x95, 0x90, 0x4b, 0x30, 0xb9, 0x63, 0xec, 0xe9, 0x72, 0xa3, 0x1c, 0x36, 0x1a, 0xdf, - 0x31, 0xf6, 0xe6, 0x3b, 0xed, 0xe6, 0x01, 0x04, 0x0e, 0x7f, 0xcf, 0x16, 0x61, 0x45, 0x35, 0xee, - 0x60, 0xcf, 0xed, 0x9e, 0x96, 0xe5, 0xbd, 0x36, 0xf6, 0x6c, 0xf5, 0x97, 0x14, 0x98, 0x92, 0x55, - 0x99, 0xfb, 0x03, 0x4f, 0x53, 0x41, 0x0f, 0x8f, 0x8b, 0xfc, 0x8e, 0x02, 0xd3, 0xd1, 0x65, 0x25, - 0x36, 0xbd, 0x25, 0xc8, 0x78, 0xa2, 0x4c, 0xec, 0x7a, 0x71, 0x5c, 0x8a, 0xee, 0x41, 0xb8, 0x38, - 0xe8, 0x49, 0xee, 0x74, 0xed, 0x54, 0x71, 0x96, 0xa9, 0x47, 0x24, 0xd1, 0xcd, 0x4a, 0x7d, 0x0c, - 0x64, 0xd1, 0xb0, 0x6b, 0xb4, 0x81, 0x33, 0x3d, 0xd0, 0x8b, 0xbd, 0x04, 0x19, 0xd4, 0x14, 0x7e, - 0x93, 0xcd, 0xcc, 0x74, 0x8e, 0x69, 0x17, 0x76, 0x66, 0xda, 0x85, 0x95, 0x5d, 0x8b, 0x37, 0xd9, - 0x65, 0x40, 0x6e, 0xc1, 0xe9, 0xc8, 0x90, 0x42, 0x36, 0xec, 0x48, 0x81, 0xc5, 0xd4, 0x14, 0xb7, - 0x70, 0xe1, 0x77, 0xe7, 0x8c, 0x9e, 0x90, 0xce, 0xe8, 0x6a, 0x1b, 0xa6, 0x39, 0x21, 0xc1, 0xe0, - 0x40, 0xf4, 0x2f, 0x02, 0x08, 0x21, 0x06, 0xf8, 0xc7, 0xf8, 0x15, 0xb1, 0x20, 0xb0, 0xb2, 0xa4, - 0x65, 0x45, 0x83, 0x01, 0x3c, 0xac, 0xc0, 0x4c, 0xd7, 0xd0, 0xc7, 0xe6, 0xe2, 0x9f, 0x14, 0xc8, - 0xaf, 0x37, 0x0d, 0x3b, 0x12, 0x33, 0xbc, 0xd8, 0xc5, 0xc2, 0x02, 0x74, 0xf4, 0x36, 0x64, 0x47, - 0x93, 0x2f, 0xbb, 0x38, 0x37, 0xd7, 0x7f, 0xb2, 0x5f, 0x7a, 0xe5, 0x68, 0x6e, 0xd0, 0x5d, 0xda, - 0x96, 0xee, 0xc8, 0xee, 0x75, 0xee, 0xc8, 0x92, 0x27, 0xa1, 0x28, 0xae, 0xd6, 0xd4, 0x3f, 0x54, - 0x60, 0x4a, 0xe2, 0x4e, 0x48, 0x69, 0x15, 0x72, 0xbe, 0xe3, 0x1b, 0x0d, 0x3d, 0x08, 0x74, 0xf6, - 0xdc, 0xb1, 0x75, 0x47, 0x5c, 0xdf, 0xfe, 0xdf, 0x8b, 0x8b, 0x48, 0x23, 0xc8, 0x15, 0xc1, 0xfe, - 0x58, 0xc2, 0xcc, 0x10, 0xf7, 0x61, 0x6b, 0x4e, 0xcb, 0xf6, 0x45, 0xc8, 0x06, 0xb0, 0x68, 0x91, - 0x95, 0x90, 0xd7, 0x60, 0xd6, 0x68, 0x36, 0x5d, 0x67, 0xcf, 0xda, 0x31, 0x7c, 0xca, 0x76, 0xfe, - 0x6d, 0x61, 0x8d, 0xf8, 0x35, 0xfe, 0xb4, 0x54, 0xbb, 0x64, 0x79, 0xdb, 0x68, 0x94, 0xd4, 0xff, - 0x05, 0xd3, 0xe2, 0xc6, 0x26, 0x7a, 0x0d, 0x30, 0xcc, 0xdc, 0xa8, 0xdf, 0x19, 0x87, 0x99, 0xae, - 0xde, 0xbd, 0x21, 0xc3, 0xcc, 0x47, 0x6d, 0x92, 0xfe, 0x5a, 0x81, 0xd3, 0xc1, 0xad, 0x92, 0x9c, - 0x74, 0x92, 0x45, 0x3b, 0x71, 0x33, 0xfe, 0xd0, 0xd9, 0x8b, 0xb5, 0x1c, 0xde, 0x58, 0xf5, 0x4f, - 0x3e, 0xe9, 0xaa, 0x3e, 0x7e, 0xf2, 0x49, 0xb3, 0x6b, 0x9c, 0xe2, 0xdf, 0x65, 0x79, 0xaa, 0x4e, - 0x78, 0x4d, 0xdf, 0x73, 0xb1, 0xa7, 0xf4, 0xb9, 0xd8, 0xfb, 0x59, 0x05, 0x66, 0xa4, 0x9b, 0x7b, - 0xbd, 0x3b, 0x96, 0x79, 0xff, 0x60, 0xbf, 0x74, 0x7a, 0xb3, 0xd3, 0xe0, 0xc4, 0x87, 0x9c, 0xd3, - 0xad, 0x6e, 0x62, 0xa6, 0x47, 0x7e, 0x4f, 0x81, 0x4b, 0xd2, 0xb5, 0x7f, 0x4f, 0xd6, 0x80, 0x04, - 0x2b, 0x89, 0xb0, 0xbe, 0x70, 0xb0, 0x5f, 0xba, 0xd0, 0xc9, 0x09, 0x88, 0xe6, 0x11, 0x9c, 0x18, - 0xe3, 0x05, 0x37, 0x96, 0xb2, 0xe9, 0x91, 0x2f, 0x2b, 0x50, 0x88, 0xa6, 0x2a, 0x48, 0x10, 0x53, - 0x08, 0x71, 0xed, 0x60, 0xbf, 0x34, 0x7d, 0x4f, 0x4a, 0x5c, 0x38, 0x31, 0xac, 0x69, 0xbb, 0x87, - 0x9a, 0xe9, 0x91, 0x3d, 0x20, 0x41, 0x92, 0x83, 0x84, 0x61, 0x04, 0x31, 0xdc, 0x3d, 0xd8, 0x2f, - 0x4d, 0xde, 0xe3, 0x29, 0x0f, 0x27, 0x1e, 0x7e, 0xd2, 0x96, 0x09, 0x99, 0x1e, 0xf9, 0xba, 0x02, - 0x67, 0xbb, 0x52, 0x2e, 0x24, 0x04, 0x69, 0x44, 0xb0, 0x7e, 0xb0, 0x5f, 0x3a, 0xb3, 0x19, 0x6d, - 0x74, 0x62, 0x24, 0x67, 0x5a, 0xfd, 0x08, 0x9a, 0x1e, 0xf9, 0x6d, 0x05, 0xd4, 0xc3, 0xd2, 0x3a, - 0x24, 0x68, 0xa3, 0x08, 0xed, 0x9d, 0x83, 0xfd, 0xd2, 0xdc, 0x83, 0xbe, 0x49, 0x1e, 0x27, 0x46, - 0x38, 0xf7, 0x38, 0x86, 0xae, 0xe9, 0x91, 0x6f, 0x29, 0x70, 0xbe, 0x37, 0x8b, 0x44, 0x82, 0x98, - 0xe9, 0x48, 0x4f, 0x8b, 0xe6, 0x94, 0x9c, 0x5c, 0x7a, 0x6e, 0x3f, 0x82, 0xa6, 0x47, 0xbe, 0xaa, - 0x40, 0x21, 0x9a, 0x97, 0x22, 0x01, 0xca, 0x22, 0x20, 0xed, 0x60, 0xbf, 0x34, 0x7b, 0x7f, 0xf7, - 0x23, 0x9d, 0xcd, 0x59, 0x67, 0xb7, 0xdf, 0x64, 0x16, 0x3f, 0x50, 0xc2, 0xfd, 0x60, 0x60, 0x3a, - 0xdd, 0x7a, 0x34, 0x3e, 0xf0, 0xe6, 0x91, 0xcd, 0xb6, 0x6c, 0x39, 0xa5, 0x90, 0xc1, 0x9d, 0x54, - 0x46, 0xc9, 0x67, 0xd4, 0xd7, 0x21, 0x7f, 0xdb, 0xf1, 0x8f, 0xb1, 0xa7, 0x7d, 0x65, 0x14, 0xa6, - 0xa4, 0x9e, 0x1f, 0x43, 0x3e, 0xeb, 0xdf, 0x28, 0x30, 0xf3, 0xd0, 0xf1, 0xf9, 0xcc, 0xf5, 0x49, - 0xa3, 0x5c, 0x8c, 0x11, 0x4d, 0x0f, 0xd2, 0x4e, 0x49, 0x74, 0x3b, 0x5b, 0x13, 0xdb, 0xd9, 0x54, - 0x77, 0xfd, 0xb1, 0xf7, 0xb3, 0xa9, 0x87, 0xdd, 0x23, 0x15, 0x77, 0x21, 0x13, 0x90, 0x27, 0x9f, - 0x86, 0x94, 0x49, 0xbd, 0x9a, 0x70, 0x7b, 0xd4, 0x3e, 0x69, 0x27, 0xd8, 0x2e, 0x08, 0x94, 0x84, - 0x3e, 0x3b, 0xf6, 0x3a, 0x24, 0x95, 0x2a, 0xd1, 0x3f, 0x95, 0xaa, 0xf8, 0xb7, 0x0a, 0x8c, 0xe3, - 0xc5, 0x7a, 0x38, 0x5f, 0x4f, 0xfb, 0xd6, 0xfe, 0x1d, 0x80, 0xce, 0x94, 0x89, 0x79, 0xba, 0x7e, - 0xac, 0x79, 0x0a, 0xb3, 0x2f, 0x83, 0x16, 0xc5, 0x5f, 0x54, 0xb8, 0x5b, 0x10, 0x32, 0x33, 0x94, - 0x5b, 0xa0, 0x41, 0x1a, 0xc1, 0x05, 0x68, 0xde, 0x38, 0x12, 0x9a, 0x88, 0xf4, 0x34, 0x41, 0xa9, - 0xf8, 0xd3, 0x30, 0xdb, 0x5f, 0x9d, 0xfa, 0xac, 0xe7, 0xfb, 0xd1, 0xf5, 0xfc, 0xa9, 0x23, 0x0d, - 0x2f, 0xb3, 0x2b, 0x87, 0xff, 0xae, 0xc0, 0xd8, 0xb0, 0xf7, 0xd7, 0xdf, 0x1b, 0x11, 0x99, 0x2c, - 0x1f, 0xcb, 0x9a, 0x95, 0x83, 0xea, 0x89, 0xa7, 0x10, 0x54, 0xff, 0x0b, 0x05, 0xa6, 0x5d, 0xc1, - 0x48, 0xc4, 0x24, 0xf0, 0xd8, 0xf8, 0x67, 0x06, 0x5d, 0x23, 0x74, 0x42, 0xc8, 0x01, 0x91, 0x43, - 0xcc, 0x41, 0x77, 0xfd, 0xf1, 0xcd, 0x81, 0xdb, 0x3d, 0x52, 0xf1, 0x9b, 0xdd, 0x8a, 0x5c, 0x84, - 0x4c, 0xd0, 0x2a, 0x38, 0x37, 0xba, 0x87, 0x2a, 0x79, 0xbf, 0xd7, 0x34, 0x9f, 0x85, 0x11, 0xcb, - 0xde, 0x72, 0x82, 0x2b, 0x82, 0x23, 0xdd, 0xa6, 0x60, 0xc7, 0xe2, 0x7b, 0x30, 0xdb, 0x5f, 0x24, - 0x7d, 0x54, 0xfa, 0x6e, 0x54, 0xa5, 0xaf, 0x0f, 0x2d, 0xf4, 0x43, 0xd4, 0xf9, 0x4e, 0x2a, 0x93, - 0xca, 0x8f, 0xa8, 0x2f, 0x01, 0x59, 0xea, 0xbc, 0x3f, 0x1b, 0x78, 0x5f, 0x75, 0x59, 0xd8, 0xb6, - 0xc1, 0x2d, 0x7f, 0x3f, 0x01, 0x63, 0xd8, 0x34, 0x78, 0xf4, 0xf4, 0xb4, 0xad, 0xe0, 0x0b, 0x30, - 0x45, 0xed, 0x9a, 0xdb, 0xc6, 0x38, 0x77, 0x90, 0xd1, 0x86, 0x67, 0x74, 0x2d, 0xdf, 0xa9, 0x10, - 0xf7, 0x50, 0xa5, 0xe0, 0x38, 0xcc, 0x2f, 0x21, 0xf9, 0xa1, 0x94, 0x9f, 0x70, 0xf1, 0x9e, 0xb2, - 0xd3, 0x80, 0x9f, 0x5a, 0x53, 0x52, 0x03, 0x1e, 0x40, 0xbb, 0x0c, 0x79, 0x11, 0x40, 0xdb, 0xa6, - 0x6d, 0x41, 0x86, 0xa7, 0x5b, 0x8b, 0xb0, 0xe6, 0x5d, 0xda, 0xe6, 0xa4, 0xa2, 0x2d, 0x39, 0xbd, - 0x74, 0x57, 0x4b, 0x7e, 0xfe, 0xfd, 0x1c, 0x4c, 0x04, 0xd2, 0x0d, 0xd3, 0x34, 0x02, 0x43, 0xca, - 0x83, 0x57, 0xcf, 0xc7, 0xde, 0x35, 0x77, 0xa4, 0x1d, 0xc4, 0x9c, 0x78, 0x67, 0xf5, 0x06, 0x4c, - 0x61, 0x5e, 0xeb, 0x0e, 0xb5, 0x8f, 0x16, 0xf1, 0x50, 0xff, 0x63, 0x14, 0x88, 0xdc, 0x55, 0xe0, - 0x6a, 0x62, 0x96, 0x84, 0x28, 0x15, 0xd8, 0xee, 0xc4, 0xdf, 0x83, 0x77, 0x91, 0x28, 0x2f, 0x3a, - 0x8d, 0x06, 0xad, 0xf9, 0xd4, 0x0c, 0xeb, 0x7a, 0x92, 0x2c, 0xa5, 0x31, 0xc8, 0x22, 0x00, 0x46, - 0x4f, 0x5d, 0xea, 0xd1, 0xa3, 0xdd, 0x41, 0x64, 0x59, 0x3f, 0x8d, 0x75, 0x23, 0xaf, 0x43, 0xc1, - 0xb2, 0x7d, 0xea, 0xda, 0x46, 0x43, 0x37, 0x9a, 0x4d, 0x8c, 0x4f, 0xeb, 0x4d, 0x97, 0x6e, 0x59, - 0x7b, 0x22, 0x4c, 0x3d, 0x13, 0xd4, 0xcf, 0x37, 0x9b, 0xf7, 0x8c, 0x1d, 0xba, 0x86, 0x95, 0xe4, - 0x7d, 0x18, 0xc3, 0x2c, 0x7f, 0x36, 0x61, 0x8e, 0x1d, 0x84, 0xaa, 0x37, 0x8e, 0xc6, 0xf1, 0xb2, - 0x78, 0xf1, 0x15, 0x72, 0xbe, 0xd1, 0x21, 0xd9, 0xc3, 0x7b, 0x64, 0xbc, 0xe2, 0x5f, 0x29, 0x30, - 0x17, 0x74, 0xef, 0x23, 0xaf, 0xbb, 0xb4, 0x4d, 0x6e, 0x42, 0x86, 0xe9, 0x57, 0x98, 0x7e, 0xd3, - 0x15, 0xde, 0x79, 0xdc, 0x28, 0xf7, 0xef, 0x18, 0x24, 0x82, 0x6c, 0xd3, 0xf6, 0x92, 0xe1, 0x1b, - 0xf2, 0x4e, 0x95, 0xf8, 0x88, 0x77, 0x2a, 0xc6, 0xc6, 0xf9, 0xb8, 0x79, 0x27, 0x66, 0xc7, 0xee, - 0xe5, 0xae, 0xad, 0x1e, 0x4f, 0xbc, 0xb1, 0x6c, 0xa2, 0x2d, 0x7d, 0x2b, 0xc8, 0xf7, 0x4b, 0xf4, - 0xc6, 0xbd, 0xfb, 0xcb, 0x29, 0x92, 0xe7, 0x57, 0xfc, 0x91, 0x02, 0x97, 0x86, 0x9b, 0x4c, 0xa2, - 0xf1, 0x85, 0xe2, 0xc9, 0xf3, 0xf2, 0x52, 0xd7, 0x78, 0x43, 0xe9, 0x43, 0x16, 0xc9, 0x3c, 0xed, - 0x19, 0x52, 0xbf, 0x9c, 0x80, 0x62, 0xc8, 0x7f, 0x64, 0x67, 0x68, 0x3a, 0xae, 0x4f, 0x26, 0xc2, - 0xeb, 0xc2, 0x24, 0xde, 0x47, 0x9c, 0x87, 0x6c, 0xcd, 0xd9, 0x69, 0x36, 0xa8, 0x4f, 0x4d, 0x91, - 0x4c, 0xd2, 0x29, 0x20, 0xaf, 0xc2, 0x4c, 0xb8, 0x82, 0xf5, 0x2d, 0xcb, 0xae, 0x53, 0xb7, 0xe9, - 0x5a, 0xb6, 0x2f, 0x82, 0xbb, 0xd3, 0x61, 0xe5, 0xcd, 0x4e, 0x1d, 0x79, 0x0b, 0x0a, 0x9d, 0x4e, - 0xd2, 0xdb, 0x68, 0xc6, 0x2e, 0xbe, 0xf6, 0x44, 0x81, 0x28, 0xda, 0xac, 0xd7, 0x07, 0x26, 0xa6, - 0x00, 0x8c, 0xb9, 0xdc, 0xc2, 0x51, 0x53, 0x37, 0x7c, 0xf1, 0x90, 0x6d, 0x38, 0x53, 0x91, 0x0b, - 0x7b, 0xce, 0xfb, 0xea, 0xbb, 0xf0, 0xfc, 0xa2, 0x4b, 0x0d, 0x9f, 0x1e, 0x2e, 0x8f, 0xc0, 0x94, - 0x1e, 0xca, 0xa8, 0x72, 0x38, 0xa3, 0x6a, 0x1b, 0x2e, 0x0f, 0xa6, 0x2f, 0xec, 0xed, 0xdb, 0x90, - 0x76, 0xb1, 0x44, 0xa8, 0xd0, 0xf5, 0x61, 0x96, 0x46, 0x2f, 0x39, 0x41, 0x44, 0x7d, 0x16, 0xd4, - 0xc3, 0x5b, 0x85, 0x8f, 0xf5, 0x7e, 0x0a, 0x2e, 0xc6, 0xb6, 0x12, 0xd8, 0x36, 0x61, 0x94, 0x93, - 0x0d, 0x36, 0x82, 0xe3, 0x81, 0x0b, 0xec, 0x90, 0xa0, 0xa5, 0xfe, 0xb1, 0x02, 0xd3, 0xfd, 0x5a, - 0xf7, 0xe8, 0xe0, 0xa1, 0xc2, 0x4f, 0xc4, 0x68, 0xd9, 0x2d, 0x18, 0xab, 0x05, 0xcb, 0x8e, 0x69, - 0xc9, 0x51, 0x36, 0x94, 0x5c, 0xd8, 0x73, 0x1e, 0x1f, 0x69, 0xf9, 0xae, 0x51, 0x0b, 0x9f, 0xa2, - 0xe1, 0x87, 0xfa, 0x39, 0x38, 0xd7, 0x9f, 0x53, 0xae, 0x2f, 0x37, 0x62, 0x74, 0x9c, 0x33, 0x76, - 0x88, 0x76, 0xab, 0x8f, 0xe1, 0x7c, 0x7f, 0xc2, 0x62, 0x32, 0x1e, 0x40, 0x4e, 0xa2, 0x27, 0x0c, - 0x5c, 0xe5, 0xa8, 0x13, 0x22, 0xd3, 0x50, 0x5f, 0x85, 0xc2, 0x1d, 0xa7, 0xaa, 0xd1, 0xba, 0xe5, - 0xf9, 0x6e, 0x5b, 0xa4, 0x45, 0x0c, 0x72, 0xff, 0xfe, 0x5d, 0x81, 0xb3, 0x7d, 0x7a, 0x7d, 0x0c, - 0xa7, 0xa1, 0xcf, 0xc3, 0x98, 0xdb, 0xb2, 0x6d, 0xcb, 0xae, 0xeb, 0x8f, 0x9c, 0x6a, 0x70, 0x02, - 0x8d, 0xcb, 0x75, 0x39, 0x14, 0x27, 0xd6, 0xe4, 0x04, 0xb5, 0x3b, 0x4e, 0xd5, 0x2b, 0xce, 0x40, - 0xf2, 0x8e, 0x53, 0xed, 0x56, 0x41, 0xf5, 0x0a, 0xe4, 0xef, 0x38, 0xd5, 0xa8, 0x68, 0x66, 0x20, - 0xfd, 0xc8, 0xa9, 0x76, 0x66, 0x74, 0xe4, 0x91, 0x53, 0x5d, 0x31, 0xd5, 0x65, 0x98, 0x92, 0x9a, - 0x0a, 0x79, 0xbc, 0x0c, 0xc9, 0x47, 0x4e, 0x55, 0xac, 0xed, 0xb9, 0xae, 0xed, 0x01, 0xff, 0x0a, - 0x05, 0xff, 0x8b, 0x14, 0x08, 0x88, 0x35, 0xbd, 0x7a, 0x1d, 0xa0, 0x93, 0x5b, 0x48, 0xa6, 0x21, - 0x7f, 0xeb, 0xbe, 0x76, 0x7f, 0x73, 0x63, 0xe5, 0xde, 0xb2, 0xbe, 0xbe, 0x31, 0xbf, 0x78, 0x77, - 0x3d, 0x7f, 0x8a, 0x4c, 0xc1, 0xf8, 0xc6, 0x6d, 0x6d, 0x79, 0x7e, 0x29, 0x28, 0x52, 0xae, 0x3e, - 0x0b, 0x99, 0x20, 0x71, 0x4f, 0xca, 0x5c, 0x9b, 0x00, 0x08, 0xbb, 0xaf, 0xe7, 0x95, 0x6b, 0x7f, - 0xf9, 0x1c, 0xa4, 0x85, 0xa3, 0xfc, 0x1d, 0x05, 0xc6, 0xe4, 0x27, 0xe4, 0xa4, 0x3c, 0xdc, 0x23, - 0xf1, 0x40, 0x0c, 0xc5, 0xca, 0xd0, 0xed, 0xb9, 0x2c, 0xd4, 0xe7, 0x3f, 0xf8, 0xfb, 0x7f, 0xfd, - 0xd5, 0xc4, 0x27, 0x48, 0xa9, 0x22, 0x9c, 0xf8, 0x8a, 0xfc, 0xc2, 0xbc, 0xf2, 0x9e, 0x50, 0x9c, - 0x27, 0xe4, 0xe7, 0x14, 0x18, 0x0d, 0x0e, 0x17, 0x71, 0xa9, 0x43, 0xd1, 0x07, 0xe9, 0xc5, 0xab, - 0xc3, 0x34, 0x15, 0x58, 0x54, 0xc4, 0x72, 0x9e, 0x14, 0x43, 0x2c, 0x22, 0xcb, 0x58, 0x82, 0xe1, - 0xc2, 0x08, 0xbe, 0x1f, 0x26, 0xcf, 0x0f, 0x7e, 0x61, 0xcc, 0x11, 0x5c, 0x1e, 0xf6, 0x29, 0xb2, - 0x3a, 0x8b, 0xe3, 0xe7, 0xc9, 0x44, 0x38, 0x3e, 0x7f, 0xea, 0xfc, 0x3e, 0xa4, 0x30, 0x59, 0xf0, - 0xd2, 0x00, 0x4a, 0xc1, 0x88, 0x47, 0x7a, 0x55, 0xad, 0x5e, 0xc0, 0x51, 0x8b, 0xa4, 0x10, 0x1d, - 0x55, 0xe2, 0xf9, 0x09, 0x7f, 0x06, 0x8c, 0x09, 0x62, 0xe4, 0x85, 0xe1, 0xd2, 0xc8, 0x0e, 0x47, - 0x72, 0x68, 0xce, 0x99, 0x3a, 0x83, 0x48, 0x26, 0xc9, 0x78, 0x88, 0xc4, 0x35, 0xb6, 0x7c, 0xf2, - 0x25, 0x05, 0xd2, 0x3c, 0x68, 0x43, 0x06, 0x3e, 0x01, 0x0b, 0xa5, 0x7e, 0x65, 0x88, 0x96, 0x62, - 0xd8, 0x4f, 0xe0, 0xb0, 0xe7, 0xc8, 0x59, 0x69, 0x58, 0xd6, 0x40, 0x92, 0x80, 0x07, 0x69, 0xfe, - 0x8e, 0x27, 0x16, 0x41, 0xe4, 0xa9, 0x4f, 0x51, 0xce, 0x85, 0x16, 0x7f, 0x74, 0x66, 0xc5, 0xde, - 0x72, 0x84, 0xd4, 0x7b, 0x07, 0x15, 0x7f, 0x9f, 0xa6, 0x33, 0xe8, 0xb7, 0x15, 0xc8, 0x49, 0x0f, - 0x50, 0xc8, 0x4b, 0xc3, 0x3d, 0x54, 0x09, 0xc6, 0x2f, 0x0f, 0xdb, 0x5c, 0x88, 0xe1, 0x12, 0x22, - 0xba, 0x40, 0xe6, 0x42, 0x44, 0xfc, 0x72, 0x18, 0x3d, 0x51, 0x09, 0xd6, 0x37, 0x15, 0xc8, 0x86, - 0x2f, 0x04, 0x62, 0xd5, 0xa1, 0xfb, 0x5d, 0x44, 0xac, 0x3a, 0xf4, 0x3c, 0x5a, 0x50, 0xaf, 0x20, - 0xa0, 0x8b, 0xe4, 0x13, 0x21, 0x20, 0x23, 0x68, 0x83, 0x2a, 0x2a, 0x61, 0xfa, 0xae, 0x02, 0x13, - 0xd1, 0x17, 0x24, 0xe4, 0xe5, 0xa1, 0xc6, 0x92, 0x22, 0x7c, 0xc5, 0x57, 0x8e, 0xd0, 0x43, 0x40, - 0x7c, 0x01, 0x21, 0x3e, 0x47, 0x2e, 0xf6, 0x81, 0x88, 0x4a, 0x54, 0x79, 0x2f, 0x88, 0xd5, 0x3d, - 0x21, 0x5f, 0x51, 0x60, 0x4c, 0x4e, 0x17, 0x89, 0x35, 0xae, 0x7d, 0xb2, 0xc6, 0x62, 0x8d, 0x6b, - 0xbf, 0x74, 0x18, 0xf5, 0x2c, 0xc2, 0x3b, 0x4d, 0xa6, 0x42, 0x78, 0x61, 0x8e, 0xcb, 0xaf, 0x89, - 0x74, 0x1e, 0x7c, 0x7a, 0xf8, 0xf1, 0x21, 0x2a, 0x21, 0xa2, 0xb3, 0xe4, 0x4c, 0x88, 0x08, 0x1f, - 0x52, 0xea, 0x32, 0xae, 0x9c, 0x94, 0xbd, 0x12, 0xab, 0xf4, 0xbd, 0x89, 0x35, 0xb1, 0x4a, 0xdf, - 0x27, 0x29, 0xa6, 0xdf, 0xf6, 0x83, 0xad, 0x78, 0xbe, 0x96, 0xa4, 0x61, 0xbf, 0xa9, 0xc0, 0x78, - 0x24, 0x23, 0x85, 0x54, 0x06, 0x0e, 0x15, 0x4d, 0x9b, 0x29, 0xbe, 0x3c, 0x7c, 0x87, 0x43, 0x57, - 0x80, 0x40, 0x27, 0xc4, 0x25, 0xe1, 0xfb, 0x92, 0x02, 0xd9, 0x30, 0x0f, 0x24, 0x76, 0x55, 0x76, - 0xe7, 0xc2, 0xc4, 0xae, 0xca, 0x9e, 0xd4, 0x12, 0xb5, 0x80, 0x98, 0x88, 0xda, 0x31, 0xd2, 0x5e, - 0xd3, 0xb0, 0xdf, 0x50, 0xae, 0x92, 0xf7, 0xd1, 0x8d, 0xa8, 0x6d, 0xc7, 0x9b, 0xe9, 0xc8, 0xa3, - 0x8b, 0x62, 0xdc, 0x2e, 0x2a, 0x3f, 0x35, 0xea, 0x63, 0x2f, 0x3d, 0x24, 0x24, 0x89, 0xe0, 0x67, - 0x14, 0x18, 0x15, 0xb9, 0xfd, 0xb1, 0x1e, 0x42, 0x34, 0xff, 0x7f, 0x78, 0x08, 0xbd, 0xee, 0x41, - 0x93, 0x53, 0xea, 0xc2, 0x20, 0x5e, 0x03, 0xc4, 0x62, 0x88, 0xbe, 0x18, 0x38, 0x09, 0x86, 0x1d, - 0x4e, 0x49, 0xc2, 0xf0, 0xf3, 0x0a, 0x64, 0x82, 0x17, 0x18, 0x24, 0xce, 0xff, 0xe9, 0x7a, 0x44, - 0x52, 0x7c, 0x61, 0xa8, 0xb6, 0x02, 0x49, 0xaf, 0xdb, 0x80, 0x51, 0xd1, 0xe8, 0xfe, 0x35, 0x26, - 0x3f, 0x1a, 0x8a, 0xb7, 0x2e, 0xbd, 0xaf, 0x91, 0xe2, 0xad, 0x4b, 0x9f, 0xd7, 0x48, 0xea, 0x45, - 0xc4, 0xf4, 0x0c, 0x39, 0x27, 0x59, 0x97, 0x7a, 0x37, 0xac, 0xaf, 0x2b, 0x30, 0x2a, 0x7a, 0xc7, - 0x4e, 0x51, 0xf4, 0x75, 0x52, 0xf1, 0xa5, 0xf8, 0xa6, 0x5d, 0x6f, 0xb3, 0xd4, 0xab, 0x08, 0xe5, - 0x59, 0xa2, 0xc6, 0x40, 0xa9, 0xbc, 0xc7, 0x0a, 0x9e, 0x30, 0xff, 0x6e, 0xd5, 0xa9, 0x7b, 0xb1, - 0xfe, 0x9d, 0xf4, 0xc6, 0xed, 0xa8, 0x50, 0xfa, 0xd9, 0xdc, 0xba, 0x2c, 0x91, 0x6f, 0x29, 0xf8, - 0x17, 0x42, 0x3a, 0x17, 0xdd, 0xb1, 0xb6, 0xad, 0x5f, 0xce, 0x56, 0xac, 0x6d, 0xeb, 0x7b, 0x87, - 0xae, 0xce, 0x21, 0xaa, 0x02, 0x99, 0x95, 0x57, 0x13, 0x6b, 0x27, 0x9e, 0x0b, 0x7c, 0xa0, 0x40, - 0x36, 0xbc, 0xad, 0x8b, 0x35, 0x68, 0xdd, 0x97, 0xed, 0xb1, 0x06, 0xad, 0xe7, 0x02, 0x50, 0x2d, - 0x22, 0x90, 0x69, 0x42, 0x42, 0x20, 0x0f, 0x1d, 0x5f, 0x80, 0x78, 0x02, 0x23, 0xdc, 0x9b, 0x78, - 0x7e, 0xf0, 0x05, 0xcc, 0x60, 0x6f, 0x3f, 0xea, 0x3b, 0x1c, 0xe2, 0x76, 0xca, 0x1e, 0xc3, 0xaf, - 0x2b, 0x90, 0x93, 0x63, 0x21, 0x71, 0x13, 0xdf, 0x1b, 0x77, 0xe8, 0x37, 0x29, 0x91, 0xbf, 0x45, - 0x28, 0xf5, 0xe1, 0x41, 0x99, 0x3e, 0x3e, 0xa0, 0xd4, 0x21, 0xba, 0xdb, 0xa4, 0xf9, 0xdd, 0xc5, - 0x00, 0x5b, 0x2f, 0x5d, 0x1e, 0xc5, 0xba, 0xe4, 0xd1, 0x8b, 0x90, 0xbe, 0xd6, 0x9e, 0x35, 0x90, - 0x20, 0xfc, 0x82, 0x82, 0x67, 0xe2, 0xe0, 0xc2, 0xe0, 0xc5, 0x21, 0xa3, 0xc7, 0x83, 0x57, 0x50, - 0x6f, 0xac, 0x59, 0x3d, 0x87, 0x70, 0x66, 0xc8, 0x69, 0x79, 0xf3, 0x09, 0x46, 0xfe, 0xa1, 0x02, - 0x17, 0x06, 0x45, 0xf6, 0xc8, 0x42, 0xdc, 0xde, 0x3f, 0x5c, 0xd8, 0xb1, 0xb8, 0x78, 0x22, 0x1a, - 0x51, 0x13, 0xa9, 0x16, 0x24, 0x56, 0x76, 0x7c, 0x36, 0xcb, 0x22, 0x12, 0xc7, 0x76, 0xf2, 0x3f, - 0x53, 0x0e, 0x8b, 0x3b, 0x21, 0x12, 0x8f, 0xbc, 0x79, 0xac, 0x98, 0x5f, 0x28, 0xfe, 0xb7, 0x8e, - 0xdb, 0xfd, 0xd0, 0xbd, 0xa7, 0x8b, 0x09, 0xf2, 0x27, 0x87, 0x85, 0x13, 0x3f, 0x79, 0xe4, 0xa1, - 0x39, 0xe4, 0xd7, 0x8f, 0xdc, 0x4f, 0x60, 0x7d, 0x0d, 0xb1, 0x96, 0xc9, 0x8b, 0x3d, 0x58, 0x2b, - 0xef, 0x1d, 0x16, 0x15, 0x7c, 0x42, 0xbe, 0xa7, 0x60, 0xe0, 0x28, 0x1a, 0xa8, 0x22, 0xaf, 0x1e, - 0x2d, 0xac, 0xc5, 0x91, 0xbf, 0x76, 0x9c, 0x58, 0x58, 0x1f, 0xc7, 0xf8, 0x91, 0x53, 0xd5, 0x5d, - 0xd1, 0x38, 0xea, 0x6d, 0x64, 0xc3, 0x10, 0x57, 0xac, 0x9d, 0xee, 0x8e, 0x99, 0xc5, 0xda, 0xe9, - 0x9e, 0xa8, 0x99, 0xfa, 0x0c, 0x22, 0x3a, 0x43, 0x66, 0x64, 0x44, 0x95, 0xf7, 0x78, 0xd4, 0xed, - 0xc9, 0xc2, 0xd5, 0x1f, 0xfc, 0xcb, 0xdc, 0xa9, 0x1f, 0x1c, 0xcc, 0x29, 0x3f, 0x3c, 0x98, 0x53, - 0x7e, 0x74, 0x30, 0xa7, 0xfc, 0xf3, 0xc1, 0x9c, 0xf2, 0x8d, 0x0f, 0xe7, 0x4e, 0xfd, 0xf0, 0xc3, - 0xb9, 0x53, 0x3f, 0xfa, 0x70, 0xee, 0xd4, 0x3b, 0x99, 0x80, 0x78, 0x35, 0x8d, 0x01, 0xdf, 0x57, - 0xff, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x3f, 0xc8, 0x8d, 0x22, 0x5f, 0x56, 0x00, 0x00, + proto.RegisterFile("server/serverpb/status.proto", fileDescriptor_status_2d17127fb8c69067) +} + +var fileDescriptor_status_2d17127fb8c69067 = []byte{ + // 6048 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5c, 0xff, 0x6f, 0x24, 0x47, + 0x56, 0xdf, 0xf6, 0x8c, 0xc7, 0x33, 0x6f, 0xfc, 0x65, 0x5c, 0x6b, 0x7b, 0x67, 0x27, 0x1b, 0xcf, + 0x5e, 0x6f, 0xb2, 0xf1, 0x6e, 0x92, 0x99, 0x64, 0x93, 0x5c, 0x72, 0xe1, 0x92, 0x8b, 0xbf, 0xed, + 0xae, 0x77, 0x9d, 0x5d, 0x6f, 0xdb, 0xe6, 0x50, 0xee, 0xb8, 0xa6, 0x67, 0xba, 0x3c, 0xdb, 0xeb, + 0x99, 0xee, 0xd9, 0xee, 0x1e, 0xe3, 0xb9, 0xb0, 0xe1, 0x08, 0x70, 0x1c, 0xc7, 0x71, 0xdf, 0x38, + 0xd0, 0xfd, 0x00, 0x12, 0xba, 0x1f, 0x38, 0x7e, 0x01, 0x1d, 0xe2, 0x17, 0x38, 0x09, 0x90, 0x00, + 0xc1, 0x49, 0x48, 0xe8, 0x24, 0xf8, 0xe1, 0x04, 0x92, 0x0f, 0x1c, 0x7e, 0x40, 0x42, 0xfc, 0x03, + 0x27, 0x81, 0x50, 0xbd, 0xaa, 0xee, 0xa9, 0x9e, 0x19, 0xf7, 0x8c, 0xed, 0x6c, 0xc4, 0x0f, 0xc9, + 0x4e, 0x57, 0xd5, 0x7b, 0xf5, 0xa9, 0x57, 0xaf, 0x5e, 0xbd, 0x7a, 0xf5, 0xca, 0x70, 0xc1, 0xa3, + 0xee, 0x1e, 0x75, 0xcb, 0xfc, 0x9f, 0x66, 0xa5, 0xec, 0xf9, 0x86, 0xdf, 0xf2, 0x4a, 0x4d, 0xd7, + 0xf1, 0x1d, 0x72, 0xbe, 0xea, 0x54, 0x77, 0x5d, 0xc7, 0xa8, 0xde, 0x2f, 0xf1, 0x06, 0xa5, 0xa0, + 0x5d, 0x21, 0x57, 0x69, 0x59, 0x75, 0xb3, 0x6c, 0xd9, 0x3b, 0x0e, 0x6f, 0x5c, 0x38, 0x5b, 0x73, + 0x3c, 0xcf, 0x6a, 0x96, 0xf9, 0x3f, 0xa2, 0x70, 0xee, 0x81, 0x53, 0xf1, 0xca, 0xec, 0x7f, 0xcd, + 0x0a, 0xfe, 0x23, 0xca, 0xcf, 0x21, 0xd7, 0x66, 0xa5, 0x6c, 0x34, 0x9b, 0x3a, 0xeb, 0x33, 0xa8, + 0x20, 0x41, 0x85, 0x69, 0xf8, 0x46, 0xc0, 0x24, 0x28, 0x6b, 0x50, 0xdf, 0x90, 0xca, 0x2f, 0x0b, + 0xf0, 0xa6, 0x65, 0xd4, 0x6c, 0xc7, 0xf3, 0xad, 0x2a, 0xeb, 0x45, 0xfa, 0x12, 0xed, 0x2e, 0x05, + 0x83, 0xc4, 0xb1, 0x89, 0x7f, 0xba, 0xc6, 0x5a, 0x78, 0xd2, 0xf3, 0x1d, 0xd7, 0xa8, 0xd1, 0x32, + 0xb5, 0x6b, 0x96, 0x4d, 0x9b, 0x15, 0xf1, 0x43, 0x54, 0x3f, 0xd1, 0x53, 0xdd, 0xd8, 0xab, 0x56, + 0x45, 0xe5, 0x7c, 0x4f, 0xa5, 0xeb, 0x54, 0x77, 0x3d, 0xb3, 0x22, 0xea, 0xaf, 0xec, 0xee, 0x95, + 0x77, 0xf7, 0x04, 0x8a, 0xe0, 0x47, 0xb3, 0x52, 0xae, 0x53, 0xc3, 0xa3, 0x7a, 0x04, 0x86, 0x7a, + 0x44, 0x53, 0xd6, 0x28, 0xc0, 0xf2, 0xf4, 0x51, 0xec, 0xac, 0x3d, 0x6a, 0x53, 0x2f, 0x14, 0x65, + 0xcb, 0xb7, 0xea, 0xe5, 0xba, 0x53, 0x63, 0xff, 0x89, 0xb2, 0x02, 0x96, 0xb5, 0x6c, 0x97, 0x7a, + 0x4e, 0x7d, 0x8f, 0x9a, 0xba, 0x61, 0x9a, 0x6e, 0x30, 0x44, 0xea, 0x57, 0xcd, 0xb2, 0x6b, 0xec, + 0xf8, 0xf8, 0x3f, 0x36, 0x0a, 0x63, 0xc7, 0x17, 0x95, 0x33, 0x35, 0xa7, 0xe6, 0xe0, 0xcf, 0x32, + 0xfb, 0x25, 0x4a, 0x2f, 0xd4, 0x1c, 0xa7, 0x56, 0xa7, 0x65, 0xa3, 0x69, 0x95, 0x0d, 0xdb, 0x76, + 0x7c, 0xc3, 0xb7, 0x1c, 0x3b, 0x00, 0x50, 0x14, 0xb5, 0xf8, 0x55, 0x69, 0xed, 0x94, 0x7d, 0xab, + 0x41, 0x3d, 0xdf, 0x68, 0x08, 0xed, 0x50, 0x4b, 0x70, 0x76, 0x99, 0xba, 0xbe, 0xb5, 0x63, 0x55, + 0x0d, 0x9f, 0x7a, 0x1a, 0x7d, 0xd8, 0xa2, 0x9e, 0x4f, 0xce, 0xc1, 0x98, 0xed, 0x98, 0x54, 0xb7, + 0xcc, 0xbc, 0x72, 0x51, 0x59, 0xc8, 0x68, 0x29, 0xf6, 0xb9, 0x66, 0xaa, 0xff, 0x93, 0x04, 0x22, + 0x11, 0xac, 0x50, 0xdf, 0xb0, 0xea, 0x1e, 0xb9, 0x07, 0x49, 0xbf, 0xdd, 0xa4, 0xd8, 0x78, 0xf2, + 0xda, 0x1b, 0xa5, 0x23, 0xb5, 0xb6, 0xd4, 0x4b, 0x2c, 0x17, 0x6d, 0xb5, 0x9b, 0x54, 0x43, 0x56, + 0xe4, 0x12, 0x4c, 0x50, 0xd7, 0x75, 0x5c, 0xbd, 0x41, 0x3d, 0xcf, 0xa8, 0xd1, 0xfc, 0x08, 0x02, + 0x19, 0xc7, 0xc2, 0xb7, 0x79, 0x19, 0x21, 0x90, 0x64, 0xda, 0x98, 0x4f, 0x5c, 0x54, 0x16, 0xc6, + 0x35, 0xfc, 0x4d, 0x34, 0x48, 0xed, 0x58, 0xb4, 0x6e, 0x7a, 0xf9, 0xe4, 0xc5, 0xc4, 0x42, 0xf6, + 0xda, 0xcb, 0xc7, 0x43, 0x73, 0x1d, 0x69, 0x97, 0x92, 0x3f, 0x38, 0x28, 0x9e, 0xd1, 0x04, 0xa7, + 0xc2, 0x9f, 0x8e, 0x40, 0x8a, 0x57, 0x90, 0x39, 0x48, 0x59, 0x9e, 0xd7, 0xa2, 0x6e, 0x20, 0x19, + 0xfe, 0x45, 0xf2, 0x30, 0xe6, 0xb5, 0x2a, 0x0f, 0x68, 0xd5, 0x17, 0x48, 0x83, 0x4f, 0xf2, 0x24, + 0xc0, 0x9e, 0x51, 0xb7, 0x4c, 0x7d, 0xc7, 0x75, 0x1a, 0x08, 0x35, 0xa1, 0x65, 0xb0, 0xe4, 0xba, + 0xeb, 0x34, 0x48, 0x11, 0xb2, 0xbc, 0xba, 0x65, 0xfb, 0x56, 0x3d, 0x9f, 0xc4, 0x7a, 0x4e, 0xb1, + 0xcd, 0x4a, 0xc8, 0x05, 0xc8, 0x30, 0x1d, 0xa1, 0x9e, 0x47, 0xbd, 0xfc, 0xe8, 0xc5, 0xc4, 0x42, + 0x46, 0xeb, 0x14, 0x90, 0x32, 0x9c, 0xf5, 0xac, 0x9a, 0x6d, 0xf8, 0x2d, 0x97, 0xea, 0x46, 0xbd, + 0xe6, 0xb8, 0x96, 0x7f, 0xbf, 0x91, 0x4f, 0x21, 0x06, 0x12, 0x56, 0x2d, 0x06, 0x35, 0x0c, 0x4e, + 0xb3, 0x55, 0xa9, 0x5b, 0x55, 0x7d, 0x97, 0xb6, 0xf3, 0x63, 0xd8, 0x2e, 0xc3, 0x4b, 0x6e, 0xd3, + 0x36, 0x79, 0x02, 0x32, 0xbb, 0xb4, 0xad, 0xb7, 0x50, 0xe6, 0x69, 0xec, 0x2d, 0xbd, 0x4b, 0xdb, + 0xdb, 0x28, 0xef, 0xe7, 0x80, 0xd0, 0x7d, 0x9f, 0xda, 0x26, 0x35, 0xf5, 0x4e, 0xab, 0x0c, 0xb6, + 0xca, 0x05, 0x35, 0xb7, 0x45, 0x6b, 0xf5, 0x1e, 0x4c, 0x75, 0xcd, 0x2d, 0x49, 0xc1, 0xc8, 0xf2, + 0x62, 0xee, 0x0c, 0x49, 0x43, 0xf2, 0xce, 0xdd, 0x95, 0xd5, 0x9c, 0x42, 0x26, 0x20, 0xb3, 0xbc, + 0xbe, 0xb6, 0x7a, 0x67, 0x4b, 0x5f, 0x5e, 0xcc, 0x8d, 0x10, 0x80, 0x14, 0xff, 0xcc, 0x25, 0x48, + 0x06, 0x46, 0xb7, 0xd7, 0x58, 0x71, 0x92, 0xd1, 0x6d, 0xaf, 0xe5, 0x46, 0x55, 0x07, 0x66, 0xa2, + 0xfa, 0xea, 0x35, 0x1d, 0xdb, 0xa3, 0xe4, 0xd3, 0x30, 0x5e, 0x95, 0xca, 0xf3, 0x0a, 0x4e, 0xfd, + 0xf3, 0xc7, 0x9a, 0x7a, 0x31, 0xe7, 0x11, 0x46, 0x6a, 0x19, 0x26, 0x45, 0xf5, 0xa0, 0xb5, 0x71, + 0x2b, 0x99, 0x1e, 0xc9, 0x25, 0xd4, 0x3b, 0x00, 0x9b, 0x6d, 0xcf, 0xa7, 0x8d, 0x35, 0x7b, 0xc7, + 0x61, 0x93, 0xeb, 0xe1, 0x97, 0xce, 0xec, 0xb4, 0x20, 0x00, 0x2f, 0xd2, 0x60, 0x97, 0xba, 0x36, + 0xad, 0xf3, 0x06, 0x5c, 0x75, 0x80, 0x17, 0xb1, 0x06, 0xea, 0x57, 0x12, 0x30, 0x15, 0x22, 0x10, + 0xa3, 0x7d, 0x27, 0x0a, 0x61, 0x74, 0x69, 0xf1, 0xf0, 0xa0, 0x98, 0xba, 0xc3, 0x60, 0xac, 0xfc, + 0xe4, 0xa0, 0xf8, 0x52, 0xcd, 0xf2, 0xef, 0xb7, 0x2a, 0xa5, 0xaa, 0xd3, 0x28, 0x87, 0x02, 0x30, + 0x2b, 0x9d, 0xdf, 0xe5, 0xe6, 0x6e, 0xad, 0x2c, 0x4c, 0x7a, 0x89, 0x93, 0x05, 0xa3, 0x20, 0x6f, + 0xc2, 0x98, 0x50, 0x2e, 0x04, 0x93, 0xbd, 0x36, 0x2f, 0x09, 0x91, 0xd9, 0xae, 0xd2, 0x76, 0x68, + 0xbb, 0x16, 0x4d, 0xd3, 0x15, 0x52, 0x0b, 0x88, 0xc8, 0xeb, 0x00, 0xb8, 0x31, 0xf1, 0xf1, 0x24, + 0x90, 0xc5, 0xac, 0xc4, 0x02, 0x2b, 0x4b, 0x6c, 0x68, 0x82, 0x32, 0x83, 0x25, 0x28, 0x8c, 0xf5, + 0xa8, 0xb4, 0x92, 0x48, 0xfc, 0x74, 0xcc, 0x24, 0x76, 0x24, 0x2d, 0x98, 0xc9, 0xa2, 0xdd, 0x84, + 0xac, 0xf7, 0xb0, 0xae, 0x07, 0xa3, 0x19, 0x1d, 0x6a, 0x34, 0x84, 0xb1, 0x39, 0x3c, 0x28, 0xc2, + 0xe6, 0xbd, 0xf5, 0x45, 0x4e, 0xa9, 0x81, 0xf7, 0xb0, 0x2e, 0x7e, 0xab, 0x93, 0x30, 0xce, 0x04, + 0x16, 0x68, 0x83, 0xfa, 0xad, 0x04, 0x4c, 0x88, 0x02, 0x31, 0x39, 0x37, 0x61, 0x94, 0x89, 0x32, + 0xd0, 0xc1, 0xe7, 0xfa, 0xc0, 0xe7, 0xdb, 0x4d, 0xb0, 0x0b, 0xe2, 0x0c, 0x6c, 0xe2, 0x87, 0x18, + 0x05, 0x67, 0x40, 0xfe, 0x52, 0x81, 0xb3, 0xc1, 0x8e, 0xa2, 0x57, 0xda, 0x7a, 0x30, 0xe7, 0x23, + 0xc8, 0xf8, 0xcd, 0x18, 0xb9, 0x44, 0x10, 0x95, 0xd6, 0x05, 0x8f, 0xa5, 0x36, 0xce, 0xb5, 0xb9, + 0x6a, 0xfb, 0x6e, 0x7b, 0xe9, 0xae, 0x18, 0x69, 0xae, 0xab, 0x7a, 0xe5, 0xfd, 0x1f, 0x9f, 0x4c, + 0x83, 0x72, 0xf5, 0xae, 0x7e, 0x0a, 0xfb, 0x30, 0xdb, 0xb7, 0x6f, 0x92, 0x83, 0x04, 0x33, 0x3e, + 0xa8, 0xbc, 0x1a, 0xfb, 0x49, 0xd6, 0x60, 0x74, 0xcf, 0xa8, 0xb7, 0xb8, 0x99, 0x9f, 0xbc, 0xf6, + 0x92, 0x34, 0xb8, 0xdd, 0xbd, 0x52, 0xb0, 0xc5, 0x96, 0xc4, 0x36, 0x2f, 0x3a, 0x0d, 0x98, 0x73, + 0xe1, 0x69, 0x9c, 0xc3, 0xeb, 0x23, 0xaf, 0x29, 0xea, 0x65, 0xc8, 0xb2, 0x06, 0x03, 0xf7, 0xb3, + 0xef, 0x25, 0x21, 0xa3, 0x19, 0x3b, 0x3e, 0xe3, 0xc0, 0xcc, 0x1b, 0xb8, 0xb4, 0x59, 0xb7, 0xaa, + 0x46, 0xd0, 0x32, 0xb9, 0x34, 0x71, 0x78, 0x50, 0xcc, 0x68, 0xbc, 0x74, 0x6d, 0x45, 0xcb, 0x88, + 0x06, 0x6b, 0x26, 0xf9, 0x38, 0xc0, 0x7d, 0xc3, 0x35, 0xd1, 0x7b, 0xa0, 0x62, 0xb1, 0x4c, 0x97, + 0xf8, 0xc6, 0x5d, 0xba, 0x69, 0xb8, 0x26, 0x32, 0x0d, 0xb4, 0xfc, 0x7e, 0x50, 0xc0, 0x36, 0xad, + 0x3a, 0x35, 0x4c, 0x5c, 0x1b, 0x49, 0x0d, 0x7f, 0x93, 0x19, 0x18, 0xe5, 0x6c, 0x92, 0x08, 0x8f, + 0x7f, 0xb0, 0x3d, 0xc5, 0x68, 0x36, 0xeb, 0x16, 0x35, 0x51, 0x7b, 0x93, 0x5a, 0xf0, 0x49, 0xb6, + 0x20, 0xdd, 0x74, 0x9d, 0x1a, 0x2a, 0x76, 0x0a, 0xd5, 0xe1, 0x5a, 0x8c, 0x3a, 0x84, 0x23, 0x2c, + 0x6d, 0x08, 0x22, 0xae, 0x02, 0x1c, 0x5a, 0xc8, 0x89, 0x3c, 0x03, 0x53, 0x0c, 0x8d, 0xee, 0xbb, + 0x86, 0xed, 0xed, 0x50, 0x97, 0x52, 0xdc, 0x1f, 0x92, 0xda, 0x24, 0x2b, 0xde, 0x0a, 0x4b, 0x0b, + 0xbf, 0xa9, 0x40, 0x3a, 0x60, 0xc5, 0xb0, 0x37, 0x0c, 0xbf, 0x7a, 0x9f, 0x0b, 0x4c, 0xe3, 0x1f, + 0x6c, 0x94, 0x36, 0xdd, 0xe7, 0x9b, 0x61, 0x52, 0xc3, 0xdf, 0x9d, 0x51, 0x26, 0xe4, 0x51, 0xce, + 0x41, 0xaa, 0x69, 0xb4, 0x3c, 0x6a, 0xe2, 0xe0, 0xd3, 0x9a, 0xf8, 0x22, 0x57, 0x20, 0xd7, 0xa4, + 0xb6, 0x69, 0xd9, 0x35, 0xdd, 0xb3, 0x8d, 0xa6, 0x77, 0xdf, 0xf1, 0x85, 0x18, 0xa6, 0x44, 0xf9, + 0xa6, 0x28, 0x2e, 0x3c, 0x80, 0x89, 0xc8, 0xc8, 0x64, 0x05, 0x4b, 0x72, 0x05, 0x5b, 0x96, 0x15, + 0x2c, 0x7e, 0x6b, 0xe8, 0x15, 0x97, 0xac, 0x5a, 0x87, 0x23, 0x30, 0xa1, 0x19, 0x76, 0x8d, 0x6e, + 0xb8, 0x4e, 0xa5, 0x4e, 0x1b, 0x1e, 0xb9, 0x08, 0xd9, 0x96, 0x6d, 0xec, 0x19, 0x56, 0xdd, 0xa8, + 0xd4, 0xb9, 0x13, 0x94, 0xd6, 0xe4, 0x22, 0xf2, 0x0a, 0x9c, 0x63, 0x12, 0xa4, 0xae, 0x6e, 0x3b, + 0xbe, 0xce, 0x9d, 0xce, 0xfb, 0x4e, 0xdd, 0xa4, 0x2e, 0xc2, 0x49, 0x6b, 0x33, 0xbc, 0xfa, 0x8e, + 0xe3, 0xaf, 0xb3, 0xca, 0x9b, 0x58, 0x47, 0x9e, 0x82, 0x49, 0xdb, 0xd1, 0x99, 0x46, 0xe9, 0xbc, + 0x1e, 0x05, 0x97, 0xd6, 0xc6, 0x6d, 0x87, 0x61, 0x5c, 0xc7, 0x32, 0xb2, 0x00, 0x53, 0x2d, 0xdb, + 0xa4, 0xae, 0xd0, 0x4c, 0x3f, 0x14, 0x64, 0x77, 0x31, 0x39, 0x0f, 0x69, 0xdb, 0xe1, 0xdd, 0xa3, + 0x24, 0xd3, 0xda, 0x98, 0xed, 0x60, 0x87, 0xe4, 0x35, 0xc8, 0x3f, 0x6c, 0x59, 0xd4, 0xab, 0x52, + 0xdb, 0xd7, 0xe9, 0xc3, 0x96, 0x51, 0xf7, 0x74, 0xdf, 0xaa, 0xee, 0x5a, 0x76, 0x0d, 0x7d, 0x89, + 0xb4, 0x36, 0x17, 0xd6, 0xaf, 0x62, 0xf5, 0x16, 0xaf, 0x25, 0xcf, 0x02, 0xe1, 0x08, 0x9d, 0x9a, + 0xee, 0x3b, 0x8e, 0x5e, 0x37, 0xdc, 0x1a, 0xd7, 0x9b, 0xb4, 0x36, 0xc5, 0x6a, 0xd6, 0x9d, 0xda, + 0x96, 0xe3, 0xac, 0xb3, 0x62, 0x72, 0x19, 0x26, 0x9d, 0xbd, 0x08, 0xd4, 0x34, 0x36, 0xec, 0x2a, + 0x55, 0x77, 0x61, 0x0a, 0x65, 0xcc, 0xa6, 0xc1, 0xc2, 0x93, 0x04, 0xf3, 0x3d, 0x1e, 0xb6, 0xa8, + 0x6b, 0x51, 0x4f, 0x6f, 0x52, 0x57, 0xf7, 0x68, 0xd5, 0xb1, 0xf9, 0x22, 0x55, 0xb4, 0x9c, 0xa8, + 0xd9, 0xa0, 0xee, 0x26, 0x96, 0x93, 0xab, 0x30, 0xfd, 0xf3, 0xae, 0xe5, 0x47, 0x1b, 0x8f, 0x60, + 0xe3, 0x29, 0x5e, 0x11, 0xb6, 0x55, 0x6f, 0x02, 0x6c, 0xb8, 0xd4, 0xf7, 0xdb, 0x9b, 0x4d, 0xc3, + 0x66, 0x0e, 0x90, 0xe7, 0x1b, 0xae, 0xaf, 0x07, 0x0a, 0x94, 0xd1, 0xd2, 0x58, 0xc0, 0xbc, 0xa3, + 0x73, 0x30, 0x46, 0x6d, 0xf4, 0x7d, 0xc4, 0x56, 0x9d, 0xa2, 0x36, 0x73, 0x78, 0x5e, 0x4f, 0xfe, + 0xe7, 0xef, 0x17, 0x15, 0xf5, 0x2b, 0x69, 0x66, 0x4e, 0xec, 0x1a, 0xc5, 0x0d, 0xe8, 0x53, 0x90, + 0xf4, 0x9a, 0x86, 0x8d, 0x4c, 0xe2, 0xf7, 0xb1, 0x4e, 0xf7, 0x62, 0x4d, 0x22, 0x21, 0x59, 0x03, + 0x40, 0xd1, 0xca, 0x16, 0xe6, 0xa9, 0x61, 0x14, 0x37, 0x30, 0x3a, 0x6e, 0x68, 0xda, 0xae, 0xcb, + 0x06, 0x26, 0x7b, 0xed, 0xea, 0x40, 0xfb, 0x1a, 0x0e, 0x23, 0xd8, 0x93, 0xf8, 0x62, 0x6d, 0xc0, + 0xa4, 0xe7, 0xb4, 0xdc, 0x2a, 0x0d, 0x77, 0xa3, 0x51, 0xf4, 0x40, 0x6e, 0x1c, 0x1e, 0x14, 0xc7, + 0x37, 0xb1, 0xe6, 0x74, 0x7e, 0xc8, 0xb8, 0xd7, 0x61, 0x62, 0x92, 0x87, 0x30, 0x25, 0xba, 0x63, + 0xc8, 0xb0, 0xbf, 0x14, 0xf6, 0xb7, 0x76, 0x78, 0x50, 0x9c, 0xe0, 0xfd, 0x6d, 0xb2, 0x1a, 0xec, + 0xf0, 0xe5, 0x63, 0x75, 0x28, 0xe8, 0xb4, 0x09, 0x4f, 0x62, 0x63, 0xf6, 0x1e, 0x3c, 0xc6, 0xfa, + 0x1c, 0x3c, 0x96, 0x61, 0x42, 0xac, 0x62, 0x8b, 0x01, 0x6b, 0xa3, 0xa7, 0x9c, 0xbd, 0x96, 0x97, + 0xc4, 0x1a, 0x74, 0x83, 0xeb, 0x2b, 0xf0, 0x2d, 0x91, 0xe8, 0x26, 0xa7, 0x21, 0xb7, 0xd0, 0x88, + 0xa3, 0x0d, 0xc9, 0x67, 0x70, 0x5a, 0x16, 0x62, 0x27, 0x57, 0xb2, 0x39, 0x92, 0xe9, 0xe6, 0x36, + 0x48, 0xcc, 0xaf, 0x97, 0x87, 0x9e, 0xf9, 0xed, 0xcb, 0xa8, 0xb3, 0xb0, 0xe4, 0xf9, 0xf5, 0xc8, + 0x67, 0x61, 0xa2, 0xce, 0xec, 0x37, 0xf5, 0xf4, 0xba, 0x53, 0x35, 0xea, 0xf9, 0x2c, 0xf2, 0x7b, + 0x71, 0xa0, 0xbe, 0xac, 0x33, 0xaa, 0xb7, 0x0d, 0xdb, 0xa8, 0x51, 0x57, 0x52, 0x9b, 0x71, 0xc1, + 0x6d, 0x9d, 0x31, 0x23, 0x9f, 0x83, 0xc9, 0x80, 0x7b, 0xad, 0xee, 0x54, 0x8c, 0x7a, 0x7e, 0xfc, + 0x74, 0xec, 0x03, 0xb0, 0x37, 0x90, 0x1b, 0xd9, 0x86, 0x71, 0xf9, 0x44, 0x9f, 0x9f, 0x40, 0xee, + 0xcf, 0x0d, 0xe6, 0xce, 0x88, 0x22, 0x2e, 0x58, 0xb6, 0xde, 0x29, 0x62, 0x27, 0xb0, 0xd0, 0xf8, + 0xe5, 0x27, 0xd1, 0x60, 0x75, 0x0a, 0xd8, 0x2e, 0x1d, 0x58, 0xca, 0x29, 0x6e, 0x54, 0xc5, 0xa7, + 0xfa, 0x1b, 0x8a, 0xd8, 0x2a, 0x06, 0x1e, 0x1e, 0x88, 0x01, 0x19, 0x97, 0xb5, 0xd4, 0x2d, 0xd3, + 0x43, 0x07, 0x2f, 0xb1, 0xb4, 0x72, 0x78, 0x50, 0x4c, 0xf3, 0x65, 0xb8, 0xe2, 0x1d, 0x5b, 0xbb, + 0x05, 0xa1, 0x96, 0x46, 0xb6, 0x6b, 0xa6, 0xa7, 0x6e, 0xc1, 0x64, 0x00, 0x46, 0xb8, 0xaa, 0x4b, + 0x90, 0xc2, 0xda, 0xc0, 0x57, 0x7d, 0x6a, 0x90, 0xd6, 0x48, 0x92, 0x17, 0x94, 0xea, 0x02, 0x4c, + 0xdc, 0xc0, 0x78, 0xd3, 0x40, 0x5f, 0xeb, 0x3b, 0x23, 0x30, 0xb5, 0x8a, 0xe1, 0x19, 0x26, 0x56, + 0x0f, 0x4d, 0xe4, 0xe7, 0x20, 0x1d, 0x2e, 0x6c, 0x7e, 0x94, 0x59, 0x3e, 0x3c, 0x28, 0x8e, 0x9d, + 0x76, 0x49, 0x8f, 0x79, 0x62, 0x31, 0xef, 0xc0, 0x1c, 0x9b, 0x0c, 0xea, 0x7a, 0xba, 0x61, 0x9b, + 0x7c, 0xb5, 0xd6, 0x5c, 0xa3, 0x11, 0x1c, 0x6e, 0x5e, 0x90, 0x47, 0xcc, 0xd5, 0xa1, 0x14, 0x84, + 0x90, 0x4a, 0x5b, 0x9c, 0x72, 0xd1, 0x36, 0x6f, 0x86, 0x74, 0xda, 0x8c, 0xdf, 0xa7, 0x94, 0xdc, + 0x80, 0x2c, 0x27, 0xd3, 0x31, 0x0e, 0x92, 0x40, 0x27, 0xf6, 0x72, 0x1c, 0x73, 0x2e, 0x09, 0x0c, + 0x78, 0x00, 0x0d, 0x7f, 0xab, 0xcf, 0x03, 0x91, 0x64, 0x34, 0x50, 0xa6, 0x3f, 0x0b, 0x67, 0x23, + 0xcd, 0xc5, 0xc4, 0x86, 0xd6, 0x80, 0xcf, 0x6b, 0x9c, 0x35, 0xe8, 0x9a, 0x91, 0x88, 0x35, 0x50, + 0x7f, 0x0e, 0x60, 0xcb, 0x35, 0xaa, 0x74, 0x75, 0x8f, 0x29, 0xfa, 0x6b, 0x90, 0xf4, 0xad, 0x06, + 0x15, 0xfb, 0x59, 0xa1, 0xc4, 0x83, 0x4b, 0xa5, 0x20, 0xb8, 0x54, 0xda, 0x0a, 0x82, 0x4b, 0x4b, + 0x69, 0xc6, 0xe4, 0xeb, 0x3f, 0x2e, 0x2a, 0x1a, 0x52, 0xb0, 0x25, 0x12, 0x0d, 0xe3, 0x04, 0x9f, + 0xea, 0xf7, 0x14, 0x98, 0x5a, 0xac, 0x33, 0x53, 0xe3, 0x3b, 0xee, 0x8a, 0xdb, 0xd6, 0x5a, 0x36, + 0x53, 0x8a, 0x60, 0x2d, 0x60, 0x5f, 0x09, 0xae, 0x14, 0x42, 0xa3, 0x4f, 0xbc, 0x12, 0xc6, 0xc4, + 0x4a, 0x20, 0x6f, 0x40, 0x8a, 0xb2, 0x01, 0x79, 0xe2, 0x24, 0x15, 0xb7, 0x33, 0x77, 0x86, 0xaf, + 0x09, 0x22, 0xf5, 0x1a, 0xcc, 0x86, 0x88, 0x91, 0x77, 0x30, 0x4b, 0xe7, 0xbb, 0x71, 0x87, 0x5d, + 0xaa, 0x7f, 0xae, 0xc0, 0x5c, 0x37, 0x51, 0xff, 0xc3, 0x7c, 0xe2, 0xc3, 0x3c, 0xcc, 0x2f, 0xc3, + 0x98, 0xe9, 0xb6, 0x75, 0xb7, 0x65, 0x0b, 0x7d, 0x8f, 0xd3, 0x84, 0xae, 0x69, 0xd0, 0x52, 0x26, + 0xfe, 0xab, 0x7e, 0x55, 0x81, 0x5c, 0x07, 0xfb, 0xff, 0x03, 0x43, 0xf6, 0x0e, 0x4c, 0x4b, 0x78, + 0x84, 0x18, 0x57, 0x21, 0x2d, 0x86, 0x3a, 0x8c, 0xd6, 0x77, 0x8f, 0x75, 0x8c, 0x8f, 0xd5, 0x53, + 0x55, 0x18, 0xbf, 0xb5, 0x79, 0xf7, 0x4e, 0xc8, 0x36, 0x88, 0x30, 0x2a, 0x9d, 0x08, 0xa3, 0xda, + 0x80, 0x89, 0xa0, 0x7e, 0x95, 0x39, 0x05, 0xec, 0x5c, 0x83, 0xde, 0x81, 0x10, 0x05, 0xff, 0x60, + 0xa4, 0x55, 0xc7, 0xe4, 0x1a, 0x3f, 0xaa, 0xe1, 0x6f, 0x79, 0x21, 0x24, 0x22, 0x0b, 0x81, 0xd5, + 0x98, 0x3c, 0xcc, 0x83, 0x71, 0xcb, 0x8c, 0x16, 0x7c, 0xaa, 0x1f, 0x28, 0x90, 0x5d, 0x77, 0x6a, + 0x83, 0xf7, 0x90, 0x19, 0x18, 0xad, 0xd3, 0x3d, 0x5a, 0x17, 0x6b, 0x8c, 0x7f, 0x90, 0x27, 0x01, + 0xb8, 0x3f, 0x8b, 0x6b, 0x97, 0xf7, 0xca, 0x3d, 0x5c, 0xb6, 0x5e, 0x99, 0xd2, 0x32, 0x8f, 0x16, + 0x2b, 0xf9, 0xe1, 0x93, 0x79, 0xb8, 0x58, 0x95, 0x83, 0x44, 0xc3, 0xd8, 0x47, 0x07, 0x2f, 0xa3, + 0xb1, 0x9f, 0x0c, 0x64, 0xd3, 0xf0, 0x7d, 0xea, 0xda, 0x22, 0xc0, 0x18, 0x7c, 0xb2, 0x43, 0x9c, + 0x4b, 0x4d, 0xa3, 0xea, 0x0b, 0xcf, 0x5f, 0x7c, 0xb1, 0x23, 0xe5, 0x2e, 0xa5, 0x4d, 0x9d, 0x7f, + 0xe2, 0xf9, 0x48, 0x78, 0xfc, 0xac, 0x58, 0x0b, 0x4b, 0xd5, 0xbb, 0x40, 0xd6, 0x9d, 0x1a, 0x3b, + 0xbd, 0x59, 0xd2, 0x0e, 0xf5, 0x09, 0xe6, 0x6f, 0x63, 0x91, 0x98, 0xd4, 0xf3, 0xdd, 0xf1, 0x9b, + 0xba, 0x53, 0x2b, 0xc9, 0xa7, 0xd9, 0xa0, 0xbd, 0x5a, 0x82, 0xb3, 0xeb, 0x4e, 0xed, 0xba, 0x55, + 0xa7, 0xde, 0xba, 0xe5, 0xf9, 0x03, 0x4d, 0xe9, 0x06, 0xcc, 0x44, 0xdb, 0x0b, 0x08, 0xaf, 0xc1, + 0xe8, 0x0e, 0x2b, 0x14, 0x00, 0x2e, 0xf4, 0x03, 0xc0, 0xa8, 0x64, 0xeb, 0x89, 0x04, 0xea, 0x7b, + 0x30, 0x29, 0x38, 0x0e, 0x9c, 0x3a, 0x02, 0x49, 0x46, 0x23, 0x66, 0x0e, 0x7f, 0x4b, 0x22, 0x4d, + 0x0c, 0x12, 0x69, 0xb2, 0xaf, 0x48, 0xab, 0x30, 0xb1, 0xe9, 0x1b, 0xd5, 0xdd, 0xc1, 0x9a, 0xf3, + 0x09, 0x11, 0xbf, 0xe7, 0xc1, 0x97, 0xd8, 0x88, 0x1b, 0x32, 0xec, 0xc4, 0xe9, 0xd5, 0x4d, 0x48, + 0xb2, 0x11, 0xe2, 0x79, 0xdf, 0x10, 0x9b, 0x43, 0x46, 0xc3, 0xdf, 0xec, 0x28, 0xc5, 0x46, 0xa2, + 0x7b, 0xd6, 0xe7, 0x39, 0xef, 0x84, 0x96, 0x66, 0x05, 0x9b, 0xd6, 0xe7, 0x29, 0x29, 0x40, 0xba, + 0xea, 0xd8, 0x3e, 0xda, 0x61, 0x1e, 0xbf, 0x0f, 0xbf, 0xd5, 0xdf, 0x55, 0x60, 0xea, 0x06, 0xf5, + 0x71, 0x32, 0x06, 0x82, 0x7f, 0x02, 0x32, 0x75, 0xcb, 0xf3, 0x75, 0xc7, 0xae, 0xb7, 0xc5, 0x71, + 0x3a, 0xcd, 0x0a, 0xee, 0xda, 0xf5, 0x36, 0x79, 0x55, 0x8c, 0x6c, 0x14, 0x47, 0x76, 0x29, 0x66, + 0x64, 0xac, 0x33, 0xe9, 0xfe, 0xa1, 0x00, 0x69, 0xa1, 0xdb, 0x3c, 0xc2, 0x92, 0xd1, 0xc2, 0x6f, + 0x75, 0x0d, 0x72, 0x1d, 0x74, 0x42, 0x4d, 0x5e, 0x89, 0xaa, 0x49, 0x71, 0x40, 0x4f, 0x81, 0x8e, + 0x7c, 0x47, 0x81, 0xc9, 0x0d, 0xd7, 0xd9, 0x19, 0x46, 0x49, 0x96, 0x22, 0x63, 0x29, 0xc5, 0x9e, + 0x27, 0x65, 0x8e, 0x25, 0x69, 0x58, 0x79, 0x18, 0xe3, 0x87, 0x61, 0x8f, 0x1f, 0xa4, 0xb4, 0xe0, + 0x53, 0x3d, 0x0f, 0x49, 0x0c, 0xd1, 0xa7, 0x21, 0x79, 0x73, 0x75, 0x71, 0x23, 0x77, 0x86, 0x8c, + 0x41, 0x62, 0x79, 0x63, 0x3b, 0xa7, 0xa8, 0x57, 0x60, 0xf2, 0x6d, 0xea, 0xbb, 0x56, 0x75, 0xb0, + 0x43, 0xf2, 0x47, 0xe8, 0xf2, 0xee, 0xf8, 0x68, 0xb5, 0xd9, 0x6e, 0xf4, 0x58, 0x83, 0xd5, 0x6f, + 0xc1, 0x28, 0xee, 0x0a, 0x43, 0x9d, 0x8d, 0xbb, 0xce, 0xb3, 0x48, 0xa8, 0x5e, 0x65, 0x4e, 0xb1, + 0x80, 0xcb, 0x8d, 0xb9, 0x64, 0xa2, 0x95, 0xa8, 0xaf, 0xf2, 0x85, 0x11, 0x98, 0x0a, 0x1b, 0x8b, + 0xa3, 0xc1, 0xe3, 0xf6, 0x55, 0x6e, 0x40, 0x0a, 0x77, 0x93, 0xc0, 0x57, 0xb9, 0x32, 0xe0, 0xf8, + 0xdf, 0x19, 0x48, 0xe0, 0xa7, 0x73, 0x72, 0xb2, 0x12, 0x84, 0xa5, 0x13, 0xc8, 0x67, 0x61, 0x18, + 0x3e, 0x4c, 0xda, 0x91, 0x90, 0xb4, 0xda, 0x82, 0x1c, 0xab, 0x5d, 0xa1, 0x95, 0x56, 0x2d, 0xd0, + 0x85, 0xc8, 0x8e, 0xaf, 0x3c, 0x96, 0x1d, 0xff, 0x9f, 0x47, 0x60, 0x5a, 0xea, 0x57, 0x2c, 0xb9, + 0xaf, 0x2a, 0x5d, 0xe7, 0x97, 0xd7, 0x06, 0x0c, 0x2a, 0x42, 0xce, 0xbb, 0x11, 0x91, 0xd0, 0x4f, + 0xb2, 0x41, 0xbe, 0xff, 0xe3, 0x13, 0x02, 0x15, 0x28, 0x3e, 0xb4, 0xc9, 0x2a, 0x50, 0xc8, 0x4a, + 0xe8, 0xe4, 0x68, 0x66, 0x82, 0x47, 0x33, 0xdf, 0x8a, 0x46, 0x33, 0xaf, 0x0e, 0xd3, 0x51, 0x6f, + 0x94, 0xfc, 0x8b, 0x09, 0x18, 0xdb, 0xda, 0xb7, 0xf1, 0x24, 0x76, 0x0f, 0x46, 0x84, 0x0a, 0x8f, + 0x2f, 0x2d, 0x32, 0x30, 0xff, 0x32, 0xec, 0xda, 0xe4, 0x17, 0xda, 0x2d, 0xcb, 0x2c, 0x6d, 0x6f, + 0xaf, 0xb1, 0x99, 0x1f, 0x59, 0x5b, 0xd1, 0x46, 0x2c, 0x93, 0xbc, 0x8e, 0xa7, 0x10, 0xd7, 0x17, + 0x20, 0x87, 0x3b, 0x30, 0x70, 0x12, 0xb6, 0xc9, 0xf9, 0xfb, 0xb6, 0x6e, 0x52, 0xaf, 0xea, 0x5a, + 0x4d, 0xdf, 0x72, 0x6c, 0xe1, 0xba, 0x4c, 0xfa, 0xfb, 0xf6, 0x4a, 0xa7, 0x94, 0x7c, 0x1c, 0xce, + 0xd9, 0xad, 0x06, 0x0f, 0x91, 0x35, 0xd8, 0xe6, 0xa1, 0xd3, 0x7d, 0x5a, 0x6d, 0x05, 0x51, 0xd0, + 0x51, 0x6d, 0xd6, 0x6e, 0x35, 0x36, 0xc3, 0xda, 0x55, 0x51, 0x49, 0x8a, 0x90, 0x65, 0x74, 0x2e, + 0xe5, 0xde, 0x05, 0x46, 0xb1, 0x34, 0xb0, 0x5b, 0x0d, 0x8d, 0x97, 0x90, 0x05, 0xc8, 0xb1, 0x06, + 0x46, 0xcb, 0x77, 0xc2, 0x56, 0xdc, 0x64, 0x4e, 0xda, 0xad, 0xc6, 0x62, 0xcb, 0x77, 0x82, 0x96, + 0x6f, 0x41, 0xda, 0xa4, 0x86, 0x59, 0xb7, 0x6c, 0x1e, 0x2c, 0x1a, 0x76, 0xa8, 0x21, 0x95, 0xfa, + 0xbf, 0x23, 0x90, 0x5d, 0xac, 0xfa, 0xd6, 0x1e, 0xbd, 0xd7, 0xa2, 0x6e, 0x9b, 0xcc, 0x85, 0x93, + 0x91, 0x59, 0x4a, 0x49, 0x12, 0xcd, 0x41, 0xc2, 0x7b, 0x18, 0xf8, 0x77, 0xec, 0x67, 0x47, 0xc6, + 0x89, 0xe3, 0xcb, 0xf8, 0x69, 0x98, 0xb4, 0x3c, 0xdd, 0xb4, 0x3c, 0xdf, 0xb5, 0x2a, 0xad, 0x4e, + 0xdc, 0x78, 0xc2, 0xf2, 0x56, 0x3a, 0x85, 0x64, 0x09, 0x46, 0x9b, 0xf7, 0x83, 0x90, 0xf1, 0x64, + 0xdf, 0x0b, 0xad, 0xd0, 0xad, 0xee, 0x8c, 0xa1, 0xb4, 0xc1, 0x68, 0x34, 0x4e, 0x8a, 0xbb, 0x69, + 0xe7, 0xbe, 0x42, 0x59, 0x18, 0x91, 0x6e, 0x1d, 0x3e, 0x03, 0x29, 0x36, 0xd5, 0x96, 0x89, 0xc2, + 0x1b, 0x5f, 0x5a, 0x39, 0x9d, 0xf6, 0x8d, 0x32, 0x8d, 0x5e, 0xd1, 0x46, 0xfd, 0x7d, 0x7b, 0xcd, + 0x54, 0x9f, 0x86, 0x51, 0x04, 0x42, 0x26, 0x20, 0xb3, 0xa1, 0xad, 0x6e, 0x2c, 0x6a, 0x6b, 0x77, + 0x6e, 0xe4, 0xce, 0xb0, 0xcf, 0xd5, 0x9f, 0x59, 0x5d, 0xde, 0xde, 0x62, 0x9f, 0x8a, 0xfa, 0x22, + 0x9c, 0x65, 0x4e, 0xdf, 0x26, 0xf5, 0x3c, 0xcb, 0xb1, 0xc3, 0x6d, 0xae, 0x00, 0xe9, 0x96, 0x47, + 0x5d, 0xc9, 0xb1, 0x09, 0xbf, 0xd5, 0xef, 0x27, 0x61, 0x4c, 0xb4, 0x7f, 0xac, 0x7b, 0x9c, 0x8c, + 0x61, 0x24, 0x8a, 0x81, 0xcd, 0x60, 0xb5, 0x6e, 0x51, 0xdb, 0x0f, 0x6f, 0x39, 0xf9, 0x22, 0x99, + 0xe0, 0xa5, 0xe2, 0xd2, 0x92, 0x5c, 0x81, 0x1c, 0x5e, 0x1c, 0x55, 0x31, 0x39, 0x44, 0x47, 0x56, + 0xdc, 0xd7, 0x9f, 0x92, 0xca, 0xef, 0x30, 0x8e, 0x9b, 0x30, 0x69, 0xe0, 0x24, 0xea, 0x22, 0xa4, + 0x8e, 0x19, 0x07, 0xd9, 0x68, 0x2c, 0xe3, 0xe8, 0x59, 0x0f, 0xc2, 0x72, 0x46, 0x58, 0xc4, 0x16, + 0x48, 0xa8, 0xa4, 0xa9, 0xe3, 0x2b, 0xe9, 0x55, 0x98, 0xae, 0x1b, 0x9e, 0xaf, 0x4b, 0xa8, 0xda, + 0x78, 0x84, 0xc8, 0x68, 0x53, 0xac, 0xa2, 0x77, 0xd9, 0x64, 0x50, 0x8b, 0xe4, 0x65, 0x53, 0x84, + 0xac, 0xc1, 0x0e, 0x7c, 0x7a, 0xa5, 0xed, 0x53, 0x1e, 0x22, 0x4d, 0x68, 0x80, 0x45, 0x4b, 0xac, + 0x84, 0x5c, 0x86, 0xa9, 0x86, 0xb1, 0xaf, 0xcb, 0x8d, 0xb2, 0xd8, 0x68, 0xa2, 0x61, 0xec, 0x2f, + 0x76, 0xda, 0x2d, 0x02, 0x08, 0x1c, 0xfe, 0xbe, 0x2d, 0x62, 0x97, 0x6a, 0x5c, 0xf4, 0x80, 0x1b, + 0x57, 0x2d, 0xc3, 0xa9, 0xb6, 0xf6, 0xed, 0x5b, 0xc9, 0xf4, 0x58, 0x2e, 0xad, 0xfe, 0xba, 0x02, + 0xd3, 0xb2, 0xc2, 0x71, 0xd7, 0xe3, 0x71, 0xaa, 0xd1, 0xd1, 0x21, 0x98, 0x3f, 0x54, 0x60, 0x26, + 0xaa, 0xfc, 0x62, 0x7f, 0x5d, 0x81, 0xb4, 0x27, 0xca, 0xc4, 0x06, 0x1b, 0x37, 0x56, 0x41, 0x1e, + 0x44, 0xa6, 0x03, 0x4a, 0x72, 0xab, 0x6b, 0x53, 0x8c, 0xb3, 0x1f, 0x3d, 0x22, 0x89, 0xee, 0x8b, + 0xea, 0x43, 0x20, 0xcb, 0x86, 0x5d, 0xa5, 0x75, 0x9c, 0xef, 0x81, 0x0e, 0xf3, 0x65, 0x48, 0xa3, + 0xbe, 0xf0, 0x4b, 0x73, 0x66, 0x4c, 0xb3, 0xcc, 0x39, 0x43, 0x62, 0xe6, 0x64, 0x61, 0x65, 0xd7, + 0x12, 0x4b, 0x74, 0x2d, 0xf3, 0x1b, 0x70, 0x36, 0xd2, 0xa5, 0x90, 0x0d, 0x3b, 0xbd, 0x60, 0x31, + 0x35, 0xc5, 0x85, 0x5f, 0xf8, 0xdd, 0x09, 0x07, 0x8c, 0x48, 0xe1, 0x00, 0xb5, 0x0d, 0x33, 0x9c, + 0x91, 0x18, 0xe0, 0x40, 0xf4, 0xcf, 0x01, 0x08, 0x21, 0x06, 0xf8, 0xc7, 0xf9, 0x6d, 0xb4, 0x60, + 0xb0, 0xb6, 0xa2, 0x65, 0x44, 0x83, 0x01, 0x63, 0x58, 0x83, 0xd9, 0xae, 0xae, 0x4f, 0x3c, 0x8a, + 0x7f, 0x55, 0x20, 0xb7, 0xd9, 0x34, 0xec, 0x48, 0x78, 0xf2, 0x52, 0xd7, 0x10, 0x96, 0xa0, 0xa3, + 0xb7, 0xe1, 0x70, 0x34, 0xf9, 0x5e, 0x8d, 0x8f, 0xe6, 0x95, 0x9f, 0x1c, 0x14, 0x5f, 0x3c, 0x9e, + 0xc7, 0x75, 0x9b, 0xb6, 0xa5, 0xeb, 0xb8, 0x3b, 0x9d, 0xeb, 0xb8, 0xc4, 0x69, 0x38, 0x8a, 0x5b, + 0x3c, 0xf5, 0xcf, 0x14, 0x98, 0x96, 0x46, 0x27, 0xa4, 0xb4, 0x0e, 0x59, 0xdf, 0xf1, 0x8d, 0xba, + 0x1e, 0xc4, 0x54, 0x7b, 0xae, 0xf3, 0xba, 0x83, 0xbb, 0x6f, 0xff, 0xf4, 0xf2, 0x32, 0xf2, 0x08, + 0xd2, 0x52, 0x90, 0x1e, 0x4b, 0x98, 0x31, 0xe2, 0xee, 0x72, 0xd5, 0x69, 0xd9, 0xbe, 0x88, 0x0e, + 0x01, 0x16, 0x2d, 0xb3, 0x12, 0xf2, 0x32, 0xcc, 0x19, 0xcd, 0xa6, 0xeb, 0xec, 0x5b, 0x0d, 0xc3, + 0xa7, 0x6c, 0x7f, 0xde, 0x15, 0x36, 0x89, 0x67, 0x0c, 0xcc, 0x48, 0xb5, 0x2b, 0x96, 0xb7, 0x8b, + 0xa6, 0x49, 0xfd, 0x29, 0x98, 0x11, 0x97, 0x43, 0xd1, 0x1b, 0x87, 0x61, 0xe6, 0x46, 0xfd, 0xf6, + 0x04, 0xcc, 0x76, 0x51, 0xf7, 0x46, 0x27, 0xd3, 0x1f, 0xb6, 0x49, 0xfa, 0x3b, 0x05, 0xce, 0x06, + 0x17, 0x58, 0x72, 0x7e, 0x4b, 0x06, 0xed, 0xc4, 0xf5, 0xf8, 0xf3, 0x6d, 0x2f, 0xd6, 0x52, 0x78, + 0x39, 0xd6, 0x3f, 0xcf, 0xa5, 0xab, 0xfa, 0xe4, 0x79, 0x2e, 0xcd, 0xae, 0x7e, 0x0a, 0xff, 0x98, + 0xe1, 0x59, 0x41, 0x61, 0x46, 0x40, 0xcf, 0x1d, 0xa2, 0xd2, 0xe7, 0x0e, 0xf1, 0x97, 0x15, 0x98, + 0x95, 0x92, 0x04, 0xf4, 0xee, 0xb0, 0xe9, 0xdd, 0xc3, 0x83, 0xe2, 0xd9, 0xed, 0x4e, 0x83, 0x53, + 0x9f, 0xa7, 0xce, 0xb6, 0xba, 0x99, 0x99, 0x1e, 0xf9, 0x63, 0x05, 0x2e, 0x4b, 0x19, 0x06, 0x3d, + 0x09, 0x0a, 0x12, 0xac, 0x04, 0xc2, 0xfa, 0xec, 0xe1, 0x41, 0xf1, 0x62, 0x27, 0xfd, 0x20, 0x9a, + 0xb2, 0x70, 0x6a, 0x8c, 0x17, 0xdd, 0x58, 0xce, 0xa6, 0x47, 0xbe, 0xa4, 0x40, 0x3e, 0x9a, 0x15, + 0x21, 0x41, 0x4c, 0x22, 0xc4, 0x8d, 0xc3, 0x83, 0xe2, 0xcc, 0x1d, 0x29, 0x47, 0xe2, 0xd4, 0xb0, + 0x66, 0xec, 0x1e, 0x6e, 0xa6, 0x47, 0xf6, 0x81, 0x04, 0xf9, 0x14, 0x12, 0x86, 0x51, 0xc4, 0x70, + 0xfb, 0xf0, 0xa0, 0x38, 0x75, 0x87, 0x67, 0x57, 0x9c, 0xba, 0xfb, 0x29, 0x5b, 0x66, 0x64, 0x7a, + 0xe4, 0x6b, 0x0a, 0x9c, 0xef, 0xca, 0xee, 0x90, 0x10, 0xa4, 0x10, 0xc1, 0xe6, 0xe1, 0x41, 0xf1, + 0xdc, 0x76, 0xb4, 0xd1, 0xa9, 0x91, 0x9c, 0x6b, 0xf5, 0x63, 0x68, 0x7a, 0xe4, 0x0f, 0x14, 0x50, + 0x8f, 0xca, 0x20, 0x91, 0xa0, 0x8d, 0x21, 0xb4, 0x77, 0x0e, 0x0f, 0x8a, 0xf3, 0xf7, 0xfa, 0xe6, + 0x93, 0x9c, 0x1a, 0xe1, 0xfc, 0xc3, 0x18, 0xbe, 0xa6, 0x47, 0xbe, 0xa9, 0xc0, 0x85, 0xde, 0x84, + 0x15, 0x09, 0x62, 0xba, 0x23, 0x3d, 0x2d, 0x9a, 0xbe, 0x72, 0x7a, 0xe9, 0xb9, 0xfd, 0x18, 0x9a, + 0x1e, 0xf9, 0x8a, 0x02, 0xf9, 0x68, 0x0a, 0x8c, 0x04, 0x28, 0x83, 0x80, 0xb4, 0xc3, 0x83, 0xe2, + 0xdc, 0xdd, 0xbd, 0x0f, 0x75, 0x36, 0xe7, 0x9c, 0xbd, 0x7e, 0x93, 0x59, 0x78, 0x5f, 0x09, 0xf7, + 0x83, 0x81, 0x99, 0x7b, 0x9b, 0xd1, 0x50, 0xc4, 0x1b, 0xc7, 0x36, 0xdb, 0xb2, 0xe5, 0x94, 0xa2, + 0x13, 0xb7, 0x92, 0x69, 0x25, 0x97, 0x56, 0x5f, 0x85, 0xdc, 0x4d, 0xc7, 0x3f, 0xc1, 0x9e, 0xf6, + 0xe5, 0x31, 0x98, 0x96, 0x28, 0x3f, 0x82, 0xd4, 0xd9, 0xbf, 0x57, 0x60, 0xf6, 0xbe, 0xe3, 0xf3, + 0x99, 0xeb, 0x93, 0xb1, 0xb9, 0x1c, 0x23, 0x9a, 0x1e, 0xa4, 0x9d, 0x92, 0xe8, 0x76, 0xb6, 0x21, + 0xb6, 0xb3, 0xe9, 0xee, 0xfa, 0x13, 0xef, 0x67, 0xd3, 0xf7, 0xbb, 0x7b, 0x2a, 0xec, 0x41, 0x3a, + 0x60, 0x4f, 0x3e, 0x09, 0x49, 0x93, 0x7a, 0x55, 0xe1, 0xf6, 0xa8, 0x7d, 0x32, 0x5c, 0xb0, 0x5d, + 0x10, 0x93, 0x09, 0x7d, 0x76, 0xa4, 0x3a, 0x22, 0x6b, 0x6b, 0xa4, 0x7f, 0xd6, 0x56, 0xe1, 0x1f, + 0x14, 0x98, 0xc0, 0x3b, 0xfc, 0x70, 0xbe, 0x1e, 0x77, 0x82, 0xc0, 0x3b, 0x00, 0x9d, 0x29, 0x13, + 0xf3, 0xf4, 0xca, 0x89, 0xe6, 0x29, 0x4c, 0xf4, 0x0c, 0x5a, 0x14, 0x7e, 0x4d, 0xe1, 0x6e, 0x41, + 0x38, 0x98, 0xa1, 0xdc, 0x02, 0x0d, 0x52, 0x08, 0x2e, 0x40, 0xf3, 0xfa, 0xb1, 0xd0, 0x44, 0xa4, + 0xa7, 0x09, 0x4e, 0x85, 0x5f, 0x84, 0xb9, 0xfe, 0xea, 0xd4, 0x67, 0x3d, 0xdf, 0x8d, 0xae, 0xe7, + 0x4f, 0x1c, 0xab, 0x7b, 0x79, 0xb8, 0x72, 0xa4, 0xf1, 0x0a, 0x8c, 0x0f, 0x7b, 0x55, 0xfe, 0xdd, + 0x51, 0x91, 0x34, 0xf3, 0x91, 0xac, 0x59, 0x39, 0x7e, 0x3f, 0xf2, 0x18, 0xe2, 0xf7, 0x7f, 0xad, + 0xc0, 0x8c, 0x2b, 0x06, 0x12, 0x31, 0x09, 0x3c, 0x0c, 0xff, 0xa9, 0x41, 0x37, 0x16, 0x9d, 0x68, + 0x75, 0xc0, 0xe4, 0x08, 0x73, 0xd0, 0x5d, 0x7f, 0x72, 0x73, 0xe0, 0x76, 0xf7, 0x54, 0xf8, 0x46, + 0xb7, 0x22, 0x17, 0x20, 0x1d, 0xb4, 0x0a, 0xce, 0x8d, 0xee, 0x91, 0x4a, 0xde, 0xef, 0xe1, 0xce, + 0x5b, 0x30, 0x6a, 0xd9, 0x3b, 0x4e, 0x70, 0x1b, 0x71, 0xac, 0x8b, 0x1b, 0x24, 0x2c, 0xbc, 0x0b, + 0x73, 0xfd, 0x45, 0xd2, 0x47, 0xa5, 0x6f, 0x47, 0x55, 0xfa, 0x95, 0xa1, 0x85, 0x7e, 0x84, 0x3a, + 0xdf, 0x4a, 0xa6, 0x93, 0xb9, 0x51, 0xf5, 0x79, 0x20, 0x2b, 0x9d, 0xa7, 0x6e, 0x03, 0xaf, 0xc6, + 0x16, 0x84, 0x6d, 0x1b, 0xdc, 0xf2, 0x4f, 0x46, 0x60, 0x1c, 0x9b, 0x06, 0xef, 0xab, 0x1e, 0xb7, + 0x15, 0x7c, 0x16, 0xa6, 0xa9, 0x5d, 0x75, 0xdb, 0x18, 0x52, 0x0f, 0x92, 0xe7, 0xf0, 0x8c, 0xae, + 0xe5, 0x3a, 0x15, 0xe2, 0xca, 0xab, 0x18, 0x1c, 0x87, 0xf9, 0x7d, 0x27, 0x3f, 0x94, 0xf2, 0x13, + 0x2e, 0x5e, 0x89, 0x76, 0x1a, 0xf0, 0x53, 0x6b, 0x52, 0x6a, 0xc0, 0xc3, 0x68, 0x0b, 0x90, 0x13, + 0x61, 0xb4, 0x5d, 0xda, 0x16, 0x6c, 0x78, 0x66, 0xb7, 0x08, 0x3e, 0xde, 0xa6, 0x6d, 0xce, 0x2a, + 0xda, 0x92, 0xf3, 0x4b, 0x75, 0xb5, 0xe4, 0xe7, 0xdf, 0x4f, 0xc3, 0x64, 0x20, 0xdd, 0x30, 0x23, + 0x24, 0x30, 0xa4, 0x3c, 0x78, 0xf5, 0x4c, 0xec, 0xb5, 0x76, 0x47, 0xda, 0x41, 0xcc, 0x89, 0x13, + 0xab, 0xaf, 0xc1, 0x74, 0xe7, 0xfa, 0xe0, 0x58, 0x1e, 0xc8, 0x7f, 0x8f, 0x01, 0x91, 0x49, 0x05, + 0xae, 0x26, 0x26, 0x64, 0x88, 0x52, 0x81, 0xed, 0x56, 0xfc, 0x95, 0x7b, 0x17, 0x8b, 0xd2, 0xb2, + 0x53, 0xaf, 0xd3, 0xaa, 0x4f, 0xcd, 0xb0, 0xae, 0x27, 0x9f, 0x53, 0xea, 0x83, 0x2c, 0x03, 0x60, + 0x0c, 0xd5, 0xa5, 0x1e, 0x3d, 0xde, 0x4d, 0x41, 0x86, 0xd1, 0x69, 0x8c, 0x8c, 0xbc, 0x0a, 0x79, + 0xcb, 0xf6, 0xa9, 0x6b, 0x1b, 0x75, 0xdd, 0x68, 0x36, 0x31, 0x8a, 0xac, 0x37, 0x5d, 0xba, 0x63, + 0xed, 0x8b, 0x60, 0xf2, 0x6c, 0x50, 0xbf, 0xd8, 0x6c, 0xde, 0x31, 0x1a, 0x74, 0x03, 0x2b, 0xc9, + 0x7b, 0x30, 0x8e, 0x0f, 0x0a, 0xd8, 0x84, 0x39, 0x76, 0x10, 0x50, 0xde, 0x3a, 0xde, 0x88, 0x57, + 0xc5, 0xe3, 0xb2, 0x70, 0xe4, 0x5b, 0x1d, 0x96, 0x3d, 0x63, 0x8f, 0xf4, 0x57, 0xf8, 0x5b, 0x05, + 0xe6, 0x03, 0xf2, 0x3e, 0xf2, 0xba, 0x4d, 0xdb, 0xe4, 0x3a, 0xa4, 0x99, 0x7e, 0x85, 0x99, 0x3e, + 0x5d, 0xe1, 0x9d, 0x87, 0xf5, 0x52, 0x7f, 0xc2, 0x20, 0xe7, 0x64, 0x97, 0xb6, 0x57, 0x0c, 0xdf, + 0x90, 0x77, 0xaa, 0x91, 0x0f, 0x79, 0xa7, 0x62, 0xc3, 0xb8, 0x10, 0x37, 0xef, 0xc4, 0xec, 0xd8, + 0xbd, 0xec, 0xb5, 0xf5, 0x93, 0x89, 0x37, 0x76, 0x98, 0x68, 0x4b, 0xdf, 0x0c, 0x52, 0x0b, 0x47, + 0x7a, 0xa3, 0xdf, 0xfd, 0xe5, 0x14, 0x49, 0x29, 0x2c, 0xfc, 0x48, 0x81, 0xcb, 0xc3, 0x4d, 0x26, + 0xd1, 0xf8, 0x42, 0xf1, 0xe4, 0x79, 0x79, 0xbe, 0xab, 0xbf, 0xa1, 0xf4, 0x21, 0x83, 0x6c, 0x1e, + 0xf7, 0x0c, 0xa9, 0x5f, 0x1a, 0x81, 0x42, 0x38, 0xfe, 0xc8, 0xce, 0xd0, 0x74, 0x5c, 0x9f, 0x4c, + 0x86, 0x97, 0x7a, 0x09, 0xbc, 0x95, 0xb8, 0x00, 0x99, 0xaa, 0xd3, 0x68, 0xd6, 0xa9, 0x4f, 0x4d, + 0x91, 0xb7, 0xd2, 0x29, 0x20, 0x2f, 0xc1, 0x6c, 0xb8, 0x82, 0xf5, 0x1d, 0xcb, 0xae, 0x51, 0xb7, + 0xe9, 0x5a, 0xb6, 0x2f, 0x82, 0xbb, 0x33, 0x61, 0xe5, 0xf5, 0x4e, 0x1d, 0x79, 0x13, 0xf2, 0x1d, + 0x22, 0xe9, 0x19, 0x36, 0x1b, 0x2e, 0x3e, 0x2c, 0x45, 0x81, 0x28, 0xda, 0x9c, 0xd7, 0x07, 0x26, + 0x66, 0x1b, 0x8c, 0xbb, 0xdc, 0xc2, 0x51, 0x53, 0x37, 0x7c, 0xf1, 0x66, 0x6e, 0x38, 0x53, 0x91, + 0x0d, 0x29, 0x17, 0x7d, 0xf5, 0x73, 0xf0, 0xcc, 0xb2, 0x4b, 0x0d, 0x9f, 0x1e, 0x2d, 0x8f, 0xc0, + 0x94, 0x1e, 0x39, 0x50, 0xe5, 0xe8, 0x81, 0xaa, 0x6d, 0x58, 0x18, 0xcc, 0x5f, 0xd8, 0xdb, 0xb7, + 0x21, 0xe5, 0x62, 0x89, 0x50, 0xa1, 0x57, 0x86, 0x59, 0x1a, 0xbd, 0xec, 0x04, 0x13, 0xf5, 0x29, + 0x50, 0x8f, 0x6e, 0x15, 0xbe, 0x0b, 0xfc, 0x05, 0xb8, 0x14, 0xdb, 0x4a, 0x60, 0xdb, 0x86, 0x31, + 0xce, 0x36, 0xd8, 0x08, 0x4e, 0x06, 0x2e, 0xb0, 0x43, 0x82, 0x97, 0xfa, 0x7d, 0x05, 0x66, 0xfa, + 0xb5, 0xee, 0xd1, 0xc1, 0x23, 0x85, 0x3f, 0x12, 0xa3, 0x65, 0x37, 0x60, 0xbc, 0x1a, 0x2c, 0x3b, + 0xa6, 0x25, 0xc7, 0xd9, 0x50, 0xb2, 0x21, 0xe5, 0x22, 0xbe, 0x07, 0xf3, 0x5d, 0xa3, 0x1a, 0xbe, + 0x7a, 0xc3, 0x0f, 0xf5, 0xd3, 0xf0, 0x44, 0xff, 0x91, 0x72, 0x7d, 0x79, 0x2d, 0x46, 0xc7, 0xf9, + 0xc0, 0x8e, 0xd0, 0x6e, 0xf5, 0x21, 0x5c, 0xe8, 0xcf, 0x58, 0x4c, 0xc6, 0x3d, 0xc8, 0x4a, 0xfc, + 0x84, 0x81, 0x2b, 0x1f, 0x77, 0x42, 0x64, 0x1e, 0xea, 0x4b, 0x90, 0xbf, 0xe5, 0x54, 0x34, 0x5a, + 0xb3, 0x3c, 0xdf, 0x6d, 0x8b, 0x0c, 0x8c, 0x41, 0xee, 0xdf, 0x7f, 0x29, 0x70, 0xbe, 0x0f, 0xd5, + 0x47, 0x70, 0x1a, 0xfa, 0x0c, 0x8c, 0xbb, 0x2d, 0xdb, 0xb6, 0xec, 0x9a, 0xfe, 0xc0, 0xa9, 0x04, + 0x27, 0xd0, 0xb8, 0xb4, 0x9a, 0x23, 0x71, 0x62, 0x4d, 0x56, 0x70, 0xbb, 0xe5, 0x54, 0xbc, 0xc2, + 0x2c, 0x24, 0x6e, 0x39, 0x95, 0x6e, 0x15, 0x54, 0xaf, 0x40, 0xee, 0x96, 0x53, 0x89, 0x8a, 0x66, + 0x16, 0x52, 0x0f, 0x9c, 0x4a, 0x67, 0x46, 0x47, 0x1f, 0x38, 0x95, 0x35, 0x53, 0x5d, 0x85, 0x69, + 0xa9, 0xa9, 0x90, 0xc7, 0x0b, 0x90, 0x78, 0xe0, 0x54, 0xc4, 0xda, 0x9e, 0xef, 0xda, 0x1e, 0xf0, + 0x0f, 0x5e, 0xf0, 0x3f, 0x7e, 0x81, 0x80, 0x58, 0xd3, 0xab, 0xaf, 0x00, 0x74, 0xd2, 0x18, 0xc9, + 0x0c, 0xe4, 0x6e, 0xdc, 0xd5, 0xee, 0x6e, 0x6f, 0xad, 0xdd, 0x59, 0xd5, 0x37, 0xb7, 0x16, 0x97, + 0x6f, 0x6f, 0xe6, 0xce, 0x90, 0x69, 0x98, 0xd8, 0xba, 0xa9, 0xad, 0x2e, 0xae, 0x04, 0x45, 0xca, + 0xd5, 0xa7, 0x20, 0x1d, 0xe4, 0x08, 0x4a, 0x49, 0x72, 0x93, 0x00, 0x21, 0xf9, 0x66, 0x4e, 0xb9, + 0xf6, 0x37, 0x4f, 0x43, 0x4a, 0x38, 0xca, 0xdf, 0x56, 0x60, 0x5c, 0x7e, 0xad, 0x4e, 0x4a, 0xc3, + 0xbd, 0x47, 0x0f, 0xc4, 0x50, 0x28, 0x0f, 0xdd, 0x9e, 0xcb, 0x42, 0x7d, 0xe6, 0xfd, 0x7f, 0xfa, + 0x8f, 0xdf, 0x1a, 0xf9, 0x18, 0x29, 0x96, 0x85, 0x13, 0x5f, 0x96, 0x1f, 0xb3, 0x97, 0xdf, 0x15, + 0x8a, 0xf3, 0x88, 0xfc, 0x8a, 0x02, 0x63, 0xc1, 0xe1, 0x22, 0x2e, 0x4b, 0x29, 0xfa, 0xf6, 0xbd, + 0x70, 0x75, 0x98, 0xa6, 0x02, 0x8b, 0x8a, 0x58, 0x2e, 0x90, 0x42, 0x88, 0x45, 0x24, 0x34, 0x4b, + 0x30, 0x5c, 0x18, 0xc5, 0xa7, 0xca, 0xe4, 0x99, 0xc1, 0x8f, 0x99, 0x39, 0x82, 0x85, 0x61, 0x5f, + 0x3d, 0xab, 0x73, 0xd8, 0x7f, 0x8e, 0x4c, 0x86, 0xfd, 0xf3, 0x57, 0xd5, 0xef, 0x41, 0x12, 0xf3, + 0x12, 0x2f, 0x0f, 0xe0, 0x14, 0xf4, 0x78, 0xac, 0x07, 0xdc, 0xea, 0x45, 0xec, 0xb5, 0x40, 0xf2, + 0xd1, 0x5e, 0xa5, 0x31, 0x3f, 0xe2, 0x2f, 0x8e, 0x31, 0x17, 0x8d, 0x3c, 0x3b, 0x5c, 0xc6, 0xda, + 0xd1, 0x48, 0x8e, 0x4c, 0x6f, 0x53, 0x67, 0x11, 0xc9, 0x14, 0x99, 0x08, 0x91, 0xb8, 0xc6, 0x8e, + 0x4f, 0xbe, 0xa0, 0x40, 0x8a, 0x07, 0x6d, 0xc8, 0xc0, 0xd7, 0x66, 0xa1, 0xd4, 0xaf, 0x0c, 0xd1, + 0x52, 0x74, 0xfb, 0x31, 0xec, 0xf6, 0x09, 0x72, 0x5e, 0xea, 0x96, 0x35, 0x90, 0x24, 0xe0, 0x41, + 0x8a, 0x3f, 0x19, 0x8a, 0x45, 0x10, 0x79, 0x55, 0x54, 0x90, 0xd3, 0xae, 0xc5, 0xdf, 0xb7, 0x59, + 0xb3, 0x77, 0x1c, 0x21, 0xf5, 0xde, 0x4e, 0xc5, 0x9f, 0xc2, 0xe9, 0x74, 0xfa, 0x2d, 0x05, 0xb2, + 0xd2, 0x5b, 0x17, 0xf2, 0xfc, 0x70, 0x6f, 0x62, 0x82, 0xfe, 0x4b, 0xc3, 0x36, 0x17, 0x62, 0xb8, + 0x8c, 0x88, 0x2e, 0x92, 0xf9, 0x10, 0x11, 0xbf, 0x1c, 0x46, 0x4f, 0x54, 0x82, 0xf5, 0x0d, 0x05, + 0x32, 0xe1, 0x63, 0x84, 0x58, 0x75, 0xe8, 0x7e, 0x82, 0x11, 0xab, 0x0e, 0x3d, 0xef, 0x23, 0xd4, + 0x2b, 0x08, 0xe8, 0x12, 0xf9, 0x58, 0x08, 0xc8, 0x08, 0xda, 0xa0, 0x8a, 0x4a, 0x98, 0xbe, 0xa3, + 0xc0, 0x64, 0xf4, 0xb1, 0x0a, 0x79, 0x61, 0xa8, 0xbe, 0xa4, 0x08, 0x5f, 0xe1, 0xc5, 0x63, 0x50, + 0x08, 0x88, 0xcf, 0x22, 0xc4, 0xa7, 0xc9, 0xa5, 0x3e, 0x10, 0x51, 0x89, 0xca, 0xef, 0x06, 0xb1, + 0xba, 0x47, 0xe4, 0xcb, 0x0a, 0x8c, 0xcb, 0xe9, 0x22, 0xb1, 0xc6, 0xb5, 0x4f, 0x6e, 0x57, 0xac, + 0x71, 0xed, 0x97, 0x0e, 0xa3, 0x9e, 0x47, 0x78, 0x67, 0xc9, 0x74, 0x08, 0x2f, 0xcc, 0x71, 0xf9, + 0x6d, 0x91, 0xce, 0x83, 0xaf, 0x1c, 0x3f, 0x3a, 0x44, 0x45, 0x44, 0x74, 0x9e, 0x9c, 0x0b, 0x11, + 0xe1, 0x9b, 0x4d, 0x5d, 0xc6, 0x95, 0x95, 0xb2, 0x57, 0x62, 0x95, 0xbe, 0x37, 0xb1, 0x26, 0x56, + 0xe9, 0xfb, 0x24, 0xc5, 0xf4, 0xdb, 0x7e, 0xb0, 0x15, 0xcf, 0xda, 0x92, 0x34, 0xec, 0xf7, 0x14, + 0x98, 0x88, 0x64, 0xa4, 0x90, 0xf2, 0xc0, 0xae, 0xa2, 0x69, 0x33, 0x85, 0x17, 0x86, 0x27, 0x38, + 0x72, 0x05, 0x08, 0x74, 0x42, 0x5c, 0x12, 0xbe, 0x2f, 0x28, 0x90, 0x09, 0xf3, 0x40, 0x62, 0x57, + 0x65, 0x77, 0x2e, 0x4c, 0xec, 0xaa, 0xec, 0x49, 0x2d, 0x51, 0xf3, 0x88, 0x89, 0xa8, 0x1d, 0x23, + 0xed, 0x35, 0x0d, 0xfb, 0x75, 0xe5, 0x2a, 0x79, 0x0f, 0xdd, 0x88, 0xea, 0x6e, 0xbc, 0x99, 0x8e, + 0xbc, 0xef, 0x28, 0xc4, 0xed, 0xa2, 0xf2, 0xab, 0xa6, 0x3e, 0xf6, 0xd2, 0x43, 0x46, 0x92, 0x08, + 0x7e, 0x49, 0x81, 0x31, 0xf1, 0x8c, 0x20, 0xd6, 0x43, 0x88, 0x3e, 0x35, 0x18, 0x1e, 0x42, 0xaf, + 0x7b, 0xd0, 0xe4, 0x9c, 0xba, 0x30, 0x88, 0x87, 0x07, 0xb1, 0x18, 0xa2, 0x8f, 0x13, 0x4e, 0x83, + 0xa1, 0xc1, 0x39, 0x49, 0x18, 0x7e, 0x55, 0x81, 0x74, 0xf0, 0xd8, 0x83, 0xc4, 0xf9, 0x3f, 0x5d, + 0xef, 0x55, 0x0a, 0xcf, 0x0e, 0xd5, 0x56, 0x20, 0xe9, 0x75, 0x1b, 0x30, 0x2a, 0x1a, 0xdd, 0xbf, + 0xc6, 0xe5, 0xf7, 0x49, 0xf1, 0xd6, 0xa5, 0xf7, 0xe1, 0x53, 0xbc, 0x75, 0xe9, 0xf3, 0xf0, 0x49, + 0xbd, 0x84, 0x98, 0x9e, 0x24, 0x4f, 0x48, 0xd6, 0xa5, 0xd6, 0x0d, 0xeb, 0x6b, 0x0a, 0x8c, 0x09, + 0xea, 0xd8, 0x29, 0x8a, 0x3e, 0x84, 0x2a, 0x3c, 0x1f, 0xdf, 0xb4, 0xeb, 0x19, 0x98, 0x7a, 0x15, + 0xa1, 0x3c, 0x45, 0xd4, 0x18, 0x28, 0xe5, 0x77, 0x59, 0xc1, 0x23, 0xe6, 0xdf, 0xad, 0x3b, 0x35, + 0x2f, 0xd6, 0xbf, 0x93, 0x9e, 0xd3, 0x1d, 0x17, 0x4a, 0x3f, 0x9b, 0x5b, 0x93, 0x25, 0xf2, 0x4d, + 0x05, 0xff, 0x18, 0x49, 0xe7, 0xa2, 0x3b, 0xd6, 0xb6, 0xf5, 0xcb, 0xd9, 0x8a, 0xb5, 0x6d, 0x7d, + 0xef, 0xd0, 0xd5, 0x79, 0x44, 0x95, 0x27, 0x73, 0xf2, 0x6a, 0x62, 0xed, 0xc4, 0xcb, 0x84, 0xf7, + 0x15, 0xc8, 0x84, 0xb7, 0x75, 0xb1, 0x06, 0xad, 0xfb, 0xb2, 0x3d, 0xd6, 0xa0, 0xf5, 0x5c, 0x00, + 0xaa, 0x05, 0x04, 0x32, 0x43, 0x48, 0x08, 0xe4, 0xbe, 0xe3, 0x0b, 0x10, 0x8f, 0x60, 0x94, 0x7b, + 0x13, 0xcf, 0x0c, 0xbe, 0x80, 0x19, 0xec, 0xed, 0x47, 0x7d, 0x87, 0x23, 0xdc, 0x4e, 0xd9, 0x63, + 0xf8, 0x1d, 0x05, 0xb2, 0x72, 0x2c, 0x24, 0x6e, 0xe2, 0x7b, 0xe3, 0x0e, 0xfd, 0x26, 0x25, 0xf2, + 0x67, 0x0f, 0x25, 0x1a, 0x1e, 0x94, 0xe9, 0xe3, 0x03, 0x4a, 0x04, 0xd1, 0xdd, 0x26, 0xc5, 0xef, + 0x2e, 0x06, 0xd8, 0x7a, 0xe9, 0xf2, 0x28, 0xd6, 0x25, 0x8f, 0x5e, 0x84, 0xf4, 0xb5, 0xf6, 0xac, + 0x81, 0x04, 0xe1, 0x8b, 0x0a, 0x9e, 0x89, 0x83, 0x0b, 0x83, 0xe7, 0x86, 0x8c, 0x1e, 0x0f, 0x5e, + 0x41, 0xbd, 0xb1, 0x66, 0xf5, 0x09, 0x84, 0x33, 0x4b, 0xce, 0xca, 0x9b, 0x4f, 0xd0, 0xf3, 0x0f, + 0x15, 0xb8, 0x38, 0x28, 0xb2, 0x47, 0x96, 0xe2, 0xf6, 0xfe, 0xe1, 0xc2, 0x8e, 0x85, 0xe5, 0x53, + 0xf1, 0x88, 0x9a, 0x48, 0x35, 0x2f, 0x0d, 0xa5, 0xe1, 0xb3, 0x59, 0x16, 0x91, 0x38, 0xb6, 0x93, + 0xff, 0x95, 0x72, 0x54, 0xdc, 0x09, 0x91, 0x78, 0xe4, 0x8d, 0x13, 0xc5, 0xfc, 0x42, 0xf1, 0xbf, + 0x79, 0x52, 0xf2, 0x23, 0xf7, 0x9e, 0xae, 0x41, 0x90, 0xbf, 0x38, 0x2a, 0x9c, 0xf8, 0xf1, 0x63, + 0x77, 0xcd, 0x21, 0xbf, 0x7a, 0x6c, 0x3a, 0x81, 0xf5, 0x65, 0xc4, 0x5a, 0x22, 0xcf, 0xf5, 0x60, + 0x2d, 0xbf, 0x7b, 0x54, 0x54, 0xf0, 0x11, 0xf9, 0xae, 0x82, 0x81, 0xa3, 0x68, 0xa0, 0x8a, 0xbc, + 0x74, 0xbc, 0xb0, 0x16, 0x47, 0xfe, 0xf2, 0x49, 0x62, 0x61, 0x7d, 0x1c, 0xe3, 0x07, 0x4e, 0x45, + 0x77, 0x45, 0xe3, 0xa8, 0xb7, 0x91, 0x09, 0x43, 0x5c, 0xb1, 0x76, 0xba, 0x3b, 0x66, 0x16, 0x6b, + 0xa7, 0x7b, 0xa2, 0x66, 0xea, 0x93, 0x88, 0xe8, 0x1c, 0x99, 0x95, 0x11, 0x95, 0xdf, 0xe5, 0x51, + 0xb7, 0x47, 0x4b, 0x57, 0x7f, 0xf0, 0xef, 0xf3, 0x67, 0x7e, 0x70, 0x38, 0xaf, 0xfc, 0xf0, 0x70, + 0x5e, 0xf9, 0xd1, 0xe1, 0xbc, 0xf2, 0x6f, 0x87, 0xf3, 0xca, 0xd7, 0x3f, 0x98, 0x3f, 0xf3, 0xc3, + 0x0f, 0xe6, 0xcf, 0xfc, 0xe8, 0x83, 0xf9, 0x33, 0xef, 0xa4, 0x03, 0xe6, 0x95, 0x14, 0x06, 0x7c, + 0x5f, 0xfa, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd4, 0xe8, 0x51, 0xdd, 0xca, 0x56, 0x00, 0x00, } diff --git a/pkg/server/serverpb/status.proto b/pkg/server/serverpb/status.proto index b6c40f01a91b..4097409fe011 100644 --- a/pkg/server/serverpb/status.proto +++ b/pkg/server/serverpb/status.proto @@ -476,6 +476,21 @@ message TxnInfo { // txn_description is a text description of the underlying kv.Txn, intended // for troubleshooting purposes. string txn_description = 3; + + // num_statements_executed is the number of statements that were executed so + // far on this transaction. + int32 num_statements_executed = 4; + + // num_retries is the number of times that this transaction was retried. + int32 num_retries = 5; + + // num_retries is the number of times that this transaction was automatically + // retried by the SQL executor. + int32 num_auto_retries = 6; + + // The deadline by which the transaction must be committed. + google.protobuf.Timestamp deadline = 7 + [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true ]; } // ActiveQuery represents a query in flight on some Session. @@ -533,16 +548,8 @@ message Session { // Timestamp of session's start. google.protobuf.Timestamp start = 6 [ (gogoproto.nullable) = false, (gogoproto.stdtime) = true ]; - // ID of the current KV transaction for this session. Nil if the session - // doesn't currently have a transaction. - bytes kv_txn_id = 7 [ - (gogoproto.customname) = "KvTxnID", - (gogoproto.customtype) = - "github.com/cockroachdb/cockroach/pkg/util/uuid.UUID" - ]; - // Information about the txn in progress on this session. Nil if the - // session doesn't currently have a transaction. - TxnInfo active_txn = 12; + // This used to be active_txn_id until it was moved inside of active_txn. + reserved 7; // SQL string of the last query executed on this session. string last_active_query = 8; // ID of the session (uint128 represented as raw bytes). @@ -551,6 +558,9 @@ message Session { int64 alloc_bytes = 10; // High water mark of allocated bytes in the session memory monitor. int64 max_alloc_bytes = 11; + // Information about the txn in progress on this session. Nil if the + // session doesn't currently have a transaction. + TxnInfo active_txn = 12; } // An error wrapper object for ListSessionsResponse. diff --git a/pkg/sql/backfill.go b/pkg/sql/backfill.go index 3ad8ea226d96..1bfea95458d0 100644 --- a/pkg/sql/backfill.go +++ b/pkg/sql/backfill.go @@ -580,7 +580,7 @@ func (sc *SchemaChanger) validateConstraints( evalCtx.Txn = txn // Use the DistSQLTypeResolver because we need to resolve types by ID. semaCtx := tree.MakeSemaContext() - collection := descs.NewCollection(ctx, sc.settings, sc.leaseMgr) + collection := descs.NewCollection(ctx, sc.settings, sc.leaseMgr, nil /* hydratedTables */) semaCtx.TypeResolver = descs.NewDistSQLTypeResolver(collection, txn) // TODO (rohany): When to release this? As of now this is only going to get released // after the check is validated. @@ -723,7 +723,7 @@ func (sc *SchemaChanger) truncateIndexes( } // Retrieve a lease for this table inside the current txn. - tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr) + tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr, nil /* hydratedTables */) defer tc.ReleaseAll(ctx) tableDesc, err := sc.getTableVersion(ctx, txn, tc, version) if err != nil { @@ -907,7 +907,7 @@ func (sc *SchemaChanger) distBackfill( } } - tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr) + tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr, nil /* hydratedTables */) // Use a leased table descriptor for the backfill. defer tc.ReleaseAll(ctx) tableDesc, err := sc.getTableVersion(ctx, txn, tc, version) @@ -1265,7 +1265,7 @@ func (sc *SchemaChanger) validateForwardIndexes( if err != nil { return err } - tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr) + tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr, nil /* hydratedTables */) // pretend that the schema has been modified. if err := tc.AddUncommittedDescriptor(desc); err != nil { return err @@ -1341,7 +1341,7 @@ func (sc *SchemaChanger) validateForwardIndexes( return err } - tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr) + tc := descs.NewCollection(ctx, sc.settings, sc.leaseMgr, nil /* hydratedTables */) if err := tc.AddUncommittedDescriptor(desc); err != nil { return err } @@ -1729,7 +1729,7 @@ func validateCheckInTxn( ) error { ie := evalCtx.InternalExecutor.(*InternalExecutor) if tableDesc.Version > tableDesc.ClusterVersion.Version { - newTc := descs.NewCollection(ctx, evalCtx.Settings, leaseMgr) + newTc := descs.NewCollection(ctx, evalCtx.Settings, leaseMgr, nil /* hydratedTables */) // pretend that the schema has been modified. if err := newTc.AddUncommittedDescriptor(tableDesc); err != nil { return err @@ -1770,7 +1770,7 @@ func validateFkInTxn( ) error { ie := evalCtx.InternalExecutor.(*InternalExecutor) if tableDesc.Version > tableDesc.ClusterVersion.Version { - newTc := descs.NewCollection(ctx, evalCtx.Settings, leaseMgr) + newTc := descs.NewCollection(ctx, evalCtx.Settings, leaseMgr, nil /* hydratedTables */) // pretend that the schema has been modified. if err := newTc.AddUncommittedDescriptor(tableDesc); err != nil { return err diff --git a/pkg/sql/catalog/dbdesc/database_desc.go b/pkg/sql/catalog/dbdesc/database_desc.go index 1ef8a64c82fe..7df8310b090b 100644 --- a/pkg/sql/catalog/dbdesc/database_desc.go +++ b/pkg/sql/catalog/dbdesc/database_desc.go @@ -31,6 +31,10 @@ var _ catalog.MutableDescriptor = (*Mutable)(nil) // on it. type Immutable struct { descpb.DatabaseDescriptor + + // isUncommittedVersion is set to true if this descriptor was created from + // a copy of a Mutable with an uncommitted version. + isUncommittedVersion bool } // Mutable wraps a database descriptor and provides methods @@ -110,6 +114,11 @@ func (desc *Immutable) GetParentID() descpb.ID { return keys.RootNamespaceID } +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Immutable) IsUncommittedVersion() bool { + return desc.isUncommittedVersion +} + // GetParentSchemaID implements the Descriptor interface. func (desc *Immutable) GetParentSchemaID() descpb.ID { return keys.RootNamespaceID @@ -228,7 +237,9 @@ func (desc *Mutable) OriginalVersion() descpb.DescriptorVersion { func (desc *Mutable) ImmutableCopy() catalog.Descriptor { // TODO (lucy): Should the immutable descriptor constructors always make a // copy, so we don't have to do it here? - return NewImmutable(*protoutil.Clone(desc.DatabaseDesc()).(*descpb.DatabaseDescriptor)) + imm := NewImmutable(*protoutil.Clone(desc.DatabaseDesc()).(*descpb.DatabaseDescriptor)) + imm.isUncommittedVersion = desc.IsUncommittedVersion() + return imm } // IsNew implements the MutableDescriptor interface. @@ -236,6 +247,11 @@ func (desc *Mutable) IsNew() bool { return desc.ClusterVersion == nil } +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Mutable) IsUncommittedVersion() bool { + return desc.IsNew() || desc.GetVersion() != desc.ClusterVersion.GetVersion() +} + // AddDrainingName adds a draining name to the DatabaseDescriptor's slice of // draining names. func (desc *Mutable) AddDrainingName(name descpb.NameInfo) { diff --git a/pkg/sql/catalog/descriptor.go b/pkg/sql/catalog/descriptor.go index 766f1ac72373..345dc6933a0b 100644 --- a/pkg/sql/catalog/descriptor.go +++ b/pkg/sql/catalog/descriptor.go @@ -43,6 +43,13 @@ type Descriptor interface { GetParentID() descpb.ID GetParentSchemaID() descpb.ID + // IsUncommittedVersion returns true if this descriptor represent a version + // which is not the currently committed version. Implementations may return + // false negatives here in cases where a descriptor may have crossed a + // serialization boundary. In particular, this can occur during execution on + // remote nodes as well as during some scenarios in schema changes. + IsUncommittedVersion() bool + // Metadata for descriptor leasing. GetVersion() descpb.DescriptorVersion GetModificationTime() hlc.Timestamp diff --git a/pkg/sql/catalog/descs/collection.go b/pkg/sql/catalog/descs/collection.go index 2c718c621ae7..d7c4c7a4dcff 100644 --- a/pkg/sql/catalog/descs/collection.go +++ b/pkg/sql/catalog/descs/collection.go @@ -27,6 +27,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/catalog/database" "github.com/cockroachdb/cockroach/pkg/sql/catalog/dbdesc" "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/hydratedtables" "github.com/cockroachdb/cockroach/pkg/sql/catalog/lease" "github.com/cockroachdb/cockroach/pkg/sql/catalog/resolver" "github.com/cockroachdb/cockroach/pkg/sql/catalog/schemadesc" @@ -141,6 +142,7 @@ func MakeCollection( dbCache *database.Cache, dbCacheSubscriber DatabaseCacheSubscriber, sessionData *sessiondata.SessionData, + hydratedTables *hydratedtables.Cache, ) Collection { // For testing. databaseLeasingUnsupported := false @@ -154,14 +156,26 @@ func MakeCollection( dbCacheSubscriber: dbCacheSubscriber, databaseLeasingUnsupported: databaseLeasingUnsupported, sessionData: sessionData, + hydratedTables: hydratedTables, } } // NewCollection constructs a new *Collection. func NewCollection( - ctx context.Context, settings *cluster.Settings, leaseMgr *lease.Manager, + ctx context.Context, + settings *cluster.Settings, + leaseMgr *lease.Manager, + hydratedTables *hydratedtables.Cache, ) *Collection { - tc := MakeCollection(ctx, leaseMgr, settings, nil, nil, nil) + tc := MakeCollection( + ctx, + leaseMgr, + settings, + nil, /* dbCache */ + nil, /* dbCache */ + nil, /* sessionData */ + hydratedTables, + ) return &tc } @@ -236,6 +250,10 @@ type Collection struct { // true in mixed-version 20.1/20.2 clusters, but it remains constant for the // duration of each use of the Collection. databaseLeasingUnsupported bool + + // hydratedTables is node-level cache of table descriptors which utlize + // user-defined types. + hydratedTables *hydratedtables.Cache } // getLeasedDescriptorByName return a leased descriptor valid for the @@ -1057,12 +1075,9 @@ func (tc *Collection) hydrateTypesInTableDesc( return desc, nil } - // TODO (rohany, ajwerner): Here we would look into the cached set of - // hydrated table descriptors and potentially return without having to - // make a copy. However, we could avoid hitting the cache if any of the - // user defined types have been modified in this transaction. - - getType := func(ctx context.Context, id descpb.ID) (tree.TypeName, catalog.TypeDescriptor, error) { + getType := typedesc.TypeLookupFunc(func( + ctx context.Context, id descpb.ID, + ) (tree.TypeName, catalog.TypeDescriptor, error) { desc, err := tc.GetTypeVersionByID(ctx, txn, id, tree.ObjectLookupFlagsWithRequired()) if err != nil { return tree.TypeName{}, nil, err @@ -1078,14 +1093,29 @@ func (tc *Collection) hydrateTypesInTableDesc( } name := tree.MakeNewQualifiedTypeName(dbDesc.Name, sc.Name, desc.Name) return name, desc, nil + }) + + // Utilize the cache of hydrated tables if we have one. + if tc.hydratedTables != nil { + hydrated, err := tc.hydratedTables.GetHydratedTableDescriptor(ctx, t, getType) + if err != nil { + return nil, err + } + if hydrated != nil { + return hydrated, nil + } + // The cache decided not to give back a hydrated descriptor, likely + // because either we've modified the table or one of the types or because + // this transaction has a stale view of one of the relevant descriptors. + // Proceed to hydrating a fresh copy. } // Make a copy of the underlying descriptor before hydration. descBase := protoutil.Clone(t.TableDesc()).(*descpb.TableDescriptor) - if err := typedesc.HydrateTypesInTableDescriptor(ctx, descBase, typedesc.TypeLookupFunc(getType)); err != nil { + if err := typedesc.HydrateTypesInTableDescriptor(ctx, descBase, getType); err != nil { return nil, err } - return tabledesc.NewImmutable(*descBase), nil + return tabledesc.NewImmutableWithIsUncommittedVersion(*descBase, t.IsUncommittedVersion()), nil default: return desc, nil } diff --git a/pkg/sql/catalog/hydratedtables/hydratedcache.go b/pkg/sql/catalog/hydratedtables/hydratedcache.go new file mode 100644 index 000000000000..58ce08e81d14 --- /dev/null +++ b/pkg/sql/catalog/hydratedtables/hydratedcache.go @@ -0,0 +1,387 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +// Package hydratedtables contains logic to cache table descriptors with user +// defined types hydrated. +package hydratedtables + +import ( + "context" + "fmt" + "sync" + + "github.com/biogo/store/llrb" + "github.com/cockroachdb/cockroach/pkg/settings" + "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql/catalog" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/lease" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/tabledesc" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/typedesc" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" + "github.com/cockroachdb/cockroach/pkg/util/cache" + "github.com/cockroachdb/cockroach/pkg/util/metric" + "github.com/cockroachdb/cockroach/pkg/util/protoutil" + "github.com/cockroachdb/cockroach/pkg/util/syncutil" + "github.com/cockroachdb/cockroach/pkg/util/syncutil/singleflight" + io_prometheus_client "github.com/prometheus/client_model/go" +) + +// TODO(ajwerner): Consider adding a mechanism to remove entries which have not +// been used in a long time. + +// Cache caches table descriptors which have their user-defined types hydrated. +// The cache's contract is a bit tricky. In order to use a hydrated type, the +// caller needs to have a lease on the relevant type descriptor. The way that +// this is made to work is that the user provides a handle to a leased +// ImmutableCopy and then the cache will call through to type resolver for each +// of the referenced types which ensures that user always uses properly leased +// descriptors. While all of the types will need to be resolved, they should +// already be cached so, in this way, this cache prevents the need to copy +// and re-construct the tabledesc.Immutable in most cases. +type Cache struct { + settings *cluster.Settings + g singleflight.Group + metrics Metrics + mu struct { + syncutil.Mutex + cache *cache.OrderedCache + } +} + +// Metrics returns the cache's metrics. +func (c *Cache) Metrics() *Metrics { + return &c.metrics +} + +var _ metric.Struct = (*Metrics)(nil) + +// Metrics exposes cache metrics. +type Metrics struct { + Hits *metric.Counter + Misses *metric.Counter +} + +func makeMetrics() Metrics { + return Metrics{ + Hits: metric.NewCounter(metaHits), + Misses: metric.NewCounter(metaMisses), + } +} + +// MetricStruct makes Metrics a metric.Struct. +func (m *Metrics) MetricStruct() {} + +var ( + metaHits = metric.Metadata{ + Name: "sql.hydrated_table_cache.hits", + Help: "counter on the number of cache hits", + Measurement: "reads", + Unit: metric.Unit_COUNT, + MetricType: io_prometheus_client.MetricType_COUNTER, + } + metaMisses = metric.Metadata{ + Name: "sql.hydrated_table_cache.misses", + Help: "counter on the number of cache misses", + Measurement: "reads", + Unit: metric.Unit_COUNT, + MetricType: io_prometheus_client.MetricType_COUNTER, + } +) + +// CacheSize controls the size of the LRU cache. +var CacheSize = settings.RegisterNonNegativeIntSetting( + "sql.catalog.hydrated_tables.cache_size", + "number of table descriptor versions retained in the hydratedtables LRU cache", + 128) + +// NewCache constructs a new Cache. +func NewCache(settings *cluster.Settings) *Cache { + c := &Cache{ + settings: settings, + metrics: makeMetrics(), + } + c.mu.cache = cache.NewOrderedCache(cache.Config{ + Policy: cache.CacheLRU, + ShouldEvict: func(size int, key, value interface{}) bool { + return size > int(CacheSize.Get(&settings.SV)) + }, + OnEvicted: func(key, value interface{}) { + putCacheKey(key.(*cacheKey)) + }, + }) + return c +} + +type hydratedTableDescriptor struct { + tableDesc *tabledesc.Immutable + typeDescs []*cachedType +} + +type cachedType struct { + name tree.TypeName + typDesc catalog.TypeDescriptor +} + +// GetHydratedTableDescriptor returns an ImmutableCopy with the types +// hydrated. It may use a cached copy but all of the relevant type descriptors +// will be retrieved via the TypeDescriptorResolver. Note that if the table +// descriptor is modified, nil will be returned. If any of the types used by +// the table or have uncommitted versions, then nil may be returned. If a nil +// descriptor is returned, it up to the caller to clone and hydrate the table +// descriptor on their own. If the table descriptor does not contain any +// user-defined types, it will be returned unchanged. +func (c *Cache) GetHydratedTableDescriptor( + ctx context.Context, table *tabledesc.Immutable, res catalog.TypeDescriptorResolver, +) (hydrated *tabledesc.Immutable, err error) { + + // If the table has an uncommitted version, it cannot be cached. Return nil + // forcing the caller to hydrate. + if table.IsUncommittedVersion() { + return nil, nil + } + + // If the table has no user defined types, it is already effectively hydrated, + // so just return it. + if !table.ContainsUserDefinedTypes() { + return table, nil + } + + // TODO(ajwerner): This cache may thrash a bit right when a version of a type + // changes as different callers oscillate evicting the old and new versions of + // that type. It should converge rapidly but nevertheless, a finer-granularity + // cache which stored descriptors by not just the table version but also by + // the set of type-versions could mitigate the problem. The idea would be to + // cache all tuples of table and type versions and then check if what we get + // from the resolver matches any of them. Only long-running transactions + // should still resolve older versions. Furthermore, the cache has a policy to + // not evict never versions of types for older ones. The downside is that + // long-running transactions may end up re-hydrating for every statement. + // + // Probably a better solution would be to cache the hydrated descriptor in the + // descs.Collection and invalidate that cache whenever an uncommitted + // descriptor that is relevant is added. That way any given transaction will + // only ever hydrate a table at most once per modification of a descriptor. + // and the cache will converge on new versions rapidly. + var groupKey string // used as a proxy for cache hit + defer func() { + if hydrated != nil { + c.recordMetrics(groupKey == "" /* hitCache */) + } + }() + key := newCacheKey(table) + defer func() { + if key != nil { + putCacheKey(key) + } + }() + + // A loop is required in cases where concurrent operations enter this method, + // concurrently determine that they cannot use the cached value but for + // different reasons, then serialize on the singleflight group. The goroutine + // which does not win the singleflight race will need to verify that the + // newly added value can be used before it can use it. + for { + if cached, ok := c.getFromCache(key); ok { + canUse, skipCache, err := canUseCachedDescriptor(ctx, cached, res) + if err != nil || skipCache { + return nil, err + } + if canUse { + return cached.tableDesc, nil + } + } + + // Now we want to lock this key and populate the descriptors. + // Using a singleflight prevent concurrent attempts to update the cache for + // a given descriptor version. + if groupKey == "" { + groupKey = fmt.Sprintf("%d@%d", key.ID, key.Version) + } + + // Only the calling goroutine can actually use the result directly. + // Furthermore, if an error is encountered, only the calling goroutine + // should return it. Other goroutines will have to go back around and + // attempt to read from the cache. + var called bool + res, _, err := c.g.Do(groupKey, func() (interface{}, error) { + called = true + cachedRes := cachedTypeDescriptorResolver{ + underlying: res, + cache: map[descpb.ID]*cachedType{}, + } + descBase := protoutil.Clone(table.TableDesc()).(*descpb.TableDescriptor) + if err := typedesc.HydrateTypesInTableDescriptor(ctx, descBase, &cachedRes); err != nil { + return nil, err + } + hydrated := tabledesc.NewImmutable(*descBase) + + // If any of the types resolved as part of hydration are modified, skip + // writing this descriptor to the cache. + if !cachedRes.haveUncommitted { + c.addToCache(key, &hydratedTableDescriptor{ + tableDesc: hydrated, + typeDescs: cachedRes.types, + }) + + // Prevent the key from being put back in the pool as it is now a member + // of the cache's data structure. It will be released when the entry is + // evicted. + key = nil + } + + return hydrated, nil + }) + + // Another goroutine populated the cache or failed to due to having a + // modified descriptor, go back around and see if the new cache entry can be + // used, or if another round of re-population is in order. + if !called { + continue + } + if err != nil { + return nil, err + } + return res.(*tabledesc.Immutable), nil + } +} + +// canUseCachedDescriptor returns whether the types stored in the cached +// descriptor are the same types which are resolved through res. +// +// The skipCache return value indicates that either one of the types returned +// from res contain uncommitted versions or that a resolved types descriptor is +// from an older version than the currently cached value. We don't want to wind +// up evicting a newer version with an older version. +func canUseCachedDescriptor( + ctx context.Context, cached *hydratedTableDescriptor, res catalog.TypeDescriptorResolver, +) (canUse, skipCache bool, _ error) { + for _, typ := range cached.typeDescs { + name, typDesc, err := res.GetTypeDescriptor(ctx, typ.typDesc.GetID()) + if err != nil { + return false, false, err + } + // Ensure that the type is not an uncommitted version. + if isUncommittedVersion := typDesc.IsUncommittedVersion(); isUncommittedVersion || + // Ensure that the type version matches. + typ.typDesc.GetVersion() != typDesc.GetVersion() || + // Only match on the name if the retrieved type has a qualified name. + // Note that this behavior is important and ensures that when this + // function is passed a resolved which looks up qualified names, it always + // get a hydrated descriptor with qualified names in its types. + // This is important as we share this cache between distsql which does + // not resolve type names and the local planner which does. It'd be a real + // bummer if mixes of distributed and local flows lead to thrashing of the + // cache. + (name.ObjectNamePrefix != (tree.ObjectNamePrefix{}) && typ.name != name) { + + // TODO(ajwerner): Make the TypeDescriptorResolver return a + // ResolvedObjectPrefix instead of a tree.TypeName so that we can + // determine whether the mismatched name is too old or too new. + skipCache = isUncommittedVersion || typ.typDesc.GetVersion() > typDesc.GetVersion() + return false, skipCache, nil + } + } + return true, false, nil +} + +// getFromCache locks the cache and retrieves the descriptor with the given key. +func (c *Cache) getFromCache(key *cacheKey) (*hydratedTableDescriptor, bool) { + c.mu.Lock() + defer c.mu.Unlock() + got, ok := c.mu.cache.Get(key) + if !ok { + return nil, false + } + return got.(*hydratedTableDescriptor), true +} + +// getFromCache locks the cache and stores the descriptor with the given key. +func (c *Cache) addToCache(key *cacheKey, toCache *hydratedTableDescriptor) { + c.mu.Lock() + defer c.mu.Unlock() + c.mu.cache.Add(key, toCache) +} + +func (c *Cache) recordMetrics(hitCache bool) { + if hitCache { + c.metrics.Hits.Inc(1) + } else { + c.metrics.Misses.Inc(1) + } +} + +type cachedTypeDescriptorResolver struct { + underlying catalog.TypeDescriptorResolver + cache map[descpb.ID]*cachedType + types []*cachedType + haveUncommitted bool +} + +func (c *cachedTypeDescriptorResolver) GetTypeDescriptor( + ctx context.Context, id descpb.ID, +) (tree.TypeName, catalog.TypeDescriptor, error) { + if typ, exists := c.cache[id]; exists { + return typ.name, typ.typDesc, nil + } + name, typDesc, err := c.underlying.GetTypeDescriptor(ctx, id) + if err != nil { + return tree.TypeName{}, nil, err + } + typ := &cachedType{ + name: name, + typDesc: typDesc, + } + c.cache[id] = typ + c.types = append(c.types, typ) + c.haveUncommitted = c.haveUncommitted || typDesc.IsUncommittedVersion() + return name, typDesc, nil +} + +type cacheKey lease.IDVersion + +func (c cacheKey) Compare(comparable llrb.Comparable) int { + o := comparable.(*cacheKey) + switch { + case c.ID < o.ID: + return -1 + case c.ID > o.ID: + return 1 + default: + switch { + case c.Version < o.Version: + return -1 + case c.Version > o.Version: + return 1 + default: + return 0 + } + } +} + +var _ llrb.Comparable = (*cacheKey)(nil) + +var cacheKeySyncPool = sync.Pool{ + New: func() interface{} { return new(cacheKey) }, +} + +func newCacheKey(table catalog.TableDescriptor) *cacheKey { + k := cacheKeySyncPool.Get().(*cacheKey) + *k = cacheKey{ + ID: table.GetID(), + Version: table.GetVersion(), + } + return k +} + +func putCacheKey(k *cacheKey) { + *k = cacheKey{} + cacheKeySyncPool.Put(k) +} diff --git a/pkg/sql/catalog/hydratedtables/hydratedcache_test.go b/pkg/sql/catalog/hydratedtables/hydratedcache_test.go new file mode 100644 index 000000000000..e49678dc1f49 --- /dev/null +++ b/pkg/sql/catalog/hydratedtables/hydratedcache_test.go @@ -0,0 +1,415 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +package hydratedtables + +import ( + "context" + "testing" + + "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql/catalog" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/dbdesc" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/schemadesc" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/tabledesc" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/typedesc" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" + "github.com/cockroachdb/cockroach/pkg/sql/types" + "github.com/cockroachdb/cockroach/pkg/util/leaktest" + "github.com/stretchr/testify/require" +) + +func TestHydratedCache(t *testing.T) { + defer leaktest.AfterTest(t)() + + ctx := context.Background() + + t.Run("basic caching", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + m := c.Metrics() + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + td := tableDescUDT.ImmutableCopy().(*tabledesc.Immutable) + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 1) + + // Observe that the cache's lookup functionality only gets each type + // one time. The table in question uses one type two times. + require.Equal(t, res.calls, 2) + + // Show that the cache returned a new pointer and hydrated the UDT + // (user-defined type). + require.NotEqual(t, tableDescUDT, hydrated) + require.EqualValues(t, hydrated.Columns[0].Type, typ1T) + + // Try again and ensure we get pointer-for-pointer the same descriptor. + res.calls = 0 + cached, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + require.Equal(t, hydrated, cached) + assertMetrics(t, m, 1, 1) + + // Observe that the cache's cache checking functionality only gets each + // type one time. + require.Equal(t, res.calls, 2) + }) + t.Run("no UDT, no metrics", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + m := c.Metrics() + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + td := tableDescNoUDT.ImmutableCopy().(*tabledesc.Immutable) + _, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 0) + }) + t.Run("name change causes eviction", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + m := c.Metrics() + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + td := tableDescUDT.ImmutableCopy().(*tabledesc.Immutable) + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 1) + + // Change the database name. + dbDesc := dbdesc.NewExistingMutable(*dg[dbID].(*dbdesc.Immutable).DatabaseDesc()) + dbDesc.SetName("new_name") + dbDesc.Version++ + dg[dbID] = dbDesc.ImmutableCopy() + + // Ensure that we observe a new descriptor get created due to + // the name change. + retrieved, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 2) + + require.NotEqual(t, hydrated, retrieved) + }) + t.Run("unqualified resolution after qualified does not cause eviction", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + m := c.Metrics() + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + td := tableDescUDT.ImmutableCopy().(*tabledesc.Immutable) + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 1) + + // Attempt to retrieve retrieve the same hydrated descriptor + // using a resolver that does not create a qualified name and + // see that the same descriptor with the qualified name gets + // returned. + res.unqualifiedName = true + retrieved, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 1, 1) + + require.Equal(t, hydrated, retrieved) + }) + t.Run("qualified resolution after unqualified causes eviction", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + m := c.Metrics() + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + res.unqualifiedName = true + td := tableDescUDT.ImmutableCopy().(*tabledesc.Immutable) + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 1) + + // Attempt to retrieve retrieve the same hydrated descriptor + // using a resolver that does create a qualified name and + // see that the old descriptor with an unqualified name gets + // evicted. + res.unqualifiedName = false + retrieved, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 2) + + require.NotEqual(t, hydrated, retrieved) + }) + t.Run("version change causes eviction", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + m := c.Metrics() + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + res.unqualifiedName = true + td := tableDescUDT.ImmutableCopy().(*tabledesc.Immutable) + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 1) + + // Change the type descriptor. + typDesc := typedesc.NewExistingMutable(*dg[typ1ID].(*typedesc.Immutable).TypeDesc()) + typDesc.Version++ + dg[typ1ID] = typedesc.NewImmutable(*typDesc.TypeDesc()) + + // Ensure that a new descriptor is returned. + retrieved, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + assertMetrics(t, m, 0, 2) + + require.NotEqual(t, hydrated, retrieved) + }) + // If one cache retrieval hits an error during a lookup, it should not + // propagate back to a concurrent retrieval as it could be due to something + // like cancellation. + t.Run("errors do not propagate to concurrent calls", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + calledCh := make(chan chan error, 1) + res.called = func(ctx context.Context, id descpb.ID) error { + errCh := make(chan error, 1) + calledCh <- errCh + return <-errCh + } + td := tableDescUDT.ImmutableCopy().(*tabledesc.Immutable) + + callOneErrCh := make(chan error, 1) + go func() { + _, err := c.GetHydratedTableDescriptor(ctx, td, res) + callOneErrCh <- err + }() + + call2Res := &descGetterTypeDescriptorResolver{dg: &dg} + unblockCallOne := <-calledCh + callTwoErrCh := make(chan error, 1) + go func() { + _, err := c.GetHydratedTableDescriptor(ctx, td, call2Res) + callTwoErrCh <- err + }() + unblockCallOne <- context.Canceled + require.Equal(t, context.Canceled, <-callOneErrCh) + require.NoError(t, <-callTwoErrCh) + assertMetrics(t, c.Metrics(), 0, 1) + }) + t.Run("modified table gets rejected", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + mut := tabledesc.NewExistingMutable(*dg[tableUDTID].(catalog.TableDescriptor).TableDesc()) + mut.MaybeIncrementVersion() + td := mut.ImmutableCopy().(*tabledesc.Immutable) + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + require.Nil(t, hydrated) + }) + t.Run("modified type does not get cached", func(t *testing.T) { + c := NewCache(cluster.MakeTestingClusterSettings()) + m := c.Metrics() + + dg := mkDescGetter(descs...) + res := &descGetterTypeDescriptorResolver{dg: &dg} + + mut := typedesc.NewExistingMutable(*dg[typ1ID].(catalog.TypeDescriptor).TypeDesc()) + mut.MaybeIncrementVersion() + dgWithMut := mkDescGetter(append(descs, mut)...) + resWithMut := &descGetterTypeDescriptorResolver{dg: &dgWithMut} + + // Given that there is no cached value for this version, we will not find + // check for a cached type and will construct the hydrated type underneath + // the cache. We can use this descriptor, however, it will not be stored. + // + // This behavior is a bit bizarre but exists to not waste the work of + // hydrating the descriptor if we've already started to do it. + // This case should not meaningfully arise in practice. + td := tableDescUDT.ImmutableCopy().(*tabledesc.Immutable) + { + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, resWithMut) + require.NoError(t, err) + require.NotNil(t, hydrated) + assertMetrics(t, m, 0, 1) + } + { + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, resWithMut) + require.NoError(t, err) + require.NotNil(t, hydrated) + assertMetrics(t, m, 0, 2) + } + + // Now cache the old version. + { + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + require.NotNil(t, hydrated) + assertMetrics(t, m, 0, 3) + } + { + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, res) + require.NoError(t, err) + require.NotNil(t, hydrated) + assertMetrics(t, m, 1, 3) + } + + // Show that now we won't use the cache for the mutated type. + { + hydrated, err := c.GetHydratedTableDescriptor(ctx, td, resWithMut) + require.NoError(t, err) + require.Nil(t, hydrated) + assertMetrics(t, m, 1, 3) + } + + }) +} + +func mkTypeT(desc catalog.TypeDescriptor, name *tree.TypeName) *types.T { + typT, err := desc.MakeTypesT(context.Background(), name, nil) + if err != nil { + panic(err) + } + return typT +} + +const ( + dbID = 1 + scID = 2 + typ1ID = 3 + typ2ID = 4 + tableUDTID = 5 + tableNoUDTID = 6 +) + +// This block contains definitions for a mocked schema. +// +// TODO(ajwerner): This is horrible to both read and write. Build tools to make +// constructing descriptors for testing less terrible without running a whole +// server. +var ( + dbDesc = dbdesc.NewInitial(dbID, "db", "root") + schemaDesc = schemadesc.NewCreatedMutable(descpb.SchemaDescriptor{ + Name: "schema", + ID: scID, + ParentID: dbID, + }) + enumMembers = []descpb.TypeDescriptor_EnumMember{ + { + LogicalRepresentation: "hello", + PhysicalRepresentation: []byte{128}, + }, + { + LogicalRepresentation: "hi", + PhysicalRepresentation: []byte{200}, + }, + } + + typ1Desc = typedesc.NewExistingMutable(descpb.TypeDescriptor{ + Name: "enum", + ID: typ1ID, + Version: 1, + ParentID: dbID, + ParentSchemaID: scID, + State: descpb.DescriptorState_PUBLIC, + Kind: descpb.TypeDescriptor_ENUM, + ReferencingDescriptorIDs: []descpb.ID{tableUDTID}, + EnumMembers: enumMembers, + }) + typ1Name = tree.MakeNewQualifiedTypeName(dbDesc.Name, schemaDesc.Name, typ1Desc.Name) + typ1T = mkTypeT(typ1Desc, &typ1Name) + typ1TSerialized = &types.T{InternalType: typ1T.InternalType} + + typ2Desc = typedesc.NewExistingMutable(descpb.TypeDescriptor{ + Name: "other_enum", + ID: typ2ID, + Version: 1, + ParentID: dbID, + ParentSchemaID: scID, + State: descpb.DescriptorState_PUBLIC, + Kind: descpb.TypeDescriptor_ENUM, + ReferencingDescriptorIDs: []descpb.ID{tableUDTID}, + EnumMembers: enumMembers, + }) + typ2Name = tree.MakeNewQualifiedTypeName(dbDesc.Name, schemaDesc.Name, typ2Desc.Name) + typ2T = mkTypeT(typ2Desc, &typ2Name) + typ2TSerialized = &types.T{InternalType: typ2T.InternalType} + tableDescUDT = tabledesc.NewExistingMutable(descpb.TableDescriptor{ + Name: "foo", + ID: tableUDTID, + Version: 1, + ParentID: dbID, + UnexposedParentSchemaID: scID, + Columns: []descpb.ColumnDescriptor{ + {Name: "a", ID: 1, Type: typ1TSerialized}, + {Name: "b", ID: 1, Type: typ2TSerialized}, + {Name: "c", ID: 1, Type: typ1TSerialized}, + }, + }) + tableDescNoUDT = tabledesc.NewExistingMutable(descpb.TableDescriptor{ + Name: "bar", + ID: tableNoUDTID, + Version: 1, + ParentID: dbID, + UnexposedParentSchemaID: scID, + Columns: []descpb.ColumnDescriptor{ + {Name: "a", ID: 1, Type: types.Int}, + }, + }) + descs = []catalog.MutableDescriptor{ + dbDesc, schemaDesc, typ1Desc, typ2Desc, tableDescUDT, tableDescNoUDT, + } +) + +func mkDescGetter(descs ...catalog.MutableDescriptor) catalog.MapDescGetter { + ret := make(catalog.MapDescGetter, len(descs)) + for _, desc := range descs { + ret[desc.GetID()] = desc.ImmutableCopy() + } + return ret +} + +type descGetterTypeDescriptorResolver struct { + dg catalog.DescGetter + called func(ctx context.Context, id descpb.ID) error + unqualifiedName bool + calls int +} + +func (d *descGetterTypeDescriptorResolver) GetTypeDescriptor( + ctx context.Context, id descpb.ID, +) (tree.TypeName, catalog.TypeDescriptor, error) { + d.calls++ + if d.called != nil { + if err := d.called(ctx, id); err != nil { + return tree.TypeName{}, nil, err + } + } + desc, err := d.dg.GetDesc(ctx, id) + if err != nil { + return tree.TypeName{}, nil, err + } + if d.unqualifiedName { + return tree.MakeUnqualifiedTypeName(tree.Name(desc.GetName())), + desc.(catalog.TypeDescriptor), nil + } + dbDesc, err := d.dg.GetDesc(ctx, desc.GetParentID()) + if err != nil { + return tree.TypeName{}, nil, err + } + // Assume we've got a user-defined schema. + // TODO(ajwerner): Unify this with some other resolution logic. + scDesc, err := d.dg.GetDesc(ctx, desc.GetParentSchemaID()) + if err != nil { + return tree.TypeName{}, nil, err + } + name := tree.MakeNewQualifiedTypeName(dbDesc.GetName(), scDesc.GetName(), desc.GetName()) + return name, desc.(catalog.TypeDescriptor), nil +} + +func assertMetrics(t *testing.T, m *Metrics, hits, misses int64) { + t.Helper() + require.Equal(t, hits, m.Hits.Count()) + require.Equal(t, misses, m.Misses.Count()) +} + +var _ catalog.TypeDescriptorResolver = (*descGetterTypeDescriptorResolver)(nil) diff --git a/pkg/sql/catalog/schemadesc/schema_desc.go b/pkg/sql/catalog/schemadesc/schema_desc.go index 84955518f221..24581bb0a5b6 100644 --- a/pkg/sql/catalog/schemadesc/schema_desc.go +++ b/pkg/sql/catalog/schemadesc/schema_desc.go @@ -31,6 +31,10 @@ var _ catalog.MutableDescriptor = (*Mutable)(nil) // Immutable wraps a Schema descriptor and provides methods on it. type Immutable struct { descpb.SchemaDescriptor + + // isUncommittedVersion is set to true if this descriptor was created from + // a copy of a Mutable with an uncommitted version. + isUncommittedVersion bool } // Mutable is a mutable reference to a SchemaDescriptor. @@ -72,10 +76,10 @@ var ( _ = NewImmutable ) -// NewMutableCreatedSchemaDescriptor returns a Mutable from the +// NewCreatedMutable returns a Mutable from the // given SchemaDescriptor with the cluster version being the zero schema. This // is for a schema that is created within the current transaction. -func NewMutableCreatedSchemaDescriptor(desc descpb.SchemaDescriptor) *Mutable { +func NewCreatedMutable(desc descpb.SchemaDescriptor) *Mutable { return &Mutable{ Immutable: makeImmutable(desc), } @@ -91,6 +95,11 @@ func (desc *Immutable) GetParentSchemaID() descpb.ID { return keys.RootNamespaceID } +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Immutable) IsUncommittedVersion() bool { + return desc.isUncommittedVersion +} + // GetAuditMode implements the DescriptorProto interface. func (desc *Immutable) GetAuditMode() descpb.TableDescriptor_AuditMode { return descpb.TableDescriptor_DISABLED @@ -171,7 +180,9 @@ func (desc *Mutable) OriginalVersion() descpb.DescriptorVersion { func (desc *Mutable) ImmutableCopy() catalog.Descriptor { // TODO (lucy): Should the immutable descriptor constructors always make a // copy, so we don't have to do it here? - return NewImmutable(*protoutil.Clone(desc.SchemaDesc()).(*descpb.SchemaDescriptor)) + imm := NewImmutable(*protoutil.Clone(desc.SchemaDesc()).(*descpb.SchemaDescriptor)) + imm.isUncommittedVersion = desc.IsUncommittedVersion() + return imm } // IsNew implements the MutableDescriptor interface. @@ -190,6 +201,11 @@ func (desc *Mutable) SetName(name string) { desc.Name = name } +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Mutable) IsUncommittedVersion() bool { + return desc.IsNew() || desc.GetVersion() != desc.ClusterVersion.GetVersion() +} + // IsSchemaNameValid returns whether the input name is valid for a user defined // schema. func IsSchemaNameValid(name string) error { diff --git a/pkg/sql/catalog/tabledesc/structured.go b/pkg/sql/catalog/tabledesc/structured.go index 471b9e0e0f44..50219eb4321a 100644 --- a/pkg/sql/catalog/tabledesc/structured.go +++ b/pkg/sql/catalog/tabledesc/structured.go @@ -187,8 +187,21 @@ func MakeImmutable(tbl descpb.TableDescriptor) Immutable { } // NewImmutable returns a Immutable from the given TableDescriptor. +// This function assumes that this descriptor has not been modified from the +// version stored in the key-value store. func NewImmutable(tbl descpb.TableDescriptor) *Immutable { + return NewImmutableWithIsUncommittedVersion(tbl, false /* isUncommittedVersion */) +} + +// NewImmutableWithIsUncommittedVersion returns a Immutable from the given +// TableDescriptor and allows the caller to mark the table as corresponding to +// an uncommitted version. This should be used when constructing a new copy of +// an Immutable from an existing descriptor which may have a new version. +func NewImmutableWithIsUncommittedVersion( + tbl descpb.TableDescriptor, isUncommittedVersion bool, +) *Immutable { desc := MakeImmutable(tbl) + desc.isUncommittedVersion = isUncommittedVersion return &desc } diff --git a/pkg/sql/catalog/tabledesc/table_desc.go b/pkg/sql/catalog/tabledesc/table_desc.go index 15752c425a6d..adb5b89dd67a 100644 --- a/pkg/sql/catalog/tabledesc/table_desc.go +++ b/pkg/sql/catalog/tabledesc/table_desc.go @@ -56,6 +56,10 @@ type Immutable struct { postDeserializationChanges PostDeserializationTableDescriptorChanges + // isUncommittedVersion is set to true if this descriptor was created from + // a copy of a Mutable with an uncommitted version. + isUncommittedVersion bool + // TODO (lucy): populate these and use them // inboundFKs []*ForeignKeyConstraint // outboundFKs []*ForeignKeyConstraint @@ -64,6 +68,11 @@ type Immutable struct { // NameResolutionResult implements the tree.NameResolutionResult interface. func (*Immutable) NameResolutionResult() {} +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Immutable) IsUncommittedVersion() bool { + return desc.isUncommittedVersion +} + // DescriptorProto prepares desc for serialization. func (desc *Immutable) DescriptorProto() *descpb.Descriptor { return &descpb.Descriptor{ @@ -100,7 +109,14 @@ func (desc *Immutable) GetColumnAtIdx(idx int) *descpb.ColumnDescriptor { func (desc *Mutable) ImmutableCopy() catalog.Descriptor { // TODO (lucy): Should the immutable descriptor constructors always make a // copy, so we don't have to do it here? - return NewImmutable(*protoutil.Clone(desc.TableDesc()).(*descpb.TableDescriptor)) + imm := NewImmutable(*protoutil.Clone(desc.TableDesc()).(*descpb.TableDescriptor)) + imm.isUncommittedVersion = desc.IsUncommittedVersion() + return imm +} + +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Mutable) IsUncommittedVersion() bool { + return desc.IsNew() || desc.GetVersion() != desc.ClusterVersion.GetVersion() } // SetDrainingNames implements the MutableDescriptor interface. diff --git a/pkg/sql/catalog/typedesc/type_desc.go b/pkg/sql/catalog/typedesc/type_desc.go index 43d7461cf92f..38905c68be6f 100644 --- a/pkg/sql/catalog/typedesc/type_desc.go +++ b/pkg/sql/catalog/typedesc/type_desc.go @@ -70,6 +70,11 @@ type Mutable struct { ClusterVersion *Immutable } +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Mutable) IsUncommittedVersion() bool { + return desc.IsNew() || desc.ClusterVersion.GetVersion() != desc.GetVersion() +} + // Immutable is a custom type for wrapping TypeDescriptors // when used in a read only way. type Immutable struct { @@ -79,6 +84,10 @@ type Immutable struct { logicalReps []string physicalReps [][]byte readOnlyMembers []bool + + // isUncommittedVersion is set to true if this descriptor was created from + // a copy of a Mutable with an uncommitted version. + isUncommittedVersion bool } // NewCreatedMutable returns a Mutable from the given type descriptor with the @@ -169,6 +178,11 @@ func (desc *Immutable) GetOfflineReason() string { return "" } +// IsUncommittedVersion implements the Descriptor interface. +func (desc *Immutable) IsUncommittedVersion() bool { + return desc.isUncommittedVersion +} + // DescriptorProto returns a Descriptor for serialization. func (desc *Immutable) DescriptorProto() *descpb.Descriptor { return &descpb.Descriptor{ @@ -231,7 +245,9 @@ func (desc *Mutable) OriginalVersion() descpb.DescriptorVersion { func (desc *Mutable) ImmutableCopy() catalog.Descriptor { // TODO (lucy): Should the immutable descriptor constructors always make a // copy, so we don't have to do it here? - return NewImmutable(*protoutil.Clone(desc.TypeDesc()).(*descpb.TypeDescriptor)) + imm := NewImmutable(*protoutil.Clone(desc.TypeDesc()).(*descpb.TypeDescriptor)) + imm.isUncommittedVersion = desc.IsUncommittedVersion() + return imm } // IsNew implements the MutableDescriptor interface. @@ -513,9 +529,7 @@ func HydrateTypesInTableDescriptor( if err != nil { return err } - // TODO (rohany): This should be a noop if the hydrated type - // information present in the descriptor has the same version as - // the resolved type descriptor we found here. + // Note that this will no-op if the type is already hydrated. if err := typDesc.HydrateTypeInfoWithName(ctx, col.Type, &name, res); err != nil { return err } @@ -541,9 +555,15 @@ func HydrateTypesInTableDescriptor( // HydrateTypeInfoWithName fills in user defined type metadata for // a type and also sets the name in the metadata to the passed in name. // This is used when hydrating a type with a known qualified name. +// +// Note that if the passed type is already hydrated, regardless of the version +// with which it has been hydrated, this is a no-op. func (desc *Immutable) HydrateTypeInfoWithName( ctx context.Context, typ *types.T, name *tree.TypeName, res catalog.TypeDescriptorResolver, ) error { + if typ.IsHydrated() { + return nil + } typ.TypeMeta.Name = &types.UserDefinedTypeName{ Catalog: name.Catalog(), ExplicitSchema: name.ExplicitSchema, diff --git a/pkg/sql/conn_executor.go b/pkg/sql/conn_executor.go index 800960cdb245..6678085efbef 100644 --- a/pkg/sql/conn_executor.go +++ b/pkg/sql/conn_executor.go @@ -54,7 +54,6 @@ import ( "github.com/cockroachdb/cockroach/pkg/util/syncutil" "github.com/cockroachdb/cockroach/pkg/util/timeutil" "github.com/cockroachdb/cockroach/pkg/util/tracing" - "github.com/cockroachdb/cockroach/pkg/util/uuid" "github.com/cockroachdb/errors" "github.com/cockroachdb/logtags" "golang.org/x/net/trace" @@ -656,7 +655,7 @@ func (s *Server) newConnExecutor( } ex.extraTxnState.prepStmtsNamespaceMemAcc = ex.sessionMon.MakeBoundAccount() ex.extraTxnState.descCollection = descs.MakeCollection(ctx, s.cfg.LeaseManager, - s.cfg.Settings, s.dbCache.getDatabaseCache(), s.dbCache, sd) + s.cfg.Settings, s.dbCache.getDatabaseCache(), s.dbCache, sd, s.cfg.HydratedTables) ex.extraTxnState.txnRewindPos = -1 ex.extraTxnState.schemaChangeJobsCache = make(map[descpb.ID]*jobs.Job) ex.mu.ActiveQueries = make(map[ClusterWideID]*queryMeta) @@ -1258,6 +1257,9 @@ func (ex *connExecutor) resetExtraTxnState( if ex.extraTxnState.onTxnRestart != nil { ex.extraTxnState.onTxnRestart() } + ex.state.mu.Lock() + defer ex.state.mu.Unlock() + ex.state.mu.stmtCount = 0 } // NOTE: on txnRestart we don't need to muck with the savepoints stack. It's either a // a ROLLBACK TO SAVEPOINT that generated the event, and that statement deals with the @@ -2343,16 +2345,17 @@ func (ex *connExecutor) serialize() serverpb.Session { ex.state.mu.RLock() defer ex.state.mu.RUnlock() - var kvTxnID *uuid.UUID var activeTxnInfo *serverpb.TxnInfo txn := ex.state.mu.txn if txn != nil { id := txn.ID() - kvTxnID = &id activeTxnInfo = &serverpb.TxnInfo{ - ID: id, - Start: ex.state.mu.txnStart, - TxnDescription: txn.String(), + ID: id, + Start: ex.state.mu.txnStart, + NumStatementsExecuted: int32(ex.state.mu.stmtCount), + NumRetries: int32(txn.Epoch()), + NumAutoRetries: int32(ex.extraTxnState.autoRetryCounter), + TxnDescription: txn.String(), } } @@ -2405,7 +2408,6 @@ func (ex *connExecutor) serialize() serverpb.Session { Start: ex.phaseTimes[sessionInit].UTC(), ActiveQueries: activeQueries, ActiveTxn: activeTxnInfo, - KvTxnID: kvTxnID, LastActiveQuery: lastActiveQuery, ID: ex.sessionID.GetBytes(), AllocBytes: ex.mon.AllocBytes(), diff --git a/pkg/sql/conn_executor_exec.go b/pkg/sql/conn_executor_exec.go index b64c0e6bf86d..9ced7c785ae6 100644 --- a/pkg/sql/conn_executor_exec.go +++ b/pkg/sql/conn_executor_exec.go @@ -244,6 +244,7 @@ func (ex *connExecutor) execStmtInOpenState( ex.incrementExecutedStmtCounter(stmt) } }() + ex.state.mu.stmtCount++ os := ex.machine.CurState().(stateOpen) diff --git a/pkg/sql/crdb_internal.go b/pkg/sql/crdb_internal.go index cf2ec988a2a4..0ba501425ce7 100644 --- a/pkg/sql/crdb_internal.go +++ b/pkg/sql/crdb_internal.go @@ -1005,7 +1005,10 @@ CREATE TABLE crdb_internal.%s ( session_id STRING, -- the ID of the session start TIMESTAMP, -- the start time of the transaction txn_string STRING, -- the string representation of the transcation - application_name STRING -- the name of the application as per SET application_name + application_name STRING, -- the name of the application as per SET application_name + num_stmts INT, -- the number of statements executed so far + num_retries INT, -- the number of times the transaction was restarted + num_auto_retries INT -- the number of times the transaction was automatically restarted )` var crdbInternalLocalTxnsTable = virtualSchemaTable{ @@ -1071,6 +1074,9 @@ func populateTransactionsTable( ts, tree.NewDString(txn.TxnDescription), tree.NewDString(session.ApplicationName), + tree.NewDInt(tree.DInt(txn.NumStatementsExecuted)), + tree.NewDInt(tree.DInt(txn.NumRetries)), + tree.NewDInt(tree.DInt(txn.NumAutoRetries)), ); err != nil { return err } @@ -1368,8 +1374,8 @@ func populateSessionsTable( } kvTxnIDDatum := tree.DNull - if session.KvTxnID != nil { - kvTxnIDDatum = tree.NewDString(session.KvTxnID.String()) + if session.ActiveTxn != nil { + kvTxnIDDatum = tree.NewDString(session.ActiveTxn.ID.String()) } sessionID := getSessionID(session) diff --git a/pkg/sql/create_schema.go b/pkg/sql/create_schema.go index 00c5f80eb2bb..8d048cf19619 100644 --- a/pkg/sql/create_schema.go +++ b/pkg/sql/create_schema.go @@ -92,7 +92,7 @@ func (p *planner) createUserDefinedSchema(params runParams, n *tree.CreateSchema privs.SetOwner(params.SessionData().User) // Create the SchemaDescriptor. - desc := schemadesc.NewMutableCreatedSchemaDescriptor(descpb.SchemaDescriptor{ + desc := schemadesc.NewCreatedMutable(descpb.SchemaDescriptor{ ParentID: db.ID, Name: n.Schema, ID: id, diff --git a/pkg/sql/delegate/delegate.go b/pkg/sql/delegate/delegate.go index 0d2aec2c70d9..a6239d6a20ca 100644 --- a/pkg/sql/delegate/delegate.go +++ b/pkg/sql/delegate/delegate.go @@ -103,6 +103,9 @@ func TryDelegate( case *tree.ShowTables: return d.delegateShowTables(t) + case *tree.ShowTransactions: + return d.delegateShowTransactions(t) + case *tree.ShowUsers: return d.delegateShowRoles() diff --git a/pkg/sql/delegate/show_transactions.go b/pkg/sql/delegate/show_transactions.go new file mode 100644 index 000000000000..ad5a6565cf64 --- /dev/null +++ b/pkg/sql/delegate/show_transactions.go @@ -0,0 +1,29 @@ +// Copyright 2020 The Cockroach Authors. +// +// Use of this software is governed by the Business Source License +// included in the file licenses/BSL.txt. +// +// As of the Change Date specified in that file, in accordance with +// the Business Source License, use of this software will be governed +// by the Apache License, Version 2.0, included in the file +// licenses/APL.txt. + +package delegate + +import ( + "github.com/cockroachdb/cockroach/pkg/sql/catalog/catconstants" + "github.com/cockroachdb/cockroach/pkg/sql/sem/tree" +) + +func (d *delegator) delegateShowTransactions(n *tree.ShowTransactions) (tree.Statement, error) { + const query = `SELECT node_id, id AS txn_id, application_name, num_stmts, num_retries, num_auto_retries FROM ` + table := `"".crdb_internal.node_transactions` + if n.Cluster { + table = `"".crdb_internal.cluster_transactions` + } + var filter string + if !n.All { + filter = " WHERE application_name NOT LIKE '" + catconstants.InternalAppNamePrefix + "%'" + } + return parse(query + table + filter) +} diff --git a/pkg/sql/distsql/server.go b/pkg/sql/distsql/server.go index 74e94230a4fa..35a3416cf38e 100644 --- a/pkg/sql/distsql/server.go +++ b/pkg/sql/distsql/server.go @@ -439,7 +439,9 @@ func (ds *ServerImpl) NewFlowContext( // If we weren't passed a descs.Collection, then make a new one. We are // responsible for cleaning it up and releasing any accessed descriptors // on flow cleanup. - collection := descs.NewCollection(ctx, ds.ServerConfig.Settings, ds.ServerConfig.LeaseManager.(*lease.Manager)) + collection := descs.NewCollection(ctx, ds.ServerConfig.Settings, + ds.ServerConfig.LeaseManager.(*lease.Manager), + ds.ServerConfig.HydratedTables) flowCtx.TypeResolverFactory = &descs.DistSQLTypeResolverFactory{ Descriptors: collection, CleanupFunc: func(ctx context.Context) { diff --git a/pkg/sql/exec_util.go b/pkg/sql/exec_util.go index ff32bef6a627..8be58cce3c99 100644 --- a/pkg/sql/exec_util.go +++ b/pkg/sql/exec_util.go @@ -44,6 +44,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/sql/catalog/catalogkv" "github.com/cockroachdb/cockroach/pkg/sql/catalog/database" "github.com/cockroachdb/cockroach/pkg/sql/catalog/descs" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/hydratedtables" "github.com/cockroachdb/cockroach/pkg/sql/catalog/lease" "github.com/cockroachdb/cockroach/pkg/sql/colexec" "github.com/cockroachdb/cockroach/pkg/sql/distsql" @@ -701,6 +702,10 @@ type ExecutorConfig struct { StmtDiagnosticsRecorder *stmtdiagnostics.Registry ExternalIODirConfig base.ExternalIODirConfig + + // HydratedTables is a node-level cache of table descriptors which utilize + // user-defined types. + HydratedTables *hydratedtables.Cache } // Organization returns the value of cluster.organization. diff --git a/pkg/sql/execinfra/server_config.go b/pkg/sql/execinfra/server_config.go index d71bda1a2b74..178043473ee4 100644 --- a/pkg/sql/execinfra/server_config.go +++ b/pkg/sql/execinfra/server_config.go @@ -27,6 +27,7 @@ import ( "github.com/cockroachdb/cockroach/pkg/rpc/nodedialer" "github.com/cockroachdb/cockroach/pkg/settings" "github.com/cockroachdb/cockroach/pkg/settings/cluster" + "github.com/cockroachdb/cockroach/pkg/sql/catalog/hydratedtables" "github.com/cockroachdb/cockroach/pkg/sql/execinfrapb" "github.com/cockroachdb/cockroach/pkg/sql/sqlliveness" "github.com/cockroachdb/cockroach/pkg/sql/sqlutil" @@ -170,6 +171,10 @@ type ServerConfig struct { // processors query the cache to see if they should communicate updates to the // gateway. RangeCache *kvcoord.RangeDescriptorCache + + // HydratedTables is a node-level cache of table descriptors which utilize + // user-defined types. + HydratedTables *hydratedtables.Cache } // RuntimeStats is an interface through which the rowexec layer can get diff --git a/pkg/sql/logictest/testdata/logic_test/crdb_internal b/pkg/sql/logictest/testdata/logic_test/crdb_internal index 2ad365067f90..87bdc2fffbbb 100644 --- a/pkg/sql/logictest/testdata/logic_test/crdb_internal +++ b/pkg/sql/logictest/testdata/logic_test/crdb_internal @@ -163,15 +163,15 @@ SELECT * FROM crdb_internal.cluster_queries WHERE node_id < 0 ---- query_id txn_id node_id session_id user_name start query client_address application_name distributed phase -query TITTTT colnames +query TITTTTIII colnames SELECT * FROM crdb_internal.node_transactions WHERE node_id < 0 ---- -id node_id session_id start txn_string application_name +id node_id session_id start txn_string application_name num_stmts num_retries num_auto_retries -query TITTTT colnames +query TITTTTIII colnames SELECT * FROM crdb_internal.cluster_transactions WHERE node_id < 0 ---- -id node_id session_id start txn_string application_name +id node_id session_id start txn_string application_name num_stmts num_retries num_auto_retries query ITTTTTTTTTTT colnames SELECT * FROM crdb_internal.node_sessions WHERE node_id < 0 diff --git a/pkg/sql/parser/help_test.go b/pkg/sql/parser/help_test.go index 0e1ecbfe27e1..17739356b9a4 100644 --- a/pkg/sql/parser/help_test.go +++ b/pkg/sql/parser/help_test.go @@ -270,6 +270,9 @@ func TestContextualHelp(t *testing.T) { {`SHOW SESSIONS ??`, `SHOW SESSIONS`}, {`SHOW LOCAL SESSIONS ??`, `SHOW SESSIONS`}, + {`SHOW TRANSACTIONS ??`, `SHOW TRANSACTIONS`}, + {`SHOW LOCAL TRANSACTIONS ??`, `SHOW TRANSACTIONS`}, + {`SHOW STATISTICS ??`, `SHOW STATISTICS`}, {`SHOW STATISTICS FOR TABLE ??`, `SHOW STATISTICS`}, diff --git a/pkg/sql/parser/parse_test.go b/pkg/sql/parser/parse_test.go index cfb4aae4991c..929f8f353f78 100644 --- a/pkg/sql/parser/parse_test.go +++ b/pkg/sql/parser/parse_test.go @@ -2180,6 +2180,8 @@ $function$`, {`SHOW SESSIONS`, `SHOW CLUSTER SESSIONS`}, {`SHOW ALL SESSIONS`, `SHOW ALL CLUSTER SESSIONS`}, + {`SHOW TRANSACTIONS`, `SHOW CLUSTER TRANSACTIONS`}, + {`SHOW ALL TRANSACTIONS`, `SHOW ALL CLUSTER TRANSACTIONS`}, {`SHOW QUERIES`, `SHOW CLUSTER QUERIES`}, {`SHOW ALL QUERIES`, `SHOW ALL CLUSTER QUERIES`}, diff --git a/pkg/sql/parser/sql.y b/pkg/sql/parser/sql.y index c85704377b9c..68396b09b463 100644 --- a/pkg/sql/parser/sql.y +++ b/pkg/sql/parser/sql.y @@ -653,7 +653,8 @@ func (u *sqlSymUnion) refreshDataOption() tree.RefreshDataOption { %token SYMMETRIC SYNTAX SYSTEM SQRT SUBSCRIPTION %token TABLE TABLES TEMP TEMPLATE TEMPORARY TENANT TESTING_RELOCATE EXPERIMENTAL_RELOCATE TEXT THEN -%token TIES TIME TIMETZ TIMESTAMP TIMESTAMPTZ TO THROTTLING TRAILING TRACE TRANSACTION TREAT TRIGGER TRIM TRUE +%token TIES TIME TIMETZ TIMESTAMP TIMESTAMPTZ TO THROTTLING TRAILING TRACE +%token TRANSACTION TRANSACTIONS TREAT TRIGGER TRIM TRUE %token TRUNCATE TRUSTED TYPE TYPES %token TRACING @@ -863,6 +864,7 @@ func (u *sqlSymUnion) refreshDataOption() tree.RefreshDataOption { %type show_tables_stmt %type show_trace_stmt %type show_transaction_stmt +%type show_transactions_stmt %type show_types_stmt %type show_users_stmt %type show_zone_stmt @@ -4179,8 +4181,8 @@ zone_value: // SHOW CREATE, SHOW DATABASES, SHOW ENUMS, SHOW HISTOGRAM, SHOW INDEXES, SHOW // PARTITIONS, SHOW JOBS, SHOW QUERIES, SHOW RANGE, SHOW RANGES, // SHOW ROLES, SHOW SCHEMAS, SHOW SEQUENCES, SHOW SESSION, SHOW SESSIONS, -// SHOW STATISTICS, SHOW SYNTAX, SHOW TABLES, SHOW TRACE, SHOW TRANSACTION, SHOW TYPES, -// SHOW USERS, SHOW LAST QUERY STATISTICS, SHOW SCHEDULES +// SHOW STATISTICS, SHOW SYNTAX, SHOW TABLES, SHOW TRACE, SHOW TRANSACTION, +// SHOW TRANSACTIONS, SHOW TYPES, SHOW USERS, SHOW LAST QUERY STATISTICS, SHOW SCHEDULES show_stmt: show_backup_stmt // EXTEND WITH HELP: SHOW BACKUP | show_columns_stmt // EXTEND WITH HELP: SHOW COLUMNS @@ -4211,6 +4213,7 @@ show_stmt: | show_tables_stmt // EXTEND WITH HELP: SHOW TABLES | show_trace_stmt // EXTEND WITH HELP: SHOW TRACE | show_transaction_stmt // EXTEND WITH HELP: SHOW TRANSACTION +| show_transactions_stmt // EXTEND WITH HELP: SHOW TRANSACTIONS | show_users_stmt // EXTEND WITH HELP: SHOW USERS | show_zone_stmt | SHOW error // SHOW HELP: SHOW @@ -4735,6 +4738,21 @@ show_tables_stmt: } | SHOW TABLES error // SHOW HELP: SHOW TABLES +// %Help: SHOW TRANSACTIONS - list open client transactions across the cluster +// %Category: Misc +// %Text: SHOW [ALL] [CLUSTER | LOCAL] TRANSACTIONS +show_transactions_stmt: + SHOW opt_cluster TRANSACTIONS + { + $$.val = &tree.ShowTransactions{Cluster: $2.bool()} + } +| SHOW opt_cluster TRANSACTIONS error // SHOW HELP: SHOW TRANSACTIONS +| SHOW ALL opt_cluster TRANSACTIONS + { + $$.val = &tree.ShowTransactions{All: true, Cluster: $3.bool()} + } +| SHOW ALL opt_cluster TRANSACTIONS error // SHOW HELP: SHOW TRANSACTIONS + with_comment: WITH COMMENT { $$.val = true } | /* EMPTY */ { $$.val = false } @@ -11558,6 +11576,7 @@ unreserved_keyword: | TIES | TRACE | TRANSACTION +| TRANSACTIONS | TRIGGER | TRUNCATE | TRUSTED diff --git a/pkg/sql/planner.go b/pkg/sql/planner.go index ef325fa2754f..5b5ba2c6ebb0 100644 --- a/pkg/sql/planner.go +++ b/pkg/sql/planner.go @@ -269,7 +269,10 @@ func newInternalPlanner( // The table collection used by the internal planner does not rely on the // deprecatedDatabaseCache and there are no subscribers to the // deprecatedDatabaseCache, so we can leave it uninitialized. - tables := descs.NewCollection(ctx, execCfg.Settings, execCfg.LeaseManager) + // Furthermore, we're not concerned about the efficiency of querying tables + // with user-defined types, hence the nil hydratedTables. + tables := descs.NewCollection(ctx, execCfg.Settings, execCfg.LeaseManager, + nil /* hydratedTables */) dataMutator := &sessionDataMutator{ data: sd, defaults: SessionDefaults(map[string]string{ diff --git a/pkg/sql/reparent_database.go b/pkg/sql/reparent_database.go index 51355a9f3d2f..195a3009495a 100644 --- a/pkg/sql/reparent_database.go +++ b/pkg/sql/reparent_database.go @@ -102,7 +102,7 @@ func (n *reparentDatabaseNode) startExec(params runParams) error { if err != nil { return err } - schema := schemadesc.NewMutableCreatedSchemaDescriptor(descpb.SchemaDescriptor{ + schema := schemadesc.NewCreatedMutable(descpb.SchemaDescriptor{ ParentID: n.newParent.ID, Name: n.db.Name, ID: id, diff --git a/pkg/sql/sem/tree/show.go b/pkg/sql/sem/tree/show.go index 24931ec8b004..fac96da22c62 100644 --- a/pkg/sql/sem/tree/show.go +++ b/pkg/sql/sem/tree/show.go @@ -344,6 +344,25 @@ func (node *ShowTables) Format(ctx *FmtCtx) { } } +// ShowTransactions represents a SHOW TRANSACTIONS statement +type ShowTransactions struct { + All bool + Cluster bool +} + +// Format implements the NodeFormatter interface. +func (node *ShowTransactions) Format(ctx *FmtCtx) { + ctx.WriteString("SHOW ") + if node.All { + ctx.WriteString("ALL ") + } + if node.Cluster { + ctx.WriteString("CLUSTER TRANSACTIONS") + } else { + ctx.WriteString("LOCAL TRANSACTIONS") + } +} + // ShowConstraints represents a SHOW CONSTRAINTS statement. type ShowConstraints struct { Table *UnresolvedObjectName diff --git a/pkg/sql/sem/tree/stmt.go b/pkg/sql/sem/tree/stmt.go index 8a137e7d148b..5df7622fbbfc 100644 --- a/pkg/sql/sem/tree/stmt.go +++ b/pkg/sql/sem/tree/stmt.go @@ -945,6 +945,12 @@ func (*ShowTables) StatementType() StatementType { return Rows } // StatementTag returns a short string identifying the type of statement. func (*ShowTables) StatementTag() string { return "SHOW TABLES" } +// StatementType implements the Statement interface +func (*ShowTransactions) StatementType() StatementType { return Rows } + +// StatementTag returns a short string identifying the type of statement. +func (*ShowTransactions) StatementTag() string { return "SHOW TRANSACTIONS" } + // StatementType implements the Statement interface. func (*ShowSchemas) StatementType() StatementType { return Rows } @@ -1114,6 +1120,7 @@ func (n *ShowTables) String() string { return AsString(n) } func (n *ShowTypes) String() string { return AsString(n) } func (n *ShowTraceForSession) String() string { return AsString(n) } func (n *ShowTransactionStatus) String() string { return AsString(n) } +func (n *ShowTransactions) String() string { return AsString(n) } func (n *ShowLastQueryStatistics) String() string { return AsString(n) } func (n *ShowUsers) String() string { return AsString(n) } func (n *ShowVar) String() string { return AsString(n) } diff --git a/pkg/sql/stats/stats_cache.go b/pkg/sql/stats/stats_cache.go index 82665a372855..38776ae106b4 100644 --- a/pkg/sql/stats/stats_cache.go +++ b/pkg/sql/stats/stats_cache.go @@ -423,7 +423,8 @@ func (sc *TableStatisticsCache) parseStats( // will need to start writing a timestamp on the stats objects and request // TypeDescriptor's with the timestamp that the stats were recorded with. err := sc.ClientDB.Txn(ctx, func(ctx context.Context, txn *kv.Txn) error { - collection := descs.NewCollection(ctx, sc.Settings, sc.LeaseMgr) + collection := descs.NewCollection(ctx, sc.Settings, sc.LeaseMgr, + nil /* hydratedTables */) defer collection.ReleaseAll(ctx) resolver := descs.NewDistSQLTypeResolver(collection, txn) var err error diff --git a/pkg/sql/txn_state.go b/pkg/sql/txn_state.go index c0fb8c2c3db8..e06158a24782 100644 --- a/pkg/sql/txn_state.go +++ b/pkg/sql/txn_state.go @@ -53,6 +53,10 @@ type txnState struct { // txnStart records the time that txn started. txnStart time.Time + + // stmtCount keeps track of the number of statements that the transaction + // has executed. + stmtCount int } // connCtx is the connection's context. This is the parent of Ctx. @@ -198,6 +202,7 @@ func (ts *txnState) resetForNewSQLTxn( ts.mon.Start(ts.Ctx, tranCtx.connMon, mon.BoundAccount{} /* reserved */) ts.mu.Lock() + ts.mu.stmtCount = 0 if txn == nil { ts.mu.txn = kv.NewTxnWithSteppingEnabled(ts.Ctx, tranCtx.db, tranCtx.nodeIDOrZero) ts.mu.txn.SetDebugName(opName) diff --git a/pkg/sql/types/types.go b/pkg/sql/types/types.go index afe3bc9b1068..713c408362f6 100644 --- a/pkg/sql/types/types.go +++ b/pkg/sql/types/types.go @@ -2478,6 +2478,12 @@ func (t *T) stringTypeSQL() string { return typName } +// IsHydrated returns true if this is a user-defined type and the TypeMeta +// is hydrated. +func (t *T) IsHydrated() bool { + return t.UserDefined() && t.TypeMeta != (UserDefinedTypeMetadata{}) +} + var typNameLiterals map[string]*T func init() { diff --git a/pkg/ts/catalog/chart_catalog.go b/pkg/ts/catalog/chart_catalog.go index d17831605091..2a55daeed517 100644 --- a/pkg/ts/catalog/chart_catalog.go +++ b/pkg/ts/catalog/chart_catalog.go @@ -1488,7 +1488,19 @@ var charts = []sectionDescription{ }, }, { - Organization: [][]string{{SQLLayer, "SQL Livness"}}, + Organization: [][]string{{SQLLayer, "SQL Catalog", "Hydrated Descriptor Cache"}}, + Charts: []chartDescription{ + { + Title: "Cache Hits and Misses", + Metrics: []string{ + "sql.hydrated_table_cache.hits", + "sql.hydrated_table_cache.misses", + }, + }, + }, + }, + { + Organization: [][]string{{SQLLayer, "SQL Liveness"}}, Charts: []chartDescription{ { Title: "Session Writes",