diff --git a/docs/generated/settings/settings.html b/docs/generated/settings/settings.html
index a4cd8785db6c..176845d2550e 100644
--- a/docs/generated/settings/settings.html
+++ b/docs/generated/settings/settings.html
@@ -99,6 +99,6 @@
trace.debug.enable | boolean | false | if set, traces for recent requests can be seen in the /debug page |
trace.lightstep.token | string |
| if set, traces go to Lightstep using this token |
trace.zipkin.collector | string |
| if set, traces go to the given Zipkin instance (example: '127.0.0.1:9411'); ignored if trace.lightstep.token is set |
-version | version | 20.2-6 | set the active cluster version in the format '.' |
+version | version | 20.2-8 | set the active cluster version in the format '.' |
diff --git a/pkg/clusterversion/cockroach_versions.go b/pkg/clusterversion/cockroach_versions.go
index edbd16cf7d78..190e0ed13d1d 100644
--- a/pkg/clusterversion/cockroach_versions.go
+++ b/pkg/clusterversion/cockroach_versions.go
@@ -202,6 +202,8 @@ const (
// UniqueWithoutIndexConstraints is when adding UNIQUE WITHOUT INDEX
// constraints is supported.
UniqueWithoutIndexConstraints
+ // VirtualComputedColumns is when virtual computed columns are supported.
+ VirtualComputedColumns
// Step (1): Add new versions here.
)
@@ -328,6 +330,10 @@ var versionsSingleton = keyedVersions([]keyedVersion{
Key: UniqueWithoutIndexConstraints,
Version: roachpb.Version{Major: 20, Minor: 2, Internal: 6},
},
+ {
+ Key: VirtualComputedColumns,
+ Version: roachpb.Version{Major: 20, Minor: 2, Internal: 8},
+ },
// Step (2): Add new versions here.
})
diff --git a/pkg/sql/catalog/descpb/structured.pb.go b/pkg/sql/catalog/descpb/structured.pb.go
index 5535f9ae3b30..e81bc09121cc 100644
--- a/pkg/sql/catalog/descpb/structured.pb.go
+++ b/pkg/sql/catalog/descpb/structured.pb.go
@@ -76,7 +76,7 @@ func (x *ConstraintValidity) UnmarshalJSON(data []byte) error {
return nil
}
func (ConstraintValidity) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{0}
}
// SystemColumnKind is an enum representing the different kind of system
@@ -121,7 +121,7 @@ func (x *SystemColumnKind) UnmarshalJSON(data []byte) error {
return nil
}
func (SystemColumnKind) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{1}
}
// State indicates whether a descriptor is public (i.e., normally visible,
@@ -173,7 +173,7 @@ func (x *DescriptorState) UnmarshalJSON(data []byte) error {
return nil
}
func (DescriptorState) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{2}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{2}
}
// SurvivalGoal is the survival goal for a database.
@@ -212,7 +212,7 @@ func (x *SurvivalGoal) UnmarshalJSON(data []byte) error {
return nil
}
func (SurvivalGoal) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{3}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{3}
}
type ForeignKeyReference_Action int32
@@ -257,7 +257,7 @@ func (x *ForeignKeyReference_Action) UnmarshalJSON(data []byte) error {
return nil
}
func (ForeignKeyReference_Action) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{0, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{0, 0}
}
// Match is the algorithm used to compare composite keys.
@@ -297,7 +297,7 @@ func (x *ForeignKeyReference_Match) UnmarshalJSON(data []byte) error {
return nil
}
func (ForeignKeyReference_Match) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{0, 1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{0, 1}
}
// The direction of a column in the index.
@@ -334,7 +334,7 @@ func (x *IndexDescriptor_Direction) UnmarshalJSON(data []byte) error {
return nil
}
func (IndexDescriptor_Direction) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{8, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{8, 0}
}
// The type of the index.
@@ -371,7 +371,7 @@ func (x *IndexDescriptor_Type) UnmarshalJSON(data []byte) error {
return nil
}
func (IndexDescriptor_Type) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{8, 1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{8, 1}
}
type ConstraintToUpdate_ConstraintType int32
@@ -417,7 +417,7 @@ func (x *ConstraintToUpdate_ConstraintType) UnmarshalJSON(data []byte) error {
return nil
}
func (ConstraintToUpdate_ConstraintType) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{9, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{9, 0}
}
// A descriptor within a mutation is unavailable for reads, writes
@@ -482,7 +482,7 @@ func (x *DescriptorMutation_State) UnmarshalJSON(data []byte) error {
return nil
}
func (DescriptorMutation_State) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{13, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{13, 0}
}
// Direction of mutation.
@@ -525,7 +525,7 @@ func (x *DescriptorMutation_Direction) UnmarshalJSON(data []byte) error {
return nil
}
func (DescriptorMutation_Direction) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{13, 1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{13, 1}
}
// AuditMode indicates which auditing actions to take when this table is used.
@@ -562,7 +562,7 @@ func (x *TableDescriptor_AuditMode) UnmarshalJSON(data []byte) error {
return nil
}
func (TableDescriptor_AuditMode) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 0}
}
// Represents the kind of type that this type descriptor represents.
@@ -607,7 +607,7 @@ func (x *TypeDescriptor_Kind) UnmarshalJSON(data []byte) error {
return nil
}
func (TypeDescriptor_Kind) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{17, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{17, 0}
}
// Represents what operations are allowed on this ENUM member.
@@ -648,7 +648,7 @@ func (x *TypeDescriptor_EnumMember_Capability) UnmarshalJSON(data []byte) error
return nil
}
func (TypeDescriptor_EnumMember_Capability) EnumDescriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{17, 0, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{17, 0, 0}
}
// ForeignKeyReference is deprecated, replaced by ForeignKeyConstraint in v19.2
@@ -678,7 +678,7 @@ func (m *ForeignKeyReference) Reset() { *m = ForeignKeyReference{} }
func (m *ForeignKeyReference) String() string { return proto.CompactTextString(m) }
func (*ForeignKeyReference) ProtoMessage() {}
func (*ForeignKeyReference) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{0}
}
func (m *ForeignKeyReference) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -726,7 +726,7 @@ func (m *ForeignKeyConstraint) Reset() { *m = ForeignKeyConstraint{} }
func (m *ForeignKeyConstraint) String() string { return proto.CompactTextString(m) }
func (*ForeignKeyConstraint) ProtoMessage() {}
func (*ForeignKeyConstraint) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{1}
}
func (m *ForeignKeyConstraint) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -764,7 +764,7 @@ func (m *UniqueWithoutIndexConstraint) Reset() { *m = UniqueWithoutIndex
func (m *UniqueWithoutIndexConstraint) String() string { return proto.CompactTextString(m) }
func (*UniqueWithoutIndexConstraint) ProtoMessage() {}
func (*UniqueWithoutIndexConstraint) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{2}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{2}
}
func (m *UniqueWithoutIndexConstraint) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -811,6 +811,9 @@ type ColumnDescriptor struct {
// have been serialized in a internal format. Instead, use one of the
// schemaexpr.FormatExpr* functions.
ComputeExpr *string `protobuf:"bytes,11,opt,name=compute_expr,json=computeExpr" json:"compute_expr,omitempty"`
+ // A computed column can be stored or virtual.
+ // Virtual can only be true if there is a compute expression.
+ Virtual bool `protobuf:"varint,16,opt,name=virtual" json:"virtual"`
// PGAttributeNum must be accessed through the accessor, since it is set
// lazily, it is incorrect to access it directly.
// PGAttributeNum represents a column's number in catalog tables.
@@ -829,7 +832,7 @@ func (m *ColumnDescriptor) Reset() { *m = ColumnDescriptor{} }
func (m *ColumnDescriptor) String() string { return proto.CompactTextString(m) }
func (*ColumnDescriptor) ProtoMessage() {}
func (*ColumnDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{3}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{3}
}
func (m *ColumnDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -885,7 +888,7 @@ func (m *ColumnFamilyDescriptor) Reset() { *m = ColumnFamilyDescriptor{}
func (m *ColumnFamilyDescriptor) String() string { return proto.CompactTextString(m) }
func (*ColumnFamilyDescriptor) ProtoMessage() {}
func (*ColumnFamilyDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{4}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{4}
}
func (m *ColumnFamilyDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -931,7 +934,7 @@ func (m *InterleaveDescriptor) Reset() { *m = InterleaveDescriptor{} }
func (m *InterleaveDescriptor) String() string { return proto.CompactTextString(m) }
func (*InterleaveDescriptor) ProtoMessage() {}
func (*InterleaveDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{5}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{5}
}
func (m *InterleaveDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -975,7 +978,7 @@ func (m *InterleaveDescriptor_Ancestor) Reset() { *m = InterleaveDescrip
func (m *InterleaveDescriptor_Ancestor) String() string { return proto.CompactTextString(m) }
func (*InterleaveDescriptor_Ancestor) ProtoMessage() {}
func (*InterleaveDescriptor_Ancestor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{5, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{5, 0}
}
func (m *InterleaveDescriptor_Ancestor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1030,7 +1033,7 @@ func (m *ShardedDescriptor) Reset() { *m = ShardedDescriptor{} }
func (m *ShardedDescriptor) String() string { return proto.CompactTextString(m) }
func (*ShardedDescriptor) ProtoMessage() {}
func (*ShardedDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{6}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{6}
}
func (m *ShardedDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1075,7 +1078,7 @@ func (m *PartitioningDescriptor) Reset() { *m = PartitioningDescriptor{}
func (m *PartitioningDescriptor) String() string { return proto.CompactTextString(m) }
func (*PartitioningDescriptor) ProtoMessage() {}
func (*PartitioningDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{7}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{7}
}
func (m *PartitioningDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1118,7 +1121,7 @@ func (m *PartitioningDescriptor_List) Reset() { *m = PartitioningDescrip
func (m *PartitioningDescriptor_List) String() string { return proto.CompactTextString(m) }
func (*PartitioningDescriptor_List) ProtoMessage() {}
func (*PartitioningDescriptor_List) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{7, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{7, 0}
}
func (m *PartitioningDescriptor_List) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1163,7 +1166,7 @@ func (m *PartitioningDescriptor_Range) Reset() { *m = PartitioningDescri
func (m *PartitioningDescriptor_Range) String() string { return proto.CompactTextString(m) }
func (*PartitioningDescriptor_Range) ProtoMessage() {}
func (*PartitioningDescriptor_Range) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{7, 1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{7, 1}
}
func (m *PartitioningDescriptor_Range) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1330,7 +1333,7 @@ func (m *IndexDescriptor) Reset() { *m = IndexDescriptor{} }
func (m *IndexDescriptor) String() string { return proto.CompactTextString(m) }
func (*IndexDescriptor) ProtoMessage() {}
func (*IndexDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{8}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{8}
}
func (m *IndexDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1382,7 +1385,7 @@ func (m *ConstraintToUpdate) Reset() { *m = ConstraintToUpdate{} }
func (m *ConstraintToUpdate) String() string { return proto.CompactTextString(m) }
func (*ConstraintToUpdate) ProtoMessage() {}
func (*ConstraintToUpdate) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{9}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{9}
}
func (m *ConstraintToUpdate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1425,7 +1428,7 @@ func (m *PrimaryKeySwap) Reset() { *m = PrimaryKeySwap{} }
func (m *PrimaryKeySwap) String() string { return proto.CompactTextString(m) }
func (*PrimaryKeySwap) ProtoMessage() {}
func (*PrimaryKeySwap) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{10}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{10}
}
func (m *PrimaryKeySwap) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1465,7 +1468,7 @@ func (m *ComputedColumnSwap) Reset() { *m = ComputedColumnSwap{} }
func (m *ComputedColumnSwap) String() string { return proto.CompactTextString(m) }
func (*ComputedColumnSwap) ProtoMessage() {}
func (*ComputedColumnSwap) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{11}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{11}
}
func (m *ComputedColumnSwap) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1513,7 +1516,7 @@ func (m *MaterializedViewRefresh) Reset() { *m = MaterializedViewRefresh
func (m *MaterializedViewRefresh) String() string { return proto.CompactTextString(m) }
func (*MaterializedViewRefresh) ProtoMessage() {}
func (*MaterializedViewRefresh) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{12}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{12}
}
func (m *MaterializedViewRefresh) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1570,7 +1573,7 @@ func (m *DescriptorMutation) Reset() { *m = DescriptorMutation{} }
func (m *DescriptorMutation) String() string { return proto.CompactTextString(m) }
func (*DescriptorMutation) ProtoMessage() {}
func (*DescriptorMutation) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{13}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{13}
}
func (m *DescriptorMutation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1908,7 +1911,7 @@ func (m *NameInfo) Reset() { *m = NameInfo{} }
func (m *NameInfo) String() string { return proto.CompactTextString(m) }
func (*NameInfo) ProtoMessage() {}
func (*NameInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{14}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{14}
}
func (m *NameInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2094,7 +2097,7 @@ func (m *TableDescriptor) Reset() { *m = TableDescriptor{} }
func (m *TableDescriptor) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor) ProtoMessage() {}
func (*TableDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15}
}
func (m *TableDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2415,7 +2418,7 @@ func (m *TableDescriptor_SchemaChangeLease) Reset() { *m = TableDescript
func (m *TableDescriptor_SchemaChangeLease) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_SchemaChangeLease) ProtoMessage() {}
func (*TableDescriptor_SchemaChangeLease) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 0}
}
func (m *TableDescriptor_SchemaChangeLease) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2461,7 +2464,7 @@ func (m *TableDescriptor_CheckConstraint) Reset() { *m = TableDescriptor
func (m *TableDescriptor_CheckConstraint) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_CheckConstraint) ProtoMessage() {}
func (*TableDescriptor_CheckConstraint) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 1}
}
func (m *TableDescriptor_CheckConstraint) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2501,7 +2504,7 @@ func (m *TableDescriptor_Reference) Reset() { *m = TableDescriptor_Refer
func (m *TableDescriptor_Reference) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_Reference) ProtoMessage() {}
func (*TableDescriptor_Reference) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 2}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 2}
}
func (m *TableDescriptor_Reference) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2538,7 +2541,7 @@ func (m *TableDescriptor_MutationJob) Reset() { *m = TableDescriptor_Mut
func (m *TableDescriptor_MutationJob) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_MutationJob) ProtoMessage() {}
func (*TableDescriptor_MutationJob) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 3}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 3}
}
func (m *TableDescriptor_MutationJob) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2581,7 +2584,7 @@ func (m *TableDescriptor_SequenceOpts) Reset() { *m = TableDescriptor_Se
func (m *TableDescriptor_SequenceOpts) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_SequenceOpts) ProtoMessage() {}
func (*TableDescriptor_SequenceOpts) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 4}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 4}
}
func (m *TableDescriptor_SequenceOpts) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2621,7 +2624,7 @@ func (m *TableDescriptor_SequenceOpts_SequenceOwner) String() string {
}
func (*TableDescriptor_SequenceOpts_SequenceOwner) ProtoMessage() {}
func (*TableDescriptor_SequenceOpts_SequenceOwner) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 4, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 4, 0}
}
func (m *TableDescriptor_SequenceOpts_SequenceOwner) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2661,7 +2664,7 @@ func (m *TableDescriptor_Replacement) Reset() { *m = TableDescriptor_Rep
func (m *TableDescriptor_Replacement) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_Replacement) ProtoMessage() {}
func (*TableDescriptor_Replacement) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 5}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 5}
}
func (m *TableDescriptor_Replacement) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2698,7 +2701,7 @@ func (m *TableDescriptor_GCDescriptorMutation) Reset() { *m = TableDescr
func (m *TableDescriptor_GCDescriptorMutation) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_GCDescriptorMutation) ProtoMessage() {}
func (*TableDescriptor_GCDescriptorMutation) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 6}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 6}
}
func (m *TableDescriptor_GCDescriptorMutation) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2735,7 +2738,7 @@ func (m *TableDescriptor_LocalityConfig) Reset() { *m = TableDescriptor_
func (m *TableDescriptor_LocalityConfig) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_LocalityConfig) ProtoMessage() {}
func (*TableDescriptor_LocalityConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 7}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 7}
}
func (m *TableDescriptor_LocalityConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2915,7 +2918,7 @@ func (m *TableDescriptor_LocalityConfig_RegionalByTable) String() string {
}
func (*TableDescriptor_LocalityConfig_RegionalByTable) ProtoMessage() {}
func (*TableDescriptor_LocalityConfig_RegionalByTable) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 7, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 7, 0}
}
func (m *TableDescriptor_LocalityConfig_RegionalByTable) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2951,7 +2954,7 @@ func (m *TableDescriptor_LocalityConfig_RegionalByRow) String() string {
}
func (*TableDescriptor_LocalityConfig_RegionalByRow) ProtoMessage() {}
func (*TableDescriptor_LocalityConfig_RegionalByRow) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 7, 1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 7, 1}
}
func (m *TableDescriptor_LocalityConfig_RegionalByRow) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -2983,7 +2986,7 @@ func (m *TableDescriptor_LocalityConfig_Global) Reset() { *m = TableDesc
func (m *TableDescriptor_LocalityConfig_Global) String() string { return proto.CompactTextString(m) }
func (*TableDescriptor_LocalityConfig_Global) ProtoMessage() {}
func (*TableDescriptor_LocalityConfig_Global) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{15, 7, 2}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{15, 7, 2}
}
func (m *TableDescriptor_LocalityConfig_Global) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3034,7 +3037,7 @@ func (m *DatabaseDescriptor) Reset() { *m = DatabaseDescriptor{} }
func (m *DatabaseDescriptor) String() string { return proto.CompactTextString(m) }
func (*DatabaseDescriptor) ProtoMessage() {}
func (*DatabaseDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{16}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{16}
}
func (m *DatabaseDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3142,7 +3145,7 @@ func (m *DatabaseDescriptor_SchemaInfo) Reset() { *m = DatabaseDescripto
func (m *DatabaseDescriptor_SchemaInfo) String() string { return proto.CompactTextString(m) }
func (*DatabaseDescriptor_SchemaInfo) ProtoMessage() {}
func (*DatabaseDescriptor_SchemaInfo) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{16, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{16, 0}
}
func (m *DatabaseDescriptor_SchemaInfo) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3182,7 +3185,7 @@ func (m *DatabaseDescriptor_RegionConfig) Reset() { *m = DatabaseDescrip
func (m *DatabaseDescriptor_RegionConfig) String() string { return proto.CompactTextString(m) }
func (*DatabaseDescriptor_RegionConfig) ProtoMessage() {}
func (*DatabaseDescriptor_RegionConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{16, 2}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{16, 2}
}
func (m *DatabaseDescriptor_RegionConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3245,7 +3248,7 @@ func (m *TypeDescriptor) Reset() { *m = TypeDescriptor{} }
func (m *TypeDescriptor) String() string { return proto.CompactTextString(m) }
func (*TypeDescriptor) ProtoMessage() {}
func (*TypeDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{17}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{17}
}
func (m *TypeDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3393,7 +3396,7 @@ func (m *TypeDescriptor_EnumMember) Reset() { *m = TypeDescriptor_EnumMe
func (m *TypeDescriptor_EnumMember) String() string { return proto.CompactTextString(m) }
func (*TypeDescriptor_EnumMember) ProtoMessage() {}
func (*TypeDescriptor_EnumMember) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{17, 0}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{17, 0}
}
func (m *TypeDescriptor_EnumMember) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3429,7 +3432,7 @@ func (m *TypeDescriptor_RegionConfig) Reset() { *m = TypeDescriptor_Regi
func (m *TypeDescriptor_RegionConfig) String() string { return proto.CompactTextString(m) }
func (*TypeDescriptor_RegionConfig) ProtoMessage() {}
func (*TypeDescriptor_RegionConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{17, 1}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{17, 1}
}
func (m *TypeDescriptor_RegionConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3477,7 +3480,7 @@ func (m *SchemaDescriptor) Reset() { *m = SchemaDescriptor{} }
func (m *SchemaDescriptor) String() string { return proto.CompactTextString(m) }
func (*SchemaDescriptor) ProtoMessage() {}
func (*SchemaDescriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{18}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{18}
}
func (m *SchemaDescriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -3580,7 +3583,7 @@ func (m *Descriptor) Reset() { *m = Descriptor{} }
func (m *Descriptor) String() string { return proto.CompactTextString(m) }
func (*Descriptor) ProtoMessage() {}
func (*Descriptor) Descriptor() ([]byte, []int) {
- return fileDescriptor_structured_eec61b4c16e747bf, []int{19}
+ return fileDescriptor_structured_29f0c5457f51e4e6, []int{19}
}
func (m *Descriptor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -4042,6 +4045,9 @@ func (this *ColumnDescriptor) Equal(that interface{}) bool {
} else if that1.ComputeExpr != nil {
return false
}
+ if this.Virtual != that1.Virtual {
+ return false
+ }
if this.PGAttributeNum != that1.PGAttributeNum {
return false
}
@@ -6103,6 +6109,16 @@ func (m *ColumnDescriptor) MarshalTo(dAtA []byte) (int, error) {
dAtA[i] = 0x78
i++
i = encodeVarintStructured(dAtA, i, uint64(m.SystemColumnKind))
+ dAtA[i] = 0x80
+ i++
+ dAtA[i] = 0x1
+ i++
+ if m.Virtual {
+ dAtA[i] = 1
+ } else {
+ dAtA[i] = 0
+ }
+ i++
return i, nil
}
@@ -8267,6 +8283,7 @@ func (m *ColumnDescriptor) Size() (n int) {
n += 1 + sovStructured(uint64(m.PGAttributeNum))
n += 2
n += 1 + sovStructured(uint64(m.SystemColumnKind))
+ n += 3
return n
}
@@ -10382,6 +10399,26 @@ func (m *ColumnDescriptor) Unmarshal(dAtA []byte) error {
break
}
}
+ case 16:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Virtual", wireType)
+ }
+ var v int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowStructured
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ v |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ m.Virtual = bool(v != 0)
default:
iNdEx = preIndex
skippy, err := skipStructured(dAtA[iNdEx:])
@@ -17851,18 +17888,18 @@ var (
)
func init() {
- proto.RegisterFile("sql/catalog/descpb/structured.proto", fileDescriptor_structured_eec61b4c16e747bf)
+ proto.RegisterFile("sql/catalog/descpb/structured.proto", fileDescriptor_structured_29f0c5457f51e4e6)
}
-var fileDescriptor_structured_eec61b4c16e747bf = []byte{
- // 5067 bytes of a gzipped FileDescriptorProto
+var fileDescriptor_structured_29f0c5457f51e4e6 = []byte{
+ // 5074 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7b, 0x49, 0x70, 0x1b, 0xd9,
0x79, 0x30, 0xb1, 0x03, 0x1f, 0xb6, 0xe6, 0x13, 0x25, 0x61, 0xe8, 0x19, 0x92, 0x82, 0x46, 0x33,
0x9c, 0x19, 0x0f, 0xa9, 0xa1, 0xbc, 0xc8, 0x1e, 0xdb, 0x35, 0x20, 0x00, 0x8a, 0xe0, 0x02, 0x70,
0x9a, 0xa4, 0x34, 0xb6, 0xff, 0xdf, 0xed, 0x26, 0xfa, 0x01, 0xec, 0x51, 0xa3, 0x1b, 0xea, 0x6e,
- 0x48, 0x44, 0x2a, 0x87, 0x94, 0x73, 0xc9, 0x29, 0xcb, 0x21, 0xc7, 0x54, 0x5c, 0x29, 0x57, 0xc5,
- 0xb7, 0x94, 0x2f, 0xc9, 0x2d, 0x87, 0x1c, 0x52, 0xbe, 0xc5, 0xb9, 0xf9, 0xc4, 0x4a, 0x38, 0x97,
- 0xdc, 0x92, 0x5c, 0xe2, 0xaa, 0x39, 0xa5, 0xde, 0xd6, 0x0b, 0x16, 0x0a, 0x24, 0x27, 0x3e, 0x48,
+ 0x48, 0x44, 0x2a, 0x87, 0x94, 0x73, 0xc9, 0x29, 0x89, 0x0f, 0x39, 0xa6, 0xe2, 0x4a, 0xb9, 0x2a,
+ 0xbe, 0xa5, 0x7c, 0x49, 0x6e, 0x39, 0xe4, 0x90, 0xf2, 0x2d, 0xce, 0xcd, 0x27, 0x56, 0xc2, 0xb9,
+ 0xe4, 0x96, 0x9c, 0xe2, 0xaa, 0x39, 0xa5, 0xde, 0xd6, 0x0b, 0x16, 0x0a, 0x24, 0x27, 0x3e, 0x48,
0xc5, 0xfe, 0xb6, 0xb7, 0x7d, 0xfb, 0x7b, 0x80, 0xfb, 0xce, 0x0b, 0x63, 0xbd, 0xad, 0xba, 0xaa,
0x61, 0x75, 0xd7, 0x35, 0xec, 0xb4, 0xfb, 0x27, 0xeb, 0x8e, 0x6b, 0x0f, 0xda, 0xee, 0xc0, 0xc6,
0xda, 0x5a, 0xdf, 0xb6, 0x5c, 0x0b, 0xdd, 0x6e, 0x5b, 0xed, 0xe7, 0xb6, 0xa5, 0xb6, 0x4f, 0xd7,
@@ -17872,7 +17909,7 @@ var fileDescriptor_structured_eec61b4c16e747bf = []byte{
0xf0, 0x1b, 0x5d, 0x6c, 0xad, 0x77, 0xb1, 0xa5, 0x9b, 0x1a, 0x3e, 0x5b, 0x6f, 0x5b, 0x66, 0x47,
0xef, 0x72, 0xd4, 0x42, 0xd7, 0xea, 0x5a, 0xf4, 0xcf, 0x75, 0xf2, 0x17, 0x83, 0x96, 0x7f, 0x96,
0x80, 0x5b, 0x5b, 0x96, 0x8d, 0xf5, 0xae, 0xb9, 0x8b, 0x87, 0x32, 0xee, 0x60, 0x1b, 0x9b, 0x6d,
- 0x8c, 0x56, 0x20, 0xe1, 0xaa, 0x27, 0x06, 0x2e, 0x45, 0x56, 0x22, 0xab, 0xf9, 0x4d, 0xf8, 0xf5,
+ 0x8c, 0x56, 0x20, 0xe1, 0xaa, 0x27, 0x06, 0x2e, 0x45, 0x56, 0x22, 0xab, 0xf9, 0x4d, 0xf8, 0xcd,
0xf9, 0xf2, 0xdc, 0x97, 0xe7, 0xcb, 0xd1, 0x46, 0x4d, 0x66, 0x08, 0xf4, 0x00, 0x12, 0x74, 0x94,
0x52, 0x94, 0x52, 0x14, 0x39, 0x45, 0xaa, 0x41, 0x80, 0x84, 0x8c, 0x62, 0x51, 0x09, 0xe2, 0xa6,
0xda, 0xc3, 0xa5, 0xd8, 0x4a, 0x64, 0x35, 0xb3, 0x19, 0x27, 0x54, 0x32, 0x85, 0xa0, 0x5d, 0x48,
@@ -17888,10 +17925,10 @@ var fileDescriptor_structured_eec61b4c16e747bf = []byte{
0x4d, 0x69, 0x0e, 0xe5, 0x20, 0x2d, 0xd7, 0x0f, 0x8f, 0xe4, 0x46, 0xf5, 0x48, 0x8a, 0x90, 0xaf,
0xc3, 0xfa, 0x91, 0xd2, 0x3c, 0xde, 0xdb, 0x93, 0xa2, 0xa8, 0x08, 0x59, 0xf2, 0x55, 0xab, 0x6f,
0x55, 0x8e, 0xf7, 0x8e, 0xa4, 0x18, 0xca, 0x42, 0xaa, 0x5a, 0x39, 0xac, 0x56, 0x6a, 0x75, 0x29,
- 0xbe, 0x18, 0xff, 0xe5, 0x2f, 0x96, 0xe6, 0xca, 0x0f, 0x21, 0x41, 0x87, 0x43, 0x00, 0xc9, 0xc3,
+ 0xbe, 0x18, 0xff, 0xd5, 0x2f, 0x97, 0xe6, 0xca, 0x0f, 0x21, 0x41, 0x87, 0x43, 0x00, 0xc9, 0xc3,
0xc6, 0xfe, 0xc1, 0x5e, 0x5d, 0x9a, 0x43, 0x69, 0x88, 0x6f, 0x11, 0x11, 0x11, 0xc2, 0x71, 0x50,
- 0x91, 0x8f, 0x1a, 0x95, 0x3d, 0x29, 0xca, 0x38, 0xbe, 0x1b, 0xff, 0x8f, 0x9f, 0x2f, 0x47, 0xca,
- 0xff, 0x9a, 0x80, 0x05, 0x7f, 0xee, 0xfe, 0x69, 0xa3, 0x2a, 0x14, 0x2d, 0x5b, 0xef, 0xea, 0xa6,
+ 0x91, 0x8f, 0x1a, 0x95, 0x3d, 0x29, 0xca, 0x38, 0xbe, 0x1b, 0xff, 0xcf, 0x5f, 0x2c, 0x47, 0xca,
+ 0xff, 0x96, 0x80, 0x05, 0x7f, 0xee, 0xfe, 0x69, 0xa3, 0x2a, 0x14, 0x2d, 0x5b, 0xef, 0xea, 0xa6,
0x42, 0x75, 0x4e, 0xd1, 0x35, 0xae, 0x8f, 0x5f, 0x23, 0xeb, 0xb9, 0x38, 0x5f, 0xce, 0xb7, 0x28,
0xfa, 0x88, 0x60, 0x1b, 0x35, 0xae, 0xa0, 0x79, 0x2b, 0x00, 0xd4, 0xd0, 0x2e, 0xcc, 0x73, 0x21,
0x6d, 0xcb, 0x18, 0xf4, 0x4c, 0x45, 0xd7, 0x9c, 0x52, 0x74, 0x25, 0xb6, 0x9a, 0xdf, 0x5c, 0xbe,
@@ -17902,275 +17939,276 @@ var fileDescriptor_structured_eec61b4c16e747bf = []byte{
0x5e, 0xf2, 0xbc, 0x3d, 0x82, 0xd0, 0x3c, 0xc3, 0x4b, 0x5c, 0x6a, 0x78, 0xc9, 0x9b, 0x1a, 0x5e,
0xc8, 0x8c, 0x52, 0xff, 0x27, 0x66, 0x94, 0xfe, 0xca, 0xcd, 0x28, 0xf3, 0x15, 0x98, 0x11, 0xd3,
0xdd, 0x9d, 0x78, 0x1a, 0xa4, 0xec, 0x4e, 0x3c, 0x9d, 0x95, 0x72, 0x3b, 0xf1, 0x74, 0x4e, 0xca,
- 0xef, 0xc4, 0xd3, 0x79, 0xa9, 0x50, 0xfe, 0x5d, 0x04, 0xde, 0x3c, 0x36, 0xf5, 0x17, 0x03, 0xfc,
+ 0xef, 0xc4, 0xd3, 0x79, 0xa9, 0x50, 0xfe, 0x7d, 0x04, 0xde, 0x3c, 0x36, 0xf5, 0x17, 0x03, 0xfc,
0x4c, 0x77, 0x4f, 0xad, 0x81, 0x4b, 0xfd, 0x62, 0x40, 0xb7, 0x1f, 0x42, 0x7a, 0x44, 0xa9, 0x6f,
0xf3, 0x53, 0x4e, 0x85, 0xcf, 0x36, 0xe5, 0xf2, 0x13, 0x7d, 0x0c, 0x30, 0xa6, 0xc1, 0x6f, 0x5c,
- 0x9c, 0x2f, 0x67, 0x26, 0xab, 0x59, 0xa6, 0xed, 0x29, 0xd7, 0xef, 0xc7, 0x09, 0x73, 0x6b, 0xfe,
- 0xef, 0x38, 0x48, 0x6c, 0x12, 0x35, 0xec, 0xb4, 0x6d, 0xbd, 0xef, 0x5a, 0xb6, 0x37, 0x83, 0xc8,
- 0xd8, 0x0c, 0xde, 0x81, 0xa8, 0xae, 0xf1, 0x20, 0x72, 0x87, 0xef, 0x40, 0x94, 0x2e, 0xde, 0x5f,
- 0x4a, 0x54, 0xd7, 0xd0, 0x1a, 0xc4, 0x49, 0xa4, 0xa3, 0x6b, 0xc8, 0x6e, 0x2c, 0x8e, 0xce, 0x12,
- 0xf7, 0xd6, 0x58, 0x20, 0x3c, 0x92, 0x29, 0x1d, 0x5a, 0x81, 0xb4, 0x39, 0x30, 0x0c, 0x1a, 0xc4,
- 0xc8, 0xca, 0xd2, 0x62, 0xba, 0x02, 0x8a, 0xee, 0x41, 0x4e, 0xc3, 0x1d, 0x75, 0x60, 0xb8, 0x0a,
- 0x3e, 0xeb, 0xdb, 0xcc, 0x52, 0xe4, 0x2c, 0x87, 0xd5, 0xcf, 0xfa, 0x36, 0x7a, 0x13, 0x92, 0xa7,
- 0xba, 0xa6, 0x61, 0x93, 0x1a, 0x8a, 0x10, 0xc1, 0x61, 0x68, 0x03, 0xe6, 0x07, 0x0e, 0x76, 0x14,
- 0x07, 0xbf, 0x18, 0x10, 0x2d, 0xa1, 0xe7, 0x02, 0xf4, 0x5c, 0x92, 0xfc, 0xf0, 0x8a, 0x84, 0xe0,
- 0x90, 0xe3, 0xc9, 0x51, 0xdc, 0x83, 0x5c, 0xdb, 0xea, 0xf5, 0x07, 0x2e, 0x66, 0x83, 0x66, 0xd9,
- 0xa0, 0x1c, 0x46, 0x07, 0xdd, 0x80, 0x79, 0xeb, 0x95, 0x39, 0x22, 0x36, 0x17, 0x16, 0x4b, 0x08,
- 0x82, 0x62, 0x3f, 0x01, 0xa9, 0xdf, 0x55, 0x54, 0xd7, 0xb5, 0xf5, 0x13, 0x22, 0xdb, 0x1c, 0xf4,
- 0x4a, 0xf9, 0xd0, 0x9e, 0x16, 0x0e, 0x9e, 0x54, 0x04, 0xba, 0x39, 0xe8, 0xc9, 0x85, 0x7e, 0x37,
- 0xf8, 0x8d, 0xb6, 0xe0, 0x2d, 0xd5, 0x70, 0xb1, 0x2d, 0x9c, 0x1a, 0xd9, 0x44, 0x45, 0x37, 0x95,
- 0xbe, 0x6d, 0x75, 0x6d, 0xec, 0x38, 0xa5, 0x42, 0x60, 0x07, 0xde, 0xa0, 0xa4, 0xec, 0x7c, 0x8e,
- 0x86, 0x7d, 0xdc, 0x30, 0x0f, 0x38, 0x19, 0xfa, 0x31, 0x20, 0x67, 0xe8, 0xb8, 0xb8, 0x27, 0x04,
- 0x3d, 0xd7, 0x4d, 0xad, 0x54, 0xa4, 0xba, 0xf5, 0xee, 0x14, 0xdd, 0x3a, 0xa4, 0x0c, 0x4c, 0xdc,
- 0xae, 0x6e, 0x6a, 0x7c, 0x14, 0xc9, 0x19, 0x81, 0x7b, 0x36, 0x97, 0x96, 0x32, 0x3b, 0xf1, 0x74,
- 0x46, 0x82, 0x9d, 0x78, 0x3a, 0x25, 0xa5, 0xcb, 0x7f, 0x1a, 0x85, 0x3b, 0x8c, 0x6c, 0x4b, 0xed,
- 0xe9, 0xc6, 0xf0, 0xa6, 0x9a, 0xc7, 0xa4, 0x70, 0xcd, 0xa3, 0x47, 0x46, 0x97, 0x42, 0xd8, 0x98,
- 0xab, 0xa7, 0x47, 0x46, 0x60, 0x4d, 0x02, 0x1a, 0x31, 0xcd, 0xf8, 0x15, 0x4c, 0xb3, 0x05, 0xf3,
- 0x42, 0x09, 0x3d, 0x09, 0x54, 0x13, 0xf3, 0x9b, 0xf7, 0xf9, 0x9c, 0x8a, 0x35, 0x46, 0x20, 0xd8,
- 0xc3, 0x11, 0x4a, 0x0b, 0x21, 0xf9, 0x16, 0x95, 0xff, 0x21, 0x0a, 0x0b, 0x0d, 0xd3, 0xc5, 0xb6,
- 0x81, 0xd5, 0x97, 0x38, 0xb0, 0x1d, 0x9f, 0x41, 0x46, 0x35, 0xdb, 0xd8, 0x71, 0x2d, 0xdb, 0x29,
- 0x45, 0x56, 0x62, 0xab, 0xd9, 0x8d, 0x6f, 0x4c, 0x39, 0x95, 0x49, 0xfc, 0x6b, 0x15, 0xce, 0xcc,
- 0x77, 0xd2, 0x17, 0xb6, 0xf8, 0x8f, 0x11, 0x48, 0x0b, 0xec, 0x35, 0xbc, 0xdb, 0x37, 0x21, 0x4d,
- 0x33, 0x46, 0xc5, 0x3b, 0x93, 0x45, 0xc1, 0xc1, 0x53, 0xca, 0x60, 0x76, 0x99, 0xa2, 0xb4, 0x0d,
- 0x0d, 0x55, 0x27, 0x25, 0x7e, 0x31, 0xca, 0x7f, 0x57, 0xec, 0xdf, 0x61, 0x38, 0xf5, 0x1b, 0xcb,
- 0x05, 0xd9, 0x9e, 0xf1, 0x9d, 0xfb, 0xfb, 0x08, 0xcc, 0x13, 0x06, 0x0d, 0x6b, 0x81, 0x6d, 0xbb,
- 0x0f, 0xa0, 0x3b, 0x8a, 0xc3, 0xe0, 0x74, 0x45, 0xc2, 0x14, 0x32, 0xba, 0xc3, 0xc9, 0x3d, 0x55,
- 0x8b, 0x8e, 0xa9, 0xda, 0x77, 0x20, 0x4f, 0x79, 0x95, 0x93, 0x41, 0xfb, 0x39, 0x76, 0x1d, 0x3a,
- 0xc3, 0xc4, 0xe6, 0x02, 0x9f, 0x61, 0x8e, 0x4a, 0xd8, 0x64, 0x38, 0x39, 0xe7, 0x04, 0xbe, 0xc6,
- 0xb4, 0x2f, 0x3e, 0xa6, 0x7d, 0x7c, 0xe2, 0xbf, 0x8b, 0xc1, 0x9d, 0x03, 0xd5, 0x76, 0x75, 0x12,
- 0xfb, 0x74, 0xb3, 0x1b, 0x98, 0xfd, 0x03, 0xc8, 0x9a, 0x03, 0x61, 0x90, 0x0e, 0x3f, 0x10, 0x36,
- 0x3f, 0x30, 0x07, 0xdc, 0xc0, 0x1c, 0xb4, 0x07, 0x71, 0x43, 0x77, 0x5c, 0x1a, 0x5a, 0xb2, 0x1b,
- 0x1b, 0x53, 0xd4, 0x62, 0xf2, 0x18, 0x6b, 0x7b, 0xba, 0xe3, 0x8a, 0x35, 0x13, 0x29, 0xa8, 0x05,
- 0x09, 0x5b, 0x35, 0xbb, 0x98, 0xda, 0x4b, 0x76, 0xe3, 0xd1, 0xd5, 0xc4, 0xc9, 0x84, 0x55, 0x04,
- 0x5c, 0x2a, 0x67, 0xf1, 0xaf, 0x22, 0x10, 0x27, 0xa3, 0x5c, 0x62, 0xd2, 0x77, 0x20, 0xf9, 0x52,
- 0x35, 0x06, 0x98, 0x85, 0xc7, 0x9c, 0xcc, 0xbf, 0xd0, 0xff, 0x87, 0xa2, 0x33, 0x38, 0xe9, 0x07,
- 0x86, 0xe2, 0x71, 0xe4, 0xc3, 0x2b, 0xcd, 0xca, 0xab, 0x25, 0xc2, 0xb2, 0xd8, 0x01, 0x2c, 0xbe,
- 0x80, 0x04, 0x9d, 0xf5, 0x25, 0xf3, 0xbb, 0x07, 0x39, 0xd7, 0x52, 0xf0, 0x59, 0xdb, 0x18, 0x38,
- 0xfa, 0x4b, 0xa6, 0x29, 0x39, 0x39, 0xeb, 0x5a, 0x75, 0x01, 0x42, 0x0f, 0xa0, 0xd0, 0xb1, 0xad,
- 0x9e, 0xa2, 0x9b, 0x82, 0x28, 0x46, 0x89, 0xf2, 0x04, 0xda, 0x10, 0xc0, 0x90, 0xca, 0xfe, 0x65,
- 0x0e, 0x8a, 0xd4, 0x30, 0x66, 0x72, 0x7b, 0x0f, 0x02, 0x6e, 0xef, 0x76, 0xc8, 0xed, 0x79, 0xd6,
- 0x45, 0xbc, 0xde, 0x9b, 0x90, 0x1c, 0xd0, 0xfc, 0x85, 0x8e, 0xef, 0x85, 0x3e, 0x06, 0x9b, 0x41,
- 0x2b, 0xd1, 0xd7, 0x01, 0x11, 0x57, 0x80, 0x95, 0x10, 0x61, 0x82, 0x12, 0x4a, 0x14, 0x53, 0x9d,
- 0xea, 0x41, 0x93, 0x57, 0xf0, 0xa0, 0xdb, 0x20, 0xe1, 0x33, 0xd7, 0x56, 0x83, 0xd9, 0x78, 0x8a,
- 0xf2, 0x2f, 0x91, 0xb0, 0x57, 0x27, 0xb8, 0xc9, 0x42, 0x0a, 0x38, 0x80, 0xd3, 0x88, 0x96, 0xcc,
- 0x73, 0x19, 0x9a, 0x6e, 0x63, 0x9a, 0x43, 0x3a, 0xa5, 0xf4, 0x4a, 0xec, 0x92, 0x5c, 0x71, 0x64,
- 0xdb, 0xd7, 0x6a, 0x82, 0x51, 0x96, 0x98, 0x28, 0x0f, 0xe0, 0xa0, 0x43, 0xc8, 0x76, 0x58, 0x6a,
- 0xa9, 0x3c, 0xc7, 0x43, 0x9a, 0x84, 0x66, 0x37, 0xde, 0x9f, 0x3d, 0x09, 0xdd, 0x4c, 0x92, 0x23,
- 0x28, 0x45, 0x64, 0xe8, 0x78, 0x48, 0xf4, 0x0c, 0xf2, 0x81, 0xba, 0xe1, 0x64, 0x48, 0xf3, 0x8f,
- 0xeb, 0x89, 0xcd, 0xf9, 0x82, 0x36, 0x87, 0xe8, 0x53, 0x00, 0xdd, 0x0b, 0x00, 0x34, 0x4d, 0xc9,
- 0x6e, 0x7c, 0x70, 0x85, 0x48, 0x21, 0xfc, 0x8b, 0x2f, 0x04, 0x3d, 0x83, 0x82, 0xff, 0x45, 0x27,
- 0x9b, 0xbb, 0xf2, 0x64, 0x99, 0xd4, 0x7c, 0x40, 0xce, 0x26, 0x29, 0x42, 0x16, 0x48, 0x02, 0x65,
- 0x39, 0xba, 0x8b, 0x83, 0x6a, 0x90, 0xa7, 0x6a, 0x50, 0xbe, 0x38, 0x5f, 0x46, 0x55, 0x81, 0x9f,
- 0xac, 0x0a, 0xa8, 0x3d, 0x82, 0x67, 0x8a, 0x15, 0x52, 0x60, 0x22, 0xb1, 0xe0, 0x2b, 0xd6, 0xa1,
- 0xaf, 0xc2, 0x63, 0x8a, 0x15, 0x50, 0x6f, 0x56, 0x35, 0xe6, 0x42, 0xbe, 0xa7, 0x78, 0x7d, 0xdf,
- 0x13, 0x12, 0x84, 0xea, 0x3c, 0x29, 0x96, 0x68, 0x7a, 0xf5, 0xc1, 0x8c, 0x4a, 0x4a, 0x32, 0x36,
- 0xe1, 0x12, 0x68, 0xae, 0xfc, 0x08, 0x50, 0xdb, 0xc6, 0xaa, 0x8b, 0x35, 0x92, 0x94, 0x1a, 0x7a,
- 0x5b, 0x77, 0x8d, 0x61, 0x69, 0x3e, 0x60, 0xf7, 0xf3, 0x1c, 0x5f, 0xf7, 0xd0, 0xe8, 0x31, 0xa4,
- 0x5e, 0x62, 0xdb, 0xd1, 0x2d, 0xb3, 0x84, 0xa8, 0x33, 0x59, 0xe2, 0x2d, 0xa0, 0x3b, 0x23, 0xe3,
- 0x3d, 0x65, 0x54, 0xb2, 0x20, 0x47, 0xdb, 0x90, 0xc7, 0x66, 0xdb, 0xd2, 0x74, 0xb3, 0x4b, 0xd3,
- 0xcc, 0xd2, 0x2d, 0x3f, 0xdf, 0xf9, 0xf2, 0x7c, 0xf9, 0x6b, 0x23, 0xfc, 0x75, 0x4e, 0x4b, 0xa6,
- 0x2d, 0xe7, 0x70, 0xe0, 0x0b, 0x6d, 0x43, 0x4a, 0xc4, 0xe4, 0x05, 0xba, 0xa7, 0xab, 0xd3, 0x32,
- 0xcc, 0xd1, 0x88, 0xce, 0xd7, 0x25, 0xd8, 0x49, 0xb9, 0xa0, 0xe9, 0x0e, 0xc9, 0x45, 0xb4, 0xd2,
- 0xed, 0x60, 0xb9, 0x20, 0xa0, 0xa8, 0x0a, 0xd0, 0xc5, 0x96, 0xc2, 0x9a, 0x6a, 0xa5, 0x3b, 0x74,
- 0xb8, 0xa5, 0xc0, 0x70, 0x5d, 0x6c, 0xad, 0x89, 0xd6, 0x1b, 0xa9, 0x96, 0x3a, 0x7a, 0x57, 0xa4,
- 0x08, 0x5d, 0x6c, 0x31, 0x00, 0x2a, 0x43, 0xa6, 0x6f, 0x63, 0x4d, 0x6f, 0x93, 0xc2, 0xf6, 0x6e,
- 0xc0, 0x37, 0xfb, 0xe0, 0xf2, 0x12, 0x64, 0x3c, 0xaf, 0x81, 0x52, 0x10, 0xab, 0x1c, 0x56, 0x59,
- 0x1f, 0xa5, 0x56, 0x3f, 0xac, 0x4a, 0x91, 0xf2, 0x3d, 0x88, 0xd3, 0xc5, 0x67, 0x21, 0xb5, 0xd5,
- 0x92, 0x9f, 0x55, 0xe4, 0x1a, 0xeb, 0xdd, 0x34, 0x9a, 0x4f, 0xeb, 0xf2, 0x51, 0xbd, 0x26, 0x89,
- 0xb8, 0x70, 0x1e, 0x07, 0xe4, 0x97, 0x6d, 0x47, 0x16, 0x2f, 0x83, 0xbb, 0x50, 0x6c, 0x7b, 0x50,
- 0x76, 0x00, 0x91, 0x95, 0xe8, 0x6a, 0x61, 0xe3, 0xf1, 0x6b, 0x4b, 0x3f, 0x21, 0x23, 0x08, 0xf2,
- 0x95, 0xa9, 0xd0, 0x0e, 0x41, 0x03, 0xf9, 0x50, 0x74, 0x24, 0x06, 0xc9, 0x90, 0x68, 0x9f, 0xe2,
- 0xf6, 0x73, 0x1e, 0x85, 0xbf, 0x35, 0x65, 0x60, 0x9a, 0x2a, 0x06, 0x14, 0xb7, 0x4a, 0x78, 0xfc,
- 0xa1, 0x45, 0x7a, 0x40, 0x45, 0x21, 0x39, 0xec, 0x5e, 0xe3, 0x97, 0x7a, 0xac, 0x49, 0xed, 0x26,
- 0xe1, 0xb1, 0x02, 0xde, 0xf5, 0x31, 0x14, 0x4d, 0xcb, 0x55, 0x48, 0xc9, 0xc8, 0xbd, 0x00, 0x2d,
- 0x04, 0xf3, 0x9b, 0x12, 0xd7, 0x55, 0xdf, 0xe6, 0xf3, 0xa6, 0xe5, 0x36, 0x07, 0x86, 0xc1, 0x00,
- 0xe8, 0x8f, 0x22, 0xb0, 0xcc, 0x62, 0xa5, 0xf2, 0x8a, 0x35, 0x00, 0x14, 0x96, 0xde, 0xfa, 0x7b,
- 0x44, 0xdb, 0x25, 0xd3, 0x13, 0xa3, 0xcb, 0xba, 0x07, 0x7c, 0xaa, 0x6f, 0x0e, 0x2e, 0xa1, 0x29,
- 0x1f, 0x41, 0x21, 0x7c, 0x4c, 0x28, 0x03, 0x89, 0xea, 0x76, 0xbd, 0xba, 0x2b, 0xcd, 0xa1, 0x22,
- 0x64, 0xb7, 0x5a, 0x72, 0xbd, 0xf1, 0xa4, 0xa9, 0xec, 0xd6, 0x7f, 0xc8, 0xda, 0x7d, 0xcd, 0x96,
- 0xd7, 0xee, 0x2b, 0xc1, 0xc2, 0x71, 0xb3, 0xf1, 0xe9, 0x71, 0x5d, 0x79, 0xd6, 0x38, 0xda, 0x6e,
- 0x1d, 0x1f, 0x29, 0x8d, 0x66, 0xad, 0xfe, 0x99, 0x14, 0xf3, 0x4a, 0xb0, 0x84, 0x94, 0x2c, 0xff,
- 0x4f, 0x04, 0x0a, 0x07, 0xb6, 0xde, 0x53, 0xed, 0xe1, 0x2e, 0x1e, 0x1e, 0xbe, 0x52, 0xfb, 0xe8,
- 0x13, 0x58, 0x30, 0xf1, 0x2b, 0xa5, 0xcf, 0xa0, 0x8a, 0x97, 0xd2, 0x47, 0x26, 0x77, 0x89, 0xe7,
- 0x4d, 0xfc, 0x8a, 0x4b, 0x68, 0xf0, 0x8c, 0xfe, 0xeb, 0x90, 0xb5, 0x0c, 0x8d, 0x71, 0x62, 0xd1,
- 0xe7, 0xc8, 0x06, 0x99, 0xc0, 0x32, 0xb4, 0x06, 0x43, 0x13, 0x6a, 0x32, 0x9e, 0xa0, 0x8e, 0x4d,
- 0xa0, 0x36, 0xf1, 0x2b, 0x41, 0xfd, 0x09, 0x2c, 0x10, 0xd9, 0x63, 0xb3, 0x8b, 0x4f, 0x99, 0x9d,
- 0x65, 0x68, 0xe1, 0xd9, 0x71, 0xcb, 0xfa, 0xbb, 0x08, 0xd0, 0x88, 0x32, 0x70, 0x45, 0x0f, 0x8f,
- 0x2e, 0xfe, 0x1b, 0x90, 0x27, 0x93, 0xf1, 0x0b, 0xb9, 0xc8, 0x14, 0x65, 0x21, 0x73, 0x16, 0xe1,
- 0x81, 0x70, 0x91, 0x49, 0xf9, 0x5c, 0xd1, 0x69, 0x5c, 0x96, 0xe1, 0x75, 0x0c, 0xd1, 0xbb, 0x90,
- 0xd3, 0x4d, 0xe2, 0x51, 0x79, 0x23, 0x21, 0xd8, 0xdb, 0xc9, 0x72, 0x4c, 0xfd, 0xac, 0x6f, 0xf3,
- 0x19, 0xff, 0x2a, 0x0a, 0x77, 0xf7, 0x55, 0x17, 0xdb, 0xba, 0x6a, 0xe8, 0x7f, 0x80, 0xb5, 0xa7,
- 0x3a, 0x7e, 0x25, 0xe3, 0x8e, 0x8d, 0x9d, 0x53, 0xf4, 0x19, 0xcc, 0x8f, 0x9d, 0x19, 0x9d, 0x7a,
- 0x76, 0xe3, 0x9d, 0xd9, 0x42, 0x8a, 0x48, 0x8c, 0x47, 0x4e, 0x13, 0xed, 0x87, 0x4f, 0x87, 0x15,
- 0x16, 0x57, 0x93, 0x19, 0x3c, 0xbe, 0xc7, 0x90, 0x50, 0x1d, 0xc5, 0xea, 0x70, 0xb7, 0xf1, 0x56,
- 0x40, 0xd0, 0xc0, 0xd5, 0x8d, 0xb5, 0x53, 0xa3, 0xbd, 0x76, 0x24, 0x6e, 0x53, 0x84, 0xc3, 0x51,
- 0x9d, 0x56, 0x07, 0x7d, 0x08, 0x45, 0xe7, 0xd4, 0x1a, 0x18, 0x9a, 0x72, 0xa2, 0xb6, 0x9f, 0x77,
- 0x74, 0xc3, 0x08, 0x35, 0x85, 0x0a, 0x0c, 0xb9, 0xc9, 0x71, 0x7c, 0xcf, 0xfe, 0x2c, 0x05, 0xc8,
- 0x9f, 0xcf, 0xfe, 0xc0, 0x55, 0xa9, 0x4b, 0xae, 0x40, 0x92, 0xfb, 0x02, 0xb6, 0x47, 0xef, 0x4e,
- 0x75, 0x9b, 0xe1, 0x26, 0xd8, 0xf6, 0x9c, 0xcc, 0x19, 0xd1, 0x0f, 0x82, 0x97, 0x27, 0x33, 0xef,
- 0xc8, 0xf6, 0x9c, 0xb8, 0x55, 0xd9, 0x85, 0x84, 0xe3, 0x92, 0x10, 0x12, 0xa3, 0x81, 0x7f, 0x7d,
- 0x0a, 0xff, 0xf8, 0xe4, 0xd7, 0x0e, 0x09, 0x9b, 0x70, 0x9c, 0x54, 0x06, 0x7a, 0x06, 0x19, 0x2f,
- 0xdf, 0xe5, 0x4d, 0xc0, 0x47, 0xb3, 0x0b, 0xf4, 0x42, 0x95, 0x08, 0x64, 0x9e, 0x2c, 0x54, 0x81,
- 0x6c, 0x8f, 0x93, 0xf9, 0x5d, 0x8d, 0x15, 0x5e, 0x72, 0x80, 0x90, 0x40, 0x4b, 0x8f, 0xc0, 0x97,
- 0x0c, 0x82, 0xa9, 0x41, 0xc3, 0xb2, 0x6d, 0x19, 0x06, 0x39, 0x34, 0xea, 0x2e, 0xbd, 0xb0, 0x2c,
- 0xa0, 0x68, 0x97, 0x14, 0x0e, 0x9e, 0x4b, 0x4d, 0xd3, 0xfd, 0x7c, 0x6f, 0xe6, 0x40, 0xb6, 0x3d,
- 0x27, 0x07, 0xd8, 0x51, 0x0b, 0x0a, 0xfd, 0x90, 0x3f, 0xe3, 0x59, 0xfa, 0x83, 0x69, 0xa9, 0x5a,
- 0x88, 0x78, 0x7b, 0x4e, 0x1e, 0x61, 0x47, 0x3f, 0x06, 0xd4, 0x1e, 0xf3, 0x13, 0x25, 0x78, 0xcd,
- 0x2c, 0x47, 0x19, 0xb6, 0xe7, 0xe4, 0x09, 0x62, 0xd0, 0xe7, 0x70, 0xb7, 0x37, 0xd9, 0xa4, 0x79,
- 0xbe, 0xbe, 0x36, 0x65, 0x84, 0x29, 0x8e, 0x60, 0x7b, 0x4e, 0x9e, 0x26, 0xb0, 0xfc, 0x09, 0x24,
- 0xa8, 0xea, 0x90, 0xac, 0xe3, 0xb8, 0xb9, 0xdb, 0x6c, 0x3d, 0x6b, 0xb2, 0x28, 0x52, 0xab, 0xef,
- 0xd5, 0x8f, 0xea, 0x4a, 0xab, 0xb9, 0x47, 0xa2, 0xc8, 0x1b, 0x70, 0x9b, 0x03, 0x2a, 0xcd, 0x9a,
- 0xf2, 0x4c, 0x6e, 0x08, 0x54, 0xb4, 0xbc, 0x1a, 0x4c, 0x6b, 0xd2, 0x10, 0x6f, 0xb6, 0x9a, 0x75,
- 0x69, 0x8e, 0x26, 0x38, 0xb5, 0x9a, 0x14, 0xa1, 0x09, 0x8e, 0xdc, 0x3a, 0x90, 0xa2, 0xcc, 0xfa,
- 0x36, 0x73, 0x00, 0x9a, 0xa7, 0x6e, 0x3b, 0xf1, 0x74, 0x52, 0x4a, 0x95, 0xff, 0x36, 0x02, 0x69,
- 0x52, 0x2f, 0x36, 0xcc, 0x8e, 0x85, 0x1e, 0x41, 0xa6, 0xaf, 0xda, 0xd8, 0x74, 0x7d, 0x4f, 0x2b,
- 0xda, 0x78, 0xe9, 0x03, 0x8a, 0xf0, 0xba, 0x4c, 0x69, 0x46, 0xd8, 0xb8, 0xac, 0x47, 0xb3, 0x05,
- 0x12, 0x17, 0xe7, 0xb4, 0x4f, 0x71, 0x4f, 0x25, 0x52, 0x59, 0x23, 0xe9, 0x4d, 0xaf, 0x85, 0x4a,
- 0xf1, 0x87, 0x14, 0xed, 0xc9, 0x2e, 0xf4, 0x83, 0x50, 0x11, 0x21, 0xfe, 0xeb, 0x1d, 0x28, 0x8e,
- 0xa4, 0x2f, 0x97, 0xd4, 0xe4, 0x2b, 0xb4, 0x26, 0x8f, 0xf9, 0x7e, 0xdf, 0xab, 0xc9, 0xa3, 0xbc,
- 0x1c, 0x0f, 0x2d, 0x36, 0x3e, 0xe3, 0x62, 0x1f, 0xf9, 0x29, 0x3a, 0x33, 0xbe, 0x37, 0x78, 0x4c,
- 0x99, 0xbf, 0x24, 0x3b, 0x3f, 0x80, 0xf9, 0x9e, 0xa5, 0xe9, 0x1d, 0x92, 0x8c, 0x12, 0xcb, 0x75,
- 0xf5, 0x1e, 0xe6, 0xa9, 0xca, 0x4c, 0x0e, 0x57, 0x0a, 0x72, 0x13, 0x24, 0x7a, 0x02, 0x29, 0xd1,
- 0x7a, 0x4a, 0xd3, 0x08, 0x30, 0xab, 0xc7, 0x14, 0x49, 0x3a, 0xe7, 0x46, 0x5b, 0x50, 0x30, 0xf1,
- 0x59, 0xb0, 0x53, 0x9a, 0x09, 0xf9, 0x94, 0x5c, 0x13, 0x9f, 0x4d, 0x6e, 0x93, 0xe6, 0x4c, 0x1f,
- 0xa3, 0xa1, 0x4f, 0x21, 0x1f, 0x0e, 0x76, 0x70, 0x8d, 0x60, 0x97, 0xeb, 0x07, 0x23, 0xdd, 0x16,
- 0xa4, 0x44, 0x94, 0xcb, 0x5e, 0x23, 0xca, 0x09, 0x66, 0xb4, 0x49, 0x52, 0x88, 0x33, 0xd7, 0x4f,
- 0x4d, 0x72, 0x7e, 0x6d, 0x75, 0x71, 0xbe, 0x9c, 0x25, 0x2b, 0x9c, 0xd0, 0x0f, 0xcd, 0x9a, 0x1e,
- 0x5c, 0x43, 0x3b, 0x00, 0xde, 0x7b, 0x01, 0x87, 0x5e, 0x03, 0x4c, 0xaf, 0xb1, 0x0f, 0x04, 0xa1,
- 0x3f, 0x25, 0x39, 0xc0, 0x8d, 0xf6, 0x21, 0x23, 0xdc, 0x31, 0xab, 0x7e, 0xa7, 0xfb, 0xad, 0xf1,
- 0xe0, 0x20, 0x42, 0x82, 0x27, 0x81, 0x24, 0xfe, 0x06, 0x56, 0x1d, 0xcc, 0x4b, 0xe0, 0xc7, 0x33,
- 0x26, 0xfe, 0xcc, 0xb8, 0xaa, 0xa7, 0xaa, 0xd9, 0xc5, 0x7b, 0x84, 0x7f, 0x33, 0x5a, 0x8a, 0xc8,
- 0x4c, 0x14, 0x6a, 0x82, 0x44, 0xb7, 0x2c, 0x18, 0x6b, 0x24, 0xba, 0x6b, 0x6f, 0x0b, 0xc3, 0x25,
- 0xbb, 0x36, 0x35, 0xde, 0x50, 0x9d, 0xda, 0xf7, 0x63, 0xce, 0xf7, 0xa0, 0xd0, 0xb1, 0xec, 0x9e,
- 0xea, 0x2a, 0xc2, 0x78, 0xe6, 0xfd, 0x66, 0xd9, 0x97, 0xe7, 0xcb, 0xf9, 0x2d, 0x8a, 0x15, 0x86,
- 0x93, 0xef, 0x04, 0x3f, 0xd1, 0xa6, 0x08, 0xcd, 0xb7, 0x68, 0x24, 0x7d, 0xe7, 0xb5, 0x9b, 0x35,
- 0x21, 0x22, 0x37, 0x21, 0x49, 0x6b, 0x1a, 0xa7, 0xb4, 0x40, 0x77, 0xfc, 0x9a, 0xf5, 0x91, 0xcc,
- 0xa5, 0xa0, 0x3d, 0x28, 0x68, 0x04, 0x42, 0x0a, 0x6e, 0xd6, 0x86, 0xbb, 0x4d, 0xe5, 0x2e, 0x4f,
- 0x91, 0x2b, 0x5c, 0xac, 0xe8, 0xb6, 0x08, 0x66, 0xd6, 0xaa, 0x6b, 0x41, 0xba, 0xa3, 0xf6, 0x74,
- 0x43, 0xc7, 0x4e, 0xe9, 0x0e, 0x95, 0xf3, 0xe1, 0xa5, 0xf6, 0x3c, 0x7a, 0x25, 0x23, 0x42, 0xb8,
- 0x10, 0xe2, 0x99, 0x35, 0x05, 0x0c, 0xc9, 0xf1, 0xdd, 0x1d, 0x37, 0x6b, 0x71, 0x25, 0x13, 0xba,
- 0x9e, 0xa1, 0x66, 0xcd, 0xbf, 0x34, 0x74, 0x1f, 0xe0, 0xa5, 0x8e, 0x5f, 0x29, 0x2f, 0x06, 0xd8,
- 0x1e, 0x96, 0x4a, 0xc1, 0xea, 0x9a, 0xc0, 0x3f, 0x25, 0x60, 0xf4, 0x11, 0x64, 0x34, 0xdc, 0xc7,
- 0xa6, 0xe6, 0xb4, 0xcc, 0xd2, 0x1b, 0xb4, 0x5c, 0xb8, 0x75, 0x71, 0xbe, 0x9c, 0xa9, 0x09, 0x20,
- 0xf7, 0xa2, 0x3e, 0x15, 0xfa, 0x1c, 0x72, 0xec, 0x03, 0x6b, 0x2d, 0x73, 0x73, 0x58, 0x5a, 0xa4,
- 0x8b, 0x7e, 0x38, 0xe3, 0xa1, 0xf8, 0xbd, 0x2b, 0xaf, 0xdd, 0x5f, 0x0b, 0x48, 0x93, 0x43, 0xb2,
- 0xd1, 0xff, 0x83, 0x9c, 0xd0, 0xe3, 0x1d, 0xeb, 0xc4, 0x29, 0x7d, 0xed, 0xd2, 0x5e, 0xfc, 0xe8,
- 0x58, 0xfb, 0x3e, 0xab, 0xf0, 0x52, 0x41, 0x69, 0xe8, 0x33, 0xc8, 0x7b, 0xb7, 0x8a, 0x56, 0xdf,
- 0x75, 0x4a, 0x6f, 0x5e, 0x5a, 0x82, 0x8e, 0x99, 0x21, 0xe7, 0x6d, 0xf5, 0xe9, 0x35, 0x45, 0xe0,
- 0x0b, 0xdd, 0x83, 0x8c, 0x66, 0x5b, 0x7d, 0x16, 0x2d, 0xde, 0x5a, 0x89, 0xac, 0xc6, 0xbc, 0x06,
- 0x8a, 0x6d, 0xf5, 0x69, 0x18, 0x50, 0xa0, 0x60, 0xe3, 0xbe, 0xa1, 0xb6, 0x71, 0x8f, 0xc4, 0x31,
- 0xab, 0x53, 0x5a, 0xa2, 0xa3, 0x6f, 0xcc, 0xbc, 0x91, 0x1e, 0xb3, 0x50, 0xcc, 0x80, 0xbc, 0x56,
- 0x07, 0x1d, 0x03, 0xa8, 0x03, 0x4d, 0x77, 0x95, 0x9e, 0xa5, 0xe1, 0xd2, 0xf2, 0xa5, 0x97, 0xfc,
- 0xa3, 0xc2, 0x2b, 0x84, 0x71, 0xdf, 0xd2, 0xb0, 0x77, 0xb1, 0x25, 0x00, 0xe8, 0x23, 0xc8, 0xd2,
- 0xa5, 0x7d, 0x6e, 0x9d, 0x10, 0xdd, 0x5c, 0xa1, 0x8b, 0x9b, 0xe7, 0x67, 0x99, 0xa9, 0xd9, 0x56,
- 0x7f, 0xc7, 0x3a, 0xa1, 0x1a, 0xc3, 0xff, 0xd4, 0x90, 0x03, 0xb9, 0x6e, 0x5b, 0xf1, 0x1d, 0xe7,
- 0x3d, 0x7a, 0x8a, 0x1f, 0xcf, 0x38, 0x97, 0x27, 0xd5, 0x09, 0xae, 0xf4, 0x96, 0x88, 0x00, 0x4f,
- 0xaa, 0x02, 0xe6, 0xc8, 0xd9, 0x6e, 0xdb, 0xfb, 0x20, 0x15, 0x21, 0xeb, 0xd2, 0x71, 0x03, 0x28,
- 0x07, 0x2b, 0x42, 0x86, 0x61, 0x26, 0xd0, 0x04, 0xde, 0xce, 0x53, 0x68, 0x35, 0xc5, 0xce, 0xec,
- 0xfe, 0xec, 0x11, 0xbe, 0xc0, 0xb8, 0x2b, 0x4e, 0xab, 0x43, 0x0f, 0xb6, 0x0d, 0x39, 0x6b, 0xe0,
- 0x9e, 0x58, 0x03, 0x53, 0x53, 0x3a, 0xcf, 0x9d, 0xd2, 0xdb, 0x74, 0xb5, 0x57, 0x6a, 0xbd, 0x78,
- 0xab, 0x6b, 0x71, 0x41, 0x5b, 0xbb, 0x8e, 0x9c, 0x15, 0x52, 0xb7, 0x9e, 0x3b, 0xe8, 0xa7, 0x90,
- 0xd5, 0x4d, 0x7f, 0x8c, 0x07, 0x57, 0x1f, 0x03, 0x89, 0xca, 0xa3, 0x61, 0x7a, 0x43, 0x00, 0x97,
- 0x49, 0x46, 0xf8, 0x00, 0x0a, 0x56, 0xa7, 0x63, 0xe8, 0x26, 0x56, 0x6c, 0xac, 0x3a, 0x96, 0x59,
- 0x7a, 0x27, 0xb0, 0x83, 0x79, 0x8e, 0x93, 0x29, 0x0a, 0x95, 0x21, 0xe3, 0xe2, 0x5e, 0xdf, 0xb2,
- 0x55, 0x7b, 0x58, 0x7a, 0x37, 0x78, 0x1f, 0xe8, 0x81, 0xd1, 0x09, 0x2c, 0x0e, 0x4c, 0x7c, 0xd6,
- 0xb7, 0x1c, 0xac, 0x29, 0x63, 0xb9, 0xe5, 0x2a, 0xf5, 0x71, 0x0f, 0xf8, 0xa4, 0xee, 0x1e, 0x0b,
- 0xca, 0x89, 0x49, 0xe6, 0xdd, 0xc1, 0x44, 0xb4, 0x86, 0xbe, 0x05, 0x0b, 0xba, 0xa3, 0x04, 0xb3,
- 0x76, 0x85, 0xf8, 0xba, 0xd2, 0x7b, 0x81, 0x29, 0x21, 0xdd, 0x19, 0xcd, 0xf8, 0xd1, 0x4f, 0xa0,
- 0x68, 0x58, 0x6d, 0xd5, 0xd0, 0xdd, 0xa1, 0x68, 0x69, 0xbe, 0x4f, 0x35, 0xe0, 0x9b, 0x33, 0x2a,
- 0xe9, 0x1e, 0xe7, 0x66, 0x8d, 0x4d, 0xb9, 0x60, 0x84, 0xbe, 0xd1, 0xcf, 0x22, 0xb0, 0xf2, 0x9a,
- 0xfe, 0x97, 0x53, 0xfa, 0xe0, 0xd2, 0x9b, 0xc1, 0x19, 0x1a, 0x60, 0x6f, 0x5d, 0xd6, 0x00, 0x73,
- 0x16, 0x7f, 0x19, 0x81, 0xf9, 0xb1, 0xd4, 0x01, 0xfd, 0x04, 0x52, 0xa6, 0xa5, 0x05, 0xae, 0xa6,
- 0xeb, 0xfc, 0x0c, 0x92, 0x4d, 0x4b, 0x63, 0x37, 0xd3, 0x8f, 0xba, 0xba, 0x7b, 0x3a, 0x38, 0x59,
- 0x6b, 0x5b, 0xbd, 0x75, 0x6f, 0x72, 0xda, 0x89, 0xff, 0xf7, 0x7a, 0xff, 0x79, 0x77, 0x9d, 0xfe,
- 0xd5, 0x3f, 0x59, 0x63, 0x6c, 0x72, 0x92, 0x48, 0x6d, 0x68, 0xe8, 0x43, 0x28, 0xe2, 0xb3, 0xbe,
- 0x6e, 0x07, 0xd2, 0xe7, 0x68, 0xc0, 0x21, 0x16, 0x7c, 0x24, 0xb1, 0x1e, 0x7e, 0x79, 0xf8, 0xab,
- 0x28, 0x14, 0x47, 0xc2, 0x37, 0xa9, 0x17, 0x68, 0x6b, 0x27, 0x54, 0x2f, 0x10, 0xc8, 0x25, 0x55,
- 0x4c, 0xf0, 0x41, 0x4f, 0xec, 0xa6, 0x8f, 0xbb, 0xc2, 0x97, 0x72, 0x89, 0x2b, 0x5c, 0xca, 0x7d,
- 0x07, 0xee, 0xe8, 0x8e, 0x62, 0x5a, 0xa6, 0xe8, 0x9d, 0x7a, 0x15, 0x7a, 0xf0, 0x21, 0xcd, 0x2d,
- 0xdd, 0x69, 0x5a, 0x26, 0xeb, 0x9a, 0x7a, 0xab, 0xf6, 0xdf, 0xdc, 0xa4, 0xc6, 0xdf, 0xdc, 0x78,
- 0xed, 0xc7, 0xb8, 0x94, 0x58, 0xfc, 0x45, 0x04, 0x32, 0xc1, 0x27, 0xab, 0xd1, 0x70, 0xc7, 0x6d,
- 0xac, 0x86, 0xba, 0xe6, 0x13, 0x83, 0xf0, 0x2e, 0xc4, 0x66, 0xdf, 0x05, 0x7e, 0xb4, 0x7f, 0x08,
- 0xd9, 0x40, 0x5c, 0x1e, 0xed, 0x8a, 0x44, 0xae, 0xd1, 0x15, 0x79, 0x1b, 0x92, 0x3c, 0x18, 0x31,
- 0xc5, 0xca, 0x73, 0xee, 0x04, 0x0b, 0x44, 0x89, 0xcf, 0x49, 0x10, 0xe2, 0xa3, 0xff, 0x4b, 0x0c,
- 0x72, 0xc1, 0xb8, 0x4d, 0x3c, 0x97, 0x6e, 0xb6, 0x6d, 0x1a, 0x34, 0xe9, 0xe8, 0x31, 0xef, 0x25,
- 0x83, 0x00, 0x93, 0x68, 0xde, 0xd3, 0x4d, 0x85, 0xde, 0x9e, 0x87, 0x94, 0x37, 0xdd, 0xd3, 0xcd,
- 0xa7, 0x04, 0x4a, 0x49, 0xd4, 0x33, 0x4e, 0x12, 0x0b, 0x91, 0xa8, 0x67, 0x8c, 0x64, 0x91, 0xa6,
- 0xc2, 0xb6, 0x4b, 0xeb, 0xd5, 0x58, 0x20, 0xc5, 0xb5, 0x5d, 0xb4, 0x04, 0xa9, 0x97, 0xba, 0xed,
- 0x0e, 0x54, 0x83, 0x96, 0xa6, 0xe2, 0x98, 0x05, 0x10, 0x99, 0x50, 0xf0, 0x33, 0x95, 0x57, 0x26,
- 0xb6, 0xa9, 0xe2, 0x64, 0x37, 0x2a, 0xd7, 0x48, 0x55, 0xfc, 0x0f, 0x22, 0x48, 0xf8, 0x73, 0x27,
- 0x08, 0x5c, 0xfc, 0x9b, 0x08, 0xe4, 0x43, 0x64, 0xa8, 0x01, 0x45, 0x3a, 0xf0, 0x58, 0x3b, 0xf7,
- 0x9e, 0xf7, 0xf8, 0x94, 0xa0, 0x27, 0x96, 0x9b, 0x79, 0x2b, 0x80, 0xd2, 0xd0, 0x27, 0x50, 0x60,
- 0xa2, 0xbc, 0x37, 0x31, 0x61, 0xf5, 0xcb, 0x51, 0x49, 0xe1, 0x87, 0x31, 0x39, 0xcb, 0x87, 0x69,
- 0xc1, 0xeb, 0xfe, 0x45, 0x13, 0xb2, 0x81, 0x54, 0x68, 0x06, 0xbd, 0xff, 0x36, 0xc4, 0x3d, 0x2f,
- 0x34, 0x6b, 0xd7, 0xd4, 0xf5, 0x5d, 0xd3, 0xcf, 0x23, 0xb0, 0x30, 0x29, 0x25, 0x09, 0xd9, 0x13,
- 0x53, 0xa4, 0x99, 0xec, 0xe9, 0x7e, 0x30, 0x55, 0x64, 0xca, 0x25, 0xae, 0xa0, 0xfd, 0x64, 0xf1,
- 0x1d, 0x4f, 0xc5, 0x99, 0x6e, 0x15, 0x43, 0x2a, 0x4e, 0x8a, 0xbf, 0xa0, 0x92, 0xff, 0x53, 0x0c,
- 0x0a, 0xe1, 0x80, 0x84, 0x9e, 0x42, 0xb2, 0x6b, 0x58, 0x27, 0xaa, 0xc1, 0xbb, 0xb4, 0xdf, 0xbb,
- 0x56, 0x5c, 0x5b, 0x7b, 0x42, 0x65, 0x6c, 0xcf, 0xc9, 0x5c, 0x1a, 0x72, 0x60, 0xde, 0xc6, 0x5d,
- 0xdd, 0x32, 0x55, 0x43, 0x39, 0x19, 0xb2, 0x13, 0xe5, 0x3b, 0x5b, 0xbf, 0xde, 0x10, 0x32, 0x17,
- 0xb7, 0x39, 0xa4, 0x84, 0xdb, 0x73, 0x72, 0xd1, 0x0e, 0x83, 0x50, 0x0f, 0x8a, 0xc1, 0x41, 0x6d,
- 0xeb, 0x15, 0x6f, 0x81, 0x57, 0x6f, 0x3a, 0xa4, 0x6c, 0xbd, 0xda, 0xa6, 0x89, 0x74, 0x00, 0xb0,
- 0xf8, 0x31, 0x14, 0x47, 0x26, 0x85, 0xca, 0x90, 0x64, 0x34, 0x3c, 0x1a, 0xc1, 0x97, 0xe7, 0xcb,
- 0x49, 0x46, 0x24, 0x73, 0x0c, 0x3f, 0x8b, 0xdb, 0x90, 0x0f, 0x89, 0xe7, 0xe0, 0x02, 0x24, 0xd9,
- 0x5e, 0x06, 0x75, 0x79, 0x13, 0x20, 0x2d, 0x12, 0x87, 0xf2, 0x2a, 0x64, 0xbc, 0x2c, 0x1c, 0xe5,
- 0x20, 0x5d, 0x6b, 0x1c, 0x56, 0x36, 0xf7, 0xea, 0x35, 0x69, 0x0e, 0xe5, 0x21, 0x23, 0xd7, 0x2b,
- 0x35, 0xda, 0x4f, 0x94, 0x22, 0xdf, 0x4d, 0xff, 0xc9, 0xcf, 0x97, 0x23, 0x3c, 0x10, 0x24, 0xa5,
- 0xd4, 0x4e, 0x3c, 0x8d, 0xa4, 0x5b, 0xe5, 0xff, 0x4c, 0x03, 0xaa, 0xa9, 0xae, 0x4a, 0x36, 0xe0,
- 0x0a, 0x5d, 0xb7, 0xe8, 0x25, 0x96, 0x13, 0xee, 0xa4, 0xc4, 0x6e, 0xd4, 0x49, 0x99, 0xd8, 0x57,
- 0x8b, 0xdf, 0xa4, 0xaf, 0x76, 0xad, 0xf6, 0xde, 0x78, 0x2f, 0x20, 0x79, 0x83, 0x5e, 0xc0, 0x53,
- 0x48, 0xb1, 0x8c, 0x96, 0xbd, 0xb9, 0x99, 0xde, 0xaa, 0x18, 0x3f, 0x18, 0xde, 0xd4, 0x71, 0xea,
- 0xa6, 0x6b, 0x0f, 0xbd, 0xeb, 0x78, 0x06, 0xf3, 0xbb, 0x28, 0xe9, 0xeb, 0x77, 0x51, 0xc6, 0xf3,
- 0xf9, 0xcc, 0xf4, 0x7c, 0xfe, 0xc7, 0xc0, 0x6d, 0x40, 0x64, 0xc3, 0x70, 0xe9, 0xcd, 0xf4, 0x84,
- 0xe5, 0x30, 0xa5, 0xe7, 0xe9, 0x70, 0xce, 0x0e, 0x7c, 0x2d, 0x1e, 0x01, 0xf0, 0x84, 0xdd, 0xec,
- 0x58, 0x33, 0x38, 0xec, 0x25, 0x48, 0x11, 0x47, 0xd8, 0xc7, 0x4c, 0x3b, 0xbd, 0xe0, 0xc8, 0x81,
- 0xdc, 0xa2, 0xfa, 0x90, 0x0b, 0x6e, 0x21, 0x92, 0x20, 0xf6, 0x1c, 0x0f, 0x99, 0x9e, 0xcb, 0xe4,
- 0x4f, 0xb4, 0x03, 0x09, 0x3f, 0x84, 0x4f, 0x7f, 0xe8, 0x39, 0xf5, 0x6c, 0xc8, 0x74, 0x65, 0x26,
- 0xe2, 0xbb, 0xd1, 0xc7, 0x91, 0xc5, 0x3f, 0x8e, 0x42, 0x2e, 0xb8, 0x4c, 0xf4, 0x36, 0xa4, 0xd8,
- 0x42, 0xd9, 0x5b, 0xd2, 0xb0, 0x5b, 0x10, 0x28, 0xd4, 0x84, 0xbc, 0x33, 0xb0, 0x5f, 0xea, 0x2f,
- 0x55, 0x43, 0xe9, 0x5a, 0xaa, 0x41, 0xa7, 0x53, 0xd8, 0xb8, 0x3f, 0xed, 0xad, 0x06, 0xa7, 0x7d,
- 0x62, 0xa9, 0x86, 0xe8, 0x62, 0x38, 0x01, 0x18, 0xfa, 0xa6, 0x77, 0x4b, 0xa3, 0x70, 0x9f, 0xc4,
- 0x2e, 0x3f, 0x0b, 0x5c, 0xfd, 0xc5, 0x04, 0x44, 0x93, 0x97, 0x7d, 0x92, 0x28, 0xcc, 0x8f, 0x18,
- 0x9b, 0x83, 0x9e, 0xdf, 0x47, 0xf7, 0xa2, 0x30, 0xa3, 0xab, 0x9b, 0x83, 0x9e, 0x1f, 0x85, 0x6d,
- 0x1f, 0x26, 0xa2, 0xb0, 0xe7, 0x7d, 0xca, 0xff, 0x9c, 0x85, 0xc2, 0xd1, 0xb0, 0x1f, 0xf4, 0x36,
- 0xd7, 0xba, 0x94, 0x98, 0x74, 0xf5, 0x10, 0xbd, 0xfa, 0xd5, 0xc3, 0x25, 0xef, 0xfc, 0x99, 0xce,
- 0xc5, 0x2f, 0xd1, 0xb9, 0x1a, 0xc4, 0xe9, 0x4b, 0xed, 0x04, 0x3d, 0x9b, 0x69, 0x4e, 0x2e, 0xbc,
- 0xda, 0xb5, 0xc0, 0x63, 0x6d, 0xca, 0x8d, 0x7e, 0x08, 0x39, 0xba, 0xb9, 0x3d, 0xdc, 0x3b, 0xc1,
- 0xb6, 0xf0, 0x2d, 0x0f, 0x67, 0x93, 0x46, 0x76, 0x79, 0x9f, 0x32, 0x8a, 0xae, 0x05, 0xf6, 0x20,
- 0x0e, 0x7a, 0x08, 0x09, 0xd5, 0xd0, 0xa9, 0xa3, 0x79, 0xdd, 0x2f, 0x00, 0x18, 0x21, 0xfa, 0x3e,
- 0xe4, 0x55, 0xdb, 0x56, 0x87, 0xfc, 0x2d, 0xbb, 0x46, 0x9d, 0x09, 0xf7, 0x92, 0x17, 0xe7, 0xcb,
- 0xd9, 0x0a, 0x41, 0xd2, 0xe7, 0xeb, 0x62, 0x23, 0xb2, 0xaa, 0x07, 0x0a, 0xdd, 0x9e, 0x64, 0x6e,
- 0x76, 0x7b, 0x02, 0x37, 0xf1, 0xf2, 0xe3, 0x0e, 0x3b, 0x7b, 0x03, 0x87, 0xfd, 0x53, 0x58, 0x14,
- 0xcf, 0xfc, 0x88, 0x40, 0xff, 0x86, 0x2d, 0xf0, 0x2b, 0x83, 0xf2, 0xc5, 0xf9, 0x72, 0x49, 0xf6,
- 0xa9, 0xfc, 0xe5, 0xb2, 0x5a, 0x87, 0xec, 0x54, 0xc9, 0x9e, 0x88, 0xd7, 0x02, 0xae, 0x3b, 0x7f,
- 0x7d, 0xd7, 0x1d, 0x8e, 0xbb, 0x85, 0x1b, 0xc5, 0xdd, 0xf1, 0x30, 0x50, 0x9c, 0x1e, 0x06, 0x9e,
- 0x8d, 0x86, 0x01, 0xe9, 0xf2, 0x16, 0x65, 0x58, 0x81, 0x2f, 0x09, 0x01, 0x7f, 0x11, 0x05, 0xf0,
- 0xf5, 0x1b, 0x7d, 0x1b, 0xee, 0xf6, 0x4f, 0x87, 0x8e, 0xde, 0x56, 0x0d, 0xc5, 0xc6, 0x7d, 0x1b,
- 0x3b, 0xd8, 0x64, 0x59, 0x35, 0x75, 0x1a, 0x39, 0xf9, 0x8e, 0x40, 0xcb, 0x21, 0x2c, 0xfa, 0x18,
- 0xee, 0x18, 0x56, 0x77, 0x12, 0x5f, 0xb0, 0x17, 0x70, 0x9b, 0xd3, 0x8c, 0x30, 0xab, 0x00, 0x6d,
- 0xb5, 0xaf, 0x9e, 0xe8, 0x86, 0xdf, 0x1e, 0xf8, 0xf8, 0xaa, 0xb6, 0xb9, 0x56, 0xf5, 0x44, 0x88,
- 0x27, 0x1a, 0xbe, 0xd0, 0xf2, 0xdb, 0x00, 0x3e, 0x9e, 0x5e, 0xee, 0xee, 0xed, 0xf9, 0x09, 0x1c,
- 0xbf, 0x26, 0xe6, 0x01, 0x6c, 0x77, 0x24, 0x9a, 0x8c, 0xfb, 0xf5, 0xc8, 0x0c, 0x7e, 0x9d, 0x5f,
- 0xb8, 0x7e, 0x04, 0x71, 0xe2, 0x8d, 0x50, 0x1a, 0xe2, 0xf5, 0xe6, 0xf1, 0xbe, 0x34, 0x87, 0x32,
- 0x90, 0xa8, 0xec, 0x35, 0x2a, 0x87, 0x52, 0x04, 0x2d, 0x80, 0xb4, 0x7f, 0xbc, 0x77, 0xd4, 0x90,
- 0xeb, 0x4f, 0x1a, 0xad, 0xa6, 0x42, 0x09, 0xa2, 0x01, 0x47, 0xfe, 0xd7, 0x71, 0x90, 0x98, 0x17,
- 0xbd, 0xa9, 0x2b, 0x9f, 0xde, 0x99, 0x79, 0xfd, 0x1d, 0x6f, 0x58, 0xeb, 0xe3, 0x5f, 0x7d, 0xb6,
- 0x99, 0xf8, 0x8a, 0xb2, 0xcd, 0xe4, 0x0d, 0xb2, 0xcd, 0xd4, 0x0d, 0x9c, 0xd7, 0xef, 0x3b, 0x2b,
- 0x0c, 0x68, 0xc8, 0x2f, 0xa2, 0x00, 0x01, 0xdd, 0xf8, 0x41, 0xf0, 0xf7, 0xd1, 0xd3, 0x2f, 0x7b,
- 0x47, 0xca, 0xb0, 0xed, 0x39, 0xf1, 0xeb, 0xe9, 0x27, 0x90, 0xd6, 0x78, 0xd6, 0xc5, 0x93, 0xb3,
- 0xf7, 0x66, 0x4e, 0xce, 0xb6, 0xe7, 0x64, 0x8f, 0x19, 0x7d, 0x1c, 0xfa, 0x59, 0xdc, 0x83, 0x99,
- 0x8c, 0x79, 0x5b, 0xbc, 0xfb, 0xad, 0x40, 0x92, 0x25, 0x1c, 0x5c, 0xd9, 0xa6, 0xfe, 0x3e, 0x6b,
- 0xc4, 0x34, 0x48, 0x39, 0xcc, 0x18, 0x79, 0x19, 0x97, 0x82, 0xc4, 0xc0, 0xd4, 0x2d, 0xf3, 0x7d,
- 0x39, 0xf8, 0xe2, 0x54, 0xf4, 0x15, 0x89, 0xf5, 0xd3, 0xbf, 0x55, 0x17, 0x6b, 0xec, 0xd5, 0xc8,
- 0xb1, 0xf9, 0xd2, 0x03, 0x44, 0x50, 0x01, 0x80, 0xe3, 0x75, 0xb3, 0x2b, 0x45, 0x69, 0xf1, 0x47,
- 0x52, 0x5d, 0xf2, 0x15, 0x7b, 0xff, 0xfb, 0x20, 0x8d, 0xfe, 0x40, 0x2c, 0xf0, 0x7e, 0x64, 0x1e,
- 0xf2, 0xfb, 0x4f, 0xab, 0xd5, 0xa3, 0xc6, 0x7e, 0xfd, 0xf0, 0xa8, 0xb2, 0x7f, 0xc0, 0x9e, 0x32,
- 0x1e, 0x91, 0xca, 0xb1, 0xd5, 0xa8, 0x49, 0xd1, 0xf7, 0xbf, 0x0f, 0xc5, 0x11, 0x85, 0x40, 0x00,
- 0xc9, 0x83, 0xe3, 0xcd, 0xbd, 0x46, 0x75, 0xe2, 0xfb, 0x13, 0x94, 0x85, 0x54, 0x6b, 0x6b, 0x6b,
- 0xaf, 0xd1, 0xac, 0x4b, 0xb1, 0xf7, 0xbf, 0x01, 0xb9, 0x60, 0x42, 0x8a, 0x24, 0xc8, 0xfd, 0xa8,
- 0xd5, 0xac, 0x2b, 0x5b, 0x95, 0xc6, 0xde, 0xb1, 0x4c, 0x66, 0x80, 0xa0, 0xc0, 0xfd, 0x8a, 0x80,
- 0x45, 0x36, 0x57, 0x7f, 0xfd, 0xef, 0x4b, 0x73, 0xbf, 0xbe, 0x58, 0x8a, 0xfc, 0xe6, 0x62, 0x29,
- 0xf2, 0xdb, 0x8b, 0xa5, 0xc8, 0xbf, 0x5d, 0x2c, 0x45, 0xfe, 0xfc, 0x8b, 0xa5, 0xb9, 0xdf, 0x7c,
- 0xb1, 0x34, 0xf7, 0xdb, 0x2f, 0x96, 0xe6, 0x7e, 0x94, 0x64, 0xbf, 0xec, 0xff, 0xdf, 0x00, 0x00,
- 0x00, 0xff, 0xff, 0x4f, 0xc5, 0x57, 0x8a, 0x44, 0x40, 0x00, 0x00,
+ 0x9c, 0x2f, 0x67, 0x26, 0xab, 0x59, 0xa6, 0xed, 0x29, 0xd7, 0x1f, 0xc6, 0x09, 0x73, 0x6b, 0xfe,
+ 0x79, 0x02, 0x24, 0x36, 0x89, 0x1a, 0x76, 0xda, 0xb6, 0xde, 0x77, 0x2d, 0xdb, 0x9b, 0x41, 0x64,
+ 0x6c, 0x06, 0xef, 0x40, 0x54, 0xd7, 0x78, 0x10, 0xb9, 0xc3, 0x77, 0x20, 0x4a, 0x17, 0xef, 0x2f,
+ 0x25, 0xaa, 0x6b, 0x68, 0x0d, 0xe2, 0x24, 0xd2, 0xd1, 0x35, 0x64, 0x37, 0x16, 0x47, 0x67, 0x89,
+ 0x7b, 0x6b, 0x2c, 0x10, 0x1e, 0xc9, 0x94, 0x0e, 0xad, 0x40, 0xda, 0x1c, 0x18, 0x06, 0x0d, 0x62,
+ 0x64, 0x65, 0x69, 0x31, 0x5d, 0x01, 0x45, 0xf7, 0x20, 0xa7, 0xe1, 0x8e, 0x3a, 0x30, 0x5c, 0x05,
+ 0x9f, 0xf5, 0x6d, 0x66, 0x29, 0x72, 0x96, 0xc3, 0xea, 0x67, 0x7d, 0x1b, 0xbd, 0x09, 0xc9, 0x53,
+ 0x5d, 0xd3, 0xb0, 0x49, 0x0d, 0x45, 0x88, 0xe0, 0x30, 0xb4, 0x01, 0xf3, 0x03, 0x07, 0x3b, 0x8a,
+ 0x83, 0x5f, 0x0c, 0x88, 0x96, 0xd0, 0x73, 0x01, 0x7a, 0x2e, 0x49, 0x7e, 0x78, 0x45, 0x42, 0x70,
+ 0xc8, 0xf1, 0xe4, 0x28, 0xee, 0x41, 0xae, 0x6d, 0xf5, 0xfa, 0x03, 0x17, 0xb3, 0x41, 0xb3, 0x6c,
+ 0x50, 0x0e, 0xa3, 0x83, 0x6e, 0xc0, 0xbc, 0xf5, 0xca, 0x1c, 0x11, 0x9b, 0x0b, 0x8b, 0x25, 0x04,
+ 0x41, 0xb1, 0x9f, 0x80, 0xd4, 0xef, 0x2a, 0xaa, 0xeb, 0xda, 0xfa, 0x09, 0x91, 0x6d, 0x0e, 0x7a,
+ 0xa5, 0x7c, 0x68, 0x4f, 0x0b, 0x07, 0x4f, 0x2a, 0x02, 0xdd, 0x1c, 0xf4, 0xe4, 0x42, 0xbf, 0x1b,
+ 0xfc, 0x46, 0x5b, 0xf0, 0x96, 0x6a, 0xb8, 0xd8, 0x16, 0x4e, 0x8d, 0x6c, 0xa2, 0xa2, 0x9b, 0x4a,
+ 0xdf, 0xb6, 0xba, 0x36, 0x76, 0x9c, 0x52, 0x21, 0xb0, 0x03, 0x6f, 0x50, 0x52, 0x76, 0x3e, 0x47,
+ 0xc3, 0x3e, 0x6e, 0x98, 0x07, 0x9c, 0x0c, 0xfd, 0x18, 0x90, 0x33, 0x74, 0x5c, 0xdc, 0x13, 0x82,
+ 0x9e, 0xeb, 0xa6, 0x56, 0x2a, 0x52, 0xdd, 0x7a, 0x77, 0x8a, 0x6e, 0x1d, 0x52, 0x06, 0x26, 0x6e,
+ 0x57, 0x37, 0x35, 0x3e, 0x8a, 0xe4, 0x8c, 0xc0, 0xd1, 0x12, 0xa4, 0x5e, 0xea, 0xb6, 0x3b, 0x50,
+ 0x8d, 0x92, 0x14, 0x98, 0x8e, 0x00, 0x7a, 0x36, 0x99, 0x96, 0x32, 0x3b, 0xf1, 0x74, 0x46, 0x82,
+ 0x9d, 0x78, 0x3a, 0x25, 0xa5, 0xcb, 0x7f, 0x1e, 0x85, 0x3b, 0x4c, 0xcc, 0x96, 0xda, 0xd3, 0x8d,
+ 0xe1, 0x4d, 0x35, 0x93, 0x49, 0xe1, 0x9a, 0x49, 0x8f, 0x94, 0x2e, 0x95, 0xb0, 0xb1, 0x50, 0x40,
+ 0x8f, 0x94, 0xc0, 0x9a, 0x04, 0x34, 0x62, 0xba, 0xf1, 0x2b, 0x98, 0x6e, 0x0b, 0xe6, 0x85, 0x92,
+ 0x7a, 0x12, 0xa8, 0xa6, 0xe6, 0x37, 0xef, 0xf3, 0x39, 0x15, 0x6b, 0x8c, 0x40, 0xb0, 0x87, 0x23,
+ 0x98, 0x16, 0x42, 0x6a, 0xdc, 0x48, 0xff, 0x31, 0x0a, 0x0b, 0x0d, 0xd3, 0xc5, 0xb6, 0x81, 0xd5,
+ 0x97, 0x38, 0xb0, 0x1d, 0x9f, 0x41, 0x46, 0x35, 0xdb, 0xd8, 0x71, 0x2d, 0xdb, 0x29, 0x45, 0x56,
+ 0x62, 0xab, 0xd9, 0x8d, 0x6f, 0x4c, 0x39, 0xb5, 0x49, 0xfc, 0x6b, 0x15, 0xce, 0xcc, 0x77, 0xd2,
+ 0x17, 0xb6, 0xf8, 0x4f, 0x11, 0x48, 0x0b, 0xec, 0x35, 0xbc, 0xdf, 0x37, 0x21, 0x4d, 0x33, 0x4a,
+ 0xc5, 0x3b, 0x93, 0x45, 0xc1, 0xc1, 0x53, 0xce, 0x60, 0xf6, 0x99, 0xa2, 0xb4, 0x0d, 0x0d, 0x55,
+ 0x27, 0x25, 0x86, 0x31, 0xca, 0x7f, 0x57, 0xec, 0xdf, 0x61, 0x38, 0x35, 0x1c, 0xcb, 0x15, 0xd9,
+ 0x9e, 0xf1, 0x9d, 0xfb, 0x87, 0x08, 0xcc, 0x13, 0x06, 0x0d, 0x6b, 0x81, 0x6d, 0xbb, 0x0f, 0xa0,
+ 0x3b, 0x8a, 0xc3, 0xe0, 0x74, 0x45, 0x42, 0x37, 0x33, 0xba, 0xc3, 0xc9, 0x3d, 0x55, 0x8b, 0x8e,
+ 0xa9, 0xda, 0x77, 0x20, 0x4f, 0x79, 0x95, 0x93, 0x41, 0xfb, 0x39, 0x76, 0x1d, 0x3a, 0xc3, 0xc4,
+ 0xe6, 0x02, 0x9f, 0x61, 0x8e, 0x4a, 0xd8, 0x64, 0x38, 0x39, 0xe7, 0x04, 0xbe, 0xc6, 0xb4, 0x2f,
+ 0x3e, 0xa6, 0x7d, 0x7c, 0xe2, 0xbf, 0x8f, 0xc1, 0x9d, 0x03, 0xd5, 0x76, 0x75, 0x12, 0x1b, 0x75,
+ 0xb3, 0x1b, 0x98, 0xfd, 0x03, 0xc8, 0x9a, 0x03, 0x61, 0xb0, 0x0e, 0x3f, 0x10, 0x36, 0x3f, 0x30,
+ 0x07, 0xdc, 0x00, 0x1d, 0xb4, 0x07, 0x71, 0x43, 0x77, 0x5c, 0x1a, 0x7a, 0xb2, 0x1b, 0x1b, 0x53,
+ 0xd4, 0x62, 0xf2, 0x18, 0x6b, 0x7b, 0xba, 0xe3, 0x8a, 0x35, 0x13, 0x29, 0xa8, 0x05, 0x09, 0x5b,
+ 0x35, 0xbb, 0x98, 0xda, 0x4b, 0x76, 0xe3, 0xd1, 0xd5, 0xc4, 0xc9, 0x84, 0x55, 0x04, 0x64, 0x2a,
+ 0x67, 0xf1, 0xaf, 0x23, 0x10, 0x27, 0xa3, 0x5c, 0x62, 0xd2, 0x77, 0x20, 0xf9, 0x52, 0x35, 0x06,
+ 0x98, 0x85, 0xcf, 0x9c, 0xcc, 0xbf, 0xd0, 0xff, 0x87, 0xa2, 0x33, 0x38, 0xe9, 0x07, 0x86, 0xe2,
+ 0x71, 0xe6, 0xc3, 0x2b, 0xcd, 0xca, 0xab, 0x35, 0xc2, 0xb2, 0xd8, 0x01, 0x2c, 0xbe, 0x80, 0x04,
+ 0x9d, 0xf5, 0x25, 0xf3, 0xbb, 0x07, 0x39, 0xd7, 0x52, 0xf0, 0x59, 0xdb, 0x18, 0x38, 0xfa, 0x4b,
+ 0xa6, 0x29, 0x39, 0x39, 0xeb, 0x5a, 0x75, 0x01, 0x42, 0x0f, 0xa0, 0xd0, 0xb1, 0xad, 0x9e, 0xa2,
+ 0x9b, 0x82, 0x28, 0x46, 0x89, 0xf2, 0x04, 0xda, 0x10, 0xc0, 0x90, 0xca, 0xfe, 0x55, 0x0e, 0x8a,
+ 0xd4, 0x30, 0x66, 0x72, 0x7b, 0x0f, 0x02, 0x6e, 0xef, 0x76, 0xc8, 0xed, 0x79, 0xd6, 0x45, 0xbc,
+ 0xde, 0x9b, 0x90, 0x1c, 0xd0, 0xfc, 0x86, 0x8e, 0xef, 0x85, 0x46, 0x06, 0x9b, 0x41, 0x2b, 0xd1,
+ 0xd7, 0x01, 0x11, 0x57, 0x80, 0x95, 0x10, 0x61, 0x82, 0x12, 0x4a, 0x14, 0x53, 0x9d, 0xea, 0x41,
+ 0x93, 0x57, 0xf0, 0xa0, 0xdb, 0x20, 0xe1, 0x33, 0xd7, 0x56, 0x83, 0xd9, 0x7a, 0x8a, 0xf2, 0x2f,
+ 0x91, 0xb0, 0x58, 0x27, 0xb8, 0xc9, 0x42, 0x0a, 0x38, 0x80, 0xd3, 0x88, 0x96, 0xcc, 0x73, 0x19,
+ 0x9a, 0x6e, 0x63, 0x9a, 0x63, 0x3a, 0xa5, 0xf4, 0x4a, 0xec, 0x92, 0x5c, 0x72, 0x64, 0xdb, 0xd7,
+ 0x6a, 0x82, 0x51, 0x96, 0x98, 0x28, 0x0f, 0xe0, 0xa0, 0x43, 0xc8, 0x76, 0x58, 0xea, 0xa9, 0x3c,
+ 0xc7, 0x43, 0x9a, 0xa4, 0x66, 0x37, 0xde, 0x9f, 0x3d, 0x49, 0xdd, 0x4c, 0x92, 0x23, 0x28, 0x45,
+ 0x64, 0xe8, 0x78, 0x48, 0xf4, 0x0c, 0xf2, 0x81, 0xba, 0xe2, 0x64, 0x48, 0xf3, 0x93, 0xeb, 0x89,
+ 0xcd, 0xf9, 0x82, 0x36, 0x87, 0xe8, 0x53, 0x00, 0xdd, 0x0b, 0x00, 0x34, 0x8d, 0xc9, 0x6e, 0x7c,
+ 0x70, 0x85, 0x48, 0x21, 0xfc, 0x8b, 0x2f, 0x04, 0x3d, 0x83, 0x82, 0xff, 0x45, 0x27, 0x9b, 0xbb,
+ 0xf2, 0x64, 0x99, 0xd4, 0x7c, 0x40, 0xce, 0x26, 0x29, 0x52, 0x16, 0x48, 0x82, 0x65, 0x39, 0xba,
+ 0x8b, 0x83, 0x6a, 0x90, 0xa7, 0x6a, 0x50, 0xbe, 0x38, 0x5f, 0x46, 0x55, 0x81, 0x9f, 0xac, 0x0a,
+ 0xa8, 0x3d, 0x82, 0x67, 0x8a, 0x15, 0x52, 0x60, 0x22, 0xb1, 0xe0, 0x2b, 0xd6, 0xa1, 0xaf, 0xc2,
+ 0x63, 0x8a, 0x15, 0x50, 0x6f, 0x56, 0x55, 0xe6, 0x42, 0xbe, 0xa7, 0x78, 0x7d, 0xdf, 0x13, 0x12,
+ 0x84, 0xea, 0x3c, 0x69, 0x96, 0x68, 0xfa, 0xf5, 0xc1, 0x8c, 0x4a, 0x4a, 0x32, 0x3a, 0xe1, 0x12,
+ 0x68, 0x2e, 0xfd, 0x08, 0x50, 0xdb, 0xc6, 0xaa, 0x8b, 0x35, 0x92, 0xb4, 0x1a, 0x7a, 0x5b, 0x77,
+ 0x8d, 0x61, 0x69, 0x3e, 0x60, 0xf7, 0xf3, 0x1c, 0x5f, 0xf7, 0xd0, 0xe8, 0x31, 0xa4, 0x5e, 0x62,
+ 0xdb, 0xd1, 0x2d, 0xb3, 0x84, 0xa8, 0x33, 0x59, 0xe2, 0x2d, 0xa2, 0x3b, 0x23, 0xe3, 0x3d, 0x65,
+ 0x54, 0xb2, 0x20, 0x47, 0xdb, 0x90, 0xc7, 0x66, 0xdb, 0xd2, 0x74, 0xb3, 0x4b, 0xd3, 0xd0, 0xd2,
+ 0x2d, 0x3f, 0xdf, 0xf9, 0xf2, 0x7c, 0xf9, 0x6b, 0x23, 0xfc, 0x75, 0x4e, 0x4b, 0xa6, 0x2d, 0xe7,
+ 0x70, 0xe0, 0x0b, 0x6d, 0x43, 0x4a, 0xc4, 0xe4, 0x05, 0xba, 0xa7, 0xab, 0xd3, 0x32, 0xd0, 0xd1,
+ 0x88, 0x2e, 0x32, 0x4b, 0xce, 0x4e, 0xca, 0x09, 0x4d, 0x77, 0x48, 0x2e, 0xa2, 0x95, 0x6e, 0x07,
+ 0xcb, 0x09, 0x01, 0x45, 0x55, 0x80, 0x2e, 0xb6, 0x14, 0xd6, 0x74, 0x2b, 0xdd, 0xa1, 0xc3, 0x2d,
+ 0x05, 0x86, 0xeb, 0x62, 0x6b, 0x4d, 0xb4, 0xe6, 0x48, 0x35, 0xd5, 0xd1, 0xbb, 0x22, 0x45, 0xe8,
+ 0x62, 0x8b, 0x01, 0x50, 0x19, 0x32, 0x7d, 0x1b, 0x6b, 0x7a, 0x9b, 0x14, 0xbe, 0x77, 0x03, 0xbe,
+ 0xd9, 0x07, 0x97, 0x97, 0x20, 0xe3, 0x79, 0x0d, 0x94, 0x82, 0x58, 0xe5, 0xb0, 0xca, 0xfa, 0x2c,
+ 0xb5, 0xfa, 0x61, 0x55, 0x8a, 0x94, 0xef, 0x41, 0x9c, 0x2e, 0x3e, 0x0b, 0xa9, 0xad, 0x96, 0xfc,
+ 0xac, 0x22, 0xd7, 0x58, 0x6f, 0xa7, 0xd1, 0x7c, 0x5a, 0x97, 0x8f, 0xea, 0x35, 0x49, 0xc4, 0x85,
+ 0xf3, 0x38, 0x20, 0xbf, 0xac, 0x3b, 0xb2, 0x78, 0x99, 0xdc, 0x85, 0x62, 0xdb, 0x83, 0xb2, 0x03,
+ 0x88, 0xac, 0x44, 0x57, 0x0b, 0x1b, 0x8f, 0x5f, 0x5b, 0x1a, 0x0a, 0x19, 0x41, 0x90, 0xaf, 0x4c,
+ 0x85, 0x76, 0x08, 0x1a, 0xc8, 0x87, 0xa2, 0x23, 0x31, 0x48, 0x86, 0x44, 0xfb, 0x14, 0xb7, 0x9f,
+ 0xf3, 0x28, 0xfc, 0xad, 0x29, 0x03, 0xd3, 0x54, 0x31, 0xa0, 0xb8, 0x55, 0xc2, 0xe3, 0x0f, 0x2d,
+ 0xd2, 0x03, 0x2a, 0x0a, 0xc9, 0x61, 0xf7, 0x1a, 0xbf, 0xd4, 0x63, 0x4d, 0x6a, 0x47, 0x09, 0x8f,
+ 0x15, 0xf0, 0xae, 0x8f, 0xa1, 0x68, 0x5a, 0xae, 0x42, 0x4a, 0x4a, 0xee, 0x05, 0x68, 0xa1, 0x98,
+ 0xdf, 0x94, 0xb8, 0xae, 0xfa, 0x36, 0x9f, 0x37, 0x2d, 0xb7, 0x39, 0x30, 0x0c, 0x06, 0x40, 0x7f,
+ 0x12, 0x81, 0x65, 0x16, 0x2b, 0x95, 0x57, 0xac, 0x41, 0xa0, 0xb0, 0xf4, 0xd6, 0xdf, 0x23, 0xda,
+ 0x4e, 0x99, 0x9e, 0x18, 0x5d, 0xd6, 0x5d, 0xe0, 0x53, 0x7d, 0x73, 0x70, 0x09, 0x4d, 0xf9, 0x08,
+ 0x0a, 0xe1, 0x63, 0x42, 0x19, 0x48, 0x54, 0xb7, 0xeb, 0xd5, 0x5d, 0x69, 0x0e, 0x15, 0x21, 0xbb,
+ 0xd5, 0x92, 0xeb, 0x8d, 0x27, 0x4d, 0x65, 0xb7, 0xfe, 0x43, 0xd6, 0x0e, 0x6c, 0xb6, 0xbc, 0x76,
+ 0x60, 0x09, 0x16, 0x8e, 0x9b, 0x8d, 0x4f, 0x8f, 0xeb, 0xca, 0xb3, 0xc6, 0xd1, 0x76, 0xeb, 0xf8,
+ 0x48, 0x69, 0x34, 0x6b, 0xf5, 0xcf, 0xa4, 0x98, 0x57, 0x82, 0x25, 0xa4, 0x64, 0xf9, 0x7f, 0x22,
+ 0x50, 0x38, 0xb0, 0xf5, 0x9e, 0x6a, 0x0f, 0x77, 0xf1, 0xf0, 0xf0, 0x95, 0xda, 0x47, 0x9f, 0xc0,
+ 0x82, 0x89, 0x5f, 0x29, 0x7d, 0x06, 0x55, 0xbc, 0x94, 0x3e, 0x32, 0xb9, 0x8b, 0x3c, 0x6f, 0xe2,
+ 0x57, 0x5c, 0x42, 0x83, 0x67, 0xf4, 0x5f, 0x87, 0xac, 0x65, 0x68, 0x8c, 0x13, 0x8b, 0x3e, 0x48,
+ 0x36, 0xc8, 0x04, 0x96, 0xa1, 0x35, 0x18, 0x9a, 0x50, 0x93, 0xf1, 0x04, 0x75, 0x6c, 0x02, 0xb5,
+ 0x89, 0x5f, 0x09, 0xea, 0x4f, 0x60, 0x81, 0xc8, 0x1e, 0x9b, 0x5d, 0x7c, 0xca, 0xec, 0x2c, 0x43,
+ 0x0b, 0xcf, 0x8e, 0x5b, 0xd6, 0xdf, 0x47, 0x80, 0x46, 0x94, 0x81, 0x2b, 0x7a, 0x7c, 0x74, 0xf1,
+ 0xdf, 0x80, 0x3c, 0x99, 0x8c, 0x5f, 0xc8, 0x45, 0xa6, 0x28, 0x0b, 0x99, 0xb3, 0x08, 0x0f, 0x84,
+ 0x8b, 0x4c, 0xca, 0xe7, 0x8a, 0x4e, 0xe3, 0xb2, 0x0c, 0xaf, 0xa3, 0x88, 0xde, 0x85, 0x9c, 0x6e,
+ 0x12, 0x8f, 0xca, 0x1b, 0x0d, 0xc1, 0xde, 0x4f, 0x96, 0x63, 0xea, 0x67, 0x7d, 0x9b, 0xcf, 0xf8,
+ 0xd7, 0x51, 0xb8, 0xbb, 0xaf, 0xba, 0xd8, 0xd6, 0x55, 0x43, 0xff, 0x23, 0xac, 0x3d, 0xd5, 0xf1,
+ 0x2b, 0x19, 0x77, 0x6c, 0xec, 0x9c, 0xa2, 0xcf, 0x60, 0x7e, 0xec, 0xcc, 0xe8, 0xd4, 0xb3, 0x1b,
+ 0xef, 0xcc, 0x16, 0x52, 0x44, 0x62, 0x3c, 0x72, 0x9a, 0x68, 0x3f, 0x7c, 0x3a, 0xac, 0xb0, 0xb8,
+ 0x9a, 0xcc, 0xe0, 0xf1, 0x3d, 0x86, 0x84, 0xea, 0x28, 0x56, 0x87, 0xbb, 0x8d, 0xb7, 0x02, 0x82,
+ 0x06, 0xae, 0x6e, 0xac, 0x9d, 0x1a, 0xed, 0xb5, 0x23, 0x71, 0xdb, 0x22, 0x1c, 0x8e, 0xea, 0xb4,
+ 0x3a, 0xe8, 0x43, 0x28, 0x3a, 0xa7, 0xd6, 0xc0, 0xd0, 0x94, 0x13, 0xb5, 0xfd, 0xbc, 0xa3, 0x1b,
+ 0x46, 0xa8, 0x69, 0x54, 0x60, 0xc8, 0x4d, 0x8e, 0xe3, 0x7b, 0xf6, 0x17, 0x29, 0x40, 0xfe, 0x7c,
+ 0xf6, 0x07, 0xae, 0x4a, 0x5d, 0x72, 0x05, 0x92, 0xdc, 0x17, 0xb0, 0x3d, 0x7a, 0x77, 0xaa, 0xdb,
+ 0x0c, 0x37, 0xc9, 0xb6, 0xe7, 0x64, 0xce, 0x88, 0x7e, 0x10, 0xbc, 0x5c, 0x99, 0x79, 0x47, 0xb6,
+ 0xe7, 0xc4, 0xad, 0xcb, 0x2e, 0x24, 0x1c, 0x97, 0x84, 0x90, 0x18, 0x0d, 0xfc, 0xeb, 0x53, 0xf8,
+ 0xc7, 0x27, 0xbf, 0x76, 0x48, 0xd8, 0x84, 0xe3, 0xa4, 0x32, 0xd0, 0x33, 0xc8, 0x78, 0xf9, 0x2e,
+ 0x6f, 0x12, 0x3e, 0x9a, 0x5d, 0xa0, 0x17, 0xaa, 0x44, 0x20, 0xf3, 0x64, 0xa1, 0x0a, 0x64, 0x7b,
+ 0x9c, 0xcc, 0xef, 0x6a, 0xac, 0xf0, 0x92, 0x03, 0x84, 0x04, 0x5a, 0x7a, 0x04, 0xbe, 0x64, 0x10,
+ 0x4c, 0x0d, 0x1a, 0x96, 0x6d, 0xcb, 0x30, 0xc8, 0xa1, 0x51, 0x77, 0xe9, 0x85, 0x65, 0x01, 0x45,
+ 0xbb, 0xa4, 0x70, 0xf0, 0x5c, 0x6a, 0x9a, 0xee, 0xe7, 0x7b, 0x33, 0x07, 0xb2, 0xed, 0x39, 0x39,
+ 0xc0, 0x8e, 0x5a, 0x50, 0xe8, 0x87, 0xfc, 0x19, 0xcf, 0xd2, 0x1f, 0x4c, 0x4b, 0xd5, 0x42, 0xc4,
+ 0xdb, 0x73, 0xf2, 0x08, 0x3b, 0xfa, 0x31, 0xa0, 0xf6, 0x98, 0x9f, 0x28, 0xc1, 0x6b, 0x66, 0x39,
+ 0xca, 0xb0, 0x3d, 0x27, 0x4f, 0x10, 0x83, 0x3e, 0x87, 0xbb, 0xbd, 0xc9, 0x26, 0xcd, 0xf3, 0xf5,
+ 0xb5, 0x29, 0x23, 0x4c, 0x71, 0x04, 0xdb, 0x73, 0xf2, 0x34, 0x81, 0xe5, 0x4f, 0x20, 0x41, 0x55,
+ 0x87, 0x64, 0x1d, 0xc7, 0xcd, 0xdd, 0x66, 0xeb, 0x59, 0x93, 0x45, 0x91, 0x5a, 0x7d, 0xaf, 0x7e,
+ 0x54, 0x57, 0x5a, 0xcd, 0x3d, 0x12, 0x45, 0xde, 0x80, 0xdb, 0x1c, 0x50, 0x69, 0xd6, 0x94, 0x67,
+ 0x72, 0x43, 0xa0, 0xa2, 0xe5, 0xd5, 0x60, 0x5a, 0x93, 0x86, 0x78, 0xb3, 0xd5, 0xac, 0x4b, 0x73,
+ 0x34, 0xc1, 0xa9, 0xd5, 0xa4, 0x08, 0x4d, 0x70, 0xe4, 0xd6, 0x81, 0x14, 0x65, 0xd6, 0xb7, 0x99,
+ 0x03, 0xd0, 0x3c, 0x75, 0xdb, 0x89, 0xa7, 0x93, 0x52, 0xaa, 0xfc, 0x77, 0x11, 0x48, 0x93, 0x7a,
+ 0xb1, 0x61, 0x76, 0x2c, 0xf4, 0x08, 0x32, 0x7d, 0xd5, 0xc6, 0xa6, 0xeb, 0x7b, 0x5a, 0xd1, 0xc6,
+ 0x4b, 0x1f, 0x50, 0x84, 0xd7, 0x65, 0x4a, 0x33, 0xc2, 0xc6, 0x65, 0x3d, 0x9a, 0x2d, 0x90, 0xb8,
+ 0x38, 0xa7, 0x7d, 0x8a, 0x7b, 0x2a, 0x91, 0xca, 0x1a, 0x49, 0x6f, 0x7a, 0x2d, 0x56, 0x8a, 0x3f,
+ 0xa4, 0x68, 0x4f, 0x76, 0xa1, 0x1f, 0x84, 0x8a, 0x08, 0xf1, 0xdf, 0xef, 0x40, 0x71, 0x24, 0x7d,
+ 0xb9, 0xa4, 0x26, 0x5f, 0xa1, 0x35, 0x79, 0xcc, 0xf7, 0xfb, 0x5e, 0x4d, 0x1e, 0xe5, 0xe5, 0x78,
+ 0x68, 0xb1, 0xf1, 0x19, 0x17, 0xfb, 0xc8, 0x4f, 0xd1, 0x99, 0xf1, 0xbd, 0xc1, 0x63, 0xca, 0xfc,
+ 0x25, 0xd9, 0xf9, 0x01, 0xcc, 0xf7, 0x2c, 0x4d, 0xef, 0x90, 0x64, 0x94, 0x58, 0xae, 0xab, 0xf7,
+ 0x30, 0x4f, 0x55, 0x66, 0x72, 0xb8, 0x52, 0x90, 0x9b, 0x20, 0xd1, 0x13, 0x48, 0x89, 0xd6, 0x53,
+ 0x9a, 0x46, 0x80, 0x59, 0x3d, 0xa6, 0x48, 0xd2, 0x39, 0x37, 0xda, 0x82, 0x82, 0x89, 0xcf, 0x82,
+ 0x9d, 0xd2, 0x4c, 0xc8, 0xa7, 0xe4, 0x9a, 0xf8, 0x6c, 0x72, 0x9b, 0x34, 0x67, 0xfa, 0x18, 0x0d,
+ 0x7d, 0x0a, 0xf9, 0x70, 0xb0, 0x83, 0x6b, 0x04, 0xbb, 0x5c, 0x3f, 0x18, 0xe9, 0xb6, 0x20, 0x25,
+ 0xa2, 0x5c, 0xf6, 0x1a, 0x51, 0x4e, 0x30, 0xa3, 0x4d, 0x92, 0x42, 0x9c, 0xb9, 0x7e, 0x6a, 0x92,
+ 0xf3, 0x6b, 0xab, 0x8b, 0xf3, 0xe5, 0x2c, 0x59, 0xe1, 0x84, 0x7e, 0x68, 0xd6, 0xf4, 0xe0, 0x1a,
+ 0xda, 0x01, 0xf0, 0xde, 0x13, 0x38, 0xf4, 0x9a, 0x60, 0x7a, 0x8d, 0x7d, 0x20, 0x08, 0xfd, 0x29,
+ 0xc9, 0x01, 0x6e, 0xb4, 0x0f, 0x19, 0xe1, 0x8e, 0x59, 0xf5, 0x3b, 0xdd, 0x6f, 0x8d, 0x07, 0x07,
+ 0x11, 0x12, 0x3c, 0x09, 0x24, 0xf1, 0x37, 0xb0, 0xea, 0x60, 0x5e, 0x02, 0x3f, 0x9e, 0x31, 0xf1,
+ 0x67, 0xc6, 0x55, 0x3d, 0x55, 0xcd, 0x2e, 0xde, 0x23, 0xfc, 0x9b, 0xd1, 0x52, 0x44, 0x66, 0xa2,
+ 0x50, 0x13, 0x24, 0xba, 0x65, 0xc1, 0x58, 0x23, 0xd1, 0x5d, 0x7b, 0x5b, 0x18, 0x2e, 0xd9, 0xb5,
+ 0xa9, 0xf1, 0x86, 0xea, 0xd4, 0xbe, 0x1f, 0x73, 0xbe, 0x07, 0x85, 0x8e, 0x65, 0xf7, 0x54, 0x57,
+ 0x11, 0xc6, 0x33, 0xef, 0x37, 0xcb, 0xbe, 0x3c, 0x5f, 0xce, 0x6f, 0x51, 0xac, 0x30, 0x9c, 0x7c,
+ 0x27, 0xf8, 0x89, 0x36, 0x45, 0x68, 0xbe, 0x45, 0x23, 0xe9, 0x3b, 0xaf, 0xdd, 0xac, 0x09, 0x11,
+ 0xb9, 0x09, 0x49, 0x5a, 0xd3, 0x38, 0xa5, 0x05, 0xba, 0xe3, 0xd7, 0xac, 0x8f, 0x64, 0x2e, 0x05,
+ 0xed, 0x41, 0x41, 0x23, 0x10, 0x52, 0x70, 0xb3, 0x36, 0xdc, 0x6d, 0x2a, 0x77, 0x79, 0x8a, 0x5c,
+ 0xe1, 0x62, 0x45, 0xb7, 0x45, 0x30, 0xb3, 0x56, 0x5d, 0x0b, 0xd2, 0x1d, 0xb5, 0xa7, 0x1b, 0x3a,
+ 0x76, 0x4a, 0x77, 0xa8, 0x9c, 0x0f, 0x2f, 0xb5, 0xe7, 0xd1, 0x2b, 0x19, 0x11, 0xc2, 0x85, 0x10,
+ 0xcf, 0xac, 0x29, 0x60, 0x48, 0x8e, 0xef, 0xee, 0xb8, 0x59, 0x8b, 0x2b, 0x99, 0xd0, 0xf5, 0x0c,
+ 0x35, 0x6b, 0xfe, 0xa5, 0xa1, 0xfb, 0x00, 0x2f, 0x75, 0xfc, 0x4a, 0x79, 0x31, 0xc0, 0xf6, 0xb0,
+ 0x54, 0x0a, 0x56, 0xd7, 0x04, 0xfe, 0x29, 0x01, 0xa3, 0x8f, 0x20, 0xa3, 0xe1, 0x3e, 0x36, 0x35,
+ 0xa7, 0x65, 0x96, 0xde, 0xa0, 0xe5, 0xc2, 0xad, 0x8b, 0xf3, 0xe5, 0x4c, 0x4d, 0x00, 0xb9, 0x17,
+ 0xf5, 0xa9, 0xd0, 0xe7, 0x90, 0x63, 0x1f, 0x58, 0x6b, 0x99, 0x9b, 0xc3, 0xd2, 0x22, 0x5d, 0xf4,
+ 0xc3, 0x19, 0x0f, 0xc5, 0xef, 0x5d, 0x79, 0xed, 0xfe, 0x5a, 0x40, 0x9a, 0x1c, 0x92, 0x8d, 0xfe,
+ 0x1f, 0xe4, 0x84, 0x1e, 0xef, 0x58, 0x27, 0x4e, 0xe9, 0x6b, 0x97, 0xf6, 0xe2, 0x47, 0xc7, 0xda,
+ 0xf7, 0x59, 0x85, 0x97, 0x0a, 0x4a, 0x43, 0x9f, 0x41, 0xde, 0xbb, 0x75, 0xb4, 0xfa, 0xae, 0x53,
+ 0x7a, 0xf3, 0xd2, 0x12, 0x74, 0xcc, 0x0c, 0x39, 0x6f, 0xab, 0x4f, 0xaf, 0x29, 0x02, 0x5f, 0xe8,
+ 0x1e, 0x64, 0x34, 0xdb, 0xea, 0xb3, 0x68, 0xf1, 0xd6, 0x4a, 0x64, 0x35, 0xe6, 0x35, 0x50, 0x6c,
+ 0xab, 0x4f, 0xc3, 0x80, 0x02, 0x05, 0x1b, 0xf7, 0x0d, 0xb5, 0x8d, 0x7b, 0x24, 0x8e, 0x59, 0x9d,
+ 0xd2, 0x12, 0x1d, 0x7d, 0x63, 0xe6, 0x8d, 0xf4, 0x98, 0x85, 0x62, 0x06, 0xe4, 0xb5, 0x3a, 0xe8,
+ 0x18, 0x40, 0x1d, 0x68, 0xba, 0xab, 0xf4, 0x2c, 0x0d, 0x97, 0x96, 0x2f, 0x7d, 0x04, 0x30, 0x2a,
+ 0xbc, 0x42, 0x18, 0xf7, 0x2d, 0x0d, 0x7b, 0x17, 0x5b, 0x02, 0x80, 0x3e, 0x82, 0x2c, 0x5d, 0xda,
+ 0xe7, 0xd6, 0x09, 0xd1, 0xcd, 0x15, 0xba, 0xb8, 0x79, 0x7e, 0x96, 0x99, 0x9a, 0x6d, 0xf5, 0x77,
+ 0xac, 0x13, 0xaa, 0x31, 0xfc, 0x4f, 0x0d, 0x39, 0x90, 0xeb, 0xb6, 0x15, 0xdf, 0x71, 0xde, 0xa3,
+ 0xa7, 0xf8, 0xf1, 0x8c, 0x73, 0x79, 0x52, 0x9d, 0xe0, 0x4a, 0x6f, 0x89, 0x08, 0xf0, 0xa4, 0x2a,
+ 0x60, 0x8e, 0x9c, 0xed, 0xb6, 0xbd, 0x0f, 0x52, 0x11, 0xb2, 0x2e, 0x1d, 0x37, 0x80, 0x72, 0xb0,
+ 0x22, 0x64, 0x18, 0x66, 0x02, 0x4d, 0xe0, 0xed, 0x3c, 0x85, 0x56, 0x53, 0xec, 0xcc, 0xee, 0xcf,
+ 0x1e, 0xe1, 0x0b, 0x8c, 0xbb, 0xe2, 0xb4, 0x3a, 0xf4, 0x60, 0xdb, 0x90, 0xb3, 0x06, 0xee, 0x89,
+ 0x35, 0x30, 0x35, 0xa5, 0xf3, 0xdc, 0x29, 0xbd, 0x4d, 0x57, 0x7b, 0xa5, 0xd6, 0x8b, 0xb7, 0xba,
+ 0x16, 0x17, 0xb4, 0xb5, 0xeb, 0xc8, 0x59, 0x21, 0x75, 0xeb, 0xb9, 0x83, 0x7e, 0x0a, 0x59, 0xdd,
+ 0xf4, 0xc7, 0x78, 0x70, 0xf5, 0x31, 0x90, 0xa8, 0x3c, 0x1a, 0xa6, 0x37, 0x04, 0x70, 0x99, 0x64,
+ 0x84, 0x0f, 0xa0, 0x60, 0x75, 0x3a, 0x86, 0x6e, 0x62, 0xc5, 0xc6, 0xaa, 0x63, 0x99, 0xa5, 0x77,
+ 0x02, 0x3b, 0x98, 0xe7, 0x38, 0x99, 0xa2, 0x50, 0x19, 0x32, 0x2e, 0xee, 0xf5, 0x2d, 0x5b, 0xb5,
+ 0x87, 0xa5, 0x77, 0x83, 0xf7, 0x81, 0x1e, 0x18, 0x9d, 0xc0, 0xe2, 0xc0, 0xc4, 0x67, 0x7d, 0xcb,
+ 0xc1, 0x9a, 0x32, 0x96, 0x5b, 0xae, 0x52, 0x1f, 0xf7, 0x80, 0x4f, 0xea, 0xee, 0xb1, 0xa0, 0x9c,
+ 0x98, 0x64, 0xde, 0x1d, 0x4c, 0x44, 0x6b, 0xe8, 0x5b, 0xb0, 0xa0, 0x3b, 0x4a, 0x30, 0x6b, 0x57,
+ 0x88, 0xaf, 0x2b, 0xbd, 0x17, 0x98, 0x12, 0xd2, 0x9d, 0xd1, 0x8c, 0x1f, 0xfd, 0x04, 0x8a, 0x86,
+ 0xd5, 0x56, 0x0d, 0xdd, 0x1d, 0x8a, 0x96, 0xe6, 0xfb, 0x54, 0x03, 0xbe, 0x39, 0xa3, 0x92, 0xee,
+ 0x71, 0x6e, 0xd6, 0xd8, 0x94, 0x0b, 0x46, 0xe8, 0x1b, 0xfd, 0x2c, 0x02, 0x2b, 0xaf, 0xe9, 0x7f,
+ 0x39, 0xa5, 0x0f, 0x2e, 0xbd, 0x19, 0x9c, 0xa1, 0x01, 0xf6, 0xd6, 0x65, 0x0d, 0x30, 0x67, 0xf1,
+ 0x57, 0x11, 0x98, 0x1f, 0x4b, 0x1d, 0xd0, 0x4f, 0x20, 0x65, 0x5a, 0x5a, 0xe0, 0x6a, 0xba, 0xce,
+ 0xcf, 0x20, 0xd9, 0xb4, 0x34, 0x76, 0x33, 0xfd, 0xa8, 0xab, 0xbb, 0xa7, 0x83, 0x93, 0xb5, 0xb6,
+ 0xd5, 0x5b, 0xf7, 0x26, 0xa7, 0x9d, 0xf8, 0x7f, 0xaf, 0xf7, 0x9f, 0x77, 0xd7, 0xe9, 0x5f, 0xfd,
+ 0x93, 0x35, 0xc6, 0x26, 0x27, 0x89, 0xd4, 0x86, 0x86, 0x3e, 0x84, 0x22, 0x3e, 0xeb, 0xeb, 0x76,
+ 0x20, 0x7d, 0x8e, 0x06, 0x1c, 0x62, 0xc1, 0x47, 0x12, 0xeb, 0xe1, 0x97, 0x87, 0xbf, 0x8e, 0x42,
+ 0x71, 0x24, 0x7c, 0x93, 0x7a, 0x81, 0xb6, 0x76, 0x42, 0xf5, 0x02, 0x81, 0x5c, 0x52, 0xc5, 0x04,
+ 0x1f, 0xfc, 0xc4, 0x6e, 0xfa, 0xf8, 0x2b, 0x7c, 0x29, 0x97, 0xb8, 0xc2, 0xa5, 0xdc, 0x77, 0xe0,
+ 0x8e, 0xee, 0x28, 0xa6, 0x65, 0x8a, 0xde, 0xa9, 0x57, 0xa1, 0x07, 0x1f, 0xda, 0xdc, 0xd2, 0x9d,
+ 0xa6, 0x65, 0xb2, 0xae, 0xa9, 0xb7, 0x6a, 0xff, 0x4d, 0x4e, 0x6a, 0xfc, 0x4d, 0x8e, 0xd7, 0x7e,
+ 0x8c, 0x4b, 0x89, 0xc5, 0x5f, 0x46, 0x20, 0x13, 0x7c, 0xd2, 0x1a, 0x0d, 0x77, 0xdc, 0xc6, 0x6a,
+ 0xa8, 0x6b, 0x3e, 0x31, 0x08, 0xef, 0x42, 0x6c, 0xf6, 0x5d, 0xe0, 0x47, 0xfb, 0xc7, 0x90, 0x0d,
+ 0xc4, 0xe5, 0xd1, 0xae, 0x48, 0xe4, 0x1a, 0x5d, 0x91, 0xb7, 0x21, 0xc9, 0x83, 0x11, 0x53, 0xac,
+ 0x3c, 0xe7, 0x4e, 0xb0, 0x40, 0x94, 0xf8, 0x9c, 0x04, 0x21, 0x3e, 0xfa, 0xbf, 0xc6, 0x20, 0x17,
+ 0x8c, 0xdb, 0xc4, 0x73, 0xe9, 0x66, 0xdb, 0xa6, 0x41, 0x93, 0x8e, 0x1e, 0xf3, 0x5e, 0x32, 0x08,
+ 0x30, 0x89, 0xe6, 0x3d, 0xdd, 0x54, 0xe8, 0xed, 0x79, 0x48, 0x79, 0xd3, 0x3d, 0xdd, 0x7c, 0x4a,
+ 0xa0, 0x94, 0x44, 0x3d, 0xe3, 0x24, 0xb1, 0x10, 0x89, 0x7a, 0xc6, 0x48, 0x16, 0x69, 0x2a, 0x6c,
+ 0xbb, 0xb4, 0x5e, 0x8d, 0x05, 0x52, 0x5c, 0xdb, 0x0d, 0xbe, 0xf4, 0x49, 0x4c, 0x78, 0xe9, 0x83,
+ 0x4c, 0x28, 0xf8, 0x99, 0xca, 0x2b, 0x13, 0xdb, 0x54, 0x71, 0xb2, 0x1b, 0x95, 0x6b, 0xa4, 0x2a,
+ 0xfe, 0x07, 0x11, 0x24, 0xfc, 0xb9, 0x13, 0x04, 0x2e, 0xfe, 0x6d, 0x04, 0xf2, 0x21, 0x32, 0xd4,
+ 0x80, 0x22, 0x1d, 0x78, 0xac, 0x9d, 0x7b, 0xcf, 0x7b, 0x9c, 0x4a, 0xd0, 0x13, 0xcb, 0xcd, 0xbc,
+ 0x15, 0x40, 0x69, 0xe8, 0x13, 0x28, 0x30, 0x51, 0xde, 0x9b, 0x98, 0xb0, 0xfa, 0xe5, 0xa8, 0xa4,
+ 0xf0, 0xc3, 0x98, 0x9c, 0xe5, 0xc3, 0xb4, 0xe0, 0x75, 0xff, 0xa2, 0x09, 0xd9, 0x40, 0x2a, 0x34,
+ 0x83, 0xde, 0x7f, 0x1b, 0xe2, 0x9e, 0x17, 0x9a, 0xb5, 0x6b, 0xea, 0xfa, 0xae, 0xe9, 0x17, 0x11,
+ 0x58, 0x98, 0x94, 0x92, 0x84, 0xec, 0x89, 0x29, 0xd2, 0x4c, 0xf6, 0x74, 0x3f, 0x98, 0x2a, 0x32,
+ 0xe5, 0x12, 0x57, 0xd0, 0x7e, 0xb2, 0xf8, 0x8e, 0xa7, 0xe2, 0x4c, 0xb7, 0x8a, 0x21, 0x15, 0x27,
+ 0xc5, 0x5f, 0x50, 0xc9, 0xff, 0x39, 0x06, 0x85, 0x70, 0x40, 0x42, 0x4f, 0x21, 0xd9, 0x35, 0xac,
+ 0x13, 0xd5, 0xe0, 0x5d, 0xda, 0xef, 0x5d, 0x2b, 0xae, 0xad, 0x3d, 0xa1, 0x32, 0xb6, 0xe7, 0x64,
+ 0x2e, 0x0d, 0x39, 0x30, 0x6f, 0xe3, 0xae, 0x6e, 0x99, 0xaa, 0xa1, 0x9c, 0x0c, 0xd9, 0x89, 0xf2,
+ 0x9d, 0xad, 0x5f, 0x6f, 0x08, 0x99, 0x8b, 0xdb, 0x1c, 0x52, 0xc2, 0xed, 0x39, 0xb9, 0x68, 0x87,
+ 0x41, 0xa8, 0x07, 0xc5, 0xe0, 0xa0, 0xb6, 0xf5, 0x8a, 0xb7, 0xc0, 0xab, 0x37, 0x1d, 0x52, 0xb6,
+ 0x5e, 0x6d, 0xd3, 0x44, 0x3a, 0x00, 0x58, 0xfc, 0x18, 0x8a, 0x23, 0x93, 0x42, 0x65, 0x48, 0x32,
+ 0x1a, 0x1e, 0x8d, 0xe0, 0xcb, 0xf3, 0xe5, 0x24, 0x23, 0x92, 0x39, 0x86, 0x9f, 0xc5, 0x6d, 0xc8,
+ 0x87, 0xc4, 0x73, 0x70, 0x01, 0x92, 0x6c, 0x2f, 0x83, 0xba, 0xbc, 0x09, 0x90, 0x16, 0x89, 0x43,
+ 0x79, 0x15, 0x32, 0x5e, 0x16, 0x8e, 0x72, 0x90, 0xae, 0x35, 0x0e, 0x2b, 0x9b, 0x7b, 0xf5, 0x9a,
+ 0x34, 0x87, 0xf2, 0x90, 0x91, 0xeb, 0x95, 0x1a, 0xed, 0x27, 0x4a, 0x91, 0xef, 0xa6, 0xff, 0xec,
+ 0x17, 0xcb, 0x11, 0x1e, 0x08, 0x92, 0x52, 0x6a, 0x27, 0x9e, 0x46, 0xd2, 0xad, 0xf2, 0x7f, 0xa5,
+ 0x01, 0xd5, 0x54, 0x57, 0x25, 0x1b, 0x70, 0x85, 0xae, 0x5b, 0xf4, 0x12, 0xcb, 0x09, 0x77, 0x52,
+ 0x62, 0x37, 0xea, 0xa4, 0x4c, 0xec, 0xab, 0xc5, 0x6f, 0xd2, 0x57, 0xbb, 0x56, 0x7b, 0x6f, 0xbc,
+ 0x17, 0x90, 0xbc, 0x41, 0x2f, 0xe0, 0x29, 0xa4, 0x58, 0x46, 0xcb, 0xde, 0xdc, 0x4c, 0x6f, 0x55,
+ 0x8c, 0x1f, 0x0c, 0x6f, 0xea, 0x38, 0x75, 0xd3, 0xb5, 0x87, 0xde, 0x75, 0x3c, 0x83, 0xf9, 0x5d,
+ 0x94, 0xf4, 0xf5, 0xbb, 0x28, 0xe3, 0xf9, 0x7c, 0x66, 0x7a, 0x3e, 0xff, 0x63, 0xe0, 0x36, 0x20,
+ 0xb2, 0x61, 0xb8, 0xf4, 0x66, 0x7a, 0xc2, 0x72, 0x98, 0xd2, 0xf3, 0x74, 0x38, 0x67, 0x07, 0xbe,
+ 0x16, 0x8f, 0x00, 0x78, 0xc2, 0x6e, 0x76, 0xac, 0x19, 0x1c, 0xf6, 0x12, 0xa4, 0x88, 0x23, 0xec,
+ 0x63, 0xa6, 0x9d, 0x5e, 0x70, 0xe4, 0x40, 0x6e, 0x51, 0x7d, 0xc8, 0x05, 0xb7, 0x10, 0x49, 0x10,
+ 0x7b, 0x8e, 0x87, 0x4c, 0xcf, 0x65, 0xf2, 0x27, 0xda, 0x81, 0x84, 0x1f, 0xc2, 0xa7, 0x3f, 0xf4,
+ 0x9c, 0x7a, 0x36, 0x64, 0xba, 0x32, 0x13, 0xf1, 0xdd, 0xe8, 0xe3, 0xc8, 0xe2, 0x9f, 0x46, 0x21,
+ 0x17, 0x5c, 0x26, 0x7a, 0x1b, 0x52, 0x6c, 0xa1, 0xec, 0x2d, 0x69, 0xd8, 0x2d, 0x08, 0x14, 0x6a,
+ 0x42, 0xde, 0x19, 0xd8, 0x2f, 0xf5, 0x97, 0xaa, 0xa1, 0x74, 0x2d, 0xd5, 0xa0, 0xd3, 0x29, 0x6c,
+ 0xdc, 0x9f, 0xf6, 0x56, 0x83, 0xd3, 0x3e, 0xb1, 0x54, 0x43, 0x74, 0x31, 0x9c, 0x00, 0x0c, 0x7d,
+ 0xd3, 0xbb, 0xa5, 0x51, 0xb8, 0x4f, 0x62, 0x97, 0x9f, 0x05, 0xae, 0xfe, 0x62, 0x02, 0xa2, 0xc9,
+ 0xcb, 0x3e, 0x49, 0x14, 0xe6, 0x47, 0x8c, 0xcd, 0x41, 0xcf, 0xef, 0xa3, 0x7b, 0x51, 0x98, 0xd1,
+ 0xd5, 0xcd, 0x41, 0xcf, 0x8f, 0xc2, 0xb6, 0x0f, 0x13, 0x51, 0xd8, 0xf3, 0x3e, 0xe5, 0x7f, 0xc9,
+ 0x42, 0xe1, 0x68, 0xd8, 0x0f, 0x7a, 0x9b, 0x6b, 0x5d, 0x4a, 0x4c, 0xba, 0x7a, 0x88, 0x5e, 0xfd,
+ 0xea, 0xe1, 0x92, 0xdf, 0x01, 0x30, 0x9d, 0x8b, 0x5f, 0xa2, 0x73, 0x35, 0x88, 0xd3, 0x97, 0xdc,
+ 0x09, 0x7a, 0x36, 0xd3, 0x9c, 0x5c, 0x78, 0xb5, 0x6b, 0x81, 0xc7, 0xdc, 0x94, 0x1b, 0xfd, 0x10,
+ 0x72, 0x74, 0x73, 0x7b, 0xb8, 0x77, 0x82, 0x6d, 0xe1, 0x5b, 0x1e, 0xce, 0x26, 0x8d, 0xec, 0xf2,
+ 0x3e, 0x65, 0x14, 0x5d, 0x0b, 0xec, 0x41, 0x1c, 0xf4, 0x10, 0x12, 0xaa, 0xa1, 0x53, 0x47, 0xf3,
+ 0xba, 0x5f, 0x08, 0x30, 0x42, 0xf4, 0x7d, 0xc8, 0xab, 0xb6, 0xad, 0x0e, 0xf9, 0x5b, 0x77, 0x8d,
+ 0x3a, 0x13, 0xee, 0x25, 0x2f, 0xce, 0x97, 0xb3, 0x15, 0x82, 0xa4, 0xcf, 0xdb, 0xc5, 0x46, 0x64,
+ 0x55, 0x0f, 0x14, 0xba, 0x3d, 0xc9, 0xdc, 0xec, 0xf6, 0x04, 0x6e, 0xe2, 0xe5, 0xc7, 0x1d, 0x76,
+ 0xf6, 0x06, 0x0e, 0xfb, 0xa7, 0xb0, 0x28, 0x9e, 0xf9, 0x11, 0x81, 0xfe, 0x0d, 0x5b, 0xe0, 0x57,
+ 0x08, 0xe5, 0x8b, 0xf3, 0xe5, 0x92, 0xec, 0x53, 0xf9, 0xcb, 0x65, 0xb5, 0x0e, 0xd9, 0xa9, 0x92,
+ 0x3d, 0x11, 0xaf, 0x05, 0x5c, 0x77, 0xfe, 0xfa, 0xae, 0x3b, 0x1c, 0x77, 0x0b, 0x37, 0x8a, 0xbb,
+ 0xe3, 0x61, 0xa0, 0x38, 0x3d, 0x0c, 0x3c, 0x1b, 0x0d, 0x03, 0xd2, 0xe5, 0x2d, 0xca, 0xb0, 0x02,
+ 0x5f, 0x12, 0x02, 0x7e, 0x1e, 0x05, 0xf0, 0xf5, 0x1b, 0x7d, 0x1b, 0xee, 0xf6, 0x4f, 0x87, 0x8e,
+ 0xde, 0x56, 0x0d, 0xc5, 0xc6, 0x7d, 0x1b, 0x3b, 0xd8, 0x64, 0x59, 0x35, 0x75, 0x1a, 0x39, 0xf9,
+ 0x8e, 0x40, 0xcb, 0x21, 0x2c, 0xfa, 0x18, 0xee, 0x18, 0x56, 0x77, 0x12, 0x5f, 0xb0, 0x17, 0x70,
+ 0x9b, 0xd3, 0x8c, 0x30, 0xab, 0x00, 0x6d, 0xb5, 0xaf, 0x9e, 0xe8, 0x86, 0xdf, 0x1e, 0xf8, 0xf8,
+ 0xaa, 0xb6, 0xb9, 0x56, 0xf5, 0x44, 0x88, 0x27, 0x1a, 0xbe, 0xd0, 0xf2, 0xdb, 0x00, 0x3e, 0x9e,
+ 0x5e, 0xee, 0xee, 0xed, 0xf9, 0x09, 0x1c, 0xbf, 0x26, 0xe6, 0x01, 0x6c, 0x77, 0x24, 0x9a, 0x8c,
+ 0xfb, 0xf5, 0xc8, 0x0c, 0x7e, 0x9d, 0x5f, 0xb8, 0x7e, 0x04, 0x71, 0xfa, 0x13, 0x92, 0x34, 0xc4,
+ 0xeb, 0xcd, 0xe3, 0x7d, 0x69, 0x0e, 0x65, 0x20, 0x51, 0xd9, 0x6b, 0x54, 0x0e, 0xa5, 0x08, 0x5a,
+ 0x00, 0x69, 0xff, 0x78, 0xef, 0xa8, 0x21, 0xd7, 0x9f, 0x34, 0x5a, 0x4d, 0x85, 0x12, 0x44, 0x03,
+ 0x8e, 0xfc, 0x6f, 0xe2, 0x20, 0x31, 0x2f, 0x7a, 0x53, 0x57, 0x3e, 0xbd, 0x33, 0xf3, 0xfa, 0x3b,
+ 0xde, 0xb0, 0xd6, 0xc7, 0xbf, 0xfa, 0x6c, 0x33, 0xf1, 0x15, 0x65, 0x9b, 0xc9, 0x1b, 0x64, 0x9b,
+ 0xa9, 0x1b, 0x38, 0xaf, 0x3f, 0x74, 0x56, 0x18, 0xd0, 0x90, 0x5f, 0x46, 0x01, 0x02, 0xba, 0xf1,
+ 0x83, 0xe0, 0xef, 0xa7, 0xa7, 0x5f, 0xf6, 0x8e, 0x94, 0x61, 0xdb, 0x73, 0xe2, 0xd7, 0xd5, 0x4f,
+ 0x20, 0xad, 0xf1, 0xac, 0x8b, 0x27, 0x67, 0xef, 0xcd, 0x9c, 0x9c, 0x6d, 0xcf, 0xc9, 0x1e, 0x33,
+ 0xfa, 0x38, 0xf4, 0xb3, 0xb9, 0x07, 0x33, 0x19, 0xf3, 0xb6, 0x78, 0xf7, 0x5b, 0x81, 0x24, 0x4b,
+ 0x38, 0xb8, 0xb2, 0x4d, 0xfd, 0xfd, 0xd6, 0x88, 0x69, 0x90, 0x72, 0x98, 0x31, 0xf2, 0x32, 0x2e,
+ 0x05, 0x89, 0x81, 0xa9, 0x5b, 0xe6, 0xfb, 0x72, 0xf0, 0xc5, 0xa9, 0xe8, 0x2b, 0x12, 0xeb, 0xa7,
+ 0x7f, 0xab, 0x2e, 0xd6, 0xd8, 0xab, 0x91, 0x63, 0xf3, 0xa5, 0x07, 0x88, 0xa0, 0x02, 0x00, 0xc7,
+ 0xeb, 0x66, 0x57, 0x8a, 0xd2, 0xe2, 0x8f, 0xa4, 0xba, 0xe4, 0x2b, 0xf6, 0xfe, 0xf7, 0x41, 0x1a,
+ 0xfd, 0x01, 0x59, 0xe0, 0xfd, 0xc8, 0x3c, 0xe4, 0xf7, 0x9f, 0x56, 0xab, 0x47, 0x8d, 0xfd, 0xfa,
+ 0xe1, 0x51, 0x65, 0xff, 0x80, 0x3d, 0x65, 0x3c, 0x22, 0x95, 0x63, 0xab, 0x51, 0x93, 0xa2, 0xef,
+ 0x7f, 0x1f, 0x8a, 0x23, 0x0a, 0x81, 0x00, 0x92, 0x07, 0xc7, 0x9b, 0x7b, 0x8d, 0xea, 0xc4, 0xf7,
+ 0x27, 0x28, 0x0b, 0xa9, 0xd6, 0xd6, 0xd6, 0x5e, 0xa3, 0x59, 0x97, 0x62, 0xef, 0x7f, 0x03, 0x72,
+ 0xc1, 0x84, 0x14, 0x49, 0x90, 0xfb, 0x51, 0xab, 0x59, 0x57, 0xb6, 0x2a, 0x8d, 0xbd, 0x63, 0x99,
+ 0xcc, 0x00, 0x41, 0x81, 0xfb, 0x15, 0x01, 0x8b, 0x6c, 0xae, 0xfe, 0xe6, 0x3f, 0x96, 0xe6, 0x7e,
+ 0x73, 0xb1, 0x14, 0xf9, 0xed, 0xc5, 0x52, 0xe4, 0x77, 0x17, 0x4b, 0x91, 0x7f, 0xbf, 0x58, 0x8a,
+ 0xfc, 0xe5, 0x17, 0x4b, 0x73, 0xbf, 0xfd, 0x62, 0x69, 0xee, 0x77, 0x5f, 0x2c, 0xcd, 0xfd, 0x28,
+ 0xc9, 0x7e, 0xf9, 0xff, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xda, 0x53, 0x16, 0x3d, 0x64, 0x40,
+ 0x00, 0x00,
}
diff --git a/pkg/sql/catalog/descpb/structured.proto b/pkg/sql/catalog/descpb/structured.proto
index fbc4b3f72083..f5bdb8d66e1b 100644
--- a/pkg/sql/catalog/descpb/structured.proto
+++ b/pkg/sql/catalog/descpb/structured.proto
@@ -119,7 +119,8 @@ message ColumnDescriptor {
option (gogoproto.equal) = true;
optional string name = 1 [(gogoproto.nullable) = false];
optional uint32 id = 2 [(gogoproto.nullable) = false,
- (gogoproto.customname) = "ID", (gogoproto.casttype) = "ColumnID"];
+ (gogoproto.customname) = "ID",
+ (gogoproto.casttype) = "ColumnID"];
optional sql.sem.types.T type = 3;
optional bool nullable = 4 [(gogoproto.nullable) = false];
reserved 8;
@@ -142,6 +143,11 @@ message ColumnDescriptor {
// have been serialized in a internal format. Instead, use one of the
// schemaexpr.FormatExpr* functions.
optional string compute_expr = 11;
+
+ // A computed column can be stored or virtual.
+ // Virtual can only be true if there is a compute expression.
+ optional bool virtual = 16 [(gogoproto.nullable) = false];
+
// PGAttributeNum must be accessed through the accessor, since it is set
// lazily, it is incorrect to access it directly.
// PGAttributeNum represents a column's number in catalog tables.
diff --git a/pkg/sql/catalog/schemaexpr/column.go b/pkg/sql/catalog/schemaexpr/column.go
index d812fa8dc80a..6d28967d2d36 100644
--- a/pkg/sql/catalog/schemaexpr/column.go
+++ b/pkg/sql/catalog/schemaexpr/column.go
@@ -107,7 +107,11 @@ func FormatColumnForDisplay(
return "", err
}
f.WriteString(compExpr)
- f.WriteString(") STORED")
+ if desc.Virtual {
+ f.WriteString(") VIRTUAL")
+ } else {
+ f.WriteString(") STORED")
+ }
}
return f.CloseAndGetString(), nil
}
diff --git a/pkg/sql/catalog/tabledesc/structured.go b/pkg/sql/catalog/tabledesc/structured.go
index 3ec41af58db9..ccfc7a4a1bcf 100644
--- a/pkg/sql/catalog/tabledesc/structured.go
+++ b/pkg/sql/catalog/tabledesc/structured.go
@@ -1316,6 +1316,10 @@ func (desc *Mutable) allocateColumnFamilyIDs(columnNames map[string]descpb.Colum
}
ensureColumnInFamily := func(col *descpb.ColumnDescriptor) {
+ if col.Virtual {
+ // Virtual columns don't need to be part of families.
+ return
+ }
if columnsInFamilies.Contains(col.ID) {
return
}
@@ -1944,7 +1948,7 @@ func (desc *Immutable) ValidateTable(ctx context.Context) error {
}
columnNames := make(map[string]descpb.ColumnID, len(desc.Columns))
- columnIDs := make(map[descpb.ColumnID]string, len(desc.Columns))
+ columnIDs := make(map[descpb.ColumnID]*descpb.ColumnDescriptor, len(desc.Columns))
if err := desc.validateColumns(columnNames, columnIDs); err != nil {
return err
}
@@ -1959,7 +1963,7 @@ func (desc *Immutable) ValidateTable(ctx context.Context) error {
"mutation in state %s, direction %s, col %q, id %v",
errors.Safe(m.State), errors.Safe(m.Direction), col.Name, errors.Safe(col.ID))
}
- columnIDs[col.ID] = col.Name
+ columnIDs[col.ID] = col
case *descpb.DescriptorMutation_Index:
if unSetEnums {
idx := desc.Index
@@ -2080,9 +2084,12 @@ func (desc *Immutable) ValidateTable(ctx context.Context) error {
}
func (desc *Immutable) validateColumns(
- columnNames map[string]descpb.ColumnID, columnIDs map[descpb.ColumnID]string,
+ columnNames map[string]descpb.ColumnID, columnIDs map[descpb.ColumnID]*descpb.ColumnDescriptor,
) error {
- for _, column := range desc.AllNonDropColumns() {
+ colDescs := desc.AllNonDropColumns()
+ for colIdx := range colDescs {
+ column := &colDescs[colIdx]
+
if err := catalog.ValidateName(column.Name, "column"); err != nil {
return err
}
@@ -2108,9 +2115,9 @@ func (desc *Immutable) validateColumns(
if other, ok := columnIDs[column.ID]; ok {
return fmt.Errorf("column %q duplicate ID of column %q: %d",
- column.Name, other, column.ID)
+ column.Name, other.ID, column.ID)
}
- columnIDs[column.ID] = column.Name
+ columnIDs[column.ID] = column
if column.ID >= desc.NextColumnID {
return errors.AssertionFailedf("column %q invalid ID (%d) >= next column ID (%d)",
@@ -2131,12 +2138,16 @@ func (desc *Immutable) validateColumns(
return fmt.Errorf("computed column %q refers to unknown columns in expression: %s",
column.Name, *column.ComputeExpr)
}
+ } else if column.Virtual {
+ return fmt.Errorf("virtual column %q is not computed", column.Name)
}
}
return nil
}
-func (desc *Immutable) validateColumnFamilies(columnIDs map[descpb.ColumnID]string) error {
+func (desc *Immutable) validateColumnFamilies(
+ columnIDs map[descpb.ColumnID]*descpb.ColumnDescriptor,
+) error {
if len(desc.Families) < 1 {
return fmt.Errorf("at least 1 column family must be specified")
}
@@ -2184,13 +2195,16 @@ func (desc *Immutable) validateColumnFamilies(columnIDs map[descpb.ColumnID]stri
}
for i, colID := range family.ColumnIDs {
- name, ok := columnIDs[colID]
+ col, ok := columnIDs[colID]
if !ok {
return fmt.Errorf("family %q contains unknown column \"%d\"", family.Name, colID)
}
- if name != family.ColumnNames[i] {
+ if col.Name != family.ColumnNames[i] {
return fmt.Errorf("family %q column %d should have name %q, but found name %q",
- family.Name, colID, name, family.ColumnNames[i])
+ family.Name, colID, col.Name, family.ColumnNames[i])
+ }
+ if col.Virtual {
+ return fmt.Errorf("virtual computed column %q cannot be part of a family", col.Name)
}
}
@@ -2201,9 +2215,11 @@ func (desc *Immutable) validateColumnFamilies(columnIDs map[descpb.ColumnID]stri
colIDToFamilyID[colID] = family.ID
}
}
- for colID := range columnIDs {
- if _, ok := colIDToFamilyID[colID]; !ok {
- return fmt.Errorf("column %d is not in any column family", colID)
+ for colID, colDesc := range columnIDs {
+ if !colDesc.Virtual {
+ if _, ok := colIDToFamilyID[colID]; !ok {
+ return fmt.Errorf("column %q is not in any column family", colDesc.Name)
+ }
}
}
return nil
@@ -2212,7 +2228,9 @@ func (desc *Immutable) validateColumnFamilies(columnIDs map[descpb.ColumnID]stri
// validateCheckConstraints validates that check constraints are well formed.
// Checks include validating the column IDs and verifying that check expressions
// do not reference non-existent columns.
-func (desc *Immutable) validateCheckConstraints(columnIDs map[descpb.ColumnID]string) error {
+func (desc *Immutable) validateCheckConstraints(
+ columnIDs map[descpb.ColumnID]*descpb.ColumnDescriptor,
+) error {
for _, chk := range desc.AllActiveAndInactiveChecks() {
// Verify that the check's column IDs are valid.
for _, colID := range chk.ColumnIDs {
@@ -2243,7 +2261,7 @@ func (desc *Immutable) validateCheckConstraints(columnIDs map[descpb.ColumnID]st
// constraints are well formed. Checks include validating the column IDs and
// column names.
func (desc *Immutable) validateUniqueWithoutIndexConstraints(
- columnIDs map[descpb.ColumnID]string,
+ columnIDs map[descpb.ColumnID]*descpb.ColumnDescriptor,
) error {
for _, c := range desc.AllActiveAndInactiveUniqueWithoutIndexConstraints() {
if err := catalog.ValidateName(c.Name, "unique without index constraint"); err != nil {
diff --git a/pkg/sql/catalog/tabledesc/table.go b/pkg/sql/catalog/tabledesc/table.go
index 97e0ae63c2d7..a2e024a31508 100644
--- a/pkg/sql/catalog/tabledesc/table.go
+++ b/pkg/sql/catalog/tabledesc/table.go
@@ -68,6 +68,7 @@ func MakeColumnDefDescs(
col := &descpb.ColumnDescriptor{
Name: string(d.Name),
Nullable: d.Nullable.Nullability != tree.NotNull && !d.PrimaryKey.IsPrimaryKey,
+ Virtual: d.IsVirtual(),
}
// Validate and assign column type.
diff --git a/pkg/sql/catalog/tabledesc/validate_test.go b/pkg/sql/catalog/tabledesc/validate_test.go
index 019ebca85f35..27312c2c4b53 100644
--- a/pkg/sql/catalog/tabledesc/validate_test.go
+++ b/pkg/sql/catalog/tabledesc/validate_test.go
@@ -169,6 +169,7 @@ var validationMap = []struct {
status: todoIAmKnowinglyAddingTechDebt,
reason: "initial import: TODO(features): add validation"},
"ComputeExpr": {status: iSolemnlySwearThisFieldIsValidated},
+ "Virtual": {status: iSolemnlySwearThisFieldIsValidated},
"PGAttributeNum": {
status: todoIAmKnowinglyAddingTechDebt,
reason: "initial import: TODO(features): add validation"},
diff --git a/pkg/sql/create_table.go b/pkg/sql/create_table.go
index 0316d59548da..138ecc2ecd57 100644
--- a/pkg/sql/create_table.go
+++ b/pkg/sql/create_table.go
@@ -1405,7 +1405,17 @@ func NewTableDesc(
columnDefaultExprs = append(columnDefaultExprs, nil)
}
if d.IsVirtual() {
- return nil, unimplemented.NewWithIssue(57608, "virtual computed columns")
+ if !sessionData.VirtualColumnsEnabled {
+ return nil, unimplemented.NewWithIssue(57608, "virtual computed columns")
+ }
+ if !evalCtx.Settings.Version.IsActive(ctx, clusterversion.VirtualComputedColumns) {
+ return nil, pgerror.Newf(pgcode.FeatureNotSupported,
+ "version %v must be finalized to use virtual columns",
+ clusterversion.VirtualComputedColumns)
+ }
+ if d.HasColumnFamily() {
+ return nil, pgerror.Newf(pgcode.Syntax, "virtual columns cannot have family specifications")
+ }
}
col, idx, expr, err := tabledesc.MakeColumnDefDescs(ctx, d, semaCtx, evalCtx)
@@ -2285,7 +2295,11 @@ func incTelemetryForNewColumn(def *tree.ColumnTableDef, desc *descpb.ColumnDescr
telemetry.Inc(sqltelemetry.SchemaNewTypeCounter(desc.Type.TelemetryName()))
}
if desc.IsComputed() {
- telemetry.Inc(sqltelemetry.SchemaNewColumnTypeQualificationCounter("computed"))
+ if desc.Virtual {
+ telemetry.Inc(sqltelemetry.SchemaNewColumnTypeQualificationCounter("virtual"))
+ } else {
+ telemetry.Inc(sqltelemetry.SchemaNewColumnTypeQualificationCounter("computed"))
+ }
}
if desc.HasDefault() {
telemetry.Inc(sqltelemetry.SchemaNewColumnTypeQualificationCounter("default_expr"))
diff --git a/pkg/sql/exec_util.go b/pkg/sql/exec_util.go
index 394c668803c5..bc9d7173a632 100644
--- a/pkg/sql/exec_util.go
+++ b/pkg/sql/exec_util.go
@@ -2188,6 +2188,11 @@ func (m *sessionDataMutator) SetMutliColumnInvertedIndexes(val bool) {
m.data.EnableMultiColumnInvertedIndexes = val
}
+// TODO(radu): remove this once the feature is stable.
+func (m *sessionDataMutator) SetVirtualColumnsEnabled(val bool) {
+ m.data.VirtualColumnsEnabled = val
+}
+
// TODO(rytaft): remove this once unique without index constraints are fully
// supported.
func (m *sessionDataMutator) SetUniqueWithoutIndexConstraints(val bool) {
diff --git a/pkg/sql/logictest/testdata/logic_test/pg_catalog b/pkg/sql/logictest/testdata/logic_test/pg_catalog
index 05f9aac93826..4be8323341f1 100644
--- a/pkg/sql/logictest/testdata/logic_test/pg_catalog
+++ b/pkg/sql/logictest/testdata/logic_test/pg_catalog
@@ -1850,6 +1850,7 @@ experimental_enable_hash_sharded_indexes off NULL
experimental_enable_multi_column_inverted_indexes off NULL NULL NULL string
experimental_enable_temp_tables off NULL NULL NULL string
experimental_enable_unique_without_index_constraints off NULL NULL NULL string
+experimental_enable_virtual_columns off NULL NULL NULL string
extra_float_digits 0 NULL NULL NULL string
force_savepoint_restart off NULL NULL NULL string
foreign_key_cascades_limit 10000 NULL NULL NULL string
@@ -1923,6 +1924,7 @@ experimental_enable_hash_sharded_indexes off NULL
experimental_enable_multi_column_inverted_indexes off NULL user NULL off off
experimental_enable_temp_tables off NULL user NULL off off
experimental_enable_unique_without_index_constraints off NULL user NULL off off
+experimental_enable_virtual_columns off NULL user NULL off off
extra_float_digits 0 NULL user NULL 0 2
force_savepoint_restart off NULL user NULL off off
foreign_key_cascades_limit 10000 NULL user NULL 10000 10000
@@ -1992,6 +1994,7 @@ experimental_enable_hash_sharded_indexes NULL NULL NULL
experimental_enable_multi_column_inverted_indexes NULL NULL NULL NULL NULL
experimental_enable_temp_tables NULL NULL NULL NULL NULL
experimental_enable_unique_without_index_constraints NULL NULL NULL NULL NULL
+experimental_enable_virtual_columns NULL NULL NULL NULL NULL
extra_float_digits NULL NULL NULL NULL NULL
force_savepoint_restart NULL NULL NULL NULL NULL
foreign_key_cascades_limit NULL NULL NULL NULL NULL
diff --git a/pkg/sql/logictest/testdata/logic_test/show_source b/pkg/sql/logictest/testdata/logic_test/show_source
index ad7448b88322..ae81a9c79328 100644
--- a/pkg/sql/logictest/testdata/logic_test/show_source
+++ b/pkg/sql/logictest/testdata/logic_test/show_source
@@ -50,6 +50,7 @@ experimental_enable_hash_sharded_indexes off
experimental_enable_multi_column_inverted_indexes off
experimental_enable_temp_tables off
experimental_enable_unique_without_index_constraints off
+experimental_enable_virtual_columns off
extra_float_digits 0
force_savepoint_restart off
foreign_key_cascades_limit 10000
diff --git a/pkg/sql/logictest/testdata/logic_test/virtual_columns b/pkg/sql/logictest/testdata/logic_test/virtual_columns
new file mode 100644
index 000000000000..a6e000ca5213
--- /dev/null
+++ b/pkg/sql/logictest/testdata/logic_test/virtual_columns
@@ -0,0 +1,45 @@
+statement ok
+SET experimental_enable_virtual_columns = true
+
+# Test that we don't allow FAMILY constraints with virtual columns.
+statement error virtual computed column "v" cannot be part of a family
+CREATE TABLE t (
+ a INT PRIMARY KEY,
+ b INT,
+ v INT AS (a+b) VIRTUAL,
+ FAMILY (a, b, v)
+)
+
+statement error virtual computed column "v" cannot be part of a family
+CREATE TABLE t (
+ a INT PRIMARY KEY,
+ b INT,
+ v INT AS (a+b) VIRTUAL,
+ FAMILY (a),
+ FAMILY (b),
+ FAMILY (v)
+)
+
+statement ok
+CREATE TABLE t (
+ a INT PRIMARY KEY,
+ b INT,
+ v INT AS (a+b) VIRTUAL,
+ FAMILY (a,b)
+)
+
+statement ok
+INSERT INTO t VALUES (1, 1)
+
+statement ok
+INSERT INTO t(a,b) VALUES (2, 2)
+
+statement error cannot write directly to computed column
+INSERT INTO t(a,b,v) VALUES (2, 2, 0)
+
+query III colnames,rowsort
+SELECT * FROM t
+----
+a b v
+1 1 2
+2 2 4
diff --git a/pkg/sql/opt/cat/column.go b/pkg/sql/opt/cat/column.go
index a28d68b04765..0c85517e7857 100644
--- a/pkg/sql/opt/cat/column.go
+++ b/pkg/sql/opt/cat/column.go
@@ -49,11 +49,11 @@ func (c *Column) Ordinal() int {
// dropped and then re-added with the same name; the new column will have a
// different ID. See the comment for StableID for more detail.
//
-// Virtual columns don't have stable IDs; for these columns ColID() must not be
-// called.
+// Virtual inverted columns don't have stable IDs; for these columns ColID()
+// must not be called.
func (c *Column) ColID() StableID {
- if c.kind.IsVirtual() {
- panic(errors.AssertionFailedf("virtual columns have no StableID"))
+ if c.kind == VirtualInverted {
+ panic(errors.AssertionFailedf("virtual inverted columns have no StableID"))
}
return c.stableID
}
diff --git a/pkg/sql/opt/exec/execbuilder/testdata/virtual_columns b/pkg/sql/opt/exec/execbuilder/testdata/virtual_columns
new file mode 100644
index 000000000000..18d465b9547d
--- /dev/null
+++ b/pkg/sql/opt/exec/execbuilder/testdata/virtual_columns
@@ -0,0 +1,66 @@
+# LogicTest: local
+
+statement ok
+SET experimental_enable_virtual_columns = true
+
+statement ok
+CREATE TABLE t (
+ a INT PRIMARY KEY,
+ b INT,
+ v INT AS (a+b) VIRTUAL,
+ FAMILY (a),
+ FAMILY (b)
+)
+
+query TT
+SHOW CREATE TABLE t
+----
+t CREATE TABLE public.t (
+ a INT8 NOT NULL,
+ b INT8 NULL,
+ v INT8 NULL AS (a + b) VIRTUAL,
+ CONSTRAINT "primary" PRIMARY KEY (a ASC),
+ FAMILY fam_0_a (a),
+ FAMILY fam_1_b (b)
+)
+
+# Verify that the primary index doesn't contain the virtual column.
+query T
+EXPLAIN (OPT, CATALOG) SELECT * from t
+----
+TABLE t
+ ├── a int not null
+ ├── b int
+ ├── v int as (a + b) virtual
+ ├── crdb_internal_mvcc_timestamp decimal [hidden] [system]
+ ├── tableoid oid [hidden] [system]
+ ├── FAMILY fam_0_a (a)
+ ├── FAMILY fam_1_b (b)
+ └── INDEX primary
+ └── a int not null
+project
+ ├── scan t
+ │ └── computed column expressions
+ │ └── v
+ │ └── a + b
+ └── projections
+ └── a + b
+
+query T
+EXPLAIN (VERBOSE) SELECT * FROM t
+----
+distribution: local
+vectorized: true
+·
+• render
+│ columns: (a, b, v)
+│ estimated row count: 1,000 (missing stats)
+│ render 0: a + b
+│ render 1: a
+│ render 2: b
+│
+└── • scan
+ columns: (a, b)
+ estimated row count: 1,000 (missing stats)
+ table: t@primary
+ spans: FULL SCAN
diff --git a/pkg/sql/opt_catalog.go b/pkg/sql/opt_catalog.go
index 5dded4238d6e..e94775ea3a56 100644
--- a/pkg/sql/opt_catalog.go
+++ b/pkg/sql/opt_catalog.go
@@ -639,30 +639,44 @@ func newOptTable(
ot.columns = make([]cat.Column, len(colDescs), numCols)
numOrdinary := len(ot.desc.Columns)
numWritable := len(ot.desc.WritableColumns())
- for i := range colDescs {
- desc := colDescs[i]
+ for ordinal := range colDescs {
+ desc := colDescs[ordinal]
var kind cat.ColumnKind
switch {
- case i < numOrdinary:
+ case ordinal < numOrdinary:
kind = cat.Ordinary
- case i < numWritable:
+ case ordinal < numWritable:
kind = cat.WriteOnly
default:
kind = cat.DeleteOnly
}
-
- ot.columns[i].InitNonVirtual(
- i,
- cat.StableID(desc.ID),
- tree.Name(desc.Name),
- kind,
- desc.Type,
- desc.Nullable,
- desc.Hidden,
- desc.DefaultExpr,
- desc.ComputeExpr,
- )
+ if !desc.Virtual {
+ ot.columns[ordinal].InitNonVirtual(
+ ordinal,
+ cat.StableID(desc.ID),
+ tree.Name(desc.Name),
+ kind,
+ desc.Type,
+ desc.Nullable,
+ desc.Hidden,
+ desc.DefaultExpr,
+ desc.ComputeExpr,
+ )
+ } else {
+ if kind != cat.Ordinary {
+ return nil, errors.AssertionFailedf("virtual mutation column")
+ }
+ ot.columns[ordinal].InitVirtualComputed(
+ ordinal,
+ cat.StableID(desc.ID),
+ tree.Name(desc.Name),
+ desc.Type,
+ desc.Nullable,
+ desc.Hidden,
+ *desc.ComputeExpr,
+ )
+ }
}
newColumn := func() (col *cat.Column, ordinal int) {
@@ -1123,12 +1137,13 @@ func (oi *optIndex) init(
pkCols.Add(int(desc.ColumnIDs[i]))
}
for i, n := 0, tab.ColumnCount(); i < n; i++ {
- id := tab.Column(i).ColID()
- if !pkCols.Contains(int(id)) {
- oi.storedCols = append(oi.storedCols, descpb.ColumnID(id))
+ if col := tab.Column(i); !col.Kind().IsVirtual() {
+ if id := col.ColID(); !pkCols.Contains(int(id)) {
+ oi.storedCols = append(oi.storedCols, descpb.ColumnID(id))
+ }
}
}
- oi.numCols = tab.ColumnCount()
+ oi.numCols = len(desc.ColumnIDs) + len(oi.storedCols)
} else {
oi.storedCols = desc.StoreColumnIDs
oi.numCols = len(desc.ColumnIDs) + len(desc.ExtraColumnIDs) + len(desc.StoreColumnIDs)
diff --git a/pkg/sql/rowenc/testutils.go b/pkg/sql/rowenc/testutils.go
index 9a5e651b640e..a97f2710589f 100644
--- a/pkg/sql/rowenc/testutils.go
+++ b/pkg/sql/rowenc/testutils.go
@@ -1263,7 +1263,9 @@ func ColumnFamilyMutator(rng *rand.Rand, stmt tree.Statement) (changed bool) {
if def.HasColumnFamily() {
return false
}
- columns = append(columns, def.Name)
+ if !def.Computed.Virtual {
+ columns = append(columns, def.Name)
+ }
}
}
diff --git a/pkg/sql/sessiondata/session_data.go b/pkg/sql/sessiondata/session_data.go
index 4a12e36807e7..900d0790c645 100644
--- a/pkg/sql/sessiondata/session_data.go
+++ b/pkg/sql/sessiondata/session_data.go
@@ -219,6 +219,12 @@ type LocalOnlySessionData struct {
// TODO(mgartner): remove this once multi-column inverted indexes are fully
// supported.
EnableMultiColumnInvertedIndexes bool
+
+ // VirtualColumnsEnabled indicates whether we allow virtual (non-stored)
+ // computed columns.
+ // TODO(radu): remove this once the feature is stable.
+ VirtualColumnsEnabled bool
+
// EnableUniqueWithoutIndexConstraints indicates whether creating unique
// constraints without an index is allowed.
// TODO(rytaft): remove this once unique without index constraints are fully
diff --git a/pkg/sql/vars.go b/pkg/sql/vars.go
index c1aef5c766e4..4b19876a108f 100644
--- a/pkg/sql/vars.go
+++ b/pkg/sql/vars.go
@@ -1148,6 +1148,22 @@ var varGen = map[string]sessionVar{
},
// CockroachDB extension.
+ `experimental_enable_virtual_columns`: {
+ GetStringVal: makePostgresBoolGetStringValFn(`experimental_enable_virtual_columns`),
+ Set: func(_ context.Context, m *sessionDataMutator, s string) error {
+ b, err := paramparse.ParseBoolVar(`experimental_enable_virtual_columns`, s)
+ if err != nil {
+ return err
+ }
+ m.SetVirtualColumnsEnabled(b)
+ return nil
+ },
+ Get: func(evalCtx *extendedEvalContext) string {
+ return formatBoolAsPostgresSetting(evalCtx.SessionData.VirtualColumnsEnabled)
+ },
+ GlobalDefault: globalFalse,
+ },
+
// TODO(rytaft): remove this once unique without index constraints are fully
// supported.
`experimental_enable_unique_without_index_constraints`: {