diff --git a/api/types/database.go b/api/types/database.go index 39b94b4b96a6f..2beb2dc500811 100644 --- a/api/types/database.go +++ b/api/types/database.go @@ -60,6 +60,13 @@ type Database interface { GetTLS() DatabaseTLS // SetStatusCA sets the database CA certificate in the status field. SetStatusCA(string) + // GetMySQL returns the database options from spec. + GetMySQL() MySQLOptions + // GetMySQLServerVersion returns the MySQL server version either from configuration or + // reported by the database. + GetMySQLServerVersion() string + // SetMySQLServerVersion sets the runtime MySQL server version. + SetMySQLServerVersion(version string) // GetAWS returns the database AWS metadata. GetAWS() AWS // SetStatusAWS sets the database AWS metadata in the status field. @@ -250,6 +257,26 @@ func (d *DatabaseV3) SetStatusCA(ca string) { d.Status.CACert = ca } +// GetMySQL returns the MySQL options from spec. +func (d *DatabaseV3) GetMySQL() MySQLOptions { + return d.Spec.MySQL +} + +// GetMySQLServerVersion returns the MySQL server version reported by the database or the value from configuration +// if the first one is not available. +func (d *DatabaseV3) GetMySQLServerVersion() string { + if d.Status.MySQL.ServerVersion != "" { + return d.Status.MySQL.ServerVersion + } + + return d.Spec.MySQL.ServerVersion +} + +// SetMySQLServerVersion sets the runtime MySQL server version. +func (d *DatabaseV3) SetMySQLServerVersion(version string) { + d.Status.MySQL.ServerVersion = version +} + // IsEmpty returns true if AWS metadata is empty. func (a AWS) IsEmpty() bool { return cmp.Equal(a, AWS{}) @@ -375,6 +402,9 @@ func (d *DatabaseV3) CheckAndSetDefaults() error { if d.Spec.URI == "" { return trace.BadParameter("database %q URI is empty", d.GetName()) } + if d.Spec.MySQL.ServerVersion != "" && d.Spec.Protocol != "mysql" { + return trace.BadParameter("MySQL ServerVersion can be only set for MySQL database") + } // In case of RDS, Aurora or Redshift, AWS information such as region or // cluster ID can be extracted from the endpoint if not provided. switch { diff --git a/api/types/database_test.go b/api/types/database_test.go index 0166a51959f19..86f20b6bf9dfe 100644 --- a/api/types/database_test.go +++ b/api/types/database_test.go @@ -76,3 +76,52 @@ func TestDatabaseStatus(t *testing.T) { database.SetStatusAWS(awsMeta) require.Equal(t, awsMeta, database.GetAWS()) } + +func TestMySQLVersionValidation(t *testing.T) { + t.Parallel() + + t.Run("correct config", func(t *testing.T) { + database, err := NewDatabaseV3(Metadata{ + Name: "test", + }, DatabaseSpecV3{ + Protocol: "mysql", + URI: "localhost:5432", + MySQL: MySQLOptions{ + ServerVersion: "8.0.18", + }, + }) + require.NoError(t, err) + require.Equal(t, "8.0.18", database.GetMySQLServerVersion()) + }) + + t.Run("incorrect config - wrong protocol", func(t *testing.T) { + _, err := NewDatabaseV3(Metadata{ + Name: "test", + }, DatabaseSpecV3{ + Protocol: "Postgres", + URI: "localhost:5432", + MySQL: MySQLOptions{ + ServerVersion: "8.0.18", + }, + }) + require.Error(t, err) + require.Contains(t, err.Error(), "ServerVersion") + }) +} + +func TestMySQLServerVersion(t *testing.T) { + t.Parallel() + + database, err := NewDatabaseV3(Metadata{ + Name: "test", + }, DatabaseSpecV3{ + Protocol: "mysql", + URI: "localhost:5432", + }) + require.NoError(t, err) + + require.Equal(t, "", database.GetMySQLServerVersion()) + + database.SetMySQLServerVersion("8.0.1") + require.Equal(t, "8.0.1", database.GetMySQLServerVersion()) +} diff --git a/api/types/events/api.go b/api/types/events/api.go index 74deda03d6466..26c8990ffe3ce 100644 --- a/api/types/events/api.go +++ b/api/types/events/api.go @@ -49,7 +49,7 @@ type AuditEvent interface { // GetType returns event type GetType() string - // SetCode sets unique type + // SetType sets unique type SetType(string) // GetTime returns event time @@ -73,7 +73,7 @@ type AuditEvent interface { // Emitter creates and manages audit log streams type Emitter interface { - // Emit emits a single audit event + // EmitAuditEvent emits a single audit event. EmitAuditEvent(context.Context, AuditEvent) error } diff --git a/api/types/role.go b/api/types/role.go index 2f4d0ad9af991..51a9c0561fc3c 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -61,7 +61,7 @@ type Role interface { // GetNamespaces gets a list of namespaces this role is allowed or denied access to. GetNamespaces(RoleConditionType) []string - // GetNamespaces sets a list of namespaces this role is allowed or denied access to. + // SetNamespaces sets a list of namespaces this role is allowed or denied access to. SetNamespaces(RoleConditionType, []string) // GetNodeLabels gets the map of node labels this role is allowed or denied access to. @@ -118,7 +118,7 @@ type Role interface { // GetDatabaseNames gets a list of database names this role is allowed or denied access to. GetDatabaseNames(RoleConditionType) []string - // SetDatabasenames sets a list of database names this role is allowed or denied access to. + // SetDatabaseNames sets a list of database names this role is allowed or denied access to. SetDatabaseNames(RoleConditionType, []string) // GetDatabaseUsers gets a list of database users this role is allowed or denied access to. diff --git a/api/types/types.pb.go b/api/types/types.pb.go index e0af9614f519f..2e3e586feb893 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -379,7 +379,7 @@ func (x CertAuthoritySpecV2_SigningAlgType) String() string { } func (CertAuthoritySpecV2_SigningAlgType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{34, 0} + return fileDescriptor_d938547f84707355, []int{35, 0} } type KeepAlive struct { @@ -883,10 +883,12 @@ type DatabaseSpecV3 struct { // Allows to provide custom CA cert or override server name. TLS DatabaseTLS `protobuf:"bytes,8,opt,name=TLS,proto3" json:"tls,omitempty"` // AD is the Active Directory configuration for the database. - AD AD `protobuf:"bytes,9,opt,name=AD,proto3" json:"ad,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AD AD `protobuf:"bytes,9,opt,name=AD,proto3" json:"ad,omitempty"` + // MySQL is an additional section with MySQL database options. + MySQL MySQLOptions `protobuf:"bytes,10,opt,name=MySQL,proto3" json:"mysql,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *DatabaseSpecV3) Reset() { *m = DatabaseSpecV3{} } @@ -927,10 +929,12 @@ type DatabaseStatusV3 struct { // CACert is the auto-downloaded cloud database CA certificate. CACert string `protobuf:"bytes,1,opt,name=CACert,proto3" json:"ca_cert,omitempty"` // AWS is the auto-discovered AWS cloud database metadata. - AWS AWS `protobuf:"bytes,2,opt,name=AWS,proto3" json:"aws"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AWS AWS `protobuf:"bytes,2,opt,name=AWS,proto3" json:"aws"` + // MySQL is an additional section with MySQL runtime database information. + MySQL MySQLOptions `protobuf:"bytes,3,opt,name=MySQL,proto3" json:"mysql,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *DatabaseStatusV3) Reset() { *m = DatabaseStatusV3{} } @@ -1286,6 +1290,49 @@ func (m *DatabaseTLS) XXX_DiscardUnknown() { var xxx_messageInfo_DatabaseTLS proto.InternalMessageInfo +// MySQLOptions are additional MySQL database options. +type MySQLOptions struct { + // ServerVersion is the server version reported by DB proxy if the runtime information is + // not available. + ServerVersion string `protobuf:"bytes,1,opt,name=ServerVersion,proto3" json:"server_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MySQLOptions) Reset() { *m = MySQLOptions{} } +func (m *MySQLOptions) String() string { return proto.CompactTextString(m) } +func (*MySQLOptions) ProtoMessage() {} +func (*MySQLOptions) Descriptor() ([]byte, []int) { + return fileDescriptor_d938547f84707355, []int{18} +} +func (m *MySQLOptions) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MySQLOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MySQLOptions.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MySQLOptions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MySQLOptions.Merge(m, src) +} +func (m *MySQLOptions) XXX_Size() int { + return m.Size() +} +func (m *MySQLOptions) XXX_DiscardUnknown() { + xxx_messageInfo_MySQLOptions.DiscardUnknown(m) +} + +var xxx_messageInfo_MySQLOptions proto.InternalMessageInfo + // ServerV2 represents a Node, App, Database, Proxy or Auth server in a Teleport cluster. type ServerV2 struct { // Kind is a resource kind @@ -1306,7 +1353,7 @@ type ServerV2 struct { func (m *ServerV2) Reset() { *m = ServerV2{} } func (*ServerV2) ProtoMessage() {} func (*ServerV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{18} + return fileDescriptor_d938547f84707355, []int{19} } func (m *ServerV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1349,7 +1396,7 @@ func (m *ServerV2List) Reset() { *m = ServerV2List{} } func (m *ServerV2List) String() string { return proto.CompactTextString(m) } func (*ServerV2List) ProtoMessage() {} func (*ServerV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{19} + return fileDescriptor_d938547f84707355, []int{20} } func (m *ServerV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1415,7 +1462,7 @@ func (m *ServerSpecV2) Reset() { *m = ServerSpecV2{} } func (m *ServerSpecV2) String() string { return proto.CompactTextString(m) } func (*ServerSpecV2) ProtoMessage() {} func (*ServerSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{20} + return fileDescriptor_d938547f84707355, []int{21} } func (m *ServerSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1464,7 +1511,7 @@ type AppServerV3 struct { func (m *AppServerV3) Reset() { *m = AppServerV3{} } func (*AppServerV3) ProtoMessage() {} func (*AppServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{21} + return fileDescriptor_d938547f84707355, []int{22} } func (m *AppServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1514,7 +1561,7 @@ func (m *AppServerSpecV3) Reset() { *m = AppServerSpecV3{} } func (m *AppServerSpecV3) String() string { return proto.CompactTextString(m) } func (*AppServerSpecV3) ProtoMessage() {} func (*AppServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{22} + return fileDescriptor_d938547f84707355, []int{23} } func (m *AppServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1556,7 +1603,7 @@ func (m *AppV3List) Reset() { *m = AppV3List{} } func (m *AppV3List) String() string { return proto.CompactTextString(m) } func (*AppV3List) ProtoMessage() {} func (*AppV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{23} + return fileDescriptor_d938547f84707355, []int{24} } func (m *AppV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1605,7 +1652,7 @@ type AppV3 struct { func (m *AppV3) Reset() { *m = AppV3{} } func (*AppV3) ProtoMessage() {} func (*AppV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{24} + return fileDescriptor_d938547f84707355, []int{25} } func (m *AppV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1655,7 +1702,7 @@ func (m *AppSpecV3) Reset() { *m = AppSpecV3{} } func (m *AppSpecV3) String() string { return proto.CompactTextString(m) } func (*AppSpecV3) ProtoMessage() {} func (*AppSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{25} + return fileDescriptor_d938547f84707355, []int{26} } func (m *AppSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1715,7 +1762,7 @@ func (m *App) Reset() { *m = App{} } func (m *App) String() string { return proto.CompactTextString(m) } func (*App) ProtoMessage() {} func (*App) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{26} + return fileDescriptor_d938547f84707355, []int{27} } func (m *App) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1761,7 +1808,7 @@ func (m *Rewrite) Reset() { *m = Rewrite{} } func (m *Rewrite) String() string { return proto.CompactTextString(m) } func (*Rewrite) ProtoMessage() {} func (*Rewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{27} + return fileDescriptor_d938547f84707355, []int{28} } func (m *Rewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1805,7 +1852,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{28} + return fileDescriptor_d938547f84707355, []int{29} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1852,7 +1899,7 @@ func (m *CommandLabelV2) Reset() { *m = CommandLabelV2{} } func (m *CommandLabelV2) String() string { return proto.CompactTextString(m) } func (*CommandLabelV2) ProtoMessage() {} func (*CommandLabelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{29} + return fileDescriptor_d938547f84707355, []int{30} } func (m *CommandLabelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1898,7 +1945,7 @@ func (m *SSHKeyPair) Reset() { *m = SSHKeyPair{} } func (m *SSHKeyPair) String() string { return proto.CompactTextString(m) } func (*SSHKeyPair) ProtoMessage() {} func (*SSHKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{30} + return fileDescriptor_d938547f84707355, []int{31} } func (m *SSHKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1944,7 +1991,7 @@ func (m *TLSKeyPair) Reset() { *m = TLSKeyPair{} } func (m *TLSKeyPair) String() string { return proto.CompactTextString(m) } func (*TLSKeyPair) ProtoMessage() {} func (*TLSKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{31} + return fileDescriptor_d938547f84707355, []int{32} } func (m *TLSKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1990,7 +2037,7 @@ func (m *JWTKeyPair) Reset() { *m = JWTKeyPair{} } func (m *JWTKeyPair) String() string { return proto.CompactTextString(m) } func (*JWTKeyPair) ProtoMessage() {} func (*JWTKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{32} + return fileDescriptor_d938547f84707355, []int{33} } func (m *JWTKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2039,7 +2086,7 @@ type CertAuthorityV2 struct { func (m *CertAuthorityV2) Reset() { *m = CertAuthorityV2{} } func (*CertAuthorityV2) ProtoMessage() {} func (*CertAuthorityV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{33} + return fileDescriptor_d938547f84707355, []int{34} } func (m *CertAuthorityV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2119,7 +2166,7 @@ func (m *CertAuthoritySpecV2) Reset() { *m = CertAuthoritySpecV2{} } func (m *CertAuthoritySpecV2) String() string { return proto.CompactTextString(m) } func (*CertAuthoritySpecV2) ProtoMessage() {} func (*CertAuthoritySpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{34} + return fileDescriptor_d938547f84707355, []int{35} } func (m *CertAuthoritySpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2165,7 +2212,7 @@ func (m *CAKeySet) Reset() { *m = CAKeySet{} } func (m *CAKeySet) String() string { return proto.CompactTextString(m) } func (*CAKeySet) ProtoMessage() {} func (*CAKeySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{35} + return fileDescriptor_d938547f84707355, []int{36} } func (m *CAKeySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2210,7 +2257,7 @@ func (m *RoleMapping) Reset() { *m = RoleMapping{} } func (m *RoleMapping) String() string { return proto.CompactTextString(m) } func (*RoleMapping) ProtoMessage() {} func (*RoleMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{36} + return fileDescriptor_d938547f84707355, []int{37} } func (m *RoleMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2258,7 +2305,7 @@ type ProvisionTokenV1 struct { func (m *ProvisionTokenV1) Reset() { *m = ProvisionTokenV1{} } func (*ProvisionTokenV1) ProtoMessage() {} func (*ProvisionTokenV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{37} + return fileDescriptor_d938547f84707355, []int{38} } func (m *ProvisionTokenV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2307,7 +2354,7 @@ type ProvisionTokenV2 struct { func (m *ProvisionTokenV2) Reset() { *m = ProvisionTokenV2{} } func (*ProvisionTokenV2) ProtoMessage() {} func (*ProvisionTokenV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{38} + return fileDescriptor_d938547f84707355, []int{39} } func (m *ProvisionTokenV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2349,7 +2396,7 @@ func (m *ProvisionTokenV2List) Reset() { *m = ProvisionTokenV2List{} } func (m *ProvisionTokenV2List) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenV2List) ProtoMessage() {} func (*ProvisionTokenV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{39} + return fileDescriptor_d938547f84707355, []int{40} } func (m *ProvisionTokenV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2401,7 +2448,7 @@ func (m *TokenRule) Reset() { *m = TokenRule{} } func (m *TokenRule) String() string { return proto.CompactTextString(m) } func (*TokenRule) ProtoMessage() {} func (*TokenRule) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{40} + return fileDescriptor_d938547f84707355, []int{41} } func (m *TokenRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2456,7 +2503,7 @@ func (m *ProvisionTokenSpecV2) Reset() { *m = ProvisionTokenSpecV2{} } func (m *ProvisionTokenSpecV2) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2) ProtoMessage() {} func (*ProvisionTokenSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{41} + return fileDescriptor_d938547f84707355, []int{42} } func (m *ProvisionTokenSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2505,7 +2552,7 @@ type StaticTokensV2 struct { func (m *StaticTokensV2) Reset() { *m = StaticTokensV2{} } func (*StaticTokensV2) ProtoMessage() {} func (*StaticTokensV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{42} + return fileDescriptor_d938547f84707355, []int{43} } func (m *StaticTokensV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2548,7 +2595,7 @@ func (m *StaticTokensSpecV2) Reset() { *m = StaticTokensSpecV2{} } func (m *StaticTokensSpecV2) String() string { return proto.CompactTextString(m) } func (*StaticTokensSpecV2) ProtoMessage() {} func (*StaticTokensSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{43} + return fileDescriptor_d938547f84707355, []int{44} } func (m *StaticTokensSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2597,7 +2644,7 @@ type ClusterNameV2 struct { func (m *ClusterNameV2) Reset() { *m = ClusterNameV2{} } func (*ClusterNameV2) ProtoMessage() {} func (*ClusterNameV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{44} + return fileDescriptor_d938547f84707355, []int{45} } func (m *ClusterNameV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2643,7 +2690,7 @@ func (m *ClusterNameSpecV2) Reset() { *m = ClusterNameSpecV2{} } func (m *ClusterNameSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNameSpecV2) ProtoMessage() {} func (*ClusterNameSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{45} + return fileDescriptor_d938547f84707355, []int{46} } func (m *ClusterNameSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2693,7 +2740,7 @@ func (m *ClusterAuditConfigV2) Reset() { *m = ClusterAuditConfigV2{} } func (m *ClusterAuditConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigV2) ProtoMessage() {} func (*ClusterAuditConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{46} + return fileDescriptor_d938547f84707355, []int{47} } func (m *ClusterAuditConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2761,7 +2808,7 @@ func (m *ClusterAuditConfigSpecV2) Reset() { *m = ClusterAuditConfigSpec func (m *ClusterAuditConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigSpecV2) ProtoMessage() {} func (*ClusterAuditConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{47} + return fileDescriptor_d938547f84707355, []int{48} } func (m *ClusterAuditConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2811,7 +2858,7 @@ func (m *ClusterNetworkingConfigV2) Reset() { *m = ClusterNetworkingConf func (m *ClusterNetworkingConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigV2) ProtoMessage() {} func (*ClusterNetworkingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{48} + return fileDescriptor_d938547f84707355, []int{49} } func (m *ClusterNetworkingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2874,7 +2921,7 @@ func (m *ClusterNetworkingConfigSpecV2) Reset() { *m = ClusterNetworking func (m *ClusterNetworkingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigSpecV2) ProtoMessage() {} func (*ClusterNetworkingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{49} + return fileDescriptor_d938547f84707355, []int{50} } func (m *ClusterNetworkingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2924,7 +2971,7 @@ func (m *SessionRecordingConfigV2) Reset() { *m = SessionRecordingConfig func (m *SessionRecordingConfigV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigV2) ProtoMessage() {} func (*SessionRecordingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{50} + return fileDescriptor_d938547f84707355, []int{51} } func (m *SessionRecordingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2970,7 +3017,7 @@ func (m *SessionRecordingConfigSpecV2) Reset() { *m = SessionRecordingCo func (m *SessionRecordingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigSpecV2) ProtoMessage() {} func (*SessionRecordingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{51} + return fileDescriptor_d938547f84707355, []int{52} } func (m *SessionRecordingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3019,7 +3066,7 @@ type AuthPreferenceV2 struct { func (m *AuthPreferenceV2) Reset() { *m = AuthPreferenceV2{} } func (*AuthPreferenceV2) ProtoMessage() {} func (*AuthPreferenceV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{52} + return fileDescriptor_d938547f84707355, []int{53} } func (m *AuthPreferenceV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3081,7 +3128,7 @@ func (m *AuthPreferenceSpecV2) Reset() { *m = AuthPreferenceSpecV2{} } func (m *AuthPreferenceSpecV2) String() string { return proto.CompactTextString(m) } func (*AuthPreferenceSpecV2) ProtoMessage() {} func (*AuthPreferenceSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{53} + return fileDescriptor_d938547f84707355, []int{54} } func (m *AuthPreferenceSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3128,7 +3175,7 @@ func (m *U2F) Reset() { *m = U2F{} } func (m *U2F) String() string { return proto.CompactTextString(m) } func (*U2F) ProtoMessage() {} func (*U2F) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{54} + return fileDescriptor_d938547f84707355, []int{55} } func (m *U2F) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3204,7 +3251,7 @@ func (m *Webauthn) Reset() { *m = Webauthn{} } func (m *Webauthn) String() string { return proto.CompactTextString(m) } func (*Webauthn) ProtoMessage() {} func (*Webauthn) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{55} + return fileDescriptor_d938547f84707355, []int{56} } func (m *Webauthn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3254,7 +3301,7 @@ func (m *Namespace) Reset() { *m = Namespace{} } func (m *Namespace) String() string { return proto.CompactTextString(m) } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{56} + return fileDescriptor_d938547f84707355, []int{57} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3294,7 +3341,7 @@ func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (m *NamespaceSpec) String() string { return proto.CompactTextString(m) } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{57} + return fileDescriptor_d938547f84707355, []int{58} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3342,7 +3389,7 @@ type UserTokenV3 struct { func (m *UserTokenV3) Reset() { *m = UserTokenV3{} } func (*UserTokenV3) ProtoMessage() {} func (*UserTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{58} + return fileDescriptor_d938547f84707355, []int{59} } func (m *UserTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3389,7 +3436,7 @@ func (m *UserTokenSpecV3) Reset() { *m = UserTokenSpecV3{} } func (m *UserTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSpecV3) ProtoMessage() {} func (*UserTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{59} + return fileDescriptor_d938547f84707355, []int{60} } func (m *UserTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3437,7 +3484,7 @@ type UserTokenSecretsV3 struct { func (m *UserTokenSecretsV3) Reset() { *m = UserTokenSecretsV3{} } func (*UserTokenSecretsV3) ProtoMessage() {} func (*UserTokenSecretsV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{60} + return fileDescriptor_d938547f84707355, []int{61} } func (m *UserTokenSecretsV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3482,7 +3529,7 @@ func (m *UserTokenSecretsSpecV3) Reset() { *m = UserTokenSecretsSpecV3{} func (m *UserTokenSecretsSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSecretsSpecV3) ProtoMessage() {} func (*UserTokenSecretsSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{61} + return fileDescriptor_d938547f84707355, []int{62} } func (m *UserTokenSecretsSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3531,7 +3578,7 @@ type AccessRequestV3 struct { func (m *AccessRequestV3) Reset() { *m = AccessRequestV3{} } func (*AccessRequestV3) ProtoMessage() {} func (*AccessRequestV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{62} + return fileDescriptor_d938547f84707355, []int{63} } func (m *AccessRequestV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3583,7 +3630,7 @@ func (m *AccessReviewThreshold) Reset() { *m = AccessReviewThreshold{} } func (m *AccessReviewThreshold) String() string { return proto.CompactTextString(m) } func (*AccessReviewThreshold) ProtoMessage() {} func (*AccessReviewThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{63} + return fileDescriptor_d938547f84707355, []int{64} } func (m *AccessReviewThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3639,7 +3686,7 @@ func (m *AccessReview) Reset() { *m = AccessReview{} } func (m *AccessReview) String() string { return proto.CompactTextString(m) } func (*AccessReview) ProtoMessage() {} func (*AccessReview) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{64} + return fileDescriptor_d938547f84707355, []int{65} } func (m *AccessReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3684,7 +3731,7 @@ func (m *AccessReviewSubmission) Reset() { *m = AccessReviewSubmission{} func (m *AccessReviewSubmission) String() string { return proto.CompactTextString(m) } func (*AccessReviewSubmission) ProtoMessage() {} func (*AccessReviewSubmission) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{65} + return fileDescriptor_d938547f84707355, []int{66} } func (m *AccessReviewSubmission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3727,7 +3774,7 @@ func (m *ThresholdIndexSet) Reset() { *m = ThresholdIndexSet{} } func (m *ThresholdIndexSet) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSet) ProtoMessage() {} func (*ThresholdIndexSet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{66} + return fileDescriptor_d938547f84707355, []int{67} } func (m *ThresholdIndexSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3770,7 +3817,7 @@ func (m *ThresholdIndexSets) Reset() { *m = ThresholdIndexSets{} } func (m *ThresholdIndexSets) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSets) ProtoMessage() {} func (*ThresholdIndexSets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{67} + return fileDescriptor_d938547f84707355, []int{68} } func (m *ThresholdIndexSets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3855,7 +3902,7 @@ func (m *AccessRequestSpecV3) Reset() { *m = AccessRequestSpecV3{} } func (m *AccessRequestSpecV3) String() string { return proto.CompactTextString(m) } func (*AccessRequestSpecV3) ProtoMessage() {} func (*AccessRequestSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{68} + return fileDescriptor_d938547f84707355, []int{69} } func (m *AccessRequestSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3901,7 +3948,7 @@ func (m *AccessRequestFilter) Reset() { *m = AccessRequestFilter{} } func (m *AccessRequestFilter) String() string { return proto.CompactTextString(m) } func (*AccessRequestFilter) ProtoMessage() {} func (*AccessRequestFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{69} + return fileDescriptor_d938547f84707355, []int{70} } func (m *AccessRequestFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3947,7 +3994,7 @@ func (m *AccessCapabilities) Reset() { *m = AccessCapabilities{} } func (m *AccessCapabilities) String() string { return proto.CompactTextString(m) } func (*AccessCapabilities) ProtoMessage() {} func (*AccessCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{70} + return fileDescriptor_d938547f84707355, []int{71} } func (m *AccessCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3996,7 +4043,7 @@ func (m *AccessCapabilitiesRequest) Reset() { *m = AccessCapabilitiesReq func (m *AccessCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*AccessCapabilitiesRequest) ProtoMessage() {} func (*AccessCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{71} + return fileDescriptor_d938547f84707355, []int{72} } func (m *AccessCapabilitiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4045,7 +4092,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{72} + return fileDescriptor_d938547f84707355, []int{73} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4088,7 +4135,7 @@ func (m *PluginDataEntry) Reset() { *m = PluginDataEntry{} } func (m *PluginDataEntry) String() string { return proto.CompactTextString(m) } func (*PluginDataEntry) ProtoMessage() {} func (*PluginDataEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{73} + return fileDescriptor_d938547f84707355, []int{74} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4130,7 +4177,7 @@ func (m *PluginDataSpecV3) Reset() { *m = PluginDataSpecV3{} } func (m *PluginDataSpecV3) String() string { return proto.CompactTextString(m) } func (*PluginDataSpecV3) ProtoMessage() {} func (*PluginDataSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{74} + return fileDescriptor_d938547f84707355, []int{75} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4177,7 +4224,7 @@ func (m *PluginDataFilter) Reset() { *m = PluginDataFilter{} } func (m *PluginDataFilter) String() string { return proto.CompactTextString(m) } func (*PluginDataFilter) ProtoMessage() {} func (*PluginDataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{75} + return fileDescriptor_d938547f84707355, []int{76} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4228,7 +4275,7 @@ func (m *PluginDataUpdateParams) Reset() { *m = PluginDataUpdateParams{} func (m *PluginDataUpdateParams) String() string { return proto.CompactTextString(m) } func (*PluginDataUpdateParams) ProtoMessage() {} func (*PluginDataUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{76} + return fileDescriptor_d938547f84707355, []int{77} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4277,7 +4324,7 @@ type RoleV5 struct { func (m *RoleV5) Reset() { *m = RoleV5{} } func (*RoleV5) ProtoMessage() {} func (*RoleV5) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{77} + return fileDescriptor_d938547f84707355, []int{78} } func (m *RoleV5) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4324,7 +4371,7 @@ func (m *RoleSpecV5) Reset() { *m = RoleSpecV5{} } func (m *RoleSpecV5) String() string { return proto.CompactTextString(m) } func (*RoleSpecV5) ProtoMessage() {} func (*RoleSpecV5) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{78} + return fileDescriptor_d938547f84707355, []int{79} } func (m *RoleSpecV5) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4412,7 +4459,7 @@ func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{79} + return fileDescriptor_d938547f84707355, []int{80} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4454,7 +4501,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{80} + return fileDescriptor_d938547f84707355, []int{81} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4504,7 +4551,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{81} + return fileDescriptor_d938547f84707355, []int{82} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4589,7 +4636,7 @@ func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{82} + return fileDescriptor_d938547f84707355, []int{83} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4642,7 +4689,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{83} + return fileDescriptor_d938547f84707355, []int{84} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4690,7 +4737,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{84} + return fileDescriptor_d938547f84707355, []int{85} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4750,7 +4797,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{85} + return fileDescriptor_d938547f84707355, []int{86} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4798,7 +4845,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{86} + return fileDescriptor_d938547f84707355, []int{87} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4844,7 +4891,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{87} + return fileDescriptor_d938547f84707355, []int{88} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4893,7 +4940,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{88} + return fileDescriptor_d938547f84707355, []int{89} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4941,7 +4988,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{89} + return fileDescriptor_d938547f84707355, []int{90} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4983,7 +5030,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{90} + return fileDescriptor_d938547f84707355, []int{91} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5032,7 +5079,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{91} + return fileDescriptor_d938547f84707355, []int{92} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5096,7 +5143,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{92} + return fileDescriptor_d938547f84707355, []int{93} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5141,7 +5188,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{93} + return fileDescriptor_d938547f84707355, []int{94} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5193,7 +5240,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{94} + return fileDescriptor_d938547f84707355, []int{95} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5238,7 +5285,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{95} + return fileDescriptor_d938547f84707355, []int{96} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5284,7 +5331,7 @@ func (m *U2FRegistrationData) Reset() { *m = U2FRegistrationData{} } func (m *U2FRegistrationData) String() string { return proto.CompactTextString(m) } func (*U2FRegistrationData) ProtoMessage() {} func (*U2FRegistrationData) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{96} + return fileDescriptor_d938547f84707355, []int{97} } func (m *U2FRegistrationData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5335,7 +5382,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{97} + return fileDescriptor_d938547f84707355, []int{98} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5390,7 +5437,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{98} + return fileDescriptor_d938547f84707355, []int{99} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5488,7 +5535,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{99} + return fileDescriptor_d938547f84707355, []int{100} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5534,7 +5581,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{100} + return fileDescriptor_d938547f84707355, []int{101} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5601,7 +5648,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{101} + return fileDescriptor_d938547f84707355, []int{102} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5644,7 +5691,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{102} + return fileDescriptor_d938547f84707355, []int{103} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5690,7 +5737,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{103} + return fileDescriptor_d938547f84707355, []int{104} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5732,7 +5779,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{104} + return fileDescriptor_d938547f84707355, []int{105} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5782,7 +5829,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{105} + return fileDescriptor_d938547f84707355, []int{106} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5829,7 +5876,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{106} + return fileDescriptor_d938547f84707355, []int{107} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5878,7 +5925,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{107} + return fileDescriptor_d938547f84707355, []int{108} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5926,7 +5973,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{108} + return fileDescriptor_d938547f84707355, []int{109} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5974,7 +6021,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{109} + return fileDescriptor_d938547f84707355, []int{110} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6025,7 +6072,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{110} + return fileDescriptor_d938547f84707355, []int{111} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6073,7 +6120,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{111} + return fileDescriptor_d938547f84707355, []int{112} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6119,7 +6166,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{112} + return fileDescriptor_d938547f84707355, []int{113} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6168,7 +6215,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{113} + return fileDescriptor_d938547f84707355, []int{114} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6210,7 +6257,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{114} + return fileDescriptor_d938547f84707355, []int{115} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6259,7 +6306,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{115} + return fileDescriptor_d938547f84707355, []int{116} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6320,7 +6367,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{116} + return fileDescriptor_d938547f84707355, []int{117} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6362,7 +6409,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{117} + return fileDescriptor_d938547f84707355, []int{118} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6411,7 +6458,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{118} + return fileDescriptor_d938547f84707355, []int{119} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6455,7 +6502,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{119} + return fileDescriptor_d938547f84707355, []int{120} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6505,7 +6552,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{120} + return fileDescriptor_d938547f84707355, []int{121} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6554,7 +6601,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{121} + return fileDescriptor_d938547f84707355, []int{122} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6596,7 +6643,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{122} + return fileDescriptor_d938547f84707355, []int{123} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6648,7 +6695,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{123} + return fileDescriptor_d938547f84707355, []int{124} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6692,7 +6739,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{124} + return fileDescriptor_d938547f84707355, []int{125} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6736,7 +6783,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{125} + return fileDescriptor_d938547f84707355, []int{126} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6780,7 +6827,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{126} + return fileDescriptor_d938547f84707355, []int{127} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6824,7 +6871,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{127} + return fileDescriptor_d938547f84707355, []int{128} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6868,7 +6915,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{128} + return fileDescriptor_d938547f84707355, []int{129} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6910,7 +6957,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{129} + return fileDescriptor_d938547f84707355, []int{130} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6954,7 +7001,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{130} + return fileDescriptor_d938547f84707355, []int{131} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6996,7 +7043,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{131} + return fileDescriptor_d938547f84707355, []int{132} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7040,7 +7087,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{132} + return fileDescriptor_d938547f84707355, []int{133} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7082,7 +7129,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{133} + return fileDescriptor_d938547f84707355, []int{134} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7132,7 +7179,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{134} + return fileDescriptor_d938547f84707355, []int{135} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7174,7 +7221,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{135} + return fileDescriptor_d938547f84707355, []int{136} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7247,7 +7294,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{136} + return fileDescriptor_d938547f84707355, []int{137} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7297,7 +7344,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{137} + return fileDescriptor_d938547f84707355, []int{138} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7339,7 +7386,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{138} + return fileDescriptor_d938547f84707355, []int{139} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7408,7 +7455,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{139} + return fileDescriptor_d938547f84707355, []int{140} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7454,7 +7501,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{140} + return fileDescriptor_d938547f84707355, []int{141} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7499,7 +7546,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{141} + return fileDescriptor_d938547f84707355, []int{142} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7549,7 +7596,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{142} + return fileDescriptor_d938547f84707355, []int{143} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7591,7 +7638,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{143} + return fileDescriptor_d938547f84707355, []int{144} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7641,7 +7688,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{144} + return fileDescriptor_d938547f84707355, []int{145} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7691,7 +7738,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{145} + return fileDescriptor_d938547f84707355, []int{146} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7740,7 +7787,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{146} + return fileDescriptor_d938547f84707355, []int{147} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7782,7 +7829,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{147} + return fileDescriptor_d938547f84707355, []int{148} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7838,7 +7885,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{148} + return fileDescriptor_d938547f84707355, []int{149} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7891,7 +7938,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{149} + return fileDescriptor_d938547f84707355, []int{150} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7937,7 +7984,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{150} + return fileDescriptor_d938547f84707355, []int{151} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7992,7 +8039,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{151} + return fileDescriptor_d938547f84707355, []int{152} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8036,7 +8083,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{152} + return fileDescriptor_d938547f84707355, []int{153} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8079,7 +8126,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{153} + return fileDescriptor_d938547f84707355, []int{154} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8132,7 +8179,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{154} + return fileDescriptor_d938547f84707355, []int{155} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8176,7 +8223,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{155} + return fileDescriptor_d938547f84707355, []int{156} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8222,7 +8269,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{156} + return fileDescriptor_d938547f84707355, []int{157} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8266,7 +8313,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{157} + return fileDescriptor_d938547f84707355, []int{158} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8310,7 +8357,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{158} + return fileDescriptor_d938547f84707355, []int{159} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8356,7 +8403,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{159} + return fileDescriptor_d938547f84707355, []int{160} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8422,7 +8469,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{160} + return fileDescriptor_d938547f84707355, []int{161} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8476,7 +8523,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{161} + return fileDescriptor_d938547f84707355, []int{162} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8521,7 +8568,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{162} + return fileDescriptor_d938547f84707355, []int{163} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8565,7 +8612,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{163} + return fileDescriptor_d938547f84707355, []int{164} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8609,7 +8656,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{164} + return fileDescriptor_d938547f84707355, []int{165} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8691,7 +8738,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{165} + return fileDescriptor_d938547f84707355, []int{166} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8738,7 +8785,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{166} + return fileDescriptor_d938547f84707355, []int{167} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8786,7 +8833,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{167} + return fileDescriptor_d938547f84707355, []int{168} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8830,7 +8877,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_d938547f84707355, []int{168} + return fileDescriptor_d938547f84707355, []int{169} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8892,6 +8939,7 @@ func init() { proto.RegisterType((*Azure)(nil), "types.Azure") proto.RegisterType((*AD)(nil), "types.AD") proto.RegisterType((*DatabaseTLS)(nil), "types.DatabaseTLS") + proto.RegisterType((*MySQLOptions)(nil), "types.MySQLOptions") proto.RegisterType((*ServerV2)(nil), "types.ServerV2") proto.RegisterType((*ServerV2List)(nil), "types.ServerV2List") proto.RegisterType((*ServerSpecV2)(nil), "types.ServerSpecV2") @@ -9060,739 +9108,743 @@ func init() { func init() { proto.RegisterFile("types.proto", fileDescriptor_d938547f84707355) } var fileDescriptor_d938547f84707355 = []byte{ - // 11698 bytes of a gzipped FileDescriptorProto + // 11766 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x7d, 0x6d, 0x6c, 0x1c, 0x49, 0x76, 0x98, 0x7a, 0x86, 0x1f, 0x33, 0x8f, 0x43, 0x72, 0x58, 0xd4, 0x07, 0xa5, 0xd5, 0xee, 0xe8, 0x7a, 0x77, 0xb5, 0x92, 0x6e, 0x57, 0x3c, 0x51, 0xb7, 0x3a, 0xef, 0xed, 0xd7, 0xcd, 0x90, 0x94, 0xc4, 0x15, 0x45, 0x72, 0x7b, 0xf8, 0x71, 0xe7, 0xbb, 0x75, 0xbb, 0x67, 0xba, 0x44, 0xf6, 0x72, - 0x66, 0x7a, 0xdc, 0xdd, 0x23, 0x89, 0x76, 0x0c, 0x3b, 0x09, 0x1c, 0xc3, 0x30, 0x7c, 0x1f, 0xc6, - 0x19, 0xb6, 0x03, 0x27, 0x76, 0x8c, 0x18, 0x89, 0x63, 0x5c, 0x7e, 0x38, 0x01, 0x92, 0x00, 0x41, - 0x00, 0x03, 0x81, 0x71, 0x3f, 0x12, 0xc4, 0xff, 0x02, 0x3b, 0x01, 0x13, 0xdf, 0xe5, 0x8f, 0x09, - 0x24, 0x7f, 0xf2, 0xcb, 0x97, 0x18, 0x09, 0xea, 0x55, 0x55, 0x77, 0x55, 0x4f, 0x0f, 0x39, 0xda, - 0xd5, 0x02, 0x27, 0xfd, 0x22, 0xe7, 0xd5, 0x7b, 0xaf, 0xbe, 0x5f, 0xbd, 0x57, 0xf5, 0xde, 0x6b, - 0x98, 0x88, 0x0e, 0xba, 0x34, 0xbc, 0xde, 0x0d, 0xfc, 0xc8, 0x27, 0xa3, 0xf8, 0xe3, 0xc2, 0xe9, - 0x5d, 0x7f, 0xd7, 0x47, 0xc8, 0x3c, 0xfb, 0x8f, 0x17, 0x5e, 0xa8, 0xec, 0xfa, 0xfe, 0x6e, 0x8b, - 0xce, 0xe3, 0xaf, 0x46, 0xef, 0xc1, 0x7c, 0xe4, 0xb5, 0x69, 0x18, 0x39, 0xed, 0xae, 0x40, 0x58, - 0xdc, 0xf5, 0xa2, 0xbd, 0x5e, 0xe3, 0x7a, 0xd3, 0x6f, 0xcf, 0xef, 0x06, 0xce, 0x43, 0x2f, 0x72, - 0x22, 0xcf, 0xef, 0x38, 0xad, 0xf9, 0x88, 0xb6, 0x68, 0xd7, 0x0f, 0xa2, 0x79, 0xa7, 0xeb, 0xcd, - 0x63, 0x1d, 0xf3, 0x8f, 0x02, 0xa7, 0xdb, 0xa5, 0x41, 0xf2, 0x0f, 0x67, 0x62, 0xfe, 0xa3, 0x3c, - 0x14, 0xef, 0x51, 0xda, 0xad, 0xb6, 0xbc, 0x87, 0x94, 0xbc, 0x0c, 0x23, 0x6b, 0x4e, 0x9b, 0xce, - 0x19, 0x97, 0x8c, 0x2b, 0xc5, 0xda, 0xf4, 0xd1, 0x61, 0x65, 0x22, 0xa4, 0xc1, 0x43, 0x1a, 0xd8, - 0x1d, 0xa7, 0x4d, 0x2d, 0x2c, 0x24, 0x9f, 0x87, 0x22, 0xfb, 0x1b, 0x76, 0x9d, 0x26, 0x9d, 0xcb, - 0x21, 0xe6, 0xe4, 0xd1, 0x61, 0xa5, 0xd8, 0x91, 0x40, 0x2b, 0x29, 0x27, 0x97, 0x61, 0x7c, 0x95, - 0x3a, 0x21, 0x5d, 0x59, 0x9a, 0xcb, 0x5f, 0x32, 0xae, 0xe4, 0x6b, 0xa5, 0xa3, 0xc3, 0x4a, 0xa1, - 0xc5, 0x40, 0xb6, 0xe7, 0x5a, 0xb2, 0x90, 0xac, 0xc0, 0xf8, 0xf2, 0xe3, 0xae, 0x17, 0xd0, 0x70, - 0x6e, 0xe4, 0x92, 0x71, 0x65, 0x62, 0xe1, 0xc2, 0x75, 0xde, 0xff, 0xeb, 0xb2, 0xff, 0xd7, 0x37, - 0x65, 0xff, 0x6b, 0xb3, 0xdf, 0x3f, 0xac, 0x9c, 0x3a, 0x3a, 0xac, 0x8c, 0x53, 0x4e, 0xf2, 0xed, - 0xff, 0x56, 0x31, 0x2c, 0x49, 0x4f, 0xde, 0x81, 0x91, 0xcd, 0x83, 0x2e, 0x9d, 0x2b, 0x5e, 0x32, - 0xae, 0x4c, 0x2d, 0xbc, 0x74, 0x9d, 0x8f, 0x78, 0xdc, 0xc9, 0xe4, 0x3f, 0x86, 0x55, 0x2b, 0x1c, - 0x1d, 0x56, 0x46, 0x18, 0x8a, 0x85, 0x54, 0xe4, 0x0d, 0x18, 0xbb, 0xeb, 0x87, 0xd1, 0xca, 0xd2, - 0x1c, 0x60, 0xd7, 0xce, 0x1c, 0x1d, 0x56, 0x66, 0xf6, 0xfc, 0x30, 0xb2, 0x3d, 0xf7, 0x75, 0xbf, - 0xed, 0x45, 0xb4, 0xdd, 0x8d, 0x0e, 0x2c, 0x81, 0x64, 0x36, 0x60, 0x52, 0xe3, 0x47, 0x26, 0x60, - 0x7c, 0x6b, 0xed, 0xde, 0xda, 0xfa, 0xce, 0x5a, 0xf9, 0x14, 0x29, 0xc0, 0xc8, 0xda, 0xfa, 0xd2, - 0x72, 0xd9, 0x20, 0xe3, 0x90, 0xaf, 0x6e, 0x6c, 0x94, 0x73, 0xa4, 0x04, 0x85, 0xa5, 0xea, 0x66, - 0xb5, 0x56, 0xad, 0x2f, 0x97, 0xf3, 0x64, 0x16, 0xa6, 0x77, 0x56, 0xd6, 0x96, 0xd6, 0x77, 0xea, - 0xf6, 0xd2, 0x72, 0xfd, 0xde, 0xe6, 0xfa, 0x46, 0x79, 0x84, 0x4c, 0x01, 0xdc, 0xdb, 0xaa, 0x2d, - 0x5b, 0x6b, 0xcb, 0x9b, 0xcb, 0xf5, 0xf2, 0xa8, 0xf9, 0xcb, 0x79, 0x28, 0xdc, 0xa7, 0x91, 0xe3, - 0x3a, 0x91, 0x43, 0x2e, 0x6a, 0x53, 0x84, 0xad, 0x57, 0xe6, 0xe6, 0xe5, 0xfe, 0xb9, 0x19, 0x3d, - 0x3a, 0xac, 0x18, 0x6f, 0xa8, 0x73, 0xf2, 0x36, 0x4c, 0x2c, 0xd1, 0xb0, 0x19, 0x78, 0x5d, 0xb6, - 0x5e, 0x70, 0x5e, 0x8a, 0xb5, 0xf3, 0x47, 0x87, 0x95, 0x33, 0x6e, 0x02, 0x56, 0xfa, 0xaa, 0x62, - 0x93, 0x15, 0x18, 0x5b, 0x75, 0x1a, 0xb4, 0x15, 0xce, 0x8d, 0x5e, 0xca, 0x5f, 0x99, 0x58, 0x78, - 0x41, 0x8c, 0xaf, 0x6c, 0xe0, 0x75, 0x5e, 0xba, 0xdc, 0x89, 0x82, 0x83, 0xda, 0xe9, 0xa3, 0xc3, - 0x4a, 0xb9, 0x85, 0x00, 0x75, 0xec, 0x38, 0x0a, 0xa9, 0x27, 0x73, 0x3e, 0x76, 0xe2, 0x9c, 0xbf, - 0xf8, 0xfd, 0xc3, 0x8a, 0xc1, 0xe6, 0x42, 0xcc, 0x79, 0xc2, 0x4f, 0x9f, 0xfd, 0x4b, 0x90, 0x5b, - 0x59, 0x9a, 0x1b, 0xc7, 0xb5, 0x56, 0x3e, 0x3a, 0xac, 0x94, 0xb4, 0x69, 0xcb, 0xad, 0x2c, 0x5d, - 0x78, 0x0b, 0x26, 0x94, 0x36, 0x92, 0x32, 0xe4, 0xf7, 0xe9, 0x01, 0x1f, 0x4f, 0x8b, 0xfd, 0x4b, - 0x4e, 0xc3, 0xe8, 0x43, 0xa7, 0xd5, 0x13, 0x03, 0x68, 0xf1, 0x1f, 0x5f, 0xce, 0xfd, 0x84, 0x61, - 0xfe, 0xfa, 0x08, 0x14, 0x2c, 0x9f, 0xef, 0x33, 0x72, 0x15, 0x46, 0xeb, 0x91, 0x13, 0xc9, 0xa9, - 0x98, 0x3d, 0x3a, 0xac, 0x4c, 0x87, 0x0c, 0xa0, 0xd4, 0xc7, 0x31, 0x18, 0xea, 0xc6, 0x9e, 0x13, - 0xca, 0x29, 0x41, 0xd4, 0x2e, 0x03, 0xa8, 0xa8, 0x88, 0x41, 0x2e, 0xc3, 0xc8, 0x7d, 0xdf, 0xa5, - 0x62, 0x56, 0xc8, 0xd1, 0x61, 0x65, 0xaa, 0xed, 0xbb, 0x2a, 0x22, 0x96, 0x93, 0xd7, 0xa1, 0xb8, - 0xd8, 0x0b, 0x02, 0xda, 0x61, 0x4b, 0x75, 0x04, 0x91, 0xa7, 0x8e, 0x0e, 0x2b, 0xd0, 0xe4, 0x40, - 0xb6, 0xb9, 0x12, 0x04, 0x36, 0xd4, 0xf5, 0xc8, 0x09, 0x22, 0xea, 0xce, 0x8d, 0x0e, 0x35, 0xd4, - 0x6c, 0x7b, 0xcd, 0x84, 0x9c, 0x24, 0x3d, 0xd4, 0x82, 0x13, 0xb9, 0x0b, 0x13, 0x77, 0x02, 0xa7, - 0x49, 0x37, 0x68, 0xe0, 0xf9, 0x2e, 0xce, 0x61, 0xbe, 0x76, 0xf9, 0xe8, 0xb0, 0x72, 0x76, 0x97, - 0x81, 0xed, 0x2e, 0xc2, 0x13, 0xea, 0x1f, 0x1d, 0x56, 0x0a, 0x4b, 0xbd, 0x00, 0x47, 0xcf, 0x52, - 0x49, 0xc9, 0x4f, 0xb3, 0x29, 0x09, 0x23, 0x1c, 0x5a, 0xea, 0xe2, 0xec, 0x1d, 0xdf, 0x44, 0x53, - 0x34, 0xf1, 0x6c, 0xcb, 0x09, 0x23, 0x3b, 0xe0, 0x74, 0xa9, 0x76, 0xaa, 0x2c, 0xc9, 0x3a, 0x14, - 0xea, 0xcd, 0x3d, 0xea, 0xf6, 0x5a, 0x74, 0xae, 0x80, 0xec, 0xcf, 0x89, 0x85, 0x2b, 0xe7, 0x53, - 0x16, 0xd7, 0x2e, 0x08, 0xde, 0x24, 0x14, 0x10, 0x65, 0xec, 0x63, 0x26, 0x5f, 0x2e, 0xfc, 0xd6, - 0xef, 0x55, 0x4e, 0xfd, 0xe2, 0x7f, 0xbd, 0x74, 0xca, 0xfc, 0x57, 0x39, 0x28, 0xa7, 0x99, 0x90, - 0x07, 0x30, 0xb9, 0xd5, 0x75, 0x9d, 0x88, 0x2e, 0xb6, 0x3c, 0xda, 0x89, 0x42, 0x5c, 0x24, 0xc7, - 0xf7, 0xe9, 0x15, 0x51, 0xef, 0x5c, 0x0f, 0x09, 0xed, 0x26, 0xa7, 0x4c, 0xf5, 0x4a, 0x67, 0x9b, - 0xd4, 0x53, 0x47, 0x39, 0x1d, 0xe2, 0x0a, 0x7b, 0xb2, 0x7a, 0xb8, 0x84, 0x1f, 0x50, 0x8f, 0x60, - 0x2b, 0x16, 0x50, 0xc7, 0x6d, 0x1c, 0xe0, 0xca, 0x1c, 0x7e, 0x01, 0x31, 0x92, 0x8c, 0x05, 0xc4, - 0xc0, 0xe6, 0xff, 0x30, 0x60, 0xca, 0xa2, 0xa1, 0xdf, 0x0b, 0x9a, 0xf4, 0x2e, 0x75, 0x5c, 0x1a, - 0xb0, 0xe5, 0x7f, 0xcf, 0xeb, 0xb8, 0x62, 0x4f, 0xe1, 0xf2, 0xdf, 0xf7, 0x3a, 0xea, 0x16, 0xc6, - 0x72, 0xf2, 0x05, 0x18, 0xaf, 0xf7, 0x1a, 0x88, 0xca, 0xf7, 0xd4, 0x59, 0x9c, 0xb1, 0x5e, 0xc3, - 0x4e, 0xa1, 0x4b, 0x34, 0x32, 0x0f, 0xe3, 0xdb, 0x34, 0x08, 0x13, 0x89, 0x87, 0x92, 0xfd, 0x21, - 0x07, 0xa9, 0x04, 0x02, 0x8b, 0xdc, 0x49, 0xa4, 0xae, 0x38, 0x93, 0xa6, 0x53, 0xb2, 0x2e, 0x59, - 0x2a, 0x6d, 0x01, 0x51, 0x97, 0x8a, 0xc4, 0x32, 0xbf, 0x93, 0x83, 0xf2, 0x92, 0x13, 0x39, 0x0d, - 0x27, 0x14, 0xe3, 0xb9, 0x7d, 0x93, 0xc9, 0x71, 0xa5, 0xa3, 0x28, 0xc7, 0x59, 0xcb, 0x3f, 0x71, - 0xf7, 0x5e, 0x4d, 0x77, 0x6f, 0x82, 0x1d, 0x90, 0xa2, 0x7b, 0x49, 0xa7, 0xde, 0x3d, 0xb9, 0x53, - 0x65, 0xd1, 0xa9, 0x82, 0xec, 0x54, 0xd2, 0x15, 0xf2, 0x2e, 0x8c, 0xd4, 0xbb, 0xb4, 0x29, 0x84, - 0x88, 0x94, 0xfd, 0x7a, 0xe7, 0x18, 0xc2, 0xf6, 0xcd, 0x5a, 0x49, 0xb0, 0x19, 0x09, 0xbb, 0xb4, - 0x69, 0x21, 0x99, 0xb2, 0x69, 0xbe, 0x3b, 0x06, 0xa7, 0xb3, 0xc8, 0xc8, 0xbb, 0xfa, 0xe1, 0xc4, - 0x87, 0xe7, 0x85, 0x81, 0x87, 0xd3, 0x9c, 0xa1, 0x1f, 0x4f, 0xd7, 0xa0, 0xb0, 0xc1, 0x16, 0x64, - 0xd3, 0x6f, 0x89, 0x91, 0x63, 0x52, 0xb1, 0xd0, 0x95, 0x30, 0xc3, 0x8a, 0xcb, 0xc9, 0x0b, 0x90, - 0xdf, 0xb2, 0x56, 0xc4, 0x70, 0x15, 0x8f, 0x0e, 0x2b, 0xf9, 0x5e, 0xe0, 0xcd, 0x19, 0x16, 0x83, - 0x92, 0x79, 0x18, 0x5b, 0xac, 0x2e, 0xd2, 0x20, 0xc2, 0x61, 0x2a, 0xd5, 0xce, 0xb1, 0xd5, 0xd2, - 0x74, 0xec, 0x26, 0x0d, 0x22, 0xad, 0x7a, 0x81, 0x46, 0x3e, 0x0f, 0xf9, 0xea, 0x4e, 0x5d, 0x8c, - 0x0c, 0x88, 0x91, 0xa9, 0xee, 0xd4, 0x6b, 0x93, 0x62, 0x20, 0xf2, 0xce, 0xa3, 0x90, 0x71, 0xaf, - 0xee, 0xd4, 0xd5, 0xd9, 0x1a, 0x3b, 0x66, 0xb6, 0xae, 0x40, 0x81, 0xe9, 0x19, 0xec, 0x80, 0x47, - 0xa1, 0x58, 0xe4, 0xea, 0xd3, 0x9e, 0x80, 0x59, 0x71, 0x29, 0x79, 0x39, 0x56, 0x5b, 0x0a, 0x09, - 0x3f, 0xa1, 0xb6, 0x48, 0x65, 0x85, 0x3c, 0x86, 0xc9, 0xa5, 0x83, 0x8e, 0xd3, 0xf6, 0x9a, 0xe2, - 0x08, 0x2f, 0xe2, 0x11, 0x7e, 0xfd, 0x98, 0x69, 0xbc, 0xae, 0x11, 0xf0, 0x53, 0x5d, 0x0a, 0xdf, - 0x39, 0x97, 0x97, 0xd9, 0xe9, 0x13, 0x7e, 0xce, 0xb0, 0xf4, 0x8a, 0xd8, 0x5e, 0x92, 0x22, 0x12, - 0xf5, 0xaa, 0x64, 0xd9, 0x49, 0x70, 0xb2, 0x97, 0x02, 0x01, 0x51, 0xf7, 0x52, 0x7c, 0xe8, 0xbe, - 0x0b, 0xf9, 0x3b, 0x8b, 0x1b, 0x73, 0x13, 0xc8, 0x83, 0x08, 0x1e, 0x77, 0x16, 0x37, 0x16, 0x5b, - 0x7e, 0xcf, 0xad, 0x7f, 0xb8, 0x5a, 0x3b, 0x27, 0xd8, 0x4c, 0xee, 0x36, 0xbb, 0x5a, 0x8b, 0x18, - 0x1d, 0x59, 0x86, 0x82, 0xec, 0xe5, 0x5c, 0x09, 0x79, 0xcc, 0xa4, 0x3a, 0xbf, 0x7d, 0x93, 0xef, - 0x35, 0x57, 0xfc, 0x56, 0x5b, 0x21, 0x71, 0x2e, 0xec, 0x00, 0xe9, 0x1f, 0x97, 0x0c, 0x4d, 0xe2, - 0xf3, 0xaa, 0x26, 0x31, 0xb1, 0x70, 0x46, 0xd4, 0xb5, 0xe8, 0xb7, 0xdb, 0x4e, 0xc7, 0x45, 0xda, - 0xed, 0x05, 0x55, 0xc1, 0xa8, 0xc2, 0x54, 0xd2, 0x90, 0x55, 0x2f, 0x8c, 0xc8, 0x3c, 0x14, 0x25, - 0x84, 0x1d, 0x22, 0xf9, 0xcc, 0x26, 0x5b, 0x09, 0x8e, 0xf9, 0xa7, 0x39, 0x80, 0xa4, 0xe4, 0x19, - 0x95, 0x33, 0x5f, 0xd2, 0xe4, 0xcc, 0x99, 0xf4, 0x02, 0x1d, 0x28, 0x61, 0xc8, 0xfb, 0x30, 0xc6, - 0x54, 0xae, 0x9e, 0x54, 0x29, 0xcf, 0xa5, 0x49, 0xb1, 0x70, 0xfb, 0x66, 0x6d, 0x4a, 0x10, 0x8f, - 0x85, 0x08, 0xb1, 0x04, 0x99, 0x22, 0xa2, 0xfe, 0xd7, 0x48, 0x32, 0x19, 0x42, 0x38, 0x5d, 0x51, - 0xa4, 0x8b, 0x91, 0xec, 0x47, 0x29, 0x5d, 0x14, 0xd9, 0x72, 0x9e, 0xcb, 0x16, 0x3e, 0xa8, 0xe3, - 0x42, 0xb6, 0xa4, 0x25, 0x0b, 0x1f, 0xc0, 0x13, 0x25, 0x4b, 0x37, 0xbd, 0x6d, 0x47, 0x70, 0x19, - 0x5c, 0xc9, 0x1c, 0x95, 0xac, 0x0d, 0x7b, 0xe9, 0xa4, 0x0d, 0x9b, 0xde, 0xae, 0x37, 0x07, 0xc9, - 0xb2, 0x33, 0x72, 0x77, 0x39, 0x8f, 0x54, 0x72, 0x94, 0x69, 0x6f, 0xf3, 0xad, 0x39, 0x36, 0x70, - 0x6b, 0x9e, 0xc9, 0xdc, 0x9a, 0x7c, 0x63, 0xbe, 0x0d, 0xa3, 0xd5, 0x9f, 0xed, 0x05, 0x54, 0xe8, - 0x7e, 0x25, 0x59, 0x27, 0x83, 0xc5, 0x7b, 0x7a, 0xda, 0x61, 0x3f, 0x55, 0x9d, 0x19, 0xcb, 0x59, - 0xcd, 0x9b, 0xab, 0x75, 0xa1, 0xd7, 0x91, 0xd4, 0xb0, 0x6c, 0xae, 0x2a, 0xcd, 0x8e, 0xb4, 0x5e, - 0x33, 0x2a, 0x32, 0x0f, 0xb9, 0xea, 0x12, 0x1a, 0x8b, 0x13, 0x0b, 0x45, 0x59, 0xed, 0x52, 0xed, - 0xb4, 0x20, 0x29, 0x39, 0x9a, 0xfd, 0x50, 0x5d, 0xfa, 0xec, 0x36, 0x7f, 0x4b, 0x51, 0x13, 0xc4, - 0x32, 0x65, 0xe6, 0xa8, 0x58, 0x2c, 0x46, 0xa2, 0xb4, 0xf4, 0x2d, 0x96, 0x78, 0xa9, 0x5c, 0xe5, - 0x13, 0x97, 0xeb, 0x9b, 0xb8, 0x09, 0xe5, 0x10, 0xc2, 0xe9, 0x32, 0xff, 0xca, 0x40, 0x5c, 0xf2, - 0x3a, 0x8c, 0x59, 0x74, 0x37, 0x39, 0x6b, 0xd1, 0x66, 0x0b, 0x10, 0xa2, 0x56, 0xc0, 0x71, 0x50, - 0x90, 0x53, 0x37, 0xdc, 0xf3, 0x1e, 0x44, 0xa2, 0x96, 0x58, 0x90, 0x0b, 0xb0, 0x22, 0xc8, 0x05, - 0x44, 0x13, 0xe4, 0x02, 0xc6, 0x96, 0x98, 0xb5, 0x54, 0x17, 0xca, 0xa4, 0x6c, 0xa9, 0xb5, 0xa4, - 0xcc, 0x55, 0xe0, 0x6a, 0x73, 0x65, 0x2d, 0xd5, 0xc9, 0x2d, 0x28, 0x56, 0x9b, 0x4d, 0xbf, 0xa7, - 0x18, 0x3d, 0x73, 0x47, 0x87, 0x95, 0xd3, 0x0e, 0x07, 0xea, 0x26, 0x7a, 0x82, 0x6a, 0xd6, 0x92, - 0x56, 0x33, 0x1e, 0x8b, 0xad, 0x5e, 0x18, 0xd1, 0x60, 0x65, 0x49, 0x74, 0x19, 0x79, 0x34, 0x39, - 0x30, 0xc5, 0x23, 0x46, 0x35, 0xff, 0x8b, 0x81, 0x2d, 0x26, 0x6f, 0x01, 0xac, 0x74, 0x98, 0x62, - 0xdb, 0xa4, 0x31, 0x03, 0x34, 0x9e, 0x3d, 0x01, 0xd5, 0x39, 0x28, 0xc8, 0x7a, 0xd5, 0xb9, 0xa1, - 0xab, 0x66, 0x55, 0x4a, 0x35, 0x59, 0xdc, 0xa3, 0x88, 0x2a, 0x03, 0x01, 0x4d, 0x55, 0x99, 0x20, - 0x93, 0xcb, 0x30, 0xbe, 0x52, 0xbd, 0x5f, 0xed, 0x45, 0x7b, 0x38, 0x5e, 0x05, 0x2e, 0xb0, 0x3c, - 0xa7, 0x6d, 0x3b, 0xbd, 0x68, 0xcf, 0x92, 0x85, 0xe6, 0x2f, 0x1a, 0x30, 0xa1, 0xec, 0x55, 0xd6, - 0xd4, 0x8d, 0xc0, 0xff, 0x98, 0x36, 0x23, 0x7d, 0x94, 0xba, 0x1c, 0x98, 0x6a, 0x6a, 0x8c, 0x9a, - 0x1a, 0x9d, 0xdc, 0x13, 0x8c, 0x8e, 0x39, 0x2f, 0x44, 0x00, 0xb3, 0x01, 0x94, 0x2b, 0x0e, 0xb4, - 0x01, 0x98, 0x8e, 0xa3, 0xda, 0x00, 0xac, 0xdc, 0xfc, 0x43, 0x83, 0x6d, 0x5d, 0x32, 0x0f, 0x70, - 0x8f, 0x1e, 0x44, 0x4e, 0xe3, 0xb6, 0xd7, 0xd2, 0xae, 0xae, 0xf6, 0x11, 0x6a, 0x3f, 0xf0, 0x5a, - 0xd4, 0x52, 0x50, 0xc8, 0x4d, 0x28, 0xdc, 0x0b, 0x1a, 0x6f, 0x22, 0x7a, 0x2e, 0x16, 0xc1, 0xb3, - 0xfb, 0x41, 0xe3, 0x4d, 0x44, 0x56, 0xd7, 0xab, 0x44, 0x24, 0x26, 0x8c, 0x2d, 0xf9, 0x6d, 0xc7, - 0x93, 0xc7, 0x1e, 0xb0, 0xb3, 0xc3, 0x45, 0x88, 0x25, 0x4a, 0x98, 0xd0, 0xaf, 0x6f, 0xac, 0x89, - 0x85, 0x89, 0x42, 0x3f, 0xec, 0x76, 0x2c, 0x06, 0x33, 0xbf, 0x67, 0xc0, 0x84, 0x22, 0x91, 0xc8, - 0x17, 0x85, 0x99, 0x6f, 0xe0, 0x25, 0xd5, 0xd9, 0x7e, 0x99, 0xc5, 0x4a, 0xf9, 0x71, 0xcd, 0xcc, - 0x7f, 0x61, 0xf4, 0x27, 0xd2, 0x20, 0x37, 0x8c, 0x34, 0x78, 0x0b, 0x80, 0xeb, 0x72, 0x38, 0x9c, - 0xca, 0xba, 0x51, 0x2e, 0xf5, 0xd4, 0xc9, 0x48, 0x90, 0xcd, 0xbf, 0x9d, 0x83, 0x82, 0xb0, 0x55, - 0x16, 0x9e, 0x51, 0x1d, 0xe2, 0x4d, 0x4d, 0x87, 0x98, 0x15, 0xa4, 0x8a, 0x72, 0xbb, 0x70, 0x82, - 0x8d, 0xf2, 0x16, 0x94, 0xe4, 0x10, 0xa0, 0x2a, 0x76, 0x15, 0xc6, 0xa5, 0x95, 0xcd, 0x15, 0xb1, - 0x69, 0x8d, 0xe7, 0xf6, 0x82, 0x25, 0xcb, 0xcd, 0xef, 0x8c, 0x4a, 0x5a, 0x5e, 0x13, 0x1b, 0xc2, - 0xaa, 0xeb, 0x06, 0xea, 0x10, 0x3a, 0xae, 0x1b, 0x58, 0x08, 0x65, 0x13, 0xb5, 0xd1, 0x6b, 0xb4, - 0xbc, 0x26, 0xe2, 0x28, 0xbb, 0xa6, 0x8b, 0x50, 0x9b, 0xa1, 0xaa, 0x13, 0x95, 0x20, 0x6b, 0x26, - 0x42, 0xfe, 0x58, 0x13, 0xe1, 0xa7, 0xa0, 0xb8, 0xd8, 0x76, 0x35, 0x15, 0xc2, 0xcc, 0x18, 0x94, - 0xeb, 0x31, 0x12, 0x57, 0x1e, 0x2e, 0x8a, 0x31, 0x3a, 0xdd, 0x6c, 0xbb, 0xfd, 0x8a, 0x43, 0xc2, - 0x52, 0xd3, 0xf1, 0x47, 0x3f, 0x8d, 0x8e, 0x7f, 0x0b, 0x8a, 0x5b, 0x21, 0xdd, 0xec, 0x75, 0x3a, - 0xb4, 0x85, 0xea, 0x44, 0x81, 0xcb, 0x9e, 0x5e, 0x48, 0xed, 0x08, 0xa1, 0x6a, 0x03, 0x62, 0x54, - 0x75, 0x59, 0x8d, 0x1f, 0xb3, 0xac, 0xbe, 0x08, 0x23, 0xd5, 0x6e, 0x57, 0x1a, 0x3f, 0xf1, 0x21, - 0xd9, 0xed, 0xe2, 0xd1, 0x37, 0xe5, 0x74, 0xbb, 0xba, 0x29, 0x83, 0xd8, 0x84, 0x02, 0xb9, 0xd7, - 0x6b, 0xd0, 0xa0, 0x43, 0x23, 0x1a, 0x0a, 0xd1, 0x1c, 0xce, 0x01, 0xf2, 0x98, 0x93, 0x77, 0xcc, - 0x69, 0x04, 0x34, 0x5c, 0xcf, 0xed, 0xf7, 0x1a, 0xd4, 0x16, 0x32, 0x5e, 0x1d, 0xbb, 0x0c, 0x86, - 0x17, 0xea, 0x30, 0xa5, 0x8f, 0xff, 0x53, 0x50, 0x2c, 0x3e, 0x18, 0x29, 0x14, 0xca, 0x45, 0xf3, - 0x97, 0x73, 0x30, 0x51, 0xed, 0x76, 0x9f, 0xf1, 0x1b, 0x88, 0x9f, 0xd0, 0x76, 0xf5, 0xd9, 0x64, - 0xf6, 0x9e, 0xe0, 0xf2, 0xe1, 0xaf, 0x0d, 0x98, 0x4e, 0x51, 0xa8, 0xad, 0x37, 0x86, 0xb4, 0xc8, - 0x73, 0x43, 0x5a, 0xe4, 0xf9, 0xc1, 0x16, 0xb9, 0xba, 0x67, 0x46, 0x3e, 0xcd, 0x9e, 0x79, 0x0d, - 0xf2, 0xd5, 0x6e, 0x57, 0x8c, 0x4a, 0x29, 0x19, 0x95, 0xed, 0x9b, 0xfc, 0x20, 0x72, 0xba, 0x5d, - 0x8b, 0x61, 0x98, 0x6f, 0x40, 0x11, 0xc1, 0x28, 0xd1, 0x2e, 0x89, 0xad, 0xc0, 0xc5, 0x99, 0x46, - 0xc6, 0x97, 0xbd, 0xf9, 0x7f, 0x0c, 0x18, 0xc5, 0xdf, 0xcf, 0xe8, 0x72, 0x59, 0xd0, 0x96, 0x4b, - 0x59, 0x59, 0x2e, 0xc3, 0x2c, 0x94, 0x3f, 0xce, 0xe3, 0x68, 0x89, 0x25, 0x22, 0x6c, 0x3a, 0x23, - 0xc3, 0xa6, 0xfb, 0x14, 0x02, 0x7c, 0x3f, 0x6d, 0xdd, 0xe5, 0x71, 0x32, 0x5e, 0x4e, 0x37, 0xf5, - 0xa9, 0x18, 0x76, 0x77, 0x81, 0xac, 0x74, 0x42, 0xda, 0xec, 0x05, 0xb4, 0xbe, 0xef, 0x75, 0xb7, - 0x69, 0xe0, 0x3d, 0x38, 0x10, 0x9a, 0x21, 0xca, 0x58, 0x4f, 0x94, 0xda, 0xe1, 0xbe, 0xd7, 0xb5, - 0x1f, 0x62, 0xb9, 0x95, 0x41, 0x43, 0xde, 0x87, 0x71, 0x8b, 0x3e, 0x0a, 0xbc, 0x88, 0x8a, 0xb1, - 0x9d, 0x8a, 0xed, 0x00, 0x84, 0x72, 0xdd, 0x24, 0xe0, 0x3f, 0xd4, 0xf9, 0x17, 0xe5, 0x9f, 0x9d, - 0x19, 0xf5, 0xdd, 0x51, 0xdc, 0x0b, 0x27, 0xbc, 0x94, 0x1d, 0x63, 0xa0, 0xeb, 0x93, 0x99, 0x7f, - 0x92, 0xc9, 0xdc, 0x86, 0x12, 0x33, 0xdd, 0x52, 0x96, 0xfa, 0xc5, 0x64, 0x2e, 0xaf, 0xab, 0xc5, - 0xc7, 0x3d, 0x92, 0x69, 0x7c, 0x88, 0x9d, 0x5e, 0x24, 0xfc, 0xf1, 0xed, 0x45, 0x85, 0x71, 0xc6, - 0xf2, 0x88, 0x45, 0x47, 0x93, 0x0f, 0xd6, 0x13, 0x2f, 0x8c, 0xb1, 0x4f, 0xb7, 0x30, 0xc6, 0x3f, - 0xc9, 0xc2, 0x48, 0x3f, 0x4f, 0x16, 0x9e, 0xe4, 0x79, 0xf2, 0xc2, 0xfb, 0x30, 0xd3, 0x37, 0xc2, - 0x4f, 0xf2, 0xc4, 0xf7, 0xd9, 0x2d, 0xcb, 0x9f, 0x8f, 0xc7, 0x85, 0x2c, 0xa0, 0x39, 0xea, 0x05, - 0xb4, 0x19, 0xa1, 0xe8, 0x15, 0xd2, 0x32, 0x10, 0xb0, 0x94, 0xbd, 0x8c, 0x30, 0xf2, 0x1e, 0x8c, - 0xf3, 0x27, 0x92, 0x70, 0x2e, 0x87, 0x73, 0x3f, 0x29, 0x6a, 0xe4, 0x50, 0xf1, 0x4e, 0xcd, 0x31, - 0xd4, 0x51, 0x15, 0x44, 0xe6, 0x1d, 0x18, 0x13, 0x4f, 0x2c, 0xc7, 0xef, 0x8b, 0x0a, 0x8c, 0x6e, - 0x27, 0x23, 0x83, 0xd7, 0xe2, 0xbc, 0x13, 0x16, 0x87, 0x9b, 0xbf, 0x6a, 0xc0, 0x94, 0xde, 0x4b, - 0x72, 0x1d, 0xc6, 0xc4, 0x1b, 0xa0, 0x81, 0x6f, 0x80, 0xac, 0x37, 0x63, 0xfc, 0xf5, 0x4f, 0x7b, - 0xf3, 0x13, 0x58, 0x4c, 0xf4, 0x0b, 0x0e, 0xd8, 0x17, 0x21, 0xfa, 0xc5, 0x22, 0xb5, 0x64, 0x19, - 0x33, 0xb9, 0x2c, 0x1a, 0xf6, 0x5a, 0x91, 0x6a, 0x72, 0x05, 0x08, 0xb1, 0x44, 0x89, 0x79, 0x68, - 0x00, 0xd4, 0xeb, 0x77, 0xef, 0xd1, 0x83, 0x0d, 0xc7, 0x0b, 0xd0, 0x6c, 0xc5, 0xdd, 0x78, 0x4f, - 0xcc, 0x56, 0x49, 0x98, 0xad, 0x7c, 0xe7, 0xee, 0xd3, 0x03, 0xcd, 0x6c, 0x95, 0xa8, 0xb8, 0xe5, - 0x03, 0xef, 0xa1, 0x13, 0x51, 0x46, 0x98, 0x43, 0x42, 0xbe, 0xe5, 0x39, 0x34, 0x45, 0xa9, 0x20, - 0x93, 0x8f, 0x60, 0x2a, 0xf9, 0x85, 0x8e, 0x07, 0x79, 0xb4, 0xe9, 0xe4, 0x8a, 0xd0, 0x0b, 0x6b, - 0x2f, 0x1d, 0x1d, 0x56, 0x2e, 0x28, 0x5c, 0x6d, 0x86, 0xa5, 0xb0, 0x4e, 0x31, 0x33, 0x7f, 0xdf, - 0x00, 0xd8, 0x5c, 0xad, 0xcb, 0x0e, 0x5e, 0x86, 0x91, 0xf8, 0x36, 0xa8, 0xc4, 0x6d, 0xe3, 0x94, - 0xf1, 0x87, 0xe5, 0xe4, 0x65, 0xc8, 0x27, 0x3d, 0x99, 0x39, 0x3a, 0xac, 0x4c, 0xea, 0x3d, 0x60, - 0xa5, 0xe4, 0x0e, 0x8c, 0x0f, 0xd5, 0x66, 0x5c, 0x9d, 0x19, 0x6d, 0x95, 0xd4, 0x38, 0x0b, 0x1f, - 0xec, 0x6c, 0x3e, 0xbf, 0xb3, 0xf0, 0xad, 0x1c, 0x4c, 0xb3, 0x71, 0xad, 0xf6, 0xa2, 0x3d, 0x3f, - 0xf0, 0xa2, 0x83, 0x67, 0xd6, 0x2a, 0x7e, 0x47, 0x53, 0x88, 0x2e, 0x48, 0xb1, 0xa5, 0xf6, 0x6d, - 0x28, 0xe3, 0xf8, 0x2f, 0xc7, 0x61, 0x36, 0x83, 0x8a, 0xbc, 0x2e, 0xbc, 0x6f, 0x92, 0x3b, 0x23, - 0xf4, 0xae, 0xf9, 0xd1, 0x61, 0xa5, 0x24, 0xd1, 0x37, 0x13, 0x6f, 0x9b, 0x05, 0x98, 0x10, 0xa6, - 0xcf, 0x5a, 0xa2, 0x51, 0xa3, 0xdb, 0x86, 0xbc, 0x13, 0x43, 0xd1, 0xa4, 0x22, 0x91, 0x2a, 0x94, - 0x16, 0xf7, 0x68, 0x73, 0xdf, 0xeb, 0xec, 0xde, 0xa3, 0x07, 0x5c, 0x5f, 0x2a, 0xd5, 0x5e, 0x64, - 0x96, 0x56, 0x53, 0xc0, 0xd9, 0x94, 0xea, 0x46, 0x9c, 0x46, 0x42, 0xde, 0x83, 0x89, 0xba, 0xb7, - 0xdb, 0x91, 0x1c, 0x46, 0x90, 0xc3, 0xc5, 0xa3, 0xc3, 0xca, 0xd9, 0x90, 0x83, 0xfb, 0x19, 0xa8, - 0x04, 0xe4, 0x2a, 0x8c, 0x5a, 0x7e, 0x8b, 0xf2, 0x63, 0x58, 0xf8, 0x73, 0x04, 0x0c, 0xa0, 0xde, - 0x4d, 0x23, 0x06, 0xb9, 0x0b, 0xe3, 0xec, 0x9f, 0xfb, 0x4e, 0x77, 0x6e, 0x0c, 0xe5, 0x36, 0x89, - 0x15, 0x7c, 0x84, 0x76, 0xbd, 0xce, 0xae, 0xaa, 0xe3, 0xb7, 0xa8, 0xdd, 0x76, 0xba, 0xda, 0xb9, - 0xc8, 0x11, 0xc9, 0x36, 0x4c, 0x24, 0x82, 0x20, 0x9c, 0x1b, 0xd7, 0xde, 0x82, 0x92, 0x92, 0xda, - 0xe7, 0x04, 0xb3, 0x73, 0x51, 0x2b, 0xc4, 0xb5, 0xdd, 0x65, 0xf8, 0x7a, 0x67, 0x14, 0x46, 0x9a, - 0x0d, 0x52, 0x18, 0x6c, 0x83, 0x18, 0x27, 0xda, 0x20, 0x2e, 0x80, 0x18, 0xa4, 0x6a, 0x6b, 0x57, - 0xb8, 0x5f, 0x5d, 0x1d, 0xbc, 0xc0, 0xae, 0x27, 0xc8, 0xb8, 0x27, 0xf9, 0xcd, 0x94, 0x18, 0x7f, - 0xa7, 0xb5, 0xab, 0xdd, 0x4c, 0xc5, 0xa8, 0x6c, 0x18, 0x12, 0x51, 0x23, 0x2d, 0x70, 0x39, 0x0c, - 0x49, 0x49, 0x32, 0x0c, 0x1f, 0x3f, 0x8a, 0x06, 0x0d, 0x83, 0xc2, 0x88, 0xac, 0x01, 0x54, 0x9b, - 0x91, 0xf7, 0x90, 0xe2, 0x92, 0x98, 0xd0, 0x06, 0x62, 0xb1, 0x7a, 0x8f, 0x1e, 0xd4, 0x69, 0x14, - 0x7b, 0x36, 0x9c, 0x71, 0x10, 0x35, 0xb5, 0x4c, 0x2c, 0x85, 0x03, 0xe9, 0xc2, 0x99, 0xaa, 0xeb, - 0x7a, 0xdc, 0x25, 0x6f, 0x33, 0x60, 0xeb, 0xd7, 0x45, 0xd6, 0xa5, 0x6c, 0xd6, 0x57, 0x05, 0xeb, - 0xcf, 0x39, 0x31, 0x95, 0x1d, 0x71, 0xb2, 0x74, 0x35, 0xd9, 0x8c, 0xcd, 0x75, 0x98, 0xd2, 0x87, - 0x54, 0x77, 0x46, 0x2b, 0x41, 0xc1, 0xaa, 0x57, 0xed, 0xfa, 0xdd, 0xea, 0x8d, 0xb2, 0x41, 0xca, - 0x50, 0x12, 0xbf, 0x16, 0xec, 0x85, 0x37, 0x6f, 0x95, 0x73, 0x1a, 0xe4, 0xcd, 0x1b, 0x0b, 0xe5, - 0xbc, 0xf9, 0xc7, 0x06, 0x14, 0x64, 0xfb, 0xc8, 0x2d, 0xc8, 0xd7, 0xeb, 0x77, 0x53, 0x4f, 0x90, - 0xc9, 0xd1, 0xcb, 0x0f, 0x99, 0x30, 0xdc, 0x53, 0x0f, 0x99, 0x7a, 0xfd, 0x2e, 0xa3, 0xdb, 0x5c, - 0xad, 0x0b, 0xa5, 0x25, 0x63, 0xb9, 0xce, 0x0c, 0x78, 0x97, 0xb9, 0x05, 0xf9, 0x0f, 0x76, 0x36, - 0x85, 0x35, 0x94, 0x31, 0xbf, 0x48, 0xf7, 0xf1, 0x23, 0xf5, 0xe8, 0x63, 0x04, 0xa6, 0x05, 0x13, - 0xca, 0xd6, 0xe2, 0x4a, 0x44, 0xdb, 0x8f, 0xdd, 0xb4, 0x84, 0x12, 0xc1, 0x20, 0x96, 0x28, 0x61, - 0x3a, 0xcf, 0xaa, 0xdf, 0x74, 0x5a, 0x42, 0x1b, 0x41, 0x9d, 0xa7, 0xc5, 0x00, 0x16, 0x87, 0x9b, - 0x7f, 0x62, 0x40, 0x79, 0x23, 0xf0, 0x1f, 0x7a, 0x4c, 0x02, 0x6f, 0xfa, 0xfb, 0xb4, 0xb3, 0x7d, - 0x83, 0xbc, 0x21, 0x85, 0x00, 0x57, 0xe1, 0xce, 0x31, 0x2a, 0x14, 0x02, 0x3f, 0x3a, 0xac, 0x40, - 0xfd, 0x20, 0x8c, 0x68, 0x9b, 0x95, 0x4b, 0x41, 0xa0, 0x78, 0xbb, 0xe5, 0x86, 0xf7, 0xa0, 0x39, - 0xc1, 0xdb, 0xad, 0x02, 0xa3, 0xd8, 0x1c, 0xc5, 0x89, 0x61, 0x34, 0x62, 0x00, 0x8b, 0xc3, 0x15, - 0x81, 0xfd, 0x9d, 0x5c, 0x5f, 0x1f, 0x16, 0x9e, 0x2b, 0x2f, 0x14, 0xbd, 0x73, 0x43, 0x1d, 0x62, - 0x5f, 0x83, 0xd3, 0xe9, 0x21, 0xc1, 0x7b, 0x91, 0x2a, 0x4c, 0xeb, 0x70, 0x79, 0x45, 0x72, 0x2e, - 0xb3, 0xae, 0xed, 0x05, 0x2b, 0x8d, 0x6f, 0xfe, 0xc0, 0x80, 0x22, 0xfe, 0x6b, 0xf5, 0x5a, 0x94, - 0x69, 0x36, 0xd5, 0x9d, 0xba, 0x78, 0x90, 0x52, 0x1f, 0x8d, 0x9c, 0x47, 0xa1, 0x2d, 0x5e, 0xaf, - 0x34, 0x39, 0x12, 0x23, 0x0b, 0x52, 0xfe, 0xfc, 0x16, 0x8a, 0x15, 0x1a, 0x93, 0xf2, 0x77, 0xba, - 0x30, 0x45, 0x2a, 0x90, 0xd9, 0xfc, 0xb1, 0x5f, 0x7e, 0x4b, 0x5e, 0x0d, 0xe3, 0xfc, 0x21, 0x9d, - 0xaf, 0x3d, 0x73, 0x48, 0x34, 0xf2, 0x06, 0x8c, 0xb1, 0xaa, 0x2d, 0xf9, 0x88, 0x81, 0x56, 0x05, - 0xb6, 0x31, 0xd0, 0x5e, 0x03, 0x39, 0x92, 0xf9, 0xaf, 0x73, 0xe9, 0x01, 0x14, 0x5a, 0xc0, 0x13, - 0xee, 0x8d, 0xb7, 0x61, 0xb4, 0xda, 0x6a, 0xf9, 0x8f, 0x84, 0x94, 0x90, 0xd7, 0x34, 0xf1, 0xf8, - 0xf1, 0x13, 0xd6, 0x61, 0x28, 0xda, 0xeb, 0x2f, 0x03, 0x90, 0x45, 0x28, 0x56, 0x77, 0xea, 0x2b, - 0x2b, 0x4b, 0x9b, 0x9b, 0xab, 0xc2, 0xc9, 0xf8, 0x55, 0x39, 0x3e, 0x9e, 0xe7, 0xda, 0x51, 0xd4, - 0x1a, 0xe0, 0x83, 0x98, 0xd0, 0x91, 0x77, 0x01, 0x3e, 0xf0, 0xbd, 0xce, 0x7d, 0x1a, 0xed, 0xf9, - 0xae, 0xe8, 0x3c, 0x53, 0x29, 0x26, 0x3e, 0xf6, 0xbd, 0x8e, 0xdd, 0x46, 0x30, 0x6b, 0x7b, 0x82, - 0x64, 0x29, 0xff, 0xb3, 0x91, 0xae, 0xf9, 0x11, 0xea, 0x30, 0xa3, 0xc9, 0x48, 0x37, 0xfc, 0x28, - 0xfd, 0xc6, 0x22, 0xd1, 0xcc, 0x5f, 0xcb, 0xc1, 0x14, 0xb7, 0x54, 0xf9, 0x82, 0x79, 0x66, 0x37, - 0xe3, 0xdb, 0xda, 0x66, 0x3c, 0x2f, 0x0f, 0x06, 0xa5, 0x6b, 0x43, 0x6d, 0xc5, 0x3d, 0x20, 0xfd, - 0x34, 0xc4, 0x92, 0xf7, 0x29, 0xc3, 0xec, 0xc2, 0x1b, 0xc9, 0xdb, 0x71, 0x88, 0x44, 0x36, 0x8a, - 0xc2, 0xd0, 0xd2, 0x78, 0x98, 0xbf, 0x9a, 0x83, 0x49, 0x45, 0x9f, 0x7c, 0x66, 0x07, 0xfe, 0xcb, - 0xda, 0xc0, 0xcb, 0x37, 0x08, 0xa5, 0x67, 0x43, 0x8d, 0x7b, 0x0f, 0x66, 0xfa, 0x48, 0xd2, 0x6a, - 0xb9, 0x31, 0x8c, 0x5a, 0xfe, 0x7a, 0xff, 0xe3, 0x36, 0x77, 0x48, 0x8e, 0x1f, 0xb7, 0xd5, 0xd7, - 0xf4, 0x6f, 0xe5, 0xe0, 0xb4, 0xf8, 0x55, 0xed, 0xb9, 0x5e, 0xb4, 0xe8, 0x77, 0x1e, 0x78, 0xbb, - 0xcf, 0xec, 0x5c, 0x54, 0xb5, 0xb9, 0xa8, 0xe8, 0x73, 0xa1, 0x74, 0x70, 0xf0, 0x94, 0x98, 0xff, - 0xb6, 0x00, 0x73, 0x83, 0x08, 0x98, 0xd9, 0xaf, 0x58, 0x55, 0x68, 0xf6, 0xa7, 0x2c, 0x56, 0x6e, - 0x4f, 0x25, 0xce, 0x1c, 0xb9, 0x21, 0x9c, 0x39, 0x56, 0xa1, 0x8c, 0x55, 0xd5, 0x69, 0xc8, 0x06, - 0x21, 0x4c, 0xbc, 0x21, 0x2f, 0x1d, 0x1d, 0x56, 0x2e, 0x3a, 0xac, 0xcc, 0x0e, 0x45, 0xa1, 0xdd, - 0x0b, 0x3c, 0x85, 0x47, 0x1f, 0x25, 0xf9, 0x7d, 0x03, 0xa6, 0x10, 0xb8, 0xfc, 0x90, 0x76, 0x22, - 0x64, 0x36, 0x22, 0x1e, 0x69, 0xe2, 0xa0, 0x93, 0x7a, 0x14, 0x78, 0x9d, 0x5d, 0xbc, 0x48, 0x0a, - 0x6b, 0x0d, 0x36, 0x0a, 0x7f, 0x71, 0x58, 0x79, 0xe7, 0x93, 0x04, 0xb2, 0x08, 0x56, 0x21, 0x33, - 0xe4, 0x79, 0x43, 0x29, 0x56, 0x9b, 0x6a, 0x66, 0xaa, 0x45, 0xe4, 0x27, 0xe1, 0xdc, 0x72, 0xc7, - 0x69, 0xb4, 0xe8, 0xa2, 0xdf, 0x89, 0xbc, 0x4e, 0xcf, 0xef, 0x85, 0x35, 0xa7, 0xb9, 0xdf, 0xeb, - 0x86, 0xe2, 0xb2, 0x13, 0x7b, 0xde, 0x8c, 0x0b, 0xed, 0x06, 0x2f, 0x55, 0x58, 0x0e, 0x62, 0x40, - 0xee, 0xc2, 0x0c, 0x2f, 0xaa, 0xf6, 0x22, 0xbf, 0xde, 0x74, 0x5a, 0x5e, 0x67, 0x17, 0xef, 0x40, - 0x0b, 0xb5, 0x0b, 0xcc, 0xb6, 0x74, 0x7a, 0x91, 0x6f, 0x87, 0x1c, 0xae, 0xf0, 0xeb, 0x27, 0x22, - 0x2b, 0x30, 0x6d, 0x51, 0xc7, 0xbd, 0xef, 0x3c, 0x5e, 0x74, 0xba, 0x4e, 0xd3, 0x8b, 0x0e, 0xd0, - 0x32, 0xcb, 0xd7, 0x2a, 0x47, 0x87, 0x95, 0x17, 0x02, 0xea, 0xb8, 0x76, 0xdb, 0x79, 0x6c, 0x37, - 0x45, 0xa1, 0xc2, 0x2c, 0x4d, 0x17, 0xb3, 0xf2, 0x3a, 0x31, 0xab, 0x62, 0x9a, 0x95, 0xd7, 0x19, - 0xcc, 0x2a, 0xa1, 0x93, 0xac, 0x36, 0x9d, 0x60, 0x97, 0x46, 0xfc, 0x92, 0x10, 0x2e, 0x19, 0x57, - 0x0c, 0x85, 0x55, 0x84, 0x65, 0x36, 0x5e, 0x18, 0xa6, 0x59, 0x29, 0x74, 0x6c, 0xe5, 0xed, 0x04, - 0x5e, 0x44, 0xd5, 0x1e, 0x4e, 0x60, 0xb3, 0x70, 0xfc, 0xf1, 0x9a, 0x74, 0x50, 0x17, 0xfb, 0x28, - 0x13, 0x6e, 0x4a, 0x27, 0x4b, 0x7d, 0xdc, 0xb2, 0x7b, 0xd9, 0x47, 0x19, 0x73, 0x53, 0xfb, 0x39, - 0x89, 0xfd, 0x54, 0xb8, 0x0d, 0xe8, 0x68, 0x1f, 0x25, 0x59, 0x63, 0x83, 0x16, 0xd1, 0x0e, 0x5b, - 0xd1, 0xe2, 0x92, 0x74, 0x0a, 0x9b, 0xf6, 0x8a, 0xb0, 0xa9, 0xcb, 0x81, 0x2c, 0xb6, 0x33, 0xae, - 0x4c, 0xd3, 0xc4, 0x1f, 0x8c, 0x14, 0x46, 0xcb, 0x63, 0x56, 0x99, 0x2f, 0xf9, 0x88, 0x2d, 0x1c, - 0x94, 0xc5, 0xe6, 0x6f, 0xe7, 0xe0, 0xbc, 0x14, 0xc7, 0x34, 0x7a, 0xe4, 0x07, 0xfb, 0x5e, 0x67, - 0xf7, 0x19, 0x97, 0xaa, 0xb7, 0x35, 0xa9, 0xfa, 0x4a, 0xea, 0x84, 0x4b, 0xf5, 0xf2, 0x18, 0xd1, - 0xfa, 0xe7, 0xa3, 0xf0, 0xe2, 0xb1, 0x54, 0xe4, 0x43, 0x76, 0x0a, 0x7a, 0xb4, 0x13, 0xad, 0xb8, - 0x2d, 0xca, 0xcc, 0x30, 0xbf, 0x17, 0x89, 0xcb, 0xec, 0x97, 0x8f, 0x0e, 0x2b, 0xb3, 0x3c, 0x16, - 0xc3, 0xf6, 0xdc, 0x16, 0xb5, 0x23, 0x5e, 0xac, 0x4d, 0x53, 0x3f, 0x35, 0x63, 0x19, 0x47, 0x86, - 0xad, 0x74, 0x22, 0x1a, 0x3c, 0x74, 0xb8, 0x4b, 0xba, 0x60, 0xb9, 0x4f, 0x69, 0xd7, 0x76, 0x58, - 0xa9, 0xed, 0x89, 0x62, 0x9d, 0x65, 0x1f, 0x35, 0xb9, 0xad, 0xb0, 0x5c, 0x64, 0xc6, 0xc1, 0x7d, - 0xe7, 0xb1, 0xd0, 0x78, 0xf1, 0x7e, 0x55, 0x61, 0xc9, 0xfd, 0xe1, 0xda, 0xce, 0x63, 0xab, 0x9f, - 0x84, 0x7c, 0x04, 0x67, 0x84, 0xe0, 0x66, 0x42, 0x2c, 0xf0, 0x5b, 0xb2, 0xc7, 0x23, 0xc8, 0xeb, - 0xb5, 0xa3, 0xc3, 0xca, 0x39, 0x21, 0xf6, 0xed, 0x26, 0xc7, 0xc8, 0xec, 0x75, 0x36, 0x17, 0xb2, - 0xc9, 0x0e, 0xb2, 0xd4, 0x70, 0xdc, 0xa7, 0x61, 0xe8, 0xec, 0x4a, 0xed, 0x98, 0xbf, 0x28, 0x29, - 0x83, 0x69, 0xb7, 0x79, 0xb9, 0x35, 0x90, 0x92, 0xdc, 0x85, 0xa9, 0x1d, 0xda, 0x50, 0xe7, 0x67, - 0x2c, 0xde, 0xe2, 0xe5, 0x47, 0xb4, 0x31, 0x78, 0x72, 0x52, 0x74, 0xc4, 0x83, 0x99, 0x8d, 0xc0, - 0x7f, 0x7c, 0xc0, 0x4c, 0x3d, 0xda, 0xa1, 0x01, 0x3a, 0x62, 0x8d, 0xe3, 0x75, 0xd5, 0x5c, 0xa2, - 0x59, 0xea, 0xe5, 0xb5, 0xcf, 0x1d, 0x1d, 0x56, 0x5e, 0xec, 0x32, 0xb0, 0xdd, 0x12, 0x70, 0x3b, - 0x15, 0x98, 0xd5, 0xcf, 0x95, 0xfc, 0x34, 0x4c, 0x5b, 0x7e, 0x2f, 0xf2, 0x3a, 0xbb, 0xf5, 0x28, - 0x70, 0x22, 0xba, 0xcb, 0x05, 0x79, 0xe2, 0xf1, 0x95, 0x2a, 0xe5, 0x17, 0xd3, 0x01, 0x07, 0xda, - 0xa1, 0x80, 0x6a, 0x92, 0x54, 0x27, 0x30, 0x7f, 0x33, 0x07, 0x73, 0x62, 0x1a, 0x2c, 0xda, 0xf4, - 0x03, 0xf7, 0xd9, 0xdf, 0xf6, 0xcb, 0xda, 0xb6, 0x7f, 0x39, 0xf6, 0x51, 0xca, 0xea, 0xe4, 0x31, - 0xbb, 0xfe, 0x9f, 0x1b, 0x70, 0xf1, 0x38, 0x22, 0x36, 0x3a, 0xb1, 0x0f, 0x5e, 0xb1, 0xcf, 0xd7, - 0xae, 0x0b, 0xb3, 0x38, 0x9f, 0x78, 0x71, 0x1c, 0xde, 0xf5, 0xc3, 0x08, 0x6f, 0xef, 0x72, 0x9a, - 0x23, 0x41, 0xcd, 0xf7, 0x5b, 0x28, 0xe7, 0x6b, 0xaf, 0x33, 0x71, 0xfe, 0x17, 0x87, 0x15, 0x60, - 0xa0, 0x75, 0x7c, 0x8c, 0x64, 0x67, 0x3e, 0x5f, 0x31, 0x78, 0x2f, 0x1d, 0xda, 0xe8, 0xfd, 0xb1, - 0x4f, 0x0f, 0x42, 0x2b, 0x8b, 0x35, 0xde, 0xd0, 0x54, 0x7b, 0xd1, 0xde, 0x46, 0x40, 0x1f, 0xd0, - 0x80, 0x76, 0x9a, 0xf4, 0x39, 0xbb, 0xa1, 0xd1, 0x3b, 0x37, 0x94, 0x79, 0xf2, 0xff, 0xc6, 0xe0, - 0x74, 0x16, 0x19, 0x1b, 0x17, 0x45, 0x23, 0x4e, 0x47, 0xf1, 0xfe, 0x5d, 0x03, 0x4a, 0x75, 0xda, - 0xf4, 0x3b, 0xee, 0x6d, 0xa7, 0x19, 0xf9, 0xd2, 0x25, 0xc3, 0xe6, 0x92, 0x8d, 0xc1, 0xed, 0x07, - 0x58, 0xa0, 0xdd, 0x0c, 0x7c, 0x65, 0x38, 0x45, 0xb4, 0xe9, 0xa3, 0xd3, 0x6a, 0xc4, 0xd6, 0x64, - 0x52, 0x05, 0xbe, 0x6a, 0x68, 0x95, 0x92, 0x1a, 0x4c, 0x2e, 0xfa, 0x9d, 0x0e, 0x65, 0x3f, 0x14, - 0x17, 0xcc, 0x8b, 0x47, 0x87, 0x95, 0xb9, 0xa6, 0x2c, 0x48, 0xdf, 0x10, 0xe8, 0x24, 0xe4, 0x26, - 0xe4, 0xb7, 0x16, 0x6e, 0x8b, 0x39, 0x90, 0xce, 0x6a, 0x5b, 0x0b, 0xb7, 0xd1, 0xd6, 0x65, 0xfa, - 0xc3, 0x64, 0x6f, 0xe1, 0x81, 0x7a, 0x07, 0xba, 0xb5, 0x70, 0x9b, 0xac, 0xc3, 0x8c, 0x45, 0x7f, - 0xa6, 0xe7, 0x05, 0x54, 0x6c, 0x80, 0xfb, 0xb7, 0xab, 0x38, 0x17, 0x05, 0x2e, 0xc7, 0x02, 0x5e, - 0x28, 0x75, 0x7b, 0xbb, 0xfd, 0x40, 0x8d, 0x5c, 0xeb, 0xa7, 0x25, 0xbf, 0x00, 0x67, 0x96, 0xbc, - 0x50, 0xb4, 0x99, 0x5f, 0x3e, 0xba, 0xf8, 0x0e, 0x39, 0x36, 0x60, 0x3b, 0x7c, 0x29, 0x73, 0x3b, - 0x7c, 0xce, 0x8d, 0x99, 0xd8, 0xfc, 0x66, 0xd3, 0x4d, 0xfb, 0xae, 0x66, 0xd7, 0x43, 0x3e, 0x86, - 0x29, 0xbc, 0xed, 0xc1, 0xfb, 0x58, 0x74, 0x67, 0x1e, 0x1f, 0x50, 0xf3, 0x17, 0x32, 0x6b, 0xbe, - 0x80, 0x97, 0x47, 0x36, 0xde, 0xea, 0xa2, 0xeb, 0xb3, 0x66, 0x23, 0x68, 0x9c, 0xc9, 0x07, 0x30, - 0x2d, 0x0e, 0x9d, 0xf5, 0x07, 0x9b, 0x7b, 0x74, 0xc9, 0x39, 0x10, 0x4e, 0x08, 0xa8, 0xff, 0x89, - 0x93, 0xca, 0xf6, 0x1f, 0xd8, 0xd1, 0x1e, 0xb5, 0x5d, 0x47, 0x13, 0xcf, 0x29, 0x42, 0xf2, 0x73, - 0x30, 0xb1, 0xea, 0xe3, 0xc3, 0x13, 0x8a, 0x9a, 0x22, 0xf2, 0xf9, 0x1a, 0x46, 0xae, 0x72, 0x70, - 0xea, 0x10, 0xf9, 0xd1, 0x61, 0xe5, 0xed, 0x27, 0x5d, 0x85, 0x4a, 0x05, 0x96, 0x5a, 0x1b, 0x59, - 0x84, 0xc2, 0x0e, 0x6d, 0xb0, 0xde, 0xa6, 0xa3, 0xae, 0x24, 0x98, 0xcb, 0x8b, 0x47, 0xe2, 0x97, - 0xfa, 0xaa, 0x23, 0x31, 0xcc, 0x7f, 0x63, 0xe0, 0x0a, 0x24, 0xd7, 0xd0, 0x11, 0x2c, 0xf6, 0x06, - 0x47, 0xcb, 0xd2, 0xe9, 0x76, 0x75, 0x7f, 0x6e, 0x8e, 0xc2, 0xcc, 0xd0, 0xdb, 0x4e, 0x93, 0x46, - 0xf2, 0xbe, 0x12, 0x91, 0x1f, 0x20, 0x44, 0x35, 0x43, 0x39, 0x0e, 0xf9, 0x2a, 0x9c, 0x5e, 0xa2, - 0x0f, 0xbd, 0x26, 0xad, 0x46, 0x11, 0x0d, 0x79, 0x6f, 0x17, 0xab, 0xfc, 0x61, 0xaf, 0x58, 0x7b, - 0xe5, 0xe8, 0xb0, 0x72, 0xc9, 0xc5, 0x72, 0xdb, 0x49, 0x10, 0xec, 0xa6, 0xa3, 0xf2, 0xca, 0xe4, - 0x60, 0xfe, 0xc3, 0x5c, 0x32, 0x02, 0xe4, 0x35, 0x18, 0xb1, 0x36, 0xe2, 0xf6, 0xf3, 0x37, 0xbb, - 0x54, 0xf3, 0x11, 0x81, 0x7c, 0x1d, 0xce, 0x28, 0x7c, 0x70, 0x71, 0x50, 0x97, 0x35, 0x88, 0x77, - 0xe6, 0x55, 0x7c, 0xa4, 0x51, 0x5a, 0xe2, 0x70, 0x8c, 0x54, 0x8b, 0xb2, 0x79, 0xb0, 0xce, 0x2a, - 0x05, 0x4b, 0xb4, 0xe3, 0x71, 0xde, 0x4a, 0x67, 0x55, 0xde, 0x2e, 0x22, 0xa4, 0x3b, 0x9b, 0xc5, - 0x81, 0x2c, 0x40, 0x61, 0xc9, 0x0b, 0x99, 0x45, 0xe0, 0x0a, 0x8f, 0x2e, 0x1e, 0xc8, 0x26, 0x60, - 0x5a, 0x20, 0x9b, 0x80, 0x99, 0x7f, 0x6d, 0x28, 0x09, 0x03, 0x9e, 0xd1, 0xb3, 0xe6, 0x96, 0x76, - 0xd6, 0x9c, 0x16, 0xa4, 0x71, 0xaf, 0x58, 0x59, 0xa6, 0x7e, 0x30, 0x0d, 0x93, 0x1a, 0x12, 0x3a, - 0xc8, 0x6e, 0x85, 0x34, 0xe0, 0xb7, 0x89, 0xcf, 0x97, 0x83, 0x6c, 0xdc, 0xaf, 0xa1, 0xfc, 0x1e, - 0xff, 0xd2, 0x80, 0xe9, 0x14, 0x05, 0x1b, 0x0d, 0x06, 0x52, 0x47, 0xa3, 0x17, 0xd2, 0xc0, 0x42, - 0x28, 0x77, 0xa7, 0x5b, 0xd5, 0xdd, 0xe9, 0x5a, 0x16, 0x83, 0x91, 0xaf, 0xc0, 0xe8, 0x16, 0xea, - 0xfe, 0xba, 0x47, 0x46, 0xcc, 0x1f, 0x0b, 0xf9, 0x7e, 0xec, 0xb1, 0x7f, 0x55, 0x71, 0x82, 0x65, - 0xa4, 0x0e, 0xe3, 0x8b, 0x01, 0xc5, 0xd4, 0x00, 0x23, 0xc3, 0x3f, 0x9d, 0x35, 0x39, 0x49, 0xfa, - 0xe9, 0x4c, 0x70, 0x32, 0x7f, 0x23, 0x07, 0x24, 0xe9, 0x23, 0x6d, 0x06, 0x34, 0x0a, 0x9f, 0xd9, - 0x49, 0x7f, 0x5f, 0x9b, 0xf4, 0x17, 0xfb, 0x26, 0x9d, 0x77, 0x6f, 0xa8, 0xb9, 0xff, 0x13, 0x03, - 0xce, 0x66, 0x13, 0x92, 0x97, 0x61, 0x6c, 0x7d, 0x73, 0x43, 0x3a, 0xf5, 0x88, 0xae, 0xf8, 0x5d, - 0xd4, 0x69, 0x2d, 0x51, 0x44, 0xde, 0x80, 0xb1, 0x0f, 0xad, 0x45, 0x76, 0xd8, 0x29, 0x31, 0x2a, - 0x3f, 0x13, 0xd8, 0x4d, 0xdd, 0x58, 0x12, 0x48, 0xea, 0xdc, 0xe6, 0x9f, 0xda, 0xdc, 0x7e, 0x2b, - 0x07, 0xd3, 0xd5, 0x66, 0x93, 0x86, 0x21, 0x53, 0x65, 0x68, 0x18, 0x3d, 0xb3, 0x13, 0x9b, 0xed, - 0xae, 0xa3, 0xf5, 0x6d, 0xa8, 0x59, 0xfd, 0x53, 0x03, 0xce, 0x48, 0xaa, 0x87, 0x1e, 0x7d, 0xb4, - 0xb9, 0x17, 0xd0, 0x70, 0xcf, 0x6f, 0xb9, 0xc3, 0x46, 0x5b, 0xe1, 0x99, 0xee, 0xb5, 0x22, 0x1a, - 0xa8, 0x57, 0xcb, 0x0f, 0x10, 0xa2, 0x9d, 0xe9, 0x08, 0x21, 0xf3, 0x30, 0x5e, 0xed, 0x76, 0x03, - 0xff, 0x21, 0xdf, 0xf6, 0x93, 0xe2, 0x25, 0x91, 0x83, 0xb4, 0x97, 0x47, 0x0e, 0x62, 0xcd, 0x58, - 0xa2, 0x1d, 0xee, 0x8b, 0x3c, 0xc9, 0x9b, 0xe1, 0xd2, 0x8e, 0xaa, 0x5b, 0x61, 0xb9, 0xf9, 0xcd, - 0x11, 0x28, 0xa9, 0x1d, 0x21, 0x26, 0x8c, 0x71, 0xc7, 0x12, 0xf5, 0x81, 0xdf, 0x41, 0x88, 0x25, - 0x4a, 0x12, 0x7f, 0x9d, 0xdc, 0x89, 0xfe, 0x3a, 0x3b, 0x30, 0xb9, 0x11, 0xf8, 0x5d, 0x3f, 0xa4, - 0x2e, 0xcf, 0xee, 0xc2, 0xa5, 0xd6, 0x6c, 0xec, 0xc4, 0xca, 0xc7, 0x9c, 0x15, 0x71, 0x45, 0xbe, - 0x2b, 0xb0, 0xed, 0x74, 0xee, 0x17, 0x9d, 0x0f, 0xbf, 0x9a, 0x77, 0x42, 0xe1, 0xe8, 0x1f, 0x5f, - 0xcd, 0x33, 0x88, 0x7e, 0x35, 0xcf, 0x20, 0xea, 0xb6, 0x18, 0x7d, 0x5a, 0xdb, 0x82, 0xfc, 0x86, - 0x01, 0x13, 0xd5, 0x4e, 0x47, 0xf8, 0xeb, 0xc8, 0x10, 0xe9, 0x33, 0xc9, 0xf5, 0x3c, 0x77, 0xe8, - 0xe4, 0xb7, 0xf3, 0xdf, 0x10, 0xb7, 0xf3, 0x6f, 0x7f, 0xa2, 0xdb, 0xf9, 0xcd, 0xc0, 0xf1, 0xa2, - 0x10, 0x9f, 0x61, 0x93, 0x0a, 0x55, 0xa7, 0x5d, 0xa5, 0x1d, 0xe4, 0x6d, 0x28, 0xc7, 0xeb, 0x71, - 0xa5, 0xe3, 0xd2, 0xc7, 0x94, 0xbb, 0x37, 0x4d, 0xf2, 0x38, 0x3e, 0xed, 0xd9, 0x21, 0x8d, 0x68, - 0x7e, 0xcb, 0x80, 0xb3, 0xea, 0x82, 0xa8, 0xf7, 0x1a, 0x6d, 0x0f, 0x0d, 0x17, 0x72, 0x1d, 0x8a, - 0x62, 0xbe, 0x62, 0xb5, 0xaf, 0x3f, 0x25, 0x50, 0x82, 0x42, 0x96, 0xd9, 0x14, 0x31, 0x1e, 0xc2, - 0xca, 0x9f, 0x4d, 0x6d, 0x37, 0x56, 0x54, 0x9b, 0x13, 0x83, 0x5d, 0x0e, 0xf0, 0xb7, 0x3e, 0x77, - 0x0c, 0x62, 0xbe, 0x07, 0x33, 0x7a, 0x2b, 0xeb, 0x14, 0x83, 0xc7, 0x64, 0xd7, 0x8c, 0xec, 0xae, - 0xc9, 0x72, 0x73, 0x07, 0x48, 0x1f, 0x7d, 0x88, 0x4f, 0x4c, 0x34, 0x92, 0x4f, 0xa0, 0xf2, 0xa2, - 0xaa, 0x0f, 0x31, 0x4e, 0x8e, 0x35, 0xa1, 0x0e, 0x37, 0x92, 0x9a, 0x7f, 0x53, 0x84, 0xd9, 0x0c, - 0xd1, 0x71, 0xc2, 0xd1, 0x5e, 0xd1, 0x37, 0x4f, 0x31, 0x7e, 0xcb, 0x97, 0x5b, 0xe6, 0x3d, 0x99, - 0x08, 0xe9, 0x98, 0xad, 0x72, 0x5c, 0x76, 0xa4, 0xcf, 0xe2, 0x78, 0x57, 0xdd, 0x6d, 0x46, 0x9f, - 0x9a, 0xbb, 0x4d, 0x0d, 0x26, 0x45, 0xaf, 0xc4, 0x56, 0x1e, 0x4b, 0x0c, 0xfa, 0x80, 0x17, 0xd8, - 0x7d, 0x5b, 0x5a, 0x27, 0xe1, 0x3c, 0x42, 0xbf, 0xf5, 0x90, 0x0a, 0x1e, 0xe3, 0x2a, 0x0f, 0x2c, - 0xc8, 0xe4, 0xa1, 0x90, 0x90, 0x3f, 0x32, 0x80, 0x08, 0x88, 0xba, 0x9f, 0x0b, 0xc7, 0xed, 0x67, - 0xf7, 0xe9, 0xec, 0xe7, 0x17, 0x65, 0x1b, 0xb3, 0xf7, 0x75, 0x46, 0xb3, 0xc8, 0x3f, 0x35, 0x60, - 0x86, 0xfb, 0x7c, 0xa8, 0x8d, 0x2d, 0x1e, 0xd7, 0xd8, 0xe6, 0xd3, 0x69, 0xec, 0xc5, 0x10, 0xab, - 0x1d, 0xd0, 0xd6, 0xfe, 0x46, 0x91, 0x9f, 0x04, 0x88, 0x77, 0x94, 0xf4, 0x2d, 0xbc, 0x98, 0x21, - 0x05, 0x62, 0xa4, 0x24, 0x3c, 0x32, 0x8a, 0xe9, 0x54, 0x6f, 0x9c, 0x84, 0x1b, 0xf9, 0x05, 0x38, - 0xcd, 0xf6, 0x4b, 0x0c, 0x11, 0x1e, 0x6a, 0x73, 0x13, 0x58, 0xcb, 0x17, 0x07, 0x1f, 0xed, 0xd7, - 0xb3, 0xc8, 0x78, 0x84, 0x47, 0x12, 0x2c, 0x1f, 0xb5, 0x55, 0x03, 0x31, 0x8b, 0x02, 0x5d, 0x51, - 0xb1, 0xf5, 0xe1, 0x5c, 0x09, 0xeb, 0xcc, 0x94, 0x6f, 0xe7, 0xe5, 0x5e, 0xe0, 0xf2, 0x2d, 0xd4, - 0x43, 0x34, 0x10, 0x44, 0x3e, 0x04, 0x52, 0xef, 0xed, 0xee, 0xd2, 0x30, 0xa2, 0x2e, 0x87, 0xd1, - 0x20, 0x9c, 0x9b, 0x44, 0xf9, 0x80, 0x17, 0x4c, 0xa1, 0x2c, 0xb5, 0x03, 0x59, 0xac, 0x2e, 0x92, - 0x7e, 0xe2, 0x0b, 0x0d, 0x38, 0x3f, 0xb0, 0x9b, 0x19, 0xe1, 0x17, 0xf3, 0x7a, 0xf8, 0xc5, 0xf9, - 0x41, 0xe2, 0x30, 0x54, 0x43, 0x30, 0x7e, 0xd7, 0x48, 0xc9, 0x3f, 0xa1, 0xac, 0xf0, 0x9c, 0x71, - 0x83, 0x0e, 0x88, 0x1c, 0x86, 0xd1, 0x73, 0x09, 0x99, 0x4b, 0x94, 0x24, 0x26, 0x21, 0x55, 0x09, - 0x8b, 0xb2, 0xf2, 0x53, 0x8a, 0x42, 0xf3, 0x5f, 0x1a, 0x40, 0x78, 0x0b, 0x17, 0x9d, 0xae, 0xd3, - 0xf0, 0x5a, 0x5e, 0xe4, 0xd1, 0x90, 0xdc, 0x83, 0xb2, 0x60, 0xc1, 0xcc, 0x76, 0xd5, 0xb3, 0x4a, - 0x3c, 0xbd, 0xc6, 0x65, 0x76, 0x5a, 0xad, 0xe9, 0x23, 0x1c, 0x30, 0x79, 0xb9, 0x4f, 0x31, 0x79, - 0xe6, 0x0f, 0x0d, 0x38, 0xdf, 0xdf, 0x6c, 0x51, 0x73, 0x3c, 0x78, 0xc6, 0x09, 0x83, 0x97, 0xd5, - 0xcb, 0x1c, 0x5e, 0x64, 0x3c, 0xb5, 0x5e, 0xe6, 0x93, 0x3b, 0xd0, 0x27, 0xef, 0xe5, 0xaf, 0xe4, - 0xa0, 0xb4, 0xd1, 0xea, 0xed, 0x7a, 0x9d, 0x25, 0x27, 0x72, 0x9e, 0x59, 0x93, 0xe2, 0x2d, 0xcd, - 0xa4, 0x88, 0x7d, 0xa9, 0xe2, 0x8e, 0x0d, 0x97, 0xbf, 0xcb, 0x80, 0xe9, 0x84, 0x84, 0xef, 0xd2, - 0xbb, 0x30, 0xc2, 0x7e, 0x08, 0x0d, 0xe5, 0x52, 0x1f, 0x63, 0xc4, 0xba, 0x1e, 0xff, 0x27, 0x94, - 0x7c, 0x3d, 0x6b, 0x1a, 0x72, 0xb8, 0xf0, 0x25, 0x9e, 0xf4, 0xe8, 0xc9, 0x13, 0x34, 0xfe, 0x0b, - 0x03, 0xca, 0xe9, 0x9e, 0x90, 0x7b, 0x30, 0xce, 0x38, 0x79, 0x71, 0x02, 0xa5, 0x57, 0x06, 0xf4, - 0xf9, 0xba, 0x40, 0xe3, 0xcd, 0xc3, 0xc1, 0xa7, 0x1c, 0x62, 0x49, 0x0e, 0x17, 0x2c, 0x28, 0xa9, - 0x58, 0x19, 0xad, 0x7b, 0x5d, 0x17, 0x4d, 0x67, 0xb3, 0xc7, 0x41, 0x6d, 0xf5, 0xef, 0x68, 0xad, - 0x16, 0x42, 0x69, 0xd8, 0x4c, 0x78, 0x18, 0x4c, 0xc6, 0xf3, 0x7d, 0xa8, 0xeb, 0x4c, 0xa6, 0x06, - 0xd1, 0x83, 0xc9, 0x38, 0x8c, 0xd9, 0x22, 0xbc, 0x3e, 0xb1, 0xce, 0xd0, 0x16, 0xe9, 0x22, 0x44, - 0xd5, 0x67, 0x39, 0x8e, 0xf9, 0x0f, 0xf2, 0x70, 0x36, 0x69, 0x1e, 0xcf, 0x0b, 0xb8, 0xe1, 0x04, - 0x4e, 0x3b, 0x3c, 0x61, 0x07, 0x5c, 0xe9, 0x6b, 0x1a, 0x06, 0x4b, 0xcb, 0xa6, 0x29, 0x0d, 0x32, - 0x53, 0x0d, 0x42, 0x23, 0x8e, 0x37, 0x48, 0x36, 0x83, 0xdc, 0x83, 0x7c, 0x9d, 0x46, 0x22, 0xa4, - 0xf2, 0x72, 0xdf, 0xa8, 0xaa, 0xed, 0xba, 0x5e, 0xa7, 0x11, 0x9f, 0x44, 0xee, 0x95, 0x4e, 0x35, - 0x2f, 0x71, 0xa6, 0x8e, 0xef, 0xc0, 0xd8, 0xf2, 0xe3, 0x2e, 0x6d, 0x46, 0x22, 0x92, 0xf2, 0xea, - 0xf1, 0xfc, 0x38, 0xae, 0x12, 0xaf, 0x49, 0x11, 0xa0, 0x0e, 0x16, 0x47, 0xb9, 0x70, 0x0b, 0x0a, - 0xb2, 0xf2, 0x27, 0x8a, 0x3b, 0x7c, 0x0b, 0x26, 0x94, 0x4a, 0x9e, 0x68, 0xd1, 0xff, 0x8d, 0x01, - 0x63, 0x4c, 0xe8, 0x6d, 0xbf, 0xf9, 0x8c, 0x4a, 0xa4, 0x9b, 0x9a, 0x44, 0x9a, 0x51, 0x02, 0x64, - 0x70, 0x5f, 0xbe, 0x79, 0x82, 0x2c, 0x3a, 0x34, 0x00, 0x12, 0x64, 0x72, 0x07, 0xc6, 0xf9, 0xb3, - 0x8f, 0x4c, 0xba, 0xa9, 0x46, 0xdc, 0x88, 0x92, 0x44, 0xcb, 0xf1, 0xbb, 0x69, 0xb5, 0x50, 0x52, - 0x93, 0xa5, 0xc4, 0x2b, 0x59, 0x0d, 0xf1, 0x64, 0x6c, 0x16, 0xfd, 0x0e, 0x8f, 0xc0, 0x08, 0x95, - 0xe4, 0x54, 0xd9, 0xee, 0xc9, 0x55, 0x71, 0xb1, 0x91, 0x3f, 0x8e, 0xc9, 0x59, 0xc1, 0x24, 0xfb, - 0xce, 0xe3, 0xdb, 0x13, 0x3c, 0xa6, 0x41, 0x36, 0xec, 0x5d, 0x28, 0xdd, 0xf6, 0x83, 0x47, 0x4e, - 0xe0, 0x56, 0x77, 0xa9, 0xf0, 0x27, 0x2f, 0xa0, 0x53, 0xf8, 0xe4, 0x03, 0x0e, 0xb7, 0x1d, 0x56, - 0xf0, 0xa3, 0xc3, 0xca, 0x48, 0xcd, 0xf7, 0x5b, 0x96, 0x86, 0x4e, 0xd6, 0x61, 0xf2, 0xbe, 0xf3, - 0x58, 0xbc, 0xee, 0x6d, 0x6e, 0xae, 0x0a, 0xaf, 0x94, 0xab, 0x47, 0x87, 0x95, 0xf3, 0x6d, 0xe7, - 0x71, 0xfc, 0x2a, 0x38, 0xd8, 0x71, 0x5a, 0xa7, 0x27, 0x1e, 0x4c, 0x6d, 0xf8, 0x41, 0x24, 0x2a, - 0x61, 0x3a, 0x6d, 0x7e, 0xc0, 0xe3, 0xdc, 0x7c, 0xe6, 0xe3, 0xdc, 0x79, 0xa6, 0xc8, 0xdb, 0x0f, - 0x62, 0x72, 0x2d, 0x10, 0x4f, 0x63, 0x4c, 0xde, 0x85, 0x99, 0x45, 0x1a, 0x44, 0xde, 0x03, 0xaf, - 0xe9, 0x44, 0xf4, 0xb6, 0x1f, 0xb4, 0x9d, 0x48, 0x5c, 0xa8, 0xa0, 0x41, 0xdd, 0xa4, 0x9c, 0x53, - 0xdb, 0x89, 0xac, 0x7e, 0x4c, 0xf2, 0xf5, 0x2c, 0x3f, 0x9f, 0x51, 0xec, 0xfe, 0x1b, 0x4c, 0x29, - 0xc8, 0xf0, 0xf3, 0x19, 0x30, 0x04, 0x19, 0x1e, 0x3f, 0xbb, 0xc7, 0x3d, 0x92, 0x16, 0x6a, 0x37, - 0xc4, 0x83, 0xed, 0xc9, 0x8f, 0xa0, 0xf1, 0xbc, 0x0d, 0x78, 0x0c, 0x5d, 0x80, 0x7c, 0x6d, 0xe3, - 0x36, 0x5e, 0x91, 0x88, 0x47, 0x49, 0xda, 0xd9, 0x73, 0x3a, 0x4d, 0xd4, 0x65, 0x84, 0xa7, 0x83, - 0x2a, 0xf0, 0x6a, 0x1b, 0xb7, 0x89, 0x03, 0xb3, 0x1b, 0x34, 0x68, 0x7b, 0xd1, 0x57, 0x6f, 0xdc, - 0x50, 0x26, 0xaa, 0x80, 0x4d, 0x9b, 0x17, 0x4d, 0xab, 0x74, 0x11, 0xc5, 0x7e, 0x7c, 0xe3, 0x46, - 0xe6, 0x74, 0xc4, 0x0d, 0xcb, 0xe2, 0x45, 0x96, 0x61, 0xea, 0xbe, 0xf3, 0x58, 0x3c, 0x5f, 0xc7, - 0x36, 0x5e, 0x1e, 0xfd, 0xe8, 0x71, 0x61, 0x35, 0x93, 0x22, 0x75, 0x8a, 0x75, 0x22, 0xf2, 0x0e, - 0x4c, 0x24, 0xcb, 0x2b, 0xc4, 0x87, 0xcb, 0x3c, 0x77, 0xa0, 0x54, 0x16, 0xa7, 0x76, 0x97, 0xa4, - 0xa0, 0x93, 0xad, 0xd8, 0x44, 0xe7, 0x0a, 0x29, 0xba, 0x15, 0x16, 0x6b, 0xf3, 0xaa, 0x89, 0xee, - 0x60, 0x89, 0xd6, 0xad, 0xe9, 0x58, 0x45, 0xe7, 0x7e, 0x35, 0x96, 0xce, 0x45, 0xb1, 0xfc, 0x37, - 0x02, 0xbf, 0xdd, 0x8d, 0xd0, 0xbf, 0x30, 0x65, 0xf9, 0x77, 0xb1, 0x24, 0xc3, 0xf2, 0xe7, 0x24, - 0xd9, 0xaf, 0xf2, 0x93, 0x9f, 0xe2, 0x55, 0x9e, 0xc2, 0xc8, 0xaa, 0xdf, 0xdc, 0x47, 0x87, 0xc2, - 0x62, 0xed, 0x43, 0x26, 0x3f, 0x5a, 0x7e, 0x73, 0xff, 0xe9, 0xbd, 0x26, 0x23, 0x7b, 0xb2, 0xc6, - 0xfa, 0xce, 0x96, 0x95, 0xa8, 0x7a, 0x6e, 0x5a, 0x7b, 0x69, 0xd3, 0xca, 0xb8, 0xa2, 0xc2, 0x57, - 0xa1, 0xec, 0x88, 0xa5, 0x93, 0x13, 0x0a, 0xe5, 0x25, 0x1a, 0xee, 0x47, 0x7e, 0x77, 0xb1, 0xe5, - 0x75, 0x1b, 0xbe, 0x13, 0xb8, 0x73, 0xe5, 0x01, 0x02, 0xe3, 0xb5, 0x4c, 0x81, 0x31, 0xe3, 0x72, - 0x7a, 0xbb, 0x29, 0x19, 0x58, 0x7d, 0x2c, 0xc9, 0xd7, 0x61, 0x8a, 0xed, 0x96, 0xe5, 0xc7, 0x11, - 0xed, 0xf0, 0xa5, 0x34, 0x83, 0x47, 0xfd, 0x69, 0x25, 0x24, 0x31, 0x2e, 0xe4, 0x8b, 0x14, 0xa5, - 0x07, 0x8d, 0x09, 0xd4, 0x45, 0xaa, 0xb3, 0x32, 0x7f, 0x32, 0x35, 0x26, 0x64, 0x05, 0xc6, 0x45, - 0x0b, 0xc4, 0xa9, 0xd3, 0xdf, 0x97, 0x17, 0x33, 0xfb, 0x32, 0x2e, 0xfa, 0x62, 0x49, 0x7a, 0xf3, - 0xdf, 0x19, 0x30, 0xa9, 0x55, 0x47, 0x6e, 0x29, 0xce, 0x2e, 0x89, 0x93, 0x9a, 0x86, 0x93, 0x99, - 0xcc, 0xfe, 0x96, 0xf0, 0x70, 0xca, 0x0d, 0xa6, 0xcb, 0xcc, 0x33, 0x26, 0x53, 0x04, 0xe4, 0x8f, - 0x4f, 0x11, 0x30, 0x32, 0x20, 0x45, 0xc0, 0xb7, 0x27, 0x61, 0x4a, 0x3f, 0xe0, 0x98, 0xc6, 0xb9, - 0xea, 0xef, 0x7a, 0x1d, 0x69, 0xb7, 0xf2, 0xa4, 0x17, 0x08, 0xd1, 0x32, 0xc3, 0x23, 0x84, 0xbc, - 0x0a, 0x10, 0x3f, 0xcd, 0x4a, 0xd3, 0x54, 0xe4, 0xb1, 0x57, 0x0a, 0xc8, 0x4f, 0x01, 0xac, 0xf9, - 0x2e, 0x8d, 0xf3, 0xa6, 0x1c, 0x73, 0xa1, 0xf4, 0x9a, 0xb8, 0x50, 0x12, 0xb9, 0xe7, 0x8f, 0x0e, - 0x2b, 0x67, 0x3a, 0xbe, 0x4b, 0xfb, 0x13, 0xa6, 0x28, 0x1c, 0xc9, 0x97, 0x61, 0xd4, 0xea, 0xb5, - 0xa8, 0x4c, 0xe3, 0x31, 0x21, 0x17, 0x7c, 0xaf, 0xa5, 0xe4, 0xa4, 0x0c, 0x7a, 0xe9, 0x77, 0x04, - 0x06, 0x20, 0xef, 0x03, 0xdc, 0xeb, 0x35, 0xe8, 0x9d, 0xc0, 0xef, 0x75, 0x65, 0x9c, 0x30, 0x9a, - 0xb1, 0xfb, 0x71, 0xd2, 0x27, 0x7b, 0x17, 0x0b, 0xd5, 0xca, 0x13, 0x12, 0xb2, 0x0e, 0xe3, 0x42, - 0x7c, 0x88, 0x7b, 0xfa, 0x97, 0xb2, 0x6e, 0x88, 0x14, 0x1d, 0x42, 0xe4, 0xd5, 0x40, 0xb0, 0x7e, - 0x69, 0xc3, 0xcd, 0xf0, 0x77, 0xa0, 0xc8, 0xd8, 0x33, 0x53, 0x3b, 0x14, 0x67, 0x07, 0x7a, 0x1b, - 0x2a, 0x0d, 0x62, 0x66, 0xb9, 0x96, 0xdd, 0x2b, 0x26, 0x20, 0x5f, 0xc7, 0x4c, 0x38, 0x62, 0xa8, - 0x8f, 0xbd, 0x68, 0xbc, 0xdc, 0x37, 0xd4, 0xa7, 0x9d, 0x6e, 0x37, 0x23, 0x75, 0x58, 0xcc, 0x8f, - 0xec, 0xc6, 0x11, 0x39, 0x71, 0x62, 0xe2, 0x63, 0x2a, 0xb8, 0xd6, 0x57, 0xc1, 0x9c, 0x0c, 0x32, - 0xe9, 0xcf, 0x7f, 0xa3, 0xf1, 0x25, 0x5d, 0x28, 0x27, 0x49, 0xb7, 0x44, 0x5d, 0x70, 0x5c, 0x5d, - 0x6f, 0xf4, 0xd5, 0xa5, 0x4e, 0x60, 0x5f, 0x75, 0x7d, 0xdc, 0x89, 0x9b, 0x24, 0x91, 0x15, 0xf5, - 0x4d, 0x1c, 0x57, 0xdf, 0xab, 0x7d, 0xf5, 0xcd, 0xba, 0x8d, 0xfe, 0x7a, 0x52, 0x3c, 0xc9, 0x3b, - 0x30, 0x29, 0x21, 0xb8, 0x3f, 0xf0, 0x82, 0x4f, 0xe8, 0xf7, 0x6e, 0x03, 0x5d, 0xcc, 0xf4, 0xe4, - 0x2f, 0x2a, 0xb2, 0x4a, 0xcd, 0x57, 0xc7, 0xa4, 0x46, 0x9d, 0x5e, 0x15, 0x3a, 0x32, 0xf9, 0x1a, - 0x4c, 0xac, 0xb4, 0x59, 0x47, 0xfc, 0x8e, 0x13, 0x51, 0x3c, 0x8c, 0x92, 0x4b, 0x53, 0xa5, 0x44, - 0x59, 0xaa, 0x3c, 0x23, 0x64, 0x52, 0xa4, 0x1e, 0xe6, 0x0a, 0x05, 0x1b, 0x3c, 0x7e, 0xfd, 0x22, - 0xd6, 0x70, 0x28, 0x8e, 0x9e, 0x17, 0x33, 0x2e, 0x2e, 0x15, 0xf6, 0x28, 0xcb, 0xf9, 0xad, 0x8e, - 0x2d, 0x36, 0x84, 0x36, 0x78, 0x3a, 0x4f, 0xf2, 0x2e, 0x4c, 0x88, 0xf8, 0xc7, 0xaa, 0xb5, 0x16, - 0xce, 0x95, 0xb1, 0xf3, 0x98, 0xb9, 0x4d, 0x86, 0x4a, 0xda, 0x4e, 0x90, 0x7a, 0xbd, 0x4a, 0xf0, - 0xc9, 0x57, 0xe1, 0xf4, 0x8e, 0xd7, 0x71, 0xfd, 0x47, 0xa1, 0x10, 0xe0, 0x42, 0xd0, 0xcd, 0x24, - 0x1e, 0x3d, 0x8f, 0x78, 0xb9, 0x2d, 0x8f, 0xad, 0x3e, 0xc1, 0x97, 0xc9, 0x81, 0xfc, 0x7c, 0x1f, - 0x67, 0xbe, 0x82, 0xc8, 0x71, 0x2b, 0x68, 0xa1, 0x6f, 0x05, 0xf5, 0x57, 0x9f, 0x5e, 0x4e, 0x99, - 0xd5, 0x10, 0x1f, 0x88, 0xae, 0x73, 0x7c, 0xe0, 0x7b, 0x9d, 0xb9, 0x59, 0xed, 0xb3, 0x1f, 0xb1, - 0x83, 0x2d, 0xe2, 0x6d, 0xf8, 0x2d, 0xaf, 0x79, 0x50, 0x33, 0x8f, 0x0e, 0x2b, 0x2f, 0xa5, 0xb5, - 0x99, 0x8f, 0x7d, 0xed, 0x72, 0x21, 0x83, 0x35, 0xf9, 0x1a, 0x94, 0xd8, 0xdf, 0x58, 0xf5, 0x3b, - 0xad, 0x3d, 0x75, 0x29, 0x98, 0xa2, 0x1e, 0x9c, 0x23, 0x0c, 0xd0, 0xcc, 0xd0, 0x0a, 0x35, 0x56, - 0xe6, 0x0f, 0x0d, 0x38, 0x9d, 0xd5, 0xd6, 0x13, 0xb2, 0xe1, 0x98, 0xa9, 0x47, 0x6f, 0xbc, 0x97, - 0xe0, 0x8f, 0xde, 0xf1, 0x53, 0x77, 0x05, 0x46, 0x99, 0xad, 0x2c, 0x5d, 0xb8, 0xf0, 0x38, 0x64, - 0xf6, 0x74, 0x68, 0x71, 0x38, 0x43, 0x40, 0xd7, 0x7b, 0x3c, 0x2f, 0x47, 0x39, 0x02, 0xfa, 0xe7, - 0x5b, 0x1c, 0xce, 0x10, 0xd8, 0xb1, 0x2b, 0x8f, 0x09, 0x44, 0x60, 0xa7, 0x71, 0x68, 0x71, 0x38, - 0xb9, 0x0c, 0xe3, 0xeb, 0x9d, 0x55, 0xea, 0x3c, 0xa4, 0xe2, 0xc5, 0x09, 0xef, 0x51, 0xfc, 0x8e, - 0xdd, 0x62, 0x30, 0x4b, 0x16, 0x9a, 0xdf, 0x35, 0x60, 0xa6, 0x6f, 0x98, 0x4e, 0x4e, 0xf8, 0x73, - 0xfc, 0xf3, 0xde, 0x30, 0xfd, 0xe3, 0xcd, 0x1f, 0xc9, 0x6e, 0xbe, 0xf9, 0x57, 0x79, 0x38, 0x37, - 0xe0, 0xd4, 0x4a, 0x9e, 0xe6, 0x8d, 0x13, 0x9f, 0xe6, 0xbf, 0xc1, 0x4e, 0x09, 0xc7, 0x6b, 0x87, - 0x9b, 0x7e, 0xd2, 0xe2, 0xe4, 0x15, 0x03, 0xcb, 0x64, 0x46, 0x0d, 0x99, 0xfd, 0xe1, 0x7c, 0x13, - 0x29, 0xec, 0xc8, 0xef, 0xbb, 0x33, 0xd6, 0x99, 0xf5, 0x3d, 0x8e, 0xe7, 0x7f, 0x4c, 0x1e, 0xc7, - 0xf5, 0x27, 0xa9, 0x91, 0xa7, 0xfa, 0x24, 0x95, 0x7d, 0x49, 0x3e, 0xfa, 0x69, 0x9e, 0x02, 0xfe, - 0x43, 0xea, 0x39, 0xfe, 0xc7, 0x71, 0xaa, 0xaf, 0xc2, 0xe8, 0xce, 0x1e, 0x0d, 0xa4, 0x7e, 0x8b, - 0x0d, 0x79, 0xc4, 0x00, 0x6a, 0x43, 0x10, 0xc3, 0xfc, 0x39, 0x28, 0xa9, 0x95, 0xe1, 0x5e, 0x66, - 0xbf, 0xc5, 0x66, 0xe2, 0x7b, 0x99, 0x01, 0x2c, 0x0e, 0x3f, 0x31, 0x7f, 0x56, 0x32, 0x0a, 0xf9, - 0x93, 0x46, 0xc1, 0xfc, 0xf7, 0x06, 0x8c, 0x60, 0xfa, 0x80, 0x37, 0xa1, 0x28, 0xaf, 0x4a, 0xd5, - 0x90, 0xfa, 0x59, 0x79, 0x93, 0x1a, 0xea, 0xfe, 0x0c, 0x02, 0xc8, 0xaa, 0xda, 0xa6, 0x41, 0x43, - 0x73, 0x7b, 0x79, 0xc8, 0x00, 0x6a, 0x55, 0x88, 0xf1, 0x04, 0x43, 0x82, 0xae, 0x3d, 0xc2, 0xbe, - 0xe7, 0x1b, 0x9e, 0xbb, 0xf6, 0xf4, 0xd9, 0xf5, 0x12, 0xcb, 0xfc, 0x2d, 0x03, 0xce, 0x64, 0xea, - 0x01, 0xac, 0x56, 0xae, 0x70, 0x28, 0x2b, 0x22, 0xad, 0x6d, 0x70, 0x8c, 0x27, 0x71, 0xe1, 0x79, - 0x82, 0xe9, 0xfd, 0x1c, 0x14, 0x63, 0xfb, 0x8c, 0x9c, 0x96, 0x53, 0x87, 0xf7, 0x69, 0xd2, 0x98, - 0xf9, 0x1b, 0x03, 0xc6, 0x58, 0x13, 0x9e, 0xd9, 0x58, 0x8c, 0xec, 0xdb, 0x55, 0xd6, 0xa5, 0xa1, - 0x22, 0x30, 0x7e, 0x7f, 0x0c, 0x20, 0x41, 0x26, 0x0d, 0x98, 0x5a, 0x5f, 0x59, 0x5a, 0x5c, 0x71, - 0x69, 0x27, 0xc2, 0x57, 0xbe, 0x54, 0x4c, 0x3e, 0x33, 0x2c, 0x83, 0x8e, 0xd3, 0x12, 0x08, 0x07, - 0xc9, 0xf6, 0xf4, 0x3d, 0xb7, 0x69, 0x7b, 0x31, 0x9d, 0xaa, 0x90, 0xe9, 0x1c, 0x59, 0x1d, 0xf5, - 0xea, 0xfd, 0x55, 0xa5, 0x8e, 0xdc, 0x90, 0x75, 0x84, 0x4e, 0xbb, 0x35, 0xa0, 0x0e, 0x9d, 0x23, - 0xd9, 0x83, 0xf2, 0x1d, 0x94, 0xdd, 0x4a, 0x2d, 0xf9, 0xe3, 0x6b, 0x79, 0x59, 0xd4, 0xf2, 0x02, - 0x17, 0xfa, 0xd9, 0xf5, 0xf4, 0x71, 0x4d, 0x56, 0xee, 0xc8, 0x89, 0x2b, 0xf7, 0xef, 0x19, 0x30, - 0xc6, 0x0f, 0x87, 0xf8, 0xcb, 0x17, 0x99, 0xc7, 0xcf, 0xce, 0xd3, 0x39, 0x7e, 0xca, 0x11, 0xfe, - 0xa7, 0x1a, 0xe0, 0xbc, 0x8c, 0x2c, 0xa5, 0x3e, 0xa3, 0x21, 0xaf, 0xd0, 0x51, 0x31, 0xe5, 0x25, - 0x89, 0x23, 0x14, 0xff, 0x82, 0x86, 0xca, 0x85, 0x63, 0xa8, 0x1f, 0xf5, 0x1b, 0xff, 0x94, 0x1f, - 0xf5, 0x5b, 0x85, 0xa2, 0xf0, 0xec, 0xa9, 0x1d, 0x08, 0xf3, 0x53, 0x5e, 0xb0, 0xc4, 0x70, 0x25, - 0x55, 0x35, 0x07, 0xd9, 0x0d, 0x2d, 0xd1, 0x5c, 0x8c, 0x48, 0xd6, 0xa1, 0x98, 0x04, 0x92, 0x14, - 0xb5, 0x77, 0xd0, 0x18, 0x2e, 0x5c, 0x5f, 0x79, 0xac, 0x62, 0x66, 0xdc, 0x48, 0xc2, 0xc3, 0xfc, - 0xa6, 0x01, 0xe5, 0xf4, 0x7a, 0x21, 0xef, 0xc0, 0x44, 0x1c, 0xcb, 0x13, 0xfb, 0x17, 0xe0, 0x45, - 0x66, 0x12, 0xfc, 0xa3, 0x79, 0x1a, 0xa8, 0xe8, 0x64, 0x01, 0x0a, 0x6c, 0xdb, 0x29, 0x99, 0x86, - 0x51, 0x9e, 0xf4, 0x04, 0x4c, 0x7d, 0xd7, 0x93, 0x78, 0xca, 0xae, 0xfd, 0x4f, 0x79, 0x98, 0x50, - 0x26, 0x8b, 0x5c, 0x85, 0xc2, 0x4a, 0xb8, 0xea, 0x37, 0xf7, 0xa9, 0x2b, 0x9e, 0x0b, 0xf0, 0x9b, - 0x8d, 0x5e, 0x68, 0xb7, 0x10, 0x68, 0xc5, 0xc5, 0xa4, 0x06, 0x93, 0xfc, 0x3f, 0x19, 0xb3, 0x99, - 0x4b, 0xae, 0x3a, 0x39, 0xb2, 0x8c, 0xd6, 0x54, 0x4f, 0x58, 0x8d, 0x84, 0x7c, 0x04, 0xc0, 0x01, - 0x6c, 0x7e, 0x87, 0x70, 0xec, 0x95, 0x1b, 0xf8, 0x8c, 0xa8, 0x20, 0xf2, 0xd4, 0x1e, 0xe2, 0x52, - 0x50, 0x18, 0xe2, 0xf7, 0xe2, 0xfc, 0xe6, 0xfe, 0xf0, 0x5f, 0x8c, 0x4c, 0xbe, 0x17, 0xe7, 0x37, - 0xf7, 0xed, 0x6c, 0x2f, 0x2f, 0x95, 0x25, 0xf9, 0x96, 0x01, 0x17, 0x2c, 0xda, 0xf4, 0x1f, 0xd2, - 0xe0, 0xa0, 0x1a, 0x21, 0x96, 0x5a, 0xe3, 0xc9, 0x2e, 0x65, 0x37, 0x45, 0x8d, 0xaf, 0x05, 0x82, - 0x0b, 0x06, 0xaf, 0xb4, 0xbb, 0x91, 0x7d, 0x4c, 0x13, 0x8e, 0xa9, 0xd2, 0xfc, 0x73, 0x43, 0xd9, - 0x02, 0x64, 0x0d, 0x8a, 0xf1, 0x62, 0x11, 0x17, 0x8e, 0xb1, 0x72, 0x24, 0xe1, 0x16, 0x7d, 0x50, - 0x7b, 0x41, 0xdc, 0xec, 0xcf, 0xc6, 0x4b, 0x4e, 0xdb, 0x11, 0x12, 0x48, 0xbe, 0x02, 0x23, 0x38, - 0x55, 0x27, 0xa7, 0xa6, 0x92, 0x47, 0xcd, 0x08, 0x9b, 0x23, 0x6c, 0x35, 0x52, 0x92, 0x2f, 0x08, - 0x2f, 0x8f, 0xbc, 0x96, 0xf4, 0x95, 0x81, 0x58, 0x3b, 0xe2, 0x33, 0x26, 0x71, 0x2c, 0x54, 0x56, - 0xeb, 0xdf, 0x31, 0x60, 0x76, 0x6b, 0xe1, 0xb6, 0x45, 0x77, 0x3d, 0x8c, 0x79, 0xf5, 0x7c, 0x7c, - 0x82, 0x25, 0xe7, 0x21, 0x6f, 0x39, 0x8f, 0x44, 0x0a, 0x49, 0x8c, 0x2a, 0x08, 0x9c, 0x47, 0x16, - 0x83, 0x91, 0xd7, 0xa1, 0x78, 0x8f, 0x1e, 0xdc, 0x75, 0x3a, 0xae, 0xf8, 0x8a, 0x43, 0x89, 0xa7, - 0x1b, 0xd9, 0xa7, 0x07, 0xf6, 0x1e, 0x42, 0xad, 0x04, 0x01, 0xdf, 0x97, 0x7b, 0x8d, 0x7b, 0x94, - 0x3f, 0xc3, 0x95, 0xc4, 0xfb, 0x72, 0xaf, 0x81, 0x8e, 0xeb, 0xbc, 0xc4, 0xfc, 0xa3, 0x3c, 0x94, - 0xd3, 0xbb, 0x9f, 0xbc, 0x0f, 0xa5, 0x0d, 0x27, 0x0c, 0x1f, 0xf9, 0x81, 0x7b, 0xd7, 0x09, 0xf7, - 0x44, 0x53, 0xd0, 0xf0, 0xec, 0x0a, 0xb8, 0xbd, 0xe7, 0x68, 0x59, 0xcf, 0x34, 0x02, 0xa6, 0x15, - 0x6c, 0x0a, 0xa7, 0x79, 0x65, 0x17, 0x47, 0x7e, 0xd4, 0x4d, 0x65, 0xb3, 0x94, 0x68, 0xc4, 0x85, - 0xe9, 0xd4, 0x58, 0xc4, 0x1b, 0x28, 0x8e, 0xfe, 0x4b, 0x8f, 0x14, 0xbf, 0xc9, 0xeb, 0x2d, 0x3c, - 0xc0, 0x8c, 0x50, 0xb2, 0x44, 0x0d, 0x4c, 0x4b, 0x11, 0x91, 0xb7, 0x00, 0xb6, 0x16, 0x6e, 0xa3, - 0xfd, 0x49, 0x03, 0xe1, 0x75, 0x8d, 0xd7, 0x32, 0x8c, 0x49, 0x93, 0x83, 0x55, 0xab, 0x21, 0x41, - 0x26, 0x6f, 0x42, 0x9e, 0xc7, 0x13, 0xaa, 0xb9, 0x9a, 0xee, 0xdf, 0xae, 0xf2, 0x10, 0x2c, 0xfe, - 0xe4, 0xae, 0xbf, 0x5d, 0x30, 0x7c, 0xb2, 0xaa, 0x44, 0xa3, 0x8d, 0x69, 0x39, 0x6b, 0x24, 0x38, - 0x1e, 0xfd, 0x21, 0xc2, 0xd2, 0xfe, 0x30, 0x0f, 0xc5, 0xb8, 0x4e, 0x42, 0x00, 0x35, 0x31, 0xf1, - 0x5e, 0x8e, 0xff, 0x93, 0xf3, 0x50, 0x90, 0xca, 0x97, 0x78, 0x33, 0x1f, 0x0f, 0x85, 0xe2, 0x35, - 0x07, 0x52, 0xcb, 0xe2, 0x8a, 0x97, 0x25, 0x7f, 0x92, 0x1b, 0x10, 0xab, 0x50, 0x83, 0x74, 0xad, - 0x11, 0xb6, 0x94, 0xad, 0x18, 0x8d, 0x4c, 0x41, 0xce, 0xe3, 0x5e, 0xda, 0x45, 0x2b, 0xe7, 0xb9, - 0xe4, 0x7d, 0x28, 0x38, 0xae, 0x4b, 0x5d, 0xdb, 0x89, 0x86, 0xf8, 0xae, 0x69, 0x81, 0x71, 0xe3, - 0x67, 0x1d, 0x52, 0x55, 0x23, 0x52, 0x85, 0x22, 0x7e, 0xd6, 0xb2, 0x17, 0x0e, 0xf5, 0x2d, 0xcc, - 0x84, 0x43, 0x81, 0x91, 0x6d, 0x85, 0xd4, 0x25, 0xaf, 0xc1, 0x08, 0x5b, 0x62, 0xe2, 0xa4, 0x8c, - 0xb3, 0xee, 0xad, 0x6f, 0x6e, 0xf0, 0x01, 0xbb, 0x7b, 0xca, 0x42, 0x04, 0xf2, 0x0a, 0xe4, 0x7b, - 0x0b, 0x0f, 0xc4, 0x19, 0x58, 0x4e, 0x16, 0x58, 0x8c, 0xc6, 0x8a, 0xc9, 0x4d, 0x28, 0x3c, 0xd2, - 0x03, 0x09, 0xcf, 0xa4, 0xa6, 0x2e, 0xc6, 0x8f, 0x11, 0x6b, 0x05, 0x18, 0xe3, 0x61, 0x7b, 0xe6, - 0x4b, 0x00, 0x49, 0xd5, 0xfd, 0xae, 0x0d, 0xe6, 0x47, 0x50, 0x8c, 0xab, 0x24, 0x2f, 0x82, 0xb2, - 0x87, 0xf9, 0x7e, 0xb3, 0x8a, 0xfb, 0xf1, 0x4e, 0x3e, 0x07, 0xe3, 0x5d, 0x36, 0xab, 0x32, 0x41, - 0xac, 0xc5, 0xb6, 0x31, 0xdb, 0x36, 0x73, 0x30, 0x2e, 0x96, 0x2d, 0x8f, 0x38, 0xb0, 0xe4, 0x4f, - 0xf3, 0x77, 0x73, 0x98, 0x3a, 0x40, 0x69, 0x27, 0x79, 0x19, 0x26, 0x9b, 0x01, 0xc5, 0x83, 0xda, - 0x61, 0x0a, 0xa3, 0xa8, 0xa7, 0x94, 0x00, 0x57, 0x5c, 0x72, 0x19, 0xa6, 0x93, 0x8c, 0xb5, 0x76, - 0xb3, 0x21, 0xc2, 0x88, 0x4b, 0xd6, 0x64, 0x57, 0xa6, 0xac, 0x5d, 0x6c, 0x60, 0x74, 0x41, 0x59, - 0x0d, 0xd9, 0x8b, 0x64, 0xf6, 0xd9, 0xa2, 0x35, 0xad, 0xc0, 0xf1, 0x41, 0xe6, 0x2c, 0x8c, 0x39, - 0xce, 0x6e, 0xcf, 0xe3, 0x9e, 0xce, 0x25, 0x4b, 0xfc, 0x22, 0x9f, 0x87, 0x99, 0xd0, 0xdb, 0xed, - 0x38, 0x51, 0x2f, 0xa0, 0x72, 0xf7, 0xe1, 0x92, 0x9a, 0xb4, 0xca, 0x71, 0x81, 0xdc, 0x7f, 0x6f, - 0x00, 0x51, 0xeb, 0xf3, 0x1b, 0x1f, 0xd3, 0x26, 0x5f, 0x6a, 0x25, 0x6b, 0x46, 0x29, 0x59, 0xc7, - 0x02, 0xf2, 0x39, 0x28, 0x05, 0x34, 0x44, 0x65, 0x15, 0x87, 0x0d, 0x33, 0xd2, 0x58, 0x13, 0x12, - 0xc6, 0x44, 0x5f, 0x0d, 0x66, 0xfa, 0xf6, 0x20, 0x79, 0x83, 0xdb, 0x3d, 0x42, 0x73, 0x29, 0x71, - 0x33, 0x8f, 0x89, 0xef, 0xd4, 0x97, 0x90, 0x39, 0x92, 0xd9, 0x81, 0x92, 0x7a, 0xf2, 0x9c, 0x10, - 0xa0, 0x7d, 0x16, 0x5d, 0x2e, 0xb9, 0x44, 0x1c, 0x3b, 0x3a, 0xac, 0xe4, 0x3c, 0x17, 0x1d, 0x2d, - 0xaf, 0x40, 0x41, 0xea, 0x4f, 0xea, 0xe7, 0x4c, 0x84, 0xaa, 0x7d, 0x60, 0xc5, 0xa5, 0xe6, 0x6b, - 0x30, 0x2e, 0x0e, 0x97, 0xe3, 0x2f, 0xb8, 0xcc, 0x5f, 0xca, 0xc1, 0xb4, 0x45, 0xd9, 0x06, 0x17, - 0x1f, 0x0a, 0x79, 0xce, 0x72, 0xf7, 0x6a, 0x7d, 0x3b, 0x26, 0x1f, 0xc2, 0xf7, 0x0c, 0x98, 0xcd, - 0xc0, 0xfd, 0x44, 0xc9, 0xbe, 0x6e, 0x41, 0x71, 0xc9, 0x73, 0x5a, 0x55, 0xd7, 0x8d, 0x5d, 0x47, - 0x51, 0x4f, 0x76, 0xd9, 0x76, 0x72, 0x18, 0x54, 0x55, 0x33, 0x62, 0x54, 0x72, 0x4d, 0x2c, 0x8a, - 0x24, 0x1d, 0xa1, 0xcc, 0x0e, 0x0c, 0xbc, 0x4d, 0x49, 0x6e, 0x60, 0x0c, 0xd0, 0xe3, 0xc0, 0xc4, - 0x3b, 0xe0, 0x99, 0x9d, 0xba, 0xec, 0x00, 0xbd, 0x74, 0xf7, 0x86, 0x32, 0xc8, 0xbf, 0x99, 0x83, - 0xb3, 0xd9, 0x84, 0x9f, 0x34, 0x6f, 0x1b, 0x26, 0xa3, 0x50, 0x12, 0x30, 0xa3, 0x22, 0xc5, 0x33, - 0x57, 0x20, 0x7e, 0x82, 0x40, 0x1e, 0xc0, 0xe4, 0xaa, 0x13, 0x46, 0x77, 0xa9, 0x13, 0x44, 0x0d, - 0xea, 0x44, 0x43, 0xe8, 0xf6, 0xf1, 0xf7, 0x86, 0xf1, 0x50, 0xdb, 0x93, 0x94, 0xe9, 0xef, 0x0d, - 0x6b, 0x6c, 0xe3, 0x85, 0x32, 0x32, 0xc4, 0x42, 0xf9, 0x19, 0x98, 0xae, 0xd3, 0xb6, 0xd3, 0xdd, - 0xf3, 0x03, 0x2a, 0xee, 0xe4, 0xaf, 0xc3, 0x64, 0x0c, 0xca, 0x5c, 0x2d, 0x7a, 0xb1, 0x86, 0xaf, - 0x0c, 0x44, 0x22, 0x4a, 0xf4, 0x62, 0xf3, 0xb7, 0x73, 0x70, 0xae, 0xda, 0x14, 0x0f, 0x18, 0xa2, - 0x40, 0xbe, 0xb3, 0x7e, 0xc6, 0x75, 0x93, 0x79, 0x28, 0xde, 0x77, 0x1e, 0xe3, 0x87, 0xf3, 0x43, - 0x91, 0xfd, 0x87, 0xab, 0x5c, 0xce, 0x63, 0x3b, 0xbe, 0x10, 0xb4, 0x12, 0x9c, 0xa7, 0xf9, 0x6d, - 0x7d, 0x13, 0xc6, 0xee, 0xfa, 0x2d, 0x57, 0x1c, 0x4e, 0xe2, 0x3d, 0x64, 0x0f, 0x21, 0x96, 0x28, - 0x31, 0x7f, 0x68, 0xc0, 0x54, 0xdc, 0x62, 0x6c, 0xc2, 0x67, 0x3e, 0x24, 0x97, 0x61, 0x1c, 0x2b, - 0x8a, 0x3f, 0xb6, 0x83, 0x87, 0x46, 0x8b, 0x81, 0x6c, 0xcf, 0xb5, 0x64, 0xa1, 0x3a, 0x12, 0xa3, - 0x9f, 0x6e, 0x24, 0xcc, 0x7f, 0x86, 0x4f, 0x2d, 0x6a, 0x2f, 0xd9, 0x49, 0xa4, 0x34, 0xc4, 0x18, - 0xb2, 0x21, 0xb9, 0xa7, 0x36, 0x25, 0xf9, 0x81, 0x53, 0xf2, 0xcb, 0x39, 0x98, 0x88, 0x1b, 0xfb, - 0x9c, 0x45, 0xb6, 0xc7, 0xfd, 0x1a, 0xca, 0x6f, 0xbd, 0xae, 0xc8, 0x0a, 0xe1, 0x1e, 0xfe, 0x15, - 0x18, 0x13, 0x9b, 0xc9, 0x48, 0xbd, 0x37, 0xa6, 0x66, 0x37, 0xf9, 0x66, 0x2c, 0x4e, 0x68, 0x68, - 0x09, 0x3a, 0x0c, 0x0c, 0xd8, 0xa1, 0x0d, 0xf1, 0xf2, 0xf6, 0xcc, 0x9e, 0x51, 0xd9, 0x81, 0x01, - 0x49, 0xc7, 0x86, 0x3a, 0x9d, 0xfe, 0xf1, 0x08, 0x94, 0xd3, 0x24, 0x27, 0xe7, 0x0e, 0xd8, 0xe8, - 0x35, 0x84, 0x11, 0x8f, 0x56, 0x7e, 0xb7, 0xd7, 0xb0, 0x18, 0x8c, 0x5c, 0x86, 0x91, 0x8d, 0xc0, - 0x7b, 0x28, 0xac, 0x76, 0xf4, 0x2d, 0xeb, 0x06, 0xde, 0x43, 0xd5, 0x43, 0x96, 0x95, 0xa3, 0x95, - 0xbd, 0x5a, 0x57, 0x3e, 0xd7, 0xcd, 0xad, 0xec, 0x56, 0x98, 0x4e, 0x2f, 0x23, 0xd1, 0xd8, 0x51, - 0x59, 0xa3, 0x4e, 0x20, 0xe2, 0xdc, 0x85, 0x38, 0xc3, 0xa3, 0xb2, 0x81, 0x60, 0x9e, 0x3b, 0xd6, - 0x52, 0x91, 0x48, 0x0b, 0x88, 0xf2, 0x53, 0x6e, 0xe0, 0x93, 0x6d, 0x3c, 0xf9, 0x99, 0xa6, 0xd3, - 0x2a, 0x6b, 0x5b, 0xdd, 0xcd, 0x19, 0x7c, 0x9f, 0xe6, 0xed, 0xe9, 0x06, 0x14, 0xf1, 0x32, 0x10, - 0xaf, 0x78, 0x0a, 0x27, 0x32, 0x93, 0xde, 0xc8, 0x80, 0x7e, 0x0a, 0x76, 0x7c, 0xd1, 0x93, 0x30, - 0x21, 0xef, 0xc1, 0x84, 0xea, 0x42, 0xcb, 0x1d, 0x3d, 0x2f, 0xf2, 0xd8, 0xa9, 0x01, 0x69, 0xd8, - 0x54, 0x02, 0xf3, 0x0b, 0xea, 0x2a, 0x11, 0x87, 0xf6, 0xb1, 0xab, 0xc4, 0xfc, 0x4d, 0x54, 0xe3, - 0xdb, 0x7e, 0x44, 0x85, 0xf6, 0xf2, 0xcc, 0xca, 0xb1, 0xe4, 0x72, 0x7d, 0x54, 0xf3, 0x95, 0xd1, - 0x7a, 0xf7, 0x04, 0x1f, 0xaa, 0xfe, 0x03, 0x03, 0xce, 0x64, 0xd2, 0x92, 0xeb, 0x00, 0x89, 0x8e, - 0x28, 0x46, 0x89, 0x27, 0xe5, 0x8d, 0xa1, 0x96, 0x82, 0x41, 0xbe, 0x91, 0xd6, 0xee, 0x4e, 0x3e, - 0x9c, 0xe4, 0xa7, 0x2b, 0xa6, 0x74, 0xed, 0x2e, 0x43, 0xa7, 0x33, 0xbf, 0x97, 0x87, 0x99, 0xbe, - 0x4f, 0x1e, 0x9e, 0xe0, 0x9d, 0xb0, 0x9f, 0xfa, 0xa0, 0x16, 0x7f, 0x08, 0xba, 0x36, 0xe8, 0x83, - 0x8b, 0x19, 0x9f, 0xd7, 0xc2, 0xbb, 0x3a, 0x91, 0x0f, 0xfa, 0x84, 0xaf, 0x6c, 0x85, 0xd9, 0x9f, - 0x62, 0xfb, 0xfc, 0xc0, 0xda, 0x9e, 0xc2, 0x27, 0xd9, 0x7e, 0x8c, 0xbf, 0x58, 0xf5, 0x9b, 0x39, - 0x98, 0xed, 0xeb, 0xf3, 0x33, 0xbb, 0xeb, 0xbe, 0xa2, 0x9d, 0x6e, 0x2f, 0x0d, 0x9a, 0xd3, 0xa1, - 0xb4, 0x88, 0xff, 0x69, 0xc0, 0xb9, 0x01, 0x94, 0xe4, 0x20, 0xbd, 0x88, 0xb8, 0x56, 0x71, 0xe3, - 0xf8, 0x0a, 0x9f, 0xca, 0x52, 0xfa, 0xcc, 0x56, 0xc2, 0x2f, 0xe5, 0x00, 0x76, 0x68, 0xe3, 0xd9, - 0x4e, 0x8c, 0xf4, 0x25, 0x6d, 0x01, 0x28, 0x17, 0x98, 0xc3, 0xe7, 0x45, 0x5a, 0xc7, 0x8b, 0xc4, - 0xe1, 0xb3, 0x22, 0xc5, 0x9f, 0xe7, 0xc8, 0x65, 0x7f, 0x9e, 0xc3, 0x6c, 0xc0, 0xe9, 0x3b, 0x34, - 0x4a, 0x4e, 0x42, 0x69, 0x43, 0x1e, 0xcf, 0xf6, 0x75, 0x28, 0x0a, 0x7c, 0x3d, 0xd5, 0xba, 0x74, - 0xb5, 0xf3, 0x5c, 0x2b, 0x41, 0x30, 0x29, 0x9c, 0x5b, 0xa2, 0x2d, 0x1a, 0xd1, 0xcf, 0xb6, 0x9a, - 0x3a, 0x10, 0xde, 0x15, 0xfe, 0xd5, 0x86, 0xa1, 0x6a, 0x38, 0x71, 0x7c, 0xb6, 0xe1, 0x4c, 0xdc, - 0xf6, 0xa7, 0xc9, 0x77, 0x9e, 0xe9, 0x12, 0x22, 0x0a, 0x31, 0xe1, 0x78, 0xcc, 0x25, 0xe2, 0x63, - 0xb8, 0x20, 0x09, 0x76, 0xbc, 0xf8, 0x79, 0x68, 0x28, 0x5a, 0xf2, 0x0e, 0x4c, 0x28, 0x34, 0x22, - 0xa4, 0x19, 0xdf, 0x81, 0x1f, 0x79, 0xd1, 0x9e, 0x1d, 0x72, 0xb8, 0xfa, 0x0e, 0xac, 0xa0, 0x9b, - 0x5f, 0x87, 0x17, 0x62, 0x8f, 0x9e, 0x8c, 0xaa, 0x53, 0xcc, 0x8d, 0x27, 0x63, 0xbe, 0x96, 0x74, - 0x6b, 0xa5, 0x13, 0x7b, 0xd6, 0x4b, 0xde, 0x44, 0xed, 0x96, 0xe8, 0xcc, 0x45, 0x25, 0x61, 0x9c, - 0x38, 0x8b, 0x12, 0x80, 0xf9, 0xb6, 0xd2, 0xd8, 0x0c, 0x86, 0x1a, 0xb1, 0x91, 0x26, 0xfe, 0xa5, - 0x1c, 0x4c, 0xaf, 0xaf, 0x2c, 0x2d, 0xc6, 0xd7, 0xc8, 0xcf, 0x59, 0xd6, 0x26, 0xad, 0x6f, 0x83, - 0xe5, 0x8d, 0xb9, 0x05, 0xb3, 0xa9, 0x61, 0xc0, 0x8f, 0xd2, 0xbc, 0xc7, 0x3d, 0x6f, 0x62, 0xb0, - 0x3c, 0x59, 0xce, 0x66, 0xb1, 0xdf, 0xbe, 0x69, 0xa5, 0xb0, 0xcd, 0xef, 0x8d, 0xa5, 0xf8, 0x0a, - 0x11, 0xf6, 0x3a, 0x14, 0x57, 0xc2, 0xb0, 0x47, 0x83, 0x2d, 0x6b, 0x55, 0xd5, 0x11, 0x3d, 0x04, - 0xda, 0xbd, 0xa0, 0x65, 0x25, 0x08, 0xe4, 0x2a, 0x14, 0x44, 0xe4, 0x9b, 0x94, 0x09, 0xe8, 0x48, - 0x10, 0x07, 0xce, 0x59, 0x71, 0x31, 0x79, 0x13, 0x4a, 0xfc, 0x7f, 0xbe, 0xda, 0xc4, 0x80, 0xe3, - 0x5d, 0x95, 0x40, 0xe7, 0xab, 0xd3, 0xd2, 0xd0, 0x98, 0x65, 0x26, 0xbf, 0x7a, 0xc9, 0x5a, 0x34, - 0x92, 0x58, 0x66, 0xf2, 0x03, 0x99, 0xd8, 0x26, 0x15, 0x89, 0x5c, 0x83, 0x7c, 0x75, 0xd1, 0x52, - 0xb3, 0x4b, 0x3b, 0xcd, 0x80, 0x67, 0x67, 0xd7, 0x3e, 0x2c, 0x55, 0x5d, 0xb4, 0xc8, 0x02, 0x14, - 0xf0, 0xc3, 0x21, 0x2e, 0x0d, 0x84, 0x37, 0x2d, 0xae, 0x9a, 0xae, 0x80, 0xa9, 0xaf, 0x8d, 0x12, - 0x8f, 0xcc, 0xc3, 0xf8, 0x92, 0x17, 0x76, 0x5b, 0xce, 0x81, 0x48, 0xd7, 0x82, 0x8f, 0x21, 0x2e, - 0x07, 0xa9, 0xeb, 0x4c, 0x60, 0x91, 0xab, 0x30, 0x5a, 0x6f, 0xfa, 0x5d, 0x66, 0x6d, 0xc5, 0x4e, - 0x3f, 0x21, 0x03, 0x68, 0x39, 0x1f, 0x18, 0x00, 0x83, 0xb1, 0x79, 0x4c, 0x59, 0x51, 0x09, 0xc6, - 0x4e, 0xc7, 0x92, 0x09, 0x9c, 0x7e, 0xcf, 0x48, 0x78, 0x9a, 0x9e, 0x91, 0x0d, 0x38, 0x77, 0x07, - 0x55, 0xfd, 0x3a, 0x0d, 0x30, 0x9f, 0x26, 0xff, 0x08, 0xd1, 0x96, 0xb5, 0x22, 0xe2, 0xe8, 0xae, - 0x1c, 0x1d, 0x56, 0x5e, 0xe1, 0xd6, 0x80, 0x1d, 0x72, 0x1c, 0xf9, 0xfd, 0xa2, 0xd4, 0x97, 0x17, - 0x06, 0x31, 0x22, 0x5f, 0x85, 0xd3, 0x59, 0x45, 0x22, 0xa2, 0x0e, 0xfd, 0xe5, 0xb3, 0x2b, 0x50, - 0x1d, 0xd6, 0xb3, 0x38, 0x90, 0x55, 0x28, 0x73, 0x78, 0xd5, 0x6d, 0x7b, 0x9d, 0xe5, 0xb6, 0xe3, - 0xb5, 0x30, 0xbe, 0x4e, 0x04, 0x49, 0x0a, 0xae, 0x0e, 0x2b, 0xb4, 0x29, 0x2b, 0xd5, 0xfc, 0xb6, - 0x52, 0x94, 0x28, 0x8e, 0xea, 0xd5, 0xfb, 0xab, 0xc9, 0x9e, 0x7a, 0xbe, 0xde, 0x8d, 0xb4, 0xbe, - 0x1d, 0xf3, 0x6e, 0xb4, 0x05, 0xb3, 0xa9, 0x61, 0x90, 0xe2, 0x48, 0x03, 0xa7, 0xc5, 0x51, 0x8a, - 0xc6, 0x4a, 0x61, 0x9b, 0xff, 0x79, 0x2c, 0xc5, 0x57, 0xdc, 0x15, 0x99, 0x30, 0xc6, 0xa5, 0x8d, - 0x9a, 0xcf, 0x8d, 0xcb, 0x22, 0x4b, 0x94, 0x90, 0xf3, 0x90, 0xaf, 0xd7, 0xd7, 0xd5, 0x6c, 0x93, - 0x61, 0xe8, 0x5b, 0x0c, 0xc6, 0x66, 0x08, 0xaf, 0x81, 0x94, 0xd0, 0xb5, 0x26, 0x0d, 0x22, 0xf1, - 0x59, 0xd4, 0x57, 0x93, 0x7d, 0x3c, 0x92, 0x8c, 0xb7, 0xd8, 0xc7, 0xc9, 0xee, 0x5d, 0x84, 0xb9, - 0x6a, 0x18, 0xd2, 0x20, 0xe2, 0xc9, 0xed, 0xc3, 0x5e, 0x9b, 0x06, 0x62, 0xad, 0x09, 0x19, 0xc3, - 0x3f, 0xaa, 0xde, 0x0c, 0xad, 0x81, 0x88, 0xe4, 0x0a, 0x14, 0xaa, 0x3d, 0xd7, 0xa3, 0x9d, 0xa6, - 0xe6, 0xb5, 0xef, 0x08, 0x98, 0x15, 0x97, 0x92, 0x0f, 0xe1, 0x8c, 0x20, 0x92, 0x02, 0x47, 0x8c, - 0x00, 0x97, 0x35, 0xdc, 0x82, 0x15, 0x7b, 0x41, 0x8a, 0x29, 0x5b, 0x0c, 0x49, 0x36, 0x25, 0xa9, - 0x42, 0x79, 0x19, 0xdf, 0x49, 0xe5, 0xc7, 0x91, 0xfd, 0x40, 0x24, 0x31, 0x46, 0xc9, 0xc5, 0xdf, - 0x50, 0x6d, 0x37, 0x2e, 0xb4, 0xfa, 0xd0, 0xc9, 0x3d, 0x98, 0x4d, 0xc3, 0x98, 0x3c, 0x2e, 0x26, - 0x1f, 0x2f, 0xeb, 0xe3, 0x82, 0x82, 0x39, 0x8b, 0x8a, 0x34, 0x60, 0xa6, 0x1a, 0x45, 0x81, 0xd7, - 0xe8, 0x45, 0x34, 0x25, 0xba, 0xe4, 0x45, 0x63, 0x5c, 0x2e, 0xc5, 0xd7, 0x0b, 0x62, 0x31, 0xce, - 0x3a, 0x31, 0x65, 0x2c, 0xc2, 0xac, 0x7e, 0x76, 0xc4, 0x8d, 0xbf, 0x7f, 0x28, 0xbe, 0x11, 0x28, - 0x42, 0xad, 0xe4, 0x85, 0x6e, 0x35, 0x3c, 0x68, 0xb7, 0x69, 0x14, 0xe0, 0xcb, 0x3d, 0x7e, 0x43, - 0xd0, 0x14, 0xde, 0x51, 0x17, 0x94, 0xcf, 0x7e, 0xe2, 0x77, 0x22, 0x35, 0xc7, 0x51, 0x8d, 0xa7, - 0x76, 0x7c, 0x94, 0x86, 0x3c, 0x3e, 0x5a, 0x30, 0xb3, 0xdc, 0x69, 0x06, 0x07, 0x18, 0xf3, 0x29, - 0x1b, 0x37, 0x79, 0x42, 0xe3, 0xe4, 0x07, 0x42, 0x2e, 0x3a, 0x72, 0x85, 0x65, 0x35, 0xaf, 0x9f, - 0xb1, 0xf9, 0xb7, 0xa0, 0x9c, 0x1e, 0xcb, 0x4f, 0xf9, 0xd1, 0xe7, 0x27, 0x71, 0x5a, 0x67, 0x33, - 0x9d, 0xee, 0x0b, 0x99, 0xd7, 0xbe, 0xec, 0x6b, 0x24, 0xf1, 0xfa, 0xca, 0x37, 0x78, 0xb5, 0xef, - 0xf9, 0xca, 0x6d, 0x9c, 0xcb, 0xda, 0xc6, 0xe6, 0xaf, 0xe4, 0x60, 0x86, 0xfb, 0xd9, 0x3e, 0xfb, - 0xba, 0xe2, 0x7b, 0x9a, 0x70, 0x96, 0x77, 0x81, 0xa9, 0xde, 0x1d, 0xa3, 0x2d, 0x7e, 0x04, 0x67, - 0xfa, 0x86, 0x02, 0x05, 0xf4, 0x92, 0xf4, 0x70, 0xee, 0x13, 0xd1, 0x73, 0xd9, 0x95, 0x6c, 0xdf, - 0xb4, 0xfa, 0x28, 0xcc, 0x7f, 0x92, 0xeb, 0xe3, 0x2f, 0xf4, 0x46, 0x55, 0x13, 0x34, 0x9e, 0x4c, - 0x13, 0xcc, 0x7d, 0x22, 0x4d, 0x30, 0x3f, 0x8c, 0x26, 0xf8, 0x21, 0x4c, 0x6e, 0x52, 0x87, 0x69, - 0x34, 0x22, 0x0c, 0x6f, 0x44, 0xfb, 0xea, 0x2e, 0x2b, 0x93, 0xf2, 0x25, 0x0e, 0xe1, 0x8d, 0x18, - 0x01, 0x13, 0x2d, 0x3c, 0x2e, 0xcf, 0xd2, 0x39, 0xa8, 0x87, 0xc6, 0xe8, 0xe0, 0x43, 0xc3, 0xfc, - 0x66, 0x0e, 0x26, 0x14, 0xf6, 0xe4, 0x8b, 0x50, 0x5a, 0x0f, 0x76, 0x9d, 0x8e, 0xf7, 0xb3, 0x8e, - 0x72, 0xfd, 0x8a, 0xcd, 0xf7, 0x15, 0xb8, 0xa5, 0x61, 0xa1, 0xdb, 0x0c, 0x75, 0xda, 0xea, 0xc2, - 0x67, 0xcd, 0xb3, 0x10, 0xaa, 0x84, 0x51, 0xe7, 0x87, 0x08, 0xa3, 0xd6, 0x63, 0x90, 0x47, 0x9e, - 0x3c, 0x06, 0x59, 0x0b, 0x19, 0x1e, 0x7d, 0xc2, 0x90, 0x61, 0xf3, 0xd7, 0x72, 0x50, 0x16, 0xdf, - 0xa7, 0x95, 0x97, 0x87, 0xcf, 0xd7, 0xf7, 0x2c, 0xf4, 0xce, 0x1d, 0xf3, 0x3c, 0x36, 0xf2, 0x5b, - 0xbf, 0x57, 0xc1, 0xaf, 0x8d, 0xa6, 0x87, 0x43, 0x7e, 0x6d, 0x54, 0x87, 0xa7, 0x63, 0x2a, 0xd2, - 0x54, 0x56, 0x1a, 0xdf, 0xfc, 0xb3, 0x5c, 0x9a, 0xb7, 0xd0, 0xa6, 0x5e, 0x85, 0x71, 0xfe, 0x79, - 0x31, 0xe9, 0xf6, 0x2d, 0xb2, 0x5a, 0x21, 0xc8, 0x92, 0x65, 0x4f, 0x12, 0x5d, 0x73, 0xd2, 0x27, - 0x67, 0xc9, 0x2d, 0x28, 0xa1, 0xbf, 0x48, 0xd5, 0x75, 0x03, 0x1a, 0x86, 0x42, 0xd1, 0xc2, 0xb7, - 0xbb, 0x47, 0xb4, 0x61, 0x73, 0xbf, 0x12, 0xc7, 0x75, 0x03, 0x4b, 0xc3, 0x23, 0x8b, 0x70, 0x5a, - 0x73, 0x4f, 0x92, 0xf4, 0xa3, 0xc9, 0x69, 0x11, 0x61, 0x01, 0x27, 0xce, 0x44, 0x7e, 0x7a, 0x9f, - 0xdb, 0x36, 0xff, 0xb7, 0xc1, 0xf6, 0x5a, 0x73, 0xff, 0x39, 0x8b, 0xfb, 0x61, 0x5d, 0x3a, 0x46, - 0xd9, 0xff, 0x8f, 0x06, 0xf7, 0xdc, 0x17, 0xcb, 0xe7, 0x2d, 0x18, 0xe3, 0x1f, 0x33, 0x13, 0x3e, - 0xe6, 0x2a, 0x17, 0x5e, 0x90, 0xbc, 0x4f, 0xf1, 0x4f, 0xa2, 0x59, 0x82, 0x80, 0x99, 0xcc, 0x7a, - 0x00, 0x01, 0x2a, 0x9e, 0xfd, 0x91, 0x03, 0x12, 0x4b, 0xcd, 0xd8, 0x3a, 0x5c, 0x26, 0x70, 0xe3, - 0xe4, 0x8c, 0xad, 0xe6, 0xff, 0xcd, 0xf1, 0xfe, 0x88, 0x46, 0x0d, 0x9b, 0x8a, 0xf0, 0x32, 0x8c, - 0xe0, 0x67, 0x73, 0x95, 0x7c, 0x8f, 0xa9, 0x4f, 0xe6, 0x62, 0x39, 0xdb, 0x37, 0x28, 0x6b, 0xd5, - 0x50, 0x33, 0x14, 0xc7, 0xea, 0xbe, 0x41, 0x0c, 0xcc, 0xb3, 0xed, 0xbb, 0x54, 0xdd, 0x0e, 0x1d, - 0x3d, 0x25, 0x3a, 0x96, 0x93, 0x5b, 0x8a, 0x5f, 0xb3, 0x7a, 0xa1, 0xd1, 0x7e, 0xe0, 0xd8, 0xdc, - 0x9f, 0x56, 0x95, 0xb6, 0x89, 0x0b, 0xf4, 0x32, 0x4c, 0xe9, 0x51, 0xdc, 0xc2, 0xe8, 0xc0, 0x60, - 0xf8, 0x54, 0x04, 0xb8, 0xaa, 0xde, 0xea, 0x44, 0xa4, 0x06, 0x93, 0x5a, 0xa8, 0xae, 0x9a, 0x9e, - 0x96, 0xe7, 0xcd, 0xb1, 0xfb, 0x73, 0x4c, 0xe8, 0x24, 0xca, 0x85, 0xf9, 0x17, 0xa0, 0x2c, 0x76, - 0x66, 0x1c, 0xf5, 0x87, 0xaa, 0xdd, 0xca, 0x92, 0xa5, 0xee, 0xa6, 0xa6, 0xe7, 0x06, 0x16, 0x42, - 0xcd, 0xef, 0x1a, 0x70, 0x5e, 0x7c, 0xa4, 0xcd, 0xa2, 0x21, 0xd3, 0x21, 0x31, 0x54, 0x10, 0xd7, - 0xe3, 0x17, 0xc9, 0x3b, 0x32, 0x25, 0x97, 0x2e, 0x20, 0xd3, 0x75, 0xd4, 0x26, 0xc5, 0xa2, 0x1c, - 0xc5, 0xa4, 0x5c, 0x32, 0x15, 0xd7, 0x5b, 0x22, 0x15, 0x57, 0xee, 0x78, 0xe2, 0x78, 0x5f, 0xb8, - 0xb4, 0x23, 0x53, 0x70, 0x7d, 0x27, 0x07, 0x67, 0x32, 0x9a, 0xb5, 0xfd, 0xc5, 0x67, 0x54, 0x38, - 0xd4, 0x34, 0xe1, 0x20, 0x73, 0x35, 0x0e, 0x1c, 0xf8, 0x4c, 0x59, 0xf1, 0x3b, 0x06, 0x9c, 0xd3, - 0x57, 0x8f, 0xb0, 0x45, 0xb7, 0x6f, 0x92, 0xb7, 0x61, 0xec, 0x2e, 0x75, 0x5c, 0x2a, 0x83, 0x53, - 0xe2, 0xbc, 0x67, 0xe2, 0x76, 0x98, 0x17, 0x72, 0xb6, 0x7f, 0xc6, 0xb7, 0xf2, 0x29, 0x4b, 0x90, - 0x90, 0x25, 0xd1, 0x38, 0xfe, 0x3c, 0x65, 0xca, 0x97, 0x9a, 0xac, 0xaa, 0x8e, 0x51, 0x8c, 0xff, - 0xc0, 0x80, 0x17, 0x8e, 0xa1, 0x61, 0x13, 0xc7, 0xa6, 0x5e, 0x9d, 0x38, 0x3c, 0x58, 0x10, 0x4a, - 0xde, 0x83, 0xe9, 0x4d, 0x11, 0x43, 0x27, 0xa7, 0x43, 0xc9, 0x7b, 0x2f, 0xc3, 0xeb, 0x6c, 0x39, - 0x2f, 0x69, 0x64, 0x66, 0xfd, 0xdf, 0xf5, 0xc3, 0xa8, 0x93, 0xa4, 0xd1, 0x41, 0xeb, 0x7f, 0x4f, - 0xc0, 0xac, 0xb8, 0x94, 0xa9, 0x05, 0x7a, 0x33, 0x85, 0x3b, 0xc4, 0xcb, 0x30, 0xc6, 0x70, 0x62, - 0xed, 0x1a, 0xd7, 0x01, 0x7e, 0x42, 0xcc, 0x73, 0x2d, 0x51, 0x14, 0xdb, 0x75, 0xb9, 0xcc, 0x57, - 0x8b, 0x6f, 0x1a, 0x50, 0xd6, 0x79, 0x7f, 0xda, 0xa9, 0x79, 0x57, 0x9b, 0x9a, 0x17, 0xb2, 0xa7, - 0x66, 0xf0, 0x9c, 0xf4, 0x65, 0xb4, 0x18, 0x6a, 0x2e, 0x4c, 0x18, 0x5b, 0xf2, 0xdb, 0x8e, 0xd7, - 0x51, 0xb3, 0x30, 0xb8, 0x08, 0xb1, 0x44, 0x89, 0x32, 0x5a, 0xf9, 0x81, 0xa3, 0x65, 0x7e, 0x7b, - 0x04, 0xce, 0xf3, 0x28, 0x18, 0x1a, 0x6c, 0x85, 0x5e, 0x67, 0x57, 0x7b, 0x53, 0x32, 0x53, 0x03, - 0x2e, 0x3c, 0xe9, 0x18, 0x24, 0x1e, 0xef, 0xab, 0x50, 0x60, 0x52, 0x5a, 0x19, 0x73, 0x34, 0x7a, - 0x30, 0x97, 0x10, 0x9f, 0x57, 0x59, 0x4c, 0xae, 0x89, 0x33, 0x44, 0xf1, 0x75, 0x66, 0x67, 0x48, - 0xea, 0x0b, 0xe8, 0xfc, 0x1c, 0x89, 0x95, 0xaa, 0x91, 0x01, 0x4a, 0xd5, 0x7d, 0x38, 0x5d, 0x75, - 0xb9, 0x7c, 0x72, 0x5a, 0x1b, 0x81, 0xd7, 0x69, 0x7a, 0x5d, 0xa7, 0x25, 0x95, 0x72, 0xfe, 0x3d, - 0xf8, 0xb8, 0xdc, 0xee, 0xc6, 0x08, 0x56, 0x26, 0x19, 0xeb, 0xc6, 0xd2, 0x5a, 0x9d, 0xa7, 0x8a, - 0x19, 0x43, 0x16, 0xd8, 0x0d, 0xb7, 0x13, 0xf2, 0x5c, 0x31, 0x56, 0x5c, 0x8c, 0xea, 0x1c, 0x86, - 0x3b, 0x6c, 0xae, 0xd6, 0xef, 0x89, 0xf0, 0x01, 0xe9, 0x8a, 0xc5, 0xa3, 0x23, 0xa2, 0x56, 0x88, - 0xf6, 0xbb, 0x86, 0x97, 0xd0, 0xd5, 0xeb, 0x77, 0x19, 0x5d, 0xa1, 0x8f, 0x2e, 0x0c, 0xf7, 0x54, - 0x3a, 0x8e, 0x47, 0xe6, 0x01, 0xb8, 0x33, 0x0b, 0x2e, 0x88, 0x62, 0xa2, 0xfc, 0x05, 0x08, 0xe5, - 0xca, 0x9f, 0x82, 0x42, 0xde, 0x81, 0xd9, 0xe5, 0xc5, 0x05, 0x19, 0x17, 0xb0, 0xe4, 0x37, 0x7b, - 0x6d, 0xda, 0x89, 0x30, 0x4e, 0x45, 0x04, 0x7a, 0xd1, 0xe6, 0x02, 0x5b, 0x05, 0x59, 0x68, 0x22, - 0x3a, 0x80, 0x47, 0xdd, 0x2d, 0xfa, 0x2e, 0x0d, 0xb7, 0x6f, 0x3c, 0x67, 0xd1, 0x01, 0x4a, 0xdf, - 0x70, 0xb7, 0xdd, 0xc8, 0xdc, 0x99, 0x7f, 0x1f, 0xa3, 0x03, 0xfa, 0x70, 0xc9, 0x4f, 0xc0, 0x28, - 0xfe, 0x14, 0x27, 0xee, 0x6c, 0x06, 0xdb, 0xe4, 0xb4, 0x6d, 0xf2, 0xac, 0x1f, 0x48, 0x40, 0x56, - 0x92, 0xb4, 0xfe, 0x4f, 0xe0, 0xe3, 0x2a, 0x42, 0x77, 0xf5, 0xef, 0xb9, 0xb8, 0x50, 0x52, 0x2b, - 0x64, 0x6b, 0xe4, 0xae, 0x13, 0xee, 0x51, 0x77, 0x51, 0x7e, 0xbf, 0xb1, 0xc4, 0xd7, 0xc8, 0x1e, - 0x42, 0xf1, 0x5b, 0x33, 0x96, 0x82, 0xc2, 0xa4, 0xc3, 0x4a, 0xb8, 0x15, 0x8a, 0xa6, 0x08, 0x2b, - 0xc8, 0x43, 0xeb, 0xd5, 0xb5, 0x44, 0x11, 0x4a, 0x4b, 0x99, 0xd5, 0x32, 0x70, 0x9a, 0xfb, 0x34, - 0xd8, 0xbe, 0xf1, 0x59, 0x48, 0x4b, 0xbd, 0x8e, 0x63, 0xe6, 0xe4, 0xd7, 0x0b, 0x71, 0xd2, 0x1a, - 0x0d, 0x99, 0xe9, 0x88, 0xc9, 0xcb, 0xbc, 0x91, 0xe8, 0x88, 0xc9, 0xcb, 0xbc, 0xaa, 0x23, 0xc6, - 0xa8, 0x71, 0x4e, 0xe1, 0xdc, 0x09, 0x39, 0x85, 0x07, 0xa4, 0x31, 0x97, 0x4e, 0x9d, 0xcf, 0xd1, - 0x17, 0x1d, 0xbe, 0x0c, 0xa5, 0x6a, 0x14, 0x39, 0xcd, 0x3d, 0xea, 0x62, 0xee, 0x6a, 0xe5, 0x41, - 0xd0, 0x11, 0x70, 0xd5, 0x5d, 0x4c, 0xc5, 0x55, 0xbe, 0xe8, 0x32, 0x3e, 0xc4, 0x17, 0x5d, 0xe6, - 0x61, 0x7c, 0xa5, 0xf3, 0xd0, 0x63, 0x63, 0x52, 0x48, 0xd2, 0x66, 0x78, 0x1c, 0xa4, 0x7f, 0x06, - 0x04, 0x41, 0xe4, 0x2d, 0x45, 0x83, 0x28, 0x26, 0xaa, 0xbc, 0xf8, 0xf2, 0xb4, 0x54, 0x24, 0xd4, - 0xfb, 0x66, 0x89, 0x4e, 0x6e, 0xc1, 0xb8, 0xb4, 0x9e, 0x21, 0x51, 0xdf, 0x05, 0xa5, 0xc3, 0x4b, - 0xb4, 0x4c, 0x1d, 0xc2, 0x7a, 0x7e, 0x47, 0x8f, 0x1f, 0x99, 0x50, 0x22, 0xd6, 0x95, 0xf8, 0x11, - 0x2d, 0x62, 0x5d, 0x89, 0x24, 0x89, 0x8d, 0xa1, 0xd2, 0x89, 0xc6, 0xd0, 0x36, 0x94, 0x36, 0x9c, - 0x20, 0xf2, 0xd8, 0x71, 0xd4, 0x89, 0x78, 0xc2, 0xb1, 0xc4, 0x56, 0x57, 0x8a, 0x6a, 0x2f, 0xc9, - 0xc8, 0xed, 0xae, 0x82, 0xaf, 0x47, 0xdb, 0x26, 0x70, 0xb2, 0x96, 0xe1, 0x61, 0x28, 0xd2, 0x63, - 0xe2, 0x13, 0xa0, 0x72, 0x71, 0x25, 0x7a, 0xa4, 0x5e, 0xa5, 0xf7, 0x3b, 0x27, 0xde, 0xe4, 0x73, - 0x80, 0x36, 0xe3, 0x34, 0xb2, 0xc1, 0xbc, 0x2b, 0xa8, 0x57, 0xa4, 0x0c, 0xc7, 0x18, 0x91, 0x7c, - 0x03, 0x4a, 0xec, 0x7f, 0xcc, 0xbe, 0xe4, 0x51, 0x9e, 0x50, 0x2c, 0xf1, 0x38, 0xd3, 0x37, 0x34, - 0x4f, 0xd1, 0x54, 0xa7, 0x11, 0xdf, 0xc0, 0xc8, 0x38, 0x7d, 0xf1, 0xa2, 0x71, 0x33, 0x7f, 0x68, - 0xc0, 0xb9, 0x01, 0x3c, 0x86, 0xfe, 0x96, 0xd3, 0x7c, 0x72, 0x20, 0x29, 0xb6, 0xb9, 0x38, 0x90, - 0xd4, 0x85, 0x21, 0x8f, 0xa6, 0xec, 0x54, 0x60, 0xf9, 0xcf, 0x2c, 0x15, 0x98, 0x79, 0x68, 0xc0, - 0x84, 0x32, 0xb3, 0x4f, 0xf1, 0x13, 0x0d, 0x97, 0x45, 0x4e, 0xcc, 0x7c, 0x82, 0x97, 0xfa, 0x8e, - 0x33, 0xcf, 0x81, 0xf9, 0x11, 0xc0, 0xaa, 0x13, 0x46, 0xd5, 0x66, 0xe4, 0x3d, 0xa4, 0x43, 0x88, - 0xb1, 0x24, 0x85, 0x81, 0x83, 0x29, 0x66, 0x19, 0x59, 0x5f, 0x0a, 0x83, 0x98, 0xa1, 0xb9, 0x06, - 0x63, 0x75, 0x3f, 0x88, 0x6a, 0x07, 0xfc, 0x6c, 0x5a, 0xa2, 0x61, 0x53, 0xbd, 0xa1, 0xf3, 0xd0, - 0x56, 0x6f, 0x5a, 0xa2, 0x88, 0x29, 0x88, 0xb7, 0x3d, 0xda, 0x72, 0xd5, 0x17, 0x9a, 0x07, 0x0c, - 0x60, 0x71, 0xf8, 0xb5, 0xf7, 0x61, 0x5a, 0xa6, 0xe5, 0xdb, 0x5c, 0xad, 0x63, 0x0f, 0xa6, 0x61, - 0x62, 0x7b, 0xd9, 0x5a, 0xb9, 0xfd, 0x35, 0xfb, 0xf6, 0xd6, 0xea, 0x6a, 0xf9, 0x14, 0x99, 0x84, - 0xa2, 0x00, 0x2c, 0x56, 0xcb, 0x06, 0x29, 0x41, 0x61, 0x65, 0xad, 0xbe, 0xbc, 0xb8, 0x65, 0x2d, - 0x97, 0x73, 0xd7, 0x5e, 0x85, 0xa9, 0xe4, 0xfd, 0x05, 0x63, 0x34, 0xc7, 0x21, 0x6f, 0x55, 0x77, - 0xca, 0xa7, 0x08, 0xc0, 0xd8, 0xc6, 0xbd, 0xc5, 0xfa, 0x8d, 0x1b, 0x65, 0xe3, 0xda, 0x17, 0x32, - 0x3e, 0x9e, 0xcd, 0x38, 0xd5, 0x69, 0xd7, 0x09, 0x9c, 0x88, 0xf2, 0x6a, 0xee, 0xf7, 0x5a, 0x91, - 0xd7, 0x6d, 0xd1, 0xc7, 0x65, 0xe3, 0xda, 0x5b, 0x7d, 0xdf, 0xc0, 0x26, 0x67, 0x60, 0x66, 0x6b, - 0xad, 0x7a, 0xbf, 0xb6, 0x72, 0x67, 0x6b, 0x7d, 0xab, 0x6e, 0xdf, 0xaf, 0x6e, 0x2e, 0xde, 0x2d, - 0x9f, 0x62, 0x0d, 0xbe, 0xbf, 0x5e, 0xdf, 0xb4, 0xad, 0xe5, 0xc5, 0xe5, 0xb5, 0xcd, 0xb2, 0x71, - 0xed, 0x57, 0x0d, 0x98, 0xd2, 0xbf, 0x13, 0x48, 0x2e, 0xc1, 0xc5, 0xad, 0xfa, 0xb2, 0x65, 0x6f, - 0xae, 0xdf, 0x5b, 0x5e, 0xb3, 0xb7, 0xea, 0xd5, 0x3b, 0xcb, 0xf6, 0xd6, 0x5a, 0x7d, 0x63, 0x79, - 0x71, 0xe5, 0xf6, 0xca, 0xf2, 0x52, 0xf9, 0x14, 0xa9, 0xc0, 0x0b, 0x0a, 0x86, 0xb5, 0xbc, 0xb8, - 0xbe, 0xbd, 0x6c, 0xd9, 0x1b, 0xd5, 0x7a, 0x7d, 0x67, 0xdd, 0x5a, 0x2a, 0x1b, 0xe4, 0x02, 0x9c, - 0xcd, 0x40, 0xb8, 0x7f, 0xbb, 0x5a, 0xce, 0xf5, 0x95, 0xad, 0x2d, 0xef, 0x54, 0x57, 0xed, 0xda, - 0xfa, 0x66, 0x39, 0x7f, 0xed, 0x7d, 0xa6, 0x85, 0x24, 0x1f, 0xf2, 0x20, 0x05, 0x18, 0x59, 0x5b, - 0x5f, 0x5b, 0x2e, 0x9f, 0x22, 0x13, 0x30, 0xbe, 0xb1, 0xbc, 0xb6, 0xb4, 0xb2, 0x76, 0x87, 0x0f, - 0x6b, 0x75, 0x63, 0xc3, 0x5a, 0xdf, 0x5e, 0x5e, 0x2a, 0xe7, 0xd8, 0xd8, 0x2d, 0x2d, 0xaf, 0xb1, - 0x96, 0xe5, 0xaf, 0x99, 0x3c, 0x79, 0xb5, 0x96, 0x7b, 0x95, 0x8d, 0xd6, 0xf2, 0x57, 0x37, 0x97, - 0xd7, 0xea, 0x2b, 0xeb, 0x6b, 0xe5, 0x53, 0xd7, 0x2e, 0xa6, 0x70, 0xe4, 0x4c, 0xd4, 0xeb, 0x77, - 0xcb, 0xa7, 0xae, 0x7d, 0x03, 0x4a, 0xea, 0x21, 0x4c, 0xce, 0xc1, 0xac, 0xfa, 0x7b, 0x83, 0x76, - 0x5c, 0xaf, 0xb3, 0x5b, 0x3e, 0x95, 0x2e, 0xb0, 0x7a, 0x9d, 0x0e, 0x2b, 0xc0, 0xce, 0xab, 0x05, - 0x9b, 0x34, 0x68, 0x7b, 0x1d, 0x76, 0xbe, 0x96, 0x73, 0xb5, 0xf2, 0xf7, 0xff, 0xf2, 0xa5, 0x53, - 0xdf, 0xff, 0xc1, 0x4b, 0xc6, 0x9f, 0xfd, 0xe0, 0x25, 0xe3, 0xbf, 0xff, 0xe0, 0x25, 0xa3, 0x31, - 0x86, 0x0b, 0xfd, 0xe6, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0x79, 0x55, 0xc2, 0x02, 0xb7, 0xb6, - 0x00, 0x00, + 0x66, 0x7a, 0xae, 0xbb, 0x47, 0x12, 0xed, 0x18, 0x76, 0x12, 0x38, 0x86, 0x61, 0xf8, 0x3e, 0x8c, + 0x33, 0x6c, 0x07, 0x4e, 0xec, 0x18, 0x31, 0x12, 0xc7, 0xb8, 0x20, 0x70, 0x02, 0x24, 0x01, 0x82, + 0x00, 0x06, 0x02, 0xe3, 0x7e, 0x24, 0x88, 0xff, 0x05, 0x76, 0x02, 0x26, 0xbe, 0xcb, 0x1f, 0x13, + 0xc8, 0xaf, 0xfc, 0xf2, 0x25, 0x46, 0x82, 0x7a, 0x55, 0xd5, 0x5d, 0xd5, 0xd3, 0x43, 0x8e, 0x56, + 0x5a, 0xc0, 0xda, 0x5f, 0xe4, 0xbc, 0x7a, 0xef, 0xd5, 0xf7, 0xab, 0xf7, 0xaa, 0xde, 0x7b, 0x0d, + 0x13, 0xd1, 0x41, 0x97, 0x86, 0xd7, 0xbb, 0x81, 0x1f, 0xf9, 0x64, 0x14, 0x7f, 0x5c, 0x38, 0xbd, + 0xeb, 0xef, 0xfa, 0x08, 0x99, 0x67, 0xff, 0xf1, 0xc2, 0x0b, 0x95, 0x5d, 0xdf, 0xdf, 0x6d, 0xd1, + 0x79, 0xfc, 0xd5, 0xe8, 0x3d, 0x98, 0x8f, 0xbc, 0x36, 0x0d, 0x23, 0xa7, 0xdd, 0x15, 0x08, 0x8b, + 0xbb, 0x5e, 0xb4, 0xd7, 0x6b, 0x5c, 0x6f, 0xfa, 0xed, 0xf9, 0xdd, 0xc0, 0x79, 0xe8, 0x45, 0x4e, + 0xe4, 0xf9, 0x1d, 0xa7, 0x35, 0x1f, 0xd1, 0x16, 0xed, 0xfa, 0x41, 0x34, 0xef, 0x74, 0xbd, 0x79, + 0xac, 0x63, 0xfe, 0x51, 0xe0, 0x74, 0xbb, 0x34, 0x48, 0xfe, 0xe1, 0x4c, 0xcc, 0x7f, 0x94, 0x87, + 0xe2, 0x3d, 0x4a, 0xbb, 0xd5, 0x96, 0xf7, 0x90, 0x92, 0x97, 0x61, 0x64, 0xcd, 0x69, 0xd3, 0x39, + 0xe3, 0x92, 0x71, 0xa5, 0x58, 0x9b, 0x3e, 0x3a, 0xac, 0x4c, 0x84, 0x34, 0x78, 0x48, 0x03, 0xbb, + 0xe3, 0xb4, 0xa9, 0x85, 0x85, 0xe4, 0xf3, 0x50, 0x64, 0x7f, 0xc3, 0xae, 0xd3, 0xa4, 0x73, 0x39, + 0xc4, 0x9c, 0x3c, 0x3a, 0xac, 0x14, 0x3b, 0x12, 0x68, 0x25, 0xe5, 0xe4, 0x32, 0x8c, 0xaf, 0x52, + 0x27, 0xa4, 0x2b, 0x4b, 0x73, 0xf9, 0x4b, 0xc6, 0x95, 0x7c, 0xad, 0x74, 0x74, 0x58, 0x29, 0xb4, + 0x18, 0xc8, 0xf6, 0x5c, 0x4b, 0x16, 0x92, 0x15, 0x18, 0x5f, 0x7e, 0xdc, 0xf5, 0x02, 0x1a, 0xce, + 0x8d, 0x5c, 0x32, 0xae, 0x4c, 0x2c, 0x5c, 0xb8, 0xce, 0xfb, 0x7f, 0x5d, 0xf6, 0xff, 0xfa, 0xa6, + 0xec, 0x7f, 0x6d, 0xf6, 0x07, 0x87, 0x95, 0x53, 0x47, 0x87, 0x95, 0x71, 0xca, 0x49, 0xbe, 0xf3, + 0xdf, 0x2b, 0x86, 0x25, 0xe9, 0xc9, 0x3b, 0x30, 0xb2, 0x79, 0xd0, 0xa5, 0x73, 0xc5, 0x4b, 0xc6, + 0x95, 0xa9, 0x85, 0x97, 0xae, 0xf3, 0x11, 0x8f, 0x3b, 0x99, 0xfc, 0xc7, 0xb0, 0x6a, 0x85, 0xa3, + 0xc3, 0xca, 0x08, 0x43, 0xb1, 0x90, 0x8a, 0xbc, 0x01, 0x63, 0x77, 0xfd, 0x30, 0x5a, 0x59, 0x9a, + 0x03, 0xec, 0xda, 0x99, 0xa3, 0xc3, 0xca, 0xcc, 0x9e, 0x1f, 0x46, 0xb6, 0xe7, 0xbe, 0xee, 0xb7, + 0xbd, 0x88, 0xb6, 0xbb, 0xd1, 0x81, 0x25, 0x90, 0xcc, 0x06, 0x4c, 0x6a, 0xfc, 0xc8, 0x04, 0x8c, + 0x6f, 0xad, 0xdd, 0x5b, 0x5b, 0xdf, 0x59, 0x2b, 0x9f, 0x22, 0x05, 0x18, 0x59, 0x5b, 0x5f, 0x5a, + 0x2e, 0x1b, 0x64, 0x1c, 0xf2, 0xd5, 0x8d, 0x8d, 0x72, 0x8e, 0x94, 0xa0, 0xb0, 0x54, 0xdd, 0xac, + 0xd6, 0xaa, 0xf5, 0xe5, 0x72, 0x9e, 0xcc, 0xc2, 0xf4, 0xce, 0xca, 0xda, 0xd2, 0xfa, 0x4e, 0xdd, + 0x5e, 0x5a, 0xae, 0xdf, 0xdb, 0x5c, 0xdf, 0x28, 0x8f, 0x90, 0x29, 0x80, 0x7b, 0x5b, 0xb5, 0x65, + 0x6b, 0x6d, 0x79, 0x73, 0xb9, 0x5e, 0x1e, 0x35, 0x7f, 0x29, 0x0f, 0x85, 0xfb, 0x34, 0x72, 0x5c, + 0x27, 0x72, 0xc8, 0x45, 0x6d, 0x8a, 0xb0, 0xf5, 0xca, 0xdc, 0xbc, 0xdc, 0x3f, 0x37, 0xa3, 0x47, + 0x87, 0x15, 0xe3, 0x0d, 0x75, 0x4e, 0xde, 0x86, 0x89, 0x25, 0x1a, 0x36, 0x03, 0xaf, 0xcb, 0xd6, + 0x0b, 0xce, 0x4b, 0xb1, 0x76, 0xfe, 0xe8, 0xb0, 0x72, 0xc6, 0x4d, 0xc0, 0x4a, 0x5f, 0x55, 0x6c, + 0xb2, 0x02, 0x63, 0xab, 0x4e, 0x83, 0xb6, 0xc2, 0xb9, 0xd1, 0x4b, 0xf9, 0x2b, 0x13, 0x0b, 0x2f, + 0x88, 0xf1, 0x95, 0x0d, 0xbc, 0xce, 0x4b, 0x97, 0x3b, 0x51, 0x70, 0x50, 0x3b, 0x7d, 0x74, 0x58, + 0x29, 0xb7, 0x10, 0xa0, 0x8e, 0x1d, 0x47, 0x21, 0xf5, 0x64, 0xce, 0xc7, 0x4e, 0x9c, 0xf3, 0x17, + 0x7f, 0x70, 0x58, 0x31, 0xd8, 0x5c, 0x88, 0x39, 0x4f, 0xf8, 0xe9, 0xb3, 0x7f, 0x09, 0x72, 0x2b, + 0x4b, 0x73, 0xe3, 0xb8, 0xd6, 0xca, 0x47, 0x87, 0x95, 0x92, 0x36, 0x6d, 0xb9, 0x95, 0xa5, 0x0b, + 0x6f, 0xc1, 0x84, 0xd2, 0x46, 0x52, 0x86, 0xfc, 0x3e, 0x3d, 0xe0, 0xe3, 0x69, 0xb1, 0x7f, 0xc9, + 0x69, 0x18, 0x7d, 0xe8, 0xb4, 0x7a, 0x62, 0x00, 0x2d, 0xfe, 0xe3, 0xcb, 0xb9, 0x9f, 0x30, 0xcc, + 0x5f, 0x1b, 0x81, 0x82, 0xe5, 0xf3, 0x7d, 0x46, 0xae, 0xc2, 0x68, 0x3d, 0x72, 0x22, 0x39, 0x15, + 0xb3, 0x47, 0x87, 0x95, 0xe9, 0x90, 0x01, 0x94, 0xfa, 0x38, 0x06, 0x43, 0xdd, 0xd8, 0x73, 0x42, + 0x39, 0x25, 0x88, 0xda, 0x65, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x65, 0x18, 0xb9, 0xef, 0xbb, 0x54, + 0xcc, 0x0a, 0x39, 0x3a, 0xac, 0x4c, 0xb5, 0x7d, 0x57, 0x45, 0xc4, 0x72, 0xf2, 0x3a, 0x14, 0x17, + 0x7b, 0x41, 0x40, 0x3b, 0x6c, 0xa9, 0x8e, 0x20, 0xf2, 0xd4, 0xd1, 0x61, 0x05, 0x9a, 0x1c, 0xc8, + 0x36, 0x57, 0x82, 0xc0, 0x86, 0xba, 0x1e, 0x39, 0x41, 0x44, 0xdd, 0xb9, 0xd1, 0xa1, 0x86, 0x9a, + 0x6d, 0xaf, 0x99, 0x90, 0x93, 0xa4, 0x87, 0x5a, 0x70, 0x22, 0x77, 0x61, 0xe2, 0x4e, 0xe0, 0x34, + 0xe9, 0x06, 0x0d, 0x3c, 0xdf, 0xc5, 0x39, 0xcc, 0xd7, 0x2e, 0x1f, 0x1d, 0x56, 0xce, 0xee, 0x32, + 0xb0, 0xdd, 0x45, 0x78, 0x42, 0xfd, 0xe3, 0xc3, 0x4a, 0x61, 0xa9, 0x17, 0xe0, 0xe8, 0x59, 0x2a, + 0x29, 0xf9, 0x69, 0x36, 0x25, 0x61, 0x84, 0x43, 0x4b, 0x5d, 0x9c, 0xbd, 0xe3, 0x9b, 0x68, 0x8a, + 0x26, 0x9e, 0x6d, 0x39, 0x61, 0x64, 0x07, 0x9c, 0x2e, 0xd5, 0x4e, 0x95, 0x25, 0x59, 0x87, 0x42, + 0xbd, 0xb9, 0x47, 0xdd, 0x5e, 0x8b, 0xce, 0x15, 0x90, 0xfd, 0x39, 0xb1, 0x70, 0xe5, 0x7c, 0xca, + 0xe2, 0xda, 0x05, 0xc1, 0x9b, 0x84, 0x02, 0xa2, 0x8c, 0x7d, 0xcc, 0xe4, 0xcb, 0x85, 0xdf, 0xfc, + 0xdd, 0xca, 0xa9, 0x5f, 0xf8, 0x6f, 0x97, 0x4e, 0x99, 0xff, 0x3a, 0x07, 0xe5, 0x34, 0x13, 0xf2, + 0x00, 0x26, 0xb7, 0xba, 0xae, 0x13, 0xd1, 0xc5, 0x96, 0x47, 0x3b, 0x51, 0x88, 0x8b, 0xe4, 0xf8, + 0x3e, 0xbd, 0x22, 0xea, 0x9d, 0xeb, 0x21, 0xa1, 0xdd, 0xe4, 0x94, 0xa9, 0x5e, 0xe9, 0x6c, 0x93, + 0x7a, 0xea, 0x28, 0xa7, 0x43, 0x5c, 0x61, 0x4f, 0x56, 0x0f, 0x97, 0xf0, 0x03, 0xea, 0x11, 0x6c, + 0xc5, 0x02, 0xea, 0xb8, 0x8d, 0x03, 0x5c, 0x99, 0xc3, 0x2f, 0x20, 0x46, 0x92, 0xb1, 0x80, 0x18, + 0xd8, 0xfc, 0x9f, 0x06, 0x4c, 0x59, 0x34, 0xf4, 0x7b, 0x41, 0x93, 0xde, 0xa5, 0x8e, 0x4b, 0x03, + 0xb6, 0xfc, 0xef, 0x79, 0x1d, 0x57, 0xec, 0x29, 0x5c, 0xfe, 0xfb, 0x5e, 0x47, 0xdd, 0xc2, 0x58, + 0x4e, 0xbe, 0x00, 0xe3, 0xf5, 0x5e, 0x03, 0x51, 0xf9, 0x9e, 0x3a, 0x8b, 0x33, 0xd6, 0x6b, 0xd8, + 0x29, 0x74, 0x89, 0x46, 0xe6, 0x61, 0x7c, 0x9b, 0x06, 0x61, 0x22, 0xf1, 0x50, 0xb2, 0x3f, 0xe4, + 0x20, 0x95, 0x40, 0x60, 0x91, 0x3b, 0x89, 0xd4, 0x15, 0x67, 0xd2, 0x74, 0x4a, 0xd6, 0x25, 0x4b, + 0xa5, 0x2d, 0x20, 0xea, 0x52, 0x91, 0x58, 0xe6, 0x77, 0x73, 0x50, 0x5e, 0x72, 0x22, 0xa7, 0xe1, + 0x84, 0x62, 0x3c, 0xb7, 0x6f, 0x32, 0x39, 0xae, 0x74, 0x14, 0xe5, 0x38, 0x6b, 0xf9, 0x27, 0xee, + 0xde, 0xab, 0xe9, 0xee, 0x4d, 0xb0, 0x03, 0x52, 0x74, 0x2f, 0xe9, 0xd4, 0xbb, 0x27, 0x77, 0xaa, + 0x2c, 0x3a, 0x55, 0x90, 0x9d, 0x4a, 0xba, 0x42, 0xde, 0x85, 0x91, 0x7a, 0x97, 0x36, 0x85, 0x10, + 0x91, 0xb2, 0x5f, 0xef, 0x1c, 0x43, 0xd8, 0xbe, 0x59, 0x2b, 0x09, 0x36, 0x23, 0x61, 0x97, 0x36, + 0x2d, 0x24, 0x53, 0x36, 0xcd, 0xf7, 0xc6, 0xe0, 0x74, 0x16, 0x19, 0x79, 0x57, 0x3f, 0x9c, 0xf8, + 0xf0, 0xbc, 0x30, 0xf0, 0x70, 0x9a, 0x33, 0xf4, 0xe3, 0xe9, 0x1a, 0x14, 0x36, 0xd8, 0x82, 0x6c, + 0xfa, 0x2d, 0x31, 0x72, 0x4c, 0x2a, 0x16, 0xba, 0x12, 0x66, 0x58, 0x71, 0x39, 0x79, 0x01, 0xf2, + 0x5b, 0xd6, 0x8a, 0x18, 0xae, 0xe2, 0xd1, 0x61, 0x25, 0xdf, 0x0b, 0xbc, 0x39, 0xc3, 0x62, 0x50, + 0x32, 0x0f, 0x63, 0x8b, 0xd5, 0x45, 0x1a, 0x44, 0x38, 0x4c, 0xa5, 0xda, 0x39, 0xb6, 0x5a, 0x9a, + 0x8e, 0xdd, 0xa4, 0x41, 0xa4, 0x55, 0x2f, 0xd0, 0xc8, 0xe7, 0x21, 0x5f, 0xdd, 0xa9, 0x8b, 0x91, + 0x01, 0x31, 0x32, 0xd5, 0x9d, 0x7a, 0x6d, 0x52, 0x0c, 0x44, 0xde, 0x79, 0x14, 0x32, 0xee, 0xd5, + 0x9d, 0xba, 0x3a, 0x5b, 0x63, 0xc7, 0xcc, 0xd6, 0x15, 0x28, 0x30, 0x3d, 0x83, 0x1d, 0xf0, 0x28, + 0x14, 0x8b, 0x5c, 0x7d, 0xda, 0x13, 0x30, 0x2b, 0x2e, 0x25, 0x2f, 0xc7, 0x6a, 0x4b, 0x21, 0xe1, + 0x27, 0xd4, 0x16, 0xa9, 0xac, 0x90, 0xc7, 0x30, 0xb9, 0x74, 0xd0, 0x71, 0xda, 0x5e, 0x53, 0x1c, + 0xe1, 0x45, 0x3c, 0xc2, 0xaf, 0x1f, 0x33, 0x8d, 0xd7, 0x35, 0x02, 0x7e, 0xaa, 0x4b, 0xe1, 0x3b, + 0xe7, 0xf2, 0x32, 0x3b, 0x7d, 0xc2, 0xcf, 0x19, 0x96, 0x5e, 0x11, 0xdb, 0x4b, 0x52, 0x44, 0xa2, + 0x5e, 0x95, 0x2c, 0x3b, 0x09, 0x4e, 0xf6, 0x52, 0x20, 0x20, 0xea, 0x5e, 0x8a, 0x0f, 0xdd, 0x77, + 0x21, 0x7f, 0x67, 0x71, 0x63, 0x6e, 0x02, 0x79, 0x10, 0xc1, 0xe3, 0xce, 0xe2, 0xc6, 0x62, 0xcb, + 0xef, 0xb9, 0xf5, 0x0f, 0x57, 0x6b, 0xe7, 0x04, 0x9b, 0xc9, 0xdd, 0x66, 0x57, 0x6b, 0x11, 0xa3, + 0x23, 0xcb, 0x50, 0x90, 0xbd, 0x9c, 0x2b, 0x21, 0x8f, 0x99, 0x54, 0xe7, 0xb7, 0x6f, 0xf2, 0xbd, + 0xe6, 0x8a, 0xdf, 0x6a, 0x2b, 0x24, 0xce, 0x85, 0x1d, 0x20, 0xfd, 0xe3, 0x92, 0xa1, 0x49, 0x7c, + 0x5e, 0xd5, 0x24, 0x26, 0x16, 0xce, 0x88, 0xba, 0x16, 0xfd, 0x76, 0xdb, 0xe9, 0xb8, 0x48, 0xbb, + 0xbd, 0xa0, 0x2a, 0x18, 0x55, 0x98, 0x4a, 0x1a, 0xb2, 0xea, 0x85, 0x11, 0x99, 0x87, 0xa2, 0x84, + 0xb0, 0x43, 0x24, 0x9f, 0xd9, 0x64, 0x2b, 0xc1, 0x31, 0xff, 0x24, 0x07, 0x90, 0x94, 0x3c, 0xa7, + 0x72, 0xe6, 0x4b, 0x9a, 0x9c, 0x39, 0x93, 0x5e, 0xa0, 0x03, 0x25, 0x0c, 0x79, 0x1f, 0xc6, 0x98, + 0xca, 0xd5, 0x93, 0x2a, 0xe5, 0xb9, 0x34, 0x29, 0x16, 0x6e, 0xdf, 0xac, 0x4d, 0x09, 0xe2, 0xb1, + 0x10, 0x21, 0x96, 0x20, 0x53, 0x44, 0xd4, 0x1f, 0x8d, 0x26, 0x93, 0x21, 0x84, 0xd3, 0x15, 0x45, + 0xba, 0x18, 0xc9, 0x7e, 0x94, 0xd2, 0x45, 0x91, 0x2d, 0xe7, 0xb9, 0x6c, 0xe1, 0x83, 0x3a, 0x2e, + 0x64, 0x4b, 0x5a, 0xb2, 0xf0, 0x01, 0x3c, 0x51, 0xb2, 0x74, 0xd3, 0xdb, 0x76, 0x04, 0x97, 0xc1, + 0x95, 0xcc, 0x51, 0xc9, 0xda, 0xb0, 0x97, 0x4e, 0xda, 0xb0, 0xe9, 0xed, 0x7a, 0x73, 0x90, 0x2c, + 0x3b, 0x23, 0x77, 0x97, 0xf3, 0x48, 0x25, 0x47, 0x99, 0xf6, 0x36, 0xdf, 0x9a, 0x63, 0x03, 0xb7, + 0xe6, 0x99, 0xcc, 0xad, 0xc9, 0x37, 0xe6, 0xdb, 0x30, 0x5a, 0xfd, 0x99, 0x5e, 0x40, 0x85, 0xee, + 0x57, 0x92, 0x75, 0x32, 0x58, 0xbc, 0xa7, 0xa7, 0x1d, 0xf6, 0x53, 0xd5, 0x99, 0xb1, 0x9c, 0xd5, + 0xbc, 0xb9, 0x5a, 0x17, 0x7a, 0x1d, 0x49, 0x0d, 0xcb, 0xe6, 0xaa, 0xd2, 0xec, 0x48, 0xeb, 0x35, + 0xa3, 0x22, 0xf3, 0x90, 0xab, 0x2e, 0xa1, 0xb1, 0x38, 0xb1, 0x50, 0x94, 0xd5, 0x2e, 0xd5, 0x4e, + 0x0b, 0x92, 0x92, 0xa3, 0xd9, 0x0f, 0xd5, 0x25, 0x52, 0x83, 0xd1, 0xfb, 0x07, 0xf5, 0x0f, 0x57, + 0x85, 0x20, 0x9b, 0x95, 0xeb, 0x9a, 0xc1, 0xd6, 0xf1, 0x14, 0x0a, 0x93, 0x16, 0xb7, 0x0f, 0xc2, + 0x6f, 0xb6, 0xd4, 0x16, 0x23, 0xda, 0xa7, 0x27, 0x40, 0xfe, 0x85, 0xa1, 0xe8, 0x1a, 0x62, 0xad, + 0x33, 0x9b, 0x56, 0xac, 0x38, 0x23, 0xd1, 0x7c, 0xfa, 0x56, 0x5c, 0xbc, 0xde, 0xae, 0xf2, 0xd9, + 0xcf, 0xf5, 0xcd, 0xfe, 0x84, 0x72, 0x92, 0xf1, 0x39, 0x8f, 0xc7, 0x22, 0xff, 0x89, 0xc7, 0xc2, + 0xfc, 0x4b, 0x03, 0xeb, 0x23, 0xaf, 0xc3, 0x98, 0x45, 0x77, 0x93, 0x43, 0x1f, 0x8d, 0xc7, 0x00, + 0x21, 0x6a, 0x23, 0x39, 0x0e, 0x9e, 0x28, 0xd4, 0x0d, 0xf7, 0xbc, 0x07, 0x91, 0x68, 0x69, 0x7c, + 0xa2, 0x08, 0xb0, 0x72, 0xa2, 0x08, 0x88, 0x76, 0xa2, 0x08, 0x18, 0x5b, 0xeb, 0xd6, 0x52, 0x5d, + 0x74, 0x40, 0xf6, 0xd6, 0x5a, 0x52, 0x16, 0x4d, 0xe0, 0x6a, 0x8b, 0xc6, 0x5a, 0xaa, 0x93, 0x5b, + 0x50, 0xac, 0x36, 0x9b, 0x7e, 0x4f, 0xb1, 0xbe, 0xe6, 0x8e, 0x0e, 0x2b, 0xa7, 0x1d, 0x0e, 0xd4, + 0xef, 0x0a, 0x12, 0x54, 0xb3, 0x96, 0xb4, 0x9a, 0xf1, 0x58, 0x6c, 0xf5, 0xc2, 0x88, 0x06, 0x2b, + 0x4b, 0xa2, 0xcb, 0xc8, 0xa3, 0xc9, 0x81, 0x29, 0x1e, 0x31, 0xaa, 0xf9, 0x5f, 0x0d, 0x6c, 0x31, + 0x79, 0x0b, 0x60, 0xa5, 0xc3, 0x34, 0xec, 0x26, 0x8d, 0x19, 0xa0, 0x15, 0xef, 0x09, 0xa8, 0xce, + 0x41, 0x41, 0xd6, 0xab, 0xce, 0x0d, 0x5d, 0x35, 0xab, 0x52, 0xea, 0xeb, 0xe2, 0x42, 0x47, 0x54, + 0x19, 0x08, 0x68, 0xaa, 0xca, 0x04, 0x99, 0x5c, 0x86, 0xf1, 0x95, 0xea, 0xfd, 0x6a, 0x2f, 0xda, + 0xc3, 0xf1, 0x2a, 0x70, 0xc9, 0xe9, 0x39, 0x6d, 0xdb, 0xe9, 0x45, 0x7b, 0x96, 0x2c, 0x34, 0x7f, + 0xc1, 0x80, 0x09, 0x45, 0x68, 0xb0, 0xa6, 0x6e, 0x04, 0xfe, 0xc7, 0xb4, 0x19, 0xe9, 0xa3, 0xd4, + 0xe5, 0xc0, 0x54, 0x53, 0x63, 0xd4, 0xd4, 0xe8, 0xe4, 0x9e, 0x60, 0x74, 0xcc, 0x79, 0x21, 0x8b, + 0x98, 0x31, 0xa2, 0xdc, 0xb5, 0xa0, 0x31, 0xc2, 0x94, 0x2d, 0xd5, 0x18, 0x61, 0xe5, 0xe6, 0x1f, + 0x18, 0x4c, 0x86, 0x90, 0x79, 0x80, 0x7b, 0xf4, 0x20, 0x72, 0x1a, 0xb7, 0xbd, 0x96, 0x76, 0x87, + 0xb6, 0x8f, 0x50, 0xfb, 0x81, 0xd7, 0xa2, 0x96, 0x82, 0x42, 0x6e, 0x42, 0xe1, 0x5e, 0xd0, 0x78, + 0x13, 0xd1, 0x73, 0xf1, 0x59, 0x30, 0xbb, 0x1f, 0x34, 0xde, 0x44, 0x64, 0x75, 0xbd, 0x4a, 0x44, + 0x62, 0xc2, 0xd8, 0x92, 0xdf, 0x76, 0x3c, 0x79, 0xfe, 0x02, 0x3b, 0xc4, 0x5c, 0x84, 0x58, 0xa2, + 0x84, 0x9d, 0x3e, 0xf5, 0x8d, 0x35, 0xb1, 0x30, 0xf1, 0xf4, 0x09, 0xbb, 0x1d, 0x8b, 0xc1, 0xcc, + 0xef, 0x1b, 0x30, 0xa1, 0x88, 0x46, 0xf2, 0x45, 0x71, 0xdf, 0x60, 0xe0, 0x6d, 0xd9, 0xd9, 0x7e, + 0xe1, 0xc9, 0x4a, 0xb9, 0xde, 0xd0, 0xf6, 0x5d, 0x2a, 0x6e, 0x1f, 0x12, 0x89, 0x92, 0x1b, 0x46, + 0xa2, 0xbc, 0x05, 0xc0, 0x95, 0x4a, 0x1c, 0x4e, 0x65, 0xdd, 0x28, 0xb7, 0x8b, 0xea, 0x64, 0x24, + 0xc8, 0xa6, 0x05, 0x25, 0x55, 0x9a, 0x90, 0x1a, 0x4c, 0x0a, 0x1b, 0x4a, 0x68, 0x21, 0x7c, 0x9c, + 0x2f, 0xb2, 0xe3, 0x4d, 0x70, 0xeb, 0xb7, 0xe9, 0x74, 0x12, 0xf3, 0x6f, 0xe7, 0xa0, 0x20, 0x20, + 0x0b, 0xcf, 0xa9, 0x82, 0xf4, 0xa6, 0xa6, 0x20, 0x49, 0xb9, 0xab, 0x68, 0xee, 0x0b, 0x27, 0x18, + 0x60, 0x6f, 0x41, 0x49, 0x0e, 0x01, 0xea, 0x99, 0x57, 0x61, 0x5c, 0x5e, 0x21, 0x70, 0x2d, 0x73, + 0x5a, 0xe3, 0xb9, 0xbd, 0x60, 0xc9, 0x72, 0xf3, 0xbb, 0xa3, 0x92, 0x96, 0xd7, 0xc4, 0x86, 0xb0, + 0xea, 0xba, 0x81, 0x3a, 0x84, 0x8e, 0xeb, 0x06, 0x16, 0x42, 0xd9, 0xe4, 0x6f, 0xf4, 0x1a, 0x2d, + 0xaf, 0x89, 0x38, 0xca, 0x4e, 0xec, 0x22, 0xd4, 0x66, 0xa8, 0xea, 0xe4, 0x27, 0xc8, 0x9a, 0xfd, + 0x93, 0x3f, 0xd6, 0xfe, 0xf9, 0x29, 0x28, 0x2e, 0xb6, 0x5d, 0x4d, 0x3f, 0x32, 0x33, 0x06, 0xe5, + 0x7a, 0x8c, 0xc4, 0x35, 0xa3, 0x8b, 0x62, 0x8c, 0x4e, 0x37, 0xdb, 0x6e, 0xbf, 0x56, 0x94, 0xb0, + 0xd4, 0x0c, 0x98, 0xd1, 0xa7, 0x31, 0x60, 0x6e, 0x41, 0x71, 0x2b, 0xa4, 0x9b, 0xbd, 0x4e, 0x87, + 0xb6, 0x50, 0x57, 0x2a, 0x70, 0x79, 0xd6, 0x0b, 0xa9, 0x1d, 0x21, 0x54, 0x6d, 0x40, 0x8c, 0xaa, + 0x2e, 0xab, 0xf1, 0x63, 0x96, 0xd5, 0x17, 0x61, 0xa4, 0xda, 0xed, 0x4a, 0xcb, 0x2e, 0x3e, 0xbc, + 0xbb, 0x5d, 0x3c, 0x4e, 0xa7, 0x9c, 0x6e, 0x57, 0xb7, 0xd3, 0x10, 0x9b, 0x50, 0x20, 0xf7, 0x7a, + 0x0d, 0x1a, 0x74, 0x68, 0x44, 0x43, 0x21, 0xee, 0xc3, 0x39, 0x40, 0x1e, 0x73, 0xf2, 0x02, 0x3d, + 0x8d, 0x80, 0x56, 0xf9, 0xb9, 0xfd, 0x5e, 0x83, 0xda, 0xe2, 0xdc, 0x50, 0xc7, 0x2e, 0x83, 0xe1, + 0x85, 0x3a, 0x4c, 0xe9, 0xe3, 0xff, 0x0c, 0x34, 0x9e, 0x0f, 0x46, 0x0a, 0x85, 0x72, 0xd1, 0xfc, + 0xa5, 0x1c, 0x4c, 0x54, 0xbb, 0xdd, 0xe7, 0xfc, 0x7a, 0xe5, 0x27, 0xb4, 0x5d, 0x7d, 0x36, 0x99, + 0xbd, 0x27, 0xb8, 0x59, 0xf9, 0x2b, 0x03, 0xa6, 0x53, 0x14, 0x6a, 0xeb, 0x8d, 0x21, 0xaf, 0x1b, + 0x72, 0x43, 0x5e, 0x37, 0xe4, 0x07, 0x5f, 0x37, 0xa8, 0x7b, 0x66, 0xe4, 0x69, 0xf6, 0xcc, 0x6b, + 0x90, 0xaf, 0x76, 0xbb, 0x62, 0x54, 0x4a, 0xc9, 0xa8, 0x6c, 0xdf, 0xe4, 0x87, 0x9b, 0xd3, 0xed, + 0x5a, 0x0c, 0xc3, 0x7c, 0x03, 0x8a, 0x08, 0x46, 0x89, 0x76, 0x49, 0x6c, 0x05, 0x2e, 0xce, 0x34, + 0x32, 0xbe, 0xec, 0xcd, 0xff, 0x63, 0xc0, 0x28, 0xfe, 0x7e, 0x4e, 0x97, 0xcb, 0x82, 0xb6, 0x5c, + 0xca, 0xca, 0x72, 0x19, 0x66, 0xa1, 0xfc, 0x51, 0x1e, 0x47, 0x4b, 0x2c, 0x11, 0x61, 0xb0, 0x1a, + 0x19, 0x06, 0xeb, 0x53, 0x08, 0xf0, 0xfd, 0xb4, 0xe9, 0x9a, 0xc7, 0xc9, 0x78, 0x39, 0xdd, 0xd4, + 0x67, 0x62, 0xb5, 0xde, 0x05, 0xb2, 0xd2, 0x09, 0x69, 0xb3, 0x17, 0xd0, 0xfa, 0xbe, 0xd7, 0xdd, + 0xa6, 0x81, 0xf7, 0xe0, 0x40, 0x68, 0x9b, 0x28, 0x63, 0x3d, 0x51, 0x6a, 0x87, 0xfb, 0x5e, 0x97, + 0xa9, 0x09, 0xde, 0x83, 0x03, 0x2b, 0x83, 0x86, 0xbc, 0x0f, 0xe3, 0x16, 0x7d, 0x14, 0x78, 0x11, + 0x15, 0x63, 0x3b, 0x15, 0xdb, 0x16, 0x08, 0xe5, 0xfa, 0x4e, 0xc0, 0x7f, 0xa8, 0xf3, 0x2f, 0xca, + 0x3f, 0x3d, 0xfb, 0xee, 0x7b, 0xa3, 0xb8, 0x17, 0x4e, 0x78, 0x06, 0x3c, 0xe6, 0xf6, 0x41, 0x9f, + 0xcc, 0xfc, 0x93, 0x4c, 0xe6, 0x36, 0x94, 0x98, 0x49, 0x99, 0xba, 0x86, 0xb8, 0x98, 0xcc, 0xe5, + 0x75, 0xb5, 0xf8, 0xb8, 0x17, 0x40, 0x8d, 0x0f, 0xb1, 0xd3, 0x8b, 0x84, 0xbf, 0x2c, 0xbe, 0xa8, + 0x30, 0xce, 0x58, 0x1e, 0xb1, 0xe8, 0x68, 0xf2, 0xc1, 0x7a, 0xe2, 0x85, 0x31, 0xf6, 0x74, 0x0b, + 0x63, 0xfc, 0x93, 0x2c, 0x8c, 0xf4, 0xdb, 0x6b, 0xe1, 0x49, 0xde, 0x5e, 0x2f, 0xbc, 0x0f, 0x33, + 0x7d, 0x23, 0xfc, 0x24, 0xef, 0x97, 0x9f, 0xde, 0xb2, 0xfc, 0xb9, 0x78, 0x5c, 0xc8, 0x02, 0x9a, + 0xb8, 0x5e, 0x40, 0x9b, 0x11, 0x8a, 0x5e, 0x21, 0x2d, 0x03, 0x01, 0x4b, 0xd9, 0xe0, 0x08, 0x23, + 0xef, 0xc1, 0x38, 0x7f, 0xff, 0x09, 0xe7, 0x72, 0x38, 0xf7, 0x93, 0xa2, 0x46, 0x0e, 0x15, 0x8f, + 0xf0, 0x1c, 0x43, 0x1d, 0x55, 0x41, 0x64, 0xde, 0x81, 0x31, 0xf1, 0x7e, 0x74, 0xfc, 0xbe, 0xa8, + 0xc0, 0xe8, 0x76, 0x32, 0x32, 0x78, 0xe7, 0xcf, 0x3b, 0x61, 0x71, 0xb8, 0xf9, 0x2b, 0x06, 0x4c, + 0xe9, 0xbd, 0x24, 0xd7, 0x61, 0x4c, 0x3c, 0x70, 0x1a, 0xf8, 0xc0, 0xc9, 0x7a, 0x33, 0xc6, 0x9f, + 0x36, 0xb5, 0x07, 0x4d, 0x81, 0xc5, 0x44, 0xbf, 0xe0, 0x80, 0x7d, 0x11, 0xa2, 0x5f, 0x2c, 0x52, + 0x4b, 0x96, 0x31, 0x33, 0xce, 0xa2, 0x61, 0xaf, 0x15, 0xa9, 0x66, 0x5c, 0x80, 0x10, 0x4b, 0x94, + 0x98, 0x87, 0x06, 0x40, 0xbd, 0x7e, 0xf7, 0x1e, 0x3d, 0xd8, 0x70, 0xbc, 0x00, 0x4d, 0x61, 0xdc, + 0x8d, 0xf7, 0xc4, 0x6c, 0x95, 0x84, 0x29, 0xcc, 0x77, 0xee, 0x3e, 0x3d, 0xd0, 0x4c, 0x61, 0x89, + 0x8a, 0x5b, 0x3e, 0xf0, 0x1e, 0x3a, 0x11, 0x65, 0x84, 0x39, 0x24, 0xe4, 0x5b, 0x9e, 0x43, 0x53, + 0x94, 0x0a, 0x32, 0xf9, 0x08, 0xa6, 0x92, 0x5f, 0xe8, 0x55, 0x91, 0x47, 0x3b, 0x51, 0xae, 0x08, + 0xbd, 0xb0, 0xf6, 0xd2, 0xd1, 0x61, 0xe5, 0x82, 0xc2, 0xd5, 0x66, 0x58, 0x0a, 0xeb, 0x14, 0x33, + 0xf3, 0xf7, 0x0c, 0x80, 0xcd, 0xd5, 0xba, 0xec, 0xe0, 0x65, 0x18, 0x89, 0x6f, 0xa9, 0x4a, 0xdc, + 0xde, 0x4e, 0x19, 0x94, 0x58, 0x4e, 0x5e, 0x86, 0x7c, 0xd2, 0x93, 0x99, 0xa3, 0xc3, 0xca, 0xa4, + 0xde, 0x03, 0x56, 0x4a, 0xee, 0xc0, 0xf8, 0x50, 0x6d, 0xc6, 0xd5, 0x99, 0xd1, 0x56, 0x49, 0x8d, + 0xb3, 0xf0, 0xc1, 0xce, 0xe6, 0x67, 0x77, 0x16, 0xbe, 0x9d, 0x83, 0x69, 0x36, 0xae, 0xd5, 0x5e, + 0xb4, 0xe7, 0x07, 0x5e, 0x74, 0xf0, 0xdc, 0x5a, 0xc5, 0xef, 0x68, 0x0a, 0xd1, 0x05, 0x29, 0xb6, + 0xd4, 0xbe, 0x0d, 0x65, 0x1c, 0xff, 0xc5, 0x38, 0xcc, 0x66, 0x50, 0x91, 0xd7, 0x85, 0x6b, 0x51, + 0x72, 0x0f, 0x85, 0xae, 0x43, 0x3f, 0x3e, 0xac, 0x94, 0x24, 0xfa, 0x66, 0xe2, 0x4a, 0xb4, 0x00, + 0x13, 0xc2, 0xf4, 0x59, 0x4b, 0x34, 0x6a, 0xf4, 0x49, 0x91, 0xf7, 0x6c, 0x28, 0x9a, 0x54, 0x24, + 0x52, 0x85, 0xd2, 0xe2, 0x1e, 0x6d, 0xee, 0x7b, 0x9d, 0xdd, 0x7b, 0xf4, 0x80, 0xeb, 0x4b, 0xa5, + 0xda, 0x8b, 0xcc, 0xd2, 0x6a, 0x0a, 0x38, 0x9b, 0x52, 0xdd, 0x88, 0xd3, 0x48, 0xc8, 0x7b, 0x30, + 0x51, 0xf7, 0x76, 0x3b, 0x92, 0xc3, 0x08, 0x72, 0xb8, 0x78, 0x74, 0x58, 0x39, 0x1b, 0x72, 0x70, + 0x3f, 0x03, 0x95, 0x80, 0x5c, 0x85, 0x51, 0xcb, 0x6f, 0x51, 0x7e, 0x0c, 0x0b, 0x67, 0x95, 0x80, + 0x01, 0xd4, 0xab, 0x5b, 0xc4, 0x20, 0x77, 0x61, 0x9c, 0xfd, 0x73, 0xdf, 0xe9, 0xce, 0x8d, 0xa1, + 0xdc, 0x26, 0xb1, 0x82, 0x8f, 0xd0, 0xae, 0xd7, 0xd9, 0x55, 0x75, 0xfc, 0x16, 0xb5, 0xdb, 0x4e, + 0x57, 0x3b, 0x17, 0x39, 0x22, 0xd9, 0x86, 0x89, 0x44, 0x10, 0x84, 0x73, 0xe3, 0xda, 0x43, 0x57, + 0x52, 0x52, 0xfb, 0x9c, 0x60, 0x76, 0x2e, 0x6a, 0x85, 0xb8, 0xb6, 0xbb, 0x0c, 0x5f, 0xef, 0x8c, + 0xc2, 0x48, 0xb3, 0x41, 0x0a, 0x83, 0x6d, 0x10, 0xe3, 0x44, 0x1b, 0xc4, 0x05, 0x10, 0x83, 0x54, + 0x6d, 0xed, 0x0a, 0xdf, 0xb2, 0xab, 0x83, 0x17, 0xd8, 0xf5, 0x04, 0x19, 0xf7, 0x24, 0xbf, 0xed, + 0x12, 0xe3, 0xef, 0xb4, 0x76, 0xb5, 0xdb, 0xae, 0x18, 0x95, 0x0d, 0x43, 0x22, 0x6a, 0xa4, 0x05, + 0x2e, 0x87, 0x21, 0x29, 0x49, 0x86, 0xe1, 0xe3, 0x47, 0xd1, 0xa0, 0x61, 0x50, 0x18, 0x91, 0x35, + 0x80, 0x6a, 0x33, 0xf2, 0x1e, 0x52, 0x5c, 0x12, 0x13, 0xda, 0x40, 0x2c, 0x56, 0xef, 0xd1, 0x83, + 0x3a, 0x8d, 0x62, 0xb7, 0x8d, 0x33, 0x0e, 0xa2, 0xa6, 0x96, 0x89, 0xa5, 0x70, 0x20, 0x5d, 0x38, + 0x53, 0x75, 0x5d, 0x8f, 0xfb, 0x1b, 0x6e, 0x06, 0x6c, 0xfd, 0xba, 0xc8, 0xba, 0x94, 0xcd, 0xfa, + 0xaa, 0x60, 0xfd, 0x39, 0x27, 0xa6, 0xb2, 0x23, 0x4e, 0x96, 0xae, 0x26, 0x9b, 0xb1, 0xb9, 0x0e, + 0x53, 0xfa, 0x90, 0xea, 0x9e, 0x76, 0x25, 0x28, 0x58, 0xf5, 0xaa, 0x5d, 0xbf, 0x5b, 0xbd, 0x51, + 0x36, 0x48, 0x19, 0x4a, 0xe2, 0xd7, 0x82, 0xbd, 0xf0, 0xe6, 0xad, 0x72, 0x4e, 0x83, 0xbc, 0x79, + 0x63, 0xa1, 0x9c, 0x37, 0xff, 0xc8, 0x80, 0x82, 0x6c, 0x1f, 0xb9, 0x05, 0xf9, 0x7a, 0xfd, 0x6e, + 0xea, 0x7d, 0x35, 0x39, 0x7a, 0xf9, 0x21, 0x13, 0x86, 0x7b, 0xea, 0x21, 0x53, 0xaf, 0xdf, 0x65, + 0x74, 0x9b, 0xab, 0x75, 0xa1, 0xb4, 0x64, 0x2c, 0xd7, 0x99, 0x01, 0x8f, 0x4e, 0xb7, 0x20, 0xff, + 0xc1, 0xce, 0xa6, 0xb0, 0x86, 0x32, 0xe6, 0x17, 0xe9, 0x3e, 0x7e, 0xa4, 0x1e, 0x7d, 0x8c, 0xc0, + 0xb4, 0x60, 0x42, 0xd9, 0x5a, 0x5c, 0x89, 0x68, 0xfb, 0xb1, 0x0f, 0x9a, 0x50, 0x22, 0x18, 0xc4, + 0x12, 0x25, 0x4c, 0xe7, 0x59, 0xf5, 0x9b, 0x4e, 0x4b, 0x68, 0x23, 0xa8, 0xf3, 0xb4, 0x18, 0xc0, + 0xe2, 0x70, 0xf3, 0x8f, 0x0d, 0x28, 0x6f, 0x04, 0xfe, 0x43, 0x8f, 0x49, 0xe0, 0x4d, 0x7f, 0x9f, + 0x76, 0xb6, 0x6f, 0x90, 0x37, 0xa4, 0x10, 0xe0, 0x2a, 0xdc, 0x39, 0x46, 0x85, 0x42, 0xe0, 0xc7, + 0x87, 0x15, 0xa8, 0x1f, 0x84, 0x11, 0x6d, 0xb3, 0x72, 0x29, 0x08, 0x14, 0x57, 0xbe, 0xdc, 0xf0, + 0xee, 0x41, 0x27, 0xb8, 0xf2, 0x55, 0x60, 0x14, 0x9b, 0xa3, 0x78, 0x68, 0x8c, 0x46, 0x0c, 0x60, + 0x71, 0xb8, 0x22, 0xb0, 0xbf, 0x9b, 0xeb, 0xeb, 0xc3, 0xc2, 0x67, 0xca, 0xc5, 0x46, 0xef, 0xdc, + 0x50, 0x87, 0xd8, 0xd7, 0xe0, 0x74, 0x7a, 0x48, 0xf0, 0x5e, 0xa4, 0x0a, 0xd3, 0x3a, 0x5c, 0x5e, + 0x91, 0x9c, 0xcb, 0xac, 0x6b, 0x7b, 0xc1, 0x4a, 0xe3, 0x9b, 0x3f, 0x34, 0xa0, 0x88, 0xff, 0x5a, + 0xbd, 0x16, 0x65, 0x9a, 0x4d, 0x75, 0xa7, 0x2e, 0x1e, 0xb9, 0xd4, 0x87, 0x28, 0xe7, 0x51, 0x68, + 0x8b, 0x17, 0x31, 0x4d, 0x8e, 0xc4, 0xc8, 0x82, 0x94, 0x3f, 0xe9, 0x85, 0x62, 0x85, 0xc6, 0xa4, + 0xfc, 0xed, 0x2f, 0x4c, 0x91, 0x0a, 0x64, 0x36, 0x7f, 0xec, 0x97, 0xdf, 0x92, 0x57, 0xc3, 0x38, + 0x7f, 0x48, 0xe7, 0x6b, 0x4f, 0x27, 0x12, 0x8d, 0xbc, 0x01, 0x63, 0xac, 0x6a, 0x4b, 0x3e, 0x8c, + 0xa0, 0x55, 0x81, 0x6d, 0x0c, 0xb4, 0x17, 0x46, 0x8e, 0x64, 0xfe, 0x9b, 0x5c, 0x7a, 0x00, 0x85, + 0x16, 0xf0, 0x84, 0x7b, 0xe3, 0x6d, 0x18, 0xad, 0xb6, 0x5a, 0xfe, 0x23, 0x21, 0x25, 0xe4, 0x35, + 0x4d, 0x3c, 0x7e, 0xfc, 0x84, 0x75, 0x18, 0x8a, 0xf6, 0xb4, 0xcd, 0x00, 0x64, 0x11, 0x8a, 0xd5, + 0x9d, 0xfa, 0xca, 0xca, 0xd2, 0xe6, 0xe6, 0xaa, 0xf0, 0xa0, 0x7e, 0x55, 0x8e, 0x8f, 0xe7, 0xb9, + 0x76, 0x14, 0xb5, 0x06, 0x38, 0x58, 0x26, 0x74, 0xe4, 0x5d, 0x80, 0x0f, 0x7c, 0xaf, 0x73, 0x9f, + 0x46, 0x7b, 0xbe, 0x2b, 0x3a, 0xcf, 0x54, 0x8a, 0x89, 0x8f, 0x7d, 0xaf, 0x63, 0xb7, 0x11, 0xcc, + 0xda, 0x9e, 0x20, 0x59, 0xca, 0xff, 0x6c, 0xa4, 0x6b, 0x7e, 0x84, 0x3a, 0xcc, 0x68, 0x32, 0xd2, + 0x0d, 0x3f, 0x4a, 0xbf, 0xdb, 0x48, 0x34, 0xf3, 0x57, 0x73, 0x30, 0xc5, 0x2d, 0x55, 0xbe, 0x60, + 0x9e, 0xdb, 0xcd, 0xf8, 0xb6, 0xb6, 0x19, 0xcf, 0xcb, 0x83, 0x41, 0xe9, 0xda, 0x50, 0x5b, 0x71, + 0x0f, 0x48, 0x3f, 0x0d, 0xb1, 0xe4, 0x7d, 0xca, 0x30, 0xbb, 0xf0, 0x46, 0xf2, 0x1e, 0x1d, 0x22, + 0x91, 0x8d, 0xa2, 0x30, 0xb4, 0x34, 0x1e, 0xe6, 0xaf, 0xe4, 0x60, 0x52, 0xd1, 0x27, 0x9f, 0xdb, + 0x81, 0xff, 0xb2, 0x36, 0xf0, 0xf2, 0x0d, 0x42, 0xe9, 0xd9, 0x50, 0xe3, 0xde, 0x83, 0x99, 0x3e, + 0x92, 0xb4, 0x5a, 0x6e, 0x0c, 0xa3, 0x96, 0xbf, 0xde, 0xff, 0x60, 0xce, 0xbd, 0xad, 0xe3, 0x07, + 0x73, 0xf5, 0x85, 0xfe, 0xdb, 0x39, 0x38, 0x2d, 0x7e, 0x55, 0x7b, 0xae, 0x17, 0x2d, 0xfa, 0x9d, + 0x07, 0xde, 0xee, 0x73, 0x3b, 0x17, 0x55, 0x6d, 0x2e, 0x2a, 0xfa, 0x5c, 0x28, 0x1d, 0x1c, 0x3c, + 0x25, 0xe6, 0xbf, 0x2b, 0xc0, 0xdc, 0x20, 0x02, 0x66, 0xf6, 0x2b, 0x56, 0x15, 0x9a, 0xfd, 0x29, + 0x8b, 0x95, 0xdb, 0x53, 0x89, 0x83, 0x48, 0x6e, 0x08, 0x07, 0x91, 0x55, 0x28, 0x63, 0x55, 0x75, + 0x1a, 0xb2, 0x41, 0x08, 0x13, 0x57, 0xcf, 0x4b, 0x47, 0x87, 0x95, 0x8b, 0x0e, 0x2b, 0xb3, 0x43, + 0x51, 0x68, 0xf7, 0x02, 0x4f, 0xe1, 0xd1, 0x47, 0x49, 0x7e, 0xcf, 0x80, 0x29, 0x04, 0x2e, 0x3f, + 0xa4, 0x9d, 0x08, 0x99, 0x8d, 0x88, 0x47, 0x9a, 0x38, 0xa2, 0xa6, 0x1e, 0x05, 0x5e, 0x67, 0x17, + 0x2f, 0x92, 0xc2, 0x5a, 0x83, 0x8d, 0xc2, 0x9f, 0x1f, 0x56, 0xde, 0xf9, 0x24, 0x51, 0x3a, 0x82, + 0x55, 0xc8, 0x0c, 0x79, 0xde, 0x50, 0x8a, 0xd5, 0xa6, 0x9a, 0x99, 0x6a, 0x11, 0xf9, 0x49, 0x38, + 0xb7, 0xdc, 0x71, 0x1a, 0x2d, 0xba, 0xe8, 0x77, 0x22, 0xaf, 0xd3, 0xf3, 0x7b, 0x61, 0xcd, 0x69, + 0xee, 0xf7, 0xba, 0xa1, 0xb8, 0xec, 0xc4, 0x9e, 0x37, 0xe3, 0x42, 0xbb, 0xc1, 0x4b, 0x15, 0x96, + 0x83, 0x18, 0x90, 0xbb, 0x30, 0xc3, 0x8b, 0xaa, 0xbd, 0xc8, 0xaf, 0x37, 0x9d, 0x96, 0xd7, 0xd9, + 0xc5, 0x3b, 0xd0, 0x42, 0xed, 0x02, 0xb3, 0x2d, 0x9d, 0x5e, 0xe4, 0xdb, 0x21, 0x87, 0x2b, 0xfc, + 0xfa, 0x89, 0xc8, 0x0a, 0x4c, 0x5b, 0xd4, 0x71, 0xef, 0x3b, 0x8f, 0x17, 0x9d, 0xae, 0xd3, 0xf4, + 0xa2, 0x03, 0xb4, 0xcc, 0xf2, 0xb5, 0xca, 0xd1, 0x61, 0xe5, 0x85, 0x80, 0x3a, 0xae, 0xdd, 0x76, + 0x1e, 0xdb, 0x4d, 0x51, 0xa8, 0x30, 0x4b, 0xd3, 0xc5, 0xac, 0xbc, 0x4e, 0xcc, 0xaa, 0x98, 0x66, + 0xe5, 0x75, 0x06, 0xb3, 0x4a, 0xe8, 0x24, 0xab, 0x4d, 0x27, 0xd8, 0xa5, 0x11, 0xbf, 0x24, 0x84, + 0x4b, 0xc6, 0x15, 0x43, 0x61, 0x15, 0x61, 0x99, 0x8d, 0x17, 0x86, 0x69, 0x56, 0x0a, 0x1d, 0x5b, + 0x79, 0x3b, 0x81, 0x17, 0x51, 0xb5, 0x87, 0x13, 0xd8, 0x2c, 0x1c, 0x7f, 0xbc, 0x26, 0x1d, 0xd4, + 0xc5, 0x3e, 0xca, 0x84, 0x9b, 0xd2, 0xc9, 0x52, 0x1f, 0xb7, 0xec, 0x5e, 0xf6, 0x51, 0xc6, 0xdc, + 0xd4, 0x7e, 0x4e, 0x62, 0x3f, 0x15, 0x6e, 0x03, 0x3a, 0xda, 0x47, 0x49, 0xd6, 0xd8, 0xa0, 0x45, + 0xb4, 0xc3, 0x56, 0xb4, 0xb8, 0x24, 0x9d, 0xc2, 0xa6, 0xbd, 0x22, 0x6c, 0xea, 0x72, 0x20, 0x8b, + 0xed, 0x8c, 0x2b, 0xd3, 0x34, 0xf1, 0x07, 0x23, 0x85, 0xd1, 0xf2, 0x98, 0x55, 0xe6, 0x4b, 0x3e, + 0x62, 0x0b, 0x07, 0x65, 0xb1, 0xf9, 0x5b, 0x39, 0x38, 0x2f, 0xc5, 0x31, 0x8d, 0x1e, 0xf9, 0xc1, + 0xbe, 0xd7, 0xd9, 0x7d, 0xce, 0xa5, 0xea, 0x6d, 0x4d, 0xaa, 0xbe, 0x92, 0x3a, 0xe1, 0x52, 0xbd, + 0x3c, 0x46, 0xb4, 0xfe, 0xd9, 0x28, 0xbc, 0x78, 0x2c, 0x15, 0xf9, 0x90, 0x9d, 0x82, 0x1e, 0xed, + 0x44, 0x2b, 0x6e, 0x8b, 0x32, 0x33, 0xcc, 0xef, 0x45, 0xe2, 0x32, 0xfb, 0xe5, 0xa3, 0xc3, 0xca, + 0x2c, 0x0f, 0x34, 0xb1, 0x3d, 0xb7, 0x45, 0xed, 0x88, 0x17, 0x6b, 0xd3, 0xd4, 0x4f, 0xcd, 0x58, + 0xc6, 0x61, 0x6f, 0x2b, 0x9d, 0x88, 0x06, 0x0f, 0x1d, 0xee, 0x6f, 0x2f, 0x58, 0xee, 0x53, 0xda, + 0xb5, 0x1d, 0x56, 0x6a, 0x7b, 0xa2, 0x58, 0x67, 0xd9, 0x47, 0x4d, 0x6e, 0x2b, 0x2c, 0x17, 0x99, + 0x71, 0x70, 0xdf, 0x79, 0x2c, 0x34, 0x5e, 0xbc, 0x5f, 0x55, 0x58, 0x72, 0x1f, 0xbb, 0xb6, 0xf3, + 0xd8, 0xea, 0x27, 0x21, 0x1f, 0xc1, 0x19, 0x21, 0xb8, 0x99, 0x10, 0x0b, 0xfc, 0x96, 0xec, 0xf1, + 0x08, 0xf2, 0x7a, 0xed, 0xe8, 0xb0, 0x72, 0x4e, 0x88, 0x7d, 0xbb, 0xc9, 0x31, 0x32, 0x7b, 0x9d, + 0xcd, 0x85, 0x6c, 0xb2, 0x83, 0x2c, 0x35, 0x1c, 0xf7, 0x69, 0x18, 0x3a, 0xbb, 0x52, 0x3b, 0xe6, + 0x2f, 0x4a, 0xca, 0x60, 0xda, 0x6d, 0x5e, 0x6e, 0x0d, 0xa4, 0x24, 0x77, 0x61, 0x6a, 0x87, 0x36, + 0xd4, 0xf9, 0x19, 0x8b, 0xb7, 0x78, 0xf9, 0x11, 0x6d, 0x0c, 0x9e, 0x9c, 0x14, 0x1d, 0xf1, 0x60, + 0x66, 0x23, 0xf0, 0x1f, 0x1f, 0x30, 0x53, 0x8f, 0x76, 0x68, 0x80, 0xce, 0x5d, 0xe3, 0x78, 0x5d, + 0x35, 0x97, 0x68, 0x96, 0x7a, 0x79, 0xed, 0x73, 0x47, 0x87, 0x95, 0x17, 0xbb, 0x0c, 0x6c, 0xb7, + 0x04, 0xdc, 0x4e, 0x45, 0x9d, 0xf5, 0x73, 0x25, 0x3f, 0x0d, 0xd3, 0x96, 0xdf, 0x8b, 0xbc, 0xce, + 0x6e, 0x3d, 0x0a, 0x9c, 0x88, 0xee, 0x72, 0x41, 0x9e, 0x78, 0x91, 0xa5, 0x4a, 0xf9, 0xc5, 0x74, + 0xc0, 0x81, 0x76, 0x28, 0xa0, 0x9a, 0x24, 0xd5, 0x09, 0xcc, 0xdf, 0xc8, 0xc1, 0x9c, 0x98, 0x06, + 0x8b, 0x36, 0xfd, 0xc0, 0x7d, 0xfe, 0xb7, 0xfd, 0xb2, 0xb6, 0xed, 0x5f, 0x8e, 0x7d, 0x94, 0xb2, + 0x3a, 0x79, 0xcc, 0xae, 0xff, 0xe7, 0x06, 0x5c, 0x3c, 0x8e, 0x88, 0x8d, 0x4e, 0xec, 0xd7, 0x57, + 0xec, 0xf3, 0xdf, 0xeb, 0xc2, 0x2c, 0xce, 0x27, 0x5e, 0x1c, 0x87, 0x77, 0xfd, 0x30, 0xc2, 0xdb, + 0xbb, 0x9c, 0xe6, 0x48, 0x50, 0xf3, 0xfd, 0x16, 0xca, 0xf9, 0xda, 0xeb, 0x4c, 0x9c, 0xff, 0xf9, + 0x61, 0x05, 0x18, 0x88, 0x7b, 0xe2, 0xb1, 0x33, 0x9f, 0xaf, 0x18, 0xbc, 0x97, 0x0e, 0x6d, 0xf4, + 0xfe, 0xd8, 0xa7, 0x07, 0xa1, 0x95, 0xc5, 0x1a, 0x6f, 0x68, 0xaa, 0xbd, 0x68, 0x6f, 0x23, 0xa0, + 0x0f, 0x68, 0x40, 0x3b, 0x4d, 0xfa, 0x19, 0xbb, 0xa1, 0xd1, 0x3b, 0x37, 0x94, 0x79, 0xf2, 0xff, + 0xc6, 0xe0, 0x74, 0x16, 0x19, 0x1b, 0x17, 0x45, 0x23, 0x4e, 0x87, 0x28, 0xff, 0x5d, 0x03, 0x4a, + 0x75, 0xda, 0xf4, 0x3b, 0xee, 0x6d, 0xa7, 0x19, 0xf9, 0xd2, 0x25, 0xc3, 0xe6, 0x92, 0x8d, 0xc1, + 0xed, 0x07, 0x58, 0xa0, 0xdd, 0x0c, 0x7c, 0x65, 0x38, 0x45, 0xb4, 0xe9, 0xa3, 0x23, 0x6c, 0xc4, + 0xd6, 0x64, 0x52, 0x05, 0xbe, 0x6a, 0x68, 0x95, 0x92, 0x1a, 0x4c, 0x2e, 0xfa, 0x9d, 0x0e, 0x65, + 0x3f, 0x14, 0xb7, 0x4e, 0x74, 0xc4, 0x6c, 0xca, 0x82, 0xf4, 0x0d, 0x81, 0x4e, 0x42, 0x6e, 0x42, + 0x7e, 0x6b, 0xe1, 0xb6, 0x98, 0x03, 0xe9, 0xac, 0xb6, 0xb5, 0x70, 0x1b, 0x6d, 0x5d, 0xa6, 0x3f, + 0x4c, 0xf6, 0x16, 0x1e, 0xa8, 0x77, 0xa0, 0x5b, 0x0b, 0xb7, 0xc9, 0x3a, 0xcc, 0x58, 0xf4, 0x9b, + 0x3d, 0x2f, 0xa0, 0x62, 0x03, 0xdc, 0xbf, 0x5d, 0xc5, 0xb9, 0x28, 0x70, 0x39, 0x16, 0xf0, 0x42, + 0xa9, 0xdb, 0xdb, 0xed, 0x07, 0x6a, 0x58, 0x5e, 0x3f, 0x2d, 0xf9, 0x79, 0x38, 0xb3, 0xe4, 0x85, + 0xa2, 0xcd, 0xfc, 0xf2, 0xd1, 0xc5, 0x77, 0xc8, 0xb1, 0x01, 0xdb, 0xe1, 0x4b, 0x99, 0xdb, 0xe1, + 0x73, 0x6e, 0xcc, 0xc4, 0xe6, 0x37, 0x9b, 0x6e, 0xda, 0x1f, 0x36, 0xbb, 0x1e, 0xf2, 0x31, 0x4c, + 0xe1, 0x6d, 0x0f, 0xde, 0xc7, 0xa2, 0x8b, 0xf4, 0xf8, 0x80, 0x9a, 0xbf, 0x90, 0x59, 0xf3, 0x05, + 0xbc, 0x3c, 0xb2, 0xf1, 0x56, 0x17, 0xdd, 0xa9, 0x35, 0x1b, 0x41, 0xe3, 0x4c, 0x3e, 0x80, 0x69, + 0x71, 0xe8, 0xac, 0x3f, 0xd8, 0xdc, 0xa3, 0x4b, 0xce, 0x81, 0x70, 0x42, 0x40, 0xfd, 0x4f, 0x9c, + 0x54, 0xb6, 0xff, 0xc0, 0x8e, 0xf6, 0xa8, 0xed, 0x3a, 0x9a, 0x78, 0x4e, 0x11, 0x92, 0x9f, 0x85, + 0x89, 0x55, 0x1f, 0x1f, 0x9e, 0x50, 0xd4, 0x14, 0x91, 0xcf, 0xd7, 0x30, 0x2c, 0x97, 0x83, 0x53, + 0x87, 0xc8, 0x8f, 0x0f, 0x2b, 0x6f, 0x3f, 0xe9, 0x2a, 0x54, 0x2a, 0xb0, 0xd4, 0xda, 0xc8, 0x22, + 0x14, 0x76, 0x68, 0x83, 0xf5, 0x36, 0x1d, 0x52, 0x26, 0xc1, 0x5c, 0x5e, 0x3c, 0x12, 0xbf, 0xd4, + 0x57, 0x1d, 0x89, 0x61, 0xfe, 0x5b, 0x03, 0x57, 0x20, 0xb9, 0x86, 0x8e, 0x60, 0xb1, 0x87, 0x39, + 0x5a, 0x96, 0x4e, 0xb7, 0xab, 0xfb, 0x88, 0x73, 0x14, 0x66, 0x86, 0xde, 0x76, 0x9a, 0x34, 0x92, + 0xf7, 0x95, 0x88, 0xfc, 0x00, 0x21, 0xaa, 0x19, 0xca, 0x71, 0xc8, 0x57, 0xe1, 0xf4, 0x12, 0x7d, + 0xe8, 0x35, 0x69, 0x35, 0x8a, 0x68, 0xc8, 0x7b, 0xbb, 0x58, 0xe5, 0x0f, 0x7b, 0xc5, 0xda, 0x2b, + 0x47, 0x87, 0x95, 0x4b, 0x2e, 0x96, 0xdb, 0x4e, 0x82, 0x60, 0x37, 0x1d, 0x95, 0x57, 0x26, 0x07, + 0xf3, 0x1f, 0xe6, 0x92, 0x11, 0x20, 0xaf, 0xc1, 0x88, 0xb5, 0x11, 0xb7, 0x9f, 0xbf, 0xd9, 0xa5, + 0x9a, 0x8f, 0x08, 0xe4, 0xeb, 0x70, 0x46, 0xe1, 0x83, 0x8b, 0x83, 0xba, 0xac, 0x41, 0xbc, 0x33, + 0xaf, 0xe2, 0x23, 0x8d, 0xd2, 0x12, 0x87, 0x63, 0xa4, 0x5a, 0x94, 0xcd, 0x83, 0x75, 0x56, 0x29, + 0x58, 0xa2, 0x1d, 0x8f, 0xf3, 0x56, 0x3a, 0xab, 0xf2, 0x76, 0x11, 0x21, 0xdd, 0xd9, 0x2c, 0x0e, + 0x64, 0x01, 0x0a, 0x4b, 0x5e, 0xc8, 0x2c, 0x02, 0x57, 0x78, 0x74, 0xf1, 0x28, 0x3d, 0x01, 0xd3, + 0xa2, 0xf4, 0x04, 0xcc, 0xfc, 0x2b, 0x43, 0xc9, 0x86, 0xf0, 0x9c, 0x9e, 0x35, 0xb7, 0xb4, 0xb3, + 0xe6, 0xb4, 0x20, 0x8d, 0x7b, 0xc5, 0xca, 0x32, 0xf5, 0x83, 0x69, 0x98, 0xd4, 0x90, 0xd0, 0x41, + 0x76, 0x2b, 0xa4, 0x01, 0xbf, 0x4d, 0xfc, 0x6c, 0x39, 0xc8, 0xc6, 0xfd, 0x1a, 0xca, 0xef, 0xf1, + 0x2f, 0x0c, 0x98, 0x4e, 0x51, 0xb0, 0xd1, 0x60, 0x20, 0x75, 0x34, 0x7a, 0x21, 0x0d, 0x2c, 0x84, + 0x72, 0x77, 0xba, 0x55, 0xdd, 0x9d, 0xae, 0x65, 0x31, 0x18, 0xf9, 0x0a, 0x8c, 0x6e, 0xa1, 0xee, + 0xaf, 0x7b, 0x64, 0xc4, 0xfc, 0xb1, 0x90, 0xef, 0xc7, 0x1e, 0xfb, 0x57, 0x15, 0x27, 0x58, 0x46, + 0xea, 0x30, 0xbe, 0x18, 0x50, 0xcc, 0x7b, 0x30, 0x32, 0xfc, 0xd3, 0x59, 0x93, 0x93, 0xa4, 0x9f, + 0xce, 0x04, 0x27, 0xf3, 0xd7, 0x73, 0x40, 0x92, 0x3e, 0xd2, 0x66, 0x40, 0xa3, 0xf0, 0xb9, 0x9d, + 0xf4, 0xf7, 0xb5, 0x49, 0x7f, 0xb1, 0x6f, 0xd2, 0x79, 0xf7, 0x86, 0x9a, 0xfb, 0x3f, 0x36, 0xe0, + 0x6c, 0x36, 0x21, 0x79, 0x19, 0xc6, 0xd6, 0x37, 0x37, 0xa4, 0x53, 0x8f, 0xe8, 0x8a, 0xdf, 0x45, + 0x9d, 0xd6, 0x12, 0x45, 0xe4, 0x0d, 0x18, 0xfb, 0xd0, 0x5a, 0x64, 0x87, 0x9d, 0x12, 0xf7, 0xf2, + 0xcd, 0xc0, 0x6e, 0xea, 0xc6, 0x92, 0x40, 0x52, 0xe7, 0x36, 0xff, 0xcc, 0xe6, 0xf6, 0xdb, 0x39, + 0x98, 0xae, 0x36, 0x9b, 0x34, 0x0c, 0x99, 0x2a, 0x43, 0xc3, 0xe8, 0xb9, 0x9d, 0xd8, 0x6c, 0x77, + 0x1d, 0xad, 0x6f, 0x43, 0xcd, 0xea, 0x9f, 0x18, 0x70, 0x46, 0x52, 0x3d, 0xf4, 0xe8, 0xa3, 0xcd, + 0xbd, 0x80, 0x86, 0x7b, 0x7e, 0xcb, 0x1d, 0x36, 0x82, 0x0b, 0xcf, 0x74, 0xaf, 0x15, 0xd1, 0x40, + 0xbd, 0x5a, 0x7e, 0x80, 0x10, 0xed, 0x4c, 0x47, 0x08, 0x99, 0x87, 0xf1, 0x6a, 0xb7, 0x1b, 0xf8, + 0x0f, 0xf9, 0xb6, 0x9f, 0x14, 0x2f, 0x89, 0x1c, 0xa4, 0xbd, 0x3c, 0x72, 0x10, 0x6b, 0xc6, 0x12, + 0xed, 0x70, 0x5f, 0xe4, 0x49, 0xde, 0x0c, 0x97, 0x76, 0x54, 0xdd, 0x0a, 0xcb, 0xcd, 0x6f, 0x8d, + 0x40, 0x49, 0xed, 0x08, 0x31, 0x61, 0x8c, 0x3b, 0x96, 0xa8, 0x0f, 0xfc, 0x0e, 0x42, 0x2c, 0x51, + 0x92, 0xf8, 0xeb, 0xe4, 0x4e, 0xf4, 0xd7, 0xd9, 0x81, 0xc9, 0x8d, 0xc0, 0xef, 0xfa, 0x21, 0x75, + 0x79, 0xea, 0x1a, 0x2e, 0xb5, 0x66, 0x63, 0x27, 0x56, 0x3e, 0xe6, 0xac, 0x88, 0x2b, 0xf2, 0x5d, + 0x81, 0x6d, 0xa7, 0x13, 0xdb, 0xe8, 0x7c, 0xf8, 0xd5, 0xbc, 0x13, 0x0a, 0x47, 0xff, 0xf8, 0x6a, + 0x9e, 0x41, 0xf4, 0xab, 0x79, 0x06, 0x51, 0xb7, 0xc5, 0xe8, 0xb3, 0xda, 0x16, 0xe4, 0xd7, 0x0d, + 0x98, 0xa8, 0x76, 0x3a, 0xc2, 0x5f, 0x47, 0xc6, 0x7f, 0x9f, 0x49, 0xae, 0xe7, 0xb9, 0x43, 0x27, + 0xbf, 0x9d, 0xff, 0x86, 0xb8, 0x9d, 0x7f, 0xfb, 0x13, 0xdd, 0xce, 0x6f, 0x06, 0x8e, 0x17, 0x85, + 0xf8, 0x0c, 0x9b, 0x54, 0xa8, 0x3a, 0xed, 0x2a, 0xed, 0x20, 0x6f, 0x43, 0x39, 0x5e, 0x8f, 0x2b, + 0x1d, 0x97, 0x3e, 0xa6, 0xdc, 0xbd, 0x69, 0x92, 0xc7, 0x06, 0x6a, 0xcf, 0x0e, 0x69, 0x44, 0xf3, + 0xdb, 0x06, 0x9c, 0x55, 0x17, 0x44, 0xbd, 0xd7, 0x68, 0x7b, 0x68, 0xb8, 0x90, 0xeb, 0x50, 0x14, + 0xf3, 0x15, 0xab, 0x7d, 0xfd, 0xf9, 0x8e, 0x12, 0x14, 0xb2, 0xcc, 0xa6, 0x88, 0xf1, 0x10, 0x56, + 0xfe, 0x6c, 0x6a, 0xbb, 0xb1, 0xa2, 0xda, 0x9c, 0x18, 0xec, 0x72, 0x80, 0xbf, 0xf5, 0xb9, 0x63, + 0x10, 0xf3, 0x3d, 0x98, 0xd1, 0x5b, 0x59, 0xa7, 0x18, 0x3c, 0x26, 0xbb, 0x66, 0x64, 0x77, 0x4d, + 0x96, 0x9b, 0x3b, 0x40, 0xfa, 0xe8, 0x43, 0x7c, 0x62, 0xa2, 0x91, 0x7c, 0x02, 0x95, 0x17, 0x55, + 0x7d, 0x88, 0x71, 0xe6, 0xaf, 0x09, 0x75, 0xb8, 0x91, 0xd4, 0xfc, 0xeb, 0x22, 0xcc, 0x66, 0x88, + 0x8e, 0x13, 0x8e, 0xf6, 0x8a, 0xbe, 0x79, 0x8a, 0xf1, 0x5b, 0xbe, 0xdc, 0x32, 0xef, 0xc9, 0x2c, + 0x4f, 0xc7, 0x6c, 0x95, 0xe3, 0x52, 0x3f, 0x7d, 0x1a, 0xc7, 0xbb, 0xea, 0x6e, 0x33, 0xfa, 0xcc, + 0xdc, 0x6d, 0x6a, 0x30, 0x29, 0x7a, 0x25, 0xb6, 0xf2, 0x58, 0x62, 0xd0, 0x07, 0xbc, 0xc0, 0xee, + 0xdb, 0xd2, 0x3a, 0x09, 0xe7, 0x11, 0xfa, 0xad, 0x87, 0x54, 0xf0, 0x18, 0x57, 0x79, 0x60, 0x41, + 0x26, 0x0f, 0x85, 0x84, 0xfc, 0xa1, 0x01, 0x44, 0x40, 0xd4, 0xfd, 0x5c, 0x38, 0x6e, 0x3f, 0xbb, + 0xcf, 0x66, 0x3f, 0xbf, 0x28, 0xdb, 0x98, 0xbd, 0xaf, 0x33, 0x9a, 0x45, 0xfe, 0xa9, 0x01, 0x33, + 0xdc, 0xe7, 0x43, 0x6d, 0x6c, 0xf1, 0xb8, 0xc6, 0x36, 0x9f, 0x4d, 0x63, 0x2f, 0x86, 0x58, 0xed, + 0x80, 0xb6, 0xf6, 0x37, 0x8a, 0xfc, 0x24, 0x40, 0xbc, 0xa3, 0xa4, 0x6f, 0xe1, 0xc5, 0x0c, 0x29, + 0x10, 0x23, 0x25, 0xe1, 0x91, 0x51, 0x4c, 0xa7, 0x7a, 0xe3, 0x24, 0xdc, 0xc8, 0xcf, 0xc3, 0x69, + 0xb6, 0x5f, 0x62, 0x88, 0xf0, 0x50, 0x9b, 0x9b, 0xc0, 0x5a, 0xbe, 0x38, 0xf8, 0x68, 0xbf, 0x9e, + 0x45, 0xc6, 0x23, 0x3c, 0x92, 0x00, 0xfc, 0xa8, 0xad, 0x1a, 0x88, 0x59, 0x14, 0xe8, 0x8a, 0x8a, + 0xad, 0x0f, 0xe7, 0x4a, 0x58, 0x67, 0xa6, 0x7c, 0x3b, 0x2f, 0xf7, 0x02, 0x97, 0x6f, 0xa1, 0x1e, + 0xa2, 0x81, 0x20, 0xf2, 0x21, 0x90, 0x7a, 0x6f, 0x77, 0x97, 0x86, 0x11, 0x75, 0x39, 0x8c, 0x06, + 0xe1, 0xdc, 0x24, 0xca, 0x07, 0xbc, 0x60, 0x0a, 0x65, 0xa9, 0x1d, 0xc8, 0x62, 0x75, 0x91, 0xf4, + 0x13, 0x5f, 0x68, 0xc0, 0xf9, 0x81, 0xdd, 0xcc, 0x08, 0xbf, 0x98, 0xd7, 0xc3, 0x2f, 0xce, 0x0f, + 0x12, 0x87, 0xa1, 0x1a, 0x82, 0xf1, 0x3b, 0x46, 0x4a, 0xfe, 0x09, 0x65, 0x85, 0x27, 0xc4, 0x1b, + 0x74, 0x40, 0xe4, 0x30, 0x34, 0x9f, 0x4b, 0xc8, 0x5c, 0xa2, 0x24, 0x31, 0x09, 0xa9, 0x4a, 0x58, + 0x94, 0x95, 0x4f, 0x29, 0x0a, 0xcd, 0x7f, 0x65, 0x00, 0xe1, 0x2d, 0x5c, 0x74, 0xba, 0x4e, 0xc3, + 0x6b, 0x79, 0x91, 0x47, 0x43, 0x72, 0x0f, 0xca, 0x82, 0x05, 0x33, 0xdb, 0x55, 0xcf, 0x2a, 0xf1, + 0xf4, 0x1a, 0x97, 0xd9, 0x69, 0xb5, 0xa6, 0x8f, 0x70, 0xc0, 0xe4, 0xe5, 0x9e, 0x62, 0xf2, 0xcc, + 0x1f, 0x19, 0x70, 0xbe, 0xbf, 0xd9, 0xa2, 0xe6, 0x78, 0xf0, 0x8c, 0x13, 0x06, 0x2f, 0xab, 0x97, + 0x39, 0xbc, 0xc8, 0x78, 0x66, 0xbd, 0xcc, 0x27, 0x77, 0xa0, 0x4f, 0xde, 0xcb, 0x5f, 0xce, 0x41, + 0x69, 0xa3, 0xd5, 0xdb, 0xf5, 0x3a, 0x4b, 0x4e, 0xe4, 0x3c, 0xb7, 0x26, 0xc5, 0x5b, 0x9a, 0x49, + 0x11, 0xfb, 0x52, 0xc5, 0x1d, 0x1b, 0x2e, 0x39, 0x99, 0x01, 0xd3, 0x09, 0x09, 0xdf, 0xa5, 0x77, + 0x61, 0x84, 0xfd, 0x10, 0x1a, 0xca, 0xa5, 0x3e, 0xc6, 0x88, 0x75, 0x3d, 0xfe, 0x4f, 0x28, 0xf9, + 0x7a, 0x4a, 0x38, 0xe4, 0x70, 0xe1, 0x4b, 0x3c, 0xa3, 0xd3, 0x93, 0x67, 0x9f, 0xfc, 0x97, 0x06, + 0x94, 0xd3, 0x3d, 0x21, 0xf7, 0x60, 0x9c, 0x71, 0xf2, 0xe2, 0xec, 0x50, 0xaf, 0x0c, 0xe8, 0xf3, + 0x75, 0x81, 0xc6, 0x9b, 0x87, 0x83, 0x4f, 0x39, 0xc4, 0x92, 0x1c, 0x2e, 0x58, 0x50, 0x52, 0xb1, + 0x32, 0x5a, 0xf7, 0xba, 0x2e, 0x9a, 0xce, 0x66, 0x8f, 0x83, 0xda, 0xea, 0xdf, 0xd6, 0x5a, 0x2d, + 0x84, 0xd2, 0xb0, 0x69, 0xfe, 0x30, 0x98, 0x8c, 0xe7, 0x10, 0x51, 0xd7, 0x99, 0x4c, 0x37, 0xa2, + 0x07, 0x93, 0x71, 0x18, 0xb3, 0x45, 0x78, 0x7d, 0x62, 0x9d, 0xa1, 0x2d, 0xd2, 0x45, 0x88, 0xaa, + 0xcf, 0x72, 0x1c, 0xf3, 0x1f, 0xe4, 0xe1, 0x6c, 0xd2, 0x3c, 0x9e, 0xf4, 0x70, 0xc3, 0x09, 0x9c, + 0x76, 0x78, 0xc2, 0x0e, 0xb8, 0xd2, 0xd7, 0x34, 0x0c, 0x96, 0x96, 0x4d, 0x53, 0x1a, 0x64, 0xa6, + 0x1a, 0x84, 0x46, 0x1c, 0x6f, 0x90, 0x6c, 0x06, 0xb9, 0x07, 0xf9, 0x3a, 0x8d, 0x44, 0x48, 0xe5, + 0xe5, 0xbe, 0x51, 0x55, 0xdb, 0x75, 0xbd, 0x4e, 0x23, 0x3e, 0x89, 0xdc, 0x2b, 0x9d, 0x6a, 0x5e, + 0xe2, 0x4c, 0x1d, 0xdf, 0x81, 0xb1, 0xe5, 0xc7, 0x5d, 0xda, 0x8c, 0x44, 0x24, 0xe5, 0xd5, 0xe3, + 0xf9, 0x71, 0x5c, 0x25, 0x5e, 0x93, 0x22, 0x40, 0x1d, 0x2c, 0x8e, 0x72, 0xe1, 0x16, 0x14, 0x64, + 0xe5, 0x4f, 0x14, 0x77, 0xf8, 0x16, 0x4c, 0x28, 0x95, 0x3c, 0xd1, 0xa2, 0xff, 0x6b, 0x03, 0xc6, + 0x98, 0xd0, 0xdb, 0x7e, 0xf3, 0x39, 0x95, 0x48, 0x37, 0x35, 0x89, 0x34, 0xa3, 0x04, 0xc8, 0xe0, + 0xbe, 0x7c, 0xf3, 0x04, 0x59, 0x74, 0x68, 0x00, 0x24, 0xc8, 0xe4, 0x0e, 0x8c, 0x8b, 0x4c, 0x28, + 0x22, 0xa3, 0xa8, 0x1a, 0x71, 0x23, 0x33, 0x2e, 0xc5, 0x5a, 0x8e, 0xdf, 0x4d, 0xab, 0x85, 0x92, + 0x9a, 0x2c, 0x25, 0x5e, 0xc9, 0x6a, 0x88, 0x27, 0x63, 0xb3, 0xe8, 0x77, 0x78, 0x04, 0x86, 0x92, + 0xbb, 0x69, 0x80, 0x7b, 0x72, 0x55, 0x5c, 0x6c, 0xe4, 0x8f, 0x63, 0x72, 0x56, 0x30, 0xc9, 0xbe, + 0xf3, 0xf8, 0xce, 0x04, 0x8f, 0x69, 0x90, 0x0d, 0x7b, 0x17, 0x4a, 0xb7, 0xfd, 0xe0, 0x91, 0x13, + 0xb8, 0xd5, 0x5d, 0x2a, 0xfc, 0xc9, 0x0b, 0xe8, 0x14, 0x3e, 0xf9, 0x80, 0xc3, 0x6d, 0x87, 0x15, + 0xfc, 0xf8, 0xb0, 0x32, 0x52, 0xf3, 0xfd, 0x96, 0xa5, 0xa1, 0x93, 0x75, 0x98, 0xbc, 0xef, 0x3c, + 0x16, 0xaf, 0x7b, 0x9b, 0x9b, 0xab, 0xc2, 0x2b, 0xe5, 0xea, 0xd1, 0x61, 0xe5, 0x7c, 0xdb, 0x79, + 0x1c, 0xbf, 0x0a, 0x0e, 0x76, 0x9c, 0xd6, 0xe9, 0x89, 0x07, 0x53, 0x1b, 0x7e, 0x10, 0x89, 0x4a, + 0x98, 0x4e, 0x9b, 0x1f, 0xf0, 0x38, 0x37, 0x9f, 0xf9, 0x38, 0x77, 0x9e, 0x29, 0xf2, 0xf6, 0x83, + 0x98, 0x5c, 0x0b, 0xc4, 0xd3, 0x18, 0x93, 0x77, 0x61, 0x66, 0x91, 0x06, 0x91, 0xf7, 0xc0, 0x6b, + 0x3a, 0x11, 0xbd, 0xed, 0x07, 0x6d, 0x27, 0x12, 0x17, 0x2a, 0x68, 0x50, 0x37, 0x29, 0xe7, 0xd4, + 0x76, 0x22, 0xab, 0x1f, 0x93, 0x7c, 0x3d, 0xcb, 0xcf, 0x67, 0x14, 0xbb, 0xff, 0x06, 0x53, 0x0a, + 0x32, 0xfc, 0x7c, 0x06, 0x0c, 0x41, 0x86, 0xc7, 0xcf, 0xee, 0x71, 0x8f, 0xa4, 0x85, 0xda, 0x0d, + 0xf1, 0x60, 0x7b, 0xf2, 0x23, 0x68, 0x3c, 0x6f, 0x03, 0x1e, 0x43, 0x17, 0x20, 0x5f, 0xdb, 0xb8, + 0x8d, 0x57, 0x24, 0xe2, 0x51, 0x92, 0x76, 0xf6, 0x9c, 0x4e, 0x13, 0x75, 0x19, 0xe1, 0xe9, 0xa0, + 0x0a, 0xbc, 0xda, 0xc6, 0x6d, 0xe2, 0xc0, 0xec, 0x06, 0x0d, 0xda, 0x5e, 0xf4, 0xd5, 0x1b, 0x37, + 0x94, 0x89, 0x2a, 0x60, 0xd3, 0xe6, 0x45, 0xd3, 0x2a, 0x5d, 0x44, 0xb1, 0x1f, 0xdf, 0xb8, 0x91, + 0x39, 0x1d, 0x71, 0xc3, 0xb2, 0x78, 0x91, 0x65, 0x98, 0xba, 0xef, 0x3c, 0x16, 0xcf, 0xd7, 0xb1, + 0x8d, 0x97, 0x47, 0x3f, 0x7a, 0x5c, 0x58, 0xcd, 0xa4, 0x48, 0x9d, 0x62, 0x9d, 0x88, 0xbc, 0x03, + 0x13, 0xc9, 0xf2, 0x0a, 0xf1, 0xe1, 0x32, 0xcf, 0x1d, 0x28, 0x95, 0xc5, 0xa9, 0xdd, 0x25, 0x29, + 0xe8, 0x64, 0x2b, 0x36, 0xd1, 0xb9, 0x42, 0x8a, 0x6e, 0x85, 0xc5, 0xda, 0xbc, 0x6a, 0xa2, 0x3b, + 0x58, 0xa2, 0x75, 0x6b, 0x3a, 0x56, 0xd1, 0xb9, 0x5f, 0x8d, 0xa5, 0x73, 0x51, 0x2c, 0xff, 0x8d, + 0xc0, 0x6f, 0x77, 0x23, 0xf4, 0x2f, 0x4c, 0x59, 0xfe, 0x5d, 0x2c, 0xc9, 0xb0, 0xfc, 0x39, 0x49, + 0xf6, 0xab, 0xfc, 0xe4, 0x53, 0xbc, 0xca, 0x53, 0x18, 0x59, 0xf5, 0x9b, 0xfb, 0xe8, 0x50, 0x58, + 0xac, 0x7d, 0xc8, 0xe4, 0x47, 0xcb, 0x6f, 0xee, 0x3f, 0xbb, 0xd7, 0x64, 0x64, 0x4f, 0xd6, 0x58, + 0xdf, 0xd9, 0xb2, 0x12, 0x55, 0xcf, 0x4d, 0x6b, 0x2f, 0x6d, 0x5a, 0x19, 0x57, 0x54, 0xf8, 0x2a, + 0x94, 0x1d, 0xb1, 0x74, 0x72, 0x42, 0xa1, 0xbc, 0x44, 0xc3, 0xfd, 0xc8, 0xef, 0x2e, 0xb6, 0xbc, + 0x6e, 0xc3, 0x77, 0x02, 0x77, 0xae, 0x3c, 0x40, 0x60, 0xbc, 0x96, 0x29, 0x30, 0x66, 0x5c, 0x4e, + 0x6f, 0x37, 0x25, 0x03, 0xab, 0x8f, 0x25, 0xf9, 0x3a, 0x4c, 0xb1, 0xdd, 0xb2, 0xfc, 0x38, 0xa2, + 0x1d, 0xbe, 0x94, 0x66, 0xf0, 0xa8, 0x3f, 0xad, 0x84, 0x24, 0xc6, 0x85, 0x7c, 0x91, 0xa2, 0xf4, + 0xa0, 0x31, 0x81, 0xba, 0x48, 0x75, 0x56, 0xe6, 0x4f, 0xa6, 0xc6, 0x84, 0xac, 0xc0, 0xb8, 0x68, + 0x81, 0x38, 0x75, 0xfa, 0xfb, 0xf2, 0x62, 0x66, 0x5f, 0xc6, 0x45, 0x5f, 0x2c, 0x49, 0x6f, 0xfe, + 0x7b, 0x03, 0x26, 0xb5, 0xea, 0xc8, 0x2d, 0xc5, 0xd9, 0x25, 0x71, 0x52, 0xd3, 0x70, 0x32, 0x33, + 0xf5, 0xdf, 0x12, 0x1e, 0x4e, 0xb9, 0xc1, 0x74, 0x99, 0xb9, 0xcb, 0x64, 0x8a, 0x80, 0xfc, 0xf1, + 0x29, 0x02, 0x46, 0x06, 0xa4, 0x08, 0xf8, 0xce, 0x24, 0x4c, 0xe9, 0x07, 0x1c, 0xd3, 0x38, 0x57, + 0xfd, 0x5d, 0xaf, 0x23, 0xed, 0x56, 0x9e, 0xf4, 0x02, 0x21, 0x5a, 0xda, 0x7b, 0x84, 0x90, 0x57, + 0x01, 0xe2, 0xa7, 0x59, 0x69, 0x9a, 0x8a, 0x24, 0xfd, 0x4a, 0x01, 0xf9, 0x29, 0x80, 0x35, 0xdf, + 0xa5, 0x71, 0xde, 0x94, 0x63, 0x2e, 0x94, 0x5e, 0x13, 0x17, 0x4a, 0x22, 0xb1, 0xfe, 0xd1, 0x61, + 0xe5, 0x4c, 0xc7, 0x77, 0x69, 0x7f, 0xc2, 0x14, 0x85, 0x23, 0xf9, 0x32, 0x8c, 0x5a, 0xbd, 0x16, + 0x95, 0x69, 0x3c, 0x26, 0xe4, 0x82, 0xef, 0xb5, 0x94, 0x84, 0x9b, 0x41, 0x2f, 0xfd, 0x8e, 0xc0, + 0x00, 0xe4, 0x7d, 0x80, 0x7b, 0xbd, 0x06, 0xbd, 0x13, 0xf8, 0xbd, 0xae, 0x8c, 0x13, 0x46, 0x33, + 0x76, 0x3f, 0x4e, 0xfa, 0x64, 0xef, 0x62, 0xa1, 0x5a, 0x79, 0x42, 0x42, 0xd6, 0x61, 0x5c, 0x88, + 0x0f, 0x71, 0x4f, 0xff, 0x52, 0xd6, 0x0d, 0x91, 0xa2, 0x43, 0x88, 0xbc, 0x1a, 0x08, 0xd6, 0x2f, + 0x6d, 0xb8, 0x19, 0xfe, 0x0e, 0x14, 0x19, 0x7b, 0x66, 0x6a, 0x87, 0xe2, 0xec, 0x40, 0x6f, 0x43, + 0xa5, 0x41, 0xcc, 0x2c, 0xd7, 0xb2, 0x7b, 0xc5, 0x04, 0xe4, 0xeb, 0x98, 0x09, 0x47, 0x0c, 0xf5, + 0xb1, 0x17, 0x8d, 0x97, 0xfb, 0x86, 0xfa, 0xb4, 0xd3, 0xed, 0x66, 0xa4, 0x0e, 0x8b, 0xf9, 0x91, + 0xdd, 0x38, 0x22, 0x27, 0xce, 0xba, 0x7c, 0x4c, 0x05, 0xd7, 0xfa, 0x2a, 0x98, 0x93, 0x41, 0x26, + 0xfd, 0xf9, 0x6f, 0x34, 0xbe, 0xa4, 0x0b, 0xe5, 0x24, 0xe9, 0x96, 0xa8, 0x0b, 0x8e, 0xab, 0xeb, + 0x8d, 0xbe, 0xba, 0xd4, 0x09, 0xec, 0xab, 0xae, 0x8f, 0x3b, 0x71, 0x93, 0x0c, 0xb9, 0xa2, 0xbe, + 0x89, 0xe3, 0xea, 0x7b, 0xb5, 0xaf, 0xbe, 0x59, 0xb7, 0xd1, 0x5f, 0x4f, 0x8a, 0x27, 0x79, 0x07, + 0x26, 0x25, 0x04, 0xf7, 0x07, 0x5e, 0xf0, 0x09, 0xfd, 0xde, 0x6d, 0xa0, 0x8b, 0x99, 0x9e, 0xfc, + 0x45, 0x45, 0x56, 0xa9, 0xf9, 0xea, 0x98, 0xd4, 0xa8, 0xd3, 0xab, 0x42, 0x47, 0x26, 0x5f, 0x83, + 0x89, 0x95, 0x36, 0xeb, 0x88, 0xdf, 0x71, 0x22, 0x8a, 0x87, 0x51, 0x72, 0x69, 0xaa, 0x94, 0x28, + 0x4b, 0x95, 0x67, 0x99, 0x4c, 0x8a, 0xd4, 0xc3, 0x5c, 0xa1, 0x60, 0x83, 0xc7, 0xaf, 0x5f, 0xc4, + 0x1a, 0x0e, 0xc5, 0xd1, 0xf3, 0x62, 0xc6, 0xc5, 0xa5, 0xc2, 0x1e, 0x65, 0x39, 0xbf, 0xd5, 0xb1, + 0xc5, 0x86, 0xd0, 0x06, 0x4f, 0xe7, 0x49, 0xde, 0x85, 0x09, 0x11, 0xff, 0x58, 0xb5, 0xd6, 0xc2, + 0xb9, 0x32, 0x76, 0x1e, 0x33, 0xb7, 0xc9, 0x50, 0x49, 0xdb, 0x09, 0x52, 0xaf, 0x57, 0x09, 0x3e, + 0xf9, 0x2a, 0x9c, 0xde, 0xf1, 0x3a, 0xae, 0xff, 0x28, 0x14, 0x02, 0x5c, 0x08, 0xba, 0x99, 0xc4, + 0xa3, 0xe7, 0x11, 0x2f, 0xb7, 0xe5, 0xb1, 0xd5, 0x27, 0xf8, 0x32, 0x39, 0x90, 0x9f, 0xeb, 0xe3, + 0xcc, 0x57, 0x10, 0x39, 0x6e, 0x05, 0x2d, 0xf4, 0xad, 0xa0, 0xfe, 0xea, 0xd3, 0xcb, 0x29, 0xb3, + 0x1a, 0xe2, 0x03, 0xd1, 0x75, 0x8e, 0x0f, 0x7c, 0xaf, 0x33, 0x37, 0xab, 0x7d, 0xd3, 0x24, 0x76, + 0xb0, 0x45, 0xbc, 0x0d, 0xbf, 0xe5, 0x35, 0x0f, 0x6a, 0xe6, 0xd1, 0x61, 0xe5, 0xa5, 0xb4, 0x36, + 0xf3, 0xb1, 0xaf, 0x5d, 0x2e, 0x64, 0xb0, 0x26, 0x5f, 0x83, 0x12, 0xfb, 0x1b, 0xab, 0x7e, 0xa7, + 0xb5, 0xa7, 0x2e, 0x05, 0x53, 0xd4, 0x83, 0x73, 0x84, 0x01, 0x9a, 0x19, 0x5a, 0xa1, 0xc6, 0xca, + 0xfc, 0x91, 0x01, 0xa7, 0xb3, 0xda, 0x7a, 0x42, 0x36, 0x1c, 0x33, 0xf5, 0xe8, 0x8d, 0xf7, 0x12, + 0xfc, 0xd1, 0x3b, 0x7e, 0xea, 0xae, 0xc0, 0x28, 0xb3, 0x95, 0xa5, 0x0b, 0x17, 0x1e, 0x87, 0xcc, + 0x9e, 0x0e, 0x2d, 0x0e, 0x67, 0x08, 0xe8, 0x7a, 0x8f, 0xe7, 0xe5, 0x28, 0x47, 0x40, 0xff, 0x7c, + 0x8b, 0xc3, 0x19, 0x02, 0x3b, 0x76, 0xe5, 0x31, 0x81, 0x08, 0xec, 0x34, 0x0e, 0x2d, 0x0e, 0x27, + 0x97, 0x61, 0x7c, 0xbd, 0xb3, 0x4a, 0x9d, 0x87, 0x54, 0xbc, 0x38, 0xe1, 0x3d, 0x8a, 0xdf, 0xb1, + 0x5b, 0x0c, 0x66, 0xc9, 0x42, 0xf3, 0x7b, 0x06, 0xcc, 0xf4, 0x0d, 0xd3, 0xc9, 0x09, 0x7f, 0x8e, + 0x7f, 0xde, 0x1b, 0xa6, 0x7f, 0xbc, 0xf9, 0x23, 0xd9, 0xcd, 0x37, 0xff, 0x32, 0x0f, 0xe7, 0x06, + 0x9c, 0x5a, 0xc9, 0xd3, 0xbc, 0x71, 0xe2, 0xd3, 0xfc, 0x37, 0xd8, 0x29, 0xe1, 0x78, 0xed, 0x70, + 0xd3, 0x4f, 0x5a, 0x9c, 0xbc, 0x62, 0x60, 0x99, 0xcc, 0xa8, 0x21, 0xb3, 0x3f, 0x9c, 0x6f, 0x22, + 0x85, 0x1d, 0xf9, 0x7d, 0x77, 0xc6, 0x3a, 0xb3, 0xbe, 0xc7, 0xf1, 0xfc, 0xdf, 0x90, 0xc7, 0x71, + 0xfd, 0x49, 0x6a, 0xe4, 0x99, 0x3e, 0x49, 0x65, 0x5f, 0x92, 0x8f, 0x3e, 0xcd, 0x53, 0xc0, 0x7f, + 0x4c, 0x3d, 0xc7, 0xff, 0x4d, 0x9c, 0xea, 0xab, 0x30, 0xba, 0xb3, 0x47, 0x03, 0xa9, 0xdf, 0x62, + 0x43, 0x1e, 0x31, 0x80, 0xda, 0x10, 0xc4, 0x30, 0x7f, 0x16, 0x4a, 0x6a, 0x65, 0xb8, 0x97, 0xd9, + 0x6f, 0xb1, 0x99, 0xf8, 0x5e, 0x66, 0x00, 0x8b, 0xc3, 0x4f, 0xcc, 0x9f, 0x95, 0x8c, 0x42, 0xfe, + 0xa4, 0x51, 0x30, 0xff, 0x83, 0x01, 0x23, 0x98, 0x3e, 0xe0, 0x4d, 0x28, 0xca, 0xab, 0x52, 0x35, + 0xa4, 0x7e, 0x56, 0xde, 0xa4, 0x86, 0xba, 0x3f, 0x83, 0x00, 0xb2, 0xaa, 0xb6, 0x69, 0xd0, 0xd0, + 0xdc, 0x5e, 0x1e, 0x32, 0x80, 0x5a, 0x15, 0x62, 0x3c, 0xc1, 0x90, 0xa0, 0x6b, 0x8f, 0xb0, 0xef, + 0xf9, 0x86, 0xe7, 0xae, 0x3d, 0x7d, 0x76, 0xbd, 0xc4, 0x32, 0x7f, 0xd3, 0x80, 0x33, 0x99, 0x7a, + 0x00, 0xab, 0x95, 0x2b, 0x1c, 0xca, 0x8a, 0x48, 0x6b, 0x1b, 0x1c, 0xe3, 0x49, 0x5c, 0x78, 0x9e, + 0x60, 0x7a, 0x3f, 0x07, 0xc5, 0xd8, 0x3e, 0x23, 0xa7, 0xe5, 0xd4, 0xe1, 0x7d, 0x9a, 0x34, 0x66, + 0xfe, 0xda, 0x80, 0x31, 0xd6, 0x84, 0xe7, 0x36, 0x16, 0x23, 0xfb, 0x76, 0x95, 0x75, 0x69, 0xa8, + 0x08, 0x8c, 0xdf, 0x1b, 0x03, 0x48, 0x90, 0x49, 0x03, 0xa6, 0xd6, 0x57, 0x96, 0x16, 0x57, 0x5c, + 0xda, 0x89, 0xf0, 0x95, 0x2f, 0x15, 0x93, 0xcf, 0x0c, 0xcb, 0xa0, 0xe3, 0xb4, 0x04, 0xc2, 0x41, + 0xb2, 0x3d, 0x7d, 0xcf, 0x6d, 0xda, 0x5e, 0x4c, 0xa7, 0x2a, 0x64, 0x3a, 0x47, 0x56, 0x47, 0xbd, + 0x7a, 0x7f, 0x55, 0xa9, 0x23, 0x37, 0x64, 0x1d, 0xa1, 0xd3, 0x6e, 0x0d, 0xa8, 0x43, 0xe7, 0x48, + 0xf6, 0xa0, 0x7c, 0x07, 0x65, 0xb7, 0x52, 0x4b, 0xfe, 0xf8, 0x5a, 0x5e, 0x16, 0xb5, 0xbc, 0xc0, + 0x85, 0x7e, 0x76, 0x3d, 0x7d, 0x5c, 0x93, 0x95, 0x3b, 0x72, 0xe2, 0xca, 0xfd, 0x7b, 0x06, 0x8c, + 0xf1, 0xc3, 0x21, 0xfe, 0xac, 0x47, 0xe6, 0xf1, 0xb3, 0xf3, 0x6c, 0x8e, 0x9f, 0x72, 0x84, 0xff, + 0xa9, 0x06, 0x38, 0x2f, 0x23, 0x4b, 0xa9, 0x6f, 0x84, 0xc8, 0x2b, 0x74, 0x54, 0x4c, 0x79, 0x49, + 0xe2, 0x08, 0xc5, 0x3f, 0x0f, 0xa2, 0x72, 0xe1, 0x18, 0xea, 0x17, 0x0b, 0xc7, 0x9f, 0xf2, 0x8b, + 0x85, 0xab, 0x50, 0x14, 0x9e, 0x3d, 0xb5, 0x03, 0x61, 0x7e, 0xca, 0x0b, 0x96, 0x18, 0xae, 0xa4, + 0xaa, 0xe6, 0x20, 0xbb, 0xa1, 0x25, 0x9a, 0x8b, 0x11, 0xc9, 0x3a, 0x14, 0x93, 0x40, 0x92, 0xa2, + 0xf6, 0x0e, 0x1a, 0xc3, 0x85, 0xeb, 0x2b, 0x8f, 0x55, 0xcc, 0x8c, 0x1b, 0x49, 0x78, 0x98, 0xdf, + 0x32, 0xa0, 0x9c, 0x5e, 0x2f, 0xe4, 0x1d, 0x98, 0x88, 0x63, 0x79, 0x62, 0xff, 0x02, 0xbc, 0xc8, + 0x4c, 0x82, 0x7f, 0x34, 0x4f, 0x03, 0x15, 0x9d, 0x2c, 0x40, 0x81, 0x6d, 0x3b, 0x25, 0xd3, 0x30, + 0xca, 0x93, 0x9e, 0x80, 0xa9, 0xef, 0x7a, 0x12, 0x4f, 0xd9, 0xb5, 0xff, 0x39, 0x0f, 0x13, 0xca, + 0x64, 0x91, 0xab, 0x50, 0x58, 0x09, 0x57, 0xfd, 0xe6, 0x3e, 0x75, 0xc5, 0x73, 0x01, 0x7e, 0x90, + 0xd2, 0x0b, 0xed, 0x16, 0x02, 0xad, 0xb8, 0x98, 0xd4, 0x60, 0x92, 0xff, 0x27, 0x63, 0x36, 0x73, + 0xc9, 0x55, 0x27, 0x47, 0x96, 0xd1, 0x9a, 0xea, 0x09, 0xab, 0x91, 0x90, 0x8f, 0x00, 0x38, 0x80, + 0xcd, 0xef, 0x10, 0x8e, 0xbd, 0x72, 0x03, 0x9f, 0x11, 0x15, 0x44, 0x9e, 0xda, 0x43, 0x5c, 0x0a, + 0x0a, 0x43, 0xfc, 0x18, 0x9e, 0xdf, 0xdc, 0x1f, 0xfe, 0x73, 0x98, 0xc9, 0xc7, 0xf0, 0xfc, 0xe6, + 0xbe, 0x9d, 0xed, 0xe5, 0xa5, 0xb2, 0x24, 0xdf, 0x36, 0xe0, 0x82, 0x45, 0x9b, 0xfe, 0x43, 0x1a, + 0x1c, 0x54, 0x23, 0xc4, 0x52, 0x6b, 0x3c, 0xd9, 0xa5, 0xec, 0xa6, 0xa8, 0xf1, 0xb5, 0x40, 0x70, + 0xc1, 0xe0, 0x95, 0x76, 0x37, 0xb2, 0x8f, 0x69, 0xc2, 0x31, 0x55, 0x9a, 0x7f, 0x66, 0x28, 0x5b, + 0x80, 0xac, 0x41, 0x31, 0x5e, 0x2c, 0xe2, 0xc2, 0x31, 0x56, 0x8e, 0x24, 0xdc, 0xa2, 0x0f, 0x6a, + 0x2f, 0x88, 0x9b, 0xfd, 0xd9, 0x78, 0xc9, 0x69, 0x3b, 0x42, 0x02, 0xc9, 0x57, 0x60, 0x04, 0xa7, + 0xea, 0xe4, 0xd4, 0x54, 0xf2, 0xa8, 0x19, 0x61, 0x73, 0x84, 0xad, 0x46, 0x4a, 0xf2, 0x05, 0xe1, + 0xe5, 0x91, 0xd7, 0x92, 0xbe, 0x32, 0x10, 0x6b, 0x47, 0x7c, 0xc6, 0x24, 0x8e, 0x85, 0xca, 0x6a, + 0xfd, 0x3b, 0x06, 0xcc, 0x6e, 0x2d, 0xdc, 0xb6, 0xe8, 0xae, 0x87, 0x31, 0xaf, 0x9e, 0x8f, 0x4f, + 0xb0, 0xe4, 0x3c, 0xe4, 0x2d, 0xe7, 0x91, 0x48, 0x21, 0x89, 0x51, 0x05, 0x81, 0xf3, 0xc8, 0x62, + 0x30, 0xf2, 0x3a, 0x14, 0xef, 0xd1, 0x83, 0xbb, 0x4e, 0xc7, 0x15, 0x5f, 0x86, 0x28, 0xf1, 0x74, + 0x23, 0xfb, 0xf4, 0xc0, 0xde, 0x43, 0xa8, 0x95, 0x20, 0xe0, 0xfb, 0x72, 0xaf, 0x71, 0x8f, 0xf2, + 0x67, 0xb8, 0x92, 0x78, 0x5f, 0xee, 0x35, 0xd0, 0x71, 0x9d, 0x97, 0x98, 0x7f, 0x98, 0x87, 0x72, + 0x7a, 0xf7, 0x93, 0xf7, 0xa1, 0xb4, 0xe1, 0x84, 0xe1, 0x23, 0x3f, 0x70, 0xef, 0x3a, 0xe1, 0x9e, + 0x68, 0x0a, 0x1a, 0x9e, 0x5d, 0x01, 0xb7, 0xf7, 0x1c, 0x2d, 0xeb, 0x99, 0x46, 0xc0, 0xb4, 0x82, + 0x4d, 0xe1, 0x34, 0xaf, 0xec, 0xe2, 0xc8, 0x8f, 0xba, 0xa9, 0x6c, 0x96, 0x12, 0x8d, 0xb8, 0x30, + 0x9d, 0x1a, 0x8b, 0x78, 0x03, 0xc5, 0xd1, 0x7f, 0xe9, 0x91, 0xe2, 0x37, 0x79, 0xbd, 0x85, 0x07, + 0x98, 0x11, 0x4a, 0x96, 0xa8, 0x81, 0x69, 0x29, 0x22, 0xf2, 0x16, 0xc0, 0xd6, 0xc2, 0x6d, 0xb4, + 0x3f, 0x69, 0x20, 0xbc, 0xae, 0xf1, 0x5a, 0x86, 0x31, 0x69, 0x72, 0xb0, 0x6a, 0x35, 0x24, 0xc8, + 0xe4, 0x4d, 0xc8, 0xf3, 0x78, 0x42, 0x35, 0x57, 0xd3, 0xfd, 0xdb, 0x55, 0x1e, 0x82, 0xc5, 0x9f, + 0xdc, 0xf5, 0xb7, 0x0b, 0x86, 0x4f, 0x56, 0x95, 0x68, 0xb4, 0x31, 0x2d, 0x67, 0x8d, 0x04, 0xc7, + 0xa3, 0x3f, 0x44, 0x58, 0xda, 0x1f, 0xe4, 0xa1, 0x18, 0xd7, 0x49, 0x08, 0xa0, 0x26, 0x26, 0xde, + 0xcb, 0xf1, 0x7f, 0x72, 0x1e, 0x0a, 0x52, 0xf9, 0x12, 0x6f, 0xe6, 0xe3, 0xa1, 0x50, 0xbc, 0xe6, + 0x40, 0x6a, 0x59, 0x5c, 0xf1, 0xb2, 0xe4, 0x4f, 0x72, 0x03, 0x62, 0x15, 0x6a, 0x90, 0xae, 0x35, + 0xc2, 0x96, 0xb2, 0x15, 0xa3, 0x91, 0x29, 0xc8, 0x79, 0xdc, 0x4b, 0xbb, 0x68, 0xe5, 0x3c, 0x97, + 0xbc, 0x0f, 0x05, 0xc7, 0x75, 0xa9, 0x6b, 0x3b, 0xd1, 0x10, 0x1f, 0x6d, 0x2d, 0x30, 0x6e, 0xfc, + 0xac, 0x43, 0xaa, 0x6a, 0x44, 0xaa, 0x50, 0xc4, 0x6f, 0x76, 0xf6, 0xc2, 0xa1, 0x3e, 0xf4, 0x99, + 0x70, 0x28, 0x30, 0xb2, 0xad, 0x90, 0xba, 0xe4, 0x35, 0x18, 0x61, 0x4b, 0x4c, 0x9c, 0x94, 0x71, + 0xd6, 0xbd, 0xf5, 0xcd, 0x0d, 0x3e, 0x60, 0x77, 0x4f, 0x59, 0x88, 0x40, 0x5e, 0x81, 0x7c, 0x6f, + 0xe1, 0x81, 0x38, 0x03, 0xcb, 0xc9, 0x02, 0x8b, 0xd1, 0x58, 0x31, 0xb9, 0x09, 0x85, 0x47, 0x7a, + 0x20, 0xe1, 0x99, 0xd4, 0xd4, 0xc5, 0xf8, 0x31, 0x62, 0xad, 0x00, 0x63, 0x3c, 0x6c, 0xcf, 0x7c, + 0x09, 0x20, 0xa9, 0xba, 0xdf, 0xb5, 0xc1, 0xfc, 0x08, 0x8a, 0x71, 0x95, 0xe4, 0x45, 0x50, 0xf6, + 0x30, 0xdf, 0x6f, 0x56, 0x71, 0x3f, 0xde, 0xc9, 0xe7, 0x60, 0xbc, 0xcb, 0x66, 0x55, 0x26, 0x88, + 0xb5, 0xd8, 0x36, 0x66, 0xdb, 0x66, 0x0e, 0xc6, 0xc5, 0xb2, 0xe5, 0x11, 0x07, 0x96, 0xfc, 0x69, + 0xfe, 0x4e, 0x0e, 0x53, 0x07, 0x28, 0xed, 0x24, 0x2f, 0xc3, 0x64, 0x33, 0xa0, 0x78, 0x50, 0x3b, + 0x4c, 0x61, 0x14, 0xf5, 0x94, 0x12, 0xe0, 0x8a, 0x4b, 0x2e, 0xc3, 0x74, 0x92, 0xb1, 0xd6, 0x6e, + 0x36, 0x44, 0x18, 0x71, 0xc9, 0x9a, 0xec, 0xca, 0x94, 0xb5, 0x8b, 0x0d, 0x8c, 0x2e, 0x28, 0xab, + 0x21, 0x7b, 0x91, 0xcc, 0x3e, 0x5b, 0xb4, 0xa6, 0x15, 0x38, 0x3e, 0xc8, 0x9c, 0x85, 0x31, 0xc7, + 0xd9, 0xed, 0x79, 0xdc, 0xd3, 0xb9, 0x64, 0x89, 0x5f, 0xe4, 0xf3, 0x30, 0x13, 0x7a, 0xbb, 0x1d, + 0x27, 0xea, 0x05, 0x54, 0xee, 0x3e, 0x5c, 0x52, 0x93, 0x56, 0x39, 0x2e, 0x90, 0xfb, 0xef, 0x0d, + 0x20, 0x6a, 0x7d, 0x7e, 0xe3, 0x63, 0xda, 0xe4, 0x4b, 0xad, 0x64, 0xcd, 0x28, 0x25, 0xeb, 0x58, + 0x40, 0x3e, 0x07, 0xa5, 0x80, 0x86, 0xa8, 0xac, 0xe2, 0xb0, 0x61, 0x46, 0x1a, 0x6b, 0x42, 0xc2, + 0x98, 0xe8, 0xab, 0xc1, 0x4c, 0xdf, 0x1e, 0x24, 0x6f, 0x70, 0xbb, 0x47, 0x68, 0x2e, 0x25, 0x6e, + 0xe6, 0x31, 0xf1, 0x9d, 0xfa, 0xcc, 0x33, 0x47, 0x32, 0x3b, 0x50, 0x52, 0x4f, 0x9e, 0x13, 0x02, + 0xb4, 0xcf, 0xa2, 0xcb, 0x25, 0x97, 0x88, 0x63, 0x47, 0x87, 0x95, 0x9c, 0xe7, 0xa2, 0xa3, 0xe5, + 0x15, 0x28, 0x48, 0xfd, 0x49, 0xfd, 0x9c, 0x89, 0x50, 0xb5, 0x0f, 0xac, 0xb8, 0xd4, 0x7c, 0x0d, + 0xc6, 0xc5, 0xe1, 0x72, 0xfc, 0x05, 0x97, 0xf9, 0x8b, 0x39, 0x98, 0xb6, 0x28, 0xdb, 0xe0, 0xe2, + 0x43, 0x21, 0x9f, 0xb1, 0xdc, 0xbd, 0x5a, 0xdf, 0x8e, 0xc9, 0x87, 0xf0, 0x7d, 0x03, 0x66, 0x33, + 0x70, 0x3f, 0x51, 0xb2, 0xaf, 0x5b, 0x50, 0x5c, 0xf2, 0x9c, 0x56, 0xd5, 0x75, 0x63, 0xd7, 0x51, + 0xd4, 0x93, 0x5d, 0xb6, 0x9d, 0x1c, 0x06, 0x55, 0xd5, 0x8c, 0x18, 0x95, 0x5c, 0x13, 0x8b, 0x22, + 0x49, 0x47, 0x28, 0xb3, 0x03, 0x03, 0x6f, 0x53, 0x92, 0x1b, 0x18, 0x03, 0xf4, 0x38, 0x30, 0xf1, + 0x0e, 0x78, 0x6e, 0xa7, 0x2e, 0x3b, 0x40, 0x2f, 0xdd, 0xbd, 0xa1, 0x0c, 0xf2, 0x6f, 0xe5, 0xe0, + 0x6c, 0x36, 0xe1, 0x27, 0xcd, 0xdb, 0x86, 0xc9, 0x28, 0x94, 0x04, 0xcc, 0xa8, 0x48, 0xf1, 0xcc, + 0x15, 0x88, 0x9f, 0x20, 0x90, 0x07, 0x30, 0xb9, 0xea, 0x84, 0xd1, 0x5d, 0xea, 0x04, 0x51, 0x83, + 0x3a, 0xd1, 0x10, 0xba, 0x7d, 0xfc, 0x31, 0x65, 0x3c, 0xd4, 0xf6, 0x24, 0x65, 0xfa, 0x63, 0xca, + 0x1a, 0xdb, 0x78, 0xa1, 0x8c, 0x0c, 0xb1, 0x50, 0xbe, 0x09, 0xd3, 0x75, 0xda, 0x76, 0xba, 0x7b, + 0x7e, 0x40, 0xc5, 0x9d, 0xfc, 0x75, 0x98, 0x8c, 0x41, 0x99, 0xab, 0x45, 0x2f, 0xd6, 0xf0, 0x95, + 0x81, 0x48, 0x44, 0x89, 0x5e, 0x6c, 0xfe, 0x56, 0x0e, 0xce, 0x55, 0x9b, 0xe2, 0x01, 0x43, 0x14, + 0xc8, 0x77, 0xd6, 0x4f, 0xb9, 0x6e, 0x32, 0x0f, 0xc5, 0xfb, 0xce, 0xe3, 0x55, 0x8a, 0x9f, 0x3b, + 0xe5, 0xd9, 0x7f, 0xb8, 0xca, 0xe5, 0x3c, 0xb6, 0xe3, 0x0b, 0x41, 0x2b, 0xc1, 0x51, 0xcd, 0xf0, + 0x91, 0xa7, 0x34, 0xc3, 0x4d, 0x18, 0xbb, 0xeb, 0xb7, 0x5c, 0x71, 0x38, 0x89, 0xf7, 0x90, 0x3d, + 0x84, 0x58, 0xa2, 0xc4, 0xfc, 0x91, 0x01, 0x53, 0x71, 0x8b, 0xb1, 0x09, 0x9f, 0xfa, 0x90, 0x5c, + 0x86, 0x71, 0xac, 0x28, 0xfe, 0xd8, 0x0e, 0x1e, 0x1a, 0x2d, 0x06, 0xb2, 0x3d, 0xd7, 0x92, 0x85, + 0xea, 0x48, 0x8c, 0x3e, 0xdd, 0x48, 0x98, 0xff, 0x0c, 0x9f, 0x5a, 0xd4, 0x5e, 0xb2, 0x93, 0x48, + 0x69, 0x88, 0x31, 0x64, 0x43, 0x72, 0xcf, 0x6c, 0x4a, 0xf2, 0x03, 0xa7, 0xe4, 0x97, 0x72, 0x30, + 0x11, 0x37, 0xf6, 0x33, 0x16, 0xd9, 0x1e, 0xf7, 0x6b, 0x28, 0xbf, 0xf5, 0xba, 0x22, 0x2b, 0x84, + 0x7b, 0xf8, 0x57, 0x60, 0x4c, 0x6c, 0x26, 0x23, 0xf5, 0xde, 0x98, 0x9a, 0xdd, 0xe4, 0x83, 0xb8, + 0x38, 0xa1, 0xa1, 0x25, 0xe8, 0x30, 0x30, 0x60, 0x87, 0x36, 0xc4, 0xcb, 0xdb, 0x73, 0x7b, 0x46, + 0x65, 0x07, 0x06, 0x24, 0x1d, 0x1b, 0xea, 0x74, 0xfa, 0xc7, 0x23, 0x50, 0x4e, 0x93, 0x9c, 0x9c, + 0x3b, 0x60, 0xa3, 0xd7, 0x10, 0x46, 0x3c, 0x5a, 0xf9, 0xdd, 0x5e, 0xc3, 0x62, 0x30, 0x72, 0x19, + 0x46, 0x36, 0x02, 0xef, 0xa1, 0xb0, 0xda, 0xd1, 0xb7, 0xac, 0x1b, 0x78, 0x0f, 0x55, 0x0f, 0x59, + 0x56, 0x8e, 0x56, 0xf6, 0x6a, 0x5d, 0xf9, 0x16, 0x39, 0xb7, 0xb2, 0x5b, 0x61, 0x3a, 0xbd, 0x8c, + 0x44, 0x63, 0x47, 0x65, 0x8d, 0x3a, 0x81, 0x88, 0x73, 0x17, 0xe2, 0x0c, 0x8f, 0xca, 0x06, 0x82, + 0x79, 0xee, 0x58, 0x4b, 0x45, 0x22, 0x2d, 0x20, 0xca, 0x4f, 0xb9, 0x81, 0x4f, 0xb6, 0xf1, 0xe4, + 0x67, 0x9a, 0x4e, 0xab, 0xac, 0x6d, 0x75, 0x37, 0x67, 0xf0, 0x7d, 0x96, 0xb7, 0xa7, 0x1b, 0x50, + 0xc4, 0xcb, 0x40, 0xbc, 0xe2, 0x29, 0x9c, 0xc8, 0x4c, 0x7a, 0x23, 0x03, 0xfa, 0x29, 0xd8, 0xf1, + 0x45, 0x4f, 0xc2, 0x84, 0xbc, 0x07, 0x13, 0xaa, 0x0b, 0x2d, 0x77, 0xf4, 0xbc, 0xc8, 0x63, 0xa7, + 0x06, 0xa4, 0x61, 0x53, 0x09, 0xcc, 0x2f, 0xa8, 0xab, 0x44, 0x1c, 0xda, 0xc7, 0xae, 0x12, 0xf3, + 0x37, 0x50, 0x8d, 0x6f, 0xfb, 0x11, 0x15, 0xda, 0xcb, 0x73, 0x2b, 0xc7, 0x92, 0xcb, 0xf5, 0x51, + 0xcd, 0x57, 0x46, 0xeb, 0xdd, 0x13, 0x7c, 0x85, 0xfb, 0xf7, 0x0d, 0x38, 0x93, 0x49, 0x4b, 0xae, + 0x03, 0x24, 0x3a, 0xa2, 0x18, 0x25, 0x9e, 0x94, 0x37, 0x86, 0x5a, 0x0a, 0x06, 0xf9, 0x46, 0x5a, + 0xbb, 0x3b, 0xf9, 0x70, 0x92, 0x9f, 0xae, 0x98, 0xd2, 0xb5, 0xbb, 0x0c, 0x9d, 0xce, 0xfc, 0x7e, + 0x1e, 0x66, 0xfa, 0x3e, 0x79, 0x78, 0x82, 0x77, 0xc2, 0x7e, 0xea, 0x83, 0x5a, 0xfc, 0x21, 0xe8, + 0xda, 0xa0, 0x0f, 0x2e, 0x66, 0x7c, 0x5e, 0x0b, 0xef, 0xea, 0x44, 0x3e, 0xe8, 0x13, 0xbe, 0xb2, + 0x15, 0x66, 0x7f, 0x8a, 0xed, 0xf3, 0x03, 0x6b, 0x7b, 0x06, 0x9f, 0x64, 0xfb, 0x1b, 0xfc, 0xc5, + 0xaa, 0xdf, 0xc8, 0xc1, 0x6c, 0x5f, 0x9f, 0x9f, 0xdb, 0x5d, 0xf7, 0x15, 0xed, 0x74, 0x7b, 0x69, + 0xd0, 0x9c, 0x0e, 0xa5, 0x45, 0xfc, 0x2f, 0x03, 0xce, 0x0d, 0xa0, 0x24, 0x07, 0xe9, 0x45, 0xc4, + 0xb5, 0x8a, 0x1b, 0xc7, 0x57, 0xf8, 0x4c, 0x96, 0xd2, 0xa7, 0xb6, 0x12, 0x7e, 0x31, 0x07, 0xb0, + 0x43, 0x1b, 0xcf, 0x77, 0x62, 0xa4, 0x2f, 0x69, 0x0b, 0x40, 0xb9, 0xc0, 0x1c, 0x3e, 0x2f, 0xd2, + 0x3a, 0x5e, 0x24, 0x0e, 0x9f, 0x15, 0x29, 0xfe, 0x3c, 0x47, 0x2e, 0xfb, 0xf3, 0x1c, 0x66, 0x03, + 0x4e, 0xdf, 0xa1, 0x51, 0x72, 0x12, 0x4a, 0x1b, 0xf2, 0x78, 0xb6, 0xaf, 0x43, 0x51, 0xe0, 0xeb, + 0xa9, 0xd6, 0xa5, 0xab, 0x9d, 0xe7, 0x5a, 0x09, 0x82, 0x49, 0xe1, 0xdc, 0x12, 0x6d, 0xd1, 0x88, + 0x7e, 0xba, 0xd5, 0xd4, 0x81, 0xf0, 0xae, 0xf0, 0xaf, 0x36, 0x0c, 0x55, 0xc3, 0x89, 0xe3, 0xb3, + 0x0d, 0x67, 0xe2, 0xb6, 0x3f, 0x4b, 0xbe, 0xf3, 0x4c, 0x97, 0x10, 0x51, 0x88, 0x09, 0xc7, 0x63, + 0x2e, 0x11, 0x1f, 0xc3, 0x05, 0x49, 0xb0, 0xe3, 0xc5, 0xcf, 0x43, 0x43, 0xd1, 0x92, 0x77, 0x60, + 0x42, 0xa1, 0x11, 0x21, 0xcd, 0xf8, 0x0e, 0xfc, 0xc8, 0x8b, 0xf6, 0xec, 0x90, 0xc3, 0xd5, 0x77, + 0x60, 0x05, 0xdd, 0xfc, 0x3a, 0xbc, 0x10, 0x7b, 0xf4, 0x64, 0x54, 0x9d, 0x62, 0x6e, 0x3c, 0x19, + 0xf3, 0xb5, 0xa4, 0x5b, 0x2b, 0x9d, 0xd8, 0xb3, 0x5e, 0xf2, 0x26, 0x6a, 0xb7, 0x44, 0x67, 0x2e, + 0x2a, 0x09, 0xe3, 0xc4, 0x59, 0x94, 0x00, 0xcc, 0xb7, 0x95, 0xc6, 0x66, 0x30, 0xd4, 0x88, 0x8d, + 0x34, 0xf1, 0x2f, 0xe6, 0x60, 0x7a, 0x7d, 0x65, 0x69, 0x31, 0xbe, 0x46, 0xfe, 0x8c, 0x65, 0x6d, + 0xd2, 0xfa, 0x36, 0x58, 0xde, 0x98, 0x5b, 0x30, 0x9b, 0x1a, 0x06, 0xfc, 0x28, 0xcd, 0x7b, 0xdc, + 0xf3, 0x26, 0x06, 0xcb, 0x93, 0xe5, 0x6c, 0x16, 0xfb, 0xed, 0x9b, 0x56, 0x0a, 0xdb, 0xfc, 0xfe, + 0x58, 0x8a, 0xaf, 0x10, 0x61, 0xaf, 0x43, 0x71, 0x25, 0x0c, 0x7b, 0x34, 0xd8, 0xb2, 0x56, 0x55, + 0x1d, 0xd1, 0x43, 0xa0, 0xdd, 0x0b, 0x5a, 0x56, 0x82, 0x40, 0xae, 0x42, 0x41, 0x44, 0xbe, 0x49, + 0x99, 0x80, 0x8e, 0x04, 0x71, 0xe0, 0x9c, 0x15, 0x17, 0x93, 0x37, 0xa1, 0xc4, 0xff, 0xe7, 0xab, + 0x4d, 0x0c, 0x38, 0xde, 0x55, 0x09, 0x74, 0xbe, 0x3a, 0x2d, 0x0d, 0x8d, 0x59, 0x66, 0xf2, 0xab, + 0x97, 0xac, 0x45, 0x23, 0x89, 0x65, 0x26, 0x3f, 0x90, 0x89, 0x6d, 0x52, 0x91, 0xc8, 0x35, 0xc8, + 0x57, 0x17, 0x2d, 0x35, 0xbb, 0xb4, 0xd3, 0x0c, 0x78, 0x76, 0x76, 0xed, 0xc3, 0x52, 0xd5, 0x45, + 0x8b, 0x2c, 0x40, 0x01, 0x3f, 0x1c, 0xe2, 0xd2, 0x40, 0x78, 0xd3, 0xe2, 0xaa, 0xe9, 0x0a, 0x98, + 0xfa, 0xda, 0x28, 0xf1, 0xc8, 0x3c, 0x8c, 0x2f, 0x79, 0x61, 0xb7, 0xe5, 0x1c, 0x88, 0x74, 0x2d, + 0xf8, 0x18, 0xe2, 0x72, 0x90, 0xba, 0xce, 0x04, 0x16, 0xb9, 0x0a, 0xa3, 0xf5, 0xa6, 0xdf, 0x65, + 0xd6, 0x56, 0xec, 0xf4, 0x13, 0x32, 0x80, 0x96, 0xf3, 0x81, 0x01, 0x30, 0x18, 0x9b, 0xc7, 0x94, + 0x15, 0x95, 0x60, 0xec, 0x74, 0x2c, 0x99, 0xc0, 0xe9, 0xf7, 0x8c, 0x84, 0x67, 0xe9, 0x19, 0xd9, + 0x80, 0x73, 0x77, 0x50, 0xd5, 0xaf, 0xd3, 0x00, 0xf3, 0x69, 0xf2, 0x8f, 0x10, 0x6d, 0x59, 0x2b, + 0x22, 0x8e, 0xee, 0xca, 0xd1, 0x61, 0xe5, 0x15, 0x6e, 0x0d, 0xd8, 0x21, 0xc7, 0x91, 0xdf, 0x2f, + 0x4a, 0x7d, 0x79, 0x61, 0x10, 0x23, 0xf2, 0x55, 0x38, 0x9d, 0x55, 0x24, 0x22, 0xea, 0xd0, 0x5f, + 0x3e, 0xbb, 0x02, 0xd5, 0x61, 0x3d, 0x8b, 0x03, 0x59, 0x85, 0x32, 0x87, 0x57, 0xdd, 0xb6, 0xd7, + 0x59, 0x6e, 0x3b, 0x5e, 0x0b, 0xe3, 0xeb, 0x44, 0x90, 0xa4, 0xe0, 0xea, 0xb0, 0x42, 0x9b, 0xb2, + 0x52, 0xcd, 0x6f, 0x2b, 0x45, 0x89, 0xe2, 0xa8, 0x5e, 0xbd, 0xbf, 0x9a, 0xec, 0xa9, 0xcf, 0xd6, + 0xbb, 0x91, 0xd6, 0xb7, 0x63, 0xde, 0x8d, 0xb6, 0x60, 0x36, 0x35, 0x0c, 0x52, 0x1c, 0x69, 0xe0, + 0xb4, 0x38, 0x4a, 0xd1, 0x58, 0x29, 0x6c, 0xf3, 0xbf, 0x8c, 0xa5, 0xf8, 0x8a, 0xbb, 0x22, 0x13, + 0xc6, 0xb8, 0xb4, 0x51, 0xf3, 0xb9, 0x71, 0x59, 0x64, 0x89, 0x12, 0x72, 0x1e, 0xf2, 0xf5, 0xfa, + 0xba, 0x9a, 0x6d, 0x32, 0x0c, 0x7d, 0x8b, 0xc1, 0xd8, 0x0c, 0xe1, 0x35, 0x90, 0x12, 0xba, 0xd6, + 0xa4, 0x41, 0x24, 0x3e, 0x8b, 0xfa, 0x6a, 0xb2, 0x8f, 0x47, 0x92, 0xf1, 0x16, 0xfb, 0x38, 0xd9, + 0xbd, 0x8b, 0x30, 0x57, 0x0d, 0x43, 0x1a, 0x44, 0x3c, 0xb9, 0x7d, 0xd8, 0x6b, 0xd3, 0x40, 0xac, + 0x35, 0x21, 0x63, 0xf8, 0x47, 0xd5, 0x9b, 0xa1, 0x35, 0x10, 0x91, 0x5c, 0x81, 0x42, 0xb5, 0xe7, + 0x7a, 0xb4, 0xd3, 0xd4, 0xbc, 0xf6, 0x1d, 0x01, 0xb3, 0xe2, 0x52, 0xf2, 0x21, 0x9c, 0x11, 0x44, + 0x52, 0xe0, 0x88, 0x11, 0xe0, 0xb2, 0x86, 0x5b, 0xb0, 0x62, 0x2f, 0x48, 0x31, 0x65, 0x8b, 0x21, + 0xc9, 0xa6, 0x24, 0x55, 0x28, 0x2f, 0xe3, 0x3b, 0xa9, 0xfc, 0x38, 0xb2, 0x1f, 0x88, 0x24, 0xc6, + 0x28, 0xb9, 0xf8, 0x1b, 0xaa, 0xed, 0xc6, 0x85, 0x56, 0x1f, 0x3a, 0xb9, 0x07, 0xb3, 0x69, 0x18, + 0x93, 0xc7, 0xc5, 0xe4, 0xe3, 0x65, 0x7d, 0x5c, 0x50, 0x30, 0x67, 0x51, 0x91, 0x06, 0xcc, 0x54, + 0xa3, 0x28, 0xf0, 0x1a, 0xbd, 0x88, 0xa6, 0x44, 0x97, 0xbc, 0x68, 0x8c, 0xcb, 0xa5, 0xf8, 0x7a, + 0x41, 0x2c, 0xc6, 0x59, 0x27, 0xa6, 0x8c, 0x45, 0x98, 0xd5, 0xcf, 0x8e, 0xb8, 0xf1, 0xf7, 0x0f, + 0xc5, 0x37, 0x02, 0x45, 0xa8, 0x95, 0xbc, 0xd0, 0xad, 0x86, 0x07, 0xed, 0x36, 0x8d, 0x02, 0x7c, + 0xb9, 0xc7, 0x6f, 0x08, 0x9a, 0xc2, 0x3b, 0xea, 0x82, 0xf2, 0xd9, 0x4f, 0xfc, 0x4e, 0xa4, 0xe6, + 0x38, 0xaa, 0xf1, 0xd4, 0x8e, 0x8f, 0xd2, 0x90, 0xc7, 0x47, 0x0b, 0x66, 0x96, 0x3b, 0xcd, 0xe0, + 0x00, 0x63, 0x3e, 0x65, 0xe3, 0x26, 0x4f, 0x68, 0x9c, 0xfc, 0x40, 0xc8, 0x45, 0x47, 0xae, 0xb0, + 0xac, 0xe6, 0xf5, 0x33, 0x36, 0xff, 0x16, 0x94, 0xd3, 0x63, 0xf9, 0x94, 0x1f, 0x7d, 0x7e, 0x12, + 0xa7, 0x75, 0x36, 0xd3, 0xe9, 0xbe, 0x90, 0x79, 0xed, 0xcb, 0xbe, 0x46, 0x12, 0xaf, 0xaf, 0x7c, + 0x83, 0x57, 0xfb, 0x9e, 0xaf, 0xdc, 0xc6, 0xb9, 0xac, 0x6d, 0x6c, 0xfe, 0x72, 0x0e, 0x66, 0xb8, + 0x9f, 0xed, 0xf3, 0xaf, 0x2b, 0xbe, 0xa7, 0x09, 0x67, 0x79, 0x17, 0x98, 0xea, 0xdd, 0x31, 0xda, + 0xe2, 0x47, 0x70, 0xa6, 0x6f, 0x28, 0x50, 0x40, 0x2f, 0x49, 0x0f, 0xe7, 0x3e, 0x11, 0x3d, 0x97, + 0x5d, 0xc9, 0xf6, 0x4d, 0xab, 0x8f, 0xc2, 0xfc, 0x27, 0xb9, 0x3e, 0xfe, 0x42, 0x6f, 0x54, 0x35, + 0x41, 0xe3, 0xc9, 0x34, 0xc1, 0xdc, 0x27, 0xd2, 0x04, 0xf3, 0xc3, 0x68, 0x82, 0x1f, 0xc2, 0xe4, + 0x26, 0x75, 0x98, 0x46, 0x23, 0xc2, 0xf0, 0x46, 0xb4, 0xaf, 0xee, 0xb2, 0x32, 0x29, 0x5f, 0xe2, + 0x10, 0xde, 0x88, 0x11, 0x30, 0xd1, 0xc2, 0xe3, 0xf2, 0x2c, 0x9d, 0x83, 0x7a, 0x68, 0x8c, 0x0e, + 0x3e, 0x34, 0xcc, 0x6f, 0xe5, 0x60, 0x42, 0x61, 0x4f, 0xbe, 0x08, 0xa5, 0xf5, 0x60, 0xd7, 0xe9, + 0x78, 0x3f, 0xe3, 0x28, 0xd7, 0xaf, 0xd8, 0x7c, 0x5f, 0x81, 0x5b, 0x1a, 0x16, 0xba, 0xcd, 0x50, + 0xa7, 0xad, 0x2e, 0x7c, 0xd6, 0x3c, 0x0b, 0xa1, 0x4a, 0x18, 0x75, 0x7e, 0x88, 0x30, 0x6a, 0x3d, + 0x06, 0x79, 0xe4, 0xc9, 0x63, 0x90, 0xb5, 0x90, 0xe1, 0xd1, 0x27, 0x0c, 0x19, 0x36, 0x7f, 0x35, + 0x07, 0x65, 0xf1, 0x7d, 0x5a, 0x79, 0x79, 0xf8, 0xd9, 0xfa, 0x9e, 0x85, 0xde, 0xb9, 0x63, 0x9e, + 0xc7, 0x46, 0x7e, 0xf3, 0x77, 0x2b, 0xf8, 0xb5, 0xd1, 0xf4, 0x70, 0xc8, 0xaf, 0x8d, 0xea, 0xf0, + 0x74, 0x4c, 0x45, 0x9a, 0xca, 0x4a, 0xe3, 0x9b, 0x7f, 0x9a, 0x4b, 0xf3, 0x16, 0xda, 0xd4, 0xab, + 0x30, 0xce, 0x3f, 0x2f, 0x26, 0xdd, 0xbe, 0x45, 0x56, 0x2b, 0x04, 0x59, 0xb2, 0xec, 0x49, 0xa2, + 0x6b, 0x4e, 0xfa, 0xe4, 0x2c, 0xb9, 0x05, 0x25, 0xf4, 0x17, 0xa9, 0xba, 0x6e, 0x40, 0xc3, 0x50, + 0x28, 0x5a, 0xf8, 0x76, 0xf7, 0x88, 0x36, 0x6c, 0xee, 0x57, 0xe2, 0xb8, 0x6e, 0x60, 0x69, 0x78, + 0x64, 0x11, 0x4e, 0x6b, 0xee, 0x49, 0x92, 0x7e, 0x34, 0x39, 0x2d, 0x22, 0x2c, 0xe0, 0xc4, 0x99, + 0xc8, 0xcf, 0xee, 0x73, 0xdb, 0xe6, 0xff, 0x36, 0xd8, 0x5e, 0x6b, 0xee, 0x7f, 0xc6, 0xe2, 0x7e, + 0x58, 0x97, 0x8e, 0x51, 0xf6, 0xff, 0x93, 0xc1, 0x3d, 0xf7, 0xc5, 0xf2, 0x79, 0x0b, 0xc6, 0xf8, + 0xc7, 0xcc, 0x84, 0x8f, 0xb9, 0xca, 0x85, 0x17, 0x24, 0xef, 0x53, 0xfc, 0x93, 0x68, 0x96, 0x20, + 0x60, 0x26, 0xb3, 0x1e, 0x40, 0x80, 0x8a, 0x67, 0x7f, 0xe4, 0x80, 0xc4, 0x52, 0x33, 0xb6, 0x0e, + 0x97, 0x09, 0xdc, 0x38, 0x39, 0x63, 0xab, 0xf9, 0x7f, 0x73, 0xbc, 0x3f, 0xa2, 0x51, 0xc3, 0xa6, + 0x22, 0xbc, 0x0c, 0x23, 0xf8, 0xd9, 0x5c, 0x25, 0xdf, 0x63, 0xea, 0x93, 0xb9, 0x58, 0xce, 0xf6, + 0x0d, 0xca, 0x5a, 0x35, 0xd4, 0x0c, 0xc5, 0xb1, 0xba, 0x6f, 0x10, 0x03, 0xf3, 0x6c, 0xfb, 0x2e, + 0x55, 0xb7, 0x43, 0x47, 0x4f, 0x89, 0x8e, 0xe5, 0xe4, 0x96, 0xe2, 0xd7, 0xac, 0x5e, 0x68, 0xb4, + 0x1f, 0x38, 0x36, 0xf7, 0xa7, 0x55, 0xa5, 0x6d, 0xe2, 0x02, 0xbd, 0x0c, 0x53, 0x7a, 0x14, 0xb7, + 0x30, 0x3a, 0x30, 0x18, 0x3e, 0x15, 0x01, 0xae, 0xaa, 0xb7, 0x3a, 0x11, 0xa9, 0xc1, 0xa4, 0x16, + 0xaa, 0xab, 0xa6, 0xa7, 0xe5, 0x79, 0x73, 0xec, 0xfe, 0x1c, 0x13, 0x3a, 0x89, 0x72, 0x61, 0xfe, + 0x05, 0x28, 0x8b, 0x9d, 0x19, 0x47, 0xfd, 0xa1, 0x6a, 0xb7, 0xb2, 0x64, 0xa9, 0xbb, 0xa9, 0xe9, + 0xb9, 0x81, 0x85, 0x50, 0xf3, 0x7b, 0x06, 0x9c, 0x17, 0x1f, 0x69, 0xb3, 0x68, 0xc8, 0x74, 0x48, + 0x0c, 0x15, 0xc4, 0xf5, 0xf8, 0x45, 0xf2, 0x8e, 0x4c, 0xc9, 0xa5, 0x0b, 0xc8, 0x74, 0x1d, 0xb5, + 0x49, 0xb1, 0x28, 0x47, 0x31, 0x29, 0x97, 0x4c, 0xc5, 0xf5, 0x96, 0x48, 0xc5, 0x95, 0x3b, 0x9e, + 0x38, 0xde, 0x17, 0x2e, 0xed, 0xc8, 0x14, 0x5c, 0xdf, 0xcd, 0xc1, 0x99, 0x8c, 0x66, 0x6d, 0x7f, + 0xf1, 0x39, 0x15, 0x0e, 0x35, 0x4d, 0x38, 0xc8, 0x5c, 0x8d, 0x03, 0x07, 0x3e, 0x53, 0x56, 0xfc, + 0xb6, 0x01, 0xe7, 0xf4, 0xd5, 0x23, 0x6c, 0xd1, 0xed, 0x9b, 0xe4, 0x6d, 0x18, 0xbb, 0x4b, 0x1d, + 0x97, 0xca, 0xe0, 0x94, 0x38, 0xef, 0x99, 0xb8, 0x1d, 0xe6, 0x85, 0x9c, 0xed, 0x9f, 0xf2, 0xad, + 0x7c, 0xca, 0x12, 0x24, 0x64, 0x49, 0x34, 0x8e, 0x3f, 0x4f, 0x99, 0xf2, 0xa5, 0x26, 0xab, 0xaa, + 0x63, 0x14, 0xe3, 0xdf, 0x37, 0xe0, 0x85, 0x63, 0x68, 0xd8, 0xc4, 0xb1, 0xa9, 0x57, 0x27, 0x0e, + 0x0f, 0x16, 0x84, 0x92, 0xf7, 0x60, 0x7a, 0x53, 0xc4, 0xd0, 0xc9, 0xe9, 0x50, 0xf2, 0xde, 0xcb, + 0xf0, 0x3a, 0x5b, 0xce, 0x4b, 0x1a, 0x99, 0x59, 0xff, 0x77, 0xfd, 0x30, 0xea, 0x24, 0x69, 0x74, + 0xd0, 0xfa, 0xdf, 0x13, 0x30, 0x2b, 0x2e, 0x65, 0x6a, 0x81, 0xde, 0x4c, 0xe1, 0x0e, 0xf1, 0x32, + 0x8c, 0x31, 0x9c, 0x58, 0xbb, 0xc6, 0x75, 0x80, 0x9f, 0x10, 0xf3, 0x5c, 0x4b, 0x14, 0xc5, 0x76, + 0x5d, 0x2e, 0xf3, 0xd5, 0xe2, 0x5b, 0x06, 0x94, 0x75, 0xde, 0x4f, 0x3b, 0x35, 0xef, 0x6a, 0x53, + 0xf3, 0x42, 0xf6, 0xd4, 0x0c, 0x9e, 0x93, 0xbe, 0x8c, 0x16, 0x43, 0xcd, 0x85, 0x09, 0x63, 0x4b, + 0x7e, 0xdb, 0xf1, 0x3a, 0x6a, 0x16, 0x06, 0x17, 0x21, 0x96, 0x28, 0x51, 0x46, 0x2b, 0x3f, 0x70, + 0xb4, 0xcc, 0xef, 0x8c, 0xc0, 0x79, 0x1e, 0x05, 0x43, 0x83, 0xad, 0xd0, 0xeb, 0xec, 0x6a, 0x6f, + 0x4a, 0x66, 0x6a, 0xc0, 0x85, 0x27, 0x1d, 0x83, 0xc4, 0xe3, 0x7d, 0x15, 0x0a, 0x4c, 0x4a, 0x2b, + 0x63, 0x8e, 0x46, 0x0f, 0xe6, 0x12, 0xe2, 0xf3, 0x2a, 0x8b, 0xc9, 0x35, 0x71, 0x86, 0x28, 0xbe, + 0xce, 0xec, 0x0c, 0x49, 0x7d, 0x01, 0x9d, 0x9f, 0x23, 0xb1, 0x52, 0x35, 0x32, 0x40, 0xa9, 0xba, + 0x0f, 0xa7, 0xab, 0x2e, 0x97, 0x4f, 0x4e, 0x6b, 0x23, 0xf0, 0x3a, 0x4d, 0xaf, 0xeb, 0xb4, 0xa4, + 0x52, 0xce, 0xbf, 0x07, 0x1f, 0x97, 0xdb, 0xdd, 0x18, 0xc1, 0xca, 0x24, 0x63, 0xdd, 0x58, 0x5a, + 0xab, 0xf3, 0x54, 0x31, 0x63, 0xc8, 0x02, 0xbb, 0xe1, 0x76, 0x42, 0x9e, 0x2b, 0xc6, 0x8a, 0x8b, + 0x51, 0x9d, 0xc3, 0x70, 0x87, 0xcd, 0xd5, 0xfa, 0x3d, 0x11, 0x3e, 0x20, 0x5d, 0xb1, 0x78, 0x74, + 0x44, 0xd4, 0x0a, 0xd1, 0x7e, 0xd7, 0xf0, 0x12, 0xba, 0x7a, 0xfd, 0x2e, 0xa3, 0x2b, 0xf4, 0xd1, + 0x85, 0xe1, 0x9e, 0x4a, 0xc7, 0xf1, 0xc8, 0x3c, 0x00, 0x77, 0x66, 0xc1, 0x05, 0x51, 0x4c, 0x94, + 0xbf, 0x00, 0xa1, 0x5c, 0xf9, 0x53, 0x50, 0xc8, 0x3b, 0x30, 0xbb, 0xbc, 0xb8, 0x20, 0xe3, 0x02, + 0x96, 0xfc, 0x66, 0xaf, 0x4d, 0x3b, 0x11, 0xc6, 0xa9, 0x88, 0x40, 0x2f, 0xda, 0x5c, 0x60, 0xab, + 0x20, 0x0b, 0x4d, 0x44, 0x07, 0xf0, 0xa8, 0xbb, 0x45, 0xdf, 0xa5, 0xe1, 0xf6, 0x8d, 0xcf, 0x58, + 0x74, 0x80, 0xd2, 0x37, 0xdc, 0x6d, 0x37, 0x32, 0x77, 0xe6, 0xdf, 0xc7, 0xe8, 0x80, 0x3e, 0x5c, + 0xf2, 0x13, 0x30, 0x8a, 0x3f, 0xc5, 0x89, 0x3b, 0x9b, 0xc1, 0x36, 0x39, 0x6d, 0x9b, 0x3c, 0xeb, + 0x07, 0x12, 0x90, 0x95, 0x24, 0xad, 0xff, 0x13, 0xf8, 0xb8, 0x8a, 0xd0, 0x5d, 0xfd, 0x7b, 0x2e, + 0x2e, 0x94, 0xd4, 0x0a, 0xd9, 0x1a, 0xb9, 0xeb, 0x84, 0x7b, 0xd4, 0x5d, 0x94, 0xdf, 0x6f, 0x2c, + 0xf1, 0x35, 0xb2, 0x87, 0x50, 0xfc, 0xd6, 0x8c, 0xa5, 0xa0, 0x30, 0xe9, 0xb0, 0x12, 0x6e, 0x85, + 0xa2, 0x29, 0xc2, 0x0a, 0xf2, 0xd0, 0x7a, 0x75, 0x2d, 0x51, 0x84, 0xd2, 0x52, 0x66, 0xb5, 0x0c, + 0x9c, 0xe6, 0x3e, 0x0d, 0xb6, 0x6f, 0x7c, 0x1a, 0xd2, 0x52, 0xaf, 0xe3, 0x98, 0x39, 0xf9, 0xb5, + 0x42, 0x9c, 0xb4, 0x46, 0x43, 0x66, 0x3a, 0x62, 0xf2, 0x32, 0x6f, 0x24, 0x3a, 0x62, 0xf2, 0x32, + 0xaf, 0xea, 0x88, 0x31, 0x6a, 0x9c, 0x53, 0x38, 0x77, 0x42, 0x4e, 0xe1, 0x01, 0x69, 0xcc, 0xa5, + 0x53, 0xe7, 0x67, 0xe8, 0x8b, 0x0e, 0x5f, 0x86, 0x52, 0x35, 0x8a, 0x9c, 0xe6, 0x1e, 0x75, 0x31, + 0x77, 0xb5, 0xf2, 0x20, 0xe8, 0x08, 0xb8, 0xea, 0x2e, 0xa6, 0xe2, 0x2a, 0x5f, 0x74, 0x19, 0x1f, + 0xe2, 0x8b, 0x2e, 0xf3, 0x30, 0xbe, 0xd2, 0x79, 0xe8, 0xb1, 0x31, 0x29, 0x24, 0x69, 0x33, 0x3c, + 0x0e, 0xd2, 0x3f, 0x03, 0x82, 0x20, 0xf2, 0x96, 0xa2, 0x41, 0x14, 0x13, 0x55, 0x5e, 0x7c, 0x79, + 0x5a, 0x2a, 0x12, 0xea, 0x7d, 0xb3, 0x44, 0x27, 0xb7, 0x60, 0x5c, 0x5a, 0xcf, 0x90, 0xa8, 0xef, + 0x82, 0xd2, 0xe1, 0x25, 0x5a, 0xa6, 0x0e, 0x61, 0x3d, 0xbf, 0xa3, 0xc7, 0x8f, 0x4c, 0x28, 0x11, + 0xeb, 0x4a, 0xfc, 0x88, 0x16, 0xb1, 0xae, 0x44, 0x92, 0xc4, 0xc6, 0x50, 0xe9, 0x44, 0x63, 0x68, + 0x1b, 0x4a, 0x1b, 0x4e, 0x10, 0x79, 0xec, 0x38, 0xea, 0x44, 0x3c, 0xe1, 0x58, 0x62, 0xab, 0x2b, + 0x45, 0xb5, 0x97, 0x64, 0xe4, 0x76, 0x57, 0xc1, 0xd7, 0xa3, 0x6d, 0x13, 0x38, 0x59, 0xcb, 0xf0, + 0x30, 0x14, 0xe9, 0x31, 0xf1, 0x09, 0x50, 0xb9, 0xb8, 0x12, 0x3d, 0x52, 0xaf, 0xd2, 0xfb, 0x9d, + 0x13, 0x6f, 0xf2, 0x39, 0x40, 0x9b, 0x71, 0x1a, 0xd9, 0x60, 0xde, 0x15, 0xd4, 0x2b, 0x52, 0x86, + 0x63, 0x8c, 0x48, 0xbe, 0x01, 0x25, 0xf6, 0x3f, 0x66, 0x5f, 0xf2, 0x28, 0x4f, 0x28, 0x96, 0x78, + 0x9c, 0xe9, 0x1b, 0x9a, 0xa7, 0x68, 0xaa, 0xd3, 0x88, 0x6f, 0x60, 0x64, 0x9c, 0xbe, 0x78, 0xd1, + 0xb8, 0x99, 0x3f, 0x32, 0xe0, 0xdc, 0x00, 0x1e, 0x43, 0x7f, 0xcb, 0x69, 0x3e, 0x39, 0x90, 0x14, + 0xdb, 0x5c, 0x1c, 0x48, 0xea, 0xc2, 0x90, 0x47, 0x53, 0x76, 0x2a, 0xb0, 0xfc, 0xa7, 0x96, 0x0a, + 0xcc, 0x3c, 0x34, 0x60, 0x42, 0x99, 0xd9, 0x67, 0xf8, 0x89, 0x86, 0xcb, 0x22, 0x27, 0x66, 0x3e, + 0xc1, 0x4b, 0x7d, 0xc7, 0x99, 0xe7, 0xc0, 0xfc, 0x08, 0x60, 0xd5, 0x09, 0xa3, 0x6a, 0x33, 0xf2, + 0x1e, 0xd2, 0x21, 0xc4, 0x58, 0x92, 0xc2, 0xc0, 0xc1, 0x14, 0xb3, 0x8c, 0xac, 0x2f, 0x85, 0x41, + 0xcc, 0xd0, 0x5c, 0x83, 0xb1, 0xba, 0x1f, 0x44, 0xb5, 0x03, 0x7e, 0x36, 0x2d, 0xd1, 0xb0, 0xa9, + 0xde, 0xd0, 0x79, 0x68, 0xab, 0x37, 0x2d, 0x51, 0xc4, 0x14, 0xc4, 0xdb, 0x1e, 0x6d, 0xb9, 0xea, + 0x0b, 0xcd, 0x03, 0x06, 0xb0, 0x38, 0xfc, 0xda, 0xfb, 0x30, 0x2d, 0xd3, 0xf2, 0x6d, 0xae, 0xd6, + 0xb1, 0x07, 0xd3, 0x30, 0xb1, 0xbd, 0x6c, 0xad, 0xdc, 0xfe, 0x9a, 0x7d, 0x7b, 0x6b, 0x75, 0xb5, + 0x7c, 0x8a, 0x4c, 0x42, 0x51, 0x00, 0x16, 0xab, 0x65, 0x83, 0x94, 0xa0, 0xb0, 0xb2, 0x56, 0x5f, + 0x5e, 0xdc, 0xb2, 0x96, 0xcb, 0xb9, 0x6b, 0xaf, 0xc2, 0x54, 0xf2, 0xfe, 0x82, 0x31, 0x9a, 0xe3, + 0x90, 0xb7, 0xaa, 0x3b, 0xe5, 0x53, 0x04, 0x60, 0x6c, 0xe3, 0xde, 0x62, 0xfd, 0xc6, 0x8d, 0xb2, + 0x71, 0xed, 0x0b, 0x19, 0x1f, 0xcf, 0x66, 0x9c, 0xea, 0xb4, 0xeb, 0x04, 0x4e, 0x44, 0x79, 0x35, + 0xf7, 0x7b, 0xad, 0xc8, 0xeb, 0xb6, 0xe8, 0xe3, 0xb2, 0x71, 0xed, 0xad, 0xbe, 0x6f, 0x60, 0x93, + 0x33, 0x30, 0xb3, 0xb5, 0x56, 0xbd, 0x5f, 0x5b, 0xb9, 0xb3, 0xb5, 0xbe, 0x55, 0xb7, 0xef, 0x57, + 0x37, 0x17, 0xef, 0x96, 0x4f, 0xb1, 0x06, 0xdf, 0x5f, 0xaf, 0x6f, 0xda, 0xd6, 0xf2, 0xe2, 0xf2, + 0xda, 0x66, 0xd9, 0xb8, 0xf6, 0x2b, 0x06, 0x4c, 0xe9, 0xdf, 0x09, 0x24, 0x97, 0xe0, 0xe2, 0x56, + 0x7d, 0xd9, 0xb2, 0x37, 0xd7, 0xef, 0x2d, 0xaf, 0xd9, 0x5b, 0xf5, 0xea, 0x9d, 0x65, 0x7b, 0x6b, + 0xad, 0xbe, 0xb1, 0xbc, 0xb8, 0x72, 0x7b, 0x65, 0x79, 0xa9, 0x7c, 0x8a, 0x54, 0xe0, 0x05, 0x05, + 0xc3, 0x5a, 0x5e, 0x5c, 0xdf, 0x5e, 0xb6, 0xec, 0x8d, 0x6a, 0xbd, 0xbe, 0xb3, 0x6e, 0x2d, 0x95, + 0x0d, 0x72, 0x01, 0xce, 0x66, 0x20, 0xdc, 0xbf, 0x5d, 0x2d, 0xe7, 0xfa, 0xca, 0xd6, 0x96, 0x77, + 0xaa, 0xab, 0x76, 0x6d, 0x7d, 0xb3, 0x9c, 0xbf, 0xf6, 0x3e, 0xd3, 0x42, 0x92, 0x0f, 0x79, 0x90, + 0x02, 0x8c, 0xac, 0xad, 0xaf, 0x2d, 0x97, 0x4f, 0x91, 0x09, 0x18, 0xdf, 0x58, 0x5e, 0x5b, 0x5a, + 0x59, 0xbb, 0xc3, 0x87, 0xb5, 0xba, 0xb1, 0x61, 0xad, 0x6f, 0x2f, 0x2f, 0x95, 0x73, 0x6c, 0xec, + 0x96, 0x96, 0xd7, 0x58, 0xcb, 0xf2, 0xd7, 0x4c, 0x9e, 0xbc, 0x5a, 0xcb, 0xbd, 0xca, 0x46, 0x6b, + 0xf9, 0xab, 0x9b, 0xcb, 0x6b, 0xf5, 0x95, 0xf5, 0xb5, 0xf2, 0xa9, 0x6b, 0x17, 0x53, 0x38, 0x72, + 0x26, 0xea, 0xf5, 0xbb, 0xe5, 0x53, 0xd7, 0xbe, 0x01, 0x25, 0xf5, 0x10, 0x26, 0xe7, 0x60, 0x56, + 0xfd, 0xbd, 0x41, 0x3b, 0xae, 0xd7, 0xd9, 0x2d, 0x9f, 0x4a, 0x17, 0x58, 0xbd, 0x4e, 0x87, 0x15, + 0x60, 0xe7, 0xd5, 0x82, 0x4d, 0x1a, 0xb4, 0xbd, 0x0e, 0x3b, 0x5f, 0xcb, 0xb9, 0x5a, 0xf9, 0x07, + 0x7f, 0xf1, 0xd2, 0xa9, 0x1f, 0xfc, 0xf0, 0x25, 0xe3, 0x4f, 0x7f, 0xf8, 0x92, 0xf1, 0x3f, 0x7e, + 0xf8, 0x92, 0xd1, 0x18, 0xc3, 0x85, 0x7e, 0xf3, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xe5, 0x94, + 0xd2, 0xe2, 0x94, 0xb7, 0x00, 0x00, } func (m *KeepAlive) Marshal() (dAtA []byte, err error) { @@ -10491,6 +10543,16 @@ func (m *DatabaseSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.MySQL.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 { size, err := m.AD.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -10613,6 +10675,16 @@ func (m *DatabaseStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.MySQL.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a { size, err := m.AWS.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -10962,6 +11034,40 @@ func (m *DatabaseTLS) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *MySQLOptions) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MySQLOptions) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MySQLOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.ServerVersion) > 0 { + i -= len(m.ServerVersion) + copy(dAtA[i:], m.ServerVersion) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ServerVersion))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ServerV2) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -12287,12 +12393,12 @@ func (m *ProvisionTokenV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n48, err48 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err48 != nil { - return 0, err48 + n50, err50 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err50 != nil { + return 0, err50 } - i -= n48 - i = encodeVarintTypes(dAtA, i, uint64(n48)) + i -= n50 + i = encodeVarintTypes(dAtA, i, uint64(n50)) i-- dAtA[i] = 0x12 if len(m.Roles) > 0 { @@ -13683,12 +13789,12 @@ func (m *UserTokenSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n73, err73 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err73 != nil { - return 0, err73 + n75, err75 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err75 != nil { + return 0, err75 } - i -= n73 - i = encodeVarintTypes(dAtA, i, uint64(n73)) + i -= n75 + i = encodeVarintTypes(dAtA, i, uint64(n75)) i-- dAtA[i] = 0x22 if m.Usage != 0 { @@ -13805,12 +13911,12 @@ func (m *UserTokenSecretsSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n76, err76 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err76 != nil { - return 0, err76 + n78, err78 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err78 != nil { + return 0, err78 } - i -= n76 - i = encodeVarintTypes(dAtA, i, uint64(n76)) + i -= n78 + i = encodeVarintTypes(dAtA, i, uint64(n78)) i-- dAtA[i] = 0x1a if len(m.QRCode) > 0 { @@ -13974,20 +14080,20 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ThresholdIndexes) > 0 { - dAtA80 := make([]byte, len(m.ThresholdIndexes)*10) - var j79 int + dAtA82 := make([]byte, len(m.ThresholdIndexes)*10) + var j81 int for _, num := range m.ThresholdIndexes { for num >= 1<<7 { - dAtA80[j79] = uint8(uint64(num)&0x7f | 0x80) + dAtA82[j81] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j79++ + j81++ } - dAtA80[j79] = uint8(num) - j79++ + dAtA82[j81] = uint8(num) + j81++ } - i -= j79 - copy(dAtA[i:], dAtA80[:j79]) - i = encodeVarintTypes(dAtA, i, uint64(j79)) + i -= j81 + copy(dAtA[i:], dAtA82[:j81]) + i = encodeVarintTypes(dAtA, i, uint64(j81)) i-- dAtA[i] = 0x3a } @@ -14001,12 +14107,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x32 - n82, err82 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err82 != nil { - return 0, err82 + n84, err84 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err84 != nil { + return 0, err84 } - i -= n82 - i = encodeVarintTypes(dAtA, i, uint64(n82)) + i -= n84 + i = encodeVarintTypes(dAtA, i, uint64(n84)) i-- dAtA[i] = 0x2a if len(m.Reason) > 0 { @@ -14109,20 +14215,20 @@ func (m *ThresholdIndexSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Indexes) > 0 { - dAtA85 := make([]byte, len(m.Indexes)*10) - var j84 int + dAtA87 := make([]byte, len(m.Indexes)*10) + var j86 int for _, num := range m.Indexes { for num >= 1<<7 { - dAtA85[j84] = uint8(uint64(num)&0x7f | 0x80) + dAtA87[j86] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j84++ + j86++ } - dAtA85[j84] = uint8(num) - j84++ + dAtA87[j86] = uint8(num) + j86++ } - i -= j84 - copy(dAtA[i:], dAtA85[:j84]) - i = encodeVarintTypes(dAtA, i, uint64(j84)) + i -= j86 + copy(dAtA[i:], dAtA87[:j86]) + i = encodeVarintTypes(dAtA, i, uint64(j86)) i-- dAtA[i] = 0xa } @@ -14289,20 +14395,20 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n89, err89 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err89 != nil { - return 0, err89 + n91, err91 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err91 != nil { + return 0, err91 } - i -= n89 - i = encodeVarintTypes(dAtA, i, uint64(n89)) + i -= n91 + i = encodeVarintTypes(dAtA, i, uint64(n91)) i-- dAtA[i] = 0x2a - n90, err90 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err90 != nil { - return 0, err90 + n92, err92 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err92 != nil { + return 0, err92 } - i -= n90 - i = encodeVarintTypes(dAtA, i, uint64(n90)) + i -= n92 + i = encodeVarintTypes(dAtA, i, uint64(n92)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -16001,12 +16107,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n117, err117 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err117 != nil { - return 0, err117 + n119, err119 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err119 != nil { + return 0, err119 } - i -= n117 - i = encodeVarintTypes(dAtA, i, uint64(n117)) + i -= n119 + i = encodeVarintTypes(dAtA, i, uint64(n119)) i-- dAtA[i] = 0x3a { @@ -16148,28 +16254,28 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n120, err120 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecoveryAttemptLockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecoveryAttemptLockExpires):]) - if err120 != nil { - return 0, err120 + n122, err122 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.RecoveryAttemptLockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.RecoveryAttemptLockExpires):]) + if err122 != nil { + return 0, err122 } - i -= n120 - i = encodeVarintTypes(dAtA, i, uint64(n120)) + i -= n122 + i = encodeVarintTypes(dAtA, i, uint64(n122)) i-- dAtA[i] = 0x2a - n121, err121 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) - if err121 != nil { - return 0, err121 + n123, err123 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) + if err123 != nil { + return 0, err123 } - i -= n121 - i = encodeVarintTypes(dAtA, i, uint64(n121)) + i -= n123 + i = encodeVarintTypes(dAtA, i, uint64(n123)) i-- dAtA[i] = 0x22 - n122, err122 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) - if err122 != nil { - return 0, err122 + n124, err124 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err124 != nil { + return 0, err124 } - i -= n122 - i = encodeVarintTypes(dAtA, i, uint64(n122)) + i -= n124 + i = encodeVarintTypes(dAtA, i, uint64(n124)) i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { @@ -16226,12 +16332,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n124, err124 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err124 != nil { - return 0, err124 + n126, err126 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err126 != nil { + return 0, err126 } - i -= n124 - i = encodeVarintTypes(dAtA, i, uint64(n124)) + i -= n126 + i = encodeVarintTypes(dAtA, i, uint64(n126)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -16414,20 +16520,20 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n128, err128 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err128 != nil { - return 0, err128 + n130, err130 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) + if err130 != nil { + return 0, err130 } - i -= n128 - i = encodeVarintTypes(dAtA, i, uint64(n128)) + i -= n130 + i = encodeVarintTypes(dAtA, i, uint64(n130)) i-- dAtA[i] = 0x3a - n129, err129 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) - if err129 != nil { - return 0, err129 + n131, err131 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err131 != nil { + return 0, err131 } - i -= n129 - i = encodeVarintTypes(dAtA, i, uint64(n129)) + i -= n131 + i = encodeVarintTypes(dAtA, i, uint64(n131)) i-- dAtA[i] = 0x32 if len(m.Id) > 0 { @@ -17024,12 +17130,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n138, err138 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err138 != nil { - return 0, err138 + n140, err140 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err140 != nil { + return 0, err140 } - i -= n138 - i = encodeVarintTypes(dAtA, i, uint64(n138)) + i -= n140 + i = encodeVarintTypes(dAtA, i, uint64(n140)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -17121,12 +17227,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - n139, err139 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err139 != nil { - return 0, err139 + n141, err141 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err141 != nil { + return 0, err141 } - i -= n139 - i = encodeVarintTypes(dAtA, i, uint64(n139)) + i -= n141 + i = encodeVarintTypes(dAtA, i, uint64(n141)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -17175,12 +17281,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n140, err140 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err140 != nil { - return 0, err140 + n142, err142 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err142 != nil { + return 0, err142 } - i -= n140 - i = encodeVarintTypes(dAtA, i, uint64(n140)) + i -= n142 + i = encodeVarintTypes(dAtA, i, uint64(n142)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -17238,12 +17344,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n141, err141 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err141 != nil { - return 0, err141 + n143, err143 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err143 != nil { + return 0, err143 } - i -= n141 - i = encodeVarintTypes(dAtA, i, uint64(n141)) + i -= n143 + i = encodeVarintTypes(dAtA, i, uint64(n143)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -17462,28 +17568,28 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n146, err146 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err146 != nil { - return 0, err146 + n148, err148 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) + if err148 != nil { + return 0, err148 } - i -= n146 - i = encodeVarintTypes(dAtA, i, uint64(n146)) + i -= n148 + i = encodeVarintTypes(dAtA, i, uint64(n148)) i-- dAtA[i] = 0x42 - n147, err147 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err147 != nil { - return 0, err147 + n149, err149 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err149 != nil { + return 0, err149 } - i -= n147 - i = encodeVarintTypes(dAtA, i, uint64(n147)) + i -= n149 + i = encodeVarintTypes(dAtA, i, uint64(n149)) i-- dAtA[i] = 0x3a - n148, err148 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) - if err148 != nil { - return 0, err148 + n150, err150 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err150 != nil { + return 0, err150 } - i -= n148 - i = encodeVarintTypes(dAtA, i, uint64(n148)) + i -= n150 + i = encodeVarintTypes(dAtA, i, uint64(n150)) i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { @@ -17650,12 +17756,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n151, err151 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err151 != nil { - return 0, err151 + n153, err153 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err153 != nil { + return 0, err153 } - i -= n151 - i = encodeVarintTypes(dAtA, i, uint64(n151)) + i -= n153 + i = encodeVarintTypes(dAtA, i, uint64(n153)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -19427,12 +19533,12 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n170, err170 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err170 != nil { - return 0, err170 + n172, err172 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err172 != nil { + return 0, err172 } - i -= n170 - i = encodeVarintTypes(dAtA, i, uint64(n170)) + i -= n172 + i = encodeVarintTypes(dAtA, i, uint64(n172)) i-- dAtA[i] = 0x1a } @@ -20113,12 +20219,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n180, err180 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err180 != nil { - return 0, err180 + n182, err182 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err182 != nil { + return 0, err182 } - i -= n180 - i = encodeVarintTypes(dAtA, i, uint64(n180)) + i -= n182 + i = encodeVarintTypes(dAtA, i, uint64(n182)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -20348,20 +20454,20 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n183, err183 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err183 != nil { - return 0, err183 + n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err185 != nil { + return 0, err185 } - i -= n183 - i = encodeVarintTypes(dAtA, i, uint64(n183)) + i -= n185 + i = encodeVarintTypes(dAtA, i, uint64(n185)) i-- dAtA[i] = 0x2a - n184, err184 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err184 != nil { - return 0, err184 + n186, err186 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err186 != nil { + return 0, err186 } - i -= n184 - i = encodeVarintTypes(dAtA, i, uint64(n184)) + i -= n186 + i = encodeVarintTypes(dAtA, i, uint64(n186)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -20465,12 +20571,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n185, err185 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err185 != nil { - return 0, err185 + n187, err187 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err187 != nil { + return 0, err187 } - i -= n185 - i = encodeVarintTypes(dAtA, i, uint64(n185)) + i -= n187 + i = encodeVarintTypes(dAtA, i, uint64(n187)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -20876,6 +20982,8 @@ func (m *DatabaseSpecV3) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) l = m.AD.Size() n += 1 + l + sovTypes(uint64(l)) + l = m.MySQL.Size() + n += 1 + l + sovTypes(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -20894,6 +21002,8 @@ func (m *DatabaseStatusV3) Size() (n int) { } l = m.AWS.Size() n += 1 + l + sovTypes(uint64(l)) + l = m.MySQL.Size() + n += 1 + l + sovTypes(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -21054,6 +21164,22 @@ func (m *DatabaseTLS) Size() (n int) { return n } +func (m *MySQLOptions) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ServerVersion) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ServerV2) Size() (n int) { if m == nil { return 0 @@ -28056,6 +28182,39 @@ func (m *DatabaseSpecV3) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MySQL", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MySQL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -28172,6 +28331,39 @@ func (m *DatabaseStatusV3) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MySQL", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.MySQL.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -29136,6 +29328,89 @@ func (m *DatabaseTLS) Unmarshal(dAtA []byte) error { } return nil } +func (m *MySQLOptions) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MySQLOptions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MySQLOptions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerVersion", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ServerVersion = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ServerV2) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/types/types.proto b/api/types/types.proto index c4bf24a8cebe4..0cc7c8a75ea57 100644 --- a/api/types/types.proto +++ b/api/types/types.proto @@ -261,6 +261,9 @@ message DatabaseSpecV3 { DatabaseTLS TLS = 8 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "tls,omitempty" ]; // AD is the Active Directory configuration for the database. AD AD = 9 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "ad,omitempty" ]; + // MySQL is an additional section with MySQL database options. + MySQLOptions MySQL = 10 + [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "mysql,omitempty" ]; } // DatabaseStatusV3 contains runtime information about the database. @@ -269,6 +272,9 @@ message DatabaseStatusV3 { string CACert = 1 [ (gogoproto.jsontag) = "ca_cert,omitempty" ]; // AWS is the auto-discovered AWS cloud database metadata. AWS AWS = 2 [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "aws" ]; + // MySQL is an additional section with MySQL runtime database information. + MySQLOptions MySQL = 3 + [ (gogoproto.nullable) = false, (gogoproto.jsontag) = "mysql,omitempty" ]; } // AWS contains AWS metadata about the database. @@ -351,6 +357,13 @@ message DatabaseTLS { string ServerName = 3 [ (gogoproto.jsontag) = "server_name,omitempty" ]; } +// MySQLOptions are additional MySQL database options. +message MySQLOptions { + // ServerVersion is the server version reported by DB proxy if the runtime information is + // not available. + string ServerVersion = 1 [ (gogoproto.jsontag) = "server_version,omitempty" ]; +} + // ServerV2 represents a Node, App, Database, Proxy or Auth server in a Teleport cluster. message ServerV2 { option (gogoproto.goproto_stringer) = false; diff --git a/docs/pages/database-access/reference/configuration.mdx b/docs/pages/database-access/reference/configuration.mdx index 8107f6adae1f4..76705be84823e 100644 --- a/docs/pages/database-access/reference/configuration.mdx +++ b/docs/pages/database-access/reference/configuration.mdx @@ -111,6 +111,26 @@ spec: ... -----END CERTIFICATE----- + # MySQL only options. + mysql: + # The MySQL server version reported by the Teleport Proxy Service. + # Teleport uses this string when reporting the server version to a + # connecting client. + # + # When this option is not set, the Database Service will try to connect to + # a MySQL instance on startup and fetch the server version. Otherwise, + # it will use the provided value without connecting to a database. + # + # In both cases, the MySQL server version reported to a client will be + # updated on the first successful connection made by a user. + # Teleport uses that string instead of default '8.0.0-Teleport' version when reporting + # the server version to a connecting client. When this option is not set, the Database Service will try + # to connect to MySQL instance on startup and fetch the server version. + # Otherwise, it will use the provided value without connecting to a database. + # In both cases MySQL server version reported to a client will be updated on the first successful + # connection made by a user. + server_version: 8.0.28 + # Optional AWS configuration for RDS/Aurora/Redshift. Can be auto-detected from the endpoint. aws: # Region the database is deployed in. diff --git a/docs/pages/includes/database-access/database-config.yaml b/docs/pages/includes/database-access/database-config.yaml index b913fa2f0d22a..4de80a464317f 100644 --- a/docs/pages/includes/database-access/database-config.yaml +++ b/docs/pages/includes/database-access/database-config.yaml @@ -47,6 +47,12 @@ db_service: # Optional path to the CA used to validate the database certificate. ca_cert_file: /path/to/pem + # MySQL only options. + mysql: + # The default MySQL server version reported by Teleport Proxy. + # When this option is set the Database Agent doesn't try to check the MySQL server version. + server_version: 8.0.28 + # AWS specific configuration, only required for RDS/Aurora/Redshift. aws: # Region the database is deployed in. diff --git a/go.mod b/go.mod index f72a7c8457c36..f0798a38b1dcd 100644 --- a/go.mod +++ b/go.mod @@ -278,7 +278,7 @@ replace ( github.com/gogo/protobuf => github.com/gravitational/protobuf v1.3.2-0.20201123192827-2b9fcfaffcbf github.com/gravitational/teleport/api => ./api github.com/julienschmidt/httprouter => github.com/gravitational/httprouter v1.3.1-0.20220408074523-c876c5e705a5 - github.com/siddontang/go-mysql v1.1.0 => github.com/gravitational/go-mysql v1.1.1-teleport.2 + github.com/siddontang/go-mysql v1.1.0 => github.com/gravitational/go-mysql v1.1.1-teleport.3 github.com/sirupsen/logrus => github.com/gravitational/logrus v1.4.4-0.20210817004754-047e20245621 github.com/vulcand/predicate => github.com/gravitational/predicate v1.2.1 ) diff --git a/go.sum b/go.sum index 78d1be61ab71f..d7962834cd641 100644 --- a/go.sum +++ b/go.sum @@ -496,8 +496,8 @@ github.com/gravitational/form v0.0.0-20151109031454-c4048f792f70 h1:To76nCJtM3DI github.com/gravitational/form v0.0.0-20151109031454-c4048f792f70/go.mod h1:88hFR45MpUd23d2vNWE/dYtesU50jKsbz0I9kH7UaBY= github.com/gravitational/go-mssqldb v0.11.1-0.20220202000043-bec708e9bfd0 h1:DC+S+j/tBs/0MnQCC5j7GWWbMGcR3ca5v75ksAU1LJM= github.com/gravitational/go-mssqldb v0.11.1-0.20220202000043-bec708e9bfd0/go.mod h1:iiK0YP1ZeepvmBQk/QpLEhhTNJgfzrpArPY/aFvc9yU= -github.com/gravitational/go-mysql v1.1.1-teleport.2 h1:XZ36BZ7BgslA5ZCyCHjpc1wilFITThIH7cLcbLWKWzM= -github.com/gravitational/go-mysql v1.1.1-teleport.2/go.mod h1:re0JQZ1Cy5dVlIDGq0YksfDIla/GRZlxqOoC0XPSSGE= +github.com/gravitational/go-mysql v1.1.1-teleport.3 h1:7tf9m9EjaDiZy8OZFmPMEyxmEYDswI8CfyhZzh5lH6E= +github.com/gravitational/go-mysql v1.1.1-teleport.3/go.mod h1:re0JQZ1Cy5dVlIDGq0YksfDIla/GRZlxqOoC0XPSSGE= github.com/gravitational/go-oidc v0.0.6 h1:DCllahGYxDAvxWsq8UILgO+/i1EheQRxcNzS+D+wP5I= github.com/gravitational/go-oidc v0.0.6/go.mod h1:SevmOUNdOB0aD9BAIgjptZ6oHkKxMZZgA70nwPfgU/w= github.com/gravitational/httprouter v1.3.1-0.20220408074523-c876c5e705a5 h1:qg8FcGwRACSHortU1UxCSo9nF0t34rPWjk9Nef3j2Ic= diff --git a/integration/proxy_helpers_test.go b/integration/proxy_helpers_test.go index 8e3e55acdffe9..f2836ae7e2ae0 100644 --- a/integration/proxy_helpers_test.go +++ b/integration/proxy_helpers_test.go @@ -477,7 +477,7 @@ func mustStartALPNLocalProxy(t *testing.T, addr string, protocol alpncommon.Prot require.NoError(t, err) lp, err := alpnproxy.NewLocalProxy(alpnproxy.LocalProxyConfig{ RemoteProxyAddr: addr, - Protocol: protocol, + Protocols: []alpncommon.Protocol{protocol}, InsecureSkipVerify: true, Listener: listener, ParentContext: context.Background(), diff --git a/lib/config/configuration.go b/lib/config/configuration.go index db293cadfb87e..0e88f4fb3016b 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -25,6 +25,7 @@ import ( "crypto/x509" "io" "io/ioutil" + stdlog "log" "net" "net/url" "os" @@ -34,8 +35,6 @@ import ( "time" "unicode" - stdlog "log" - "golang.org/x/crypto/ssh" "github.com/go-ldap/ldap/v3" @@ -151,6 +150,9 @@ type CommandLineFlags struct { DatabaseADDomain string // DatabaseADSPN is the database Service Principal Name. DatabaseADSPN string + // DatabaseMySQLServerVersion is the MySQL server version reported to a client + // if the value cannot be obtained from the database. + DatabaseMySQLServerVersion string } // ReadConfigFile reads /etc/teleport.yaml (or whatever is passed via --config flag) @@ -1083,6 +1085,9 @@ func applyDatabasesConfig(fc *FileConfig, cfg *service.Config) error { URI: database.URI, StaticLabels: staticLabels, DynamicLabels: dynamicLabels, + MySQL: service.MySQLOptions{ + ServerVersion: database.MySQL.ServerVersion, + }, TLS: service.DatabaseTLS{ CACert: caBytes, ServerName: database.TLS.ServerName, @@ -1674,11 +1679,14 @@ func Configure(clf *CommandLineFlags, cfg *service.Config) error { } } db := service.Database{ - Name: clf.DatabaseName, - Description: clf.DatabaseDescription, - Protocol: clf.DatabaseProtocol, - URI: clf.DatabaseURI, - StaticLabels: staticLabels, + Name: clf.DatabaseName, + Description: clf.DatabaseDescription, + Protocol: clf.DatabaseProtocol, + URI: clf.DatabaseURI, + StaticLabels: staticLabels, + MySQL: service.MySQLOptions{ + ServerVersion: clf.DatabaseMySQLServerVersion, + }, DynamicLabels: dynamicLabels, TLS: service.DatabaseTLS{ CACert: caBytes, diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index 03060fd258f3e..2bee00a2f335f 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -1999,9 +1999,36 @@ func TestDatabaseCLIFlags(t *testing.T) { DynamicLabels: services.CommandLabels{}, }, }, + { + desc: "MySQL version", + inFlags: CommandLineFlags{ + DatabaseName: "mysql-foo", + DatabaseProtocol: defaults.ProtocolMySQL, + DatabaseURI: "localhost:3306", + DatabaseMySQLServerVersion: "8.0.28", + }, + outDatabase: service.Database{ + Name: "mysql-foo", + Protocol: defaults.ProtocolMySQL, + URI: "localhost:3306", + MySQL: service.MySQLOptions{ + ServerVersion: "8.0.28", + }, + TLS: service.DatabaseTLS{ + Mode: service.VerifyFull, + }, + StaticLabels: map[string]string{ + types.OriginLabel: types.OriginConfigFile}, + DynamicLabels: services.CommandLabels{}, + }, + }, } + for _, tt := range tests { + tt := tt t.Run(tt.desc, func(t *testing.T) { + t.Parallel() + config := service.MakeDefaultConfig() err := Configure(&tt.inFlags, config) if tt.outError != "" { diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index 94963e18c74fb..e3401c796a5d6 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -1151,6 +1151,8 @@ type Database struct { CACertFile string `yaml:"ca_cert_file,omitempty"` // TLS keeps an optional TLS configuration options. TLS DatabaseTLS `yaml:"tls"` + // MySQL are additional database options. + MySQL DatabaseMySQL `yaml:"mysql"` // StaticLabels is a map of database static labels. StaticLabels map[string]string `yaml:"static_labels,omitempty"` // DynamicLabels is a list of database dynamic labels. @@ -1187,6 +1189,12 @@ type DatabaseTLS struct { CACertFile string `yaml:"ca_cert_file,omitempty"` } +// DatabaseMySQL are an additional MySQL database options. +type DatabaseMySQL struct { + // ServerVersion is the MySQL version reported by DB proxy instead of default Teleport string. + ServerVersion string `yaml:"server_version,omitempty"` +} + // DatabaseAWS contains AWS specific settings for RDS/Aurora databases. type DatabaseAWS struct { // Region is a cloud region for RDS/Aurora database endpoint. diff --git a/lib/defaults/defaults.go b/lib/defaults/defaults.go index f54693a3d72ca..abe4c0438a3c9 100644 --- a/lib/defaults/defaults.go +++ b/lib/defaults/defaults.go @@ -814,7 +814,7 @@ func Transport() (*http.Transport, error) { // Set IdleConnTimeout on the transport. This defines the maximum amount of // time before idle connections are closed. Leaving this unset will lead to - // connections open forever and will cause memory leaks in a long running + // connections open forever and will cause memory leaks in a long-running // process. tr.IdleConnTimeout = HTTPIdleTimeout diff --git a/lib/service/cfg.go b/lib/service/cfg.go index c740ea8f89c86..b24cedab4a4d3 100644 --- a/lib/service/cfg.go +++ b/lib/service/cfg.go @@ -626,6 +626,8 @@ type Database struct { URI string // StaticLabels is a map of database static labels. StaticLabels map[string]string + // MySQL are additional MySQL database options. + MySQL MySQLOptions // DynamicLabels is a list of database dynamic labels. DynamicLabels services.CommandLabels // TLS keeps database connection TLS configuration. @@ -680,6 +682,12 @@ func (m TLSMode) ToProto() types.DatabaseTLSMode { } } +// MySQLOptions are additional MySQL options. +type MySQLOptions struct { + // ServerVersion is the version reported by Teleport DB Proxy on initial handshake. + ServerVersion string +} + // DatabaseTLS keeps TLS settings used when connecting to database. type DatabaseTLS struct { // Mode is the TLS connection mode. See TLSMode for more details. diff --git a/lib/service/cfg_test.go b/lib/service/cfg_test.go index 46f35afa30c79..9736ce46778cd 100644 --- a/lib/service/cfg_test.go +++ b/lib/service/cfg_test.go @@ -343,9 +343,24 @@ func TestCheckDatabase(t *testing.T) { }, outErr: true, }, + { + desc: "MySQL with server version", + inDatabase: Database{ + Name: "mysql-foo", + Protocol: defaults.ProtocolMySQL, + URI: "localhost:3306", + MySQL: MySQLOptions{ + ServerVersion: "8.0.31", + }, + }, + outErr: false, + }, } for _, test := range tests { + test := test t.Run(test.desc, func(t *testing.T) { + t.Parallel() + err := test.inDatabase.CheckAndSetDefaults() if test.outErr { require.Error(t, err) diff --git a/lib/service/db.go b/lib/service/db.go index 226cf7e70f3ad..451a2cd5242bc 100644 --- a/lib/service/db.go +++ b/lib/service/db.go @@ -99,6 +99,9 @@ func (process *TeleportProcess) initDatabaseService() (retErr error) { ServerName: db.TLS.ServerName, Mode: db.TLS.Mode.ToProto(), }, + MySQL: types.MySQLOptions{ + ServerVersion: db.MySQL.ServerVersion, + }, AWS: types.AWS{ Region: db.AWS.Region, Redshift: types.Redshift{ diff --git a/lib/service/service.go b/lib/service/service.go index 32264b22f6160..668bee94ac513 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -3127,6 +3127,10 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { } if alpnRouter != nil && !cfg.Proxy.DisableDatabaseProxy { + alpnRouter.Add(alpnproxy.HandlerDecs{ + MatchFunc: alpnproxy.MatchByALPNPrefix(string(alpncommon.ProtocolMySQL)), + HandlerWithConnInfo: alpnproxy.ExtractMySQLEngineVersion(dbProxyServer.MySQLProxy().HandleConnection), + }) alpnRouter.Add(alpnproxy.HandlerDecs{ MatchFunc: alpnproxy.MatchByProtocol(alpncommon.ProtocolMySQL), Handler: dbProxyServer.MySQLProxy().HandleConnection, diff --git a/lib/services/database.go b/lib/services/database.go index 0d53cbe48cf8d..7e9dc853b209c 100644 --- a/lib/services/database.go +++ b/lib/services/database.go @@ -535,6 +535,20 @@ func auroraMySQLVersion(cluster *rds.DBCluster) string { return version } +// GetMySQLEngineVersion returns MySQL engine version from provided metadata labels. +// An empty string is returned if label doesn't exist. +func GetMySQLEngineVersion(labels map[string]string) string { + if engine, ok := labels[labelEngine]; !ok || engine != RDSEngineMySQL { + return "" + } + + version, ok := labels[labelEngineVersion] + if !ok { + return "" + } + return version +} + const ( // labelAccountID is the label key containing AWS account ID. labelAccountID = "account-id" @@ -575,7 +589,7 @@ const ( // RDSEndpointTypePrimary is the endpoint that specifies the connection for the primary instance of the RDS cluster. RDSEndpointTypePrimary RDSEndpointType = "primary" // RDSEndpointTypeReader is the endpoint that load-balances connections across the Aurora Replicas that are - // available in a RDS cluster. + // available in an RDS cluster. RDSEndpointTypeReader RDSEndpointType = "reader" // RDSEndpointTypeCustom is the endpoint that specifies one of the custom endpoints associated with the RDS cluster. RDSEndpointTypeCustom RDSEndpointType = "custom" diff --git a/lib/services/database_test.go b/lib/services/database_test.go index 6c6e31a049865..bf0d2ebaaa711 100644 --- a/lib/services/database_test.go +++ b/lib/services/database_test.go @@ -491,3 +491,46 @@ func TestDatabaseFromRedshiftCluster(t *testing.T) { require.True(t, trace.IsBadParameter(err), "Expected trace.BadParameter, got %v", err) }) } + +func TestGetLabelEngineVersion(t *testing.T) { + t.Parallel() + + tests := []struct { + name string + labels map[string]string + want string + }{ + { + name: "mysql-8.0.0", + labels: map[string]string{ + labelEngine: RDSEngineMySQL, + labelEngineVersion: "8.0.0", + }, + want: "8.0.0", + }, + { + name: "mariadb returns nothing", + labels: map[string]string{ + labelEngine: RDSEngineMariaDB, + labelEngineVersion: "10.6.7", + }, + want: "", + }, + { + name: "missing labels", + labels: map[string]string{}, + want: "", + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + if got := GetMySQLEngineVersion(tt.labels); got != tt.want { + t.Errorf("GetMySQLEngineVersion() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/lib/srv/alpnproxy/common/protocols.go b/lib/srv/alpnproxy/common/protocols.go index 3009453a94b1c..9f2c579b28652 100644 --- a/lib/srv/alpnproxy/common/protocols.go +++ b/lib/srv/alpnproxy/common/protocols.go @@ -48,7 +48,7 @@ const ( // ProtocolReverseTunnel is TLS ALPN protocol value used to indicate Proxy reversetunnel protocol. ProtocolReverseTunnel Protocol = "teleport-reversetunnel" - // ProtocolHTTP is TLS ALPN protocol value used to indicate HTTP2 protocol + // ProtocolHTTP is TLS ALPN protocol value used to indicate HTTP 1.1 protocol ProtocolHTTP Protocol = "http/1.1" // ProtocolHTTP2 is TLS ALPN protocol value used to indicate HTTP2 protocol. @@ -63,6 +63,10 @@ const ( // ProtocolProxyGRPC is TLS ALPN protocol value used to indicate gRPC // traffic intended for the Teleport proxy. ProtocolProxyGRPC Protocol = "teleport-proxy-grpc" + + // ProtocolMySQLWithVerPrefix is TLS ALPN prefix used by tsh to carry + // MySQL server version. + ProtocolMySQLWithVerPrefix = Protocol(string(ProtocolMySQL) + "-") ) // SupportedProtocols is the list of supported ALPN protocols. diff --git a/lib/srv/alpnproxy/local_proxy.go b/lib/srv/alpnproxy/local_proxy.go index d781c307c5da5..674c746269f8f 100644 --- a/lib/srv/alpnproxy/local_proxy.go +++ b/lib/srv/alpnproxy/local_proxy.go @@ -51,7 +51,7 @@ type LocalProxyConfig struct { // RemoteProxyAddr is the downstream destination address of remote ALPN proxy service. RemoteProxyAddr string // Protocol set for the upstream TLS connection. - Protocol common.Protocol + Protocols []common.Protocol // InsecureSkipTLSVerify turns off verification for x509 upstream ALPN proxy service certificate. InsecureSkipVerify bool // Listener is listener running on local machine. @@ -60,7 +60,7 @@ type LocalProxyConfig struct { SNI string // ParentContext is a parent context, used to signal global closure> ParentContext context.Context - // SSHUser is a SSH user name. + // SSHUser is an SSH username. SSHUser string // SSHUserHost is user host requested by ssh subsystem. SSHUserHost string @@ -82,7 +82,7 @@ func (cfg *LocalProxyConfig) CheckAndSetDefaults() error { if cfg.RemoteProxyAddr == "" { return trace.BadParameter("missing remote proxy address") } - if cfg.Protocol == "" { + if len(cfg.Protocols) == 0 { return trace.BadParameter("missing protocol") } if cfg.ParentContext == nil { @@ -91,6 +91,16 @@ func (cfg *LocalProxyConfig) CheckAndSetDefaults() error { return nil } +func (cfg *LocalProxyConfig) GetProtocols() []string { + protos := make([]string, 0, len(cfg.Protocols)) + + for _, proto := range cfg.Protocols { + protos = append(protos, string(proto)) + } + + return protos +} + // NewLocalProxy creates a new instance of LocalProxy. func NewLocalProxy(cfg LocalProxyConfig) (*LocalProxy, error) { if err := cfg.CheckAndSetDefaults(); err != nil { @@ -113,7 +123,7 @@ func (l *LocalProxy) SSHProxy(localAgent *client.LocalKeyAgent) error { } clientTLSConfig := l.cfg.ClientTLSConfig.Clone() - clientTLSConfig.NextProtos = []string{string(l.cfg.Protocol)} + clientTLSConfig.NextProtos = l.cfg.GetProtocols() clientTLSConfig.InsecureSkipVerify = l.cfg.InsecureSkipVerify clientTLSConfig.ServerName = l.cfg.SNI @@ -256,8 +266,9 @@ func (l *LocalProxy) GetAddr() string { // traffic to the upstreamConn (TLS connection to remote host). func (l *LocalProxy) handleDownstreamConnection(ctx context.Context, downstreamConn net.Conn, serverName string) error { defer downstreamConn.Close() + upstreamConn, err := tls.Dial("tcp", l.cfg.RemoteProxyAddr, &tls.Config{ - NextProtos: []string{string(l.cfg.Protocol)}, + NextProtos: l.cfg.GetProtocols(), InsecureSkipVerify: l.cfg.InsecureSkipVerify, ServerName: serverName, Certificates: l.cfg.Certs, @@ -309,7 +320,7 @@ func (l *LocalProxy) Close() error { func (l *LocalProxy) StartAWSAccessProxy(ctx context.Context) error { tr := &http.Transport{ TLSClientConfig: &tls.Config{ - NextProtos: []string{string(l.cfg.Protocol)}, + NextProtos: l.cfg.GetProtocols(), InsecureSkipVerify: l.cfg.InsecureSkipVerify, ServerName: l.cfg.SNI, Certificates: l.cfg.Certs, diff --git a/lib/srv/alpnproxy/local_proxy_test.go b/lib/srv/alpnproxy/local_proxy_test.go index d58dca1645160..1ba22f3fc95b7 100644 --- a/lib/srv/alpnproxy/local_proxy_test.go +++ b/lib/srv/alpnproxy/local_proxy_test.go @@ -107,7 +107,7 @@ func createAWSAccessProxySuite(t *testing.T, cred *credentials.Credentials) *Loc lp, err := NewLocalProxy(LocalProxyConfig{ Listener: listener, RemoteProxyAddr: hs.Listener.Addr().String(), - Protocol: common.ProtocolHTTP, + Protocols: []common.Protocol{common.ProtocolHTTP}, ParentContext: context.Background(), InsecureSkipVerify: true, AWSCredentials: cred, diff --git a/lib/srv/alpnproxy/proxy.go b/lib/srv/alpnproxy/proxy.go index 2cc4636e426d2..6f482a784c428 100644 --- a/lib/srv/alpnproxy/proxy.go +++ b/lib/srv/alpnproxy/proxy.go @@ -20,6 +20,7 @@ import ( "bytes" "context" "crypto/tls" + "encoding/base64" "io" "net" "strings" @@ -32,7 +33,7 @@ import ( "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/srv/alpnproxy/common" - dbcommon "github.com/gravitational/teleport/lib/srv/db/dbutils" + "github.com/gravitational/teleport/lib/srv/db/dbutils" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/trace" @@ -101,6 +102,37 @@ func MatchByALPNPrefix(prefix string) MatchFunc { } } +// ExtractMySQLEngineVersion returns a pre-process function for MySQL connections that tries to extract MySQL server version +// from incoming connection. +func ExtractMySQLEngineVersion(fn func(ctx context.Context, conn net.Conn) error) HandlerFuncWithInfo { + return func(ctx context.Context, conn net.Conn, info ConnectionInfo) error { + const mysqlVerStart = len(common.ProtocolMySQLWithVerPrefix) + + for _, alpn := range info.ALPN { + if !strings.HasPrefix(alpn, string(common.ProtocolMySQLWithVerPrefix)) || len(alpn) == mysqlVerStart { + continue + } + // The version should never be longer than 255 characters including + // the prefix, but better to be safe. + var versionEnd = 255 + if len(alpn) < versionEnd { + versionEnd = len(alpn) + } + + mysqlVersionBase64 := alpn[mysqlVerStart:versionEnd] + mysqlVersionBytes, err := base64.StdEncoding.DecodeString(mysqlVersionBase64) + if err != nil { + continue + } + + ctx = context.WithValue(ctx, dbutils.ContextMySQLServerVersion, string(mysqlVersionBytes)) + break + } + + return fn(ctx, conn) + } +} + // CheckAndSetDefaults verifies the constraints for Router. func (r *Router) CheckAndSetDefaults() error { for _, v := range r.alpnHandlers { @@ -347,7 +379,7 @@ func (p *Proxy) handleConn(ctx context.Context, clientConn net.Conn) error { return trace.Wrap(err) } - isDatabaseConnection, err := dbcommon.IsDatabaseConnection(tlsConn.ConnectionState()) + isDatabaseConnection, err := dbutils.IsDatabaseConnection(tlsConn.ConnectionState()) if err != nil { p.log.WithError(err).Debug("Failed to check if connection is database connection.") } @@ -357,7 +389,7 @@ func (p *Proxy) handleConn(ctx context.Context, clientConn net.Conn) error { return trace.Wrap(handlerDesc.handle(ctx, tlsConn, connInfo)) } -// getTLSConfig returns HandlerDecs.TLSConfig if custom TLS configuration was set for the handler +// getTLSConfig returns HandlerDesc.TLSConfig if custom TLS configuration was set for the handler // otherwise the ProxyConfig.WebTLSConfig is used. func (p *Proxy) getTLSConfig(desc *HandlerDecs) *tls.Config { if desc.TLSConfig != nil { @@ -427,7 +459,7 @@ func (p *Proxy) databaseHandlerWithTLSTermination(ctx context.Context, conn net. return trace.Wrap(err) } - isDatabaseConnection, err := dbcommon.IsDatabaseConnection(tlsConn.ConnectionState()) + isDatabaseConnection, err := dbutils.IsDatabaseConnection(tlsConn.ConnectionState()) if err != nil { p.log.WithError(err).Debug("Failed to check if connection is database connection.") } diff --git a/lib/srv/alpnproxy/proxy_test.go b/lib/srv/alpnproxy/proxy_test.go index 1bf971d0fad09..733446dcd99fa 100644 --- a/lib/srv/alpnproxy/proxy_test.go +++ b/lib/srv/alpnproxy/proxy_test.go @@ -19,6 +19,7 @@ package alpnproxy import ( "context" "crypto/tls" + "encoding/base64" "fmt" "net" "net/http" @@ -26,6 +27,7 @@ import ( "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/lib/srv/alpnproxy/common" + "github.com/gravitational/teleport/lib/srv/db/dbutils" "github.com/gravitational/teleport/lib/tlsca" "github.com/stretchr/testify/require" @@ -262,7 +264,7 @@ func TestLocalProxyPostgresProtocol(t *testing.T) { require.NoError(t, err) localProxyConfig := LocalProxyConfig{ RemoteProxyAddr: suite.GetServerAddress(), - Protocol: common.ProtocolPostgres, + Protocols: []common.Protocol{common.ProtocolPostgres}, Listener: localProxyListener, SNI: "localhost", ParentContext: context.Background(), @@ -446,3 +448,60 @@ func TestProxyALPNProtocolsRouting(t *testing.T) { }) } } + +func TestMatchMySQLConn(t *testing.T) { + encodeProto := func(version string) string { + return string(common.ProtocolMySQLWithVerPrefix) + base64.StdEncoding.EncodeToString([]byte(version)) + } + + tests := []struct { + name string + protos []string + version interface{} + }{ + { + name: "success", + protos: []string{encodeProto("8.0.12")}, + version: "8.0.12", + }, + { + name: "protocol only", + protos: []string{string(common.ProtocolMySQL)}, + version: nil, + }, + { + name: "random string", + protos: []string{encodeProto("MariaDB some version")}, + version: "MariaDB some version", + }, + { + name: "missing -", + protos: []string{string(common.ProtocolMySQL) + base64.StdEncoding.EncodeToString([]byte("8.0.1"))}, + version: nil, + }, + { + name: "missing version returns nothing", + protos: []string{encodeProto("")}, + version: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + fn := ExtractMySQLEngineVersion(func(ctx context.Context, conn net.Conn) error { + version := ctx.Value(dbutils.ContextMySQLServerVersion) + require.Equal(t, tt.version, version) + + return nil + }) + + ctx := context.Background() + connectionInfo := ConnectionInfo{ + ALPN: tt.protos, + } + + err := fn(ctx, nil, connectionInfo) + require.NoError(t, err) + }) + } +} diff --git a/lib/srv/db/access_test.go b/lib/srv/db/access_test.go index 817dd03028774..d34bb94e05ec0 100644 --- a/lib/srv/db/access_test.go +++ b/lib/srv/db/access_test.go @@ -1599,7 +1599,7 @@ func (c *testContext) startLocalALPNProxy(ctx context.Context, proxyAddr, telepo proxy, err := alpnproxy.NewLocalProxy(alpnproxy.LocalProxyConfig{ RemoteProxyAddr: proxyAddr, - Protocol: proto, + Protocols: []alpncommon.Protocol{proto}, InsecureSkipVerify: true, Listener: listener, ParentContext: ctx, @@ -2069,13 +2069,13 @@ func withAzurePostgres(name, authToken string) withDatabaseOption { } } -func withSelfHostedMySQL(name string) withDatabaseOption { +func withSelfHostedMySQL(name string, opts ...mysql.TestServerOption) withDatabaseOption { return func(t *testing.T, ctx context.Context, testCtx *testContext) types.Database { mysqlServer, err := mysql.NewTestServer(common.TestServerConfig{ Name: name, AuthClient: testCtx.authClient, ClientAuth: tls.RequireAndVerifyClientCert, - }) + }, opts...) require.NoError(t, err) go mysqlServer.Serve() t.Cleanup(func() { diff --git a/lib/srv/db/dbutils/constants.go b/lib/srv/db/dbutils/constants.go new file mode 100644 index 0000000000000..f0815fccf28ad --- /dev/null +++ b/lib/srv/db/dbutils/constants.go @@ -0,0 +1,26 @@ +/* + + Copyright 2022 Gravitational, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +*/ + +package dbutils + +// ContextKey is a type used for Go's context value type. +type ContextKey string + +// ContextMySQLServerVersion is a key used in MySQL handler to pass MySQL server version. +const ContextMySQLServerVersion ContextKey = "ctx-mysql-server-version" diff --git a/lib/srv/db/mysql/engine.go b/lib/srv/db/mysql/engine.go index 9f980ccb57012..97ae060cd9cb6 100644 --- a/lib/srv/db/mysql/engine.go +++ b/lib/srv/db/mysql/engine.go @@ -31,7 +31,6 @@ import ( "github.com/gravitational/teleport/lib/srv/db/common/role" "github.com/gravitational/teleport/lib/srv/db/mysql/protocol" "github.com/gravitational/teleport/lib/utils" - "github.com/siddontang/go-mysql/client" "github.com/siddontang/go-mysql/packet" "github.com/siddontang/go-mysql/server" @@ -102,6 +101,14 @@ func (e *Engine) HandleConnection(ctx context.Context, sessionCtx *common.Sessio e.Log.WithError(err).Error("Failed to close connection to MySQL server.") } }() + + // Internally, updateServerVersion() updates databases only when database version + // is not set, or it has changed since previous call. + if err := e.updateServerVersion(sessionCtx, serverConn); err != nil { + // Log but do not fail connection if the version update fails. + e.Log.WithError(err).Warnf("Failed to update the MySQL server version.") + } + // Send back OK packet to indicate auth/connect success. At this point // the original client should consider the connection phase completed. err = e.proxyConn.WriteOK(nil) @@ -126,6 +133,19 @@ func (e *Engine) HandleConnection(ctx context.Context, sessionCtx *common.Sessio return nil } +// updateServerVersion updates the server runtime version if the version reported by the database is different from +// the version in status configuration. +func (e *Engine) updateServerVersion(sessionCtx *common.Session, serverConn *client.Conn) error { + serverVersion := serverConn.GetServerVersion() + statusVersion := sessionCtx.Database.GetMySQLServerVersion() + // Update only when needed + if serverVersion != "" && serverVersion != statusVersion { + sessionCtx.Database.SetMySQLServerVersion(serverVersion) + } + + return nil +} + // checkAccess does authorization check for MySQL connection about to be established. func (e *Engine) checkAccess(ctx context.Context, sessionCtx *common.Session) error { ap, err := e.Auth.GetAuthPreference(ctx) @@ -173,7 +193,7 @@ func (e *Engine) connect(ctx context.Context, sessionCtx *common.Session) (*clie return nil, trace.Wrap(err) } case sessionCtx.Database.IsCloudSQL(): - // For Cloud SQL MySQL there is no IAM auth so we use one-time passwords + // For Cloud SQL MySQL there is no IAM auth, so we use one-time passwords // by resetting the database user password for each connection. Thus, // acquire a lock to make sure all connection attempts to the same // database and user are serialized. @@ -216,7 +236,7 @@ func (e *Engine) connect(ctx context.Context, sessionCtx *common.Session) (*clie return nil, trace.Wrap(err) } connectOpt = func(*client.Conn) {} - dialer = e.newGCPTLSDialer(tlsConfig) + dialer = newGCPTLSDialer(tlsConfig) } case sessionCtx.Database.IsAzure(): password, err = e.Auth.GetAzureAccessToken(ctx, sessionCtx) @@ -318,7 +338,7 @@ func (e *Engine) receiveFromClient(clientConn, serverConn net.Conn, clientErrCh e.Audit.EmitEvent(e.Context, makeStatementPrepareEvent(sessionCtx, pkt)) case *protocol.StatementExecutePacket: // TODO(greedy52) Number of parameters is required to parse - // paremeters out of the packet. Parameter definitions are required + // parameters out of the packet. Parameter definitions are required // to properly format the parameters for including in the audit // log. Both number of parameters and parameter definitions can be // obtained from the response of COM_STMT_PREPARE. @@ -403,10 +423,10 @@ func (e *Engine) makeAcquireSemaphoreConfig(sessionCtx *common.Session) services // newGCPTLSDialer returns a TLS dialer configured to connect to the Cloud Proxy // port rather than the default MySQL port. -func (e *Engine) newGCPTLSDialer(tlsConfig *tls.Config) client.Dialer { +func newGCPTLSDialer(tlsConfig *tls.Config) client.Dialer { return func(ctx context.Context, network, address string) (net.Conn, error) { // Workaround issue generating ephemeral certificates for secure connections - // by creating a TLS connection to the Cloud Proxy port overridding the + // by creating a TLS connection to the Cloud Proxy port overriding the // MySQL client's connection. MySQL on the default port does not trust // the ephemeral certificate's CA but Cloud Proxy does. host, port, err := net.SplitHostPort(address) @@ -418,6 +438,21 @@ func (e *Engine) newGCPTLSDialer(tlsConfig *tls.Config) client.Dialer { } } +// FetchMySQLVersion connects to MySQL database and tries to read the handshake packet and return the version. +// In case of error the message returned by the database is propagated in returned error. +func FetchMySQLVersion(ctx context.Context, database types.Database) (string, error) { + var dialer client.Dialer + + if database.IsCloudSQL() { + dialer = newGCPTLSDialer(&tls.Config{}) + } else { + var nd net.Dialer + dialer = nd.DialContext + } + + return protocol.FetchMySQLVersionInternal(ctx, dialer, database.GetURI()) +} + const ( // gcpSQLListenPort is the port used by Cloud SQL MySQL instances. gcpSQLListenPort = "3306" diff --git a/lib/srv/db/mysql/engine_test.go b/lib/srv/db/mysql/engine_test.go new file mode 100644 index 0000000000000..de6f43e98ee6a --- /dev/null +++ b/lib/srv/db/mysql/engine_test.go @@ -0,0 +1,187 @@ +/* + + Copyright 2022 Gravitational, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +*/ + +package mysql + +import ( + "bytes" + "context" + "io" + "net" + "testing" + "time" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +func TestFetchMySQLVersion(t *testing.T) { + t.Parallel() + + // Handshake message, version: 5.5.5-10.8.2-MariaDB-1:10.8.2+maria~focal + versionMsg := []byte{0x6d, 0x00, 0x00, 0x00, 0x0a, 0x35, 0x2e, 0x35, 0x2e, 0x35, 0x2d, 0x31, 0x30, 0x2e, 0x38, + 0x2e, 0x32, 0x2d, 0x4d, 0x61, 0x72, 0x69, 0x61, 0x44, 0x42, 0x2d, 0x31, 0x3a, 0x31, 0x30, 0x2e, 0x38, 0x2e, + 0x32, 0x2b, 0x6d, 0x61, 0x72, 0x69, 0x61, 0x7e, 0x66, 0x6f, 0x63, 0x61, 0x6c, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x36, 0x47, 0x42, 0x54, 0x62, 0x6e, 0x22, 0x5a, 0x00, 0xfe, 0xff, 0x2d, 0x02, 0x00, 0xff, 0xc1, 0x15, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x23, 0x3c, 0x46, 0x2a, 0x3e, 0x38, 0x40, 0x76, 0x56, + 0x28, 0x63, 0x3d, 0x00, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x00} + + // ERR package with message: Host '70.144.128.44' is blocked because of many connection errors; unblock with 'mariadb-admin flush-hosts' + errMsg := []byte{0x6e, 0x00, 0x00, 0x01, 0xff, 0x69, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x20, 0x27, 0x37, 0x30, 0x2e, + 0x31, 0x34, 0x34, 0x2e, 0x31, 0x32, 0x38, 0x2e, 0x34, 0x34, 0x27, 0x20, 0x69, 0x73, 0x20, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6d, 0x61, + 0x6e, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x3b, 0x20, 0x75, 0x6e, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x27, + 0x6d, 0x61, 0x72, 0x69, 0x61, 0x64, 0x62, 0x2d, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x20, 0x66, 0x6c, 0x75, 0x73, + 0x68, 0x2d, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x27} + + tests := []struct { + name string + message []byte + assertFn func(t *testing.T, version string, err error) + }{ + { + name: "versions success", + message: versionMsg, + assertFn: func(t *testing.T, version string, err error) { + require.NoError(t, err) + require.Equal(t, "5.5.5-10.8.2-MariaDB-1:10.8.2+maria~focal", version) + }, + }, + { + name: "returned error", + message: errMsg, + assertFn: func(t *testing.T, version string, err error) { + require.Error(t, err) + require.Equal(t, "Host '70.144.128.44' is blocked because of many connection errors; unblock with 'mariadb-admin flush-hosts'", err.Error()) + }, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + fakeMySQL, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, fakeMySQL.Close()) + }) + + errs := make(chan error) + + go func() { + conn, err := fakeMySQL.Accept() + if err != nil { + errs <- err + return + } + + n, err := io.Copy(conn, bytes.NewReader(tt.message)) + if err != nil { + // Close connection to avoid leak, ignore error as we already have different error at that point. + _ = conn.Close() + errs <- err + return + } + + if int(n) != len(tt.message) { + _ = conn.Close() + errs <- trace.Errorf("failed to copy whole message: expected %d, copied %d", len(tt.message), n) + return + } + + if err := conn.Close(); err != nil { + errs <- err + return + } + + errs <- nil + }() + + srvAddr := fakeMySQL.Addr().String() + ctx := context.Background() + + version, err := FetchMySQLVersion(ctx, &types.DatabaseV3{ + Spec: types.DatabaseSpecV3{ + URI: srvAddr, + }, + }) + + tt.assertFn(t, version, err) + require.NoError(t, <-errs) + }) + } +} + +func TestFetchMySQLVersionDoesntBlock(t *testing.T) { + t.Parallel() + + fakeMySQL, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, fakeMySQL.Close()) + }) + + serverWait := make(chan struct{}) + t.Cleanup(func() { + close(serverWait) + }) + + go func() { + conn, err := fakeMySQL.Accept() + if err == nil { + t.Cleanup(func() { + conn.Close() + }) + } + + // accept connection and just wait for timeout. + <-serverWait + }() + + srvAddr := fakeMySQL.Addr().String() + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + t.Cleanup(cancel) + + fetchVerErrs := make(chan error) + + go func() { + // Passed context should be canceled and i/o timeout should be returned. + _, err := FetchMySQLVersion(ctx, &types.DatabaseV3{ + Spec: types.DatabaseSpecV3{ + URI: srvAddr, + }, + }) + + fetchVerErrs <- err + }() + + select { + case err := <-fetchVerErrs: + require.Error(t, err) + require.Contains(t, err.Error(), "i/o timeout") + case <-time.After(5 * time.Second): + require.FailNow(t, "connection should return before") + } +} diff --git a/lib/srv/db/mysql/protocol/version.go b/lib/srv/db/mysql/protocol/version.go new file mode 100644 index 0000000000000..f32dcd11f4384 --- /dev/null +++ b/lib/srv/db/mysql/protocol/version.go @@ -0,0 +1,134 @@ +/* + + Copyright 2022 Gravitational, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +*/ + +package protocol + +import ( + "bufio" + "bytes" + "context" + "errors" + "io" + "net" + + "github.com/gravitational/trace" + "github.com/siddontang/go-mysql/client" + "github.com/siddontang/go-mysql/mysql" + mysqlpacket "github.com/siddontang/go-mysql/packet" +) + +// FetchMySQLVersionInternal connects to a MySQL instance with provided dialer and tries to read the server +// version from initial handshake message. Error is returned in case of connection failure or when MySQL +// returns ERR package. +func FetchMySQLVersionInternal(ctx context.Context, dialer client.Dialer, databaseURI string) (string, error) { + conn, err := dialer(ctx, "tcp", databaseURI) + if err != nil { + return "", trace.ConnectionProblem(err, "failed to connect to MySQL") + } + defer conn.Close() + + // Set connection deadline if passed context has it. + if deadline, ok := ctx.Deadline(); ok { + if err := conn.SetReadDeadline(deadline); err != nil { + return "", trace.Wrap(err) + } + } + + connBuf := newBufferedConn(ctx, conn) + pkgType, err := connBuf.Peek(5) + if err != nil { + return "", trace.Wrap(err) + } + + // ref: https://dev.mysql.com/doc/internals/en/mysql-packet.html + // https://dev.mysql.com/doc/internals/en/packet-ERR_Packet.html + if pkgType[4] == mysql.ERR_HEADER { + return readHandshakeError(connBuf) + } + + return readHandshakeServerVersion(connBuf) +} + +// readHandshakeServerVersion reads MySQL initial handshake message and returns the server version. +func readHandshakeServerVersion(connBuf net.Conn) (string, error) { + dbConn := mysqlpacket.NewTLSConn(connBuf) + + handshake, err := dbConn.ReadPacket() + if err != nil { + return "", trace.ConnectionProblem(err, "failed to read the MySQL handshake") + } + + if len(handshake) == 0 { + return "", trace.Errorf("server returned empty handshake packet") + } + + // ref: https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake + versionLength := bytes.IndexByte(handshake[1:], 0x00) + if versionLength == -1 { + return "", trace.Errorf("failed to read the MySQL server version") + } + + return string(handshake[1 : 1+versionLength]), nil +} + +// readHandshakeError reads and returns an error message from +func readHandshakeError(connBuf io.Reader) (string, error) { + handshakePacket, err := ParsePacket(connBuf) + if err != nil { + return "", err + } + errPackage, ok := handshakePacket.(*Error) + if !ok { + return "", trace.BadParameter("expected MySQL error package, got %T", handshakePacket) + } + return "", trace.ConnectionProblem(errors.New("failed to fetch MySQL version"), errPackage.Error()) +} + +// connReader is a net.Conn wrapper with additional Peek() method. +type connReader struct { + ctx context.Context + reader *bufio.Reader + net.Conn +} + +// newBufferedConn is a connReader constructor. +func newBufferedConn(ctx context.Context, conn net.Conn) connReader { + return connReader{ + ctx: ctx, + reader: bufio.NewReader(conn), + Conn: conn, + } +} + +// Peek reads n bytes without advancing the reader. +// It's basically a wrapper around (bufio.Reader).Peek() +func (b connReader) Peek(n int) ([]byte, error) { + if err := b.ctx.Err(); err != nil { + return nil, err + } + return b.reader.Peek(n) +} + +// Read returns data from underlying buffer. +func (b connReader) Read(p []byte) (int, error) { + if err := b.ctx.Err(); err != nil { + return 0, err + } + return b.reader.Read(p) +} diff --git a/lib/srv/db/mysql/proxy.go b/lib/srv/db/mysql/proxy.go index 15f16c264a4d5..65da87449723c 100644 --- a/lib/srv/db/mysql/proxy.go +++ b/lib/srv/db/mysql/proxy.go @@ -27,6 +27,7 @@ import ( "github.com/gravitational/teleport/lib/limiter" "github.com/gravitational/teleport/lib/multiplexer" "github.com/gravitational/teleport/lib/srv/db/common" + "github.com/gravitational/teleport/lib/srv/db/dbutils" "github.com/gravitational/teleport/lib/srv/db/mysql/protocol" "github.com/gravitational/teleport/lib/utils" @@ -61,7 +62,9 @@ func (p *Proxy) HandleConnection(ctx context.Context, clientConn net.Conn) (err // by peeking into the first few bytes. This is needed to be able to detect // proxy protocol which otherwise would interfere with MySQL protocol. conn := multiplexer.NewConn(clientConn) - server := p.makeServer(conn) + mysqlServerVersion := getServerVersionFromCtx(ctx) + + mysqlServer := p.makeServer(conn, mysqlServerVersion) // If any error happens, make sure to send it back to the client, so it // has a chance to close the connection from its side. defer func() { @@ -70,14 +73,14 @@ func (p *Proxy) HandleConnection(ctx context.Context, clientConn net.Conn) (err err = trace.BadParameter("failed to handle MySQL client connection") } if err != nil { - if writeErr := server.WriteError(err); writeErr != nil { + if writeErr := mysqlServer.WriteError(err); writeErr != nil { p.Log.WithError(writeErr).Debugf("Failed to send error %q to MySQL client.", err) } } }() // Perform first part of the handshake, up to the point where client sends // us certificate and connection upgrades to TLS. - tlsConn, err := p.performHandshake(conn, server) + tlsConn, err := p.performHandshake(conn, mysqlServer) if err != nil { return trace.Wrap(err) } @@ -94,8 +97,8 @@ func (p *Proxy) HandleConnection(ctx context.Context, clientConn net.Conn) (err defer releaseConn() proxyCtx, err := p.Service.Authorize(ctx, tlsConn, common.ConnectParams{ - User: server.GetUser(), - Database: server.GetDatabase(), + User: mysqlServer.GetUser(), + Database: mysqlServer.GetDatabase(), ClientIP: clientIP, }) if err != nil { @@ -110,7 +113,7 @@ func (p *Proxy) HandleConnection(ctx context.Context, clientConn net.Conn) (err // Before replying OK to the client which would make the client consider // auth completed, wait for OK packet from db service indicating auth // success. - err = p.waitForOK(server, serviceConn) + err = p.waitForOK(mysqlServer, serviceConn) if err != nil { return trace.Wrap(err) } @@ -123,6 +126,21 @@ func (p *Proxy) HandleConnection(ctx context.Context, clientConn net.Conn) (err return nil } +// getServerVersionFromCtx tries to extract MySQL server version from the passed context. +// The default version is returned if context doesn't have it. +func getServerVersionFromCtx(ctx context.Context) string { + // Set default server version. + mysqlServerVersion := serverVersion + + if mysqlVerCtx := ctx.Value(dbutils.ContextMySQLServerVersion); mysqlVerCtx != nil { + version, ok := mysqlVerCtx.(string) + if ok { + mysqlServerVersion = version + } + } + return mysqlServerVersion +} + // credentialProvider is used by MySQL server created below. // // It's a no-op because authentication is done via mTLS. @@ -133,7 +151,7 @@ func (p *credentialProvider) GetCredential(_ string) (string, bool, error) { ret // makeServer creates a MySQL server from the accepted client connection that // provides access to various parts of the handshake. -func (p *Proxy) makeServer(clientConn net.Conn) *server.Conn { +func (p *Proxy) makeServer(clientConn net.Conn, serverVersion string) *server.Conn { return server.MakeConn( clientConn, server.NewServer( @@ -170,7 +188,7 @@ func (p *Proxy) performHandshake(conn *multiplexer.Conn, server *server.Conn) (* return nil, trace.Wrap(err) } // First part of the handshake completed and the connection has been - // upgraded to TLS so now we can look at the client certificate and + // upgraded to TLS, so now we can look at the client certificate and // see which database service to route the connection to. switch c := server.Conn.Conn.(type) { case *tls.Conn: diff --git a/lib/srv/db/mysql/test.go b/lib/srv/db/mysql/test.go index 520bdc8dc31de..f80e5cf8be04a 100644 --- a/lib/srv/db/mysql/test.go +++ b/lib/srv/db/mysql/test.go @@ -57,12 +57,13 @@ func MakeTestClient(config common.TestClientConfig) (*client.Conn, error) { // TestServer is a test MySQL server used in functional database // access tests. type TestServer struct { - cfg common.TestServerConfig - listener net.Listener - port string - tlsConfig *tls.Config - log logrus.FieldLogger - handler *testHandler + cfg common.TestServerConfig + listener net.Listener + port string + tlsConfig *tls.Config + log logrus.FieldLogger + handler *testHandler + serverVersion string // serverConnsMtx is a mutex that guards serverConns. serverConnsMtx sync.Mutex @@ -70,8 +71,18 @@ type TestServer struct { serverConns []*server.Conn } +// TestServerOption allows to set test server options. +type TestServerOption func(*TestServer) + +// WithServerVersion sets the test MySQL server version. +func WithServerVersion(serverVersion string) TestServerOption { + return func(ts *TestServer) { + ts.serverVersion = serverVersion + } +} + // NewTestServer returns a new instance of a test MySQL server. -func NewTestServer(config common.TestServerConfig) (*TestServer, error) { +func NewTestServer(config common.TestServerConfig, opts ...TestServerOption) (*TestServer, error) { address := "localhost:0" if config.Address != "" { address = config.Address @@ -107,6 +118,9 @@ func NewTestServer(config common.TestServerConfig) (*TestServer, error) { if !config.ListenTLS { server.tlsConfig = tlsConfig } + for _, o := range opts { + o(server) + } return server, nil } @@ -148,7 +162,7 @@ func (s *TestServer) handleConnection(conn net.Conn) error { serverConn, err := server.NewCustomizedConn( conn, server.NewServer( - serverVersion, + s.serverVersion, mysql.DEFAULT_COLLATION_ID, mysql.AUTH_NATIVE_PASSWORD, nil, diff --git a/lib/srv/db/proxy_test.go b/lib/srv/db/proxy_test.go index 277fe77009850..178ca1a87eda5 100644 --- a/lib/srv/db/proxy_test.go +++ b/lib/srv/db/proxy_test.go @@ -25,6 +25,7 @@ import ( "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/multiplexer" + "github.com/gravitational/teleport/lib/srv/db/mysql" "github.com/stretchr/testify/require" ) @@ -219,3 +220,15 @@ func setConfigClientIdleTimoutAndDisconnectExpiredCert(ctx context.Context, t *t err = auth.SetClusterNetworkingConfig(ctx, netConfig) require.NoError(t, err) } + +func TestExtractMySQLVersion(t *testing.T) { + ctx := context.Background() + testCtx := setupTestContext(ctx, t, withSelfHostedMySQL("mysql", mysql.WithServerVersion("8.0.25"))) + go testCtx.startHandlingConnections() + + testCtx.createUserAndRole(ctx, t, "alice", "admin", []string{"root"}, []string{types.Wildcard}) + + version, err := mysql.FetchMySQLVersion(ctx, testCtx.server.proxiedDatabases["mysql"]) + require.NoError(t, err) + require.Equal(t, "8.0.25", version) +} diff --git a/lib/srv/db/proxyserver.go b/lib/srv/db/proxyserver.go index bb6946d89d399..21866f4587be4 100644 --- a/lib/srv/db/proxyserver.go +++ b/lib/srv/db/proxyserver.go @@ -43,6 +43,7 @@ import ( "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/srv/db/common" + "github.com/gravitational/teleport/lib/srv/db/dbutils" "github.com/gravitational/teleport/lib/srv/db/mysql" "github.com/gravitational/teleport/lib/srv/db/postgres" "github.com/gravitational/teleport/lib/srv/db/sqlserver" @@ -325,7 +326,10 @@ func (s *ProxyServer) handleConnection(conn net.Conn) error { case defaults.ProtocolPostgres: return s.PostgresProxyNoTLS().HandleConnection(s.closeCtx, tlsConn) case defaults.ProtocolMySQL: - return s.MySQLProxyNoTLS().HandleConnection(s.closeCtx, tlsConn) + version := getMySQLVersionFromServer(proxyCtx.Servers) + // Set the version in the context to match a behaviour in other handlers. + ctx := context.WithValue(s.closeCtx, dbutils.ContextMySQLServerVersion, version) + return s.MySQLProxyNoTLS().HandleConnection(ctx, tlsConn) case defaults.ProtocolSQLServer: return s.SQLServerProxy().HandleConnection(s.closeCtx, proxyCtx, tlsConn) } @@ -341,6 +345,15 @@ func (s *ProxyServer) handleConnection(conn net.Conn) error { return nil } +// getMySQLVersionFromServer returns the MySQL version returned by an instance on last connection or +// the MySQL.ServerVersion set in configuration if the first one is not available. +// Function picks a random server each time if more than one are available. +func getMySQLVersionFromServer(servers []types.DatabaseServer) string { + count := len(servers) + db := servers[rand.Intn(count)].GetDatabase() + return db.GetMySQLServerVersion() +} + // PostgresProxy returns a new instance of the Postgres protocol aware proxy. func (s *ProxyServer) PostgresProxy() *postgres.Proxy { return &postgres.Proxy{ diff --git a/lib/srv/db/proxyserver_test.go b/lib/srv/db/proxyserver_test.go index df6500b49641a..c889ac8761fb4 100644 --- a/lib/srv/db/proxyserver_test.go +++ b/lib/srv/db/proxyserver_test.go @@ -23,6 +23,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/limiter" + "github.com/gravitational/teleport/lib/srv/db/mysql" "github.com/stretchr/testify/require" ) @@ -240,3 +241,25 @@ func TestProxyRateLimiting(t *testing.T) { }) } } + +func TestProxyMySQLVersion(t *testing.T) { + ctx := context.Background() + testCtx := setupTestContext(ctx, t, + withSelfHostedMySQL("mysql", mysql.WithServerVersion("8.0.12")), + ) + + go testCtx.startHandlingConnections() + + // Create user/role with the requested permissions. + testCtx.createUserAndRole(ctx, t, "bob", "admin", []string{types.Wildcard}, []string{types.Wildcard}) + + t.Run("correct version when using proxy", func(t *testing.T) { + mysqlClient, proxy, err := testCtx.mysqlClientLocalProxy(ctx, "bob", "mysql", "bob") + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, mysqlClient.Close()) + require.NoError(t, proxy.Close()) + }) + require.Equal(t, "8.0.12", mysqlClient.GetServerVersion()) + }) +} diff --git a/lib/srv/db/server.go b/lib/srv/db/server.go index 1e165c3db2837..7afe20abb1fca 100644 --- a/lib/srv/db/server.go +++ b/lib/srv/db/server.go @@ -35,6 +35,7 @@ import ( "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/srv/db/cloud" "github.com/gravitational/teleport/lib/srv/db/common" + "github.com/gravitational/teleport/lib/srv/db/mysql" "github.com/gravitational/teleport/lib/utils" // Import to register MongoDB engine. @@ -313,6 +314,10 @@ func (s *Server) startDatabase(ctx context.Context, database types.Database) err if err := s.startDynamicLabels(ctx, database); err != nil { return trace.Wrap(err) } + if err := fetchMySQLVersion(ctx, database); err != nil { + // Log, but do not fail. We will fetch the version later. + s.log.Warnf("Failed to fetch the MySQL version for %s: %v", database.GetName(), err) + } // Heartbeat will periodically report the presence of this proxied database // to the auth server. if err := s.startHeartbeat(ctx, database); err != nil { @@ -824,3 +829,32 @@ func (s *Server) authorize(ctx context.Context) (*common.Session, error) { LockTargets: authContext.LockTargets(), }, nil } + +// fetchMySQLVersion tries to connect to MySQL instance, read initial handshake package and extract +// the server version. +func fetchMySQLVersion(ctx context.Context, database types.Database) error { + if database.GetProtocol() != defaults.ProtocolMySQL || database.GetMySQLServerVersion() != "" { + return nil + } + + // Try to extract the engine version for AWS metadata labels. + if database.IsRDS() { + version := services.GetMySQLEngineVersion(database.GetMetadata().Labels) + if version != "" { + database.SetMySQLServerVersion(version) + return nil + } + } + + ctx, cancel := context.WithTimeout(ctx, 7*time.Second) + defer cancel() + + version, err := mysql.FetchMySQLVersion(ctx, database) + if err != nil { + return trace.Wrap(err) + } + + database.SetMySQLServerVersion(version) + + return nil +} diff --git a/lib/teleterm/gateway/gateway.go b/lib/teleterm/gateway/gateway.go index 74c485647447e..d24066ec619e1 100644 --- a/lib/teleterm/gateway/gateway.go +++ b/lib/teleterm/gateway/gateway.go @@ -79,7 +79,7 @@ func New(cfg Config) (*Gateway, error) { localProxy, err := alpn.NewLocalProxy(alpn.LocalProxyConfig{ InsecureSkipVerify: cfg.Insecure, RemoteProxyAddr: cfg.WebProxyAddr, - Protocol: protocol, + Protocols: []alpncommon.Protocol{protocol}, Listener: listener, ParentContext: closeContext, SNI: address.Host(), diff --git a/tool/tsh/aws.go b/tool/tsh/aws.go index ec0a791bac6f3..75a092b55f8ae 100644 --- a/tool/tsh/aws.go +++ b/tool/tsh/aws.go @@ -155,7 +155,7 @@ func createLocalAWSCLIProxy(cf *CLIConf, tc *client.TeleportClient, cred *creden lp, err := alpnproxy.NewLocalProxy(alpnproxy.LocalProxyConfig{ Listener: listener, RemoteProxyAddr: tc.WebProxyAddr, - Protocol: alpncommon.ProtocolHTTP, + Protocols: []alpncommon.Protocol{alpncommon.ProtocolHTTP}, InsecureSkipVerify: cf.InsecureSkipVerify, ParentContext: cf.Context, SNI: address.Host(), diff --git a/tool/tsh/db.go b/tool/tsh/db.go index 323f7eed3607e..666c4da5e47f4 100644 --- a/tool/tsh/db.go +++ b/tool/tsh/db.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "encoding/base64" "fmt" "io/ioutil" "net" @@ -32,9 +33,9 @@ import ( "github.com/gravitational/teleport/lib/client/db/dbcmd" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/srv/alpnproxy/common" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" - "github.com/gravitational/trace" ) @@ -367,7 +368,8 @@ func serializeDatabaseConfig(configInfo *dbConfigInfo, format string) (string, e // maybeStartLocalProxy starts local TLS ALPN proxy if needed depending on the // connection scenario and returns a list of options to use in the connect // command. -func maybeStartLocalProxy(cf *CLIConf, tc *client.TeleportClient, profile *client.ProfileStatus, db *tlsca.RouteToDatabase, cluster string) ([]dbcmd.ConnectCommandFunc, error) { +func maybeStartLocalProxy(cf *CLIConf, tc *client.TeleportClient, profile *client.ProfileStatus, db *tlsca.RouteToDatabase, + database types.Database, cluster string) ([]dbcmd.ConnectCommandFunc, error) { // Local proxy is started if TLS routing is enabled, or if this is a SQL // Server connection which always requires a local proxy. if !tc.TLSRoutingEnabled && db.Protocol != defaults.ProtocolSQLServer { @@ -379,18 +381,15 @@ func maybeStartLocalProxy(cf *CLIConf, tc *client.TeleportClient, profile *clien return nil, trace.Wrap(err) } - opts := localProxyOpts{ - proxyAddr: tc.WebProxyAddr, - listener: listener, - protocol: db.Protocol, - insecure: cf.InsecureSkipVerify, - } - - // For SQL Server connections, local proxy must be configured with the - // client certificate that will be used to route connections. - if db.Protocol == defaults.ProtocolSQLServer { - opts.certFile = profile.DatabaseCertPathForCluster("", db.ServiceName) - opts.keyFile = profile.KeyPath() + opts, err := prepareLocalProxyOptions(&localProxyConfig{ + cliConf: cf, + teleportClient: tc, + profile: profile, + routeToDatabase: db, + database: database, + listener: listener}) + if err != nil { + return nil, trace.Wrap(err) } lp, err := mkLocalProxy(cf.Context, opts) @@ -419,6 +418,78 @@ func maybeStartLocalProxy(cf *CLIConf, tc *client.TeleportClient, profile *clien }, nil } +// localProxyConfig is an argument pack used in prepareLocalProxyOptions(). +type localProxyConfig struct { + cliConf *CLIConf + teleportClient *client.TeleportClient + profile *client.ProfileStatus + routeToDatabase *tlsca.RouteToDatabase + database types.Database + listener net.Listener +} + +// prepareLocalProxyOptions created localProxyOpts needed to create local proxy from localProxyConfig. +func prepareLocalProxyOptions(arg *localProxyConfig) (localProxyOpts, error) { + // If user requested no client auth, open an authenticated tunnel using + // client cert/key of the database. + certFile := arg.cliConf.LocalProxyCertFile + if certFile == "" && arg.cliConf.LocalProxyTunnel { + certFile = arg.profile.DatabaseCertPathForCluster(arg.cliConf.SiteName, arg.routeToDatabase.ServiceName) + } + keyFile := arg.cliConf.LocalProxyKeyFile + if keyFile == "" && arg.cliConf.LocalProxyTunnel { + keyFile = arg.profile.KeyPath() + } + + opts := localProxyOpts{ + proxyAddr: arg.teleportClient.WebProxyAddr, + listener: arg.listener, + protocols: []common.Protocol{common.Protocol(arg.routeToDatabase.Protocol)}, + insecure: arg.cliConf.InsecureSkipVerify, + certFile: certFile, + keyFile: keyFile, + } + + // For SQL Server connections, local proxy must be configured with the + // client certificate that will be used to route connections. + if arg.routeToDatabase.Protocol == defaults.ProtocolSQLServer { + opts.certFile = arg.profile.DatabaseCertPathForCluster("", arg.routeToDatabase.ServiceName) + opts.keyFile = arg.profile.KeyPath() + } + + // To set correct MySQL server version DB proxy needs additional protocol. + if !arg.cliConf.LocalProxyTunnel && arg.routeToDatabase.Protocol == defaults.ProtocolMySQL { + if arg.database == nil { + var err error + arg.database, err = getDatabase(arg.cliConf, arg.teleportClient, arg.routeToDatabase.ServiceName) + if err != nil { + return localProxyOpts{}, trace.Wrap(err) + } + } + + mysqlServerVersionProto := mySQLVersionToProto(arg.database) + if mysqlServerVersionProto != "" { + opts.protocols = append(opts.protocols, common.Protocol(mysqlServerVersionProto)) + } + } + + return opts, nil +} + +// mySQLVersionToProto returns base64 encoded MySQL server version with MySQL protocol prefix. +// If version is not set in the past database an empty string is returned. +func mySQLVersionToProto(database types.Database) string { + version := database.GetMySQLServerVersion() + if version == "" { + return "" + } + + versionBase64 := base64.StdEncoding.EncodeToString([]byte(version)) + + // Include MySQL server version + return string(common.ProtocolMySQLWithVerPrefix) + versionBase64 +} + // onDatabaseConnect implements "tsh db connect" command. func onDatabaseConnect(cf *CLIConf) error { tc, err := makeClient(cf, false) @@ -429,17 +500,17 @@ func onDatabaseConnect(cf *CLIConf) error { if err != nil { return trace.Wrap(err) } - database, err := getDatabaseInfo(cf, tc, cf.DatabaseService) + routeToDatabase, database, err := getDatabaseInfo(cf, tc, cf.DatabaseService) if err != nil { return trace.Wrap(err) } // Check is cert is still valid or DB connection requires MFA. If yes trigger db login logic. - relogin, err := needRelogin(cf, tc, database, profile) + relogin, err := needRelogin(cf, tc, routeToDatabase, profile) if err != nil { return trace.Wrap(err) } if relogin { - if err := databaseLogin(cf, tc, *database, true); err != nil { + if err := databaseLogin(cf, tc, *routeToDatabase, true); err != nil { return trace.Wrap(err) } } @@ -453,12 +524,12 @@ func onDatabaseConnect(cf *CLIConf) error { return trace.Wrap(err) } - opts, err := maybeStartLocalProxy(cf, tc, profile, database, rootClusterName) + opts, err := maybeStartLocalProxy(cf, tc, profile, routeToDatabase, database, rootClusterName) if err != nil { return trace.Wrap(err) } opts = append(opts, dbcmd.WithLogger(log)) - cmd, err := dbcmd.NewCmdBuilder(tc, profile, database, rootClusterName, opts...).GetConnectCommand() + cmd, err := dbcmd.NewCmdBuilder(tc, profile, routeToDatabase, rootClusterName, opts...).GetConnectCommand() if err != nil { return trace.Wrap(err) } @@ -475,24 +546,24 @@ func onDatabaseConnect(cf *CLIConf) error { // getDatabaseInfo fetches information about the database from tsh profile is DB is active in profile. Otherwise, // the ListDatabases endpoint is called. -func getDatabaseInfo(cf *CLIConf, tc *client.TeleportClient, dbName string) (*tlsca.RouteToDatabase, error) { +func getDatabaseInfo(cf *CLIConf, tc *client.TeleportClient, dbName string) (*tlsca.RouteToDatabase, types.Database, error) { database, err := pickActiveDatabase(cf) if err == nil { - return database, nil + return database, nil, nil } if !trace.IsNotFound(err) { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } db, err := getDatabase(cf, tc, dbName) if err != nil { - return nil, trace.Wrap(err) + return nil, nil, trace.Wrap(err) } return &tlsca.RouteToDatabase{ ServiceName: db.GetName(), Protocol: db.GetProtocol(), Username: cf.DatabaseUser, Database: cf.DatabaseName, - }, nil + }, db, nil } func getDatabase(cf *CLIConf, tc *client.TeleportClient, dbName string) (types.Database, error) { @@ -556,7 +627,7 @@ func needRelogin(cf *CLIConf, tc *client.TeleportClient, database *tlsca.RouteTo return mfaRequired, nil } -// dbInfoHasChanged checks if cf.DatabaseUser or cf.DatabaseName info has changed in the user database certificate. +// dbInfoHasChanged checks if cliConf.DatabaseUser or cliConf.DatabaseName info has changed in the user database certificate. func dbInfoHasChanged(cf *CLIConf, certPath string) (bool, error) { if cf.DatabaseUser == "" && cf.DatabaseName == "" { return false, nil diff --git a/tool/tsh/proxy.go b/tool/tsh/proxy.go index c2b066dc70d04..d33fa6940eb52 100644 --- a/tool/tsh/proxy.go +++ b/tool/tsh/proxy.go @@ -62,7 +62,7 @@ func onProxyCommandSSH(cf *CLIConf) error { return trace.Wrap(sshProxyWithTLSRouting(cf, tc, targetHost, targetPort)) } - return trace.Wrap(sshProxy(cf, tc, targetHost, targetPort)) + return trace.Wrap(sshProxy(tc, targetHost, targetPort)) } // cleanTargetHost cleans the targetHost and remote site and proxy suffixes. @@ -91,7 +91,7 @@ func sshProxyWithTLSRouting(cf *CLIConf, tc *libclient.TeleportClient, targetHos lp, err := alpnproxy.NewLocalProxy(alpnproxy.LocalProxyConfig{ RemoteProxyAddr: tc.WebProxyAddr, - Protocol: alpncommon.ProtocolProxySSH, + Protocols: []alpncommon.Protocol{alpncommon.ProtocolProxySSH}, InsecureSkipVerify: cf.InsecureSkipVerify, ParentContext: cf.Context, SNI: address.Host(), @@ -111,7 +111,7 @@ func sshProxyWithTLSRouting(cf *CLIConf, tc *libclient.TeleportClient, targetHos return nil } -func sshProxy(cf *CLIConf, tc *libclient.TeleportClient, targetHost, targetPort string) error { +func sshProxy(tc *libclient.TeleportClient, targetHost, targetPort string) error { sshPath, err := getSSHPath() if err != nil { return trace.Wrap(err) @@ -145,7 +145,7 @@ func onProxyCommandDB(cf *CLIConf) error { if err != nil { return trace.Wrap(err) } - database, err := pickActiveDatabase(cf) + routeToDatabase, err := pickActiveDatabase(cf) if err != nil { return trace.Wrap(err) } @@ -172,25 +172,17 @@ func onProxyCommandDB(cf *CLIConf) error { } }() - // If user requested no client auth, open an authenticated tunnel using - // client cert/key of the database. - certFile := cf.LocalProxyCertFile - if certFile == "" && cf.LocalProxyTunnel { - certFile = profile.DatabaseCertPathForCluster(cf.SiteName, database.ServiceName) - } - keyFile := cf.LocalProxyKeyFile - if keyFile == "" && cf.LocalProxyTunnel { - keyFile = profile.KeyPath() + proxyOpts, err := prepareLocalProxyOptions(&localProxyConfig{ + cliConf: cf, + teleportClient: client, + profile: profile, + routeToDatabase: routeToDatabase, + listener: listener}) + if err != nil { + return trace.Wrap(err) } - lp, err := mkLocalProxy(cf.Context, localProxyOpts{ - proxyAddr: client.WebProxyAddr, - protocol: database.Protocol, - listener: listener, - insecure: cf.InsecureSkipVerify, - certFile: certFile, - keyFile: keyFile, - }) + lp, err := mkLocalProxy(cf.Context, proxyOpts) if err != nil { return trace.Wrap(err) } @@ -204,7 +196,7 @@ func onProxyCommandDB(cf *CLIConf) error { if err != nil { return trace.Wrap(err) } - cmd, err := dbcmd.NewCmdBuilder(client, profile, database, cf.SiteName, + cmd, err := dbcmd.NewCmdBuilder(client, profile, routeToDatabase, cf.SiteName, dbcmd.WithLocalProxy("localhost", addr.Port(0), ""), dbcmd.WithNoTLS(), dbcmd.WithLogger(log), @@ -213,8 +205,8 @@ func onProxyCommandDB(cf *CLIConf) error { return trace.Wrap(err) } err = dbProxyAuthTpl.Execute(os.Stdout, map[string]string{ - "database": database.ServiceName, - "type": dbProtocolToText(database.Protocol), + "database": routeToDatabase.ServiceName, + "type": dbProtocolToText(routeToDatabase.Protocol), "cluster": profile.Cluster, "command": cmd.String(), "address": listener.Addr().String(), @@ -224,10 +216,10 @@ func onProxyCommandDB(cf *CLIConf) error { } } else { err = dbProxyTpl.Execute(os.Stdout, map[string]string{ - "database": database.ServiceName, + "database": routeToDatabase.ServiceName, "address": listener.Addr().String(), "ca": profile.CACertPathForCluster(rootCluster), - "cert": profile.DatabaseCertPathForCluster(cf.SiteName, database.ServiceName), + "cert": profile.DatabaseCertPathForCluster(cf.SiteName, routeToDatabase.ServiceName), "key": profile.KeyPath(), }) if err != nil { @@ -245,14 +237,22 @@ func onProxyCommandDB(cf *CLIConf) error { type localProxyOpts struct { proxyAddr string listener net.Listener - protocol string + protocols []alpncommon.Protocol insecure bool certFile string keyFile string } +// protocol returns the first protocol or string if configuration doesn't contain any protocols. +func (l *localProxyOpts) protocol() string { + if len(l.protocols) == 0 { + return "" + } + return string(l.protocols[0]) +} + func mkLocalProxy(ctx context.Context, opts localProxyOpts) (*alpnproxy.LocalProxy, error) { - alpnProtocol, err := alpncommon.ToALPNProtocol(opts.protocol) + alpnProtocol, err := alpncommon.ToALPNProtocol(opts.protocol()) if err != nil { return nil, trace.Wrap(err) } @@ -267,7 +267,7 @@ func mkLocalProxy(ctx context.Context, opts localProxyOpts) (*alpnproxy.LocalPro lp, err := alpnproxy.NewLocalProxy(alpnproxy.LocalProxyConfig{ InsecureSkipVerify: opts.insecure, RemoteProxyAddr: opts.proxyAddr, - Protocol: alpnProtocol, + Protocols: append([]alpncommon.Protocol{alpnProtocol}, opts.protocols...), Listener: opts.listener, ParentContext: ctx, SNI: address.Host(), diff --git a/tool/tsh/tsh_test.go b/tool/tsh/tsh_test.go index 3988ff63cd437..8f96d0502f016 100644 --- a/tool/tsh/tsh_test.go +++ b/tool/tsh/tsh_test.go @@ -1664,6 +1664,7 @@ func TestSerializeDatabases(t *testing.T) { "iam_auth": false } }, + "mysql": {}, "gcp": {}, "azure": {}, "tls": { @@ -1676,6 +1677,7 @@ func TestSerializeDatabases(t *testing.T) { } }, "status": { + "mysql": {}, "aws": { "redshift": {}, "rds": {