diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 1bf3fd8601ac1..dd8d9f0216293 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -9235,6 +9235,17 @@ message AccessGraphAWSSyncCloudTrailLogs { string SQSQueue = 2 [(gogoproto.jsontag) = "sqs_queue,omitempty"]; } +// AccessGraphAWSSyncEKSAuditLogs defines the settings for ingesting Kubernetes apiserver +// audit logs from EKS clusters. +message AccessGraphAWSSyncEKSAuditLogs { + // The tags of EKS clusters for which apiserver audit logs should be fetched. + wrappers.LabelValues Tags = 1 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "tags,omitempty", + (gogoproto.customtype) = "Labels" + ]; +} + // AccessGraphAWSSync is a configuration for AWS Access Graph service poll service. message AccessGraphAWSSync { // Regions are AWS regions to import resources from. @@ -9245,6 +9256,7 @@ message AccessGraphAWSSync { string Integration = 4 [(gogoproto.jsontag) = "integration,omitempty"]; // Configuration settings for collecting AWS CloudTrail logs via an SQS queue. AccessGraphAWSSyncCloudTrailLogs cloud_trail_logs = 5 [(gogoproto.jsontag) = "cloud_trail_logs,omitempty"]; + AccessGraphAWSSyncEKSAuditLogs eks_audit_logs = 6 [(gogoproto.jsontag) = "eks_audit_logs,omitempty"]; } // AccessGraphAzureSync is a configuration for Azure Access Graph service poll service. diff --git a/api/types/discoveryconfig/derived.gen.go b/api/types/discoveryconfig/derived.gen.go index 2a15012e8423a..e97969ce705a5 100644 --- a/api/types/discoveryconfig/derived.gen.go +++ b/api/types/discoveryconfig/derived.gen.go @@ -298,7 +298,8 @@ func deriveTeleportEqual_19(this, that *types.AccessGraphAWSSync) bool { deriveTeleportEqual_14(this.Regions, that.Regions) && deriveTeleportEqual_15(this.AssumeRole, that.AssumeRole) && this.Integration == that.Integration && - deriveTeleportEqual_23(this.CloudTrailLogs, that.CloudTrailLogs) + deriveTeleportEqual_23(this.CloudTrailLogs, that.CloudTrailLogs) && + deriveTeleportEqual_24(this.EksAuditLogs, that.EksAuditLogs) } // deriveTeleportEqual_20 returns whether this and that are equal. @@ -332,3 +333,10 @@ func deriveTeleportEqual_23(this, that *types.AccessGraphAWSSyncCloudTrailLogs) this.Region == that.Region && this.SQSQueue == that.SQSQueue } + +// deriveTeleportEqual_24 returns whether this and that are equal. +func deriveTeleportEqual_24(this, that *types.AccessGraphAWSSyncEKSAuditLogs) bool { + return (this == nil && that == nil) || + this != nil && that != nil && + deriveTeleportEqual_16(this.Tags, that.Tags) +} diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 085d1c03bee72..96db9e654822d 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -24642,6 +24642,49 @@ func (m *AccessGraphAWSSyncCloudTrailLogs) XXX_DiscardUnknown() { var xxx_messageInfo_AccessGraphAWSSyncCloudTrailLogs proto.InternalMessageInfo +// AccessGraphAWSSyncEKSAuditLogs defines the settings for ingesting Kubernetes apiserver +// audit logs from EKS clusters. +type AccessGraphAWSSyncEKSAuditLogs struct { + // The tags of EKS clusters for which apiserver audit logs should be fetched. + Tags Labels `protobuf:"bytes,1,opt,name=Tags,proto3,customtype=Labels" json:"tags,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AccessGraphAWSSyncEKSAuditLogs) Reset() { *m = AccessGraphAWSSyncEKSAuditLogs{} } +func (m *AccessGraphAWSSyncEKSAuditLogs) String() string { return proto.CompactTextString(m) } +func (*AccessGraphAWSSyncEKSAuditLogs) ProtoMessage() {} +func (*AccessGraphAWSSyncEKSAuditLogs) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{416} +} +func (m *AccessGraphAWSSyncEKSAuditLogs) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AccessGraphAWSSyncEKSAuditLogs) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AccessGraphAWSSyncEKSAuditLogs.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 *AccessGraphAWSSyncEKSAuditLogs) XXX_Merge(src proto.Message) { + xxx_messageInfo_AccessGraphAWSSyncEKSAuditLogs.Merge(m, src) +} +func (m *AccessGraphAWSSyncEKSAuditLogs) XXX_Size() int { + return m.Size() +} +func (m *AccessGraphAWSSyncEKSAuditLogs) XXX_DiscardUnknown() { + xxx_messageInfo_AccessGraphAWSSyncEKSAuditLogs.DiscardUnknown(m) +} + +var xxx_messageInfo_AccessGraphAWSSyncEKSAuditLogs proto.InternalMessageInfo + // AccessGraphAWSSync is a configuration for AWS Access Graph service poll service. type AccessGraphAWSSync struct { // Regions are AWS regions to import resources from. @@ -24652,6 +24695,7 @@ type AccessGraphAWSSync struct { Integration string `protobuf:"bytes,4,opt,name=Integration,proto3" json:"integration,omitempty"` // Configuration settings for collecting AWS CloudTrail logs via an SQS queue. CloudTrailLogs *AccessGraphAWSSyncCloudTrailLogs `protobuf:"bytes,5,opt,name=cloud_trail_logs,json=cloudTrailLogs,proto3" json:"cloud_trail_logs,omitempty"` + EksAuditLogs *AccessGraphAWSSyncEKSAuditLogs `protobuf:"bytes,6,opt,name=eks_audit_logs,json=eksAuditLogs,proto3" json:"eks_audit_logs,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -24661,7 +24705,7 @@ func (m *AccessGraphAWSSync) Reset() { *m = AccessGraphAWSSync{} } func (m *AccessGraphAWSSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSync) ProtoMessage() {} func (*AccessGraphAWSSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{416} + return fileDescriptor_9198ee693835762e, []int{417} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -24705,7 +24749,7 @@ func (m *AccessGraphAzureSync) Reset() { *m = AccessGraphAzureSync{} } func (m *AccessGraphAzureSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAzureSync) ProtoMessage() {} func (*AccessGraphAzureSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{417} + return fileDescriptor_9198ee693835762e, []int{418} } func (m *AccessGraphAzureSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -24761,7 +24805,7 @@ func (m *TargetHealth) Reset() { *m = TargetHealth{} } func (m *TargetHealth) String() string { return proto.CompactTextString(m) } func (*TargetHealth) ProtoMessage() {} func (*TargetHealth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{418} + return fileDescriptor_9198ee693835762e, []int{419} } func (m *TargetHealth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -25283,6 +25327,7 @@ func init() { proto.RegisterType((*OktaOptions)(nil), "types.OktaOptions") proto.RegisterType((*AccessGraphSync)(nil), "types.AccessGraphSync") proto.RegisterType((*AccessGraphAWSSyncCloudTrailLogs)(nil), "types.AccessGraphAWSSyncCloudTrailLogs") + proto.RegisterType((*AccessGraphAWSSyncEKSAuditLogs)(nil), "types.AccessGraphAWSSyncEKSAuditLogs") proto.RegisterType((*AccessGraphAWSSync)(nil), "types.AccessGraphAWSSync") proto.RegisterType((*AccessGraphAzureSync)(nil), "types.AccessGraphAzureSync") proto.RegisterType((*TargetHealth)(nil), "types.TargetHealth") @@ -25291,7 +25336,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 35191 bytes of a gzipped FileDescriptorProto + // 35241 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x90, 0x1c, 0x49, 0x7a, 0x18, 0x86, 0x5f, 0x77, 0xcf, 0xa3, 0xe7, 0x9b, 0x57, 0x4f, 0xe2, 0x35, 0x98, 0x5d, 0xec, 0x60, 0x6b, 0x77, 0xb1, 0xd8, 0x17, 0xb0, 0x0b, 0xdc, 0xe2, 0x6e, 0x1f, 0x77, 0x7b, 0x3d, 0x0f, @@ -26792,706 +26837,709 @@ var fileDescriptor_9198ee693835762e = []byte{ 0xbb, 0xe3, 0x5d, 0xae, 0xf6, 0x31, 0xdc, 0xec, 0x63, 0xa4, 0x7d, 0xa8, 0xd8, 0x5d, 0x24, 0x7b, 0xa6, 0xd9, 0xdd, 0x5b, 0xd5, 0x9c, 0xf1, 0x68, 0x25, 0x97, 0x6b, 0xba, 0x8b, 0x64, 0xed, 0x34, 0xbb, 0x7a, 0xab, 0xaa, 0x77, 0x96, 0x82, 0x81, 0xc8, 0x16, 0x22, 0x03, 0x0e, 0x1c, 0x39, 0xb6, - 0x83, 0x08, 0x42, 0x82, 0x04, 0x88, 0x60, 0xf8, 0xc3, 0x40, 0x82, 0xe4, 0xc7, 0x88, 0x80, 0x24, - 0x46, 0x7e, 0x04, 0x08, 0xca, 0x13, 0xf0, 0x87, 0x6c, 0x2c, 0x6c, 0x09, 0x01, 0x02, 0xc1, 0x7f, - 0x46, 0xf2, 0xa1, 0x40, 0x41, 0x70, 0xcf, 0xbd, 0xb7, 0xea, 0x56, 0x75, 0x75, 0x93, 0xa3, 0x59, - 0x39, 0xb1, 0xa3, 0x1f, 0x82, 0x7d, 0xee, 0x39, 0xa7, 0xee, 0xfb, 0x9e, 0x7b, 0xce, 0xb9, 0xe7, - 0x78, 0x5f, 0x76, 0x33, 0x52, 0x16, 0xed, 0xa1, 0xde, 0x10, 0xb7, 0x25, 0x66, 0x64, 0x46, 0x44, - 0x3b, 0xf4, 0xbe, 0x2c, 0x9f, 0x4a, 0x12, 0x3d, 0xae, 0x4a, 0x1e, 0x08, 0x32, 0x33, 0x0e, 0x37, - 0x7f, 0x16, 0xab, 0x32, 0xf7, 0x53, 0xd8, 0xc3, 0x37, 0x73, 0x87, 0xe3, 0x3f, 0x2a, 0x70, 0x69, - 0x02, 0xcd, 0xa7, 0x30, 0x2a, 0x7f, 0xd5, 0x1d, 0xee, 0x02, 0x24, 0x44, 0x98, 0x16, 0xde, 0xeb, - 0xf2, 0x10, 0x6b, 0x0b, 0x3c, 0x2d, 0x3c, 0x05, 0xa4, 0xd2, 0xc2, 0x53, 0x00, 0x95, 0x38, 0x76, - 0x5c, 0xef, 0xe0, 0x90, 0x79, 0xb3, 0x2d, 0xb0, 0x9d, 0xe5, 0x10, 0x21, 0xb2, 0xc4, 0xc1, 0x70, - 0xb4, 0xff, 0x32, 0x0d, 0x17, 0x4d, 0xf7, 0xc0, 0xa3, 0x77, 0xb2, 0xbd, 0xd0, 0xeb, 0x1f, 0xa4, - 0xa2, 0x62, 0x69, 0x99, 0x95, 0xcb, 0xb3, 0xe4, 0x50, 0x48, 0x3c, 0x13, 0x9f, 0x87, 0x32, 0x3d, - 0xf3, 0xa5, 0xc5, 0x8b, 0xf6, 0xbd, 0xbe, 0xdf, 0x75, 0x79, 0x64, 0x79, 0x51, 0x4c, 0xd6, 0xb9, - 0x88, 0x28, 0xe5, 0x31, 0xa3, 0x22, 0xe2, 0x8f, 0x3f, 0xb9, 0x0a, 0x2c, 0x29, 0x3c, 0x2d, 0xe5, - 0x62, 0x62, 0x7c, 0x8f, 0x2b, 0x8d, 0xb9, 0xc7, 0xed, 0xc2, 0x8a, 0xde, 0x65, 0x67, 0xab, 0xd3, - 0x6b, 0x05, 0x5e, 0xbf, 0xe3, 0x0d, 0x9c, 0x9e, 0xd0, 0x4d, 0x60, 0x2f, 0x3b, 0x71, 0xb9, 0x3d, - 0x88, 0x11, 0xcc, 0x5c, 0x32, 0xda, 0x8c, 0x6a, 0xc3, 0xc2, 0x90, 0x4b, 0xdc, 0x74, 0x8b, 0xcd, - 0xe8, 0xf6, 0x43, 0x6c, 0x45, 0x68, 0xc6, 0xc5, 0x78, 0x83, 0x44, 0x43, 0x7d, 0xbb, 0x6e, 0xdd, - 0xe1, 0x99, 0x16, 0x45, 0x9a, 0x15, 0xe6, 0x82, 0x11, 0xf5, 0x42, 0xf4, 0x1c, 0x4d, 0xe1, 0x25, - 0x74, 0x96, 0xb5, 0x43, 0xe9, 0xca, 0x23, 0x74, 0x61, 0x78, 0x28, 0xd3, 0x31, 0x3c, 0xf2, 0x32, - 0x9d, 0x0a, 0x47, 0x7e, 0xe4, 0xe2, 0x14, 0x9e, 0x4d, 0xee, 0x9b, 0x01, 0x42, 0xd9, 0x7d, 0x53, - 0x42, 0x21, 0x6f, 0xc1, 0x59, 0xa3, 0xb2, 0x21, 0x14, 0xee, 0x55, 0xbf, 0x33, 0x44, 0x97, 0x09, - 0xc0, 0xef, 0xe1, 0x18, 0xba, 0x9d, 0x0d, 0xba, 0x9b, 0xe4, 0xa1, 0x91, 0x1b, 0x30, 0x53, 0xab, - 0xca, 0x82, 0x20, 0xcf, 0x25, 0xc8, 0xfd, 0xc0, 0x44, 0x21, 0x69, 0x26, 0x17, 0xa2, 0xf9, 0x13, - 0x6f, 0x2e, 0x17, 0x4f, 0x71, 0x19, 0xba, 0x95, 0x15, 0x64, 0xa5, 0xc0, 0xfe, 0x19, 0x41, 0x36, - 0x2b, 0xbe, 0xbe, 0x89, 0xa4, 0xdb, 0x6e, 0xdf, 0x0d, 0x92, 0x80, 0xfe, 0x53, 0xac, 0x6f, 0x29, + 0x83, 0x08, 0x42, 0x82, 0x04, 0x88, 0x60, 0xf8, 0xc3, 0x48, 0x82, 0xe4, 0xc7, 0x88, 0x80, 0x24, + 0xfe, 0x13, 0x20, 0x28, 0x4f, 0xc0, 0x1f, 0xb2, 0xb1, 0xb0, 0x25, 0x04, 0x08, 0x04, 0xff, 0x19, + 0xc9, 0x87, 0x02, 0x05, 0xc1, 0x3d, 0xf7, 0xde, 0xaa, 0x5b, 0xd5, 0xd5, 0x4d, 0x8e, 0x66, 0xe5, + 0xc4, 0x8e, 0x7e, 0x08, 0xf6, 0xb9, 0xe7, 0x9c, 0xba, 0xcf, 0x73, 0xcf, 0x3d, 0xf7, 0xdc, 0x73, + 0xbc, 0x2f, 0xbb, 0x19, 0x2d, 0x8b, 0xf6, 0x50, 0x6f, 0x88, 0x62, 0x89, 0x5d, 0x32, 0x23, 0xa2, + 0x1d, 0x7a, 0x5f, 0x96, 0x77, 0x25, 0x89, 0x1e, 0x57, 0x25, 0x0f, 0x04, 0x99, 0x19, 0x87, 0x9b, + 0x3f, 0x8b, 0x55, 0x99, 0xfb, 0x29, 0xec, 0xe1, 0x9b, 0xb9, 0xc3, 0xf1, 0x1f, 0x15, 0xb8, 0x34, + 0x81, 0xe6, 0x53, 0x18, 0x95, 0xbf, 0xea, 0x0e, 0x77, 0x01, 0x12, 0x22, 0x4c, 0x0b, 0xef, 0x75, + 0x79, 0x88, 0xb5, 0x05, 0x9e, 0x16, 0x9e, 0x02, 0x52, 0x69, 0xe1, 0x29, 0x80, 0x6a, 0x1c, 0x3b, + 0xae, 0x77, 0x70, 0xc8, 0xbc, 0xd9, 0x16, 0x98, 0x64, 0x39, 0x44, 0x88, 0xac, 0x71, 0x30, 0x1c, + 0xed, 0xbf, 0x4c, 0xc3, 0x45, 0xd3, 0x3d, 0xf0, 0xe8, 0x99, 0x6c, 0x2f, 0xf4, 0xfa, 0x07, 0xa9, + 0xa8, 0x58, 0x5a, 0x66, 0xe5, 0xf2, 0x2c, 0x39, 0x14, 0x12, 0xcf, 0xc4, 0xe7, 0xa1, 0x4c, 0xf7, + 0x7c, 0x69, 0xf1, 0xe2, 0xfd, 0x5e, 0xdf, 0xef, 0xba, 0x3c, 0xb2, 0xbc, 0x28, 0x26, 0xeb, 0x5c, + 0x45, 0x94, 0xf2, 0x98, 0x51, 0x15, 0xf1, 0xc7, 0x9f, 0x5c, 0x05, 0x96, 0x14, 0x9e, 0x96, 0x72, + 0x35, 0x31, 0x3e, 0xc7, 0x95, 0xc6, 0x9c, 0xe3, 0x76, 0x61, 0x45, 0xef, 0xb2, 0xbd, 0xd5, 0xe9, + 0xb5, 0x02, 0xaf, 0xdf, 0xf1, 0x06, 0x4e, 0x4f, 0xd8, 0x26, 0xb0, 0x97, 0x9d, 0xb8, 0xdc, 0x1e, + 0xc4, 0x08, 0x66, 0x2e, 0x19, 0x6d, 0x46, 0xb5, 0x61, 0x61, 0xc8, 0x25, 0x7e, 0x75, 0x8b, 0xcd, + 0xe8, 0xf6, 0x43, 0x6c, 0x45, 0x68, 0xc6, 0xc5, 0x78, 0x82, 0xc4, 0x8b, 0xfa, 0x76, 0xdd, 0xba, + 0xc3, 0x33, 0x2d, 0x8a, 0x34, 0x2b, 0xcc, 0x05, 0x23, 0xea, 0x85, 0xe8, 0x39, 0x9a, 0xc2, 0x4b, + 0xe8, 0x2c, 0x6b, 0x87, 0xd2, 0x95, 0x47, 0xe8, 0xc2, 0xf0, 0x50, 0xa6, 0x63, 0x78, 0xe4, 0x65, + 0x3a, 0x15, 0x8e, 0xfc, 0xc8, 0xc5, 0x29, 0x3c, 0x9b, 0x9c, 0x37, 0x03, 0x84, 0xb2, 0xf3, 0xa6, + 0x84, 0x42, 0xde, 0x82, 0xb3, 0x46, 0x65, 0x43, 0x18, 0xdc, 0xab, 0x7e, 0x67, 0x88, 0x2e, 0x13, + 0x80, 0xdf, 0xc3, 0x31, 0x74, 0x3b, 0x1b, 0x54, 0x9a, 0xe4, 0xa1, 0x91, 0x1b, 0x30, 0x53, 0xab, + 0xca, 0x8a, 0x20, 0xcf, 0x25, 0xc8, 0xfd, 0xc0, 0x44, 0x21, 0x69, 0x26, 0x07, 0xa2, 0xf9, 0x13, + 0x4f, 0x2e, 0x17, 0x4f, 0x71, 0x18, 0xba, 0x95, 0x55, 0x64, 0xa5, 0xc0, 0xfe, 0x19, 0x45, 0x36, + 0xab, 0xbe, 0xbe, 0x89, 0xa4, 0xdb, 0x6e, 0xdf, 0x0d, 0x92, 0x80, 0xfe, 0x53, 0xac, 0x6f, 0x29, 0xe9, 0x41, 0x5c, 0x62, 0xa6, 0x11, 0x89, 0x09, 0xe7, 0x5a, 0x81, 0xfb, 0x91, 0xe7, 0x0f, 0xc3, - 0xf4, 0xc7, 0x97, 0x12, 0x61, 0x7f, 0xc0, 0x11, 0xec, 0x6c, 0x2d, 0xf2, 0x49, 0x79, 0xee, 0x44, - 0x96, 0xf1, 0xb8, 0xe2, 0x77, 0xdd, 0x90, 0xed, 0x40, 0x7f, 0x83, 0x72, 0x27, 0x4a, 0x6d, 0x9b, - 0xb0, 0x2b, 0x7f, 0x13, 0x73, 0x27, 0x8e, 0xe0, 0x92, 0x37, 0x61, 0x0a, 0x7f, 0x72, 0x79, 0xfb, - 0x6c, 0x0e, 0xdb, 0x44, 0xd6, 0xee, 0x50, 0x4c, 0x93, 0x11, 0x90, 0x1a, 0xcc, 0xf0, 0x8b, 0xea, - 0xe3, 0x64, 0x00, 0xe3, 0x37, 0x5e, 0x36, 0xdb, 0x38, 0xbd, 0xd6, 0x85, 0x79, 0xf9, 0x83, 0x74, - 0x95, 0xed, 0x38, 0xe1, 0xa1, 0xdb, 0xa5, 0xbf, 0x78, 0xf2, 0x4e, 0x5c, 0x65, 0x87, 0x08, 0xb5, - 0x69, 0x3d, 0x4c, 0x09, 0x85, 0x9e, 0xd3, 0xb5, 0x70, 0x2f, 0xe4, 0x55, 0xe1, 0xaa, 0x2b, 0x0f, - 0xd5, 0xa0, 0x5d, 0x93, 0x17, 0x69, 0x5f, 0x80, 0x95, 0xc6, 0xb0, 0xd7, 0x73, 0x1e, 0xf4, 0x5c, - 0x91, 0xdc, 0x29, 0x72, 0x22, 0x97, 0x6c, 0xc2, 0x14, 0xfe, 0x83, 0x1f, 0x5a, 0x4c, 0x12, 0xec, - 0x4a, 0x38, 0xe8, 0x07, 0xac, 0x60, 0x48, 0x2d, 0xfa, 0x33, 0x15, 0x52, 0x8b, 0x02, 0xb4, 0xef, - 0x28, 0xb0, 0x22, 0xdc, 0x2f, 0x02, 0xa7, 0xf3, 0xd0, 0x0d, 0xb8, 0xc0, 0x75, 0x23, 0x35, 0xd7, - 0x70, 0x11, 0x64, 0xa6, 0x11, 0x9b, 0x75, 0xb7, 0x45, 0x25, 0xd2, 0x42, 0x50, 0x5e, 0x85, 0x4f, - 0xaa, 0x0c, 0x79, 0x0b, 0xe6, 0xf8, 0x91, 0x2b, 0x45, 0xed, 0xc5, 0x88, 0x7e, 0xfc, 0xa2, 0x9d, - 0x75, 0x06, 0x92, 0xd1, 0x51, 0xbe, 0x4b, 0x37, 0xe5, 0x49, 0xe5, 0x8a, 0x7c, 0xf9, 0x2e, 0xfd, - 0x8d, 0x09, 0x53, 0xf7, 0xdf, 0xcd, 0x65, 0xfb, 0x96, 0xcf, 0xdd, 0xd7, 0xe5, 0x20, 0x96, 0x4a, - 0x72, 0x51, 0x4e, 0x82, 0x58, 0xca, 0x17, 0xe5, 0x18, 0x35, 0x1e, 0x93, 0xc2, 0x09, 0x63, 0xf2, - 0x8e, 0x18, 0x93, 0xe2, 0xf8, 0x89, 0x71, 0x76, 0xc2, 0x38, 0x58, 0xc9, 0x0a, 0x29, 0x9d, 0x4a, - 0x4d, 0x75, 0x06, 0x13, 0x92, 0x30, 0x92, 0xec, 0xce, 0xcc, 0x39, 0xc9, 0xba, 0xaf, 0xa9, 0xd3, - 0x33, 0x3d, 0x61, 0xbb, 0xff, 0x2c, 0xcc, 0xeb, 0x51, 0xe4, 0x74, 0x0e, 0xdd, 0x6e, 0x95, 0x6e, - 0x4f, 0x52, 0x94, 0x3a, 0x87, 0xc3, 0x65, 0x9b, 0xa5, 0x8c, 0xcb, 0x42, 0x64, 0x3b, 0x21, 0x77, - 0x1f, 0x8e, 0x43, 0x64, 0x53, 0x48, 0x3a, 0x44, 0x36, 0x85, 0x90, 0x97, 0x61, 0xa6, 0xd6, 0xff, - 0xc8, 0xa3, 0x7d, 0xc2, 0x02, 0xd5, 0xa1, 0xae, 0xcf, 0x63, 0x20, 0x79, 0x73, 0xe5, 0x58, 0xe4, - 0x96, 0x74, 0xcd, 0x9a, 0x4d, 0xb4, 0x29, 0x22, 0xda, 0x2d, 0x2f, 0x92, 0xaf, 0x50, 0xf1, 0xbd, - 0xeb, 0x75, 0x98, 0x11, 0x9a, 0x61, 0x48, 0x4e, 0x10, 0x4e, 0x39, 0x1a, 0x1e, 0x44, 0x20, 0xd3, - 0xf5, 0x23, 0x27, 0x21, 0x9d, 0x4b, 0xd6, 0x8f, 0x9c, 0x84, 0x54, 0x5e, 0x3f, 0x72, 0x3a, 0xd2, - 0x58, 0xa9, 0x36, 0x7f, 0xa2, 0x52, 0xed, 0x2e, 0xcc, 0xb7, 0x9c, 0x20, 0xf2, 0xa8, 0xdc, 0xd3, - 0x8f, 0xc2, 0xd5, 0x85, 0x94, 0x1e, 0x5a, 0x2a, 0xda, 0xbc, 0x22, 0x92, 0xfd, 0x0f, 0x24, 0xfc, - 0x74, 0x56, 0xfa, 0x04, 0x9e, 0xef, 0x3c, 0xbc, 0xf8, 0x24, 0xce, 0xc3, 0xd8, 0xa9, 0xa8, 0x7b, - 0x5c, 0x4a, 0x74, 0x61, 0x78, 0x11, 0xca, 0x28, 0x20, 0x63, 0x44, 0xf2, 0x45, 0x98, 0xa7, 0xff, - 0xb7, 0xfc, 0x9e, 0xd7, 0xf1, 0xdc, 0x70, 0x55, 0xc5, 0xc6, 0x5d, 0xc9, 0x5d, 0xfd, 0x88, 0x74, - 0x6c, 0xb9, 0x11, 0x5b, 0xc0, 0xc8, 0x38, 0x6b, 0x54, 0x48, 0x71, 0x23, 0xef, 0xc2, 0x3c, 0x9d, - 0x7d, 0x0f, 0x9c, 0x90, 0x89, 0xbb, 0xcb, 0x89, 0xfb, 0x77, 0x97, 0xc3, 0x47, 0xa2, 0xd4, 0xcb, - 0x04, 0xf4, 0x98, 0xd7, 0x07, 0x6c, 0x83, 0x24, 0xd2, 0x6c, 0x1f, 0x8c, 0x6c, 0x8e, 0x02, 0x8d, - 0x7c, 0x1e, 0xe6, 0xf5, 0xc1, 0x20, 0xd9, 0x71, 0xce, 0x4a, 0x2a, 0xc8, 0xc1, 0xc0, 0xce, 0xdd, - 0x75, 0x52, 0x14, 0xd9, 0x8d, 0x79, 0xe5, 0xb1, 0x36, 0x66, 0xf2, 0x62, 0x7c, 0x03, 0x38, 0x97, - 0x68, 0xc9, 0xf9, 0x65, 0x34, 0x75, 0x9d, 0x60, 0x97, 0x81, 0x0a, 0x2c, 0x30, 0x85, 0x9e, 0x90, - 0x66, 0xce, 0x8f, 0xac, 0x9e, 0x1c, 0xa1, 0x26, 0x4d, 0x43, 0x0c, 0x58, 0x64, 0x2f, 0xf0, 0x7b, - 0x3c, 0x7d, 0xc0, 0xea, 0x05, 0x5c, 0xb5, 0xc8, 0x85, 0x3d, 0xdc, 0xef, 0x61, 0x56, 0x29, 0x27, - 0xc5, 0x25, 0x43, 0xa4, 0xfd, 0x50, 0x81, 0x0b, 0x63, 0x46, 0x3c, 0x0e, 0x2e, 0xaf, 0x4c, 0x0e, - 0x2e, 0x4f, 0x77, 0x8e, 0xb4, 0x9e, 0x06, 0xdb, 0x3f, 0xfa, 0x2e, 0x2e, 0x96, 0xb7, 0x7c, 0x20, - 0x3c, 0x71, 0x1b, 0xff, 0xf4, 0x6d, 0x1f, 0x55, 0xdd, 0xc5, 0xd1, 0x43, 0x88, 0xe3, 0xb1, 0x4a, - 0xb1, 0x78, 0xb5, 0x3c, 0x2f, 0x5c, 0x3c, 0xac, 0x1f, 0xf8, 0xa9, 0x15, 0x9c, 0xc3, 0x5a, 0xfb, - 0x7a, 0x01, 0xe6, 0xa4, 0x75, 0x48, 0xae, 0x49, 0xaf, 0xae, 0x55, 0x96, 0x59, 0x50, 0xe2, 0x50, - 0x60, 0x27, 0x11, 0x2e, 0xaa, 0xc2, 0xc9, 0x0a, 0x7d, 0x8c, 0x45, 0x26, 0x05, 0xe0, 0xcf, 0x04, - 0x1f, 0xc3, 0x72, 0xf2, 0x25, 0x80, 0xba, 0x13, 0x46, 0x7a, 0x27, 0xf2, 0x3e, 0x72, 0x4f, 0x71, - 0xe8, 0x88, 0x78, 0x9d, 0xe7, 0x30, 0x97, 0x8d, 0x83, 0x64, 0x99, 0x33, 0x42, 0x62, 0x48, 0x87, - 0x40, 0x8e, 0x9b, 0xce, 0x87, 0x60, 0x74, 0x0b, 0x11, 0x58, 0xda, 0xaf, 0x29, 0x00, 0x7b, 0xb5, - 0x0a, 0xa6, 0xdc, 0x78, 0x52, 0x29, 0x22, 0x3f, 0xc6, 0xb7, 0xe0, 0x3e, 0x41, 0x7e, 0xf8, 0x63, - 0x05, 0x16, 0xd3, 0x68, 0xe4, 0x1d, 0x58, 0xb2, 0x3a, 0x81, 0xdf, 0xeb, 0x3d, 0x70, 0x3a, 0x0f, - 0xeb, 0x5e, 0xdf, 0x65, 0x71, 0x8f, 0xa7, 0xd8, 0xe1, 0x15, 0xc6, 0x45, 0x76, 0x8f, 0x96, 0x99, - 0x59, 0x64, 0xf2, 0x55, 0x05, 0x16, 0xac, 0x43, 0xff, 0x51, 0x1c, 0x46, 0x98, 0x8f, 0xe0, 0x97, - 0xe8, 0x66, 0x10, 0x1e, 0xfa, 0x8f, 0x92, 0x3c, 0xc6, 0x29, 0x67, 0xdd, 0xb7, 0x4f, 0xe7, 0x47, - 0xd1, 0xf1, 0xf1, 0x02, 0x13, 0x85, 0x2f, 0xa5, 0x3e, 0x62, 0xa6, 0xbf, 0xa9, 0xfd, 0x44, 0x81, - 0x39, 0xbc, 0xea, 0xf4, 0x7a, 0x28, 0xa4, 0xfd, 0x4d, 0x4a, 0x8a, 0x1b, 0xb7, 0x6b, 0xc2, 0xc0, - 0xbe, 0x06, 0x4b, 0x19, 0x34, 0xa2, 0xc1, 0xb4, 0x85, 0x11, 0x18, 0x64, 0x2d, 0x09, 0x8b, 0xc9, - 0x60, 0xf2, 0x12, 0xcd, 0x90, 0xc8, 0xee, 0xde, 0x44, 0xbb, 0xfa, 0x06, 0x80, 0x27, 0x40, 0xe2, - 0x2a, 0x44, 0xb2, 0x35, 0xb9, 0x7b, 0xd3, 0x94, 0xb0, 0xb4, 0x06, 0x4c, 0x5b, 0x7e, 0x10, 0x6d, - 0x1e, 0xb3, 0xdb, 0x47, 0xd5, 0x0d, 0x3b, 0xb2, 0xe1, 0xdc, 0x43, 0xb3, 0x56, 0xc7, 0xe4, 0x45, - 0xe4, 0x2a, 0x4c, 0x6d, 0x79, 0x6e, 0xaf, 0x2b, 0x3b, 0x54, 0xef, 0x53, 0x80, 0xc9, 0xe0, 0xf4, - 0x86, 0x76, 0x3e, 0xc9, 0x4c, 0x95, 0x78, 0x6e, 0x3f, 0xe9, 0xba, 0xa9, 0xa4, 0xfa, 0xf7, 0x7a, - 0x9c, 0x0d, 0x66, 0xf4, 0x4b, 0x13, 0xba, 0xfa, 0x5f, 0x28, 0xb0, 0x36, 0x9e, 0x44, 0x76, 0x06, - 0x57, 0x26, 0x38, 0x83, 0x3f, 0x9b, 0x35, 0xf4, 0x22, 0x1a, 0x37, 0xf4, 0x26, 0xe6, 0xdd, 0x2a, - 0xfa, 0xe2, 0x77, 0x5c, 0x91, 0x8e, 0xea, 0xda, 0x84, 0x3a, 0x23, 0x22, 0x1b, 0xe6, 0x08, 0x69, - 0x4c, 0x4e, 0xab, 0xfd, 0x9b, 0x12, 0x5c, 0x1c, 0x4b, 0x41, 0x76, 0xa4, 0x24, 0x77, 0x8b, 0x71, - 0x7a, 0xad, 0xb1, 0xf8, 0x2f, 0xe1, 0x5f, 0x74, 0xb7, 0xcc, 0x3e, 0xf0, 0x6b, 0xc6, 0xc9, 0xcd, - 0x0a, 0xc8, 0xeb, 0x85, 0x13, 0x79, 0x31, 0x74, 0x64, 0x06, 0xa3, 0x79, 0xce, 0xf0, 0x2d, 0xa9, - 0x1b, 0x39, 0x5e, 0x2f, 0x94, 0x97, 0x5d, 0x97, 0x81, 0x4c, 0x51, 0x96, 0x78, 0xe8, 0x97, 0xf2, - 0x3d, 0xf4, 0xb5, 0xff, 0xad, 0xc0, 0x6c, 0x5c, 0x6d, 0xb2, 0x06, 0xe7, 0xdb, 0xa6, 0x5e, 0x31, - 0xec, 0xf6, 0xfd, 0x96, 0x61, 0xef, 0x35, 0xac, 0x96, 0x51, 0xa9, 0x6d, 0xd5, 0x8c, 0xaa, 0x7a, - 0x86, 0x2c, 0xc3, 0xc2, 0x5e, 0xe3, 0x4e, 0xa3, 0x79, 0xaf, 0x61, 0x1b, 0xa6, 0xd9, 0x34, 0x55, - 0x85, 0x2c, 0xc0, 0xac, 0xb9, 0xa9, 0x57, 0xec, 0x46, 0xb3, 0x6a, 0xa8, 0x05, 0xa2, 0xc2, 0x7c, - 0xa5, 0xd9, 0x68, 0x18, 0x95, 0x76, 0xed, 0x6e, 0xad, 0x7d, 0x5f, 0x2d, 0x12, 0x02, 0x8b, 0x88, - 0xd0, 0x32, 0x6b, 0x8d, 0x4a, 0xad, 0xa5, 0xd7, 0xd5, 0x12, 0x85, 0x51, 0x7c, 0x09, 0x36, 0x15, - 0x33, 0xba, 0xb3, 0xb7, 0x69, 0xa8, 0xd3, 0x14, 0x85, 0xfe, 0x27, 0xa1, 0xcc, 0xd0, 0xcf, 0x23, - 0x4a, 0x55, 0x6f, 0xeb, 0x9b, 0xba, 0x65, 0xa8, 0x65, 0x72, 0x01, 0xce, 0xa6, 0x40, 0x76, 0xbd, - 0xb9, 0x5d, 0x6b, 0xa8, 0xb3, 0x64, 0x05, 0xd4, 0x18, 0x56, 0xdd, 0xb4, 0xf7, 0x2c, 0xc3, 0x54, - 0x21, 0x0b, 0x6d, 0xe8, 0xbb, 0x86, 0x3a, 0xa7, 0xbd, 0xcd, 0x9e, 0x5e, 0xb2, 0xae, 0x26, 0xe7, - 0x81, 0x58, 0x6d, 0xbd, 0xbd, 0x67, 0x65, 0x1a, 0x3f, 0x07, 0x33, 0xd6, 0x5e, 0xa5, 0x62, 0x58, - 0x96, 0xaa, 0x10, 0x80, 0xe9, 0x2d, 0xbd, 0x56, 0x37, 0xaa, 0x6a, 0x41, 0xfb, 0x2d, 0x05, 0x96, - 0x85, 0xc8, 0x28, 0xec, 0x5e, 0x4f, 0xb8, 0x16, 0xdf, 0x49, 0xdd, 0x84, 0xc5, 0x3b, 0xba, 0xcc, - 0x47, 0x26, 0x2c, 0xc3, 0x7f, 0xa4, 0xc0, 0xb9, 0x5c, 0x6c, 0x72, 0x1f, 0x54, 0x51, 0x83, 0xf8, - 0x4d, 0xac, 0x92, 0x92, 0xb8, 0x05, 0x5d, 0x06, 0x8d, 0xe9, 0x56, 0x93, 0xb4, 0xfb, 0x23, 0x6c, - 0x4e, 0x9f, 0xc5, 0x45, 0xfb, 0x86, 0x02, 0x17, 0xc6, 0x7c, 0x86, 0x54, 0x60, 0x3a, 0x4e, 0x0f, - 0x36, 0xc1, 0xe3, 0x70, 0xe5, 0xfb, 0x9f, 0x5c, 0xe5, 0x88, 0x98, 0xa7, 0x1c, 0xff, 0x33, 0xa7, - 0xe3, 0x7c, 0x5f, 0x98, 0x74, 0x8b, 0x75, 0xdf, 0xc5, 0x4c, 0xcf, 0xf3, 0x2f, 0xe9, 0xf7, 0xac, - 0xcd, 0x39, 0xde, 0x77, 0x45, 0xe7, 0x51, 0x88, 0x59, 0xb7, 0xb4, 0xdf, 0x55, 0xa8, 0x34, 0x98, - 0x45, 0xa4, 0x42, 0xb2, 0x1e, 0x86, 0xc3, 0x23, 0xd7, 0xf4, 0x7b, 0xae, 0x6e, 0x36, 0xf8, 0xb1, - 0x81, 0xe2, 0xad, 0x83, 0x05, 0x78, 0x0f, 0xb1, 0x9d, 0x20, 0x15, 0x7a, 0x21, 0x45, 0x43, 0x6e, - 0x01, 0x18, 0x1f, 0x47, 0x6e, 0xd0, 0x77, 0x7a, 0x71, 0x10, 0x1d, 0x16, 0x9e, 0x8c, 0x43, 0xd3, - 0x02, 0xba, 0x84, 0xac, 0x7d, 0x4d, 0x81, 0x79, 0x2e, 0x2c, 0xe9, 0x3d, 0x37, 0x88, 0x9e, 0x6c, - 0x7a, 0xdd, 0x4a, 0x4d, 0xaf, 0xf8, 0x81, 0x8d, 0xc4, 0x9f, 0x16, 0xe7, 0xce, 0xac, 0xff, 0xa0, - 0x80, 0x9a, 0x45, 0x24, 0xef, 0x40, 0xd9, 0x72, 0x3f, 0x72, 0x03, 0x2f, 0x3a, 0xe6, 0x1b, 0xa5, - 0x48, 0xa4, 0xca, 0x70, 0x78, 0x19, 0x9b, 0x0f, 0x21, 0xff, 0x65, 0xc6, 0x34, 0xa7, 0xdd, 0xef, - 0x25, 0x3d, 0x49, 0xf1, 0xd3, 0xd2, 0x93, 0x68, 0x7f, 0x56, 0x80, 0x0b, 0xdb, 0x6e, 0x24, 0xb7, - 0x29, 0xf6, 0x04, 0x79, 0xe5, 0x74, 0xed, 0x92, 0x5a, 0xb2, 0x0a, 0x33, 0x58, 0x24, 0xc6, 0xd7, - 0x14, 0x3f, 0xc9, 0x66, 0x3c, 0xaf, 0x8b, 0xa9, 0x4c, 0x8d, 0x63, 0xbe, 0xfd, 0x92, 0x94, 0xbb, - 0x2d, 0x9e, 0xd6, 0x37, 0x60, 0x11, 0x73, 0x6a, 0x0c, 0xe9, 0x72, 0x70, 0xbb, 0x5c, 0x5f, 0x54, - 0x36, 0x33, 0x50, 0xb2, 0x0e, 0x2a, 0x85, 0xe8, 0x9d, 0x87, 0x7d, 0xff, 0x51, 0xcf, 0xed, 0x1e, - 0xb8, 0x5d, 0x3c, 0xd6, 0xcb, 0xe6, 0x08, 0x5c, 0xf0, 0xdc, 0xeb, 0xb3, 0xbb, 0x9e, 0xdb, 0x45, - 0xa5, 0x0e, 0xe7, 0x99, 0x40, 0xd7, 0x6e, 0xc1, 0xdc, 0x4f, 0x99, 0x87, 0x51, 0xfb, 0x13, 0x05, - 0x56, 0xb0, 0x71, 0xd2, 0x87, 0x45, 0x8e, 0x6c, 0xd1, 0x5b, 0x52, 0x6a, 0x32, 0x87, 0x82, 0xd2, - 0x4b, 0x21, 0xee, 0xc5, 0x44, 0x89, 0x54, 0x38, 0x85, 0x12, 0x49, 0xd2, 0x81, 0x95, 0x3e, 0x2d, - 0x1d, 0xd8, 0xed, 0x52, 0xb9, 0xa8, 0x96, 0x92, 0x21, 0xd7, 0xbe, 0x5a, 0x80, 0x19, 0xd3, 0xed, - 0xb9, 0x4e, 0xe8, 0x92, 0x1b, 0x30, 0xd3, 0xf0, 0x23, 0x37, 0xdc, 0xad, 0xca, 0x5e, 0xd6, 0x7d, - 0x0a, 0xb2, 0x8f, 0xba, 0xa6, 0x28, 0xa4, 0x13, 0xbe, 0x15, 0xf8, 0xdd, 0x61, 0x27, 0x92, 0x27, - 0xfc, 0x80, 0x81, 0x4c, 0x51, 0x46, 0x3e, 0x03, 0xb3, 0x9c, 0x73, 0x6c, 0x59, 0x46, 0xe7, 0xf1, - 0x80, 0x01, 0x31, 0xfb, 0x4e, 0x8c, 0x80, 0x32, 0x2d, 0x13, 0x30, 0x4a, 0x92, 0x4c, 0x3b, 0x22, - 0x33, 0x08, 0x51, 0x7d, 0x6a, 0x82, 0xa8, 0xfe, 0x0a, 0x4c, 0xeb, 0x61, 0xe8, 0x46, 0x22, 0xf2, - 0xc4, 0x7c, 0x1c, 0xfb, 0x2f, 0x74, 0x23, 0xc6, 0xd8, 0xc1, 0x72, 0x93, 0xe3, 0x69, 0x7f, 0x59, - 0x80, 0x29, 0xfc, 0x17, 0xed, 0xb6, 0x41, 0xe7, 0x30, 0x65, 0xb7, 0x0d, 0x3a, 0x87, 0x26, 0x42, - 0xc9, 0x4d, 0x54, 0x6d, 0x88, 0x2c, 0x7a, 0xbc, 0xf5, 0xa8, 0xb3, 0xef, 0x26, 0x60, 0x53, 0xc6, - 0x89, 0xdd, 0x0c, 0x8a, 0xb9, 0xf1, 0x66, 0xce, 0x43, 0xa1, 0x69, 0xf1, 0x16, 0x63, 0xc8, 0x32, - 0x3f, 0x34, 0x0b, 0x4d, 0x0b, 0x7b, 0x63, 0x47, 0xdf, 0x78, 0xed, 0x75, 0xde, 0x50, 0xd6, 0x1b, - 0x87, 0xce, 0xc6, 0x6b, 0xaf, 0x9b, 0xbc, 0x84, 0xf6, 0x2f, 0xd6, 0x19, 0xad, 0xbf, 0x2c, 0x2c, - 0x02, 0xf6, 0x2f, 0xb6, 0x0d, 0x2d, 0xbd, 0x66, 0x82, 0x40, 0x36, 0x60, 0x8e, 0xc7, 0xe7, 0x40, - 0x7c, 0x29, 0x7e, 0x06, 0x8f, 0xdf, 0xc1, 0x28, 0x64, 0x24, 0x66, 0x07, 0xe4, 0x03, 0x24, 0x72, - 0x7d, 0x73, 0x3b, 0xa0, 0x18, 0xc2, 0xd0, 0x94, 0x50, 0x68, 0x95, 0x98, 0x21, 0x31, 0x09, 0x77, - 0x80, 0x55, 0xe2, 0xd6, 0x46, 0xcc, 0x5f, 0x12, 0x23, 0x68, 0xbf, 0x5f, 0x80, 0x72, 0xab, 0x37, - 0x3c, 0xf0, 0xfa, 0x77, 0x6f, 0x12, 0x02, 0x78, 0x8d, 0x13, 0x09, 0x6e, 0xe8, 0xff, 0xe4, 0x22, - 0x94, 0xc5, 0xcd, 0x4d, 0x6c, 0x48, 0x21, 0xbf, 0xb5, 0xad, 0x82, 0x18, 0x77, 0x1e, 0x9b, 0x4e, - 0xfc, 0x24, 0x37, 0x21, 0xbe, 0x7f, 0x8d, 0xbb, 0xa8, 0x95, 0xe8, 0x62, 0x31, 0x63, 0x34, 0xf2, - 0x22, 0xe0, 0x21, 0xc1, 0x2f, 0x0f, 0x42, 0x03, 0xce, 0xaa, 0xc6, 0xe5, 0x14, 0x46, 0x82, 0x68, + 0xf4, 0xc7, 0x97, 0x12, 0x65, 0x7f, 0xc0, 0x11, 0xec, 0x6c, 0x2d, 0xf2, 0x49, 0x79, 0xee, 0x44, + 0x96, 0xf1, 0xb8, 0xe2, 0x77, 0xdd, 0x90, 0x49, 0xa0, 0xbf, 0x41, 0xb9, 0x13, 0xa5, 0xb6, 0x4d, + 0x90, 0xca, 0xdf, 0xc4, 0xdc, 0x89, 0x23, 0xb8, 0xe4, 0x4d, 0x98, 0xc2, 0x9f, 0x5c, 0xdf, 0x3e, + 0x9b, 0xc3, 0x36, 0xd1, 0xb5, 0x3b, 0x14, 0xd3, 0x64, 0x04, 0xa4, 0x06, 0x33, 0xfc, 0xa0, 0xfa, + 0x38, 0x19, 0xc0, 0xf8, 0x89, 0x97, 0xcd, 0x36, 0x4e, 0xaf, 0x75, 0x61, 0x5e, 0xfe, 0x20, 0x5d, + 0x65, 0x3b, 0x4e, 0x78, 0xe8, 0x76, 0xe9, 0x2f, 0x9e, 0xbc, 0x13, 0x57, 0xd9, 0x21, 0x42, 0x6d, + 0x5a, 0x0f, 0x53, 0x42, 0xa1, 0xfb, 0x74, 0x2d, 0xdc, 0x0b, 0x79, 0x55, 0xb8, 0xe9, 0xca, 0x43, + 0x33, 0x68, 0xd7, 0xe4, 0x45, 0xda, 0x17, 0x60, 0xa5, 0x31, 0xec, 0xf5, 0x9c, 0x07, 0x3d, 0x57, + 0x24, 0x77, 0x8a, 0x9c, 0xc8, 0x25, 0x9b, 0x30, 0x85, 0xff, 0xe0, 0x87, 0x16, 0x93, 0x04, 0xbb, + 0x12, 0x0e, 0xfa, 0x01, 0x2b, 0x18, 0x52, 0x8b, 0xfe, 0x4c, 0x85, 0xd4, 0xa2, 0x00, 0xed, 0x3b, + 0x0a, 0xac, 0x08, 0xf7, 0x8b, 0xc0, 0xe9, 0x3c, 0x74, 0x03, 0xae, 0x70, 0xdd, 0x48, 0xcd, 0x35, + 0x5c, 0x04, 0x99, 0x69, 0xc4, 0x66, 0xdd, 0x6d, 0x51, 0x89, 0xb4, 0x12, 0x94, 0x57, 0xe1, 0x93, + 0x2a, 0x43, 0xde, 0x82, 0x39, 0xbe, 0xe5, 0x4a, 0x51, 0x7b, 0x31, 0xa2, 0x1f, 0x3f, 0x68, 0x67, + 0x9d, 0x81, 0x64, 0x74, 0xd4, 0xef, 0xd2, 0x4d, 0x79, 0x52, 0xbd, 0x22, 0x5f, 0xbf, 0x4b, 0x7f, + 0x63, 0xc2, 0xd4, 0xfd, 0xf7, 0x73, 0xd9, 0xbe, 0xe5, 0x73, 0xf7, 0x75, 0x39, 0x88, 0xa5, 0x92, + 0x1c, 0x94, 0x93, 0x20, 0x96, 0xf2, 0x41, 0x39, 0x46, 0x8d, 0xc7, 0xa4, 0x70, 0xc2, 0x98, 0xbc, + 0x23, 0xc6, 0xa4, 0x38, 0x7e, 0x62, 0x9c, 0x9d, 0x30, 0x0e, 0x56, 0xb2, 0x42, 0x4a, 0xa7, 0x32, + 0x53, 0x9d, 0xc1, 0x84, 0x24, 0x8c, 0x24, 0x2b, 0x99, 0x39, 0x27, 0xd9, 0xf6, 0x35, 0x75, 0x7a, + 0xa6, 0x27, 0x88, 0xfb, 0xcf, 0xc2, 0xbc, 0x1e, 0x45, 0x4e, 0xe7, 0xd0, 0xed, 0x56, 0xa9, 0x78, + 0x92, 0xa2, 0xd4, 0x39, 0x1c, 0x2e, 0xdf, 0x59, 0xca, 0xb8, 0x2c, 0x44, 0xb6, 0x13, 0x72, 0xf7, + 0xe1, 0x38, 0x44, 0x36, 0x85, 0xa4, 0x43, 0x64, 0x53, 0x08, 0x79, 0x19, 0x66, 0x6a, 0xfd, 0x8f, + 0x3c, 0xda, 0x27, 0x2c, 0x50, 0x1d, 0xda, 0xfa, 0x3c, 0x06, 0x92, 0x85, 0x2b, 0xc7, 0x22, 0xb7, + 0xa4, 0x63, 0xd6, 0x6c, 0x62, 0x4d, 0x11, 0xd1, 0x6e, 0x79, 0x91, 0x7c, 0x84, 0x8a, 0xcf, 0x5d, + 0xaf, 0xc3, 0x8c, 0xb0, 0x0c, 0x43, 0xb2, 0x83, 0x70, 0xca, 0xd1, 0xf0, 0x20, 0x02, 0x99, 0xae, + 0x1f, 0x39, 0x09, 0xe9, 0x5c, 0xb2, 0x7e, 0xe4, 0x24, 0xa4, 0xf2, 0xfa, 0x91, 0xd3, 0x91, 0xc6, + 0x46, 0xb5, 0xf9, 0x13, 0x8d, 0x6a, 0x77, 0x61, 0xbe, 0xe5, 0x04, 0x91, 0x47, 0xf5, 0x9e, 0x7e, + 0x14, 0xae, 0x2e, 0xa4, 0xec, 0xd0, 0x52, 0xd1, 0xe6, 0x15, 0x91, 0xec, 0x7f, 0x20, 0xe1, 0xa7, + 0xb3, 0xd2, 0x27, 0xf0, 0x7c, 0xe7, 0xe1, 0xc5, 0x27, 0x71, 0x1e, 0xc6, 0x4e, 0x45, 0xdb, 0xe3, + 0x52, 0x62, 0x0b, 0xc3, 0x83, 0x50, 0xc6, 0x00, 0x19, 0x23, 0x92, 0x2f, 0xc2, 0x3c, 0xfd, 0xbf, + 0xe5, 0xf7, 0xbc, 0x8e, 0xe7, 0x86, 0xab, 0x2a, 0x36, 0xee, 0x4a, 0xee, 0xea, 0x47, 0xa4, 0x63, + 0xcb, 0x8d, 0xd8, 0x02, 0x46, 0xc6, 0xd9, 0x4b, 0x85, 0x14, 0x37, 0xf2, 0x2e, 0xcc, 0xd3, 0xd9, + 0xf7, 0xc0, 0x09, 0x99, 0xba, 0xbb, 0x9c, 0xb8, 0x7f, 0x77, 0x39, 0x7c, 0x24, 0x4a, 0xbd, 0x4c, + 0x40, 0xb7, 0x79, 0x7d, 0xc0, 0x04, 0x24, 0x91, 0x66, 0xfb, 0x60, 0x44, 0x38, 0x0a, 0x34, 0xf2, + 0x79, 0x98, 0xd7, 0x07, 0x83, 0x44, 0xe2, 0x9c, 0x95, 0x4c, 0x90, 0x83, 0x81, 0x9d, 0x2b, 0x75, + 0x52, 0x14, 0x59, 0xc1, 0xbc, 0xf2, 0x58, 0x82, 0x99, 0xbc, 0x18, 0x9f, 0x00, 0xce, 0x25, 0x56, + 0x72, 0x7e, 0x18, 0x4d, 0x1d, 0x27, 0xd8, 0x61, 0xa0, 0x02, 0x0b, 0xcc, 0xa0, 0x27, 0xb4, 0x99, + 0xf3, 0x23, 0xab, 0x27, 0x47, 0xa9, 0x49, 0xd3, 0x10, 0x03, 0x16, 0xd9, 0x0b, 0xfc, 0x1e, 0x4f, + 0x1f, 0xb0, 0x7a, 0x01, 0x57, 0x2d, 0x72, 0x61, 0x0f, 0xf7, 0x7b, 0x98, 0x55, 0xca, 0x49, 0x71, + 0xc9, 0x10, 0x69, 0x3f, 0x54, 0xe0, 0xc2, 0x98, 0x11, 0x8f, 0x83, 0xcb, 0x2b, 0x93, 0x83, 0xcb, + 0x53, 0xc9, 0x91, 0xb6, 0xd3, 0x60, 0xfb, 0x47, 0xdf, 0xc5, 0xc5, 0xfa, 0x96, 0x0f, 0x84, 0x27, + 0x6e, 0xe3, 0x9f, 0xbe, 0xed, 0xa3, 0xa9, 0xbb, 0x38, 0xba, 0x09, 0x71, 0x3c, 0x56, 0x29, 0x16, + 0xaf, 0x96, 0xe7, 0x85, 0x8b, 0x87, 0xf5, 0x03, 0x3f, 0xb5, 0x82, 0x73, 0x58, 0x6b, 0x5f, 0x2f, + 0xc0, 0x9c, 0xb4, 0x0e, 0xc9, 0x35, 0xe9, 0xd5, 0xb5, 0xca, 0x32, 0x0b, 0x4a, 0x1c, 0x0a, 0x6c, + 0x27, 0xc2, 0x45, 0x55, 0x38, 0xd9, 0xa0, 0x8f, 0xb1, 0xc8, 0xa4, 0x00, 0xfc, 0x99, 0xe0, 0x63, + 0x58, 0x4e, 0xbe, 0x04, 0x50, 0x77, 0xc2, 0x48, 0xef, 0x44, 0xde, 0x47, 0xee, 0x29, 0x36, 0x1d, + 0x11, 0xaf, 0xf3, 0x1c, 0xe6, 0xb2, 0x71, 0x90, 0x2c, 0xb3, 0x47, 0x48, 0x0c, 0xe9, 0x10, 0xc8, + 0x71, 0xd3, 0xf9, 0x10, 0x8c, 0x8a, 0x10, 0x81, 0xa5, 0xfd, 0x9a, 0x02, 0xb0, 0x57, 0xab, 0x60, + 0xca, 0x8d, 0x27, 0xd5, 0x22, 0xf2, 0x63, 0x7c, 0x0b, 0xee, 0x13, 0xf4, 0x87, 0x3f, 0x56, 0x60, + 0x31, 0x8d, 0x46, 0xde, 0x81, 0x25, 0xab, 0x13, 0xf8, 0xbd, 0xde, 0x03, 0xa7, 0xf3, 0xb0, 0xee, + 0xf5, 0x5d, 0x16, 0xf7, 0x78, 0x8a, 0x6d, 0x5e, 0x61, 0x5c, 0x64, 0xf7, 0x68, 0x99, 0x99, 0x45, + 0x26, 0x5f, 0x55, 0x60, 0xc1, 0x3a, 0xf4, 0x1f, 0xc5, 0x61, 0x84, 0xf9, 0x08, 0x7e, 0x89, 0x0a, + 0x83, 0xf0, 0xd0, 0x7f, 0x94, 0xe4, 0x31, 0x4e, 0x39, 0xeb, 0xbe, 0x7d, 0x3a, 0x3f, 0x8a, 0x8e, + 0x8f, 0x07, 0x98, 0x28, 0x7c, 0x29, 0xf5, 0x11, 0x33, 0xfd, 0x4d, 0xed, 0x27, 0x0a, 0xcc, 0xe1, + 0x51, 0xa7, 0xd7, 0x43, 0x25, 0xed, 0x6f, 0x52, 0x52, 0xdc, 0xb8, 0x5d, 0x13, 0x06, 0xf6, 0x35, + 0x58, 0xca, 0xa0, 0x11, 0x0d, 0xa6, 0x2d, 0x8c, 0xc0, 0x20, 0x5b, 0x49, 0x58, 0x4c, 0x06, 0x93, + 0x97, 0x68, 0x86, 0x44, 0x76, 0xf7, 0x26, 0xde, 0xab, 0x6f, 0x00, 0x78, 0x02, 0x24, 0x8e, 0x42, + 0x24, 0x5b, 0x93, 0xbb, 0x37, 0x4d, 0x09, 0x4b, 0x6b, 0xc0, 0xb4, 0xe5, 0x07, 0xd1, 0xe6, 0x31, + 0x3b, 0x7d, 0x54, 0xdd, 0xb0, 0x23, 0x5f, 0x9c, 0x7b, 0x78, 0xad, 0xd5, 0x31, 0x79, 0x11, 0xb9, + 0x0a, 0x53, 0x5b, 0x9e, 0xdb, 0xeb, 0xca, 0x0e, 0xd5, 0xfb, 0x14, 0x60, 0x32, 0x38, 0x3d, 0xa1, + 0x9d, 0x4f, 0x32, 0x53, 0x25, 0x9e, 0xdb, 0x4f, 0xba, 0x6e, 0x2a, 0xa9, 0xfe, 0xbd, 0x1e, 0x67, + 0x83, 0x19, 0xfd, 0xd2, 0x84, 0xae, 0xfe, 0x97, 0x0a, 0xac, 0x8d, 0x27, 0x91, 0x9d, 0xc1, 0x95, + 0x09, 0xce, 0xe0, 0xcf, 0x66, 0x2f, 0x7a, 0x11, 0x8d, 0x5f, 0xf4, 0x26, 0xd7, 0xbb, 0x55, 0xf4, + 0xc5, 0xef, 0xb8, 0x22, 0x1d, 0xd5, 0xb5, 0x09, 0x75, 0x46, 0x44, 0x36, 0xcc, 0x11, 0xd2, 0x98, + 0x9c, 0x56, 0xfb, 0xb7, 0x25, 0xb8, 0x38, 0x96, 0x82, 0xec, 0x48, 0x49, 0xee, 0x16, 0xe3, 0xf4, + 0x5a, 0x63, 0xf1, 0x5f, 0xc2, 0xbf, 0xe8, 0x6e, 0x99, 0x7d, 0xe0, 0xd7, 0x8c, 0x93, 0x9b, 0x15, + 0x90, 0xd7, 0x0b, 0x27, 0xf2, 0x62, 0xe8, 0xc8, 0x0c, 0x46, 0xf3, 0x9c, 0xe1, 0x5b, 0x52, 0x37, + 0x72, 0xbc, 0x5e, 0x28, 0x2f, 0xbb, 0x2e, 0x03, 0x99, 0xa2, 0x2c, 0xf1, 0xd0, 0x2f, 0xe5, 0x7b, + 0xe8, 0x6b, 0xff, 0x5b, 0x81, 0xd9, 0xb8, 0xda, 0x64, 0x0d, 0xce, 0xb7, 0x4d, 0xbd, 0x62, 0xd8, + 0xed, 0xfb, 0x2d, 0xc3, 0xde, 0x6b, 0x58, 0x2d, 0xa3, 0x52, 0xdb, 0xaa, 0x19, 0x55, 0xf5, 0x0c, + 0x59, 0x86, 0x85, 0xbd, 0xc6, 0x9d, 0x46, 0xf3, 0x5e, 0xc3, 0x36, 0x4c, 0xb3, 0x69, 0xaa, 0x0a, + 0x59, 0x80, 0x59, 0x73, 0x53, 0xaf, 0xd8, 0x8d, 0x66, 0xd5, 0x50, 0x0b, 0x44, 0x85, 0xf9, 0x4a, + 0xb3, 0xd1, 0x30, 0x2a, 0xed, 0xda, 0xdd, 0x5a, 0xfb, 0xbe, 0x5a, 0x24, 0x04, 0x16, 0x11, 0xa1, + 0x65, 0xd6, 0x1a, 0x95, 0x5a, 0x4b, 0xaf, 0xab, 0x25, 0x0a, 0xa3, 0xf8, 0x12, 0x6c, 0x2a, 0x66, + 0x74, 0x67, 0x6f, 0xd3, 0x50, 0xa7, 0x29, 0x0a, 0xfd, 0x4f, 0x42, 0x99, 0xa1, 0x9f, 0x47, 0x94, + 0xaa, 0xde, 0xd6, 0x37, 0x75, 0xcb, 0x50, 0xcb, 0xe4, 0x02, 0x9c, 0x4d, 0x81, 0xec, 0x7a, 0x73, + 0xbb, 0xd6, 0x50, 0x67, 0xc9, 0x0a, 0xa8, 0x31, 0xac, 0xba, 0x69, 0xef, 0x59, 0x86, 0xa9, 0x42, + 0x16, 0xda, 0xd0, 0x77, 0x0d, 0x75, 0x4e, 0x7b, 0x9b, 0x3d, 0xbd, 0x64, 0x5d, 0x4d, 0xce, 0x03, + 0xb1, 0xda, 0x7a, 0x7b, 0xcf, 0xca, 0x34, 0x7e, 0x0e, 0x66, 0xac, 0xbd, 0x4a, 0xc5, 0xb0, 0x2c, + 0x55, 0x21, 0x00, 0xd3, 0x5b, 0x7a, 0xad, 0x6e, 0x54, 0xd5, 0x82, 0xf6, 0x5b, 0x0a, 0x2c, 0x0b, + 0x95, 0x51, 0xdc, 0x7b, 0x3d, 0xe1, 0x5a, 0x7c, 0x27, 0x75, 0x12, 0x16, 0xef, 0xe8, 0x32, 0x1f, + 0x99, 0xb0, 0x0c, 0xff, 0x91, 0x02, 0xe7, 0x72, 0xb1, 0xc9, 0x7d, 0x50, 0x45, 0x0d, 0xe2, 0x37, + 0xb1, 0x4a, 0x4a, 0xe3, 0x16, 0x74, 0x19, 0x34, 0x66, 0x5b, 0x4d, 0xd2, 0xee, 0x8f, 0xb0, 0x39, + 0x7d, 0x16, 0x17, 0xed, 0x1b, 0x0a, 0x5c, 0x18, 0xf3, 0x19, 0x52, 0x81, 0xe9, 0x38, 0x3d, 0xd8, + 0x04, 0x8f, 0xc3, 0x95, 0xef, 0x7f, 0x72, 0x95, 0x23, 0x62, 0x9e, 0x72, 0xfc, 0xcf, 0x9c, 0x8e, + 0xf3, 0x7d, 0x61, 0xd2, 0x2d, 0xd6, 0x7d, 0x17, 0x33, 0x3d, 0xcf, 0xbf, 0xa4, 0xdf, 0xb3, 0x36, + 0xe7, 0x78, 0xdf, 0x15, 0x9d, 0x47, 0x21, 0x66, 0xdd, 0xd2, 0x7e, 0x57, 0xa1, 0xda, 0x60, 0x16, + 0x91, 0x2a, 0xc9, 0x7a, 0x18, 0x0e, 0x8f, 0x5c, 0xd3, 0xef, 0xb9, 0xba, 0xd9, 0xe0, 0xdb, 0x06, + 0xaa, 0xb7, 0x0e, 0x16, 0xe0, 0x39, 0xc4, 0x76, 0x82, 0x54, 0xe8, 0x85, 0x14, 0x0d, 0xb9, 0x05, + 0x60, 0x7c, 0x1c, 0xb9, 0x41, 0xdf, 0xe9, 0xc5, 0x41, 0x74, 0x58, 0x78, 0x32, 0x0e, 0x4d, 0x2b, + 0xe8, 0x12, 0xb2, 0xf6, 0x35, 0x05, 0xe6, 0xb9, 0xb2, 0xa4, 0xf7, 0xdc, 0x20, 0x7a, 0xb2, 0xe9, + 0x75, 0x2b, 0x35, 0xbd, 0xe2, 0x07, 0x36, 0x12, 0x7f, 0x5a, 0x9c, 0x3b, 0xb3, 0xfe, 0x83, 0x02, + 0x6a, 0x16, 0x91, 0xbc, 0x03, 0x65, 0xcb, 0xfd, 0xc8, 0x0d, 0xbc, 0xe8, 0x98, 0x0b, 0x4a, 0x91, + 0x48, 0x95, 0xe1, 0xf0, 0x32, 0x36, 0x1f, 0x42, 0xfe, 0xcb, 0x8c, 0x69, 0x4e, 0x2b, 0xef, 0x25, + 0x3b, 0x49, 0xf1, 0xd3, 0xb2, 0x93, 0x68, 0x7f, 0x56, 0x80, 0x0b, 0xdb, 0x6e, 0x24, 0xb7, 0x29, + 0xf6, 0x04, 0x79, 0xe5, 0x74, 0xed, 0x92, 0x5a, 0xb2, 0x0a, 0x33, 0x58, 0x24, 0xc6, 0xd7, 0x14, + 0x3f, 0xc9, 0x66, 0x3c, 0xaf, 0x8b, 0xa9, 0x4c, 0x8d, 0x63, 0xbe, 0xfd, 0x92, 0x94, 0xbb, 0x2d, + 0x9e, 0xd6, 0x37, 0x60, 0x11, 0x73, 0x6a, 0x0c, 0xe9, 0x72, 0x70, 0xbb, 0xdc, 0x5e, 0x54, 0x36, + 0x33, 0x50, 0xb2, 0x0e, 0x2a, 0x85, 0xe8, 0x9d, 0x87, 0x7d, 0xff, 0x51, 0xcf, 0xed, 0x1e, 0xb8, + 0x5d, 0xdc, 0xd6, 0xcb, 0xe6, 0x08, 0x5c, 0xf0, 0xdc, 0xeb, 0xb3, 0xb3, 0x9e, 0xdb, 0x45, 0xa3, + 0x0e, 0xe7, 0x99, 0x40, 0xd7, 0x6e, 0xc1, 0xdc, 0x4f, 0x99, 0x87, 0x51, 0xfb, 0x13, 0x05, 0x56, + 0xb0, 0x71, 0xd2, 0x87, 0x45, 0x8e, 0x6c, 0xd1, 0x5b, 0x52, 0x6a, 0x32, 0x87, 0x82, 0xd2, 0x4b, + 0x21, 0xee, 0xc5, 0xc4, 0x88, 0x54, 0x38, 0x85, 0x11, 0x49, 0xb2, 0x81, 0x95, 0x3e, 0x2d, 0x1b, + 0xd8, 0xed, 0x52, 0xb9, 0xa8, 0x96, 0x92, 0x21, 0xd7, 0xbe, 0x5a, 0x80, 0x19, 0xd3, 0xed, 0xb9, + 0x4e, 0xe8, 0x92, 0x1b, 0x30, 0xd3, 0xf0, 0x23, 0x37, 0xdc, 0xad, 0xca, 0x5e, 0xd6, 0x7d, 0x0a, + 0xb2, 0x8f, 0xba, 0xa6, 0x28, 0xa4, 0x13, 0xbe, 0x15, 0xf8, 0xdd, 0x61, 0x27, 0x92, 0x27, 0xfc, + 0x80, 0x81, 0x4c, 0x51, 0x46, 0x3e, 0x03, 0xb3, 0x9c, 0x73, 0x7c, 0xb3, 0x8c, 0xce, 0xe3, 0x01, + 0x03, 0x62, 0xf6, 0x9d, 0x18, 0x01, 0x75, 0x5a, 0xa6, 0x60, 0x94, 0x24, 0x9d, 0x76, 0x44, 0x67, + 0x10, 0xaa, 0xfa, 0xd4, 0x04, 0x55, 0xfd, 0x15, 0x98, 0xd6, 0xc3, 0xd0, 0x8d, 0x44, 0xe4, 0x89, + 0xf9, 0x38, 0xf6, 0x5f, 0xe8, 0x46, 0x8c, 0xb1, 0x83, 0xe5, 0x26, 0xc7, 0xd3, 0xfe, 0xb2, 0x00, + 0x53, 0xf8, 0x2f, 0xde, 0xdb, 0x06, 0x9d, 0xc3, 0xd4, 0xbd, 0x6d, 0xd0, 0x39, 0x34, 0x11, 0x4a, + 0x6e, 0xa2, 0x69, 0x43, 0x64, 0xd1, 0xe3, 0xad, 0x47, 0x9b, 0x7d, 0x37, 0x01, 0x9b, 0x32, 0x4e, + 0xec, 0x66, 0x50, 0xcc, 0x8d, 0x37, 0x73, 0x1e, 0x0a, 0x4d, 0x8b, 0xb7, 0x18, 0x43, 0x96, 0xf9, + 0xa1, 0x59, 0x68, 0x5a, 0xd8, 0x1b, 0x3b, 0xfa, 0xc6, 0x6b, 0xaf, 0xf3, 0x86, 0xb2, 0xde, 0x38, + 0x74, 0x36, 0x5e, 0x7b, 0xdd, 0xe4, 0x25, 0xb4, 0x7f, 0xb1, 0xce, 0x78, 0xfb, 0xcb, 0xc2, 0x22, + 0x60, 0xff, 0x62, 0xdb, 0xf0, 0xa6, 0xd7, 0x4c, 0x10, 0xc8, 0x06, 0xcc, 0xf1, 0xf8, 0x1c, 0x88, + 0x2f, 0xc5, 0xcf, 0xe0, 0xf1, 0x3b, 0x18, 0x85, 0x8c, 0xc4, 0xee, 0x01, 0xf9, 0x00, 0x89, 0x5c, + 0xdf, 0xfc, 0x1e, 0x50, 0x0c, 0x61, 0x68, 0x4a, 0x28, 0xb4, 0x4a, 0xec, 0x22, 0x31, 0x09, 0x77, + 0x80, 0x55, 0xe2, 0xb7, 0x8d, 0x98, 0xbf, 0x24, 0x46, 0xd0, 0x7e, 0xbf, 0x00, 0xe5, 0x56, 0x6f, + 0x78, 0xe0, 0xf5, 0xef, 0xde, 0x24, 0x04, 0xf0, 0x18, 0x27, 0x12, 0xdc, 0xd0, 0xff, 0xc9, 0x45, + 0x28, 0x8b, 0x93, 0x9b, 0x10, 0x48, 0x21, 0x3f, 0xb5, 0xad, 0x82, 0x18, 0x77, 0x1e, 0x9b, 0x4e, + 0xfc, 0x24, 0x37, 0x21, 0x3e, 0x7f, 0x8d, 0x3b, 0xa8, 0x95, 0xe8, 0x62, 0x31, 0x63, 0x34, 0xf2, + 0x22, 0xe0, 0x26, 0xc1, 0x0f, 0x0f, 0xc2, 0x02, 0xce, 0xaa, 0xc6, 0xf5, 0x14, 0x46, 0x82, 0x68, 0xe4, 0xd5, 0x4c, 0x2e, 0xba, 0x73, 0x69, 0x02, 0x96, 0xad, 0x4c, 0x90, 0x88, 0x3c, 0x74, 0x6f, - 0xc1, 0x5c, 0x27, 0x70, 0xd1, 0xf4, 0xe9, 0xf4, 0xc4, 0xfb, 0xdb, 0xb5, 0x14, 0x65, 0x25, 0x29, - 0xbf, 0x7b, 0xd3, 0x94, 0xd1, 0xb5, 0xef, 0xce, 0xc2, 0xbc, 0x5c, 0x1f, 0x62, 0xc2, 0xd9, 0xb0, - 0x47, 0xef, 0xee, 0xdc, 0x2f, 0x70, 0x80, 0x85, 0xfc, 0x38, 0xbd, 0x96, 0xae, 0x10, 0xc5, 0x63, - 0x4e, 0x82, 0x22, 0xb0, 0xc8, 0xce, 0x19, 0x73, 0x39, 0x4c, 0xc0, 0x0c, 0x8f, 0xe8, 0x50, 0xf6, - 0x07, 0xe1, 0x81, 0xdb, 0xf7, 0x84, 0x81, 0xe6, 0xe9, 0x14, 0xa3, 0x26, 0x2f, 0x1c, 0xe1, 0x15, - 0x93, 0x91, 0xd7, 0x60, 0xda, 0x1f, 0xb8, 0x7d, 0xc7, 0xe3, 0x67, 0xdc, 0xa5, 0x0c, 0x03, 0xb7, - 0xaf, 0xd7, 0x24, 0x42, 0x8e, 0x4c, 0x5e, 0x86, 0x92, 0xff, 0x30, 0x1e, 0xaf, 0x8b, 0x69, 0xa2, - 0x87, 0x91, 0x23, 0x91, 0x20, 0x22, 0x25, 0xf8, 0xc0, 0x39, 0xda, 0xe7, 0x23, 0x96, 0x26, 0xb8, - 0xed, 0x1c, 0xed, 0xcb, 0x04, 0x14, 0x91, 0xbc, 0x0b, 0x30, 0x70, 0x0e, 0xdc, 0xc0, 0xee, 0x0e, - 0xa3, 0x63, 0x3e, 0x6e, 0x57, 0x52, 0x64, 0x2d, 0x5a, 0x5c, 0x1d, 0x46, 0xc7, 0x12, 0xed, 0xec, - 0x40, 0x00, 0x89, 0x0e, 0x70, 0xe4, 0x44, 0x91, 0x1b, 0x1c, 0xf9, 0xdc, 0x31, 0x33, 0x89, 0x64, - 0xc9, 0x18, 0xec, 0xc6, 0xc5, 0x12, 0x07, 0x89, 0x08, 0x2b, 0xed, 0x05, 0x0e, 0x9a, 0xe1, 0x47, - 0x2a, 0xed, 0x05, 0xa9, 0x56, 0x52, 0x44, 0xf2, 0x26, 0xcc, 0x74, 0xbd, 0xb0, 0xe3, 0x07, 0x5d, - 0x1e, 0x71, 0xe6, 0x72, 0x8a, 0xa6, 0xca, 0xca, 0x24, 0x32, 0x81, 0x4e, 0x6b, 0xcb, 0x23, 0xd9, - 0x36, 0xfc, 0x47, 0x68, 0x17, 0xc8, 0xd6, 0xd6, 0x8a, 0x8b, 0xe5, 0xda, 0x26, 0x44, 0x74, 0x28, - 0x0f, 0xbc, 0xa8, 0xe7, 0x3c, 0xe0, 0xc6, 0xf6, 0xf4, 0x50, 0x6e, 0x63, 0x91, 0x3c, 0x94, 0x0c, - 0x99, 0xdc, 0x82, 0xb2, 0x48, 0x6e, 0xc1, 0x5f, 0xb5, 0xa6, 0x2b, 0xcd, 0x93, 0x53, 0xc8, 0x95, - 0xe6, 0xe9, 0x2c, 0x68, 0xff, 0x84, 0x1d, 0xef, 0x88, 0x3f, 0x46, 0x4d, 0xf7, 0x8f, 0x55, 0xa9, - 0xed, 0xca, 0xfd, 0x43, 0x11, 0xc9, 0x3b, 0x30, 0x43, 0xd7, 0x6f, 0xd7, 0x3f, 0xe0, 0x31, 0x3b, - 0xb4, 0x74, 0xff, 0xb0, 0xb2, 0x91, 0xe9, 0x2a, 0x88, 0xe8, 0x42, 0x76, 0x1e, 0x85, 0xb6, 0xd7, - 0xc1, 0x00, 0xa7, 0xd9, 0xe5, 0xa8, 0xdf, 0xb3, 0x6a, 0x15, 0x89, 0x6c, 0xca, 0x79, 0x14, 0xd6, - 0x3a, 0x64, 0x03, 0xa6, 0x30, 0xf7, 0x0b, 0x8f, 0x66, 0x9a, 0xa6, 0xc1, 0xac, 0x2f, 0x32, 0x0d, - 0xa2, 0xd2, 0x81, 0x3c, 0x0a, 0xf1, 0x7d, 0x0f, 0xcf, 0xc0, 0x92, 0xee, 0x93, 0x5d, 0x0b, 0x1f, - 0xfd, 0xc8, 0x55, 0xe4, 0xe8, 0xb4, 0x8a, 0x7d, 0x37, 0xb2, 0xbd, 0x0f, 0x79, 0x0e, 0x95, 0xf4, - 0xe7, 0x1a, 0x6e, 0x54, 0x7b, 0x4f, 0xfe, 0x5c, 0xdf, 0x8d, 0x6a, 0x1f, 0xf2, 0xa1, 0x3b, 0x1c, - 0x3e, 0x40, 0xe5, 0x7b, 0xce, 0xd0, 0x1d, 0x0e, 0xb3, 0x43, 0x77, 0x38, 0x7c, 0x40, 0xc9, 0xbc, - 0x7e, 0x34, 0xec, 0xbb, 0xfc, 0x75, 0x69, 0x9a, 0xac, 0x86, 0x45, 0x32, 0x19, 0x43, 0x26, 0x57, - 0x00, 0x12, 0x6f, 0x07, 0x66, 0x47, 0x32, 0x25, 0xc8, 0x67, 0x4b, 0xff, 0xfd, 0x9f, 0x5e, 0x55, - 0x36, 0x01, 0xca, 0x22, 0xf0, 0x11, 0x15, 0xc3, 0x57, 0xf2, 0xea, 0x42, 0xae, 0xc3, 0xbc, 0x1c, - 0x96, 0x89, 0x1f, 0x06, 0x73, 0xce, 0xc0, 0x13, 0x81, 0x99, 0x26, 0x67, 0xd7, 0x78, 0x01, 0x96, - 0x53, 0x8f, 0xb0, 0x12, 0xb7, 0x45, 0x53, 0x95, 0x0b, 0xf0, 0xec, 0xad, 0x00, 0x84, 0x91, 0x13, - 0x44, 0x76, 0xd7, 0x89, 0x4e, 0xa3, 0x46, 0x2e, 0xd3, 0xfd, 0x9c, 0xf9, 0xbc, 0x23, 0x5d, 0xd5, - 0x89, 0x5c, 0xd6, 0x38, 0xad, 0x0e, 0x17, 0xc7, 0xee, 0xb5, 0xe4, 0x79, 0x50, 0xf7, 0x1d, 0xae, - 0x69, 0xed, 0x1c, 0x3a, 0xfd, 0xbe, 0xdb, 0xe3, 0x0d, 0x5b, 0x12, 0xf0, 0x0a, 0x03, 0x73, 0x6e, - 0xef, 0x4a, 0xbd, 0x23, 0x2d, 0xb2, 0x53, 0xf4, 0x0e, 0x67, 0xf0, 0x6d, 0x05, 0x2e, 0x4f, 0xda, - 0xb2, 0xc9, 0x1a, 0x94, 0x07, 0x81, 0xe7, 0xe3, 0xd5, 0x80, 0xf7, 0xa1, 0xf8, 0x8d, 0xc9, 0x47, - 0x50, 0x86, 0x8d, 0x9c, 0x03, 0xfe, 0xaa, 0xc9, 0x9c, 0x45, 0x48, 0xdb, 0x39, 0x08, 0x69, 0x17, - 0x77, 0xdd, 0x7d, 0x67, 0xd8, 0x8b, 0xec, 0xb0, 0x73, 0xe8, 0x76, 0xf1, 0xdd, 0x21, 0xfa, 0x7b, - 0x9a, 0x2a, 0x2f, 0xb0, 0x04, 0x7c, 0xa4, 0xc6, 0x53, 0x63, 0x6a, 0x7c, 0xbb, 0x54, 0x56, 0xd4, - 0x82, 0x89, 0x2e, 0x72, 0xda, 0x57, 0x0a, 0xb0, 0x3a, 0x6e, 0x8f, 0x22, 0x6f, 0xe7, 0xf5, 0x01, - 0xb3, 0x2e, 0xc9, 0x70, 0xd9, 0xba, 0x24, 0xcf, 0x9e, 0x0d, 0x88, 0x5f, 0x0d, 0x9e, 0x14, 0x01, - 0x44, 0xc0, 0x28, 0xcd, 0xc0, 0x09, 0xc3, 0x47, 0x74, 0x1b, 0x2e, 0x4a, 0x91, 0xa8, 0x39, 0x4c, - 0xa6, 0x11, 0x30, 0xf2, 0x06, 0x40, 0xa7, 0xe7, 0x87, 0x2e, 0x3a, 0x71, 0x70, 0xf9, 0x8e, 0xbd, - 0x85, 0x88, 0xa1, 0xb2, 0xd5, 0x1e, 0xa1, 0x15, 0xbf, 0x2b, 0xe6, 0x93, 0x03, 0x17, 0xc6, 0x1c, - 0x4a, 0x74, 0x78, 0xf0, 0x19, 0x20, 0xdb, 0x83, 0x78, 0xe2, 0x3e, 0x0a, 0x61, 0x09, 0xa7, 0xb2, - 0x3d, 0x5e, 0x18, 0x37, 0x47, 0x8e, 0x81, 0x8c, 0x9e, 0x3c, 0x94, 0x3b, 0xf7, 0xfd, 0x1f, 0x06, - 0x31, 0x77, 0x06, 0xd9, 0x0b, 0x7a, 0xe4, 0x2a, 0xcc, 0x89, 0x2c, 0xca, 0xf4, 0xfe, 0xc4, 0x98, - 0x03, 0x07, 0xdd, 0x71, 0x71, 0xf2, 0x60, 0x18, 0x5f, 0x96, 0x48, 0x88, 0xad, 0xbc, 0x59, 0x84, - 0xb4, 0x8f, 0x07, 0xa2, 0x75, 0x97, 0xc5, 0xfc, 0x4e, 0xcb, 0x03, 0xbc, 0xf4, 0x1f, 0x28, 0x62, - 0xf8, 0x47, 0x0f, 0xd4, 0x93, 0xea, 0x47, 0x00, 0x9f, 0xe6, 0xf1, 0x8a, 0xe1, 0xff, 0x54, 0x52, - 0x14, 0xab, 0x8e, 0x4b, 0x8a, 0xfc, 0x27, 0xb9, 0x01, 0x4b, 0x01, 0x73, 0x7f, 0x8e, 0x7c, 0xde, - 0x9f, 0x2c, 0xd7, 0xce, 0x02, 0x03, 0xb7, 0x7d, 0xec, 0x53, 0x5e, 0xaf, 0xdb, 0x71, 0x87, 0x49, - 0xf2, 0x05, 0x79, 0x09, 0x66, 0xa9, 0x7c, 0x81, 0x01, 0xa0, 0x32, 0x6f, 0x82, 0x10, 0x0f, 0xa5, - 0x35, 0xb3, 0xfc, 0x01, 0xff, 0x9f, 0xf3, 0xfa, 0xb5, 0x78, 0x03, 0x4c, 0xef, 0xaa, 0xe4, 0x3c, - 0x4c, 0xb3, 0xec, 0xdf, 0xbc, 0x6d, 0xfc, 0x17, 0x79, 0x16, 0x16, 0xd9, 0x43, 0xde, 0xcc, 0xc0, - 0x2e, 0x20, 0x34, 0x9e, 0xde, 0xa7, 0x4b, 0xd4, 0xc4, 0x2b, 0xf1, 0x87, 0x05, 0xd1, 0x22, 0x59, - 0xc4, 0x22, 0x17, 0x60, 0xc6, 0x0f, 0x0e, 0xa4, 0xfe, 0x9d, 0xf6, 0x83, 0x03, 0xda, 0xb9, 0xcf, - 0x81, 0xca, 0xde, 0xc9, 0xb1, 0x78, 0x25, 0xe1, 0x71, 0xbf, 0xc3, 0xdf, 0x4a, 0x2c, 0x32, 0xf8, - 0x5e, 0xe8, 0x06, 0xd6, 0x71, 0xbf, 0x43, 0x31, 0xc3, 0xd0, 0xb7, 0xe5, 0x60, 0x72, 0xbc, 0x22, - 0x8b, 0x61, 0xe8, 0x27, 0x51, 0xe5, 0xba, 0x64, 0x13, 0x16, 0x28, 0x9f, 0x38, 0x26, 0x1e, 0xdf, - 0x86, 0x9f, 0x1a, 0x95, 0x00, 0x8f, 0xfb, 0x1d, 0x51, 0x45, 0x73, 0x3e, 0x94, 0x7e, 0x91, 0x3b, - 0xa0, 0x4a, 0xa2, 0x32, 0x3e, 0x9c, 0xce, 0xbc, 0x07, 0x48, 0xd8, 0x48, 0x22, 0x76, 0xad, 0xbf, - 0xef, 0x9b, 0x4b, 0x9d, 0x34, 0x20, 0xde, 0x8e, 0xa6, 0xd5, 0x19, 0x73, 0x95, 0x37, 0x37, 0x44, - 0x57, 0x51, 0xbb, 0xe7, 0x1f, 0xd8, 0xee, 0xc7, 0x74, 0x62, 0x68, 0xff, 0x44, 0x11, 0x1b, 0x7e, - 0x0e, 0x53, 0xa2, 0xc1, 0xc2, 0xa1, 0x13, 0xda, 0x61, 0x78, 0xc4, 0x3c, 0x18, 0x79, 0x48, 0xee, - 0xb9, 0x43, 0x27, 0xb4, 0xc2, 0x23, 0x91, 0x40, 0xe8, 0x1c, 0xc5, 0xf1, 0x9d, 0x61, 0x74, 0x68, - 0xcb, 0x17, 0x03, 0xd6, 0xa3, 0x67, 0x0f, 0x9d, 0xb0, 0x49, 0xcb, 0x24, 0xde, 0xe4, 0x19, 0x58, - 0x44, 0xbe, 0x1d, 0x4f, 0x30, 0xc6, 0x98, 0x34, 0xe6, 0x3c, 0x65, 0xdc, 0xf1, 0x18, 0x67, 0x3e, - 0xb8, 0x3f, 0x29, 0xc1, 0xf9, 0xfc, 0xde, 0xc3, 0x35, 0x44, 0xfb, 0x1c, 0x5f, 0xcf, 0xf2, 0xba, - 0xcd, 0x52, 0x08, 0x8b, 0x27, 0x94, 0x37, 0x78, 0x85, 0xdc, 0xc1, 0x5b, 0x87, 0x65, 0x64, 0xc4, - 0xaf, 0x20, 0x3d, 0x2f, 0x8c, 0x78, 0x98, 0x1c, 0x73, 0x89, 0x16, 0xb0, 0x43, 0xa7, 0x4e, 0xc1, - 0x74, 0x66, 0x8a, 0x63, 0xc3, 0x7f, 0xd4, 0xa7, 0x1f, 0x66, 0x67, 0xc6, 0x02, 0x87, 0x36, 0x11, - 0x48, 0xce, 0xc1, 0xb4, 0x33, 0x18, 0xd0, 0x4f, 0xb2, 0xa3, 0x62, 0xca, 0x19, 0x0c, 0x58, 0xd6, - 0x2c, 0x96, 0x9f, 0x6c, 0x1f, 0xfd, 0xcd, 0xc4, 0x4b, 0x80, 0x79, 0x04, 0x32, 0x1f, 0x34, 0x7c, - 0x4b, 0x40, 0x69, 0x05, 0xca, 0x0c, 0xa2, 0x80, 0x33, 0x88, 0x11, 0x2e, 0x42, 0x59, 0x78, 0x3e, - 0xb0, 0xc7, 0x51, 0xe6, 0x8c, 0xc3, 0xbd, 0x1e, 0x5e, 0x83, 0x0b, 0x3c, 0x19, 0x9a, 0xcd, 0x9a, - 0x34, 0x18, 0xf0, 0xd7, 0xc9, 0x2c, 0x1c, 0xb6, 0xb9, 0xc2, 0x8b, 0x69, 0x4f, 0xea, 0x83, 0x41, - 0xfc, 0x46, 0x79, 0x4d, 0x90, 0x3d, 0xf0, 0x58, 0xd8, 0x3e, 0xe6, 0xfd, 0x8b, 0x8b, 0x03, 0x90, - 0x72, 0x95, 0x63, 0x6c, 0xca, 0x08, 0x62, 0x99, 0xc4, 0x2b, 0xc9, 0x66, 0x8a, 0x4f, 0x2e, 0x3e, - 0xa1, 0x7d, 0x1c, 0x07, 0x0d, 0xa1, 0xe4, 0x0d, 0x18, 0x3b, 0x17, 0x51, 0x3a, 0x2f, 0x9b, 0xe7, - 0x58, 0x39, 0xf3, 0x6a, 0xae, 0xfb, 0x07, 0x06, 0x16, 0x92, 0x77, 0xe1, 0xb2, 0xa8, 0xa0, 0x13, - 0x86, 0xde, 0x41, 0xdf, 0x16, 0xa3, 0x80, 0x8e, 0x27, 0x28, 0xa1, 0x97, 0xcd, 0x8b, 0x1c, 0x47, - 0x47, 0x94, 0x2a, 0xc3, 0x60, 0xaf, 0x5b, 0x5f, 0x81, 0x95, 0xc8, 0x3b, 0x72, 0xed, 0x07, 0x6e, - 0xf4, 0xc8, 0x75, 0xfb, 0xb6, 0x77, 0x44, 0xf9, 0xb2, 0x80, 0x31, 0xb3, 0x26, 0xa1, 0x65, 0x9b, - 0xac, 0xa8, 0xc6, 0x4a, 0xf8, 0xfc, 0x7b, 0x13, 0x96, 0xf8, 0xf5, 0x84, 0xcb, 0x36, 0x38, 0x3e, - 0x7c, 0xe7, 0xc5, 0xc7, 0x1c, 0x2c, 0x77, 0x1b, 0x70, 0x50, 0xad, 0x2b, 0x28, 0xff, 0x54, 0x81, - 0x73, 0xb9, 0xf7, 0x1b, 0xf2, 0xcb, 0xc0, 0x1e, 0xa8, 0x46, 0xbe, 0x1d, 0xb8, 0x1d, 0x6f, 0xe0, - 0x61, 0xc4, 0x1f, 0xa6, 0xff, 0xdf, 0x98, 0x74, 0x33, 0xc2, 0xc7, 0xae, 0x6d, 0xdf, 0x8c, 0x89, - 0x98, 0x62, 0x52, 0x0d, 0x32, 0xe0, 0xb5, 0xf7, 0xe1, 0x5c, 0x2e, 0x6a, 0x8e, 0xc2, 0xf0, 0x33, - 0xb2, 0xc2, 0x30, 0xb1, 0xe8, 0x66, 0x1a, 0x2d, 0x29, 0x12, 0x79, 0xf3, 0xfe, 0x28, 0x6e, 0x5e, - 0xe6, 0x26, 0x44, 0x8c, 0xec, 0x5e, 0x98, 0x77, 0x99, 0x17, 0x44, 0xe3, 0xb7, 0xc3, 0xf7, 0xe1, - 0x1c, 0x5f, 0x90, 0xec, 0x28, 0x88, 0xd9, 0xb1, 0x8a, 0xfe, 0x42, 0x1e, 0x3b, 0xb6, 0x52, 0xb7, - 0x29, 0x7e, 0xcc, 0xf5, 0xac, 0x33, 0x0a, 0xe4, 0x6d, 0xf8, 0xb7, 0x05, 0xb1, 0xfd, 0xe5, 0x54, - 0x27, 0x67, 0xa9, 0x2b, 0x79, 0x4b, 0xfd, 0xf4, 0xfb, 0x4c, 0x03, 0x88, 0xbc, 0xc1, 0xf3, 0x95, - 0xc2, 0xdc, 0x15, 0xaf, 0xa6, 0x33, 0x25, 0x4a, 0xdb, 0x25, 0x5b, 0x3a, 0xe6, 0x72, 0x27, 0x0b, - 0xa2, 0x57, 0x08, 0x76, 0xac, 0xd2, 0x4f, 0xb2, 0x13, 0xbf, 0xcc, 0x00, 0xb5, 0x2e, 0xb9, 0x06, - 0xf3, 0xec, 0xfe, 0x9a, 0xda, 0x87, 0x00, 0x61, 0x3a, 0x6e, 0x46, 0x6f, 0xe5, 0x6d, 0x46, 0x89, - 0x21, 0x82, 0x8b, 0xae, 0xc7, 0xfd, 0x0e, 0xdb, 0x77, 0xd2, 0xbb, 0x14, 0xef, 0xc1, 0xdf, 0x28, - 0x80, 0x9a, 0x45, 0x24, 0x1a, 0x14, 0xbc, 0xee, 0x38, 0x4f, 0x9a, 0x9d, 0x33, 0x66, 0xc1, 0xeb, - 0x92, 0x5b, 0x00, 0x98, 0x33, 0x34, 0x70, 0x0f, 0xdc, 0x8f, 0xb9, 0x08, 0x8b, 0x82, 0x65, 0x02, - 0x4d, 0xd1, 0xcc, 0xa2, 0xb2, 0x91, 0x82, 0xc9, 0x4d, 0x00, 0xf7, 0xe3, 0x4e, 0x6f, 0xd8, 0x75, - 0xe3, 0xf3, 0x38, 0xe7, 0x33, 0x8a, 0x39, 0xcb, 0xb1, 0x6a, 0x5d, 0xb2, 0x03, 0x44, 0x90, 0x48, - 0x5f, 0x2d, 0x9d, 0xf0, 0x55, 0xc5, 0x54, 0x39, 0x55, 0x43, 0x7c, 0x9c, 0x5f, 0x02, 0x67, 0x61, - 0xc6, 0xeb, 0x63, 0x09, 0xfd, 0x97, 0x23, 0x69, 0xbf, 0xaa, 0xc0, 0xb5, 0x93, 0xa6, 0x23, 0xb9, - 0x07, 0xe7, 0xd1, 0xff, 0x2c, 0xf4, 0xe3, 0x19, 0x6d, 0x77, 0x9c, 0xce, 0xa1, 0xcb, 0x37, 0x00, - 0x2d, 0x77, 0x5e, 0x0f, 0x06, 0x96, 0xd5, 0x94, 0xa6, 0xf4, 0x60, 0x60, 0x85, 0xbe, 0xf8, 0x5d, - 0xa1, 0xe4, 0x7c, 0x40, 0xba, 0x70, 0x69, 0x02, 0xa5, 0x74, 0x2e, 0x29, 0xf2, 0xb9, 0xf4, 0x1c, - 0xa8, 0xfb, 0x6e, 0x97, 0x5e, 0x74, 0xdd, 0x2e, 0x56, 0xed, 0xa3, 0x0d, 0x1c, 0x93, 0x79, 0x73, - 0x31, 0x86, 0x5b, 0xa1, 0x7f, 0x77, 0x83, 0x7f, 0xe5, 0x0f, 0x62, 0x91, 0x4b, 0xd6, 0x67, 0x90, - 0x0d, 0x38, 0x9b, 0x89, 0x4c, 0x25, 0x85, 0x3a, 0x29, 0xac, 0x2a, 0xe6, 0x32, 0x2d, 0x4e, 0xc7, - 0x32, 0x7c, 0x16, 0xe6, 0xe5, 0xad, 0x9c, 0x4f, 0x05, 0x8a, 0x3c, 0xd7, 0x4d, 0x36, 0x70, 0xf2, - 0x00, 0x16, 0xa5, 0x15, 0x46, 0x45, 0xa3, 0x62, 0xce, 0x36, 0x20, 0xd7, 0xe6, 0xa5, 0x64, 0xe9, - 0xf5, 0xf7, 0x7d, 0xe6, 0x86, 0x95, 0x66, 0x61, 0x2e, 0x74, 0x64, 0x94, 0xb5, 0xf7, 0xa4, 0xd0, - 0x8c, 0x28, 0x00, 0x5d, 0x86, 0x52, 0x3f, 0x37, 0xc6, 0x7a, 0x9f, 0xa5, 0x2d, 0x2f, 0x45, 0xb9, - 0x91, 0x84, 0xa3, 0xf8, 0x8a, 0xc0, 0xbb, 0x6b, 0x28, 0x06, 0x25, 0x57, 0x93, 0x73, 0x1a, 0x6d, - 0xc1, 0x8b, 0x40, 0xe2, 0xbb, 0x77, 0x7c, 0x66, 0xf0, 0x6d, 0x66, 0x59, 0x94, 0xc4, 0x9b, 0x3d, - 0xff, 0xec, 0xbf, 0x9a, 0x86, 0xb3, 0x39, 0x2a, 0x20, 0xf2, 0x22, 0xa8, 0x5e, 0x3f, 0x72, 0x0f, - 0x02, 0x49, 0xb9, 0x90, 0x8c, 0xd1, 0x92, 0x54, 0xc6, 0x75, 0xfb, 0xd3, 0x81, 0x7b, 0x10, 0xdb, - 0x09, 0x4c, 0xfe, 0x8b, 0x9e, 0x25, 0x4e, 0x20, 0xd4, 0xd6, 0xf4, 0x5f, 0x52, 0x83, 0x65, 0xcc, - 0x6b, 0x14, 0x7a, 0x3e, 0xa6, 0x47, 0xc2, 0xcb, 0x44, 0x29, 0xa5, 0x28, 0xc2, 0x9a, 0xb4, 0x24, - 0x24, 0x7a, 0x9b, 0x30, 0xd5, 0x41, 0x06, 0x42, 0x3e, 0x07, 0x6b, 0x92, 0x38, 0x66, 0x67, 0x36, - 0x62, 0x7c, 0xaa, 0x64, 0x5e, 0x70, 0x62, 0xc1, 0xac, 0x9a, 0xda, 0x92, 0x37, 0x81, 0x25, 0xb0, - 0xf7, 0xba, 0x03, 0x7b, 0x24, 0x11, 0x16, 0x36, 0x97, 0x65, 0x65, 0x59, 0xa3, 0x58, 0xb5, 0xee, - 0x20, 0x93, 0x13, 0x0b, 0x5b, 0xdd, 0xca, 0xdd, 0xac, 0x67, 0x70, 0xb3, 0x7e, 0x4a, 0x6e, 0xcc, - 0xc8, 0x56, 0xcd, 0x66, 0xfa, 0xe8, 0x76, 0x7d, 0x00, 0xcb, 0x89, 0x98, 0x24, 0xf6, 0xdc, 0x32, - 0x2e, 0xfa, 0x35, 0x99, 0xa1, 0xb8, 0x7e, 0xb0, 0xdd, 0x94, 0x05, 0x9b, 0x19, 0x21, 0x94, 0x43, - 0x2a, 0x0d, 0x53, 0x04, 0x21, 0xa9, 0xc3, 0x8a, 0xf3, 0x28, 0x14, 0x69, 0xb1, 0xc3, 0xf8, 0x5b, - 0xb3, 0xa3, 0xdf, 0x12, 0x86, 0x6a, 0xbe, 0xc5, 0x13, 0xe7, 0x51, 0xc8, 0xb3, 0x65, 0x87, 0x82, - 0xdb, 0x07, 0x40, 0xd8, 0x31, 0x91, 0xaa, 0x37, 0x9c, 0xc4, 0x8b, 0xe7, 0xd4, 0x1e, 0xa1, 0x94, - 0x03, 0x43, 0x62, 0xa9, 0x5c, 0xf3, 0x76, 0xda, 0xb8, 0x30, 0x97, 0xb2, 0x8c, 0x67, 0x7b, 0x9b, - 0x59, 0xed, 0x25, 0x7c, 0x59, 0x59, 0x22, 0x81, 0xf1, 0x7e, 0x8c, 0x81, 0xe3, 0xb0, 0x1e, 0x47, - 0x7e, 0xd7, 0x65, 0xde, 0xde, 0xe6, 0x02, 0x82, 0x69, 0x05, 0x76, 0x13, 0x9d, 0xc5, 0x37, 0x14, - 0x50, 0xb3, 0x9f, 0x22, 0x6f, 0xc1, 0x34, 0x93, 0x58, 0xb9, 0x30, 0xa3, 0xe5, 0xd7, 0x89, 0x8d, - 0x34, 0x13, 0x5e, 0x77, 0xce, 0x98, 0x9c, 0x86, 0xbc, 0x0e, 0x25, 0xdf, 0xeb, 0x0a, 0x4b, 0xff, - 0xb5, 0x49, 0xb4, 0xcd, 0x5a, 0xb5, 0x82, 0xd6, 0x01, 0xaf, 0xcb, 0x2f, 0xd9, 0x9b, 0x65, 0x98, - 0x66, 0x1d, 0xab, 0x7d, 0x00, 0x97, 0x26, 0x7c, 0x90, 0x18, 0xb0, 0x94, 0xf1, 0x82, 0x38, 0xa5, - 0x83, 0x84, 0x93, 0x38, 0x48, 0x04, 0xe2, 0xe2, 0xd5, 0x83, 0x8b, 0x63, 0x2b, 0x48, 0x6a, 0x63, - 0x77, 0x10, 0x0c, 0x6d, 0x94, 0x2d, 0x93, 0x27, 0x6b, 0x66, 0x77, 0xe1, 0x5f, 0xfb, 0xcd, 0x02, - 0x9c, 0xcd, 0x99, 0x44, 0xff, 0xdf, 0x8a, 0x12, 0x7f, 0xa0, 0xf0, 0xfe, 0x48, 0x6f, 0x06, 0xa4, - 0x0d, 0xdc, 0xc9, 0x86, 0x6f, 0x1c, 0x37, 0xc6, 0x6f, 0x1c, 0xb2, 0xef, 0x02, 0x8f, 0x71, 0x85, - 0x00, 0xd9, 0x42, 0xcf, 0x20, 0x4f, 0xe0, 0x55, 0xc0, 0x87, 0xef, 0x7d, 0x38, 0x97, 0xbb, 0xb1, - 0xd3, 0xab, 0x2a, 0x3a, 0xf7, 0x27, 0x5a, 0x98, 0x19, 0xfa, 0x7b, 0x2f, 0x40, 0x0d, 0xdf, 0x03, - 0xd7, 0x09, 0xdc, 0x80, 0xeb, 0x00, 0xb8, 0x86, 0x8f, 0xc1, 0x64, 0x15, 0x40, 0x37, 0x7d, 0x8a, - 0x71, 0xb3, 0x24, 0xd9, 0x85, 0xb3, 0x6c, 0x77, 0x61, 0x57, 0x39, 0x9b, 0x9b, 0x32, 0x95, 0x94, - 0xe2, 0x05, 0x49, 0xf0, 0x92, 0xcb, 0xae, 0x75, 0x8c, 0xda, 0x5c, 0x3e, 0xc8, 0x82, 0xa8, 0xf0, - 0x76, 0x3e, 0x1f, 0x9b, 0x6c, 0xc2, 0x1c, 0x63, 0xce, 0xb4, 0xa0, 0xcc, 0x07, 0xe5, 0xfa, 0xc4, - 0x2f, 0x54, 0xf0, 0xcd, 0x5b, 0x18, 0xff, 0x4f, 0x6f, 0xfe, 0xe8, 0xee, 0x67, 0x1f, 0xc9, 0x2e, - 0x36, 0xe6, 0x3c, 0x02, 0xb9, 0x6b, 0x8d, 0xf6, 0x5f, 0x15, 0xd1, 0xd4, 0x94, 0xfd, 0x85, 0x9e, - 0xc0, 0xa1, 0xdb, 0x17, 0x6e, 0x46, 0xb3, 0x26, 0xff, 0xf5, 0x98, 0x52, 0x01, 0x79, 0x03, 0xe6, - 0x29, 0xdb, 0x83, 0x61, 0x9f, 0x9d, 0xcc, 0xc5, 0x54, 0xec, 0xcd, 0x5d, 0x56, 0x44, 0x87, 0x6d, - 0xe7, 0x8c, 0x39, 0x77, 0x94, 0xfc, 0x24, 0x2f, 0xc1, 0x6c, 0x78, 0x14, 0x0d, 0xe4, 0xf3, 0x5c, - 0xd8, 0xa2, 0xad, 0xdd, 0x76, 0x8b, 0x93, 0x94, 0x29, 0x4e, 0xa2, 0x1c, 0xdc, 0x9c, 0x66, 0xd6, - 0x68, 0xed, 0x05, 0x98, 0x93, 0x78, 0xd3, 0xc6, 0xb0, 0x17, 0xe2, 0xa2, 0x31, 0xec, 0x17, 0x1f, - 0xec, 0x07, 0x50, 0x16, 0x2c, 0x09, 0x81, 0xd2, 0xa1, 0x1f, 0x0a, 0x79, 0x08, 0xff, 0xa7, 0x30, - 0xd4, 0x16, 0xd0, 0x46, 0x4e, 0x99, 0xf8, 0x3f, 0xde, 0xc0, 0xd0, 0x00, 0x82, 0x11, 0xdb, 0xf1, - 0x55, 0x40, 0xac, 0xa6, 0xa3, 0xf0, 0x76, 0x2f, 0x64, 0x6f, 0x05, 0x84, 0xc2, 0x30, 0xbe, 0xba, - 0x66, 0x0c, 0x56, 0xe3, 0xc4, 0xe3, 0xd4, 0x45, 0xab, 0x30, 0x7a, 0xd1, 0x62, 0x31, 0x15, 0x39, - 0x25, 0xfb, 0x32, 0x20, 0x8c, 0x5d, 0xb4, 0x12, 0x01, 0xaa, 0x94, 0x12, 0xa0, 0x24, 0x13, 0x44, - 0x32, 0x7a, 0xec, 0x9e, 0x26, 0x4c, 0x10, 0x59, 0x91, 0xee, 0x5b, 0xf1, 0x0c, 0x49, 0x99, 0xcc, - 0xc8, 0x06, 0x9c, 0x63, 0x2a, 0x38, 0x96, 0x7c, 0x2e, 0x2b, 0x4b, 0x9e, 0xc5, 0x42, 0x96, 0xeb, - 0x33, 0x96, 0x29, 0x4f, 0x56, 0xb1, 0x93, 0x57, 0x60, 0x25, 0x4e, 0x3d, 0x1f, 0x3e, 0xf4, 0x06, - 0x2c, 0x53, 0xee, 0x31, 0x57, 0x8e, 0x11, 0x51, 0x66, 0x3d, 0xf4, 0x06, 0x98, 0x35, 0x57, 0xf4, - 0xf0, 0xef, 0x15, 0x84, 0xe1, 0x66, 0xd3, 0xf7, 0xa3, 0x30, 0x0a, 0x9c, 0x41, 0xca, 0x29, 0x80, - 0x1c, 0xc1, 0x45, 0xac, 0xd2, 0x06, 0x66, 0xdb, 0xf3, 0x03, 0x61, 0xe8, 0x8a, 0x17, 0xd8, 0xdc, - 0xc6, 0xcb, 0x69, 0xa5, 0xa7, 0x4e, 0xb1, 0x75, 0x19, 0x99, 0xae, 0x2b, 0x89, 0xeb, 0xce, 0x19, - 0xf3, 0x02, 0xe3, 0x39, 0x82, 0x45, 0x76, 0x72, 0xf6, 0x9a, 0xac, 0x57, 0xc0, 0x66, 0xb2, 0xf1, - 0xa4, 0xb9, 0xca, 0x5b, 0x12, 0x79, 0x07, 0x66, 0xbd, 0xae, 0x9c, 0xf3, 0x3e, 0x6b, 0x8f, 0xae, - 0x75, 0x59, 0xae, 0x9b, 0x84, 0x07, 0x5d, 0x1a, 0x1e, 0x87, 0x6e, 0x2e, 0xa4, 0x24, 0x1c, 0x6d, - 0x47, 0xd8, 0x08, 0x46, 0xc9, 0xc8, 0x62, 0x72, 0xf6, 0xe1, 0x39, 0x87, 0xbb, 0x40, 0x92, 0x6d, - 0xc7, 0xe4, 0xbf, 0x78, 0x97, 0xff, 0x0a, 0x3c, 0x77, 0xda, 0x9e, 0xa2, 0xfb, 0xc6, 0x98, 0x6e, - 0x9f, 0x65, 0x91, 0xf6, 0xd3, 0xbd, 0x77, 0x1d, 0xe4, 0x0c, 0x21, 0x9e, 0x98, 0x28, 0x02, 0xb6, - 0x17, 0x78, 0xda, 0x5f, 0x14, 0x61, 0x31, 0xed, 0x36, 0x42, 0x5e, 0x80, 0x92, 0xb4, 0x5d, 0x5e, - 0xc8, 0xf1, 0x2d, 0xc1, 0x4d, 0x12, 0x91, 0x4e, 0xb5, 0x3d, 0x92, 0xdb, 0xb0, 0x88, 0x2f, 0x5f, - 0x50, 0x8c, 0x8b, 0x3c, 0x6e, 0x12, 0x3d, 0xad, 0xb1, 0x73, 0x9e, 0xd2, 0xd2, 0xe3, 0x91, 0x16, - 0x4a, 0x5e, 0x01, 0xa5, 0xf1, 0x5e, 0x01, 0xbc, 0x29, 0x63, 0xbc, 0x02, 0xa6, 0x26, 0x78, 0x05, - 0x24, 0x94, 0xb2, 0x57, 0x00, 0xfa, 0x86, 0xcc, 0x8c, 0xf3, 0x0d, 0x49, 0x68, 0x98, 0x6f, 0x48, - 0x62, 0xd5, 0x2f, 0x8f, 0xb5, 0xea, 0x27, 0x34, 0xdc, 0xaa, 0x9f, 0xd8, 0xd9, 0x67, 0xc7, 0xda, - 0xd9, 0x25, 0x22, 0x66, 0x67, 0x7f, 0x86, 0x77, 0x6c, 0xe0, 0x3c, 0xb2, 0xb1, 0xc7, 0xf9, 0xfd, - 0x08, 0xbb, 0xcc, 0x74, 0x1e, 0xa1, 0x87, 0x3a, 0x15, 0x4f, 0xb8, 0x5b, 0xbb, 0xf6, 0xed, 0xcc, - 0x36, 0x24, 0xc6, 0xfc, 0x59, 0x58, 0x64, 0xa7, 0x31, 0xcf, 0xe0, 0xc0, 0x8e, 0xe3, 0x05, 0x73, - 0x41, 0x40, 0x99, 0x6a, 0xfe, 0x17, 0x60, 0x29, 0x46, 0xe3, 0xda, 0x69, 0x0c, 0xb9, 0x61, 0xc6, - 0xd4, 0x5c, 0x2f, 0x2d, 0xf3, 0x0b, 0x78, 0x74, 0xca, 0x14, 0x3f, 0xa6, 0xdc, 0x7d, 0x11, 0x48, - 0x82, 0x16, 0x3f, 0xf2, 0x29, 0x21, 0xea, 0x72, 0x8c, 0x1a, 0xbf, 0xc4, 0xf9, 0x1d, 0x25, 0x63, - 0x98, 0xfe, 0x59, 0x55, 0xff, 0x05, 0x88, 0xbf, 0x6e, 0x73, 0xe3, 0xa2, 0x68, 0x81, 0x2a, 0x0a, - 0x5a, 0x1c, 0xae, 0x1d, 0x64, 0xf5, 0xa9, 0x3f, 0xa3, 0x5a, 0x69, 0xbf, 0x57, 0x4a, 0xd9, 0xcb, - 0xc4, 0x67, 0xa8, 0x94, 0x13, 0xfa, 0x36, 0x1f, 0x62, 0xbe, 0x09, 0x5f, 0x1f, 0x33, 0x4d, 0xf9, - 0xb3, 0x06, 0xcb, 0x6a, 0x9a, 0x10, 0x86, 0xbe, 0x78, 0xe5, 0x60, 0x33, 0xe5, 0x96, 0x74, 0xeb, - 0x13, 0xec, 0xd8, 0x8e, 0xbb, 0x3e, 0x99, 0x9d, 0x30, 0x48, 0xd0, 0x55, 0x8a, 0x4a, 0xae, 0xf8, - 0x97, 0xf8, 0xc0, 0x1e, 0xa0, 0x8d, 0x3b, 0x4c, 0x33, 0xcf, 0x53, 0x05, 0x8d, 0x30, 0xc7, 0x5e, - 0x42, 0xce, 0x68, 0xad, 0x08, 0x65, 0xb6, 0x06, 0xcc, 0xa3, 0x35, 0x4a, 0x30, 0x2c, 0xe5, 0x78, - 0xe1, 0x8c, 0x36, 0xbe, 0x52, 0xdb, 0x35, 0xe7, 0x28, 0x9d, 0x60, 0x73, 0x08, 0x17, 0x65, 0x1b, - 0x52, 0xba, 0x92, 0x53, 0x22, 0xef, 0xca, 0xc4, 0x1e, 0x48, 0x4c, 0x4d, 0x58, 0xd5, 0xf3, 0x4e, - 0x1a, 0x20, 0xbe, 0xd4, 0x81, 0x8b, 0x23, 0x16, 0x94, 0xf8, 0x4b, 0xcc, 0x2b, 0xec, 0xb9, 0x31, - 0x5f, 0xca, 0x98, 0x56, 0xdc, 0xc0, 0x3c, 0x1f, 0xa6, 0x41, 0xfc, 0x23, 0xf8, 0x8c, 0x68, 0xfc, - 0xc0, 0x4f, 0xc8, 0xd5, 0x9b, 0x88, 0x51, 0x05, 0x59, 0x8c, 0x92, 0xed, 0x56, 0xc5, 0xb4, 0xdd, - 0x6a, 0x0b, 0xae, 0xd1, 0x3d, 0x8f, 0xcf, 0x1c, 0xf7, 0x23, 0x37, 0x38, 0xf6, 0xfb, 0x18, 0xc2, - 0x73, 0x10, 0x2f, 0x7d, 0x66, 0x68, 0xbb, 0x4c, 0xf1, 0x70, 0x5e, 0x18, 0x1c, 0x6b, 0x17, 0x91, - 0x58, 0x68, 0xda, 0x7f, 0x56, 0x84, 0xa7, 0x4f, 0x31, 0xb9, 0x26, 0xd4, 0xfd, 0xf3, 0x69, 0x61, - 0xbf, 0x90, 0xd2, 0xce, 0x53, 0xa6, 0x89, 0xba, 0x7b, 0x8c, 0xa8, 0xff, 0xcb, 0xb0, 0xc4, 0x8e, - 0x29, 0xf6, 0x8e, 0x6a, 0x7f, 0xd8, 0x3b, 0xc5, 0x39, 0x75, 0x49, 0x44, 0x89, 0xc8, 0x90, 0xe2, - 0xd1, 0x85, 0xbb, 0xb3, 0x15, 0xc3, 0x48, 0x1b, 0xe6, 0x10, 0x6d, 0xdf, 0xf1, 0x7a, 0xa7, 0x0a, - 0x57, 0x20, 0x62, 0x50, 0xc8, 0x64, 0xec, 0xbd, 0x28, 0x05, 0x6c, 0xe1, 0x6f, 0x72, 0x03, 0x96, - 0xfa, 0xc3, 0x23, 0x2a, 0xc6, 0xb2, 0x99, 0xcb, 0xdd, 0xd5, 0xa7, 0xcc, 0x85, 0xfe, 0xf0, 0x48, - 0x1f, 0x0c, 0x70, 0x02, 0xa2, 0x5f, 0xfb, 0x32, 0xc5, 0x63, 0x7b, 0x8c, 0xc0, 0x9c, 0x46, 0x4c, - 0xca, 0x80, 0xed, 0x32, 0x1c, 0x77, 0x05, 0xd8, 0x2b, 0x27, 0x9e, 0xf3, 0x98, 0xfd, 0xd0, 0xfe, - 0x67, 0x41, 0x28, 0xca, 0xc7, 0xaf, 0xd2, 0x9f, 0x0f, 0x51, 0xce, 0x10, 0x3d, 0x07, 0x2a, 0xed, - 0xfa, 0x64, 0x0b, 0x8c, 0xc7, 0x68, 0xb1, 0x3f, 0x3c, 0x8a, 0xfb, 0x4e, 0xee, 0xf8, 0x69, 0xb9, - 0xe3, 0xdf, 0x10, 0x8a, 0xe8, 0xdc, 0xcd, 0x6c, 0x7c, 0x97, 0x53, 0xf9, 0xee, 0xc6, 0xe9, 0xb6, - 0xac, 0x9f, 0x8f, 0x5b, 0xce, 0xb8, 0x65, 0x4c, 0xfa, 0x53, 0x23, 0x26, 0xfd, 0x9c, 0xb5, 0x37, - 0x9d, 0xb7, 0xf6, 0x46, 0x1c, 0x08, 0x66, 0x72, 0x1c, 0x08, 0x72, 0x17, 0x68, 0xf9, 0x84, 0x05, - 0x3a, 0x2b, 0xcf, 0x93, 0xef, 0x15, 0xe0, 0xfa, 0x89, 0xe7, 0xc6, 0xcf, 0x47, 0x3a, 0x67, 0xa4, - 0xf3, 0xfb, 0xf3, 0x2f, 0x0a, 0x42, 0x5e, 0x4e, 0x5f, 0x83, 0xdf, 0x87, 0xb3, 0xe2, 0x1a, 0xcc, - 0xe4, 0x86, 0xc4, 0xcf, 0x66, 0x6e, 0xe3, 0xf9, 0xbc, 0x0b, 0x30, 0xa2, 0xe5, 0x5c, 0x52, 0x97, - 0xf9, 0xd5, 0x37, 0x29, 0xff, 0x7f, 0xe7, 0xd2, 0x4b, 0xee, 0xc3, 0x79, 0xcc, 0xc8, 0xd6, 0x91, - 0x3d, 0x84, 0xec, 0xc0, 0xdd, 0xe7, 0xbd, 0x7e, 0x7d, 0xe4, 0x72, 0xe8, 0x75, 0xa4, 0xea, 0x98, - 0xee, 0xfe, 0xce, 0x19, 0x73, 0x25, 0xcc, 0x81, 0x73, 0x55, 0x53, 0xe6, 0x56, 0xfd, 0x2f, 0x15, - 0xd0, 0x4e, 0xee, 0x35, 0x54, 0x80, 0x64, 0xbb, 0x7d, 0xd6, 0x9c, 0x73, 0xa4, 0x3e, 0x7c, 0x1a, - 0x16, 0x02, 0x77, 0x3f, 0x70, 0xc3, 0xc3, 0x94, 0x96, 0x72, 0x9e, 0x03, 0x45, 0xf7, 0x88, 0xe4, - 0x10, 0x8f, 0x75, 0x21, 0x15, 0x44, 0xb1, 0xef, 0xed, 0xe5, 0x49, 0x63, 0x42, 0x67, 0x96, 0x5c, - 0x4d, 0xf6, 0x23, 0xf6, 0xf3, 0x2a, 0xa8, 0x45, 0x93, 0xa7, 0xb3, 0xd8, 0xf7, 0x7a, 0xae, 0xf6, - 0xaf, 0x63, 0xd9, 0x2d, 0xaf, 0x3b, 0xc9, 0xfb, 0xd2, 0xfb, 0xce, 0xe2, 0x88, 0x58, 0x9a, 0x47, - 0x72, 0x1a, 0x75, 0x72, 0xfd, 0x53, 0x52, 0x27, 0xdf, 0x12, 0x8f, 0x44, 0xe8, 0xa9, 0x72, 0xf7, - 0x26, 0x79, 0x1e, 0x66, 0xd8, 0xbb, 0x10, 0x51, 0xdd, 0xa5, 0x54, 0x75, 0xef, 0xde, 0x34, 0x45, - 0xb9, 0xf6, 0x8d, 0xd8, 0xa3, 0x6d, 0xa4, 0x11, 0x77, 0x6f, 0x92, 0x37, 0x4e, 0xf7, 0x5e, 0xb3, - 0x2c, 0xde, 0x6b, 0xc6, 0x6f, 0x35, 0xdf, 0x4c, 0xbd, 0xd5, 0x7c, 0x66, 0x72, 0x6f, 0x71, 0x67, - 0x49, 0x96, 0x22, 0x20, 0x8e, 0xf3, 0xac, 0x7d, 0xb5, 0x08, 0x4f, 0x4d, 0xa4, 0x20, 0x97, 0xa1, - 0xac, 0xb7, 0x6a, 0xed, 0x64, 0x94, 0xe9, 0x2a, 0x12, 0x10, 0xb2, 0x0d, 0xb3, 0x9b, 0x4e, 0xe8, - 0x75, 0xe8, 0x94, 0xce, 0x75, 0x82, 0x19, 0x61, 0x1b, 0xa3, 0xef, 0x9c, 0x31, 0x13, 0x5a, 0x62, - 0xc3, 0x32, 0xae, 0x8b, 0x54, 0x06, 0xe7, 0x62, 0x8e, 0xd2, 0x6d, 0x84, 0xe1, 0x08, 0x19, 0xdd, - 0x79, 0x46, 0x80, 0xe4, 0x01, 0x10, 0xcb, 0xda, 0xa9, 0xb8, 0x41, 0xc4, 0xd5, 0x50, 0x91, 0x17, - 0x3f, 0xfe, 0x7b, 0xe5, 0x84, 0xbe, 0x1b, 0xa1, 0xdb, 0x39, 0x63, 0xe6, 0x70, 0x23, 0xd7, 0x41, - 0x4e, 0x35, 0x8e, 0x52, 0xd0, 0xfc, 0xce, 0x19, 0x13, 0x06, 0x71, 0xca, 0xf1, 0xfc, 0xbd, 0xe1, - 0x57, 0x84, 0xe8, 0x39, 0xbe, 0xb7, 0x1e, 0x23, 0x4f, 0xcb, 0x73, 0x50, 0x6e, 0x09, 0x9f, 0x6a, - 0xe9, 0xb5, 0xb5, 0xf0, 0x9f, 0x36, 0xe3, 0x52, 0x3e, 0xb3, 0x7f, 0x5b, 0x11, 0x6a, 0xba, 0x93, - 0xfb, 0x56, 0xca, 0xc7, 0xdd, 0x9d, 0x9c, 0x8f, 0xbb, 0xfb, 0x53, 0xe6, 0xe3, 0xe6, 0x95, 0xf2, - 0xe1, 0xf9, 0x53, 0x8f, 0x06, 0x79, 0x0b, 0x54, 0xcc, 0x57, 0xec, 0x48, 0x23, 0x9b, 0x0e, 0x4e, - 0xce, 0x82, 0x6f, 0xb6, 0x1c, 0x2f, 0x30, 0x97, 0x3a, 0x69, 0x6a, 0xfe, 0xc1, 0xdf, 0xe7, 0x29, - 0xdc, 0x6a, 0xdd, 0x56, 0xc6, 0xf4, 0xfe, 0xa4, 0x4f, 0xf6, 0x8d, 0xd4, 0x3a, 0x15, 0x67, 0x5d, - 0xfe, 0xb7, 0xc6, 0xbf, 0xdc, 0x97, 0x16, 0xed, 0x3f, 0x2c, 0xc2, 0xe5, 0x49, 0xe4, 0x44, 0x07, - 0xd5, 0x60, 0x61, 0x40, 0xf9, 0x63, 0x49, 0x3f, 0x90, 0x53, 0x8a, 0xb2, 0x10, 0xa1, 0x76, 0x37, - 0x2e, 0x34, 0x47, 0xd0, 0xe9, 0x38, 0x33, 0x58, 0xfc, 0x1e, 0x1d, 0xc7, 0x99, 0x93, 0xd2, 0x71, - 0x16, 0xc5, 0xe4, 0x69, 0x98, 0xd6, 0x2b, 0x56, 0x92, 0x3b, 0x1d, 0x1f, 0x8e, 0x3a, 0x9d, 0x10, - 0x9f, 0x24, 0xf2, 0x22, 0xf2, 0x4b, 0xa0, 0x66, 0x53, 0x27, 0xf2, 0xa4, 0xe9, 0x97, 0xa4, 0x0e, - 0x19, 0xc9, 0xae, 0x88, 0xf5, 0x4d, 0xb2, 0x01, 0xf2, 0x04, 0x5b, 0xe6, 0x08, 0x2f, 0xa2, 0xc1, - 0x74, 0x2b, 0x70, 0x43, 0x37, 0x92, 0x1f, 0x75, 0x0e, 0x10, 0x62, 0xf2, 0x12, 0xfe, 0xe4, 0xd2, - 0x39, 0x66, 0x21, 0xf9, 0xa6, 0xe5, 0xd0, 0xab, 0xf8, 0x46, 0x93, 0x82, 0x4d, 0x09, 0x85, 0x12, - 0xd4, 0x9d, 0x61, 0xbf, 0x73, 0xb8, 0x67, 0xd6, 0xb9, 0x58, 0xcb, 0x08, 0x7a, 0x08, 0xa5, 0x0d, - 0x0c, 0x4d, 0x09, 0x45, 0xfb, 0x75, 0x05, 0x56, 0xf2, 0xda, 0x71, 0x82, 0xd7, 0xce, 0x2b, 0x30, - 0x87, 0x16, 0xda, 0x7d, 0x3f, 0x38, 0x72, 0x22, 0xf9, 0xe9, 0xab, 0x04, 0x36, 0xd1, 0xa2, 0xbc, - 0x85, 0xff, 0x93, 0xab, 0xe2, 0xb4, 0x92, 0x12, 0xa3, 0x20, 0x80, 0x1f, 0x5c, 0x9a, 0x0e, 0x50, - 0xeb, 0xb6, 0x9a, 0x03, 0x96, 0xdd, 0xef, 0x55, 0x28, 0xd1, 0x6a, 0x65, 0x66, 0x2f, 0x9d, 0x3f, - 0xfa, 0x6e, 0x9d, 0x23, 0xb1, 0x5a, 0x85, 0xce, 0x51, 0xcf, 0x44, 0x64, 0xed, 0x1e, 0x2c, 0xa6, - 0x31, 0x88, 0x91, 0x4e, 0xf0, 0x32, 0xb7, 0xa1, 0x72, 0x4e, 0x9b, 0xbe, 0xcf, 0xc2, 0x2f, 0x6c, - 0x5e, 0xfc, 0xfe, 0x27, 0x57, 0x81, 0xfe, 0x64, 0x34, 0x79, 0x09, 0x60, 0xb4, 0xaf, 0x17, 0x60, - 0x25, 0x09, 0x11, 0x27, 0xd6, 0xd0, 0x5f, 0xdb, 0xf0, 0x43, 0x7a, 0x2a, 0x3c, 0x8e, 0x10, 0x42, - 0x47, 0x1b, 0x38, 0x21, 0x2a, 0xc7, 0x36, 0xac, 0x8e, 0xc3, 0x27, 0x2f, 0xc0, 0x2c, 0x46, 0x2a, - 0x1e, 0x38, 0x1d, 0x57, 0xde, 0x72, 0xfb, 0x02, 0x68, 0x26, 0xe5, 0xda, 0xf7, 0x14, 0x58, 0xe3, - 0x41, 0x03, 0x76, 0x1d, 0xaf, 0x8f, 0x06, 0xc1, 0x8e, 0xfb, 0xe9, 0x84, 0xcf, 0xda, 0x4e, 0xed, - 0x63, 0xcf, 0xa6, 0x63, 0x43, 0x8c, 0x7c, 0x6d, 0x7c, 0x6b, 0xc9, 0xf3, 0x18, 0x7d, 0x9b, 0xbb, - 0x99, 0x96, 0x58, 0x7c, 0xc3, 0x3e, 0x05, 0xc8, 0xf1, 0x0d, 0x11, 0x43, 0xfb, 0xdb, 0x70, 0x65, - 0xf2, 0x07, 0xc8, 0x97, 0x60, 0x01, 0x13, 0x6f, 0xef, 0x0d, 0x0e, 0x02, 0xa7, 0xeb, 0x0a, 0x25, - 0xb1, 0xb0, 0x65, 0xc8, 0x65, 0x2c, 0x98, 0x38, 0x8f, 0xb7, 0x77, 0x80, 0x29, 0xbd, 0x39, 0x51, - 0x2a, 0x32, 0x87, 0xcc, 0x4d, 0xfb, 0x8a, 0x02, 0x64, 0x94, 0x07, 0x79, 0x1d, 0xe6, 0xf7, 0xda, - 0x15, 0x2b, 0x72, 0x82, 0x68, 0xc7, 0x1f, 0x06, 0x3c, 0x92, 0x37, 0x0b, 0xbf, 0x16, 0x75, 0x6c, - 0x66, 0xfa, 0x3d, 0xf4, 0x87, 0x81, 0x99, 0xc2, 0xc3, 0x94, 0xcd, 0xae, 0xfb, 0xb0, 0xeb, 0x1c, - 0xa7, 0x53, 0x36, 0x73, 0x58, 0x2a, 0x65, 0x33, 0x87, 0x69, 0xdf, 0x52, 0xe0, 0x92, 0x78, 0xf6, - 0xd5, 0xcd, 0xa9, 0x4b, 0x05, 0x83, 0x8c, 0x06, 0x22, 0x6d, 0xce, 0x24, 0x41, 0x7f, 0x59, 0xc4, - 0xe1, 0xc5, 0x0a, 0xa2, 0xc4, 0xcf, 0x68, 0xc9, 0xe7, 0xa1, 0x64, 0x45, 0xfe, 0xe0, 0x14, 0x81, - 0x78, 0xd5, 0x78, 0x44, 0x23, 0x7f, 0x80, 0x2c, 0x90, 0x52, 0x73, 0x61, 0x45, 0xae, 0x9c, 0xa8, - 0x31, 0xd9, 0x85, 0x19, 0x1e, 0xc5, 0x3d, 0xe3, 0x4d, 0x3a, 0xa1, 0x4d, 0x9b, 0x4b, 0x22, 0xda, - 0x2f, 0x4f, 0xf0, 0x62, 0x0a, 0x1e, 0xda, 0xdf, 0x53, 0x60, 0x8e, 0x8a, 0x3a, 0xa8, 0x31, 0x78, - 0xd2, 0x29, 0x9d, 0x16, 0xa1, 0x85, 0x9f, 0x79, 0xcc, 0xfe, 0x54, 0xa7, 0xf1, 0x6b, 0xb0, 0x94, - 0x21, 0x20, 0x1a, 0xc6, 0x79, 0xec, 0x79, 0x1d, 0x87, 0x65, 0x80, 0x65, 0x3e, 0xda, 0x29, 0x98, - 0xf6, 0x1b, 0x0a, 0xac, 0x34, 0x1f, 0x46, 0x0e, 0xf3, 0xd0, 0x30, 0x87, 0x3d, 0xb1, 0xde, 0xa9, - 0xf8, 0x26, 0xde, 0x0f, 0xb2, 0x90, 0x72, 0x4c, 0x7c, 0xe3, 0x30, 0x33, 0x2e, 0x25, 0x3b, 0x50, - 0xe6, 0xe7, 0x4b, 0xc8, 0xf3, 0x95, 0x5c, 0x91, 0xd4, 0x19, 0x09, 0x63, 0x8e, 0x44, 0x5b, 0x82, - 0x5b, 0x18, 0xa7, 0x31, 0x63, 0x6a, 0xed, 0x2f, 0x15, 0xb8, 0x30, 0x86, 0x86, 0xbc, 0x0d, 0x53, - 0x18, 0xee, 0x86, 0x8f, 0xde, 0xe5, 0x31, 0x9f, 0x88, 0x3a, 0x87, 0x77, 0x6f, 0xb2, 0x83, 0xe8, - 0x88, 0xfe, 0x30, 0x19, 0x15, 0x79, 0x1f, 0x66, 0xf5, 0x6e, 0x97, 0x5f, 0xec, 0x0a, 0xa9, 0x8b, - 0xdd, 0x98, 0x2f, 0xbe, 0x14, 0xe3, 0xb3, 0x8b, 0x1d, 0x0b, 0xbc, 0xd0, 0xed, 0xda, 0x3c, 0x94, - 0x4f, 0xc2, 0x6f, 0xed, 0x2d, 0x58, 0x4c, 0x23, 0x3f, 0x56, 0xf4, 0x91, 0x6f, 0x28, 0xa0, 0xa6, - 0xeb, 0xf0, 0xb3, 0x89, 0x53, 0x9c, 0x37, 0xcc, 0x27, 0x4c, 0xaa, 0xbf, 0x5f, 0x80, 0x73, 0xb9, - 0x3d, 0x4c, 0x5e, 0x84, 0x69, 0x7d, 0x30, 0xa8, 0x55, 0xf9, 0xac, 0xe2, 0x12, 0x12, 0x5a, 0x36, - 0x52, 0xf7, 0x5e, 0x86, 0x44, 0x5e, 0x85, 0x32, 0x73, 0x04, 0xaa, 0x8a, 0x0d, 0x07, 0x03, 0xaf, - 0x72, 0x2f, 0xa5, 0x74, 0xe6, 0x10, 0x81, 0x48, 0xb6, 0x60, 0x91, 0x87, 0x2c, 0x45, 0xaf, 0xb0, - 0x38, 0x01, 0x1f, 0x3a, 0xd2, 0x09, 0x73, 0x09, 0xf3, 0x27, 0x4b, 0xed, 0x9d, 0x19, 0x2a, 0x52, - 0x07, 0x15, 0x79, 0xca, 0x9c, 0x58, 0xfa, 0x12, 0xc9, 0x11, 0x73, 0x0c, 0xaf, 0x11, 0xca, 0x78, - 0xb8, 0xd8, 0x4b, 0x9a, 0x23, 0xb7, 0x1f, 0xfd, 0xec, 0x86, 0x2b, 0xf9, 0xc6, 0xa9, 0x86, 0xeb, - 0x77, 0x4b, 0x6c, 0x31, 0x67, 0xc9, 0xa8, 0x44, 0x23, 0xe5, 0xdb, 0x42, 0x89, 0x86, 0xde, 0xd8, - 0x78, 0x50, 0xce, 0x2a, 0xcc, 0xb4, 0x79, 0x2e, 0x25, 0xb6, 0x32, 0x9e, 0xca, 0xad, 0x02, 0xc3, - 0xb9, 0x7b, 0x93, 0x89, 0x2f, 0x3c, 0xb7, 0x92, 0x29, 0x48, 0xc9, 0x5d, 0x98, 0xab, 0xf4, 0x5c, - 0xa7, 0x3f, 0x1c, 0xb4, 0x4f, 0xe7, 0x7f, 0xb0, 0xca, 0xdb, 0x32, 0xdf, 0x61, 0x64, 0xe8, 0xb7, - 0x80, 0x3b, 0xb9, 0xcc, 0x88, 0xb4, 0xe3, 0x50, 0x1c, 0x25, 0xd4, 0x95, 0xbe, 0x32, 0xa1, 0x7f, - 0xb2, 0x40, 0xa4, 0x4b, 0xc7, 0x99, 0xe1, 0xb1, 0x3a, 0x6c, 0x58, 0xac, 0x3b, 0x61, 0xd4, 0x0e, - 0x9c, 0x7e, 0x88, 0x89, 0x1b, 0x4e, 0x11, 0x84, 0xfa, 0x12, 0xaf, 0x30, 0xd3, 0xa1, 0x46, 0x31, - 0x29, 0xd3, 0xa1, 0xa6, 0xd9, 0x51, 0x79, 0x69, 0xcb, 0xeb, 0x3b, 0x3d, 0xef, 0xcb, 0x22, 0x62, - 0x11, 0x93, 0x97, 0xf6, 0x05, 0xd0, 0x4c, 0xca, 0xb5, 0x2f, 0x8e, 0x8c, 0x1b, 0xab, 0xe5, 0x1c, - 0xcc, 0xf0, 0x78, 0x76, 0x2c, 0xbe, 0x5b, 0xcb, 0x68, 0x54, 0x6b, 0x8d, 0x6d, 0x55, 0x21, 0x8b, - 0x00, 0x2d, 0xb3, 0x59, 0x31, 0x2c, 0x8b, 0xfe, 0x2e, 0xd0, 0xdf, 0x3c, 0xf8, 0xdb, 0xd6, 0x5e, - 0x5d, 0x2d, 0x4a, 0xf1, 0xdf, 0x4a, 0xda, 0x77, 0x15, 0x38, 0x9f, 0x3f, 0x94, 0xa4, 0xcd, 0x1d, - 0xf5, 0x99, 0x27, 0xca, 0xeb, 0x13, 0xc7, 0x3d, 0x17, 0x9c, 0x8d, 0x24, 0x18, 0xb1, 0x08, 0x75, - 0x05, 0x61, 0xe0, 0x64, 0x21, 0x6f, 0xbc, 0xae, 0x59, 0xf0, 0xba, 0x5a, 0x05, 0x56, 0xc7, 0xf1, - 0x48, 0x37, 0x75, 0x09, 0xe6, 0xf4, 0x56, 0xab, 0x5e, 0xab, 0xe8, 0xed, 0x5a, 0xb3, 0xa1, 0x2a, - 0x64, 0x16, 0xa6, 0xb6, 0xcd, 0xe6, 0x5e, 0x4b, 0x2d, 0x68, 0x7f, 0xac, 0xc0, 0x42, 0x2d, 0xf1, - 0x94, 0x7d, 0xd2, 0xc5, 0xf7, 0xd9, 0xd4, 0xe2, 0x5b, 0x8d, 0x63, 0x65, 0xc6, 0x1f, 0x98, 0x20, - 0x41, 0x6e, 0xc6, 0x01, 0x8d, 0x8a, 0x29, 0x8f, 0x12, 0x99, 0x5a, 0x84, 0x8a, 0x89, 0x73, 0x06, - 0xa6, 0x03, 0x1e, 0x49, 0xab, 0xf7, 0x9f, 0x17, 0x61, 0x79, 0xe4, 0xbb, 0xc4, 0x82, 0x19, 0xfd, - 0x9e, 0xd5, 0xac, 0x55, 0x2b, 0xbc, 0x75, 0x57, 0x13, 0xef, 0x4a, 0x4c, 0x81, 0x3d, 0x52, 0x53, - 0x16, 0xa3, 0xea, 0x51, 0x68, 0xfb, 0x5e, 0xb7, 0x93, 0x72, 0xef, 0x15, 0x9c, 0xf0, 0x34, 0xfc, - 0xf2, 0x30, 0x40, 0x8f, 0x65, 0xde, 0xf2, 0xd8, 0x69, 0x53, 0xc0, 0x47, 0x19, 0xa3, 0x0f, 0xaf, - 0x43, 0xcb, 0x47, 0x59, 0x27, 0xfc, 0x48, 0x03, 0xa6, 0xb7, 0xbd, 0x68, 0x67, 0xf8, 0x80, 0xf7, - 0xca, 0x95, 0x24, 0x21, 0xf2, 0xce, 0xf0, 0xc1, 0x28, 0x5b, 0xd4, 0x98, 0xb2, 0xf8, 0x14, 0x29, - 0x96, 0x9c, 0x0b, 0xb9, 0x03, 0x53, 0xfa, 0x3d, 0xcb, 0xd4, 0xf9, 0x0a, 0x95, 0xfc, 0x57, 0x4d, - 0x7d, 0x0c, 0x37, 0xda, 0xfa, 0xc0, 0x49, 0x71, 0x63, 0x3c, 0xb2, 0x31, 0x7a, 0x4a, 0x8f, 0x15, - 0xa3, 0x67, 0x73, 0x01, 0xe6, 0xf8, 0xa5, 0x0e, 0xef, 0x4b, 0x1f, 0xc3, 0xd9, 0x9c, 0xa1, 0x26, - 0x0e, 0x7a, 0xc9, 0xa3, 0xd5, 0x5d, 0xef, 0x1f, 0x3f, 0x3a, 0x74, 0x03, 0x77, 0x74, 0xec, 0xd2, - 0x75, 0x17, 0xb3, 0x24, 0xb7, 0xf6, 0xe6, 0x08, 0x3b, 0xed, 0x8f, 0x14, 0x58, 0x1d, 0x37, 0x01, - 0xe8, 0x0d, 0x35, 0x1d, 0x05, 0xf0, 0x7c, 0x9c, 0xf8, 0x33, 0xed, 0xdd, 0x2e, 0xd0, 0xc8, 0xbb, - 0x30, 0xc7, 0x3c, 0x20, 0xad, 0x57, 0xf7, 0xcc, 0x1a, 0x5f, 0xb9, 0x4f, 0xfd, 0xe8, 0x93, 0xab, - 0x17, 0xb8, 0xd3, 0x64, 0xf8, 0xaa, 0x3d, 0x0c, 0xbc, 0x84, 0x74, 0x55, 0x31, 0x65, 0x0a, 0x7a, - 0xa1, 0x70, 0x86, 0x5d, 0xcf, 0x15, 0xd7, 0x29, 0x11, 0x29, 0x8d, 0xc3, 0xe4, 0xe3, 0x5d, 0xc0, - 0xb4, 0xaf, 0x29, 0xb0, 0x36, 0x7e, 0xb6, 0x51, 0x91, 0xa1, 0xcd, 0x1c, 0x49, 0x45, 0xac, 0x32, - 0x14, 0x19, 0x62, 0x6f, 0x53, 0x99, 0xa7, 0x40, 0xa4, 0x44, 0x5c, 0xf1, 0x27, 0xf4, 0x45, 0x48, - 0x14, 0xeb, 0x05, 0x65, 0x22, 0x81, 0xa8, 0xdd, 0x87, 0x0b, 0x63, 0xe6, 0x26, 0x79, 0x27, 0x37, - 0x9d, 0x30, 0xc6, 0xa2, 0x90, 0x83, 0x8d, 0xa4, 0xf2, 0xd2, 0x4b, 0x70, 0xed, 0x3f, 0x33, 0xd7, - 0xe9, 0x9c, 0x89, 0x4a, 0xa5, 0x1b, 0x4c, 0x5f, 0xab, 0xf7, 0x3b, 0x87, 0x7e, 0x90, 0x0c, 0x16, - 0x4a, 0x37, 0x11, 0x2d, 0xb1, 0x1d, 0x2c, 0xca, 0x0c, 0x5a, 0x86, 0x8a, 0xf8, 0xb0, 0xdc, 0x0a, - 0xfc, 0x7d, 0x8f, 0x3d, 0x5c, 0x66, 0x97, 0x52, 0xbe, 0xa6, 0x9f, 0x93, 0xa6, 0x9b, 0x3c, 0x7d, - 0x46, 0xf0, 0xe3, 0x3c, 0x6e, 0x14, 0xcc, 0x7c, 0x73, 0x3a, 0x58, 0x60, 0x8e, 0xf2, 0xd6, 0xbe, - 0x5f, 0x80, 0xeb, 0x27, 0x72, 0x3c, 0x6d, 0x16, 0xde, 0x97, 0x01, 0x38, 0x2d, 0xed, 0x01, 0x49, - 0xe5, 0x24, 0x2a, 0xe3, 0x04, 0x7d, 0x53, 0x42, 0x21, 0x0f, 0xe1, 0x29, 0xf1, 0xab, 0xd3, 0x71, - 0x07, 0x51, 0x48, 0xeb, 0xc1, 0x83, 0x97, 0xc7, 0x51, 0xd8, 0xca, 0x9b, 0xcf, 0xfe, 0xe8, 0x93, - 0xab, 0xd7, 0x63, 0x1e, 0x0c, 0x93, 0x3d, 0xf0, 0x10, 0x71, 0xd0, 0x51, 0xf1, 0x35, 0x99, 0x17, - 0xb9, 0x91, 0xac, 0xa4, 0x52, 0xa2, 0xc2, 0x16, 0x2b, 0x29, 0x59, 0x3f, 0x3b, 0x40, 0x38, 0x23, - 0x4a, 0xb6, 0x25, 0xdb, 0xb2, 0xd9, 0xae, 0x29, 0x6a, 0xc2, 0x14, 0x69, 0xac, 0xdc, 0xcc, 0xa1, - 0xd1, 0x7e, 0x87, 0x2d, 0xec, 0xdc, 0xdd, 0x81, 0x3c, 0x82, 0x25, 0x2a, 0x65, 0x48, 0x9d, 0xcd, - 0xf7, 0x95, 0x8d, 0x93, 0x07, 0xba, 0x16, 0xf1, 0x60, 0x3d, 0xd6, 0xf0, 0xe8, 0xc8, 0x09, 0x8e, - 0x37, 0x2f, 0x8a, 0x74, 0xb2, 0x28, 0xcd, 0xc8, 0x63, 0x6f, 0x66, 0xbf, 0xa2, 0xfd, 0xb0, 0x00, - 0x2f, 0x3c, 0x06, 0x6f, 0xd2, 0x82, 0x59, 0xbc, 0xcf, 0xa3, 0x24, 0x78, 0xb2, 0x3e, 0xe0, 0x3c, - 0x3f, 0x1b, 0x79, 0xb0, 0x9e, 0x58, 0x0e, 0x4c, 0x98, 0x90, 0xdb, 0x74, 0x3a, 0x75, 0x91, 0xdf, - 0xc9, 0xba, 0x81, 0x15, 0xa1, 0x26, 0x73, 0xfb, 0xdd, 0x84, 0x9b, 0x60, 0x20, 0xc5, 0x21, 0x2c, - 0x8e, 0x8d, 0x43, 0xf8, 0x1a, 0xcc, 0x1b, 0x92, 0x83, 0x2d, 0x1f, 0x7e, 0xb4, 0x1a, 0xa4, 0xbc, - 0x71, 0xcd, 0x14, 0x1a, 0xf9, 0x1c, 0x2c, 0x32, 0xef, 0x01, 0xde, 0x3b, 0xcc, 0xb7, 0x6d, 0x8a, - 0x67, 0x57, 0xc1, 0x12, 0xd1, 0xd5, 0xa1, 0x99, 0x41, 0xa5, 0x0b, 0xeb, 0x3c, 0x95, 0x4a, 0x7a, - 0x6e, 0x18, 0xea, 0xc3, 0xe8, 0x90, 0x9e, 0x3a, 0xec, 0x9e, 0x4e, 0xde, 0x80, 0xe9, 0xc3, 0xc7, - 0xb3, 0xce, 0x31, 0x74, 0x42, 0x00, 0x25, 0x7d, 0x11, 0x2e, 0x85, 0xfe, 0x4f, 0xde, 0x84, 0x29, - 0x54, 0x32, 0x73, 0x81, 0x5a, 0x28, 0x42, 0xf2, 0x3f, 0x8d, 0x2a, 0x68, 0x93, 0x11, 0xd0, 0xd5, - 0x9a, 0xe4, 0xc9, 0xe5, 0xe7, 0xb1, 0x50, 0xbe, 0xc6, 0xa9, 0x72, 0xcd, 0xd9, 0xa3, 0x7d, 0x87, - 0x27, 0x9f, 0x5d, 0x87, 0x65, 0xb1, 0xf7, 0x0e, 0x44, 0xa6, 0x12, 0xee, 0x77, 0xb3, 0xc4, 0x43, - 0x3a, 0x0d, 0x44, 0xb6, 0x92, 0x67, 0x60, 0x31, 0x0c, 0x0f, 0x6d, 0x1e, 0x48, 0xf0, 0xa1, 0x48, - 0x82, 0x66, 0xce, 0x87, 0xe1, 0x21, 0x8b, 0x28, 0x78, 0xc7, 0x3d, 0xa6, 0x58, 0xf8, 0x96, 0x21, - 0xc1, 0x2a, 0x33, 0xac, 0xa8, 0x17, 0xc6, 0x58, 0x3c, 0x06, 0x26, 0x24, 0x58, 0xda, 0x7f, 0x2b, - 0xc0, 0xec, 0x3d, 0x7a, 0x79, 0x45, 0x95, 0xec, 0x64, 0x15, 0xef, 0x06, 0xcc, 0xd5, 0x7d, 0x87, - 0x9b, 0xe8, 0x79, 0xbc, 0x0e, 0xf6, 0xf8, 0xa9, 0xe7, 0x3b, 0xc2, 0xda, 0x1f, 0x9a, 0x32, 0xd2, - 0x09, 0x41, 0x20, 0x6f, 0xc3, 0x34, 0x5b, 0xe1, 0xdc, 0xda, 0x20, 0xd4, 0x17, 0x71, 0x8d, 0x5e, - 0x62, 0xc5, 0x92, 0x0d, 0x99, 0xed, 0x12, 0xf2, 0x5d, 0x9a, 0x3f, 0x74, 0x92, 0x14, 0xd0, 0x53, - 0xa7, 0x53, 0x40, 0x4b, 0x19, 0x27, 0xa6, 0x4f, 0x93, 0x71, 0x62, 0xed, 0x16, 0xcc, 0x49, 0xf5, - 0x79, 0x2c, 0x6d, 0xc6, 0xaf, 0x16, 0x60, 0x01, 0x5b, 0x15, 0xef, 0x5a, 0x7f, 0x3d, 0xd5, 0xe9, - 0x9f, 0x4d, 0xa9, 0xd3, 0x57, 0xe5, 0xf1, 0xe2, 0x4e, 0x3f, 0xe3, 0xf5, 0xe8, 0xb7, 0x61, 0x79, - 0x04, 0x91, 0xbc, 0x06, 0x53, 0xb4, 0xfa, 0x42, 0xfd, 0xa8, 0x66, 0x67, 0x40, 0x92, 0x9d, 0x8c, - 0x36, 0x3c, 0x34, 0x19, 0xb6, 0xf6, 0x3f, 0x14, 0x98, 0xe7, 0x69, 0x99, 0xfb, 0xfb, 0xfe, 0x89, - 0xdd, 0x79, 0x23, 0xdb, 0x9d, 0x2c, 0xa4, 0x31, 0xef, 0xce, 0xbf, 0xea, 0x4e, 0xbc, 0x95, 0xea, - 0xc4, 0x0b, 0x71, 0xae, 0x12, 0xd1, 0x9c, 0x09, 0x7d, 0xf8, 0x6d, 0xcc, 0xde, 0x95, 0x46, 0x24, - 0xbf, 0x04, 0xb3, 0x0d, 0xf7, 0x51, 0x4a, 0x8b, 0x77, 0x63, 0x0c, 0xd3, 0x97, 0x62, 0x44, 0xb6, - 0xa6, 0xd8, 0x03, 0x44, 0xf7, 0x91, 0x3d, 0xe2, 0x9b, 0x91, 0xb0, 0x5c, 0x7b, 0x0b, 0x16, 0xd3, - 0x64, 0x8f, 0x33, 0xf5, 0x79, 0x84, 0x33, 0x8c, 0xd2, 0xfd, 0xeb, 0x45, 0x80, 0x24, 0x38, 0x14, - 0x5d, 0x80, 0x29, 0x77, 0x30, 0x61, 0x00, 0x45, 0x90, 0x3c, 0xc7, 0x85, 0x97, 0xd8, 0x0d, 0x6e, + 0xc1, 0x5c, 0x27, 0x70, 0xf1, 0xea, 0xd3, 0xe9, 0x89, 0xf7, 0xb7, 0x6b, 0x29, 0xca, 0x4a, 0x52, + 0x7e, 0xf7, 0xa6, 0x29, 0xa3, 0x6b, 0xdf, 0x9d, 0x85, 0x79, 0xb9, 0x3e, 0xc4, 0x84, 0xb3, 0x61, + 0x8f, 0x9e, 0xdd, 0xb9, 0x5f, 0xe0, 0x00, 0x0b, 0xf9, 0x76, 0x7a, 0x2d, 0x5d, 0x21, 0x8a, 0xc7, + 0x9c, 0x04, 0x45, 0x60, 0x91, 0x9d, 0x33, 0xe6, 0x72, 0x98, 0x80, 0x19, 0x1e, 0xd1, 0xa1, 0xec, + 0x0f, 0xc2, 0x03, 0xb7, 0xef, 0x89, 0x0b, 0x9a, 0xa7, 0x53, 0x8c, 0x9a, 0xbc, 0x70, 0x84, 0x57, + 0x4c, 0x46, 0x5e, 0x83, 0x69, 0x7f, 0xe0, 0xf6, 0x1d, 0x8f, 0xef, 0x71, 0x97, 0x32, 0x0c, 0xdc, + 0xbe, 0x5e, 0x93, 0x08, 0x39, 0x32, 0x79, 0x19, 0x4a, 0xfe, 0xc3, 0x78, 0xbc, 0x2e, 0xa6, 0x89, + 0x1e, 0x46, 0x8e, 0x44, 0x82, 0x88, 0x94, 0xe0, 0x03, 0xe7, 0x68, 0x9f, 0x8f, 0x58, 0x9a, 0xe0, + 0xb6, 0x73, 0xb4, 0x2f, 0x13, 0x50, 0x44, 0xf2, 0x2e, 0xc0, 0xc0, 0x39, 0x70, 0x03, 0xbb, 0x3b, + 0x8c, 0x8e, 0xf9, 0xb8, 0x5d, 0x49, 0x91, 0xb5, 0x68, 0x71, 0x75, 0x18, 0x1d, 0x4b, 0xb4, 0xb3, + 0x03, 0x01, 0x24, 0x3a, 0xc0, 0x91, 0x13, 0x45, 0x6e, 0x70, 0xe4, 0x73, 0xc7, 0xcc, 0x24, 0x92, + 0x25, 0x63, 0xb0, 0x1b, 0x17, 0x4b, 0x1c, 0x24, 0x22, 0xac, 0xb4, 0x17, 0x38, 0x78, 0x0d, 0x3f, + 0x52, 0x69, 0x2f, 0x48, 0xb5, 0x92, 0x22, 0x92, 0x37, 0x61, 0xa6, 0xeb, 0x85, 0x1d, 0x3f, 0xe8, + 0xf2, 0x88, 0x33, 0x97, 0x53, 0x34, 0x55, 0x56, 0x26, 0x91, 0x09, 0x74, 0x5a, 0x5b, 0x1e, 0xc9, + 0xb6, 0xe1, 0x3f, 0xc2, 0x7b, 0x81, 0x6c, 0x6d, 0xad, 0xb8, 0x58, 0xae, 0x6d, 0x42, 0x44, 0x87, + 0xf2, 0xc0, 0x8b, 0x7a, 0xce, 0x03, 0x7e, 0xd9, 0x9e, 0x1e, 0xca, 0x6d, 0x2c, 0x92, 0x87, 0x92, + 0x21, 0x93, 0x5b, 0x50, 0x16, 0xc9, 0x2d, 0xf8, 0xab, 0xd6, 0x74, 0xa5, 0x79, 0x72, 0x0a, 0xb9, + 0xd2, 0x3c, 0x9d, 0x05, 0xed, 0x9f, 0xb0, 0xe3, 0x1d, 0xf1, 0xc7, 0xa8, 0xe9, 0xfe, 0xb1, 0x2a, + 0xb5, 0x5d, 0xb9, 0x7f, 0x28, 0x22, 0x79, 0x07, 0x66, 0xe8, 0xfa, 0xed, 0xfa, 0x07, 0x3c, 0x66, + 0x87, 0x96, 0xee, 0x1f, 0x56, 0x36, 0x32, 0x5d, 0x05, 0x11, 0x5d, 0xc8, 0xce, 0xa3, 0xd0, 0xf6, + 0x3a, 0x18, 0xe0, 0x34, 0xbb, 0x1c, 0xf5, 0x7b, 0x56, 0xad, 0x22, 0x91, 0x4d, 0x39, 0x8f, 0xc2, + 0x5a, 0x87, 0x6c, 0xc0, 0x14, 0xe6, 0x7e, 0xe1, 0xd1, 0x4c, 0xd3, 0x34, 0x98, 0xf5, 0x45, 0xa6, + 0x41, 0x54, 0x3a, 0x90, 0x47, 0x21, 0xbe, 0xef, 0xe1, 0x19, 0x58, 0xd2, 0x7d, 0xb2, 0x6b, 0xe1, + 0xa3, 0x1f, 0xb9, 0x8a, 0x1c, 0x9d, 0x56, 0xb1, 0xef, 0x46, 0xb6, 0xf7, 0x21, 0xcf, 0xa1, 0x92, + 0xfe, 0x5c, 0xc3, 0x8d, 0x6a, 0xef, 0xc9, 0x9f, 0xeb, 0xbb, 0x51, 0xed, 0x43, 0x3e, 0x74, 0x87, + 0xc3, 0x07, 0x68, 0x7c, 0xcf, 0x19, 0xba, 0xc3, 0x61, 0x76, 0xe8, 0x0e, 0x87, 0x0f, 0x28, 0x99, + 0xd7, 0x8f, 0x86, 0x7d, 0x97, 0xbf, 0x2e, 0x4d, 0x93, 0xd5, 0xb0, 0x48, 0x26, 0x63, 0xc8, 0xe4, + 0x0a, 0x40, 0xe2, 0xed, 0xc0, 0xee, 0x91, 0x4c, 0x09, 0xf2, 0xd9, 0xd2, 0x7f, 0xff, 0xa7, 0x57, + 0x95, 0x4d, 0x80, 0xb2, 0x08, 0x7c, 0x44, 0xd5, 0xf0, 0x95, 0xbc, 0xba, 0x90, 0xeb, 0x30, 0x2f, + 0x87, 0x65, 0xe2, 0x9b, 0xc1, 0x9c, 0x33, 0xf0, 0x44, 0x60, 0xa6, 0xc9, 0xd9, 0x35, 0x5e, 0x80, + 0xe5, 0xd4, 0x23, 0xac, 0xc4, 0x6d, 0xd1, 0x54, 0xe5, 0x02, 0xdc, 0x7b, 0x2b, 0x00, 0x61, 0xe4, + 0x04, 0x91, 0xdd, 0x75, 0xa2, 0xd3, 0x98, 0x91, 0xcb, 0x54, 0x9e, 0x33, 0x9f, 0x77, 0xa4, 0xab, + 0x3a, 0x91, 0xcb, 0x1a, 0xa7, 0xd5, 0xe1, 0xe2, 0x58, 0x59, 0x4b, 0x9e, 0x07, 0x75, 0xdf, 0xe1, + 0x96, 0xd6, 0xce, 0xa1, 0xd3, 0xef, 0xbb, 0x3d, 0xde, 0xb0, 0x25, 0x01, 0xaf, 0x30, 0x30, 0xe7, + 0xf6, 0xae, 0xd4, 0x3b, 0xd2, 0x22, 0x3b, 0x45, 0xef, 0x70, 0x06, 0xdf, 0x56, 0xe0, 0xf2, 0x24, + 0x91, 0x4d, 0xd6, 0xa0, 0x3c, 0x08, 0x3c, 0x1f, 0x8f, 0x06, 0xbc, 0x0f, 0xc5, 0x6f, 0x4c, 0x3e, + 0x82, 0x3a, 0x6c, 0xe4, 0x1c, 0xf0, 0x57, 0x4d, 0xe6, 0x2c, 0x42, 0xda, 0xce, 0x41, 0x48, 0xbb, + 0xb8, 0xeb, 0xee, 0x3b, 0xc3, 0x5e, 0x64, 0x87, 0x9d, 0x43, 0xb7, 0x8b, 0xef, 0x0e, 0xd1, 0xdf, + 0xd3, 0x54, 0x79, 0x81, 0x25, 0xe0, 0x23, 0x35, 0x9e, 0x1a, 0x53, 0xe3, 0xdb, 0xa5, 0xb2, 0xa2, + 0x16, 0x4c, 0x74, 0x91, 0xd3, 0xbe, 0x52, 0x80, 0xd5, 0x71, 0x32, 0x8a, 0xbc, 0x9d, 0xd7, 0x07, + 0xec, 0x76, 0x49, 0x86, 0xcb, 0xb7, 0x4b, 0xf2, 0xec, 0xd9, 0x80, 0xf8, 0xd5, 0xe0, 0x49, 0x11, + 0x40, 0x04, 0x8c, 0xd2, 0x0c, 0x9c, 0x30, 0x7c, 0x44, 0xc5, 0x70, 0x51, 0x8a, 0x44, 0xcd, 0x61, + 0x32, 0x8d, 0x80, 0x91, 0x37, 0x00, 0x3a, 0x3d, 0x3f, 0x74, 0xd1, 0x89, 0x83, 0xeb, 0x77, 0xec, + 0x2d, 0x44, 0x0c, 0x95, 0x6f, 0xed, 0x11, 0x5a, 0xf1, 0xbb, 0x62, 0x3e, 0x39, 0x70, 0x61, 0xcc, + 0xa6, 0x44, 0x87, 0x07, 0x9f, 0x01, 0x32, 0x19, 0xc4, 0x13, 0xf7, 0x51, 0x08, 0x4b, 0x38, 0x95, + 0xed, 0xf1, 0xc2, 0xb8, 0x39, 0x72, 0x0c, 0x64, 0x74, 0xe7, 0xa1, 0xdc, 0xb9, 0xef, 0xff, 0x30, + 0x88, 0xb9, 0x33, 0xc8, 0x5e, 0xd0, 0x23, 0x57, 0x61, 0x4e, 0x64, 0x51, 0xa6, 0xe7, 0x27, 0xc6, + 0x1c, 0x38, 0xe8, 0x8e, 0x8b, 0x93, 0x07, 0xc3, 0xf8, 0xb2, 0x44, 0x42, 0x6c, 0xe5, 0xcd, 0x22, + 0xa4, 0x7d, 0x3c, 0x10, 0xad, 0xbb, 0x2c, 0xe6, 0x77, 0x5a, 0x1f, 0xe0, 0xa5, 0xff, 0x40, 0x11, + 0xc3, 0x3f, 0xba, 0xa1, 0x9e, 0x54, 0x3f, 0x02, 0xf8, 0x34, 0x8f, 0x57, 0x0c, 0xff, 0xa7, 0x9a, + 0xa2, 0x58, 0x75, 0x5c, 0x53, 0xe4, 0x3f, 0xc9, 0x0d, 0x58, 0x0a, 0x98, 0xfb, 0x73, 0xe4, 0xf3, + 0xfe, 0x64, 0xb9, 0x76, 0x16, 0x18, 0xb8, 0xed, 0x63, 0x9f, 0xf2, 0x7a, 0xdd, 0x8e, 0x3b, 0x4c, + 0xd2, 0x2f, 0xc8, 0x4b, 0x30, 0x4b, 0xf5, 0x0b, 0x0c, 0x00, 0x95, 0x79, 0x13, 0x84, 0x78, 0xa8, + 0xad, 0x99, 0xe5, 0x0f, 0xf8, 0xff, 0x9c, 0xd7, 0xaf, 0xc5, 0x02, 0x30, 0x2d, 0x55, 0xc9, 0x79, + 0x98, 0x66, 0xd9, 0xbf, 0x79, 0xdb, 0xf8, 0x2f, 0xf2, 0x2c, 0x2c, 0xb2, 0x87, 0xbc, 0x99, 0x81, + 0x5d, 0x40, 0x68, 0x3c, 0xbd, 0x4f, 0x97, 0xa8, 0x89, 0x57, 0xe2, 0x0f, 0x0b, 0xa2, 0x45, 0xb2, + 0x8a, 0x45, 0x2e, 0xc0, 0x8c, 0x1f, 0x1c, 0x48, 0xfd, 0x3b, 0xed, 0x07, 0x07, 0xb4, 0x73, 0x9f, + 0x03, 0x95, 0xbd, 0x93, 0x63, 0xf1, 0x4a, 0xc2, 0xe3, 0x7e, 0x87, 0xbf, 0x95, 0x58, 0x64, 0xf0, + 0xbd, 0xd0, 0x0d, 0xac, 0xe3, 0x7e, 0x87, 0x62, 0x86, 0xa1, 0x6f, 0xcb, 0xc1, 0xe4, 0x78, 0x45, + 0x16, 0xc3, 0xd0, 0x4f, 0xa2, 0xca, 0x75, 0xc9, 0x26, 0x2c, 0x50, 0x3e, 0x71, 0x4c, 0x3c, 0x2e, + 0x86, 0x9f, 0x1a, 0xd5, 0x00, 0x8f, 0xfb, 0x1d, 0x51, 0x45, 0x73, 0x3e, 0x94, 0x7e, 0x91, 0x3b, + 0xa0, 0x4a, 0xaa, 0x32, 0x3e, 0x9c, 0xce, 0xbc, 0x07, 0x48, 0xd8, 0x48, 0x2a, 0x76, 0xad, 0xbf, + 0xef, 0x9b, 0x4b, 0x9d, 0x34, 0x20, 0x16, 0x47, 0xd3, 0xea, 0x8c, 0xb9, 0xca, 0x9b, 0x1b, 0xa2, + 0xab, 0xa8, 0xdd, 0xf3, 0x0f, 0x6c, 0xf7, 0x63, 0x3a, 0x31, 0xb4, 0x7f, 0xa2, 0x08, 0x81, 0x9f, + 0xc3, 0x94, 0x68, 0xb0, 0x70, 0xe8, 0x84, 0x76, 0x18, 0x1e, 0x31, 0x0f, 0x46, 0x1e, 0x92, 0x7b, + 0xee, 0xd0, 0x09, 0xad, 0xf0, 0x48, 0x24, 0x10, 0x3a, 0x47, 0x71, 0x7c, 0x67, 0x18, 0x1d, 0xda, + 0xf2, 0xc1, 0x80, 0xf5, 0xe8, 0xd9, 0x43, 0x27, 0x6c, 0xd2, 0x32, 0x89, 0x37, 0x79, 0x06, 0x16, + 0x91, 0x6f, 0xc7, 0x13, 0x8c, 0x31, 0x26, 0x8d, 0x39, 0x4f, 0x19, 0x77, 0x3c, 0xc6, 0x99, 0x0f, + 0xee, 0x4f, 0x4a, 0x70, 0x3e, 0xbf, 0xf7, 0x70, 0x0d, 0xd1, 0x3e, 0xc7, 0xd7, 0xb3, 0xbc, 0x6e, + 0xb3, 0x14, 0xc2, 0xe2, 0x09, 0xe5, 0x0d, 0x5e, 0x21, 0x77, 0xf0, 0xd6, 0x61, 0x19, 0x19, 0xf1, + 0x23, 0x48, 0xcf, 0x0b, 0x23, 0x1e, 0x26, 0xc7, 0x5c, 0xa2, 0x05, 0x6c, 0xd3, 0xa9, 0x53, 0x30, + 0x9d, 0x99, 0x62, 0xdb, 0xf0, 0x1f, 0xf5, 0xe9, 0x87, 0xd9, 0x9e, 0xb1, 0xc0, 0xa1, 0x4d, 0x04, + 0x92, 0x73, 0x30, 0xed, 0x0c, 0x06, 0xf4, 0x93, 0x6c, 0xab, 0x98, 0x72, 0x06, 0x03, 0x96, 0x35, + 0x8b, 0xe5, 0x27, 0xdb, 0x47, 0x7f, 0x33, 0xf1, 0x12, 0x60, 0x1e, 0x81, 0xcc, 0x07, 0x0d, 0xdf, + 0x12, 0x50, 0x5a, 0x81, 0x32, 0x83, 0x28, 0xe0, 0x0c, 0x62, 0x84, 0x8b, 0x50, 0x16, 0x9e, 0x0f, + 0xec, 0x71, 0x94, 0x39, 0xe3, 0x70, 0xaf, 0x87, 0xd7, 0xe0, 0x02, 0x4f, 0x86, 0x66, 0xb3, 0x26, + 0x0d, 0x06, 0xfc, 0x75, 0x32, 0x0b, 0x87, 0x6d, 0xae, 0xf0, 0x62, 0xda, 0x93, 0xfa, 0x60, 0x10, + 0xbf, 0x51, 0x5e, 0x13, 0x64, 0x0f, 0x3c, 0x16, 0xb6, 0x8f, 0x79, 0xff, 0xe2, 0xe2, 0x00, 0xa4, + 0x5c, 0xe5, 0x18, 0x9b, 0x32, 0x82, 0x58, 0x26, 0xf1, 0x4a, 0xb2, 0x99, 0xe1, 0x93, 0xab, 0x4f, + 0x78, 0x3f, 0x8e, 0x83, 0x86, 0x50, 0xf2, 0x06, 0x8c, 0x9d, 0x8b, 0xa8, 0x9d, 0x97, 0xcd, 0x73, + 0xac, 0x9c, 0x79, 0x35, 0xd7, 0xfd, 0x03, 0x03, 0x0b, 0xc9, 0xbb, 0x70, 0x59, 0x54, 0xd0, 0x09, + 0x43, 0xef, 0xa0, 0x6f, 0x8b, 0x51, 0x40, 0xc7, 0x13, 0xd4, 0xd0, 0xcb, 0xe6, 0x45, 0x8e, 0xa3, + 0x23, 0x4a, 0x95, 0x61, 0xb0, 0xd7, 0xad, 0xaf, 0xc0, 0x4a, 0xe4, 0x1d, 0xb9, 0xf6, 0x03, 0x37, + 0x7a, 0xe4, 0xba, 0x7d, 0xdb, 0x3b, 0xa2, 0x7c, 0x59, 0xc0, 0x98, 0x59, 0x93, 0xd0, 0xb2, 0x4d, + 0x56, 0x54, 0x63, 0x25, 0x7c, 0xfe, 0xbd, 0x09, 0x4b, 0xfc, 0x78, 0xc2, 0x75, 0x1b, 0x1c, 0x1f, + 0x2e, 0x79, 0xf1, 0x31, 0x07, 0xcb, 0xdd, 0x06, 0x1c, 0x54, 0xeb, 0x0a, 0xca, 0x3f, 0x55, 0xe0, + 0x5c, 0xee, 0xf9, 0x86, 0xfc, 0x32, 0xb0, 0x07, 0xaa, 0x91, 0x6f, 0x07, 0x6e, 0xc7, 0x1b, 0x78, + 0x18, 0xf1, 0x87, 0xd9, 0xff, 0x37, 0x26, 0x9d, 0x8c, 0xf0, 0xb1, 0x6b, 0xdb, 0x37, 0x63, 0x22, + 0x66, 0x98, 0x54, 0x83, 0x0c, 0x78, 0xed, 0x7d, 0x38, 0x97, 0x8b, 0x9a, 0x63, 0x30, 0xfc, 0x8c, + 0x6c, 0x30, 0x4c, 0x6e, 0x74, 0x33, 0x8d, 0x96, 0x0c, 0x89, 0xbc, 0x79, 0x7f, 0x14, 0x37, 0x2f, + 0x73, 0x12, 0x22, 0x46, 0x56, 0x16, 0xe6, 0x1d, 0xe6, 0x05, 0xd1, 0x78, 0x71, 0xf8, 0x3e, 0x9c, + 0xe3, 0x0b, 0x92, 0x6d, 0x05, 0x31, 0x3b, 0x56, 0xd1, 0x5f, 0xc8, 0x63, 0xc7, 0x56, 0xea, 0x36, + 0xc5, 0x8f, 0xb9, 0x9e, 0x75, 0x46, 0x81, 0xbc, 0x0d, 0xff, 0xae, 0x20, 0xc4, 0x5f, 0x4e, 0x75, + 0x72, 0x96, 0xba, 0x92, 0xb7, 0xd4, 0x4f, 0x2f, 0x67, 0x1a, 0x40, 0x64, 0x01, 0xcf, 0x57, 0x0a, + 0x73, 0x57, 0xbc, 0x9a, 0xce, 0x94, 0x28, 0x89, 0x4b, 0xb6, 0x74, 0xcc, 0xe5, 0x4e, 0x16, 0x44, + 0x8f, 0x10, 0x6c, 0x5b, 0xa5, 0x9f, 0x64, 0x3b, 0x7e, 0x99, 0x01, 0x6a, 0x5d, 0x72, 0x0d, 0xe6, + 0xd9, 0xf9, 0x35, 0x25, 0x87, 0x00, 0x61, 0x3a, 0x0a, 0xa3, 0xb7, 0xf2, 0x84, 0x51, 0x72, 0x11, + 0xc1, 0x55, 0xd7, 0xe3, 0x7e, 0x87, 0xc9, 0x9d, 0xb4, 0x94, 0xe2, 0x3d, 0xf8, 0x1b, 0x05, 0x50, + 0xb3, 0x88, 0x44, 0x83, 0x82, 0xd7, 0x1d, 0xe7, 0x49, 0xb3, 0x73, 0xc6, 0x2c, 0x78, 0x5d, 0x72, + 0x0b, 0x00, 0x73, 0x86, 0x06, 0xee, 0x81, 0xfb, 0x31, 0x57, 0x61, 0x51, 0xb1, 0x4c, 0xa0, 0x29, + 0x9a, 0x59, 0x34, 0x36, 0x52, 0x30, 0xb9, 0x09, 0xe0, 0x7e, 0xdc, 0xe9, 0x0d, 0xbb, 0x6e, 0xbc, + 0x1f, 0xe7, 0x7c, 0x46, 0x31, 0x67, 0x39, 0x56, 0xad, 0x4b, 0x76, 0x80, 0x08, 0x12, 0xe9, 0xab, + 0xa5, 0x13, 0xbe, 0xaa, 0x98, 0x2a, 0xa7, 0x6a, 0x88, 0x8f, 0xf3, 0x43, 0xe0, 0x2c, 0xcc, 0x78, + 0x7d, 0x2c, 0xa1, 0xff, 0x72, 0x24, 0xed, 0x57, 0x15, 0xb8, 0x76, 0xd2, 0x74, 0x24, 0xf7, 0xe0, + 0x3c, 0xfa, 0x9f, 0x85, 0x7e, 0x3c, 0xa3, 0xed, 0x8e, 0xd3, 0x39, 0x74, 0xb9, 0x00, 0xd0, 0x72, + 0xe7, 0xf5, 0x60, 0x60, 0x59, 0x4d, 0x69, 0x4a, 0x0f, 0x06, 0x56, 0xe8, 0x8b, 0xdf, 0x15, 0x4a, + 0xce, 0x07, 0xa4, 0x0b, 0x97, 0x26, 0x50, 0x4a, 0xfb, 0x92, 0x22, 0xef, 0x4b, 0xcf, 0x81, 0xba, + 0xef, 0x76, 0xe9, 0x41, 0xd7, 0xed, 0x62, 0xd5, 0x3e, 0xda, 0xc0, 0x31, 0x99, 0x37, 0x17, 0x63, + 0xb8, 0x15, 0xfa, 0x77, 0x37, 0xf8, 0x57, 0xfe, 0x20, 0x56, 0xb9, 0x64, 0x7b, 0x06, 0xd9, 0x80, + 0xb3, 0x99, 0xc8, 0x54, 0x52, 0xa8, 0x93, 0xc2, 0xaa, 0x62, 0x2e, 0xd3, 0xe2, 0x74, 0x2c, 0xc3, + 0x67, 0x61, 0x5e, 0x16, 0xe5, 0x7c, 0x2a, 0x50, 0xe4, 0xb9, 0x6e, 0x22, 0xc0, 0xc9, 0x03, 0x58, + 0x94, 0x56, 0x18, 0x55, 0x8d, 0x8a, 0x39, 0x62, 0x40, 0xae, 0xcd, 0x4b, 0xc9, 0xd2, 0xeb, 0xef, + 0xfb, 0xcc, 0x0d, 0x2b, 0xcd, 0xc2, 0x5c, 0xe8, 0xc8, 0x28, 0x6b, 0xef, 0x49, 0xa1, 0x19, 0x51, + 0x01, 0xba, 0x0c, 0xa5, 0x7e, 0x6e, 0x8c, 0xf5, 0x3e, 0x4b, 0x5b, 0x5e, 0x8a, 0x72, 0x23, 0x09, + 0x47, 0xf1, 0x11, 0x81, 0x77, 0xd7, 0x50, 0x0c, 0x4a, 0xae, 0x25, 0xe7, 0x34, 0xd6, 0x82, 0x17, + 0x81, 0xc4, 0x67, 0xef, 0x78, 0xcf, 0xe0, 0x62, 0x66, 0x59, 0x94, 0xc4, 0xc2, 0x9e, 0x7f, 0xf6, + 0x5f, 0x4f, 0xc3, 0xd9, 0x1c, 0x13, 0x10, 0x79, 0x11, 0x54, 0xaf, 0x1f, 0xb9, 0x07, 0x81, 0x64, + 0x5c, 0x48, 0xc6, 0x68, 0x49, 0x2a, 0xe3, 0xb6, 0xfd, 0xe9, 0xc0, 0x3d, 0x88, 0xef, 0x09, 0x4c, + 0xfe, 0x8b, 0xee, 0x25, 0x4e, 0x20, 0xcc, 0xd6, 0xf4, 0x5f, 0x52, 0x83, 0x65, 0xcc, 0x6b, 0x14, + 0x7a, 0x3e, 0xa6, 0x47, 0xc2, 0xc3, 0x44, 0x29, 0x65, 0x28, 0xc2, 0x9a, 0xb4, 0x24, 0x24, 0x7a, + 0x9a, 0x30, 0xd5, 0x41, 0x06, 0x42, 0x3e, 0x07, 0x6b, 0x92, 0x3a, 0x66, 0x67, 0x04, 0x31, 0x3e, + 0x55, 0x32, 0x2f, 0x38, 0xb1, 0x62, 0x56, 0x4d, 0x89, 0xe4, 0x4d, 0x60, 0x09, 0xec, 0xbd, 0xee, + 0xc0, 0x1e, 0x49, 0x84, 0x85, 0xcd, 0x65, 0x59, 0x59, 0xd6, 0x28, 0x56, 0xad, 0x3b, 0xc8, 0xe4, + 0xc4, 0xc2, 0x56, 0xb7, 0x72, 0x85, 0xf5, 0x0c, 0x0a, 0xeb, 0xa7, 0xe4, 0xc6, 0x8c, 0x88, 0x6a, + 0x36, 0xd3, 0x47, 0xc5, 0xf5, 0x01, 0x2c, 0x27, 0x6a, 0x92, 0x90, 0xb9, 0x65, 0x5c, 0xf4, 0x6b, + 0x32, 0x43, 0x71, 0xfc, 0x60, 0xd2, 0x94, 0x05, 0x9b, 0x19, 0x21, 0x94, 0x43, 0x2a, 0x0d, 0x53, + 0x04, 0x21, 0xa9, 0xc3, 0x8a, 0xf3, 0x28, 0x14, 0x69, 0xb1, 0xc3, 0xf8, 0x5b, 0xb3, 0xa3, 0xdf, + 0x12, 0x17, 0xd5, 0x5c, 0xc4, 0x13, 0xe7, 0x51, 0xc8, 0xb3, 0x65, 0x87, 0x82, 0xdb, 0x07, 0x40, + 0xd8, 0x36, 0x91, 0xaa, 0x37, 0x9c, 0xc4, 0x8b, 0xe7, 0xd4, 0x1e, 0xa1, 0x94, 0x03, 0x43, 0x62, + 0xa9, 0x5c, 0xf3, 0x76, 0xfa, 0x72, 0x61, 0x2e, 0x75, 0x33, 0x9e, 0xed, 0x6d, 0x76, 0x6b, 0x2f, + 0xe1, 0xcb, 0xc6, 0x12, 0x09, 0x8c, 0xe7, 0x63, 0x0c, 0x1c, 0x87, 0xf5, 0x38, 0xf2, 0xbb, 0x2e, + 0xf3, 0xf6, 0x36, 0x17, 0x10, 0x4c, 0x2b, 0xb0, 0x9b, 0xd8, 0x2c, 0xbe, 0xa1, 0x80, 0x9a, 0xfd, + 0x14, 0x79, 0x0b, 0xa6, 0x99, 0xc6, 0xca, 0x95, 0x19, 0x2d, 0xbf, 0x4e, 0x6c, 0xa4, 0x99, 0xf2, + 0xba, 0x73, 0xc6, 0xe4, 0x34, 0xe4, 0x75, 0x28, 0xf9, 0x5e, 0x57, 0xdc, 0xf4, 0x5f, 0x9b, 0x44, + 0xdb, 0xac, 0x55, 0x2b, 0x78, 0x3b, 0xe0, 0x75, 0xf9, 0x21, 0x7b, 0xb3, 0x0c, 0xd3, 0xac, 0x63, + 0xb5, 0x0f, 0xe0, 0xd2, 0x84, 0x0f, 0x12, 0x03, 0x96, 0x32, 0x5e, 0x10, 0xa7, 0x74, 0x90, 0x70, + 0x12, 0x07, 0x89, 0x40, 0x1c, 0xbc, 0x7a, 0x70, 0x71, 0x6c, 0x05, 0x49, 0x6d, 0xac, 0x04, 0xc1, + 0xd0, 0x46, 0xd9, 0x32, 0x79, 0xb2, 0x66, 0xa4, 0x0b, 0xff, 0xda, 0x6f, 0x16, 0xe0, 0x6c, 0xce, + 0x24, 0xfa, 0xff, 0x56, 0x95, 0xf8, 0x03, 0x85, 0xf7, 0x47, 0x5a, 0x18, 0x90, 0x36, 0x70, 0x27, + 0x1b, 0x2e, 0x38, 0x6e, 0x8c, 0x17, 0x1c, 0xb2, 0xef, 0x02, 0x8f, 0x71, 0x85, 0x00, 0xf9, 0x86, + 0x9e, 0x41, 0x9e, 0xc0, 0xab, 0x80, 0x0f, 0xdf, 0xfb, 0x70, 0x2e, 0x57, 0xb0, 0xd3, 0xa3, 0x2a, + 0x3a, 0xf7, 0x27, 0x56, 0x98, 0x19, 0xfa, 0x7b, 0x2f, 0x40, 0x0b, 0xdf, 0x03, 0xd7, 0x09, 0xdc, + 0x80, 0xdb, 0x00, 0xb8, 0x85, 0x8f, 0xc1, 0x64, 0x13, 0x40, 0x37, 0xbd, 0x8b, 0xf1, 0x6b, 0x49, + 0xb2, 0x0b, 0x67, 0x99, 0x74, 0x61, 0x47, 0x39, 0x9b, 0x5f, 0x65, 0x2a, 0x29, 0xc3, 0x0b, 0x92, + 0xe0, 0x21, 0x97, 0x1d, 0xeb, 0x18, 0xb5, 0xb9, 0x7c, 0x90, 0x05, 0x51, 0xe5, 0xed, 0x7c, 0x3e, + 0x36, 0xd9, 0x84, 0x39, 0xc6, 0x9c, 0x59, 0x41, 0x99, 0x0f, 0xca, 0xf5, 0x89, 0x5f, 0xa8, 0xe0, + 0x9b, 0xb7, 0x30, 0xfe, 0x9f, 0x9e, 0xfc, 0xd1, 0xdd, 0xcf, 0x3e, 0x92, 0x5d, 0x6c, 0xcc, 0x79, + 0x04, 0x72, 0xd7, 0x1a, 0xed, 0xbf, 0x2a, 0xa2, 0xa9, 0xa9, 0xfb, 0x17, 0xba, 0x03, 0x87, 0x6e, + 0x5f, 0xb8, 0x19, 0xcd, 0x9a, 0xfc, 0xd7, 0x63, 0x6a, 0x05, 0xe4, 0x0d, 0x98, 0xa7, 0x6c, 0x0f, + 0x86, 0x7d, 0xb6, 0x33, 0x17, 0x53, 0xb1, 0x37, 0x77, 0x59, 0x11, 0x1d, 0xb6, 0x9d, 0x33, 0xe6, + 0xdc, 0x51, 0xf2, 0x93, 0xbc, 0x04, 0xb3, 0xe1, 0x51, 0x34, 0x90, 0xf7, 0x73, 0x71, 0x17, 0x6d, + 0xed, 0xb6, 0x5b, 0x9c, 0xa4, 0x4c, 0x71, 0x12, 0xe3, 0xe0, 0xe6, 0x34, 0xbb, 0x8d, 0xd6, 0x5e, + 0x80, 0x39, 0x89, 0x37, 0x6d, 0x0c, 0x7b, 0x21, 0x2e, 0x1a, 0xc3, 0x7e, 0xf1, 0xc1, 0x7e, 0x00, + 0x65, 0xc1, 0x92, 0x10, 0x28, 0x1d, 0xfa, 0xa1, 0xd0, 0x87, 0xf0, 0x7f, 0x0a, 0x43, 0x6b, 0x01, + 0x6d, 0xe4, 0x94, 0x89, 0xff, 0xe3, 0x09, 0x0c, 0x2f, 0x40, 0x30, 0x62, 0x3b, 0xbe, 0x0a, 0x88, + 0xcd, 0x74, 0x14, 0xde, 0xee, 0x85, 0xec, 0xad, 0x80, 0x30, 0x18, 0xc6, 0x47, 0xd7, 0xcc, 0x85, + 0xd5, 0x38, 0xf5, 0x38, 0x75, 0xd0, 0x2a, 0x8c, 0x1e, 0xb4, 0x58, 0x4c, 0x45, 0x4e, 0xc9, 0xbe, + 0x0c, 0x08, 0x63, 0x07, 0xad, 0x44, 0x81, 0x2a, 0xa5, 0x14, 0x28, 0xe9, 0x0a, 0x22, 0x19, 0x3d, + 0x76, 0x4e, 0x13, 0x57, 0x10, 0x59, 0x95, 0xee, 0x5b, 0xf1, 0x0c, 0x49, 0x5d, 0x99, 0x91, 0x0d, + 0x38, 0xc7, 0x4c, 0x70, 0x2c, 0xf9, 0x5c, 0x56, 0x97, 0x3c, 0x8b, 0x85, 0x2c, 0xd7, 0x67, 0xac, + 0x53, 0x9e, 0x6c, 0x62, 0x27, 0xaf, 0xc0, 0x4a, 0x9c, 0x7a, 0x3e, 0x7c, 0xe8, 0x0d, 0x58, 0xa6, + 0xdc, 0x63, 0x6e, 0x1c, 0x23, 0xa2, 0xcc, 0x7a, 0xe8, 0x0d, 0x30, 0x6b, 0xae, 0xe8, 0xe1, 0xdf, + 0x2b, 0x88, 0x8b, 0x9b, 0x4d, 0xdf, 0x8f, 0xc2, 0x28, 0x70, 0x06, 0x29, 0xa7, 0x00, 0x72, 0x04, + 0x17, 0xb1, 0x4a, 0x1b, 0x98, 0x6d, 0xcf, 0x0f, 0xc4, 0x45, 0x57, 0xbc, 0xc0, 0xe6, 0x36, 0x5e, + 0x4e, 0x1b, 0x3d, 0x75, 0x8a, 0xad, 0xcb, 0xc8, 0x74, 0x5d, 0x49, 0x5c, 0x77, 0xce, 0x98, 0x17, + 0x18, 0xcf, 0x11, 0x2c, 0xb2, 0x93, 0x23, 0x6b, 0xb2, 0x5e, 0x01, 0x9b, 0x89, 0xe0, 0x49, 0x73, + 0x95, 0x45, 0x12, 0x79, 0x07, 0x66, 0xbd, 0xae, 0x9c, 0xf3, 0x3e, 0x7b, 0x1f, 0x5d, 0xeb, 0xb2, + 0x5c, 0x37, 0x09, 0x0f, 0xba, 0x34, 0x3c, 0x0e, 0xdd, 0x5c, 0x48, 0x69, 0x38, 0xda, 0x8e, 0xb8, + 0x23, 0x18, 0x25, 0x23, 0x8b, 0xc9, 0xde, 0x87, 0xfb, 0x1c, 0x4a, 0x81, 0x24, 0xdb, 0x8e, 0xc9, + 0x7f, 0xf1, 0x2e, 0xff, 0x15, 0x78, 0xee, 0xb4, 0x3d, 0x45, 0xe5, 0xc6, 0x98, 0x6e, 0x9f, 0x65, + 0x91, 0xf6, 0xd3, 0xbd, 0x77, 0x1d, 0xe4, 0x0c, 0x21, 0x9e, 0x98, 0x28, 0x02, 0xb6, 0x17, 0x78, + 0xda, 0x5f, 0x14, 0x61, 0x31, 0xed, 0x36, 0x42, 0x5e, 0x80, 0x92, 0x24, 0x2e, 0x2f, 0xe4, 0xf8, + 0x96, 0xa0, 0x90, 0x44, 0xa4, 0x53, 0x89, 0x47, 0x72, 0x1b, 0x16, 0xf1, 0xe5, 0x0b, 0xaa, 0x71, + 0x91, 0xc7, 0xaf, 0x44, 0x4f, 0x7b, 0xd9, 0x39, 0x4f, 0x69, 0xe9, 0xf6, 0x48, 0x0b, 0x25, 0xaf, + 0x80, 0xd2, 0x78, 0xaf, 0x00, 0xde, 0x94, 0x31, 0x5e, 0x01, 0x53, 0x13, 0xbc, 0x02, 0x12, 0x4a, + 0xd9, 0x2b, 0x00, 0x7d, 0x43, 0x66, 0xc6, 0xf9, 0x86, 0x24, 0x34, 0xcc, 0x37, 0x24, 0xb9, 0xd5, + 0x2f, 0x8f, 0xbd, 0xd5, 0x4f, 0x68, 0xf8, 0xad, 0x7e, 0x72, 0xcf, 0x3e, 0x3b, 0xf6, 0x9e, 0x5d, + 0x22, 0x62, 0xf7, 0xec, 0xcf, 0xf0, 0x8e, 0x0d, 0x9c, 0x47, 0x36, 0xf6, 0x38, 0x3f, 0x1f, 0x61, + 0x97, 0x99, 0xce, 0x23, 0xf4, 0x50, 0xa7, 0xea, 0x09, 0x77, 0x6b, 0xd7, 0xbe, 0x9d, 0x11, 0x43, + 0x62, 0xcc, 0x9f, 0x85, 0x45, 0xb6, 0x1b, 0xf3, 0x0c, 0x0e, 0x6c, 0x3b, 0x5e, 0x30, 0x17, 0x04, + 0x94, 0x99, 0xe6, 0x7f, 0x01, 0x96, 0x62, 0x34, 0x6e, 0x9d, 0xc6, 0x90, 0x1b, 0x66, 0x4c, 0xcd, + 0xed, 0xd2, 0x32, 0xbf, 0x80, 0x47, 0xa7, 0x4c, 0xf1, 0x63, 0xc6, 0xdd, 0x17, 0x81, 0x24, 0x68, + 0xf1, 0x23, 0x9f, 0x12, 0xa2, 0x2e, 0xc7, 0xa8, 0xf1, 0x4b, 0x9c, 0xdf, 0x51, 0x32, 0x17, 0xd3, + 0x3f, 0xab, 0xea, 0xbf, 0x00, 0xf1, 0xd7, 0x6d, 0x7e, 0xb9, 0x28, 0x5a, 0xa0, 0x8a, 0x82, 0x16, + 0x87, 0x6b, 0x07, 0x59, 0x7b, 0xea, 0xcf, 0xa8, 0x56, 0xda, 0xef, 0x95, 0x52, 0xf7, 0x65, 0xe2, + 0x33, 0x54, 0xcb, 0x09, 0x7d, 0x9b, 0x0f, 0x31, 0x17, 0xc2, 0xd7, 0xc7, 0x4c, 0x53, 0xfe, 0xac, + 0xc1, 0xb2, 0x9a, 0x26, 0x84, 0xa1, 0x2f, 0x5e, 0x39, 0xd8, 0xcc, 0xb8, 0x25, 0x9d, 0xfa, 0x04, + 0x3b, 0x26, 0x71, 0xd7, 0x27, 0xb3, 0x13, 0x17, 0x12, 0x74, 0x95, 0xa2, 0x91, 0x2b, 0xfe, 0x25, + 0x3e, 0xb0, 0x07, 0x78, 0xc7, 0x1d, 0xa6, 0x99, 0xe7, 0x99, 0x82, 0x46, 0x98, 0x63, 0x2f, 0x21, + 0x67, 0xbc, 0xad, 0x08, 0x65, 0xb6, 0x06, 0xcc, 0xe3, 0x6d, 0x94, 0x60, 0x58, 0xca, 0xf1, 0xc2, + 0x19, 0x6d, 0x7c, 0xa5, 0xb6, 0x6b, 0xce, 0x51, 0x3a, 0xc1, 0xe6, 0x10, 0x2e, 0xca, 0x77, 0x48, + 0xe9, 0x4a, 0x4e, 0x89, 0xbc, 0x2b, 0x13, 0x7b, 0x20, 0xb9, 0x6a, 0xc2, 0xaa, 0x9e, 0x77, 0xd2, + 0x00, 0xf1, 0xa5, 0x0e, 0x5c, 0x1c, 0xb9, 0x41, 0x89, 0xbf, 0xc4, 0xbc, 0xc2, 0x9e, 0x1b, 0xf3, + 0xa5, 0xcc, 0xd5, 0x8a, 0x1b, 0x98, 0xe7, 0xc3, 0x34, 0x88, 0x7f, 0x04, 0x9f, 0x11, 0x8d, 0x1f, + 0xf8, 0x09, 0xb9, 0x7a, 0x13, 0x35, 0xaa, 0x20, 0xab, 0x51, 0xf2, 0xbd, 0x55, 0x31, 0x7d, 0x6f, + 0xb5, 0x05, 0xd7, 0xa8, 0xcc, 0xe3, 0x33, 0xc7, 0xfd, 0xc8, 0x0d, 0x8e, 0xfd, 0x3e, 0x86, 0xf0, + 0x1c, 0xc4, 0x4b, 0x9f, 0x5d, 0xb4, 0x5d, 0xa6, 0x78, 0x38, 0x2f, 0x0c, 0x8e, 0xb5, 0x8b, 0x48, + 0x2c, 0x34, 0xed, 0x3f, 0x2b, 0xc2, 0xd3, 0xa7, 0x98, 0x5c, 0x13, 0xea, 0xfe, 0xf9, 0xb4, 0xb2, + 0x5f, 0x48, 0x59, 0xe7, 0x29, 0xd3, 0xc4, 0xdc, 0x3d, 0x46, 0xd5, 0xff, 0x65, 0x58, 0x62, 0xdb, + 0x14, 0x7b, 0x47, 0xb5, 0x3f, 0xec, 0x9d, 0x62, 0x9f, 0xba, 0x24, 0xa2, 0x44, 0x64, 0x48, 0x71, + 0xeb, 0x42, 0xe9, 0x6c, 0xc5, 0x30, 0xd2, 0x86, 0x39, 0x44, 0xdb, 0x77, 0xbc, 0xde, 0xa9, 0xc2, + 0x15, 0x88, 0x18, 0x14, 0x32, 0x19, 0x7b, 0x2f, 0x4a, 0x01, 0x5b, 0xf8, 0x9b, 0xdc, 0x80, 0xa5, + 0xfe, 0xf0, 0x88, 0xaa, 0xb1, 0x6c, 0xe6, 0x72, 0x77, 0xf5, 0x29, 0x73, 0xa1, 0x3f, 0x3c, 0xd2, + 0x07, 0x03, 0x9c, 0x80, 0xe8, 0xd7, 0xbe, 0x4c, 0xf1, 0x98, 0x8c, 0x11, 0x98, 0xd3, 0x88, 0x49, + 0x19, 0x30, 0x29, 0xc3, 0x71, 0x57, 0x80, 0xbd, 0x72, 0xe2, 0x39, 0x8f, 0xd9, 0x0f, 0xed, 0x7f, + 0x16, 0x84, 0xa1, 0x7c, 0xfc, 0x2a, 0xfd, 0xf9, 0x10, 0xe5, 0x0c, 0xd1, 0x73, 0xa0, 0xd2, 0xae, + 0x4f, 0x44, 0x60, 0x3c, 0x46, 0x8b, 0xfd, 0xe1, 0x51, 0xdc, 0x77, 0x72, 0xc7, 0x4f, 0xcb, 0x1d, + 0xff, 0x86, 0x30, 0x44, 0xe7, 0x0a, 0xb3, 0xf1, 0x5d, 0x4e, 0xf5, 0xbb, 0x1b, 0xa7, 0x13, 0x59, + 0x3f, 0x1f, 0xb7, 0x9c, 0x71, 0xcb, 0x5c, 0xe9, 0x4f, 0x8d, 0x5c, 0xe9, 0xe7, 0xac, 0xbd, 0xe9, + 0xbc, 0xb5, 0x37, 0xe2, 0x40, 0x30, 0x93, 0xe3, 0x40, 0x90, 0xbb, 0x40, 0xcb, 0x27, 0x2c, 0xd0, + 0x59, 0x79, 0x9e, 0x7c, 0xaf, 0x00, 0xd7, 0x4f, 0xdc, 0x37, 0x7e, 0x3e, 0xd2, 0x39, 0x23, 0x9d, + 0xdf, 0x9f, 0x7f, 0x51, 0x10, 0xfa, 0x72, 0xfa, 0x18, 0xfc, 0x3e, 0x9c, 0x15, 0xc7, 0x60, 0xa6, + 0x37, 0x24, 0x7e, 0x36, 0x73, 0x1b, 0xcf, 0xe7, 0x1d, 0x80, 0x11, 0x2d, 0xe7, 0x90, 0xba, 0xcc, + 0x8f, 0xbe, 0x49, 0xf9, 0xff, 0x3b, 0x87, 0x5e, 0x72, 0x1f, 0xce, 0x63, 0x46, 0xb6, 0x8e, 0xec, + 0x21, 0x64, 0x07, 0xee, 0x3e, 0xef, 0xf5, 0xeb, 0x23, 0x87, 0x43, 0xaf, 0x23, 0x55, 0xc7, 0x74, + 0xf7, 0x77, 0xce, 0x98, 0x2b, 0x61, 0x0e, 0x9c, 0x9b, 0x9a, 0x32, 0xa7, 0xea, 0x7f, 0xa5, 0x80, + 0x76, 0x72, 0xaf, 0xa1, 0x01, 0x24, 0xdb, 0xed, 0xb3, 0xe6, 0x9c, 0x23, 0xf5, 0xe1, 0xd3, 0xb0, + 0x10, 0xb8, 0xfb, 0x81, 0x1b, 0x1e, 0xa6, 0xac, 0x94, 0xf3, 0x1c, 0x28, 0xba, 0x47, 0x24, 0x87, + 0x78, 0xac, 0x03, 0xa9, 0x20, 0x8a, 0x7d, 0x6f, 0x2f, 0x4f, 0x1a, 0x13, 0x3a, 0xb3, 0xe4, 0x6a, + 0xb2, 0x1f, 0xb1, 0x9f, 0x57, 0x41, 0x2d, 0x9a, 0x3c, 0x9d, 0xc5, 0xbe, 0xd7, 0x73, 0xb5, 0x7f, + 0x13, 0xeb, 0x6e, 0x79, 0xdd, 0x49, 0xde, 0x97, 0xde, 0x77, 0x16, 0x47, 0xd4, 0xd2, 0x3c, 0x92, + 0xd3, 0x98, 0x93, 0xeb, 0x9f, 0x92, 0x39, 0xf9, 0x96, 0x78, 0x24, 0x42, 0x77, 0x95, 0xbb, 0x37, + 0xc9, 0xf3, 0x30, 0xc3, 0xde, 0x85, 0x88, 0xea, 0x2e, 0xa5, 0xaa, 0x7b, 0xf7, 0xa6, 0x29, 0xca, + 0xb5, 0x6f, 0xc4, 0x1e, 0x6d, 0x23, 0x8d, 0xb8, 0x7b, 0x93, 0xbc, 0x71, 0xba, 0xf7, 0x9a, 0x65, + 0xf1, 0x5e, 0x33, 0x7e, 0xab, 0xf9, 0x66, 0xea, 0xad, 0xe6, 0x33, 0x93, 0x7b, 0x8b, 0x3b, 0x4b, + 0xb2, 0x14, 0x01, 0x71, 0x9c, 0x67, 0xed, 0xab, 0x45, 0x78, 0x6a, 0x22, 0x05, 0xb9, 0x0c, 0x65, + 0xbd, 0x55, 0x6b, 0x27, 0xa3, 0x4c, 0x57, 0x91, 0x80, 0x90, 0x6d, 0x98, 0xdd, 0x74, 0x42, 0xaf, + 0x43, 0xa7, 0x74, 0xae, 0x13, 0xcc, 0x08, 0xdb, 0x18, 0x7d, 0xe7, 0x8c, 0x99, 0xd0, 0x12, 0x1b, + 0x96, 0x71, 0x5d, 0xa4, 0x32, 0x38, 0x17, 0x73, 0x8c, 0x6e, 0x23, 0x0c, 0x47, 0xc8, 0xa8, 0xe4, + 0x19, 0x01, 0x92, 0x07, 0x40, 0x2c, 0x6b, 0xa7, 0xe2, 0x06, 0x11, 0x37, 0x43, 0x45, 0x5e, 0xfc, + 0xf8, 0xef, 0x95, 0x13, 0xfa, 0x6e, 0x84, 0x6e, 0xe7, 0x8c, 0x99, 0xc3, 0x8d, 0x5c, 0x07, 0x39, + 0xd5, 0x38, 0x6a, 0x41, 0xf3, 0x3b, 0x67, 0x4c, 0x18, 0xc4, 0x29, 0xc7, 0xf3, 0x65, 0xc3, 0xaf, + 0x08, 0xd5, 0x73, 0x7c, 0x6f, 0x3d, 0x46, 0x9e, 0x96, 0xe7, 0xa0, 0xdc, 0x12, 0x3e, 0xd5, 0xd2, + 0x6b, 0x6b, 0xe1, 0x3f, 0x6d, 0xc6, 0xa5, 0x7c, 0x66, 0xff, 0xb6, 0x22, 0xcc, 0x74, 0x27, 0xf7, + 0xad, 0x94, 0x8f, 0xbb, 0x3b, 0x39, 0x1f, 0x77, 0xf7, 0xa7, 0xcc, 0xc7, 0xcd, 0x2b, 0xe5, 0xc3, + 0xf3, 0xa7, 0x1e, 0x0d, 0xf2, 0x16, 0xa8, 0x98, 0xaf, 0xd8, 0x91, 0x46, 0x36, 0x1d, 0x9c, 0x9c, + 0x05, 0xdf, 0x6c, 0x39, 0x5e, 0x60, 0x2e, 0x75, 0xd2, 0xd4, 0xfc, 0x83, 0xbf, 0xcf, 0x53, 0xb8, + 0xd5, 0xba, 0xad, 0xcc, 0xd5, 0xfb, 0x93, 0x3e, 0xd9, 0x37, 0x52, 0xeb, 0x54, 0xec, 0x75, 0xf9, + 0xdf, 0x1a, 0xff, 0x72, 0x5f, 0x5a, 0xb4, 0xff, 0xb0, 0x08, 0x97, 0x27, 0x91, 0x13, 0x1d, 0x54, + 0x83, 0x85, 0x01, 0xe5, 0x8f, 0x25, 0xfd, 0x40, 0x4e, 0x29, 0xca, 0x42, 0x84, 0xda, 0xdd, 0xb8, + 0xd0, 0x1c, 0x41, 0xa7, 0xe3, 0xcc, 0x60, 0xf1, 0x7b, 0x74, 0x1c, 0x67, 0x4e, 0x4a, 0xc7, 0x59, + 0x14, 0x93, 0xa7, 0x61, 0x5a, 0xaf, 0x58, 0x49, 0xee, 0x74, 0x7c, 0x38, 0xea, 0x74, 0x42, 0x7c, + 0x92, 0xc8, 0x8b, 0xc8, 0x2f, 0x81, 0x9a, 0x4d, 0x9d, 0xc8, 0x93, 0xa6, 0x5f, 0x92, 0x3a, 0x64, + 0x24, 0xbb, 0x22, 0xd6, 0x37, 0xc9, 0x06, 0xc8, 0x13, 0x6c, 0x99, 0x23, 0xbc, 0x88, 0x06, 0xd3, + 0xad, 0xc0, 0x0d, 0xdd, 0x48, 0x7e, 0xd4, 0x39, 0x40, 0x88, 0xc9, 0x4b, 0xf8, 0x93, 0x4b, 0xe7, + 0x98, 0x85, 0xe4, 0x9b, 0x96, 0x43, 0xaf, 0xe2, 0x1b, 0x4d, 0x0a, 0x36, 0x25, 0x14, 0x4a, 0x50, + 0x77, 0x86, 0xfd, 0xce, 0xe1, 0x9e, 0x59, 0xe7, 0x6a, 0x2d, 0x23, 0xe8, 0x21, 0x94, 0x36, 0x30, + 0x34, 0x25, 0x14, 0xed, 0xd7, 0x15, 0x58, 0xc9, 0x6b, 0xc7, 0x09, 0x5e, 0x3b, 0xaf, 0xc0, 0x1c, + 0xde, 0xd0, 0xee, 0xfb, 0xc1, 0x91, 0x13, 0xc9, 0x4f, 0x5f, 0x25, 0xb0, 0x89, 0x37, 0xca, 0x5b, + 0xf8, 0x3f, 0xb9, 0x2a, 0x76, 0x2b, 0x29, 0x31, 0x0a, 0x02, 0xf8, 0xc6, 0xa5, 0xe9, 0x00, 0xb5, + 0x6e, 0xab, 0x39, 0x60, 0xd9, 0xfd, 0x5e, 0x85, 0x12, 0xad, 0x56, 0x66, 0xf6, 0xd2, 0xf9, 0xa3, + 0xef, 0xd6, 0x39, 0x12, 0xab, 0x55, 0xe8, 0x1c, 0xf5, 0x4c, 0x44, 0xd6, 0xee, 0xc1, 0x62, 0x1a, + 0x83, 0x18, 0xe9, 0x04, 0x2f, 0x73, 0x1b, 0x2a, 0xe7, 0xb4, 0xe9, 0xfb, 0x2c, 0xfc, 0xc2, 0xe6, + 0xc5, 0xef, 0x7f, 0x72, 0x15, 0xe8, 0x4f, 0x46, 0x93, 0x97, 0x00, 0x46, 0xfb, 0x7a, 0x01, 0x56, + 0x92, 0x10, 0x71, 0x62, 0x0d, 0xfd, 0xb5, 0x0d, 0x3f, 0xa4, 0xa7, 0xc2, 0xe3, 0x08, 0x25, 0x74, + 0xb4, 0x81, 0x13, 0xa2, 0x72, 0x6c, 0xc3, 0xea, 0x38, 0x7c, 0xf2, 0x02, 0xcc, 0x62, 0xa4, 0xe2, + 0x81, 0xd3, 0x71, 0x65, 0x91, 0xdb, 0x17, 0x40, 0x33, 0x29, 0xd7, 0xbe, 0xa7, 0xc0, 0x1a, 0x0f, + 0x1a, 0xb0, 0xeb, 0x78, 0x7d, 0xbc, 0x10, 0xec, 0xb8, 0x9f, 0x4e, 0xf8, 0xac, 0xed, 0x94, 0x1c, + 0x7b, 0x36, 0x1d, 0x1b, 0x62, 0xe4, 0x6b, 0xe3, 0x5b, 0x4b, 0x9e, 0xc7, 0xe8, 0xdb, 0xdc, 0xcd, + 0xb4, 0xc4, 0xe2, 0x1b, 0xf6, 0x29, 0x40, 0x8e, 0x6f, 0x88, 0x18, 0xda, 0xdf, 0x86, 0x2b, 0x93, + 0x3f, 0x40, 0xbe, 0x04, 0x0b, 0x98, 0x78, 0x7b, 0x6f, 0x70, 0x10, 0x38, 0x5d, 0x57, 0x18, 0x89, + 0xc5, 0x5d, 0x86, 0x5c, 0xc6, 0x82, 0x89, 0xf3, 0x78, 0x7b, 0x07, 0x98, 0xd2, 0x9b, 0x13, 0xa5, + 0x22, 0x73, 0xc8, 0xdc, 0xb4, 0xaf, 0x28, 0x40, 0x46, 0x79, 0x90, 0xd7, 0x61, 0x7e, 0xaf, 0x5d, + 0xb1, 0x22, 0x27, 0x88, 0x76, 0xfc, 0x61, 0xc0, 0x23, 0x79, 0xb3, 0xf0, 0x6b, 0x51, 0xc7, 0x66, + 0x57, 0xbf, 0x87, 0xfe, 0x30, 0x30, 0x53, 0x78, 0x98, 0xb2, 0xd9, 0x75, 0x1f, 0x76, 0x9d, 0xe3, + 0x74, 0xca, 0x66, 0x0e, 0x4b, 0xa5, 0x6c, 0xe6, 0x30, 0xed, 0x5b, 0x0a, 0x5c, 0x12, 0xcf, 0xbe, + 0xba, 0x39, 0x75, 0xa9, 0x60, 0x90, 0xd1, 0x40, 0xa4, 0xcd, 0x99, 0xa4, 0xe8, 0x2f, 0x8b, 0x38, + 0xbc, 0x58, 0x41, 0xd4, 0xf8, 0x19, 0x2d, 0xf9, 0x3c, 0x94, 0xac, 0xc8, 0x1f, 0x9c, 0x22, 0x10, + 0xaf, 0x1a, 0x8f, 0x68, 0xe4, 0x0f, 0x90, 0x05, 0x52, 0x6a, 0x2e, 0xac, 0xc8, 0x95, 0x13, 0x35, + 0x26, 0xbb, 0x30, 0xc3, 0xa3, 0xb8, 0x67, 0xbc, 0x49, 0x27, 0xb4, 0x69, 0x73, 0x49, 0x44, 0xfb, + 0xe5, 0x09, 0x5e, 0x4c, 0xc1, 0x43, 0xfb, 0x7b, 0x0a, 0xcc, 0x51, 0x55, 0x07, 0x2d, 0x06, 0x4f, + 0x3a, 0xa5, 0xd3, 0x2a, 0xb4, 0xf0, 0x33, 0x8f, 0xd9, 0x9f, 0x6a, 0x37, 0x7e, 0x0d, 0x96, 0x32, + 0x04, 0x44, 0xc3, 0x38, 0x8f, 0x3d, 0xaf, 0xe3, 0xb0, 0x0c, 0xb0, 0xcc, 0x47, 0x3b, 0x05, 0xd3, + 0x7e, 0x43, 0x81, 0x95, 0xe6, 0xc3, 0xc8, 0x61, 0x1e, 0x1a, 0xe6, 0xb0, 0x27, 0xd6, 0x3b, 0x55, + 0xdf, 0xc4, 0xfb, 0x41, 0x16, 0x52, 0x8e, 0xa9, 0x6f, 0x1c, 0x66, 0xc6, 0xa5, 0x64, 0x07, 0xca, + 0x7c, 0x7f, 0x09, 0x79, 0xbe, 0x92, 0x2b, 0x92, 0x39, 0x23, 0x61, 0xcc, 0x91, 0x68, 0x4b, 0x50, + 0x84, 0x71, 0x1a, 0x33, 0xa6, 0xd6, 0xfe, 0x52, 0x81, 0x0b, 0x63, 0x68, 0xc8, 0xdb, 0x30, 0x85, + 0xe1, 0x6e, 0xf8, 0xe8, 0x5d, 0x1e, 0xf3, 0x89, 0xa8, 0x73, 0x78, 0xf7, 0x26, 0xdb, 0x88, 0x8e, + 0xe8, 0x0f, 0x93, 0x51, 0x91, 0xf7, 0x61, 0x56, 0xef, 0x76, 0xf9, 0xc1, 0xae, 0x90, 0x3a, 0xd8, + 0x8d, 0xf9, 0xe2, 0x4b, 0x31, 0x3e, 0x3b, 0xd8, 0xb1, 0xc0, 0x0b, 0xdd, 0xae, 0xcd, 0x43, 0xf9, + 0x24, 0xfc, 0xd6, 0xde, 0x82, 0xc5, 0x34, 0xf2, 0x63, 0x45, 0x1f, 0xf9, 0x86, 0x02, 0x6a, 0xba, + 0x0e, 0x3f, 0x9b, 0x38, 0xc5, 0x79, 0xc3, 0x7c, 0xc2, 0xa4, 0xfa, 0xfb, 0x05, 0x38, 0x97, 0xdb, + 0xc3, 0xe4, 0x45, 0x98, 0xd6, 0x07, 0x83, 0x5a, 0x95, 0xcf, 0x2a, 0xae, 0x21, 0xe1, 0xcd, 0x46, + 0xea, 0xdc, 0xcb, 0x90, 0xc8, 0xab, 0x50, 0x66, 0x8e, 0x40, 0x55, 0x21, 0x70, 0x30, 0xf0, 0x2a, + 0xf7, 0x52, 0x4a, 0x67, 0x0e, 0x11, 0x88, 0x64, 0x0b, 0x16, 0x79, 0xc8, 0x52, 0xf4, 0x0a, 0x8b, + 0x13, 0xf0, 0xa1, 0x23, 0x9d, 0xb8, 0x2e, 0x61, 0xfe, 0x64, 0x29, 0xd9, 0x99, 0xa1, 0x22, 0x75, + 0x50, 0x91, 0xa7, 0xcc, 0x89, 0xa5, 0x2f, 0x91, 0x1c, 0x31, 0xc7, 0xf0, 0x1a, 0xa1, 0x8c, 0x87, + 0x8b, 0xbd, 0xa4, 0x39, 0x72, 0xfb, 0xd1, 0xcf, 0x6e, 0xb8, 0x92, 0x6f, 0x9c, 0x6a, 0xb8, 0x7e, + 0xb7, 0xc4, 0x16, 0x73, 0x96, 0x8c, 0x6a, 0x34, 0x52, 0xbe, 0x2d, 0xd4, 0x68, 0xe8, 0x89, 0x8d, + 0x07, 0xe5, 0xac, 0xc2, 0x4c, 0x9b, 0xe7, 0x52, 0x62, 0x2b, 0xe3, 0xa9, 0xdc, 0x2a, 0x30, 0x9c, + 0xbb, 0x37, 0x99, 0xfa, 0xc2, 0x73, 0x2b, 0x99, 0x82, 0x94, 0xdc, 0x85, 0xb9, 0x4a, 0xcf, 0x75, + 0xfa, 0xc3, 0x41, 0xfb, 0x74, 0xfe, 0x07, 0xab, 0xbc, 0x2d, 0xf3, 0x1d, 0x46, 0x86, 0x7e, 0x0b, + 0x28, 0xc9, 0x65, 0x46, 0xa4, 0x1d, 0x87, 0xe2, 0x28, 0xa1, 0xad, 0xf4, 0x95, 0x09, 0xfd, 0x93, + 0x05, 0x22, 0x5d, 0x3a, 0xce, 0x0c, 0x8f, 0xd5, 0x61, 0xc3, 0x62, 0xdd, 0x09, 0xa3, 0x76, 0xe0, + 0xf4, 0x43, 0x4c, 0xdc, 0x70, 0x8a, 0x20, 0xd4, 0x97, 0x78, 0x85, 0x99, 0x0d, 0x35, 0x8a, 0x49, + 0x99, 0x0d, 0x35, 0xcd, 0x8e, 0xea, 0x4b, 0x5b, 0x5e, 0xdf, 0xe9, 0x79, 0x5f, 0x16, 0x11, 0x8b, + 0x98, 0xbe, 0xb4, 0x2f, 0x80, 0x66, 0x52, 0xae, 0x7d, 0x71, 0x64, 0xdc, 0x58, 0x2d, 0xe7, 0x60, + 0x86, 0xc7, 0xb3, 0x63, 0xf1, 0xdd, 0x5a, 0x46, 0xa3, 0x5a, 0x6b, 0x6c, 0xab, 0x0a, 0x59, 0x04, + 0x68, 0x99, 0xcd, 0x8a, 0x61, 0x59, 0xf4, 0x77, 0x81, 0xfe, 0xe6, 0xc1, 0xdf, 0xb6, 0xf6, 0xea, + 0x6a, 0x51, 0x8a, 0xff, 0x56, 0xd2, 0xbe, 0xab, 0xc0, 0xf9, 0xfc, 0xa1, 0x24, 0x6d, 0xee, 0xa8, + 0xcf, 0x3c, 0x51, 0x5e, 0x9f, 0x38, 0xee, 0xb9, 0xe0, 0x6c, 0x24, 0xc1, 0x88, 0x45, 0xa8, 0x2b, + 0x88, 0x0b, 0x4e, 0x16, 0xf2, 0xc6, 0xeb, 0x9a, 0x05, 0xaf, 0xab, 0x55, 0x60, 0x75, 0x1c, 0x8f, + 0x74, 0x53, 0x97, 0x60, 0x4e, 0x6f, 0xb5, 0xea, 0xb5, 0x8a, 0xde, 0xae, 0x35, 0x1b, 0xaa, 0x42, + 0x66, 0x61, 0x6a, 0xdb, 0x6c, 0xee, 0xb5, 0xd4, 0x82, 0xf6, 0xc7, 0x0a, 0x2c, 0xd4, 0x12, 0x4f, + 0xd9, 0x27, 0x5d, 0x7c, 0x9f, 0x4d, 0x2d, 0xbe, 0xd5, 0x38, 0x56, 0x66, 0xfc, 0x81, 0x09, 0x1a, + 0xe4, 0x66, 0x1c, 0xd0, 0xa8, 0x98, 0xf2, 0x28, 0x91, 0xa9, 0x45, 0xa8, 0x98, 0x38, 0x67, 0x60, + 0x3a, 0xe0, 0x91, 0xb4, 0x7a, 0xff, 0x45, 0x11, 0x96, 0x47, 0xbe, 0x4b, 0x2c, 0x98, 0xd1, 0xef, + 0x59, 0xcd, 0x5a, 0xb5, 0xc2, 0x5b, 0x77, 0x35, 0xf1, 0xae, 0xc4, 0x14, 0xd8, 0x23, 0x35, 0x65, + 0x31, 0xaa, 0x1e, 0x85, 0xb6, 0xef, 0x75, 0x3b, 0x29, 0xf7, 0x5e, 0xc1, 0x09, 0x77, 0xc3, 0x2f, + 0x0f, 0x03, 0xf4, 0x58, 0xe6, 0x2d, 0x8f, 0x9d, 0x36, 0x05, 0x7c, 0x94, 0x31, 0xfa, 0xf0, 0x3a, + 0xb4, 0x7c, 0x94, 0x75, 0xc2, 0x8f, 0x34, 0x60, 0x7a, 0xdb, 0x8b, 0x76, 0x86, 0x0f, 0x78, 0xaf, + 0x5c, 0x49, 0x12, 0x22, 0xef, 0x0c, 0x1f, 0x8c, 0xb2, 0x45, 0x8b, 0x29, 0x8b, 0x4f, 0x91, 0x62, + 0xc9, 0xb9, 0x90, 0x3b, 0x30, 0xa5, 0xdf, 0xb3, 0x4c, 0x9d, 0xaf, 0x50, 0xc9, 0x7f, 0xd5, 0xd4, + 0xc7, 0x70, 0xa3, 0xad, 0x0f, 0x9c, 0x14, 0x37, 0xc6, 0x23, 0x1b, 0xa3, 0xa7, 0xf4, 0x58, 0x31, + 0x7a, 0x36, 0x17, 0x60, 0x8e, 0x1f, 0xea, 0xf0, 0xbc, 0xf4, 0x31, 0x9c, 0xcd, 0x19, 0x6a, 0xe2, + 0xa0, 0x97, 0x3c, 0xde, 0xba, 0xeb, 0xfd, 0xe3, 0x47, 0x87, 0x6e, 0xe0, 0x8e, 0x8e, 0x5d, 0xba, + 0xee, 0x62, 0x96, 0xe4, 0xd6, 0xde, 0x1c, 0x61, 0xa7, 0xfd, 0x91, 0x02, 0xab, 0xe3, 0x26, 0x00, + 0x3d, 0xa1, 0xa6, 0xa3, 0x00, 0x9e, 0x8f, 0x13, 0x7f, 0xa6, 0xbd, 0xdb, 0x05, 0x1a, 0x79, 0x17, + 0xe6, 0x98, 0x07, 0xa4, 0xf5, 0xea, 0x9e, 0x59, 0xe3, 0x2b, 0xf7, 0xa9, 0x1f, 0x7d, 0x72, 0xf5, + 0x02, 0x77, 0x9a, 0x0c, 0x5f, 0xb5, 0x87, 0x81, 0x97, 0x90, 0xae, 0x2a, 0xa6, 0x4c, 0x41, 0x0f, + 0x14, 0xce, 0xb0, 0xeb, 0xb9, 0xe2, 0x38, 0x25, 0x22, 0xa5, 0x71, 0x98, 0xbc, 0xbd, 0x0b, 0x98, + 0xf6, 0x35, 0x05, 0xd6, 0xc6, 0xcf, 0x36, 0xaa, 0x32, 0xb4, 0x99, 0x23, 0xa9, 0x88, 0x55, 0x86, + 0x2a, 0x43, 0xec, 0x6d, 0x2a, 0xf3, 0x14, 0x88, 0x94, 0x88, 0x1b, 0xfe, 0x84, 0xbd, 0x08, 0x89, + 0x62, 0xbb, 0xa0, 0x4c, 0x24, 0x10, 0xb5, 0xfb, 0x70, 0x61, 0xcc, 0xdc, 0x24, 0xef, 0xe4, 0xa6, + 0x13, 0xc6, 0x58, 0x14, 0x72, 0xb0, 0x91, 0x54, 0x5e, 0x7a, 0x09, 0xae, 0xfd, 0x67, 0xe6, 0x3a, + 0x9d, 0x33, 0x51, 0xa9, 0x76, 0x83, 0xe9, 0x6b, 0xf5, 0x7e, 0xe7, 0xd0, 0x0f, 0x92, 0xc1, 0x42, + 0xed, 0x26, 0xa2, 0x25, 0xb6, 0x83, 0x45, 0x99, 0x41, 0xcb, 0x50, 0x11, 0x1f, 0x96, 0x5b, 0x81, + 0xbf, 0xef, 0xb1, 0x87, 0xcb, 0xec, 0x50, 0xca, 0xd7, 0xf4, 0x73, 0xd2, 0x74, 0x93, 0xa7, 0xcf, + 0x08, 0x7e, 0x9c, 0xc7, 0x8d, 0x82, 0x99, 0x6f, 0x4e, 0x07, 0x0b, 0xcc, 0x51, 0xde, 0xda, 0xf7, + 0x0b, 0x70, 0xfd, 0x44, 0x8e, 0xa7, 0xcd, 0xc2, 0xfb, 0x32, 0x00, 0xa7, 0xa5, 0x3d, 0x20, 0x99, + 0x9c, 0x44, 0x65, 0x9c, 0xa0, 0x6f, 0x4a, 0x28, 0xe4, 0x21, 0x3c, 0x25, 0x7e, 0x75, 0x3a, 0xee, + 0x20, 0x0a, 0x69, 0x3d, 0x78, 0xf0, 0xf2, 0x38, 0x0a, 0x5b, 0x79, 0xf3, 0xd9, 0x1f, 0x7d, 0x72, + 0xf5, 0x7a, 0xcc, 0x83, 0x61, 0xb2, 0x07, 0x1e, 0x22, 0x0e, 0x3a, 0x1a, 0xbe, 0x26, 0xf3, 0x22, + 0x37, 0x92, 0x95, 0x54, 0x4a, 0x4c, 0xd8, 0x62, 0x25, 0x25, 0xeb, 0x67, 0x07, 0x08, 0x67, 0x44, + 0xc9, 0xb6, 0xe4, 0xbb, 0x6c, 0x26, 0x35, 0x45, 0x4d, 0x98, 0x21, 0x8d, 0x95, 0x9b, 0x39, 0x34, + 0xda, 0xef, 0xb0, 0x85, 0x9d, 0x2b, 0x1d, 0xc8, 0x23, 0x58, 0xa2, 0x5a, 0x86, 0xd4, 0xd9, 0x5c, + 0xae, 0x6c, 0x9c, 0x3c, 0xd0, 0xb5, 0x88, 0x07, 0xeb, 0xb1, 0x86, 0x47, 0x47, 0x4e, 0x70, 0xbc, + 0x79, 0x51, 0xa4, 0x93, 0x45, 0x6d, 0x46, 0x1e, 0x7b, 0x33, 0xfb, 0x15, 0xed, 0x87, 0x05, 0x78, + 0xe1, 0x31, 0x78, 0x93, 0x16, 0xcc, 0xe2, 0x79, 0x1e, 0x35, 0xc1, 0x93, 0xed, 0x01, 0xe7, 0xf9, + 0xde, 0xc8, 0x83, 0xf5, 0xc4, 0x7a, 0x60, 0xc2, 0x84, 0xdc, 0xa6, 0xd3, 0xa9, 0x8b, 0xfc, 0x4e, + 0xb6, 0x0d, 0xac, 0x08, 0x33, 0x99, 0xdb, 0xef, 0x26, 0xdc, 0x04, 0x03, 0x29, 0x0e, 0x61, 0x71, + 0x6c, 0x1c, 0xc2, 0xd7, 0x60, 0xde, 0x90, 0x1c, 0x6c, 0xf9, 0xf0, 0xe3, 0xad, 0x41, 0xca, 0x1b, + 0xd7, 0x4c, 0xa1, 0x91, 0xcf, 0xc1, 0x22, 0xf3, 0x1e, 0xe0, 0xbd, 0xc3, 0x7c, 0xdb, 0xa6, 0x78, + 0x76, 0x15, 0x2c, 0x11, 0x5d, 0x1d, 0x9a, 0x19, 0x54, 0xba, 0xb0, 0xce, 0x53, 0xad, 0xa4, 0xe7, + 0x86, 0xa1, 0x3e, 0x8c, 0x0e, 0xe9, 0xae, 0xc3, 0xce, 0xe9, 0xe4, 0x0d, 0x98, 0x3e, 0x7c, 0xbc, + 0xdb, 0x39, 0x86, 0x4e, 0x08, 0xa0, 0xa6, 0x2f, 0xc2, 0xa5, 0xd0, 0xff, 0xc9, 0x9b, 0x30, 0x85, + 0x46, 0x66, 0xae, 0x50, 0x0b, 0x43, 0x48, 0xfe, 0xa7, 0xd1, 0x04, 0x6d, 0x32, 0x02, 0xba, 0x5a, + 0x93, 0x3c, 0xb9, 0x7c, 0x3f, 0x16, 0xc6, 0xd7, 0x38, 0x55, 0xae, 0x39, 0x7b, 0xb4, 0xef, 0xf0, + 0xe4, 0xb3, 0xeb, 0xb0, 0x2c, 0x64, 0xef, 0x40, 0x64, 0x2a, 0xe1, 0x7e, 0x37, 0x4b, 0x3c, 0xa4, + 0xd3, 0x40, 0x64, 0x2b, 0x79, 0x06, 0x16, 0xc3, 0xf0, 0xd0, 0xe6, 0x81, 0x04, 0x1f, 0x8a, 0x24, + 0x68, 0xe6, 0x7c, 0x18, 0x1e, 0xb2, 0x88, 0x82, 0x77, 0xdc, 0x63, 0x8a, 0x85, 0x6f, 0x19, 0x12, + 0xac, 0x32, 0xc3, 0x8a, 0x7a, 0x61, 0x8c, 0xc5, 0x63, 0x60, 0x42, 0x82, 0xa5, 0xfd, 0xb7, 0x02, + 0xcc, 0xde, 0xa3, 0x87, 0x57, 0x34, 0xc9, 0x4e, 0x36, 0xf1, 0x6e, 0xc0, 0x5c, 0xdd, 0x77, 0xf8, + 0x15, 0x3d, 0x8f, 0xd7, 0xc1, 0x1e, 0x3f, 0xf5, 0x7c, 0x47, 0xdc, 0xf6, 0x87, 0xa6, 0x8c, 0x74, + 0x42, 0x10, 0xc8, 0xdb, 0x30, 0xcd, 0x56, 0x38, 0xbf, 0x6d, 0x10, 0xe6, 0x8b, 0xb8, 0x46, 0x2f, + 0xb1, 0x62, 0xe9, 0x0e, 0x99, 0x49, 0x09, 0xf9, 0x2c, 0xcd, 0x1f, 0x3a, 0x49, 0x06, 0xe8, 0xa9, + 0xd3, 0x19, 0xa0, 0xa5, 0x8c, 0x13, 0xd3, 0xa7, 0xc9, 0x38, 0xb1, 0x76, 0x0b, 0xe6, 0xa4, 0xfa, + 0x3c, 0x96, 0x35, 0xe3, 0x57, 0x0b, 0xb0, 0x80, 0xad, 0x8a, 0xa5, 0xd6, 0x5f, 0x4f, 0x73, 0xfa, + 0x67, 0x53, 0xe6, 0xf4, 0x55, 0x79, 0xbc, 0xb8, 0xd3, 0xcf, 0x78, 0x3b, 0xfa, 0x6d, 0x58, 0x1e, + 0x41, 0x24, 0xaf, 0xc1, 0x14, 0xad, 0xbe, 0x30, 0x3f, 0xaa, 0xd9, 0x19, 0x90, 0x64, 0x27, 0xa3, + 0x0d, 0x0f, 0x4d, 0x86, 0xad, 0xfd, 0x0f, 0x05, 0xe6, 0x79, 0x5a, 0xe6, 0xfe, 0xbe, 0x7f, 0x62, + 0x77, 0xde, 0xc8, 0x76, 0x27, 0x0b, 0x69, 0xcc, 0xbb, 0xf3, 0xaf, 0xba, 0x13, 0x6f, 0xa5, 0x3a, + 0xf1, 0x42, 0x9c, 0xab, 0x44, 0x34, 0x67, 0x42, 0x1f, 0x7e, 0x1b, 0xb3, 0x77, 0xa5, 0x11, 0xc9, + 0x2f, 0xc1, 0x6c, 0xc3, 0x7d, 0x94, 0xb2, 0xe2, 0xdd, 0x18, 0xc3, 0xf4, 0xa5, 0x18, 0x91, 0xad, + 0x29, 0xf6, 0x00, 0xd1, 0x7d, 0x64, 0x8f, 0xf8, 0x66, 0x24, 0x2c, 0xd7, 0xde, 0x82, 0xc5, 0x34, + 0xd9, 0xe3, 0x4c, 0x7d, 0x1e, 0xe1, 0x0c, 0xa3, 0x74, 0xff, 0x7a, 0x11, 0x20, 0x09, 0x0e, 0x45, + 0x17, 0x60, 0xca, 0x1d, 0x4c, 0x5c, 0x80, 0x22, 0x48, 0x9e, 0xe3, 0xc2, 0x4b, 0xec, 0x06, 0xbf, 0xa8, 0x2b, 0x8c, 0xcf, 0x25, 0xd3, 0x17, 0x01, 0xee, 0x98, 0x27, 0x75, 0xcf, 0x61, 0x6f, 0x8f, 0x8a, 0x9b, 0xcf, 0x60, 0xea, 0xb0, 0x18, 0x9a, 0xca, 0xdb, 0x51, 0xae, 0x0e, 0x79, 0xca, 0x42, 0x0c, 0x07, 0x54, 0xa5, 0x08, 0x23, 0x01, 0xd7, 0x4a, 0x8f, 0x17, 0x70, 0xad, 0x05, 0xb3, 0x5e, - 0xff, 0x23, 0xb7, 0x1f, 0xf9, 0xc1, 0x31, 0x5a, 0x27, 0x13, 0xb3, 0x07, 0xed, 0x82, 0x9a, 0x28, - 0x63, 0xe3, 0x80, 0x92, 0x66, 0x8c, 0x2f, 0x0f, 0x43, 0x0c, 0x8c, 0x3d, 0x77, 0xa6, 0xd4, 0x69, - 0x16, 0xa7, 0xe9, 0x76, 0xa9, 0x5c, 0x56, 0x67, 0x6f, 0x97, 0xca, 0xb3, 0x2a, 0x98, 0x92, 0xb3, - 0x41, 0xec, 0x4c, 0x20, 0x59, 0xfe, 0xd3, 0x56, 0x7d, 0xed, 0xc7, 0x05, 0x20, 0xa3, 0xd5, 0x20, - 0x9f, 0x85, 0x39, 0xb6, 0xc1, 0xda, 0x41, 0xf8, 0x21, 0x7f, 0x80, 0xc9, 0x5e, 0x4d, 0x4b, 0x60, - 0x39, 0xd6, 0x39, 0x03, 0x9b, 0xe1, 0x87, 0x3d, 0xf2, 0x25, 0x38, 0x8b, 0xdd, 0x3b, 0x70, 0x03, - 0xcf, 0xef, 0xda, 0x98, 0xc9, 0xca, 0xe9, 0xe1, 0x58, 0x15, 0x37, 0x5f, 0xfc, 0xd1, 0x27, 0x57, - 0x9f, 0xca, 0x29, 0x1e, 0x33, 0x0c, 0x18, 0x5e, 0xa9, 0x85, 0x98, 0x2d, 0x86, 0x48, 0xda, 0xa0, - 0xca, 0xf4, 0xfb, 0xc3, 0x5e, 0x8f, 0x8f, 0xec, 0x3a, 0xbd, 0x1a, 0x64, 0xcb, 0xc6, 0x30, 0x5e, - 0x4c, 0x18, 0x6f, 0x0d, 0x7b, 0x3d, 0xf2, 0x06, 0x80, 0xdf, 0xb7, 0x8f, 0xbc, 0x30, 0x64, 0x36, - 0xef, 0xf8, 0x51, 0x6e, 0x02, 0x95, 0x07, 0xc3, 0xef, 0xef, 0x32, 0x20, 0xf9, 0x5b, 0x80, 0x21, - 0x52, 0x31, 0x76, 0x30, 0x97, 0x66, 0xd8, 0x6d, 0x41, 0x00, 0xd3, 0xd1, 0xf1, 0x0e, 0x5c, 0xcb, - 0xfb, 0xb2, 0x78, 0xbb, 0xfc, 0x05, 0x58, 0xe6, 0x92, 0xd1, 0x3d, 0x2f, 0x3a, 0xe4, 0x1a, 0x97, - 0x27, 0x51, 0xd7, 0x48, 0xea, 0x92, 0x3f, 0x29, 0x01, 0xe8, 0xf7, 0x2c, 0x11, 0x96, 0xff, 0x79, - 0x98, 0x6a, 0x53, 0x36, 0x5c, 0x1f, 0x8d, 0x02, 0x17, 0xf2, 0x95, 0xad, 0x79, 0x88, 0x41, 0x57, - 0xa3, 0x89, 0xcf, 0x0c, 0x85, 0x2e, 0x1a, 0x57, 0x23, 0x7b, 0x79, 0x98, 0xca, 0xa3, 0xc6, 0xb1, - 0x48, 0x1d, 0x20, 0x09, 0x94, 0xcf, 0xb5, 0x1a, 0xcb, 0x49, 0xc4, 0x69, 0x5e, 0xc0, 0xf3, 0xc3, - 0x26, 0x6f, 0xc9, 0xe5, 0xe9, 0x93, 0xa0, 0x91, 0x3b, 0x50, 0x6a, 0x3b, 0x71, 0x1c, 0xb4, 0x31, - 0xe9, 0x03, 0xae, 0xd1, 0xd6, 0xa7, 0x52, 0x08, 0x2c, 0x46, 0xce, 0x81, 0x5c, 0x3b, 0x64, 0x42, - 0x0c, 0x98, 0x6e, 0x39, 0x81, 0x73, 0x14, 0x8e, 0x4b, 0x3b, 0xc3, 0x4a, 0x45, 0x76, 0x3a, 0x04, - 0xca, 0x32, 0x05, 0x2b, 0x26, 0x1b, 0x50, 0xb4, 0xac, 0x5d, 0xfe, 0x3c, 0x62, 0x21, 0xb9, 0x4d, - 0x58, 0xd6, 0x2e, 0x13, 0x7a, 0xc3, 0xf0, 0x48, 0x22, 0xa3, 0xc8, 0xe4, 0x73, 0x30, 0x27, 0x5d, - 0x52, 0x78, 0xb8, 0x69, 0xec, 0x03, 0xe9, 0x21, 0xbb, 0xbc, 0x69, 0x48, 0xd8, 0xa4, 0x0e, 0xea, - 0x9d, 0xe1, 0x03, 0x57, 0x1f, 0x0c, 0x30, 0x9c, 0xd2, 0x47, 0x6e, 0xc0, 0x04, 0xb9, 0x72, 0x92, - 0xd8, 0x0d, 0x5f, 0x8d, 0x76, 0x45, 0xa9, 0xac, 0x0e, 0xc9, 0x52, 0x92, 0x16, 0x2c, 0x5b, 0x6e, - 0x34, 0x1c, 0x30, 0x6f, 0xc6, 0x2d, 0x76, 0x9d, 0x66, 0xc1, 0xa9, 0x31, 0x07, 0x56, 0x48, 0x0b, - 0x85, 0x23, 0xe9, 0xfe, 0xc8, 0x95, 0x7a, 0x94, 0x58, 0x73, 0xe5, 0x21, 0x97, 0xef, 0x81, 0xca, - 0xa4, 0x7b, 0xe0, 0xcb, 0x39, 0x09, 0x14, 0xf0, 0x36, 0x2b, 0x25, 0x50, 0x48, 0xa5, 0x4d, 0xf8, - 0x5f, 0x53, 0x52, 0x0e, 0x1f, 0x3e, 0x16, 0x6f, 0x03, 0xdc, 0xf6, 0xbd, 0xfe, 0xae, 0x1b, 0x1d, - 0xfa, 0x5d, 0x29, 0x4c, 0xc1, 0xdc, 0x07, 0xbe, 0xd7, 0xb7, 0x8f, 0x10, 0xfc, 0xe3, 0x4f, 0xae, - 0x4a, 0x48, 0xa6, 0xf4, 0x3f, 0xf9, 0x0c, 0xcc, 0xd2, 0x5f, 0xed, 0xc4, 0x27, 0x93, 0x99, 0xae, - 0x90, 0x9a, 0xa5, 0xdb, 0x4d, 0x10, 0xc8, 0x2d, 0x4c, 0x30, 0xed, 0x0d, 0x22, 0x49, 0x78, 0x15, - 0xd9, 0xa4, 0xbd, 0x41, 0x94, 0x8d, 0x51, 0x20, 0x21, 0x93, 0x9d, 0xb8, 0xea, 0x22, 0xa3, 0x3c, - 0xcf, 0x63, 0xcd, 0x03, 0x1d, 0x60, 0x91, 0x2d, 0xf2, 0x41, 0xc9, 0x81, 0x0e, 0x32, 0x64, 0x58, - 0x09, 0x6b, 0xa7, 0xca, 0x75, 0x17, 0x53, 0x52, 0x25, 0xc2, 0xc3, 0x2e, 0xd7, 0x44, 0xa4, 0x2a, - 0x11, 0x23, 0x93, 0x4d, 0x58, 0x62, 0x52, 0x3f, 0xe6, 0x9b, 0xc7, 0x64, 0xc6, 0xd3, 0xc9, 0xde, - 0xc6, 0x32, 0xd3, 0xd3, 0x7b, 0x87, 0xfc, 0xf9, 0x0c, 0x01, 0xd9, 0x82, 0x29, 0xd4, 0x43, 0xf1, - 0xf7, 0x87, 0x97, 0x64, 0x4d, 0x68, 0x76, 0x1d, 0xe1, 0xbe, 0x82, 0x3a, 0x50, 0x79, 0x5f, 0x41, - 0x54, 0xf2, 0x8b, 0x00, 0x46, 0x3f, 0xf0, 0x7b, 0x3d, 0x4c, 0x71, 0x56, 0x4e, 0xc5, 0x43, 0xe1, - 0x7c, 0x90, 0x4b, 0x82, 0xc4, 0xb3, 0x6b, 0xe0, 0x6f, 0x3b, 0x93, 0x08, 0x4d, 0xe2, 0x45, 0x3e, - 0x03, 0xd3, 0xd6, 0x70, 0x7f, 0xdf, 0xfb, 0x98, 0x4f, 0x6a, 0x96, 0xdd, 0x0b, 0x21, 0xf2, 0x62, - 0x66, 0x38, 0xe4, 0x2d, 0x98, 0xdb, 0x1b, 0x74, 0x9d, 0xc8, 0x45, 0xdb, 0x15, 0x4f, 0x19, 0x89, - 0xc7, 0xf9, 0x10, 0xc1, 0xcc, 0xfd, 0x5d, 0x5e, 0x99, 0x12, 0x3a, 0xf1, 0x60, 0x79, 0xa7, 0xdd, - 0x6e, 0x61, 0xf7, 0x88, 0x47, 0xd4, 0x3c, 0xdc, 0x88, 0x90, 0x82, 0x47, 0xca, 0x37, 0xaf, 0xd3, - 0x53, 0xef, 0x30, 0x8a, 0x06, 0x36, 0xeb, 0x72, 0x11, 0xbf, 0x49, 0x5e, 0x64, 0x23, 0x54, 0xda, - 0x1f, 0x2a, 0x39, 0xdf, 0x22, 0xaf, 0xc3, 0x6c, 0x0c, 0x94, 0xb3, 0xa1, 0x26, 0xec, 0xe5, 0x83, - 0x2a, 0x46, 0xa5, 0xb3, 0x88, 0xfe, 0xb0, 0x18, 0xa1, 0x94, 0xbd, 0x84, 0x12, 0x86, 0x23, 0x94, - 0x12, 0x32, 0xbd, 0x84, 0x34, 0x7c, 0x46, 0x27, 0x69, 0x2f, 0xfb, 0xfe, 0x08, 0x91, 0x40, 0xd3, - 0x6a, 0x30, 0xcd, 0xb6, 0x47, 0x4c, 0xe0, 0xc8, 0xd3, 0x5c, 0x4b, 0xe9, 0xff, 0x58, 0x02, 0x47, - 0x0e, 0x1f, 0x4d, 0xe0, 0x28, 0x11, 0x68, 0x77, 0x60, 0x25, 0x6f, 0xaa, 0xa5, 0x74, 0x99, 0xca, - 0x69, 0x75, 0x99, 0x7f, 0x5a, 0x84, 0x79, 0xe4, 0x26, 0xce, 0x45, 0x1d, 0x16, 0xac, 0xe1, 0x83, - 0x38, 0x59, 0x81, 0x38, 0x1f, 0xb1, 0x7e, 0xa1, 0x5c, 0x20, 0x3b, 0x9f, 0xa4, 0x28, 0x88, 0x01, - 0x8b, 0xe2, 0x6c, 0xde, 0x16, 0xaf, 0x27, 0xe3, 0xdc, 0x89, 0xe2, 0x51, 0x29, 0x7f, 0x53, 0x21, - 0x2b, 0x2a, 0xd3, 0x44, 0xc9, 0x09, 0x5d, 0x7c, 0x9c, 0x13, 0xba, 0x74, 0xaa, 0x13, 0xfa, 0x7d, - 0x98, 0x17, 0x5f, 0xc3, 0xb3, 0x75, 0xea, 0xc9, 0xce, 0xd6, 0x14, 0x33, 0x52, 0x8f, 0xcf, 0xd8, - 0xe9, 0x89, 0x67, 0x2c, 0x7a, 0xf4, 0x88, 0x7d, 0x6f, 0x80, 0xb0, 0x9c, 0xa3, 0xf6, 0x49, 0x8e, - 0x4d, 0xed, 0xcf, 0x8b, 0x00, 0xdb, 0x95, 0xd6, 0x4f, 0x21, 0xf4, 0xbc, 0x06, 0xb3, 0x75, 0x5f, - 0x78, 0x82, 0x48, 0x26, 0xf8, 0x9e, 0x00, 0xca, 0x8b, 0x2a, 0xc6, 0x8c, 0x85, 0x95, 0xe2, 0xa7, - 0x21, 0xac, 0xdc, 0x42, 0x65, 0xef, 0x07, 0x6e, 0x27, 0xaa, 0x55, 0xc5, 0xc8, 0x62, 0xcb, 0x45, - 0xc4, 0xe1, 0xb4, 0x27, 0x80, 0x84, 0x4c, 0x0f, 0x1b, 0xee, 0x64, 0x2a, 0x82, 0x30, 0x71, 0xf5, - 0x2a, 0x1e, 0x36, 0x22, 0x92, 0x95, 0x88, 0xeb, 0x24, 0xef, 0xf6, 0x19, 0xb2, 0x4f, 0x79, 0x34, - 0xdf, 0x8b, 0x5f, 0x0b, 0xcc, 0x4c, 0xea, 0x21, 0x6d, 0xa4, 0x87, 0xc6, 0xbe, 0x11, 0xd0, 0xbe, - 0xab, 0xc8, 0x59, 0x6f, 0x7f, 0x8a, 0xa1, 0x7e, 0x13, 0x20, 0x76, 0xc5, 0x13, 0x63, 0x1d, 0xc7, - 0xdf, 0x61, 0x50, 0xb9, 0x97, 0x13, 0x5c, 0xa9, 0x35, 0xc5, 0x4f, 0xab, 0x35, 0x6d, 0x98, 0x6b, - 0x3e, 0x8c, 0x9c, 0xc4, 0x77, 0x13, 0xac, 0xf8, 0x62, 0x82, 0xdb, 0x5a, 0x11, 0x75, 0xf5, 0xe7, - 0xa4, 0x6b, 0xcd, 0x98, 0x1b, 0x8d, 0x44, 0xa8, 0xfd, 0x44, 0x81, 0x25, 0x39, 0x84, 0xe0, 0x71, - 0xbf, 0x43, 0xde, 0x61, 0x39, 0xb5, 0x94, 0xd4, 0x0d, 0x54, 0x42, 0xa2, 0xfb, 0xf5, 0x71, 0xbf, - 0xc3, 0xe4, 0x59, 0xe7, 0x91, 0x5c, 0x59, 0x4a, 0x48, 0x1e, 0xc0, 0x7c, 0xcb, 0xef, 0xf5, 0xe8, - 0x72, 0x0b, 0x3e, 0xe2, 0xf7, 0x39, 0xca, 0x28, 0xab, 0x67, 0x16, 0x15, 0xda, 0x7c, 0x9a, 0xab, - 0x2d, 0x2e, 0x0c, 0xe8, 0xf1, 0xed, 0x71, 0xba, 0x84, 0xed, 0x37, 0x30, 0xb6, 0x82, 0xcc, 0x33, - 0x11, 0x35, 0xd2, 0xd9, 0x5b, 0xe5, 0x5a, 0xd2, 0x62, 0xac, 0xe7, 0x04, 0x51, 0x43, 0xfb, 0x3b, - 0x0a, 0x5c, 0x1b, 0x6d, 0x5a, 0xa5, 0xe7, 0x0f, 0xbb, 0xed, 0xc0, 0xf1, 0x7a, 0x75, 0xff, 0x20, - 0x64, 0xb9, 0x88, 0x0e, 0x12, 0xb3, 0x15, 0xcf, 0x45, 0x74, 0xe0, 0x65, 0x73, 0x11, 0x61, 0xc8, - 0x95, 0x57, 0xa1, 0x6c, 0xbd, 0x67, 0xbd, 0x37, 0x74, 0x85, 0x6a, 0x83, 0xed, 0x0f, 0xe1, 0x87, - 0xa1, 0xfd, 0x21, 0x05, 0xca, 0xc7, 0x8d, 0x40, 0xd4, 0xfe, 0x7d, 0x01, 0xc8, 0x68, 0x3d, 0xe4, - 0xfd, 0x5b, 0xf9, 0xbf, 0x70, 0xc3, 0xca, 0x6c, 0xb1, 0xa5, 0xc7, 0xba, 0x99, 0x7c, 0x08, 0x6a, - 0x87, 0xf6, 0xa3, 0x1d, 0xd1, 0x8e, 0xb4, 0x7b, 0x7e, 0x7c, 0x9c, 0xfc, 0xc2, 0xd8, 0x39, 0x95, - 0xee, 0x78, 0xb6, 0x27, 0x65, 0x99, 0xc8, 0x27, 0x63, 0x27, 0x85, 0xaf, 0x7d, 0x53, 0x81, 0x95, - 0xbc, 0x29, 0x40, 0x4f, 0x5e, 0xf9, 0x28, 0x8e, 0x05, 0x01, 0x3c, 0x79, 0xe5, 0xd3, 0x3b, 0x2d, - 0x0e, 0x64, 0x88, 0xb2, 0xfd, 0x51, 0x78, 0xac, 0x23, 0xe7, 0x87, 0x45, 0x98, 0x67, 0x7e, 0x1a, - 0x3b, 0xae, 0xd3, 0x8b, 0x0e, 0xe9, 0xe0, 0x8a, 0x6c, 0xe4, 0x92, 0x37, 0xff, 0x84, 0x34, 0xe4, - 0x1b, 0x50, 0x6e, 0xd1, 0xc5, 0xd3, 0xf1, 0x7b, 0xb2, 0x8e, 0x77, 0xc0, 0x61, 0xf2, 0xc4, 0x12, - 0x78, 0x28, 0xf1, 0xca, 0x36, 0x1a, 0x26, 0xf1, 0x22, 0x24, 0x25, 0xf1, 0x32, 0x6b, 0xcd, 0xc7, - 0x70, 0x36, 0x71, 0xbd, 0x89, 0xed, 0x40, 0xa7, 0x78, 0xb8, 0xb8, 0xce, 0x8d, 0x60, 0x57, 0x12, - 0x6f, 0x1e, 0x34, 0x18, 0x61, 0x69, 0x26, 0xc1, 0x56, 0xde, 0x27, 0xc8, 0x1d, 0x50, 0x13, 0x30, - 0xcf, 0xfc, 0xc5, 0x2e, 0x30, 0x18, 0x9c, 0x50, 0x62, 0x3b, 0x92, 0x04, 0x6c, 0x84, 0x90, 0x1e, - 0x72, 0x09, 0xcc, 0x48, 0xde, 0x28, 0x0b, 0x9b, 0x70, 0xcc, 0x0b, 0x4d, 0x50, 0xf2, 0x21, 0x97, - 0x21, 0xa3, 0x63, 0x24, 0x2c, 0x57, 0x33, 0xc9, 0x18, 0x71, 0x9b, 0x95, 0x3c, 0x46, 0x1c, 0x6b, - 0xfd, 0xb7, 0x14, 0x58, 0xaa, 0xe9, 0xbb, 0x3c, 0x9b, 0x35, 0xeb, 0xd5, 0xeb, 0xf0, 0x54, 0x4d, - 0xdf, 0xb5, 0x5b, 0xcd, 0x7a, 0xad, 0x72, 0xdf, 0xce, 0xcd, 0x39, 0xf9, 0x14, 0x5c, 0x1c, 0x45, - 0x49, 0xbc, 0x94, 0x2e, 0xc3, 0xea, 0x68, 0xb1, 0xc8, 0x4b, 0x99, 0x4f, 0x2c, 0x52, 0x58, 0x16, - 0xd7, 0xdf, 0x85, 0x25, 0x91, 0x83, 0xb1, 0x5d, 0xb7, 0xf0, 0x1e, 0xb4, 0x04, 0x73, 0x77, 0x0d, - 0xb3, 0xb6, 0x75, 0xdf, 0xde, 0xda, 0xab, 0xd7, 0xd5, 0x33, 0x64, 0x01, 0x66, 0x39, 0xa0, 0xa2, - 0xab, 0x0a, 0x99, 0x87, 0x72, 0xad, 0x61, 0x19, 0x95, 0x3d, 0xd3, 0x50, 0x0b, 0xeb, 0xff, 0x58, - 0x81, 0x05, 0x76, 0xb3, 0x09, 0x78, 0x8b, 0xae, 0xc0, 0xda, 0x5e, 0xab, 0xaa, 0xb7, 0x0d, 0x33, - 0xbf, 0x39, 0xe7, 0x60, 0x39, 0x53, 0xde, 0xbc, 0xa3, 0x2a, 0xe4, 0x12, 0x5c, 0xc8, 0x80, 0xab, - 0x35, 0x4b, 0xdf, 0x64, 0xad, 0xb8, 0x08, 0xe7, 0x32, 0x85, 0xad, 0x5a, 0xa3, 0x61, 0x54, 0xd5, - 0x22, 0x6d, 0xe0, 0xc8, 0xe7, 0x4c, 0x43, 0xaf, 0x52, 0x52, 0xb5, 0xb4, 0xfe, 0x2e, 0x2c, 0xb6, - 0xe2, 0x27, 0x59, 0xe8, 0x04, 0x35, 0x03, 0x45, 0x53, 0xbf, 0xa7, 0x9e, 0x21, 0x00, 0xd3, 0xad, - 0x3b, 0x15, 0xeb, 0xe6, 0x4d, 0x55, 0x21, 0x73, 0x30, 0xb3, 0x5d, 0x69, 0xd9, 0x77, 0x76, 0x2d, - 0xb5, 0x40, 0x7f, 0xe8, 0xf7, 0x2c, 0xfc, 0x51, 0x5c, 0x7f, 0x05, 0x4d, 0xff, 0x1f, 0x1f, 0xd7, - 0xbd, 0x30, 0x72, 0xfb, 0x6e, 0x80, 0x7d, 0x34, 0x0f, 0x65, 0xcb, 0xa5, 0xf2, 0x4a, 0xe4, 0xb2, - 0x0e, 0xda, 0x1d, 0xf6, 0x22, 0x6f, 0xd0, 0x73, 0x3f, 0x56, 0x95, 0xf5, 0x5b, 0xb0, 0x64, 0xfa, - 0x43, 0x7a, 0xcf, 0xb2, 0x22, 0x8a, 0x71, 0x70, 0x8c, 0x6d, 0x6e, 0xe8, 0xbb, 0x9b, 0xb5, 0xed, - 0xbd, 0xe6, 0x9e, 0x65, 0xef, 0xea, 0xed, 0xca, 0x0e, 0x73, 0xc1, 0xda, 0x6d, 0x5a, 0x6d, 0xdb, - 0x34, 0x2a, 0x46, 0xa3, 0xad, 0x2a, 0xeb, 0x5f, 0x47, 0x85, 0x7c, 0xc7, 0xef, 0x77, 0xb7, 0x9c, - 0x4e, 0xe4, 0x07, 0x58, 0x61, 0x0d, 0xae, 0x58, 0x46, 0xa5, 0xd9, 0xa8, 0xda, 0x5b, 0x7a, 0xa5, - 0xdd, 0x34, 0xf3, 0x92, 0xb2, 0xae, 0xc1, 0xf9, 0x1c, 0x9c, 0x66, 0xbb, 0xa5, 0x2a, 0xe4, 0x2a, - 0x5c, 0xca, 0x29, 0xbb, 0x67, 0x6c, 0xea, 0x7b, 0xed, 0x9d, 0x86, 0x5a, 0x18, 0x43, 0x6c, 0x59, - 0x4d, 0xb5, 0xb8, 0xfe, 0x77, 0x15, 0x58, 0xdc, 0x0b, 0xf9, 0x7b, 0xd0, 0x3d, 0xb4, 0xbf, 0x5e, - 0x83, 0xcb, 0x7b, 0x96, 0x61, 0xda, 0xed, 0xe6, 0x1d, 0xa3, 0x61, 0xef, 0x59, 0xfa, 0x76, 0xb6, - 0x36, 0x57, 0xe1, 0x92, 0x84, 0x61, 0x1a, 0x95, 0xe6, 0x5d, 0xc3, 0xb4, 0x5b, 0xba, 0x65, 0xdd, - 0x6b, 0x9a, 0x55, 0x55, 0xa1, 0x5f, 0xcc, 0x41, 0xd8, 0xdd, 0xd2, 0x59, 0x6d, 0x52, 0x65, 0x0d, - 0xe3, 0x9e, 0x5e, 0xb7, 0x37, 0x9b, 0x6d, 0xb5, 0xb8, 0xbe, 0x4b, 0xaf, 0x20, 0x98, 0x1a, 0x91, - 0xbd, 0xda, 0x29, 0x43, 0xa9, 0xd1, 0x6c, 0x18, 0x59, 0xc7, 0xbd, 0x79, 0x28, 0xeb, 0xad, 0x96, - 0xd9, 0xbc, 0x8b, 0x93, 0x07, 0x60, 0xba, 0x6a, 0x34, 0x6a, 0x38, 0x5b, 0xe6, 0xa1, 0xdc, 0x32, - 0x9b, 0xbb, 0xcd, 0xb6, 0x51, 0x55, 0x4b, 0xeb, 0x3a, 0x2c, 0xb3, 0x23, 0x81, 0x33, 0x45, 0xab, - 0xcd, 0x02, 0xcc, 0xee, 0x35, 0xaa, 0xc6, 0x56, 0xad, 0x81, 0x6d, 0x59, 0x04, 0xb0, 0x76, 0x9a, - 0x66, 0xdb, 0x6e, 0x1b, 0xe6, 0x2e, 0xcb, 0x75, 0x5b, 0x6f, 0x36, 0xb6, 0xd9, 0xcf, 0xc2, 0xba, - 0x29, 0xce, 0x66, 0x51, 0xaf, 0x8e, 0xcf, 0x1c, 0xed, 0xaa, 0xc6, 0x96, 0xbe, 0x57, 0x6f, 0xf3, - 0x51, 0xbe, 0x6f, 0x9b, 0xc6, 0x7b, 0x7b, 0x86, 0xd5, 0xb6, 0x54, 0x85, 0xa8, 0x30, 0xdf, 0x30, - 0x8c, 0xaa, 0x65, 0x9b, 0xc6, 0xdd, 0x9a, 0x71, 0x4f, 0x2d, 0xd0, 0x6a, 0xb1, 0xff, 0x69, 0x25, - 0xd7, 0xbf, 0xa5, 0x00, 0x61, 0x99, 0x29, 0x77, 0xfc, 0x30, 0xa2, 0xbd, 0x8f, 0x93, 0xee, 0x0a, - 0xac, 0xed, 0xd0, 0xd9, 0x82, 0xbd, 0xb3, 0xdb, 0xac, 0x66, 0x7b, 0xfd, 0x3c, 0x90, 0x4c, 0x79, - 0x73, 0x6b, 0x0b, 0x57, 0xd6, 0xd9, 0x0c, 0xbc, 0x6a, 0x36, 0x5b, 0x6a, 0x61, 0xad, 0x50, 0x56, - 0xc8, 0x85, 0x91, 0xc2, 0x3b, 0x86, 0xd1, 0x52, 0x8b, 0x74, 0x94, 0x33, 0x05, 0x62, 0xd5, 0x33, - 0xf2, 0xd2, 0xfa, 0xd7, 0x14, 0x38, 0xcf, 0xaa, 0x29, 0xb6, 0x90, 0xb8, 0xaa, 0x97, 0x61, 0x95, - 0xe7, 0xdb, 0xcd, 0xab, 0xe8, 0x0a, 0xa8, 0xa9, 0x52, 0x56, 0xcd, 0x73, 0xb0, 0x9c, 0x82, 0x62, - 0x3d, 0x0a, 0x74, 0x83, 0x4c, 0x81, 0x37, 0x0d, 0xab, 0x6d, 0x1b, 0x5b, 0x5b, 0x74, 0x48, 0xb0, - 0x22, 0xc5, 0x75, 0x0d, 0x96, 0x2b, 0x6e, 0x10, 0x19, 0x1f, 0x47, 0x6e, 0x3f, 0xf4, 0xfc, 0x3e, - 0x56, 0x61, 0x01, 0x66, 0x8d, 0x5f, 0x6c, 0x1b, 0x0d, 0xab, 0xd6, 0x6c, 0xa8, 0x67, 0xd6, 0x2f, - 0x67, 0x70, 0xc4, 0x56, 0x60, 0x59, 0x3b, 0xea, 0x99, 0x75, 0x07, 0x16, 0xc4, 0x4b, 0x49, 0x36, - 0xb1, 0xae, 0xc0, 0x9a, 0x98, 0xae, 0xb8, 0xad, 0x64, 0x9b, 0xb0, 0x0a, 0x2b, 0xa3, 0xe5, 0x46, - 0x5b, 0x55, 0xe8, 0x28, 0x64, 0x4a, 0x28, 0xbc, 0xb0, 0xfe, 0x55, 0x05, 0x16, 0x62, 0xf3, 0x3d, - 0x4e, 0xb4, 0xab, 0x70, 0x69, 0x77, 0x4b, 0xb7, 0xab, 0xc6, 0xdd, 0x5a, 0xc5, 0xb0, 0xef, 0xd4, - 0x1a, 0xd5, 0xcc, 0x47, 0x2e, 0xc2, 0xb9, 0x1c, 0x04, 0xfc, 0xca, 0x2a, 0xac, 0x64, 0x8b, 0xda, - 0x74, 0xb5, 0x17, 0x68, 0xd7, 0x67, 0x4b, 0xe2, 0xa5, 0x5e, 0x5c, 0xbf, 0x0b, 0x8b, 0x96, 0xbe, - 0x5b, 0xdf, 0xf2, 0x83, 0x8e, 0xab, 0x0f, 0xa3, 0xc3, 0x3e, 0xdd, 0x77, 0xb7, 0x9a, 0x66, 0xc5, - 0xb0, 0x11, 0x25, 0x53, 0x83, 0xb3, 0xb0, 0x24, 0x17, 0xde, 0x37, 0xe8, 0xf4, 0x25, 0xb0, 0x28, - 0x03, 0x1b, 0x4d, 0xb5, 0xb0, 0xfe, 0x45, 0x98, 0xe7, 0x3e, 0x3d, 0xac, 0xff, 0x2e, 0xc0, 0x59, - 0xf9, 0x77, 0xcb, 0xed, 0x77, 0xbd, 0xfe, 0x81, 0x7a, 0x26, 0x5b, 0x60, 0x0e, 0xfb, 0x7d, 0x5a, - 0x80, 0x5b, 0x82, 0x5c, 0xd0, 0x76, 0x83, 0x23, 0xaf, 0xef, 0x44, 0x6e, 0x57, 0x2d, 0xac, 0xbf, - 0x04, 0x0b, 0xa9, 0x5c, 0xab, 0x74, 0xe0, 0xea, 0x4d, 0xbe, 0x87, 0xef, 0x1a, 0xd5, 0xda, 0xde, - 0xae, 0x3a, 0x45, 0x37, 0x83, 0x9d, 0xda, 0xf6, 0x8e, 0x0a, 0xeb, 0xbf, 0xad, 0xc0, 0x22, 0x5d, - 0x8f, 0x5e, 0xe0, 0xee, 0x6e, 0xe9, 0x62, 0xa8, 0xe9, 0x34, 0x63, 0x19, 0x9c, 0x0d, 0xcb, 0x62, - 0x2e, 0xaf, 0x97, 0x61, 0x95, 0xff, 0xb0, 0xf5, 0x46, 0xd5, 0xde, 0xd1, 0xcd, 0xea, 0x3d, 0xdd, - 0xa4, 0x73, 0xef, 0xbe, 0x5a, 0xc0, 0x05, 0x25, 0x41, 0xec, 0x76, 0x73, 0xaf, 0xb2, 0xa3, 0x16, - 0xe9, 0xfc, 0x4d, 0xc1, 0x5b, 0xb5, 0x86, 0x5a, 0xc2, 0xe5, 0x39, 0x82, 0x8d, 0x6c, 0x69, 0xf9, - 0xd4, 0xfa, 0x0f, 0x14, 0xb8, 0x60, 0x79, 0x07, 0x7d, 0x27, 0x1a, 0x06, 0xae, 0xde, 0x3b, 0xf0, - 0x03, 0x2f, 0x3a, 0x3c, 0xb2, 0x86, 0x5e, 0xe4, 0x92, 0xe7, 0xe1, 0x59, 0xab, 0xb6, 0xdd, 0xd0, - 0xdb, 0x74, 0x79, 0xe9, 0xf5, 0xed, 0xa6, 0x59, 0x6b, 0xef, 0xec, 0xda, 0xd6, 0x5e, 0x6d, 0x64, - 0xe6, 0x3d, 0x03, 0xd7, 0xc6, 0xa3, 0xd6, 0x8d, 0x6d, 0xbd, 0x72, 0x5f, 0x55, 0x26, 0x33, 0xdc, - 0xd4, 0xeb, 0x7a, 0xa3, 0x62, 0x54, 0xed, 0xbb, 0x37, 0xd5, 0x02, 0x79, 0x16, 0xae, 0x8f, 0x47, - 0xdd, 0xaa, 0xb5, 0x2c, 0x8a, 0x56, 0x9c, 0xfc, 0xdd, 0x1d, 0x6b, 0x97, 0x62, 0x95, 0xd6, 0xbf, - 0xa9, 0xc0, 0xea, 0xb8, 0x1c, 0x02, 0xe4, 0x06, 0x68, 0x46, 0xa3, 0x6d, 0xea, 0xb5, 0xaa, 0x5d, - 0x31, 0x8d, 0xaa, 0xd1, 0x68, 0xd7, 0xf4, 0xba, 0x65, 0x5b, 0xcd, 0x3d, 0x3a, 0x9b, 0x12, 0xcf, - 0xe4, 0xa7, 0xe1, 0xea, 0x04, 0xbc, 0x66, 0xad, 0x5a, 0x51, 0x15, 0x72, 0x13, 0x5e, 0x9c, 0x80, - 0x64, 0xdd, 0xb7, 0xda, 0xc6, 0xae, 0x5c, 0xa2, 0x16, 0x70, 0xc3, 0xca, 0x8f, 0x99, 0x4d, 0x5b, - 0x87, 0x25, 0x93, 0x2b, 0x76, 0x1d, 0x9e, 0x1a, 0x8b, 0xc5, 0xab, 0xf5, 0x34, 0x5c, 0x1d, 0x8b, - 0xc2, 0x2a, 0xa5, 0x16, 0xd6, 0xdf, 0x87, 0xb5, 0xf1, 0x71, 0x5b, 0xe9, 0x79, 0x91, 0x1e, 0xf2, - 0x32, 0x94, 0xaa, 0xf4, 0x94, 0x4b, 0x65, 0x1c, 0xa7, 0xb3, 0xd3, 0x34, 0x6a, 0xbb, 0x2d, 0xba, - 0x11, 0xf2, 0xc3, 0x05, 0x4f, 0x8f, 0xaf, 0x28, 0x71, 0x4e, 0x84, 0x84, 0x67, 0xd6, 0xc9, 0xdd, - 0xdc, 0x6b, 0x34, 0xd8, 0x59, 0xb9, 0x04, 0x73, 0xcd, 0xf6, 0x8e, 0x61, 0xf2, 0x64, 0xee, 0x98, - 0xbd, 0x7d, 0xaf, 0x41, 0x97, 0x76, 0xd3, 0xac, 0x7d, 0x01, 0x0f, 0xcd, 0x55, 0x58, 0xb1, 0xea, - 0x7a, 0xe5, 0x8e, 0xdd, 0x68, 0xb6, 0xed, 0x5a, 0xc3, 0xae, 0xec, 0xe8, 0x8d, 0x86, 0x51, 0x57, - 0x81, 0xee, 0xd9, 0xcd, 0x3b, 0x6d, 0xdd, 0xae, 0x34, 0x1b, 0x5b, 0xb5, 0x6d, 0xce, 0x62, 0x05, - 0x67, 0xc1, 0xb8, 0x30, 0x2b, 0xe4, 0x33, 0xf0, 0x1c, 0xd2, 0xb4, 0xea, 0x7b, 0xdb, 0xb5, 0x86, - 0x6d, 0xdd, 0x6f, 0x54, 0x84, 0xe4, 0x56, 0x19, 0x3d, 0x2b, 0x9e, 0x83, 0x67, 0x26, 0x62, 0x27, - 0xd9, 0xd8, 0x6f, 0x80, 0x36, 0x11, 0x93, 0xb7, 0x6f, 0xfd, 0x7b, 0x0a, 0x5c, 0x9a, 0xe0, 0x86, - 0x45, 0x5e, 0x84, 0xe7, 0x77, 0x0c, 0xbd, 0x5a, 0x37, 0x2c, 0x0b, 0x77, 0x38, 0x3a, 0x88, 0xcc, - 0x47, 0x3e, 0xf7, 0x24, 0x78, 0x1e, 0x9e, 0x9d, 0x8c, 0x9e, 0x88, 0x25, 0xcf, 0xc1, 0x33, 0x93, - 0x51, 0xb9, 0x98, 0x52, 0x20, 0xeb, 0x70, 0x63, 0x32, 0x66, 0x2c, 0xde, 0x14, 0xd7, 0x7f, 0x53, - 0x81, 0xf3, 0xf9, 0x96, 0x0f, 0x5a, 0xb7, 0x5a, 0xc3, 0x6a, 0xeb, 0xf5, 0xba, 0xdd, 0xd2, 0x4d, - 0x7d, 0xd7, 0x36, 0x1a, 0x66, 0xb3, 0x5e, 0xcf, 0x3b, 0x93, 0x9f, 0x81, 0x6b, 0xe3, 0x51, 0xad, - 0x8a, 0x59, 0x6b, 0xd1, 0x63, 0x47, 0x83, 0x2b, 0xe3, 0xb1, 0x8c, 0x5a, 0xc5, 0x50, 0x0b, 0x9b, - 0x6f, 0x7f, 0xe7, 0xcf, 0xaf, 0x9c, 0xf9, 0xce, 0x0f, 0xae, 0x28, 0xff, 0xe9, 0x07, 0x57, 0x94, - 0x3f, 0xfb, 0xc1, 0x15, 0xe5, 0x0b, 0x2f, 0x30, 0xc7, 0xf3, 0x97, 0x3a, 0xfe, 0xd1, 0xcb, 0x07, - 0x81, 0xf3, 0x91, 0x17, 0x39, 0x2c, 0x7d, 0xcf, 0xcb, 0xc2, 0x70, 0xf5, 0xb2, 0x33, 0xf0, 0x5e, - 0xc6, 0x8b, 0xff, 0x83, 0x69, 0xbc, 0x41, 0xbe, 0xfa, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xb8, - 0xd7, 0x3c, 0xe2, 0x3f, 0x02, 0x02, 0x00, + 0xff, 0x23, 0xb7, 0x1f, 0xf9, 0xc1, 0x31, 0xde, 0x4e, 0x26, 0xd7, 0x1e, 0xb4, 0x0b, 0x6a, 0xa2, + 0x8c, 0x8d, 0x03, 0x6a, 0x9a, 0x31, 0xbe, 0x3c, 0x0c, 0x31, 0x30, 0xf6, 0xdc, 0x99, 0x52, 0xa7, + 0x59, 0x9c, 0xa6, 0xdb, 0xa5, 0x72, 0x59, 0x9d, 0xbd, 0x5d, 0x2a, 0xcf, 0xaa, 0x60, 0x4a, 0xce, + 0x06, 0xb1, 0x33, 0x81, 0x74, 0xf3, 0x9f, 0xbe, 0xd5, 0xd7, 0x7e, 0x5c, 0x00, 0x32, 0x5a, 0x0d, + 0xf2, 0x59, 0x98, 0x63, 0x02, 0xd6, 0x0e, 0xc2, 0x0f, 0xf9, 0x03, 0x4c, 0xf6, 0x6a, 0x5a, 0x02, + 0xcb, 0xb1, 0xce, 0x19, 0xd8, 0x0c, 0x3f, 0xec, 0x91, 0x2f, 0xc1, 0x59, 0xec, 0xde, 0x81, 0x1b, + 0x78, 0x7e, 0xd7, 0xc6, 0x4c, 0x56, 0x4e, 0x0f, 0xc7, 0xaa, 0xb8, 0xf9, 0xe2, 0x8f, 0x3e, 0xb9, + 0xfa, 0x54, 0x4e, 0xf1, 0x98, 0x61, 0xc0, 0xf0, 0x4a, 0x2d, 0xc4, 0x6c, 0x31, 0x44, 0xd2, 0x06, + 0x55, 0xa6, 0xdf, 0x1f, 0xf6, 0x7a, 0x7c, 0x64, 0xd7, 0xe9, 0xd1, 0x20, 0x5b, 0x36, 0x86, 0xf1, + 0x62, 0xc2, 0x78, 0x6b, 0xd8, 0xeb, 0x91, 0x37, 0x00, 0xfc, 0xbe, 0x7d, 0xe4, 0x85, 0x21, 0xbb, + 0xf3, 0x8e, 0x1f, 0xe5, 0x26, 0x50, 0x79, 0x30, 0xfc, 0xfe, 0x2e, 0x03, 0x92, 0xbf, 0x05, 0x18, + 0x22, 0x15, 0x63, 0x07, 0x73, 0x6d, 0x86, 0x9d, 0x16, 0x04, 0x30, 0x1d, 0x1d, 0xef, 0xc0, 0xb5, + 0xbc, 0x2f, 0x8b, 0xb7, 0xcb, 0x5f, 0x80, 0x65, 0xae, 0x19, 0xdd, 0xf3, 0xa2, 0x43, 0x6e, 0x71, + 0x79, 0x12, 0x73, 0x8d, 0x64, 0x2e, 0xf9, 0x93, 0x12, 0x80, 0x7e, 0xcf, 0x12, 0x61, 0xf9, 0x9f, + 0x87, 0xa9, 0x36, 0x65, 0xc3, 0xed, 0xd1, 0xa8, 0x70, 0x21, 0x5f, 0xf9, 0x36, 0x0f, 0x31, 0xe8, + 0x6a, 0x34, 0xf1, 0x99, 0xa1, 0xb0, 0x45, 0xe3, 0x6a, 0x64, 0x2f, 0x0f, 0x53, 0x79, 0xd4, 0x38, + 0x16, 0xa9, 0x03, 0x24, 0x81, 0xf2, 0xb9, 0x55, 0x63, 0x39, 0x89, 0x38, 0xcd, 0x0b, 0x78, 0x7e, + 0xd8, 0xe4, 0x2d, 0xb9, 0x3c, 0x7d, 0x12, 0x34, 0x72, 0x07, 0x4a, 0x6d, 0x27, 0x8e, 0x83, 0x36, + 0x26, 0x7d, 0xc0, 0x35, 0xda, 0xfa, 0x54, 0x0a, 0x81, 0xc5, 0xc8, 0x39, 0x90, 0x6b, 0x87, 0x4c, + 0x88, 0x01, 0xd3, 0x2d, 0x27, 0x70, 0x8e, 0xc2, 0x71, 0x69, 0x67, 0x58, 0xa9, 0xc8, 0x4e, 0x87, + 0x40, 0x59, 0xa7, 0x60, 0xc5, 0x64, 0x03, 0x8a, 0x96, 0xb5, 0xcb, 0x9f, 0x47, 0x2c, 0x24, 0xa7, + 0x09, 0xcb, 0xda, 0x65, 0x4a, 0x6f, 0x18, 0x1e, 0x49, 0x64, 0x14, 0x99, 0x7c, 0x0e, 0xe6, 0xa4, + 0x43, 0x0a, 0x0f, 0x37, 0x8d, 0x7d, 0x20, 0x3d, 0x64, 0x97, 0x85, 0x86, 0x84, 0x4d, 0xea, 0xa0, + 0xde, 0x19, 0x3e, 0x70, 0xf5, 0xc1, 0x00, 0xc3, 0x29, 0x7d, 0xe4, 0x06, 0x4c, 0x91, 0x2b, 0x27, + 0x89, 0xdd, 0xf0, 0xd5, 0x68, 0x57, 0x94, 0xca, 0xe6, 0x90, 0x2c, 0x25, 0x69, 0xc1, 0xb2, 0xe5, + 0x46, 0xc3, 0x01, 0xf3, 0x66, 0xdc, 0x62, 0xc7, 0x69, 0x16, 0x9c, 0x1a, 0x73, 0x60, 0x85, 0xb4, + 0x50, 0x38, 0x92, 0xee, 0x8f, 0x1c, 0xa9, 0x47, 0x89, 0x35, 0x57, 0x1e, 0x72, 0xf9, 0x1c, 0xa8, + 0x4c, 0x3a, 0x07, 0xbe, 0x9c, 0x93, 0x40, 0x01, 0x4f, 0xb3, 0x52, 0x02, 0x85, 0x54, 0xda, 0x84, + 0xff, 0x35, 0x25, 0xe5, 0xf0, 0xe1, 0x63, 0xf1, 0x36, 0xc0, 0x6d, 0xdf, 0xeb, 0xef, 0xba, 0xd1, + 0xa1, 0xdf, 0x95, 0xc2, 0x14, 0xcc, 0x7d, 0xe0, 0x7b, 0x7d, 0xfb, 0x08, 0xc1, 0x3f, 0xfe, 0xe4, + 0xaa, 0x84, 0x64, 0x4a, 0xff, 0x93, 0xcf, 0xc0, 0x2c, 0xfd, 0xd5, 0x4e, 0x7c, 0x32, 0xd9, 0xd5, + 0x15, 0x52, 0xb3, 0x74, 0xbb, 0x09, 0x02, 0xb9, 0x85, 0x09, 0xa6, 0xbd, 0x41, 0x24, 0x29, 0xaf, + 0x22, 0x9b, 0xb4, 0x37, 0x88, 0xb2, 0x31, 0x0a, 0x24, 0x64, 0xb2, 0x13, 0x57, 0x5d, 0x64, 0x94, + 0xe7, 0x79, 0xac, 0x79, 0xa0, 0x03, 0x2c, 0xb2, 0x45, 0x3e, 0x28, 0x39, 0xd0, 0x41, 0x86, 0x0c, + 0x2b, 0x61, 0xed, 0x54, 0xb9, 0xed, 0x62, 0x4a, 0xaa, 0x44, 0x78, 0xd8, 0xe5, 0x96, 0x88, 0x54, + 0x25, 0x62, 0x64, 0xb2, 0x09, 0x4b, 0x4c, 0xeb, 0xc7, 0x7c, 0xf3, 0x98, 0xcc, 0x78, 0x3a, 0x91, + 0x6d, 0x2c, 0x33, 0x3d, 0x3d, 0x77, 0xc8, 0x9f, 0xcf, 0x10, 0x90, 0x2d, 0x98, 0x42, 0x3b, 0x14, + 0x7f, 0x7f, 0x78, 0x49, 0xb6, 0x84, 0x66, 0xd7, 0x11, 0xca, 0x15, 0xb4, 0x81, 0xca, 0x72, 0x05, + 0x51, 0xc9, 0x2f, 0x02, 0x18, 0xfd, 0xc0, 0xef, 0xf5, 0x30, 0xc5, 0x59, 0x39, 0x15, 0x0f, 0x85, + 0xf3, 0x41, 0x2e, 0x09, 0x12, 0xcf, 0xae, 0x81, 0xbf, 0xed, 0x4c, 0x22, 0x34, 0x89, 0x17, 0xf9, + 0x0c, 0x4c, 0x5b, 0xc3, 0xfd, 0x7d, 0xef, 0x63, 0x3e, 0xa9, 0x59, 0x76, 0x2f, 0x84, 0xc8, 0x8b, + 0x99, 0xe1, 0x90, 0xb7, 0x60, 0x6e, 0x6f, 0xd0, 0x75, 0x22, 0x17, 0xef, 0xae, 0x78, 0xca, 0x48, + 0xdc, 0xce, 0x87, 0x08, 0x66, 0xee, 0xef, 0xf2, 0xca, 0x94, 0xd0, 0x89, 0x07, 0xcb, 0x3b, 0xed, + 0x76, 0x0b, 0xbb, 0x47, 0x3c, 0xa2, 0xe6, 0xe1, 0x46, 0x84, 0x16, 0x3c, 0x52, 0xbe, 0x79, 0x9d, + 0xee, 0x7a, 0x87, 0x51, 0x34, 0xb0, 0x59, 0x97, 0x8b, 0xf8, 0x4d, 0xf2, 0x22, 0x1b, 0xa1, 0xd2, + 0xfe, 0x50, 0xc9, 0xf9, 0x16, 0x79, 0x1d, 0x66, 0x63, 0xa0, 0x9c, 0x0d, 0x35, 0x61, 0x2f, 0x6f, + 0x54, 0x31, 0x2a, 0x9d, 0x45, 0xf4, 0x87, 0xc5, 0x08, 0xa5, 0xec, 0x25, 0x94, 0x30, 0x1c, 0xa1, + 0x94, 0x90, 0xe9, 0x21, 0xa4, 0xe1, 0x33, 0x3a, 0xc9, 0x7a, 0xd9, 0xf7, 0x47, 0x88, 0x04, 0x9a, + 0x56, 0x83, 0x69, 0x26, 0x1e, 0x31, 0x81, 0x23, 0x4f, 0x73, 0x2d, 0xa5, 0xff, 0x63, 0x09, 0x1c, + 0x39, 0x7c, 0x34, 0x81, 0xa3, 0x44, 0xa0, 0xdd, 0x81, 0x95, 0xbc, 0xa9, 0x96, 0xb2, 0x65, 0x2a, + 0xa7, 0xb5, 0x65, 0xfe, 0x69, 0x11, 0xe6, 0x91, 0x9b, 0xd8, 0x17, 0x75, 0x58, 0xb0, 0x86, 0x0f, + 0xe2, 0x64, 0x05, 0x62, 0x7f, 0xc4, 0xfa, 0x85, 0x72, 0x81, 0xec, 0x7c, 0x92, 0xa2, 0x20, 0x06, + 0x2c, 0x8a, 0xbd, 0x79, 0x5b, 0xbc, 0x9e, 0x8c, 0x73, 0x27, 0x8a, 0x47, 0xa5, 0xfc, 0x4d, 0x85, + 0x6c, 0xa8, 0x4c, 0x13, 0x25, 0x3b, 0x74, 0xf1, 0x71, 0x76, 0xe8, 0xd2, 0xa9, 0x76, 0xe8, 0xf7, + 0x61, 0x5e, 0x7c, 0x0d, 0xf7, 0xd6, 0xa9, 0x27, 0xdb, 0x5b, 0x53, 0xcc, 0x48, 0x3d, 0xde, 0x63, + 0xa7, 0x27, 0xee, 0xb1, 0xe8, 0xd1, 0x23, 0xe4, 0xde, 0x00, 0x61, 0x39, 0x5b, 0xed, 0x93, 0x6c, + 0x9b, 0xda, 0x9f, 0x17, 0x01, 0xb6, 0x2b, 0xad, 0x9f, 0x42, 0xe9, 0x79, 0x0d, 0x66, 0xeb, 0xbe, + 0xf0, 0x04, 0x91, 0xae, 0xe0, 0x7b, 0x02, 0x28, 0x2f, 0xaa, 0x18, 0x33, 0x56, 0x56, 0x8a, 0x9f, + 0x86, 0xb2, 0x72, 0x0b, 0x8d, 0xbd, 0x1f, 0xb8, 0x9d, 0xa8, 0x56, 0x15, 0x23, 0x8b, 0x2d, 0x17, + 0x11, 0x87, 0xd3, 0x9e, 0x00, 0x12, 0x32, 0xdd, 0x6c, 0xb8, 0x93, 0xa9, 0x08, 0xc2, 0xc4, 0xcd, + 0xab, 0xb8, 0xd9, 0x88, 0x48, 0x56, 0x22, 0xae, 0x93, 0x2c, 0xed, 0x33, 0x64, 0x9f, 0xf2, 0x68, + 0xbe, 0x17, 0xbf, 0x16, 0x98, 0x99, 0xd4, 0x43, 0xda, 0x48, 0x0f, 0x8d, 0x7d, 0x23, 0xa0, 0x7d, + 0x57, 0x91, 0xb3, 0xde, 0xfe, 0x14, 0x43, 0xfd, 0x26, 0x40, 0xec, 0x8a, 0x27, 0xc6, 0x3a, 0x8e, + 0xbf, 0xc3, 0xa0, 0x72, 0x2f, 0x27, 0xb8, 0x52, 0x6b, 0x8a, 0x9f, 0x56, 0x6b, 0xda, 0x30, 0xd7, + 0x7c, 0x18, 0x39, 0x89, 0xef, 0x26, 0x58, 0xf1, 0xc1, 0x04, 0xc5, 0x5a, 0x11, 0x6d, 0xf5, 0xe7, + 0xa4, 0x63, 0xcd, 0x98, 0x13, 0x8d, 0x44, 0xa8, 0xfd, 0x44, 0x81, 0x25, 0x39, 0x84, 0xe0, 0x71, + 0xbf, 0x43, 0xde, 0x61, 0x39, 0xb5, 0x94, 0xd4, 0x09, 0x54, 0x42, 0xa2, 0xf2, 0xfa, 0xb8, 0xdf, + 0x61, 0xfa, 0xac, 0xf3, 0x48, 0xae, 0x2c, 0x25, 0x24, 0x0f, 0x60, 0xbe, 0xe5, 0xf7, 0x7a, 0x74, + 0xb9, 0x05, 0x1f, 0xf1, 0xf3, 0x1c, 0x65, 0x94, 0xb5, 0x33, 0x8b, 0x0a, 0x6d, 0x3e, 0xcd, 0xcd, + 0x16, 0x17, 0x06, 0x74, 0xfb, 0xf6, 0x38, 0x5d, 0xc2, 0xf6, 0x1b, 0x18, 0x5b, 0x41, 0xe6, 0x99, + 0xa8, 0x1a, 0xe9, 0xec, 0xad, 0x72, 0x2d, 0x69, 0x31, 0xd6, 0x73, 0x82, 0xaa, 0xa1, 0xfd, 0x1d, + 0x05, 0xae, 0x8d, 0x36, 0xad, 0xd2, 0xf3, 0x87, 0xdd, 0x76, 0xe0, 0x78, 0xbd, 0xba, 0x7f, 0x10, + 0xb2, 0x5c, 0x44, 0x07, 0xc9, 0xb5, 0x15, 0xcf, 0x45, 0x74, 0xe0, 0x65, 0x73, 0x11, 0x61, 0xc8, + 0x95, 0x57, 0xa1, 0x6c, 0xbd, 0x67, 0xbd, 0x37, 0x74, 0x85, 0x69, 0x83, 0xc9, 0x87, 0xf0, 0xc3, + 0xd0, 0xfe, 0x90, 0x02, 0xe5, 0xed, 0x46, 0x20, 0x6a, 0x47, 0x70, 0x65, 0xb4, 0x1a, 0xc6, 0x1d, + 0x4b, 0x1f, 0x76, 0xbd, 0x08, 0x2b, 0x21, 0x04, 0x88, 0xf2, 0x29, 0x08, 0x10, 0xed, 0x9f, 0x17, + 0x81, 0x8c, 0x7e, 0x4f, 0xde, 0x2e, 0x94, 0xff, 0x0b, 0x07, 0xba, 0x8c, 0x44, 0x2f, 0x3d, 0xd6, + 0x41, 0xe8, 0x43, 0x50, 0x3b, 0x74, 0xd8, 0xec, 0x88, 0x8e, 0x9b, 0xdd, 0xf3, 0xe3, 0xdd, 0xeb, + 0x17, 0xc6, 0x4e, 0xe1, 0xf4, 0x38, 0x33, 0x11, 0x98, 0x65, 0x22, 0x6f, 0xc4, 0x9d, 0xf4, 0xbc, + 0xf0, 0x60, 0xd1, 0x7d, 0x18, 0xda, 0x0e, 0x1d, 0x23, 0xf6, 0xc1, 0xe9, 0x94, 0x2f, 0xed, 0xe4, + 0x11, 0x65, 0x82, 0x31, 0xcd, 0x40, 0xde, 0x3a, 0xdd, 0x87, 0x61, 0x8c, 0xab, 0x7d, 0x53, 0x81, + 0x95, 0xbc, 0xc9, 0x4d, 0x75, 0x0a, 0x59, 0xc9, 0x88, 0x55, 0x1c, 0xd4, 0x29, 0x64, 0xbd, 0x24, + 0xad, 0xe8, 0x64, 0x88, 0xb2, 0x5d, 0x5f, 0x78, 0xac, 0xcd, 0xf4, 0x87, 0x45, 0x98, 0x67, 0x1e, + 0x28, 0x3b, 0xae, 0xd3, 0x8b, 0x0e, 0xe9, 0x3c, 0x12, 0x79, 0xd6, 0xa5, 0x77, 0x0a, 0x13, 0x12, + 0xac, 0x6f, 0x40, 0xb9, 0x45, 0xc5, 0x42, 0xc7, 0xef, 0xc9, 0xd6, 0xeb, 0x01, 0x87, 0xc9, 0x4b, + 0x46, 0xe0, 0xa1, 0x2e, 0x2f, 0xdf, 0x3e, 0x31, 0x5d, 0x1e, 0x21, 0x29, 0x5d, 0x9e, 0xdd, 0x43, + 0x7d, 0x0c, 0x67, 0x13, 0xa7, 0xa2, 0xf8, 0x86, 0xeb, 0x14, 0x4f, 0x32, 0xd7, 0xf9, 0xf5, 0xde, + 0x95, 0xc4, 0x4f, 0x09, 0xaf, 0xc2, 0xb0, 0x34, 0x93, 0x3a, 0x2c, 0xef, 0x13, 0xe4, 0x0e, 0xa8, + 0x09, 0x98, 0xe7, 0x34, 0x63, 0x47, 0x33, 0x0c, 0xbb, 0x28, 0xb1, 0x1d, 0x49, 0x6f, 0x36, 0x42, + 0x48, 0xb7, 0xef, 0x04, 0x66, 0x24, 0xaf, 0xaf, 0xc5, 0x6d, 0x77, 0xcc, 0x0b, 0x2f, 0xd7, 0xe4, + 0xed, 0x3b, 0x43, 0x46, 0xc7, 0x48, 0xdc, 0xc9, 0xcd, 0x24, 0x63, 0xc4, 0x6f, 0xe3, 0xe4, 0x31, + 0xe2, 0x58, 0xeb, 0xbf, 0xa5, 0xc0, 0x52, 0x4d, 0xdf, 0xe5, 0x79, 0xba, 0x59, 0xaf, 0x5e, 0x87, + 0xa7, 0x6a, 0xfa, 0xae, 0xdd, 0x6a, 0xd6, 0x6b, 0x95, 0xfb, 0x76, 0x6e, 0x36, 0xcd, 0xa7, 0xe0, + 0xe2, 0x28, 0x4a, 0xe2, 0x7f, 0x75, 0x19, 0x56, 0x47, 0x8b, 0x45, 0xc6, 0xcd, 0x7c, 0x62, 0x91, + 0x9c, 0xb3, 0xb8, 0xfe, 0x2e, 0x2c, 0x89, 0xec, 0x92, 0xed, 0xba, 0x85, 0x27, 0xbc, 0x25, 0x98, + 0xbb, 0x6b, 0x98, 0xb5, 0xad, 0xfb, 0xf6, 0xd6, 0x5e, 0xbd, 0xae, 0x9e, 0x21, 0x0b, 0x30, 0xcb, + 0x01, 0x15, 0x5d, 0x55, 0xc8, 0x3c, 0x94, 0x6b, 0x0d, 0xcb, 0xa8, 0xec, 0x99, 0x86, 0x5a, 0x58, + 0xff, 0xc7, 0x0a, 0x2c, 0xb0, 0x33, 0x5b, 0xc0, 0x5b, 0x74, 0x05, 0xd6, 0xf6, 0x5a, 0x55, 0xbd, + 0x6d, 0x98, 0xf9, 0xcd, 0x39, 0x07, 0xcb, 0x99, 0xf2, 0xe6, 0x1d, 0x55, 0x21, 0x97, 0xe0, 0x42, + 0x06, 0x5c, 0xad, 0x59, 0xfa, 0x26, 0x6b, 0xc5, 0x45, 0x38, 0x97, 0x29, 0x6c, 0xd5, 0x1a, 0x0d, + 0xa3, 0xaa, 0x16, 0x69, 0x03, 0x47, 0x3e, 0x67, 0x1a, 0x7a, 0x95, 0x92, 0xaa, 0xa5, 0xf5, 0x77, + 0x61, 0xb1, 0x15, 0x3f, 0x36, 0x43, 0xf7, 0xae, 0x19, 0x28, 0x9a, 0xfa, 0x3d, 0xf5, 0x0c, 0x01, + 0x98, 0x6e, 0xdd, 0xa9, 0x58, 0x37, 0x6f, 0xaa, 0x0a, 0x99, 0x83, 0x99, 0xed, 0x4a, 0xcb, 0xbe, + 0xb3, 0x6b, 0xa9, 0x05, 0xfa, 0x43, 0xbf, 0x67, 0xe1, 0x8f, 0xe2, 0xfa, 0x2b, 0xe8, 0xd4, 0xf0, + 0xf1, 0x71, 0xdd, 0x0b, 0x23, 0xb7, 0xef, 0x06, 0xd8, 0x47, 0xf3, 0x50, 0xb6, 0x5c, 0xaa, 0x89, + 0x45, 0x2e, 0xeb, 0xa0, 0xdd, 0x61, 0x2f, 0xf2, 0x06, 0x3d, 0xf7, 0x63, 0x55, 0x59, 0xbf, 0x05, + 0x4b, 0xa6, 0x3f, 0xa4, 0x27, 0x48, 0x2b, 0xa2, 0x18, 0x07, 0xc7, 0xd8, 0xe6, 0x86, 0xbe, 0xbb, + 0x59, 0xdb, 0xde, 0x6b, 0xee, 0x59, 0xf6, 0xae, 0xde, 0xae, 0xec, 0x30, 0xe7, 0xb2, 0xdd, 0xa6, + 0xd5, 0xb6, 0x4d, 0xa3, 0x62, 0x34, 0xda, 0xaa, 0xb2, 0xfe, 0x75, 0xbc, 0x6a, 0xe8, 0xf8, 0xfd, + 0xee, 0x96, 0xd3, 0x89, 0xfc, 0x00, 0x2b, 0xac, 0xc1, 0x15, 0xcb, 0xa8, 0x34, 0x1b, 0x55, 0x7b, + 0x4b, 0xaf, 0xb4, 0x9b, 0x66, 0x5e, 0xba, 0xd9, 0x35, 0x38, 0x9f, 0x83, 0xd3, 0x6c, 0xb7, 0x54, + 0x85, 0x5c, 0x85, 0x4b, 0x39, 0x65, 0xf7, 0x8c, 0x4d, 0x7d, 0xaf, 0xbd, 0xd3, 0x50, 0x0b, 0x63, + 0x88, 0x2d, 0xab, 0xa9, 0x16, 0xd7, 0xff, 0xae, 0x02, 0x8b, 0x7b, 0x21, 0x7f, 0xe9, 0xba, 0x87, + 0x37, 0xcb, 0xd7, 0xe0, 0xf2, 0x9e, 0x65, 0x98, 0x76, 0xbb, 0x79, 0xc7, 0x68, 0xd8, 0x7b, 0x96, + 0xbe, 0x9d, 0xad, 0xcd, 0x55, 0xb8, 0x24, 0x61, 0x98, 0x46, 0xa5, 0x79, 0xd7, 0x30, 0xed, 0x96, + 0x6e, 0x59, 0xf7, 0x9a, 0x66, 0x55, 0x55, 0xe8, 0x17, 0x73, 0x10, 0x76, 0xb7, 0x74, 0x56, 0x9b, + 0x54, 0x59, 0xc3, 0xb8, 0xa7, 0xd7, 0xed, 0xcd, 0x66, 0x5b, 0x2d, 0xae, 0xef, 0xd2, 0xc3, 0x15, + 0x26, 0x7d, 0x64, 0xef, 0x91, 0xca, 0x50, 0x6a, 0x34, 0x1b, 0x46, 0xd6, 0x25, 0x71, 0x1e, 0xca, + 0x7a, 0xab, 0x65, 0x36, 0xef, 0xe2, 0xe4, 0x01, 0x98, 0xae, 0x1a, 0x8d, 0x1a, 0xce, 0x96, 0x79, + 0x28, 0xb7, 0xcc, 0xe6, 0x6e, 0xb3, 0x6d, 0x54, 0xd5, 0xd2, 0xba, 0x0e, 0xcb, 0x6c, 0x4b, 0xe0, + 0x4c, 0xf1, 0x3e, 0x6a, 0x01, 0x66, 0xf7, 0x1a, 0x55, 0x63, 0xab, 0xd6, 0xc0, 0xb6, 0x2c, 0x02, + 0x58, 0x3b, 0x4d, 0xb3, 0x6d, 0xb7, 0x0d, 0x73, 0x97, 0x65, 0xf1, 0xad, 0x37, 0x1b, 0xdb, 0xec, + 0x67, 0x61, 0xdd, 0x14, 0x6a, 0x80, 0xa8, 0x57, 0xc7, 0x67, 0x2e, 0x84, 0x55, 0x63, 0x4b, 0xdf, + 0xab, 0xb7, 0xf9, 0x28, 0xdf, 0xb7, 0x4d, 0xe3, 0xbd, 0x3d, 0xc3, 0x6a, 0x5b, 0xaa, 0x42, 0x54, + 0x98, 0x6f, 0x18, 0x46, 0xd5, 0xb2, 0x4d, 0xe3, 0x6e, 0xcd, 0xb8, 0xa7, 0x16, 0x68, 0xb5, 0xd8, + 0xff, 0xb4, 0x92, 0xeb, 0xdf, 0x52, 0x80, 0xb0, 0x9c, 0x9b, 0x3b, 0x7e, 0x18, 0xd1, 0xde, 0xc7, + 0x49, 0x77, 0x05, 0xd6, 0x76, 0xe8, 0x6c, 0xc1, 0xde, 0xd9, 0x6d, 0x56, 0xb3, 0xbd, 0x7e, 0x1e, + 0x48, 0xa6, 0xbc, 0xb9, 0xb5, 0x85, 0x2b, 0xeb, 0x6c, 0x06, 0x5e, 0x35, 0x9b, 0x2d, 0xb5, 0xb0, + 0x56, 0x28, 0x2b, 0xe4, 0xc2, 0x48, 0xe1, 0x1d, 0xc3, 0x68, 0xa9, 0x45, 0x3a, 0xca, 0x99, 0x02, + 0xb1, 0xea, 0x19, 0x79, 0x69, 0xfd, 0x6b, 0x0a, 0x9c, 0x67, 0xd5, 0x14, 0x22, 0x24, 0xae, 0xea, + 0x65, 0x58, 0xe5, 0x99, 0x84, 0xf3, 0x2a, 0xba, 0x02, 0x6a, 0xaa, 0x94, 0x55, 0xf3, 0x1c, 0x2c, + 0xa7, 0xa0, 0x58, 0x8f, 0x02, 0x15, 0x90, 0x29, 0xf0, 0xa6, 0x61, 0xb5, 0x6d, 0x63, 0x6b, 0x8b, + 0x0e, 0x09, 0x56, 0xa4, 0xb8, 0xae, 0xc1, 0x72, 0xc5, 0x0d, 0x22, 0xe3, 0xe3, 0xc8, 0xed, 0x87, + 0x9e, 0xdf, 0xc7, 0x2a, 0x2c, 0xc0, 0xac, 0xf1, 0x8b, 0x6d, 0xa3, 0x61, 0xd5, 0x9a, 0x0d, 0xf5, + 0xcc, 0xfa, 0xe5, 0x0c, 0x8e, 0x10, 0x05, 0x96, 0xb5, 0xa3, 0x9e, 0x59, 0x77, 0x60, 0x41, 0xbc, + 0x01, 0x65, 0x13, 0xeb, 0x0a, 0xac, 0x89, 0xe9, 0x8a, 0x62, 0x25, 0xdb, 0x84, 0x55, 0x58, 0x19, + 0x2d, 0x37, 0xda, 0xaa, 0x42, 0x47, 0x21, 0x53, 0x42, 0xe1, 0x85, 0xf5, 0xaf, 0x2a, 0xb0, 0x10, + 0x3b, 0x26, 0xe0, 0x44, 0xbb, 0x0a, 0x97, 0x76, 0xb7, 0x74, 0xbb, 0x6a, 0xdc, 0xad, 0x55, 0x0c, + 0xfb, 0x4e, 0xad, 0x51, 0xcd, 0x7c, 0xe4, 0x22, 0x9c, 0xcb, 0x41, 0xc0, 0xaf, 0xac, 0xc2, 0x4a, + 0xb6, 0xa8, 0x4d, 0x57, 0x7b, 0x81, 0x76, 0x7d, 0xb6, 0x24, 0x5e, 0xea, 0xc5, 0xf5, 0xbb, 0xb0, + 0x68, 0xe9, 0xbb, 0xf5, 0x2d, 0x3f, 0xe8, 0xb8, 0xfa, 0x30, 0x3a, 0xec, 0x53, 0xb9, 0xbb, 0xd5, + 0x34, 0x2b, 0x86, 0x8d, 0x28, 0x99, 0x1a, 0x9c, 0x85, 0x25, 0xb9, 0xf0, 0xbe, 0x41, 0xa7, 0x2f, + 0x81, 0x45, 0x19, 0xd8, 0x68, 0xaa, 0x85, 0xf5, 0x2f, 0xc2, 0x3c, 0xf7, 0x56, 0x62, 0xfd, 0x77, + 0x01, 0xce, 0xca, 0xbf, 0x5b, 0x6e, 0xbf, 0xeb, 0xf5, 0x0f, 0xd4, 0x33, 0xd9, 0x02, 0x73, 0xd8, + 0xef, 0xd3, 0x02, 0x14, 0x09, 0x72, 0x41, 0xdb, 0x0d, 0x8e, 0xbc, 0xbe, 0x13, 0xb9, 0x5d, 0xb5, + 0xb0, 0xfe, 0x12, 0x2c, 0xa4, 0xb2, 0xc8, 0xd2, 0x81, 0xab, 0x37, 0xb9, 0x0c, 0xdf, 0x35, 0xaa, + 0xb5, 0xbd, 0x5d, 0x75, 0x8a, 0x0a, 0x83, 0x9d, 0xda, 0xf6, 0x8e, 0x0a, 0xeb, 0xbf, 0xad, 0xc0, + 0x22, 0x5d, 0x8f, 0x5e, 0xe0, 0xee, 0x6e, 0xe9, 0x62, 0xa8, 0xe9, 0x34, 0x63, 0xb9, 0xa9, 0x0d, + 0xcb, 0x62, 0xce, 0xbc, 0x97, 0x61, 0x95, 0xff, 0xb0, 0xf5, 0x46, 0xd5, 0xde, 0xd1, 0xcd, 0xea, + 0x3d, 0xdd, 0xa4, 0x73, 0xef, 0xbe, 0x5a, 0xc0, 0x05, 0x25, 0x41, 0xec, 0x76, 0x73, 0xaf, 0xb2, + 0xa3, 0x16, 0xe9, 0xfc, 0x4d, 0xc1, 0x5b, 0xb5, 0x86, 0x5a, 0xc2, 0xe5, 0x39, 0x82, 0x8d, 0x6c, + 0x69, 0xf9, 0xd4, 0xfa, 0x0f, 0x14, 0xb8, 0x60, 0x79, 0x07, 0x7d, 0x27, 0x1a, 0x06, 0xae, 0xde, + 0x3b, 0xf0, 0x03, 0x2f, 0x3a, 0x3c, 0xb2, 0x86, 0x5e, 0xe4, 0x92, 0xe7, 0xe1, 0x59, 0xab, 0xb6, + 0xdd, 0xd0, 0xdb, 0x74, 0x79, 0xe9, 0xf5, 0xed, 0xa6, 0x59, 0x6b, 0xef, 0xec, 0xda, 0xd6, 0x5e, + 0x6d, 0x64, 0xe6, 0x3d, 0x03, 0xd7, 0xc6, 0xa3, 0xd6, 0x8d, 0x6d, 0xbd, 0x72, 0x5f, 0x55, 0x26, + 0x33, 0xdc, 0xd4, 0xeb, 0x7a, 0xa3, 0x62, 0x54, 0xed, 0xbb, 0x37, 0xd5, 0x02, 0x79, 0x16, 0xae, + 0x8f, 0x47, 0xdd, 0xaa, 0xb5, 0x2c, 0x8a, 0x56, 0x9c, 0xfc, 0xdd, 0x1d, 0x6b, 0x97, 0x62, 0x95, + 0xd6, 0xbf, 0xa9, 0xc0, 0xea, 0xb8, 0xec, 0x08, 0xe4, 0x06, 0x68, 0x46, 0xa3, 0x6d, 0xea, 0xb5, + 0xaa, 0x5d, 0x31, 0x8d, 0xaa, 0xd1, 0x68, 0xd7, 0xf4, 0xba, 0x65, 0x5b, 0xcd, 0x3d, 0x3a, 0x9b, + 0x12, 0x9f, 0xeb, 0xa7, 0xe1, 0xea, 0x04, 0xbc, 0x66, 0xad, 0x5a, 0x51, 0x15, 0x72, 0x13, 0x5e, + 0x9c, 0x80, 0x64, 0xdd, 0xb7, 0xda, 0xc6, 0xae, 0x5c, 0xa2, 0x16, 0x50, 0x60, 0xe5, 0x47, 0x03, + 0xa7, 0xad, 0xc3, 0x92, 0xc9, 0x15, 0xbb, 0x0e, 0x4f, 0x8d, 0xc5, 0xe2, 0xd5, 0x7a, 0x1a, 0xae, + 0x8e, 0x45, 0x61, 0x95, 0x52, 0x0b, 0xeb, 0xef, 0xc3, 0xda, 0xf8, 0x88, 0xb4, 0x74, 0xbf, 0x48, + 0x0f, 0x79, 0x19, 0x4a, 0x55, 0xba, 0xcb, 0xa5, 0x72, 0xa9, 0xd3, 0xd9, 0x69, 0x1a, 0xb5, 0xdd, + 0x16, 0x15, 0x84, 0x7c, 0x73, 0xc1, 0xdd, 0xe3, 0x2b, 0x4a, 0x9c, 0xed, 0x21, 0xe1, 0x99, 0x75, + 0xdf, 0x37, 0xf7, 0x1a, 0x0d, 0xb6, 0x57, 0x2e, 0xc1, 0x5c, 0xb3, 0xbd, 0x63, 0x98, 0x3c, 0x4d, + 0x3d, 0xe6, 0xa5, 0xdf, 0x6b, 0xd0, 0xa5, 0xdd, 0x34, 0x6b, 0x5f, 0xc0, 0x4d, 0x73, 0x15, 0x56, + 0xac, 0xba, 0x5e, 0xb9, 0x63, 0x37, 0x9a, 0x6d, 0xbb, 0xd6, 0xb0, 0x2b, 0x3b, 0x7a, 0xa3, 0x61, + 0xd4, 0x55, 0xa0, 0x32, 0xbb, 0x79, 0xa7, 0xad, 0xdb, 0x95, 0x66, 0x63, 0xab, 0xb6, 0xcd, 0x59, + 0xac, 0xe0, 0x2c, 0x18, 0x17, 0x40, 0x86, 0x7c, 0x06, 0x9e, 0x43, 0x9a, 0x56, 0x7d, 0x6f, 0xbb, + 0xd6, 0xb0, 0xad, 0xfb, 0x8d, 0x8a, 0xd0, 0xdc, 0x2a, 0xa3, 0x7b, 0xc5, 0x73, 0xf0, 0xcc, 0x44, + 0xec, 0x24, 0xcf, 0xfc, 0x0d, 0xd0, 0x26, 0x62, 0xf2, 0xf6, 0xad, 0x7f, 0x4f, 0x81, 0x4b, 0x13, + 0x1c, 0xcc, 0xc8, 0x8b, 0xf0, 0xfc, 0x8e, 0xa1, 0x57, 0xeb, 0x86, 0x65, 0xa1, 0x84, 0xa3, 0x83, + 0xc8, 0xbc, 0xff, 0x73, 0x77, 0x82, 0xe7, 0xe1, 0xd9, 0xc9, 0xe8, 0x89, 0x5a, 0xf2, 0x1c, 0x3c, + 0x33, 0x19, 0x95, 0xab, 0x29, 0x05, 0xb2, 0x0e, 0x37, 0x26, 0x63, 0xc6, 0xea, 0x4d, 0x71, 0xfd, + 0x37, 0x15, 0x38, 0x9f, 0x7f, 0xa7, 0x43, 0xeb, 0x56, 0x6b, 0x58, 0x6d, 0xbd, 0x5e, 0xb7, 0x5b, + 0xba, 0xa9, 0xef, 0xda, 0x46, 0xc3, 0x6c, 0xd6, 0xeb, 0x79, 0x7b, 0xf2, 0x33, 0x70, 0x6d, 0x3c, + 0xaa, 0x55, 0x31, 0x6b, 0x2d, 0xba, 0xed, 0x68, 0x70, 0x65, 0x3c, 0x96, 0x51, 0xab, 0x18, 0x6a, + 0x61, 0xf3, 0xed, 0xef, 0xfc, 0xf9, 0x95, 0x33, 0xdf, 0xf9, 0xc1, 0x15, 0xe5, 0x3f, 0xfd, 0xe0, + 0x8a, 0xf2, 0x67, 0x3f, 0xb8, 0xa2, 0x7c, 0xe1, 0x05, 0xe6, 0x52, 0xff, 0x52, 0xc7, 0x3f, 0x7a, + 0xf9, 0x20, 0x70, 0x3e, 0xf2, 0x22, 0x87, 0x25, 0x26, 0x7a, 0x59, 0x5c, 0xc9, 0xbd, 0xec, 0x0c, + 0xbc, 0x97, 0xf1, 0xc8, 0xff, 0x60, 0x1a, 0x4f, 0x90, 0xaf, 0xfe, 0x9f, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xe6, 0x26, 0xc5, 0xf1, 0x19, 0x03, 0x02, 0x00, } func (this *SSHKeyPair) Equal(that interface{}) bool { @@ -58834,6 +58882,43 @@ func (m *AccessGraphAWSSyncCloudTrailLogs) MarshalToSizedBuffer(dAtA []byte) (in return len(dAtA) - i, nil } +func (m *AccessGraphAWSSyncEKSAuditLogs) 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 *AccessGraphAWSSyncEKSAuditLogs) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AccessGraphAWSSyncEKSAuditLogs) 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) + } + { + size := m.Tags.Size() + i -= size + if _, err := m.Tags.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *AccessGraphAWSSync) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -58858,6 +58943,18 @@ func (m *AccessGraphAWSSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.EksAuditLogs != nil { + { + size, err := m.EksAuditLogs.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } if m.CloudTrailLogs != nil { { size, err := m.CloudTrailLogs.MarshalToSizedBuffer(dAtA[:i]) @@ -58988,12 +59085,12 @@ func (m *TargetHealth) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2a } if m.TransitionTimestamp != nil { - n482, err482 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) - if err482 != nil { - return 0, err482 + n484, err484 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) + if err484 != nil { + return 0, err484 } - i -= n482 - i = encodeVarintTypes(dAtA, i, uint64(n482)) + i -= n484 + i = encodeVarintTypes(dAtA, i, uint64(n484)) i-- dAtA[i] = 0x22 } @@ -72045,6 +72142,20 @@ func (m *AccessGraphAWSSyncCloudTrailLogs) Size() (n int) { return n } +func (m *AccessGraphAWSSyncEKSAuditLogs) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Tags.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *AccessGraphAWSSync) Size() (n int) { if m == nil { return 0 @@ -72069,6 +72180,10 @@ func (m *AccessGraphAWSSync) Size() (n int) { l = m.CloudTrailLogs.Size() n += 1 + l + sovTypes(uint64(l)) } + if m.EksAuditLogs != nil { + l = m.EksAuditLogs.Size() + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -154260,6 +154375,90 @@ func (m *AccessGraphAWSSyncCloudTrailLogs) Unmarshal(dAtA []byte) error { } return nil } +func (m *AccessGraphAWSSyncEKSAuditLogs) 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: AccessGraphAWSSyncEKSAuditLogs: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessGraphAWSSyncEKSAuditLogs: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tags", 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.Tags.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + 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 *AccessGraphAWSSync) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -154425,6 +154624,42 @@ func (m *AccessGraphAWSSync) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EksAuditLogs", 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 m.EksAuditLogs == nil { + m.EksAuditLogs = &AccessGraphAWSSyncEKSAuditLogs{} + } + if err := m.EksAuditLogs.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go b/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go index 5b84736422ca1..4a84628d2f0c0 100644 --- a/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/access_graph_service.pb.go @@ -28,6 +28,7 @@ import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" emptypb "google.golang.org/protobuf/types/known/emptypb" + structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -41,6 +42,60 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// KubeAuditLogSource specifies a source of logs in order to interpret a +// KubeAuditLogCursor id and cursor. Different sources of logs will have +// different ways of representing a position in a log stream. +type KubeAuditLogCursor_KubeAuditLogSource int32 + +const ( + // KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED represents a zero value where no log + // source has been specified. + KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED KubeAuditLogCursor_KubeAuditLogSource = 0 + // KUBE_AUDIT_LOG_SOURCE_EKS specifies AWS CloudWatch as the source of + // Kubernetes apiserver audit logs. This is where EKS sends the apiserver + // audit logs. + KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_EKS KubeAuditLogCursor_KubeAuditLogSource = 1 +) + +// Enum value maps for KubeAuditLogCursor_KubeAuditLogSource. +var ( + KubeAuditLogCursor_KubeAuditLogSource_name = map[int32]string{ + 0: "KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED", + 1: "KUBE_AUDIT_LOG_SOURCE_EKS", + } + KubeAuditLogCursor_KubeAuditLogSource_value = map[string]int32{ + "KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED": 0, + "KUBE_AUDIT_LOG_SOURCE_EKS": 1, + } +) + +func (x KubeAuditLogCursor_KubeAuditLogSource) Enum() *KubeAuditLogCursor_KubeAuditLogSource { + p := new(KubeAuditLogCursor_KubeAuditLogSource) + *p = x + return p +} + +func (x KubeAuditLogCursor_KubeAuditLogSource) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (KubeAuditLogCursor_KubeAuditLogSource) Descriptor() protoreflect.EnumDescriptor { + return file_accessgraph_v1alpha_access_graph_service_proto_enumTypes[0].Descriptor() +} + +func (KubeAuditLogCursor_KubeAuditLogSource) Type() protoreflect.EnumType { + return &file_accessgraph_v1alpha_access_graph_service_proto_enumTypes[0] +} + +func (x KubeAuditLogCursor_KubeAuditLogSource) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use KubeAuditLogCursor_KubeAuditLogSource.Descriptor instead. +func (KubeAuditLogCursor_KubeAuditLogSource) EnumDescriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{46, 0} +} + // QueryRequest is a request to query the access graph. type QueryRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -2821,6 +2876,489 @@ func (x *AWSCloudTrailEventResource) GetType() string { return "" } +// KubeAuditLogStreamRequest is sent from the client (Teleport) to the server +// (access graph) over the bi-directional KubeAuditLogStream. It encapsulates +// distinct client actions for sending batches of Kubernetes audit log events +// and managing the persistent resume state maintained by the access graph +// server. +type KubeAuditLogStreamRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Action: + // + // *KubeAuditLogStreamRequest_Config + // *KubeAuditLogStreamRequest_NewStream + // *KubeAuditLogStreamRequest_Events + Action isKubeAuditLogStreamRequest_Action `protobuf_oneof:"action"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeAuditLogStreamRequest) Reset() { + *x = KubeAuditLogStreamRequest{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeAuditLogStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeAuditLogStreamRequest) ProtoMessage() {} + +func (x *KubeAuditLogStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[42] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeAuditLogStreamRequest.ProtoReflect.Descriptor instead. +func (*KubeAuditLogStreamRequest) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{42} +} + +func (x *KubeAuditLogStreamRequest) GetAction() isKubeAuditLogStreamRequest_Action { + if x != nil { + return x.Action + } + return nil +} + +func (x *KubeAuditLogStreamRequest) GetConfig() *KubeAuditLogConfig { + if x != nil { + if x, ok := x.Action.(*KubeAuditLogStreamRequest_Config); ok { + return x.Config + } + } + return nil +} + +func (x *KubeAuditLogStreamRequest) GetNewStream() *KubeAuditLogNewStream { + if x != nil { + if x, ok := x.Action.(*KubeAuditLogStreamRequest_NewStream); ok { + return x.NewStream + } + } + return nil +} + +func (x *KubeAuditLogStreamRequest) GetEvents() *KubeAuditLogEvents { + if x != nil { + if x, ok := x.Action.(*KubeAuditLogStreamRequest_Events); ok { + return x.Events + } + } + return nil +} + +type isKubeAuditLogStreamRequest_Action interface { + isKubeAuditLogStreamRequest_Action() +} + +type KubeAuditLogStreamRequest_Config struct { + Config *KubeAuditLogConfig `protobuf:"bytes,1,opt,name=config,proto3,oneof"` +} + +type KubeAuditLogStreamRequest_NewStream struct { + NewStream *KubeAuditLogNewStream `protobuf:"bytes,2,opt,name=new_stream,json=newStream,proto3,oneof"` +} + +type KubeAuditLogStreamRequest_Events struct { + Events *KubeAuditLogEvents `protobuf:"bytes,3,opt,name=events,proto3,oneof"` +} + +func (*KubeAuditLogStreamRequest_Config) isKubeAuditLogStreamRequest_Action() {} + +func (*KubeAuditLogStreamRequest_NewStream) isKubeAuditLogStreamRequest_Action() {} + +func (*KubeAuditLogStreamRequest_Events) isKubeAuditLogStreamRequest_Action() {} + +// KubeAuditLogConfig is the KubeAuditLogStream configuration. It is sent from +// the client (Teleport) to the server (access graph) on start up, containing +// any configuration parameters from the Teleport config. The server will +// respond with an adjusted config that is that it will use, possibly +// overriding the supplied config. +// Currently there is no configuration exchanged. This message is present for +// future expansion. +type KubeAuditLogConfig struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeAuditLogConfig) Reset() { + *x = KubeAuditLogConfig{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeAuditLogConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeAuditLogConfig) ProtoMessage() {} + +func (x *KubeAuditLogConfig) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[43] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeAuditLogConfig.ProtoReflect.Descriptor instead. +func (*KubeAuditLogConfig) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{43} +} + +// KubeAuditLogNewStream identifies a log source and cluster that the client +// wants to start sending to the server. The server responds with a +// KubeAuditLogResumeState message indicating where to resume streaming +// logs from. +type KubeAuditLogNewStream struct { + state protoimpl.MessageState `protogen:"open.v1"` + Initial *KubeAuditLogCursor `protobuf:"bytes,1,opt,name=initial,proto3" json:"initial,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeAuditLogNewStream) Reset() { + *x = KubeAuditLogNewStream{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeAuditLogNewStream) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeAuditLogNewStream) ProtoMessage() {} + +func (x *KubeAuditLogNewStream) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[44] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeAuditLogNewStream.ProtoReflect.Descriptor instead. +func (*KubeAuditLogNewStream) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{44} +} + +func (x *KubeAuditLogNewStream) GetInitial() *KubeAuditLogCursor { + if x != nil { + return x.Initial + } + return nil +} + +// KubeAuditLogEvents is a chunk of Kubernetes apiserver audit logs. +type KubeAuditLogEvents struct { + state protoimpl.MessageState `protogen:"open.v1"` + // event is a Kubernetes audit log event represented as a struct so as to + // not depend on the Kubernetes proto files. Additionally, the audit log + // events are typically received as JSON, not protobufs. + // package k8s.io.apiserver.pkg.apis.audit.v1 at + // https://github.com/kubernetes/apiserver/blob/master/pkg/apis/audit/v1/generated.proto + Events []*structpb.Struct `protobuf:"bytes,1,rep,name=events,proto3" json:"events,omitempty"` + // cursor is the position in the event stream of the last event in the + // event field. It can be sent back to Teleport when a stream is + // reconnected to resume the event stream from the end of this chunk. + Cursor *KubeAuditLogCursor `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeAuditLogEvents) Reset() { + *x = KubeAuditLogEvents{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeAuditLogEvents) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeAuditLogEvents) ProtoMessage() {} + +func (x *KubeAuditLogEvents) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[45] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeAuditLogEvents.ProtoReflect.Descriptor instead. +func (*KubeAuditLogEvents) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{45} +} + +func (x *KubeAuditLogEvents) GetEvents() []*structpb.Struct { + if x != nil { + return x.Events + } + return nil +} + +func (x *KubeAuditLogEvents) GetCursor() *KubeAuditLogCursor { + if x != nil { + return x.Cursor + } + return nil +} + +// KubeAuditLogCursor is a position in a stream of KubeAuditLogEvents for +// resuming a stream of events after an interrupted connection. Each batch +// of events has a cursor referring to the last event of the batch. The +// cursor can be sent to Teleport when resuming a connection. +type KubeAuditLogCursor struct { + state protoimpl.MessageState `protogen:"open.v1"` + // log_source is where the logs are coming from that this cursor is for. + LogSource KubeAuditLogCursor_KubeAuditLogSource `protobuf:"varint,1,opt,name=log_source,json=logSource,proto3,enum=accessgraph.v1alpha.KubeAuditLogCursor_KubeAuditLogSource" json:"log_source,omitempty"` + // cluster_id is an opaque identifier for the Kubernetes cluster that this + // cursor refers to. The ID should be interpreted based on the cluster type. + ClusterId string `protobuf:"bytes,2,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` + // event_id is the ID of the last event of a batch of events that a cursor + // refers to. It is an opaque value interpreted according to the log_source + // of the cursor. When sent as part of a KubeAuditLogNewStream message, it + // will be empty. When sent as part of a KubeAuditLogResumeState, it may be + // empty to indicate that there is no resume state cursor. + EventId string `protobuf:"bytes,3,opt,name=event_id,json=eventId,proto3" json:"event_id,omitempty"` + // last_event_time is the timestamp of the last event of a batch of events + // that a cursor refers to. If the event_id is sufficient to resume streaming + // events for a log source then this field may be omitted. When sent as part + // of a KubeAuditLogNewStream message, it may contain the timestamp from which + // the client intends to stream logs. The KubeAuditLogResumeState may contain + // a different time, indicating the timestamp from which it should start, + // either because it is a resumption of an existing stream or because the + // server is overriding the start timestamp for a new stream. + LastEventTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_event_time,json=lastEventTime,proto3" json:"last_event_time,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeAuditLogCursor) Reset() { + *x = KubeAuditLogCursor{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeAuditLogCursor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeAuditLogCursor) ProtoMessage() {} + +func (x *KubeAuditLogCursor) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[46] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeAuditLogCursor.ProtoReflect.Descriptor instead. +func (*KubeAuditLogCursor) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{46} +} + +func (x *KubeAuditLogCursor) GetLogSource() KubeAuditLogCursor_KubeAuditLogSource { + if x != nil { + return x.LogSource + } + return KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED +} + +func (x *KubeAuditLogCursor) GetClusterId() string { + if x != nil { + return x.ClusterId + } + return "" +} + +func (x *KubeAuditLogCursor) GetEventId() string { + if x != nil { + return x.EventId + } + return "" +} + +func (x *KubeAuditLogCursor) GetLastEventTime() *timestamppb.Timestamp { + if x != nil { + return x.LastEventTime + } + return nil +} + +// KubeAuditLogStreamResponse is sent from the server (access graph) to the +// client (Teleport) over th bi-directional KubeAuditLogStream. It is used to +// convey the resume state of the log streams that access graph is processing +// the logs for. +type KubeAuditLogStreamResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to State: + // + // *KubeAuditLogStreamResponse_Config + // *KubeAuditLogStreamResponse_ResumeState + State isKubeAuditLogStreamResponse_State `protobuf_oneof:"state"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeAuditLogStreamResponse) Reset() { + *x = KubeAuditLogStreamResponse{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeAuditLogStreamResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeAuditLogStreamResponse) ProtoMessage() {} + +func (x *KubeAuditLogStreamResponse) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[47] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeAuditLogStreamResponse.ProtoReflect.Descriptor instead. +func (*KubeAuditLogStreamResponse) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{47} +} + +func (x *KubeAuditLogStreamResponse) GetState() isKubeAuditLogStreamResponse_State { + if x != nil { + return x.State + } + return nil +} + +func (x *KubeAuditLogStreamResponse) GetConfig() *KubeAuditLogConfig { + if x != nil { + if x, ok := x.State.(*KubeAuditLogStreamResponse_Config); ok { + return x.Config + } + } + return nil +} + +func (x *KubeAuditLogStreamResponse) GetResumeState() *KubeAuditLogResumeState { + if x != nil { + if x, ok := x.State.(*KubeAuditLogStreamResponse_ResumeState); ok { + return x.ResumeState + } + } + return nil +} + +type isKubeAuditLogStreamResponse_State interface { + isKubeAuditLogStreamResponse_State() +} + +type KubeAuditLogStreamResponse_Config struct { + Config *KubeAuditLogConfig `protobuf:"bytes,1,opt,name=config,proto3,oneof"` +} + +type KubeAuditLogStreamResponse_ResumeState struct { + ResumeState *KubeAuditLogResumeState `protobuf:"bytes,2,opt,name=resume_state,json=resumeState,proto3,oneof"` +} + +func (*KubeAuditLogStreamResponse_Config) isKubeAuditLogStreamResponse_State() {} + +func (*KubeAuditLogStreamResponse_ResumeState) isKubeAuditLogStreamResponse_State() {} + +// KubeAuditLogResumeState is the response to the KubeAuditLogNewStream request +// and contains the cursor for the resume state of that Kubernetes cluster. +type KubeAuditLogResumeState struct { + state protoimpl.MessageState `protogen:"open.v1"` + // cursor is a resumption cursor for a new stream, sent in response to + // a KubeAuditLogNewStream request. If the log_source and cluster_id sent + // in the new stream request are unknown to the server, this cursor + // may not contain a position to resume from. However the timestamp in + // the cursor should be set to what was received in the KubeAuditLogNewStream + // message if it is not to be overridden, or it should be replaced with + // a different initial start timestamp if Access Graph (server) wants to + // override that. + Cursor *KubeAuditLogCursor `protobuf:"bytes,1,opt,name=cursor,proto3" json:"cursor,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *KubeAuditLogResumeState) Reset() { + *x = KubeAuditLogResumeState{} + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *KubeAuditLogResumeState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*KubeAuditLogResumeState) ProtoMessage() {} + +func (x *KubeAuditLogResumeState) ProtoReflect() protoreflect.Message { + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[48] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use KubeAuditLogResumeState.ProtoReflect.Descriptor instead. +func (*KubeAuditLogResumeState) Descriptor() ([]byte, []int) { + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{48} +} + +func (x *KubeAuditLogResumeState) GetCursor() *KubeAuditLogCursor { + if x != nil { + return x.Cursor + } + return nil +} + // GitHubAuditLogStreamRequest represents a client message in the GitHubAuditLogStream, // containing either initial configuration or a batch of GitHub audit log events. type GitHubAuditLogStreamRequest struct { @@ -2836,7 +3374,7 @@ type GitHubAuditLogStreamRequest struct { func (x *GitHubAuditLogStreamRequest) Reset() { *x = GitHubAuditLogStreamRequest{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[42] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2848,7 +3386,7 @@ func (x *GitHubAuditLogStreamRequest) String() string { func (*GitHubAuditLogStreamRequest) ProtoMessage() {} func (x *GitHubAuditLogStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[42] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2861,7 +3399,7 @@ func (x *GitHubAuditLogStreamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GitHubAuditLogStreamRequest.ProtoReflect.Descriptor instead. func (*GitHubAuditLogStreamRequest) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{42} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{49} } func (x *GitHubAuditLogStreamRequest) GetOperation() isGitHubAuditLogStreamRequest_Operation { @@ -2923,7 +3461,7 @@ type GitHubAuditLogStreamResponse struct { func (x *GitHubAuditLogStreamResponse) Reset() { *x = GitHubAuditLogStreamResponse{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[43] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2935,7 +3473,7 @@ func (x *GitHubAuditLogStreamResponse) String() string { func (*GitHubAuditLogStreamResponse) ProtoMessage() {} func (x *GitHubAuditLogStreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[43] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2948,7 +3486,7 @@ func (x *GitHubAuditLogStreamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GitHubAuditLogStreamResponse.ProtoReflect.Descriptor instead. func (*GitHubAuditLogStreamResponse) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{43} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{50} } func (x *GitHubAuditLogStreamResponse) GetState() isGitHubAuditLogStreamResponse_State { @@ -3011,7 +3549,7 @@ type GitHubEventsStreamRequest struct { func (x *GitHubEventsStreamRequest) Reset() { *x = GitHubEventsStreamRequest{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[44] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3023,7 +3561,7 @@ func (x *GitHubEventsStreamRequest) String() string { func (*GitHubEventsStreamRequest) ProtoMessage() {} func (x *GitHubEventsStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[44] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3036,7 +3574,7 @@ func (x *GitHubEventsStreamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GitHubEventsStreamRequest.ProtoReflect.Descriptor instead. func (*GitHubEventsStreamRequest) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{44} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{51} } func (x *GitHubEventsStreamRequest) GetOperation() isGitHubEventsStreamRequest_Operation { @@ -3105,7 +3643,7 @@ type GitHubEventsStreamResponse struct { func (x *GitHubEventsStreamResponse) Reset() { *x = GitHubEventsStreamResponse{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[45] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3117,7 +3655,7 @@ func (x *GitHubEventsStreamResponse) String() string { func (*GitHubEventsStreamResponse) ProtoMessage() {} func (x *GitHubEventsStreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[45] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3130,7 +3668,7 @@ func (x *GitHubEventsStreamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GitHubEventsStreamResponse.ProtoReflect.Descriptor instead. func (*GitHubEventsStreamResponse) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{45} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{52} } // OktaAuditLogStreamRequest represents a client message in the OktaAuditLogStream, @@ -3148,7 +3686,7 @@ type OktaAuditLogStreamRequest struct { func (x *OktaAuditLogStreamRequest) Reset() { *x = OktaAuditLogStreamRequest{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[46] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3160,7 +3698,7 @@ func (x *OktaAuditLogStreamRequest) String() string { func (*OktaAuditLogStreamRequest) ProtoMessage() {} func (x *OktaAuditLogStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[46] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3173,7 +3711,7 @@ func (x *OktaAuditLogStreamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OktaAuditLogStreamRequest.ProtoReflect.Descriptor instead. func (*OktaAuditLogStreamRequest) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{46} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{53} } func (x *OktaAuditLogStreamRequest) GetOperation() isOktaAuditLogStreamRequest_Operation { @@ -3232,7 +3770,7 @@ type OktaAuditLogStreamResponse struct { func (x *OktaAuditLogStreamResponse) Reset() { *x = OktaAuditLogStreamResponse{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[47] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3244,7 +3782,7 @@ func (x *OktaAuditLogStreamResponse) String() string { func (*OktaAuditLogStreamResponse) ProtoMessage() {} func (x *OktaAuditLogStreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[47] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3257,7 +3795,7 @@ func (x *OktaAuditLogStreamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OktaAuditLogStreamResponse.ProtoReflect.Descriptor instead. func (*OktaAuditLogStreamResponse) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{47} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{54} } func (x *OktaAuditLogStreamResponse) GetState() isOktaAuditLogStreamResponse_State { @@ -3317,7 +3855,7 @@ type OktaEventsStreamRequest struct { func (x *OktaEventsStreamRequest) Reset() { *x = OktaEventsStreamRequest{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[48] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3329,7 +3867,7 @@ func (x *OktaEventsStreamRequest) String() string { func (*OktaEventsStreamRequest) ProtoMessage() {} func (x *OktaEventsStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[48] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3342,7 +3880,7 @@ func (x *OktaEventsStreamRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OktaEventsStreamRequest.ProtoReflect.Descriptor instead. func (*OktaEventsStreamRequest) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{48} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{55} } func (x *OktaEventsStreamRequest) GetOperation() isOktaEventsStreamRequest_Operation { @@ -3411,7 +3949,7 @@ type OktaEventsStreamResponse struct { func (x *OktaEventsStreamResponse) Reset() { *x = OktaEventsStreamResponse{} - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[49] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3423,7 +3961,7 @@ func (x *OktaEventsStreamResponse) String() string { func (*OktaEventsStreamResponse) ProtoMessage() {} func (x *OktaEventsStreamResponse) ProtoReflect() protoreflect.Message { - mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[49] + mi := &file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3436,14 +3974,14 @@ func (x *OktaEventsStreamResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use OktaEventsStreamResponse.ProtoReflect.Descriptor instead. func (*OktaEventsStreamResponse) Descriptor() ([]byte, []int) { - return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{49} + return file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP(), []int{56} } var File_accessgraph_v1alpha_access_graph_service_proto protoreflect.FileDescriptor const file_accessgraph_v1alpha_access_graph_service_proto_rawDesc = "" + "\n" + - ".accessgraph/v1alpha/access_graph_service.proto\x12\x13accessgraph.v1alpha\x1a\x1daccessgraph/v1alpha/aws.proto\x1a\x1faccessgraph/v1alpha/azure.proto\x1a\x1faccessgraph/v1alpha/entra.proto\x1a accessgraph/v1alpha/events.proto\x1a accessgraph/v1alpha/github.proto\x1a accessgraph/v1alpha/gitlab.proto\x1a\x1faccessgraph/v1alpha/graph.proto\x1a\x1faccessgraph/v1alpha/netiq.proto\x1a\x1eaccessgraph/v1alpha/okta.proto\x1a#accessgraph/v1alpha/resources.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a#teleport/auditlog/v1/auditlog.proto\"$\n" + + ".accessgraph/v1alpha/access_graph_service.proto\x12\x13accessgraph.v1alpha\x1a\x1daccessgraph/v1alpha/aws.proto\x1a\x1faccessgraph/v1alpha/azure.proto\x1a\x1faccessgraph/v1alpha/entra.proto\x1a accessgraph/v1alpha/events.proto\x1a accessgraph/v1alpha/github.proto\x1a accessgraph/v1alpha/gitlab.proto\x1a\x1faccessgraph/v1alpha/graph.proto\x1a\x1faccessgraph/v1alpha/netiq.proto\x1a\x1eaccessgraph/v1alpha/okta.proto\x1a#accessgraph/v1alpha/resources.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a#teleport/auditlog/v1/auditlog.proto\"$\n" + "\fQueryRequest\x12\x14\n" + "\x05query\x18\x01 \x01(\tR\x05query\"q\n" + "\rQueryResponse\x12/\n" + @@ -3572,7 +4110,35 @@ const file_accessgraph_v1alpha_access_graph_service_proto_rawDesc = "" + "\x18AWSCloudTrailResumeState\"D\n" + "\x1aAWSCloudTrailEventResource\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + - "\x04type\x18\x02 \x01(\tR\x04type\"\xaf\x01\n" + + "\x04type\x18\x02 \x01(\tR\x04type\"\xf8\x01\n" + + "\x19KubeAuditLogStreamRequest\x12A\n" + + "\x06config\x18\x01 \x01(\v2'.accessgraph.v1alpha.KubeAuditLogConfigH\x00R\x06config\x12K\n" + + "\n" + + "new_stream\x18\x02 \x01(\v2*.accessgraph.v1alpha.KubeAuditLogNewStreamH\x00R\tnewStream\x12A\n" + + "\x06events\x18\x03 \x01(\v2'.accessgraph.v1alpha.KubeAuditLogEventsH\x00R\x06eventsB\b\n" + + "\x06action\"\x14\n" + + "\x12KubeAuditLogConfig\"Z\n" + + "\x15KubeAuditLogNewStream\x12A\n" + + "\ainitial\x18\x01 \x01(\v2'.accessgraph.v1alpha.KubeAuditLogCursorR\ainitial\"\x86\x01\n" + + "\x12KubeAuditLogEvents\x12/\n" + + "\x06events\x18\x01 \x03(\v2\x17.google.protobuf.StructR\x06events\x12?\n" + + "\x06cursor\x18\x02 \x01(\v2'.accessgraph.v1alpha.KubeAuditLogCursorR\x06cursor\"\xc9\x02\n" + + "\x12KubeAuditLogCursor\x12Y\n" + + "\n" + + "log_source\x18\x01 \x01(\x0e2:.accessgraph.v1alpha.KubeAuditLogCursor.KubeAuditLogSourceR\tlogSource\x12\x1d\n" + + "\n" + + "cluster_id\x18\x02 \x01(\tR\tclusterId\x12\x19\n" + + "\bevent_id\x18\x03 \x01(\tR\aeventId\x12B\n" + + "\x0flast_event_time\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\rlastEventTime\"Z\n" + + "\x12KubeAuditLogSource\x12%\n" + + "!KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED\x10\x00\x12\x1d\n" + + "\x19KUBE_AUDIT_LOG_SOURCE_EKS\x10\x01\"\xbb\x01\n" + + "\x1aKubeAuditLogStreamResponse\x12A\n" + + "\x06config\x18\x01 \x01(\v2'.accessgraph.v1alpha.KubeAuditLogConfigH\x00R\x06config\x12Q\n" + + "\fresume_state\x18\x02 \x01(\v2,.accessgraph.v1alpha.KubeAuditLogResumeStateH\x00R\vresumeStateB\a\n" + + "\x05state\"Z\n" + + "\x17KubeAuditLogResumeState\x12?\n" + + "\x06cursor\x18\x01 \x01(\v2'.accessgraph.v1alpha.KubeAuditLogCursorR\x06cursor\"\xaf\x01\n" + "\x1bGitHubAuditLogStreamRequest\x12=\n" + "\x06config\x18\x01 \x01(\v2#.accessgraph.v1alpha.GitHubConfigV1H\x00R\x06config\x12D\n" + "\taudit_log\x18\x02 \x01(\v2%.accessgraph.v1alpha.GitHubAuditLogV1H\x00R\bauditLogB\v\n" + @@ -3600,14 +4166,15 @@ const file_accessgraph_v1alpha_access_graph_service_proto_rawDesc = "" + "\x06delete\x18\x02 \x01(\v2%.accessgraph.v1alpha.OktaResourceListH\x00R\x06delete\x123\n" + "\x04sync\x18\x03 \x01(\v2\x1d.accessgraph.v1alpha.OktaSyncH\x00R\x04syncB\v\n" + "\toperation\"\x1a\n" + - "\x18OktaEventsStreamResponse2\xf4\x0e\n" + + "\x18OktaEventsStreamResponse2\xef\x0f\n" + "\x12AccessGraphService\x12N\n" + "\x05Query\x12!.accessgraph.v1alpha.QueryRequest\x1a\".accessgraph.v1alpha.QueryResponse\x12T\n" + "\aGetFile\x12#.accessgraph.v1alpha.GetFileRequest\x1a$.accessgraph.v1alpha.GetFileResponse\x12e\n" + "\fEventsStream\x12(.accessgraph.v1alpha.EventsStreamRequest\x1a).accessgraph.v1alpha.EventsStreamResponse(\x01\x12m\n" + "\x0eEventsStreamV2\x12*.accessgraph.v1alpha.EventsStreamV2Request\x1a+.accessgraph.v1alpha.EventsStreamV2Response(\x010\x01\x12m\n" + "\x0eAuditLogStream\x12*.accessgraph.v1alpha.AuditLogStreamRequest\x1a+.accessgraph.v1alpha.AuditLogStreamResponse(\x010\x01\x12|\n" + - "\x13AWSCloudTrailStream\x12/.accessgraph.v1alpha.AWSCloudTrailStreamRequest\x1a0.accessgraph.v1alpha.AWSCloudTrailStreamResponse(\x010\x01\x12W\n" + + "\x13AWSCloudTrailStream\x12/.accessgraph.v1alpha.AWSCloudTrailStreamRequest\x1a0.accessgraph.v1alpha.AWSCloudTrailStreamResponse(\x010\x01\x12y\n" + + "\x12KubeAuditLogStream\x12..accessgraph.v1alpha.KubeAuditLogStreamRequest\x1a/.accessgraph.v1alpha.KubeAuditLogStreamResponse(\x010\x01\x12W\n" + "\bRegister\x12$.accessgraph.v1alpha.RegisterRequest\x1a%.accessgraph.v1alpha.RegisterResponse\x12]\n" + "\n" + "ReplaceCAs\x12&.accessgraph.v1alpha.ReplaceCAsRequest\x1a'.accessgraph.v1alpha.ReplaceCAsResponse\x12n\n" + @@ -3633,191 +4200,214 @@ func file_accessgraph_v1alpha_access_graph_service_proto_rawDescGZIP() []byte { return file_accessgraph_v1alpha_access_graph_service_proto_rawDescData } -var file_accessgraph_v1alpha_access_graph_service_proto_msgTypes = make([]protoimpl.MessageInfo, 51) +var file_accessgraph_v1alpha_access_graph_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_accessgraph_v1alpha_access_graph_service_proto_msgTypes = make([]protoimpl.MessageInfo, 58) var file_accessgraph_v1alpha_access_graph_service_proto_goTypes = []any{ - (*QueryRequest)(nil), // 0: accessgraph.v1alpha.QueryRequest - (*QueryResponse)(nil), // 1: accessgraph.v1alpha.QueryResponse - (*GetFileRequest)(nil), // 2: accessgraph.v1alpha.GetFileRequest - (*GetFileResponse)(nil), // 3: accessgraph.v1alpha.GetFileResponse - (*EventsStreamRequest)(nil), // 4: accessgraph.v1alpha.EventsStreamRequest - (*EventsStreamV2Request)(nil), // 5: accessgraph.v1alpha.EventsStreamV2Request - (*SyncOperation)(nil), // 6: accessgraph.v1alpha.SyncOperation - (*EventsStreamResponse)(nil), // 7: accessgraph.v1alpha.EventsStreamResponse - (*EventsStreamV2Response)(nil), // 8: accessgraph.v1alpha.EventsStreamV2Response - (*AuditEvent)(nil), // 9: accessgraph.v1alpha.AuditEvent - (*AuditLogStreamRequest)(nil), // 10: accessgraph.v1alpha.AuditLogStreamRequest - (*AuditLogConfig)(nil), // 11: accessgraph.v1alpha.AuditLogConfig - (*AuditLogEvents)(nil), // 12: accessgraph.v1alpha.AuditLogEvents - (*SearchResumeState)(nil), // 13: accessgraph.v1alpha.SearchResumeState - (*BulkResumeStateUpdate)(nil), // 14: accessgraph.v1alpha.BulkResumeStateUpdate - (*BulkResumeStateSync)(nil), // 15: accessgraph.v1alpha.BulkResumeStateSync - (*AuditLogStreamResponse)(nil), // 16: accessgraph.v1alpha.AuditLogStreamResponse - (*BulkResumeState)(nil), // 17: accessgraph.v1alpha.BulkResumeState - (*BulkResumeDate)(nil), // 18: accessgraph.v1alpha.BulkResumeDate - (*RegisterRequest)(nil), // 19: accessgraph.v1alpha.RegisterRequest - (*RegisterResponse)(nil), // 20: accessgraph.v1alpha.RegisterResponse - (*ReplaceCAsRequest)(nil), // 21: accessgraph.v1alpha.ReplaceCAsRequest - (*ReplaceCAsResponse)(nil), // 22: accessgraph.v1alpha.ReplaceCAsResponse - (*AWSEventsStreamRequest)(nil), // 23: accessgraph.v1alpha.AWSEventsStreamRequest - (*AWSSyncOperation)(nil), // 24: accessgraph.v1alpha.AWSSyncOperation - (*AWSEventsStreamResponse)(nil), // 25: accessgraph.v1alpha.AWSEventsStreamResponse - (*GitlabEventsStreamRequest)(nil), // 26: accessgraph.v1alpha.GitlabEventsStreamRequest - (*GitlabEventsStreamResponse)(nil), // 27: accessgraph.v1alpha.GitlabEventsStreamResponse - (*EntraEventsStreamRequest)(nil), // 28: accessgraph.v1alpha.EntraEventsStreamRequest - (*EntraEventsStreamResponse)(nil), // 29: accessgraph.v1alpha.EntraEventsStreamResponse - (*AzureEventsStreamRequest)(nil), // 30: accessgraph.v1alpha.AzureEventsStreamRequest - (*AzureSyncOperation)(nil), // 31: accessgraph.v1alpha.AzureSyncOperation - (*AzureEventsStreamResponse)(nil), // 32: accessgraph.v1alpha.AzureEventsStreamResponse - (*NetIQEventsStreamRequest)(nil), // 33: accessgraph.v1alpha.NetIQEventsStreamRequest - (*NetIQSyncOperation)(nil), // 34: accessgraph.v1alpha.NetIQSyncOperation - (*NetIQEventsStreamResponse)(nil), // 35: accessgraph.v1alpha.NetIQEventsStreamResponse - (*AWSCloudTrailStreamRequest)(nil), // 36: accessgraph.v1alpha.AWSCloudTrailStreamRequest - (*AWSCloudTrailEventsFile)(nil), // 37: accessgraph.v1alpha.AWSCloudTrailEventsFile - (*AWSCloudTrailConfig)(nil), // 38: accessgraph.v1alpha.AWSCloudTrailConfig - (*AWSCloudTrailStreamResponse)(nil), // 39: accessgraph.v1alpha.AWSCloudTrailStreamResponse - (*AWSCloudTrailResumeState)(nil), // 40: accessgraph.v1alpha.AWSCloudTrailResumeState - (*AWSCloudTrailEventResource)(nil), // 41: accessgraph.v1alpha.AWSCloudTrailEventResource - (*GitHubAuditLogStreamRequest)(nil), // 42: accessgraph.v1alpha.GitHubAuditLogStreamRequest - (*GitHubAuditLogStreamResponse)(nil), // 43: accessgraph.v1alpha.GitHubAuditLogStreamResponse - (*GitHubEventsStreamRequest)(nil), // 44: accessgraph.v1alpha.GitHubEventsStreamRequest - (*GitHubEventsStreamResponse)(nil), // 45: accessgraph.v1alpha.GitHubEventsStreamResponse - (*OktaAuditLogStreamRequest)(nil), // 46: accessgraph.v1alpha.OktaAuditLogStreamRequest - (*OktaAuditLogStreamResponse)(nil), // 47: accessgraph.v1alpha.OktaAuditLogStreamResponse - (*OktaEventsStreamRequest)(nil), // 48: accessgraph.v1alpha.OktaEventsStreamRequest - (*OktaEventsStreamResponse)(nil), // 49: accessgraph.v1alpha.OktaEventsStreamResponse - nil, // 50: accessgraph.v1alpha.BulkResumeDate.ChunkCursorsEntry - (*Node)(nil), // 51: accessgraph.v1alpha.Node - (*Edge)(nil), // 52: accessgraph.v1alpha.Edge - (*ResourceList)(nil), // 53: accessgraph.v1alpha.ResourceList - (*ResourceHeaderList)(nil), // 54: accessgraph.v1alpha.ResourceHeaderList - (*AccessListsMembers)(nil), // 55: accessgraph.v1alpha.AccessListsMembers - (*ExcludeAccessListsMembers)(nil), // 56: accessgraph.v1alpha.ExcludeAccessListsMembers - (*AccessPathChanged)(nil), // 57: accessgraph.v1alpha.AccessPathChanged - (*timestamppb.Timestamp)(nil), // 58: google.protobuf.Timestamp - (*v1.EventUnstructured)(nil), // 59: teleport.auditlog.v1.EventUnstructured - (*emptypb.Empty)(nil), // 60: google.protobuf.Empty - (*AWSResourceList)(nil), // 61: accessgraph.v1alpha.AWSResourceList - (*GitlabSyncOperation)(nil), // 62: accessgraph.v1alpha.GitlabSyncOperation - (*GitlabResourceList)(nil), // 63: accessgraph.v1alpha.GitlabResourceList - (*EntraSyncOperation)(nil), // 64: accessgraph.v1alpha.EntraSyncOperation - (*EntraResourceList)(nil), // 65: accessgraph.v1alpha.EntraResourceList - (*AzureResourceList)(nil), // 66: accessgraph.v1alpha.AzureResourceList - (*NetIQResourceList)(nil), // 67: accessgraph.v1alpha.NetIQResourceList - (*GitHubConfigV1)(nil), // 68: accessgraph.v1alpha.GitHubConfigV1 - (*GitHubAuditLogV1)(nil), // 69: accessgraph.v1alpha.GitHubAuditLogV1 - (*GitHubAuditLogV1Cursor)(nil), // 70: accessgraph.v1alpha.GitHubAuditLogV1Cursor - (*GithubResourceList)(nil), // 71: accessgraph.v1alpha.GithubResourceList - (*GithubSync)(nil), // 72: accessgraph.v1alpha.GithubSync - (*OktaConfigV1)(nil), // 73: accessgraph.v1alpha.OktaConfigV1 - (*OktaAuditLogV1)(nil), // 74: accessgraph.v1alpha.OktaAuditLogV1 - (*OktaAuditLogV1Cursor)(nil), // 75: accessgraph.v1alpha.OktaAuditLogV1Cursor - (*OktaResourceList)(nil), // 76: accessgraph.v1alpha.OktaResourceList - (*OktaSync)(nil), // 77: accessgraph.v1alpha.OktaSync + (KubeAuditLogCursor_KubeAuditLogSource)(0), // 0: accessgraph.v1alpha.KubeAuditLogCursor.KubeAuditLogSource + (*QueryRequest)(nil), // 1: accessgraph.v1alpha.QueryRequest + (*QueryResponse)(nil), // 2: accessgraph.v1alpha.QueryResponse + (*GetFileRequest)(nil), // 3: accessgraph.v1alpha.GetFileRequest + (*GetFileResponse)(nil), // 4: accessgraph.v1alpha.GetFileResponse + (*EventsStreamRequest)(nil), // 5: accessgraph.v1alpha.EventsStreamRequest + (*EventsStreamV2Request)(nil), // 6: accessgraph.v1alpha.EventsStreamV2Request + (*SyncOperation)(nil), // 7: accessgraph.v1alpha.SyncOperation + (*EventsStreamResponse)(nil), // 8: accessgraph.v1alpha.EventsStreamResponse + (*EventsStreamV2Response)(nil), // 9: accessgraph.v1alpha.EventsStreamV2Response + (*AuditEvent)(nil), // 10: accessgraph.v1alpha.AuditEvent + (*AuditLogStreamRequest)(nil), // 11: accessgraph.v1alpha.AuditLogStreamRequest + (*AuditLogConfig)(nil), // 12: accessgraph.v1alpha.AuditLogConfig + (*AuditLogEvents)(nil), // 13: accessgraph.v1alpha.AuditLogEvents + (*SearchResumeState)(nil), // 14: accessgraph.v1alpha.SearchResumeState + (*BulkResumeStateUpdate)(nil), // 15: accessgraph.v1alpha.BulkResumeStateUpdate + (*BulkResumeStateSync)(nil), // 16: accessgraph.v1alpha.BulkResumeStateSync + (*AuditLogStreamResponse)(nil), // 17: accessgraph.v1alpha.AuditLogStreamResponse + (*BulkResumeState)(nil), // 18: accessgraph.v1alpha.BulkResumeState + (*BulkResumeDate)(nil), // 19: accessgraph.v1alpha.BulkResumeDate + (*RegisterRequest)(nil), // 20: accessgraph.v1alpha.RegisterRequest + (*RegisterResponse)(nil), // 21: accessgraph.v1alpha.RegisterResponse + (*ReplaceCAsRequest)(nil), // 22: accessgraph.v1alpha.ReplaceCAsRequest + (*ReplaceCAsResponse)(nil), // 23: accessgraph.v1alpha.ReplaceCAsResponse + (*AWSEventsStreamRequest)(nil), // 24: accessgraph.v1alpha.AWSEventsStreamRequest + (*AWSSyncOperation)(nil), // 25: accessgraph.v1alpha.AWSSyncOperation + (*AWSEventsStreamResponse)(nil), // 26: accessgraph.v1alpha.AWSEventsStreamResponse + (*GitlabEventsStreamRequest)(nil), // 27: accessgraph.v1alpha.GitlabEventsStreamRequest + (*GitlabEventsStreamResponse)(nil), // 28: accessgraph.v1alpha.GitlabEventsStreamResponse + (*EntraEventsStreamRequest)(nil), // 29: accessgraph.v1alpha.EntraEventsStreamRequest + (*EntraEventsStreamResponse)(nil), // 30: accessgraph.v1alpha.EntraEventsStreamResponse + (*AzureEventsStreamRequest)(nil), // 31: accessgraph.v1alpha.AzureEventsStreamRequest + (*AzureSyncOperation)(nil), // 32: accessgraph.v1alpha.AzureSyncOperation + (*AzureEventsStreamResponse)(nil), // 33: accessgraph.v1alpha.AzureEventsStreamResponse + (*NetIQEventsStreamRequest)(nil), // 34: accessgraph.v1alpha.NetIQEventsStreamRequest + (*NetIQSyncOperation)(nil), // 35: accessgraph.v1alpha.NetIQSyncOperation + (*NetIQEventsStreamResponse)(nil), // 36: accessgraph.v1alpha.NetIQEventsStreamResponse + (*AWSCloudTrailStreamRequest)(nil), // 37: accessgraph.v1alpha.AWSCloudTrailStreamRequest + (*AWSCloudTrailEventsFile)(nil), // 38: accessgraph.v1alpha.AWSCloudTrailEventsFile + (*AWSCloudTrailConfig)(nil), // 39: accessgraph.v1alpha.AWSCloudTrailConfig + (*AWSCloudTrailStreamResponse)(nil), // 40: accessgraph.v1alpha.AWSCloudTrailStreamResponse + (*AWSCloudTrailResumeState)(nil), // 41: accessgraph.v1alpha.AWSCloudTrailResumeState + (*AWSCloudTrailEventResource)(nil), // 42: accessgraph.v1alpha.AWSCloudTrailEventResource + (*KubeAuditLogStreamRequest)(nil), // 43: accessgraph.v1alpha.KubeAuditLogStreamRequest + (*KubeAuditLogConfig)(nil), // 44: accessgraph.v1alpha.KubeAuditLogConfig + (*KubeAuditLogNewStream)(nil), // 45: accessgraph.v1alpha.KubeAuditLogNewStream + (*KubeAuditLogEvents)(nil), // 46: accessgraph.v1alpha.KubeAuditLogEvents + (*KubeAuditLogCursor)(nil), // 47: accessgraph.v1alpha.KubeAuditLogCursor + (*KubeAuditLogStreamResponse)(nil), // 48: accessgraph.v1alpha.KubeAuditLogStreamResponse + (*KubeAuditLogResumeState)(nil), // 49: accessgraph.v1alpha.KubeAuditLogResumeState + (*GitHubAuditLogStreamRequest)(nil), // 50: accessgraph.v1alpha.GitHubAuditLogStreamRequest + (*GitHubAuditLogStreamResponse)(nil), // 51: accessgraph.v1alpha.GitHubAuditLogStreamResponse + (*GitHubEventsStreamRequest)(nil), // 52: accessgraph.v1alpha.GitHubEventsStreamRequest + (*GitHubEventsStreamResponse)(nil), // 53: accessgraph.v1alpha.GitHubEventsStreamResponse + (*OktaAuditLogStreamRequest)(nil), // 54: accessgraph.v1alpha.OktaAuditLogStreamRequest + (*OktaAuditLogStreamResponse)(nil), // 55: accessgraph.v1alpha.OktaAuditLogStreamResponse + (*OktaEventsStreamRequest)(nil), // 56: accessgraph.v1alpha.OktaEventsStreamRequest + (*OktaEventsStreamResponse)(nil), // 57: accessgraph.v1alpha.OktaEventsStreamResponse + nil, // 58: accessgraph.v1alpha.BulkResumeDate.ChunkCursorsEntry + (*Node)(nil), // 59: accessgraph.v1alpha.Node + (*Edge)(nil), // 60: accessgraph.v1alpha.Edge + (*ResourceList)(nil), // 61: accessgraph.v1alpha.ResourceList + (*ResourceHeaderList)(nil), // 62: accessgraph.v1alpha.ResourceHeaderList + (*AccessListsMembers)(nil), // 63: accessgraph.v1alpha.AccessListsMembers + (*ExcludeAccessListsMembers)(nil), // 64: accessgraph.v1alpha.ExcludeAccessListsMembers + (*AccessPathChanged)(nil), // 65: accessgraph.v1alpha.AccessPathChanged + (*timestamppb.Timestamp)(nil), // 66: google.protobuf.Timestamp + (*v1.EventUnstructured)(nil), // 67: teleport.auditlog.v1.EventUnstructured + (*emptypb.Empty)(nil), // 68: google.protobuf.Empty + (*AWSResourceList)(nil), // 69: accessgraph.v1alpha.AWSResourceList + (*GitlabSyncOperation)(nil), // 70: accessgraph.v1alpha.GitlabSyncOperation + (*GitlabResourceList)(nil), // 71: accessgraph.v1alpha.GitlabResourceList + (*EntraSyncOperation)(nil), // 72: accessgraph.v1alpha.EntraSyncOperation + (*EntraResourceList)(nil), // 73: accessgraph.v1alpha.EntraResourceList + (*AzureResourceList)(nil), // 74: accessgraph.v1alpha.AzureResourceList + (*NetIQResourceList)(nil), // 75: accessgraph.v1alpha.NetIQResourceList + (*structpb.Struct)(nil), // 76: google.protobuf.Struct + (*GitHubConfigV1)(nil), // 77: accessgraph.v1alpha.GitHubConfigV1 + (*GitHubAuditLogV1)(nil), // 78: accessgraph.v1alpha.GitHubAuditLogV1 + (*GitHubAuditLogV1Cursor)(nil), // 79: accessgraph.v1alpha.GitHubAuditLogV1Cursor + (*GithubResourceList)(nil), // 80: accessgraph.v1alpha.GithubResourceList + (*GithubSync)(nil), // 81: accessgraph.v1alpha.GithubSync + (*OktaConfigV1)(nil), // 82: accessgraph.v1alpha.OktaConfigV1 + (*OktaAuditLogV1)(nil), // 83: accessgraph.v1alpha.OktaAuditLogV1 + (*OktaAuditLogV1Cursor)(nil), // 84: accessgraph.v1alpha.OktaAuditLogV1Cursor + (*OktaResourceList)(nil), // 85: accessgraph.v1alpha.OktaResourceList + (*OktaSync)(nil), // 86: accessgraph.v1alpha.OktaSync } var file_accessgraph_v1alpha_access_graph_service_proto_depIdxs = []int32{ - 51, // 0: accessgraph.v1alpha.QueryResponse.nodes:type_name -> accessgraph.v1alpha.Node - 52, // 1: accessgraph.v1alpha.QueryResponse.edges:type_name -> accessgraph.v1alpha.Edge - 6, // 2: accessgraph.v1alpha.EventsStreamRequest.sync:type_name -> accessgraph.v1alpha.SyncOperation - 53, // 3: accessgraph.v1alpha.EventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.ResourceList - 54, // 4: accessgraph.v1alpha.EventsStreamRequest.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList - 55, // 5: accessgraph.v1alpha.EventsStreamRequest.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers - 56, // 6: accessgraph.v1alpha.EventsStreamRequest.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers - 6, // 7: accessgraph.v1alpha.EventsStreamV2Request.sync:type_name -> accessgraph.v1alpha.SyncOperation - 53, // 8: accessgraph.v1alpha.EventsStreamV2Request.upsert:type_name -> accessgraph.v1alpha.ResourceList - 54, // 9: accessgraph.v1alpha.EventsStreamV2Request.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList - 55, // 10: accessgraph.v1alpha.EventsStreamV2Request.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers - 56, // 11: accessgraph.v1alpha.EventsStreamV2Request.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers - 9, // 12: accessgraph.v1alpha.EventsStreamV2Response.event:type_name -> accessgraph.v1alpha.AuditEvent - 57, // 13: accessgraph.v1alpha.AuditEvent.access_path_changed:type_name -> accessgraph.v1alpha.AccessPathChanged - 11, // 14: accessgraph.v1alpha.AuditLogStreamRequest.config:type_name -> accessgraph.v1alpha.AuditLogConfig - 12, // 15: accessgraph.v1alpha.AuditLogStreamRequest.events:type_name -> accessgraph.v1alpha.AuditLogEvents - 15, // 16: accessgraph.v1alpha.AuditLogStreamRequest.bulk_sync:type_name -> accessgraph.v1alpha.BulkResumeStateSync - 58, // 17: accessgraph.v1alpha.AuditLogConfig.start_date:type_name -> google.protobuf.Timestamp - 59, // 18: accessgraph.v1alpha.AuditLogEvents.events:type_name -> teleport.auditlog.v1.EventUnstructured - 13, // 19: accessgraph.v1alpha.AuditLogEvents.search_resume_state:type_name -> accessgraph.v1alpha.SearchResumeState - 14, // 20: accessgraph.v1alpha.AuditLogEvents.bulk_resume_state_update:type_name -> accessgraph.v1alpha.BulkResumeStateUpdate - 58, // 21: accessgraph.v1alpha.SearchResumeState.last_event_time:type_name -> google.protobuf.Timestamp - 58, // 22: accessgraph.v1alpha.BulkResumeStateUpdate.date:type_name -> google.protobuf.Timestamp - 58, // 23: accessgraph.v1alpha.BulkResumeStateSync.active_dates:type_name -> google.protobuf.Timestamp - 11, // 24: accessgraph.v1alpha.AuditLogStreamResponse.audit_log_config:type_name -> accessgraph.v1alpha.AuditLogConfig - 60, // 25: accessgraph.v1alpha.AuditLogStreamResponse.no_resume_state:type_name -> google.protobuf.Empty - 13, // 26: accessgraph.v1alpha.AuditLogStreamResponse.search_resume_state:type_name -> accessgraph.v1alpha.SearchResumeState - 17, // 27: accessgraph.v1alpha.AuditLogStreamResponse.bulk_resume_state:type_name -> accessgraph.v1alpha.BulkResumeState - 18, // 28: accessgraph.v1alpha.BulkResumeState.dates:type_name -> accessgraph.v1alpha.BulkResumeDate - 58, // 29: accessgraph.v1alpha.BulkResumeDate.date:type_name -> google.protobuf.Timestamp - 50, // 30: accessgraph.v1alpha.BulkResumeDate.chunk_cursors:type_name -> accessgraph.v1alpha.BulkResumeDate.ChunkCursorsEntry - 24, // 31: accessgraph.v1alpha.AWSEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.AWSSyncOperation - 61, // 32: accessgraph.v1alpha.AWSEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.AWSResourceList - 61, // 33: accessgraph.v1alpha.AWSEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.AWSResourceList - 62, // 34: accessgraph.v1alpha.GitlabEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.GitlabSyncOperation - 63, // 35: accessgraph.v1alpha.GitlabEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.GitlabResourceList - 63, // 36: accessgraph.v1alpha.GitlabEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.GitlabResourceList - 64, // 37: accessgraph.v1alpha.EntraEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.EntraSyncOperation - 65, // 38: accessgraph.v1alpha.EntraEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.EntraResourceList - 65, // 39: accessgraph.v1alpha.EntraEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.EntraResourceList - 31, // 40: accessgraph.v1alpha.AzureEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.AzureSyncOperation - 66, // 41: accessgraph.v1alpha.AzureEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.AzureResourceList - 66, // 42: accessgraph.v1alpha.AzureEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.AzureResourceList - 34, // 43: accessgraph.v1alpha.NetIQEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.NetIQSyncOperation - 67, // 44: accessgraph.v1alpha.NetIQEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.NetIQResourceList - 67, // 45: accessgraph.v1alpha.NetIQEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.NetIQResourceList - 38, // 46: accessgraph.v1alpha.AWSCloudTrailStreamRequest.config:type_name -> accessgraph.v1alpha.AWSCloudTrailConfig - 37, // 47: accessgraph.v1alpha.AWSCloudTrailStreamRequest.events_file:type_name -> accessgraph.v1alpha.AWSCloudTrailEventsFile - 38, // 48: accessgraph.v1alpha.AWSCloudTrailStreamResponse.cloud_trail_config:type_name -> accessgraph.v1alpha.AWSCloudTrailConfig - 40, // 49: accessgraph.v1alpha.AWSCloudTrailStreamResponse.resume_state:type_name -> accessgraph.v1alpha.AWSCloudTrailResumeState - 68, // 50: accessgraph.v1alpha.GitHubAuditLogStreamRequest.config:type_name -> accessgraph.v1alpha.GitHubConfigV1 - 69, // 51: accessgraph.v1alpha.GitHubAuditLogStreamRequest.audit_log:type_name -> accessgraph.v1alpha.GitHubAuditLogV1 - 68, // 52: accessgraph.v1alpha.GitHubAuditLogStreamResponse.github_config:type_name -> accessgraph.v1alpha.GitHubConfigV1 - 70, // 53: accessgraph.v1alpha.GitHubAuditLogStreamResponse.audit_log_resume_state:type_name -> accessgraph.v1alpha.GitHubAuditLogV1Cursor - 71, // 54: accessgraph.v1alpha.GitHubEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.GithubResourceList - 71, // 55: accessgraph.v1alpha.GitHubEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.GithubResourceList - 72, // 56: accessgraph.v1alpha.GitHubEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.GithubSync - 73, // 57: accessgraph.v1alpha.OktaAuditLogStreamRequest.config:type_name -> accessgraph.v1alpha.OktaConfigV1 - 74, // 58: accessgraph.v1alpha.OktaAuditLogStreamRequest.audit_log:type_name -> accessgraph.v1alpha.OktaAuditLogV1 - 73, // 59: accessgraph.v1alpha.OktaAuditLogStreamResponse.config:type_name -> accessgraph.v1alpha.OktaConfigV1 - 75, // 60: accessgraph.v1alpha.OktaAuditLogStreamResponse.audit_log_resume_state:type_name -> accessgraph.v1alpha.OktaAuditLogV1Cursor - 76, // 61: accessgraph.v1alpha.OktaEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.OktaResourceList - 76, // 62: accessgraph.v1alpha.OktaEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.OktaResourceList - 77, // 63: accessgraph.v1alpha.OktaEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.OktaSync - 0, // 64: accessgraph.v1alpha.AccessGraphService.Query:input_type -> accessgraph.v1alpha.QueryRequest - 2, // 65: accessgraph.v1alpha.AccessGraphService.GetFile:input_type -> accessgraph.v1alpha.GetFileRequest - 4, // 66: accessgraph.v1alpha.AccessGraphService.EventsStream:input_type -> accessgraph.v1alpha.EventsStreamRequest - 5, // 67: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:input_type -> accessgraph.v1alpha.EventsStreamV2Request - 10, // 68: accessgraph.v1alpha.AccessGraphService.AuditLogStream:input_type -> accessgraph.v1alpha.AuditLogStreamRequest - 36, // 69: accessgraph.v1alpha.AccessGraphService.AWSCloudTrailStream:input_type -> accessgraph.v1alpha.AWSCloudTrailStreamRequest - 19, // 70: accessgraph.v1alpha.AccessGraphService.Register:input_type -> accessgraph.v1alpha.RegisterRequest - 21, // 71: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:input_type -> accessgraph.v1alpha.ReplaceCAsRequest - 23, // 72: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:input_type -> accessgraph.v1alpha.AWSEventsStreamRequest - 26, // 73: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:input_type -> accessgraph.v1alpha.GitlabEventsStreamRequest - 28, // 74: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:input_type -> accessgraph.v1alpha.EntraEventsStreamRequest - 30, // 75: accessgraph.v1alpha.AccessGraphService.AzureEventsStream:input_type -> accessgraph.v1alpha.AzureEventsStreamRequest - 33, // 76: accessgraph.v1alpha.AccessGraphService.NetIQEventsStream:input_type -> accessgraph.v1alpha.NetIQEventsStreamRequest - 42, // 77: accessgraph.v1alpha.AccessGraphService.GitHubAuditLogStream:input_type -> accessgraph.v1alpha.GitHubAuditLogStreamRequest - 44, // 78: accessgraph.v1alpha.AccessGraphService.GitHubEventsStream:input_type -> accessgraph.v1alpha.GitHubEventsStreamRequest - 46, // 79: accessgraph.v1alpha.AccessGraphService.OktaAuditLogStream:input_type -> accessgraph.v1alpha.OktaAuditLogStreamRequest - 48, // 80: accessgraph.v1alpha.AccessGraphService.OktaEventsStream:input_type -> accessgraph.v1alpha.OktaEventsStreamRequest - 1, // 81: accessgraph.v1alpha.AccessGraphService.Query:output_type -> accessgraph.v1alpha.QueryResponse - 3, // 82: accessgraph.v1alpha.AccessGraphService.GetFile:output_type -> accessgraph.v1alpha.GetFileResponse - 7, // 83: accessgraph.v1alpha.AccessGraphService.EventsStream:output_type -> accessgraph.v1alpha.EventsStreamResponse - 8, // 84: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:output_type -> accessgraph.v1alpha.EventsStreamV2Response - 16, // 85: accessgraph.v1alpha.AccessGraphService.AuditLogStream:output_type -> accessgraph.v1alpha.AuditLogStreamResponse - 39, // 86: accessgraph.v1alpha.AccessGraphService.AWSCloudTrailStream:output_type -> accessgraph.v1alpha.AWSCloudTrailStreamResponse - 20, // 87: accessgraph.v1alpha.AccessGraphService.Register:output_type -> accessgraph.v1alpha.RegisterResponse - 22, // 88: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:output_type -> accessgraph.v1alpha.ReplaceCAsResponse - 25, // 89: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:output_type -> accessgraph.v1alpha.AWSEventsStreamResponse - 27, // 90: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:output_type -> accessgraph.v1alpha.GitlabEventsStreamResponse - 29, // 91: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:output_type -> accessgraph.v1alpha.EntraEventsStreamResponse - 32, // 92: accessgraph.v1alpha.AccessGraphService.AzureEventsStream:output_type -> accessgraph.v1alpha.AzureEventsStreamResponse - 35, // 93: accessgraph.v1alpha.AccessGraphService.NetIQEventsStream:output_type -> accessgraph.v1alpha.NetIQEventsStreamResponse - 43, // 94: accessgraph.v1alpha.AccessGraphService.GitHubAuditLogStream:output_type -> accessgraph.v1alpha.GitHubAuditLogStreamResponse - 45, // 95: accessgraph.v1alpha.AccessGraphService.GitHubEventsStream:output_type -> accessgraph.v1alpha.GitHubEventsStreamResponse - 47, // 96: accessgraph.v1alpha.AccessGraphService.OktaAuditLogStream:output_type -> accessgraph.v1alpha.OktaAuditLogStreamResponse - 49, // 97: accessgraph.v1alpha.AccessGraphService.OktaEventsStream:output_type -> accessgraph.v1alpha.OktaEventsStreamResponse - 81, // [81:98] is the sub-list for method output_type - 64, // [64:81] is the sub-list for method input_type - 64, // [64:64] is the sub-list for extension type_name - 64, // [64:64] is the sub-list for extension extendee - 0, // [0:64] is the sub-list for field type_name + 59, // 0: accessgraph.v1alpha.QueryResponse.nodes:type_name -> accessgraph.v1alpha.Node + 60, // 1: accessgraph.v1alpha.QueryResponse.edges:type_name -> accessgraph.v1alpha.Edge + 7, // 2: accessgraph.v1alpha.EventsStreamRequest.sync:type_name -> accessgraph.v1alpha.SyncOperation + 61, // 3: accessgraph.v1alpha.EventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.ResourceList + 62, // 4: accessgraph.v1alpha.EventsStreamRequest.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList + 63, // 5: accessgraph.v1alpha.EventsStreamRequest.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers + 64, // 6: accessgraph.v1alpha.EventsStreamRequest.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers + 7, // 7: accessgraph.v1alpha.EventsStreamV2Request.sync:type_name -> accessgraph.v1alpha.SyncOperation + 61, // 8: accessgraph.v1alpha.EventsStreamV2Request.upsert:type_name -> accessgraph.v1alpha.ResourceList + 62, // 9: accessgraph.v1alpha.EventsStreamV2Request.delete:type_name -> accessgraph.v1alpha.ResourceHeaderList + 63, // 10: accessgraph.v1alpha.EventsStreamV2Request.access_lists_members:type_name -> accessgraph.v1alpha.AccessListsMembers + 64, // 11: accessgraph.v1alpha.EventsStreamV2Request.exclude_access_list_members:type_name -> accessgraph.v1alpha.ExcludeAccessListsMembers + 10, // 12: accessgraph.v1alpha.EventsStreamV2Response.event:type_name -> accessgraph.v1alpha.AuditEvent + 65, // 13: accessgraph.v1alpha.AuditEvent.access_path_changed:type_name -> accessgraph.v1alpha.AccessPathChanged + 12, // 14: accessgraph.v1alpha.AuditLogStreamRequest.config:type_name -> accessgraph.v1alpha.AuditLogConfig + 13, // 15: accessgraph.v1alpha.AuditLogStreamRequest.events:type_name -> accessgraph.v1alpha.AuditLogEvents + 16, // 16: accessgraph.v1alpha.AuditLogStreamRequest.bulk_sync:type_name -> accessgraph.v1alpha.BulkResumeStateSync + 66, // 17: accessgraph.v1alpha.AuditLogConfig.start_date:type_name -> google.protobuf.Timestamp + 67, // 18: accessgraph.v1alpha.AuditLogEvents.events:type_name -> teleport.auditlog.v1.EventUnstructured + 14, // 19: accessgraph.v1alpha.AuditLogEvents.search_resume_state:type_name -> accessgraph.v1alpha.SearchResumeState + 15, // 20: accessgraph.v1alpha.AuditLogEvents.bulk_resume_state_update:type_name -> accessgraph.v1alpha.BulkResumeStateUpdate + 66, // 21: accessgraph.v1alpha.SearchResumeState.last_event_time:type_name -> google.protobuf.Timestamp + 66, // 22: accessgraph.v1alpha.BulkResumeStateUpdate.date:type_name -> google.protobuf.Timestamp + 66, // 23: accessgraph.v1alpha.BulkResumeStateSync.active_dates:type_name -> google.protobuf.Timestamp + 12, // 24: accessgraph.v1alpha.AuditLogStreamResponse.audit_log_config:type_name -> accessgraph.v1alpha.AuditLogConfig + 68, // 25: accessgraph.v1alpha.AuditLogStreamResponse.no_resume_state:type_name -> google.protobuf.Empty + 14, // 26: accessgraph.v1alpha.AuditLogStreamResponse.search_resume_state:type_name -> accessgraph.v1alpha.SearchResumeState + 18, // 27: accessgraph.v1alpha.AuditLogStreamResponse.bulk_resume_state:type_name -> accessgraph.v1alpha.BulkResumeState + 19, // 28: accessgraph.v1alpha.BulkResumeState.dates:type_name -> accessgraph.v1alpha.BulkResumeDate + 66, // 29: accessgraph.v1alpha.BulkResumeDate.date:type_name -> google.protobuf.Timestamp + 58, // 30: accessgraph.v1alpha.BulkResumeDate.chunk_cursors:type_name -> accessgraph.v1alpha.BulkResumeDate.ChunkCursorsEntry + 25, // 31: accessgraph.v1alpha.AWSEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.AWSSyncOperation + 69, // 32: accessgraph.v1alpha.AWSEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.AWSResourceList + 69, // 33: accessgraph.v1alpha.AWSEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.AWSResourceList + 70, // 34: accessgraph.v1alpha.GitlabEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.GitlabSyncOperation + 71, // 35: accessgraph.v1alpha.GitlabEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.GitlabResourceList + 71, // 36: accessgraph.v1alpha.GitlabEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.GitlabResourceList + 72, // 37: accessgraph.v1alpha.EntraEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.EntraSyncOperation + 73, // 38: accessgraph.v1alpha.EntraEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.EntraResourceList + 73, // 39: accessgraph.v1alpha.EntraEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.EntraResourceList + 32, // 40: accessgraph.v1alpha.AzureEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.AzureSyncOperation + 74, // 41: accessgraph.v1alpha.AzureEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.AzureResourceList + 74, // 42: accessgraph.v1alpha.AzureEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.AzureResourceList + 35, // 43: accessgraph.v1alpha.NetIQEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.NetIQSyncOperation + 75, // 44: accessgraph.v1alpha.NetIQEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.NetIQResourceList + 75, // 45: accessgraph.v1alpha.NetIQEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.NetIQResourceList + 39, // 46: accessgraph.v1alpha.AWSCloudTrailStreamRequest.config:type_name -> accessgraph.v1alpha.AWSCloudTrailConfig + 38, // 47: accessgraph.v1alpha.AWSCloudTrailStreamRequest.events_file:type_name -> accessgraph.v1alpha.AWSCloudTrailEventsFile + 39, // 48: accessgraph.v1alpha.AWSCloudTrailStreamResponse.cloud_trail_config:type_name -> accessgraph.v1alpha.AWSCloudTrailConfig + 41, // 49: accessgraph.v1alpha.AWSCloudTrailStreamResponse.resume_state:type_name -> accessgraph.v1alpha.AWSCloudTrailResumeState + 44, // 50: accessgraph.v1alpha.KubeAuditLogStreamRequest.config:type_name -> accessgraph.v1alpha.KubeAuditLogConfig + 45, // 51: accessgraph.v1alpha.KubeAuditLogStreamRequest.new_stream:type_name -> accessgraph.v1alpha.KubeAuditLogNewStream + 46, // 52: accessgraph.v1alpha.KubeAuditLogStreamRequest.events:type_name -> accessgraph.v1alpha.KubeAuditLogEvents + 47, // 53: accessgraph.v1alpha.KubeAuditLogNewStream.initial:type_name -> accessgraph.v1alpha.KubeAuditLogCursor + 76, // 54: accessgraph.v1alpha.KubeAuditLogEvents.events:type_name -> google.protobuf.Struct + 47, // 55: accessgraph.v1alpha.KubeAuditLogEvents.cursor:type_name -> accessgraph.v1alpha.KubeAuditLogCursor + 0, // 56: accessgraph.v1alpha.KubeAuditLogCursor.log_source:type_name -> accessgraph.v1alpha.KubeAuditLogCursor.KubeAuditLogSource + 66, // 57: accessgraph.v1alpha.KubeAuditLogCursor.last_event_time:type_name -> google.protobuf.Timestamp + 44, // 58: accessgraph.v1alpha.KubeAuditLogStreamResponse.config:type_name -> accessgraph.v1alpha.KubeAuditLogConfig + 49, // 59: accessgraph.v1alpha.KubeAuditLogStreamResponse.resume_state:type_name -> accessgraph.v1alpha.KubeAuditLogResumeState + 47, // 60: accessgraph.v1alpha.KubeAuditLogResumeState.cursor:type_name -> accessgraph.v1alpha.KubeAuditLogCursor + 77, // 61: accessgraph.v1alpha.GitHubAuditLogStreamRequest.config:type_name -> accessgraph.v1alpha.GitHubConfigV1 + 78, // 62: accessgraph.v1alpha.GitHubAuditLogStreamRequest.audit_log:type_name -> accessgraph.v1alpha.GitHubAuditLogV1 + 77, // 63: accessgraph.v1alpha.GitHubAuditLogStreamResponse.github_config:type_name -> accessgraph.v1alpha.GitHubConfigV1 + 79, // 64: accessgraph.v1alpha.GitHubAuditLogStreamResponse.audit_log_resume_state:type_name -> accessgraph.v1alpha.GitHubAuditLogV1Cursor + 80, // 65: accessgraph.v1alpha.GitHubEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.GithubResourceList + 80, // 66: accessgraph.v1alpha.GitHubEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.GithubResourceList + 81, // 67: accessgraph.v1alpha.GitHubEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.GithubSync + 82, // 68: accessgraph.v1alpha.OktaAuditLogStreamRequest.config:type_name -> accessgraph.v1alpha.OktaConfigV1 + 83, // 69: accessgraph.v1alpha.OktaAuditLogStreamRequest.audit_log:type_name -> accessgraph.v1alpha.OktaAuditLogV1 + 82, // 70: accessgraph.v1alpha.OktaAuditLogStreamResponse.config:type_name -> accessgraph.v1alpha.OktaConfigV1 + 84, // 71: accessgraph.v1alpha.OktaAuditLogStreamResponse.audit_log_resume_state:type_name -> accessgraph.v1alpha.OktaAuditLogV1Cursor + 85, // 72: accessgraph.v1alpha.OktaEventsStreamRequest.upsert:type_name -> accessgraph.v1alpha.OktaResourceList + 85, // 73: accessgraph.v1alpha.OktaEventsStreamRequest.delete:type_name -> accessgraph.v1alpha.OktaResourceList + 86, // 74: accessgraph.v1alpha.OktaEventsStreamRequest.sync:type_name -> accessgraph.v1alpha.OktaSync + 1, // 75: accessgraph.v1alpha.AccessGraphService.Query:input_type -> accessgraph.v1alpha.QueryRequest + 3, // 76: accessgraph.v1alpha.AccessGraphService.GetFile:input_type -> accessgraph.v1alpha.GetFileRequest + 5, // 77: accessgraph.v1alpha.AccessGraphService.EventsStream:input_type -> accessgraph.v1alpha.EventsStreamRequest + 6, // 78: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:input_type -> accessgraph.v1alpha.EventsStreamV2Request + 11, // 79: accessgraph.v1alpha.AccessGraphService.AuditLogStream:input_type -> accessgraph.v1alpha.AuditLogStreamRequest + 37, // 80: accessgraph.v1alpha.AccessGraphService.AWSCloudTrailStream:input_type -> accessgraph.v1alpha.AWSCloudTrailStreamRequest + 43, // 81: accessgraph.v1alpha.AccessGraphService.KubeAuditLogStream:input_type -> accessgraph.v1alpha.KubeAuditLogStreamRequest + 20, // 82: accessgraph.v1alpha.AccessGraphService.Register:input_type -> accessgraph.v1alpha.RegisterRequest + 22, // 83: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:input_type -> accessgraph.v1alpha.ReplaceCAsRequest + 24, // 84: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:input_type -> accessgraph.v1alpha.AWSEventsStreamRequest + 27, // 85: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:input_type -> accessgraph.v1alpha.GitlabEventsStreamRequest + 29, // 86: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:input_type -> accessgraph.v1alpha.EntraEventsStreamRequest + 31, // 87: accessgraph.v1alpha.AccessGraphService.AzureEventsStream:input_type -> accessgraph.v1alpha.AzureEventsStreamRequest + 34, // 88: accessgraph.v1alpha.AccessGraphService.NetIQEventsStream:input_type -> accessgraph.v1alpha.NetIQEventsStreamRequest + 50, // 89: accessgraph.v1alpha.AccessGraphService.GitHubAuditLogStream:input_type -> accessgraph.v1alpha.GitHubAuditLogStreamRequest + 52, // 90: accessgraph.v1alpha.AccessGraphService.GitHubEventsStream:input_type -> accessgraph.v1alpha.GitHubEventsStreamRequest + 54, // 91: accessgraph.v1alpha.AccessGraphService.OktaAuditLogStream:input_type -> accessgraph.v1alpha.OktaAuditLogStreamRequest + 56, // 92: accessgraph.v1alpha.AccessGraphService.OktaEventsStream:input_type -> accessgraph.v1alpha.OktaEventsStreamRequest + 2, // 93: accessgraph.v1alpha.AccessGraphService.Query:output_type -> accessgraph.v1alpha.QueryResponse + 4, // 94: accessgraph.v1alpha.AccessGraphService.GetFile:output_type -> accessgraph.v1alpha.GetFileResponse + 8, // 95: accessgraph.v1alpha.AccessGraphService.EventsStream:output_type -> accessgraph.v1alpha.EventsStreamResponse + 9, // 96: accessgraph.v1alpha.AccessGraphService.EventsStreamV2:output_type -> accessgraph.v1alpha.EventsStreamV2Response + 17, // 97: accessgraph.v1alpha.AccessGraphService.AuditLogStream:output_type -> accessgraph.v1alpha.AuditLogStreamResponse + 40, // 98: accessgraph.v1alpha.AccessGraphService.AWSCloudTrailStream:output_type -> accessgraph.v1alpha.AWSCloudTrailStreamResponse + 48, // 99: accessgraph.v1alpha.AccessGraphService.KubeAuditLogStream:output_type -> accessgraph.v1alpha.KubeAuditLogStreamResponse + 21, // 100: accessgraph.v1alpha.AccessGraphService.Register:output_type -> accessgraph.v1alpha.RegisterResponse + 23, // 101: accessgraph.v1alpha.AccessGraphService.ReplaceCAs:output_type -> accessgraph.v1alpha.ReplaceCAsResponse + 26, // 102: accessgraph.v1alpha.AccessGraphService.AWSEventsStream:output_type -> accessgraph.v1alpha.AWSEventsStreamResponse + 28, // 103: accessgraph.v1alpha.AccessGraphService.GitlabEventsStream:output_type -> accessgraph.v1alpha.GitlabEventsStreamResponse + 30, // 104: accessgraph.v1alpha.AccessGraphService.EntraEventsStream:output_type -> accessgraph.v1alpha.EntraEventsStreamResponse + 33, // 105: accessgraph.v1alpha.AccessGraphService.AzureEventsStream:output_type -> accessgraph.v1alpha.AzureEventsStreamResponse + 36, // 106: accessgraph.v1alpha.AccessGraphService.NetIQEventsStream:output_type -> accessgraph.v1alpha.NetIQEventsStreamResponse + 51, // 107: accessgraph.v1alpha.AccessGraphService.GitHubAuditLogStream:output_type -> accessgraph.v1alpha.GitHubAuditLogStreamResponse + 53, // 108: accessgraph.v1alpha.AccessGraphService.GitHubEventsStream:output_type -> accessgraph.v1alpha.GitHubEventsStreamResponse + 55, // 109: accessgraph.v1alpha.AccessGraphService.OktaAuditLogStream:output_type -> accessgraph.v1alpha.OktaAuditLogStreamResponse + 57, // 110: accessgraph.v1alpha.AccessGraphService.OktaEventsStream:output_type -> accessgraph.v1alpha.OktaEventsStreamResponse + 93, // [93:111] is the sub-list for method output_type + 75, // [75:93] is the sub-list for method input_type + 75, // [75:75] is the sub-list for extension type_name + 75, // [75:75] is the sub-list for extension extendee + 0, // [0:75] is the sub-list for field type_name } func init() { file_accessgraph_v1alpha_access_graph_service_proto_init() } @@ -3904,27 +4494,36 @@ func file_accessgraph_v1alpha_access_graph_service_proto_init() { (*AWSCloudTrailStreamResponse_ResumeState)(nil), } file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[42].OneofWrappers = []any{ + (*KubeAuditLogStreamRequest_Config)(nil), + (*KubeAuditLogStreamRequest_NewStream)(nil), + (*KubeAuditLogStreamRequest_Events)(nil), + } + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[47].OneofWrappers = []any{ + (*KubeAuditLogStreamResponse_Config)(nil), + (*KubeAuditLogStreamResponse_ResumeState)(nil), + } + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[49].OneofWrappers = []any{ (*GitHubAuditLogStreamRequest_Config)(nil), (*GitHubAuditLogStreamRequest_AuditLog)(nil), } - file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[43].OneofWrappers = []any{ + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[50].OneofWrappers = []any{ (*GitHubAuditLogStreamResponse_GithubConfig)(nil), (*GitHubAuditLogStreamResponse_AuditLogResumeState)(nil), } - file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[44].OneofWrappers = []any{ + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[51].OneofWrappers = []any{ (*GitHubEventsStreamRequest_Upsert)(nil), (*GitHubEventsStreamRequest_Delete)(nil), (*GitHubEventsStreamRequest_Sync)(nil), } - file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[46].OneofWrappers = []any{ + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[53].OneofWrappers = []any{ (*OktaAuditLogStreamRequest_Config)(nil), (*OktaAuditLogStreamRequest_AuditLog)(nil), } - file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[47].OneofWrappers = []any{ + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[54].OneofWrappers = []any{ (*OktaAuditLogStreamResponse_Config)(nil), (*OktaAuditLogStreamResponse_AuditLogResumeState)(nil), } - file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[48].OneofWrappers = []any{ + file_accessgraph_v1alpha_access_graph_service_proto_msgTypes[55].OneofWrappers = []any{ (*OktaEventsStreamRequest_Upsert)(nil), (*OktaEventsStreamRequest_Delete)(nil), (*OktaEventsStreamRequest_Sync)(nil), @@ -3934,13 +4533,14 @@ func file_accessgraph_v1alpha_access_graph_service_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_accessgraph_v1alpha_access_graph_service_proto_rawDesc), len(file_accessgraph_v1alpha_access_graph_service_proto_rawDesc)), - NumEnums: 0, - NumMessages: 51, + NumEnums: 1, + NumMessages: 58, NumExtensions: 0, NumServices: 1, }, GoTypes: file_accessgraph_v1alpha_access_graph_service_proto_goTypes, DependencyIndexes: file_accessgraph_v1alpha_access_graph_service_proto_depIdxs, + EnumInfos: file_accessgraph_v1alpha_access_graph_service_proto_enumTypes, MessageInfos: file_accessgraph_v1alpha_access_graph_service_proto_msgTypes, }.Build() File_accessgraph_v1alpha_access_graph_service_proto = out.File diff --git a/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go b/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go index 265fd60072b58..6736c22648ee6 100644 --- a/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go +++ b/gen/proto/go/accessgraph/v1alpha/access_graph_service_grpc.pb.go @@ -42,6 +42,7 @@ const ( AccessGraphService_EventsStreamV2_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/EventsStreamV2" AccessGraphService_AuditLogStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/AuditLogStream" AccessGraphService_AWSCloudTrailStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/AWSCloudTrailStream" + AccessGraphService_KubeAuditLogStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/KubeAuditLogStream" AccessGraphService_Register_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/Register" AccessGraphService_ReplaceCAs_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/ReplaceCAs" AccessGraphService_AWSEventsStream_FullMethodName = "/accessgraph.v1alpha.AccessGraphService/AWSEventsStream" @@ -111,6 +112,31 @@ type AccessGraphServiceClient interface { // 3. Server sends second response providing the starting `resume_state` (possilby empty). // 4. Client sends subsequent `AWSCloudTrailStreamRequest` messages. AWSCloudTrailStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[AWSCloudTrailStreamRequest, AWSCloudTrailStreamResponse], error) + // KubeAuditLogStream establishes a persistent bidirectional stream for exporting + // Kubernetes audit logs from a client (teleport) to a server (access-graph). This stream + // is separate from other audit log streams as fetching Kubernetes audit logs can + // require a variety of mechanisms for retrieving them depending on how/where the + // k8s cluster is deployed. It often will not make sense to integrate this audit log + // stream with any of the others. + // + // This stream facilitates: + // - Initial configuration exchange and validation. + // - Streaming batches of audit log events from client to server. + // - Reliable export resumption via client-provided resume state updates. + // - Logs for multiple clusters can be streamed across the one grpc stream. + // + // Basic Interaction Flow: + // 1. Client connects and sends an initial `KubeAuditLogStreamRequest` with `config`. + // 2. Server responds with an initial `KubeAuditLogStreamResponse`, confirming the + // effective configuration. + // 3. Client sends a `KubeAuditLogNewStream` message initiating a log stream for + // a cluster, with a timestamp of the oldest logs it wants. + // 4. Server responds with a `KubeAuditLogResumeState` message containing either + // a resumption cursor indicating when logs should be streamed from, or if + // a new cluster or an old outdated resumption point has been stored, sends + // the timestamp from which logs should be sent. + // 5. Client sends subsequent `KubeAuditLogStreamRequest` messages with new logs. + KubeAuditLogStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse], error) // Register submits a new tenant representing this Teleport cluster to the TAG service, // identified by its HostCA certificate. // The method is idempotent: it succeeds if the tenant has already registered and has the specific CA associated. @@ -269,6 +295,19 @@ func (c *accessGraphServiceClient) AWSCloudTrailStream(ctx context.Context, opts // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type AccessGraphService_AWSCloudTrailStreamClient = grpc.BidiStreamingClient[AWSCloudTrailStreamRequest, AWSCloudTrailStreamResponse] +func (c *accessGraphServiceClient) KubeAuditLogStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[4], AccessGraphService_KubeAuditLogStream_FullMethodName, cOpts...) + if err != nil { + return nil, err + } + x := &grpc.GenericClientStream[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse]{ClientStream: stream} + return x, nil +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AccessGraphService_KubeAuditLogStreamClient = grpc.BidiStreamingClient[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse] + func (c *accessGraphServiceClient) Register(ctx context.Context, in *RegisterRequest, opts ...grpc.CallOption) (*RegisterResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(RegisterResponse) @@ -291,7 +330,7 @@ func (c *accessGraphServiceClient) ReplaceCAs(ctx context.Context, in *ReplaceCA func (c *accessGraphServiceClient) AWSEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.ClientStreamingClient[AWSEventsStreamRequest, AWSEventsStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[4], AccessGraphService_AWSEventsStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[5], AccessGraphService_AWSEventsStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -304,7 +343,7 @@ type AccessGraphService_AWSEventsStreamClient = grpc.ClientStreamingClient[AWSEv func (c *accessGraphServiceClient) GitlabEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[GitlabEventsStreamRequest, GitlabEventsStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[5], AccessGraphService_GitlabEventsStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[6], AccessGraphService_GitlabEventsStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -317,7 +356,7 @@ type AccessGraphService_GitlabEventsStreamClient = grpc.BidiStreamingClient[Gitl func (c *accessGraphServiceClient) EntraEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[EntraEventsStreamRequest, EntraEventsStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[6], AccessGraphService_EntraEventsStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[7], AccessGraphService_EntraEventsStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -330,7 +369,7 @@ type AccessGraphService_EntraEventsStreamClient = grpc.BidiStreamingClient[Entra func (c *accessGraphServiceClient) AzureEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[AzureEventsStreamRequest, AzureEventsStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[7], AccessGraphService_AzureEventsStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[8], AccessGraphService_AzureEventsStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -343,7 +382,7 @@ type AccessGraphService_AzureEventsStreamClient = grpc.BidiStreamingClient[Azure func (c *accessGraphServiceClient) NetIQEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[NetIQEventsStreamRequest, NetIQEventsStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[8], AccessGraphService_NetIQEventsStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[9], AccessGraphService_NetIQEventsStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -356,7 +395,7 @@ type AccessGraphService_NetIQEventsStreamClient = grpc.BidiStreamingClient[NetIQ func (c *accessGraphServiceClient) GitHubAuditLogStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[GitHubAuditLogStreamRequest, GitHubAuditLogStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[9], AccessGraphService_GitHubAuditLogStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[10], AccessGraphService_GitHubAuditLogStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -369,7 +408,7 @@ type AccessGraphService_GitHubAuditLogStreamClient = grpc.BidiStreamingClient[Gi func (c *accessGraphServiceClient) GitHubEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[GitHubEventsStreamRequest, GitHubEventsStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[10], AccessGraphService_GitHubEventsStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[11], AccessGraphService_GitHubEventsStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -382,7 +421,7 @@ type AccessGraphService_GitHubEventsStreamClient = grpc.BidiStreamingClient[GitH func (c *accessGraphServiceClient) OktaAuditLogStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[OktaAuditLogStreamRequest, OktaAuditLogStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[11], AccessGraphService_OktaAuditLogStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[12], AccessGraphService_OktaAuditLogStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -395,7 +434,7 @@ type AccessGraphService_OktaAuditLogStreamClient = grpc.BidiStreamingClient[Okta func (c *accessGraphServiceClient) OktaEventsStream(ctx context.Context, opts ...grpc.CallOption) (grpc.BidiStreamingClient[OktaEventsStreamRequest, OktaEventsStreamResponse], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[12], AccessGraphService_OktaEventsStream_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &AccessGraphService_ServiceDesc.Streams[13], AccessGraphService_OktaEventsStream_FullMethodName, cOpts...) if err != nil { return nil, err } @@ -462,6 +501,31 @@ type AccessGraphServiceServer interface { // 3. Server sends second response providing the starting `resume_state` (possilby empty). // 4. Client sends subsequent `AWSCloudTrailStreamRequest` messages. AWSCloudTrailStream(grpc.BidiStreamingServer[AWSCloudTrailStreamRequest, AWSCloudTrailStreamResponse]) error + // KubeAuditLogStream establishes a persistent bidirectional stream for exporting + // Kubernetes audit logs from a client (teleport) to a server (access-graph). This stream + // is separate from other audit log streams as fetching Kubernetes audit logs can + // require a variety of mechanisms for retrieving them depending on how/where the + // k8s cluster is deployed. It often will not make sense to integrate this audit log + // stream with any of the others. + // + // This stream facilitates: + // - Initial configuration exchange and validation. + // - Streaming batches of audit log events from client to server. + // - Reliable export resumption via client-provided resume state updates. + // - Logs for multiple clusters can be streamed across the one grpc stream. + // + // Basic Interaction Flow: + // 1. Client connects and sends an initial `KubeAuditLogStreamRequest` with `config`. + // 2. Server responds with an initial `KubeAuditLogStreamResponse`, confirming the + // effective configuration. + // 3. Client sends a `KubeAuditLogNewStream` message initiating a log stream for + // a cluster, with a timestamp of the oldest logs it wants. + // 4. Server responds with a `KubeAuditLogResumeState` message containing either + // a resumption cursor indicating when logs should be streamed from, or if + // a new cluster or an old outdated resumption point has been stored, sends + // the timestamp from which logs should be sent. + // 5. Client sends subsequent `KubeAuditLogStreamRequest` messages with new logs. + KubeAuditLogStream(grpc.BidiStreamingServer[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse]) error // Register submits a new tenant representing this Teleport cluster to the TAG service, // identified by its HostCA certificate. // The method is idempotent: it succeeds if the tenant has already registered and has the specific CA associated. @@ -566,6 +630,9 @@ func (UnimplementedAccessGraphServiceServer) AuditLogStream(grpc.BidiStreamingSe func (UnimplementedAccessGraphServiceServer) AWSCloudTrailStream(grpc.BidiStreamingServer[AWSCloudTrailStreamRequest, AWSCloudTrailStreamResponse]) error { return status.Errorf(codes.Unimplemented, "method AWSCloudTrailStream not implemented") } +func (UnimplementedAccessGraphServiceServer) KubeAuditLogStream(grpc.BidiStreamingServer[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse]) error { + return status.Errorf(codes.Unimplemented, "method KubeAuditLogStream not implemented") +} func (UnimplementedAccessGraphServiceServer) Register(context.Context, *RegisterRequest) (*RegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Register not implemented") } @@ -684,6 +751,13 @@ func _AccessGraphService_AWSCloudTrailStream_Handler(srv interface{}, stream grp // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. type AccessGraphService_AWSCloudTrailStreamServer = grpc.BidiStreamingServer[AWSCloudTrailStreamRequest, AWSCloudTrailStreamResponse] +func _AccessGraphService_KubeAuditLogStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(AccessGraphServiceServer).KubeAuditLogStream(&grpc.GenericServerStream[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse]{ServerStream: stream}) +} + +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type AccessGraphService_KubeAuditLogStreamServer = grpc.BidiStreamingServer[KubeAuditLogStreamRequest, KubeAuditLogStreamResponse] + func _AccessGraphService_Register_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RegisterRequest) if err := dec(in); err != nil { @@ -831,6 +905,12 @@ var AccessGraphService_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, ClientStreams: true, }, + { + StreamName: "KubeAuditLogStream", + Handler: _AccessGraphService_KubeAuditLogStream_Handler, + ServerStreams: true, + ClientStreams: true, + }, { StreamName: "AWSEventsStream", Handler: _AccessGraphService_AWSEventsStream_Handler, diff --git a/go.mod b/go.mod index c38217bbb4976..fd51761c61e3b 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/andybalholm/brotli v1.1.1 github.com/aquasecurity/libbpfgo v0.5.1-libbpf-1.2 github.com/armon/go-radix v1.0.0 - github.com/aws/aws-sdk-go-v2 v1.39.2 + github.com/aws/aws-sdk-go-v2 v1.39.6 github.com/aws/aws-sdk-go-v2/config v1.31.0 github.com/aws/aws-sdk-go-v2/credentials v1.18.4 github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.19.0 @@ -56,6 +56,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.36.0 github.com/aws/aws-sdk-go-v2/service/athena v1.50.4 github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0 + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9 github.com/aws/aws-sdk-go-v2/service/dax v1.24.2 github.com/aws/aws-sdk-go-v2/service/dynamodb v1.43.1 github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.25.3 @@ -85,7 +86,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.30.2 github.com/aws/aws-sdk-go-v2/service/sts v1.37.0 github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 - github.com/aws/smithy-go v1.23.0 + github.com/aws/smithy-go v1.23.2 github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1 github.com/beevik/etree v1.5.1 @@ -307,9 +308,9 @@ require ( github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/atotto/clipboard v0.1.4 // indirect github.com/aws/aws-sdk-go v1.55.7 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/service/ecr v1.40.3 // indirect diff --git a/go.sum b/go.sum index 0634366433138..a7ed6f0a35518 100644 --- a/go.sum +++ b/go.sum @@ -850,10 +850,10 @@ github.com/aws/aws-sdk-go v1.49.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3Tj github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= -github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00= +github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk= +github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 h1:DHctwEM8P8iTXFxC/QK0MRjwEpWQeM9yzidCRjldUz0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3/go.mod h1:xdCzcZEtnSTKVDOmUZs4l/j3pSV6rpo1WXl5ugNsL8Y= github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= github.com/aws/aws-sdk-go-v2/config v1.31.0 h1:9yH0xiY5fUnVNLRWO0AtayqwU1ndriZdN78LlhruJR4= github.com/aws/aws-sdk-go-v2/config v1.31.0/go.mod h1:VeV3K72nXnhbe4EuxxhzsDc/ByrCSlZwUnWH52Nde/I= @@ -872,11 +872,11 @@ github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.11/go.mod h1:f3MkXuZsT+wY24nL github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74 h1:+1lc5oMFFHlVBclPXQf/POqlvdpBzjLaN2c3ujDCcZw= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74/go.mod h1:EiskBoFr4SpYnFIbw8UM7DP7CacQXDHEmJqLI1xpRFI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 h1:a+8/MLcWlIxo1lF9xaGt3J/u3yOZx+CdSveSNwjhD40= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13/go.mod h1:oGnKwIYZ4XttyU2JWxFrwvhF6YKiK/9/wmE3v3Iu9K8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 h1:HBSI2kDkMdWz4ZM7FjwE7e/pWDEZ+nR95x8Ztet1ooY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13/go.mod h1:YE94ZoDArI7awZqJzBAZ3PDD2zSfuP7w6P2knOzIn8M= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= @@ -888,6 +888,8 @@ github.com/aws/aws-sdk-go-v2/service/athena v1.50.4 h1:QWhxjrA0r+FQnDAATdGqLXUvY github.com/aws/aws-sdk-go-v2/service/athena v1.50.4/go.mod h1:xsG8Y2fMenmHTdukyknTUO1uQhEZ/entaNHvPmD1klE= github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0 h1:xdYdX+JpIFByMG8JQe9iWM9CqepyjhenukxTVQnuCbM= github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0/go.mod h1:c1Ik+59wgLIJFhsSY8cAnw6QooiogpTZKP0rtkVcpCQ= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9 h1:+NSIzl59vBK3g3nLUuLSb/I2F2OIucW6hX/B+NAPWDg= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9/go.mod h1:9/Q0/HtqBTLMksFse42wZjUq0jJrUuo4XlnXy/uSoeg= github.com/aws/aws-sdk-go-v2/service/dax v1.24.2 h1:QFdCeROg/LwFkKOpM4TrzOPt9vcsbuu2WibzjiKTZqA= github.com/aws/aws-sdk-go-v2/service/dax v1.24.2/go.mod h1:FTMIKMqG/2AiO0P1LSCN6PeY4BNkQcxAzPSpne6oE6w= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.43.1 h1:YYjNTAyPL0425ECmq6Xm48NSXdT6hDVQmLOJZxyhNTM= @@ -971,8 +973,8 @@ github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0/go.mod h1:AxK github.com/aws/rolesanywhere-credential-helper v1.2.0 h1:eLqJvSznH8nJk48dwFc0raWOpbTGgBeNYH3Q8UQFVx4= github.com/aws/rolesanywhere-credential-helper v1.2.0/go.mod h1:YRxmRrAaqbVVXPNH1gHT76nWaMGvpAziHAHw8UwKrpU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= -github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= +github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 h1:Gx4ipHtKfaABSHAVo4Zjo2E4ClKzYqZ2NrPO0gy6qvY= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4/go.mod h1:nnwXv9COKyqd4q7jpPrxRaW9L+Qfwb4aGTdZqsIpOho= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.9.1 h1:50sS0RWhGpW/yZx2KcDNEb1u1MANv5BMEkJgcieEDTA= diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index e0e2e56af6a71..5639c80cc3b37 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -64,14 +64,14 @@ require ( github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2 v1.39.2 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.39.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 // indirect github.com/aws/aws-sdk-go-v2/config v1.31.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.18.4 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/service/athena v1.50.4 // indirect @@ -106,7 +106,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.30.2 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.37.0 // indirect - github.com/aws/smithy-go v1.23.0 // indirect + github.com/aws/smithy-go v1.23.2 // indirect github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 // indirect github.com/beevik/etree v1.5.1 // indirect github.com/beorn7/perks v1.0.1 // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index 4a31af95e6475..7fb60206e0872 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -128,10 +128,10 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= -github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00= +github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk= +github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 h1:DHctwEM8P8iTXFxC/QK0MRjwEpWQeM9yzidCRjldUz0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3/go.mod h1:xdCzcZEtnSTKVDOmUZs4l/j3pSV6rpo1WXl5ugNsL8Y= github.com/aws/aws-sdk-go-v2/config v1.31.0 h1:9yH0xiY5fUnVNLRWO0AtayqwU1ndriZdN78LlhruJR4= github.com/aws/aws-sdk-go-v2/config v1.31.0/go.mod h1:VeV3K72nXnhbe4EuxxhzsDc/ByrCSlZwUnWH52Nde/I= github.com/aws/aws-sdk-go-v2/credentials v1.18.4 h1:IPd0Algf1b+Qy9BcDp0sCUcIWdCQPSzDoMK3a8pcbUM= @@ -140,10 +140,10 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3 h1:GicIdnekoJsjq9wqnvyi2el github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3/go.mod h1:R7BIi6WNC5mc1kfRM7XM/VHC3uRWkjc396sfabq4iOo= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74 h1:+1lc5oMFFHlVBclPXQf/POqlvdpBzjLaN2c3ujDCcZw= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74/go.mod h1:EiskBoFr4SpYnFIbw8UM7DP7CacQXDHEmJqLI1xpRFI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 h1:a+8/MLcWlIxo1lF9xaGt3J/u3yOZx+CdSveSNwjhD40= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13/go.mod h1:oGnKwIYZ4XttyU2JWxFrwvhF6YKiK/9/wmE3v3Iu9K8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 h1:HBSI2kDkMdWz4ZM7FjwE7e/pWDEZ+nR95x8Ztet1ooY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13/go.mod h1:YE94ZoDArI7awZqJzBAZ3PDD2zSfuP7w6P2knOzIn8M= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM= @@ -212,8 +212,8 @@ github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0 h1:6csaS/aJmqZQbKhi1EyEMM7y github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0/go.mod h1:59qHWaY5B+Rs7HGTuVGaC32m0rdpQ68N8QCN3khYiqs= github.com/aws/aws-sdk-go-v2/service/sts v1.37.0 h1:MG9VFW43M4A8BYeAfaJJZWrroinxeTi2r3+SnmLQfSA= github.com/aws/aws-sdk-go-v2/service/sts v1.37.0/go.mod h1:JdeBDPgpJfuS6rU/hNglmOigKhyEZtBmbraLE4GK1J8= -github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= -github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= +github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 h1:Gx4ipHtKfaABSHAVo4Zjo2E4ClKzYqZ2NrPO0gy6qvY= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4/go.mod h1:nnwXv9COKyqd4q7jpPrxRaW9L+Qfwb4aGTdZqsIpOho= github.com/beevik/etree v1.5.1 h1:TC3zyxYp+81wAmbsi8SWUpZCurbxa6S8RITYRSkNRwo= diff --git a/integrations/terraform-mwi/go.mod b/integrations/terraform-mwi/go.mod index 18c3b80267467..c6869e71f4355 100644 --- a/integrations/terraform-mwi/go.mod +++ b/integrations/terraform-mwi/go.mod @@ -83,8 +83,8 @@ require ( github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.55.7 // indirect - github.com/aws/aws-sdk-go-v2 v1.39.2 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.39.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 // indirect github.com/aws/aws-sdk-go-v2/config v1.31.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.18.4 // indirect github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.19.0 // indirect @@ -92,13 +92,14 @@ require ( github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3 // indirect github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.11 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.77 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.36.1 // indirect github.com/aws/aws-sdk-go-v2/service/athena v1.50.5 // indirect github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0 // indirect + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9 // indirect github.com/aws/aws-sdk-go-v2/service/dax v1.24.2 // indirect github.com/aws/aws-sdk-go-v2/service/dynamodb v1.43.1 // indirect github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.25.3 // indirect @@ -134,7 +135,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.37.0 // indirect github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 // indirect - github.com/aws/smithy-go v1.23.0 // indirect + github.com/aws/smithy-go v1.23.2 // indirect github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beevik/etree v1.5.1 // indirect diff --git a/integrations/terraform-mwi/go.sum b/integrations/terraform-mwi/go.sum index 69aeda66db017..0550acd311961 100644 --- a/integrations/terraform-mwi/go.sum +++ b/integrations/terraform-mwi/go.sum @@ -193,10 +193,10 @@ github.com/aws/aws-sdk-go v1.49.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3Tj github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= -github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00= +github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk= +github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 h1:DHctwEM8P8iTXFxC/QK0MRjwEpWQeM9yzidCRjldUz0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3/go.mod h1:xdCzcZEtnSTKVDOmUZs4l/j3pSV6rpo1WXl5ugNsL8Y= github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= github.com/aws/aws-sdk-go-v2/config v1.31.0 h1:9yH0xiY5fUnVNLRWO0AtayqwU1ndriZdN78LlhruJR4= github.com/aws/aws-sdk-go-v2/config v1.31.0/go.mod h1:VeV3K72nXnhbe4EuxxhzsDc/ByrCSlZwUnWH52Nde/I= @@ -215,11 +215,11 @@ github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.11/go.mod h1:f3MkXuZsT+wY24nL github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.77 h1:xaRN9fags7iJznsMEjtcEuON1hGfCZ0y5MVfEMKtrx8= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.77/go.mod h1:lolsiGkT47AZ3DWqtxgEQM/wVMpayi7YWNjl3wHSRx8= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 h1:a+8/MLcWlIxo1lF9xaGt3J/u3yOZx+CdSveSNwjhD40= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13/go.mod h1:oGnKwIYZ4XttyU2JWxFrwvhF6YKiK/9/wmE3v3Iu9K8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 h1:HBSI2kDkMdWz4ZM7FjwE7e/pWDEZ+nR95x8Ztet1ooY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13/go.mod h1:YE94ZoDArI7awZqJzBAZ3PDD2zSfuP7w6P2knOzIn8M= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= @@ -231,6 +231,8 @@ github.com/aws/aws-sdk-go-v2/service/athena v1.50.5 h1:jtjq2nXMt8eSB4gTcZwjbKURj github.com/aws/aws-sdk-go-v2/service/athena v1.50.5/go.mod h1:xsG8Y2fMenmHTdukyknTUO1uQhEZ/entaNHvPmD1klE= github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0 h1:xdYdX+JpIFByMG8JQe9iWM9CqepyjhenukxTVQnuCbM= github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0/go.mod h1:c1Ik+59wgLIJFhsSY8cAnw6QooiogpTZKP0rtkVcpCQ= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9 h1:+NSIzl59vBK3g3nLUuLSb/I2F2OIucW6hX/B+NAPWDg= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9/go.mod h1:9/Q0/HtqBTLMksFse42wZjUq0jJrUuo4XlnXy/uSoeg= github.com/aws/aws-sdk-go-v2/service/dax v1.24.2 h1:QFdCeROg/LwFkKOpM4TrzOPt9vcsbuu2WibzjiKTZqA= github.com/aws/aws-sdk-go-v2/service/dax v1.24.2/go.mod h1:FTMIKMqG/2AiO0P1LSCN6PeY4BNkQcxAzPSpne6oE6w= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.43.1 h1:YYjNTAyPL0425ECmq6Xm48NSXdT6hDVQmLOJZxyhNTM= @@ -310,8 +312,8 @@ github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0/go.mod h1:AxK github.com/aws/rolesanywhere-credential-helper v1.2.0 h1:eLqJvSznH8nJk48dwFc0raWOpbTGgBeNYH3Q8UQFVx4= github.com/aws/rolesanywhere-credential-helper v1.2.0/go.mod h1:YRxmRrAaqbVVXPNH1gHT76nWaMGvpAziHAHw8UwKrpU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= -github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= +github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 h1:Gx4ipHtKfaABSHAVo4Zjo2E4ClKzYqZ2NrPO0gy6qvY= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4/go.mod h1:nnwXv9COKyqd4q7jpPrxRaW9L+Qfwb4aGTdZqsIpOho= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 35b8ff3767bb2..2dce55e8cde8c 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -87,8 +87,8 @@ require ( github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.55.7 // indirect - github.com/aws/aws-sdk-go-v2 v1.39.2 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.39.6 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 // indirect github.com/aws/aws-sdk-go-v2/config v1.31.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.18.4 // indirect github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.19.0 // indirect @@ -96,13 +96,14 @@ require ( github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.3 // indirect github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.11 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 // indirect github.com/aws/aws-sdk-go-v2/service/applicationautoscaling v1.36.0 // indirect github.com/aws/aws-sdk-go-v2/service/athena v1.50.4 // indirect github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0 // indirect + github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9 // indirect github.com/aws/aws-sdk-go-v2/service/dax v1.24.2 // indirect github.com/aws/aws-sdk-go-v2/service/dynamodb v1.43.1 // indirect github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.25.3 // indirect @@ -138,7 +139,7 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.33.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.37.0 // indirect github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 // indirect - github.com/aws/smithy-go v1.23.0 // indirect + github.com/aws/smithy-go v1.23.2 // indirect github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beevik/etree v1.5.1 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 754c86b217595..d8147767de0f4 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -244,10 +244,10 @@ github.com/aws/aws-sdk-go v1.49.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3Tj github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.39.2 h1:EJLg8IdbzgeD7xgvZ+I8M1e0fL0ptn/M47lianzth0I= -github.com/aws/aws-sdk-go-v2 v1.39.2/go.mod h1:sDioUELIUO9Znk23YVmIk86/9DOpkbyyVb1i/gUNFXY= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1 h1:i8p8P4diljCr60PpJp6qZXNlgX4m2yQFpYk+9ZT+J4E= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.1/go.mod h1:ddqbooRZYNoJ2dsTwOty16rM+/Aqmk/GOXrK8cg7V00= +github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk= +github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3 h1:DHctwEM8P8iTXFxC/QK0MRjwEpWQeM9yzidCRjldUz0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.3/go.mod h1:xdCzcZEtnSTKVDOmUZs4l/j3pSV6rpo1WXl5ugNsL8Y= github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= github.com/aws/aws-sdk-go-v2/config v1.31.0 h1:9yH0xiY5fUnVNLRWO0AtayqwU1ndriZdN78LlhruJR4= github.com/aws/aws-sdk-go-v2/config v1.31.0/go.mod h1:VeV3K72nXnhbe4EuxxhzsDc/ByrCSlZwUnWH52Nde/I= @@ -266,11 +266,11 @@ github.com/aws/aws-sdk-go-v2/feature/rds/auth v1.5.11/go.mod h1:f3MkXuZsT+wY24nL github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74 h1:+1lc5oMFFHlVBclPXQf/POqlvdpBzjLaN2c3ujDCcZw= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.74/go.mod h1:EiskBoFr4SpYnFIbw8UM7DP7CacQXDHEmJqLI1xpRFI= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9 h1:se2vOWGD3dWQUtfn4wEjRQJb1HK1XsNIt825gskZ970= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.9/go.mod h1:hijCGH2VfbZQxqCDN7bwz/4dzxV+hkyhjawAtdPWKZA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 h1:a+8/MLcWlIxo1lF9xaGt3J/u3yOZx+CdSveSNwjhD40= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13/go.mod h1:oGnKwIYZ4XttyU2JWxFrwvhF6YKiK/9/wmE3v3Iu9K8= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9 h1:6RBnKZLkJM4hQ+kN6E7yWFveOTg8NLPHAkqrs4ZPlTU= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.9/go.mod h1:V9rQKRmK7AWuEsOMnHzKj8WyrIir1yUJbZxDuZLFvXI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 h1:HBSI2kDkMdWz4ZM7FjwE7e/pWDEZ+nR95x8Ztet1ooY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13/go.mod h1:YE94ZoDArI7awZqJzBAZ3PDD2zSfuP7w6P2knOzIn8M= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= @@ -282,6 +282,8 @@ github.com/aws/aws-sdk-go-v2/service/athena v1.50.4 h1:QWhxjrA0r+FQnDAATdGqLXUvY github.com/aws/aws-sdk-go-v2/service/athena v1.50.4/go.mod h1:xsG8Y2fMenmHTdukyknTUO1uQhEZ/entaNHvPmD1klE= github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0 h1:xdYdX+JpIFByMG8JQe9iWM9CqepyjhenukxTVQnuCbM= github.com/aws/aws-sdk-go-v2/service/bedrockruntime v1.41.0/go.mod h1:c1Ik+59wgLIJFhsSY8cAnw6QooiogpTZKP0rtkVcpCQ= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9 h1:+NSIzl59vBK3g3nLUuLSb/I2F2OIucW6hX/B+NAPWDg= +github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs v1.58.9/go.mod h1:9/Q0/HtqBTLMksFse42wZjUq0jJrUuo4XlnXy/uSoeg= github.com/aws/aws-sdk-go-v2/service/dax v1.24.2 h1:QFdCeROg/LwFkKOpM4TrzOPt9vcsbuu2WibzjiKTZqA= github.com/aws/aws-sdk-go-v2/service/dax v1.24.2/go.mod h1:FTMIKMqG/2AiO0P1LSCN6PeY4BNkQcxAzPSpne6oE6w= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.43.1 h1:YYjNTAyPL0425ECmq6Xm48NSXdT6hDVQmLOJZxyhNTM= @@ -361,8 +363,8 @@ github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0/go.mod h1:AxK github.com/aws/rolesanywhere-credential-helper v1.2.0 h1:eLqJvSznH8nJk48dwFc0raWOpbTGgBeNYH3Q8UQFVx4= github.com/aws/rolesanywhere-credential-helper v1.2.0/go.mod h1:YRxmRrAaqbVVXPNH1gHT76nWaMGvpAziHAHw8UwKrpU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.23.0 h1:8n6I3gXzWJB2DxBDnfxgBaSX6oe0d/t10qGz7OKqMCE= -github.com/aws/smithy-go v1.23.0/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= +github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4 h1:Gx4ipHtKfaABSHAVo4Zjo2E4ClKzYqZ2NrPO0gy6qvY= github.com/aws/smithy-go/tracing/smithyoteltracing v1.0.4/go.mod h1:nnwXv9COKyqd4q7jpPrxRaW9L+Qfwb4aGTdZqsIpOho= github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= diff --git a/lib/cloud/aws/policy_statements.go b/lib/cloud/aws/policy_statements.go index 56a7469ac9e1a..00a1ce4bd3dbe 100644 --- a/lib/cloud/aws/policy_statements.go +++ b/lib/cloud/aws/policy_statements.go @@ -507,6 +507,18 @@ func StatementKMSDecrypt(kmsKeysARNs []string) *Statement { } } +// StatementEnableEKSAuditLogs returns the statement that allows fetching EKS +// API server audit logs from CloudWatch Logs. +func StatementAccessGraphAWSSyncEKSAuditLogs() *Statement { + return &Statement{ + Effect: EffectAllow, + Actions: []string{ + "logs:FilterLogEvents", + }, + Resources: []string{"arn:aws:logs:*:*:log-group:/aws/eks/*"}, + } +} + // StatementForAWSIdentityCenterAccess returns AWS IAM policy statement that grants // permissions required for Teleport identity center client. // TODO(sshah): make the roles more granular by restricting resources scoped to diff --git a/lib/config/configuration.go b/lib/config/configuration.go index b316f02f6591b..c70c1844f2fc3 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -307,6 +307,8 @@ type IntegrationConfAccessGraphAWSSync struct { CloudTrailBucketARN string // KMSKeyARNs is the ARN of the KMS key to use for decrypting the Identity Security Activity Center data. KMSKeyARNs []string + // EnableEKSAuditLogs enables collection of EKS audit logs from CloudWatch logs. + EnableEKSAuditLogs bool } // IntegrationConfAccessGraphAzureSync contains the arguments of @@ -1718,11 +1720,18 @@ kubernetes matchers are present`) Region: awsMatcher.CloudTrailLogs.QueueRegion, } } + var eksAuditLogs *types.AccessGraphAWSSyncEKSAuditLogs + if awsMatcher.EKSAuditLogs != nil { + eksAuditLogs = &types.AccessGraphAWSSyncEKSAuditLogs{ + Tags: awsMatcher.EKSAuditLogs.Tags, + } + } tMatcher.AWS = append(tMatcher.AWS, &types.AccessGraphAWSSync{ Regions: regions, AssumeRole: assumeRole, CloudTrailLogs: cloudTrailLogs, + EksAuditLogs: eksAuditLogs, }) } for _, azureMatcher := range fc.Discovery.AccessGraph.Azure { diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index f2a281af6b5c4..c49c9f7518cc1 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -1648,6 +1648,17 @@ type AccessGraphAWSSync struct { // CloudTrailLogs is the configuration for the SQS queue to poll for // CloudTrail logs. CloudTrailLogs *AccessGraphAWSSyncCloudTrailLogs `yaml:"cloud_trail_logs,omitempty"` + // EKSAuditLogs is the configuration for fetching audit logs for EKS + // clusters discovered. + EKSAuditLogs *AccessGraphEKSAuditLogs `yaml:"eks_audit_logs,omitempty"` +} + +// AccessGraphEKSAuditLogs is the configuration for fetching audit logs from +// clusters discovered for access graph. +type AccessGraphEKSAuditLogs struct { + // Tags are AWS EKS tags to match. Clusters that have tags that match these + // will have their audit logs fetched and sent to Access Graph. + Tags map[string]apiutils.Strings `yaml:"tags,omitempty"` } // AccessGraphAzureSync represents the configuration for the Azure AccessGraph Sync service. diff --git a/lib/integrations/awsoidc/accessgraph_sync.go b/lib/integrations/awsoidc/accessgraph_sync.go index 19cd8c9fb21d0..25a251c5a0e7c 100644 --- a/lib/integrations/awsoidc/accessgraph_sync.go +++ b/lib/integrations/awsoidc/accessgraph_sync.go @@ -63,6 +63,9 @@ type AccessGraphAWSIAMConfigureRequest struct { // KMSKeyARNs is the ARN of the KMS key to use for decrypting the Identity Security Activity Center data. KMSKeyARNs []string + // EnableEKSAuditLogs enables collection of EKS audit logs from CloudWatch logs. + EnableEKSAuditLogs bool + // stdout is used to override stdout output in tests. stdout io.Writer } @@ -181,6 +184,9 @@ func ConfigureAccessGraphSyncIAM(ctx context.Context, clt AccessGraphIAMConfigur statements = append(statements, awslib.StatementKMSDecrypt(req.KMSKeyARNs)) } + if req.EnableEKSAuditLogs { + statements = append(statements, awslib.StatementAccessGraphAWSSyncEKSAuditLogs()) + } policy := awslib.NewPolicyDocument( statements..., ) diff --git a/lib/integrations/awsoidc/accessgraph_sync_test.go b/lib/integrations/awsoidc/accessgraph_sync_test.go index 31a27cf0f3e40..884039410e782 100644 --- a/lib/integrations/awsoidc/accessgraph_sync_test.go +++ b/lib/integrations/awsoidc/accessgraph_sync_test.go @@ -286,6 +286,7 @@ func TestAccessGraphAWSIAMConfigWithActivityCenterOuput(t *testing.T) { SQSQueueURL: "https://sqs.us-west-2.amazonaws.com/123456789012/my-queue", CloudTrailBucketARN: "arn:aws:s3:::my-cloudtrail-bucket", KMSKeyARNs: []string{"arn:aws:kms:us-west-2:123456789012:key/my-kms-key"}, + EnableEKSAuditLogs: true, } clt := mockAccessGraphAWSAMConfigClient{ CallerIdentityGetter: mockSTSClient{accountID: req.AccountID}, diff --git a/lib/integrations/awsoidc/testdata/TestAccessGraphAWSIAMConfigWithActivityCenterOuput.golden b/lib/integrations/awsoidc/testdata/TestAccessGraphAWSIAMConfigWithActivityCenterOuput.golden index e4b441291c986..18a7f43810eb4 100644 --- a/lib/integrations/awsoidc/testdata/TestAccessGraphAWSIAMConfigWithActivityCenterOuput.golden +++ b/lib/integrations/awsoidc/testdata/TestAccessGraphAWSIAMConfigWithActivityCenterOuput.golden @@ -99,6 +99,11 @@ PutRolePolicy: { "kms:GenerateDataKeyWithoutPlaintext" ], "Resource": "arn:aws:kms:us-west-2:123456789012:key/my-kms-key" + }, + { + "Effect": "Allow", + "Action": "logs:FilterLogEvents", + "Resource": "arn:aws:logs:*:*:log-group:/aws/eks/*" } ] }, diff --git a/lib/srv/discovery/access_graph_aws.go b/lib/srv/discovery/access_graph_aws.go index fa0cc0e583a17..0a7c7ce5dccc7 100644 --- a/lib/srv/discovery/access_graph_aws.go +++ b/lib/srv/discovery/access_graph_aws.go @@ -73,10 +73,17 @@ const ( // errNoAccessGraphFetchers is returned when there are no TAG fetchers. var errNoAccessGraphFetchers = errors.New("no Access Graph fetchers") -func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources *aws_sync.Resources, stream accessgraphv1alpha.AccessGraphService_AWSEventsStreamClient, features aws_sync.Features) error { +func (s *Server) reconcileAccessGraph( + ctx context.Context, + currentTAGResources *aws_sync.Resources, + stream accessgraphv1alpha.AccessGraphService_AWSEventsStreamClient, + features aws_sync.Features, + eksAuditLogWatcher *eksAuditLogWatcher, +) error { type fetcherResult struct { - result *aws_sync.Resources - err error + fetcher *aws_sync.Fetcher + result *aws_sync.Resources + err error } allFetchers := s.getAllAWSSyncFetchers() @@ -88,6 +95,8 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources * if err := push(stream, upsert, toDel); err != nil { s.Log.ErrorContext(ctx, "Error pushing empty resources to TAGs", "error", err) } + // No clusters to fetch eks audit logs for. + eksAuditLogWatcher.Reconcile(ctx, nil) return trace.Wrap(errNoAccessGraphFetchers) } @@ -110,21 +119,39 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources * <-tokens }() result, err := fetcher.Poll(ctx, features) - resultsC <- fetcherResult{result, trace.Wrap(err)} + resultsC <- fetcherResult{fetcher, result, trace.Wrap(err)} }() } results := make([]*aws_sync.Resources, 0, len(allFetchers)) + auditLogClusters := make([]eksAuditLogCluster, 0, len(allFetchers)) errs := make([]error, 0, len(allFetchers)) // Collect the results from all fetchers. // Each fetcher can return an error and a result. for i := 0; i < len(allFetchers); i++ { fetcherResult := <-resultsC - if fetcherResult.err != nil { - errs = append(errs, fetcherResult.err) + fetcher, result, err := fetcherResult.fetcher, fetcherResult.result, fetcherResult.err + if err != nil { + errs = append(errs, err) } - if fetcherResult.result != nil { - results = append(results, fetcherResult.result) + if result == nil { + continue + } + results = append(results, result) + // If the fetcher is configured for EKS audit logs, see if any + // EKS clusters match the configured tags. + if fetcher.EKSAuditLogs == nil { + continue + } + for _, cluster := range result.EKSClusters { + clusterTags := make(map[string]string, len(cluster.Tags)) + for _, tag := range cluster.Tags { + clusterTags[tag.GetKey()] = tag.GetValue().GetValue() + } + match, _, _ := services.MatchLabels(fetcher.EKSAuditLogs.Tags, clusterTags) + if match { + auditLogClusters = append(auditLogClusters, eksAuditLogCluster{fetcher, cluster}) + } } } // Aggregate all errors into a single error. @@ -137,6 +164,10 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources * upsert, toDel := aws_sync.ReconcileResults(currentTAGResources, result) pushErr := push(stream, upsert, toDel) + // Send the updated list of clusters requiring audit logs to the fetcher. + // The fetcher reconciles this list against the last set sent. + eksAuditLogWatcher.Reconcile(ctx, auditLogClusters) + for _, fetcher := range allFetchers { s.tagSyncStatus.syncFinished(fetcher, pushErr, s.clock.Now()) } @@ -431,11 +462,16 @@ func (s *Server) initializeAndWatchAccessGraph(ctx context.Context, reloadCh <-c } s.Log.InfoContext(ctx, "Access graph service poll interval", "poll_interval", tickerInterval) + // Start the EKS audit log watcher that keeps track of the EKS audit log + // fetchers and updates them when Reconcile is called. + eksAuditLogWatcher := newEKSAuditLogWatcher(client, s.Log) + go eksAuditLogWatcher.Run(ctx) + currentTAGResources := &aws_sync.Resources{} timer := time.NewTimer(tickerInterval) defer timer.Stop() for { - err := s.reconcileAccessGraph(ctx, currentTAGResources, stream, features) + err := s.reconcileAccessGraph(ctx, currentTAGResources, stream, features, eksAuditLogWatcher) if errors.Is(err, errNoAccessGraphFetchers) { // no fetchers, no need to continue. // we will wait for the config to change and re-evaluate the fetchers @@ -514,7 +550,8 @@ func (s *Server) initTAGAWSWatchers(ctx context.Context, cfg *Config) error { continue } // reset the currentTAGResources to force a full sync - if err := s.initializeAndWatchAccessGraph(ctx, reloadCh); errors.Is(err, errTAGFeatureNotEnabled) { + err := s.initializeAndWatchAccessGraph(ctx, reloadCh) + if errors.Is(err, errTAGFeatureNotEnabled) { s.Log.WarnContext(ctx, "Access Graph specified in config, but the license does not include Teleport Identity Security. Access graph sync will not be enabled.") break } else if err != nil { @@ -582,6 +619,10 @@ func (s *Server) accessGraphAWSFetchersFromMatchers(ctx context.Context, matcher ExternalID: awsFetcher.AssumeRole.ExternalID, } } + var eksAuditLogs *aws_sync.EKSAuditLogs + if awsFetcher.EksAuditLogs != nil { + eksAuditLogs = &aws_sync.EKSAuditLogs{Tags: awsFetcher.EksAuditLogs.Tags} + } fetcher, err := aws_sync.NewFetcher( ctx, aws_sync.Config{ @@ -593,6 +634,7 @@ func (s *Server) accessGraphAWSFetchersFromMatchers(ctx context.Context, matcher Integration: awsFetcher.Integration, DiscoveryConfigName: discoveryConfigName, Log: s.Log, + EKSAuditLogs: eksAuditLogs, }, ) if err != nil { @@ -854,7 +896,7 @@ func (s *Server) receiveTAGResumeFromStream(ctx context.Context, stream accessgr return nil } -func consumeTillErr(stream accessgraphv1alpha.AccessGraphService_AWSCloudTrailStreamClient) error { +func consumeTillErr[Req any, Res any](stream grpc.BidiStreamingClient[Req, Res]) error { for { _, err := stream.Recv() if err != nil { diff --git a/lib/srv/discovery/eks_audit_log_fetcher.go b/lib/srv/discovery/eks_audit_log_fetcher.go new file mode 100644 index 0000000000000..83a8f778d6a61 --- /dev/null +++ b/lib/srv/discovery/eks_audit_log_fetcher.go @@ -0,0 +1,214 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package discovery + +import ( + "context" + "errors" + "log/slog" + "time" + + cwltypes "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs/types" + "github.com/gravitational/trace" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/types/known/structpb" + "google.golang.org/protobuf/types/known/timestamppb" + + accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha" +) + +// cloudwatchlogFetcher fetches cloudwatch logs for a given cluster, starting +// at the given cursur position. This interface exists so tests can plug in a +// fake fetcher and not need to stub out deeper AWS interfaces. +type cloudwatchlogFetcher interface { + FetchEKSAuditLogs( + ctx context.Context, + cluster *accessgraphv1alpha.AWSEKSClusterV1, + cursor *accessgraphv1alpha.KubeAuditLogCursor, + ) ([]cwltypes.FilteredLogEvent, error) +} + +// eksAuditLogFetcher is a fetcher for EKS audit logs for a single cluster, +// fetching the logs from AWS Cloud Watch Logs. It uses the grpc stream +// to initiate the stream and possibly receive a resume state used to +// synchronize the start point with a previous run fetching the logs. +type eksAuditLogFetcher struct { + fetcher cloudwatchlogFetcher + cluster *accessgraphv1alpha.AWSEKSClusterV1 + stream accessgraphv1alpha.AccessGraphService_KubeAuditLogStreamClient + log *slog.Logger +} + +func newEKSAuditLogFetcher( + fetcher cloudwatchlogFetcher, + cluster *accessgraphv1alpha.AWSEKSClusterV1, + stream accessgraphv1alpha.AccessGraphService_KubeAuditLogStreamClient, + log *slog.Logger, +) *eksAuditLogFetcher { + return &eksAuditLogFetcher{ + fetcher: fetcher, + cluster: cluster, + stream: stream, + log: log, + } +} + +// Run continuously polls AWS Cloud Watch Logs for Kubernetes apiserver +// audit logs for the configured cluster. It feeds the logs retrieved to the +// configured grpc stream, running until the given context is canceled. +func (f *eksAuditLogFetcher) Run(ctx context.Context) error { + f.log = f.log.With("cluster", f.cluster.Arn) + + cursor := initialCursor(f.cluster) + if err := f.sendTAGKubeAuditLogNewStream(ctx, cursor); err != nil { + return trace.Wrap(err) + } + + cursor, err := f.receiveTAGKubeAuditLogResume(ctx) + if err != nil { + return trace.Wrap(err) + } + + for ctx.Err() == nil { + var events []*structpb.Struct + events, cursor = f.fetchLogs(ctx, cursor) + + if len(events) == 0 { + select { + case <-ctx.Done(): + case <-time.After(logPollInterval): + } + continue + } + + if err := f.sendTAGKubeAuditLogEvents(ctx, events, cursor); err != nil { + return trace.Wrap(err) + } + + f.log.DebugContext(ctx, "Sent KubeAuditLogEvents", "count", len(events), + "cursor_time", cursor.GetLastEventTime().AsTime()) + } + return trace.Wrap(ctx.Err()) +} + +// fetchLogs fetches a batch of logs from AWS Cloud Watch Logs after the given +// cursor position and unmarshals them into the protobuf Struct well-known +// type. +// +// It returns the fetched log entries and a new cursor for the next call. If an +// error occurs, it is logged, and the function returns nil logs and the +// original input cursor. This allows the caller to retry the operation. +func (f *eksAuditLogFetcher) fetchLogs(ctx context.Context, cursor *accessgraphv1alpha.KubeAuditLogCursor) ([]*structpb.Struct, *accessgraphv1alpha.KubeAuditLogCursor) { + awsEvents, err := f.fetcher.FetchEKSAuditLogs(ctx, f.cluster, cursor) + if err != nil { + if !errors.Is(err, context.Canceled) { + f.log.ErrorContext(ctx, "Failed to fetch EKS audit logs", "error", err) + } + return nil, cursor + } + + if len(awsEvents) == 0 { + return nil, cursor + } + + events := []*structpb.Struct{} + var awsEvent cwltypes.FilteredLogEvent + for _, awsEvent = range awsEvents { + // TODO(camscale): Track event sizes and don't go over protobuf message + // limit. newAccessGraphClient() sets the limit to 50MB + event := &structpb.Struct{} + m := protojson.UnmarshalOptions{} + err = m.Unmarshal([]byte(*awsEvent.Message), event) + if err != nil { + f.log.ErrorContext(ctx, "failed to protojson.Unmarshal", "error", err) + continue + } + events = append(events, event) + } + cursor = cursorFromEvent(f.cluster, awsEvent) + + return events, cursor +} + +func (f *eksAuditLogFetcher) sendTAGKubeAuditLogNewStream(ctx context.Context, cursor *accessgraphv1alpha.KubeAuditLogCursor) error { + err := f.stream.Send( + &accessgraphv1alpha.KubeAuditLogStreamRequest{ + Action: &accessgraphv1alpha.KubeAuditLogStreamRequest_NewStream{ + NewStream: &accessgraphv1alpha.KubeAuditLogNewStream{Initial: cursor}, + }, + }, + ) + if err != nil { + err = consumeTillErr(f.stream) + f.log.ErrorContext(ctx, "Failed to send accessgraph.KubeAuditLogNewStream", "error", err) + return trace.Wrap(err) + } + return nil +} + +func (f *eksAuditLogFetcher) receiveTAGKubeAuditLogResume(ctx context.Context) (*accessgraphv1alpha.KubeAuditLogCursor, error) { + msg, err := f.stream.Recv() + if err != nil { + return nil, trace.Wrap(err, "failed to receive KubeAuditLogStream resume state") + } + + state := msg.GetResumeState() + if state == nil { + return nil, trace.BadParameter("AccessGraphService.KubeAuditLogStream did not return KubeAuditLogResumeState message") + } + + f.log.InfoContext(ctx, "KubeAuditLogResumeState received", "state", state) + return state.Cursor, nil +} + +func (f *eksAuditLogFetcher) sendTAGKubeAuditLogEvents(ctx context.Context, events []*structpb.Struct, cursor *accessgraphv1alpha.KubeAuditLogCursor) error { + err := f.stream.Send( + &accessgraphv1alpha.KubeAuditLogStreamRequest{ + Action: &accessgraphv1alpha.KubeAuditLogStreamRequest_Events{ + Events: &accessgraphv1alpha.KubeAuditLogEvents{Events: events, Cursor: cursor}, + }, + }, + ) + if err != nil { + err = consumeTillErr(f.stream) + f.log.ErrorContext(ctx, "Failed to send accessgraph.KubeAuditLogEvents", "error", err) + return trace.Wrap(err) + } + return nil +} + +func cursorFromEvent(cluster *accessgraphv1alpha.AWSEKSClusterV1, event cwltypes.FilteredLogEvent) *accessgraphv1alpha.KubeAuditLogCursor { + return &accessgraphv1alpha.KubeAuditLogCursor{ + LogSource: accessgraphv1alpha.KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_EKS, + ClusterId: cluster.Arn, + EventId: *event.EventId, + LastEventTime: timestamppb.New(time.UnixMilli(*event.Timestamp)), + } +} + +// initialCursor returns a cursor for a EKS cluster that we have not previously +// retrieved logs from, so there is no resume state. The cursor is set to +// have logs retrieved back a standard amount of time. +func initialCursor(cluster *accessgraphv1alpha.AWSEKSClusterV1) *accessgraphv1alpha.KubeAuditLogCursor { + return &accessgraphv1alpha.KubeAuditLogCursor{ + LogSource: accessgraphv1alpha.KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_EKS, + ClusterId: cluster.Arn, + LastEventTime: timestamppb.New(time.Now().UTC().Add(-initialLogBacklog)), + } +} diff --git a/lib/srv/discovery/eks_audit_log_fetcher_test.go b/lib/srv/discovery/eks_audit_log_fetcher_test.go new file mode 100644 index 0000000000000..9bb4bba7fb833 --- /dev/null +++ b/lib/srv/discovery/eks_audit_log_fetcher_test.go @@ -0,0 +1,247 @@ +//go:build go1.24 && enablesynctest + +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package discovery + +import ( + "context" + "errors" + "fmt" + "log/slog" + "testing" + "testing/synctest" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + cwltypes "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs/types" + "github.com/stretchr/testify/require" + + accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha" + "github.com/gravitational/teleport/lib/utils/testutils/grpctest" +) + +type eksAuditLogFetcherFixture struct { + ctx context.Context + cancel context.CancelFunc + server kalsServer + fetcherErr error + cluster *accessgraphv1alpha.AWSEKSClusterV1 + fakeLogFetcher *fakeCloudWatchLogFetcher +} + +// Start the fixture. Must be called inside synctest bubble. +func (f *eksAuditLogFetcherFixture) Start(t *testing.T) { + t.Helper() + + f.ctx, f.cancel = context.WithCancel(t.Context()) + tester := grpctest.NewGRPCTester[kalsRequest, kalsResponse](f.ctx) + f.server = tester.NewServerStream() + logger := slog.New(slog.DiscardHandler) + f.fakeLogFetcher = newFakeCloudWatchLogFetcher() + f.cluster = &accessgraphv1alpha.AWSEKSClusterV1{ + Name: "cluster-name", + Arn: "cluster-arn", + } + logFetcher := newEKSAuditLogFetcher(f.fakeLogFetcher, f.cluster, tester.NewClientStream(), logger) + go func() { f.fetcherErr = logFetcher.Run(f.ctx) }() +} + +// End the fixture. Must be called inside synctest bubble. +func (f *eksAuditLogFetcherFixture) End(t *testing.T) { + t.Helper() + f.cancel() + synctest.Wait() + require.ErrorIs(t, f.fetcherErr, context.Canceled) +} + +func (f *eksAuditLogFetcherFixture) testInitializeNewStream(t *testing.T) { + t.Helper() + + // Wait for a NewStream action, and verify it contains what we expect + msg, err := f.server.Recv() + require.NoError(t, err) + newStream := msg.GetNewStream() + require.NotNil(t, newStream) + cursor := newStream.GetInitial() + require.NotNil(t, cursor) + require.Equal(t, accessgraphv1alpha.KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_EKS, cursor.GetLogSource()) + require.Equal(t, f.cluster.GetArn(), cursor.GetClusterId()) + + // Send back a ResumeState + err = f.server.Send(newKubeAuditLogResponseResumeState(cursor)) + require.NoError(t, err) +} + +// TestEKSAuditLogFetcher_NewStream_Unknown tests that when a new log stream +// is set up for a cluster, logs start being fetched from the cursor returned +// by the grpc service. +func TestEKSAuditLogFetcher_NewStream(t *testing.T) { + synctest.Run(func() { + f := &eksAuditLogFetcherFixture{} + f.Start(t) + f.testInitializeNewStream(t) + f.End(t) + }) +} + +func TestEKSAuditLogFetcher_Batching(t *testing.T) { + synctest.Run(func() { + startTime := time.Now().UTC() + logEpoch := startTime.Add(-7 * 24 * time.Hour) + f := &eksAuditLogFetcherFixture{} + f.Start(t) + f.testInitializeNewStream(t) + + f.fakeLogFetcher.events <- nil + // Wait for a polling loop to occur. As there are no logs left, + // the time should now be the synctest epoch plus the poll interval + time.Sleep(logPollInterval) + synctest.Wait() + require.Equal(t, startTime.Add(logPollInterval), time.Now().UTC()) + + // Wait for an Events action with the log listed. Verify the log and cursor. + f.fakeLogFetcher.events <- []cwltypes.FilteredLogEvent{ + makeEvent(logEpoch, 0, "{}"), + makeEvent(logEpoch.Add(time.Second), 1, `{"log": "value"}`), + } + msg, err := f.server.Recv() + require.NoError(t, err) + events := msg.GetEvents() + require.NotNil(t, events) + require.Len(t, events.GetEvents(), 2) + require.Empty(t, events.GetEvents()[0].GetFields()) + require.Len(t, events.GetEvents()[1].GetFields(), 1) + cursor := events.GetCursor() + require.NotNil(t, cursor) + require.Equal(t, accessgraphv1alpha.KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_EKS, cursor.GetLogSource()) + require.Equal(t, f.cluster.GetArn(), cursor.GetClusterId()) + require.Equal(t, "event-id-1", cursor.GetEventId()) + require.Equal(t, logEpoch.Add(time.Second), cursor.GetLastEventTime().AsTime()) + + f.fakeLogFetcher.events <- []cwltypes.FilteredLogEvent{ + makeEvent(logEpoch.Add(time.Second), 2, `{"log": "value2"}`), + makeEvent(logEpoch.Add(2*time.Second), 3, `{}`), + } + msg, err = f.server.Recv() + require.NoError(t, err) + events = msg.GetEvents() + require.NotNil(t, events) + require.Len(t, events.GetEvents(), 2) + require.Len(t, events.GetEvents()[0].GetFields(), 1) + require.Empty(t, events.GetEvents()[1].GetFields()) + cursor = events.GetCursor() + require.NotNil(t, cursor) + require.Equal(t, accessgraphv1alpha.KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_EKS, cursor.GetLogSource()) + require.Equal(t, f.cluster.GetArn(), cursor.GetClusterId()) + require.Equal(t, "event-id-3", cursor.GetEventId()) + require.Equal(t, logEpoch.Add(2*time.Second), cursor.GetLastEventTime().AsTime()) + + f.End(t) + }) +} + +func TestEKSAuditLogFetcher_ContinueOnError(t *testing.T) { + synctest.Run(func() { + startTime := time.Now().UTC() + logEpoch := startTime.Add(-7 * 24 * time.Hour) + f := &eksAuditLogFetcherFixture{} + f.Start(t) + f.testInitializeNewStream(t) + + f.fakeLogFetcher.err <- errors.New("oh noes. something went wrong") + // Wait for a polling loop to occur. As there are no logs left, + // the time should now be the synctest epoch plus the poll interval + time.Sleep(logPollInterval) + synctest.Wait() + require.Equal(t, startTime.Add(logPollInterval), time.Now().UTC()) + + // Wait for an Events action with the log listed. Verify the log and cursor. + f.fakeLogFetcher.events <- []cwltypes.FilteredLogEvent{ + makeEvent(logEpoch, 0, "{}"), + makeEvent(logEpoch.Add(time.Second), 1, `{"log": "value"}`), + } + msg, err := f.server.Recv() + require.NoError(t, err) + events := msg.GetEvents() + require.NotNil(t, events) + require.Len(t, events.GetEvents(), 2) + require.Empty(t, events.GetEvents()[0].GetFields()) + require.Len(t, events.GetEvents()[1].GetFields(), 1) + cursor := events.GetCursor() + require.NotNil(t, cursor) + require.Equal(t, accessgraphv1alpha.KubeAuditLogCursor_KUBE_AUDIT_LOG_SOURCE_EKS, cursor.GetLogSource()) + require.Equal(t, f.cluster.GetArn(), cursor.GetClusterId()) + require.Equal(t, "event-id-1", cursor.GetEventId()) + require.Equal(t, logEpoch.Add(time.Second), cursor.GetLastEventTime().AsTime()) + + f.End(t) + }) +} + +func newKubeAuditLogResponseResumeState(cursor *accessgraphv1alpha.KubeAuditLogCursor) *kalsResponse { + return &kalsResponse{ + State: &accessgraphv1alpha.KubeAuditLogStreamResponse_ResumeState{ + ResumeState: &accessgraphv1alpha.KubeAuditLogResumeState{ + Cursor: cursor, + }, + }, + } +} + +func makeEvent(t time.Time, id int, msg string) cwltypes.FilteredLogEvent { + return cwltypes.FilteredLogEvent{ + EventId: aws.String(fmt.Sprintf("event-id-%d", id)), + IngestionTime: aws.Int64(t.UnixMilli()), + Timestamp: aws.Int64(t.UnixMilli()), + LogStreamName: aws.String("kube-apiserver-audit-12345678"), + Message: aws.String(msg), + } +} + +func newFakeCloudWatchLogFetcher() *fakeCloudWatchLogFetcher { + return &fakeCloudWatchLogFetcher{ + events: make(chan []cwltypes.FilteredLogEvent), + err: make(chan error), + } +} + +// fakeCloudWatchLogFetcher is a cloudwatch log fetcher that waits on channels +// for the data to return. This allows the unit under test to rendezvous with +// the tests, allowing the tests to advance the state of the fetcher as it +// needs. +type fakeCloudWatchLogFetcher struct { + events chan []cwltypes.FilteredLogEvent + err chan error +} + +func (f *fakeCloudWatchLogFetcher) FetchEKSAuditLogs( + ctx context.Context, + cluster *accessgraphv1alpha.AWSEKSClusterV1, + cursor *accessgraphv1alpha.KubeAuditLogCursor, +) ([]cwltypes.FilteredLogEvent, error) { + select { + case events := <-f.events: + return events, nil + case err := <-f.err: + return nil, err + case <-ctx.Done(): + return nil, ctx.Err() + } +} diff --git a/lib/srv/discovery/eks_audit_log_watcher.go b/lib/srv/discovery/eks_audit_log_watcher.go new file mode 100644 index 0000000000000..55e845a48baf3 --- /dev/null +++ b/lib/srv/discovery/eks_audit_log_watcher.go @@ -0,0 +1,266 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package discovery + +import ( + "context" + "errors" + "iter" + "log/slog" + "time" + + "github.com/gravitational/trace" + + accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha" + aws_sync "github.com/gravitational/teleport/lib/srv/discovery/fetchers/aws-sync" +) + +const ( + // initialLogBacklog is how far back to start retrieving EKS audit logs + // for newly discovered clusters. + // TODO(camscale): define in config. + initialLogBacklog = 7 * 24 * time.Hour + + // logPollInterval is the amount of time to sleep between fetching audit + // logs from Cloud Watch Logs for a cluster. + // TODO(camscale): perhaps define in config. + logPollInterval = 30 * time.Second +) + +// eksAuditLogCluster is a cluster for which audit logs should be fetched and +// the fetcher to use to do that. It is sent over a channel as a slice from +// the AWS resource watcher (access_graph_aws.go) to the EKS audit log watcher +// created here. For each one of these received, an asynchronous log fetcher +// is spawned to fetch Kubernetes apiserver audit logs from Cloud Watch Logs +// and sent to the grpc AccessGraphService via the KubeAuditLogStream rpc. +type eksAuditLogCluster struct { + fetcher *aws_sync.Fetcher + cluster *accessgraphv1alpha.AWSEKSClusterV1 +} + +type eksAuditLogFetcherRunner interface { + Run(context.Context) error +} + +// eksAuditLogWatcher is a watcher that waits for notifications on a channel +// indicating what EKS clusters should have audit logs fetched, and reconciles +// that against what is currently being fetched. Fetchers are started and +// stopped in response to this reconcilliation. +type eksAuditLogWatcher struct { + client accessgraphv1alpha.AccessGraphServiceClient + log *slog.Logger + auditLogClustersCh chan []eksAuditLogCluster + + // Fetchers tracks the cluster IDs (ARN) of the clusters for which we + // have a fetcher running. The value is a CancelFunc that is called to + // stop the fetcher. + fetchers map[string]context.CancelFunc + completedCh chan fetcherCompleted + + // newFetcher is a function used to construct a new fetcher. It exists + // so tests can override it to not create real fetchers. + newFetcher func( + *aws_sync.Fetcher, + *accessgraphv1alpha.AWSEKSClusterV1, + accessgraphv1alpha.AccessGraphService_KubeAuditLogStreamClient, + *slog.Logger, + ) eksAuditLogFetcherRunner +} + +func newEKSAuditLogWatcher( + client accessgraphv1alpha.AccessGraphServiceClient, + logger *slog.Logger, +) *eksAuditLogWatcher { + return &eksAuditLogWatcher{ + client: client, + log: logger, + auditLogClustersCh: make(chan []eksAuditLogCluster), + fetchers: make(map[string]context.CancelFunc), + completedCh: make(chan fetcherCompleted), + } +} + +// fetcherCompleted captures the result of a completed eksAuditLogFetcher. +type fetcherCompleted struct { + clusterID string + err error +} + +// Run starts a watcher by creating a KubeAuditLogStream on its grpc client. It +// negotiates a configuration (currently a no-op) and starts a main loop +// waiting for a list of clusters that it should run log fetchers for. As these +// lists of clusters arrives, it reconciles it against the running log fetchers +// and starts/stops log fetchers as required to match the given list. It +// completes when the given context is done. +// +// If any errors occur initializing the grpc stream, it is returned and the +// main loop is not run. +func (w *eksAuditLogWatcher) Run(ctx context.Context) error { + w.log.InfoContext(ctx, "EKS Audit Log Watcher started") + defer w.log.InfoContext(ctx, "EKS Audit Log Watcher completed") + + stream, err := w.client.KubeAuditLogStream(ctx) + if err != nil { + w.log.ErrorContext(ctx, "Failed to get access graph service KubeAuditLogStream", "error", err) + return trace.Wrap(err) + } + + config := &accessgraphv1alpha.KubeAuditLogConfig{} + if err := sendTAGKubeAuditLogConfig(ctx, stream, config); err != nil { + w.log.ErrorContext(ctx, "Failed to send access graph config", "error", err) + return trace.Wrap(err) + } + + config, err = receiveTAGKubeAuditLogConfig(ctx, stream) + if err != nil { + w.log.ErrorContext(ctx, "Failed to receive access graph config", "error", err) + return trace.Wrap(err) + } + w.log.InfoContext(ctx, "KubeAuditLogConfig received", "config", config) + + // Loop waiting for EKS clusters we need to fetch audit logs for on + // s.awsKubeAuditLogClustersCh channel (from the resource syncer). + // Reconcile that list of clusters against what we know and start/stop + // any log fetchers necessary. + for { + select { + case clusters := <-w.auditLogClustersCh: + w.reconcile(ctx, clusters, stream) + case completed := <-w.completedCh: + w.complete(ctx, completed) + case <-ctx.Done(): + return trace.Wrap(ctx.Err()) + } + } +} + +// Reconcile triggers a reconcilliation of currently running fetchers against +// the given slice of clusters. The reconcilliation will stop any fetchers for +// clusters not in the slice and start any fetchers for clusters in the slice +// that are not running. +// +// If the given context is done before the clusters can be sent to the +// reconcilliation goroutine, the context's error will be returned. +func (w *eksAuditLogWatcher) Reconcile(ctx context.Context, clusters []eksAuditLogCluster) error { + select { + case <-ctx.Done(): + return trace.Wrap(ctx.Err()) + case w.auditLogClustersCh <- clusters: + } + + return nil +} + +// reconcile compares the given slice of clusters against the currently running +// log fetchers and stops any running fetchers not in the cluster slice and +// starts a log fetcher for any cluster in the slice that does not have a +// running log fetcher. +// +// Log fetchers that are started are initialized with the given grpc stream +// over which they should send their audit logs. +func (w *eksAuditLogWatcher) reconcile(ctx context.Context, clusters []eksAuditLogCluster, stream accessgraphv1alpha.AccessGraphService_KubeAuditLogStreamClient) { + w.log.DebugContext(ctx, "Reconciling EKS audit log clusters", "new_count", len(clusters)) + + // Make a map of the discovered clusters, keyed by ARN so we can compare against + // the existing clusters we are fetching audit logs for. + discoveredClusters := make(map[string]eksAuditLogCluster) + for _, discovered := range clusters { + discoveredClusters[discovered.cluster.Arn] = discovered + } + // Stop any fetchers for clusters we are running fetcher for that discovery did not return. + for arn, fetcherCancel := range mapDifference(w.fetchers, discoveredClusters) { + w.log.InfoContext(ctx, "Stopping eksKubeAuditLogFetcher", "cluster", arn) + fetcherCancel() + // cleanup will happen when the fetcher finishes and is put on the completed channel. + } + // Start any new fetchers for clusters we are not running that discovery returned. + for arn, discovered := range mapDifference(discoveredClusters, w.fetchers) { + w.log.InfoContext(ctx, "Starting eksKubeAuditLogFetcher", "cluster", arn) + ctx, cancel := context.WithCancel(ctx) + var logFetcher eksAuditLogFetcherRunner + if w.newFetcher == nil { + logFetcher = newEKSAuditLogFetcher(discovered.fetcher, discovered.cluster, stream, w.log) + } else { + // the pluggable newFetcher is for testing purposes + logFetcher = w.newFetcher(discovered.fetcher, discovered.cluster, stream, w.log) + } + w.fetchers[arn] = cancel + go func() { + err := logFetcher.Run(ctx) + select { + case w.completedCh <- fetcherCompleted{arn, err}: + case <-ctx.Done(): + } + }() + } +} + +// complete cleans up the maintained list of running log fetchers, removing the +// given completed fetcher, and logs the completion status of the fetcher. +func (w *eksAuditLogWatcher) complete(ctx context.Context, completed fetcherCompleted) { + arn := completed.clusterID + if completed.err != nil && !errors.Is(completed.err, context.Canceled) { + w.log.ErrorContext(ctx, "eksKubeAuditLogFetcher completed with error", "cluster", arn, "error", completed.err) + } else { + w.log.InfoContext(ctx, "eksKubeAuditLogFetcher completed", "cluster", arn) + } + delete(w.fetchers, arn) +} + +// mapDifference yields all keys and values of m1 where the key is not in m2. It +// can be considered the set operation "mapDifference" - m1-m2, yielding all +// elements of m1 not in m2. +func mapDifference[K comparable, V1 any, V2 any](m1 map[K]V1, m2 map[K]V2) iter.Seq2[K, V1] { + return func(yield func(K, V1) bool) { + for k, v := range m1 { + if _, ok := m2[k]; !ok { + if !yield(k, v) { + return + } + } + } + } +} + +func sendTAGKubeAuditLogConfig(ctx context.Context, stream accessgraphv1alpha.AccessGraphService_KubeAuditLogStreamClient, config *accessgraphv1alpha.KubeAuditLogConfig) error { + err := stream.Send( + &accessgraphv1alpha.KubeAuditLogStreamRequest{ + Action: &accessgraphv1alpha.KubeAuditLogStreamRequest_Config{Config: config}, + }, + ) + if err != nil { + err = consumeTillErr(stream) + return trace.Wrap(err) + } + return nil +} + +func receiveTAGKubeAuditLogConfig(ctx context.Context, stream accessgraphv1alpha.AccessGraphService_KubeAuditLogStreamClient) (*accessgraphv1alpha.KubeAuditLogConfig, error) { + msg, err := stream.Recv() + if err != nil { + return nil, trace.Wrap(err, "failed to receive KubeAuditLogStream config") + } + + config := msg.GetConfig() + if config == nil { + return nil, trace.BadParameter("AccessGraphService.KubeAuditLogStream did not return KubeAuditLogConfig message") + } + + return config, nil +} diff --git a/lib/srv/discovery/eks_audit_log_watcher_test.go b/lib/srv/discovery/eks_audit_log_watcher_test.go new file mode 100644 index 0000000000000..aebb6fa093656 --- /dev/null +++ b/lib/srv/discovery/eks_audit_log_watcher_test.go @@ -0,0 +1,212 @@ +//go:build go1.24 && enablesynctest + +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package discovery + +import ( + "context" + "log/slog" + "testing" + "testing/synctest" + + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + + accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha" + aws_sync "github.com/gravitational/teleport/lib/srv/discovery/fetchers/aws-sync" + "github.com/gravitational/teleport/lib/utils/testutils/grpctest" +) + +type ( + kalsRequest = accessgraphv1alpha.KubeAuditLogStreamRequest + kalsResponse = accessgraphv1alpha.KubeAuditLogStreamResponse + kalsClient = grpc.BidiStreamingClient[kalsRequest, kalsResponse] + kalsServer = grpc.BidiStreamingServer[kalsRequest, kalsResponse] +) + +func TestEKSAuditLogWatcher_Init(t *testing.T) { + synctest.Run(func() { + ctx, cancel := context.WithCancel(t.Context()) + + client := newFakeKubeAuditLogClient(ctx) + watcher := newEKSAuditLogWatcher(client, slog.New(slog.DiscardHandler)) + var err error + go func() { err = watcher.Run(ctx) }() + + // Receive a config request. + req, err := client.serverStream.Recv() + require.NoError(t, err) + require.NotNil(t, req.GetConfig()) + + // Send back a config response with the config we received. + err = client.serverStream.Send(newKubeAuditLogResponseConfig(req.GetConfig())) + require.NoError(t, err) + + cancel() + synctest.Wait() + require.ErrorIs(t, err, context.Canceled) + }) +} + +func TestEKSAuditLogWatcher_Reconcile(t *testing.T) { + synctest.Run(func() { + ctx, cancel := context.WithCancel(t.Context()) + + fetcherTracker := newFakeFetcherTracker() + client := newFakeKubeAuditLogClient(ctx) + watcher := newEKSAuditLogWatcher(client, slog.New(slog.DiscardHandler)) + watcher.newFetcher = fetcherTracker.newFetcher + var err error + go func() { err = watcher.Run(ctx) }() + + // Receive a config request. + req, err := client.serverStream.Recv() + require.NoError(t, err) + require.NotNil(t, req.GetConfig()) + + // Send back a config response with the config we received. + err = client.serverStream.Send(newKubeAuditLogResponseConfig(req.GetConfig())) + require.NoError(t, err) + + // Send a single cluster1 to the watcher to reconcile + cluster1 := &accessgraphv1alpha.AWSEKSClusterV1{Arn: "test-arn"} + fetcher1 := &aws_sync.Fetcher{} + watcher.Reconcile(ctx, []eksAuditLogCluster{{fetcher1, cluster1}}) + synctest.Wait() + + // Verify that a fetcher was started. + f1, ok := fetcherTracker.fetchers["test-arn"] + require.True(t, ok, "eksAuditLogFetcher not in fetcherTracker") + require.True(t, f1.runCalled, "fetcher Run() was not called") + require.Same(t, fetcher1, f1.fetcher) + require.Same(t, cluster1, f1.cluster) + require.Len(t, fetcherTracker.fetchers, 1) + require.Equal(t, 1, fetcherTracker.newCount) + + // Add another cluster + cluster2 := &accessgraphv1alpha.AWSEKSClusterV1{Arn: "test-arn2"} + fetcher2 := &aws_sync.Fetcher{} + watcher.Reconcile(ctx, []eksAuditLogCluster{{fetcher1, cluster1}, {fetcher2, cluster2}}) + synctest.Wait() + + // Verify that a fetcher was started. + f2, ok := fetcherTracker.fetchers["test-arn2"] + require.True(t, ok, "eksAuditLogFetcher not in fetcherTracker") + require.True(t, f2.runCalled, "fetcher Run() was not called") + require.Same(t, fetcher2, f2.fetcher) + require.Same(t, cluster2, f2.cluster) + require.Len(t, fetcherTracker.fetchers, 2) + require.Equal(t, 2, fetcherTracker.newCount) + + // Drop back to a single cluster + watcher.Reconcile(ctx, []eksAuditLogCluster{{fetcher1, cluster1}}) + synctest.Wait() + require.Len(t, fetcherTracker.fetchers, 1) + require.Equal(t, 2, fetcherTracker.newCount) + require.True(t, f2.done) + + // Send an empty cluster list. Should stop last fetcher + watcher.Reconcile(ctx, []eksAuditLogCluster{}) + synctest.Wait() + require.Empty(t, fetcherTracker.fetchers) + require.Equal(t, 2, fetcherTracker.newCount) + require.True(t, f1.done) + + cancel() + synctest.Wait() + require.ErrorIs(t, err, context.Canceled) + }) +} + +// fakeFetcherTracker keeps track of the fetchers created by an +// eksAuditLogWatcher. It has a newFetcher method that can plug into a watcher +// so that real fetchers are not created, and returns a fake fetcher for +// testing purposes. +type fakeFetcherTracker struct { + fetchers map[string]*fakeEksAuditLogFetcher + newCount int +} + +func newFakeFetcherTracker() *fakeFetcherTracker { + return &fakeFetcherTracker{fetchers: make(map[string]*fakeEksAuditLogFetcher)} +} + +// newFetcher plugs into eksAuditLogWatcher.newFetcher so that it creates fake +// fetchers for testing purposes. We do not need real fetchers to test the +// watcher. +func (fft *fakeFetcherTracker) newFetcher( + fetcher *aws_sync.Fetcher, + cluster *accessgraphv1alpha.AWSEKSClusterV1, + stream accessgraphv1alpha.AccessGraphService_KubeAuditLogStreamClient, + log *slog.Logger, +) eksAuditLogFetcherRunner { + f := &fakeEksAuditLogFetcher{ + fetcher: fetcher, + cluster: cluster, + cleanup: func() { delete(fft.fetchers, cluster.Arn) }, + } + fft.fetchers[cluster.Arn] = f + fft.newCount++ + return f +} + +type fakeEksAuditLogFetcher struct { + fetcher *aws_sync.Fetcher + cluster *accessgraphv1alpha.AWSEKSClusterV1 + cleanup func() + runCalled bool + done bool +} + +func (f *fakeEksAuditLogFetcher) Run(ctx context.Context) error { + f.runCalled = true // used in synctest bubble, no race + <-ctx.Done() + f.done = true + f.cleanup() + return ctx.Err() +} + +func newKubeAuditLogResponseConfig(cfg *accessgraphv1alpha.KubeAuditLogConfig) *kalsResponse { + return &kalsResponse{ + State: &accessgraphv1alpha.KubeAuditLogStreamResponse_Config{ + Config: cfg, + }, + } +} + +func newFakeKubeAuditLogClient(ctx context.Context) *fakeKubeAuditLogClient { + tester := grpctest.NewGRPCTester[kalsRequest, kalsResponse](ctx) + return &fakeKubeAuditLogClient{ + clientStream: tester.NewClientStream(), + serverStream: tester.NewServerStream(), + } +} + +type fakeKubeAuditLogClient struct { + accessgraphv1alpha.AccessGraphServiceClient + + clientStream kalsClient + serverStream kalsServer +} + +// Implements KubeAuditLogStream grpc method on the client +func (c *fakeKubeAuditLogClient) KubeAuditLogStream(ctx context.Context, opts ...grpc.CallOption) (kalsClient, error) { + return c.clientStream, nil +} diff --git a/lib/srv/discovery/fetchers/aws-sync/aws-sync.go b/lib/srv/discovery/fetchers/aws-sync/aws-sync.go index 455edf1e457ff..fb3c026ad87ae 100644 --- a/lib/srv/discovery/fetchers/aws-sync/aws-sync.go +++ b/lib/srv/discovery/fetchers/aws-sync/aws-sync.go @@ -27,6 +27,7 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/aws/retry" + "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs" "github.com/aws/aws-sdk-go-v2/service/iam" "github.com/aws/aws-sdk-go-v2/service/kms" "github.com/aws/aws-sdk-go-v2/service/rds" @@ -36,6 +37,7 @@ import ( "golang.org/x/sync/errgroup" usageeventsv1 "github.com/gravitational/teleport/api/gen/proto/go/usageevents/v1" + "github.com/gravitational/teleport/api/types" accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha" "github.com/gravitational/teleport/lib/cloud/awsconfig" "github.com/gravitational/teleport/lib/srv/server" @@ -67,6 +69,9 @@ type Config struct { DiscoveryConfigName string // Log is the logger to use for logging. Log *slog.Logger + // EKSAuditLogs if set specifies the EKS clusters for which apiserver audit logs + // should be fetched. + EKSAuditLogs *EKSAuditLogs // awsClients provides AWS SDK clients. awsClients awsClientProvider @@ -128,6 +133,8 @@ type awsClientProvider interface { getSTSClient(cfg aws.Config, optFns ...func(*sts.Options)) stsClient // getKMSClient provides a [kmsClient]. getKMSClient(cfg aws.Config, optFns ...func(*kms.Options)) kmsClient + // getCloudWatchLogsClient provides a [cloudwatchlogs.FilterLogEventsAPIClient]. + getCloudWatchLogsClient(cfg aws.Config, optFns ...func(*cloudwatchlogs.Options)) cloudwatchlogs.FilterLogEventsAPIClient } type defaultAWSClients struct{} @@ -152,6 +159,10 @@ func (defaultAWSClients) getKMSClient(cfg aws.Config, optFns ...func(*kms.Option return kms.NewFromConfig(cfg, optFns...) } +func (defaultAWSClients) getCloudWatchLogsClient(cfg aws.Config, optFns ...func(*cloudwatchlogs.Options)) cloudwatchlogs.FilterLogEventsAPIClient { + return cloudwatchlogs.NewFromConfig(cfg, optFns...) +} + // AssumeRole is the configuration for assuming an AWS role. type AssumeRole struct { // RoleARN is the ARN of the role to assume. @@ -160,6 +171,13 @@ type AssumeRole struct { ExternalID string } +// EKSAuditLogs is the configuration of which discovered EKS clusters should have +// their apiserver audit logs fetched and sent to Access Graph. +type EKSAuditLogs struct { + // Tags is a set of name/value tags that an EKS cluster must have for audit log fetching. + Tags types.Labels +} + // Fetcher is a fetcher that fetches AWS resources. type Fetcher struct { Config diff --git a/lib/srv/discovery/fetchers/aws-sync/cloudwatchlogs.go b/lib/srv/discovery/fetchers/aws-sync/cloudwatchlogs.go new file mode 100644 index 0000000000000..f2fa18c975a1c --- /dev/null +++ b/lib/srv/discovery/fetchers/aws-sync/cloudwatchlogs.go @@ -0,0 +1,102 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package aws_sync + +import ( + "context" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs" + cwltypes "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs/types" + "github.com/gravitational/trace" + + accessgraphv1alpha "github.com/gravitational/teleport/gen/proto/go/accessgraph/v1alpha" +) + +// FetchEKSAuditLogs returns a slice of audit log events for the given cluster +// starting from the given cursor. +func (a *Fetcher) FetchEKSAuditLogs(ctx context.Context, cluster *accessgraphv1alpha.AWSEKSClusterV1, cursor *accessgraphv1alpha.KubeAuditLogCursor) ([]cwltypes.FilteredLogEvent, error) { + cfg, err := a.AWSConfigProvider.GetConfig(ctx, cluster.GetRegion(), a.getAWSOptions()...) + if err != nil { + return nil, trace.Wrap(err) + } + client := a.awsClients.getCloudWatchLogsClient(cfg) + + // limit is not a hard limit - we may exceed it but won't get any more pages + // once reached. + var limit int32 = 500 // TODO(camscale): Consider making this a parameter + startTime := cursor.GetLastEventTime().AsTime().UTC() + input := &cloudwatchlogs.FilterLogEventsInput{ + LogGroupName: aws.String("/aws/eks/" + cluster.GetName() + "/cluster"), + LogStreamNamePrefix: aws.String("kube-apiserver-audit-"), + StartTime: aws.Int64(startTime.UnixMilli()), + Limit: aws.Int32(limit), + } + + var result []cwltypes.FilteredLogEvent + for p := cloudwatchlogs.NewFilterLogEventsPaginator(client, input); p.HasMorePages(); { + output, err := p.NextPage(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + eventsAfterCursor := cwlEventsAfterCursor(output.Events, cursor) + if eventsAfterCursor != nil { + cursor = nil + result = append(result, eventsAfterCursor...) + if len(result) >= int(limit) { + break + } + } + } + + return result, nil +} + +// cwlEventsAfterCursor returns the events from the given events after the +// cursor. If the cursor was not found, but the timestamp of the cursor +// was not passed, then nil is returned. In this case, the cursor is still +// valid and should continue to be used to find the next event. Otherwise +// a slice (possibly empty) is returned which means the cursor was consumed; +// either the event ID in the cursor was found, or we passed the timestamp +// of the cursor. +// If the cursor is nil, the events are returned unfiltered. +func cwlEventsAfterCursor(events []cwltypes.FilteredLogEvent, cursor *accessgraphv1alpha.KubeAuditLogCursor) []cwltypes.FilteredLogEvent { + // If we're not looking for events from a cursor position, just return all events. + if cursor == nil || cursor.GetEventId() == "" { + return events + } + + startTime := cursor.GetLastEventTime().AsTime().UTC() + for i, event := range events { + // If we never saw cursor.EventId with the given timestamp, + // just return all the events. + if time.UnixMilli(*event.Timestamp).UTC().After(startTime) { + return events + } + if *event.EventId == cursor.GetEventId() { + return events[i+1:] + } + } + // The cursor was not found in the events, but it was not discarded as + // the timestamp on the events did not move past the cursor timestamp. + // A nil slice (as opposed to an empty slice) indicates this. + return nil +} diff --git a/lib/srv/discovery/fetchers/aws-sync/rds_test.go b/lib/srv/discovery/fetchers/aws-sync/rds_test.go index ce1ae0ed43e1a..6211212c6f002 100644 --- a/lib/srv/discovery/fetchers/aws-sync/rds_test.go +++ b/lib/srv/discovery/fetchers/aws-sync/rds_test.go @@ -23,6 +23,7 @@ import ( "testing" "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs" "github.com/aws/aws-sdk-go-v2/service/iam" "github.com/aws/aws-sdk-go-v2/service/kms" "github.com/aws/aws-sdk-go-v2/service/rds" @@ -224,6 +225,7 @@ type fakeAWSClients struct { s3Client s3Client stsClient stsClient kmsClient kmsClient + cwlClient cloudwatchlogs.FilterLogEventsAPIClient } func (f fakeAWSClients) getIAMClient(cfg aws.Config, optFns ...func(*iam.Options)) iamClient { @@ -245,3 +247,7 @@ func (f fakeAWSClients) getSTSClient(cfg aws.Config, optFns ...func(*sts.Options func (f fakeAWSClients) getKMSClient(cfg aws.Config, optFns ...func(*kms.Options)) kmsClient { return f.kmsClient } + +func (f fakeAWSClients) getCloudWatchLogsClient(cfg aws.Config, optFns ...func(*cloudwatchlogs.Options)) cloudwatchlogs.FilterLogEventsAPIClient { + return f.cwlClient +} diff --git a/lib/utils/aws/region/regions.go b/lib/utils/aws/region/regions.go index 345ed58818c0d..cbf145503c5e2 100644 --- a/lib/utils/aws/region/regions.go +++ b/lib/utils/aws/region/regions.go @@ -197,6 +197,10 @@ var regions = sync.OnceValue(func() map[string]Region { Name: "us-isob-east-1", Description: "US ISOB East (Ohio)", }, + "us-isob-west-1": { + Name: "us-isob-west-1", + Description: "US ISOB West", + }, "us-isof-east-1": { Name: "us-isof-east-1", Description: "US ISOF EAST", diff --git a/lib/utils/testutils/grpctest/grpc.go b/lib/utils/testutils/grpctest/grpc.go new file mode 100644 index 0000000000000..5664b2c7dc1d8 --- /dev/null +++ b/lib/utils/testutils/grpctest/grpc.go @@ -0,0 +1,146 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package grpctest + +import ( + "context" + "io" + + "google.golang.org/grpc" +) + +// NewGRPCStreams creates a new bidirectional streaming gRPC pair, a bidirectional +// streaming client and server, for the given request type T1 and response type +// T2. +// +// The streams are directly connected without the use of network and are +// therefore suitable to be used with synctest. +// +// The client sends its requests on the clientStream which are directly received +// by the server via a channel with buffer size 1. The server sends its +// responses on its serverStream via another channel with buffer size 1. +// +// Private fields are purposefully written in a *not* concurrency-safe manner to +// simulate non-concurrency safety of real over-the-network GRPC stream. It will +// be caught when executing the test with the race detector enbled. +func NewGRPCTester[T1, T2 any](ctx context.Context) *GRPCTester[T1, T2] { + return &GRPCTester[T1, T2]{ + ctx: ctx, + toServer: make(chan *T1, 1), + toClient: make(chan *T2, 1), + } +} + +type GRPCTester[T1, T2 any] struct { + ctx context.Context + toServer chan *T1 + toClient chan *T2 +} + +func (t *GRPCTester[T1, T2]) NewClientStream() grpc.BidiStreamingClient[T1, T2] { + return &client[T1, T2]{ + ctx: t.ctx, + toServer: t.toServer, + toClient: t.toClient, + } +} + +func (t *GRPCTester[T1, T2]) NewServerStream() grpc.BidiStreamingServer[T1, T2] { + return &server[T1, T2]{ + ctx: t.ctx, + toServer: t.toServer, + toClient: t.toClient, + } +} + +type client[T1, T2 any] struct { + grpc.ClientStream + ctx context.Context + toServer chan *T1 + toClient chan *T2 + // simulate non-concurrency safety + sendRaceDetector bool + receiveRaceDetector bool +} + +func (c *client[T1, T2]) Context() context.Context { + return c.ctx +} + +func (c *client[T1, T2]) Send(req *T1) error { + c.sendRaceDetector = true // simulate non-concurrency safety + select { + case c.toServer <- req: + return nil + case <-c.ctx.Done(): + return c.ctx.Err() + } +} + +func (c *client[T1, T2]) Recv() (*T2, error) { + c.receiveRaceDetector = true // simulate non-concurrency safety + select { + case resp := <-c.toClient: + return resp, nil + case <-c.ctx.Done(): + return nil, c.ctx.Err() + } +} + +func (c *client[T1, T2]) CloseSend() error { + close(c.toServer) + return nil +} + +type server[T1, T2 any] struct { + grpc.ServerStream + ctx context.Context + toServer chan *T1 + toClient chan *T2 + // simulate non-concurrency safety + sendRaceDetector bool + receiveRaceDetector bool +} + +func (s *server[T1, T2]) Context() context.Context { + return s.ctx +} + +func (s *server[T1, T2]) Send(resp *T2) error { + s.sendRaceDetector = true + select { + case s.toClient <- resp: + return nil + case <-s.ctx.Done(): + return s.ctx.Err() + } +} + +func (s *server[T1, T2]) Recv() (*T1, error) { + s.receiveRaceDetector = true + select { + case req, ok := <-s.toServer: + if !ok { + return nil, io.EOF + } + return req, nil + case <-s.ctx.Done(): + return nil, s.ctx.Err() + } +} diff --git a/lib/web/integrations_awsoidc.go b/lib/web/integrations_awsoidc.go index 745335cf42f36..0dabaf5dbe09b 100644 --- a/lib/web/integrations_awsoidc.go +++ b/lib/web/integrations_awsoidc.go @@ -25,6 +25,7 @@ import ( "maps" "net/http" "slices" + "strconv" "strings" "github.com/aws/aws-sdk-go-v2/aws/arn" @@ -1379,6 +1380,19 @@ func (h *Handler) awsAccessGraphOIDCSync(w http.ResponseWriter, r *http.Request, } } + if eksAuditLogs := queryParams.Get("eksAuditLogs"); eksAuditLogs != "" { + enabled, err := strconv.ParseBool(eksAuditLogs) + if err != nil { + // The error returned by ParseBool contains no more information than this + // error. As we canot wrap both it and trace.BadParameter, we do the + // latter as a preferred error type. + return nil, trace.BadParameter("invalid boolean value for eksAuditLogs %q", eksAuditLogs) + } + if enabled { + argsList = append(argsList, "--eks-audit-logs") + } + } + script, err := oneoff.BuildScript(oneoff.OneOffScriptParams{ EntrypointArgs: strings.Join(argsList, " "), SuccessMessage: "Success! You can now go back to the Teleport Web UI to complete the Access Graph AWS Sync enrollment.", diff --git a/lib/web/integrations_awsoidc_test.go b/lib/web/integrations_awsoidc_test.go index 77f462a8a25ea..ab6d27223fc0b 100644 --- a/lib/web/integrations_awsoidc_test.go +++ b/lib/web/integrations_awsoidc_test.go @@ -310,13 +310,173 @@ func TestBuildEC2SSMIAMScript(t *testing.T) { } } +func TestBuildAccessGraphCloudSyncIAMScript(t *testing.T) { + t.Parallel() + isBadParamErrFn := func(tt require.TestingT, err error, i ...any) { + require.True(tt, trace.IsBadParameter(err), "expected bad parameter, got %v", err) + } + + env := newWebPack(t, 1) + + // Unauthenticated client for script downloading. + anonymousHTTPClient := env.proxies[0].newClient(t) + pathVars := []string{ + "webapi", + "scripts", + "integrations", + "configure", + "access-graph-cloud-sync-iam.sh", + } + endpoint := anonymousHTTPClient.Endpoint(pathVars...) + + role := "myRole" + awsAccountID := "123456789012" + sqsUrl := "https://sqs.us-west-2.amazonaws.com/123456789012/queue-name" + cloudTrailS3Bucket := "arn:aws:s3:::bucket-name" + kmsKey1 := "arn:aws:kms:us-west-2:123456789012:key/00000000-1111-2222-3333-444444444444" + kmsKey2 := "arn:aws:kms:us-west-2:123456789012:key/55555555-6666-7777-8888-999999999999" + + tests := []struct { + name string + reqRelativeURL string + reqQuery url.Values + errCheck require.ErrorAssertionFunc + expectedTeleportArgs string + }{ + { + name: "valid", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "role": []string{role}, + "awsAccountID": []string{awsAccountID}, + }, + errCheck: require.NoError, + expectedTeleportArgs: "integration configure access-graph aws-iam" + + " --role=" + role + + " --aws-account-id=" + awsAccountID, + }, + { + name: "valid with cloud trail", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "role": []string{role}, + "awsAccountID": []string{awsAccountID}, + "sqsUrl": []string{sqsUrl}, + "cloudTrailS3Bucket": []string{cloudTrailS3Bucket}, + "kmsKeysARNs": []string{kmsKey1, kmsKey2}, + }, + errCheck: require.NoError, + expectedTeleportArgs: "integration configure access-graph aws-iam" + + " --role=" + role + + " --aws-account-id=" + awsAccountID + + " --sqs-queue-url=" + sqsUrl + + " --cloud-trail-bucket=" + cloudTrailS3Bucket + + " --kms-key=" + kmsKey1 + + " --kms-key=" + kmsKey2, + }, + { + name: "valid with eks audit logs", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "role": []string{role}, + "awsAccountID": []string{awsAccountID}, + "eksAuditLogs": []string{"true"}, + }, + errCheck: require.NoError, + expectedTeleportArgs: "integration configure access-graph aws-iam" + + " --role=" + role + + " --aws-account-id=" + awsAccountID + + " --eks-audit-logs", + }, + { + name: "valid with cloud trail and eks audit logs", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "role": []string{role}, + "awsAccountID": []string{awsAccountID}, + "sqsUrl": []string{sqsUrl}, + "cloudTrailS3Bucket": []string{cloudTrailS3Bucket}, + "kmsKeysARNs": []string{kmsKey1, kmsKey2}, + "eksAuditLogs": []string{"true"}, + }, + errCheck: require.NoError, + expectedTeleportArgs: "integration configure access-graph aws-iam" + + " --role=" + role + + " --aws-account-id=" + awsAccountID + + " --sqs-queue-url=" + sqsUrl + + " --cloud-trail-bucket=" + cloudTrailS3Bucket + + " --kms-key=" + kmsKey1 + + " --kms-key=" + kmsKey2 + + " --eks-audit-logs", + }, + { + name: "valid with symbols in role", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "role": []string{"Test+1=2,3.4@5-6_7"}, + "awsAccountID": []string{"123456789012"}, + }, + errCheck: require.NoError, + expectedTeleportArgs: "integration configure access-graph aws-iam " + + "--role=Test\\+1=2,3.4\\@5-6_7 " + + "--aws-account-id=123456789012", + }, + { + name: "missing kind", + reqQuery: url.Values{ + "role": []string{"myRole"}, + "awsAccountID": []string{"123456789012"}, + }, + errCheck: isBadParamErrFn, + }, + { + name: "missing role", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "awsAccountID": []string{"123456789012"}, + }, + errCheck: isBadParamErrFn, + }, + { + name: "missing awsAccountID", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "role": []string{"myRole"}, + }, + errCheck: isBadParamErrFn, + }, + { + name: "trying to inject escape sequence into query params", + reqQuery: url.Values{ + "kind": []string{"aws-iam"}, + "role": []string{"'; rm -rf /tmp/dir; echo '"}, + "awsAccountID": []string{"123456789012"}, + }, + errCheck: isBadParamErrFn, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + resp, err := anonymousHTTPClient.Get(t.Context(), endpoint, tc.reqQuery) + tc.errCheck(t, err) + if err != nil { + return + } + + require.Contains(t, string(resp.Bytes()), + fmt.Sprintf("entrypointArgs='%s'\n", tc.expectedTeleportArgs), + ) + }) + } +} + func TestBuildAWSAppAccessConfigureIAMScript(t *testing.T) { t.Parallel() isBadParamErrFn := func(tt require.TestingT, err error, i ...any) { require.True(tt, trace.IsBadParameter(err), "expected bad parameter, got %v", err) } - ctx := context.Background() env := newWebPack(t, 1) // Unauthenticated client for script downloading. @@ -372,7 +532,7 @@ func TestBuildAWSAppAccessConfigureIAMScript(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - resp, err := anonymousHTTPClient.Get(ctx, endpoint, tc.reqQuery) + resp, err := anonymousHTTPClient.Get(t.Context(), endpoint, tc.reqQuery) tc.errCheck(t, err) if err != nil { return diff --git a/proto/accessgraph/v1alpha/access_graph_service.proto b/proto/accessgraph/v1alpha/access_graph_service.proto index db60821a2776c..13a5d64f476be 100644 --- a/proto/accessgraph/v1alpha/access_graph_service.proto +++ b/proto/accessgraph/v1alpha/access_graph_service.proto @@ -31,6 +31,7 @@ import "accessgraph/v1alpha/netiq.proto"; import "accessgraph/v1alpha/okta.proto"; import "accessgraph/v1alpha/resources.proto"; import "google/protobuf/empty.proto"; +import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "teleport/auditlog/v1/auditlog.proto"; @@ -103,6 +104,32 @@ service AccessGraphService { // 4. Client sends subsequent `AWSCloudTrailStreamRequest` messages. rpc AWSCloudTrailStream(stream AWSCloudTrailStreamRequest) returns (stream AWSCloudTrailStreamResponse); + // KubeAuditLogStream establishes a persistent bidirectional stream for exporting + // Kubernetes audit logs from a client (teleport) to a server (access-graph). This stream + // is separate from other audit log streams as fetching Kubernetes audit logs can + // require a variety of mechanisms for retrieving them depending on how/where the + // k8s cluster is deployed. It often will not make sense to integrate this audit log + // stream with any of the others. + // + // This stream facilitates: + // - Initial configuration exchange and validation. + // - Streaming batches of audit log events from client to server. + // - Reliable export resumption via client-provided resume state updates. + // - Logs for multiple clusters can be streamed across the one grpc stream. + // + // Basic Interaction Flow: + // 1. Client connects and sends an initial `KubeAuditLogStreamRequest` with `config`. + // 2. Server responds with an initial `KubeAuditLogStreamResponse`, confirming the + // effective configuration. + // 3. Client sends a `KubeAuditLogNewStream` message initiating a log stream for + // a cluster, with a timestamp of the oldest logs it wants. + // 4. Server responds with a `KubeAuditLogResumeState` message containing either + // a resumption cursor indicating when logs should be streamed from, or if + // a new cluster or an old outdated resumption point has been stored, sends + // the timestamp from which logs should be sent. + // 5. Client sends subsequent `KubeAuditLogStreamRequest` messages with new logs. + rpc KubeAuditLogStream(stream KubeAuditLogStreamRequest) returns (stream KubeAuditLogStreamResponse); + // Register submits a new tenant representing this Teleport cluster to the TAG service, // identified by its HostCA certificate. // The method is idempotent: it succeeds if the tenant has already registered and has the specific CA associated. @@ -610,6 +637,119 @@ message AWSCloudTrailEventResource { string type = 2; } +// KubeAuditLogStreamRequest is sent from the client (Teleport) to the server +// (access graph) over the bi-directional KubeAuditLogStream. It encapsulates +// distinct client actions for sending batches of Kubernetes audit log events +// and managing the persistent resume state maintained by the access graph +// server. +message KubeAuditLogStreamRequest { + oneof action { + KubeAuditLogConfig config = 1; + KubeAuditLogNewStream new_stream = 2; + KubeAuditLogEvents events = 3; + } +} + +// KubeAuditLogConfig is the KubeAuditLogStream configuration. It is sent from +// the client (Teleport) to the server (access graph) on start up, containing +// any configuration parameters from the Teleport config. The server will +// respond with an adjusted config that is that it will use, possibly +// overriding the supplied config. +// Currently there is no configuration exchanged. This message is present for +// future expansion. +message KubeAuditLogConfig {} + +// KubeAuditLogNewStream identifies a log source and cluster that the client +// wants to start sending to the server. The server responds with a +// KubeAuditLogResumeState message indicating where to resume streaming +// logs from. +message KubeAuditLogNewStream { + KubeAuditLogCursor initial = 1; +} + +// KubeAuditLogEvents is a chunk of Kubernetes apiserver audit logs. +message KubeAuditLogEvents { + // event is a Kubernetes audit log event represented as a struct so as to + // not depend on the Kubernetes proto files. Additionally, the audit log + // events are typically received as JSON, not protobufs. + // package k8s.io.apiserver.pkg.apis.audit.v1 at + // https://github.com/kubernetes/apiserver/blob/master/pkg/apis/audit/v1/generated.proto + repeated google.protobuf.Struct events = 1; + + // cursor is the position in the event stream of the last event in the + // event field. It can be sent back to Teleport when a stream is + // reconnected to resume the event stream from the end of this chunk. + KubeAuditLogCursor cursor = 2; +} + +// KubeAuditLogCursor is a position in a stream of KubeAuditLogEvents for +// resuming a stream of events after an interrupted connection. Each batch +// of events has a cursor referring to the last event of the batch. The +// cursor can be sent to Teleport when resuming a connection. +message KubeAuditLogCursor { + // KubeAuditLogSource specifies a source of logs in order to interpret a + // KubeAuditLogCursor id and cursor. Different sources of logs will have + // different ways of representing a position in a log stream. + enum KubeAuditLogSource { + // KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED represents a zero value where no log + // source has been specified. + KUBE_AUDIT_LOG_SOURCE_UNSPECIFIED = 0; + // KUBE_AUDIT_LOG_SOURCE_EKS specifies AWS CloudWatch as the source of + // Kubernetes apiserver audit logs. This is where EKS sends the apiserver + // audit logs. + KUBE_AUDIT_LOG_SOURCE_EKS = 1; + } + + // log_source is where the logs are coming from that this cursor is for. + KubeAuditLogSource log_source = 1; + + // cluster_id is an opaque identifier for the Kubernetes cluster that this + // cursor refers to. The ID should be interpreted based on the cluster type. + string cluster_id = 2; + + // event_id is the ID of the last event of a batch of events that a cursor + // refers to. It is an opaque value interpreted according to the log_source + // of the cursor. When sent as part of a KubeAuditLogNewStream message, it + // will be empty. When sent as part of a KubeAuditLogResumeState, it may be + // empty to indicate that there is no resume state cursor. + string event_id = 3; + + // last_event_time is the timestamp of the last event of a batch of events + // that a cursor refers to. If the event_id is sufficient to resume streaming + // events for a log source then this field may be omitted. When sent as part + // of a KubeAuditLogNewStream message, it may contain the timestamp from which + // the client intends to stream logs. The KubeAuditLogResumeState may contain + // a different time, indicating the timestamp from which it should start, + // either because it is a resumption of an existing stream or because the + // server is overriding the start timestamp for a new stream. + google.protobuf.Timestamp last_event_time = 4; +} + +// KubeAuditLogStreamResponse is sent from the server (access graph) to the +// client (Teleport) over th bi-directional KubeAuditLogStream. It is used to +// convey the resume state of the log streams that access graph is processing +// the logs for. +message KubeAuditLogStreamResponse { + oneof state { + KubeAuditLogConfig config = 1; + KubeAuditLogResumeState resume_state = 2; + } +} + +// KubeAuditLogResumeState is the response to the KubeAuditLogNewStream request +// and contains the cursor for the resume state of that Kubernetes cluster. +message KubeAuditLogResumeState { + // cursor is a resumption cursor for a new stream, sent in response to + // a KubeAuditLogNewStream request. If the log_source and cluster_id sent + // in the new stream request are unknown to the server, this cursor + // may not contain a position to resume from. However the timestamp in + // the cursor should be set to what was received in the KubeAuditLogNewStream + // message if it is not to be overridden, or it should be replaced with + // a different initial start timestamp if Access Graph (server) wants to + // override that. + KubeAuditLogCursor cursor = 1; +} + // GitHubAuditLogStreamRequest represents a client message in the GitHubAuditLogStream, // containing either initial configuration or a batch of GitHub audit log events. message GitHubAuditLogStreamRequest { diff --git a/tool/teleport/common/integration_configure.go b/tool/teleport/common/integration_configure.go index 092e9a633e878..6e2a3d50f229f 100644 --- a/tool/teleport/common/integration_configure.go +++ b/tool/teleport/common/integration_configure.go @@ -223,6 +223,7 @@ func onIntegrationConfAccessGraphAWSSync(ctx context.Context, params config.Inte SQSQueueURL: params.SQSQueueURL, CloudTrailBucketARN: params.CloudTrailBucketARN, KMSKeyARNs: params.KMSKeyARNs, + EnableEKSAuditLogs: params.EnableEKSAuditLogs, } return trace.Wrap(awsoidc.ConfigureAccessGraphSyncIAM(ctx, clt, confReq)) } diff --git a/tool/teleport/common/teleport.go b/tool/teleport/common/teleport.go index b1f1c3f3c8262..2f9879fe1bd73 100644 --- a/tool/teleport/common/teleport.go +++ b/tool/teleport/common/teleport.go @@ -539,6 +539,7 @@ func Run(options Options) (app *kingpin.Application, executedCommand string, con integrationConfAccessGraphAWSSyncCmd.Flag("sqs-queue-url", "SQS Queue URL used to receive notifications from CloudTrail.").StringVar(&ccf.IntegrationConfAccessGraphAWSSyncArguments.SQSQueueURL) integrationConfAccessGraphAWSSyncCmd.Flag("cloud-trail-bucket", "ARN of the S3 bucket where CloudTrail writes events to.").StringVar(&ccf.IntegrationConfAccessGraphAWSSyncArguments.CloudTrailBucketARN) integrationConfAccessGraphAWSSyncCmd.Flag("kms-key", "List of KMS Keys used to decrypt SQS and S3 bucket data.").StringsVar(&ccf.IntegrationConfAccessGraphAWSSyncArguments.KMSKeyARNs) + integrationConfAccessGraphAWSSyncCmd.Flag("eks-audit-logs", "Enable collection of EKS audit logs").BoolVar(&ccf.IntegrationConfAccessGraphAWSSyncArguments.EnableEKSAuditLogs) integrationConfAccessGraphAzureSyncCmd := integrationConfAccessGraphCmd.Command("azure", "Adds required Azure permissions for syncing Azure resources into Access Graph service.") integrationConfAccessGraphAzureSyncCmd.Flag("managed-identity", "The ID of the managed identity to run the Discovery service.").Required().StringVar(&ccf.IntegrationConfAccessGraphAzureSyncArguments.ManagedIdentity)