diff --git a/docs/generated/sql/functions.md b/docs/generated/sql/functions.md
index 529a7dcc8745..64a9a64c0bfb 100644
--- a/docs/generated/sql/functions.md
+++ b/docs/generated/sql/functions.md
@@ -2371,6 +2371,8 @@ to recreate a database.’
quote_ident(val: string) → string | Return val suitably quoted to serve as identifier in a SQL statement.
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/partitioning b/pkg/ccl/logictestccl/testdata/logic_test/partitioning
index 55b6a9eb132b..f00f24460521 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/partitioning
+++ b/pkg/ccl/logictestccl/testdata/logic_test/partitioning
@@ -428,9 +428,13 @@ TABLE ok1
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1)
- └── (2)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (2)
scan ok1
statement ok
@@ -472,9 +476,13 @@ TABLE ok2
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1)
- └── (2)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (2)
scan ok2
statement ok
@@ -516,8 +524,13 @@ TABLE ok3
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- └── (1)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── ()
scan ok3
statement ok
@@ -563,10 +576,19 @@ TABLE ok4
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1, 1)
- ├── (1)
- └── (2, 3)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1, 1)
+ ├── p2
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── p3
+ │ └── partition by list prefixes
+ │ └── (2, 3)
+ └── p4
+ └── partition by list prefixes
+ └── ()
scan ok4
statement ok
@@ -603,9 +625,16 @@ TABLE ok5
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (1)
- └── (2)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── p2
+ │ └── partition by list prefixes
+ │ └── (2)
+ └── p3
+ └── partition by list prefixes
+ └── ()
scan ok5
query TT
@@ -897,9 +926,13 @@ TABLE ok11
├── a int not null
├── b int not null
├── c int not null
- └── partition by list prefixes
- ├── (1)
- └── (6)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (6)
scan ok11
statement ok
@@ -943,10 +976,16 @@ TABLE ok12
└── PRIMARY INDEX primary
├── a int not null
├── b int not null
- └── partition by list prefixes
- ├── (NULL)
- ├── (1)
- └── (2)
+ └── partitions
+ ├── pu
+ │ └── partition by list prefixes
+ │ └── (NULL)
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── p2
+ └── partition by list prefixes
+ └── (2)
scan ok12
# Verify that creating a partition that includes NULL does not change the
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
index 87b05130ad42..c54b1e4b7d88 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
+++ b/pkg/ccl/logictestccl/testdata/logic_test/partitioning_implicit
@@ -149,6 +149,73 @@ CREATE TABLE public.t (
)
-- Warning: Partitioned table with no zone configurations.
+query T
+EXPLAIN (OPT, CATALOG) SELECT * FROM t
+----
+TABLE t
+ ├── pk int not null
+ ├── a int not null
+ ├── b int
+ ├── c int
+ ├── d int
+ ├── j jsonb
+ ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
+ ├── tableoid oid [hidden] [system]
+ ├── j_inverted_key bytes not null [virtual-inverted]
+ ├── FAMILY fam_0_pk_a_b_c_d_j (pk, a, b, c, d, j)
+ ├── PRIMARY INDEX primary
+ │ ├── a int not null (implicit)
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── pk_implicit
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── INDEX t_b_idx
+ │ ├── a int not null (implicit)
+ │ ├── b int
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── b_implicit
+ │ └── partition by list prefixes
+ │ └── (2)
+ ├── UNIQUE INDEX t_c_key
+ │ ├── a int not null (implicit)
+ │ ├── c int
+ │ ├── pk int not null (storing)
+ │ └── partitions
+ │ └── c_implicit
+ │ └── partition by list prefixes
+ │ └── (3)
+ ├── INDEX t_a_b_c_idx
+ │ ├── d int (implicit)
+ │ ├── a int not null
+ │ ├── b int
+ │ ├── c int
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── a_b_c_implicit
+ │ └── partition by list prefixes
+ │ └── (4)
+ ├── INVERTED INDEX t_j_idx
+ │ ├── a int not null (implicit)
+ │ ├── j_inverted_key bytes not null [virtual-inverted]
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── j_implicit
+ │ └── partition by list prefixes
+ │ └── (5)
+ ├── INDEX new_idx
+ │ ├── a int not null (implicit)
+ │ ├── d int
+ │ ├── pk int not null
+ │ └── partitions
+ │ └── d_implicit
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── UNIQUE WITHOUT INDEX (pk)
+ └── UNIQUE WITHOUT INDEX (c)
+scan t
+
statement ok
INSERT INTO t VALUES (1, 2, 3, 4, 5)
diff --git a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
index 750904afb215..cefe194ebc49 100644
--- a/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
+++ b/pkg/ccl/logictestccl/testdata/logic_test/regional_by_row
@@ -183,6 +183,194 @@ ALTER PARTITION "us-east-1" OF INDEX multi_region_test_db.public.regional_by_row
voter_constraints = '{+region=us-east-1: 2}',
lease_preferences = '[[+region=us-east-1]]'
+query T
+EXPLAIN (OPT, CATALOG) SELECT * FROM regional_by_row_table
+----
+TABLE regional_by_row_table
+ ├── pk int not null
+ ├── pk2 int not null
+ ├── a int not null
+ ├── b int not null
+ ├── j jsonb
+ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden]
+ ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
+ ├── tableoid oid [hidden] [system]
+ ├── j_inverted_key bytes not null [virtual-inverted]
+ ├── FAMILY fam_0_pk_pk2_a_b_j_crdb_region (pk, pk2, a, b, j, crdb_region)
+ ├── CHECK (crdb_region IN (b'\x40':::@100054, b'\x80':::@100054, b'\xc0':::@100054))
+ ├── PRIMARY INDEX primary
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── pk int not null
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── INDEX regional_by_row_table_a_idx
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── a int not null
+ │ ├── pk int not null
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── UNIQUE INDEX regional_by_row_table_b_key
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── b int not null
+ │ ├── pk int not null (storing)
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── INVERTED INDEX regional_by_row_table_j_idx
+ │ ├── crdb_region crdb_internal_region not null default (default_to_database_primary_region(gateway_region())::@100054) [hidden] (implicit)
+ │ ├── j_inverted_key bytes not null [virtual-inverted]
+ │ ├── pk int not null
+ │ ├── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── partitions
+ │ ├── ap-southeast-2
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ap-southeast-2')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ap-southeast-2]
+ │ │ └── lease preference: [+region=ap-southeast-2]
+ │ ├── ca-central-1
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('ca-central-1')
+ │ │ └── ZONE
+ │ │ ├── replica constraints
+ │ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ │ └── voter constraints: [+region=ca-central-1]
+ │ │ └── lease preference: [+region=ca-central-1]
+ │ └── us-east-1
+ │ ├── partition by list prefixes
+ │ │ └── ('us-east-1')
+ │ └── ZONE
+ │ ├── replica constraints
+ │ │ ├── 1 replicas: [+region=ap-southeast-2]
+ │ │ ├── 1 replicas: [+region=ca-central-1]
+ │ │ ├── 1 replicas: [+region=us-east-1]
+ │ │ └── voter constraints: [+region=us-east-1]
+ │ └── lease preference: [+region=us-east-1]
+ ├── UNIQUE WITHOUT INDEX (pk)
+ └── UNIQUE WITHOUT INDEX (b)
+scan regional_by_row_table
+ └── check constraint expressions
+ └── crdb_region IN ('ap-southeast-2', 'ca-central-1', 'us-east-1')
+
query TTB colnames
SELECT index_name, column_name, implicit FROM crdb_internal.index_columns
WHERE descriptor_name = 'regional_by_row_table' AND column_type = 'key'
diff --git a/pkg/clusterversion/cockroach_versions.go b/pkg/clusterversion/cockroach_versions.go
index 0a769a31522d..acd7ccd8fd86 100644
--- a/pkg/clusterversion/cockroach_versions.go
+++ b/pkg/clusterversion/cockroach_versions.go
@@ -252,6 +252,9 @@ const (
// database, such as adding REGIONS to a DATABASE or setting the LOCALITY
// on a TABLE.
MultiRegionFeatures
+ // ClosedTimestampsRaftTransport enables the Raft transport for closed
+ // timestamps and disables the previous per-node transport.
+ ClosedTimestampsRaftTransport
// Step (1): Add new versions here.
)
@@ -426,6 +429,10 @@ var versionsSingleton = keyedVersions([]keyedVersion{
Key: MultiRegionFeatures,
Version: roachpb.Version{Major: 20, Minor: 2, Internal: 34},
},
+ {
+ Key: ClosedTimestampsRaftTransport,
+ Version: roachpb.Version{Major: 20, Minor: 2, Internal: 36},
+ },
// Step (2): Add new versions here.
})
diff --git a/pkg/clusterversion/key_string.go b/pkg/clusterversion/key_string.go
index 1ff13fc74478..ad864ce4c6ca 100644
--- a/pkg/clusterversion/key_string.go
+++ b/pkg/clusterversion/key_string.go
@@ -45,11 +45,12 @@ func _() {
_ = x[SequencesRegclass-34]
_ = x[ImplicitColumnPartitioning-35]
_ = x[MultiRegionFeatures-36]
+ _ = x[ClosedTimestampsRaftTransport-37]
}
-const _Key_name = "NamespaceTableWithSchemasStart20_2GeospatialTypeEnumsRangefeedLeasesAlterColumnTypeGeneralAlterSystemJobsAddCreatedByColumnsAddScheduledJobsTableUserDefinedSchemasNoOriginFKIndexesNodeMembershipStatusMinPasswordLengthAbortSpanBytesAlterSystemJobsAddSqllivenessColumnsAddNewSystemSqllivenessTableMaterializedViewsBox2DTypeUpdateScheduledJobsSchemaCreateLoginPrivilegeHBAForNonTLSV20_2Start21_1EmptyArraysInInvertedIndexesUniqueWithoutIndexConstraintsVirtualComputedColumnsCPutInlineReplicaVersionsreplacedTruncatedAndRangeAppliedStateMigrationreplacedPostTruncatedAndRangeAppliedStateMigrationNewSchemaChangerLongRunningMigrationsTruncatedAndRangeAppliedStateMigrationPostTruncatedAndRangeAppliedStateMigrationSeparatedIntentsTracingVerbosityIndependentSemanticsSequencesRegclassImplicitColumnPartitioningMultiRegionFeatures"
+const _Key_name = "NamespaceTableWithSchemasStart20_2GeospatialTypeEnumsRangefeedLeasesAlterColumnTypeGeneralAlterSystemJobsAddCreatedByColumnsAddScheduledJobsTableUserDefinedSchemasNoOriginFKIndexesNodeMembershipStatusMinPasswordLengthAbortSpanBytesAlterSystemJobsAddSqllivenessColumnsAddNewSystemSqllivenessTableMaterializedViewsBox2DTypeUpdateScheduledJobsSchemaCreateLoginPrivilegeHBAForNonTLSV20_2Start21_1EmptyArraysInInvertedIndexesUniqueWithoutIndexConstraintsVirtualComputedColumnsCPutInlineReplicaVersionsreplacedTruncatedAndRangeAppliedStateMigrationreplacedPostTruncatedAndRangeAppliedStateMigrationNewSchemaChangerLongRunningMigrationsTruncatedAndRangeAppliedStateMigrationPostTruncatedAndRangeAppliedStateMigrationSeparatedIntentsTracingVerbosityIndependentSemanticsSequencesRegclassImplicitColumnPartitioningMultiRegionFeaturesClosedTimestampsRaftTransport"
-var _Key_index = [...]uint16{0, 25, 34, 48, 53, 68, 90, 124, 145, 163, 180, 200, 217, 231, 295, 312, 321, 346, 366, 378, 383, 392, 420, 449, 471, 481, 496, 542, 592, 608, 629, 667, 709, 725, 761, 778, 804, 823}
+var _Key_index = [...]uint16{0, 25, 34, 48, 53, 68, 90, 124, 145, 163, 180, 200, 217, 231, 295, 312, 321, 346, 366, 378, 383, 392, 420, 449, 471, 481, 496, 542, 592, 608, 629, 667, 709, 725, 761, 778, 804, 823, 852}
func (i Key) String() string {
if i < 0 || i >= Key(len(_Key_index)-1) {
diff --git a/pkg/config/zonepb/zone.go b/pkg/config/zonepb/zone.go
index 98c45fae0ed6..4d8e60533166 100644
--- a/pkg/config/zonepb/zone.go
+++ b/pkg/config/zonepb/zone.go
@@ -784,6 +784,16 @@ func (z *ZoneConfig) ReplicaConstraints(i int) cat.ReplicaConstraints {
return &z.Constraints[i]
}
+// VoterConstraintsCount is part of the cat.Zone interface.
+func (z *ZoneConfig) VoterConstraintsCount() int {
+ return len(z.VoterConstraints)
+}
+
+// VoterConstraint is part of the cat.Zone interface.
+func (z *ZoneConfig) VoterConstraint(i int) cat.ReplicaConstraints {
+ return &z.VoterConstraints[i]
+}
+
// LeasePreferenceCount is part of the cat.Zone interface.
func (z *ZoneConfig) LeasePreferenceCount() int {
return len(z.LeasePreferences)
diff --git a/pkg/geo/BUILD.bazel b/pkg/geo/BUILD.bazel
index 8e55194ac302..dad724e36f22 100644
--- a/pkg/geo/BUILD.bazel
+++ b/pkg/geo/BUILD.bazel
@@ -20,7 +20,7 @@ go_library(
"//pkg/geo/geographiclib",
"//pkg/geo/geopb",
"//pkg/geo/geoprojbase",
- "//pkg/geo/geos",
+ "//pkg/geo/wkt",
"//pkg/util",
"//pkg/util/errorutil/unimplemented",
"//pkg/util/protoutil",
diff --git a/pkg/geo/geogfn/covers_test.go b/pkg/geo/geogfn/covers_test.go
index 220b20804535..f7d90e06bb4b 100644
--- a/pkg/geo/geogfn/covers_test.go
+++ b/pkg/geo/geogfn/covers_test.go
@@ -351,7 +351,7 @@ func TestCovers(t *testing.T) {
{
"multiple MULTIPOLYGONs required to cover MULTIPOINTS",
"MULTIPOLYGON(((0.0 0.0, 1.0 0.0, 1.0 1.0, 0.0 1.0, 0.0 0.0)), ((1.0 0.0, 2.0 0.0, 2.0 1.0, 1.0 1.0, 1.0 0.0)))",
- "MULTIPOINT((0.5 0.5), (1.5 0.5))'",
+ "MULTIPOINT((0.5 0.5), (1.5 0.5))",
true,
},
{
diff --git a/pkg/geo/geomfn/remove_repeated_points_test.go b/pkg/geo/geomfn/remove_repeated_points_test.go
index e5e970d5adf6..ef3a5fe5643b 100644
--- a/pkg/geo/geomfn/remove_repeated_points_test.go
+++ b/pkg/geo/geomfn/remove_repeated_points_test.go
@@ -44,7 +44,7 @@ func TestRemoveRepeatedPoints(t *testing.T) {
"MULTILINESTRING ((1 2, 3 4, 1 2), EMPTY, (1 2, 3 4))",
},
{
- "MULTILINESTRING ((1 2, 1 2, 3 4), (1 2, 3 4, 3 4), (1 2, 1 2, 1 2, 1 2)))",
+ "MULTILINESTRING ((1 2, 1 2, 3 4), (1 2, 3 4, 3 4), (1 2, 1 2, 1 2, 1 2))",
"MULTILINESTRING ((1 2, 3 4), (1 2, 3 4), (1 2, 1 2))",
},
{"POLYGON EMPTY", "POLYGON EMPTY"},
diff --git a/pkg/geo/geos/geos.go b/pkg/geo/geos/geos.go
index fd433e4665c8..aa55190d969c 100644
--- a/pkg/geo/geos/geos.go
+++ b/pkg/geo/geos/geos.go
@@ -266,19 +266,6 @@ func statusToError(s C.CR_GEOS_Status) error {
return &Error{msg: string(cStringToSafeGoBytes(s))}
}
-// WKTToEWKB parses a WKT into WKB using the GEOS library.
-func WKTToEWKB(wkt geopb.WKT, srid geopb.SRID) (geopb.EWKB, error) {
- g, err := ensureInitInternal()
- if err != nil {
- return nil, err
- }
- var cEWKB C.CR_GEOS_String
- if err := statusToError(C.CR_GEOS_WKTToEWKB(g, goToCSlice([]byte(wkt)), C.int(srid), &cEWKB)); err != nil {
- return nil, err
- }
- return cStringToSafeGoBytes(cEWKB), nil
-}
-
// BufferParamsJoinStyle maps to the GEOSBufJoinStyles enum in geos_c.h.in.
type BufferParamsJoinStyle int
diff --git a/pkg/geo/parse.go b/pkg/geo/parse.go
index 7493ad1aadba..6b0677357c4c 100644
--- a/pkg/geo/parse.go
+++ b/pkg/geo/parse.go
@@ -16,7 +16,7 @@ import (
"strings"
"github.com/cockroachdb/cockroach/pkg/geo/geopb"
- "github.com/cockroachdb/cockroach/pkg/geo/geos"
+ "github.com/cockroachdb/cockroach/pkg/geo/wkt"
"github.com/cockroachdb/cockroach/pkg/util"
"github.com/cockroachdb/errors"
"github.com/pierrre/geohash"
@@ -168,9 +168,14 @@ func parseEWKT(
}
}
- ewkb, err := geos.WKTToEWKB(geopb.WKT(str), srid)
- if err != nil {
- return geopb.SpatialObject{}, err
+ geom, wktUnmarshalErr := wkt.Unmarshal(string(str))
+ if wktUnmarshalErr != nil {
+ return geopb.SpatialObject{}, wktUnmarshalErr
+ }
+ AdjustGeomTSRID(geom, srid)
+ ewkb, ewkbMarshalErr := ewkb.Marshal(geom, DefaultEWKBEncodingFormat)
+ if ewkbMarshalErr != nil {
+ return geopb.SpatialObject{}, ewkbMarshalErr
}
return parseEWKBRaw(soType, ewkb)
}
diff --git a/pkg/geo/parse_test.go b/pkg/geo/parse_test.go
index fb840a947ab8..8ce0c8b74e61 100644
--- a/pkg/geo/parse_test.go
+++ b/pkg/geo/parse_test.go
@@ -246,9 +246,8 @@ func TestParseEWKT(t *testing.T) {
expectedErr string
}{
{"POINT Z (1 2 3)", "unimplemented: dimension XYZ is not currently supported"},
- // GEOS assumes all M coordinates as Z coordinates, so the error message is not great here.
- {"POINT M (1 2 3)", "unimplemented: dimension XYZ is not currently supported"},
- {"POINT ZM (1 2 3 4)", "unimplemented: dimension XYZ is not currently supported"},
+ {"POINT M (1 2 3)", "unimplemented: dimension XYM is not currently supported"},
+ {"POINT ZM (1 2 3 4)", "unimplemented: dimension XYZM is not currently supported"},
}
for _, tc := range errorTestCases {
t.Run(string(tc.wkt), func(t *testing.T) {
@@ -372,7 +371,9 @@ func TestParseGeometry(t *testing.T) {
{
"invalid",
Geometry{},
- "geos error: ParseException: Unknown type: 'INVALID'",
+ `lex error: invalid keyword at pos 0
+invalid
+^`,
},
{
"",
@@ -586,7 +587,9 @@ func TestParseGeography(t *testing.T) {
{
"invalid",
Geography{},
- "geos error: ParseException: Unknown type: 'INVALID'",
+ `lex error: invalid keyword at pos 0
+invalid
+^`,
},
{
"",
diff --git a/pkg/geo/wkt/lex.go b/pkg/geo/wkt/lex.go
index 30448e36c52a..b5563f304003 100644
--- a/pkg/geo/wkt/lex.go
+++ b/pkg/geo/wkt/lex.go
@@ -24,6 +24,7 @@ const eof = 0
// LexError is an error that occurs during lexing.
type LexError struct {
+ // TODO(ayang): refactor these two errors into one error type
expectedTokType string
pos int
str string
@@ -216,7 +217,7 @@ func (l *wktLex) Lex(yylval *wktSymType) int {
default:
if unicode.IsLetter(c) {
return l.keyword()
- } else if isNumRune(c) {
+ } else if isValidFirstNumRune(c) {
return l.num(yylval)
} else {
l.next()
@@ -511,10 +512,25 @@ func (l *wktLex) setError(err error) {
}
}
+// isValidFirstNumRune returns whether a rune is valid as the first rune in a number (coordinate).
+func isValidFirstNumRune(r rune) bool {
+ switch r {
+ // PostGIS doesn't seem to accept numbers with a leading '+'.
+ case '+':
+ return false
+ // Scientific notation number must have a number before the e.
+ // Checking this case explicitly helps disambiguate between a number and a keyword.
+ case 'e', 'E':
+ return false
+ default:
+ return isNumRune(r)
+ }
+}
+
// isNumRune returns whether a rune could potentially be a part of a number (coordinate).
func isNumRune(r rune) bool {
switch r {
- case '-', '.':
+ case '-', '.', 'e', 'E', '+':
return true
default:
return unicode.IsDigit(r)
diff --git a/pkg/geo/wkt/wkt_test.go b/pkg/geo/wkt/wkt_test.go
index d686210b9805..d40fd50c2064 100644
--- a/pkg/geo/wkt/wkt_test.go
+++ b/pkg/geo/wkt/wkt_test.go
@@ -29,6 +29,11 @@ func TestUnmarshal(t *testing.T) {
equivInputs: []string{"POINT(0 1)", "POINT (0 1)", "point(0 1)", "point ( 0 1 )"},
expected: geom.NewPointFlat(geom.XY, []float64{0, 1}),
},
+ {
+ desc: "parse 2D point with scientific notation",
+ equivInputs: []string{"POINT(1e-2 2e3)", "POINT(0.1e-1 2e3)", "POINT(0.01e-0 2e+3)", "POINT(0.01 2000)"},
+ expected: geom.NewPointFlat(geom.XY, []float64{1e-2, 2e3}),
+ },
{
desc: "parse 2D+M point",
equivInputs: []string{"POINT M (-2 0 0.5)", "POINTM(-2 0 0.5)", "POINTM(-2 0 .5)"},
@@ -620,6 +625,27 @@ DOT(0 0)
expectedErrStr: `lex error: invalid number at pos 8
POINT(2 2.3.7)
^`,
+ },
+ {
+ desc: "invalid scientific notation number missing number before the e",
+ input: "POINT(e-1 2)",
+ expectedErrStr: `lex error: invalid keyword at pos 6
+POINT(e-1 2)
+ ^`,
+ },
+ {
+ desc: "invalid scientific notation number with non-integer power",
+ input: "POINT(5e-1.5 2)",
+ expectedErrStr: `lex error: invalid number at pos 6
+POINT(5e-1.5 2)
+ ^`,
+ },
+ {
+ desc: "invalid number with a + at the start (PostGIS does not allow this)",
+ input: "POINT(+1 2)",
+ expectedErrStr: `lex error: invalid character at pos 6
+POINT(+1 2)
+ ^`,
},
{
desc: "invalid keyword when extraneous spaces are present in ZM",
diff --git a/pkg/kv/kvserver/BUILD.bazel b/pkg/kv/kvserver/BUILD.bazel
index 402d71680912..ca306e3d1fc1 100644
--- a/pkg/kv/kvserver/BUILD.bazel
+++ b/pkg/kv/kvserver/BUILD.bazel
@@ -117,6 +117,7 @@ go_library(
"//pkg/kv/kvserver/closedts/container",
"//pkg/kv/kvserver/closedts/ctpb",
"//pkg/kv/kvserver/closedts/storage",
+ "//pkg/kv/kvserver/closedts/tracker",
"//pkg/kv/kvserver/concurrency",
"//pkg/kv/kvserver/constraint",
"//pkg/kv/kvserver/gc",
@@ -299,6 +300,7 @@ go_test(
"//pkg/kv/kvserver/batcheval/result",
"//pkg/kv/kvserver/closedts",
"//pkg/kv/kvserver/closedts/ctpb",
+ "//pkg/kv/kvserver/closedts/tracker",
"//pkg/kv/kvserver/concurrency",
"//pkg/kv/kvserver/concurrency/lock",
"//pkg/kv/kvserver/constraint",
diff --git a/pkg/kv/kvserver/batcheval/cmd_subsume.go b/pkg/kv/kvserver/batcheval/cmd_subsume.go
index 77797e62b7c4..fad63a0f2b55 100644
--- a/pkg/kv/kvserver/batcheval/cmd_subsume.go
+++ b/pkg/kv/kvserver/batcheval/cmd_subsume.go
@@ -20,6 +20,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/spanset"
"github.com/cockroachdb/cockroach/pkg/roachpb"
"github.com/cockroachdb/cockroach/pkg/storage"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/errors"
)
@@ -90,16 +91,18 @@ func Subsume(
}
// Sanity check the caller has initiated a merge transaction by checking for
- // a deletion intent on the local range descriptor.
+ // a deletion intent on the local range descriptor. Read inconsistently at
+ // the maximum timestamp to ensure that we see an intent if one exists,
+ // regardless of what timestamp it is written at.
descKey := keys.RangeDescriptorKey(desc.StartKey)
- _, intent, err := storage.MVCCGet(ctx, readWriter, descKey, cArgs.Header.Timestamp,
+ _, intent, err := storage.MVCCGet(ctx, readWriter, descKey, hlc.MaxTimestamp,
storage.MVCCGetOptions{Inconsistent: true})
if err != nil {
return result.Result{}, errors.Errorf("fetching local range descriptor: %s", err)
} else if intent == nil {
return result.Result{}, errors.AssertionFailedf("range missing intent on its local descriptor")
}
- val, _, err := storage.MVCCGetAsTxn(ctx, readWriter, descKey, cArgs.Header.Timestamp, intent.Txn)
+ val, _, err := storage.MVCCGetAsTxn(ctx, readWriter, descKey, intent.Txn.WriteTimestamp, intent.Txn)
if err != nil {
return result.Result{}, errors.Errorf("fetching local range descriptor as txn: %s", err)
} else if val != nil {
@@ -151,6 +154,15 @@ func Subsume(
reply.MVCCStats = cArgs.EvalCtx.GetMVCCStats()
reply.LeaseAppliedIndex = lai
reply.FreezeStart = cArgs.EvalCtx.Clock().NowAsClockTimestamp()
+ // FrozenClosedTimestamp might return an empty timestamp if the Raft-based
+ // closed timestamp transport hasn't been enabled yet. That's OK because, if
+ // the new transport is not enabled, then ranges with leading closed
+ // timestamps can't exist yet, and so the closed timestamp must be below the
+ // FreezeStart. The FreezeStart is used by Store.MergeRange to bump the RHS'
+ // ts cache if LHS/RHS leases are not collocated. The case when the leases are
+ // collocated also works out because then the closed timestamp (according to
+ // the old mechanism) is the same for both ranges being merged.
+ reply.ClosedTimestamp = cArgs.EvalCtx.FrozenClosedTimestamp(ctx)
return result.Result{
Local: result.LocalResult{FreezeStart: reply.FreezeStart.ToTimestamp()},
diff --git a/pkg/kv/kvserver/batcheval/eval_context.go b/pkg/kv/kvserver/batcheval/eval_context.go
index fa59268280a6..7851f091b101 100644
--- a/pkg/kv/kvserver/batcheval/eval_context.go
+++ b/pkg/kv/kvserver/batcheval/eval_context.go
@@ -68,6 +68,7 @@ type EvalContext interface {
GetTerm(uint64) (uint64, error)
GetLeaseAppliedIndex() uint64
GetTracker() closedts.TrackerI
+ FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp
Desc() *roachpb.RangeDescriptor
ContainsKey(key roachpb.Key) bool
@@ -184,6 +185,9 @@ func (m *mockEvalCtxImpl) GetLeaseAppliedIndex() uint64 {
func (m *mockEvalCtxImpl) GetTracker() closedts.TrackerI {
panic("unimplemented")
}
+func (m *mockEvalCtxImpl) FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp {
+ panic("unimplemented")
+}
func (m *mockEvalCtxImpl) Desc() *roachpb.RangeDescriptor {
return m.MockEvalCtx.Desc
}
diff --git a/pkg/kv/kvserver/below_raft_protos_test.go b/pkg/kv/kvserver/below_raft_protos_test.go
index a3e04b28ea0e..00652ba4853e 100644
--- a/pkg/kv/kvserver/below_raft_protos_test.go
+++ b/pkg/kv/kvserver/below_raft_protos_test.go
@@ -77,13 +77,8 @@ var belowRaftGoldenProtos = map[reflect.Type]fixture{
populatedConstructor: func(r *rand.Rand) protoutil.Message {
return enginepb.NewPopulatedRangeAppliedState(r, false)
},
- // The populatedSum has changed from 10390885694280604642 to
- // 7958815789228166749, as of 21.1, due to the addition of the
- // SeparatedIntentCount field in MVCCStats. This field will not actually
- // be populated until all nodes are on 21.1, so there isn't a risk of
- // divergence.
emptySum: 615555020845646359,
- populatedSum: 7958815789228166749,
+ populatedSum: 3253881774919630461,
},
reflect.TypeOf(&raftpb.HardState{}): {
populatedConstructor: func(r *rand.Rand) protoutil.Message {
diff --git a/pkg/kv/kvserver/client_replica_test.go b/pkg/kv/kvserver/client_replica_test.go
index 50836e8ec237..d453d9fbee53 100644
--- a/pkg/kv/kvserver/client_replica_test.go
+++ b/pkg/kv/kvserver/client_replica_test.go
@@ -3332,7 +3332,7 @@ func TestProposalOverhead(t *testing.T) {
// overhead is that users ranges do not have rangefeeds on by default whereas
// system ranges do.
const (
- expectedUserOverhead uint32 = 42
+ expectedUserOverhead uint32 = 45
)
t.Run("user-key overhead", func(t *testing.T) {
userKey := tc.ScratchRange(t)
diff --git a/pkg/kv/kvserver/client_split_test.go b/pkg/kv/kvserver/client_split_test.go
index dca3120999b8..3cff9b9eef7a 100644
--- a/pkg/kv/kvserver/client_split_test.go
+++ b/pkg/kv/kvserver/client_split_test.go
@@ -3545,3 +3545,60 @@ func TestSplitBlocksReadsToRHS(t *testing.T) {
}
require.Nil(t, g.Wait())
}
+
+// TestStoreRangeSplitAndMergeWithGlobalReads tests that a range configured to
+// serve global reads can be split and merged. In essence, this tests whether
+// the split and merge transactions can handle having their timestamp bumped by
+// the closed timestamp on the ranges they're operating on.
+func TestStoreRangeSplitAndMergeWithGlobalReads(t *testing.T) {
+ defer leaktest.AfterTest(t)()
+ defer log.Scope(t).Close(t)
+
+ ctx := context.Background()
+ serv, _, _ := serverutils.StartServer(t, base.TestServerArgs{
+ Knobs: base.TestingKnobs{
+ Store: &kvserver.StoreTestingKnobs{
+ DisableMergeQueue: true,
+ },
+ },
+ })
+ s := serv.(*server.TestServer)
+ defer s.Stopper().Stop(ctx)
+ store, err := s.Stores().GetStore(s.GetFirstStoreID())
+ require.NoError(t, err)
+ config.TestingSetupZoneConfigHook(s.Stopper())
+
+ // Set global reads.
+ descID := uint32(keys.MinUserDescID)
+ descKey := keys.SystemSQLCodec.TablePrefix(descID)
+ zoneConfig := zonepb.DefaultZoneConfig()
+ zoneConfig.GlobalReads = proto.Bool(true)
+ config.TestingSetZoneConfig(config.SystemTenantObjectID(descID), zoneConfig)
+
+ // Trigger gossip callback and wait for propagation
+ require.NoError(t, store.Gossip().AddInfoProto(gossip.KeySystemConfig, &config.SystemConfigEntries{}, 0))
+ testutils.SucceedsSoon(t, func() error {
+ repl := store.LookupReplica(roachpb.RKey(descKey))
+ if repl.ClosedTimestampPolicy() != roachpb.LEAD_FOR_GLOBAL_READS {
+ return errors.Errorf("expected LEAD_FOR_GLOBAL_READS policy")
+ }
+ return nil
+ })
+
+ // Split the range. Should succeed.
+ splitKey := append(descKey, []byte("split")...)
+ splitArgs := adminSplitArgs(splitKey)
+ _, pErr := kv.SendWrapped(ctx, store.TestSender(), splitArgs)
+ require.Nil(t, pErr)
+
+ repl := store.LookupReplica(roachpb.RKey(splitKey))
+ require.Equal(t, splitKey, repl.Desc().StartKey.AsRawKey())
+
+ // Merge the range. Should succeed.
+ mergeArgs := adminMergeArgs(descKey)
+ _, pErr = kv.SendWrapped(ctx, store.TestSender(), mergeArgs)
+ require.Nil(t, pErr)
+
+ repl = store.LookupReplica(roachpb.RKey(splitKey))
+ require.Equal(t, descKey, repl.Desc().StartKey.AsRawKey())
+}
diff --git a/pkg/kv/kvserver/closedts/tracker/heap_tracker.go b/pkg/kv/kvserver/closedts/tracker/heap_tracker.go
index 620bd05462a6..a78a90caea83 100644
--- a/pkg/kv/kvserver/closedts/tracker/heap_tracker.go
+++ b/pkg/kv/kvserver/closedts/tracker/heap_tracker.go
@@ -124,3 +124,10 @@ func (h *heapTracker) LowerBound(ctx context.Context) hlc.Timestamp {
}
return h.mu.rs[0].ts
}
+
+// Count is part of the Tracker interface.
+func (h *heapTracker) Count() int {
+ h.mu.Lock()
+ defer h.mu.Unlock()
+ return h.mu.rs.Len()
+}
diff --git a/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go b/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go
index b9cd8bced181..86cdb0ff9c57 100644
--- a/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go
+++ b/pkg/kv/kvserver/closedts/tracker/lockfree_tracker.go
@@ -16,6 +16,7 @@ import (
"sync/atomic"
"github.com/cockroachdb/cockroach/pkg/util/hlc"
+ "github.com/cockroachdb/cockroach/pkg/util/log"
"github.com/cockroachdb/cockroach/pkg/util/timeutil"
)
@@ -169,6 +170,9 @@ func (t *lockfreeTracker) Untrack(ctx context.Context, tok RemovalToken) {
b := tok.(lockfreeToken).b
// Note that atomic ops are not required here, as we hold the exclusive lock.
b.refcnt--
+ if b.refcnt < 0 {
+ log.Fatalf(ctx, "negative bucket refcount: %d", b.refcnt)
+ }
if b.refcnt == 0 {
// Reset the bucket, so that future Track() calls can create a new one.
b.ts = 0
@@ -198,6 +202,11 @@ func (t *lockfreeTracker) LowerBound(ctx context.Context) hlc.Timestamp {
}
}
+// Count is part of the Tracker interface.
+func (t *lockfreeTracker) Count() int {
+ return int(t.b1.refcnt) + int(t.b2.refcnt)
+}
+
// bucket represent a Tracker bucket: a data structure that coalesces a number
// of timestamps, keeping track only of their count and minimum.
//
diff --git a/pkg/kv/kvserver/closedts/tracker/tracker.go b/pkg/kv/kvserver/closedts/tracker/tracker.go
index 4fc41d429bff..e00f1b41af7f 100644
--- a/pkg/kv/kvserver/closedts/tracker/tracker.go
+++ b/pkg/kv/kvserver/closedts/tracker/tracker.go
@@ -85,6 +85,11 @@ type Tracker interface {
// make is that, if no synthethic timestamp is inserted into the tracked set
// for a while, eventually the LowerBound value will not be synthetic.
LowerBound(context.Context) hlc.Timestamp
+
+ // Count returns the current size of the tracked set.
+ //
+ // Count cannot be called concurrently with other methods.
+ Count() int
}
// RemovalToken represents the result of Track: a token to be later used with
diff --git a/pkg/kv/kvserver/helpers_test.go b/pkg/kv/kvserver/helpers_test.go
index 4a2e6053a20e..deb964182d95 100644
--- a/pkg/kv/kvserver/helpers_test.go
+++ b/pkg/kv/kvserver/helpers_test.go
@@ -514,6 +514,14 @@ func (r *Replica) ReadProtectedTimestamps(ctx context.Context) {
ts = r.readProtectedTimestampsRLocked(ctx, nil /* f */)
}
+// ClosedTimestampPolicy returns the closed timestamp policy of the range, which
+// is updated asynchronously through gossip of zone configurations.
+func (r *Replica) ClosedTimestampPolicy() roachpb.RangeClosedTimestampPolicy {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+ return r.closedTimestampPolicyRLocked()
+}
+
// GetCircuitBreaker returns the circuit breaker controlling
// connection attempts to the specified node.
func (t *RaftTransport) GetCircuitBreaker(
diff --git a/pkg/kv/kvserver/kvserverpb/proposer_kv.go b/pkg/kv/kvserver/kvserverpb/proposer_kv.go
index 04a4000420e2..14fc1ca2d064 100644
--- a/pkg/kv/kvserver/kvserverpb/proposer_kv.go
+++ b/pkg/kv/kvserver/kvserverpb/proposer_kv.go
@@ -10,18 +10,36 @@
package kvserverpb
-import "math"
+import (
+ "math"
+
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
+)
var maxRaftCommandFooterSize = (&RaftCommandFooter{
MaxLeaseIndex: math.MaxUint64,
}).Size()
+var maxClosedTimestampFooterSize = (&ClosedTimestampFooter{
+ ClosedTimestamp: hlc.Timestamp{
+ WallTime: math.MaxInt64,
+ Logical: math.MaxInt32,
+ Synthetic: true,
+ },
+}).Size()
+
// MaxRaftCommandFooterSize returns the maximum possible size of an
// encoded RaftCommandFooter proto.
func MaxRaftCommandFooterSize() int {
return maxRaftCommandFooterSize
}
+// MaxClosedTimestampFooterSize returns the maximmum possible size of an encoded
+// ClosedTimestampFooter.
+func MaxClosedTimestampFooterSize() int {
+ return maxClosedTimestampFooterSize
+}
+
// IsZero returns whether all fields are set to their zero value.
func (r ReplicatedEvalResult) IsZero() bool {
return r == ReplicatedEvalResult{}
diff --git a/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go b/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go
index 8b43941018d9..ae64003650e3 100644
--- a/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go
+++ b/pkg/kv/kvserver/kvserverpb/proposer_kv.pb.go
@@ -48,7 +48,7 @@ func (m *Split) Reset() { *m = Split{} }
func (m *Split) String() string { return proto.CompactTextString(m) }
func (*Split) ProtoMessage() {}
func (*Split) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{0}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{0}
}
func (m *Split) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -83,7 +83,7 @@ func (m *Merge) Reset() { *m = Merge{} }
func (m *Merge) String() string { return proto.CompactTextString(m) }
func (*Merge) ProtoMessage() {}
func (*Merge) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{1}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{1}
}
func (m *Merge) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -117,7 +117,7 @@ type ChangeReplicas struct {
func (m *ChangeReplicas) Reset() { *m = ChangeReplicas{} }
func (*ChangeReplicas) ProtoMessage() {}
func (*ChangeReplicas) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{2}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{2}
}
func (m *ChangeReplicas) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -169,7 +169,7 @@ func (m *ComputeChecksum) Reset() { *m = ComputeChecksum{} }
func (m *ComputeChecksum) String() string { return proto.CompactTextString(m) }
func (*ComputeChecksum) ProtoMessage() {}
func (*ComputeChecksum) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{3}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{3}
}
func (m *ComputeChecksum) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -206,7 +206,7 @@ func (m *Compaction) Reset() { *m = Compaction{} }
func (m *Compaction) String() string { return proto.CompactTextString(m) }
func (*Compaction) ProtoMessage() {}
func (*Compaction) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{4}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{4}
}
func (m *Compaction) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -243,7 +243,7 @@ func (m *SuggestedCompaction) Reset() { *m = SuggestedCompaction{} }
func (m *SuggestedCompaction) String() string { return proto.CompactTextString(m) }
func (*SuggestedCompaction) ProtoMessage() {}
func (*SuggestedCompaction) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{5}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{5}
}
func (m *SuggestedCompaction) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -305,7 +305,7 @@ func (m *ReplicatedEvalResult) Reset() { *m = ReplicatedEvalResult{} }
func (m *ReplicatedEvalResult) String() string { return proto.CompactTextString(m) }
func (*ReplicatedEvalResult) ProtoMessage() {}
func (*ReplicatedEvalResult) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{6}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{6}
}
func (m *ReplicatedEvalResult) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -349,7 +349,7 @@ func (m *ReplicatedEvalResult_AddSSTable) Reset() { *m = ReplicatedEvalR
func (m *ReplicatedEvalResult_AddSSTable) String() string { return proto.CompactTextString(m) }
func (*ReplicatedEvalResult_AddSSTable) ProtoMessage() {}
func (*ReplicatedEvalResult_AddSSTable) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{6, 0}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{6, 0}
}
func (m *ReplicatedEvalResult_AddSSTable) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -386,7 +386,7 @@ func (m *WriteBatch) Reset() { *m = WriteBatch{} }
func (m *WriteBatch) String() string { return proto.CompactTextString(m) }
func (*WriteBatch) ProtoMessage() {}
func (*WriteBatch) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{7}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{7}
}
func (m *WriteBatch) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -423,7 +423,7 @@ func (m *LogicalOpLog) Reset() { *m = LogicalOpLog{} }
func (m *LogicalOpLog) String() string { return proto.CompactTextString(m) }
func (*LogicalOpLog) ProtoMessage() {}
func (*LogicalOpLog) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{8}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{8}
}
func (m *LogicalOpLog) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -505,7 +505,22 @@ type RaftCommand struct {
// been added after it, and on removal, the assignment counters must be
// updated accordingly. Managing retry of proposals becomes trickier as
// well as that uproots whatever ordering was originally envisioned.
+ //
+ // This field is set through RaftCommandFooter hackery.
MaxLeaseIndex uint64 `protobuf:"varint,4,opt,name=max_lease_index,json=maxLeaseIndex,proto3" json:"max_lease_index,omitempty"`
+ // The closed timestamp carried by this command. Once a follower is told to
+ // apply this command, it knows that there will be no further writes at
+ // timestamps <= closed_timestamp. Note that the command itself might
+ // represent a write at a lower timestamp, so the closed timestamp can only be
+ // used after this command is applied.
+ //
+ // The field can be zero, which is to be interpreted as no closed timestamp
+ // update. Some commands (lease requests) implicitly carry a closed timestamp
+ // in a command-specific way. If the value is not zero, the value is greater
+ // or equal to that of the previous commands (and all before it).
+ //
+ // This field is set through ClosedTimestampFooter hackery.
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,17,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
// replicated_eval_result is a set of structured information that instructs
// replicated state changes to the part of a Range's replicated state machine
// that exists outside of RocksDB.
@@ -529,7 +544,7 @@ func (m *RaftCommand) Reset() { *m = RaftCommand{} }
func (m *RaftCommand) String() string { return proto.CompactTextString(m) }
func (*RaftCommand) ProtoMessage() {}
func (*RaftCommand) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{9}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{9}
}
func (m *RaftCommand) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -568,7 +583,7 @@ func (m *RaftCommandFooter) Reset() { *m = RaftCommandFooter{} }
func (m *RaftCommandFooter) String() string { return proto.CompactTextString(m) }
func (*RaftCommandFooter) ProtoMessage() {}
func (*RaftCommandFooter) Descriptor() ([]byte, []int) {
- return fileDescriptor_proposer_kv_0c8837b323bf7b92, []int{10}
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{10}
}
func (m *RaftCommandFooter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -593,6 +608,42 @@ func (m *RaftCommandFooter) XXX_DiscardUnknown() {
var xxx_messageInfo_RaftCommandFooter proto.InternalMessageInfo
+// ClosedTimestampFooter is similar to RaftCommandFooter, allowing the proposal
+// buffer to fill in the closed_timestamp field after most of the proto has been
+// marshaled already.
+type ClosedTimestampFooter struct {
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,17,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
+}
+
+func (m *ClosedTimestampFooter) Reset() { *m = ClosedTimestampFooter{} }
+func (m *ClosedTimestampFooter) String() string { return proto.CompactTextString(m) }
+func (*ClosedTimestampFooter) ProtoMessage() {}
+func (*ClosedTimestampFooter) Descriptor() ([]byte, []int) {
+ return fileDescriptor_proposer_kv_0b3536bd0bf3d98c, []int{11}
+}
+func (m *ClosedTimestampFooter) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *ClosedTimestampFooter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ b = b[:cap(b)]
+ n, err := m.MarshalTo(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+}
+func (dst *ClosedTimestampFooter) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ClosedTimestampFooter.Merge(dst, src)
+}
+func (m *ClosedTimestampFooter) XXX_Size() int {
+ return m.Size()
+}
+func (m *ClosedTimestampFooter) XXX_DiscardUnknown() {
+ xxx_messageInfo_ClosedTimestampFooter.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ClosedTimestampFooter proto.InternalMessageInfo
+
func init() {
proto.RegisterType((*Split)(nil), "cockroach.kv.kvserver.storagepb.Split")
proto.RegisterType((*Merge)(nil), "cockroach.kv.kvserver.storagepb.Merge")
@@ -607,6 +658,7 @@ func init() {
proto.RegisterType((*RaftCommand)(nil), "cockroach.kv.kvserver.storagepb.RaftCommand")
proto.RegisterMapType((map[string]string)(nil), "cockroach.kv.kvserver.storagepb.RaftCommand.TraceDataEntry")
proto.RegisterType((*RaftCommandFooter)(nil), "cockroach.kv.kvserver.storagepb.RaftCommandFooter")
+ proto.RegisterType((*ClosedTimestampFooter)(nil), "cockroach.kv.kvserver.storagepb.ClosedTimestampFooter")
}
func (this *Split) Equal(that interface{}) bool {
if that == nil {
@@ -1314,6 +1366,16 @@ func (m *RaftCommand) MarshalTo(dAtA []byte) (int, error) {
i += copy(dAtA[i:], v)
}
}
+ dAtA[i] = 0x8a
+ i++
+ dAtA[i] = 0x1
+ i++
+ i = encodeVarintProposerKv(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n21, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n21
return i, nil
}
@@ -1340,6 +1402,34 @@ func (m *RaftCommandFooter) MarshalTo(dAtA []byte) (int, error) {
return i, nil
}
+func (m *ClosedTimestampFooter) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalTo(dAtA)
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *ClosedTimestampFooter) MarshalTo(dAtA []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ dAtA[i] = 0x8a
+ i++
+ dAtA[i] = 0x1
+ i++
+ i = encodeVarintProposerKv(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n22, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n22
+ return i, nil
+}
+
func encodeVarintProposerKv(dAtA []byte, offset int, v uint64) int {
for v >= 1<<7 {
dAtA[offset] = uint8(v&0x7f | 0x80)
@@ -1576,6 +1666,8 @@ func (m *RaftCommand) Size() (n int) {
n += mapEntrySize + 2 + sovProposerKv(uint64(mapEntrySize))
}
}
+ l = m.ClosedTimestamp.Size()
+ n += 2 + l + sovProposerKv(uint64(l))
return n
}
@@ -1591,6 +1683,17 @@ func (m *RaftCommandFooter) Size() (n int) {
return n
}
+func (m *ClosedTimestampFooter) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = m.ClosedTimestamp.Size()
+ n += 2 + l + sovProposerKv(uint64(l))
+ return n
+}
+
func sovProposerKv(x uint64) (n int) {
for {
n++
@@ -3282,6 +3385,36 @@ func (m *RaftCommand) Unmarshal(dAtA []byte) error {
}
m.TraceData[mapkey] = mapvalue
iNdEx = postIndex
+ case 17:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowProposerKv
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthProposerKv
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipProposerKv(dAtA[iNdEx:])
@@ -3372,6 +3505,86 @@ func (m *RaftCommandFooter) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *ClosedTimestampFooter) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowProposerKv
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: ClosedTimestampFooter: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: ClosedTimestampFooter: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 17:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowProposerKv
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthProposerKv
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipProposerKv(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthProposerKv
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func skipProposerKv(dAtA []byte) (n int, err error) {
l := len(dAtA)
iNdEx := 0
@@ -3478,98 +3691,100 @@ var (
)
func init() {
- proto.RegisterFile("kv/kvserver/kvserverpb/proposer_kv.proto", fileDescriptor_proposer_kv_0c8837b323bf7b92)
-}
-
-var fileDescriptor_proposer_kv_0c8837b323bf7b92 = []byte{
- // 1424 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0x4f, 0x6f, 0xdb, 0x46,
- 0x16, 0xb7, 0x2c, 0xc9, 0xa6, 0x9e, 0x6c, 0x89, 0x9e, 0x38, 0x09, 0xd7, 0xbb, 0x2b, 0x19, 0xda,
- 0x6c, 0xe0, 0xdd, 0xcd, 0x52, 0x81, 0xbd, 0x0b, 0x14, 0x49, 0x50, 0xc4, 0x92, 0x93, 0xc6, 0x8a,
- 0xed, 0x26, 0x23, 0x27, 0x2d, 0xd2, 0x03, 0x31, 0x22, 0x27, 0x14, 0x2b, 0x8a, 0x64, 0x86, 0x23,
- 0x25, 0xfe, 0x14, 0x6d, 0x81, 0x1e, 0x7a, 0x6a, 0x73, 0xec, 0xd7, 0xe8, 0x2d, 0x97, 0x02, 0x39,
- 0x06, 0x3d, 0x08, 0x8d, 0x73, 0xe9, 0x67, 0xc8, 0xa9, 0x98, 0xe1, 0x50, 0x92, 0x0b, 0xa7, 0x56,
- 0xda, 0xdb, 0xf0, 0xcd, 0xbc, 0xdf, 0x7b, 0xf3, 0xfe, 0xfc, 0xde, 0x10, 0x36, 0x7a, 0xc3, 0x7a,
- 0x6f, 0x18, 0x53, 0x36, 0xa4, 0x6c, 0xbc, 0x88, 0x3a, 0xf5, 0x88, 0x85, 0x51, 0x18, 0x53, 0x66,
- 0xf5, 0x86, 0x66, 0xc4, 0x42, 0x1e, 0xa2, 0xaa, 0x1d, 0xda, 0x3d, 0x16, 0x12, 0xbb, 0x6b, 0xf6,
- 0x86, 0x66, 0x7a, 0xd4, 0x8c, 0x79, 0xc8, 0x88, 0x4b, 0xa3, 0xce, 0xda, 0x8a, 0xdc, 0x8c, 0x3a,
- 0x75, 0x12, 0x79, 0x89, 0xce, 0x1a, 0x4a, 0x45, 0x0e, 0xe1, 0x44, 0xc9, 0x2e, 0xa4, 0xb2, 0x3e,
- 0xe5, 0x64, 0x4a, 0xfe, 0x57, 0x85, 0x54, 0xa7, 0x81, 0xeb, 0x05, 0x54, 0x1c, 0x18, 0xda, 0xb6,
- 0xda, 0xfc, 0xdb, 0xa9, 0x9b, 0x5b, 0x6a, 0xb7, 0xf6, 0x8e, 0x4b, 0xc4, 0x9c, 0x70, 0xaa, 0xce,
- 0x18, 0x03, 0xee, 0xf9, 0xf5, 0xae, 0x6f, 0xd7, 0xb9, 0xd7, 0xa7, 0x31, 0x27, 0xfd, 0x48, 0xed,
- 0xac, 0xba, 0xa1, 0x1b, 0xca, 0x65, 0x5d, 0xac, 0x12, 0x69, 0xed, 0xfb, 0x0c, 0xe4, 0xdb, 0x91,
- 0xef, 0x71, 0xd4, 0x84, 0x45, 0xce, 0x3c, 0xd7, 0xa5, 0xcc, 0xc8, 0xac, 0x67, 0x36, 0x8a, 0x9b,
- 0x55, 0x73, 0x12, 0x0a, 0x75, 0x19, 0x53, 0x1e, 0x3d, 0x4c, 0x8e, 0x35, 0xb4, 0x17, 0xa3, 0xea,
- 0xdc, 0xcb, 0x51, 0x35, 0x83, 0x53, 0x4d, 0x74, 0x08, 0x05, 0xd6, 0x8d, 0x2d, 0x87, 0xfa, 0x9c,
- 0x18, 0xf3, 0x12, 0xe6, 0x9f, 0x53, 0x30, 0xea, 0x7a, 0x66, 0x7a, 0x3d, 0x73, 0xff, 0x61, 0xb3,
- 0xd9, 0xe6, 0x84, 0xc7, 0x0d, 0x5d, 0x80, 0x1d, 0x8f, 0xaa, 0x1a, 0xbe, 0xd3, 0xde, 0x11, 0xea,
- 0x58, 0x63, 0xdd, 0x58, 0xae, 0xae, 0xe5, 0x7e, 0x79, 0x5e, 0xcd, 0xd4, 0x30, 0xe4, 0xf7, 0x29,
- 0x73, 0xe9, 0x6c, 0x9e, 0xca, 0xa3, 0xef, 0xf6, 0x54, 0x61, 0x3a, 0x50, 0x6a, 0x76, 0x49, 0xe0,
- 0x52, 0x4c, 0x23, 0xdf, 0xb3, 0x49, 0x8c, 0xf6, 0x7e, 0x0b, 0xbe, 0x71, 0x0a, 0xf8, 0x49, 0x9d,
- 0xdf, 0xb3, 0xf2, 0xcd, 0xf3, 0xea, 0x5c, 0xed, 0xf5, 0x3c, 0x94, 0x9b, 0x61, 0x3f, 0x1a, 0x70,
- 0xda, 0xec, 0x52, 0xbb, 0x17, 0x0f, 0xfa, 0xe8, 0x73, 0x28, 0xda, 0x6a, 0x6d, 0x79, 0x8e, 0xb4,
- 0xb5, 0xd4, 0xd8, 0x15, 0x08, 0x3f, 0x8d, 0xaa, 0x5b, 0xae, 0xc7, 0xbb, 0x83, 0x8e, 0x69, 0x87,
- 0xfd, 0xfa, 0xd8, 0xba, 0xd3, 0x99, 0xac, 0xeb, 0x51, 0xcf, 0xad, 0xcb, 0x54, 0x0f, 0x06, 0x9e,
- 0x63, 0x3e, 0x78, 0xb0, 0xbb, 0x73, 0x3c, 0xaa, 0x42, 0x8a, 0xbe, 0xbb, 0x83, 0x21, 0x45, 0xdf,
- 0x75, 0xd0, 0x3f, 0x60, 0x39, 0x26, 0x43, 0x6a, 0xc5, 0x01, 0x89, 0xe2, 0x6e, 0xc8, 0x65, 0x66,
- 0x34, 0xbc, 0x24, 0x84, 0x6d, 0x25, 0x43, 0x5b, 0x90, 0xeb, 0x87, 0x0e, 0x35, 0xb2, 0xeb, 0x99,
- 0x8d, 0xd2, 0xa9, 0x21, 0x4d, 0xd1, 0xf7, 0x43, 0x87, 0x62, 0x79, 0x18, 0x55, 0x20, 0xb1, 0x13,
- 0x85, 0x5e, 0xc0, 0x8d, 0x9c, 0x84, 0x9d, 0x92, 0x20, 0x03, 0x16, 0x87, 0x94, 0xc5, 0x5e, 0x18,
- 0x18, 0xf9, 0xf5, 0xcc, 0xc6, 0x32, 0x4e, 0x3f, 0xd1, 0x1d, 0x28, 0x70, 0xca, 0xfa, 0x5e, 0x40,
- 0x38, 0x35, 0x16, 0xd6, 0xb3, 0x1b, 0xc5, 0xcd, 0x4b, 0xa7, 0xd8, 0x54, 0x31, 0xde, 0xa1, 0xb1,
- 0xcd, 0xbc, 0x88, 0x87, 0xac, 0x91, 0x13, 0x31, 0xc2, 0x13, 0x65, 0x95, 0xc9, 0x87, 0x00, 0x22,
- 0xc4, 0xc4, 0xe6, 0x02, 0x7d, 0x15, 0xf2, 0x9d, 0x23, 0x4e, 0x63, 0x19, 0xd7, 0x2c, 0x4e, 0x3e,
- 0xd0, 0x15, 0x40, 0xf1, 0xc0, 0x75, 0x69, 0xcc, 0xa9, 0x63, 0x11, 0x6e, 0x05, 0x24, 0x08, 0x63,
- 0x19, 0x8c, 0x2c, 0xd6, 0xc7, 0x3b, 0xdb, 0xfc, 0x40, 0xc8, 0x15, 0xee, 0xd7, 0xf3, 0x70, 0xae,
- 0x9d, 0x6e, 0x4d, 0x59, 0xb8, 0x0f, 0x85, 0x98, 0x13, 0xc6, 0xad, 0x1e, 0x3d, 0x52, 0xd9, 0xfb,
- 0xdf, 0xdb, 0x51, 0xf5, 0xea, 0x4c, 0x99, 0x4b, 0x6f, 0x77, 0x97, 0x1e, 0x61, 0x4d, 0xc2, 0xdc,
- 0xa5, 0x47, 0x68, 0x1f, 0x16, 0x69, 0xe0, 0x48, 0xc0, 0xf9, 0x3f, 0x01, 0xb8, 0x40, 0x03, 0x47,
- 0xc0, 0x3d, 0x00, 0xb0, 0xc7, 0xfe, 0xca, 0xb4, 0x16, 0x37, 0xff, 0x63, 0x9e, 0x41, 0x6f, 0xe6,
- 0xe4, 0x8a, 0x53, 0xf5, 0x3c, 0x05, 0xa4, 0xc2, 0xf2, 0x83, 0x06, 0xab, 0x2a, 0x37, 0x9c, 0x3a,
- 0xb7, 0x86, 0xc4, 0xc7, 0x34, 0x1e, 0xf8, 0x82, 0x46, 0xf2, 0x92, 0x8f, 0x54, 0xf7, 0xff, 0xf7,
- 0x4c, 0x83, 0x0a, 0x45, 0xb0, 0x00, 0xc5, 0x89, 0x2e, 0xba, 0x01, 0xf9, 0x58, 0x30, 0x8d, 0xf2,
- 0xfa, 0xf2, 0x99, 0x20, 0x92, 0x97, 0x70, 0xa2, 0x24, 0xb4, 0xfb, 0xa2, 0xfb, 0x65, 0x3d, 0xce,
- 0xa2, 0x2d, 0xb9, 0x02, 0x27, 0x4a, 0x68, 0x03, 0x74, 0x2f, 0xb6, 0x7c, 0x4a, 0x62, 0x6a, 0x31,
- 0xfa, 0x64, 0x40, 0x63, 0x6e, 0x2c, 0xc8, 0xc2, 0x2e, 0x79, 0xf1, 0x9e, 0x10, 0xe3, 0x44, 0x8a,
- 0xb6, 0xa1, 0x30, 0x26, 0x59, 0x43, 0x93, 0xb6, 0xfe, 0x3e, 0x65, 0x4b, 0xb4, 0xa7, 0xd9, 0xf5,
- 0x6d, 0xf3, 0x30, 0x3d, 0x34, 0xae, 0xdd, 0x54, 0x80, 0xee, 0x81, 0xee, 0xd0, 0x88, 0x51, 0x19,
- 0x45, 0x45, 0x9b, 0xf0, 0x1e, 0xb4, 0x89, 0xcb, 0x13, 0x75, 0xc9, 0x95, 0xe8, 0x53, 0x28, 0xdb,
- 0x92, 0x9d, 0x2c, 0xa6, 0xe8, 0xc9, 0x58, 0x92, 0x80, 0xf5, 0xb3, 0x53, 0x7f, 0x82, 0xd5, 0x70,
- 0xc9, 0x3e, 0xc9, 0x8c, 0x97, 0xa0, 0xc4, 0xc8, 0x63, 0x6e, 0xf9, 0xa1, 0xab, 0x3c, 0x5d, 0x96,
- 0x9d, 0xb3, 0x24, 0xa4, 0x7b, 0xa1, 0x9b, 0xd8, 0x7f, 0x02, 0x45, 0xe2, 0x38, 0x56, 0x1c, 0x73,
- 0xd2, 0xf1, 0xa9, 0xb1, 0x22, 0x6d, 0xdf, 0x9c, 0xb5, 0x0a, 0x4e, 0xd4, 0x92, 0xb9, 0xed, 0x38,
- 0xed, 0xf6, 0xa1, 0xc0, 0x69, 0x94, 0x04, 0xbd, 0x4d, 0xbe, 0x31, 0x10, 0xc7, 0x69, 0x27, 0x36,
- 0xd0, 0x6d, 0xc8, 0x27, 0xfe, 0x20, 0x69, 0xec, 0xdf, 0x33, 0x45, 0x4e, 0x7a, 0xab, 0x12, 0x92,
- 0xa8, 0xa3, 0x2f, 0x32, 0x70, 0x2e, 0x62, 0x74, 0xa8, 0x92, 0x9f, 0xbc, 0x0d, 0x88, 0x6f, 0xac,
- 0xce, 0x92, 0xda, 0x9b, 0x6f, 0x47, 0xd5, 0x1b, 0xb3, 0xd3, 0xb6, 0x50, 0x6e, 0xfa, 0xa1, 0xdd,
- 0x1b, 0x23, 0xe0, 0x15, 0x61, 0x5b, 0x16, 0xd8, 0x3d, 0x65, 0x19, 0x7d, 0x06, 0xba, 0x9d, 0xcc,
- 0x0d, 0x2b, 0xa5, 0x73, 0xe3, 0xbc, 0xf4, 0xe6, 0xea, 0x4c, 0x8d, 0x3c, 0x35, 0x70, 0x70, 0xd9,
- 0x3e, 0x29, 0x58, 0xfb, 0x08, 0xa6, 0x02, 0x8a, 0x10, 0xe4, 0xc4, 0x2b, 0x25, 0xa1, 0x32, 0x2c,
- 0xd7, 0xa8, 0x0a, 0x79, 0x9b, 0xd9, 0x5b, 0x9b, 0xb2, 0x97, 0x97, 0x1b, 0x85, 0xe3, 0x51, 0x35,
- 0xdf, 0xc4, 0xcd, 0xad, 0x4d, 0x9c, 0xc8, 0x13, 0x2e, 0x68, 0xe5, 0xb4, 0x8c, 0x3e, 0xdf, 0xca,
- 0x69, 0x79, 0x7d, 0xa1, 0x95, 0xd3, 0x16, 0x75, 0xad, 0x95, 0xd3, 0x0a, 0x3a, 0xb4, 0x72, 0x5a,
- 0x49, 0x2f, 0xb7, 0x72, 0x5a, 0x59, 0xd7, 0x5b, 0x39, 0x4d, 0xd7, 0x57, 0x5a, 0x39, 0xed, 0x9c,
- 0xbe, 0xda, 0x5a, 0xd0, 0xbe, 0x3a, 0xd0, 0xbf, 0x3d, 0xa8, 0xad, 0x03, 0x7c, 0xc2, 0x3c, 0x4e,
- 0x1b, 0x84, 0xdb, 0xdd, 0xd3, 0x1c, 0xa8, 0xdd, 0x87, 0xa5, 0xbd, 0xd0, 0xf5, 0x6c, 0xe2, 0x7f,
- 0x1c, 0xed, 0x85, 0x2e, 0xda, 0x86, 0x6c, 0x18, 0x09, 0x52, 0x17, 0xe3, 0xe2, 0x5f, 0x67, 0xe5,
- 0x79, 0xac, 0xaa, 0xd2, 0x2c, 0x74, 0x6b, 0x3f, 0xe6, 0xa1, 0x88, 0xc9, 0x63, 0xde, 0x0c, 0xfb,
- 0x7d, 0x12, 0x38, 0xe8, 0x32, 0x94, 0xfb, 0xe4, 0x99, 0x4a, 0xb9, 0x17, 0x38, 0xf4, 0x99, 0xa4,
- 0x8d, 0x1c, 0x5e, 0xee, 0x93, 0x67, 0x32, 0x1b, 0xbb, 0x42, 0x88, 0x0e, 0xe1, 0x2f, 0x53, 0x9d,
- 0x3a, 0x7e, 0x37, 0x4a, 0x3d, 0x39, 0xdb, 0x8a, 0x9b, 0xc6, 0x29, 0xf3, 0x2b, 0x21, 0x8c, 0x8b,
- 0x13, 0xd5, 0x7b, 0x4a, 0x53, 0x6e, 0xa0, 0x21, 0x5c, 0x3c, 0x09, 0x65, 0xc5, 0x82, 0x5c, 0x02,
- 0x9b, 0x4a, 0xce, 0xc9, 0x36, 0x3e, 0x7c, 0x3b, 0xaa, 0x5e, 0x7b, 0xaf, 0x11, 0x20, 0x81, 0xdb,
- 0x0a, 0x05, 0x9f, 0x8f, 0xa6, 0xed, 0xa5, 0x62, 0xf4, 0x04, 0x2e, 0xb0, 0x71, 0xc7, 0x59, 0x74,
- 0x48, 0x7c, 0x8b, 0xc9, 0x9e, 0x93, 0x3d, 0x5d, 0xdc, 0xfc, 0xff, 0x1f, 0x6a, 0x58, 0x15, 0xe7,
- 0x55, 0x76, 0xda, 0x60, 0xd8, 0x83, 0xe2, 0x53, 0x91, 0x6d, 0xab, 0x23, 0xd2, 0x6d, 0x94, 0x66,
- 0x9c, 0x47, 0x93, 0x0a, 0xc1, 0xf0, 0x74, 0x52, 0x2d, 0x6d, 0x28, 0xf9, 0x49, 0x7a, 0xad, 0x30,
- 0x12, 0x94, 0x64, 0x94, 0x67, 0x9c, 0x37, 0xd3, 0x05, 0x85, 0x97, 0xfc, 0xe9, 0xf2, 0x7a, 0x04,
- 0xc0, 0x19, 0xb1, 0xa9, 0x25, 0x0b, 0x51, 0x97, 0x55, 0x76, 0xfd, 0xec, 0x48, 0x4c, 0xaa, 0xc9,
- 0x3c, 0x14, 0xea, 0x3b, 0x84, 0x93, 0x5b, 0x01, 0x67, 0x47, 0xb8, 0xc0, 0xd3, 0xef, 0xb5, 0x1b,
- 0x50, 0x3a, 0xb9, 0x89, 0x74, 0xc8, 0xa6, 0x6f, 0x87, 0x02, 0x16, 0x4b, 0xf1, 0x6a, 0x19, 0x12,
- 0x7f, 0x90, 0xcc, 0xce, 0x02, 0x4e, 0x3e, 0xae, 0xcd, 0x7f, 0x20, 0x5a, 0x2c, 0xab, 0xe7, 0xc6,
- 0x8d, 0x36, 0xaf, 0x67, 0x93, 0x26, 0xfa, 0xee, 0xa0, 0x76, 0x1d, 0x56, 0xa6, 0x1c, 0xb8, 0x1d,
- 0x86, 0x9c, 0xb2, 0x59, 0x8b, 0xba, 0x71, 0xe5, 0xc5, 0xeb, 0xca, 0xdc, 0x8b, 0xe3, 0x4a, 0xe6,
- 0xe5, 0x71, 0x25, 0xf3, 0xea, 0xb8, 0x92, 0xf9, 0xf9, 0xb8, 0x92, 0xf9, 0xf2, 0x4d, 0x65, 0xee,
- 0xe5, 0x9b, 0xca, 0xdc, 0xab, 0x37, 0x95, 0xb9, 0x47, 0x30, 0xf9, 0xcf, 0xe8, 0x2c, 0xc8, 0x5f,
- 0x86, 0xad, 0x5f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xf1, 0xe4, 0x48, 0xb2, 0x4d, 0x0d, 0x00, 0x00,
+ proto.RegisterFile("kv/kvserver/kvserverpb/proposer_kv.proto", fileDescriptor_proposer_kv_0b3536bd0bf3d98c)
+}
+
+var fileDescriptor_proposer_kv_0b3536bd0bf3d98c = []byte{
+ // 1453 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4f, 0x73, 0x13, 0xc7,
+ 0x12, 0xb7, 0x2c, 0xc9, 0x5e, 0xb5, 0x6c, 0x69, 0x3d, 0x18, 0xd8, 0xe7, 0xf7, 0x9e, 0xe4, 0xd2,
+ 0xe3, 0x51, 0x4e, 0x42, 0x56, 0x94, 0x9d, 0x54, 0xa5, 0x80, 0x4a, 0x61, 0xc9, 0x10, 0x2c, 0x6c,
+ 0x07, 0x46, 0x86, 0xa4, 0xc8, 0x61, 0x6b, 0xb4, 0x3b, 0xac, 0x36, 0x5a, 0x69, 0x97, 0x9d, 0x91,
+ 0xc0, 0x9f, 0x22, 0x49, 0x55, 0x0e, 0xb9, 0x24, 0xe1, 0x98, 0xaf, 0x91, 0x1b, 0x47, 0x8e, 0x54,
+ 0x0e, 0xaa, 0x60, 0x2e, 0xf9, 0x0c, 0x9c, 0x52, 0x33, 0x3b, 0xab, 0x3f, 0x29, 0x13, 0x8b, 0x24,
+ 0xb7, 0xd9, 0x9e, 0xe9, 0x5f, 0xf7, 0xf4, 0x9f, 0x5f, 0xcf, 0xc2, 0x46, 0x67, 0x50, 0xed, 0x0c,
+ 0x18, 0x8d, 0x06, 0x34, 0x1a, 0x2d, 0xc2, 0x56, 0x35, 0x8c, 0x82, 0x30, 0x60, 0x34, 0xb2, 0x3a,
+ 0x03, 0x33, 0x8c, 0x02, 0x1e, 0xa0, 0xb2, 0x1d, 0xd8, 0x9d, 0x28, 0x20, 0x76, 0xdb, 0xec, 0x0c,
+ 0xcc, 0xe4, 0xa8, 0xc9, 0x78, 0x10, 0x11, 0x97, 0x86, 0xad, 0xb5, 0x15, 0xb9, 0x19, 0xb6, 0xaa,
+ 0x24, 0xf4, 0x62, 0x9d, 0x35, 0x94, 0x88, 0x1c, 0xc2, 0x89, 0x92, 0x9d, 0x4b, 0x64, 0x5d, 0xca,
+ 0xc9, 0x84, 0xfc, 0xdf, 0x0a, 0xa9, 0x4a, 0x7b, 0xae, 0xd7, 0xa3, 0xe2, 0xc0, 0xc0, 0xb6, 0xd5,
+ 0xe6, 0x7f, 0x4e, 0xdc, 0xdc, 0x52, 0xbb, 0x95, 0x37, 0x5c, 0x82, 0x71, 0xc2, 0xa9, 0x3a, 0x63,
+ 0xf4, 0xb9, 0xe7, 0x57, 0xdb, 0xbe, 0x5d, 0xe5, 0x5e, 0x97, 0x32, 0x4e, 0xba, 0xa1, 0xda, 0x59,
+ 0x75, 0x03, 0x37, 0x90, 0xcb, 0xaa, 0x58, 0xc5, 0xd2, 0xca, 0x4f, 0x29, 0xc8, 0x36, 0x43, 0xdf,
+ 0xe3, 0xa8, 0x0e, 0x8b, 0x3c, 0xf2, 0x5c, 0x97, 0x46, 0x46, 0x6a, 0x3d, 0xb5, 0x91, 0xdf, 0x2c,
+ 0x9b, 0xe3, 0x50, 0xa8, 0xcb, 0x98, 0xf2, 0xe8, 0x61, 0x7c, 0xac, 0xa6, 0x3d, 0x1b, 0x96, 0xe7,
+ 0x9e, 0x0f, 0xcb, 0x29, 0x9c, 0x68, 0xa2, 0x43, 0xc8, 0x45, 0x6d, 0x66, 0x39, 0xd4, 0xe7, 0xc4,
+ 0x98, 0x97, 0x30, 0xff, 0x9f, 0x80, 0x51, 0xd7, 0x33, 0x93, 0xeb, 0x99, 0xfb, 0xf7, 0xeb, 0xf5,
+ 0x26, 0x27, 0x9c, 0xd5, 0x74, 0x01, 0x76, 0x3c, 0x2c, 0x6b, 0xf8, 0x56, 0x73, 0x47, 0xa8, 0x63,
+ 0x2d, 0x6a, 0x33, 0xb9, 0xba, 0x92, 0xf9, 0xed, 0x69, 0x39, 0x55, 0xc1, 0x90, 0xdd, 0xa7, 0x91,
+ 0x4b, 0x67, 0xf3, 0x54, 0x1e, 0x7d, 0xb3, 0xa7, 0x0a, 0xd3, 0x81, 0x42, 0xbd, 0x4d, 0x7a, 0x2e,
+ 0xc5, 0x34, 0xf4, 0x3d, 0x9b, 0x30, 0xb4, 0xf7, 0x47, 0xf0, 0x8d, 0x13, 0xc0, 0xa7, 0x75, 0xfe,
+ 0xcc, 0xca, 0x77, 0x4f, 0xcb, 0x73, 0x95, 0x97, 0xf3, 0x50, 0xac, 0x07, 0xdd, 0xb0, 0xcf, 0x69,
+ 0xbd, 0x4d, 0xed, 0x0e, 0xeb, 0x77, 0xd1, 0x97, 0x90, 0xb7, 0xd5, 0xda, 0xf2, 0x1c, 0x69, 0x6b,
+ 0xa9, 0xb6, 0x2b, 0x10, 0x7e, 0x19, 0x96, 0xb7, 0x5c, 0x8f, 0xb7, 0xfb, 0x2d, 0xd3, 0x0e, 0xba,
+ 0xd5, 0x91, 0x75, 0xa7, 0x35, 0x5e, 0x57, 0xc3, 0x8e, 0x5b, 0x95, 0xa9, 0xee, 0xf7, 0x3d, 0xc7,
+ 0xbc, 0x77, 0x6f, 0x77, 0xe7, 0x78, 0x58, 0x86, 0x04, 0x7d, 0x77, 0x07, 0x43, 0x82, 0xbe, 0xeb,
+ 0xa0, 0xff, 0xc1, 0x32, 0x23, 0x03, 0x6a, 0xb1, 0x1e, 0x09, 0x59, 0x3b, 0xe0, 0x32, 0x33, 0x1a,
+ 0x5e, 0x12, 0xc2, 0xa6, 0x92, 0xa1, 0x2d, 0xc8, 0x74, 0x03, 0x87, 0x1a, 0xe9, 0xf5, 0xd4, 0x46,
+ 0xe1, 0xc4, 0x90, 0x26, 0xe8, 0xfb, 0x81, 0x43, 0xb1, 0x3c, 0x8c, 0x4a, 0x10, 0xdb, 0x09, 0x03,
+ 0xaf, 0xc7, 0x8d, 0x8c, 0x84, 0x9d, 0x90, 0x20, 0x03, 0x16, 0x07, 0x34, 0x62, 0x5e, 0xd0, 0x33,
+ 0xb2, 0xeb, 0xa9, 0x8d, 0x65, 0x9c, 0x7c, 0xa2, 0x5b, 0x90, 0xe3, 0x34, 0xea, 0x7a, 0x3d, 0xc2,
+ 0xa9, 0xb1, 0xb0, 0x9e, 0xde, 0xc8, 0x6f, 0x5e, 0x38, 0xc1, 0xa6, 0x8a, 0xf1, 0x0e, 0x65, 0x76,
+ 0xe4, 0x85, 0x3c, 0x88, 0x6a, 0x19, 0x11, 0x23, 0x3c, 0x56, 0x56, 0x99, 0xbc, 0x0f, 0x20, 0x42,
+ 0x4c, 0x6c, 0x2e, 0xd0, 0x57, 0x21, 0xdb, 0x3a, 0xe2, 0x94, 0xc9, 0xb8, 0xa6, 0x71, 0xfc, 0x81,
+ 0x2e, 0x01, 0x62, 0x7d, 0xd7, 0xa5, 0x8c, 0x53, 0xc7, 0x22, 0xdc, 0xea, 0x91, 0x5e, 0xc0, 0x64,
+ 0x30, 0xd2, 0x58, 0x1f, 0xed, 0x6c, 0xf3, 0x03, 0x21, 0x57, 0xb8, 0xdf, 0xce, 0xc3, 0x99, 0x66,
+ 0xb2, 0x35, 0x61, 0xe1, 0x2e, 0xe4, 0x18, 0x27, 0x11, 0xb7, 0x3a, 0xf4, 0x48, 0x65, 0xef, 0x83,
+ 0xd7, 0xc3, 0xf2, 0xe5, 0x99, 0x32, 0x97, 0xdc, 0xee, 0x36, 0x3d, 0xc2, 0x9a, 0x84, 0xb9, 0x4d,
+ 0x8f, 0xd0, 0x3e, 0x2c, 0xd2, 0x9e, 0x23, 0x01, 0xe7, 0xff, 0x06, 0xe0, 0x02, 0xed, 0x39, 0x02,
+ 0xee, 0x1e, 0x80, 0x3d, 0xf2, 0x57, 0xa6, 0x35, 0xbf, 0xf9, 0x9e, 0x79, 0x0a, 0xbd, 0x99, 0xe3,
+ 0x2b, 0x4e, 0xd4, 0xf3, 0x04, 0x90, 0x0a, 0xcb, 0xcf, 0x1a, 0xac, 0xaa, 0xdc, 0x70, 0xea, 0xdc,
+ 0x18, 0x10, 0x1f, 0x53, 0xd6, 0xf7, 0x05, 0x8d, 0x64, 0x25, 0x1f, 0xa9, 0xee, 0x7f, 0xff, 0x54,
+ 0x83, 0x0a, 0x45, 0xb0, 0x00, 0xc5, 0xb1, 0x2e, 0xba, 0x06, 0x59, 0x26, 0x98, 0x46, 0x79, 0x7d,
+ 0xf1, 0x54, 0x10, 0xc9, 0x4b, 0x38, 0x56, 0x12, 0xda, 0x5d, 0xd1, 0xfd, 0xb2, 0x1e, 0x67, 0xd1,
+ 0x96, 0x5c, 0x81, 0x63, 0x25, 0xb4, 0x01, 0xba, 0xc7, 0x2c, 0x9f, 0x12, 0x46, 0xad, 0x88, 0x3e,
+ 0xea, 0x53, 0xc6, 0x8d, 0x05, 0x59, 0xd8, 0x05, 0x8f, 0xed, 0x09, 0x31, 0x8e, 0xa5, 0x68, 0x1b,
+ 0x72, 0x23, 0x92, 0x35, 0x34, 0x69, 0xeb, 0xbf, 0x13, 0xb6, 0x44, 0x7b, 0x9a, 0x6d, 0xdf, 0x36,
+ 0x0f, 0x93, 0x43, 0xa3, 0xda, 0x4d, 0x04, 0xe8, 0x0e, 0xe8, 0x0e, 0x0d, 0x23, 0x2a, 0xa3, 0xa8,
+ 0x68, 0x13, 0xde, 0x82, 0x36, 0x71, 0x71, 0xac, 0x2e, 0xb9, 0x12, 0x7d, 0x0e, 0x45, 0x5b, 0xb2,
+ 0x93, 0x15, 0x29, 0x7a, 0x32, 0x96, 0x24, 0x60, 0xf5, 0xf4, 0xd4, 0x4f, 0xb1, 0x1a, 0x2e, 0xd8,
+ 0xd3, 0xcc, 0x78, 0x01, 0x0a, 0x11, 0x79, 0xc8, 0x2d, 0x3f, 0x70, 0x95, 0xa7, 0xcb, 0xb2, 0x73,
+ 0x96, 0x84, 0x74, 0x2f, 0x70, 0x63, 0xfb, 0x8f, 0x20, 0x4f, 0x1c, 0xc7, 0x62, 0x8c, 0x93, 0x96,
+ 0x4f, 0x8d, 0x15, 0x69, 0xfb, 0xfa, 0xac, 0x55, 0x30, 0x55, 0x4b, 0xe6, 0xb6, 0xe3, 0x34, 0x9b,
+ 0x87, 0x02, 0xa7, 0x56, 0x10, 0xf4, 0x36, 0xfe, 0xc6, 0x40, 0x1c, 0xa7, 0x19, 0xdb, 0x40, 0x37,
+ 0x21, 0x1b, 0xfb, 0x83, 0xa4, 0xb1, 0x77, 0x67, 0x8a, 0x9c, 0xf4, 0x56, 0x25, 0x24, 0x56, 0x47,
+ 0x5f, 0xa5, 0xe0, 0x4c, 0x18, 0xd1, 0x81, 0x4a, 0x7e, 0xfc, 0x36, 0x20, 0xbe, 0xb1, 0x3a, 0x4b,
+ 0x6a, 0xaf, 0xbf, 0x1e, 0x96, 0xaf, 0xcd, 0x4e, 0xdb, 0x42, 0xb9, 0xee, 0x07, 0x76, 0x67, 0x84,
+ 0x80, 0x57, 0x84, 0x6d, 0x59, 0x60, 0x77, 0x94, 0x65, 0xf4, 0x05, 0xe8, 0x76, 0x3c, 0x37, 0xac,
+ 0x84, 0xce, 0x8d, 0xb3, 0xd2, 0x9b, 0xcb, 0x33, 0x35, 0xf2, 0xc4, 0xc0, 0xc1, 0x45, 0x7b, 0x5a,
+ 0xb0, 0xf6, 0x09, 0x4c, 0x04, 0x14, 0x21, 0xc8, 0x88, 0x57, 0x4a, 0x4c, 0x65, 0x58, 0xae, 0x51,
+ 0x19, 0xb2, 0x76, 0x64, 0x6f, 0x6d, 0xca, 0x5e, 0x5e, 0xae, 0xe5, 0x8e, 0x87, 0xe5, 0x6c, 0x1d,
+ 0xd7, 0xb7, 0x36, 0x71, 0x2c, 0x8f, 0xb9, 0xa0, 0x91, 0xd1, 0x52, 0xfa, 0x7c, 0x23, 0xa3, 0x65,
+ 0xf5, 0x85, 0x46, 0x46, 0x5b, 0xd4, 0xb5, 0x46, 0x46, 0xcb, 0xe9, 0xd0, 0xc8, 0x68, 0x05, 0xbd,
+ 0xd8, 0xc8, 0x68, 0x45, 0x5d, 0x6f, 0x64, 0x34, 0x5d, 0x5f, 0x69, 0x64, 0xb4, 0x33, 0xfa, 0x6a,
+ 0x63, 0x41, 0xfb, 0xe6, 0x40, 0xff, 0xe1, 0xa0, 0xb2, 0x0e, 0xf0, 0x59, 0xe4, 0x71, 0x5a, 0x23,
+ 0xdc, 0x6e, 0x9f, 0xe4, 0x40, 0xe5, 0x2e, 0x2c, 0xed, 0x05, 0xae, 0x67, 0x13, 0xff, 0xd3, 0x70,
+ 0x2f, 0x70, 0xd1, 0x36, 0xa4, 0x83, 0x50, 0x90, 0xba, 0x18, 0x17, 0xef, 0x9c, 0x96, 0xe7, 0x91,
+ 0xaa, 0x4a, 0xb3, 0xd0, 0xad, 0x7c, 0xbf, 0x00, 0x79, 0x4c, 0x1e, 0xf2, 0x7a, 0xd0, 0xed, 0x92,
+ 0x9e, 0x83, 0x2e, 0x42, 0xb1, 0x4b, 0x9e, 0xa8, 0x94, 0x7b, 0x3d, 0x87, 0x3e, 0x91, 0xb4, 0x91,
+ 0xc1, 0xcb, 0x5d, 0xf2, 0x44, 0x66, 0x63, 0x57, 0x08, 0xd1, 0x21, 0xfc, 0x6b, 0xa2, 0x53, 0x47,
+ 0xef, 0x46, 0xa9, 0x27, 0x67, 0x5b, 0x7e, 0xd3, 0x38, 0x61, 0x7e, 0xc5, 0x84, 0x71, 0x7e, 0xac,
+ 0x7a, 0x47, 0x69, 0xca, 0x0d, 0x34, 0x80, 0xf3, 0xd3, 0x50, 0x16, 0x13, 0xe4, 0xd2, 0xb3, 0xa9,
+ 0xe4, 0x9c, 0x74, 0xed, 0xe3, 0xd7, 0xc3, 0xf2, 0x95, 0xb7, 0x1a, 0x01, 0x12, 0xb8, 0xa9, 0x50,
+ 0xf0, 0xd9, 0x70, 0xd2, 0x5e, 0x22, 0x46, 0x8f, 0xe0, 0x5c, 0x34, 0xea, 0x38, 0x8b, 0x0e, 0x88,
+ 0x6f, 0x45, 0xb2, 0xe7, 0x64, 0x4f, 0xe7, 0x37, 0x3f, 0xfc, 0x4b, 0x0d, 0xab, 0xe2, 0xbc, 0x1a,
+ 0x9d, 0x34, 0x18, 0xf6, 0x20, 0xff, 0x58, 0x64, 0xdb, 0x6a, 0x89, 0x74, 0x1b, 0x85, 0x19, 0xe7,
+ 0xd1, 0xb8, 0x42, 0x30, 0x3c, 0x1e, 0x57, 0x4b, 0x13, 0x0a, 0x7e, 0x9c, 0x5e, 0x2b, 0x08, 0x05,
+ 0x25, 0x19, 0xc5, 0x19, 0xe7, 0xcd, 0x64, 0x41, 0xe1, 0x25, 0x7f, 0xb2, 0xbc, 0x1e, 0x00, 0xf0,
+ 0x88, 0xd8, 0xd4, 0x92, 0x85, 0xa8, 0xcb, 0x2a, 0xbb, 0x7a, 0x7a, 0x24, 0xc6, 0xd5, 0x64, 0x1e,
+ 0x0a, 0xf5, 0x1d, 0xc2, 0xc9, 0x8d, 0x1e, 0x8f, 0x8e, 0x70, 0x8e, 0x27, 0xdf, 0xe8, 0x00, 0x74,
+ 0xdb, 0x0f, 0x18, 0x75, 0xac, 0xf1, 0xcc, 0x58, 0x99, 0x7d, 0x66, 0x14, 0x63, 0xe5, 0x91, 0x78,
+ 0xed, 0x1a, 0x14, 0xa6, 0x8d, 0x21, 0x1d, 0xd2, 0xc9, 0x5b, 0x24, 0x87, 0xc5, 0x52, 0xbc, 0x82,
+ 0x06, 0xc4, 0xef, 0xc7, 0xb3, 0x38, 0x87, 0xe3, 0x8f, 0x2b, 0xf3, 0x1f, 0x89, 0x96, 0x4d, 0xeb,
+ 0x99, 0x51, 0xe3, 0xce, 0xeb, 0xe9, 0xb8, 0x29, 0x7f, 0x3c, 0xa8, 0x5c, 0x85, 0x95, 0x89, 0x0b,
+ 0xdd, 0x0c, 0x02, 0x4e, 0xa3, 0x59, 0x9b, 0xa4, 0xe2, 0xc2, 0xd9, 0xfa, 0xb4, 0x9f, 0x0a, 0xe0,
+ 0x1f, 0xbe, 0x7d, 0xed, 0xd2, 0xb3, 0x97, 0xa5, 0xb9, 0x67, 0xc7, 0xa5, 0xd4, 0xf3, 0xe3, 0x52,
+ 0xea, 0xc5, 0x71, 0x29, 0xf5, 0xeb, 0x71, 0x29, 0xf5, 0xf5, 0xab, 0xd2, 0xdc, 0xf3, 0x57, 0xa5,
+ 0xb9, 0x17, 0xaf, 0x4a, 0x73, 0x0f, 0x60, 0xfc, 0x83, 0xd4, 0x5a, 0x90, 0xff, 0x3a, 0x5b, 0xbf,
+ 0x07, 0x00, 0x00, 0xff, 0xff, 0x38, 0xb4, 0xb7, 0xb4, 0x06, 0x0e, 0x00, 0x00,
}
diff --git a/pkg/kv/kvserver/kvserverpb/proposer_kv.proto b/pkg/kv/kvserver/kvserverpb/proposer_kv.proto
index 3267b2a7b4a8..249b4e45ca58 100644
--- a/pkg/kv/kvserver/kvserverpb/proposer_kv.proto
+++ b/pkg/kv/kvserver/kvserverpb/proposer_kv.proto
@@ -240,8 +240,24 @@ message RaftCommand {
// been added after it, and on removal, the assignment counters must be
// updated accordingly. Managing retry of proposals becomes trickier as
// well as that uproots whatever ordering was originally envisioned.
+ //
+ // This field is set through RaftCommandFooter hackery.
uint64 max_lease_index = 4;
+ // The closed timestamp carried by this command. Once a follower is told to
+ // apply this command, it knows that there will be no further writes at
+ // timestamps <= closed_timestamp. Note that the command itself might
+ // represent a write at a lower timestamp, so the closed timestamp can only be
+ // used after this command is applied.
+ //
+ // The field can be zero, which is to be interpreted as no closed timestamp
+ // update. Some commands (lease requests) implicitly carry a closed timestamp
+ // in a command-specific way. If the value is not zero, the value is greater
+ // or equal to that of the previous commands (and all before it).
+ //
+ // This field is set through ClosedTimestampFooter hackery.
+ util.hlc.Timestamp closed_timestamp = 17 [(gogoproto.nullable) = false];
+
reserved 3;
// Proposer-evaluated KV mode.
@@ -277,3 +293,10 @@ message RaftCommand {
message RaftCommandFooter {
uint64 max_lease_index = 4;
}
+
+// ClosedTimestampFooter is similar to RaftCommandFooter, allowing the proposal
+// buffer to fill in the closed_timestamp field after most of the proto has been
+// marshaled already.
+message ClosedTimestampFooter {
+ util.hlc.Timestamp closed_timestamp = 17 [(gogoproto.nullable) = false];
+}
diff --git a/pkg/kv/kvserver/kvserverpb/state.pb.go b/pkg/kv/kvserver/kvserverpb/state.pb.go
index d33ed0c2ccae..b81a0c1f0d0d 100644
--- a/pkg/kv/kvserver/kvserverpb/state.pb.go
+++ b/pkg/kv/kvserver/kvserverpb/state.pb.go
@@ -102,13 +102,20 @@ type ReplicaState struct {
// [1]: migration.Manager
// [2]: PurgeOutdatedReplicas
Version *roachpb.Version `protobuf:"bytes,12,opt,name=version,proto3" json:"version,omitempty"`
+ // closed_timestamp is the largest timestamp that is known to have been
+ // closed. This means that the current leaseholder (if any) and any future
+ // leaseholder will not evaluate writes at or below this timestamp, and also
+ // that any in-flight commands that can still apply are writing at higher
+ // timestamps. Non-leaseholder replicas are free to serve "follower reads" at
+ // or below this timestamp.
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,13,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
}
func (m *ReplicaState) Reset() { *m = ReplicaState{} }
func (m *ReplicaState) String() string { return proto.CompactTextString(m) }
func (*ReplicaState) ProtoMessage() {}
func (*ReplicaState) Descriptor() ([]byte, []int) {
- return fileDescriptor_state_acd314f0f91777f8, []int{0}
+ return fileDescriptor_state_884b07f3590284d4, []int{0}
}
func (m *ReplicaState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -180,7 +187,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_state_acd314f0f91777f8, []int{1}
+ return fileDescriptor_state_884b07f3590284d4, []int{1}
}
func (m *RangeInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -216,7 +223,7 @@ func (m *RangeInfo_CTEntry) Reset() { *m = RangeInfo_CTEntry{} }
func (m *RangeInfo_CTEntry) String() string { return proto.CompactTextString(m) }
func (*RangeInfo_CTEntry) ProtoMessage() {}
func (*RangeInfo_CTEntry) Descriptor() ([]byte, []int) {
- return fileDescriptor_state_acd314f0f91777f8, []int{1, 0}
+ return fileDescriptor_state_884b07f3590284d4, []int{1, 0}
}
func (m *RangeInfo_CTEntry) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -252,7 +259,7 @@ func (m *LatchManagerInfo) Reset() { *m = LatchManagerInfo{} }
func (m *LatchManagerInfo) String() string { return proto.CompactTextString(m) }
func (*LatchManagerInfo) ProtoMessage() {}
func (*LatchManagerInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_state_acd314f0f91777f8, []int{2}
+ return fileDescriptor_state_884b07f3590284d4, []int{2}
}
func (m *LatchManagerInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -329,6 +336,9 @@ func (this *ReplicaState) Equal(that interface{}) bool {
if !this.Version.Equal(that1.Version) {
return false
}
+ if !this.ClosedTimestamp.Equal(&that1.ClosedTimestamp) {
+ return false
+ }
return true
}
func (this *RangeInfo) Equal(that interface{}) bool {
@@ -530,6 +540,14 @@ func (m *ReplicaState) MarshalTo(dAtA []byte) (int, error) {
}
i += n6
}
+ dAtA[i] = 0x6a
+ i++
+ i = encodeVarintState(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n7, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n7
return i, nil
}
@@ -551,11 +569,11 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintState(dAtA, i, uint64(m.ReplicaState.Size()))
- n7, err := m.ReplicaState.MarshalTo(dAtA[i:])
+ n8, err := m.ReplicaState.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n7
+ i += n8
if m.LastIndex != 0 {
dAtA[i] = 0x10
i++
@@ -599,19 +617,19 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x5a
i++
i = encodeVarintState(dAtA, i, uint64(m.NewestClosedTimestamp.Size()))
- n8, err := m.NewestClosedTimestamp.MarshalTo(dAtA[i:])
+ n9, err := m.NewestClosedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n8
+ i += n9
dAtA[i] = 0x62
i++
i = encodeVarintState(dAtA, i, uint64(m.ActiveClosedTimestamp.Size()))
- n9, err := m.ActiveClosedTimestamp.MarshalTo(dAtA[i:])
+ n10, err := m.ActiveClosedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n9
+ i += n10
if m.RangefeedRegistrations != 0 {
dAtA[i] = 0x68
i++
@@ -623,22 +641,22 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
i = encodeVarintState(dAtA, i, uint64(m.ProposalQuotaBaseIndex))
}
if len(m.ProposalQuotaReleaseQueue) > 0 {
- dAtA11 := make([]byte, len(m.ProposalQuotaReleaseQueue)*10)
- var j10 int
+ dAtA12 := make([]byte, len(m.ProposalQuotaReleaseQueue)*10)
+ var j11 int
for _, num1 := range m.ProposalQuotaReleaseQueue {
num := uint64(num1)
for num >= 1<<7 {
- dAtA11[j10] = uint8(uint64(num)&0x7f | 0x80)
+ dAtA12[j11] = uint8(uint64(num)&0x7f | 0x80)
num >>= 7
- j10++
+ j11++
}
- dAtA11[j10] = uint8(num)
- j10++
+ dAtA12[j11] = uint8(num)
+ j11++
}
dAtA[i] = 0x7a
i++
- i = encodeVarintState(dAtA, i, uint64(j10))
- i += copy(dAtA[i:], dAtA11[:j10])
+ i = encodeVarintState(dAtA, i, uint64(j11))
+ i += copy(dAtA[i:], dAtA12[:j11])
}
if m.TenantID != 0 {
dAtA[i] = 0x80
@@ -681,11 +699,11 @@ func (m *RangeInfo_CTEntry) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintState(dAtA, i, uint64(m.ClosedTimestamp.Size()))
- n12, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ n13, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n12
+ i += n13
if m.MLAI != 0 {
dAtA[i] = 0x18
i++
@@ -775,6 +793,8 @@ func (m *ReplicaState) Size() (n int) {
l = m.Version.Size()
n += 1 + l + sovState(uint64(l))
}
+ l = m.ClosedTimestamp.Size()
+ n += 1 + l + sovState(uint64(l))
return n
}
@@ -1167,6 +1187,36 @@ func (m *ReplicaState) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 13:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowState
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthState
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipState(dAtA[iNdEx:])
@@ -1952,76 +2002,76 @@ var (
)
func init() {
- proto.RegisterFile("kv/kvserver/kvserverpb/state.proto", fileDescriptor_state_acd314f0f91777f8)
+ proto.RegisterFile("kv/kvserver/kvserverpb/state.proto", fileDescriptor_state_884b07f3590284d4)
}
-var fileDescriptor_state_acd314f0f91777f8 = []byte{
- // 1061 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xcd, 0x6e, 0x1b, 0x37,
- 0x10, 0xf6, 0x5a, 0x2b, 0x5b, 0xa2, 0xec, 0x58, 0x61, 0x9d, 0x78, 0xe3, 0xc4, 0x92, 0x21, 0xa0,
- 0x85, 0x0b, 0xa4, 0x2b, 0xd4, 0xe9, 0x0f, 0xfa, 0x03, 0x14, 0x96, 0x5c, 0x14, 0x72, 0x6d, 0x23,
- 0x66, 0x84, 0x1c, 0xd2, 0xc3, 0x82, 0xda, 0x1d, 0xaf, 0x16, 0x5a, 0x2d, 0x37, 0x24, 0xa5, 0xd8,
- 0x79, 0x8a, 0x3e, 0x42, 0x5f, 0xa3, 0x6f, 0x60, 0xf4, 0xe4, 0x63, 0x4e, 0x42, 0x2b, 0x5f, 0x7a,
- 0xeb, 0xbd, 0xa7, 0x80, 0xa4, 0x56, 0x96, 0x6c, 0x03, 0xc9, 0x8d, 0xfb, 0x7d, 0xdf, 0x0c, 0xc9,
- 0xf9, 0x86, 0xb3, 0xa8, 0xd6, 0x1b, 0xd6, 0x7b, 0x43, 0x01, 0x7c, 0x08, 0x7c, 0xba, 0x48, 0x3b,
- 0x75, 0x21, 0xa9, 0x04, 0x37, 0xe5, 0x4c, 0x32, 0x5c, 0xf5, 0x99, 0xdf, 0xe3, 0x8c, 0xfa, 0x5d,
- 0xb7, 0x37, 0x74, 0x33, 0x91, 0x2b, 0x24, 0xe3, 0x34, 0x84, 0xb4, 0xb3, 0xf9, 0x78, 0xb2, 0xac,
- 0x43, 0x12, 0x46, 0x09, 0xa4, 0x9d, 0x7a, 0x7f, 0xe8, 0xfb, 0x26, 0x7a, 0xf3, 0xb1, 0x8e, 0x4c,
- 0x3b, 0xf5, 0x28, 0x91, 0xc0, 0x13, 0x1a, 0x7b, 0x9c, 0x9e, 0xca, 0x09, 0xf9, 0x30, 0x23, 0xfb,
- 0x20, 0x69, 0x40, 0x25, 0x9d, 0xe0, 0x38, 0xc3, 0x67, 0x30, 0x67, 0x20, 0xa3, 0xb8, 0xde, 0x8d,
- 0xfd, 0xba, 0x8c, 0xfa, 0x20, 0x24, 0xed, 0xa7, 0x13, 0x66, 0x3d, 0x64, 0x21, 0xd3, 0xcb, 0xba,
- 0x5a, 0x19, 0xb4, 0xf6, 0xa7, 0x8d, 0x56, 0x08, 0xa4, 0x71, 0xe4, 0xd3, 0x17, 0xea, 0x36, 0xf8,
- 0x29, 0xc2, 0x6a, 0x6b, 0x8f, 0xa6, 0x69, 0x1c, 0x41, 0xe0, 0x45, 0x49, 0x00, 0x67, 0x8e, 0xb5,
- 0x6d, 0xed, 0xd8, 0xa4, 0xac, 0x98, 0x3d, 0x43, 0xb4, 0x14, 0x8e, 0x5d, 0xf4, 0x49, 0x0c, 0x54,
- 0xc0, 0x0d, 0xf9, 0xa2, 0x96, 0xdf, 0xd7, 0xd4, 0x9c, 0xfe, 0x1b, 0x64, 0x07, 0x20, 0x7c, 0x27,
- 0xb7, 0x6d, 0xed, 0x94, 0x76, 0x6b, 0xee, 0x75, 0xd1, 0x26, 0x77, 0x71, 0x09, 0x4d, 0x42, 0xd8,
- 0x07, 0xe1, 0xf3, 0x28, 0x95, 0x8c, 0x13, 0xad, 0xc7, 0x2e, 0xca, 0xeb, 0x64, 0x8e, 0xad, 0x03,
- 0x9d, 0x3b, 0x02, 0x0f, 0x15, 0x4f, 0x8c, 0x0c, 0x1f, 0xa3, 0x35, 0xc9, 0x07, 0x89, 0x4f, 0x25,
- 0x04, 0x9e, 0xb6, 0xc9, 0xc9, 0xeb, 0xc8, 0x4f, 0xef, 0xdc, 0xf2, 0x54, 0xb6, 0x33, 0xb5, 0xae,
- 0x02, 0xb9, 0x27, 0xe7, 0xbe, 0xf1, 0x09, 0x5a, 0x09, 0x7d, 0x4f, 0x76, 0x39, 0x88, 0x2e, 0x8b,
- 0x03, 0x67, 0x49, 0x27, 0xdb, 0x9a, 0x49, 0xa6, 0xea, 0xee, 0x76, 0x63, 0xdf, 0x6d, 0x67, 0x75,
- 0x6f, 0xac, 0x8d, 0x47, 0xd5, 0xd2, 0x2f, 0xcd, 0x76, 0x16, 0x45, 0x4a, 0xa1, 0x3f, 0xfd, 0xc0,
- 0x3f, 0xa0, 0xbc, 0x3a, 0x98, 0x70, 0x96, 0x6f, 0x1d, 0x6c, 0xd2, 0x29, 0x6e, 0xd6, 0x29, 0xee,
- 0xd1, 0xcb, 0x66, 0x53, 0x1d, 0x44, 0x10, 0x13, 0x83, 0xbf, 0x46, 0x1b, 0x03, 0x11, 0x25, 0xe1,
- 0xb4, 0xee, 0xfa, 0x8e, 0x5e, 0x0f, 0xce, 0x9d, 0xd2, 0xb6, 0xb5, 0x53, 0x20, 0xeb, 0x9a, 0x9e,
- 0xd4, 0x5e, 0xdf, 0xe1, 0x57, 0x38, 0xc7, 0x5f, 0xa1, 0xe5, 0x21, 0x70, 0x11, 0xb1, 0xc4, 0x59,
- 0xd1, 0xbb, 0x6e, 0xde, 0x51, 0x8e, 0x97, 0x46, 0x41, 0x32, 0xe9, 0xf7, 0xf6, 0xbf, 0x7f, 0x54,
- 0xad, 0x03, 0xbb, 0x50, 0x28, 0x17, 0x0f, 0xec, 0x42, 0xb1, 0x8c, 0x0e, 0xec, 0x02, 0x2a, 0x97,
- 0x6a, 0x7f, 0x15, 0x50, 0x51, 0xdb, 0xd5, 0x4a, 0x4e, 0x19, 0x3e, 0x32, 0xf7, 0x01, 0xdd, 0x2b,
- 0xa5, 0xdd, 0x2f, 0xdc, 0x0f, 0x3c, 0x08, 0x77, 0xb6, 0xed, 0x1a, 0x85, 0x8b, 0x51, 0x75, 0xe1,
- 0x72, 0x54, 0xb5, 0xcc, 0x0d, 0x01, 0x6f, 0x21, 0x14, 0x53, 0x21, 0xe7, 0x1a, 0xaa, 0xa8, 0x10,
- 0xd3, 0x48, 0x55, 0x54, 0x4a, 0x06, 0x7d, 0x2f, 0x85, 0x24, 0x88, 0x92, 0x50, 0xf7, 0x93, 0x4d,
- 0x50, 0x32, 0xe8, 0x3f, 0x37, 0x48, 0x26, 0x08, 0x38, 0x4b, 0x53, 0x08, 0xb4, 0xfb, 0x46, 0xb0,
- 0x6f, 0x10, 0x5c, 0x43, 0xab, 0xba, 0xd1, 0x63, 0x16, 0x7a, 0x22, 0x7a, 0x0b, 0xda, 0xd3, 0x1c,
- 0x29, 0x29, 0xf0, 0x90, 0x85, 0x2f, 0xa2, 0xb7, 0x80, 0x7f, 0x44, 0x9b, 0x34, 0x4d, 0x39, 0x3b,
- 0x8b, 0xfa, 0xaa, 0xbc, 0x29, 0x67, 0x29, 0x13, 0x34, 0xf6, 0x5e, 0x0f, 0x98, 0xa4, 0xda, 0xb8,
- 0x1c, 0x71, 0x66, 0x14, 0xcf, 0x27, 0x82, 0x13, 0xc5, 0xe3, 0xcf, 0xd0, 0x1a, 0x57, 0xe5, 0xf1,
- 0xfa, 0xf4, 0xcc, 0xeb, 0x9c, 0x4b, 0x10, 0x4e, 0x41, 0x87, 0xac, 0x6a, 0xf8, 0x88, 0x9e, 0x35,
- 0x14, 0x88, 0xbf, 0x44, 0x0f, 0xe6, 0x4e, 0xe2, 0x49, 0x3e, 0x10, 0x12, 0x02, 0x07, 0x69, 0x2b,
- 0xf1, 0xcc, 0x89, 0xda, 0x86, 0xc1, 0x29, 0xda, 0x48, 0xe0, 0x0d, 0x08, 0xe9, 0xf9, 0x31, 0x13,
- 0x10, 0x78, 0xd3, 0xd7, 0xae, 0xfd, 0x2f, 0xed, 0xee, 0x7e, 0xb8, 0xfc, 0x99, 0x73, 0x6e, 0xb3,
- 0xfd, 0x73, 0x22, 0xf9, 0x79, 0xc3, 0x56, 0x1e, 0x90, 0x07, 0x26, 0x71, 0x53, 0xe7, 0x9d, 0x36,
- 0x33, 0xfe, 0x0d, 0x6d, 0x50, 0x5f, 0x46, 0x43, 0xb8, 0xbd, 0xe3, 0xca, 0xc7, 0x3c, 0x86, 0x49,
- 0x72, 0x93, 0xe3, 0x66, 0xf2, 0x6f, 0xd1, 0x86, 0x2e, 0xc9, 0x29, 0x40, 0xe0, 0x71, 0x08, 0x23,
- 0x21, 0x39, 0x95, 0x11, 0x4b, 0x84, 0xb3, 0xaa, 0x2b, 0xf6, 0x70, 0x4a, 0x93, 0x59, 0x16, 0x7f,
- 0x87, 0x1e, 0xcd, 0x9b, 0xe2, 0x75, 0xd4, 0x34, 0x32, 0x4d, 0x73, 0xcf, 0x84, 0xa6, 0xb3, 0xa6,
- 0x34, 0xa8, 0x00, 0xd3, 0x41, 0x3f, 0xa1, 0x27, 0x37, 0x42, 0x39, 0x98, 0x59, 0xf6, 0x7a, 0x00,
- 0x03, 0x70, 0xd6, 0xb6, 0x73, 0x3b, 0x39, 0xf2, 0x68, 0x2e, 0x9a, 0x18, 0xc5, 0x89, 0x12, 0xe0,
- 0xcf, 0x51, 0x51, 0x42, 0x42, 0x13, 0xe9, 0x45, 0x81, 0x53, 0x56, 0xfd, 0xd5, 0x58, 0x19, 0x8f,
- 0xaa, 0x85, 0xb6, 0x06, 0x5b, 0xfb, 0xa4, 0x60, 0xe8, 0x56, 0xa0, 0x9b, 0x99, 0xf9, 0x3d, 0x4f,
- 0xd2, 0x4e, 0x0c, 0xce, 0xfd, 0x6d, 0x6b, 0xa7, 0x48, 0x8a, 0x0a, 0x69, 0x2b, 0x60, 0xf3, 0x3f,
- 0x0b, 0x2d, 0x4f, 0x4c, 0xc0, 0xaf, 0xd0, 0x72, 0xc2, 0x02, 0x50, 0x39, 0xd5, 0x43, 0xca, 0x37,
- 0xf6, 0xc6, 0xa3, 0xea, 0xd2, 0x31, 0x0b, 0xa0, 0xb5, 0xff, 0xff, 0xa8, 0xfa, 0x2c, 0x8c, 0x64,
- 0x77, 0xd0, 0x71, 0x7d, 0xd6, 0xaf, 0x4f, 0xeb, 0x1d, 0x74, 0xae, 0xd7, 0xf5, 0xb4, 0x17, 0xd6,
- 0xb3, 0xa7, 0x6c, 0xc2, 0xc8, 0x92, 0xca, 0xd8, 0x0a, 0xf0, 0x31, 0x2a, 0xdf, 0x32, 0x6f, 0xf1,
- 0xe3, 0xcd, 0x5b, 0xf3, 0x6f, 0xd8, 0xf6, 0x04, 0xd9, 0xfd, 0x98, 0x46, 0xfa, 0xf5, 0xe5, 0x1a,
- 0x85, 0xf1, 0xa8, 0x6a, 0x1f, 0x1d, 0xee, 0xb5, 0x88, 0x46, 0xf1, 0x3a, 0xca, 0x43, 0xca, 0xfc,
- 0xae, 0x9e, 0xd9, 0x39, 0x62, 0x3e, 0xcc, 0x30, 0x99, 0x8e, 0x14, 0xbb, 0x9c, 0x37, 0x23, 0xa5,
- 0x46, 0x50, 0xf9, 0x90, 0x4a, 0xbf, 0x7b, 0x44, 0x13, 0x1a, 0x02, 0xd7, 0x23, 0x65, 0x0b, 0x21,
- 0x0e, 0x34, 0xf0, 0x7c, 0x36, 0x48, 0xa4, 0x2e, 0x47, 0x8e, 0x14, 0x15, 0xd2, 0x54, 0x80, 0x7a,
- 0xe2, 0x6f, 0x78, 0x24, 0x61, 0xc2, 0x2f, 0x6a, 0x1e, 0x69, 0x48, 0x0b, 0x1a, 0x4f, 0x2f, 0xfe,
- 0xa9, 0x2c, 0x5c, 0x8c, 0x2b, 0xd6, 0xe5, 0xb8, 0x62, 0xbd, 0x1b, 0x57, 0xac, 0xbf, 0xc7, 0x15,
- 0xeb, 0xf7, 0xab, 0xca, 0xc2, 0xe5, 0x55, 0x65, 0xe1, 0xdd, 0x55, 0x65, 0xe1, 0x15, 0xba, 0xfe,
- 0x9b, 0x77, 0x96, 0xf4, 0x1f, 0xf1, 0xd9, 0xfb, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd2, 0x8a, 0xae,
- 0x49, 0xee, 0x07, 0x00, 0x00,
+var fileDescriptor_state_884b07f3590284d4 = []byte{
+ // 1068 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x56, 0xcf, 0x4f, 0x1b, 0x47,
+ 0x14, 0x66, 0xe3, 0x35, 0xd8, 0x63, 0x08, 0xce, 0x14, 0xc2, 0x86, 0x04, 0x1b, 0x59, 0x6a, 0x45,
+ 0xa5, 0x74, 0xad, 0x92, 0xfe, 0x50, 0x7f, 0x48, 0x15, 0x36, 0x55, 0x65, 0x0a, 0x28, 0x4c, 0xac,
+ 0x1c, 0xd2, 0xc3, 0x6a, 0xbc, 0xfb, 0x58, 0xaf, 0xbc, 0xde, 0xd9, 0xcc, 0x8c, 0x1d, 0xc8, 0x7f,
+ 0xd0, 0x5b, 0xff, 0x84, 0xfe, 0x39, 0xa8, 0x27, 0x8e, 0x39, 0x59, 0xad, 0xb9, 0xf4, 0xd6, 0x7b,
+ 0x4f, 0xd5, 0xcc, 0x78, 0x8d, 0x0d, 0x48, 0x89, 0x7a, 0x9b, 0xfd, 0xde, 0xf7, 0xde, 0xcc, 0x7c,
+ 0xef, 0x9b, 0x67, 0xa3, 0x5a, 0x6f, 0x58, 0xef, 0x0d, 0x05, 0xf0, 0x21, 0xf0, 0xe9, 0x22, 0xed,
+ 0xd4, 0x85, 0xa4, 0x12, 0xdc, 0x94, 0x33, 0xc9, 0x70, 0xd5, 0x67, 0x7e, 0x8f, 0x33, 0xea, 0x77,
+ 0xdd, 0xde, 0xd0, 0xcd, 0x48, 0xae, 0x90, 0x8c, 0xd3, 0x10, 0xd2, 0xce, 0xe6, 0xe3, 0xc9, 0xb2,
+ 0x0e, 0x49, 0x18, 0x25, 0x90, 0x76, 0xea, 0xfd, 0xa1, 0xef, 0x9b, 0xec, 0xcd, 0xc7, 0x3a, 0x33,
+ 0xed, 0xd4, 0xa3, 0x44, 0x02, 0x4f, 0x68, 0xec, 0x71, 0x7a, 0x2a, 0x27, 0xc1, 0x87, 0x59, 0xb0,
+ 0x0f, 0x92, 0x06, 0x54, 0xd2, 0x09, 0x8e, 0x33, 0x7c, 0x06, 0x73, 0x06, 0x32, 0x8a, 0xeb, 0xdd,
+ 0xd8, 0xaf, 0xcb, 0xa8, 0x0f, 0x42, 0xd2, 0x7e, 0x3a, 0x89, 0xac, 0x85, 0x2c, 0x64, 0x7a, 0x59,
+ 0x57, 0x2b, 0x83, 0xd6, 0x7e, 0xcd, 0xa3, 0x65, 0x02, 0x69, 0x1c, 0xf9, 0xf4, 0x85, 0xba, 0x0d,
+ 0x7e, 0x8a, 0xb0, 0xda, 0xda, 0xa3, 0x69, 0x1a, 0x47, 0x10, 0x78, 0x51, 0x12, 0xc0, 0x99, 0x63,
+ 0x6d, 0x5b, 0x3b, 0x36, 0x29, 0xab, 0xc8, 0x9e, 0x09, 0xb4, 0x14, 0x8e, 0x5d, 0xf4, 0x51, 0x0c,
+ 0x54, 0xc0, 0x0d, 0xfa, 0x3d, 0x4d, 0x7f, 0xa0, 0x43, 0x73, 0xfc, 0xaf, 0x90, 0x1d, 0x80, 0xf0,
+ 0x9d, 0xdc, 0xb6, 0xb5, 0x53, 0xda, 0xad, 0xb9, 0xd7, 0xa2, 0x4d, 0xee, 0xe2, 0x12, 0x9a, 0x84,
+ 0xb0, 0x0f, 0xc2, 0xe7, 0x51, 0x2a, 0x19, 0x27, 0x9a, 0x8f, 0x5d, 0x94, 0xd7, 0xc5, 0x1c, 0x5b,
+ 0x27, 0x3a, 0x77, 0x24, 0x1e, 0xaa, 0x38, 0x31, 0x34, 0x7c, 0x8c, 0x56, 0x25, 0x1f, 0x24, 0x3e,
+ 0x95, 0x10, 0x78, 0xba, 0x4d, 0x4e, 0x5e, 0x67, 0x7e, 0x7c, 0xe7, 0x96, 0xa7, 0xb2, 0x9d, 0xb1,
+ 0xb5, 0x0a, 0xe4, 0xbe, 0x9c, 0xfb, 0xc6, 0x27, 0x68, 0x39, 0xf4, 0x3d, 0xd9, 0xe5, 0x20, 0xba,
+ 0x2c, 0x0e, 0x9c, 0x45, 0x5d, 0x6c, 0x6b, 0xa6, 0x98, 0xd2, 0xdd, 0xed, 0xc6, 0xbe, 0xdb, 0xce,
+ 0x74, 0x6f, 0xac, 0x8e, 0x47, 0xd5, 0xd2, 0x4f, 0xcd, 0x76, 0x96, 0x45, 0x4a, 0xa1, 0x3f, 0xfd,
+ 0xc0, 0xdf, 0xa1, 0xbc, 0x3a, 0x98, 0x70, 0x96, 0x6e, 0x1d, 0x6c, 0xe2, 0x14, 0x37, 0x73, 0x8a,
+ 0x7b, 0xf4, 0xb2, 0xd9, 0x54, 0x07, 0x11, 0xc4, 0xe4, 0xe0, 0x2f, 0xd1, 0xc6, 0x40, 0x44, 0x49,
+ 0x38, 0xd5, 0x5d, 0xdf, 0xd1, 0xeb, 0xc1, 0xb9, 0x53, 0xda, 0xb6, 0x76, 0x0a, 0x64, 0x4d, 0x87,
+ 0x27, 0xda, 0xeb, 0x3b, 0xfc, 0x0c, 0xe7, 0xf8, 0x0b, 0xb4, 0x34, 0x04, 0x2e, 0x22, 0x96, 0x38,
+ 0xcb, 0x7a, 0xd7, 0xcd, 0x3b, 0xe4, 0x78, 0x69, 0x18, 0x24, 0xa3, 0xe2, 0x63, 0x54, 0xf6, 0x63,
+ 0x26, 0x20, 0xf0, 0xa6, 0x9e, 0x72, 0x56, 0x3e, 0x44, 0x00, 0xfb, 0x62, 0x54, 0x5d, 0x20, 0xab,
+ 0x26, 0x79, 0x0a, 0x7f, 0x6b, 0xff, 0xfd, 0x7b, 0xd5, 0x3a, 0xb0, 0x0b, 0x85, 0x72, 0xf1, 0xc0,
+ 0x2e, 0x14, 0xcb, 0xe8, 0xc0, 0x2e, 0xa0, 0x72, 0xa9, 0xf6, 0x47, 0x01, 0x15, 0x75, 0xfb, 0x5b,
+ 0xc9, 0x29, 0xc3, 0x47, 0x46, 0x1f, 0xd0, 0xde, 0x2b, 0xed, 0x7e, 0xe6, 0xbe, 0xe7, 0x81, 0xb9,
+ 0xb3, 0x36, 0x6e, 0x14, 0xd4, 0xd6, 0x97, 0xa3, 0xaa, 0x65, 0x14, 0x03, 0xbc, 0x85, 0x50, 0x4c,
+ 0x85, 0x9c, 0x33, 0x68, 0x51, 0x21, 0xc6, 0x98, 0x55, 0x54, 0x4a, 0x06, 0x7d, 0x2f, 0x85, 0x24,
+ 0x88, 0x92, 0x50, 0xfb, 0xd3, 0x26, 0x28, 0x19, 0xf4, 0x9f, 0x1b, 0x24, 0x23, 0x04, 0x9c, 0xa5,
+ 0x29, 0x04, 0xda, 0x4d, 0x86, 0xb0, 0x6f, 0x10, 0x5c, 0x43, 0x2b, 0xfa, 0xe1, 0xc4, 0x2c, 0xf4,
+ 0x44, 0xf4, 0x16, 0xb4, 0x47, 0x72, 0xa4, 0xa4, 0xc0, 0x43, 0x16, 0xbe, 0x88, 0xde, 0x02, 0xfe,
+ 0x1e, 0x6d, 0xd2, 0x34, 0xe5, 0xec, 0x2c, 0xea, 0xab, 0x76, 0xa5, 0x9c, 0xa5, 0x4c, 0xd0, 0xd8,
+ 0x7b, 0x3d, 0x60, 0x92, 0x6a, 0x23, 0xe4, 0x88, 0x33, 0xc3, 0x78, 0x3e, 0x21, 0x9c, 0xa8, 0x38,
+ 0xfe, 0x04, 0xad, 0x72, 0x25, 0x8f, 0xd7, 0xa7, 0x67, 0x5e, 0xe7, 0x5c, 0x82, 0x70, 0x0a, 0x3a,
+ 0x65, 0x45, 0xc3, 0x47, 0xf4, 0xac, 0xa1, 0x40, 0xfc, 0x39, 0x5a, 0x9f, 0x3b, 0x89, 0x27, 0xf9,
+ 0x40, 0x48, 0x08, 0x1c, 0xa4, 0xad, 0x81, 0x67, 0x4e, 0xd4, 0x36, 0x11, 0x9c, 0xa2, 0x8d, 0x04,
+ 0xde, 0x80, 0x90, 0xde, 0xad, 0x4e, 0x97, 0xb4, 0xfc, 0xbb, 0xef, 0x97, 0x3f, 0xeb, 0x9c, 0xdb,
+ 0x6c, 0xff, 0x98, 0x48, 0x7e, 0x3e, 0x69, 0xff, 0xba, 0x29, 0xdc, 0x9c, 0x37, 0x01, 0xfe, 0x05,
+ 0x6d, 0x50, 0x5f, 0x46, 0x43, 0xb8, 0xbd, 0xe3, 0xf2, 0x87, 0x7b, 0x6b, 0xdd, 0xd4, 0xb8, 0x59,
+ 0xfc, 0x6b, 0xb4, 0xa1, 0x25, 0x39, 0x05, 0x08, 0x3c, 0x0e, 0x61, 0x24, 0x24, 0xa7, 0x32, 0x62,
+ 0x89, 0xd0, 0xc6, 0xcd, 0x91, 0x87, 0xd3, 0x30, 0x99, 0x8d, 0xe2, 0x6f, 0xd0, 0xa3, 0xf9, 0xa6,
+ 0x78, 0x1d, 0x35, 0xdd, 0x8c, 0x69, 0xee, 0x9b, 0xd4, 0x74, 0xb6, 0x29, 0x0d, 0x2a, 0xc0, 0x38,
+ 0xe8, 0x07, 0xf4, 0xe4, 0x46, 0x2a, 0x07, 0x33, 0x1b, 0x5f, 0x0f, 0x60, 0x00, 0xce, 0xea, 0x76,
+ 0x6e, 0x27, 0x47, 0x1e, 0xcd, 0x65, 0x13, 0xc3, 0x38, 0x51, 0x04, 0xfc, 0x29, 0x2a, 0x4a, 0x48,
+ 0x68, 0x22, 0xbd, 0x28, 0x70, 0xca, 0xca, 0x5f, 0x8d, 0xe5, 0xf1, 0xa8, 0x5a, 0x68, 0x6b, 0xb0,
+ 0xb5, 0x4f, 0x0a, 0x26, 0xdc, 0x0a, 0xb4, 0x99, 0x99, 0xdf, 0xf3, 0x24, 0xed, 0xc4, 0xe0, 0x3c,
+ 0xd8, 0xb6, 0x76, 0x8a, 0xa4, 0xa8, 0x90, 0xb6, 0x02, 0x36, 0xff, 0xb1, 0xd0, 0xd2, 0xa4, 0x09,
+ 0xf8, 0x15, 0x5a, 0x4a, 0x58, 0x00, 0xaa, 0xa6, 0x7a, 0x48, 0xf9, 0xc6, 0xde, 0x78, 0x54, 0x5d,
+ 0x3c, 0x66, 0x01, 0xb4, 0xf6, 0xff, 0x1d, 0x55, 0x9f, 0x85, 0x91, 0xec, 0x0e, 0x3a, 0xae, 0xcf,
+ 0xfa, 0xf5, 0xa9, 0xde, 0x41, 0xe7, 0x7a, 0x5d, 0x4f, 0x7b, 0x61, 0x3d, 0x1b, 0x0d, 0x26, 0x8d,
+ 0x2c, 0xaa, 0x8a, 0xad, 0xe0, 0xce, 0xc1, 0x70, 0xef, 0xff, 0x0f, 0x06, 0xfc, 0x04, 0xd9, 0xfd,
+ 0x98, 0x46, 0xfa, 0xf5, 0xe5, 0x1a, 0x85, 0xf1, 0xa8, 0x6a, 0x1f, 0x1d, 0xee, 0xb5, 0x88, 0x46,
+ 0xf1, 0x1a, 0xca, 0x43, 0xca, 0xfc, 0xae, 0xfe, 0x0d, 0xc8, 0x11, 0xf3, 0x61, 0x86, 0xc9, 0x74,
+ 0xa4, 0xd8, 0xe5, 0xbc, 0x19, 0x29, 0x35, 0x82, 0xca, 0x87, 0x54, 0xfa, 0xdd, 0x23, 0x9a, 0xd0,
+ 0x10, 0xb8, 0x1e, 0x29, 0x5b, 0x08, 0x71, 0xa0, 0x81, 0xe7, 0xb3, 0x41, 0x22, 0xb5, 0x1c, 0x39,
+ 0x52, 0x54, 0x48, 0x53, 0x01, 0xea, 0x89, 0xbf, 0xe1, 0x91, 0x84, 0x49, 0xfc, 0x9e, 0x8e, 0x23,
+ 0x0d, 0x69, 0x42, 0xe3, 0xe9, 0xc5, 0x5f, 0x95, 0x85, 0x8b, 0x71, 0xc5, 0xba, 0x1c, 0x57, 0xac,
+ 0x77, 0xe3, 0x8a, 0xf5, 0xe7, 0xb8, 0x62, 0xfd, 0x76, 0x55, 0x59, 0xb8, 0xbc, 0xaa, 0x2c, 0xbc,
+ 0xbb, 0xaa, 0x2c, 0xbc, 0x42, 0xd7, 0xff, 0x0e, 0x3a, 0x8b, 0xfa, 0x17, 0xf6, 0xd9, 0x7f, 0x01,
+ 0x00, 0x00, 0xff, 0xff, 0x23, 0xeb, 0x99, 0xc3, 0x3e, 0x08, 0x00, 0x00,
}
diff --git a/pkg/kv/kvserver/kvserverpb/state.proto b/pkg/kv/kvserver/kvserverpb/state.proto
index f8288300aeac..45e07446177e 100644
--- a/pkg/kv/kvserver/kvserverpb/state.proto
+++ b/pkg/kv/kvserver/kvserverpb/state.proto
@@ -100,6 +100,14 @@ message ReplicaState {
// [2]: PurgeOutdatedReplicas
roachpb.Version version = 12;
+ // closed_timestamp is the largest timestamp that is known to have been
+ // closed. This means that the current leaseholder (if any) and any future
+ // leaseholder will not evaluate writes at or below this timestamp, and also
+ // that any in-flight commands that can still apply are writing at higher
+ // timestamps. Non-leaseholder replicas are free to serve "follower reads" at
+ // or below this timestamp.
+ util.hlc.Timestamp closed_timestamp = 13 [(gogoproto.nullable) = false];
+
reserved 8, 9, 10;
}
diff --git a/pkg/kv/kvserver/replica.go b/pkg/kv/kvserver/replica.go
index e602af9193b0..d21fad488468 100644
--- a/pkg/kv/kvserver/replica.go
+++ b/pkg/kv/kvserver/replica.go
@@ -360,6 +360,10 @@ type Replica struct {
// consumed, commands are proposed through Raft and moved to the
// proposals map.
//
+ // The propBuf is the one closing timestamps, so evaluating writes must be
+ // registered with the propBuf through TrackEvaluatingRequest before their
+ // write timestamp is decided.
+ //
// Access to proposalBuf must occur *without* holding the mutex.
// Instead, the buffer internally holds a reference to mu and will use
// it appropriately.
@@ -722,6 +726,10 @@ func (r *Replica) descRLocked() *roachpb.RangeDescriptor {
return r.mu.state.Desc
}
+// closedTimestampPolicyRLocked returns the closed timestamp policy of the
+// range, which is updated asynchronously through gossip of zone configurations.
+// NOTE: an exported version of this method which does not require the replica
+// lock exists in helpers_test.go. Move here if needed.
func (r *Replica) closedTimestampPolicyRLocked() roachpb.RangeClosedTimestampPolicy {
if r.mu.zone.GlobalReads != nil && *r.mu.zone.GlobalReads {
return roachpb.LEAD_FOR_GLOBAL_READS
diff --git a/pkg/kv/kvserver/replica_application_result.go b/pkg/kv/kvserver/replica_application_result.go
index a2761aa41bbd..90c9d0247bf1 100644
--- a/pkg/kv/kvserver/replica_application_result.go
+++ b/pkg/kv/kvserver/replica_application_result.go
@@ -205,6 +205,16 @@ func (r *Replica) tryReproposeWithNewLeaseIndex(
minTS, untrack := r.store.cfg.ClosedTimestamp.Tracker.Track(ctx)
defer untrack(ctx, 0, 0, 0) // covers all error paths below
+
+ // We need to track the request again in order to protect its timestamp until
+ // it gets reproposed.
+ // TODO(andrei): Only track if the request consults the ts cache. Some
+ // requests (e.g. EndTxn) don't care about closed timestamps.
+ minTS2, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, p.Request.WriteTimestamp())
+ defer tok.DoneIfNotMoved(ctx)
+ minTS.Forward(minTS2)
+
+ // NB: p.Request.Timestamp reflects the action of ba.SetActiveTimestamp.
// The IsIntentWrite condition matches the similar logic for caring
// about the closed timestamp cache in applyTimestampCache().
if p.Request.IsIntentWrite() && p.Request.WriteTimestamp().LessEq(minTS) {
@@ -222,7 +232,7 @@ func (r *Replica) tryReproposeWithNewLeaseIndex(
// Some tests check for this log message in the trace.
log.VEventf(ctx, 2, "retry: proposalIllegalLeaseIndex")
- maxLeaseIndex, pErr := r.propose(ctx, p)
+ maxLeaseIndex, pErr := r.propose(ctx, p, tok.Move(ctx))
if pErr != nil {
return pErr
}
@@ -246,7 +256,7 @@ func (r *Replica) handleSplitResult(ctx context.Context, split *kvserverpb.Split
func (r *Replica) handleMergeResult(ctx context.Context, merge *kvserverpb.Merge) {
if err := r.store.MergeRange(
- ctx, r, merge.LeftDesc, merge.RightDesc, merge.FreezeStart,
+ ctx, r, merge.LeftDesc, merge.RightDesc, merge.FreezeStart, merge.RightClosedTimestamp,
); err != nil {
// Our in-memory state has diverged from the on-disk state.
log.Fatalf(ctx, "failed to update store after merging range: %s", err)
diff --git a/pkg/kv/kvserver/replica_application_state_machine.go b/pkg/kv/kvserver/replica_application_state_machine.go
index cfd7cef7a35b..7793ca520fdd 100644
--- a/pkg/kv/kvserver/replica_application_state_machine.go
+++ b/pkg/kv/kvserver/replica_application_state_machine.go
@@ -376,8 +376,10 @@ type replicaAppBatch struct {
// replicaState other than Stats are overwritten completely rather than
// updated in-place.
stats enginepb.MVCCStats
- // maxTS is the maximum clock timestamp that any command that was staged in
- // this batch was evaluated at.
+ // maxTS is the maximum clock timestamp that this command carries. Timestamps
+ // come from the writes that are part of this command, and also from the
+ // closed timestamp carried by this command. Synthetic timestamps are not
+ // registered here.
maxTS hlc.ClockTimestamp
// migrateToAppliedStateKey tracks whether any command in the batch
// triggered a migration to the replica applied state key. If so, this
@@ -428,7 +430,8 @@ func (b *replicaAppBatch) Stage(cmdI apply.Command) (apply.CheckedCommand, error
return nil, makeNonDeterministicFailure("applied index jumped from %d to %d", applied, idx)
}
if log.V(4) {
- log.Infof(ctx, "processing command %x: maxLeaseIndex=%d", cmd.idKey, cmd.raftCmd.MaxLeaseIndex)
+ log.Infof(ctx, "processing command %x: raftIndex=%d maxLeaseIndex=%d closedts=%s",
+ cmd.idKey, cmd.ent.Index, cmd.raftCmd.MaxLeaseIndex, cmd.raftCmd.ClosedTimestamp)
}
// Determine whether the command should be applied to the replicated state
@@ -442,7 +445,20 @@ func (b *replicaAppBatch) Stage(cmdI apply.Command) (apply.CheckedCommand, error
cmd.raftCmd.ReplicatedEvalResult = kvserverpb.ReplicatedEvalResult{}
cmd.raftCmd.WriteBatch = nil
cmd.raftCmd.LogicalOpLog = nil
+ cmd.raftCmd.ClosedTimestamp.Reset()
} else {
+ // Assert that we're not writing under the closed timestamp. We can only do
+ // these checks on IsIntentWrite requests, since others (for example,
+ // EndTxn) can operate below the closed timestamp. In turn, this means that
+ // we can only assert on the leaseholder, as only that replica has
+ // cmd.proposal.Request filled in.
+ if cmd.IsLocal() && cmd.proposal.Request.IsIntentWrite() {
+ wts := cmd.proposal.Request.WriteTimestamp()
+ if wts.LessEq(b.state.ClosedTimestamp) {
+ return nil, makeNonDeterministicFailure("writing at %s below closed ts: %s (%s)",
+ wts, b.state.ClosedTimestamp.String(), cmd.proposal.Request.String())
+ }
+ }
log.Event(ctx, "applying command")
}
@@ -623,7 +639,7 @@ func (b *replicaAppBatch) runPreApplyTriggersAfterStagingWriteBatch(
//
// Alternatively if we discover that the RHS has already been removed
// from this store, clean up its data.
- splitPreApply(ctx, b.batch, res.Split.SplitTrigger, b.r)
+ splitPreApply(ctx, b.batch, res.Split.SplitTrigger, b.r, cmd.raftCmd.ClosedTimestamp)
// The rangefeed processor will no longer be provided logical ops for
// its entire range, so it needs to be shut down and all registrations
@@ -807,6 +823,18 @@ func (b *replicaAppBatch) stageTrivialReplicatedEvalResult(
if leaseAppliedIndex := cmd.leaseIndex; leaseAppliedIndex != 0 {
b.state.LeaseAppliedIndex = leaseAppliedIndex
}
+ if cts := cmd.raftCmd.ClosedTimestamp; !cts.IsEmpty() {
+ if cts.Less(b.state.ClosedTimestamp) {
+ log.Fatalf(ctx,
+ "closed timestamp regressing from %s to %s when applying command %x",
+ b.state.ClosedTimestamp, cts, cmd.idKey)
+ }
+ b.state.ClosedTimestamp = cts
+ if clockTS, ok := cts.TryToClockTimestamp(); ok {
+ b.maxTS.Forward(clockTS)
+ }
+ }
+
res := cmd.replicatedResult()
// Special-cased MVCC stats handling to exploit commutativity of stats delta
@@ -860,10 +888,11 @@ func (b *replicaAppBatch) ApplyToStateMachine(ctx context.Context) error {
b.batch.Close()
b.batch = nil
- // Update the replica's applied indexes and mvcc stats.
+ // Update the replica's applied indexes, mvcc stats and closed timestamp.
r.mu.Lock()
r.mu.state.RaftAppliedIndex = b.state.RaftAppliedIndex
r.mu.state.LeaseAppliedIndex = b.state.LeaseAppliedIndex
+ closedTimestampUpdated := r.mu.state.ClosedTimestamp.Forward(b.state.ClosedTimestamp)
prevStats := *r.mu.state.Stats
*r.mu.state.Stats = *b.state.Stats
@@ -879,6 +908,13 @@ func (b *replicaAppBatch) ApplyToStateMachine(ctx context.Context) error {
needsTruncationByLogSize := r.needsRaftLogTruncationLocked()
tenantID := r.mu.tenantID
r.mu.Unlock()
+ if closedTimestampUpdated {
+ // TODO(andrei): Pass in the new closed timestamp to
+ // r.handleClosedTimestampUpdateRaftMuLocked directly after the old closed
+ // ts tracker goes away. Until then we can't do it; we have to let the
+ // method consult r.maxClosed().
+ r.handleClosedTimestampUpdateRaftMuLocked(ctx)
+ }
// Record the stats delta in the StoreMetrics.
deltaStats := *b.state.Stats
@@ -926,7 +962,8 @@ func (b *replicaAppBatch) addAppliedStateKeyToBatch(ctx context.Context) error {
// Set the range applied state, which includes the last applied raft and
// lease index along with the mvcc stats, all in one key.
if err := loader.SetRangeAppliedState(
- ctx, b.batch, b.state.RaftAppliedIndex, b.state.LeaseAppliedIndex, b.state.Stats,
+ ctx, b.batch, b.state.RaftAppliedIndex, b.state.LeaseAppliedIndex,
+ b.state.Stats, &b.state.ClosedTimestamp,
); err != nil {
return wrapWithNonDeterministicFailure(err, "unable to set range applied state")
}
diff --git a/pkg/kv/kvserver/replica_command.go b/pkg/kv/kvserver/replica_command.go
index 996fb16630c0..be67327eba17 100644
--- a/pkg/kv/kvserver/replica_command.go
+++ b/pkg/kv/kvserver/replica_command.go
@@ -744,10 +744,11 @@ func (r *Replica) AdminMerge(
Commit: true,
InternalCommitTrigger: &roachpb.InternalCommitTrigger{
MergeTrigger: &roachpb.MergeTrigger{
- LeftDesc: updatedLeftDesc,
- RightDesc: rightDesc,
- RightMVCCStats: rhsSnapshotRes.MVCCStats,
- FreezeStart: rhsSnapshotRes.FreezeStart,
+ LeftDesc: updatedLeftDesc,
+ RightDesc: rightDesc,
+ RightMVCCStats: rhsSnapshotRes.MVCCStats,
+ FreezeStart: rhsSnapshotRes.FreezeStart,
+ RightClosedTimestamp: rhsSnapshotRes.ClosedTimestamp,
},
},
})
diff --git a/pkg/kv/kvserver/replica_eval_context_span.go b/pkg/kv/kvserver/replica_eval_context_span.go
index 0e8d519a6893..3eff1ee1bf0b 100644
--- a/pkg/kv/kvserver/replica_eval_context_span.go
+++ b/pkg/kv/kvserver/replica_eval_context_span.go
@@ -117,6 +117,22 @@ func (rec *SpanSetReplicaEvalContext) GetTracker() closedts.TrackerI {
return rec.i.GetTracker()
}
+// FrozenClosedTimestamp is part of the EvalContext interface.
+func (rec *SpanSetReplicaEvalContext) FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp {
+ // To capture a closed timestamp, all keys must be latched to prevent any
+ // concurrent writes (which could advance the closed timestamp).
+ desc := rec.i.Desc()
+ rec.ss.AssertAllowed(spanset.SpanReadWrite, roachpb.Span{
+ Key: keys.MakeRangeKeyPrefix(desc.StartKey),
+ EndKey: keys.MakeRangeKeyPrefix(desc.EndKey),
+ })
+ rec.ss.AssertAllowed(spanset.SpanReadWrite, roachpb.Span{
+ Key: desc.StartKey.AsRawKey(),
+ EndKey: desc.EndKey.AsRawKey(),
+ })
+ return rec.i.FrozenClosedTimestamp(ctx)
+}
+
// IsFirstRange returns true iff the replica belongs to the first range.
func (rec *SpanSetReplicaEvalContext) IsFirstRange() bool {
return rec.i.IsFirstRange()
diff --git a/pkg/kv/kvserver/replica_follower_read.go b/pkg/kv/kvserver/replica_follower_read.go
index cdc35c0b3778..fdc55e0dad92 100644
--- a/pkg/kv/kvserver/replica_follower_read.go
+++ b/pkg/kv/kvserver/replica_follower_read.go
@@ -141,13 +141,34 @@ func (r *Replica) maxClosedRLocked(ctx context.Context) (_ hlc.Timestamp, ok boo
lai := r.mu.state.LeaseAppliedIndex
lease := *r.mu.state.Lease
initialMaxClosed := r.mu.initialMaxClosed
+ replicaStateClosed := r.mu.state.ClosedTimestamp
if lease.Expiration != nil {
return hlc.Timestamp{}, false
}
+ // Look at the legacy closed timestamp propagation mechanism.
maxClosed := r.store.cfg.ClosedTimestamp.Provider.MaxClosed(
lease.Replica.NodeID, r.RangeID, ctpb.Epoch(lease.Epoch), ctpb.LAI(lai))
maxClosed.Forward(lease.Start.ToTimestamp())
maxClosed.Forward(initialMaxClosed)
+
+ // Look at the "new" closed timestamp propagation mechanism.
+ maxClosed.Forward(replicaStateClosed)
+
return maxClosed, true
}
+
+// FrozenClosedTimestamp returns the closed timestamp. Unlike
+// MaxClosedTimestamp, it only looks at the "new" closed timestamp mechanism,
+// ignoring the old one. It returns an empty result if the new mechanism is not
+// enabled yet. The new mechanism has better properties than the old one -
+// namely the closing of timestamps is synchronized with subsumption requests
+// (through latches). Callers who need that property should be prepared to get
+// an empty result back, meaning that the closed timestamp cannot be known.
+func (r *Replica) FrozenClosedTimestamp(ctx context.Context) hlc.Timestamp {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+ // TODO(andrei): Make sure that this synchronizes with the closed timestamps
+ // side-transport once the side-transport is written.
+ return r.mu.state.ClosedTimestamp
+}
diff --git a/pkg/kv/kvserver/replica_init.go b/pkg/kv/kvserver/replica_init.go
index de73dd090f99..c64027597c26 100644
--- a/pkg/kv/kvserver/replica_init.go
+++ b/pkg/kv/kvserver/replica_init.go
@@ -18,6 +18,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/keys"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/abortspan"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts/tracker"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/concurrency"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/split"
@@ -95,8 +96,9 @@ func newUnloadedReplica(
})
r.mu.proposals = map[kvserverbase.CmdIDKey]*ProposalData{}
r.mu.checksums = map[uuid.UUID]ReplicaChecksum{}
- r.mu.proposalBuf.Init((*replicaProposer)(r))
+ r.mu.proposalBuf.Init((*replicaProposer)(r), tracker.NewLockfreeTracker(), r.Clock(), r.ClusterSettings())
r.mu.proposalBuf.testing.allowLeaseProposalWhenNotLeader = store.cfg.TestingKnobs.AllowLeaseRequestProposalsWhenNotLeader
+ r.mu.proposalBuf.testing.dontCloseTimestamps = store.cfg.TestingKnobs.DontCloseTimestamps
if leaseHistoryMaxEntries > 0 {
r.leaseHistory = newLeaseHistory()
diff --git a/pkg/kv/kvserver/replica_proposal.go b/pkg/kv/kvserver/replica_proposal.go
index d4af67968b54..5ccc84b1025f 100644
--- a/pkg/kv/kvserver/replica_proposal.go
+++ b/pkg/kv/kvserver/replica_proposal.go
@@ -114,6 +114,15 @@ type ProposalData struct {
// here; this could be replaced with isLease and isChangeReplicas
// booleans.
Request *roachpb.BatchRequest
+
+ // leaseStatus represents the lease under which the Request was evaluated and
+ // under which this proposal is being made. For lease requests, this is the
+ // previous lease that the requester was aware of.
+ leaseStatus kvserverpb.LeaseStatus
+
+ // tok identifies the request to the propBuf. Once the proposal is made, the
+ // token will be used to stop tracking this request.
+ tok TrackedRequestToken
}
// finishApplication is called when a command application has finished. The
@@ -327,6 +336,10 @@ const (
func (r *Replica) leasePostApplyLocked(
ctx context.Context, prevLease *roachpb.Lease, newLease *roachpb.Lease, jumpOpt leaseJumpOption,
) {
+ // Note that we actually install the lease further down in this method.
+ // Everything we do before then doesn't need to worry about requests being
+ // evaluated under the new lease.
+
// Sanity check to make sure that the lease sequence is moving in the right
// direction.
if s1, s2 := prevLease.Sequence, newLease.Sequence; s1 != 0 {
@@ -412,6 +425,10 @@ func (r *Replica) leasePostApplyLocked(
// to not matter).
r.concMgr.OnRangeLeaseUpdated(newLease.Sequence, iAmTheLeaseHolder)
+ // Inform the propBuf about the new lease so that it can initialize its closed
+ // timestamp tracking.
+ r.mu.proposalBuf.OnLeaseChangeLocked(iAmTheLeaseHolder, r.mu.state.ClosedTimestamp)
+
// Ordering is critical here. We only install the new lease after we've
// checked for an in-progress merge and updated the timestamp cache. If the
// ordering were reversed, it would be possible for requests to see the new
@@ -833,6 +850,7 @@ func (r *Replica) requestToProposal(
ctx context.Context,
idKey kvserverbase.CmdIDKey,
ba *roachpb.BatchRequest,
+ st kvserverpb.LeaseStatus,
lul hlc.Timestamp,
latchSpans *spanset.SpanSet,
) (*ProposalData, *roachpb.Error) {
@@ -840,11 +858,12 @@ func (r *Replica) requestToProposal(
// Fill out the results even if pErr != nil; we'll return the error below.
proposal := &ProposalData{
- ctx: ctx,
- idKey: idKey,
- doneCh: make(chan proposalResult, 1),
- Local: &res.Local,
- Request: ba,
+ ctx: ctx,
+ idKey: idKey,
+ doneCh: make(chan proposalResult, 1),
+ Local: &res.Local,
+ Request: ba,
+ leaseStatus: st,
}
if needConsensus {
diff --git a/pkg/kv/kvserver/replica_proposal_buf.go b/pkg/kv/kvserver/replica_proposal_buf.go
index f5b31c1db79a..f991c35f41c9 100644
--- a/pkg/kv/kvserver/replica_proposal_buf.go
+++ b/pkg/kv/kvserver/replica_proposal_buf.go
@@ -15,7 +15,13 @@ import (
"sync"
"sync/atomic"
+ "github.com/cockroachdb/cockroach/pkg/clusterversion"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts/tracker"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverpb"
"github.com/cockroachdb/cockroach/pkg/roachpb"
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/cockroach/pkg/util/log"
"github.com/cockroachdb/cockroach/pkg/util/protoutil"
"github.com/cockroachdb/errors"
@@ -105,8 +111,8 @@ func (c *propBufCnt) read() propBufCntRes {
return propBufCntRes(atomic.LoadUint64((*uint64)(c)))
}
-// propBuf is a multi-producer, single-consumer buffer for Raft proposals. The
-// buffer supports concurrent insertion of proposals.
+// propBuf is a multi-producer, single-consumer buffer for Raft proposals on a
+// range. The buffer supports concurrent insertion of proposals.
//
// The proposal buffer also handles the assignment of maximum lease indexes for
// commands. Picking the maximum lease index for commands is done atomically
@@ -116,6 +122,11 @@ func (c *propBufCnt) read() propBufCntRes {
// get out of sync then some commands would necessarily be rejected beneath Raft
// during application (see checkForcedErr).
//
+// The proposal buffer also is in charge of advancing the respective range's
+// closed timestamp by assigning closed timestamp to proposals. For this
+// purpose, new requests starting evaluation needs to synchronize with the
+// proposal buffer (see TrackEvaluatingRequest).
+//
// Proposals enter the buffer via Insert() or ReinsertLocked(). They are moved
// into Raft via FlushLockedWithRaftGroup() when the buffer fills up, or during
// the next handleRaftReady iteration, whichever happens earlier. This
@@ -127,13 +138,35 @@ func (c *propBufCnt) read() propBufCntRes {
// initialization. Methods called "...Locked" and "...RLocked" expect the
// corresponding locker() and rlocker() to be held.
type propBuf struct {
- p proposer
- full sync.Cond
+ p proposer
+ clock *hlc.Clock
+ settings *cluster.Settings
+ // evalTracker tracks currently-evaluating requests, making sure that
+ // proposals coming out of the propBuf don't carry closed timestamps below
+ // currently-evaluating requests.
+ evalTracker tracker.Tracker
+ full sync.Cond
liBase uint64
cnt propBufCnt
arr propBufArray
+ // assignedClosedTimestamp is the largest "closed timestamp" - i.e. the largest
+ // timestamp that was communicated to other replicas as closed, representing a
+ // promise that this leaseholder will not evaluate writes below this timestamp
+ // any more.
+ //
+ // Note that this field is not used by the local replica (or by anybody)
+ // directly to decide whether follower reads can be served. See
+ // ReplicaState.closed_timestamp.
+ //
+ // This field can be read under the proposer's read lock, and written to under
+ // the write lock.
+ assignedClosedTimestamp hlc.Timestamp
+
+ // A buffer used to avoid allocations.
+ tmpClosedTimestampFooter kvserverpb.ClosedTimestampFooter
+
testing struct {
// leaseIndexFilter can be used by tests to override the max lease index
// assigned to a proposal by returning a non-zero lease index.
@@ -151,6 +184,8 @@ type propBuf struct {
// heartbeats and then expect other replicas to take the lease without
// worrying about Raft).
allowLeaseProposalWhenNotLeader bool
+ // dontCloseTimestamps inhibits the closing of timestamps.
+ dontCloseTimestamps bool
}
}
@@ -178,6 +213,12 @@ type proposer interface {
destroyed() destroyStatus
leaseAppliedIndex() uint64
enqueueUpdateCheck()
+ closeTimestampPolicy() roachpb.RangeClosedTimestampPolicy
+ // raftTransportClosedTimestampEnabled returns whether the range has switched
+ // to the Raft-based closed timestamp transport.
+ // TODO(andrei): This shouldn't be needed any more in 21.2, once the Raft
+ // transport is unconditionally enabled.
+ raftTransportClosedTimestampEnabled() bool
// The following require the proposer to hold an exclusive lock.
withGroupLocked(func(proposerRaft) error) error
registerProposalLocked(*ProposalData)
@@ -205,9 +246,14 @@ type proposerRaft interface {
}
// Init initializes the proposal buffer and binds it to the provided proposer.
-func (b *propBuf) Init(p proposer) {
+func (b *propBuf) Init(
+ p proposer, tracker tracker.Tracker, clock *hlc.Clock, settings *cluster.Settings,
+) {
b.p = p
b.full.L = p.rlocker()
+ b.clock = clock
+ b.evalTracker = tracker
+ b.settings = settings
b.liBase = p.leaseAppliedIndex()
}
@@ -225,12 +271,20 @@ func (b *propBuf) LastAssignedLeaseIndexRLocked() uint64 {
// proposer's Raft group. The method accepts the Raft command as part of the
// ProposalData struct, along with a partial encoding of the command in the
// provided byte slice. It is expected that the byte slice contains marshaled
-// information for all of the command's fields except for its max lease index,
-// which is assigned by the method when the command is sequenced in the buffer.
-// It is also expected that the byte slice has sufficient capacity to marshal
-// the maximum lease index field into it. After adding the proposal to the
+// information for all of the command's fields except for MaxLeaseIndex, and
+// ClosedTimestamp. MaxLeaseIndex is assigned here, when the command is
+// sequenced in the buffer. ClosedTimestamp will be assigned later, when the
+// buffer is flushed. It is also expected that the byte slice has sufficient
+// capacity to marshal these fields into it. After adding the proposal to the
// buffer, the assigned max lease index is returned.
-func (b *propBuf) Insert(ctx context.Context, p *ProposalData, data []byte) (uint64, error) {
+//
+// Insert takes ownership of the supplied token; the caller should tok.Move() it
+// into this method. It will be used to untrack the request once it comes out of the
+// proposal buffer.
+func (b *propBuf) Insert(
+ ctx context.Context, p *ProposalData, data []byte, tok TrackedRequestToken,
+) (uint64, error) {
+ defer tok.DoneIfNotMoved(ctx)
// Request a new max lease applied index for any request that isn't itself
// a lease request. Lease requests don't need unique max lease index values
// because their max lease indexes are ignored. See checkForcedErr.
@@ -252,6 +306,10 @@ func (b *propBuf) Insert(ctx context.Context, p *ProposalData, data []byte) (uin
}
// Assign the command's maximum lease index.
+ // TODO(andrei): Move this to Flush in 21.2, to mirror the assignment of the
+ // closed timestamp. For now it's needed here because Insert needs to return
+ // the MLAI for the benefit of the "old" closed timestamp tracker. When moving
+ // to flush, make sure to not reassign it on reproposals.
p.command.MaxLeaseIndex = b.liBase + res.leaseIndexOffset()
if filter := b.testing.leaseIndexFilter; filter != nil {
if override, err := filter(p); err != nil {
@@ -277,7 +335,9 @@ func (b *propBuf) Insert(ctx context.Context, p *ProposalData, data []byte) (uin
return 0, err
}
- // Insert the proposal into the buffer's array.
+ // Insert the proposal into the buffer's array. The buffer now takes ownership
+ // of the token.
+ p.tok = tok.Move(ctx)
b.insertIntoArray(p, res.arrayIndex())
// Return the maximum lease index that the proposal's command was given.
@@ -458,6 +518,8 @@ func (b *propBuf) FlushLockedWithRaftGroup(
}
}
+ closedTSTarget := b.computeClosedTimestampTarget()
+
// Remember the first error that we see when proposing the batch. We don't
// immediately return this error because we want to finish clearing out the
// buffer and registering each of the proposals with the proposer, but we
@@ -516,6 +578,11 @@ func (b *propBuf) FlushLockedWithRaftGroup(
}
}
+ // Exit the tracker.
+ reproposal := !p.tok.stillTracked()
+ if !reproposal {
+ p.tok.doneLocked(ctx)
+ }
// Raft processing bookkeeping.
b.p.registerProposalLocked(p)
@@ -538,6 +605,20 @@ func (b *propBuf) FlushLockedWithRaftGroup(
continue
}
+ // Figure out what closed timestamp this command will carry.
+ //
+ // If this is a reproposal, we don't reassign the closed timestamp. We
+ // could, in principle, but we'd have to make a copy of the encoded command
+ // as to not modify the copy that's already stored in the local replica's
+ // raft entry cache.
+ if !reproposal {
+ err := b.assignClosedTimestampToProposalLocked(ctx, p, closedTSTarget)
+ if err != nil {
+ firstErr = err
+ continue
+ }
+ }
+
// Coordinate proposing the command to etcd/raft.
if crt := p.command.ReplicatedEvalResult.ChangeReplicas; crt != nil {
// Flush any previously batched (non-conf change) proposals to
@@ -596,6 +677,121 @@ func (b *propBuf) FlushLockedWithRaftGroup(
return used, proposeBatch(raftGroup, b.p.replicaID(), ents)
}
+// computeClosedTimestampTarget computes the timestamp we'd like to close for
+// our range. Note that we might not be able to ultimately close this timestamp
+// if there's requests in flight.
+func (b *propBuf) computeClosedTimestampTarget() hlc.Timestamp {
+ now := b.clock.Now().WallTime
+ closedTSPolicy := b.p.closeTimestampPolicy()
+ var closedTSTarget hlc.Timestamp
+ switch closedTSPolicy {
+ case roachpb.LAG_BY_CLUSTER_SETTING, roachpb.LEAD_FOR_GLOBAL_READS:
+ targetDuration := closedts.TargetDuration.Get(&b.settings.SV)
+ closedTSTarget = hlc.Timestamp{WallTime: now - targetDuration.Nanoseconds()}
+ // TODO(andrei,nvanbenschoten): Resolve all the issues preventing us from closing
+ // timestamps in the future (which, in turn, forces future-time writes on
+ // global ranges), and enable the proper logic below.
+ //case roachpb.LEAD_FOR_GLOBAL_READS:
+ // closedTSTarget = hlc.Timestamp{
+ // WallTime: now + 2*b.clock.MaxOffset().Nanoseconds(),
+ // Synthetic: true,
+ // }
+ }
+ return closedTSTarget
+}
+
+// assignClosedTimestampToProposalLocked assigns a closed timestamp to be carried by
+// an outgoing proposal.
+//
+// This shouldn't be called for reproposals.
+func (b *propBuf) assignClosedTimestampToProposalLocked(
+ ctx context.Context, p *ProposalData, closedTSTarget hlc.Timestamp,
+) error {
+ if b.testing.dontCloseTimestamps {
+ return nil
+ }
+ // If the Raft transport is not enabled yet, bail. If the range has already
+ // started publishing closed timestamps using Raft, then it doesn't matter
+ // whether this node found out about the version bump yet.
+ if !b.p.raftTransportClosedTimestampEnabled() &&
+ !b.settings.Version.IsActive(ctx, clusterversion.ClosedTimestampsRaftTransport) {
+ return nil
+ }
+
+ // For lease requests, we make a distinction between lease extensions and
+ // brand new leases. Brand new leases carry a closed timestamp equal to the
+ // lease start time. Lease extensions don't get a closed timestamp. This is
+ // because they're proposed without a MLAI, and so two lease extensions might
+ // commute and both apply which would result in a closed timestamp regression.
+ // The command application side doesn't bother protecting against such
+ // regressions.
+ // Lease transfers behave like regular proposals. Note that transfers
+ // carry a summary of the timestamp cache, so the new leaseholder will be
+ // aware of all the reads performed by the previous leaseholder.
+ isBrandNewLeaseRequest := false
+ if p.Request.IsLeaseRequest() {
+ // We read the lease from the ReplicatedEvalResult, not from leaseReq, because the
+ // former is more up to date, having been modified by the evaluation.
+ newLease := p.command.ReplicatedEvalResult.State.Lease
+ oldLease := p.leaseStatus.Lease
+ leaseExtension := newLease.Sequence == oldLease.Sequence
+ if leaseExtension {
+ return nil
+ }
+ isBrandNewLeaseRequest = true
+ // For brand new leases, we close the lease start time. Since this proposing
+ // replica is not the leaseholder, the previous target is meaningless.
+ closedTSTarget = newLease.Start.ToTimestamp()
+ }
+ if !isBrandNewLeaseRequest {
+ lb := b.evalTracker.LowerBound(ctx)
+ if !lb.IsEmpty() {
+ // If the tracker told us that requests are currently evaluating at
+ // timestamps >= lb, then we can close up to lb.Prev(). We use FloorPrev()
+ // to get rid of the logical ticks; we try to not publish closed ts with
+ // logical ticks when there's no good reason for them.
+ closedTSTarget.Backward(lb.FloorPrev())
+ }
+ // We can't close timestamps above the current lease's expiration(*). This is
+ // in order to keep the monotonic property of closed timestamps carried by
+ // commands, which makes for straight-forward closed timestamp management on
+ // the command application side: if we allowed requests to close timestamps
+ // above the lease's expiration, then a future LeaseRequest proposed by
+ // another node might carry a lower closed timestamp (i.e. the lease start
+ // time).
+ // (*) If we've previously closed a higher timestamp under a previous lease
+ // with a higher expiration, then requests will keep carrying that closed
+ // timestamp; we won't regress the closed timestamp.
+ //
+ // HACK(andrei): We declare the lease expiration to be synthetic by fiat,
+ // because it frequently is synthetic even though currently it's not marked
+ // as such. See the TODO in Timestamp.Add() about the work remaining to
+ // properly mark these timestamps as synthetic. We need to make sure it's
+ // synthetic here so that the results of Backwards() can be synthetic.
+ leaseExpiration := p.leaseStatus.Expiration().WithSynthetic(true)
+ closedTSTarget.Backward(leaseExpiration)
+ }
+
+ // We're about to close closedTSTarget. The propBuf needs to remember that in
+ // order for incoming requests to be bumped above it (through
+ // TrackEvaluatingRequest).
+ b.forwardClosedTimestampLocked(closedTSTarget)
+ // Fill in the closed ts in the proposal.
+ f := &b.tmpClosedTimestampFooter
+ f.ClosedTimestamp = b.assignedClosedTimestamp
+ footerLen := f.Size()
+ if log.ExpensiveLogEnabled(ctx, 4) {
+ log.VEventf(ctx, 4, "attaching closed timestamp %s to proposal %x", b.assignedClosedTimestamp, p.idKey)
+ }
+
+ preLen := len(p.encodedCommand)
+ // Here we rely on p.encodedCommand to have been allocated with enough
+ // capacity for this footer.
+ p.encodedCommand = p.encodedCommand[:preLen+footerLen]
+ _, err := protoutil.MarshalTo(f, p.encodedCommand[preLen:])
+ return err
+}
+
func (b *propBuf) forwardLeaseIndexBase(v uint64) {
if b.liBase < v {
b.liBase = v
@@ -636,6 +832,109 @@ func (b *propBuf) FlushLockedWithoutProposing(ctx context.Context) {
}
}
+// OnLeaseChangeLocked is called when a new lease is applied to this range.
+// assignedClosedTimestamp is the range's closed timestamp after the new lease was applied. The
+// closed timestamp tracked by the propBuf is updated accordingly.
+func (b *propBuf) OnLeaseChangeLocked(leaseOwned bool, closedTS hlc.Timestamp) {
+ if leaseOwned {
+ b.forwardClosedTimestampLocked(closedTS)
+ } else {
+ // Zero out to avoid any confusion.
+ b.assignedClosedTimestamp = hlc.Timestamp{}
+ }
+}
+
+// forwardClosedTimestamp forwards the closed timestamp tracked by the propBuf.
+func (b *propBuf) forwardClosedTimestampLocked(closedTS hlc.Timestamp) {
+ b.assignedClosedTimestamp.Forward(closedTS)
+}
+
+// EvaluatingRequestsCount returns the count of requests currently tracked by
+// the propBuf.
+func (b *propBuf) EvaluatingRequestsCount() int {
+ b.p.rlocker().Lock()
+ defer b.p.rlocker().Unlock()
+ return b.evalTracker.Count()
+}
+
+// TrackedRequestToken represents the result of propBuf.TrackEvaluatingRequest:
+// a token to be later used for untracking the respective request.
+//
+// This token tries to make it easy to pass responsibility for untracking. The
+// intended pattern is:
+// tok := propbBuf.TrackEvaluatingRequest()
+// defer tok.DoneIfNotMoved()
+// fn(tok.Move())
+type TrackedRequestToken struct {
+ done bool
+ tok tracker.RemovalToken
+ b *propBuf
+}
+
+// DoneIfNotMoved untracks the request if Move had not been called on the token
+// previously. If Move had been called, this is a no-op.
+//
+// Note that if this ends up actually destroying the token (i.e. if Move() had
+// not been called previously) this takes r.mu, so it's pretty expensive. On
+// happy paths, the token is expected to have been Move()d, and a batch of
+// tokens are expected to be destroyed at once by the propBuf (which calls
+// doneLocked).
+func (t *TrackedRequestToken) DoneIfNotMoved(ctx context.Context) {
+ if t.done {
+ return
+ }
+ t.b.p.locker().Lock()
+ t.doneLocked(ctx)
+ t.b.p.locker().Unlock()
+}
+
+func (t *TrackedRequestToken) doneLocked(ctx context.Context) {
+ if t.done {
+ log.Fatalf(ctx, "duplicate Done() call")
+ }
+ t.done = true
+ t.b.evalTracker.Untrack(ctx, t.tok)
+}
+
+// stillTracked returns true if no Done* method has been called.
+func (t *TrackedRequestToken) stillTracked() bool {
+ return !t.done
+}
+
+// Move returns a new token which can untrack the request. The original token is
+// neutered; calling DoneIfNotMoved on it becomes a no-op.
+func (t *TrackedRequestToken) Move(ctx context.Context) TrackedRequestToken {
+ if t.done {
+ log.Fatalf(ctx, "attempting to Move() after Done() call")
+ }
+ cpy := *t
+ t.done = true
+ return cpy
+}
+
+// TrackEvaluatingRequest atomically starts tracking an evaluating request and
+// returns the minimum timestamp at which this request can write. The tracked
+// request is identified by its tentative write timestamp. After calling this,
+// the caller must bump the write timestamp to at least the returned minTS.
+//
+// The returned token must be used to eventually remove this request from the
+// tracked set by calling tok.Done(); the removal will allow timestamps above
+// its write timestamp to be closed. If the evaluation results in a proposal,
+// the token will make it back to this propBuf through Insert; in this case it
+// will be the propBuf itself that ultimately stops tracking the request once
+// the proposal is flushed from the buffer.
+func (b *propBuf) TrackEvaluatingRequest(
+ ctx context.Context, wts hlc.Timestamp,
+) (minTS hlc.Timestamp, _ TrackedRequestToken) {
+ b.p.rlocker().Lock()
+ defer b.p.rlocker().Unlock()
+
+ minTS = b.assignedClosedTimestamp.Next()
+ wts.Forward(minTS)
+ tok := b.evalTracker.Track(ctx, wts)
+ return minTS, TrackedRequestToken{tok: tok, b: b}
+}
+
const propBufArrayMinSize = 4
const propBufArrayMaxSize = 256
const propBufArrayShrinkDelay = 16
@@ -702,6 +1001,8 @@ func (a *propBufArray) adjustSize(used int) {
// replicaProposer implements the proposer interface.
type replicaProposer Replica
+var _ proposer = &replicaProposer{}
+
func (rp *replicaProposer) locker() sync.Locker {
return &rp.mu.RWMutex
}
@@ -726,6 +1027,14 @@ func (rp *replicaProposer) enqueueUpdateCheck() {
rp.store.enqueueRaftUpdateCheck(rp.RangeID)
}
+func (rp *replicaProposer) closeTimestampPolicy() roachpb.RangeClosedTimestampPolicy {
+ return (*Replica)(rp).closedTimestampPolicyRLocked()
+}
+
+func (rp *replicaProposer) raftTransportClosedTimestampEnabled() bool {
+ return !(*Replica)(rp).mu.state.ClosedTimestamp.IsEmpty()
+}
+
func (rp *replicaProposer) withGroupLocked(fn func(raftGroup proposerRaft) error) error {
// Pass true for mayCampaignOnWake because we're about to propose a command.
return (*Replica)(rp).withRaftGroupLocked(true, func(raftGroup *raft.RawNode) (bool, error) {
diff --git a/pkg/kv/kvserver/replica_proposal_buf_test.go b/pkg/kv/kvserver/replica_proposal_buf_test.go
index 116009a2acb9..07b5b159bd15 100644
--- a/pkg/kv/kvserver/replica_proposal_buf_test.go
+++ b/pkg/kv/kvserver/replica_proposal_buf_test.go
@@ -17,10 +17,16 @@ import (
"testing"
"time"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/closedts/tracker"
+ "github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverbase"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/kvserverpb"
"github.com/cockroachdb/cockroach/pkg/roachpb"
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
"github.com/cockroachdb/cockroach/pkg/util/log"
+ "github.com/cockroachdb/cockroach/pkg/util/protoutil"
"github.com/cockroachdb/cockroach/pkg/util/syncutil"
"github.com/cockroachdb/errors"
"github.com/stretchr/testify/assert"
@@ -53,16 +59,31 @@ type testProposer struct {
// If leaderReplicaInDescriptor is set, this specifies what type of replica it
// is. Some types of replicas are not eligible to get a lease.
leaderReplicaType roachpb.ReplicaType
+ rangePolicy roachpb.RangeClosedTimestampPolicy
}
+var _ proposer = &testProposer{}
+
type testProposerRaft struct {
status raft.BasicStatus
+ // lastProps are the command that the propBuf flushed last.
+ lastProps []kvserverpb.RaftCommand
}
-var _ proposerRaft = testProposerRaft{}
+var _ proposerRaft = &testProposerRaft{}
-func (t testProposerRaft) Step(raftpb.Message) error {
- // TODO(andrei, nvanbenschoten): Capture the message and test against it.
+func (t *testProposerRaft) Step(msg raftpb.Message) error {
+ if msg.Type != raftpb.MsgProp {
+ return nil
+ }
+ // Decode and save all the commands.
+ t.lastProps = make([]kvserverpb.RaftCommand, len(msg.Entries))
+ for i, e := range msg.Entries {
+ _ /* idKey */, encodedCommand := DecodeRaftCommand(e.Data)
+ if err := protoutil.Unmarshal(encodedCommand, &t.lastProps[i]); err != nil {
+ return err
+ }
+ }
return nil
}
@@ -99,6 +120,14 @@ func (t *testProposer) enqueueUpdateCheck() {
t.enqueued++
}
+func (t *testProposer) closeTimestampPolicy() roachpb.RangeClosedTimestampPolicy {
+ return t.rangePolicy
+}
+
+func (t *testProposer) raftTransportClosedTimestampEnabled() bool {
+ return true
+}
+
func (t *testProposer) withGroupLocked(fn func(proposerRaft) error) error {
// Note that t.raftGroup can be nil, which FlushLockedWithRaftGroup supports.
return fn(t.raftGroup)
@@ -150,18 +179,55 @@ func (t *testProposer) rejectProposalWithRedirectLocked(
t.onRejectProposalWithRedirectLocked(prop, redirectTo)
}
-func newPropData(leaseReq bool) (*ProposalData, []byte) {
+// proposalCreator holds on to a lease and creates proposals using it.
+type proposalCreator struct {
+ lease kvserverpb.LeaseStatus
+}
+
+func (pc proposalCreator) newPutProposal() (*ProposalData, []byte) {
var ba roachpb.BatchRequest
- if leaseReq {
- ba.Add(&roachpb.RequestLeaseRequest{})
- } else {
- ba.Add(&roachpb.PutRequest{})
+ ba.Add(&roachpb.PutRequest{})
+ return pc.newProposal(ba)
+}
+
+func (pc proposalCreator) newLeaseProposal(lease roachpb.Lease) (*ProposalData, []byte) {
+ var ba roachpb.BatchRequest
+ ba.Add(&roachpb.RequestLeaseRequest{Lease: lease})
+ return pc.newProposal(ba)
+}
+
+func (pc proposalCreator) newProposal(ba roachpb.BatchRequest) (*ProposalData, []byte) {
+ var lease *roachpb.Lease
+ r, ok := ba.GetArg(roachpb.RequestLease)
+ if ok {
+ lease = &r.(*roachpb.RequestLeaseRequest).Lease
+ }
+ p := &ProposalData{
+ ctx: context.Background(),
+ idKey: kvserverbase.CmdIDKey("test-cmd"),
+ command: &kvserverpb.RaftCommand{
+ ReplicatedEvalResult: kvserverpb.ReplicatedEvalResult{
+ State: &kvserverpb.ReplicaState{Lease: lease},
+ },
+ },
+ Request: &ba,
+ leaseStatus: pc.lease,
+ }
+ return p, pc.encodeProposal(p)
+}
+
+func (pc proposalCreator) encodeProposal(p *ProposalData) []byte {
+ cmdLen := p.command.Size()
+ needed := raftCommandPrefixLen + cmdLen +
+ kvserverpb.MaxRaftCommandFooterSize() +
+ kvserverpb.MaxClosedTimestampFooterSize()
+ data := make([]byte, raftCommandPrefixLen, needed)
+ encodeRaftCommandPrefix(data, raftVersionStandard, p.idKey)
+ data = data[:raftCommandPrefixLen+p.command.Size()]
+ if _, err := protoutil.MarshalTo(p.command, data[raftCommandPrefixLen:]); err != nil {
+ panic(err)
}
- return &ProposalData{
- ctx: context.Background(),
- command: &kvserverpb.RaftCommand{},
- Request: &ba,
- }, make([]byte, 0, kvserverpb.MaxRaftCommandFooterSize())
+ return data
}
// TestProposalBuffer tests the basic behavior of the Raft proposal buffer.
@@ -172,14 +238,23 @@ func TestProposalBuffer(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
// Insert propBufArrayMinSize proposals. The buffer should not be flushed.
num := propBufArrayMinSize
for i := 0; i < num; i++ {
leaseReq := i == 3
- pd, data := newPropData(leaseReq)
- mlai, err := b.Insert(ctx, pd, data)
+ var pd *ProposalData
+ var data []byte
+ if leaseReq {
+ pd, data = pc.newLeaseProposal(roachpb.Lease{})
+ } else {
+ pd, data = pc.newPutProposal()
+ }
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err := b.Insert(ctx, pd, data, tok)
require.Nil(t, err)
if leaseReq {
expMlai := uint64(i)
@@ -196,12 +271,14 @@ func TestProposalBuffer(t *testing.T) {
require.Equal(t, 1, p.enqueued)
require.Equal(t, 0, p.registered)
}
+ require.Equal(t, num, b.evalTracker.Count())
// Insert another proposal. This causes the buffer to flush. Doing so
// results in a lease applied index being skipped, which is harmless.
// Remember that the lease request above did not receive a lease index.
- pd, data := newPropData(false)
- mlai, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newPutProposal()
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err := b.Insert(ctx, pd, data, tok)
require.Nil(t, err)
expMlai := uint64(num + 1)
require.Equal(t, expMlai, mlai)
@@ -212,6 +289,7 @@ func TestProposalBuffer(t *testing.T) {
require.Equal(t, num, p.registered)
require.Equal(t, uint64(num), b.liBase)
require.Equal(t, 2*propBufArrayMinSize, b.arr.len())
+ require.Equal(t, 1, b.evalTracker.Count())
// Increase the proposer's applied lease index and flush. The buffer's
// lease index offset should jump up.
@@ -224,7 +302,8 @@ func TestProposalBuffer(t *testing.T) {
// Insert one more proposal. The lease applied index should adjust to
// the increase accordingly.
- mlai, err = b.Insert(ctx, pd, data)
+ _, tok = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err = b.Insert(ctx, pd, data, tok)
require.Nil(t, err)
expMlai = p.lai + 1
require.Equal(t, expMlai, mlai)
@@ -252,7 +331,9 @@ func TestProposalBufferConcurrentWithDestroy(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
mlais := make(map[uint64]struct{})
dsErr := errors.New("destroyed")
@@ -263,8 +344,9 @@ func TestProposalBufferConcurrentWithDestroy(t *testing.T) {
for i := 0; i < concurrency; i++ {
g.Go(func() error {
for {
- pd, data := newPropData(false)
- mlai, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newPutProposal()
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ mlai, err := b.Insert(ctx, pd, data, tok)
if err != nil {
if errors.Is(err, dsErr) {
return nil
@@ -323,12 +405,16 @@ func TestProposalBufferRegistersAllOnProposalError(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
num := propBufArrayMinSize
+ toks := make([]TrackedRequestToken, num)
for i := 0; i < num; i++ {
- pd, data := newPropData(false)
- _, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newPutProposal()
+ _, toks[i] = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, toks[i])
require.Nil(t, err)
}
require.Equal(t, num, b.Len())
@@ -346,6 +432,7 @@ func TestProposalBufferRegistersAllOnProposalError(t *testing.T) {
err := b.flushLocked(ctx)
require.Equal(t, propErr, err)
require.Equal(t, num, p.registered)
+ require.Zero(t, b.evalTracker.Count())
}
// TestProposalBufferRegistrationWithInsertionErrors tests that if during
@@ -358,12 +445,22 @@ func TestProposalBufferRegistrationWithInsertionErrors(t *testing.T) {
var p testProposer
var b propBuf
- b.Init(&p)
+ var pc proposalCreator
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
num := propBufArrayMinSize / 2
+ toks1 := make([]TrackedRequestToken, num)
for i := 0; i < num; i++ {
- pd, data := newPropData(i%2 == 0)
- _, err := b.Insert(ctx, pd, data)
+ var pd *ProposalData
+ var data []byte
+ if i%2 == 0 {
+ pd, data = pc.newLeaseProposal(roachpb.Lease{})
+ } else {
+ pd, data = pc.newPutProposal()
+ }
+ _, toks1[i] = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, toks1[i])
require.Nil(t, err)
}
@@ -372,9 +469,17 @@ func TestProposalBufferRegistrationWithInsertionErrors(t *testing.T) {
return 0, insertErr
}
+ toks2 := make([]TrackedRequestToken, num)
for i := 0; i < num; i++ {
- pd, data := newPropData(i%2 == 0)
- _, err := b.Insert(ctx, pd, data)
+ var pd *ProposalData
+ var data []byte
+ if i%2 == 0 {
+ pd, data = pc.newLeaseProposal(roachpb.Lease{})
+ } else {
+ pd, data = pc.newPutProposal()
+ }
+ _, toks2[i] = b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, toks2[i])
require.Equal(t, insertErr, err)
}
require.Equal(t, 2*num, b.Len())
@@ -383,6 +488,7 @@ func TestProposalBufferRegistrationWithInsertionErrors(t *testing.T) {
require.Equal(t, 0, b.Len())
require.Equal(t, num, p.registered)
+ require.Zero(t, b.evalTracker.Count())
}
// TestPropBufCnt tests the basic behavior of the counter maintained by the
@@ -494,6 +600,7 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
} {
t.Run(tc.name, func(t *testing.T) {
var p testProposer
+ var pc proposalCreator
// p.replicaID() is hardcoded; it'd better be hardcoded to what this test
// expects.
require.Equal(t, self, uint64(p.replicaID()))
@@ -519,7 +626,7 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
Lead: tc.leader,
},
}
- r := testProposerRaft{
+ r := &testProposerRaft{
status: raftStatus,
}
p.raftGroup = r
@@ -527,10 +634,12 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
p.leaderReplicaType = tc.leaderRepType
var b propBuf
- b.Init(&p)
+ clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond)
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, cluster.MakeTestingClusterSettings())
- pd, data := newPropData(true /* leaseReq */)
- _, err := b.Insert(ctx, pd, data)
+ pd, data := pc.newLeaseProposal(roachpb.Lease{})
+ _, tok := b.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, err := b.Insert(ctx, pd, data, tok)
require.NoError(t, err)
require.NoError(t, b.flushLocked(ctx))
if tc.expRejection {
@@ -541,3 +650,273 @@ func TestProposalBufferRejectLeaseAcqOnFollower(t *testing.T) {
})
}
}
+
+func TestProposalBufferComputeClosedTimestampTarget(t *testing.T) {
+ defer leaktest.AfterTest(t)()
+ defer log.Scope(t).Close(t)
+
+ const nowNanos = 100
+ const maxOffsetNanos = 20
+ manualClock := hlc.NewManualClock(nowNanos)
+ clock := hlc.NewClock(manualClock.UnixNano, maxOffsetNanos)
+
+ const lagTargetNanos = 10
+ st := cluster.MakeTestingClusterSettings()
+ closedts.TargetDuration.Override(&st.SV, lagTargetNanos)
+
+ for _, tc := range []struct {
+ rangePolicy roachpb.RangeClosedTimestampPolicy
+ expClosedTSTarget hlc.Timestamp
+ }{
+ {
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ expClosedTSTarget: hlc.Timestamp{WallTime: nowNanos - lagTargetNanos},
+ },
+ {
+ rangePolicy: roachpb.LEAD_FOR_GLOBAL_READS,
+ expClosedTSTarget: hlc.Timestamp{WallTime: nowNanos - lagTargetNanos},
+ // TODO(andrei, nvanbenschoten): What we should be expecting here is the following, once
+ // the propBuf starts properly implementing this timestamp closing policy:
+ // expClosedTSTarget: hlc.Timestamp{WallTime: nowNanos + 2*maxOffsetNanos, Synthetic: true},
+ },
+ } {
+ t.Run(tc.rangePolicy.String(), func(t *testing.T) {
+ var p testProposer
+ p.rangePolicy = tc.rangePolicy
+ var b propBuf
+ b.Init(&p, tracker.NewLockfreeTracker(), clock, st)
+ require.Equal(t, tc.expClosedTSTarget, b.computeClosedTimestampTarget())
+ })
+ }
+}
+
+// Test that the propBuf properly assigns closed timestamps to proposals being
+// flushed out of it. Each subtest proposes one command and checks for the
+// expected closed timestamp being written to the proposal by the propBuf.
+func TestProposalBufferClosedTimestamp(t *testing.T) {
+ defer leaktest.AfterTest(t)()
+ defer log.Scope(t).Close(t)
+ ctx := context.Background()
+
+ mc := hlc.NewManualClock((1613588135 * time.Second).Nanoseconds())
+ clock := hlc.NewClock(mc.UnixNano, time.Nanosecond)
+ st := cluster.MakeTestingClusterSettings()
+ closedts.TargetDuration.Override(&st.SV, time.Second)
+ now := clock.Now()
+ newLeaseStart := now.MustToClockTimestamp()
+ nowMinusClosedLag := hlc.Timestamp{
+ WallTime: mc.UnixNano() - closedts.TargetDuration.Get(&st.SV).Nanoseconds(),
+ }
+ nowMinusTwiceClosedLag := hlc.Timestamp{
+ WallTime: mc.UnixNano() - 2*closedts.TargetDuration.Get(&st.SV).Nanoseconds(),
+ }
+ expiredLeaseTimestamp := hlc.Timestamp{WallTime: mc.UnixNano() - 1000}
+ someClosedTS := hlc.Timestamp{WallTime: mc.UnixNano() - 2000}
+
+ type reqType int
+ checkClosedTS := func(t *testing.T, r *testProposerRaft, exp hlc.Timestamp) {
+ require.Len(t, r.lastProps, 1)
+ require.Equal(t, exp, r.lastProps[0].ClosedTimestamp)
+ }
+
+ // The lease that the proposals are made under.
+ curLease := roachpb.Lease{
+ Epoch: 0, // Expiration-based lease.
+ Sequence: 1,
+ Start: hlc.ClockTimestamp{},
+ // Expiration is filled by each test.
+ Expiration: nil,
+ }
+
+ const (
+ regularWrite reqType = iota
+ // newLease means that the request is a lease acquisition (new lease or
+ // lease extension).
+ newLease
+ leaseTransfer
+ )
+
+ for _, tc := range []struct {
+ name string
+
+ reqType reqType
+ // The lower bound of all currently-evaluating requests. We can't close this
+ // or above.
+ trackerLowerBound hlc.Timestamp
+ // The expiration of the current lease. The closed timestamp of most
+ // proposal is upper-bounded by this, which matters for
+ // LEAD_FOR_GLOBAL_READS ranges (on other ranges the propBuf would never
+ // like to close a timestamp above the current lease expiration because it
+ // wouldn't be processing commands if the lease is expired).
+ leaseExp hlc.Timestamp
+ rangePolicy roachpb.RangeClosedTimestampPolicy
+ // The highest closed timestamp that the propBuf has previously attached to
+ // a proposal. The propBuf should never propose a new closedTS below this.
+ prevClosedTimestamp hlc.Timestamp
+
+ // lease is used when reqType = newLease. This will be the lease being
+ // proposed.
+ lease roachpb.Lease
+
+ expClosed hlc.Timestamp
+ }{
+ {
+ name: "basic",
+ reqType: regularWrite,
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ prevClosedTimestamp: hlc.Timestamp{},
+ expClosed: nowMinusClosedLag,
+ },
+ {
+ // The request tracker will prevent us from closing below its lower bound.
+ name: "not closing below evaluating requests",
+ reqType: regularWrite,
+ trackerLowerBound: nowMinusTwiceClosedLag,
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ prevClosedTimestamp: hlc.Timestamp{},
+ expClosed: nowMinusTwiceClosedLag.FloorPrev(),
+ },
+ {
+ // Like the basic test, except that we can't close timestamp below what
+ // we've already closed previously.
+ name: "no regression",
+ reqType: regularWrite,
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ prevClosedTimestamp: someClosedTS,
+ expClosed: someClosedTS,
+ },
+ {
+ name: "brand new lease",
+ reqType: newLease,
+ lease: roachpb.Lease{
+ // Higher sequence => this is a brand new lease, not an extension.
+ Sequence: curLease.Sequence + 1,
+ Start: newLeaseStart,
+ },
+ trackerLowerBound: hlc.Timestamp{},
+ // The current lease can be expired; we won't backtrack the closed
+ // timestamp to this expiration.
+ leaseExp: expiredLeaseTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ expClosed: newLeaseStart.ToTimestamp(),
+ },
+ {
+ name: "lease extension",
+ reqType: newLease,
+ lease: roachpb.Lease{
+ // Same sequence => this is a lease extension.
+ Sequence: curLease.Sequence,
+ Start: newLeaseStart,
+ },
+ trackerLowerBound: hlc.Timestamp{},
+ // The current lease can be expired; we won't backtrack the closed
+ // timestamp to this expiration.
+ leaseExp: expiredLeaseTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ // Lease extensions don't carry closed timestamps because they don't get
+ // MLAIs, and so they can be reordered.
+ expClosed: hlc.Timestamp{},
+ },
+ {
+ // Lease transfers behave just like regular writes. The lease start time
+ // doesn't matter.
+ name: "lease transfer",
+ reqType: leaseTransfer,
+ lease: roachpb.Lease{
+ Sequence: curLease.Sequence + 1,
+ Start: newLeaseStart,
+ },
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LAG_BY_CLUSTER_SETTING,
+ expClosed: nowMinusClosedLag,
+ },
+ {
+ // With the LEAD_FOR_GLOBAL_READS policy, we're expecting to close
+ // timestamps in the future.
+ // TODO(andrei,nvanbenschoten): The global policy is not actually hooked
+ // up at the moment, so this test expects a past timestamp to be closed.
+ // Once it is hooked up, we should also add another test that checks that
+ // timestamps above the current lease expiration are not closed.
+ name: "global range",
+ reqType: regularWrite,
+ trackerLowerBound: hlc.Timestamp{},
+ leaseExp: hlc.MaxTimestamp,
+ rangePolicy: roachpb.LEAD_FOR_GLOBAL_READS,
+ prevClosedTimestamp: hlc.Timestamp{},
+ expClosed: nowMinusClosedLag,
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ r := &testProposerRaft{}
+ p := testProposer{
+ lai: 10,
+ raftGroup: r,
+ }
+ tracker := mockTracker{
+ lowerBound: tc.trackerLowerBound,
+ }
+ pc := proposalCreator{lease: kvserverpb.LeaseStatus{Lease: curLease}}
+ pc.lease.Lease.Expiration = &tc.leaseExp
+
+ var b propBuf
+ b.Init(&p, tracker, clock, st)
+ b.forwardClosedTimestampLocked(tc.prevClosedTimestamp)
+
+ var pd *ProposalData
+ var data []byte
+ switch tc.reqType {
+ case regularWrite:
+ pd, data = pc.newPutProposal()
+ case newLease:
+ pd, data = pc.newLeaseProposal(tc.lease)
+ case leaseTransfer:
+ var ba roachpb.BatchRequest
+ ba.Add(&roachpb.TransferLeaseRequest{
+ Lease: roachpb.Lease{
+ Start: now.MustToClockTimestamp(),
+ Sequence: pc.lease.Lease.Sequence + 1,
+ },
+ PrevLease: pc.lease.Lease,
+ })
+ pd, data = pc.newProposal(ba)
+ default:
+ t.Fatalf("unknown req type %d", tc.reqType)
+ }
+ tok := TrackedRequestToken{
+ done: false,
+ tok: nil,
+ b: &b,
+ }
+ _, err := b.Insert(ctx, pd, data, tok)
+ require.NoError(t, err)
+ require.NoError(t, b.flushLocked(ctx))
+ checkClosedTS(t, r, tc.expClosed)
+ })
+ }
+}
+
+type mockTracker struct {
+ lowerBound hlc.Timestamp
+}
+
+func (t mockTracker) Track(ctx context.Context, ts hlc.Timestamp) tracker.RemovalToken {
+ panic("unimplemented")
+}
+
+func (t mockTracker) Untrack(context.Context, tracker.RemovalToken) {}
+
+func (t mockTracker) LowerBound(context.Context) hlc.Timestamp {
+ return t.lowerBound
+}
+
+func (t mockTracker) Count() int {
+ panic("unimplemented")
+}
+
+var _ tracker.Tracker = mockTracker{}
diff --git a/pkg/kv/kvserver/replica_raft.go b/pkg/kv/kvserver/replica_raft.go
index 686294c3ee75..2568c9b44158 100644
--- a/pkg/kv/kvserver/replica_raft.go
+++ b/pkg/kv/kvserver/replica_raft.go
@@ -58,6 +58,10 @@ func makeIDKey() kvserverbase.CmdIDKey {
// caller should relinquish all ownership of it. If it does return an error, the
// caller retains full ownership over the guard.
//
+// evalAndPropose takes ownership of the supplied token; the caller should
+// tok.Move() it into this method. It will be used to untrack the request once
+// it comes out of the proposal buffer.
+//
// Return values:
// - a channel which receives a response or error upon application
// - a closure used to attempt to abandon the command. When called, it unbinds
@@ -73,9 +77,11 @@ func (r *Replica) evalAndPropose(
g *concurrency.Guard,
st kvserverpb.LeaseStatus,
lul hlc.Timestamp,
+ tok TrackedRequestToken,
) (chan proposalResult, func(), int64, *roachpb.Error) {
+ defer tok.DoneIfNotMoved(ctx)
idKey := makeIDKey()
- proposal, pErr := r.requestToProposal(ctx, idKey, ba, lul, g.LatchSpans())
+ proposal, pErr := r.requestToProposal(ctx, idKey, ba, st, lul, g.LatchSpans())
log.Event(proposal.ctx, "evaluated request")
// If the request hit a server-side concurrency retry error, immediately
@@ -200,7 +206,7 @@ func (r *Replica) evalAndPropose(
}
}
- maxLeaseIndex, pErr := r.propose(ctx, proposal)
+ maxLeaseIndex, pErr := r.propose(ctx, proposal, tok.Move(ctx))
if pErr != nil {
return nil, nil, 0, pErr
}
@@ -234,7 +240,14 @@ func (r *Replica) evalAndPropose(
// the method returns, all access to the command must be performed while holding
// Replica.mu and Replica.raftMu. If a non-nil error is returned the
// MaxLeaseIndex is not updated.
-func (r *Replica) propose(ctx context.Context, p *ProposalData) (index int64, pErr *roachpb.Error) {
+//
+// propose takes ownership of the supplied token; the caller should tok.Move()
+// it into this method. It will be used to untrack the request once it comes out
+// of the proposal buffer.
+func (r *Replica) propose(
+ ctx context.Context, p *ProposalData, tok TrackedRequestToken,
+) (index int64, pErr *roachpb.Error) {
+ defer tok.DoneIfNotMoved(ctx)
// If an error occurs reset the command's MaxLeaseIndex to its initial value.
// Failure to propose will propagate to the client. An invariant of this
@@ -304,8 +317,12 @@ func (r *Replica) propose(ctx context.Context, p *ProposalData) (index int64, pE
preLen = raftCommandPrefixLen
}
cmdLen := p.command.Size()
- cap := preLen + cmdLen + kvserverpb.MaxRaftCommandFooterSize()
- data := make([]byte, preLen, cap)
+ // Allocate the data slice with enough capacity to eventually hold the two
+ // "footers" that are filled later.
+ needed := preLen + cmdLen +
+ kvserverpb.MaxRaftCommandFooterSize() +
+ kvserverpb.MaxClosedTimestampFooterSize()
+ data := make([]byte, preLen, needed)
// Encode prefix with command ID, if necessary.
if prefix {
encodeRaftCommandPrefix(data, version, p.idKey)
@@ -345,7 +362,7 @@ func (r *Replica) propose(ctx context.Context, p *ProposalData) (index int64, pE
//
// NB: we must not hold r.mu while using the proposal buffer, see comment
// on the field.
- maxLeaseIndex, err := r.mu.proposalBuf.Insert(ctx, p, data)
+ maxLeaseIndex, err := r.mu.proposalBuf.Insert(ctx, p, data, tok.Move(ctx))
if err != nil {
return 0, roachpb.NewError(err)
}
@@ -977,6 +994,9 @@ const (
// waiting on.
// mu must be held.
//
+// Note that reproposals don't need to worry about checking the closed timestamp
+// before reproposing, since they're reusing the original LAI.
+//
// refreshAtDelta only applies for reasonTicks and specifies how old (in ticks)
// a command must be for it to be inspected; the usual value is the number of
// ticks of an election timeout (affect only proposals that have had ample time
diff --git a/pkg/kv/kvserver/replica_rangefeed_test.go b/pkg/kv/kvserver/replica_rangefeed_test.go
index 4105f97d4374..de435bd8712b 100644
--- a/pkg/kv/kvserver/replica_rangefeed_test.go
+++ b/pkg/kv/kvserver/replica_rangefeed_test.go
@@ -167,6 +167,7 @@ func TestReplicaRangefeed(t *testing.T) {
}
events = stream.Events()
+ // Filter out checkpoints. Those are not deterministic; they can come at any time.
var filteredEvents []*roachpb.RangeFeedEvent
for _, e := range events {
if e.Checkpoint != nil {
diff --git a/pkg/kv/kvserver/replica_test.go b/pkg/kv/kvserver/replica_test.go
index caa40fde4334..ac468760c49f 100644
--- a/pkg/kv/kvserver/replica_test.go
+++ b/pkg/kv/kvserver/replica_test.go
@@ -198,6 +198,9 @@ func (tc *testContext) Clock() *hlc.Clock {
func (tc *testContext) Start(t testing.TB, stopper *stop.Stopper) {
tc.manualClock = hlc.NewManualClock(123)
cfg := TestStoreConfig(hlc.NewClock(tc.manualClock.UnixNano, time.Nanosecond))
+ // testContext tests like to move the manual clock around and assume that they can write at past
+ // timestamps.
+ cfg.TestingKnobs.DontCloseTimestamps = true
tc.StartWithStoreConfig(t, stopper, cfg)
}
@@ -617,7 +620,8 @@ func sendLeaseRequest(r *Replica, l *roachpb.Lease) error {
ba.Timestamp = r.store.Clock().Now()
ba.Add(&roachpb.RequestLeaseRequest{Lease: *l})
st := r.CurrentLeaseStatus(ctx)
- ch, _, _, pErr := r.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := r.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr == nil {
// Next if the command was committed, wait for the range to apply it.
// TODO(bdarnell): refactor this to a more conventional error-handling pattern.
@@ -1418,7 +1422,8 @@ func TestReplicaLeaseRejectUnknownRaftNodeID(t *testing.T) {
ba := roachpb.BatchRequest{}
ba.Timestamp = tc.repl.store.Clock().Now()
ba.Add(&roachpb.RequestLeaseRequest{Lease: *lease})
- ch, _, _, pErr := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr == nil {
// Next if the command was committed, wait for the range to apply it.
// TODO(bdarnell): refactor to a more conventional error-handling pattern.
@@ -7894,7 +7899,8 @@ func TestReplicaCancelRaftCommandProgress(t *testing.T) {
},
})
st := repl.CurrentLeaseStatus(ctx)
- ch, _, idx, err := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, idx, err := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if err != nil {
t.Fatal(err)
}
@@ -7963,8 +7969,9 @@ func TestReplicaBurstPendingCommandsAndRepropose(t *testing.T) {
Key: roachpb.Key(fmt.Sprintf("k%d", i)),
},
})
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
st := tc.repl.CurrentLeaseStatus(ctx)
- ch, _, idx, err := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ ch, _, idx, err := tc.repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if err != nil {
t.Fatal(err)
}
@@ -8082,8 +8089,8 @@ func TestReplicaRefreshPendingCommandsTicks(t *testing.T) {
var ba roachpb.BatchRequest
ba.Timestamp = tc.Clock().Now()
ba.Add(&roachpb.PutRequest{RequestHeader: roachpb.RequestHeader{Key: roachpb.Key(id)}})
- lease, _ := r.GetLease()
- cmd, pErr := r.requestToProposal(ctx, kvserverbase.CmdIDKey(id), &ba, hlc.Timestamp{}, &allSpans)
+ st := r.CurrentLeaseStatus(ctx)
+ cmd, pErr := r.requestToProposal(ctx, kvserverbase.CmdIDKey(id), &ba, st, hlc.Timestamp{}, &allSpans)
if pErr != nil {
t.Fatal(pErr)
}
@@ -8092,8 +8099,9 @@ func TestReplicaRefreshPendingCommandsTicks(t *testing.T) {
dropProposals.m[cmd] = struct{}{} // silently drop proposals
dropProposals.Unlock()
- cmd.command.ProposerLeaseSequence = lease.Sequence
- if _, pErr := r.propose(ctx, cmd); pErr != nil {
+ cmd.command.ProposerLeaseSequence = st.Lease.Sequence
+ _, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ if _, pErr := r.propose(ctx, cmd, tok); pErr != nil {
t.Error(pErr)
}
r.mu.Lock()
@@ -8204,7 +8212,7 @@ func TestReplicaRefreshMultiple(t *testing.T) {
incCmdID = makeIDKey()
atomic.StoreInt32(&filterActive, 1)
- proposal, pErr := repl.requestToProposal(ctx, incCmdID, &ba, hlc.Timestamp{}, &allSpans)
+ proposal, pErr := repl.requestToProposal(ctx, incCmdID, &ba, repl.CurrentLeaseStatus(ctx), hlc.Timestamp{}, &allSpans)
if pErr != nil {
t.Fatal(pErr)
}
@@ -8234,7 +8242,8 @@ func TestReplicaRefreshMultiple(t *testing.T) {
// that it will generate a retry when it fails. Then call refreshProposals
// twice to repropose it and put it in the logs twice more.
proposal.command.ProposerLeaseSequence = repl.mu.state.Lease.Sequence
- if _, pErr := repl.propose(ctx, proposal); pErr != nil {
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ if _, pErr := repl.propose(ctx, proposal, tok); pErr != nil {
t.Fatal(pErr)
}
repl.mu.Lock()
@@ -8244,6 +8253,7 @@ func TestReplicaRefreshMultiple(t *testing.T) {
repl.refreshProposalsLocked(ctx, 0 /* refreshAtDelta */, reasonNewLeader)
repl.refreshProposalsLocked(ctx, 0 /* refreshAtDelta */, reasonNewLeader)
repl.mu.Unlock()
+ require.Zero(t, tc.repl.mu.proposalBuf.EvaluatingRequestsCount())
// Wait for our proposal to apply. The two refreshed proposals above
// will fail due to their illegal lease index. Then they'll generate
@@ -9238,6 +9248,7 @@ func TestCommandTooLarge(t *testing.T) {
func TestErrorInRaftApplicationClearsIntents(t *testing.T) {
defer leaktest.AfterTest(t)()
defer log.Scope(t).Close(t)
+ ctx := context.Background()
var storeKnobs StoreTestingKnobs
var filterActive int32
@@ -9257,7 +9268,7 @@ func TestErrorInRaftApplicationClearsIntents(t *testing.T) {
defer s.Stopper().Stop(context.Background())
splitKey := roachpb.Key("b")
- if err := kvDB.AdminSplit(context.Background(), splitKey, hlc.MaxTimestamp /* expirationTime */); err != nil {
+ if err := kvDB.AdminSplit(ctx, splitKey, hlc.MaxTimestamp /* expirationTime */); err != nil {
t.Fatal(err)
}
@@ -9296,7 +9307,8 @@ func TestErrorInRaftApplicationClearsIntents(t *testing.T) {
exLease, _ := repl.GetLease()
st := kvserverpb.LeaseStatus{Lease: exLease, State: kvserverpb.LeaseState_VALID}
- ch, _, _, pErr := repl.evalAndPropose(context.Background(), &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -9343,7 +9355,8 @@ func TestProposeWithAsyncConsensus(t *testing.T) {
atomic.StoreInt32(&filterActive, 1)
st := tc.repl.CurrentLeaseStatus(ctx)
- ch, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -9407,7 +9420,8 @@ func TestApplyPaginatedCommittedEntries(t *testing.T) {
atomic.StoreInt32(&filterActive, 1)
st := repl.CurrentLeaseStatus(ctx)
- _, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ _, _, _, pErr := repl.evalAndPropose(ctx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -9425,7 +9439,8 @@ func TestApplyPaginatedCommittedEntries(t *testing.T) {
ba2.Timestamp = tc.Clock().Now()
var pErr *roachpb.Error
- ch, _, _, pErr = repl.evalAndPropose(ctx, &ba2, allSpansGuard(), st, hlc.Timestamp{})
+ _, tok := repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
+ ch, _, _, pErr = repl.evalAndPropose(ctx, &ba2, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -12537,9 +12552,10 @@ func TestProposalNotAcknowledgedOrReproposedAfterApplication(t *testing.T) {
// Hold the RaftLock to ensure that after evalAndPropose our proposal is in
// the proposal map. Entries are only removed from that map underneath raft.
tc.repl.RaftLock()
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
sp := cfg.AmbientCtx.Tracer.StartSpan("replica send", tracing.WithForceRealSpan())
tracedCtx := tracing.ContextWithSpan(ctx, sp)
- ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok)
if pErr != nil {
t.Fatal(pErr)
}
@@ -12625,13 +12641,14 @@ func TestLaterReproposalsDoNotReuseContext(t *testing.T) {
Value: roachpb.MakeValueFromBytes([]byte("val")),
})
+ _, tok := tc.repl.mu.proposalBuf.TrackEvaluatingRequest(ctx, hlc.MinTimestamp)
// Hold the RaftLock to encourage the reproposals to occur in the same batch.
tc.repl.RaftLock()
tracedCtx, sp := tracer.StartSpanCtx(ctx, "replica send", tracing.WithForceRealSpan())
// Go out of our way to enable recording so that expensive logging is enabled
// for this context.
sp.SetVerbose(true)
- ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{})
+ ch, _, _, pErr := tc.repl.evalAndPropose(tracedCtx, &ba, allSpansGuard(), st, hlc.Timestamp{}, tok.Move(ctx))
if pErr != nil {
t.Fatal(pErr)
}
@@ -12800,7 +12817,7 @@ func TestContainsEstimatesClampProposal(t *testing.T) {
ba.Timestamp = tc.Clock().Now()
req := putArgs(roachpb.Key("some-key"), []byte("some-value"))
ba.Add(&req)
- proposal, err := tc.repl.requestToProposal(ctx, cmdIDKey, &ba, hlc.Timestamp{}, &allSpans)
+ proposal, err := tc.repl.requestToProposal(ctx, cmdIDKey, &ba, tc.repl.CurrentLeaseStatus(ctx), hlc.Timestamp{}, &allSpans)
if err != nil {
t.Error(err)
}
diff --git a/pkg/kv/kvserver/replica_write.go b/pkg/kv/kvserver/replica_write.go
index b02db0ae3af0..fab0d7372cde 100644
--- a/pkg/kv/kvserver/replica_write.go
+++ b/pkg/kv/kvserver/replica_write.go
@@ -88,6 +88,25 @@ func (r *Replica) executeWriteBatch(
minTS, untrack := r.store.cfg.ClosedTimestamp.Tracker.Track(ctx)
defer untrack(ctx, 0, 0, 0) // covers all error returns below
+ // Start tracking this request. The act of tracking also gives us a closed
+ // timestamp, which we must ensure to evaluate above of. We're going to pass
+ // in minTS to applyTimestampCache(), which bumps us accordingly if necessary.
+ // We need to start tracking this request before we know the final write
+ // timestamp at which this request will evaluate because we need to atomically
+ // read the closed timestamp and start to be tracked.
+ // TODO(andrei): The timestamp cache might bump us above the timestamp at
+ // which we're registering with the proposalBuf. In that case, this request
+ // will be tracked at an unnecessarily low timestamp. We could invent an
+ // interface through which to communicate the updated timestamp to the
+ // proposalBuf.
+ minTS2, tok := r.mu.proposalBuf.TrackEvaluatingRequest(ctx, ba.WriteTimestamp())
+ defer tok.DoneIfNotMoved(ctx)
+ minTS.Forward(minTS2)
+
+ if !ba.IsSingleSkipLeaseCheckRequest() && st.Expiration().Less(minTS) {
+ log.Fatalf(ctx, "closed timestamp above lease expiration (%s vs %s): %s", minTS, st.Expiration(), ba)
+ }
+
// Examine the timestamp cache for preceding commands which require this
// command to move its timestamp forward. Or, in the case of a transactional
// write, the txn timestamp and possible write-too-old bool.
@@ -120,7 +139,7 @@ func (r *Replica) executeWriteBatch(
// If the command is proposed to Raft, ownership of and responsibility for
// the concurrency guard will be assumed by Raft, so provide the guard to
// evalAndPropose.
- ch, abandon, maxLeaseIndex, pErr := r.evalAndPropose(ctx, ba, g, st, localUncertaintyLimit)
+ ch, abandon, maxLeaseIndex, pErr := r.evalAndPropose(ctx, ba, g, st, localUncertaintyLimit, tok.Move(ctx))
if pErr != nil {
if maxLeaseIndex != 0 {
log.Fatalf(
diff --git a/pkg/kv/kvserver/stateloader/stateloader.go b/pkg/kv/kvserver/stateloader/stateloader.go
index 9a1a4d5be558..a6610a807d39 100644
--- a/pkg/kv/kvserver/stateloader/stateloader.go
+++ b/pkg/kv/kvserver/stateloader/stateloader.go
@@ -83,6 +83,9 @@ func (rsl StateLoader) Load(
ms := as.RangeStats.ToStats()
s.Stats = &ms
+ if as.ClosedTimestamp != nil {
+ s.ClosedTimestamp = *as.ClosedTimestamp
+ }
} else {
if s.RaftAppliedIndex, s.LeaseAppliedIndex, err = rsl.LoadAppliedIndex(ctx, reader); err != nil {
return kvserverpb.ReplicaState{}, err
@@ -167,8 +170,8 @@ func (rsl StateLoader) Save(
}
}
if state.UsingAppliedStateKey {
- rai, lai := state.RaftAppliedIndex, state.LeaseAppliedIndex
- if err := rsl.SetRangeAppliedState(ctx, readWriter, rai, lai, ms); err != nil {
+ rai, lai, ct := state.RaftAppliedIndex, state.LeaseAppliedIndex, &state.ClosedTimestamp
+ if err := rsl.SetRangeAppliedState(ctx, readWriter, rai, lai, ms, ct); err != nil {
return enginepb.MVCCStats{}, err
}
} else {
@@ -294,17 +297,26 @@ func (rsl StateLoader) LoadMVCCStats(
// The applied indices and the stats used to be stored separately in different
// keys. We now deem those keys to be "legacy" because they have been replaced
// by the range applied state key.
+//
+// TODO(andrei): closedTimestamp is a pointer to avoid an allocation when
+// putting it in RangeAppliedState. RangeAppliedState.ClosedTimestamp is made
+// non-nullable (see comments on the field), this argument should be taken by
+// value.
func (rsl StateLoader) SetRangeAppliedState(
ctx context.Context,
readWriter storage.ReadWriter,
appliedIndex, leaseAppliedIndex uint64,
newMS *enginepb.MVCCStats,
+ closedTimestamp *hlc.Timestamp,
) error {
as := enginepb.RangeAppliedState{
RaftAppliedIndex: appliedIndex,
LeaseAppliedIndex: leaseAppliedIndex,
RangeStats: newMS.ToPersistentStats(),
}
+ if closedTimestamp != nil && !closedTimestamp.IsEmpty() {
+ as.ClosedTimestamp = closedTimestamp
+ }
// The RangeAppliedStateKey is not included in stats. This is also reflected
// in C.MVCCComputeStats and ComputeStatsForRange.
ms := (*enginepb.MVCCStats)(nil)
@@ -477,12 +489,26 @@ func (rsl StateLoader) SetMVCCStats(
if as, err := rsl.LoadRangeAppliedState(ctx, readWriter); err != nil {
return err
} else if as != nil {
- return rsl.SetRangeAppliedState(ctx, readWriter, as.RaftAppliedIndex, as.LeaseAppliedIndex, newMS)
+ return rsl.SetRangeAppliedState(
+ ctx, readWriter, as.RaftAppliedIndex, as.LeaseAppliedIndex, newMS, as.ClosedTimestamp)
}
return rsl.writeLegacyMVCCStatsInternal(ctx, readWriter, newMS)
}
+// SetClosedTimestamp overwrites the closed timestamp.
+func (rsl StateLoader) SetClosedTimestamp(
+ ctx context.Context, readWriter storage.ReadWriter, closedTS hlc.Timestamp,
+) error {
+ as, err := rsl.LoadRangeAppliedState(ctx, readWriter)
+ if err != nil {
+ return err
+ }
+ return rsl.SetRangeAppliedState(
+ ctx, readWriter, as.RaftAppliedIndex, as.LeaseAppliedIndex,
+ as.RangeStats.ToStatsPtr(), &closedTS)
+}
+
// SetLegacyRaftTruncatedState overwrites the truncated state.
func (rsl StateLoader) SetLegacyRaftTruncatedState(
ctx context.Context,
diff --git a/pkg/kv/kvserver/store_merge.go b/pkg/kv/kvserver/store_merge.go
index 0b8c9c03f24c..a8d497b71e86 100644
--- a/pkg/kv/kvserver/store_merge.go
+++ b/pkg/kv/kvserver/store_merge.go
@@ -29,6 +29,7 @@ func (s *Store) MergeRange(
leftRepl *Replica,
newLeftDesc, rightDesc roachpb.RangeDescriptor,
freezeStart hlc.ClockTimestamp,
+ rightClosedTS hlc.Timestamp,
) error {
if oldLeftDesc := leftRepl.Desc(); !oldLeftDesc.EndKey.Less(newLeftDesc.EndKey) {
return errors.Errorf("the new end key is not greater than the current one: %+v <= %+v",
@@ -74,20 +75,36 @@ func (s *Store) MergeRange(
leftLease, _ := leftRepl.GetLease()
rightLease, _ := rightRepl.GetLease()
- if leftLease.OwnedBy(s.Ident.StoreID) && !rightLease.OwnedBy(s.Ident.StoreID) {
- // We hold the lease for the LHS, but do not hold the lease for the RHS.
- // That means we don't have up-to-date timestamp cache entries for the
- // keyspace previously owned by the RHS. Bump the low water mark for the RHS
- // keyspace to freezeStart, the time at which the RHS promised to stop
- // serving traffic, as freezeStart is guaranteed to be greater than any
- // entry in the RHS's timestamp cache.
- //
- // Note that we need to update our clock with freezeStart to preserve the
- // invariant that our clock is always greater than or equal to any
- // timestamps in the timestamp cache. For a full discussion, see the comment
- // on TestStoreRangeMergeTimestampCacheCausality.
- s.Clock().Update(freezeStart)
- setTimestampCacheLowWaterMark(s.tsCache, &rightDesc, freezeStart.ToTimestamp())
+ if leftLease.OwnedBy(s.Ident.StoreID) {
+ if !rightLease.OwnedBy(s.Ident.StoreID) {
+ // We hold the lease for the LHS, but do not hold the lease for the RHS.
+ // That means we don't have up-to-date timestamp cache entries for the
+ // keyspace previously owned by the RHS. Bump the low water mark for the RHS
+ // keyspace to freezeStart, the time at which the RHS promised to stop
+ // serving traffic, as freezeStart is guaranteed to be greater than any
+ // entry in the RHS's timestamp cache.
+ //
+ // Note that we need to update our clock with freezeStart to preserve the
+ // invariant that our clock is always greater than or equal to any
+ // timestamps in the timestamp cache. For a full discussion, see the comment
+ // on TestStoreRangeMergeTimestampCacheCausality.
+ s.Clock().Update(freezeStart)
+ setTimestampCacheLowWaterMark(s.tsCache, &rightDesc, freezeStart.ToTimestamp())
+ }
+ // When merging ranges, the closed timestamp of the RHS can regress. It's
+ // possible that, at subsumption time, the RHS had a high closed timestamp.
+ // Being ingested by the LHS, the closed timestamp of the RHS is lost, and
+ // the LHS's closed timestamp takes over the respective keys. In order to
+ // not violate reads that might have been performed by the RHS according to
+ // the old closed ts (either by the leaseholder or by followers), we bump
+ // the timestamp cache.
+ // In the case when the RHS lease was not collocated with the LHS, this bump
+ // is frequently (but not necessarily) redundant with the bumping to the
+ // freeze time done above.
+ if !rightClosedTS.Synthetic {
+ s.Clock().Update(rightClosedTS.UnsafeToClockTimestamp())
+ }
+ setTimestampCacheLowWaterMark(s.tsCache, &rightDesc, rightClosedTS)
}
// Update the subsuming range's descriptor.
diff --git a/pkg/kv/kvserver/store_split.go b/pkg/kv/kvserver/store_split.go
index 83692feba9f1..7f8dccbfa3c4 100644
--- a/pkg/kv/kvserver/store_split.go
+++ b/pkg/kv/kvserver/store_split.go
@@ -18,6 +18,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/roachpb"
"github.com/cockroachdb/cockroach/pkg/storage"
"github.com/cockroachdb/cockroach/pkg/storage/enginepb"
+ "github.com/cockroachdb/cockroach/pkg/util/hlc"
"github.com/cockroachdb/cockroach/pkg/util/log"
"github.com/cockroachdb/errors"
"go.etcd.io/etcd/raft/v3"
@@ -28,7 +29,12 @@ import (
// changes to the given ReadWriter will be written atomically with the
// split commit.
func splitPreApply(
- ctx context.Context, readWriter storage.ReadWriter, split roachpb.SplitTrigger, r *Replica,
+ ctx context.Context,
+ readWriter storage.ReadWriter,
+ split roachpb.SplitTrigger,
+ r *Replica,
+ // The closed timestamp used to initialize the RHS.
+ closedTS hlc.Timestamp,
) {
// Sanity check that the store is in the split.
//
@@ -116,6 +122,11 @@ func splitPreApply(
log.Fatalf(ctx, "%v", err)
}
+ // Persist the closed timestamp.
+ if err := rsl.SetClosedTimestamp(ctx, readWriter, closedTS); err != nil {
+ log.Fatalf(ctx, "%s", err)
+ }
+
// The initialMaxClosed is assigned to the RHS replica to ensure that
// follower reads do not regress following the split. After the split occurs
// there will be no information in the closedts subsystem about the newly
diff --git a/pkg/kv/kvserver/testing_knobs.go b/pkg/kv/kvserver/testing_knobs.go
index 96ad6bff8468..aaba2ea7c185 100644
--- a/pkg/kv/kvserver/testing_knobs.go
+++ b/pkg/kv/kvserver/testing_knobs.go
@@ -239,6 +239,9 @@ type StoreTestingKnobs struct {
// heartbeats and then expect other replicas to take the lease without
// worrying about Raft).
AllowLeaseRequestProposalsWhenNotLeader bool
+ // DontCloseTimestamps inhibits the propBuf's closing of timestamps. All Raft
+ // commands will carry an empty closed timestamp.
+ DontCloseTimestamps bool
// AllowDangerousReplicationChanges disables safeguards
// in execChangeReplicasTxn that prevent moving
// to a configuration that cannot make progress.
diff --git a/pkg/roachpb/api.pb.go b/pkg/roachpb/api.pb.go
index a50d6497f1c4..d619f1df3fcb 100644
--- a/pkg/roachpb/api.pb.go
+++ b/pkg/roachpb/api.pb.go
@@ -74,7 +74,7 @@ func (x ReadConsistencyType) String() string {
return proto.EnumName(ReadConsistencyType_name, int32(x))
}
func (ReadConsistencyType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{0}
}
// ScanFormat is an enumeration of the available response formats for MVCCScan
@@ -102,7 +102,7 @@ func (x ScanFormat) String() string {
return proto.EnumName(ScanFormat_name, int32(x))
}
func (ScanFormat) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{1}
}
type ChecksumMode int32
@@ -149,7 +149,7 @@ func (x ChecksumMode) String() string {
return proto.EnumName(ChecksumMode_name, int32(x))
}
func (ChecksumMode) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{2}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{2}
}
// PushTxnType determines what action to take when pushing a transaction.
@@ -180,7 +180,7 @@ func (x PushTxnType) String() string {
return proto.EnumName(PushTxnType_name, int32(x))
}
func (PushTxnType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{3}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{3}
}
type ExternalStorageProvider int32
@@ -221,7 +221,7 @@ func (x ExternalStorageProvider) String() string {
return proto.EnumName(ExternalStorageProvider_name, int32(x))
}
func (ExternalStorageProvider) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{4}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{4}
}
type MVCCFilter int32
@@ -244,7 +244,7 @@ func (x MVCCFilter) String() string {
return proto.EnumName(MVCCFilter_name, int32(x))
}
func (MVCCFilter) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{5}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{5}
}
type ResponseHeader_ResumeReason int32
@@ -270,7 +270,7 @@ func (x ResponseHeader_ResumeReason) String() string {
return proto.EnumName(ResponseHeader_ResumeReason_name, int32(x))
}
func (ResponseHeader_ResumeReason) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{1, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{1, 0}
}
type CheckConsistencyResponse_Status int32
@@ -312,7 +312,7 @@ func (x CheckConsistencyResponse_Status) String() string {
return proto.EnumName(CheckConsistencyResponse_Status_name, int32(x))
}
func (CheckConsistencyResponse_Status) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{25, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{25, 0}
}
// RequestHeader is supplied with every storage node request.
@@ -333,7 +333,7 @@ func (m *RequestHeader) Reset() { *m = RequestHeader{} }
func (m *RequestHeader) String() string { return proto.CompactTextString(m) }
func (*RequestHeader) ProtoMessage() {}
func (*RequestHeader) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{0}
}
func (m *RequestHeader) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -399,7 +399,7 @@ func (m *ResponseHeader) Reset() { *m = ResponseHeader{} }
func (m *ResponseHeader) String() string { return proto.CompactTextString(m) }
func (*ResponseHeader) ProtoMessage() {}
func (*ResponseHeader) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{1}
}
func (m *ResponseHeader) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -439,7 +439,7 @@ func (m *GetRequest) Reset() { *m = GetRequest{} }
func (m *GetRequest) String() string { return proto.CompactTextString(m) }
func (*GetRequest) ProtoMessage() {}
func (*GetRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{2}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{2}
}
func (m *GetRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -482,7 +482,7 @@ func (m *GetResponse) Reset() { *m = GetResponse{} }
func (m *GetResponse) String() string { return proto.CompactTextString(m) }
func (*GetResponse) ProtoMessage() {}
func (*GetResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{3}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{3}
}
func (m *GetResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -525,7 +525,7 @@ func (m *PutRequest) Reset() { *m = PutRequest{} }
func (m *PutRequest) String() string { return proto.CompactTextString(m) }
func (*PutRequest) ProtoMessage() {}
func (*PutRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{4}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{4}
}
func (m *PutRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -559,7 +559,7 @@ func (m *PutResponse) Reset() { *m = PutResponse{} }
func (m *PutResponse) String() string { return proto.CompactTextString(m) }
func (*PutResponse) ProtoMessage() {}
func (*PutResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{5}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{5}
}
func (m *PutResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -648,7 +648,7 @@ func (m *ConditionalPutRequest) Reset() { *m = ConditionalPutRequest{} }
func (m *ConditionalPutRequest) String() string { return proto.CompactTextString(m) }
func (*ConditionalPutRequest) ProtoMessage() {}
func (*ConditionalPutRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{6}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{6}
}
func (m *ConditionalPutRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -683,7 +683,7 @@ func (m *ConditionalPutResponse) Reset() { *m = ConditionalPutResponse{}
func (m *ConditionalPutResponse) String() string { return proto.CompactTextString(m) }
func (*ConditionalPutResponse) ProtoMessage() {}
func (*ConditionalPutResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{7}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{7}
}
func (m *ConditionalPutResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -729,7 +729,7 @@ func (m *InitPutRequest) Reset() { *m = InitPutRequest{} }
func (m *InitPutRequest) String() string { return proto.CompactTextString(m) }
func (*InitPutRequest) ProtoMessage() {}
func (*InitPutRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{8}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{8}
}
func (m *InitPutRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -763,7 +763,7 @@ func (m *InitPutResponse) Reset() { *m = InitPutResponse{} }
func (m *InitPutResponse) String() string { return proto.CompactTextString(m) }
func (*InitPutResponse) ProtoMessage() {}
func (*InitPutResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{9}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{9}
}
func (m *InitPutResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -803,7 +803,7 @@ func (m *IncrementRequest) Reset() { *m = IncrementRequest{} }
func (m *IncrementRequest) String() string { return proto.CompactTextString(m) }
func (*IncrementRequest) ProtoMessage() {}
func (*IncrementRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{10}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{10}
}
func (m *IncrementRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -840,7 +840,7 @@ func (m *IncrementResponse) Reset() { *m = IncrementResponse{} }
func (m *IncrementResponse) String() string { return proto.CompactTextString(m) }
func (*IncrementResponse) ProtoMessage() {}
func (*IncrementResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{11}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{11}
}
func (m *IncrementResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -874,7 +874,7 @@ func (m *DeleteRequest) Reset() { *m = DeleteRequest{} }
func (m *DeleteRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteRequest) ProtoMessage() {}
func (*DeleteRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{12}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{12}
}
func (m *DeleteRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -908,7 +908,7 @@ func (m *DeleteResponse) Reset() { *m = DeleteResponse{} }
func (m *DeleteResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteResponse) ProtoMessage() {}
func (*DeleteResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{13}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{13}
}
func (m *DeleteResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -960,7 +960,7 @@ func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} }
func (m *DeleteRangeRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteRangeRequest) ProtoMessage() {}
func (*DeleteRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{14}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{14}
}
func (m *DeleteRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -997,7 +997,7 @@ func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} }
func (m *DeleteRangeResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteRangeResponse) ProtoMessage() {}
func (*DeleteRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{15}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{15}
}
func (m *DeleteRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1052,7 +1052,7 @@ func (m *ClearRangeRequest) Reset() { *m = ClearRangeRequest{} }
func (m *ClearRangeRequest) String() string { return proto.CompactTextString(m) }
func (*ClearRangeRequest) ProtoMessage() {}
func (*ClearRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{16}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{16}
}
func (m *ClearRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1086,7 +1086,7 @@ func (m *ClearRangeResponse) Reset() { *m = ClearRangeResponse{} }
func (m *ClearRangeResponse) String() string { return proto.CompactTextString(m) }
func (*ClearRangeResponse) ProtoMessage() {}
func (*ClearRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{17}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{17}
}
func (m *ClearRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1128,7 +1128,7 @@ func (m *RevertRangeRequest) Reset() { *m = RevertRangeRequest{} }
func (m *RevertRangeRequest) String() string { return proto.CompactTextString(m) }
func (*RevertRangeRequest) ProtoMessage() {}
func (*RevertRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{18}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{18}
}
func (m *RevertRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1162,7 +1162,7 @@ func (m *RevertRangeResponse) Reset() { *m = RevertRangeResponse{} }
func (m *RevertRangeResponse) String() string { return proto.CompactTextString(m) }
func (*RevertRangeResponse) ProtoMessage() {}
func (*RevertRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{19}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{19}
}
func (m *RevertRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1213,7 +1213,7 @@ func (m *ScanRequest) Reset() { *m = ScanRequest{} }
func (m *ScanRequest) String() string { return proto.CompactTextString(m) }
func (*ScanRequest) ProtoMessage() {}
func (*ScanRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{20}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{20}
}
func (m *ScanRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1265,7 +1265,7 @@ func (m *ScanResponse) Reset() { *m = ScanResponse{} }
func (m *ScanResponse) String() string { return proto.CompactTextString(m) }
func (*ScanResponse) ProtoMessage() {}
func (*ScanResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{21}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{21}
}
func (m *ScanResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1316,7 +1316,7 @@ func (m *ReverseScanRequest) Reset() { *m = ReverseScanRequest{} }
func (m *ReverseScanRequest) String() string { return proto.CompactTextString(m) }
func (*ReverseScanRequest) ProtoMessage() {}
func (*ReverseScanRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{22}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{22}
}
func (m *ReverseScanRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1368,7 +1368,7 @@ func (m *ReverseScanResponse) Reset() { *m = ReverseScanResponse{} }
func (m *ReverseScanResponse) String() string { return proto.CompactTextString(m) }
func (*ReverseScanResponse) ProtoMessage() {}
func (*ReverseScanResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{23}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{23}
}
func (m *ReverseScanResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1421,7 +1421,7 @@ func (m *CheckConsistencyRequest) Reset() { *m = CheckConsistencyRequest
func (m *CheckConsistencyRequest) String() string { return proto.CompactTextString(m) }
func (*CheckConsistencyRequest) ProtoMessage() {}
func (*CheckConsistencyRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{24}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{24}
}
func (m *CheckConsistencyRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1458,7 +1458,7 @@ func (m *CheckConsistencyResponse) Reset() { *m = CheckConsistencyRespon
func (m *CheckConsistencyResponse) String() string { return proto.CompactTextString(m) }
func (*CheckConsistencyResponse) ProtoMessage() {}
func (*CheckConsistencyResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{25}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{25}
}
func (m *CheckConsistencyResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1502,7 +1502,7 @@ func (m *CheckConsistencyResponse_Result) Reset() { *m = CheckConsistenc
func (m *CheckConsistencyResponse_Result) String() string { return proto.CompactTextString(m) }
func (*CheckConsistencyResponse_Result) ProtoMessage() {}
func (*CheckConsistencyResponse_Result) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{25, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{25, 0}
}
func (m *CheckConsistencyResponse_Result) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1550,7 +1550,7 @@ func (m *RecomputeStatsRequest) Reset() { *m = RecomputeStatsRequest{} }
func (m *RecomputeStatsRequest) String() string { return proto.CompactTextString(m) }
func (*RecomputeStatsRequest) ProtoMessage() {}
func (*RecomputeStatsRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{26}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{26}
}
func (m *RecomputeStatsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1586,7 +1586,7 @@ func (m *RecomputeStatsResponse) Reset() { *m = RecomputeStatsResponse{}
func (m *RecomputeStatsResponse) String() string { return proto.CompactTextString(m) }
func (*RecomputeStatsResponse) ProtoMessage() {}
func (*RecomputeStatsResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{27}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{27}
}
func (m *RecomputeStatsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1697,7 +1697,7 @@ func (m *EndTxnRequest) Reset() { *m = EndTxnRequest{} }
func (m *EndTxnRequest) String() string { return proto.CompactTextString(m) }
func (*EndTxnRequest) ProtoMessage() {}
func (*EndTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{28}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{28}
}
func (m *EndTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1743,7 +1743,7 @@ func (m *EndTxnResponse) Reset() { *m = EndTxnResponse{} }
func (m *EndTxnResponse) String() string { return proto.CompactTextString(m) }
func (*EndTxnResponse) ProtoMessage() {}
func (*EndTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{29}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{29}
}
func (m *EndTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1804,7 +1804,7 @@ func (m *AdminSplitRequest) Reset() { *m = AdminSplitRequest{} }
func (m *AdminSplitRequest) String() string { return proto.CompactTextString(m) }
func (*AdminSplitRequest) ProtoMessage() {}
func (*AdminSplitRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{30}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{30}
}
func (m *AdminSplitRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1839,7 +1839,7 @@ func (m *AdminSplitResponse) Reset() { *m = AdminSplitResponse{} }
func (m *AdminSplitResponse) String() string { return proto.CompactTextString(m) }
func (*AdminSplitResponse) ProtoMessage() {}
func (*AdminSplitResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{31}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{31}
}
func (m *AdminSplitResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1878,7 +1878,7 @@ func (m *AdminUnsplitRequest) Reset() { *m = AdminUnsplitRequest{} }
func (m *AdminUnsplitRequest) String() string { return proto.CompactTextString(m) }
func (*AdminUnsplitRequest) ProtoMessage() {}
func (*AdminUnsplitRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{32}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{32}
}
func (m *AdminUnsplitRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1913,7 +1913,7 @@ func (m *AdminUnsplitResponse) Reset() { *m = AdminUnsplitResponse{} }
func (m *AdminUnsplitResponse) String() string { return proto.CompactTextString(m) }
func (*AdminUnsplitResponse) ProtoMessage() {}
func (*AdminUnsplitResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{33}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{33}
}
func (m *AdminUnsplitResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1956,7 +1956,7 @@ func (m *AdminMergeRequest) Reset() { *m = AdminMergeRequest{} }
func (m *AdminMergeRequest) String() string { return proto.CompactTextString(m) }
func (*AdminMergeRequest) ProtoMessage() {}
func (*AdminMergeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{34}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{34}
}
func (m *AdminMergeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1991,7 +1991,7 @@ func (m *AdminMergeResponse) Reset() { *m = AdminMergeResponse{} }
func (m *AdminMergeResponse) String() string { return proto.CompactTextString(m) }
func (*AdminMergeResponse) ProtoMessage() {}
func (*AdminMergeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{35}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{35}
}
func (m *AdminMergeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2029,7 +2029,7 @@ func (m *AdminTransferLeaseRequest) Reset() { *m = AdminTransferLeaseReq
func (m *AdminTransferLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*AdminTransferLeaseRequest) ProtoMessage() {}
func (*AdminTransferLeaseRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{36}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{36}
}
func (m *AdminTransferLeaseRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2062,7 +2062,7 @@ func (m *AdminTransferLeaseResponse) Reset() { *m = AdminTransferLeaseRe
func (m *AdminTransferLeaseResponse) String() string { return proto.CompactTextString(m) }
func (*AdminTransferLeaseResponse) ProtoMessage() {}
func (*AdminTransferLeaseResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{37}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{37}
}
func (m *AdminTransferLeaseResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2097,7 +2097,7 @@ func (m *ReplicationChange) Reset() { *m = ReplicationChange{} }
func (m *ReplicationChange) String() string { return proto.CompactTextString(m) }
func (*ReplicationChange) ProtoMessage() {}
func (*ReplicationChange) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{38}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{38}
}
func (m *ReplicationChange) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2155,7 +2155,7 @@ func (m *AdminChangeReplicasRequest) Reset() { *m = AdminChangeReplicasR
func (m *AdminChangeReplicasRequest) String() string { return proto.CompactTextString(m) }
func (*AdminChangeReplicasRequest) ProtoMessage() {}
func (*AdminChangeReplicasRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{39}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{39}
}
func (m *AdminChangeReplicasRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2190,7 +2190,7 @@ func (m *AdminChangeReplicasResponse) Reset() { *m = AdminChangeReplicas
func (m *AdminChangeReplicasResponse) String() string { return proto.CompactTextString(m) }
func (*AdminChangeReplicasResponse) ProtoMessage() {}
func (*AdminChangeReplicasResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{40}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{40}
}
func (m *AdminChangeReplicasResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2228,7 +2228,7 @@ func (m *AdminRelocateRangeRequest) Reset() { *m = AdminRelocateRangeReq
func (m *AdminRelocateRangeRequest) String() string { return proto.CompactTextString(m) }
func (*AdminRelocateRangeRequest) ProtoMessage() {}
func (*AdminRelocateRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{41}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{41}
}
func (m *AdminRelocateRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2261,7 +2261,7 @@ func (m *AdminRelocateRangeResponse) Reset() { *m = AdminRelocateRangeRe
func (m *AdminRelocateRangeResponse) String() string { return proto.CompactTextString(m) }
func (*AdminRelocateRangeResponse) ProtoMessage() {}
func (*AdminRelocateRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{42}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{42}
}
func (m *AdminRelocateRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2303,7 +2303,7 @@ func (m *HeartbeatTxnRequest) Reset() { *m = HeartbeatTxnRequest{} }
func (m *HeartbeatTxnRequest) String() string { return proto.CompactTextString(m) }
func (*HeartbeatTxnRequest) ProtoMessage() {}
func (*HeartbeatTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{43}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{43}
}
func (m *HeartbeatTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2340,7 +2340,7 @@ func (m *HeartbeatTxnResponse) Reset() { *m = HeartbeatTxnResponse{} }
func (m *HeartbeatTxnResponse) String() string { return proto.CompactTextString(m) }
func (*HeartbeatTxnResponse) ProtoMessage() {}
func (*HeartbeatTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{44}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{44}
}
func (m *HeartbeatTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2378,7 +2378,7 @@ func (m *GCRequest) Reset() { *m = GCRequest{} }
func (m *GCRequest) String() string { return proto.CompactTextString(m) }
func (*GCRequest) ProtoMessage() {}
func (*GCRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{45}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{45}
}
func (m *GCRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2412,7 +2412,7 @@ func (m *GCRequest_GCKey) Reset() { *m = GCRequest_GCKey{} }
func (m *GCRequest_GCKey) String() string { return proto.CompactTextString(m) }
func (*GCRequest_GCKey) ProtoMessage() {}
func (*GCRequest_GCKey) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{45, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{45, 0}
}
func (m *GCRequest_GCKey) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2446,7 +2446,7 @@ func (m *GCResponse) Reset() { *m = GCResponse{} }
func (m *GCResponse) String() string { return proto.CompactTextString(m) }
func (*GCResponse) ProtoMessage() {}
func (*GCResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{46}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{46}
}
func (m *GCResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2515,7 +2515,7 @@ func (m *PushTxnRequest) Reset() { *m = PushTxnRequest{} }
func (m *PushTxnRequest) String() string { return proto.CompactTextString(m) }
func (*PushTxnRequest) ProtoMessage() {}
func (*PushTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{47}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{47}
}
func (m *PushTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2558,7 +2558,7 @@ func (m *PushTxnResponse) Reset() { *m = PushTxnResponse{} }
func (m *PushTxnResponse) String() string { return proto.CompactTextString(m) }
func (*PushTxnResponse) ProtoMessage() {}
func (*PushTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{48}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{48}
}
func (m *PushTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2605,7 +2605,7 @@ func (m *RecoverTxnRequest) Reset() { *m = RecoverTxnRequest{} }
func (m *RecoverTxnRequest) String() string { return proto.CompactTextString(m) }
func (*RecoverTxnRequest) ProtoMessage() {}
func (*RecoverTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{49}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{49}
}
func (m *RecoverTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2641,7 +2641,7 @@ func (m *RecoverTxnResponse) Reset() { *m = RecoverTxnResponse{} }
func (m *RecoverTxnResponse) String() string { return proto.CompactTextString(m) }
func (*RecoverTxnResponse) ProtoMessage() {}
func (*RecoverTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{50}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{50}
}
func (m *RecoverTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2685,7 +2685,7 @@ func (m *QueryTxnRequest) Reset() { *m = QueryTxnRequest{} }
func (m *QueryTxnRequest) String() string { return proto.CompactTextString(m) }
func (*QueryTxnRequest) ProtoMessage() {}
func (*QueryTxnRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{51}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{51}
}
func (m *QueryTxnRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2729,7 +2729,7 @@ func (m *QueryTxnResponse) Reset() { *m = QueryTxnResponse{} }
func (m *QueryTxnResponse) String() string { return proto.CompactTextString(m) }
func (*QueryTxnResponse) ProtoMessage() {}
func (*QueryTxnResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{52}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{52}
}
func (m *QueryTxnResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2797,7 +2797,7 @@ func (m *QueryIntentRequest) Reset() { *m = QueryIntentRequest{} }
func (m *QueryIntentRequest) String() string { return proto.CompactTextString(m) }
func (*QueryIntentRequest) ProtoMessage() {}
func (*QueryIntentRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{53}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{53}
}
func (m *QueryIntentRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2833,7 +2833,7 @@ func (m *QueryIntentResponse) Reset() { *m = QueryIntentResponse{} }
func (m *QueryIntentResponse) String() string { return proto.CompactTextString(m) }
func (*QueryIntentResponse) ProtoMessage() {}
func (*QueryIntentResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{54}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{54}
}
func (m *QueryIntentResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2880,7 +2880,7 @@ func (m *ResolveIntentRequest) Reset() { *m = ResolveIntentRequest{} }
func (m *ResolveIntentRequest) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentRequest) ProtoMessage() {}
func (*ResolveIntentRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{55}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{55}
}
func (m *ResolveIntentRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2915,7 +2915,7 @@ func (m *ResolveIntentResponse) Reset() { *m = ResolveIntentResponse{} }
func (m *ResolveIntentResponse) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentResponse) ProtoMessage() {}
func (*ResolveIntentResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{56}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{56}
}
func (m *ResolveIntentResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2966,7 +2966,7 @@ func (m *ResolveIntentRangeRequest) Reset() { *m = ResolveIntentRangeReq
func (m *ResolveIntentRangeRequest) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentRangeRequest) ProtoMessage() {}
func (*ResolveIntentRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{57}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{57}
}
func (m *ResolveIntentRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3001,7 +3001,7 @@ func (m *ResolveIntentRangeResponse) Reset() { *m = ResolveIntentRangeRe
func (m *ResolveIntentRangeResponse) String() string { return proto.CompactTextString(m) }
func (*ResolveIntentRangeResponse) ProtoMessage() {}
func (*ResolveIntentRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{58}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{58}
}
func (m *ResolveIntentRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3038,7 +3038,7 @@ func (m *MergeRequest) Reset() { *m = MergeRequest{} }
func (m *MergeRequest) String() string { return proto.CompactTextString(m) }
func (*MergeRequest) ProtoMessage() {}
func (*MergeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{59}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{59}
}
func (m *MergeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3072,7 +3072,7 @@ func (m *MergeResponse) Reset() { *m = MergeResponse{} }
func (m *MergeResponse) String() string { return proto.CompactTextString(m) }
func (*MergeResponse) ProtoMessage() {}
func (*MergeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{60}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{60}
}
func (m *MergeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3117,7 +3117,7 @@ func (m *TruncateLogRequest) Reset() { *m = TruncateLogRequest{} }
func (m *TruncateLogRequest) String() string { return proto.CompactTextString(m) }
func (*TruncateLogRequest) ProtoMessage() {}
func (*TruncateLogRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{61}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{61}
}
func (m *TruncateLogRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3151,7 +3151,7 @@ func (m *TruncateLogResponse) Reset() { *m = TruncateLogResponse{} }
func (m *TruncateLogResponse) String() string { return proto.CompactTextString(m) }
func (*TruncateLogResponse) ProtoMessage() {}
func (*TruncateLogResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{62}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{62}
}
func (m *TruncateLogResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3195,7 +3195,7 @@ func (m *RequestLeaseRequest) Reset() { *m = RequestLeaseRequest{} }
func (m *RequestLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*RequestLeaseRequest) ProtoMessage() {}
func (*RequestLeaseRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{63}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{63}
}
func (m *RequestLeaseRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3244,7 +3244,7 @@ func (m *TransferLeaseRequest) Reset() { *m = TransferLeaseRequest{} }
func (m *TransferLeaseRequest) String() string { return proto.CompactTextString(m) }
func (*TransferLeaseRequest) ProtoMessage() {}
func (*TransferLeaseRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{64}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{64}
}
func (m *TransferLeaseRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3281,7 +3281,7 @@ func (m *LeaseInfoRequest) Reset() { *m = LeaseInfoRequest{} }
func (m *LeaseInfoRequest) String() string { return proto.CompactTextString(m) }
func (*LeaseInfoRequest) ProtoMessage() {}
func (*LeaseInfoRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{65}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{65}
}
func (m *LeaseInfoRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3318,7 +3318,7 @@ func (m *LeaseInfoResponse) Reset() { *m = LeaseInfoResponse{} }
func (m *LeaseInfoResponse) String() string { return proto.CompactTextString(m) }
func (*LeaseInfoResponse) ProtoMessage() {}
func (*LeaseInfoResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{66}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{66}
}
func (m *LeaseInfoResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3353,7 +3353,7 @@ func (m *RequestLeaseResponse) Reset() { *m = RequestLeaseResponse{} }
func (m *RequestLeaseResponse) String() string { return proto.CompactTextString(m) }
func (*RequestLeaseResponse) ProtoMessage() {}
func (*RequestLeaseResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{67}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{67}
}
func (m *RequestLeaseResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3408,7 +3408,7 @@ func (m *ComputeChecksumRequest) Reset() { *m = ComputeChecksumRequest{}
func (m *ComputeChecksumRequest) String() string { return proto.CompactTextString(m) }
func (*ComputeChecksumRequest) ProtoMessage() {}
func (*ComputeChecksumRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{68}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{68}
}
func (m *ComputeChecksumRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3445,7 +3445,7 @@ func (m *ComputeChecksumResponse) Reset() { *m = ComputeChecksumResponse
func (m *ComputeChecksumResponse) String() string { return proto.CompactTextString(m) }
func (*ComputeChecksumResponse) ProtoMessage() {}
func (*ComputeChecksumResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{69}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{69}
}
func (m *ComputeChecksumResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3485,7 +3485,7 @@ func (m *ExternalStorage) Reset() { *m = ExternalStorage{} }
func (m *ExternalStorage) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage) ProtoMessage() {}
func (*ExternalStorage) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70}
}
func (m *ExternalStorage) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3519,7 +3519,7 @@ func (m *ExternalStorage_LocalFilePath) Reset() { *m = ExternalStorage_L
func (m *ExternalStorage_LocalFilePath) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_LocalFilePath) ProtoMessage() {}
func (*ExternalStorage_LocalFilePath) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 0}
}
func (m *ExternalStorage_LocalFilePath) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3552,7 +3552,7 @@ func (m *ExternalStorage_Http) Reset() { *m = ExternalStorage_Http{} }
func (m *ExternalStorage_Http) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_Http) ProtoMessage() {}
func (*ExternalStorage_Http) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 1}
}
func (m *ExternalStorage_Http) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3594,7 +3594,7 @@ func (m *ExternalStorage_S3) Reset() { *m = ExternalStorage_S3{} }
func (m *ExternalStorage_S3) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_S3) ProtoMessage() {}
func (*ExternalStorage_S3) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 2}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 2}
}
func (m *ExternalStorage_S3) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3633,7 +3633,7 @@ func (m *ExternalStorage_GCS) Reset() { *m = ExternalStorage_GCS{} }
func (m *ExternalStorage_GCS) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_GCS) ProtoMessage() {}
func (*ExternalStorage_GCS) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 3}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 3}
}
func (m *ExternalStorage_GCS) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3669,7 +3669,7 @@ func (m *ExternalStorage_Azure) Reset() { *m = ExternalStorage_Azure{} }
func (m *ExternalStorage_Azure) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_Azure) ProtoMessage() {}
func (*ExternalStorage_Azure) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 4}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 4}
}
func (m *ExternalStorage_Azure) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3708,7 +3708,7 @@ func (m *ExternalStorage_Workload) Reset() { *m = ExternalStorage_Worklo
func (m *ExternalStorage_Workload) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_Workload) ProtoMessage() {}
func (*ExternalStorage_Workload) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 5}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 5}
}
func (m *ExternalStorage_Workload) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3750,7 +3750,7 @@ func (m *ExternalStorage_FileTable) Reset() { *m = ExternalStorage_FileT
func (m *ExternalStorage_FileTable) String() string { return proto.CompactTextString(m) }
func (*ExternalStorage_FileTable) ProtoMessage() {}
func (*ExternalStorage_FileTable) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{70, 6}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{70, 6}
}
func (m *ExternalStorage_FileTable) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3790,7 +3790,7 @@ func (m *WriteBatchRequest) Reset() { *m = WriteBatchRequest{} }
func (m *WriteBatchRequest) String() string { return proto.CompactTextString(m) }
func (*WriteBatchRequest) ProtoMessage() {}
func (*WriteBatchRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{71}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{71}
}
func (m *WriteBatchRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3824,7 +3824,7 @@ func (m *WriteBatchResponse) Reset() { *m = WriteBatchResponse{} }
func (m *WriteBatchResponse) String() string { return proto.CompactTextString(m) }
func (*WriteBatchResponse) ProtoMessage() {}
func (*WriteBatchResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{72}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{72}
}
func (m *WriteBatchResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3860,7 +3860,7 @@ func (m *FileEncryptionOptions) Reset() { *m = FileEncryptionOptions{} }
func (m *FileEncryptionOptions) String() string { return proto.CompactTextString(m) }
func (*FileEncryptionOptions) ProtoMessage() {}
func (*FileEncryptionOptions) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{73}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{73}
}
func (m *FileEncryptionOptions) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3930,7 +3930,7 @@ func (m *ExportRequest) Reset() { *m = ExportRequest{} }
func (m *ExportRequest) String() string { return proto.CompactTextString(m) }
func (*ExportRequest) ProtoMessage() {}
func (*ExportRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{74}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{74}
}
func (m *ExportRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3982,7 +3982,7 @@ func (m *BulkOpSummary) Reset() { *m = BulkOpSummary{} }
func (m *BulkOpSummary) String() string { return proto.CompactTextString(m) }
func (*BulkOpSummary) ProtoMessage() {}
func (*BulkOpSummary) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{75}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{75}
}
func (m *BulkOpSummary) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4018,7 +4018,7 @@ func (m *ExportResponse) Reset() { *m = ExportResponse{} }
func (m *ExportResponse) String() string { return proto.CompactTextString(m) }
func (*ExportResponse) ProtoMessage() {}
func (*ExportResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{76}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{76}
}
func (m *ExportResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4058,7 +4058,7 @@ func (m *ExportResponse_File) Reset() { *m = ExportResponse_File{} }
func (m *ExportResponse_File) String() string { return proto.CompactTextString(m) }
func (*ExportResponse_File) ProtoMessage() {}
func (*ExportResponse_File) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{76, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{76, 0}
}
func (m *ExportResponse_File) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4109,7 +4109,7 @@ func (m *ImportRequest) Reset() { *m = ImportRequest{} }
func (m *ImportRequest) String() string { return proto.CompactTextString(m) }
func (*ImportRequest) ProtoMessage() {}
func (*ImportRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{77}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{77}
}
func (m *ImportRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4144,7 +4144,7 @@ func (m *ImportRequest_File) Reset() { *m = ImportRequest_File{} }
func (m *ImportRequest_File) String() string { return proto.CompactTextString(m) }
func (*ImportRequest_File) ProtoMessage() {}
func (*ImportRequest_File) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{77, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{77, 0}
}
func (m *ImportRequest_File) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4180,7 +4180,7 @@ func (m *ImportRequest_TableRekey) Reset() { *m = ImportRequest_TableRek
func (m *ImportRequest_TableRekey) String() string { return proto.CompactTextString(m) }
func (*ImportRequest_TableRekey) ProtoMessage() {}
func (*ImportRequest_TableRekey) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{77, 1}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{77, 1}
}
func (m *ImportRequest_TableRekey) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4215,7 +4215,7 @@ func (m *ImportResponse) Reset() { *m = ImportResponse{} }
func (m *ImportResponse) String() string { return proto.CompactTextString(m) }
func (*ImportResponse) ProtoMessage() {}
func (*ImportResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{78}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{78}
}
func (m *ImportResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4253,7 +4253,7 @@ func (m *AdminScatterRequest) Reset() { *m = AdminScatterRequest{} }
func (m *AdminScatterRequest) String() string { return proto.CompactTextString(m) }
func (*AdminScatterRequest) ProtoMessage() {}
func (*AdminScatterRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{79}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{79}
}
func (m *AdminScatterRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4290,7 +4290,7 @@ func (m *AdminScatterResponse) Reset() { *m = AdminScatterResponse{} }
func (m *AdminScatterResponse) String() string { return proto.CompactTextString(m) }
func (*AdminScatterResponse) ProtoMessage() {}
func (*AdminScatterResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{80}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{80}
}
func (m *AdminScatterResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4323,7 +4323,7 @@ func (m *AdminScatterResponse_Range) Reset() { *m = AdminScatterResponse
func (m *AdminScatterResponse_Range) String() string { return proto.CompactTextString(m) }
func (*AdminScatterResponse_Range) ProtoMessage() {}
func (*AdminScatterResponse_Range) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{80, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{80, 0}
}
func (m *AdminScatterResponse_Range) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4368,7 +4368,7 @@ func (m *AdminVerifyProtectedTimestampRequest) Reset() { *m = AdminVerif
func (m *AdminVerifyProtectedTimestampRequest) String() string { return proto.CompactTextString(m) }
func (*AdminVerifyProtectedTimestampRequest) ProtoMessage() {}
func (*AdminVerifyProtectedTimestampRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{81}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{81}
}
func (m *AdminVerifyProtectedTimestampRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4406,7 +4406,7 @@ func (m *AdminVerifyProtectedTimestampResponse) Reset() { *m = AdminVeri
func (m *AdminVerifyProtectedTimestampResponse) String() string { return proto.CompactTextString(m) }
func (*AdminVerifyProtectedTimestampResponse) ProtoMessage() {}
func (*AdminVerifyProtectedTimestampResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{82}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{82}
}
func (m *AdminVerifyProtectedTimestampResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4459,7 +4459,7 @@ func (m *AddSSTableRequest) Reset() { *m = AddSSTableRequest{} }
func (m *AddSSTableRequest) String() string { return proto.CompactTextString(m) }
func (*AddSSTableRequest) ProtoMessage() {}
func (*AddSSTableRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{83}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{83}
}
func (m *AddSSTableRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4493,7 +4493,7 @@ func (m *AddSSTableResponse) Reset() { *m = AddSSTableResponse{} }
func (m *AddSSTableResponse) String() string { return proto.CompactTextString(m) }
func (*AddSSTableResponse) ProtoMessage() {}
func (*AddSSTableResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{84}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{84}
}
func (m *AddSSTableResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4537,7 +4537,7 @@ func (m *RefreshRequest) Reset() { *m = RefreshRequest{} }
func (m *RefreshRequest) String() string { return proto.CompactTextString(m) }
func (*RefreshRequest) ProtoMessage() {}
func (*RefreshRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{85}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{85}
}
func (m *RefreshRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4571,7 +4571,7 @@ func (m *RefreshResponse) Reset() { *m = RefreshResponse{} }
func (m *RefreshResponse) String() string { return proto.CompactTextString(m) }
func (*RefreshResponse) ProtoMessage() {}
func (*RefreshResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{86}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{86}
}
func (m *RefreshResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4610,7 +4610,7 @@ func (m *RefreshRangeRequest) Reset() { *m = RefreshRangeRequest{} }
func (m *RefreshRangeRequest) String() string { return proto.CompactTextString(m) }
func (*RefreshRangeRequest) ProtoMessage() {}
func (*RefreshRangeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{87}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{87}
}
func (m *RefreshRangeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4644,7 +4644,7 @@ func (m *RefreshRangeResponse) Reset() { *m = RefreshRangeResponse{} }
func (m *RefreshRangeResponse) String() string { return proto.CompactTextString(m) }
func (*RefreshRangeResponse) ProtoMessage() {}
func (*RefreshRangeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{88}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{88}
}
func (m *RefreshRangeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4693,7 +4693,7 @@ func (m *SubsumeRequest) Reset() { *m = SubsumeRequest{} }
func (m *SubsumeRequest) String() string { return proto.CompactTextString(m) }
func (*SubsumeRequest) ProtoMessage() {}
func (*SubsumeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{89}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{89}
}
func (m *SubsumeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4736,13 +4736,27 @@ type SubsumeResponse struct {
// being subsumed). It is suitable for use as the timestamp cache's low water
// mark for the keys previously owned by the subsumed range.
FreezeStart github_com_cockroachdb_cockroach_pkg_util_hlc.ClockTimestamp `protobuf:"bytes,5,opt,name=freeze_start,json=freezeStart,proto3,casttype=github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp" json:"freeze_start"`
+ // closed_timestamp is the range's closed timestamp at the moment of the
+ // subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ ClosedTimestamp hlc.Timestamp `protobuf:"bytes,6,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp"`
}
func (m *SubsumeResponse) Reset() { *m = SubsumeResponse{} }
func (m *SubsumeResponse) String() string { return proto.CompactTextString(m) }
func (*SubsumeResponse) ProtoMessage() {}
func (*SubsumeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{90}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{90}
}
func (m *SubsumeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4777,7 +4791,7 @@ func (m *RangeStatsRequest) Reset() { *m = RangeStatsRequest{} }
func (m *RangeStatsRequest) String() string { return proto.CompactTextString(m) }
func (*RangeStatsRequest) ProtoMessage() {}
func (*RangeStatsRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{91}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{91}
}
func (m *RangeStatsRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4818,7 +4832,7 @@ func (m *RangeStatsResponse) Reset() { *m = RangeStatsResponse{} }
func (m *RangeStatsResponse) String() string { return proto.CompactTextString(m) }
func (*RangeStatsResponse) ProtoMessage() {}
func (*RangeStatsResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{92}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{92}
}
func (m *RangeStatsResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4861,7 +4875,7 @@ func (m *MigrateRequest) Reset() { *m = MigrateRequest{} }
func (m *MigrateRequest) String() string { return proto.CompactTextString(m) }
func (*MigrateRequest) ProtoMessage() {}
func (*MigrateRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{93}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{93}
}
func (m *MigrateRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4895,7 +4909,7 @@ func (m *MigrateResponse) Reset() { *m = MigrateResponse{} }
func (m *MigrateResponse) String() string { return proto.CompactTextString(m) }
func (*MigrateResponse) ProtoMessage() {}
func (*MigrateResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{94}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{94}
}
func (m *MigrateResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4979,7 +4993,7 @@ func (m *RequestUnion) Reset() { *m = RequestUnion{} }
func (m *RequestUnion) String() string { return proto.CompactTextString(m) }
func (*RequestUnion) ProtoMessage() {}
func (*RequestUnion) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{95}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{95}
}
func (m *RequestUnion) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -6460,7 +6474,7 @@ func (m *ResponseUnion) Reset() { *m = ResponseUnion{} }
func (m *ResponseUnion) String() string { return proto.CompactTextString(m) }
func (*ResponseUnion) ProtoMessage() {}
func (*ResponseUnion) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{96}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{96}
}
func (m *ResponseUnion) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8016,7 +8030,7 @@ func (m *Header) Reset() { *m = Header{} }
func (m *Header) String() string { return proto.CompactTextString(m) }
func (*Header) ProtoMessage() {}
func (*Header) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{97}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{97}
}
func (m *Header) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8052,7 +8066,7 @@ type BatchRequest struct {
func (m *BatchRequest) Reset() { *m = BatchRequest{} }
func (*BatchRequest) ProtoMessage() {}
func (*BatchRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{98}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{98}
}
func (m *BatchRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8089,7 +8103,7 @@ type BatchResponse struct {
func (m *BatchResponse) Reset() { *m = BatchResponse{} }
func (*BatchResponse) ProtoMessage() {}
func (*BatchResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{99}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{99}
}
func (m *BatchResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8165,7 +8179,7 @@ func (m *BatchResponse_Header) Reset() { *m = BatchResponse_Header{} }
func (m *BatchResponse_Header) String() string { return proto.CompactTextString(m) }
func (*BatchResponse_Header) ProtoMessage() {}
func (*BatchResponse_Header) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{99, 0}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{99, 0}
}
func (m *BatchResponse_Header) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8203,7 +8217,7 @@ func (m *RangeLookupRequest) Reset() { *m = RangeLookupRequest{} }
func (m *RangeLookupRequest) String() string { return proto.CompactTextString(m) }
func (*RangeLookupRequest) ProtoMessage() {}
func (*RangeLookupRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{100}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{100}
}
func (m *RangeLookupRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8241,7 +8255,7 @@ func (m *RangeLookupResponse) Reset() { *m = RangeLookupResponse{} }
func (m *RangeLookupResponse) String() string { return proto.CompactTextString(m) }
func (*RangeLookupResponse) ProtoMessage() {}
func (*RangeLookupResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{101}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{101}
}
func (m *RangeLookupResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8280,7 +8294,7 @@ func (m *RangeFeedRequest) Reset() { *m = RangeFeedRequest{} }
func (m *RangeFeedRequest) String() string { return proto.CompactTextString(m) }
func (*RangeFeedRequest) ProtoMessage() {}
func (*RangeFeedRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{102}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{102}
}
func (m *RangeFeedRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8321,7 +8335,7 @@ func (m *RangeFeedValue) Reset() { *m = RangeFeedValue{} }
func (m *RangeFeedValue) String() string { return proto.CompactTextString(m) }
func (*RangeFeedValue) ProtoMessage() {}
func (*RangeFeedValue) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{103}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{103}
}
func (m *RangeFeedValue) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8362,7 +8376,7 @@ func (m *RangeFeedCheckpoint) Reset() { *m = RangeFeedCheckpoint{} }
func (m *RangeFeedCheckpoint) String() string { return proto.CompactTextString(m) }
func (*RangeFeedCheckpoint) ProtoMessage() {}
func (*RangeFeedCheckpoint) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{104}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{104}
}
func (m *RangeFeedCheckpoint) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8399,7 +8413,7 @@ func (m *RangeFeedError) Reset() { *m = RangeFeedError{} }
func (m *RangeFeedError) String() string { return proto.CompactTextString(m) }
func (*RangeFeedError) ProtoMessage() {}
func (*RangeFeedError) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{105}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{105}
}
func (m *RangeFeedError) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8436,7 +8450,7 @@ func (m *RangeFeedEvent) Reset() { *m = RangeFeedEvent{} }
func (m *RangeFeedEvent) String() string { return proto.CompactTextString(m) }
func (*RangeFeedEvent) ProtoMessage() {}
func (*RangeFeedEvent) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{106}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{106}
}
func (m *RangeFeedEvent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8480,7 +8494,7 @@ func (m *ResetQuorumRequest) Reset() { *m = ResetQuorumRequest{} }
func (m *ResetQuorumRequest) String() string { return proto.CompactTextString(m) }
func (*ResetQuorumRequest) ProtoMessage() {}
func (*ResetQuorumRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{107}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{107}
}
func (m *ResetQuorumRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8512,7 +8526,7 @@ func (m *ResetQuorumResponse) Reset() { *m = ResetQuorumResponse{} }
func (m *ResetQuorumResponse) String() string { return proto.CompactTextString(m) }
func (*ResetQuorumResponse) ProtoMessage() {}
func (*ResetQuorumResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{108}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{108}
}
func (m *ResetQuorumResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8553,7 +8567,7 @@ func (m *GossipSubscriptionRequest) Reset() { *m = GossipSubscriptionReq
func (m *GossipSubscriptionRequest) String() string { return proto.CompactTextString(m) }
func (*GossipSubscriptionRequest) ProtoMessage() {}
func (*GossipSubscriptionRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{109}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{109}
}
func (m *GossipSubscriptionRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8593,7 +8607,7 @@ func (m *GossipSubscriptionEvent) Reset() { *m = GossipSubscriptionEvent
func (m *GossipSubscriptionEvent) String() string { return proto.CompactTextString(m) }
func (*GossipSubscriptionEvent) ProtoMessage() {}
func (*GossipSubscriptionEvent) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{110}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{110}
}
func (m *GossipSubscriptionEvent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8629,7 +8643,7 @@ func (m *JoinNodeRequest) Reset() { *m = JoinNodeRequest{} }
func (m *JoinNodeRequest) String() string { return proto.CompactTextString(m) }
func (*JoinNodeRequest) ProtoMessage() {}
func (*JoinNodeRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{111}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{111}
}
func (m *JoinNodeRequest) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8668,7 +8682,7 @@ func (m *JoinNodeResponse) Reset() { *m = JoinNodeResponse{} }
func (m *JoinNodeResponse) String() string { return proto.CompactTextString(m) }
func (*JoinNodeResponse) ProtoMessage() {}
func (*JoinNodeResponse) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{112}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{112}
}
func (m *JoinNodeResponse) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -8708,7 +8722,7 @@ type ContentionEvent struct {
func (m *ContentionEvent) Reset() { *m = ContentionEvent{} }
func (*ContentionEvent) ProtoMessage() {}
func (*ContentionEvent) Descriptor() ([]byte, []int) {
- return fileDescriptor_api_30e97dda177d9566, []int{113}
+ return fileDescriptor_api_7ab19f7b4624e210, []int{113}
}
func (m *ContentionEvent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -13504,6 +13518,14 @@ func (m *SubsumeResponse) MarshalTo(dAtA []byte) (int, error) {
return 0, err
}
i += n157
+ dAtA[i] = 0x32
+ i++
+ i = encodeVarintApi(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n158, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n158
return i, nil
}
@@ -13525,11 +13547,11 @@ func (m *RangeStatsRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestHeader.Size()))
- n158, err := m.RequestHeader.MarshalTo(dAtA[i:])
+ n159, err := m.RequestHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n158
+ i += n159
return i, nil
}
@@ -13551,19 +13573,19 @@ func (m *RangeStatsResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResponseHeader.Size()))
- n159, err := m.ResponseHeader.MarshalTo(dAtA[i:])
+ n160, err := m.ResponseHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n159
+ i += n160
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.MVCCStats.Size()))
- n160, err := m.MVCCStats.MarshalTo(dAtA[i:])
+ n161, err := m.MVCCStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n160
+ i += n161
if m.QueriesPerSecond != 0 {
dAtA[i] = 0x19
i++
@@ -13573,11 +13595,11 @@ func (m *RangeStatsResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.RangeInfo.Size()))
- n161, err := m.RangeInfo.MarshalTo(dAtA[i:])
+ n162, err := m.RangeInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n161
+ i += n162
return i, nil
}
@@ -13599,19 +13621,19 @@ func (m *MigrateRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestHeader.Size()))
- n162, err := m.RequestHeader.MarshalTo(dAtA[i:])
+ n163, err := m.RequestHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n162
+ i += n163
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Version.Size()))
- n163, err := m.Version.MarshalTo(dAtA[i:])
+ n164, err := m.Version.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n163
+ i += n164
return i, nil
}
@@ -13633,11 +13655,11 @@ func (m *MigrateResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResponseHeader.Size()))
- n164, err := m.ResponseHeader.MarshalTo(dAtA[i:])
+ n165, err := m.ResponseHeader.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n164
+ i += n165
return i, nil
}
@@ -13657,11 +13679,11 @@ func (m *RequestUnion) MarshalTo(dAtA []byte) (int, error) {
var l int
_ = l
if m.Value != nil {
- nn165, err := m.Value.MarshalTo(dAtA[i:])
+ nn166, err := m.Value.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += nn165
+ i += nn166
}
return i, nil
}
@@ -13672,11 +13694,11 @@ func (m *RequestUnion_Get) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Get.Size()))
- n166, err := m.Get.MarshalTo(dAtA[i:])
+ n167, err := m.Get.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n166
+ i += n167
}
return i, nil
}
@@ -13686,11 +13708,11 @@ func (m *RequestUnion_Put) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Put.Size()))
- n167, err := m.Put.MarshalTo(dAtA[i:])
+ n168, err := m.Put.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n167
+ i += n168
}
return i, nil
}
@@ -13700,11 +13722,11 @@ func (m *RequestUnion_ConditionalPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.ConditionalPut.Size()))
- n168, err := m.ConditionalPut.MarshalTo(dAtA[i:])
+ n169, err := m.ConditionalPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n168
+ i += n169
}
return i, nil
}
@@ -13714,11 +13736,11 @@ func (m *RequestUnion_Increment) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.Increment.Size()))
- n169, err := m.Increment.MarshalTo(dAtA[i:])
+ n170, err := m.Increment.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n169
+ i += n170
}
return i, nil
}
@@ -13728,11 +13750,11 @@ func (m *RequestUnion_Delete) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Delete.Size()))
- n170, err := m.Delete.MarshalTo(dAtA[i:])
+ n171, err := m.Delete.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n170
+ i += n171
}
return i, nil
}
@@ -13742,11 +13764,11 @@ func (m *RequestUnion_DeleteRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x32
i++
i = encodeVarintApi(dAtA, i, uint64(m.DeleteRange.Size()))
- n171, err := m.DeleteRange.MarshalTo(dAtA[i:])
+ n172, err := m.DeleteRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n171
+ i += n172
}
return i, nil
}
@@ -13756,11 +13778,11 @@ func (m *RequestUnion_Scan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Scan.Size()))
- n172, err := m.Scan.MarshalTo(dAtA[i:])
+ n173, err := m.Scan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n172
+ i += n173
}
return i, nil
}
@@ -13770,11 +13792,11 @@ func (m *RequestUnion_EndTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x4a
i++
i = encodeVarintApi(dAtA, i, uint64(m.EndTxn.Size()))
- n173, err := m.EndTxn.MarshalTo(dAtA[i:])
+ n174, err := m.EndTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n173
+ i += n174
}
return i, nil
}
@@ -13784,11 +13806,11 @@ func (m *RequestUnion_AdminSplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x52
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminSplit.Size()))
- n174, err := m.AdminSplit.MarshalTo(dAtA[i:])
+ n175, err := m.AdminSplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n174
+ i += n175
}
return i, nil
}
@@ -13798,11 +13820,11 @@ func (m *RequestUnion_AdminMerge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x5a
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminMerge.Size()))
- n175, err := m.AdminMerge.MarshalTo(dAtA[i:])
+ n176, err := m.AdminMerge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n175
+ i += n176
}
return i, nil
}
@@ -13812,11 +13834,11 @@ func (m *RequestUnion_HeartbeatTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x62
i++
i = encodeVarintApi(dAtA, i, uint64(m.HeartbeatTxn.Size()))
- n176, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
+ n177, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n176
+ i += n177
}
return i, nil
}
@@ -13826,11 +13848,11 @@ func (m *RequestUnion_Gc) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x6a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Gc.Size()))
- n177, err := m.Gc.MarshalTo(dAtA[i:])
+ n178, err := m.Gc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n177
+ i += n178
}
return i, nil
}
@@ -13840,11 +13862,11 @@ func (m *RequestUnion_PushTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x72
i++
i = encodeVarintApi(dAtA, i, uint64(m.PushTxn.Size()))
- n178, err := m.PushTxn.MarshalTo(dAtA[i:])
+ n179, err := m.PushTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n178
+ i += n179
}
return i, nil
}
@@ -13856,11 +13878,11 @@ func (m *RequestUnion_ResolveIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntent.Size()))
- n179, err := m.ResolveIntent.MarshalTo(dAtA[i:])
+ n180, err := m.ResolveIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n179
+ i += n180
}
return i, nil
}
@@ -13872,11 +13894,11 @@ func (m *RequestUnion_ResolveIntentRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntentRange.Size()))
- n180, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
+ n181, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n180
+ i += n181
}
return i, nil
}
@@ -13888,11 +13910,11 @@ func (m *RequestUnion_Merge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.Merge.Size()))
- n181, err := m.Merge.MarshalTo(dAtA[i:])
+ n182, err := m.Merge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n181
+ i += n182
}
return i, nil
}
@@ -13904,11 +13926,11 @@ func (m *RequestUnion_TruncateLog) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.TruncateLog.Size()))
- n182, err := m.TruncateLog.MarshalTo(dAtA[i:])
+ n183, err := m.TruncateLog.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n182
+ i += n183
}
return i, nil
}
@@ -13920,11 +13942,11 @@ func (m *RequestUnion_RequestLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestLease.Size()))
- n183, err := m.RequestLease.MarshalTo(dAtA[i:])
+ n184, err := m.RequestLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n183
+ i += n184
}
return i, nil
}
@@ -13936,11 +13958,11 @@ func (m *RequestUnion_ReverseScan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ReverseScan.Size()))
- n184, err := m.ReverseScan.MarshalTo(dAtA[i:])
+ n185, err := m.ReverseScan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n184
+ i += n185
}
return i, nil
}
@@ -13952,11 +13974,11 @@ func (m *RequestUnion_ComputeChecksum) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ComputeChecksum.Size()))
- n185, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
+ n186, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n185
+ i += n186
}
return i, nil
}
@@ -13968,11 +13990,11 @@ func (m *RequestUnion_CheckConsistency) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.CheckConsistency.Size()))
- n186, err := m.CheckConsistency.MarshalTo(dAtA[i:])
+ n187, err := m.CheckConsistency.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n186
+ i += n187
}
return i, nil
}
@@ -13984,11 +14006,11 @@ func (m *RequestUnion_InitPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.InitPut.Size()))
- n187, err := m.InitPut.MarshalTo(dAtA[i:])
+ n188, err := m.InitPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n187
+ i += n188
}
return i, nil
}
@@ -14000,11 +14022,11 @@ func (m *RequestUnion_TransferLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.TransferLease.Size()))
- n188, err := m.TransferLease.MarshalTo(dAtA[i:])
+ n189, err := m.TransferLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n188
+ i += n189
}
return i, nil
}
@@ -14016,11 +14038,11 @@ func (m *RequestUnion_AdminTransferLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminTransferLease.Size()))
- n189, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
+ n190, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n189
+ i += n190
}
return i, nil
}
@@ -14032,11 +14054,11 @@ func (m *RequestUnion_LeaseInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.LeaseInfo.Size()))
- n190, err := m.LeaseInfo.MarshalTo(dAtA[i:])
+ n191, err := m.LeaseInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n190
+ i += n191
}
return i, nil
}
@@ -14048,11 +14070,11 @@ func (m *RequestUnion_WriteBatch) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.WriteBatch.Size()))
- n191, err := m.WriteBatch.MarshalTo(dAtA[i:])
+ n192, err := m.WriteBatch.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n191
+ i += n192
}
return i, nil
}
@@ -14064,11 +14086,11 @@ func (m *RequestUnion_Export) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Export.Size()))
- n192, err := m.Export.MarshalTo(dAtA[i:])
+ n193, err := m.Export.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n192
+ i += n193
}
return i, nil
}
@@ -14080,11 +14102,11 @@ func (m *RequestUnion_QueryTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryTxn.Size()))
- n193, err := m.QueryTxn.MarshalTo(dAtA[i:])
+ n194, err := m.QueryTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n193
+ i += n194
}
return i, nil
}
@@ -14096,11 +14118,11 @@ func (m *RequestUnion_Import) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Import.Size()))
- n194, err := m.Import.MarshalTo(dAtA[i:])
+ n195, err := m.Import.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n194
+ i += n195
}
return i, nil
}
@@ -14112,11 +14134,11 @@ func (m *RequestUnion_AdminChangeReplicas) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminChangeReplicas.Size()))
- n195, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
+ n196, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n195
+ i += n196
}
return i, nil
}
@@ -14128,11 +14150,11 @@ func (m *RequestUnion_AdminScatter) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminScatter.Size()))
- n196, err := m.AdminScatter.MarshalTo(dAtA[i:])
+ n197, err := m.AdminScatter.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n196
+ i += n197
}
return i, nil
}
@@ -14144,11 +14166,11 @@ func (m *RequestUnion_AddSstable) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AddSstable.Size()))
- n197, err := m.AddSstable.MarshalTo(dAtA[i:])
+ n198, err := m.AddSstable.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n197
+ i += n198
}
return i, nil
}
@@ -14160,11 +14182,11 @@ func (m *RequestUnion_ClearRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.ClearRange.Size()))
- n198, err := m.ClearRange.MarshalTo(dAtA[i:])
+ n199, err := m.ClearRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n198
+ i += n199
}
return i, nil
}
@@ -14176,11 +14198,11 @@ func (m *RequestUnion_RecomputeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecomputeStats.Size()))
- n199, err := m.RecomputeStats.MarshalTo(dAtA[i:])
+ n200, err := m.RecomputeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n199
+ i += n200
}
return i, nil
}
@@ -14192,11 +14214,11 @@ func (m *RequestUnion_Refresh) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Refresh.Size()))
- n200, err := m.Refresh.MarshalTo(dAtA[i:])
+ n201, err := m.Refresh.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n200
+ i += n201
}
return i, nil
}
@@ -14208,11 +14230,11 @@ func (m *RequestUnion_RefreshRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RefreshRange.Size()))
- n201, err := m.RefreshRange.MarshalTo(dAtA[i:])
+ n202, err := m.RefreshRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n201
+ i += n202
}
return i, nil
}
@@ -14224,11 +14246,11 @@ func (m *RequestUnion_QueryIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryIntent.Size()))
- n202, err := m.QueryIntent.MarshalTo(dAtA[i:])
+ n203, err := m.QueryIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n202
+ i += n203
}
return i, nil
}
@@ -14240,11 +14262,11 @@ func (m *RequestUnion_Subsume) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Subsume.Size()))
- n203, err := m.Subsume.MarshalTo(dAtA[i:])
+ n204, err := m.Subsume.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n203
+ i += n204
}
return i, nil
}
@@ -14256,11 +14278,11 @@ func (m *RequestUnion_RangeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RangeStats.Size()))
- n204, err := m.RangeStats.MarshalTo(dAtA[i:])
+ n205, err := m.RangeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n204
+ i += n205
}
return i, nil
}
@@ -14272,11 +14294,11 @@ func (m *RequestUnion_AdminRelocateRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminRelocateRange.Size()))
- n205, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
+ n206, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n205
+ i += n206
}
return i, nil
}
@@ -14288,11 +14310,11 @@ func (m *RequestUnion_RecoverTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecoverTxn.Size()))
- n206, err := m.RecoverTxn.MarshalTo(dAtA[i:])
+ n207, err := m.RecoverTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n206
+ i += n207
}
return i, nil
}
@@ -14304,11 +14326,11 @@ func (m *RequestUnion_AdminUnsplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminUnsplit.Size()))
- n207, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
+ n208, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n207
+ i += n208
}
return i, nil
}
@@ -14320,11 +14342,11 @@ func (m *RequestUnion_RevertRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.RevertRange.Size()))
- n208, err := m.RevertRange.MarshalTo(dAtA[i:])
+ n209, err := m.RevertRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n208
+ i += n209
}
return i, nil
}
@@ -14336,11 +14358,11 @@ func (m *RequestUnion_AdminVerifyProtectedTimestamp) MarshalTo(dAtA []byte) (int
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminVerifyProtectedTimestamp.Size()))
- n209, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
+ n210, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n209
+ i += n210
}
return i, nil
}
@@ -14352,11 +14374,11 @@ func (m *RequestUnion_Migrate) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.Migrate.Size()))
- n210, err := m.Migrate.MarshalTo(dAtA[i:])
+ n211, err := m.Migrate.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n210
+ i += n211
}
return i, nil
}
@@ -14376,11 +14398,11 @@ func (m *ResponseUnion) MarshalTo(dAtA []byte) (int, error) {
var l int
_ = l
if m.Value != nil {
- nn211, err := m.Value.MarshalTo(dAtA[i:])
+ nn212, err := m.Value.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += nn211
+ i += nn212
}
return i, nil
}
@@ -14391,11 +14413,11 @@ func (m *ResponseUnion_Get) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Get.Size()))
- n212, err := m.Get.MarshalTo(dAtA[i:])
+ n213, err := m.Get.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n212
+ i += n213
}
return i, nil
}
@@ -14405,11 +14427,11 @@ func (m *ResponseUnion_Put) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Put.Size()))
- n213, err := m.Put.MarshalTo(dAtA[i:])
+ n214, err := m.Put.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n213
+ i += n214
}
return i, nil
}
@@ -14419,11 +14441,11 @@ func (m *ResponseUnion_ConditionalPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.ConditionalPut.Size()))
- n214, err := m.ConditionalPut.MarshalTo(dAtA[i:])
+ n215, err := m.ConditionalPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n214
+ i += n215
}
return i, nil
}
@@ -14433,11 +14455,11 @@ func (m *ResponseUnion_Increment) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.Increment.Size()))
- n215, err := m.Increment.MarshalTo(dAtA[i:])
+ n216, err := m.Increment.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n215
+ i += n216
}
return i, nil
}
@@ -14447,11 +14469,11 @@ func (m *ResponseUnion_Delete) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Delete.Size()))
- n216, err := m.Delete.MarshalTo(dAtA[i:])
+ n217, err := m.Delete.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n216
+ i += n217
}
return i, nil
}
@@ -14461,11 +14483,11 @@ func (m *ResponseUnion_DeleteRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x32
i++
i = encodeVarintApi(dAtA, i, uint64(m.DeleteRange.Size()))
- n217, err := m.DeleteRange.MarshalTo(dAtA[i:])
+ n218, err := m.DeleteRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n217
+ i += n218
}
return i, nil
}
@@ -14475,11 +14497,11 @@ func (m *ResponseUnion_Scan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Scan.Size()))
- n218, err := m.Scan.MarshalTo(dAtA[i:])
+ n219, err := m.Scan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n218
+ i += n219
}
return i, nil
}
@@ -14489,11 +14511,11 @@ func (m *ResponseUnion_EndTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x4a
i++
i = encodeVarintApi(dAtA, i, uint64(m.EndTxn.Size()))
- n219, err := m.EndTxn.MarshalTo(dAtA[i:])
+ n220, err := m.EndTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n219
+ i += n220
}
return i, nil
}
@@ -14503,11 +14525,11 @@ func (m *ResponseUnion_AdminSplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x52
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminSplit.Size()))
- n220, err := m.AdminSplit.MarshalTo(dAtA[i:])
+ n221, err := m.AdminSplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n220
+ i += n221
}
return i, nil
}
@@ -14517,11 +14539,11 @@ func (m *ResponseUnion_AdminMerge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x5a
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminMerge.Size()))
- n221, err := m.AdminMerge.MarshalTo(dAtA[i:])
+ n222, err := m.AdminMerge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n221
+ i += n222
}
return i, nil
}
@@ -14531,11 +14553,11 @@ func (m *ResponseUnion_HeartbeatTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x62
i++
i = encodeVarintApi(dAtA, i, uint64(m.HeartbeatTxn.Size()))
- n222, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
+ n223, err := m.HeartbeatTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n222
+ i += n223
}
return i, nil
}
@@ -14545,11 +14567,11 @@ func (m *ResponseUnion_Gc) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x6a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Gc.Size()))
- n223, err := m.Gc.MarshalTo(dAtA[i:])
+ n224, err := m.Gc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n223
+ i += n224
}
return i, nil
}
@@ -14559,11 +14581,11 @@ func (m *ResponseUnion_PushTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x72
i++
i = encodeVarintApi(dAtA, i, uint64(m.PushTxn.Size()))
- n224, err := m.PushTxn.MarshalTo(dAtA[i:])
+ n225, err := m.PushTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n224
+ i += n225
}
return i, nil
}
@@ -14575,11 +14597,11 @@ func (m *ResponseUnion_ResolveIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntent.Size()))
- n225, err := m.ResolveIntent.MarshalTo(dAtA[i:])
+ n226, err := m.ResolveIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n225
+ i += n226
}
return i, nil
}
@@ -14591,11 +14613,11 @@ func (m *ResponseUnion_ResolveIntentRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolveIntentRange.Size()))
- n226, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
+ n227, err := m.ResolveIntentRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n226
+ i += n227
}
return i, nil
}
@@ -14607,11 +14629,11 @@ func (m *ResponseUnion_Merge) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.Merge.Size()))
- n227, err := m.Merge.MarshalTo(dAtA[i:])
+ n228, err := m.Merge.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n227
+ i += n228
}
return i, nil
}
@@ -14623,11 +14645,11 @@ func (m *ResponseUnion_TruncateLog) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.TruncateLog.Size()))
- n228, err := m.TruncateLog.MarshalTo(dAtA[i:])
+ n229, err := m.TruncateLog.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n228
+ i += n229
}
return i, nil
}
@@ -14639,11 +14661,11 @@ func (m *ResponseUnion_RequestLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.RequestLease.Size()))
- n229, err := m.RequestLease.MarshalTo(dAtA[i:])
+ n230, err := m.RequestLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n229
+ i += n230
}
return i, nil
}
@@ -14655,11 +14677,11 @@ func (m *ResponseUnion_ReverseScan) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ReverseScan.Size()))
- n230, err := m.ReverseScan.MarshalTo(dAtA[i:])
+ n231, err := m.ReverseScan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n230
+ i += n231
}
return i, nil
}
@@ -14671,11 +14693,11 @@ func (m *ResponseUnion_ComputeChecksum) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ComputeChecksum.Size()))
- n231, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
+ n232, err := m.ComputeChecksum.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n231
+ i += n232
}
return i, nil
}
@@ -14687,11 +14709,11 @@ func (m *ResponseUnion_CheckConsistency) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.CheckConsistency.Size()))
- n232, err := m.CheckConsistency.MarshalTo(dAtA[i:])
+ n233, err := m.CheckConsistency.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n232
+ i += n233
}
return i, nil
}
@@ -14703,11 +14725,11 @@ func (m *ResponseUnion_InitPut) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.InitPut.Size()))
- n233, err := m.InitPut.MarshalTo(dAtA[i:])
+ n234, err := m.InitPut.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n233
+ i += n234
}
return i, nil
}
@@ -14719,11 +14741,11 @@ func (m *ResponseUnion_AdminTransferLease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminTransferLease.Size()))
- n234, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
+ n235, err := m.AdminTransferLease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n234
+ i += n235
}
return i, nil
}
@@ -14735,11 +14757,11 @@ func (m *ResponseUnion_LeaseInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.LeaseInfo.Size()))
- n235, err := m.LeaseInfo.MarshalTo(dAtA[i:])
+ n236, err := m.LeaseInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n235
+ i += n236
}
return i, nil
}
@@ -14751,11 +14773,11 @@ func (m *ResponseUnion_WriteBatch) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.WriteBatch.Size()))
- n236, err := m.WriteBatch.MarshalTo(dAtA[i:])
+ n237, err := m.WriteBatch.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n236
+ i += n237
}
return i, nil
}
@@ -14767,11 +14789,11 @@ func (m *ResponseUnion_Export) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Export.Size()))
- n237, err := m.Export.MarshalTo(dAtA[i:])
+ n238, err := m.Export.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n237
+ i += n238
}
return i, nil
}
@@ -14783,11 +14805,11 @@ func (m *ResponseUnion_QueryTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryTxn.Size()))
- n238, err := m.QueryTxn.MarshalTo(dAtA[i:])
+ n239, err := m.QueryTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n238
+ i += n239
}
return i, nil
}
@@ -14799,11 +14821,11 @@ func (m *ResponseUnion_Import) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Import.Size()))
- n239, err := m.Import.MarshalTo(dAtA[i:])
+ n240, err := m.Import.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n239
+ i += n240
}
return i, nil
}
@@ -14815,11 +14837,11 @@ func (m *ResponseUnion_AdminChangeReplicas) MarshalTo(dAtA []byte) (int, error)
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminChangeReplicas.Size()))
- n240, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
+ n241, err := m.AdminChangeReplicas.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n240
+ i += n241
}
return i, nil
}
@@ -14831,11 +14853,11 @@ func (m *ResponseUnion_AdminScatter) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminScatter.Size()))
- n241, err := m.AdminScatter.MarshalTo(dAtA[i:])
+ n242, err := m.AdminScatter.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n241
+ i += n242
}
return i, nil
}
@@ -14847,11 +14869,11 @@ func (m *ResponseUnion_AddSstable) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AddSstable.Size()))
- n242, err := m.AddSstable.MarshalTo(dAtA[i:])
+ n243, err := m.AddSstable.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n242
+ i += n243
}
return i, nil
}
@@ -14863,11 +14885,11 @@ func (m *ResponseUnion_ClearRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.ClearRange.Size()))
- n243, err := m.ClearRange.MarshalTo(dAtA[i:])
+ n244, err := m.ClearRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n243
+ i += n244
}
return i, nil
}
@@ -14879,11 +14901,11 @@ func (m *ResponseUnion_RecomputeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecomputeStats.Size()))
- n244, err := m.RecomputeStats.MarshalTo(dAtA[i:])
+ n245, err := m.RecomputeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n244
+ i += n245
}
return i, nil
}
@@ -14895,11 +14917,11 @@ func (m *ResponseUnion_Refresh) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Refresh.Size()))
- n245, err := m.Refresh.MarshalTo(dAtA[i:])
+ n246, err := m.Refresh.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n245
+ i += n246
}
return i, nil
}
@@ -14911,11 +14933,11 @@ func (m *ResponseUnion_RefreshRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RefreshRange.Size()))
- n246, err := m.RefreshRange.MarshalTo(dAtA[i:])
+ n247, err := m.RefreshRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n246
+ i += n247
}
return i, nil
}
@@ -14927,11 +14949,11 @@ func (m *ResponseUnion_QueryIntent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.QueryIntent.Size()))
- n247, err := m.QueryIntent.MarshalTo(dAtA[i:])
+ n248, err := m.QueryIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n247
+ i += n248
}
return i, nil
}
@@ -14943,11 +14965,11 @@ func (m *ResponseUnion_Subsume) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.Subsume.Size()))
- n248, err := m.Subsume.MarshalTo(dAtA[i:])
+ n249, err := m.Subsume.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n248
+ i += n249
}
return i, nil
}
@@ -14959,11 +14981,11 @@ func (m *ResponseUnion_RangeStats) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RangeStats.Size()))
- n249, err := m.RangeStats.MarshalTo(dAtA[i:])
+ n250, err := m.RangeStats.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n249
+ i += n250
}
return i, nil
}
@@ -14975,11 +14997,11 @@ func (m *ResponseUnion_AdminRelocateRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminRelocateRange.Size()))
- n250, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
+ n251, err := m.AdminRelocateRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n250
+ i += n251
}
return i, nil
}
@@ -14991,11 +15013,11 @@ func (m *ResponseUnion_RecoverTxn) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.RecoverTxn.Size()))
- n251, err := m.RecoverTxn.MarshalTo(dAtA[i:])
+ n252, err := m.RecoverTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n251
+ i += n252
}
return i, nil
}
@@ -15007,11 +15029,11 @@ func (m *ResponseUnion_AdminUnsplit) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminUnsplit.Size()))
- n252, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
+ n253, err := m.AdminUnsplit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n252
+ i += n253
}
return i, nil
}
@@ -15023,11 +15045,11 @@ func (m *ResponseUnion_RevertRange) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.RevertRange.Size()))
- n253, err := m.RevertRange.MarshalTo(dAtA[i:])
+ n254, err := m.RevertRange.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n253
+ i += n254
}
return i, nil
}
@@ -15039,11 +15061,11 @@ func (m *ResponseUnion_AdminVerifyProtectedTimestamp) MarshalTo(dAtA []byte) (in
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.AdminVerifyProtectedTimestamp.Size()))
- n254, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
+ n255, err := m.AdminVerifyProtectedTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n254
+ i += n255
}
return i, nil
}
@@ -15055,11 +15077,11 @@ func (m *ResponseUnion_Migrate) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x3
i++
i = encodeVarintApi(dAtA, i, uint64(m.Migrate.Size()))
- n255, err := m.Migrate.MarshalTo(dAtA[i:])
+ n256, err := m.Migrate.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n255
+ i += n256
}
return i, nil
}
@@ -15081,19 +15103,19 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Timestamp.Size()))
- n256, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n257, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n256
+ i += n257
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Replica.Size()))
- n257, err := m.Replica.MarshalTo(dAtA[i:])
+ n258, err := m.Replica.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n257
+ i += n258
if m.RangeID != 0 {
dAtA[i] = 0x18
i++
@@ -15109,11 +15131,11 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Txn.Size()))
- n258, err := m.Txn.MarshalTo(dAtA[i:])
+ n259, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n258
+ i += n259
}
if m.ReadConsistency != 0 {
dAtA[i] = 0x30
@@ -15172,11 +15194,11 @@ func (m *Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1
i++
i = encodeVarintApi(dAtA, i, uint64(m.ClientRangeInfo.Size()))
- n259, err := m.ClientRangeInfo.MarshalTo(dAtA[i:])
+ n260, err := m.ClientRangeInfo.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n259
+ i += n260
if m.WaitPolicy != 0 {
dAtA[i] = 0x90
i++
@@ -15205,11 +15227,11 @@ func (m *BatchRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Header.Size()))
- n260, err := m.Header.MarshalTo(dAtA[i:])
+ n261, err := m.Header.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n260
+ i += n261
if len(m.Requests) > 0 {
for _, msg := range m.Requests {
dAtA[i] = 0x12
@@ -15243,11 +15265,11 @@ func (m *BatchResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.BatchResponse_Header.Size()))
- n261, err := m.BatchResponse_Header.MarshalTo(dAtA[i:])
+ n262, err := m.BatchResponse_Header.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n261
+ i += n262
if len(m.Responses) > 0 {
for _, msg := range m.Responses {
dAtA[i] = 0x12
@@ -15282,38 +15304,38 @@ func (m *BatchResponse_Header) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n262, err := m.Error.MarshalTo(dAtA[i:])
+ n263, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n262
+ i += n263
}
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Timestamp.Size()))
- n263, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n264, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n263
+ i += n264
if m.Txn != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Txn.Size()))
- n264, err := m.Txn.MarshalTo(dAtA[i:])
+ n265, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n264
+ i += n265
}
dAtA[i] = 0x2a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Now.Size()))
- n265, err := m.Now.MarshalTo(dAtA[i:])
+ n266, err := m.Now.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n265
+ i += n266
if len(m.CollectedSpans) > 0 {
for _, msg := range m.CollectedSpans {
dAtA[i] = 0x32
@@ -15428,11 +15450,11 @@ func (m *RangeLookupResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n266, err := m.Error.MarshalTo(dAtA[i:])
+ n267, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n266
+ i += n267
}
return i, nil
}
@@ -15455,19 +15477,19 @@ func (m *RangeFeedRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Header.Size()))
- n267, err := m.Header.MarshalTo(dAtA[i:])
+ n268, err := m.Header.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n267
+ i += n268
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Span.Size()))
- n268, err := m.Span.MarshalTo(dAtA[i:])
+ n269, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n268
+ i += n269
if m.WithDiff {
dAtA[i] = 0x18
i++
@@ -15505,19 +15527,19 @@ func (m *RangeFeedValue) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Value.Size()))
- n269, err := m.Value.MarshalTo(dAtA[i:])
+ n270, err := m.Value.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n269
+ i += n270
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.PrevValue.Size()))
- n270, err := m.PrevValue.MarshalTo(dAtA[i:])
+ n271, err := m.PrevValue.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n270
+ i += n271
return i, nil
}
@@ -15539,19 +15561,19 @@ func (m *RangeFeedCheckpoint) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Span.Size()))
- n271, err := m.Span.MarshalTo(dAtA[i:])
+ n272, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n271
+ i += n272
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.ResolvedTS.Size()))
- n272, err := m.ResolvedTS.MarshalTo(dAtA[i:])
+ n273, err := m.ResolvedTS.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n272
+ i += n273
return i, nil
}
@@ -15573,11 +15595,11 @@ func (m *RangeFeedError) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n273, err := m.Error.MarshalTo(dAtA[i:])
+ n274, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n273
+ i += n274
return i, nil
}
@@ -15600,31 +15622,31 @@ func (m *RangeFeedEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.Val.Size()))
- n274, err := m.Val.MarshalTo(dAtA[i:])
+ n275, err := m.Val.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n274
+ i += n275
}
if m.Checkpoint != nil {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Checkpoint.Size()))
- n275, err := m.Checkpoint.MarshalTo(dAtA[i:])
+ n276, err := m.Checkpoint.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n275
+ i += n276
}
if m.Error != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n276, err := m.Error.MarshalTo(dAtA[i:])
+ n277, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n276
+ i += n277
}
return i, nil
}
@@ -15727,11 +15749,11 @@ func (m *GossipSubscriptionEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.Content.Size()))
- n277, err := m.Content.MarshalTo(dAtA[i:])
+ n278, err := m.Content.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n277
+ i += n278
if len(m.PatternMatched) > 0 {
dAtA[i] = 0x1a
i++
@@ -15742,11 +15764,11 @@ func (m *GossipSubscriptionEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.Error.Size()))
- n278, err := m.Error.MarshalTo(dAtA[i:])
+ n279, err := m.Error.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n278
+ i += n279
}
return i, nil
}
@@ -15770,11 +15792,11 @@ func (m *JoinNodeRequest) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintApi(dAtA, i, uint64(m.BinaryVersion.Size()))
- n279, err := m.BinaryVersion.MarshalTo(dAtA[i:])
+ n280, err := m.BinaryVersion.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n279
+ i += n280
}
return i, nil
}
@@ -15814,11 +15836,11 @@ func (m *JoinNodeResponse) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x22
i++
i = encodeVarintApi(dAtA, i, uint64(m.ActiveVersion.Size()))
- n280, err := m.ActiveVersion.MarshalTo(dAtA[i:])
+ n281, err := m.ActiveVersion.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n280
+ i += n281
}
return i, nil
}
@@ -15847,19 +15869,19 @@ func (m *ContentionEvent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintApi(dAtA, i, uint64(m.TxnMeta.Size()))
- n281, err := m.TxnMeta.MarshalTo(dAtA[i:])
+ n282, err := m.TxnMeta.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n281
+ i += n282
dAtA[i] = 0x1a
i++
i = encodeVarintApi(dAtA, i, uint64(github_com_gogo_protobuf_types.SizeOfStdDuration(m.Duration)))
- n282, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i:])
+ n283, err := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.Duration, dAtA[i:])
if err != nil {
return 0, err
}
- i += n282
+ i += n283
return i, nil
}
@@ -17729,6 +17751,8 @@ func (m *SubsumeResponse) Size() (n int) {
}
l = m.FreezeStart.Size()
n += 1 + l + sovApi(uint64(l))
+ l = m.ClosedTimestamp.Size()
+ n += 1 + l + sovApi(uint64(l))
return n
}
@@ -32970,6 +32994,36 @@ func (m *SubsumeResponse) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowApi
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthApi
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipApi(dAtA[iNdEx:])
@@ -38922,520 +38976,521 @@ var (
ErrIntOverflowApi = fmt.Errorf("proto: integer overflow")
)
-func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_30e97dda177d9566) }
-
-var fileDescriptor_api_30e97dda177d9566 = []byte{
- // 8182 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0xbd, 0x5d, 0x6c, 0x23, 0x59,
- 0x76, 0x1f, 0xae, 0x22, 0x29, 0x89, 0x3c, 0xa4, 0x48, 0xea, 0xaa, 0x3f, 0xd8, 0x9c, 0x99, 0x56,
- 0x77, 0xf5, 0x77, 0xef, 0x8c, 0x34, 0xdd, 0xbd, 0xf3, 0x9f, 0xf1, 0xf4, 0x78, 0xd6, 0x12, 0xc5,
- 0x6e, 0x52, 0x6a, 0xa9, 0xd5, 0x45, 0xaa, 0x1b, 0x33, 0x5e, 0xff, 0x6b, 0x4b, 0x55, 0x57, 0x54,
- 0xad, 0xc8, 0x2a, 0x76, 0x55, 0x51, 0x1f, 0x03, 0x04, 0x88, 0x63, 0xc3, 0xd9, 0x27, 0x63, 0x1f,
- 0x0c, 0x64, 0x0d, 0x07, 0xf1, 0x3a, 0x1b, 0xc4, 0x0f, 0x01, 0x92, 0x00, 0x09, 0xf2, 0x85, 0xc4,
- 0x7e, 0x31, 0x90, 0x45, 0xe0, 0xc4, 0xeb, 0xa7, 0x18, 0x01, 0xa2, 0xd8, 0xda, 0xbc, 0x04, 0x0e,
- 0x8c, 0x20, 0x08, 0x60, 0x60, 0x1e, 0x82, 0xe0, 0x7e, 0xd4, 0x17, 0x59, 0xfc, 0x50, 0x4f, 0x6d,
- 0x32, 0x80, 0x5f, 0x24, 0xd6, 0xb9, 0xf7, 0x9c, 0xba, 0xf7, 0xdc, 0x7b, 0xcf, 0x3d, 0xbf, 0x5b,
- 0xe7, 0xde, 0x0b, 0xf3, 0x96, 0xa9, 0xa8, 0xfb, 0xdd, 0xdd, 0x65, 0xa5, 0xab, 0x2f, 0x75, 0x2d,
- 0xd3, 0x31, 0xd1, 0xbc, 0x6a, 0xaa, 0x07, 0x94, 0xbc, 0xc4, 0x13, 0xcb, 0xf7, 0x0f, 0x0e, 0x97,
- 0x0f, 0x0e, 0x6d, 0x6c, 0x1d, 0x62, 0x6b, 0x59, 0x35, 0x0d, 0xb5, 0x67, 0x59, 0xd8, 0x50, 0x4f,
- 0x96, 0xdb, 0xa6, 0x7a, 0x40, 0xff, 0xe8, 0x46, 0x8b, 0xb1, 0x97, 0x91, 0x2b, 0x51, 0x53, 0x1c,
- 0x85, 0xd3, 0x2e, 0xb8, 0x34, 0x6c, 0x59, 0xa6, 0x65, 0x73, 0xea, 0x25, 0x97, 0xda, 0xc1, 0x8e,
- 0x12, 0xc8, 0xfd, 0x96, 0xed, 0x98, 0x96, 0xd2, 0xc2, 0xcb, 0xd8, 0x68, 0xe9, 0x06, 0x26, 0x19,
- 0x0e, 0x55, 0x95, 0x27, 0xbe, 0x1d, 0x99, 0xf8, 0x88, 0xa7, 0x96, 0x7a, 0x8e, 0xde, 0x5e, 0xde,
- 0x6f, 0xab, 0xcb, 0x8e, 0xde, 0xc1, 0xb6, 0xa3, 0x74, 0xba, 0x3c, 0xe5, 0x3e, 0x4d, 0x71, 0x2c,
- 0x45, 0xd5, 0x8d, 0x96, 0xfb, 0xbf, 0xbb, 0xbb, 0x6c, 0x61, 0xd5, 0xb4, 0x34, 0xac, 0xc9, 0x76,
- 0x57, 0x31, 0xdc, 0xe2, 0xb6, 0xcc, 0x96, 0x49, 0x7f, 0x2e, 0x93, 0x5f, 0x9c, 0x7a, 0xb5, 0x65,
- 0x9a, 0xad, 0x36, 0x5e, 0xa6, 0x4f, 0xbb, 0xbd, 0xbd, 0x65, 0xad, 0x67, 0x29, 0x8e, 0x6e, 0x72,
- 0x2e, 0xf1, 0x9f, 0x09, 0x30, 0x27, 0xe1, 0xd7, 0x3d, 0x6c, 0x3b, 0x35, 0xac, 0x68, 0xd8, 0x42,
- 0x57, 0x20, 0x79, 0x80, 0x4f, 0x4a, 0xc9, 0x6b, 0xc2, 0xdd, 0xdc, 0xea, 0xec, 0x97, 0xa7, 0x8b,
- 0xc9, 0x0d, 0x7c, 0x22, 0x11, 0x1a, 0xba, 0x06, 0xb3, 0xd8, 0xd0, 0x64, 0x92, 0x9c, 0x0a, 0x27,
- 0xcf, 0x60, 0x43, 0xdb, 0xc0, 0x27, 0xe8, 0xdb, 0x90, 0xb6, 0x89, 0x34, 0x43, 0xc5, 0xa5, 0xe9,
- 0x6b, 0xc2, 0xdd, 0xe9, 0xd5, 0x5f, 0xf8, 0xf2, 0x74, 0xf1, 0x93, 0x96, 0xee, 0xec, 0xf7, 0x76,
- 0x97, 0x54, 0xb3, 0xb3, 0xec, 0xb5, 0x93, 0xb6, 0xeb, 0xff, 0x5e, 0xee, 0x1e, 0xb4, 0x96, 0xfb,
- 0x75, 0xb4, 0xd4, 0x3c, 0x36, 0x1a, 0xf8, 0xb5, 0xe4, 0x49, 0x5c, 0x4f, 0xa5, 0x85, 0x62, 0x62,
- 0x3d, 0x95, 0x4e, 0x14, 0x93, 0xe2, 0x1f, 0x25, 0x20, 0x2f, 0x61, 0xbb, 0x6b, 0x1a, 0x36, 0xe6,
- 0x25, 0x7f, 0x1f, 0x92, 0xce, 0xb1, 0x41, 0x4b, 0x9e, 0x7d, 0x78, 0x75, 0x69, 0xa0, 0x47, 0x2c,
- 0x35, 0x2d, 0xc5, 0xb0, 0x15, 0x95, 0x54, 0x5f, 0x22, 0x59, 0xd1, 0x47, 0x90, 0xb5, 0xb0, 0xdd,
- 0xeb, 0x60, 0xaa, 0x48, 0x5a, 0xa9, 0xec, 0xc3, 0xcb, 0x11, 0x9c, 0x8d, 0xae, 0x62, 0x48, 0xc0,
- 0xf2, 0x92, 0xdf, 0xe8, 0x0a, 0xa4, 0x8d, 0x5e, 0x87, 0xa8, 0xc2, 0xa6, 0x15, 0x4d, 0x4a, 0xb3,
- 0x46, 0xaf, 0xb3, 0x81, 0x4f, 0x6c, 0xd4, 0x80, 0x39, 0x2e, 0xd4, 0xc2, 0x8a, 0x6d, 0x1a, 0xa5,
- 0xd9, 0x6b, 0xc2, 0xdd, 0xfc, 0xc3, 0xa5, 0x08, 0xb1, 0xe1, 0x0a, 0x90, 0xc7, 0x5e, 0x07, 0x4b,
- 0x94, 0x4b, 0xca, 0x59, 0x81, 0x27, 0xf4, 0x16, 0x64, 0xc8, 0xfb, 0x76, 0x4f, 0x1c, 0x6c, 0x97,
- 0xd2, 0xf4, 0x85, 0xa4, 0x00, 0xab, 0xe4, 0x59, 0xfc, 0x14, 0x72, 0x41, 0x56, 0x84, 0x20, 0x2f,
- 0x55, 0x1b, 0x3b, 0x9b, 0x55, 0x79, 0x67, 0x6b, 0x63, 0xeb, 0xf9, 0xab, 0xad, 0xe2, 0x14, 0xba,
- 0x00, 0x45, 0x4e, 0xdb, 0xa8, 0x7e, 0x26, 0x3f, 0xab, 0x6f, 0xd6, 0x9b, 0x45, 0xa1, 0x9c, 0xfa,
- 0xde, 0x8f, 0xae, 0x4e, 0xad, 0xa7, 0xd2, 0x33, 0xc5, 0x59, 0xf1, 0x47, 0x02, 0xc0, 0x53, 0xec,
- 0xf0, 0xde, 0x80, 0x56, 0x61, 0x66, 0x9f, 0x16, 0xab, 0x24, 0x50, 0xb5, 0x5c, 0x8b, 0x2c, 0x7f,
- 0xa0, 0xe7, 0xac, 0xa6, 0x7f, 0x7c, 0xba, 0x38, 0xf5, 0x93, 0xd3, 0x45, 0x41, 0xe2, 0x9c, 0xe8,
- 0x05, 0x64, 0x0f, 0xf0, 0x89, 0xcc, 0xc7, 0x5a, 0x29, 0x41, 0x15, 0xf1, 0x7e, 0x40, 0xd0, 0xc1,
- 0xe1, 0x92, 0x3b, 0x44, 0x97, 0x02, 0x43, 0x74, 0x89, 0x70, 0x2c, 0x35, 0x1c, 0x0b, 0x1b, 0x2d,
- 0x67, 0x5f, 0x82, 0x03, 0x7c, 0xf2, 0x8c, 0xc9, 0x10, 0x7f, 0x5f, 0x80, 0x2c, 0x2d, 0x25, 0xd3,
- 0x1c, 0xaa, 0xf4, 0x15, 0xf3, 0xfa, 0x58, 0x35, 0x47, 0x94, 0x73, 0x09, 0xa6, 0x0f, 0x95, 0x76,
- 0x0f, 0xd3, 0x12, 0x66, 0x1f, 0x96, 0x22, 0x64, 0xbc, 0x24, 0xe9, 0x12, 0xcb, 0x86, 0x1e, 0x43,
- 0x4e, 0x37, 0x1c, 0x6c, 0x38, 0x32, 0x63, 0x4b, 0x8e, 0x61, 0xcb, 0xb2, 0xdc, 0xf4, 0x41, 0xfc,
- 0xa7, 0x02, 0xc0, 0x76, 0x2f, 0x56, 0x3d, 0x7f, 0x73, 0xc2, 0xf2, 0xaf, 0xa6, 0x08, 0xab, 0x5b,
- 0x8b, 0x4b, 0x30, 0xa3, 0x1b, 0x6d, 0xdd, 0x60, 0xe5, 0x4f, 0x4b, 0xfc, 0x09, 0x5d, 0x80, 0xe9,
- 0xdd, 0xb6, 0x6e, 0x68, 0x74, 0x3c, 0xa4, 0x25, 0xf6, 0x20, 0x4a, 0x90, 0xa5, 0xa5, 0x8e, 0x51,
- 0xef, 0xe2, 0x69, 0x02, 0x2e, 0x56, 0x4c, 0x43, 0xd3, 0xc9, 0x90, 0x54, 0xda, 0x5f, 0x0b, 0xad,
- 0xac, 0xc3, 0x05, 0x0d, 0x77, 0x2d, 0xac, 0x2a, 0x0e, 0xd6, 0x64, 0x7c, 0xdc, 0x9d, 0xb0, 0x8d,
- 0x91, 0xcf, 0x55, 0x3d, 0xee, 0x52, 0x5a, 0xb4, 0x26, 0xd1, 0x37, 0xe1, 0xb2, 0xd2, 0x6e, 0x9b,
- 0x47, 0xb2, 0xbe, 0x27, 0x6b, 0x26, 0xb6, 0x65, 0xc3, 0x74, 0x64, 0x7c, 0xac, 0xdb, 0x0e, 0x35,
- 0x25, 0x69, 0x69, 0x81, 0x26, 0xd7, 0xf7, 0xd6, 0x4c, 0x6c, 0x6f, 0x99, 0x4e, 0x95, 0x24, 0x11,
- 0x0b, 0x40, 0x0a, 0xc3, 0x2c, 0xc0, 0x0c, 0x31, 0xbf, 0x52, 0x1a, 0x1f, 0x77, 0xa9, 0x05, 0x08,
- 0x34, 0xe5, 0x6c, 0xb0, 0x29, 0xc5, 0x5f, 0x82, 0x4b, 0xfd, 0xfa, 0x8d, 0xb3, 0xfd, 0xfe, 0x50,
- 0x80, 0x7c, 0xdd, 0xd0, 0x9d, 0xaf, 0x45, 0xc3, 0x79, 0xca, 0x4e, 0x06, 0x95, 0x7d, 0x1f, 0x8a,
- 0x7b, 0x8a, 0xde, 0x7e, 0x6e, 0x34, 0xcd, 0xce, 0xae, 0xed, 0x98, 0x06, 0xb6, 0x79, 0x6b, 0x0c,
- 0xd0, 0xc5, 0x97, 0x50, 0xf0, 0x6a, 0x13, 0xa7, 0x9a, 0x1c, 0x28, 0xd6, 0x0d, 0xd5, 0xc2, 0x1d,
- 0x6c, 0xc4, 0xaa, 0xa7, 0xb7, 0x21, 0xa3, 0xbb, 0x72, 0xa9, 0xae, 0x92, 0x92, 0x4f, 0x10, 0x7b,
- 0x30, 0x1f, 0x78, 0x6b, 0x9c, 0xe6, 0x92, 0x4c, 0x46, 0xf8, 0x48, 0xf6, 0xdb, 0x88, 0x4c, 0x46,
- 0xf8, 0x88, 0x99, 0xb7, 0x06, 0xcc, 0xad, 0xe1, 0x36, 0x76, 0x70, 0x8c, 0x35, 0x15, 0x77, 0x20,
- 0xef, 0x0a, 0x8d, 0xb3, 0x61, 0xfe, 0x96, 0x00, 0x88, 0xcb, 0x55, 0x8c, 0x56, 0x9c, 0x25, 0x46,
- 0x8b, 0xc4, 0xb5, 0x70, 0x7a, 0x96, 0xc1, 0x7c, 0x04, 0xd6, 0x27, 0x81, 0x91, 0xa8, 0x9b, 0xe0,
- 0x0f, 0xd9, 0x54, 0x70, 0xc8, 0x72, 0xf7, 0xe6, 0x08, 0x16, 0x42, 0x05, 0x8b, 0xb7, 0xf9, 0x52,
- 0xb4, 0x4c, 0x89, 0x6b, 0xc9, 0xa0, 0x0f, 0x47, 0x89, 0xe2, 0x0f, 0x04, 0x98, 0xaf, 0xb4, 0xb1,
- 0x62, 0xc5, 0xae, 0x91, 0x6f, 0x41, 0x5a, 0xc3, 0x8a, 0x46, 0xab, 0xcc, 0x06, 0xf6, 0x3b, 0x01,
- 0x29, 0xc4, 0xd3, 0x5d, 0xda, 0x6f, 0xab, 0x4b, 0x4d, 0xd7, 0x07, 0xe6, 0xa3, 0xdb, 0x63, 0x12,
- 0x3f, 0x03, 0x14, 0x2c, 0x59, 0x9c, 0x1d, 0xe1, 0x7f, 0x09, 0x80, 0x24, 0x7c, 0x88, 0x2d, 0x27,
- 0xf6, 0x6a, 0xaf, 0x41, 0xd6, 0x51, 0xac, 0x16, 0x76, 0x64, 0xe2, 0xdd, 0x9f, 0xa7, 0xe6, 0xc0,
- 0xf8, 0x08, 0x19, 0x35, 0xe1, 0x0e, 0x36, 0x94, 0xdd, 0x36, 0xa6, 0x52, 0xe4, 0x5d, 0xb3, 0x67,
- 0x68, 0xb2, 0xee, 0x60, 0x4b, 0x71, 0x4c, 0x4b, 0x36, 0xbb, 0x8e, 0xde, 0xd1, 0xbf, 0xa0, 0x8e,
- 0x3d, 0xef, 0x6a, 0x37, 0x58, 0x76, 0xc2, 0xbc, 0x4a, 0x32, 0xd7, 0x79, 0xde, 0xe7, 0x81, 0xac,
- 0xe2, 0xe7, 0xb0, 0x10, 0xaa, 0x75, 0x9c, 0x2a, 0xfd, 0x1f, 0x02, 0x64, 0x1b, 0xaa, 0x62, 0xc4,
- 0xa9, 0xcb, 0x4f, 0x21, 0x6b, 0xab, 0x8a, 0x21, 0xef, 0x99, 0x56, 0x47, 0x71, 0xe8, 0xc0, 0xc9,
- 0x87, 0x74, 0xe9, 0xf9, 0xeb, 0xaa, 0x62, 0x3c, 0xa1, 0x99, 0x24, 0xb0, 0xbd, 0xdf, 0xfd, 0xfe,
- 0xe8, 0xf4, 0x57, 0xf7, 0x47, 0xd9, 0x70, 0x5d, 0x4f, 0xa5, 0x93, 0xc5, 0x94, 0xf8, 0x97, 0x02,
- 0xe4, 0x58, 0x95, 0xe3, 0x1c, 0xae, 0x1f, 0x40, 0xca, 0x32, 0x8f, 0xd8, 0x70, 0xcd, 0x3e, 0x7c,
- 0x2b, 0x42, 0xc4, 0x06, 0x3e, 0x09, 0xce, 0x87, 0x34, 0x3b, 0x5a, 0x05, 0xee, 0x75, 0xca, 0x94,
- 0x3b, 0x39, 0x29, 0x37, 0x30, 0x2e, 0x89, 0xc8, 0xb8, 0x03, 0x85, 0x5d, 0xc5, 0x51, 0xf7, 0x65,
- 0x8b, 0x17, 0x92, 0xcc, 0x9d, 0xc9, 0xbb, 0x39, 0x29, 0x4f, 0xc9, 0x6e, 0xd1, 0x6d, 0x52, 0x73,
- 0x36, 0x7e, 0x6c, 0xfc, 0x57, 0xac, 0xcd, 0xff, 0xb7, 0xc0, 0xc7, 0x90, 0x5b, 0xf3, 0xbf, 0x6a,
- 0x4d, 0xff, 0x9b, 0x09, 0xb8, 0x5c, 0xd9, 0xc7, 0xea, 0x41, 0xc5, 0x34, 0x6c, 0xdd, 0x76, 0x88,
- 0xee, 0xe2, 0x6c, 0xff, 0xb7, 0x20, 0x73, 0xa4, 0x3b, 0xfb, 0xb2, 0xa6, 0xef, 0xed, 0x51, 0xeb,
- 0x99, 0x96, 0xd2, 0x84, 0xb0, 0xa6, 0xef, 0xed, 0xa1, 0x47, 0x90, 0xea, 0x98, 0x1a, 0x73, 0xce,
- 0xf3, 0x0f, 0x17, 0x23, 0xc4, 0xd3, 0xa2, 0xd9, 0xbd, 0xce, 0xa6, 0xa9, 0x61, 0x89, 0x66, 0x46,
- 0x57, 0x01, 0x54, 0x42, 0xed, 0x9a, 0xba, 0xe1, 0xf0, 0xd9, 0x37, 0x40, 0x41, 0x35, 0xc8, 0x38,
- 0xd8, 0xea, 0xe8, 0x86, 0xe2, 0xe0, 0xd2, 0x34, 0x55, 0xde, 0xcd, 0xc8, 0x82, 0x77, 0xdb, 0xba,
- 0xaa, 0xac, 0x61, 0x5b, 0xb5, 0xf4, 0xae, 0x63, 0x5a, 0x5c, 0x8b, 0x3e, 0xb3, 0xf8, 0xeb, 0x29,
- 0x28, 0x0d, 0xea, 0x26, 0xce, 0x1e, 0xb2, 0x0d, 0x33, 0x16, 0xb6, 0x7b, 0x6d, 0x87, 0xf7, 0x91,
- 0x87, 0xc3, 0x54, 0x10, 0x51, 0x02, 0xba, 0xde, 0xd0, 0x76, 0x78, 0xb1, 0xb9, 0x9c, 0xf2, 0xbf,
- 0x16, 0x60, 0x86, 0x25, 0xa0, 0x07, 0x90, 0xb6, 0xc8, 0xc4, 0x20, 0xeb, 0x1a, 0x2d, 0x63, 0x72,
- 0xf5, 0xd2, 0xd9, 0xe9, 0xe2, 0x2c, 0x9d, 0x2c, 0xea, 0x6b, 0x5f, 0xfa, 0x3f, 0xa5, 0x59, 0x9a,
- 0xaf, 0xae, 0x91, 0xd6, 0xb2, 0x1d, 0xc5, 0x72, 0xe8, 0x22, 0x51, 0x82, 0xa1, 0x14, 0x4a, 0xd8,
- 0xc0, 0x27, 0x68, 0x1d, 0x66, 0x6c, 0x47, 0x71, 0x7a, 0x36, 0x6f, 0xaf, 0x73, 0x15, 0xb6, 0x41,
- 0x39, 0x25, 0x2e, 0x81, 0xb8, 0x4f, 0x1a, 0x76, 0x14, 0xbd, 0x4d, 0x1b, 0x30, 0x23, 0xf1, 0x27,
- 0xf1, 0xb7, 0x04, 0x98, 0x61, 0x59, 0xd1, 0x65, 0x58, 0x90, 0x56, 0xb6, 0x9e, 0x56, 0xe5, 0xfa,
- 0xd6, 0x5a, 0xb5, 0x59, 0x95, 0x36, 0xeb, 0x5b, 0x2b, 0xcd, 0x6a, 0x71, 0x0a, 0x5d, 0x02, 0xe4,
- 0x26, 0x54, 0x9e, 0x6f, 0x35, 0xea, 0x8d, 0x66, 0x75, 0xab, 0x59, 0x14, 0xe8, 0x1a, 0x09, 0xa5,
- 0x07, 0xa8, 0x09, 0x74, 0x13, 0xae, 0xf5, 0x53, 0xe5, 0x46, 0x73, 0xa5, 0xd9, 0x90, 0xab, 0x8d,
- 0x66, 0x7d, 0x73, 0xa5, 0x59, 0x5d, 0x2b, 0x26, 0x47, 0xe4, 0x22, 0x2f, 0x91, 0xa4, 0x6a, 0xa5,
- 0x59, 0x4c, 0x89, 0x0e, 0x5c, 0x94, 0xb0, 0x6a, 0x76, 0xba, 0x3d, 0x07, 0x93, 0x52, 0xda, 0x71,
- 0x8e, 0x94, 0xcb, 0x30, 0xab, 0x59, 0x27, 0xb2, 0xd5, 0x33, 0xf8, 0x38, 0x99, 0xd1, 0xac, 0x13,
- 0xa9, 0x67, 0x88, 0xff, 0x58, 0x80, 0x4b, 0xfd, 0xaf, 0x8d, 0xb3, 0x13, 0xbe, 0x80, 0xac, 0xa2,
- 0x69, 0x58, 0x93, 0x35, 0xdc, 0x76, 0x14, 0xee, 0xe2, 0xdc, 0x0f, 0x48, 0xe2, 0x4b, 0x7b, 0x4b,
- 0xde, 0xd2, 0xde, 0xe6, 0xcb, 0x4a, 0x85, 0x16, 0x64, 0x8d, 0x70, 0xb8, 0xe6, 0x87, 0x0a, 0xa1,
- 0x14, 0xf1, 0xbf, 0xa7, 0x60, 0xae, 0x6a, 0x68, 0xcd, 0xe3, 0x58, 0xe7, 0x92, 0x4b, 0x30, 0xa3,
- 0x9a, 0x9d, 0x8e, 0xee, 0xb8, 0x0a, 0x62, 0x4f, 0xe8, 0xe7, 0x02, 0xae, 0x69, 0x72, 0x02, 0x07,
- 0xcd, 0x77, 0x4a, 0xd1, 0x77, 0xe0, 0x32, 0xb1, 0x9a, 0x96, 0xa1, 0xb4, 0x65, 0x26, 0x4d, 0x76,
- 0x2c, 0xbd, 0xd5, 0xc2, 0x16, 0x5f, 0x4e, 0xbc, 0x1b, 0x51, 0xce, 0x3a, 0xe7, 0xa8, 0x50, 0x86,
- 0x26, 0xcb, 0x2f, 0x5d, 0xd4, 0xa3, 0xc8, 0xe8, 0x13, 0x00, 0x32, 0x15, 0xd1, 0x25, 0x4a, 0x9b,
- 0xdb, 0xa3, 0x61, 0x6b, 0x94, 0xae, 0x09, 0x22, 0x0c, 0xe4, 0xd9, 0x46, 0xcb, 0x04, 0x87, 0xbc,
- 0xee, 0xe9, 0x16, 0x96, 0x1f, 0x74, 0x55, 0xba, 0x70, 0x90, 0x5e, 0xcd, 0x9f, 0x9d, 0x2e, 0x82,
- 0xc4, 0xc8, 0x0f, 0xb6, 0x2b, 0x04, 0x97, 0xb0, 0xdf, 0x5d, 0x15, 0xbd, 0x82, 0x7b, 0x81, 0xf5,
- 0x0f, 0x32, 0xf3, 0xf2, 0x6a, 0x29, 0x8e, 0xbc, 0xaf, 0xb7, 0xf6, 0xb1, 0x25, 0x7b, 0xcb, 0xd4,
- 0x74, 0x25, 0x32, 0x2d, 0xdd, 0xf4, 0x19, 0x2a, 0x8a, 0xc1, 0x4a, 0xbf, 0xe2, 0xd4, 0x68, 0x66,
- 0x4f, 0x67, 0x44, 0xf9, 0x5d, 0x53, 0xb7, 0x4d, 0xa3, 0x94, 0x61, 0xca, 0x67, 0x4f, 0xe8, 0x1e,
- 0x14, 0x9d, 0x63, 0x43, 0xde, 0xc7, 0x8a, 0xe5, 0xec, 0x62, 0xc5, 0x21, 0xb3, 0x34, 0xd0, 0x1c,
- 0x05, 0xe7, 0xd8, 0xa8, 0x05, 0xc8, 0xe8, 0x05, 0x14, 0x75, 0x43, 0xde, 0x6b, 0xeb, 0xad, 0x7d,
- 0x47, 0x3e, 0xb2, 0x74, 0x07, 0xdb, 0xa5, 0x79, 0xaa, 0x90, 0xa8, 0x7e, 0xdb, 0xe0, 0xeb, 0xc6,
- 0xda, 0x2b, 0x92, 0x93, 0xab, 0x26, 0xaf, 0x1b, 0x4f, 0x28, 0x3f, 0x25, 0xda, 0xeb, 0xa9, 0xf4,
- 0x6c, 0x31, 0x2d, 0xfe, 0x67, 0x01, 0xf2, 0x6e, 0x77, 0x8b, 0x73, 0x64, 0xdc, 0x85, 0xa2, 0x69,
- 0x60, 0xb9, 0xbb, 0xaf, 0xd8, 0x98, 0xeb, 0x91, 0x4f, 0x38, 0x79, 0xd3, 0xc0, 0xdb, 0x84, 0xcc,
- 0xd4, 0x85, 0xb6, 0x61, 0xde, 0x76, 0x94, 0x96, 0x6e, 0xb4, 0x02, 0xea, 0x9d, 0x9e, 0x1c, 0x2c,
- 0x14, 0x39, 0xb7, 0x47, 0x0f, 0x79, 0x29, 0x7f, 0x2c, 0xc0, 0xfc, 0x8a, 0xd6, 0xd1, 0x8d, 0x46,
- 0xb7, 0xad, 0xc7, 0xba, 0x06, 0x71, 0x13, 0x32, 0x36, 0x91, 0xe9, 0x1b, 0x7c, 0x1f, 0x51, 0xa6,
- 0x69, 0x0a, 0xb1, 0xfc, 0xcf, 0xa0, 0x80, 0x8f, 0xbb, 0x3a, 0xfb, 0xf4, 0xc0, 0x80, 0x50, 0x6a,
- 0xf2, 0xba, 0xe5, 0x7d, 0x5e, 0x92, 0xc4, 0xeb, 0xf4, 0x19, 0xa0, 0x60, 0x95, 0xe2, 0xc4, 0x2e,
- 0x9f, 0xc1, 0x02, 0x15, 0xbd, 0x63, 0xd8, 0x31, 0xeb, 0x4b, 0xfc, 0x45, 0xb8, 0x10, 0x16, 0x1d,
- 0x67, 0xb9, 0x5f, 0xf1, 0x56, 0xde, 0xc4, 0x56, 0xac, 0x20, 0xd6, 0xd3, 0x35, 0x17, 0x1c, 0x67,
- 0x99, 0x7f, 0x55, 0x80, 0x2b, 0x54, 0x36, 0xfd, 0x3a, 0xb3, 0x87, 0xad, 0x67, 0x58, 0xb1, 0x63,
- 0x45, 0xe0, 0x37, 0x60, 0x86, 0x21, 0x69, 0xda, 0x3f, 0xa7, 0x57, 0xb3, 0xc4, 0x73, 0x69, 0x38,
- 0xa6, 0x45, 0x3c, 0x17, 0x9e, 0x24, 0x2a, 0x50, 0x8e, 0x2a, 0x45, 0x9c, 0x35, 0xfd, 0x3b, 0x02,
- 0xcc, 0x73, 0xa7, 0x91, 0x74, 0xe5, 0xca, 0x3e, 0xf1, 0x99, 0x50, 0x15, 0xb2, 0x2a, 0xfd, 0x25,
- 0x3b, 0x27, 0x5d, 0x4c, 0xe5, 0xe7, 0x47, 0xf9, 0x9b, 0x8c, 0xad, 0x79, 0xd2, 0xc5, 0xc4, 0x69,
- 0x75, 0x7f, 0x13, 0x45, 0x05, 0x2a, 0x39, 0xd2, 0x63, 0xa5, 0xe3, 0x88, 0xe6, 0x75, 0x5d, 0x3f,
- 0xae, 0x83, 0x7f, 0x92, 0xe4, 0x4a, 0x60, 0xef, 0xe0, 0xd9, 0x63, 0xf5, 0x51, 0x3e, 0x87, 0x4b,
- 0xc1, 0xd9, 0x25, 0x50, 0xf1, 0xc4, 0x39, 0x2a, 0x1e, 0x58, 0xa1, 0xf7, 0xa9, 0xe8, 0x33, 0x08,
- 0xac, 0xc1, 0xcb, 0xac, 0x4e, 0x2e, 0xfa, 0x39, 0x8f, 0x3a, 0xe6, 0x7d, 0x29, 0x8c, 0x6e, 0xa3,
- 0x0a, 0xa4, 0xf1, 0x71, 0x57, 0xd6, 0xb0, 0xad, 0x72, 0xc3, 0x25, 0x46, 0x09, 0x24, 0x45, 0x19,
- 0xc0, 0x03, 0xb3, 0xf8, 0xb8, 0x4b, 0x88, 0x68, 0x87, 0xcc, 0x5e, 0xae, 0xab, 0x40, 0x8b, 0x6d,
- 0x8f, 0x87, 0x17, 0x7e, 0x4f, 0xe1, 0xe2, 0x0a, 0x9e, 0x97, 0xc0, 0x44, 0x88, 0x3f, 0x14, 0xe0,
- 0xad, 0xc8, 0x56, 0x8b, 0x73, 0x22, 0xfb, 0x04, 0x52, 0xb4, 0xf2, 0x89, 0x73, 0x56, 0x9e, 0x72,
- 0x89, 0xdf, 0x4b, 0xf0, 0x31, 0x2e, 0xe1, 0xb6, 0x49, 0x14, 0x1b, 0xfb, 0x2a, 0xdb, 0x73, 0x98,
- 0x3b, 0x34, 0x1d, 0xe2, 0x9b, 0xf0, 0x66, 0x4f, 0x9c, 0xbb, 0xd9, 0x73, 0x54, 0x80, 0xdb, 0xe2,
- 0x2f, 0x61, 0xde, 0x30, 0x0d, 0x39, 0x2c, 0xf4, 0xfc, 0x7d, 0xa9, 0x60, 0x98, 0xc6, 0xcb, 0x80,
- 0x5c, 0xcf, 0xce, 0xf4, 0x69, 0x22, 0x4e, 0x3b, 0xf3, 0x7d, 0x01, 0x16, 0x3c, 0xb7, 0x29, 0x66,
- 0x0f, 0xfa, 0x03, 0x48, 0x1a, 0xe6, 0xd1, 0x79, 0x56, 0x31, 0x49, 0x7e, 0x32, 0xeb, 0x85, 0x4b,
- 0x14, 0x67, 0x7d, 0xff, 0x4d, 0x02, 0x32, 0x4f, 0x2b, 0x71, 0xd6, 0xf2, 0x13, 0xbe, 0x42, 0xce,
- 0xda, 0x3b, 0xaa, 0xb7, 0x7b, 0xef, 0x5b, 0x7a, 0x5a, 0xd9, 0xc0, 0x27, 0x6e, 0x6f, 0x27, 0x5c,
- 0x68, 0x05, 0x32, 0xce, 0xbe, 0x85, 0xed, 0x7d, 0xb3, 0xad, 0x9d, 0xc7, 0xcd, 0xf1, 0xb9, 0xca,
- 0x18, 0xa6, 0xa9, 0x5c, 0x37, 0x1a, 0x43, 0x88, 0x88, 0xc6, 0x20, 0xaf, 0xf1, 0x3c, 0xc5, 0xc4,
- 0x79, 0x5e, 0x13, 0x70, 0x11, 0xa7, 0x8b, 0x33, 0xe2, 0x0b, 0x00, 0x52, 0x9d, 0x38, 0x9b, 0xe4,
- 0xd7, 0x92, 0x90, 0xdf, 0xee, 0xd9, 0xfb, 0x31, 0xf7, 0xbe, 0x0a, 0x40, 0xb7, 0x67, 0x53, 0x08,
- 0x72, 0x6c, 0xf0, 0x3a, 0x8f, 0x09, 0xf4, 0x70, 0x2b, 0xcd, 0xf8, 0x9a, 0xc7, 0x06, 0xaa, 0x71,
- 0x21, 0x58, 0xf6, 0xa3, 0x45, 0x6e, 0x8c, 0x02, 0xab, 0xcd, 0x63, 0x63, 0x13, 0x7b, 0x28, 0x95,
- 0x49, 0xc2, 0x44, 0xd2, 0x27, 0x30, 0x4b, 0x1e, 0x64, 0xc7, 0x3c, 0x4f, 0x33, 0xcf, 0x10, 0x9e,
- 0xa6, 0x89, 0x1e, 0x43, 0x86, 0x71, 0x93, 0xd9, 0x6f, 0x86, 0xce, 0x7e, 0x51, 0x75, 0xe1, 0x6a,
- 0xa4, 0xf3, 0x5e, 0x9a, 0xb2, 0x92, 0xb9, 0xee, 0x02, 0x4c, 0xef, 0x99, 0x96, 0xea, 0x7e, 0xef,
- 0x65, 0x0f, 0xac, 0x3d, 0xd7, 0x53, 0xe9, 0x74, 0x31, 0xb3, 0x9e, 0x4a, 0x67, 0x8a, 0x20, 0xfe,
- 0x96, 0x00, 0x05, 0xaf, 0x21, 0xe2, 0x9c, 0x10, 0x2a, 0x21, 0x2d, 0x9e, 0xbf, 0x29, 0x88, 0x02,
- 0xc5, 0x7f, 0x4b, 0x3d, 0x22, 0xd5, 0x3c, 0xa4, 0x2d, 0x13, 0x67, 0x4f, 0x79, 0xcc, 0x62, 0x81,
- 0x12, 0xe7, 0x6d, 0x5d, 0x1a, 0x16, 0xf4, 0x00, 0x2e, 0xe8, 0x1d, 0x62, 0xcf, 0x75, 0xa7, 0x7d,
- 0xc2, 0x61, 0x9b, 0x83, 0xdd, 0x0f, 0xcb, 0x0b, 0x7e, 0x5a, 0xc5, 0x4d, 0x12, 0xff, 0x1e, 0x5d,
- 0x00, 0xf7, 0x6b, 0x12, 0xa7, 0xaa, 0xeb, 0x30, 0x67, 0x31, 0xd1, 0xc4, 0xad, 0x39, 0xa7, 0xb6,
- 0x73, 0x1e, 0x2b, 0x51, 0xf8, 0xef, 0x24, 0xa0, 0xf0, 0xa2, 0x87, 0xad, 0x93, 0xaf, 0x93, 0xba,
- 0x6f, 0x43, 0xe1, 0x48, 0xd1, 0x1d, 0x79, 0xcf, 0xb4, 0xe4, 0x5e, 0x57, 0x53, 0x1c, 0x37, 0x20,
- 0x65, 0x8e, 0x90, 0x9f, 0x98, 0xd6, 0x0e, 0x25, 0x22, 0x0c, 0xe8, 0xc0, 0x30, 0x8f, 0x0c, 0x99,
- 0x90, 0x29, 0x50, 0x3e, 0x36, 0xf8, 0xaa, 0xf4, 0xea, 0x87, 0xff, 0xe9, 0x74, 0xf1, 0xd1, 0x44,
- 0x61, 0x66, 0x34, 0xa4, 0xae, 0xd7, 0xd3, 0xb5, 0xa5, 0x9d, 0x9d, 0xfa, 0x9a, 0x54, 0xa4, 0x22,
- 0x5f, 0x31, 0x89, 0xcd, 0x63, 0xc3, 0x16, 0xff, 0x7e, 0x02, 0x8a, 0xbe, 0x8e, 0xe2, 0x6c, 0xc8,
- 0x2a, 0x64, 0x5f, 0xf7, 0xb0, 0xa5, 0xbf, 0x41, 0x33, 0x02, 0x67, 0x24, 0x66, 0xe7, 0x73, 0xc8,
- 0x85, 0x34, 0x90, 0xfc, 0x6a, 0x1a, 0xc8, 0x1e, 0xf9, 0x95, 0x47, 0xf7, 0x61, 0xde, 0x39, 0x36,
- 0x64, 0x16, 0x60, 0xc8, 0x82, 0x52, 0xdc, 0x78, 0x89, 0x82, 0x43, 0xf4, 0x41, 0xe8, 0x34, 0x20,
- 0xc5, 0x16, 0x7f, 0x5f, 0x00, 0x44, 0x15, 0x55, 0x67, 0x9f, 0x0d, 0xbe, 0x2e, 0xfd, 0xe9, 0x2e,
- 0x14, 0x69, 0xc8, 0xa6, 0xac, 0xef, 0xc9, 0x1d, 0xdd, 0xb6, 0x75, 0xa3, 0xc5, 0x3b, 0x54, 0x9e,
- 0xd2, 0xeb, 0x7b, 0x9b, 0x8c, 0x2a, 0xfe, 0x35, 0x58, 0x08, 0x55, 0x20, 0xce, 0xc6, 0xbe, 0x0e,
- 0xb9, 0x3d, 0xf6, 0x95, 0x96, 0x0a, 0xe7, 0x2b, 0x8e, 0x59, 0x4a, 0x63, 0xef, 0x13, 0xff, 0x3c,
- 0x01, 0x17, 0x24, 0x6c, 0x9b, 0xed, 0x43, 0x1c, 0xbf, 0x0a, 0x6b, 0xc0, 0x3f, 0xe7, 0xc8, 0x6f,
- 0xa4, 0xc9, 0x0c, 0x63, 0x66, 0xd3, 0x5c, 0x78, 0xd9, 0xfe, 0xe6, 0xe8, 0x1e, 0x3b, 0xb8, 0x50,
- 0xcf, 0x97, 0xfd, 0x52, 0xa1, 0x65, 0x3f, 0x13, 0x0a, 0x7a, 0xcb, 0x30, 0x89, 0x4d, 0xb3, 0xf1,
- 0x6b, 0xa3, 0xd7, 0x71, 0xc1, 0xd0, 0xd2, 0xa8, 0x42, 0xd6, 0x19, 0x4b, 0x03, 0xbf, 0xde, 0xea,
- 0x75, 0xa8, 0xef, 0xbc, 0x7a, 0x89, 0x94, 0xf7, 0xec, 0x74, 0x31, 0x1f, 0x4a, 0xb3, 0xa5, 0xbc,
- 0xee, 0x3d, 0x13, 0xe9, 0xe2, 0xb7, 0xe1, 0x62, 0x9f, 0xb2, 0xe3, 0xf4, 0x78, 0xfe, 0x55, 0x12,
- 0xae, 0x84, 0xc5, 0xc7, 0x0d, 0x71, 0xbe, 0xee, 0x0d, 0x5a, 0x83, 0xb9, 0x8e, 0x6e, 0xbc, 0xd9,
- 0xea, 0x65, 0xae, 0xa3, 0x1b, 0xfe, 0x4a, 0x71, 0x44, 0xd7, 0x98, 0xf9, 0x99, 0x76, 0x0d, 0x05,
- 0xca, 0x51, 0x6d, 0x17, 0x67, 0xff, 0xf8, 0x9e, 0x00, 0xb9, 0xb8, 0x97, 0xe5, 0xde, 0x2c, 0x50,
- 0x4e, 0x6c, 0xc2, 0xdc, 0xcf, 0x60, 0x1d, 0xef, 0x77, 0x04, 0x40, 0x4d, 0xab, 0x67, 0x10, 0x50,
- 0xfb, 0xcc, 0x6c, 0xc5, 0x59, 0xcd, 0x0b, 0x30, 0xad, 0x1b, 0x1a, 0x3e, 0xa6, 0xd5, 0x4c, 0x49,
- 0xec, 0x21, 0xf4, 0x75, 0x32, 0x39, 0xd1, 0xd7, 0x49, 0xf1, 0x73, 0x58, 0x08, 0x15, 0x31, 0xce,
- 0xfa, 0xff, 0xb7, 0x04, 0x2c, 0xf0, 0x8a, 0xc4, 0xbe, 0x82, 0xf9, 0x4d, 0x98, 0x6e, 0x13, 0x99,
- 0x23, 0xda, 0x99, 0xbe, 0xd3, 0x6d, 0x67, 0x9a, 0x19, 0xfd, 0x3c, 0x40, 0xd7, 0xc2, 0x87, 0x32,
- 0x63, 0x4d, 0x4e, 0xc4, 0x9a, 0x21, 0x1c, 0x94, 0x80, 0x7e, 0x20, 0x40, 0x81, 0x0c, 0xe8, 0xae,
- 0x65, 0x76, 0x4d, 0x9b, 0xf8, 0x2c, 0xf6, 0x64, 0x30, 0xe7, 0xc5, 0xd9, 0xe9, 0xe2, 0xdc, 0xa6,
- 0x6e, 0x6c, 0x73, 0xc6, 0x66, 0x63, 0xe2, 0x3d, 0x00, 0xee, 0x4e, 0x88, 0xa5, 0x4a, 0xdb, 0x54,
- 0x0f, 0xfc, 0xef, 0x6d, 0xc4, 0xb2, 0x78, 0xe2, 0x6c, 0xf1, 0x8f, 0x04, 0xb8, 0xf0, 0x33, 0x5b,
- 0x2e, 0xfe, 0x7f, 0xa1, 0x6c, 0xf1, 0x25, 0x14, 0xe9, 0x8f, 0xba, 0xb1, 0x67, 0xc6, 0xb9, 0x70,
- 0xff, 0xeb, 0x02, 0xcc, 0x07, 0x04, 0xc7, 0xe9, 0xe0, 0xbc, 0x91, 0x9e, 0xc4, 0x5f, 0x24, 0x2e,
- 0x4f, 0x70, 0x94, 0xc4, 0x39, 0x06, 0xff, 0x79, 0x02, 0x2e, 0x55, 0xd8, 0x67, 0x6e, 0x37, 0xee,
- 0x23, 0xce, 0x9e, 0x51, 0x82, 0xd9, 0x43, 0x6c, 0xd9, 0xba, 0xc9, 0xa6, 0xdf, 0x39, 0xc9, 0x7d,
- 0x44, 0x65, 0x48, 0xdb, 0x86, 0xd2, 0xb5, 0xf7, 0x4d, 0xf7, 0xfb, 0x9e, 0xf7, 0xec, 0xc5, 0xa8,
- 0x4c, 0xbf, 0x79, 0x8c, 0xca, 0xcc, 0xe8, 0x18, 0x95, 0xd9, 0xaf, 0x10, 0xa3, 0xc2, 0x3f, 0xa6,
- 0xfd, 0x3b, 0x01, 0x2e, 0x0f, 0x68, 0x2e, 0xce, 0xde, 0xf2, 0x5d, 0xc8, 0xaa, 0x5c, 0x30, 0x31,
- 0xd8, 0xec, 0x4b, 0x61, 0x9d, 0x64, 0x7b, 0x43, 0xdc, 0x72, 0x76, 0xba, 0x08, 0x6e, 0x51, 0xeb,
- 0x6b, 0x5c, 0x39, 0xe4, 0xb7, 0x26, 0xfe, 0xca, 0x1c, 0x14, 0xaa, 0xc7, 0x6c, 0x95, 0xbc, 0xc1,
- 0xdc, 0x04, 0xf4, 0x04, 0xd2, 0x5d, 0xcb, 0x3c, 0xd4, 0xdd, 0x6a, 0xe4, 0x43, 0x01, 0x0a, 0x6e,
- 0x35, 0xfa, 0xb8, 0xb6, 0x39, 0x87, 0xe4, 0xf1, 0xa2, 0x26, 0x64, 0x9e, 0x99, 0xaa, 0xd2, 0x7e,
- 0xa2, 0xb7, 0xdd, 0x9e, 0xff, 0xfe, 0x78, 0x41, 0x4b, 0x1e, 0xcf, 0xb6, 0xe2, 0xec, 0xbb, 0x8d,
- 0xe0, 0x11, 0x51, 0x1d, 0xd2, 0x35, 0xc7, 0xe9, 0x92, 0x44, 0x6e, 0x3b, 0xee, 0x4c, 0x20, 0x94,
- 0xb0, 0xb8, 0x51, 0xb2, 0x2e, 0x3b, 0x6a, 0xc2, 0xfc, 0x53, 0xba, 0xe7, 0xab, 0xd2, 0x36, 0x7b,
- 0x5a, 0xc5, 0x34, 0xf6, 0xf4, 0x16, 0xb7, 0xdb, 0xb7, 0x27, 0x90, 0xf9, 0xb4, 0xd2, 0x90, 0x06,
- 0x05, 0xa0, 0x15, 0x48, 0x37, 0x1e, 0x71, 0x61, 0xcc, 0xaf, 0xbb, 0x35, 0x81, 0xb0, 0xc6, 0x23,
- 0xc9, 0x63, 0x43, 0xeb, 0x90, 0x5d, 0xf9, 0xa2, 0x67, 0x61, 0x2e, 0x65, 0x66, 0x68, 0x74, 0x44,
- 0xbf, 0x14, 0xca, 0x25, 0x05, 0x99, 0x51, 0x03, 0xf2, 0xaf, 0x4c, 0xeb, 0xa0, 0x6d, 0x2a, 0x6e,
- 0x0d, 0x67, 0xa9, 0xb8, 0x6f, 0x4c, 0x20, 0xce, 0x65, 0x94, 0xfa, 0x44, 0xa0, 0x6f, 0x43, 0x81,
- 0x34, 0x46, 0x53, 0xd9, 0x6d, 0xbb, 0x85, 0x4c, 0x53, 0xa9, 0xef, 0x4e, 0x20, 0xd5, 0xe3, 0x74,
- 0x17, 0xfe, 0xfb, 0x44, 0x95, 0x25, 0x98, 0x0b, 0x75, 0x02, 0x84, 0x20, 0xd5, 0x25, 0xed, 0x2d,
- 0xd0, 0xf8, 0x25, 0xfa, 0x1b, 0xbd, 0x07, 0xb3, 0x86, 0xa9, 0x61, 0x77, 0x84, 0xcc, 0xad, 0x5e,
- 0x38, 0x3b, 0x5d, 0x9c, 0xd9, 0x32, 0x35, 0xe6, 0xd1, 0xf0, 0x5f, 0xd2, 0x0c, 0xc9, 0x54, 0xd7,
- 0xca, 0xd7, 0x20, 0x45, 0xda, 0x9d, 0x18, 0xa6, 0x5d, 0xc5, 0xc6, 0x3b, 0x96, 0xce, 0xa5, 0xb9,
- 0x8f, 0xe5, 0x7f, 0x94, 0x80, 0x44, 0xe3, 0x11, 0xf1, 0xd9, 0x77, 0x7b, 0xea, 0x01, 0x76, 0x78,
- 0x3a, 0x7f, 0xa2, 0xbe, 0xbc, 0x85, 0xf7, 0x74, 0xe6, 0x5a, 0x65, 0x24, 0xfe, 0x84, 0xde, 0x01,
- 0x50, 0x54, 0x15, 0xdb, 0xb6, 0xec, 0xee, 0x05, 0xcc, 0x48, 0x19, 0x46, 0xd9, 0xc0, 0x27, 0x84,
- 0xcd, 0xc6, 0xaa, 0x85, 0x1d, 0x37, 0xf8, 0x8a, 0x3d, 0x11, 0x36, 0x07, 0x77, 0xba, 0xb2, 0x63,
- 0x1e, 0x60, 0x83, 0xf6, 0x93, 0x0c, 0x31, 0x35, 0x9d, 0x6e, 0x93, 0x10, 0x88, 0x95, 0xc4, 0x86,
- 0xe6, 0x9b, 0xb4, 0x8c, 0xe4, 0x3d, 0x13, 0x91, 0x16, 0x6e, 0xe9, 0x7c, 0xbb, 0x5c, 0x46, 0xe2,
- 0x4f, 0x44, 0x4b, 0x4a, 0xcf, 0xd9, 0xa7, 0x2d, 0x91, 0x91, 0xe8, 0x6f, 0x74, 0x1b, 0x0a, 0x2c,
- 0x5e, 0x53, 0xc6, 0x86, 0x2a, 0x53, 0xe3, 0x9a, 0xa1, 0xc9, 0x73, 0x8c, 0x5c, 0x35, 0x54, 0x62,
- 0x4a, 0xd1, 0x23, 0xe0, 0x04, 0xf9, 0xa0, 0x63, 0x13, 0x9d, 0x02, 0xc9, 0xb5, 0x5a, 0x38, 0x3b,
- 0x5d, 0xcc, 0x36, 0x68, 0xc2, 0xc6, 0x66, 0xa3, 0xbe, 0x26, 0x65, 0x59, 0xae, 0x8d, 0x8e, 0x5d,
- 0xd7, 0xca, 0xbf, 0x21, 0x40, 0xf2, 0x69, 0xa5, 0x71, 0x6e, 0x95, 0xb9, 0x05, 0x4d, 0x06, 0x0a,
- 0x7a, 0x07, 0x0a, 0xbb, 0x7a, 0xbb, 0xad, 0x1b, 0x2d, 0xe2, 0x45, 0x7d, 0x17, 0xab, 0xae, 0xc2,
- 0xf2, 0x9c, 0xbc, 0xcd, 0xa8, 0xe8, 0x1a, 0x64, 0x55, 0x0b, 0x6b, 0xd8, 0x70, 0x74, 0xa5, 0x6d,
- 0x73, 0xcd, 0x05, 0x49, 0xe5, 0x5f, 0x16, 0x60, 0x9a, 0x8e, 0x00, 0xf4, 0x36, 0x64, 0x54, 0xd3,
- 0x70, 0x14, 0xdd, 0xe0, 0xa6, 0x2c, 0x23, 0xf9, 0x84, 0xa1, 0xc5, 0xbb, 0x0e, 0x39, 0x45, 0x55,
- 0xcd, 0x9e, 0xe1, 0xc8, 0x86, 0xd2, 0xc1, 0xbc, 0x98, 0x59, 0x4e, 0xdb, 0x52, 0x3a, 0x18, 0x2d,
- 0x82, 0xfb, 0xe8, 0x6d, 0xf1, 0xcc, 0x48, 0xc0, 0x49, 0x1b, 0xf8, 0xa4, 0xfc, 0x07, 0x02, 0xa4,
- 0xdd, 0x31, 0x43, 0x8a, 0xd1, 0xc2, 0x06, 0x0b, 0x2a, 0x77, 0x8b, 0xe1, 0x11, 0xfa, 0xa7, 0xca,
- 0x8c, 0x3f, 0x55, 0x5e, 0x80, 0x69, 0x87, 0x0c, 0x0b, 0x5e, 0x02, 0xf6, 0x40, 0xd7, 0xb3, 0xdb,
- 0x4a, 0x8b, 0x2d, 0xe7, 0x65, 0x24, 0xf6, 0x40, 0x2a, 0xc3, 0xc3, 0x7e, 0x99, 0x46, 0xf8, 0x13,
- 0x29, 0x29, 0x0b, 0x4e, 0xdd, 0xc5, 0x2d, 0xdd, 0xa0, 0x7d, 0x29, 0x29, 0x01, 0x25, 0xad, 0x12,
- 0x0a, 0x7a, 0x0b, 0x32, 0x2c, 0x03, 0x36, 0x34, 0xda, 0xa1, 0x92, 0x52, 0x9a, 0x12, 0xaa, 0x86,
- 0x56, 0xc6, 0x90, 0xf1, 0x06, 0x27, 0x69, 0xb6, 0x9e, 0xed, 0x29, 0x92, 0xfe, 0x46, 0xef, 0xc3,
- 0x85, 0xd7, 0x3d, 0xa5, 0xad, 0xef, 0xd1, 0x95, 0x3a, 0x1a, 0x75, 0x4f, 0x75, 0xc6, 0x6a, 0x82,
- 0xbc, 0x34, 0x2a, 0x81, 0xaa, 0xce, 0x1d, 0xcb, 0x49, 0x7f, 0x2c, 0x8b, 0xbf, 0x2b, 0xc0, 0x3c,
- 0x8b, 0x3c, 0x62, 0x01, 0xb3, 0xf1, 0xf9, 0x21, 0x1f, 0x43, 0x46, 0x53, 0x1c, 0x85, 0x6d, 0x5a,
- 0x4d, 0x8c, 0xdc, 0xb4, 0xea, 0x6d, 0xa2, 0x50, 0x1c, 0x85, 0x6e, 0x5c, 0x45, 0x90, 0x22, 0xbf,
- 0xd9, 0xfe, 0x5e, 0x89, 0xfe, 0x16, 0x3f, 0x03, 0x14, 0x2c, 0x68, 0x9c, 0x1e, 0xd9, 0x3d, 0xb8,
- 0x48, 0x74, 0x5d, 0x35, 0x54, 0xeb, 0xa4, 0xeb, 0xe8, 0xa6, 0xf1, 0x9c, 0xfe, 0xb5, 0x51, 0x31,
- 0xf0, 0x61, 0x8b, 0x7e, 0xcf, 0x12, 0x7f, 0x6f, 0x06, 0xe6, 0xaa, 0xc7, 0x5d, 0xd3, 0x8a, 0x75,
- 0x19, 0x6c, 0x15, 0x66, 0xf9, 0x4a, 0xc1, 0x88, 0x6f, 0xd7, 0x7d, 0xc6, 0xdc, 0xfd, 0x70, 0xcf,
- 0x19, 0xd1, 0x2a, 0x00, 0x0b, 0x6a, 0xa5, 0x81, 0x4b, 0xc9, 0x73, 0x7c, 0x6a, 0xa3, 0x6c, 0x74,
- 0x03, 0xc7, 0x16, 0x64, 0x3b, 0x87, 0xaa, 0x2a, 0xef, 0xe9, 0x6d, 0x87, 0xc7, 0x06, 0x46, 0x87,
- 0xb1, 0x6f, 0xbe, 0xac, 0x54, 0x9e, 0xd0, 0x4c, 0x2c, 0x4c, 0xcf, 0x7f, 0x96, 0x80, 0x48, 0x60,
- 0xbf, 0xd1, 0xbb, 0xc0, 0x37, 0x13, 0xc9, 0xb6, 0xbb, 0x6f, 0x70, 0x75, 0xee, 0xec, 0x74, 0x31,
- 0x23, 0x51, 0x6a, 0xa3, 0xd1, 0x94, 0x32, 0x2c, 0x43, 0xc3, 0x76, 0xd0, 0x0d, 0x98, 0x33, 0x3b,
- 0xba, 0x23, 0xbb, 0x4e, 0x12, 0xf7, 0x28, 0x73, 0x84, 0xe8, 0x3a, 0x51, 0xe7, 0xd9, 0x63, 0x32,
- 0x3b, 0xf1, 0x1e, 0x13, 0xf4, 0x37, 0x05, 0xb8, 0xc4, 0x15, 0x29, 0xef, 0xd2, 0x38, 0x7c, 0xa5,
- 0xad, 0x3b, 0x27, 0xf2, 0xc1, 0x61, 0x29, 0x4d, 0xfd, 0xd6, 0x9f, 0x8b, 0x6c, 0x90, 0x40, 0x3f,
- 0x58, 0x72, 0x9b, 0xe5, 0xe4, 0x19, 0x67, 0xde, 0x38, 0xac, 0x1a, 0x8e, 0x75, 0xb2, 0x7a, 0xf9,
- 0xec, 0x74, 0x71, 0x61, 0x30, 0xf5, 0xa5, 0xb4, 0x60, 0x0f, 0xb2, 0xa0, 0x1a, 0x00, 0xf6, 0xfa,
- 0x21, 0x9d, 0x31, 0xa2, 0xfd, 0x8f, 0xc8, 0x0e, 0x2b, 0x05, 0x78, 0xd1, 0x5d, 0x28, 0xf2, 0x3d,
- 0x3d, 0x7b, 0x7a, 0x1b, 0xcb, 0xb6, 0xfe, 0x05, 0xa6, 0x73, 0x4b, 0x52, 0xca, 0x33, 0x3a, 0x11,
- 0xd1, 0xd0, 0xbf, 0xc0, 0xe5, 0xef, 0x42, 0x69, 0x58, 0xe9, 0x83, 0x43, 0x20, 0xc3, 0x3e, 0xe9,
- 0x7e, 0x14, 0x5e, 0xcf, 0x99, 0xa0, 0xab, 0xf2, 0x35, 0x9d, 0x8f, 0x13, 0x1f, 0x09, 0xe2, 0x3f,
- 0x48, 0xc0, 0xdc, 0x6a, 0xaf, 0x7d, 0xf0, 0xbc, 0xdb, 0xe8, 0x75, 0x3a, 0x8a, 0x75, 0x42, 0xcc,
- 0x20, 0x33, 0x14, 0xa4, 0x80, 0x02, 0x33, 0x83, 0xd4, 0x12, 0xe8, 0x5f, 0x60, 0x32, 0x39, 0x05,
- 0xc2, 0x65, 0xf8, 0x3e, 0x03, 0x5a, 0x07, 0x9f, 0x4c, 0xb7, 0x02, 0x7c, 0x04, 0xa5, 0x40, 0x46,
- 0xba, 0xf8, 0x22, 0x63, 0xc3, 0xb1, 0x74, 0xcc, 0x16, 0x10, 0x93, 0x52, 0x20, 0xa6, 0xa7, 0x4e,
- 0x92, 0xab, 0x2c, 0x15, 0x35, 0x21, 0x47, 0x32, 0x9e, 0xc8, 0x74, 0x0a, 0x71, 0x17, 0x78, 0x1f,
- 0x44, 0x54, 0x2b, 0x54, 0xee, 0x25, 0xaa, 0x9f, 0x0a, 0xe5, 0xa1, 0x3f, 0xa5, 0x2c, 0xf6, 0x29,
- 0xe5, 0x4f, 0xa1, 0xd8, 0x9f, 0x21, 0xa8, 0xcb, 0x14, 0xd3, 0xe5, 0x85, 0xa0, 0x2e, 0x93, 0x01,
- 0x3d, 0xad, 0xa7, 0xd2, 0xa9, 0xe2, 0xb4, 0xf8, 0x67, 0x49, 0xc8, 0xbb, 0xdd, 0x2c, 0x4e, 0xa0,
- 0xb3, 0x0a, 0xd3, 0xa4, 0x53, 0xb8, 0x11, 0x28, 0xb7, 0x47, 0xf4, 0x6e, 0x1e, 0xd9, 0x4e, 0x3a,
- 0x8b, 0x0b, 0x92, 0x29, 0x6b, 0x1c, 0x06, 0xa7, 0xfc, 0xcb, 0x09, 0x48, 0x51, 0x6c, 0xf1, 0x00,
- 0x52, 0x74, 0xa2, 0x10, 0x26, 0x99, 0x28, 0x68, 0x56, 0x6f, 0x3a, 0x4b, 0x04, 0x5c, 0x53, 0xe2,
- 0xf3, 0xed, 0x2b, 0x1f, 0x3c, 0x78, 0x48, 0x8d, 0x4d, 0x4e, 0xe2, 0x4f, 0x68, 0x95, 0x86, 0x46,
- 0x99, 0x96, 0x83, 0x35, 0xee, 0xd3, 0x5f, 0x1b, 0xd7, 0xbe, 0xee, 0xa4, 0xe4, 0xf2, 0xa1, 0x2b,
- 0x90, 0x24, 0x56, 0x6c, 0x96, 0x45, 0x39, 0x9c, 0x9d, 0x2e, 0x26, 0x89, 0xfd, 0x22, 0x34, 0xb4,
- 0x0c, 0xd9, 0xb0, 0xc9, 0x20, 0x1e, 0x1c, 0x35, 0x8c, 0x81, 0xe1, 0x0e, 0x6d, 0x6f, 0x68, 0x31,
- 0x3c, 0xcb, 0xdb, 0xf8, 0x2f, 0x52, 0x30, 0x57, 0xef, 0xc4, 0x3d, 0xa5, 0xac, 0x84, 0x5b, 0x38,
- 0x0a, 0x08, 0x85, 0x5e, 0x1a, 0xd1, 0xc0, 0xa1, 0x19, 0x3c, 0x79, 0xbe, 0x19, 0xbc, 0x4e, 0x3c,
- 0x65, 0x7e, 0xf0, 0x44, 0x72, 0x08, 0xe6, 0x09, 0xbf, 0x9f, 0xfa, 0x29, 0x12, 0xe1, 0xf1, 0xf7,
- 0x7a, 0xd0, 0x48, 0x95, 0x4f, 0xa9, 0x43, 0xce, 0x7a, 0xd9, 0xcc, 0xe4, 0xbd, 0x6c, 0x16, 0x1b,
- 0x1a, 0x9d, 0xd4, 0xc2, 0x16, 0x75, 0xf6, 0xcd, 0x2d, 0x6a, 0xd9, 0xe1, 0x9d, 0xf5, 0x63, 0x48,
- 0x6a, 0xba, 0xdb, 0x38, 0x93, 0x4f, 0xd5, 0x84, 0x69, 0x4c, 0xaf, 0x4d, 0x05, 0x7b, 0x2d, 0xeb,
- 0x25, 0xe5, 0x3a, 0x80, 0xaf, 0x1b, 0x74, 0x0d, 0x66, 0xcc, 0xb6, 0xe6, 0x6e, 0x76, 0x99, 0x5b,
- 0xcd, 0x9c, 0x9d, 0x2e, 0x4e, 0x3f, 0x6f, 0x6b, 0xf5, 0x35, 0x69, 0xda, 0x6c, 0x6b, 0x75, 0x8d,
- 0x9e, 0xfa, 0x81, 0x8f, 0x64, 0x2f, 0x12, 0x2e, 0x27, 0xcd, 0x1a, 0xf8, 0x68, 0x0d, 0xdb, 0x2a,
- 0xef, 0x70, 0xbf, 0x2d, 0x40, 0xde, 0xd5, 0x7d, 0xbc, 0x46, 0x25, 0xad, 0x77, 0xf8, 0x20, 0x4b,
- 0x9e, 0x6f, 0x90, 0xb9, 0x7c, 0x7c, 0x63, 0xf1, 0xaf, 0x0a, 0x3c, 0xb6, 0xb9, 0xa1, 0x2a, 0x0e,
- 0x71, 0x2a, 0x62, 0x1c, 0x18, 0xf7, 0xa0, 0x68, 0x29, 0x86, 0x66, 0x76, 0xf4, 0x2f, 0x30, 0x5b,
- 0x08, 0xb5, 0xf9, 0x67, 0xcf, 0x82, 0x47, 0xa7, 0xab, 0x7e, 0xb6, 0xf8, 0x07, 0x09, 0x1e, 0x07,
- 0xed, 0x15, 0x23, 0x4e, 0x75, 0x7d, 0x07, 0xe6, 0x83, 0x53, 0x1b, 0x0b, 0xb5, 0x64, 0xa3, 0xf5,
- 0xbd, 0x08, 0x79, 0x51, 0x05, 0x61, 0xf1, 0x8c, 0x6e, 0x70, 0x7d, 0x60, 0x46, 0xa4, 0xc2, 0x50,
- 0x05, 0xb2, 0xfc, 0xe3, 0x83, 0xb1, 0x67, 0xba, 0x81, 0x62, 0x6f, 0x0f, 0x0b, 0x8b, 0xac, 0x1b,
- 0x7b, 0xa6, 0xfb, 0x21, 0xdf, 0x72, 0x09, 0x76, 0xf9, 0x17, 0x60, 0x9a, 0x26, 0xbf, 0x81, 0x89,
- 0xe6, 0xad, 0xf9, 0xa7, 0x09, 0xb8, 0x49, 0x4b, 0xff, 0x12, 0x5b, 0xfa, 0xde, 0xc9, 0xb6, 0x65,
- 0x3a, 0x58, 0x75, 0xb0, 0xe6, 0xaf, 0x9c, 0xc7, 0x6a, 0xf7, 0x32, 0x5d, 0xf7, 0x05, 0xe7, 0x0a,
- 0x38, 0xf3, 0xb8, 0xd0, 0x06, 0x14, 0x78, 0x68, 0x81, 0xd2, 0xd6, 0x0f, 0xb1, 0xac, 0x38, 0xe7,
- 0x99, 0xdd, 0xe6, 0x18, 0xef, 0x0a, 0x61, 0x5d, 0x71, 0x90, 0x06, 0x19, 0x2e, 0x4c, 0xd7, 0xf8,
- 0x81, 0x44, 0x4f, 0xbf, 0xda, 0x82, 0x62, 0x9a, 0xc5, 0x37, 0xd4, 0xd7, 0xa4, 0x34, 0x93, 0x5c,
- 0xd7, 0xc4, 0xff, 0x28, 0xc0, 0xad, 0x31, 0x2a, 0x8e, 0xb3, 0xeb, 0x96, 0x21, 0x7d, 0x48, 0x5e,
- 0xa4, 0x73, 0x1d, 0xa7, 0x25, 0xef, 0x19, 0x6d, 0xc2, 0xdc, 0x9e, 0xa2, 0xb7, 0xfd, 0x2e, 0x3d,
- 0x3c, 0x3e, 0x31, 0x3a, 0x1a, 0x37, 0xc7, 0xd8, 0x59, 0x1f, 0x16, 0x7f, 0x33, 0x01, 0xf3, 0x2b,
- 0x9a, 0xd6, 0x68, 0x70, 0x1b, 0x18, 0x5f, 0x4f, 0x71, 0x41, 0x66, 0xc2, 0x07, 0x99, 0xe8, 0x3d,
- 0x40, 0x9a, 0x6e, 0xb3, 0x83, 0x4f, 0xec, 0x7d, 0x45, 0x33, 0x8f, 0xfc, 0xb8, 0x8c, 0x79, 0x37,
- 0xa5, 0xe1, 0x26, 0xa0, 0x06, 0x50, 0xb4, 0x23, 0xdb, 0x8e, 0xe2, 0x7d, 0x77, 0xba, 0x35, 0xd1,
- 0x96, 0x32, 0x06, 0x83, 0xbc, 0x47, 0x29, 0x43, 0xe4, 0xd0, 0x9f, 0xc4, 0x6f, 0xd7, 0x49, 0xd5,
- 0x1d, 0x59, 0xb1, 0xdd, 0xfd, 0x43, 0xec, 0xc8, 0x95, 0x3c, 0xa3, 0xaf, 0xd8, 0x6c, 0x5b, 0x10,
- 0xdb, 0xf0, 0xe0, 0xab, 0x26, 0x4e, 0x48, 0xfc, 0x77, 0x05, 0xc8, 0x4b, 0x78, 0xcf, 0xc2, 0x76,
- 0xac, 0x8b, 0x02, 0x4f, 0x20, 0x67, 0x31, 0xa9, 0xf2, 0x9e, 0x65, 0x76, 0xce, 0x33, 0xae, 0xb2,
- 0x9c, 0xf1, 0x89, 0x65, 0x76, 0xb8, 0x61, 0x79, 0x09, 0x05, 0xaf, 0x8c, 0x71, 0x56, 0xfe, 0x77,
- 0xe9, 0x76, 0x69, 0x26, 0x38, 0xee, 0x00, 0x89, 0x78, 0x35, 0x40, 0x3f, 0x54, 0x05, 0x0b, 0x1a,
- 0xa7, 0x1a, 0xfe, 0xab, 0x00, 0xf9, 0x46, 0x6f, 0x97, 0x9d, 0xd9, 0x15, 0x9f, 0x06, 0xaa, 0x90,
- 0x69, 0xe3, 0x3d, 0x47, 0x7e, 0xa3, 0x50, 0xfd, 0x34, 0x61, 0xa5, 0x1b, 0x15, 0x9e, 0x02, 0x58,
- 0x74, 0x8b, 0x1d, 0x95, 0x93, 0x3c, 0xa7, 0x9c, 0x0c, 0xe5, 0x25, 0x64, 0xf1, 0x2f, 0x12, 0x50,
- 0xf0, 0xaa, 0x19, 0xa7, 0x95, 0x7c, 0x15, 0xb2, 0x0e, 0xc9, 0xf3, 0x58, 0x87, 0x79, 0x1e, 0x13,
- 0x12, 0x6d, 0x21, 0x96, 0x60, 0x81, 0x3a, 0x2e, 0xb2, 0xd2, 0xed, 0xb6, 0x75, 0x17, 0xee, 0x52,
- 0xfb, 0x93, 0x92, 0xe6, 0x69, 0xd2, 0x0a, 0x4b, 0xa1, 0x40, 0x17, 0xfd, 0x9a, 0x00, 0xb9, 0x3d,
- 0x0b, 0xe3, 0x2f, 0xb0, 0x4c, 0xa1, 0xd7, 0x64, 0x41, 0x2f, 0x6b, 0xa4, 0x0c, 0x5f, 0xf9, 0xa3,
- 0x78, 0x96, 0xbd, 0xb8, 0x41, 0xde, 0xcb, 0x3b, 0xed, 0x2b, 0x98, 0xa7, 0x8d, 0x12, 0xf7, 0xde,
- 0x62, 0xf1, 0x47, 0x09, 0x40, 0x41, 0xc9, 0x3f, 0xbb, 0xc6, 0x4c, 0xc4, 0xd7, 0x98, 0xef, 0x02,
- 0x62, 0x61, 0x93, 0xb6, 0xdc, 0xc5, 0x96, 0x6c, 0x63, 0xd5, 0xe4, 0xc7, 0x43, 0x09, 0x52, 0x91,
- 0xa7, 0x6c, 0x63, 0xab, 0x41, 0xe9, 0x68, 0x05, 0xc0, 0x77, 0xe9, 0xf8, 0x8c, 0x33, 0x89, 0x47,
- 0x97, 0xf1, 0x3c, 0x3a, 0xf1, 0xfb, 0x02, 0xe4, 0x37, 0xf5, 0x96, 0xa5, 0xc4, 0x7a, 0xfa, 0x11,
- 0xfa, 0x38, 0xbc, 0x98, 0x9e, 0x7d, 0x58, 0x8e, 0x0a, 0xf4, 0x61, 0x39, 0x5c, 0x88, 0xc6, 0x19,
- 0x88, 0x21, 0xf7, 0x4a, 0x14, 0xa7, 0x05, 0xfb, 0xf7, 0x65, 0xc8, 0xf1, 0x72, 0xef, 0x18, 0xba,
- 0x69, 0xa0, 0x07, 0x90, 0x6c, 0xf1, 0x8f, 0x25, 0xd9, 0xc8, 0x85, 0x4d, 0xff, 0x6c, 0xc1, 0xda,
- 0x94, 0x44, 0xf2, 0x12, 0x96, 0x6e, 0xcf, 0x89, 0x70, 0x25, 0xfd, 0xd8, 0xf7, 0x20, 0x4b, 0xb7,
- 0xe7, 0xa0, 0x06, 0x14, 0x54, 0xff, 0x40, 0x33, 0x99, 0xb0, 0x27, 0x87, 0xc2, 0xce, 0xc8, 0xa3,
- 0xe5, 0x6a, 0x53, 0x52, 0x5e, 0x0d, 0x25, 0xa0, 0x4a, 0xf0, 0x1c, 0xad, 0xd4, 0x40, 0x60, 0x9d,
- 0xbf, 0x6b, 0x3b, 0x7c, 0x86, 0x57, 0x6d, 0x2a, 0x70, 0xdc, 0x16, 0xfa, 0x18, 0x66, 0x34, 0x7a,
- 0x62, 0x13, 0x37, 0x01, 0x51, 0x0d, 0x1d, 0x3a, 0x18, 0xab, 0x36, 0x25, 0x71, 0x0e, 0xb4, 0x0e,
- 0x39, 0xf6, 0x8b, 0x39, 0x76, 0x1c, 0x8b, 0xdf, 0x1a, 0x2e, 0x21, 0x30, 0x75, 0xd6, 0xa6, 0xa4,
- 0xac, 0xe6, 0x53, 0xd1, 0x37, 0x21, 0x65, 0xab, 0x8a, 0x8b, 0xc6, 0xaf, 0x0e, 0x39, 0x28, 0xc5,
- 0x67, 0xa6, 0xb9, 0xd1, 0x63, 0x76, 0xb4, 0xa7, 0x73, 0xec, 0x2e, 0x8c, 0x46, 0x15, 0x3f, 0xb4,
- 0x21, 0x9f, 0x14, 0x1f, 0x53, 0x02, 0x7a, 0x0a, 0x59, 0x85, 0x78, 0xc8, 0x32, 0xdd, 0xd2, 0x4a,
- 0x57, 0x42, 0xa3, 0xc3, 0x11, 0x06, 0xb6, 0x20, 0xd7, 0xe8, 0xae, 0x7f, 0x97, 0xe8, 0x0b, 0xea,
- 0x60, 0xab, 0x85, 0x4b, 0xd9, 0xd1, 0x82, 0x82, 0xe1, 0x74, 0x9e, 0x20, 0x4a, 0x24, 0x9e, 0xb2,
- 0xb7, 0x9f, 0x9c, 0x56, 0x2a, 0x37, 0xf4, 0x03, 0x78, 0xc4, 0x4e, 0xa9, 0xda, 0x94, 0x94, 0xdb,
- 0x0f, 0x90, 0xd1, 0x12, 0x24, 0x5a, 0x6a, 0x69, 0x6e, 0xa8, 0x49, 0xf0, 0x76, 0x03, 0xd5, 0xa6,
- 0xa4, 0x44, 0x4b, 0x45, 0x9f, 0x42, 0x9a, 0x6d, 0xed, 0x38, 0x36, 0x4a, 0xf9, 0xa1, 0x63, 0x2c,
- 0xbc, 0x41, 0xa6, 0x36, 0x25, 0xd1, 0xdd, 0x24, 0xe4, 0x7d, 0xdb, 0x90, 0xb7, 0x58, 0x3c, 0xa2,
- 0x1b, 0x3d, 0x5c, 0x1c, 0x1a, 0x14, 0x10, 0x15, 0x40, 0x5c, 0xa3, 0x58, 0x29, 0x40, 0x47, 0xdf,
- 0x81, 0x0b, 0x61, 0x89, 0xbc, 0xa7, 0xcd, 0x0f, 0xfd, 0xc0, 0x3d, 0x34, 0x98, 0xb5, 0x36, 0x25,
- 0x21, 0x6b, 0x20, 0x11, 0x7d, 0x08, 0xd3, 0xac, 0xd5, 0x10, 0x15, 0x19, 0x15, 0xe7, 0xd2, 0xd7,
- 0x60, 0x2c, 0x3f, 0xe9, 0xfc, 0x0e, 0x0f, 0xca, 0x93, 0xdb, 0x66, 0xab, 0xb4, 0x30, 0xb4, 0xf3,
- 0x0f, 0x86, 0x17, 0x92, 0xce, 0xef, 0xf8, 0x54, 0xd2, 0xee, 0x16, 0x4b, 0xe1, 0x81, 0x58, 0x17,
- 0x86, 0xb6, 0x7b, 0x44, 0xac, 0x5e, 0x8d, 0x6e, 0x97, 0xf0, 0xc9, 0xa4, 0x68, 0x16, 0x3b, 0xdb,
- 0x47, 0xa6, 0x63, 0xea, 0xe2, 0xd0, 0xa2, 0x0d, 0x1e, 0x7e, 0x54, 0xa3, 0x5e, 0xa5, 0x47, 0x45,
- 0x2f, 0xa1, 0xc8, 0x4f, 0xe0, 0xf0, 0xbf, 0xc2, 0x5c, 0xa2, 0xf2, 0xee, 0x45, 0x9a, 0xae, 0xa8,
- 0x28, 0xa6, 0xda, 0x94, 0x54, 0x50, 0xc3, 0x29, 0xe8, 0x33, 0x98, 0xa7, 0xf2, 0x64, 0xd5, 0x3f,
- 0x34, 0xa5, 0x54, 0x1a, 0x38, 0x82, 0x63, 0xf8, 0xf9, 0x2a, 0xae, 0xe4, 0xa2, 0xda, 0x97, 0x44,
- 0xba, 0xb1, 0x6e, 0xe8, 0x0e, 0xb5, 0xb2, 0xe5, 0xa1, 0xdd, 0x38, 0x7c, 0x00, 0x24, 0xe9, 0xc6,
- 0x3a, 0xa3, 0x90, 0x6e, 0xec, 0xf0, 0x28, 0x3d, 0xde, 0x1c, 0x6f, 0x0f, 0xed, 0xc6, 0x51, 0xe1,
- 0x7c, 0xa4, 0x1b, 0x3b, 0x41, 0x3a, 0xe9, 0xc6, 0xcc, 0x40, 0xf4, 0xc9, 0x7d, 0x67, 0x68, 0x37,
- 0x1e, 0xba, 0xb5, 0x9c, 0x74, 0x63, 0x65, 0x20, 0x11, 0xad, 0x01, 0x30, 0x07, 0x90, 0x7a, 0x01,
- 0x57, 0x87, 0x4e, 0x06, 0xfd, 0xd1, 0x7a, 0x64, 0x32, 0x68, 0xbb, 0x34, 0x62, 0xc8, 0x28, 0xbc,
- 0x94, 0xe9, 0x47, 0xe7, 0xd2, 0xe2, 0x50, 0x43, 0x36, 0xf0, 0x81, 0x98, 0x18, 0xb2, 0x23, 0x8f,
- 0x48, 0x66, 0x15, 0xb6, 0x4a, 0x5e, 0xba, 0x36, 0xdc, 0x2c, 0x07, 0x3f, 0x96, 0x51, 0xb3, 0x4c,
- 0x09, 0x68, 0x05, 0x32, 0xc4, 0xc9, 0x39, 0xa1, 0x66, 0xe8, 0xfa, 0x50, 0x2f, 0xbe, 0x6f, 0x3f,
- 0x50, 0x6d, 0x4a, 0x4a, 0xbf, 0xe6, 0x24, 0xf2, 0x7a, 0xb6, 0x7e, 0x58, 0x12, 0x87, 0xbe, 0x3e,
- 0xb4, 0xd6, 0x4c, 0x5e, 0xcf, 0x38, 0x90, 0x0a, 0x17, 0x59, 0x5b, 0xf1, 0x5d, 0xde, 0x16, 0xdf,
- 0x98, 0x5c, 0xba, 0x41, 0x45, 0x0d, 0x5d, 0x88, 0x8b, 0xdc, 0x7c, 0x5e, 0x9b, 0x92, 0x16, 0x94,
- 0xc1, 0x54, 0x32, 0xe0, 0xf9, 0xd4, 0xc3, 0x96, 0xef, 0x4a, 0x37, 0x87, 0x0e, 0xf8, 0x88, 0x55,
- 0x4f, 0x32, 0xe0, 0x95, 0x00, 0x99, 0x4d, 0x40, 0x9a, 0x6c, 0xdb, 0x2c, 0x44, 0xe1, 0xd6, 0x88,
- 0x09, 0xa8, 0x6f, 0xdd, 0x84, 0x4d, 0x40, 0x5a, 0x83, 0x71, 0x12, 0x41, 0x6a, 0x1b, 0x2b, 0x16,
- 0x37, 0xb3, 0xb7, 0x87, 0x0a, 0x1a, 0x38, 0x6b, 0x91, 0x08, 0x52, 0x3d, 0x22, 0x71, 0x78, 0x2c,
- 0xf7, 0xe8, 0x1e, 0xee, 0x21, 0xdf, 0x19, 0xea, 0xf0, 0x44, 0x9e, 0x2d, 0x44, 0x1c, 0x1e, 0x2b,
- 0x94, 0x80, 0x7e, 0x1e, 0x66, 0x39, 0xe0, 0x2d, 0xdd, 0x1d, 0xe1, 0x02, 0x06, 0xd7, 0x28, 0xc8,
- 0xb8, 0xe6, 0x3c, 0xcc, 0xca, 0x32, 0xa0, 0xcd, 0xaa, 0x77, 0x6f, 0x84, 0x95, 0x1d, 0xc0, 0xfa,
- 0xcc, 0xca, 0xfa, 0x64, 0x62, 0x65, 0x59, 0x3f, 0xe5, 0x73, 0xdd, 0xfd, 0xa1, 0x56, 0x76, 0x70,
- 0xb7, 0x11, 0xb1, 0xb2, 0xaf, 0x7d, 0x2a, 0xa9, 0x99, 0xcd, 0x00, 0x67, 0xe9, 0x1b, 0x43, 0x6b,
- 0x16, 0x46, 0xde, 0xa4, 0x66, 0x9c, 0x87, 0x34, 0x1b, 0xc3, 0x00, 0x4c, 0xd3, 0xef, 0x0e, 0x3f,
- 0x4a, 0xa1, 0x1f, 0x65, 0xd5, 0xdc, 0xa5, 0x5d, 0xa6, 0x61, 0xcf, 0x50, 0x59, 0x7c, 0x9f, 0x37,
- 0xd7, 0xd4, 0x7b, 0xa3, 0x0d, 0x55, 0xd4, 0xfe, 0x78, 0xcf, 0x50, 0x85, 0x12, 0x69, 0x51, 0xd9,
- 0xd6, 0x3e, 0x3a, 0xbe, 0x97, 0x46, 0x9c, 0xfa, 0xd0, 0xb7, 0xc1, 0x92, 0x16, 0xd5, 0x23, 0xfa,
- 0x43, 0xa8, 0xc7, 0x8e, 0x24, 0x29, 0x2d, 0x8f, 0x1e, 0x42, 0xe1, 0x43, 0x51, 0xbc, 0x21, 0xc4,
- 0xc9, 0xde, 0x9c, 0xe9, 0x7a, 0x18, 0xef, 0x8f, 0x9e, 0x33, 0xfb, 0x5d, 0x0b, 0x36, 0x67, 0x72,
- 0x9f, 0xe2, 0x6f, 0x08, 0x70, 0x8d, 0x95, 0x8d, 0xae, 0x81, 0x9e, 0xc8, 0xde, 0x4a, 0x72, 0x60,
- 0x9b, 0xc9, 0x03, 0xfa, 0x82, 0x0f, 0x87, 0x15, 0x77, 0xcc, 0xca, 0x78, 0x6d, 0x4a, 0x7a, 0x47,
- 0x19, 0x95, 0x8f, 0x74, 0xa9, 0x0e, 0x43, 0x50, 0xa5, 0x87, 0x43, 0xbb, 0x54, 0x18, 0xf5, 0x91,
- 0x2e, 0xc5, 0x79, 0x56, 0x67, 0xf9, 0x77, 0x68, 0x6f, 0x5b, 0x6e, 0xa1, 0x58, 0x5c, 0x4f, 0xa5,
- 0x2f, 0x17, 0x4b, 0xeb, 0xa9, 0xf4, 0x95, 0x62, 0x79, 0x3d, 0x95, 0x7e, 0xab, 0xf8, 0xb6, 0xf8,
- 0x0f, 0xcb, 0x30, 0xe7, 0x82, 0x2e, 0x06, 0xa8, 0x1e, 0x06, 0x01, 0xd5, 0xd5, 0x61, 0x80, 0x8a,
- 0xc3, 0x34, 0x8e, 0xa8, 0x1e, 0x06, 0x11, 0xd5, 0xd5, 0x61, 0x88, 0xca, 0xe7, 0x21, 0x90, 0xaa,
- 0x39, 0x0c, 0x52, 0xdd, 0x9b, 0x00, 0x52, 0x79, 0xa2, 0xfa, 0x31, 0xd5, 0xda, 0x20, 0xa6, 0xba,
- 0x39, 0x1a, 0x53, 0x79, 0xa2, 0x02, 0xa0, 0xea, 0x71, 0x1f, 0xa8, 0xba, 0x3e, 0x02, 0x54, 0x79,
- 0xfc, 0x2e, 0xaa, 0xda, 0x88, 0x44, 0x55, 0xb7, 0xc7, 0xa1, 0x2a, 0x4f, 0x4e, 0x08, 0x56, 0x7d,
- 0x10, 0x82, 0x55, 0x8b, 0x43, 0x61, 0x95, 0xc7, 0xcd, 0x70, 0xd5, 0x27, 0xfd, 0xb8, 0xea, 0xfa,
- 0x08, 0x5c, 0xe5, 0xd7, 0x80, 0x03, 0xab, 0x5a, 0x14, 0xb0, 0xba, 0x35, 0x06, 0x58, 0x79, 0x52,
- 0x82, 0xc8, 0xaa, 0x16, 0x85, 0xac, 0x6e, 0x8d, 0x41, 0x56, 0x7d, 0x92, 0x18, 0xb4, 0xda, 0x8a,
- 0x86, 0x56, 0x77, 0xc6, 0x42, 0x2b, 0x4f, 0x5a, 0x18, 0x5b, 0x2d, 0x07, 0xb0, 0xd5, 0x3b, 0x43,
- 0xb0, 0x95, 0xc7, 0x4a, 0xc0, 0xd5, 0xb7, 0x06, 0xc0, 0x95, 0x38, 0x0a, 0x5c, 0x79, 0xbc, 0x1e,
- 0xba, 0x7a, 0x31, 0x04, 0x5d, 0xdd, 0x1d, 0x8f, 0xae, 0x3c, 0x61, 0x7d, 0xf0, 0x4a, 0x19, 0x09,
- 0xaf, 0xde, 0x9b, 0x10, 0x5e, 0x79, 0xd2, 0xa3, 0xf0, 0xd5, 0x47, 0x61, 0x7c, 0x75, 0x6d, 0x38,
- 0xbe, 0xf2, 0xc4, 0x70, 0x80, 0xb5, 0x11, 0x09, 0xb0, 0x6e, 0x8f, 0x03, 0x58, 0xfe, 0x38, 0x08,
- 0x22, 0xac, 0xad, 0x68, 0x84, 0x75, 0x67, 0x2c, 0xc2, 0xf2, 0x9b, 0x3f, 0x04, 0xb1, 0x36, 0x22,
- 0x21, 0xd6, 0xed, 0x71, 0x10, 0xcb, 0x2f, 0x5c, 0x10, 0x63, 0xbd, 0x1a, 0x8a, 0xb1, 0xee, 0x4f,
- 0x82, 0xb1, 0x3c, 0xa1, 0x03, 0x20, 0xeb, 0xf3, 0xe1, 0x20, 0xeb, 0x1b, 0xe7, 0x38, 0xc4, 0x32,
- 0x12, 0x65, 0x7d, 0x6b, 0x00, 0x65, 0x89, 0xa3, 0x50, 0x96, 0xdf, 0x9f, 0x5d, 0x98, 0xa5, 0x8c,
- 0x04, 0x45, 0xef, 0x4d, 0x08, 0x8a, 0xfc, 0xce, 0x17, 0x81, 0x8a, 0xaa, 0x11, 0xa8, 0xe8, 0xe6,
- 0x68, 0x54, 0xe4, 0x9b, 0x73, 0x1f, 0x16, 0xd5, 0xa2, 0x60, 0xd1, 0xad, 0x31, 0xb0, 0xc8, 0xb7,
- 0x42, 0x01, 0x5c, 0xf4, 0xb8, 0x0f, 0x17, 0x5d, 0x1f, 0x1b, 0x66, 0x15, 0x00, 0x46, 0xab, 0x83,
- 0xc0, 0xe8, 0xc6, 0x48, 0x60, 0xe4, 0x49, 0xf0, 0x91, 0xd1, 0xe3, 0x3e, 0x64, 0x74, 0x7d, 0x04,
- 0x32, 0xf2, 0x0b, 0xc0, 0xa1, 0x91, 0x36, 0x1a, 0x1a, 0x2d, 0x4d, 0x0a, 0x8d, 0x3c, 0xc1, 0x91,
- 0xd8, 0x68, 0x2b, 0x1a, 0x1b, 0xdd, 0x99, 0x30, 0x02, 0x62, 0x00, 0x1c, 0xd5, 0xa2, 0xc0, 0xd1,
- 0xad, 0x31, 0xe0, 0x28, 0x38, 0x87, 0x78, 0xe8, 0xa8, 0x16, 0x85, 0x8e, 0x6e, 0x8d, 0x41, 0x47,
- 0xbe, 0xa4, 0x00, 0x3c, 0x6a, 0x0e, 0x83, 0x47, 0xf7, 0x26, 0x80, 0x47, 0xbe, 0xf3, 0xd2, 0x87,
- 0x8f, 0x3e, 0xed, 0xc7, 0x47, 0xe2, 0x28, 0x7c, 0xe4, 0x8f, 0x48, 0x17, 0x20, 0x6d, 0x45, 0x03,
- 0xa4, 0x3b, 0x63, 0x01, 0x52, 0xd0, 0x48, 0x06, 0x10, 0xd2, 0x46, 0x24, 0x42, 0xba, 0x3d, 0x0e,
- 0x21, 0xf9, 0x46, 0x32, 0x08, 0x91, 0x3e, 0xed, 0x87, 0x48, 0xe2, 0x28, 0x88, 0xe4, 0x57, 0xce,
- 0xc5, 0x48, 0xb5, 0x28, 0x8c, 0x74, 0x6b, 0x0c, 0x46, 0xf2, 0x1b, 0x2f, 0x00, 0x92, 0x94, 0x91,
- 0x20, 0xe9, 0xbd, 0x09, 0x41, 0x52, 0x9f, 0xe1, 0x0a, 0xa3, 0xa4, 0x5a, 0x14, 0x4a, 0xba, 0x35,
- 0x06, 0x25, 0x05, 0x0a, 0xeb, 0xc3, 0xa4, 0xad, 0x68, 0x98, 0x74, 0x67, 0x2c, 0x4c, 0xea, 0x1b,
- 0x4d, 0x2e, 0x4e, 0xda, 0x88, 0xc4, 0x49, 0xb7, 0xc7, 0xe1, 0xa4, 0xbe, 0x89, 0x8f, 0x3b, 0x07,
- 0xbf, 0x32, 0x39, 0x50, 0xfa, 0xe8, 0xfc, 0x40, 0xc9, 0x7b, 0xe7, 0x18, 0xa4, 0xf4, 0x69, 0x3f,
- 0x52, 0x12, 0x47, 0x21, 0x25, 0xbf, 0x67, 0x9d, 0x0f, 0x2a, 0xad, 0xa7, 0xd2, 0x6f, 0x17, 0xdf,
- 0x11, 0xff, 0x7c, 0x06, 0x66, 0x6a, 0x5e, 0x60, 0x92, 0x5f, 0x4b, 0xe1, 0x4d, 0x4e, 0xc2, 0x42,
- 0x6b, 0x64, 0xc4, 0x53, 0xbb, 0x39, 0xfe, 0xfc, 0xc4, 0xc1, 0x13, 0xfe, 0x38, 0xeb, 0x1b, 0x6c,
- 0x49, 0x47, 0x1f, 0xc0, 0x5c, 0xcf, 0xc6, 0x96, 0xdc, 0xb5, 0x74, 0xd3, 0xd2, 0x1d, 0xb6, 0xed,
- 0x46, 0x58, 0x2d, 0x7e, 0x79, 0xba, 0x98, 0xdb, 0xb1, 0xb1, 0xb5, 0xcd, 0xe9, 0x52, 0xae, 0x17,
- 0x78, 0x72, 0xef, 0x3a, 0x9b, 0x9e, 0xfc, 0xae, 0xb3, 0x17, 0x50, 0xb4, 0xb0, 0xa2, 0x85, 0x3c,
- 0x18, 0x76, 0xea, 0x54, 0x74, 0x9f, 0xa3, 0xdb, 0xe2, 0xdc, 0x9c, 0xf4, 0xf4, 0xa9, 0x82, 0x15,
- 0x26, 0xa2, 0x07, 0x70, 0xb1, 0xa3, 0x1c, 0xd3, 0x20, 0x56, 0xd9, 0x75, 0x0a, 0x69, 0x60, 0x2a,
- 0xbb, 0xa0, 0x0c, 0x75, 0x94, 0x63, 0x7a, 0x71, 0x1a, 0x4b, 0xa2, 0xb7, 0x9e, 0xdc, 0x82, 0xbc,
- 0xa6, 0xdb, 0x8e, 0x6e, 0xa8, 0x0e, 0x3f, 0xd0, 0x98, 0x1d, 0x06, 0x3c, 0xe7, 0x52, 0xd9, 0xa9,
- 0xc5, 0x15, 0x28, 0xb4, 0x14, 0x07, 0x1f, 0x29, 0x27, 0xb2, 0xbb, 0x1f, 0x2e, 0x4b, 0xcf, 0xee,
- 0x7c, 0xeb, 0xec, 0x74, 0x71, 0xee, 0x29, 0x4b, 0x1a, 0xd8, 0x16, 0x37, 0xd7, 0x0a, 0x24, 0x68,
- 0xe8, 0x0e, 0x14, 0x14, 0xfb, 0xc4, 0x50, 0x69, 0x95, 0xb1, 0x61, 0xf7, 0x6c, 0x0a, 0x33, 0xd2,
- 0x52, 0x9e, 0x92, 0x2b, 0x2e, 0x15, 0x5d, 0x87, 0x1c, 0x0f, 0xe7, 0x67, 0xb7, 0x2b, 0x15, 0x68,
- 0xf1, 0xf9, 0xb5, 0x1d, 0xec, 0x82, 0xa5, 0xc7, 0x50, 0xe6, 0x97, 0x10, 0x1c, 0x29, 0x96, 0x26,
- 0x53, 0x4d, 0xfa, 0x7d, 0xae, 0x48, 0xc5, 0x5e, 0x66, 0x97, 0x0e, 0x90, 0x0c, 0x44, 0x7d, 0xfe,
- 0xb8, 0x68, 0xc2, 0xbc, 0xda, 0xd6, 0x3d, 0x54, 0xc0, 0x9c, 0xa8, 0xf9, 0xa1, 0x23, 0xa4, 0x42,
- 0xf3, 0xf6, 0x7f, 0x66, 0x2e, 0xa8, 0x61, 0x32, 0x6a, 0x00, 0x3d, 0xb9, 0x47, 0xee, 0x9a, 0x6d,
- 0x5d, 0x3d, 0xa1, 0xb0, 0x20, 0x7c, 0xa4, 0xfa, 0xc8, 0x8b, 0x0d, 0x5e, 0x29, 0xba, 0xb3, 0x4d,
- 0x39, 0x25, 0x38, 0xf2, 0x7e, 0xb3, 0xe3, 0x90, 0xd7, 0x53, 0x69, 0x28, 0x66, 0xd7, 0x53, 0xe9,
- 0x5c, 0x71, 0x6e, 0x3d, 0x95, 0xce, 0x17, 0x0b, 0xe2, 0x6f, 0x08, 0x90, 0x0b, 0xed, 0x63, 0x7a,
- 0xdc, 0xf7, 0x11, 0xf9, 0x4a, 0x34, 0xfe, 0x1b, 0x16, 0x49, 0x98, 0xe6, 0xfd, 0xc5, 0x0d, 0xcb,
- 0x5c, 0x1c, 0x8e, 0x1f, 0xe8, 0x6a, 0x88, 0x1b, 0xa3, 0xe2, 0xb2, 0x7d, 0x9c, 0xfa, 0xc1, 0x0f,
- 0x17, 0xa7, 0xc4, 0xbf, 0x4c, 0xc1, 0x5c, 0x78, 0xd7, 0x52, 0xbd, 0xaf, 0x5c, 0x51, 0xf6, 0x39,
- 0xc4, 0xb1, 0x34, 0xe2, 0xe6, 0x96, 0x8c, 0x7f, 0xf9, 0x01, 0x2b, 0xe6, 0xb5, 0x11, 0x9f, 0xca,
- 0x83, 0xe5, 0xf4, 0x19, 0xcb, 0xff, 0x21, 0xe9, 0xd9, 0xa9, 0x25, 0x98, 0xa6, 0x07, 0x10, 0xf1,
- 0xa2, 0x95, 0xfa, 0xdb, 0x8a, 0xf8, 0xac, 0x24, 0x5d, 0x62, 0xd9, 0x88, 0x5d, 0x6b, 0xbe, 0xd1,
- 0x09, 0x7f, 0x7e, 0xd7, 0x3b, 0xff, 0x9d, 0x88, 0x3d, 0x76, 0xc2, 0xe3, 0xff, 0xc5, 0x38, 0x16,
- 0xf2, 0x3e, 0xf4, 0x4b, 0x50, 0x50, 0xcd, 0x76, 0x9b, 0xcd, 0x59, 0xcc, 0x32, 0x0c, 0x9e, 0xf9,
- 0x42, 0x8b, 0xc0, 0xaf, 0xc1, 0x5c, 0xf2, 0xae, 0xc3, 0x5c, 0x92, 0xf8, 0x75, 0x98, 0x81, 0x20,
- 0xd9, 0xbc, 0x27, 0xcc, 0x35, 0x28, 0xa1, 0x78, 0xdd, 0xd9, 0x37, 0x89, 0xd7, 0x65, 0x31, 0xde,
- 0xbc, 0xe7, 0xfd, 0xb1, 0xc0, 0x03, 0x62, 0x9e, 0x99, 0xe6, 0x41, 0xcf, 0x8b, 0xb3, 0x2d, 0x07,
- 0xcf, 0x6b, 0x4c, 0x7f, 0x79, 0xba, 0x98, 0x92, 0xbc, 0x03, 0x1b, 0xa3, 0x2c, 0x70, 0xe2, 0xab,
- 0x59, 0xe0, 0xeb, 0x90, 0xeb, 0x5a, 0x78, 0x0f, 0x3b, 0xea, 0xbe, 0x6c, 0xf4, 0x3a, 0x7c, 0x3b,
- 0x4e, 0xd6, 0xa5, 0x6d, 0xf5, 0x3a, 0xe8, 0x1e, 0x14, 0xbd, 0x2c, 0x1c, 0x2b, 0xbb, 0x07, 0x7a,
- 0xb9, 0x74, 0x8e, 0xac, 0xc5, 0xff, 0x29, 0xc0, 0x42, 0xa8, 0x4e, 0x7c, 0x4c, 0xad, 0x43, 0x56,
- 0xf3, 0xe6, 0x3c, 0xbb, 0x24, 0x9c, 0x33, 0xea, 0x34, 0xc8, 0x8c, 0x64, 0xb8, 0xe4, 0xbe, 0x96,
- 0x5e, 0x18, 0xe0, 0x8b, 0x4d, 0x9c, 0x53, 0xec, 0x45, 0x5f, 0xce, 0x5a, 0xe0, 0x05, 0xde, 0x20,
- 0x4b, 0x4e, 0x34, 0xc8, 0xc4, 0xdf, 0x16, 0xa0, 0x48, 0x5f, 0xf0, 0x04, 0x63, 0x2d, 0x16, 0xeb,
- 0xe6, 0x46, 0x73, 0x27, 0x26, 0xdf, 0x70, 0x13, 0xba, 0xe4, 0x24, 0x19, 0xbe, 0xe4, 0x44, 0xfc,
- 0xa1, 0x00, 0x79, 0xaf, 0x84, 0xec, 0x62, 0xc1, 0x11, 0xc7, 0x82, 0xbe, 0xd9, 0xe5, 0x79, 0xee,
- 0xf1, 0x25, 0x13, 0xdd, 0x75, 0x18, 0x3c, 0xbe, 0x84, 0x5d, 0xfa, 0xf6, 0xb7, 0xdd, 0x9e, 0x43,
- 0x8a, 0x58, 0xf1, 0x8f, 0xa9, 0x78, 0x83, 0xbd, 0x47, 0x12, 0xbd, 0x93, 0xd5, 0x6c, 0x1f, 0xb2,
- 0x13, 0x67, 0x26, 0x32, 0x7b, 0x88, 0x87, 0x81, 0x01, 0x5f, 0x55, 0xd3, 0x9a, 0x0d, 0x7a, 0x5b,
- 0x2b, 0xfb, 0x6d, 0x8b, 0x4f, 0x02, 0x0a, 0xa4, 0x8d, 0x4f, 0xb4, 0x34, 0x91, 0x29, 0x76, 0xb5,
- 0xc4, 0xfa, 0xca, 0x1f, 0x06, 0x5b, 0xa2, 0x7a, 0x48, 0xd0, 0xd4, 0x23, 0x48, 0x1e, 0x2a, 0xed,
- 0x51, 0x91, 0x54, 0xa1, 0x96, 0x93, 0x48, 0x6e, 0xf4, 0x24, 0x74, 0xba, 0x47, 0x62, 0xb8, 0xe7,
- 0x3f, 0xa8, 0xd2, 0xd0, 0x29, 0x20, 0x1f, 0x86, 0xfb, 0xfa, 0xc8, 0xd7, 0x07, 0x3b, 0xfd, 0xc7,
- 0xa9, 0x1f, 0xff, 0x70, 0x51, 0x10, 0x3f, 0x01, 0x24, 0x61, 0x1b, 0x3b, 0x2f, 0x7a, 0xa6, 0xe5,
- 0x9f, 0x94, 0x72, 0xbb, 0xef, 0xd6, 0x97, 0xe9, 0xd5, 0xec, 0x59, 0xd4, 0x61, 0x4a, 0x17, 0x61,
- 0x21, 0xc4, 0xcd, 0x8c, 0x85, 0xf8, 0x21, 0x5c, 0x79, 0x6a, 0xda, 0xb6, 0xde, 0x25, 0x10, 0x92,
- 0x8e, 0x4a, 0x32, 0xb5, 0x78, 0xe6, 0x31, 0xdd, 0xa5, 0x8b, 0x09, 0x06, 0x33, 0x23, 0x19, 0xc9,
- 0x7b, 0x16, 0x7f, 0x4f, 0x80, 0xcb, 0x83, 0x9c, 0x4c, 0xcb, 0x51, 0x5b, 0x25, 0x67, 0x55, 0xd3,
- 0x3f, 0x59, 0x6f, 0x7c, 0x6f, 0x75, 0xb3, 0x13, 0xb7, 0x90, 0xbf, 0x53, 0xee, 0x28, 0xd4, 0x7c,
- 0xf0, 0x6d, 0xdb, 0x79, 0x4e, 0xde, 0x64, 0x54, 0xdf, 0x92, 0xa4, 0x26, 0xb3, 0x24, 0x4d, 0x28,
- 0xac, 0x9b, 0xba, 0x41, 0xbc, 0x4f, 0xb7, 0xbe, 0x2b, 0x90, 0xdf, 0xd5, 0x0d, 0xc5, 0x3a, 0x91,
- 0xdd, 0x00, 0x3e, 0x61, 0x5c, 0x00, 0x9f, 0x34, 0xc7, 0x38, 0xf8, 0xa3, 0xf8, 0x13, 0x01, 0x8a,
- 0xbe, 0x58, 0x6e, 0x91, 0xdf, 0x05, 0x50, 0xdb, 0x3d, 0xdb, 0xc1, 0x96, 0xdb, 0x4a, 0x39, 0x16,
- 0xf6, 0x5e, 0x61, 0xd4, 0xfa, 0x9a, 0x94, 0xe1, 0x19, 0xea, 0x1a, 0xba, 0x11, 0x3e, 0x55, 0x62,
- 0x7a, 0x15, 0xce, 0x06, 0xce, 0x92, 0x20, 0xcd, 0x6e, 0x3b, 0xa6, 0xe5, 0x61, 0x17, 0xde, 0xec,
- 0xee, 0x39, 0xf9, 0x74, 0x33, 0x34, 0xc9, 0xb7, 0x02, 0x79, 0xe2, 0x2e, 0x1c, 0x62, 0xaf, 0x4a,
- 0xa9, 0xf1, 0x55, 0x62, 0x1c, 0x6e, 0x95, 0xfe, 0xa5, 0x00, 0x85, 0x0a, 0x6b, 0x0d, 0xaf, 0x85,
- 0x47, 0x58, 0xb4, 0x35, 0x48, 0x3b, 0xc7, 0x86, 0xdc, 0xc1, 0xde, 0xdd, 0x32, 0xe7, 0x38, 0xf6,
- 0x6e, 0xd6, 0x61, 0x8f, 0xf4, 0xfa, 0x41, 0x7e, 0xf7, 0x35, 0x1f, 0x2e, 0x57, 0x96, 0xd8, 0xe5,
- 0xd8, 0x4b, 0xee, 0xe5, 0xd8, 0x4b, 0x6b, 0x3c, 0x03, 0x33, 0xea, 0x3f, 0xf8, 0x2f, 0x8b, 0x82,
- 0xe4, 0x31, 0xb1, 0x79, 0xff, 0x7e, 0x83, 0xf4, 0xfa, 0x81, 0x99, 0x19, 0xe5, 0x01, 0x02, 0x97,
- 0x06, 0xf1, 0xeb, 0x96, 0x57, 0xd6, 0xe4, 0x9d, 0xad, 0xca, 0xf3, 0xcd, 0xcd, 0x7a, 0xb3, 0x59,
- 0x5d, 0x2b, 0x0a, 0xa8, 0x08, 0xb9, 0xd0, 0x95, 0x43, 0x09, 0x76, 0x01, 0xf3, 0xfd, 0xff, 0x0f,
- 0xc0, 0xbf, 0xbd, 0x8c, 0xc8, 0xda, 0xa8, 0x7e, 0x26, 0xbf, 0x5c, 0x79, 0xb6, 0x53, 0x6d, 0x14,
- 0xa7, 0x10, 0x82, 0xfc, 0xea, 0x4a, 0xb3, 0x52, 0x93, 0xa5, 0x6a, 0x63, 0xfb, 0xf9, 0x56, 0xa3,
- 0xea, 0x5e, 0xdc, 0x7c, 0x7f, 0x0d, 0x72, 0xc1, 0xb3, 0x83, 0xd0, 0x02, 0x14, 0x2a, 0xb5, 0x6a,
- 0x65, 0x43, 0x7e, 0x59, 0x5f, 0x91, 0x5f, 0xec, 0x54, 0x77, 0xaa, 0xc5, 0x29, 0x5a, 0x34, 0x4a,
- 0x7c, 0xb2, 0xf3, 0xec, 0x59, 0x51, 0x40, 0x05, 0xc8, 0xb2, 0x67, 0x7a, 0x3d, 0x51, 0x31, 0x71,
- 0x7f, 0x13, 0xb2, 0x81, 0x43, 0x86, 0xc9, 0xeb, 0xb6, 0x77, 0x1a, 0x35, 0xb9, 0x59, 0xdf, 0xac,
- 0x36, 0x9a, 0x2b, 0x9b, 0xdb, 0x4c, 0x06, 0xa5, 0xad, 0xac, 0x3e, 0x97, 0x9a, 0x45, 0xc1, 0x7b,
- 0x6e, 0x3e, 0xdf, 0xa9, 0xd4, 0xdc, 0x6a, 0x88, 0xa9, 0x74, 0xb2, 0x98, 0xbc, 0xff, 0xd7, 0x05,
- 0xb8, 0x3c, 0xe4, 0x1c, 0x1d, 0x94, 0x85, 0xd9, 0x1d, 0x83, 0x9e, 0xb8, 0x5a, 0x9c, 0x42, 0x73,
- 0x81, 0xa3, 0x74, 0x8a, 0x02, 0x4a, 0xb3, 0xc3, 0x4c, 0x8a, 0x09, 0x34, 0x03, 0x89, 0xc6, 0xa3,
- 0x62, 0x92, 0x94, 0x34, 0x70, 0x12, 0x4d, 0x31, 0x85, 0x32, 0xfc, 0x0c, 0x8c, 0xe2, 0x34, 0xca,
- 0xf9, 0x47, 0x51, 0x14, 0x67, 0x88, 0x28, 0xef, 0x48, 0x87, 0xe2, 0xec, 0xfd, 0xeb, 0x10, 0xd8,
- 0x36, 0x8f, 0x00, 0x66, 0x9e, 0x29, 0x0e, 0xb6, 0x9d, 0xe2, 0x14, 0x9a, 0x85, 0xe4, 0x4a, 0xbb,
- 0x5d, 0x14, 0x1e, 0xfe, 0x8b, 0x14, 0xa4, 0xdd, 0x6b, 0x78, 0xd0, 0x33, 0x98, 0x66, 0xcb, 0xca,
- 0x8b, 0xc3, 0xd1, 0x02, 0x1d, 0xd0, 0xe5, 0x6b, 0xe3, 0xe0, 0x84, 0x38, 0x85, 0xfe, 0x7f, 0xc8,
- 0x06, 0xbc, 0x28, 0x34, 0x74, 0x69, 0x2c, 0xe4, 0x39, 0x96, 0x6f, 0x8f, 0xcb, 0xe6, 0xc9, 0x7f,
- 0x05, 0x19, 0xcf, 0xaa, 0xa3, 0x1b, 0xa3, 0x6c, 0xbe, 0x2b, 0x7b, 0xf4, 0xc4, 0x40, 0xc6, 0x9f,
- 0x38, 0xf5, 0xbe, 0x80, 0x2c, 0x40, 0x83, 0x06, 0x18, 0x45, 0x05, 0x2b, 0x0c, 0xb5, 0xf0, 0xe5,
- 0xfb, 0x13, 0xe5, 0xf6, 0xdf, 0x49, 0x94, 0xe5, 0xcf, 0x22, 0xd1, 0xca, 0x1a, 0x98, 0xa3, 0xa2,
- 0x95, 0x15, 0x31, 0x19, 0x4d, 0xa1, 0x17, 0x90, 0x22, 0xd6, 0x13, 0x45, 0xf9, 0x95, 0x7d, 0xd6,
- 0xba, 0x7c, 0x63, 0x64, 0x1e, 0x57, 0xe4, 0xea, 0xbd, 0x1f, 0xff, 0xd9, 0xd5, 0xa9, 0x1f, 0x9f,
- 0x5d, 0x15, 0x7e, 0x72, 0x76, 0x55, 0xf8, 0x93, 0xb3, 0xab, 0xc2, 0x9f, 0x9e, 0x5d, 0x15, 0xbe,
- 0xff, 0xd3, 0xab, 0x53, 0x3f, 0xf9, 0xe9, 0xd5, 0xa9, 0x3f, 0xf9, 0xe9, 0xd5, 0xa9, 0xcf, 0x67,
- 0x39, 0xf7, 0xee, 0x0c, 0x35, 0x2d, 0x8f, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7c, 0xb1,
- 0x3d, 0x40, 0xb2, 0x80, 0x00, 0x00,
+func init() { proto.RegisterFile("roachpb/api.proto", fileDescriptor_api_7ab19f7b4624e210) }
+
+var fileDescriptor_api_7ab19f7b4624e210 = []byte{
+ // 8196 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5d, 0x6c, 0x23, 0x59,
+ 0x76, 0x9e, 0x8a, 0xa4, 0x24, 0xf2, 0x50, 0x22, 0x4b, 0x57, 0xfd, 0xa3, 0xe6, 0xcc, 0xb4, 0xba,
+ 0xab, 0xff, 0xdb, 0x33, 0xd2, 0x74, 0xf7, 0x4e, 0x66, 0x3c, 0x3d, 0x9e, 0xb5, 0x44, 0xb1, 0x9b,
+ 0x94, 0x5a, 0x6a, 0x75, 0x91, 0xea, 0xc6, 0x8c, 0xd7, 0xa9, 0x2d, 0x55, 0x5d, 0x51, 0xb5, 0x22,
+ 0xab, 0xd8, 0x55, 0x45, 0xfd, 0x0c, 0x10, 0x20, 0x8e, 0x0d, 0x67, 0x9f, 0x8c, 0x7d, 0x30, 0x90,
+ 0x35, 0x1c, 0xc4, 0xeb, 0x6c, 0x10, 0x3f, 0x04, 0x48, 0x02, 0x24, 0xc8, 0x1f, 0x92, 0xf5, 0x8b,
+ 0x81, 0x2c, 0x02, 0x27, 0x5e, 0x3f, 0xc5, 0x08, 0x10, 0xc5, 0xd6, 0xe6, 0x25, 0x70, 0x10, 0x04,
+ 0x41, 0x00, 0x03, 0xf3, 0x10, 0x04, 0xf7, 0xa7, 0xfe, 0xc8, 0xe2, 0x8f, 0x7a, 0x6a, 0x93, 0x01,
+ 0xfc, 0x22, 0xb1, 0xce, 0xbd, 0xe7, 0xd4, 0xbd, 0xe7, 0xde, 0x7b, 0xee, 0xf9, 0x6e, 0x9d, 0x7b,
+ 0x2f, 0xcc, 0xd9, 0x96, 0xaa, 0xed, 0x77, 0x76, 0x97, 0xd5, 0x8e, 0xb1, 0xd4, 0xb1, 0x2d, 0xd7,
+ 0x42, 0x73, 0x9a, 0xa5, 0x1d, 0x50, 0xf2, 0x12, 0x4f, 0x2c, 0xdd, 0x3f, 0x38, 0x5c, 0x3e, 0x38,
+ 0x74, 0xb0, 0x7d, 0x88, 0xed, 0x65, 0xcd, 0x32, 0xb5, 0xae, 0x6d, 0x63, 0x53, 0x3b, 0x59, 0x6e,
+ 0x59, 0xda, 0x01, 0xfd, 0x63, 0x98, 0x4d, 0xc6, 0x5e, 0x42, 0x9e, 0x44, 0x5d, 0x75, 0x55, 0x4e,
+ 0xbb, 0xe0, 0xd1, 0xb0, 0x6d, 0x5b, 0xb6, 0xc3, 0xa9, 0x97, 0x3c, 0x6a, 0x1b, 0xbb, 0x6a, 0x28,
+ 0xf7, 0x5b, 0x8e, 0x6b, 0xd9, 0x6a, 0x13, 0x2f, 0x63, 0xb3, 0x69, 0x98, 0x98, 0x64, 0x38, 0xd4,
+ 0x34, 0x9e, 0xf8, 0x76, 0x6c, 0xe2, 0x23, 0x9e, 0xba, 0xd0, 0x75, 0x8d, 0xd6, 0xf2, 0x7e, 0x4b,
+ 0x5b, 0x76, 0x8d, 0x36, 0x76, 0x5c, 0xb5, 0xdd, 0xe1, 0x29, 0xf7, 0x69, 0x8a, 0x6b, 0xab, 0x9a,
+ 0x61, 0x36, 0xbd, 0xff, 0x9d, 0xdd, 0x65, 0x1b, 0x6b, 0x96, 0xad, 0x63, 0x5d, 0x71, 0x3a, 0xaa,
+ 0xe9, 0x15, 0xb7, 0x69, 0x35, 0x2d, 0xfa, 0x73, 0x99, 0xfc, 0xe2, 0xd4, 0xab, 0x4d, 0xcb, 0x6a,
+ 0xb6, 0xf0, 0x32, 0x7d, 0xda, 0xed, 0xee, 0x2d, 0xeb, 0x5d, 0x5b, 0x75, 0x0d, 0x8b, 0x73, 0x49,
+ 0xff, 0x4c, 0x80, 0x59, 0x19, 0xbf, 0xee, 0x62, 0xc7, 0xad, 0x62, 0x55, 0xc7, 0x36, 0xba, 0x02,
+ 0xe9, 0x03, 0x7c, 0xb2, 0x90, 0xbe, 0x26, 0xdc, 0x9d, 0x59, 0x9d, 0xfe, 0xf2, 0x74, 0x31, 0xbd,
+ 0x81, 0x4f, 0x64, 0x42, 0x43, 0xd7, 0x60, 0x1a, 0x9b, 0xba, 0x42, 0x92, 0x33, 0xd1, 0xe4, 0x29,
+ 0x6c, 0xea, 0x1b, 0xf8, 0x04, 0x7d, 0x0b, 0xb2, 0x0e, 0x91, 0x66, 0x6a, 0x78, 0x61, 0xf2, 0x9a,
+ 0x70, 0x77, 0x72, 0xf5, 0x17, 0xbf, 0x3c, 0x5d, 0xfc, 0xa4, 0x69, 0xb8, 0xfb, 0xdd, 0xdd, 0x25,
+ 0xcd, 0x6a, 0x2f, 0xfb, 0xed, 0xa4, 0xef, 0x06, 0xbf, 0x97, 0x3b, 0x07, 0xcd, 0xe5, 0x5e, 0x1d,
+ 0x2d, 0x35, 0x8e, 0xcd, 0x3a, 0x7e, 0x2d, 0xfb, 0x12, 0xd7, 0x33, 0x59, 0x41, 0x4c, 0xad, 0x67,
+ 0xb2, 0x29, 0x31, 0x2d, 0xfd, 0x51, 0x0a, 0x0a, 0x32, 0x76, 0x3a, 0x96, 0xe9, 0x60, 0x5e, 0xf2,
+ 0xf7, 0x21, 0xed, 0x1e, 0x9b, 0xb4, 0xe4, 0xf9, 0x87, 0x57, 0x97, 0xfa, 0x7a, 0xc4, 0x52, 0xc3,
+ 0x56, 0x4d, 0x47, 0xd5, 0x48, 0xf5, 0x65, 0x92, 0x15, 0x7d, 0x04, 0x79, 0x1b, 0x3b, 0xdd, 0x36,
+ 0xa6, 0x8a, 0xa4, 0x95, 0xca, 0x3f, 0xbc, 0x1c, 0xc3, 0x59, 0xef, 0xa8, 0xa6, 0x0c, 0x2c, 0x2f,
+ 0xf9, 0x8d, 0xae, 0x40, 0xd6, 0xec, 0xb6, 0x89, 0x2a, 0x1c, 0x5a, 0xd1, 0xb4, 0x3c, 0x6d, 0x76,
+ 0xdb, 0x1b, 0xf8, 0xc4, 0x41, 0x75, 0x98, 0xe5, 0x42, 0x6d, 0xac, 0x3a, 0x96, 0xb9, 0x30, 0x7d,
+ 0x4d, 0xb8, 0x5b, 0x78, 0xb8, 0x14, 0x23, 0x36, 0x5a, 0x01, 0xf2, 0xd8, 0x6d, 0x63, 0x99, 0x72,
+ 0xc9, 0x33, 0x76, 0xe8, 0x09, 0xbd, 0x05, 0x39, 0xf2, 0xbe, 0xdd, 0x13, 0x17, 0x3b, 0x0b, 0x59,
+ 0xfa, 0x42, 0x52, 0x80, 0x55, 0xf2, 0x2c, 0x7d, 0x0a, 0x33, 0x61, 0x56, 0x84, 0xa0, 0x20, 0x57,
+ 0xea, 0x3b, 0x9b, 0x15, 0x65, 0x67, 0x6b, 0x63, 0xeb, 0xf9, 0xab, 0x2d, 0x71, 0x02, 0x5d, 0x00,
+ 0x91, 0xd3, 0x36, 0x2a, 0x9f, 0x29, 0xcf, 0x6a, 0x9b, 0xb5, 0x86, 0x28, 0x94, 0x32, 0xdf, 0xfd,
+ 0xe1, 0xd5, 0x89, 0xf5, 0x4c, 0x76, 0x4a, 0x9c, 0x96, 0x7e, 0x28, 0x00, 0x3c, 0xc5, 0x2e, 0xef,
+ 0x0d, 0x68, 0x15, 0xa6, 0xf6, 0x69, 0xb1, 0x16, 0x04, 0xaa, 0x96, 0x6b, 0xb1, 0xe5, 0x0f, 0xf5,
+ 0x9c, 0xd5, 0xec, 0x8f, 0x4f, 0x17, 0x27, 0x7e, 0x72, 0xba, 0x28, 0xc8, 0x9c, 0x13, 0xbd, 0x80,
+ 0xfc, 0x01, 0x3e, 0x51, 0xf8, 0x58, 0x5b, 0x48, 0x51, 0x45, 0xbc, 0x1f, 0x12, 0x74, 0x70, 0xb8,
+ 0xe4, 0x0d, 0xd1, 0xa5, 0xd0, 0x10, 0x5d, 0x22, 0x1c, 0x4b, 0x75, 0xd7, 0xc6, 0x66, 0xd3, 0xdd,
+ 0x97, 0xe1, 0x00, 0x9f, 0x3c, 0x63, 0x32, 0xa4, 0xdf, 0x17, 0x20, 0x4f, 0x4b, 0xc9, 0x34, 0x87,
+ 0xca, 0x3d, 0xc5, 0xbc, 0x3e, 0x52, 0xcd, 0x31, 0xe5, 0x5c, 0x82, 0xc9, 0x43, 0xb5, 0xd5, 0xc5,
+ 0xb4, 0x84, 0xf9, 0x87, 0x0b, 0x31, 0x32, 0x5e, 0x92, 0x74, 0x99, 0x65, 0x43, 0x8f, 0x61, 0xc6,
+ 0x30, 0x5d, 0x6c, 0xba, 0x0a, 0x63, 0x4b, 0x8f, 0x60, 0xcb, 0xb3, 0xdc, 0xf4, 0x41, 0xfa, 0xa7,
+ 0x02, 0xc0, 0x76, 0x37, 0x51, 0x3d, 0x7f, 0x63, 0xcc, 0xf2, 0xaf, 0x66, 0x08, 0xab, 0x57, 0x8b,
+ 0x4b, 0x30, 0x65, 0x98, 0x2d, 0xc3, 0x64, 0xe5, 0xcf, 0xca, 0xfc, 0x09, 0x5d, 0x80, 0xc9, 0xdd,
+ 0x96, 0x61, 0xea, 0x74, 0x3c, 0x64, 0x65, 0xf6, 0x20, 0xc9, 0x90, 0xa7, 0xa5, 0x4e, 0x50, 0xef,
+ 0xd2, 0x69, 0x0a, 0x2e, 0x96, 0x2d, 0x53, 0x37, 0xc8, 0x90, 0x54, 0x5b, 0x5f, 0x0b, 0xad, 0xac,
+ 0xc3, 0x05, 0x1d, 0x77, 0x6c, 0xac, 0xa9, 0x2e, 0xd6, 0x15, 0x7c, 0xdc, 0x19, 0xb3, 0x8d, 0x51,
+ 0xc0, 0x55, 0x39, 0xee, 0x50, 0x5a, 0xbc, 0x26, 0xd1, 0x37, 0xe0, 0xb2, 0xda, 0x6a, 0x59, 0x47,
+ 0x8a, 0xb1, 0xa7, 0xe8, 0x16, 0x76, 0x14, 0xd3, 0x72, 0x15, 0x7c, 0x6c, 0x38, 0x2e, 0x35, 0x25,
+ 0x59, 0x79, 0x9e, 0x26, 0xd7, 0xf6, 0xd6, 0x2c, 0xec, 0x6c, 0x59, 0x6e, 0x85, 0x24, 0x11, 0x0b,
+ 0x40, 0x0a, 0xc3, 0x2c, 0xc0, 0x14, 0x31, 0xbf, 0x72, 0x16, 0x1f, 0x77, 0xa8, 0x05, 0x08, 0x35,
+ 0xe5, 0x74, 0xb8, 0x29, 0xa5, 0x5f, 0x86, 0x4b, 0xbd, 0xfa, 0x4d, 0xb2, 0xfd, 0xfe, 0x50, 0x80,
+ 0x42, 0xcd, 0x34, 0xdc, 0xaf, 0x45, 0xc3, 0xf9, 0xca, 0x4e, 0x87, 0x95, 0x7d, 0x1f, 0xc4, 0x3d,
+ 0xd5, 0x68, 0x3d, 0x37, 0x1b, 0x56, 0x7b, 0xd7, 0x71, 0x2d, 0x13, 0x3b, 0xbc, 0x35, 0xfa, 0xe8,
+ 0xd2, 0x4b, 0x28, 0xfa, 0xb5, 0x49, 0x52, 0x4d, 0x2e, 0x88, 0x35, 0x53, 0xb3, 0x71, 0x1b, 0x9b,
+ 0x89, 0xea, 0xe9, 0x6d, 0xc8, 0x19, 0x9e, 0x5c, 0xaa, 0xab, 0xb4, 0x1c, 0x10, 0xa4, 0x2e, 0xcc,
+ 0x85, 0xde, 0x9a, 0xa4, 0xb9, 0x24, 0x93, 0x11, 0x3e, 0x52, 0x82, 0x36, 0x22, 0x93, 0x11, 0x3e,
+ 0x62, 0xe6, 0xad, 0x0e, 0xb3, 0x6b, 0xb8, 0x85, 0x5d, 0x9c, 0x60, 0x4d, 0xa5, 0x1d, 0x28, 0x78,
+ 0x42, 0x93, 0x6c, 0x98, 0xbf, 0x25, 0x00, 0xe2, 0x72, 0x55, 0xb3, 0x99, 0x64, 0x89, 0xd1, 0x22,
+ 0x71, 0x2d, 0xdc, 0xae, 0x6d, 0x32, 0x1f, 0x81, 0xf5, 0x49, 0x60, 0x24, 0xea, 0x26, 0x04, 0x43,
+ 0x36, 0x13, 0x1e, 0xb2, 0xdc, 0xbd, 0x39, 0x82, 0xf9, 0x48, 0xc1, 0x92, 0x6d, 0xbe, 0x0c, 0x2d,
+ 0x53, 0xea, 0x5a, 0x3a, 0xec, 0xc3, 0x51, 0xa2, 0xf4, 0x7d, 0x01, 0xe6, 0xca, 0x2d, 0xac, 0xda,
+ 0x89, 0x6b, 0xe4, 0x9b, 0x90, 0xd5, 0xb1, 0xaa, 0xd3, 0x2a, 0xb3, 0x81, 0xfd, 0x4e, 0x48, 0x0a,
+ 0xf1, 0x74, 0x97, 0xf6, 0x5b, 0xda, 0x52, 0xc3, 0xf3, 0x81, 0xf9, 0xe8, 0xf6, 0x99, 0xa4, 0xcf,
+ 0x00, 0x85, 0x4b, 0x96, 0x64, 0x47, 0xf8, 0xdf, 0x02, 0x20, 0x19, 0x1f, 0x62, 0xdb, 0x4d, 0xbc,
+ 0xda, 0x6b, 0x90, 0x77, 0x55, 0xbb, 0x89, 0x5d, 0x85, 0x78, 0xf7, 0xe7, 0xa9, 0x39, 0x30, 0x3e,
+ 0x42, 0x46, 0x0d, 0xb8, 0x83, 0x4d, 0x75, 0xb7, 0x85, 0xa9, 0x14, 0x65, 0xd7, 0xea, 0x9a, 0xba,
+ 0x62, 0xb8, 0xd8, 0x56, 0x5d, 0xcb, 0x56, 0xac, 0x8e, 0x6b, 0xb4, 0x8d, 0x2f, 0xa8, 0x63, 0xcf,
+ 0xbb, 0xda, 0x0d, 0x96, 0x9d, 0x30, 0xaf, 0x92, 0xcc, 0x35, 0x9e, 0xf7, 0x79, 0x28, 0xab, 0xf4,
+ 0x39, 0xcc, 0x47, 0x6a, 0x9d, 0xa4, 0x4a, 0xff, 0xa7, 0x00, 0xf9, 0xba, 0xa6, 0x9a, 0x49, 0xea,
+ 0xf2, 0x53, 0xc8, 0x3b, 0x9a, 0x6a, 0x2a, 0x7b, 0x96, 0xdd, 0x56, 0x5d, 0x3a, 0x70, 0x0a, 0x11,
+ 0x5d, 0xfa, 0xfe, 0xba, 0xa6, 0x9a, 0x4f, 0x68, 0x26, 0x19, 0x1c, 0xff, 0x77, 0xaf, 0x3f, 0x3a,
+ 0xf9, 0xd5, 0xfd, 0x51, 0x36, 0x5c, 0xd7, 0x33, 0xd9, 0xb4, 0x98, 0x91, 0xfe, 0x42, 0x80, 0x19,
+ 0x56, 0xe5, 0x24, 0x87, 0xeb, 0x07, 0x90, 0xb1, 0xad, 0x23, 0x36, 0x5c, 0xf3, 0x0f, 0xdf, 0x8a,
+ 0x11, 0xb1, 0x81, 0x4f, 0xc2, 0xf3, 0x21, 0xcd, 0x8e, 0x56, 0x81, 0x7b, 0x9d, 0x0a, 0xe5, 0x4e,
+ 0x8f, 0xcb, 0x0d, 0x8c, 0x4b, 0x26, 0x32, 0xee, 0x40, 0x71, 0x57, 0x75, 0xb5, 0x7d, 0xc5, 0xe6,
+ 0x85, 0x24, 0x73, 0x67, 0xfa, 0xee, 0x8c, 0x5c, 0xa0, 0x64, 0xaf, 0xe8, 0x0e, 0xa9, 0x39, 0x1b,
+ 0x3f, 0x0e, 0xfe, 0x4b, 0xd6, 0xe6, 0xff, 0x47, 0xe0, 0x63, 0xc8, 0xab, 0xf9, 0x5f, 0xb6, 0xa6,
+ 0xff, 0xad, 0x14, 0x5c, 0x2e, 0xef, 0x63, 0xed, 0xa0, 0x6c, 0x99, 0x8e, 0xe1, 0xb8, 0x44, 0x77,
+ 0x49, 0xb6, 0xff, 0x5b, 0x90, 0x3b, 0x32, 0xdc, 0x7d, 0x45, 0x37, 0xf6, 0xf6, 0xa8, 0xf5, 0xcc,
+ 0xca, 0x59, 0x42, 0x58, 0x33, 0xf6, 0xf6, 0xd0, 0x23, 0xc8, 0xb4, 0x2d, 0x9d, 0x39, 0xe7, 0x85,
+ 0x87, 0x8b, 0x31, 0xe2, 0x69, 0xd1, 0x9c, 0x6e, 0x7b, 0xd3, 0xd2, 0xb1, 0x4c, 0x33, 0xa3, 0xab,
+ 0x00, 0x1a, 0xa1, 0x76, 0x2c, 0xc3, 0x74, 0xf9, 0xec, 0x1b, 0xa2, 0xa0, 0x2a, 0xe4, 0x5c, 0x6c,
+ 0xb7, 0x0d, 0x53, 0x75, 0xf1, 0xc2, 0x24, 0x55, 0xde, 0xcd, 0xd8, 0x82, 0x77, 0x5a, 0x86, 0xa6,
+ 0xae, 0x61, 0x47, 0xb3, 0x8d, 0x8e, 0x6b, 0xd9, 0x5c, 0x8b, 0x01, 0xb3, 0xf4, 0x1b, 0x19, 0x58,
+ 0xe8, 0xd7, 0x4d, 0x92, 0x3d, 0x64, 0x1b, 0xa6, 0x6c, 0xec, 0x74, 0x5b, 0x2e, 0xef, 0x23, 0x0f,
+ 0x07, 0xa9, 0x20, 0xa6, 0x04, 0x74, 0xbd, 0xa1, 0xe5, 0xf2, 0x62, 0x73, 0x39, 0xa5, 0x7f, 0x2d,
+ 0xc0, 0x14, 0x4b, 0x40, 0x0f, 0x20, 0x6b, 0x93, 0x89, 0x41, 0x31, 0x74, 0x5a, 0xc6, 0xf4, 0xea,
+ 0xa5, 0xb3, 0xd3, 0xc5, 0x69, 0x3a, 0x59, 0xd4, 0xd6, 0xbe, 0x0c, 0x7e, 0xca, 0xd3, 0x34, 0x5f,
+ 0x4d, 0x27, 0xad, 0xe5, 0xb8, 0xaa, 0xed, 0xd2, 0x45, 0xa2, 0x14, 0x43, 0x29, 0x94, 0xb0, 0x81,
+ 0x4f, 0xd0, 0x3a, 0x4c, 0x39, 0xae, 0xea, 0x76, 0x1d, 0xde, 0x5e, 0xe7, 0x2a, 0x6c, 0x9d, 0x72,
+ 0xca, 0x5c, 0x02, 0x71, 0x9f, 0x74, 0xec, 0xaa, 0x46, 0x8b, 0x36, 0x60, 0x4e, 0xe6, 0x4f, 0xd2,
+ 0x6f, 0x0b, 0x30, 0xc5, 0xb2, 0xa2, 0xcb, 0x30, 0x2f, 0xaf, 0x6c, 0x3d, 0xad, 0x28, 0xb5, 0xad,
+ 0xb5, 0x4a, 0xa3, 0x22, 0x6f, 0xd6, 0xb6, 0x56, 0x1a, 0x15, 0x71, 0x02, 0x5d, 0x02, 0xe4, 0x25,
+ 0x94, 0x9f, 0x6f, 0xd5, 0x6b, 0xf5, 0x46, 0x65, 0xab, 0x21, 0x0a, 0x74, 0x8d, 0x84, 0xd2, 0x43,
+ 0xd4, 0x14, 0xba, 0x09, 0xd7, 0x7a, 0xa9, 0x4a, 0xbd, 0xb1, 0xd2, 0xa8, 0x2b, 0x95, 0x7a, 0xa3,
+ 0xb6, 0xb9, 0xd2, 0xa8, 0xac, 0x89, 0xe9, 0x21, 0xb9, 0xc8, 0x4b, 0x64, 0xb9, 0x52, 0x6e, 0x88,
+ 0x19, 0xc9, 0x85, 0x8b, 0x32, 0xd6, 0xac, 0x76, 0xa7, 0xeb, 0x62, 0x52, 0x4a, 0x27, 0xc9, 0x91,
+ 0x72, 0x19, 0xa6, 0x75, 0xfb, 0x44, 0xb1, 0xbb, 0x26, 0x1f, 0x27, 0x53, 0xba, 0x7d, 0x22, 0x77,
+ 0x4d, 0xe9, 0x1f, 0x0b, 0x70, 0xa9, 0xf7, 0xb5, 0x49, 0x76, 0xc2, 0x17, 0x90, 0x57, 0x75, 0x1d,
+ 0xeb, 0x8a, 0x8e, 0x5b, 0xae, 0xca, 0x5d, 0x9c, 0xfb, 0x21, 0x49, 0x7c, 0x69, 0x6f, 0xc9, 0x5f,
+ 0xda, 0xdb, 0x7c, 0x59, 0x2e, 0xd3, 0x82, 0xac, 0x11, 0x0e, 0xcf, 0xfc, 0x50, 0x21, 0x94, 0x22,
+ 0xfd, 0xf7, 0x0c, 0xcc, 0x56, 0x4c, 0xbd, 0x71, 0x9c, 0xe8, 0x5c, 0x72, 0x09, 0xa6, 0x34, 0xab,
+ 0xdd, 0x36, 0x5c, 0x4f, 0x41, 0xec, 0x09, 0xfd, 0x7c, 0xc8, 0x35, 0x4d, 0x8f, 0xe1, 0xa0, 0x05,
+ 0x4e, 0x29, 0xfa, 0x36, 0x5c, 0x26, 0x56, 0xd3, 0x36, 0xd5, 0x96, 0xc2, 0xa4, 0x29, 0xae, 0x6d,
+ 0x34, 0x9b, 0xd8, 0xe6, 0xcb, 0x89, 0x77, 0x63, 0xca, 0x59, 0xe3, 0x1c, 0x65, 0xca, 0xd0, 0x60,
+ 0xf9, 0xe5, 0x8b, 0x46, 0x1c, 0x19, 0x7d, 0x02, 0x40, 0xa6, 0x22, 0xba, 0x44, 0xe9, 0x70, 0x7b,
+ 0x34, 0x68, 0x8d, 0xd2, 0x33, 0x41, 0x84, 0x81, 0x3c, 0x3b, 0x68, 0x99, 0xe0, 0x90, 0xd7, 0x5d,
+ 0xc3, 0xc6, 0xca, 0x83, 0x8e, 0x46, 0x17, 0x0e, 0xb2, 0xab, 0x85, 0xb3, 0xd3, 0x45, 0x90, 0x19,
+ 0xf9, 0xc1, 0x76, 0x99, 0xe0, 0x12, 0xf6, 0xbb, 0xa3, 0xa1, 0x57, 0x70, 0x2f, 0xb4, 0xfe, 0x41,
+ 0x66, 0x5e, 0x5e, 0x2d, 0xd5, 0x55, 0xf6, 0x8d, 0xe6, 0x3e, 0xb6, 0x15, 0x7f, 0x99, 0x9a, 0xae,
+ 0x44, 0x66, 0xe5, 0x9b, 0x01, 0x43, 0x59, 0x35, 0x59, 0xe9, 0x57, 0xdc, 0x2a, 0xcd, 0xec, 0xeb,
+ 0x8c, 0x28, 0xbf, 0x63, 0x19, 0x8e, 0x65, 0x2e, 0xe4, 0x98, 0xf2, 0xd9, 0x13, 0xba, 0x07, 0xa2,
+ 0x7b, 0x6c, 0x2a, 0xfb, 0x58, 0xb5, 0xdd, 0x5d, 0xac, 0xba, 0x64, 0x96, 0x06, 0x9a, 0xa3, 0xe8,
+ 0x1e, 0x9b, 0xd5, 0x10, 0x19, 0xbd, 0x00, 0xd1, 0x30, 0x95, 0xbd, 0x96, 0xd1, 0xdc, 0x77, 0x95,
+ 0x23, 0xdb, 0x70, 0xb1, 0xb3, 0x30, 0x47, 0x15, 0x12, 0xd7, 0x6f, 0xeb, 0x7c, 0xdd, 0x58, 0x7f,
+ 0x45, 0x72, 0x72, 0xd5, 0x14, 0x0c, 0xf3, 0x09, 0xe5, 0xa7, 0x44, 0x67, 0x3d, 0x93, 0x9d, 0x16,
+ 0xb3, 0xd2, 0x7f, 0x16, 0xa0, 0xe0, 0x75, 0xb7, 0x24, 0x47, 0xc6, 0x5d, 0x10, 0x2d, 0x13, 0x2b,
+ 0x9d, 0x7d, 0xd5, 0xc1, 0x5c, 0x8f, 0x7c, 0xc2, 0x29, 0x58, 0x26, 0xde, 0x26, 0x64, 0xa6, 0x2e,
+ 0xb4, 0x0d, 0x73, 0x8e, 0xab, 0x36, 0x0d, 0xb3, 0x19, 0x52, 0xef, 0xe4, 0xf8, 0x60, 0x41, 0xe4,
+ 0xdc, 0x3e, 0x3d, 0xe2, 0xa5, 0xfc, 0xb1, 0x00, 0x73, 0x2b, 0x7a, 0xdb, 0x30, 0xeb, 0x9d, 0x96,
+ 0x91, 0xe8, 0x1a, 0xc4, 0x4d, 0xc8, 0x39, 0x44, 0x66, 0x60, 0xf0, 0x03, 0x44, 0x99, 0xa5, 0x29,
+ 0xc4, 0xf2, 0x3f, 0x83, 0x22, 0x3e, 0xee, 0x18, 0xec, 0xd3, 0x03, 0x03, 0x42, 0x99, 0xf1, 0xeb,
+ 0x56, 0x08, 0x78, 0x49, 0x12, 0xaf, 0xd3, 0x67, 0x80, 0xc2, 0x55, 0x4a, 0x12, 0xbb, 0x7c, 0x06,
+ 0xf3, 0x54, 0xf4, 0x8e, 0xe9, 0x24, 0xac, 0x2f, 0xe9, 0x97, 0xe0, 0x42, 0x54, 0x74, 0x92, 0xe5,
+ 0x7e, 0xc5, 0x5b, 0x79, 0x13, 0xdb, 0x89, 0x82, 0x58, 0x5f, 0xd7, 0x5c, 0x70, 0x92, 0x65, 0xfe,
+ 0x35, 0x01, 0xae, 0x50, 0xd9, 0xf4, 0xeb, 0xcc, 0x1e, 0xb6, 0x9f, 0x61, 0xd5, 0x49, 0x14, 0x81,
+ 0xdf, 0x80, 0x29, 0x86, 0xa4, 0x69, 0xff, 0x9c, 0x5c, 0xcd, 0x13, 0xcf, 0xa5, 0xee, 0x5a, 0x36,
+ 0xf1, 0x5c, 0x78, 0x92, 0xa4, 0x42, 0x29, 0xae, 0x14, 0x49, 0xd6, 0xf4, 0xef, 0x08, 0x30, 0xc7,
+ 0x9d, 0x46, 0xd2, 0x95, 0xcb, 0xfb, 0xc4, 0x67, 0x42, 0x15, 0xc8, 0x6b, 0xf4, 0x97, 0xe2, 0x9e,
+ 0x74, 0x30, 0x95, 0x5f, 0x18, 0xe6, 0x6f, 0x32, 0xb6, 0xc6, 0x49, 0x07, 0x13, 0xa7, 0xd5, 0xfb,
+ 0x4d, 0x14, 0x15, 0xaa, 0xe4, 0x50, 0x8f, 0x95, 0x8e, 0x23, 0x9a, 0xd7, 0x73, 0xfd, 0xb8, 0x0e,
+ 0xfe, 0x49, 0x9a, 0x2b, 0x81, 0xbd, 0x83, 0x67, 0x4f, 0xd4, 0x47, 0xf9, 0x1c, 0x2e, 0x85, 0x67,
+ 0x97, 0x50, 0xc5, 0x53, 0xe7, 0xa8, 0x78, 0x68, 0x85, 0x3e, 0xa0, 0xa2, 0xcf, 0x20, 0xb4, 0x06,
+ 0xaf, 0xb0, 0x3a, 0x79, 0xe8, 0xe7, 0x3c, 0xea, 0x98, 0x0b, 0xa4, 0x30, 0xba, 0x83, 0xca, 0x90,
+ 0xc5, 0xc7, 0x1d, 0x45, 0xc7, 0x8e, 0xc6, 0x0d, 0x97, 0x14, 0x27, 0x90, 0x14, 0xa5, 0x0f, 0x0f,
+ 0x4c, 0xe3, 0xe3, 0x0e, 0x21, 0xa2, 0x1d, 0x32, 0x7b, 0x79, 0xae, 0x02, 0x2d, 0xb6, 0x33, 0x1a,
+ 0x5e, 0x04, 0x3d, 0x85, 0x8b, 0x2b, 0xfa, 0x5e, 0x02, 0x13, 0x21, 0xfd, 0x40, 0x80, 0xb7, 0x62,
+ 0x5b, 0x2d, 0xc9, 0x89, 0xec, 0x13, 0xc8, 0xd0, 0xca, 0xa7, 0xce, 0x59, 0x79, 0xca, 0x25, 0x7d,
+ 0x37, 0xc5, 0xc7, 0xb8, 0x8c, 0x5b, 0x16, 0x51, 0x6c, 0xe2, 0xab, 0x6c, 0xcf, 0x61, 0xf6, 0xd0,
+ 0x72, 0x89, 0x6f, 0xc2, 0x9b, 0x3d, 0x75, 0xee, 0x66, 0x9f, 0xa1, 0x02, 0xbc, 0x16, 0x7f, 0x09,
+ 0x73, 0xa6, 0x65, 0x2a, 0x51, 0xa1, 0xe7, 0xef, 0x4b, 0x45, 0xd3, 0x32, 0x5f, 0x86, 0xe4, 0xfa,
+ 0x76, 0xa6, 0x47, 0x13, 0x49, 0xda, 0x99, 0xef, 0x09, 0x30, 0xef, 0xbb, 0x4d, 0x09, 0x7b, 0xd0,
+ 0x1f, 0x40, 0xda, 0xb4, 0x8e, 0xce, 0xb3, 0x8a, 0x49, 0xf2, 0x93, 0x59, 0x2f, 0x5a, 0xa2, 0x24,
+ 0xeb, 0xfb, 0x6f, 0x52, 0x90, 0x7b, 0x5a, 0x4e, 0xb2, 0x96, 0x9f, 0xf0, 0x15, 0x72, 0xd6, 0xde,
+ 0x71, 0xbd, 0xdd, 0x7f, 0xdf, 0xd2, 0xd3, 0xf2, 0x06, 0x3e, 0xf1, 0x7a, 0x3b, 0xe1, 0x42, 0x2b,
+ 0x90, 0x73, 0xf7, 0x6d, 0xec, 0xec, 0x5b, 0x2d, 0xfd, 0x3c, 0x6e, 0x4e, 0xc0, 0x55, 0xc2, 0x30,
+ 0x49, 0xe5, 0x7a, 0xd1, 0x18, 0x42, 0x4c, 0x34, 0x06, 0x79, 0x8d, 0xef, 0x29, 0xa6, 0xce, 0xf3,
+ 0x9a, 0x90, 0x8b, 0x38, 0x29, 0x4e, 0x49, 0x2f, 0x00, 0x48, 0x75, 0x92, 0x6c, 0x92, 0x5f, 0x4f,
+ 0x43, 0x61, 0xbb, 0xeb, 0xec, 0x27, 0xdc, 0xfb, 0xca, 0x00, 0x9d, 0xae, 0x43, 0x21, 0xc8, 0xb1,
+ 0xc9, 0xeb, 0x3c, 0x22, 0xd0, 0xc3, 0xab, 0x34, 0xe3, 0x6b, 0x1c, 0x9b, 0xa8, 0xca, 0x85, 0x60,
+ 0x25, 0x88, 0x16, 0xb9, 0x31, 0x0c, 0xac, 0x36, 0x8e, 0xcd, 0x4d, 0xec, 0xa3, 0x54, 0x26, 0x09,
+ 0x13, 0x49, 0x9f, 0xc0, 0x34, 0x79, 0x50, 0x5c, 0xeb, 0x3c, 0xcd, 0x3c, 0x45, 0x78, 0x1a, 0x16,
+ 0x7a, 0x0c, 0x39, 0xc6, 0x4d, 0x66, 0xbf, 0x29, 0x3a, 0xfb, 0xc5, 0xd5, 0x85, 0xab, 0x91, 0xce,
+ 0x7b, 0x59, 0xca, 0x4a, 0xe6, 0xba, 0x0b, 0x30, 0xb9, 0x67, 0xd9, 0x9a, 0xf7, 0xbd, 0x97, 0x3d,
+ 0xb0, 0xf6, 0x5c, 0xcf, 0x64, 0xb3, 0x62, 0x6e, 0x3d, 0x93, 0xcd, 0x89, 0x20, 0xfd, 0xb6, 0x00,
+ 0x45, 0xbf, 0x21, 0x92, 0x9c, 0x10, 0xca, 0x11, 0x2d, 0x9e, 0xbf, 0x29, 0x88, 0x02, 0xa5, 0x7f,
+ 0x4b, 0x3d, 0x22, 0xcd, 0x3a, 0xa4, 0x2d, 0x93, 0x64, 0x4f, 0x79, 0xcc, 0x62, 0x81, 0x52, 0xe7,
+ 0x6d, 0x5d, 0x1a, 0x16, 0xf4, 0x00, 0x2e, 0x18, 0x6d, 0x62, 0xcf, 0x0d, 0xb7, 0x75, 0xc2, 0x61,
+ 0x9b, 0x8b, 0xbd, 0x0f, 0xcb, 0xf3, 0x41, 0x5a, 0xd9, 0x4b, 0x92, 0xfe, 0x1e, 0x5d, 0x00, 0x0f,
+ 0x6a, 0x92, 0xa4, 0xaa, 0x6b, 0x30, 0x6b, 0x33, 0xd1, 0xc4, 0xad, 0x39, 0xa7, 0xb6, 0x67, 0x7c,
+ 0x56, 0xa2, 0xf0, 0xdf, 0x4d, 0x41, 0xf1, 0x45, 0x17, 0xdb, 0x27, 0x5f, 0x27, 0x75, 0xdf, 0x86,
+ 0xe2, 0x91, 0x6a, 0xb8, 0xca, 0x9e, 0x65, 0x2b, 0xdd, 0x8e, 0xae, 0xba, 0x5e, 0x40, 0xca, 0x2c,
+ 0x21, 0x3f, 0xb1, 0xec, 0x1d, 0x4a, 0x44, 0x18, 0xd0, 0x81, 0x69, 0x1d, 0x99, 0x0a, 0x21, 0x53,
+ 0xa0, 0x7c, 0x6c, 0xf2, 0x55, 0xe9, 0xd5, 0x0f, 0xff, 0xd3, 0xe9, 0xe2, 0xa3, 0xb1, 0xc2, 0xcc,
+ 0x68, 0x48, 0x5d, 0xb7, 0x6b, 0xe8, 0x4b, 0x3b, 0x3b, 0xb5, 0x35, 0x59, 0xa4, 0x22, 0x5f, 0x31,
+ 0x89, 0x8d, 0x63, 0xd3, 0x91, 0xfe, 0x7e, 0x0a, 0xc4, 0x40, 0x47, 0x49, 0x36, 0x64, 0x05, 0xf2,
+ 0xaf, 0xbb, 0xd8, 0x36, 0xde, 0xa0, 0x19, 0x81, 0x33, 0x12, 0xb3, 0xf3, 0x39, 0xcc, 0x44, 0x34,
+ 0x90, 0xfe, 0x6a, 0x1a, 0xc8, 0x1f, 0x05, 0x95, 0x47, 0xf7, 0x61, 0xce, 0x3d, 0x36, 0x15, 0x16,
+ 0x60, 0xc8, 0x82, 0x52, 0xbc, 0x78, 0x89, 0xa2, 0x4b, 0xf4, 0x41, 0xe8, 0x34, 0x20, 0xc5, 0x91,
+ 0x7e, 0x5f, 0x00, 0x44, 0x15, 0x55, 0x63, 0x9f, 0x0d, 0xbe, 0x2e, 0xfd, 0xe9, 0x2e, 0x88, 0x34,
+ 0x64, 0x53, 0x31, 0xf6, 0x94, 0xb6, 0xe1, 0x38, 0x86, 0xd9, 0xe4, 0x1d, 0xaa, 0x40, 0xe9, 0xb5,
+ 0xbd, 0x4d, 0x46, 0x95, 0xfe, 0x1a, 0xcc, 0x47, 0x2a, 0x90, 0x64, 0x63, 0x5f, 0x87, 0x99, 0x3d,
+ 0xf6, 0x95, 0x96, 0x0a, 0xe7, 0x2b, 0x8e, 0x79, 0x4a, 0x63, 0xef, 0x93, 0xfe, 0x3c, 0x05, 0x17,
+ 0x64, 0xec, 0x58, 0xad, 0x43, 0x9c, 0xbc, 0x0a, 0xab, 0xc0, 0x3f, 0xe7, 0x28, 0x6f, 0xa4, 0xc9,
+ 0x1c, 0x63, 0x66, 0xd3, 0x5c, 0x74, 0xd9, 0xfe, 0xe6, 0xf0, 0x1e, 0xdb, 0xbf, 0x50, 0xcf, 0x97,
+ 0xfd, 0x32, 0x91, 0x65, 0x3f, 0x0b, 0x8a, 0x46, 0xd3, 0xb4, 0x88, 0x4d, 0x73, 0xf0, 0x6b, 0xb3,
+ 0xdb, 0xf6, 0xc0, 0xd0, 0xd2, 0xb0, 0x42, 0xd6, 0x18, 0x4b, 0x1d, 0xbf, 0xde, 0xea, 0xb6, 0xa9,
+ 0xef, 0xbc, 0x7a, 0x89, 0x94, 0xf7, 0xec, 0x74, 0xb1, 0x10, 0x49, 0x73, 0xe4, 0x82, 0xe1, 0x3f,
+ 0x13, 0xe9, 0xd2, 0xb7, 0xe0, 0x62, 0x8f, 0xb2, 0x93, 0xf4, 0x78, 0xfe, 0x55, 0x1a, 0xae, 0x44,
+ 0xc5, 0x27, 0x0d, 0x71, 0xbe, 0xee, 0x0d, 0x5a, 0x85, 0xd9, 0xb6, 0x61, 0xbe, 0xd9, 0xea, 0xe5,
+ 0x4c, 0xdb, 0x30, 0x83, 0x95, 0xe2, 0x98, 0xae, 0x31, 0xf5, 0x33, 0xed, 0x1a, 0x2a, 0x94, 0xe2,
+ 0xda, 0x2e, 0xc9, 0xfe, 0xf1, 0x5d, 0x01, 0x66, 0x92, 0x5e, 0x96, 0x7b, 0xb3, 0x40, 0x39, 0xa9,
+ 0x01, 0xb3, 0x3f, 0x83, 0x75, 0xbc, 0xdf, 0x15, 0x00, 0x35, 0xec, 0xae, 0x49, 0x40, 0xed, 0x33,
+ 0xab, 0x99, 0x64, 0x35, 0x2f, 0xc0, 0xa4, 0x61, 0xea, 0xf8, 0x98, 0x56, 0x33, 0x23, 0xb3, 0x87,
+ 0xc8, 0xd7, 0xc9, 0xf4, 0x58, 0x5f, 0x27, 0xa5, 0xcf, 0x61, 0x3e, 0x52, 0xc4, 0x24, 0xeb, 0xff,
+ 0xdf, 0x52, 0x30, 0xcf, 0x2b, 0x92, 0xf8, 0x0a, 0xe6, 0x37, 0x60, 0xb2, 0x45, 0x64, 0x0e, 0x69,
+ 0x67, 0xfa, 0x4e, 0xaf, 0x9d, 0x69, 0x66, 0xf4, 0x0b, 0x00, 0x1d, 0x1b, 0x1f, 0x2a, 0x8c, 0x35,
+ 0x3d, 0x16, 0x6b, 0x8e, 0x70, 0x50, 0x02, 0xfa, 0xbe, 0x00, 0x45, 0x32, 0xa0, 0x3b, 0xb6, 0xd5,
+ 0xb1, 0x1c, 0xe2, 0xb3, 0x38, 0xe3, 0xc1, 0x9c, 0x17, 0x67, 0xa7, 0x8b, 0xb3, 0x9b, 0x86, 0xb9,
+ 0xcd, 0x19, 0x1b, 0xf5, 0xb1, 0xf7, 0x00, 0x78, 0x3b, 0x21, 0x96, 0xca, 0x2d, 0x4b, 0x3b, 0x08,
+ 0xbe, 0xb7, 0x11, 0xcb, 0xe2, 0x8b, 0x73, 0xa4, 0x3f, 0x12, 0xe0, 0xc2, 0xcf, 0x6c, 0xb9, 0xf8,
+ 0xff, 0x87, 0xb2, 0xa5, 0x97, 0x20, 0xd2, 0x1f, 0x35, 0x73, 0xcf, 0x4a, 0x72, 0xe1, 0xfe, 0x37,
+ 0x04, 0x98, 0x0b, 0x09, 0x4e, 0xd2, 0xc1, 0x79, 0x23, 0x3d, 0x49, 0xbf, 0x44, 0x5c, 0x9e, 0xf0,
+ 0x28, 0x49, 0x72, 0x0c, 0xfe, 0xf3, 0x14, 0x5c, 0x2a, 0xb3, 0xcf, 0xdc, 0x5e, 0xdc, 0x47, 0x92,
+ 0x3d, 0x63, 0x01, 0xa6, 0x0f, 0xb1, 0xed, 0x18, 0x16, 0x9b, 0x7e, 0x67, 0x65, 0xef, 0x11, 0x95,
+ 0x20, 0xeb, 0x98, 0x6a, 0xc7, 0xd9, 0xb7, 0xbc, 0xef, 0x7b, 0xfe, 0xb3, 0x1f, 0xa3, 0x32, 0xf9,
+ 0xe6, 0x31, 0x2a, 0x53, 0xc3, 0x63, 0x54, 0xa6, 0xbf, 0x42, 0x8c, 0x0a, 0xff, 0x98, 0xf6, 0xef,
+ 0x04, 0xb8, 0xdc, 0xa7, 0xb9, 0x24, 0x7b, 0xcb, 0x77, 0x20, 0xaf, 0x71, 0xc1, 0xc4, 0x60, 0xb3,
+ 0x2f, 0x85, 0x35, 0x92, 0xed, 0x0d, 0x71, 0xcb, 0xd9, 0xe9, 0x22, 0x78, 0x45, 0xad, 0xad, 0x71,
+ 0xe5, 0x90, 0xdf, 0xba, 0xf4, 0xab, 0xb3, 0x50, 0xac, 0x1c, 0xb3, 0x55, 0xf2, 0x3a, 0x73, 0x13,
+ 0xd0, 0x13, 0xc8, 0x76, 0x6c, 0xeb, 0xd0, 0xf0, 0xaa, 0x51, 0x88, 0x04, 0x28, 0x78, 0xd5, 0xe8,
+ 0xe1, 0xda, 0xe6, 0x1c, 0xb2, 0xcf, 0x8b, 0x1a, 0x90, 0x7b, 0x66, 0x69, 0x6a, 0xeb, 0x89, 0xd1,
+ 0xf2, 0x7a, 0xfe, 0xfb, 0xa3, 0x05, 0x2d, 0xf9, 0x3c, 0xdb, 0xaa, 0xbb, 0xef, 0x35, 0x82, 0x4f,
+ 0x44, 0x35, 0xc8, 0x56, 0x5d, 0xb7, 0x43, 0x12, 0xb9, 0xed, 0xb8, 0x33, 0x86, 0x50, 0xc2, 0xe2,
+ 0x45, 0xc9, 0x7a, 0xec, 0xa8, 0x01, 0x73, 0x4f, 0xe9, 0x9e, 0xaf, 0x72, 0xcb, 0xea, 0xea, 0x65,
+ 0xcb, 0xdc, 0x33, 0x9a, 0xdc, 0x6e, 0xdf, 0x1e, 0x43, 0xe6, 0xd3, 0x72, 0x5d, 0xee, 0x17, 0x80,
+ 0x56, 0x20, 0x5b, 0x7f, 0xc4, 0x85, 0x31, 0xbf, 0xee, 0xd6, 0x18, 0xc2, 0xea, 0x8f, 0x64, 0x9f,
+ 0x0d, 0xad, 0x43, 0x7e, 0xe5, 0x8b, 0xae, 0x8d, 0xb9, 0x94, 0xa9, 0x81, 0xd1, 0x11, 0xbd, 0x52,
+ 0x28, 0x97, 0x1c, 0x66, 0x46, 0x75, 0x28, 0xbc, 0xb2, 0xec, 0x83, 0x96, 0xa5, 0x7a, 0x35, 0x9c,
+ 0xa6, 0xe2, 0x7e, 0x6e, 0x0c, 0x71, 0x1e, 0xa3, 0xdc, 0x23, 0x02, 0x7d, 0x0b, 0x8a, 0xa4, 0x31,
+ 0x1a, 0xea, 0x6e, 0xcb, 0x2b, 0x64, 0x96, 0x4a, 0x7d, 0x77, 0x0c, 0xa9, 0x3e, 0xa7, 0xb7, 0xf0,
+ 0xdf, 0x23, 0xaa, 0x24, 0xc3, 0x6c, 0xa4, 0x13, 0x20, 0x04, 0x99, 0x0e, 0x69, 0x6f, 0x81, 0xc6,
+ 0x2f, 0xd1, 0xdf, 0xe8, 0x3d, 0x98, 0x36, 0x2d, 0x1d, 0x7b, 0x23, 0x64, 0x76, 0xf5, 0xc2, 0xd9,
+ 0xe9, 0xe2, 0xd4, 0x96, 0xa5, 0x33, 0x8f, 0x86, 0xff, 0x92, 0xa7, 0x48, 0xa6, 0x9a, 0x5e, 0xba,
+ 0x06, 0x19, 0xd2, 0xee, 0xc4, 0x30, 0xed, 0xaa, 0x0e, 0xde, 0xb1, 0x0d, 0x2e, 0xcd, 0x7b, 0x2c,
+ 0xfd, 0xa3, 0x14, 0xa4, 0xea, 0x8f, 0x88, 0xcf, 0xbe, 0xdb, 0xd5, 0x0e, 0xb0, 0xcb, 0xd3, 0xf9,
+ 0x13, 0xf5, 0xe5, 0x6d, 0xbc, 0x67, 0x30, 0xd7, 0x2a, 0x27, 0xf3, 0x27, 0xf4, 0x0e, 0x80, 0xaa,
+ 0x69, 0xd8, 0x71, 0x14, 0x6f, 0x2f, 0x60, 0x4e, 0xce, 0x31, 0xca, 0x06, 0x3e, 0x21, 0x6c, 0x0e,
+ 0xd6, 0x6c, 0xec, 0x7a, 0xc1, 0x57, 0xec, 0x89, 0xb0, 0xb9, 0xb8, 0xdd, 0x51, 0x5c, 0xeb, 0x00,
+ 0x9b, 0xb4, 0x9f, 0xe4, 0x88, 0xa9, 0x69, 0x77, 0x1a, 0x84, 0x40, 0xac, 0x24, 0x36, 0xf5, 0xc0,
+ 0xa4, 0xe5, 0x64, 0xff, 0x99, 0x88, 0xb4, 0x71, 0xd3, 0xe0, 0xdb, 0xe5, 0x72, 0x32, 0x7f, 0x22,
+ 0x5a, 0x52, 0xbb, 0xee, 0x3e, 0x6d, 0x89, 0x9c, 0x4c, 0x7f, 0xa3, 0xdb, 0x50, 0x64, 0xf1, 0x9a,
+ 0x0a, 0x36, 0x35, 0x85, 0x1a, 0xd7, 0x1c, 0x4d, 0x9e, 0x65, 0xe4, 0x8a, 0xa9, 0x11, 0x53, 0x8a,
+ 0x1e, 0x01, 0x27, 0x28, 0x07, 0x6d, 0x87, 0xe8, 0x14, 0x48, 0xae, 0xd5, 0xe2, 0xd9, 0xe9, 0x62,
+ 0xbe, 0x4e, 0x13, 0x36, 0x36, 0xeb, 0xb5, 0x35, 0x39, 0xcf, 0x72, 0x6d, 0xb4, 0x9d, 0x9a, 0x5e,
+ 0xfa, 0x4d, 0x01, 0xd2, 0x4f, 0xcb, 0xf5, 0x73, 0xab, 0xcc, 0x2b, 0x68, 0x3a, 0x54, 0xd0, 0x3b,
+ 0x50, 0xdc, 0x35, 0x5a, 0x2d, 0xc3, 0x6c, 0x12, 0x2f, 0xea, 0x3b, 0x58, 0xf3, 0x14, 0x56, 0xe0,
+ 0xe4, 0x6d, 0x46, 0x45, 0xd7, 0x20, 0xaf, 0xd9, 0x58, 0xc7, 0xa6, 0x6b, 0xa8, 0x2d, 0x87, 0x6b,
+ 0x2e, 0x4c, 0x2a, 0xfd, 0x8a, 0x00, 0x93, 0x74, 0x04, 0xa0, 0xb7, 0x21, 0xa7, 0x59, 0xa6, 0xab,
+ 0x1a, 0x26, 0x37, 0x65, 0x39, 0x39, 0x20, 0x0c, 0x2c, 0xde, 0x75, 0x98, 0x51, 0x35, 0xcd, 0xea,
+ 0x9a, 0xae, 0x62, 0xaa, 0x6d, 0xcc, 0x8b, 0x99, 0xe7, 0xb4, 0x2d, 0xb5, 0x8d, 0xd1, 0x22, 0x78,
+ 0x8f, 0xfe, 0x16, 0xcf, 0x9c, 0x0c, 0x9c, 0xb4, 0x81, 0x4f, 0x4a, 0x7f, 0x20, 0x40, 0xd6, 0x1b,
+ 0x33, 0xa4, 0x18, 0x4d, 0x6c, 0xb2, 0xa0, 0x72, 0xaf, 0x18, 0x3e, 0xa1, 0x77, 0xaa, 0xcc, 0x05,
+ 0x53, 0xe5, 0x05, 0x98, 0x74, 0xc9, 0xb0, 0xe0, 0x25, 0x60, 0x0f, 0x74, 0x3d, 0xbb, 0xa5, 0x36,
+ 0xd9, 0x72, 0x5e, 0x4e, 0x66, 0x0f, 0xa4, 0x32, 0x3c, 0xec, 0x97, 0x69, 0x84, 0x3f, 0x91, 0x92,
+ 0xb2, 0xe0, 0xd4, 0x5d, 0xdc, 0x34, 0x4c, 0xda, 0x97, 0xd2, 0x32, 0x50, 0xd2, 0x2a, 0xa1, 0xa0,
+ 0xb7, 0x20, 0xc7, 0x32, 0x60, 0x53, 0xa7, 0x1d, 0x2a, 0x2d, 0x67, 0x29, 0xa1, 0x62, 0xea, 0x25,
+ 0x0c, 0x39, 0x7f, 0x70, 0x92, 0x66, 0xeb, 0x3a, 0xbe, 0x22, 0xe9, 0x6f, 0xf4, 0x3e, 0x5c, 0x78,
+ 0xdd, 0x55, 0x5b, 0xc6, 0x1e, 0x5d, 0xa9, 0xa3, 0x51, 0xf7, 0x54, 0x67, 0xac, 0x26, 0xc8, 0x4f,
+ 0xa3, 0x12, 0xa8, 0xea, 0xbc, 0xb1, 0x9c, 0x0e, 0xc6, 0xb2, 0xf4, 0x7b, 0x02, 0xcc, 0xb1, 0xc8,
+ 0x23, 0x16, 0x30, 0x9b, 0x9c, 0x1f, 0xf2, 0x31, 0xe4, 0x74, 0xd5, 0x55, 0xd9, 0xa6, 0xd5, 0xd4,
+ 0xd0, 0x4d, 0xab, 0xfe, 0x26, 0x0a, 0xd5, 0x55, 0xe9, 0xc6, 0x55, 0x04, 0x19, 0xf2, 0x9b, 0xed,
+ 0xef, 0x95, 0xe9, 0x6f, 0xe9, 0x33, 0x40, 0xe1, 0x82, 0x26, 0xe9, 0x91, 0xdd, 0x83, 0x8b, 0x44,
+ 0xd7, 0x15, 0x53, 0xb3, 0x4f, 0x3a, 0xae, 0x61, 0x99, 0xcf, 0xe9, 0x5f, 0x07, 0x89, 0xa1, 0x0f,
+ 0x5b, 0xf4, 0x7b, 0x96, 0xf4, 0xa3, 0x29, 0x98, 0xad, 0x1c, 0x77, 0x2c, 0x3b, 0xd1, 0x65, 0xb0,
+ 0x55, 0x98, 0xe6, 0x2b, 0x05, 0x43, 0xbe, 0x5d, 0xf7, 0x18, 0x73, 0xef, 0xc3, 0x3d, 0x67, 0x44,
+ 0xab, 0x00, 0x2c, 0xa8, 0x95, 0x06, 0x2e, 0xa5, 0xcf, 0xf1, 0xa9, 0x8d, 0xb2, 0xd1, 0x0d, 0x1c,
+ 0x5b, 0x90, 0x6f, 0x1f, 0x6a, 0x9a, 0xb2, 0x67, 0xb4, 0x5c, 0x1e, 0x1b, 0x18, 0x1f, 0xc6, 0xbe,
+ 0xf9, 0xb2, 0x5c, 0x7e, 0x42, 0x33, 0xb1, 0x30, 0xbd, 0xe0, 0x59, 0x06, 0x22, 0x81, 0xfd, 0x46,
+ 0xef, 0x02, 0xdf, 0x4c, 0xa4, 0x38, 0xde, 0xbe, 0xc1, 0xd5, 0xd9, 0xb3, 0xd3, 0xc5, 0x9c, 0x4c,
+ 0xa9, 0xf5, 0x7a, 0x43, 0xce, 0xb1, 0x0c, 0x75, 0xc7, 0x45, 0x37, 0x60, 0xd6, 0x6a, 0x1b, 0xae,
+ 0xe2, 0x39, 0x49, 0xdc, 0xa3, 0x9c, 0x21, 0x44, 0xcf, 0x89, 0x3a, 0xcf, 0x1e, 0x93, 0xe9, 0xb1,
+ 0xf7, 0x98, 0xa0, 0xbf, 0x29, 0xc0, 0x25, 0xae, 0x48, 0x65, 0x97, 0xc6, 0xe1, 0xab, 0x2d, 0xc3,
+ 0x3d, 0x51, 0x0e, 0x0e, 0x17, 0xb2, 0xd4, 0x6f, 0xfd, 0xf9, 0xd8, 0x06, 0x09, 0xf5, 0x83, 0x25,
+ 0xaf, 0x59, 0x4e, 0x9e, 0x71, 0xe6, 0x8d, 0xc3, 0x8a, 0xe9, 0xda, 0x27, 0xab, 0x97, 0xcf, 0x4e,
+ 0x17, 0xe7, 0xfb, 0x53, 0x5f, 0xca, 0xf3, 0x4e, 0x3f, 0x0b, 0xaa, 0x02, 0x60, 0xbf, 0x1f, 0xd2,
+ 0x19, 0x23, 0xde, 0xff, 0x88, 0xed, 0xb0, 0x72, 0x88, 0x17, 0xdd, 0x05, 0x91, 0xef, 0xe9, 0xd9,
+ 0x33, 0x5a, 0x58, 0x71, 0x8c, 0x2f, 0x30, 0x9d, 0x5b, 0xd2, 0x72, 0x81, 0xd1, 0x89, 0x88, 0xba,
+ 0xf1, 0x05, 0x2e, 0x7d, 0x07, 0x16, 0x06, 0x95, 0x3e, 0x3c, 0x04, 0x72, 0xec, 0x93, 0xee, 0x47,
+ 0xd1, 0xf5, 0x9c, 0x31, 0xba, 0x2a, 0x5f, 0xd3, 0xf9, 0x38, 0xf5, 0x91, 0x20, 0xfd, 0x83, 0x14,
+ 0xcc, 0xae, 0x76, 0x5b, 0x07, 0xcf, 0x3b, 0xf5, 0x6e, 0xbb, 0xad, 0xda, 0x27, 0xc4, 0x0c, 0x32,
+ 0x43, 0x41, 0x0a, 0x28, 0x30, 0x33, 0x48, 0x2d, 0x81, 0xf1, 0x05, 0x26, 0x93, 0x53, 0x28, 0x5c,
+ 0x86, 0xef, 0x33, 0xa0, 0x75, 0x08, 0xc8, 0x74, 0x2b, 0xc0, 0x47, 0xb0, 0x10, 0xca, 0x48, 0x17,
+ 0x5f, 0x14, 0x6c, 0xba, 0xb6, 0x81, 0xd9, 0x02, 0x62, 0x5a, 0x0e, 0xc5, 0xf4, 0xd4, 0x48, 0x72,
+ 0x85, 0xa5, 0xa2, 0x06, 0xcc, 0x90, 0x8c, 0x27, 0x0a, 0x9d, 0x42, 0xbc, 0x05, 0xde, 0x07, 0x31,
+ 0xd5, 0x8a, 0x94, 0x7b, 0x89, 0xea, 0xa7, 0x4c, 0x79, 0xe8, 0x4f, 0x39, 0x8f, 0x03, 0x4a, 0xe9,
+ 0x53, 0x10, 0x7b, 0x33, 0x84, 0x75, 0x99, 0x61, 0xba, 0xbc, 0x10, 0xd6, 0x65, 0x3a, 0xa4, 0xa7,
+ 0xf5, 0x4c, 0x36, 0x23, 0x4e, 0x4a, 0x7f, 0x96, 0x86, 0x82, 0xd7, 0xcd, 0x92, 0x04, 0x3a, 0xab,
+ 0x30, 0x49, 0x3a, 0x85, 0x17, 0x81, 0x72, 0x7b, 0x48, 0xef, 0xe6, 0x91, 0xed, 0xa4, 0xb3, 0x78,
+ 0x20, 0x99, 0xb2, 0x26, 0x61, 0x70, 0x4a, 0xbf, 0x92, 0x82, 0x0c, 0xc5, 0x16, 0x0f, 0x20, 0x43,
+ 0x27, 0x0a, 0x61, 0x9c, 0x89, 0x82, 0x66, 0xf5, 0xa7, 0xb3, 0x54, 0xc8, 0x35, 0x25, 0x3e, 0xdf,
+ 0xbe, 0xfa, 0xc1, 0x83, 0x87, 0xd4, 0xd8, 0xcc, 0xc8, 0xfc, 0x09, 0xad, 0xd2, 0xd0, 0x28, 0xcb,
+ 0x76, 0xb1, 0xce, 0x7d, 0xfa, 0x6b, 0xa3, 0xda, 0xd7, 0x9b, 0x94, 0x3c, 0x3e, 0x74, 0x05, 0xd2,
+ 0xc4, 0x8a, 0x4d, 0xb3, 0x28, 0x87, 0xb3, 0xd3, 0xc5, 0x34, 0xb1, 0x5f, 0x84, 0x86, 0x96, 0x21,
+ 0x1f, 0x35, 0x19, 0xc4, 0x83, 0xa3, 0x86, 0x31, 0x34, 0xdc, 0xa1, 0xe5, 0x0f, 0x2d, 0x86, 0x67,
+ 0x79, 0x1b, 0xff, 0x8f, 0x0c, 0xcc, 0xd6, 0xda, 0x49, 0x4f, 0x29, 0x2b, 0xd1, 0x16, 0x8e, 0x03,
+ 0x42, 0x91, 0x97, 0xc6, 0x34, 0x70, 0x64, 0x06, 0x4f, 0x9f, 0x6f, 0x06, 0xaf, 0x11, 0x4f, 0x99,
+ 0x1f, 0x3c, 0x91, 0x1e, 0x80, 0x79, 0xa2, 0xef, 0xa7, 0x7e, 0x8a, 0x4c, 0x78, 0x82, 0xbd, 0x1e,
+ 0x34, 0x52, 0xe5, 0x53, 0xea, 0x90, 0xb3, 0x5e, 0x36, 0x35, 0x7e, 0x2f, 0x9b, 0xc6, 0xa6, 0x4e,
+ 0x27, 0xb5, 0xa8, 0x45, 0x9d, 0x7e, 0x73, 0x8b, 0x5a, 0x72, 0x79, 0x67, 0xfd, 0x18, 0xd2, 0xba,
+ 0xe1, 0x35, 0xce, 0xf8, 0x53, 0x35, 0x61, 0x1a, 0xd1, 0x6b, 0x33, 0xe1, 0x5e, 0xcb, 0x7a, 0x49,
+ 0xa9, 0x06, 0x10, 0xe8, 0x06, 0x5d, 0x83, 0x29, 0xab, 0xa5, 0x7b, 0x9b, 0x5d, 0x66, 0x57, 0x73,
+ 0x67, 0xa7, 0x8b, 0x93, 0xcf, 0x5b, 0x7a, 0x6d, 0x4d, 0x9e, 0xb4, 0x5a, 0x7a, 0x4d, 0xa7, 0xa7,
+ 0x7e, 0xe0, 0x23, 0xc5, 0x8f, 0x84, 0x9b, 0x91, 0xa7, 0x4d, 0x7c, 0xb4, 0x86, 0x1d, 0x8d, 0x77,
+ 0xb8, 0xdf, 0x11, 0xa0, 0xe0, 0xe9, 0x3e, 0x59, 0xa3, 0x92, 0x35, 0xda, 0x7c, 0x90, 0xa5, 0xcf,
+ 0x37, 0xc8, 0x3c, 0x3e, 0xbe, 0xb1, 0xf8, 0xd7, 0x04, 0x1e, 0xdb, 0x5c, 0xd7, 0x54, 0x97, 0x38,
+ 0x15, 0x09, 0x0e, 0x8c, 0x7b, 0x20, 0xda, 0xaa, 0xa9, 0x5b, 0x6d, 0xe3, 0x0b, 0xcc, 0x16, 0x42,
+ 0x1d, 0xfe, 0xd9, 0xb3, 0xe8, 0xd3, 0xe9, 0xaa, 0x9f, 0x23, 0xfd, 0x41, 0x8a, 0xc7, 0x41, 0xfb,
+ 0xc5, 0x48, 0x52, 0x5d, 0xdf, 0x86, 0xb9, 0xf0, 0xd4, 0xc6, 0x42, 0x2d, 0xd9, 0x68, 0x7d, 0x2f,
+ 0x46, 0x5e, 0x5c, 0x41, 0x58, 0x3c, 0xa3, 0x17, 0x5c, 0x1f, 0x9a, 0x11, 0xa9, 0x30, 0x54, 0x86,
+ 0x3c, 0xff, 0xf8, 0x60, 0xee, 0x59, 0x5e, 0xa0, 0xd8, 0xdb, 0x83, 0xc2, 0x22, 0x6b, 0xe6, 0x9e,
+ 0xe5, 0x7d, 0xc8, 0xb7, 0x3d, 0x82, 0x53, 0xfa, 0x45, 0x98, 0xa4, 0xc9, 0x6f, 0x60, 0xa2, 0x79,
+ 0x6b, 0xfe, 0x69, 0x0a, 0x6e, 0xd2, 0xd2, 0xbf, 0xc4, 0xb6, 0xb1, 0x77, 0xb2, 0x6d, 0x5b, 0x2e,
+ 0xd6, 0x5c, 0xac, 0x07, 0x2b, 0xe7, 0x89, 0xda, 0xbd, 0x5c, 0xc7, 0x7b, 0xc1, 0xb9, 0x02, 0xce,
+ 0x7c, 0x2e, 0xb4, 0x01, 0x45, 0x1e, 0x5a, 0xa0, 0xb6, 0x8c, 0x43, 0xac, 0xa8, 0xee, 0x79, 0x66,
+ 0xb7, 0x59, 0xc6, 0xbb, 0x42, 0x58, 0x57, 0x5c, 0xa4, 0x43, 0x8e, 0x0b, 0x33, 0x74, 0x7e, 0x20,
+ 0xd1, 0xd3, 0xaf, 0xb6, 0xa0, 0x98, 0x65, 0xf1, 0x0d, 0xb5, 0x35, 0x39, 0xcb, 0x24, 0xd7, 0x74,
+ 0xe9, 0x3f, 0x0a, 0x70, 0x6b, 0x84, 0x8a, 0x93, 0xec, 0xba, 0x25, 0xc8, 0x1e, 0x92, 0x17, 0x19,
+ 0x5c, 0xc7, 0x59, 0xd9, 0x7f, 0x46, 0x9b, 0x30, 0xbb, 0xa7, 0x1a, 0xad, 0xa0, 0x4b, 0x0f, 0x8e,
+ 0x4f, 0x8c, 0x8f, 0xc6, 0x9d, 0x61, 0xec, 0xac, 0x0f, 0x4b, 0xbf, 0x95, 0x82, 0xb9, 0x15, 0x5d,
+ 0xaf, 0xd7, 0xb9, 0x0d, 0x4c, 0xae, 0xa7, 0x78, 0x20, 0x33, 0x15, 0x80, 0x4c, 0xf4, 0x1e, 0x20,
+ 0xdd, 0x70, 0xd8, 0xc1, 0x27, 0xce, 0xbe, 0xaa, 0x5b, 0x47, 0x41, 0x5c, 0xc6, 0x9c, 0x97, 0x52,
+ 0xf7, 0x12, 0x50, 0x1d, 0x28, 0xda, 0x51, 0x1c, 0x57, 0xf5, 0xbf, 0x3b, 0xdd, 0x1a, 0x6b, 0x4b,
+ 0x19, 0x83, 0x41, 0xfe, 0xa3, 0x9c, 0x23, 0x72, 0xe8, 0x4f, 0xe2, 0xb7, 0x1b, 0xa4, 0xea, 0xae,
+ 0xa2, 0x3a, 0xde, 0xfe, 0x21, 0x76, 0xe4, 0x4a, 0x81, 0xd1, 0x57, 0x1c, 0xb6, 0x2d, 0x88, 0x6d,
+ 0x78, 0x08, 0x54, 0x93, 0x24, 0x24, 0xfe, 0xbb, 0x02, 0x14, 0x64, 0xbc, 0x67, 0x63, 0x27, 0xd1,
+ 0x45, 0x81, 0x27, 0x30, 0x63, 0x33, 0xa9, 0xca, 0x9e, 0x6d, 0xb5, 0xcf, 0x33, 0xae, 0xf2, 0x9c,
+ 0xf1, 0x89, 0x6d, 0xb5, 0xb9, 0x61, 0x79, 0x09, 0x45, 0xbf, 0x8c, 0x49, 0x56, 0xfe, 0xf7, 0xe8,
+ 0x76, 0x69, 0x26, 0x38, 0xe9, 0x00, 0x89, 0x64, 0x35, 0x40, 0x3f, 0x54, 0x85, 0x0b, 0x9a, 0xa4,
+ 0x1a, 0xfe, 0xab, 0x00, 0x85, 0x7a, 0x77, 0x97, 0x9d, 0xd9, 0x95, 0x9c, 0x06, 0x2a, 0x90, 0x6b,
+ 0xe1, 0x3d, 0x57, 0x79, 0xa3, 0x50, 0xfd, 0x2c, 0x61, 0xa5, 0x1b, 0x15, 0x9e, 0x02, 0xd8, 0x74,
+ 0x8b, 0x1d, 0x95, 0x93, 0x3e, 0xa7, 0x9c, 0x1c, 0xe5, 0x25, 0x64, 0xe9, 0x47, 0x69, 0x28, 0xfa,
+ 0xd5, 0x4c, 0xd2, 0x4a, 0xbe, 0x8a, 0x58, 0x87, 0xf4, 0x79, 0xac, 0xc3, 0x1c, 0x8f, 0x09, 0x89,
+ 0xb7, 0x10, 0x4b, 0x30, 0x4f, 0x1d, 0x17, 0x45, 0xed, 0x74, 0x5a, 0x86, 0x07, 0x77, 0xa9, 0xfd,
+ 0xc9, 0xc8, 0x73, 0x34, 0x69, 0x85, 0xa5, 0x50, 0xa0, 0x8b, 0x7e, 0x5d, 0x80, 0x99, 0x3d, 0x1b,
+ 0xe3, 0x2f, 0xb0, 0x42, 0xa1, 0xd7, 0x78, 0x41, 0x2f, 0x6b, 0xa4, 0x0c, 0x5f, 0xf9, 0xa3, 0x78,
+ 0x9e, 0xbd, 0xb8, 0x4e, 0xde, 0x8b, 0xb6, 0x40, 0xd4, 0x5a, 0xec, 0x33, 0xbd, 0x1f, 0x80, 0x73,
+ 0x0e, 0x97, 0xbe, 0xc8, 0x98, 0x7b, 0x76, 0x0f, 0x4a, 0xaf, 0x60, 0x8e, 0x36, 0x72, 0xd2, 0x7b,
+ 0x95, 0xa5, 0x1f, 0xa6, 0x00, 0x85, 0x25, 0xff, 0xec, 0x3a, 0x47, 0x2a, 0xb9, 0xce, 0xf1, 0x2e,
+ 0x20, 0x16, 0x86, 0xe9, 0x28, 0x1d, 0x6c, 0x2b, 0x0e, 0xd6, 0x2c, 0x7e, 0xdc, 0x94, 0x20, 0x8b,
+ 0x3c, 0x65, 0x1b, 0xdb, 0x75, 0x4a, 0x47, 0x2b, 0x00, 0x81, 0x8b, 0xc8, 0x67, 0xb0, 0x71, 0x3c,
+ 0xc4, 0x9c, 0xef, 0x21, 0x4a, 0xdf, 0x13, 0xa0, 0xb0, 0x69, 0x34, 0x6d, 0x35, 0xd1, 0xd3, 0x94,
+ 0xd0, 0xc7, 0xd1, 0xc5, 0xf9, 0xfc, 0xc3, 0x52, 0x5c, 0xe0, 0x10, 0xcb, 0xe1, 0x41, 0x3e, 0xce,
+ 0x40, 0x26, 0x06, 0xbf, 0x44, 0x49, 0x5a, 0xc4, 0x7f, 0x5f, 0x82, 0x19, 0x5e, 0xee, 0x1d, 0xd3,
+ 0xb0, 0x4c, 0xf4, 0x00, 0xd2, 0x4d, 0xfe, 0xf1, 0x25, 0x1f, 0xbb, 0x50, 0x1a, 0x9c, 0x55, 0x58,
+ 0x9d, 0x90, 0x49, 0x5e, 0xc2, 0xd2, 0xe9, 0xba, 0x31, 0xae, 0x69, 0x10, 0x4b, 0x1f, 0x66, 0xe9,
+ 0x74, 0x5d, 0x54, 0x87, 0xa2, 0x16, 0x1c, 0x90, 0xa6, 0x10, 0xf6, 0xf4, 0x40, 0x18, 0x1b, 0x7b,
+ 0x54, 0x5d, 0x75, 0x42, 0x2e, 0x68, 0x91, 0x04, 0x54, 0x0e, 0x9f, 0xcb, 0x95, 0xe9, 0x0b, 0xd4,
+ 0x0b, 0x76, 0x81, 0x47, 0xcf, 0x04, 0xab, 0x4e, 0x84, 0x8e, 0xef, 0x42, 0x1f, 0xc3, 0x94, 0x4e,
+ 0x4f, 0x80, 0xe2, 0x26, 0x25, 0xae, 0xa1, 0x23, 0x07, 0x6d, 0x55, 0x27, 0x64, 0xce, 0x81, 0xd6,
+ 0x61, 0x86, 0xfd, 0x62, 0x8e, 0x22, 0x37, 0x04, 0xb7, 0x06, 0x4b, 0x08, 0x4d, 0xc5, 0xd5, 0x09,
+ 0x39, 0xaf, 0x07, 0x54, 0xf4, 0x0d, 0xc8, 0x38, 0x9a, 0xea, 0xa1, 0xfb, 0xab, 0x03, 0x0e, 0x5e,
+ 0x09, 0x98, 0x69, 0x6e, 0xf4, 0x98, 0x1d, 0x15, 0xea, 0x1e, 0x7b, 0x0b, 0xad, 0x71, 0xc5, 0x8f,
+ 0x6c, 0xf0, 0x27, 0xc5, 0xc7, 0x94, 0x80, 0x9e, 0x42, 0x5e, 0x25, 0x1e, 0xb7, 0x42, 0xb7, 0xc8,
+ 0xd2, 0x95, 0xd5, 0xf8, 0xf0, 0x86, 0xbe, 0x2d, 0xcd, 0x55, 0x7a, 0x8a, 0x80, 0x47, 0x0c, 0x04,
+ 0xb5, 0xb1, 0xdd, 0xc4, 0x0b, 0xf9, 0xe1, 0x82, 0xc2, 0xe1, 0x79, 0xbe, 0x20, 0x4a, 0x24, 0x9e,
+ 0xb7, 0xbf, 0x3f, 0x9d, 0x56, 0x6a, 0x66, 0xe0, 0x07, 0xf5, 0x98, 0x9d, 0x57, 0xd5, 0x09, 0x79,
+ 0x66, 0x3f, 0x44, 0x46, 0x4b, 0x90, 0x6a, 0x6a, 0x0b, 0xb3, 0x03, 0x4d, 0x82, 0xbf, 0xbb, 0xa8,
+ 0x3a, 0x21, 0xa7, 0x9a, 0x1a, 0xfa, 0x14, 0xb2, 0x6c, 0xab, 0xc8, 0xb1, 0xb9, 0x50, 0x18, 0x38,
+ 0xc6, 0xa2, 0x1b, 0x6e, 0xaa, 0x13, 0x32, 0xdd, 0x9d, 0x42, 0xde, 0xb7, 0x0d, 0x05, 0x9b, 0xc5,
+ 0x37, 0x7a, 0xd1, 0xc8, 0xe2, 0xc0, 0x20, 0x83, 0xb8, 0x80, 0xe4, 0x2a, 0xc5, 0x5e, 0x21, 0x3a,
+ 0xfa, 0x36, 0x5c, 0x88, 0x4a, 0xe4, 0x3d, 0x6d, 0x6e, 0xe0, 0x07, 0xf3, 0x81, 0xc1, 0xb1, 0xd5,
+ 0x09, 0x19, 0xd9, 0x7d, 0x89, 0xe8, 0x43, 0x98, 0x64, 0xad, 0x86, 0xa8, 0xc8, 0xb8, 0xb8, 0x99,
+ 0x9e, 0x06, 0x63, 0xf9, 0x49, 0xe7, 0x77, 0x79, 0x90, 0x9f, 0xd2, 0xb2, 0x9a, 0x0b, 0xf3, 0x03,
+ 0x3b, 0x7f, 0x7f, 0xb8, 0x22, 0xe9, 0xfc, 0x6e, 0x40, 0x25, 0xed, 0x6e, 0xb3, 0x14, 0x1e, 0xd8,
+ 0x75, 0x61, 0x60, 0xbb, 0xc7, 0xc4, 0xfe, 0x55, 0xe9, 0xf6, 0x8b, 0x80, 0x4c, 0x8a, 0x66, 0xb3,
+ 0xb3, 0x82, 0x14, 0x3a, 0xa6, 0x2e, 0x0e, 0x2c, 0x5a, 0xff, 0x61, 0x4a, 0x55, 0xea, 0xa5, 0xfa,
+ 0x54, 0xf4, 0x12, 0x44, 0x7e, 0xa2, 0x47, 0xf0, 0x55, 0xe7, 0x12, 0x95, 0x77, 0x2f, 0xd6, 0x74,
+ 0xc5, 0x45, 0x45, 0x55, 0xc9, 0xc4, 0x1f, 0x4d, 0x41, 0x9f, 0xc1, 0x1c, 0x95, 0xa7, 0x68, 0xc1,
+ 0x21, 0x2c, 0x0b, 0x0b, 0x7d, 0x47, 0x7a, 0x0c, 0x3e, 0xaf, 0xc5, 0x93, 0x2c, 0x6a, 0x3d, 0x49,
+ 0xa4, 0x1b, 0x1b, 0xa6, 0xe1, 0x52, 0x2b, 0x5b, 0x1a, 0xd8, 0x8d, 0xa3, 0x07, 0x4a, 0x92, 0x6e,
+ 0x6c, 0x30, 0x0a, 0xe9, 0xc6, 0x2e, 0x8f, 0xfa, 0xe3, 0xcd, 0xf1, 0xf6, 0xc0, 0x6e, 0x1c, 0x17,
+ 0x1e, 0x48, 0xba, 0xb1, 0x1b, 0xa6, 0x93, 0x6e, 0xcc, 0x0c, 0x44, 0x8f, 0xdc, 0x77, 0x06, 0x76,
+ 0xe3, 0x81, 0x5b, 0xd5, 0x49, 0x37, 0x56, 0xfb, 0x12, 0xd1, 0x1a, 0x00, 0x73, 0x28, 0xa9, 0x17,
+ 0x70, 0x75, 0xe0, 0x64, 0xd0, 0x1b, 0xfd, 0x47, 0x26, 0x83, 0x96, 0x47, 0x23, 0x86, 0x8c, 0xc2,
+ 0x55, 0x85, 0x7e, 0xc4, 0x5e, 0x58, 0x1c, 0x68, 0xc8, 0xfa, 0x3e, 0x38, 0x13, 0x43, 0x76, 0xe4,
+ 0x13, 0xc9, 0xac, 0xc2, 0x56, 0xdd, 0x17, 0xae, 0x0d, 0x36, 0xcb, 0xe1, 0x8f, 0x6f, 0xd4, 0x2c,
+ 0x53, 0x02, 0x5a, 0x81, 0x1c, 0x71, 0x72, 0x4e, 0xa8, 0x19, 0xba, 0x3e, 0x10, 0x15, 0xf4, 0xec,
+ 0x2f, 0xaa, 0x4e, 0xc8, 0xd9, 0xd7, 0x9c, 0x44, 0x5e, 0xcf, 0xd6, 0x23, 0x17, 0xa4, 0x81, 0xaf,
+ 0x8f, 0xac, 0x5d, 0x93, 0xd7, 0x33, 0x0e, 0xa4, 0xc1, 0x45, 0xd6, 0x56, 0x7c, 0xd7, 0xb8, 0xcd,
+ 0x37, 0x3a, 0x2f, 0xdc, 0xa0, 0xa2, 0x06, 0x2e, 0xec, 0xc5, 0x6e, 0x66, 0xaf, 0x4e, 0xc8, 0xf3,
+ 0x6a, 0x7f, 0x2a, 0x19, 0xf0, 0x7c, 0xea, 0x61, 0xcb, 0x81, 0x0b, 0x37, 0x07, 0x0e, 0xf8, 0x98,
+ 0x55, 0x54, 0x32, 0xe0, 0xd5, 0x10, 0x99, 0x4d, 0x40, 0xba, 0xe2, 0x38, 0x2c, 0xe4, 0xe1, 0xd6,
+ 0x90, 0x09, 0xa8, 0x67, 0x1d, 0x86, 0x4d, 0x40, 0x7a, 0x9d, 0x71, 0x12, 0x41, 0x5a, 0x0b, 0xab,
+ 0x36, 0x37, 0xb3, 0xb7, 0x07, 0x0a, 0xea, 0x3b, 0xbb, 0x91, 0x08, 0xd2, 0x7c, 0x22, 0x71, 0x78,
+ 0x6c, 0xef, 0x28, 0x20, 0xee, 0x21, 0xdf, 0x19, 0xe8, 0xf0, 0xc4, 0x9e, 0x55, 0x44, 0x1c, 0x1e,
+ 0x3b, 0x92, 0x80, 0x7e, 0x01, 0xa6, 0x39, 0x80, 0x5e, 0xb8, 0x3b, 0xc4, 0x05, 0x0c, 0xaf, 0x79,
+ 0x90, 0x71, 0xcd, 0x79, 0x98, 0x95, 0x65, 0xc0, 0x9d, 0x55, 0xef, 0xde, 0x10, 0x2b, 0xdb, 0xb7,
+ 0x76, 0xc0, 0xac, 0x6c, 0x40, 0x26, 0x56, 0x96, 0xf5, 0x53, 0x3e, 0xd7, 0xdd, 0x1f, 0x68, 0x65,
+ 0xfb, 0x77, 0x2f, 0x11, 0x2b, 0xfb, 0x3a, 0xa0, 0x92, 0x9a, 0x39, 0x0c, 0xc0, 0x2e, 0xfc, 0xdc,
+ 0xc0, 0x9a, 0x45, 0x91, 0x3c, 0xa9, 0x19, 0xe7, 0x21, 0xcd, 0xc6, 0x30, 0x00, 0xd3, 0xf4, 0xbb,
+ 0x83, 0x8f, 0x66, 0xe8, 0x45, 0x59, 0x55, 0x6f, 0xa9, 0x98, 0x69, 0xd8, 0x37, 0x54, 0x36, 0xdf,
+ 0x37, 0xce, 0x35, 0xf5, 0xde, 0x70, 0x43, 0x15, 0xb7, 0xdf, 0xde, 0x37, 0x54, 0x91, 0x44, 0x5a,
+ 0x54, 0xb6, 0x55, 0x90, 0x8e, 0xef, 0xa5, 0x21, 0xa7, 0x48, 0xf4, 0x6c, 0xd8, 0xa4, 0x45, 0xf5,
+ 0x89, 0xc1, 0x10, 0xea, 0xb2, 0x23, 0x4e, 0x16, 0x96, 0x87, 0x0f, 0xa1, 0xe8, 0x21, 0x2b, 0xfe,
+ 0x10, 0xe2, 0x64, 0x7f, 0xce, 0xf4, 0x3c, 0x8c, 0xf7, 0x87, 0xcf, 0x99, 0xbd, 0xae, 0x05, 0x9b,
+ 0x33, 0xb9, 0x4f, 0xf1, 0x37, 0x04, 0xb8, 0xc6, 0xca, 0x46, 0xd7, 0x54, 0x4f, 0x14, 0x7f, 0x65,
+ 0x3a, 0x84, 0x9a, 0x1f, 0xd0, 0x17, 0x7c, 0x38, 0xa8, 0xb8, 0x23, 0x56, 0xda, 0xab, 0x13, 0xf2,
+ 0x3b, 0xea, 0xb0, 0x7c, 0xa4, 0x4b, 0xb5, 0x19, 0x82, 0x5a, 0x78, 0x38, 0xb0, 0x4b, 0x45, 0x51,
+ 0x1f, 0xe9, 0x52, 0x9c, 0x67, 0x75, 0x9a, 0x7f, 0xd7, 0xf6, 0xb7, 0xf9, 0x16, 0x45, 0x71, 0x3d,
+ 0x93, 0xbd, 0x2c, 0x2e, 0xac, 0x67, 0xb2, 0x57, 0xc4, 0xd2, 0x7a, 0x26, 0xfb, 0x96, 0xf8, 0xb6,
+ 0xf4, 0x0f, 0x4b, 0x30, 0xeb, 0x81, 0x2e, 0x06, 0xa8, 0x1e, 0x86, 0x01, 0xd5, 0xd5, 0x41, 0x80,
+ 0x8a, 0xc3, 0x34, 0x8e, 0xa8, 0x1e, 0x86, 0x11, 0xd5, 0xd5, 0x41, 0x88, 0x2a, 0xe0, 0x21, 0x90,
+ 0xaa, 0x31, 0x08, 0x52, 0xdd, 0x1b, 0x03, 0x52, 0xf9, 0xa2, 0x7a, 0x31, 0xd5, 0x5a, 0x3f, 0xa6,
+ 0xba, 0x39, 0x1c, 0x53, 0xf9, 0xa2, 0x42, 0xa0, 0xea, 0x71, 0x0f, 0xa8, 0xba, 0x3e, 0x04, 0x54,
+ 0xf9, 0xfc, 0x1e, 0xaa, 0xda, 0x88, 0x45, 0x55, 0xb7, 0x47, 0xa1, 0x2a, 0x5f, 0x4e, 0x04, 0x56,
+ 0x7d, 0x10, 0x81, 0x55, 0x8b, 0x03, 0x61, 0x95, 0xcf, 0xcd, 0x70, 0xd5, 0x27, 0xbd, 0xb8, 0xea,
+ 0xfa, 0x10, 0x5c, 0x15, 0xd4, 0x80, 0x03, 0xab, 0x6a, 0x1c, 0xb0, 0xba, 0x35, 0x02, 0x58, 0xf9,
+ 0x52, 0xc2, 0xc8, 0xaa, 0x1a, 0x87, 0xac, 0x6e, 0x8d, 0x40, 0x56, 0x3d, 0x92, 0x18, 0xb4, 0xda,
+ 0x8a, 0x87, 0x56, 0x77, 0x46, 0x42, 0x2b, 0x5f, 0x5a, 0x14, 0x5b, 0x2d, 0x87, 0xb0, 0xd5, 0x3b,
+ 0x03, 0xb0, 0x95, 0xcf, 0x4a, 0xc0, 0xd5, 0x37, 0xfb, 0xc0, 0x95, 0x34, 0x0c, 0x5c, 0xf9, 0xbc,
+ 0x3e, 0xba, 0x7a, 0x31, 0x00, 0x5d, 0xdd, 0x1d, 0x8d, 0xae, 0x7c, 0x61, 0x3d, 0xf0, 0x4a, 0x1d,
+ 0x0a, 0xaf, 0xde, 0x1b, 0x13, 0x5e, 0xf9, 0xd2, 0xe3, 0xf0, 0xd5, 0x47, 0x51, 0x7c, 0x75, 0x6d,
+ 0x30, 0xbe, 0xf2, 0xc5, 0x70, 0x80, 0xb5, 0x11, 0x0b, 0xb0, 0x6e, 0x8f, 0x02, 0x58, 0xc1, 0x38,
+ 0x08, 0x23, 0xac, 0xad, 0x78, 0x84, 0x75, 0x67, 0x24, 0xc2, 0x0a, 0x9a, 0x3f, 0x02, 0xb1, 0x36,
+ 0x62, 0x21, 0xd6, 0xed, 0x51, 0x10, 0x2b, 0x28, 0x5c, 0x18, 0x63, 0xbd, 0x1a, 0x88, 0xb1, 0xee,
+ 0x8f, 0x83, 0xb1, 0x7c, 0xa1, 0x7d, 0x20, 0xeb, 0xf3, 0xc1, 0x20, 0xeb, 0xe7, 0xce, 0x71, 0x28,
+ 0x66, 0x2c, 0xca, 0xfa, 0x66, 0x1f, 0xca, 0x92, 0x86, 0xa1, 0xac, 0xa0, 0x3f, 0x7b, 0x30, 0x4b,
+ 0x1d, 0x0a, 0x8a, 0xde, 0x1b, 0x13, 0x14, 0x05, 0x9d, 0x2f, 0x06, 0x15, 0x55, 0x62, 0x50, 0xd1,
+ 0xcd, 0xe1, 0xa8, 0x28, 0x30, 0xe7, 0x01, 0x2c, 0xaa, 0xc6, 0xc1, 0xa2, 0x5b, 0x23, 0x60, 0x51,
+ 0x60, 0x85, 0x42, 0xb8, 0xe8, 0x71, 0x0f, 0x2e, 0xba, 0x3e, 0x32, 0x6c, 0x2b, 0x04, 0x8c, 0x56,
+ 0xfb, 0x81, 0xd1, 0x8d, 0xa1, 0xc0, 0xc8, 0x97, 0x10, 0x20, 0xa3, 0xc7, 0x3d, 0xc8, 0xe8, 0xfa,
+ 0x10, 0x64, 0x14, 0x14, 0x80, 0x43, 0x23, 0x7d, 0x38, 0x34, 0x5a, 0x1a, 0x17, 0x1a, 0xf9, 0x82,
+ 0x63, 0xb1, 0xd1, 0x56, 0x3c, 0x36, 0xba, 0x33, 0x66, 0x44, 0x45, 0x1f, 0x38, 0xaa, 0xc6, 0x81,
+ 0xa3, 0x5b, 0x23, 0xc0, 0x51, 0x78, 0x0e, 0xf1, 0xd1, 0x51, 0x35, 0x0e, 0x1d, 0xdd, 0x1a, 0x81,
+ 0x8e, 0x02, 0x49, 0x21, 0x78, 0xd4, 0x18, 0x04, 0x8f, 0xee, 0x8d, 0x01, 0x8f, 0x02, 0xe7, 0xa5,
+ 0x07, 0x1f, 0x7d, 0xda, 0x8b, 0x8f, 0xa4, 0x61, 0xf8, 0x28, 0x18, 0x91, 0x1e, 0x40, 0xda, 0x8a,
+ 0x07, 0x48, 0x77, 0x46, 0x02, 0xa4, 0xb0, 0x91, 0x0c, 0x21, 0xa4, 0x8d, 0x58, 0x84, 0x74, 0x7b,
+ 0x14, 0x42, 0x0a, 0x8c, 0x64, 0x18, 0x22, 0x7d, 0xda, 0x0b, 0x91, 0xa4, 0x61, 0x10, 0x29, 0xa8,
+ 0x9c, 0x87, 0x91, 0xaa, 0x71, 0x18, 0xe9, 0xd6, 0x08, 0x8c, 0x14, 0x34, 0x5e, 0x08, 0x24, 0xa9,
+ 0x43, 0x41, 0xd2, 0x7b, 0x63, 0x82, 0xa4, 0x1e, 0xc3, 0x15, 0x45, 0x49, 0xd5, 0x38, 0x94, 0x74,
+ 0x6b, 0x04, 0x4a, 0x0a, 0x15, 0x36, 0x80, 0x49, 0x5b, 0xf1, 0x30, 0xe9, 0xce, 0x48, 0x98, 0xd4,
+ 0x33, 0x9a, 0x3c, 0x9c, 0xb4, 0x11, 0x8b, 0x93, 0x6e, 0x8f, 0xc2, 0x49, 0x3d, 0x13, 0x1f, 0x77,
+ 0x0e, 0x7e, 0x75, 0x7c, 0xa0, 0xf4, 0xd1, 0xf9, 0x81, 0x92, 0xff, 0xce, 0x11, 0x48, 0xe9, 0xd3,
+ 0x5e, 0xa4, 0x24, 0x0d, 0x43, 0x4a, 0x41, 0xcf, 0x3a, 0x1f, 0x54, 0x5a, 0xcf, 0x64, 0xdf, 0x16,
+ 0xdf, 0x91, 0xfe, 0x7c, 0x0a, 0xa6, 0xaa, 0x7e, 0xa0, 0x53, 0x50, 0x4b, 0xe1, 0x4d, 0x4e, 0xd6,
+ 0x42, 0x6b, 0x64, 0xc4, 0x53, 0xbb, 0x39, 0xfa, 0x3c, 0xc6, 0xfe, 0x13, 0x03, 0x39, 0xeb, 0x1b,
+ 0x6c, 0x71, 0x47, 0x1f, 0xc0, 0x6c, 0xd7, 0xc1, 0xb6, 0xd2, 0xb1, 0x0d, 0xcb, 0x36, 0x5c, 0xb6,
+ 0x8d, 0x47, 0x58, 0x15, 0xbf, 0x3c, 0x5d, 0x9c, 0xd9, 0x71, 0xb0, 0xbd, 0xcd, 0xe9, 0xf2, 0x4c,
+ 0x37, 0xf4, 0xe4, 0xdd, 0x9d, 0x36, 0x39, 0xfe, 0xdd, 0x69, 0x2f, 0x40, 0xb4, 0xb1, 0xaa, 0x47,
+ 0x3c, 0x18, 0x76, 0x8a, 0x55, 0x7c, 0x9f, 0xa3, 0xdb, 0xec, 0xbc, 0x9c, 0xf4, 0x34, 0xab, 0xa2,
+ 0x1d, 0x25, 0xa2, 0x07, 0x70, 0xb1, 0xad, 0x1e, 0xd3, 0xa0, 0x58, 0xc5, 0x73, 0x0a, 0x69, 0xa0,
+ 0x2b, 0xbb, 0xf0, 0x0c, 0xb5, 0xd5, 0x63, 0x7a, 0x11, 0x1b, 0x4b, 0xa2, 0xb7, 0xa8, 0xdc, 0x82,
+ 0x82, 0x6e, 0x38, 0xae, 0x61, 0x6a, 0x2e, 0x3f, 0x20, 0x99, 0x1d, 0x2e, 0x3c, 0xeb, 0x51, 0xd9,
+ 0x29, 0xc8, 0x65, 0x28, 0x36, 0x55, 0x17, 0x1f, 0xa9, 0x27, 0x8a, 0xb7, 0xbf, 0x2e, 0x4f, 0xcf,
+ 0x02, 0x7d, 0xeb, 0xec, 0x74, 0x71, 0xf6, 0x29, 0x4b, 0xea, 0xdb, 0x66, 0x37, 0xdb, 0x0c, 0x25,
+ 0xe8, 0xe8, 0x0e, 0x14, 0x55, 0xe7, 0xc4, 0xd4, 0x68, 0x95, 0xb1, 0xe9, 0x74, 0x1d, 0x0a, 0x33,
+ 0xb2, 0x72, 0x81, 0x92, 0xcb, 0x1e, 0x15, 0x5d, 0x87, 0x19, 0xbe, 0x3d, 0x80, 0xdd, 0xd6, 0x54,
+ 0xa4, 0xc5, 0xe7, 0xd7, 0x80, 0xb0, 0x0b, 0x9b, 0x1e, 0x43, 0x89, 0x5f, 0x6a, 0x70, 0xa4, 0xda,
+ 0xba, 0x42, 0x35, 0x19, 0xf4, 0x39, 0x91, 0x8a, 0xbd, 0xcc, 0x2e, 0x31, 0x20, 0x19, 0x88, 0xfa,
+ 0x82, 0x71, 0xd1, 0x80, 0x39, 0xad, 0x65, 0xf8, 0xa8, 0x80, 0x39, 0x51, 0x73, 0x03, 0x47, 0x48,
+ 0x99, 0xe6, 0xed, 0xfd, 0xcc, 0x5c, 0xd4, 0xa2, 0x64, 0x54, 0x07, 0x7a, 0x12, 0x90, 0xd2, 0xb1,
+ 0x5a, 0x86, 0x76, 0x42, 0x61, 0x41, 0xf4, 0x88, 0xf6, 0xa1, 0x17, 0x25, 0xbc, 0x52, 0x0d, 0x77,
+ 0x9b, 0x72, 0xca, 0x70, 0xe4, 0xff, 0x66, 0xc7, 0x2b, 0xaf, 0x67, 0xb2, 0x20, 0xe6, 0xd7, 0x33,
+ 0xd9, 0x19, 0x71, 0x76, 0x3d, 0x93, 0x2d, 0x88, 0x45, 0xe9, 0x37, 0x05, 0x98, 0x89, 0xec, 0x8b,
+ 0x7a, 0xdc, 0xf3, 0x11, 0xf9, 0x4a, 0x3c, 0xfe, 0x1b, 0x14, 0x99, 0x98, 0xe5, 0xfd, 0xc5, 0x0b,
+ 0xf3, 0x5c, 0x1c, 0x8c, 0x1f, 0xe8, 0x6a, 0x88, 0x17, 0xf3, 0xe2, 0xb1, 0x7d, 0x9c, 0xf9, 0xfe,
+ 0x0f, 0x16, 0x27, 0xa4, 0xbf, 0xc8, 0xc0, 0x6c, 0x74, 0x17, 0x54, 0xad, 0xa7, 0x5c, 0x71, 0xf6,
+ 0x39, 0xc2, 0xb1, 0x34, 0xe4, 0x26, 0x98, 0x5c, 0x70, 0x99, 0x02, 0x2b, 0xe6, 0xb5, 0x21, 0x9f,
+ 0xca, 0xc3, 0xe5, 0x0c, 0x18, 0x4b, 0xff, 0x21, 0xed, 0xdb, 0xa9, 0x25, 0x98, 0xa4, 0x07, 0x1a,
+ 0xf1, 0xa2, 0x2d, 0xf4, 0xb6, 0x15, 0xf1, 0x59, 0x49, 0xba, 0xcc, 0xb2, 0x11, 0xbb, 0xd6, 0x78,
+ 0xa3, 0x13, 0x03, 0x83, 0xae, 0x77, 0xfe, 0x3b, 0x16, 0xbb, 0xec, 0xc4, 0xc8, 0xff, 0x87, 0x71,
+ 0x31, 0xe4, 0x7d, 0xe8, 0x97, 0xa1, 0xa8, 0x59, 0xad, 0x16, 0x9b, 0xb3, 0x98, 0x65, 0xe8, 0x3f,
+ 0x43, 0x86, 0x16, 0x81, 0x5f, 0xab, 0xb9, 0xe4, 0x5f, 0xaf, 0xb9, 0x24, 0xf3, 0xeb, 0x35, 0x43,
+ 0x41, 0xb7, 0x05, 0x5f, 0x98, 0x67, 0x50, 0x22, 0xf1, 0xbf, 0xd3, 0x6f, 0x12, 0xff, 0xcb, 0x62,
+ 0xc6, 0x79, 0xcf, 0xfb, 0x63, 0x81, 0x07, 0xc4, 0x3c, 0xb3, 0xac, 0x83, 0xae, 0x1f, 0xb7, 0x5b,
+ 0x0a, 0x9f, 0xff, 0x98, 0xfd, 0xf2, 0x74, 0x31, 0x23, 0xfb, 0x07, 0x40, 0xc6, 0x59, 0xe0, 0xd4,
+ 0x57, 0xb3, 0xc0, 0xd7, 0x61, 0xa6, 0x63, 0xe3, 0x3d, 0xec, 0x6a, 0xfb, 0x8a, 0xd9, 0x6d, 0xf3,
+ 0xed, 0x3d, 0x79, 0x8f, 0xb6, 0xd5, 0x6d, 0xa3, 0x7b, 0x20, 0xfa, 0x59, 0x38, 0x56, 0xf6, 0x0e,
+ 0x08, 0xf3, 0xe8, 0x1c, 0x59, 0x4b, 0xff, 0x4b, 0x80, 0xf9, 0x48, 0x9d, 0xf8, 0x98, 0x5a, 0x87,
+ 0xbc, 0xee, 0xcf, 0x79, 0xce, 0x82, 0x70, 0xce, 0x28, 0xd6, 0x30, 0x33, 0x52, 0xe0, 0x92, 0xf7,
+ 0x5a, 0x7a, 0x01, 0x41, 0x20, 0x36, 0x75, 0x4e, 0xb1, 0x17, 0x03, 0x39, 0x6b, 0xa1, 0x17, 0xf8,
+ 0x83, 0x2c, 0x3d, 0xd6, 0x20, 0x93, 0x7e, 0x47, 0x00, 0x91, 0xbe, 0xe0, 0x09, 0xc6, 0x7a, 0x22,
+ 0xd6, 0xcd, 0x8b, 0x0e, 0x4f, 0x8d, 0xbf, 0x81, 0x27, 0x72, 0x69, 0x4a, 0x3a, 0x7a, 0x69, 0x8a,
+ 0xf4, 0x03, 0x01, 0x0a, 0x7e, 0x09, 0xd9, 0x45, 0x85, 0x43, 0x8e, 0x19, 0x7d, 0xb3, 0xcb, 0xf8,
+ 0xbc, 0xe3, 0x50, 0xc6, 0xba, 0x3b, 0x31, 0x7c, 0x1c, 0x0a, 0xbb, 0x44, 0xee, 0x6f, 0x7b, 0x3d,
+ 0x87, 0x14, 0xb1, 0x1c, 0x1c, 0x7b, 0xf1, 0x06, 0x7b, 0x99, 0x64, 0x7a, 0xc7, 0xab, 0xd5, 0x3a,
+ 0x64, 0x27, 0xd8, 0x8c, 0x65, 0xf6, 0x10, 0x0f, 0x03, 0x03, 0xbe, 0xaa, 0xa6, 0x37, 0xea, 0xf4,
+ 0xf6, 0x57, 0xf6, 0xdb, 0x91, 0x9e, 0x84, 0x14, 0x48, 0x1b, 0x9f, 0x68, 0x69, 0x2c, 0x53, 0xec,
+ 0x69, 0x89, 0xf5, 0x95, 0x3f, 0x0c, 0xb7, 0x44, 0xe5, 0x90, 0xa0, 0xa9, 0x47, 0x90, 0x3e, 0x54,
+ 0x5b, 0xc3, 0x22, 0xa9, 0x22, 0x2d, 0x27, 0x93, 0xdc, 0xe8, 0x49, 0xe4, 0xb4, 0x90, 0xd4, 0x60,
+ 0xcf, 0xbf, 0x5f, 0xa5, 0x91, 0x53, 0x45, 0x3e, 0x8c, 0xf6, 0xf5, 0xa1, 0xaf, 0x0f, 0x77, 0xfa,
+ 0x8f, 0x33, 0x3f, 0xfe, 0xc1, 0xa2, 0x20, 0x7d, 0x02, 0x48, 0xc6, 0x0e, 0x76, 0x5f, 0x74, 0x2d,
+ 0x3b, 0x38, 0x79, 0xe5, 0x76, 0xcf, 0x2d, 0x32, 0x93, 0xab, 0xf9, 0xb3, 0xb8, 0xc3, 0x99, 0x2e,
+ 0xc2, 0x7c, 0x84, 0x9b, 0x19, 0x0b, 0xe9, 0x43, 0xb8, 0xf2, 0xd4, 0x72, 0x1c, 0xa3, 0x43, 0x20,
+ 0x24, 0x1d, 0x95, 0x64, 0x6a, 0xf1, 0xcd, 0x63, 0xb6, 0x43, 0x17, 0x13, 0x4c, 0x66, 0x46, 0x72,
+ 0xb2, 0xff, 0x2c, 0xfd, 0x48, 0x80, 0xcb, 0xfd, 0x9c, 0x4c, 0xcb, 0x71, 0x5b, 0x2f, 0xa7, 0x35,
+ 0x2b, 0x38, 0xa9, 0x6f, 0x74, 0x6f, 0xf5, 0xb2, 0x13, 0xb7, 0x90, 0xbf, 0x53, 0x69, 0xab, 0xd4,
+ 0x7c, 0xf0, 0x6d, 0xe0, 0x05, 0x4e, 0xde, 0x64, 0xd4, 0xc0, 0x92, 0x64, 0xc6, 0xb3, 0x24, 0x0d,
+ 0x28, 0xae, 0x5b, 0x86, 0x49, 0xbc, 0x4f, 0xaf, 0xbe, 0x2b, 0x50, 0xd8, 0x35, 0x4c, 0xd5, 0x3e,
+ 0x51, 0xbc, 0x00, 0x3e, 0x61, 0x54, 0x00, 0x9f, 0x3c, 0xcb, 0x38, 0xf8, 0xa3, 0xf4, 0x13, 0x01,
+ 0xc4, 0x40, 0x2c, 0xb7, 0xc8, 0xef, 0x02, 0x68, 0xad, 0xae, 0xe3, 0x62, 0xdb, 0x6b, 0xa5, 0x19,
+ 0x16, 0x46, 0x5f, 0x66, 0xd4, 0xda, 0x9a, 0x9c, 0xe3, 0x19, 0x6a, 0x3a, 0xba, 0x11, 0x3d, 0xa5,
+ 0x62, 0x72, 0x15, 0xce, 0xfa, 0xce, 0xa6, 0x20, 0xcd, 0xee, 0xb8, 0x96, 0xed, 0x63, 0x17, 0xde,
+ 0xec, 0xde, 0xb9, 0xfb, 0x74, 0x73, 0x35, 0xc9, 0xb7, 0x02, 0x05, 0xe2, 0x2e, 0x1c, 0x62, 0xbf,
+ 0x4a, 0x99, 0xd1, 0x55, 0x62, 0x1c, 0x5e, 0x95, 0xfe, 0xa5, 0x00, 0xc5, 0x32, 0x6b, 0x0d, 0xbf,
+ 0x85, 0x87, 0x58, 0xb4, 0x35, 0xc8, 0xba, 0xc7, 0xa6, 0xd2, 0xc6, 0xfe, 0x5d, 0x35, 0xe7, 0x38,
+ 0x46, 0x6f, 0xda, 0x65, 0x8f, 0xf4, 0x3a, 0x43, 0x7e, 0x97, 0x36, 0x1f, 0x2e, 0x57, 0x96, 0xd8,
+ 0x65, 0xdb, 0x4b, 0xde, 0x65, 0xdb, 0x4b, 0x6b, 0x3c, 0x03, 0x33, 0xea, 0xdf, 0xff, 0x2f, 0x8b,
+ 0x82, 0xec, 0x33, 0xb1, 0x79, 0xff, 0x7e, 0x9d, 0xf4, 0xfa, 0xbe, 0x99, 0x19, 0x15, 0x00, 0x42,
+ 0x97, 0x10, 0xf1, 0xeb, 0x9b, 0x57, 0xd6, 0x94, 0x9d, 0xad, 0xf2, 0xf3, 0xcd, 0xcd, 0x5a, 0xa3,
+ 0x51, 0x59, 0x13, 0x05, 0x24, 0xc2, 0x4c, 0xe4, 0x0a, 0xa3, 0x14, 0xbb, 0xd0, 0xf9, 0xfe, 0x5f,
+ 0x01, 0x08, 0x6e, 0x43, 0x23, 0xb2, 0x36, 0x2a, 0x9f, 0x29, 0x2f, 0x57, 0x9e, 0xed, 0x54, 0xea,
+ 0xe2, 0x04, 0x42, 0x50, 0x58, 0x5d, 0x69, 0x94, 0xab, 0x8a, 0x5c, 0xa9, 0x6f, 0x3f, 0xdf, 0xaa,
+ 0x57, 0xbc, 0x8b, 0xa0, 0xef, 0xaf, 0xc1, 0x4c, 0xf8, 0x2c, 0x22, 0x34, 0x0f, 0xc5, 0x72, 0xb5,
+ 0x52, 0xde, 0x50, 0x5e, 0xd6, 0x56, 0x94, 0x17, 0x3b, 0x95, 0x9d, 0x8a, 0x38, 0x41, 0x8b, 0x46,
+ 0x89, 0x4f, 0x76, 0x9e, 0x3d, 0x13, 0x05, 0x54, 0x84, 0x3c, 0x7b, 0xa6, 0xd7, 0x1d, 0x89, 0xa9,
+ 0xfb, 0x9b, 0x90, 0x0f, 0x1d, 0x5a, 0x4c, 0x5e, 0xb7, 0xbd, 0x53, 0xaf, 0x2a, 0x8d, 0xda, 0x66,
+ 0xa5, 0xde, 0x58, 0xd9, 0xdc, 0x66, 0x32, 0x28, 0x6d, 0x65, 0xf5, 0xb9, 0xdc, 0x10, 0x05, 0xff,
+ 0xb9, 0xf1, 0x7c, 0xa7, 0x5c, 0xf5, 0xaa, 0x21, 0x65, 0xb2, 0x69, 0x31, 0x7d, 0xff, 0xaf, 0x0b,
+ 0x70, 0x79, 0xc0, 0xb9, 0x3c, 0x28, 0x0f, 0xd3, 0x3b, 0x26, 0x3d, 0xc1, 0x55, 0x9c, 0x40, 0xb3,
+ 0xa1, 0xa3, 0x79, 0x44, 0x01, 0x65, 0xd9, 0xe1, 0x28, 0x62, 0x0a, 0x4d, 0x41, 0xaa, 0xfe, 0x48,
+ 0x4c, 0x93, 0x92, 0x86, 0x4e, 0xb6, 0x11, 0x33, 0x28, 0xc7, 0xcf, 0xd4, 0x10, 0x27, 0xd1, 0x4c,
+ 0x70, 0xb4, 0x85, 0x38, 0x45, 0x44, 0xf9, 0x47, 0x44, 0x88, 0xd3, 0xf7, 0xaf, 0x43, 0x68, 0x1b,
+ 0x3e, 0x02, 0x98, 0x7a, 0xa6, 0xba, 0xd8, 0x71, 0xc5, 0x09, 0x34, 0x0d, 0xe9, 0x95, 0x56, 0x4b,
+ 0x14, 0x1e, 0xfe, 0x8b, 0x0c, 0x64, 0xbd, 0x6b, 0x7d, 0xd0, 0x33, 0x98, 0x64, 0xcb, 0xca, 0x8b,
+ 0x83, 0xd1, 0x02, 0x1d, 0xd0, 0xa5, 0x6b, 0xa3, 0xe0, 0x84, 0x34, 0x81, 0xfe, 0x2a, 0xe4, 0x43,
+ 0x5e, 0x14, 0x1a, 0xb8, 0x34, 0x16, 0xf1, 0x1c, 0x4b, 0xb7, 0x47, 0x65, 0xf3, 0xe5, 0xbf, 0x82,
+ 0x9c, 0x6f, 0xd5, 0xd1, 0x8d, 0x61, 0x36, 0xdf, 0x93, 0x3d, 0x7c, 0x62, 0x20, 0xe3, 0x4f, 0x9a,
+ 0x78, 0x5f, 0x40, 0x36, 0xa0, 0x7e, 0x03, 0x8c, 0xe2, 0x82, 0x15, 0x06, 0x5a, 0xf8, 0xd2, 0xfd,
+ 0xb1, 0x72, 0x07, 0xef, 0x24, 0xca, 0x0a, 0x66, 0x91, 0x78, 0x65, 0xf5, 0xcd, 0x51, 0xf1, 0xca,
+ 0x8a, 0x99, 0x8c, 0x26, 0xd0, 0x0b, 0xc8, 0x10, 0xeb, 0x89, 0xe2, 0xfc, 0xca, 0x1e, 0x6b, 0x5d,
+ 0xba, 0x31, 0x34, 0x8f, 0x27, 0x72, 0xf5, 0xde, 0x8f, 0xff, 0xec, 0xea, 0xc4, 0x8f, 0xcf, 0xae,
+ 0x0a, 0x3f, 0x39, 0xbb, 0x2a, 0xfc, 0xc9, 0xd9, 0x55, 0xe1, 0x4f, 0xcf, 0xae, 0x0a, 0xdf, 0xfb,
+ 0xe9, 0xd5, 0x89, 0x9f, 0xfc, 0xf4, 0xea, 0xc4, 0x9f, 0xfc, 0xf4, 0xea, 0xc4, 0xe7, 0xd3, 0x9c,
+ 0x7b, 0x77, 0x8a, 0x9a, 0x96, 0x47, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0xd5, 0xdb, 0x79, 0x80,
+ 0x02, 0x81, 0x00, 0x00,
}
diff --git a/pkg/roachpb/api.proto b/pkg/roachpb/api.proto
index 9b7aca1b399f..3a9f4dfd4177 100644
--- a/pkg/roachpb/api.proto
+++ b/pkg/roachpb/api.proto
@@ -1665,6 +1665,21 @@ message SubsumeResponse {
// mark for the keys previously owned by the subsumed range.
util.hlc.Timestamp freeze_start = 5 [(gogoproto.nullable) = false,
(gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp"];
+
+ // closed_timestamp is the range's closed timestamp at the moment of the
+ // subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ util.hlc.Timestamp closed_timestamp = 6 [(gogoproto.nullable) = false];
}
// RangeStatsRequest is the argument to the RangeStats() method. It requests the
diff --git a/pkg/roachpb/batch.go b/pkg/roachpb/batch.go
index ed1bf4d6a188..37ce483aa908 100644
--- a/pkg/roachpb/batch.go
+++ b/pkg/roachpb/batch.go
@@ -56,7 +56,7 @@ func (ba *BatchRequest) SetActiveTimestamp(nowFn func() hlc.Timestamp) error {
// provisional commit timestamp evolves.
//
// Note that writes will be performed at the provisional commit timestamp,
- // txn.Timestamp, regardless of the batch timestamp.
+ // txn.WriteTimestamp, regardless of the batch timestamp.
ba.Timestamp = txn.ReadTimestamp
} else {
// When not transactional, allow empty timestamp and use nowFn instead
diff --git a/pkg/roachpb/data.pb.go b/pkg/roachpb/data.pb.go
index c2ac7657473e..9e2b1c658a2f 100644
--- a/pkg/roachpb/data.pb.go
+++ b/pkg/roachpb/data.pb.go
@@ -98,7 +98,7 @@ func (x ValueType) String() string {
return proto.EnumName(ValueType_name, int32(x))
}
func (ValueType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{0}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{0}
}
// ReplicaChangeType is a parameter of ChangeReplicasTrigger.
@@ -128,7 +128,7 @@ func (x ReplicaChangeType) String() string {
return proto.EnumName(ReplicaChangeType_name, int32(x))
}
func (ReplicaChangeType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{1}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{1}
}
// TransactionStatus specifies possible states for a transaction.
@@ -180,7 +180,7 @@ func (x TransactionStatus) String() string {
return proto.EnumName(TransactionStatus_name, int32(x))
}
func (TransactionStatus) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{2}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{2}
}
// RangeClosedTimestampPolicy represents the policy used by the leaseholder of a
@@ -216,7 +216,7 @@ func (x RangeClosedTimestampPolicy) String() string {
return proto.EnumName(RangeClosedTimestampPolicy_name, int32(x))
}
func (RangeClosedTimestampPolicy) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{3}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{3}
}
// Span is a key range with an inclusive start Key and an exclusive end Key.
@@ -233,7 +233,7 @@ type Span struct {
func (m *Span) Reset() { *m = Span{} }
func (*Span) ProtoMessage() {}
func (*Span) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{0}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{0}
}
func (m *Span) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -285,7 +285,7 @@ func (m *Value) Reset() { *m = Value{} }
func (m *Value) String() string { return proto.CompactTextString(m) }
func (*Value) ProtoMessage() {}
func (*Value) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{1}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{1}
}
func (m *Value) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -321,7 +321,7 @@ func (m *KeyValue) Reset() { *m = KeyValue{} }
func (m *KeyValue) String() string { return proto.CompactTextString(m) }
func (*KeyValue) ProtoMessage() {}
func (*KeyValue) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{2}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{2}
}
func (m *KeyValue) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -359,7 +359,7 @@ func (m *StoreIdent) Reset() { *m = StoreIdent{} }
func (m *StoreIdent) String() string { return proto.CompactTextString(m) }
func (*StoreIdent) ProtoMessage() {}
func (*StoreIdent) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{3}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{3}
}
func (m *StoreIdent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -399,7 +399,7 @@ func (m *SplitTrigger) Reset() { *m = SplitTrigger{} }
func (m *SplitTrigger) String() string { return proto.CompactTextString(m) }
func (*SplitTrigger) ProtoMessage() {}
func (*SplitTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{4}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{4}
}
func (m *SplitTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -436,18 +436,32 @@ type MergeTrigger struct {
RightDesc RangeDescriptor `protobuf:"bytes,2,opt,name=right_desc,json=rightDesc,proto3" json:"right_desc"`
RightMVCCStats enginepb.MVCCStats `protobuf:"bytes,4,opt,name=right_mvcc_stats,json=rightMvccStats,proto3" json:"right_mvcc_stats"`
// FreezeStart is a timestamp that is guaranteed to be greater than the
- // timestamps at which any requests were serviced by the responding replica
+ // timestamps at which any requests were serviced by the right-hand side range
// before it stopped responding to requests altogether (in anticipation of
// being subsumed). It is suitable for use as the timestamp cache's low water
// mark for the keys previously owned by the subsumed range.
FreezeStart github_com_cockroachdb_cockroach_pkg_util_hlc.ClockTimestamp `protobuf:"bytes,5,opt,name=freeze_start,json=freezeStart,proto3,casttype=github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp" json:"freeze_start"`
+ // right_closed_timestamp is the closed timestamp of the RHS at the moment of
+ // the subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the right_read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ RightClosedTimestamp hlc.Timestamp `protobuf:"bytes,6,opt,name=right_closed_timestamp,json=rightClosedTimestamp,proto3" json:"right_closed_timestamp"`
}
func (m *MergeTrigger) Reset() { *m = MergeTrigger{} }
func (m *MergeTrigger) String() string { return proto.CompactTextString(m) }
func (*MergeTrigger) ProtoMessage() {}
func (*MergeTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{5}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{5}
}
func (m *MergeTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -517,7 +531,7 @@ type ChangeReplicasTrigger struct {
func (m *ChangeReplicasTrigger) Reset() { *m = ChangeReplicasTrigger{} }
func (*ChangeReplicasTrigger) ProtoMessage() {}
func (*ChangeReplicasTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{6}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{6}
}
func (m *ChangeReplicasTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -559,7 +573,7 @@ func (m *ModifiedSpanTrigger) Reset() { *m = ModifiedSpanTrigger{} }
func (m *ModifiedSpanTrigger) String() string { return proto.CompactTextString(m) }
func (*ModifiedSpanTrigger) ProtoMessage() {}
func (*ModifiedSpanTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{7}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{7}
}
func (m *ModifiedSpanTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -605,7 +619,7 @@ func (m *StickyBitTrigger) Reset() { *m = StickyBitTrigger{} }
func (m *StickyBitTrigger) String() string { return proto.CompactTextString(m) }
func (*StickyBitTrigger) ProtoMessage() {}
func (*StickyBitTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{8}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{8}
}
func (m *StickyBitTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -644,7 +658,7 @@ func (m *InternalCommitTrigger) Reset() { *m = InternalCommitTrigger{} }
func (m *InternalCommitTrigger) String() string { return proto.CompactTextString(m) }
func (*InternalCommitTrigger) ProtoMessage() {}
func (*InternalCommitTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{9}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{9}
}
func (m *InternalCommitTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -713,7 +727,7 @@ func (m *ObservedTimestamp) Reset() { *m = ObservedTimestamp{} }
func (m *ObservedTimestamp) String() string { return proto.CompactTextString(m) }
func (*ObservedTimestamp) ProtoMessage() {}
func (*ObservedTimestamp) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{10}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{10}
}
func (m *ObservedTimestamp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -888,7 +902,7 @@ type Transaction struct {
func (m *Transaction) Reset() { *m = Transaction{} }
func (*Transaction) ProtoMessage() {}
func (*Transaction) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{11}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{11}
}
func (m *Transaction) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -939,7 +953,7 @@ func (m *TransactionRecord) Reset() { *m = TransactionRecord{} }
func (m *TransactionRecord) String() string { return proto.CompactTextString(m) }
func (*TransactionRecord) ProtoMessage() {}
func (*TransactionRecord) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{12}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{12}
}
func (m *TransactionRecord) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -979,7 +993,7 @@ func (m *Intent) Reset() { *m = Intent{} }
func (m *Intent) String() string { return proto.CompactTextString(m) }
func (*Intent) ProtoMessage() {}
func (*Intent) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{13}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{13}
}
func (m *Intent) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1016,7 +1030,7 @@ func (m *Intent_SingleKeySpan) Reset() { *m = Intent_SingleKeySpan{} }
func (m *Intent_SingleKeySpan) String() string { return proto.CompactTextString(m) }
func (*Intent_SingleKeySpan) ProtoMessage() {}
func (*Intent_SingleKeySpan) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{13, 0}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{13, 0}
}
func (m *Intent_SingleKeySpan) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1053,7 +1067,7 @@ func (m *LockAcquisition) Reset() { *m = LockAcquisition{} }
func (m *LockAcquisition) String() string { return proto.CompactTextString(m) }
func (*LockAcquisition) ProtoMessage() {}
func (*LockAcquisition) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{14}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{14}
}
func (m *LockAcquisition) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1094,7 +1108,7 @@ func (m *LockUpdate) Reset() { *m = LockUpdate{} }
func (m *LockUpdate) String() string { return proto.CompactTextString(m) }
func (*LockUpdate) ProtoMessage() {}
func (*LockUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{15}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{15}
}
func (m *LockUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1131,7 +1145,7 @@ func (m *SequencedWrite) Reset() { *m = SequencedWrite{} }
func (m *SequencedWrite) String() string { return proto.CompactTextString(m) }
func (*SequencedWrite) ProtoMessage() {}
func (*SequencedWrite) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{16}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{16}
}
func (m *SequencedWrite) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1196,7 +1210,7 @@ type Lease struct {
func (m *Lease) Reset() { *m = Lease{} }
func (*Lease) ProtoMessage() {}
func (*Lease) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{17}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{17}
}
func (m *Lease) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1241,7 +1255,7 @@ func (m *AbortSpanEntry) Reset() { *m = AbortSpanEntry{} }
func (m *AbortSpanEntry) String() string { return proto.CompactTextString(m) }
func (*AbortSpanEntry) ProtoMessage() {}
func (*AbortSpanEntry) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{18}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{18}
}
func (m *AbortSpanEntry) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1298,7 +1312,7 @@ func (m *LeafTxnInputState) Reset() { *m = LeafTxnInputState{} }
func (m *LeafTxnInputState) String() string { return proto.CompactTextString(m) }
func (*LeafTxnInputState) ProtoMessage() {}
func (*LeafTxnInputState) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{19}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{19}
}
func (m *LeafTxnInputState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1351,7 +1365,7 @@ func (m *LeafTxnFinalState) Reset() { *m = LeafTxnFinalState{} }
func (m *LeafTxnFinalState) String() string { return proto.CompactTextString(m) }
func (*LeafTxnFinalState) ProtoMessage() {}
func (*LeafTxnFinalState) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{20}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{20}
}
func (m *LeafTxnFinalState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1390,7 +1404,7 @@ func (m *ClientRangeInfo) Reset() { *m = ClientRangeInfo{} }
func (m *ClientRangeInfo) String() string { return proto.CompactTextString(m) }
func (*ClientRangeInfo) ProtoMessage() {}
func (*ClientRangeInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{21}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{21}
}
func (m *ClientRangeInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1427,7 +1441,7 @@ type RangeInfo struct {
func (m *RangeInfo) Reset() { *m = RangeInfo{} }
func (*RangeInfo) ProtoMessage() {}
func (*RangeInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_data_f7c076f1b3c5df9f, []int{22}
+ return fileDescriptor_data_9fe3b4298c3b6243, []int{22}
}
func (m *RangeInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1540,6 +1554,9 @@ func (this *MergeTrigger) Equal(that interface{}) bool {
if !this.FreezeStart.Equal(&that1.FreezeStart) {
return false
}
+ if !this.RightClosedTimestamp.Equal(&that1.RightClosedTimestamp) {
+ return false
+ }
return true
}
func (this *AbortSpanEntry) Equal(that interface{}) bool {
@@ -1783,6 +1800,14 @@ func (m *MergeTrigger) MarshalTo(dAtA []byte) (int, error) {
return 0, err
}
i += n9
+ dAtA[i] = 0x32
+ i++
+ i = encodeVarintData(dAtA, i, uint64(m.RightClosedTimestamp.Size()))
+ n10, err := m.RightClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n10
return i, nil
}
@@ -1809,11 +1834,11 @@ func (m *ChangeReplicasTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.DeprecatedReplica.Size()))
- n10, err := m.DeprecatedReplica.MarshalTo(dAtA[i:])
+ n11, err := m.DeprecatedReplica.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n10
+ i += n11
if len(m.DeprecatedUpdatedReplicas) > 0 {
for _, msg := range m.DeprecatedUpdatedReplicas {
dAtA[i] = 0x1a
@@ -1835,11 +1860,11 @@ func (m *ChangeReplicasTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.Desc.Size()))
- n11, err := m.Desc.MarshalTo(dAtA[i:])
+ n12, err := m.Desc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n11
+ i += n12
}
if len(m.InternalAddedReplicas) > 0 {
for _, msg := range m.InternalAddedReplicas {
@@ -1897,11 +1922,11 @@ func (m *ModifiedSpanTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.NodeLivenessSpan.Size()))
- n12, err := m.NodeLivenessSpan.MarshalTo(dAtA[i:])
+ n13, err := m.NodeLivenessSpan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n12
+ i += n13
}
return i, nil
}
@@ -1924,11 +1949,11 @@ func (m *StickyBitTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.StickyBit.Size()))
- n13, err := m.StickyBit.MarshalTo(dAtA[i:])
+ n14, err := m.StickyBit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n13
+ i += n14
return i, nil
}
@@ -1951,51 +1976,51 @@ func (m *InternalCommitTrigger) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.SplitTrigger.Size()))
- n14, err := m.SplitTrigger.MarshalTo(dAtA[i:])
+ n15, err := m.SplitTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n14
+ i += n15
}
if m.MergeTrigger != nil {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.MergeTrigger.Size()))
- n15, err := m.MergeTrigger.MarshalTo(dAtA[i:])
+ n16, err := m.MergeTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n15
+ i += n16
}
if m.ChangeReplicasTrigger != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintData(dAtA, i, uint64(m.ChangeReplicasTrigger.Size()))
- n16, err := m.ChangeReplicasTrigger.MarshalTo(dAtA[i:])
+ n17, err := m.ChangeReplicasTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n16
+ i += n17
}
if m.ModifiedSpanTrigger != nil {
dAtA[i] = 0x22
i++
i = encodeVarintData(dAtA, i, uint64(m.ModifiedSpanTrigger.Size()))
- n17, err := m.ModifiedSpanTrigger.MarshalTo(dAtA[i:])
+ n18, err := m.ModifiedSpanTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n17
+ i += n18
}
if m.StickyBitTrigger != nil {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.StickyBitTrigger.Size()))
- n18, err := m.StickyBitTrigger.MarshalTo(dAtA[i:])
+ n19, err := m.StickyBitTrigger.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n18
+ i += n19
}
return i, nil
}
@@ -2023,11 +2048,11 @@ func (m *ObservedTimestamp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Timestamp.Size()))
- n19, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n20, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n19
+ i += n20
return i, nil
}
@@ -2049,11 +2074,11 @@ func (m *Transaction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.TxnMeta.Size()))
- n20, err := m.TxnMeta.MarshalTo(dAtA[i:])
+ n21, err := m.TxnMeta.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n20
+ i += n21
if len(m.Name) > 0 {
dAtA[i] = 0x12
i++
@@ -2068,19 +2093,19 @@ func (m *Transaction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.LastHeartbeat.Size()))
- n21, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
+ n22, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n21
+ i += n22
dAtA[i] = 0x3a
i++
i = encodeVarintData(dAtA, i, uint64(m.GlobalUncertaintyLimit.Size()))
- n22, err := m.GlobalUncertaintyLimit.MarshalTo(dAtA[i:])
+ n23, err := m.GlobalUncertaintyLimit.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n22
+ i += n23
if len(m.ObservedTimestamps) > 0 {
for _, msg := range m.ObservedTimestamps {
dAtA[i] = 0x42
@@ -2118,11 +2143,11 @@ func (m *Transaction) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x7a
i++
i = encodeVarintData(dAtA, i, uint64(m.ReadTimestamp.Size()))
- n23, err := m.ReadTimestamp.MarshalTo(dAtA[i:])
+ n24, err := m.ReadTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n23
+ i += n24
if m.CommitTimestampFixed {
dAtA[i] = 0x80
i++
@@ -2184,11 +2209,11 @@ func (m *TransactionRecord) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.TxnMeta.Size()))
- n24, err := m.TxnMeta.MarshalTo(dAtA[i:])
+ n25, err := m.TxnMeta.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n24
+ i += n25
if m.Status != 0 {
dAtA[i] = 0x20
i++
@@ -2197,11 +2222,11 @@ func (m *TransactionRecord) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.LastHeartbeat.Size()))
- n25, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
+ n26, err := m.LastHeartbeat.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n25
+ i += n26
if len(m.LockSpans) > 0 {
for _, msg := range m.LockSpans {
dAtA[i] = 0x5a
@@ -2263,19 +2288,19 @@ func (m *Intent) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Intent_SingleKeySpan.Size()))
- n26, err := m.Intent_SingleKeySpan.MarshalTo(dAtA[i:])
+ n27, err := m.Intent_SingleKeySpan.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n26
+ i += n27
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n27, err := m.Txn.MarshalTo(dAtA[i:])
+ n28, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n27
+ i += n28
return i, nil
}
@@ -2321,19 +2346,19 @@ func (m *LockAcquisition) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Span.Size()))
- n28, err := m.Span.MarshalTo(dAtA[i:])
+ n29, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n28
+ i += n29
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n29, err := m.Txn.MarshalTo(dAtA[i:])
+ n30, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n29
+ i += n30
if m.Durability != 0 {
dAtA[i] = 0x18
i++
@@ -2360,19 +2385,19 @@ func (m *LockUpdate) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Span.Size()))
- n30, err := m.Span.MarshalTo(dAtA[i:])
+ n31, err := m.Span.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n30
+ i += n31
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n31, err := m.Txn.MarshalTo(dAtA[i:])
+ n32, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n31
+ i += n32
if m.Status != 0 {
dAtA[i] = 0x18
i++
@@ -2440,48 +2465,48 @@ func (m *Lease) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Start.Size()))
- n32, err := m.Start.MarshalTo(dAtA[i:])
+ n33, err := m.Start.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n32
+ i += n33
if m.Expiration != nil {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Expiration.Size()))
- n33, err := m.Expiration.MarshalTo(dAtA[i:])
+ n34, err := m.Expiration.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n33
+ i += n34
}
dAtA[i] = 0x1a
i++
i = encodeVarintData(dAtA, i, uint64(m.Replica.Size()))
- n34, err := m.Replica.MarshalTo(dAtA[i:])
+ n35, err := m.Replica.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n34
+ i += n35
if m.DeprecatedStartStasis != nil {
dAtA[i] = 0x22
i++
i = encodeVarintData(dAtA, i, uint64(m.DeprecatedStartStasis.Size()))
- n35, err := m.DeprecatedStartStasis.MarshalTo(dAtA[i:])
+ n36, err := m.DeprecatedStartStasis.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n35
+ i += n36
}
if m.ProposedTS != nil {
dAtA[i] = 0x2a
i++
i = encodeVarintData(dAtA, i, uint64(m.ProposedTS.Size()))
- n36, err := m.ProposedTS.MarshalTo(dAtA[i:])
+ n37, err := m.ProposedTS.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n36
+ i += n37
}
if m.Epoch != 0 {
dAtA[i] = 0x30
@@ -2520,11 +2545,11 @@ func (m *AbortSpanEntry) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Timestamp.Size()))
- n37, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n38, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n37
+ i += n38
if m.Priority != 0 {
dAtA[i] = 0x18
i++
@@ -2551,11 +2576,11 @@ func (m *LeafTxnInputState) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n38, err := m.Txn.MarshalTo(dAtA[i:])
+ n39, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n38
+ i += n39
if m.RefreshInvalid {
dAtA[i] = 0x38
i++
@@ -2614,11 +2639,11 @@ func (m *LeafTxnFinalState) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Txn.Size()))
- n39, err := m.Txn.MarshalTo(dAtA[i:])
+ n40, err := m.Txn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n39
+ i += n40
if m.DeprecatedCommandCount != 0 {
dAtA[i] = 0x18
i++
@@ -2700,19 +2725,19 @@ func (m *RangeInfo) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintData(dAtA, i, uint64(m.Desc.Size()))
- n40, err := m.Desc.MarshalTo(dAtA[i:])
+ n41, err := m.Desc.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n40
+ i += n41
dAtA[i] = 0x12
i++
i = encodeVarintData(dAtA, i, uint64(m.Lease.Size()))
- n41, err := m.Lease.MarshalTo(dAtA[i:])
+ n42, err := m.Lease.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n41
+ i += n42
if m.ClosedTimestampPolicy != 0 {
dAtA[i] = 0x18
i++
@@ -3072,6 +3097,8 @@ func (m *MergeTrigger) Size() (n int) {
n += 1 + l + sovData(uint64(l))
l = m.FreezeStart.Size()
n += 1 + l + sovData(uint64(l))
+ l = m.RightClosedTimestamp.Size()
+ n += 1 + l + sovData(uint64(l))
return n
}
@@ -4208,6 +4235,36 @@ func (m *MergeTrigger) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field RightClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowData
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthData
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.RightClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipData(dAtA[iNdEx:])
@@ -7192,170 +7249,171 @@ var (
ErrIntOverflowData = fmt.Errorf("proto: integer overflow")
)
-func init() { proto.RegisterFile("roachpb/data.proto", fileDescriptor_data_f7c076f1b3c5df9f) }
-
-var fileDescriptor_data_f7c076f1b3c5df9f = []byte{
- // 2591 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcd, 0x73, 0x23, 0x47,
- 0x15, 0xf7, 0x58, 0x23, 0x69, 0xf4, 0x2c, 0xc9, 0xe3, 0x5e, 0xdb, 0xab, 0x75, 0xc0, 0x5a, 0x14,
- 0x20, 0xcb, 0x16, 0x91, 0x0b, 0x27, 0xa4, 0x52, 0xcb, 0x52, 0x85, 0xbe, 0xd6, 0x91, 0x56, 0x96,
- 0x36, 0xa3, 0xf1, 0x06, 0x27, 0x50, 0xc3, 0x68, 0xa6, 0x2d, 0x0f, 0x1e, 0xcd, 0x68, 0x67, 0x46,
- 0x8e, 0xc5, 0x8d, 0x0b, 0x95, 0xca, 0x01, 0x38, 0x72, 0xe0, 0x90, 0x2a, 0x6e, 0x70, 0x80, 0x23,
- 0xc5, 0x81, 0x73, 0x0e, 0x1c, 0x72, 0x4b, 0x80, 0x2a, 0x15, 0x38, 0x97, 0x1c, 0xf8, 0x0b, 0x5c,
- 0x50, 0x45, 0x75, 0xf7, 0x7c, 0x79, 0x57, 0x36, 0x72, 0x76, 0x09, 0x29, 0x2e, 0xf6, 0xcc, 0xfb,
- 0xf8, 0xbd, 0xee, 0xd7, 0xef, 0xbd, 0x7e, 0xf3, 0x04, 0xc8, 0xb1, 0x55, 0xed, 0x70, 0xd4, 0xdf,
- 0xd2, 0x55, 0x4f, 0x2d, 0x8f, 0x1c, 0xdb, 0xb3, 0xd1, 0x8a, 0x66, 0x6b, 0x47, 0x94, 0x5e, 0xf6,
- 0xb9, 0x1b, 0xb7, 0x8f, 0x8e, 0xb7, 0x8e, 0x8e, 0x5d, 0xec, 0x1c, 0x63, 0x67, 0x4b, 0xb3, 0x2d,
- 0x6d, 0xec, 0x38, 0xd8, 0xd2, 0x26, 0x5b, 0xa6, 0xad, 0x1d, 0xd1, 0x3f, 0x86, 0x35, 0x60, 0xea,
- 0x1b, 0xeb, 0x01, 0xe4, 0x10, 0x7b, 0x6a, 0x04, 0xbb, 0xf1, 0x9c, 0xeb, 0xd9, 0x8e, 0x3a, 0xc0,
- 0x5b, 0xd8, 0x1a, 0x18, 0x16, 0x26, 0x02, 0xc7, 0x9a, 0xe6, 0x33, 0xbf, 0x30, 0x93, 0xf9, 0x92,
- 0xcf, 0x2d, 0x8c, 0x3d, 0xc3, 0xdc, 0x3a, 0x34, 0xb5, 0x2d, 0xcf, 0x18, 0x62, 0xd7, 0x53, 0x87,
- 0x23, 0x9f, 0xb3, 0x3a, 0xb0, 0x07, 0x36, 0x7d, 0xdc, 0x22, 0x4f, 0x8c, 0x5a, 0xda, 0x07, 0xbe,
- 0x37, 0x52, 0x2d, 0x74, 0x03, 0x12, 0x47, 0x78, 0x52, 0x48, 0xdc, 0xe4, 0x6e, 0x65, 0xab, 0xe9,
- 0xb3, 0x69, 0x31, 0x71, 0x1f, 0x4f, 0x24, 0x42, 0x43, 0x37, 0x21, 0x8d, 0x2d, 0x5d, 0x21, 0x6c,
- 0xfe, 0x3c, 0x3b, 0x85, 0x2d, 0xfd, 0x3e, 0x9e, 0xdc, 0x11, 0x7e, 0xf1, 0x5e, 0x71, 0xe1, 0xf7,
- 0xef, 0x15, 0xb9, 0x16, 0x2f, 0x70, 0xe2, 0x62, 0x8b, 0x17, 0x16, 0xc5, 0x44, 0x69, 0x00, 0xc9,
- 0x87, 0xaa, 0x39, 0xc6, 0xe8, 0x39, 0xc8, 0x38, 0xea, 0xdb, 0x4a, 0x7f, 0xe2, 0x61, 0xb7, 0xc0,
- 0x11, 0x08, 0x49, 0x70, 0xd4, 0xb7, 0xab, 0xe4, 0x1d, 0x55, 0x20, 0x13, 0xae, 0xb4, 0xb0, 0x78,
- 0x93, 0xbb, 0xb5, 0xb4, 0xfd, 0xc5, 0x72, 0xe4, 0x56, 0xb2, 0x9d, 0xf2, 0xa1, 0xa9, 0x95, 0xe5,
- 0x40, 0xa8, 0xca, 0xbf, 0x3f, 0x2d, 0x2e, 0x48, 0x91, 0x56, 0xe9, 0x2d, 0x10, 0xee, 0xe3, 0x09,
- 0xb3, 0xe5, 0xef, 0x83, 0x9b, 0xb1, 0x8f, 0x97, 0x21, 0x79, 0x4c, 0x64, 0x7c, 0x2b, 0x85, 0xf2,
- 0x13, 0x87, 0x57, 0xa6, 0x18, 0xbe, 0x01, 0x26, 0x5c, 0xfa, 0x90, 0x03, 0xe8, 0x79, 0xb6, 0x83,
- 0x9b, 0x3a, 0xb6, 0x3c, 0x34, 0x00, 0xd0, 0xcc, 0xb1, 0xeb, 0x61, 0x47, 0x31, 0x74, 0xdf, 0xcc,
- 0x6b, 0x44, 0xfe, 0x2f, 0xd3, 0xe2, 0x4b, 0x03, 0xc3, 0x3b, 0x1c, 0xf7, 0xcb, 0x9a, 0x3d, 0xdc,
- 0x0a, 0xb1, 0xf5, 0x7e, 0xf4, 0xbc, 0x35, 0x3a, 0x1a, 0x6c, 0xd1, 0x03, 0x1a, 0x8f, 0x0d, 0xbd,
- 0xbc, 0xb7, 0xd7, 0xac, 0x9f, 0x4e, 0x8b, 0x99, 0x1a, 0x03, 0x6c, 0xd6, 0xa5, 0x8c, 0x8f, 0xdd,
- 0xd4, 0xd1, 0x8b, 0x90, 0xb6, 0x6c, 0x1d, 0x13, 0x2b, 0x64, 0xbd, 0xc9, 0xea, 0xea, 0xe9, 0xb4,
- 0x98, 0xea, 0xd8, 0x3a, 0x6e, 0xd6, 0xcf, 0xc2, 0x27, 0x29, 0x45, 0x84, 0x9a, 0x3a, 0xfa, 0x06,
- 0x08, 0x24, 0x2e, 0xa8, 0x7c, 0x82, 0xca, 0xaf, 0x9f, 0x4e, 0x8b, 0x69, 0xb6, 0x72, 0xa2, 0x10,
- 0x3c, 0x4a, 0x69, 0x97, 0xed, 0xa6, 0xf4, 0x6b, 0x0e, 0xb2, 0xbd, 0x91, 0x69, 0x78, 0xb2, 0x63,
- 0x0c, 0x06, 0xd8, 0x41, 0x0d, 0xc8, 0x98, 0xf8, 0xc0, 0x53, 0x74, 0xec, 0x6a, 0x74, 0x6b, 0x4b,
- 0xdb, 0xa5, 0x19, 0x4e, 0x92, 0x54, 0x6b, 0x80, 0xeb, 0xd8, 0xd5, 0x1c, 0x63, 0xe4, 0xd9, 0x8e,
- 0xef, 0x2e, 0x81, 0xa8, 0x12, 0x2a, 0xda, 0x01, 0x70, 0x8c, 0xc1, 0xa1, 0x8f, 0xb3, 0x78, 0x45,
- 0x9c, 0x0c, 0xd5, 0x25, 0xe4, 0x3b, 0xfc, 0x27, 0x2c, 0xa4, 0x12, 0x22, 0x5f, 0xfa, 0x65, 0x02,
- 0xb2, 0xbb, 0xd8, 0x19, 0xe0, 0xcf, 0xe9, 0x62, 0xd1, 0x00, 0x44, 0x06, 0x44, 0xb2, 0x51, 0x71,
- 0x3d, 0xd5, 0x73, 0x69, 0xba, 0x2c, 0x6d, 0x7f, 0x25, 0x06, 0xe7, 0xe7, 0x6e, 0x39, 0xc8, 0xdd,
- 0xf2, 0xee, 0xc3, 0x5a, 0xad, 0x47, 0x84, 0xab, 0xeb, 0x04, 0xf1, 0x74, 0x5a, 0xcc, 0x4b, 0x04,
- 0x26, 0xa4, 0x4b, 0x79, 0x0a, 0xbb, 0x7b, 0xac, 0x69, 0xf4, 0x1d, 0xfd, 0x84, 0x83, 0xec, 0x81,
- 0x83, 0xf1, 0x8f, 0x30, 0xb1, 0xe2, 0x78, 0x85, 0xe4, 0x3c, 0x49, 0x53, 0x27, 0xe8, 0x67, 0xd3,
- 0xe2, 0xdd, 0xf9, 0x63, 0x94, 0x00, 0xd4, 0x48, 0xc1, 0x0a, 0x51, 0xa4, 0x25, 0x66, 0xb8, 0x47,
- 0xec, 0x9e, 0x3b, 0x9e, 0xdf, 0x24, 0x61, 0xad, 0x76, 0x48, 0x7c, 0x24, 0xe1, 0x91, 0x69, 0x68,
- 0xaa, 0x1b, 0x9c, 0xd3, 0x9b, 0xb0, 0xae, 0xe3, 0x91, 0x83, 0x35, 0xd5, 0xc3, 0xba, 0xa2, 0x51,
- 0x19, 0xc5, 0x9b, 0x8c, 0x30, 0x3d, 0xb4, 0xfc, 0xf6, 0x97, 0x67, 0x39, 0x9b, 0x61, 0x30, 0x40,
- 0x79, 0x32, 0xc2, 0xd2, 0x6a, 0x84, 0x11, 0x51, 0xd1, 0x3e, 0xa0, 0x18, 0xb6, 0xc3, 0xb4, 0xfc,
- 0x43, 0xbc, 0x04, 0xf7, 0x89, 0x63, 0x5c, 0x89, 0x50, 0x7c, 0x11, 0xf4, 0x43, 0x78, 0x2e, 0x06,
- 0x3d, 0x1e, 0xe9, 0x71, 0x13, 0x6e, 0x21, 0x71, 0x33, 0x71, 0x45, 0x1b, 0x37, 0x22, 0xb8, 0x3d,
- 0x86, 0x16, 0x78, 0x0a, 0x61, 0xd8, 0x88, 0xd9, 0xb2, 0xf0, 0x89, 0x17, 0x18, 0x22, 0xd9, 0xcc,
- 0xd3, 0x6c, 0xbe, 0x75, 0x3a, 0x2d, 0x5e, 0xaf, 0x87, 0x52, 0x1d, 0x7c, 0xe2, 0xf9, 0xfa, 0x34,
- 0xbb, 0x33, 0xe1, 0x8b, 0x74, 0x5d, 0x9f, 0x29, 0xa5, 0xa3, 0x57, 0x80, 0xa7, 0x41, 0x9e, 0x9c,
- 0x37, 0xc8, 0x25, 0x2a, 0x8f, 0xfa, 0x70, 0xdd, 0xb0, 0x3c, 0xec, 0x58, 0xaa, 0xa9, 0xa8, 0xba,
- 0x1e, 0x77, 0x43, 0xea, 0xca, 0x6e, 0x58, 0x0b, 0xa0, 0x2a, 0x04, 0x29, 0x74, 0xc1, 0x01, 0xdc,
- 0x08, 0x6d, 0x38, 0x78, 0x68, 0x1f, 0xc7, 0xad, 0xa4, 0xaf, 0x6c, 0x25, 0x5c, 0xb0, 0xc4, 0xb0,
- 0x02, 0x3b, 0x77, 0x78, 0x72, 0x53, 0x95, 0xde, 0xe5, 0xe0, 0xda, 0xae, 0xad, 0x1b, 0x07, 0x06,
- 0xd6, 0xc9, 0xed, 0x17, 0xc4, 0xea, 0xd7, 0x01, 0xb9, 0x13, 0xd7, 0xc3, 0x43, 0x45, 0xb3, 0xad,
- 0x03, 0x63, 0xa0, 0xb8, 0x23, 0xd5, 0xa2, 0x71, 0x2a, 0x48, 0x22, 0xe3, 0xd4, 0x28, 0x83, 0x5e,
- 0x99, 0x0d, 0x40, 0xb4, 0x42, 0x9b, 0xc6, 0x31, 0xb6, 0xb0, 0xeb, 0x32, 0x69, 0x16, 0x7d, 0xd7,
- 0x67, 0x2c, 0x96, 0x28, 0x49, 0x22, 0x51, 0x69, 0xfb, 0x1a, 0x84, 0x52, 0x7a, 0x08, 0x62, 0xcf,
- 0x33, 0xb4, 0xa3, 0x49, 0x35, 0xaa, 0xc4, 0x55, 0x00, 0x97, 0xd2, 0x94, 0xbe, 0xe1, 0xf9, 0xd5,
- 0x6d, 0xbe, 0x5b, 0xd1, 0x0d, 0xa0, 0x4a, 0x7f, 0x48, 0xc0, 0x5a, 0xd3, 0x77, 0x43, 0xcd, 0x1e,
- 0x0e, 0x23, 0xf4, 0x3a, 0xe4, 0x5c, 0x52, 0xf7, 0x15, 0x8f, 0x11, 0x7c, 0x03, 0xc5, 0x99, 0x6b,
- 0x8e, 0xee, 0x07, 0x29, 0xeb, 0xc6, 0x6f, 0x8b, 0x3a, 0xe4, 0x86, 0xa4, 0x20, 0x87, 0x28, 0x8b,
- 0x17, 0xa2, 0xc4, 0x0b, 0xb7, 0x94, 0x1d, 0xc6, 0xcb, 0xf8, 0x0f, 0xe0, 0xba, 0x5f, 0x13, 0x82,
- 0xe3, 0x0e, 0xf1, 0x12, 0x14, 0xef, 0xd6, 0x0c, 0xbc, 0x99, 0x95, 0x46, 0x5a, 0xd3, 0x2e, 0x28,
- 0x40, 0x6b, 0x43, 0xff, 0xac, 0xe9, 0x09, 0x85, 0xf8, 0xac, 0x3a, 0x7f, 0x75, 0xd6, 0x7a, 0x9f,
- 0x8c, 0x0d, 0xe9, 0xda, 0x70, 0x46, 0xc0, 0xbc, 0x0e, 0x28, 0x3a, 0xa7, 0x10, 0x98, 0x25, 0xd8,
- 0xf3, 0xb3, 0xdc, 0xf9, 0xd8, 0x41, 0x4b, 0xa2, 0xfb, 0x18, 0xe5, 0x0e, 0xff, 0xce, 0x7b, 0x45,
- 0xae, 0xf4, 0x27, 0x0e, 0x56, 0xba, 0x7d, 0xda, 0x45, 0xea, 0xe1, 0x19, 0xc7, 0x7b, 0x02, 0x6e,
- 0x8e, 0x9e, 0xe0, 0xc7, 0xdc, 0x95, 0x7b, 0xab, 0x67, 0x73, 0x4d, 0x44, 0x56, 0xef, 0xf0, 0xa4,
- 0x2d, 0x2c, 0x9d, 0xa5, 0x60, 0x49, 0x76, 0x54, 0xcb, 0x55, 0x35, 0xcf, 0xb0, 0x2d, 0x54, 0x01,
- 0x9e, 0xb4, 0xbc, 0x7e, 0xe0, 0x3d, 0x7f, 0xd9, 0x05, 0x29, 0x9f, 0x58, 0xbb, 0xd8, 0x53, 0xab,
- 0x02, 0x59, 0xd9, 0x07, 0xd3, 0x22, 0x27, 0x51, 0x55, 0x84, 0x80, 0xb7, 0xd4, 0x21, 0x6b, 0xe6,
- 0x32, 0x12, 0x7d, 0x46, 0x77, 0x21, 0x45, 0x2e, 0xde, 0x31, 0xbb, 0x79, 0x67, 0xdf, 0x2d, 0xb1,
- 0x65, 0xf4, 0xa8, 0xac, 0xe4, 0xeb, 0xa0, 0x16, 0xe4, 0x4d, 0xd5, 0xf5, 0x94, 0x43, 0xac, 0x3a,
- 0x5e, 0x1f, 0xab, 0x73, 0xde, 0xac, 0x2c, 0xf1, 0x72, 0x44, 0xf5, 0xb5, 0x40, 0x13, 0x7d, 0x1f,
- 0x0a, 0x03, 0xd3, 0xee, 0xab, 0xa6, 0x32, 0xb6, 0x34, 0xec, 0x78, 0xaa, 0x61, 0x79, 0x13, 0xc5,
- 0x34, 0x86, 0x86, 0x57, 0x48, 0xcf, 0x8f, 0xba, 0xce, 0x40, 0xf6, 0x22, 0x8c, 0x36, 0x81, 0x40,
- 0x6f, 0xc1, 0x35, 0xdb, 0x8f, 0x0e, 0x25, 0xf4, 0xb5, 0x5b, 0x10, 0x2e, 0x2c, 0x94, 0x4f, 0xc4,
- 0x92, 0x6f, 0x00, 0xd9, 0x8f, 0x33, 0x5c, 0x74, 0x17, 0x80, 0x1c, 0x27, 0x4d, 0x16, 0xb7, 0xb0,
- 0x44, 0x31, 0x2f, 0xaa, 0x67, 0x41, 0xd9, 0x21, 0x0a, 0xe4, 0xdd, 0x45, 0x25, 0xc8, 0xbd, 0xed,
- 0x18, 0x1e, 0x56, 0x3c, 0xdb, 0x56, 0x6c, 0x53, 0x2f, 0x64, 0x69, 0xf9, 0x5c, 0xa2, 0x44, 0xd9,
- 0xb6, 0xbb, 0xa6, 0x4e, 0x3c, 0xed, 0x60, 0x35, 0xb6, 0xf4, 0xc2, 0xf2, 0x15, 0x3c, 0x4d, 0x54,
- 0xa3, 0x9c, 0x78, 0x19, 0xd6, 0x35, 0x5a, 0xdd, 0x22, 0x34, 0xe5, 0xc0, 0x38, 0xc1, 0x7a, 0x41,
- 0xa4, 0x86, 0x57, 0x19, 0x37, 0x54, 0xb8, 0x47, 0x78, 0xe8, 0x75, 0x10, 0x0d, 0x4b, 0x39, 0x30,
- 0x69, 0xc7, 0x46, 0x97, 0xe6, 0x16, 0x56, 0xe8, 0x4e, 0xbf, 0x34, 0x6b, 0xa7, 0xf8, 0xd1, 0x18,
- 0x5b, 0x1a, 0xd6, 0xdf, 0x20, 0x92, 0xfe, 0x3a, 0xf2, 0x86, 0x75, 0x8f, 0xea, 0x53, 0xa2, 0x8b,
- 0x6c, 0x58, 0x36, 0x06, 0x96, 0xed, 0x90, 0x32, 0x83, 0x1f, 0x59, 0xe3, 0xa1, 0x5b, 0x40, 0x14,
- 0xb1, 0x7c, 0x59, 0x78, 0x37, 0x99, 0x4a, 0x0f, 0x3f, 0xea, 0x8c, 0x87, 0xf4, 0xfe, 0x8d, 0x1a,
- 0xc1, 0x73, 0x3c, 0x57, 0xca, 0x1b, 0xe1, 0x3b, 0x41, 0x3f, 0xf7, 0xd5, 0x95, 0x10, 0xf9, 0x16,
- 0x2f, 0xa4, 0xc4, 0x74, 0x8b, 0x17, 0x32, 0x22, 0xb4, 0x78, 0x21, 0x27, 0xe6, 0x5b, 0xbc, 0x90,
- 0x17, 0x97, 0x4b, 0xbf, 0xe3, 0x61, 0x25, 0x16, 0xf5, 0x12, 0xd6, 0x6c, 0x47, 0x7f, 0x16, 0x29,
- 0xf8, 0xf9, 0x49, 0xb7, 0xa7, 0x0b, 0xd9, 0xff, 0x87, 0x60, 0xe0, 0xfd, 0x40, 0x58, 0x14, 0x13,
- 0x8f, 0x85, 0x43, 0x5a, 0x14, 0x5a, 0xbc, 0x20, 0x88, 0x99, 0x30, 0x34, 0x40, 0x5c, 0x6a, 0xf1,
- 0x42, 0x56, 0xcc, 0xc5, 0xc3, 0xa4, 0xc5, 0x0b, 0xcb, 0xa2, 0xd8, 0xe2, 0x05, 0x51, 0x5c, 0x29,
- 0x4d, 0x39, 0x48, 0x91, 0xde, 0xc1, 0xf2, 0xd0, 0x3e, 0x2c, 0xbb, 0x86, 0x35, 0x30, 0xb1, 0x72,
- 0x84, 0x27, 0x51, 0x43, 0xb4, 0xb4, 0xfd, 0xc2, 0x0c, 0xdf, 0x30, 0x9d, 0x72, 0x8f, 0x2a, 0xdc,
- 0xc7, 0x13, 0xea, 0xef, 0x28, 0x6c, 0x72, 0x6e, 0x9c, 0x81, 0xbe, 0x05, 0x09, 0xef, 0x24, 0xe8,
- 0x98, 0xe6, 0x8a, 0x40, 0xe6, 0x6c, 0xa2, 0xb5, 0x71, 0x17, 0x72, 0xe7, 0xcc, 0x5c, 0x32, 0xc1,
- 0x88, 0x4f, 0x25, 0x5a, 0xbc, 0xc0, 0x8b, 0xc9, 0xd2, 0x9f, 0x39, 0x58, 0x6e, 0xdb, 0xda, 0x51,
- 0x45, 0x7b, 0x34, 0x36, 0x5c, 0x83, 0x5e, 0x4a, 0xdf, 0x04, 0x3e, 0xb6, 0xbd, 0x0b, 0xc3, 0x27,
- 0x96, 0x05, 0xee, 0xd3, 0xee, 0x02, 0x49, 0x00, 0xfa, 0xd8, 0x51, 0xfb, 0x86, 0x69, 0x78, 0x6c,
- 0xed, 0xf9, 0xed, 0xed, 0x18, 0xc6, 0xd1, 0x71, 0x39, 0x18, 0x26, 0x95, 0x63, 0xc3, 0xa4, 0x32,
- 0x09, 0xde, 0x72, 0x3d, 0xd4, 0x94, 0x62, 0x28, 0xa5, 0xdf, 0x2e, 0x02, 0x90, 0xbd, 0xb1, 0xcf,
- 0x8c, 0xff, 0xc9, 0xb6, 0xa2, 0xca, 0x90, 0xf8, 0x14, 0x95, 0x61, 0x46, 0xf2, 0xf0, 0xff, 0xcd,
- 0xe4, 0x29, 0xfd, 0x8c, 0x83, 0xfc, 0xf9, 0xb4, 0xbe, 0x6c, 0x8e, 0xf4, 0x3d, 0x10, 0x5c, 0x5f,
- 0xd8, 0x1f, 0xcd, 0x7c, 0x67, 0xee, 0x8e, 0xe9, 0xf1, 0xd9, 0x1d, 0x71, 0x5e, 0x0f, 0x3f, 0x92,
- 0x42, 0x44, 0xbf, 0x61, 0xfa, 0x23, 0x0f, 0xc9, 0x36, 0x56, 0x5d, 0x8c, 0x26, 0x90, 0x64, 0x9f,
- 0xf9, 0xdc, 0x67, 0xd7, 0xbf, 0x31, 0x8b, 0xe8, 0xdb, 0x00, 0xf8, 0x64, 0x64, 0x38, 0x2a, 0x39,
- 0xa3, 0xb9, 0xfa, 0x47, 0x29, 0xa6, 0x80, 0xea, 0x90, 0x0e, 0x3e, 0xc9, 0x13, 0x57, 0xfe, 0x24,
- 0x0f, 0x54, 0xd1, 0x1e, 0xc4, 0x3e, 0x68, 0xd9, 0xc4, 0x83, 0xfc, 0x75, 0x8d, 0x60, 0xbc, 0xf2,
- 0x1f, 0x56, 0xb4, 0x16, 0x69, 0xd3, 0xb1, 0x45, 0x8f, 0xea, 0xa2, 0x9f, 0x72, 0xb0, 0x34, 0x72,
- 0xec, 0x91, 0xed, 0x92, 0x16, 0xca, 0x9d, 0xef, 0xee, 0xe9, 0x9c, 0x4e, 0x8b, 0xf0, 0xc0, 0xd7,
- 0x92, 0x7b, 0x4f, 0xed, 0x67, 0x08, 0x56, 0x20, 0xbb, 0x68, 0x15, 0x92, 0x78, 0x64, 0x6b, 0x87,
- 0x85, 0xd4, 0x4d, 0xee, 0x56, 0x42, 0x62, 0x2f, 0xe8, 0xc5, 0x58, 0xac, 0x91, 0xbe, 0x31, 0x51,
- 0x5d, 0x39, 0x9b, 0x16, 0x73, 0x34, 0x34, 0x82, 0x88, 0x8d, 0x05, 0x4f, 0xd8, 0x12, 0x94, 0xfe,
- 0xca, 0x41, 0xbe, 0xd2, 0xb7, 0x1d, 0x8f, 0x24, 0x77, 0xc3, 0xf2, 0x9c, 0xc9, 0x65, 0x21, 0xfd,
- 0xf4, 0x43, 0x58, 0xa4, 0x82, 0x30, 0x72, 0x0c, 0xdb, 0x09, 0xea, 0x58, 0xb2, 0xda, 0x38, 0x9b,
- 0x16, 0x2b, 0x9f, 0x3a, 0x2b, 0x1e, 0xf8, 0x60, 0x52, 0x08, 0x7b, 0x47, 0x20, 0x3b, 0xfb, 0x84,
- 0xec, 0xee, 0x5f, 0x8b, 0xb0, 0xd2, 0xc6, 0xea, 0x81, 0x7c, 0x62, 0x35, 0xad, 0xd1, 0x98, 0x1c,
- 0xaa, 0x87, 0xd1, 0x2b, 0xac, 0x64, 0xb1, 0x44, 0xd9, 0xbc, 0xbc, 0xe4, 0xc4, 0xab, 0xd5, 0x0b,
- 0xb0, 0xec, 0xe0, 0x03, 0x07, 0xbb, 0x87, 0x8a, 0x61, 0x1d, 0xab, 0xa6, 0xa1, 0x53, 0x5f, 0x0b,
- 0x52, 0xde, 0x27, 0x37, 0x19, 0x75, 0x66, 0xa3, 0x20, 0x3c, 0x5d, 0xa3, 0xb0, 0x0d, 0x6b, 0xae,
- 0x87, 0x47, 0x23, 0xc3, 0x1a, 0x28, 0x43, 0xf2, 0x6d, 0x87, 0x2d, 0xb5, 0x6f, 0x62, 0xbd, 0x90,
- 0xa1, 0x2b, 0xb8, 0x16, 0x30, 0x77, 0x6d, 0x1d, 0x37, 0x18, 0x0b, 0xf5, 0x21, 0x4b, 0xdb, 0x67,
- 0x17, 0x3f, 0x52, 0xac, 0xf1, 0xb0, 0x00, 0xcf, 0xa8, 0x08, 0x01, 0x41, 0x65, 0x35, 0xf2, 0xb1,
- 0x4e, 0x82, 0x17, 0x93, 0x2d, 0x5e, 0x48, 0x8a, 0x29, 0xd6, 0x55, 0x94, 0xde, 0x8d, 0xfc, 0x7f,
- 0xcf, 0xb0, 0x54, 0xf3, 0xe9, 0xfc, 0xff, 0x2a, 0x14, 0xe2, 0x23, 0x42, 0x7b, 0x38, 0x54, 0x2d,
- 0xf2, 0x7f, 0x6c, 0x79, 0x2c, 0x94, 0xa4, 0xd8, 0x08, 0xb1, 0xc6, 0xd8, 0x35, 0xc2, 0x45, 0x55,
- 0xc8, 0x05, 0x27, 0xc7, 0x5a, 0x3f, 0x7e, 0x9e, 0xd6, 0x2f, 0xeb, 0xeb, 0xb0, 0xee, 0x6f, 0xde,
- 0xd3, 0x0f, 0x5d, 0x12, 0xba, 0x81, 0xb5, 0x55, 0xa5, 0x7f, 0x72, 0xb0, 0x5c, 0x33, 0x0d, 0x6c,
- 0x79, 0xf4, 0xd6, 0x69, 0x5a, 0x07, 0x36, 0x7a, 0x0d, 0xd6, 0xf4, 0xb0, 0xa4, 0x29, 0x03, 0x6c,
- 0x61, 0xbf, 0x8a, 0x72, 0x34, 0x89, 0xaf, 0x9d, 0x4d, 0x8b, 0xcb, 0x54, 0x7a, 0x27, 0x64, 0x49,
- 0xab, 0x91, 0x46, 0x44, 0x45, 0xaf, 0x42, 0xde, 0x24, 0xd9, 0xae, 0x9c, 0xbb, 0x73, 0x66, 0xd6,
- 0x81, 0x9c, 0x19, 0x7f, 0x45, 0x18, 0xae, 0x6b, 0x26, 0xab, 0x6f, 0xe1, 0x97, 0xd1, 0xc8, 0x36,
- 0x0d, 0x2d, 0x68, 0x34, 0x5e, 0xbc, 0x68, 0x04, 0x58, 0xa3, 0x6a, 0x61, 0xb2, 0x3f, 0xa0, 0x4a,
- 0xd2, 0x9a, 0x36, 0x8b, 0x5c, 0xfa, 0x07, 0x07, 0x99, 0x68, 0xe3, 0x77, 0xfd, 0x21, 0xe3, 0x55,
- 0x27, 0xf2, 0x6c, 0xd4, 0xf8, 0x32, 0x24, 0xe9, 0x1e, 0x2e, 0xf9, 0x89, 0x86, 0x6e, 0x39, 0xf8,
- 0x89, 0x86, 0x0a, 0x7f, 0x46, 0x1b, 0x65, 0xb3, 0xc3, 0xdb, 0x1f, 0x72, 0x90, 0xa1, 0x3f, 0x13,
- 0xd1, 0x09, 0xf4, 0x12, 0xa4, 0xf7, 0x3a, 0xf7, 0x3b, 0xdd, 0x37, 0x3a, 0xe2, 0x02, 0x4a, 0x43,
- 0xa2, 0xd9, 0x91, 0x45, 0x0e, 0x65, 0x20, 0x79, 0xaf, 0xdd, 0xad, 0xc8, 0xe2, 0x22, 0x79, 0xac,
- 0xee, 0xcb, 0x8d, 0x9e, 0x98, 0x40, 0xd7, 0x60, 0xb9, 0xde, 0x68, 0x37, 0x77, 0x9b, 0x72, 0xa3,
- 0xae, 0x30, 0xa2, 0x80, 0x04, 0xe0, 0xe5, 0xe6, 0x6e, 0x43, 0xe4, 0x09, 0x54, 0xbd, 0x51, 0x6b,
- 0xee, 0x56, 0xda, 0x62, 0x12, 0xad, 0xc1, 0x4a, 0x24, 0x1b, 0x90, 0x33, 0x28, 0x0b, 0x42, 0x7d,
- 0x4f, 0xaa, 0xc8, 0xcd, 0x6e, 0x47, 0x4c, 0x21, 0x80, 0x14, 0xd1, 0x95, 0xdf, 0x14, 0xb3, 0xc4,
- 0xf6, 0x4e, 0xa3, 0x2b, 0xe6, 0xa8, 0xc1, 0xee, 0x77, 0xb7, 0xeb, 0x62, 0x9e, 0x3c, 0xca, 0x7b,
- 0x0f, 0xda, 0x0d, 0x11, 0x88, 0x62, 0xb5, 0x29, 0x57, 0x24, 0xa9, 0xb2, 0x2f, 0x2e, 0xa1, 0x3c,
- 0x00, 0x51, 0xec, 0x35, 0xa4, 0x66, 0xa3, 0x27, 0xea, 0x25, 0xf2, 0x91, 0x90, 0xbe, 0xad, 0xc1,
- 0xca, 0x13, 0x83, 0x77, 0x94, 0x83, 0x4c, 0xa5, 0x5e, 0x57, 0x1e, 0x76, 0xe5, 0x86, 0x24, 0x2e,
- 0x20, 0x11, 0xb2, 0x52, 0x63, 0xb7, 0xfb, 0xb0, 0xe1, 0x53, 0x38, 0xb4, 0x02, 0x39, 0x22, 0xd0,
- 0xe9, 0x76, 0x7c, 0xd2, 0x22, 0x5a, 0x05, 0xd1, 0x17, 0x8a, 0xa8, 0x89, 0x0d, 0xfe, 0x9d, 0x5f,
- 0x6d, 0x2e, 0xdc, 0xee, 0x9e, 0xfb, 0x16, 0x65, 0x8d, 0x1f, 0xd9, 0xfa, 0x83, 0x46, 0xa7, 0xde,
- 0xec, 0xec, 0x88, 0x0b, 0xe4, 0xa5, 0x27, 0x57, 0x76, 0xc8, 0x4b, 0x82, 0x98, 0xaf, 0x75, 0x77,
- 0x77, 0x9b, 0xb2, 0xdc, 0xa8, 0x8b, 0x1c, 0xe1, 0x55, 0xaa, 0x5d, 0x89, 0xbc, 0x2c, 0xfa, 0x80,
- 0xfb, 0xb0, 0x71, 0xf1, 0x51, 0xa2, 0x0d, 0x58, 0x6f, 0x57, 0x76, 0x94, 0xea, 0xbe, 0x52, 0x6b,
- 0xef, 0xf5, 0xe4, 0x86, 0xa4, 0xf4, 0x1a, 0xb2, 0xcc, 0x0c, 0xdd, 0x80, 0xb5, 0x76, 0xa3, 0x52,
- 0x57, 0xee, 0x75, 0x25, 0x65, 0xa7, 0xdd, 0xad, 0x56, 0xda, 0x8a, 0xd4, 0xa8, 0xd4, 0x7b, 0x22,
- 0xc7, 0xa0, 0xab, 0x5f, 0x7b, 0xff, 0xef, 0x9b, 0x0b, 0xef, 0x9f, 0x6e, 0x72, 0x1f, 0x9c, 0x6e,
- 0x72, 0x1f, 0x9d, 0x6e, 0x72, 0x7f, 0x3b, 0xdd, 0xe4, 0x7e, 0xfe, 0xf1, 0xe6, 0xc2, 0x07, 0x1f,
- 0x6f, 0x2e, 0x7c, 0xf4, 0xf1, 0xe6, 0xc2, 0x9b, 0x69, 0x3f, 0x9a, 0xfa, 0x29, 0xfa, 0x6b, 0xea,
- 0x4b, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x77, 0x72, 0x88, 0x5c, 0x25, 0x1e, 0x00, 0x00,
+func init() { proto.RegisterFile("roachpb/data.proto", fileDescriptor_data_9fe3b4298c3b6243) }
+
+var fileDescriptor_data_9fe3b4298c3b6243 = []byte{
+ // 2606 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0x4f, 0x70, 0x23, 0x47,
+ 0xd5, 0xf7, 0x58, 0x23, 0x69, 0xf4, 0x2c, 0xc9, 0xe3, 0x5e, 0xdb, 0xab, 0x75, 0xbe, 0xcf, 0xda,
+ 0x4f, 0xf9, 0x20, 0xcb, 0x16, 0x91, 0x0b, 0x27, 0xa4, 0x52, 0xcb, 0x52, 0x85, 0xfe, 0xad, 0x23,
+ 0xad, 0x2c, 0x6d, 0x46, 0xe3, 0x0d, 0x4e, 0xa0, 0x86, 0xd1, 0x4c, 0x5b, 0x1e, 0x3c, 0x9a, 0xd1,
+ 0xce, 0x8c, 0x1c, 0x8b, 0x1b, 0x17, 0x2a, 0x95, 0x03, 0x70, 0xe4, 0x98, 0x2a, 0x6e, 0x70, 0x80,
+ 0x23, 0xc5, 0x81, 0x73, 0x0e, 0x1c, 0x72, 0x4b, 0x80, 0x2a, 0x15, 0x38, 0x97, 0x1c, 0xb8, 0x53,
+ 0xe5, 0x82, 0x2a, 0xaa, 0xbb, 0xe7, 0x9f, 0xbd, 0xb2, 0x91, 0xb3, 0x21, 0xa4, 0xb8, 0xd8, 0x33,
+ 0xaf, 0xdf, 0xfb, 0xbd, 0xee, 0xd7, 0xef, 0xdf, 0x3c, 0x01, 0x72, 0x6c, 0x55, 0x3b, 0x1c, 0xf5,
+ 0xb7, 0x74, 0xd5, 0x53, 0xcb, 0x23, 0xc7, 0xf6, 0x6c, 0xb4, 0xa2, 0xd9, 0xda, 0x11, 0xa5, 0x97,
+ 0xfd, 0xd5, 0x8d, 0xbb, 0x47, 0xc7, 0x5b, 0x47, 0xc7, 0x2e, 0x76, 0x8e, 0xb1, 0xb3, 0xa5, 0xd9,
+ 0x96, 0x36, 0x76, 0x1c, 0x6c, 0x69, 0x93, 0x2d, 0xd3, 0xd6, 0x8e, 0xe8, 0x1f, 0xc3, 0x1a, 0x30,
+ 0xf1, 0x8d, 0xf5, 0x00, 0x72, 0x88, 0x3d, 0x35, 0x82, 0xdd, 0x78, 0xce, 0xf5, 0x6c, 0x47, 0x1d,
+ 0xe0, 0x2d, 0x6c, 0x0d, 0x0c, 0x0b, 0x13, 0x86, 0x63, 0x4d, 0xf3, 0x17, 0xff, 0x67, 0xe6, 0xe2,
+ 0x4b, 0xfe, 0x6a, 0x61, 0xec, 0x19, 0xe6, 0xd6, 0xa1, 0xa9, 0x6d, 0x79, 0xc6, 0x10, 0xbb, 0x9e,
+ 0x3a, 0x1c, 0xf9, 0x2b, 0xab, 0x03, 0x7b, 0x60, 0xd3, 0xc7, 0x2d, 0xf2, 0xc4, 0xa8, 0xa5, 0x7d,
+ 0xe0, 0x7b, 0x23, 0xd5, 0x42, 0xb7, 0x20, 0x71, 0x84, 0x27, 0x85, 0xc4, 0x6d, 0xee, 0x4e, 0xb6,
+ 0x9a, 0x3e, 0x9b, 0x16, 0x13, 0x0f, 0xf1, 0x44, 0x22, 0x34, 0x74, 0x1b, 0xd2, 0xd8, 0xd2, 0x15,
+ 0xb2, 0xcc, 0x9f, 0x5f, 0x4e, 0x61, 0x4b, 0x7f, 0x88, 0x27, 0xf7, 0x84, 0x9f, 0xbd, 0x57, 0x5c,
+ 0xf8, 0xcd, 0x7b, 0x45, 0xae, 0xc5, 0x0b, 0x9c, 0xb8, 0xd8, 0xe2, 0x85, 0x45, 0x31, 0x51, 0x1a,
+ 0x40, 0xf2, 0xb1, 0x6a, 0x8e, 0x31, 0x7a, 0x0e, 0x32, 0x8e, 0xfa, 0xb6, 0xd2, 0x9f, 0x78, 0xd8,
+ 0x2d, 0x70, 0x04, 0x42, 0x12, 0x1c, 0xf5, 0xed, 0x2a, 0x79, 0x47, 0x15, 0xc8, 0x84, 0x3b, 0x2d,
+ 0x2c, 0xde, 0xe6, 0xee, 0x2c, 0x6d, 0xff, 0x6f, 0x39, 0x32, 0x2b, 0x39, 0x4e, 0xf9, 0xd0, 0xd4,
+ 0xca, 0x72, 0xc0, 0x54, 0xe5, 0xdf, 0x9f, 0x16, 0x17, 0xa4, 0x48, 0xaa, 0xf4, 0x16, 0x08, 0x0f,
+ 0xf1, 0x84, 0xe9, 0xf2, 0xcf, 0xc1, 0xcd, 0x38, 0xc7, 0xcb, 0x90, 0x3c, 0x26, 0x3c, 0xbe, 0x96,
+ 0x42, 0xf9, 0xa9, 0xcb, 0x2b, 0x53, 0x0c, 0x5f, 0x01, 0x63, 0x2e, 0x7d, 0xc8, 0x01, 0xf4, 0x3c,
+ 0xdb, 0xc1, 0x4d, 0x1d, 0x5b, 0x1e, 0x1a, 0x00, 0x68, 0xe6, 0xd8, 0xf5, 0xb0, 0xa3, 0x18, 0xba,
+ 0xaf, 0xe6, 0x35, 0xc2, 0xff, 0xc7, 0x69, 0xf1, 0xa5, 0x81, 0xe1, 0x1d, 0x8e, 0xfb, 0x65, 0xcd,
+ 0x1e, 0x6e, 0x85, 0xd8, 0x7a, 0x3f, 0x7a, 0xde, 0x1a, 0x1d, 0x0d, 0xb6, 0xe8, 0x05, 0x8d, 0xc7,
+ 0x86, 0x5e, 0xde, 0xdb, 0x6b, 0xd6, 0x4f, 0xa7, 0xc5, 0x4c, 0x8d, 0x01, 0x36, 0xeb, 0x52, 0xc6,
+ 0xc7, 0x6e, 0xea, 0xe8, 0x45, 0x48, 0x5b, 0xb6, 0x8e, 0x89, 0x16, 0xb2, 0xdf, 0x64, 0x75, 0xf5,
+ 0x74, 0x5a, 0x4c, 0x75, 0x6c, 0x1d, 0x37, 0xeb, 0x67, 0xe1, 0x93, 0x94, 0x22, 0x4c, 0x4d, 0x1d,
+ 0x7d, 0x0d, 0x04, 0xe2, 0x17, 0x94, 0x3f, 0x41, 0xf9, 0xd7, 0x4f, 0xa7, 0xc5, 0x34, 0xdb, 0x39,
+ 0x11, 0x08, 0x1e, 0xa5, 0xb4, 0xcb, 0x4e, 0x53, 0xfa, 0x05, 0x07, 0xd9, 0xde, 0xc8, 0x34, 0x3c,
+ 0xd9, 0x31, 0x06, 0x03, 0xec, 0xa0, 0x06, 0x64, 0x4c, 0x7c, 0xe0, 0x29, 0x3a, 0x76, 0x35, 0x7a,
+ 0xb4, 0xa5, 0xed, 0xd2, 0x0c, 0x23, 0x49, 0xaa, 0x35, 0xc0, 0x75, 0xec, 0x6a, 0x8e, 0x31, 0xf2,
+ 0x6c, 0xc7, 0x37, 0x97, 0x40, 0x44, 0x09, 0x15, 0xed, 0x00, 0x38, 0xc6, 0xe0, 0xd0, 0xc7, 0x59,
+ 0xbc, 0x26, 0x4e, 0x86, 0xca, 0x12, 0xf2, 0x3d, 0xfe, 0x13, 0xe6, 0x52, 0x09, 0x91, 0x2f, 0xfd,
+ 0x2d, 0x01, 0xd9, 0x5d, 0xec, 0x0c, 0xf0, 0x17, 0x74, 0xb3, 0x68, 0x00, 0x22, 0x03, 0x22, 0xd1,
+ 0xa8, 0xb8, 0x9e, 0xea, 0xb9, 0x34, 0x5c, 0x96, 0xb6, 0xbf, 0x14, 0x83, 0xf3, 0x63, 0xb7, 0x1c,
+ 0xc4, 0x6e, 0x79, 0xf7, 0x71, 0xad, 0xd6, 0x23, 0xcc, 0xd5, 0x75, 0x82, 0x78, 0x3a, 0x2d, 0xe6,
+ 0x25, 0x02, 0x13, 0xd2, 0xa5, 0x3c, 0x85, 0xdd, 0x3d, 0xd6, 0x34, 0xfa, 0x8e, 0x7e, 0xc4, 0x41,
+ 0xf6, 0xc0, 0xc1, 0xf8, 0x07, 0x98, 0x68, 0x71, 0xbc, 0x42, 0x72, 0x9e, 0xa0, 0xa9, 0x13, 0xf4,
+ 0xb3, 0x69, 0xf1, 0xfe, 0xfc, 0x3e, 0x4a, 0x00, 0x6a, 0x24, 0x61, 0x85, 0x28, 0xd2, 0x12, 0x53,
+ 0xdc, 0x23, 0x7a, 0xd1, 0x3e, 0xac, 0xb3, 0x13, 0x6b, 0xa6, 0xed, 0x62, 0x5d, 0x89, 0xc2, 0x38,
+ 0x35, 0x7f, 0x18, 0xaf, 0x52, 0x88, 0x1a, 0x45, 0x08, 0xd7, 0xce, 0xdd, 0xfc, 0x2f, 0x93, 0xb0,
+ 0x56, 0x3b, 0x24, 0xe6, 0x97, 0xf0, 0xc8, 0x34, 0x34, 0xd5, 0x0d, 0x5c, 0xe0, 0x4d, 0x58, 0xd7,
+ 0xf1, 0xc8, 0xc1, 0x9a, 0xea, 0x61, 0x5d, 0xd1, 0x28, 0x8f, 0xe2, 0x4d, 0x46, 0x98, 0xfa, 0x43,
+ 0x7e, 0xfb, 0xff, 0x67, 0xdd, 0x23, 0xc3, 0x60, 0x80, 0xf2, 0x64, 0x84, 0xa5, 0xd5, 0x08, 0x23,
+ 0xa2, 0xa2, 0x7d, 0x40, 0x31, 0x6c, 0x87, 0x49, 0xf9, 0xfe, 0x71, 0x05, 0xee, 0x53, 0x1e, 0xb2,
+ 0x12, 0xa1, 0xf8, 0x2c, 0xe8, 0xfb, 0xf0, 0x5c, 0x0c, 0x7a, 0x3c, 0xd2, 0xe3, 0x2a, 0xdc, 0x42,
+ 0xe2, 0x76, 0xe2, 0x9a, 0x3a, 0x6e, 0x45, 0x70, 0x7b, 0x0c, 0x2d, 0xb0, 0x14, 0xc2, 0xb0, 0x11,
+ 0xd3, 0x65, 0xe1, 0x13, 0x2f, 0x50, 0x44, 0x12, 0x05, 0x4f, 0x13, 0xc5, 0x9d, 0xd3, 0x69, 0xf1,
+ 0x66, 0x3d, 0xe4, 0xea, 0xe0, 0x13, 0xcf, 0x97, 0xa7, 0x89, 0x23, 0x13, 0xbe, 0x48, 0x37, 0xf5,
+ 0x99, 0x5c, 0x3a, 0x7a, 0x05, 0x78, 0x1a, 0x3f, 0xc9, 0x79, 0xe3, 0x47, 0xa2, 0xfc, 0xa8, 0x0f,
+ 0x37, 0x0d, 0xcb, 0xc3, 0x8e, 0xa5, 0x9a, 0x8a, 0xaa, 0xeb, 0x71, 0x33, 0xa4, 0xae, 0x6d, 0x86,
+ 0xb5, 0x00, 0xaa, 0x42, 0x90, 0x42, 0x13, 0x1c, 0xc0, 0xad, 0x50, 0x87, 0x83, 0x87, 0xf6, 0x71,
+ 0x5c, 0x4b, 0xfa, 0xda, 0x5a, 0xc2, 0x0d, 0x4b, 0x0c, 0x2b, 0xd0, 0x73, 0x8f, 0x27, 0x45, 0xb0,
+ 0xf4, 0x2e, 0x07, 0x37, 0x76, 0x6d, 0xdd, 0x38, 0x30, 0xb0, 0x4e, 0x0a, 0x6b, 0xe0, 0xab, 0x5f,
+ 0x05, 0xe4, 0x4e, 0x5c, 0x0f, 0x0f, 0x15, 0xcd, 0xb6, 0x0e, 0x8c, 0x81, 0xe2, 0x8e, 0x54, 0x8b,
+ 0xfa, 0xa9, 0x20, 0x89, 0x6c, 0xa5, 0x46, 0x17, 0x68, 0x35, 0x6e, 0x00, 0xa2, 0xc9, 0xdf, 0x34,
+ 0x8e, 0xb1, 0x85, 0x5d, 0x97, 0x71, 0x33, 0xef, 0xbb, 0x39, 0x63, 0xb3, 0x44, 0x48, 0x12, 0x89,
+ 0x48, 0xdb, 0x97, 0x20, 0x94, 0xd2, 0x63, 0x10, 0x7b, 0x9e, 0xa1, 0x1d, 0x4d, 0xaa, 0x51, 0x92,
+ 0xaf, 0x02, 0xb8, 0x94, 0xa6, 0xf4, 0x0d, 0xcf, 0x4f, 0x9c, 0xf3, 0x15, 0x5c, 0x37, 0x80, 0x2a,
+ 0xfd, 0x36, 0x01, 0x6b, 0x4d, 0xdf, 0x0c, 0x35, 0x7b, 0x38, 0x8c, 0xd0, 0xeb, 0x90, 0x73, 0x49,
+ 0x49, 0x51, 0x3c, 0x46, 0xf0, 0x15, 0x14, 0x67, 0xee, 0x39, 0x2a, 0x3d, 0x52, 0xd6, 0x8d, 0x17,
+ 0xa2, 0x3a, 0xe4, 0x86, 0x24, 0xd7, 0x87, 0x28, 0x8b, 0x97, 0xa2, 0xc4, 0x6b, 0x82, 0x94, 0x1d,
+ 0xc6, 0x2b, 0xc4, 0xf7, 0xe0, 0xa6, 0x9f, 0x13, 0x82, 0xeb, 0x0e, 0xf1, 0x12, 0x14, 0xef, 0xce,
+ 0x0c, 0xbc, 0x99, 0x99, 0x46, 0x5a, 0xd3, 0x2e, 0x49, 0x40, 0x6b, 0x43, 0xff, 0xae, 0xe9, 0x0d,
+ 0x85, 0xf8, 0x2c, 0xf1, 0x7f, 0x79, 0xd6, 0x7e, 0x9f, 0xf6, 0x0d, 0xe9, 0xc6, 0x70, 0x86, 0xc3,
+ 0xbc, 0x0e, 0x28, 0xba, 0xa7, 0x10, 0x98, 0x05, 0xd8, 0xf3, 0xb3, 0xcc, 0x79, 0xe1, 0xa2, 0x25,
+ 0xd1, 0xbd, 0x40, 0xb9, 0xc7, 0xbf, 0xf3, 0x5e, 0x91, 0x2b, 0xfd, 0x9e, 0x83, 0x95, 0x6e, 0x9f,
+ 0x36, 0xa8, 0x51, 0xc6, 0x8d, 0xb7, 0x1b, 0xdc, 0x1c, 0xed, 0xc6, 0x0f, 0xb9, 0x6b, 0xb7, 0x6d,
+ 0x9f, 0x4d, 0x05, 0x8a, 0xb4, 0xde, 0xe3, 0x49, 0xc7, 0x59, 0x3a, 0x4b, 0xc1, 0x92, 0xec, 0xa8,
+ 0x96, 0xab, 0x6a, 0x9e, 0x61, 0x5b, 0xa8, 0x02, 0x3c, 0xe9, 0xa6, 0x7d, 0xc7, 0x7b, 0xfe, 0xaa,
+ 0xda, 0x2b, 0x9f, 0x58, 0xbb, 0xd8, 0x53, 0xab, 0x02, 0xd9, 0xd9, 0x07, 0xd3, 0x22, 0x27, 0x51,
+ 0x51, 0x84, 0x80, 0xb7, 0xd4, 0x21, 0xeb, 0x13, 0x33, 0x12, 0x7d, 0x46, 0xf7, 0x21, 0x45, 0x6a,
+ 0xfa, 0x98, 0x15, 0xf5, 0xd9, 0xb5, 0x25, 0xb6, 0x8d, 0x1e, 0xe5, 0x95, 0x7c, 0x19, 0xd4, 0x82,
+ 0xbc, 0xa9, 0xba, 0x9e, 0x72, 0x88, 0x55, 0xc7, 0xeb, 0x63, 0x75, 0xce, 0xa2, 0xcd, 0x02, 0x2f,
+ 0x47, 0x44, 0x5f, 0x0b, 0x24, 0xd1, 0x77, 0xa1, 0x30, 0x30, 0xed, 0xbe, 0x6a, 0x2a, 0x63, 0x4b,
+ 0xc3, 0x8e, 0xa7, 0x1a, 0x96, 0x37, 0x51, 0x4c, 0x63, 0x68, 0x78, 0x85, 0xf4, 0xfc, 0xa8, 0xeb,
+ 0x0c, 0x64, 0x2f, 0xc2, 0x68, 0x13, 0x08, 0xf4, 0x16, 0xdc, 0xb0, 0x7d, 0xef, 0x88, 0x2a, 0xba,
+ 0x5b, 0x10, 0x2e, 0x4d, 0x94, 0x4f, 0xf9, 0x92, 0xaf, 0x00, 0xd9, 0x17, 0x17, 0x5c, 0x74, 0x1f,
+ 0x80, 0x5c, 0x27, 0x0d, 0x16, 0xb7, 0xb0, 0x44, 0x31, 0x2f, 0xcb, 0x67, 0x41, 0xda, 0x21, 0x02,
+ 0xe4, 0xdd, 0x45, 0x25, 0xc8, 0xbd, 0xed, 0x18, 0x1e, 0x56, 0x3c, 0xdb, 0x56, 0x6c, 0x53, 0x2f,
+ 0x64, 0x69, 0xfa, 0x5c, 0xa2, 0x44, 0xd9, 0xb6, 0xbb, 0xa6, 0x4e, 0x2c, 0xed, 0x60, 0x35, 0xde,
+ 0x8c, 0x2c, 0x5f, 0xc3, 0xd2, 0x44, 0x34, 0x8a, 0x89, 0x97, 0x61, 0x5d, 0xa3, 0xd9, 0x2d, 0x42,
+ 0x53, 0x0e, 0x8c, 0x13, 0xac, 0x17, 0x44, 0xaa, 0x78, 0x95, 0xad, 0x86, 0x02, 0x0f, 0xc8, 0x1a,
+ 0x7a, 0x1d, 0x44, 0xc3, 0x52, 0x0e, 0x4c, 0xda, 0x1a, 0xd1, 0xad, 0xb9, 0x85, 0x15, 0x7a, 0xd2,
+ 0xff, 0x9b, 0x75, 0x52, 0xfc, 0x64, 0x8c, 0x2d, 0x0d, 0xeb, 0x6f, 0x10, 0x4e, 0x7f, 0x1f, 0x79,
+ 0xc3, 0x7a, 0x40, 0xe5, 0x29, 0xd1, 0x45, 0x36, 0x2c, 0x1b, 0x03, 0xcb, 0x76, 0x48, 0x9a, 0xc1,
+ 0x4f, 0xac, 0xf1, 0xd0, 0x2d, 0x20, 0x8a, 0x58, 0xbe, 0xca, 0xbd, 0x9b, 0x4c, 0xa4, 0x87, 0x9f,
+ 0x74, 0xc6, 0x43, 0x5a, 0x7f, 0xa3, 0x1e, 0xf3, 0xdc, 0x9a, 0x2b, 0xe5, 0x8d, 0xf0, 0x9d, 0xa0,
+ 0x9f, 0xfb, 0xa0, 0x4b, 0x88, 0x7c, 0x8b, 0x17, 0x52, 0x62, 0xba, 0xc5, 0x0b, 0x19, 0x11, 0x5a,
+ 0xbc, 0x90, 0x13, 0xf3, 0x2d, 0x5e, 0xc8, 0x8b, 0xcb, 0xa5, 0x5f, 0xf3, 0xb0, 0x12, 0xf3, 0x7a,
+ 0x09, 0x6b, 0xb6, 0xa3, 0x7f, 0x16, 0x21, 0xf8, 0xc5, 0x09, 0xb7, 0x67, 0x73, 0xd9, 0xff, 0x06,
+ 0x67, 0xe0, 0x7d, 0x47, 0x58, 0x14, 0x13, 0x17, 0xdc, 0x21, 0x2d, 0x0a, 0x2d, 0x5e, 0x10, 0xc4,
+ 0x4c, 0xe8, 0x1a, 0x20, 0x2e, 0xb5, 0x78, 0x21, 0x2b, 0xe6, 0xe2, 0x6e, 0xd2, 0xe2, 0x85, 0x65,
+ 0x51, 0x6c, 0xf1, 0x82, 0x28, 0xae, 0x94, 0xa6, 0x1c, 0xa4, 0x48, 0xef, 0x60, 0x91, 0x0f, 0x88,
+ 0x65, 0xd7, 0xb0, 0x06, 0x26, 0x56, 0x8e, 0xf0, 0x24, 0x6a, 0x88, 0x96, 0xb6, 0x5f, 0x98, 0x61,
+ 0x1b, 0x26, 0x53, 0xee, 0x51, 0x81, 0x87, 0x78, 0x42, 0xed, 0x1d, 0xb9, 0x4d, 0xce, 0x8d, 0x2f,
+ 0xa0, 0x6f, 0x40, 0xc2, 0x3b, 0x09, 0x3a, 0xa6, 0xb9, 0x3c, 0x90, 0x19, 0x9b, 0x48, 0x6d, 0xdc,
+ 0x87, 0xdc, 0x39, 0x35, 0x57, 0x0c, 0x47, 0xe2, 0x03, 0x8f, 0x16, 0x2f, 0xf0, 0x62, 0xb2, 0xf4,
+ 0x07, 0x0e, 0x96, 0xdb, 0xb6, 0x76, 0x54, 0xd1, 0x9e, 0x8c, 0x0d, 0xd7, 0xa0, 0x45, 0xe9, 0xeb,
+ 0xc0, 0xc7, 0x8e, 0x77, 0xa9, 0xfb, 0xc4, 0xa2, 0xc0, 0x7d, 0xd6, 0x53, 0x20, 0x09, 0x40, 0x1f,
+ 0x3b, 0x6a, 0xdf, 0x30, 0x0d, 0x8f, 0xed, 0x3d, 0xbf, 0xbd, 0x1d, 0xc3, 0x38, 0x3a, 0x2e, 0x07,
+ 0x73, 0xaa, 0x72, 0x6c, 0x4e, 0x55, 0x26, 0xce, 0x5b, 0xae, 0x87, 0x92, 0x52, 0x0c, 0xa5, 0xf4,
+ 0xab, 0x45, 0x00, 0x72, 0x36, 0xf6, 0x99, 0xf1, 0x1f, 0x39, 0x56, 0x94, 0x19, 0x12, 0x9f, 0x22,
+ 0x33, 0xcc, 0x08, 0x1e, 0xfe, 0xdf, 0x19, 0x3c, 0xa5, 0x9f, 0x70, 0x90, 0x3f, 0x1f, 0xd6, 0x57,
+ 0x8d, 0xa8, 0xbe, 0x03, 0x82, 0xeb, 0x33, 0xfb, 0x53, 0x9f, 0x6f, 0xcd, 0xdd, 0x31, 0x5d, 0x1c,
+ 0x0b, 0x12, 0xe3, 0xf5, 0xf0, 0x13, 0x29, 0x44, 0xf4, 0x1b, 0xa6, 0xdf, 0xf1, 0x90, 0x6c, 0x63,
+ 0xd5, 0xc5, 0x68, 0x02, 0x49, 0x36, 0x41, 0xe0, 0x3e, 0xbf, 0xfe, 0x8d, 0x69, 0x44, 0xdf, 0x04,
+ 0xc0, 0x27, 0x23, 0xc3, 0x51, 0xc9, 0x1d, 0xcd, 0xd5, 0x3f, 0x4a, 0x31, 0x01, 0x54, 0x87, 0x74,
+ 0xf0, 0x49, 0x9e, 0xb8, 0xf6, 0x27, 0x79, 0x20, 0x8a, 0xf6, 0x20, 0xf6, 0x41, 0xcb, 0x86, 0x29,
+ 0xe4, 0xaf, 0x6b, 0x04, 0x93, 0x9b, 0x7f, 0xb1, 0xa3, 0xb5, 0x48, 0x9a, 0x4e, 0x44, 0x7a, 0x54,
+ 0x16, 0xfd, 0x98, 0x83, 0xa5, 0x91, 0x63, 0x8f, 0xd8, 0x50, 0xc4, 0x9d, 0xaf, 0xf6, 0x74, 0x4e,
+ 0xa7, 0x45, 0x78, 0xe4, 0x4b, 0xc9, 0xbd, 0x67, 0xb6, 0x33, 0x04, 0x3b, 0x90, 0x5d, 0xb4, 0x0a,
+ 0x49, 0x3c, 0xb2, 0xb5, 0x43, 0x3a, 0x97, 0x49, 0x48, 0xec, 0x05, 0xbd, 0x18, 0xf3, 0x35, 0xd2,
+ 0x37, 0x26, 0xaa, 0x2b, 0x67, 0xd3, 0x62, 0x8e, 0xba, 0x46, 0xe0, 0xb1, 0x31, 0xe7, 0x09, 0x5b,
+ 0x82, 0xd2, 0x9f, 0x38, 0xc8, 0x57, 0xfa, 0xb6, 0xe3, 0x91, 0xe0, 0x6e, 0x58, 0x9e, 0x33, 0xb9,
+ 0xca, 0xa5, 0x9f, 0x7d, 0xbe, 0x8b, 0x54, 0x10, 0x46, 0x8e, 0x61, 0x3b, 0x41, 0x1e, 0x4b, 0x56,
+ 0x1b, 0x67, 0xd3, 0x62, 0xe5, 0x53, 0x47, 0xc5, 0x23, 0x1f, 0x4c, 0x0a, 0x61, 0xef, 0x09, 0xe4,
+ 0x64, 0x9f, 0x90, 0xd3, 0xfd, 0x63, 0x11, 0x56, 0xda, 0x58, 0x3d, 0x90, 0x4f, 0xac, 0xa6, 0x35,
+ 0x1a, 0x93, 0x4b, 0xf5, 0x30, 0x7a, 0x85, 0xa5, 0x2c, 0x16, 0x28, 0x9b, 0x57, 0xa7, 0x9c, 0x78,
+ 0xb6, 0x7a, 0x01, 0x96, 0x1d, 0x7c, 0xe0, 0x60, 0xf7, 0x50, 0x31, 0xac, 0x63, 0xd5, 0x34, 0x74,
+ 0x6a, 0x6b, 0x41, 0xca, 0xfb, 0xe4, 0x26, 0xa3, 0xce, 0x6c, 0x14, 0x84, 0x67, 0x6b, 0x14, 0xb6,
+ 0x61, 0xcd, 0xf5, 0xf0, 0x68, 0x64, 0x58, 0x03, 0x65, 0x48, 0xbe, 0xed, 0xb0, 0xa5, 0xf6, 0x4d,
+ 0xac, 0x17, 0x32, 0x74, 0x07, 0x37, 0x82, 0xc5, 0x5d, 0x5b, 0xc7, 0x0d, 0xb6, 0x84, 0xfa, 0x90,
+ 0xa5, 0xed, 0xb3, 0x8b, 0x9f, 0x28, 0xd6, 0x78, 0x58, 0x80, 0xcf, 0x28, 0x09, 0x01, 0x41, 0x65,
+ 0x39, 0xf2, 0x42, 0x27, 0xc1, 0x8b, 0xc9, 0x16, 0x2f, 0x24, 0xc5, 0x14, 0xeb, 0x2a, 0x4a, 0xef,
+ 0x46, 0xf6, 0x7f, 0x60, 0x58, 0xaa, 0xf9, 0x6c, 0xf6, 0x7f, 0x15, 0x0a, 0xf1, 0x11, 0xa1, 0x3d,
+ 0x1c, 0xaa, 0x16, 0xf9, 0x3f, 0xb6, 0x3c, 0xe6, 0x4a, 0x52, 0x6c, 0x84, 0x58, 0x63, 0xcb, 0x35,
+ 0xb2, 0x8a, 0xaa, 0x90, 0x0b, 0x6e, 0x8e, 0xb5, 0x7e, 0xfc, 0x3c, 0xad, 0x5f, 0xd6, 0x97, 0x61,
+ 0xdd, 0xdf, 0xbc, 0xb7, 0x1f, 0x9a, 0x24, 0x34, 0x03, 0x6b, 0xab, 0x4a, 0x7f, 0xe7, 0x60, 0xb9,
+ 0x66, 0x1a, 0xd8, 0xf2, 0x68, 0xd5, 0x69, 0x5a, 0x07, 0x36, 0x7a, 0x0d, 0xd6, 0xf4, 0x30, 0xa5,
+ 0x29, 0x03, 0x6c, 0x61, 0x3f, 0x8b, 0x72, 0x34, 0x88, 0x6f, 0x9c, 0x4d, 0x8b, 0xcb, 0x94, 0x7b,
+ 0x27, 0x5c, 0x92, 0x56, 0x23, 0x89, 0x88, 0x8a, 0x5e, 0x85, 0xbc, 0x49, 0xa2, 0x5d, 0x39, 0x57,
+ 0x73, 0x66, 0xe6, 0x81, 0x9c, 0x19, 0x7f, 0x45, 0x18, 0x6e, 0x5e, 0x1c, 0xfa, 0x2a, 0x23, 0xdb,
+ 0x34, 0xb4, 0xa0, 0xd1, 0x78, 0xf1, 0xb2, 0x11, 0xe0, 0x85, 0x49, 0xef, 0x23, 0x2a, 0x24, 0xad,
+ 0x69, 0xb3, 0xc8, 0xa5, 0xbf, 0x72, 0x90, 0x89, 0x0e, 0x7e, 0xdf, 0x1f, 0x32, 0x5e, 0x77, 0xd8,
+ 0xcf, 0x46, 0x8d, 0x2f, 0x43, 0x92, 0x9e, 0xe1, 0x8a, 0x5f, 0x7f, 0xe8, 0x91, 0x83, 0x5f, 0x7f,
+ 0x28, 0xf3, 0xe7, 0x74, 0x50, 0x36, 0x3b, 0xbc, 0xfb, 0x21, 0x07, 0x19, 0xfa, 0x0b, 0x14, 0x9d,
+ 0x40, 0x2f, 0x41, 0x7a, 0xaf, 0xf3, 0xb0, 0xd3, 0x7d, 0xa3, 0x23, 0x2e, 0xa0, 0x34, 0x24, 0x9a,
+ 0x1d, 0x59, 0xe4, 0x50, 0x06, 0x92, 0x0f, 0xda, 0xdd, 0x8a, 0x2c, 0x2e, 0x92, 0xc7, 0xea, 0xbe,
+ 0xdc, 0xe8, 0x89, 0x09, 0x74, 0x03, 0x96, 0xeb, 0x8d, 0x76, 0x73, 0xb7, 0x29, 0x37, 0xea, 0x0a,
+ 0x23, 0x0a, 0x48, 0x00, 0x5e, 0x6e, 0xee, 0x36, 0x44, 0x9e, 0x40, 0xd5, 0x1b, 0xb5, 0xe6, 0x6e,
+ 0xa5, 0x2d, 0x26, 0xd1, 0x1a, 0xac, 0x44, 0xbc, 0x01, 0x39, 0x83, 0xb2, 0x20, 0xd4, 0xf7, 0xa4,
+ 0x8a, 0xdc, 0xec, 0x76, 0xc4, 0x14, 0x02, 0x48, 0x11, 0x59, 0xf9, 0x4d, 0x31, 0x4b, 0x74, 0xef,
+ 0x34, 0xba, 0x62, 0x8e, 0x2a, 0xec, 0x7e, 0x7b, 0xbb, 0x2e, 0xe6, 0xc9, 0xa3, 0xbc, 0xf7, 0xa8,
+ 0xdd, 0x10, 0x81, 0x08, 0x56, 0x9b, 0x72, 0x45, 0x92, 0x2a, 0xfb, 0xe2, 0x12, 0xca, 0x03, 0x10,
+ 0xc1, 0x5e, 0x43, 0x6a, 0x36, 0x7a, 0xa2, 0x5e, 0x22, 0x1f, 0x09, 0xe9, 0xbb, 0x1a, 0xac, 0x3c,
+ 0x35, 0x78, 0x47, 0x39, 0xc8, 0x54, 0xea, 0x75, 0xe5, 0x71, 0x57, 0x6e, 0x48, 0xe2, 0x02, 0x12,
+ 0x21, 0x2b, 0x35, 0x76, 0xbb, 0x8f, 0x1b, 0x3e, 0x85, 0x43, 0x2b, 0x90, 0x23, 0x0c, 0x9d, 0x6e,
+ 0xc7, 0x27, 0x2d, 0xa2, 0x55, 0x10, 0x7d, 0xa6, 0x88, 0x9a, 0xd8, 0xe0, 0xdf, 0xf9, 0xf9, 0xe6,
+ 0xc2, 0xdd, 0xee, 0xb9, 0x6f, 0x51, 0xd6, 0xf8, 0x91, 0xa3, 0x3f, 0x6a, 0x74, 0xea, 0xcd, 0xce,
+ 0x8e, 0xb8, 0x40, 0x5e, 0x7a, 0x72, 0x65, 0x87, 0xbc, 0x24, 0x88, 0xfa, 0x5a, 0x77, 0x77, 0xb7,
+ 0x29, 0xcb, 0x8d, 0xba, 0xc8, 0x91, 0xb5, 0x4a, 0xb5, 0x2b, 0x91, 0x97, 0x45, 0x1f, 0x70, 0x1f,
+ 0x36, 0x2e, 0xbf, 0x4a, 0xb4, 0x01, 0xeb, 0xed, 0xca, 0x8e, 0x52, 0xdd, 0x57, 0x6a, 0xed, 0xbd,
+ 0x9e, 0xdc, 0x90, 0x94, 0x5e, 0x43, 0x96, 0x99, 0xa2, 0x5b, 0xb0, 0xd6, 0x6e, 0x54, 0xea, 0xca,
+ 0x83, 0xae, 0xa4, 0xec, 0xb4, 0xbb, 0xd5, 0x4a, 0x5b, 0x91, 0x1a, 0x95, 0x7a, 0x4f, 0xe4, 0x18,
+ 0x74, 0xf5, 0x2b, 0xef, 0xff, 0x65, 0x73, 0xe1, 0xfd, 0xd3, 0x4d, 0xee, 0x83, 0xd3, 0x4d, 0xee,
+ 0xa3, 0xd3, 0x4d, 0xee, 0xcf, 0xa7, 0x9b, 0xdc, 0x4f, 0x3f, 0xde, 0x5c, 0xf8, 0xe0, 0xe3, 0xcd,
+ 0x85, 0x8f, 0x3e, 0xde, 0x5c, 0x78, 0x33, 0xed, 0x7b, 0x53, 0x3f, 0x45, 0x7f, 0xa8, 0x7d, 0xe9,
+ 0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x08, 0xe1, 0x66, 0xfa, 0x80, 0x1e, 0x00, 0x00,
}
diff --git a/pkg/roachpb/data.proto b/pkg/roachpb/data.proto
index 6e730fcabc73..61fc48f443d6 100644
--- a/pkg/roachpb/data.proto
+++ b/pkg/roachpb/data.proto
@@ -144,12 +144,27 @@ message MergeTrigger {
];
// FreezeStart is a timestamp that is guaranteed to be greater than the
- // timestamps at which any requests were serviced by the responding replica
+ // timestamps at which any requests were serviced by the right-hand side range
// before it stopped responding to requests altogether (in anticipation of
// being subsumed). It is suitable for use as the timestamp cache's low water
// mark for the keys previously owned by the subsumed range.
util.hlc.Timestamp freeze_start = 5 [(gogoproto.nullable) = false,
(gogoproto.casttype) = "github.com/cockroachdb/cockroach/pkg/util/hlc.ClockTimestamp"];
+
+ // right_closed_timestamp is the closed timestamp of the RHS at the moment of
+ // the subsumption. Because the SubsumeRequest synchronizes with all other
+ // requests, the range's closed timestamp does not advance past the snapshot
+ // captured here.
+ //
+ // Like the freeze_start, this is used by the merged range to conditionally
+ // bump the timestamp cache for the keys previously owned by the subsumed
+ // range.
+ //
+ // Note that the closed timestamp is also reflected in the right_read_summary.
+ // However, we carry it explicitly too because, in case the leaseholders of
+ // the two sides are collocated at merge time, we don't need to use the
+ // read_summary and simply use this field.
+ util.hlc.Timestamp right_closed_timestamp = 6 [(gogoproto.nullable) = false];
}
// ReplicaChangeType is a parameter of ChangeReplicasTrigger.
diff --git a/pkg/sql/logictest/testdata/logic_test/datetime b/pkg/sql/logictest/testdata/logic_test/datetime
index 5764c2e07f68..a5359b7393ac 100644
--- a/pkg/sql/logictest/testdata/logic_test/datetime
+++ b/pkg/sql/logictest/testdata/logic_test/datetime
@@ -1703,3 +1703,56 @@ query TT
SELECT 'infinity'::timestamp, '-infinity'::timestamptz
----
294276-12-31 23:59:59.999999 +0000 +0000 -4713-11-24 00:00:00 +0000 +0000
+
+query T
+SELECT parse_timestamp('2020-01-02 01:02:03')
+----
+2020-01-02 01:02:03 +0000 +0000
+
+query error could not parse
+SELECT parse_timestamp('foo')
+
+query error parse_timestamp\(\): relative timestamps are not supported
+SELECT parse_timestamp('now')
+
+query error parse_timestamp\(\): relative timestamps are not supported
+SELECT parse_timestamp('tomorrow')
+
+# Verify that parse_timestamp can be used in computed column expressions.
+statement ok
+CREATE TABLE timestamps (s STRING, ts TIMESTAMP AS (parse_timestamp(s)) STORED)
+
+query error parse_timestamp\(\): relative timestamps are not supported
+INSERT INTO timestamps VALUES ('tomorrow')
+
+statement ok
+INSERT INTO timestamps VALUES ('2020-01-02 01:02:03'), ('2015-08-25 04:45:45.53453+01:00'), (NULL)
+
+query TT colnames
+SELECT * FROM timestamps ORDER BY s
+----
+s ts
+NULL NULL
+2015-08-25 04:45:45.53453+01:00 2015-08-25 04:45:45.53453 +0000 +0000
+2020-01-02 01:02:03 2020-01-02 01:02:03 +0000 +0000
+
+statement ok
+SET TIME ZONE 'America/New_York'
+
+# Insert the same values again (stored columns are computed on insert).
+statement ok
+INSERT INTO timestamps VALUES ('2020-01-02 01:02:03'), ('2015-08-25 04:45:45.53453+01:00'), (NULL)
+
+query TT colnames
+SELECT * FROM timestamps ORDER BY s
+----
+s ts
+NULL NULL
+NULL NULL
+2015-08-25 04:45:45.53453+01:00 2015-08-25 04:45:45.53453 +0000 +0000
+2015-08-25 04:45:45.53453+01:00 2015-08-25 04:45:45.53453 +0000 +0000
+2020-01-02 01:02:03 2020-01-02 01:02:03 +0000 +0000
+2020-01-02 01:02:03 2020-01-02 01:02:03 +0000 +0000
+
+statement ok
+RESET TIME ZONE
diff --git a/pkg/sql/logictest/testdata/logic_test/geospatial b/pkg/sql/logictest/testdata/logic_test/geospatial
index 63671c1eacdd..6b917c57f7db 100644
--- a/pkg/sql/logictest/testdata/logic_test/geospatial
+++ b/pkg/sql/logictest/testdata/logic_test/geospatial
@@ -4998,10 +4998,10 @@ false false 97 false false
# Test for 2+ string arguments for Geometry where one side of the arguments
# raises an error.
-statement error Unknown type: 'ABC'
+statement error pq: st_intersects\(\): lex error: invalid keyword at pos 0\nabc\n\^
SELECT ST_Intersects('abc'::string, 'POINT(1 0)'::string)
-statement error Unknown type: 'ABC'
+statement error pq: st_intersects\(\): lex error: invalid keyword at pos 0\nabc\n\^
SELECT ST_Intersects('POINT(1 0)'::string, 'abc'::string)
query T
@@ -5258,7 +5258,7 @@ SELECT
ST_AsText(ST_LineMerge(g::geometry))
FROM ( VALUES
('MULTILINESTRING ((1 2, 3 4), (3 4, 5 6))'),
- ('MULTILINESTRING ((1 2, 3 4), (5 6, 7 8)))'),
+ ('MULTILINESTRING ((1 2, 3 4), (5 6, 7 8))'),
('POINT (1 2)')
)
t(g)
diff --git a/pkg/sql/opt/cat/index.go b/pkg/sql/opt/cat/index.go
index fce64a26a8cf..0c167c436170 100644
--- a/pkg/sql/opt/cat/index.go
+++ b/pkg/sql/opt/cat/index.go
@@ -155,40 +155,6 @@ type Index interface {
// Span returns the KV span associated with the index.
Span() roachpb.Span
- // PartitionByListPrefixes returns values that correspond to PARTITION BY LIST
- // values. Specifically, it returns a list of tuples where each tuple contains
- // values for a prefix of index columns (indicating a region of the index).
- // Each tuple corresponds to a configured partition or subpartition.
- //
- // Note: this function decodes and allocates datums; use sparingly.
- //
- // Example:
- //
- // CREATE INDEX idx ON t(region,subregion,val) PARTITION BY LIST (region,subregion) (
- // PARTITION westcoast VALUES IN (('us', 'seattle'), ('us', 'cali')),
- // PARTITION us VALUES IN (('us', DEFAULT)),
- // PARTITION eu VALUES IN (('eu', DEFAULT)),
- // PARTITION default VALUES IN (DEFAULT)
- // );
- //
- // PartitionByListPrefixes() returns
- // ('us', 'seattle'),
- // ('us', 'cali'),
- // ('us'),
- // ('eu').
- //
- // The intended use of this function is for index skip scans. Each tuple
- // corresponds to a region of the index that we can constrain further. In the
- // example above: if we have a val=1 filter, instead of a full index scan we
- // can skip most of the data under /us/cali and /us/seattle by scanning spans:
- // [ - /us/cali )
- // [ /us/cali/1 - /us/cali/1 ]
- // [ /us/cali\x00 - /us/seattle )
- // [ /us/seattle/1 - /us/seattle/1 ]
- // [ /us/seattle\x00 - ]
- //
- PartitionByListPrefixes() []tree.Datums
-
// ImplicitPartitioningColumnCount returns the number of implicit partitioning
// columns at the front of the index. For example, consider the following
// table:
@@ -257,6 +223,14 @@ type Index interface {
// Version returns the IndexDescriptorVersion of the index.
Version() descpb.IndexDescriptorVersion
+
+ // PartitionCount returns the number of PARTITION BY LIST partitions defined
+ // on this index.
+ PartitionCount() int
+
+ // Partition returns the ith PARTITION BY LIST partition within the index
+ // definition, where i < PartitionCount.
+ Partition(i int) Partition
}
// IndexColumn describes a single column that is part of an index definition.
@@ -275,3 +249,61 @@ type IndexColumn struct {
func IsMutationIndex(table Table, ord IndexOrdinal) bool {
return ord >= table.IndexCount()
}
+
+// Partition is an interface to a PARTITION BY LIST partition of an index. The
+// intended use is to support planning of scans or lookup joins that will use
+// locality optimized search. Locality optimized search can be planned when the
+// maximum number of rows returned by a scan or lookup join is known, but the
+// specific region in which the rows are located is unknown. In this case, the
+// optimizer will plan a scan or lookup join in which local nodes (i.e., nodes
+// in the gateway region) are searched for matching rows before remote nodes, in
+// the hope that the execution engine can avoid visiting remote nodes.
+type Partition interface {
+ // Name is the name of this partition.
+ Name() string
+
+ // Zone returns the zone which constrains placement of this partition's
+ // replicas. If this partition does not have an associated zone, the returned
+ // zone is empty, but non-nil.
+ Zone() Zone
+
+ // PartitionByListPrefixes returns the values of this partition. Specifically,
+ // it returns a list of tuples where each tuple contains values for a prefix
+ // of index columns (indicating the region of the index covered by this
+ // partition).
+ //
+ // Example:
+ //
+ // CREATE INDEX idx ON t(region,subregion,val) PARTITION BY LIST (region,subregion) (
+ // PARTITION westcoast VALUES IN (('us', 'seattle'), ('us', 'cali')),
+ // PARTITION us VALUES IN (('us', DEFAULT)),
+ // PARTITION eu VALUES IN (('eu', DEFAULT)),
+ // PARTITION default VALUES IN (DEFAULT)
+ // );
+ //
+ // If this is the westcoast partition, PartitionByListPrefixes() returns
+ // ('us', 'seattle'),
+ // ('us', 'cali')
+ //
+ // If this is the us partition, PartitionByListPrefixes() cuts off the DEFAULT
+ // value and just returns
+ // ('us')
+ //
+ // Finally, if this is the default partition, PartitionByListPrefixes()
+ // returns an empty slice.
+ //
+ // In addition to supporting locality optimized search as described above,
+ // this function can be used to support index skip scans. To support index
+ // skip scans, we collect the PartitionByListPrefixes for all partitions in
+ // the index. Each tuple corresponds to a region of the index that we can
+ // constrain further. In the example above: if we have a val=1 filter, instead
+ // of a full index scan we can skip most of the data under /us/cali and
+ // /us/seattle by scanning spans:
+ // [ - /us/cali )
+ // [ /us/cali/1 - /us/cali/1 ]
+ // [ /us/cali\x00 - /us/seattle )
+ // [ /us/seattle/1 - /us/seattle/1 ]
+ // [ /us/seattle\x00 - ]
+ //
+ PartitionByListPrefixes() []tree.Datums
+}
diff --git a/pkg/sql/opt/cat/utils.go b/pkg/sql/opt/cat/utils.go
index de8daed70b0a..bdef6921a8d0 100644
--- a/pkg/sql/opt/cat/utils.go
+++ b/pkg/sql/opt/cat/utils.go
@@ -218,16 +218,25 @@ func formatCatalogIndex(tab Table, ord int, tp treeprinter.Node) {
fmt.Fprintf(&buf, " (storing)")
}
+ if i < idx.ImplicitPartitioningColumnCount() {
+ fmt.Fprintf(&buf, " (implicit)")
+ }
+
child.Child(buf.String())
}
FormatZone(idx.Zone(), child)
- partPrefixes := idx.PartitionByListPrefixes()
- if len(partPrefixes) != 0 {
- c := child.Child("partition by list prefixes")
- for i := range partPrefixes {
- c.Child(partPrefixes[i].String())
+ if n := idx.PartitionCount(); n > 0 {
+ c := child.Child("partitions")
+ for i := 0; i < n; i++ {
+ p := idx.Partition(i)
+ part := c.Child(p.Name())
+ prefixes := part.Child("partition by list prefixes")
+ for _, datums := range p.PartitionByListPrefixes() {
+ prefixes.Child(datums.String())
+ }
+ FormatZone(p.Zone(), part)
}
}
if n := idx.InterleaveAncestorCount(); n > 0 {
diff --git a/pkg/sql/opt/cat/zone.go b/pkg/sql/opt/cat/zone.go
index 06d4f3e2a829..95fcfab40924 100644
--- a/pkg/sql/opt/cat/zone.go
+++ b/pkg/sql/opt/cat/zone.go
@@ -24,14 +24,22 @@ type Zone interface {
// ReplicaConstraintsCount returns the number of replica constraint sets that
// are part of this zone.
//
- // TODO(aayush): Go through the callers of the methods here and decide the
- // right semantics for handling the new `voter_constraints` attribute.
+ // TODO(aayush/rytaft): Go through the callers of the methods here and decide
+ // the right semantics for handling the new `voter_constraints` attribute.
ReplicaConstraintsCount() int
// ReplicaConstraints returns the ith set of replica constraints in the zone,
// where i < ReplicaConstraintsCount.
ReplicaConstraints(i int) ReplicaConstraints
+ // VoterConstraintsCount returns the number of voter replica constraint sets
+ // that are part of this zone.
+ VoterConstraintsCount() int
+
+ // VoterConstraint returns the ith set of voter replica constraints in the
+ // zone, where i < VoterConstraintsCount.
+ VoterConstraint(i int) ReplicaConstraints
+
// LeasePreferenceCount returns the number of lease preferences that are part
// of this zone.
LeasePreferenceCount() int
@@ -90,7 +98,8 @@ type Constraint interface {
// FormatZone nicely formats a catalog zone using a treeprinter for debugging
// and testing.
func FormatZone(zone Zone, tp treeprinter.Node) {
- if zone.ReplicaConstraintsCount() == 0 && zone.LeasePreferenceCount() == 0 {
+ if zone.ReplicaConstraintsCount() == 0 && zone.VoterConstraintsCount() == 0 &&
+ zone.LeasePreferenceCount() == 0 {
return
}
zoneChild := tp.Childf("ZONE")
@@ -110,6 +119,21 @@ func FormatZone(zone Zone, tp treeprinter.Node) {
}
}
+ voterChild := zoneChild
+ if zone.VoterConstraintsCount() > 1 {
+ voterChild = voterChild.Childf("voter replica constraints")
+ }
+ for i, n := 0, zone.VoterConstraintsCount(); i < n; i++ {
+ voterConstraint := zone.VoterConstraint(i)
+ constraintStr := formatConstraintSet(voterConstraint)
+ if zone.VoterConstraintsCount() > 1 {
+ numReplicas := voterConstraint.ReplicaCount()
+ replicaChild.Childf("%d voter replicas: %s", numReplicas, constraintStr)
+ } else {
+ replicaChild.Childf("voter constraints: %s", constraintStr)
+ }
+ }
+
leaseChild := zoneChild
if zone.LeasePreferenceCount() > 1 {
leaseChild = leaseChild.Childf("lease preferences")
diff --git a/pkg/sql/opt/testutils/testcat/create_table.go b/pkg/sql/opt/testutils/testcat/create_table.go
index 1953df5b2e21..9d0c07c39af1 100644
--- a/pkg/sql/opt/testutils/testcat/create_table.go
+++ b/pkg/sql/opt/testutils/testcat/create_table.go
@@ -12,6 +12,7 @@ package testcat
import (
"bytes"
+ "context"
"fmt"
"reflect"
"sort"
@@ -19,6 +20,7 @@ import (
"github.com/cockroachdb/cockroach/pkg/config/zonepb"
"github.com/cockroachdb/cockroach/pkg/geo/geoindex"
+ "github.com/cockroachdb/cockroach/pkg/settings/cluster"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/colinfo"
"github.com/cockroachdb/cockroach/pkg/sql/catalog/descpb"
"github.com/cockroachdb/cockroach/pkg/sql/opt/cat"
@@ -153,6 +155,11 @@ func (tc *Catalog) CreateTable(stmt *tree.CreateTable) *Table {
)
tab.Columns = append(tab.Columns, mvcc)
+ // Cache the partitioning statement for the primary index.
+ if stmt.PartitionByTable != nil {
+ tab.partitionBy = stmt.PartitionByTable.PartitionBy
+ }
+
// Add the primary index.
if hasPrimaryIndex {
for _, def := range stmt.Defs {
@@ -172,9 +179,6 @@ func (tc *Catalog) CreateTable(stmt *tree.CreateTable) *Table {
} else {
tab.addPrimaryColumnIndex("rowid")
}
- if stmt.PartitionByTable != nil {
- tab.Indexes[0].partitionBy = stmt.PartitionByTable.PartitionBy
- }
// Add check constraints.
for _, def := range stmt.Defs {
@@ -603,10 +607,6 @@ func (tt *Table) addIndexWithVersion(
version: version,
}
- if def.PartitionByIndex != nil {
- idx.partitionBy = def.PartitionByIndex.PartitionBy
- }
-
// Look for name suffixes indicating this is a mutation index.
if name, ok := extractWriteOnlyIndex(def); ok {
idx.IdxName = name
@@ -663,6 +663,44 @@ func (tt *Table) addIndexWithVersion(
}
}
+ // Add partitions.
+ var partitionBy *tree.PartitionBy
+ if def.PartitionByIndex != nil {
+ partitionBy = def.PartitionByIndex.PartitionBy
+ } else if typ == primaryIndex {
+ partitionBy = tt.partitionBy
+ }
+ if partitionBy != nil {
+ ctx := context.Background()
+ semaCtx := tree.MakeSemaContext()
+ evalCtx := tree.MakeTestingEvalContext(cluster.MakeTestingClusterSettings())
+
+ if len(partitionBy.List) > 0 {
+ idx.partitions = make([]Partition, len(partitionBy.List))
+ for i := range partitionBy.Fields {
+ if i >= len(idx.Columns) || partitionBy.Fields[i] != idx.Columns[i].ColName() {
+ panic("partition by columns must be a prefix of the index columns")
+ }
+ }
+ for i := range partitionBy.List {
+ p := &partitionBy.List[i]
+ idx.partitions[i] = Partition{
+ name: string(p.Name),
+ zone: &zonepb.ZoneConfig{},
+ datums: make([]tree.Datums, 0, len(p.Exprs)),
+ }
+
+ // Get the partition values.
+ for _, e := range p.Exprs {
+ d := idx.partitionByListExprToDatums(ctx, &evalCtx, &semaCtx, e)
+ if d != nil {
+ idx.partitions[i].datums = append(idx.partitions[i].datums, d)
+ }
+ }
+ }
+ }
+ }
+
if typ == primaryIndex {
var pkOrdinals util.FastIntSet
for _, c := range idx.Columns {
@@ -946,6 +984,47 @@ func (tt *Table) addPrimaryColumnIndex(colName string) {
tt.addIndex(&def, primaryIndex)
}
+// partitionByListExprToDatums converts an expression from a PARTITION BY LIST
+// clause to a list of datums.
+func (ti *Index) partitionByListExprToDatums(
+ ctx context.Context, evalCtx *tree.EvalContext, semaCtx *tree.SemaContext, e tree.Expr,
+) tree.Datums {
+ var vals []tree.Expr
+ switch t := e.(type) {
+ case *tree.Tuple:
+ vals = t.Exprs
+ default:
+ vals = []tree.Expr{e}
+ }
+
+ // Cut off at DEFAULT, if present.
+ for i := range vals {
+ if _, ok := vals[i].(tree.DefaultVal); ok {
+ vals = vals[:i]
+ }
+ }
+ if len(vals) == 0 {
+ return nil
+ }
+ d := make(tree.Datums, len(vals))
+ for i := range vals {
+ c := tree.CastExpr{Expr: vals[i], Type: ti.Columns[i].DatumType()}
+ cTyped, err := c.TypeCheck(ctx, semaCtx, types.Any)
+ if err != nil {
+ panic(err)
+ }
+ d[i], err = cTyped.Eval(evalCtx)
+ if err != nil {
+ panic(err)
+ }
+ }
+
+ // TODO(radu): split into multiple prefixes if Subpartition is also by list.
+ // Note that this functionality should be kept in sync with the real catalog
+ // implementation (opt_catalog.go).
+ return d
+}
+
func extractInaccessibleColumn(def *tree.ColumnTableDef) (name tree.Name, ok bool) {
if !strings.HasSuffix(string(def.Name), ":inaccessible") {
return "", false
diff --git a/pkg/sql/opt/testutils/testcat/set_zone_config.go b/pkg/sql/opt/testutils/testcat/set_zone_config.go
index 986e59cbb859..adccbf28cb34 100644
--- a/pkg/sql/opt/testutils/testcat/set_zone_config.go
+++ b/pkg/sql/opt/testutils/testcat/set_zone_config.go
@@ -26,6 +26,37 @@ func (tc *Catalog) SetZoneConfig(stmt *tree.SetZoneConfig) *zonepb.ZoneConfig {
tc.qualifyTableName(&tabName)
tab := tc.Table(&tabName)
+ // Handle the case of a zone config targeting a partition.
+ if stmt.TargetsPartition() {
+ partitionName := string(stmt.Partition)
+ var index *Index
+ if stmt.TableOrIndex.Index == "" {
+ // This partition is in the primary index.
+ index = tab.Indexes[0]
+ } else {
+ // This partition is in a secondary index.
+ for _, idx := range tab.Indexes {
+ if idx.IdxName == string(stmt.TableOrIndex.Index) {
+ index = idx
+ break
+ }
+ }
+ }
+ if index == nil {
+ panic(fmt.Errorf("\"%q\" is not an index", stmt.TableOrIndex.Index))
+ }
+
+ for i := range index.partitions {
+ if index.partitions[i].name == partitionName {
+ index.partitions[i].zone = makeZoneConfig(stmt.Options)
+ return index.partitions[i].zone
+ }
+ }
+ panic(fmt.Errorf("\"%q\" is not a partition", stmt.Partition))
+ }
+
+ // The zone config must target an entire index.
+
// Handle special case of primary index.
if stmt.TableOrIndex.Index == "" {
tab.Indexes[0].IdxZone = makeZoneConfig(stmt.Options)
@@ -55,6 +86,14 @@ func makeZoneConfig(options tree.KVOptions) *zonepb.ZoneConfig {
}
zone.Constraints = constraintsList.Constraints
+ case "voter_constraints":
+ constraintsList := &zonepb.ConstraintsList{}
+ value := options[i].Value.(*tree.StrVal).RawString()
+ if err := yaml.UnmarshalStrict([]byte(value), constraintsList); err != nil {
+ panic(err)
+ }
+ zone.VoterConstraints = constraintsList.Constraints
+
case "lease_preferences":
value := options[i].Value.(*tree.StrVal).RawString()
if err := yaml.UnmarshalStrict([]byte(value), &zone.LeasePreferences); err != nil {
diff --git a/pkg/sql/opt/testutils/testcat/test_catalog.go b/pkg/sql/opt/testutils/testcat/test_catalog.go
index 84d53fb65e3a..1ae7acd7f8a5 100644
--- a/pkg/sql/opt/testutils/testcat/test_catalog.go
+++ b/pkg/sql/opt/testutils/testcat/test_catalog.go
@@ -597,6 +597,10 @@ type Table struct {
inboundFKs []ForeignKeyConstraint
uniqueConstraints []UniqueConstraint
+
+ // partitionBy is the partitioning clause that corresponds to the primary
+ // index. Used to initialize the partitioning for the primary index.
+ partitionBy *tree.PartitionBy
}
var _ cat.Table = &Table{}
@@ -781,9 +785,9 @@ type Index struct {
// table is a back reference to the table this index is on.
table *Table
- // partitionBy is the partitioning clause that corresponds to this index. Used
- // to implement PartitionByListPrefixes.
- partitionBy *tree.PartitionBy
+ // partitions stores zone information and datums for PARTITION BY LIST
+ // partitions.
+ partitions []Partition
// predicate is the partial index predicate expression, if it exists.
predicate string
@@ -883,67 +887,6 @@ func (ti *Index) Predicate() (string, bool) {
return ti.predicate, ti.predicate != ""
}
-// PartitionByListPrefixes is part of the cat.Index interface.
-func (ti *Index) PartitionByListPrefixes() []tree.Datums {
- ctx := context.Background()
- p := ti.partitionBy
- if p == nil {
- return nil
- }
- if len(p.List) == 0 {
- return nil
- }
- var res []tree.Datums
- semaCtx := tree.MakeSemaContext()
- evalCtx := tree.MakeTestingEvalContext(cluster.MakeTestingClusterSettings())
- for i := range p.Fields {
- if i >= len(ti.Columns) || p.Fields[i] != ti.Columns[i].ColName() {
- panic("partition by columns must be a prefix of the index columns")
- }
- }
- for i := range p.List {
- // Exprs contains a list of values.
- for _, e := range p.List[i].Exprs {
- var vals []tree.Expr
- switch t := e.(type) {
- case *tree.Tuple:
- vals = t.Exprs
- default:
- vals = []tree.Expr{e}
- }
-
- // Cut off at DEFAULT, if present.
- for i := range vals {
- if _, ok := vals[i].(tree.DefaultVal); ok {
- vals = vals[:i]
- }
- }
- if len(vals) == 0 {
- continue
- }
- d := make(tree.Datums, len(vals))
- for i := range vals {
- c := tree.CastExpr{Expr: vals[i], Type: ti.Columns[i].DatumType()}
- cTyped, err := c.TypeCheck(ctx, &semaCtx, types.Any)
- if err != nil {
- panic(err)
- }
- d[i], err = cTyped.Eval(&evalCtx)
- if err != nil {
- panic(err)
- }
- }
-
- // TODO(radu): split into multiple prefixes if Subpartition is also by list.
- // Note that this functionality should be kept in sync with the real catalog
- // implementation (opt_catalog.go).
-
- res = append(res, d)
- }
- }
- return res
-}
-
// ImplicitPartitioningColumnCount is part of the cat.Index interface.
func (ti *Index) ImplicitPartitioningColumnCount() int {
return 0
@@ -979,6 +922,40 @@ func (ti *Index) Version() descpb.IndexDescriptorVersion {
return ti.version
}
+// PartitionCount is part of the cat.Index interface.
+func (ti *Index) PartitionCount() int {
+ return len(ti.partitions)
+}
+
+// Partition is part of the cat.Index interface.
+func (ti *Index) Partition(i int) cat.Partition {
+ return &ti.partitions[i]
+}
+
+// Partition implements the cat.Partition interface for testing purposes.
+type Partition struct {
+ name string
+ zone *zonepb.ZoneConfig
+ datums []tree.Datums
+}
+
+var _ cat.Partition = &Partition{}
+
+// Name is part of the cat.Partition interface.
+func (p *Partition) Name() string {
+ return p.name
+}
+
+// Zone is part of the cat.Partition interface.
+func (p *Partition) Zone() cat.Zone {
+ return p.zone
+}
+
+// PartitionByListPrefixes is part of the cat.Partition interface.
+func (p *Partition) PartitionByListPrefixes() []tree.Datums {
+ return p.datums
+}
+
// TableStat implements the cat.TableStatistic interface for testing purposes.
type TableStat struct {
js stats.JSONStatistic
diff --git a/pkg/sql/opt/testutils/testcat/testdata/table b/pkg/sql/opt/testutils/testcat/testdata/table
index 58a93711d6ad..c5e4c609789b 100644
--- a/pkg/sql/opt/testutils/testcat/testdata/table
+++ b/pkg/sql/opt/testutils/testcat/testdata/table
@@ -110,11 +110,17 @@ TABLE part1
├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
└── PRIMARY INDEX primary
├── a int not null
- └── partition by list prefixes
- ├── (1)
- ├── (3)
- ├── (4)
- └── (5)
+ └── partitions
+ ├── p1
+ │ └── partition by list prefixes
+ │ └── (1)
+ ├── p2
+ │ └── partition by list prefixes
+ │ ├── (3)
+ │ ├── (4)
+ │ └── (5)
+ └── p3
+ └── partition by list prefixes
exec-ddl
CREATE TABLE part2 (
@@ -145,19 +151,29 @@ TABLE part2
│ ├── a string not null
│ ├── b string not null
│ ├── c int not null
- │ └── partition by list prefixes
- │ ├── ('foo', 'bar')
- │ ├── ('foo', 'baz')
- │ ├── ('qux', 'qux')
- │ └── ('waldo')
+ │ └── partitions
+ │ ├── p1
+ │ │ └── partition by list prefixes
+ │ │ ├── ('foo', 'bar')
+ │ │ ├── ('foo', 'baz')
+ │ │ └── ('qux', 'qux')
+ │ ├── p2
+ │ │ └── partition by list prefixes
+ │ │ └── ('waldo')
+ │ └── p3
+ │ └── partition by list prefixes
└── INDEX secondary
├── c int not null
├── a string not null
├── b string not null
- └── partition by list prefixes
- ├── (1)
- ├── (3)
- └── (4)
+ └── partitions
+ ├── pi1
+ │ └── partition by list prefixes
+ │ └── (1)
+ └── pi2
+ └── partition by list prefixes
+ ├── (3)
+ └── (4)
exec-ddl
CREATE TABLE inv (
diff --git a/pkg/sql/opt/testutils/testcat/testdata/zone b/pkg/sql/opt/testutils/testcat/testdata/zone
index 4015e32d9ef5..3315e06176aa 100644
--- a/pkg/sql/opt/testutils/testcat/testdata/zone
+++ b/pkg/sql/opt/testutils/testcat/testdata/zone
@@ -175,3 +175,78 @@ TABLE abc
├── a int not null (storing)
└── ZONE
└── constraints: [+dc=west]
+
+exec-ddl
+CREATE TABLE abc_part (
+ r STRING NOT NULL CHECK (r IN ('east', 'west')),
+ a INT PRIMARY KEY,
+ b INT,
+ c STRING,
+ UNIQUE WITHOUT INDEX (b, c),
+ UNIQUE INDEX bc_idx (r, b, c) PARTITION BY LIST (r) (
+ PARTITION east VALUES IN (('east')),
+ PARTITION west VALUES IN (('west'))
+ ),
+ INDEX b_idx (r, b) PARTITION BY LIST (r) (
+ PARTITION east VALUES IN (('east')),
+ PARTITION west VALUES IN (('west'))
+ )
+)
+----
+
+exec-ddl
+ALTER PARTITION "east" OF INDEX abc_part@bc_idx CONFIGURE ZONE USING
+ num_voters = 5,
+ voter_constraints = '{+region=east: 2}',
+ lease_preferences = '[[+region=east]]'
+----
+
+exec-ddl
+ALTER PARTITION "west" OF INDEX abc_part@bc_idx CONFIGURE ZONE USING
+ num_voters = 5,
+ voter_constraints = '{+region=west: 2}',
+ lease_preferences = '[[+region=west]]';
+----
+
+exec-ddl
+SHOW CREATE abc_part
+----
+TABLE abc_part
+ ├── r string not null
+ ├── a int not null
+ ├── b int
+ ├── c string
+ ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
+ ├── CHECK (r IN ('east', 'west'))
+ ├── PRIMARY INDEX primary
+ │ └── a int not null
+ ├── UNIQUE INDEX bc_idx
+ │ ├── r string not null
+ │ ├── b int
+ │ ├── c string
+ │ ├── a int not null (storing)
+ │ └── partitions
+ │ ├── east
+ │ │ ├── partition by list prefixes
+ │ │ │ └── ('east')
+ │ │ └── ZONE
+ │ │ ├── voter constraints: [+region=east]
+ │ │ └── lease preference: [+region=east]
+ │ └── west
+ │ ├── partition by list prefixes
+ │ │ └── ('west')
+ │ └── ZONE
+ │ ├── voter constraints: [+region=west]
+ │ └── lease preference: [+region=west]
+ ├── INDEX b_idx
+ │ ├── r string not null
+ │ ├── b int
+ │ ├── a int not null
+ │ └── partitions
+ │ ├── east
+ │ │ └── partition by list prefixes
+ │ │ └── ('east')
+ │ └── west
+ │ └── partition by list prefixes
+ │ └── ('west')
+ └── UNIQUE WITHOUT INDEX (b, c)
diff --git a/pkg/sql/opt/xform/select_funcs.go b/pkg/sql/opt/xform/select_funcs.go
index 93904be665b9..3619932aec84 100644
--- a/pkg/sql/opt/xform/select_funcs.go
+++ b/pkg/sql/opt/xform/select_funcs.go
@@ -636,7 +636,10 @@ func (c *CustomFuncs) partitionValuesFilters(
) (partitionFilter, inBetweenFilter memo.FiltersExpr) {
// Find all the partition values
- partitionValues := index.PartitionByListPrefixes()
+ partitionValues := make([]tree.Datums, 0, index.PartitionCount())
+ for i, n := 0, index.PartitionCount(); i < n; i++ {
+ partitionValues = append(partitionValues, index.Partition(i).PartitionByListPrefixes()...)
+ }
if len(partitionValues) == 0 {
return partitionFilter, inBetweenFilter
}
diff --git a/pkg/sql/opt_catalog.go b/pkg/sql/opt_catalog.go
index 9c10354fbfb2..ce2848793681 100644
--- a/pkg/sql/opt_catalog.go
+++ b/pkg/sql/opt_catalog.go
@@ -738,16 +738,25 @@ func newOptTable(
idxDesc = secondaryIndexes[i-1].IndexDesc()
}
- // If there is a subzone that applies to the entire index, use that,
- // else use the table zone. Skip subzones that apply to partitions,
- // since they apply only to a subset of the index.
+ // If there is a subzone that applies to the entire index, use that, else
+ // use the table zone. Save subzones that apply to partitions, since we will
+ // use those later when initializing partitions in the index.
idxZone := tblZone
+ partZones := make(map[string]*zonepb.ZoneConfig)
for j := range tblZone.Subzones {
subzone := &tblZone.Subzones[j]
- if subzone.IndexID == uint32(idxDesc.ID) && subzone.PartitionName == "" {
- copyZone := subzone.Config
- copyZone.InheritFromParent(tblZone)
- idxZone = ©Zone
+ if subzone.IndexID == uint32(idxDesc.ID) {
+ if subzone.PartitionName == "" {
+ // Subzone applies to the whole index.
+ copyZone := subzone.Config
+ copyZone.InheritFromParent(tblZone)
+ idxZone = ©Zone
+ } else {
+ // Subzone applies to a partition.
+ copyZone := subzone.Config
+ copyZone.InheritFromParent(tblZone)
+ partZones[subzone.PartitionName] = ©Zone
+ }
}
}
if idxDesc.Type == descpb.IndexDescriptor_INVERTED {
@@ -770,9 +779,9 @@ func newOptTable(
false, /* nullable */
invertedSourceColOrdinal,
)
- ot.indexes[i].init(ot, i, idxDesc, idxZone, virtualColOrd)
+ ot.indexes[i].init(ot, i, idxDesc, idxZone, partZones, virtualColOrd)
} else {
- ot.indexes[i].init(ot, i, idxDesc, idxZone, -1 /* virtualColOrd */)
+ ot.indexes[i].init(ot, i, idxDesc, idxZone, partZones, -1 /* virtualColOrd */)
}
// Add unique constraints for implicitly partitioned unique indexes.
@@ -1108,6 +1117,10 @@ type optIndex struct {
numKeyCols int
numLaxKeyCols int
+ // partitions stores zone information and datums for PARTITION BY LIST
+ // partitions.
+ partitions []optPartition
+
// invertedVirtualColOrd is used if this is an inverted index; it stores the
// ordinal of the virtual column created to refer to the key of this index.
// It is -1 if this is not an inverted index.
@@ -1123,6 +1136,7 @@ func (oi *optIndex) init(
indexOrdinal int,
desc *descpb.IndexDescriptor,
zone *zonepb.ZoneConfig,
+ partZones map[string]*zonepb.ZoneConfig,
invertedVirtualColOrd int,
) {
oi.tab = tab
@@ -1152,6 +1166,38 @@ func (oi *optIndex) init(
oi.numCols = len(desc.ColumnIDs) + len(desc.ExtraColumnIDs) + len(desc.StoreColumnIDs)
}
+ // Collect information about the partitions.
+ oi.partitions = make([]optPartition, len(desc.Partitioning.List))
+ for i := range desc.Partitioning.List {
+ p := &desc.Partitioning.List[i]
+ oi.partitions[i] = optPartition{
+ name: p.Name,
+ zone: &zonepb.ZoneConfig{},
+ datums: make([]tree.Datums, 0, len(p.Values)),
+ }
+
+ // Get the zone.
+ if zone, ok := partZones[p.Name]; ok {
+ oi.partitions[i].zone = zone
+ }
+
+ // Get the partition values.
+ var a rowenc.DatumAlloc
+ for _, valueEncBuf := range p.Values {
+ t, _, err := rowenc.DecodePartitionTuple(
+ &a, oi.tab.codec, oi.tab.desc, oi.desc, &oi.desc.Partitioning,
+ valueEncBuf, nil, /* prefixDatums */
+ )
+ if err != nil {
+ panic(errors.NewAssertionErrorWithWrappedErrf(err, "while decoding partition tuple"))
+ }
+ oi.partitions[i].datums = append(oi.partitions[i].datums, t.Datums)
+ // TODO(radu): split into multiple prefixes if Subpartition is also by list.
+ // Note that this functionality should be kept in sync with the test catalog
+ // implementation (test_catalog.go).
+ }
+ }
+
if desc.Unique {
notNull := true
for _, id := range desc.ColumnIDs {
@@ -1296,35 +1342,6 @@ func (oi *optIndex) Ordinal() int {
return oi.indexOrdinal
}
-// PartitionByListPrefixes is part of the cat.Index interface.
-func (oi *optIndex) PartitionByListPrefixes() []tree.Datums {
- list := oi.desc.Partitioning.List
- if len(list) == 0 {
- return nil
- }
- res := make([]tree.Datums, 0, len(list))
- var a rowenc.DatumAlloc
- for i := range list {
- for _, valueEncBuf := range list[i].Values {
- t, _, err := rowenc.DecodePartitionTuple(
- &a, oi.tab.codec, oi.tab.desc, oi.desc, &oi.desc.Partitioning,
- valueEncBuf, nil, /* prefixDatums */
- )
- if err != nil {
- panic(errors.NewAssertionErrorWithWrappedErrf(err, "while decoding partition tuple"))
- }
- // Ignore the DEFAULT case, where there is nothing to return.
- if len(t.Datums) > 0 {
- res = append(res, t.Datums)
- }
- // TODO(radu): split into multiple prefixes if Subpartition is also by list.
- // Note that this functionality should be kept in sync with the test catalog
- // implementation (test_catalog.go).
- }
- }
- return res
-}
-
// ImplicitPartitioningColumnCount is part of the cat.Index interface.
func (oi *optIndex) ImplicitPartitioningColumnCount() int {
return int(oi.desc.Partitioning.NumImplicitColumns)
@@ -1362,6 +1379,41 @@ func (oi *optIndex) Version() descpb.IndexDescriptorVersion {
return oi.desc.Version
}
+// PartitionCount is part of the cat.Index interface.
+func (oi *optIndex) PartitionCount() int {
+ return len(oi.partitions)
+}
+
+// Partition is part of the cat.Index interface.
+func (oi *optIndex) Partition(i int) cat.Partition {
+ return &oi.partitions[i]
+}
+
+// optPartition implements cat.Partition and represents a PARTITION BY LIST
+// partition of an index.
+type optPartition struct {
+ name string
+ zone *zonepb.ZoneConfig
+ datums []tree.Datums
+}
+
+var _ cat.Partition = &optPartition{}
+
+// Name is part of the cat.Partition interface.
+func (op *optPartition) Name() string {
+ return op.name
+}
+
+// Zone is part of the cat.Partition interface.
+func (op *optPartition) Zone() cat.Zone {
+ return op.zone
+}
+
+// PartitionByListPrefixes is part of the cat.Partition interface.
+func (op *optPartition) PartitionByListPrefixes() []tree.Datums {
+ return op.datums
+}
+
type optTableStat struct {
stat *stats.TableStatistic
columnOrdinals []int
@@ -2042,11 +2094,6 @@ func (oi *optVirtualIndex) Ordinal() int {
return oi.indexOrdinal
}
-// PartitionByListPrefixes is part of the cat.Index interface.
-func (oi *optVirtualIndex) PartitionByListPrefixes() []tree.Datums {
- return nil
-}
-
// ImplicitPartitioningColumnCount is part of the cat.Index interface.
func (oi *optVirtualIndex) ImplicitPartitioningColumnCount() int {
return 0
@@ -2082,6 +2129,16 @@ func (oi *optVirtualIndex) Version() descpb.IndexDescriptorVersion {
return 0
}
+// PartitionCount is part of the cat.Index interface.
+func (oi *optVirtualIndex) PartitionCount() int {
+ return 0
+}
+
+// Partition is part of the cat.Index interface.
+func (oi *optVirtualIndex) Partition(i int) cat.Partition {
+ return nil
+}
+
// optVirtualFamily is a dummy implementation of cat.Family for the only family
// reported by a virtual table.
type optVirtualFamily struct {
diff --git a/pkg/sql/sem/builtins/builtins.go b/pkg/sql/sem/builtins/builtins.go
index b25ea2527c24..ca74ee73b01e 100644
--- a/pkg/sql/sem/builtins/builtins.go
+++ b/pkg/sql/sem/builtins/builtins.go
@@ -2734,6 +2734,31 @@ may increase either contention or retry errors, or both.`,
},
),
+ // parse_timestamp converts strings to timestamps. It is useful in expressions
+ // where casts (which are not immutable) cannot be used, like computed column
+ // expressions or partial index predicates. Only absolute timestamps that do
+ // not depend on the current context are supported (relative timestamps like
+ // 'now' are not supported).
+ "parse_timestamp": makeBuiltin(defProps(),
+ tree.Overload{
+ Types: tree.ArgTypes{{"string", types.String}},
+ ReturnType: tree.FixedReturnType(types.Timestamp),
+ Fn: func(ctx *tree.EvalContext, args tree.Datums) (tree.Datum, error) {
+ arg := string(tree.MustBeDString(args[0]))
+ ts, dependsOnContext, err := tree.ParseDTimestamp(ctx, arg, time.Microsecond)
+ if err != nil {
+ return nil, err
+ }
+ if dependsOnContext {
+ return nil, pgerror.Newf(pgcode.InvalidParameterValue, "relative timestamps are not supported")
+ }
+ return ts, nil
+ },
+ Info: "Convert a string containing an absolute timestamp to the corresponding timestamp.",
+ Volatility: tree.VolatilityImmutable,
+ },
+ ),
+
// Array functions.
"string_to_array": makeBuiltin(arrayPropsNullableArgs(),
diff --git a/pkg/storage/enginepb/mvcc3.go b/pkg/storage/enginepb/mvcc3.go
index b03c00ca9bce..1cb6924095d5 100644
--- a/pkg/storage/enginepb/mvcc3.go
+++ b/pkg/storage/enginepb/mvcc3.go
@@ -30,6 +30,11 @@ func (ms *MVCCPersistentStats) ToStats() MVCCStats {
return MVCCStats(*ms)
}
+// ToStatsPtr converts the receiver to a *MVCCStats.
+func (ms *MVCCPersistentStats) ToStatsPtr() *MVCCStats {
+ return (*MVCCStats)(ms)
+}
+
// SafeValue implements the redact.SafeValue interface.
func (ms *MVCCStats) SafeValue() {}
diff --git a/pkg/storage/enginepb/mvcc3.pb.go b/pkg/storage/enginepb/mvcc3.pb.go
index 8d61e5cafc58..def873b63b77 100644
--- a/pkg/storage/enginepb/mvcc3.pb.go
+++ b/pkg/storage/enginepb/mvcc3.pb.go
@@ -129,7 +129,7 @@ type TxnMeta struct {
func (m *TxnMeta) Reset() { *m = TxnMeta{} }
func (*TxnMeta) ProtoMessage() {}
func (*TxnMeta) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{0}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{0}
}
func (m *TxnMeta) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -165,7 +165,7 @@ func (m *IgnoredSeqNumRange) Reset() { *m = IgnoredSeqNumRange{} }
func (m *IgnoredSeqNumRange) String() string { return proto.CompactTextString(m) }
func (*IgnoredSeqNumRange) ProtoMessage() {}
func (*IgnoredSeqNumRange) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{1}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{1}
}
func (m *IgnoredSeqNumRange) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -216,7 +216,7 @@ func (m *MVCCStatsDelta) Reset() { *m = MVCCStatsDelta{} }
func (m *MVCCStatsDelta) String() string { return proto.CompactTextString(m) }
func (*MVCCStatsDelta) ProtoMessage() {}
func (*MVCCStatsDelta) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{2}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{2}
}
func (m *MVCCStatsDelta) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -268,7 +268,7 @@ func (m *MVCCPersistentStats) Reset() { *m = MVCCPersistentStats{} }
func (m *MVCCPersistentStats) String() string { return proto.CompactTextString(m) }
func (*MVCCPersistentStats) ProtoMessage() {}
func (*MVCCPersistentStats) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{3}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{3}
}
func (m *MVCCPersistentStats) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -307,13 +307,25 @@ type RangeAppliedState struct {
// range_stats is the set of mvcc stats that accounts for the current value
// of the Raft state machine.
RangeStats MVCCPersistentStats `protobuf:"bytes,3,opt,name=range_stats,json=rangeStats,proto3" json:"range_stats"`
+ // closed_timestamp is the largest timestamp that is known to have been closed
+ // as of this lease applied index. This means that the current leaseholder (if
+ // any) and any future leaseholder will not evaluate writes at or below this
+ // timestamp, and also that any in-flight commands that can still apply are
+ // writing at higher timestamps. Non-leaseholder replicas are free to serve
+ // "follower reads" at or below this timestamp.
+ //
+ // TODO(andrei): Make this field not-nullable in 21.2, once all the ranges
+ // have a closed timestamp applied to their state (this might need a
+ // migration). In 21.1 we cannot write empty timestamp to disk because that
+ // looks like an inconsistency to the consistency-checker.
+ ClosedTimestamp *hlc.Timestamp `protobuf:"bytes,4,opt,name=closed_timestamp,json=closedTimestamp,proto3" json:"closed_timestamp,omitempty"`
}
func (m *RangeAppliedState) Reset() { *m = RangeAppliedState{} }
func (m *RangeAppliedState) String() string { return proto.CompactTextString(m) }
func (*RangeAppliedState) ProtoMessage() {}
func (*RangeAppliedState) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{4}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{4}
}
func (m *RangeAppliedState) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -351,7 +363,7 @@ func (m *MVCCWriteValueOp) Reset() { *m = MVCCWriteValueOp{} }
func (m *MVCCWriteValueOp) String() string { return proto.CompactTextString(m) }
func (*MVCCWriteValueOp) ProtoMessage() {}
func (*MVCCWriteValueOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{5}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{5}
}
func (m *MVCCWriteValueOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -389,7 +401,7 @@ func (m *MVCCWriteIntentOp) Reset() { *m = MVCCWriteIntentOp{} }
func (m *MVCCWriteIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCWriteIntentOp) ProtoMessage() {}
func (*MVCCWriteIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{6}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{6}
}
func (m *MVCCWriteIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -425,7 +437,7 @@ func (m *MVCCUpdateIntentOp) Reset() { *m = MVCCUpdateIntentOp{} }
func (m *MVCCUpdateIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCUpdateIntentOp) ProtoMessage() {}
func (*MVCCUpdateIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{7}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{7}
}
func (m *MVCCUpdateIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -464,7 +476,7 @@ func (m *MVCCCommitIntentOp) Reset() { *m = MVCCCommitIntentOp{} }
func (m *MVCCCommitIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCCommitIntentOp) ProtoMessage() {}
func (*MVCCCommitIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{8}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{8}
}
func (m *MVCCCommitIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -504,7 +516,7 @@ func (m *MVCCAbortIntentOp) Reset() { *m = MVCCAbortIntentOp{} }
func (m *MVCCAbortIntentOp) String() string { return proto.CompactTextString(m) }
func (*MVCCAbortIntentOp) ProtoMessage() {}
func (*MVCCAbortIntentOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{9}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{9}
}
func (m *MVCCAbortIntentOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -540,7 +552,7 @@ func (m *MVCCAbortTxnOp) Reset() { *m = MVCCAbortTxnOp{} }
func (m *MVCCAbortTxnOp) String() string { return proto.CompactTextString(m) }
func (*MVCCAbortTxnOp) ProtoMessage() {}
func (*MVCCAbortTxnOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{10}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{10}
}
func (m *MVCCAbortTxnOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -579,7 +591,7 @@ func (m *MVCCLogicalOp) Reset() { *m = MVCCLogicalOp{} }
func (m *MVCCLogicalOp) String() string { return proto.CompactTextString(m) }
func (*MVCCLogicalOp) ProtoMessage() {}
func (*MVCCLogicalOp) Descriptor() ([]byte, []int) {
- return fileDescriptor_mvcc3_91ae80d2fc45e9ad, []int{11}
+ return fileDescriptor_mvcc3_ed774bd3b5c68109, []int{11}
}
func (m *MVCCLogicalOp) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -811,6 +823,9 @@ func (this *RangeAppliedState) Equal(that interface{}) bool {
if !this.RangeStats.Equal(&that1.RangeStats) {
return false
}
+ if !this.ClosedTimestamp.Equal(that1.ClosedTimestamp) {
+ return false
+ }
return true
}
func (m *TxnMeta) Marshal() (dAtA []byte, err error) {
@@ -1143,6 +1158,16 @@ func (m *RangeAppliedState) MarshalTo(dAtA []byte) (int, error) {
return 0, err
}
i += n4
+ if m.ClosedTimestamp != nil {
+ dAtA[i] = 0x22
+ i++
+ i = encodeVarintMvcc3(dAtA, i, uint64(m.ClosedTimestamp.Size()))
+ n5, err := m.ClosedTimestamp.MarshalTo(dAtA[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n5
+ }
return i, nil
}
@@ -1170,11 +1195,11 @@ func (m *MVCCWriteValueOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x12
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n5, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n6, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n5
+ i += n6
if len(m.Value) > 0 {
dAtA[i] = 0x1a
i++
@@ -1208,11 +1233,11 @@ func (m *MVCCWriteIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n6, err := m.TxnID.MarshalTo(dAtA[i:])
+ n7, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n6
+ i += n7
if len(m.TxnKey) > 0 {
dAtA[i] = 0x12
i++
@@ -1222,19 +1247,19 @@ func (m *MVCCWriteIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n7, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n8, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n7
+ i += n8
dAtA[i] = 0x22
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnMinTimestamp.Size()))
- n8, err := m.TxnMinTimestamp.MarshalTo(dAtA[i:])
+ n9, err := m.TxnMinTimestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n8
+ i += n9
return i, nil
}
@@ -1256,19 +1281,19 @@ func (m *MVCCUpdateIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n9, err := m.TxnID.MarshalTo(dAtA[i:])
+ n10, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n9
+ i += n10
dAtA[i] = 0x12
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n10, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n11, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n10
+ i += n11
return i, nil
}
@@ -1290,11 +1315,11 @@ func (m *MVCCCommitIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n11, err := m.TxnID.MarshalTo(dAtA[i:])
+ n12, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n11
+ i += n12
if len(m.Key) > 0 {
dAtA[i] = 0x12
i++
@@ -1304,11 +1329,11 @@ func (m *MVCCCommitIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x1a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.Timestamp.Size()))
- n12, err := m.Timestamp.MarshalTo(dAtA[i:])
+ n13, err := m.Timestamp.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n12
+ i += n13
if len(m.Value) > 0 {
dAtA[i] = 0x22
i++
@@ -1342,11 +1367,11 @@ func (m *MVCCAbortIntentOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n13, err := m.TxnID.MarshalTo(dAtA[i:])
+ n14, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n13
+ i += n14
return i, nil
}
@@ -1368,11 +1393,11 @@ func (m *MVCCAbortTxnOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.TxnID.Size()))
- n14, err := m.TxnID.MarshalTo(dAtA[i:])
+ n15, err := m.TxnID.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n14
+ i += n15
return i, nil
}
@@ -1395,61 +1420,61 @@ func (m *MVCCLogicalOp) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0xa
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.WriteValue.Size()))
- n15, err := m.WriteValue.MarshalTo(dAtA[i:])
+ n16, err := m.WriteValue.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n15
+ i += n16
}
if m.WriteIntent != nil {
dAtA[i] = 0x12
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.WriteIntent.Size()))
- n16, err := m.WriteIntent.MarshalTo(dAtA[i:])
+ n17, err := m.WriteIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n16
+ i += n17
}
if m.UpdateIntent != nil {
dAtA[i] = 0x1a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.UpdateIntent.Size()))
- n17, err := m.UpdateIntent.MarshalTo(dAtA[i:])
+ n18, err := m.UpdateIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n17
+ i += n18
}
if m.CommitIntent != nil {
dAtA[i] = 0x22
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.CommitIntent.Size()))
- n18, err := m.CommitIntent.MarshalTo(dAtA[i:])
+ n19, err := m.CommitIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n18
+ i += n19
}
if m.AbortIntent != nil {
dAtA[i] = 0x2a
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.AbortIntent.Size()))
- n19, err := m.AbortIntent.MarshalTo(dAtA[i:])
+ n20, err := m.AbortIntent.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n19
+ i += n20
}
if m.AbortTxn != nil {
dAtA[i] = 0x32
i++
i = encodeVarintMvcc3(dAtA, i, uint64(m.AbortTxn.Size()))
- n20, err := m.AbortTxn.MarshalTo(dAtA[i:])
+ n21, err := m.AbortTxn.MarshalTo(dAtA[i:])
if err != nil {
return 0, err
}
- i += n20
+ i += n21
}
return i, nil
}
@@ -1585,6 +1610,9 @@ func NewPopulatedRangeAppliedState(r randyMvcc3, easy bool) *RangeAppliedState {
this.LeaseAppliedIndex = uint64(uint64(r.Uint32()))
v5 := NewPopulatedMVCCPersistentStats(r, easy)
this.RangeStats = *v5
+ if r.Intn(10) != 0 {
+ this.ClosedTimestamp = hlc.NewPopulatedTimestamp(r, easy)
+ }
if !easy && r.Intn(10) != 0 {
}
return this
@@ -1833,6 +1861,10 @@ func (m *RangeAppliedState) Size() (n int) {
}
l = m.RangeStats.Size()
n += 1 + l + sovMvcc3(uint64(l))
+ if m.ClosedTimestamp != nil {
+ l = m.ClosedTimestamp.Size()
+ n += 1 + l + sovMvcc3(uint64(l))
+ }
return n
}
@@ -3116,6 +3148,39 @@ func (m *RangeAppliedState) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ClosedTimestamp", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowMvcc3
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthMvcc3
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.ClosedTimestamp == nil {
+ m.ClosedTimestamp = &hlc.Timestamp{}
+ }
+ if err := m.ClosedTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipMvcc3(dAtA[iNdEx:])
@@ -4308,86 +4373,87 @@ var (
)
func init() {
- proto.RegisterFile("storage/enginepb/mvcc3.proto", fileDescriptor_mvcc3_91ae80d2fc45e9ad)
+ proto.RegisterFile("storage/enginepb/mvcc3.proto", fileDescriptor_mvcc3_ed774bd3b5c68109)
}
-var fileDescriptor_mvcc3_91ae80d2fc45e9ad = []byte{
- // 1219 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x41, 0x6f, 0x1b, 0x45,
- 0x14, 0xf6, 0x7a, 0xd7, 0xc9, 0xfa, 0xd9, 0x49, 0xec, 0x69, 0x05, 0x56, 0x69, 0xed, 0xe0, 0x03,
- 0x8a, 0x4a, 0xbb, 0x46, 0x2d, 0xa7, 0xdc, 0xec, 0xa4, 0x2a, 0x2e, 0x4d, 0x53, 0x36, 0x6e, 0x91,
- 0x40, 0x62, 0x35, 0x5e, 0x0f, 0x9b, 0x55, 0xd6, 0xb3, 0xdb, 0xdd, 0xb1, 0x6b, 0xff, 0x0b, 0x2e,
- 0x48, 0x1c, 0x40, 0xca, 0x8f, 0xe0, 0xc0, 0x4f, 0xc8, 0xb1, 0x12, 0x1c, 0x2a, 0x24, 0x2c, 0x70,
- 0x2f, 0xfc, 0x86, 0xf6, 0x82, 0x66, 0x66, 0xbd, 0xb6, 0x03, 0x71, 0x0c, 0x81, 0x88, 0xdb, 0xcc,
- 0xfb, 0xde, 0xfb, 0xde, 0x9b, 0xe7, 0x6f, 0xe7, 0x8d, 0xe1, 0x7a, 0xc4, 0xfc, 0x10, 0x3b, 0xa4,
- 0x46, 0xa8, 0xe3, 0x52, 0x12, 0xb4, 0x6b, 0xdd, 0xbe, 0x6d, 0xdf, 0x35, 0x82, 0xd0, 0x67, 0x3e,
- 0xba, 0x66, 0xfb, 0xf6, 0x51, 0xe8, 0x63, 0xfb, 0xd0, 0x88, 0xfd, 0x8c, 0x89, 0xdf, 0xb5, 0x52,
- 0x8f, 0xb9, 0x5e, 0xed, 0xd0, 0xb3, 0x6b, 0xcc, 0xed, 0x92, 0x88, 0xe1, 0x6e, 0x20, 0xa3, 0xae,
- 0x5d, 0x75, 0x7c, 0xc7, 0x17, 0xcb, 0x1a, 0x5f, 0x49, 0x6b, 0xf5, 0x6b, 0x15, 0x56, 0x5b, 0x03,
- 0xba, 0x47, 0x18, 0x46, 0x9f, 0x40, 0xda, 0xed, 0x94, 0x94, 0x4d, 0x65, 0x2b, 0xdf, 0xa8, 0x9f,
- 0x8c, 0x2a, 0xa9, 0x9f, 0x47, 0x95, 0xbb, 0x8e, 0xcb, 0x0e, 0x7b, 0x6d, 0xc3, 0xf6, 0xbb, 0xb5,
- 0x24, 0x6d, 0xa7, 0x3d, 0x5d, 0xd7, 0x82, 0x23, 0xa7, 0x26, 0x92, 0xf6, 0x7a, 0x6e, 0xc7, 0x78,
- 0xf2, 0xa4, 0xb9, 0x3b, 0x1e, 0x55, 0xd2, 0xcd, 0x5d, 0x33, 0xed, 0x76, 0x50, 0x01, 0xd4, 0x23,
- 0x32, 0x2c, 0xa9, 0x9c, 0xd3, 0xe4, 0x4b, 0x54, 0x85, 0x0c, 0x09, 0x7c, 0xfb, 0xb0, 0xa4, 0x6d,
- 0x2a, 0x5b, 0x99, 0x46, 0xfe, 0xf5, 0xa8, 0xa2, 0xb7, 0x06, 0xf4, 0x1e, 0xb7, 0x99, 0x12, 0x42,
- 0x0f, 0x61, 0xe3, 0x79, 0xe8, 0x32, 0x62, 0x25, 0x67, 0x28, 0x65, 0x36, 0x95, 0xad, 0xdc, 0x9d,
- 0x1b, 0xc6, 0xf4, 0xe8, 0x3c, 0xa7, 0x71, 0xe8, 0xd9, 0x46, 0x6b, 0xe2, 0xd4, 0xd0, 0x78, 0xd1,
- 0xe6, 0xba, 0x88, 0x4d, 0xac, 0xe8, 0x7d, 0xd0, 0x83, 0xd0, 0xf5, 0x43, 0x97, 0x0d, 0x4b, 0x2b,
- 0x22, 0xe9, 0xc6, 0xeb, 0x51, 0x25, 0xd7, 0x1a, 0xd0, 0xc7, 0xb1, 0xd9, 0x4c, 0x1c, 0xd0, 0x7b,
- 0xa0, 0x47, 0xe4, 0x59, 0x8f, 0x50, 0x9b, 0x94, 0x56, 0x85, 0x33, 0xbc, 0x1e, 0x55, 0x56, 0x5a,
- 0x03, 0x7a, 0x40, 0x9e, 0x99, 0x09, 0x86, 0x3e, 0x82, 0xb5, 0xae, 0x4b, 0x67, 0x0a, 0xcc, 0x2e,
- 0x5f, 0x60, 0xbe, 0xeb, 0xd2, 0xc4, 0xb6, 0xad, 0x7f, 0x73, 0x5c, 0x49, 0xfd, 0x70, 0x5c, 0x51,
- 0x1e, 0x68, 0x7a, 0xba, 0xa0, 0x3e, 0xd0, 0x74, 0xbd, 0x90, 0xad, 0x7e, 0x01, 0xa8, 0xe9, 0x50,
- 0x3f, 0x24, 0x9d, 0x03, 0xf2, 0xec, 0x51, 0xaf, 0x6b, 0x62, 0xea, 0x10, 0xb4, 0x09, 0x99, 0x88,
- 0xe1, 0x90, 0x89, 0x1f, 0x69, 0xbe, 0x34, 0x09, 0xa0, 0xeb, 0xa0, 0x12, 0xda, 0x29, 0xa5, 0xff,
- 0x84, 0x73, 0xf3, 0xb6, 0xce, 0xf3, 0xfc, 0x7e, 0x5c, 0x51, 0xaa, 0x3f, 0x69, 0xb0, 0xbe, 0xf7,
- 0x74, 0x67, 0xe7, 0x80, 0x61, 0x16, 0xed, 0x12, 0x8f, 0x61, 0x74, 0x13, 0x8a, 0x1e, 0x8e, 0x98,
- 0xd5, 0x0b, 0x3a, 0x98, 0x11, 0x8b, 0x62, 0xea, 0x47, 0x22, 0x51, 0xc1, 0xdc, 0xe0, 0xc0, 0x13,
- 0x61, 0x7f, 0xc4, 0xcd, 0xe8, 0x06, 0x80, 0x4b, 0x19, 0xa1, 0xcc, 0xc2, 0x0e, 0x11, 0xd9, 0x0a,
- 0x66, 0x56, 0x5a, 0xea, 0x0e, 0x41, 0x1f, 0x40, 0xde, 0xb1, 0xad, 0xf6, 0x90, 0x91, 0x48, 0x38,
- 0xf0, 0xdf, 0xbf, 0xd0, 0x58, 0x1f, 0x8f, 0x2a, 0x70, 0x7f, 0xa7, 0xc1, 0xcd, 0x75, 0x87, 0x98,
- 0xe0, 0xd8, 0x93, 0x35, 0x27, 0xf4, 0xdc, 0x3e, 0x91, 0x31, 0x42, 0x1b, 0xc8, 0xcc, 0x72, 0x8b,
- 0xf0, 0x48, 0x60, 0xdb, 0xef, 0x51, 0x26, 0xc4, 0x10, 0xc3, 0x3b, 0xdc, 0x80, 0xde, 0x81, 0xec,
- 0x11, 0x19, 0xc6, 0xc1, 0x2b, 0x02, 0xd5, 0x8f, 0xc8, 0x50, 0xc6, 0xc6, 0xa0, 0x0c, 0x5d, 0x4d,
- 0xc0, 0x24, 0xb2, 0x8f, 0xbd, 0x38, 0x52, 0x97, 0x60, 0x1f, 0x7b, 0x49, 0x24, 0x07, 0x65, 0x64,
- 0x36, 0x01, 0x65, 0xe4, 0xbb, 0x90, 0x8f, 0x5b, 0x20, 0x83, 0x41, 0xe0, 0x39, 0x69, 0x93, 0xf1,
- 0x53, 0x17, 0x49, 0x91, 0x9b, 0x75, 0x49, 0xf2, 0x47, 0xc3, 0x28, 0xa6, 0xc8, 0xcb, 0x14, 0xd1,
- 0x30, 0x4a, 0xf2, 0x73, 0x50, 0x06, 0xaf, 0x25, 0xa0, 0x8c, 0xbc, 0x0d, 0xc8, 0xf6, 0x29, 0xc3,
- 0x2e, 0x8d, 0x2c, 0x12, 0x31, 0xb7, 0x8b, 0x39, 0xc5, 0xfa, 0xa6, 0xb2, 0xa5, 0x9a, 0xc5, 0x09,
- 0x72, 0x6f, 0x02, 0xa0, 0x2d, 0x28, 0xe0, 0xb6, 0x1f, 0x32, 0x2b, 0x0a, 0x30, 0x8d, 0xf3, 0x6d,
- 0x08, 0xca, 0x75, 0x61, 0x3f, 0x08, 0x30, 0x95, 0x59, 0x3f, 0x84, 0xb7, 0x22, 0x12, 0xe0, 0x10,
- 0x33, 0xd2, 0xb1, 0xe6, 0xea, 0x2f, 0x08, 0xff, 0xab, 0x09, 0xda, 0x9c, 0x1e, 0x64, 0x5b, 0x13,
- 0xb2, 0xfa, 0x45, 0x83, 0x2b, 0x5c, 0x56, 0x8f, 0x49, 0x18, 0xb9, 0x11, 0x47, 0x85, 0xc0, 0xfe,
- 0x6f, 0xda, 0x52, 0x17, 0x6b, 0x4b, 0x5d, 0xa8, 0x2d, 0x75, 0x91, 0xb6, 0xd4, 0x45, 0xda, 0x52,
- 0x17, 0x69, 0x4b, 0x3d, 0x47, 0x5b, 0xea, 0xf9, 0xda, 0x52, 0xcf, 0xd1, 0x96, 0xba, 0x48, 0x5b,
- 0xea, 0xbf, 0xaf, 0x2d, 0xf5, 0x6f, 0x6a, 0x4b, 0x3d, 0x43, 0x5b, 0xd3, 0x6b, 0xeb, 0x47, 0x05,
- 0x8a, 0xe2, 0x2a, 0xac, 0x07, 0x81, 0xe7, 0x92, 0x0e, 0x57, 0x17, 0x41, 0xb7, 0x00, 0x85, 0xf8,
- 0x4b, 0x66, 0x61, 0x69, 0xb4, 0x5c, 0xda, 0x21, 0x03, 0x21, 0x2f, 0xcd, 0x2c, 0x70, 0x24, 0xf6,
- 0x6e, 0x72, 0x3b, 0x32, 0xe0, 0x8a, 0x47, 0x70, 0x44, 0x4e, 0xb9, 0xa7, 0x85, 0x7b, 0x51, 0x40,
- 0x73, 0xfe, 0x4f, 0x21, 0x17, 0xf2, 0x94, 0x56, 0xc4, 0xa5, 0x2c, 0xf4, 0x96, 0xbb, 0x53, 0x33,
- 0xce, 0x1e, 0xc2, 0xc6, 0x5f, 0x7c, 0x01, 0xf1, 0xd5, 0x0f, 0x82, 0x49, 0x58, 0x66, 0x4e, 0xf5,
- 0xad, 0x02, 0x05, 0x1e, 0xf3, 0x29, 0x1f, 0x5c, 0x4f, 0xb1, 0xd7, 0x23, 0xfb, 0xc1, 0x64, 0x74,
- 0x2a, 0xd3, 0xd1, 0x59, 0x87, 0xec, 0x74, 0xde, 0xa4, 0x97, 0x9f, 0x37, 0xd3, 0x28, 0x74, 0x15,
- 0x32, 0x7d, 0xce, 0x1f, 0x4f, 0x64, 0xb9, 0xe1, 0x5f, 0x40, 0x10, 0x92, 0xbe, 0x25, 0x21, 0x4d,
- 0x40, 0x59, 0x6e, 0x11, 0xb5, 0x54, 0xbf, 0x4b, 0x43, 0x31, 0x29, 0x4f, 0xfe, 0x2e, 0xfb, 0x01,
- 0xfa, 0x1c, 0x56, 0xd8, 0x80, 0x5a, 0xc9, 0x8b, 0x61, 0xf7, 0x62, 0x2f, 0x86, 0x4c, 0x6b, 0x40,
- 0x9b, 0xbb, 0x66, 0x86, 0x0d, 0x68, 0xb3, 0x83, 0xde, 0x86, 0x55, 0x4e, 0xce, 0x1b, 0x90, 0x16,
- 0xe5, 0xf0, 0x5c, 0x1f, 0x9f, 0xee, 0x81, 0xfa, 0x8f, 0x7a, 0xb0, 0x0f, 0x45, 0xce, 0x3d, 0x3f,
- 0xbe, 0xb5, 0xe5, 0xa9, 0x36, 0xd8, 0x80, 0xee, 0xcd, 0x4c, 0xf0, 0xea, 0xf7, 0x0a, 0x20, 0xde,
- 0x1f, 0x79, 0x89, 0x5d, 0x4e, 0x83, 0x2e, 0xae, 0x85, 0xea, 0x9b, 0xb8, 0xec, 0x1d, 0xbf, 0xdb,
- 0x75, 0xd9, 0xe5, 0x94, 0x1d, 0x8b, 0x3a, 0x7d, 0x86, 0xa8, 0xd5, 0x8b, 0x89, 0x5a, 0x3b, 0x5b,
- 0xd4, 0x99, 0xd3, 0xa2, 0x0e, 0xa4, 0xa6, 0xeb, 0xfc, 0x7e, 0xba, 0x94, 0xb3, 0x57, 0xbb, 0xf2,
- 0xc5, 0x25, 0x32, 0xb6, 0x06, 0xf4, 0xbf, 0x4e, 0xf7, 0x46, 0x85, 0x35, 0x9e, 0xef, 0xa1, 0xef,
- 0xb8, 0x36, 0xf6, 0xf6, 0x03, 0xb4, 0x07, 0x39, 0xf9, 0xac, 0x96, 0x2d, 0x51, 0x44, 0xb3, 0x6f,
- 0x9d, 0x77, 0x91, 0xcd, 0x5e, 0x4a, 0x26, 0x3c, 0x4f, 0x76, 0xe8, 0x31, 0xe4, 0x25, 0x9d, 0xbc,
- 0xc7, 0x63, 0x15, 0xde, 0x5e, 0x8a, 0x6f, 0xd2, 0x71, 0x53, 0x56, 0x24, 0xb7, 0xe8, 0x00, 0xd6,
- 0xe2, 0x07, 0x42, 0x4c, 0x29, 0xf5, 0x60, 0x9c, 0x47, 0x39, 0xff, 0xe1, 0x99, 0xf9, 0xde, 0xcc,
- 0x9e, 0x93, 0xda, 0x42, 0xe1, 0x13, 0x52, 0x6d, 0x39, 0xd2, 0xf9, 0xcf, 0xc2, 0xcc, 0xdb, 0x33,
- 0x7b, 0x7e, 0x76, 0x39, 0xf1, 0x62, 0xce, 0xcc, 0x72, 0x67, 0x9f, 0x53, 0x9b, 0x99, 0xc3, 0xd3,
- 0x2d, 0xba, 0x0f, 0x59, 0xc9, 0xc8, 0x06, 0x54, 0x3c, 0x33, 0x72, 0x77, 0x6e, 0x2e, 0x45, 0x27,
- 0xa4, 0x64, 0xea, 0x38, 0x5e, 0x6f, 0x6b, 0x27, 0xc7, 0x15, 0xa5, 0x71, 0xf3, 0xe4, 0xb7, 0x72,
- 0xea, 0x64, 0x5c, 0x56, 0x5e, 0x8c, 0xcb, 0xca, 0xcb, 0x71, 0x59, 0xf9, 0x75, 0x5c, 0x56, 0xbe,
- 0x7a, 0x55, 0x4e, 0xbd, 0x78, 0x55, 0x4e, 0xbd, 0x7c, 0x55, 0x4e, 0x7d, 0xa6, 0x4f, 0xa8, 0xda,
- 0x2b, 0xe2, 0xaf, 0xe0, 0xdd, 0x3f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x83, 0xbe, 0x76, 0x2a, 0x76,
- 0x0e, 0x00, 0x00,
+var fileDescriptor_mvcc3_ed774bd3b5c68109 = []byte{
+ // 1236 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x57, 0x41, 0x6f, 0xe3, 0x44,
+ 0x14, 0x8e, 0x63, 0xa7, 0x75, 0x26, 0x69, 0x93, 0xce, 0xae, 0x20, 0x5a, 0x76, 0x93, 0x92, 0x03,
+ 0xaa, 0x96, 0x5d, 0x07, 0xb5, 0x9c, 0x7a, 0x4b, 0xda, 0xd5, 0x6e, 0x96, 0xed, 0xb6, 0xb8, 0x69,
+ 0x91, 0x40, 0xc2, 0x9a, 0xd8, 0x83, 0x6b, 0xd5, 0x19, 0xbb, 0xf6, 0x24, 0xeb, 0xfc, 0x0b, 0x2e,
+ 0x48, 0x1c, 0x40, 0xea, 0x8f, 0xe0, 0xc0, 0x4f, 0xe8, 0x71, 0x0f, 0x1c, 0x56, 0x48, 0x44, 0x90,
+ 0x5e, 0xf8, 0x0d, 0xdd, 0x0b, 0x9a, 0x19, 0xc7, 0x49, 0x0a, 0x4d, 0x03, 0x85, 0x8a, 0xdb, 0xcc,
+ 0xfb, 0xde, 0xfb, 0xde, 0x9b, 0x97, 0xcf, 0xf3, 0x26, 0xe0, 0x7e, 0x48, 0xbd, 0x00, 0xd9, 0xb8,
+ 0x86, 0x89, 0xed, 0x10, 0xec, 0xb7, 0x6b, 0x9d, 0x9e, 0x69, 0x6e, 0x68, 0x7e, 0xe0, 0x51, 0x0f,
+ 0xde, 0x33, 0x3d, 0xf3, 0x38, 0xf0, 0x90, 0x79, 0xa4, 0xc5, 0x7e, 0xda, 0xc8, 0xef, 0x5e, 0xa9,
+ 0x4b, 0x1d, 0xb7, 0x76, 0xe4, 0x9a, 0x35, 0xea, 0x74, 0x70, 0x48, 0x51, 0xc7, 0x17, 0x51, 0xf7,
+ 0xee, 0xda, 0x9e, 0xed, 0xf1, 0x65, 0x8d, 0xad, 0x84, 0xb5, 0xfa, 0x8d, 0x0c, 0x16, 0x5b, 0x11,
+ 0xd9, 0xc1, 0x14, 0xc1, 0x4f, 0x41, 0xda, 0xb1, 0x4a, 0xd2, 0xaa, 0xb4, 0x96, 0x6f, 0xd4, 0xcf,
+ 0x06, 0x95, 0xd4, 0xcf, 0x83, 0xca, 0x86, 0xed, 0xd0, 0xa3, 0x6e, 0x5b, 0x33, 0xbd, 0x4e, 0x2d,
+ 0x49, 0x6b, 0xb5, 0xc7, 0xeb, 0x9a, 0x7f, 0x6c, 0xd7, 0x78, 0xd2, 0x6e, 0xd7, 0xb1, 0xb4, 0x83,
+ 0x83, 0xe6, 0xf6, 0x70, 0x50, 0x49, 0x37, 0xb7, 0xf5, 0xb4, 0x63, 0xc1, 0x22, 0x90, 0x8f, 0x71,
+ 0xbf, 0x24, 0x33, 0x4e, 0x9d, 0x2d, 0x61, 0x15, 0x64, 0xb0, 0xef, 0x99, 0x47, 0x25, 0x65, 0x55,
+ 0x5a, 0xcb, 0x34, 0xf2, 0x17, 0x83, 0x8a, 0xda, 0x8a, 0xc8, 0x13, 0x66, 0xd3, 0x05, 0x04, 0x5f,
+ 0x80, 0xc2, 0xab, 0xc0, 0xa1, 0xd8, 0x48, 0xce, 0x50, 0xca, 0xac, 0x4a, 0x6b, 0xb9, 0xf5, 0x07,
+ 0xda, 0xf8, 0xe8, 0x2c, 0xa7, 0x76, 0xe4, 0x9a, 0x5a, 0x6b, 0xe4, 0xd4, 0x50, 0x58, 0xd1, 0xfa,
+ 0x32, 0x8f, 0x4d, 0xac, 0xf0, 0x43, 0xa0, 0xfa, 0x81, 0xe3, 0x05, 0x0e, 0xed, 0x97, 0x16, 0x78,
+ 0xd2, 0xc2, 0xc5, 0xa0, 0x92, 0x6b, 0x45, 0x64, 0x2f, 0x36, 0xeb, 0x89, 0x03, 0xfc, 0x00, 0xa8,
+ 0x21, 0x3e, 0xe9, 0x62, 0x62, 0xe2, 0xd2, 0x22, 0x77, 0x06, 0x17, 0x83, 0xca, 0x42, 0x2b, 0x22,
+ 0xfb, 0xf8, 0x44, 0x4f, 0x30, 0xf8, 0x0c, 0x2c, 0x75, 0x1c, 0x32, 0x51, 0x60, 0x76, 0xfe, 0x02,
+ 0xf3, 0x1d, 0x87, 0x24, 0xb6, 0x4d, 0xf5, 0xdb, 0xd3, 0x4a, 0xea, 0xc7, 0xd3, 0x8a, 0xf4, 0x5c,
+ 0x51, 0xd3, 0x45, 0xf9, 0xb9, 0xa2, 0xaa, 0xc5, 0x6c, 0xf5, 0x4b, 0x00, 0x9b, 0x36, 0xf1, 0x02,
+ 0x6c, 0xed, 0xe3, 0x93, 0x97, 0xdd, 0x8e, 0x8e, 0x88, 0x8d, 0xe1, 0x2a, 0xc8, 0x84, 0x14, 0x05,
+ 0x94, 0xff, 0x48, 0xd3, 0xa5, 0x09, 0x00, 0xde, 0x07, 0x32, 0x26, 0x56, 0x29, 0xfd, 0x27, 0x9c,
+ 0x99, 0x37, 0x55, 0x96, 0xe7, 0xf7, 0xd3, 0x8a, 0x54, 0xfd, 0x49, 0x01, 0xcb, 0x3b, 0x87, 0x5b,
+ 0x5b, 0xfb, 0x14, 0xd1, 0x70, 0x1b, 0xbb, 0x14, 0xc1, 0x87, 0x60, 0xc5, 0x45, 0x21, 0x35, 0xba,
+ 0xbe, 0x85, 0x28, 0x36, 0x08, 0x22, 0x5e, 0xc8, 0x13, 0x15, 0xf5, 0x02, 0x03, 0x0e, 0xb8, 0xfd,
+ 0x25, 0x33, 0xc3, 0x07, 0x00, 0x38, 0x84, 0x62, 0x42, 0x0d, 0x64, 0x63, 0x9e, 0xad, 0xa8, 0x67,
+ 0x85, 0xa5, 0x6e, 0x63, 0xf8, 0x11, 0xc8, 0xdb, 0xa6, 0xd1, 0xee, 0x53, 0x1c, 0x72, 0x07, 0xf6,
+ 0xfb, 0x17, 0x1b, 0xcb, 0xc3, 0x41, 0x05, 0x3c, 0xdd, 0x6a, 0x30, 0x73, 0xdd, 0xc6, 0x3a, 0xb0,
+ 0xcd, 0xd1, 0x9a, 0x11, 0xba, 0x4e, 0x0f, 0x8b, 0x18, 0xae, 0x0d, 0xa8, 0x67, 0x99, 0x85, 0x7b,
+ 0x24, 0xb0, 0xe9, 0x75, 0x09, 0xe5, 0x62, 0x88, 0xe1, 0x2d, 0x66, 0x80, 0xef, 0x81, 0xec, 0x31,
+ 0xee, 0xc7, 0xc1, 0x0b, 0x1c, 0x55, 0x8f, 0x71, 0x5f, 0xc4, 0xc6, 0xa0, 0x08, 0x5d, 0x4c, 0xc0,
+ 0x24, 0xb2, 0x87, 0xdc, 0x38, 0x52, 0x15, 0x60, 0x0f, 0xb9, 0x49, 0x24, 0x03, 0x45, 0x64, 0x36,
+ 0x01, 0x45, 0xe4, 0xfb, 0x20, 0x1f, 0xb7, 0x40, 0x04, 0x03, 0x8e, 0xe7, 0x84, 0x4d, 0xc4, 0x8f,
+ 0x5d, 0x04, 0x45, 0x6e, 0xd2, 0x25, 0xc9, 0x1f, 0xf6, 0xc3, 0x98, 0x22, 0x2f, 0x52, 0x84, 0xfd,
+ 0x30, 0xc9, 0xcf, 0x40, 0x11, 0xbc, 0x94, 0x80, 0x22, 0xf2, 0x31, 0x80, 0xa6, 0x47, 0x28, 0x72,
+ 0x48, 0x68, 0xe0, 0x90, 0x3a, 0x1d, 0xc4, 0x28, 0x96, 0x57, 0xa5, 0x35, 0x59, 0x5f, 0x19, 0x21,
+ 0x4f, 0x46, 0x00, 0x5c, 0x03, 0x45, 0xd4, 0xf6, 0x02, 0x6a, 0x84, 0x3e, 0x22, 0x71, 0xbe, 0x02,
+ 0xa7, 0x5c, 0xe6, 0xf6, 0x7d, 0x1f, 0x11, 0x91, 0xf5, 0x63, 0xf0, 0x4e, 0x88, 0x7d, 0x14, 0x20,
+ 0x8a, 0x2d, 0x63, 0xaa, 0xfe, 0x22, 0xf7, 0xbf, 0x9b, 0xa0, 0xcd, 0xf1, 0x41, 0x36, 0x15, 0x2e,
+ 0xab, 0x5f, 0x14, 0x70, 0x87, 0xc9, 0x6a, 0x0f, 0x07, 0xa1, 0x13, 0x32, 0x94, 0x0b, 0xec, 0xff,
+ 0xa6, 0x2d, 0x79, 0xb6, 0xb6, 0xe4, 0x99, 0xda, 0x92, 0x67, 0x69, 0x4b, 0x9e, 0xa5, 0x2d, 0x79,
+ 0x96, 0xb6, 0xe4, 0x6b, 0xb4, 0x25, 0x5f, 0xaf, 0x2d, 0xf9, 0x1a, 0x6d, 0xc9, 0xb3, 0xb4, 0x25,
+ 0xff, 0xfb, 0xda, 0x92, 0xff, 0xa6, 0xb6, 0xe4, 0x2b, 0xb4, 0x35, 0xbe, 0xb6, 0xbe, 0x4f, 0x83,
+ 0x15, 0x7e, 0x15, 0xd6, 0x7d, 0xdf, 0x75, 0xb0, 0xc5, 0xd4, 0x85, 0xe1, 0x23, 0x00, 0x03, 0xf4,
+ 0x15, 0x35, 0x90, 0x30, 0x1a, 0x0e, 0xb1, 0x70, 0xc4, 0xe5, 0xa5, 0xe8, 0x45, 0x86, 0xc4, 0xde,
+ 0x4d, 0x66, 0x87, 0x1a, 0xb8, 0xe3, 0x62, 0x14, 0xe2, 0x4b, 0xee, 0x69, 0xee, 0xbe, 0xc2, 0xa1,
+ 0x29, 0xff, 0x43, 0x90, 0x0b, 0x58, 0x4a, 0x23, 0x64, 0x52, 0xe6, 0x7a, 0xcb, 0xad, 0xd7, 0xb4,
+ 0xab, 0x87, 0xb0, 0xf6, 0x17, 0x5f, 0x40, 0x7c, 0xf5, 0x03, 0xce, 0x24, 0xbe, 0x89, 0x67, 0xa0,
+ 0x68, 0xba, 0x5e, 0x88, 0xad, 0x89, 0x29, 0xa2, 0xcc, 0x31, 0x45, 0xf4, 0x82, 0x08, 0x9b, 0x18,
+ 0x21, 0x49, 0x7f, 0xbe, 0x93, 0x40, 0x91, 0x65, 0xff, 0x8c, 0x8d, 0xc0, 0x43, 0xe4, 0x76, 0xf1,
+ 0xae, 0x3f, 0x1a, 0xc2, 0xd2, 0x78, 0x08, 0xd7, 0x41, 0x76, 0x9c, 0x33, 0x3d, 0xff, 0xe4, 0x1a,
+ 0x47, 0xc1, 0xbb, 0x20, 0xd3, 0x63, 0xfc, 0xf1, 0x6c, 0x17, 0x1b, 0xf6, 0x2d, 0xf9, 0x01, 0xee,
+ 0x19, 0x02, 0x52, 0x38, 0x94, 0x65, 0x16, 0x5e, 0x0b, 0xff, 0xf9, 0x92, 0xf2, 0xc4, 0x2f, 0xbc,
+ 0xeb, 0xc3, 0x2f, 0xc0, 0x02, 0x8d, 0x88, 0x91, 0xbc, 0x3d, 0xb6, 0x6f, 0xf6, 0xf6, 0xc8, 0xb4,
+ 0x22, 0xd2, 0xdc, 0xd6, 0x33, 0x34, 0x22, 0x4d, 0x0b, 0xbe, 0x0b, 0x16, 0x19, 0x39, 0x6b, 0x40,
+ 0x9a, 0x97, 0xc3, 0x72, 0x7d, 0x72, 0xb9, 0x07, 0xf2, 0x3f, 0xea, 0xc1, 0x2e, 0x58, 0x61, 0xdc,
+ 0xd3, 0x0f, 0x01, 0x65, 0x7e, 0xaa, 0x02, 0x8d, 0xc8, 0xce, 0xc4, 0x5b, 0xa0, 0xfa, 0x83, 0x04,
+ 0x20, 0xeb, 0x8f, 0xb8, 0x0e, 0x6f, 0xa7, 0x41, 0x37, 0xd7, 0x42, 0xf5, 0x6d, 0x5c, 0xf6, 0x96,
+ 0xd7, 0xe9, 0x38, 0xf4, 0x76, 0xca, 0x8e, 0x45, 0x9d, 0xbe, 0x42, 0xd4, 0xf2, 0xcd, 0x44, 0xad,
+ 0x5c, 0x2d, 0xea, 0xcc, 0x65, 0x51, 0xfb, 0x42, 0xd3, 0x75, 0x76, 0xd3, 0xdd, 0xca, 0xd9, 0xab,
+ 0x1d, 0xf1, 0x76, 0xe3, 0x19, 0x5b, 0x11, 0xf9, 0xaf, 0xd3, 0xbd, 0x95, 0xc1, 0x12, 0xcb, 0xf7,
+ 0xc2, 0xb3, 0x1d, 0x13, 0xb9, 0xbb, 0x3e, 0xdc, 0x01, 0x39, 0xf1, 0x40, 0x17, 0x2d, 0x91, 0x78,
+ 0xb3, 0x1f, 0x5d, 0x77, 0x25, 0x4e, 0x5e, 0x4a, 0x3a, 0x78, 0x95, 0xec, 0xe0, 0x1e, 0xc8, 0x0b,
+ 0x3a, 0x31, 0x11, 0x62, 0x15, 0x3e, 0x9e, 0x8b, 0x6f, 0xd4, 0x71, 0x5d, 0x54, 0x24, 0xb6, 0x70,
+ 0x1f, 0x2c, 0xc5, 0x4f, 0x8d, 0x98, 0x52, 0xe8, 0x41, 0xbb, 0x8e, 0x72, 0xfa, 0xc3, 0xd3, 0xf3,
+ 0xdd, 0x89, 0x3d, 0x23, 0x35, 0xb9, 0xc2, 0x47, 0xa4, 0xca, 0x7c, 0xa4, 0xd3, 0x9f, 0x85, 0x9e,
+ 0x37, 0x27, 0xf6, 0xec, 0xec, 0x62, 0x76, 0xc6, 0x9c, 0x99, 0xf9, 0xce, 0x3e, 0xa5, 0x36, 0x3d,
+ 0x87, 0xc6, 0x5b, 0xf8, 0x14, 0x64, 0x05, 0x23, 0x8d, 0x08, 0x7f, 0xb0, 0xe4, 0xd6, 0x1f, 0xce,
+ 0x45, 0xc7, 0xa5, 0xa4, 0xab, 0x28, 0x5e, 0x6f, 0x2a, 0x67, 0xa7, 0x15, 0xa9, 0xf1, 0xf0, 0xec,
+ 0xb7, 0x72, 0xea, 0x6c, 0x58, 0x96, 0x5e, 0x0f, 0xcb, 0xd2, 0x9b, 0x61, 0x59, 0xfa, 0x75, 0x58,
+ 0x96, 0xbe, 0x3e, 0x2f, 0xa7, 0x5e, 0x9f, 0x97, 0x53, 0x6f, 0xce, 0xcb, 0xa9, 0xcf, 0xd5, 0x11,
+ 0x55, 0x7b, 0x81, 0xff, 0xa9, 0xdc, 0xf8, 0x23, 0x00, 0x00, 0xff, 0xff, 0x46, 0x22, 0xed, 0xb0,
+ 0xc0, 0x0e, 0x00, 0x00,
}
diff --git a/pkg/storage/enginepb/mvcc3.proto b/pkg/storage/enginepb/mvcc3.proto
index a283b4088bed..66181e1e064f 100644
--- a/pkg/storage/enginepb/mvcc3.proto
+++ b/pkg/storage/enginepb/mvcc3.proto
@@ -203,6 +203,19 @@ message RangeAppliedState {
// range_stats is the set of mvcc stats that accounts for the current value
// of the Raft state machine.
MVCCPersistentStats range_stats = 3 [(gogoproto.nullable) = false];
+
+ // closed_timestamp is the largest timestamp that is known to have been closed
+ // as of this lease applied index. This means that the current leaseholder (if
+ // any) and any future leaseholder will not evaluate writes at or below this
+ // timestamp, and also that any in-flight commands that can still apply are
+ // writing at higher timestamps. Non-leaseholder replicas are free to serve
+ // "follower reads" at or below this timestamp.
+ //
+ // TODO(andrei): Make this field not-nullable in 21.2, once all the ranges
+ // have a closed timestamp applied to their state (this might need a
+ // migration). In 21.1 we cannot write empty timestamp to disk because that
+ // looks like an inconsistency to the consistency-checker.
+ util.hlc.Timestamp closed_timestamp = 4;
}
// MVCCWriteValueOp corresponds to a value being written outside of a
diff --git a/pkg/testutils/lint/lint_test.go b/pkg/testutils/lint/lint_test.go
index cb345f554f3a..c6d21826dd80 100644
--- a/pkg/testutils/lint/lint_test.go
+++ b/pkg/testutils/lint/lint_test.go
@@ -1020,7 +1020,7 @@ func TestLint(t *testing.T) {
if err := stream.ForEach(stream.Sequence(
filter,
- stream.GrepNot(`(json|jsonpb|yaml|xml|protoutil|toml|Codec|ewkb|wkb)\.Unmarshal\(`),
+ stream.GrepNot(`(json|jsonpb|yaml|xml|protoutil|toml|Codec|ewkb|wkb|wkt)\.Unmarshal\(`),
), func(s string) {
t.Errorf("\n%s <- forbidden; use 'protoutil.Unmarshal' instead", s)
}); err != nil {
diff --git a/pkg/util/hlc/timestamp.go b/pkg/util/hlc/timestamp.go
index 8a92f35190f2..af127a9c2457 100644
--- a/pkg/util/hlc/timestamp.go
+++ b/pkg/util/hlc/timestamp.go
@@ -196,6 +196,10 @@ func (t Timestamp) Add(wallTime int64, logical int32) Timestamp {
// // Adding a positive value to a Timestamp adds the Synthetic flag.
// s.Synthetic = true
// }
+ //
+ // When addressing this TODO, remove the hack in
+ // propBuf.assignClosedTimestampToProposal that manually marks lease
+ // expirations as synthetic.
return s
}
@@ -360,6 +364,15 @@ func (t Timestamp) UnsafeToClockTimestamp() ClockTimestamp {
return ClockTimestamp(t)
}
+// MustToClockTimestamp casts a Timestamp to a ClockTimestamp. Panics if the
+// timestamp is synthetic. See TryToClockTimestamp if you don't want to panic.
+func (t Timestamp) MustToClockTimestamp() ClockTimestamp {
+ if t.Synthetic {
+ panic(fmt.Sprintf("can't convert synthetic timestamp to ClockTimestamp: %s", t))
+ }
+ return ClockTimestamp(t)
+}
+
// ToTimestamp upcasts a ClockTimestamp into a Timestamp.
func (t ClockTimestamp) ToTimestamp() Timestamp {
if t.Synthetic {
|