diff --git a/.github/workflows/post-release.yaml b/.github/workflows/post-release.yaml index 9641d2c00758a..df1c33bb64798 100644 --- a/.github/workflows/post-release.yaml +++ b/.github/workflows/post-release.yaml @@ -94,8 +94,8 @@ jobs: git config --global user.email "noreply@github.com" git config --global user.name "GitHub" - # get Go version from go.mod - GO_VERSION=$(go mod edit -json | jq -r .Go) + # get Go version from go.mod (preferring the toolchain directive if it's present) + GO_VERSION=$(go mod edit -json | jq -r 'if has("Toolchain") then .Toolchain | sub("go"; "") else .Go end') # update versions in docs/config.json # for docker images replace version number after : diff --git a/.golangci.yml b/.golangci.yml index 9a824c66d2928..5ddda88a961fa 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -76,6 +76,8 @@ linters-settings: desc: 'use "golang.org/x/mod/semver" or "coreos/go-semver/semver" instead' - pkg: github.com/microsoftgraph/msgraph-sdk-go desc: 'use "github.com/gravitational/teleport/lib/msgraph" instead' + - pkg: github.com/cloudflare/cfssl + desc: 'use "crypto" or "x/crypto" instead' # Prevent importing internal packages in client tools or packages containing # common interfaces consumed by them that are known to bloat binaries or break builds # because they only support a single platform. diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fb83c2df1e43..80bfb46901307 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 15.4.24 (12/11/2024) + +* Updated golang.org/x/crypto to v0.31.0 (CVE-2024-45337). [#50080](https://github.com/gravitational/teleport/pull/50080) +* Fix tsh ssh -Y when jumping between multiple servers. [#50034](https://github.com/gravitational/teleport/pull/50034) +* Reduce Auth memory consumption when agents join using the azure join method. [#50000](https://github.com/gravitational/teleport/pull/50000) +* Tsh correctly respects the --no-allow-passwordless flag. [#49935](https://github.com/gravitational/teleport/pull/49935) +* Auto-updates for client tools (`tctl` and `tsh`) are controlled by cluster configuration. [#48648](https://github.com/gravitational/teleport/pull/48648) + ## 15.4.23 (12/5/2024) * Fixed a bug breaking in-cluster joining on some Kubernetes clusters. [#49843](https://github.com/gravitational/teleport/pull/49843) diff --git a/Makefile b/Makefile index 8b891ccbfb7b3..74287bfbd426c 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ # Stable releases: "1.0.0" # Pre-releases: "1.0.0-alpha.1", "1.0.0-beta.2", "1.0.0-rc.3" # Master/dev branch: "1.0.0-dev" -VERSION=15.4.23 +VERSION=15.4.24 DOCKER_IMAGE ?= teleport diff --git a/api/client/webclient/webclient.go b/api/client/webclient/webclient.go index 4acbf407fc381..2942330c35456 100644 --- a/api/client/webclient/webclient.go +++ b/api/client/webclient/webclient.go @@ -296,6 +296,8 @@ type PingResponse struct { ServerVersion string `json:"server_version"` // MinClientVersion is the minimum client version required by the server. MinClientVersion string `json:"min_client_version"` + // AutoUpdateSettings contains the auto update settings. + AutoUpdate AutoUpdateSettings `json:"auto_update"` // ClusterName contains the name of the Teleport cluster. ClusterName string `json:"cluster_name"` @@ -329,6 +331,14 @@ type ProxySettings struct { AssistEnabled bool `json:"assist_enabled"` } +// AutoUpdateSettings contains information about the auto update requirements. +type AutoUpdateSettings struct { + // ToolsVersion defines the version of {tsh, tctl} for client auto update. + ToolsVersion string `json:"tools_version"` + // ToolsAutoUpdate indicates if the requesting tools client should be updated. + ToolsAutoUpdate bool `json:"tools_auto_update"` +} + // KubeProxySettings is kubernetes proxy settings type KubeProxySettings struct { // Enabled is true when kubernetes proxy is enabled diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go index 3d1d62b82fbdc..514b7125ed4e6 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -122,8 +122,7 @@ type AutoUpdateConfigSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // ToolsAutoupdate encodes the feature flag to enable/disable tools autoupdates. - ToolsAutoupdate bool `protobuf:"varint,1,opt,name=tools_autoupdate,json=toolsAutoupdate,proto3" json:"tools_autoupdate,omitempty"` + Tools *AutoUpdateConfigSpecTools `protobuf:"bytes,2,opt,name=tools,proto3" json:"tools,omitempty"` } func (x *AutoUpdateConfigSpec) Reset() { @@ -158,11 +157,60 @@ func (*AutoUpdateConfigSpec) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{1} } -func (x *AutoUpdateConfigSpec) GetToolsAutoupdate() bool { +func (x *AutoUpdateConfigSpec) GetTools() *AutoUpdateConfigSpecTools { if x != nil { - return x.ToolsAutoupdate + return x.Tools } - return false + return nil +} + +// AutoUpdateConfigSpecTools encodes the parameters for client tools auto updates. +type AutoUpdateConfigSpecTools struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Mode defines state of the client tools auto update. + Mode string `protobuf:"bytes,1,opt,name=mode,proto3" json:"mode,omitempty"` +} + +func (x *AutoUpdateConfigSpecTools) Reset() { + *x = AutoUpdateConfigSpecTools{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AutoUpdateConfigSpecTools) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateConfigSpecTools) ProtoMessage() {} + +func (x *AutoUpdateConfigSpecTools) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateConfigSpecTools.ProtoReflect.Descriptor instead. +func (*AutoUpdateConfigSpecTools) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{2} +} + +func (x *AutoUpdateConfigSpecTools) GetMode() string { + if x != nil { + return x.Mode + } + return "" } // AutoUpdateVersion is a resource singleton with version required for @@ -182,7 +230,7 @@ type AutoUpdateVersion struct { func (x *AutoUpdateVersion) Reset() { *x = AutoUpdateVersion{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -195,7 +243,7 @@ func (x *AutoUpdateVersion) String() string { func (*AutoUpdateVersion) ProtoMessage() {} func (x *AutoUpdateVersion) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -208,7 +256,7 @@ func (x *AutoUpdateVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoUpdateVersion.ProtoReflect.Descriptor instead. func (*AutoUpdateVersion) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{2} + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{3} } func (x *AutoUpdateVersion) GetKind() string { @@ -252,14 +300,13 @@ type AutoUpdateVersionSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // ToolsVersion is the semantic version required for tools autoupdates. - ToolsVersion string `protobuf:"bytes,1,opt,name=tools_version,json=toolsVersion,proto3" json:"tools_version,omitempty"` + Tools *AutoUpdateVersionSpecTools `protobuf:"bytes,2,opt,name=tools,proto3" json:"tools,omitempty"` } func (x *AutoUpdateVersionSpec) Reset() { *x = AutoUpdateVersionSpec{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -272,7 +319,7 @@ func (x *AutoUpdateVersionSpec) String() string { func (*AutoUpdateVersionSpec) ProtoMessage() {} func (x *AutoUpdateVersionSpec) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -285,12 +332,62 @@ func (x *AutoUpdateVersionSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoUpdateVersionSpec.ProtoReflect.Descriptor instead. func (*AutoUpdateVersionSpec) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{3} + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{4} +} + +func (x *AutoUpdateVersionSpec) GetTools() *AutoUpdateVersionSpecTools { + if x != nil { + return x.Tools + } + return nil } -func (x *AutoUpdateVersionSpec) GetToolsVersion() string { +// AutoUpdateVersionSpecTools encodes the parameters for client tools auto updates. +type AutoUpdateVersionSpecTools struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // TargetVersion specifies the semantic version required for tools to establish a connection with the cluster. + // Client tools after connection to the cluster going to be updated to this version automatically. + TargetVersion string `protobuf:"bytes,1,opt,name=target_version,json=targetVersion,proto3" json:"target_version,omitempty"` +} + +func (x *AutoUpdateVersionSpecTools) Reset() { + *x = AutoUpdateVersionSpecTools{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AutoUpdateVersionSpecTools) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateVersionSpecTools) ProtoMessage() {} + +func (x *AutoUpdateVersionSpecTools) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateVersionSpecTools.ProtoReflect.Descriptor instead. +func (*AutoUpdateVersionSpecTools) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{5} +} + +func (x *AutoUpdateVersionSpecTools) GetTargetVersion() string { if x != nil { - return x.ToolsVersion + return x.TargetVersion } return "" } @@ -317,35 +414,50 @@ var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x41, + 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x77, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, - 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, - 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, - 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x3c, 0x0a, - 0x15, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, - 0x6f, 0x6f, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x5a, 0x54, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, - 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x47, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, + 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x4a, + 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x54, + 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x22, 0x76, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x48, 0x0a, + 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, + 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x0d, 0x74, + 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x1a, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -360,24 +472,28 @@ func file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP() []byte { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescData } -var file_teleport_autoupdate_v1_autoupdate_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_teleport_autoupdate_v1_autoupdate_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_teleport_autoupdate_v1_autoupdate_proto_goTypes = []any{ - (*AutoUpdateConfig)(nil), // 0: teleport.autoupdate.v1.AutoUpdateConfig - (*AutoUpdateConfigSpec)(nil), // 1: teleport.autoupdate.v1.AutoUpdateConfigSpec - (*AutoUpdateVersion)(nil), // 2: teleport.autoupdate.v1.AutoUpdateVersion - (*AutoUpdateVersionSpec)(nil), // 3: teleport.autoupdate.v1.AutoUpdateVersionSpec - (*v1.Metadata)(nil), // 4: teleport.header.v1.Metadata + (*AutoUpdateConfig)(nil), // 0: teleport.autoupdate.v1.AutoUpdateConfig + (*AutoUpdateConfigSpec)(nil), // 1: teleport.autoupdate.v1.AutoUpdateConfigSpec + (*AutoUpdateConfigSpecTools)(nil), // 2: teleport.autoupdate.v1.AutoUpdateConfigSpecTools + (*AutoUpdateVersion)(nil), // 3: teleport.autoupdate.v1.AutoUpdateVersion + (*AutoUpdateVersionSpec)(nil), // 4: teleport.autoupdate.v1.AutoUpdateVersionSpec + (*AutoUpdateVersionSpecTools)(nil), // 5: teleport.autoupdate.v1.AutoUpdateVersionSpecTools + (*v1.Metadata)(nil), // 6: teleport.header.v1.Metadata } var file_teleport_autoupdate_v1_autoupdate_proto_depIdxs = []int32{ - 4, // 0: teleport.autoupdate.v1.AutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata + 6, // 0: teleport.autoupdate.v1.AutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata 1, // 1: teleport.autoupdate.v1.AutoUpdateConfig.spec:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpec - 4, // 2: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata - 3, // 3: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec - 4, // [4:4] is the sub-list for method output_type - 4, // [4:4] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 2, // 2: teleport.autoupdate.v1.AutoUpdateConfigSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpecTools + 6, // 3: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata + 4, // 4: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec + 5, // 5: teleport.autoupdate.v1.AutoUpdateVersionSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecTools + 6, // [6:6] is the sub-list for method output_type + 6, // [6:6] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_teleport_autoupdate_v1_autoupdate_proto_init() } @@ -411,7 +527,7 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*AutoUpdateVersion); i { + switch v := v.(*AutoUpdateConfigSpecTools); i { case 0: return &v.state case 1: @@ -423,6 +539,18 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*AutoUpdateVersion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*AutoUpdateVersionSpec); i { case 0: return &v.state @@ -434,6 +562,18 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { return nil } } + file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*AutoUpdateVersionSpecTools); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -441,7 +581,7 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_autoupdate_v1_autoupdate_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 6, NumExtensions: 0, NumServices: 0, }, diff --git a/api/go.mod b/api/go.mod index 614804c46f0d7..bd9e6fff2e271 100644 --- a/api/go.mod +++ b/api/go.mod @@ -22,10 +22,10 @@ require ( go.opentelemetry.io/otel/sdk v1.21.0 go.opentelemetry.io/otel/trace v1.21.0 go.opentelemetry.io/proto/otlp v1.0.0 - golang.org/x/crypto v0.22.0 + golang.org/x/crypto v0.31.0 golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb golang.org/x/net v0.24.0 - golang.org/x/term v0.19.0 + golang.org/x/term v0.27.0 google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c google.golang.org/grpc v1.60.1 google.golang.org/protobuf v1.33.0 @@ -48,8 +48,8 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/russellhaering/goxmldsig v1.4.0 // indirect go.opentelemetry.io/otel/metric v1.21.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/api/go.sum b/api/go.sum index 0988ad4f50263..4330a572a5125 100644 --- a/api/go.sum +++ b/api/go.sum @@ -159,8 +159,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -212,21 +212,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/api/proto/teleport/autoupdate/v1/autoupdate.proto b/api/proto/teleport/autoupdate/v1/autoupdate.proto index 1987407fe7d81..b4e557549b316 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate.proto @@ -33,8 +33,15 @@ message AutoUpdateConfig { // AutoUpdateConfigSpec encodes the parameters of the autoupdate config object. message AutoUpdateConfigSpec { - // ToolsAutoupdate encodes the feature flag to enable/disable tools autoupdates. - bool tools_autoupdate = 1; + reserved 1; + reserved "tools_autoupdate"; // ToolsAutoupdate is replaced by tools.mode. + AutoUpdateConfigSpecTools tools = 2; +} + +// AutoUpdateConfigSpecTools encodes the parameters for client tools auto updates. +message AutoUpdateConfigSpecTools { + // Mode defines state of the client tools auto update. + string mode = 1; } // AutoUpdateVersion is a resource singleton with version required for @@ -50,6 +57,14 @@ message AutoUpdateVersion { // AutoUpdateVersionSpec encodes the parameters of the autoupdate versions. message AutoUpdateVersionSpec { - // ToolsVersion is the semantic version required for tools autoupdates. - string tools_version = 1; + reserved 1; + reserved "tools_version"; // ToolsVersion is replaced by tools.target_version. + AutoUpdateVersionSpecTools tools = 2; +} + +// AutoUpdateVersionSpecTools encodes the parameters for client tools auto updates. +message AutoUpdateVersionSpecTools { + // TargetVersion specifies the semantic version required for tools to establish a connection with the cluster. + // Client tools after connection to the cluster going to be updated to this version automatically. + string target_version = 1; } diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 8b8d725136bcf..4ab0778306e96 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -6799,6 +6799,13 @@ message AutoUpdateConfigCreate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the creation was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateConfigUpdate is emitted when an auto update config is updated. @@ -6830,6 +6837,13 @@ message AutoUpdateConfigUpdate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateConfigDelete is emitted when an auto update config is deleted. @@ -6861,6 +6875,13 @@ message AutoUpdateConfigDelete { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the deletion was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateVersionCreate is emitted when an auto update version is created. @@ -6892,6 +6913,13 @@ message AutoUpdateVersionCreate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the creation was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateVersionUpdate is emitted when an auto update version is updated. @@ -6923,6 +6951,13 @@ message AutoUpdateVersionUpdate { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // ResourceMetadata is a common resource event metadata + ResourceMetadata Resource = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // AutoUpdateVersionDelete is emitted when an auto update version is deleted. @@ -6954,6 +6989,13 @@ message AutoUpdateVersionDelete { (gogoproto.embed) = true, (gogoproto.jsontag) = "" ]; + + // Status indicates whether the deletion was successful. + Status Status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; } // CrownJewelCreate is emitted when a Access Graph CrownJewel is created. diff --git a/api/types/autoupdate/config.go b/api/types/autoupdate/config.go index 5be3db89fd0c5..d61c35eccf0c2 100644 --- a/api/types/autoupdate/config.go +++ b/api/types/autoupdate/config.go @@ -26,6 +26,13 @@ import ( "github.com/gravitational/teleport/api/types" ) +const ( + // ToolsUpdateModeEnabled enables client tools automatic updates. + ToolsUpdateModeEnabled = "enabled" + // ToolsUpdateModeDisabled disables client tools automatic updates. + ToolsUpdateModeDisabled = "disabled" +) + // NewAutoUpdateConfig creates a new auto update configuration resource. func NewAutoUpdateConfig(spec *autoupdate.AutoUpdateConfigSpec) (*autoupdate.AutoUpdateConfig, error) { config := &autoupdate.AutoUpdateConfig{ @@ -58,6 +65,11 @@ func ValidateAutoUpdateConfig(c *autoupdate.AutoUpdateConfig) error { if c.Spec == nil { return trace.BadParameter("Spec is nil") } + if c.Spec.Tools != nil { + if c.Spec.Tools.Mode != ToolsUpdateModeDisabled && c.Spec.Tools.Mode != ToolsUpdateModeEnabled { + return trace.BadParameter("ToolsMode is not valid") + } + } return nil } diff --git a/api/types/autoupdate/config_test.go b/api/types/autoupdate/config_test.go index 2ee33dc5bf2b3..443d6f246fa56 100644 --- a/api/types/autoupdate/config_test.go +++ b/api/types/autoupdate/config_test.go @@ -41,7 +41,9 @@ func TestNewAutoUpdateConfig(t *testing.T) { { name: "success tools autoupdate disabled", spec: &autoupdate.AutoUpdateConfigSpec{ - ToolsAutoupdate: false, + Tools: &autoupdate.AutoUpdateConfigSpecTools{ + Mode: ToolsUpdateModeDisabled, + }, }, assertErr: func(t *testing.T, err error, a ...any) { require.NoError(t, err) @@ -53,14 +55,18 @@ func TestNewAutoUpdateConfig(t *testing.T) { Name: types.MetaNameAutoUpdateConfig, }, Spec: &autoupdate.AutoUpdateConfigSpec{ - ToolsAutoupdate: false, + Tools: &autoupdate.AutoUpdateConfigSpecTools{ + Mode: ToolsUpdateModeDisabled, + }, }, }, }, { name: "success tools autoupdate enabled", spec: &autoupdate.AutoUpdateConfigSpec{ - ToolsAutoupdate: true, + Tools: &autoupdate.AutoUpdateConfigSpecTools{ + Mode: ToolsUpdateModeEnabled, + }, }, assertErr: func(t *testing.T, err error, a ...any) { require.NoError(t, err) @@ -72,7 +78,9 @@ func TestNewAutoUpdateConfig(t *testing.T) { Name: types.MetaNameAutoUpdateConfig, }, Spec: &autoupdate.AutoUpdateConfigSpec{ - ToolsAutoupdate: true, + Tools: &autoupdate.AutoUpdateConfigSpecTools{ + Mode: ToolsUpdateModeEnabled, + }, }, }, }, @@ -83,6 +91,17 @@ func TestNewAutoUpdateConfig(t *testing.T) { require.ErrorContains(t, err, "Spec is nil") }, }, + { + name: "invalid tools mode", + spec: &autoupdate.AutoUpdateConfigSpec{ + Tools: &autoupdate.AutoUpdateConfigSpecTools{ + Mode: "invalid-mode", + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "ToolsMode is not valid") + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/api/types/autoupdate/version.go b/api/types/autoupdate/version.go index 088171a072ae3..ad2d12f265949 100644 --- a/api/types/autoupdate/version.go +++ b/api/types/autoupdate/version.go @@ -60,11 +60,13 @@ func ValidateAutoUpdateVersion(v *autoupdate.AutoUpdateVersion) error { return trace.BadParameter("Spec is nil") } - if v.Spec.ToolsVersion == "" { - return trace.BadParameter("ToolsVersion is unset") - } - if _, err := semver.NewVersion(v.Spec.ToolsVersion); err != nil { - return trace.BadParameter("ToolsVersion is not a valid semantic version") + if v.Spec.Tools != nil { + if v.Spec.Tools.TargetVersion == "" { + return trace.BadParameter("TargetVersion is unset") + } + if _, err := semver.NewVersion(v.Spec.Tools.TargetVersion); err != nil { + return trace.BadParameter("TargetVersion is not a valid semantic version") + } } return nil diff --git a/api/types/autoupdate/version_test.go b/api/types/autoupdate/version_test.go index 5fe4f167a037e..70790a204b219 100644 --- a/api/types/autoupdate/version_test.go +++ b/api/types/autoupdate/version_test.go @@ -41,7 +41,9 @@ func TestNewAutoUpdateVersion(t *testing.T) { { name: "success tools autoupdate version", spec: &autoupdate.AutoUpdateVersionSpec{ - ToolsVersion: "1.2.3-dev", + Tools: &autoupdate.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3-dev", + }, }, assertErr: func(t *testing.T, err error, a ...any) { require.NoError(t, err) @@ -53,26 +55,32 @@ func TestNewAutoUpdateVersion(t *testing.T) { Name: types.MetaNameAutoUpdateVersion, }, Spec: &autoupdate.AutoUpdateVersionSpec{ - ToolsVersion: "1.2.3-dev", + Tools: &autoupdate.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3-dev", + }, }, }, }, { name: "invalid empty tools version", spec: &autoupdate.AutoUpdateVersionSpec{ - ToolsVersion: "", + Tools: &autoupdate.AutoUpdateVersionSpecTools{ + TargetVersion: "", + }, }, assertErr: func(t *testing.T, err error, a ...any) { - require.ErrorContains(t, err, "ToolsVersion is unset") + require.ErrorContains(t, err, "TargetVersion is unset") }, }, { name: "invalid semantic tools version", spec: &autoupdate.AutoUpdateVersionSpec{ - ToolsVersion: "17-0-0", + Tools: &autoupdate.AutoUpdateVersionSpecTools{ + TargetVersion: "17-0-0", + }, }, assertErr: func(t *testing.T, err error, a ...any) { - require.ErrorContains(t, err, "ToolsVersion is not a valid semantic version") + require.ErrorContains(t, err, "TargetVersion is not a valid semantic version") }, }, { diff --git a/api/types/events/events.go b/api/types/events/events.go index 77dffca80c81d..9aef279423e84 100644 --- a/api/types/events/events.go +++ b/api/types/events/events.go @@ -2255,3 +2255,27 @@ func (m *CrownJewelUpdate) TrimToMaxSize(_ int) AuditEvent { func (m *CrownJewelDelete) TrimToMaxSize(_ int) AuditEvent { return m } + +func (m *AutoUpdateConfigCreate) TrimToMaxSize(_ int) AuditEvent { + return m +} + +func (m *AutoUpdateConfigUpdate) TrimToMaxSize(_ int) AuditEvent { + return m +} + +func (m *AutoUpdateConfigDelete) TrimToMaxSize(_ int) AuditEvent { + return m +} + +func (m *AutoUpdateVersionCreate) TrimToMaxSize(_ int) AuditEvent { + return m +} + +func (m *AutoUpdateVersionUpdate) TrimToMaxSize(_ int) AuditEvent { + return m +} + +func (m *AutoUpdateVersionDelete) TrimToMaxSize(_ int) AuditEvent { + return m +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index 778d49f842c92..1ef2dea08fd79 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -13704,7 +13704,9 @@ type AutoUpdateConfigCreate struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the creation was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -13752,7 +13754,9 @@ type AutoUpdateConfigUpdate struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,5,opt,name=Resource,proto3,embedded=Resource" json:""` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -13800,7 +13804,9 @@ type AutoUpdateConfigDelete struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the deletion was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -13848,7 +13854,9 @@ type AutoUpdateVersionCreate struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the creation was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -13896,7 +13904,9 @@ type AutoUpdateVersionUpdate struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // ResourceMetadata is a common resource event metadata + ResourceMetadata `protobuf:"bytes,5,opt,name=Resource,proto3,embedded=Resource" json:""` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -13944,7 +13954,9 @@ type AutoUpdateVersionDelete struct { // User is a common user event metadata UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` + // Status indicates whether the deletion was successful. + Status `protobuf:"bytes,5,opt,name=Status,proto3,embedded=Status" json:""` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -14392,602 +14404,602 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 15877 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x74, 0x1c, 0x47, - 0x76, 0x18, 0x8c, 0x79, 0x60, 0x00, 0x14, 0x1e, 0x04, 0x8a, 0x14, 0xd9, 0xa4, 0x48, 0x8e, 0xd4, - 0x92, 0xb8, 0xa4, 0x56, 0x22, 0x25, 0x8a, 0x92, 0x56, 0xaf, 0x95, 0x06, 0x18, 0x80, 0x18, 0x11, - 0x8f, 0x51, 0x0f, 0x48, 0xae, 0xf6, 0x35, 0x6e, 0x4c, 0x17, 0x80, 0x16, 0x67, 0xba, 0x67, 0xbb, - 0x7b, 0x08, 0x42, 0xdf, 0xcb, 0xeb, 0xcf, 0x8f, 0x5d, 0x7b, 0x77, 0xbd, 0x59, 0xc7, 0x6f, 0x27, - 0x67, 0x6d, 0xc7, 0x89, 0xed, 0xd8, 0x5e, 0xdb, 0xf1, 0x59, 0x7b, 0xed, 0xec, 0x89, 0x9d, 0x4d, - 0x4e, 0x64, 0x6f, 0xe2, 0x63, 0x3b, 0x89, 0x8f, 0x4f, 0xe2, 0x60, 0x9d, 0x4d, 0x9c, 0x1f, 0x38, - 0xf1, 0x39, 0x4e, 0xb2, 0x27, 0xde, 0x38, 0x4e, 0x4e, 0x4e, 0xdd, 0xaa, 0xee, 0xae, 0xea, 0xc7, - 0xe0, 0x29, 0x43, 0x10, 0xf0, 0x87, 0xc4, 0xdc, 0x7b, 0xeb, 0x56, 0xf5, 0xad, 0x5b, 0x55, 0xb7, - 0xaa, 0x6e, 0xdd, 0x8b, 0x2e, 0x79, 0xa4, 0x49, 0xda, 0xb6, 0xe3, 0x5d, 0x69, 0x92, 0x65, 0xbd, - 0xb1, 0x76, 0xc5, 0x5b, 0x6b, 0x13, 0xf7, 0x0a, 0xb9, 0x4b, 0x2c, 0xcf, 0xff, 0xef, 0x72, 0xdb, - 0xb1, 0x3d, 0x1b, 0x17, 0xd8, 0xaf, 0x33, 0x27, 0x96, 0xed, 0x65, 0x1b, 0x40, 0x57, 0xe8, 0x5f, - 0x0c, 0x7b, 0xe6, 0xec, 0xb2, 0x6d, 0x2f, 0x37, 0xc9, 0x15, 0xf8, 0xb5, 0xd8, 0x59, 0xba, 0xe2, - 0x7a, 0x4e, 0xa7, 0xe1, 0x71, 0x6c, 0x31, 0x8a, 0xf5, 0xcc, 0x16, 0x71, 0x3d, 0xbd, 0xd5, 0xe6, - 0x04, 0xe7, 0xa3, 0x04, 0xab, 0x8e, 0xde, 0x6e, 0x13, 0x87, 0x57, 0x7e, 0xe6, 0xc1, 0xe4, 0x76, - 0xc2, 0xbf, 0x9c, 0xe4, 0xf1, 0x64, 0x12, 0x9f, 0x51, 0x84, 0xa3, 0xfa, 0xb9, 0x2c, 0xea, 0x9f, - 0x25, 0x9e, 0x6e, 0xe8, 0x9e, 0x8e, 0xcf, 0xa2, 0xde, 0x8a, 0x65, 0x90, 0x7b, 0x4a, 0xe6, 0x81, - 0xcc, 0xc5, 0xdc, 0x78, 0x61, 0x63, 0xbd, 0x98, 0x25, 0xa6, 0xc6, 0x80, 0xf8, 0x1c, 0xca, 0x2f, - 0xac, 0xb5, 0x89, 0x92, 0x7d, 0x20, 0x73, 0x71, 0x60, 0x7c, 0x60, 0x63, 0xbd, 0xd8, 0x0b, 0xb2, - 0xd0, 0x00, 0x8c, 0x1f, 0x44, 0xd9, 0x4a, 0x59, 0xc9, 0x01, 0x72, 0x6c, 0x63, 0xbd, 0x38, 0xdc, - 0x31, 0x8d, 0xc7, 0xec, 0x96, 0xe9, 0x91, 0x56, 0xdb, 0x5b, 0xd3, 0xb2, 0x95, 0x32, 0xbe, 0x80, - 0xf2, 0x13, 0xb6, 0x41, 0x94, 0x3c, 0x10, 0xe1, 0x8d, 0xf5, 0xe2, 0x48, 0xc3, 0x36, 0x88, 0x40, - 0x05, 0x78, 0xfc, 0x0a, 0xca, 0x2f, 0x98, 0x2d, 0xa2, 0xf4, 0x3e, 0x90, 0xb9, 0x38, 0x78, 0xf5, - 0xcc, 0x65, 0x26, 0x95, 0xcb, 0xbe, 0x54, 0x2e, 0x2f, 0xf8, 0x62, 0x1b, 0x1f, 0x7d, 0x6b, 0xbd, - 0xd8, 0xb3, 0xb1, 0x5e, 0xcc, 0x53, 0x49, 0x7e, 0xf6, 0x6b, 0xc5, 0x8c, 0x06, 0x25, 0xf1, 0x8b, - 0x68, 0x70, 0xa2, 0xd9, 0x71, 0x3d, 0xe2, 0xcc, 0xe9, 0x2d, 0xa2, 0x14, 0xa0, 0xc2, 0x33, 0x1b, - 0xeb, 0xc5, 0x93, 0x0d, 0x06, 0xae, 0x5b, 0x7a, 0x4b, 0xac, 0x58, 0x24, 0x57, 0x7f, 0x2d, 0x83, - 0x8e, 0xd5, 0x88, 0xeb, 0x9a, 0xb6, 0x15, 0xc8, 0xe6, 0x11, 0x34, 0xc0, 0x41, 0x95, 0x32, 0xc8, - 0x67, 0x60, 0xbc, 0x6f, 0x63, 0xbd, 0x98, 0x73, 0x4d, 0x43, 0x0b, 0x31, 0xf8, 0x09, 0xd4, 0x77, - 0xdb, 0xf4, 0x56, 0x66, 0xa7, 0x4a, 0x5c, 0x4e, 0x27, 0x37, 0xd6, 0x8b, 0x78, 0xd5, 0xf4, 0x56, - 0xea, 0xad, 0x25, 0x5d, 0xa8, 0xd0, 0x27, 0xc3, 0x33, 0x68, 0xb4, 0xea, 0x98, 0x77, 0x75, 0x8f, - 0xdc, 0x20, 0x6b, 0x55, 0xbb, 0x69, 0x36, 0xd6, 0xb8, 0x14, 0x1f, 0xd8, 0x58, 0x2f, 0x9e, 0x6d, - 0x33, 0x5c, 0xfd, 0x0e, 0x59, 0xab, 0xb7, 0x01, 0x2b, 0x30, 0x89, 0x95, 0x54, 0xbf, 0xd2, 0x8b, - 0x86, 0x6e, 0xba, 0xc4, 0x09, 0xda, 0x7d, 0x01, 0xe5, 0xe9, 0x6f, 0xde, 0x64, 0x90, 0x79, 0xc7, - 0x25, 0x8e, 0x28, 0x73, 0x8a, 0xc7, 0x97, 0x50, 0xef, 0x8c, 0xbd, 0x6c, 0x5a, 0xbc, 0xd9, 0xc7, - 0x37, 0xd6, 0x8b, 0xc7, 0x9a, 0x14, 0x20, 0x50, 0x32, 0x0a, 0xfc, 0x7e, 0x34, 0x54, 0x69, 0x51, - 0x1d, 0xb2, 0x2d, 0xdd, 0xb3, 0x1d, 0xde, 0x5a, 0x90, 0xae, 0x29, 0xc0, 0x85, 0x82, 0x12, 0x3d, - 0x7e, 0x1e, 0xa1, 0xd2, 0xed, 0x9a, 0x66, 0x37, 0x49, 0x49, 0x9b, 0xe3, 0xca, 0x00, 0xa5, 0xf5, - 0x55, 0xb7, 0xee, 0xd8, 0x4d, 0x52, 0xd7, 0x1d, 0xb1, 0x5a, 0x81, 0x1a, 0x4f, 0xa2, 0x91, 0x52, - 0xa3, 0x41, 0x5c, 0x57, 0x23, 0x1f, 0xeb, 0x10, 0xd7, 0x73, 0x95, 0xde, 0x07, 0x72, 0x17, 0x07, - 0xc6, 0xcf, 0x6d, 0xac, 0x17, 0x4f, 0xeb, 0x80, 0xa9, 0x3b, 0x1c, 0x25, 0xb0, 0x88, 0x14, 0xc2, - 0xe3, 0x68, 0xb8, 0xf4, 0x66, 0xc7, 0x21, 0x15, 0x83, 0x58, 0x9e, 0xe9, 0xad, 0x71, 0x0d, 0x39, - 0xbb, 0xb1, 0x5e, 0x54, 0x74, 0x8a, 0xa8, 0x9b, 0x1c, 0x23, 0x30, 0x91, 0x8b, 0xe0, 0x79, 0x34, - 0x76, 0x7d, 0xa2, 0x5a, 0x23, 0xce, 0x5d, 0xb3, 0x41, 0x4a, 0x8d, 0x86, 0xdd, 0xb1, 0x3c, 0xa5, - 0x0f, 0xf8, 0x3c, 0xb8, 0xb1, 0x5e, 0x3c, 0xb7, 0xdc, 0x68, 0xd7, 0x5d, 0x86, 0xad, 0xeb, 0x0c, - 0x2d, 0x30, 0x8b, 0x97, 0xc5, 0x1f, 0x44, 0xc3, 0x0b, 0x0e, 0xd5, 0x42, 0xa3, 0x4c, 0x28, 0x5c, - 0xe9, 0x07, 0xfd, 0x3f, 0x79, 0x99, 0x4f, 0x40, 0x0c, 0xea, 0xf7, 0x2c, 0x6b, 0xac, 0xc7, 0x0a, - 0xd4, 0x0d, 0xc0, 0x89, 0x8d, 0x95, 0x58, 0x61, 0x82, 0x14, 0xfa, 0xf1, 0xa6, 0x43, 0x8c, 0x98, - 0xb6, 0x0d, 0x40, 0x9b, 0x2f, 0x6d, 0xac, 0x17, 0x1f, 0x71, 0x38, 0x4d, 0xbd, 0xab, 0xda, 0xa5, - 0xb2, 0xc2, 0x93, 0xa8, 0x9f, 0x6a, 0xd3, 0x0d, 0xd3, 0x32, 0x14, 0xf4, 0x40, 0xe6, 0xe2, 0xc8, - 0xd5, 0x51, 0xbf, 0xf5, 0x3e, 0x7c, 0xfc, 0xd4, 0xc6, 0x7a, 0xf1, 0x38, 0xd5, 0xc1, 0xfa, 0x1d, - 0xd3, 0x12, 0xa7, 0x88, 0xa0, 0xa8, 0xfa, 0x17, 0x79, 0x34, 0x42, 0x85, 0x23, 0xe8, 0x71, 0x89, - 0x0e, 0x49, 0x0a, 0xa1, 0x23, 0xd4, 0x6d, 0xeb, 0x0d, 0xc2, 0x55, 0x1a, 0xd8, 0x59, 0x3e, 0x50, - 0x60, 0x17, 0xa5, 0xc7, 0x97, 0x50, 0x3f, 0x03, 0x55, 0xca, 0x5c, 0xcb, 0x87, 0x37, 0xd6, 0x8b, - 0x03, 0x2e, 0xc0, 0xea, 0xa6, 0xa1, 0x05, 0x68, 0xaa, 0x66, 0xec, 0xef, 0x69, 0xdb, 0xf5, 0x28, - 0x73, 0xae, 0xe4, 0xa0, 0x66, 0xbc, 0xc0, 0x0a, 0x47, 0x89, 0x6a, 0x26, 0x17, 0xc2, 0xcf, 0x21, - 0xc4, 0x20, 0x25, 0xc3, 0x70, 0xb8, 0xa6, 0x9f, 0xde, 0x58, 0x2f, 0xde, 0xc7, 0x59, 0xe8, 0x86, - 0x21, 0x0e, 0x13, 0x81, 0x18, 0xb7, 0xd0, 0x10, 0xfb, 0x35, 0xa3, 0x2f, 0x92, 0x26, 0x53, 0xf3, - 0xc1, 0xab, 0x17, 0x7d, 0x69, 0xca, 0xd2, 0xb9, 0x2c, 0x92, 0x4e, 0x5a, 0x9e, 0xb3, 0x36, 0x5e, - 0xe4, 0x33, 0xe3, 0x29, 0x5e, 0x55, 0x13, 0x70, 0xe2, 0x98, 0x14, 0xcb, 0xd0, 0x09, 0x73, 0xca, - 0x76, 0x56, 0x75, 0xc7, 0x20, 0xc6, 0xf8, 0x9a, 0x38, 0x61, 0x2e, 0xf9, 0xe0, 0xfa, 0xa2, 0xa8, - 0x03, 0x22, 0x39, 0x9e, 0x40, 0xc3, 0x8c, 0x5b, 0xad, 0xb3, 0x08, 0x7d, 0xdf, 0x17, 0x93, 0x96, - 0xdb, 0x59, 0x8c, 0xf6, 0xb7, 0x5c, 0x86, 0x8e, 0x49, 0x06, 0xb8, 0x45, 0x1c, 0x3a, 0x9b, 0x82, - 0xfa, 0xf3, 0x31, 0xc9, 0x99, 0xdc, 0x65, 0x98, 0x38, 0x0f, 0x5e, 0xe4, 0xcc, 0xcb, 0x68, 0x2c, - 0x26, 0x0a, 0x3c, 0x8a, 0x72, 0x77, 0xc8, 0x1a, 0x53, 0x17, 0x8d, 0xfe, 0x89, 0x4f, 0xa0, 0xde, - 0xbb, 0x7a, 0xb3, 0xc3, 0xd7, 0x32, 0x8d, 0xfd, 0x78, 0x3e, 0xfb, 0xbe, 0x0c, 0x9d, 0xfa, 0xf1, - 0x84, 0x6d, 0x59, 0xa4, 0xe1, 0x89, 0xb3, 0xff, 0x33, 0x68, 0x60, 0xc6, 0x6e, 0xe8, 0x4d, 0xe8, - 0x47, 0xa6, 0x77, 0xca, 0xc6, 0x7a, 0xf1, 0x04, 0xed, 0xc0, 0xcb, 0x4d, 0x8a, 0x11, 0xda, 0x14, - 0x92, 0x52, 0x05, 0xd0, 0x48, 0xcb, 0xf6, 0x08, 0x14, 0xcc, 0x86, 0x0a, 0x00, 0x05, 0x1d, 0x40, - 0x89, 0x0a, 0x10, 0x12, 0xe3, 0x2b, 0xa8, 0xbf, 0x4a, 0x17, 0xbc, 0x86, 0xdd, 0xe4, 0xca, 0x07, - 0x73, 0x32, 0x2c, 0x82, 0xe2, 0xa0, 0xf1, 0x89, 0xd4, 0x69, 0x34, 0x32, 0xd1, 0x34, 0x89, 0xe5, - 0x89, 0xad, 0xa6, 0x43, 0xaa, 0xb4, 0x4c, 0x2c, 0x4f, 0x6c, 0x35, 0x0c, 0x3e, 0x9d, 0x42, 0xc5, - 0x56, 0x07, 0xa4, 0xea, 0xef, 0xe6, 0xd0, 0xe9, 0x1b, 0x9d, 0x45, 0xe2, 0x58, 0xc4, 0x23, 0x2e, - 0x5f, 0x19, 0x03, 0xae, 0x73, 0x68, 0x2c, 0x86, 0xe4, 0xdc, 0x61, 0xc5, 0xba, 0x13, 0x20, 0xeb, - 0x7c, 0xb1, 0x15, 0xa7, 0xbd, 0x58, 0x51, 0x3c, 0x8d, 0x8e, 0x85, 0x40, 0xda, 0x08, 0x57, 0xc9, - 0xc2, 0x9c, 0x7e, 0x7e, 0x63, 0xbd, 0x78, 0x46, 0xe0, 0x46, 0x9b, 0x2d, 0x6a, 0x70, 0xb4, 0x18, - 0xbe, 0x81, 0x46, 0x43, 0xd0, 0x75, 0xc7, 0xee, 0xb4, 0x5d, 0x25, 0x07, 0xac, 0x8a, 0x1b, 0xeb, - 0xc5, 0xfb, 0x05, 0x56, 0xcb, 0x80, 0x14, 0x57, 0xd2, 0x68, 0x41, 0xfc, 0xed, 0x19, 0x91, 0x1b, - 0x1f, 0x85, 0x79, 0x18, 0x85, 0xcf, 0xfa, 0xa3, 0x30, 0x55, 0x48, 0x97, 0xa3, 0x25, 0xf9, 0xa0, - 0x8c, 0x34, 0x23, 0x36, 0x28, 0x63, 0x35, 0x9e, 0x99, 0x40, 0xf7, 0x25, 0xf2, 0xda, 0x96, 0x56, - 0xff, 0x69, 0x4e, 0xe4, 0x52, 0xb5, 0x8d, 0xa0, 0x33, 0xe7, 0xc5, 0xce, 0xac, 0xda, 0x06, 0x98, - 0x4b, 0x99, 0x70, 0x11, 0x13, 0x1a, 0xdb, 0xb6, 0x8d, 0xa8, 0xd5, 0x14, 0x2f, 0x8b, 0x3f, 0x8a, - 0x4e, 0xc6, 0x80, 0x6c, 0xba, 0x66, 0xda, 0x7f, 0x61, 0x63, 0xbd, 0xa8, 0x26, 0x70, 0x8d, 0xce, - 0xde, 0x29, 0x5c, 0xb0, 0x8e, 0x4e, 0x09, 0x52, 0xb7, 0x2d, 0x4f, 0x37, 0x2d, 0x6e, 0xe5, 0xb1, - 0x51, 0xf2, 0x9e, 0x8d, 0xf5, 0xe2, 0x43, 0xa2, 0x0e, 0xfa, 0x34, 0xd1, 0xc6, 0xa7, 0xf1, 0xc1, - 0x06, 0x52, 0x12, 0x50, 0x95, 0x96, 0xbe, 0xec, 0x9b, 0xae, 0x17, 0x37, 0xd6, 0x8b, 0x0f, 0x27, - 0xd6, 0x61, 0x52, 0x2a, 0x71, 0xa9, 0x4c, 0xe3, 0x84, 0x35, 0x84, 0x43, 0xdc, 0x9c, 0x6d, 0x10, - 0xf8, 0x86, 0x5e, 0xe0, 0xaf, 0x6e, 0xac, 0x17, 0xcf, 0x0b, 0xfc, 0x2d, 0xdb, 0x20, 0xd1, 0xe6, - 0x27, 0x94, 0x56, 0x7f, 0x2d, 0x87, 0xce, 0xd7, 0x4a, 0xb3, 0x33, 0x15, 0xc3, 0xb7, 0x2d, 0xaa, - 0x8e, 0x7d, 0xd7, 0x34, 0x84, 0xd1, 0xbb, 0x88, 0x4e, 0x45, 0x50, 0x93, 0x60, 0xce, 0x04, 0x56, - 0x2d, 0x7c, 0x9b, 0x6f, 0xb7, 0xb4, 0x39, 0x4d, 0x9d, 0xd9, 0x3c, 0x75, 0xc9, 0xa4, 0x4f, 0x63, - 0x44, 0xfb, 0x28, 0x82, 0xaa, 0xad, 0xd8, 0x8e, 0xd7, 0xe8, 0x78, 0x5c, 0x09, 0xa0, 0x8f, 0x62, - 0x75, 0xb8, 0x9c, 0xa8, 0x4b, 0x15, 0x3e, 0x1f, 0xfc, 0xc9, 0x0c, 0x1a, 0x2d, 0x79, 0x9e, 0x63, - 0x2e, 0x76, 0x3c, 0x32, 0xab, 0xb7, 0xdb, 0xa6, 0xb5, 0x0c, 0x63, 0x7d, 0xf0, 0xea, 0x8b, 0xc1, - 0x1a, 0xd9, 0x55, 0x12, 0x97, 0xa3, 0xc5, 0x85, 0x21, 0xaa, 0xfb, 0xa8, 0x7a, 0x8b, 0xe1, 0xc4, - 0x21, 0x1a, 0x2d, 0x47, 0x87, 0x68, 0x22, 0xaf, 0x6d, 0x0d, 0xd1, 0xcf, 0xe5, 0xd0, 0xd9, 0xf9, - 0x3b, 0x9e, 0xae, 0x11, 0xd7, 0xee, 0x38, 0x0d, 0xe2, 0xde, 0x6c, 0x1b, 0xba, 0x47, 0xc2, 0x91, - 0x5a, 0x44, 0xbd, 0x25, 0xc3, 0x20, 0x06, 0xb0, 0xeb, 0x65, 0xfb, 0x2f, 0x9d, 0x02, 0x34, 0x06, - 0xc7, 0x8f, 0xa0, 0x3e, 0x5e, 0x06, 0xb8, 0xf7, 0x8e, 0x0f, 0x6e, 0xac, 0x17, 0xfb, 0x3a, 0x0c, - 0xa4, 0xf9, 0x38, 0x4a, 0x56, 0x26, 0x4d, 0x42, 0xc9, 0x72, 0x21, 0x99, 0xc1, 0x40, 0x9a, 0x8f, - 0xc3, 0xaf, 0xa1, 0x11, 0x60, 0x1b, 0xb4, 0x87, 0xcf, 0x7d, 0x27, 0x7c, 0xe9, 0x8a, 0x8d, 0x65, - 0x4b, 0x13, 0xb4, 0xa6, 0xee, 0xf8, 0x05, 0xb4, 0x08, 0x03, 0x7c, 0x1b, 0x8d, 0xf2, 0x46, 0x84, - 0x4c, 0x7b, 0xbb, 0x30, 0xbd, 0x6f, 0x63, 0xbd, 0x38, 0xc6, 0xdb, 0x2f, 0xb0, 0x8d, 0x31, 0xa1, - 0x8c, 0x79, 0xb3, 0x43, 0xc6, 0x85, 0xcd, 0x18, 0xf3, 0x2f, 0x16, 0x19, 0x47, 0x99, 0xa8, 0xaf, - 0xa3, 0x21, 0xb1, 0x20, 0x3e, 0x09, 0x7b, 0x5c, 0x36, 0x4e, 0x60, 0x77, 0x6c, 0x1a, 0xb0, 0xb1, - 0x7d, 0x12, 0x0d, 0x96, 0x89, 0xdb, 0x70, 0xcc, 0x36, 0xb5, 0x1a, 0xb8, 0x92, 0x1f, 0xdb, 0x58, - 0x2f, 0x0e, 0x1a, 0x21, 0x58, 0x13, 0x69, 0xd4, 0xff, 0x9e, 0x41, 0x27, 0x29, 0xef, 0x92, 0xeb, - 0x9a, 0xcb, 0x56, 0x4b, 0x5c, 0xb6, 0x1f, 0x43, 0x85, 0x1a, 0xd4, 0xc7, 0x6b, 0x3a, 0xb1, 0xb1, - 0x5e, 0x1c, 0x65, 0x2d, 0x10, 0xf4, 0x90, 0xd3, 0x04, 0x1b, 0xbc, 0xec, 0x26, 0x1b, 0x3c, 0x6a, - 0xd2, 0x7a, 0xba, 0xe3, 0x99, 0xd6, 0x72, 0xcd, 0xd3, 0xbd, 0x8e, 0x2b, 0x99, 0xb4, 0x1c, 0x53, - 0x77, 0x01, 0x25, 0x99, 0xb4, 0x52, 0x21, 0xfc, 0x32, 0x1a, 0x9a, 0xb4, 0x8c, 0x90, 0x09, 0x9b, - 0x10, 0xef, 0xa7, 0x96, 0x26, 0x01, 0x78, 0x9c, 0x85, 0x54, 0x40, 0xfd, 0xf9, 0x0c, 0x52, 0xd8, - 0x6e, 0x6c, 0xc6, 0x74, 0xbd, 0x59, 0xd2, 0x5a, 0x14, 0x66, 0xa7, 0x29, 0x7f, 0x7b, 0x47, 0x71, - 0xc2, 0x5a, 0x04, 0xa6, 0x00, 0xdf, 0xde, 0x35, 0x4d, 0xd7, 0x8b, 0x4e, 0x86, 0x91, 0x52, 0xb8, - 0x82, 0xfa, 0x18, 0x67, 0x66, 0x4b, 0x0c, 0x5e, 0x55, 0x7c, 0x45, 0x88, 0x56, 0xcd, 0x94, 0xa1, - 0xc5, 0x88, 0xc5, 0xfd, 0x39, 0x2f, 0xaf, 0xfe, 0x62, 0x16, 0x8d, 0x46, 0x0b, 0xe1, 0xdb, 0xa8, - 0xff, 0x55, 0xdb, 0xb4, 0x88, 0x31, 0x6f, 0x41, 0x0b, 0xbb, 0x9f, 0x52, 0xf8, 0xb6, 0xf8, 0xf1, - 0x37, 0xa0, 0x4c, 0x5d, 0xb4, 0x60, 0xe1, 0xd0, 0x22, 0x60, 0x86, 0x3f, 0x88, 0x06, 0xa8, 0x0d, - 0x78, 0x17, 0x38, 0x67, 0x37, 0xe5, 0xfc, 0x00, 0xe7, 0x7c, 0xc2, 0x61, 0x85, 0xe2, 0xac, 0x43, - 0x76, 0x54, 0xaf, 0x34, 0xa2, 0xbb, 0xb6, 0xc5, 0x7b, 0x1e, 0xf4, 0xca, 0x01, 0x88, 0xa8, 0x57, - 0x8c, 0x86, 0x9a, 0xae, 0xec, 0x63, 0xa1, 0x1b, 0x84, 0xbd, 0x0b, 0x93, 0x55, 0xb4, 0x07, 0x04, - 0x62, 0xf5, 0x3b, 0xb3, 0xe8, 0xf1, 0x50, 0x64, 0x1a, 0xb9, 0x6b, 0x92, 0x55, 0x2e, 0xce, 0x15, - 0xb3, 0xcd, 0x37, 0x8f, 0x54, 0xe5, 0xdd, 0x89, 0x15, 0xdd, 0x5a, 0x26, 0x06, 0xbe, 0x84, 0x7a, - 0xe9, 0x0e, 0xdf, 0x55, 0x32, 0x60, 0xae, 0xc1, 0x74, 0xe2, 0x50, 0x80, 0x78, 0xfa, 0x00, 0x14, - 0xd8, 0x46, 0x85, 0x05, 0x47, 0x37, 0x3d, 0xbf, 0x67, 0x4b, 0xf1, 0x9e, 0xdd, 0x42, 0x8d, 0x97, - 0x19, 0x0f, 0x36, 0xe7, 0x83, 0x20, 0x3c, 0x00, 0x88, 0x82, 0x60, 0x24, 0x67, 0x9e, 0x43, 0x83, - 0x02, 0xf1, 0xb6, 0x26, 0xf5, 0x2f, 0xe5, 0x45, 0x5d, 0xf7, 0x9b, 0xc5, 0x75, 0xfd, 0x0a, 0xd5, - 0x51, 0xd7, 0xa5, 0x56, 0x05, 0x53, 0x72, 0xae, 0x89, 0x00, 0x92, 0x35, 0x11, 0x40, 0xf8, 0x29, - 0xd4, 0xcf, 0x58, 0x04, 0xfb, 0x57, 0xd8, 0xfb, 0x3a, 0x00, 0x93, 0x97, 0xe6, 0x80, 0x10, 0xff, - 0x6c, 0x06, 0x9d, 0xeb, 0x2a, 0x09, 0x50, 0x86, 0xc1, 0xab, 0x4f, 0xef, 0x48, 0x8c, 0xe3, 0x8f, - 0x6f, 0xac, 0x17, 0x2f, 0xb5, 0x02, 0x92, 0xba, 0x23, 0xd0, 0xd4, 0x1b, 0x8c, 0x48, 0x68, 0x57, - 0xf7, 0xa6, 0x50, 0xe3, 0x91, 0x55, 0x3a, 0x05, 0x67, 0x38, 0x56, 0x63, 0xcd, 0x6f, 0x64, 0x3e, - 0x34, 0x1e, 0xf9, 0xf7, 0x2e, 0xf9, 0x24, 0x09, 0xd5, 0xa4, 0x70, 0xc1, 0x0d, 0x74, 0x8a, 0x61, - 0xca, 0xfa, 0xda, 0xfc, 0xd2, 0xac, 0x6d, 0x79, 0x2b, 0x7e, 0x05, 0xbd, 0xe2, 0x21, 0x08, 0x54, - 0x60, 0xe8, 0x6b, 0x75, 0x7b, 0xa9, 0xde, 0xa2, 0x54, 0x09, 0x75, 0xa4, 0x71, 0xa2, 0x13, 0x2d, - 0x1f, 0x73, 0xfe, 0x14, 0x54, 0x08, 0x8f, 0xa8, 0xfc, 0x71, 0x1a, 0x9f, 0x70, 0x22, 0x85, 0xd4, - 0x0a, 0x1a, 0x9a, 0xb1, 0x1b, 0x77, 0x02, 0x75, 0x79, 0x0e, 0x15, 0x16, 0x74, 0x67, 0x99, 0x78, - 0x20, 0x8b, 0xc1, 0xab, 0x63, 0x97, 0xd9, 0xb1, 0x2f, 0x25, 0x62, 0x88, 0xf1, 0x11, 0x3e, 0x1b, - 0x14, 0x3c, 0xf8, 0xad, 0xf1, 0x02, 0xea, 0xd7, 0x7a, 0xd1, 0x10, 0x3f, 0xa2, 0x84, 0xd9, 0x1c, - 0x3f, 0x1f, 0x1e, 0xfa, 0xf2, 0xe9, 0x2b, 0x38, 0xa6, 0x09, 0x8e, 0x97, 0x86, 0x28, 0xb3, 0xdf, - 0x5b, 0x2f, 0x66, 0x36, 0xd6, 0x8b, 0x3d, 0x5a, 0xbf, 0xb0, 0xa9, 0x0c, 0xd7, 0x1b, 0x61, 0x81, - 0x15, 0x0f, 0x1d, 0x23, 0x65, 0xd9, 0xfa, 0xf3, 0x32, 0xea, 0xe3, 0x6d, 0xe0, 0x1a, 0x77, 0x2a, - 0x3c, 0xcb, 0x90, 0x8e, 0x5a, 0x23, 0xa5, 0xfd, 0x52, 0xf8, 0x45, 0x54, 0x60, 0x7b, 0x7b, 0x2e, - 0x80, 0x93, 0xc9, 0x67, 0x21, 0x91, 0xe2, 0xbc, 0x0c, 0x9e, 0x46, 0x28, 0xdc, 0xd7, 0x07, 0x27, - 0xcb, 0x9c, 0x43, 0x7c, 0xc7, 0x1f, 0xe1, 0x22, 0x94, 0xc5, 0xcf, 0xa0, 0xa1, 0x05, 0xe2, 0xb4, - 0x4c, 0x4b, 0x6f, 0xd6, 0xcc, 0x37, 0xfd, 0xc3, 0x65, 0x58, 0x78, 0x5d, 0xf3, 0x4d, 0x71, 0xe4, - 0x4a, 0x74, 0xf8, 0x23, 0x49, 0xfb, 0xe6, 0x3e, 0x68, 0xc8, 0x83, 0x9b, 0x6e, 0x28, 0x23, 0xed, - 0x49, 0xd8, 0x46, 0xbf, 0x86, 0x86, 0xa5, 0x2d, 0x13, 0x3f, 0x3d, 0x3c, 0x17, 0x67, 0x2d, 0xec, - 0xff, 0x22, 0x6c, 0x65, 0x0e, 0x54, 0x93, 0x2b, 0x96, 0xe9, 0x99, 0x7a, 0x73, 0xc2, 0x6e, 0xb5, - 0x74, 0xcb, 0x50, 0x06, 0x42, 0x4d, 0x36, 0x19, 0xa6, 0xde, 0x60, 0x28, 0x51, 0x93, 0xe5, 0x42, - 0x74, 0x5b, 0xce, 0xfb, 0x50, 0x23, 0x0d, 0xdb, 0xa1, 0xb6, 0x00, 0x1c, 0x0e, 0xf2, 0x6d, 0xb9, - 0xcb, 0x70, 0x75, 0xc7, 0x47, 0x8a, 0xc6, 0x76, 0xb4, 0xe0, 0xab, 0xf9, 0xfe, 0xc1, 0xd1, 0xa1, - 0xe8, 0x79, 0xae, 0xfa, 0x33, 0x39, 0x34, 0xc8, 0x49, 0xe9, 0x52, 0x7a, 0xa4, 0xe0, 0xbb, 0x51, - 0xf0, 0x44, 0x45, 0x2d, 0xec, 0x95, 0xa2, 0xaa, 0x9f, 0xca, 0x06, 0xb3, 0x51, 0xd5, 0x31, 0xad, - 0xdd, 0xcd, 0x46, 0x17, 0x10, 0x9a, 0x58, 0xe9, 0x58, 0x77, 0xd8, 0xbd, 0x55, 0x36, 0xbc, 0xb7, - 0x6a, 0x98, 0x9a, 0x80, 0xc1, 0xe7, 0x50, 0xbe, 0x4c, 0xf9, 0xd3, 0x9e, 0x19, 0x1a, 0x1f, 0x78, - 0x8b, 0x71, 0xca, 0x3c, 0xae, 0x01, 0x98, 0x6e, 0xae, 0xc6, 0xd7, 0x3c, 0xc2, 0xcc, 0xd9, 0x1c, - 0xdb, 0x5c, 0x2d, 0x52, 0x80, 0xc6, 0xe0, 0xf8, 0x1a, 0x1a, 0x2b, 0x93, 0xa6, 0xbe, 0x36, 0x6b, - 0x36, 0x9b, 0xa6, 0x4b, 0x1a, 0xb6, 0x65, 0xb8, 0x20, 0x64, 0x5e, 0x5d, 0xcb, 0xd5, 0xe2, 0x04, - 0x58, 0x45, 0x85, 0xf9, 0xa5, 0x25, 0x97, 0x78, 0x20, 0xbe, 0xdc, 0x38, 0xa2, 0x93, 0xb3, 0x0d, - 0x10, 0x8d, 0x63, 0xd4, 0x2f, 0x64, 0xe8, 0xee, 0xc5, 0xbd, 0xe3, 0xd9, 0xed, 0x40, 0xcb, 0x77, - 0x25, 0x92, 0x4b, 0xa1, 0x5d, 0x91, 0x85, 0xaf, 0x3d, 0xc6, 0xbf, 0xb6, 0x8f, 0xdb, 0x16, 0xa1, - 0x45, 0x91, 0xf8, 0x55, 0xb9, 0x4d, 0xbe, 0x4a, 0xfd, 0xf3, 0x2c, 0x3a, 0xc5, 0x5b, 0x3c, 0xd1, - 0x34, 0xdb, 0x8b, 0xb6, 0xee, 0x18, 0x1a, 0x69, 0x10, 0xf3, 0x2e, 0x39, 0x98, 0x03, 0x4f, 0x1e, - 0x3a, 0xf9, 0x5d, 0x0c, 0x9d, 0xab, 0xb0, 0x11, 0xa4, 0x92, 0x81, 0x03, 0x5f, 0x66, 0x54, 0x8c, - 0x6e, 0xac, 0x17, 0x87, 0x0c, 0x06, 0x86, 0x23, 0x7f, 0x4d, 0x24, 0xa2, 0x4a, 0x32, 0x43, 0xac, - 0x65, 0x6f, 0x05, 0x94, 0xa4, 0x97, 0x29, 0x49, 0x13, 0x20, 0x1a, 0xc7, 0xa8, 0x7f, 0x96, 0x45, - 0x27, 0xa2, 0x22, 0xaf, 0x11, 0xcb, 0x38, 0x92, 0xf7, 0xdb, 0x23, 0xef, 0x6f, 0xe4, 0xd0, 0xfd, - 0xbc, 0x4c, 0x6d, 0x45, 0x77, 0x88, 0x51, 0x36, 0x1d, 0xd2, 0xf0, 0x6c, 0x67, 0xed, 0x00, 0x1b, - 0x50, 0x7b, 0x27, 0xf6, 0x6b, 0xa8, 0xc0, 0xb7, 0xff, 0x6c, 0x9d, 0x19, 0x09, 0x5a, 0x02, 0xd0, - 0xd8, 0x0a, 0xc5, 0x8e, 0x0e, 0x22, 0x9d, 0x55, 0xd8, 0x4a, 0x67, 0xbd, 0x0f, 0x0d, 0x07, 0xa2, - 0x87, 0x8d, 0x68, 0x5f, 0x68, 0x6d, 0x19, 0x3e, 0x02, 0xf6, 0xa2, 0x9a, 0x4c, 0x08, 0xb5, 0xf9, - 0x80, 0x4a, 0x19, 0xac, 0xa1, 0x61, 0x5e, 0x5b, 0x50, 0xce, 0x34, 0x34, 0x91, 0x48, 0x5d, 0xcf, - 0xa3, 0x33, 0xc9, 0xdd, 0xae, 0x11, 0xdd, 0x38, 0xea, 0xf5, 0x77, 0x65, 0xaf, 0xe3, 0x07, 0x51, - 0xbe, 0xaa, 0x7b, 0x2b, 0xfc, 0x1e, 0x1c, 0xee, 0x84, 0x97, 0xcc, 0x26, 0xa9, 0xb7, 0x75, 0x6f, - 0x45, 0x03, 0x94, 0x30, 0x67, 0x20, 0xe0, 0x98, 0x30, 0x67, 0x08, 0x8b, 0xfd, 0xe0, 0x03, 0x99, - 0x8b, 0xf9, 0xc4, 0xc5, 0xfe, 0x6b, 0xf9, 0xb4, 0x79, 0xe5, 0xb6, 0x63, 0x7a, 0xe4, 0x48, 0xc3, - 0x8e, 0x34, 0x6c, 0x97, 0x1a, 0xf6, 0x07, 0x59, 0x34, 0x1c, 0x6c, 0x9a, 0xde, 0x20, 0x8d, 0xfd, - 0x59, 0xab, 0xc2, 0xad, 0x4c, 0x6e, 0xd7, 0x5b, 0x99, 0xdd, 0x28, 0x94, 0x1a, 0x1c, 0x79, 0x32, - 0xd3, 0x00, 0x24, 0xc6, 0x8e, 0x3c, 0x83, 0x83, 0xce, 0x07, 0x51, 0xdf, 0xac, 0x7e, 0xcf, 0x6c, - 0x75, 0x5a, 0xdc, 0x4a, 0x07, 0xbf, 0xae, 0x96, 0x7e, 0x4f, 0xf3, 0xe1, 0xea, 0xbf, 0xca, 0xa0, - 0x11, 0x2e, 0x54, 0xce, 0x7c, 0x57, 0x52, 0x0d, 0xa5, 0x93, 0xdd, 0xb5, 0x74, 0x72, 0x3b, 0x97, - 0x8e, 0xfa, 0x63, 0x39, 0xa4, 0x4c, 0x99, 0x4d, 0xb2, 0xe0, 0xe8, 0x96, 0xbb, 0x44, 0x1c, 0xbe, - 0x9d, 0x9e, 0xa4, 0xac, 0x76, 0xf5, 0x81, 0xc2, 0x94, 0x92, 0xdd, 0xd1, 0x94, 0xf2, 0x5e, 0x34, - 0xc0, 0x1b, 0x13, 0xf8, 0x14, 0xc2, 0xa8, 0x71, 0x7c, 0xa0, 0x16, 0xe2, 0x29, 0x71, 0xa9, 0xdd, - 0x76, 0xec, 0xbb, 0xc4, 0x61, 0xb7, 0x54, 0x9c, 0x58, 0xf7, 0x81, 0x5a, 0x88, 0x17, 0x38, 0x13, - 0xdf, 0x5e, 0x14, 0x39, 0x13, 0x47, 0x0b, 0xf1, 0xf8, 0x22, 0xea, 0x9f, 0xb1, 0x1b, 0x3a, 0x08, - 0x9a, 0x4d, 0x2b, 0x43, 0x1b, 0xeb, 0xc5, 0xfe, 0x26, 0x87, 0x69, 0x01, 0x96, 0x52, 0x96, 0xed, - 0x55, 0xab, 0x69, 0xeb, 0xcc, 0xf9, 0xa5, 0x9f, 0x51, 0x1a, 0x1c, 0xa6, 0x05, 0x58, 0x4a, 0x49, - 0x65, 0x0e, 0x4e, 0x45, 0xfd, 0x21, 0xcf, 0x25, 0x0e, 0xd3, 0x02, 0xac, 0xfa, 0x85, 0x3c, 0xd5, - 0x5e, 0xd7, 0x7c, 0xf3, 0xd0, 0xaf, 0x0b, 0xe1, 0x80, 0xe9, 0xdd, 0xc1, 0x80, 0x39, 0x34, 0x07, - 0x76, 0xea, 0x5f, 0xf4, 0x21, 0xc4, 0xa5, 0x3f, 0x79, 0xb4, 0x39, 0xdc, 0x9d, 0xd6, 0x94, 0xd1, - 0xd8, 0xa4, 0xb5, 0xa2, 0x5b, 0x0d, 0x62, 0x84, 0xc7, 0x96, 0x05, 0x18, 0xda, 0xe0, 0xd3, 0x4b, - 0x38, 0x32, 0x3c, 0xb7, 0xd4, 0xe2, 0x05, 0xf0, 0x93, 0x68, 0xb0, 0x62, 0x79, 0xc4, 0xd1, 0x1b, - 0x9e, 0x79, 0x97, 0xf0, 0xa9, 0x01, 0x6e, 0x86, 0xcd, 0x10, 0xac, 0x89, 0x34, 0xf8, 0x1a, 0x1a, - 0xaa, 0xea, 0x8e, 0x67, 0x36, 0xcc, 0xb6, 0x6e, 0x79, 0xae, 0xd2, 0x0f, 0x33, 0x1a, 0x58, 0x18, - 0x6d, 0x01, 0xae, 0x49, 0x54, 0xf8, 0x23, 0x68, 0x00, 0xb6, 0xa6, 0xe0, 0x38, 0x3d, 0xb0, 0xe9, - 0xc5, 0xe1, 0x43, 0xa1, 0x7b, 0x20, 0x3b, 0x7d, 0x85, 0x1b, 0xe0, 0xe8, 0xdd, 0x61, 0xc0, 0x11, - 0x7f, 0x00, 0xf5, 0x4d, 0x5a, 0x06, 0x30, 0x47, 0x9b, 0x32, 0x57, 0x39, 0xf3, 0x93, 0x21, 0x73, - 0xbb, 0x1d, 0xe1, 0xed, 0xb3, 0x4b, 0x1e, 0x65, 0x83, 0x6f, 0xdf, 0x28, 0x1b, 0x7a, 0x1b, 0x8e, - 0xc5, 0x87, 0xf7, 0xea, 0x58, 0x7c, 0x64, 0x87, 0xc7, 0xe2, 0xea, 0x9b, 0x68, 0x70, 0xbc, 0x3a, - 0x15, 0x8c, 0xde, 0xd3, 0x28, 0x57, 0xe5, 0x9e, 0x0a, 0x79, 0x66, 0xcf, 0xb4, 0x4d, 0x43, 0xa3, - 0x30, 0x7c, 0x09, 0xf5, 0x4f, 0x80, 0xfb, 0x1b, 0xbf, 0x45, 0xcc, 0xb3, 0xf5, 0xaf, 0x01, 0x30, - 0xf0, 0x82, 0xf5, 0xd1, 0xf8, 0x11, 0xd4, 0x57, 0x75, 0xec, 0x65, 0x47, 0x6f, 0xf1, 0x35, 0x18, - 0x5c, 0x45, 0xda, 0x0c, 0xa4, 0xf9, 0x38, 0xf5, 0xfb, 0x32, 0xbe, 0xd9, 0x4e, 0x4b, 0xd4, 0x3a, - 0x70, 0x34, 0x0f, 0x75, 0xf7, 0xb3, 0x12, 0x2e, 0x03, 0x69, 0x3e, 0x0e, 0x5f, 0x42, 0xbd, 0x93, - 0x8e, 0x63, 0x3b, 0xa2, 0xb3, 0x39, 0xa1, 0x00, 0xf1, 0xba, 0x17, 0x28, 0xf0, 0xb3, 0x68, 0x90, - 0xcd, 0x39, 0xec, 0x44, 0x33, 0xd7, 0xed, 0xa6, 0x54, 0xa4, 0x54, 0xbf, 0x92, 0x13, 0x6c, 0x36, - 0x26, 0xf1, 0x43, 0x78, 0x2b, 0xf0, 0x14, 0xca, 0x8d, 0x57, 0xa7, 0xf8, 0x04, 0x78, 0xdc, 0x2f, - 0x2a, 0xa8, 0x4a, 0xa4, 0x1c, 0xa5, 0xc6, 0x67, 0x51, 0xbe, 0x4a, 0xd5, 0xa7, 0x00, 0xea, 0xd1, - 0xbf, 0xb1, 0x5e, 0xcc, 0xb7, 0xa9, 0xfe, 0x00, 0x14, 0xb0, 0x74, 0x33, 0xc3, 0x76, 0x4c, 0x0c, - 0x1b, 0xee, 0x63, 0xce, 0xa2, 0x7c, 0xc9, 0x59, 0xbe, 0xcb, 0x67, 0x2d, 0xc0, 0xea, 0xce, 0xf2, - 0x5d, 0x0d, 0xa0, 0xf8, 0x0a, 0x42, 0x1a, 0xf1, 0x3a, 0x8e, 0x05, 0xef, 0x40, 0x06, 0xe0, 0xfc, - 0x0d, 0x66, 0x43, 0x07, 0xa0, 0xf5, 0x86, 0x6d, 0x10, 0x4d, 0x20, 0x51, 0x7f, 0x2a, 0xbc, 0xd8, - 0x29, 0x9b, 0xee, 0x9d, 0xa3, 0x2e, 0xdc, 0x46, 0x17, 0xea, 0xfc, 0x88, 0x33, 0xde, 0x49, 0x45, - 0xd4, 0x3b, 0xd5, 0xd4, 0x97, 0x5d, 0xe8, 0x43, 0xee, 0x4b, 0xb6, 0x44, 0x01, 0x1a, 0x83, 0x47, - 0xfa, 0xa9, 0x7f, 0xf3, 0x7e, 0xfa, 0xc1, 0xde, 0x60, 0xb4, 0xcd, 0x11, 0x6f, 0xd5, 0x76, 0x8e, - 0xba, 0x6a, 0xab, 0x5d, 0x75, 0x01, 0xf5, 0xd5, 0x9c, 0x86, 0x70, 0x74, 0x01, 0xfb, 0x01, 0xd7, - 0x69, 0xb0, 0x63, 0x0b, 0x1f, 0x49, 0xe9, 0xca, 0xae, 0x07, 0x74, 0x7d, 0x21, 0x9d, 0xe1, 0x7a, - 0x9c, 0x8e, 0x23, 0x39, 0x5d, 0xd5, 0x76, 0x3c, 0xde, 0x71, 0x01, 0x5d, 0xdb, 0x76, 0x3c, 0xcd, - 0x47, 0xe2, 0xf7, 0x22, 0xb4, 0x30, 0x51, 0xf5, 0x9d, 0xed, 0x07, 0x42, 0x5f, 0x40, 0xee, 0x65, - 0xaf, 0x09, 0x68, 0xbc, 0x80, 0x06, 0xe6, 0xdb, 0xc4, 0x61, 0x5b, 0x21, 0xf6, 0xb2, 0xe3, 0x3d, - 0x11, 0xd1, 0xf2, 0x7e, 0xbf, 0xcc, 0xff, 0x0f, 0xc8, 0xd9, 0xfa, 0x62, 0xfb, 0x3f, 0xb5, 0x90, - 0x11, 0x7e, 0x16, 0x15, 0x4a, 0xcc, 0xce, 0x1b, 0x04, 0x96, 0x81, 0xc8, 0x60, 0x0b, 0xca, 0x50, - 0x6c, 0xcf, 0xae, 0xc3, 0xdf, 0x1a, 0x27, 0x57, 0x2f, 0xa1, 0xd1, 0x68, 0x35, 0x78, 0x10, 0xf5, - 0x4d, 0xcc, 0xcf, 0xcd, 0x4d, 0x4e, 0x2c, 0x8c, 0xf6, 0xe0, 0x7e, 0x94, 0xaf, 0x4d, 0xce, 0x95, - 0x47, 0x33, 0xea, 0xcf, 0x09, 0x33, 0x08, 0x55, 0xad, 0xa3, 0xab, 0xe1, 0x5d, 0xdd, 0xb7, 0x8c, - 0xc2, 0x7d, 0x28, 0x9c, 0x18, 0xb4, 0x4c, 0xcf, 0x23, 0x06, 0x5f, 0x25, 0xe0, 0xbe, 0xd0, 0xbb, - 0xa7, 0xc5, 0xf0, 0xf8, 0x31, 0x34, 0x0c, 0x30, 0x7e, 0x45, 0xc8, 0xf6, 0xc7, 0xbc, 0x80, 0x73, - 0x4f, 0x93, 0x91, 0xea, 0x57, 0xc3, 0xdb, 0xe1, 0x19, 0xa2, 0x1f, 0xd4, 0x1b, 0xc5, 0x77, 0x48, - 0x7f, 0xa9, 0x7f, 0x95, 0x67, 0x4f, 0x40, 0xd8, 0xc3, 0xbd, 0xfd, 0x10, 0x65, 0x78, 0xa4, 0x9b, - 0xdb, 0xc6, 0x91, 0xee, 0x63, 0xa8, 0x30, 0x4b, 0xbc, 0x15, 0xdb, 0x77, 0xfc, 0x02, 0x0f, 0xbd, - 0x16, 0x40, 0x44, 0x0f, 0x3d, 0x46, 0x83, 0xef, 0x20, 0xec, 0xbf, 0xca, 0x0b, 0x1c, 0xb1, 0xfd, - 0x23, 0xe4, 0x53, 0xb1, 0x7d, 0x4a, 0x0d, 0x9e, 0xe4, 0x82, 0x8f, 0xfd, 0x89, 0xc0, 0xd1, 0x5b, - 0xf0, 0xc4, 0xfa, 0xcb, 0xf5, 0x62, 0x81, 0xd1, 0x68, 0x09, 0x6c, 0xf1, 0x6b, 0x68, 0x60, 0x76, - 0xaa, 0xc4, 0x5f, 0xe8, 0x31, 0xaf, 0x88, 0xd3, 0x81, 0x14, 0x7d, 0x44, 0x20, 0x12, 0x78, 0x6f, - 0xd3, 0x5a, 0xd2, 0xe3, 0x0f, 0xf4, 0x42, 0x2e, 0x54, 0x5b, 0xd8, 0xcb, 0x1d, 0x7e, 0xba, 0x10, - 0x68, 0x8b, 0xfc, 0x9e, 0x27, 0x2a, 0x2b, 0x86, 0x8d, 0x68, 0x4b, 0xff, 0x2e, 0x46, 0xf7, 0x3c, - 0x1a, 0x2b, 0xb5, 0xdb, 0x4d, 0x93, 0x18, 0xa0, 0x2f, 0x5a, 0xa7, 0x49, 0x5c, 0xee, 0xf2, 0x03, - 0x8f, 0x41, 0x74, 0x86, 0xac, 0xc3, 0xbb, 0xd0, 0xba, 0xd3, 0x91, 0xfd, 0x33, 0xe3, 0x65, 0xd5, - 0x1f, 0xc8, 0xa2, 0x93, 0x13, 0x0e, 0xd1, 0x3d, 0x32, 0x3b, 0x55, 0x2a, 0x75, 0xc0, 0x47, 0xae, - 0xd9, 0x24, 0xd6, 0xf2, 0xfe, 0x0c, 0xeb, 0x17, 0xd0, 0x48, 0xd0, 0x80, 0x5a, 0xc3, 0x6e, 0x13, - 0xf1, 0x61, 0x55, 0xc3, 0xc7, 0xd4, 0x5d, 0x8a, 0xd2, 0x22, 0xa4, 0xf8, 0x06, 0x3a, 0x1e, 0x40, - 0x4a, 0xcd, 0xa6, 0xbd, 0xaa, 0x91, 0x8e, 0xcb, 0x1c, 0x63, 0xfb, 0x99, 0x63, 0x6c, 0xc8, 0x41, - 0xa7, 0xf8, 0xba, 0x43, 0x09, 0xb4, 0xa4, 0x52, 0xea, 0xe7, 0x73, 0xe8, 0xd4, 0x2d, 0xbd, 0x69, - 0x1a, 0xa1, 0x68, 0x34, 0xe2, 0xb6, 0x6d, 0xcb, 0x25, 0x07, 0x68, 0x94, 0x4a, 0x43, 0x21, 0xbf, - 0x27, 0x43, 0x21, 0xde, 0x45, 0xbd, 0xbb, 0xee, 0xa2, 0xc2, 0x8e, 0xba, 0xe8, 0x3f, 0x67, 0xd0, - 0xa8, 0xef, 0xf8, 0x2f, 0xbe, 0xa6, 0x16, 0xbc, 0xd2, 0xe1, 0x08, 0x31, 0xe2, 0x07, 0x0d, 0x78, - 0x5c, 0x43, 0x7d, 0x93, 0xf7, 0xda, 0xa6, 0x43, 0xdc, 0x2d, 0x38, 0x71, 0x9f, 0xe3, 0xc7, 0x25, - 0x63, 0x84, 0x15, 0x89, 0x9d, 0x94, 0x30, 0x30, 0x3c, 0xe7, 0x63, 0x4f, 0x1f, 0xc6, 0xfd, 0x27, - 0xe2, 0xec, 0x39, 0x1f, 0x7f, 0x22, 0x21, 0xbd, 0xcf, 0x0c, 0x49, 0xf1, 0x43, 0x28, 0xb7, 0xb0, - 0x30, 0xc3, 0x67, 0x52, 0x78, 0x9a, 0xef, 0x79, 0xe2, 0x7b, 0x45, 0x8a, 0x55, 0xff, 0x38, 0x8b, - 0x10, 0x55, 0x05, 0x36, 0x5c, 0xf7, 0x45, 0x09, 0xc7, 0x51, 0xbf, 0x2f, 0x70, 0xae, 0x86, 0x81, - 0xd7, 0x7e, 0xb4, 0x23, 0xa2, 0x75, 0x07, 0x2f, 0x34, 0x8a, 0xbe, 0x23, 0x39, 0xbb, 0x07, 0x80, - 0x9d, 0x0d, 0x38, 0x92, 0xfb, 0xee, 0xe3, 0xef, 0x45, 0x03, 0x7c, 0xc6, 0xb3, 0xa5, 0xf3, 0xff, - 0x86, 0x0f, 0xd4, 0x42, 0x7c, 0x64, 0x6a, 0x2d, 0xec, 0x62, 0x21, 0xf6, 0xc5, 0xcb, 0x7a, 0xe5, - 0x48, 0xbc, 0x7b, 0x2c, 0xde, 0xcf, 0x70, 0xf1, 0xb2, 0x17, 0x3c, 0x07, 0x56, 0xbc, 0x7b, 0x76, - 0xf6, 0xad, 0xfe, 0x41, 0x06, 0x61, 0xda, 0xac, 0xaa, 0xee, 0xba, 0xab, 0xb6, 0x63, 0x30, 0xe7, - 0xf4, 0x7d, 0x11, 0xcc, 0xde, 0xdd, 0x57, 0x7e, 0xa5, 0x1f, 0x1d, 0x97, 0x1c, 0x7f, 0x0f, 0xf8, - 0x64, 0x75, 0x49, 0x1e, 0x4d, 0xdd, 0x5e, 0xbd, 0x3c, 0x2c, 0x5e, 0x88, 0xf6, 0x4a, 0x0f, 0xd0, - 0x84, 0x9b, 0xd0, 0xc7, 0xd1, 0x10, 0xff, 0x41, 0x57, 0x68, 0xff, 0xa6, 0x0b, 0x46, 0xa9, 0x4b, - 0x01, 0x9a, 0x84, 0xc6, 0x4f, 0xa3, 0x01, 0x3a, 0x60, 0x96, 0x21, 0x8a, 0x47, 0x5f, 0xf8, 0xa2, - 0xc4, 0xf0, 0x81, 0xe2, 0x7a, 0x12, 0x50, 0x0a, 0xef, 0x88, 0xfa, 0xb7, 0xf0, 0x8e, 0xe8, 0xa3, - 0x68, 0xb0, 0x64, 0x59, 0xb6, 0x07, 0x9b, 0x74, 0x97, 0x5f, 0x4d, 0xa4, 0x5a, 0xe5, 0x0f, 0xc1, - 0xe3, 0xf8, 0x90, 0x3e, 0xd1, 0x2c, 0x17, 0x19, 0xe2, 0xab, 0xfe, 0xab, 0x18, 0xe2, 0x70, 0xaf, - 0x72, 0xb8, 0x9e, 0x71, 0x38, 0x2c, 0xfe, 0x28, 0x06, 0x3a, 0x6f, 0xb8, 0xea, 0xd8, 0x6d, 0xdb, - 0x25, 0x06, 0x13, 0xd4, 0x60, 0x18, 0x6a, 0xa0, 0xcd, 0x11, 0xf0, 0x8e, 0x4d, 0x8a, 0xa8, 0x21, - 0x15, 0xc1, 0x4b, 0xe8, 0x84, 0x7f, 0x51, 0x1c, 0xbc, 0x18, 0xac, 0x94, 0x5d, 0x65, 0x08, 0x5e, - 0x25, 0xe1, 0xa8, 0x32, 0x54, 0xca, 0xe3, 0xe7, 0xfd, 0x6b, 0x11, 0xff, 0xc9, 0x61, 0xdd, 0x34, - 0xc4, 0xae, 0x4e, 0xe4, 0x87, 0xbf, 0x05, 0x0d, 0xce, 0xea, 0xf7, 0xca, 0x1d, 0x7e, 0xf6, 0x32, - 0xbc, 0xf5, 0xdb, 0x97, 0x96, 0x7e, 0xaf, 0x6e, 0xf0, 0x72, 0x11, 0x9b, 0x42, 0x64, 0x89, 0xeb, - 0xe8, 0x64, 0xd5, 0xb1, 0x5b, 0xb6, 0x47, 0x8c, 0xc8, 0xe3, 0xbb, 0x63, 0xe1, 0x6b, 0xdd, 0x36, - 0xa7, 0xa8, 0x77, 0x79, 0x85, 0x97, 0xc2, 0x06, 0xb7, 0xd0, 0xb1, 0x92, 0xeb, 0x76, 0x5a, 0x24, - 0xbc, 0xa1, 0x1a, 0xdd, 0xf4, 0x33, 0xde, 0xc3, 0xbd, 0x96, 0xef, 0xd7, 0xa1, 0x28, 0xbb, 0xa0, - 0xaa, 0x7b, 0xa6, 0x58, 0x23, 0x7c, 0x4b, 0x94, 0xf7, 0xab, 0xf9, 0xfe, 0x91, 0xd1, 0x63, 0xda, - 0xa9, 0x78, 0x63, 0x16, 0x4c, 0xaf, 0x49, 0xd4, 0x2f, 0x67, 0x10, 0x0a, 0x05, 0x8c, 0x1f, 0x97, - 0x43, 0x05, 0x65, 0xc2, 0x8b, 0x0e, 0x1e, 0xbd, 0x40, 0x8a, 0x0d, 0x84, 0xcf, 0xa2, 0x3c, 0x44, - 0xb8, 0xc8, 0x86, 0x07, 0xab, 0x77, 0x4c, 0xcb, 0xd0, 0x00, 0x4a, 0xb1, 0xc2, 0x53, 0x74, 0xc0, - 0xc2, 0xa5, 0x3e, 0xb3, 0x0a, 0xcb, 0xe8, 0x58, 0xad, 0xb3, 0xe8, 0xd7, 0x2d, 0xbc, 0xab, 0x83, - 0x40, 0x1b, 0x6e, 0x67, 0x31, 0x78, 0x8c, 0x2a, 0x85, 0x31, 0x91, 0x8b, 0xa8, 0x5f, 0xc8, 0x44, - 0x66, 0xc1, 0x7d, 0x5c, 0xf4, 0x1e, 0x8e, 0xfb, 0x69, 0xc4, 0xa7, 0x25, 0xf5, 0xf7, 0x73, 0x68, - 0xb0, 0x6a, 0x3b, 0x1e, 0x0f, 0x19, 0x72, 0xb0, 0x57, 0x21, 0x61, 0xaf, 0x94, 0xdf, 0xc6, 0x5e, - 0xe9, 0x2c, 0xca, 0x0b, 0x2e, 0xca, 0xec, 0x5e, 0xc4, 0x30, 0x1c, 0x0d, 0xa0, 0x6f, 0xf3, 0x93, - 0x8b, 0xf8, 0x25, 0x68, 0xdf, 0xae, 0x5d, 0x0d, 0xbe, 0x35, 0x8b, 0xd0, 0x07, 0x9e, 0x7c, 0xf2, - 0x10, 0x77, 0xa9, 0xfa, 0xa3, 0x19, 0x74, 0x8c, 0x5f, 0x2d, 0x0a, 0x61, 0xc2, 0xfa, 0xfc, 0x4b, - 0x61, 0x71, 0x26, 0x61, 0x20, 0xcd, 0xc7, 0xd1, 0x45, 0x6b, 0xf2, 0x9e, 0xe9, 0xc1, 0xed, 0x8a, - 0x10, 0x27, 0x8c, 0x70, 0x98, 0xb8, 0x68, 0xf9, 0x74, 0xf8, 0x71, 0xff, 0xd2, 0x34, 0x17, 0xae, - 0xd4, 0xb4, 0xc0, 0x64, 0xe2, 0xc5, 0xa9, 0xfa, 0xc5, 0x3c, 0xca, 0x4f, 0xde, 0x23, 0x8d, 0x03, - 0xde, 0x35, 0xc2, 0x51, 0x6c, 0x7e, 0x97, 0x47, 0xb1, 0x3b, 0xf1, 0x02, 0x79, 0x39, 0xec, 0xcf, - 0x82, 0x5c, 0x7d, 0xa4, 0xe7, 0xa3, 0xd5, 0xfb, 0x3d, 0x7d, 0xf0, 0x9c, 0x88, 0xfe, 0x69, 0x0e, - 0xe5, 0x6a, 0x13, 0xd5, 0x23, 0xbd, 0xd9, 0x57, 0xbd, 0xe9, 0x7e, 0xcb, 0xae, 0x06, 0x17, 0x67, - 0xfd, 0xa1, 0x5f, 0x6b, 0xe4, 0x8e, 0xec, 0x1b, 0x39, 0x34, 0x52, 0x9b, 0x5a, 0xa8, 0x0a, 0x67, - 0xd7, 0x37, 0x98, 0xef, 0x21, 0x78, 0xc1, 0xb1, 0x2e, 0x3d, 0x1b, 0xb3, 0xc0, 0x6e, 0x56, 0x2c, - 0xef, 0x99, 0x6b, 0xb7, 0xf4, 0x66, 0x87, 0xc0, 0x61, 0x11, 0xf3, 0x54, 0x76, 0xcd, 0x37, 0xc9, - 0xe7, 0x21, 0x54, 0x81, 0xcf, 0x00, 0xbf, 0x80, 0x72, 0x37, 0xb9, 0x0f, 0x49, 0x1a, 0x9f, 0xa7, - 0xae, 0x32, 0x3e, 0x74, 0x12, 0xcc, 0x75, 0x4c, 0x03, 0x38, 0xd0, 0x52, 0xb4, 0xf0, 0x75, 0x6e, - 0x32, 0x6c, 0xa9, 0xf0, 0xb2, 0x5f, 0xf8, 0x7a, 0xa5, 0x8c, 0x6b, 0x68, 0xb0, 0x4a, 0x9c, 0x96, - 0x09, 0x1d, 0xe5, 0xcf, 0xd9, 0xdd, 0x99, 0xd0, 0xbd, 0xd5, 0x60, 0x3b, 0x2c, 0x04, 0xcc, 0x44, - 0x2e, 0xf8, 0x75, 0x84, 0x98, 0x55, 0xb5, 0xc5, 0xd0, 0x93, 0xe7, 0x60, 0xa7, 0xc2, 0x8c, 0xe1, - 0x04, 0xab, 0x54, 0x60, 0x86, 0xef, 0xa0, 0xd1, 0x59, 0xdb, 0x30, 0x97, 0x4c, 0xe6, 0x2c, 0x0a, - 0x15, 0x14, 0x36, 0x77, 0xd1, 0xa2, 0xc6, 0x6f, 0x4b, 0x28, 0x97, 0x54, 0x4d, 0x8c, 0xb1, 0xfa, - 0x8f, 0x7a, 0x51, 0x9e, 0x76, 0xfb, 0xd1, 0xf8, 0xdd, 0xcd, 0xf8, 0x2d, 0xa1, 0xd1, 0xdb, 0xb6, - 0x73, 0xc7, 0xb4, 0x96, 0x03, 0x3f, 0x7e, 0xbe, 0x9b, 0x06, 0xdf, 0xa3, 0x55, 0x86, 0xab, 0x07, - 0x2e, 0xff, 0x5a, 0x8c, 0x7c, 0x93, 0x11, 0xfc, 0x1c, 0x42, 0xec, 0x75, 0x3e, 0xd0, 0xf4, 0x87, - 0xe1, 0x35, 0xd8, 0xdb, 0x7d, 0x78, 0x1a, 0x20, 0x86, 0xd7, 0x08, 0x89, 0xf1, 0x25, 0xdf, 0x7b, - 0x63, 0x00, 0x5e, 0x0a, 0xc0, 0xb1, 0x01, 0x78, 0x6f, 0x88, 0x46, 0x00, 0xf3, 0xe3, 0xa8, 0x22, - 0x24, 0xdc, 0x88, 0xa1, 0x88, 0x20, 0xa4, 0xc9, 0x81, 0x07, 0xb4, 0x4b, 0xb8, 0x10, 0xd3, 0x04, - 0x1e, 0xf8, 0x99, 0xc8, 0x95, 0x3d, 0x96, 0xb8, 0xa5, 0xde, 0xd8, 0x87, 0x2e, 0x5f, 0x43, 0x9b, - 0xb9, 0x7c, 0xa9, 0xbf, 0x93, 0x45, 0x03, 0xb5, 0xce, 0xa2, 0xbb, 0xe6, 0x7a, 0xa4, 0x75, 0xc0, - 0xd5, 0xd8, 0xdf, 0x10, 0xe6, 0x13, 0x37, 0x84, 0x0f, 0xf9, 0x42, 0x11, 0x4e, 0x4a, 0x03, 0x93, - 0xce, 0xf7, 0x80, 0x0b, 0x15, 0xb9, 0xb0, 0x7d, 0x45, 0x56, 0x7f, 0x39, 0x8b, 0x46, 0xd9, 0x45, - 0x61, 0xd9, 0x74, 0x1b, 0x7b, 0xf0, 0x78, 0x61, 0xff, 0x65, 0xba, 0xbb, 0xcb, 0xf5, 0x2d, 0x3c, - 0x09, 0x51, 0x3f, 0x9e, 0x45, 0x83, 0xa5, 0x8e, 0xb7, 0x52, 0xf2, 0x40, 0x33, 0x0f, 0xe5, 0xee, - 0xe6, 0xb7, 0x33, 0xe8, 0x18, 0x6d, 0xc8, 0x82, 0x7d, 0x87, 0x58, 0x7b, 0x70, 0xd0, 0x2a, 0x1e, - 0x98, 0x66, 0x77, 0x78, 0x60, 0xea, 0xcb, 0x32, 0xb7, 0x3d, 0x59, 0xc2, 0xf5, 0x80, 0x66, 0x37, - 0xc9, 0xc1, 0xfe, 0x8c, 0x3d, 0xbc, 0x1e, 0xf0, 0x05, 0xb2, 0x07, 0xd7, 0x51, 0xef, 0x2e, 0x81, - 0xec, 0xc1, 0x59, 0xda, 0xbb, 0x43, 0x20, 0x5f, 0xc9, 0xa0, 0x81, 0x71, 0xdb, 0x3b, 0xe0, 0x03, - 0x9f, 0x7f, 0xc5, 0xc1, 0x56, 0x73, 0xff, 0x2b, 0x0e, 0xb6, 0x6e, 0xaa, 0x3f, 0x94, 0x45, 0x27, - 0x78, 0x50, 0x72, 0x7e, 0x7a, 0x71, 0x34, 0x1d, 0xf3, 0xc1, 0x16, 0x17, 0xcd, 0xd1, 0x3c, 0xc4, - 0x45, 0xf3, 0xd3, 0x39, 0x74, 0x02, 0x42, 0xb7, 0xd2, 0x4d, 0xdd, 0xbb, 0xc0, 0x16, 0xc1, 0x0d, - 0xf9, 0xd2, 0x77, 0x36, 0xe1, 0xd2, 0xf7, 0x2f, 0xd7, 0x8b, 0xcf, 0x2c, 0x9b, 0xde, 0x4a, 0x67, - 0xf1, 0x72, 0xc3, 0x6e, 0x5d, 0x59, 0x76, 0xf4, 0xbb, 0x26, 0xbb, 0xee, 0xd4, 0x9b, 0x57, 0x82, - 0xfc, 0x1e, 0x7a, 0xdb, 0xe4, 0x99, 0x3f, 0x6a, 0xb0, 0x53, 0xa2, 0x5c, 0xfd, 0xeb, 0x62, 0x17, - 0xa1, 0x57, 0x6d, 0xd3, 0xe2, 0x3e, 0x94, 0xcc, 0xd0, 0xad, 0xd1, 0xdd, 0xe5, 0x1b, 0xb6, 0x69, - 0xd5, 0xa3, 0x8e, 0x94, 0xdb, 0xad, 0x2f, 0x64, 0xad, 0x09, 0xd5, 0xa8, 0xff, 0x32, 0x83, 0x4e, - 0xcb, 0x5a, 0xfc, 0x6e, 0xb0, 0x1d, 0x7f, 0x38, 0x8b, 0xee, 0xbb, 0x0e, 0xc2, 0x09, 0x1c, 0x57, - 0x8e, 0xe6, 0x2d, 0x3e, 0x38, 0x13, 0x64, 0x73, 0x64, 0x51, 0xa6, 0xcb, 0xe6, 0x68, 0x52, 0xe7, - 0xb2, 0xf9, 0x17, 0x19, 0x74, 0x7c, 0xbe, 0x52, 0x9e, 0x78, 0x97, 0x8c, 0xa8, 0xf8, 0xf7, 0x1c, - 0x70, 0x83, 0x33, 0xf6, 0x3d, 0x07, 0xdc, 0xf4, 0xa4, 0xdf, 0x53, 0x2b, 0xcd, 0xce, 0xbc, 0x9b, - 0xf4, 0x4d, 0xfa, 0x9e, 0x77, 0x81, 0xbe, 0x49, 0xdf, 0x73, 0xc0, 0xf5, 0xed, 0x9f, 0x14, 0xd0, - 0xe0, 0x8d, 0xce, 0x22, 0xe1, 0x2e, 0x30, 0x87, 0xfa, 0xbc, 0xf5, 0x2a, 0x1a, 0xe4, 0x62, 0x80, - 0x9b, 0x0e, 0x21, 0x44, 0x1f, 0x0f, 0xb9, 0xc2, 0xa2, 0x20, 0x89, 0x44, 0xf8, 0x2c, 0xca, 0xdf, - 0x22, 0xce, 0xa2, 0xf8, 0x7a, 0xf5, 0x2e, 0x71, 0x16, 0x35, 0x80, 0xe2, 0x99, 0xd0, 0x31, 0xbf, - 0x54, 0xad, 0x40, 0xba, 0x16, 0x7e, 0xc9, 0x02, 0xf9, 0x67, 0x02, 0xef, 0x3a, 0xbd, 0x6d, 0xb2, - 0x44, 0x2f, 0xe2, 0xcb, 0xf9, 0x68, 0x49, 0x3c, 0x87, 0xc6, 0x44, 0xf7, 0x2a, 0x96, 0xab, 0xa4, - 0x3f, 0x81, 0x5d, 0x52, 0x96, 0x92, 0x78, 0x51, 0xfc, 0x32, 0x1a, 0xf2, 0x81, 0xe0, 0x28, 0x36, - 0x10, 0x06, 0xc8, 0x0f, 0x58, 0x45, 0x12, 0x21, 0x49, 0x05, 0x44, 0x06, 0x70, 0x75, 0x80, 0x12, - 0x18, 0x44, 0x1c, 0xef, 0xa4, 0x02, 0xf8, 0x69, 0x60, 0x00, 0x8f, 0x49, 0xc0, 0xc1, 0x64, 0x10, - 0x9e, 0x76, 0x82, 0xe3, 0xbf, 0xc3, 0xe1, 0xec, 0x01, 0xaf, 0x44, 0x86, 0xe7, 0x11, 0x0a, 0x1d, - 0x01, 0x78, 0x98, 0x84, 0x6d, 0xbb, 0x28, 0x08, 0x2c, 0xc4, 0x2b, 0xbc, 0xe1, 0x9d, 0x5c, 0xe1, - 0xa9, 0xbf, 0x9f, 0x45, 0x83, 0xa5, 0x76, 0x3b, 0x18, 0x0a, 0x8f, 0xa3, 0x42, 0xa9, 0xdd, 0xbe, - 0xa9, 0x55, 0xc4, 0x80, 0xe9, 0x7a, 0xbb, 0x5d, 0xef, 0x38, 0xa6, 0xe8, 0x79, 0xca, 0x88, 0xf0, - 0x04, 0x1a, 0x2e, 0xb5, 0xdb, 0xd5, 0xce, 0x62, 0xd3, 0x6c, 0x08, 0xf9, 0x97, 0x58, 0xaa, 0xb8, - 0x76, 0xbb, 0xde, 0x06, 0x4c, 0x34, 0x09, 0x97, 0x5c, 0x06, 0x7f, 0x14, 0x82, 0x0b, 0xf1, 0xf4, - 0x3f, 0x2c, 0xc1, 0x88, 0x1a, 0x84, 0x4a, 0x0f, 0xdb, 0x76, 0x39, 0x20, 0x62, 0x21, 0xe5, 0xcf, - 0xfa, 0x81, 0xf9, 0x69, 0x45, 0xb1, 0x34, 0x3f, 0x21, 0x4b, 0xfc, 0x04, 0xea, 0x2b, 0xb5, 0xdb, - 0xc2, 0x1d, 0x11, 0x38, 0x02, 0xd1, 0x52, 0x91, 0x3e, 0xf6, 0xc9, 0xce, 0xbc, 0x88, 0x46, 0xe4, - 0xca, 0xb6, 0x15, 0x92, 0xfe, 0x9b, 0x19, 0xf8, 0xa0, 0x03, 0xee, 0x39, 0xfd, 0x14, 0xca, 0x95, - 0xda, 0x6d, 0x3e, 0x1f, 0x1d, 0x4f, 0xe8, 0x8f, 0xe8, 0x43, 0xeb, 0x52, 0xbb, 0xed, 0x7f, 0xfa, - 0x01, 0x7f, 0x82, 0xb1, 0xa3, 0x4f, 0xff, 0x0a, 0xfb, 0xf4, 0x83, 0xfd, 0x3c, 0x42, 0xfd, 0x62, - 0x0e, 0x1d, 0x2b, 0xb5, 0xdb, 0x47, 0xa1, 0xec, 0xf7, 0xea, 0x39, 0xf7, 0x93, 0x08, 0x09, 0xd3, - 0x63, 0x5f, 0xf0, 0x40, 0x6c, 0x50, 0x98, 0x1a, 0x95, 0x8c, 0x26, 0x10, 0xf9, 0xea, 0xd7, 0xbf, - 0x2d, 0xf5, 0xfb, 0x78, 0x0e, 0xa6, 0xe2, 0x83, 0x1e, 0x9a, 0xea, 0x9d, 0xd2, 0x6d, 0xbc, 0x0f, - 0x0a, 0xdb, 0xea, 0x83, 0xdf, 0x92, 0x06, 0x0f, 0x84, 0x46, 0x3f, 0xea, 0x85, 0xde, 0x5d, 0x99, - 0xc5, 0x23, 0xa2, 0x30, 0x79, 0xbc, 0x1c, 0x3f, 0x5d, 0x13, 0x8f, 0xde, 0xd4, 0xa0, 0xa8, 0xba, - 0x69, 0x68, 0x11, 0x5a, 0xbf, 0x0f, 0xfb, 0xb6, 0xd5, 0x87, 0xeb, 0x59, 0x78, 0xa1, 0x1d, 0x44, - 0x7f, 0xda, 0xfd, 0xee, 0xe2, 0x0a, 0x42, 0xec, 0xbe, 0x3f, 0x70, 0x45, 0x1e, 0x66, 0x81, 0x5e, - 0x58, 0x16, 0x27, 0x1e, 0xe8, 0x25, 0x24, 0x09, 0xbc, 0x9a, 0x72, 0x89, 0x5e, 0x4d, 0x97, 0x50, - 0xbf, 0xa6, 0xaf, 0xbe, 0xd6, 0x21, 0xce, 0x1a, 0x37, 0x67, 0x58, 0x70, 0x45, 0x7d, 0xb5, 0xfe, - 0x31, 0x0a, 0xd4, 0x02, 0x34, 0x56, 0x83, 0x27, 0xfe, 0x82, 0x1f, 0x06, 0x3b, 0x99, 0x0e, 0x1e, - 0xf6, 0xef, 0x44, 0xd1, 0xf1, 0xf3, 0x28, 0x57, 0xba, 0x5d, 0xe3, 0x92, 0x0d, 0xba, 0xb6, 0x74, - 0xbb, 0xc6, 0xe5, 0x95, 0x5a, 0xf6, 0x76, 0x4d, 0xfd, 0x78, 0x16, 0xe1, 0x38, 0x25, 0x7e, 0x06, - 0x0d, 0x00, 0x74, 0x99, 0xea, 0x8c, 0x98, 0xfe, 0x73, 0xd5, 0xad, 0x3b, 0x00, 0x95, 0x8c, 0x3b, - 0x9f, 0x14, 0x3f, 0x07, 0x99, 0x8e, 0x79, 0x02, 0x3a, 0x29, 0xfd, 0xe7, 0xaa, 0xeb, 0xe7, 0x06, - 0x8e, 0x24, 0x3a, 0xe6, 0xc4, 0x60, 0x17, 0xde, 0xae, 0x4d, 0xdb, 0xae, 0xc7, 0x45, 0xcd, 0xec, - 0xc2, 0x55, 0x17, 0xf2, 0xce, 0x4a, 0x76, 0x21, 0x23, 0x83, 0xdc, 0x59, 0xb7, 0x6b, 0xec, 0x31, - 0x8c, 0xa1, 0xd9, 0x4d, 0xdf, 0xa0, 0x64, 0xb9, 0xb3, 0x56, 0xdd, 0x3a, 0x7b, 0x48, 0x63, 0x40, - 0x8a, 0x65, 0x29, 0x77, 0x96, 0x54, 0x4a, 0xfd, 0x74, 0x3f, 0x1a, 0x2d, 0xeb, 0x9e, 0xbe, 0xa8, - 0xbb, 0x44, 0xd8, 0x4d, 0x1f, 0xf3, 0x61, 0xfe, 0xe7, 0x08, 0x72, 0x30, 0x16, 0x13, 0xbe, 0x26, - 0x5a, 0x00, 0xbf, 0x10, 0xf2, 0x0d, 0x32, 0x9b, 0x8a, 0xa9, 0xd2, 0x16, 0xeb, 0x6d, 0x0e, 0xd6, - 0x62, 0x84, 0xf8, 0x31, 0x34, 0xe8, 0xc3, 0xe8, 0x06, 0x20, 0x17, 0xea, 0x8c, 0xb1, 0x48, 0xed, - 0x7f, 0x4d, 0x44, 0xe3, 0xe7, 0xd0, 0x90, 0xff, 0x53, 0x30, 0xad, 0x59, 0xde, 0xb7, 0xc5, 0xd8, - 0xee, 0x49, 0x24, 0x15, 0x8b, 0xc2, 0xfc, 0xd6, 0x2b, 0x15, 0x8d, 0xa4, 0x56, 0x93, 0x48, 0xf1, - 0xc7, 0xd0, 0x88, 0xff, 0x9b, 0x6f, 0x18, 0x58, 0x16, 0xba, 0xc7, 0x82, 0x0c, 0xce, 0x11, 0xb1, - 0x5e, 0x96, 0xc9, 0xd9, 0xd6, 0xe1, 0x7e, 0x3f, 0x5b, 0x98, 0xb1, 0x18, 0xdf, 0x39, 0x44, 0x2a, - 0xc0, 0x15, 0x34, 0xe6, 0x43, 0x42, 0x0d, 0xed, 0x0b, 0x77, 0x8c, 0xc6, 0x62, 0x3d, 0x51, 0x49, - 0xe3, 0xa5, 0x70, 0x13, 0x9d, 0x95, 0x80, 0x86, 0xbb, 0x62, 0x2e, 0x79, 0x7c, 0xbb, 0xc7, 0x23, - 0x1d, 0xf3, 0xf4, 0x90, 0x01, 0x57, 0x46, 0xe3, 0xe7, 0x79, 0x95, 0x73, 0x50, 0x75, 0xe5, 0x86, - 0x6b, 0xe8, 0x84, 0x8f, 0xbf, 0x3e, 0x51, 0xad, 0x3a, 0xf6, 0x1b, 0xa4, 0xe1, 0x55, 0xca, 0x7c, - 0xbb, 0x0c, 0x11, 0xf0, 0x8c, 0xc5, 0xfa, 0x72, 0xa3, 0x4d, 0x95, 0x82, 0xe2, 0x64, 0xe6, 0x89, - 0x85, 0xf1, 0x2d, 0x74, 0x9f, 0x00, 0xaf, 0x58, 0xae, 0xa7, 0x5b, 0x0d, 0x52, 0x29, 0xf3, 0x3d, - 0x34, 0xec, 0xe7, 0x39, 0x57, 0x93, 0x23, 0x65, 0xb6, 0xc9, 0xc5, 0xf1, 0x8b, 0x68, 0xd8, 0x47, - 0xb0, 0xbb, 0xbb, 0x41, 0xb8, 0xbb, 0x83, 0x21, 0x69, 0x2c, 0xd6, 0xa3, 0x6f, 0x36, 0x65, 0x62, - 0x51, 0xa3, 0x20, 0x81, 0xfe, 0x90, 0xa4, 0x51, 0xde, 0x5a, 0x3b, 0x51, 0x19, 0x21, 0xa9, 0xfe, - 0xcb, 0xa1, 0x46, 0xcd, 0x3b, 0xe6, 0xb2, 0xc9, 0x76, 0xd2, 0xfe, 0x33, 0xcd, 0xc5, 0xba, 0x0d, - 0xc0, 0x24, 0xfd, 0x60, 0xe4, 0x67, 0x4a, 0xe8, 0x78, 0x82, 0x8e, 0x6d, 0x6b, 0xc7, 0xf8, 0xa9, - 0x6c, 0xd8, 0x88, 0x03, 0xbe, 0x6d, 0x1c, 0x47, 0xfd, 0xfe, 0x97, 0x70, 0xe3, 0x41, 0x49, 0x1b, - 0x9a, 0x51, 0x1e, 0x3e, 0x5e, 0x12, 0xc7, 0x01, 0xdf, 0x4a, 0xee, 0x85, 0x38, 0xde, 0xca, 0x84, - 0xe2, 0x38, 0xe0, 0xdb, 0xcb, 0xef, 0xc9, 0x87, 0x73, 0xd2, 0xd1, 0x1e, 0x73, 0xaf, 0xcc, 0xe4, - 0xd0, 0xfb, 0xb4, 0xb0, 0x8d, 0xe7, 0x92, 0xa2, 0x6a, 0xf6, 0xed, 0x4c, 0x35, 0xf1, 0x8b, 0x68, - 0xb0, 0x6a, 0xbb, 0xde, 0xb2, 0x43, 0xdc, 0x6a, 0x10, 0xa9, 0x1f, 0x9e, 0xda, 0xb6, 0x39, 0xb8, - 0xde, 0x96, 0x66, 0x7f, 0x91, 0x5c, 0xfd, 0xc3, 0x5c, 0x4c, 0x1b, 0x98, 0xe1, 0x7a, 0x20, 0xb5, - 0x61, 0x0f, 0x86, 0x3a, 0xbe, 0x1a, 0xae, 0x82, 0xcc, 0xc2, 0xef, 0x15, 0xc2, 0x10, 0x2e, 0x72, - 0x03, 0x5f, 0x26, 0xc1, 0x1f, 0x42, 0xa7, 0x24, 0x40, 0x55, 0x77, 0xf4, 0x16, 0xf1, 0xc2, 0xac, - 0x88, 0x10, 0x58, 0xca, 0x2f, 0x5d, 0x6f, 0x07, 0x68, 0x31, 0xd3, 0x62, 0x0a, 0x07, 0x41, 0xb5, - 0xfa, 0xb6, 0xe1, 0xd8, 0xfc, 0x47, 0x79, 0xa4, 0x04, 0xe6, 0x65, 0xf0, 0x00, 0x68, 0x1f, 0xa7, - 0xf2, 0x77, 0x44, 0xe7, 0x9a, 0x68, 0x2c, 0x14, 0x46, 0xad, 0xd3, 0x6a, 0xe9, 0xd0, 0xc1, 0xd4, - 0x7c, 0x2d, 0x46, 0x99, 0x85, 0x84, 0xcc, 0x62, 0x3d, 0xc3, 0x2d, 0x56, 0x1c, 0x3e, 0xb0, 0xaa, - 0xbb, 0x8c, 0x85, 0x16, 0xe7, 0x8a, 0x3f, 0x93, 0x41, 0x27, 0x4a, 0x4b, 0x4b, 0xa4, 0xe1, 0x11, - 0x63, 0x7e, 0x91, 0x9a, 0x6e, 0x13, 0x76, 0xc7, 0xf2, 0x7c, 0x6b, 0xf9, 0xf9, 0xf4, 0xea, 0x58, - 0x27, 0x5d, 0x4e, 0x2a, 0xcc, 0x5a, 0x12, 0x84, 0x58, 0xd0, 0x39, 0x49, 0xdd, 0x06, 0x9a, 0x7a, - 0x03, 0x88, 0xb4, 0xc4, 0x7a, 0xcf, 0x5c, 0x47, 0xa7, 0x53, 0x59, 0x6e, 0x66, 0x2a, 0xf5, 0x8a, - 0xa6, 0xd2, 0xbf, 0xce, 0x84, 0xea, 0x1e, 0x11, 0x12, 0xbe, 0x8c, 0x50, 0x08, 0xe2, 0x9b, 0xa7, - 0x91, 0x8d, 0xf5, 0x22, 0x0a, 0x85, 0xa6, 0x09, 0x14, 0x78, 0x1e, 0x15, 0xb8, 0x58, 0x58, 0x9e, - 0xdb, 0xf7, 0x6e, 0xd2, 0x0b, 0x97, 0x45, 0x39, 0xc0, 0xc6, 0x88, 0x7f, 0x33, 0x67, 0x73, 0xe6, - 0x39, 0x34, 0xb8, 0xd3, 0xef, 0xfa, 0x4c, 0x0e, 0x61, 0x71, 0xa7, 0xb3, 0x8f, 0x66, 0xe0, 0x3b, - 0x62, 0xb0, 0xec, 0x2c, 0x4f, 0xcd, 0x45, 0xd4, 0x4f, 0x3f, 0x01, 0x32, 0x3f, 0x08, 0x91, 0x5e, - 0x3b, 0x1c, 0xa6, 0x05, 0xd8, 0x30, 0xcc, 0x52, 0x5f, 0x72, 0x98, 0x25, 0xf5, 0xfb, 0x73, 0xe8, - 0xa4, 0xd8, 0x21, 0x65, 0x02, 0xc1, 0xe3, 0x8f, 0x3a, 0xe5, 0x6d, 0xec, 0x14, 0x15, 0x15, 0x98, - 0x81, 0xcb, 0xa3, 0xf8, 0xb3, 0xc3, 0x07, 0x80, 0x68, 0x1c, 0xa3, 0xfe, 0x87, 0x2c, 0x1a, 0x0e, - 0x8c, 0x08, 0xdd, 0x71, 0x0f, 0x71, 0x77, 0xbc, 0x0f, 0x0d, 0x43, 0xa0, 0x9c, 0x16, 0xb1, 0x58, - 0x30, 0x99, 0x5e, 0x21, 0xed, 0x86, 0x8f, 0xe0, 0x19, 0x96, 0x24, 0x42, 0xaa, 0xfd, 0xcc, 0xbe, - 0x10, 0xc2, 0x17, 0x31, 0xe3, 0x82, 0xc1, 0xd5, 0x9f, 0xc8, 0xa1, 0x21, 0x5f, 0xca, 0xe3, 0xe6, - 0x41, 0xbd, 0x4d, 0xd8, 0x5f, 0x21, 0x5f, 0x41, 0xa8, 0x6a, 0x3b, 0x9e, 0xde, 0x9c, 0x0b, 0x35, - 0x1f, 0x8e, 0xe1, 0xda, 0x00, 0x65, 0x65, 0x04, 0x12, 0x58, 0xbf, 0x42, 0xe3, 0x8d, 0x4d, 0x4c, - 0x6c, 0xfd, 0x0a, 0xa0, 0x9a, 0x40, 0xa1, 0xfe, 0x46, 0x16, 0x1d, 0xf3, 0x3b, 0x69, 0xf2, 0x1e, - 0x69, 0x74, 0x0e, 0xf3, 0xdc, 0x24, 0x4b, 0xbb, 0x77, 0x53, 0x69, 0xab, 0xff, 0x4d, 0x98, 0x48, - 0x26, 0x9a, 0xf6, 0xd1, 0x44, 0xf2, 0xd7, 0xa1, 0xe3, 0xea, 0xb7, 0xe7, 0xd0, 0x09, 0x5f, 0xea, - 0x53, 0x1d, 0x0b, 0x36, 0xb0, 0x13, 0x7a, 0xb3, 0x79, 0x98, 0xf7, 0x7c, 0x83, 0xbe, 0x20, 0xe6, - 0x79, 0xe4, 0x39, 0x9e, 0xed, 0x6e, 0x89, 0x83, 0xeb, 0xb6, 0x69, 0x68, 0x22, 0x11, 0x7e, 0x19, - 0x0d, 0xf9, 0x3f, 0x4b, 0xce, 0xb2, 0xbf, 0xd1, 0x83, 0xe3, 0xe8, 0xa0, 0x90, 0xee, 0x48, 0xcf, - 0xd5, 0xa5, 0x02, 0xea, 0x7f, 0x2a, 0xa0, 0x33, 0xb7, 0x4d, 0xcb, 0xb0, 0x57, 0x5d, 0x3f, 0x59, - 0xe2, 0x81, 0x3f, 0x8e, 0xd9, 0xef, 0x24, 0x89, 0xaf, 0xa1, 0xfb, 0xa2, 0x22, 0x75, 0x82, 0x10, - 0xd6, 0xbc, 0x77, 0x56, 0x19, 0x41, 0xdd, 0x4f, 0x9b, 0xc8, 0xef, 0x74, 0xb4, 0xe4, 0x92, 0xd1, - 0xbc, 0x8b, 0x7d, 0x5b, 0xc9, 0xbb, 0xf8, 0x28, 0x2a, 0x94, 0xed, 0x96, 0x6e, 0xfa, 0x81, 0x4b, - 0x60, 0x14, 0x07, 0xf5, 0x02, 0x46, 0xe3, 0x14, 0x94, 0x3f, 0xaf, 0x18, 0xba, 0x6c, 0x20, 0xe4, - 0xef, 0x17, 0xa0, 0x56, 0x9a, 0x26, 0x12, 0x61, 0x1b, 0x0d, 0xf3, 0xea, 0xf8, 0x0d, 0x0c, 0x82, - 0xcd, 0xd3, 0xd3, 0xbe, 0x8c, 0xd2, 0xd5, 0xea, 0xb2, 0x54, 0x8e, 0x6d, 0xa3, 0x58, 0x3a, 0x48, - 0xfe, 0x31, 0xec, 0x2e, 0x46, 0x93, 0xf9, 0x0b, 0x42, 0x80, 0x49, 0x66, 0x30, 0x2e, 0x04, 0x98, - 0x65, 0x44, 0x22, 0x3c, 0x89, 0xc6, 0x20, 0xd0, 0x70, 0xb0, 0x95, 0xa2, 0x2a, 0x31, 0x04, 0x46, - 0x25, 0x1c, 0xec, 0xb3, 0xd8, 0xc4, 0xf4, 0xe3, 0xea, 0x0d, 0x8e, 0xd6, 0xe2, 0x25, 0xce, 0xbc, - 0x82, 0x70, 0xbc, 0xcd, 0xdb, 0x3a, 0xda, 0xff, 0x74, 0x36, 0xdc, 0xd7, 0x1d, 0x74, 0xe7, 0x8c, - 0xbd, 0x38, 0xcc, 0xfe, 0x85, 0x0c, 0x1a, 0x8b, 0x05, 0xae, 0xc6, 0x4f, 0x21, 0xc4, 0x20, 0x42, - 0x80, 0x40, 0x88, 0x5f, 0x11, 0x06, 0xb3, 0xe6, 0x4b, 0x49, 0x48, 0x86, 0xaf, 0xa0, 0x7e, 0xf6, - 0x8b, 0x87, 0xc8, 0x89, 0x17, 0xe9, 0x74, 0x4c, 0x43, 0x0b, 0x88, 0xc2, 0x5a, 0xe0, 0x8e, 0x28, - 0x97, 0x58, 0xc4, 0x5b, 0x6b, 0x07, 0xb5, 0x50, 0x32, 0xda, 0x81, 0x43, 0x41, 0x83, 0x4b, 0xc6, - 0x7e, 0x75, 0x5d, 0x81, 0xc7, 0x00, 0xcf, 0x6d, 0x16, 0x03, 0x3c, 0x32, 0x37, 0xf1, 0xa0, 0xdf, - 0x7b, 0xf7, 0xb0, 0xe4, 0xb3, 0x59, 0x74, 0x2c, 0xa8, 0x75, 0x1f, 0xaf, 0x23, 0xde, 0x41, 0x22, - 0xf9, 0x4c, 0x06, 0x29, 0xe3, 0x66, 0xb3, 0x69, 0x5a, 0xcb, 0x15, 0x6b, 0xc9, 0x76, 0x5a, 0x30, - 0x79, 0xec, 0xdf, 0x71, 0xa7, 0xfa, 0x5d, 0x19, 0x34, 0xc6, 0x1b, 0x34, 0xa1, 0x3b, 0xc6, 0xfe, - 0x9d, 0x25, 0x45, 0x5b, 0xb2, 0x7f, 0xfa, 0xa2, 0x7e, 0x29, 0x8b, 0xd0, 0x8c, 0xdd, 0xb8, 0x73, - 0xc0, 0x5f, 0x16, 0xbe, 0x80, 0x0a, 0x2c, 0x4e, 0x11, 0xd7, 0xd8, 0xb1, 0xcb, 0xec, 0xc1, 0x28, - 0xfd, 0x34, 0x86, 0x18, 0x1f, 0xe5, 0x27, 0xb4, 0x05, 0x16, 0xe7, 0x48, 0xc9, 0x68, 0xbc, 0x08, - 0xad, 0x94, 0xd2, 0x71, 0xab, 0x26, 0xa8, 0x94, 0xc2, 0xe4, 0x4a, 0x37, 0xd6, 0x8b, 0xf9, 0xa6, - 0xdd, 0xb8, 0xa3, 0x01, 0xbd, 0xfa, 0x57, 0x19, 0x26, 0xbb, 0x03, 0xfe, 0xba, 0xce, 0xff, 0xfc, - 0xfc, 0x36, 0x3f, 0xff, 0xbb, 0x33, 0xe8, 0x84, 0x46, 0x1a, 0xf6, 0x5d, 0xe2, 0xac, 0x4d, 0xd8, - 0x06, 0xb9, 0x4e, 0x2c, 0xe2, 0xec, 0xd7, 0x88, 0xfa, 0x87, 0x90, 0x34, 0x21, 0x6c, 0xcc, 0x4d, - 0x97, 0x18, 0x07, 0x27, 0xa1, 0x85, 0xfa, 0x2b, 0x7d, 0x48, 0x49, 0xb4, 0x10, 0x0f, 0xac, 0x55, - 0x94, 0x6a, 0xf6, 0xe7, 0xf7, 0xca, 0xec, 0xef, 0xdd, 0x9e, 0xd9, 0x5f, 0xd8, 0xae, 0xd9, 0xdf, - 0xb7, 0x15, 0xb3, 0xbf, 0x15, 0x35, 0xfb, 0xfb, 0xc1, 0xec, 0x7f, 0xaa, 0xab, 0xd9, 0x3f, 0x69, - 0x19, 0x3b, 0x34, 0xfa, 0x0f, 0x6c, 0xb2, 0xd5, 0x9d, 0xec, 0x56, 0x2e, 0xd2, 0x49, 0xb1, 0x61, - 0x3b, 0x06, 0x31, 0xf8, 0x26, 0x05, 0x4e, 0xc8, 0x1d, 0x0e, 0xd3, 0x02, 0x6c, 0x2c, 0x73, 0xed, - 0xf0, 0x56, 0x32, 0xd7, 0xee, 0xc1, 0x36, 0xe6, 0x53, 0x59, 0x34, 0x36, 0x41, 0x1c, 0x8f, 0x05, - 0x42, 0xdc, 0x0b, 0x27, 0xa5, 0x12, 0x3a, 0x26, 0x30, 0x04, 0x8b, 0x3c, 0x1b, 0x3a, 0x5e, 0x35, - 0x88, 0xe3, 0x45, 0xfd, 0xb6, 0xa2, 0xf4, 0xb4, 0x7a, 0x3f, 0x7b, 0x14, 0x1f, 0xbb, 0x41, 0xf5, - 0x3e, 0x9c, 0x09, 0xd2, 0xe4, 0xbf, 0xb4, 0x80, 0x5e, 0x48, 0x08, 0x95, 0xdf, 0x7e, 0x42, 0x28, - 0xf5, 0xe7, 0x32, 0xe8, 0x82, 0x46, 0x2c, 0xb2, 0xaa, 0x2f, 0x36, 0x89, 0xd0, 0x2c, 0xbe, 0x32, - 0xd0, 0x59, 0xc3, 0x74, 0x5b, 0xba, 0xd7, 0x58, 0xd9, 0x95, 0x8c, 0xa6, 0xd0, 0x90, 0x38, 0x7f, - 0x6d, 0x63, 0x6e, 0x93, 0xca, 0xa9, 0xbf, 0x9e, 0x43, 0x7d, 0xe3, 0xb6, 0xf7, 0xaa, 0xbd, 0xcb, - 0x0c, 0x65, 0xe1, 0x94, 0x9f, 0xdd, 0xc6, 0xb9, 0xc8, 0x13, 0x50, 0xb9, 0x10, 0xb4, 0x1d, 0x9c, - 0xfa, 0x16, 0xed, 0x58, 0x70, 0x7b, 0x9f, 0x6c, 0x9b, 0xb9, 0xc9, 0x9e, 0x41, 0x03, 0x10, 0x05, - 0x43, 0x38, 0xb9, 0x04, 0x97, 0x59, 0x8f, 0x02, 0xa3, 0x75, 0x84, 0xa4, 0xf8, 0x43, 0x52, 0xe4, - 0xc6, 0xc2, 0xee, 0x73, 0x99, 0x89, 0x41, 0x1c, 0xf7, 0x2c, 0x65, 0x98, 0xfa, 0x8d, 0x3c, 0x1a, - 0xf2, 0x1d, 0x25, 0xf7, 0xa9, 0x07, 0x1f, 0x47, 0x85, 0x69, 0x5b, 0x08, 0x40, 0x0f, 0x8e, 0x95, - 0x2b, 0xb6, 0x1b, 0xf1, 0x18, 0xe5, 0x44, 0xf8, 0x29, 0xd4, 0x3f, 0x67, 0x1b, 0xa2, 0x5b, 0x30, - 0x8c, 0x69, 0xcb, 0x36, 0x62, 0xcf, 0x2a, 0x03, 0x42, 0x7c, 0x01, 0xe5, 0xc1, 0xa3, 0x5a, 0x38, - 0x7a, 0x8e, 0x78, 0x51, 0x03, 0x5e, 0xd0, 0x8d, 0xc2, 0x76, 0x75, 0xa3, 0x6f, 0xa7, 0xba, 0xd1, - 0xbf, 0xb7, 0xba, 0xf1, 0x3a, 0x1a, 0x82, 0x9a, 0xfc, 0xfc, 0x55, 0x9b, 0x2f, 0x6f, 0xa7, 0xf9, - 0x0a, 0x34, 0xcc, 0xda, 0xcd, 0xb3, 0x58, 0xc1, 0xc2, 0x23, 0xb1, 0x8a, 0xa8, 0x1d, 0xda, 0x85, - 0xda, 0xfd, 0x61, 0x06, 0xf5, 0xdd, 0xb4, 0xee, 0x58, 0xf6, 0xea, 0xee, 0x34, 0xee, 0x29, 0x34, - 0xc8, 0xd9, 0x08, 0x73, 0x3c, 0xbc, 0x94, 0xed, 0x30, 0x70, 0x1d, 0x38, 0x69, 0x22, 0x15, 0x7e, - 0x31, 0x28, 0x04, 0x8f, 0x26, 0x72, 0x61, 0x0a, 0x07, 0xbf, 0x50, 0x43, 0x8e, 0xe1, 0x2e, 0x92, - 0xe3, 0xb3, 0x28, 0x5f, 0xa6, 0x4d, 0x15, 0x22, 0x82, 0xd2, 0xa6, 0x68, 0x00, 0x55, 0xff, 0x79, - 0x16, 0x8d, 0x44, 0x8e, 0x9f, 0x1e, 0x45, 0x03, 0xfc, 0xf8, 0xc7, 0xf4, 0x83, 0xca, 0xc3, 0xa3, - 0x8a, 0x00, 0xa8, 0xf5, 0xb3, 0x3f, 0x2b, 0x06, 0x7e, 0x3f, 0xea, 0xb3, 0x5d, 0x58, 0x9a, 0xe0, - 0x5b, 0x46, 0xc2, 0x21, 0x34, 0x5f, 0xa3, 0x6d, 0x67, 0x83, 0x83, 0x93, 0x88, 0x1a, 0x69, 0xbb, - 0xf0, 0x69, 0xd7, 0xd0, 0x80, 0xee, 0xba, 0xc4, 0xab, 0x7b, 0xfa, 0xb2, 0x18, 0x67, 0x3e, 0x00, - 0x8a, 0xa3, 0x03, 0x80, 0x0b, 0xfa, 0x32, 0x7e, 0x05, 0x0d, 0x37, 0x1c, 0x02, 0x8b, 0x97, 0xde, - 0xa4, 0xad, 0x14, 0x8c, 0x4b, 0x09, 0x21, 0x9e, 0xf8, 0x87, 0x88, 0x8a, 0x81, 0x6f, 0xa1, 0x61, - 0xfe, 0x39, 0xcc, 0xa3, 0x19, 0x06, 0xda, 0x48, 0xb8, 0x98, 0x30, 0x91, 0x30, 0x9f, 0x66, 0xee, - 0xd8, 0x2e, 0x92, 0x8b, 0x7c, 0x0d, 0x81, 0x54, 0xfd, 0x6a, 0x86, 0x1a, 0x3c, 0x14, 0x00, 0x19, - 0x65, 0xa9, 0xae, 0xb4, 0xb6, 0xa9, 0x2b, 0xad, 0x30, 0xf7, 0x5b, 0xc1, 0xed, 0x32, 0x3b, 0x69, - 0x1c, 0x8b, 0x2f, 0xa3, 0x82, 0x21, 0x9e, 0xfd, 0x9c, 0x94, 0x3f, 0xc2, 0xaf, 0x47, 0xe3, 0x54, - 0xf8, 0x22, 0xca, 0x53, 0x83, 0x36, 0xba, 0xf1, 0x13, 0xd7, 0x48, 0x0d, 0x28, 0xd4, 0x6f, 0xcd, - 0xa2, 0x21, 0xe1, 0x6b, 0xae, 0xee, 0xea, 0x73, 0x9e, 0xdf, 0x5a, 0x33, 0x7d, 0x37, 0x07, 0xd8, - 0x11, 0xf8, 0x4d, 0xbe, 0x16, 0x88, 0x62, 0x4b, 0x57, 0x10, 0x5c, 0x30, 0xcf, 0xf0, 0x0f, 0x2d, - 0x6c, 0x7d, 0x13, 0x44, 0xe9, 0x5f, 0xcd, 0xf7, 0x67, 0x47, 0x73, 0xaf, 0xe6, 0xfb, 0xf3, 0xa3, - 0xbd, 0x10, 0x55, 0x07, 0x02, 0xd9, 0xb2, 0x1d, 0xa6, 0xb5, 0x64, 0x2e, 0x1f, 0x70, 0x9f, 0xf4, - 0xbd, 0x8d, 0x38, 0x14, 0x91, 0xcd, 0x01, 0x77, 0x50, 0x7f, 0x5b, 0x65, 0x73, 0x94, 0x2b, 0x8e, - 0xcb, 0xe6, 0x8f, 0x32, 0x48, 0x49, 0x94, 0x4d, 0x69, 0x9f, 0x6e, 0xbe, 0xf7, 0x2e, 0x63, 0xdc, - 0xd7, 0xb3, 0x68, 0xac, 0x62, 0x79, 0x64, 0x99, 0xed, 0x7b, 0x0e, 0xf8, 0x54, 0x71, 0x03, 0x0d, - 0x0a, 0x1f, 0xc3, 0xfb, 0xfc, 0xfe, 0x60, 0x57, 0x19, 0xa2, 0x52, 0x38, 0x89, 0xa5, 0xf7, 0x30, - 0xc9, 0x74, 0x44, 0xc8, 0x07, 0x7c, 0xce, 0x39, 0x18, 0x42, 0x3e, 0xe0, 0x93, 0xd7, 0x3b, 0x54, - 0xc8, 0xff, 0x25, 0x83, 0x8e, 0x27, 0x54, 0x8e, 0x2f, 0xa0, 0xbe, 0x5a, 0x67, 0x11, 0xc2, 0xf9, - 0x64, 0x42, 0x1f, 0x51, 0xb7, 0xb3, 0x08, 0x91, 0x7c, 0x34, 0x1f, 0x89, 0x17, 0xe0, 0xd1, 0xee, - 0x7c, 0xa5, 0x3c, 0xc1, 0xa5, 0xaa, 0x0a, 0xcf, 0x8f, 0x29, 0x38, 0xe9, 0xcb, 0x82, 0x87, 0xbd, - 0xb6, 0x69, 0x34, 0x22, 0x0f, 0x7b, 0x69, 0x19, 0xfc, 0x61, 0x34, 0x50, 0x7a, 0xb3, 0xe3, 0x10, - 0xe0, 0xcb, 0x24, 0xfe, 0x70, 0xc0, 0xd7, 0x47, 0x24, 0x71, 0x66, 0x6f, 0x94, 0x29, 0x45, 0x94, - 0x77, 0xc8, 0x50, 0xfd, 0x74, 0x06, 0x9d, 0x49, 0x6f, 0x1d, 0x7e, 0x02, 0xf5, 0xd1, 0x9d, 0x6d, - 0x49, 0x9b, 0xe3, 0x9f, 0xce, 0xb2, 0x2b, 0xda, 0x4d, 0x52, 0xd7, 0x1d, 0xd1, 0xf0, 0xf6, 0xc9, - 0xf0, 0x4b, 0x68, 0xb0, 0xe2, 0xba, 0x1d, 0xe2, 0xd4, 0x9e, 0xba, 0xa9, 0x55, 0xf8, 0x9e, 0x0a, - 0x6c, 0x76, 0x13, 0xc0, 0x75, 0xf7, 0xa9, 0x48, 0xc0, 0x1e, 0x91, 0x5e, 0xfd, 0x44, 0x06, 0x9d, - 0xed, 0xf6, 0x55, 0x74, 0x03, 0xbf, 0x40, 0x2c, 0xdd, 0xa2, 0x3b, 0xfe, 0x4c, 0xb8, 0x45, 0xf1, - 0x00, 0x26, 0x6f, 0x32, 0x02, 0x42, 0x5a, 0x88, 0x9d, 0x8e, 0x05, 0xd7, 0xf1, 0xec, 0x24, 0x0f, - 0x60, 0x91, 0x42, 0x3e, 0xa1, 0xfa, 0xbb, 0x59, 0x34, 0x54, 0x6d, 0x76, 0x96, 0x4d, 0x61, 0xe1, - 0xd8, 0xb1, 0xbd, 0xed, 0x5b, 0xbf, 0xd9, 0xed, 0x59, 0xbf, 0x74, 0xb8, 0x39, 0x3b, 0x1c, 0x6e, - 0x7e, 0x39, 0xfc, 0x22, 0x2a, 0xb4, 0xe1, 0x3b, 0xa2, 0xe7, 0x89, 0xec, 0xeb, 0xd2, 0xce, 0x13, - 0x59, 0x19, 0x3a, 0xbe, 0x1a, 0xbb, 0x18, 0x5f, 0x61, 0x59, 0x41, 0xa0, 0xe1, 0x22, 0x71, 0x24, - 0xd0, 0x3d, 0x11, 0x68, 0xb8, 0x20, 0x1c, 0x09, 0x74, 0x17, 0x02, 0xfd, 0x95, 0x2c, 0x1a, 0x91, - 0xab, 0xc4, 0x4f, 0xa0, 0x41, 0x56, 0x0d, 0x3b, 0x57, 0xc9, 0x08, 0x6e, 0xa4, 0x21, 0x58, 0x43, - 0xec, 0x07, 0x3f, 0x20, 0x3a, 0xb6, 0xa2, 0xbb, 0xf5, 0xf0, 0x84, 0x83, 0xdd, 0x42, 0xf6, 0x33, - 0x7f, 0x9e, 0x08, 0x4a, 0x1b, 0x59, 0xd1, 0xdd, 0x89, 0xf0, 0x37, 0x9e, 0x44, 0x18, 0xd2, 0xd2, - 0xcb, 0x0c, 0xf2, 0xc0, 0x80, 0xa7, 0xb6, 0x8d, 0x62, 0xb5, 0x31, 0x06, 0x13, 0xd9, 0x7c, 0x24, - 0x68, 0x36, 0x28, 0x43, 0xef, 0x16, 0xf2, 0xee, 0x0a, 0xf4, 0xc9, 0xc7, 0x84, 0x8c, 0xa0, 0xac, - 0x7b, 0x3a, 0xdb, 0x94, 0xfb, 0x1d, 0xa0, 0xfe, 0x99, 0x89, 0x7a, 0xe7, 0x2d, 0x32, 0xbf, 0x84, - 0x9f, 0x44, 0x03, 0x54, 0x61, 0x66, 0x6c, 0xda, 0x97, 0x19, 0xee, 0x05, 0x20, 0x68, 0x12, 0x20, - 0xa6, 0x7b, 0xb4, 0x90, 0x0a, 0x5f, 0x13, 0x33, 0xcf, 0x73, 0xed, 0xc3, 0x62, 0x19, 0x86, 0x99, - 0xee, 0xd1, 0xc4, 0x0c, 0xf5, 0xd7, 0xc4, 0x8c, 0xdf, 0x5c, 0xef, 0xa4, 0x52, 0x0c, 0xe3, 0x97, - 0xe2, 0xe3, 0x63, 0x26, 0x29, 0x2d, 0x76, 0x74, 0xf7, 0x14, 0xa7, 0x98, 0xee, 0xd1, 0x92, 0xd3, - 0x69, 0x0f, 0x89, 0x2e, 0x84, 0x51, 0xd7, 0x05, 0x11, 0x37, 0xdd, 0xa3, 0x49, 0xb4, 0xf8, 0x59, - 0x34, 0xc8, 0x7f, 0xbf, 0x6a, 0x9b, 0x56, 0x34, 0xc6, 0x89, 0x80, 0x9a, 0xee, 0xd1, 0x44, 0x4a, - 0xa1, 0xd2, 0xaa, 0x63, 0x5a, 0x1e, 0x7f, 0xfb, 0x18, 0xad, 0x14, 0x70, 0x42, 0xa5, 0xf0, 0x1b, - 0xbf, 0x84, 0x86, 0x83, 0xe0, 0x31, 0x6f, 0x90, 0x86, 0xc7, 0x0f, 0x8f, 0xef, 0x8b, 0x14, 0x66, - 0xc8, 0xe9, 0x1e, 0x4d, 0xa6, 0xc6, 0x17, 0x51, 0x41, 0x23, 0xae, 0xf9, 0xa6, 0x7f, 0xe9, 0x39, - 0x22, 0x8c, 0x73, 0xf3, 0x4d, 0x2a, 0x25, 0x8e, 0xa7, 0xbd, 0x13, 0xde, 0xb2, 0xf2, 0xa3, 0x5e, - 0x1c, 0xa9, 0x65, 0xd2, 0x32, 0x68, 0xef, 0x08, 0x57, 0xec, 0xaf, 0x84, 0x21, 0x75, 0x78, 0xf2, - 0xbc, 0xc1, 0xe8, 0xdb, 0x65, 0x11, 0x3b, 0xdd, 0xa3, 0x45, 0xe8, 0x05, 0xa9, 0x96, 0x4d, 0xf7, - 0x0e, 0x8f, 0x62, 0x18, 0x95, 0x2a, 0x45, 0x09, 0x52, 0xa5, 0x3f, 0x85, 0xaa, 0xe7, 0x88, 0xb7, - 0x6a, 0x3b, 0x77, 0x78, 0xcc, 0xc2, 0x68, 0xd5, 0x1c, 0x2b, 0x54, 0xcd, 0x21, 0x62, 0xd5, 0x74, - 0xc0, 0x8d, 0x24, 0x57, 0xad, 0x7b, 0xba, 0x58, 0x35, 0x3b, 0x89, 0xf3, 0x3b, 0x69, 0x86, 0xe8, - 0x77, 0x59, 0xd6, 0xe5, 0x78, 0x87, 0x02, 0x4e, 0xe8, 0x50, 0xf8, 0x4d, 0x2b, 0x15, 0x32, 0xeb, - 0xf2, 0xb4, 0xca, 0x41, 0xa5, 0x02, 0x8a, 0x56, 0x2a, 0xe6, 0xe0, 0xbd, 0x26, 0xa6, 0x6f, 0x55, - 0xc6, 0xe4, 0x0e, 0x0a, 0x31, 0xb4, 0x83, 0x84, 0x34, 0xaf, 0x45, 0x48, 0x0d, 0xa9, 0x60, 0x20, - 0x1f, 0x0c, 0x5a, 0x38, 0x51, 0x9d, 0xee, 0xd1, 0x20, 0x69, 0xa4, 0xca, 0x92, 0x8e, 0x2a, 0xc7, - 0x81, 0x62, 0xc8, 0xa7, 0xa0, 0xb0, 0xe9, 0x1e, 0x8d, 0x25, 0x24, 0x7d, 0x52, 0x48, 0xef, 0xa5, - 0x9c, 0x90, 0xa7, 0x88, 0x00, 0x41, 0xa7, 0x88, 0x30, 0x09, 0xd8, 0x54, 0x3c, 0x89, 0x95, 0x72, - 0x9f, 0xbc, 0xd4, 0x44, 0xf1, 0xd3, 0x3d, 0x5a, 0x3c, 0xf1, 0xd5, 0xb3, 0x52, 0x5e, 0x27, 0xe5, - 0x64, 0x24, 0xb0, 0x50, 0x88, 0xa2, 0xe2, 0x12, 0x33, 0x40, 0xcd, 0x27, 0x66, 0x9e, 0x57, 0x4e, - 0xc9, 0x1b, 0x97, 0x04, 0x92, 0xe9, 0x1e, 0x2d, 0x31, 0x67, 0xfd, 0x44, 0x2c, 0xbb, 0x92, 0xa2, - 0xc8, 0x1e, 0x1e, 0x11, 0xf4, 0x74, 0x8f, 0x16, 0xcb, 0xc7, 0x74, 0x4d, 0x4c, 0x6b, 0xa4, 0x9c, - 0x96, 0x3b, 0x31, 0xc4, 0xd0, 0x4e, 0x14, 0xd2, 0x1f, 0x5d, 0x13, 0x53, 0xdd, 0x28, 0x67, 0xe2, - 0xa5, 0xc2, 0x99, 0x53, 0x48, 0x89, 0xa3, 0x25, 0x67, 0xef, 0x50, 0xee, 0xe7, 0xd9, 0x17, 0x79, - 0xf9, 0x24, 0x9a, 0xe9, 0x1e, 0x2d, 0x39, 0xf3, 0x87, 0x96, 0x9c, 0xf6, 0x42, 0x39, 0xdb, 0x8d, - 0x67, 0xd0, 0xba, 0xe4, 0x94, 0x19, 0x7a, 0x97, 0x24, 0x04, 0xca, 0x39, 0x39, 0xaa, 0x69, 0x2a, - 0xe1, 0x74, 0x8f, 0xd6, 0x25, 0x95, 0xc1, 0xcd, 0x94, 0x8c, 0x00, 0xca, 0x79, 0x39, 0xf9, 0x6a, - 0x22, 0xd1, 0x74, 0x8f, 0x96, 0x92, 0x4f, 0xe0, 0x66, 0x4a, 0xc0, 0x78, 0xa5, 0xd8, 0x95, 0x6d, - 0x20, 0x8f, 0x94, 0x70, 0xf3, 0xf3, 0x89, 0xb1, 0xd6, 0x95, 0x07, 0x64, 0xd5, 0x4d, 0x20, 0xa1, - 0xaa, 0x9b, 0x14, 0xa5, 0x7d, 0x3e, 0x31, 0x38, 0xb8, 0xf2, 0x60, 0x17, 0x86, 0x41, 0x1b, 0x13, - 0xc3, 0x8a, 0xcf, 0x27, 0x46, 0xe7, 0x56, 0x54, 0x99, 0x61, 0x02, 0x09, 0x65, 0x98, 0x14, 0xd7, - 0x7b, 0x3e, 0x31, 0x9c, 0xb4, 0xf2, 0x50, 0x17, 0x86, 0x61, 0x0b, 0x93, 0x02, 0x51, 0x3f, 0x2b, - 0xc5, 0x73, 0x56, 0x1e, 0x96, 0xe7, 0x0d, 0x01, 0x45, 0xe7, 0x0d, 0x31, 0xf2, 0xf3, 0x44, 0x2c, - 0x62, 0xa5, 0xf2, 0x88, 0x3c, 0xcc, 0x23, 0x68, 0x3a, 0xcc, 0xa3, 0x31, 0x2e, 0x27, 0x62, 0x91, - 0xfb, 0x94, 0x0b, 0x69, 0x4c, 0x00, 0x2d, 0x33, 0x61, 0xb1, 0xfe, 0x2a, 0x09, 0xa1, 0xe3, 0x94, - 0xf7, 0xc8, 0xde, 0xc9, 0x31, 0x82, 0xe9, 0x1e, 0x2d, 0x21, 0xe0, 0x9c, 0x96, 0x1c, 0x27, 0x45, - 0xb9, 0x28, 0x0f, 0xdb, 0x24, 0x1a, 0x3a, 0x6c, 0x13, 0x63, 0xac, 0xcc, 0x24, 0xbd, 0x44, 0x50, - 0x2e, 0xc9, 0x86, 0x59, 0x9c, 0x82, 0x1a, 0x66, 0x09, 0x2f, 0x18, 0xb4, 0xe4, 0xd8, 0x1d, 0xca, - 0xa3, 0x5d, 0x5b, 0x08, 0x34, 0x09, 0x2d, 0x64, 0xa1, 0x2c, 0x42, 0xdb, 0xe9, 0x66, 0xbb, 0x69, - 0xeb, 0x86, 0xf2, 0xde, 0x44, 0xdb, 0x89, 0x21, 0x05, 0xdb, 0x89, 0x01, 0xe8, 0x2a, 0x2f, 0x7a, - 0xea, 0x2b, 0x8f, 0xc9, 0xab, 0xbc, 0x88, 0xa3, 0xab, 0xbc, 0xe4, 0xd5, 0x3f, 0x11, 0xf3, 0x6a, - 0x57, 0x1e, 0x97, 0x15, 0x20, 0x82, 0xa6, 0x0a, 0x10, 0xf5, 0x83, 0xff, 0x68, 0xba, 0x1f, 0xb8, - 0x72, 0x19, 0xb8, 0x3d, 0xe0, 0x73, 0x4b, 0xa3, 0x9b, 0xee, 0xd1, 0xd2, 0x7d, 0xc9, 0x2b, 0x09, - 0x6e, 0xdd, 0xca, 0x15, 0x59, 0xc1, 0x62, 0x04, 0x54, 0xc1, 0xe2, 0xce, 0xe0, 0x95, 0x04, 0xbf, - 0x6c, 0xe5, 0x89, 0x54, 0x56, 0xc1, 0x37, 0x27, 0x78, 0x73, 0x5f, 0x13, 0x1d, 0xab, 0x95, 0x27, - 0xe5, 0xc5, 0x2e, 0xc4, 0xd0, 0xc5, 0x4e, 0x70, 0xc0, 0xbe, 0x26, 0xba, 0x14, 0x2b, 0x57, 0xe3, - 0xa5, 0xc2, 0x25, 0x52, 0x70, 0x3d, 0xd6, 0x92, 0x3d, 0x71, 0x95, 0xa7, 0x64, 0xad, 0x4b, 0xa2, - 0xa1, 0x5a, 0x97, 0xe8, 0xc5, 0x3b, 0x15, 0x77, 0xa8, 0x55, 0xae, 0x45, 0x37, 0xd9, 0x32, 0x9e, - 0x5a, 0x3e, 0x31, 0x27, 0xdc, 0x57, 0xa2, 0x41, 0xbc, 0x94, 0xa7, 0x23, 0xd7, 0xbe, 0x12, 0x96, - 0xda, 0xb7, 0x91, 0xa0, 0x5f, 0xaf, 0x44, 0xe3, 0x5e, 0x29, 0xcf, 0x24, 0x73, 0x08, 0x74, 0x25, - 0x1a, 0x27, 0xeb, 0x95, 0x68, 0xa8, 0x28, 0xe5, 0xd9, 0x64, 0x0e, 0x81, 0x74, 0xa3, 0xa1, 0xa5, - 0x9e, 0x14, 0x82, 0x57, 0x2b, 0xef, 0x93, 0x4d, 0xc7, 0x00, 0x41, 0x4d, 0xc7, 0x30, 0xc4, 0xf5, - 0x93, 0x42, 0xd0, 0x67, 0xe5, 0xb9, 0x58, 0x91, 0xa0, 0xb1, 0x42, 0x68, 0xe8, 0x27, 0x85, 0x60, - 0xc9, 0xca, 0xf3, 0xb1, 0x22, 0x41, 0xeb, 0x84, 0x90, 0xca, 0x46, 0xb7, 0x17, 0x8b, 0xca, 0x0b, - 0xf2, 0x61, 0x70, 0x3a, 0xe5, 0x74, 0x8f, 0xd6, 0xed, 0xe5, 0xe3, 0x47, 0xd3, 0xdd, 0x93, 0x95, - 0x17, 0xe5, 0x21, 0x9c, 0x46, 0x47, 0x87, 0x70, 0xaa, 0x8b, 0xf3, 0x4b, 0x91, 0xe8, 0x05, 0xca, - 0x4b, 0xf2, 0x14, 0x27, 0x21, 0xe9, 0x14, 0x17, 0x8d, 0x75, 0x20, 0x3d, 0xcb, 0x57, 0xde, 0x2f, - 0x4f, 0x71, 0x22, 0x8e, 0x4e, 0x71, 0xd2, 0x13, 0xfe, 0x89, 0xd8, 0x6b, 0x71, 0xe5, 0x65, 0x79, - 0x8a, 0x8b, 0xa0, 0xe9, 0x14, 0x17, 0x7d, 0x5f, 0xfe, 0x52, 0xe4, 0xd1, 0xb4, 0xf2, 0x4a, 0x72, - 0xfb, 0x01, 0x29, 0xb6, 0x9f, 0x3d, 0xb1, 0xd6, 0x92, 0x5f, 0xff, 0x2a, 0x25, 0x79, 0xfc, 0x26, - 0xd1, 0xd0, 0xf1, 0x9b, 0xf8, 0x72, 0x38, 0xba, 0x71, 0xe0, 0x5a, 0x35, 0xde, 0x65, 0xe3, 0x10, - 0x9a, 0x22, 0x09, 0x60, 0x69, 0x8f, 0xcc, 0x36, 0x42, 0x13, 0x29, 0x7b, 0x64, 0x7f, 0x1b, 0x14, - 0xa1, 0xa7, 0xb3, 0x6b, 0xcc, 0x5b, 0x56, 0x29, 0xcb, 0xb3, 0x6b, 0x8c, 0x80, 0xce, 0xae, 0x71, - 0x1f, 0xdb, 0x29, 0x34, 0xca, 0xb5, 0x88, 0x39, 0x01, 0x9b, 0xd6, 0xb2, 0x32, 0x19, 0x79, 0x7c, - 0x17, 0xc1, 0xd3, 0xd9, 0x29, 0x0a, 0x83, 0xf5, 0x9a, 0xc1, 0x26, 0x9a, 0x66, 0x7b, 0xd1, 0xd6, - 0x1d, 0xa3, 0x46, 0x2c, 0x43, 0x99, 0x8a, 0xac, 0xd7, 0x09, 0x34, 0xb0, 0x5e, 0x27, 0xc0, 0x21, - 0xf4, 0x54, 0x04, 0xae, 0x91, 0x06, 0x31, 0xef, 0x12, 0xe5, 0x3a, 0xb0, 0x2d, 0xa6, 0xb1, 0xe5, - 0x64, 0xd3, 0x3d, 0x5a, 0x1a, 0x07, 0x6a, 0xab, 0xcf, 0xae, 0xd5, 0x5e, 0x9b, 0x09, 0x1e, 0x9c, - 0x57, 0x1d, 0xd2, 0xd6, 0x1d, 0xa2, 0x4c, 0xcb, 0xb6, 0x7a, 0x22, 0x11, 0xb5, 0xd5, 0x13, 0x11, - 0x71, 0xb6, 0xfe, 0x58, 0xa8, 0x74, 0x63, 0x1b, 0x8e, 0x88, 0xe4, 0xd2, 0x74, 0x76, 0x92, 0x11, - 0x54, 0x40, 0x33, 0xb6, 0xb5, 0x0c, 0x27, 0x15, 0xaf, 0xca, 0xb3, 0x53, 0x3a, 0x25, 0x9d, 0x9d, - 0xd2, 0xb1, 0x54, 0xd5, 0x65, 0x2c, 0x1b, 0x83, 0x37, 0x64, 0x55, 0x4f, 0x20, 0xa1, 0xaa, 0x9e, - 0x00, 0x8e, 0x33, 0xd4, 0x88, 0x4b, 0x3c, 0x65, 0xa6, 0x1b, 0x43, 0x20, 0x89, 0x33, 0x04, 0x70, - 0x9c, 0xe1, 0x14, 0xf1, 0x1a, 0x2b, 0xca, 0x6c, 0x37, 0x86, 0x40, 0x12, 0x67, 0x08, 0x60, 0xba, - 0xd9, 0x94, 0xc1, 0xe3, 0x9d, 0xe6, 0x1d, 0xbf, 0xcf, 0xe6, 0xe4, 0xcd, 0x66, 0x2a, 0x21, 0xdd, - 0x6c, 0xa6, 0x22, 0xf1, 0x27, 0xb6, 0xec, 0xcd, 0xad, 0xcc, 0x43, 0x85, 0x97, 0x43, 0xbb, 0x60, - 0x2b, 0xa5, 0xa6, 0x7b, 0xb4, 0xad, 0x7a, 0x8b, 0xbf, 0x37, 0x70, 0xba, 0x54, 0xaa, 0x50, 0xd5, + // 15883 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x74, 0x24, 0xc7, + 0x75, 0x18, 0x8c, 0x79, 0x60, 0x00, 0x14, 0x1e, 0x0b, 0xd4, 0x2e, 0x77, 0x7b, 0x97, 0xbb, 0x3b, + 0x64, 0x93, 0x5c, 0xed, 0x52, 0xe4, 0x2e, 0xb9, 0x5c, 0x92, 0xe2, 0x4b, 0xe4, 0x00, 0x03, 0x2c, + 0x86, 0x8b, 0xc7, 0xb0, 0x07, 0xbb, 0x2b, 0xea, 0x35, 0x6e, 0x4c, 0x17, 0x80, 0x26, 0x66, 0xba, + 0x47, 0xdd, 0x3d, 0x8b, 0x05, 0xbf, 0x97, 0xe5, 0xcf, 0x0f, 0xc9, 0x96, 0x64, 0x7d, 0xf2, 0xe7, + 0xb7, 0xbf, 0xef, 0xc8, 0x76, 0x9c, 0xd8, 0x8e, 0x6d, 0xd9, 0x8e, 0x8f, 0x6c, 0xd9, 0xd1, 0x89, + 0x1d, 0x25, 0x27, 0xb4, 0x95, 0xf8, 0x58, 0x4e, 0xe2, 0xe3, 0x93, 0x38, 0x90, 0xa3, 0xc4, 0xf9, + 0x81, 0x13, 0x9f, 0xe3, 0x24, 0x3a, 0xb1, 0xe2, 0x38, 0x39, 0x39, 0x75, 0xab, 0xba, 0xbb, 0xaa, + 0x1f, 0x83, 0x27, 0x0d, 0x82, 0x8b, 0x3f, 0xbb, 0x98, 0x7b, 0x6f, 0xdd, 0xaa, 0xbe, 0x75, 0xab, + 0xea, 0x56, 0xd5, 0xad, 0x7b, 0xd1, 0x25, 0x8f, 0x34, 0x49, 0xdb, 0x76, 0xbc, 0x2b, 0x4d, 0xb2, + 0xac, 0x37, 0xd6, 0xaf, 0x78, 0xeb, 0x6d, 0xe2, 0x5e, 0x21, 0x77, 0x88, 0xe5, 0xf9, 0xff, 0x5d, + 0x6e, 0x3b, 0xb6, 0x67, 0xe3, 0x02, 0xfb, 0x75, 0xe6, 0xc4, 0xb2, 0xbd, 0x6c, 0x03, 0xe8, 0x0a, + 0xfd, 0x8b, 0x61, 0xcf, 0x9c, 0x5d, 0xb6, 0xed, 0xe5, 0x26, 0xb9, 0x02, 0xbf, 0x16, 0x3b, 0x4b, + 0x57, 0x5c, 0xcf, 0xe9, 0x34, 0x3c, 0x8e, 0x2d, 0x46, 0xb1, 0x9e, 0xd9, 0x22, 0xae, 0xa7, 0xb7, + 0xda, 0x9c, 0xe0, 0x7c, 0x94, 0x60, 0xcd, 0xd1, 0xdb, 0x6d, 0xe2, 0xf0, 0xca, 0xcf, 0x3c, 0x98, + 0xdc, 0x4e, 0xf8, 0x97, 0x93, 0x3c, 0x9e, 0x4c, 0xe2, 0x33, 0x8a, 0x70, 0x54, 0x3f, 0x97, 0x45, + 0xfd, 0xb3, 0xc4, 0xd3, 0x0d, 0xdd, 0xd3, 0xf1, 0x59, 0xd4, 0x5b, 0xb1, 0x0c, 0x72, 0x57, 0xc9, + 0x3c, 0x90, 0xb9, 0x98, 0x1b, 0x2f, 0x6c, 0x6e, 0x14, 0xb3, 0xc4, 0xd4, 0x18, 0x10, 0x9f, 0x43, + 0xf9, 0x85, 0xf5, 0x36, 0x51, 0xb2, 0x0f, 0x64, 0x2e, 0x0e, 0x8c, 0x0f, 0x6c, 0x6e, 0x14, 0x7b, + 0x41, 0x16, 0x1a, 0x80, 0xf1, 0x83, 0x28, 0x5b, 0x29, 0x2b, 0x39, 0x40, 0x8e, 0x6d, 0x6e, 0x14, + 0x87, 0x3b, 0xa6, 0xf1, 0x98, 0xdd, 0x32, 0x3d, 0xd2, 0x6a, 0x7b, 0xeb, 0x5a, 0xb6, 0x52, 0xc6, + 0x17, 0x50, 0x7e, 0xc2, 0x36, 0x88, 0x92, 0x07, 0x22, 0xbc, 0xb9, 0x51, 0x1c, 0x69, 0xd8, 0x06, + 0x11, 0xa8, 0x00, 0x8f, 0x5f, 0x41, 0xf9, 0x05, 0xb3, 0x45, 0x94, 0xde, 0x07, 0x32, 0x17, 0x07, + 0xaf, 0x9e, 0xb9, 0xcc, 0xa4, 0x72, 0xd9, 0x97, 0xca, 0xe5, 0x05, 0x5f, 0x6c, 0xe3, 0xa3, 0x6f, + 0x6d, 0x14, 0x7b, 0x36, 0x37, 0x8a, 0x79, 0x2a, 0xc9, 0xcf, 0x7e, 0xbd, 0x98, 0xd1, 0xa0, 0x24, + 0x7e, 0x11, 0x0d, 0x4e, 0x34, 0x3b, 0xae, 0x47, 0x9c, 0x39, 0xbd, 0x45, 0x94, 0x02, 0x54, 0x78, + 0x66, 0x73, 0xa3, 0x78, 0xb2, 0xc1, 0xc0, 0x75, 0x4b, 0x6f, 0x89, 0x15, 0x8b, 0xe4, 0xea, 0x6f, + 0x64, 0xd0, 0xb1, 0x1a, 0x71, 0x5d, 0xd3, 0xb6, 0x02, 0xd9, 0x3c, 0x82, 0x06, 0x38, 0xa8, 0x52, + 0x06, 0xf9, 0x0c, 0x8c, 0xf7, 0x6d, 0x6e, 0x14, 0x73, 0xae, 0x69, 0x68, 0x21, 0x06, 0x3f, 0x81, + 0xfa, 0x6e, 0x9b, 0xde, 0xca, 0xec, 0x54, 0x89, 0xcb, 0xe9, 0xe4, 0xe6, 0x46, 0x11, 0xaf, 0x99, + 0xde, 0x4a, 0xbd, 0xb5, 0xa4, 0x0b, 0x15, 0xfa, 0x64, 0x78, 0x06, 0x8d, 0x56, 0x1d, 0xf3, 0x8e, + 0xee, 0x91, 0x1b, 0x64, 0xbd, 0x6a, 0x37, 0xcd, 0xc6, 0x3a, 0x97, 0xe2, 0x03, 0x9b, 0x1b, 0xc5, + 0xb3, 0x6d, 0x86, 0xab, 0xaf, 0x92, 0xf5, 0x7a, 0x1b, 0xb0, 0x02, 0x93, 0x58, 0x49, 0xf5, 0x2b, + 0xbd, 0x68, 0xe8, 0xa6, 0x4b, 0x9c, 0xa0, 0xdd, 0x17, 0x50, 0x9e, 0xfe, 0xe6, 0x4d, 0x06, 0x99, + 0x77, 0x5c, 0xe2, 0x88, 0x32, 0xa7, 0x78, 0x7c, 0x09, 0xf5, 0xce, 0xd8, 0xcb, 0xa6, 0xc5, 0x9b, + 0x7d, 0x7c, 0x73, 0xa3, 0x78, 0xac, 0x49, 0x01, 0x02, 0x25, 0xa3, 0xc0, 0xef, 0x47, 0x43, 0x95, + 0x16, 0xd5, 0x21, 0xdb, 0xd2, 0x3d, 0xdb, 0xe1, 0xad, 0x05, 0xe9, 0x9a, 0x02, 0x5c, 0x28, 0x28, + 0xd1, 0xe3, 0xe7, 0x11, 0x2a, 0xdd, 0xae, 0x69, 0x76, 0x93, 0x94, 0xb4, 0x39, 0xae, 0x0c, 0x50, + 0x5a, 0x5f, 0x73, 0xeb, 0x8e, 0xdd, 0x24, 0x75, 0xdd, 0x11, 0xab, 0x15, 0xa8, 0xf1, 0x24, 0x1a, + 0x29, 0x35, 0x1a, 0xc4, 0x75, 0x35, 0xf2, 0xb1, 0x0e, 0x71, 0x3d, 0x57, 0xe9, 0x7d, 0x20, 0x77, + 0x71, 0x60, 0xfc, 0xdc, 0xe6, 0x46, 0xf1, 0xb4, 0x0e, 0x98, 0xba, 0xc3, 0x51, 0x02, 0x8b, 0x48, + 0x21, 0x3c, 0x8e, 0x86, 0x4b, 0x6f, 0x76, 0x1c, 0x52, 0x31, 0x88, 0xe5, 0x99, 0xde, 0x3a, 0xd7, + 0x90, 0xb3, 0x9b, 0x1b, 0x45, 0x45, 0xa7, 0x88, 0xba, 0xc9, 0x31, 0x02, 0x13, 0xb9, 0x08, 0x9e, + 0x47, 0x63, 0xd7, 0x27, 0xaa, 0x35, 0xe2, 0xdc, 0x31, 0x1b, 0xa4, 0xd4, 0x68, 0xd8, 0x1d, 0xcb, + 0x53, 0xfa, 0x80, 0xcf, 0x83, 0x9b, 0x1b, 0xc5, 0x73, 0xcb, 0x8d, 0x76, 0xdd, 0x65, 0xd8, 0xba, + 0xce, 0xd0, 0x02, 0xb3, 0x78, 0x59, 0xfc, 0x41, 0x34, 0xbc, 0xe0, 0x50, 0x2d, 0x34, 0xca, 0x84, + 0xc2, 0x95, 0x7e, 0xd0, 0xff, 0x93, 0x97, 0xf9, 0x04, 0xc4, 0xa0, 0x7e, 0xcf, 0xb2, 0xc6, 0x7a, + 0xac, 0x40, 0xdd, 0x00, 0x9c, 0xd8, 0x58, 0x89, 0x15, 0x26, 0x48, 0xa1, 0x1f, 0x6f, 0x3a, 0xc4, + 0x88, 0x69, 0xdb, 0x00, 0xb4, 0xf9, 0xd2, 0xe6, 0x46, 0xf1, 0x11, 0x87, 0xd3, 0xd4, 0xbb, 0xaa, + 0x5d, 0x2a, 0x2b, 0x3c, 0x89, 0xfa, 0xa9, 0x36, 0xdd, 0x30, 0x2d, 0x43, 0x41, 0x0f, 0x64, 0x2e, + 0x8e, 0x5c, 0x1d, 0xf5, 0x5b, 0xef, 0xc3, 0xc7, 0x4f, 0x6d, 0x6e, 0x14, 0x8f, 0x53, 0x1d, 0xac, + 0xaf, 0x9a, 0x96, 0x38, 0x45, 0x04, 0x45, 0xd5, 0xbf, 0xcc, 0xa3, 0x11, 0x2a, 0x1c, 0x41, 0x8f, + 0x4b, 0x74, 0x48, 0x52, 0x08, 0x1d, 0xa1, 0x6e, 0x5b, 0x6f, 0x10, 0xae, 0xd2, 0xc0, 0xce, 0xf2, + 0x81, 0x02, 0xbb, 0x28, 0x3d, 0xbe, 0x84, 0xfa, 0x19, 0xa8, 0x52, 0xe6, 0x5a, 0x3e, 0xbc, 0xb9, + 0x51, 0x1c, 0x70, 0x01, 0x56, 0x37, 0x0d, 0x2d, 0x40, 0x53, 0x35, 0x63, 0x7f, 0x4f, 0xdb, 0xae, + 0x47, 0x99, 0x73, 0x25, 0x07, 0x35, 0xe3, 0x05, 0x56, 0x38, 0x4a, 0x54, 0x33, 0xb9, 0x10, 0x7e, + 0x0e, 0x21, 0x06, 0x29, 0x19, 0x86, 0xc3, 0x35, 0xfd, 0xf4, 0xe6, 0x46, 0xf1, 0x3e, 0xce, 0x42, + 0x37, 0x0c, 0x71, 0x98, 0x08, 0xc4, 0xb8, 0x85, 0x86, 0xd8, 0xaf, 0x19, 0x7d, 0x91, 0x34, 0x99, + 0x9a, 0x0f, 0x5e, 0xbd, 0xe8, 0x4b, 0x53, 0x96, 0xce, 0x65, 0x91, 0x74, 0xd2, 0xf2, 0x9c, 0xf5, + 0xf1, 0x22, 0x9f, 0x19, 0x4f, 0xf1, 0xaa, 0x9a, 0x80, 0x13, 0xc7, 0xa4, 0x58, 0x86, 0x4e, 0x98, + 0x53, 0xb6, 0xb3, 0xa6, 0x3b, 0x06, 0x31, 0xc6, 0xd7, 0xc5, 0x09, 0x73, 0xc9, 0x07, 0xd7, 0x17, + 0x45, 0x1d, 0x10, 0xc9, 0xf1, 0x04, 0x1a, 0x66, 0xdc, 0x6a, 0x9d, 0x45, 0xe8, 0xfb, 0xbe, 0x98, + 0xb4, 0xdc, 0xce, 0x62, 0xb4, 0xbf, 0xe5, 0x32, 0x74, 0x4c, 0x32, 0xc0, 0x2d, 0xe2, 0xd0, 0xd9, + 0x14, 0xd4, 0x9f, 0x8f, 0x49, 0xce, 0xe4, 0x0e, 0xc3, 0xc4, 0x79, 0xf0, 0x22, 0x67, 0x5e, 0x46, + 0x63, 0x31, 0x51, 0xe0, 0x51, 0x94, 0x5b, 0x25, 0xeb, 0x4c, 0x5d, 0x34, 0xfa, 0x27, 0x3e, 0x81, + 0x7a, 0xef, 0xe8, 0xcd, 0x0e, 0x5f, 0xcb, 0x34, 0xf6, 0xe3, 0xf9, 0xec, 0xfb, 0x32, 0x74, 0xea, + 0xc7, 0x13, 0xb6, 0x65, 0x91, 0x86, 0x27, 0xce, 0xfe, 0xcf, 0xa0, 0x81, 0x19, 0xbb, 0xa1, 0x37, + 0xa1, 0x1f, 0x99, 0xde, 0x29, 0x9b, 0x1b, 0xc5, 0x13, 0xb4, 0x03, 0x2f, 0x37, 0x29, 0x46, 0x68, + 0x53, 0x48, 0x4a, 0x15, 0x40, 0x23, 0x2d, 0xdb, 0x23, 0x50, 0x30, 0x1b, 0x2a, 0x00, 0x14, 0x74, + 0x00, 0x25, 0x2a, 0x40, 0x48, 0x8c, 0xaf, 0xa0, 0xfe, 0x2a, 0x5d, 0xf0, 0x1a, 0x76, 0x93, 0x2b, + 0x1f, 0xcc, 0xc9, 0xb0, 0x08, 0x8a, 0x83, 0xc6, 0x27, 0x52, 0xa7, 0xd1, 0xc8, 0x44, 0xd3, 0x24, + 0x96, 0x27, 0xb6, 0x9a, 0x0e, 0xa9, 0xd2, 0x32, 0xb1, 0x3c, 0xb1, 0xd5, 0x30, 0xf8, 0x74, 0x0a, + 0x15, 0x5b, 0x1d, 0x90, 0xaa, 0xbf, 0x9f, 0x43, 0xa7, 0x6f, 0x74, 0x16, 0x89, 0x63, 0x11, 0x8f, + 0xb8, 0x7c, 0x65, 0x0c, 0xb8, 0xce, 0xa1, 0xb1, 0x18, 0x92, 0x73, 0x87, 0x15, 0x6b, 0x35, 0x40, + 0xd6, 0xf9, 0x62, 0x2b, 0x4e, 0x7b, 0xb1, 0xa2, 0x78, 0x1a, 0x1d, 0x0b, 0x81, 0xb4, 0x11, 0xae, + 0x92, 0x85, 0x39, 0xfd, 0xfc, 0xe6, 0x46, 0xf1, 0x8c, 0xc0, 0x8d, 0x36, 0x5b, 0xd4, 0xe0, 0x68, + 0x31, 0x7c, 0x03, 0x8d, 0x86, 0xa0, 0xeb, 0x8e, 0xdd, 0x69, 0xbb, 0x4a, 0x0e, 0x58, 0x15, 0x37, + 0x37, 0x8a, 0xf7, 0x0b, 0xac, 0x96, 0x01, 0x29, 0xae, 0xa4, 0xd1, 0x82, 0xf8, 0x3b, 0x33, 0x22, + 0x37, 0x3e, 0x0a, 0xf3, 0x30, 0x0a, 0x9f, 0xf5, 0x47, 0x61, 0xaa, 0x90, 0x2e, 0x47, 0x4b, 0xf2, + 0x41, 0x19, 0x69, 0x46, 0x6c, 0x50, 0xc6, 0x6a, 0x3c, 0x33, 0x81, 0xee, 0x4b, 0xe4, 0xb5, 0x23, + 0xad, 0xfe, 0xb3, 0x9c, 0xc8, 0xa5, 0x6a, 0x1b, 0x41, 0x67, 0xce, 0x8b, 0x9d, 0x59, 0xb5, 0x0d, + 0x30, 0x97, 0x32, 0xe1, 0x22, 0x26, 0x34, 0xb6, 0x6d, 0x1b, 0x51, 0xab, 0x29, 0x5e, 0x16, 0x7f, + 0x14, 0x9d, 0x8c, 0x01, 0xd9, 0x74, 0xcd, 0xb4, 0xff, 0xc2, 0xe6, 0x46, 0x51, 0x4d, 0xe0, 0x1a, + 0x9d, 0xbd, 0x53, 0xb8, 0x60, 0x1d, 0x9d, 0x12, 0xa4, 0x6e, 0x5b, 0x9e, 0x6e, 0x5a, 0xdc, 0xca, + 0x63, 0xa3, 0xe4, 0x3d, 0x9b, 0x1b, 0xc5, 0x87, 0x44, 0x1d, 0xf4, 0x69, 0xa2, 0x8d, 0x4f, 0xe3, + 0x83, 0x0d, 0xa4, 0x24, 0xa0, 0x2a, 0x2d, 0x7d, 0xd9, 0x37, 0x5d, 0x2f, 0x6e, 0x6e, 0x14, 0x1f, + 0x4e, 0xac, 0xc3, 0xa4, 0x54, 0xe2, 0x52, 0x99, 0xc6, 0x09, 0x6b, 0x08, 0x87, 0xb8, 0x39, 0xdb, + 0x20, 0xf0, 0x0d, 0xbd, 0xc0, 0x5f, 0xdd, 0xdc, 0x28, 0x9e, 0x17, 0xf8, 0x5b, 0xb6, 0x41, 0xa2, + 0xcd, 0x4f, 0x28, 0xad, 0xfe, 0x46, 0x0e, 0x9d, 0xaf, 0x95, 0x66, 0x67, 0x2a, 0x86, 0x6f, 0x5b, + 0x54, 0x1d, 0xfb, 0x8e, 0x69, 0x08, 0xa3, 0x77, 0x11, 0x9d, 0x8a, 0xa0, 0x26, 0xc1, 0x9c, 0x09, + 0xac, 0x5a, 0xf8, 0x36, 0xdf, 0x6e, 0x69, 0x73, 0x9a, 0x3a, 0xb3, 0x79, 0xea, 0x92, 0x49, 0x9f, + 0xc6, 0x88, 0xf6, 0x51, 0x04, 0x55, 0x5b, 0xb1, 0x1d, 0xaf, 0xd1, 0xf1, 0xb8, 0x12, 0x40, 0x1f, + 0xc5, 0xea, 0x70, 0x39, 0x51, 0x97, 0x2a, 0x7c, 0x3e, 0xf8, 0x93, 0x19, 0x34, 0x5a, 0xf2, 0x3c, + 0xc7, 0x5c, 0xec, 0x78, 0x64, 0x56, 0x6f, 0xb7, 0x4d, 0x6b, 0x19, 0xc6, 0xfa, 0xe0, 0xd5, 0x17, + 0x83, 0x35, 0xb2, 0xab, 0x24, 0x2e, 0x47, 0x8b, 0x0b, 0x43, 0x54, 0xf7, 0x51, 0xf5, 0x16, 0xc3, + 0x89, 0x43, 0x34, 0x5a, 0x8e, 0x0e, 0xd1, 0x44, 0x5e, 0x3b, 0x1a, 0xa2, 0x9f, 0xcb, 0xa1, 0xb3, + 0xf3, 0xab, 0x9e, 0xae, 0x11, 0xd7, 0xee, 0x38, 0x0d, 0xe2, 0xde, 0x6c, 0x1b, 0xba, 0x47, 0xc2, + 0x91, 0x5a, 0x44, 0xbd, 0x25, 0xc3, 0x20, 0x06, 0xb0, 0xeb, 0x65, 0xfb, 0x2f, 0x9d, 0x02, 0x34, + 0x06, 0xc7, 0x8f, 0xa0, 0x3e, 0x5e, 0x06, 0xb8, 0xf7, 0x8e, 0x0f, 0x6e, 0x6e, 0x14, 0xfb, 0x3a, + 0x0c, 0xa4, 0xf9, 0x38, 0x4a, 0x56, 0x26, 0x4d, 0x42, 0xc9, 0x72, 0x21, 0x99, 0xc1, 0x40, 0x9a, + 0x8f, 0xc3, 0xaf, 0xa1, 0x11, 0x60, 0x1b, 0xb4, 0x87, 0xcf, 0x7d, 0x27, 0x7c, 0xe9, 0x8a, 0x8d, + 0x65, 0x4b, 0x13, 0xb4, 0xa6, 0xee, 0xf8, 0x05, 0xb4, 0x08, 0x03, 0x7c, 0x1b, 0x8d, 0xf2, 0x46, + 0x84, 0x4c, 0x7b, 0xbb, 0x30, 0xbd, 0x6f, 0x73, 0xa3, 0x38, 0xc6, 0xdb, 0x2f, 0xb0, 0x8d, 0x31, + 0xa1, 0x8c, 0x79, 0xb3, 0x43, 0xc6, 0x85, 0xad, 0x18, 0xf3, 0x2f, 0x16, 0x19, 0x47, 0x99, 0xa8, + 0xaf, 0xa3, 0x21, 0xb1, 0x20, 0x3e, 0x09, 0x7b, 0x5c, 0x36, 0x4e, 0x60, 0x77, 0x6c, 0x1a, 0xb0, + 0xb1, 0x7d, 0x12, 0x0d, 0x96, 0x89, 0xdb, 0x70, 0xcc, 0x36, 0xb5, 0x1a, 0xb8, 0x92, 0x1f, 0xdb, + 0xdc, 0x28, 0x0e, 0x1a, 0x21, 0x58, 0x13, 0x69, 0xd4, 0xff, 0x9a, 0x41, 0x27, 0x29, 0xef, 0x92, + 0xeb, 0x9a, 0xcb, 0x56, 0x4b, 0x5c, 0xb6, 0x1f, 0x43, 0x85, 0x1a, 0xd4, 0xc7, 0x6b, 0x3a, 0xb1, + 0xb9, 0x51, 0x1c, 0x65, 0x2d, 0x10, 0xf4, 0x90, 0xd3, 0x04, 0x1b, 0xbc, 0xec, 0x16, 0x1b, 0x3c, + 0x6a, 0xd2, 0x7a, 0xba, 0xe3, 0x99, 0xd6, 0x72, 0xcd, 0xd3, 0xbd, 0x8e, 0x2b, 0x99, 0xb4, 0x1c, + 0x53, 0x77, 0x01, 0x25, 0x99, 0xb4, 0x52, 0x21, 0xfc, 0x32, 0x1a, 0x9a, 0xb4, 0x8c, 0x90, 0x09, + 0x9b, 0x10, 0xef, 0xa7, 0x96, 0x26, 0x01, 0x78, 0x9c, 0x85, 0x54, 0x40, 0xfd, 0xc5, 0x0c, 0x52, + 0xd8, 0x6e, 0x6c, 0xc6, 0x74, 0xbd, 0x59, 0xd2, 0x5a, 0x14, 0x66, 0xa7, 0x29, 0x7f, 0x7b, 0x47, + 0x71, 0xc2, 0x5a, 0x04, 0xa6, 0x00, 0xdf, 0xde, 0x35, 0x4d, 0xd7, 0x8b, 0x4e, 0x86, 0x91, 0x52, + 0xb8, 0x82, 0xfa, 0x18, 0x67, 0x66, 0x4b, 0x0c, 0x5e, 0x55, 0x7c, 0x45, 0x88, 0x56, 0xcd, 0x94, + 0xa1, 0xc5, 0x88, 0xc5, 0xfd, 0x39, 0x2f, 0xaf, 0xfe, 0x72, 0x16, 0x8d, 0x46, 0x0b, 0xe1, 0xdb, + 0xa8, 0xff, 0x55, 0xdb, 0xb4, 0x88, 0x31, 0x6f, 0x41, 0x0b, 0xbb, 0x9f, 0x52, 0xf8, 0xb6, 0xf8, + 0xf1, 0x37, 0xa0, 0x4c, 0x5d, 0xb4, 0x60, 0xe1, 0xd0, 0x22, 0x60, 0x86, 0x3f, 0x88, 0x06, 0xa8, + 0x0d, 0x78, 0x07, 0x38, 0x67, 0xb7, 0xe4, 0xfc, 0x00, 0xe7, 0x7c, 0xc2, 0x61, 0x85, 0xe2, 0xac, + 0x43, 0x76, 0x54, 0xaf, 0x34, 0xa2, 0xbb, 0xb6, 0xc5, 0x7b, 0x1e, 0xf4, 0xca, 0x01, 0x88, 0xa8, + 0x57, 0x8c, 0x86, 0x9a, 0xae, 0xec, 0x63, 0xa1, 0x1b, 0x84, 0xbd, 0x0b, 0x93, 0x55, 0xb4, 0x07, + 0x04, 0x62, 0xf5, 0xbb, 0xb3, 0xe8, 0xf1, 0x50, 0x64, 0x1a, 0xb9, 0x63, 0x92, 0x35, 0x2e, 0xce, + 0x15, 0xb3, 0xcd, 0x37, 0x8f, 0x54, 0xe5, 0xdd, 0x89, 0x15, 0xdd, 0x5a, 0x26, 0x06, 0xbe, 0x84, + 0x7a, 0xe9, 0x0e, 0xdf, 0x55, 0x32, 0x60, 0xae, 0xc1, 0x74, 0xe2, 0x50, 0x80, 0x78, 0xfa, 0x00, + 0x14, 0xd8, 0x46, 0x85, 0x05, 0x47, 0x37, 0x3d, 0xbf, 0x67, 0x4b, 0xf1, 0x9e, 0xdd, 0x46, 0x8d, + 0x97, 0x19, 0x0f, 0x36, 0xe7, 0x83, 0x20, 0x3c, 0x00, 0x88, 0x82, 0x60, 0x24, 0x67, 0x9e, 0x43, + 0x83, 0x02, 0xf1, 0x8e, 0x26, 0xf5, 0x2f, 0xe5, 0x45, 0x5d, 0xf7, 0x9b, 0xc5, 0x75, 0xfd, 0x0a, + 0xd5, 0x51, 0xd7, 0xa5, 0x56, 0x05, 0x53, 0x72, 0xae, 0x89, 0x00, 0x92, 0x35, 0x11, 0x40, 0xf8, + 0x29, 0xd4, 0xcf, 0x58, 0x04, 0xfb, 0x57, 0xd8, 0xfb, 0x3a, 0x00, 0x93, 0x97, 0xe6, 0x80, 0x10, + 0xff, 0x7c, 0x06, 0x9d, 0xeb, 0x2a, 0x09, 0x50, 0x86, 0xc1, 0xab, 0x4f, 0xef, 0x4a, 0x8c, 0xe3, + 0x8f, 0x6f, 0x6e, 0x14, 0x2f, 0xb5, 0x02, 0x92, 0xba, 0x23, 0xd0, 0xd4, 0x1b, 0x8c, 0x48, 0x68, + 0x57, 0xf7, 0xa6, 0x50, 0xe3, 0x91, 0x55, 0x3a, 0x05, 0x67, 0x38, 0x56, 0x63, 0xdd, 0x6f, 0x64, + 0x3e, 0x34, 0x1e, 0xf9, 0xf7, 0x2e, 0xf9, 0x24, 0x09, 0xd5, 0xa4, 0x70, 0xc1, 0x0d, 0x74, 0x8a, + 0x61, 0xca, 0xfa, 0xfa, 0xfc, 0xd2, 0xac, 0x6d, 0x79, 0x2b, 0x7e, 0x05, 0xbd, 0xe2, 0x21, 0x08, + 0x54, 0x60, 0xe8, 0xeb, 0x75, 0x7b, 0xa9, 0xde, 0xa2, 0x54, 0x09, 0x75, 0xa4, 0x71, 0xa2, 0x13, + 0x2d, 0x1f, 0x73, 0xfe, 0x14, 0x54, 0x08, 0x8f, 0xa8, 0xfc, 0x71, 0x1a, 0x9f, 0x70, 0x22, 0x85, + 0xd4, 0x0a, 0x1a, 0x9a, 0xb1, 0x1b, 0xab, 0x81, 0xba, 0x3c, 0x87, 0x0a, 0x0b, 0xba, 0xb3, 0x4c, + 0x3c, 0x90, 0xc5, 0xe0, 0xd5, 0xb1, 0xcb, 0xec, 0xd8, 0x97, 0x12, 0x31, 0xc4, 0xf8, 0x08, 0x9f, + 0x0d, 0x0a, 0x1e, 0xfc, 0xd6, 0x78, 0x01, 0xf5, 0xeb, 0xbd, 0x68, 0x88, 0x1f, 0x51, 0xc2, 0x6c, + 0x8e, 0x9f, 0x0f, 0x0f, 0x7d, 0xf9, 0xf4, 0x15, 0x1c, 0xd3, 0x04, 0xc7, 0x4b, 0x43, 0x94, 0xd9, + 0x1f, 0x6c, 0x14, 0x33, 0x9b, 0x1b, 0xc5, 0x1e, 0xad, 0x5f, 0xd8, 0x54, 0x86, 0xeb, 0x8d, 0xb0, + 0xc0, 0x8a, 0x87, 0x8e, 0x91, 0xb2, 0x6c, 0xfd, 0x79, 0x19, 0xf5, 0xf1, 0x36, 0x70, 0x8d, 0x3b, + 0x15, 0x9e, 0x65, 0x48, 0x47, 0xad, 0x91, 0xd2, 0x7e, 0x29, 0xfc, 0x22, 0x2a, 0xb0, 0xbd, 0x3d, + 0x17, 0xc0, 0xc9, 0xe4, 0xb3, 0x90, 0x48, 0x71, 0x5e, 0x06, 0x4f, 0x23, 0x14, 0xee, 0xeb, 0x83, + 0x93, 0x65, 0xce, 0x21, 0xbe, 0xe3, 0x8f, 0x70, 0x11, 0xca, 0xe2, 0x67, 0xd0, 0xd0, 0x02, 0x71, + 0x5a, 0xa6, 0xa5, 0x37, 0x6b, 0xe6, 0x9b, 0xfe, 0xe1, 0x32, 0x2c, 0xbc, 0xae, 0xf9, 0xa6, 0x38, + 0x72, 0x25, 0x3a, 0xfc, 0x91, 0xa4, 0x7d, 0x73, 0x1f, 0x34, 0xe4, 0xc1, 0x2d, 0x37, 0x94, 0x91, + 0xf6, 0x24, 0x6c, 0xa3, 0x5f, 0x43, 0xc3, 0xd2, 0x96, 0x89, 0x9f, 0x1e, 0x9e, 0x8b, 0xb3, 0x16, + 0xf6, 0x7f, 0x11, 0xb6, 0x32, 0x07, 0xaa, 0xc9, 0x15, 0xcb, 0xf4, 0x4c, 0xbd, 0x39, 0x61, 0xb7, + 0x5a, 0xba, 0x65, 0x28, 0x03, 0xa1, 0x26, 0x9b, 0x0c, 0x53, 0x6f, 0x30, 0x94, 0xa8, 0xc9, 0x72, + 0x21, 0xba, 0x2d, 0xe7, 0x7d, 0xa8, 0x91, 0x86, 0xed, 0x50, 0x5b, 0x00, 0x0e, 0x07, 0xf9, 0xb6, + 0xdc, 0x65, 0xb8, 0xba, 0xe3, 0x23, 0x45, 0x63, 0x3b, 0x5a, 0xf0, 0xd5, 0x7c, 0xff, 0xe0, 0xe8, + 0x50, 0xf4, 0x3c, 0x57, 0xfd, 0xb9, 0x1c, 0x1a, 0xe4, 0xa4, 0x74, 0x29, 0x3d, 0x52, 0xf0, 0xbd, + 0x28, 0x78, 0xa2, 0xa2, 0x16, 0xf6, 0x4b, 0x51, 0xd5, 0x4f, 0x65, 0x83, 0xd9, 0xa8, 0xea, 0x98, + 0xd6, 0xde, 0x66, 0xa3, 0x0b, 0x08, 0x4d, 0xac, 0x74, 0xac, 0x55, 0x76, 0x6f, 0x95, 0x0d, 0xef, + 0xad, 0x1a, 0xa6, 0x26, 0x60, 0xf0, 0x39, 0x94, 0x2f, 0x53, 0xfe, 0xb4, 0x67, 0x86, 0xc6, 0x07, + 0xde, 0x62, 0x9c, 0x32, 0x8f, 0x6b, 0x00, 0xa6, 0x9b, 0xab, 0xf1, 0x75, 0x8f, 0x30, 0x73, 0x36, + 0xc7, 0x36, 0x57, 0x8b, 0x14, 0xa0, 0x31, 0x38, 0xbe, 0x86, 0xc6, 0xca, 0xa4, 0xa9, 0xaf, 0xcf, + 0x9a, 0xcd, 0xa6, 0xe9, 0x92, 0x86, 0x6d, 0x19, 0x2e, 0x08, 0x99, 0x57, 0xd7, 0x72, 0xb5, 0x38, + 0x01, 0x56, 0x51, 0x61, 0x7e, 0x69, 0xc9, 0x25, 0x1e, 0x88, 0x2f, 0x37, 0x8e, 0xe8, 0xe4, 0x6c, + 0x03, 0x44, 0xe3, 0x18, 0xf5, 0x0b, 0x19, 0xba, 0x7b, 0x71, 0x57, 0x3d, 0xbb, 0x1d, 0x68, 0xf9, + 0x9e, 0x44, 0x72, 0x29, 0xb4, 0x2b, 0xb2, 0xf0, 0xb5, 0xc7, 0xf8, 0xd7, 0xf6, 0x71, 0xdb, 0x22, + 0xb4, 0x28, 0x12, 0xbf, 0x2a, 0xb7, 0xc5, 0x57, 0xa9, 0x7f, 0x91, 0x45, 0xa7, 0x78, 0x8b, 0x27, + 0x9a, 0x66, 0x7b, 0xd1, 0xd6, 0x1d, 0x43, 0x23, 0x0d, 0x62, 0xde, 0x21, 0x87, 0x73, 0xe0, 0xc9, + 0x43, 0x27, 0xbf, 0x87, 0xa1, 0x73, 0x15, 0x36, 0x82, 0x54, 0x32, 0x70, 0xe0, 0xcb, 0x8c, 0x8a, + 0xd1, 0xcd, 0x8d, 0xe2, 0x90, 0xc1, 0xc0, 0x70, 0xe4, 0xaf, 0x89, 0x44, 0x54, 0x49, 0x66, 0x88, + 0xb5, 0xec, 0xad, 0x80, 0x92, 0xf4, 0x32, 0x25, 0x69, 0x02, 0x44, 0xe3, 0x18, 0xf5, 0xcf, 0xb3, + 0xe8, 0x44, 0x54, 0xe4, 0x35, 0x62, 0x19, 0x47, 0xf2, 0x7e, 0x7b, 0xe4, 0xfd, 0xcd, 0x1c, 0xba, + 0x9f, 0x97, 0xa9, 0xad, 0xe8, 0x0e, 0x31, 0xca, 0xa6, 0x43, 0x1a, 0x9e, 0xed, 0xac, 0x1f, 0x62, + 0x03, 0x6a, 0xff, 0xc4, 0x7e, 0x0d, 0x15, 0xf8, 0xf6, 0x9f, 0xad, 0x33, 0x23, 0x41, 0x4b, 0x00, + 0x1a, 0x5b, 0xa1, 0xd8, 0xd1, 0x41, 0xa4, 0xb3, 0x0a, 0xdb, 0xe9, 0xac, 0xf7, 0xa1, 0xe1, 0x40, + 0xf4, 0xb0, 0x11, 0xed, 0x0b, 0xad, 0x2d, 0xc3, 0x47, 0xc0, 0x5e, 0x54, 0x93, 0x09, 0xa1, 0x36, + 0x1f, 0x50, 0x29, 0x83, 0x35, 0x34, 0xcc, 0x6b, 0x0b, 0xca, 0x99, 0x86, 0x26, 0x12, 0xa9, 0x1b, + 0x79, 0x74, 0x26, 0xb9, 0xdb, 0x35, 0xa2, 0x1b, 0x47, 0xbd, 0xfe, 0xae, 0xec, 0x75, 0xfc, 0x20, + 0xca, 0x57, 0x75, 0x6f, 0x85, 0xdf, 0x83, 0xc3, 0x9d, 0xf0, 0x92, 0xd9, 0x24, 0xf5, 0xb6, 0xee, + 0xad, 0x68, 0x80, 0x12, 0xe6, 0x0c, 0x04, 0x1c, 0x13, 0xe6, 0x0c, 0x61, 0xb1, 0x1f, 0x7c, 0x20, + 0x73, 0x31, 0x9f, 0xb8, 0xd8, 0x7f, 0x3d, 0x9f, 0x36, 0xaf, 0xdc, 0x76, 0x4c, 0x8f, 0x1c, 0x69, + 0xd8, 0x91, 0x86, 0xed, 0x51, 0xc3, 0xfe, 0x30, 0x8b, 0x86, 0x83, 0x4d, 0xd3, 0x1b, 0xa4, 0x71, + 0x30, 0x6b, 0x55, 0xb8, 0x95, 0xc9, 0xed, 0x79, 0x2b, 0xb3, 0x17, 0x85, 0x52, 0x83, 0x23, 0x4f, + 0x66, 0x1a, 0x80, 0xc4, 0xd8, 0x91, 0x67, 0x70, 0xd0, 0xf9, 0x20, 0xea, 0x9b, 0xd5, 0xef, 0x9a, + 0xad, 0x4e, 0x8b, 0x5b, 0xe9, 0xe0, 0xd7, 0xd5, 0xd2, 0xef, 0x6a, 0x3e, 0x5c, 0xfd, 0x17, 0x19, + 0x34, 0xc2, 0x85, 0xca, 0x99, 0xef, 0x49, 0xaa, 0xa1, 0x74, 0xb2, 0x7b, 0x96, 0x4e, 0x6e, 0xf7, + 0xd2, 0x51, 0x7f, 0x22, 0x87, 0x94, 0x29, 0xb3, 0x49, 0x16, 0x1c, 0xdd, 0x72, 0x97, 0x88, 0xc3, + 0xb7, 0xd3, 0x93, 0x94, 0xd5, 0x9e, 0x3e, 0x50, 0x98, 0x52, 0xb2, 0xbb, 0x9a, 0x52, 0xde, 0x8b, + 0x06, 0x78, 0x63, 0x02, 0x9f, 0x42, 0x18, 0x35, 0x8e, 0x0f, 0xd4, 0x42, 0x3c, 0x25, 0x2e, 0xb5, + 0xdb, 0x8e, 0x7d, 0x87, 0x38, 0xec, 0x96, 0x8a, 0x13, 0xeb, 0x3e, 0x50, 0x0b, 0xf1, 0x02, 0x67, + 0xe2, 0xdb, 0x8b, 0x22, 0x67, 0xe2, 0x68, 0x21, 0x1e, 0x5f, 0x44, 0xfd, 0x33, 0x76, 0x43, 0x07, + 0x41, 0xb3, 0x69, 0x65, 0x68, 0x73, 0xa3, 0xd8, 0xdf, 0xe4, 0x30, 0x2d, 0xc0, 0x52, 0xca, 0xb2, + 0xbd, 0x66, 0x35, 0x6d, 0x9d, 0x39, 0xbf, 0xf4, 0x33, 0x4a, 0x83, 0xc3, 0xb4, 0x00, 0x4b, 0x29, + 0xa9, 0xcc, 0xc1, 0xa9, 0xa8, 0x3f, 0xe4, 0xb9, 0xc4, 0x61, 0x5a, 0x80, 0x55, 0xbf, 0x90, 0xa7, + 0xda, 0xeb, 0x9a, 0x6f, 0xde, 0xf3, 0xeb, 0x42, 0x38, 0x60, 0x7a, 0x77, 0x31, 0x60, 0xee, 0x99, + 0x03, 0x3b, 0xf5, 0x2f, 0xfb, 0x10, 0xe2, 0xd2, 0x9f, 0x3c, 0xda, 0x1c, 0xee, 0x4d, 0x6b, 0xca, + 0x68, 0x6c, 0xd2, 0x5a, 0xd1, 0xad, 0x06, 0x31, 0xc2, 0x63, 0xcb, 0x02, 0x0c, 0x6d, 0xf0, 0xe9, + 0x25, 0x1c, 0x19, 0x9e, 0x5b, 0x6a, 0xf1, 0x02, 0xf8, 0x49, 0x34, 0x58, 0xb1, 0x3c, 0xe2, 0xe8, + 0x0d, 0xcf, 0xbc, 0x43, 0xf8, 0xd4, 0x00, 0x37, 0xc3, 0x66, 0x08, 0xd6, 0x44, 0x1a, 0x7c, 0x0d, + 0x0d, 0x55, 0x75, 0xc7, 0x33, 0x1b, 0x66, 0x5b, 0xb7, 0x3c, 0x57, 0xe9, 0x87, 0x19, 0x0d, 0x2c, + 0x8c, 0xb6, 0x00, 0xd7, 0x24, 0x2a, 0xfc, 0x11, 0x34, 0x00, 0x5b, 0x53, 0x70, 0x9c, 0x1e, 0xd8, + 0xf2, 0xe2, 0xf0, 0xa1, 0xd0, 0x3d, 0x90, 0x9d, 0xbe, 0xc2, 0x0d, 0x70, 0xf4, 0xee, 0x30, 0xe0, + 0x88, 0x3f, 0x80, 0xfa, 0x26, 0x2d, 0x03, 0x98, 0xa3, 0x2d, 0x99, 0xab, 0x9c, 0xf9, 0xc9, 0x90, + 0xb9, 0xdd, 0x8e, 0xf0, 0xf6, 0xd9, 0x25, 0x8f, 0xb2, 0xc1, 0xb7, 0x6f, 0x94, 0x0d, 0xbd, 0x0d, + 0xc7, 0xe2, 0xc3, 0xfb, 0x75, 0x2c, 0x3e, 0xb2, 0xcb, 0x63, 0x71, 0xf5, 0x4d, 0x34, 0x38, 0x5e, + 0x9d, 0x0a, 0x46, 0xef, 0x69, 0x94, 0xab, 0x72, 0x4f, 0x85, 0x3c, 0xb3, 0x67, 0xda, 0xa6, 0xa1, + 0x51, 0x18, 0xbe, 0x84, 0xfa, 0x27, 0xc0, 0xfd, 0x8d, 0xdf, 0x22, 0xe6, 0xd9, 0xfa, 0xd7, 0x00, + 0x18, 0x78, 0xc1, 0xfa, 0x68, 0xfc, 0x08, 0xea, 0xab, 0x3a, 0xf6, 0xb2, 0xa3, 0xb7, 0xf8, 0x1a, + 0x0c, 0xae, 0x22, 0x6d, 0x06, 0xd2, 0x7c, 0x9c, 0xfa, 0x03, 0x19, 0xdf, 0x6c, 0xa7, 0x25, 0x6a, + 0x1d, 0x38, 0x9a, 0x87, 0xba, 0xfb, 0x59, 0x09, 0x97, 0x81, 0x34, 0x1f, 0x87, 0x2f, 0xa1, 0xde, + 0x49, 0xc7, 0xb1, 0x1d, 0xd1, 0xd9, 0x9c, 0x50, 0x80, 0x78, 0xdd, 0x0b, 0x14, 0xf8, 0x59, 0x34, + 0xc8, 0xe6, 0x1c, 0x76, 0xa2, 0x99, 0xeb, 0x76, 0x53, 0x2a, 0x52, 0xaa, 0x5f, 0xc9, 0x09, 0x36, + 0x1b, 0x93, 0xf8, 0x3d, 0x78, 0x2b, 0xf0, 0x14, 0xca, 0x8d, 0x57, 0xa7, 0xf8, 0x04, 0x78, 0xdc, + 0x2f, 0x2a, 0xa8, 0x4a, 0xa4, 0x1c, 0xa5, 0xc6, 0x67, 0x51, 0xbe, 0x4a, 0xd5, 0xa7, 0x00, 0xea, + 0xd1, 0xbf, 0xb9, 0x51, 0xcc, 0xb7, 0xa9, 0xfe, 0x00, 0x14, 0xb0, 0x74, 0x33, 0xc3, 0x76, 0x4c, + 0x0c, 0x1b, 0xee, 0x63, 0xce, 0xa2, 0x7c, 0xc9, 0x59, 0xbe, 0xc3, 0x67, 0x2d, 0xc0, 0xea, 0xce, + 0xf2, 0x1d, 0x0d, 0xa0, 0xf8, 0x0a, 0x42, 0x1a, 0xf1, 0x3a, 0x8e, 0x05, 0xef, 0x40, 0x06, 0xe0, + 0xfc, 0x0d, 0x66, 0x43, 0x07, 0xa0, 0xf5, 0x86, 0x6d, 0x10, 0x4d, 0x20, 0x51, 0x7f, 0x26, 0xbc, + 0xd8, 0x29, 0x9b, 0xee, 0xea, 0x51, 0x17, 0xee, 0xa0, 0x0b, 0x75, 0x7e, 0xc4, 0x19, 0xef, 0xa4, + 0x22, 0xea, 0x9d, 0x6a, 0xea, 0xcb, 0x2e, 0xf4, 0x21, 0xf7, 0x25, 0x5b, 0xa2, 0x00, 0x8d, 0xc1, + 0x23, 0xfd, 0xd4, 0xbf, 0x75, 0x3f, 0xfd, 0x70, 0x6f, 0x30, 0xda, 0xe6, 0x88, 0xb7, 0x66, 0x3b, + 0x47, 0x5d, 0xb5, 0xdd, 0xae, 0xba, 0x80, 0xfa, 0x6a, 0x4e, 0x43, 0x38, 0xba, 0x80, 0xfd, 0x80, + 0xeb, 0x34, 0xd8, 0xb1, 0x85, 0x8f, 0xa4, 0x74, 0x65, 0xd7, 0x03, 0xba, 0xbe, 0x90, 0xce, 0x70, + 0x3d, 0x4e, 0xc7, 0x91, 0x9c, 0xae, 0x6a, 0x3b, 0x1e, 0xef, 0xb8, 0x80, 0xae, 0x6d, 0x3b, 0x9e, + 0xe6, 0x23, 0xf1, 0x7b, 0x11, 0x5a, 0x98, 0xa8, 0xfa, 0xce, 0xf6, 0x03, 0xa1, 0x2f, 0x20, 0xf7, + 0xb2, 0xd7, 0x04, 0x34, 0x5e, 0x40, 0x03, 0xf3, 0x6d, 0xe2, 0xb0, 0xad, 0x10, 0x7b, 0xd9, 0xf1, + 0x9e, 0x88, 0x68, 0x79, 0xbf, 0x5f, 0xe6, 0xff, 0x07, 0xe4, 0x6c, 0x7d, 0xb1, 0xfd, 0x9f, 0x5a, + 0xc8, 0x08, 0x3f, 0x8b, 0x0a, 0x25, 0x66, 0xe7, 0x0d, 0x02, 0xcb, 0x40, 0x64, 0xb0, 0x05, 0x65, + 0x28, 0xb6, 0x67, 0xd7, 0xe1, 0x6f, 0x8d, 0x93, 0xab, 0x97, 0xd0, 0x68, 0xb4, 0x1a, 0x3c, 0x88, + 0xfa, 0x26, 0xe6, 0xe7, 0xe6, 0x26, 0x27, 0x16, 0x46, 0x7b, 0x70, 0x3f, 0xca, 0xd7, 0x26, 0xe7, + 0xca, 0xa3, 0x19, 0xf5, 0x17, 0x84, 0x19, 0x84, 0xaa, 0xd6, 0xd1, 0xd5, 0xf0, 0x9e, 0xee, 0x5b, + 0x46, 0xe1, 0x3e, 0x14, 0x4e, 0x0c, 0x5a, 0xa6, 0xe7, 0x11, 0x83, 0xaf, 0x12, 0x70, 0x5f, 0xe8, + 0xdd, 0xd5, 0x62, 0x78, 0xfc, 0x18, 0x1a, 0x06, 0x18, 0xbf, 0x22, 0x64, 0xfb, 0x63, 0x5e, 0xc0, + 0xb9, 0xab, 0xc9, 0x48, 0xf5, 0xab, 0xe1, 0xed, 0xf0, 0x0c, 0xd1, 0x0f, 0xeb, 0x8d, 0xe2, 0x3b, + 0xa4, 0xbf, 0xd4, 0xbf, 0xce, 0xb3, 0x27, 0x20, 0xec, 0xe1, 0xde, 0x41, 0x88, 0x32, 0x3c, 0xd2, + 0xcd, 0xed, 0xe0, 0x48, 0xf7, 0x31, 0x54, 0x98, 0x25, 0xde, 0x8a, 0xed, 0x3b, 0x7e, 0x81, 0x87, + 0x5e, 0x0b, 0x20, 0xa2, 0x87, 0x1e, 0xa3, 0xc1, 0xab, 0x08, 0xfb, 0xaf, 0xf2, 0x02, 0x47, 0x6c, + 0xff, 0x08, 0xf9, 0x54, 0x6c, 0x9f, 0x52, 0x83, 0x27, 0xb9, 0xe0, 0x63, 0x7f, 0x22, 0x70, 0xf4, + 0x16, 0x3c, 0xb1, 0xfe, 0x6a, 0xa3, 0x58, 0x60, 0x34, 0x5a, 0x02, 0x5b, 0xfc, 0x1a, 0x1a, 0x98, + 0x9d, 0x2a, 0xf1, 0x17, 0x7a, 0xcc, 0x2b, 0xe2, 0x74, 0x20, 0x45, 0x1f, 0x11, 0x88, 0x04, 0xde, + 0xdb, 0xb4, 0x96, 0xf4, 0xf8, 0x03, 0xbd, 0x90, 0x0b, 0xd5, 0x16, 0xf6, 0x72, 0x87, 0x9f, 0x2e, + 0x04, 0xda, 0x22, 0xbf, 0xe7, 0x89, 0xca, 0x8a, 0x61, 0x23, 0xda, 0xd2, 0xbf, 0x87, 0xd1, 0x3d, + 0x8f, 0xc6, 0x4a, 0xed, 0x76, 0xd3, 0x24, 0x06, 0xe8, 0x8b, 0xd6, 0x69, 0x12, 0x97, 0xbb, 0xfc, + 0xc0, 0x63, 0x10, 0x9d, 0x21, 0xeb, 0xf0, 0x2e, 0xb4, 0xee, 0x74, 0x64, 0xff, 0xcc, 0x78, 0x59, + 0xf5, 0x87, 0xb2, 0xe8, 0xe4, 0x84, 0x43, 0x74, 0x8f, 0xcc, 0x4e, 0x95, 0x4a, 0x1d, 0xf0, 0x91, + 0x6b, 0x36, 0x89, 0xb5, 0x7c, 0x30, 0xc3, 0xfa, 0x05, 0x34, 0x12, 0x34, 0xa0, 0xd6, 0xb0, 0xdb, + 0x44, 0x7c, 0x58, 0xd5, 0xf0, 0x31, 0x75, 0x97, 0xa2, 0xb4, 0x08, 0x29, 0xbe, 0x81, 0x8e, 0x07, + 0x90, 0x52, 0xb3, 0x69, 0xaf, 0x69, 0xa4, 0xe3, 0x32, 0xc7, 0xd8, 0x7e, 0xe6, 0x18, 0x1b, 0x72, + 0xd0, 0x29, 0xbe, 0xee, 0x50, 0x02, 0x2d, 0xa9, 0x94, 0xfa, 0xf9, 0x1c, 0x3a, 0x75, 0x4b, 0x6f, + 0x9a, 0x46, 0x28, 0x1a, 0x8d, 0xb8, 0x6d, 0xdb, 0x72, 0xc9, 0x21, 0x1a, 0xa5, 0xd2, 0x50, 0xc8, + 0xef, 0xcb, 0x50, 0x88, 0x77, 0x51, 0xef, 0x9e, 0xbb, 0xa8, 0xb0, 0xab, 0x2e, 0xfa, 0x8f, 0x19, + 0x34, 0xea, 0x3b, 0xfe, 0x8b, 0xaf, 0xa9, 0x05, 0xaf, 0x74, 0x38, 0x42, 0x8c, 0xf8, 0x41, 0x03, + 0x1e, 0xd7, 0x50, 0xdf, 0xe4, 0xdd, 0xb6, 0xe9, 0x10, 0x77, 0x1b, 0x4e, 0xdc, 0xe7, 0xf8, 0x71, + 0xc9, 0x18, 0x61, 0x45, 0x62, 0x27, 0x25, 0x0c, 0x0c, 0xcf, 0xf9, 0xd8, 0xd3, 0x87, 0x71, 0xff, + 0x89, 0x38, 0x7b, 0xce, 0xc7, 0x9f, 0x48, 0x48, 0xef, 0x33, 0x43, 0x52, 0xfc, 0x10, 0xca, 0x2d, + 0x2c, 0xcc, 0xf0, 0x99, 0x14, 0x9e, 0xe6, 0x7b, 0x9e, 0xf8, 0x5e, 0x91, 0x62, 0xd5, 0x3f, 0xc9, + 0x22, 0x44, 0x55, 0x81, 0x0d, 0xd7, 0x03, 0x51, 0xc2, 0x71, 0xd4, 0xef, 0x0b, 0x9c, 0xab, 0x61, + 0xe0, 0xb5, 0x1f, 0xed, 0x88, 0x68, 0xdd, 0xc1, 0x0b, 0x8d, 0xa2, 0xef, 0x48, 0xce, 0xee, 0x01, + 0x60, 0x67, 0x03, 0x8e, 0xe4, 0xbe, 0xfb, 0xf8, 0x7b, 0xd1, 0x00, 0x9f, 0xf1, 0x6c, 0xe9, 0xfc, + 0xbf, 0xe1, 0x03, 0xb5, 0x10, 0x1f, 0x99, 0x5a, 0x0b, 0x7b, 0x58, 0x88, 0x7d, 0xf1, 0xb2, 0x5e, + 0x39, 0x12, 0xef, 0x3e, 0x8b, 0xf7, 0x33, 0x5c, 0xbc, 0xec, 0x05, 0xcf, 0xa1, 0x15, 0xef, 0xbe, + 0x9d, 0x7d, 0xab, 0x7f, 0x98, 0x41, 0x98, 0x36, 0xab, 0xaa, 0xbb, 0xee, 0x9a, 0xed, 0x18, 0xcc, + 0x39, 0xfd, 0x40, 0x04, 0xb3, 0x7f, 0xf7, 0x95, 0x5f, 0xe9, 0x47, 0xc7, 0x25, 0xc7, 0xdf, 0x43, + 0x3e, 0x59, 0x5d, 0x92, 0x47, 0x53, 0xb7, 0x57, 0x2f, 0x0f, 0x8b, 0x17, 0xa2, 0xbd, 0xd2, 0x03, + 0x34, 0xe1, 0x26, 0xf4, 0x71, 0x34, 0xc4, 0x7f, 0xd0, 0x15, 0xda, 0xbf, 0xe9, 0x82, 0x51, 0xea, + 0x52, 0x80, 0x26, 0xa1, 0xf1, 0xd3, 0x68, 0x80, 0x0e, 0x98, 0x65, 0x88, 0xe2, 0xd1, 0x17, 0xbe, + 0x28, 0x31, 0x7c, 0xa0, 0xb8, 0x9e, 0x04, 0x94, 0xc2, 0x3b, 0xa2, 0xfe, 0x6d, 0xbc, 0x23, 0xfa, + 0x28, 0x1a, 0x2c, 0x59, 0x96, 0xed, 0xc1, 0x26, 0xdd, 0xe5, 0x57, 0x13, 0xa9, 0x56, 0xf9, 0x43, + 0xf0, 0x38, 0x3e, 0xa4, 0x4f, 0x34, 0xcb, 0x45, 0x86, 0xf8, 0xaa, 0xff, 0x2a, 0x86, 0x38, 0xdc, + 0xab, 0x1c, 0xae, 0x67, 0x1c, 0x0e, 0x8b, 0x3f, 0x8a, 0x81, 0xce, 0x1b, 0xae, 0x3a, 0x76, 0xdb, + 0x76, 0x89, 0xc1, 0x04, 0x35, 0x18, 0x86, 0x1a, 0x68, 0x73, 0x04, 0xbc, 0x63, 0x93, 0x22, 0x6a, + 0x48, 0x45, 0xf0, 0x12, 0x3a, 0xe1, 0x5f, 0x14, 0x07, 0x2f, 0x06, 0x2b, 0x65, 0x57, 0x19, 0x82, + 0x57, 0x49, 0x38, 0xaa, 0x0c, 0x95, 0xf2, 0xf8, 0x79, 0xff, 0x5a, 0xc4, 0x7f, 0x72, 0x58, 0x37, + 0x0d, 0xb1, 0xab, 0x13, 0xf9, 0xe1, 0x6f, 0x43, 0x83, 0xb3, 0xfa, 0xdd, 0x72, 0x87, 0x9f, 0xbd, + 0x0c, 0x6f, 0xff, 0xf6, 0xa5, 0xa5, 0xdf, 0xad, 0x1b, 0xbc, 0x5c, 0xc4, 0xa6, 0x10, 0x59, 0xe2, + 0x3a, 0x3a, 0x59, 0x75, 0xec, 0x96, 0xed, 0x11, 0x23, 0xf2, 0xf8, 0xee, 0x58, 0xf8, 0x5a, 0xb7, + 0xcd, 0x29, 0xea, 0x5d, 0x5e, 0xe1, 0xa5, 0xb0, 0xc1, 0x2d, 0x74, 0xac, 0xe4, 0xba, 0x9d, 0x16, + 0x09, 0x6f, 0xa8, 0x46, 0xb7, 0xfc, 0x8c, 0xf7, 0x70, 0xaf, 0xe5, 0xfb, 0x75, 0x28, 0xca, 0x2e, + 0xa8, 0xea, 0x9e, 0x29, 0xd6, 0x08, 0xdf, 0x12, 0xe5, 0xfd, 0x6a, 0xbe, 0x7f, 0x64, 0xf4, 0x98, + 0x76, 0x2a, 0xde, 0x98, 0x05, 0xd3, 0x6b, 0x12, 0xf5, 0xcb, 0x19, 0x84, 0x42, 0x01, 0xe3, 0xc7, + 0xe5, 0x50, 0x41, 0x99, 0xf0, 0xa2, 0x83, 0x47, 0x2f, 0x90, 0x62, 0x03, 0xe1, 0xb3, 0x28, 0x0f, + 0x11, 0x2e, 0xb2, 0xe1, 0xc1, 0xea, 0xaa, 0x69, 0x19, 0x1a, 0x40, 0x29, 0x56, 0x78, 0x8a, 0x0e, + 0x58, 0xb8, 0xd4, 0x67, 0x56, 0x61, 0x19, 0x1d, 0xab, 0x75, 0x16, 0xfd, 0xba, 0x85, 0x77, 0x75, + 0x10, 0x68, 0xc3, 0xed, 0x2c, 0x06, 0x8f, 0x51, 0xa5, 0x30, 0x26, 0x72, 0x11, 0xf5, 0x0b, 0x99, + 0xc8, 0x2c, 0x78, 0x80, 0x8b, 0xde, 0xc3, 0x71, 0x3f, 0x8d, 0xf8, 0xb4, 0xa4, 0x7e, 0x2d, 0x87, + 0x06, 0xab, 0xb6, 0xe3, 0xf1, 0x90, 0x21, 0x87, 0x7b, 0x15, 0x12, 0xf6, 0x4a, 0xf9, 0x1d, 0xec, + 0x95, 0xce, 0xa2, 0xbc, 0xe0, 0xa2, 0xcc, 0xee, 0x45, 0x0c, 0xc3, 0xd1, 0x00, 0xfa, 0x36, 0x3f, + 0xb9, 0x88, 0x5f, 0x82, 0xf6, 0xed, 0xd9, 0xd5, 0xe0, 0xdb, 0xb3, 0x08, 0x7d, 0xe0, 0xc9, 0x27, + 0xef, 0xe1, 0x2e, 0x55, 0x7f, 0x3c, 0x83, 0x8e, 0xf1, 0xab, 0x45, 0x21, 0x4c, 0x58, 0x9f, 0x7f, + 0x29, 0x2c, 0xce, 0x24, 0x0c, 0xa4, 0xf9, 0x38, 0xba, 0x68, 0x4d, 0xde, 0x35, 0x3d, 0xb8, 0x5d, + 0x11, 0xe2, 0x84, 0x11, 0x0e, 0x13, 0x17, 0x2d, 0x9f, 0x0e, 0x3f, 0xee, 0x5f, 0x9a, 0xe6, 0xc2, + 0x95, 0x9a, 0x16, 0x98, 0x4c, 0xbc, 0x38, 0x55, 0xbf, 0x98, 0x47, 0xf9, 0xc9, 0xbb, 0xa4, 0x71, + 0xc8, 0xbb, 0x46, 0x38, 0x8a, 0xcd, 0xef, 0xf1, 0x28, 0x76, 0x37, 0x5e, 0x20, 0x2f, 0x87, 0xfd, + 0x59, 0x90, 0xab, 0x8f, 0xf4, 0x7c, 0xb4, 0x7a, 0xbf, 0xa7, 0x0f, 0x9f, 0x13, 0xd1, 0x3f, 0xce, + 0xa1, 0x5c, 0x6d, 0xa2, 0x7a, 0xa4, 0x37, 0x07, 0xaa, 0x37, 0xdd, 0x6f, 0xd9, 0xd5, 0xe0, 0xe2, + 0xac, 0x3f, 0xf4, 0x6b, 0x8d, 0xdc, 0x91, 0x7d, 0x33, 0x87, 0x46, 0x6a, 0x53, 0x0b, 0x55, 0xe1, + 0xec, 0xfa, 0x06, 0xf3, 0x3d, 0x04, 0x2f, 0x38, 0xd6, 0xa5, 0x67, 0x63, 0x16, 0xd8, 0xcd, 0x8a, + 0xe5, 0x3d, 0x73, 0xed, 0x96, 0xde, 0xec, 0x10, 0x38, 0x2c, 0x62, 0x9e, 0xca, 0xae, 0xf9, 0x26, + 0xf9, 0x3c, 0x84, 0x2a, 0xf0, 0x19, 0xe0, 0x17, 0x50, 0xee, 0x26, 0xf7, 0x21, 0x49, 0xe3, 0xf3, + 0xd4, 0x55, 0xc6, 0x87, 0x4e, 0x82, 0xb9, 0x8e, 0x69, 0x00, 0x07, 0x5a, 0x8a, 0x16, 0xbe, 0xce, + 0x4d, 0x86, 0x6d, 0x15, 0x5e, 0xf6, 0x0b, 0x5f, 0xaf, 0x94, 0x71, 0x0d, 0x0d, 0x56, 0x89, 0xd3, + 0x32, 0xa1, 0xa3, 0xfc, 0x39, 0xbb, 0x3b, 0x13, 0xba, 0xb7, 0x1a, 0x6c, 0x87, 0x85, 0x80, 0x99, + 0xc8, 0x05, 0xbf, 0x8e, 0x10, 0xb3, 0xaa, 0xb6, 0x19, 0x7a, 0xf2, 0x1c, 0xec, 0x54, 0x98, 0x31, + 0x9c, 0x60, 0x95, 0x0a, 0xcc, 0xf0, 0x2a, 0x1a, 0x9d, 0xb5, 0x0d, 0x73, 0xc9, 0x64, 0xce, 0xa2, + 0x50, 0x41, 0x61, 0x6b, 0x17, 0x2d, 0x6a, 0xfc, 0xb6, 0x84, 0x72, 0x49, 0xd5, 0xc4, 0x18, 0xab, + 0xff, 0xa0, 0x17, 0xe5, 0x69, 0xb7, 0x1f, 0x8d, 0xdf, 0xbd, 0x8c, 0xdf, 0x12, 0x1a, 0xbd, 0x6d, + 0x3b, 0xab, 0xa6, 0xb5, 0x1c, 0xf8, 0xf1, 0xf3, 0xdd, 0x34, 0xf8, 0x1e, 0xad, 0x31, 0x5c, 0x3d, + 0x70, 0xf9, 0xd7, 0x62, 0xe4, 0x5b, 0x8c, 0xe0, 0xe7, 0x10, 0x62, 0xaf, 0xf3, 0x81, 0xa6, 0x3f, + 0x0c, 0xaf, 0xc1, 0xde, 0xee, 0xc3, 0xd3, 0x00, 0x31, 0xbc, 0x46, 0x48, 0x8c, 0x2f, 0xf9, 0xde, + 0x1b, 0x03, 0xf0, 0x52, 0x00, 0x8e, 0x0d, 0xc0, 0x7b, 0x43, 0x34, 0x02, 0x98, 0x1f, 0x47, 0x15, + 0x21, 0xe1, 0x46, 0x0c, 0x45, 0x04, 0x21, 0x4d, 0x0e, 0x3c, 0xa0, 0x5d, 0xc2, 0x85, 0x98, 0x26, + 0xf0, 0xc0, 0xcf, 0x44, 0xae, 0xec, 0xb1, 0xc4, 0x2d, 0xf5, 0xc6, 0x3e, 0x74, 0xf9, 0x1a, 0xda, + 0xca, 0xe5, 0x4b, 0xfd, 0xbd, 0x2c, 0x1a, 0xa8, 0x75, 0x16, 0xdd, 0x75, 0xd7, 0x23, 0xad, 0x43, + 0xae, 0xc6, 0xfe, 0x86, 0x30, 0x9f, 0xb8, 0x21, 0x7c, 0xc8, 0x17, 0x8a, 0x70, 0x52, 0x1a, 0x98, + 0x74, 0xbe, 0x07, 0x5c, 0xa8, 0xc8, 0x85, 0x9d, 0x2b, 0xb2, 0xfa, 0xab, 0x59, 0x34, 0xca, 0x2e, + 0x0a, 0xcb, 0xa6, 0xdb, 0xd8, 0x87, 0xc7, 0x0b, 0x07, 0x2f, 0xd3, 0xbd, 0x5d, 0xae, 0x6f, 0xe3, + 0x49, 0x88, 0xfa, 0xf1, 0x2c, 0x1a, 0x2c, 0x75, 0xbc, 0x95, 0x92, 0x07, 0x9a, 0x79, 0x4f, 0xee, + 0x6e, 0x7e, 0x37, 0x83, 0x8e, 0xd1, 0x86, 0x2c, 0xd8, 0xab, 0xc4, 0xda, 0x87, 0x83, 0x56, 0xf1, + 0xc0, 0x34, 0xbb, 0xcb, 0x03, 0x53, 0x5f, 0x96, 0xb9, 0x9d, 0xc9, 0x12, 0xae, 0x07, 0x34, 0xbb, + 0x49, 0x0e, 0xf7, 0x67, 0xec, 0xe3, 0xf5, 0x80, 0x2f, 0x90, 0x7d, 0xb8, 0x8e, 0x7a, 0x77, 0x09, + 0x64, 0x1f, 0xce, 0xd2, 0xde, 0x1d, 0x02, 0xf9, 0x4a, 0x06, 0x0d, 0x8c, 0xdb, 0xde, 0x21, 0x1f, + 0xf8, 0xfc, 0x2b, 0x0e, 0xb7, 0x9a, 0xfb, 0x5f, 0x71, 0xb8, 0x75, 0x53, 0xfd, 0x91, 0x2c, 0x3a, + 0xc1, 0x83, 0x92, 0xf3, 0xd3, 0x8b, 0xa3, 0xe9, 0x98, 0x0f, 0xb6, 0xb8, 0x68, 0x8e, 0xe6, 0x21, + 0x2e, 0x9a, 0x9f, 0xcd, 0xa1, 0x13, 0x10, 0xba, 0x95, 0x6e, 0xea, 0xde, 0x05, 0xb6, 0x08, 0x6e, + 0xc8, 0x97, 0xbe, 0xb3, 0x09, 0x97, 0xbe, 0x7f, 0xb5, 0x51, 0x7c, 0x66, 0xd9, 0xf4, 0x56, 0x3a, + 0x8b, 0x97, 0x1b, 0x76, 0xeb, 0xca, 0xb2, 0xa3, 0xdf, 0x31, 0xd9, 0x75, 0xa7, 0xde, 0xbc, 0x12, + 0xe4, 0xf7, 0xd0, 0xdb, 0x26, 0xcf, 0xfc, 0x51, 0x83, 0x9d, 0x12, 0xe5, 0xea, 0x5f, 0x17, 0xbb, + 0x08, 0xbd, 0x6a, 0x9b, 0x16, 0xf7, 0xa1, 0x64, 0x86, 0x6e, 0x8d, 0xee, 0x2e, 0xdf, 0xb0, 0x4d, + 0xab, 0x1e, 0x75, 0xa4, 0xdc, 0x69, 0x7d, 0x21, 0x6b, 0x4d, 0xa8, 0x46, 0xfd, 0xe7, 0x19, 0x74, + 0x5a, 0xd6, 0xe2, 0x77, 0x83, 0xed, 0xf8, 0xa3, 0x59, 0x74, 0xdf, 0x75, 0x10, 0x4e, 0xe0, 0xb8, + 0x72, 0x34, 0x6f, 0xf1, 0xc1, 0x99, 0x20, 0x9b, 0x23, 0x8b, 0x32, 0x5d, 0x36, 0x47, 0x93, 0x3a, + 0x97, 0xcd, 0x3f, 0xcb, 0xa0, 0xe3, 0xf3, 0x95, 0xf2, 0xc4, 0xbb, 0x64, 0x44, 0xc5, 0xbf, 0xe7, + 0x90, 0x1b, 0x9c, 0xb1, 0xef, 0x39, 0xe4, 0xa6, 0x27, 0xfd, 0x9e, 0x5a, 0x69, 0x76, 0xe6, 0xdd, + 0xa4, 0x6f, 0xd2, 0xf7, 0xbc, 0x0b, 0xf4, 0x4d, 0xfa, 0x9e, 0x43, 0xae, 0x6f, 0xff, 0xa8, 0x80, + 0x06, 0x6f, 0x74, 0x16, 0x09, 0x77, 0x81, 0xb9, 0xa7, 0xcf, 0x5b, 0xaf, 0xa2, 0x41, 0x2e, 0x06, + 0xb8, 0xe9, 0x10, 0x42, 0xf4, 0xf1, 0x90, 0x2b, 0x2c, 0x0a, 0x92, 0x48, 0x84, 0xcf, 0xa2, 0xfc, + 0x2d, 0xe2, 0x2c, 0x8a, 0xaf, 0x57, 0xef, 0x10, 0x67, 0x51, 0x03, 0x28, 0x9e, 0x09, 0x1d, 0xf3, + 0x4b, 0xd5, 0x0a, 0xa4, 0x6b, 0xe1, 0x97, 0x2c, 0x90, 0x7f, 0x26, 0xf0, 0xae, 0xd3, 0xdb, 0x26, + 0x4b, 0xf4, 0x22, 0xbe, 0x9c, 0x8f, 0x96, 0xc4, 0x73, 0x68, 0x4c, 0x74, 0xaf, 0x62, 0xb9, 0x4a, + 0xfa, 0x13, 0xd8, 0x25, 0x65, 0x29, 0x89, 0x17, 0xc5, 0x2f, 0xa3, 0x21, 0x1f, 0x08, 0x8e, 0x62, + 0x03, 0x61, 0x80, 0xfc, 0x80, 0x55, 0x24, 0x11, 0x92, 0x54, 0x40, 0x64, 0x00, 0x57, 0x07, 0x28, + 0x81, 0x41, 0xc4, 0xf1, 0x4e, 0x2a, 0x80, 0x9f, 0x06, 0x06, 0xf0, 0x98, 0x04, 0x1c, 0x4c, 0x06, + 0xe1, 0x69, 0x27, 0x38, 0xfe, 0x3b, 0x1c, 0xce, 0x1e, 0xf0, 0x4a, 0x64, 0x78, 0x1e, 0xa1, 0xd0, + 0x11, 0x80, 0x87, 0x49, 0xd8, 0xb1, 0x8b, 0x82, 0xc0, 0x42, 0xbc, 0xc2, 0x1b, 0xde, 0xcd, 0x15, + 0x9e, 0xfa, 0xb5, 0x2c, 0x1a, 0x2c, 0xb5, 0xdb, 0xc1, 0x50, 0x78, 0x1c, 0x15, 0x4a, 0xed, 0xf6, + 0x4d, 0xad, 0x22, 0x06, 0x4c, 0xd7, 0xdb, 0xed, 0x7a, 0xc7, 0x31, 0x45, 0xcf, 0x53, 0x46, 0x84, + 0x27, 0xd0, 0x70, 0xa9, 0xdd, 0xae, 0x76, 0x16, 0x9b, 0x66, 0x43, 0xc8, 0xbf, 0xc4, 0x52, 0xc5, + 0xb5, 0xdb, 0xf5, 0x36, 0x60, 0xa2, 0x49, 0xb8, 0xe4, 0x32, 0xf8, 0xa3, 0x10, 0x5c, 0x88, 0xa7, + 0xff, 0x61, 0x09, 0x46, 0xd4, 0x20, 0x54, 0x7a, 0xd8, 0xb6, 0xcb, 0x01, 0x11, 0x0b, 0x29, 0x7f, + 0xd6, 0x0f, 0xcc, 0x4f, 0x2b, 0x8a, 0xa5, 0xf9, 0x09, 0x59, 0xe2, 0x27, 0x50, 0x5f, 0xa9, 0xdd, + 0x16, 0xee, 0x88, 0xc0, 0x11, 0x88, 0x96, 0x8a, 0xf4, 0xb1, 0x4f, 0x76, 0xe6, 0x45, 0x34, 0x22, + 0x57, 0xb6, 0xa3, 0x90, 0xf4, 0xdf, 0xca, 0xc0, 0x07, 0x1d, 0x72, 0xcf, 0xe9, 0xa7, 0x50, 0xae, + 0xd4, 0x6e, 0xf3, 0xf9, 0xe8, 0x78, 0x42, 0x7f, 0x44, 0x1f, 0x5a, 0x97, 0xda, 0x6d, 0xff, 0xd3, + 0x0f, 0xf9, 0x13, 0x8c, 0x5d, 0x7d, 0xfa, 0x57, 0xd8, 0xa7, 0x1f, 0xee, 0xe7, 0x11, 0xea, 0x17, + 0x73, 0xe8, 0x58, 0xa9, 0xdd, 0x3e, 0x0a, 0x65, 0xbf, 0x5f, 0xcf, 0xb9, 0x9f, 0x44, 0x48, 0x98, + 0x1e, 0xfb, 0x82, 0x07, 0x62, 0x83, 0xc2, 0xd4, 0xa8, 0x64, 0x34, 0x81, 0xc8, 0x57, 0xbf, 0xfe, + 0x1d, 0xa9, 0xdf, 0xc7, 0x73, 0x30, 0x15, 0x1f, 0xf6, 0xd0, 0x54, 0xef, 0x94, 0x6e, 0xe3, 0x7d, + 0x50, 0xd8, 0x51, 0x1f, 0xfc, 0x8e, 0x34, 0x78, 0x20, 0x34, 0xfa, 0x51, 0x2f, 0xf4, 0xee, 0xc9, + 0x2c, 0x1e, 0x11, 0x85, 0xc9, 0xe3, 0xe5, 0xf8, 0xe9, 0x9a, 0x78, 0xf4, 0xa6, 0x06, 0x45, 0xd5, + 0x4d, 0x43, 0x8b, 0xd0, 0xfa, 0x7d, 0xd8, 0xb7, 0xa3, 0x3e, 0xdc, 0xc8, 0xc2, 0x0b, 0xed, 0x20, + 0xfa, 0xd3, 0xde, 0x77, 0x17, 0x57, 0x10, 0x62, 0xf7, 0xfd, 0x81, 0x2b, 0xf2, 0x30, 0x0b, 0xf4, + 0xc2, 0xb2, 0x38, 0xf1, 0x40, 0x2f, 0x21, 0x49, 0xe0, 0xd5, 0x94, 0x4b, 0xf4, 0x6a, 0xba, 0x84, + 0xfa, 0x35, 0x7d, 0xed, 0xb5, 0x0e, 0x71, 0xd6, 0xb9, 0x39, 0xc3, 0x82, 0x2b, 0xea, 0x6b, 0xf5, + 0x8f, 0x51, 0xa0, 0x16, 0xa0, 0xb1, 0x1a, 0x3c, 0xf1, 0x17, 0xfc, 0x30, 0xd8, 0xc9, 0x74, 0xf0, + 0xb0, 0x7f, 0x37, 0x8a, 0x8e, 0x9f, 0x47, 0xb9, 0xd2, 0xed, 0x1a, 0x97, 0x6c, 0xd0, 0xb5, 0xa5, + 0xdb, 0x35, 0x2e, 0xaf, 0xd4, 0xb2, 0xb7, 0x6b, 0xea, 0xc7, 0xb3, 0x08, 0xc7, 0x29, 0xf1, 0x33, + 0x68, 0x00, 0xa0, 0xcb, 0x54, 0x67, 0xc4, 0xf4, 0x9f, 0x6b, 0x6e, 0xdd, 0x01, 0xa8, 0x64, 0xdc, + 0xf9, 0xa4, 0xf8, 0x39, 0xc8, 0x74, 0xcc, 0x13, 0xd0, 0x49, 0xe9, 0x3f, 0xd7, 0x5c, 0x3f, 0x37, + 0x70, 0x24, 0xd1, 0x31, 0x27, 0x06, 0xbb, 0xf0, 0x76, 0x6d, 0xda, 0x76, 0x3d, 0x2e, 0x6a, 0x66, + 0x17, 0xae, 0xb9, 0x90, 0x77, 0x56, 0xb2, 0x0b, 0x19, 0x19, 0xe4, 0xce, 0xba, 0x5d, 0x63, 0x8f, + 0x61, 0x0c, 0xcd, 0x6e, 0xfa, 0x06, 0x25, 0xcb, 0x9d, 0xb5, 0xe6, 0xd6, 0xd9, 0x43, 0x1a, 0x03, + 0x52, 0x2c, 0x4b, 0xb9, 0xb3, 0xa4, 0x52, 0xea, 0xa7, 0xfb, 0xd1, 0x68, 0x59, 0xf7, 0xf4, 0x45, + 0xdd, 0x25, 0xc2, 0x6e, 0xfa, 0x98, 0x0f, 0xf3, 0x3f, 0x47, 0x90, 0x83, 0xb1, 0x98, 0xf0, 0x35, + 0xd1, 0x02, 0xf8, 0x85, 0x90, 0x6f, 0x90, 0xd9, 0x54, 0x4c, 0x95, 0xb6, 0x58, 0x6f, 0x73, 0xb0, + 0x16, 0x23, 0xc4, 0x8f, 0xa1, 0x41, 0x1f, 0x46, 0x37, 0x00, 0xb9, 0x50, 0x67, 0x8c, 0x45, 0x6a, + 0xff, 0x6b, 0x22, 0x1a, 0x3f, 0x87, 0x86, 0xfc, 0x9f, 0x82, 0x69, 0xcd, 0xf2, 0xbe, 0x2d, 0xc6, + 0x76, 0x4f, 0x22, 0xa9, 0x58, 0x14, 0xe6, 0xb7, 0x5e, 0xa9, 0x68, 0x24, 0xb5, 0x9a, 0x44, 0x8a, + 0x3f, 0x86, 0x46, 0xfc, 0xdf, 0x7c, 0xc3, 0xc0, 0xb2, 0xd0, 0x3d, 0x16, 0x64, 0x70, 0x8e, 0x88, + 0xf5, 0xb2, 0x4c, 0xce, 0xb6, 0x0e, 0xf7, 0xfb, 0xd9, 0xc2, 0x8c, 0xc5, 0xf8, 0xce, 0x21, 0x52, + 0x01, 0xae, 0xa0, 0x31, 0x1f, 0x12, 0x6a, 0x68, 0x5f, 0xb8, 0x63, 0x34, 0x16, 0xeb, 0x89, 0x4a, + 0x1a, 0x2f, 0x85, 0x9b, 0xe8, 0xac, 0x04, 0x34, 0xdc, 0x15, 0x73, 0xc9, 0xe3, 0xdb, 0x3d, 0x1e, + 0xe9, 0x98, 0xa7, 0x87, 0x0c, 0xb8, 0x32, 0x1a, 0x3f, 0xcf, 0xab, 0x9c, 0x83, 0xaa, 0x2b, 0x37, + 0x5c, 0x43, 0x27, 0x7c, 0xfc, 0xf5, 0x89, 0x6a, 0xd5, 0xb1, 0xdf, 0x20, 0x0d, 0xaf, 0x52, 0xe6, + 0xdb, 0x65, 0x88, 0x80, 0x67, 0x2c, 0xd6, 0x97, 0x1b, 0x6d, 0xaa, 0x14, 0x14, 0x27, 0x33, 0x4f, + 0x2c, 0x8c, 0x6f, 0xa1, 0xfb, 0x04, 0x78, 0xc5, 0x72, 0x3d, 0xdd, 0x6a, 0x90, 0x4a, 0x99, 0xef, + 0xa1, 0x61, 0x3f, 0xcf, 0xb9, 0x9a, 0x1c, 0x29, 0xb3, 0x4d, 0x2e, 0x8e, 0x5f, 0x44, 0xc3, 0x3e, + 0x82, 0xdd, 0xdd, 0x0d, 0xc2, 0xdd, 0x1d, 0x0c, 0x49, 0x63, 0xb1, 0x1e, 0x7d, 0xb3, 0x29, 0x13, + 0x8b, 0x1a, 0x05, 0x09, 0xf4, 0x87, 0x24, 0x8d, 0xf2, 0xd6, 0xdb, 0x89, 0xca, 0x08, 0x49, 0xf5, + 0x5f, 0x0e, 0x35, 0x6a, 0xde, 0x31, 0x97, 0x4d, 0xb6, 0x93, 0xf6, 0x9f, 0x69, 0x2e, 0xd6, 0x6d, + 0x00, 0x26, 0xe9, 0x07, 0x23, 0x3f, 0x53, 0x42, 0xc7, 0x13, 0x74, 0x6c, 0x47, 0x3b, 0xc6, 0x4f, + 0x65, 0xc3, 0x46, 0x1c, 0xf2, 0x6d, 0xe3, 0x38, 0xea, 0xf7, 0xbf, 0x84, 0x1b, 0x0f, 0x4a, 0xda, + 0xd0, 0x8c, 0xf2, 0xf0, 0xf1, 0x92, 0x38, 0x0e, 0xf9, 0x56, 0x72, 0x3f, 0xc4, 0xf1, 0x56, 0x26, + 0x14, 0xc7, 0x21, 0xdf, 0x5e, 0x7e, 0x5f, 0x3e, 0x9c, 0x93, 0x8e, 0xf6, 0x98, 0xfb, 0x65, 0x26, + 0x87, 0xde, 0xa7, 0x85, 0x1d, 0x3c, 0x97, 0x14, 0x55, 0xb3, 0x6f, 0x77, 0xaa, 0x89, 0x5f, 0x44, + 0x83, 0x55, 0xdb, 0xf5, 0x96, 0x1d, 0xe2, 0x56, 0x83, 0x48, 0xfd, 0xf0, 0xd4, 0xb6, 0xcd, 0xc1, + 0xf5, 0xb6, 0x34, 0xfb, 0x8b, 0xe4, 0xea, 0x1f, 0xe5, 0x62, 0xda, 0xc0, 0x0c, 0xd7, 0x43, 0xa9, + 0x0d, 0xfb, 0x30, 0xd4, 0xf1, 0xd5, 0x70, 0x15, 0x64, 0x16, 0x7e, 0xaf, 0x10, 0x86, 0x70, 0x91, + 0x1b, 0xf8, 0x32, 0x09, 0xfe, 0x10, 0x3a, 0x25, 0x01, 0xaa, 0xba, 0xa3, 0xb7, 0x88, 0x17, 0x66, + 0x45, 0x84, 0xc0, 0x52, 0x7e, 0xe9, 0x7a, 0x3b, 0x40, 0x8b, 0x99, 0x16, 0x53, 0x38, 0x08, 0xaa, + 0xd5, 0xb7, 0x03, 0xc7, 0xe6, 0x3f, 0xce, 0x23, 0x25, 0x30, 0x2f, 0x83, 0x07, 0x40, 0x07, 0x38, + 0x95, 0xbf, 0x23, 0x3a, 0xd7, 0x44, 0x63, 0xa1, 0x30, 0x6a, 0x9d, 0x56, 0x4b, 0x87, 0x0e, 0xa6, + 0xe6, 0x6b, 0x31, 0xca, 0x2c, 0x24, 0x64, 0x16, 0xeb, 0x19, 0x6e, 0xb1, 0xe2, 0xf0, 0x81, 0x55, + 0xdd, 0x65, 0x2c, 0xb4, 0x38, 0x57, 0xfc, 0x99, 0x0c, 0x3a, 0x51, 0x5a, 0x5a, 0x22, 0x0d, 0x8f, + 0x18, 0xf3, 0x8b, 0xd4, 0x74, 0x9b, 0xb0, 0x3b, 0x96, 0xe7, 0x5b, 0xcb, 0xcf, 0xa7, 0x57, 0xc7, + 0x3a, 0xe9, 0x72, 0x52, 0x61, 0xd6, 0x92, 0x20, 0xc4, 0x82, 0xce, 0x49, 0xea, 0x36, 0xd0, 0xd4, + 0x1b, 0x40, 0xa4, 0x25, 0xd6, 0x7b, 0xe6, 0x3a, 0x3a, 0x9d, 0xca, 0x72, 0x2b, 0x53, 0xa9, 0x57, + 0x34, 0x95, 0xfe, 0x65, 0x26, 0x54, 0xf7, 0x88, 0x90, 0xf0, 0x65, 0x84, 0x42, 0x10, 0xdf, 0x3c, + 0x8d, 0x6c, 0x6e, 0x14, 0x51, 0x28, 0x34, 0x4d, 0xa0, 0xc0, 0xf3, 0xa8, 0xc0, 0xc5, 0xc2, 0xf2, + 0xdc, 0xbe, 0x77, 0x8b, 0x5e, 0xb8, 0x2c, 0xca, 0x01, 0x36, 0x46, 0xfc, 0x9b, 0x39, 0x9b, 0x33, + 0xcf, 0xa1, 0xc1, 0xdd, 0x7e, 0xd7, 0x67, 0x72, 0x08, 0x8b, 0x3b, 0x9d, 0x03, 0x34, 0x03, 0xdf, + 0x11, 0x83, 0x65, 0x77, 0x79, 0x6a, 0x2e, 0xa2, 0x7e, 0xfa, 0x09, 0x90, 0xf9, 0x41, 0x88, 0xf4, + 0xda, 0xe1, 0x30, 0x2d, 0xc0, 0x86, 0x61, 0x96, 0xfa, 0x92, 0xc3, 0x2c, 0xa9, 0x3f, 0x98, 0x43, + 0x27, 0xc5, 0x0e, 0x29, 0x13, 0x08, 0x1e, 0x7f, 0xd4, 0x29, 0x6f, 0x63, 0xa7, 0xa8, 0xa8, 0xc0, + 0x0c, 0x5c, 0x1e, 0xc5, 0x9f, 0x1d, 0x3e, 0x00, 0x44, 0xe3, 0x18, 0xf5, 0xdf, 0x65, 0xd1, 0x70, + 0x60, 0x44, 0xe8, 0x8e, 0x7b, 0x0f, 0x77, 0xc7, 0xfb, 0xd0, 0x30, 0x04, 0xca, 0x69, 0x11, 0x8b, + 0x05, 0x93, 0xe9, 0x15, 0xd2, 0x6e, 0xf8, 0x08, 0x9e, 0x61, 0x49, 0x22, 0xa4, 0xda, 0xcf, 0xec, + 0x0b, 0x21, 0x7c, 0x11, 0x33, 0x2e, 0x18, 0x5c, 0xfd, 0xa9, 0x1c, 0x1a, 0xf2, 0xa5, 0x3c, 0x6e, + 0x1e, 0xd6, 0xdb, 0x84, 0x83, 0x15, 0xf2, 0x15, 0x84, 0xaa, 0xb6, 0xe3, 0xe9, 0xcd, 0xb9, 0x50, + 0xf3, 0xe1, 0x18, 0xae, 0x0d, 0x50, 0x56, 0x46, 0x20, 0x81, 0xf5, 0x2b, 0x34, 0xde, 0xd8, 0xc4, + 0xc4, 0xd6, 0xaf, 0x00, 0xaa, 0x09, 0x14, 0xea, 0x6f, 0x65, 0xd1, 0x31, 0xbf, 0x93, 0x26, 0xef, + 0x92, 0x46, 0xe7, 0x5e, 0x9e, 0x9b, 0x64, 0x69, 0xf7, 0x6e, 0x29, 0x6d, 0xf5, 0xbf, 0x08, 0x13, + 0xc9, 0x44, 0xd3, 0x3e, 0x9a, 0x48, 0xfe, 0x26, 0x74, 0x5c, 0xfd, 0xce, 0x1c, 0x3a, 0xe1, 0x4b, + 0x7d, 0xaa, 0x63, 0xc1, 0x06, 0x76, 0x42, 0x6f, 0x36, 0xef, 0xe5, 0x3d, 0xdf, 0xa0, 0x2f, 0x88, + 0x79, 0x1e, 0x79, 0x8e, 0x67, 0xbb, 0x5b, 0xe2, 0xe0, 0xba, 0x6d, 0x1a, 0x9a, 0x48, 0x84, 0x5f, + 0x46, 0x43, 0xfe, 0xcf, 0x92, 0xb3, 0xec, 0x6f, 0xf4, 0xe0, 0x38, 0x3a, 0x28, 0xa4, 0x3b, 0xd2, + 0x73, 0x75, 0xa9, 0x80, 0xfa, 0x1f, 0x0a, 0xe8, 0xcc, 0x6d, 0xd3, 0x32, 0xec, 0x35, 0xd7, 0x4f, + 0x96, 0x78, 0xe8, 0x8f, 0x63, 0x0e, 0x3a, 0x49, 0xe2, 0x6b, 0xe8, 0xbe, 0xa8, 0x48, 0x9d, 0x20, + 0x84, 0x35, 0xef, 0x9d, 0x35, 0x46, 0x50, 0xf7, 0xd3, 0x26, 0xf2, 0x3b, 0x1d, 0x2d, 0xb9, 0x64, + 0x34, 0xef, 0x62, 0xdf, 0x76, 0xf2, 0x2e, 0x3e, 0x8a, 0x0a, 0x65, 0xbb, 0xa5, 0x9b, 0x7e, 0xe0, + 0x12, 0x18, 0xc5, 0x41, 0xbd, 0x80, 0xd1, 0x38, 0x05, 0xe5, 0xcf, 0x2b, 0x86, 0x2e, 0x1b, 0x08, + 0xf9, 0xfb, 0x05, 0xa8, 0x95, 0xa6, 0x89, 0x44, 0xd8, 0x46, 0xc3, 0xbc, 0x3a, 0x7e, 0x03, 0x83, + 0x60, 0xf3, 0xf4, 0xb4, 0x2f, 0xa3, 0x74, 0xb5, 0xba, 0x2c, 0x95, 0x63, 0xdb, 0x28, 0x96, 0x0e, + 0x92, 0x7f, 0x0c, 0xbb, 0x8b, 0xd1, 0x64, 0xfe, 0x82, 0x10, 0x60, 0x92, 0x19, 0x8c, 0x0b, 0x01, + 0x66, 0x19, 0x91, 0x08, 0x4f, 0xa2, 0x31, 0x08, 0x34, 0x1c, 0x6c, 0xa5, 0xa8, 0x4a, 0x0c, 0x81, + 0x51, 0x09, 0x07, 0xfb, 0x2c, 0x36, 0x31, 0xfd, 0xb8, 0x7a, 0x83, 0xa3, 0xb5, 0x78, 0x89, 0x33, + 0xaf, 0x20, 0x1c, 0x6f, 0xf3, 0x8e, 0x8e, 0xf6, 0x3f, 0x9d, 0x0d, 0xf7, 0x75, 0x87, 0xdd, 0x39, + 0x63, 0x3f, 0x0e, 0xb3, 0x7f, 0x29, 0x83, 0xc6, 0x62, 0x81, 0xab, 0xf1, 0x53, 0x08, 0x31, 0x88, + 0x10, 0x20, 0x10, 0xe2, 0x57, 0x84, 0xc1, 0xac, 0xf9, 0x52, 0x12, 0x92, 0xe1, 0x2b, 0xa8, 0x9f, + 0xfd, 0xe2, 0x21, 0x72, 0xe2, 0x45, 0x3a, 0x1d, 0xd3, 0xd0, 0x02, 0xa2, 0xb0, 0x16, 0xb8, 0x23, + 0xca, 0x25, 0x16, 0xf1, 0xd6, 0xdb, 0x41, 0x2d, 0x94, 0x8c, 0x76, 0xe0, 0x50, 0xd0, 0xe0, 0x92, + 0x71, 0x50, 0x5d, 0x57, 0xe0, 0x31, 0xc0, 0x73, 0x5b, 0xc5, 0x00, 0x8f, 0xcc, 0x4d, 0x3c, 0xe8, + 0xf7, 0xfe, 0x3d, 0x2c, 0xf9, 0x6c, 0x16, 0x1d, 0x0b, 0x6a, 0x3d, 0xc0, 0xeb, 0x88, 0x77, 0x90, + 0x48, 0x3e, 0x93, 0x41, 0xca, 0xb8, 0xd9, 0x6c, 0x9a, 0xd6, 0x72, 0xc5, 0x5a, 0xb2, 0x9d, 0x16, + 0x4c, 0x1e, 0x07, 0x77, 0xdc, 0xa9, 0x7e, 0x4f, 0x06, 0x8d, 0xf1, 0x06, 0x4d, 0xe8, 0x8e, 0x71, + 0x70, 0x67, 0x49, 0xd1, 0x96, 0x1c, 0x9c, 0xbe, 0xa8, 0x5f, 0xca, 0x22, 0x34, 0x63, 0x37, 0x56, + 0x0f, 0xf9, 0xcb, 0xc2, 0x17, 0x50, 0x81, 0xc5, 0x29, 0xe2, 0x1a, 0x3b, 0x76, 0x99, 0x3d, 0x18, + 0xa5, 0x9f, 0xc6, 0x10, 0xe3, 0xa3, 0xfc, 0x84, 0xb6, 0xc0, 0xe2, 0x1c, 0x29, 0x19, 0x8d, 0x17, + 0xa1, 0x95, 0x52, 0x3a, 0x6e, 0xd5, 0x04, 0x95, 0x52, 0x98, 0x5c, 0xe9, 0xe6, 0x46, 0x31, 0xdf, + 0xb4, 0x1b, 0xab, 0x1a, 0xd0, 0xab, 0x7f, 0x9d, 0x61, 0xb2, 0x3b, 0xe4, 0xaf, 0xeb, 0xfc, 0xcf, + 0xcf, 0xef, 0xf0, 0xf3, 0xbf, 0x37, 0x83, 0x4e, 0x68, 0xa4, 0x61, 0xdf, 0x21, 0xce, 0xfa, 0x84, + 0x6d, 0x90, 0xeb, 0xc4, 0x22, 0xce, 0x41, 0x8d, 0xa8, 0xbf, 0x0f, 0x49, 0x13, 0xc2, 0xc6, 0xdc, + 0x74, 0x89, 0x71, 0x78, 0x12, 0x5a, 0xa8, 0xbf, 0xd6, 0x87, 0x94, 0x44, 0x0b, 0xf1, 0xd0, 0x5a, + 0x45, 0xa9, 0x66, 0x7f, 0x7e, 0xbf, 0xcc, 0xfe, 0xde, 0x9d, 0x99, 0xfd, 0x85, 0x9d, 0x9a, 0xfd, + 0x7d, 0xdb, 0x31, 0xfb, 0x5b, 0x51, 0xb3, 0xbf, 0x1f, 0xcc, 0xfe, 0xa7, 0xba, 0x9a, 0xfd, 0x93, + 0x96, 0xb1, 0x4b, 0xa3, 0xff, 0xd0, 0x26, 0x5b, 0xdd, 0xcd, 0x6e, 0xe5, 0x22, 0x9d, 0x14, 0x1b, + 0xb6, 0x63, 0x10, 0x83, 0x6f, 0x52, 0xe0, 0x84, 0xdc, 0xe1, 0x30, 0x2d, 0xc0, 0xc6, 0x32, 0xd7, + 0x0e, 0x6f, 0x27, 0x73, 0xed, 0x3e, 0x6c, 0x63, 0x3e, 0x95, 0x45, 0x63, 0x13, 0xc4, 0xf1, 0x58, + 0x20, 0xc4, 0xfd, 0x70, 0x52, 0x2a, 0xa1, 0x63, 0x02, 0x43, 0xb0, 0xc8, 0xb3, 0xa1, 0xe3, 0x55, + 0x83, 0x38, 0x5e, 0xd4, 0x6f, 0x2b, 0x4a, 0x4f, 0xab, 0xf7, 0xb3, 0x47, 0xf1, 0xb1, 0x1b, 0x54, + 0xef, 0xc3, 0x99, 0x20, 0x4d, 0xfe, 0x4b, 0x0b, 0xe8, 0x85, 0x84, 0x50, 0xf9, 0x9d, 0x27, 0x84, + 0x52, 0x7f, 0x21, 0x83, 0x2e, 0x68, 0xc4, 0x22, 0x6b, 0xfa, 0x62, 0x93, 0x08, 0xcd, 0xe2, 0x2b, + 0x03, 0x9d, 0x35, 0x4c, 0xb7, 0xa5, 0x7b, 0x8d, 0x95, 0x3d, 0xc9, 0x68, 0x0a, 0x0d, 0x89, 0xf3, + 0xd7, 0x0e, 0xe6, 0x36, 0xa9, 0x9c, 0xfa, 0x9b, 0x39, 0xd4, 0x37, 0x6e, 0x7b, 0xaf, 0xda, 0x7b, + 0xcc, 0x50, 0x16, 0x4e, 0xf9, 0xd9, 0x1d, 0x9c, 0x8b, 0x3c, 0x01, 0x95, 0x0b, 0x41, 0xdb, 0xc1, + 0xa9, 0x6f, 0xd1, 0x8e, 0x05, 0xb7, 0xf7, 0xc9, 0x76, 0x98, 0x9b, 0xec, 0x19, 0x34, 0x00, 0x51, + 0x30, 0x84, 0x93, 0x4b, 0x70, 0x99, 0xf5, 0x28, 0x30, 0x5a, 0x47, 0x48, 0x8a, 0x3f, 0x24, 0x45, + 0x6e, 0x2c, 0xec, 0x3d, 0x97, 0x99, 0x18, 0xc4, 0x71, 0xdf, 0x52, 0x86, 0xa9, 0xdf, 0xcc, 0xa3, + 0x21, 0xdf, 0x51, 0xf2, 0x80, 0x7a, 0xf0, 0x71, 0x54, 0x98, 0xb6, 0x85, 0x00, 0xf4, 0xe0, 0x58, + 0xb9, 0x62, 0xbb, 0x11, 0x8f, 0x51, 0x4e, 0x84, 0x9f, 0x42, 0xfd, 0x73, 0xb6, 0x21, 0xba, 0x05, + 0xc3, 0x98, 0xb6, 0x6c, 0x23, 0xf6, 0xac, 0x32, 0x20, 0xc4, 0x17, 0x50, 0x1e, 0x3c, 0xaa, 0x85, + 0xa3, 0xe7, 0x88, 0x17, 0x35, 0xe0, 0x05, 0xdd, 0x28, 0xec, 0x54, 0x37, 0xfa, 0x76, 0xab, 0x1b, + 0xfd, 0xfb, 0xab, 0x1b, 0xaf, 0xa3, 0x21, 0xa8, 0xc9, 0xcf, 0x5f, 0xb5, 0xf5, 0xf2, 0x76, 0x9a, + 0xaf, 0x40, 0xc3, 0xac, 0xdd, 0x3c, 0x8b, 0x15, 0x2c, 0x3c, 0x12, 0xab, 0x88, 0xda, 0xa1, 0x3d, + 0xa8, 0xdd, 0x1f, 0x65, 0x50, 0xdf, 0x4d, 0x6b, 0xd5, 0xb2, 0xd7, 0xf6, 0xa6, 0x71, 0x4f, 0xa1, + 0x41, 0xce, 0x46, 0x98, 0xe3, 0xe1, 0xa5, 0x6c, 0x87, 0x81, 0xeb, 0xc0, 0x49, 0x13, 0xa9, 0xf0, + 0x8b, 0x41, 0x21, 0x78, 0x34, 0x91, 0x0b, 0x53, 0x38, 0xf8, 0x85, 0x1a, 0x72, 0x0c, 0x77, 0x91, + 0x1c, 0x9f, 0x45, 0xf9, 0x32, 0x6d, 0xaa, 0x10, 0x11, 0x94, 0x36, 0x45, 0x03, 0xa8, 0xfa, 0x4f, + 0xb3, 0x68, 0x24, 0x72, 0xfc, 0xf4, 0x28, 0x1a, 0xe0, 0xc7, 0x3f, 0xa6, 0x1f, 0x54, 0x1e, 0x1e, + 0x55, 0x04, 0x40, 0xad, 0x9f, 0xfd, 0x59, 0x31, 0xf0, 0xfb, 0x51, 0x9f, 0xed, 0xc2, 0xd2, 0x04, + 0xdf, 0x32, 0x12, 0x0e, 0xa1, 0xf9, 0x1a, 0x6d, 0x3b, 0x1b, 0x1c, 0x9c, 0x44, 0xd4, 0x48, 0xdb, + 0x85, 0x4f, 0xbb, 0x86, 0x06, 0x74, 0xd7, 0x25, 0x5e, 0xdd, 0xd3, 0x97, 0xc5, 0x38, 0xf3, 0x01, + 0x50, 0x1c, 0x1d, 0x00, 0x5c, 0xd0, 0x97, 0xf1, 0x2b, 0x68, 0xb8, 0xe1, 0x10, 0x58, 0xbc, 0xf4, + 0x26, 0x6d, 0xa5, 0x60, 0x5c, 0x4a, 0x08, 0xf1, 0xc4, 0x3f, 0x44, 0x54, 0x0c, 0x7c, 0x0b, 0x0d, + 0xf3, 0xcf, 0x61, 0x1e, 0xcd, 0x30, 0xd0, 0x46, 0xc2, 0xc5, 0x84, 0x89, 0x84, 0xf9, 0x34, 0x73, + 0xc7, 0x76, 0x91, 0x5c, 0xe4, 0x6b, 0x08, 0xa4, 0xea, 0x57, 0x33, 0xd4, 0xe0, 0xa1, 0x00, 0xc8, + 0x28, 0x4b, 0x75, 0xa5, 0xb5, 0x43, 0x5d, 0x69, 0x85, 0xb9, 0xdf, 0x0a, 0x6e, 0x97, 0xd9, 0x49, + 0xe3, 0x58, 0x7c, 0x19, 0x15, 0x0c, 0xf1, 0xec, 0xe7, 0xa4, 0xfc, 0x11, 0x7e, 0x3d, 0x1a, 0xa7, + 0xc2, 0x17, 0x51, 0x9e, 0x1a, 0xb4, 0xd1, 0x8d, 0x9f, 0xb8, 0x46, 0x6a, 0x40, 0xa1, 0x7e, 0x7b, + 0x16, 0x0d, 0x09, 0x5f, 0x73, 0x75, 0x4f, 0x9f, 0xf3, 0xfc, 0xf6, 0x9a, 0xe9, 0xbb, 0x39, 0xc0, + 0x8e, 0xc0, 0x6f, 0xf2, 0xb5, 0x40, 0x14, 0xdb, 0xba, 0x82, 0xe0, 0x82, 0x79, 0x86, 0x7f, 0x68, + 0x61, 0xfb, 0x9b, 0x20, 0x4a, 0xff, 0x6a, 0xbe, 0x3f, 0x3b, 0x9a, 0x7b, 0x35, 0xdf, 0x9f, 0x1f, + 0xed, 0x85, 0xa8, 0x3a, 0x10, 0xc8, 0x96, 0xed, 0x30, 0xad, 0x25, 0x73, 0xf9, 0x90, 0xfb, 0xa4, + 0xef, 0x6f, 0xc4, 0xa1, 0x88, 0x6c, 0x0e, 0xb9, 0x83, 0xfa, 0xdb, 0x2a, 0x9b, 0xa3, 0x5c, 0x71, + 0x5c, 0x36, 0x7f, 0x9c, 0x41, 0x4a, 0xa2, 0x6c, 0x4a, 0x07, 0x74, 0xf3, 0xbd, 0x7f, 0x19, 0xe3, + 0xbe, 0x91, 0x45, 0x63, 0x15, 0xcb, 0x23, 0xcb, 0x6c, 0xdf, 0x73, 0xc8, 0xa7, 0x8a, 0x1b, 0x68, + 0x50, 0xf8, 0x18, 0xde, 0xe7, 0xf7, 0x07, 0xbb, 0xca, 0x10, 0x95, 0xc2, 0x49, 0x2c, 0xbd, 0x8f, + 0x49, 0xa6, 0x23, 0x42, 0x3e, 0xe4, 0x73, 0xce, 0xe1, 0x10, 0xf2, 0x21, 0x9f, 0xbc, 0xde, 0xa1, + 0x42, 0xfe, 0x4f, 0x19, 0x74, 0x3c, 0xa1, 0x72, 0x7c, 0x01, 0xf5, 0xd5, 0x3a, 0x8b, 0x10, 0xce, + 0x27, 0x13, 0xfa, 0x88, 0xba, 0x9d, 0x45, 0x88, 0xe4, 0xa3, 0xf9, 0x48, 0xbc, 0x00, 0x8f, 0x76, + 0xe7, 0x2b, 0xe5, 0x09, 0x2e, 0x55, 0x55, 0x78, 0x7e, 0x4c, 0xc1, 0x49, 0x5f, 0x16, 0x3c, 0xec, + 0xb5, 0x4d, 0xa3, 0x11, 0x79, 0xd8, 0x4b, 0xcb, 0xe0, 0x0f, 0xa3, 0x81, 0xd2, 0x9b, 0x1d, 0x87, + 0x00, 0x5f, 0x26, 0xf1, 0x87, 0x03, 0xbe, 0x3e, 0x22, 0x89, 0x33, 0x7b, 0xa3, 0x4c, 0x29, 0xa2, + 0xbc, 0x43, 0x86, 0xea, 0xa7, 0x33, 0xe8, 0x4c, 0x7a, 0xeb, 0xf0, 0x13, 0xa8, 0x8f, 0xee, 0x6c, + 0x4b, 0xda, 0x1c, 0xff, 0x74, 0x96, 0x5d, 0xd1, 0x6e, 0x92, 0xba, 0xee, 0x88, 0x86, 0xb7, 0x4f, + 0x86, 0x5f, 0x42, 0x83, 0x15, 0xd7, 0xed, 0x10, 0xa7, 0xf6, 0xd4, 0x4d, 0xad, 0xc2, 0xf7, 0x54, + 0x60, 0xb3, 0x9b, 0x00, 0xae, 0xbb, 0x4f, 0x45, 0x02, 0xf6, 0x88, 0xf4, 0xea, 0x27, 0x32, 0xe8, + 0x6c, 0xb7, 0xaf, 0xa2, 0x1b, 0xf8, 0x05, 0x62, 0xe9, 0x16, 0xdd, 0xf1, 0x67, 0xc2, 0x2d, 0x8a, + 0x07, 0x30, 0x79, 0x93, 0x11, 0x10, 0xd2, 0x42, 0xec, 0x74, 0x2c, 0xb8, 0x8e, 0x67, 0x27, 0x79, + 0x00, 0x8b, 0x14, 0xf2, 0x09, 0xd5, 0xdf, 0xcf, 0xa2, 0xa1, 0x6a, 0xb3, 0xb3, 0x6c, 0x0a, 0x0b, + 0xc7, 0xae, 0xed, 0x6d, 0xdf, 0xfa, 0xcd, 0xee, 0xcc, 0xfa, 0xa5, 0xc3, 0xcd, 0xd9, 0xe5, 0x70, + 0xf3, 0xcb, 0xe1, 0x17, 0x51, 0xa1, 0x0d, 0xdf, 0x11, 0x3d, 0x4f, 0x64, 0x5f, 0x97, 0x76, 0x9e, + 0xc8, 0xca, 0xd0, 0xf1, 0xd5, 0xd8, 0xc3, 0xf8, 0x0a, 0xcb, 0x0a, 0x02, 0x0d, 0x17, 0x89, 0x23, + 0x81, 0xee, 0x8b, 0x40, 0xc3, 0x05, 0xe1, 0x48, 0xa0, 0x7b, 0x10, 0xe8, 0xaf, 0x65, 0xd1, 0x88, + 0x5c, 0x25, 0x7e, 0x02, 0x0d, 0xb2, 0x6a, 0xd8, 0xb9, 0x4a, 0x46, 0x70, 0x23, 0x0d, 0xc1, 0x1a, + 0x62, 0x3f, 0xf8, 0x01, 0xd1, 0xb1, 0x15, 0xdd, 0xad, 0x87, 0x27, 0x1c, 0xec, 0x16, 0xb2, 0x9f, + 0xf9, 0xf3, 0x44, 0x50, 0xda, 0xc8, 0x8a, 0xee, 0x4e, 0x84, 0xbf, 0xf1, 0x24, 0xc2, 0x90, 0x96, + 0x5e, 0x66, 0x90, 0x07, 0x06, 0x3c, 0xb5, 0x6d, 0x14, 0xab, 0x8d, 0x31, 0x98, 0xc8, 0xe6, 0x23, + 0x41, 0xb3, 0x41, 0x19, 0x7a, 0xb7, 0x91, 0x77, 0x57, 0xa0, 0x4f, 0x3e, 0x26, 0x64, 0x04, 0x65, + 0xdd, 0xd3, 0xd9, 0xa6, 0xdc, 0xef, 0x00, 0xf5, 0xcf, 0x4d, 0xd4, 0x3b, 0x6f, 0x91, 0xf9, 0x25, + 0xfc, 0x24, 0x1a, 0xa0, 0x0a, 0x33, 0x63, 0xd3, 0xbe, 0xcc, 0x70, 0x2f, 0x00, 0x41, 0x93, 0x00, + 0x31, 0xdd, 0xa3, 0x85, 0x54, 0xf8, 0x9a, 0x98, 0x79, 0x9e, 0x6b, 0x1f, 0x16, 0xcb, 0x30, 0xcc, + 0x74, 0x8f, 0x26, 0x66, 0xa8, 0xbf, 0x26, 0x66, 0xfc, 0xe6, 0x7a, 0x27, 0x95, 0x62, 0x18, 0xbf, + 0x14, 0x1f, 0x1f, 0x33, 0x49, 0x69, 0xb1, 0xa3, 0xbb, 0xa7, 0x38, 0xc5, 0x74, 0x8f, 0x96, 0x9c, + 0x4e, 0x7b, 0x48, 0x74, 0x21, 0x8c, 0xba, 0x2e, 0x88, 0xb8, 0xe9, 0x1e, 0x4d, 0xa2, 0xc5, 0xcf, + 0xa2, 0x41, 0xfe, 0xfb, 0x55, 0xdb, 0xb4, 0xa2, 0x31, 0x4e, 0x04, 0xd4, 0x74, 0x8f, 0x26, 0x52, + 0x0a, 0x95, 0x56, 0x1d, 0xd3, 0xf2, 0xf8, 0xdb, 0xc7, 0x68, 0xa5, 0x80, 0x13, 0x2a, 0x85, 0xdf, + 0xf8, 0x25, 0x34, 0x1c, 0x04, 0x8f, 0x79, 0x83, 0x34, 0x3c, 0x7e, 0x78, 0x7c, 0x5f, 0xa4, 0x30, + 0x43, 0x4e, 0xf7, 0x68, 0x32, 0x35, 0xbe, 0x88, 0x0a, 0x1a, 0x71, 0xcd, 0x37, 0xfd, 0x4b, 0xcf, + 0x11, 0x61, 0x9c, 0x9b, 0x6f, 0x52, 0x29, 0x71, 0x3c, 0xed, 0x9d, 0xf0, 0x96, 0x95, 0x1f, 0xf5, + 0xe2, 0x48, 0x2d, 0x93, 0x96, 0x41, 0x7b, 0x47, 0xb8, 0x62, 0x7f, 0x25, 0x0c, 0xa9, 0xc3, 0x93, + 0xe7, 0x0d, 0x46, 0xdf, 0x2e, 0x8b, 0xd8, 0xe9, 0x1e, 0x2d, 0x42, 0x2f, 0x48, 0xb5, 0x6c, 0xba, + 0xab, 0x3c, 0x8a, 0x61, 0x54, 0xaa, 0x14, 0x25, 0x48, 0x95, 0xfe, 0x14, 0xaa, 0x9e, 0x23, 0xde, + 0x9a, 0xed, 0xac, 0xf2, 0x98, 0x85, 0xd1, 0xaa, 0x39, 0x56, 0xa8, 0x9a, 0x43, 0xc4, 0xaa, 0xe9, + 0x80, 0x1b, 0x49, 0xae, 0x5a, 0xf7, 0x74, 0xb1, 0x6a, 0x76, 0x12, 0xe7, 0x77, 0xd2, 0x0c, 0xd1, + 0xef, 0xb0, 0xac, 0xcb, 0xf1, 0x0e, 0x05, 0x9c, 0xd0, 0xa1, 0xf0, 0x9b, 0x56, 0x2a, 0x64, 0xd6, + 0xe5, 0x69, 0x95, 0x83, 0x4a, 0x05, 0x14, 0xad, 0x54, 0xcc, 0xc1, 0x7b, 0x4d, 0x4c, 0xdf, 0xaa, + 0x8c, 0xc9, 0x1d, 0x14, 0x62, 0x68, 0x07, 0x09, 0x69, 0x5e, 0x8b, 0x90, 0x1a, 0x52, 0xc1, 0x40, + 0x3e, 0x18, 0xb4, 0x70, 0xa2, 0x3a, 0xdd, 0xa3, 0x41, 0xd2, 0x48, 0x95, 0x25, 0x1d, 0x55, 0x8e, + 0x03, 0xc5, 0x90, 0x4f, 0x41, 0x61, 0xd3, 0x3d, 0x1a, 0x4b, 0x48, 0xfa, 0xa4, 0x90, 0xde, 0x4b, + 0x39, 0x21, 0x4f, 0x11, 0x01, 0x82, 0x4e, 0x11, 0x61, 0x12, 0xb0, 0xa9, 0x78, 0x12, 0x2b, 0xe5, + 0x3e, 0x79, 0xa9, 0x89, 0xe2, 0xa7, 0x7b, 0xb4, 0x78, 0xe2, 0xab, 0x67, 0xa5, 0xbc, 0x4e, 0xca, + 0xc9, 0x48, 0x60, 0xa1, 0x10, 0x45, 0xc5, 0x25, 0x66, 0x80, 0x9a, 0x4f, 0xcc, 0x3c, 0xaf, 0x9c, + 0x92, 0x37, 0x2e, 0x09, 0x24, 0xd3, 0x3d, 0x5a, 0x62, 0xce, 0xfa, 0x89, 0x58, 0x76, 0x25, 0x45, + 0x91, 0x3d, 0x3c, 0x22, 0xe8, 0xe9, 0x1e, 0x2d, 0x96, 0x8f, 0xe9, 0x9a, 0x98, 0xd6, 0x48, 0x39, + 0x2d, 0x77, 0x62, 0x88, 0xa1, 0x9d, 0x28, 0xa4, 0x3f, 0xba, 0x26, 0xa6, 0xba, 0x51, 0xce, 0xc4, + 0x4b, 0x85, 0x33, 0xa7, 0x90, 0x12, 0x47, 0x4b, 0xce, 0xde, 0xa1, 0xdc, 0xcf, 0xb3, 0x2f, 0xf2, + 0xf2, 0x49, 0x34, 0xd3, 0x3d, 0x5a, 0x72, 0xe6, 0x0f, 0x2d, 0x39, 0xed, 0x85, 0x72, 0xb6, 0x1b, + 0xcf, 0xa0, 0x75, 0xc9, 0x29, 0x33, 0xf4, 0x2e, 0x49, 0x08, 0x94, 0x73, 0x72, 0x54, 0xd3, 0x54, + 0xc2, 0xe9, 0x1e, 0xad, 0x4b, 0x2a, 0x83, 0x9b, 0x29, 0x19, 0x01, 0x94, 0xf3, 0x72, 0xf2, 0xd5, + 0x44, 0xa2, 0xe9, 0x1e, 0x2d, 0x25, 0x9f, 0xc0, 0xcd, 0x94, 0x80, 0xf1, 0x4a, 0xb1, 0x2b, 0xdb, + 0x40, 0x1e, 0x29, 0xe1, 0xe6, 0xe7, 0x13, 0x63, 0xad, 0x2b, 0x0f, 0xc8, 0xaa, 0x9b, 0x40, 0x42, + 0x55, 0x37, 0x29, 0x4a, 0xfb, 0x7c, 0x62, 0x70, 0x70, 0xe5, 0xc1, 0x2e, 0x0c, 0x83, 0x36, 0x26, + 0x86, 0x15, 0x9f, 0x4f, 0x8c, 0xce, 0xad, 0xa8, 0x32, 0xc3, 0x04, 0x12, 0xca, 0x30, 0x29, 0xae, + 0xf7, 0x7c, 0x62, 0x38, 0x69, 0xe5, 0xa1, 0x2e, 0x0c, 0xc3, 0x16, 0x26, 0x05, 0xa2, 0x7e, 0x56, + 0x8a, 0xe7, 0xac, 0x3c, 0x2c, 0xcf, 0x1b, 0x02, 0x8a, 0xce, 0x1b, 0x62, 0xe4, 0xe7, 0x89, 0x58, + 0xc4, 0x4a, 0xe5, 0x11, 0x79, 0x98, 0x47, 0xd0, 0x74, 0x98, 0x47, 0x63, 0x5c, 0x4e, 0xc4, 0x22, + 0xf7, 0x29, 0x17, 0xd2, 0x98, 0x00, 0x5a, 0x66, 0xc2, 0x62, 0xfd, 0x55, 0x12, 0x42, 0xc7, 0x29, + 0xef, 0x91, 0xbd, 0x93, 0x63, 0x04, 0xd3, 0x3d, 0x5a, 0x42, 0xc0, 0x39, 0x2d, 0x39, 0x4e, 0x8a, + 0x72, 0x51, 0x1e, 0xb6, 0x49, 0x34, 0x74, 0xd8, 0x26, 0xc6, 0x58, 0x99, 0x49, 0x7a, 0x89, 0xa0, + 0x5c, 0x92, 0x0d, 0xb3, 0x38, 0x05, 0x35, 0xcc, 0x12, 0x5e, 0x30, 0x68, 0xc9, 0xb1, 0x3b, 0x94, + 0x47, 0xbb, 0xb6, 0x10, 0x68, 0x12, 0x5a, 0xc8, 0x42, 0x59, 0x84, 0xb6, 0xd3, 0xcd, 0x76, 0xd3, + 0xd6, 0x0d, 0xe5, 0xbd, 0x89, 0xb6, 0x13, 0x43, 0x0a, 0xb6, 0x13, 0x03, 0xd0, 0x55, 0x5e, 0xf4, + 0xd4, 0x57, 0x1e, 0x93, 0x57, 0x79, 0x11, 0x47, 0x57, 0x79, 0xc9, 0xab, 0x7f, 0x22, 0xe6, 0xd5, + 0xae, 0x3c, 0x2e, 0x2b, 0x40, 0x04, 0x4d, 0x15, 0x20, 0xea, 0x07, 0xff, 0xd1, 0x74, 0x3f, 0x70, + 0xe5, 0x32, 0x70, 0x7b, 0xc0, 0xe7, 0x96, 0x46, 0x37, 0xdd, 0xa3, 0xa5, 0xfb, 0x92, 0x57, 0x12, + 0xdc, 0xba, 0x95, 0x2b, 0xb2, 0x82, 0xc5, 0x08, 0xa8, 0x82, 0xc5, 0x9d, 0xc1, 0x2b, 0x09, 0x7e, + 0xd9, 0xca, 0x13, 0xa9, 0xac, 0x82, 0x6f, 0x4e, 0xf0, 0xe6, 0xbe, 0x26, 0x3a, 0x56, 0x2b, 0x4f, + 0xca, 0x8b, 0x5d, 0x88, 0xa1, 0x8b, 0x9d, 0xe0, 0x80, 0x7d, 0x4d, 0x74, 0x29, 0x56, 0xae, 0xc6, + 0x4b, 0x85, 0x4b, 0xa4, 0xe0, 0x7a, 0xac, 0x25, 0x7b, 0xe2, 0x2a, 0x4f, 0xc9, 0x5a, 0x97, 0x44, + 0x43, 0xb5, 0x2e, 0xd1, 0x8b, 0x77, 0x2a, 0xee, 0x50, 0xab, 0x5c, 0x8b, 0x6e, 0xb2, 0x65, 0x3c, + 0xb5, 0x7c, 0x62, 0x4e, 0xb8, 0xaf, 0x44, 0x83, 0x78, 0x29, 0x4f, 0x47, 0xae, 0x7d, 0x25, 0x2c, + 0xb5, 0x6f, 0x23, 0x41, 0xbf, 0x5e, 0x89, 0xc6, 0xbd, 0x52, 0x9e, 0x49, 0xe6, 0x10, 0xe8, 0x4a, + 0x34, 0x4e, 0xd6, 0x2b, 0xd1, 0x50, 0x51, 0xca, 0xb3, 0xc9, 0x1c, 0x02, 0xe9, 0x46, 0x43, 0x4b, + 0x3d, 0x29, 0x04, 0xaf, 0x56, 0xde, 0x27, 0x9b, 0x8e, 0x01, 0x82, 0x9a, 0x8e, 0x61, 0x88, 0xeb, + 0x27, 0x85, 0xa0, 0xcf, 0xca, 0x73, 0xb1, 0x22, 0x41, 0x63, 0x85, 0xd0, 0xd0, 0x4f, 0x0a, 0xc1, + 0x92, 0x95, 0xe7, 0x63, 0x45, 0x82, 0xd6, 0x09, 0x21, 0x95, 0x8d, 0x6e, 0x2f, 0x16, 0x95, 0x17, + 0xe4, 0xc3, 0xe0, 0x74, 0xca, 0xe9, 0x1e, 0xad, 0xdb, 0xcb, 0xc7, 0x8f, 0xa6, 0xbb, 0x27, 0x2b, + 0x2f, 0xca, 0x43, 0x38, 0x8d, 0x8e, 0x0e, 0xe1, 0x54, 0x17, 0xe7, 0x97, 0x22, 0xd1, 0x0b, 0x94, + 0x97, 0xe4, 0x29, 0x4e, 0x42, 0xd2, 0x29, 0x2e, 0x1a, 0xeb, 0x40, 0x7a, 0x96, 0xaf, 0xbc, 0x5f, + 0x9e, 0xe2, 0x44, 0x1c, 0x9d, 0xe2, 0xa4, 0x27, 0xfc, 0x13, 0xb1, 0xd7, 0xe2, 0xca, 0xcb, 0xf2, + 0x14, 0x17, 0x41, 0xd3, 0x29, 0x2e, 0xfa, 0xbe, 0xfc, 0xa5, 0xc8, 0xa3, 0x69, 0xe5, 0x95, 0xe4, + 0xf6, 0x03, 0x52, 0x6c, 0x3f, 0x7b, 0x62, 0xad, 0x25, 0xbf, 0xfe, 0x55, 0x4a, 0xf2, 0xf8, 0x4d, + 0xa2, 0xa1, 0xe3, 0x37, 0xf1, 0xe5, 0x70, 0x74, 0xe3, 0xc0, 0xb5, 0x6a, 0xbc, 0xcb, 0xc6, 0x21, + 0x34, 0x45, 0x12, 0xc0, 0xd2, 0x1e, 0x99, 0x6d, 0x84, 0x26, 0x52, 0xf6, 0xc8, 0xfe, 0x36, 0x28, + 0x42, 0x4f, 0x67, 0xd7, 0x98, 0xb7, 0xac, 0x52, 0x96, 0x67, 0xd7, 0x18, 0x01, 0x9d, 0x5d, 0xe3, + 0x3e, 0xb6, 0x53, 0x68, 0x94, 0x6b, 0x11, 0x73, 0x02, 0x36, 0xad, 0x65, 0x65, 0x32, 0xf2, 0xf8, + 0x2e, 0x82, 0xa7, 0xb3, 0x53, 0x14, 0x06, 0xeb, 0x35, 0x83, 0x4d, 0x34, 0xcd, 0xf6, 0xa2, 0xad, + 0x3b, 0x46, 0x8d, 0x58, 0x86, 0x32, 0x15, 0x59, 0xaf, 0x13, 0x68, 0x60, 0xbd, 0x4e, 0x80, 0x43, + 0xe8, 0xa9, 0x08, 0x5c, 0x23, 0x0d, 0x62, 0xde, 0x21, 0xca, 0x75, 0x60, 0x5b, 0x4c, 0x63, 0xcb, + 0xc9, 0xa6, 0x7b, 0xb4, 0x34, 0x0e, 0xd4, 0x56, 0x9f, 0x5d, 0xaf, 0xbd, 0x36, 0x13, 0x3c, 0x38, + 0xaf, 0x3a, 0xa4, 0xad, 0x3b, 0x44, 0x99, 0x96, 0x6d, 0xf5, 0x44, 0x22, 0x6a, 0xab, 0x27, 0x22, + 0xe2, 0x6c, 0xfd, 0xb1, 0x50, 0xe9, 0xc6, 0x36, 0x1c, 0x11, 0xc9, 0xa5, 0xe9, 0xec, 0x24, 0x23, + 0xa8, 0x80, 0x66, 0x6c, 0x6b, 0x19, 0x4e, 0x2a, 0x5e, 0x95, 0x67, 0xa7, 0x74, 0x4a, 0x3a, 0x3b, + 0xa5, 0x63, 0xa9, 0xaa, 0xcb, 0x58, 0x36, 0x06, 0x6f, 0xc8, 0xaa, 0x9e, 0x40, 0x42, 0x55, 0x3d, + 0x01, 0x1c, 0x67, 0xa8, 0x11, 0x97, 0x78, 0xca, 0x4c, 0x37, 0x86, 0x40, 0x12, 0x67, 0x08, 0xe0, + 0x38, 0xc3, 0x29, 0xe2, 0x35, 0x56, 0x94, 0xd9, 0x6e, 0x0c, 0x81, 0x24, 0xce, 0x10, 0xc0, 0x74, + 0xb3, 0x29, 0x83, 0xc7, 0x3b, 0xcd, 0x55, 0xbf, 0xcf, 0xe6, 0xe4, 0xcd, 0x66, 0x2a, 0x21, 0xdd, + 0x6c, 0xa6, 0x22, 0xf1, 0x27, 0xb6, 0xed, 0xcd, 0xad, 0xcc, 0x43, 0x85, 0x97, 0x43, 0xbb, 0x60, + 0x3b, 0xa5, 0xa6, 0x7b, 0xb4, 0xed, 0x7a, 0x8b, 0xbf, 0x37, 0x70, 0xba, 0x54, 0xaa, 0x50, 0xd5, 0xb1, 0xe0, 0xac, 0x82, 0x81, 0xa7, 0x7b, 0xb4, 0xc0, 0x2d, 0xf3, 0x59, 0x34, 0x08, 0x1f, 0x55, 0xb1, 0x4c, 0xaf, 0x3c, 0xae, 0xbc, 0x26, 0x6f, 0x99, 0x04, 0x14, 0xdd, 0x32, 0x09, 0x3f, 0xe9, 0x24, 0x0e, 0x3f, 0xd9, 0x14, 0x53, 0x1e, 0x57, 0x34, 0x79, 0x12, 0x97, 0x90, 0x74, 0x12, 0x97, @@ -15001,391 +15013,391 @@ var fileDescriptor_007ba1c3d6266d56 = []byte{ 0x3d, 0x94, 0xb8, 0x54, 0xc9, 0xa4, 0xd3, 0x3d, 0x5a, 0x37, 0x4e, 0xb0, 0x2d, 0x7f, 0x6d, 0x86, 0x45, 0x98, 0xd4, 0xaa, 0x13, 0xfe, 0x26, 0xf4, 0xf5, 0xc8, 0xb6, 0x3c, 0x4e, 0x02, 0xdb, 0xf2, 0x38, 0x18, 0xb7, 0xd1, 0xf9, 0xc8, 0x56, 0x6d, 0x56, 0x6f, 0xd2, 0x7d, 0x09, 0x31, 0xaa, 0x7a, - 0xe3, 0x0e, 0xf1, 0x94, 0x0f, 0x02, 0xef, 0x0b, 0x29, 0x1b, 0xbe, 0x08, 0xf5, 0x74, 0x8f, 0xb6, - 0x09, 0x3f, 0xac, 0xa2, 0x7c, 0x6d, 0x6a, 0xa1, 0xaa, 0x7c, 0x48, 0x3e, 0xdf, 0xa4, 0xb0, 0xe9, - 0x1e, 0x0d, 0x70, 0xd4, 0x4a, 0xbb, 0xd9, 0x5e, 0x76, 0x74, 0x83, 0x30, 0x43, 0x0b, 0x6c, 0x37, - 0x6e, 0x80, 0x7e, 0x58, 0xb6, 0xd2, 0xd2, 0xe8, 0xa8, 0x95, 0x96, 0x86, 0xa3, 0x8a, 0x2a, 0x25, - 0x53, 0x50, 0x3e, 0x22, 0x2b, 0xaa, 0x84, 0xa4, 0x8a, 0x2a, 0xa7, 0x5e, 0xf8, 0x00, 0x3a, 0x19, - 0xec, 0xe7, 0xf9, 0xfa, 0xcb, 0x3a, 0x4d, 0xf9, 0x28, 0xf0, 0x39, 0x1f, 0xbb, 0x0c, 0x90, 0xa8, - 0xa6, 0x7b, 0xb4, 0x94, 0xf2, 0x74, 0xc5, 0x8d, 0xe5, 0x09, 0xe2, 0xe6, 0xc5, 0xb7, 0xc8, 0x2b, - 0x6e, 0x0a, 0x19, 0x5d, 0x71, 0x53, 0x50, 0x89, 0xcc, 0xb9, 0x50, 0xf5, 0x4d, 0x98, 0x07, 0x32, - 0x4d, 0xe3, 0x90, 0xc8, 0x9c, 0x5b, 0x6a, 0x8b, 0x9b, 0x30, 0x0f, 0xac, 0xb5, 0x34, 0x0e, 0xf8, - 0x22, 0x2a, 0xd4, 0x6a, 0xb3, 0x5a, 0xc7, 0x52, 0x1a, 0x11, 0x6f, 0x59, 0x80, 0x4e, 0xf7, 0x68, - 0x1c, 0x4f, 0xcd, 0xa0, 0xc9, 0xa6, 0xee, 0x7a, 0x66, 0xc3, 0x85, 0x11, 0xe3, 0x8f, 0x10, 0x43, - 0x36, 0x83, 0x92, 0x68, 0xa8, 0x19, 0x94, 0x04, 0xa7, 0xf6, 0xe2, 0x84, 0xee, 0xba, 0xba, 0x65, - 0x38, 0xfa, 0x38, 0x2c, 0x13, 0x24, 0xf2, 0xa6, 0x48, 0xc2, 0x52, 0x7b, 0x51, 0x86, 0xc0, 0xe1, - 0xbb, 0x0f, 0xf1, 0xcd, 0x9c, 0xa5, 0xc8, 0xe1, 0x7b, 0x04, 0x0f, 0x87, 0xef, 0x11, 0x18, 0xd8, - 0x9d, 0x3e, 0x4c, 0x23, 0xcb, 0x26, 0x15, 0x91, 0xb2, 0x1c, 0xb1, 0x3b, 0xa3, 0x04, 0x60, 0x77, - 0x46, 0x81, 0x52, 0x93, 0xfc, 0xe5, 0x76, 0x25, 0xa5, 0x49, 0xe1, 0x2a, 0x1b, 0x2b, 0x43, 0xd7, - 0xef, 0x70, 0x70, 0x94, 0xd7, 0x2c, 0xbd, 0x65, 0x97, 0xc7, 0x7d, 0xa9, 0x9b, 0xf2, 0xfa, 0x9d, - 0x4a, 0x48, 0xd7, 0xef, 0x54, 0x24, 0x9d, 0x5d, 0xfd, 0x8d, 0xd6, 0x8a, 0xee, 0x10, 0xa3, 0x6c, - 0x3a, 0x70, 0xb2, 0xb8, 0xc6, 0xb6, 0x86, 0x6f, 0xc8, 0xb3, 0x6b, 0x17, 0x52, 0x3a, 0xbb, 0x76, - 0x41, 0x53, 0x23, 0x2f, 0x19, 0xad, 0x11, 0xdd, 0x50, 0xee, 0xc8, 0x46, 0x5e, 0x3a, 0x25, 0x35, - 0xf2, 0xd2, 0xb1, 0xe9, 0x9f, 0x73, 0xdb, 0x31, 0x3d, 0xa2, 0x34, 0xb7, 0xf2, 0x39, 0x40, 0x9a, - 0xfe, 0x39, 0x80, 0xa6, 0x1b, 0xc2, 0x68, 0x87, 0xb4, 0xe4, 0x0d, 0x61, 0xbc, 0x1b, 0xa2, 0x25, - 0xa8, 0xc5, 0xc2, 0x9f, 0x96, 0x29, 0x96, 0x6c, 0xb1, 0x70, 0x30, 0xb5, 0x58, 0xc2, 0xc7, 0x67, - 0xd2, 0x53, 0x26, 0xc5, 0x96, 0xd7, 0x50, 0x11, 0x47, 0xd7, 0x50, 0xe9, 0xd9, 0xd3, 0xb3, 0xd2, - 0x3b, 0x03, 0xa5, 0x2d, 0x5b, 0x1d, 0x02, 0x8a, 0x5a, 0x1d, 0xe2, 0x8b, 0x84, 0x09, 0x74, 0x0c, - 0x6e, 0xc1, 0xb5, 0x4e, 0x70, 0x8f, 0xf3, 0x31, 0xf9, 0x33, 0x23, 0x68, 0xfa, 0x99, 0x11, 0x90, - 0xc4, 0x84, 0x4f, 0x5b, 0x4e, 0x0a, 0x93, 0xf0, 0x7c, 0x30, 0x02, 0xc2, 0x33, 0x08, 0xd7, 0x4a, - 0xb3, 0x33, 0x15, 0xa3, 0x2a, 0x5e, 0x91, 0xb9, 0xf2, 0x09, 0x6c, 0x9c, 0x62, 0xba, 0x47, 0x4b, - 0x28, 0x87, 0xdf, 0x40, 0x67, 0x39, 0x94, 0xbf, 0x1b, 0x86, 0x24, 0xde, 0x46, 0xb0, 0x20, 0x78, - 0xb2, 0x1f, 0x5b, 0x37, 0xda, 0xe9, 0x1e, 0xad, 0x2b, 0xaf, 0xf4, 0xba, 0xf8, 0xfa, 0xd0, 0xd9, - 0x4a, 0x5d, 0xc1, 0x22, 0xd1, 0x95, 0x57, 0x7a, 0x5d, 0x5c, 0xee, 0x77, 0xb7, 0x52, 0x57, 0xd0, - 0x09, 0x5d, 0x79, 0x61, 0x17, 0x15, 0xbb, 0xe1, 0x4b, 0xcd, 0xa6, 0xb2, 0x0a, 0xd5, 0xbd, 0x67, - 0x2b, 0xd5, 0x95, 0xc0, 0xe0, 0xdc, 0x8c, 0x23, 0x9d, 0xa5, 0xe7, 0xdb, 0xc4, 0xaa, 0x49, 0x0b, - 0xd0, 0x3d, 0x79, 0x96, 0x8e, 0x11, 0xd0, 0x59, 0x3a, 0x06, 0xa4, 0x03, 0x4a, 0x7c, 0xae, 0xa2, - 0xac, 0xc9, 0x03, 0x4a, 0xc4, 0xd1, 0x01, 0x25, 0x3d, 0x6d, 0x99, 0x47, 0xc7, 0xe7, 0xef, 0x78, - 0xba, 0x6f, 0x41, 0xba, 0xbc, 0x2b, 0xdf, 0x8c, 0x5c, 0x32, 0xc5, 0x49, 0xe0, 0x92, 0x29, 0x0e, - 0xa6, 0x63, 0x84, 0x82, 0x6b, 0x6b, 0x56, 0x63, 0x4a, 0x37, 0x9b, 0x1d, 0x87, 0x28, 0xff, 0x97, - 0x3c, 0x46, 0x22, 0x68, 0x3a, 0x46, 0x22, 0x20, 0xba, 0x40, 0x53, 0x50, 0xc9, 0x75, 0xcd, 0x65, - 0x8b, 0xef, 0x2b, 0x3b, 0x4d, 0x4f, 0xf9, 0xbf, 0xe5, 0x05, 0x3a, 0x89, 0x86, 0x2e, 0xd0, 0x49, - 0x70, 0x38, 0x75, 0x4a, 0x48, 0x70, 0xaf, 0xfc, 0x3f, 0x91, 0x53, 0xa7, 0x04, 0x1a, 0x38, 0x75, - 0x4a, 0x4a, 0x8e, 0x3f, 0x85, 0x46, 0x99, 0x4d, 0x36, 0x63, 0x06, 0x77, 0xd5, 0xff, 0xaf, 0xbc, - 0x3e, 0x46, 0xf1, 0x74, 0x7d, 0x8c, 0xc2, 0x64, 0x3e, 0xbc, 0x0b, 0xfe, 0xbf, 0x34, 0x3e, 0x81, - 0xfc, 0x63, 0x65, 0xf0, 0x75, 0x91, 0x0f, 0x1f, 0x29, 0xdf, 0x9a, 0x49, 0x63, 0x14, 0x0c, 0x8f, - 0x58, 0x21, 0x99, 0x91, 0x46, 0xee, 0x9a, 0x64, 0x55, 0xf9, 0x78, 0x2a, 0x23, 0x46, 0x20, 0x33, - 0x62, 0x30, 0xfc, 0x3a, 0x3a, 0x19, 0xc2, 0x66, 0x49, 0x6b, 0x31, 0x98, 0x99, 0xbe, 0x2d, 0x23, - 0x9b, 0xc1, 0xc9, 0x64, 0xd4, 0x0c, 0x4e, 0xc6, 0x24, 0xb1, 0xe6, 0xa2, 0xfb, 0xff, 0x37, 0x61, - 0x1d, 0x48, 0x30, 0x85, 0x41, 0x12, 0x6b, 0x2e, 0xcd, 0x6f, 0xdf, 0x84, 0x75, 0x20, 0xd3, 0x14, - 0x06, 0xf8, 0x93, 0x19, 0x74, 0x21, 0x19, 0x55, 0x6a, 0x36, 0xa7, 0x6c, 0x27, 0xc4, 0x29, 0xdf, - 0x91, 0x91, 0x0f, 0x1a, 0xb6, 0x56, 0x6c, 0xba, 0x47, 0xdb, 0x62, 0x05, 0xf8, 0xfd, 0x68, 0xb8, - 0xd4, 0x31, 0x4c, 0x0f, 0x2e, 0xde, 0xa8, 0xe1, 0xfc, 0x9d, 0x99, 0xc8, 0x16, 0x47, 0xc4, 0xc2, - 0x16, 0x47, 0x04, 0xe0, 0x57, 0xd1, 0x58, 0x8d, 0x34, 0x3a, 0x8e, 0xe9, 0xad, 0x69, 0xa4, 0x6d, - 0x3b, 0x1e, 0xe5, 0xf1, 0x5d, 0x19, 0x79, 0x12, 0x8b, 0x51, 0xd0, 0x49, 0x2c, 0x06, 0xc4, 0xb7, - 0x52, 0x52, 0xdc, 0x2b, 0x9f, 0xc8, 0x74, 0xbd, 0x96, 0x0f, 0xfa, 0x32, 0x25, 0x43, 0x7e, 0x35, - 0x31, 0x65, 0xb8, 0xf2, 0xc9, 0x4c, 0x97, 0x6b, 0x74, 0x61, 0x86, 0x4b, 0xc8, 0x36, 0x5e, 0x4d, - 0x4c, 0x0a, 0xad, 0x7c, 0x77, 0xa6, 0xcb, 0xb5, 0x77, 0xc8, 0x31, 0x29, 0x9f, 0xf4, 0xd3, 0xcc, - 0x53, 0x84, 0x33, 0xfa, 0x9e, 0x4c, 0xdc, 0x55, 0x24, 0x28, 0x2f, 0x10, 0xd2, 0x62, 0x37, 0xdd, - 0x40, 0xe9, 0x3f, 0x95, 0x89, 0xfb, 0xe6, 0x85, 0xc5, 0xc2, 0x5f, 0x98, 0xa0, 0x33, 0x93, 0xf7, - 0x3c, 0xe2, 0x58, 0x7a, 0x13, 0xba, 0xb3, 0xe6, 0xd9, 0x8e, 0xbe, 0x4c, 0x26, 0x2d, 0x7d, 0xb1, - 0x49, 0x94, 0x4f, 0x67, 0x64, 0x0b, 0x36, 0x9d, 0x94, 0x5a, 0xb0, 0xe9, 0x58, 0xbc, 0x82, 0xee, - 0x4f, 0xc2, 0x96, 0x4d, 0x17, 0xea, 0xf9, 0x4c, 0x46, 0x36, 0x61, 0xbb, 0xd0, 0x52, 0x13, 0xb6, - 0x0b, 0x1a, 0x5f, 0x45, 0x03, 0xe3, 0xb6, 0x3f, 0xfd, 0x7e, 0x6f, 0xc4, 0x19, 0x32, 0xc0, 0x4c, - 0xf7, 0x68, 0x21, 0x19, 0x2f, 0xc3, 0x07, 0xf5, 0x67, 0xe3, 0x65, 0xc2, 0xcb, 0xa7, 0xe0, 0x07, - 0x2f, 0xc3, 0xc5, 0xfd, 0x37, 0xe2, 0x65, 0xc2, 0x3b, 0xae, 0xe0, 0x07, 0x9d, 0x49, 0x58, 0x8d, - 0xb3, 0x53, 0x25, 0x6a, 0xb7, 0x4d, 0xac, 0xe8, 0xcd, 0x26, 0xb1, 0x96, 0x89, 0xf2, 0xb9, 0xc8, - 0x4c, 0x92, 0x4c, 0x46, 0x67, 0x92, 0x64, 0x0c, 0xfe, 0x30, 0x3a, 0x75, 0x4b, 0x6f, 0x9a, 0x46, - 0x88, 0xf3, 0xf3, 0x0c, 0x2b, 0xdf, 0x97, 0x91, 0x77, 0xd3, 0x29, 0x74, 0x74, 0x37, 0x9d, 0x82, - 0xc2, 0xb3, 0x08, 0xc3, 0x32, 0x1a, 0xcc, 0x16, 0x74, 0x7d, 0x56, 0xfe, 0x66, 0x46, 0xb6, 0x53, - 0xe3, 0x24, 0xd4, 0x4e, 0x8d, 0x43, 0x71, 0x3d, 0x3d, 0x19, 0x84, 0xf2, 0xfd, 0x19, 0xf9, 0xb4, - 0x26, 0x8d, 0x70, 0xba, 0x47, 0x4b, 0xcf, 0x28, 0x71, 0x1d, 0x8d, 0xd6, 0xaa, 0x95, 0xa9, 0xa9, - 0xc9, 0xda, 0xad, 0x4a, 0x19, 0x1e, 0x3a, 0x18, 0xca, 0x0f, 0x44, 0x56, 0xac, 0x28, 0x01, 0x5d, - 0xb1, 0xa2, 0x30, 0x5c, 0x43, 0x27, 0xa8, 0x20, 0xaa, 0x0e, 0x59, 0x22, 0x0e, 0xb1, 0x1a, 0xfe, - 0xb0, 0xfc, 0xa1, 0x8c, 0x6c, 0x28, 0x24, 0x11, 0x51, 0x43, 0x21, 0x09, 0x8e, 0xef, 0xa0, 0xb3, - 0xd1, 0xc3, 0x1c, 0xf1, 0xe5, 0xa8, 0xf2, 0xc3, 0x99, 0x88, 0x3d, 0xdb, 0x85, 0x18, 0xec, 0xd9, - 0x2e, 0x78, 0x6c, 0xa1, 0x73, 0xfc, 0x64, 0x84, 0xfb, 0x4c, 0x46, 0x6b, 0xfb, 0x11, 0x56, 0xdb, - 0x23, 0xa1, 0x4f, 0x5f, 0x17, 0xea, 0xe9, 0x1e, 0xad, 0x3b, 0x3b, 0xaa, 0x2a, 0xf1, 0xac, 0x05, - 0xca, 0x8f, 0x66, 0x92, 0x9d, 0x4a, 0x24, 0x4f, 0xe3, 0xa4, 0x74, 0x07, 0xaf, 0xa7, 0xc5, 0xdc, - 0x57, 0x7e, 0x2c, 0x32, 0x64, 0x92, 0xc9, 0xe8, 0x90, 0x49, 0x09, 0xda, 0xff, 0x2a, 0x1a, 0x63, - 0x7a, 0x59, 0xd5, 0x61, 0x24, 0x59, 0xcb, 0xc4, 0x50, 0xfe, 0x56, 0x64, 0xc1, 0x8a, 0x51, 0x80, - 0x77, 0x4e, 0x14, 0x48, 0x67, 0xdf, 0x5a, 0x5b, 0xb7, 0x2c, 0x38, 0x29, 0x55, 0xfe, 0x76, 0x64, + 0x63, 0x95, 0x78, 0xca, 0x07, 0x81, 0xf7, 0x85, 0x94, 0x0d, 0x5f, 0x84, 0x7a, 0xba, 0x47, 0xdb, + 0x82, 0x1f, 0x56, 0x51, 0xbe, 0x36, 0xb5, 0x50, 0x55, 0x3e, 0x24, 0x9f, 0x6f, 0x52, 0xd8, 0x74, + 0x8f, 0x06, 0x38, 0x6a, 0xa5, 0xdd, 0x6c, 0x2f, 0x3b, 0xba, 0x41, 0x98, 0xa1, 0x05, 0xb6, 0x1b, + 0x37, 0x40, 0x3f, 0x2c, 0x5b, 0x69, 0x69, 0x74, 0xd4, 0x4a, 0x4b, 0xc3, 0x51, 0x45, 0x95, 0x92, + 0x29, 0x28, 0x1f, 0x91, 0x15, 0x55, 0x42, 0x52, 0x45, 0x95, 0x53, 0x2f, 0x7c, 0x00, 0x9d, 0x0c, + 0xf6, 0xf3, 0x7c, 0xfd, 0x65, 0x9d, 0xa6, 0x7c, 0x14, 0xf8, 0x9c, 0x8f, 0x5d, 0x06, 0x48, 0x54, + 0xd3, 0x3d, 0x5a, 0x4a, 0x79, 0xba, 0xe2, 0xc6, 0xf2, 0x04, 0x71, 0xf3, 0xe2, 0xdb, 0xe4, 0x15, + 0x37, 0x85, 0x8c, 0xae, 0xb8, 0x29, 0xa8, 0x44, 0xe6, 0x5c, 0xa8, 0xfa, 0x16, 0xcc, 0x03, 0x99, + 0xa6, 0x71, 0x48, 0x64, 0xce, 0x2d, 0xb5, 0xc5, 0x2d, 0x98, 0x07, 0xd6, 0x5a, 0x1a, 0x07, 0x7c, + 0x11, 0x15, 0x6a, 0xb5, 0x59, 0xad, 0x63, 0x29, 0x8d, 0x88, 0xb7, 0x2c, 0x40, 0xa7, 0x7b, 0x34, + 0x8e, 0xa7, 0x66, 0xd0, 0x64, 0x53, 0x77, 0x3d, 0xb3, 0xe1, 0xc2, 0x88, 0xf1, 0x47, 0x88, 0x21, + 0x9b, 0x41, 0x49, 0x34, 0xd4, 0x0c, 0x4a, 0x82, 0x53, 0x7b, 0x71, 0x42, 0x77, 0x5d, 0xdd, 0x32, + 0x1c, 0x7d, 0x1c, 0x96, 0x09, 0x12, 0x79, 0x53, 0x24, 0x61, 0xa9, 0xbd, 0x28, 0x43, 0xe0, 0xf0, + 0xdd, 0x87, 0xf8, 0x66, 0xce, 0x52, 0xe4, 0xf0, 0x3d, 0x82, 0x87, 0xc3, 0xf7, 0x08, 0x0c, 0xec, + 0x4e, 0x1f, 0xa6, 0x91, 0x65, 0x93, 0x8a, 0x48, 0x59, 0x8e, 0xd8, 0x9d, 0x51, 0x02, 0xb0, 0x3b, + 0xa3, 0x40, 0xa9, 0x49, 0xfe, 0x72, 0xbb, 0x92, 0xd2, 0xa4, 0x70, 0x95, 0x8d, 0x95, 0xa1, 0xeb, + 0x77, 0x38, 0x38, 0xca, 0xeb, 0x96, 0xde, 0xb2, 0xcb, 0xe3, 0xbe, 0xd4, 0x4d, 0x79, 0xfd, 0x4e, + 0x25, 0xa4, 0xeb, 0x77, 0x2a, 0x92, 0xce, 0xae, 0xfe, 0x46, 0x6b, 0x45, 0x77, 0x88, 0x51, 0x36, + 0x1d, 0x38, 0x59, 0x5c, 0x67, 0x5b, 0xc3, 0x37, 0xe4, 0xd9, 0xb5, 0x0b, 0x29, 0x9d, 0x5d, 0xbb, + 0xa0, 0xa9, 0x91, 0x97, 0x8c, 0xd6, 0x88, 0x6e, 0x28, 0xab, 0xb2, 0x91, 0x97, 0x4e, 0x49, 0x8d, + 0xbc, 0x74, 0x6c, 0xfa, 0xe7, 0xdc, 0x76, 0x4c, 0x8f, 0x28, 0xcd, 0xed, 0x7c, 0x0e, 0x90, 0xa6, + 0x7f, 0x0e, 0xa0, 0xe9, 0x86, 0x30, 0xda, 0x21, 0x2d, 0x79, 0x43, 0x18, 0xef, 0x86, 0x68, 0x09, + 0x6a, 0xb1, 0xf0, 0xa7, 0x65, 0x8a, 0x25, 0x5b, 0x2c, 0x1c, 0x4c, 0x2d, 0x96, 0xf0, 0xf1, 0x99, + 0xf4, 0x94, 0x49, 0xb1, 0xe5, 0x35, 0x54, 0xc4, 0xd1, 0x35, 0x54, 0x7a, 0xf6, 0xf4, 0xac, 0xf4, + 0xce, 0x40, 0x69, 0xcb, 0x56, 0x87, 0x80, 0xa2, 0x56, 0x87, 0xf8, 0x22, 0x61, 0x02, 0x1d, 0x83, + 0x5b, 0x70, 0xad, 0x13, 0xdc, 0xe3, 0x7c, 0x4c, 0xfe, 0xcc, 0x08, 0x9a, 0x7e, 0x66, 0x04, 0x24, + 0x31, 0xe1, 0xd3, 0x96, 0x93, 0xc2, 0x24, 0x3c, 0x1f, 0x8c, 0x80, 0xf0, 0x0c, 0xc2, 0xb5, 0xd2, + 0xec, 0x4c, 0xc5, 0xa8, 0x8a, 0x57, 0x64, 0xae, 0x7c, 0x02, 0x1b, 0xa7, 0x98, 0xee, 0xd1, 0x12, + 0xca, 0xe1, 0x37, 0xd0, 0x59, 0x0e, 0xe5, 0xef, 0x86, 0x21, 0x89, 0xb7, 0x11, 0x2c, 0x08, 0x9e, + 0xec, 0xc7, 0xd6, 0x8d, 0x76, 0xba, 0x47, 0xeb, 0xca, 0x2b, 0xbd, 0x2e, 0xbe, 0x3e, 0x74, 0xb6, + 0x53, 0x57, 0xb0, 0x48, 0x74, 0xe5, 0x95, 0x5e, 0x17, 0x97, 0xfb, 0x9d, 0xed, 0xd4, 0x15, 0x74, + 0x42, 0x57, 0x5e, 0xd8, 0x45, 0xc5, 0x6e, 0xf8, 0x52, 0xb3, 0xa9, 0xac, 0x41, 0x75, 0xef, 0xd9, + 0x4e, 0x75, 0x25, 0x30, 0x38, 0xb7, 0xe2, 0x48, 0x67, 0xe9, 0xf9, 0x36, 0xb1, 0x6a, 0xd2, 0x02, + 0x74, 0x57, 0x9e, 0xa5, 0x63, 0x04, 0x74, 0x96, 0x8e, 0x01, 0xe9, 0x80, 0x12, 0x9f, 0xab, 0x28, + 0xeb, 0xf2, 0x80, 0x12, 0x71, 0x74, 0x40, 0x49, 0x4f, 0x5b, 0xe6, 0xd1, 0xf1, 0xf9, 0x55, 0x4f, + 0xf7, 0x2d, 0x48, 0x97, 0x77, 0xe5, 0x9b, 0x91, 0x4b, 0xa6, 0x38, 0x09, 0x5c, 0x32, 0xc5, 0xc1, + 0x74, 0x8c, 0x50, 0x70, 0x6d, 0xdd, 0x6a, 0x4c, 0xe9, 0x66, 0xb3, 0xe3, 0x10, 0xe5, 0x7f, 0x93, + 0xc7, 0x48, 0x04, 0x4d, 0xc7, 0x48, 0x04, 0x44, 0x17, 0x68, 0x0a, 0x2a, 0xb9, 0xae, 0xb9, 0x6c, + 0xf1, 0x7d, 0x65, 0xa7, 0xe9, 0x29, 0xff, 0xbb, 0xbc, 0x40, 0x27, 0xd1, 0xd0, 0x05, 0x3a, 0x09, + 0x0e, 0xa7, 0x4e, 0x09, 0x09, 0xee, 0x95, 0xff, 0x23, 0x72, 0xea, 0x94, 0x40, 0x03, 0xa7, 0x4e, + 0x49, 0xc9, 0xf1, 0xa7, 0xd0, 0x28, 0xb3, 0xc9, 0x66, 0xcc, 0xe0, 0xae, 0xfa, 0xff, 0x94, 0xd7, + 0xc7, 0x28, 0x9e, 0xae, 0x8f, 0x51, 0x98, 0xcc, 0x87, 0x77, 0xc1, 0xff, 0x95, 0xc6, 0x27, 0x90, + 0x7f, 0xac, 0x0c, 0xbe, 0x2e, 0xf2, 0xe1, 0x23, 0xe5, 0xdb, 0x33, 0x69, 0x8c, 0x82, 0xe1, 0x11, + 0x2b, 0x24, 0x33, 0xd2, 0xc8, 0x1d, 0x93, 0xac, 0x29, 0x1f, 0x4f, 0x65, 0xc4, 0x08, 0x64, 0x46, + 0x0c, 0x86, 0x5f, 0x47, 0x27, 0x43, 0xd8, 0x2c, 0x69, 0x2d, 0x06, 0x33, 0xd3, 0x77, 0x64, 0x64, + 0x33, 0x38, 0x99, 0x8c, 0x9a, 0xc1, 0xc9, 0x98, 0x24, 0xd6, 0x5c, 0x74, 0xff, 0xf7, 0x16, 0xac, + 0x03, 0x09, 0xa6, 0x30, 0x48, 0x62, 0xcd, 0xa5, 0xf9, 0x9d, 0x5b, 0xb0, 0x0e, 0x64, 0x9a, 0xc2, + 0x00, 0x7f, 0x32, 0x83, 0x2e, 0x24, 0xa3, 0x4a, 0xcd, 0xe6, 0x94, 0xed, 0x84, 0x38, 0xe5, 0xbb, + 0x32, 0xf2, 0x41, 0xc3, 0xf6, 0x8a, 0x4d, 0xf7, 0x68, 0xdb, 0xac, 0x00, 0xbf, 0x1f, 0x0d, 0x97, + 0x3a, 0x86, 0xe9, 0xc1, 0xc5, 0x1b, 0x35, 0x9c, 0xbf, 0x3b, 0x13, 0xd9, 0xe2, 0x88, 0x58, 0xd8, + 0xe2, 0x88, 0x00, 0xfc, 0x2a, 0x1a, 0xab, 0x91, 0x46, 0xc7, 0x31, 0xbd, 0x75, 0x8d, 0xb4, 0x6d, + 0xc7, 0xa3, 0x3c, 0xbe, 0x27, 0x23, 0x4f, 0x62, 0x31, 0x0a, 0x3a, 0x89, 0xc5, 0x80, 0xf8, 0x56, + 0x4a, 0x8a, 0x7b, 0xe5, 0x13, 0x99, 0xae, 0xd7, 0xf2, 0x41, 0x5f, 0xa6, 0x64, 0xc8, 0xaf, 0x26, + 0xa6, 0x0c, 0x57, 0x3e, 0x99, 0xe9, 0x72, 0x8d, 0x2e, 0xcc, 0x70, 0x09, 0xd9, 0xc6, 0xab, 0x89, + 0x49, 0xa1, 0x95, 0xef, 0xcd, 0x74, 0xb9, 0xf6, 0x0e, 0x39, 0x26, 0xe5, 0x93, 0x7e, 0x9a, 0x79, + 0x8a, 0x70, 0x46, 0xdf, 0x97, 0x89, 0xbb, 0x8a, 0x04, 0xe5, 0x05, 0x42, 0x5a, 0xec, 0xa6, 0x1b, + 0x28, 0xfd, 0xa7, 0x32, 0x71, 0xdf, 0xbc, 0xb0, 0x58, 0xf8, 0x0b, 0x13, 0x74, 0x66, 0xf2, 0xae, + 0x47, 0x1c, 0x4b, 0x6f, 0x42, 0x77, 0xd6, 0x3c, 0xdb, 0xd1, 0x97, 0xc9, 0xa4, 0xa5, 0x2f, 0x36, + 0x89, 0xf2, 0xe9, 0x8c, 0x6c, 0xc1, 0xa6, 0x93, 0x52, 0x0b, 0x36, 0x1d, 0x8b, 0x57, 0xd0, 0xfd, + 0x49, 0xd8, 0xb2, 0xe9, 0x42, 0x3d, 0x9f, 0xc9, 0xc8, 0x26, 0x6c, 0x17, 0x5a, 0x6a, 0xc2, 0x76, + 0x41, 0xe3, 0xab, 0x68, 0x60, 0xdc, 0xf6, 0xa7, 0xdf, 0xef, 0x8f, 0x38, 0x43, 0x06, 0x98, 0xe9, + 0x1e, 0x2d, 0x24, 0xe3, 0x65, 0xf8, 0xa0, 0xfe, 0x6c, 0xbc, 0x4c, 0x78, 0xf9, 0x14, 0xfc, 0xe0, + 0x65, 0xb8, 0xb8, 0xff, 0x9f, 0x78, 0x99, 0xf0, 0x8e, 0x2b, 0xf8, 0x41, 0x67, 0x12, 0x56, 0xe3, + 0xec, 0x54, 0x89, 0xda, 0x6d, 0x13, 0x2b, 0x7a, 0xb3, 0x49, 0xac, 0x65, 0xa2, 0x7c, 0x2e, 0x32, + 0x93, 0x24, 0x93, 0xd1, 0x99, 0x24, 0x19, 0x83, 0x3f, 0x8c, 0x4e, 0xdd, 0xd2, 0x9b, 0xa6, 0x11, + 0xe2, 0xfc, 0x3c, 0xc3, 0xca, 0x0f, 0x64, 0xe4, 0xdd, 0x74, 0x0a, 0x1d, 0xdd, 0x4d, 0xa7, 0xa0, + 0xf0, 0x2c, 0xc2, 0xb0, 0x8c, 0x06, 0xb3, 0x05, 0x5d, 0x9f, 0x95, 0xff, 0x37, 0x23, 0xdb, 0xa9, + 0x71, 0x12, 0x6a, 0xa7, 0xc6, 0xa1, 0xb8, 0x9e, 0x9e, 0x0c, 0x42, 0xf9, 0xc1, 0x8c, 0x7c, 0x5a, + 0x93, 0x46, 0x38, 0xdd, 0xa3, 0xa5, 0x67, 0x94, 0xb8, 0x8e, 0x46, 0x6b, 0xd5, 0xca, 0xd4, 0xd4, + 0x64, 0xed, 0x56, 0xa5, 0x0c, 0x0f, 0x1d, 0x0c, 0xe5, 0x87, 0x22, 0x2b, 0x56, 0x94, 0x80, 0xae, + 0x58, 0x51, 0x18, 0xae, 0xa1, 0x13, 0x54, 0x10, 0x55, 0x87, 0x2c, 0x11, 0x87, 0x58, 0x0d, 0x7f, + 0x58, 0xfe, 0x48, 0x46, 0x36, 0x14, 0x92, 0x88, 0xa8, 0xa1, 0x90, 0x04, 0xc7, 0xab, 0xe8, 0x6c, + 0xf4, 0x30, 0x47, 0x7c, 0x39, 0xaa, 0xfc, 0x68, 0x26, 0x62, 0xcf, 0x76, 0x21, 0x06, 0x7b, 0xb6, + 0x0b, 0x1e, 0x5b, 0xe8, 0x1c, 0x3f, 0x19, 0xe1, 0x3e, 0x93, 0xd1, 0xda, 0x7e, 0x8c, 0xd5, 0xf6, + 0x48, 0xe8, 0xd3, 0xd7, 0x85, 0x7a, 0xba, 0x47, 0xeb, 0xce, 0x8e, 0xaa, 0x4a, 0x3c, 0x6b, 0x81, + 0xf2, 0xe3, 0x99, 0x64, 0xa7, 0x12, 0xc9, 0xd3, 0x38, 0x29, 0xdd, 0xc1, 0xeb, 0x69, 0x31, 0xf7, + 0x95, 0x9f, 0x88, 0x0c, 0x99, 0x64, 0x32, 0x3a, 0x64, 0x52, 0x82, 0xf6, 0xbf, 0x8a, 0xc6, 0x98, + 0x5e, 0x56, 0x75, 0x18, 0x49, 0xd6, 0x32, 0x31, 0x94, 0xff, 0x2f, 0xb2, 0x60, 0xc5, 0x28, 0xc0, + 0x3b, 0x27, 0x0a, 0xa4, 0xb3, 0x6f, 0xad, 0xad, 0x5b, 0x16, 0x9c, 0x94, 0x2a, 0xff, 0x7f, 0x64, 0xf6, 0x0d, 0x51, 0xe0, 0x7b, 0x1b, 0xfc, 0x82, 0xdc, 0x69, 0x49, 0x0f, 0xab, 0x95, 0xcf, 0x47, - 0xd6, 0xb9, 0x44, 0x2a, 0xba, 0xce, 0x25, 0xbf, 0xcb, 0xbe, 0x95, 0xf2, 0x28, 0x59, 0xf9, 0xf1, - 0xee, 0x7c, 0xc3, 0xf5, 0x33, 0xf9, 0x4d, 0xf3, 0xad, 0x94, 0x07, 0xbd, 0xca, 0x4f, 0x74, 0xe7, - 0x1b, 0xba, 0xcb, 0x25, 0xbf, 0x07, 0xae, 0xa7, 0x3f, 0x86, 0x55, 0x7e, 0x32, 0x3a, 0x21, 0xa4, + 0xd6, 0xb9, 0x44, 0x2a, 0xba, 0xce, 0x25, 0xbf, 0xcb, 0xbe, 0x95, 0xf2, 0x28, 0x59, 0xf9, 0xc9, + 0xee, 0x7c, 0xc3, 0xf5, 0x33, 0xf9, 0x4d, 0xf3, 0xad, 0x94, 0x07, 0xbd, 0xca, 0x4f, 0x75, 0xe7, + 0x1b, 0xba, 0xcb, 0x25, 0xbf, 0x07, 0xae, 0xa7, 0x3f, 0x86, 0x55, 0x7e, 0x3a, 0x3a, 0x21, 0xa4, 0x10, 0xc2, 0x84, 0x90, 0xf6, 0xa2, 0x76, 0x11, 0x9d, 0x66, 0x9d, 0x76, 0xdd, 0xd1, 0xdb, 0x2b, - 0x35, 0xe2, 0x79, 0xa6, 0xb5, 0xec, 0xef, 0x6f, 0xfe, 0x4e, 0x26, 0x72, 0xe8, 0x94, 0x46, 0x09, - 0x87, 0x4e, 0x69, 0x48, 0xaa, 0x4f, 0xb1, 0x67, 0xaf, 0xca, 0x4f, 0x45, 0xf4, 0x29, 0x46, 0x41, - 0xf5, 0x29, 0xfe, 0x5a, 0xf6, 0xd5, 0x84, 0xd7, 0x9d, 0xca, 0xdf, 0x4d, 0xe7, 0x15, 0xb4, 0x2f, - 0xe1, 0x51, 0xe8, 0xab, 0x09, 0x8f, 0x18, 0x95, 0xbf, 0x97, 0xce, 0x2b, 0xf4, 0xec, 0x89, 0xbf, - 0x7d, 0x7c, 0x1d, 0x9d, 0x64, 0x73, 0xe4, 0x14, 0x31, 0x88, 0xf4, 0xa1, 0x3f, 0x1d, 0x19, 0x8e, - 0xc9, 0x64, 0x70, 0x90, 0x9d, 0x88, 0x49, 0x62, 0xcd, 0xdb, 0xfa, 0x33, 0x9b, 0xb0, 0x0e, 0xcd, - 0xec, 0x64, 0x0c, 0x7e, 0x41, 0x7e, 0x52, 0xa6, 0xfc, 0x6c, 0x26, 0xe2, 0x24, 0x21, 0x20, 0xc1, - 0x49, 0x42, 0x7c, 0x7f, 0xf6, 0x82, 0xfc, 0x7c, 0x4a, 0xf9, 0xfb, 0x89, 0x85, 0x83, 0x0e, 0x90, - 0xdf, 0x5a, 0xbd, 0x20, 0x3f, 0x15, 0x52, 0x7e, 0x2e, 0xb1, 0x70, 0xf0, 0x01, 0xf2, 0xbb, 0x22, - 0xba, 0xf1, 0xe8, 0x78, 0x36, 0x63, 0x25, 0x4d, 0x0f, 0x3f, 0x1f, 0xdd, 0x78, 0x24, 0x92, 0xc1, - 0xc6, 0x23, 0x11, 0x93, 0xc4, 0x9a, 0x7f, 0xde, 0x2f, 0x6c, 0xc2, 0x5a, 0xd8, 0x2e, 0x25, 0x62, - 0x92, 0x58, 0xf3, 0x8f, 0xff, 0xc2, 0x26, 0xac, 0x85, 0xed, 0x52, 0x22, 0x86, 0x1a, 0x39, 0x21, - 0xe6, 0x16, 0x71, 0xdc, 0x50, 0xfd, 0x7e, 0x31, 0x62, 0xe4, 0xa4, 0xd0, 0x51, 0x23, 0x27, 0x05, - 0x95, 0xc8, 0x9d, 0x0b, 0xe5, 0x97, 0x36, 0xe3, 0x1e, 0xde, 0x76, 0xa4, 0xa0, 0x12, 0xb9, 0x73, - 0xb9, 0xfc, 0xf2, 0x66, 0xdc, 0xc3, 0xeb, 0x8e, 0x14, 0x14, 0x35, 0x78, 0x26, 0x1c, 0x7b, 0xd5, - 0x7a, 0x95, 0xac, 0x92, 0x26, 0x17, 0xc9, 0x17, 0x23, 0x06, 0x4f, 0x94, 0x00, 0x0e, 0xe7, 0x23, - 0x30, 0x99, 0x11, 0xff, 0xfa, 0x5f, 0x4d, 0x65, 0x14, 0x9e, 0x3e, 0x44, 0x61, 0x32, 0x23, 0xfe, - 0xa1, 0xbf, 0x96, 0xca, 0x28, 0x3c, 0x7d, 0x88, 0xc2, 0xc6, 0xfb, 0x50, 0x2f, 0x1c, 0x4f, 0xa9, + 0x35, 0xe2, 0x79, 0xa6, 0xb5, 0xec, 0xef, 0x6f, 0xfe, 0x56, 0x26, 0x72, 0xe8, 0x94, 0x46, 0x09, + 0x87, 0x4e, 0x69, 0x48, 0xaa, 0x4f, 0xb1, 0x67, 0xaf, 0xca, 0xcf, 0x44, 0xf4, 0x29, 0x46, 0x41, + 0xf5, 0x29, 0xfe, 0x5a, 0xf6, 0xd5, 0x84, 0xd7, 0x9d, 0xca, 0xdf, 0x4e, 0xe7, 0x15, 0xb4, 0x2f, + 0xe1, 0x51, 0xe8, 0xab, 0x09, 0x8f, 0x18, 0x95, 0xbf, 0x93, 0xce, 0x2b, 0xf4, 0xec, 0x89, 0xbf, + 0x7d, 0x7c, 0x1d, 0x9d, 0x64, 0x73, 0xe4, 0x14, 0x31, 0x88, 0xf4, 0xa1, 0x3f, 0x1b, 0x19, 0x8e, + 0xc9, 0x64, 0x70, 0x90, 0x9d, 0x88, 0x49, 0x62, 0xcd, 0xdb, 0xfa, 0x73, 0x5b, 0xb0, 0x0e, 0xcd, + 0xec, 0x64, 0x0c, 0x7e, 0x41, 0x7e, 0x52, 0xa6, 0xfc, 0x7c, 0x26, 0xe2, 0x24, 0x21, 0x20, 0xc1, + 0x49, 0x42, 0x7c, 0x7f, 0xf6, 0x82, 0xfc, 0x7c, 0x4a, 0xf9, 0xbb, 0x89, 0x85, 0x83, 0x0e, 0x90, + 0xdf, 0x5a, 0xbd, 0x20, 0x3f, 0x15, 0x52, 0x7e, 0x21, 0xb1, 0x70, 0xf0, 0x01, 0xf2, 0xbb, 0x22, + 0xba, 0xf1, 0xe8, 0x78, 0x36, 0x63, 0x25, 0x4d, 0x0f, 0xbf, 0x18, 0xdd, 0x78, 0x24, 0x92, 0xc1, + 0xc6, 0x23, 0x11, 0x93, 0xc4, 0x9a, 0x7f, 0xde, 0x2f, 0x6d, 0xc1, 0x5a, 0xd8, 0x2e, 0x25, 0x62, + 0x92, 0x58, 0xf3, 0x8f, 0xff, 0xc2, 0x16, 0xac, 0x85, 0xed, 0x52, 0x22, 0x86, 0x1a, 0x39, 0x21, + 0xe6, 0x16, 0x71, 0xdc, 0x50, 0xfd, 0x7e, 0x39, 0x62, 0xe4, 0xa4, 0xd0, 0x51, 0x23, 0x27, 0x05, + 0x95, 0xc8, 0x9d, 0x0b, 0xe5, 0x57, 0xb6, 0xe2, 0x1e, 0xde, 0x76, 0xa4, 0xa0, 0x12, 0xb9, 0x73, + 0xb9, 0xfc, 0xea, 0x56, 0xdc, 0xc3, 0xeb, 0x8e, 0x14, 0x14, 0x35, 0x78, 0x26, 0x1c, 0x7b, 0xcd, + 0x7a, 0x95, 0xac, 0x91, 0x26, 0x17, 0xc9, 0x17, 0x23, 0x06, 0x4f, 0x94, 0x00, 0x0e, 0xe7, 0x23, + 0x30, 0x99, 0x11, 0xff, 0xfa, 0x5f, 0x4f, 0x65, 0x14, 0x9e, 0x3e, 0x44, 0x61, 0x32, 0x23, 0xfe, + 0xa1, 0xbf, 0x91, 0xca, 0x28, 0x3c, 0x7d, 0x88, 0xc2, 0xc6, 0xfb, 0x50, 0x2f, 0x1c, 0x4f, 0xa9, 0x9f, 0xcf, 0xa0, 0xa1, 0x9a, 0xe7, 0x10, 0xbd, 0xc5, 0x83, 0x50, 0x9d, 0x41, 0xfd, 0xcc, 0xcf, 0xd3, 0x7f, 0x94, 0xaa, 0x05, 0xbf, 0xf1, 0x05, 0x34, 0x32, 0xa3, 0xbb, 0x1e, 0x94, 0xac, 0x58, - 0x06, 0xb9, 0x07, 0x6f, 0x9c, 0x72, 0x5a, 0x04, 0x8a, 0x67, 0x18, 0x1d, 0x2b, 0x07, 0xd1, 0xff, - 0x72, 0x9b, 0xc6, 0x5e, 0xea, 0x7f, 0x6b, 0xbd, 0xd8, 0x03, 0xa1, 0x96, 0x22, 0x65, 0xd5, 0xaf, - 0x66, 0x50, 0xcc, 0x03, 0x75, 0xe7, 0x8f, 0xc5, 0xe7, 0xd1, 0xb1, 0x48, 0xc4, 0x49, 0xfe, 0x50, - 0x6b, 0x8b, 0x01, 0x29, 0xa3, 0xa5, 0xf1, 0x7b, 0x82, 0x07, 0x42, 0x37, 0xb5, 0x19, 0x1e, 0x57, - 0xab, 0x6f, 0x63, 0xbd, 0x98, 0xeb, 0x38, 0x4d, 0x4d, 0x40, 0xf1, 0xb8, 0x2f, 0xff, 0x60, 0x34, + 0x06, 0xb9, 0x0b, 0x6f, 0x9c, 0x72, 0x5a, 0x04, 0x8a, 0x67, 0x18, 0x1d, 0x2b, 0x07, 0xd1, 0xff, + 0x72, 0x5b, 0xc6, 0x5e, 0xea, 0x7f, 0x6b, 0xa3, 0xd8, 0x03, 0xa1, 0x96, 0x22, 0x65, 0xd5, 0xaf, + 0x66, 0x50, 0xcc, 0x03, 0x75, 0xf7, 0x8f, 0xc5, 0xe7, 0xd1, 0xb1, 0x48, 0xc4, 0x49, 0xfe, 0x50, + 0x6b, 0x9b, 0x01, 0x29, 0xa3, 0xa5, 0xf1, 0x7b, 0x82, 0x07, 0x42, 0x37, 0xb5, 0x19, 0x1e, 0x57, + 0xab, 0x6f, 0x73, 0xa3, 0x98, 0xeb, 0x38, 0x4d, 0x4d, 0x40, 0xf1, 0xb8, 0x2f, 0x7f, 0x6f, 0x34, 0x0c, 0xa7, 0x87, 0x2f, 0xf0, 0x97, 0xeb, 0x99, 0x30, 0x1a, 0x57, 0x24, 0x2f, 0x2f, 0x7b, 0xa9, 0xfe, 0x7e, 0x34, 0x54, 0x69, 0xb5, 0x89, 0xe3, 0xda, 0x96, 0xee, 0xd9, 0x0e, 0x7f, 0xf8, 0x0b, 0x91, 0x9a, 0x4c, 0x01, 0x2e, 0x46, 0x0f, 0x12, 0xe9, 0xf1, 0x25, 0x3f, 0x0d, 0x53, 0x0e, 0x02, 0x19, 0xc2, 0xeb, 0xbd, 0x68, 0xae, 0x57, 0x46, 0x41, 0x49, 0x6f, 0xba, 0x3a, 0x3c, 0x25, 0x0b, 0x48, 0x3b, 0x14, 0x20, 0x92, 0x02, 0x05, 0x7e, 0x0c, 0x15, 0xe0, 0xe8, 0xdd, 0x85, 0xf4, 0x6a, 0x3c, 0x46, 0x58, 0x13, 0x20, 0x62, 0x44, 0x26, 0x46, 0x83, 0x6f, 0xa0, 0xd1, 0xf0, 0x5e, 0xf1, - 0xba, 0x63, 0x77, 0xda, 0x7e, 0x42, 0x05, 0xc8, 0x91, 0x7b, 0x27, 0xc0, 0xd5, 0x97, 0x01, 0x29, - 0xb0, 0x88, 0x15, 0xc4, 0xd3, 0xe8, 0x58, 0x08, 0xa3, 0x22, 0xf2, 0x13, 0xb9, 0x40, 0x8e, 0x68, - 0x81, 0x17, 0x15, 0xa7, 0xc8, 0x2a, 0x5a, 0x0c, 0x57, 0x50, 0x9f, 0x1f, 0x20, 0xac, 0x7f, 0x53, - 0x25, 0x3d, 0xce, 0x03, 0x84, 0xf5, 0x89, 0xa1, 0xc1, 0xfc, 0xf2, 0x78, 0x0a, 0x8d, 0x68, 0x76, - 0xc7, 0x23, 0x0b, 0x36, 0xb7, 0xe6, 0x79, 0xa4, 0x7f, 0x68, 0x93, 0x43, 0x31, 0x75, 0xcf, 0xf6, - 0x53, 0x0c, 0x8b, 0xa9, 0x6e, 0xe5, 0x52, 0x78, 0x0e, 0x8d, 0xc5, 0x6e, 0x60, 0xc5, 0xc4, 0xbf, - 0xc2, 0xe7, 0xc5, 0x99, 0xc5, 0x8b, 0xe2, 0xef, 0xcc, 0xa0, 0xc2, 0x82, 0xa3, 0x9b, 0x9e, 0xcb, - 0x5f, 0xa1, 0xdd, 0x77, 0x79, 0xd5, 0xd1, 0xdb, 0x54, 0x3f, 0x2e, 0x43, 0xa4, 0xca, 0x5b, 0x7a, - 0xb3, 0x43, 0xdc, 0xf1, 0xdb, 0xf4, 0xeb, 0xfe, 0xcd, 0x7a, 0xf1, 0x85, 0x65, 0x38, 0xe7, 0xb9, - 0xdc, 0xb0, 0x5b, 0x57, 0x96, 0x1d, 0xfd, 0xae, 0xe9, 0xc1, 0xba, 0xaf, 0x37, 0xaf, 0x78, 0xa4, - 0x09, 0xc7, 0x49, 0x57, 0xf4, 0xb6, 0x79, 0x05, 0x22, 0x22, 0x5f, 0x09, 0x38, 0xb1, 0x1a, 0xa8, - 0x0a, 0x78, 0xf0, 0x97, 0xa8, 0x02, 0x0c, 0x87, 0xe7, 0x10, 0xe2, 0x9f, 0x5a, 0x6a, 0xb7, 0xf9, - 0x93, 0x36, 0xe1, 0x10, 0xc6, 0xc7, 0x30, 0xc5, 0x0e, 0x04, 0xa6, 0xb7, 0xdb, 0x62, 0x6a, 0xf1, - 0x90, 0x8e, 0x6a, 0xc1, 0x02, 0x6f, 0x91, 0x2f, 0xa6, 0xe1, 0x50, 0xe2, 0x7e, 0x63, 0x13, 0x84, - 0x14, 0x2d, 0x86, 0x17, 0xd1, 0x31, 0xce, 0x37, 0x08, 0xbd, 0x3f, 0x22, 0xcf, 0x0a, 0x11, 0x34, - 0x53, 0xda, 0xa0, 0x8d, 0x06, 0x07, 0x8b, 0x75, 0x44, 0x4a, 0xe0, 0xf1, 0x30, 0xeb, 0xe4, 0x9c, - 0xde, 0x22, 0xae, 0x72, 0x0c, 0x34, 0xf6, 0xec, 0xc6, 0x7a, 0x51, 0xf1, 0xcb, 0x43, 0xac, 0xbc, - 0xc4, 0x0c, 0xcc, 0x50, 0x44, 0xe4, 0xc1, 0xb4, 0x7e, 0x34, 0x81, 0x47, 0x54, 0xe7, 0xe5, 0x22, - 0x78, 0x02, 0x0d, 0x07, 0x1e, 0xf5, 0x37, 0x6f, 0x56, 0xca, 0xf0, 0x66, 0x6e, 0x60, 0xfc, 0xdc, - 0xc6, 0x7a, 0xf1, 0x74, 0x24, 0xaa, 0xbf, 0xc8, 0x44, 0x2a, 0x23, 0x84, 0x21, 0x60, 0x8f, 0xe8, - 0x22, 0x61, 0x08, 0xda, 0x09, 0x61, 0x08, 0xaa, 0xf8, 0x25, 0x34, 0x58, 0xba, 0x5d, 0xe3, 0xe1, - 0x15, 0x5c, 0xe5, 0x78, 0x98, 0x4e, 0x05, 0x92, 0x70, 0xf3, 0x50, 0x0c, 0x62, 0xd3, 0x45, 0x7a, - 0x3c, 0x89, 0x46, 0x24, 0xa7, 0x1c, 0x57, 0x39, 0x01, 0x1c, 0xa0, 0xe5, 0x3a, 0x60, 0xea, 0x0e, - 0x47, 0x49, 0x69, 0xe1, 0xa5, 0x42, 0x54, 0x6b, 0xca, 0xa6, 0x0b, 0xa9, 0x29, 0x34, 0x02, 0x91, - 0x1c, 0xe0, 0x05, 0x5e, 0x3f, 0xd3, 0x1a, 0x83, 0xa3, 0xea, 0x0e, 0xc3, 0x49, 0x79, 0xe0, 0xe5, - 0x62, 0xf8, 0x0d, 0x84, 0x21, 0x99, 0x05, 0x31, 0xfc, 0x3b, 0x9a, 0x4a, 0xd9, 0x55, 0x4e, 0x42, - 0xc4, 0x5e, 0x1c, 0x7d, 0x39, 0x5e, 0x29, 0x8f, 0x5f, 0xe0, 0xd3, 0xc7, 0x79, 0x9d, 0x95, 0xaa, - 0xfb, 0xaf, 0xc6, 0xeb, 0xa6, 0x21, 0xb6, 0x38, 0x81, 0x2b, 0x5e, 0x45, 0xa7, 0xaa, 0x0e, 0xb9, - 0x6b, 0xda, 0x1d, 0xd7, 0x5f, 0x3e, 0xfc, 0x79, 0xeb, 0xd4, 0xa6, 0xf3, 0xd6, 0x83, 0xbc, 0xe2, - 0xfb, 0xda, 0x0e, 0xb9, 0x5b, 0xf7, 0xe3, 0xb4, 0x4a, 0x01, 0x0e, 0xd3, 0xb8, 0x53, 0x71, 0x41, - 0x14, 0x0b, 0x0e, 0x37, 0x89, 0xab, 0x28, 0xe1, 0x54, 0xcb, 0x82, 0x72, 0x98, 0x01, 0x4e, 0x14, - 0x57, 0xa4, 0x18, 0xd6, 0x10, 0xbe, 0x3e, 0xe1, 0xdf, 0xd7, 0x95, 0x1a, 0x2c, 0xab, 0xa3, 0x72, - 0x1a, 0x98, 0xa9, 0x54, 0x2c, 0xcb, 0x8d, 0x20, 0x66, 0x73, 0x5d, 0xe7, 0x78, 0x51, 0x2c, 0xf1, - 0xd2, 0x78, 0x06, 0x8d, 0x56, 0x1d, 0x38, 0x7a, 0xb8, 0x41, 0xd6, 0xaa, 0x76, 0xd3, 0x6c, 0xac, - 0xc1, 0x43, 0x40, 0x3e, 0x55, 0xb6, 0x19, 0xae, 0x7e, 0x87, 0xac, 0xd5, 0xdb, 0x80, 0x15, 0x97, - 0x95, 0x68, 0x49, 0x31, 0x86, 0xea, 0xfd, 0x5b, 0x8b, 0xa1, 0x4a, 0xd0, 0x28, 0xbf, 0xed, 0xbb, - 0xe7, 0x11, 0x8b, 0x2e, 0xf5, 0x2e, 0x7f, 0xf4, 0xa7, 0x44, 0x6e, 0x07, 0x03, 0x3c, 0xcf, 0x09, - 0xcf, 0x46, 0x19, 0x09, 0xc0, 0x62, 0xc3, 0xa2, 0x45, 0xd4, 0xcf, 0xe4, 0xc4, 0xa9, 0x13, 0x9f, - 0x45, 0x79, 0x21, 0x85, 0x07, 0x84, 0x5e, 0x84, 0x70, 0xc7, 0x79, 0x1e, 0xd7, 0x75, 0x80, 0x9b, - 0x1d, 0x41, 0x8c, 0x10, 0xc8, 0x6f, 0xe6, 0xc7, 0x55, 0x36, 0x0d, 0x2d, 0x24, 0x80, 0xdc, 0x52, - 0x9d, 0xc5, 0xa6, 0xd9, 0x80, 0x20, 0xd8, 0x39, 0x21, 0x28, 0x00, 0x40, 0x59, 0x0c, 0x6c, 0x81, - 0x04, 0x5f, 0x45, 0x83, 0xfe, 0x69, 0x55, 0x18, 0x7a, 0x14, 0x62, 0x23, 0xfb, 0xd9, 0xf3, 0x59, - 0xe8, 0x65, 0x81, 0x08, 0x3f, 0x8f, 0x50, 0x38, 0x92, 0xb9, 0x91, 0x04, 0xb3, 0xbc, 0x38, 0xf0, - 0xc5, 0x59, 0x3e, 0xa4, 0xa6, 0x73, 0x9e, 0xa8, 0x49, 0x7e, 0x36, 0x3d, 0x98, 0xf3, 0x24, 0xf5, - 0x13, 0xfb, 0x56, 0x2e, 0x82, 0xe7, 0xd1, 0x58, 0x4c, 0x79, 0x78, 0xa0, 0x52, 0xc8, 0xdb, 0x9b, - 0xa0, 0x79, 0xe2, 0x9a, 0x1a, 0x2b, 0xab, 0x7e, 0x5b, 0x36, 0xb6, 0x62, 0x50, 0xc1, 0x70, 0x2a, - 0xa1, 0x73, 0x40, 0x30, 0x3e, 0x6b, 0x26, 0x18, 0x81, 0x08, 0x5f, 0x44, 0xfd, 0x55, 0x3a, 0x5e, - 0x1b, 0x76, 0x93, 0x77, 0x15, 0x44, 0xe4, 0x69, 0x73, 0x98, 0x16, 0x60, 0xf1, 0x55, 0x21, 0xbf, - 0xa3, 0x10, 0xe0, 0xd7, 0xcf, 0xef, 0x28, 0x4e, 0xb8, 0x41, 0xa6, 0xc7, 0xab, 0x91, 0x54, 0x32, - 0x7e, 0xa6, 0xff, 0xf8, 0x6a, 0x15, 0x26, 0xca, 0x0a, 0x6c, 0xc5, 0xde, 0xcd, 0x6c, 0x45, 0xf5, - 0x37, 0x33, 0x71, 0xed, 0xc7, 0xd7, 0xe2, 0x51, 0x3e, 0x59, 0x92, 0x7f, 0x1f, 0x28, 0xd6, 0x1a, - 0xc4, 0xfb, 0x94, 0xe2, 0x75, 0x66, 0x77, 0x1c, 0xaf, 0x33, 0xb7, 0xcd, 0x78, 0x9d, 0xea, 0xff, - 0xcc, 0x77, 0xf5, 0x19, 0xdd, 0x97, 0xb8, 0x54, 0xcf, 0xd1, 0xfd, 0x0e, 0xad, 0xbd, 0xe4, 0xc6, - 0xac, 0x76, 0xe6, 0x12, 0x57, 0xd7, 0xd9, 0xa8, 0x71, 0x35, 0x99, 0x12, 0xbf, 0x8c, 0x86, 0xfc, - 0x0f, 0x80, 0x38, 0xb0, 0x42, 0xfc, 0xd2, 0x60, 0xad, 0x89, 0x44, 0x4c, 0x95, 0x0a, 0xe0, 0xa7, - 0xd1, 0x00, 0x58, 0x1a, 0x6d, 0xbd, 0xe1, 0x07, 0x09, 0x66, 0x51, 0x85, 0x7d, 0xa0, 0x18, 0x7b, - 0x29, 0xa0, 0xc4, 0x1f, 0x41, 0x05, 0x1e, 0xaf, 0x9e, 0xa5, 0x3e, 0xbe, 0xb2, 0x05, 0x27, 0xdb, - 0xcb, 0x62, 0xac, 0x7a, 0xb6, 0x77, 0x00, 0x80, 0xb4, 0x77, 0x60, 0x61, 0xea, 0x17, 0xd0, 0xf1, - 0xaa, 0x43, 0x0c, 0x70, 0xe7, 0x9e, 0xbc, 0xd7, 0x76, 0x78, 0x26, 0x01, 0x36, 0x80, 0x61, 0xe9, - 0x68, 0xfb, 0x68, 0xba, 0xa8, 0x71, 0xbc, 0xc0, 0x28, 0xa9, 0x38, 0xb5, 0x27, 0x58, 0x4b, 0x6e, - 0x90, 0xb5, 0x55, 0xdb, 0x31, 0x58, 0xb0, 0x7d, 0x6e, 0x4f, 0x70, 0x41, 0xdf, 0xe1, 0x28, 0xd1, - 0x9e, 0x90, 0x0b, 0x9d, 0x79, 0x0e, 0x0d, 0xee, 0x34, 0xde, 0xfb, 0x2f, 0x65, 0x53, 0x5e, 0x5f, - 0x1c, 0xde, 0x3c, 0x7d, 0x41, 0xce, 0xd4, 0xde, 0x94, 0x9c, 0xa9, 0xdf, 0xc8, 0xa6, 0x3c, 0x2d, - 0x39, 0xd4, 0xb9, 0x0d, 0x03, 0x61, 0xc8, 0xb9, 0x0d, 0xc3, 0xb4, 0x92, 0xa6, 0xa1, 0x89, 0x44, - 0x91, 0x2c, 0xa8, 0x85, 0x4d, 0xb3, 0xa0, 0xfe, 0x74, 0xae, 0xdb, 0xd3, 0x9b, 0x23, 0xd9, 0x6f, - 0x47, 0xf6, 0x57, 0xd1, 0x60, 0x20, 0xd9, 0x4a, 0x19, 0xec, 0x99, 0xe1, 0x20, 0xbb, 0x04, 0x03, - 0x43, 0x19, 0x81, 0x08, 0x5f, 0x62, 0x6d, 0xad, 0x99, 0x6f, 0xb2, 0x08, 0xeb, 0xc3, 0x3c, 0x76, - 0xb6, 0xee, 0xe9, 0x75, 0xd7, 0x7c, 0x93, 0x68, 0x01, 0x5a, 0xfd, 0xc7, 0xd9, 0xc4, 0xf7, 0x4b, - 0x47, 0x7d, 0xb4, 0x8d, 0x3e, 0x4a, 0x10, 0x22, 0x7b, 0x79, 0x75, 0x24, 0xc4, 0x6d, 0x08, 0xf1, - 0xcf, 0xb3, 0x89, 0xef, 0xd4, 0x8e, 0x84, 0xb8, 0x9d, 0xd9, 0xe2, 0x31, 0x34, 0xa0, 0xd9, 0xab, - 0xee, 0x04, 0xec, 0x59, 0xd8, 0x5c, 0x01, 0x13, 0xb5, 0x63, 0xaf, 0xba, 0x75, 0xd8, 0x8d, 0x68, - 0x21, 0x81, 0xfa, 0xcd, 0x6c, 0x97, 0x97, 0x7c, 0x47, 0x82, 0x7f, 0x3b, 0x97, 0xc8, 0x5f, 0xcd, - 0x4a, 0x2f, 0x05, 0x0f, 0x75, 0x92, 0xf0, 0x5a, 0x63, 0x85, 0xb4, 0xf4, 0x68, 0x92, 0x70, 0x17, - 0xa0, 0x3c, 0xc7, 0x68, 0x48, 0xa2, 0x7e, 0x29, 0x1b, 0x79, 0x2a, 0x79, 0x24, 0xbb, 0x2d, 0xcb, - 0x2e, 0xd0, 0x3a, 0xfe, 0xfa, 0xf3, 0x48, 0x72, 0x5b, 0x95, 0xdc, 0x27, 0xb2, 0x91, 0x87, 0xb2, - 0x87, 0x37, 0x5f, 0xf0, 0x97, 0xb2, 0xf1, 0x47, 0xbf, 0x87, 0x57, 0x93, 0x1e, 0x43, 0x03, 0x5c, - 0x0e, 0xc1, 0x52, 0xc1, 0xe6, 0x7d, 0x06, 0x84, 0x03, 0xd4, 0x80, 0x40, 0xfd, 0x8e, 0x2c, 0x92, - 0x1f, 0x30, 0x1f, 0x52, 0x1d, 0xfa, 0xd5, 0xac, 0xfc, 0x74, 0xfb, 0xf0, 0xea, 0xcf, 0x65, 0x84, - 0x6a, 0x9d, 0xc5, 0x06, 0x8f, 0xfc, 0xd9, 0x2b, 0x9c, 0xc0, 0x07, 0x50, 0x4d, 0xa0, 0x50, 0xff, - 0x57, 0x36, 0xf1, 0x3d, 0xf9, 0xe1, 0x15, 0xe0, 0x53, 0x70, 0x2a, 0xde, 0xb0, 0xc2, 0x89, 0x1c, - 0x0e, 0x21, 0xe9, 0xf8, 0x8b, 0xa5, 0x36, 0xf3, 0x09, 0xf1, 0xfb, 0x12, 0xcc, 0x35, 0x08, 0x1c, - 0x1f, 0x9a, 0x6b, 0xe2, 0x0d, 0x83, 0x60, 0xb8, 0xfd, 0x4e, 0x76, 0xb3, 0xe7, 0xf7, 0x87, 0x79, - 0x55, 0xed, 0xab, 0xea, 0x6b, 0x10, 0x26, 0x8e, 0xf6, 0xc4, 0x10, 0x4b, 0xbc, 0xd5, 0x66, 0x20, - 0xf1, 0x46, 0x8c, 0x53, 0xa9, 0x7f, 0xda, 0x9b, 0xfc, 0xf6, 0xfb, 0xf0, 0x8a, 0xf0, 0x2c, 0xca, - 0x57, 0x75, 0x6f, 0x85, 0x6b, 0x32, 0xdc, 0xd6, 0xb5, 0x75, 0x6f, 0x45, 0x03, 0x28, 0xbe, 0x84, - 0xfa, 0x35, 0x7d, 0x95, 0x9d, 0x79, 0x16, 0xc2, 0xa4, 0x68, 0x8e, 0xbe, 0x5a, 0x67, 0xe7, 0x9e, - 0x01, 0x1a, 0xab, 0x41, 0x52, 0x3e, 0x76, 0xf2, 0x0d, 0x19, 0xad, 0x58, 0x52, 0xbe, 0x20, 0x15, - 0xdf, 0x59, 0x94, 0x1f, 0xb7, 0x8d, 0x35, 0x70, 0x66, 0x19, 0x62, 0x95, 0x2d, 0xda, 0xc6, 0x9a, - 0x06, 0x50, 0xfc, 0xc9, 0x0c, 0xea, 0x9b, 0x26, 0xba, 0x41, 0x47, 0xc8, 0x40, 0x37, 0x5f, 0x90, - 0x0f, 0xec, 0x8d, 0x2f, 0xc8, 0xd8, 0x0a, 0xab, 0x4c, 0x54, 0x14, 0x5e, 0x3f, 0xbe, 0x8e, 0xfa, - 0x27, 0x74, 0x8f, 0x2c, 0xdb, 0xce, 0x1a, 0x78, 0xb7, 0x8c, 0x84, 0x9e, 0xce, 0x92, 0xfe, 0xf8, - 0x44, 0xec, 0x66, 0xac, 0xc1, 0x7f, 0x69, 0x41, 0x61, 0x2a, 0x16, 0x9e, 0xac, 0x7b, 0x30, 0x14, - 0x0b, 0xcb, 0xca, 0x1d, 0xe4, 0xe4, 0x0e, 0x8e, 0x95, 0x87, 0x92, 0x8f, 0x95, 0xc1, 0x7a, 0x04, - 0x0f, 0x38, 0x48, 0x85, 0x37, 0x0c, 0x8b, 0x3e, 0xb3, 0x1e, 0x01, 0x0a, 0x99, 0xf0, 0x34, 0x81, - 0x44, 0xfd, 0x5a, 0x2f, 0x4a, 0x7c, 0x29, 0x7a, 0xa4, 0xe4, 0x47, 0x4a, 0x1e, 0x2a, 0x79, 0x39, - 0xa6, 0xe4, 0x67, 0xe2, 0x6f, 0x8f, 0xdf, 0xa1, 0x1a, 0xfe, 0x83, 0xf9, 0x58, 0xe4, 0x82, 0xc3, - 0xbd, 0xbb, 0x0c, 0xa5, 0xd7, 0xbb, 0xa9, 0xf4, 0x82, 0x01, 0x51, 0xd8, 0x74, 0x40, 0xf4, 0x6d, - 0x75, 0x40, 0xf4, 0xa7, 0x0e, 0x88, 0x50, 0x41, 0x06, 0x52, 0x15, 0xa4, 0xc2, 0x07, 0x0d, 0xea, - 0x9e, 0x40, 0xe1, 0xec, 0xc6, 0x7a, 0x71, 0x84, 0x8e, 0xa6, 0xc4, 0xcc, 0x09, 0xc0, 0x42, 0xfd, - 0x6a, 0xbe, 0x4b, 0xb8, 0x91, 0x7d, 0xd1, 0x91, 0xa7, 0x50, 0xae, 0xd4, 0x6e, 0x73, 0xfd, 0x38, - 0x2e, 0x44, 0x3a, 0x49, 0x29, 0x45, 0xa9, 0xf1, 0xf3, 0x28, 0x57, 0xba, 0x5d, 0x8b, 0x26, 0x4d, - 0x28, 0xdd, 0xae, 0xf1, 0x2f, 0x49, 0x2d, 0x7b, 0xbb, 0x86, 0x5f, 0x0c, 0xa3, 0x17, 0xae, 0x74, - 0xac, 0x3b, 0x7c, 0xa3, 0xc8, 0x9d, 0x60, 0x7d, 0x4f, 0x9b, 0x06, 0x45, 0xd1, 0xed, 0x62, 0x84, - 0x36, 0xa2, 0x4d, 0x85, 0xad, 0x6b, 0x53, 0xdf, 0xa6, 0xda, 0xd4, 0xbf, 0x55, 0x6d, 0x1a, 0xd8, - 0x82, 0x36, 0xa1, 0x4d, 0xb5, 0x69, 0x70, 0xf7, 0xda, 0xd4, 0x46, 0x67, 0xe2, 0x21, 0xa2, 0x02, - 0x8d, 0xd0, 0x10, 0x8e, 0x63, 0xb9, 0x63, 0x09, 0x5c, 0xfd, 0x77, 0x18, 0xb6, 0xce, 0x92, 0xea, - 0x47, 0x53, 0xd2, 0x6b, 0x09, 0xa5, 0xd5, 0x5f, 0xca, 0xa6, 0x47, 0xb6, 0x3a, 0x98, 0x53, 0xdc, - 0xb7, 0x24, 0x4a, 0x29, 0x2f, 0xbf, 0x34, 0x4e, 0x97, 0x72, 0x84, 0x6d, 0x92, 0xcc, 0xbe, 0x92, - 0x49, 0x0b, 0xb7, 0xb5, 0x2b, 0x89, 0x3d, 0x12, 0x77, 0x56, 0x03, 0xef, 0x79, 0x57, 0xf6, 0x52, - 0x8b, 0xe6, 0x68, 0xcf, 0xed, 0x30, 0x47, 0xfb, 0x6f, 0x66, 0xd0, 0xf1, 0x1b, 0x9d, 0x45, 0xc2, - 0x9d, 0xd3, 0x82, 0x66, 0xbc, 0x81, 0x10, 0x05, 0x73, 0x27, 0x96, 0x0c, 0x38, 0xb1, 0xbc, 0x57, - 0x0c, 0x95, 0x15, 0x29, 0x70, 0x39, 0xa4, 0x66, 0x0e, 0x2c, 0xe7, 0x7c, 0x17, 0xcb, 0x3b, 0x9d, - 0x45, 0x52, 0x8f, 0x79, 0xb2, 0x08, 0xdc, 0xcf, 0xbc, 0xc4, 0x9c, 0xd7, 0x77, 0xea, 0x34, 0xf2, - 0x0b, 0xd9, 0xd4, 0xe8, 0x64, 0x07, 0x36, 0x8d, 0xde, 0x87, 0x12, 0x7b, 0x25, 0x9a, 0x4e, 0x2f, - 0x81, 0x24, 0xc2, 0x31, 0x89, 0x4b, 0xb2, 0xc0, 0x0e, 0x78, 0x72, 0xc7, 0xb7, 0x55, 0x60, 0xbf, - 0x9f, 0x49, 0x8d, 0x22, 0x77, 0x50, 0x05, 0xa6, 0xfe, 0xc7, 0x9c, 0x1f, 0xbc, 0x6e, 0x57, 0x9f, - 0xf0, 0x18, 0x1a, 0xe0, 0x19, 0x7a, 0x64, 0xdf, 0x5a, 0x7e, 0x94, 0x07, 0x47, 0xc3, 0x01, 0x01, - 0x5d, 0xe6, 0xfd, 0xe0, 0x5a, 0x41, 0x56, 0x7f, 0x58, 0xe6, 0x4d, 0x0e, 0xa5, 0xf4, 0x02, 0x09, - 0x5d, 0xc8, 0x27, 0xef, 0x99, 0x1e, 0x58, 0x05, 0xb4, 0x2f, 0x73, 0x6c, 0x21, 0x27, 0xf7, 0x4c, - 0x8f, 0xd9, 0x04, 0x01, 0x9a, 0x2e, 0xd2, 0xb5, 0x30, 0x75, 0x35, 0x5f, 0xa4, 0x5d, 0x9e, 0xc1, - 0x9b, 0x3f, 0xe6, 0x7a, 0x0c, 0x0d, 0x70, 0x87, 0x55, 0xee, 0x66, 0xc2, 0x5b, 0xcb, 0x5d, 0x5c, - 0xa1, 0xb5, 0x01, 0x01, 0xe5, 0xa8, 0x91, 0xe5, 0xd0, 0xb1, 0x0e, 0x38, 0x3a, 0x00, 0xd1, 0x38, - 0x06, 0x5f, 0x45, 0x23, 0x35, 0x4f, 0xb7, 0x0c, 0xdd, 0x31, 0xe6, 0x3b, 0x5e, 0xbb, 0xe3, 0x89, - 0x46, 0xa9, 0xeb, 0x19, 0x76, 0xc7, 0xd3, 0x22, 0x14, 0xf8, 0x09, 0x34, 0xec, 0x43, 0x26, 0x1d, - 0xc7, 0x76, 0x44, 0xcb, 0xc3, 0xf5, 0x0c, 0xe2, 0x38, 0x9a, 0x4c, 0x80, 0xdf, 0x87, 0x86, 0x2b, - 0xd6, 0x5d, 0xbb, 0xc1, 0x5e, 0xdc, 0x6a, 0x33, 0xdc, 0x0e, 0x81, 0x07, 0x52, 0x66, 0x80, 0xa8, - 0x77, 0x9c, 0xa6, 0x26, 0x13, 0xaa, 0x1b, 0xd9, 0x78, 0x8c, 0xbf, 0xc3, 0xbb, 0x69, 0xb9, 0x24, - 0x3b, 0xd3, 0x81, 0x07, 0x29, 0x18, 0x84, 0xa2, 0x2f, 0x2f, 0xb3, 0x0b, 0xaf, 0xa2, 0xfe, 0x1b, - 0x64, 0x8d, 0xf9, 0x7d, 0x16, 0x42, 0x57, 0xe1, 0x3b, 0x1c, 0x26, 0x9e, 0xb8, 0xfa, 0x74, 0xea, - 0x97, 0xb3, 0xf1, 0xe8, 0x85, 0x87, 0x57, 0xd8, 0x4f, 0xa0, 0x3e, 0x10, 0x65, 0xc5, 0x3f, 0xf2, - 0x07, 0x01, 0x82, 0xb8, 0x65, 0x0f, 0x64, 0x9f, 0x4c, 0xfd, 0xf1, 0x42, 0x34, 0xa4, 0xe5, 0xe1, - 0x95, 0xde, 0x0b, 0x68, 0x70, 0xc2, 0xb6, 0x5c, 0xd3, 0xf5, 0x88, 0xd5, 0xf0, 0x15, 0xf6, 0x34, - 0x35, 0xa8, 0x1a, 0x21, 0x58, 0x7c, 0x19, 0x24, 0x50, 0xef, 0x44, 0x79, 0xf1, 0x33, 0x68, 0x00, - 0x44, 0x0e, 0x7e, 0xd2, 0x6c, 0xc2, 0x83, 0xdb, 0x82, 0x45, 0x0a, 0x8c, 0x3a, 0x49, 0x87, 0xa4, - 0xf8, 0x26, 0xea, 0x9f, 0x58, 0x31, 0x9b, 0x86, 0x43, 0x2c, 0xf0, 0x17, 0x16, 0x62, 0x1c, 0xc8, - 0x7d, 0x79, 0x19, 0xfe, 0x05, 0x5a, 0xd6, 0x9c, 0x06, 0x2f, 0x26, 0xbd, 0x8d, 0xe2, 0xb0, 0x33, - 0xdf, 0x9f, 0x45, 0x28, 0x2c, 0x80, 0x1f, 0x40, 0xd9, 0x20, 0x2b, 0x2c, 0xb8, 0xa9, 0x48, 0x1a, - 0x94, 0x85, 0xa5, 0x82, 0x8f, 0xed, 0xec, 0xa6, 0x63, 0xfb, 0x26, 0x2a, 0xb0, 0x13, 0x2f, 0xf0, - 0x24, 0x17, 0xa2, 0xec, 0xa5, 0x36, 0xf8, 0x32, 0xd0, 0xb3, 0xcd, 0x2c, 0x58, 0x9e, 0x92, 0x57, - 0x36, 0x63, 0x76, 0xa6, 0x81, 0x7a, 0xe1, 0x2f, 0x7c, 0x01, 0xe5, 0x17, 0xfc, 0x8c, 0x92, 0xc3, - 0x6c, 0x96, 0x8e, 0xc8, 0x0f, 0xf0, 0xb4, 0x9b, 0x26, 0x6c, 0xcb, 0xa3, 0x55, 0x43, 0xab, 0x87, - 0xb8, 0x5c, 0x38, 0x4c, 0x92, 0x0b, 0x87, 0xa9, 0xff, 0x2c, 0x9b, 0x10, 0x6c, 0xf5, 0xf0, 0x0e, - 0x93, 0xe7, 0x10, 0x82, 0x87, 0xd6, 0x54, 0x9e, 0xfe, 0x13, 0x0d, 0x18, 0x25, 0xc0, 0x08, 0xd4, - 0x56, 0xda, 0x76, 0x84, 0xc4, 0xea, 0x6f, 0x67, 0x62, 0x11, 0x3a, 0x77, 0x25, 0x47, 0xd1, 0x2a, - 0xcb, 0xee, 0xd0, 0x8c, 0xf5, 0xfb, 0x22, 0xb7, 0xbd, 0xbe, 0x90, 0xbf, 0x65, 0x0f, 0x2c, 0xd3, - 0xfd, 0xfc, 0x96, 0xaf, 0x65, 0x93, 0xe2, 0x95, 0x1e, 0x4c, 0x15, 0xbf, 0x16, 0x18, 0xa5, 0xf9, - 0x48, 0x84, 0x68, 0x80, 0x46, 0xb3, 0xde, 0x72, 0x33, 0xf5, 0xa3, 0xe8, 0x58, 0x24, 0x8a, 0x27, - 0x4f, 0x40, 0x7a, 0xa1, 0x7b, 0x38, 0xd0, 0xf4, 0x27, 0xfa, 0x12, 0x99, 0xfa, 0xbf, 0x33, 0xdd, - 0x63, 0xb8, 0xee, 0xbb, 0xea, 0x24, 0x08, 0x20, 0xf7, 0xd7, 0x23, 0x80, 0x3d, 0xd8, 0x06, 0x1f, - 0x6c, 0x01, 0xbc, 0x43, 0x26, 0x8f, 0xb7, 0x5b, 0x00, 0x3f, 0x9e, 0xd9, 0x34, 0x04, 0xef, 0x7e, - 0xcb, 0x40, 0xfd, 0x77, 0x99, 0xc4, 0x50, 0xb9, 0xbb, 0x6a, 0xd7, 0x8b, 0xa8, 0xc0, 0xdc, 0x6a, - 0x78, 0xab, 0x84, 0xe4, 0x42, 0x14, 0x9a, 0x96, 0x8e, 0x9b, 0x61, 0xf1, 0x0c, 0xea, 0x63, 0x6d, - 0x30, 0x78, 0x6f, 0x3c, 0xdc, 0x25, 0x5e, 0xaf, 0x91, 0x36, 0x39, 0x72, 0xb4, 0xfa, 0x5b, 0x99, - 0x58, 0xe4, 0xde, 0x7d, 0xfc, 0xb6, 0x70, 0xaa, 0xce, 0x6d, 0x7d, 0xaa, 0x56, 0xff, 0x24, 0x9b, - 0x1c, 0x38, 0x78, 0x1f, 0x3f, 0x64, 0x2f, 0x8e, 0xd3, 0x76, 0xb6, 0x6e, 0x2d, 0xa0, 0x11, 0x59, - 0x16, 0x7c, 0xd9, 0x3a, 0x9f, 0x1c, 0x3e, 0x39, 0xa5, 0x15, 0x11, 0x1e, 0xea, 0x5b, 0x99, 0x78, - 0xcc, 0xe3, 0x7d, 0x9f, 0x9f, 0x76, 0xa6, 0x2d, 0xf2, 0xa7, 0xbc, 0x43, 0xd6, 0x9a, 0xbd, 0xf8, - 0x94, 0x77, 0xc8, 0xaa, 0xb1, 0xb3, 0x4f, 0xf9, 0xd9, 0x6c, 0x5a, 0xc8, 0xe8, 0x7d, 0xff, 0xa0, - 0x0f, 0x8a, 0x42, 0x66, 0x2d, 0xe3, 0x9f, 0xf6, 0x40, 0x5a, 0x8c, 0xe6, 0x14, 0x9e, 0x31, 0x3e, - 0x3b, 0x1b, 0xe3, 0x89, 0xc2, 0x7a, 0x87, 0x28, 0xf2, 0xc1, 0x10, 0xd6, 0x3b, 0x64, 0xa8, 0xbc, - 0xf3, 0x84, 0xf5, 0xeb, 0xd9, 0xad, 0xc6, 0x29, 0x3f, 0x12, 0x5e, 0x4c, 0x78, 0x9f, 0xcd, 0xc6, - 0xe3, 0xe7, 0xef, 0xbb, 0x98, 0xa6, 0x50, 0x81, 0x47, 0xf2, 0x4f, 0x15, 0x0e, 0xc3, 0xa7, 0x59, - 0x34, 0xfc, 0x3b, 0xae, 0x21, 0x7e, 0x91, 0xb3, 0x35, 0x91, 0x30, 0x5a, 0xf5, 0x9b, 0x99, 0x48, - 0xb0, 0xf9, 0x7d, 0x39, 0x42, 0xd8, 0xd1, 0x92, 0x84, 0x5f, 0xf2, 0x0f, 0x33, 0xf3, 0x91, 0x48, - 0xc1, 0xc1, 0xf7, 0x94, 0x89, 0xa7, 0x9b, 0xcd, 0x68, 0x79, 0x1e, 0x13, 0xe0, 0xcb, 0x59, 0x34, - 0x16, 0x23, 0xc5, 0x17, 0xa4, 0x28, 0x39, 0x70, 0x2c, 0x19, 0x71, 0x1e, 0x67, 0xf1, 0x72, 0xb6, - 0x71, 0x92, 0x7a, 0x01, 0xe5, 0xcb, 0xfa, 0x1a, 0xfb, 0xb6, 0x5e, 0xc6, 0xd2, 0xd0, 0xd7, 0xc4, - 0x13, 0x37, 0xc0, 0xe3, 0x45, 0x74, 0x1f, 0xbb, 0x0f, 0x31, 0x6d, 0x6b, 0xc1, 0x6c, 0x91, 0x8a, - 0x35, 0x6b, 0x36, 0x9b, 0xa6, 0xcb, 0x2f, 0xf5, 0x1e, 0xdb, 0x58, 0x2f, 0x5e, 0xf4, 0x6c, 0x4f, - 0x6f, 0xd6, 0x89, 0x4f, 0x56, 0xf7, 0xcc, 0x16, 0xa9, 0x9b, 0x56, 0xbd, 0x05, 0x94, 0x02, 0xcb, - 0x64, 0x56, 0xb8, 0xc2, 0x82, 0x42, 0xd7, 0x1a, 0xba, 0x65, 0x11, 0xa3, 0x62, 0x8d, 0xaf, 0x79, - 0x84, 0x5d, 0x06, 0xe6, 0xd8, 0x91, 0x20, 0x7b, 0x1b, 0xce, 0xd0, 0x94, 0xf1, 0x22, 0x25, 0xd0, - 0x12, 0x0a, 0xa9, 0xbf, 0x91, 0x4f, 0xc8, 0x33, 0x70, 0x80, 0xd4, 0xc7, 0xef, 0xe9, 0xfc, 0x26, - 0x3d, 0x7d, 0x05, 0xf5, 0xf1, 0x10, 0x9f, 0xfc, 0x82, 0x01, 0x9c, 0xd9, 0xef, 0x32, 0x90, 0x78, - 0x43, 0xc3, 0xa9, 0x70, 0x13, 0x9d, 0x59, 0xa0, 0xdd, 0x94, 0xdc, 0x99, 0x85, 0x1d, 0x74, 0x66, - 0x17, 0x7e, 0xf8, 0x75, 0x74, 0x0a, 0xb0, 0x09, 0xdd, 0xda, 0x07, 0x55, 0x41, 0xe4, 0x28, 0x56, - 0x55, 0x72, 0xe7, 0xa6, 0x95, 0xc7, 0x1f, 0x44, 0x43, 0xc1, 0x00, 0x31, 0x89, 0xcb, 0x6f, 0x2e, - 0xba, 0x8c, 0x33, 0x16, 0x96, 0x8d, 0x82, 0xc1, 0x85, 0x4c, 0x0e, 0xed, 0x25, 0xf1, 0x52, 0xff, - 0x6d, 0xa6, 0x5b, 0xbe, 0x83, 0x7d, 0x9f, 0x95, 0x5f, 0x42, 0x7d, 0x06, 0xfb, 0x28, 0xae, 0x53, - 0xdd, 0x33, 0x22, 0x30, 0x52, 0xcd, 0x2f, 0xa3, 0xfe, 0x71, 0xa6, 0x6b, 0x9a, 0x85, 0x83, 0xfe, - 0x79, 0x9f, 0xcd, 0xa5, 0x7c, 0x1e, 0x9f, 0x44, 0x2f, 0xa1, 0x51, 0x33, 0x8c, 0x58, 0x5d, 0x0f, - 0xc3, 0x4f, 0x69, 0xc7, 0x04, 0x38, 0x8c, 0xae, 0x6b, 0xe8, 0xa4, 0xef, 0xf8, 0xe8, 0xf8, 0x1e, - 0x62, 0x6e, 0xbd, 0xe3, 0x98, 0x6c, 0x5c, 0x6a, 0x27, 0xdc, 0x88, 0xfb, 0x98, 0x7b, 0xd3, 0x31, - 0x69, 0x05, 0xba, 0xb7, 0x42, 0x2c, 0xbd, 0xbe, 0x6a, 0x3b, 0x77, 0x20, 0xf6, 0x27, 0x1b, 0x9c, - 0xda, 0x31, 0x06, 0xbf, 0xed, 0x83, 0xf1, 0x43, 0x68, 0x78, 0xb9, 0xd9, 0x21, 0x41, 0xb4, 0x45, - 0x76, 0xd7, 0xa7, 0x0d, 0x51, 0x60, 0x70, 0x43, 0x72, 0x0e, 0x21, 0x20, 0xf2, 0x20, 0x09, 0x06, - 0x5c, 0xec, 0x69, 0x03, 0x14, 0xb2, 0xc0, 0xbb, 0xeb, 0x0c, 0xd3, 0x6a, 0x26, 0xa4, 0x7a, 0xd3, - 0xb6, 0x96, 0xeb, 0x1e, 0x71, 0x5a, 0xd0, 0x50, 0x70, 0x66, 0xd0, 0x4e, 0x02, 0x05, 0x5c, 0x9d, - 0xb8, 0x33, 0xb6, 0xb5, 0xbc, 0x40, 0x9c, 0x16, 0x6d, 0xea, 0x63, 0x08, 0xf3, 0xa6, 0x3a, 0x70, - 0xe8, 0xc1, 0x3e, 0x0e, 0xbc, 0x19, 0x34, 0xfe, 0x11, 0xec, 0x34, 0x04, 0x3e, 0xac, 0x88, 0x06, - 0x59, 0xc8, 0x39, 0x26, 0x34, 0x70, 0x61, 0xd0, 0x10, 0x03, 0x81, 0xbc, 0x4e, 0x22, 0xee, 0x5d, - 0xc1, 0xbc, 0xba, 0x35, 0xfe, 0x4b, 0xfd, 0x54, 0x2e, 0x29, 0x33, 0xc4, 0xae, 0x14, 0x2d, 0x9c, - 0x56, 0xb3, 0xdb, 0x9a, 0x56, 0x8f, 0x59, 0x9d, 0x56, 0x5d, 0x6f, 0xb7, 0xeb, 0x4b, 0x66, 0x13, - 0x9e, 0x55, 0xc1, 0xc2, 0xa7, 0x0d, 0x5b, 0x9d, 0x56, 0xa9, 0xdd, 0x9e, 0x62, 0x40, 0xfc, 0x28, - 0x1a, 0xa3, 0x74, 0xd0, 0x49, 0x01, 0x65, 0x1e, 0x28, 0x29, 0x03, 0x88, 0xd9, 0xea, 0xd3, 0x9e, - 0x46, 0xfd, 0x9c, 0x27, 0x5b, 0xab, 0x7a, 0xb5, 0x3e, 0xc6, 0xcc, 0xa5, 0x3d, 0x17, 0xb0, 0x61, - 0x93, 0x6b, 0xaf, 0x36, 0xe0, 0x97, 0x87, 0xc8, 0xc4, 0x56, 0xa7, 0xc5, 0x22, 0x62, 0xf5, 0x01, - 0x32, 0xf8, 0x8d, 0x2f, 0xa0, 0x11, 0xca, 0x25, 0x10, 0x18, 0x0b, 0xe6, 0xda, 0xab, 0x45, 0xa0, - 0xf8, 0x2a, 0x3a, 0x21, 0x41, 0x98, 0x0d, 0xca, 0x9e, 0x09, 0xf4, 0x6a, 0x89, 0x38, 0xf5, 0xad, - 0x5c, 0x3c, 0xf1, 0xc5, 0xbe, 0xac, 0x8d, 0xd3, 0x08, 0xf1, 0xbc, 0x36, 0xe1, 0x05, 0x4d, 0xe0, - 0xb5, 0x1c, 0x62, 0x52, 0x78, 0x08, 0x65, 0xf1, 0x25, 0xd4, 0xcf, 0xbe, 0xa8, 0x52, 0xe6, 0x6b, - 0x26, 0xb8, 0x19, 0xb9, 0x6d, 0x73, 0x69, 0x09, 0x7c, 0x92, 0x02, 0x34, 0xbe, 0x80, 0xfa, 0xca, - 0x73, 0xb5, 0x5a, 0x69, 0xce, 0xbf, 0x6d, 0x84, 0x37, 0x0a, 0x86, 0xe5, 0xd6, 0x5d, 0xdd, 0x72, - 0x35, 0x1f, 0x89, 0x1f, 0x42, 0x85, 0x4a, 0x15, 0xc8, 0xd8, 0xcb, 0xbb, 0xc1, 0x8d, 0xf5, 0x62, - 0x9f, 0xd9, 0x66, 0x54, 0x1c, 0x05, 0xf5, 0xde, 0xaa, 0x94, 0x85, 0x2b, 0x77, 0x56, 0xef, 0x5d, - 0xd3, 0x80, 0xab, 0x4b, 0x2d, 0x40, 0xe3, 0xa7, 0xd1, 0x50, 0x8d, 0x38, 0xa6, 0xde, 0x9c, 0xeb, - 0xc0, 0x76, 0x83, 0xb9, 0x19, 0x8d, 0x6d, 0xac, 0x17, 0x87, 0x5d, 0x80, 0xd7, 0x2d, 0x40, 0x68, - 0x12, 0x19, 0x3e, 0x8b, 0xf2, 0xd3, 0xa6, 0xe5, 0xbb, 0xc1, 0x83, 0x9f, 0xf4, 0x8a, 0x69, 0x79, - 0x1a, 0x40, 0xd5, 0xff, 0x9a, 0x4d, 0x4e, 0x3d, 0xb2, 0x0f, 0x63, 0x6b, 0x87, 0xb7, 0x85, 0x11, - 0x25, 0xc8, 0xef, 0x42, 0x09, 0x96, 0xd0, 0xb1, 0x92, 0xd1, 0x32, 0xad, 0x12, 0xfc, 0x74, 0x67, - 0xa7, 0x4a, 0x30, 0x20, 0x85, 0x67, 0x58, 0x11, 0x34, 0xff, 0x1e, 0x16, 0x6e, 0x95, 0xa2, 0xea, - 0x3a, 0xc3, 0xd5, 0x5b, 0x4b, 0x7a, 0xbd, 0xc1, 0xb2, 0x76, 0x68, 0x51, 0xa6, 0xea, 0xf7, 0x65, - 0x37, 0xc9, 0x96, 0x72, 0x18, 0xa5, 0xaf, 0x7e, 0x2e, 0xdb, 0x3d, 0x61, 0xcd, 0xa1, 0x14, 0xca, - 0x9f, 0x67, 0x13, 0xd2, 0xc7, 0xec, 0x4a, 0x12, 0x97, 0x50, 0x3f, 0x63, 0x13, 0xb8, 0x6b, 0xc2, - 0x8c, 0xc3, 0x94, 0x15, 0x66, 0x3a, 0x1f, 0x8d, 0xe7, 0xd0, 0x89, 0xd2, 0xd2, 0x12, 0x69, 0x78, - 0x61, 0xe0, 0xdd, 0xb9, 0x30, 0xd8, 0x26, 0x8b, 0x56, 0xca, 0xf1, 0x61, 0xe0, 0x5e, 0x08, 0x2a, - 0x91, 0x58, 0x0e, 0x2f, 0xa0, 0x93, 0x51, 0x78, 0x8d, 0x99, 0x7a, 0x79, 0x21, 0x80, 0x69, 0x8c, - 0x23, 0xfb, 0x4f, 0x4b, 0x29, 0x9b, 0xd4, 0x4a, 0x98, 0x4e, 0x7b, 0xbb, 0xb5, 0x12, 0xe6, 0xd6, - 0xc4, 0x72, 0xea, 0x97, 0x73, 0x62, 0x96, 0x9d, 0xc3, 0xeb, 0x58, 0x73, 0x4d, 0x72, 0xa7, 0xdd, - 0xea, 0x90, 0x79, 0x9a, 0x47, 0x8a, 0x30, 0x3a, 0x8e, 0xef, 0x79, 0x16, 0xbc, 0x54, 0x07, 0xa0, - 0xe8, 0x43, 0x16, 0x50, 0xe2, 0x0a, 0xca, 0x97, 0x9c, 0x65, 0x66, 0xc6, 0x6c, 0xf6, 0x78, 0x46, - 0x77, 0x96, 0xdd, 0xe4, 0xc7, 0x33, 0x94, 0x85, 0xfa, 0xbd, 0xd9, 0x2e, 0x59, 0x78, 0x0e, 0xe5, - 0x24, 0xf2, 0x23, 0xd9, 0xb4, 0x7c, 0x3a, 0x07, 0xd5, 0x45, 0xe8, 0x6d, 0x16, 0xce, 0xc1, 0xf6, - 0x9f, 0xda, 0x63, 0xe1, 0xa4, 0xe4, 0xf6, 0x39, 0x12, 0xce, 0xa7, 0xb2, 0x69, 0xe9, 0x8d, 0x0e, - 0xed, 0x2c, 0x93, 0x92, 0x51, 0xe9, 0x48, 0x57, 0x7e, 0x34, 0x9b, 0x9a, 0x54, 0xea, 0x48, 0x3a, - 0xea, 0xa7, 0xb3, 0xa9, 0x49, 0xb1, 0x0e, 0xe5, 0x50, 0x4a, 0xd4, 0x96, 0xa3, 0xb1, 0xc4, 0xa5, - 0xf3, 0x3d, 0xb9, 0x78, 0x1a, 0xb2, 0x43, 0x79, 0x5e, 0x31, 0x8e, 0xfa, 0xfd, 0x0d, 0x0d, 0xb7, - 0xd1, 0xb7, 0xdc, 0x9d, 0x7e, 0x39, 0xfc, 0x32, 0x3a, 0x16, 0xca, 0x52, 0x0c, 0x47, 0x02, 0x17, - 0x41, 0x0d, 0x8a, 0xaa, 0xbf, 0x41, 0x71, 0xfc, 0xdd, 0x7c, 0x94, 0x5a, 0xfd, 0x66, 0x2e, 0x9e, - 0xcb, 0xed, 0xa8, 0x37, 0x76, 0xd8, 0x1b, 0x37, 0xd1, 0xc9, 0x89, 0x8e, 0xe3, 0x10, 0xcb, 0x4b, - 0xee, 0x14, 0x38, 0x69, 0x6a, 0x30, 0x8a, 0x7a, 0xbc, 0x73, 0x52, 0x0a, 0x53, 0xb6, 0xdc, 0xe5, - 0x32, 0xca, 0xb6, 0x2f, 0x64, 0xdb, 0x61, 0x14, 0x49, 0x6c, 0x93, 0x0b, 0xab, 0xbf, 0x93, 0x8d, - 0x67, 0xdf, 0x3b, 0xea, 0xfa, 0x9d, 0x75, 0xfd, 0xa3, 0xb3, 0x2c, 0x9b, 0xc9, 0x0d, 0xd3, 0x32, - 0xf0, 0x69, 0x74, 0xdf, 0xcd, 0xda, 0xa4, 0x56, 0xbf, 0x51, 0x99, 0x2b, 0xd7, 0x6f, 0xce, 0xd5, - 0xaa, 0x93, 0x13, 0x95, 0xa9, 0xca, 0x64, 0x79, 0xb4, 0x07, 0x1f, 0x47, 0xc7, 0x42, 0xd4, 0xf4, - 0xcd, 0xd9, 0xd2, 0xdc, 0x68, 0x06, 0x8f, 0xa1, 0xe1, 0x10, 0x38, 0x3e, 0xbf, 0x30, 0x9a, 0x7d, - 0xf4, 0x3d, 0x68, 0x10, 0xae, 0x6b, 0xd8, 0xb1, 0x23, 0x1e, 0x42, 0xfd, 0xf3, 0xe3, 0xb5, 0x49, - 0xed, 0x16, 0x30, 0x41, 0xa8, 0x50, 0x9e, 0x9c, 0xa3, 0x0c, 0x33, 0x8f, 0xfe, 0x8f, 0x0c, 0x42, - 0xb5, 0xa9, 0x85, 0x2a, 0x27, 0x1c, 0x44, 0x7d, 0x95, 0xb9, 0x5b, 0xa5, 0x99, 0x0a, 0xa5, 0xeb, - 0x47, 0xf9, 0xf9, 0xea, 0x24, 0xad, 0x61, 0x00, 0xf5, 0x4e, 0xcc, 0xcc, 0xd7, 0x26, 0x47, 0xb3, - 0x14, 0xa8, 0x4d, 0x96, 0xca, 0xa3, 0x39, 0x0a, 0xbc, 0xad, 0x55, 0x16, 0x26, 0x47, 0xf3, 0xf4, - 0xcf, 0x99, 0xda, 0x42, 0x69, 0x61, 0xb4, 0x97, 0xfe, 0x39, 0x05, 0x7f, 0x16, 0x28, 0xb3, 0xda, - 0xe4, 0x02, 0xfc, 0xe8, 0xa3, 0x4d, 0x98, 0xf2, 0x7f, 0xf5, 0x53, 0x14, 0x65, 0x5d, 0xae, 0x68, - 0xa3, 0x03, 0xf4, 0x07, 0x65, 0x49, 0x7f, 0x20, 0xda, 0x38, 0x6d, 0x72, 0x76, 0xfe, 0xd6, 0xe4, - 0xe8, 0x20, 0xe5, 0x35, 0x7b, 0x83, 0x82, 0x87, 0xe8, 0x9f, 0xda, 0x2c, 0xfd, 0x73, 0x98, 0x72, - 0xd2, 0x26, 0x4b, 0x33, 0xd5, 0xd2, 0xc2, 0xf4, 0xe8, 0x08, 0x6d, 0x0f, 0xf0, 0x3c, 0xc6, 0x4a, - 0xce, 0x95, 0x66, 0x27, 0x47, 0x47, 0x39, 0x4d, 0x79, 0xa6, 0x32, 0x77, 0x63, 0x74, 0x0c, 0x1a, - 0xf2, 0xfa, 0x2c, 0xfc, 0xc0, 0xb4, 0x00, 0xfc, 0x75, 0xfc, 0xd1, 0x0f, 0xa3, 0xc2, 0x7c, 0x0d, - 0x0e, 0xd7, 0x4f, 0xa1, 0xe3, 0xf3, 0xb5, 0xfa, 0xc2, 0xeb, 0xd5, 0xc9, 0x88, 0xbc, 0xc7, 0xd0, - 0xb0, 0x8f, 0x98, 0xa9, 0xcc, 0xdd, 0xfc, 0x00, 0x93, 0xb6, 0x0f, 0x9a, 0x2d, 0x4d, 0xcc, 0xd7, - 0x46, 0xb3, 0xb4, 0x57, 0x7c, 0xd0, 0xed, 0xca, 0x5c, 0x79, 0xfe, 0x76, 0x6d, 0x34, 0xf7, 0xe8, - 0x5d, 0x34, 0xc4, 0x72, 0xc1, 0xcc, 0x3b, 0xe6, 0xb2, 0x69, 0xe1, 0x73, 0xe8, 0x74, 0x79, 0xf2, - 0x56, 0x65, 0x62, 0xb2, 0x3e, 0xaf, 0x55, 0xae, 0x57, 0xe6, 0x22, 0x35, 0xdd, 0x87, 0xc6, 0x64, - 0x74, 0xa9, 0x5a, 0x19, 0xcd, 0xe0, 0x93, 0x08, 0xcb, 0xe0, 0x57, 0x4b, 0xb3, 0x53, 0xa3, 0x59, - 0xac, 0xa0, 0x13, 0x32, 0xbc, 0x32, 0xb7, 0x70, 0x73, 0x6e, 0x72, 0x34, 0xf7, 0xe8, 0x4f, 0x66, - 0xd0, 0x7d, 0x89, 0xf1, 0xc2, 0xb0, 0x8a, 0xce, 0x4f, 0xce, 0x94, 0x6a, 0x0b, 0x95, 0x89, 0xda, - 0x64, 0x49, 0x9b, 0x98, 0xae, 0x4f, 0x94, 0x16, 0x26, 0xaf, 0xcf, 0x6b, 0xaf, 0xd7, 0xaf, 0x4f, - 0xce, 0x4d, 0x6a, 0xa5, 0x99, 0xd1, 0x1e, 0xfc, 0x10, 0x2a, 0xa6, 0xd0, 0xd4, 0x26, 0x27, 0x6e, - 0x6a, 0x95, 0x85, 0xd7, 0x47, 0x33, 0xf8, 0x41, 0x74, 0x2e, 0x95, 0x88, 0xfe, 0x1e, 0xcd, 0xe2, - 0xf3, 0xe8, 0x4c, 0x1a, 0xc9, 0x6b, 0x33, 0xa3, 0xb9, 0x47, 0x7f, 0x28, 0x83, 0x70, 0x3c, 0xe0, - 0x13, 0x7e, 0x00, 0x9d, 0xa5, 0x7a, 0x51, 0x4f, 0x6f, 0xe0, 0x83, 0xe8, 0x5c, 0x22, 0x85, 0xd0, - 0xbc, 0x22, 0xba, 0x3f, 0x85, 0x84, 0x37, 0xee, 0x2c, 0x52, 0x92, 0x09, 0xa0, 0x69, 0x5f, 0xcc, - 0xa0, 0xfb, 0x12, 0x4f, 0xfa, 0xf1, 0x45, 0xf4, 0x70, 0xa9, 0x3c, 0x4b, 0xfb, 0x66, 0x62, 0xa1, - 0x32, 0x3f, 0x57, 0xab, 0xcf, 0x4e, 0x95, 0xea, 0x54, 0xfb, 0x6e, 0xd6, 0x22, 0xbd, 0x79, 0x01, - 0xa9, 0x5d, 0x28, 0x27, 0xa6, 0x4b, 0x73, 0xd7, 0xe9, 0xf0, 0xc3, 0x0f, 0xa3, 0x07, 0x52, 0xe9, - 0x26, 0xe7, 0x4a, 0xe3, 0x33, 0x93, 0xe5, 0xd1, 0x2c, 0x7e, 0x04, 0x3d, 0x98, 0x4a, 0x55, 0xae, - 0xd4, 0x18, 0x59, 0x6e, 0xbc, 0xfc, 0xd6, 0xbf, 0x3f, 0xdf, 0xf3, 0xd6, 0xd7, 0xcf, 0x67, 0x7e, - 0xef, 0xeb, 0xe7, 0x33, 0x7f, 0xf2, 0xf5, 0xf3, 0x99, 0x0f, 0x5e, 0xdd, 0x4e, 0x20, 0x2f, 0x36, - 0x65, 0x2d, 0x16, 0xe0, 0xd4, 0xed, 0xa9, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x77, 0xa4, 0x7e, - 0x4d, 0x3b, 0x69, 0x01, 0x00, + 0xba, 0x63, 0x77, 0xda, 0x7e, 0x42, 0x05, 0xc8, 0x91, 0xbb, 0x1a, 0xe0, 0xea, 0xcb, 0x80, 0x14, + 0x58, 0xc4, 0x0a, 0xe2, 0x69, 0x74, 0x2c, 0x84, 0x51, 0x11, 0xf9, 0x89, 0x5c, 0x20, 0x47, 0xb4, + 0xc0, 0x8b, 0x8a, 0x53, 0x64, 0x15, 0x2d, 0x86, 0x2b, 0xa8, 0xcf, 0x0f, 0x10, 0xd6, 0xbf, 0xa5, + 0x92, 0x1e, 0xe7, 0x01, 0xc2, 0xfa, 0xc4, 0xd0, 0x60, 0x7e, 0x79, 0x3c, 0x85, 0x46, 0x34, 0xbb, + 0xe3, 0x91, 0x05, 0x9b, 0x5b, 0xf3, 0x3c, 0xd2, 0x3f, 0xb4, 0xc9, 0xa1, 0x98, 0xba, 0x67, 0xfb, + 0x29, 0x86, 0xc5, 0x54, 0xb7, 0x72, 0x29, 0x3c, 0x87, 0xc6, 0x62, 0x37, 0xb0, 0x62, 0xe2, 0x5f, + 0xe1, 0xf3, 0xe2, 0xcc, 0xe2, 0x45, 0xf1, 0x77, 0x67, 0x50, 0x61, 0xc1, 0xd1, 0x4d, 0xcf, 0xe5, + 0xaf, 0xd0, 0xee, 0xbb, 0xbc, 0xe6, 0xe8, 0x6d, 0xaa, 0x1f, 0x97, 0x21, 0x52, 0xe5, 0x2d, 0xbd, + 0xd9, 0x21, 0xee, 0xf8, 0x6d, 0xfa, 0x75, 0xff, 0x6a, 0xa3, 0xf8, 0xc2, 0x32, 0x9c, 0xf3, 0x5c, + 0x6e, 0xd8, 0xad, 0x2b, 0xcb, 0x8e, 0x7e, 0xc7, 0xf4, 0x60, 0xdd, 0xd7, 0x9b, 0x57, 0x3c, 0xd2, + 0x84, 0xe3, 0xa4, 0x2b, 0x7a, 0xdb, 0xbc, 0x02, 0x11, 0x91, 0xaf, 0x04, 0x9c, 0x58, 0x0d, 0x54, + 0x05, 0x3c, 0xf8, 0x4b, 0x54, 0x01, 0x86, 0xc3, 0x73, 0x08, 0xf1, 0x4f, 0x2d, 0xb5, 0xdb, 0xfc, + 0x49, 0x9b, 0x70, 0x08, 0xe3, 0x63, 0x98, 0x62, 0x07, 0x02, 0xd3, 0xdb, 0x6d, 0x31, 0xb5, 0x78, + 0x48, 0x47, 0xb5, 0x60, 0x81, 0xb7, 0xc8, 0x17, 0xd3, 0x70, 0x28, 0x71, 0xbf, 0xb1, 0x09, 0x42, + 0x8a, 0x16, 0xc3, 0x8b, 0xe8, 0x18, 0xe7, 0x1b, 0x84, 0xde, 0x1f, 0x91, 0x67, 0x85, 0x08, 0x9a, + 0x29, 0x6d, 0xd0, 0x46, 0x83, 0x83, 0xc5, 0x3a, 0x22, 0x25, 0xf0, 0x78, 0x98, 0x75, 0x72, 0x4e, + 0x6f, 0x11, 0x57, 0x39, 0x06, 0x1a, 0x7b, 0x76, 0x73, 0xa3, 0xa8, 0xf8, 0xe5, 0x21, 0x56, 0x5e, + 0x62, 0x06, 0x66, 0x28, 0x22, 0xf2, 0x60, 0x5a, 0x3f, 0x9a, 0xc0, 0x23, 0xaa, 0xf3, 0x72, 0x11, + 0x3c, 0x81, 0x86, 0x03, 0x8f, 0xfa, 0x9b, 0x37, 0x2b, 0x65, 0x78, 0x33, 0x37, 0x30, 0x7e, 0x6e, + 0x73, 0xa3, 0x78, 0x3a, 0x12, 0xd5, 0x5f, 0x64, 0x22, 0x95, 0x11, 0xc2, 0x10, 0xb0, 0x47, 0x74, + 0x91, 0x30, 0x04, 0xed, 0x84, 0x30, 0x04, 0x55, 0xfc, 0x12, 0x1a, 0x2c, 0xdd, 0xae, 0xf1, 0xf0, + 0x0a, 0xae, 0x72, 0x3c, 0x4c, 0xa7, 0x02, 0x49, 0xb8, 0x79, 0x28, 0x06, 0xb1, 0xe9, 0x22, 0x3d, + 0x9e, 0x44, 0x23, 0x92, 0x53, 0x8e, 0xab, 0x9c, 0x00, 0x0e, 0xd0, 0x72, 0x1d, 0x30, 0x75, 0x87, + 0xa3, 0xa4, 0xb4, 0xf0, 0x52, 0x21, 0xaa, 0x35, 0x65, 0xd3, 0x85, 0xd4, 0x14, 0x1a, 0x81, 0x48, + 0x0e, 0xf0, 0x02, 0xaf, 0x9f, 0x69, 0x8d, 0xc1, 0x51, 0x75, 0x87, 0xe1, 0xa4, 0x3c, 0xf0, 0x72, + 0x31, 0xfc, 0x06, 0xc2, 0x90, 0xcc, 0x82, 0x18, 0xfe, 0x1d, 0x4d, 0xa5, 0xec, 0x2a, 0x27, 0x21, + 0x62, 0x2f, 0x8e, 0xbe, 0x1c, 0xaf, 0x94, 0xc7, 0x2f, 0xf0, 0xe9, 0xe3, 0xbc, 0xce, 0x4a, 0xd5, + 0xfd, 0x57, 0xe3, 0x75, 0xd3, 0x10, 0x5b, 0x9c, 0xc0, 0x15, 0xaf, 0xa1, 0x53, 0x55, 0x87, 0xdc, + 0x31, 0xed, 0x8e, 0xeb, 0x2f, 0x1f, 0xfe, 0xbc, 0x75, 0x6a, 0xcb, 0x79, 0xeb, 0x41, 0x5e, 0xf1, + 0x7d, 0x6d, 0x87, 0xdc, 0xa9, 0xfb, 0x71, 0x5a, 0xa5, 0x00, 0x87, 0x69, 0xdc, 0xa9, 0xb8, 0x20, + 0x8a, 0x05, 0x87, 0x9b, 0xc4, 0x55, 0x94, 0x70, 0xaa, 0x65, 0x41, 0x39, 0xcc, 0x00, 0x27, 0x8a, + 0x2b, 0x52, 0x0c, 0x6b, 0x08, 0x5f, 0x9f, 0xf0, 0xef, 0xeb, 0x4a, 0x0d, 0x96, 0xd5, 0x51, 0x39, + 0x0d, 0xcc, 0x54, 0x2a, 0x96, 0xe5, 0x46, 0x10, 0xb3, 0xb9, 0xae, 0x73, 0xbc, 0x28, 0x96, 0x78, + 0x69, 0x3c, 0x83, 0x46, 0xab, 0x0e, 0x1c, 0x3d, 0xdc, 0x20, 0xeb, 0x55, 0xbb, 0x69, 0x36, 0xd6, + 0xe1, 0x21, 0x20, 0x9f, 0x2a, 0xdb, 0x0c, 0x57, 0x5f, 0x25, 0xeb, 0xf5, 0x36, 0x60, 0xc5, 0x65, + 0x25, 0x5a, 0x52, 0x8c, 0xa1, 0x7a, 0xff, 0xf6, 0x62, 0xa8, 0x12, 0x34, 0xca, 0x6f, 0xfb, 0xee, + 0x7a, 0xc4, 0xa2, 0x4b, 0xbd, 0xcb, 0x1f, 0xfd, 0x29, 0x91, 0xdb, 0xc1, 0x00, 0xcf, 0x73, 0xc2, + 0xb3, 0x51, 0x46, 0x02, 0xb0, 0xd8, 0xb0, 0x68, 0x11, 0xf5, 0x33, 0x39, 0x71, 0xea, 0xc4, 0x67, + 0x51, 0x5e, 0x48, 0xe1, 0x01, 0xa1, 0x17, 0x21, 0xdc, 0x71, 0x9e, 0xc7, 0x75, 0x1d, 0xe0, 0x66, + 0x47, 0x10, 0x23, 0x04, 0xf2, 0x9b, 0xf9, 0x71, 0x95, 0x4d, 0x43, 0x0b, 0x09, 0x20, 0xb7, 0x54, + 0x67, 0xb1, 0x69, 0x36, 0x20, 0x08, 0x76, 0x4e, 0x08, 0x0a, 0x00, 0x50, 0x16, 0x03, 0x5b, 0x20, + 0xc1, 0x57, 0xd1, 0xa0, 0x7f, 0x5a, 0x15, 0x86, 0x1e, 0x85, 0xd8, 0xc8, 0x7e, 0xf6, 0x7c, 0x16, + 0x7a, 0x59, 0x20, 0xc2, 0xcf, 0x23, 0x14, 0x8e, 0x64, 0x6e, 0x24, 0xc1, 0x2c, 0x2f, 0x0e, 0x7c, + 0x71, 0x96, 0x0f, 0xa9, 0xe9, 0x9c, 0x27, 0x6a, 0x92, 0x9f, 0x4d, 0x0f, 0xe6, 0x3c, 0x49, 0xfd, + 0xc4, 0xbe, 0x95, 0x8b, 0xe0, 0x79, 0x34, 0x16, 0x53, 0x1e, 0x1e, 0xa8, 0x14, 0xf2, 0xf6, 0x26, + 0x68, 0x9e, 0xb8, 0xa6, 0xc6, 0xca, 0xaa, 0xdf, 0x91, 0x8d, 0xad, 0x18, 0x54, 0x30, 0x9c, 0x4a, + 0xe8, 0x1c, 0x10, 0x8c, 0xcf, 0x9a, 0x09, 0x46, 0x20, 0xc2, 0x17, 0x51, 0x7f, 0x95, 0x8e, 0xd7, + 0x86, 0xdd, 0xe4, 0x5d, 0x05, 0x11, 0x79, 0xda, 0x1c, 0xa6, 0x05, 0x58, 0x7c, 0x55, 0xc8, 0xef, + 0x28, 0x04, 0xf8, 0xf5, 0xf3, 0x3b, 0x8a, 0x13, 0x6e, 0x90, 0xe9, 0xf1, 0x6a, 0x24, 0x95, 0x8c, + 0x9f, 0xe9, 0x3f, 0xbe, 0x5a, 0x85, 0x89, 0xb2, 0x02, 0x5b, 0xb1, 0x77, 0x2b, 0x5b, 0x51, 0xfd, + 0xed, 0x4c, 0x5c, 0xfb, 0xf1, 0xb5, 0x78, 0x94, 0x4f, 0x96, 0xe4, 0xdf, 0x07, 0x8a, 0xb5, 0x06, + 0xf1, 0x3e, 0xa5, 0x78, 0x9d, 0xd9, 0x5d, 0xc7, 0xeb, 0xcc, 0xed, 0x30, 0x5e, 0xa7, 0xfa, 0xdf, + 0xf3, 0x5d, 0x7d, 0x46, 0x0f, 0x24, 0x2e, 0xd5, 0x73, 0x74, 0xbf, 0x43, 0x6b, 0x2f, 0xb9, 0x31, + 0xab, 0x9d, 0xb9, 0xc4, 0xd5, 0x75, 0x36, 0x6a, 0x5c, 0x4d, 0xa6, 0xc4, 0x2f, 0xa3, 0x21, 0xff, + 0x03, 0x20, 0x0e, 0xac, 0x10, 0xbf, 0x34, 0x58, 0x6b, 0x22, 0x11, 0x53, 0xa5, 0x02, 0xf8, 0x69, + 0x34, 0x00, 0x96, 0x46, 0x5b, 0x6f, 0xf8, 0x41, 0x82, 0x59, 0x54, 0x61, 0x1f, 0x28, 0xc6, 0x5e, + 0x0a, 0x28, 0xf1, 0x47, 0x50, 0x81, 0xc7, 0xab, 0x67, 0xa9, 0x8f, 0xaf, 0x6c, 0xc3, 0xc9, 0xf6, + 0xb2, 0x18, 0xab, 0x9e, 0xed, 0x1d, 0x00, 0x20, 0xed, 0x1d, 0x58, 0x98, 0xfa, 0x05, 0x74, 0xbc, + 0xea, 0x10, 0x03, 0xdc, 0xb9, 0x27, 0xef, 0xb6, 0x1d, 0x9e, 0x49, 0x80, 0x0d, 0x60, 0x58, 0x3a, + 0xda, 0x3e, 0x9a, 0x2e, 0x6a, 0x1c, 0x2f, 0x30, 0x4a, 0x2a, 0x4e, 0xed, 0x09, 0xd6, 0x92, 0x1b, + 0x64, 0x7d, 0xcd, 0x76, 0x0c, 0x16, 0x6c, 0x9f, 0xdb, 0x13, 0x5c, 0xd0, 0xab, 0x1c, 0x25, 0xda, + 0x13, 0x72, 0xa1, 0x33, 0xcf, 0xa1, 0xc1, 0xdd, 0xc6, 0x7b, 0xff, 0x95, 0x6c, 0xca, 0xeb, 0x8b, + 0x7b, 0x37, 0x4f, 0x5f, 0x90, 0x33, 0xb5, 0x37, 0x25, 0x67, 0xea, 0x37, 0xb3, 0x29, 0x4f, 0x4b, + 0xee, 0xe9, 0xdc, 0x86, 0x81, 0x30, 0xe4, 0xdc, 0x86, 0x61, 0x5a, 0x49, 0xd3, 0xd0, 0x44, 0xa2, + 0x48, 0x16, 0xd4, 0xc2, 0x96, 0x59, 0x50, 0x7f, 0x36, 0xd7, 0xed, 0xe9, 0xcd, 0x91, 0xec, 0x77, + 0x22, 0xfb, 0xab, 0x68, 0x30, 0x90, 0x6c, 0xa5, 0x0c, 0xf6, 0xcc, 0x70, 0x90, 0x5d, 0x82, 0x81, + 0xa1, 0x8c, 0x40, 0x84, 0x2f, 0xb1, 0xb6, 0xd6, 0xcc, 0x37, 0x59, 0x84, 0xf5, 0x61, 0x1e, 0x3b, + 0x5b, 0xf7, 0xf4, 0xba, 0x6b, 0xbe, 0x49, 0xb4, 0x00, 0xad, 0xfe, 0xc3, 0x6c, 0xe2, 0xfb, 0xa5, + 0xa3, 0x3e, 0xda, 0x41, 0x1f, 0x25, 0x08, 0x91, 0xbd, 0xbc, 0x3a, 0x12, 0xe2, 0x0e, 0x84, 0xf8, + 0x17, 0xd9, 0xc4, 0x77, 0x6a, 0x47, 0x42, 0xdc, 0xc9, 0x6c, 0xf1, 0x18, 0x1a, 0xd0, 0xec, 0x35, + 0x77, 0x02, 0xf6, 0x2c, 0x6c, 0xae, 0x80, 0x89, 0xda, 0xb1, 0xd7, 0xdc, 0x3a, 0xec, 0x46, 0xb4, + 0x90, 0x40, 0xfd, 0x56, 0xb6, 0xcb, 0x4b, 0xbe, 0x23, 0xc1, 0xbf, 0x9d, 0x4b, 0xe4, 0xaf, 0x67, + 0xa5, 0x97, 0x82, 0xf7, 0x74, 0x92, 0xf0, 0x5a, 0x63, 0x85, 0xb4, 0xf4, 0x68, 0x92, 0x70, 0x17, + 0xa0, 0x3c, 0xc7, 0x68, 0x48, 0xa2, 0x7e, 0x29, 0x1b, 0x79, 0x2a, 0x79, 0x24, 0xbb, 0x6d, 0xcb, + 0x2e, 0xd0, 0x3a, 0xfe, 0xfa, 0xf3, 0x48, 0x72, 0xdb, 0x95, 0xdc, 0x27, 0xb2, 0x91, 0x87, 0xb2, + 0xf7, 0x6e, 0xbe, 0xe0, 0x2f, 0x65, 0xe3, 0x8f, 0x7e, 0xef, 0x5d, 0x4d, 0x7a, 0x0c, 0x0d, 0x70, + 0x39, 0x04, 0x4b, 0x05, 0x9b, 0xf7, 0x19, 0x10, 0x0e, 0x50, 0x03, 0x02, 0xf5, 0xbb, 0xb2, 0x48, + 0x7e, 0xc0, 0x7c, 0x8f, 0xea, 0xd0, 0xaf, 0x67, 0xe5, 0xa7, 0xdb, 0xf7, 0xae, 0xfe, 0x5c, 0x46, + 0xa8, 0xd6, 0x59, 0x6c, 0xf0, 0xc8, 0x9f, 0xbd, 0xc2, 0x09, 0x7c, 0x00, 0xd5, 0x04, 0x0a, 0xf5, + 0x7f, 0x64, 0x13, 0xdf, 0x93, 0xdf, 0xbb, 0x02, 0x7c, 0x0a, 0x4e, 0xc5, 0x1b, 0x56, 0x38, 0x91, + 0xc3, 0x21, 0x24, 0x1d, 0x7f, 0xb1, 0xd4, 0x66, 0x3e, 0x21, 0x7e, 0x5f, 0x82, 0xb9, 0x06, 0x81, + 0xe3, 0x43, 0x73, 0x4d, 0xbc, 0x61, 0x10, 0x0c, 0xb7, 0xdf, 0xcb, 0x6e, 0xf5, 0xfc, 0xfe, 0x5e, + 0x5e, 0x55, 0xfb, 0xaa, 0xfa, 0x3a, 0x84, 0x89, 0xa3, 0x3d, 0x31, 0xc4, 0x12, 0x6f, 0xb5, 0x19, + 0x48, 0xbc, 0x11, 0xe3, 0x54, 0xea, 0x9f, 0xf5, 0x26, 0xbf, 0xfd, 0xbe, 0x77, 0x45, 0x78, 0x16, + 0xe5, 0xab, 0xba, 0xb7, 0xc2, 0x35, 0x19, 0x6e, 0xeb, 0xda, 0xba, 0xb7, 0xa2, 0x01, 0x14, 0x5f, + 0x42, 0xfd, 0x9a, 0xbe, 0xc6, 0xce, 0x3c, 0x0b, 0x61, 0x52, 0x34, 0x47, 0x5f, 0xab, 0xb3, 0x73, + 0xcf, 0x00, 0x8d, 0xd5, 0x20, 0x29, 0x1f, 0x3b, 0xf9, 0x86, 0x8c, 0x56, 0x2c, 0x29, 0x5f, 0x90, + 0x8a, 0xef, 0x2c, 0xca, 0x8f, 0xdb, 0xc6, 0x3a, 0x38, 0xb3, 0x0c, 0xb1, 0xca, 0x16, 0x6d, 0x63, + 0x5d, 0x03, 0x28, 0xfe, 0x64, 0x06, 0xf5, 0x4d, 0x13, 0xdd, 0xa0, 0x23, 0x64, 0xa0, 0x9b, 0x2f, + 0xc8, 0x07, 0xf6, 0xc7, 0x17, 0x64, 0x6c, 0x85, 0x55, 0x26, 0x2a, 0x0a, 0xaf, 0x1f, 0x5f, 0x47, + 0xfd, 0x13, 0xba, 0x47, 0x96, 0x6d, 0x67, 0x1d, 0xbc, 0x5b, 0x46, 0x42, 0x4f, 0x67, 0x49, 0x7f, + 0x7c, 0x22, 0x76, 0x33, 0xd6, 0xe0, 0xbf, 0xb4, 0xa0, 0x30, 0x15, 0x0b, 0x4f, 0xd6, 0x3d, 0x18, + 0x8a, 0x85, 0x65, 0xe5, 0x0e, 0x72, 0x72, 0x07, 0xc7, 0xca, 0x43, 0xc9, 0xc7, 0xca, 0x60, 0x3d, + 0x82, 0x07, 0x1c, 0xa4, 0xc2, 0x1b, 0x86, 0x45, 0x9f, 0x59, 0x8f, 0x00, 0x85, 0x4c, 0x78, 0x9a, + 0x40, 0xa2, 0x7e, 0xbd, 0x17, 0x25, 0xbe, 0x14, 0x3d, 0x52, 0xf2, 0x23, 0x25, 0x0f, 0x95, 0xbc, + 0x1c, 0x53, 0xf2, 0x33, 0xf1, 0xb7, 0xc7, 0xef, 0x50, 0x0d, 0xff, 0xe1, 0x7c, 0x2c, 0x72, 0xc1, + 0xbd, 0xbd, 0xbb, 0x0c, 0xa5, 0xd7, 0xbb, 0xa5, 0xf4, 0x82, 0x01, 0x51, 0xd8, 0x72, 0x40, 0xf4, + 0x6d, 0x77, 0x40, 0xf4, 0xa7, 0x0e, 0x88, 0x50, 0x41, 0x06, 0x52, 0x15, 0xa4, 0xc2, 0x07, 0x0d, + 0xea, 0x9e, 0x40, 0xe1, 0xec, 0xe6, 0x46, 0x71, 0x84, 0x8e, 0xa6, 0xc4, 0xcc, 0x09, 0xc0, 0x42, + 0xfd, 0x6a, 0xbe, 0x4b, 0xb8, 0x91, 0x03, 0xd1, 0x91, 0xa7, 0x50, 0xae, 0xd4, 0x6e, 0x73, 0xfd, + 0x38, 0x2e, 0x44, 0x3a, 0x49, 0x29, 0x45, 0xa9, 0xf1, 0xf3, 0x28, 0x57, 0xba, 0x5d, 0x8b, 0x26, + 0x4d, 0x28, 0xdd, 0xae, 0xf1, 0x2f, 0x49, 0x2d, 0x7b, 0xbb, 0x86, 0x5f, 0x0c, 0xa3, 0x17, 0xae, + 0x74, 0xac, 0x55, 0xbe, 0x51, 0xe4, 0x4e, 0xb0, 0xbe, 0xa7, 0x4d, 0x83, 0xa2, 0xe8, 0x76, 0x31, + 0x42, 0x1b, 0xd1, 0xa6, 0xc2, 0xf6, 0xb5, 0xa9, 0x6f, 0x4b, 0x6d, 0xea, 0xdf, 0xae, 0x36, 0x0d, + 0x6c, 0x43, 0x9b, 0xd0, 0x96, 0xda, 0x34, 0xb8, 0x77, 0x6d, 0x6a, 0xa3, 0x33, 0xf1, 0x10, 0x51, + 0x81, 0x46, 0x68, 0x08, 0xc7, 0xb1, 0xdc, 0xb1, 0x04, 0xae, 0xfe, 0x3b, 0x0c, 0x5b, 0x67, 0x49, + 0xf5, 0xa3, 0x29, 0xe9, 0xb5, 0x84, 0xd2, 0xea, 0xaf, 0x64, 0xd3, 0x23, 0x5b, 0x1d, 0xce, 0x29, + 0xee, 0xdb, 0x12, 0xa5, 0x94, 0x97, 0x5f, 0x1a, 0xa7, 0x4b, 0x39, 0xc2, 0x36, 0x49, 0x66, 0x5f, + 0xc9, 0xa4, 0x85, 0xdb, 0xda, 0x93, 0xc4, 0x1e, 0x89, 0x3b, 0xab, 0x81, 0xf7, 0xbc, 0x2b, 0x7b, + 0xa9, 0x45, 0x73, 0xb4, 0xe7, 0x76, 0x99, 0xa3, 0xfd, 0xb7, 0x33, 0xe8, 0xf8, 0x8d, 0xce, 0x22, + 0xe1, 0xce, 0x69, 0x41, 0x33, 0xde, 0x40, 0x88, 0x82, 0xb9, 0x13, 0x4b, 0x06, 0x9c, 0x58, 0xde, + 0x2b, 0x86, 0xca, 0x8a, 0x14, 0xb8, 0x1c, 0x52, 0x33, 0x07, 0x96, 0x73, 0xbe, 0x8b, 0xe5, 0x6a, + 0x67, 0x91, 0xd4, 0x63, 0x9e, 0x2c, 0x02, 0xf7, 0x33, 0x2f, 0x31, 0xe7, 0xf5, 0xdd, 0x3a, 0x8d, + 0xfc, 0x52, 0x36, 0x35, 0x3a, 0xd9, 0xa1, 0x4d, 0xa3, 0xf7, 0xa1, 0xc4, 0x5e, 0x89, 0xa6, 0xd3, + 0x4b, 0x20, 0x89, 0x70, 0x4c, 0xe2, 0x92, 0x2c, 0xb0, 0x43, 0x9e, 0xdc, 0xf1, 0x6d, 0x15, 0xd8, + 0xd7, 0x32, 0xa9, 0x51, 0xe4, 0x0e, 0xab, 0xc0, 0xd4, 0x7f, 0x9f, 0xf3, 0x83, 0xd7, 0xed, 0xe9, + 0x13, 0x1e, 0x43, 0x03, 0x3c, 0x43, 0x8f, 0xec, 0x5b, 0xcb, 0x8f, 0xf2, 0xe0, 0x68, 0x38, 0x20, + 0xa0, 0xcb, 0xbc, 0x1f, 0x5c, 0x2b, 0xc8, 0xea, 0x0f, 0xcb, 0xbc, 0xc9, 0xa1, 0x94, 0x5e, 0x20, + 0xa1, 0x0b, 0xf9, 0xe4, 0x5d, 0xd3, 0x03, 0xab, 0x80, 0xf6, 0x65, 0x8e, 0x2d, 0xe4, 0xe4, 0xae, + 0xe9, 0x31, 0x9b, 0x20, 0x40, 0xd3, 0x45, 0xba, 0x16, 0xa6, 0xae, 0xe6, 0x8b, 0xb4, 0xcb, 0x33, + 0x78, 0xf3, 0xc7, 0x5c, 0x8f, 0xa1, 0x01, 0xee, 0xb0, 0xca, 0xdd, 0x4c, 0x78, 0x6b, 0xb9, 0x8b, + 0x2b, 0xb4, 0x36, 0x20, 0xa0, 0x1c, 0x35, 0xb2, 0x1c, 0x3a, 0xd6, 0x01, 0x47, 0x07, 0x20, 0x1a, + 0xc7, 0xe0, 0xab, 0x68, 0xa4, 0xe6, 0xe9, 0x96, 0xa1, 0x3b, 0xc6, 0x7c, 0xc7, 0x6b, 0x77, 0x3c, + 0xd1, 0x28, 0x75, 0x3d, 0xc3, 0xee, 0x78, 0x5a, 0x84, 0x02, 0x3f, 0x81, 0x86, 0x7d, 0xc8, 0xa4, + 0xe3, 0xd8, 0x8e, 0x68, 0x79, 0xb8, 0x9e, 0x41, 0x1c, 0x47, 0x93, 0x09, 0xf0, 0xfb, 0xd0, 0x70, + 0xc5, 0xba, 0x63, 0x37, 0xd8, 0x8b, 0x5b, 0x6d, 0x86, 0xdb, 0x21, 0xf0, 0x40, 0xca, 0x0c, 0x10, + 0xf5, 0x8e, 0xd3, 0xd4, 0x64, 0x42, 0x75, 0x33, 0x1b, 0x8f, 0xf1, 0x77, 0xef, 0x6e, 0x5a, 0x2e, + 0xc9, 0xce, 0x74, 0xe0, 0x41, 0x0a, 0x06, 0xa1, 0xe8, 0xcb, 0xcb, 0xec, 0xc2, 0xab, 0xa8, 0xff, + 0x06, 0x59, 0x67, 0x7e, 0x9f, 0x85, 0xd0, 0x55, 0x78, 0x95, 0xc3, 0xc4, 0x13, 0x57, 0x9f, 0x4e, + 0xfd, 0x72, 0x36, 0x1e, 0xbd, 0xf0, 0xde, 0x15, 0xf6, 0x13, 0xa8, 0x0f, 0x44, 0x59, 0xf1, 0x8f, + 0xfc, 0x41, 0x80, 0x20, 0x6e, 0xd9, 0x03, 0xd9, 0x27, 0x53, 0x7f, 0xb2, 0x10, 0x0d, 0x69, 0x79, + 0xef, 0x4a, 0xef, 0x05, 0x34, 0x38, 0x61, 0x5b, 0xae, 0xe9, 0x7a, 0xc4, 0x6a, 0xf8, 0x0a, 0x7b, + 0x9a, 0x1a, 0x54, 0x8d, 0x10, 0x2c, 0xbe, 0x0c, 0x12, 0xa8, 0x77, 0xa3, 0xbc, 0xf8, 0x19, 0x34, + 0x00, 0x22, 0x07, 0x3f, 0x69, 0x36, 0xe1, 0xc1, 0x6d, 0xc1, 0x22, 0x05, 0x46, 0x9d, 0xa4, 0x43, + 0x52, 0x7c, 0x13, 0xf5, 0x4f, 0xac, 0x98, 0x4d, 0xc3, 0x21, 0x16, 0xf8, 0x0b, 0x0b, 0x31, 0x0e, + 0xe4, 0xbe, 0xbc, 0x0c, 0xff, 0x02, 0x2d, 0x6b, 0x4e, 0x83, 0x17, 0x93, 0xde, 0x46, 0x71, 0xd8, + 0x99, 0x1f, 0xcc, 0x22, 0x14, 0x16, 0xc0, 0x0f, 0xa0, 0x6c, 0x90, 0x15, 0x16, 0xdc, 0x54, 0x24, + 0x0d, 0xca, 0xc2, 0x52, 0xc1, 0xc7, 0x76, 0x76, 0xcb, 0xb1, 0x7d, 0x13, 0x15, 0xd8, 0x89, 0x17, + 0x78, 0x92, 0x0b, 0x51, 0xf6, 0x52, 0x1b, 0x7c, 0x19, 0xe8, 0xd9, 0x66, 0x16, 0x2c, 0x4f, 0xc9, + 0x2b, 0x9b, 0x31, 0x3b, 0xd3, 0x40, 0xbd, 0xf0, 0x17, 0xbe, 0x80, 0xf2, 0x0b, 0x7e, 0x46, 0xc9, + 0x61, 0x36, 0x4b, 0x47, 0xe4, 0x07, 0x78, 0xda, 0x4d, 0x13, 0xb6, 0xe5, 0xd1, 0xaa, 0xa1, 0xd5, + 0x43, 0x5c, 0x2e, 0x1c, 0x26, 0xc9, 0x85, 0xc3, 0xd4, 0x7f, 0x92, 0x4d, 0x08, 0xb6, 0x7a, 0xef, + 0x0e, 0x93, 0xe7, 0x10, 0x82, 0x87, 0xd6, 0x54, 0x9e, 0xfe, 0x13, 0x0d, 0x18, 0x25, 0xc0, 0x08, + 0xd4, 0x56, 0xda, 0x76, 0x84, 0xc4, 0xea, 0xef, 0x66, 0x62, 0x11, 0x3a, 0xf7, 0x24, 0x47, 0xd1, + 0x2a, 0xcb, 0xee, 0xd2, 0x8c, 0xf5, 0xfb, 0x22, 0xb7, 0xb3, 0xbe, 0x90, 0xbf, 0x65, 0x1f, 0x2c, + 0xd3, 0x83, 0xfc, 0x96, 0xaf, 0x67, 0x93, 0xe2, 0x95, 0x1e, 0x4e, 0x15, 0xbf, 0x16, 0x18, 0xa5, + 0xf9, 0x48, 0x84, 0x68, 0x80, 0x46, 0xb3, 0xde, 0x72, 0x33, 0xf5, 0xa3, 0xe8, 0x58, 0x24, 0x8a, + 0x27, 0x4f, 0x40, 0x7a, 0xa1, 0x7b, 0x38, 0xd0, 0xf4, 0x27, 0xfa, 0x12, 0x99, 0xfa, 0x3f, 0x33, + 0xdd, 0x63, 0xb8, 0x1e, 0xb8, 0xea, 0x24, 0x08, 0x20, 0xf7, 0x37, 0x23, 0x80, 0x7d, 0xd8, 0x06, + 0x1f, 0x6e, 0x01, 0xbc, 0x43, 0x26, 0x8f, 0xb7, 0x5b, 0x00, 0x3f, 0x99, 0xd9, 0x32, 0x04, 0xef, + 0x41, 0xcb, 0x40, 0xfd, 0x37, 0x99, 0xc4, 0x50, 0xb9, 0x7b, 0x6a, 0xd7, 0x8b, 0xa8, 0xc0, 0xdc, + 0x6a, 0x78, 0xab, 0x84, 0xe4, 0x42, 0x14, 0x9a, 0x96, 0x8e, 0x9b, 0x61, 0xf1, 0x0c, 0xea, 0x63, + 0x6d, 0x30, 0x78, 0x6f, 0x3c, 0xdc, 0x25, 0x5e, 0xaf, 0x91, 0x36, 0x39, 0x72, 0xb4, 0xfa, 0x3b, + 0x99, 0x58, 0xe4, 0xde, 0x03, 0xfc, 0xb6, 0x70, 0xaa, 0xce, 0x6d, 0x7f, 0xaa, 0x56, 0xff, 0x34, + 0x9b, 0x1c, 0x38, 0xf8, 0x00, 0x3f, 0x64, 0x3f, 0x8e, 0xd3, 0x76, 0xb7, 0x6e, 0x2d, 0xa0, 0x11, + 0x59, 0x16, 0x7c, 0xd9, 0x3a, 0x9f, 0x1c, 0x3e, 0x39, 0xa5, 0x15, 0x11, 0x1e, 0xea, 0x5b, 0x99, + 0x78, 0xcc, 0xe3, 0x03, 0x9f, 0x9f, 0x76, 0xa7, 0x2d, 0xf2, 0xa7, 0xbc, 0x43, 0xd6, 0x9a, 0xfd, + 0xf8, 0x94, 0x77, 0xc8, 0xaa, 0xb1, 0xbb, 0x4f, 0xf9, 0xf9, 0x6c, 0x5a, 0xc8, 0xe8, 0x03, 0xff, + 0xa0, 0x0f, 0x8a, 0x42, 0x66, 0x2d, 0xe3, 0x9f, 0xf6, 0x40, 0x5a, 0x8c, 0xe6, 0x14, 0x9e, 0x31, + 0x3e, 0xbb, 0x1b, 0xe3, 0x89, 0xc2, 0x7a, 0x87, 0x28, 0xf2, 0xe1, 0x10, 0xd6, 0x3b, 0x64, 0xa8, + 0xbc, 0xf3, 0x84, 0xf5, 0x9b, 0xd9, 0xed, 0xc6, 0x29, 0x3f, 0x12, 0x5e, 0x4c, 0x78, 0x9f, 0xcd, + 0xc6, 0xe3, 0xe7, 0x1f, 0xb8, 0x98, 0xa6, 0x50, 0x81, 0x47, 0xf2, 0x4f, 0x15, 0x0e, 0xc3, 0xa7, + 0x59, 0x34, 0xfc, 0x3b, 0xae, 0x21, 0x7e, 0x91, 0xb3, 0x3d, 0x91, 0x30, 0x5a, 0xf5, 0x5b, 0x99, + 0x48, 0xb0, 0xf9, 0x03, 0x39, 0x42, 0xd8, 0xd5, 0x92, 0x84, 0x5f, 0xf2, 0x0f, 0x33, 0xf3, 0x91, + 0x48, 0xc1, 0xc1, 0xf7, 0x94, 0x89, 0xa7, 0x9b, 0xcd, 0x68, 0x79, 0x1e, 0x13, 0xe0, 0xcb, 0x59, + 0x34, 0x16, 0x23, 0xc5, 0x17, 0xa4, 0x28, 0x39, 0x70, 0x2c, 0x19, 0x71, 0x1e, 0x67, 0xf1, 0x72, + 0x76, 0x70, 0x92, 0x7a, 0x01, 0xe5, 0xcb, 0xfa, 0x3a, 0xfb, 0xb6, 0x5e, 0xc6, 0xd2, 0xd0, 0xd7, + 0xc5, 0x13, 0x37, 0xc0, 0xe3, 0x45, 0x74, 0x1f, 0xbb, 0x0f, 0x31, 0x6d, 0x6b, 0xc1, 0x6c, 0x91, + 0x8a, 0x35, 0x6b, 0x36, 0x9b, 0xa6, 0xcb, 0x2f, 0xf5, 0x1e, 0xdb, 0xdc, 0x28, 0x5e, 0xf4, 0x6c, + 0x4f, 0x6f, 0xd6, 0x89, 0x4f, 0x56, 0xf7, 0xcc, 0x16, 0xa9, 0x9b, 0x56, 0xbd, 0x05, 0x94, 0x02, + 0xcb, 0x64, 0x56, 0xb8, 0xc2, 0x82, 0x42, 0xd7, 0x1a, 0xba, 0x65, 0x11, 0xa3, 0x62, 0x8d, 0xaf, + 0x7b, 0x84, 0x5d, 0x06, 0xe6, 0xd8, 0x91, 0x20, 0x7b, 0x1b, 0xce, 0xd0, 0x94, 0xf1, 0x22, 0x25, + 0xd0, 0x12, 0x0a, 0xa9, 0xbf, 0x95, 0x4f, 0xc8, 0x33, 0x70, 0x88, 0xd4, 0xc7, 0xef, 0xe9, 0xfc, + 0x16, 0x3d, 0x7d, 0x05, 0xf5, 0xf1, 0x10, 0x9f, 0xfc, 0x82, 0x01, 0x9c, 0xd9, 0xef, 0x30, 0x90, + 0x78, 0x43, 0xc3, 0xa9, 0x70, 0x13, 0x9d, 0x59, 0xa0, 0xdd, 0x94, 0xdc, 0x99, 0x85, 0x5d, 0x74, + 0x66, 0x17, 0x7e, 0xf8, 0x75, 0x74, 0x0a, 0xb0, 0x09, 0xdd, 0xda, 0x07, 0x55, 0x41, 0xe4, 0x28, + 0x56, 0x55, 0x72, 0xe7, 0xa6, 0x95, 0xc7, 0x1f, 0x44, 0x43, 0xc1, 0x00, 0x31, 0x89, 0xcb, 0x6f, + 0x2e, 0xba, 0x8c, 0x33, 0x16, 0x96, 0x8d, 0x82, 0xc1, 0x85, 0x4c, 0x0e, 0xed, 0x25, 0xf1, 0x52, + 0xff, 0x75, 0xa6, 0x5b, 0xbe, 0x83, 0x03, 0x9f, 0x95, 0x5f, 0x42, 0x7d, 0x06, 0xfb, 0x28, 0xae, + 0x53, 0xdd, 0x33, 0x22, 0x30, 0x52, 0xcd, 0x2f, 0xa3, 0xfe, 0x49, 0xa6, 0x6b, 0x9a, 0x85, 0xc3, + 0xfe, 0x79, 0x9f, 0xcd, 0xa5, 0x7c, 0x1e, 0x9f, 0x44, 0x2f, 0xa1, 0x51, 0x33, 0x8c, 0x58, 0x5d, + 0x0f, 0xc3, 0x4f, 0x69, 0xc7, 0x04, 0x38, 0x8c, 0xae, 0x6b, 0xe8, 0xa4, 0xef, 0xf8, 0xe8, 0xf8, + 0x1e, 0x62, 0x6e, 0xbd, 0xe3, 0x98, 0x6c, 0x5c, 0x6a, 0x27, 0xdc, 0x88, 0xfb, 0x98, 0x7b, 0xd3, + 0x31, 0x69, 0x05, 0xba, 0xb7, 0x42, 0x2c, 0xbd, 0xbe, 0x66, 0x3b, 0xab, 0x10, 0xfb, 0x93, 0x0d, + 0x4e, 0xed, 0x18, 0x83, 0xdf, 0xf6, 0xc1, 0xf8, 0x21, 0x34, 0xbc, 0xdc, 0xec, 0x90, 0x20, 0xda, + 0x22, 0xbb, 0xeb, 0xd3, 0x86, 0x28, 0x30, 0xb8, 0x21, 0x39, 0x87, 0x10, 0x10, 0x79, 0x90, 0x04, + 0x03, 0x2e, 0xf6, 0xb4, 0x01, 0x0a, 0x59, 0xe0, 0xdd, 0x75, 0x86, 0x69, 0x35, 0x13, 0x52, 0xbd, + 0x69, 0x5b, 0xcb, 0x75, 0x8f, 0x38, 0x2d, 0x68, 0x28, 0x38, 0x33, 0x68, 0x27, 0x81, 0x02, 0xae, + 0x4e, 0xdc, 0x19, 0xdb, 0x5a, 0x5e, 0x20, 0x4e, 0x8b, 0x36, 0xf5, 0x31, 0x84, 0x79, 0x53, 0x1d, + 0x38, 0xf4, 0x60, 0x1f, 0x07, 0xde, 0x0c, 0x1a, 0xff, 0x08, 0x76, 0x1a, 0x02, 0x1f, 0x56, 0x44, + 0x83, 0x2c, 0xe4, 0x1c, 0x13, 0x1a, 0xb8, 0x30, 0x68, 0x88, 0x81, 0x40, 0x5e, 0x27, 0x11, 0xf7, + 0xae, 0x60, 0x5e, 0xdd, 0x1a, 0xff, 0xa5, 0x7e, 0x2a, 0x97, 0x94, 0x19, 0x62, 0x4f, 0x8a, 0x16, + 0x4e, 0xab, 0xd9, 0x1d, 0x4d, 0xab, 0xc7, 0xac, 0x4e, 0xab, 0xae, 0xb7, 0xdb, 0xf5, 0x25, 0xb3, + 0x09, 0xcf, 0xaa, 0x60, 0xe1, 0xd3, 0x86, 0xad, 0x4e, 0xab, 0xd4, 0x6e, 0x4f, 0x31, 0x20, 0x7e, + 0x14, 0x8d, 0x51, 0x3a, 0xe8, 0xa4, 0x80, 0x32, 0x0f, 0x94, 0x94, 0x01, 0xc4, 0x6c, 0xf5, 0x69, + 0x4f, 0xa3, 0x7e, 0xce, 0x93, 0xad, 0x55, 0xbd, 0x5a, 0x1f, 0x63, 0xe6, 0xd2, 0x9e, 0x0b, 0xd8, + 0xb0, 0xc9, 0xb5, 0x57, 0x1b, 0xf0, 0xcb, 0x43, 0x64, 0x62, 0xab, 0xd3, 0x62, 0x11, 0xb1, 0xfa, + 0x00, 0x19, 0xfc, 0xc6, 0x17, 0xd0, 0x08, 0xe5, 0x12, 0x08, 0x8c, 0x05, 0x73, 0xed, 0xd5, 0x22, + 0x50, 0x7c, 0x15, 0x9d, 0x90, 0x20, 0xcc, 0x06, 0x65, 0xcf, 0x04, 0x7a, 0xb5, 0x44, 0x9c, 0xfa, + 0x56, 0x2e, 0x9e, 0xf8, 0xe2, 0x40, 0xd6, 0xc6, 0x69, 0x84, 0x78, 0x5e, 0x9b, 0xf0, 0x82, 0x26, + 0xf0, 0x5a, 0x0e, 0x31, 0x29, 0x3c, 0x84, 0xb2, 0xf8, 0x12, 0xea, 0x67, 0x5f, 0x54, 0x29, 0xf3, + 0x35, 0x13, 0xdc, 0x8c, 0xdc, 0xb6, 0xb9, 0xb4, 0x04, 0x3e, 0x49, 0x01, 0x1a, 0x5f, 0x40, 0x7d, + 0xe5, 0xb9, 0x5a, 0xad, 0x34, 0xe7, 0xdf, 0x36, 0xc2, 0x1b, 0x05, 0xc3, 0x72, 0xeb, 0xae, 0x6e, + 0xb9, 0x9a, 0x8f, 0xc4, 0x0f, 0xa1, 0x42, 0xa5, 0x0a, 0x64, 0xec, 0xe5, 0xdd, 0xe0, 0xe6, 0x46, + 0xb1, 0xcf, 0x6c, 0x33, 0x2a, 0x8e, 0x82, 0x7a, 0x6f, 0x55, 0xca, 0xc2, 0x95, 0x3b, 0xab, 0xf7, + 0x8e, 0x69, 0xc0, 0xd5, 0xa5, 0x16, 0xa0, 0xf1, 0xd3, 0x68, 0xa8, 0x46, 0x1c, 0x53, 0x6f, 0xce, + 0x75, 0x60, 0xbb, 0xc1, 0xdc, 0x8c, 0xc6, 0x36, 0x37, 0x8a, 0xc3, 0x2e, 0xc0, 0xeb, 0x16, 0x20, + 0x34, 0x89, 0x0c, 0x9f, 0x45, 0xf9, 0x69, 0xd3, 0xf2, 0xdd, 0xe0, 0xc1, 0x4f, 0x7a, 0xc5, 0xb4, + 0x3c, 0x0d, 0xa0, 0xea, 0x7f, 0xce, 0x26, 0xa7, 0x1e, 0x39, 0x80, 0xb1, 0xb5, 0xcb, 0xdb, 0xc2, + 0x88, 0x12, 0xe4, 0xf7, 0xa0, 0x04, 0x4b, 0xe8, 0x58, 0xc9, 0x68, 0x99, 0x56, 0x09, 0x7e, 0xba, + 0xb3, 0x53, 0x25, 0x18, 0x90, 0xc2, 0x33, 0xac, 0x08, 0x9a, 0x7f, 0x0f, 0x0b, 0xb7, 0x4a, 0x51, + 0x75, 0x9d, 0xe1, 0xea, 0xad, 0x25, 0xbd, 0xde, 0x60, 0x59, 0x3b, 0xb4, 0x28, 0x53, 0xf5, 0x07, + 0xb2, 0x5b, 0x64, 0x4b, 0xb9, 0x17, 0xa5, 0xaf, 0x7e, 0x2e, 0xdb, 0x3d, 0x61, 0xcd, 0x3d, 0x29, + 0x94, 0xbf, 0xc8, 0x26, 0xa4, 0x8f, 0xd9, 0x93, 0x24, 0x2e, 0xa1, 0x7e, 0xc6, 0x26, 0x70, 0xd7, + 0x84, 0x19, 0x87, 0x29, 0x2b, 0xcc, 0x74, 0x3e, 0x1a, 0xcf, 0xa1, 0x13, 0xa5, 0xa5, 0x25, 0xd2, + 0xf0, 0xc2, 0xc0, 0xbb, 0x73, 0x61, 0xb0, 0x4d, 0x16, 0xad, 0x94, 0xe3, 0xc3, 0xc0, 0xbd, 0x10, + 0x54, 0x22, 0xb1, 0x1c, 0x5e, 0x40, 0x27, 0xa3, 0xf0, 0x1a, 0x33, 0xf5, 0xf2, 0x42, 0x00, 0xd3, + 0x18, 0x47, 0xf6, 0x9f, 0x96, 0x52, 0x36, 0xa9, 0x95, 0x30, 0x9d, 0xf6, 0x76, 0x6b, 0x25, 0xcc, + 0xad, 0x89, 0xe5, 0xd4, 0x2f, 0xe7, 0xc4, 0x2c, 0x3b, 0xf7, 0xae, 0x63, 0xcd, 0x35, 0xc9, 0x9d, + 0x76, 0xbb, 0x43, 0xe6, 0x69, 0x1e, 0x29, 0xc2, 0xe8, 0x38, 0xbe, 0xe7, 0x59, 0xf0, 0x52, 0x1d, + 0x80, 0xa2, 0x0f, 0x59, 0x40, 0x89, 0x2b, 0x28, 0x5f, 0x72, 0x96, 0x99, 0x19, 0xb3, 0xd5, 0xe3, + 0x19, 0xdd, 0x59, 0x76, 0x93, 0x1f, 0xcf, 0x50, 0x16, 0xea, 0xf7, 0x67, 0xbb, 0x64, 0xe1, 0xb9, + 0x27, 0x27, 0x91, 0x1f, 0xcb, 0xa6, 0xe5, 0xd3, 0x39, 0xac, 0x2e, 0x42, 0x6f, 0xb3, 0x70, 0x0e, + 0xb7, 0xff, 0xd4, 0x3e, 0x0a, 0xe7, 0x0f, 0xb2, 0x69, 0xc9, 0x81, 0x8e, 0x84, 0xb3, 0xbb, 0x09, + 0x32, 0x51, 0xa4, 0xf7, 0xb0, 0xcd, 0x2d, 0xaa, 0x42, 0xef, 0x2e, 0xdd, 0x64, 0x92, 0x44, 0x7a, + 0x34, 0x84, 0xf7, 0xa4, 0xa5, 0x5f, 0xcb, 0xa6, 0x26, 0xc1, 0x3a, 0x92, 0xe9, 0x7e, 0xca, 0xf4, + 0x68, 0xe8, 0xef, 0x69, 0xe8, 0x27, 0xca, 0xf4, 0x68, 0xec, 0xef, 0x49, 0x4f, 0xbf, 0x2f, 0x17, + 0x4f, 0xf3, 0x76, 0xaf, 0x2a, 0xa8, 0xb3, 0x4b, 0x05, 0xf5, 0xcb, 0xe1, 0x97, 0xd1, 0xb1, 0x50, + 0x96, 0x62, 0xb8, 0x17, 0xb8, 0x68, 0x6b, 0x50, 0x54, 0xfd, 0x0d, 0x8a, 0xe3, 0x71, 0x09, 0xa2, + 0xd4, 0xea, 0xb7, 0x72, 0xf1, 0x5c, 0x79, 0x47, 0xbd, 0xb1, 0xcb, 0xde, 0xb8, 0x89, 0x4e, 0x4e, + 0x74, 0x1c, 0x87, 0x58, 0x5e, 0x72, 0xa7, 0xc0, 0x49, 0x5e, 0x83, 0x51, 0xd4, 0xe3, 0x9d, 0x93, + 0x52, 0x98, 0xb2, 0xe5, 0x2e, 0xad, 0x51, 0xb6, 0x7d, 0x21, 0xdb, 0x0e, 0xa3, 0x48, 0x62, 0x9b, + 0x5c, 0x58, 0xfd, 0xbd, 0x6c, 0x3c, 0xbb, 0xe1, 0x51, 0xd7, 0xef, 0xae, 0xeb, 0x1f, 0x9d, 0x65, + 0xd9, 0x62, 0x6e, 0x98, 0x96, 0x81, 0x4f, 0xa3, 0xfb, 0x6e, 0xd6, 0x26, 0xb5, 0xfa, 0x8d, 0xca, + 0x5c, 0xb9, 0x7e, 0x73, 0xae, 0x56, 0x9d, 0x9c, 0xa8, 0x4c, 0x55, 0x26, 0xcb, 0xa3, 0x3d, 0xf8, + 0x38, 0x3a, 0x16, 0xa2, 0xa6, 0x6f, 0xce, 0x96, 0xe6, 0x46, 0x33, 0x78, 0x0c, 0x0d, 0x87, 0xc0, + 0xf1, 0xf9, 0x85, 0xd1, 0xec, 0xa3, 0xef, 0x41, 0x83, 0x70, 0x1d, 0xc6, 0x8e, 0x75, 0xf1, 0x10, + 0xea, 0x9f, 0x1f, 0xaf, 0x4d, 0x6a, 0xb7, 0x80, 0x09, 0x42, 0x85, 0xf2, 0xe4, 0x1c, 0x65, 0x98, + 0x79, 0xf4, 0xbf, 0x65, 0x10, 0xaa, 0x4d, 0x2d, 0x54, 0x39, 0xe1, 0x20, 0xea, 0xab, 0xcc, 0xdd, + 0x2a, 0xcd, 0x54, 0x28, 0x5d, 0x3f, 0xca, 0xcf, 0x57, 0x27, 0x69, 0x0d, 0x03, 0xa8, 0x77, 0x62, + 0x66, 0xbe, 0x36, 0x39, 0x9a, 0xa5, 0x40, 0x6d, 0xb2, 0x54, 0x1e, 0xcd, 0x51, 0xe0, 0x6d, 0xad, + 0xb2, 0x30, 0x39, 0x9a, 0xa7, 0x7f, 0xce, 0xd4, 0x16, 0x4a, 0x0b, 0xa3, 0xbd, 0xf4, 0xcf, 0x29, + 0xf8, 0xb3, 0x40, 0x99, 0xd5, 0x26, 0x17, 0xe0, 0x47, 0x1f, 0x6d, 0xc2, 0x94, 0xff, 0xab, 0x9f, + 0xa2, 0x28, 0xeb, 0x72, 0x45, 0x1b, 0x1d, 0xa0, 0x3f, 0x28, 0x4b, 0xfa, 0x03, 0xd1, 0xc6, 0x69, + 0x93, 0xb3, 0xf3, 0xb7, 0x26, 0x47, 0x07, 0x29, 0xaf, 0xd9, 0x1b, 0x14, 0x3c, 0x44, 0xff, 0xd4, + 0x66, 0xe9, 0x9f, 0xc3, 0x94, 0x93, 0x36, 0x59, 0x9a, 0xa9, 0x96, 0x16, 0xa6, 0x47, 0x47, 0x68, + 0x7b, 0x80, 0xe7, 0x31, 0x56, 0x72, 0xae, 0x34, 0x3b, 0x39, 0x3a, 0xca, 0x69, 0xca, 0x33, 0x95, + 0xb9, 0x1b, 0xa3, 0x63, 0xd0, 0x90, 0xd7, 0x67, 0xe1, 0x07, 0xa6, 0x05, 0xe0, 0xaf, 0xe3, 0x8f, + 0x7e, 0x18, 0x15, 0xe6, 0x6b, 0x70, 0x79, 0x71, 0x0a, 0x1d, 0x9f, 0xaf, 0xd5, 0x17, 0x5e, 0xaf, + 0x4e, 0x46, 0xe4, 0x3d, 0x86, 0x86, 0x7d, 0xc4, 0x4c, 0x65, 0xee, 0xe6, 0x07, 0x98, 0xb4, 0x7d, + 0xd0, 0x6c, 0x69, 0x62, 0xbe, 0x36, 0x9a, 0xa5, 0xbd, 0xe2, 0x83, 0x6e, 0x57, 0xe6, 0xca, 0xf3, + 0xb7, 0x6b, 0xa3, 0xb9, 0x47, 0xef, 0xa0, 0x21, 0x96, 0x6b, 0x67, 0xde, 0x31, 0x97, 0x4d, 0x0b, + 0x9f, 0x43, 0xa7, 0xcb, 0x93, 0xb7, 0x2a, 0x13, 0x93, 0xf5, 0x79, 0xad, 0x72, 0xbd, 0x32, 0x17, + 0xa9, 0xe9, 0x3e, 0x34, 0x26, 0xa3, 0x4b, 0xd5, 0xca, 0x68, 0x06, 0x9f, 0x44, 0x58, 0x06, 0xbf, + 0x5a, 0x9a, 0x9d, 0x1a, 0xcd, 0x62, 0x05, 0x9d, 0x90, 0xe1, 0x95, 0xb9, 0x85, 0x9b, 0x73, 0x93, + 0xa3, 0xb9, 0x47, 0x7f, 0x3a, 0x83, 0xee, 0x4b, 0x8c, 0xc7, 0x86, 0x55, 0x74, 0x7e, 0x72, 0xa6, + 0x54, 0x5b, 0xa8, 0x4c, 0xd4, 0x26, 0x4b, 0xda, 0xc4, 0x74, 0x7d, 0xa2, 0xb4, 0x30, 0x79, 0x7d, + 0x5e, 0x7b, 0xbd, 0x7e, 0x7d, 0x72, 0x6e, 0x52, 0x2b, 0xcd, 0x8c, 0xf6, 0xe0, 0x87, 0x50, 0x31, + 0x85, 0xa6, 0x36, 0x39, 0x71, 0x53, 0xab, 0x2c, 0xbc, 0x3e, 0x9a, 0xc1, 0x0f, 0xa2, 0x73, 0xa9, + 0x44, 0xf4, 0xf7, 0x68, 0x16, 0x9f, 0x47, 0x67, 0xd2, 0x48, 0x5e, 0x9b, 0x19, 0xcd, 0x3d, 0xfa, + 0x23, 0x19, 0x84, 0xe3, 0x01, 0xb5, 0xf0, 0x03, 0xe8, 0x2c, 0xd5, 0x8b, 0x7a, 0x7a, 0x03, 0x1f, + 0x44, 0xe7, 0x12, 0x29, 0x84, 0xe6, 0x15, 0xd1, 0xfd, 0x29, 0x24, 0xbc, 0x71, 0x67, 0x91, 0x92, + 0x4c, 0x00, 0x4d, 0xfb, 0x62, 0x06, 0xdd, 0x97, 0x78, 0x93, 0x82, 0x2f, 0xa2, 0x87, 0x4b, 0xe5, + 0x59, 0xda, 0x37, 0x13, 0x0b, 0x95, 0xf9, 0xb9, 0x5a, 0x7d, 0x76, 0xaa, 0x54, 0xa7, 0xda, 0x77, + 0xb3, 0x16, 0xe9, 0xcd, 0x0b, 0x48, 0xed, 0x42, 0x39, 0x31, 0x5d, 0x9a, 0xbb, 0x4e, 0x87, 0x1f, + 0x7e, 0x18, 0x3d, 0x90, 0x4a, 0x37, 0x39, 0x57, 0x1a, 0x9f, 0x99, 0x2c, 0x8f, 0x66, 0xf1, 0x23, + 0xe8, 0xc1, 0x54, 0xaa, 0x72, 0xa5, 0xc6, 0xc8, 0x72, 0xe3, 0xe5, 0xb7, 0xfe, 0xed, 0xf9, 0x9e, + 0xb7, 0xbe, 0x71, 0x3e, 0xf3, 0x07, 0xdf, 0x38, 0x9f, 0xf9, 0xd3, 0x6f, 0x9c, 0xcf, 0x7c, 0xf0, + 0xea, 0x4e, 0x02, 0xa5, 0xb1, 0x29, 0x6b, 0xb1, 0x00, 0xa7, 0x9a, 0x4f, 0xfd, 0xaf, 0x00, 0x00, + 0x00, 0xff, 0xff, 0x5f, 0x29, 0x23, 0xde, 0x9b, 0x6a, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -35458,6 +35470,16 @@ func (m *AutoUpdateConfigCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -35525,6 +35547,16 @@ func (m *AutoUpdateConfigUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -35592,6 +35624,16 @@ func (m *AutoUpdateConfigDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -35659,6 +35701,16 @@ func (m *AutoUpdateVersionCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -35726,6 +35778,16 @@ func (m *AutoUpdateVersionUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -35793,6 +35855,16 @@ func (m *AutoUpdateVersionDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -44056,6 +44128,8 @@ func (m *AutoUpdateConfigCreate) Size() (n int) { n += 1 + l + sovEvents(uint64(l)) l = m.ConnectionMetadata.Size() n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -44076,6 +44150,8 @@ func (m *AutoUpdateConfigUpdate) Size() (n int) { n += 1 + l + sovEvents(uint64(l)) l = m.ConnectionMetadata.Size() n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -44096,6 +44172,8 @@ func (m *AutoUpdateConfigDelete) Size() (n int) { n += 1 + l + sovEvents(uint64(l)) l = m.ConnectionMetadata.Size() n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -44116,6 +44194,8 @@ func (m *AutoUpdateVersionCreate) Size() (n int) { n += 1 + l + sovEvents(uint64(l)) l = m.ConnectionMetadata.Size() n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -44136,6 +44216,8 @@ func (m *AutoUpdateVersionUpdate) Size() (n int) { n += 1 + l + sovEvents(uint64(l)) l = m.ConnectionMetadata.Size() n += 1 + l + sovEvents(uint64(l)) + l = m.ResourceMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -44156,6 +44238,8 @@ func (m *AutoUpdateVersionDelete) Size() (n int) { n += 1 + l + sovEvents(uint64(l)) l = m.ConnectionMetadata.Size() n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -98329,6 +98413,39 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -98512,6 +98629,39 @@ func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -98695,6 +98845,39 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -98878,6 +99061,39 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -99061,6 +99277,39 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -99244,6 +99493,39 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index cc7fc838efbd4..d90028f01f602 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -727,6 +727,31 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_CrownJewelDelete{ CrownJewelDelete: e, } + case *AutoUpdateConfigCreate: + out.Event = &OneOf_AutoUpdateConfigCreate{ + AutoUpdateConfigCreate: e, + } + case *AutoUpdateConfigUpdate: + out.Event = &OneOf_AutoUpdateConfigUpdate{ + AutoUpdateConfigUpdate: e, + } + case *AutoUpdateConfigDelete: + out.Event = &OneOf_AutoUpdateConfigDelete{ + AutoUpdateConfigDelete: e, + } + + case *AutoUpdateVersionCreate: + out.Event = &OneOf_AutoUpdateVersionCreate{ + AutoUpdateVersionCreate: e, + } + case *AutoUpdateVersionUpdate: + out.Event = &OneOf_AutoUpdateVersionUpdate{ + AutoUpdateVersionUpdate: e, + } + case *AutoUpdateVersionDelete: + out.Event = &OneOf_AutoUpdateVersionDelete{ + AutoUpdateVersionDelete: e, + } default: log.Errorf("Attempted to convert dynamic event of unknown type \"%v\" into protobuf event.", in.GetType()) unknown := &Unknown{} diff --git a/api/version.go b/api/version.go index 6d5b2e578d05c..30abc3d2fa929 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "15.4.23" +const Version = "15.4.24" var SemVersion = semver.New(Version) diff --git a/assets/backport/go.mod b/assets/backport/go.mod index ed7d40991e7e8..38685d91bed90 100644 --- a/assets/backport/go.mod +++ b/assets/backport/go.mod @@ -17,10 +17,10 @@ require ( github.com/jonboulle/clockwork v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/assets/backport/go.sum b/assets/backport/go.sum index 85a57be3232e6..b1178d765e944 100644 --- a/assets/backport/go.sum +++ b/assets/backport/go.sum @@ -78,8 +78,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -123,14 +123,14 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= diff --git a/build.assets/Makefile b/build.assets/Makefile index f45856c3dfaf9..268a792c73243 100644 --- a/build.assets/Makefile +++ b/build.assets/Makefile @@ -35,22 +35,7 @@ ifneq ("$(KUBECONFIG)","") DOCKERFLAGS := $(DOCKERFLAGS) -v $(KUBECONFIG):/mnt/kube/config -e KUBECONFIG=/mnt/kube/config -e TEST_KUBE=$(TEST_KUBE) endif -# conditionally force the use of UID/GID 1000:1000 if we're running in Drone or Github Actions (in which case CI env var will be set) -ifeq ("$(DRONE)","true") -CI := true -endif ifeq ("$(CI)","true") -# The UID/GID of the runner user on ARC runners is 1001, not 1000 -# This var is currently only set for ARC runners via https://github.com/gravitational/cloud-terraform/pull/2473 -ifeq ("$(CI_SYSTEM)","ARC") -UID := 1001 -GID := 1001 -NOROOT := -u 1001:1001 -else -UID := 1000 -GID := 1000 -NOROOT := -u 1000:1000 -endif # if running in CI and the GOCACHE environment variable is not set, set it to a sensible default ifeq ("$(GOCACHE)",) GOCACHE := /go/cache diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index 27528e22384c4..d6922c75fe432 100644 --- a/build.assets/macos/tsh/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tsh/tsh.app/Contents/Info.plist @@ -19,13 +19,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 15.4.23 + 15.4.24 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 15.4.23 + 15.4.24 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist index ef93d20cb6cd7..4ab37afec0f65 100644 --- a/build.assets/macos/tshdev/tsh.app/Contents/Info.plist +++ b/build.assets/macos/tshdev/tsh.app/Contents/Info.plist @@ -17,13 +17,13 @@ CFBundlePackageType APPL CFBundleShortVersionString - 15.4.23 + 15.4.24 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 15.4.23 + 15.4.24 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index 5a0a42687ef8d..63f1b9ed16233 100644 --- a/build.assets/tooling/go.mod +++ b/build.assets/tooling/go.mod @@ -18,7 +18,7 @@ require ( github.com/stretchr/testify v1.8.4 github.com/waigani/diffparser v0.0.0-20190828052634-7391f219313d golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb - golang.org/x/mod v0.14.0 + golang.org/x/mod v0.17.0 golang.org/x/oauth2 v0.15.0 howett.net/plist v1.0.1 k8s.io/apiextensions-apiserver v0.29.0 @@ -55,12 +55,12 @@ require ( github.com/shopspring/decimal v1.3.1 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.16.1 // indirect + golang.org/x/crypto v0.31.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect diff --git a/build.assets/tooling/go.sum b/build.assets/tooling/go.sum index 566243bbd324c..74f5eb0f9b9fe 100644 --- a/build.assets/tooling/go.sum +++ b/build.assets/tooling/go.sum @@ -216,8 +216,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -228,8 +228,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -247,8 +247,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ= @@ -261,6 +261,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -284,15 +286,15 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -300,8 +302,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -312,8 +314,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/docs/config.json b/docs/config.json index c36e643417b26..13a7027af278f 100644 --- a/docs/config.json +++ b/docs/config.json @@ -134,7 +134,7 @@ "aws_secret_access_key": "zyxw9876-this-is-an-example" }, "cloud": { - "version": "16.4.8", + "version": "16.4.9", "major_version": "16", "sla": { "monthly_percentage": "99.9%", @@ -179,18 +179,18 @@ "teleport": { "git": "api/14.0.0-gd1e081e", "major_version": "15", - "version": "15.4.23", + "version": "15.4.24", "url": "teleport.example.com", "golang": "1.21", "plugin": { - "version": "15.4.23" + "version": "15.4.24" }, "helm_repo_url": "https://charts.releases.teleport.dev", - "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:15.4.23", - "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:15.4.23", - "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:15.4.23", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:15.4.23", - "teleport_install_script_url": "https://cdn.teleport.dev/install-v15.4.23.sh" + "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:15.4.24", + "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:15.4.24", + "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:15.4.24", + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:15.4.24", + "teleport_install_script_url": "https://cdn.teleport.dev/install-v15.4.24.sh" }, "terraform": { "version": "1.0.0" diff --git a/docs/pages/admin-guides/access-controls/access-monitoring.mdx b/docs/pages/admin-guides/access-controls/access-monitoring.mdx index b2375add9a345..55f3317176e9a 100644 --- a/docs/pages/admin-guides/access-controls/access-monitoring.mdx +++ b/docs/pages/admin-guides/access-controls/access-monitoring.mdx @@ -23,7 +23,7 @@ Users are able to write their own custom access monitoring queries by querying t ## Prerequisites - Teleport v14 or later. -- For self-hosted Teleport the [AWS Athena Backend](../../reference/backends.mdx) is required. +- For self-hosted Teleport the [Amazon Athena Backend](../../reference/backends.mdx) is required. ### Configuration @@ -281,7 +281,8 @@ FROM WHERE identity_user = 'admin-annie' ``` -- Show access requests and their reviews: +- Show Access Requests and their reviews: + ```sql SELECT * @@ -291,7 +292,8 @@ WHERE access_request_create.id = access_request_review.id ``` -- Show details about access request and review: +- Show details about an Access Request and its reviews: + ```sql SELECT request.user, request.reason, request.roles, request.resource_ids, review.reviewer, review.state @@ -324,7 +326,7 @@ The report allows to identify the following weak security events: ### Database sessions with weak security The following query identifies database sessions with weak security -such as as sessions with missing access requests, MFA, impersonation, and trusted device identification. +such as as sessions with missing Access Requests, MFA, impersonation, and trusted device identification. ```sql SELECT @@ -351,12 +353,12 @@ ORDER BY ![privileged access report](../../../img/access-monitoring/privileged_access_report.png) -**Suggestion:** Set up access requests, device trust and per-session MFA. +**Suggestion:** Set up Access Requests, Device Trust and per-session MFA. ### SSH sessions with weak security The following query identifies SSH sessions with weak security, -such as as sessions with missing access requests, MFA, impersonation, and trusted device identification. +such as as sessions with missing Access Requests, MFA, impersonation, and trusted device identification. ```sql SELECT @@ -383,12 +385,12 @@ ORDER BY event_date ``` -**Suggestion:** Set up access requests, device trust and per-session MFA. +**Suggestion:** Set up Access Requests, Device Trust and per-session MFA. ### Kubernetes API calls with weak security The following query identifies Kubernetes sessions with weak security, -such as sessions with missing access requests, MFA, impersonation, and trusted device identification. +such as sessions with missing Access Requests, MFA, impersonation, and trusted device identification. ```sql SELECT @@ -412,7 +414,7 @@ ORDER BY event_date ``` -**Suggestion:** Set up access requests, device trust and per-session MFA. +**Suggestion:** Set up Access Requests, Device Trust and per-session MFA. ### Privileged Postgres sessions diff --git a/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx b/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx index 383f20e2fd721..c69d3e0742a14 100644 --- a/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx +++ b/docs/pages/admin-guides/deploy-a-cluster/gcp-kms.mdx @@ -8,8 +8,10 @@ This guide will show you how to set up your Teleport Cluster to use the Google Cloud Key Management Service (KMS) to store and handle the CA private key material used to sign all certificates issued by your Teleport cluster. +## How it works + Teleport generates private key material for its internal Certificate Authorities -(CAs) during the first Auth Server's initial startup. +(CAs) during the first Auth Service instance's initial startup. These CAs are used to sign all certificates issued to clients and hosts in the Teleport cluster. When configured to use Google Cloud KMS, all private key material for these CAs @@ -35,12 +37,12 @@ learn more. ## Step 1/5. Create a key ring in GCP -Each Teleport Auth Server will need to be configured to use a GCP key ring -which will hold all keys generated and used by that Auth Server. +Each Teleport Auth Service instance will need to be configured to use a GCP key +ring which will hold all keys generated and used by that Auth Service instance. If running a High-Availability Teleport cluster with two or more Auth Servers, -every Auth Server can be configured to use the same key ring, or if desired each -can be configured to use a unique key ring in a different region (for redundancy -or to decrease latency). +every Auth Service instance can be configured to use the same key ring, or if +desired each can be configured to use a unique key ring in a different region +(for redundancy or to decrease latency). It is recommended to create a dedicated key ring for use by Teleport to logically separate it from any other keys in your cloud account. @@ -90,7 +92,7 @@ custom role and must be used in later steps. $ export IAM_ROLE= ``` -If you don't already have a GCP service account for your Teleport Auth Server +If you don't already have a GCP service account for your Teleport Auth Service you can create one with the following command, otherwise use your existing service account. @@ -125,13 +127,13 @@ It should be considered highly privileged and access should be restricted as much as possible. -## Step 3/5. Provide the service account credentials to your Auth Server +## Step 3/5. Provide the service account credentials to the Auth Service -The Teleport Auth Server will use Application Default Credentials to make +The Teleport Auth Service will use Application Default Credentials to make requests to the GCP KMS service. Provide credentials for the `teleport-auth-server` service account created in step 2 to the Application Default Credentials of the environment you are running -your Teleport Auth Server in. +your Teleport Auth Service in. Supported environments include GCE VMs, GKE pods, and others. See the GCP docs for @@ -141,7 +143,7 @@ to learn how to provide them for your preferred environment.
To make sure the credentials have been configured correctly, you can run the -`gcloud` CLI tool from your Teleport Auth Server's environment. Some example +`gcloud` CLI tool from your Teleport Auth Service's environment. Some example commands you could use to debug are listed here: ```code @@ -163,10 +165,10 @@ $ gcloud kms keys versions destroy --keyring "" --
-## Step 4/5. Configure your Auth Server to use KMS keys +## Step 4/5. Configure the Auth Service to use KMS keys CA key parameters are statically configured in the `teleport.yaml` configuration -file of the Teleport Auth Server(s) in your cluster. +file of the Teleport Auth Service instances in your cluster. Find the fully qualified name of the KMS key ring you created in [step 1](#step-15-create-a-key-ring-in-gcp) @@ -220,9 +222,9 @@ KMS keys, read on to ## Step 5/5. Make sure everything is working -After starting up your Auth Server with the `gcp_kms` configuration, you can +After starting up your Auth Service with the `gcp_kms` configuration, you can confirm that Teleport has generated keys in your keyring in the GCP Console or -by running +by running: ```code $ gcloud kms keys list --keyring "" --location diff --git a/docs/pages/enroll-resources/desktop-access/getting-started.mdx b/docs/pages/enroll-resources/desktop-access/getting-started.mdx index 1b24837f80ca9..dc2f3f715f18f 100644 --- a/docs/pages/enroll-resources/desktop-access/getting-started.mdx +++ b/docs/pages/enroll-resources/desktop-access/getting-started.mdx @@ -62,6 +62,10 @@ interactively and select the Teleport certificate that you exported when prompte - Disables Network Level Authentication (NLA) for remote desktop services. - Enables RemoteFX compression, if using Teleport version 15 or newer. + Note: in order for the Windows Local Security Authority (LSA) to load the Teleport DLL, + [LSA protection](https://learn.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/configuring-additional-lsa-protection) + must be disabled. + {/*lint ignore ordered-list-marker-value*/} 5. Restart the computer. diff --git a/docs/pages/reference/helm-reference/teleport-cluster.mdx b/docs/pages/reference/helm-reference/teleport-cluster.mdx index 1af346bf07cc8..bd76d4c62112c 100644 --- a/docs/pages/reference/helm-reference/teleport-cluster.mdx +++ b/docs/pages/reference/helm-reference/teleport-cluster.mdx @@ -109,11 +109,13 @@ This is merged with chart-scoped values and takes precedence in case of conflict For example, to override the [`postStart`](#postStart) value only for auth pods: ```yaml # By default all pods postStart command should be "echo starting" -postStart: ["echo", "starting"] +postStart: + command: ["echo", "starting"] auth: # But we override the `postStart` value specifically for auth pods - postStart: ["curl", "http://hook"] + postStart: + command: ["curl", "http://hook"] imagePullPolicy: Always ``` @@ -193,11 +195,13 @@ For example, to override the [`postStart`](#postStart) value only for Teleport P and annotate the Kubernetes Service deployed for the Teleport Proxy Service: ```yaml # By default all pods postStart command should be "echo starting" -postStart: ["echo", "starting"] +postStart: + command: ["echo", "starting"] proxy: # But we override the `postStart` value specifically for proxy pods - postStart: ["curl", "http://hook"] + postStart: + command: ["curl", "http://hook"] imagePullPolicy: Always # We also annotate only the Kubernetes Service sending traffic to Proxy Service pods. diff --git a/e b/e index a8393fdf07cb5..19d39dba6d120 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit a8393fdf07cb5614ad5d78b9e6eb67a93e1abb8c +Subproject commit 19d39dba6d12054453bd815e0f049a38027adc35 diff --git a/examples/access-plugin-minimal/go.mod b/examples/access-plugin-minimal/go.mod index 0511dab49989b..05617c0e5b834 100644 --- a/examples/access-plugin-minimal/go.mod +++ b/examples/access-plugin-minimal/go.mod @@ -43,13 +43,13 @@ require ( go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c // indirect diff --git a/examples/access-plugin-minimal/go.sum b/examples/access-plugin-minimal/go.sum index 9d8d21a00f2e8..f04d77efa3a02 100644 --- a/examples/access-plugin-minimal/go.sum +++ b/examples/access-plugin-minimal/go.sum @@ -173,8 +173,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -215,8 +215,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -231,14 +231,14 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -246,8 +246,8 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/examples/api-sync-roles/go.mod b/examples/api-sync-roles/go.mod index 36bf0549acc1e..95bf5758ee409 100644 --- a/examples/api-sync-roles/go.mod +++ b/examples/api-sync-roles/go.mod @@ -54,13 +54,13 @@ require ( go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.13.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect google.golang.org/appengine v1.6.8 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect diff --git a/examples/api-sync-roles/go.sum b/examples/api-sync-roles/go.sum index 3cb00e34a2cc2..7a99dbe14b9f9 100644 --- a/examples/api-sync-roles/go.sum +++ b/examples/api-sync-roles/go.sum @@ -204,8 +204,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -257,22 +257,22 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44= golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -285,8 +285,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index c429329b1f5e4..bbb8a9ae1573c 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap index 69992eb0744e2..53273a3637e23 100644 --- a/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-discord-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-discord-15.4.24 name: RELEASE-NAME-teleport-plugin-discord diff --git a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap index 28f9a34b27df1..1c436648e8872 100644 --- a/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/discord/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-discord-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-discord-15.4.24 name: RELEASE-NAME-teleport-plugin-discord spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-discord - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-discord-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-discord-15.4.24 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index dce75acc89ac6..a9031d460f435 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap index a78bc97f42572..7eaab291c0682 100644 --- a/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/configmap_test.yaml.snap @@ -26,8 +26,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on): 1: | @@ -59,8 +59,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, no starttls): 1: | @@ -92,8 +92,8 @@ should match the snapshot (smtp on, no starttls): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, password file): 1: | @@ -125,8 +125,8 @@ should match the snapshot (smtp on, password file): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, roleToRecipients set): 1: | @@ -161,8 +161,8 @@ should match the snapshot (smtp on, roleToRecipients set): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email should match the snapshot (smtp on, starttls disabled): 1: | @@ -194,6 +194,6 @@ should match the snapshot (smtp on, starttls disabled): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email diff --git a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap index c3570da6c1ee0..248fb8d318fdc 100644 --- a/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/email/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -22,8 +22,8 @@ should be possible to override volume name (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 spec: containers: - command: @@ -34,7 +34,7 @@ should be possible to override volume name (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -75,8 +75,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -90,8 +90,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 spec: containers: - command: @@ -136,8 +136,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -151,8 +151,8 @@ should match the snapshot (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 spec: containers: - command: @@ -163,7 +163,7 @@ should match the snapshot (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -204,8 +204,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -219,8 +219,8 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 spec: containers: - command: @@ -231,7 +231,7 @@ should match the snapshot (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -272,8 +272,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -287,8 +287,8 @@ should mount external secret (mailgun on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 spec: containers: - command: @@ -299,7 +299,7 @@ should mount external secret (mailgun on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: @@ -340,8 +340,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 name: RELEASE-NAME-teleport-plugin-email spec: replicas: 1 @@ -355,8 +355,8 @@ should mount external secret (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-email - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-email-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-email-15.4.24 spec: containers: - command: @@ -367,7 +367,7 @@ should mount external secret (smtp on): env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-email:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index 7edb5a9076d14..6f1e48acc2fb7 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap index 9cb720bafe428..2918a5e311f9a 100644 --- a/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/configmap_test.yaml.snap @@ -32,6 +32,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-jira-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-jira-15.4.24 name: RELEASE-NAME-teleport-plugin-jira diff --git a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap index a70357f5ff8c8..bcbe739be2c78 100644 --- a/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/jira/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-jira-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-jira-15.4.24 name: RELEASE-NAME-teleport-plugin-jira spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-jira - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-jira-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-jira-15.4.24 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index 1ef9b8d9c09a5..1bed146d7b3b0 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap index 5906a54338974..c78ef836f1b8a 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/configmap_test.yaml.snap @@ -22,6 +22,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-mattermost-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-mattermost-15.4.24 name: RELEASE-NAME-teleport-plugin-mattermost diff --git a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap index cbaed3561fffd..ad7fba78240ec 100644 --- a/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/mattermost/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-mattermost-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-mattermost-15.4.24 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-mattermost-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-mattermost-15.4.24 spec: containers: - command: @@ -75,8 +75,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-mattermost-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-mattermost-15.4.24 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -90,8 +90,8 @@ should mount external secret: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-mattermost-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-mattermost-15.4.24 spec: containers: - command: @@ -102,7 +102,7 @@ should mount external secret: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: @@ -143,8 +143,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-mattermost-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-mattermost-15.4.24 name: RELEASE-NAME-teleport-plugin-mattermost spec: replicas: 1 @@ -158,8 +158,8 @@ should override volume name: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-mattermost - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-mattermost-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-mattermost-15.4.24 spec: containers: - command: @@ -170,7 +170,7 @@ should override volume name: env: - name: TELEPORT_PLUGIN_FAIL_FAST value: "true" - image: public.ecr.aws/gravitational/teleport-plugin-mattermost:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index 3bb8c57ccc069..f8893351dce7f 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap index 6389299b15482..54284af5475d7 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/configmap_test.yaml.snap @@ -29,6 +29,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-msteams-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-msteams-15.4.24 name: RELEASE-NAME-teleport-plugin-msteams diff --git a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap index 29a094855162f..ac9f6f56b7be2 100644 --- a/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/msteams/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-msteams-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-msteams-15.4.24 name: RELEASE-NAME-teleport-plugin-msteams spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-msteams - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-msteams-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-msteams-15.4.24 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index 82a4e7c8c76b8..7b704ca53841e 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap index 25ba6fae1b121..d4af68a2f209d 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/configmap_test.yaml.snap @@ -21,6 +21,6 @@ should match the snapshot (smtp on): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-pagerduty-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-pagerduty-15.4.24 name: RELEASE-NAME-teleport-plugin-pagerduty diff --git a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap index b468fd2f536b4..864b5743cafa7 100644 --- a/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/pagerduty/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-pagerduty-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-pagerduty-15.4.24 name: RELEASE-NAME-teleport-plugin-pagerduty spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-pagerduty - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-pagerduty-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-pagerduty-15.4.24 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index 79f18f8966b13..f74ec52a636bc 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap index 6f4f198c85ca2..fe2fea5920d44 100644 --- a/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/configmap_test.yaml.snap @@ -24,6 +24,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-slack-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-slack-15.4.24 name: RELEASE-NAME-teleport-plugin-slack diff --git a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap index 4412d89d0ceef..a79eec1f58da6 100644 --- a/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/slack/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-slack-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-slack-15.4.24 name: RELEASE-NAME-teleport-plugin-slack spec: replicas: 1 @@ -22,8 +22,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-slack - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-slack-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-slack-15.4.24 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index e5c7122ebc7d1..7144e8a86e0b9 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap index c3e7df7d5481a..31f46e1c3e944 100644 --- a/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/configmap_test.yaml.snap @@ -26,6 +26,6 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-event-handler-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-event-handler-15.4.24 name: RELEASE-NAME-teleport-plugin-event-handler diff --git a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap index 79661fd78453f..817eeef4b4557 100644 --- a/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/event-handler/tests/__snapshot__/deployment_test.yaml.snap @@ -7,8 +7,8 @@ should match the snapshot: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-plugin-event-handler - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-plugin-event-handler-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-plugin-event-handler-15.4.24 name: RELEASE-NAME-teleport-plugin-event-handler spec: replicas: 1 @@ -82,7 +82,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: "true" - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-plugin-event-handler:15.4.23 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:15.4.24 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/tbot/Chart.yaml b/examples/chart/tbot/Chart.yaml index dd57cd2e65657..b075776e319a1 100644 --- a/examples/chart/tbot/Chart.yaml +++ b/examples/chart/tbot/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" name: tbot apiVersion: v2 diff --git a/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap index 054433732d6e5..f3e5f6e5b3f18 100644 --- a/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/tbot/tests/__snapshot__/deployment_test.yaml.snap @@ -29,7 +29,7 @@ should match the snapshot (full): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: tbot - helm.sh/chart: tbot-15.4.23 + helm.sh/chart: tbot-15.4.24 test-key: test-label-pod spec: affinity: @@ -68,7 +68,7 @@ should match the snapshot (full): value: "1" - name: TEST_ENV value: test-value - image: public.ecr.aws/gravitational/tbot-distroless:15.4.23 + image: public.ecr.aws/gravitational/tbot-distroless:15.4.24 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -154,7 +154,7 @@ should match the snapshot (simple): app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: tbot - helm.sh/chart: tbot-15.4.23 + helm.sh/chart: tbot-15.4.24 spec: containers: - args: @@ -176,7 +176,7 @@ should match the snapshot (simple): fieldPath: spec.nodeName - name: KUBERNETES_TOKEN_PATH value: /var/run/secrets/tokens/join-sa-token - image: public.ecr.aws/gravitational/tbot-distroless:15.4.23 + image: public.ecr.aws/gravitational/tbot-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index 440b4dc48a773..0311cb2908c29 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" name: teleport-cluster apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml index ca501a7651dff..af482e0139dcf 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap index 01314ca6ae8c5..12e1c50b7bdf4 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_clusterrole_test.yaml.snap @@ -8,8 +8,8 @@ adds operator permissions to ClusterRole: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-cluster-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-cluster-15.4.24 teleport.dev/majorVersion: "15" name: RELEASE-NAME rules: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap index 7a7367b31ecd3..ab79c68d325c2 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_config_test.yaml.snap @@ -1848,8 +1848,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-cluster-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-cluster-15.4.24 teleport.dev/majorVersion: "15" name: RELEASE-NAME-auth namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap index b2c07900c4cb4..35c4c061991fd 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/auth_deployment_test.yaml.snap @@ -8,7 +8,7 @@ - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -141,7 +141,7 @@ should set nodeSelector when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -238,7 +238,7 @@ should set resources when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -324,7 +324,7 @@ should set securityContext when set in values: - args: - --diag-addr=0.0.0.0:3000 - --apply-on-startup=/etc/teleport/apply-on-startup.yaml - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap index 6325a7ba9cc9a..656725f1562ef 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_config_test.yaml.snap @@ -567,8 +567,8 @@ sets clusterDomain on Configmap: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-cluster-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-cluster-15.4.24 teleport.dev/majorVersion: "15" name: RELEASE-NAME-proxy namespace: NAMESPACE diff --git a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap index ada05f4705ca1..c3eac40b76585 100644 --- a/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap +++ b/examples/chart/teleport-cluster/tests/__snapshot__/proxy_deployment_test.yaml.snap @@ -11,8 +11,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-cluster-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-cluster-15.4.24 teleport.dev/majorVersion: "15" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: ad7b0a3d0684475676991c8017b6cb4d9c79fc8e1d68985be48e623b02d7b25d + checksum/config: 5a6c10c2ce0eb92f7bc08ffe1a210b98b3d5a78625295c47076d76ad5db912c8 kubernetes.io/pod: test-annotation kubernetes.io/pod-different: 4 labels: @@ -34,8 +34,8 @@ sets clusterDomain on Deployment Pods: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: teleport-cluster - app.kubernetes.io/version: 15.4.23 - helm.sh/chart: teleport-cluster-15.4.23 + app.kubernetes.io/version: 15.4.24 + helm.sh/chart: teleport-cluster-15.4.24 teleport.dev/majorVersion: "15" spec: affinity: @@ -44,7 +44,7 @@ sets clusterDomain on Deployment Pods: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v14.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 name: wait-auth-update serviceAccountName: RELEASE-NAME-proxy terminationGracePeriodSeconds: 60 @@ -137,7 +137,7 @@ should provision initContainer correctly when set in values: - wait - no-resolve - RELEASE-NAME-auth-v14.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 name: wait-auth-update resources: limits: @@ -201,7 +201,7 @@ should set nodeSelector when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v14.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 name: wait-auth-update nodeSelector: environment: security @@ -313,7 +313,7 @@ should set resources for wait-auth-update initContainer when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -381,7 +381,7 @@ should set resources for wait-auth-update initContainer when set in values: - wait - no-resolve - RELEASE-NAME-auth-v14.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 name: wait-auth-update resources: limits: @@ -421,7 +421,7 @@ should set resources when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v14.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 name: wait-auth-update resources: limits: @@ -529,7 +529,7 @@ should set securityContext for initContainers when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v14.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 name: wait-auth-update securityContext: allowPrivilegeEscalation: false @@ -637,7 +637,7 @@ should set securityContext when set in values: containers: - args: - --diag-addr=0.0.0.0:3000 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v14.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-cluster/values.yaml b/examples/chart/teleport-cluster/values.yaml index d961a86c7369d..c517fd1da9a00 100644 --- a/examples/chart/teleport-cluster/values.yaml +++ b/examples/chart/teleport-cluster/values.yaml @@ -61,7 +61,8 @@ teleportVersionOverride: "" # For example: # # auth: -# postStart: ["curl", "http://hook"] +# postStart: +# command: ["curl", "http://hook"] # imagePullPolicy: Always auth: # auth.teleportConfig contains YAML teleport configuration for auth pods @@ -84,7 +85,8 @@ auth: # This is merged with chart-scoped values and takes precedence in case of conflict. # For example: # proxy: -# postStart: ["curl", "http://hook"] +# postStart: +# command: ["curl", "http://hook"] # imagePullPolicy: Always # annotations: # service: diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index bf04759b70a27..956fe681fcce6 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "15.4.23" +.version: &version "15.4.24" name: teleport-kube-agent apiVersion: v2 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap index 6372972cdb87e..39d4928fbee0e 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/deployment_test.yaml.snap @@ -32,7 +32,7 @@ sets Deployment annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -107,7 +107,7 @@ sets Deployment labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -169,7 +169,7 @@ sets Pod annotations when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -231,7 +231,7 @@ sets Pod labels when specified if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -310,7 +310,7 @@ should add emptyDir for data when existingDataVolume is not set if action is Upg value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -373,7 +373,7 @@ should add insecureSkipProxyTLSVerify to args when set in values if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -435,7 +435,7 @@ should correctly configure existingDataVolume when set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -495,7 +495,7 @@ should expose diag port if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -569,7 +569,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -643,7 +643,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -705,7 +705,7 @@ should have one replica when replicaCount is not set if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -767,7 +767,7 @@ should mount extraVolumes and extraVolumeMounts if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -836,7 +836,7 @@ should mount tls.existingCASecretName and set environment when set in values if value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -908,7 +908,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: http://username:password@my.proxy.host:3128 - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -976,7 +976,7 @@ should provision initContainer correctly when set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1074,7 +1074,7 @@ should set SecurityContext if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1156,7 +1156,7 @@ should set affinity when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1218,7 +1218,7 @@ should set default serviceAccountName when not set in values if action is Upgrad value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1293,7 +1293,7 @@ should set environment when extraEnv set in values if action is Upgrade: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1417,7 +1417,7 @@ should set imagePullPolicy when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1479,7 +1479,7 @@ should set nodeSelector if set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1543,7 +1543,7 @@ should set not set priorityClassName when not set in values if action is Upgrade value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1617,7 +1617,7 @@ should set preferred affinity when more than one replica is used if action is Up value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1679,7 +1679,7 @@ should set priorityClassName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1742,7 +1742,7 @@ should set probeTimeoutSeconds when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1814,7 +1814,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set if value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1876,7 +1876,7 @@ should set resources when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1945,7 +1945,7 @@ should set serviceAccountName when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2007,7 +2007,7 @@ should set tolerations when set in values if action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap index 62a120d9248ce..e60c8c27e2050 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/job_test.yaml.snap @@ -25,7 +25,7 @@ should create ServiceAccount for post-delete hook by default: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -106,7 +106,7 @@ should not create ServiceAccount for post-delete hook if serviceAccount.create i fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -134,7 +134,7 @@ should not create ServiceAccount, Role or RoleBinding for post-delete hook if se fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -162,7 +162,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -192,7 +192,7 @@ should set resources in the Job's pod spec if resources is set in values: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent name: post-delete-job resources: @@ -227,7 +227,7 @@ should set securityContext in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap index 7364bebb7b023..0d30775aa005b 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/statefulset_test.yaml.snap @@ -18,7 +18,7 @@ sets Pod annotations when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -88,7 +88,7 @@ sets Pod labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -182,7 +182,7 @@ sets StatefulSet labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -280,7 +280,7 @@ should add insecureSkipProxyTLSVerify to args when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -350,7 +350,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and action value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -440,7 +440,7 @@ should add volumeClaimTemplate for data volume when using StatefulSet and is Fre value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -520,7 +520,7 @@ should add volumeMount for data volume when using StatefulSet: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -590,7 +590,7 @@ should expose diag port: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -660,7 +660,7 @@ should generate Statefulset when storage is disabled and mode is a Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -744,7 +744,7 @@ should have multiple replicas when replicaCount is set (using .replicaCount, dep value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -826,7 +826,7 @@ should have multiple replicas when replicaCount is set (using highAvailability.r value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -896,7 +896,7 @@ should have one replica when replicaCount is not set: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -966,7 +966,7 @@ should install Statefulset when storage is disabled and mode is a Fresh Install: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1038,7 +1038,7 @@ should mount extraVolumes and extraVolumeMounts: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1115,7 +1115,7 @@ should mount tls.existingCASecretName and set environment when set in values: value: cluster.local - name: SSL_CERT_FILE value: /etc/teleport-tls-ca/ca.pem - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1197,7 +1197,7 @@ should mount tls.existingCASecretName and set extra environment when set in valu value: /etc/teleport-tls-ca/ca.pem - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1275,7 +1275,7 @@ should not add emptyDir for data when using StatefulSet: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1345,7 +1345,7 @@ should provision initContainer correctly when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1451,7 +1451,7 @@ should set SecurityContext: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1541,7 +1541,7 @@ should set affinity when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1611,7 +1611,7 @@ should set default serviceAccountName when not set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1694,7 +1694,7 @@ should set environment when extraEnv set in values: value: cluster.local - name: HTTPS_PROXY value: http://username:password@my.proxy.host:3128 - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1834,7 +1834,7 @@ should set imagePullPolicy when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1904,7 +1904,7 @@ should set nodeSelector if set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1988,7 +1988,7 @@ should set preferred affinity when more than one replica is used: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2058,7 +2058,7 @@ should set probeTimeoutSeconds when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2138,7 +2138,7 @@ should set required affinity when highAvailability.requireAntiAffinity is set: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2208,7 +2208,7 @@ should set resources when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2285,7 +2285,7 @@ should set serviceAccountName when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2355,7 +2355,7 @@ should set storage.requests when set in values and action is an Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2425,7 +2425,7 @@ should set storage.storageClassName when set in values and action is an Upgrade: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2495,7 +2495,7 @@ should set tolerations when set in values: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:15.4.23 + image: public.ecr.aws/gravitational/teleport-distroless:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap index 0c82518203349..9a133198ab1c4 100644 --- a/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap +++ b/examples/chart/teleport-kube-agent/tests/__snapshot__/updater_deployment_test.yaml.snap @@ -27,7 +27,7 @@ sets the affinity: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:15.4.23 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -71,7 +71,7 @@ sets the tolerations: - --base-image=public.ecr.aws/gravitational/teleport-distroless - --version-server=https://my-custom-version-server/v1 - --version-channel=custom/preview - image: public.ecr.aws/gravitational/teleport-kube-agent-updater:15.4.23 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:15.4.24 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/desktop-registration/go.mod b/examples/desktop-registration/go.mod index b8c51211a2c42..45e02cb6a7f75 100644 --- a/examples/desktop-registration/go.mod +++ b/examples/desktop-registration/go.mod @@ -33,12 +33,12 @@ require ( go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c // indirect google.golang.org/grpc v1.60.1 // indirect diff --git a/examples/desktop-registration/go.sum b/examples/desktop-registration/go.sum index d4a6eaa0e0abd..b98c93d97ccd8 100644 --- a/examples/desktop-registration/go.sum +++ b/examples/desktop-registration/go.sum @@ -155,8 +155,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -208,21 +208,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/examples/go-client/go.mod b/examples/go-client/go.mod index 854807573862e..de884502d1995 100644 --- a/examples/go-client/go.mod +++ b/examples/go-client/go.mod @@ -33,12 +33,12 @@ require ( go.opentelemetry.io/otel/sdk v1.21.0 // indirect go.opentelemetry.io/otel/trace v1.21.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20231002182017-d307bd883b97 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20231009173412-8bfb1ae86b6c // indirect google.golang.org/grpc v1.60.1 // indirect diff --git a/examples/go-client/go.sum b/examples/go-client/go.sum index d4a6eaa0e0abd..b98c93d97ccd8 100644 --- a/examples/go-client/go.sum +++ b/examples/go-client/go.sum @@ -155,8 +155,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -208,21 +208,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= diff --git a/examples/service-discovery-api-client/go.mod b/examples/service-discovery-api-client/go.mod index 2d9915b73d09b..72f1c9ebe7738 100644 --- a/examples/service-discovery-api-client/go.mod +++ b/examples/service-discovery-api-client/go.mod @@ -48,15 +48,16 @@ require ( go.opentelemetry.io/otel/sdk v1.25.0 // indirect go.opentelemetry.io/otel/trace v1.25.0 // indirect go.opentelemetry.io/proto/otlp v1.1.0 // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb // indirect - golang.org/x/mod v0.11.0 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.6.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/examples/service-discovery-api-client/go.sum b/examples/service-discovery-api-client/go.sum index 10fc50f008e3d..74c7d69feb6b3 100644 --- a/examples/service-discovery-api-client/go.sum +++ b/examples/service-discovery-api-client/go.sum @@ -180,8 +180,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb h1:mIKbk8weKhSeLH2GmUTrvx8CjkyJmnU1wFmg59CUjFA= golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= @@ -192,8 +192,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= -golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -208,8 +208,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= @@ -222,8 +222,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -238,21 +238,21 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -265,8 +265,9 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/go.mod b/go.mod index 6c6915404c164..124bfad97bfdb 100644 --- a/go.mod +++ b/go.mod @@ -193,15 +193,15 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 go.opentelemetry.io/proto/otlp v1.0.0 go.uber.org/zap v1.27.0 - golang.org/x/crypto v0.24.0 + golang.org/x/crypto v0.31.0 golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 golang.org/x/mod v0.17.0 golang.org/x/net v0.26.0 golang.org/x/oauth2 v0.19.0 - golang.org/x/sync v0.7.0 - golang.org/x/sys v0.21.0 - golang.org/x/term v0.21.0 - golang.org/x/text v0.16.0 + golang.org/x/sync v0.10.0 + golang.org/x/sys v0.28.0 + golang.org/x/term v0.27.0 + golang.org/x/text v0.21.0 golang.org/x/time v0.5.0 google.golang.org/api v0.177.0 google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6 diff --git a/go.sum b/go.sum index bf6aba1354e89..7a40e3b73c0f9 100644 --- a/go.sum +++ b/go.sum @@ -1703,8 +1703,8 @@ golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45 golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1789,8 +1789,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1854,8 +1854,8 @@ golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1870,8 +1870,8 @@ golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -1887,8 +1887,8 @@ golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= diff --git a/integration/autoupdate/tools/helper_test.go b/integration/autoupdate/tools/helper_test.go new file mode 100644 index 0000000000000..a3c37a9e94b55 --- /dev/null +++ b/integration/autoupdate/tools/helper_test.go @@ -0,0 +1,89 @@ +/* + * Teleport + * Copyright (C) 2024 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 tools_test + +import ( + "net/http" + "sync" +) + +type limitRequest struct { + limit int64 + lock chan struct{} +} + +// limitedResponseWriter wraps http.ResponseWriter and enforces a write limit +// then block the response until signal is received. +type limitedResponseWriter struct { + requests chan limitRequest +} + +// newLimitedResponseWriter creates a new limitedResponseWriter with the lock. +func newLimitedResponseWriter() *limitedResponseWriter { + lw := &limitedResponseWriter{ + requests: make(chan limitRequest, 10), + } + return lw +} + +// Wrap wraps response writer if limit was previously requested, if not, return original one. +func (lw *limitedResponseWriter) Wrap(w http.ResponseWriter) http.ResponseWriter { + select { + case request := <-lw.requests: + return &wrapper{ + ResponseWriter: w, + request: request, + } + default: + return w + } +} + +// SetLimitRequest sends limit request to the pool to wrap next response writer with defined limits. +func (lw *limitedResponseWriter) SetLimitRequest(limit limitRequest) { + lw.requests <- limit +} + +// wrapper wraps the http response writer to control writing operation by blocking it. +type wrapper struct { + http.ResponseWriter + + written int64 + request limitRequest + released bool + + mutex sync.Mutex +} + +// Write writes data to the underlying ResponseWriter but respects the byte limit. +func (lw *wrapper) Write(p []byte) (int, error) { + lw.mutex.Lock() + defer lw.mutex.Unlock() + + if lw.written >= lw.request.limit && !lw.released { + // Send signal that lock is acquired and wait till it was released by response. + lw.request.lock <- struct{}{} + <-lw.request.lock + lw.released = true + } + + n, err := lw.ResponseWriter.Write(p) + lw.written += int64(n) + return n, err +} diff --git a/integration/autoupdate/tools/helper_unix_test.go b/integration/autoupdate/tools/helper_unix_test.go new file mode 100644 index 0000000000000..61ba0766b90d4 --- /dev/null +++ b/integration/autoupdate/tools/helper_unix_test.go @@ -0,0 +1,37 @@ +//go:build !windows + +/* + * Teleport + * Copyright (C) 2024 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 tools_test + +import ( + "errors" + "syscall" + + "github.com/gravitational/trace" +) + +// sendInterrupt sends a SIGINT to the process. +func sendInterrupt(pid int) error { + err := syscall.Kill(pid, syscall.SIGINT) + if errors.Is(err, syscall.ESRCH) { + return trace.BadParameter("can't find the process: %v", pid) + } + return trace.Wrap(err) +} diff --git a/integration/autoupdate/tools/helper_windows_test.go b/integration/autoupdate/tools/helper_windows_test.go new file mode 100644 index 0000000000000..b2ede9ade8c19 --- /dev/null +++ b/integration/autoupdate/tools/helper_windows_test.go @@ -0,0 +1,42 @@ +//go:build windows + +/* + * Teleport + * Copyright (C) 2024 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 tools_test + +import ( + "syscall" + + "github.com/gravitational/trace" + "golang.org/x/sys/windows" +) + +var ( + kernel = windows.NewLazyDLL("kernel32.dll") + ctrlEvent = kernel.NewProc("GenerateConsoleCtrlEvent") +) + +// sendInterrupt sends a Ctrl-Break event to the process. +func sendInterrupt(pid int) error { + r, _, err := ctrlEvent.Call(uintptr(syscall.CTRL_BREAK_EVENT), uintptr(pid)) + if r == 0 { + return trace.Wrap(err) + } + return nil +} diff --git a/integration/autoupdate/tools/main_test.go b/integration/autoupdate/tools/main_test.go new file mode 100644 index 0000000000000..bbc3f559f65c0 --- /dev/null +++ b/integration/autoupdate/tools/main_test.go @@ -0,0 +1,174 @@ +/* + * Teleport + * Copyright (C) 2024 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 tools_test + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "io" + "log" + "net/http" + "net/http/httptest" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "testing" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/constants" + "github.com/gravitational/teleport/integration/helpers/archive" +) + +const ( + testBinaryName = "updater" + teleportToolsVersion = "TELEPORT_TOOLS_VERSION" +) + +var ( + // testVersions list of the pre-compiled binaries with encoded versions to check. + testVersions = []string{ + "1.2.3", + "3.2.1", + } + limitedWriter = newLimitedResponseWriter() + + toolsDir string + baseURL string +) + +func TestMain(m *testing.M) { + ctx := context.Background() + tmp, err := os.MkdirTemp(os.TempDir(), testBinaryName) + if err != nil { + log.Fatalf("failed to create temporary directory: %v", err) + } + + toolsDir, err = os.MkdirTemp(os.TempDir(), "tools") + if err != nil { + log.Fatalf("failed to create temporary directory: %v", err) + } + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + filePath := filepath.Join(tmp, r.URL.Path) + switch { + case strings.HasSuffix(r.URL.Path, ".sha256"): + serve256File(w, r, strings.TrimSuffix(filePath, ".sha256")) + default: + http.ServeFile(limitedWriter.Wrap(w), r, filePath) + } + })) + baseURL = server.URL + for _, version := range testVersions { + if err := buildAndArchiveApps(ctx, tmp, toolsDir, version, server.URL); err != nil { + log.Fatalf("failed to build testing app binary archive: %v", err) + } + } + + // Run tests after binary is built. + code := m.Run() + + server.Close() + if err := os.RemoveAll(tmp); err != nil { + log.Fatalf("failed to remove temporary directory: %v", err) + } + if err := os.RemoveAll(toolsDir); err != nil { + log.Fatalf("failed to remove tools directory: %v", err) + } + + os.Exit(code) +} + +// serve256File calculates sha256 checksum for requested file. +func serve256File(w http.ResponseWriter, _ *http.Request, filePath string) { + log.Printf("Calculating and serving file checksum: %s\n", filePath) + + w.Header().Set("Content-Disposition", "attachment; filename=\""+filepath.Base(filePath)+".sha256\"") + w.Header().Set("Content-Type", "plain/text") + + file, err := os.Open(filePath) + if errors.Is(err, os.ErrNotExist) { + http.Error(w, "file not found", http.StatusNotFound) + return + } + if err != nil { + http.Error(w, "failed to open file", http.StatusInternalServerError) + return + } + defer file.Close() + + hash := sha256.New() + if _, err := io.Copy(hash, file); err != nil { + http.Error(w, "failed to write to hash", http.StatusInternalServerError) + return + } + if _, err := hex.NewEncoder(w).Write(hash.Sum(nil)); err != nil { + http.Error(w, "failed to write checksum", http.StatusInternalServerError) + } +} + +// buildAndArchiveApps compiles the updater integration and pack it depends on platform is used. +func buildAndArchiveApps(ctx context.Context, path string, toolsDir string, version string, baseURL string) error { + versionPath := filepath.Join(path, version) + for _, app := range []string{"tsh", "tctl"} { + output := filepath.Join(versionPath, app) + switch runtime.GOOS { + case constants.WindowsOS: + output = filepath.Join(versionPath, app+".exe") + case constants.DarwinOS: + output = filepath.Join(versionPath, app+".app", "Contents", "MacOS", app) + } + if err := buildBinary(output, toolsDir, version, baseURL); err != nil { + return trace.Wrap(err) + } + } + switch runtime.GOOS { + case constants.DarwinOS: + archivePath := filepath.Join(path, fmt.Sprintf("teleport-%s.pkg", version)) + return trace.Wrap(archive.CompressDirToPkgFile(ctx, versionPath, archivePath, "com.example.pkgtest")) + case constants.WindowsOS: + archivePath := filepath.Join(path, fmt.Sprintf("teleport-v%s-windows-amd64-bin.zip", version)) + return trace.Wrap(archive.CompressDirToZipFile(ctx, versionPath, archivePath)) + default: + archivePath := filepath.Join(path, fmt.Sprintf("teleport-v%s-linux-%s-bin.tar.gz", version, runtime.GOARCH)) + return trace.Wrap(archive.CompressDirToTarGzFile(ctx, versionPath, archivePath)) + } +} + +// buildBinary executes command to build binary with updater logic only for testing. +func buildBinary(output string, toolsDir string, version string, baseURL string) error { + cmd := exec.Command( + "go", "build", "-o", output, + "-ldflags", strings.Join([]string{ + fmt.Sprintf("-X 'main.toolsDir=%s'", toolsDir), + fmt.Sprintf("-X 'main.version=%s'", version), + fmt.Sprintf("-X 'main.baseURL=%s'", baseURL), + }, " "), + "./updater", + ) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + + return trace.Wrap(cmd.Run()) +} diff --git a/integration/autoupdate/tools/updater/main.go b/integration/autoupdate/tools/updater/main.go new file mode 100644 index 0000000000000..8a12dbbd1c9f7 --- /dev/null +++ b/integration/autoupdate/tools/updater/main.go @@ -0,0 +1,78 @@ +/* + * Teleport + * Copyright (C) 2024 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 main + +import ( + "context" + "errors" + "fmt" + "log" + "os" + "os/signal" + "syscall" + "time" + + "github.com/gravitational/teleport/lib/autoupdate/tools" +) + +var ( + version = "development" + baseURL = "http://localhost" + toolsDir = "" +) + +func main() { + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + ctx, _ = signal.NotifyContext(ctx, syscall.SIGINT, syscall.SIGTERM) + + updater := tools.NewUpdater( + toolsDir, + version, + tools.WithBaseURL(baseURL), + ) + toolsVersion, reExec, err := updater.CheckLocal() + if err != nil { + log.Fatal(err) + } + if reExec { + // Download and update the version of client tools required by the cluster. + // This is required if the user passed in the TELEPORT_TOOLS_VERSION explicitly. + err := updater.UpdateWithLock(ctx, toolsVersion) + if errors.Is(err, context.Canceled) { + os.Exit(0) + return + } + if err != nil { + log.Fatalf("failed to download version (%v): %v\n", toolsVersion, err) + return + } + + // Re-execute client tools with the correct version of client tools. + code, err := updater.Exec() + if err != nil { + log.Fatalf("Failed to re-exec client tool: %v\n", err) + } else { + os.Exit(code) + } + } + if len(os.Args) > 1 && os.Args[1] == "version" { + fmt.Printf("Teleport v%v git\n", version) + } +} diff --git a/integration/autoupdate/tools/updater_test.go b/integration/autoupdate/tools/updater_test.go new file mode 100644 index 0000000000000..6e617b3e3cdb1 --- /dev/null +++ b/integration/autoupdate/tools/updater_test.go @@ -0,0 +1,217 @@ +/* + * Teleport + * Copyright (C) 2024 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 tools_test + +import ( + "bytes" + "context" + "fmt" + "os" + "os/exec" + "path/filepath" + "regexp" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/autoupdate/tools" +) + +var ( + // pattern is template for response on version command for client tools {tsh, tctl}. + pattern = regexp.MustCompile(`(?m)Teleport v(.*) git`) +) + +// TestUpdate verifies the basic update logic. We first download a lower version, then request +// an update to a newer version, expecting it to re-execute with the updated version. +func TestUpdate(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + // Fetch compiled test binary with updater logic and install to $TELEPORT_HOME. + updater := tools.NewUpdater( + toolsDir, + testVersions[0], + tools.WithBaseURL(baseURL), + ) + err := updater.Update(ctx, testVersions[0]) + require.NoError(t, err) + + // Verify that the installed version is equal to requested one. + cmd := exec.CommandContext(ctx, filepath.Join(toolsDir, "tsh"), "version") + out, err := cmd.Output() + require.NoError(t, err) + + matches := pattern.FindStringSubmatch(string(out)) + require.Len(t, matches, 2) + require.Equal(t, testVersions[0], matches[1]) + + // Execute version command again with setting the new version which must + // trigger re-execution of the same command after downloading requested version. + cmd = exec.CommandContext(ctx, filepath.Join(toolsDir, "tsh"), "version") + cmd.Env = append( + os.Environ(), + fmt.Sprintf("%s=%s", teleportToolsVersion, testVersions[1]), + ) + out, err = cmd.Output() + require.NoError(t, err) + + matches = pattern.FindStringSubmatch(string(out)) + require.Len(t, matches, 2) + require.Equal(t, testVersions[1], matches[1]) +} + +// TestParallelUpdate launches multiple updater commands in parallel while defining a new version. +// The first process should acquire a lock and block execution for the other processes. After the +// first update is complete, other processes should acquire the lock one by one and re-execute +// the command with the updated version without any new downloads. +func TestParallelUpdate(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + // Initial fetch the updater binary un-archive and replace. + updater := tools.NewUpdater( + toolsDir, + testVersions[0], + tools.WithBaseURL(baseURL), + ) + err := updater.Update(ctx, testVersions[0]) + require.NoError(t, err) + + // By setting the limit request next test http serving file going blocked until unlock is sent. + lock := make(chan struct{}) + limitedWriter.SetLimitRequest(limitRequest{ + limit: 1024, + lock: lock, + }) + + outputs := make([]bytes.Buffer, 3) + errChan := make(chan error, 3) + for i := 0; i < len(outputs); i++ { + cmd := exec.Command(filepath.Join(toolsDir, "tsh"), "version") + cmd.Stdout = &outputs[i] + cmd.Stderr = &outputs[i] + cmd.Env = append( + os.Environ(), + fmt.Sprintf("%s=%s", teleportToolsVersion, testVersions[1]), + ) + err = cmd.Start() + require.NoError(t, err, "failed to start updater") + + go func(cmd *exec.Cmd) { + errChan <- cmd.Wait() + }(cmd) + } + + select { + case err := <-errChan: + require.Fail(t, "we shouldn't receive any error", err) + case <-time.After(5 * time.Second): + require.Fail(t, "failed to wait till the download is started") + case <-lock: + // Wait for a short period to allow other processes to launch and attempt to acquire the lock. + time.Sleep(100 * time.Millisecond) + lock <- struct{}{} + } + + // Wait till process finished with exit code 0, but we still should get progress + // bar in output content. + for i := 0; i < cap(outputs); i++ { + select { + case <-time.After(5 * time.Second): + require.Fail(t, "failed to wait till the process is finished") + case err := <-errChan: + require.NoError(t, err) + } + } + + var progressCount int + for i := 0; i < cap(outputs); i++ { + matches := pattern.FindStringSubmatch(outputs[i].String()) + require.Len(t, matches, 2) + assert.Equal(t, testVersions[1], matches[1]) + if strings.Contains(outputs[i].String(), "Update progress:") { + progressCount++ + } + } + assert.Equal(t, 1, progressCount, "we should have only one progress bar downloading new version") +} + +// TestUpdateInterruptSignal verifies the interrupt signal send to the process must stop downloading. +func TestUpdateInterruptSignal(t *testing.T) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + // Initial fetch the updater binary un-archive and replace. + updater := tools.NewUpdater( + toolsDir, + testVersions[0], + tools.WithBaseURL(baseURL), + ) + err := updater.Update(ctx, testVersions[0]) + require.NoError(t, err) + + var output bytes.Buffer + cmd := exec.Command(filepath.Join(toolsDir, "tsh"), "version") + cmd.Stdout = &output + cmd.Stderr = &output + cmd.Env = append( + os.Environ(), + fmt.Sprintf("%s=%s", teleportToolsVersion, testVersions[1]), + ) + err = cmd.Start() + require.NoError(t, err, "failed to start updater") + pid := cmd.Process.Pid + + errChan := make(chan error) + go func() { + errChan <- cmd.Wait() + }() + + // By setting the limit request next test http serving file going blocked until unlock is sent. + lock := make(chan struct{}) + limitedWriter.SetLimitRequest(limitRequest{ + limit: 1024, + lock: lock, + }) + + select { + case err := <-errChan: + require.Fail(t, "we shouldn't receive any error", err) + case <-time.After(5 * time.Second): + require.Fail(t, "failed to wait till the download is started") + case <-lock: + time.Sleep(100 * time.Millisecond) + require.NoError(t, sendInterrupt(pid)) + lock <- struct{}{} + } + + // Wait till process finished with exit code 0, but we still should get progress + // bar in output content. + select { + case <-time.After(5 * time.Second): + require.Fail(t, "failed to wait till the process interrupted") + case err := <-errChan: + require.NoError(t, err) + } + assert.Contains(t, output.String(), "Update progress:") +} diff --git a/integration/helpers/archive/packaging.go b/integration/helpers/archive/packaging.go new file mode 100644 index 0000000000000..ee237749115a3 --- /dev/null +++ b/integration/helpers/archive/packaging.go @@ -0,0 +1,170 @@ +/* + * Teleport + * Copyright (C) 2024 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 archive + +import ( + "archive/tar" + "archive/zip" + "compress/gzip" + "context" + "io" + "log/slog" + "os" + "os/exec" + "path/filepath" + "runtime" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" +) + +// CompressDirToZipFile compresses a source directory into `.zip` format and stores at `archivePath`, +// preserving the relative file path structure of the source directory. +func CompressDirToZipFile(ctx context.Context, sourceDir, archivePath string) (err error) { + archive, err := os.Create(archivePath) + if err != nil { + return trace.Wrap(err) + } + defer func() { + if closeErr := archive.Close(); closeErr != nil { + err = trace.NewAggregate(err, closeErr) + return + } + if err != nil { + if err := os.Remove(archivePath); err != nil { + slog.ErrorContext(ctx, "failed to remove archive", "error", err) + } + } + }() + + zipWriter := zip.NewWriter(archive) + err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return trace.Wrap(err) + } + if info.IsDir() { + return nil + } + file, err := os.Open(path) + if err != nil { + return trace.Wrap(err) + } + defer file.Close() + relPath, err := filepath.Rel(sourceDir, path) + if err != nil { + return trace.Wrap(err) + } + zipFileWriter, err := zipWriter.Create(relPath) + if err != nil { + return trace.Wrap(err) + } + if _, err = io.Copy(zipFileWriter, file); err != nil { + return trace.Wrap(err) + } + return trace.Wrap(file.Close()) + }) + if err != nil { + return trace.Wrap(err) + } + if err = zipWriter.Close(); err != nil { + return trace.Wrap(err) + } + + return +} + +// CompressDirToTarGzFile compresses a source directory into .tar.gz format and stores at `archivePath`, +// preserving the relative file path structure of the source directory. +func CompressDirToTarGzFile(ctx context.Context, sourceDir, archivePath string) (err error) { + archive, err := os.Create(archivePath) + if err != nil { + return trace.Wrap(err) + } + defer func() { + if closeErr := archive.Close(); closeErr != nil { + err = trace.NewAggregate(err, closeErr) + return + } + if err != nil { + if err := os.Remove(archivePath); err != nil { + slog.ErrorContext(ctx, "failed to remove archive", "error", err) + } + } + }() + gzipWriter := gzip.NewWriter(archive) + tarWriter := tar.NewWriter(gzipWriter) + err = filepath.Walk(sourceDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + header, err := tar.FileInfoHeader(info, info.Name()) + if err != nil { + return trace.Wrap(err) + } + header.Name, err = filepath.Rel(sourceDir, path) + if err != nil { + return trace.Wrap(err) + } + if err := tarWriter.WriteHeader(header); err != nil { + return trace.Wrap(err) + } + if _, err = io.Copy(tarWriter, file); err != nil { + return trace.Wrap(err) + } + return trace.Wrap(file.Close()) + }) + if err != nil { + return trace.Wrap(err) + } + if err = tarWriter.Close(); err != nil { + return trace.Wrap(err) + } + if err = gzipWriter.Close(); err != nil { + return trace.Wrap(err) + } + + return +} + +// CompressDirToPkgFile runs for the macOS `pkgbuild` command to generate a .pkg +// archive file from the source directory. +func CompressDirToPkgFile(ctx context.Context, sourceDir, archivePath, identifier string) error { + if runtime.GOOS != "darwin" { + return trace.BadParameter("only darwin platform is supported for pkg file") + } + cmd := exec.CommandContext( + ctx, + "pkgbuild", + "--root", sourceDir, + "--identifier", identifier, + "--version", teleport.Version, + archivePath, + ) + + return trace.Wrap(cmd.Run()) +} diff --git a/integration/helpers/instance.go b/integration/helpers/instance.go index fb4fdc3947f09..a552193cad8e4 100644 --- a/integration/helpers/instance.go +++ b/integration/helpers/instance.go @@ -444,6 +444,7 @@ func (i *TeleInstance) Create(t *testing.T, trustedSecrets []*InstanceSecrets, e tconf.Proxy.DisableWebInterface = true tconf.CircuitBreakerConfig = breaker.NoopBreakerConfig() tconf.InstanceMetadataClient = imds.NewDisabledIMDSClient() + tconf.DebugService.Enabled = false return i.CreateEx(t, trustedSecrets, tconf) } @@ -469,6 +470,7 @@ func (i *TeleInstance) GenerateConfig(t *testing.T, trustedSecrets []*InstanceSe tconf.Auth.ClusterName, err = services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ ClusterName: i.Secrets.SiteName, }) + tconf.DebugService.Enabled = false if err != nil { return nil, trace.Wrap(err) } @@ -737,6 +739,7 @@ func (i *TeleInstance) StartNodeWithTargetPort(tconf *servicecfg.Config, authPor } tconf.Auth.Enabled = false tconf.Proxy.Enabled = false + tconf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -779,6 +782,7 @@ func (i *TeleInstance) StartApp(conf *servicecfg.Config) (*service.TeleportProce conf.Testing.UploadEventsC = i.UploadEventsC conf.Auth.Enabled = false conf.Proxy.Enabled = false + conf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -829,6 +833,7 @@ func (i *TeleInstance) StartApps(configs []*servicecfg.Config) ([]*service.Telep cfg.Testing.UploadEventsC = i.UploadEventsC cfg.Auth.Enabled = false cfg.Proxy.Enabled = false + cfg.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -894,6 +899,7 @@ func (i *TeleInstance) StartDatabase(conf *servicecfg.Config) (*service.Teleport conf.Proxy.Enabled = false conf.Apps.Enabled = false conf.SSH.Enabled = false + conf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -956,6 +962,7 @@ func (i *TeleInstance) StartKube(t *testing.T, conf *servicecfg.Config, clusterN conf.Apps.Enabled = false conf.SSH.Enabled = false conf.Databases.Enabled = false + conf.DebugService.Enabled = false conf.Kube.KubeconfigPath = filepath.Join(dataDir, "kube_config") if err := EnableKube(t, conf, clusterName); err != nil { @@ -1031,6 +1038,7 @@ func (i *TeleInstance) StartNodeAndProxy(t *testing.T, name string) (sshPort, we } tconf.CircuitBreakerConfig = breaker.NoopBreakerConfig() tconf.InstanceMetadataClient = imds.NewDisabledIMDSClient() + tconf.DebugService.Enabled = false // Create a new Teleport process and add it to the list of nodes that // compose this "cluster". @@ -1124,6 +1132,7 @@ func (i *TeleInstance) StartProxy(cfg ProxyConfig, opts ...Option) (reversetunne tconf.Proxy.DisableALPNSNIListener = cfg.DisableALPNSNIListener tconf.CircuitBreakerConfig = breaker.NoopBreakerConfig() tconf.InstanceMetadataClient = imds.NewDisabledIMDSClient() + tconf.DebugService.Enabled = false tconf.FileDescriptors = cfg.FileDescriptors // apply options for _, o := range opts { diff --git a/integration/integration_test.go b/integration/integration_test.go index 6557cdcf9b1b8..96e10fe53c448 100644 --- a/integration/integration_test.go +++ b/integration/integration_test.go @@ -994,7 +994,7 @@ func testSessionRecordingModes(t *testing.T, suite *integrationTestSuite) { // waitSessionTermination wait until the errCh returns something and assert // it with the provided function. waitSessionTermination := func(t *testing.T, errCh chan error, errorAssertion require.ErrorAssertionFunc) { - errorAssertion(t, waitForError(errCh, 10*time.Second)) + errorAssertion(t, waitForError(errCh, 30*time.Second)) } // enableDiskFailure changes the OpenFileFunc on filesession package. The @@ -4420,12 +4420,18 @@ func testDiscoveryNode(t *testing.T, suite *integrationTestSuite) { helpers.WaitForActiveTunnelConnections(t, main.Tunnel, helpers.Site, 1) helpers.WaitForActiveTunnelConnections(t, proxyTunnel, helpers.Site, 1) + // Wait for the nodes to be visible to both Proxy instances. + require.NoError(t, main.WaitForNodeCount(ctx, helpers.Site, 1)) + instance := helpers.TeleInstance{Tunnel: proxyTunnel} + require.NoError(t, instance.WaitForNodeCount(ctx, helpers.Site, 1)) + // Execute the connection via first proxy. cfg := helpers.ClientConfig{ Login: suite.Me.Username, Cluster: helpers.Site, Host: "cluster-main-node", } + output, err := runCommand(t, main, []string{"echo", "hello world"}, cfg, 1) require.NoError(t, err) require.Equal(t, "hello world\n", output) diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 767dc89ff1626..03353c07985f8 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -283,14 +283,14 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect - golang.org/x/crypto v0.28.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/oauth2 v0.19.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.26.0 // indirect - golang.org/x/term v0.25.0 // indirect - golang.org/x/text v0.19.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/api v0.177.0 // indirect google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6 // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index cbad9394edb1e..a31301c9b7f00 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -997,8 +997,8 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= -golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w= golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= @@ -1056,8 +1056,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= -golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1098,8 +1098,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1111,8 +1111,8 @@ golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= -golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -1125,8 +1125,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= -golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index e302ddd41d841..4d2e1341daae7 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -167,6 +167,7 @@ require ( github.com/google/go-tpm-tools v0.4.4 // indirect github.com/google/go-tspi v0.3.0 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/renameio/v2 v2.0.0 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect @@ -317,15 +318,15 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect go.opentelemetry.io/proto/otlp v1.0.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect - golang.org/x/crypto v0.24.0 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.26.0 // indirect golang.org/x/oauth2 v0.19.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.21.0 // indirect - golang.org/x/term v0.21.0 // indirect - golang.org/x/text v0.16.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/sys v0.28.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.177.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 0e42d1d384ba5..81191ec8c82f6 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -612,7 +612,6 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= @@ -1366,8 +1365,8 @@ golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1473,8 +1472,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1542,8 +1541,8 @@ golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1557,8 +1556,8 @@ golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= -golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1575,8 +1574,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/lib/auth/autoupdate/autoupdatev1/service.go b/lib/auth/autoupdate/autoupdatev1/service.go index b14edeb13d6f9..e88ff95d87382 100644 --- a/lib/auth/autoupdate/autoupdatev1/service.go +++ b/lib/auth/autoupdate/autoupdatev1/service.go @@ -20,13 +20,16 @@ package autoupdatev1 import ( "context" + "log/slog" "github.com/gravitational/trace" "google.golang.org/protobuf/types/known/emptypb" "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/services" ) @@ -47,6 +50,8 @@ type ServiceConfig struct { Backend services.AutoUpdateService // Cache is the cache used to store AutoUpdate resources. Cache Cache + // Emitter is the event emitter. + Emitter apievents.Emitter } // Service implements the gRPC API layer for the AutoUpdate. @@ -55,6 +60,7 @@ type Service struct { authorizer authz.Authorizer backend services.AutoUpdateService + emitter apievents.Emitter cache Cache } @@ -67,11 +73,14 @@ func NewService(cfg ServiceConfig) (*Service, error) { return nil, trace.BadParameter("authorizer is required") case cfg.Cache == nil: return nil, trace.BadParameter("cache is required") + case cfg.Emitter == nil: + return nil, trace.BadParameter("Emitter is required") } return &Service{ authorizer: cfg.Authorizer, backend: cfg.Backend, cache: cfg.Cache, + emitter: cfg.Emitter, }, nil } @@ -110,6 +119,27 @@ func (s *Service) CreateAutoUpdateConfig(ctx context.Context, req *autoupdate.Cr } config, err := s.backend.CreateAutoUpdateConfig(ctx, req.Config) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateConfigCreate{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateConfigCreateEvent, + Code: events.AutoUpdateConfigCreateCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateConfig, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) return config, trace.Wrap(err) } @@ -129,6 +159,27 @@ func (s *Service) UpdateAutoUpdateConfig(ctx context.Context, req *autoupdate.Up } config, err := s.backend.UpdateAutoUpdateConfig(ctx, req.Config) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateConfigUpdate{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateConfigUpdateEvent, + Code: events.AutoUpdateConfigUpdateCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateConfig, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) return config, trace.Wrap(err) } @@ -148,6 +199,27 @@ func (s *Service) UpsertAutoUpdateConfig(ctx context.Context, req *autoupdate.Up } config, err := s.backend.UpsertAutoUpdateConfig(ctx, req.Config) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateConfigUpdate{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateConfigUpdateEvent, + Code: events.AutoUpdateConfigUpdateCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateConfig, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) return config, trace.Wrap(err) } @@ -166,10 +238,29 @@ func (s *Service) DeleteAutoUpdateConfig(ctx context.Context, req *autoupdate.De return nil, trace.Wrap(err) } - if err := s.backend.DeleteAutoUpdateConfig(ctx); err != nil { - return nil, trace.Wrap(err) - } - return &emptypb.Empty{}, nil + err = s.backend.DeleteAutoUpdateConfig(ctx) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateConfigDelete{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateConfigDeleteEvent, + Code: events.AutoUpdateConfigDeleteCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateConfig, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) + return &emptypb.Empty{}, trace.Wrap(err) } // GetAutoUpdateVersion gets the current AutoUpdateVersion singleton. @@ -207,6 +298,28 @@ func (s *Service) CreateAutoUpdateVersion(ctx context.Context, req *autoupdate.C } autoUpdateVersion, err := s.backend.CreateAutoUpdateVersion(ctx, req.Version) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateVersionCreate{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateVersionCreateEvent, + Code: events.AutoUpdateVersionCreateCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateVersion, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) + return autoUpdateVersion, trace.Wrap(err) } @@ -226,6 +339,28 @@ func (s *Service) UpdateAutoUpdateVersion(ctx context.Context, req *autoupdate.U } autoUpdateVersion, err := s.backend.UpdateAutoUpdateVersion(ctx, req.Version) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateVersionUpdate{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateVersionUpdateEvent, + Code: events.AutoUpdateVersionUpdateCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateVersion, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) + return autoUpdateVersion, trace.Wrap(err) } @@ -245,6 +380,28 @@ func (s *Service) UpsertAutoUpdateVersion(ctx context.Context, req *autoupdate.U } autoUpdateVersion, err := s.backend.UpsertAutoUpdateVersion(ctx, req.Version) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateVersionUpdate{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateVersionUpdateEvent, + Code: events.AutoUpdateVersionUpdateCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateVersion, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) + return autoUpdateVersion, trace.Wrap(err) } @@ -263,8 +420,36 @@ func (s *Service) DeleteAutoUpdateVersion(ctx context.Context, req *autoupdate.D return nil, trace.Wrap(err) } - if err := s.backend.DeleteAutoUpdateVersion(ctx); err != nil { - return nil, trace.Wrap(err) + err = s.backend.DeleteAutoUpdateVersion(ctx) + var errMsg string + if err != nil { + errMsg = err.Error() + } + userMetadata := authz.ClientUserMetadata(ctx) + s.emitEvent(ctx, &apievents.AutoUpdateVersionDelete{ + Metadata: apievents.Metadata{ + Type: events.AutoUpdateVersionDeleteEvent, + Code: events.AutoUpdateVersionDeleteCode, + }, + UserMetadata: userMetadata, + ResourceMetadata: apievents.ResourceMetadata{ + Name: types.MetaNameAutoUpdateVersion, + UpdatedBy: userMetadata.User, + }, + ConnectionMetadata: authz.ConnectionMetadata(ctx), + Status: apievents.Status{ + Success: err == nil, + Error: errMsg, + }, + }) + return &emptypb.Empty{}, trace.Wrap(err) +} + +func (s *Service) emitEvent(ctx context.Context, e apievents.AuditEvent) { + if err := s.emitter.EmitAuditEvent(ctx, e); err != nil { + slog.WarnContext(ctx, "Failed to emit audit event", + "type", e.GetType(), + "error", err, + ) } - return &emptypb.Empty{}, nil } diff --git a/lib/auth/autoupdate/autoupdatev1/service_test.go b/lib/auth/autoupdate/autoupdatev1/service_test.go index 840fd9bbf94cd..eed042614cc37 100644 --- a/lib/auth/autoupdate/autoupdatev1/service_test.go +++ b/lib/auth/autoupdate/autoupdatev1/service_test.go @@ -25,10 +25,14 @@ import ( "github.com/gravitational/trace" "github.com/stretchr/testify/require" - "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + autoupdatev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/autoupdate" + apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/backend/memory" + libevents "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/events/eventstest" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/local" "github.com/gravitational/teleport/lib/utils" @@ -63,7 +67,7 @@ func otherAdminStates(states []authz.AdminActionAuthState) []authz.AdminActionAu // callMethod calls a method with given name in the DatabaseObjectService service func callMethod(t *testing.T, service *Service, method string) error { - for _, desc := range autoupdate.AutoUpdateService_ServiceDesc.Methods { + for _, desc := range autoupdatev1pb.AutoUpdateService_ServiceDesc.Methods { if desc.MethodName == method { _, err := desc.Handler(service, context.Background(), func(_ any) error { return nil }, nil) return err @@ -177,7 +181,7 @@ func TestServiceAccess(t *testing.T) { t.Run(stateToString(state), func(t *testing.T) { for _, verbs := range utils.Combinations(tt.allowedVerbs) { t.Run(fmt.Sprintf("verbs=%v", verbs), func(t *testing.T) { - service := newService(t, state, fakeChecker{allowedVerbs: verbs}) + service := newService(t, state, fakeChecker{allowedVerbs: verbs}, &libevents.DiscardEmitter{}) err := callMethod(t, service, tt.name) // expect access denied except with full set of verbs. if len(verbs) == len(tt.allowedVerbs) { @@ -201,7 +205,7 @@ func TestServiceAccess(t *testing.T) { t.Run(stateToString(state), func(t *testing.T) { // it is enough to test against tt.allowedVerbs, // this is the only different data point compared to the test cases above. - service := newService(t, state, fakeChecker{allowedVerbs: tt.allowedVerbs}) + service := newService(t, state, fakeChecker{allowedVerbs: tt.allowedVerbs}, &libevents.DiscardEmitter{}) err := callMethod(t, service, tt.name) require.True(t, trace.IsAccessDenied(err)) }) @@ -212,7 +216,7 @@ func TestServiceAccess(t *testing.T) { // verify that all declared methods have matching test cases t.Run("verify coverage", func(t *testing.T) { - for _, method := range autoupdate.AutoUpdateService_ServiceDesc.Methods { + for _, method := range autoupdatev1pb.AutoUpdateService_ServiceDesc.Methods { t.Run(method.MethodName, func(t *testing.T) { match := false for _, testCase := range testCases { @@ -224,6 +228,98 @@ func TestServiceAccess(t *testing.T) { }) } +func TestAutoUpdateConfigEvents(t *testing.T) { + rwVerbs := []string{types.VerbList, types.VerbCreate, types.VerbRead, types.VerbUpdate, types.VerbDelete} + mockEmitter := &eventstest.MockRecorderEmitter{} + service := newService(t, authz.AdminActionAuthMFAVerified, fakeChecker{allowedVerbs: rwVerbs}, mockEmitter) + ctx := context.Background() + + config, err := autoupdate.NewAutoUpdateConfig(&autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeEnabled, + }, + }) + require.NoError(t, err) + + _, err = service.CreateAutoUpdateConfig(ctx, &autoupdatev1pb.CreateAutoUpdateConfigRequest{Config: config}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateConfigCreateEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateConfigCreateCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateConfig, mockEmitter.LastEvent().(*apievents.AutoUpdateConfigCreate).Name) + mockEmitter.Reset() + + _, err = service.UpdateAutoUpdateConfig(ctx, &autoupdatev1pb.UpdateAutoUpdateConfigRequest{Config: config}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateConfigUpdateEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateConfigUpdateCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateConfig, mockEmitter.LastEvent().(*apievents.AutoUpdateConfigUpdate).Name) + mockEmitter.Reset() + + _, err = service.UpsertAutoUpdateConfig(ctx, &autoupdatev1pb.UpsertAutoUpdateConfigRequest{Config: config}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateConfigUpdateEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateConfigUpdateCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateConfig, mockEmitter.LastEvent().(*apievents.AutoUpdateConfigUpdate).Name) + mockEmitter.Reset() + + _, err = service.DeleteAutoUpdateConfig(ctx, &autoupdatev1pb.DeleteAutoUpdateConfigRequest{}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateConfigDeleteEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateConfigDeleteCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateConfig, mockEmitter.LastEvent().(*apievents.AutoUpdateConfigDelete).Name) + mockEmitter.Reset() +} + +func TestAutoUpdateVersionEvents(t *testing.T) { + rwVerbs := []string{types.VerbList, types.VerbCreate, types.VerbRead, types.VerbUpdate, types.VerbDelete} + mockEmitter := &eventstest.MockRecorderEmitter{} + service := newService(t, authz.AdminActionAuthMFAVerified, fakeChecker{allowedVerbs: rwVerbs}, mockEmitter) + ctx := context.Background() + + config, err := autoupdate.NewAutoUpdateVersion(&autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, + }) + require.NoError(t, err) + + _, err = service.CreateAutoUpdateVersion(ctx, &autoupdatev1pb.CreateAutoUpdateVersionRequest{Version: config}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateVersionCreateEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateVersionCreateCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateVersion, mockEmitter.LastEvent().(*apievents.AutoUpdateVersionCreate).Name) + mockEmitter.Reset() + + _, err = service.UpdateAutoUpdateVersion(ctx, &autoupdatev1pb.UpdateAutoUpdateVersionRequest{Version: config}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateVersionUpdateEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateVersionUpdateCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateVersion, mockEmitter.LastEvent().(*apievents.AutoUpdateVersionUpdate).Name) + mockEmitter.Reset() + + _, err = service.UpsertAutoUpdateVersion(ctx, &autoupdatev1pb.UpsertAutoUpdateVersionRequest{Version: config}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateVersionUpdateEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateVersionUpdateCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateVersion, mockEmitter.LastEvent().(*apievents.AutoUpdateVersionUpdate).Name) + mockEmitter.Reset() + + _, err = service.DeleteAutoUpdateVersion(ctx, &autoupdatev1pb.DeleteAutoUpdateVersionRequest{}) + require.NoError(t, err) + require.Len(t, mockEmitter.Events(), 1) + require.Equal(t, libevents.AutoUpdateVersionDeleteEvent, mockEmitter.LastEvent().GetType()) + require.Equal(t, libevents.AutoUpdateVersionDeleteCode, mockEmitter.LastEvent().GetCode()) + require.Equal(t, types.MetaNameAutoUpdateVersion, mockEmitter.LastEvent().(*apievents.AutoUpdateVersionDelete).Name) + mockEmitter.Reset() +} + type fakeChecker struct { allowedVerbs []string services.AccessChecker @@ -241,7 +337,7 @@ func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resourc return trace.AccessDenied("access denied to rule=%v/verb=%v", resource, verb) } -func newService(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker) *Service { +func newService(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker, emitter apievents.Emitter) *Service { t.Helper() bk, err := memory.New(memory.Config{}) @@ -250,10 +346,10 @@ func newService(t *testing.T, authState authz.AdminActionAuthState, checker serv storage, err := local.NewAutoUpdateService(bk) require.NoError(t, err) - return newServiceWithStorage(t, authState, checker, storage) + return newServiceWithStorage(t, authState, checker, storage, emitter) } -func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker, storage services.AutoUpdateService) *Service { +func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker, storage services.AutoUpdateService, emitter apievents.Emitter) *Service { t.Helper() authorizer := authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { @@ -272,6 +368,7 @@ func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, c Authorizer: authorizer, Backend: storage, Cache: storage, + Emitter: emitter, }) require.NoError(t, err) return service diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index dadbf086c53a7..ab2e58090b250 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -6026,6 +6026,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { autoUpdateServiceServer, err := autoupdatev1.NewService(autoupdatev1.ServiceConfig{ Authorizer: cfg.Authorizer, + Emitter: cfg.Emitter, Backend: cfg.AuthServer.Services, Cache: cfg.AuthServer.Cache, }) diff --git a/lib/auth/join_azure.go b/lib/auth/join_azure.go index 4ce6311a6970f..311fea19ca14e 100644 --- a/lib/auth/join_azure.go +++ b/lib/auth/join_azure.go @@ -269,7 +269,7 @@ func verifyVMIdentity(ctx context.Context, cfg *azureRegisterConfig, accessToken // If the token is from a user-assigned managed identity, the resource ID is // for the identity and we need to look the VM up by VM ID. } else { - vm, err = vmClient.GetByVMID(ctx, types.Wildcard, vmID) + vm, err = vmClient.GetByVMID(ctx, vmID) if err != nil { if trace.IsNotFound(err) { return nil, trace.AccessDenied("no VM found with matching VM ID") diff --git a/lib/auth/join_azure_test.go b/lib/auth/join_azure_test.go index faa9bb6f0cb95..50b026598dcd7 100644 --- a/lib/auth/join_azure_test.go +++ b/lib/auth/join_azure_test.go @@ -73,13 +73,13 @@ func (m *mockAzureVMClient) Get(_ context.Context, resourceID string) (*azure.Vi return vm, nil } -func (m *mockAzureVMClient) GetByVMID(_ context.Context, resourceGroup, vmID string) (*azure.VirtualMachine, error) { +func (m *mockAzureVMClient) GetByVMID(_ context.Context, vmID string) (*azure.VirtualMachine, error) { for _, vm := range m.vms { - if vm.VMID == vmID && (resourceGroup == types.Wildcard || vm.ResourceGroup == resourceGroup) { + if vm.VMID == vmID { return vm, nil } } - return nil, trace.NotFound("no vm in groups %q with id %q", resourceGroup, vmID) + return nil, trace.NotFound("no vm with id %q", vmID) } func makeVMClientGetter(clients map[string]*mockAzureVMClient) vmClientGetter { diff --git a/lib/autoupdate/tools/helper.go b/lib/autoupdate/tools/helper.go new file mode 100644 index 0000000000000..79069c3d3c90b --- /dev/null +++ b/lib/autoupdate/tools/helper.go @@ -0,0 +1,111 @@ +/* + * Teleport + * Copyright (C) 2024 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 tools + +import ( + "context" + "errors" + "log/slog" + "os" + + "github.com/gravitational/trace" + + stacksignal "github.com/gravitational/teleport/lib/utils/signal" +) + +// CheckAndUpdateLocal verifies if the TELEPORT_TOOLS_VERSION environment variable +// is set and a version is defined (or disabled by setting it to "off"). The requested +// version is compared with the current client tools version. If they differ, the version +// package is downloaded, extracted to the client tools directory, and re-executed +// with the updated version. +// If $TELEPORT_HOME/bin contains downloaded client tools, it always re-executes +// using the version from the home directory. +func CheckAndUpdateLocal(ctx context.Context, currentVersion string) error { + toolsDir, err := Dir() + if err != nil { + slog.WarnContext(ctx, "Client tools update is disabled", "error", err) + return nil + } + updater := NewUpdater(toolsDir, currentVersion) + // At process startup, check if a version has already been downloaded to + // $TELEPORT_HOME/bin or if the user has set the TELEPORT_TOOLS_VERSION + // environment variable. If so, re-exec that version of client tools. + toolsVersion, reExec, err := updater.CheckLocal() + if err != nil { + return trace.Wrap(err) + } + if reExec { + return trace.Wrap(updateAndReExec(ctx, updater, toolsVersion)) + } + + return nil +} + +// CheckAndUpdateRemote verifies client tools version is set for update in cluster +// configuration by making the http request to `webapi/find` endpoint. The requested +// version is compared with the current client tools version. If they differ, the version +// package is downloaded, extracted to the client tools directory, and re-executed +// with the updated version. +// If $TELEPORT_HOME/bin contains downloaded client tools, it always re-executes +// using the version from the home directory. +func CheckAndUpdateRemote(ctx context.Context, currentVersion string, proxy string, insecure bool) error { + toolsDir, err := Dir() + if err != nil { + slog.WarnContext(ctx, "Client tools update is disabled", "error", err) + return nil + } + updater := NewUpdater(toolsDir, currentVersion) + // The user has typed a command like `tsh ssh ...` without being logged in, + // if the running binary needs to be updated, update and re-exec. + // + // If needed, download the new version of client tools and re-exec. Make + // sure to exit this process with the same exit code as the child process. + toolsVersion, reExec, err := updater.CheckRemote(ctx, proxy, insecure) + if err != nil { + return trace.Wrap(err) + } + if reExec { + return trace.Wrap(updateAndReExec(ctx, updater, toolsVersion)) + } + + return nil +} + +func updateAndReExec(ctx context.Context, updater *Updater, toolsVersion string) error { + ctxUpdate, cancel := stacksignal.GetSignalHandler().NotifyContext(ctx) + defer cancel() + // Download the version of client tools required by the cluster. This + // is required if the user passed in the TELEPORT_TOOLS_VERSION + // explicitly. + err := updater.UpdateWithLock(ctxUpdate, toolsVersion) + if err != nil && !errors.Is(err, context.Canceled) { + return trace.Wrap(err) + } + + // Re-execute client tools with the correct version of client tools. + code, err := updater.Exec() + if err != nil && !errors.Is(err, os.ErrNotExist) { + slog.DebugContext(ctx, "Failed to re-exec client tool", "error", err) + os.Exit(code) + } else if err == nil { + os.Exit(code) + } + + return nil +} diff --git a/lib/autoupdate/tools/progress.go b/lib/autoupdate/tools/progress.go new file mode 100644 index 0000000000000..34bbad2ff888d --- /dev/null +++ b/lib/autoupdate/tools/progress.go @@ -0,0 +1,78 @@ +/* + * Teleport + * Copyright (C) 2024 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 tools + +import ( + "fmt" + "io" + "strings" + + "github.com/gravitational/trace" +) + +type progressWriter struct { + n int64 + limit int64 + size int + progress int +} + +// newProgressWriter creates progress writer instance and prints empty +// progress bar right after initialisation. +func newProgressWriter(size int) (*progressWriter, func()) { + pw := &progressWriter{size: size} + pw.Print(0) + return pw, func() { + fmt.Print("\n") + } +} + +// Print prints the update progress bar with `n` bricks. +func (w *progressWriter) Print(n int) { + bricks := strings.Repeat("â–’", n) + strings.Repeat(" ", w.size-n) + fmt.Print("\rUpdate progress: [" + bricks + "] (Ctrl-C to cancel update)") +} + +func (w *progressWriter) Write(p []byte) (int, error) { + if w.limit == 0 || w.size == 0 { + return len(p), nil + } + + w.n += int64(len(p)) + bricks := int((w.n*100)/w.limit) / w.size + if w.progress != bricks { + w.Print(bricks) + w.progress = bricks + } + + return len(p), nil +} + +// CopyLimit sets the limit of writing bytes to the progress writer and initiate copying process. +func (w *progressWriter) CopyLimit(dst io.Writer, src io.Reader, limit int64) (written int64, err error) { + if limit < 0 { + n, err := io.Copy(dst, io.TeeReader(src, w)) + w.Print(w.size) + return n, trace.Wrap(err) + } + + w.limit = limit + n, err := io.CopyN(dst, io.TeeReader(src, w), limit) + return n, trace.Wrap(err) +} diff --git a/lib/autoupdate/tools/updater.go b/lib/autoupdate/tools/updater.go new file mode 100644 index 0000000000000..8bad07c395391 --- /dev/null +++ b/lib/autoupdate/tools/updater.go @@ -0,0 +1,428 @@ +/* + * Teleport + * Copyright (C) 2024 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 tools + +import ( + "bytes" + "context" + "crypto/sha256" + "crypto/x509" + "encoding/hex" + "fmt" + "io" + "log/slog" + "net/http" + "os" + "os/exec" + "path/filepath" + "regexp" + "runtime" + "syscall" + "time" + + "github.com/coreos/go-semver/semver" + "github.com/google/uuid" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/client/webclient" + "github.com/gravitational/teleport/api/constants" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/packaging" +) + +const ( + // teleportToolsVersionEnv is environment name for requesting specific version for update. + teleportToolsVersionEnv = "TELEPORT_TOOLS_VERSION" + // baseURL is CDN URL for downloading official Teleport packages. + baseURL = "https://cdn.teleport.dev" + // reservedFreeDisk is the predefined amount of free disk space (in bytes) required + // to remain available after downloading archives. + reservedFreeDisk = 10 * 1024 * 1024 // 10 Mb + // lockFileName is file used for locking update process in parallel. + lockFileName = ".lock" + // updatePackageSuffix is directory suffix used for package extraction in tools directory. + updatePackageSuffix = "-update-pkg" +) + +var ( + // // pattern is template for response on version command for client tools {tsh, tctl}. + pattern = regexp.MustCompile(`(?m)Teleport v(.*) git`) +) + +// Option applies an option value for the Updater. +type Option func(u *Updater) + +// WithBaseURL defines custom base url for the updater. +func WithBaseURL(baseURL string) Option { + return func(u *Updater) { + u.baseURL = baseURL + } +} + +// WithClient defines custom http client for the Updater. +func WithClient(client *http.Client) Option { + return func(u *Updater) { + u.client = client + } +} + +// WithTools defines custom list of the tools has to be installed by updater. +func WithTools(tools []string) Option { + return func(u *Updater) { + u.tools = tools + } +} + +// Updater is updater implementation for the client tools auto updates. +type Updater struct { + toolsDir string + localVersion string + tools []string + + baseURL string + client *http.Client +} + +// NewUpdater initializes the updater for client tools auto updates. We need to specify the tools directory +// path where we download, extract package archives with the new version, and replace symlinks +// (e.g., `$TELEPORT_HOME/bin`). +// The base URL of the CDN with Teleport packages, the `http.Client` and the list of tools (e.g., `tsh`, `tctl`) +// that must be updated can be customized via options. +func NewUpdater(toolsDir, localVersion string, options ...Option) *Updater { + updater := &Updater{ + tools: DefaultClientTools(), + toolsDir: toolsDir, + localVersion: localVersion, + baseURL: baseURL, + client: http.DefaultClient, + } + for _, option := range options { + option(updater) + } + + return updater +} + +// CheckLocal is run at client tool startup and will only perform local checks. +// Returns the version needs to be updated and re-executed, by re-execution flag we +// understand that update and re-execute is required. +func (u *Updater) CheckLocal() (version string, reExec bool, err error) { + // Check if the user has requested a specific version of client tools. + requestedVersion := os.Getenv(teleportToolsVersionEnv) + switch requestedVersion { + // The user has turned off any form of automatic updates. + case "off": + return "", false, nil + // Requested version already the same as client version. + case u.localVersion: + return u.localVersion, false, nil + // No requested version, we continue. + case "": + // Requested version that is not the local one. + default: + if _, err := semver.NewVersion(requestedVersion); err != nil { + return "", false, trace.Wrap(err, "checking that request version is semantic") + } + return requestedVersion, true, nil + } + + // If a version of client tools has already been downloaded to + // tools directory, return that. + toolsVersion, err := CheckToolVersion(u.toolsDir) + if trace.IsNotFound(err) { + return u.localVersion, false, nil + } + if err != nil { + return "", false, trace.Wrap(err) + } + + return toolsVersion, true, nil +} + +// CheckRemote first checks the version set by the environment variable. If not set or disabled, +// it checks against the Proxy Service to determine if client tools need updating by requesting +// the `webapi/find` handler, which stores information about the required client tools version to +// operate with this cluster. It returns the semantic version that needs updating and whether +// re-execution is necessary, by re-execution flag we understand that update and re-execute is required. +func (u *Updater) CheckRemote(ctx context.Context, proxyAddr string, insecure bool) (version string, reExec bool, err error) { + // Check if the user has requested a specific version of client tools. + requestedVersion := os.Getenv(teleportToolsVersionEnv) + switch requestedVersion { + // The user has turned off any form of automatic updates. + case "off": + return "", false, nil + // Requested version already the same as client version. + case u.localVersion: + return u.localVersion, false, nil + // No requested version, we continue. + case "": + // Requested version that is not the local one. + default: + if _, err := semver.NewVersion(requestedVersion); err != nil { + return "", false, trace.Wrap(err, "checking that request version is semantic") + } + return requestedVersion, true, nil + } + + certPool, err := x509.SystemCertPool() + if err != nil { + return "", false, trace.Wrap(err) + } + resp, err := webclient.Find(&webclient.Config{ + Context: ctx, + ProxyAddr: proxyAddr, + Pool: certPool, + Timeout: 10 * time.Second, + Insecure: insecure, + }) + if err != nil { + return "", false, trace.Wrap(err) + } + + // If a version of client tools has already been downloaded to + // tools directory, return that. + toolsVersion, err := CheckToolVersion(u.toolsDir) + if err != nil && !trace.IsNotFound(err) { + return "", false, trace.Wrap(err) + } + + switch { + case !resp.AutoUpdate.ToolsAutoUpdate || resp.AutoUpdate.ToolsVersion == "": + if toolsVersion == "" { + return u.localVersion, false, nil + } + case u.localVersion == resp.AutoUpdate.ToolsVersion: + return u.localVersion, false, nil + case resp.AutoUpdate.ToolsVersion != toolsVersion: + return resp.AutoUpdate.ToolsVersion, true, nil + } + + return toolsVersion, true, nil +} + +// UpdateWithLock acquires filesystem lock, downloads requested version package, +// unarchive and replace existing one. +func (u *Updater) UpdateWithLock(ctx context.Context, updateToolsVersion string) (err error) { + // Create tools directory if it does not exist. + if err := os.MkdirAll(u.toolsDir, 0o755); err != nil { + return trace.Wrap(err) + } + // Lock concurrent client tools execution util requested version is updated. + unlock, err := utils.FSWriteLock(filepath.Join(u.toolsDir, lockFileName)) + if err != nil { + return trace.Wrap(err) + } + defer func() { + err = trace.NewAggregate(err, unlock()) + }() + + // If the version of the running binary or the version downloaded to + // tools directory is the same as the requested version of client tools, + // nothing to be done, exit early. + toolsVersion, err := CheckToolVersion(u.toolsDir) + if err != nil && !trace.IsNotFound(err) { + return trace.Wrap(err) + } + if updateToolsVersion == toolsVersion { + return nil + } + + // Download and update client tools in tools directory. + if err := u.Update(ctx, updateToolsVersion); err != nil { + return trace.Wrap(err) + } + + return nil +} + +// Update downloads requested version and replace it with existing one and cleanups the previous downloads +// with defined updater directory suffix. +func (u *Updater) Update(ctx context.Context, toolsVersion string) error { + // Get platform specific download URLs. + packages, err := teleportPackageURLs(u.baseURL, toolsVersion) + if err != nil { + return trace.Wrap(err) + } + + var pkgNames []string + for _, pkg := range packages { + pkgName := fmt.Sprint(uuid.New().String(), updatePackageSuffix) + if err := u.update(ctx, pkg, pkgName); err != nil { + return trace.Wrap(err) + } + pkgNames = append(pkgNames, pkgName) + } + + // Cleanup the tools directory with previously downloaded and un-archived versions. + if err := packaging.RemoveWithSuffix(u.toolsDir, updatePackageSuffix, pkgNames); err != nil { + slog.WarnContext(ctx, "failed to clean up tools directory", "error", err) + } + + return nil +} + +// update downloads the archive and validate against the hash. Download to a +// temporary path within tools directory. +func (u *Updater) update(ctx context.Context, pkg packageURL, pkgName string) error { + f, err := os.CreateTemp("", "teleport-") + if err != nil { + return trace.Wrap(err) + } + defer func() { + _ = f.Close() + if err := os.Remove(f.Name()); err != nil { + slog.WarnContext(ctx, "failed to remove temporary archive file", "error", err) + } + }() + + archiveHash, err := u.downloadArchive(ctx, pkg.Archive, f) + if pkg.Optional && trace.IsNotFound(err) { + return nil + } + if err != nil { + return trace.Wrap(err) + } + + hash, err := u.downloadHash(ctx, pkg.Hash) + if pkg.Optional && trace.IsNotFound(err) { + return nil + } + if err != nil { + return trace.Wrap(err) + } + + if !bytes.Equal(archiveHash, hash) { + return trace.BadParameter("hash of archive does not match downloaded archive") + } + + extractDir := filepath.Join(u.toolsDir, pkgName) + if runtime.GOOS != constants.DarwinOS { + if err := os.Mkdir(extractDir, 0o755); err != nil { + return trace.Wrap(err) + } + } + + // Perform atomic replace so concurrent exec do not fail. + if err := packaging.ReplaceToolsBinaries(u.toolsDir, f.Name(), extractDir, u.tools); err != nil { + return trace.Wrap(err) + } + + return nil +} + +// Exec re-executes tool command with same arguments and environ variables. +func (u *Updater) Exec() (int, error) { + path, err := toolName(u.toolsDir) + if err != nil { + return 0, trace.Wrap(err) + } + // To prevent re-execution loop we have to disable update logic for re-execution. + env := append(os.Environ(), teleportToolsVersionEnv+"=off") + + if runtime.GOOS == constants.WindowsOS { + cmd := exec.Command(path, os.Args[1:]...) + cmd.Env = env + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + return 0, trace.Wrap(err) + } + + return cmd.ProcessState.ExitCode(), nil + } + + if err := syscall.Exec(path, append([]string{path}, os.Args[1:]...), env); err != nil { + return 0, trace.Wrap(err) + } + + return 0, nil +} + +// downloadHash downloads the hash file `.sha256` for package checksum validation and return the hash sum. +func (u *Updater) downloadHash(ctx context.Context, url string) ([]byte, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := u.client.Do(req) + if err != nil { + return nil, trace.Wrap(err) + } + defer resp.Body.Close() + if resp.StatusCode == http.StatusNotFound { + return nil, trace.NotFound("hash file is not found: %q", url) + } + if resp.StatusCode != http.StatusOK { + return nil, trace.BadParameter("bad status when downloading archive hash: %v", resp.StatusCode) + } + + var buf bytes.Buffer + _, err = io.CopyN(&buf, resp.Body, sha256.Size*2) // SHA bytes to hex + if err != nil { + return nil, trace.Wrap(err) + } + hexBytes, err := hex.DecodeString(buf.String()) + if err != nil { + return nil, trace.Wrap(err) + } + + return hexBytes, nil +} + +// downloadArchive downloads the archive package by `url` and writes content to the writer interface, +// return calculated sha256 hash sum of the content. +func (u *Updater) downloadArchive(ctx context.Context, url string, f io.Writer) ([]byte, error) { + // Display a progress bar before initiating the update request to inform the user that + // an update is in progress, allowing them the option to cancel before actual response + // which might be delayed with slow internet connection or complete isolation to CDN. + pw, finish := newProgressWriter(10) + defer finish() + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, trace.Wrap(err) + } + resp, err := u.client.Do(req) + if err != nil { + return nil, trace.Wrap(err) + } + defer resp.Body.Close() + if resp.StatusCode == http.StatusNotFound { + return nil, trace.NotFound("archive file is not found: %v", resp.StatusCode) + } + if resp.StatusCode != http.StatusOK { + return nil, trace.BadParameter("bad status when downloading archive: %v", resp.StatusCode) + } + + if resp.ContentLength != -1 { + if err := checkFreeSpace(u.toolsDir, uint64(resp.ContentLength)); err != nil { + return nil, trace.Wrap(err) + } + } + + h := sha256.New() + // It is a little inefficient to download the file to disk and then re-load + // it into memory to unarchive later, but this is safer as it allows client + // tools to validate the hash before trying to operate on the archive. + if _, err := pw.CopyLimit(f, io.TeeReader(resp.Body, h), resp.ContentLength); err != nil { + return nil, trace.Wrap(err) + } + + return h.Sum(nil), nil +} diff --git a/lib/autoupdate/tools/utils.go b/lib/autoupdate/tools/utils.go new file mode 100644 index 0000000000000..178e2818dd274 --- /dev/null +++ b/lib/autoupdate/tools/utils.go @@ -0,0 +1,188 @@ +/* + * Teleport + * Copyright (C) 2024 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 tools + +import ( + "bufio" + "bytes" + "context" + "errors" + "os" + "os/exec" + "path/filepath" + "runtime" + "strings" + "time" + + "github.com/coreos/go-semver/semver" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/constants" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/modules" + "github.com/gravitational/teleport/lib/utils" +) + +// Dir returns the path to client tools in $TELEPORT_HOME/bin. +func Dir() (string, error) { + home := os.Getenv(types.HomeEnvVar) + if home == "" { + var err error + home, err = os.UserHomeDir() + if err != nil { + return "", trace.Wrap(err) + } + } + + return filepath.Join(home, ".tsh", "bin"), nil +} + +// DefaultClientTools list of the client tools needs to be updated by default. +func DefaultClientTools() []string { + switch runtime.GOOS { + case constants.WindowsOS: + return []string{"tsh.exe", "tctl.exe"} + default: + return []string{"tsh", "tctl"} + } +} + +// CheckToolVersion returns current installed client tools version, must return NotFoundError if +// the client tools is not found in tools directory. +func CheckToolVersion(toolsDir string) (string, error) { + // Find the path to the current executable. + path, err := toolName(toolsDir) + if err != nil { + return "", trace.Wrap(err) + } + if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) { + return "", trace.NotFound("autoupdate tool not found in %q", toolsDir) + } else if err != nil { + return "", trace.Wrap(err) + } + + // Set a timeout to not let "{tsh, tctl} version" block forever. Allow up + // to 10 seconds because sometimes MDM tools like Jamf cause a lot of + // latency in launching binaries. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + // Execute "{tsh, tctl} version" and pass in TELEPORT_TOOLS_VERSION=off to + // turn off all automatic updates code paths to prevent any recursion. + command := exec.CommandContext(ctx, path, "version") + command.Env = []string{teleportToolsVersionEnv + "=off"} + output, err := command.Output() + if err != nil { + return "", trace.WrapWithMessage(err, "failed to determine version of %q tool", path) + } + + // The output for "{tsh, tctl} version" can be multiple lines. Find the + // actual version line and extract the version. + scanner := bufio.NewScanner(bytes.NewReader(output)) + for scanner.Scan() { + line := scanner.Text() + + if !strings.HasPrefix(line, "Teleport") { + continue + } + + matches := pattern.FindStringSubmatch(line) + if len(matches) != 2 { + return "", trace.BadParameter("invalid version line: %v", line) + } + version, err := semver.NewVersion(matches[1]) + if err != nil { + return "", trace.Wrap(err) + } + return version.String(), nil + } + + return "", trace.BadParameter("unable to determine version") +} + +// packageURL defines URLs to the archive and their archive sha256 hash file, and marks +// if this package is optional, for such case download needs to be ignored if package +// not found in CDN. +type packageURL struct { + Archive string + Hash string + Optional bool +} + +// teleportPackageURLs returns the URL for the Teleport archive to download. The format is: +// https://cdn.teleport.dev/teleport-{, ent-}v15.3.0-{linux, darwin, windows}-{amd64,arm64,arm,386}-{fips-}bin.tar.gz +func teleportPackageURLs(baseURL, toolsVersion string) ([]packageURL, error) { + switch runtime.GOOS { + case "darwin": + tsh := baseURL + "/tsh-" + toolsVersion + ".pkg" + teleport := baseURL + "/teleport-" + toolsVersion + ".pkg" + return []packageURL{ + {Archive: teleport, Hash: teleport + ".sha256"}, + {Archive: tsh, Hash: tsh + ".sha256", Optional: true}, + }, nil + case "windows": + archive := baseURL + "/teleport-v" + toolsVersion + "-windows-amd64-bin.zip" + return []packageURL{ + {Archive: archive, Hash: archive + ".sha256"}, + }, nil + case "linux": + m := modules.GetModules() + var b strings.Builder + b.WriteString(baseURL + "/teleport-") + if m.BuildType() == modules.BuildEnterprise || m.IsBoringBinary() { + b.WriteString("ent-") + } + b.WriteString("v" + toolsVersion + "-" + runtime.GOOS + "-" + runtime.GOARCH + "-") + if m.IsBoringBinary() { + b.WriteString("fips-") + } + b.WriteString("bin.tar.gz") + archive := b.String() + return []packageURL{ + {Archive: archive, Hash: archive + ".sha256"}, + }, nil + default: + return nil, trace.BadParameter("unsupported runtime: %v", runtime.GOOS) + } +} + +// toolName returns the path to {tsh, tctl} for the executable that started +// the current process. +func toolName(toolsDir string) (string, error) { + executablePath, err := os.Executable() + if err != nil { + return "", trace.Wrap(err) + } + + return filepath.Join(toolsDir, filepath.Base(executablePath)), nil +} + +// checkFreeSpace verifies that we have enough requested space at specific directory. +func checkFreeSpace(path string, requested uint64) error { + free, err := utils.FreeDiskWithReserve(path, reservedFreeDisk) + if err != nil { + return trace.Errorf("failed to calculate free disk in %q: %v", path, err) + } + // Bail if there's not enough free disk space at the target. + if requested > free { + return trace.Errorf("%q needs %d additional bytes of disk space", path, requested-free) + } + + return nil +} diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 1e0666be6a340..d058abde83d7d 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -3683,7 +3683,9 @@ func newAutoUpdateConfig(t *testing.T) *autoupdate.AutoUpdateConfig { t.Helper() r, err := update.NewAutoUpdateConfig(&autoupdate.AutoUpdateConfigSpec{ - ToolsAutoupdate: true, + Tools: &autoupdate.AutoUpdateConfigSpecTools{ + Mode: update.ToolsUpdateModeEnabled, + }, }) require.NoError(t, err) return r @@ -3693,7 +3695,9 @@ func newAutoUpdateVersion(t *testing.T) *autoupdate.AutoUpdateVersion { t.Helper() r, err := update.NewAutoUpdateVersion(&autoupdate.AutoUpdateVersionSpec{ - ToolsVersion: "1.2.3", + Tools: &autoupdate.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, }) require.NoError(t, err) return r diff --git a/lib/client/api.go b/lib/client/api.go index 81a482072617c..83529816c9e40 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -73,6 +73,7 @@ import ( "github.com/gravitational/teleport/lib/auth/touchid" wancli "github.com/gravitational/teleport/lib/auth/webauthncli" "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/autoupdate/tools" libmfa "github.com/gravitational/teleport/lib/client/mfa" "github.com/gravitational/teleport/lib/client/terminal" "github.com/gravitational/teleport/lib/defaults" @@ -668,6 +669,10 @@ func RetryWithRelogin(ctx context.Context, tc *TeleportClient, fn func() error, return trace.Wrap(err) } + if err := tools.CheckAndUpdateRemote(ctx, teleport.Version, tc.WebProxyAddr, tc.InsecureSkipVerify); err != nil { + return trace.Wrap(err) + } + return fn() } diff --git a/lib/client/x11_session.go b/lib/client/x11_session.go index 61738795d5b95..d39bd14c752a0 100644 --- a/lib/client/x11_session.go +++ b/lib/client/x11_session.go @@ -20,6 +20,8 @@ package client import ( "context" + "fmt" + "log/slog" "os" "time" @@ -41,7 +43,7 @@ func (ns *NodeSession) handleX11Forwarding(ctx context.Context, sess *tracessh.S display, err := x11.GetXDisplay() if err != nil { - log.WithError(err).Info("X11 forwarding requested but $DISPLAY is invalid") + slog.InfoContext(ctx, "X11 forwarding requested but $DISPLAY is invalid", "err", err) return ns.rejectX11Channels(ctx) } @@ -60,8 +62,8 @@ func (ns *NodeSession) handleX11Forwarding(ctx context.Context, sess *tracessh.S if err := x11.RequestForwarding(sess.Session, ns.spoofedXAuthEntry); err != nil { // Notify the user that x11 forwarding request failed regardless of debug level - log.Print("X11 forwarding request failed") - log.WithError(err).Debug("X11 forwarding request error") + fmt.Fprintln(os.Stderr, "X11 forwarding request failed") + slog.DebugContext(ctx, "X11 forwarding request error", "err", err) // If the X11 forwarding request fails, we must reject all X11 channel requests. return ns.rejectX11Channels(ctx) } @@ -76,25 +78,35 @@ func (ns *NodeSession) handleX11Forwarding(ctx context.Context, sess *tracessh.S // This will be used during X11 forwarding to forward and authorize // XServer requests from the remote server to the client's XServer. func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) error { + checkXauthErr := x11.CheckXAuthPath() + if checkXauthErr != nil && !ns.nodeClient.TC.X11ForwardingTrusted { + slog.WarnContext(ctx, "Untrusted X11 forwarding requires xauth to be installed in order generated xauth key data") + return trace.Wrap(checkXauthErr) + } + if ns.nodeClient.TC.X11ForwardingTrusted { - // For trusted X11 forwarding, we can create a random cookie without xauth + slog.WarnContext(ctx, "Trusted X11 forwarding provides unmitigated access to your local XServer, use with caution") + + // Check for existing xauth data. If found, it must be used in order to connect to the client's XServer. + var err error + if checkXauthErr == nil { + ns.clientXAuthEntry, err = x11.NewXAuthCommand(ctx, "" /* xauthFile */).ReadEntry(display) + if !trace.IsNotFound(err) { + return trace.Wrap(err) + } + } + + // If no xauth data was found, we can create a random cookie without xauth // as it is only used to validate the server-client connection. Locally, // the client's XServer will ignore the cookie and use whatever authentication // mechanisms it would use as if the client made the request locally. - log.Info("Creating a fake xauth cookie for trusted X11 forwarding.") - log.Warn("Trusted X11 forwarding provides unmitigated access to your local XServer, use with caution") + slog.InfoContext(ctx, "No xauth data found, creating a fake xauth cookie for trusted X11 forwarding.") - var err error ns.clientXAuthEntry, err = x11.NewFakeXAuthEntry(display) return trace.Wrap(err) } - if err := x11.CheckXAuthPath(); err != nil { - log.Info("trusted X11 forwarding requested but xauth is not installed") - return trace.Wrap(err) - } - - // Generate the xauth entry in a temporary file so it only exists within the context of this request. + // Generate an untrusted xauth entry in a temporary file so it only exists within the context of this request. // The XServer will recognize the xauth data regardless of it's existence within the file system. xauthFile, err := os.CreateTemp("", "tsh-xauthfile-*") if err != nil { @@ -110,7 +122,7 @@ func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) er defer func() { if err := os.Remove(xauthFile.Name()); err != nil { - log.WithError(err).Debug("Failed to remove temporary xauth file") + slog.DebugContext(ctx, "Failed to remove temporary xauth file", "err", err) } }() @@ -123,7 +135,7 @@ func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) er ns.x11RefuseTime = time.Now().Add(ns.nodeClient.TC.X11ForwardingTimeout) } - log.Info("creating an untrusted xauth cookie for untrusted X11 forwarding") + slog.InfoContext(ctx, "creating an untrusted xauth cookie for untrusted X11 forwarding", "xauth_file", xauthFile.Name()) cmd := x11.NewXAuthCommand(ctx, xauthFile.Name()) if err := cmd.GenerateUntrustedCookie(display, ns.nodeClient.TC.X11ForwardingTimeout); err != nil { return trace.Wrap(err) @@ -131,6 +143,7 @@ func (ns *NodeSession) setXAuthData(ctx context.Context, display x11.Display) er ns.clientXAuthEntry, err = x11.NewXAuthCommand(ctx, xauthFile.Name()).ReadEntry(display) if err != nil { + slog.ErrorContext(ctx, "untrusted X11 forwarding setup failed: failed to generate xauth key data") return trace.Wrap(err) } @@ -142,21 +155,21 @@ func (ns *NodeSession) serveX11Channels(ctx context.Context, sess *tracessh.Sess err := x11.ServeChannelRequests(ctx, ns.nodeClient.Client.Client, func(ctx context.Context, nch ssh.NewChannel) { if !ns.x11RefuseTime.IsZero() && time.Now().After(ns.x11RefuseTime) { nch.Reject(ssh.Prohibited, "rejected X11 channel request after ForwardX11Timeout") - log.Warn("rejected X11 forwarding attempt after the ForwardX11Timeout") + slog.WarnContext(ctx, "rejected X11 forwarding attempt after the ForwardX11Timeout") return } var req x11.ChannelRequestPayload if err := ssh.Unmarshal(nch.ExtraData(), &req); err != nil { nch.Reject(ssh.Prohibited, "invalid payload") - log.WithError(err).Debug("rejected X11 channel request with invalid payload") + slog.DebugContext(ctx, "rejected X11 channel request with invalid payload", "err", err) return } - log.Debugf("received X11 channel request from %s:%d", req.OriginatorAddress, req.OriginatorPort) + slog.DebugContext(ctx, "received X11 channel request from %s:%d", req.OriginatorAddress, req.OriginatorPort) xchan, sin, err := nch.Accept() if err != nil { - log.WithError(err).Debug("failed to accept X11 channel request") + slog.DebugContext(ctx, "failed to accept X11 channel request", "err", err) return } defer xchan.Close() @@ -166,24 +179,24 @@ func (ns *NodeSession) serveX11Channels(ctx context.Context, sess *tracessh.Sess // client's xauth cookie. Otherwise, the request will be denied. authPacket, err := x11.ReadAndRewriteXAuthPacket(xchan, ns.spoofedXAuthEntry, ns.clientXAuthEntry) if trace.IsAccessDenied(err) { - log.Error("X11 connection rejected due to wrong authentication") + slog.ErrorContext(ctx, "X11 connection rejected due to wrong authentication", "err", err) return } else if err != nil { - log.WithError(err).Debug("Failed to read xauth packet from X11 channel request") + slog.DebugContext(ctx, "Failed to read xauth packet from X11 channel request", "err", err) return } // Dial a connection to the client's XServer. xconn, err := ns.clientXAuthEntry.Display.Dial() if err != nil { - log.WithError(err).Debug("Failed to connect to client's display") + slog.DebugContext(ctx, "Failed to connect to client's display", "err", err) return } defer xconn.Close() // Send the processed X11 auth packet to the client's XServer connection. if _, err := xconn.Write(authPacket); err != nil { - log.WithError(err).Debug("Failed to write xauth packet") + slog.DebugContext(ctx, "Failed to write xauth packet", "err", err) return } @@ -194,12 +207,12 @@ func (ns *NodeSession) serveX11Channels(ctx context.Context, sess *tracessh.Sess go func() { err := sshutils.ForwardRequests(ctx, sin, sess) if err != nil { - log.WithError(err).Debug("Failed to forward ssh request from server during X11 forwarding") + slog.DebugContext(ctx, "Failed to forward ssh request from server during X11 forwarding", "err", err) } }() if err := x11.Forward(ctx, xconn, xchan); err != nil { - log.WithError(err).Debug("Encountered error during X11 forwarding") + slog.DebugContext(ctx, "Encountered error during X11 forwarding", "err", err) } }) return trace.Wrap(err) @@ -211,7 +224,7 @@ func (ns *NodeSession) rejectX11Channels(ctx context.Context) error { // According to RFC 4254, client "implementations MUST reject any X11 channel // open requests if they have not requested X11 forwarding". Following openssh's // example, we treat such a request as a break in attempt and warn the user. - log.Warn("server tried X11 forwarding without client requesting it, this is likely a break-in attempt by a malicious user") + slog.WarnContext(ctx, "server tried X11 forwarding without client requesting it, this is likely a break-in attempt by a malicious user") nch.Reject(ssh.Prohibited, "") }) return trace.Wrap(err) diff --git a/lib/cloud/azure/vm.go b/lib/cloud/azure/vm.go index 2c9242712d4ba..48572cbc2066e 100644 --- a/lib/cloud/azure/vm.go +++ b/lib/cloud/azure/vm.go @@ -46,7 +46,7 @@ type VirtualMachinesClient interface { // Get returns the virtual machine for the given resource ID. Get(ctx context.Context, resourceID string) (*VirtualMachine, error) // GetByVMID returns the virtual machine for a given VM ID. - GetByVMID(ctx context.Context, resourceGroup, vmID string) (*VirtualMachine, error) + GetByVMID(ctx context.Context, vmID string) (*VirtualMachine, error) // ListVirtualMachines gets all of the virtual machines in the given resource group. ListVirtualMachines(ctx context.Context, resourceGroup string) ([]*armcompute.VirtualMachine, error) } @@ -146,15 +146,19 @@ func (c *vmClient) Get(ctx context.Context, resourceID string) (*VirtualMachine, } // GetByVMID returns the virtual machine for a given VM ID. -func (c *vmClient) GetByVMID(ctx context.Context, resourceGroup, vmID string) (*VirtualMachine, error) { - vms, err := c.ListVirtualMachines(ctx, resourceGroup) - if err != nil { - return nil, trace.Wrap(err) - } - for _, vm := range vms { - if vm.Properties != nil && *vm.Properties.VMID == vmID { - result, err := parseVirtualMachine(vm) - return result, trace.Wrap(err) +func (c *vmClient) GetByVMID(ctx context.Context, vmID string) (*VirtualMachine, error) { + pager := newListAllPager(c.api.NewListAllPager(&armcompute.VirtualMachinesClientListAllOptions{})) + for pager.more() { + res, err := pager.nextPage(ctx) + if err != nil { + return nil, trace.Wrap(ConvertResponseError(err)) + } + + for _, vm := range res { + if vm.Properties != nil && *vm.Properties.VMID == vmID { + result, err := parseVirtualMachine(vm) + return result, trace.Wrap(err) + } } } return nil, trace.NotFound("no VM with ID %q", vmID) diff --git a/lib/events/api.go b/lib/events/api.go index 9a5d1ff52b17b..6f0c3b3bf6924 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -791,6 +791,20 @@ const ( CrownJewelUpdateEvent = "access_graph.crown_jewel.update" // CrownJewelDeleteEvent is emitted when a crown jewel resource is deleted. CrownJewelDeleteEvent = "access_graph.crown_jewel.delete" + + // AutoUpdateConfigCreateEvent is emitted when a AutoUpdateConfig resource is created. + AutoUpdateConfigCreateEvent = "auto_update_config.create" + // AutoUpdateConfigUpdateEvent is emitted when a AutoUpdateConfig resource is updated. + AutoUpdateConfigUpdateEvent = "auto_update_config.update" + // AutoUpdateConfigDeleteEvent is emitted when a AutoUpdateConfig resource is deleted. + AutoUpdateConfigDeleteEvent = "auto_update_config.delete" + + // AutoUpdateVersionCreateEvent is emitted when a AutoUpdateVersion resource is created. + AutoUpdateVersionCreateEvent = "auto_update_version.create" + // AutoUpdateVersionUpdateEvent is emitted when a AutoUpdateVersion resource is updated. + AutoUpdateVersionUpdateEvent = "auto_update_version.update" + // AutoUpdateVersionDeleteEvent is emitted when a AutoUpdateVersion resource is deleted. + AutoUpdateVersionDeleteEvent = "auto_update_version.delete" ) // Add an entry to eventsMap in lib/events/events_test.go when you add diff --git a/lib/events/codes.go b/lib/events/codes.go index 3a3e25c316885..6044c3b62b4d2 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -647,6 +647,20 @@ const ( // CrownJewelDeleteCode is the crown jewel delete event code. CrownJewelDeleteCode = "CJ003I" + // AutoUpdateConfigCreateCode is the auto update config create event code. + AutoUpdateConfigCreateCode = "AUC001I" + // AutoUpdateConfigUpdateCode is the auto update config update event code. + AutoUpdateConfigUpdateCode = "AUC002I" + // AutoUpdateConfigDeleteCode is the auto update config delete event code. + AutoUpdateConfigDeleteCode = "AUC003I" + + // AutoUpdateVersionCreateCode is the auto update version create event code. + AutoUpdateVersionCreateCode = "AUV001I" + // AutoUpdateVersionUpdateCode is the auto update version update event code. + AutoUpdateVersionUpdateCode = "AUV002I" + // AutoUpdateVersionDeleteCode is the auto update version delete event code. + AutoUpdateVersionDeleteCode = "AUV003I" + // UnknownCode is used when an event of unknown type is encountered. UnknownCode = apievents.UnknownCode ) diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index 1975d387ec0e0..f1dd33435344d 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -422,6 +422,20 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { e = &events.CrownJewelUpdate{} case CrownJewelDeleteEvent: e = &events.CrownJewelDelete{} + + case AutoUpdateConfigCreateEvent: + e = &events.AutoUpdateConfigCreate{} + case AutoUpdateConfigUpdateEvent: + e = &events.AutoUpdateConfigUpdate{} + case AutoUpdateConfigDeleteEvent: + e = &events.AutoUpdateConfigDelete{} + + case AutoUpdateVersionCreateEvent: + e = &events.AutoUpdateVersionCreate{} + case AutoUpdateVersionUpdateEvent: + e = &events.AutoUpdateVersionUpdate{} + case AutoUpdateVersionDeleteEvent: + e = &events.AutoUpdateVersionDelete{} default: log.Errorf("Attempted to convert dynamic event of unknown type %q into protobuf event.", eventType) unknown := &events.Unknown{} diff --git a/lib/events/events_test.go b/lib/events/events_test.go index 3638c006dade2..cf908f0491d65 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -225,6 +225,12 @@ var eventsMap = map[string]apievents.AuditEvent{ CrownJewelCreateEvent: &apievents.CrownJewelCreate{}, CrownJewelUpdateEvent: &apievents.CrownJewelUpdate{}, CrownJewelDeleteEvent: &apievents.CrownJewelDelete{}, + AutoUpdateConfigCreateEvent: &apievents.AutoUpdateConfigCreate{}, + AutoUpdateConfigUpdateEvent: &apievents.AutoUpdateConfigUpdate{}, + AutoUpdateConfigDeleteEvent: &apievents.AutoUpdateConfigDelete{}, + AutoUpdateVersionCreateEvent: &apievents.AutoUpdateVersionCreate{}, + AutoUpdateVersionUpdateEvent: &apievents.AutoUpdateVersionUpdate{}, + AutoUpdateVersionDeleteEvent: &apievents.AutoUpdateVersionDelete{}, } // TestJSON tests JSON marshal events diff --git a/lib/services/local/autoupdate_test.go b/lib/services/local/autoupdate_test.go index 77e13937ac47a..ae858d65cc47c 100644 --- a/lib/services/local/autoupdate_test.go +++ b/lib/services/local/autoupdate_test.go @@ -51,7 +51,11 @@ func TestAutoUpdateServiceConfigCRUD(t *testing.T) { Kind: types.KindAutoUpdateConfig, Version: types.V1, Metadata: &headerv1.Metadata{Name: types.MetaNameAutoUpdateConfig}, - Spec: &autoupdatev1pb.AutoUpdateConfigSpec{ToolsAutoupdate: true}, + Spec: &autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeEnabled, + }, + }, } created, err := service.CreateAutoUpdateConfig(ctx, config) @@ -72,10 +76,12 @@ func TestAutoUpdateServiceConfigCRUD(t *testing.T) { require.Empty(t, diff) require.Equal(t, created.GetMetadata().GetRevision(), got.GetMetadata().GetRevision()) - config.Spec.ToolsAutoupdate = false + config.Spec.Tools = &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeDisabled, + } updated, err := service.UpdateAutoUpdateConfig(ctx, config) require.NoError(t, err) - require.NotEqual(t, got.GetSpec().GetToolsAutoupdate(), updated.GetSpec().GetToolsAutoupdate()) + require.NotEqual(t, got.GetSpec().GetTools(), updated.GetSpec().GetTools()) _, err = service.UpsertAutoUpdateConfig(ctx, config) require.NoError(t, err) @@ -107,7 +113,11 @@ func TestAutoUpdateServiceVersionCRUD(t *testing.T) { Kind: types.KindAutoUpdateVersion, Version: types.V1, Metadata: &headerv1.Metadata{Name: types.MetaNameAutoUpdateVersion}, - Spec: &autoupdatev1pb.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"}, + Spec: &autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, + }, } created, err := service.CreateAutoUpdateVersion(ctx, version) @@ -128,10 +138,12 @@ func TestAutoUpdateServiceVersionCRUD(t *testing.T) { require.Empty(t, diff) require.Equal(t, created.GetMetadata().GetRevision(), got.GetMetadata().GetRevision()) - version.Spec.ToolsVersion = "3.2.1" + version.Spec.Tools = &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "3.2.1", + } updated, err := service.UpdateAutoUpdateVersion(ctx, version) require.NoError(t, err) - require.NotEqual(t, got.GetSpec().GetToolsVersion(), updated.GetSpec().GetToolsVersion()) + require.NotEqual(t, got.GetSpec().GetTools().GetTargetVersion(), updated.GetSpec().GetTools().GetTargetVersion()) _, err = service.UpsertAutoUpdateVersion(ctx, version) require.NoError(t, err) @@ -163,7 +175,11 @@ func TestAutoUpdateServiceInvalidNameCreate(t *testing.T) { Kind: types.KindAutoUpdateConfig, Version: types.V1, Metadata: &headerv1.Metadata{Name: "invalid-auto-update-config-name"}, - Spec: &autoupdatev1pb.AutoUpdateConfigSpec{ToolsAutoupdate: true}, + Spec: &autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeEnabled, + }, + }, } createdConfig, err := service.CreateAutoUpdateConfig(ctx, config) @@ -174,7 +190,11 @@ func TestAutoUpdateServiceInvalidNameCreate(t *testing.T) { Kind: types.KindAutoUpdateVersion, Version: types.V1, Metadata: &headerv1.Metadata{Name: "invalid-auto-update-version-name"}, - Spec: &autoupdatev1pb.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"}, + Spec: &autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, + }, } createdVersion, err := service.CreateAutoUpdateVersion(ctx, version) @@ -196,7 +216,11 @@ func TestAutoUpdateServiceInvalidNameUpdate(t *testing.T) { ctx := context.Background() // Validate the config update restriction. - config, err := autoupdate.NewAutoUpdateConfig(&autoupdatev1pb.AutoUpdateConfigSpec{ToolsAutoupdate: true}) + config, err := autoupdate.NewAutoUpdateConfig(&autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeEnabled, + }, + }) require.NoError(t, err) createdConfig, err := service.UpsertAutoUpdateConfig(ctx, config) @@ -209,7 +233,11 @@ func TestAutoUpdateServiceInvalidNameUpdate(t *testing.T) { require.Nil(t, createdConfig) // Validate the version update restriction. - version, err := autoupdate.NewAutoUpdateVersion(&autoupdatev1pb.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"}) + version, err := autoupdate.NewAutoUpdateVersion(&autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, + }) require.NoError(t, err) createdVersion, err := service.UpsertAutoUpdateVersion(ctx, version) diff --git a/lib/srv/discovery/discovery_test.go b/lib/srv/discovery/discovery_test.go index e7b0ec6f08347..a5396b4ccf53a 100644 --- a/lib/srv/discovery/discovery_test.go +++ b/lib/srv/discovery/discovery_test.go @@ -2302,7 +2302,7 @@ func (m *mockAzureClient) Get(_ context.Context, _ string) (*azure.VirtualMachin return nil, nil } -func (m *mockAzureClient) GetByVMID(_ context.Context, _, _ string) (*azure.VirtualMachine, error) { +func (m *mockAzureClient) GetByVMID(_ context.Context, _ string) (*azure.VirtualMachine, error) { return nil, nil } diff --git a/lib/srv/forward/sshserver.go b/lib/srv/forward/sshserver.go index 90423046ccb88..b0995f0f05447 100644 --- a/lib/srv/forward/sshserver.go +++ b/lib/srv/forward/sshserver.go @@ -21,9 +21,11 @@ package forward import ( "context" "encoding/json" + "errors" "fmt" "io" "net" + "os" "strings" "time" @@ -1062,8 +1064,12 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ch ssh.Channel, r if err != nil { s.log.Errorf("Unable to create connection context: %v.", err) s.stderrWrite(ch, "Unable to create connection context.") + if err := ch.Close(); err != nil { + s.log.Warnf("Failed to close channel: %v", err) + } return } + scx.AddCloser(ch) scx.RemoteClient = s.remoteClient scx.ExecType = teleport.ChanDirectTCPIP scx.SrcAddr = sshutils.JoinHostPort(req.Orig, req.OrigPort) @@ -1095,8 +1101,8 @@ func (s *Server) handleDirectTCPIPRequest(ctx context.Context, ch ssh.Channel, r scx.WithError(err).Warn("Failed to emit port forward event.") } - if err := utils.ProxyConn(ctx, ch, conn); err != nil { - s.log.WithError(err).Warn("Pailed proxying data for port forwarding connection.") + if err := utils.ProxyConn(ctx, ch, conn); err != nil && !errors.Is(err, io.EOF) && !errors.Is(err, os.ErrClosed) { + s.log.WithError(err).Warn("Failed proxying data for port forwarding connection.") } } diff --git a/lib/srv/regular/sshserver_test.go b/lib/srv/regular/sshserver_test.go index 800ef30531b04..9cde84d661fad 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -1070,6 +1070,10 @@ func TestX11Forward(t *testing.T) { // TestRootX11ForwardPermissions tests that X11 forwarding sessions are set up // with the connecting user's file permissions (where needed), rather than root. func TestRootX11ForwardPermissions(t *testing.T) { + // TODO(Joerger): Fix CI issue related to github actions sometimes using + // UID 1001 - https://github.com/gravitational/teleport/pull/50176 + t.Skip("This test is flaky") + utils.RequireRoot(t) if os.Getenv("TELEPORT_XAUTH_TEST") == "" { t.Skip("Skipping test as xauth is not enabled") diff --git a/lib/utils/disk.go b/lib/utils/disk.go index 78fba5457099b..782c598d26229 100644 --- a/lib/utils/disk.go +++ b/lib/utils/disk.go @@ -46,6 +46,21 @@ func PercentUsed(path string) (float64, error) { return Round(ratio * 100), nil } +// FreeDiskWithReserve returns the available disk space (in bytes) on the disk at dir, minus `reservedFreeDisk`. +func FreeDiskWithReserve(dir string, reservedFreeDisk uint64) (uint64, error) { + var stat syscall.Statfs_t + err := syscall.Statfs(dir, &stat) + if err != nil { + return 0, trace.Wrap(err) + } + //nolint:unconvert // The cast is only necessary for linux platform. + avail := uint64(stat.Bavail) * uint64(stat.Bsize) + if reservedFreeDisk > avail { + return 0, trace.Errorf("no free space left") + } + return avail - reservedFreeDisk, nil +} + // CanUserWriteTo attempts to check if a user has write access to certain path. // It also works around the program being run as root and tries to check // the permissions of the user who executed the program as root. diff --git a/lib/utils/disk_windows.go b/lib/utils/disk_windows.go index cde568b4c9589..8056849afa82b 100644 --- a/lib/utils/disk_windows.go +++ b/lib/utils/disk_windows.go @@ -21,13 +21,29 @@ package utils -import "github.com/gravitational/trace" +import ( + "github.com/gravitational/trace" + "golang.org/x/sys/windows" +) // PercentUsed is not supported on Windows. func PercentUsed(path string) (float64, error) { return 0.0, trace.NotImplemented("disk usage not supported on Windows") } +// FreeDiskWithReserve returns the available disk space (in bytes) on the disk at dir, minus `reservedFreeDisk`. +func FreeDiskWithReserve(dir string, reservedFreeDisk uint64) (uint64, error) { + var avail uint64 + err := windows.GetDiskFreeSpaceEx(windows.StringToUTF16Ptr(dir), &avail, nil, nil) + if err != nil { + return 0, trace.Wrap(err) + } + if reservedFreeDisk > avail { + return 0, trace.Errorf("no free space left") + } + return avail - reservedFreeDisk, nil +} + // CanUserWriteTo is not supported on Windows. func CanUserWriteTo(path string) (bool, error) { return false, trace.NotImplemented("path permission checking is not supported on Windows") diff --git a/lib/utils/packaging/unarchive.go b/lib/utils/packaging/unarchive.go new file mode 100644 index 0000000000000..6496afbc182c3 --- /dev/null +++ b/lib/utils/packaging/unarchive.go @@ -0,0 +1,162 @@ +/* + * Teleport + * Copyright (C) 2024 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 packaging + +import ( + "archive/zip" + "io" + "os" + "path/filepath" + "slices" + "strings" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/lib/utils" +) + +const ( + // reservedFreeDisk is the predefined amount of free disk space (in bytes) required + // to remain available after extracting Teleport binaries. + reservedFreeDisk = 10 * 1024 * 1024 +) + +// RemoveWithSuffix removes all that matches the provided suffix, except for file or directory with `skipName`. +func RemoveWithSuffix(dir, suffix string, skipNames []string) error { + var removePaths []string + err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return trace.Wrap(err) + } + if slices.Contains(skipNames, info.Name()) { + return nil + } + if !strings.HasSuffix(info.Name(), suffix) { + return nil + } + removePaths = append(removePaths, path) + if info.IsDir() { + return filepath.SkipDir + } + return nil + }) + if err != nil { + return trace.Wrap(err) + } + var aggErr []error + for _, path := range removePaths { + if err := os.RemoveAll(path); err != nil { + aggErr = append(aggErr, err) + } + } + return trace.NewAggregate(aggErr...) +} + +// replaceZip un-archives the Teleport package in .zip format, iterates through +// the compressed content, and ignores everything not matching the binaries specified +// in the execNames argument. The data is extracted to extractDir, and symlinks are created +// in toolsDir pointing to the extractDir path with binaries. +func replaceZip(toolsDir string, archivePath string, extractDir string, execNames []string) error { + f, err := os.Open(archivePath) + if err != nil { + return trace.Wrap(err) + } + defer f.Close() + + fi, err := f.Stat() + if err != nil { + return trace.Wrap(err) + } + zipReader, err := zip.NewReader(f, fi.Size()) + if err != nil { + return trace.Wrap(err) + } + + var totalSize uint64 = 0 + for _, zipFile := range zipReader.File { + baseName := filepath.Base(zipFile.Name) + // Skip over any files in the archive that are not defined execNames. + if !slices.ContainsFunc(execNames, func(s string) bool { + return baseName == s + }) { + continue + } + totalSize += zipFile.UncompressedSize64 + } + // Verify that we have enough space for uncompressed zipFile. + if err := checkFreeSpace(extractDir, totalSize); err != nil { + return trace.Wrap(err) + } + + for _, zipFile := range zipReader.File { + baseName := filepath.Base(zipFile.Name) + // Skip over any files in the archive that are not defined execNames. + if !slices.Contains(execNames, baseName) { + continue + } + + if err := func(zipFile *zip.File) error { + file, err := zipFile.Open() + if err != nil { + return trace.Wrap(err) + } + defer file.Close() + + dest := filepath.Join(extractDir, baseName) + destFile, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0o755) + if err != nil { + return trace.Wrap(err) + } + defer destFile.Close() + + if _, err := io.Copy(destFile, file); err != nil { + return trace.Wrap(err) + } + appPath := filepath.Join(toolsDir, baseName) + if err := os.Remove(appPath); err != nil && !os.IsNotExist(err) { + return trace.Wrap(err) + } + // For the Windows build we have to copy binary to be able + // to do this without administrative access as it required + // for symlinks. + if err := utils.CopyFile(dest, appPath, 0o755); err != nil { + return trace.Wrap(err) + } + return trace.Wrap(destFile.Close()) + }(zipFile); err != nil { + return trace.Wrap(err) + } + } + + return nil +} + +// checkFreeSpace verifies that we have enough requested space (in bytes) at specific directory. +func checkFreeSpace(path string, requested uint64) error { + free, err := utils.FreeDiskWithReserve(path, reservedFreeDisk) + if err != nil { + return trace.Errorf("failed to calculate free disk in %q: %v", path, err) + } + // Bail if there's not enough free disk space at the target. + if requested > free { + return trace.Errorf("%q needs %d additional bytes of disk space", path, requested-free) + } + + return nil +} diff --git a/lib/utils/packaging/unarchive_test.go b/lib/utils/packaging/unarchive_test.go new file mode 100644 index 0000000000000..b124b603b0fd5 --- /dev/null +++ b/lib/utils/packaging/unarchive_test.go @@ -0,0 +1,147 @@ +//go:build !windows + +/* + * Teleport + * Copyright (C) 2024 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 packaging + +import ( + "context" + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/integration/helpers/archive" +) + +// TestPackaging verifies un-archiving of all supported teleport package formats. +func TestPackaging(t *testing.T) { + script := "#!/bin/sh\necho test" + + sourceDir, err := os.MkdirTemp(os.TempDir(), "source") + require.NoError(t, err) + + toolsDir, err := os.MkdirTemp(os.TempDir(), "dest") + require.NoError(t, err) + + extractDir, err := os.MkdirTemp(toolsDir, "extract") + require.NoError(t, err) + + t.Cleanup(func() { + require.NoError(t, os.RemoveAll(extractDir)) + require.NoError(t, os.RemoveAll(sourceDir)) + require.NoError(t, os.RemoveAll(toolsDir)) + }) + + // Create test script for packaging in relative path `teleport\bin` to ensure that + // binaries going to be identified and extracted flatten to `extractDir`. + binPath := filepath.Join(sourceDir, "teleport", "bin") + require.NoError(t, os.MkdirAll(binPath, 0o755)) + require.NoError(t, os.WriteFile(filepath.Join(binPath, "tsh"), []byte(script), 0o755)) + require.NoError(t, os.WriteFile(filepath.Join(binPath, "tctl"), []byte(script), 0o755)) + + ctx := context.Background() + + t.Run("tar.gz", func(t *testing.T) { + archivePath := filepath.Join(toolsDir, "tsh.tar.gz") + err = archive.CompressDirToTarGzFile(ctx, sourceDir, archivePath) + require.NoError(t, err) + require.FileExists(t, archivePath, "archive not created") + + // For the .tar.gz format we extract app by app to check that content discard is not required. + err = replaceTarGz(toolsDir, archivePath, extractDir, []string{"tctl"}) + require.NoError(t, err) + err = replaceTarGz(toolsDir, archivePath, extractDir, []string{"tsh"}) + require.NoError(t, err) + assert.FileExists(t, filepath.Join(toolsDir, "tsh"), "script not created") + assert.FileExists(t, filepath.Join(toolsDir, "tctl"), "script not created") + + data, err := os.ReadFile(filepath.Join(toolsDir, "tsh")) + require.NoError(t, err) + assert.Equal(t, script, string(data)) + }) + + t.Run("pkg", func(t *testing.T) { + if runtime.GOOS != "darwin" { + t.Skip("unsupported platform") + } + archivePath := filepath.Join(toolsDir, "tsh.pkg") + err = archive.CompressDirToPkgFile(ctx, sourceDir, archivePath, "com.example.pkgtest") + require.NoError(t, err) + require.FileExists(t, archivePath, "archive not created") + + err = replacePkg(toolsDir, archivePath, filepath.Join(extractDir, "apps"), []string{"tsh", "tctl"}) + require.NoError(t, err) + assert.FileExists(t, filepath.Join(toolsDir, "tsh"), "script not created") + assert.FileExists(t, filepath.Join(toolsDir, "tctl"), "script not created") + + data, err := os.ReadFile(filepath.Join(toolsDir, "tsh")) + require.NoError(t, err) + assert.Equal(t, script, string(data)) + }) + + t.Run("zip", func(t *testing.T) { + archivePath := filepath.Join(toolsDir, "tsh.zip") + err = archive.CompressDirToZipFile(ctx, sourceDir, archivePath) + require.NoError(t, err) + require.FileExists(t, archivePath, "archive not created") + + err = replaceZip(toolsDir, archivePath, extractDir, []string{"tsh", "tctl"}) + require.NoError(t, err) + assert.FileExists(t, filepath.Join(toolsDir, "tsh"), "script not created") + assert.FileExists(t, filepath.Join(toolsDir, "tctl"), "script not created") + + data, err := os.ReadFile(filepath.Join(toolsDir, "tsh")) + require.NoError(t, err) + assert.Equal(t, script, string(data)) + }) +} + +// TestRemoveWithSuffix verifies that helper for the cleanup removes directories +func TestRemoveWithSuffix(t *testing.T) { + testDir := t.TempDir() + dirForRemove := "test-extract-pkg" + + // Creates directories `test/test-extract-pkg/test-extract-pkg` with exact names + // to ensure that only root one going to be removed recursively without any error. + path := filepath.Join(testDir, dirForRemove, dirForRemove) + require.NoError(t, os.MkdirAll(path, 0o755)) + // Also we create the directory that needs to be skipped, and it matches the remove + // pattern `test/skip-test-extract-pkg/test-extract-pkg`. + skipName := "skip-" + dirForRemove + skipPath := filepath.Join(testDir, skipName) + dirInSkipPath := filepath.Join(skipPath, dirForRemove) + require.NoError(t, os.MkdirAll(skipPath, 0o755)) + + err := RemoveWithSuffix(testDir, dirForRemove, []string{skipName}) + require.NoError(t, err) + + _, err = os.Stat(filepath.Join(testDir, dirForRemove)) + assert.True(t, os.IsNotExist(err)) + + filePath, err := os.Stat(skipPath) + require.NoError(t, err) + assert.True(t, filePath.IsDir()) + + _, err = os.Stat(dirInSkipPath) + assert.True(t, os.IsNotExist(err)) +} diff --git a/lib/utils/packaging/unarchive_unix.go b/lib/utils/packaging/unarchive_unix.go new file mode 100644 index 0000000000000..8daf1b3aa5525 --- /dev/null +++ b/lib/utils/packaging/unarchive_unix.go @@ -0,0 +1,208 @@ +//go:build !windows + +/* + * Teleport + * Copyright (C) 2024 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 packaging + +import ( + "archive/tar" + "compress/gzip" + "errors" + "io" + "os" + "os/exec" + "path/filepath" + "runtime" + "slices" + + "github.com/google/renameio/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/constants" +) + +// ReplaceToolsBinaries extracts executables specified by execNames from archivePath into +// extractDir. After each executable is extracted, it is symlinked from extractDir/[name] to +// toolsDir/[name]. +// +// For Darwin, archivePath must be a .pkg file. +// For other POSIX, archivePath must be a gzipped tarball. +func ReplaceToolsBinaries(toolsDir string, archivePath string, extractDir string, execNames []string) error { + switch runtime.GOOS { + case constants.DarwinOS: + return replacePkg(toolsDir, archivePath, extractDir, execNames) + default: + return replaceTarGz(toolsDir, archivePath, extractDir, execNames) + } +} + +// replaceTarGz un-archives the Teleport package in .tar.gz format, iterates through +// the compressed content, and ignores everything not matching the app binaries specified +// in the apps argument. The data is extracted to extractDir, and symlinks are created +// in toolsDir pointing to the extractDir path with binaries. +func replaceTarGz(toolsDir string, archivePath string, extractDir string, execNames []string) error { + if err := validateFreeSpaceTarGz(archivePath, extractDir, execNames); err != nil { + return trace.Wrap(err) + } + f, err := os.Open(archivePath) + if err != nil { + return trace.Wrap(err) + } + defer f.Close() + + gzipReader, err := gzip.NewReader(f) + if err != nil { + return trace.Wrap(err) + } + tarReader := tar.NewReader(gzipReader) + for { + header, err := tarReader.Next() + if errors.Is(err, io.EOF) { + break + } + if err != nil { + return trace.Wrap(err) + } + baseName := filepath.Base(header.Name) + // Skip over any files in the archive that are not in execNames. + if !slices.Contains(execNames, baseName) { + continue + } + + if err = func(header *tar.Header) error { + tempFile, err := renameio.TempFile(extractDir, filepath.Join(toolsDir, baseName)) + if err != nil { + return trace.Wrap(err) + } + defer tempFile.Cleanup() + if err := os.Chmod(tempFile.Name(), 0o755); err != nil { + return trace.Wrap(err) + } + if _, err := io.Copy(tempFile, tarReader); err != nil { + return trace.Wrap(err) + } + if err := tempFile.CloseAtomicallyReplace(); err != nil { + return trace.Wrap(err) + } + return trace.Wrap(tempFile.Cleanup()) + }(header); err != nil { + return trace.Wrap(err) + } + } + + return trace.Wrap(gzipReader.Close()) +} + +// validateFreeSpaceTarGz validates that extraction size match available disk space in `extractDir`. +func validateFreeSpaceTarGz(archivePath string, extractDir string, execNames []string) error { + f, err := os.Open(archivePath) + if err != nil { + return trace.Wrap(err) + } + defer f.Close() + + var totalSize uint64 + gzipReader, err := gzip.NewReader(f) + if err != nil { + return trace.Wrap(err) + } + tarReader := tar.NewReader(gzipReader) + for { + header, err := tarReader.Next() + if errors.Is(err, io.EOF) { + break + } + if err != nil { + return trace.Wrap(err) + } + baseName := filepath.Base(header.Name) + // Skip over any files in the archive that are not defined execNames. + if !slices.Contains(execNames, baseName) { + continue + } + totalSize += uint64(header.Size) + } + + return trace.Wrap(checkFreeSpace(extractDir, totalSize)) +} + +// replacePkg expands the Teleport package in .pkg format using the platform-dependent pkgutil utility. +// The data is extracted to extractDir, and symlinks are created in toolsDir pointing to the binaries +// in extractDir. Before creating the symlinks, each binary must be executed at least once to pass +// OS signature verification. +func replacePkg(toolsDir string, archivePath string, extractDir string, execNames []string) error { + // Use "pkgutil" from the filesystem to expand the archive. In theory .pkg + // files are xz archives, however it's still safer to use "pkgutil" in-case + // Apple makes non-standard changes to the format. + // + // Full command: pkgutil --expand-full NAME.pkg DIRECTORY/ + pkgutil, err := exec.LookPath("pkgutil") + if err != nil { + return trace.Wrap(err) + } + + if err = exec.Command(pkgutil, "--expand-full", archivePath, extractDir).Run(); err != nil { + return trace.Wrap(err) + } + + err = filepath.Walk(extractDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return trace.Wrap(err) + } + if info.IsDir() { + return nil + } + // Skip over any files in the archive that are not in execNames. + if !slices.ContainsFunc(execNames, func(s string) bool { + return filepath.Base(info.Name()) == s + }) { + return nil + } + + // The first time a signed and notarized binary macOS application is run, + // execution is paused while it gets sent to Apple to verify. Once Apple + // approves the binary, the "com.apple.macl" extended attribute is added + // and the process is allowed to execute. This process is not concurrent, any + // other operations (like moving the application) on the application during + // this time will lead to the application being sent SIGKILL. + // + // Since apps have to be concurrent, execute app before performing any + // swap operations. This ensures that the "com.apple.macl" extended + // attribute is set and macOS will not send a SIGKILL to the process + // if multiple processes are trying to operate on it. + command := exec.Command(path, "version") + command.Env = []string{"TELEPORT_TOOLS_VERSION=off"} + if err := command.Run(); err != nil { + return trace.WrapWithMessage(err, "failed to validate binary") + } + + // Due to macOS applications not being a single binary (they are a + // directory), atomic operations are not possible. To work around this, use + // a symlink (which can be atomically swapped), then do a cleanup pass + // removing any stale copies of the expanded package. + newName := filepath.Join(toolsDir, filepath.Base(path)) + if err := renameio.Symlink(path, newName); err != nil { + return trace.Wrap(err) + } + + return nil + }) + + return trace.Wrap(err) +} diff --git a/lib/utils/packaging/unarchive_windows.go b/lib/utils/packaging/unarchive_windows.go new file mode 100644 index 0000000000000..c07471adce83c --- /dev/null +++ b/lib/utils/packaging/unarchive_windows.go @@ -0,0 +1,30 @@ +//go:build windows + +/* + * Teleport + * Copyright (C) 2024 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 packaging + +// ReplaceToolsBinaries extracts executables specified by execNames from archivePath into +// extractDir. After each executable is extracted, it is symlinked from extractDir/[name] to +// toolsDir/[name]. +// +// For Windows, archivePath must be a .zip file. +func ReplaceToolsBinaries(toolsDir string, archivePath string, extractPath string, execNames []string) error { + return replaceZip(toolsDir, archivePath, extractPath, execNames) +} diff --git a/lib/utils/signal/stack_handler.go b/lib/utils/signal/stack_handler.go new file mode 100644 index 0000000000000..0fcbefb081d11 --- /dev/null +++ b/lib/utils/signal/stack_handler.go @@ -0,0 +1,98 @@ +/* + * Teleport + * Copyright (C) 2024 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 signal + +import ( + "container/list" + "context" + "os" + "os/signal" + "sync" + "syscall" +) + +// Handler implements stack for context cancellation. +type Handler struct { + mu sync.Mutex + list *list.List +} + +var handler = &Handler{ + list: list.New(), +} + +// GetSignalHandler returns global singleton instance of signal +func GetSignalHandler() *Handler { + return handler +} + +// NotifyContext creates context which going to be canceled after SIGINT, SIGTERM +// in order of adding them to the stack. When very first context is canceled +// we stop watching the OS signals. +func (s *Handler) NotifyContext(parent context.Context) (context.Context, context.CancelFunc) { + s.mu.Lock() + defer s.mu.Unlock() + + if s.list.Len() == 0 { + s.listenSignals() + } + + ctx, cancel := context.WithCancel(parent) + element := s.list.PushBack(cancel) + + return ctx, func() { + s.mu.Lock() + defer s.mu.Unlock() + + s.list.Remove(element) + cancel() + } +} + +// listenSignals sets up the signal listener for SIGINT, SIGTERM. +func (s *Handler) listenSignals() { + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) + go func() { + for { + if sig := <-sigChan; sig == nil { + return + } + if !s.cancelNext() { + signal.Stop(sigChan) + return + } + } + }() +} + +// cancelNext calls the most recent cancel func in the stack. +func (s *Handler) cancelNext() bool { + s.mu.Lock() + defer s.mu.Unlock() + + if s.list.Len() > 0 { + cancel := s.list.Remove(s.list.Back()) + if cancel != nil { + cancel.(context.CancelFunc)() + } + } + + return s.list.Len() != 0 +} diff --git a/lib/utils/signal/stack_handler_test.go b/lib/utils/signal/stack_handler_test.go new file mode 100644 index 0000000000000..b900939b886e8 --- /dev/null +++ b/lib/utils/signal/stack_handler_test.go @@ -0,0 +1,88 @@ +/* + * Teleport + * Copyright (C) 2024 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 signal + +import ( + "context" + "os" + "syscall" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestGetSignalHandler verifies the cancellation stack order. +func TestGetSignalHandler(t *testing.T) { + testHandler := GetSignalHandler() + parent := context.Background() + + ctx1, cancel1 := testHandler.NotifyContext(parent) + ctx2, cancel2 := testHandler.NotifyContext(parent) + ctx3, cancel3 := testHandler.NotifyContext(parent) + ctx4, cancel4 := testHandler.NotifyContext(parent) + t.Cleanup(func() { + cancel4() + cancel2() + cancel1() + }) + + // Verify that all context not canceled. + require.NoError(t, ctx4.Err()) + require.NoError(t, ctx3.Err()) + require.NoError(t, ctx2.Err()) + require.NoError(t, ctx1.Err()) + + // Cancel context manually to ensure it was removed from stack in right order. + cancel3() + + // Check that last added context is canceled. + require.NoError(t, syscall.Kill(os.Getpid(), syscall.SIGINT)) + select { + case <-ctx4.Done(): + assert.ErrorIs(t, ctx3.Err(), context.Canceled) + assert.NoError(t, ctx2.Err()) + assert.NoError(t, ctx1.Err()) + case <-time.After(time.Second): + assert.Fail(t, "context 3 must be canceled") + } + + // Send interrupt signal to cancel next context in the stack. + require.NoError(t, syscall.Kill(os.Getpid(), syscall.SIGINT)) + select { + case <-ctx2.Done(): + assert.ErrorIs(t, ctx4.Err(), context.Canceled) + assert.ErrorIs(t, ctx3.Err(), context.Canceled) + assert.NoError(t, ctx1.Err()) + case <-time.After(time.Second): + assert.Fail(t, "context 2 must be canceled") + } + + // All context must be canceled. + require.NoError(t, syscall.Kill(os.Getpid(), syscall.SIGINT)) + select { + case <-ctx1.Done(): + assert.ErrorIs(t, ctx4.Err(), context.Canceled) + assert.ErrorIs(t, ctx3.Err(), context.Canceled) + assert.ErrorIs(t, ctx2.Err(), context.Canceled) + case <-time.After(time.Second): + assert.Fail(t, "context 1 must be canceled") + } +} diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 76a440143b977..d63448f3860dd 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -60,14 +60,17 @@ import ( "google.golang.org/protobuf/encoding/protojson" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api" apiclient "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/client/webclient" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" + autoupdatepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" "github.com/gravitational/teleport/api/mfa" apitracing "github.com/gravitational/teleport/api/observability/tracing" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/autoupdate" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/types/installers" "github.com/gravitational/teleport/api/utils/keys" @@ -130,6 +133,10 @@ const ( // DefaultFeatureWatchInterval is the default time in which the feature watcher // should ping the auth server to check for updated features DefaultFeatureWatchInterval = time.Minute * 5 + // findEndpointCacheTTL is the cache TTL for the find endpoint generic answer. + // This cache is here to protect against accidental or intentional DDoS, the TTL must be low to quickly reflect + // cluster configuration changes. + findEndpointCacheTTL = 10 * time.Second ) // healthCheckAppServerFunc defines a function used to perform a health check @@ -179,6 +186,11 @@ type Handler struct { // an authenticated websocket so unauthenticated sockets dont get left // open. wsIODeadline time.Duration + + // findEndpointCache is used to cache the find endpoint answer. As this endpoint is unprotected and has high + // rate-limits, each call must cause minimal work. The cached answer can be modulated after, for example if the + // caller specified its Automatic Updates UUID or group. + findEndpointCache *utils.FnCache } // HandlerOption is a functional argument - an option that can be passed @@ -429,6 +441,18 @@ func NewHandler(cfg Config, opts ...HandlerOption) (*APIHandler, error) { } } + // We create the cache after applying the options to make sure we use the fake clock if it was passed. + findCache, err := utils.NewFnCache(utils.FnCacheConfig{ + TTL: findEndpointCacheTTL, + Clock: h.clock, + Context: cfg.Context, + ReloadOnErr: false, + }) + if err != nil { + return nil, trace.Wrap(err, "creating /find cache") + } + h.findEndpointCache = findCache + sessionLingeringThreshold := cachedSessionLingeringThreshold if cfg.CachedSessionLingeringThreshold != nil { sessionLingeringThreshold = *cfg.CachedSessionLingeringThreshold @@ -1515,21 +1539,50 @@ func (h *Handler) ping(w http.ResponseWriter, r *http.Request, p httprouter.Para MinClientVersion: teleport.MinClientVersion, ClusterName: h.auth.clusterName, AutomaticUpgrades: pr.ServerFeatures.GetAutomaticUpgrades(), + AutoUpdate: h.automaticUpdateSettings(r.Context()), }, nil } func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Params) (interface{}, error) { - // TODO(jent,espadolini): add a time-based cache to further reduce load on this endpoint - proxyConfig, err := h.cfg.ProxySettings.GetProxySettings(r.Context()) + // cache the generic answer to avoid doing work for each request + resp, err := utils.FnCacheGet[*webclient.PingResponse](r.Context(), h.findEndpointCache, "find", func(ctx context.Context) (*webclient.PingResponse, error) { + proxyConfig, err := h.cfg.ProxySettings.GetProxySettings(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + return &webclient.PingResponse{ + Proxy: *proxyConfig, + ServerVersion: teleport.Version, + MinClientVersion: teleport.MinClientVersion, + ClusterName: h.auth.clusterName, + AutoUpdate: h.automaticUpdateSettings(ctx), + }, nil + }) if err != nil { return nil, trace.Wrap(err) } - return webclient.PingResponse{ - Proxy: *proxyConfig, - ServerVersion: teleport.Version, - MinClientVersion: teleport.MinClientVersion, - ClusterName: h.auth.clusterName, - }, nil + return resp, nil +} + +// TODO: add the request as a parameter when we'll need to modulate the content based on the UUID and group +func (h *Handler) automaticUpdateSettings(ctx context.Context) webclient.AutoUpdateSettings { + autoUpdateConfig, err := h.cfg.AccessPoint.GetAutoUpdateConfig(ctx) + // TODO(vapopov) DELETE IN v18.0.0 check of IsNotImplemented, must be backported to all latest supported versions. + if err != nil && !trace.IsNotFound(err) && !trace.IsNotImplemented(err) { + h.logger.ErrorContext(ctx, "failed to receive AutoUpdateConfig", "error", err) + } + + autoUpdateVersion, err := h.cfg.AccessPoint.GetAutoUpdateVersion(ctx) + // TODO(vapopov) DELETE IN v18.0.0 check of IsNotImplemented, must be backported to all latest supported versions. + if err != nil && !trace.IsNotFound(err) && !trace.IsNotImplemented(err) { + h.logger.ErrorContext(ctx, "failed to receive AutoUpdateVersion", "error", err) + } + + return webclient.AutoUpdateSettings{ + ToolsAutoUpdate: getToolsAutoUpdate(autoUpdateConfig), + ToolsVersion: getToolsVersion(autoUpdateVersion), + } } func (h *Handler) pingWithConnector(w http.ResponseWriter, r *http.Request, p httprouter.Params) (interface{}, error) { @@ -4796,3 +4849,23 @@ func readEtagFromAppHash(fs http.FileSystem) (string, error) { return etag, nil } + +func getToolsAutoUpdate(config *autoupdatepb.AutoUpdateConfig) bool { + // If we can't get the AU config or if AUs are not configured, we default to "disabled". + // This ensures we fail open and don't accidentally update agents if something is going wrong. + // If we want to enable AUs by default, it would be better to create a default "autoupdate_config" resource + // than changing this logic. + if config.GetSpec().GetTools() != nil { + return config.GetSpec().GetTools().GetMode() == autoupdate.ToolsUpdateModeEnabled + } + return false +} + +func getToolsVersion(version *autoupdatepb.AutoUpdateVersion) string { + // If we can't get the AU version or tools AU version is not specified, we default to the current proxy version. + // This ensures we always advertise a version compatible with the cluster. + if version.GetSpec().GetTools() == nil { + return api.Version + } + return version.GetSpec().GetTools().GetTargetVersion() +} diff --git a/lib/web/apiserver_ping_test.go b/lib/web/apiserver_ping_test.go index 8a45e5840e547..e6a01c365788e 100644 --- a/lib/web/apiserver_ping_test.go +++ b/lib/web/apiserver_ping_test.go @@ -26,12 +26,16 @@ import ( "testing" "github.com/gravitational/roundtrip" + "github.com/gravitational/trace" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/gravitational/teleport/api" "github.com/gravitational/teleport/api/client/webclient" "github.com/gravitational/teleport/api/constants" + autoupdatev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/autoupdate" "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/modules" ) @@ -236,5 +240,140 @@ func TestPing_minimalAPI(t *testing.T) { require.NoError(t, resp.Body.Close()) }) } +} + +// TestPing_autoUpdateResources tests that find endpoint return correct data related to auto updates. +func TestPing_autoUpdateResources(t *testing.T) { + env := newWebPack(t, 1, func(cfg *proxyConfig) { + cfg.minimalHandler = true + }) + proxy := env.proxies[0] + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + req, err := http.NewRequest(http.MethodGet, proxy.newClient(t).Endpoint("webapi", "find"), nil) + require.NoError(t, err) + req.Host = proxy.handler.handler.cfg.ProxyPublicAddrs[0].Host() + + tests := []struct { + name string + config *autoupdatev1pb.AutoUpdateConfigSpec + version *autoupdatev1pb.AutoUpdateVersionSpec + cleanup bool + expected webclient.AutoUpdateSettings + }{ + { + name: "resources not defined", + expected: webclient.AutoUpdateSettings{ + ToolsVersion: api.Version, + ToolsAutoUpdate: false, + }, + }, + { + name: "enable auto update", + config: &autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeEnabled, + }, + }, + expected: webclient.AutoUpdateSettings{ + ToolsAutoUpdate: true, + ToolsVersion: api.Version, + }, + cleanup: true, + }, + { + name: "empty config and version", + config: &autoupdatev1pb.AutoUpdateConfigSpec{}, + version: &autoupdatev1pb.AutoUpdateVersionSpec{}, + expected: webclient.AutoUpdateSettings{ + ToolsVersion: api.Version, + ToolsAutoUpdate: false, + }, + cleanup: true, + }, + { + name: "set tools auto update version", + version: &autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, + }, + expected: webclient.AutoUpdateSettings{ + ToolsVersion: "1.2.3", + ToolsAutoUpdate: false, + }, + cleanup: true, + }, + { + name: "enable tools auto update and set version", + config: &autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeEnabled, + }, + }, + version: &autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, + }, + expected: webclient.AutoUpdateSettings{ + ToolsAutoUpdate: true, + ToolsVersion: "1.2.3", + }, + }, + { + name: "modify auto update config and version", + config: &autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeDisabled, + }, + }, + version: &autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "3.2.1", + }, + }, + expected: webclient.AutoUpdateSettings{ + ToolsAutoUpdate: false, + ToolsVersion: "3.2.1", + }, + }, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + if tc.config != nil { + config, err := autoupdate.NewAutoUpdateConfig(tc.config) + require.NoError(t, err) + _, err = env.server.Auth().UpsertAutoUpdateConfig(ctx, config) + require.NoError(t, err) + } + if tc.version != nil { + version, err := autoupdate.NewAutoUpdateVersion(tc.version) + require.NoError(t, err) + _, err = env.server.Auth().UpsertAutoUpdateVersion(ctx, version) + require.NoError(t, err) + } + + // expire the fn cache to force the next answer to be fresh + for _, proxy := range env.proxies { + proxy.clock.Advance(2 * findEndpointCacheTTL) + } + + resp, err := client.NewInsecureWebClient().Do(req) + require.NoError(t, err) + + pr := &webclient.PingResponse{} + require.NoError(t, json.NewDecoder(resp.Body).Decode(pr)) + require.NoError(t, resp.Body.Close()) + + assert.Equal(t, tc.expected, pr.AutoUpdate) + if tc.cleanup { + require.NotErrorIs(t, env.server.Auth().DeleteAutoUpdateConfig(ctx), &trace.NotFoundError{}) + require.NotErrorIs(t, env.server.Auth().DeleteAutoUpdateVersion(ctx), &trace.NotFoundError{}) + } + }) + } } diff --git a/lib/web/session/cookie.go b/lib/web/session/cookie.go index f7d8712ee2016..df9bb4b538a6b 100644 --- a/lib/web/session/cookie.go +++ b/lib/web/session/cookie.go @@ -67,6 +67,7 @@ func SetCookie(w http.ResponseWriter, user, sid string) error { Path: "/", HttpOnly: true, Secure: true, + SameSite: http.SameSiteLaxMode, } http.SetCookie(w, c) return nil @@ -80,6 +81,7 @@ func ClearCookie(w http.ResponseWriter) { Path: "/", HttpOnly: true, Secure: true, + SameSite: http.SameSiteLaxMode, }) } diff --git a/lib/web/session/cookie_test.go b/lib/web/session/cookie_test.go index 12c4221d6243a..8f7d685033cfe 100644 --- a/lib/web/session/cookie_test.go +++ b/lib/web/session/cookie_test.go @@ -48,7 +48,7 @@ func TestCookies(t *testing.T) { require.Len(t, setCookies, 2) // SetCookie will store the encoded session in the cookie - require.Equal(t, "__Host-session=7b2275736572223a226c6c616d61222c22736964223a223938373635227d; Path=/; HttpOnly; Secure", setCookies[0]) + require.Equal(t, "__Host-session=7b2275736572223a226c6c616d61222c22736964223a223938373635227d; Path=/; HttpOnly; Secure; SameSite=Lax", setCookies[0]) // ClearCookie will add an entry with the cookie value cleared out - require.Equal(t, "__Host-session=; Path=/; HttpOnly; Secure", setCookies[1]) + require.Equal(t, "__Host-session=; Path=/; HttpOnly; Secure; SameSite=Lax", setCookies[1]) } diff --git a/tool/tctl/common/collection.go b/tool/tctl/common/collection.go index 5910c21188a64..0b70145323d89 100644 --- a/tool/tctl/common/collection.go +++ b/tool/tctl/common/collection.go @@ -1692,7 +1692,7 @@ func (c *autoUpdateConfigCollection) writeText(w io.Writer, verbose bool) error t := asciitable.MakeTable([]string{"Name", "Tools AutoUpdate Enabled"}) t.AddRow([]string{ c.config.GetMetadata().GetName(), - fmt.Sprintf("%v", c.config.GetSpec().GetToolsAutoupdate()), + fmt.Sprintf("%v", c.config.GetSpec().GetTools().GetMode()), }) _, err := t.AsBuffer().WriteTo(w) return trace.Wrap(err) @@ -1710,7 +1710,7 @@ func (c *autoUpdateVersionCollection) writeText(w io.Writer, verbose bool) error t := asciitable.MakeTable([]string{"Name", "Tools AutoUpdate Version"}) t.AddRow([]string{ c.version.GetMetadata().GetName(), - fmt.Sprintf("%v", c.version.GetSpec().GetToolsVersion()), + fmt.Sprintf("%v", c.version.GetSpec().GetTools().TargetVersion), }) _, err := t.AsBuffer().WriteTo(w) return trace.Wrap(err) diff --git a/tool/tctl/common/edit_command_test.go b/tool/tctl/common/edit_command_test.go index 4eac9de223b9f..cdb6f7ab1fd1a 100644 --- a/tool/tctl/common/edit_command_test.go +++ b/tool/tctl/common/edit_command_test.go @@ -497,10 +497,18 @@ func testEditSAMLConnector(t *testing.T, clt *authclient.Client) { func testEditAutoUpdateConfig(t *testing.T, clt *authclient.Client) { ctx := context.Background() - expected, err := autoupdate.NewAutoUpdateConfig(&autoupdatev1pb.AutoUpdateConfigSpec{ToolsAutoupdate: true}) + expected, err := autoupdate.NewAutoUpdateConfig(&autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeEnabled, + }, + }) require.NoError(t, err) - initial, err := autoupdate.NewAutoUpdateConfig(&autoupdatev1pb.AutoUpdateConfigSpec{ToolsAutoupdate: false}) + initial, err := autoupdate.NewAutoUpdateConfig(&autoupdatev1pb.AutoUpdateConfigSpec{ + Tools: &autoupdatev1pb.AutoUpdateConfigSpecTools{ + Mode: autoupdate.ToolsUpdateModeDisabled, + }, + }) require.NoError(t, err) serviceClient := autoupdatev1pb.NewAutoUpdateServiceClient(clt.GetConnection()) @@ -523,18 +531,26 @@ func testEditAutoUpdateConfig(t *testing.T, clt *authclient.Client) { actual, err := clt.GetAutoUpdateConfig(ctx) require.NoError(t, err, "failed to get autoupdate config after edit") - assert.NotEqual(t, initial.GetSpec().GetToolsAutoupdate(), actual.GetSpec().GetToolsAutoupdate(), + assert.NotEqual(t, initial.GetSpec().GetTools().Mode, actual.GetSpec().GetTools().GetMode(), "tools_autoupdate should have been modified by edit") - assert.Equal(t, expected.GetSpec().GetToolsAutoupdate(), actual.GetSpec().GetToolsAutoupdate()) + assert.Equal(t, expected.GetSpec().GetTools().GetMode(), actual.GetSpec().GetTools().GetMode()) } func testEditAutoUpdateVersion(t *testing.T, clt *authclient.Client) { ctx := context.Background() - expected, err := autoupdate.NewAutoUpdateVersion(&autoupdatev1pb.AutoUpdateVersionSpec{ToolsVersion: "3.2.1"}) + expected, err := autoupdate.NewAutoUpdateVersion(&autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "3.2.1", + }, + }) require.NoError(t, err) - initial, err := autoupdate.NewAutoUpdateVersion(&autoupdatev1pb.AutoUpdateVersionSpec{ToolsVersion: "1.2.3"}) + initial, err := autoupdate.NewAutoUpdateVersion(&autoupdatev1pb.AutoUpdateVersionSpec{ + Tools: &autoupdatev1pb.AutoUpdateVersionSpecTools{ + TargetVersion: "1.2.3", + }, + }) require.NoError(t, err) serviceClient := autoupdatev1pb.NewAutoUpdateServiceClient(clt.GetConnection()) @@ -557,7 +573,7 @@ func testEditAutoUpdateVersion(t *testing.T, clt *authclient.Client) { actual, err := clt.GetAutoUpdateVersion(ctx) require.NoError(t, err, "failed to get autoupdate version after edit") - assert.NotEqual(t, initial.GetSpec().GetToolsVersion(), actual.GetSpec().GetToolsVersion(), + assert.NotEqual(t, initial.GetSpec().GetTools().GetTargetVersion(), actual.GetSpec().GetTools().GetTargetVersion(), "tools_autoupdate should have been modified by edit") - assert.Equal(t, expected.GetSpec().GetToolsVersion(), actual.GetSpec().GetToolsVersion()) + assert.Equal(t, expected.GetSpec().GetTools().GetTargetVersion(), actual.GetSpec().GetTools().GetTargetVersion()) } diff --git a/tool/tctl/common/resource_command_test.go b/tool/tctl/common/resource_command_test.go index 1423b2a06b3c8..e4bb3d867458a 100644 --- a/tool/tctl/common/resource_command_test.go +++ b/tool/tctl/common/resource_command_test.go @@ -2203,7 +2203,8 @@ metadata: name: autoupdate-config revision: 3a43b44a-201e-4d7f-aef1-ae2f6d9811ed spec: - tools_autoupdate: true + tools: + mode: enabled version: v1 ` _, err := runResourceCommand(t, clt, []string{"get", types.KindAutoUpdateConfig, "--format=json"}) @@ -2244,7 +2245,8 @@ metadata: name: autoupdate-version revision: 3a43b44a-201e-4d7f-aef1-ae2f6d9811ed spec: - tools_version: 1.2.3 + tools: + target_version: 1.2.3 version: v1 ` _, err := runResourceCommand(t, clt, []string{"get", types.KindAutoUpdateVersion, "--format=json"}) diff --git a/tool/tctl/common/tctl.go b/tool/tctl/common/tctl.go index 660ef0cc4b6fb..6644bbbbdcfdc 100644 --- a/tool/tctl/common/tctl.go +++ b/tool/tctl/common/tctl.go @@ -43,6 +43,7 @@ import ( "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/state" "github.com/gravitational/teleport/lib/auth/storage" + "github.com/gravitational/teleport/lib/autoupdate/tools" "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/client/identityfile" libmfa "github.com/gravitational/teleport/lib/client/mfa" @@ -103,7 +104,11 @@ type CLICommand interface { // "distributions" like OSS or Enterprise // // distribution: name of the Teleport distribution -func Run(commands []CLICommand) { +func Run(ctx context.Context, commands []CLICommand) { + if err := tools.CheckAndUpdateLocal(ctx, teleport.Version); err != nil { + utils.FatalError(err) + } + err := TryRun(commands, os.Args[1:]) if err != nil { var exitError *common.ExitCodeError diff --git a/tool/tctl/main.go b/tool/tctl/main.go index 1eecb99209fbc..21628bd8c89e4 100644 --- a/tool/tctl/main.go +++ b/tool/tctl/main.go @@ -19,12 +19,18 @@ package main import ( + "context" + + "github.com/gravitational/teleport/lib/utils/signal" "github.com/gravitational/teleport/tool/tctl/common" ) func main() { + ctx, cancel := signal.GetSignalHandler().NotifyContext(context.Background()) + defer cancel() + // aggregate common and oss-specific command variants commands := common.Commands() commands = append(commands, common.OSSCommands()...) - common.Run(commands) + common.Run(ctx, commands) } diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index c0a2e67bd900c..d22e15ed554b3 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -41,7 +41,6 @@ import ( "strconv" "strings" "sync" - "syscall" "time" "github.com/alecthomas/kingpin/v2" @@ -74,6 +73,7 @@ import ( "github.com/gravitational/teleport/lib/asciitable" "github.com/gravitational/teleport/lib/auth/authclient" wancli "github.com/gravitational/teleport/lib/auth/webauthncli" + "github.com/gravitational/teleport/lib/autoupdate/tools" "github.com/gravitational/teleport/lib/benchmark" benchmarkdb "github.com/gravitational/teleport/lib/benchmark/db" "github.com/gravitational/teleport/lib/client" @@ -94,6 +94,7 @@ import ( "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/utils/diagnostics/latency" "github.com/gravitational/teleport/lib/utils/mlock" + stacksignal "github.com/gravitational/teleport/lib/utils/signal" "github.com/gravitational/teleport/tool/common" "github.com/gravitational/teleport/tool/common/fido2" "github.com/gravitational/teleport/tool/common/touchid" @@ -605,7 +606,7 @@ func Main() { cmdLineOrig := os.Args[1:] var cmdLine []string - ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT) + ctx, cancel := stacksignal.GetSignalHandler().NotifyContext(context.Background()) defer cancel() // lets see: if the executable name is 'ssh' or 'scp' we convert @@ -703,6 +704,10 @@ func initLogger(cf *CLIConf) { // // DO NOT RUN TESTS that call Run() in parallel (unless you taken precautions). func Run(ctx context.Context, args []string, opts ...CliOption) error { + if err := tools.CheckAndUpdateLocal(ctx, teleport.Version); err != nil { + return trace.Wrap(err) + } + cf := CLIConf{ Context: ctx, TracingProvider: tracing.NoopProvider(), @@ -1228,7 +1233,6 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { } var err error - cf.executablePath, err = os.Executable() if err != nil { return trace.Wrap(err) @@ -1848,6 +1852,14 @@ func onLogin(cf *CLIConf) error { } tc.HomePath = cf.HomePath + // The user is not logged in and has typed in `tsh --proxy=... login`, if + // the running binary needs to be updated, update and re-exec. + if profile == nil { + if err := tools.CheckAndUpdateRemote(cf.Context, teleport.Version, tc.WebProxyAddr, tc.InsecureSkipVerify); err != nil { + return trace.Wrap(err) + } + } + // client is already logged in and profile is not expired if profile != nil && !profile.IsExpired(clockwork.NewRealClock()) { switch { @@ -1858,6 +1870,13 @@ func onLogin(cf *CLIConf) error { // current status case cf.Proxy == "" && cf.SiteName == "" && cf.DesiredRoles == "" && cf.RequestID == "" && cf.IdentityFileOut == "" || host(cf.Proxy) == host(profile.ProxyURL.Host) && cf.SiteName == profile.Cluster && cf.DesiredRoles == "" && cf.RequestID == "": + + // The user has typed `tsh login`, if the running binary needs to + // be updated, update and re-exec. + if err := tools.CheckAndUpdateRemote(cf.Context, teleport.Version, tc.WebProxyAddr, tc.InsecureSkipVerify); err != nil { + return trace.Wrap(err) + } + _, err := tc.PingAndShowMOTD(cf.Context) if err != nil { return trace.Wrap(err) @@ -1871,6 +1890,13 @@ func onLogin(cf *CLIConf) error { // if the proxy names match but nothing else is specified; show motd and update active profile and kube configs case host(cf.Proxy) == host(profile.ProxyURL.Host) && cf.SiteName == "" && cf.DesiredRoles == "" && cf.RequestID == "" && cf.IdentityFileOut == "": + + // The user has typed `tsh login`, if the running binary needs to + // be updated, update and re-exec. + if err := tools.CheckAndUpdateRemote(cf.Context, teleport.Version, tc.WebProxyAddr, tc.InsecureSkipVerify); err != nil { + return trace.Wrap(err) + } + _, err := tc.PingAndShowMOTD(cf.Context) if err != nil { return trace.Wrap(err) @@ -1941,7 +1967,11 @@ func onLogin(cf *CLIConf) error { // otherwise just pass through to standard login default: - + // The user is logged in and has typed in `tsh --proxy=... login`, if + // the running binary needs to be updated, update and re-exec. + if err := tools.CheckAndUpdateRemote(cf.Context, teleport.Version, tc.WebProxyAddr, tc.InsecureSkipVerify); err != nil { + return trace.Wrap(err) + } } } diff --git a/web/packages/build/package.json b/web/packages/build/package.json index 8af1aee8dd4e3..6a607154c9492 100644 --- a/web/packages/build/package.json +++ b/web/packages/build/package.json @@ -62,7 +62,7 @@ "core-js": "^3", "cross-env": "5.0.5", "cross-spawn": "6.0.5", - "electron-builder": "^25.1.7", + "electron-builder": "^25.1.8", "eslint": "^8.56.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-babel": "^5.3.1", diff --git a/web/packages/teleport/src/Bots/List/Bots.test.tsx b/web/packages/teleport/src/Bots/List/Bots.test.tsx index 508d8a6d977d2..4a411cf53063f 100644 --- a/web/packages/teleport/src/Bots/List/Bots.test.tsx +++ b/web/packages/teleport/src/Bots/List/Bots.test.tsx @@ -22,13 +22,20 @@ import { render, screen, userEvent, waitFor } from 'design/utils/testing'; import api from 'teleport/services/api'; import { botsApiResponseFixture } from 'teleport/Bots/fixtures'; -import { createTeleportContext } from 'teleport/mocks/contexts'; +import { + allAccessAcl, + createTeleportContext, + noAccess, +} from 'teleport/mocks/contexts'; import { ContextProvider } from 'teleport/index'; +import TeleportContext from 'teleport/teleportContext'; import { Bots } from './Bots'; -function renderWithContext(element) { - const ctx = createTeleportContext(); +function renderWithContext(element, ctx?: TeleportContext) { + if (!ctx) { + ctx = createTeleportContext(); + } return render( {element} @@ -57,6 +64,20 @@ test('shows empty state when bots are empty', async () => { }); }); +test('shows missing permissions error if user lacks permissions to list', async () => { + jest.spyOn(api, 'get').mockResolvedValue({ items: [] }); + const ctx = createTeleportContext(); + ctx.storeUser.setState({ acl: { ...allAccessAcl, bots: noAccess } }); + renderWithContext(, ctx); + + await waitFor(() => { + expect(screen.getByTestId('bots-empty-state')).toBeInTheDocument(); + }); + expect( + screen.getByText(/You do not have permission to access Bots/i) + ).toBeInTheDocument(); +}); + test('calls edit endpoint', async () => { jest .spyOn(api, 'get') diff --git a/web/packages/teleport/src/Bots/List/Bots.tsx b/web/packages/teleport/src/Bots/List/Bots.tsx index 04348997df457..ed9e42bfc019f 100644 --- a/web/packages/teleport/src/Bots/List/Bots.tsx +++ b/web/packages/teleport/src/Bots/List/Bots.tsx @@ -45,12 +45,15 @@ export function Bots() { const ctx = useTeleport(); const flags = ctx.getFeatureFlags(); const hasAddBotPermissions = flags.addBots; + const canListBots = flags.listBots; const [bots, setBots] = useState([]); const [selectedBot, setSelectedBot] = useState(); const [selectedRoles, setSelectedRoles] = useState(); const { attempt: crudAttempt, run: crudRun } = useAttemptNext(); - const { attempt: fetchAttempt, run: fetchRun } = useAttemptNext('processing'); + const { attempt: fetchAttempt, run: fetchRun } = useAttemptNext( + canListBots ? 'processing' : 'success' + ); useEffect(() => { const signal = new AbortController(); @@ -60,15 +63,17 @@ export function Bots() { return await fetchBots(signal, flags); } - fetchRun(() => - bots(signal.signal).then(botRes => { - setBots(botRes.bots); - }) - ); + if (canListBots) { + fetchRun(() => + bots(signal.signal).then(botRes => { + setBots(botRes.bots); + }) + ); + } return () => { signal.abort(); }; - }, [ctx, fetchRun]); + }, [ctx, fetchRun, canListBots]); async function fetchRoleNames(search: string): Promise { const flags = ctx.getFeatureFlags(); @@ -122,6 +127,12 @@ export function Bots() { if (fetchAttempt.status === 'success' && bots.length === 0) { return ( + {!canListBots && ( + + You do not have permission to access Bots. Missing role permissions:{' '} + bot.list + + )} ); diff --git a/web/packages/teleport/src/Bots/List/EmptyState/EmptyState.tsx b/web/packages/teleport/src/Bots/List/EmptyState/EmptyState.tsx index f0b05642020b5..67cf8bc7bd9c9 100644 --- a/web/packages/teleport/src/Bots/List/EmptyState/EmptyState.tsx +++ b/web/packages/teleport/src/Bots/List/EmptyState/EmptyState.tsx @@ -209,12 +209,20 @@ export const BotTiles = () => { {integrationsTop.map(integration => ( - + ))} {integrationsBottom.map(integration => ( - + ))} diff --git a/web/packages/teleport/src/Welcome/Welcome.test.tsx b/web/packages/teleport/src/Welcome/Welcome.test.tsx index a4a468139d46c..cae693c2d3479 100644 --- a/web/packages/teleport/src/Welcome/Welcome.test.tsx +++ b/web/packages/teleport/src/Welcome/Welcome.test.tsx @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -import React from 'react'; import { MemoryRouter, Route, Router } from 'react-router'; import { createMemoryHistory } from 'history'; import { fireEvent, render, screen, waitFor } from 'design/utils/testing'; @@ -89,7 +88,7 @@ describe('teleport/components/Welcome', () => { expect(auth.fetchPasswordToken).toHaveBeenCalled(); }); - expect(screen.getByText(/confirm password/i)).toBeInTheDocument(); + expect(await screen.findByText(/confirm password/i)).toBeInTheDocument(); }); it('should have correct welcome prompt flow for reset', async () => { @@ -123,7 +122,7 @@ describe('teleport/components/Welcome', () => { }); expect(auth.fetchPasswordToken).toHaveBeenCalled(); - expect(screen.getByText(/submit/i)).toBeInTheDocument(); + expect(await screen.findByText(/submit/i)).toBeInTheDocument(); }); it('reset password', async () => { @@ -217,7 +216,7 @@ describe('teleport/components/Welcome', () => { }); // Trigger submit. - await user.click(screen.getByText(/submit/i)); + await user.click(await screen.findByText(/submit/i)); expect(auth.resetPasswordWithWebauthn).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/web/packages/teleport/src/features.tsx b/web/packages/teleport/src/features.tsx index 7e698622162e5..75a4ca095191d 100644 --- a/web/packages/teleport/src/features.tsx +++ b/web/packages/teleport/src/features.tsx @@ -216,8 +216,8 @@ export class FeatureBots implements TeleportFeature { component: Bots, }; - hasAccess(flags: FeatureFlags) { - return flags.listBots; + hasAccess() { + return true; } navigationItem = { diff --git a/web/packages/teleterm/electron-builder-config.js b/web/packages/teleterm/electron-builder-config.js index 27a874422f6e6..b61b2b316b9bd 100644 --- a/web/packages/teleterm/electron-builder-config.js +++ b/web/packages/teleterm/electron-builder-config.js @@ -43,6 +43,8 @@ module.exports = { appId, asar: true, asarUnpack: '**\\*.{node,dll}', + // TODO(ravicious): Migrate from custom notarize.js script to using the notarize field of the + // mac target. afterSign: 'notarize.js', afterPack: packed => { // @electron-universal adds the `ElectronAsarIntegrity` key to every .plist @@ -95,6 +97,9 @@ module.exports = { target: 'dmg', category: 'public.app-category.developer-tools', type: 'distribution', + // TODO(ravicious): Migrate from custom notarize.js script to using the notarize field of the + // mac target. + notarize: false, hardenedRuntime: true, gatekeeperAssess: false, // If CONNECT_TSH_APP_PATH is provided, we assume that tsh.app is already signed. diff --git a/web/packages/teleterm/notarize.js b/web/packages/teleterm/notarize.js index 082a43e3ff5f3..dad6cfd9d9be2 100644 --- a/web/packages/teleterm/notarize.js +++ b/web/packages/teleterm/notarize.js @@ -23,6 +23,8 @@ exports.default = async function notarizing(context) { const appName = context.packager.appInfo.productFilename; const appBundleId = context.packager.appInfo.macBundleIdentifier; + console.log('notarize.js: Notarizing in progress.'); + return await notarize({ appBundleId, appPath: `${appOutDir}/${appName}.app`, diff --git a/web/packages/teleterm/package.json b/web/packages/teleterm/package.json index d7d9719b74f07..59c5292813e1a 100644 --- a/web/packages/teleterm/package.json +++ b/web/packages/teleterm/package.json @@ -45,7 +45,7 @@ "@types/node-forge": "^1.0.4", "@types/tar-fs": "^2.0.1", "@types/whatwg-url": "^11.0.1", - "electron": "33.1.0", + "electron": "33.2.1", "electron-vite": "^2.0.0", "google-protobuf": "^3.21.2", "immer": "^10.1.1", diff --git a/web/packages/teleterm/src/mainProcess/mainProcess.ts b/web/packages/teleterm/src/mainProcess/mainProcess.ts index e88abc6069467..e0e8d08f3fdd1 100644 --- a/web/packages/teleterm/src/mainProcess/mainProcess.ts +++ b/web/packages/teleterm/src/mainProcess/mainProcess.ts @@ -53,6 +53,10 @@ import * as grpcCreds from 'teleterm/services/grpcCredentials'; import { createTshdClient, TshdClient } from 'teleterm/services/tshd'; import { loggingInterceptor } from 'teleterm/services/tshd/interceptors'; import { staticConfig } from 'teleterm/staticConfig'; +import { + TSH_AUTOUPDATE_ENV_VAR, + TSH_AUTOUPDATE_OFF, +} from 'teleterm/node/tshAutoupdate'; import { ConfigService, @@ -188,6 +192,7 @@ export default class MainProcess { env: { ...process.env, TELEPORT_HOME: homeDir, + [TSH_AUTOUPDATE_ENV_VAR]: TSH_AUTOUPDATE_OFF, }, } ); diff --git a/web/packages/teleterm/src/node/README.md b/web/packages/teleterm/src/node/README.md new file mode 100644 index 0000000000000..28ea74a4d8d5c --- /dev/null +++ b/web/packages/teleterm/src/node/README.md @@ -0,0 +1,2 @@ +Files in this directory are executed within a Node.js process, be it the main process or the shared +process. diff --git a/web/packages/teleterm/src/node/tshAutoupdate.ts b/web/packages/teleterm/src/node/tshAutoupdate.ts new file mode 100644 index 0000000000000..8ac6d73d9b8b2 --- /dev/null +++ b/web/packages/teleterm/src/node/tshAutoupdate.ts @@ -0,0 +1,27 @@ +/** + * Teleport + * Copyright (C) 2024 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 . + */ + +/** + * An env var which controls whether tsh is going to download an up-to-date version of itself + * to ~/.tsh/bin and re-execute itself. In Connect, we always want it to be set to 'off', as Connect + * needs to use the bundled tsh where the version of tsh matches exactly the version of Connect. + * + * See RFD 144 for more details. + */ +export const TSH_AUTOUPDATE_ENV_VAR = 'TELEPORT_TOOLS_VERSION'; +export const TSH_AUTOUPDATE_OFF = 'off'; diff --git a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts index 65f7845435975..671b8e612acfe 100644 --- a/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts +++ b/web/packages/teleterm/src/services/pty/ptyHost/buildPtyOptions.ts @@ -21,6 +21,10 @@ import path, { delimiter } from 'path'; import { RuntimeSettings } from 'teleterm/mainProcess/types'; import { PtyProcessOptions } from 'teleterm/sharedProcess/ptyHost'; import { assertUnreachable } from 'teleterm/ui/utils'; +import { + TSH_AUTOUPDATE_ENV_VAR, + TSH_AUTOUPDATE_OFF, +} from 'teleterm/node/tshAutoupdate'; import { PtyCommand, @@ -63,6 +67,9 @@ export async function buildPtyOptions( throw error; }) .then(({ shellEnv, creationStatus }) => { + // combinedEnv is going to be used as env by every command coming out of buildPtyOptions. Some + // commands might add extra variables, but they shouldn't remove any of the env vars that are + // added here. const combinedEnv = { ...process.env, ...shellEnv, @@ -71,6 +78,7 @@ export async function buildPtyOptions( TELEPORT_HOME: settings.tshd.homeDir, TELEPORT_CLUSTER: cmd.clusterName, TELEPORT_PROXY: cmd.proxyHost, + [TSH_AUTOUPDATE_ENV_VAR]: TSH_AUTOUPDATE_OFF, }; return { diff --git a/yarn.lock b/yarn.lock index 3f96d85ef84f7..c85b07d1066a3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5110,10 +5110,10 @@ app-builder-bin@5.0.0-alpha.10: resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.10.tgz#cf12e593b6b847fb9d04027fa755c6c6610d778b" integrity sha512-Ev4jj3D7Bo+O0GPD2NMvJl+PGiBAfS7pUGawntBNpCbxtpncfUixqFj9z9Jme7V7s3LBGqsWZZP54fxBX3JKJw== -app-builder-lib@25.1.7: - version "25.1.7" - resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.1.7.tgz#f8ce8e2edc6d91becbe956b1205da1f3849cafe9" - integrity sha512-JxmN+D/Dn7BLQoN+cTFO+zbMHcpI10v/xjyjFO1FKpHbApOG+OQt/xUyVjKWp4FYplIfuHdpxqTXo1PN/Wzm/A== +app-builder-lib@25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-25.1.8.tgz#ae376039c5f269c7d562af494a087e5bc6310f1b" + integrity sha512-pCqe7dfsQFBABC1jeKZXQWhGcCPF3rPCXDdfqVKjIeWBcXzyC1iOWZdfFhGl+S9MyE/k//DFmC6FzuGAUudNDg== dependencies: "@develar/schema-utils" "~2.6.5" "@electron/notarize" "2.5.0" @@ -7279,12 +7279,12 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" -dmg-builder@25.1.7: - version "25.1.7" - resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.7.tgz#a3bb8e1dc790faec04503568480db80f5077a2cb" - integrity sha512-Hac0AfXQrAV62JT99Had6bvUJb/f7vjJTaLOsmA/gAQcrc/cLmNAqCJ0ZZDqwKy2+LKXnxx45TvMXvovKd4iMg== +dmg-builder@25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-25.1.8.tgz#41f3b725edd896156e891016a44129e1bd580430" + integrity sha512-NoXo6Liy2heSklTI5OIZbCgXC1RzrDQsZkeEwXhdOro3FT1VBOvbubvscdPnjVuQ4AMwwv61oaH96AbiYg9EnQ== dependencies: - app-builder-lib "25.1.7" + app-builder-lib "25.1.8" builder-util "25.1.7" builder-util-runtime "9.2.10" fs-extra "^10.1.0" @@ -7461,16 +7461,16 @@ ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-builder@^25.1.7: - version "25.1.7" - resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.1.7.tgz#b3d1504925a4d3693d97c76c0d2f2906613ffe4b" - integrity sha512-lsKtX93GSHWnmuteNRvBzgJIjRiiYB0qrJVRjShwBi75Ns+mRdWeOGZiXItqOWj+3g5UyY722kgoq2WlqCB87A== +electron-builder@^25.1.8: + version "25.1.8" + resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-25.1.8.tgz#b0e310f1600787610bb84c3f39bc7aadb2548486" + integrity sha512-poRgAtUHHOnlzZnc9PK4nzG53xh74wj2Jy7jkTrqZ0MWPoHGh1M2+C//hGeYdA+4K8w4yiVCNYoLXF7ySj2Wig== dependencies: - app-builder-lib "25.1.7" + app-builder-lib "25.1.8" builder-util "25.1.7" builder-util-runtime "9.2.10" chalk "^4.1.2" - dmg-builder "25.1.7" + dmg-builder "25.1.8" fs-extra "^10.1.0" is-ci "^3.0.0" lazy-val "^1.0.5" @@ -7507,10 +7507,10 @@ electron-vite@^2.0.0: magic-string "^0.30.5" picocolors "^1.0.0" -electron@33.1.0: - version "33.1.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-33.1.0.tgz#c86042e71fa964a054b3306810a3c451aada98f7" - integrity sha512-7KiY6MtRo1fVFLPGyHS7Inh8yZfrbUTy43nNwUgMD2CBk729BgSwOC2WhmcptNJVlzHJpVxSWkiVi2hp9mH/bw== +electron@33.2.1: + version "33.2.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-33.2.1.tgz#d0d7bba7a7abf4f14881d0a6e03c498b301a2d5f" + integrity sha512-SG/nmSsK9Qg1p6wAW+ZfqU+AV8cmXMTIklUL18NnOKfZLlum4ZsDoVdmmmlL39ZmeCaq27dr7CgslRPahfoVJg== dependencies: "@electron/get" "^2.0.0" "@types/node" "^20.9.0"