diff --git a/CHANGELOG.md b/CHANGELOG.md index f51f6c8b8fe84..195f46d8bed3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,37 @@ # Changelog +## 16.4.7 (11/11/2024) + +* Fixed bug in Kubernetes session recordings where both root and leaf cluster recorded the same Kubernetes session. Recordings of leaf resources are only available in leaf clusters. [#48738](https://github.com/gravitational/teleport/pull/48738) +* Machine ID can now be forced to use the explicitly configured proxy address using the `TBOT_USE_PROXY_ADDR` environment variable. This should better support split proxy address operation. [#48675](https://github.com/gravitational/teleport/pull/48675) +* Fixed undefined error in open source version when clicking on `Add Application` tile in the Enroll Resources page in the Web UI. [#48616](https://github.com/gravitational/teleport/pull/48616) +* Updated Go to 1.22.9. [#48581](https://github.com/gravitational/teleport/pull/48581) +* The teleport-cluster Helm chart now uses the configured `serviceAccount.name` from chart values for its pre-deploy configuration check Jobs. [#48579](https://github.com/gravitational/teleport/pull/48579) +* Fixed a bug that prevented the Teleport UI from properly displaying Plugin Audit log details. [#48462](https://github.com/gravitational/teleport/pull/48462) +* Fixed an issue preventing migration of unmanaged users to Teleport host users when including `teleport-keep` in a role's `host_groups`. [#48455](https://github.com/gravitational/teleport/pull/48455) +* Fixed showing the list of access requests in Teleport Connect when a leaf cluster is selected in the cluster selector. [#48441](https://github.com/gravitational/teleport/pull/48441) +* Added Connect support for selecting Kubernetes namespaces during access requests. [#48413](https://github.com/gravitational/teleport/pull/48413) +* Fixed a rare "internal error" on older U2F authenticators when using tsh. [#48402](https://github.com/gravitational/teleport/pull/48402) +* Fixed `tsh play` not skipping idle time when `--skip-idle-time` was provided. [#48397](https://github.com/gravitational/teleport/pull/48397) +* Added a warning to `tctl edit` about dynamic edits to statically configured resources. [#48392](https://github.com/gravitational/teleport/pull/48392) +* Define a new `role.allow.request` field called `kubernetes_resources` that allows admins to define what kinds of Kubernetes resources a requester can make. [#48387](https://github.com/gravitational/teleport/pull/48387) +* Fixed a Teleport Kubernetes Operator bug that happened for OIDCConnector resources with non-nil `max_age`. [#48376](https://github.com/gravitational/teleport/pull/48376) +* Updated host user creation to prevent local password expiration policies from affecting Teleport managed users. [#48163](https://github.com/gravitational/teleport/pull/48163) +* Added support for Entra ID directory synchronization for clusters without public internet access. [#48089](https://github.com/gravitational/teleport/pull/48089) +* Fixed "Missing Region" error for teleport bootstrap commands. [#47995](https://github.com/gravitational/teleport/pull/47995) +* Fixed a bug that prevented selecting security groups during the Aurora database enrollment wizard in the web UI. [#47975](https://github.com/gravitational/teleport/pull/47975) +* During the Set Up Access of the Enroll New Resource flows, Okta users will be asked to change the role instead of entering the principals and getting an error afterwards. [#47957](https://github.com/gravitational/teleport/pull/47957) +* Fixed `teleport_connected_resource` metric overshooting after keepalive errors. [#47949](https://github.com/gravitational/teleport/pull/47949) +* Fixed an issue preventing connections with users whose configured home directories were inaccessible. [#47916](https://github.com/gravitational/teleport/pull/47916) +* Added a `resolve` command to tsh that may be used as the target for a Match exec condition in an SSH config. [#47868](https://github.com/gravitational/teleport/pull/47868) +* Respect `HTTP_PROXY` environment variables for Access Request integrations. [#47738](https://github.com/gravitational/teleport/pull/47738) +* Updated tsh ssh to support the `--` delimiter similar to openssh. It is now possible to execute a command via `tsh ssh user@host -- echo test` or `tsh ssh -- host uptime`. [#47493](https://github.com/gravitational/teleport/pull/47493) + +Enterprise: +* Jamf requests from Teleport set "teleport/$version" as the User-Agent. +* Add Web UI support for selecting Kubernetes namespaces during access requests. +* Import user roles and traits when using the EntraID directory sync. + ## 16.4.6 (10/22/2024) ### Security Fixes diff --git a/Makefile b/Makefile index 78768a2c0b0c7..159c2195f901a 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=16.4.6 +VERSION=16.4.7 DOCKER_IMAGE ?= teleport @@ -1474,7 +1474,7 @@ derive: .PHONY: derive-up-to-date derive-up-to-date: must-start-clean/host derive @if ! git diff --quiet; then \ - echo 'Please run make derive.'; \ + ./build.assets/please-run.sh "derived functions" "make derive"; \ exit 1; \ fi @@ -1509,14 +1509,15 @@ endif .PHONY: protos-up-to-date/host protos-up-to-date/host: must-start-clean/host grpc/host @if ! git diff --quiet; then \ - echo 'Please run make grpc.'; \ + ./build.assets/please-run.sh "protos gRPC" "make grpc"; \ exit 1; \ fi .PHONY: must-start-clean/host must-start-clean/host: @if ! git diff --quiet; then \ - echo 'This must be run from a repo with no unstaged commits.'; \ + @echo 'This must be run from a repo with no unstaged commits.'; \ + git diff; \ exit 1; \ fi @@ -1525,7 +1526,12 @@ must-start-clean/host: crds-up-to-date: must-start-clean/host $(MAKE) -C integrations/operator manifests @if ! git diff --quiet; then \ - echo 'Please run make -C integrations/operator manifests.'; \ + ./build.assets/please-run.sh "operator CRD manifests" "make -C integrations/operator crd"; \ + exit 1; \ + fi + $(MAKE) -C integrations/operator crd-docs + @if ! git diff --quiet; then \ + ./build.assets/please-run.sh "operator CRD docs" "make -C integrations/operator crd"; \ exit 1; \ fi $(MAKE) -C integrations/operator crd-docs @@ -1540,8 +1546,7 @@ crds-up-to-date: must-start-clean/host terraform-resources-up-to-date: must-start-clean/host $(MAKE) -C integrations/terraform docs @if ! git diff --quiet; then \ - echo 'Please run make -C integrations/terraform docs.'; \ - git diff; \ + ./build.assets/please-run.sh "TF provider docs" "make -C integrations/terraform docs"; \ exit 1; \ fi diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index f2d9ddfc8ef95..9f2b9a0ac8448 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -2160,10 +2160,12 @@ type Features struct { // AccessMonitoringConfigured contributes to the enablement of access monitoring. // NOTE: this flag is used to signal that Access Monitoring is *enabled* on a cluster. // *Access* to the feature is gated on the `AccessMonitoring` entitlement. - AccessMonitoringConfigured bool `protobuf:"varint,36,opt,name=AccessMonitoringConfigured,proto3" json:"AccessMonitoringConfigured,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AccessMonitoringConfigured bool `protobuf:"varint,36,opt,name=AccessMonitoringConfigured,proto3" json:"AccessMonitoringConfigured,omitempty"` + // CloudAnonymizationKey is a hash of the Salesforce ID used to anonymize usage events + CloudAnonymizationKey []byte `protobuf:"bytes,37,opt,name=CloudAnonymizationKey,proto3" json:"cloud_anonymization_key,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Features) Reset() { *m = Features{} } @@ -2430,6 +2432,13 @@ func (m *Features) GetAccessMonitoringConfigured() bool { return false } +func (m *Features) GetCloudAnonymizationKey() []byte { + if m != nil { + return m.CloudAnonymizationKey + } + return nil +} + // EntitlementInfo is the state and limits of a particular entitlement type EntitlementInfo struct { // enabled indicates the feature is 'on' if true @@ -15573,932 +15582,934 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 14788 bytes of a gzipped FileDescriptorProto + // 14822 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x6c, 0x5c, 0x4b, 0x76, 0x18, 0xca, 0xe6, 0x9b, 0x8b, 0xaf, 0x56, 0x91, 0x14, 0x5b, 0x14, 0xa5, 0x96, 0xb6, 0xce, 0x43, 0x47, 0x73, 0x46, 0x0f, 0xea, 0x9c, 0x33, 0xe7, 0x35, 0xe7, 0x4c, 0xf3, 0x21, 0x91, 0x12, 0x5f, 0x67, 0x37, 0x49, 0x9d, 0x97, 0xa7, 0x67, 0xb3, 0xbb, 0x44, 0x6e, 0xab, 0xb9, 0x77, 0xcf, - 0xde, 0xbb, 0xa5, 0xa3, 0xf1, 0xb5, 0x2f, 0x3c, 0xbe, 0x17, 0xd7, 0xf7, 0x23, 0x89, 0x0d, 0xc4, - 0x81, 0x03, 0x7f, 0x18, 0x01, 0x12, 0x20, 0xc8, 0x47, 0x90, 0x1f, 0xc7, 0x3f, 0xc9, 0x47, 0x90, - 0x8f, 0x4c, 0x0c, 0x18, 0x49, 0x60, 0xfb, 0x27, 0x1f, 0x74, 0x32, 0x40, 0x7e, 0x88, 0xe4, 0xc3, - 0x08, 0x12, 0x20, 0x03, 0x18, 0x08, 0x6a, 0xd5, 0x63, 0x57, 0xed, 0x47, 0x37, 0x29, 0xe9, 0x8c, - 0xf3, 0x23, 0xb1, 0x57, 0xad, 0xb5, 0xaa, 0x6a, 0x55, 0xed, 0xaa, 0x55, 0xab, 0x56, 0xad, 0x05, - 0x37, 0x23, 0xda, 0xa4, 0x2d, 0x3f, 0x88, 0x6e, 0x35, 0xe9, 0x81, 0x53, 0x7f, 0x7e, 0xab, 0xde, - 0x74, 0xa9, 0x17, 0xdd, 0x6a, 0x05, 0x7e, 0xe4, 0xdf, 0x72, 0xda, 0xd1, 0x61, 0x48, 0x83, 0xa7, - 0x6e, 0x9d, 0xde, 0x44, 0x08, 0x19, 0xc0, 0xff, 0xe6, 0xa6, 0x0f, 0xfc, 0x03, 0x9f, 0xe3, 0xb0, - 0xbf, 0x78, 0xe1, 0xdc, 0xc5, 0x03, 0xdf, 0x3f, 0x68, 0x52, 0x4e, 0xbc, 0xdf, 0x7e, 0x7c, 0x8b, - 0x1e, 0xb5, 0xa2, 0xe7, 0xa2, 0xb0, 0x9c, 0x2c, 0x8c, 0xdc, 0x23, 0x1a, 0x46, 0xce, 0x51, 0x4b, - 0x20, 0xbc, 0xa5, 0x9a, 0xe2, 0x44, 0x11, 0x2b, 0x89, 0x5c, 0xdf, 0xbb, 0xf5, 0xf4, 0x8e, 0xfe, - 0x53, 0xa0, 0x5e, 0xef, 0xd8, 0xea, 0x3a, 0x0d, 0xa2, 0xf0, 0x54, 0x98, 0xf4, 0x29, 0xf5, 0xa2, - 0x54, 0xf5, 0x02, 0x33, 0x7a, 0xde, 0xa2, 0x21, 0x47, 0x91, 0xff, 0x09, 0xd4, 0xab, 0xd9, 0xa8, - 0xf8, 0xaf, 0x40, 0xf9, 0x6e, 0x36, 0xca, 0x33, 0xba, 0xcf, 0x64, 0xea, 0xa9, 0x3f, 0xba, 0xa0, - 0x07, 0x4e, 0xab, 0x45, 0x83, 0xf8, 0x0f, 0x81, 0x7e, 0x41, 0xa1, 0x1f, 0x3d, 0x76, 0x98, 0x88, - 0x8e, 0x1e, 0x3b, 0xa9, 0x6e, 0xb4, 0x43, 0xe7, 0x80, 0x8a, 0xe6, 0x3f, 0xbd, 0xa3, 0xff, 0xe4, - 0xa8, 0xd6, 0x1f, 0x16, 0x60, 0xe0, 0x91, 0x13, 0xd5, 0x0f, 0xc9, 0xa7, 0x30, 0xf0, 0xd0, 0xf5, - 0x1a, 0x61, 0xa9, 0x70, 0xa5, 0xef, 0xfa, 0xe8, 0x42, 0xf1, 0x26, 0xef, 0x0a, 0x16, 0xb2, 0x82, - 0xc5, 0xd9, 0x9f, 0x1d, 0x97, 0x7b, 0x4e, 0x8e, 0xcb, 0x93, 0x4f, 0x18, 0xda, 0xdb, 0xfe, 0x91, - 0x1b, 0xe1, 0xd8, 0xda, 0x9c, 0x8e, 0xec, 0xc2, 0x54, 0xa5, 0xd9, 0xf4, 0x9f, 0x6d, 0x3b, 0x41, - 0xe4, 0x3a, 0xcd, 0x6a, 0xbb, 0x5e, 0xa7, 0x61, 0x58, 0xea, 0xbd, 0x52, 0xb8, 0x3e, 0xbc, 0x78, - 0xed, 0xe4, 0xb8, 0x5c, 0x76, 0x58, 0x71, 0xad, 0xc5, 0xcb, 0x6b, 0x21, 0x47, 0xd0, 0x18, 0x65, - 0xd1, 0x5b, 0x7f, 0x32, 0x08, 0xc5, 0x55, 0x3f, 0x8c, 0x96, 0xd8, 0x88, 0xda, 0xf4, 0xc7, 0x6d, - 0x1a, 0x46, 0xe4, 0x1a, 0x0c, 0x32, 0xd8, 0xda, 0x72, 0xa9, 0x70, 0xa5, 0x70, 0x7d, 0x64, 0x71, - 0xf4, 0xe4, 0xb8, 0x3c, 0x74, 0xe8, 0x87, 0x51, 0xcd, 0x6d, 0xd8, 0xa2, 0x88, 0xbc, 0x05, 0xc3, - 0x9b, 0x7e, 0x83, 0x6e, 0x3a, 0x47, 0x14, 0x5b, 0x31, 0xb2, 0x38, 0x7e, 0x72, 0x5c, 0x1e, 0xf1, - 0xfc, 0x06, 0xad, 0x79, 0xce, 0x11, 0xb5, 0x55, 0x31, 0xd9, 0x83, 0x7e, 0xdb, 0x6f, 0xd2, 0x52, - 0x1f, 0xa2, 0x2d, 0x9e, 0x1c, 0x97, 0xfb, 0x03, 0xbf, 0x49, 0x7f, 0x71, 0x5c, 0x7e, 0xef, 0xc0, - 0x8d, 0x0e, 0xdb, 0xfb, 0x37, 0xeb, 0xfe, 0xd1, 0xad, 0x83, 0xc0, 0x79, 0xea, 0xf2, 0x49, 0xe8, - 0x34, 0x6f, 0xc5, 0x53, 0xb5, 0xe5, 0x8a, 0x71, 0xaf, 0x3e, 0x0f, 0x23, 0x7a, 0xc4, 0x38, 0xd9, - 0xc8, 0x8f, 0x3c, 0x82, 0xe9, 0x4a, 0xa3, 0xe1, 0x72, 0x8a, 0xed, 0xc0, 0xf5, 0xea, 0x6e, 0xcb, - 0x69, 0x86, 0xa5, 0xfe, 0x2b, 0x7d, 0xd7, 0x47, 0x84, 0x50, 0x54, 0x79, 0xad, 0xa5, 0x10, 0x34, - 0xa1, 0x64, 0x32, 0x20, 0x77, 0x61, 0x78, 0x79, 0xb3, 0xca, 0xda, 0x1e, 0x96, 0x06, 0x90, 0xd9, - 0xec, 0xc9, 0x71, 0x79, 0xaa, 0xe1, 0x85, 0xd8, 0x35, 0x9d, 0x81, 0x42, 0x24, 0xef, 0xc1, 0xd8, - 0x76, 0x7b, 0xbf, 0xe9, 0xd6, 0x77, 0xd6, 0xab, 0x0f, 0xe9, 0xf3, 0xd2, 0xe0, 0x95, 0xc2, 0xf5, - 0xb1, 0x45, 0x72, 0x72, 0x5c, 0x9e, 0x68, 0x21, 0xbc, 0x16, 0x35, 0xc3, 0xda, 0x13, 0xfa, 0xdc, - 0x36, 0xf0, 0x62, 0xba, 0x6a, 0x75, 0x95, 0xd1, 0x0d, 0xa5, 0xe8, 0xc2, 0xf0, 0x50, 0xa7, 0xe3, - 0x78, 0xe4, 0x16, 0x80, 0x4d, 0x8f, 0xfc, 0x88, 0x56, 0x1a, 0x8d, 0xa0, 0x34, 0x8c, 0xb2, 0x9d, - 0x3c, 0x39, 0x2e, 0x8f, 0x06, 0x08, 0xad, 0x39, 0x8d, 0x46, 0x60, 0x6b, 0x28, 0x64, 0x09, 0x86, - 0x6d, 0x9f, 0x0b, 0xb8, 0x34, 0x72, 0xa5, 0x70, 0x7d, 0x74, 0x61, 0x52, 0x4c, 0x43, 0x09, 0x5e, - 0x3c, 0x7f, 0x72, 0x5c, 0x26, 0x81, 0xf8, 0xa5, 0xf7, 0x52, 0x62, 0x90, 0x32, 0x0c, 0x6d, 0xfa, - 0x4b, 0x4e, 0xfd, 0x90, 0x96, 0x00, 0xe7, 0xde, 0xc0, 0xc9, 0x71, 0xb9, 0xf0, 0x5d, 0x5b, 0x42, - 0xc9, 0x53, 0x18, 0x8d, 0x07, 0x2a, 0x2c, 0x8d, 0xa2, 0xf8, 0x76, 0x4e, 0x8e, 0xcb, 0xe7, 0x43, - 0x04, 0xd7, 0xd8, 0xd0, 0x6b, 0x12, 0x7c, 0x89, 0x59, 0xa0, 0x57, 0x44, 0xbe, 0x86, 0x99, 0xf8, - 0x67, 0x25, 0x0c, 0x69, 0xc0, 0x78, 0xac, 0x2d, 0x97, 0xc6, 0x51, 0x32, 0x6f, 0x9c, 0x1c, 0x97, - 0x2d, 0xad, 0x05, 0x35, 0x47, 0xa2, 0xd4, 0xdc, 0x86, 0xd6, 0xd3, 0x6c, 0x26, 0x0f, 0xfa, 0x87, - 0xc7, 0x8a, 0xe3, 0xf6, 0xa5, 0x5d, 0x2f, 0x8c, 0x9c, 0xfd, 0x26, 0xcd, 0x44, 0xb2, 0xfe, 0xba, - 0x00, 0x64, 0xab, 0x45, 0xbd, 0x6a, 0x75, 0x95, 0x7d, 0x4f, 0xf2, 0x73, 0x7a, 0x1b, 0x46, 0xf8, - 0xc0, 0xb1, 0xd1, 0xed, 0xc5, 0xd1, 0x9d, 0x38, 0x39, 0x2e, 0x83, 0x18, 0x5d, 0x36, 0xb2, 0x31, - 0x02, 0x79, 0x1d, 0xfa, 0x76, 0x76, 0xd6, 0xf1, 0x5b, 0xe9, 0x5b, 0x9c, 0x3a, 0x39, 0x2e, 0xf7, - 0x45, 0x51, 0xf3, 0x17, 0xc7, 0xe5, 0xe1, 0xe5, 0x76, 0x80, 0x62, 0xb1, 0x59, 0x39, 0x79, 0x1d, - 0x86, 0x96, 0x9a, 0xed, 0x30, 0xa2, 0x41, 0xa9, 0x3f, 0xfe, 0x48, 0xeb, 0x1c, 0x64, 0xcb, 0x32, - 0xf2, 0x1d, 0xe8, 0xdf, 0x0d, 0x69, 0x50, 0x1a, 0xc0, 0xf1, 0x1e, 0x17, 0xe3, 0xcd, 0x40, 0x7b, - 0x0b, 0x8b, 0xc3, 0xec, 0x4b, 0x6c, 0x87, 0x34, 0xb0, 0x11, 0x89, 0xdc, 0x84, 0x01, 0x3e, 0x68, - 0x83, 0xb8, 0x48, 0x8d, 0xab, 0xd9, 0xd1, 0xa4, 0x7b, 0xef, 0x2d, 0x8e, 0x9c, 0x1c, 0x97, 0x07, - 0x70, 0xf0, 0x6c, 0x8e, 0xf6, 0xa0, 0x7f, 0xb8, 0x50, 0xec, 0xb5, 0x87, 0x19, 0x2d, 0xfb, 0x2c, - 0xac, 0xef, 0xc0, 0xa8, 0xd6, 0x7d, 0x32, 0x0f, 0xfd, 0xec, 0x7f, 0x5c, 0x44, 0xc6, 0x78, 0x65, - 0x6c, 0xe3, 0xb0, 0x11, 0x6a, 0xfd, 0xf3, 0x49, 0x28, 0x32, 0x4a, 0x63, 0xe5, 0x31, 0x44, 0x55, - 0xe8, 0x26, 0xaa, 0xeb, 0xa0, 0xea, 0x16, 0x4b, 0xd0, 0xd8, 0xc9, 0x71, 0x79, 0xb8, 0x2d, 0x60, - 0x71, 0xcb, 0x48, 0x15, 0x86, 0x56, 0xbe, 0x69, 0xb9, 0x01, 0x0d, 0x51, 0xb0, 0xa3, 0x0b, 0x73, - 0x37, 0xf9, 0x66, 0x79, 0x53, 0x6e, 0x96, 0x37, 0x77, 0xe4, 0x66, 0xb9, 0x78, 0x49, 0x2c, 0xc5, - 0xe7, 0x28, 0x27, 0x89, 0x67, 0xc7, 0xef, 0xfc, 0x65, 0xb9, 0x60, 0x4b, 0x4e, 0xe4, 0x6d, 0x18, - 0xbc, 0xe7, 0x07, 0x47, 0x4e, 0x24, 0x46, 0x60, 0xfa, 0xe4, 0xb8, 0x5c, 0x7c, 0x8c, 0x10, 0x6d, - 0x42, 0x09, 0x1c, 0x72, 0x0f, 0x26, 0x6c, 0xbf, 0x1d, 0xd1, 0x1d, 0x5f, 0x8e, 0xdb, 0x00, 0x52, - 0x5d, 0x3e, 0x39, 0x2e, 0xcf, 0x05, 0xac, 0xa4, 0x16, 0xf9, 0x35, 0x31, 0x80, 0x1a, 0x7d, 0x82, - 0x8a, 0xac, 0xc0, 0x44, 0x05, 0xd7, 0x6e, 0x21, 0x33, 0x3e, 0x5a, 0x23, 0x8b, 0x97, 0x4e, 0x8e, - 0xcb, 0x17, 0x1c, 0x2c, 0xa9, 0x05, 0xa2, 0x48, 0x67, 0x63, 0x12, 0x91, 0x4d, 0x38, 0xf7, 0xb0, - 0xbd, 0x4f, 0x03, 0x8f, 0x46, 0x34, 0x94, 0x2d, 0x1a, 0xc2, 0x16, 0x5d, 0x39, 0x39, 0x2e, 0xcf, - 0x3f, 0x51, 0x85, 0x19, 0x6d, 0x4a, 0x93, 0x12, 0x0a, 0x93, 0xa2, 0xa1, 0xcb, 0x4e, 0xe4, 0xec, - 0x3b, 0x21, 0xc5, 0x25, 0x69, 0x74, 0xe1, 0x3c, 0x17, 0xf1, 0xcd, 0x44, 0xe9, 0xe2, 0x35, 0x21, - 0xe5, 0x8b, 0xaa, 0xef, 0x0d, 0x51, 0xa4, 0x55, 0x94, 0xe4, 0xc9, 0x56, 0x66, 0xb5, 0xeb, 0x8c, - 0x60, 0x6b, 0x71, 0x65, 0x56, 0xbb, 0x8e, 0xbe, 0x66, 0xa9, 0xfd, 0x67, 0x1d, 0x06, 0x76, 0xd9, - 0xde, 0x8c, 0x2b, 0xd6, 0xc4, 0xc2, 0x55, 0xd1, 0xa2, 0xe4, 0xec, 0xbb, 0xc9, 0x7e, 0x20, 0x22, - 0x7e, 0x77, 0x93, 0xb8, 0x9f, 0xeb, 0x3b, 0x31, 0x96, 0x91, 0xcf, 0x00, 0x44, 0xab, 0x2a, 0xad, - 0x56, 0x69, 0x14, 0x3b, 0x79, 0xce, 0xec, 0x64, 0xa5, 0xd5, 0x5a, 0xbc, 0x2c, 0xfa, 0x77, 0x5e, - 0xf5, 0xcf, 0x69, 0xb5, 0x34, 0x6e, 0x1a, 0x13, 0xf2, 0x29, 0x8c, 0xe1, 0x82, 0x26, 0x47, 0x74, - 0x0c, 0x47, 0xf4, 0xe2, 0xc9, 0x71, 0x79, 0x16, 0xd7, 0xaa, 0x8c, 0xf1, 0x34, 0x08, 0xc8, 0x6f, - 0xc0, 0x8c, 0x60, 0xf7, 0xc8, 0xf5, 0x1a, 0xfe, 0xb3, 0x70, 0x99, 0x86, 0x4f, 0x22, 0xbf, 0x85, - 0x8b, 0xdf, 0xe8, 0xc2, 0xbc, 0xd9, 0x3c, 0x13, 0x67, 0xf1, 0x86, 0x68, 0xa9, 0xa5, 0x5a, 0xfa, - 0x8c, 0x23, 0xd4, 0x1a, 0x1c, 0x43, 0x5f, 0x1e, 0x33, 0x59, 0x90, 0x35, 0x98, 0xdc, 0x0d, 0xa9, - 0xd1, 0x87, 0x09, 0xdc, 0x1d, 0xca, 0x6c, 0x84, 0xdb, 0x21, 0xad, 0xe5, 0xf5, 0x23, 0x49, 0x47, - 0x6c, 0x20, 0xcb, 0x81, 0xdf, 0x4a, 0xcc, 0xf1, 0x49, 0x94, 0x88, 0x75, 0x72, 0x5c, 0xbe, 0xdc, - 0x08, 0xfc, 0x56, 0x2d, 0x7f, 0xa2, 0x67, 0x50, 0x93, 0x1f, 0xc2, 0xf9, 0x25, 0xdf, 0xf3, 0x68, - 0x9d, 0xad, 0x9f, 0xcb, 0xae, 0x73, 0xe0, 0xf9, 0x61, 0xe4, 0xd6, 0xd7, 0x96, 0x4b, 0xc5, 0x78, - 0x73, 0xa8, 0x2b, 0x8c, 0x5a, 0x43, 0xa1, 0x98, 0x9b, 0x43, 0x0e, 0x17, 0xf2, 0x15, 0x8c, 0x8b, - 0xba, 0x68, 0x80, 0x53, 0xf3, 0x5c, 0xe7, 0x89, 0xa6, 0x90, 0xf9, 0x36, 0x1f, 0xc8, 0x9f, 0x5c, - 0x71, 0x32, 0x79, 0x91, 0xaf, 0x61, 0x74, 0xe3, 0x5e, 0xc5, 0xa6, 0x61, 0xcb, 0xf7, 0x42, 0x5a, - 0x22, 0x38, 0xa2, 0x97, 0x05, 0xeb, 0x8d, 0x7b, 0x95, 0x4a, 0x3b, 0x3a, 0xa4, 0x5e, 0xe4, 0xd6, - 0x9d, 0x88, 0x4a, 0xac, 0xc5, 0x39, 0x36, 0xf3, 0x8e, 0x1e, 0x3b, 0xb5, 0x40, 0x40, 0xb4, 0x5e, - 0xe8, 0xec, 0xc8, 0x1c, 0x0c, 0x57, 0xab, 0xab, 0xeb, 0xfe, 0x81, 0xeb, 0x95, 0xa6, 0x98, 0x30, - 0x6c, 0xf5, 0x9b, 0xec, 0xc3, 0x8c, 0x76, 0x32, 0xa8, 0xb1, 0xff, 0xe9, 0x11, 0xf5, 0xa2, 0xd2, - 0x34, 0xb6, 0xe1, 0xbb, 0xea, 0x68, 0x73, 0x53, 0x3f, 0x40, 0x3c, 0xbd, 0x73, 0xb3, 0x12, 0xff, - 0xac, 0x4a, 0x22, 0x7b, 0xda, 0xc9, 0x80, 0x92, 0x1d, 0x18, 0xda, 0x6e, 0x07, 0x2d, 0x3f, 0xa4, - 0xa5, 0x19, 0x14, 0xda, 0xb5, 0x4e, 0x5f, 0xa7, 0x40, 0x5d, 0x9c, 0x61, 0xcb, 0x73, 0x8b, 0xff, - 0xd0, 0x7a, 0x26, 0x59, 0x59, 0x9f, 0xc3, 0x88, 0xfa, 0x98, 0xc9, 0x10, 0xf4, 0x55, 0x9a, 0xcd, - 0x62, 0x0f, 0xfb, 0xa3, 0x5a, 0x5d, 0x2d, 0x16, 0xc8, 0x04, 0x40, 0xbc, 0x82, 0x15, 0x7b, 0xc9, - 0x18, 0x0c, 0xcb, 0x15, 0xa6, 0xd8, 0x87, 0xf8, 0xad, 0x56, 0xb1, 0x9f, 0x10, 0x98, 0x30, 0xe7, - 0x79, 0x71, 0xc0, 0xfa, 0xdd, 0x02, 0x8c, 0xa8, 0xf1, 0x21, 0x93, 0x30, 0xba, 0xbb, 0x59, 0xdd, - 0x5e, 0x59, 0x5a, 0xbb, 0xb7, 0xb6, 0xb2, 0x5c, 0xec, 0x21, 0x97, 0xe0, 0xc2, 0x4e, 0x75, 0xb5, - 0xb6, 0xbc, 0x58, 0x5b, 0xdf, 0x5a, 0xaa, 0xac, 0xd7, 0xb6, 0xed, 0xad, 0xcf, 0xbf, 0xa8, 0xed, - 0xec, 0x6e, 0x6e, 0xae, 0xac, 0x17, 0x0b, 0xa4, 0x04, 0xd3, 0xac, 0xf8, 0xe1, 0xee, 0xe2, 0x8a, - 0x8e, 0x50, 0xec, 0x25, 0x57, 0xe1, 0x52, 0x56, 0x49, 0x6d, 0x75, 0xa5, 0xb2, 0xbc, 0xbe, 0x52, - 0xad, 0x16, 0xfb, 0xc8, 0x2c, 0x4c, 0x31, 0x94, 0xca, 0xf6, 0xb6, 0x41, 0xdb, 0x6f, 0x35, 0x61, - 0x54, 0x13, 0x0e, 0x99, 0x87, 0xd2, 0xd2, 0x8a, 0xbd, 0x53, 0xdb, 0xde, 0xb5, 0xb7, 0xb7, 0xaa, - 0x2b, 0x35, 0xb3, 0x85, 0xc9, 0xd2, 0xf5, 0xad, 0xfb, 0x6b, 0x9b, 0x35, 0x06, 0xaa, 0x16, 0x0b, - 0xac, 0x19, 0x46, 0x69, 0x75, 0x6d, 0xf3, 0xfe, 0xfa, 0x4a, 0x6d, 0xb7, 0xba, 0x22, 0x50, 0x7a, - 0xad, 0x9f, 0xf6, 0xa6, 0x96, 0x7a, 0xb2, 0x00, 0xa3, 0x55, 0x7e, 0x8a, 0xc5, 0xe9, 0xcf, 0x8f, - 0x0d, 0xc5, 0x93, 0xe3, 0xf2, 0x98, 0x38, 0xdc, 0xf2, 0x99, 0xad, 0x23, 0xb1, 0xdd, 0x7b, 0x9b, - 0x8d, 0x74, 0xdd, 0x6f, 0xea, 0xbb, 0x77, 0x4b, 0xc0, 0x6c, 0x55, 0x4a, 0x16, 0xb4, 0x7d, 0x9e, - 0x9f, 0x21, 0x50, 0x4f, 0x95, 0xfb, 0xbc, 0xbe, 0xe6, 0xab, 0x1d, 0x7f, 0x21, 0x1e, 0x52, 0xb1, - 0x3d, 0x23, 0x4d, 0xc6, 0x1e, 0xa3, 0xf0, 0xc8, 0x5b, 0x52, 0xff, 0xe1, 0x3a, 0x3f, 0x6e, 0x02, - 0x09, 0x6d, 0x55, 0xa8, 0x3e, 0x56, 0x3b, 0x67, 0xc1, 0x25, 0x1f, 0x25, 0xe7, 0x8c, 0x10, 0x06, - 0x32, 0x4b, 0xac, 0xab, 0x76, 0x02, 0x95, 0x94, 0x61, 0x80, 0x7f, 0x89, 0x5c, 0x1e, 0xa8, 0x71, - 0x35, 0x19, 0xc0, 0xe6, 0x70, 0xeb, 0x8f, 0xfa, 0xf4, 0xcd, 0x87, 0x69, 0x58, 0x9a, 0xbc, 0x51, - 0xc3, 0x42, 0x39, 0x23, 0x94, 0xdc, 0x84, 0x91, 0x2a, 0x0d, 0x43, 0xae, 0x05, 0xf7, 0xaa, 0x21, - 0x81, 0x90, 0x03, 0x6b, 0x6e, 0xa3, 0x54, 0xb0, 0x63, 0x14, 0x76, 0xa0, 0xe0, 0xba, 0x15, 0x1e, - 0x28, 0xfa, 0xe2, 0x03, 0x85, 0xd0, 0xbe, 0xf8, 0x81, 0x22, 0x46, 0x61, 0xa3, 0x2e, 0xb6, 0x7f, - 0x6c, 0x45, 0x7f, 0x3c, 0xea, 0x42, 0x65, 0x10, 0xa3, 0xae, 0x21, 0x91, 0x0f, 0x01, 0x2a, 0x8f, - 0xaa, 0xa8, 0x39, 0xdb, 0x9b, 0x42, 0x05, 0xc2, 0xc5, 0xca, 0x79, 0x16, 0x0a, 0xc5, 0x3c, 0xd0, - 0x4f, 0x1e, 0x1a, 0x36, 0x59, 0x84, 0xf1, 0xca, 0x4f, 0xda, 0x01, 0x5d, 0x6b, 0xb0, 0xf5, 0x2e, - 0xe2, 0x47, 0xac, 0x91, 0xc5, 0xf9, 0x93, 0xe3, 0x72, 0xc9, 0x61, 0x05, 0x35, 0x57, 0x94, 0x68, - 0x0c, 0x4c, 0x12, 0xb2, 0x05, 0xe7, 0xee, 0x2f, 0x6d, 0x8b, 0x79, 0x58, 0xa9, 0xd7, 0xfd, 0xb6, - 0x17, 0x09, 0xbd, 0xe7, 0xea, 0xc9, 0x71, 0xf9, 0xd2, 0x41, 0xbd, 0x55, 0x93, 0x73, 0xd6, 0xe1, - 0xc5, 0xba, 0xe2, 0x93, 0xa2, 0x25, 0xd7, 0xa0, 0x6f, 0xd7, 0x5e, 0x13, 0xe7, 0xaf, 0x73, 0x27, - 0xc7, 0xe5, 0xf1, 0x76, 0xe0, 0x6a, 0x24, 0xac, 0xd4, 0x6a, 0xc2, 0xc4, 0x7d, 0x1a, 0xb1, 0xc9, - 0x29, 0x35, 0xdd, 0xce, 0x43, 0xf7, 0x31, 0x8c, 0x3e, 0x72, 0xa3, 0xc3, 0x2a, 0xad, 0x07, 0x34, - 0x92, 0xa7, 0x7c, 0x14, 0xd3, 0x33, 0x37, 0x3a, 0xac, 0x85, 0x1c, 0xae, 0xaf, 0xe9, 0x1a, 0xba, - 0xb5, 0x02, 0x93, 0xa2, 0x36, 0xa5, 0x58, 0x2f, 0x98, 0x0c, 0x0b, 0xc8, 0x10, 0x87, 0x4a, 0x67, - 0x68, 0xb2, 0xf9, 0xa3, 0x5e, 0x98, 0x59, 0x3a, 0x74, 0xbc, 0x03, 0xba, 0xed, 0x84, 0xe1, 0x33, - 0x3f, 0x68, 0x68, 0x8d, 0xc7, 0x53, 0x45, 0xaa, 0xf1, 0x78, 0x8c, 0x58, 0x80, 0xd1, 0xad, 0x66, - 0x43, 0xd2, 0x88, 0x13, 0x0f, 0xd6, 0xe5, 0x37, 0x1b, 0xb5, 0x96, 0xe4, 0xa5, 0x23, 0x31, 0x9a, - 0x4d, 0xfa, 0x4c, 0xd1, 0xf4, 0xc5, 0x34, 0x1e, 0x7d, 0xa6, 0xd1, 0x68, 0x48, 0x64, 0x05, 0xce, - 0x55, 0x69, 0xdd, 0xf7, 0x1a, 0xf7, 0x9c, 0x7a, 0xe4, 0x07, 0x3b, 0xfe, 0x13, 0xea, 0x89, 0x49, - 0x88, 0x4a, 0x61, 0x88, 0x85, 0xb5, 0xc7, 0x58, 0x5a, 0x8b, 0x58, 0xb1, 0x9d, 0xa6, 0x20, 0x5b, - 0x30, 0xfc, 0x48, 0xd8, 0x8a, 0xc4, 0x31, 0xe9, 0xf5, 0x9b, 0xca, 0x78, 0xb4, 0x14, 0x50, 0x9c, - 0x39, 0x4e, 0x53, 0x1d, 0xf4, 0xd4, 0x1e, 0x8b, 0xcb, 0x95, 0xc4, 0xb4, 0x15, 0x13, 0x6b, 0x17, - 0xc6, 0xb7, 0x9b, 0xed, 0x03, 0xd7, 0x63, 0x0b, 0x4b, 0x95, 0xfe, 0x98, 0x2c, 0x03, 0xc4, 0x00, - 0x61, 0x01, 0x9a, 0x12, 0x87, 0xab, 0xb8, 0x60, 0xef, 0xae, 0xf8, 0xda, 0x10, 0x82, 0xda, 0xb0, - 0xad, 0xd1, 0x59, 0xff, 0xab, 0x0f, 0x88, 0x18, 0x00, 0xdc, 0x3e, 0xab, 0x34, 0x62, 0x5b, 0xd0, - 0x79, 0xe8, 0x55, 0x86, 0x9a, 0xc1, 0x93, 0xe3, 0x72, 0xaf, 0xdb, 0xb0, 0x7b, 0xd7, 0x96, 0xc9, - 0x3b, 0x30, 0x80, 0x68, 0x28, 0xff, 0x09, 0x55, 0x9f, 0xce, 0x81, 0x2f, 0x30, 0xb8, 0xad, 0xdb, - 0x1c, 0x99, 0xbc, 0x0b, 0x23, 0xcb, 0xb4, 0x49, 0x0f, 0x9c, 0xc8, 0x97, 0x4b, 0x00, 0x37, 0x7d, - 0x48, 0xa0, 0x36, 0xe7, 0x62, 0x4c, 0x76, 0x14, 0xb2, 0xa9, 0x13, 0xfa, 0x9e, 0x7e, 0x14, 0x0a, - 0x10, 0xa2, 0x1f, 0x85, 0x38, 0x0e, 0xf9, 0xbd, 0x02, 0x8c, 0x56, 0x3c, 0x4f, 0x98, 0x14, 0x42, - 0x21, 0xf5, 0x99, 0x9b, 0xca, 0x06, 0xb7, 0xee, 0xec, 0xd3, 0xe6, 0x9e, 0xd3, 0x6c, 0xd3, 0x70, - 0xf1, 0x6b, 0xa6, 0x9d, 0xfe, 0xc7, 0xe3, 0xf2, 0x47, 0x67, 0x30, 0x12, 0xc4, 0xd6, 0xbc, 0x9d, - 0xc0, 0x71, 0xa3, 0xf0, 0xe4, 0xb8, 0x3c, 0xe3, 0xc4, 0x15, 0xea, 0xdf, 0x8d, 0xd6, 0x8e, 0x78, - 0xfd, 0x1f, 0xec, 0xb6, 0xfe, 0x93, 0x23, 0x98, 0xac, 0x84, 0x61, 0xfb, 0x88, 0x56, 0x23, 0x27, - 0x88, 0xd8, 0xd9, 0x11, 0x17, 0x91, 0xce, 0x07, 0xcb, 0x37, 0x7f, 0x76, 0x5c, 0x2e, 0x30, 0x85, - 0xd8, 0x41, 0x52, 0xa6, 0x50, 0x05, 0x51, 0x2d, 0x72, 0xf5, 0x2d, 0x0c, 0x8f, 0x98, 0x49, 0xde, - 0xd6, 0x35, 0xa5, 0x74, 0xac, 0x2d, 0xe7, 0x8d, 0xb8, 0xb5, 0x04, 0xf3, 0xf7, 0x69, 0x64, 0xd3, - 0x90, 0x46, 0xf2, 0x1b, 0xc1, 0x19, 0x1e, 0x9b, 0xf5, 0x86, 0xf0, 0xb7, 0x22, 0xc6, 0xe1, 0xe7, - 0xdf, 0x85, 0x2c, 0xb1, 0xfe, 0x9f, 0x02, 0x94, 0x97, 0x02, 0xca, 0x75, 0xc9, 0x1c, 0x46, 0x9d, - 0xd7, 0xae, 0x79, 0xe8, 0xdf, 0x79, 0xde, 0x92, 0x27, 0x72, 0x2c, 0x65, 0x83, 0x62, 0x23, 0xf4, - 0x94, 0xe6, 0x0d, 0xeb, 0x31, 0xcc, 0xd8, 0xd4, 0xa3, 0xcf, 0x9c, 0xfd, 0x26, 0x35, 0x2c, 0x04, - 0x65, 0x18, 0xe0, 0x1f, 0x7a, 0xaa, 0x0b, 0x1c, 0x7e, 0x36, 0x6b, 0x8b, 0x35, 0x0e, 0xa3, 0xdb, - 0xae, 0x77, 0x20, 0xb8, 0x5b, 0xff, 0x7f, 0x3f, 0x8c, 0xf1, 0xdf, 0x42, 0x3d, 0x4e, 0x6c, 0x71, - 0x85, 0xd3, 0x6c, 0x71, 0xef, 0xc3, 0x38, 0xdb, 0x23, 0x68, 0xb0, 0x47, 0x03, 0xb6, 0xb5, 0x0a, - 0x49, 0xa0, 0xaa, 0x1f, 0x62, 0x41, 0xed, 0x29, 0x2f, 0xb1, 0x4d, 0x44, 0xb2, 0x0e, 0x13, 0x1c, - 0x70, 0x8f, 0x3a, 0x51, 0x3b, 0xb6, 0x56, 0x4c, 0x0a, 0x9d, 0x58, 0x82, 0xf9, 0xd4, 0x14, 0xbc, - 0x1e, 0x0b, 0xa0, 0x9d, 0xa0, 0x25, 0x9f, 0xc2, 0xe4, 0x76, 0xe0, 0x7f, 0xf3, 0x5c, 0xdb, 0xd4, - 0xf9, 0xd7, 0xc9, 0xb5, 0x67, 0x56, 0x54, 0xd3, 0xb7, 0xf6, 0x24, 0x36, 0x79, 0x0b, 0x86, 0xd7, - 0xc2, 0x45, 0x3f, 0x70, 0xbd, 0x03, 0xfc, 0x46, 0x87, 0xb9, 0x89, 0xd7, 0x0d, 0x6b, 0xfb, 0x08, - 0xb4, 0x55, 0x71, 0xc2, 0x18, 0x39, 0xd4, 0xdd, 0x18, 0x79, 0x1b, 0x60, 0xdd, 0x77, 0x1a, 0x95, - 0x66, 0x73, 0xa9, 0x12, 0xe2, 0xee, 0x29, 0xf6, 0xa3, 0xa6, 0xef, 0x34, 0x6a, 0x4e, 0xb3, 0x59, - 0xab, 0x3b, 0xa1, 0xad, 0xe1, 0x90, 0x47, 0x30, 0xbe, 0xee, 0xd6, 0xa9, 0x17, 0x52, 0x34, 0xc0, - 0x3c, 0xc7, 0xd3, 0x7c, 0xe7, 0x0f, 0x8e, 0x75, 0x74, 0xbc, 0xa9, 0x13, 0xe1, 0xe7, 0x65, 0xf2, - 0x79, 0xd0, 0x3f, 0x3c, 0x58, 0x1c, 0xb2, 0x27, 0x05, 0xf0, 0x91, 0x13, 0x78, 0xae, 0x77, 0x10, - 0x5a, 0xff, 0xf4, 0x1c, 0x0c, 0x2b, 0x59, 0xde, 0xd4, 0x4f, 0x0c, 0x62, 0xfb, 0xc4, 0x69, 0x15, - 0xdb, 0x49, 0x6c, 0x0d, 0x83, 0x5c, 0xc0, 0x33, 0x84, 0xd8, 0xb8, 0x87, 0xd8, 0x34, 0x77, 0x5a, - 0x2d, 0x9b, 0xc1, 0xd8, 0xe7, 0xbb, 0xbc, 0x88, 0x03, 0x3b, 0xcc, 0x3f, 0xdf, 0xc6, 0xbe, 0xdd, - 0xbb, 0xbc, 0xc8, 0xbe, 0x9b, 0xad, 0xb5, 0xe5, 0x25, 0x1c, 0xa3, 0x61, 0xfe, 0xdd, 0xf8, 0x6e, - 0xa3, 0x6e, 0x23, 0x94, 0x95, 0x56, 0x2b, 0x1b, 0xeb, 0x62, 0x1c, 0xb0, 0x34, 0x74, 0x8e, 0x9a, - 0x36, 0x42, 0x99, 0xd6, 0xc9, 0x8f, 0xbc, 0x4b, 0xbe, 0x17, 0x05, 0x7e, 0x33, 0x44, 0xd5, 0x68, - 0x98, 0xcf, 0x13, 0x71, 0x56, 0xae, 0x8b, 0x22, 0x3b, 0x81, 0x4a, 0x1e, 0xc1, 0x6c, 0xa5, 0xf1, - 0xd4, 0xf1, 0xea, 0xb4, 0xc1, 0x4b, 0x1e, 0xf9, 0xc1, 0x93, 0xc7, 0x4d, 0xff, 0x59, 0x88, 0x03, - 0x39, 0x2c, 0x4c, 0x4b, 0x02, 0x45, 0x1e, 0xbd, 0x9f, 0x49, 0x24, 0x3b, 0x8f, 0x9a, 0x7d, 0xab, - 0x4b, 0x4d, 0xbf, 0xdd, 0x10, 0xc3, 0x8b, 0xdf, 0x6a, 0x9d, 0x01, 0x6c, 0x0e, 0x67, 0x52, 0x5a, - 0xad, 0x6e, 0xa0, 0x21, 0x47, 0x48, 0xe9, 0x30, 0x3c, 0xb2, 0x19, 0x8c, 0xbc, 0x0e, 0x43, 0x52, - 0x81, 0xe6, 0x76, 0x66, 0xb4, 0x6f, 0x4a, 0xc5, 0x59, 0x96, 0xb1, 0x6f, 0xcd, 0xa6, 0x75, 0xff, - 0x29, 0x0d, 0x9e, 0x2f, 0xf9, 0x0d, 0x2a, 0xcd, 0x0e, 0xe2, 0x58, 0xcd, 0x0b, 0x6a, 0x75, 0x56, - 0x62, 0x9b, 0x88, 0xac, 0x02, 0xbe, 0xb9, 0x86, 0xa5, 0xc9, 0xb8, 0x02, 0xbe, 0xf9, 0x86, 0xb6, - 0x2c, 0x23, 0xcb, 0x70, 0xae, 0xd2, 0x8e, 0xfc, 0x23, 0x27, 0x72, 0xeb, 0xbb, 0xad, 0x83, 0xc0, - 0x61, 0x95, 0x14, 0x91, 0x00, 0x0f, 0x14, 0x8e, 0x2c, 0xac, 0xb5, 0x45, 0xa9, 0x9d, 0x26, 0x20, - 0xef, 0xc1, 0xd8, 0x5a, 0xc8, 0x4d, 0x4b, 0x4e, 0x48, 0x1b, 0x68, 0x1f, 0x10, 0xad, 0x74, 0xc3, - 0x1a, 0x1a, 0x9a, 0x6a, 0xec, 0x08, 0xd2, 0xb0, 0x0d, 0x3c, 0x62, 0xc1, 0x60, 0x25, 0x0c, 0xdd, - 0x30, 0xc2, 0x63, 0xff, 0xf0, 0x22, 0x9c, 0x1c, 0x97, 0x07, 0x1d, 0x84, 0xd8, 0xa2, 0x84, 0x3c, - 0x82, 0xd1, 0x65, 0xca, 0x34, 0xd2, 0x9d, 0xa0, 0x1d, 0x46, 0x78, 0x88, 0x1f, 0x5d, 0xb8, 0x20, - 0x56, 0x0c, 0xad, 0x44, 0xcc, 0x65, 0xae, 0x46, 0x36, 0x10, 0x5e, 0x8b, 0x58, 0x81, 0xbe, 0x1d, - 0x6a, 0xf8, 0x4c, 0xdd, 0x16, 0x34, 0xab, 0x6e, 0x83, 0xad, 0x01, 0xd3, 0xd8, 0x06, 0x54, 0xb7, - 0xc5, 0xa2, 0x53, 0x3b, 0xc4, 0x12, 0x5d, 0xdd, 0x36, 0x48, 0x48, 0x3d, 0x65, 0xad, 0x9c, 0x31, - 0x2c, 0x52, 0x66, 0xa1, 0x6c, 0xe2, 0x19, 0x6d, 0x99, 0x1f, 0xc3, 0xe8, 0x52, 0x3b, 0x8c, 0xfc, - 0xa3, 0x9d, 0x43, 0x7a, 0x44, 0x4b, 0xe7, 0xe3, 0x43, 0x45, 0x1d, 0xc1, 0xb5, 0x88, 0xc1, 0xf5, - 0x6e, 0x6a, 0xe8, 0xe4, 0x33, 0x20, 0xf2, 0x74, 0x70, 0x9f, 0xcd, 0x0f, 0x8f, 0xcd, 0xe5, 0xd2, - 0x2c, 0xf6, 0x15, 0x8f, 0x04, 0xf2, 0x50, 0x51, 0x3b, 0x50, 0xc5, 0xba, 0xbd, 0x29, 0x4d, 0xcc, - 0x1a, 0xc4, 0x9b, 0x78, 0x3f, 0x70, 0x5a, 0x87, 0xa5, 0x52, 0xac, 0xbe, 0x8b, 0x4e, 0x1d, 0x30, - 0xb8, 0xa1, 0x86, 0xc4, 0xe8, 0xa4, 0x0a, 0xc0, 0x7f, 0xae, 0xb3, 0x81, 0xbf, 0x80, 0xf2, 0x2a, - 0x19, 0xf2, 0x62, 0x05, 0x52, 0x56, 0x17, 0x50, 0xb9, 0xe1, 0x6c, 0x9b, 0xae, 0x31, 0x9a, 0x1a, - 0x1b, 0xf2, 0x04, 0x8a, 0xfc, 0xd7, 0x86, 0xef, 0xb9, 0x11, 0x5f, 0xd3, 0xe7, 0x0c, 0x53, 0x52, - 0xb2, 0x58, 0x56, 0x80, 0x26, 0x3c, 0x51, 0xc1, 0x91, 0x2a, 0xd5, 0xaa, 0x49, 0x31, 0x26, 0xdb, - 0x30, 0xba, 0x1d, 0xf8, 0x8d, 0x76, 0x3d, 0x42, 0x4d, 0xe0, 0x22, 0x6a, 0xa0, 0x44, 0xd4, 0xa3, - 0x95, 0x70, 0x99, 0xb4, 0x38, 0xa0, 0xc6, 0xb4, 0x04, 0x5d, 0x26, 0x1a, 0x22, 0x59, 0x84, 0xc1, - 0x6d, 0xbf, 0xe9, 0xd6, 0x9f, 0x97, 0xe6, 0xb1, 0xd1, 0xd3, 0x92, 0x19, 0x02, 0x65, 0x53, 0x51, - 0xed, 0x6c, 0x21, 0x48, 0x57, 0x3b, 0x39, 0x12, 0xa9, 0xc0, 0xf8, 0x67, 0x6c, 0xc2, 0xb8, 0xbe, - 0xe7, 0x39, 0x6e, 0x40, 0x4b, 0x97, 0x70, 0x5c, 0xd0, 0xcc, 0xfa, 0x63, 0xbd, 0x40, 0x9f, 0xce, - 0x06, 0x05, 0x59, 0x83, 0xc9, 0xb5, 0xb0, 0x1a, 0x05, 0x6e, 0x8b, 0x6e, 0x38, 0x9e, 0x73, 0x40, - 0x1b, 0xa5, 0xcb, 0xb1, 0x9d, 0xd3, 0x0d, 0x6b, 0x21, 0x96, 0xd5, 0x8e, 0x78, 0xa1, 0x6e, 0xe7, - 0x4c, 0xd0, 0x91, 0xcf, 0x61, 0x7a, 0xe5, 0x9b, 0x88, 0xcd, 0x98, 0x66, 0xa5, 0xdd, 0x70, 0xa3, - 0x6a, 0xe4, 0x07, 0xce, 0x01, 0x2d, 0x95, 0x91, 0xdf, 0x6b, 0x27, 0xc7, 0xe5, 0x2b, 0x54, 0x94, - 0xd7, 0x1c, 0x86, 0x50, 0x0b, 0x39, 0x86, 0x7e, 0x7b, 0x99, 0xc5, 0x81, 0x49, 0xbf, 0xda, 0x6e, - 0x31, 0x8d, 0x18, 0xa5, 0x7f, 0xc5, 0x90, 0xbe, 0x56, 0xc2, 0xa5, 0x1f, 0x72, 0x40, 0x4a, 0xfa, - 0x1a, 0x22, 0xb1, 0x81, 0x3c, 0xf0, 0x5d, 0xaf, 0x52, 0x8f, 0xdc, 0xa7, 0x54, 0x18, 0x0c, 0xc2, - 0xd2, 0x55, 0x6c, 0x29, 0xda, 0x64, 0x7f, 0xd5, 0x77, 0xbd, 0x9a, 0x83, 0xc5, 0x35, 0x61, 0x5e, - 0x30, 0x6c, 0xb2, 0x69, 0x6a, 0xf2, 0x43, 0x38, 0xbf, 0xe1, 0xef, 0xbb, 0x4d, 0xca, 0x97, 0x1c, - 0x2e, 0x16, 0xb4, 0x2e, 0x5a, 0xc8, 0x17, 0x6d, 0xb2, 0x47, 0x88, 0x51, 0x13, 0xab, 0xd5, 0x91, - 0xc2, 0xd1, 0x6d, 0xb2, 0xd9, 0x5c, 0xc8, 0x0a, 0x8c, 0xe1, 0x77, 0xd9, 0xc4, 0x9f, 0x61, 0xe9, - 0x1a, 0x1e, 0xbb, 0xae, 0x26, 0x34, 0xa9, 0x9b, 0x2b, 0x1a, 0xce, 0x8a, 0x17, 0x05, 0xcf, 0x6d, - 0x83, 0x8c, 0x7c, 0x02, 0x73, 0xc9, 0xe9, 0xbd, 0xe4, 0x7b, 0x8f, 0xdd, 0x83, 0x76, 0x40, 0x1b, - 0xa5, 0xd7, 0x58, 0x53, 0xed, 0x0e, 0x18, 0x73, 0x8f, 0xe0, 0x5c, 0xaa, 0x0a, 0x52, 0x84, 0xbe, - 0x27, 0xe2, 0x82, 0x6b, 0xc4, 0x66, 0x7f, 0x92, 0xb7, 0x61, 0xe0, 0x29, 0x3b, 0xef, 0xa0, 0xc6, - 0x10, 0x5f, 0x9a, 0x68, 0xa4, 0x6b, 0xde, 0x63, 0xdf, 0xe6, 0x48, 0x1f, 0xf6, 0xbe, 0x5f, 0x78, - 0xd0, 0x3f, 0x3c, 0x5a, 0x1c, 0xe3, 0xf7, 0x92, 0x0f, 0xfa, 0x87, 0xc7, 0x8b, 0x13, 0x56, 0x05, - 0x26, 0x13, 0xf8, 0xa4, 0x04, 0x43, 0xd4, 0x63, 0x3a, 0x74, 0x83, 0xeb, 0x2c, 0xb6, 0xfc, 0x49, - 0xa6, 0x61, 0xa0, 0xe9, 0x1e, 0xb9, 0x11, 0x56, 0x38, 0x60, 0xf3, 0x1f, 0xd6, 0xef, 0x17, 0x80, - 0xa4, 0xb7, 0x0c, 0x72, 0x2b, 0xc1, 0x86, 0x6b, 0x90, 0x02, 0xa4, 0xdb, 0x5f, 0x25, 0xf7, 0xcf, - 0x60, 0x8a, 0x8f, 0x99, 0xdc, 0xdc, 0xb4, 0xba, 0xf8, 0xa2, 0x9a, 0x51, 0xac, 0xdb, 0x59, 0x44, - 0x31, 0x6e, 0x85, 0xeb, 0xd8, 0xb4, 0x36, 0xcc, 0x64, 0x6e, 0x16, 0x64, 0x03, 0x66, 0x8e, 0x7c, - 0x2f, 0x3a, 0x6c, 0x3e, 0x97, 0x7b, 0x85, 0xa8, 0xad, 0x80, 0xb5, 0xe1, 0xfa, 0x98, 0x89, 0x60, - 0x4f, 0x09, 0xb0, 0xe0, 0x88, 0xf5, 0x3c, 0xe8, 0x1f, 0xee, 0x2d, 0xf6, 0xa9, 0x9e, 0x58, 0x36, - 0x9c, 0x4b, 0xad, 0xb9, 0xe4, 0xfb, 0x30, 0x56, 0xc7, 0x33, 0x92, 0x51, 0x13, 0xdf, 0x71, 0x34, - 0xb8, 0xfe, 0x39, 0x71, 0x38, 0xef, 0xca, 0x3f, 0x2a, 0xc0, 0x6c, 0xce, 0x6a, 0x7b, 0x76, 0x51, - 0x7f, 0x01, 0xe7, 0x8f, 0x9c, 0x6f, 0x6a, 0x01, 0x1e, 0x81, 0x6b, 0x81, 0xe3, 0x25, 0xa4, 0x8d, - 0x2b, 0x49, 0x36, 0x86, 0xee, 0x1c, 0x72, 0xe4, 0x7c, 0x63, 0x23, 0x82, 0xcd, 0xca, 0x79, 0x3b, - 0x7f, 0x00, 0xe3, 0xc6, 0xfa, 0x7a, 0xe6, 0xc6, 0x59, 0x77, 0xe0, 0xdc, 0x32, 0x6d, 0xd2, 0x88, - 0x9e, 0xda, 0xf4, 0x65, 0x6d, 0x03, 0x54, 0xe9, 0x91, 0xd3, 0x3a, 0xf4, 0x99, 0xde, 0xbd, 0xa8, - 0xff, 0x12, 0xa6, 0x13, 0x22, 0x4c, 0x19, 0xaa, 0x60, 0xef, 0x2e, 0xd7, 0xc5, 0x43, 0x85, 0x69, - 0x6b, 0x54, 0xd6, 0x9f, 0xf6, 0x02, 0x11, 0x0b, 0x64, 0x40, 0x9d, 0x23, 0xd9, 0x8c, 0x0f, 0x60, - 0x8c, 0x1f, 0x74, 0x39, 0x18, 0x9b, 0x33, 0xba, 0x30, 0x25, 0xbe, 0x3c, 0xbd, 0x68, 0xb5, 0xc7, - 0x36, 0x50, 0x19, 0xa9, 0x4d, 0xf9, 0x09, 0x1d, 0x49, 0x7b, 0x0d, 0x52, 0xbd, 0x88, 0x91, 0xea, - 0xbf, 0xc9, 0xa7, 0x30, 0xb1, 0xe4, 0x1f, 0xb5, 0x98, 0x4c, 0x04, 0x71, 0x9f, 0xb0, 0x7e, 0x88, - 0x7a, 0x8d, 0xc2, 0xd5, 0x1e, 0x3b, 0x81, 0x4e, 0x36, 0x61, 0xea, 0x5e, 0xb3, 0x1d, 0x1e, 0x56, - 0xbc, 0xc6, 0x52, 0xd3, 0x0f, 0x25, 0x97, 0x7e, 0x71, 0x18, 0x12, 0xcb, 0x5b, 0x1a, 0x63, 0xb5, - 0xc7, 0xce, 0x22, 0x24, 0xaf, 0xc3, 0xc0, 0xca, 0x53, 0xb6, 0xec, 0x4a, 0x17, 0x01, 0xe1, 0xc1, - 0xb4, 0xe5, 0xd1, 0xad, 0xc7, 0xab, 0x3d, 0x36, 0x2f, 0x5d, 0x1c, 0x81, 0x21, 0x79, 0x48, 0xbe, - 0xc5, 0x54, 0x62, 0x25, 0xce, 0x6a, 0xe4, 0x44, 0xed, 0x90, 0xcc, 0xc1, 0xf0, 0x6e, 0x8b, 0x9d, - 0xdd, 0xa4, 0x75, 0xc1, 0x56, 0xbf, 0xad, 0xb7, 0x4d, 0x49, 0x93, 0x79, 0xdd, 0x30, 0xcd, 0x91, - 0x63, 0x80, 0xb5, 0x6a, 0x0a, 0xb7, 0x33, 0xb6, 0x51, 0x6f, 0x6f, 0xa2, 0xde, 0x62, 0x52, 0xd6, - 0xd6, 0x4c, 0xa6, 0xf0, 0xac, 0xcf, 0xe1, 0xf2, 0x6e, 0x2b, 0xa4, 0x41, 0x54, 0x69, 0xb5, 0x9a, - 0x6e, 0x9d, 0x5f, 0x51, 0xe1, 0x61, 0x5a, 0x4e, 0x96, 0xf7, 0x60, 0x90, 0x03, 0xc4, 0x34, 0x91, - 0x73, 0xb0, 0xd2, 0x6a, 0x89, 0x23, 0xfc, 0x5d, 0xae, 0x9c, 0xf3, 0x43, 0xb9, 0x2d, 0xb0, 0xad, - 0xdf, 0x29, 0xc0, 0x65, 0xfe, 0x05, 0xe4, 0xb2, 0xfe, 0x0e, 0x8c, 0xa0, 0x03, 0x51, 0xcb, 0xa9, - 0xcb, 0x6f, 0x82, 0x7b, 0x52, 0x49, 0xa0, 0x1d, 0x97, 0x6b, 0xae, 0x59, 0xbd, 0xf9, 0xae, 0x59, - 0xf2, 0x03, 0xeb, 0xcb, 0xfc, 0xc0, 0x3e, 0x03, 0x4b, 0xb4, 0xa8, 0xd9, 0x4c, 0x35, 0x2a, 0x7c, - 0x91, 0x56, 0x59, 0xff, 0xad, 0x17, 0x66, 0xef, 0x53, 0x8f, 0x06, 0x0e, 0xf6, 0xd3, 0x30, 0x16, - 0xe9, 0x4e, 0x1a, 0x85, 0x8e, 0x4e, 0x1a, 0x65, 0x69, 0x7e, 0xeb, 0x45, 0xf3, 0x5b, 0xca, 0xdf, - 0x84, 0x1d, 0x17, 0x77, 0xed, 0x35, 0xd1, 0x2d, 0x3c, 0x2e, 0xb6, 0x03, 0x17, 0x0d, 0xec, 0x64, - 0x2d, 0x76, 0xf0, 0xe8, 0xef, 0x6a, 0x16, 0x98, 0x12, 0x17, 0xde, 0x43, 0xc2, 0xc1, 0xc3, 0x74, - 0xeb, 0xd8, 0x84, 0x41, 0x6e, 0x35, 0xc4, 0x6b, 0xa0, 0xd1, 0x85, 0x1b, 0xe2, 0x9b, 0xca, 0xe9, - 0xa0, 0x30, 0x31, 0xe2, 0xc6, 0xce, 0xa7, 0x40, 0x84, 0x00, 0x5b, 0x70, 0x99, 0xfb, 0x0c, 0x46, - 0x35, 0x94, 0xd3, 0xec, 0xfd, 0xca, 0x7a, 0xc9, 0x34, 0x46, 0xef, 0x80, 0x1b, 0x42, 0xb5, 0xbd, - 0xdf, 0xfa, 0x08, 0x4a, 0xe9, 0xd6, 0x08, 0x8b, 0x55, 0x37, 0x03, 0x99, 0xb5, 0x0c, 0xd3, 0xf7, - 0x69, 0x84, 0x13, 0x17, 0x3f, 0x22, 0xcd, 0xf7, 0x26, 0xf1, 0x9d, 0xc9, 0x55, 0x55, 0x5e, 0x17, - 0xe9, 0x5f, 0x69, 0x15, 0x66, 0x12, 0x5c, 0x44, 0xfd, 0x1f, 0xc2, 0x90, 0x00, 0xa9, 0x15, 0x55, - 0xf8, 0x3a, 0xd2, 0x7d, 0x51, 0xb0, 0xb7, 0xc0, 0xe7, 0xad, 0xe0, 0x6c, 0x4b, 0x02, 0xeb, 0x10, - 0xce, 0xb3, 0x6d, 0x36, 0xe6, 0xaa, 0xa6, 0xe3, 0x45, 0x18, 0x69, 0x31, 0x45, 0x21, 0x74, 0x7f, - 0xc2, 0xa7, 0xd1, 0x80, 0x3d, 0xcc, 0x00, 0x55, 0xf7, 0x27, 0x94, 0x5c, 0x02, 0xc0, 0x42, 0xec, - 0xa6, 0x58, 0x05, 0x10, 0x9d, 0x5b, 0x04, 0x09, 0xa0, 0x93, 0x13, 0x9f, 0x37, 0x36, 0xfe, 0x6d, - 0x05, 0x30, 0x9b, 0xaa, 0x49, 0x74, 0xe0, 0x16, 0x0c, 0x4b, 0x15, 0x36, 0x61, 0xab, 0xd7, 0x7b, - 0x60, 0x2b, 0x24, 0xf2, 0x06, 0x4c, 0x7a, 0xf4, 0x9b, 0xa8, 0x96, 0x6a, 0xc3, 0x38, 0x03, 0x6f, - 0xcb, 0x76, 0x58, 0xbf, 0x82, 0xf6, 0xd9, 0xaa, 0xe7, 0x3f, 0x7b, 0xdc, 0x74, 0x9e, 0xd0, 0x54, - 0xc5, 0xdf, 0x87, 0xe1, 0x6a, 0xf7, 0x8a, 0xf9, 0xe7, 0x23, 0x2b, 0xb7, 0x15, 0x89, 0xd5, 0x84, - 0x39, 0xd6, 0xa5, 0x6a, 0x65, 0x63, 0x7d, 0xad, 0xb1, 0xfd, 0x6d, 0x0b, 0xf0, 0x29, 0x5c, 0xcc, - 0xac, 0xed, 0xdb, 0x16, 0xe2, 0xbf, 0xec, 0x87, 0x59, 0xbe, 0x99, 0xa4, 0x67, 0xf0, 0xe9, 0x97, - 0x9a, 0x5f, 0xca, 0x55, 0xe7, 0xed, 0x8c, 0xab, 0x4e, 0x24, 0xd1, 0xaf, 0x3a, 0x8d, 0x0b, 0xce, - 0xf7, 0xb3, 0x2f, 0x38, 0xd1, 0x4e, 0x64, 0x5e, 0x70, 0x26, 0xaf, 0x35, 0x57, 0xf2, 0xaf, 0x35, - 0xf1, 0xfe, 0x26, 0xe3, 0x5a, 0x33, 0xeb, 0x32, 0x33, 0xe1, 0x6b, 0x32, 0xfc, 0x6a, 0x7d, 0x4d, - 0xde, 0x80, 0xa1, 0x4a, 0xab, 0xa5, 0xf9, 0x6e, 0xe1, 0xf0, 0x38, 0xad, 0x16, 0x17, 0x9e, 0x2c, - 0x94, 0xeb, 0x3c, 0x64, 0xac, 0xf3, 0x1f, 0x00, 0x2c, 0xa1, 0x7f, 0x39, 0x0e, 0xdc, 0x28, 0x62, - 0xa0, 0x86, 0xcf, 0xbd, 0xce, 0x71, 0xe0, 0x74, 0x0b, 0x48, 0x8c, 0xcc, 0x15, 0x7b, 0x6b, 0x0f, - 0x4a, 0xe9, 0xe9, 0xf3, 0x0a, 0x96, 0xae, 0x3f, 0x2e, 0xc0, 0x25, 0xa1, 0xe4, 0x24, 0x3e, 0xf0, - 0xb3, 0xcf, 0xce, 0x77, 0x61, 0x4c, 0xd0, 0xee, 0xc4, 0x1f, 0x02, 0xbf, 0x5b, 0x96, 0x8b, 0x31, - 0x5f, 0xd1, 0x0d, 0x34, 0xf2, 0x2e, 0x0c, 0xe3, 0x1f, 0xf1, 0xfd, 0x0a, 0x93, 0xcc, 0x08, 0xa2, - 0xd6, 0x92, 0xb7, 0x2c, 0x0a, 0xd5, 0xfa, 0x1a, 0x2e, 0xe7, 0x35, 0xfc, 0x15, 0xc8, 0xe5, 0x5f, - 0x15, 0xe0, 0xa2, 0x60, 0x6f, 0x2c, 0x15, 0x2f, 0xb4, 0xeb, 0x9c, 0xc1, 0xe3, 0xf3, 0x01, 0x8c, - 0xb2, 0x0a, 0x65, 0xbb, 0xfb, 0xc4, 0xd6, 0x2a, 0x4e, 0x0e, 0x71, 0xc9, 0xb2, 0x13, 0x39, 0xc2, - 0x53, 0xc5, 0x39, 0x6a, 0x4a, 0xe3, 0x85, 0xad, 0x13, 0x5b, 0x5f, 0xc2, 0x7c, 0x76, 0x17, 0x5e, - 0x81, 0x7c, 0x1e, 0xc0, 0x5c, 0xc6, 0xa6, 0xf0, 0x62, 0x7b, 0xf2, 0x17, 0x70, 0x31, 0x93, 0xd7, - 0x2b, 0x68, 0xe6, 0x2a, 0xd3, 0x38, 0xa2, 0x57, 0x30, 0x84, 0xd6, 0x23, 0xb8, 0x90, 0xc1, 0xe9, - 0x15, 0x34, 0xf1, 0x3e, 0xcc, 0x2a, 0x4d, 0xfb, 0xa5, 0x5a, 0xb8, 0x01, 0x97, 0x38, 0xa3, 0x57, - 0x33, 0x2a, 0x0f, 0xe1, 0xa2, 0x60, 0xf7, 0x0a, 0xa4, 0xb7, 0x0a, 0xf3, 0xf1, 0x81, 0x3a, 0x43, - 0x4f, 0x3a, 0xf5, 0x22, 0x63, 0xad, 0xc3, 0x95, 0x98, 0x53, 0x8e, 0xd2, 0x70, 0x7a, 0x6e, 0x5c, - 0x1d, 0x8c, 0x47, 0xe9, 0x95, 0x8c, 0xe8, 0x23, 0x38, 0x6f, 0x30, 0x7d, 0x65, 0xaa, 0xd2, 0x1a, - 0x4c, 0x71, 0xc6, 0xa6, 0xea, 0xbc, 0xa0, 0xab, 0xce, 0xa3, 0x0b, 0xe7, 0x62, 0x96, 0x08, 0xde, - 0xbb, 0x9b, 0xa1, 0x4d, 0x6f, 0xa0, 0x36, 0x2d, 0x51, 0xe2, 0x16, 0xbe, 0x0b, 0x83, 0x1c, 0x22, - 0xda, 0x97, 0xc1, 0x8c, 0x1f, 0x16, 0x38, 0x99, 0x40, 0xb6, 0x7e, 0x08, 0x97, 0xf8, 0x49, 0x34, - 0xbe, 0x4b, 0x34, 0x4f, 0x8b, 0xdf, 0x4f, 0x1c, 0x44, 0x2f, 0x08, 0xbe, 0x49, 0xfc, 0x9c, 0xf3, - 0xe8, 0xbe, 0x9c, 0xdb, 0x79, 0xfc, 0x4f, 0xf5, 0xf6, 0x47, 0x1e, 0x30, 0x7b, 0x33, 0x0f, 0x98, - 0xd7, 0xe0, 0xaa, 0x3a, 0x60, 0x26, 0xab, 0x91, 0x53, 0xcb, 0xfa, 0x12, 0x2e, 0xf2, 0x8e, 0x4a, - 0xef, 0x3b, 0xb3, 0x19, 0x1f, 0x25, 0xba, 0x39, 0x2b, 0xba, 0x69, 0x62, 0xe7, 0x74, 0xf2, 0x6f, - 0x15, 0xe4, 0x27, 0x97, 0xcd, 0xfc, 0x97, 0x7d, 0xe2, 0xde, 0x84, 0xb2, 0x12, 0x88, 0xd9, 0xa2, - 0x17, 0x3b, 0x6e, 0x6f, 0xc0, 0x8c, 0xce, 0xc6, 0xad, 0xd3, 0xbd, 0x3b, 0x78, 0xc9, 0xf3, 0x0e, - 0xfb, 0x2c, 0x10, 0x20, 0xa7, 0x5d, 0x29, 0x43, 0x6e, 0x88, 0x6f, 0x2b, 0x4c, 0xab, 0x06, 0xf3, - 0xe9, 0xa1, 0x70, 0xeb, 0xd2, 0x25, 0x9b, 0x7c, 0xca, 0x3e, 0x61, 0x84, 0x88, 0xc1, 0xc8, 0x65, - 0x2a, 0xbf, 0x63, 0x4e, 0x2e, 0xa9, 0x2c, 0x4b, 0x2e, 0x35, 0x89, 0xfe, 0xb3, 0xda, 0xe5, 0x7c, - 0xf8, 0x75, 0x20, 0xb2, 0x68, 0xa9, 0x6a, 0xcb, 0xaa, 0x2f, 0x40, 0xdf, 0x52, 0xd5, 0x16, 0x2f, - 0x41, 0x50, 0x13, 0xac, 0x87, 0x81, 0xcd, 0x60, 0x49, 0x8d, 0xbc, 0xf7, 0x14, 0x1a, 0xf9, 0x83, - 0xfe, 0xe1, 0xbe, 0x62, 0xbf, 0x4d, 0xaa, 0xee, 0x81, 0xf7, 0xc8, 0x8d, 0x0e, 0x55, 0x85, 0x15, - 0xeb, 0x2b, 0x98, 0x32, 0xaa, 0x17, 0x5f, 0x71, 0xc7, 0x27, 0x2c, 0x4c, 0x9f, 0x5d, 0xaa, 0xa0, - 0x77, 0x0a, 0x9a, 0x2c, 0xc6, 0xf8, 0x7a, 0x53, 0x77, 0x6a, 0xf8, 0x3e, 0xd2, 0x96, 0x85, 0xd6, - 0x3f, 0xec, 0xd7, 0xb8, 0x6b, 0x0f, 0x83, 0x3a, 0xf4, 0xee, 0x0e, 0x00, 0x9f, 0x21, 0x5a, 0xe7, - 0x98, 0x02, 0x38, 0x2a, 0x9c, 0x3e, 0xf8, 0x92, 0x6c, 0x6b, 0x48, 0xa7, 0x7d, 0x38, 0x24, 0x5c, - 0x75, 0x39, 0x91, 0x7c, 0x2b, 0xa7, 0x5c, 0x75, 0x05, 0xeb, 0xd0, 0xd6, 0x91, 0xc8, 0x0f, 0x93, - 0xfe, 0xed, 0x03, 0x78, 0xa7, 0xf4, 0x9a, 0xbc, 0x64, 0x4e, 0xf7, 0xed, 0x6c, 0x2e, 0xee, 0xcf, - 0x60, 0x86, 0xd1, 0xba, 0x8f, 0xf1, 0x60, 0xb1, 0xf2, 0x4d, 0x44, 0x3d, 0xbe, 0xb6, 0x0f, 0x62, - 0x3d, 0xaf, 0x77, 0xa8, 0x27, 0x46, 0x16, 0xf6, 0xf7, 0x98, 0x4f, 0x8d, 0xaa, 0x32, 0x3b, 0x9b, - 0x3f, 0x4e, 0x22, 0x7b, 0x7d, 0xc5, 0x6b, 0xb4, 0x7c, 0x57, 0x1d, 0x98, 0xf8, 0x24, 0x0a, 0x9a, - 0x35, 0x2a, 0xe0, 0xb6, 0x8e, 0x64, 0xbd, 0xd1, 0xd1, 0x01, 0x7c, 0x18, 0xfa, 0x77, 0x96, 0x76, - 0xd6, 0x8b, 0x05, 0xeb, 0x16, 0x80, 0x56, 0x13, 0xc0, 0xe0, 0xe6, 0x96, 0xbd, 0x51, 0x59, 0x2f, - 0xf6, 0x90, 0x19, 0x38, 0xf7, 0x68, 0x6d, 0x73, 0x79, 0xeb, 0x51, 0xb5, 0x56, 0xdd, 0xa8, 0xd8, - 0x3b, 0x4b, 0x15, 0x7b, 0xb9, 0x58, 0xb0, 0xbe, 0x86, 0x69, 0xb3, 0x87, 0xaf, 0x74, 0x12, 0x46, - 0x30, 0xa5, 0xf4, 0x99, 0x07, 0x8f, 0x76, 0x34, 0xc7, 0x50, 0x71, 0xf8, 0x4b, 0x3a, 0x38, 0x89, - 0x63, 0xa2, 0xf8, 0x8c, 0x34, 0x24, 0xf2, 0x16, 0x57, 0x0b, 0x92, 0x4f, 0x3f, 0x99, 0x5a, 0x50, - 0x8b, 0xf5, 0x02, 0x5c, 0xfa, 0xbe, 0x07, 0xd3, 0x66, 0xad, 0xa7, 0xb5, 0x52, 0xbd, 0x86, 0x1e, - 0xb3, 0xda, 0xcb, 0x10, 0x42, 0xf4, 0x6b, 0x03, 0xb1, 0xb2, 0x7e, 0x0f, 0x8a, 0x02, 0x2b, 0xde, - 0x79, 0xaf, 0x49, 0x33, 0x62, 0x21, 0xe3, 0x15, 0x9b, 0xf4, 0xdf, 0xf6, 0xa1, 0xc8, 0x56, 0x4c, - 0x41, 0xc9, 0x2b, 0x98, 0x86, 0x81, 0xf5, 0xf8, 0x3a, 0xc7, 0xe6, 0x3f, 0xf0, 0x81, 0x44, 0xe4, - 0x04, 0x91, 0x74, 0x27, 0x1b, 0xb1, 0xd5, 0x6f, 0xf2, 0x16, 0x0c, 0xde, 0x73, 0x9b, 0x91, 0x30, - 0x8d, 0xc4, 0x9b, 0x3c, 0x63, 0xcb, 0x0b, 0x6c, 0x81, 0x60, 0xd9, 0x70, 0x4e, 0xab, 0xf0, 0x0c, - 0x4d, 0x25, 0x25, 0x18, 0xda, 0xa4, 0xdf, 0x68, 0xf5, 0xcb, 0x9f, 0xd6, 0x7b, 0x70, 0x4e, 0xb8, - 0xea, 0x69, 0x62, 0xba, 0x2a, 0x1e, 0xdb, 0x16, 0x8c, 0x17, 0x7f, 0x82, 0x25, 0x16, 0x31, 0xba, - 0xdd, 0x56, 0xe3, 0x05, 0xe9, 0xd8, 0x46, 0x71, 0x46, 0xba, 0x37, 0xe5, 0x2d, 0x50, 0xb7, 0xe1, - 0xfc, 0xd3, 0x02, 0x94, 0x12, 0x56, 0x86, 0xa5, 0x43, 0xa7, 0xd9, 0xa4, 0xde, 0x01, 0x25, 0xd7, - 0xa1, 0x7f, 0x67, 0x6b, 0x67, 0x5b, 0x58, 0x49, 0xa5, 0x03, 0x00, 0x03, 0x29, 0x1c, 0x1b, 0x31, - 0xc8, 0x43, 0x38, 0x27, 0x9d, 0x71, 0x55, 0x91, 0x18, 0xa1, 0x4b, 0x9d, 0x5d, 0x7b, 0xd3, 0x74, - 0xe4, 0x1d, 0x61, 0x12, 0xf9, 0x71, 0xdb, 0x0d, 0x68, 0x03, 0x2d, 0x3f, 0xf1, 0x6d, 0xba, 0x56, - 0x62, 0xeb, 0x68, 0xfc, 0x69, 0xa4, 0xf5, 0x7b, 0x05, 0x98, 0xcd, 0xb1, 0x9a, 0x90, 0xb7, 0x8c, - 0xee, 0x4c, 0x69, 0xdd, 0x91, 0x28, 0xab, 0x3d, 0xa2, 0x3f, 0x4b, 0x9a, 0x87, 0x72, 0xdf, 0x19, - 0x3c, 0x94, 0x57, 0x7b, 0x62, 0xaf, 0xe4, 0x45, 0x80, 0x61, 0x09, 0xb7, 0x26, 0x61, 0xdc, 0x90, - 0x9b, 0x65, 0xc1, 0x98, 0x5e, 0x33, 0x1b, 0x9c, 0x25, 0xbf, 0xa1, 0x06, 0x87, 0xfd, 0x6d, 0xfd, - 0x6e, 0x01, 0xa6, 0xb1, 0x8b, 0x07, 0x2e, 0x5b, 0xfa, 0x62, 0x09, 0x2d, 0x18, 0x3d, 0x99, 0x37, - 0x7a, 0x92, 0xc0, 0x55, 0x5d, 0xfa, 0x30, 0xd5, 0xa5, 0xf9, 0xac, 0x2e, 0xe1, 0xf4, 0x76, 0x7d, - 0xcf, 0xe8, 0x89, 0x76, 0x15, 0xf5, 0xfb, 0x05, 0x98, 0xd2, 0xda, 0xa4, 0xda, 0x7f, 0xc7, 0x68, - 0xd2, 0xc5, 0x8c, 0x26, 0xa5, 0x84, 0xbc, 0x98, 0x6a, 0xd1, 0x6b, 0x9d, 0x5a, 0xd4, 0x55, 0xc6, - 0xff, 0xa5, 0x00, 0x33, 0x99, 0x32, 0x20, 0xe7, 0x99, 0x6e, 0x5b, 0x0f, 0x68, 0x24, 0xc4, 0x2b, - 0x7e, 0x31, 0xf8, 0x5a, 0x18, 0xb6, 0x69, 0x20, 0xbe, 0x73, 0xf1, 0x8b, 0xbc, 0x06, 0xe3, 0xdb, - 0x34, 0x70, 0xfd, 0x06, 0xf7, 0x5d, 0xe7, 0x4e, 0xa1, 0xe3, 0xb6, 0x09, 0x24, 0xf3, 0x30, 0x52, - 0x69, 0x1e, 0xf8, 0x81, 0x1b, 0x1d, 0xf2, 0xdb, 0xc0, 0x11, 0x3b, 0x06, 0x30, 0xde, 0xcb, 0xee, - 0x01, 0xbf, 0xd4, 0x60, 0xc4, 0xe2, 0x17, 0x5b, 0x5c, 0xa4, 0xb5, 0x70, 0x90, 0x2f, 0x2e, 0xd2, - 0x14, 0x78, 0x1e, 0x06, 0x3f, 0xb3, 0x71, 0x12, 0xe0, 0x83, 0x74, 0x5b, 0xfc, 0x22, 0x13, 0xe8, - 0x7d, 0x8c, 0xcf, 0x1d, 0xd0, 0xeb, 0xf8, 0x43, 0x98, 0xce, 0x92, 0x6b, 0xd6, 0x14, 0x12, 0xb4, - 0xbd, 0x8a, 0xf6, 0x4b, 0x98, 0xaa, 0x34, 0x1a, 0x1b, 0xf7, 0x2a, 0xdc, 0xe7, 0x40, 0x8c, 0x2a, - 0xff, 0x78, 0xb8, 0xbd, 0x4e, 0xa8, 0x6c, 0xfd, 0x6b, 0x9e, 0x1b, 0xd9, 0x53, 0x2b, 0xdf, 0xb8, - 0x61, 0xe4, 0x7a, 0x07, 0x9a, 0x51, 0xd1, 0x3e, 0xbf, 0x49, 0x9f, 0x65, 0x4c, 0x01, 0xb6, 0x9b, - 0x9a, 0xbc, 0x39, 0x3c, 0x83, 0xf9, 0xb4, 0xc6, 0x36, 0x5e, 0x4a, 0x66, 0x4d, 0xbe, 0x71, 0x41, - 0x5f, 0xa5, 0xfe, 0xc4, 0xfa, 0x1e, 0x9c, 0xe7, 0x4b, 0x5a, 0xa7, 0xc6, 0x8b, 0x66, 0xeb, 0x36, - 0x50, 0xeb, 0x7d, 0x69, 0xa5, 0xe8, 0xd8, 0x32, 0x7b, 0xcc, 0x68, 0x0b, 0x56, 0xf9, 0x5f, 0x0b, - 0x30, 0x97, 0x20, 0xad, 0x3e, 0xf7, 0xea, 0x72, 0x3d, 0x7d, 0x23, 0xe9, 0xdd, 0x8d, 0x7a, 0x00, - 0x37, 0xfe, 0xb9, 0x0d, 0xe5, 0xe0, 0x4d, 0x6e, 0x01, 0x70, 0x62, 0x6d, 0xfb, 0x46, 0xd3, 0xb7, - 0x70, 0xb2, 0xc1, 0x0d, 0x5c, 0x43, 0x21, 0x6d, 0xc8, 0x92, 0xbb, 0xf8, 0x46, 0xba, 0xd9, 0x86, - 0x31, 0x08, 0x03, 0x15, 0xe4, 0xb5, 0x1c, 0x23, 0x71, 0x16, 0x7f, 0xeb, 0x6f, 0xf7, 0xc1, 0xac, - 0x3e, 0x80, 0x2f, 0xd2, 0xd7, 0x6d, 0x18, 0x5d, 0xf2, 0xbd, 0x88, 0x7e, 0x13, 0x69, 0x8f, 0xe0, - 0x89, 0xba, 0x69, 0x57, 0x25, 0x42, 0x75, 0xe4, 0x80, 0x1a, 0xd3, 0x63, 0x0c, 0x67, 0xc1, 0x18, - 0x91, 0x2c, 0xc1, 0xf8, 0x26, 0x7d, 0x96, 0x12, 0x20, 0x3a, 0x2c, 0x7a, 0xf4, 0x59, 0x4d, 0x13, - 0xa2, 0xee, 0x45, 0x66, 0xd0, 0x90, 0x7d, 0x98, 0x90, 0x93, 0xcb, 0x10, 0xe6, 0x9c, 0xbe, 0xab, - 0x98, 0xd3, 0x99, 0x3f, 0x13, 0x67, 0x35, 0xe4, 0xc8, 0x30, 0xc1, 0x91, 0x75, 0x9d, 0xd7, 0xc8, - 0x5f, 0x3e, 0x9b, 0xdb, 0x96, 0x56, 0x62, 0xb8, 0x83, 0x26, 0x5f, 0x3c, 0xeb, 0x2c, 0xac, 0x6d, - 0x28, 0xa5, 0xc7, 0x43, 0xd4, 0xf6, 0x0e, 0x0c, 0x72, 0xa8, 0x50, 0x03, 0x64, 0x7c, 0x13, 0x85, - 0xcd, 0xcf, 0xe9, 0xbc, 0x1a, 0x5b, 0xe0, 0x5a, 0xab, 0x68, 0x3b, 0x51, 0x38, 0x4a, 0x11, 0xbb, - 0x9d, 0x1c, 0x5e, 0xf4, 0xb4, 0x95, 0xc3, 0xab, 0xfb, 0x99, 0xc8, 0x57, 0x0b, 0x4b, 0x68, 0x7e, - 0xd2, 0x39, 0x89, 0x86, 0xdd, 0x80, 0x21, 0x01, 0x4a, 0x44, 0x5e, 0x89, 0x3f, 0x3f, 0x89, 0x60, - 0x7d, 0x08, 0x17, 0xd0, 0x16, 0xe6, 0x7a, 0x07, 0x4d, 0xba, 0x1b, 0x1a, 0xef, 0x0e, 0xba, 0x7d, - 0xd6, 0x1f, 0xc3, 0x5c, 0x16, 0x6d, 0xd7, 0x2f, 0x9b, 0xc7, 0x42, 0xf8, 0x8b, 0x5e, 0x98, 0x5e, - 0x0b, 0x75, 0x65, 0x42, 0x48, 0xe2, 0x66, 0xd6, 0x2b, 0x7d, 0x94, 0xc9, 0x6a, 0x4f, 0xd6, 0x2b, - 0xfc, 0x77, 0xb4, 0x57, 0x8f, 0xbd, 0x9d, 0x9e, 0xdf, 0xb3, 0x6d, 0x4b, 0xbd, 0x7b, 0x7c, 0x03, - 0xfa, 0x37, 0xd9, 0x52, 0xdd, 0x27, 0xc6, 0x8e, 0x53, 0x30, 0x10, 0xbe, 0x3a, 0x64, 0x5b, 0x24, - 0xfb, 0x41, 0xee, 0xa5, 0xde, 0x36, 0xf6, 0x77, 0x7f, 0x5e, 0xbe, 0xda, 0x93, 0x7a, 0xe6, 0xf8, - 0x1e, 0x8c, 0x56, 0x1a, 0x47, 0xdc, 0x23, 0xd0, 0xf7, 0x12, 0x9f, 0xa5, 0x56, 0xb2, 0xda, 0x63, - 0xeb, 0x88, 0xec, 0x84, 0x5b, 0x69, 0xb5, 0x70, 0xa3, 0xca, 0x7a, 0x72, 0xbf, 0xda, 0x83, 0x0e, - 0xf6, 0x8b, 0xc3, 0x30, 0xb8, 0xe3, 0x04, 0x07, 0x34, 0xb2, 0xbe, 0x84, 0x39, 0xe1, 0xa4, 0xc2, - 0x2d, 0x7f, 0xe8, 0xca, 0x12, 0xc6, 0x7e, 0x48, 0x9d, 0x1c, 0x4b, 0x2e, 0x03, 0xa0, 0x9e, 0xbf, - 0xe6, 0x35, 0xe8, 0x37, 0xc2, 0x4b, 0x4e, 0x83, 0x58, 0xef, 0xc2, 0x88, 0x92, 0x10, 0x2a, 0xb3, - 0xda, 0x66, 0x87, 0xd2, 0x9a, 0x36, 0x1e, 0x73, 0xca, 0x17, 0x9c, 0x17, 0x8c, 0xbe, 0x8b, 0x10, - 0x1a, 0x5c, 0xfb, 0x75, 0x61, 0x26, 0x31, 0x09, 0xe2, 0x37, 0xda, 0x4a, 0xff, 0xe4, 0x6e, 0x7c, - 0xea, 0x77, 0x52, 0x3d, 0xed, 0x3d, 0x95, 0x7a, 0x6a, 0xfd, 0x93, 0x5e, 0x3c, 0x38, 0xa5, 0xe4, - 0x91, 0xb0, 0x41, 0xe9, 0x76, 0xb0, 0x45, 0x18, 0xc1, 0xde, 0x2f, 0xcb, 0x37, 0x65, 0x9d, 0x7d, - 0x2c, 0x86, 0x7f, 0x76, 0x5c, 0xee, 0x41, 0xc7, 0x8a, 0x98, 0x8c, 0x7c, 0x02, 0x43, 0x2b, 0x5e, - 0x03, 0x39, 0xf4, 0x9d, 0x81, 0x83, 0x24, 0x62, 0x63, 0x82, 0x4d, 0xde, 0x61, 0x9f, 0x30, 0x37, - 0x5d, 0xd8, 0x1a, 0x24, 0x3e, 0xc1, 0x0d, 0xe4, 0x9d, 0xe0, 0x06, 0x13, 0x27, 0x38, 0x0b, 0x06, - 0xb6, 0x82, 0x86, 0x08, 0x7d, 0x31, 0xb1, 0x30, 0x26, 0x04, 0x87, 0x30, 0x9b, 0x17, 0x59, 0xff, - 0xbd, 0x00, 0xb3, 0xf7, 0x69, 0x94, 0x39, 0x87, 0x0c, 0xa9, 0x14, 0x5e, 0x5a, 0x2a, 0xbd, 0x2f, - 0x22, 0x15, 0xd5, 0xeb, 0xbe, 0xbc, 0x5e, 0xf7, 0xe7, 0xf5, 0x7a, 0x20, 0xbf, 0xd7, 0xf7, 0x61, - 0x90, 0x77, 0x95, 0x9d, 0x52, 0xd7, 0x22, 0x7a, 0x14, 0x9f, 0x52, 0x75, 0x0f, 0x31, 0x9b, 0x97, - 0x31, 0x45, 0x72, 0xdd, 0x09, 0xf5, 0x53, 0xaa, 0xf8, 0x69, 0xfd, 0x08, 0x5f, 0xa3, 0xae, 0xfb, - 0xf5, 0x27, 0x9a, 0xb5, 0x73, 0x88, 0x7f, 0xa1, 0x49, 0xeb, 0x38, 0xc3, 0xe2, 0x25, 0xb6, 0xc4, - 0x20, 0x57, 0x60, 0x74, 0xcd, 0xbb, 0xe7, 0x07, 0x75, 0xba, 0xe5, 0x35, 0x39, 0xf7, 0x61, 0x5b, - 0x07, 0x09, 0x2b, 0x80, 0xa8, 0x21, 0x3e, 0x5a, 0x23, 0x20, 0x71, 0xb4, 0x66, 0xb0, 0xbd, 0x05, - 0x9b, 0x97, 0x09, 0x23, 0x03, 0xfb, 0xbb, 0xd3, 0xa9, 0x54, 0x1d, 0x5f, 0xbb, 0x21, 0xee, 0xc3, - 0x05, 0x9b, 0xb6, 0x9a, 0x0e, 0xd3, 0xe9, 0x8e, 0x7c, 0x8e, 0xaf, 0xfa, 0x7c, 0x25, 0xe3, 0x25, - 0x99, 0xe9, 0x2f, 0xa0, 0x9a, 0xdc, 0xdb, 0xa1, 0xc9, 0x47, 0x70, 0xf5, 0x3e, 0x8d, 0xcc, 0x05, - 0x35, 0xb6, 0xa5, 0x8a, 0xce, 0xaf, 0xc2, 0x70, 0x68, 0xda, 0x81, 0x2f, 0xcb, 0xeb, 0x87, 0x2c, - 0xc2, 0xbd, 0xbb, 0xf2, 0xa6, 0x44, 0xf0, 0x51, 0x7f, 0x59, 0x9f, 0x42, 0x39, 0xaf, 0xba, 0xd3, - 0xb9, 0x73, 0xba, 0x70, 0x25, 0x9f, 0x81, 0x68, 0xee, 0x0a, 0x48, 0x9b, 0xb1, 0xf8, 0x84, 0xba, - 0xb5, 0xd6, 0x34, 0x33, 0x8b, 0x3f, 0xac, 0x45, 0xe9, 0xd8, 0xf6, 0x12, 0xcd, 0xad, 0xe1, 0x75, - 0xac, 0xc9, 0x20, 0x96, 0x6b, 0x05, 0x86, 0x25, 0x4c, 0xc8, 0x75, 0x36, 0xb3, 0xa5, 0x52, 0xa0, - 0x0d, 0xc9, 0x40, 0x91, 0x59, 0x3f, 0x92, 0x57, 0x13, 0x26, 0xc5, 0xe9, 0x9e, 0x56, 0x9e, 0xe6, - 0x2e, 0xc2, 0xf2, 0xe1, 0x82, 0xc9, 0x5b, 0x37, 0x39, 0x17, 0x35, 0x93, 0x33, 0xb7, 0x34, 0x5f, - 0x31, 0x4d, 0xa0, 0xbd, 0x62, 0x5e, 0xc6, 0x20, 0x72, 0x59, 0x37, 0x2c, 0x8f, 0xa5, 0xdf, 0x6a, - 0xde, 0x86, 0xb9, 0xac, 0x0a, 0xb5, 0x73, 0xa0, 0xb2, 0x5e, 0x0a, 0x7d, 0x67, 0x19, 0x2e, 0xcb, - 0xe0, 0x33, 0xbe, 0x1f, 0x85, 0x51, 0xe0, 0xb4, 0xaa, 0xf5, 0xc0, 0x6d, 0xc5, 0x54, 0x16, 0x0c, - 0x72, 0x88, 0x90, 0x04, 0xbf, 0xe6, 0xe1, 0x38, 0xa2, 0xc4, 0xfa, 0xcd, 0x02, 0x58, 0x86, 0x0f, - 0x12, 0x8e, 0xf3, 0x76, 0xe0, 0x3f, 0x75, 0x1b, 0xda, 0xd5, 0xca, 0x5b, 0x86, 0x59, 0x8f, 0x3f, - 0x89, 0x4b, 0xba, 0x3f, 0x8b, 0x35, 0xf3, 0x76, 0xc2, 0xd4, 0xc6, 0x15, 0x4f, 0xf4, 0x4b, 0x7a, - 0x42, 0xf5, 0x27, 0x25, 0xca, 0x04, 0xf7, 0x3f, 0x0b, 0x70, 0xad, 0x63, 0x1b, 0x44, 0x7f, 0xf6, - 0xa1, 0x98, 0x2c, 0x13, 0x33, 0xa8, 0xac, 0xf9, 0x24, 0xa4, 0x39, 0xec, 0xdd, 0xe1, 0x3e, 0xd6, - 0xd2, 0x77, 0xa7, 0xa5, 0x38, 0xa7, 0xf8, 0x9d, 0xbd, 0xf5, 0xe4, 0x03, 0x80, 0x1d, 0x3f, 0x72, - 0x9a, 0x4b, 0x68, 0x00, 0xe8, 0x8b, 0xfd, 0xe5, 0x23, 0x06, 0xad, 0x25, 0xa3, 0x1f, 0x68, 0xc8, - 0xd6, 0x0f, 0xf0, 0xbb, 0xce, 0x6e, 0xf4, 0xe9, 0x3e, 0xb5, 0x25, 0xb8, 0x96, 0xb8, 0x17, 0x7f, - 0x01, 0x26, 0x11, 0xcc, 0x30, 0xf1, 0x33, 0xdd, 0xfb, 0x7e, 0xe0, 0xb7, 0x5b, 0xbf, 0x9c, 0x51, - 0xff, 0x93, 0x02, 0x77, 0x54, 0xd4, 0xab, 0x15, 0x03, 0xbd, 0x04, 0x10, 0x43, 0x13, 0x0e, 0xeb, - 0xaa, 0x60, 0xef, 0x0e, 0x3f, 0x72, 0xa3, 0xc5, 0xfc, 0x80, 0x33, 0xd0, 0xc8, 0x7e, 0xb9, 0x23, - 0x79, 0x17, 0x2f, 0xc3, 0x55, 0xed, 0xa7, 0x93, 0xfb, 0x7b, 0xd2, 0xfe, 0x71, 0x46, 0xba, 0x43, - 0x98, 0x66, 0x2b, 0x40, 0xa5, 0x1d, 0x1d, 0xfa, 0x81, 0x1b, 0xc9, 0xa7, 0x17, 0x64, 0x5b, 0x3c, - 0x1a, 0xe7, 0x54, 0x1f, 0xff, 0xe2, 0xb8, 0xfc, 0xfe, 0x59, 0x82, 0x02, 0x4a, 0x9e, 0x3b, 0xea, - 0xa1, 0xb9, 0x35, 0x0b, 0x7d, 0x4b, 0xf6, 0x3a, 0x2e, 0x78, 0xf6, 0xba, 0x5a, 0xf0, 0xec, 0x75, - 0xeb, 0xaf, 0x7a, 0xa1, 0xcc, 0xc3, 0x5a, 0xa0, 0x0f, 0x45, 0x6c, 0xb5, 0xd0, 0x9c, 0x32, 0x4e, - 0x6b, 0x60, 0x48, 0x84, 0xad, 0xe8, 0x3d, 0x4d, 0xd8, 0x8a, 0x5f, 0x83, 0x1c, 0x93, 0xd5, 0x29, - 0xac, 0x00, 0x6f, 0x9e, 0x1c, 0x97, 0xaf, 0xc5, 0x56, 0x00, 0x5e, 0x9a, 0x65, 0x0e, 0xc8, 0xa9, - 0x22, 0x6d, 0xbf, 0xe8, 0x7f, 0x01, 0xfb, 0xc5, 0x6d, 0x18, 0xc2, 0xc3, 0xcc, 0xda, 0xb6, 0xf0, - 0x6a, 0xc4, 0xe9, 0x89, 0x81, 0x6a, 0x6a, 0xae, 0x1e, 0x2d, 0x4c, 0xa2, 0x59, 0x7f, 0xaf, 0x17, - 0xae, 0xe4, 0xcb, 0x5c, 0xb4, 0x6d, 0x19, 0x20, 0xf6, 0xde, 0xe8, 0xe4, 0x2d, 0x82, 0xdf, 0xce, - 0x33, 0xba, 0xaf, 0xbc, 0xb5, 0x34, 0x3a, 0xa6, 0xfb, 0xc8, 0x87, 0xbe, 0x89, 0xab, 0x02, 0xe3, - 0xfd, 0xaf, 0x08, 0x75, 0x29, 0x40, 0x46, 0xa8, 0x4b, 0x01, 0x23, 0xfb, 0x30, 0xbb, 0x1d, 0xb8, - 0x4f, 0x9d, 0x88, 0x3e, 0xa4, 0xcf, 0xf9, 0x43, 0x98, 0x15, 0xf1, 0xfa, 0x85, 0xbf, 0xde, 0xbe, - 0x7e, 0x72, 0x5c, 0x7e, 0xad, 0xc5, 0x51, 0xd8, 0x87, 0x59, 0xe3, 0x4f, 0x0f, 0x6b, 0xe9, 0x07, - 0x31, 0x79, 0x8c, 0xac, 0x7f, 0x5b, 0x80, 0x8b, 0xa8, 0x96, 0x0b, 0xb3, 0xab, 0xac, 0xfc, 0x85, - 0x9c, 0x06, 0xf5, 0x0e, 0x8a, 0xb9, 0x88, 0x4e, 0x83, 0xc6, 0x43, 0x68, 0xdb, 0x40, 0x23, 0x6b, - 0x30, 0x2a, 0x7e, 0xe3, 0xf7, 0xd7, 0x87, 0x07, 0x82, 0x19, 0x6d, 0xc1, 0xc2, 0xa9, 0xce, 0x4d, - 0x45, 0x38, 0xb1, 0x05, 0x33, 0x7c, 0x2f, 0x68, 0xeb, 0xb4, 0xd6, 0xcf, 0x7b, 0x61, 0x7e, 0x8f, - 0x06, 0xee, 0xe3, 0xe7, 0x39, 0x9d, 0xd9, 0x82, 0x69, 0x09, 0xe2, 0xa1, 0x2d, 0x8c, 0x4f, 0x8c, - 0x87, 0xbb, 0x93, 0x4d, 0x15, 0xb1, 0x31, 0xe4, 0x17, 0x97, 0x49, 0x78, 0x06, 0x77, 0xc0, 0x77, - 0x60, 0x38, 0x11, 0x5c, 0x06, 0xc7, 0x5f, 0x7e, 0xa1, 0xf1, 0x50, 0xad, 0xf6, 0xd8, 0x0a, 0x93, - 0xfc, 0x56, 0xfe, 0xfd, 0x8d, 0x30, 0x7d, 0x74, 0xb3, 0x7f, 0xe2, 0x07, 0xcb, 0x3e, 0x56, 0x47, - 0x2b, 0xcd, 0xf8, 0x60, 0x57, 0x7b, 0xec, 0xbc, 0x9a, 0x16, 0x47, 0x61, 0xa4, 0x82, 0x77, 0x52, - 0xec, 0xe4, 0xfe, 0x3f, 0x7a, 0xe1, 0xb2, 0x7c, 0xd4, 0x92, 0x23, 0xe6, 0xcf, 0x61, 0x56, 0x82, - 0x2a, 0x2d, 0xa6, 0x30, 0xd0, 0x86, 0x29, 0x69, 0x1e, 0x72, 0x52, 0x4a, 0xda, 0x11, 0x38, 0xb1, - 0xb0, 0xf3, 0xc8, 0x5f, 0x8d, 0xf5, 0xf3, 0x93, 0xac, 0x50, 0x3f, 0x68, 0x85, 0xd4, 0xd7, 0x4c, - 0x43, 0x34, 0xc6, 0xfa, 0xd9, 0x48, 0x59, 0x4f, 0xfb, 0x5f, 0xd6, 0x7a, 0xba, 0xda, 0x93, 0xb4, - 0x9f, 0x2e, 0x4e, 0xc0, 0xd8, 0x26, 0x7d, 0x16, 0xcb, 0xfd, 0xff, 0x2d, 0x24, 0x22, 0x0d, 0x30, - 0x0d, 0x83, 0x87, 0x1c, 0x28, 0xc4, 0xd1, 0x62, 0x30, 0xd2, 0x80, 0xae, 0x61, 0x70, 0xd4, 0x35, - 0x18, 0xe2, 0x17, 0xb5, 0x8d, 0x53, 0x9c, 0xf0, 0xd5, 0xeb, 0x14, 0xfe, 0x64, 0xb0, 0xc1, 0x0f, - 0xfb, 0x82, 0xde, 0x7a, 0x08, 0x57, 0x85, 0xff, 0xb2, 0x39, 0xf8, 0x58, 0xd1, 0x19, 0xb7, 0x2f, - 0xcb, 0x81, 0xcb, 0xf7, 0x69, 0x72, 0xe9, 0x31, 0x5e, 0xef, 0x7c, 0x0a, 0x93, 0x06, 0x5c, 0x71, - 0x44, 0xad, 0x54, 0xcd, 0x21, 0xc5, 0x3a, 0x89, 0x6d, 0x5d, 0xc9, 0xaa, 0x42, 0x6f, 0xac, 0x45, - 0x31, 0x76, 0x64, 0x10, 0x5f, 0xb1, 0x85, 0x67, 0x58, 0xf5, 0xae, 0x6b, 0xdf, 0x35, 0x5f, 0xf1, - 0x78, 0x10, 0x39, 0xb9, 0xf3, 0xaa, 0x52, 0x6b, 0xdc, 0xb8, 0x0b, 0xb0, 0x26, 0x60, 0x4c, 0x16, - 0x35, 0x69, 0x18, 0x5a, 0x3f, 0x1d, 0x00, 0x4b, 0x08, 0x36, 0xeb, 0xf6, 0x59, 0xca, 0x63, 0x3f, - 0xd5, 0x58, 0xb1, 0x51, 0x9d, 0xd7, 0xc3, 0x16, 0xc6, 0xa5, 0x7c, 0xe6, 0xa1, 0x9e, 0x57, 0x8f, - 0xa1, 0xc6, 0xcc, 0x4b, 0xf5, 0xfe, 0xab, 0x9c, 0x65, 0x92, 0x7f, 0x6c, 0xaf, 0x9f, 0x1c, 0x97, - 0xaf, 0xe6, 0x2c, 0x93, 0x06, 0xdf, 0xec, 0x25, 0xd3, 0x36, 0xaf, 0x44, 0xfa, 0x5e, 0xe4, 0x4a, - 0x84, 0x7d, 0x91, 0xfa, 0xa5, 0xc8, 0xae, 0x29, 0x4b, 0xf1, 0x3d, 0xca, 0x2b, 0x6d, 0xbd, 0x48, - 0x3c, 0xf8, 0xd7, 0x20, 0x06, 0x57, 0x83, 0x0d, 0x71, 0xa1, 0xa8, 0xd9, 0x2c, 0x97, 0x0e, 0x69, - 0xfd, 0x89, 0xb0, 0x15, 0xcb, 0x0b, 0xdd, 0x2c, 0x9b, 0x39, 0x0f, 0x5f, 0xcb, 0xbf, 0x73, 0x5e, - 0x50, 0xab, 0x33, 0x52, 0x3d, 0x60, 0x41, 0x92, 0x2d, 0xf9, 0x09, 0x4c, 0xa9, 0xa1, 0x4e, 0xb8, - 0x1f, 0x8d, 0x2e, 0xbc, 0x16, 0xc7, 0xb9, 0x3c, 0x7a, 0xec, 0xdc, 0x7c, 0x7a, 0xe7, 0x66, 0x06, - 0x2e, 0x7f, 0x07, 0x5f, 0x97, 0x05, 0x9a, 0xef, 0x91, 0x7e, 0xd1, 0x95, 0x45, 0xa8, 0x5d, 0x67, - 0xff, 0x5d, 0xe5, 0x2c, 0xcf, 0xf4, 0x05, 0xb7, 0x49, 0xc5, 0xab, 0x17, 0x39, 0xfb, 0x72, 0xae, - 0xe2, 0x0a, 0xdf, 0xf2, 0x55, 0xdc, 0x3f, 0xeb, 0x95, 0x4f, 0x04, 0xd2, 0xb7, 0xa1, 0x67, 0xbe, - 0x91, 0xcb, 0xec, 0xc1, 0xa9, 0x36, 0xd3, 0xcc, 0xc6, 0x91, 0x45, 0x79, 0x9f, 0xa9, 0x82, 0x4e, - 0x4d, 0xa8, 0xbb, 0x81, 0xb8, 0xc0, 0xb8, 0xe2, 0x44, 0xd5, 0x45, 0xa3, 0x4a, 0x5e, 0x96, 0xf5, - 0xbd, 0xfc, 0x65, 0xd9, 0xbf, 0x18, 0x81, 0x73, 0xdb, 0xce, 0x81, 0xeb, 0xb1, 0x45, 0xdb, 0xa6, - 0xa1, 0xdf, 0x0e, 0xea, 0x94, 0x54, 0x60, 0xc2, 0xf4, 0xff, 0xec, 0xe2, 0xdd, 0xca, 0xf6, 0x25, - 0x13, 0x46, 0x16, 0x60, 0x44, 0xbd, 0x39, 0x15, 0x9b, 0x49, 0xc6, 0x5b, 0xd4, 0xd5, 0x1e, 0x3b, - 0x46, 0x23, 0x1f, 0x18, 0xf7, 0x3b, 0x93, 0xea, 0xf9, 0x34, 0xe2, 0x2e, 0x70, 0x07, 0x3d, 0xcf, - 0x6f, 0x98, 0x1b, 0x22, 0xbf, 0xc4, 0xf8, 0x51, 0xea, 0xca, 0x67, 0xc0, 0x68, 0x71, 0xca, 0xee, - 0x85, 0xba, 0x40, 0x6e, 0xfc, 0xe0, 0x8c, 0xcb, 0xa0, 0x2f, 0x61, 0xf4, 0x61, 0x7b, 0x9f, 0xca, - 0xcb, 0xad, 0x41, 0xb1, 0x3f, 0x26, 0xbd, 0x9a, 0x45, 0xf9, 0xde, 0x5d, 0x3e, 0x06, 0x4f, 0xda, - 0xfb, 0x34, 0x1d, 0x98, 0x9a, 0x2d, 0x4c, 0x1a, 0x33, 0x72, 0x08, 0xc5, 0xa4, 0x03, 0xb2, 0x08, - 0xd3, 0xd6, 0xc1, 0x6d, 0x1a, 0x43, 0x79, 0x68, 0xe1, 0xaf, 0xb9, 0x5b, 0xa4, 0x51, 0x49, 0x8a, - 0x2b, 0xf9, 0x75, 0x98, 0xc9, 0xb4, 0x3a, 0xaa, 0x27, 0x54, 0x9d, 0x0d, 0x9a, 0xb8, 0xa8, 0x27, - 0xa4, 0x26, 0xdf, 0x6b, 0x19, 0x35, 0x67, 0xd7, 0x42, 0x1a, 0x30, 0x99, 0x70, 0xac, 0x15, 0x11, - 0xfe, 0xf3, 0x5d, 0x75, 0x71, 0x63, 0x92, 0xe1, 0x50, 0x33, 0xeb, 0x4a, 0xb2, 0x24, 0xeb, 0x30, - 0xa2, 0x8e, 0xfb, 0x22, 0xfa, 0x56, 0x96, 0x69, 0xa3, 0x74, 0x72, 0x5c, 0x9e, 0x8e, 0x4d, 0x1b, - 0x06, 0xcf, 0x98, 0x01, 0xf9, 0x0d, 0xb8, 0xaa, 0xa6, 0xe8, 0x56, 0x90, 0x6d, 0x04, 0x12, 0xe1, - 0xb5, 0x6f, 0x24, 0x67, 0x78, 0x1e, 0xfe, 0xde, 0x9d, 0xc5, 0xde, 0x52, 0x61, 0xb5, 0xc7, 0xee, - 0xce, 0x9a, 0xfc, 0xb4, 0x00, 0xe7, 0x73, 0x6a, 0x1d, 0xc3, 0x5a, 0xbb, 0x5a, 0xe6, 0x50, 0xb9, - 0xc7, 0x67, 0x43, 0x6e, 0x23, 0x7e, 0x5e, 0x27, 0x4d, 0x74, 0x46, 0xbf, 0x73, 0x6a, 0x22, 0x6f, - 0xc3, 0x20, 0x9e, 0x91, 0xc3, 0xd2, 0x38, 0x6a, 0x91, 0x18, 0xc1, 0x06, 0x4f, 0xd2, 0xfa, 0xbe, - 0x21, 0x70, 0xc8, 0x2a, 0xd3, 0xc6, 0x70, 0xdf, 0x92, 0xda, 0x93, 0x88, 0x77, 0x25, 0x34, 0x7a, - 0x5e, 0x24, 0xa3, 0x5c, 0x18, 0x71, 0xd4, 0x4d, 0xb2, 0x45, 0x80, 0xe1, 0x40, 0xac, 0x4a, 0x0f, - 0xfa, 0x87, 0xfb, 0x8b, 0x03, 0xfc, 0xc3, 0x91, 0x1e, 0xdb, 0xbf, 0x3d, 0xcc, 0x9f, 0x77, 0xee, - 0x7a, 0xee, 0x63, 0x37, 0x5e, 0xc0, 0x74, 0xeb, 0x5a, 0x9c, 0xce, 0x44, 0xe8, 0xbe, 0x39, 0x89, - 0x4b, 0x94, 0x21, 0xae, 0xb7, 0xab, 0x21, 0xee, 0xae, 0x76, 0x65, 0xa5, 0xc5, 0x9e, 0xe4, 0x3a, - 0x8e, 0x69, 0xf8, 0x8a, 0xef, 0xb2, 0xbe, 0x86, 0x41, 0x0c, 0x17, 0xc9, 0xef, 0x03, 0x47, 0x17, - 0x6e, 0x8a, 0x65, 0xbb, 0x43, 0xf3, 0x79, 0x7c, 0x49, 0xf1, 0x64, 0x9b, 0x4b, 0x1c, 0x01, 0x86, - 0xc4, 0x11, 0x42, 0x76, 0x60, 0x6a, 0x3b, 0xa0, 0x0d, 0xe1, 0x37, 0xdc, 0x0a, 0x84, 0x71, 0x82, - 0x9b, 0x3d, 0x70, 0xcb, 0x6f, 0xc9, 0xe2, 0x1a, 0x55, 0xe5, 0xfa, 0x86, 0x9a, 0x41, 0x4e, 0x56, - 0x60, 0xa2, 0x4a, 0x9d, 0xa0, 0x7e, 0xf8, 0x90, 0x3e, 0x67, 0xea, 0x8e, 0x11, 0xc3, 0x3f, 0xc4, - 0x12, 0xd6, 0x5f, 0x2c, 0xd2, 0x7d, 0x3c, 0x4c, 0x22, 0xf2, 0x03, 0x18, 0xac, 0xfa, 0x41, 0xb4, - 0xf8, 0x5c, 0x2c, 0x6a, 0xf2, 0xc6, 0x88, 0x03, 0x17, 0x2f, 0xc8, 0x3c, 0x06, 0xa1, 0x1f, 0x44, - 0xb5, 0x7d, 0x23, 0x24, 0x12, 0x47, 0x21, 0xcf, 0x61, 0xda, 0x5c, 0x50, 0x84, 0x3b, 0xeb, 0xb0, - 0x50, 0xb3, 0xb2, 0x56, 0x2d, 0x8e, 0xb2, 0x78, 0x5d, 0x70, 0xbf, 0x92, 0x5c, 0xb6, 0x1e, 0x63, - 0xb9, 0x1e, 0xa5, 0x28, 0x8b, 0x9e, 0x6c, 0x60, 0xfa, 0x07, 0xde, 0xa3, 0x4a, 0xc8, 0xdd, 0x60, - 0x47, 0xe2, 0xa0, 0x5b, 0x6d, 0x5c, 0x94, 0x50, 0x12, 0x4e, 0x98, 0xcc, 0x19, 0x62, 0xa7, 0x48, - 0xc9, 0x36, 0x9c, 0xdb, 0x0d, 0xe9, 0x76, 0x40, 0x9f, 0xba, 0xf4, 0x99, 0xe4, 0x07, 0x71, 0x84, - 0x22, 0xc6, 0xaf, 0xc5, 0x4b, 0xb3, 0x18, 0xa6, 0x89, 0xc9, 0x07, 0x00, 0xdb, 0xae, 0xe7, 0xd1, - 0x06, 0x5e, 0x3b, 0x8e, 0x22, 0x2b, 0x34, 0xa9, 0xb6, 0x10, 0x5a, 0xf3, 0xbd, 0xa6, 0x2e, 0x52, - 0x0d, 0x99, 0x2c, 0xc2, 0xf8, 0x9a, 0x57, 0x6f, 0xb6, 0x85, 0x7b, 0x40, 0x88, 0x0b, 0x8a, 0x88, - 0x9c, 0xe6, 0xf2, 0x82, 0x5a, 0xea, 0x23, 0x37, 0x49, 0xc8, 0x43, 0x20, 0x02, 0x20, 0x66, 0xad, - 0xb3, 0xdf, 0xa4, 0xe2, 0x73, 0x47, 0x53, 0x89, 0x64, 0x84, 0xd3, 0xdd, 0x08, 0x48, 0x96, 0x22, - 0x9b, 0xfb, 0x00, 0x46, 0xb5, 0x39, 0x9f, 0x11, 0x83, 0x60, 0x5a, 0x8f, 0x41, 0x30, 0xa2, 0xc7, - 0x1a, 0xf8, 0x07, 0x05, 0x98, 0xcf, 0xfe, 0x96, 0x84, 0x02, 0xb6, 0x05, 0x23, 0x0a, 0xa8, 0x5e, - 0x9d, 0x48, 0xd5, 0x3f, 0xa1, 0x01, 0xf1, 0x0f, 0x5a, 0xae, 0x3c, 0x7a, 0xef, 0x63, 0x1e, 0x2f, - 0x60, 0x8f, 0xff, 0xff, 0x86, 0x61, 0x1a, 0xbd, 0xab, 0x93, 0xeb, 0xd4, 0xa7, 0x18, 0x4b, 0x04, - 0x61, 0x9a, 0x79, 0x59, 0x58, 0x9a, 0x38, 0x3c, 0x19, 0xf8, 0xca, 0x20, 0x20, 0xef, 0xea, 0x3e, - 0x11, 0xbd, 0x5a, 0xc2, 0x09, 0x09, 0xd4, 0xbb, 0x10, 0x3b, 0x4b, 0xbc, 0x65, 0x5c, 0xc9, 0x9f, - 0x7a, 0xd1, 0xeb, 0x3f, 0xed, 0xa2, 0xb7, 0xab, 0x16, 0x3d, 0x1e, 0xa3, 0xe2, 0x4d, 0x6d, 0xd1, - 0x7b, 0xf5, 0xab, 0xdd, 0xe0, 0xab, 0x5e, 0xed, 0x86, 0x5e, 0x6e, 0xb5, 0x1b, 0x7e, 0xc1, 0xd5, - 0xee, 0x1e, 0x4c, 0x6c, 0x52, 0xda, 0xd0, 0x2e, 0x4a, 0x46, 0xe2, 0xdd, 0xd3, 0xa3, 0x68, 0x02, - 0xcb, 0xba, 0x2d, 0x49, 0x50, 0xe5, 0xae, 0x9a, 0xf0, 0x37, 0xb3, 0x6a, 0x8e, 0xbe, 0xe2, 0x55, - 0x73, 0xec, 0x65, 0x56, 0xcd, 0xd4, 0xd2, 0x37, 0x7e, 0xe6, 0xa5, 0xef, 0x65, 0x56, 0xab, 0x4f, - 0xd0, 0xa5, 0xb0, 0x5a, 0x5d, 0x15, 0xde, 0x23, 0x9a, 0xbb, 0xc6, 0xaa, 0x1f, 0x4a, 0x8f, 0x6b, - 0xfc, 0x9b, 0xc1, 0xb6, 0xfd, 0x40, 0x5e, 0x79, 0xe3, 0xdf, 0xd6, 0x22, 0x3a, 0x12, 0xea, 0xf4, - 0xca, 0x5d, 0x7f, 0x48, 0x3c, 0xd9, 0x13, 0x6b, 0x5c, 0xf2, 0x18, 0x65, 0xcb, 0x72, 0xeb, 0x2f, - 0x0a, 0xfc, 0x52, 0xf2, 0xff, 0xc4, 0xa5, 0xf2, 0x65, 0x2e, 0x0a, 0x7f, 0x2b, 0x7e, 0xca, 0x2f, - 0xc2, 0x0e, 0x04, 0x4e, 0xfd, 0x49, 0x7c, 0x53, 0xfb, 0x43, 0xf6, 0x9d, 0xeb, 0x05, 0x18, 0x58, - 0x35, 0x3e, 0x2b, 0x9a, 0x85, 0x7b, 0x77, 0xe4, 0x02, 0x20, 0x22, 0x1a, 0x70, 0xb0, 0xb9, 0x00, - 0xe8, 0x04, 0xe8, 0x2b, 0x37, 0x69, 0xd9, 0xfc, 0x25, 0x7a, 0x66, 0x0b, 0xde, 0x4b, 0xbf, 0xa5, - 0xc6, 0xc3, 0x48, 0xfc, 0x96, 0x5a, 0x17, 0x63, 0xfc, 0xaa, 0x7a, 0x17, 0x2e, 0xda, 0xf4, 0xc8, - 0x7f, 0x4a, 0x5f, 0x2d, 0xdb, 0xaf, 0xe0, 0x82, 0xc9, 0x90, 0xbf, 0xba, 0xe1, 0x91, 0xd6, 0x3f, - 0xc9, 0x8e, 0xcf, 0x2e, 0x08, 0x78, 0x7c, 0x76, 0x1e, 0xe6, 0x99, 0xfd, 0xa9, 0xef, 0x1b, 0x58, - 0x66, 0xf9, 0x30, 0x6f, 0x32, 0xaf, 0x34, 0x1a, 0x98, 0xdc, 0xaf, 0xee, 0xb6, 0x1c, 0x2f, 0x22, - 0x5b, 0x30, 0xaa, 0xfd, 0x4c, 0x98, 0x0a, 0xb4, 0x12, 0xa1, 0xd3, 0xc4, 0x00, 0x23, 0x04, 0x67, - 0x0c, 0xb6, 0x28, 0x94, 0x93, 0xe2, 0x61, 0x22, 0xd3, 0xeb, 0x5c, 0x84, 0x71, 0xed, 0xa7, 0x32, - 0x59, 0xe2, 0xc7, 0xaf, 0xd5, 0x60, 0x0a, 0xcc, 0x24, 0xb1, 0xea, 0x30, 0x97, 0x25, 0x34, 0x1e, - 0xab, 0x99, 0xac, 0xc4, 0x71, 0x9e, 0xba, 0x7b, 0xdb, 0x4d, 0xe6, 0xc5, 0x78, 0xb2, 0xfe, 0x4e, - 0x3f, 0x5c, 0x14, 0x83, 0xf1, 0x2a, 0x47, 0x9c, 0xfc, 0x08, 0x46, 0xb5, 0x31, 0x16, 0x42, 0xbf, - 0x22, 0x43, 0x6f, 0xe6, 0xcd, 0x05, 0x6e, 0xd2, 0x68, 0x23, 0xa0, 0x96, 0x18, 0xee, 0xd5, 0x1e, - 0x5b, 0x67, 0x49, 0x9a, 0x30, 0x61, 0x0e, 0xb4, 0xb0, 0xea, 0x5c, 0xcb, 0xac, 0xc4, 0x44, 0x95, - 0x81, 0x9c, 0x1b, 0xb5, 0xcc, 0xe1, 0x5e, 0xed, 0xb1, 0x13, 0xbc, 0xc9, 0x37, 0x70, 0x2e, 0x35, - 0xca, 0xc2, 0x58, 0xf7, 0x46, 0x66, 0x85, 0x29, 0x6c, 0x6e, 0x8e, 0x0d, 0x10, 0x9c, 0x5b, 0x6d, - 0xba, 0x12, 0xd2, 0x80, 0x31, 0x7d, 0xe0, 0x85, 0xd9, 0xe9, 0x6a, 0x07, 0x51, 0x72, 0x44, 0xae, - 0xdc, 0x09, 0x59, 0xe2, 0xd8, 0x3f, 0x37, 0x4d, 0xcc, 0x06, 0xf2, 0x30, 0x0c, 0xf2, 0xdf, 0x6c, - 0x09, 0xd8, 0x0e, 0x68, 0x48, 0xbd, 0x3a, 0x35, 0x1c, 0xb4, 0x5f, 0x72, 0x09, 0xf8, 0x37, 0x05, - 0x28, 0x65, 0xf1, 0xad, 0x52, 0xaf, 0x41, 0xb6, 0xa1, 0x98, 0xac, 0x48, 0xcc, 0x6a, 0x4b, 0xc5, - 0xca, 0xcd, 0x6d, 0xd2, 0x6a, 0x8f, 0x9d, 0xa2, 0x26, 0x9b, 0x70, 0x4e, 0x83, 0x09, 0xe3, 0x6a, - 0xef, 0x69, 0x8c, 0xab, 0x6c, 0x14, 0x52, 0xa4, 0xba, 0x6d, 0x7a, 0x15, 0x77, 0xc6, 0x65, 0xff, - 0xc8, 0x71, 0x3d, 0xa6, 0xe8, 0x6a, 0xa1, 0x9e, 0x20, 0x86, 0x0a, 0xd9, 0x70, 0x6b, 0x2b, 0x42, - 0xe5, 0x83, 0x12, 0x85, 0x62, 0x7d, 0x8c, 0x2b, 0xb8, 0xb0, 0xd1, 0xf1, 0xe7, 0xa9, 0x8a, 0xd9, - 0x15, 0x18, 0xd8, 0x59, 0xaf, 0x2e, 0x55, 0xc4, 0x63, 0x57, 0x1e, 0x22, 0xa1, 0x19, 0xd6, 0xea, - 0x8e, 0xcd, 0x0b, 0xac, 0x8f, 0x80, 0xdc, 0xa7, 0x91, 0x08, 0xd6, 0xae, 0xe8, 0x5e, 0x87, 0x21, - 0x01, 0x12, 0x94, 0xe8, 0x1a, 0x27, 0x42, 0xbf, 0xdb, 0xb2, 0xcc, 0xda, 0x96, 0xe7, 0x84, 0x26, - 0x75, 0x42, 0x6d, 0x63, 0x7e, 0x1f, 0x86, 0x03, 0x01, 0x13, 0xfb, 0xf2, 0x84, 0xca, 0x97, 0x81, - 0x60, 0x6e, 0xcf, 0x96, 0x38, 0xb6, 0xfa, 0xcb, 0x5a, 0xc7, 0x70, 0x26, 0x5b, 0x6b, 0xcb, 0x4b, - 0x4c, 0xaa, 0x42, 0x58, 0x72, 0x38, 0x6e, 0xa1, 0x0f, 0x79, 0x44, 0xf5, 0xa7, 0xae, 0x28, 0x1a, - 0xfc, 0xc8, 0x45, 0x10, 0x1f, 0x0d, 0xc5, 0xba, 0xab, 0x82, 0xa3, 0x64, 0x70, 0xcb, 0xcb, 0xfb, - 0xb0, 0x89, 0x61, 0x5f, 0xee, 0xa3, 0xbb, 0xcc, 0xab, 0x68, 0x84, 0x03, 0x73, 0x7c, 0x9b, 0x67, - 0xbd, 0x12, 0x19, 0xcf, 0x7c, 0xb5, 0x34, 0x2e, 0xc1, 0x88, 0x82, 0xa9, 0xbb, 0x2f, 0x2e, 0x2b, - 0x03, 0x7f, 0xef, 0x2e, 0x7f, 0x15, 0x5c, 0x57, 0x0c, 0x62, 0x3a, 0x56, 0x05, 0xff, 0xee, 0xbe, - 0xe5, 0x2a, 0x42, 0x1a, 0x44, 0xdf, 0x6a, 0x15, 0x71, 0x5c, 0xa0, 0xb3, 0x54, 0x61, 0xe0, 0xef, - 0x2d, 0x9c, 0x46, 0x50, 0xdf, 0x72, 0x15, 0x4c, 0x50, 0xdf, 0x5e, 0x15, 0x54, 0x06, 0x50, 0xe2, - 0x93, 0x34, 0x55, 0xc9, 0x4a, 0xba, 0x12, 0x69, 0xb8, 0x4e, 0x50, 0x74, 0x1c, 0x0f, 0x0a, 0xf3, - 0x5c, 0x58, 0xbf, 0x84, 0x6a, 0x98, 0xc0, 0xbe, 0xdd, 0x6a, 0xfe, 0x7e, 0x81, 0x87, 0x73, 0xaa, - 0x6e, 0x69, 0xb9, 0x06, 0xbd, 0xc7, 0xbe, 0x76, 0x35, 0xaf, 0x7d, 0xed, 0x0f, 0x5d, 0xaf, 0xa1, - 0x5f, 0xcd, 0x3b, 0xed, 0xe8, 0x50, 0x85, 0x3b, 0x7e, 0xe2, 0x7a, 0x0d, 0x3b, 0x89, 0x4d, 0x3e, - 0x80, 0x71, 0x0d, 0xa4, 0xb4, 0x35, 0x9e, 0x33, 0x42, 0x27, 0x77, 0x1b, 0xb6, 0x89, 0x69, 0xfd, - 0x75, 0x01, 0xa6, 0x32, 0x72, 0xe0, 0xa2, 0x31, 0x03, 0x4f, 0x41, 0x6a, 0xa1, 0x12, 0x99, 0x98, - 0x30, 0xb2, 0x84, 0xb1, 0x49, 0x2a, 0x44, 0x8c, 0x96, 0xaf, 0xe5, 0xeb, 0xed, 0xd5, 0x72, 0x82, - 0x65, 0xe7, 0xe8, 0xd5, 0xd1, 0x49, 0x08, 0x10, 0xb7, 0x44, 0x98, 0x8d, 0xab, 0x4c, 0xa5, 0xd5, - 0x92, 0xfd, 0xbe, 0x92, 0x6c, 0xc3, 0x5a, 0x35, 0xd6, 0x6f, 0xf5, 0xc2, 0xf9, 0x8c, 0xfe, 0x57, - 0x69, 0xf4, 0x37, 0x21, 0x82, 0x44, 0xca, 0xe5, 0xbe, 0x5f, 0x52, 0xca, 0x65, 0xeb, 0x3f, 0xf4, - 0xc2, 0xf9, 0xdd, 0x56, 0x88, 0x2f, 0xac, 0xd6, 0xbc, 0xa7, 0xd4, 0x8b, 0xfc, 0xe0, 0x39, 0xbe, - 0x0a, 0x21, 0xef, 0xc2, 0xc0, 0x2a, 0x6d, 0x36, 0x7d, 0x31, 0xff, 0x2f, 0x49, 0xef, 0x88, 0x24, - 0x36, 0x22, 0xad, 0xf6, 0xd8, 0x1c, 0x9b, 0x7c, 0x00, 0x23, 0xab, 0xd4, 0x09, 0xa2, 0x7d, 0xea, - 0xc8, 0x23, 0x8b, 0xcc, 0x64, 0xa1, 0x91, 0x08, 0x84, 0xd5, 0x1e, 0x3b, 0xc6, 0x26, 0x0b, 0xec, - 0x34, 0xef, 0x1d, 0xa8, 0xd7, 0xe4, 0x39, 0x15, 0x32, 0x9c, 0xd5, 0x1e, 0x1b, 0x71, 0xc9, 0x06, - 0x8c, 0x57, 0x0e, 0xa8, 0x17, 0x6d, 0xd0, 0xc8, 0x69, 0x38, 0x91, 0x23, 0x54, 0xdb, 0xd7, 0xf3, - 0x88, 0x0d, 0xe4, 0xd5, 0x1e, 0xdb, 0xa4, 0x26, 0x1f, 0xc1, 0xd0, 0x7d, 0xdf, 0x6f, 0xec, 0x3f, - 0xa7, 0x42, 0x5d, 0x2d, 0xe7, 0x31, 0x12, 0x68, 0xab, 0x3d, 0xb6, 0xa4, 0x58, 0x1c, 0x80, 0xbe, - 0x8d, 0xf0, 0xc0, 0x3a, 0x2e, 0x40, 0x69, 0xd9, 0x7f, 0xe6, 0x65, 0x4a, 0xf5, 0x7b, 0xa6, 0x54, - 0x25, 0xfb, 0x0c, 0xfc, 0x84, 0x5c, 0xdf, 0x81, 0xfe, 0x6d, 0xd7, 0x3b, 0x48, 0xa8, 0x82, 0x19, - 0x74, 0x0c, 0x0b, 0xc5, 0xe3, 0x7a, 0x07, 0x64, 0x5d, 0xea, 0xe0, 0xc2, 0xd6, 0xd8, 0x67, 0x28, - 0xfe, 0x19, 0xd4, 0x3a, 0x76, 0xac, 0x6b, 0xf3, 0xdf, 0xb2, 0x83, 0x6f, 0xc1, 0x6c, 0x4e, 0xbd, - 0xe2, 0x79, 0x38, 0xeb, 0x5b, 0x3f, 0x2a, 0x36, 0x6f, 0xc2, 0x4c, 0xe6, 0xf8, 0xa5, 0x10, 0xff, - 0x71, 0xd6, 0x44, 0xe4, 0x3d, 0x2f, 0xc1, 0x90, 0x4c, 0xc3, 0xc4, 0x6d, 0x3f, 0xf2, 0x27, 0x3e, - 0x90, 0x92, 0x1f, 0xaa, 0x0c, 0xec, 0x21, 0xbf, 0xc7, 0x3d, 0x2d, 0x90, 0x12, 0xff, 0x9c, 0x3e, - 0x7c, 0x89, 0x8f, 0x46, 0xf1, 0x62, 0x75, 0xae, 0xfa, 0x61, 0xe4, 0x29, 0xcf, 0x5b, 0x5b, 0xfd, - 0x26, 0x37, 0xa0, 0x28, 0xd3, 0x39, 0x88, 0xbc, 0x31, 0x22, 0x45, 0xb4, 0x9d, 0x82, 0x93, 0xf7, - 0x61, 0x36, 0x09, 0x93, 0xbd, 0xe4, 0x2f, 0xdc, 0xf2, 0x8a, 0xad, 0x3f, 0xef, 0xc5, 0x58, 0xd7, - 0x1d, 0xe6, 0x35, 0x93, 0xee, 0x56, 0x55, 0x48, 0xab, 0x77, 0xab, 0x4a, 0xe6, 0x61, 0x64, 0xab, - 0x6a, 0xe4, 0xb2, 0xb2, 0x63, 0x00, 0x6b, 0x36, 0xeb, 0x42, 0x25, 0xa8, 0x1f, 0xba, 0x11, 0xad, - 0x47, 0xed, 0x40, 0xac, 0xc2, 0x76, 0x0a, 0x4e, 0x2c, 0x18, 0xbb, 0xdf, 0x74, 0xf7, 0xeb, 0x92, - 0x19, 0x17, 0x81, 0x01, 0x23, 0x6f, 0xc0, 0xc4, 0x9a, 0x17, 0x46, 0x4e, 0xb3, 0xb9, 0x41, 0xa3, - 0x43, 0xbf, 0x21, 0xb2, 0x71, 0xda, 0x09, 0x28, 0xab, 0x77, 0xc9, 0xf7, 0x22, 0xc7, 0xf5, 0x68, - 0x60, 0xb7, 0xbd, 0xc8, 0x3d, 0xa2, 0xa2, 0xef, 0x29, 0x38, 0x79, 0x07, 0x66, 0x14, 0x6c, 0x2b, - 0xa8, 0x1f, 0xd2, 0x30, 0x0a, 0x30, 0xc3, 0x1d, 0x06, 0xfc, 0xb1, 0xb3, 0x0b, 0xb1, 0x86, 0xa6, - 0xdf, 0x6e, 0xac, 0x78, 0x4f, 0xdd, 0xc0, 0xf7, 0x30, 0x37, 0xc5, 0xb0, 0xa8, 0x21, 0x01, 0xb7, - 0xfe, 0x70, 0x38, 0xf3, 0xb3, 0x7d, 0x99, 0x39, 0xf8, 0x05, 0x8c, 0x2d, 0x39, 0x2d, 0x67, 0xdf, - 0x6d, 0xba, 0x91, 0xab, 0x52, 0x81, 0xbd, 0xdb, 0xe5, 0x9b, 0x97, 0x09, 0x3e, 0x68, 0x43, 0x27, - 0xb6, 0x0d, 0x56, 0x73, 0x7f, 0x35, 0x08, 0x33, 0x99, 0x78, 0xe4, 0xba, 0xc8, 0x19, 0xa6, 0xd6, - 0x55, 0x91, 0xec, 0xca, 0x4e, 0x82, 0xd9, 0x58, 0x22, 0x68, 0xa9, 0x49, 0x1d, 0xaf, 0x2d, 0x52, - 0x5d, 0xd9, 0x06, 0x8c, 0x8d, 0x25, 0xd3, 0x1b, 0x34, 0x66, 0xe8, 0x38, 0x6d, 0x27, 0xa0, 0xe4, - 0x0a, 0x8c, 0x32, 0x88, 0x64, 0xd5, 0xcf, 0x9f, 0xf8, 0x69, 0x20, 0xc6, 0x69, 0xd3, 0x6f, 0x50, - 0x8d, 0xd3, 0x00, 0xe7, 0x64, 0x42, 0x19, 0x27, 0x06, 0x91, 0x9c, 0x06, 0x39, 0x27, 0x0d, 0x44, - 0x5e, 0x83, 0xf1, 0x4a, 0xab, 0xa5, 0x31, 0xc2, 0x1c, 0x57, 0xb6, 0x09, 0x24, 0x97, 0x01, 0x2a, - 0xad, 0x96, 0x64, 0x83, 0xf9, 0xab, 0x6c, 0x0d, 0x42, 0x6e, 0xc6, 0xe1, 0xca, 0x34, 0x56, 0x78, - 0x9d, 0x60, 0x67, 0x94, 0x30, 0xb9, 0xaa, 0xd8, 0x4e, 0x82, 0x29, 0x70, 0xb9, 0x26, 0xc0, 0xe4, - 0x63, 0xb8, 0x90, 0xf0, 0xbb, 0xd0, 0x2a, 0x40, 0x53, 0xbf, 0x9d, 0x8f, 0x40, 0xde, 0x83, 0xf3, - 0x89, 0x42, 0x59, 0x1d, 0x5a, 0xf5, 0xed, 0x9c, 0x52, 0xf2, 0x21, 0x94, 0x12, 0xcf, 0xb6, 0xe3, - 0x4a, 0xd1, 0x82, 0x6f, 0xe7, 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0xfe, 0x4b, 0x54, 0x89, 0x97, 0x95, - 0x76, 0x76, 0x21, 0x59, 0x85, 0x72, 0xa6, 0x2f, 0x8b, 0x56, 0x31, 0xe6, 0xe5, 0xb2, 0xbb, 0xa1, - 0x91, 0x45, 0x98, 0xcf, 0x44, 0x91, 0xcd, 0xc0, 0x6c, 0x5d, 0x76, 0x47, 0x1c, 0xb2, 0x00, 0xd3, - 0xb1, 0x4f, 0x8f, 0xd6, 0x04, 0x4c, 0xd4, 0x65, 0x67, 0x96, 0x91, 0xb7, 0xcd, 0xc7, 0xf9, 0xbc, - 0x32, 0xcc, 0xd3, 0x65, 0xa7, 0x0b, 0xac, 0x93, 0x02, 0xcc, 0x67, 0x6e, 0x94, 0x52, 0x9f, 0x9f, - 0x4b, 0x2a, 0x8e, 0xda, 0x5a, 0x70, 0x03, 0xfa, 0x51, 0xc1, 0xe7, 0xb6, 0x62, 0xe9, 0x6b, 0x8a, - 0xf4, 0x9c, 0x15, 0x2b, 0xb5, 0x11, 0x87, 0xdc, 0x57, 0x77, 0x83, 0x7d, 0x68, 0xc9, 0xb8, 0x95, - 0x54, 0xa0, 0x32, 0x2a, 0xd7, 0xef, 0x08, 0xe5, 0x6d, 0xe0, 0xcb, 0x5c, 0xc3, 0xfc, 0x79, 0x01, - 0xca, 0x5d, 0xf4, 0x03, 0xd5, 0xa7, 0xc2, 0x29, 0xfa, 0xf4, 0x40, 0xf5, 0x89, 0xbf, 0x8d, 0x5d, - 0x38, 0x9d, 0x0e, 0xf2, 0xaa, 0xbb, 0xd5, 0x06, 0x92, 0x56, 0x43, 0xc9, 0x77, 0x61, 0xa4, 0x5a, - 0x5d, 0x35, 0x1c, 0xfa, 0x52, 0x97, 0x43, 0x31, 0x06, 0xb9, 0x7d, 0x2a, 0x0f, 0x3e, 0xcd, 0x7f, - 0xcf, 0x5a, 0x86, 0x52, 0x9e, 0x06, 0x89, 0x0b, 0x0b, 0x8f, 0xad, 0xa5, 0x5d, 0x2c, 0xf1, 0x85, - 0xc5, 0x04, 0x5b, 0xef, 0xc1, 0x79, 0x45, 0xcd, 0x93, 0x76, 0x68, 0x0f, 0xff, 0xc5, 0xb1, 0x53, - 0x05, 0x18, 0x88, 0x01, 0xd6, 0x9f, 0xf5, 0xa7, 0x08, 0xab, 0xed, 0xa3, 0x23, 0x27, 0x78, 0x4e, - 0x2a, 0x26, 0x61, 0x5f, 0x57, 0x4d, 0x7f, 0xb1, 0xff, 0x67, 0xc7, 0xe5, 0x1e, 0x8d, 0x3b, 0x5b, - 0x8e, 0x71, 0x63, 0xf7, 0xea, 0x94, 0x5f, 0x49, 0xf5, 0xf2, 0xe0, 0x46, 0x06, 0x90, 0xec, 0xc1, - 0xb8, 0xd8, 0x32, 0xf1, 0xb7, 0x9c, 0xda, 0xb7, 0x93, 0x53, 0xdb, 0x68, 0xde, 0x4d, 0x83, 0x84, - 0x4f, 0x02, 0x93, 0x0d, 0xf9, 0x02, 0x26, 0xa4, 0x82, 0x24, 0x18, 0x73, 0x27, 0xa2, 0x3b, 0x9d, - 0x19, 0x9b, 0x34, 0x9c, 0x73, 0x82, 0x11, 0x6b, 0xb2, 0x5c, 0x63, 0x38, 0xe7, 0x81, 0xd3, 0x34, - 0xd9, 0x20, 0x11, 0x4d, 0x36, 0x60, 0x73, 0x3f, 0x00, 0x92, 0xee, 0x57, 0xb7, 0x59, 0x3c, 0xae, - 0xcd, 0xe2, 0xb9, 0x0a, 0x4c, 0x65, 0x74, 0xe0, 0x4c, 0x2c, 0x7e, 0x00, 0x24, 0xdd, 0xd2, 0xb3, - 0x70, 0xb0, 0xae, 0xc3, 0x1b, 0x4a, 0x04, 0x6a, 0x36, 0x18, 0x3c, 0xa5, 0xe1, 0xf9, 0x37, 0x7b, - 0xa1, 0xdc, 0x05, 0x95, 0xfc, 0x41, 0x21, 0x29, 0x6d, 0x3e, 0x1b, 0x3f, 0x48, 0x4a, 0x3b, 0x9b, - 0x3e, 0x43, 0xec, 0x8b, 0x1f, 0xfe, 0xf4, 0x2f, 0x5f, 0x58, 0xe1, 0x4f, 0x0f, 0xd9, 0xd9, 0xa5, - 0xd5, 0xaf, 0x4b, 0xcb, 0x86, 0x69, 0xe3, 0xa8, 0x74, 0x9a, 0x3d, 0xe3, 0x32, 0x80, 0x48, 0xf1, - 0xb9, 0xee, 0x1f, 0x08, 0xf5, 0x4c, 0x83, 0x58, 0xf7, 0x60, 0x26, 0xc1, 0x53, 0x18, 0xc3, 0xbf, - 0x0b, 0xea, 0x81, 0x37, 0x32, 0xed, 0x5b, 0x3c, 0xf7, 0x8b, 0xe3, 0xf2, 0x38, 0xd3, 0xa4, 0x6f, - 0xc6, 0xf1, 0xe3, 0xe5, 0x5f, 0xd6, 0x86, 0x6e, 0xce, 0xaf, 0x34, 0xf5, 0xc0, 0x37, 0xe4, 0x0e, - 0x0c, 0x72, 0x48, 0x22, 0x4a, 0xb3, 0x8e, 0x2d, 0xd6, 0x04, 0x81, 0x68, 0xcd, 0xe0, 0x73, 0x54, - 0xfc, 0x51, 0x89, 0xc3, 0x27, 0x58, 0xbb, 0x3c, 0x6b, 0x49, 0x0c, 0x56, 0x91, 0xa0, 0xfb, 0x2b, - 0x71, 0x98, 0x07, 0xe9, 0x7b, 0x21, 0xf1, 0x3c, 0xff, 0x59, 0x93, 0x36, 0x78, 0x46, 0xb8, 0xc5, - 0x31, 0xe1, 0x7b, 0xd1, 0xef, 0x30, 0x06, 0x48, 0x66, 0x7d, 0x0a, 0x33, 0x6c, 0x83, 0x0e, 0x92, - 0xf5, 0x61, 0xae, 0x02, 0x06, 0x33, 0x1d, 0xda, 0x1d, 0x06, 0x42, 0x87, 0x76, 0x51, 0x68, 0xad, - 0xc3, 0x05, 0x6e, 0x0c, 0xd4, 0xbb, 0x14, 0x9b, 0xde, 0x07, 0xf0, 0x77, 0xe2, 0x31, 0x63, 0x46, - 0xef, 0x39, 0x9e, 0xf5, 0x09, 0xbe, 0x96, 0x11, 0x93, 0xd4, 0xf5, 0xbd, 0xd8, 0xf2, 0x77, 0xba, - 0xe7, 0xb5, 0xff, 0x37, 0xcc, 0x57, 0x5a, 0x2d, 0xea, 0x35, 0x62, 0xc2, 0x9d, 0xc0, 0x39, 0x65, - 0xf0, 0x03, 0x52, 0x81, 0x01, 0xc4, 0x56, 0xf7, 0x96, 0xa2, 0xb9, 0x19, 0xcd, 0x41, 0x3c, 0x11, - 0xb6, 0x13, 0x2b, 0xe0, 0x94, 0x56, 0x03, 0x66, 0xab, 0xed, 0xfd, 0x23, 0x37, 0x42, 0x37, 0x78, - 0x0c, 0x20, 0x22, 0xeb, 0x5e, 0x93, 0x89, 0xa6, 0xb8, 0x30, 0xae, 0xc7, 0xaf, 0x2a, 0xd0, 0x93, - 0x5e, 0x04, 0x15, 0x79, 0x7a, 0xe7, 0x66, 0x4c, 0x8a, 0x56, 0x0f, 0x5e, 0x0b, 0x16, 0x8b, 0x64, - 0x54, 0xd6, 0x14, 0x9c, 0xd3, 0xef, 0x80, 0xf8, 0x0c, 0x99, 0x81, 0x29, 0xf3, 0x6e, 0x87, 0x83, - 0xbf, 0x86, 0x69, 0x6e, 0x7b, 0xe6, 0x61, 0xb7, 0x17, 0xe2, 0x08, 0xd3, 0xbd, 0x7b, 0x0b, 0x09, - 0xff, 0x7b, 0x74, 0xcb, 0x55, 0x09, 0x15, 0xf6, 0x16, 0xf8, 0x8b, 0xc7, 0xa7, 0x0b, 0xc6, 0x0d, - 0x62, 0xef, 0xde, 0xc2, 0xe2, 0x90, 0x08, 0x5f, 0xca, 0xb8, 0xf3, 0xe1, 0xff, 0x56, 0xb8, 0x2f, - 0xe0, 0x23, 0xfb, 0x55, 0xea, 0xe0, 0x83, 0x98, 0xec, 0xa7, 0xca, 0x13, 0xd0, 0xeb, 0x36, 0xe4, - 0x69, 0xdd, 0x6d, 0x58, 0x7f, 0x5c, 0x80, 0xeb, 0x5c, 0x07, 0xca, 0xa6, 0xc3, 0x8b, 0x9e, 0x1c, - 0x62, 0xf2, 0x3e, 0xf0, 0x74, 0xf0, 0x42, 0xd1, 0xb4, 0x44, 0xcb, 0x3b, 0x71, 0xe2, 0x04, 0xa4, - 0x02, 0x63, 0xfa, 0x93, 0x92, 0xd3, 0x85, 0x87, 0xb3, 0x47, 0x8f, 0x1e, 0x3b, 0xea, 0x99, 0xc9, - 0x13, 0xb8, 0xb8, 0xf2, 0x0d, 0x9b, 0x10, 0x62, 0x77, 0x12, 0x0a, 0x7b, 0xfc, 0x14, 0x76, 0x72, - 0x47, 0xcc, 0x18, 0xf3, 0x34, 0x9d, 0x04, 0xb3, 0xa3, 0xa9, 0xdc, 0xe0, 0x94, 0xd6, 0x3c, 0x62, - 0x1b, 0x30, 0xeb, 0xcf, 0x0a, 0x30, 0x9f, 0x5d, 0x9b, 0x58, 0x58, 0xd6, 0xe0, 0xdc, 0x92, 0xe3, - 0xf9, 0x9e, 0x5b, 0x77, 0x9a, 0xd5, 0xfa, 0x21, 0x6d, 0xb4, 0x55, 0x90, 0x53, 0xb5, 0xca, 0x1c, - 0x50, 0x4f, 0x92, 0x4b, 0x14, 0x3b, 0x4d, 0xc5, 0x0e, 0x65, 0xf8, 0x2a, 0x81, 0xaf, 0xbd, 0x4d, - 0x1a, 0x28, 0x7e, 0xbc, 0x65, 0x39, 0xa5, 0xe4, 0xb6, 0x34, 0xb2, 0x37, 0x76, 0x3d, 0x37, 0x52, - 0x44, 0xdc, 0xba, 0x92, 0x55, 0x64, 0xfd, 0xbb, 0x02, 0x5c, 0xc0, 0xbc, 0x46, 0x46, 0xa6, 0xc4, - 0x38, 0xd6, 0xaf, 0x0c, 0x57, 0x5b, 0x30, 0x5e, 0x59, 0x18, 0xd8, 0x66, 0xdc, 0x5a, 0xf2, 0x36, - 0xf4, 0x57, 0xa5, 0x93, 0xd4, 0x44, 0x22, 0x0d, 0xad, 0xa0, 0x60, 0xe5, 0x36, 0x62, 0xb1, 0x3d, - 0x67, 0x99, 0x86, 0x75, 0xea, 0x61, 0xbe, 0x60, 0x7e, 0xd8, 0xd7, 0x20, 0x71, 0xa8, 0xa2, 0xfe, - 0xbc, 0x50, 0x45, 0x03, 0x66, 0xa8, 0x22, 0xeb, 0x29, 0xcf, 0x6a, 0x94, 0xec, 0x90, 0x18, 0xa4, - 0x4f, 0x52, 0xe9, 0x85, 0xf9, 0x3e, 0x70, 0x3e, 0xab, 0x67, 0x7b, 0x77, 0x53, 0x99, 0x83, 0xf3, - 0x63, 0xeb, 0x6e, 0xc3, 0x6b, 0x06, 0x6e, 0xa5, 0xd9, 0xf4, 0x9f, 0xd1, 0xc6, 0x76, 0xe0, 0x1f, - 0xf9, 0x91, 0x91, 0xd5, 0x45, 0xe4, 0xd7, 0x8e, 0xaf, 0x51, 0xc4, 0xac, 0x4c, 0x80, 0xad, 0xff, - 0x0b, 0x5e, 0xef, 0xc2, 0x51, 0x74, 0xaa, 0x0a, 0xe7, 0x9c, 0x44, 0x99, 0xf4, 0x76, 0x79, 0x3d, - 0xab, 0x5f, 0x49, 0x46, 0xa1, 0x9d, 0xa6, 0xbf, 0xb1, 0x63, 0xa4, 0xe4, 0x25, 0x25, 0x98, 0xde, - 0xb6, 0xb7, 0x96, 0x77, 0x97, 0x76, 0x6a, 0x3b, 0x5f, 0x6c, 0xaf, 0xd4, 0x76, 0x37, 0x1f, 0x6e, - 0x6e, 0x3d, 0xda, 0xe4, 0xc1, 0xa9, 0x8d, 0x92, 0x9d, 0x95, 0xca, 0x46, 0xb1, 0x40, 0xa6, 0xa1, - 0x68, 0x80, 0x57, 0x76, 0x17, 0x8b, 0xbd, 0x37, 0xbe, 0x36, 0x52, 0xcd, 0x92, 0x79, 0x28, 0x55, - 0x77, 0xb7, 0xb7, 0xb7, 0x6c, 0xc5, 0x55, 0x0f, 0x8d, 0x3d, 0x03, 0xe7, 0x8c, 0xd2, 0x7b, 0xf6, - 0xca, 0x4a, 0xb1, 0xc0, 0x9a, 0x62, 0x80, 0xb7, 0xed, 0x95, 0x8d, 0xb5, 0xdd, 0x8d, 0x62, 0xef, - 0x8d, 0x9a, 0xfe, 0xb4, 0x8b, 0x5c, 0x84, 0xd9, 0xe5, 0x95, 0xbd, 0xb5, 0xa5, 0x95, 0x2c, 0xde, - 0xd3, 0x50, 0xd4, 0x0b, 0x77, 0xb6, 0x76, 0xb6, 0x39, 0x6b, 0x1d, 0xfa, 0x68, 0x65, 0xb1, 0xb2, - 0xbb, 0xb3, 0xba, 0x59, 0xec, 0xb3, 0xfa, 0x87, 0x7b, 0x8b, 0xbd, 0x37, 0x7e, 0x64, 0xbc, 0xfb, - 0x62, 0xcd, 0x17, 0xe8, 0xbb, 0xd5, 0xca, 0xfd, 0xfc, 0x2a, 0x78, 0xe9, 0xc6, 0xbd, 0x4a, 0xb1, - 0x40, 0x2e, 0xc1, 0x05, 0x03, 0xba, 0x5d, 0xa9, 0x56, 0x1f, 0x6d, 0xd9, 0xcb, 0xeb, 0x2b, 0xd5, - 0x6a, 0xb1, 0xf7, 0xc6, 0x9e, 0x11, 0x9e, 0x8d, 0xd5, 0xb0, 0x71, 0xaf, 0x52, 0xb3, 0x57, 0x3e, - 0xdb, 0x5d, 0xb3, 0x57, 0x96, 0xd3, 0x35, 0x18, 0xa5, 0x5f, 0xac, 0x54, 0x8b, 0x05, 0x32, 0x05, - 0x93, 0x06, 0x74, 0x73, 0xab, 0xd8, 0x7b, 0xe3, 0x0d, 0x11, 0xc1, 0x8b, 0x4c, 0x00, 0x2c, 0xaf, - 0x54, 0x97, 0x56, 0x36, 0x97, 0xd7, 0x36, 0xef, 0x17, 0x7b, 0xc8, 0x38, 0x8c, 0x54, 0xd4, 0xcf, - 0xc2, 0x8d, 0x0f, 0x61, 0x32, 0x71, 0xa2, 0x66, 0x18, 0xea, 0x30, 0x5a, 0xec, 0x41, 0xf1, 0xcb, - 0x9f, 0x68, 0xd6, 0xe4, 0x87, 0xe3, 0x62, 0xe1, 0xc6, 0xa2, 0x4c, 0x7d, 0xaa, 0x7d, 0xe7, 0x64, - 0x14, 0x86, 0x96, 0x57, 0xee, 0x55, 0x76, 0xd7, 0x77, 0x8a, 0x3d, 0xec, 0xc7, 0x92, 0xbd, 0x52, - 0xd9, 0x59, 0x59, 0x2e, 0x16, 0xc8, 0x08, 0x0c, 0x54, 0x77, 0x2a, 0x3b, 0x2b, 0xc5, 0x5e, 0x32, - 0x0c, 0xfd, 0xbb, 0xd5, 0x15, 0xbb, 0xd8, 0xb7, 0xf0, 0xaf, 0xff, 0xa0, 0xc0, 0x6d, 0x7b, 0xf2, - 0x0d, 0xd1, 0xd7, 0xda, 0x61, 0x52, 0x2c, 0x79, 0x22, 0xcf, 0x63, 0xee, 0xc9, 0x11, 0xb5, 0x80, - 0xb9, 0x0e, 0x97, 0x1d, 0x88, 0x70, 0xbd, 0x70, 0xbb, 0x40, 0x6c, 0x74, 0x0e, 0x49, 0x9c, 0xad, - 0x14, 0xe7, 0xec, 0xe3, 0xef, 0xdc, 0xa5, 0x8e, 0x47, 0x32, 0xf2, 0x6b, 0x60, 0xe9, 0x3c, 0x73, - 0x4e, 0x20, 0xdf, 0x3d, 0xdd, 0x49, 0x43, 0xd6, 0xf9, 0xc6, 0xe9, 0xd0, 0xc9, 0x03, 0x18, 0x67, - 0xba, 0xb9, 0x42, 0x23, 0x17, 0x93, 0x84, 0xda, 0x71, 0x60, 0x6e, 0x3e, 0xbb, 0x50, 0xa5, 0x62, - 0x19, 0xc3, 0x8e, 0xf0, 0x83, 0x75, 0x48, 0x64, 0x94, 0x07, 0x09, 0xe1, 0x2b, 0xfe, 0xdc, 0xb9, - 0x04, 0x78, 0xef, 0xce, 0xed, 0x02, 0xa9, 0x62, 0x88, 0x35, 0x43, 0xc9, 0x27, 0xf2, 0x51, 0x5b, - 0x5a, 0xfb, 0xe7, 0xad, 0x29, 0xab, 0xc4, 0x89, 0x39, 0xa7, 0x83, 0x4d, 0x20, 0x69, 0xdd, 0x99, - 0x5c, 0x89, 0xe7, 0x41, 0xb6, 0x5a, 0x3d, 0x77, 0x3e, 0xe5, 0xf3, 0xb7, 0xc2, 0xb4, 0x27, 0xb2, - 0x02, 0x13, 0xe2, 0x09, 0xb7, 0xd0, 0xe6, 0x49, 0xa7, 0xf3, 0x40, 0x2e, 0x9b, 0xfb, 0x28, 0x27, - 0x75, 0x22, 0x20, 0x73, 0x71, 0x3f, 0x92, 0xc7, 0x84, 0xb9, 0x8b, 0x99, 0x65, 0xa2, 0x7f, 0xf7, - 0x60, 0xc2, 0x3c, 0x5c, 0x10, 0x39, 0x40, 0x99, 0x67, 0x8e, 0xdc, 0x06, 0xd5, 0x60, 0x76, 0xc3, - 0x71, 0xf1, 0x8a, 0x42, 0x78, 0x96, 0x49, 0xbf, 0x30, 0x52, 0xee, 0xe0, 0x28, 0x56, 0xa5, 0x5e, - 0x43, 0x0d, 0x42, 0x5e, 0x58, 0x75, 0xfc, 0x6c, 0xaa, 0x52, 0x47, 0x36, 0xfd, 0xea, 0x88, 0x65, - 0x26, 0xc3, 0xcd, 0x72, 0x95, 0x9c, 0xcb, 0xf3, 0xee, 0x25, 0x1b, 0xa8, 0xa4, 0x27, 0x38, 0x6a, - 0x73, 0xe2, 0xcc, 0xec, 0x4a, 0x18, 0x48, 0x40, 0x4b, 0x22, 0x2e, 0x0a, 0x43, 0x92, 0x23, 0xb8, - 0x5c, 0x66, 0xb7, 0x0b, 0xe4, 0x6b, 0xfc, 0xaa, 0x33, 0xd9, 0x3d, 0x72, 0xa3, 0x43, 0xa1, 0xfd, - 0x5c, 0xcc, 0x64, 0x20, 0x3e, 0x94, 0x0e, 0xdc, 0x6d, 0x98, 0xce, 0x72, 0x28, 0x56, 0x02, 0xed, - 0xe0, 0x6d, 0x9c, 0x3b, 0x0b, 0x6c, 0x76, 0xd4, 0x68, 0xe4, 0x0f, 0x52, 0x07, 0x7f, 0xd6, 0x5c, - 0x9e, 0x1f, 0xc3, 0x04, 0x9b, 0x25, 0x0f, 0x29, 0x6d, 0x55, 0x9a, 0xee, 0x53, 0x1a, 0x12, 0x19, - 0x1f, 0x57, 0x81, 0xf2, 0x68, 0xaf, 0x17, 0xc8, 0x77, 0x60, 0xf4, 0x91, 0x13, 0xd5, 0x0f, 0x45, - 0x9c, 0x48, 0x19, 0x46, 0x12, 0x61, 0x73, 0xf2, 0x17, 0x16, 0xde, 0x2e, 0x90, 0xef, 0xc3, 0xd0, - 0x7d, 0x1a, 0xe1, 0xa3, 0xe2, 0xab, 0xca, 0xb7, 0x8e, 0xdb, 0x26, 0xd7, 0x3c, 0xf5, 0x72, 0x46, - 0x36, 0x38, 0x69, 0x40, 0x25, 0xb7, 0x00, 0xf8, 0x82, 0x80, 0x1c, 0x92, 0xc5, 0x73, 0xa9, 0x66, - 0x93, 0xfb, 0x4c, 0x79, 0x68, 0xd2, 0x88, 0x9e, 0xb6, 0xca, 0x3c, 0x19, 0xad, 0xc3, 0x84, 0xca, - 0x5e, 0xb3, 0x89, 0xe1, 0x3c, 0xac, 0x04, 0xb3, 0xf0, 0x0c, 0xdc, 0x3e, 0x64, 0x5f, 0x05, 0x4f, - 0xdd, 0x8a, 0x71, 0x1f, 0x70, 0x25, 0x9d, 0xd5, 0x83, 0x47, 0xe8, 0x4b, 0xa8, 0x14, 0x22, 0x47, - 0xd3, 0x68, 0x57, 0xfd, 0x30, 0x32, 0x69, 0x15, 0x24, 0x9b, 0xf6, 0x57, 0x61, 0x4e, 0xaf, 0xd7, - 0x0c, 0x54, 0x1c, 0xaf, 0xb9, 0x79, 0xf1, 0x8f, 0xe7, 0xae, 0x76, 0xc0, 0x10, 0xe7, 0xb7, 0xbe, - 0xdf, 0xee, 0x2d, 0xe0, 0x72, 0xb2, 0x0c, 0x53, 0xb2, 0xae, 0xad, 0x16, 0xf5, 0xaa, 0xd5, 0x55, - 0xcc, 0x54, 0x22, 0x3d, 0x39, 0x34, 0x98, 0xe4, 0x4e, 0xd2, 0x45, 0x6c, 0xeb, 0x33, 0xe2, 0x3b, - 0x90, 0x4e, 0x51, 0x1f, 0xe2, 0xad, 0x2f, 0x33, 0x82, 0xee, 0x43, 0x6e, 0x54, 0x32, 0x94, 0xff, - 0xbd, 0x05, 0xd2, 0xe1, 0x00, 0x34, 0x97, 0x73, 0x84, 0xb8, 0x5d, 0x20, 0x5f, 0x00, 0x49, 0x1f, - 0x49, 0x94, 0x08, 0x73, 0x8f, 0x5f, 0x4a, 0x84, 0x1d, 0xce, 0x33, 0x2b, 0x30, 0xa5, 0xa2, 0xbb, - 0xc4, 0xe5, 0x24, 0xa7, 0x2d, 0x1d, 0x76, 0xb0, 0x99, 0x0c, 0x36, 0x7b, 0x0b, 0x1d, 0x18, 0x65, - 0xc2, 0xc9, 0xa7, 0x30, 0x25, 0xe6, 0xbe, 0xd1, 0x9e, 0xa2, 0x5a, 0xc6, 0xc4, 0xe1, 0x26, 0xb7, - 0x25, 0x0f, 0x60, 0xa6, 0x9a, 0x10, 0x3c, 0xf7, 0x63, 0xbf, 0x60, 0xb2, 0x40, 0x60, 0x95, 0x46, - 0x5c, 0xf2, 0xd9, 0xbc, 0x1e, 0x02, 0xe1, 0xb6, 0x25, 0xc9, 0xee, 0xa9, 0x4b, 0x9f, 0x91, 0x4b, - 0x89, 0xa6, 0x33, 0x20, 0xa2, 0xe1, 0x3a, 0x98, 0xdb, 0xb3, 0x1d, 0x9e, 0xbf, 0x18, 0xa1, 0xc6, - 0x0d, 0xf8, 0x15, 0x83, 0xc0, 0xb8, 0x44, 0x17, 0xe3, 0x78, 0x21, 0x17, 0x83, 0xfc, 0x06, 0x46, - 0x67, 0xed, 0x7c, 0x3a, 0x23, 0xdf, 0xc9, 0x3a, 0x44, 0xe7, 0x9c, 0x2f, 0xe7, 0xde, 0x3e, 0x1d, - 0xb2, 0x3a, 0x0f, 0x8f, 0xdf, 0xa7, 0xd1, 0x76, 0xb3, 0x7d, 0xe0, 0x62, 0x66, 0x4b, 0xa2, 0x6c, - 0x4f, 0x0a, 0x24, 0xa6, 0xb7, 0x0c, 0x8a, 0x16, 0x17, 0x54, 0xe9, 0x8f, 0xc9, 0x1a, 0x14, 0xf9, - 0x36, 0xa2, 0xb1, 0xb8, 0x94, 0x62, 0x21, 0x50, 0x9c, 0xc0, 0x39, 0x0a, 0x73, 0x47, 0xeb, 0x16, - 0x77, 0x39, 0x22, 0xf2, 0xd3, 0xd6, 0xf5, 0xd4, 0x29, 0x03, 0xa6, 0x22, 0xd6, 0xb3, 0x11, 0xb1, - 0x69, 0x48, 0x23, 0x19, 0x06, 0x86, 0xe7, 0x35, 0xbd, 0x16, 0xeb, 0x0c, 0xe9, 0xd2, 0x78, 0x05, - 0x49, 0x84, 0x2c, 0xdb, 0xbb, 0x4b, 0x54, 0xae, 0xd7, 0x0c, 0xa6, 0x6f, 0x18, 0xaa, 0xcd, 0xd9, - 0xf8, 0xbe, 0x83, 0x5b, 0x19, 0x86, 0xbe, 0x99, 0x89, 0xdb, 0xc6, 0x7e, 0x4b, 0xaa, 0x71, 0x8d, - 0x6a, 0x6f, 0x01, 0x57, 0x46, 0xb6, 0xd7, 0x32, 0x4d, 0xb8, 0x1d, 0x04, 0xd4, 0xe3, 0xc4, 0x79, - 0x6a, 0x4b, 0x16, 0xf5, 0x27, 0xb8, 0x82, 0x69, 0xd4, 0xfc, 0xb9, 0x5d, 0x37, 0x16, 0x3c, 0x0f, - 0xcf, 0xed, 0x02, 0x79, 0x1f, 0x86, 0x45, 0x1b, 0x19, 0x91, 0xd1, 0xe8, 0xb0, 0x43, 0xab, 0x91, - 0x12, 0xb8, 0x90, 0xb0, 0xcd, 0x26, 0x4e, 0xde, 0xe8, 0xf3, 0x36, 0xbf, 0xcf, 0xf6, 0xec, 0xc6, - 0x8b, 0x50, 0x2e, 0xc9, 0xcd, 0x1b, 0x29, 0x4b, 0x2a, 0x12, 0x8b, 0x04, 0x75, 0xd9, 0x65, 0x39, - 0x13, 0xa6, 0x7e, 0x63, 0xcc, 0x41, 0x15, 0x3a, 0x4c, 0xa9, 0xdf, 0x06, 0xb8, 0xdb, 0x96, 0xbd, - 0x06, 0xc5, 0x4a, 0x1d, 0x37, 0x94, 0x2a, 0x3d, 0x72, 0x5a, 0x87, 0x7e, 0x40, 0xd5, 0xd9, 0x27, - 0x59, 0x20, 0x79, 0xcd, 0x28, 0x05, 0x45, 0x14, 0xac, 0x53, 0x07, 0x03, 0x33, 0xcf, 0x2a, 0x0d, - 0x25, 0x51, 0x94, 0x4d, 0xd1, 0xe1, 0xac, 0x33, 0xbd, 0xc4, 0x4e, 0x67, 0xcd, 0x97, 0x63, 0xf3, - 0x21, 0x2e, 0x18, 0x0a, 0x39, 0x54, 0x3b, 0x84, 0x02, 0xa9, 0x53, 0xa1, 0x7c, 0x79, 0xa3, 0x50, - 0x2b, 0xf2, 0xea, 0x39, 0x16, 0x4b, 0x1e, 0x75, 0x5e, 0xf5, 0xdf, 0x83, 0x89, 0x15, 0xb6, 0xa0, - 0xb7, 0x1b, 0x2e, 0x0f, 0x46, 0x4f, 0xcc, 0xe8, 0xe2, 0xb9, 0x84, 0xab, 0x32, 0xf5, 0x15, 0x92, - 0x0a, 0x0b, 0x82, 0xdc, 0x53, 0x34, 0x98, 0x1c, 0x8f, 0x69, 0xc9, 0x56, 0xe4, 0x03, 0xc0, 0x13, - 0xbe, 0x30, 0x19, 0xcc, 0x72, 0xc5, 0xb2, 0xd2, 0x6a, 0x35, 0xa5, 0x65, 0x9b, 0xdf, 0xd4, 0xbf, - 0x6e, 0x9c, 0x44, 0x53, 0xe5, 0x92, 0x77, 0x5a, 0xf7, 0xfc, 0x5c, 0x4b, 0x45, 0x9b, 0xc3, 0x33, - 0xa7, 0xbc, 0xdb, 0x5c, 0x54, 0xe1, 0xa3, 0x2b, 0xcd, 0x66, 0x8a, 0x38, 0x24, 0x6f, 0x99, 0xdc, - 0xb3, 0x70, 0xba, 0xd5, 0x80, 0x27, 0x7d, 0xae, 0xbc, 0x55, 0x5a, 0x2d, 0xbe, 0x58, 0x5e, 0x56, - 0x0b, 0x86, 0x59, 0x90, 0x3e, 0xe9, 0x27, 0xcb, 0xc5, 0xda, 0xfe, 0x00, 0xa7, 0x59, 0x9c, 0xaf, - 0x96, 0xe8, 0xe7, 0xe6, 0x64, 0xba, 0x5e, 0xa5, 0xcb, 0x25, 0x0a, 0xd5, 0x3e, 0x31, 0x99, 0x48, - 0xdd, 0xaf, 0x0c, 0x3c, 0xa9, 0x94, 0xfe, 0x9c, 0xdf, 0xe5, 0xbc, 0x62, 0x65, 0x70, 0x2d, 0x26, - 0x73, 0x82, 0xab, 0x2e, 0xe7, 0xe4, 0x9a, 0x57, 0x5d, 0xce, 0x4d, 0x26, 0xfe, 0x00, 0x8a, 0xc9, - 0x74, 0xc4, 0x8a, 0x69, 0x4e, 0x9e, 0xe2, 0xdc, 0x31, 0xb9, 0x07, 0xd3, 0xfa, 0x88, 0xaa, 0x7e, - 0xe7, 0xad, 0xfe, 0x79, 0x7c, 0x76, 0x60, 0x26, 0x33, 0x7b, 0xb0, 0xda, 0x62, 0x3b, 0xe5, 0x16, - 0xce, 0xe5, 0x4a, 0xe1, 0x7c, 0x76, 0x02, 0x71, 0xf2, 0x9a, 0x69, 0x3f, 0xc8, 0x4e, 0xa7, 0x3c, - 0xf7, 0x7a, 0x17, 0x2c, 0x21, 0xd0, 0xaf, 0x71, 0x07, 0x4c, 0xd5, 0x71, 0x55, 0xb3, 0x28, 0xe4, - 0x54, 0x60, 0x75, 0x42, 0x51, 0x73, 0x60, 0x3a, 0xa3, 0x38, 0x5f, 0xc4, 0xd7, 0xf2, 0x79, 0xc6, - 0x13, 0x6b, 0x4f, 0x46, 0x49, 0xce, 0x95, 0x4c, 0xc7, 0x44, 0xd3, 0x1d, 0x8e, 0xa4, 0x73, 0x6a, - 0x3e, 0x9c, 0xbe, 0xc9, 0x79, 0xdc, 0x1a, 0xca, 0xfa, 0x63, 0x64, 0x81, 0x4e, 0x5a, 0x7f, 0xb2, - 0xb2, 0x57, 0x2b, 0x31, 0x74, 0xca, 0x8f, 0xce, 0x77, 0xe3, 0xaf, 0xb8, 0x39, 0xc8, 0xac, 0x42, - 0x37, 0x07, 0x65, 0xf2, 0xbf, 0x92, 0x8f, 0xa0, 0x33, 0x77, 0xf8, 0xdd, 0x6f, 0x22, 0x8d, 0x35, - 0xd1, 0x4f, 0x5c, 0xd9, 0x29, 0xae, 0xd5, 0xdc, 0xc8, 0x44, 0xd1, 0xab, 0x78, 0x24, 0xbf, 0xc1, - 0x1c, 0x29, 0x75, 0xc8, 0xf1, 0xdd, 0x59, 0x4d, 0xd9, 0x82, 0x52, 0x3c, 0x98, 0x89, 0x0e, 0x9c, - 0x71, 0x28, 0xa5, 0x30, 0x2e, 0xe4, 0x66, 0xf6, 0x26, 0x6f, 0xa6, 0xbe, 0xf4, 0x1c, 0xc1, 0x74, - 0xac, 0x82, 0xaf, 0xe7, 0x5a, 0xd4, 0xe5, 0x8b, 0xb1, 0x2d, 0x58, 0x4f, 0x02, 0x9e, 0x5a, 0xcf, - 0x33, 0x32, 0x84, 0xdf, 0x47, 0xbd, 0x58, 0xcb, 0xf2, 0x9d, 0xdb, 0xeb, 0x4b, 0x59, 0x7c, 0xc2, - 0xf4, 0x8a, 0xab, 0xb5, 0x4b, 0xea, 0x69, 0xc9, 0x82, 0xb3, 0xac, 0xb8, 0xa7, 0x69, 0x5a, 0x1e, - 0x9f, 0x65, 0x18, 0xd5, 0xd2, 0x83, 0x93, 0x0b, 0x86, 0x98, 0x8c, 0x3d, 0x74, 0xce, 0xe8, 0x9c, - 0xb9, 0x7d, 0x2e, 0xa1, 0x45, 0x5a, 0x25, 0x19, 0xcf, 0x6d, 0xc5, 0xc5, 0x34, 0x0f, 0xc3, 0x1a, - 0xad, 0xa4, 0xc0, 0x5b, 0x33, 0x9f, 0x14, 0x8e, 0xd1, 0xa0, 0xfc, 0x2e, 0x11, 0x5d, 0x34, 0x5d, - 0x9a, 0x94, 0xaf, 0xbf, 0x4e, 0x89, 0x1c, 0xa4, 0x98, 0x2a, 0x45, 0x46, 0xec, 0x3b, 0xaf, 0x4c, - 0x6b, 0x1a, 0xb4, 0x83, 0xa5, 0x63, 0x1b, 0x1f, 0x7e, 0x64, 0xe4, 0x4b, 0x57, 0x2b, 0x6c, 0xc7, - 0x74, 0xea, 0x19, 0xba, 0x9b, 0x5a, 0xb3, 0x73, 0x39, 0x76, 0x4c, 0xa0, 0x9e, 0xdb, 0xd2, 0x1f, - 0x6a, 0x6b, 0x76, 0x2a, 0x2b, 0x3a, 0xb9, 0x9e, 0x54, 0xdc, 0xf2, 0x12, 0xa7, 0x77, 0xd8, 0x13, - 0xa6, 0xb3, 0x12, 0xaa, 0x6b, 0xe6, 0xe1, 0xdc, 0x6c, 0xeb, 0x19, 0x52, 0xb0, 0xe5, 0xfc, 0xcf, - 0xe1, 0xd6, 0x21, 0xbd, 0x7a, 0x6e, 0x0b, 0xbf, 0xd4, 0x16, 0xba, 0x44, 0x1a, 0x74, 0x75, 0x1c, - 0xef, 0x92, 0x27, 0x3d, 0x97, 0xf7, 0x26, 0x3e, 0x15, 0x4a, 0xe7, 0x30, 0x57, 0x9a, 0x4d, 0xa7, - 0x0c, 0xe7, 0x99, 0xd6, 0xe3, 0x99, 0x74, 0x17, 0x19, 0xbf, 0xf3, 0x09, 0xdb, 0x6f, 0xb7, 0x86, - 0x7d, 0x2d, 0x17, 0xe3, 0x8c, 0xdc, 0xe7, 0x89, 0xc5, 0x38, 0x3f, 0x3b, 0x7a, 0x87, 0x63, 0xd0, - 0x64, 0xd5, 0x3d, 0xf0, 0xb4, 0xd4, 0xe5, 0xea, 0x10, 0x94, 0xce, 0xa6, 0xae, 0x96, 0x98, 0xac, - 0x4c, 0xe7, 0x5b, 0x4c, 0xff, 0xe1, 0xda, 0xbb, 0x9e, 0x84, 0x9a, 0xcc, 0xe5, 0xe7, 0xde, 0x56, - 0xcb, 0x4d, 0x66, 0xd6, 0x6a, 0x8d, 0xa1, 0x9e, 0x01, 0x5a, 0x31, 0xcc, 0x48, 0x46, 0xad, 0x18, - 0x66, 0xa6, 0x8c, 0xbe, 0x85, 0x56, 0x17, 0xdb, 0x6f, 0x52, 0xdd, 0xea, 0xa2, 0xa5, 0x14, 0x4e, - 0x18, 0x3d, 0xc8, 0x47, 0x68, 0xf2, 0xe8, 0x6c, 0x27, 0x99, 0x35, 0x39, 0xe9, 0x9e, 0x25, 0x23, - 0x2a, 0x5f, 0xb3, 0xb2, 0xb1, 0x27, 0x53, 0x46, 0xcf, 0x95, 0xd2, 0x05, 0x82, 0xfe, 0x5d, 0x69, - 0x35, 0xc1, 0x06, 0x97, 0x4c, 0x6b, 0x53, 0x7e, 0x9b, 0xdf, 0x95, 0x26, 0x13, 0x83, 0x2c, 0x95, - 0xad, 0x39, 0x49, 0xf6, 0x3d, 0x18, 0x8b, 0x33, 0x33, 0xef, 0x2d, 0x68, 0x84, 0x89, 0x74, 0xcd, - 0x49, 0xc2, 0xf7, 0xe5, 0xb5, 0x0a, 0xd6, 0x67, 0x16, 0x76, 0x56, 0x01, 0x3e, 0x91, 0x26, 0x1a, - 0xa3, 0xa5, 0xa9, 0x3c, 0xcf, 0x1d, 0x56, 0xee, 0x31, 0x3d, 0x9d, 0xa4, 0x9a, 0x17, 0x19, 0x09, - 0x61, 0xd5, 0xbc, 0xc8, 0x4a, 0xe8, 0x1a, 0x5f, 0x3b, 0x7c, 0x21, 0xed, 0x11, 0x31, 0xd3, 0x4b, - 0x46, 0xb3, 0x52, 0x7c, 0x2f, 0xe7, 0x15, 0x27, 0x59, 0x57, 0xa1, 0x98, 0xcc, 0x7d, 0xa9, 0x0e, - 0x73, 0x39, 0x49, 0x4a, 0xd5, 0x09, 0x31, 0x37, 0x69, 0xe6, 0xb6, 0x34, 0xae, 0x9b, 0x7c, 0xaf, - 0x66, 0x37, 0x4a, 0x67, 0x9d, 0x6f, 0x6d, 0x1f, 0x37, 0xd2, 0x60, 0xea, 0xc7, 0xec, 0x54, 0x9a, - 0x4d, 0x5d, 0x2d, 0xcb, 0xc8, 0x9c, 0xe9, 0xca, 0x60, 0x4f, 0xd9, 0xd9, 0xb8, 0xdf, 0x32, 0xcf, - 0xbf, 0x1d, 0x62, 0xa6, 0x77, 0xbd, 0x82, 0x26, 0xbf, 0x02, 0xb3, 0x39, 0xe1, 0xa5, 0xc9, 0xeb, - 0x09, 0x33, 0x6d, 0x76, 0xf8, 0x69, 0x35, 0x41, 0x32, 0xf3, 0x53, 0x6f, 0xa0, 0xef, 0x82, 0x11, - 0xd6, 0x21, 0x75, 0x1f, 0xf8, 0xc8, 0x8d, 0x0e, 0x79, 0x1a, 0x66, 0x6d, 0xcd, 0xcd, 0x8c, 0x07, - 0x41, 0xaa, 0x78, 0x90, 0x31, 0xa0, 0x19, 0x57, 0x82, 0x19, 0x0c, 0xe7, 0xb2, 0x19, 0xb2, 0xb5, - 0x83, 0xcd, 0x85, 0x8c, 0x98, 0x1b, 0x6a, 0x2e, 0xe4, 0xc7, 0xe3, 0xc8, 0x6d, 0xe6, 0xb6, 0x54, - 0xb0, 0xb2, 0x39, 0xe6, 0x87, 0xdf, 0xc8, 0xe5, 0xf8, 0x80, 0x71, 0x4c, 0x45, 0xd4, 0x20, 0x39, - 0xe8, 0x9d, 0x57, 0x0f, 0x5b, 0xee, 0xd7, 0x26, 0xd5, 0x82, 0xd6, 0xbe, 0xbc, 0xd8, 0x1d, 0xb9, - 0xed, 0x5b, 0x91, 0xdf, 0x53, 0x76, 0xfb, 0x4e, 0xbb, 0x63, 0xab, 0xcb, 0xb3, 0x44, 0x50, 0x17, - 0xa3, 0xa3, 0x1a, 0x7c, 0x2e, 0x07, 0x4e, 0x36, 0xd1, 0x19, 0x29, 0x09, 0xd5, 0x4e, 0xb4, 0xd9, - 0x51, 0x63, 0x72, 0xf9, 0xf1, 0x79, 0x6c, 0x44, 0xdd, 0x38, 0xcb, 0x3c, 0x4e, 0x84, 0xeb, 0x10, - 0xf3, 0xd8, 0x80, 0x9e, 0x6d, 0x1e, 0x27, 0x18, 0x9a, 0xf3, 0x38, 0xd9, 0xcc, 0xa4, 0x99, 0x20, - 0x77, 0x54, 0x93, 0xcd, 0x54, 0xf3, 0x38, 0x9b, 0x63, 0x7e, 0x74, 0x94, 0x5c, 0x8e, 0x6a, 0x1e, - 0x9b, 0x1c, 0x73, 0xd0, 0x4f, 0x39, 0x8f, 0x93, 0x95, 0x98, 0xf3, 0xf8, 0x4c, 0xed, 0x53, 0xf3, - 0x38, 0xbb, 0x7d, 0x67, 0x9e, 0xc7, 0x89, 0x70, 0x42, 0x46, 0x47, 0xb3, 0xe6, 0x71, 0x12, 0x9f, - 0xcf, 0xe3, 0x24, 0x34, 0x61, 0x99, 0xe9, 0x30, 0x8f, 0x93, 0x94, 0x9f, 0x21, 0xbf, 0x44, 0x28, - 0x94, 0xd3, 0xcc, 0xe4, 0xdc, 0x28, 0x2a, 0xe4, 0x11, 0xda, 0x06, 0x13, 0xf0, 0xd3, 0xcd, 0xe6, - 0xf9, 0x3c, 0xa6, 0x38, 0x9f, 0xf7, 0xa4, 0x10, 0x93, 0xcd, 0x35, 0x0d, 0x5f, 0xd9, 0x91, 0x60, - 0x3a, 0x34, 0x78, 0x8f, 0xcd, 0x9b, 0x46, 0x07, 0xbe, 0x9d, 0x02, 0xd9, 0x74, 0xe0, 0xab, 0xce, - 0x41, 0x49, 0xbe, 0xb9, 0x24, 0x9d, 0xe7, 0xf7, 0xe7, 0xf2, 0x76, 0x24, 0x49, 0xb7, 0x90, 0x38, - 0x59, 0x9d, 0xb9, 0xa5, 0xea, 0x84, 0x95, 0x6c, 0xe9, 0x59, 0xe7, 0xf9, 0x86, 0xd4, 0x1e, 0x52, - 0x11, 0xb0, 0x12, 0x9d, 0xd6, 0xe7, 0x7a, 0x6e, 0x09, 0xd9, 0x41, 0x43, 0x70, 0x1a, 0xae, 0x19, - 0x91, 0xf3, 0x42, 0x6d, 0x75, 0xe5, 0x9a, 0x8a, 0xe5, 0xa3, 0x73, 0xcd, 0x0b, 0xf4, 0xa3, 0xb8, - 0xa6, 0xa9, 0x3f, 0x45, 0xd3, 0x99, 0x78, 0xf1, 0xe5, 0x3d, 0xf6, 0xf3, 0xcf, 0x39, 0x53, 0x86, - 0xc3, 0x14, 0xc3, 0x45, 0x3f, 0xb5, 0x8f, 0xc5, 0xf5, 0x9f, 0x04, 0xe6, 0x0a, 0x3f, 0x8b, 0x9e, - 0x7c, 0x0a, 0x45, 0xb1, 0xbc, 0xc5, 0x0c, 0xb2, 0x10, 0x73, 0x87, 0x6e, 0x51, 0x5a, 0xec, 0x4e, - 0xd1, 0x82, 0xd3, 0x58, 0xea, 0x4e, 0x23, 0x89, 0x7c, 0xb3, 0x16, 0xdb, 0x0e, 0x77, 0x82, 0x76, - 0x18, 0xd1, 0x46, 0xda, 0x1c, 0x65, 0x36, 0x46, 0xba, 0x55, 0x98, 0xe8, 0x7b, 0x0b, 0x64, 0x0d, - 0xd7, 0x36, 0x13, 0xdc, 0xc9, 0x5e, 0x97, 0xcd, 0x06, 0x97, 0x9e, 0x55, 0xf5, 0xb4, 0xc8, 0x6c, - 0x53, 0x5e, 0xdd, 0xf9, 0x8d, 0x52, 0x22, 0x3a, 0x65, 0xef, 0xf2, 0x44, 0xc4, 0x0f, 0xd4, 0xdc, - 0x76, 0xd8, 0x4d, 0x32, 0xc9, 0xc7, 0x4e, 0xe4, 0x07, 0x30, 0x22, 0x89, 0xbb, 0x0b, 0x24, 0x49, - 0x8d, 0x02, 0x59, 0x86, 0x71, 0xe3, 0x25, 0x97, 0x3a, 0xdd, 0x64, 0xbd, 0xef, 0xea, 0x30, 0xce, - 0xe3, 0xc6, 0x8b, 0x2d, 0xc5, 0x25, 0xeb, 0x1d, 0x57, 0x2e, 0x97, 0xef, 0xc3, 0xa8, 0x10, 0x69, - 0x47, 0x69, 0xe4, 0x1b, 0xeb, 0x66, 0x34, 0xaf, 0xe8, 0x76, 0xc3, 0x8d, 0x96, 0x7c, 0xef, 0xb1, - 0x7b, 0xd0, 0x55, 0x30, 0x69, 0x92, 0xbd, 0x05, 0xf2, 0x15, 0x26, 0x2d, 0x96, 0xa9, 0xa4, 0x69, - 0xf4, 0xcc, 0x0f, 0x9e, 0xb8, 0xde, 0x41, 0x17, 0x96, 0x57, 0x4c, 0x96, 0x49, 0x3a, 0xe9, 0x78, - 0xf2, 0x15, 0xcc, 0x55, 0xf3, 0x99, 0x77, 0x65, 0xd2, 0x79, 0x7b, 0xa9, 0xc2, 0x3c, 0xba, 0xde, - 0x9c, 0xb5, 0xed, 0x1d, 0x99, 0x7e, 0xc1, 0x83, 0x28, 0x4a, 0x43, 0x7f, 0xdd, 0x0f, 0x1a, 0xdd, - 0x39, 0x96, 0x4d, 0x67, 0xde, 0x04, 0x99, 0x14, 0xc6, 0x17, 0x70, 0xa1, 0x9a, 0xcb, 0xba, 0x1b, - 0x8b, 0x6e, 0x9a, 0xe4, 0x45, 0x14, 0xc5, 0x19, 0xdb, 0xdd, 0x91, 0xe7, 0x1a, 0xae, 0x69, 0x6c, - 0x1f, 0xda, 0x0e, 0xe8, 0x63, 0x1a, 0xa0, 0xcb, 0x78, 0x37, 0x67, 0x69, 0x13, 0x5d, 0xf6, 0x7c, - 0x0d, 0xce, 0x55, 0x53, 0xac, 0xf2, 0x48, 0xba, 0x5d, 0x1e, 0x4d, 0x61, 0x4f, 0x4f, 0xd9, 0xae, - 0x2e, 0x2e, 0x46, 0xa3, 0xf7, 0x69, 0xb4, 0xbb, 0xd6, 0x45, 0x4a, 0xf2, 0x4d, 0x83, 0x44, 0xdc, - 0xbb, 0xc3, 0x28, 0xab, 0x1a, 0x65, 0x1a, 0x23, 0xf7, 0xe3, 0xfd, 0x81, 0xbc, 0x48, 0xe9, 0x5a, - 0x6d, 0x1e, 0x87, 0xbb, 0xb8, 0x16, 0x0a, 0xb7, 0x69, 0xcd, 0x04, 0xc9, 0x21, 0xb1, 0xa9, 0x4e, - 0xf3, 0xa0, 0x0e, 0x49, 0x85, 0x1f, 0xff, 0xf8, 0xf4, 0x10, 0xb0, 0xcb, 0x29, 0x77, 0xfa, 0x8e, - 0x2c, 0xb8, 0x09, 0x75, 0xdd, 0xaf, 0x3f, 0xd1, 0x4d, 0xa8, 0x5a, 0x5a, 0xfb, 0x39, 0x33, 0xe9, - 0xbc, 0x58, 0xf1, 0x31, 0xf3, 0xbc, 0xee, 0x35, 0xa6, 0x27, 0xb6, 0xd7, 0x4d, 0xa8, 0x66, 0x0a, - 0xfe, 0xbb, 0xd2, 0xb6, 0x88, 0x15, 0x9a, 0x9c, 0x73, 0x45, 0xa3, 0xcc, 0x8a, 0x48, 0x64, 0x9a, - 0x15, 0xf5, 0x86, 0xe6, 0x5f, 0x04, 0x90, 0x74, 0x0e, 0x7e, 0x75, 0x58, 0xc9, 0x4d, 0xcf, 0xdf, - 0xc1, 0xf9, 0x6b, 0x4a, 0xb8, 0x0c, 0x19, 0x82, 0x57, 0x81, 0x88, 0xd3, 0x65, 0xb1, 0x28, 0x75, - 0x4f, 0xa6, 0xdb, 0x05, 0xb2, 0x09, 0xe7, 0xef, 0xd3, 0x48, 0xac, 0x71, 0x36, 0x0d, 0xa3, 0xc0, - 0xad, 0x47, 0x1d, 0x6f, 0x15, 0xe5, 0xd9, 0x24, 0x83, 0x66, 0xef, 0x1d, 0xc6, 0xaf, 0x9a, 0xcd, - 0xaf, 0x23, 0x5d, 0x07, 0xff, 0x5a, 0x71, 0x55, 0x71, 0x96, 0x26, 0xe6, 0x4f, 0xf1, 0x21, 0xee, - 0xbe, 0x93, 0x4f, 0x5a, 0x8c, 0xa3, 0x9e, 0x88, 0xd3, 0xd6, 0x4d, 0x18, 0xe4, 0x44, 0xb9, 0x1b, - 0xea, 0x98, 0x4e, 0x43, 0xee, 0xc0, 0x88, 0xf2, 0xbf, 0x21, 0x46, 0x51, 0x6e, 0xbb, 0xee, 0xc0, - 0x08, 0x3f, 0x5a, 0x9d, 0x9e, 0xe4, 0x23, 0x18, 0x51, 0x0e, 0x3b, 0x67, 0xde, 0xe9, 0x3f, 0x85, - 0x71, 0xdd, 0x75, 0xe7, 0xec, 0x82, 0xfc, 0x3e, 0xde, 0xfd, 0xca, 0x2b, 0x96, 0x7c, 0xfa, 0x99, - 0x44, 0xa6, 0x2f, 0x21, 0x52, 0xbe, 0x40, 0x4a, 0x60, 0x6e, 0xf3, 0xcf, 0xa5, 0xa8, 0xc9, 0x47, - 0xf2, 0x35, 0x95, 0x22, 0x4e, 0x23, 0x75, 0x90, 0xd9, 0x04, 0x17, 0xf3, 0x8b, 0x10, 0xab, 0x05, - 0xb6, 0x6b, 0xb3, 0x4f, 0x73, 0x47, 0xdd, 0x5d, 0x74, 0x79, 0x5c, 0xb6, 0x50, 0x4b, 0x4b, 0xe5, - 0xa0, 0xcb, 0x67, 0x74, 0x39, 0x3f, 0x6d, 0x1d, 0x0e, 0xc6, 0x03, 0x3c, 0x05, 0xa6, 0x4a, 0x73, - 0xbb, 0xd7, 0x21, 0x0d, 0x5e, 0x7c, 0xec, 0x4d, 0xb3, 0xeb, 0x40, 0xd6, 0xe9, 0x14, 0x2d, 0xde, - 0x88, 0xbe, 0x12, 0x76, 0x6b, 0xd2, 0x03, 0xf2, 0xf4, 0x9d, 0xcd, 0x6f, 0xd9, 0xc5, 0x8c, 0x5b, - 0xf1, 0xae, 0x63, 0x91, 0xc7, 0xee, 0x57, 0x50, 0x3b, 0xcc, 0x0c, 0x06, 0x96, 0xcf, 0xec, 0xba, - 0xe6, 0x58, 0x91, 0x49, 0xa9, 0x36, 0xbd, 0x27, 0xf8, 0x4c, 0x2d, 0x3b, 0x4b, 0xdf, 0x1b, 0x5d, - 0xb8, 0x48, 0x49, 0xbc, 0xd9, 0x15, 0x4f, 0xdd, 0xb1, 0x5e, 0xe4, 0x3b, 0x6c, 0x76, 0x7d, 0x5d, - 0xb2, 0x0e, 0x66, 0x5c, 0x7b, 0x2b, 0xf7, 0xd2, 0x6c, 0x86, 0xa6, 0x7b, 0x69, 0xc7, 0x3e, 0xe4, - 0x89, 0xff, 0x33, 0x28, 0xc7, 0xde, 0x23, 0x67, 0x1b, 0x84, 0x7c, 0xaf, 0x46, 0x92, 0x92, 0x54, - 0x48, 0x3a, 0xa5, 0xe1, 0x99, 0xbb, 0x9a, 0x27, 0xe1, 0x50, 0x73, 0x4b, 0x12, 0x5e, 0x71, 0x89, - 0x7c, 0x95, 0x79, 0x99, 0x2f, 0x3b, 0xd8, 0x61, 0xc5, 0xbb, 0xbd, 0x57, 0xc2, 0x28, 0x3d, 0xda, - 0x67, 0x67, 0xa4, 0x9c, 0x3b, 0x12, 0x8c, 0xac, 0x0e, 0xc3, 0xdb, 0xfd, 0xea, 0xb1, 0x94, 0x33, - 0xae, 0x67, 0x1f, 0x50, 0x27, 0x7e, 0xab, 0x96, 0x88, 0x1d, 0xa8, 0xbf, 0x0f, 0x4e, 0x17, 0x25, - 0x1f, 0x5a, 0x65, 0x61, 0x28, 0x8f, 0xaa, 0x92, 0xac, 0x82, 0xc1, 0xd9, 0x51, 0xc4, 0x0f, 0xdc, - 0xe8, 0xf9, 0x92, 0xbd, 0x1e, 0x9b, 0x15, 0xf4, 0x02, 0xc9, 0x1b, 0x64, 0xa1, 0xbd, 0x4e, 0xbe, - 0xc4, 0xa5, 0x44, 0xb0, 0x5f, 0xf4, 0xfd, 0x28, 0x8c, 0x02, 0xa7, 0x55, 0xad, 0x07, 0x6e, 0x2b, - 0xca, 0xed, 0x74, 0xec, 0x00, 0x9e, 0x45, 0xa6, 0xf9, 0xa3, 0x8a, 0xd8, 0xf2, 0x59, 0xd1, 0x77, - 0xd4, 0x9b, 0x9c, 0xac, 0xc2, 0x0e, 0x27, 0x97, 0xaa, 0x8c, 0x26, 0xff, 0x2a, 0x99, 0xd6, 0x60, - 0x36, 0x27, 0x66, 0x91, 0xba, 0xbd, 0xed, 0x1c, 0xd3, 0x68, 0xae, 0x73, 0xc5, 0xe4, 0x2b, 0x98, - 0xc9, 0x0c, 0x6a, 0xa4, 0x2c, 0xd0, 0x9d, 0x42, 0x1e, 0x75, 0x63, 0xfe, 0x04, 0x4a, 0xfc, 0x35, - 0x08, 0x3a, 0x3d, 0x1b, 0xf1, 0x6d, 0xe2, 0x37, 0x42, 0x39, 0x08, 0xc9, 0xf5, 0x3a, 0x1f, 0x4f, - 0x3d, 0x78, 0x9f, 0xc6, 0xc0, 0x26, 0x89, 0x74, 0xe8, 0xea, 0xc3, 0xcb, 0x2a, 0xec, 0xf4, 0x10, - 0x69, 0x1b, 0x66, 0xf6, 0x68, 0xe0, 0x3e, 0x7e, 0x9e, 0x64, 0x28, 0x25, 0x93, 0x59, 0xda, 0x89, - 0xe3, 0xe7, 0x30, 0xbb, 0xe4, 0x1f, 0xb5, 0xc4, 0x93, 0x3f, 0x83, 0xa7, 0xba, 0x8a, 0xcf, 0x2e, - 0xef, 0xee, 0x08, 0x35, 0x97, 0x9f, 0xb8, 0x5e, 0xf9, 0xbf, 0x75, 0xcd, 0x6d, 0xaf, 0x1e, 0xae, - 0x99, 0xf4, 0x3b, 0x38, 0x09, 0xb3, 0x32, 0xd9, 0xeb, 0x93, 0xb0, 0x43, 0xa6, 0xfb, 0x9c, 0x07, - 0x64, 0xb3, 0x39, 0xc9, 0xeb, 0x3b, 0x70, 0x3d, 0x45, 0x6b, 0x37, 0xe5, 0xde, 0x62, 0xa6, 0xf9, - 0x4e, 0x78, 0x5c, 0x67, 0xe6, 0x00, 0xcf, 0x6c, 0xa7, 0x16, 0xd9, 0xa1, 0xd9, 0xec, 0xa0, 0x62, - 0x11, 0x3d, 0xb4, 0x03, 0xc3, 0x44, 0x23, 0xfe, 0xb8, 0x4e, 0xdb, 0x69, 0xb5, 0x4e, 0x11, 0xa3, - 0x52, 0xfb, 0x21, 0x8c, 0x55, 0xf5, 0xca, 0x33, 0x2a, 0xc9, 0x9d, 0x14, 0xea, 0x09, 0x51, 0xf7, - 0xb6, 0x77, 0x70, 0x24, 0x55, 0x1b, 0xcf, 0xa9, 0x7a, 0x91, 0xeb, 0x3a, 0x63, 0xe4, 0x6c, 0x53, - 0xbb, 0x40, 0x56, 0x4a, 0x45, 0xe5, 0x3a, 0x93, 0x9d, 0xe6, 0xad, 0xc6, 0xb3, 0xcc, 0x24, 0x33, - 0x66, 0x12, 0xab, 0x7b, 0x6a, 0x5a, 0xe5, 0x50, 0xdf, 0x31, 0xe5, 0x26, 0xf7, 0xf3, 0x89, 0xb3, - 0xd4, 0xe9, 0x7e, 0x3e, 0xa9, 0xdc, 0x77, 0xba, 0x9f, 0x4f, 0x46, 0x62, 0xbb, 0x15, 0xe4, 0x15, - 0xa7, 0xe7, 0xe9, 0x60, 0x8c, 0x50, 0x6c, 0x32, 0xb2, 0x00, 0x3d, 0xd4, 0x03, 0x84, 0xf0, 0xa4, - 0x3e, 0x1d, 0x6c, 0xad, 0xc9, 0xc0, 0x20, 0x89, 0x2c, 0x40, 0xf7, 0xa0, 0xc8, 0xf3, 0x1b, 0xc4, - 0x31, 0x15, 0x63, 0xbf, 0xc1, 0x74, 0xda, 0x85, 0x0e, 0x83, 0x5a, 0x4c, 0x46, 0xa3, 0x53, 0x26, - 0xb3, 0x9c, 0x30, 0x75, 0x1d, 0xa6, 0x2a, 0xc4, 0x31, 0xe7, 0x94, 0x61, 0x2a, 0x15, 0x86, 0x6e, - 0xee, 0x42, 0x46, 0x89, 0x52, 0x29, 0xc7, 0xf4, 0x08, 0x75, 0xaa, 0x4b, 0x19, 0x61, 0xeb, 0xe6, - 0x2e, 0x66, 0x96, 0x09, 0x46, 0x11, 0xcf, 0xce, 0x9c, 0x9d, 0x53, 0x3a, 0x7e, 0x05, 0xd6, 0x01, - 0x47, 0x56, 0x73, 0xe3, 0x34, 0xa8, 0xa2, 0x56, 0xaa, 0x92, 0x13, 0x65, 0x24, 0xb2, 0x7e, 0x33, - 0xe3, 0xa1, 0x86, 0x81, 0x11, 0x7b, 0x83, 0x75, 0xce, 0xaa, 0x4d, 0x1e, 0xc9, 0x64, 0x31, 0x39, - 0x35, 0x75, 0x63, 0x90, 0x3b, 0x82, 0x8f, 0x64, 0x7a, 0x98, 0x57, 0xcd, 0x78, 0x1f, 0xe6, 0x13, - 0xaf, 0x3f, 0x4c, 0xc6, 0x37, 0xb2, 0x9f, 0x88, 0x64, 0x8a, 0x27, 0x5f, 0x67, 0xbf, 0x92, 0x7e, - 0x25, 0x92, 0x18, 0xf7, 0xb3, 0xae, 0x79, 0x1b, 0x30, 0x81, 0xcb, 0x8c, 0x4c, 0xc9, 0x1e, 0xc7, - 0xa7, 0x31, 0xc1, 0xc9, 0x40, 0x49, 0xc9, 0x52, 0xe5, 0x32, 0x3b, 0x26, 0x5e, 0x14, 0xf3, 0x04, - 0xef, 0x73, 0xe6, 0x33, 0x63, 0x04, 0x66, 0xed, 0x62, 0x22, 0x6f, 0x3c, 0xf9, 0x3e, 0x4c, 0xc6, - 0x0f, 0x8d, 0x39, 0x8b, 0x0c, 0xb4, 0x0e, 0x86, 0xb2, 0xc9, 0xf8, 0xb5, 0xf1, 0xd9, 0xc9, 0x57, - 0xe5, 0x56, 0x14, 0x93, 0x5f, 0x4a, 0xbd, 0x95, 0x31, 0xfa, 0x70, 0x9a, 0x1d, 0x49, 0x93, 0xed, - 0x59, 0x47, 0xa7, 0x8e, 0x9f, 0x5b, 0x76, 0xe8, 0x45, 0xfd, 0x73, 0xeb, 0x18, 0x1e, 0x52, 0xa9, - 0xbf, 0x39, 0x7c, 0x36, 0xe0, 0x1a, 0x86, 0x6b, 0xd9, 0xe6, 0x01, 0xfa, 0xb2, 0xb1, 0xf2, 0xdb, - 0x9e, 0x0c, 0xf2, 0xd2, 0x84, 0xab, 0x5d, 0x63, 0x4f, 0x92, 0x5b, 0x86, 0x8b, 0x4b, 0xf7, 0x28, - 0x95, 0x1d, 0x4e, 0x1e, 0xd3, 0x59, 0x21, 0x1c, 0xd5, 0x3e, 0xdb, 0x21, 0x9a, 0xa4, 0xda, 0x67, - 0x3b, 0xc6, 0x80, 0xfc, 0x1c, 0x33, 0x30, 0x89, 0x3d, 0x0a, 0x43, 0x30, 0x51, 0x8f, 0x07, 0xa5, - 0xee, 0x78, 0xed, 0x73, 0xd5, 0xbc, 0x14, 0x4d, 0x11, 0xe2, 0x99, 0xe6, 0xb2, 0x38, 0x89, 0xe5, - 0x31, 0xef, 0xce, 0xa4, 0x83, 0x6b, 0xf5, 0x65, 0x3e, 0x01, 0xcf, 0xdc, 0xf2, 0x1c, 0xf8, 0xe2, - 0xf2, 0xcf, 0xfe, 0xf3, 0xe5, 0xc2, 0xcf, 0x7e, 0x7e, 0xb9, 0xf0, 0xef, 0x7f, 0x7e, 0xb9, 0xf0, - 0x9f, 0x7e, 0x7e, 0xb9, 0xf0, 0xe5, 0xc2, 0xe9, 0x42, 0x23, 0xd7, 0x9b, 0x2e, 0xf5, 0xa2, 0x5b, - 0x9c, 0xdd, 0x20, 0xfe, 0x77, 0xf7, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x3e, 0xfc, 0x2f, 0x9a, - 0x13, 0xe7, 0x00, 0x00, + 0xde, 0xbb, 0xa5, 0xa3, 0xf1, 0xb5, 0x2f, 0x3c, 0xbe, 0x17, 0xd7, 0x17, 0x41, 0x12, 0x1b, 0x88, + 0x03, 0x07, 0xfe, 0x30, 0x02, 0x24, 0x40, 0x90, 0xaf, 0xfc, 0x38, 0xfe, 0x49, 0x3e, 0x82, 0x7c, + 0x64, 0x62, 0xc0, 0x48, 0x02, 0xdb, 0x3f, 0xf9, 0xa0, 0x93, 0x01, 0xf2, 0x43, 0x24, 0x1f, 0x46, + 0x90, 0x00, 0x19, 0xc0, 0x40, 0x50, 0xab, 0x1e, 0xbb, 0x6a, 0x3f, 0xba, 0x49, 0x49, 0x67, 0x9c, + 0x1f, 0x89, 0xbd, 0x6a, 0xad, 0x55, 0x55, 0xab, 0x6a, 0x57, 0xad, 0x5a, 0xb5, 0x6a, 0x2d, 0xb8, + 0x19, 0xd1, 0x26, 0x6d, 0xf9, 0x41, 0x74, 0xab, 0x49, 0x0f, 0x9c, 0xfa, 0xf3, 0x5b, 0xf5, 0xa6, + 0x4b, 0xbd, 0xe8, 0x56, 0x2b, 0xf0, 0x23, 0xff, 0x96, 0xd3, 0x8e, 0x0e, 0x43, 0x1a, 0x3c, 0x75, + 0xeb, 0xf4, 0x26, 0x42, 0xc8, 0x00, 0xfe, 0x37, 0x37, 0x7d, 0xe0, 0x1f, 0xf8, 0x1c, 0x87, 0xfd, + 0xc5, 0x0b, 0xe7, 0x2e, 0x1e, 0xf8, 0xfe, 0x41, 0x93, 0x72, 0xe2, 0xfd, 0xf6, 0xe3, 0x5b, 0xf4, + 0xa8, 0x15, 0x3d, 0x17, 0x85, 0xe5, 0x64, 0x61, 0xe4, 0x1e, 0xd1, 0x30, 0x72, 0x8e, 0x5a, 0x02, + 0xe1, 0x2d, 0xd5, 0x14, 0x27, 0x8a, 0x58, 0x49, 0xe4, 0xfa, 0xde, 0xad, 0xa7, 0x77, 0xf4, 0x9f, + 0x02, 0xf5, 0x7a, 0xc7, 0x56, 0xd7, 0x69, 0x10, 0x85, 0xa7, 0xc2, 0xa4, 0x4f, 0xa9, 0x17, 0xa5, + 0xaa, 0x17, 0x98, 0xd1, 0xf3, 0x16, 0x0d, 0x39, 0x8a, 0xfc, 0x4f, 0xa0, 0x5e, 0xcd, 0x46, 0xc5, + 0x7f, 0x05, 0xca, 0x77, 0xb3, 0x51, 0x9e, 0xd1, 0x7d, 0x26, 0x53, 0x4f, 0xfd, 0xd1, 0x05, 0x3d, + 0x70, 0x5a, 0x2d, 0x1a, 0xc4, 0x7f, 0x08, 0xf4, 0x0b, 0x0a, 0xfd, 0xe8, 0xb1, 0xc3, 0x44, 0x74, + 0xf4, 0xd8, 0x49, 0x75, 0xa3, 0x1d, 0x3a, 0x07, 0x54, 0x34, 0xff, 0xe9, 0x1d, 0xfd, 0x27, 0x47, + 0xb5, 0xfe, 0xb0, 0x00, 0x03, 0x8f, 0x9c, 0xa8, 0x7e, 0x48, 0x3e, 0x85, 0x81, 0x87, 0xae, 0xd7, + 0x08, 0x4b, 0x85, 0x2b, 0x7d, 0xd7, 0x47, 0x17, 0x8a, 0x37, 0x79, 0x57, 0xb0, 0x90, 0x15, 0x2c, + 0xce, 0xfe, 0xec, 0xb8, 0xdc, 0x73, 0x72, 0x5c, 0x9e, 0x7c, 0xc2, 0xd0, 0xde, 0xf6, 0x8f, 0xdc, + 0x08, 0xc7, 0xd6, 0xe6, 0x74, 0x64, 0x17, 0xa6, 0x2a, 0xcd, 0xa6, 0xff, 0x6c, 0xdb, 0x09, 0x22, + 0xd7, 0x69, 0x56, 0xdb, 0xf5, 0x3a, 0x0d, 0xc3, 0x52, 0xef, 0x95, 0xc2, 0xf5, 0xe1, 0xc5, 0x6b, + 0x27, 0xc7, 0xe5, 0xb2, 0xc3, 0x8a, 0x6b, 0x2d, 0x5e, 0x5e, 0x0b, 0x39, 0x82, 0xc6, 0x28, 0x8b, + 0xde, 0xfa, 0x93, 0x41, 0x28, 0xae, 0xfa, 0x61, 0xb4, 0xc4, 0x46, 0xd4, 0xa6, 0x3f, 0x6e, 0xd3, + 0x30, 0x22, 0xd7, 0x60, 0x90, 0xc1, 0xd6, 0x96, 0x4b, 0x85, 0x2b, 0x85, 0xeb, 0x23, 0x8b, 0xa3, + 0x27, 0xc7, 0xe5, 0xa1, 0x43, 0x3f, 0x8c, 0x6a, 0x6e, 0xc3, 0x16, 0x45, 0xe4, 0x2d, 0x18, 0xde, + 0xf4, 0x1b, 0x74, 0xd3, 0x39, 0xa2, 0xd8, 0x8a, 0x91, 0xc5, 0xf1, 0x93, 0xe3, 0xf2, 0x88, 0xe7, + 0x37, 0x68, 0xcd, 0x73, 0x8e, 0xa8, 0xad, 0x8a, 0xc9, 0x1e, 0xf4, 0xdb, 0x7e, 0x93, 0x96, 0xfa, + 0x10, 0x6d, 0xf1, 0xe4, 0xb8, 0xdc, 0x1f, 0xf8, 0x4d, 0xfa, 0x8b, 0xe3, 0xf2, 0x7b, 0x07, 0x6e, + 0x74, 0xd8, 0xde, 0xbf, 0x59, 0xf7, 0x8f, 0x6e, 0x1d, 0x04, 0xce, 0x53, 0x97, 0x4f, 0x42, 0xa7, + 0x79, 0x2b, 0x9e, 0xaa, 0x2d, 0x57, 0x8c, 0x7b, 0xf5, 0x79, 0x18, 0xd1, 0x23, 0xc6, 0xc9, 0x46, + 0x7e, 0xe4, 0x11, 0x4c, 0x57, 0x1a, 0x0d, 0x97, 0x53, 0x6c, 0x07, 0xae, 0x57, 0x77, 0x5b, 0x4e, + 0x33, 0x2c, 0xf5, 0x5f, 0xe9, 0xbb, 0x3e, 0x22, 0x84, 0xa2, 0xca, 0x6b, 0x2d, 0x85, 0xa0, 0x09, + 0x25, 0x93, 0x01, 0xb9, 0x0b, 0xc3, 0xcb, 0x9b, 0x55, 0xd6, 0xf6, 0xb0, 0x34, 0x80, 0xcc, 0x66, + 0x4f, 0x8e, 0xcb, 0x53, 0x0d, 0x2f, 0xc4, 0xae, 0xe9, 0x0c, 0x14, 0x22, 0x79, 0x0f, 0xc6, 0xb6, + 0xdb, 0xfb, 0x4d, 0xb7, 0xbe, 0xb3, 0x5e, 0x7d, 0x48, 0x9f, 0x97, 0x06, 0xaf, 0x14, 0xae, 0x8f, + 0x2d, 0x92, 0x93, 0xe3, 0xf2, 0x44, 0x0b, 0xe1, 0xb5, 0xa8, 0x19, 0xd6, 0x9e, 0xd0, 0xe7, 0xb6, + 0x81, 0x17, 0xd3, 0x55, 0xab, 0xab, 0x8c, 0x6e, 0x28, 0x45, 0x17, 0x86, 0x87, 0x3a, 0x1d, 0xc7, + 0x23, 0xb7, 0x00, 0x6c, 0x7a, 0xe4, 0x47, 0xb4, 0xd2, 0x68, 0x04, 0xa5, 0x61, 0x94, 0xed, 0xe4, + 0xc9, 0x71, 0x79, 0x34, 0x40, 0x68, 0xcd, 0x69, 0x34, 0x02, 0x5b, 0x43, 0x21, 0x4b, 0x30, 0x6c, + 0xfb, 0x5c, 0xc0, 0xa5, 0x91, 0x2b, 0x85, 0xeb, 0xa3, 0x0b, 0x93, 0x62, 0x1a, 0x4a, 0xf0, 0xe2, + 0xf9, 0x93, 0xe3, 0x32, 0x09, 0xc4, 0x2f, 0xbd, 0x97, 0x12, 0x83, 0x94, 0x61, 0x68, 0xd3, 0x5f, + 0x72, 0xea, 0x87, 0xb4, 0x04, 0x38, 0xf7, 0x06, 0x4e, 0x8e, 0xcb, 0x85, 0xef, 0xda, 0x12, 0x4a, + 0x9e, 0xc2, 0x68, 0x3c, 0x50, 0x61, 0x69, 0x14, 0xc5, 0xb7, 0x73, 0x72, 0x5c, 0x3e, 0x1f, 0x22, + 0xb8, 0xc6, 0x86, 0x5e, 0x93, 0xe0, 0x4b, 0xcc, 0x02, 0xbd, 0x22, 0xf2, 0x35, 0xcc, 0xc4, 0x3f, + 0x2b, 0x61, 0x48, 0x03, 0xc6, 0x63, 0x6d, 0xb9, 0x34, 0x8e, 0x92, 0x79, 0xe3, 0xe4, 0xb8, 0x6c, + 0x69, 0x2d, 0xa8, 0x39, 0x12, 0xa5, 0xe6, 0x36, 0xb4, 0x9e, 0x66, 0x33, 0x79, 0xd0, 0x3f, 0x3c, + 0x56, 0x1c, 0xb7, 0x2f, 0xed, 0x7a, 0x61, 0xe4, 0xec, 0x37, 0x69, 0x26, 0x92, 0xf5, 0xd7, 0x05, + 0x20, 0x5b, 0x2d, 0xea, 0x55, 0xab, 0xab, 0xec, 0x7b, 0x92, 0x9f, 0xd3, 0xdb, 0x30, 0xc2, 0x07, + 0x8e, 0x8d, 0x6e, 0x2f, 0x8e, 0xee, 0xc4, 0xc9, 0x71, 0x19, 0xc4, 0xe8, 0xb2, 0x91, 0x8d, 0x11, + 0xc8, 0xeb, 0xd0, 0xb7, 0xb3, 0xb3, 0x8e, 0xdf, 0x4a, 0xdf, 0xe2, 0xd4, 0xc9, 0x71, 0xb9, 0x2f, + 0x8a, 0x9a, 0xbf, 0x38, 0x2e, 0x0f, 0x2f, 0xb7, 0x03, 0x14, 0x8b, 0xcd, 0xca, 0xc9, 0xeb, 0x30, + 0xb4, 0xd4, 0x6c, 0x87, 0x11, 0x0d, 0x4a, 0xfd, 0xf1, 0x47, 0x5a, 0xe7, 0x20, 0x5b, 0x96, 0x91, + 0xef, 0x40, 0xff, 0x6e, 0x48, 0x83, 0xd2, 0x00, 0x8e, 0xf7, 0xb8, 0x18, 0x6f, 0x06, 0xda, 0x5b, + 0x58, 0x1c, 0x66, 0x5f, 0x62, 0x3b, 0xa4, 0x81, 0x8d, 0x48, 0xe4, 0x26, 0x0c, 0xf0, 0x41, 0x1b, + 0xc4, 0x45, 0x6a, 0x5c, 0xcd, 0x8e, 0x26, 0xdd, 0x7b, 0x6f, 0x71, 0xe4, 0xe4, 0xb8, 0x3c, 0x80, + 0x83, 0x67, 0x73, 0xb4, 0x07, 0xfd, 0xc3, 0x85, 0x62, 0xaf, 0x3d, 0xcc, 0x68, 0xd9, 0x67, 0x61, + 0x7d, 0x07, 0x46, 0xb5, 0xee, 0x93, 0x79, 0xe8, 0x67, 0xff, 0xe3, 0x22, 0x32, 0xc6, 0x2b, 0x63, + 0x1b, 0x87, 0x8d, 0x50, 0xeb, 0x9f, 0x4f, 0x42, 0x91, 0x51, 0x1a, 0x2b, 0x8f, 0x21, 0xaa, 0x42, + 0x37, 0x51, 0x5d, 0x07, 0x55, 0xb7, 0x58, 0x82, 0xc6, 0x4e, 0x8e, 0xcb, 0xc3, 0x6d, 0x01, 0x8b, + 0x5b, 0x46, 0xaa, 0x30, 0xb4, 0xf2, 0x4d, 0xcb, 0x0d, 0x68, 0x88, 0x82, 0x1d, 0x5d, 0x98, 0xbb, + 0xc9, 0x37, 0xcb, 0x9b, 0x72, 0xb3, 0xbc, 0xb9, 0x23, 0x37, 0xcb, 0xc5, 0x4b, 0x62, 0x29, 0x3e, + 0x47, 0x39, 0x49, 0x3c, 0x3b, 0x7e, 0xe7, 0x2f, 0xcb, 0x05, 0x5b, 0x72, 0x22, 0x6f, 0xc3, 0xe0, + 0x3d, 0x3f, 0x38, 0x72, 0x22, 0x31, 0x02, 0xd3, 0x27, 0xc7, 0xe5, 0xe2, 0x63, 0x84, 0x68, 0x13, + 0x4a, 0xe0, 0x90, 0x7b, 0x30, 0x61, 0xfb, 0xed, 0x88, 0xee, 0xf8, 0x72, 0xdc, 0x06, 0x90, 0xea, + 0xf2, 0xc9, 0x71, 0x79, 0x2e, 0x60, 0x25, 0xb5, 0xc8, 0xaf, 0x89, 0x01, 0xd4, 0xe8, 0x13, 0x54, + 0x64, 0x05, 0x26, 0x2a, 0xb8, 0x76, 0x0b, 0x99, 0xf1, 0xd1, 0x1a, 0x59, 0xbc, 0x74, 0x72, 0x5c, + 0xbe, 0xe0, 0x60, 0x49, 0x2d, 0x10, 0x45, 0x3a, 0x1b, 0x93, 0x88, 0x6c, 0xc2, 0xb9, 0x87, 0xed, + 0x7d, 0x1a, 0x78, 0x34, 0xa2, 0xa1, 0x6c, 0xd1, 0x10, 0xb6, 0xe8, 0xca, 0xc9, 0x71, 0x79, 0xfe, + 0x89, 0x2a, 0xcc, 0x68, 0x53, 0x9a, 0x94, 0x50, 0x98, 0x14, 0x0d, 0x5d, 0x76, 0x22, 0x67, 0xdf, + 0x09, 0x29, 0x2e, 0x49, 0xa3, 0x0b, 0xe7, 0xb9, 0x88, 0x6f, 0x26, 0x4a, 0x17, 0xaf, 0x09, 0x29, + 0x5f, 0x54, 0x7d, 0x6f, 0x88, 0x22, 0xad, 0xa2, 0x24, 0x4f, 0xb6, 0x32, 0xab, 0x5d, 0x67, 0x04, + 0x5b, 0x8b, 0x2b, 0xb3, 0xda, 0x75, 0xf4, 0x35, 0x4b, 0xed, 0x3f, 0xeb, 0x30, 0xb0, 0xcb, 0xf6, + 0x66, 0x5c, 0xb1, 0x26, 0x16, 0xae, 0x8a, 0x16, 0x25, 0x67, 0xdf, 0x4d, 0xf6, 0x03, 0x11, 0xf1, + 0xbb, 0x9b, 0xc4, 0xfd, 0x5c, 0xdf, 0x89, 0xb1, 0x8c, 0x7c, 0x06, 0x20, 0x5a, 0x55, 0x69, 0xb5, + 0x4a, 0xa3, 0xd8, 0xc9, 0x73, 0x66, 0x27, 0x2b, 0xad, 0xd6, 0xe2, 0x65, 0xd1, 0xbf, 0xf3, 0xaa, + 0x7f, 0x4e, 0xab, 0xa5, 0x71, 0xd3, 0x98, 0x90, 0x4f, 0x61, 0x0c, 0x17, 0x34, 0x39, 0xa2, 0x63, + 0x38, 0xa2, 0x17, 0x4f, 0x8e, 0xcb, 0xb3, 0xb8, 0x56, 0x65, 0x8c, 0xa7, 0x41, 0x40, 0x7e, 0x03, + 0x66, 0x04, 0xbb, 0x47, 0xae, 0xd7, 0xf0, 0x9f, 0x85, 0xcb, 0x34, 0x7c, 0x12, 0xf9, 0x2d, 0x5c, + 0xfc, 0x46, 0x17, 0xe6, 0xcd, 0xe6, 0x99, 0x38, 0x8b, 0x37, 0x44, 0x4b, 0x2d, 0xd5, 0xd2, 0x67, + 0x1c, 0xa1, 0xd6, 0xe0, 0x18, 0xfa, 0xf2, 0x98, 0xc9, 0x82, 0xac, 0xc1, 0xe4, 0x6e, 0x48, 0x8d, + 0x3e, 0x4c, 0xe0, 0xee, 0x50, 0x66, 0x23, 0xdc, 0x0e, 0x69, 0x2d, 0xaf, 0x1f, 0x49, 0x3a, 0x62, + 0x03, 0x59, 0x0e, 0xfc, 0x56, 0x62, 0x8e, 0x4f, 0xa2, 0x44, 0xac, 0x93, 0xe3, 0xf2, 0xe5, 0x46, + 0xe0, 0xb7, 0x6a, 0xf9, 0x13, 0x3d, 0x83, 0x9a, 0xfc, 0x10, 0xce, 0x2f, 0xf9, 0x9e, 0x47, 0xeb, + 0x6c, 0xfd, 0x5c, 0x76, 0x9d, 0x03, 0xcf, 0x0f, 0x23, 0xb7, 0xbe, 0xb6, 0x5c, 0x2a, 0xc6, 0x9b, + 0x43, 0x5d, 0x61, 0xd4, 0x1a, 0x0a, 0xc5, 0xdc, 0x1c, 0x72, 0xb8, 0x90, 0xaf, 0x60, 0x5c, 0xd4, + 0x45, 0x03, 0x9c, 0x9a, 0xe7, 0x3a, 0x4f, 0x34, 0x85, 0xcc, 0xb7, 0xf9, 0x40, 0xfe, 0xe4, 0x8a, + 0x93, 0xc9, 0x8b, 0x7c, 0x0d, 0xa3, 0x1b, 0xf7, 0x2a, 0x36, 0x0d, 0x5b, 0xbe, 0x17, 0xd2, 0x12, + 0xc1, 0x11, 0xbd, 0x2c, 0x58, 0x6f, 0xdc, 0xab, 0x54, 0xda, 0xd1, 0x21, 0xf5, 0x22, 0xb7, 0xee, + 0x44, 0x54, 0x62, 0x2d, 0xce, 0xb1, 0x99, 0x77, 0xf4, 0xd8, 0xa9, 0x05, 0x02, 0xa2, 0xf5, 0x42, + 0x67, 0x47, 0xe6, 0x60, 0xb8, 0x5a, 0x5d, 0x5d, 0xf7, 0x0f, 0x5c, 0xaf, 0x34, 0xc5, 0x84, 0x61, + 0xab, 0xdf, 0x64, 0x1f, 0x66, 0xb4, 0x93, 0x41, 0x8d, 0xfd, 0x4f, 0x8f, 0xa8, 0x17, 0x95, 0xa6, + 0xb1, 0x0d, 0xdf, 0x55, 0x47, 0x9b, 0x9b, 0xfa, 0x01, 0xe2, 0xe9, 0x9d, 0x9b, 0x95, 0xf8, 0x67, + 0x55, 0x12, 0xd9, 0xd3, 0x4e, 0x06, 0x94, 0xec, 0xc0, 0xd0, 0x76, 0x3b, 0x68, 0xf9, 0x21, 0x2d, + 0xcd, 0xa0, 0xd0, 0xae, 0x75, 0xfa, 0x3a, 0x05, 0xea, 0xe2, 0x0c, 0x5b, 0x9e, 0x5b, 0xfc, 0x87, + 0xd6, 0x33, 0xc9, 0xca, 0xfa, 0x1c, 0x46, 0xd4, 0xc7, 0x4c, 0x86, 0xa0, 0xaf, 0xd2, 0x6c, 0x16, + 0x7b, 0xd8, 0x1f, 0xd5, 0xea, 0x6a, 0xb1, 0x40, 0x26, 0x00, 0xe2, 0x15, 0xac, 0xd8, 0x4b, 0xc6, + 0x60, 0x58, 0xae, 0x30, 0xc5, 0x3e, 0xc4, 0x6f, 0xb5, 0x8a, 0xfd, 0x84, 0xc0, 0x84, 0x39, 0xcf, + 0x8b, 0x03, 0xd6, 0xef, 0x16, 0x60, 0x44, 0x8d, 0x0f, 0x99, 0x84, 0xd1, 0xdd, 0xcd, 0xea, 0xf6, + 0xca, 0xd2, 0xda, 0xbd, 0xb5, 0x95, 0xe5, 0x62, 0x0f, 0xb9, 0x04, 0x17, 0x76, 0xaa, 0xab, 0xb5, + 0xe5, 0xc5, 0xda, 0xfa, 0xd6, 0x52, 0x65, 0xbd, 0xb6, 0x6d, 0x6f, 0x7d, 0xfe, 0x45, 0x6d, 0x67, + 0x77, 0x73, 0x73, 0x65, 0xbd, 0x58, 0x20, 0x25, 0x98, 0x66, 0xc5, 0x0f, 0x77, 0x17, 0x57, 0x74, + 0x84, 0x62, 0x2f, 0xb9, 0x0a, 0x97, 0xb2, 0x4a, 0x6a, 0xab, 0x2b, 0x95, 0xe5, 0xf5, 0x95, 0x6a, + 0xb5, 0xd8, 0x47, 0x66, 0x61, 0x8a, 0xa1, 0x54, 0xb6, 0xb7, 0x0d, 0xda, 0x7e, 0xab, 0x09, 0xa3, + 0x9a, 0x70, 0xc8, 0x3c, 0x94, 0x96, 0x56, 0xec, 0x9d, 0xda, 0xf6, 0xae, 0xbd, 0xbd, 0x55, 0x5d, + 0xa9, 0x99, 0x2d, 0x4c, 0x96, 0xae, 0x6f, 0xdd, 0x5f, 0xdb, 0xac, 0x31, 0x50, 0xb5, 0x58, 0x60, + 0xcd, 0x30, 0x4a, 0xab, 0x6b, 0x9b, 0xf7, 0xd7, 0x57, 0x6a, 0xbb, 0xd5, 0x15, 0x81, 0xd2, 0x6b, + 0xfd, 0xb4, 0x37, 0xb5, 0xd4, 0x93, 0x05, 0x18, 0xad, 0xf2, 0x53, 0x2c, 0x4e, 0x7f, 0x7e, 0x6c, + 0x28, 0x9e, 0x1c, 0x97, 0xc7, 0xc4, 0xe1, 0x96, 0xcf, 0x6c, 0x1d, 0x89, 0xed, 0xde, 0xdb, 0x6c, + 0xa4, 0xeb, 0x7e, 0x53, 0xdf, 0xbd, 0x5b, 0x02, 0x66, 0xab, 0x52, 0xb2, 0xa0, 0xed, 0xf3, 0xfc, + 0x0c, 0x81, 0x7a, 0xaa, 0xdc, 0xe7, 0xf5, 0x35, 0x5f, 0xed, 0xf8, 0x0b, 0xf1, 0x90, 0x8a, 0xed, + 0x19, 0x69, 0x32, 0xf6, 0x18, 0x85, 0x47, 0xde, 0x92, 0xfa, 0x0f, 0xd7, 0xf9, 0x71, 0x13, 0x48, + 0x68, 0xab, 0x42, 0xf5, 0xb1, 0xda, 0x39, 0x0b, 0x2e, 0xf9, 0x28, 0x39, 0x67, 0x84, 0x30, 0x90, + 0x59, 0x62, 0x5d, 0xb5, 0x13, 0xa8, 0xa4, 0x0c, 0x03, 0xfc, 0x4b, 0xe4, 0xf2, 0x40, 0x8d, 0xab, + 0xc9, 0x00, 0x36, 0x87, 0x5b, 0x7f, 0xd4, 0xa7, 0x6f, 0x3e, 0x4c, 0xc3, 0xd2, 0xe4, 0x8d, 0x1a, + 0x16, 0xca, 0x19, 0xa1, 0xe4, 0x26, 0x8c, 0x54, 0x69, 0x18, 0x72, 0x2d, 0xb8, 0x57, 0x0d, 0x09, + 0x84, 0x1c, 0x58, 0x73, 0x1b, 0xa5, 0x82, 0x1d, 0xa3, 0xb0, 0x03, 0x05, 0xd7, 0xad, 0xf0, 0x40, + 0xd1, 0x17, 0x1f, 0x28, 0x84, 0xf6, 0xc5, 0x0f, 0x14, 0x31, 0x0a, 0x1b, 0x75, 0xb1, 0xfd, 0x63, + 0x2b, 0xfa, 0xe3, 0x51, 0x17, 0x2a, 0x83, 0x18, 0x75, 0x0d, 0x89, 0x7c, 0x08, 0x50, 0x79, 0x54, + 0x45, 0xcd, 0xd9, 0xde, 0x14, 0x2a, 0x10, 0x2e, 0x56, 0xce, 0xb3, 0x50, 0x28, 0xe6, 0x81, 0x7e, + 0xf2, 0xd0, 0xb0, 0xc9, 0x22, 0x8c, 0x57, 0x7e, 0xd2, 0x0e, 0xe8, 0x5a, 0x83, 0xad, 0x77, 0x11, + 0x3f, 0x62, 0x8d, 0x2c, 0xce, 0x9f, 0x1c, 0x97, 0x4b, 0x0e, 0x2b, 0xa8, 0xb9, 0xa2, 0x44, 0x63, + 0x60, 0x92, 0x90, 0x2d, 0x38, 0x77, 0x7f, 0x69, 0x5b, 0xcc, 0xc3, 0x4a, 0xbd, 0xee, 0xb7, 0xbd, + 0x48, 0xe8, 0x3d, 0x57, 0x4f, 0x8e, 0xcb, 0x97, 0x0e, 0xea, 0xad, 0x9a, 0x9c, 0xb3, 0x0e, 0x2f, + 0xd6, 0x15, 0x9f, 0x14, 0x2d, 0xb9, 0x06, 0x7d, 0xbb, 0xf6, 0x9a, 0x38, 0x7f, 0x9d, 0x3b, 0x39, + 0x2e, 0x8f, 0xb7, 0x03, 0x57, 0x23, 0x61, 0xa5, 0x56, 0x13, 0x26, 0xee, 0xd3, 0x88, 0x4d, 0x4e, + 0xa9, 0xe9, 0x76, 0x1e, 0xba, 0x8f, 0x61, 0xf4, 0x91, 0x1b, 0x1d, 0x56, 0x69, 0x3d, 0xa0, 0x91, + 0x3c, 0xe5, 0xa3, 0x98, 0x9e, 0xb9, 0xd1, 0x61, 0x2d, 0xe4, 0x70, 0x7d, 0x4d, 0xd7, 0xd0, 0xad, + 0x15, 0x98, 0x14, 0xb5, 0x29, 0xc5, 0x7a, 0xc1, 0x64, 0x58, 0x40, 0x86, 0x38, 0x54, 0x3a, 0x43, + 0x93, 0xcd, 0x1f, 0xf5, 0xc2, 0xcc, 0xd2, 0xa1, 0xe3, 0x1d, 0xd0, 0x6d, 0x27, 0x0c, 0x9f, 0xf9, + 0x41, 0x43, 0x6b, 0x3c, 0x9e, 0x2a, 0x52, 0x8d, 0xc7, 0x63, 0xc4, 0x02, 0x8c, 0x6e, 0x35, 0x1b, + 0x92, 0x46, 0x9c, 0x78, 0xb0, 0x2e, 0xbf, 0xd9, 0xa8, 0xb5, 0x24, 0x2f, 0x1d, 0x89, 0xd1, 0x6c, + 0xd2, 0x67, 0x8a, 0xa6, 0x2f, 0xa6, 0xf1, 0xe8, 0x33, 0x8d, 0x46, 0x43, 0x22, 0x2b, 0x70, 0xae, + 0x4a, 0xeb, 0xbe, 0xd7, 0xb8, 0xe7, 0xd4, 0x23, 0x3f, 0xd8, 0xf1, 0x9f, 0x50, 0x4f, 0x4c, 0x42, + 0x54, 0x0a, 0x43, 0x2c, 0xac, 0x3d, 0xc6, 0xd2, 0x5a, 0xc4, 0x8a, 0xed, 0x34, 0x05, 0xd9, 0x82, + 0xe1, 0x47, 0xc2, 0x56, 0x24, 0x8e, 0x49, 0xaf, 0xdf, 0x54, 0xc6, 0xa3, 0xa5, 0x80, 0xe2, 0xcc, + 0x71, 0x9a, 0xea, 0xa0, 0xa7, 0xf6, 0x58, 0x5c, 0xae, 0x24, 0xa6, 0xad, 0x98, 0x58, 0xbb, 0x30, + 0xbe, 0xdd, 0x6c, 0x1f, 0xb8, 0x1e, 0x5b, 0x58, 0xaa, 0xf4, 0xc7, 0x64, 0x19, 0x20, 0x06, 0x08, + 0x0b, 0xd0, 0x94, 0x38, 0x5c, 0xc5, 0x05, 0x7b, 0x77, 0xc5, 0xd7, 0x86, 0x10, 0xd4, 0x86, 0x6d, + 0x8d, 0xce, 0xfa, 0x5f, 0x7d, 0x40, 0xc4, 0x00, 0xe0, 0xf6, 0x59, 0xa5, 0x11, 0xdb, 0x82, 0xce, + 0x43, 0xaf, 0x32, 0xd4, 0x0c, 0x9e, 0x1c, 0x97, 0x7b, 0xdd, 0x86, 0xdd, 0xbb, 0xb6, 0x4c, 0xde, + 0x81, 0x01, 0x44, 0x43, 0xf9, 0x4f, 0xa8, 0xfa, 0x74, 0x0e, 0x7c, 0x81, 0xc1, 0x6d, 0xdd, 0xe6, + 0xc8, 0xe4, 0x5d, 0x18, 0x59, 0xa6, 0x4d, 0x7a, 0xe0, 0x44, 0xbe, 0x5c, 0x02, 0xb8, 0xe9, 0x43, + 0x02, 0xb5, 0x39, 0x17, 0x63, 0xb2, 0xa3, 0x90, 0x4d, 0x9d, 0xd0, 0xf7, 0xf4, 0xa3, 0x50, 0x80, + 0x10, 0xfd, 0x28, 0xc4, 0x71, 0xc8, 0xef, 0x15, 0x60, 0xb4, 0xe2, 0x79, 0xc2, 0xa4, 0x10, 0x0a, + 0xa9, 0xcf, 0xdc, 0x54, 0x36, 0xb8, 0x75, 0x67, 0x9f, 0x36, 0xf7, 0x9c, 0x66, 0x9b, 0x86, 0x8b, + 0x5f, 0x33, 0xed, 0xf4, 0x3f, 0x1e, 0x97, 0x3f, 0x3a, 0x83, 0x91, 0x20, 0xb6, 0xe6, 0xed, 0x04, + 0x8e, 0x1b, 0x85, 0x27, 0xc7, 0xe5, 0x19, 0x27, 0xae, 0x50, 0xff, 0x6e, 0xb4, 0x76, 0xc4, 0xeb, + 0xff, 0x60, 0xb7, 0xf5, 0x9f, 0x1c, 0xc1, 0x64, 0x25, 0x0c, 0xdb, 0x47, 0xb4, 0x1a, 0x39, 0x41, + 0xc4, 0xce, 0x8e, 0xb8, 0x88, 0x74, 0x3e, 0x58, 0xbe, 0xf9, 0xb3, 0xe3, 0x72, 0x81, 0x29, 0xc4, + 0x0e, 0x92, 0x32, 0x85, 0x2a, 0x88, 0x6a, 0x91, 0xab, 0x6f, 0x61, 0x78, 0xc4, 0x4c, 0xf2, 0xb6, + 0xae, 0x29, 0xa5, 0x63, 0x6d, 0x39, 0x6f, 0xc4, 0xad, 0x25, 0x98, 0xbf, 0x4f, 0x23, 0x9b, 0x86, + 0x34, 0x92, 0xdf, 0x08, 0xce, 0xf0, 0xd8, 0xac, 0x37, 0x84, 0xbf, 0x15, 0x31, 0x0e, 0x3f, 0xff, + 0x2e, 0x64, 0x89, 0xf5, 0xff, 0x14, 0xa0, 0xbc, 0x14, 0x50, 0xae, 0x4b, 0xe6, 0x30, 0xea, 0xbc, + 0x76, 0xcd, 0x43, 0xff, 0xce, 0xf3, 0x96, 0x3c, 0x91, 0x63, 0x29, 0x1b, 0x14, 0x1b, 0xa1, 0xa7, + 0x34, 0x6f, 0x58, 0x8f, 0x61, 0xc6, 0xa6, 0x1e, 0x7d, 0xe6, 0xec, 0x37, 0xa9, 0x61, 0x21, 0x28, + 0xc3, 0x00, 0xff, 0xd0, 0x53, 0x5d, 0xe0, 0xf0, 0xb3, 0x59, 0x5b, 0xac, 0x71, 0x18, 0xdd, 0x76, + 0xbd, 0x03, 0xc1, 0xdd, 0xfa, 0xff, 0xfb, 0x61, 0x8c, 0xff, 0x16, 0xea, 0x71, 0x62, 0x8b, 0x2b, + 0x9c, 0x66, 0x8b, 0x7b, 0x1f, 0xc6, 0xd9, 0x1e, 0x41, 0x83, 0x3d, 0x1a, 0xb0, 0xad, 0x55, 0x48, + 0x02, 0x55, 0xfd, 0x10, 0x0b, 0x6a, 0x4f, 0x79, 0x89, 0x6d, 0x22, 0x92, 0x75, 0x98, 0xe0, 0x80, + 0x7b, 0xd4, 0x89, 0xda, 0xb1, 0xb5, 0x62, 0x52, 0xe8, 0xc4, 0x12, 0xcc, 0xa7, 0xa6, 0xe0, 0xf5, + 0x58, 0x00, 0xed, 0x04, 0x2d, 0xf9, 0x14, 0x26, 0xb7, 0x03, 0xff, 0x9b, 0xe7, 0xda, 0xa6, 0xce, + 0xbf, 0x4e, 0xae, 0x3d, 0xb3, 0xa2, 0x9a, 0xbe, 0xb5, 0x27, 0xb1, 0xc9, 0x5b, 0x30, 0xbc, 0x16, + 0x2e, 0xfa, 0x81, 0xeb, 0x1d, 0xe0, 0x37, 0x3a, 0xcc, 0x4d, 0xbc, 0x6e, 0x58, 0xdb, 0x47, 0xa0, + 0xad, 0x8a, 0x13, 0xc6, 0xc8, 0xa1, 0xee, 0xc6, 0xc8, 0xdb, 0x00, 0xeb, 0xbe, 0xd3, 0xa8, 0x34, + 0x9b, 0x4b, 0x95, 0x10, 0x77, 0x4f, 0xb1, 0x1f, 0x35, 0x7d, 0xa7, 0x51, 0x73, 0x9a, 0xcd, 0x5a, + 0xdd, 0x09, 0x6d, 0x0d, 0x87, 0x3c, 0x82, 0xf1, 0x75, 0xb7, 0x4e, 0xbd, 0x90, 0xa2, 0x01, 0xe6, + 0x39, 0x9e, 0xe6, 0x3b, 0x7f, 0x70, 0xac, 0xa3, 0xe3, 0x4d, 0x9d, 0x08, 0x3f, 0x2f, 0x93, 0xcf, + 0x83, 0xfe, 0xe1, 0xc1, 0xe2, 0x90, 0x3d, 0x29, 0x80, 0x8f, 0x9c, 0xc0, 0x73, 0xbd, 0x83, 0xd0, + 0xfa, 0x5b, 0x04, 0x86, 0x95, 0x2c, 0x6f, 0xea, 0x27, 0x06, 0xb1, 0x7d, 0xe2, 0xb4, 0x8a, 0xed, + 0x24, 0xb6, 0x86, 0x41, 0x2e, 0xe0, 0x19, 0x42, 0x6c, 0xdc, 0x43, 0x6c, 0x9a, 0x3b, 0xad, 0x96, + 0xcd, 0x60, 0xec, 0xf3, 0x5d, 0x5e, 0xc4, 0x81, 0x1d, 0xe6, 0x9f, 0x6f, 0x63, 0xdf, 0xee, 0x5d, + 0x5e, 0x64, 0xdf, 0xcd, 0xd6, 0xda, 0xf2, 0x12, 0x8e, 0xd1, 0x30, 0xff, 0x6e, 0x7c, 0xb7, 0x51, + 0xb7, 0x11, 0xca, 0x4a, 0xab, 0x95, 0x8d, 0x75, 0x31, 0x0e, 0x58, 0x1a, 0x3a, 0x47, 0x4d, 0x1b, + 0xa1, 0x4c, 0xeb, 0xe4, 0x47, 0xde, 0x25, 0xdf, 0x8b, 0x02, 0xbf, 0x19, 0xa2, 0x6a, 0x34, 0xcc, + 0xe7, 0x89, 0x38, 0x2b, 0xd7, 0x45, 0x91, 0x9d, 0x40, 0x25, 0x8f, 0x60, 0xb6, 0xd2, 0x78, 0xea, + 0x78, 0x75, 0xda, 0xe0, 0x25, 0x8f, 0xfc, 0xe0, 0xc9, 0xe3, 0xa6, 0xff, 0x2c, 0xc4, 0x81, 0x1c, + 0x16, 0xa6, 0x25, 0x81, 0x22, 0x8f, 0xde, 0xcf, 0x24, 0x92, 0x9d, 0x47, 0xcd, 0xbe, 0xd5, 0xa5, + 0xa6, 0xdf, 0x6e, 0x88, 0xe1, 0xc5, 0x6f, 0xb5, 0xce, 0x00, 0x36, 0x87, 0x33, 0x29, 0xad, 0x56, + 0x37, 0xd0, 0x90, 0x23, 0xa4, 0x74, 0x18, 0x1e, 0xd9, 0x0c, 0x46, 0x5e, 0x87, 0x21, 0xa9, 0x40, + 0x73, 0x3b, 0x33, 0xda, 0x37, 0xa5, 0xe2, 0x2c, 0xcb, 0xd8, 0xb7, 0x66, 0xd3, 0xba, 0xff, 0x94, + 0x06, 0xcf, 0x97, 0xfc, 0x06, 0x95, 0x66, 0x07, 0x71, 0xac, 0xe6, 0x05, 0xb5, 0x3a, 0x2b, 0xb1, + 0x4d, 0x44, 0x56, 0x01, 0xdf, 0x5c, 0xc3, 0xd2, 0x64, 0x5c, 0x01, 0xdf, 0x7c, 0x43, 0x5b, 0x96, + 0x91, 0x65, 0x38, 0x57, 0x69, 0x47, 0xfe, 0x91, 0x13, 0xb9, 0xf5, 0xdd, 0xd6, 0x41, 0xe0, 0xb0, + 0x4a, 0x8a, 0x48, 0x80, 0x07, 0x0a, 0x47, 0x16, 0xd6, 0xda, 0xa2, 0xd4, 0x4e, 0x13, 0x90, 0xf7, + 0x60, 0x6c, 0x2d, 0xe4, 0xa6, 0x25, 0x27, 0xa4, 0x0d, 0xb4, 0x0f, 0x88, 0x56, 0xba, 0x61, 0x0d, + 0x0d, 0x4d, 0x35, 0x76, 0x04, 0x69, 0xd8, 0x06, 0x1e, 0xb1, 0x60, 0xb0, 0x12, 0x86, 0x6e, 0x18, + 0xe1, 0xb1, 0x7f, 0x78, 0x11, 0x4e, 0x8e, 0xcb, 0x83, 0x0e, 0x42, 0x6c, 0x51, 0x42, 0x1e, 0xc1, + 0xe8, 0x32, 0x65, 0x1a, 0xe9, 0x4e, 0xd0, 0x0e, 0x23, 0x3c, 0xc4, 0x8f, 0x2e, 0x5c, 0x10, 0x2b, + 0x86, 0x56, 0x22, 0xe6, 0x32, 0x57, 0x23, 0x1b, 0x08, 0xaf, 0x45, 0xac, 0x40, 0xdf, 0x0e, 0x35, + 0x7c, 0xa6, 0x6e, 0x0b, 0x9a, 0x55, 0xb7, 0xc1, 0xd6, 0x80, 0x69, 0x6c, 0x03, 0xaa, 0xdb, 0x62, + 0xd1, 0xa9, 0x1d, 0x62, 0x89, 0xae, 0x6e, 0x1b, 0x24, 0xa4, 0x9e, 0xb2, 0x56, 0xce, 0x18, 0x16, + 0x29, 0xb3, 0x50, 0x36, 0xf1, 0x8c, 0xb6, 0xcc, 0x8f, 0x61, 0x74, 0xa9, 0x1d, 0x46, 0xfe, 0xd1, + 0xce, 0x21, 0x3d, 0xa2, 0xa5, 0xf3, 0xf1, 0xa1, 0xa2, 0x8e, 0xe0, 0x5a, 0xc4, 0xe0, 0x7a, 0x37, + 0x35, 0x74, 0xf2, 0x19, 0x10, 0x79, 0x3a, 0xb8, 0xcf, 0xe6, 0x87, 0xc7, 0xe6, 0x72, 0x69, 0x16, + 0xfb, 0x8a, 0x47, 0x02, 0x79, 0xa8, 0xa8, 0x1d, 0xa8, 0x62, 0xdd, 0xde, 0x94, 0x26, 0x66, 0x0d, + 0xe2, 0x4d, 0xbc, 0x1f, 0x38, 0xad, 0xc3, 0x52, 0x29, 0x56, 0xdf, 0x45, 0xa7, 0x0e, 0x18, 0xdc, + 0x50, 0x43, 0x62, 0x74, 0x52, 0x05, 0xe0, 0x3f, 0xd7, 0xd9, 0xc0, 0x5f, 0x40, 0x79, 0x95, 0x0c, + 0x79, 0xb1, 0x02, 0x29, 0xab, 0x0b, 0xa8, 0xdc, 0x70, 0xb6, 0x4d, 0xd7, 0x18, 0x4d, 0x8d, 0x0d, + 0x79, 0x02, 0x45, 0xfe, 0x6b, 0xc3, 0xf7, 0xdc, 0x88, 0xaf, 0xe9, 0x73, 0x86, 0x29, 0x29, 0x59, + 0x2c, 0x2b, 0x40, 0x13, 0x9e, 0xa8, 0xe0, 0x48, 0x95, 0x6a, 0xd5, 0xa4, 0x18, 0x93, 0x6d, 0x18, + 0xdd, 0x0e, 0xfc, 0x46, 0xbb, 0x1e, 0xa1, 0x26, 0x70, 0x11, 0x35, 0x50, 0x22, 0xea, 0xd1, 0x4a, + 0xb8, 0x4c, 0x5a, 0x1c, 0x50, 0x63, 0x5a, 0x82, 0x2e, 0x13, 0x0d, 0x91, 0x2c, 0xc2, 0xe0, 0xb6, + 0xdf, 0x74, 0xeb, 0xcf, 0x4b, 0xf3, 0xd8, 0xe8, 0x69, 0xc9, 0x0c, 0x81, 0xb2, 0xa9, 0xa8, 0x76, + 0xb6, 0x10, 0xa4, 0xab, 0x9d, 0x1c, 0x89, 0x54, 0x60, 0xfc, 0x33, 0x36, 0x61, 0x5c, 0xdf, 0xf3, + 0x1c, 0x37, 0xa0, 0xa5, 0x4b, 0x38, 0x2e, 0x68, 0x66, 0xfd, 0xb1, 0x5e, 0xa0, 0x4f, 0x67, 0x83, + 0x82, 0xac, 0xc1, 0xe4, 0x5a, 0x58, 0x8d, 0x02, 0xb7, 0x45, 0x37, 0x1c, 0xcf, 0x39, 0xa0, 0x8d, + 0xd2, 0xe5, 0xd8, 0xce, 0xe9, 0x86, 0xb5, 0x10, 0xcb, 0x6a, 0x47, 0xbc, 0x50, 0xb7, 0x73, 0x26, + 0xe8, 0xc8, 0xe7, 0x30, 0xbd, 0xf2, 0x4d, 0xc4, 0x66, 0x4c, 0xb3, 0xd2, 0x6e, 0xb8, 0x51, 0x35, + 0xf2, 0x03, 0xe7, 0x80, 0x96, 0xca, 0xc8, 0xef, 0xb5, 0x93, 0xe3, 0xf2, 0x15, 0x2a, 0xca, 0x6b, + 0x0e, 0x43, 0xa8, 0x85, 0x1c, 0x43, 0xbf, 0xbd, 0xcc, 0xe2, 0xc0, 0xa4, 0x5f, 0x6d, 0xb7, 0x98, + 0x46, 0x8c, 0xd2, 0xbf, 0x62, 0x48, 0x5f, 0x2b, 0xe1, 0xd2, 0x0f, 0x39, 0x20, 0x25, 0x7d, 0x0d, + 0x91, 0xd8, 0x40, 0x1e, 0xf8, 0xae, 0x57, 0xa9, 0x47, 0xee, 0x53, 0x2a, 0x0c, 0x06, 0x61, 0xe9, + 0x2a, 0xb6, 0x14, 0x6d, 0xb2, 0xbf, 0xea, 0xbb, 0x5e, 0xcd, 0xc1, 0xe2, 0x9a, 0x30, 0x2f, 0x18, + 0x36, 0xd9, 0x34, 0x35, 0xf9, 0x21, 0x9c, 0xdf, 0xf0, 0xf7, 0xdd, 0x26, 0xe5, 0x4b, 0x0e, 0x17, + 0x0b, 0x5a, 0x17, 0x2d, 0xe4, 0x8b, 0x36, 0xd9, 0x23, 0xc4, 0xa8, 0x89, 0xd5, 0xea, 0x48, 0xe1, + 0xe8, 0x36, 0xd9, 0x6c, 0x2e, 0x64, 0x05, 0xc6, 0xf0, 0xbb, 0x6c, 0xe2, 0xcf, 0xb0, 0x74, 0x0d, + 0x8f, 0x5d, 0x57, 0x13, 0x9a, 0xd4, 0xcd, 0x15, 0x0d, 0x67, 0xc5, 0x8b, 0x82, 0xe7, 0xb6, 0x41, + 0x46, 0x3e, 0x81, 0xb9, 0xe4, 0xf4, 0x5e, 0xf2, 0xbd, 0xc7, 0xee, 0x41, 0x3b, 0xa0, 0x8d, 0xd2, + 0x6b, 0xac, 0xa9, 0x76, 0x07, 0x0c, 0xf2, 0x15, 0xcc, 0xe0, 0x5e, 0x57, 0xf1, 0x7c, 0xef, 0xf9, + 0x91, 0xfb, 0x13, 0xd4, 0x71, 0x99, 0x6a, 0xfa, 0x3a, 0xaa, 0xa6, 0xaf, 0x9f, 0x1c, 0x97, 0xaf, + 0xe2, 0x9e, 0x58, 0x73, 0x74, 0x0c, 0xa6, 0xa7, 0xea, 0x66, 0xf7, 0x4c, 0x1e, 0x73, 0x8f, 0xe0, + 0x5c, 0xaa, 0xfd, 0xa4, 0x08, 0x7d, 0x4f, 0xc4, 0xed, 0xd9, 0x88, 0xcd, 0xfe, 0x24, 0x6f, 0xc3, + 0xc0, 0x53, 0x76, 0x98, 0x42, 0x75, 0x24, 0xbe, 0x91, 0xd1, 0x48, 0xd7, 0xbc, 0xc7, 0xbe, 0xcd, + 0x91, 0x3e, 0xec, 0x7d, 0xbf, 0xf0, 0xa0, 0x7f, 0x78, 0xb4, 0x38, 0xc6, 0x2f, 0x3d, 0x1f, 0xf4, + 0x0f, 0x8f, 0x17, 0x27, 0xac, 0x0a, 0x4c, 0x26, 0xf0, 0x49, 0x09, 0x86, 0xa8, 0xc7, 0x14, 0xf4, + 0x06, 0x57, 0x88, 0x6c, 0xf9, 0x93, 0x4c, 0xc3, 0x40, 0xd3, 0x3d, 0x72, 0x23, 0xac, 0x70, 0xc0, + 0xe6, 0x3f, 0xac, 0xdf, 0x2f, 0x00, 0x49, 0xef, 0x47, 0xe4, 0x56, 0x82, 0x0d, 0x57, 0x4f, 0x05, + 0x48, 0x37, 0xee, 0x4a, 0xee, 0x9f, 0xc1, 0x14, 0x9f, 0x10, 0x72, 0xe7, 0xd4, 0xea, 0xe2, 0x2b, + 0x76, 0x46, 0xb1, 0x6e, 0xc4, 0x11, 0xc5, 0xb8, 0xcf, 0xae, 0x63, 0xd3, 0xda, 0x30, 0x93, 0xb9, + 0x13, 0x91, 0x0d, 0x98, 0x39, 0xf2, 0xbd, 0xe8, 0xb0, 0xf9, 0x5c, 0x6e, 0x44, 0xa2, 0xb6, 0x02, + 0xd6, 0x86, 0x8b, 0x6f, 0x26, 0x82, 0x3d, 0x25, 0xc0, 0x82, 0x23, 0xd6, 0xf3, 0xa0, 0x7f, 0xb8, + 0xb7, 0xd8, 0xa7, 0x7a, 0x62, 0xd9, 0x70, 0x2e, 0xb5, 0xa0, 0x93, 0xef, 0xc3, 0x58, 0x1d, 0x0f, + 0x60, 0x46, 0x4d, 0x7c, 0x3b, 0xd3, 0xe0, 0xfa, 0xb7, 0xca, 0xe1, 0xbc, 0x2b, 0xff, 0xb8, 0x00, + 0xb3, 0x39, 0x4b, 0xf9, 0xd9, 0x45, 0xfd, 0x05, 0x9c, 0x3f, 0x72, 0xbe, 0xa9, 0x05, 0x78, 0xbe, + 0xae, 0x05, 0x8e, 0x97, 0x90, 0x36, 0x2e, 0x53, 0xd9, 0x18, 0xba, 0xe7, 0xc9, 0x91, 0xf3, 0x8d, + 0x8d, 0x08, 0x36, 0x2b, 0xe7, 0xed, 0xfc, 0x01, 0x8c, 0x1b, 0x8b, 0xf7, 0x99, 0x1b, 0x67, 0xdd, + 0x81, 0x73, 0xcb, 0xb4, 0x49, 0x23, 0x7a, 0x6a, 0xbb, 0x9a, 0xb5, 0x0d, 0x50, 0xa5, 0x47, 0x4e, + 0xeb, 0xd0, 0x67, 0x4a, 0xfd, 0xa2, 0xfe, 0x4b, 0xd8, 0x65, 0x88, 0xb0, 0x93, 0xa8, 0x82, 0xbd, + 0xbb, 0x5c, 0xd1, 0x0f, 0x15, 0xa6, 0xad, 0x51, 0x59, 0x7f, 0xda, 0x0b, 0x44, 0xac, 0xbe, 0x01, + 0x75, 0x8e, 0x64, 0x33, 0x3e, 0x80, 0x31, 0x7e, 0x8a, 0xe6, 0x60, 0x6c, 0xce, 0xe8, 0xc2, 0x94, + 0xf8, 0xf2, 0xf4, 0xa2, 0xd5, 0x1e, 0xdb, 0x40, 0x65, 0xa4, 0x36, 0xe5, 0xc7, 0x7f, 0x24, 0xed, + 0x35, 0x48, 0xf5, 0x22, 0x46, 0xaa, 0xff, 0x26, 0x9f, 0xc2, 0xc4, 0x92, 0x7f, 0xd4, 0x62, 0x32, + 0x11, 0xc4, 0x7d, 0xc2, 0xb4, 0x22, 0xea, 0x35, 0x0a, 0x57, 0x7b, 0xec, 0x04, 0x3a, 0xd9, 0x84, + 0xa9, 0x7b, 0xcd, 0x76, 0x78, 0x58, 0xf1, 0x1a, 0x4b, 0x4d, 0x3f, 0x94, 0x5c, 0xfa, 0xc5, 0x49, + 0x4b, 0xac, 0x9d, 0x69, 0x8c, 0xd5, 0x1e, 0x3b, 0x8b, 0x90, 0xbc, 0x0e, 0x03, 0x2b, 0x4f, 0xd9, + 0x9a, 0x2e, 0xfd, 0x0f, 0x84, 0x7b, 0xd4, 0x96, 0x47, 0xb7, 0x1e, 0xaf, 0xf6, 0xd8, 0xbc, 0x74, + 0x71, 0x04, 0x86, 0xe4, 0x09, 0xfc, 0x16, 0xd3, 0xb7, 0x95, 0x38, 0xab, 0x91, 0x13, 0xb5, 0x43, + 0x32, 0x07, 0xc3, 0xbb, 0x2d, 0x76, 0x30, 0x94, 0xa6, 0x0b, 0x5b, 0xfd, 0xb6, 0xde, 0x36, 0x25, + 0x4d, 0xe6, 0x75, 0xab, 0x37, 0x47, 0x8e, 0x01, 0xd6, 0xaa, 0x29, 0xdc, 0xce, 0xd8, 0x46, 0xbd, + 0xbd, 0x89, 0x7a, 0x8b, 0x49, 0x59, 0x5b, 0x33, 0x99, 0xc2, 0xb3, 0x3e, 0x87, 0xcb, 0xbb, 0xad, + 0x90, 0x06, 0x51, 0xa5, 0xd5, 0x6a, 0xba, 0x75, 0x7e, 0xff, 0x85, 0x27, 0x75, 0x39, 0x59, 0xde, + 0x83, 0x41, 0x0e, 0x10, 0xd3, 0x44, 0xce, 0xc1, 0x4a, 0xab, 0x25, 0xec, 0x03, 0x77, 0xb9, 0xe6, + 0xcf, 0x4f, 0xfc, 0xb6, 0xc0, 0xb6, 0x7e, 0xa7, 0x00, 0x97, 0xf9, 0x17, 0x90, 0xcb, 0xfa, 0x3b, + 0x30, 0x82, 0xde, 0x49, 0x2d, 0xa7, 0x2e, 0xbf, 0x09, 0xee, 0xa6, 0x25, 0x81, 0x76, 0x5c, 0xae, + 0xf9, 0x7d, 0xf5, 0xe6, 0xfb, 0x7d, 0xc9, 0x0f, 0xac, 0x2f, 0xf3, 0x03, 0xfb, 0x0c, 0x2c, 0xd1, + 0xa2, 0x66, 0x33, 0xd5, 0xa8, 0xf0, 0x45, 0x5a, 0x65, 0xfd, 0xb7, 0x5e, 0x98, 0xbd, 0x4f, 0x3d, + 0x1a, 0x38, 0xd8, 0x4f, 0xc3, 0x12, 0xa5, 0x7b, 0x80, 0x14, 0x3a, 0x7a, 0x80, 0x94, 0xa5, 0x6d, + 0xaf, 0x17, 0x6d, 0x7b, 0x29, 0x67, 0x16, 0x76, 0x16, 0xdd, 0xb5, 0xd7, 0x44, 0xb7, 0xf0, 0x2c, + 0xda, 0x0e, 0x5c, 0xb4, 0xde, 0x93, 0xb5, 0xd8, 0x7b, 0xa4, 0xbf, 0xab, 0xcd, 0x61, 0x4a, 0xdc, + 0xa6, 0x0f, 0x09, 0xef, 0x11, 0xd3, 0x67, 0x64, 0x13, 0x06, 0xb9, 0x49, 0x12, 0xef, 0x98, 0x46, + 0x17, 0x6e, 0x88, 0x6f, 0x2a, 0xa7, 0x83, 0xc2, 0x7e, 0x89, 0x1b, 0x3b, 0x9f, 0x02, 0x11, 0x02, + 0x6c, 0xc1, 0x65, 0xee, 0x33, 0x18, 0xd5, 0x50, 0x4e, 0xb3, 0xf7, 0x2b, 0xd3, 0x28, 0x53, 0x47, + 0xbd, 0x03, 0x6e, 0x65, 0xd5, 0xf6, 0x7e, 0xeb, 0x23, 0x28, 0xa5, 0x5b, 0x23, 0xcc, 0x61, 0xdd, + 0xac, 0x6f, 0xd6, 0x32, 0x4c, 0xdf, 0xa7, 0x11, 0x4e, 0x5c, 0xfc, 0x88, 0x34, 0xc7, 0x9e, 0xc4, + 0x77, 0x26, 0x57, 0x55, 0x79, 0x17, 0xa5, 0x7f, 0xa5, 0x55, 0x98, 0x49, 0x70, 0x11, 0xf5, 0x7f, + 0x08, 0x43, 0x02, 0xa4, 0x56, 0x54, 0xe1, 0x48, 0x49, 0xf7, 0x45, 0xc1, 0xde, 0x02, 0x9f, 0xb7, + 0x82, 0xb3, 0x2d, 0x09, 0xac, 0x43, 0x38, 0xcf, 0xb6, 0xd9, 0x98, 0xab, 0x9a, 0x8e, 0x17, 0x61, + 0xa4, 0xc5, 0x14, 0x85, 0xd0, 0xfd, 0x09, 0x9f, 0x46, 0x03, 0xf6, 0x30, 0x03, 0x54, 0xdd, 0x9f, + 0x50, 0x72, 0x09, 0x00, 0x0b, 0xb1, 0x9b, 0x62, 0x15, 0x40, 0x74, 0x6e, 0x6e, 0x24, 0x80, 0x1e, + 0x54, 0x7c, 0xde, 0xd8, 0xf8, 0xb7, 0x15, 0xc0, 0x6c, 0xaa, 0x26, 0xd1, 0x81, 0x5b, 0x30, 0x2c, + 0xf5, 0xe3, 0xc4, 0x45, 0x80, 0xde, 0x03, 0x5b, 0x21, 0x91, 0x37, 0x60, 0xd2, 0xa3, 0xdf, 0x44, + 0xb5, 0x54, 0x1b, 0xc6, 0x19, 0x78, 0x5b, 0xb6, 0xc3, 0xfa, 0x15, 0x34, 0xfe, 0x56, 0x3d, 0xff, + 0xd9, 0xe3, 0xa6, 0xf3, 0x84, 0xa6, 0x2a, 0xfe, 0x3e, 0x0c, 0x57, 0xbb, 0x57, 0xcc, 0x3f, 0x1f, + 0x59, 0xb9, 0xad, 0x48, 0xac, 0x26, 0xcc, 0xb1, 0x2e, 0x55, 0x2b, 0x1b, 0xeb, 0x6b, 0x8d, 0xed, + 0x6f, 0x5b, 0x80, 0x4f, 0xe1, 0x62, 0x66, 0x6d, 0xdf, 0xb6, 0x10, 0xff, 0x65, 0x3f, 0xcc, 0xf2, + 0xcd, 0x24, 0x3d, 0x83, 0x4f, 0xbf, 0xd4, 0xfc, 0x52, 0xee, 0x51, 0x6f, 0x67, 0xdc, 0xa3, 0x22, + 0x89, 0x7e, 0x8f, 0x6a, 0xdc, 0x9e, 0xbe, 0x9f, 0x7d, 0x7b, 0x8a, 0x46, 0x28, 0xf3, 0xf6, 0x34, + 0x79, 0x67, 0xba, 0x92, 0x7f, 0x67, 0x8a, 0x97, 0x43, 0x19, 0x77, 0xa6, 0x59, 0x37, 0xa5, 0x09, + 0x47, 0x96, 0xe1, 0x57, 0xeb, 0xc8, 0xf2, 0x06, 0x0c, 0x55, 0x5a, 0x2d, 0xcd, 0x31, 0x0c, 0x87, + 0xc7, 0x69, 0xb5, 0xb8, 0xf0, 0x64, 0xa1, 0x5c, 0xe7, 0x21, 0x63, 0x9d, 0xff, 0x00, 0x60, 0x09, + 0x9d, 0xd7, 0x71, 0xe0, 0x46, 0x11, 0x03, 0x35, 0x7c, 0xee, 0xd2, 0x8e, 0x03, 0xa7, 0x9b, 0x57, + 0x62, 0x64, 0xae, 0xd8, 0x5b, 0x7b, 0x50, 0x4a, 0x4f, 0x9f, 0x57, 0xb0, 0x74, 0xfd, 0x71, 0x01, + 0x2e, 0x09, 0x25, 0x27, 0xf1, 0x81, 0x9f, 0x7d, 0x76, 0xbe, 0x0b, 0x63, 0x82, 0x76, 0x27, 0xfe, + 0x10, 0xf8, 0xc5, 0xb5, 0x5c, 0x8c, 0xf9, 0x8a, 0x6e, 0xa0, 0x91, 0x77, 0x61, 0x18, 0xff, 0x88, + 0x2f, 0x6f, 0x98, 0x64, 0x46, 0x10, 0xb5, 0x96, 0xbc, 0xc2, 0x51, 0xa8, 0xd6, 0xd7, 0x70, 0x39, + 0xaf, 0xe1, 0xaf, 0x40, 0x2e, 0xff, 0xaa, 0x00, 0x17, 0x05, 0x7b, 0x63, 0xa9, 0x78, 0xa1, 0x5d, + 0xe7, 0x0c, 0xee, 0xa4, 0x0f, 0x60, 0x94, 0x55, 0x28, 0xdb, 0xdd, 0x27, 0xb6, 0x56, 0x71, 0x72, + 0x88, 0x4b, 0x96, 0x9d, 0xc8, 0x11, 0x6e, 0x30, 0xce, 0x51, 0x53, 0x5a, 0x46, 0x6c, 0x9d, 0xd8, + 0xfa, 0x12, 0xe6, 0xb3, 0xbb, 0xf0, 0x0a, 0xe4, 0xf3, 0x00, 0xe6, 0x32, 0x36, 0x85, 0x17, 0xdb, + 0x93, 0xbf, 0x80, 0x8b, 0x99, 0xbc, 0x5e, 0x41, 0x33, 0x57, 0x99, 0xc6, 0x11, 0xbd, 0x82, 0x21, + 0xb4, 0x1e, 0xc1, 0x85, 0x0c, 0x4e, 0xaf, 0xa0, 0x89, 0xf7, 0x61, 0x56, 0x69, 0xda, 0x2f, 0xd5, + 0xc2, 0x0d, 0xb8, 0xc4, 0x19, 0xbd, 0x9a, 0x51, 0x79, 0x08, 0x17, 0x05, 0xbb, 0x57, 0x20, 0xbd, + 0x55, 0x98, 0x8f, 0x0f, 0xd4, 0x19, 0x7a, 0xd2, 0xa9, 0x17, 0x19, 0x6b, 0x1d, 0xae, 0xc4, 0x9c, + 0x72, 0x94, 0x86, 0xd3, 0x73, 0xe3, 0xea, 0x60, 0x3c, 0x4a, 0xaf, 0x64, 0x44, 0x1f, 0xc1, 0x79, + 0x83, 0xe9, 0x2b, 0x53, 0x95, 0xd6, 0x60, 0x8a, 0x33, 0x36, 0x55, 0xe7, 0x05, 0x5d, 0x75, 0x1e, + 0x5d, 0x38, 0x17, 0xb3, 0x44, 0xf0, 0xde, 0xdd, 0x0c, 0x6d, 0x7a, 0x03, 0xb5, 0x69, 0x89, 0x12, + 0xb7, 0xf0, 0x5d, 0x18, 0xe4, 0x10, 0xd1, 0xbe, 0x0c, 0x66, 0xfc, 0xb0, 0xc0, 0xc9, 0x04, 0xb2, + 0xf5, 0x43, 0xb8, 0xc4, 0x4f, 0xa2, 0xf1, 0x45, 0xa5, 0x79, 0x5a, 0xfc, 0x7e, 0xe2, 0x20, 0x7a, + 0x41, 0xf0, 0x4d, 0xe2, 0xe7, 0x9c, 0x47, 0xf7, 0xe5, 0xdc, 0xce, 0xe3, 0x7f, 0xaa, 0x87, 0x45, + 0xf2, 0x80, 0xd9, 0x9b, 0x79, 0xc0, 0xbc, 0x06, 0x57, 0xd5, 0x01, 0x33, 0x59, 0x8d, 0x9c, 0x5a, + 0xd6, 0x97, 0x70, 0x91, 0x77, 0x54, 0xba, 0xf6, 0x99, 0xcd, 0xf8, 0x28, 0xd1, 0xcd, 0x59, 0xd1, + 0x4d, 0x13, 0x3b, 0xa7, 0x93, 0x7f, 0xbb, 0x20, 0x3f, 0xb9, 0x6c, 0xe6, 0xbf, 0xec, 0x13, 0xf7, + 0x26, 0x94, 0x95, 0x40, 0xcc, 0x16, 0xbd, 0xd8, 0x71, 0x7b, 0x03, 0x66, 0x74, 0x36, 0x6e, 0x9d, + 0xee, 0xdd, 0xc1, 0x1b, 0xa4, 0x77, 0xd8, 0x67, 0x81, 0x00, 0x39, 0xed, 0x4a, 0x19, 0x72, 0x43, + 0x7c, 0x5b, 0x61, 0x5a, 0x35, 0x98, 0x4f, 0x0f, 0x85, 0x5b, 0x97, 0xfe, 0xde, 0xe4, 0x53, 0xf6, + 0x09, 0x23, 0x44, 0x0c, 0x46, 0x2e, 0x53, 0xf9, 0x1d, 0x73, 0x72, 0x49, 0x65, 0x59, 0x72, 0xa9, + 0x49, 0xf4, 0x9f, 0xd5, 0x2e, 0xe7, 0xc3, 0xaf, 0x03, 0x91, 0x45, 0x4b, 0x55, 0x5b, 0x56, 0x7d, + 0x01, 0xfa, 0x96, 0xaa, 0xb6, 0x78, 0x66, 0x82, 0x9a, 0x60, 0x3d, 0x0c, 0x6c, 0x06, 0x4b, 0x6a, + 0xe4, 0xbd, 0xa7, 0xd0, 0xc8, 0x1f, 0xf4, 0x0f, 0xf7, 0x15, 0xfb, 0x6d, 0x52, 0x75, 0x0f, 0xbc, + 0x47, 0x6e, 0x74, 0xa8, 0x2a, 0xac, 0x58, 0x5f, 0xc1, 0x94, 0x51, 0xbd, 0xf8, 0x8a, 0x3b, 0xbe, + 0x8f, 0x61, 0xfa, 0xec, 0x52, 0x05, 0x5d, 0x5f, 0xd0, 0x64, 0x31, 0xc6, 0xd7, 0x9b, 0xba, 0x53, + 0xc3, 0xc7, 0x97, 0xb6, 0x2c, 0xb4, 0xfe, 0x51, 0xbf, 0xc6, 0x5d, 0x7b, 0x75, 0xd4, 0xa1, 0x77, + 0x77, 0x00, 0xf8, 0x0c, 0xd1, 0x3a, 0xc7, 0x14, 0xc0, 0x51, 0xe1, 0x51, 0xc2, 0x97, 0x64, 0x5b, + 0x43, 0x3a, 0xed, 0xab, 0x24, 0xe1, 0x07, 0xcc, 0x89, 0xe4, 0x43, 0x3c, 0xe5, 0x07, 0x2c, 0x58, + 0x87, 0xb6, 0x8e, 0x44, 0x7e, 0x98, 0x74, 0x9e, 0x1f, 0xc0, 0x0b, 0xab, 0xd7, 0xe4, 0x0d, 0x76, + 0xba, 0x6f, 0x67, 0xf3, 0x9f, 0x7f, 0x06, 0x33, 0x8c, 0xd6, 0x7d, 0x8c, 0x07, 0x8b, 0x95, 0x6f, + 0x22, 0xea, 0xf1, 0xb5, 0x7d, 0x10, 0xeb, 0x79, 0xbd, 0x43, 0x3d, 0x31, 0xb2, 0xb0, 0xbf, 0xc7, + 0x7c, 0x6a, 0x54, 0x95, 0xd9, 0xd9, 0xfc, 0x71, 0x12, 0xd9, 0xeb, 0x2b, 0x5e, 0xa3, 0xe5, 0xbb, + 0xea, 0xc0, 0xc4, 0x27, 0x51, 0xd0, 0xac, 0x51, 0x01, 0xb7, 0x75, 0x24, 0xeb, 0x8d, 0x8e, 0xde, + 0xe5, 0xc3, 0xd0, 0xbf, 0xb3, 0xb4, 0xb3, 0x5e, 0x2c, 0x58, 0xb7, 0x00, 0xb4, 0x9a, 0x00, 0x06, + 0x37, 0xb7, 0xec, 0x8d, 0xca, 0x7a, 0xb1, 0x87, 0xcc, 0xc0, 0xb9, 0x47, 0x6b, 0x9b, 0xcb, 0x5b, + 0x8f, 0xaa, 0xb5, 0xea, 0x46, 0xc5, 0xde, 0x59, 0xaa, 0xd8, 0xcb, 0xc5, 0x82, 0xf5, 0x35, 0x4c, + 0x9b, 0x3d, 0x7c, 0xa5, 0x93, 0x30, 0x82, 0x29, 0xa5, 0xcf, 0x3c, 0x78, 0xb4, 0xa3, 0x79, 0x9d, + 0x8a, 0xc3, 0x5f, 0xd2, 0x7b, 0x4a, 0x1c, 0x13, 0xc5, 0x67, 0xa4, 0x21, 0x91, 0xb7, 0xb8, 0x5a, + 0x90, 0x7c, 0x57, 0xca, 0xd4, 0x82, 0x5a, 0xac, 0x17, 0xe0, 0xd2, 0xf7, 0x3d, 0x98, 0x36, 0x6b, + 0x3d, 0xad, 0x95, 0xea, 0x35, 0x74, 0xc7, 0xd5, 0x9e, 0x9d, 0x10, 0xa2, 0x5f, 0x1b, 0x88, 0x95, + 0xf5, 0x7b, 0x50, 0x14, 0x58, 0xf1, 0xce, 0x7b, 0x4d, 0x9a, 0x11, 0x0b, 0x19, 0x4f, 0xe4, 0xa4, + 0x73, 0xb8, 0x0f, 0x45, 0xb6, 0x62, 0x0a, 0x4a, 0x5e, 0xc1, 0x34, 0x0c, 0xac, 0xc7, 0xd7, 0x39, + 0x36, 0xff, 0x81, 0xaf, 0x2f, 0x22, 0x27, 0x88, 0xa4, 0xaf, 0xda, 0x88, 0xad, 0x7e, 0x93, 0xb7, + 0x60, 0xf0, 0x9e, 0xdb, 0x8c, 0x84, 0x69, 0x24, 0xde, 0xe4, 0x19, 0x5b, 0x5e, 0x60, 0x0b, 0x04, + 0xcb, 0x86, 0x73, 0x5a, 0x85, 0x67, 0x68, 0x2a, 0x29, 0xc1, 0xd0, 0x26, 0xfd, 0x46, 0xab, 0x5f, + 0xfe, 0xb4, 0xde, 0x83, 0x73, 0xc2, 0x0f, 0x50, 0x13, 0xd3, 0x55, 0xf1, 0x92, 0xb7, 0x60, 0x3c, + 0x27, 0x14, 0x2c, 0xb1, 0x88, 0xd1, 0xed, 0xb6, 0x1a, 0x2f, 0x48, 0xc7, 0x36, 0x8a, 0x33, 0xd2, + 0xbd, 0x29, 0x6f, 0x81, 0xba, 0x0d, 0xe7, 0x9f, 0x16, 0xa0, 0x94, 0xb0, 0x32, 0x2c, 0x1d, 0x3a, + 0xcd, 0x26, 0xf5, 0x0e, 0x28, 0xb9, 0x0e, 0xfd, 0x3b, 0x5b, 0x3b, 0xdb, 0xc2, 0x4a, 0x2a, 0xbd, + 0x0b, 0x18, 0x48, 0xe1, 0xd8, 0x88, 0x41, 0x1e, 0xc2, 0x39, 0xe9, 0xe9, 0xab, 0x8a, 0xc4, 0x08, + 0x5d, 0xea, 0xec, 0x37, 0x9c, 0xa6, 0x23, 0xef, 0x08, 0x93, 0xc8, 0x8f, 0xdb, 0x6e, 0x40, 0x1b, + 0x68, 0xf9, 0x89, 0xaf, 0xea, 0xb5, 0x12, 0x5b, 0x47, 0xe3, 0xef, 0x2e, 0xad, 0xdf, 0x2b, 0xc0, + 0x6c, 0x8e, 0xd5, 0x84, 0xbc, 0x65, 0x74, 0x67, 0x4a, 0xeb, 0x8e, 0x44, 0x59, 0xed, 0x11, 0xfd, + 0x59, 0xd2, 0xdc, 0x9f, 0xfb, 0xce, 0xe0, 0xfe, 0xbc, 0xda, 0x13, 0xbb, 0x3c, 0x2f, 0x02, 0x0c, + 0x4b, 0xb8, 0x35, 0x09, 0xe3, 0x86, 0xdc, 0x2c, 0x0b, 0xc6, 0xf4, 0x9a, 0xd9, 0xe0, 0x2c, 0xf9, + 0x0d, 0x35, 0x38, 0xec, 0x6f, 0xeb, 0x77, 0x0b, 0x30, 0x8d, 0x5d, 0x3c, 0x70, 0xd9, 0xd2, 0x17, + 0x4b, 0x68, 0xc1, 0xe8, 0xc9, 0xbc, 0xd1, 0x93, 0x04, 0xae, 0xea, 0xd2, 0x87, 0xa9, 0x2e, 0xcd, + 0x67, 0x75, 0x09, 0xa7, 0xb7, 0xeb, 0x7b, 0x46, 0x4f, 0xb4, 0xab, 0xa8, 0xdf, 0x2f, 0xc0, 0x94, + 0xd6, 0x26, 0xd5, 0xfe, 0x3b, 0x46, 0x93, 0x2e, 0x66, 0x34, 0x29, 0x25, 0xe4, 0xc5, 0x54, 0x8b, + 0x5e, 0xeb, 0xd4, 0xa2, 0xae, 0x32, 0xfe, 0x2f, 0x05, 0x98, 0xc9, 0x94, 0x01, 0x39, 0xcf, 0x74, + 0xdb, 0x7a, 0x40, 0x23, 0x21, 0x5e, 0xf1, 0x8b, 0xc1, 0xd7, 0xc2, 0xb0, 0x4d, 0x03, 0xf1, 0x9d, + 0x8b, 0x5f, 0xe4, 0x35, 0x18, 0xdf, 0xa6, 0x81, 0xeb, 0x37, 0xb8, 0x63, 0x3c, 0xf7, 0x38, 0x1d, + 0xb7, 0x4d, 0x20, 0x99, 0x87, 0x91, 0x4a, 0xf3, 0xc0, 0x0f, 0xdc, 0xe8, 0x90, 0xdf, 0x06, 0x8e, + 0xd8, 0x31, 0x80, 0xf1, 0x5e, 0x76, 0x0f, 0xf8, 0xa5, 0x06, 0x23, 0x16, 0xbf, 0xd8, 0xe2, 0x22, + 0xad, 0x85, 0x83, 0x7c, 0x71, 0x91, 0xa6, 0xc0, 0xf3, 0x30, 0xf8, 0x99, 0x8d, 0x93, 0x00, 0x5f, + 0xbb, 0xdb, 0xe2, 0x17, 0x99, 0x40, 0xd7, 0x66, 0x7c, 0x4b, 0x81, 0x2e, 0xcd, 0x1f, 0xc2, 0x74, + 0x96, 0x5c, 0xb3, 0xa6, 0x90, 0xa0, 0xed, 0x55, 0xb4, 0x5f, 0xc2, 0x54, 0xa5, 0xd1, 0xd8, 0xb8, + 0x57, 0xe1, 0x3e, 0x07, 0x62, 0x54, 0xf9, 0xc7, 0xc3, 0xed, 0x75, 0x42, 0x65, 0xeb, 0x5f, 0xf3, + 0xdc, 0xc8, 0x9e, 0x5a, 0xf9, 0xc6, 0x0d, 0x23, 0xd7, 0x3b, 0xd0, 0x8c, 0x8a, 0xf6, 0xf9, 0x4d, + 0xfa, 0x2c, 0x63, 0x0a, 0xb0, 0xdd, 0xd4, 0xe4, 0xcd, 0xe1, 0x19, 0xcc, 0xa7, 0x35, 0xb6, 0xf1, + 0x52, 0x32, 0x6b, 0xf2, 0x8d, 0x0b, 0xfa, 0x2a, 0xf5, 0x27, 0xd6, 0xf7, 0xe0, 0x3c, 0x5f, 0xd2, + 0x3a, 0x35, 0x5e, 0x34, 0x5b, 0xb7, 0x81, 0x5a, 0xef, 0x4b, 0x2b, 0x45, 0xc7, 0x96, 0xd9, 0x63, + 0x46, 0x5b, 0xb0, 0xca, 0xff, 0x5a, 0x80, 0xb9, 0x04, 0x69, 0xf5, 0xb9, 0x57, 0x97, 0xeb, 0xe9, + 0x1b, 0x49, 0xd7, 0x71, 0xd4, 0x03, 0xb8, 0xf1, 0xcf, 0x6d, 0x28, 0xef, 0x71, 0x72, 0x0b, 0x80, + 0x13, 0x6b, 0xdb, 0x37, 0x9a, 0xbe, 0x85, 0x07, 0x0f, 0x6e, 0xe0, 0x1a, 0x0a, 0x69, 0x43, 0x96, + 0xdc, 0xc5, 0x37, 0xd2, 0xcd, 0x36, 0x8c, 0x11, 0x1e, 0xa8, 0x20, 0xaf, 0xe5, 0x18, 0x89, 0xb3, + 0xf8, 0x5b, 0x7f, 0xa7, 0x0f, 0x66, 0xf5, 0x01, 0x7c, 0x91, 0xbe, 0x6e, 0xc3, 0xe8, 0x92, 0xef, + 0x45, 0xf4, 0x9b, 0x48, 0x7b, 0x61, 0x4f, 0xd4, 0x4d, 0xbb, 0x2a, 0x11, 0xaa, 0x23, 0x07, 0xd4, + 0x98, 0x1e, 0x63, 0x78, 0x22, 0xc6, 0x88, 0x64, 0x09, 0xc6, 0x37, 0xe9, 0xb3, 0x94, 0x00, 0xd1, + 0x1b, 0xd2, 0xa3, 0xcf, 0x6a, 0x9a, 0x10, 0x75, 0x17, 0x35, 0x83, 0x86, 0xec, 0xc3, 0x84, 0x9c, + 0x5c, 0x86, 0x30, 0xe7, 0xf4, 0x5d, 0xc5, 0x9c, 0xce, 0xfc, 0x0d, 0x3a, 0xab, 0x21, 0x47, 0x86, + 0x09, 0x8e, 0xac, 0xeb, 0xbc, 0x46, 0xfe, 0xac, 0xda, 0xdc, 0xb6, 0xb4, 0x12, 0xc3, 0xd7, 0x34, + 0xf9, 0x9c, 0x5a, 0x67, 0x61, 0x6d, 0x43, 0x29, 0x3d, 0x1e, 0xa2, 0xb6, 0x77, 0x60, 0x90, 0x43, + 0x85, 0x1a, 0x20, 0x83, 0xa7, 0x28, 0x6c, 0x7e, 0x4e, 0xe7, 0xd5, 0xd8, 0x02, 0xd7, 0x5a, 0x45, + 0xdb, 0x89, 0xc2, 0x51, 0x8a, 0xd8, 0xed, 0xe4, 0xf0, 0xa2, 0x1b, 0xaf, 0x1c, 0x5e, 0xdd, 0xcf, + 0x44, 0x3e, 0x89, 0x58, 0x42, 0xf3, 0x93, 0xce, 0x49, 0x34, 0xec, 0x06, 0x0c, 0x09, 0x50, 0x22, + 0xac, 0x4b, 0xfc, 0xf9, 0x49, 0x04, 0xeb, 0x43, 0xb8, 0x80, 0xb6, 0x30, 0xd7, 0x3b, 0x68, 0xd2, + 0xdd, 0xd0, 0x78, 0xd4, 0xd0, 0xed, 0xb3, 0xfe, 0x18, 0xe6, 0xb2, 0x68, 0xbb, 0x7e, 0xd9, 0x3c, + 0xd0, 0xc2, 0x5f, 0xf4, 0xc2, 0xf4, 0x5a, 0xa8, 0x2b, 0x13, 0x42, 0x12, 0x37, 0xb3, 0x42, 0x00, + 0xa0, 0x4c, 0x56, 0x7b, 0xb2, 0x9e, 0xf8, 0xbf, 0xa3, 0x3d, 0xa9, 0xec, 0xed, 0xf4, 0xb6, 0x9f, + 0x6d, 0x5b, 0xea, 0x51, 0xe5, 0x1b, 0xd0, 0xbf, 0xc9, 0x96, 0xea, 0x3e, 0x31, 0x76, 0x9c, 0x82, + 0x81, 0xf0, 0x49, 0x23, 0xdb, 0x22, 0xd9, 0x0f, 0x72, 0x2f, 0xf5, 0x70, 0xb2, 0xbf, 0xfb, 0xdb, + 0xf5, 0xd5, 0x9e, 0xd4, 0x1b, 0xca, 0xf7, 0x60, 0xb4, 0xd2, 0x38, 0xe2, 0xee, 0x86, 0xbe, 0x97, + 0xf8, 0x2c, 0xb5, 0x92, 0xd5, 0x1e, 0x5b, 0x47, 0x64, 0x27, 0xdc, 0x4a, 0xab, 0x85, 0x1b, 0x55, + 0xd6, 0x7b, 0xfe, 0xd5, 0x1e, 0xf4, 0xde, 0x5f, 0x1c, 0x86, 0xc1, 0x1d, 0x27, 0x38, 0xa0, 0x91, + 0xf5, 0x25, 0xcc, 0x09, 0x27, 0x15, 0x6e, 0xf9, 0x43, 0x57, 0x96, 0x30, 0xf6, 0x43, 0xea, 0xe4, + 0x58, 0x72, 0x19, 0x00, 0xf5, 0xfc, 0x35, 0xaf, 0x41, 0xbf, 0x11, 0x5e, 0x72, 0x1a, 0xc4, 0x7a, + 0x17, 0x46, 0x94, 0x84, 0x50, 0x99, 0xd5, 0x36, 0x3b, 0x94, 0xd6, 0xb4, 0xf1, 0x52, 0x54, 0x3e, + 0x0f, 0xbd, 0x60, 0xf4, 0x5d, 0xc4, 0xe7, 0xe0, 0xda, 0xaf, 0x0b, 0x33, 0x89, 0x49, 0x10, 0x3f, + 0x00, 0x57, 0xfa, 0x27, 0x77, 0xe3, 0x53, 0xbf, 0x93, 0xea, 0x69, 0xef, 0xa9, 0xd4, 0x53, 0xeb, + 0x9f, 0xf6, 0xe2, 0xc1, 0x29, 0x25, 0x8f, 0x84, 0x0d, 0x4a, 0xb7, 0x83, 0x2d, 0xc2, 0x08, 0xf6, + 0x7e, 0x59, 0x3e, 0x58, 0xeb, 0xec, 0x63, 0x31, 0xfc, 0xb3, 0xe3, 0x72, 0x0f, 0x3a, 0x56, 0xc4, + 0x64, 0xe4, 0x13, 0x18, 0x5a, 0xf1, 0x1a, 0xc8, 0xa1, 0xef, 0x0c, 0x1c, 0x24, 0x11, 0x1b, 0x13, + 0x6c, 0xf2, 0x0e, 0xfb, 0x84, 0xb9, 0xe9, 0xc2, 0xd6, 0x20, 0xf1, 0x09, 0x6e, 0x20, 0xef, 0x04, + 0x37, 0x98, 0x38, 0xc1, 0x59, 0x30, 0xb0, 0x15, 0x34, 0x44, 0x5c, 0x8d, 0x89, 0x85, 0x31, 0x21, + 0x38, 0x84, 0xd9, 0xbc, 0xc8, 0xfa, 0xef, 0x05, 0x98, 0xbd, 0x4f, 0xa3, 0xcc, 0x39, 0x64, 0x48, + 0xa5, 0xf0, 0xd2, 0x52, 0xe9, 0x7d, 0x11, 0xa9, 0xa8, 0x5e, 0xf7, 0xe5, 0xf5, 0xba, 0x3f, 0xaf, + 0xd7, 0x03, 0xf9, 0xbd, 0xbe, 0x0f, 0x83, 0xbc, 0xab, 0xec, 0x94, 0xba, 0x16, 0xd1, 0xa3, 0xf8, + 0x94, 0xaa, 0x7b, 0x88, 0xd9, 0xbc, 0x8c, 0x29, 0x92, 0xeb, 0x4e, 0xa8, 0x9f, 0x52, 0xc5, 0x4f, + 0xeb, 0x47, 0xf8, 0xd4, 0x75, 0xdd, 0xaf, 0x3f, 0xd1, 0xac, 0x9d, 0x43, 0xfc, 0x0b, 0x4d, 0x5a, + 0xc7, 0x19, 0x16, 0x2f, 0xb1, 0x25, 0x06, 0xb9, 0x02, 0xa3, 0x6b, 0xde, 0x3d, 0x3f, 0xa8, 0xd3, + 0x2d, 0xaf, 0xc9, 0xb9, 0x0f, 0xdb, 0x3a, 0x48, 0x58, 0x01, 0x44, 0x0d, 0xf1, 0xd1, 0x1a, 0x01, + 0x89, 0xa3, 0x35, 0x83, 0xed, 0x2d, 0xd8, 0xbc, 0x4c, 0x18, 0x19, 0xd8, 0xdf, 0x9d, 0x4e, 0xa5, + 0xea, 0xf8, 0xda, 0x0d, 0x71, 0x1f, 0x2e, 0xd8, 0xb4, 0xd5, 0x74, 0x98, 0x4e, 0x77, 0xe4, 0x73, + 0x7c, 0xd5, 0xe7, 0x2b, 0x19, 0xcf, 0xd4, 0x4c, 0x7f, 0x01, 0xd5, 0xe4, 0xde, 0x0e, 0x4d, 0x3e, + 0x82, 0xab, 0xf7, 0x69, 0x64, 0x2e, 0xa8, 0xb1, 0x2d, 0x55, 0x74, 0x7e, 0x15, 0x86, 0x43, 0xd3, + 0x0e, 0x7c, 0x59, 0x5e, 0x3f, 0x64, 0x11, 0xee, 0xdd, 0x95, 0x37, 0x25, 0x82, 0x8f, 0xfa, 0xcb, + 0xfa, 0x14, 0xca, 0x79, 0xd5, 0x9d, 0xce, 0x9d, 0xd3, 0x85, 0x2b, 0xf9, 0x0c, 0x44, 0x73, 0x57, + 0x40, 0xda, 0x8c, 0xc5, 0x27, 0xd4, 0xad, 0xb5, 0xa6, 0x99, 0x59, 0xfc, 0x61, 0x2d, 0x4a, 0xc7, + 0xb6, 0x97, 0x68, 0x6e, 0x0d, 0xaf, 0x63, 0x4d, 0x06, 0xb1, 0x5c, 0x2b, 0x30, 0x2c, 0x61, 0x42, + 0xae, 0xb3, 0x99, 0x2d, 0x95, 0x02, 0x6d, 0x48, 0x06, 0x8a, 0xcc, 0xfa, 0x91, 0xbc, 0x9a, 0x30, + 0x29, 0x4e, 0xf7, 0x6e, 0xf3, 0x34, 0x77, 0x11, 0x96, 0x0f, 0x17, 0x4c, 0xde, 0xba, 0xc9, 0xb9, + 0xa8, 0x99, 0x9c, 0xb9, 0xa5, 0xf9, 0x8a, 0x69, 0x02, 0xed, 0x15, 0xf3, 0x32, 0x06, 0x91, 0xcb, + 0xba, 0x61, 0x79, 0x2c, 0xfd, 0x10, 0xf4, 0x36, 0xcc, 0x65, 0x55, 0xa8, 0x9d, 0x03, 0x95, 0xf5, + 0x52, 0xe8, 0x3b, 0xcb, 0x70, 0x59, 0x46, 0xb6, 0xf1, 0xfd, 0x28, 0x8c, 0x02, 0xa7, 0x55, 0xad, + 0x07, 0x6e, 0x2b, 0xa6, 0xb2, 0x60, 0x90, 0x43, 0x84, 0x24, 0xf8, 0x35, 0x0f, 0xc7, 0x11, 0x25, + 0xd6, 0x6f, 0x16, 0xc0, 0x32, 0x7c, 0x90, 0x70, 0x9c, 0xb7, 0x03, 0xff, 0xa9, 0xdb, 0xd0, 0xae, + 0x56, 0xde, 0x32, 0xcc, 0x7a, 0xfc, 0xbd, 0x5d, 0xd2, 0xfd, 0x59, 0xac, 0x99, 0xb7, 0x13, 0xa6, + 0x36, 0xae, 0x78, 0xa2, 0x5f, 0x92, 0xe9, 0xec, 0xaf, 0x4c, 0x70, 0xff, 0xb3, 0x00, 0xd7, 0x3a, + 0xb6, 0x41, 0xf4, 0x67, 0x1f, 0x8a, 0xc9, 0x32, 0x31, 0x83, 0xca, 0x9a, 0x4f, 0x42, 0x9a, 0xc3, + 0xde, 0x1d, 0xee, 0x63, 0x2d, 0x7d, 0x77, 0x5a, 0x8a, 0x73, 0x8a, 0xdf, 0xd9, 0x5b, 0x4f, 0x3e, + 0x00, 0xd8, 0xf1, 0x23, 0xa7, 0xb9, 0x84, 0x06, 0x80, 0xbe, 0xd8, 0x5f, 0x3e, 0x62, 0xd0, 0x5a, + 0x32, 0xb4, 0x82, 0x86, 0x6c, 0xfd, 0x00, 0xbf, 0xeb, 0xec, 0x46, 0x9f, 0xee, 0x53, 0x5b, 0x82, + 0x6b, 0x89, 0x7b, 0xf1, 0x17, 0x60, 0x12, 0xc1, 0x0c, 0x13, 0x3f, 0xd3, 0xbd, 0xef, 0x07, 0x7e, + 0xbb, 0xf5, 0xcb, 0x19, 0xf5, 0x3f, 0x29, 0x70, 0x47, 0x45, 0xbd, 0x5a, 0x31, 0xd0, 0x4b, 0x00, + 0x31, 0x34, 0xe1, 0xb0, 0xae, 0x0a, 0xf6, 0xee, 0xf0, 0x23, 0x37, 0x5a, 0xcc, 0x0f, 0x38, 0x03, + 0x8d, 0xec, 0x97, 0x3b, 0x92, 0x77, 0xf1, 0x32, 0x5c, 0xd5, 0x7e, 0x3a, 0xb9, 0xbf, 0x27, 0xed, + 0x1f, 0x67, 0xa4, 0x3b, 0x84, 0x69, 0xb6, 0x02, 0x54, 0xda, 0xd1, 0xa1, 0x1f, 0xb8, 0x91, 0x7c, + 0x7a, 0x41, 0xb6, 0xc5, 0x8b, 0x74, 0x4e, 0xf5, 0xf1, 0x2f, 0x8e, 0xcb, 0xef, 0x9f, 0x25, 0xe2, + 0xa0, 0xe4, 0xb9, 0xa3, 0x5e, 0xb1, 0x5b, 0xb3, 0xd0, 0xb7, 0x64, 0xaf, 0xe3, 0x82, 0x67, 0xaf, + 0xab, 0x05, 0xcf, 0x5e, 0xb7, 0xfe, 0xaa, 0x17, 0xca, 0x3c, 0x66, 0x06, 0xfa, 0x50, 0xc4, 0x56, + 0x0b, 0xcd, 0x29, 0xe3, 0xb4, 0x06, 0x86, 0x44, 0x4c, 0x8c, 0xde, 0xd3, 0xc4, 0xc4, 0xf8, 0x35, + 0xc8, 0x31, 0x59, 0x9d, 0xc2, 0x0a, 0xf0, 0xe6, 0xc9, 0x71, 0xf9, 0x5a, 0x6c, 0x05, 0xe0, 0xa5, + 0x59, 0xe6, 0x80, 0x9c, 0x2a, 0xd2, 0xf6, 0x8b, 0xfe, 0x17, 0xb0, 0x5f, 0xdc, 0x86, 0x21, 0x3c, + 0xcc, 0xac, 0x6d, 0x0b, 0xaf, 0x46, 0x9c, 0x9e, 0x18, 0x05, 0xa7, 0xe6, 0xea, 0xa1, 0xc8, 0x24, + 0x9a, 0xf5, 0xf7, 0x7b, 0xe1, 0x4a, 0xbe, 0xcc, 0x45, 0xdb, 0x96, 0x01, 0x62, 0xef, 0x8d, 0x4e, + 0xde, 0x22, 0xf8, 0xed, 0x3c, 0xa3, 0xfb, 0xca, 0x5b, 0x4b, 0xa3, 0x63, 0xba, 0x8f, 0x7c, 0x45, + 0x9c, 0xb8, 0x2a, 0x30, 0x1e, 0x17, 0x8b, 0x38, 0x9a, 0x02, 0x64, 0xc4, 0xd1, 0x14, 0x30, 0xb2, + 0x0f, 0xb3, 0xdb, 0x81, 0xfb, 0xd4, 0x89, 0xe8, 0x43, 0xfa, 0x9c, 0x3f, 0x84, 0x59, 0x11, 0xaf, + 0x5f, 0xf8, 0xd3, 0xf0, 0xeb, 0x27, 0xc7, 0xe5, 0xd7, 0x5a, 0x1c, 0x85, 0x7d, 0x98, 0x35, 0xfe, + 0xae, 0xb1, 0x96, 0x7e, 0x10, 0x93, 0xc7, 0xc8, 0xfa, 0xb7, 0x05, 0xb8, 0x88, 0x6a, 0xb9, 0x30, + 0xbb, 0xca, 0xca, 0x5f, 0xc8, 0x69, 0x50, 0xef, 0xa0, 0x98, 0x8b, 0xe8, 0x34, 0x68, 0xbc, 0xb2, + 0xb6, 0x0d, 0x34, 0xb2, 0x06, 0xa3, 0xe2, 0x37, 0x7e, 0x7f, 0x7d, 0x78, 0x20, 0x98, 0xd1, 0x16, + 0x2c, 0x9c, 0xea, 0xdc, 0x54, 0x84, 0x13, 0x5b, 0x30, 0xc3, 0xc7, 0x88, 0xb6, 0x4e, 0x6b, 0xfd, + 0xbc, 0x17, 0xe6, 0xf7, 0x68, 0xe0, 0x3e, 0x7e, 0x9e, 0xd3, 0x99, 0x2d, 0x98, 0x96, 0x20, 0x1e, + 0x37, 0xc3, 0xf8, 0xc4, 0x78, 0x2c, 0x3d, 0xd9, 0x54, 0x11, 0x78, 0x43, 0x7e, 0x71, 0x99, 0x84, + 0x67, 0x70, 0x07, 0x7c, 0x07, 0x86, 0x13, 0x91, 0x6b, 0x70, 0xfc, 0xe5, 0x17, 0x1a, 0x0f, 0xd5, + 0x6a, 0x8f, 0xad, 0x30, 0xc9, 0x6f, 0xe5, 0xdf, 0xdf, 0x08, 0xd3, 0x47, 0x37, 0xfb, 0x27, 0x7e, + 0xb0, 0xec, 0x63, 0x75, 0xb4, 0xd2, 0x8c, 0x0f, 0x76, 0xb5, 0xc7, 0xce, 0xab, 0x69, 0x71, 0x14, + 0x46, 0x2a, 0x78, 0x27, 0xc5, 0x4e, 0xee, 0xff, 0xa3, 0x17, 0x2e, 0xcb, 0x47, 0x2d, 0x39, 0x62, + 0xfe, 0x1c, 0x66, 0x25, 0xa8, 0xd2, 0x62, 0x0a, 0x03, 0x6d, 0x98, 0x92, 0xe6, 0xf1, 0x2c, 0xa5, + 0xa4, 0x1d, 0x81, 0x13, 0x0b, 0x3b, 0x8f, 0xfc, 0xd5, 0x58, 0x3f, 0x3f, 0xc9, 0x8a, 0x23, 0x84, + 0x56, 0x48, 0x7d, 0xcd, 0x34, 0x44, 0x63, 0xac, 0x9f, 0x8d, 0x94, 0xf5, 0xb4, 0xff, 0x65, 0xad, + 0xa7, 0xab, 0x3d, 0x49, 0xfb, 0xe9, 0xe2, 0x04, 0x8c, 0x6d, 0xd2, 0x67, 0xb1, 0xdc, 0xff, 0xdf, + 0x42, 0x22, 0x8c, 0x01, 0xd3, 0x30, 0x78, 0x3c, 0x83, 0x42, 0x1c, 0x8a, 0x06, 0xc3, 0x18, 0xe8, + 0x1a, 0x06, 0x47, 0x5d, 0x83, 0x21, 0x7e, 0x51, 0xdb, 0x38, 0xc5, 0x09, 0x5f, 0xbd, 0x4e, 0xe1, + 0x4f, 0x06, 0x1b, 0xfc, 0xb0, 0x2f, 0xe8, 0xad, 0x87, 0x70, 0x55, 0xf8, 0x2f, 0x9b, 0x83, 0x8f, + 0x15, 0x9d, 0x71, 0xfb, 0xb2, 0x1c, 0xb8, 0x7c, 0x9f, 0x26, 0x97, 0x1e, 0xe3, 0xf5, 0xce, 0xa7, + 0x30, 0x69, 0xc0, 0x15, 0x47, 0xd4, 0x4a, 0xd5, 0x1c, 0x52, 0xac, 0x93, 0xd8, 0xd6, 0x95, 0xac, + 0x2a, 0xf4, 0xc6, 0x5a, 0x14, 0x03, 0x53, 0x06, 0xf1, 0x15, 0x5b, 0x78, 0x86, 0x55, 0xef, 0xba, + 0xf6, 0x5d, 0xf3, 0x15, 0x8f, 0x47, 0xa8, 0x93, 0x3b, 0xaf, 0x2a, 0xb5, 0xc6, 0x8d, 0xbb, 0x00, + 0x6b, 0x02, 0xc6, 0x64, 0x51, 0x93, 0x86, 0xa1, 0xf5, 0xd3, 0x01, 0xb0, 0x84, 0x60, 0xb3, 0x6e, + 0x9f, 0xa5, 0x3c, 0xf6, 0x53, 0x8d, 0x15, 0x1b, 0xd5, 0x79, 0x3d, 0x26, 0x62, 0x5c, 0xca, 0x67, + 0x1e, 0xea, 0x79, 0xf5, 0x18, 0x6a, 0xcc, 0xbc, 0x54, 0xef, 0xbf, 0xca, 0x59, 0x26, 0xf9, 0xc7, + 0x86, 0xcf, 0x91, 0x73, 0x96, 0x49, 0x83, 0x6f, 0xf6, 0x92, 0x69, 0x9b, 0x57, 0x22, 0x7d, 0x2f, + 0x72, 0x25, 0xc2, 0xbe, 0x48, 0xfd, 0x52, 0x64, 0xd7, 0x94, 0xa5, 0xf8, 0x1e, 0xe5, 0x95, 0xb6, + 0x5e, 0x24, 0xa2, 0x09, 0x68, 0x10, 0x83, 0xab, 0xc1, 0x86, 0xb8, 0x50, 0xd4, 0x6c, 0x96, 0x4b, + 0x87, 0xb4, 0xfe, 0x44, 0xd8, 0x8a, 0xe5, 0x85, 0x6e, 0x96, 0xcd, 0x9c, 0xc7, 0xc6, 0xe5, 0xdf, + 0x39, 0x2f, 0xa8, 0xd5, 0x19, 0xa9, 0x1e, 0x0d, 0x21, 0xc9, 0x96, 0xfc, 0x04, 0xa6, 0xd4, 0x50, + 0x27, 0xdc, 0x8f, 0x46, 0x17, 0x5e, 0x8b, 0x83, 0x68, 0x1e, 0x3d, 0x76, 0x6e, 0x3e, 0xbd, 0x73, + 0x33, 0x03, 0x97, 0x3f, 0xb2, 0xaf, 0xcb, 0x02, 0xcd, 0xf7, 0x48, 0xbf, 0xe8, 0xca, 0x22, 0xd4, + 0xae, 0xb3, 0xff, 0x9e, 0x72, 0x96, 0x67, 0xfa, 0x82, 0xdb, 0xa4, 0xe2, 0xd5, 0x8b, 0x9c, 0x7d, + 0x39, 0x57, 0x71, 0x85, 0x6f, 0xf9, 0x2a, 0xee, 0x9f, 0xf5, 0xca, 0x27, 0x02, 0xe9, 0xdb, 0xd0, + 0x33, 0xdf, 0xc8, 0x65, 0xf6, 0xe0, 0x54, 0x9b, 0x69, 0x66, 0xe3, 0xc8, 0xa2, 0xbc, 0xcf, 0x54, + 0x11, 0xad, 0x26, 0xd4, 0xdd, 0x40, 0x5c, 0x60, 0x5c, 0x71, 0xa2, 0xea, 0xa2, 0x51, 0x25, 0x2f, + 0xcb, 0xfa, 0x5e, 0xfe, 0xb2, 0xec, 0x5f, 0x8c, 0xc0, 0xb9, 0x6d, 0xe7, 0xc0, 0xf5, 0xd8, 0xa2, + 0x6d, 0xd3, 0xd0, 0x6f, 0x07, 0x75, 0x4a, 0x2a, 0x30, 0x61, 0xfa, 0x7f, 0x76, 0xf1, 0x6e, 0x65, + 0xfb, 0x92, 0x09, 0x23, 0x0b, 0x30, 0xa2, 0xde, 0x9c, 0x8a, 0xcd, 0x24, 0xe3, 0x2d, 0xea, 0x6a, + 0x8f, 0x1d, 0xa3, 0x91, 0x0f, 0x8c, 0xfb, 0x9d, 0x49, 0xf5, 0x7c, 0x1a, 0x71, 0x17, 0xb8, 0x83, + 0x9e, 0xe7, 0x37, 0xcc, 0x0d, 0x91, 0x5f, 0x62, 0xfc, 0x28, 0x75, 0xe5, 0x33, 0x60, 0xb4, 0x38, + 0x65, 0xf7, 0x42, 0x5d, 0x20, 0x37, 0x38, 0x71, 0xc6, 0x65, 0xd0, 0x97, 0x30, 0xfa, 0xb0, 0xbd, + 0x4f, 0xe5, 0xe5, 0xd6, 0xa0, 0xd8, 0x1f, 0x93, 0x5e, 0xcd, 0xa2, 0x7c, 0xef, 0x2e, 0x1f, 0x83, + 0x27, 0xed, 0x7d, 0x9a, 0x8e, 0x7a, 0xcd, 0x16, 0x26, 0x8d, 0x19, 0x39, 0x84, 0x62, 0xd2, 0x01, + 0x59, 0xc4, 0x80, 0xeb, 0xe0, 0x36, 0x8d, 0x71, 0x42, 0xb4, 0xd8, 0xda, 0xdc, 0x2d, 0xd2, 0xa8, + 0x24, 0xc5, 0x95, 0xfc, 0x3a, 0xcc, 0x64, 0x5a, 0x1d, 0xd5, 0x13, 0xaa, 0xce, 0x06, 0x4d, 0x5c, + 0xd4, 0x13, 0x52, 0x93, 0xef, 0xb5, 0x8c, 0x9a, 0xb3, 0x6b, 0x21, 0x0d, 0x98, 0x4c, 0x38, 0xd6, + 0x8a, 0xf4, 0x01, 0xf9, 0xae, 0xba, 0xb8, 0x31, 0xc9, 0x58, 0xab, 0x99, 0x75, 0x25, 0x59, 0x92, + 0x75, 0x18, 0x51, 0xc7, 0x7d, 0x11, 0xda, 0x2b, 0xcb, 0xb4, 0x51, 0x3a, 0x39, 0x2e, 0x4f, 0xc7, + 0xa6, 0x0d, 0x83, 0x67, 0xcc, 0x80, 0xfc, 0x06, 0x5c, 0x55, 0x53, 0x74, 0x2b, 0xc8, 0x36, 0x02, + 0x89, 0xd8, 0xdd, 0x37, 0x92, 0x33, 0x3c, 0x0f, 0x7f, 0xef, 0xce, 0x62, 0x6f, 0xa9, 0xb0, 0xda, + 0x63, 0x77, 0x67, 0x4d, 0x7e, 0x5a, 0x80, 0xf3, 0x39, 0xb5, 0x8e, 0x61, 0xad, 0x5d, 0x2d, 0x73, + 0xa8, 0xdc, 0xe3, 0xb3, 0x21, 0xb7, 0x11, 0x3f, 0xaf, 0x93, 0x26, 0x3a, 0xa3, 0xdf, 0x39, 0x35, + 0x91, 0xb7, 0x61, 0x10, 0xcf, 0xc8, 0x61, 0x69, 0x1c, 0xb5, 0x48, 0x0c, 0x8f, 0x83, 0x27, 0x69, + 0x7d, 0xdf, 0x10, 0x38, 0x64, 0x95, 0x69, 0x63, 0xb8, 0x6f, 0x49, 0xed, 0x49, 0x04, 0xd3, 0x12, + 0x1a, 0x3d, 0x2f, 0x92, 0x51, 0x2e, 0x8c, 0x20, 0xed, 0x26, 0xd9, 0x22, 0xc0, 0x70, 0x20, 0x56, + 0xa5, 0x07, 0xfd, 0xc3, 0xfd, 0xc5, 0x01, 0xfe, 0xe1, 0x48, 0x8f, 0xed, 0xdf, 0x1e, 0xe6, 0xcf, + 0x3b, 0x77, 0x3d, 0xf7, 0xb1, 0x1b, 0x2f, 0x60, 0xba, 0x75, 0x2d, 0xce, 0x95, 0x22, 0x74, 0xdf, + 0x9c, 0xac, 0x28, 0xca, 0x10, 0xd7, 0xdb, 0xd5, 0x10, 0x77, 0x57, 0xbb, 0xb2, 0xd2, 0x02, 0x5b, + 0x72, 0x1d, 0xc7, 0x34, 0x7c, 0xc5, 0x77, 0x59, 0x5f, 0xc3, 0x20, 0xc6, 0xa2, 0xe4, 0xf7, 0x81, + 0xa3, 0x0b, 0x37, 0xc5, 0xb2, 0xdd, 0xa1, 0xf9, 0x3c, 0x78, 0xa5, 0x78, 0xb2, 0xcd, 0x25, 0x8e, + 0x00, 0x43, 0xe2, 0x08, 0x21, 0x3b, 0x30, 0xb5, 0x1d, 0xd0, 0x86, 0xf0, 0x1b, 0x6e, 0x05, 0xc2, + 0x38, 0xc1, 0xcd, 0x1e, 0xb8, 0xe5, 0xb7, 0x64, 0x71, 0x8d, 0xaa, 0x72, 0x7d, 0x43, 0xcd, 0x20, + 0x27, 0x2b, 0x30, 0x51, 0xa5, 0x4e, 0x50, 0x3f, 0x7c, 0x48, 0x9f, 0x33, 0x75, 0xc7, 0x48, 0x10, + 0x10, 0x62, 0x09, 0xeb, 0x2f, 0x16, 0xe9, 0x3e, 0x1e, 0x26, 0x11, 0xf9, 0x01, 0x0c, 0x56, 0xfd, + 0x20, 0x5a, 0x7c, 0x2e, 0x16, 0x35, 0x79, 0x63, 0xc4, 0x81, 0x8b, 0x17, 0x64, 0x92, 0x84, 0xd0, + 0x0f, 0xa2, 0xda, 0xbe, 0x11, 0x6f, 0x89, 0xa3, 0x90, 0xe7, 0x30, 0x6d, 0x2e, 0x28, 0xc2, 0x9d, + 0x75, 0x58, 0xa8, 0x59, 0x59, 0xab, 0x16, 0x47, 0x59, 0xbc, 0x2e, 0xb8, 0x5f, 0x49, 0x2e, 0x5b, + 0x8f, 0xb1, 0x5c, 0x0f, 0x81, 0x94, 0x45, 0x4f, 0x36, 0x30, 0xb7, 0x04, 0xef, 0x51, 0x25, 0xe4, + 0x6e, 0xb0, 0x23, 0x71, 0x44, 0xaf, 0x36, 0x2e, 0x4a, 0x28, 0x09, 0x27, 0x4c, 0x26, 0x24, 0xb1, + 0x53, 0xa4, 0x64, 0x1b, 0xce, 0xed, 0x86, 0x74, 0x3b, 0xa0, 0x4f, 0x5d, 0xfa, 0x4c, 0xf2, 0x83, + 0x38, 0xfc, 0x11, 0xe3, 0xd7, 0xe2, 0xa5, 0x59, 0x0c, 0xd3, 0xc4, 0xe4, 0x03, 0x80, 0x6d, 0xd7, + 0xf3, 0x68, 0x03, 0xaf, 0x1d, 0x47, 0x91, 0x15, 0x9a, 0x54, 0x5b, 0x08, 0xad, 0xf9, 0x5e, 0x53, + 0x17, 0xa9, 0x86, 0x4c, 0x16, 0x61, 0x7c, 0xcd, 0xab, 0x37, 0xdb, 0xc2, 0x3d, 0x20, 0xc4, 0x05, + 0x45, 0x84, 0x65, 0x73, 0x79, 0x41, 0x2d, 0xf5, 0x91, 0x9b, 0x24, 0xe4, 0x21, 0x10, 0x01, 0x10, + 0xb3, 0xd6, 0xd9, 0x6f, 0x52, 0xf1, 0xb9, 0xa3, 0xa9, 0x44, 0x32, 0xc2, 0xe9, 0x6e, 0x44, 0x3b, + 0x4b, 0x91, 0xcd, 0x7d, 0x00, 0xa3, 0xda, 0x9c, 0xcf, 0x88, 0x41, 0x30, 0xad, 0xc7, 0x20, 0x18, + 0xd1, 0x63, 0x0d, 0xfc, 0xc3, 0x02, 0xcc, 0x67, 0x7f, 0x4b, 0x42, 0x01, 0xdb, 0x82, 0x11, 0x05, + 0x54, 0xaf, 0x4e, 0xa4, 0xea, 0x9f, 0xd0, 0x80, 0xf8, 0x07, 0x2d, 0x57, 0x1e, 0xbd, 0xf7, 0x31, + 0x8f, 0x17, 0xb0, 0xc7, 0xff, 0x7f, 0xc3, 0x30, 0x8d, 0xde, 0xd5, 0xc9, 0x75, 0xea, 0x53, 0x8c, + 0x25, 0x82, 0x30, 0xcd, 0xbc, 0x2c, 0x2c, 0x4d, 0x1c, 0x9e, 0x8c, 0xaa, 0x65, 0x10, 0x90, 0x77, + 0x75, 0x9f, 0x88, 0x5e, 0x2d, 0x9b, 0x85, 0x04, 0xea, 0x5d, 0x88, 0x9d, 0x25, 0xde, 0x32, 0xae, + 0xe4, 0x4f, 0xbd, 0xe8, 0xf5, 0x9f, 0x76, 0xd1, 0xdb, 0x55, 0x8b, 0x1e, 0x8f, 0x51, 0xf1, 0xa6, + 0xb6, 0xe8, 0xbd, 0xfa, 0xd5, 0x6e, 0xf0, 0x55, 0xaf, 0x76, 0x43, 0x2f, 0xb7, 0xda, 0x0d, 0xbf, + 0xe0, 0x6a, 0x77, 0x0f, 0x26, 0x36, 0x29, 0x6d, 0x68, 0x17, 0x25, 0x23, 0xf1, 0xee, 0xe9, 0x51, + 0x34, 0x81, 0x65, 0xdd, 0x96, 0x24, 0xa8, 0x72, 0x57, 0x4d, 0xf8, 0x9b, 0x59, 0x35, 0x47, 0x5f, + 0xf1, 0xaa, 0x39, 0xf6, 0x32, 0xab, 0x66, 0x6a, 0xe9, 0x1b, 0x3f, 0xf3, 0xd2, 0xf7, 0x32, 0xab, + 0xd5, 0x27, 0xe8, 0x52, 0x58, 0xad, 0xae, 0x0a, 0xef, 0x11, 0xcd, 0x5d, 0x63, 0xd5, 0x0f, 0xa5, + 0xc7, 0x35, 0xfe, 0xcd, 0x60, 0xdb, 0x7e, 0x20, 0xaf, 0xbc, 0xf1, 0x6f, 0x6b, 0x11, 0x1d, 0x09, + 0x75, 0x7a, 0xe5, 0xae, 0x3f, 0x24, 0x9e, 0xec, 0x89, 0x35, 0x2e, 0x79, 0x8c, 0xb2, 0x65, 0xb9, + 0xf5, 0x17, 0x05, 0x7e, 0x29, 0xf9, 0x7f, 0xe2, 0x52, 0xf9, 0x32, 0x17, 0x85, 0xbf, 0x15, 0x3f, + 0xe5, 0x17, 0x61, 0x07, 0x02, 0xa7, 0xfe, 0x24, 0xbe, 0xa9, 0xfd, 0x21, 0xfb, 0xce, 0xf5, 0x02, + 0x8c, 0xda, 0x1a, 0x9f, 0x15, 0xcd, 0xc2, 0xbd, 0x3b, 0x72, 0x01, 0x10, 0x11, 0x0d, 0x38, 0xd8, + 0x5c, 0x00, 0x74, 0x02, 0xf4, 0x95, 0x9b, 0xb4, 0x6c, 0xfe, 0x12, 0x3d, 0xb3, 0x05, 0xef, 0xa5, + 0xdf, 0x52, 0xe3, 0x61, 0x24, 0x7e, 0x4b, 0xad, 0x8b, 0x31, 0x7e, 0x55, 0xbd, 0x0b, 0x17, 0x6d, + 0x7a, 0xe4, 0x3f, 0xa5, 0xaf, 0x96, 0xed, 0x57, 0x70, 0xc1, 0x64, 0xc8, 0x5f, 0xdd, 0xf0, 0x30, + 0xee, 0x9f, 0x64, 0x07, 0x7f, 0x17, 0x04, 0x3c, 0xf8, 0x3b, 0x8f, 0x21, 0xcd, 0xfe, 0xd4, 0xf7, + 0x0d, 0x2c, 0xb3, 0x7c, 0x98, 0x37, 0x99, 0x57, 0x1a, 0x0d, 0xcc, 0x1c, 0x58, 0x77, 0x5b, 0x8e, + 0x17, 0x91, 0x2d, 0x18, 0xd5, 0x7e, 0x26, 0x4c, 0x05, 0x5a, 0x89, 0xd0, 0x69, 0x62, 0x80, 0x11, + 0xdf, 0x33, 0x06, 0x5b, 0x14, 0xca, 0x49, 0xf1, 0x30, 0x91, 0xe9, 0x75, 0x2e, 0xc2, 0xb8, 0xf6, + 0x53, 0x99, 0x2c, 0xf1, 0xe3, 0xd7, 0x6a, 0x30, 0x05, 0x66, 0x92, 0x58, 0x75, 0x98, 0xcb, 0x12, + 0x1a, 0x0f, 0x04, 0x4d, 0x56, 0xe2, 0x38, 0x4f, 0xdd, 0xbd, 0xed, 0x26, 0xf3, 0x62, 0x3c, 0x59, + 0x7f, 0xb7, 0x1f, 0x2e, 0x8a, 0xc1, 0x78, 0x95, 0x23, 0x4e, 0x7e, 0x04, 0xa3, 0xda, 0x18, 0x0b, + 0xa1, 0x5f, 0x91, 0x71, 0x3d, 0xf3, 0xe6, 0x02, 0x37, 0x69, 0xb4, 0x11, 0x50, 0x4b, 0x0c, 0xf7, + 0x6a, 0x8f, 0xad, 0xb3, 0x24, 0x4d, 0x98, 0x30, 0x07, 0x5a, 0x58, 0x75, 0xae, 0x65, 0x56, 0x62, + 0xa2, 0xca, 0x28, 0xd1, 0x8d, 0x5a, 0xe6, 0x70, 0xaf, 0xf6, 0xd8, 0x09, 0xde, 0xe4, 0x1b, 0x38, + 0x97, 0x1a, 0x65, 0x61, 0xac, 0x7b, 0x23, 0xb3, 0xc2, 0x14, 0x36, 0x37, 0xc7, 0x06, 0x08, 0xce, + 0xad, 0x36, 0x5d, 0x09, 0x69, 0xc0, 0x98, 0x3e, 0xf0, 0xc2, 0xec, 0x74, 0xb5, 0x83, 0x28, 0x39, + 0x22, 0x57, 0xee, 0x84, 0x2c, 0x71, 0xec, 0x9f, 0x9b, 0x26, 0x66, 0x03, 0x79, 0x18, 0x06, 0xf9, + 0x6f, 0xb6, 0x04, 0x6c, 0x07, 0x34, 0xa4, 0x5e, 0x9d, 0x1a, 0x0e, 0xda, 0x2f, 0xb9, 0x04, 0xfc, + 0x9b, 0x02, 0x94, 0xb2, 0xf8, 0x56, 0xa9, 0xd7, 0x20, 0xdb, 0x50, 0x4c, 0x56, 0x24, 0x66, 0xb5, + 0xa5, 0x02, 0xf1, 0xe6, 0x36, 0x69, 0xb5, 0xc7, 0x4e, 0x51, 0x93, 0x4d, 0x38, 0xa7, 0xc1, 0x84, + 0x71, 0xb5, 0xf7, 0x34, 0xc6, 0x55, 0x36, 0x0a, 0x29, 0x52, 0xdd, 0x36, 0xbd, 0x8a, 0x3b, 0xe3, + 0xb2, 0x7f, 0xe4, 0xb8, 0x1e, 0x53, 0x74, 0xb5, 0x50, 0x4f, 0x10, 0x43, 0x85, 0x6c, 0xb8, 0xb5, + 0x15, 0xa1, 0xf2, 0x41, 0x89, 0x42, 0xb1, 0x3e, 0xc6, 0x15, 0x5c, 0xd8, 0xe8, 0xf8, 0xf3, 0x54, + 0xc5, 0xec, 0x0a, 0x0c, 0xec, 0xac, 0x57, 0x97, 0x2a, 0xe2, 0xb1, 0x2b, 0x0f, 0x91, 0xd0, 0x0c, + 0x6b, 0x75, 0xc7, 0xe6, 0x05, 0xd6, 0x47, 0x40, 0xee, 0xd3, 0x48, 0x44, 0x82, 0x57, 0x74, 0xaf, + 0xc3, 0x90, 0x00, 0x09, 0x4a, 0x74, 0x8d, 0x13, 0x71, 0xe5, 0x6d, 0x59, 0x66, 0x6d, 0xcb, 0x73, + 0x42, 0x93, 0x3a, 0xa1, 0xb6, 0x31, 0xbf, 0x0f, 0xc3, 0x81, 0x80, 0x89, 0x7d, 0x79, 0x42, 0x25, + 0xe3, 0x40, 0x30, 0xb7, 0x67, 0x4b, 0x1c, 0x5b, 0xfd, 0x65, 0xad, 0x63, 0x38, 0x93, 0xad, 0xb5, + 0xe5, 0x25, 0x26, 0x55, 0x21, 0x2c, 0x39, 0x1c, 0xb7, 0xd0, 0x87, 0x3c, 0xa2, 0xfa, 0x53, 0x57, + 0x14, 0x0d, 0x7e, 0xe4, 0x22, 0x88, 0x8f, 0x86, 0x62, 0xdd, 0x55, 0xc1, 0x51, 0x32, 0xb8, 0xe5, + 0x25, 0x95, 0xd8, 0xc4, 0xb0, 0x2f, 0xf7, 0xd1, 0x5d, 0xe6, 0x55, 0x34, 0xc2, 0x81, 0x39, 0xbe, + 0xcd, 0xb3, 0x5e, 0x89, 0x74, 0x6a, 0xbe, 0x5a, 0x1a, 0x97, 0x60, 0x44, 0xc1, 0xd4, 0xdd, 0x17, + 0x97, 0x95, 0x81, 0xbf, 0x77, 0x97, 0xbf, 0x0a, 0xae, 0x2b, 0x06, 0x31, 0x1d, 0xab, 0x82, 0x7f, + 0x77, 0xdf, 0x72, 0x15, 0x21, 0x0d, 0xa2, 0x6f, 0xb5, 0x8a, 0x38, 0x2e, 0xd0, 0x59, 0xaa, 0x30, + 0xf0, 0xf7, 0x16, 0x4e, 0x23, 0xa8, 0x6f, 0xb9, 0x0a, 0x26, 0xa8, 0x6f, 0xaf, 0x0a, 0x2a, 0x03, + 0x28, 0xf1, 0x49, 0x9a, 0xaa, 0x64, 0x25, 0x5d, 0x89, 0x34, 0x5c, 0x27, 0x28, 0x3a, 0x8e, 0x07, + 0x85, 0x79, 0x2e, 0xac, 0x5f, 0x42, 0x35, 0x4c, 0x60, 0xdf, 0x6e, 0x35, 0xff, 0xa0, 0xc0, 0xc3, + 0x39, 0x55, 0xb7, 0xb4, 0x44, 0x86, 0xde, 0x63, 0x5f, 0xbb, 0x9a, 0xd7, 0xbe, 0xf6, 0x87, 0xae, + 0xd7, 0xd0, 0xaf, 0xe6, 0x9d, 0x76, 0x74, 0xa8, 0xc2, 0x1d, 0x3f, 0x71, 0xbd, 0x86, 0x9d, 0xc4, + 0x26, 0x1f, 0xc0, 0xb8, 0x06, 0x52, 0xda, 0x1a, 0x4f, 0x48, 0xa1, 0x93, 0xbb, 0x0d, 0xdb, 0xc4, + 0xb4, 0xfe, 0xba, 0x00, 0x53, 0x19, 0x09, 0x76, 0xd1, 0x98, 0x81, 0xa7, 0x20, 0xb5, 0x50, 0x89, + 0x34, 0x4f, 0x18, 0x59, 0xc2, 0xd8, 0x24, 0x15, 0x22, 0x86, 0xe2, 0xd7, 0x92, 0x01, 0xf7, 0x6a, + 0x09, 0xc7, 0xb2, 0x13, 0x00, 0xeb, 0xe8, 0x24, 0x04, 0x88, 0x5b, 0x22, 0xcc, 0xc6, 0x55, 0xa6, + 0xd2, 0x6a, 0x99, 0x84, 0x5f, 0x49, 0x2a, 0x63, 0xad, 0x1a, 0xeb, 0xb7, 0x7a, 0xe1, 0x7c, 0x46, + 0xff, 0xab, 0x34, 0xfa, 0x9b, 0x10, 0x41, 0x22, 0x9f, 0x73, 0xdf, 0x2f, 0x29, 0x9f, 0xb3, 0xf5, + 0x1f, 0x7a, 0xe1, 0xfc, 0x6e, 0x2b, 0xc4, 0x17, 0x56, 0x6b, 0xde, 0x53, 0xea, 0x45, 0x7e, 0xf0, + 0x1c, 0x5f, 0x85, 0x90, 0x77, 0x61, 0x60, 0x95, 0x36, 0x9b, 0xbe, 0x98, 0xff, 0x97, 0xa4, 0x77, + 0x44, 0x12, 0x1b, 0x91, 0x56, 0x7b, 0x6c, 0x8e, 0x4d, 0x3e, 0x80, 0x91, 0x55, 0xea, 0x04, 0xd1, + 0x3e, 0x75, 0xe4, 0x91, 0x45, 0xa6, 0xc9, 0xd0, 0x48, 0x04, 0xc2, 0x6a, 0x8f, 0x1d, 0x63, 0x93, + 0x05, 0x76, 0x9a, 0xf7, 0x0e, 0xd4, 0x6b, 0xf2, 0x9c, 0x0a, 0x19, 0xce, 0x6a, 0x8f, 0x8d, 0xb8, + 0x64, 0x03, 0xc6, 0x2b, 0x07, 0xd4, 0x8b, 0x36, 0x68, 0xe4, 0x34, 0x9c, 0xc8, 0x11, 0xaa, 0xed, + 0xeb, 0x79, 0xc4, 0x06, 0xf2, 0x6a, 0x8f, 0x6d, 0x52, 0x93, 0x8f, 0x60, 0xe8, 0xbe, 0xef, 0x37, + 0xf6, 0x9f, 0x53, 0xa1, 0xae, 0x96, 0xf3, 0x18, 0x09, 0xb4, 0xd5, 0x1e, 0x5b, 0x52, 0x2c, 0x0e, + 0x40, 0xdf, 0x46, 0x78, 0x60, 0x1d, 0x17, 0xa0, 0xb4, 0xec, 0x3f, 0xf3, 0x32, 0xa5, 0xfa, 0x3d, + 0x53, 0xaa, 0x92, 0x7d, 0x06, 0x7e, 0x42, 0xae, 0xef, 0x40, 0xff, 0xb6, 0xeb, 0x1d, 0x24, 0x54, + 0xc1, 0x0c, 0x3a, 0x86, 0x85, 0xe2, 0x71, 0xbd, 0x03, 0xb2, 0x2e, 0x75, 0x70, 0x61, 0x6b, 0xec, + 0x33, 0x14, 0xff, 0x0c, 0x6a, 0x1d, 0x3b, 0xd6, 0xb5, 0xf9, 0x6f, 0xd9, 0xc1, 0xb7, 0x60, 0x36, + 0xa7, 0x5e, 0xf1, 0x3c, 0x9c, 0xf5, 0xad, 0x1f, 0x15, 0x9b, 0x37, 0x61, 0x26, 0x73, 0xfc, 0x52, + 0x88, 0xff, 0x24, 0x6b, 0x22, 0xf2, 0x9e, 0x97, 0x60, 0x48, 0xe6, 0x78, 0xe2, 0xb6, 0x1f, 0xf9, + 0x13, 0x1f, 0x48, 0xc9, 0x0f, 0x55, 0x06, 0xf6, 0x90, 0xdf, 0xe3, 0x9e, 0x16, 0x48, 0x89, 0x7f, + 0x4e, 0x1f, 0xbe, 0xc4, 0x47, 0xa3, 0x78, 0xb1, 0x3a, 0x57, 0xfd, 0x30, 0xf2, 0x94, 0xe7, 0xad, + 0xad, 0x7e, 0x93, 0x1b, 0x50, 0x94, 0xb9, 0x22, 0x44, 0x52, 0x1a, 0x91, 0x7f, 0xda, 0x4e, 0xc1, + 0xc9, 0xfb, 0x30, 0x9b, 0x84, 0xc9, 0x5e, 0xf2, 0x17, 0x6e, 0x79, 0xc5, 0xd6, 0x9f, 0xf7, 0x62, + 0xac, 0xeb, 0x0e, 0xf3, 0x9a, 0x49, 0x77, 0xab, 0x2a, 0xa4, 0xd5, 0xbb, 0x55, 0x25, 0xf3, 0x30, + 0xb2, 0x55, 0x35, 0x12, 0x65, 0xd9, 0x31, 0x80, 0x35, 0x9b, 0x75, 0xa1, 0x12, 0xd4, 0x0f, 0xdd, + 0x88, 0xd6, 0xa3, 0x76, 0x20, 0x56, 0x61, 0x3b, 0x05, 0x27, 0x16, 0x8c, 0xdd, 0x6f, 0xba, 0xfb, + 0x75, 0xc9, 0x8c, 0x8b, 0xc0, 0x80, 0x91, 0x37, 0x60, 0x62, 0xcd, 0x0b, 0x23, 0xa7, 0xd9, 0xdc, + 0xa0, 0xd1, 0xa1, 0xdf, 0x10, 0xa9, 0x3e, 0xed, 0x04, 0x94, 0xd5, 0xbb, 0xe4, 0x7b, 0x91, 0xe3, + 0x7a, 0x34, 0xb0, 0xdb, 0x5e, 0xe4, 0x1e, 0x51, 0xd1, 0xf7, 0x14, 0x9c, 0xbc, 0x03, 0x33, 0x0a, + 0xb6, 0x15, 0xd4, 0x0f, 0x69, 0x18, 0x05, 0x98, 0x3e, 0x0f, 0x03, 0xfe, 0xd8, 0xd9, 0x85, 0x58, + 0x43, 0xd3, 0x6f, 0x37, 0x56, 0xbc, 0xa7, 0x6e, 0xe0, 0x7b, 0x98, 0xf8, 0x62, 0x58, 0xd4, 0x90, + 0x80, 0x5b, 0x7f, 0x38, 0x9c, 0xf9, 0xd9, 0xbe, 0xcc, 0x1c, 0xfc, 0x02, 0xc6, 0x96, 0x9c, 0x96, + 0xb3, 0xef, 0x36, 0xdd, 0xc8, 0x55, 0x79, 0xc6, 0xde, 0xed, 0xf2, 0xcd, 0xcb, 0xec, 0x21, 0xb4, + 0xa1, 0x13, 0xdb, 0x06, 0xab, 0xb9, 0xbf, 0x1a, 0x84, 0x99, 0x4c, 0x3c, 0x72, 0x5d, 0x24, 0x24, + 0x53, 0xeb, 0xaa, 0xc8, 0xa4, 0x65, 0x27, 0xc1, 0x6c, 0x2c, 0x11, 0xb4, 0xd4, 0xa4, 0x8e, 0xd7, + 0x16, 0x79, 0xb4, 0x6c, 0x03, 0xc6, 0xc6, 0x92, 0xe9, 0x0d, 0x1a, 0x33, 0x74, 0x9c, 0xb6, 0x13, + 0x50, 0x72, 0x05, 0x46, 0x19, 0x44, 0xb2, 0xea, 0xe7, 0x4f, 0xfc, 0x34, 0x10, 0xe3, 0xb4, 0xe9, + 0x37, 0xa8, 0xc6, 0x69, 0x80, 0x73, 0x32, 0xa1, 0x8c, 0x13, 0x83, 0x48, 0x4e, 0x83, 0x9c, 0x93, + 0x06, 0x22, 0xaf, 0xc1, 0x78, 0xa5, 0xd5, 0xd2, 0x18, 0x61, 0x02, 0x2d, 0xdb, 0x04, 0x92, 0xcb, + 0x00, 0x95, 0x56, 0x4b, 0xb2, 0xc1, 0xe4, 0x58, 0xb6, 0x06, 0x21, 0x37, 0xe3, 0x70, 0x65, 0x1a, + 0x2b, 0xbc, 0x4e, 0xb0, 0x33, 0x4a, 0x98, 0x5c, 0x55, 0x6c, 0x27, 0xc1, 0x14, 0xb8, 0x5c, 0x13, + 0x60, 0xf2, 0x31, 0x5c, 0x48, 0xf8, 0x5d, 0x68, 0x15, 0xa0, 0xa9, 0xdf, 0xce, 0x47, 0x20, 0xef, + 0xc1, 0xf9, 0x44, 0xa1, 0xac, 0x0e, 0xad, 0xfa, 0x76, 0x4e, 0x29, 0xf9, 0x10, 0x4a, 0x89, 0x67, + 0xdb, 0x71, 0xa5, 0x68, 0xc1, 0xb7, 0x73, 0xcb, 0xd9, 0xd7, 0x95, 0x78, 0xff, 0x25, 0xaa, 0xc4, + 0xcb, 0x4a, 0x3b, 0xbb, 0x90, 0xac, 0x42, 0x39, 0xd3, 0x97, 0x45, 0xab, 0x18, 0x93, 0x7e, 0xd9, + 0xdd, 0xd0, 0xc8, 0x22, 0xcc, 0x67, 0xa2, 0xc8, 0x66, 0x60, 0x2a, 0x30, 0xbb, 0x23, 0x0e, 0x59, + 0x80, 0xe9, 0xd8, 0xa7, 0x47, 0x6b, 0x02, 0x66, 0x01, 0xb3, 0x33, 0xcb, 0xc8, 0xdb, 0xe6, 0xe3, + 0x7c, 0x5e, 0x19, 0x26, 0x01, 0xb3, 0xd3, 0x05, 0xd6, 0x49, 0x01, 0xe6, 0x33, 0x37, 0x4a, 0xa9, + 0xcf, 0xcf, 0x25, 0x15, 0x47, 0x6d, 0x2d, 0xb8, 0x01, 0xfd, 0xa8, 0xe0, 0x73, 0x5b, 0xb1, 0xf4, + 0x35, 0x45, 0x7a, 0xce, 0x8a, 0x95, 0xda, 0x88, 0x43, 0xee, 0xab, 0xbb, 0xc1, 0x3e, 0xb4, 0x64, + 0xdc, 0x4a, 0x2a, 0x50, 0x19, 0x95, 0xeb, 0x77, 0x84, 0xf2, 0x36, 0xf0, 0x65, 0xae, 0x61, 0xfe, + 0xbc, 0x00, 0xe5, 0x2e, 0xfa, 0x81, 0xea, 0x53, 0xe1, 0x14, 0x7d, 0x7a, 0xa0, 0xfa, 0xc4, 0xdf, + 0xc6, 0x2e, 0x9c, 0x4e, 0x07, 0x79, 0xd5, 0xdd, 0x6a, 0x03, 0x49, 0xab, 0xa1, 0xe4, 0xbb, 0x30, + 0x52, 0xad, 0xae, 0x1a, 0x0e, 0x7d, 0xa9, 0xcb, 0xa1, 0x18, 0x83, 0xdc, 0x3e, 0x95, 0x07, 0x9f, + 0xe6, 0xbf, 0x67, 0x2d, 0x43, 0x29, 0x4f, 0x83, 0xc4, 0x85, 0x85, 0xc7, 0xd6, 0xd2, 0x2e, 0x96, + 0xf8, 0xc2, 0x62, 0x82, 0xad, 0xf7, 0xe0, 0xbc, 0xa2, 0xe6, 0x49, 0x3b, 0xb4, 0x87, 0xff, 0xe2, + 0xd8, 0xa9, 0x02, 0x0c, 0xc4, 0x00, 0xeb, 0xcf, 0xfa, 0x53, 0x84, 0xd5, 0xf6, 0xd1, 0x91, 0x13, + 0x3c, 0x27, 0x15, 0x93, 0xb0, 0xaf, 0xab, 0xa6, 0xbf, 0xd8, 0xff, 0xb3, 0xe3, 0x72, 0x8f, 0xc6, + 0x9d, 0x2d, 0xc7, 0xb8, 0xb1, 0x7b, 0x75, 0xca, 0xaf, 0xa4, 0x7a, 0x79, 0x70, 0x23, 0x03, 0x48, + 0xf6, 0x60, 0x5c, 0x6c, 0x99, 0xf8, 0x5b, 0x4e, 0xed, 0xdb, 0xc9, 0xa9, 0x6d, 0x34, 0xef, 0xa6, + 0x41, 0xc2, 0x27, 0x81, 0xc9, 0x86, 0x7c, 0x01, 0x13, 0x52, 0x41, 0x12, 0x8c, 0xb9, 0x13, 0xd1, + 0x9d, 0xce, 0x8c, 0x4d, 0x1a, 0xce, 0x39, 0xc1, 0x88, 0x35, 0x59, 0xae, 0x31, 0x9c, 0xf3, 0xc0, + 0x69, 0x9a, 0x6c, 0x90, 0x88, 0x26, 0x1b, 0xb0, 0xb9, 0x1f, 0x00, 0x49, 0xf7, 0xab, 0xdb, 0x2c, + 0x1e, 0xd7, 0x66, 0xf1, 0x5c, 0x05, 0xa6, 0x32, 0x3a, 0x70, 0x26, 0x16, 0x3f, 0x00, 0x92, 0x6e, + 0xe9, 0x59, 0x38, 0x58, 0xd7, 0xe1, 0x0d, 0x25, 0x02, 0x35, 0x1b, 0x0c, 0x9e, 0xd2, 0xf0, 0xfc, + 0x9b, 0xbd, 0x50, 0xee, 0x82, 0x4a, 0xfe, 0xa0, 0x90, 0x94, 0x36, 0x9f, 0x8d, 0x1f, 0x24, 0xa5, + 0x9d, 0x4d, 0x9f, 0x21, 0xf6, 0xc5, 0x0f, 0x7f, 0xfa, 0x97, 0x2f, 0xac, 0xf0, 0xa7, 0x87, 0xec, + 0xec, 0xd2, 0xea, 0xd7, 0xa5, 0x65, 0xc3, 0xb4, 0x71, 0x54, 0x3a, 0xcd, 0x9e, 0x71, 0x19, 0x40, + 0xe4, 0x0f, 0x5d, 0xf7, 0x0f, 0x84, 0x7a, 0xa6, 0x41, 0xac, 0x7b, 0x30, 0x93, 0xe0, 0x29, 0x8c, + 0xe1, 0xdf, 0x05, 0xf5, 0xc0, 0x1b, 0x99, 0xf6, 0x2d, 0x9e, 0xfb, 0xc5, 0x71, 0x79, 0x9c, 0x69, + 0xd2, 0x37, 0xe3, 0xf8, 0xf1, 0xf2, 0x2f, 0x6b, 0x43, 0x37, 0xe7, 0x57, 0x9a, 0x7a, 0xe0, 0x1b, + 0x72, 0x07, 0x06, 0x39, 0x24, 0x11, 0xa5, 0x59, 0xc7, 0x16, 0x6b, 0x82, 0x40, 0xb4, 0x66, 0xf0, + 0x39, 0x2a, 0xfe, 0xa8, 0xc4, 0xe1, 0x13, 0xac, 0x5d, 0x9e, 0xb5, 0x24, 0x06, 0xab, 0x48, 0xd0, + 0xfd, 0x95, 0x38, 0xcc, 0x83, 0xf4, 0xbd, 0x90, 0x78, 0x9e, 0xff, 0xac, 0x49, 0x1b, 0x3c, 0xdd, + 0xdc, 0xe2, 0x98, 0xf0, 0xbd, 0xe8, 0x77, 0x18, 0x03, 0x24, 0xb3, 0x3e, 0x85, 0x19, 0xb6, 0x41, + 0x07, 0xc9, 0xfa, 0x30, 0x57, 0x01, 0x83, 0x99, 0x0e, 0xed, 0x0e, 0x03, 0xa1, 0x43, 0xbb, 0x28, + 0xb4, 0xd6, 0xe1, 0x02, 0x37, 0x06, 0xea, 0x5d, 0x8a, 0x4d, 0xef, 0x03, 0xf8, 0x3b, 0xf1, 0x98, + 0x31, 0xa3, 0xf7, 0x1c, 0xcf, 0xfa, 0x04, 0x5f, 0xcb, 0x88, 0x49, 0xea, 0xfa, 0x5e, 0x6c, 0xf9, + 0x3b, 0xdd, 0xf3, 0xda, 0xff, 0x1b, 0xe6, 0x2b, 0xad, 0x16, 0xf5, 0x1a, 0x31, 0xe1, 0x4e, 0xe0, + 0x9c, 0x32, 0xf8, 0x01, 0xa9, 0xc0, 0x00, 0x62, 0xab, 0x7b, 0x4b, 0xd1, 0xdc, 0x8c, 0xe6, 0x20, + 0x9e, 0x08, 0xdb, 0x89, 0x15, 0x70, 0x4a, 0xab, 0x01, 0xb3, 0xd5, 0xf6, 0xfe, 0x91, 0x1b, 0xa1, + 0x1b, 0x3c, 0x06, 0x10, 0x91, 0x75, 0xaf, 0xc9, 0x44, 0x53, 0x5c, 0x18, 0xd7, 0xe3, 0x57, 0x15, + 0xe8, 0x49, 0x2f, 0x82, 0x8a, 0x3c, 0xbd, 0x73, 0x33, 0x26, 0x45, 0xab, 0x07, 0xaf, 0x05, 0x8b, + 0x45, 0x32, 0x2a, 0x6b, 0x0a, 0xce, 0xe9, 0x77, 0x40, 0x7c, 0x86, 0xcc, 0xc0, 0x94, 0x79, 0xb7, + 0xc3, 0xc1, 0x5f, 0xc3, 0x34, 0xb7, 0x3d, 0xf3, 0xb0, 0xdb, 0x0b, 0x71, 0x84, 0xe9, 0xde, 0xbd, + 0x85, 0x84, 0xff, 0x3d, 0xba, 0xe5, 0xaa, 0x84, 0x0a, 0x7b, 0x0b, 0xfc, 0xc5, 0xe3, 0xd3, 0x05, + 0xe3, 0x06, 0xb1, 0x77, 0x6f, 0x61, 0x71, 0x48, 0x84, 0x2f, 0x65, 0xdc, 0xf9, 0xf0, 0x7f, 0x2b, + 0xdc, 0x17, 0xf0, 0x91, 0xfd, 0x2a, 0x75, 0xf0, 0x41, 0x4c, 0xf6, 0x53, 0xe5, 0x09, 0xe8, 0x75, + 0x1b, 0xf2, 0xb4, 0xee, 0x36, 0xac, 0x3f, 0x2e, 0xc0, 0x75, 0xae, 0x03, 0x65, 0xd3, 0xe1, 0x45, + 0x4f, 0x0e, 0x31, 0x79, 0x1f, 0x78, 0xae, 0x79, 0xa1, 0x68, 0x5a, 0xa2, 0xe5, 0x9d, 0x38, 0x71, + 0x02, 0x52, 0x81, 0x31, 0xfd, 0x49, 0xc9, 0xe9, 0xc2, 0xc3, 0xd9, 0xa3, 0x47, 0x8f, 0x1d, 0xf5, + 0xcc, 0xe4, 0x09, 0x5c, 0x5c, 0xf9, 0x86, 0x4d, 0x08, 0xb1, 0x3b, 0x09, 0x85, 0x3d, 0x7e, 0x0a, + 0x3b, 0xb9, 0x23, 0x66, 0x8c, 0x79, 0x9a, 0x4e, 0x82, 0xd9, 0xd1, 0x54, 0x6e, 0x70, 0x4a, 0x6b, + 0x1e, 0xb1, 0x0d, 0x98, 0xf5, 0x67, 0x05, 0x98, 0xcf, 0xae, 0x4d, 0x2c, 0x2c, 0x6b, 0x70, 0x6e, + 0xc9, 0xf1, 0x7c, 0xcf, 0xad, 0x3b, 0xcd, 0x6a, 0xfd, 0x90, 0x36, 0xda, 0x2a, 0xc8, 0xa9, 0x5a, + 0x65, 0x0e, 0xa8, 0x27, 0xc9, 0x25, 0x8a, 0x9d, 0xa6, 0x62, 0x87, 0x32, 0x7c, 0x95, 0xc0, 0xd7, + 0xde, 0x26, 0x0d, 0x14, 0x3f, 0xde, 0xb2, 0x9c, 0x52, 0x72, 0x5b, 0x1a, 0xd9, 0x1b, 0xbb, 0x9e, + 0x1b, 0x29, 0x22, 0x6e, 0x5d, 0xc9, 0x2a, 0xb2, 0xfe, 0x5d, 0x01, 0x2e, 0x60, 0x5e, 0x23, 0x23, + 0x53, 0x62, 0x1c, 0xeb, 0x57, 0x86, 0xab, 0x2d, 0x18, 0xaf, 0x2c, 0x0c, 0x6c, 0x33, 0x6e, 0x2d, + 0x79, 0x1b, 0xfa, 0xab, 0xd2, 0x49, 0x6a, 0x22, 0x91, 0xe3, 0x56, 0x50, 0xb0, 0x72, 0x1b, 0xb1, + 0xd8, 0x9e, 0xb3, 0x4c, 0xc3, 0x3a, 0xf5, 0x30, 0x19, 0x31, 0x3f, 0xec, 0x6b, 0x90, 0x38, 0x54, + 0x51, 0x7f, 0x5e, 0xa8, 0xa2, 0x01, 0x33, 0x54, 0x91, 0xf5, 0x94, 0x67, 0x35, 0x4a, 0x76, 0x48, + 0x0c, 0xd2, 0x27, 0xa9, 0xdc, 0xc5, 0x7c, 0x1f, 0x38, 0x9f, 0xd5, 0xb3, 0xbd, 0xbb, 0xa9, 0xb4, + 0xc4, 0xf9, 0xb1, 0x75, 0xb7, 0xe1, 0x35, 0x03, 0xb7, 0xd2, 0x6c, 0xfa, 0xcf, 0x68, 0x63, 0x3b, + 0xf0, 0x8f, 0xfc, 0xc8, 0xc8, 0xea, 0x22, 0x92, 0x77, 0xc7, 0xd7, 0x28, 0x62, 0x56, 0x26, 0xc0, + 0xd6, 0xff, 0x05, 0xaf, 0x77, 0xe1, 0x28, 0x3a, 0x55, 0x85, 0x73, 0x4e, 0xa2, 0x4c, 0x7a, 0xbb, + 0xbc, 0x9e, 0xd5, 0xaf, 0x24, 0xa3, 0xd0, 0x4e, 0xd3, 0xdf, 0xd8, 0x31, 0xf2, 0xfd, 0x92, 0x12, + 0x4c, 0x6f, 0xdb, 0x5b, 0xcb, 0xbb, 0x4b, 0x3b, 0xb5, 0x9d, 0x2f, 0xb6, 0x57, 0x6a, 0xbb, 0x9b, + 0x0f, 0x37, 0xb7, 0x1e, 0x6d, 0xf2, 0xe0, 0xd4, 0x46, 0xc9, 0xce, 0x4a, 0x65, 0xa3, 0x58, 0x20, + 0xd3, 0x50, 0x34, 0xc0, 0x2b, 0xbb, 0x8b, 0xc5, 0xde, 0x1b, 0x5f, 0x1b, 0x79, 0x6c, 0xc9, 0x3c, + 0x94, 0xaa, 0xbb, 0xdb, 0xdb, 0x5b, 0xb6, 0xe2, 0xaa, 0x87, 0xc6, 0x9e, 0x81, 0x73, 0x46, 0xe9, + 0x3d, 0x7b, 0x65, 0xa5, 0x58, 0x60, 0x4d, 0x31, 0xc0, 0xdb, 0xf6, 0xca, 0xc6, 0xda, 0xee, 0x46, + 0xb1, 0xf7, 0x46, 0x4d, 0x7f, 0xda, 0x45, 0x2e, 0xc2, 0xec, 0xf2, 0xca, 0xde, 0xda, 0xd2, 0x4a, + 0x16, 0xef, 0x69, 0x28, 0xea, 0x85, 0x3b, 0x5b, 0x3b, 0xdb, 0x9c, 0xb5, 0x0e, 0x7d, 0xb4, 0xb2, + 0x58, 0xd9, 0xdd, 0x59, 0xdd, 0x2c, 0xf6, 0x59, 0xfd, 0xc3, 0xbd, 0xc5, 0xde, 0x1b, 0x3f, 0x32, + 0xde, 0x7d, 0xb1, 0xe6, 0x0b, 0xf4, 0xdd, 0x6a, 0xe5, 0x7e, 0x7e, 0x15, 0xbc, 0x74, 0xe3, 0x5e, + 0xa5, 0x58, 0x20, 0x97, 0xe0, 0x82, 0x01, 0xdd, 0xae, 0x54, 0xab, 0x8f, 0xb6, 0xec, 0xe5, 0xf5, + 0x95, 0x6a, 0xb5, 0xd8, 0x7b, 0x63, 0xcf, 0x08, 0xcf, 0xc6, 0x6a, 0xd8, 0xb8, 0x57, 0xa9, 0xd9, + 0x2b, 0x9f, 0xed, 0xae, 0xd9, 0x2b, 0xcb, 0xe9, 0x1a, 0x8c, 0xd2, 0x2f, 0x56, 0xaa, 0xc5, 0x02, + 0x99, 0x82, 0x49, 0x03, 0xba, 0xb9, 0x55, 0xec, 0xbd, 0xf1, 0x86, 0x88, 0xe0, 0x45, 0x26, 0x00, + 0x96, 0x57, 0xaa, 0x4b, 0x2b, 0x9b, 0xcb, 0x6b, 0x9b, 0xf7, 0x8b, 0x3d, 0x64, 0x1c, 0x46, 0x2a, + 0xea, 0x67, 0xe1, 0xc6, 0x87, 0x30, 0x99, 0x38, 0x51, 0x33, 0x0c, 0x75, 0x18, 0x2d, 0xf6, 0xa0, + 0xf8, 0xe5, 0x4f, 0x34, 0x6b, 0xf2, 0xc3, 0x71, 0xb1, 0x70, 0x63, 0x51, 0xa6, 0x3e, 0xd5, 0xbe, + 0x73, 0x32, 0x0a, 0x43, 0xcb, 0x2b, 0xf7, 0x2a, 0xbb, 0xeb, 0x3b, 0xc5, 0x1e, 0xf6, 0x63, 0xc9, + 0x5e, 0xa9, 0xec, 0xac, 0x2c, 0x17, 0x0b, 0x64, 0x04, 0x06, 0xaa, 0x3b, 0x95, 0x9d, 0x95, 0x62, + 0x2f, 0x19, 0x86, 0xfe, 0xdd, 0xea, 0x8a, 0x5d, 0xec, 0x5b, 0xf8, 0xd7, 0x7f, 0x50, 0xe0, 0xb6, + 0x3d, 0xf9, 0x86, 0xe8, 0x6b, 0xed, 0x30, 0x29, 0x96, 0x3c, 0x91, 0xe7, 0x31, 0xf7, 0xe4, 0x88, + 0x5a, 0xc0, 0x5c, 0x87, 0xcb, 0x0e, 0x44, 0xb8, 0x5e, 0xb8, 0x5d, 0x20, 0x36, 0x3a, 0x87, 0x24, + 0xce, 0x56, 0x8a, 0x73, 0xf6, 0xf1, 0x77, 0xee, 0x52, 0xc7, 0x23, 0x19, 0xf9, 0x35, 0xb0, 0x74, + 0x9e, 0x39, 0x27, 0x90, 0xef, 0x9e, 0xee, 0xa4, 0x21, 0xeb, 0x7c, 0xe3, 0x74, 0xe8, 0xe4, 0x01, + 0x8c, 0x33, 0xdd, 0x5c, 0xa1, 0x91, 0x8b, 0x49, 0x42, 0xed, 0x38, 0x30, 0x37, 0x9f, 0x5d, 0xa8, + 0x52, 0xb1, 0x8c, 0x61, 0x47, 0xf8, 0xc1, 0x3a, 0x24, 0x32, 0xca, 0x83, 0x84, 0xf0, 0x15, 0x7f, + 0xee, 0x5c, 0x02, 0xbc, 0x77, 0xe7, 0x76, 0x81, 0x54, 0x31, 0xc4, 0x9a, 0xa1, 0xe4, 0x13, 0xf9, + 0xa8, 0x2d, 0xad, 0xfd, 0xf3, 0xd6, 0x94, 0x55, 0xe2, 0xc4, 0x9c, 0xd3, 0xc1, 0x26, 0x90, 0xb4, + 0xee, 0x4c, 0xae, 0xc4, 0xf3, 0x20, 0x5b, 0xad, 0x9e, 0x3b, 0x9f, 0xf2, 0xf9, 0x5b, 0x61, 0xda, + 0x13, 0x59, 0x81, 0x09, 0xf1, 0x84, 0x5b, 0x68, 0xf3, 0xa4, 0xd3, 0x79, 0x20, 0x97, 0xcd, 0x7d, + 0x94, 0x93, 0x3a, 0x11, 0x90, 0xb9, 0xb8, 0x1f, 0xc9, 0x63, 0xc2, 0xdc, 0xc5, 0xcc, 0x32, 0xd1, + 0xbf, 0x7b, 0x30, 0x61, 0x1e, 0x2e, 0x88, 0x1c, 0xa0, 0xcc, 0x33, 0x47, 0x6e, 0x83, 0x6a, 0x30, + 0xbb, 0xe1, 0xb8, 0x78, 0x45, 0x21, 0x3c, 0xcb, 0xa4, 0x5f, 0x18, 0x29, 0x77, 0x70, 0x14, 0xab, + 0x52, 0xaf, 0xa1, 0x06, 0x21, 0x2f, 0xac, 0x3a, 0x7e, 0x36, 0x55, 0xa9, 0x23, 0x9b, 0x7e, 0x75, + 0xc4, 0x32, 0x93, 0xe1, 0x66, 0xb9, 0x4a, 0xce, 0xe5, 0x79, 0xf7, 0x92, 0x0d, 0x54, 0xd2, 0x13, + 0x1c, 0xb5, 0x39, 0x71, 0x66, 0x76, 0x25, 0x0c, 0x24, 0xa0, 0x65, 0x28, 0x17, 0x85, 0x21, 0xc9, + 0x11, 0x5c, 0x2e, 0xb3, 0xdb, 0x05, 0xf2, 0x35, 0x7e, 0xd5, 0x99, 0xec, 0x1e, 0xb9, 0xd1, 0xa1, + 0xd0, 0x7e, 0x2e, 0x66, 0x32, 0x10, 0x1f, 0x4a, 0x07, 0xee, 0x36, 0x4c, 0x67, 0x39, 0x14, 0x2b, + 0x81, 0x76, 0xf0, 0x36, 0xce, 0x9d, 0x05, 0x36, 0x3b, 0x6a, 0x34, 0xf2, 0x07, 0xa9, 0x83, 0x3f, + 0x6b, 0x2e, 0xcf, 0x8f, 0x61, 0x82, 0xcd, 0x92, 0x87, 0x94, 0xb6, 0x2a, 0x4d, 0xf7, 0x29, 0x0d, + 0x89, 0x8c, 0x8f, 0xab, 0x40, 0x79, 0xb4, 0xd7, 0x0b, 0xe4, 0x3b, 0x30, 0xfa, 0xc8, 0x89, 0xea, + 0x87, 0x22, 0x4e, 0xa4, 0x0c, 0x23, 0x89, 0xb0, 0x39, 0xf9, 0x0b, 0x0b, 0x6f, 0x17, 0xc8, 0xf7, + 0x61, 0xe8, 0x3e, 0x8d, 0xf0, 0x51, 0xf1, 0x55, 0xe5, 0x5b, 0xc7, 0x6d, 0x93, 0x6b, 0x9e, 0x7a, + 0x39, 0x23, 0x1b, 0x9c, 0x34, 0xa0, 0x92, 0x5b, 0x00, 0x7c, 0x41, 0x40, 0x0e, 0xc9, 0xe2, 0xb9, + 0x54, 0xb3, 0xc9, 0x7d, 0xa6, 0x3c, 0x34, 0x69, 0x44, 0x4f, 0x5b, 0x65, 0x9e, 0x8c, 0xd6, 0x61, + 0x42, 0x65, 0xaf, 0xd9, 0xc4, 0x70, 0x1e, 0x56, 0x82, 0x59, 0x78, 0x06, 0x6e, 0x1f, 0xb2, 0xaf, + 0x82, 0xa7, 0x6e, 0xc5, 0xb8, 0x0f, 0xb8, 0x92, 0xce, 0xea, 0xc1, 0x23, 0xf4, 0x25, 0x54, 0x0a, + 0x91, 0xa3, 0x69, 0xb4, 0xab, 0x7e, 0x18, 0x99, 0xb4, 0x0a, 0x92, 0x4d, 0xfb, 0xab, 0x30, 0xa7, + 0xd7, 0x6b, 0x06, 0x2a, 0x8e, 0xd7, 0xdc, 0xbc, 0xf8, 0xc7, 0x73, 0x57, 0x3b, 0x60, 0x88, 0xf3, + 0x5b, 0xdf, 0x6f, 0xf7, 0x16, 0x70, 0x39, 0x59, 0x86, 0x29, 0x59, 0xd7, 0x56, 0x8b, 0x7a, 0xd5, + 0xea, 0x2a, 0x66, 0x2a, 0x91, 0x9e, 0x1c, 0x1a, 0x4c, 0x72, 0x27, 0xe9, 0x22, 0xb6, 0xf5, 0x19, + 0xf1, 0x1d, 0x48, 0xa7, 0xa8, 0x0f, 0xf1, 0xd6, 0x97, 0x19, 0x41, 0xf7, 0x21, 0x37, 0x2a, 0x19, + 0xca, 0xff, 0xde, 0x02, 0xe9, 0x70, 0x00, 0x9a, 0xcb, 0x39, 0x42, 0xdc, 0x2e, 0x90, 0x2f, 0x80, + 0xa4, 0x8f, 0x24, 0x4a, 0x84, 0xb9, 0xc7, 0x2f, 0x25, 0xc2, 0x0e, 0xe7, 0x99, 0x15, 0x98, 0x52, + 0xd1, 0x5d, 0xe2, 0x72, 0x92, 0xd3, 0x96, 0x0e, 0x3b, 0xd8, 0x4c, 0x06, 0x9b, 0xbd, 0x85, 0x0e, + 0x8c, 0x32, 0xe1, 0xe4, 0x53, 0x98, 0x12, 0x73, 0xdf, 0x68, 0x4f, 0x51, 0x2d, 0x63, 0xe2, 0x70, + 0x93, 0xdb, 0x92, 0x07, 0x30, 0x53, 0x4d, 0x08, 0x9e, 0xfb, 0xb1, 0x5f, 0x30, 0x59, 0x20, 0xb0, + 0x4a, 0x23, 0x2e, 0xf9, 0x6c, 0x5e, 0x0f, 0x81, 0x70, 0xdb, 0x92, 0x64, 0xf7, 0xd4, 0xa5, 0xcf, + 0xc8, 0xa5, 0x44, 0xd3, 0x19, 0x10, 0xd1, 0x70, 0x1d, 0xcc, 0xed, 0xd9, 0x0e, 0xcf, 0x5f, 0x8c, + 0x50, 0xe3, 0x06, 0xfc, 0x8a, 0x41, 0x60, 0x5c, 0xa2, 0x8b, 0x71, 0xbc, 0x90, 0x8b, 0x41, 0x7e, + 0x03, 0xa3, 0xb3, 0x76, 0x3e, 0x9d, 0x91, 0xef, 0x64, 0x1d, 0xa2, 0x73, 0xce, 0x97, 0x73, 0x6f, + 0x9f, 0x0e, 0x59, 0x9d, 0x87, 0xc7, 0xef, 0xd3, 0x68, 0xbb, 0xd9, 0x3e, 0x70, 0x31, 0xb3, 0x25, + 0x51, 0xb6, 0x27, 0x05, 0x12, 0xd3, 0x5b, 0x06, 0x45, 0x8b, 0x0b, 0xaa, 0xf4, 0xc7, 0x64, 0x0d, + 0x8a, 0x7c, 0x1b, 0xd1, 0x58, 0x5c, 0x4a, 0xb1, 0x10, 0x28, 0x4e, 0xe0, 0x1c, 0x85, 0xb9, 0xa3, + 0x75, 0x8b, 0xbb, 0x1c, 0x11, 0xf9, 0x69, 0xeb, 0x7a, 0xea, 0x94, 0x01, 0x53, 0x11, 0xeb, 0xd9, + 0x88, 0xd8, 0x34, 0xa4, 0x91, 0x0c, 0x03, 0xc3, 0xf3, 0x9a, 0x5e, 0x8b, 0x75, 0x86, 0x74, 0x69, + 0xbc, 0x82, 0x24, 0x42, 0x96, 0xed, 0xdd, 0x25, 0x2a, 0xd7, 0x6b, 0x06, 0xd3, 0x37, 0x0c, 0xd5, + 0xe6, 0x6c, 0x7c, 0xdf, 0xc1, 0xad, 0x0c, 0x43, 0xdf, 0xcc, 0xc4, 0x6d, 0x63, 0xbf, 0x25, 0xd5, + 0xb8, 0x46, 0xb5, 0xb7, 0x80, 0x2b, 0x23, 0xdb, 0x6b, 0x99, 0x26, 0xdc, 0x0e, 0x02, 0xea, 0x71, + 0xe2, 0x3c, 0xb5, 0x25, 0x8b, 0xfa, 0x13, 0x5c, 0xc1, 0x34, 0x6a, 0xfe, 0xdc, 0xae, 0x1b, 0x0b, + 0x9e, 0x87, 0xe7, 0x76, 0x81, 0xbc, 0x0f, 0xc3, 0xa2, 0x8d, 0x8c, 0xc8, 0x68, 0x74, 0xd8, 0xa1, + 0xd5, 0x48, 0x09, 0x5c, 0x48, 0xd8, 0x66, 0x13, 0x27, 0x6f, 0xf4, 0x79, 0x9b, 0xdf, 0x67, 0x7b, + 0x76, 0xe3, 0x45, 0x28, 0x97, 0xe4, 0xe6, 0x8d, 0x94, 0x25, 0x15, 0x89, 0x45, 0x82, 0xba, 0xec, + 0xb2, 0x9c, 0x09, 0x53, 0xbf, 0x31, 0xe6, 0xa0, 0x0a, 0x1d, 0xa6, 0xd4, 0x6f, 0x03, 0xdc, 0x6d, + 0xcb, 0x5e, 0x83, 0x62, 0xa5, 0x8e, 0x1b, 0x4a, 0x95, 0x1e, 0x39, 0xad, 0x43, 0x3f, 0xa0, 0xea, + 0xec, 0x93, 0x2c, 0x90, 0xbc, 0x66, 0x94, 0x82, 0x22, 0x0a, 0xd6, 0xa9, 0x83, 0x81, 0x99, 0x67, + 0x95, 0x86, 0x92, 0x28, 0xca, 0xa6, 0xe8, 0x70, 0xd6, 0x99, 0x5e, 0x62, 0xa7, 0xb3, 0xe6, 0xcb, + 0xb1, 0xf9, 0x10, 0x17, 0x0c, 0x85, 0x1c, 0xaa, 0x1d, 0x42, 0x81, 0xd4, 0xa9, 0x50, 0xbe, 0xbc, + 0x51, 0xa8, 0x15, 0x79, 0xf5, 0x1c, 0x8b, 0x25, 0x8f, 0x3a, 0xaf, 0xfa, 0xef, 0xc1, 0xc4, 0x0a, + 0x5b, 0xd0, 0xdb, 0x0d, 0x97, 0x07, 0xa3, 0x27, 0x66, 0x74, 0xf1, 0x5c, 0xc2, 0x55, 0x99, 0xfa, + 0x0a, 0x49, 0x85, 0x05, 0x41, 0xee, 0x29, 0x1a, 0x4c, 0x8e, 0xc7, 0xb4, 0x64, 0x2b, 0xf2, 0x01, + 0xe0, 0x09, 0x5f, 0x98, 0x0c, 0x66, 0xb9, 0x62, 0x59, 0x69, 0xb5, 0x9a, 0xd2, 0xb2, 0xcd, 0x6f, + 0xea, 0x5f, 0x37, 0x4e, 0xa2, 0xa9, 0x72, 0xc9, 0x3b, 0xad, 0x7b, 0x7e, 0xae, 0xa5, 0xa2, 0xcd, + 0xe1, 0x99, 0x53, 0xde, 0x6d, 0x2e, 0xaa, 0xf0, 0xd1, 0x95, 0x66, 0x33, 0x45, 0x1c, 0x92, 0xb7, + 0x4c, 0xee, 0x59, 0x38, 0xdd, 0x6a, 0xc0, 0x93, 0x3e, 0x57, 0xde, 0x2a, 0xad, 0x16, 0x5f, 0x2c, + 0x2f, 0xab, 0x05, 0xc3, 0x2c, 0x48, 0x9f, 0xf4, 0x93, 0xe5, 0x62, 0x6d, 0x7f, 0x80, 0xd3, 0x2c, + 0xce, 0x57, 0x4b, 0xf4, 0x73, 0x73, 0x32, 0x5d, 0xaf, 0xd2, 0xe5, 0x12, 0x85, 0x6a, 0x9f, 0x98, + 0x4c, 0xa4, 0xee, 0x57, 0x06, 0x9e, 0x54, 0x4a, 0x7f, 0xce, 0xef, 0x72, 0x5e, 0xb1, 0x32, 0xb8, + 0x16, 0x93, 0x39, 0xc1, 0x55, 0x97, 0x73, 0x72, 0xcd, 0xab, 0x2e, 0xe7, 0x26, 0x13, 0x7f, 0x00, + 0xc5, 0x64, 0x3a, 0x62, 0xc5, 0x34, 0x27, 0x4f, 0x71, 0xee, 0x98, 0xdc, 0x83, 0x69, 0x7d, 0x44, + 0x55, 0xbf, 0xf3, 0x56, 0xff, 0x3c, 0x3e, 0x3b, 0x30, 0x93, 0x99, 0x3d, 0x58, 0x6d, 0xb1, 0x9d, + 0x72, 0x0b, 0xe7, 0x72, 0xa5, 0x70, 0x3e, 0x3b, 0x81, 0x38, 0x79, 0xcd, 0xb4, 0x1f, 0x64, 0xa7, + 0x53, 0x9e, 0x7b, 0xbd, 0x0b, 0x96, 0x10, 0xe8, 0xd7, 0xb8, 0x03, 0xa6, 0xea, 0xb8, 0xaa, 0x59, + 0x14, 0x72, 0x2a, 0xb0, 0x3a, 0xa1, 0xa8, 0x39, 0x30, 0x9d, 0x51, 0x9c, 0x2f, 0xe2, 0x6b, 0xf9, + 0x3c, 0xe3, 0x89, 0xb5, 0x27, 0xa3, 0x24, 0xe7, 0x4a, 0xa6, 0x63, 0xa2, 0xe9, 0x0e, 0x47, 0xd2, + 0x39, 0x35, 0x1f, 0x4e, 0xdf, 0xe4, 0x3c, 0x6e, 0x0d, 0x65, 0xfd, 0x31, 0xb2, 0x40, 0x27, 0xad, + 0x3f, 0x59, 0xd9, 0xab, 0x95, 0x18, 0x3a, 0xe5, 0x47, 0xe7, 0xbb, 0xf1, 0x57, 0xdc, 0x1c, 0x64, + 0x56, 0xa1, 0x9b, 0x83, 0x32, 0xf9, 0x5f, 0xc9, 0x47, 0xd0, 0x99, 0x3b, 0xfc, 0xee, 0x37, 0x91, + 0xc6, 0x9a, 0xe8, 0x27, 0xae, 0xec, 0x14, 0xd7, 0x6a, 0x6e, 0x64, 0xa2, 0xe8, 0x55, 0x3c, 0x92, + 0xdf, 0x60, 0x8e, 0x94, 0x3a, 0xe4, 0xf8, 0xee, 0xac, 0xa6, 0x6c, 0x41, 0x29, 0x1e, 0xcc, 0x44, + 0x07, 0xce, 0x38, 0x94, 0x52, 0x18, 0x17, 0x72, 0x33, 0x7b, 0x93, 0x37, 0x53, 0x5f, 0x7a, 0x8e, + 0x60, 0x3a, 0x56, 0xc1, 0xd7, 0x73, 0x2d, 0xea, 0xf2, 0xc5, 0xd8, 0x16, 0xac, 0x27, 0x01, 0x4f, + 0xad, 0xe7, 0x19, 0x19, 0xc2, 0xef, 0xa3, 0x5e, 0xac, 0x65, 0xf9, 0xce, 0xed, 0xf5, 0xa5, 0x2c, + 0x3e, 0x61, 0x7a, 0xc5, 0xd5, 0xda, 0x25, 0xf5, 0xb4, 0x64, 0xc1, 0x59, 0x56, 0xdc, 0xd3, 0x34, + 0x2d, 0x8f, 0xcf, 0x32, 0x8c, 0x6a, 0xe9, 0xc1, 0xc9, 0x05, 0x43, 0x4c, 0xc6, 0x1e, 0x3a, 0x67, + 0x74, 0xce, 0xdc, 0x3e, 0x97, 0xd0, 0x22, 0xad, 0x92, 0x8c, 0xe7, 0xb6, 0xe2, 0x62, 0x9a, 0x87, + 0x61, 0x8d, 0x56, 0x52, 0xe0, 0xad, 0x99, 0x4f, 0x0a, 0xc7, 0x68, 0x50, 0x7e, 0x97, 0x88, 0x2e, + 0x9a, 0x2e, 0x4d, 0xca, 0xd7, 0x5f, 0xa7, 0x44, 0x0e, 0x52, 0x4c, 0x95, 0x22, 0x23, 0xf6, 0x9d, + 0x57, 0xa6, 0x35, 0x0d, 0xda, 0xc1, 0xd2, 0xb1, 0x8d, 0x0f, 0x3f, 0x32, 0xf2, 0xa5, 0xab, 0x15, + 0xb6, 0x63, 0x3a, 0xf5, 0x0c, 0xdd, 0x4d, 0xad, 0xd9, 0xb9, 0x1c, 0x3b, 0x26, 0x50, 0xcf, 0x6d, + 0xe9, 0x0f, 0xb5, 0x35, 0x3b, 0x95, 0x15, 0x9d, 0x5c, 0x4f, 0x2a, 0x6e, 0x79, 0x89, 0xd3, 0x3b, + 0xec, 0x09, 0xd3, 0x59, 0x09, 0xd5, 0x35, 0xf3, 0x70, 0x6e, 0xb6, 0xf5, 0x0c, 0x29, 0xd8, 0x72, + 0xfe, 0xe7, 0x70, 0xeb, 0x90, 0x5e, 0x3d, 0xb7, 0x85, 0x5f, 0x6a, 0x0b, 0x5d, 0x22, 0x0d, 0xba, + 0x3a, 0x8e, 0x77, 0xc9, 0x93, 0x9e, 0xcb, 0x7b, 0x13, 0x9f, 0x0a, 0xa5, 0x73, 0x98, 0x2b, 0xcd, + 0xa6, 0x53, 0x86, 0xf3, 0x4c, 0xeb, 0xf1, 0x4c, 0xba, 0x8b, 0x8c, 0xdf, 0xf9, 0x84, 0xed, 0xb7, + 0x5b, 0xc3, 0xbe, 0x96, 0x8b, 0x71, 0x46, 0xee, 0xf3, 0xc4, 0x62, 0x9c, 0x9f, 0x1d, 0xbd, 0xc3, + 0x31, 0x68, 0xb2, 0xea, 0x1e, 0x78, 0x5a, 0xea, 0x72, 0x75, 0x08, 0x4a, 0x67, 0x53, 0x57, 0x4b, + 0x4c, 0x56, 0xa6, 0xf3, 0x2d, 0xa6, 0xff, 0x70, 0xed, 0x5d, 0x4f, 0x42, 0x4d, 0xe6, 0xf2, 0x73, + 0x6f, 0xab, 0xe5, 0x26, 0x33, 0x6b, 0xb5, 0xc6, 0x50, 0xcf, 0x00, 0xad, 0x18, 0x66, 0x24, 0xa3, + 0x56, 0x0c, 0x33, 0x53, 0x46, 0xdf, 0x42, 0xab, 0x8b, 0xed, 0x37, 0xa9, 0x6e, 0x75, 0xd1, 0x52, + 0x0a, 0x27, 0x8c, 0x1e, 0xe4, 0x23, 0x34, 0x79, 0x74, 0xb6, 0x93, 0xcc, 0x9a, 0x9c, 0x74, 0xcf, + 0x92, 0x11, 0x95, 0xaf, 0x59, 0xd9, 0xd8, 0x93, 0x29, 0xa3, 0xe7, 0x4a, 0xe9, 0x02, 0x41, 0xff, + 0xae, 0xb4, 0x9a, 0x60, 0x83, 0x4b, 0xa6, 0xb5, 0x29, 0xbf, 0xcd, 0xef, 0x4a, 0x93, 0x89, 0x41, + 0x96, 0xca, 0xd6, 0x9c, 0x24, 0xfb, 0x1e, 0x8c, 0xc5, 0x99, 0x99, 0xf7, 0x16, 0x34, 0xc2, 0x44, + 0xba, 0xe6, 0x24, 0xe1, 0xfb, 0xf2, 0x5a, 0x05, 0xeb, 0x33, 0x0b, 0x3b, 0xab, 0x00, 0x9f, 0x48, + 0x13, 0x8d, 0xd1, 0xd2, 0x54, 0x9e, 0xe7, 0x0e, 0x2b, 0xf7, 0x98, 0x9e, 0x4e, 0x52, 0xcd, 0x8b, + 0x8c, 0x84, 0xb0, 0x6a, 0x5e, 0x64, 0x25, 0x74, 0x8d, 0xaf, 0x1d, 0xbe, 0x90, 0xf6, 0x88, 0x98, + 0xe9, 0x25, 0xa3, 0x59, 0x29, 0xbe, 0x97, 0xf3, 0x8a, 0x93, 0xac, 0xab, 0x50, 0x4c, 0xe6, 0xbe, + 0x54, 0x87, 0xb9, 0x9c, 0x24, 0xa5, 0xea, 0x84, 0x98, 0x9b, 0x34, 0x73, 0x5b, 0x1a, 0xd7, 0x4d, + 0xbe, 0x57, 0xb3, 0x1b, 0xa5, 0xb3, 0xce, 0xb7, 0xb6, 0x8f, 0x1b, 0x69, 0x30, 0xf5, 0x63, 0x76, + 0x2a, 0xcd, 0xa6, 0xae, 0x96, 0x65, 0x64, 0xce, 0x74, 0x65, 0xb0, 0xa7, 0xec, 0x6c, 0xdc, 0x6f, + 0x99, 0xe7, 0xdf, 0x0e, 0x31, 0xd3, 0xbb, 0x5e, 0x41, 0x93, 0x5f, 0x81, 0xd9, 0x9c, 0xf0, 0xd2, + 0xe4, 0xf5, 0x84, 0x99, 0x36, 0x3b, 0xfc, 0xb4, 0x9a, 0x20, 0x99, 0xf9, 0xa9, 0x37, 0xd0, 0x77, + 0xc1, 0x08, 0xeb, 0x90, 0xba, 0x0f, 0x7c, 0xe4, 0x46, 0x87, 0x3c, 0x0d, 0xb3, 0xb6, 0xe6, 0x66, + 0xc6, 0x83, 0x20, 0x55, 0x3c, 0xc8, 0x18, 0xd0, 0x8c, 0x2b, 0xc1, 0x0c, 0x86, 0x73, 0xd9, 0x0c, + 0xd9, 0xda, 0xc1, 0xe6, 0x42, 0x46, 0xcc, 0x0d, 0x35, 0x17, 0xf2, 0xe3, 0x71, 0xe4, 0x36, 0x73, + 0x5b, 0x2a, 0x58, 0xd9, 0x1c, 0xf3, 0xc3, 0x6f, 0xe4, 0x72, 0x7c, 0xc0, 0x38, 0xa6, 0x22, 0x6a, + 0x90, 0x1c, 0xf4, 0xce, 0xab, 0x87, 0x2d, 0xf7, 0x6b, 0x93, 0x6a, 0x41, 0x6b, 0x5f, 0x5e, 0xec, + 0x8e, 0xdc, 0xf6, 0xad, 0xc8, 0xef, 0x29, 0xbb, 0x7d, 0xa7, 0xdd, 0xb1, 0xd5, 0xe5, 0x59, 0x22, + 0xa8, 0x8b, 0xd1, 0x51, 0x0d, 0x3e, 0x97, 0x03, 0x27, 0x9b, 0xe8, 0x8c, 0x94, 0x84, 0x6a, 0x27, + 0xda, 0xec, 0xa8, 0x31, 0xb9, 0xfc, 0xf8, 0x3c, 0x36, 0xa2, 0x6e, 0x9c, 0x65, 0x1e, 0x27, 0xc2, + 0x75, 0x88, 0x79, 0x6c, 0x40, 0xcf, 0x36, 0x8f, 0x13, 0x0c, 0xcd, 0x79, 0x9c, 0x6c, 0x66, 0xd2, + 0x4c, 0x90, 0x3b, 0xaa, 0xc9, 0x66, 0xaa, 0x79, 0x9c, 0xcd, 0x31, 0x3f, 0x3a, 0x4a, 0x2e, 0x47, + 0x35, 0x8f, 0x4d, 0x8e, 0x39, 0xe8, 0xa7, 0x9c, 0xc7, 0xc9, 0x4a, 0xcc, 0x79, 0x7c, 0xa6, 0xf6, + 0xa9, 0x79, 0x9c, 0xdd, 0xbe, 0x33, 0xcf, 0xe3, 0x44, 0x38, 0x21, 0xa3, 0xa3, 0x59, 0xf3, 0x38, + 0x89, 0xcf, 0xe7, 0x71, 0x12, 0x9a, 0xb0, 0xcc, 0x74, 0x98, 0xc7, 0x49, 0xca, 0xcf, 0x90, 0x5f, + 0x22, 0x14, 0xca, 0x69, 0x66, 0x72, 0x6e, 0x14, 0x15, 0xf2, 0x08, 0x6d, 0x83, 0x09, 0xf8, 0xe9, + 0x66, 0xf3, 0x7c, 0x1e, 0x53, 0x9c, 0xcf, 0x7b, 0x52, 0x88, 0xc9, 0xe6, 0x9a, 0x86, 0xaf, 0xec, + 0x48, 0x30, 0x1d, 0x1a, 0xbc, 0xc7, 0xe6, 0x4d, 0xa3, 0x03, 0xdf, 0x4e, 0x81, 0x6c, 0x3a, 0xf0, + 0x55, 0xe7, 0xa0, 0x24, 0xdf, 0x5c, 0x92, 0xce, 0xf3, 0xfb, 0x73, 0x79, 0x3b, 0x92, 0xa4, 0x5b, + 0x48, 0x9c, 0xac, 0xce, 0xdc, 0x52, 0x75, 0xc2, 0x4a, 0xb6, 0xf4, 0xac, 0xf3, 0x7c, 0x43, 0x6a, + 0x0f, 0xa9, 0x08, 0x58, 0x89, 0x4e, 0xeb, 0x73, 0x3d, 0xb7, 0x84, 0xec, 0xa0, 0x21, 0x38, 0x0d, + 0xd7, 0x8c, 0xc8, 0x79, 0xa1, 0xb6, 0xba, 0x72, 0x4d, 0xc5, 0xf2, 0xd1, 0xb9, 0xe6, 0x05, 0xfa, + 0x51, 0x5c, 0xd3, 0xd4, 0x9f, 0xa2, 0xe9, 0x4c, 0xbc, 0xf8, 0xf2, 0x1e, 0xfb, 0xf9, 0xe7, 0x9c, + 0x29, 0xc3, 0x61, 0x8a, 0xe1, 0xa2, 0x9f, 0xda, 0xc7, 0xe2, 0xfa, 0x4f, 0x02, 0x73, 0x85, 0x9f, + 0x45, 0x4f, 0x3e, 0x85, 0xa2, 0x58, 0xde, 0x62, 0x06, 0x59, 0x88, 0xb9, 0x43, 0xb7, 0x28, 0x2d, + 0x76, 0xa7, 0x68, 0xc1, 0x69, 0x2c, 0x75, 0xa7, 0x91, 0x44, 0xbe, 0x59, 0x8b, 0x6d, 0x87, 0x3b, + 0x41, 0x3b, 0x8c, 0x68, 0x23, 0x6d, 0x8e, 0x32, 0x1b, 0x23, 0xdd, 0x2a, 0x4c, 0xf4, 0xbd, 0x05, + 0xb2, 0x86, 0x6b, 0x9b, 0x09, 0xee, 0x64, 0xaf, 0xcb, 0x66, 0x83, 0x4b, 0xcf, 0xaa, 0x7a, 0x5a, + 0x64, 0xb6, 0x29, 0xaf, 0xee, 0xfc, 0x46, 0x29, 0x11, 0x9d, 0xb2, 0x77, 0x79, 0x22, 0xe2, 0x07, + 0x6a, 0x6e, 0x3b, 0xec, 0x26, 0x99, 0xe4, 0x63, 0x27, 0xf2, 0x03, 0x18, 0x91, 0xc4, 0xdd, 0x05, + 0x92, 0xa4, 0x46, 0x81, 0x2c, 0xc3, 0xb8, 0xf1, 0x92, 0x4b, 0x9d, 0x6e, 0xb2, 0xde, 0x77, 0x75, + 0x18, 0xe7, 0x71, 0xe3, 0xc5, 0x96, 0xe2, 0x92, 0xf5, 0x8e, 0x2b, 0x97, 0xcb, 0xf7, 0x61, 0x54, + 0x88, 0xb4, 0xa3, 0x34, 0xf2, 0x8d, 0x75, 0x33, 0x9a, 0x57, 0x74, 0xbb, 0xe1, 0x46, 0x4b, 0xbe, + 0xf7, 0xd8, 0x3d, 0xe8, 0x2a, 0x98, 0x34, 0xc9, 0xde, 0x02, 0xf9, 0x0a, 0x93, 0x16, 0xcb, 0x54, + 0xd2, 0x34, 0x7a, 0xe6, 0x07, 0x4f, 0x5c, 0xef, 0xa0, 0x0b, 0xcb, 0x2b, 0x26, 0xcb, 0x24, 0x9d, + 0x74, 0x3c, 0xf9, 0x0a, 0xe6, 0xaa, 0xf9, 0xcc, 0xbb, 0x32, 0xe9, 0xbc, 0xbd, 0x54, 0x61, 0x1e, + 0x5d, 0x6f, 0xce, 0xda, 0xf6, 0x8e, 0x4c, 0xbf, 0xe0, 0x41, 0x14, 0xa5, 0xa1, 0xbf, 0xee, 0x07, + 0x8d, 0xee, 0x1c, 0xcb, 0xa6, 0x33, 0x6f, 0x82, 0x4c, 0x0a, 0xe3, 0x0b, 0xb8, 0x50, 0xcd, 0x65, + 0xdd, 0x8d, 0x45, 0x37, 0x4d, 0xf2, 0x22, 0x8a, 0xe2, 0x8c, 0xed, 0xee, 0xc8, 0x73, 0x0d, 0xd7, + 0x34, 0xb6, 0x0f, 0x6d, 0x07, 0xf4, 0x31, 0x0d, 0xd0, 0x65, 0xbc, 0x9b, 0xb3, 0xb4, 0x89, 0x2e, + 0x7b, 0xbe, 0x06, 0xe7, 0xaa, 0x29, 0x56, 0x79, 0x24, 0xdd, 0x2e, 0x8f, 0xa6, 0xb0, 0xa7, 0xa7, + 0x6c, 0x57, 0x17, 0x17, 0xa3, 0xd1, 0xfb, 0x34, 0xda, 0x5d, 0xeb, 0x22, 0x25, 0xf9, 0xa6, 0x41, + 0x22, 0xee, 0xdd, 0x61, 0x94, 0x55, 0x8d, 0x32, 0x8d, 0x91, 0xfb, 0xf1, 0xfe, 0x40, 0x5e, 0xa4, + 0x74, 0xad, 0x36, 0x8f, 0xc3, 0x5d, 0x5c, 0x0b, 0x85, 0xdb, 0xb4, 0x66, 0x82, 0xe4, 0x90, 0xd8, + 0x54, 0xa7, 0x79, 0x50, 0x87, 0xa4, 0xc2, 0x8f, 0x7f, 0x7c, 0x7a, 0x08, 0xd8, 0xe5, 0x94, 0x3b, + 0x7d, 0x47, 0x16, 0xdc, 0x84, 0xba, 0xee, 0xd7, 0x9f, 0xe8, 0x26, 0x54, 0x2d, 0xad, 0xfd, 0x9c, + 0x99, 0x74, 0x5e, 0xac, 0xf8, 0x98, 0x79, 0x5e, 0xf7, 0x1a, 0xd3, 0x13, 0xdb, 0xeb, 0x26, 0x54, + 0x33, 0x05, 0xff, 0x5d, 0x69, 0x5b, 0xc4, 0x0a, 0x4d, 0xce, 0xb9, 0xa2, 0x51, 0x66, 0x45, 0x24, + 0x32, 0xcd, 0x8a, 0x7a, 0x43, 0xf3, 0x2f, 0x02, 0x48, 0x3a, 0x07, 0xbf, 0x3a, 0xac, 0xe4, 0xa6, + 0xe7, 0xef, 0xe0, 0xfc, 0x35, 0x25, 0x5c, 0x86, 0x0c, 0xc1, 0xab, 0x40, 0xc4, 0xe9, 0xb2, 0x58, + 0x94, 0xba, 0x27, 0xd3, 0xed, 0x02, 0xd9, 0x84, 0xf3, 0xf7, 0x69, 0x24, 0xd6, 0x38, 0x9b, 0x86, + 0x51, 0xe0, 0xd6, 0xa3, 0x8e, 0xb7, 0x8a, 0xf2, 0x6c, 0x92, 0x41, 0xb3, 0xf7, 0x0e, 0xe3, 0x57, + 0xcd, 0xe6, 0xd7, 0x91, 0xae, 0x83, 0x7f, 0xad, 0xb8, 0xaa, 0x38, 0x4b, 0x13, 0xf3, 0xa7, 0xf8, + 0x10, 0x77, 0xdf, 0xc9, 0x27, 0x2d, 0xc6, 0x51, 0x4f, 0xc4, 0x69, 0xeb, 0x26, 0x0c, 0x72, 0xa2, + 0xdc, 0x0d, 0x75, 0x4c, 0xa7, 0x21, 0x77, 0x60, 0x44, 0xf9, 0xdf, 0x10, 0xa3, 0x28, 0xb7, 0x5d, + 0x77, 0x60, 0x84, 0x1f, 0xad, 0x4e, 0x4f, 0xf2, 0x11, 0x8c, 0x28, 0x87, 0x9d, 0x33, 0xef, 0xf4, + 0x9f, 0xc2, 0xb8, 0xee, 0xba, 0x73, 0x76, 0x41, 0x7e, 0x1f, 0xef, 0x7e, 0xe5, 0x15, 0x4b, 0x3e, + 0xfd, 0x4c, 0x22, 0xd3, 0x97, 0x10, 0x29, 0x5f, 0x20, 0x25, 0x30, 0xb7, 0xf9, 0xe7, 0x52, 0xd4, + 0xe4, 0x23, 0xf9, 0x9a, 0x4a, 0x11, 0xa7, 0x91, 0x3a, 0xc8, 0x6c, 0x82, 0x8b, 0xf9, 0x45, 0x88, + 0xd5, 0x02, 0xdb, 0xb5, 0xd9, 0xa7, 0xb9, 0xa3, 0xee, 0x2e, 0xba, 0x3c, 0x2e, 0x5b, 0xa8, 0xa5, + 0xa5, 0x72, 0xd0, 0xe5, 0x33, 0xba, 0x9c, 0x9f, 0xb6, 0x0e, 0x07, 0xe3, 0x01, 0x9e, 0x02, 0x53, + 0xa5, 0xb9, 0xdd, 0xeb, 0x90, 0x06, 0x2f, 0x3e, 0xf6, 0xa6, 0xd9, 0x75, 0x20, 0xeb, 0x74, 0x8a, + 0x16, 0x6f, 0x44, 0x5f, 0x09, 0xbb, 0x35, 0xe9, 0x01, 0x79, 0xfa, 0xce, 0xe6, 0xb7, 0xec, 0x62, + 0xc6, 0xad, 0x78, 0xd7, 0xb1, 0xc8, 0x63, 0xf7, 0x2b, 0xa8, 0x1d, 0x66, 0x06, 0x03, 0xcb, 0x67, + 0x76, 0x5d, 0x73, 0xac, 0xc8, 0xa4, 0x54, 0x9b, 0xde, 0x13, 0x7c, 0xa6, 0x96, 0x9d, 0xa5, 0xef, + 0x8d, 0x2e, 0x5c, 0xa4, 0x24, 0xde, 0xec, 0x8a, 0xa7, 0xee, 0x58, 0x2f, 0xf2, 0x1d, 0x36, 0xbb, + 0xbe, 0x2e, 0x59, 0x07, 0x33, 0xae, 0xbd, 0x95, 0x7b, 0x69, 0x36, 0x43, 0xd3, 0xbd, 0xb4, 0x63, + 0x1f, 0xf2, 0xc4, 0xff, 0x19, 0x94, 0x63, 0xef, 0x91, 0xb3, 0x0d, 0x42, 0xbe, 0x57, 0x23, 0x49, + 0x49, 0x2a, 0x24, 0x9d, 0xd2, 0xf0, 0xcc, 0x5d, 0xcd, 0x93, 0x70, 0xa8, 0xb9, 0x25, 0x09, 0xaf, + 0xb8, 0x44, 0xbe, 0xca, 0xbc, 0xcc, 0x97, 0x1d, 0xec, 0xb0, 0xe2, 0xdd, 0xde, 0x2b, 0x61, 0x94, + 0x1e, 0xed, 0xb3, 0x33, 0x52, 0xce, 0x1d, 0x09, 0x46, 0x56, 0x87, 0xe1, 0xed, 0x7e, 0xf5, 0x58, + 0xca, 0x19, 0xd7, 0xb3, 0x0f, 0xa8, 0x13, 0xbf, 0x55, 0x4b, 0xc4, 0x0e, 0xd4, 0xdf, 0x07, 0xa7, + 0x8b, 0x92, 0x0f, 0xad, 0xb2, 0x30, 0x94, 0x47, 0x55, 0x49, 0x56, 0xc1, 0xe0, 0xec, 0x28, 0xe2, + 0x07, 0x6e, 0xf4, 0x7c, 0xc9, 0x5e, 0x8f, 0xcd, 0x0a, 0x7a, 0x81, 0xe4, 0x0d, 0xb2, 0xd0, 0x5e, + 0x27, 0x5f, 0xe2, 0x52, 0x22, 0xd8, 0x2f, 0xfa, 0x7e, 0x14, 0x46, 0x81, 0xd3, 0xaa, 0xd6, 0x03, + 0xb7, 0x15, 0xe5, 0x76, 0x3a, 0x76, 0x00, 0xcf, 0x22, 0xd3, 0xfc, 0x51, 0x45, 0x6c, 0xf9, 0xac, + 0xe8, 0x3b, 0xea, 0x4d, 0x4e, 0x56, 0x61, 0x87, 0x93, 0x4b, 0x55, 0x46, 0x93, 0x7f, 0x95, 0x4c, + 0x6b, 0x30, 0x9b, 0x13, 0xb3, 0x48, 0xdd, 0xde, 0x76, 0x8e, 0x69, 0x34, 0xd7, 0xb9, 0x62, 0xf2, + 0x15, 0xcc, 0x64, 0x06, 0x35, 0x52, 0x16, 0xe8, 0x4e, 0x21, 0x8f, 0xba, 0x31, 0x7f, 0x02, 0x25, + 0xfe, 0x1a, 0x04, 0x9d, 0x9e, 0x8d, 0xf8, 0x36, 0xf1, 0x1b, 0xa1, 0x1c, 0x84, 0xe4, 0x7a, 0x9d, + 0x8f, 0xa7, 0x1e, 0xbc, 0x4f, 0x63, 0x60, 0x93, 0x44, 0x3a, 0x74, 0xf5, 0xe1, 0x65, 0x15, 0x76, + 0x7a, 0x88, 0xb4, 0x0d, 0x33, 0x7b, 0x34, 0x70, 0x1f, 0x3f, 0x4f, 0x32, 0x94, 0x92, 0xc9, 0x2c, + 0xed, 0xc4, 0xf1, 0x73, 0x98, 0x5d, 0xf2, 0x8f, 0x5a, 0xe2, 0xc9, 0x9f, 0xc1, 0x53, 0x5d, 0xc5, + 0x67, 0x97, 0x77, 0x77, 0x84, 0x9a, 0xcb, 0x4f, 0x5c, 0xaf, 0xfc, 0xdf, 0xba, 0xe6, 0xb6, 0x57, + 0x0f, 0xd7, 0x4c, 0xfa, 0x1d, 0x9c, 0x84, 0x59, 0x99, 0xec, 0xf5, 0x49, 0xd8, 0x21, 0xd3, 0x7d, + 0xce, 0x03, 0xb2, 0xd9, 0x9c, 0xe4, 0xf5, 0x1d, 0xb8, 0x9e, 0xa2, 0xb5, 0x9b, 0x72, 0x6f, 0x31, + 0xd3, 0x7c, 0x27, 0x3c, 0xae, 0x33, 0x73, 0x80, 0x67, 0xb6, 0x53, 0x8b, 0xec, 0xd0, 0x6c, 0x76, + 0x50, 0xb1, 0x88, 0x1e, 0xda, 0x81, 0x61, 0xa2, 0x11, 0x7f, 0x5c, 0xa7, 0xed, 0xb4, 0x5a, 0xa7, + 0x88, 0x51, 0xa9, 0xfd, 0x10, 0xc6, 0xaa, 0x7a, 0xe5, 0x19, 0x95, 0xe4, 0x4e, 0x0a, 0xf5, 0x84, + 0xa8, 0x7b, 0xdb, 0x3b, 0x38, 0x92, 0xaa, 0x8d, 0xe7, 0x54, 0xbd, 0xc8, 0x75, 0x9d, 0x31, 0x72, + 0xb6, 0xa9, 0x5d, 0x20, 0x2b, 0xa5, 0xa2, 0x72, 0x9d, 0xc9, 0x4e, 0xf3, 0x56, 0xe3, 0x59, 0x66, + 0x92, 0x19, 0x33, 0x89, 0xd5, 0x3d, 0x35, 0xad, 0x72, 0xa8, 0xef, 0x98, 0x72, 0x93, 0xfb, 0xf9, + 0xc4, 0x59, 0xea, 0x74, 0x3f, 0x9f, 0x54, 0xee, 0x3b, 0xdd, 0xcf, 0x27, 0x23, 0xb1, 0xdd, 0x0a, + 0xf2, 0x8a, 0xd3, 0xf3, 0x74, 0x30, 0x46, 0x28, 0x36, 0x19, 0x59, 0x80, 0x1e, 0xea, 0x01, 0x42, + 0x78, 0x52, 0x9f, 0x0e, 0xb6, 0xd6, 0x64, 0x60, 0x90, 0x44, 0x16, 0xa0, 0x7b, 0x50, 0xe4, 0xf9, + 0x0d, 0xe2, 0x98, 0x8a, 0xb1, 0xdf, 0x60, 0x3a, 0xed, 0x42, 0x87, 0x41, 0x2d, 0x26, 0xa3, 0xd1, + 0x29, 0x93, 0x59, 0x4e, 0x98, 0xba, 0x0e, 0x53, 0x15, 0xe2, 0x98, 0x73, 0xca, 0x30, 0x95, 0x0a, + 0x43, 0x37, 0x77, 0x21, 0xa3, 0x44, 0xa9, 0x94, 0x63, 0x7a, 0x84, 0x3a, 0xd5, 0xa5, 0x8c, 0xb0, + 0x75, 0x73, 0x17, 0x33, 0xcb, 0x04, 0xa3, 0x88, 0x67, 0x67, 0xce, 0xce, 0x29, 0x1d, 0xbf, 0x02, + 0xeb, 0x80, 0x23, 0xab, 0xb9, 0x71, 0x1a, 0x54, 0x51, 0x2b, 0x55, 0xc9, 0x89, 0x32, 0x12, 0x59, + 0xbf, 0x99, 0xf1, 0x50, 0xc3, 0xc0, 0x88, 0xbd, 0xc1, 0x3a, 0x67, 0xd5, 0x26, 0x8f, 0x64, 0xb2, + 0x98, 0x9c, 0x9a, 0xba, 0x31, 0xc8, 0x1d, 0xc1, 0x47, 0x32, 0x3d, 0xcc, 0xab, 0x66, 0xbc, 0x0f, + 0xf3, 0x89, 0xd7, 0x1f, 0x26, 0xe3, 0x1b, 0xd9, 0x4f, 0x44, 0x32, 0xc5, 0x93, 0xaf, 0xb3, 0x5f, + 0x49, 0xbf, 0x12, 0x49, 0x8c, 0xfb, 0x59, 0xd7, 0xbc, 0x0d, 0x98, 0xc0, 0x65, 0x46, 0xa6, 0x64, + 0x8f, 0xe3, 0xd3, 0x98, 0xe0, 0x64, 0xa0, 0xa4, 0x64, 0xa9, 0x72, 0x99, 0x1d, 0x13, 0x2f, 0x8a, + 0x79, 0x82, 0xf7, 0x39, 0xf3, 0x99, 0x31, 0x02, 0xb3, 0x76, 0x31, 0x91, 0x37, 0x9e, 0x7c, 0x1f, + 0x26, 0xe3, 0x87, 0xc6, 0x9c, 0x45, 0x06, 0x5a, 0x07, 0x43, 0xd9, 0x64, 0xfc, 0xda, 0xf8, 0xec, + 0xe4, 0xab, 0x72, 0x2b, 0x8a, 0xc9, 0x2f, 0xa5, 0xde, 0xca, 0x18, 0x7d, 0x38, 0xcd, 0x8e, 0xa4, + 0xc9, 0xf6, 0xac, 0xa3, 0x53, 0xc7, 0xcf, 0x2d, 0x3b, 0xf4, 0xa2, 0xfe, 0xb9, 0x75, 0x0c, 0x0f, + 0xa9, 0xd4, 0xdf, 0x1c, 0x3e, 0x1b, 0x70, 0x0d, 0xc3, 0xb5, 0x6c, 0xf3, 0x00, 0x7d, 0xd9, 0x58, + 0xf9, 0x6d, 0x4f, 0x06, 0x79, 0x69, 0xc2, 0xd5, 0xae, 0xb1, 0x27, 0xc9, 0x2d, 0xc3, 0xc5, 0xa5, + 0x7b, 0x94, 0xca, 0x0e, 0x27, 0x8f, 0xe9, 0xac, 0x10, 0x8e, 0x6a, 0x9f, 0xed, 0x10, 0x4d, 0x52, + 0xed, 0xb3, 0x1d, 0x63, 0x40, 0x7e, 0x8e, 0x19, 0x98, 0xc4, 0x1e, 0x85, 0x21, 0x98, 0xa8, 0xc7, + 0x83, 0x52, 0x77, 0xbc, 0xf6, 0xb9, 0x6a, 0x5e, 0x8a, 0xa6, 0x08, 0xf1, 0x4c, 0x73, 0x59, 0x9c, + 0xc4, 0xf2, 0x98, 0x77, 0x67, 0xd2, 0xc1, 0xb5, 0xfa, 0x32, 0x9f, 0x80, 0x67, 0x6e, 0x79, 0x0e, + 0x7c, 0x71, 0xf9, 0x67, 0xff, 0xf9, 0x72, 0xe1, 0x67, 0x3f, 0xbf, 0x5c, 0xf8, 0xf7, 0x3f, 0xbf, + 0x5c, 0xf8, 0x4f, 0x3f, 0xbf, 0x5c, 0xf8, 0x72, 0xe1, 0x74, 0xa1, 0x91, 0xeb, 0x4d, 0x97, 0x7a, + 0xd1, 0x2d, 0xce, 0x6e, 0x10, 0xff, 0xbb, 0xfb, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xd9, 0xa5, + 0x39, 0x61, 0x70, 0xe7, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -28389,6 +28400,15 @@ func (m *Features) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.CloudAnonymizationKey) > 0 { + i -= len(m.CloudAnonymizationKey) + copy(dAtA[i:], m.CloudAnonymizationKey) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.CloudAnonymizationKey))) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xaa + } if m.AccessMonitoringConfigured { i-- if m.AccessMonitoringConfigured { @@ -39501,6 +39521,10 @@ func (m *Features) Size() (n int) { if m.AccessMonitoringConfigured { n += 3 } + l = len(m.CloudAnonymizationKey) + if l > 0 { + n += 2 + l + sovAuthservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -48691,6 +48715,40 @@ func (m *Features) Unmarshal(dAtA []byte) error { } } m.AccessMonitoringConfigured = bool(v != 0) + case 37: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CloudAnonymizationKey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CloudAnonymizationKey = append(m.CloudAnonymizationKey[:0], dAtA[iNdEx:postIndex]...) + if m.CloudAnonymizationKey == nil { + m.CloudAnonymizationKey = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) diff --git a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go index f0670a6e95d1d..221db9bb19350 100644 --- a/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go +++ b/api/gen/proto/go/teleport/integration/v1/awsoidc_service.pb.go @@ -2338,6 +2338,13 @@ type EKSCluster struct { // Known values are: // CREATING | ACTIVE | DELETING | FAILED | UPDATING | PENDING Status string `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` + // EndpointPublicAccess indicates whether this EKS Cluster is accessible publicly. + // If only private access is available, then the EKS Cluster can't be enrolled from Teleport Cloud. + EndpointPublicAccess bool `protobuf:"varint,7,opt,name=endpoint_public_access,json=endpointPublicAccess,proto3" json:"endpoint_public_access,omitempty"` + // AuthenticationMode is the allowed authentication mode for the cluster. + // Known values are: + // API | API_AND_CONFIG_MAP | CONFIG_MAP + AuthenticationMode string `protobuf:"bytes,8,opt,name=authentication_mode,json=authenticationMode,proto3" json:"authentication_mode,omitempty"` } func (x *EKSCluster) Reset() { @@ -2414,6 +2421,20 @@ func (x *EKSCluster) GetStatus() string { return "" } +func (x *EKSCluster) GetEndpointPublicAccess() bool { + if x != nil { + return x.EndpointPublicAccess + } + return false +} + +func (x *EKSCluster) GetAuthenticationMode() string { + if x != nil { + return x.AuthenticationMode + } + return "" +} + // ListEKSClustersResponse contains a page of AWS EKS Clusters. type ListEKSClustersResponse struct { state protoimpl.MessageState @@ -2905,7 +2926,7 @@ var file_teleport_integration_v1_awsoidc_service_proto_rawDesc = []byte{ 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xfb, 0x02, 0x0a, 0x0a, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x6b, 0x65, 0x6e, 0x22, 0xe2, 0x03, 0x0a, 0x0a, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x10, @@ -2921,122 +2942,128 @@ var file_teleport_integration_v1_awsoidc_service_proto_rawDesc = []byte{ 0x74, 0x65, 0x72, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6a, 0x6f, 0x69, 0x6e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4a, 0x6f, 0x69, 0x6e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x79, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1d, 0x0a, - 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x4a, 0x0a, 0x0b, - 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, - 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x72, 0x6e, 0x22, 0x58, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x72, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x64, 0x32, 0xb0, 0x0a, 0x0a, 0x0e, 0x41, 0x57, 0x53, 0x4f, 0x49, 0x44, 0x43, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x49, 0x43, - 0x45, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x45, 0x49, 0x43, 0x45, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, + 0x13, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, + 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x1a, 0x39, + 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4a, 0x6f, 0x69, + 0x6e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x65, 0x78, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0x4a, 0x0a, 0x0b, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x65, 0x41, 0x72, 0x6e, 0x22, + 0x58, 0x0a, 0x0c, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x61, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x72, 0x6e, + 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x32, 0xb0, 0x0a, 0x0a, 0x0e, 0x41, 0x57, + 0x53, 0x4f, 0x49, 0x44, 0x43, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x08, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x49, 0x43, 0x45, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x49, 0x43, 0x45, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x45, 0x49, 0x43, 0x45, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, + 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x49, 0x43, 0x45, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x49, 0x43, 0x45, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x65, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x45, 0x49, 0x43, 0x45, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x49, 0x43, 0x45, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x45, 0x49, 0x43, 0x45, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, - 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x2d, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, - 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x73, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x49, 0x43, 0x45, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x0b, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x50, - 0x43, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, + 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x49, 0x43, 0x45, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, + 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x50, 0x43, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x50, 0x43, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x74, 0x53, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, + 0x08, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x50, 0x43, 0x73, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x50, 0x43, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x56, 0x50, 0x43, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x86, + 0x01, 0x0a, 0x15, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x7a, 0x0a, 0x11, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x07, - 0x4c, 0x69, 0x73, 0x74, 0x45, 0x43, 0x32, 0x12, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x43, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, - 0x43, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x0f, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x4b, 0x53, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x4b, 0x53, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x53, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, + 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x11, 0x45, 0x6e, 0x72, 0x6f, 0x6c, + 0x6c, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x31, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x45, 0x4b, 0x53, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, + 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x07, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x43, 0x32, 0x12, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5a, 0x5a, 0x58, 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, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x76, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x43, 0x32, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x43, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x74, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x2f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x45, 0x4b, 0x53, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, + 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x5a, 0x5a, 0x58, + 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, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/proto/teleport/integration/v1/awsoidc_service.proto b/api/proto/teleport/integration/v1/awsoidc_service.proto index 699b6721d86ab..69564d0c4d663 100644 --- a/api/proto/teleport/integration/v1/awsoidc_service.proto +++ b/api/proto/teleport/integration/v1/awsoidc_service.proto @@ -515,6 +515,13 @@ message EKSCluster { // Known values are: // CREATING | ACTIVE | DELETING | FAILED | UPDATING | PENDING string status = 6; + // EndpointPublicAccess indicates whether this EKS Cluster is accessible publicly. + // If only private access is available, then the EKS Cluster can't be enrolled from Teleport Cloud. + bool endpoint_public_access = 7; + // AuthenticationMode is the allowed authentication mode for the cluster. + // Known values are: + // API | API_AND_CONFIG_MAP | CONFIG_MAP + string authentication_mode = 8; } // ListEKSClustersResponse contains a page of AWS EKS Clusters. diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index bfafb1e8f7ff6..7c80b7f99c797 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -561,6 +561,8 @@ message Features { // NOTE: this flag is used to signal that Access Monitoring is *enabled* on a cluster. // *Access* to the feature is gated on the `AccessMonitoring` entitlement. bool AccessMonitoringConfigured = 36; + // CloudAnonymizationKey is a hash of the Salesforce ID used to anonymize usage events + bytes CloudAnonymizationKey = 37 [(gogoproto.jsontag) = "cloud_anonymization_key,omitempty"]; } // EntitlementInfo is the state and limits of a particular entitlement diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 54d3c95a30509..d463f16cac41b 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -2658,6 +2658,14 @@ message AccessCapabilitiesRequest { bool FilterRequestableRolesByResource = 6 [(gogoproto.jsontag) = "filter_requestable_roles_by_resource,omitempty"]; } +// RequestKubernetesResource is the Kubernetes resource identifier used +// in access request settings. +// Modeled after existing message KubernetesResource. +message RequestKubernetesResource { + // kind specifies the Kubernetes Resource type. + string kind = 1 [(gogoproto.jsontag) = "kind,omitempty"]; +} + // ResourceID is a unique identifier for a teleport resource. message ResourceID { // ClusterName is the name of the cluster the resource is in. @@ -3386,6 +3394,15 @@ message AccessRequestConditions { (gogoproto.jsontag) = "max_duration,omitempty", (gogoproto.casttype) = "Duration" ]; + + // kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. + // Eg: Users can make request to either a resource kind "kube_cluster" or any of its + // subresources like "namespaces". This field can be defined such that it prevents a user + // from requesting "kube_cluster" and enforce requesting any of its subresources. + repeated RequestKubernetesResource kubernetes_resources = 8 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "kubernetes_resources,omitempty" + ]; } // AccessReviewConditions is a matcher for allow/deny restrictions on @@ -6226,6 +6243,11 @@ message PluginEntraIDSyncSettings { // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. // For existing plugins, it is filled in using the Entra integration when utilized. string tenant_id = 4; + + // entra_app_id refers to the Entra Application ID that supports the SSO for "sso_connector_id". + // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. + // For existing plugins, it is filled in using the entity descriptor url when utilized. + string entra_app_id = 5; } // EntraIDCredentialsSource defines the credentials source for Entra ID. @@ -7382,6 +7404,12 @@ message OktaOptions { message AccessGraphSync { // AWS is a configuration for AWS Access Graph service poll service. repeated AccessGraphAWSSync AWS = 1 [(gogoproto.jsontag) = "aws,omitempty"]; + // PollInterval is the frequency at which to poll for AWS resources + google.protobuf.Duration PollInterval = 2 [ + (gogoproto.jsontag) = "poll_interval,omitempty", + (gogoproto.nullable) = false, + (gogoproto.stdduration) = true + ]; } // AccessGraphAWSSync is a configuration for AWS Access Graph service poll service. diff --git a/api/types/discoveryconfig/derived.gen.go b/api/types/discoveryconfig/derived.gen.go index f92f2f40ba9c9..9053fdd312473 100644 --- a/api/types/discoveryconfig/derived.gen.go +++ b/api/types/discoveryconfig/derived.gen.go @@ -116,7 +116,8 @@ func deriveTeleportEqual_5(this, that []types.KubernetesMatcher) bool { func deriveTeleportEqual_6(this, that *types.AccessGraphSync) bool { return (this == nil && that == nil) || this != nil && that != nil && - deriveTeleportEqual_12(this.AWS, that.AWS) + deriveTeleportEqual_12(this.AWS, that.AWS) && + this.PollInterval == that.PollInterval } // deriveTeleportEqual_7 returns whether this and that are equal. diff --git a/api/types/role.go b/api/types/role.go index 0edc928305473..77875bfe4a9b3 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -89,6 +89,9 @@ type Role interface { // SetNamespaces sets a list of namespaces this role is allowed or denied access to. SetNamespaces(RoleConditionType, []string) + // GetRoleConditions gets the RoleConditions for the RoleConditionType. + GetRoleConditions(rct RoleConditionType) RoleConditions + // GetLabelMatchers gets the LabelMatchers that match labels of resources of // type [kind] this role is allowed or denied access to. GetLabelMatchers(rct RoleConditionType, kind string) (LabelMatchers, error) @@ -139,6 +142,9 @@ type Role interface { // SetKubeResources configures the Kubernetes Resources for the RoleConditionType. SetKubeResources(rct RoleConditionType, pods []KubernetesResource) + // SetRequestKubernetesResources sets the request kubernetes resources. + SetRequestKubernetesResources(rct RoleConditionType, resources []RequestKubernetesResource) + // GetAccessRequestConditions gets allow/deny conditions for access requests. GetAccessRequestConditions(RoleConditionType) AccessRequestConditions // SetAccessRequestConditions sets allow/deny conditions for access requests. @@ -489,6 +495,18 @@ func (r *RoleV6) SetKubeResources(rct RoleConditionType, pods []KubernetesResour } } +// SetRequestKubernetesResources sets the request kubernetes resources. +func (r *RoleV6) SetRequestKubernetesResources(rct RoleConditionType, resources []RequestKubernetesResource) { + roleConditions := &r.Spec.Allow + if rct == Deny { + roleConditions = &r.Spec.Deny + } + if roleConditions.Request == nil { + roleConditions.Request = &AccessRequestConditions{} + } + roleConditions.Request.KubernetesResources = resources +} + // GetKubeUsers returns kubernetes users func (r *RoleV6) GetKubeUsers(rct RoleConditionType) []string { if rct == Allow { @@ -1130,6 +1148,18 @@ func (r *RoleV6) CheckAndSetDefaults() error { r.Spec.Deny.Namespaces = []string{defaults.Namespace} } + // Validate request.kubernetes_resources fields are all valid. + if r.Spec.Allow.Request != nil { + if err := validateRequestKubeResources(r.Version, r.Spec.Allow.Request.KubernetesResources); err != nil { + return trace.Wrap(err) + } + } + if r.Spec.Deny.Request != nil { + if err := validateRequestKubeResources(r.Version, r.Spec.Deny.Request.KubernetesResources); err != nil { + return trace.Wrap(err) + } + } + // Validate that enhanced recording options are all valid. for _, opt := range r.Spec.Options.BPF { if opt == constants.EnhancedRecordingCommand || @@ -1693,6 +1723,16 @@ func (r *RoleV6) GetPreviewAsRoles(rct RoleConditionType) []string { return roleConditions.ReviewRequests.PreviewAsRoles } +// GetRoleConditions returns the role conditions for the role. +func (r *RoleV6) GetRoleConditions(rct RoleConditionType) RoleConditions { + roleConditions := r.Spec.Allow + if rct == Deny { + roleConditions = r.Spec.Deny + } + + return roleConditions +} + // SetPreviewAsRoles sets the list of extra roles which should apply to a // reviewer while they are viewing a Resource Access Request for the // purposes of viewing details such as the hostname and labels of requested @@ -1776,6 +1816,31 @@ func validateKubeResources(roleVersion string, kubeResources []KubernetesResourc return nil } +// validateRequestKubeResources validates each kubeResources entry for `allow.request.kubernetes_resources` field. +// Currently the only supported field for this particular field is: +// - Kind (belonging to KubernetesResourcesKinds) +// +// Mimics types.KubernetesResource data model, but opted to create own type as we don't support other fields yet. +func validateRequestKubeResources(roleVersion string, kubeResources []RequestKubernetesResource) error { + for _, kubeResource := range kubeResources { + if !slices.Contains(KubernetesResourcesKinds, kubeResource.Kind) && kubeResource.Kind != Wildcard { + return trace.BadParameter("request.kubernetes_resource kind %q is invalid or unsupported; Supported: %v", kubeResource.Kind, append([]string{Wildcard}, KubernetesResourcesKinds...)) + } + + // Only Pod resources are supported in role version <=V6. + // This is mandatory because we must append the other resources to the + // kubernetes resources. + switch roleVersion { + // Teleport does not support role versions < v3. + case V6, V5, V4, V3: + if kubeResource.Kind != KindKubePod { + return trace.BadParameter("request.kubernetes_resources kind %q is not supported in role version %q. Upgrade the role version to %q", kubeResource.Kind, roleVersion, V7) + } + } + } + return nil +} + // ClusterResource returns the resource name in the following format // /. func (k *KubernetesResource) ClusterResource() string { diff --git a/api/types/role_test.go b/api/types/role_test.go index 3cf330ed7c834..09ac7c2072951 100644 --- a/api/types/role_test.go +++ b/api/types/role_test.go @@ -348,6 +348,212 @@ func TestRole_GetKubeResources(t *testing.T) { } } +func TestRole_AllowRequestKubernetesResource(t *testing.T) { + type args struct { + version string + resources []RequestKubernetesResource + } + tests := []struct { + name string + args args + want []RequestKubernetesResource + assertErrorCreation require.ErrorAssertionFunc + }{ + { + name: "valid single value", + args: args{ + version: V7, + resources: []RequestKubernetesResource{ + { + Kind: KindKubePod, + }, + }, + }, + assertErrorCreation: require.NoError, + want: []RequestKubernetesResource{ + { + Kind: KindKubePod, + }, + }, + }, + { + name: "valid no values", + args: args{ + version: V7, + }, + assertErrorCreation: require.NoError, + }, + { + name: "valid wildcard value", + args: args{ + version: V7, + resources: []RequestKubernetesResource{ + { + Kind: Wildcard, + }, + }, + }, + assertErrorCreation: require.NoError, + want: []RequestKubernetesResource{ + { + Kind: Wildcard, + }, + }, + }, + { + name: "valid multi values", + args: args{ + version: V7, + resources: []RequestKubernetesResource{ + { + Kind: KindKubeNamespace, + }, + { + Kind: KindKubePod, + }, + { + Kind: KindKubeSecret, + }, + }, + }, + assertErrorCreation: require.NoError, + want: []RequestKubernetesResource{ + { + Kind: KindKubeNamespace, + }, + { + Kind: KindKubePod, + }, + { + Kind: KindKubeSecret, + }, + }, + }, + { + name: "valid multi values with wildcard", + args: args{ + version: V7, + resources: []RequestKubernetesResource{ + { + Kind: KindKubeNamespace, + }, + { + Kind: Wildcard, + }, + }, + }, + assertErrorCreation: require.NoError, + want: []RequestKubernetesResource{ + { + Kind: KindKubeNamespace, + }, + { + Kind: Wildcard, + }, + }, + }, + { + name: "invalid kind (kube_cluster is not part of Kubernetes subresources)", + args: args{ + version: V7, + resources: []RequestKubernetesResource{ + { + Kind: KindKubernetesCluster, + }, + }, + }, + assertErrorCreation: require.Error, + }, + { + name: "invalid multi value", + args: args{ + version: V7, + resources: []RequestKubernetesResource{ + { + Kind: Wildcard, + }, + { + Kind: KindKubeNamespace, + }, + { + Kind: KindKubernetesCluster, + }, + }, + }, + assertErrorCreation: require.Error, + }, + { + name: "invalid kinds not supported for v6", + args: args{ + version: V6, + resources: []RequestKubernetesResource{ + { + Kind: Wildcard, + }, + }, + }, + assertErrorCreation: require.Error, + }, + { + name: "invalid kinds not supported for v5", + args: args{ + version: V6, + resources: []RequestKubernetesResource{ + { + Kind: Wildcard, + }, + }, + }, + assertErrorCreation: require.Error, + }, + { + name: "invalid kinds not supported for v4", + args: args{ + version: V6, + resources: []RequestKubernetesResource{ + { + Kind: Wildcard, + }, + }, + }, + assertErrorCreation: require.Error, + }, + { + name: "invalid kinds not supported for v3", + args: args{ + version: V6, + resources: []RequestKubernetesResource{ + { + Kind: Wildcard, + }, + }, + }, + assertErrorCreation: require.Error, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + r, err := NewRoleWithVersion( + "test", + tt.args.version, + RoleSpecV6{ + Allow: RoleConditions{ + Request: &AccessRequestConditions{ + KubernetesResources: tt.args.resources, + }, + }, + }, + ) + tt.assertErrorCreation(t, err) + if err != nil { + return + } + got := r.GetRoleConditions(Allow).Request.KubernetesResources + require.Equal(t, tt.want, got) + }) + } +} + func appendV7KubeResources() []KubernetesResource { resources := []KubernetesResource{} // append other kubernetes resources diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 5ae6b27827f52..6d23d08037994 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1040,7 +1040,7 @@ func (x ConnectionDiagnosticTrace_TraceType) String() string { } func (ConnectionDiagnosticTrace_TraceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245, 0} + return fileDescriptor_9198ee693835762e, []int{246, 0} } // StatusType describes whether this was a success or a failure. @@ -1069,7 +1069,7 @@ func (x ConnectionDiagnosticTrace_StatusType) String() string { } func (ConnectionDiagnosticTrace_StatusType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245, 1} + return fileDescriptor_9198ee693835762e, []int{246, 1} } // OktaAssignmentStatus represents the status of an Okta assignment. @@ -1109,7 +1109,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317, 0} + return fileDescriptor_9198ee693835762e, []int{318, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1141,7 +1141,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318, 0} + return fileDescriptor_9198ee693835762e, []int{319, 0} } type KeepAlive struct { @@ -7307,6 +7307,50 @@ func (m *AccessCapabilitiesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_AccessCapabilitiesRequest proto.InternalMessageInfo +// RequestKubernetesResource is the Kubernetes resource identifier used +// in access request settings. +// Modeled after existing message KubernetesResource. +type RequestKubernetesResource struct { + // kind specifies the Kubernetes Resource type. + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RequestKubernetesResource) Reset() { *m = RequestKubernetesResource{} } +func (m *RequestKubernetesResource) String() string { return proto.CompactTextString(m) } +func (*RequestKubernetesResource) ProtoMessage() {} +func (*RequestKubernetesResource) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{107} +} +func (m *RequestKubernetesResource) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RequestKubernetesResource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RequestKubernetesResource.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RequestKubernetesResource) XXX_Merge(src proto.Message) { + xxx_messageInfo_RequestKubernetesResource.Merge(m, src) +} +func (m *RequestKubernetesResource) XXX_Size() int { + return m.Size() +} +func (m *RequestKubernetesResource) XXX_DiscardUnknown() { + xxx_messageInfo_RequestKubernetesResource.DiscardUnknown(m) +} + +var xxx_messageInfo_RequestKubernetesResource proto.InternalMessageInfo + // ResourceID is a unique identifier for a teleport resource. type ResourceID struct { // ClusterName is the name of the cluster the resource is in. @@ -7330,7 +7374,7 @@ func (m *ResourceID) Reset() { *m = ResourceID{} } func (m *ResourceID) String() string { return proto.CompactTextString(m) } func (*ResourceID) ProtoMessage() {} func (*ResourceID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{107} + return fileDescriptor_9198ee693835762e, []int{108} } func (m *ResourceID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7379,7 +7423,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{108} + return fileDescriptor_9198ee693835762e, []int{109} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7422,7 +7466,7 @@ func (m *PluginDataEntry) Reset() { *m = PluginDataEntry{} } func (m *PluginDataEntry) String() string { return proto.CompactTextString(m) } func (*PluginDataEntry) ProtoMessage() {} func (*PluginDataEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{109} + return fileDescriptor_9198ee693835762e, []int{110} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7464,7 +7508,7 @@ func (m *PluginDataSpecV3) Reset() { *m = PluginDataSpecV3{} } func (m *PluginDataSpecV3) String() string { return proto.CompactTextString(m) } func (*PluginDataSpecV3) ProtoMessage() {} func (*PluginDataSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{110} + return fileDescriptor_9198ee693835762e, []int{111} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7511,7 +7555,7 @@ func (m *PluginDataFilter) Reset() { *m = PluginDataFilter{} } func (m *PluginDataFilter) String() string { return proto.CompactTextString(m) } func (*PluginDataFilter) ProtoMessage() {} func (*PluginDataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{111} + return fileDescriptor_9198ee693835762e, []int{112} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7562,7 +7606,7 @@ func (m *PluginDataUpdateParams) Reset() { *m = PluginDataUpdateParams{} func (m *PluginDataUpdateParams) String() string { return proto.CompactTextString(m) } func (*PluginDataUpdateParams) ProtoMessage() {} func (*PluginDataUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{112} + return fileDescriptor_9198ee693835762e, []int{113} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7606,7 +7650,7 @@ func (m *RoleFilter) Reset() { *m = RoleFilter{} } func (m *RoleFilter) String() string { return proto.CompactTextString(m) } func (*RoleFilter) ProtoMessage() {} func (*RoleFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{113} + return fileDescriptor_9198ee693835762e, []int{114} } func (m *RoleFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7656,7 +7700,7 @@ type RoleV6 struct { func (m *RoleV6) Reset() { *m = RoleV6{} } func (*RoleV6) ProtoMessage() {} func (*RoleV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{114} + return fileDescriptor_9198ee693835762e, []int{115} } func (m *RoleV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7703,7 +7747,7 @@ func (m *RoleSpecV6) Reset() { *m = RoleSpecV6{} } func (m *RoleSpecV6) String() string { return proto.CompactTextString(m) } func (*RoleSpecV6) ProtoMessage() {} func (*RoleSpecV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{115} + return fileDescriptor_9198ee693835762e, []int{116} } func (m *RoleSpecV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7836,7 +7880,7 @@ func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{116} + return fileDescriptor_9198ee693835762e, []int{117} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7882,7 +7926,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{117} + return fileDescriptor_9198ee693835762e, []int{118} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7934,7 +7978,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{118} + return fileDescriptor_9198ee693835762e, []int{119} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8067,7 +8111,7 @@ func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{119} + return fileDescriptor_9198ee693835762e, []int{120} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8143,7 +8187,7 @@ func (m *SPIFFERoleCondition) Reset() { *m = SPIFFERoleCondition{} } func (m *SPIFFERoleCondition) String() string { return proto.CompactTextString(m) } func (*SPIFFERoleCondition) ProtoMessage() {} func (*SPIFFERoleCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{120} + return fileDescriptor_9198ee693835762e, []int{121} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8187,7 +8231,7 @@ func (m *DatabasePermission) Reset() { *m = DatabasePermission{} } func (m *DatabasePermission) String() string { return proto.CompactTextString(m) } func (*DatabasePermission) ProtoMessage() {} func (*DatabasePermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{121} + return fileDescriptor_9198ee693835762e, []int{122} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8238,7 +8282,7 @@ func (m *KubernetesResource) Reset() { *m = KubernetesResource{} } func (m *KubernetesResource) String() string { return proto.CompactTextString(m) } func (*KubernetesResource) ProtoMessage() {} func (*KubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{122} + return fileDescriptor_9198ee693835762e, []int{123} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8291,7 +8335,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{123} + return fileDescriptor_9198ee693835762e, []int{124} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8339,7 +8383,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{124} + return fileDescriptor_9198ee693835762e, []int{125} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8398,17 +8442,22 @@ type AccessRequestConditions struct { SearchAsRoles []string `protobuf:"bytes,6,rep,name=SearchAsRoles,proto3" json:"search_as_roles,omitempty"` // MaxDuration is the amount of time the access will be granted for. // If this is zero, the default duration is used. - MaxDuration Duration `protobuf:"varint,7,opt,name=MaxDuration,proto3,casttype=Duration" json:"max_duration,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + MaxDuration Duration `protobuf:"varint,7,opt,name=MaxDuration,proto3,casttype=Duration" json:"max_duration,omitempty"` + // kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. + // Eg: Users can make request to either a resource kind "kube_cluster" or any of its + // subresources like "namespaces". This field can be defined such that it prevents a user + // from requesting "kube_cluster" and enforce requesting any of its subresources. + KubernetesResources []RequestKubernetesResource `protobuf:"bytes,8,rep,name=kubernetes_resources,json=kubernetesResources,proto3" json:"kubernetes_resources,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions{} } func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{125} + return fileDescriptor_9198ee693835762e, []int{126} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8461,7 +8510,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{126} + return fileDescriptor_9198ee693835762e, []int{127} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8503,7 +8552,7 @@ func (m *AccessRequestAllowedPromotion) Reset() { *m = AccessRequestAllo func (m *AccessRequestAllowedPromotion) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotion) ProtoMessage() {} func (*AccessRequestAllowedPromotion) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{127} + return fileDescriptor_9198ee693835762e, []int{128} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8546,7 +8595,7 @@ func (m *AccessRequestAllowedPromotions) Reset() { *m = AccessRequestAll func (m *AccessRequestAllowedPromotions) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotions) ProtoMessage() {} func (*AccessRequestAllowedPromotions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{128} + return fileDescriptor_9198ee693835762e, []int{129} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8592,7 +8641,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{129} + return fileDescriptor_9198ee693835762e, []int{130} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8638,7 +8687,7 @@ func (m *TraitMapping) Reset() { *m = TraitMapping{} } func (m *TraitMapping) String() string { return proto.CompactTextString(m) } func (*TraitMapping) ProtoMessage() {} func (*TraitMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{130} + return fileDescriptor_9198ee693835762e, []int{131} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8687,7 +8736,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{131} + return fileDescriptor_9198ee693835762e, []int{132} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8735,7 +8784,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{132} + return fileDescriptor_9198ee693835762e, []int{133} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8777,7 +8826,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{133} + return fileDescriptor_9198ee693835762e, []int{134} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8819,7 +8868,7 @@ func (m *UserFilter) Reset() { *m = UserFilter{} } func (m *UserFilter) String() string { return proto.CompactTextString(m) } func (*UserFilter) ProtoMessage() {} func (*UserFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{134} + return fileDescriptor_9198ee693835762e, []int{135} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8870,7 +8919,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{135} + return fileDescriptor_9198ee693835762e, []int{136} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8919,7 +8968,7 @@ func (m *UserStatusV2) Reset() { *m = UserStatusV2{} } func (m *UserStatusV2) String() string { return proto.CompactTextString(m) } func (*UserStatusV2) ProtoMessage() {} func (*UserStatusV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{136} + return fileDescriptor_9198ee693835762e, []int{137} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8993,7 +9042,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{137} + return fileDescriptor_9198ee693835762e, []int{138} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9040,7 +9089,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{138} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9088,7 +9137,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{139} + return fileDescriptor_9198ee693835762e, []int{140} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9133,7 +9182,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{140} + return fileDescriptor_9198ee693835762e, []int{141} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9182,7 +9231,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{141} + return fileDescriptor_9198ee693835762e, []int{142} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9238,7 +9287,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{142} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9336,7 +9385,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{143} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9382,7 +9431,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{144} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9456,7 +9505,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{145} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9499,7 +9548,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{146} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9545,7 +9594,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{147} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9587,7 +9636,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{148} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9637,7 +9686,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{149} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9684,7 +9733,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{150} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9733,7 +9782,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{151} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9781,7 +9830,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{152} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9829,7 +9878,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{153} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9880,7 +9929,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{154} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9928,7 +9977,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{155} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9974,7 +10023,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{156} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10023,7 +10072,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{157} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10065,7 +10114,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{158} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10114,7 +10163,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{159} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10195,7 +10244,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{160} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10240,7 +10289,7 @@ func (m *DeviceWebToken) Reset() { *m = DeviceWebToken{} } func (m *DeviceWebToken) String() string { return proto.CompactTextString(m) } func (*DeviceWebToken) ProtoMessage() {} func (*DeviceWebToken) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{161} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10282,7 +10331,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{162} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10353,7 +10402,7 @@ func (m *SAMLSessionData) Reset() { *m = SAMLSessionData{} } func (m *SAMLSessionData) String() string { return proto.CompactTextString(m) } func (*SAMLSessionData) ProtoMessage() {} func (*SAMLSessionData) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10402,7 +10451,7 @@ func (m *SAMLAttribute) Reset() { *m = SAMLAttribute{} } func (m *SAMLAttribute) String() string { return proto.CompactTextString(m) } func (*SAMLAttribute) ProtoMessage() {} func (*SAMLAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{164} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10449,7 +10498,7 @@ func (m *SAMLAttributeValue) Reset() { *m = SAMLAttributeValue{} } func (m *SAMLAttributeValue) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeValue) ProtoMessage() {} func (*SAMLAttributeValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{165} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10500,7 +10549,7 @@ func (m *SAMLNameID) Reset() { *m = SAMLNameID{} } func (m *SAMLNameID) String() string { return proto.CompactTextString(m) } func (*SAMLNameID) ProtoMessage() {} func (*SAMLNameID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{166} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10549,7 +10598,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{167} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10593,7 +10642,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{168} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10643,7 +10692,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{169} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10692,7 +10741,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{170} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10743,7 +10792,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{171} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10791,7 +10840,7 @@ func (m *KubeAzure) Reset() { *m = KubeAzure{} } func (m *KubeAzure) String() string { return proto.CompactTextString(m) } func (*KubeAzure) ProtoMessage() {} func (*KubeAzure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{172} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10837,7 +10886,7 @@ func (m *KubeAWS) Reset() { *m = KubeAWS{} } func (m *KubeAWS) String() string { return proto.CompactTextString(m) } func (*KubeAWS) ProtoMessage() {} func (*KubeAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{173} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10883,7 +10932,7 @@ func (m *KubeGCP) Reset() { *m = KubeGCP{} } func (m *KubeGCP) String() string { return proto.CompactTextString(m) } func (*KubeGCP) ProtoMessage() {} func (*KubeGCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{174} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10925,7 +10974,7 @@ func (m *KubernetesClusterV3List) Reset() { *m = KubernetesClusterV3List func (m *KubernetesClusterV3List) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterV3List) ProtoMessage() {} func (*KubernetesClusterV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{175} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10974,7 +11023,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{176} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11026,7 +11075,7 @@ func (m *KubernetesServerSpecV3) Reset() { *m = KubernetesServerSpecV3{} func (m *KubernetesServerSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesServerSpecV3) ProtoMessage() {} func (*KubernetesServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{177} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11078,7 +11127,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{178} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11122,7 +11171,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{179} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11166,7 +11215,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{180} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11210,7 +11259,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{181} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11254,7 +11303,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{182} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11298,7 +11347,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{183} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11340,7 +11389,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{184} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11384,7 +11433,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{185} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11426,7 +11475,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{186} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11470,7 +11519,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{187} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11512,7 +11561,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{188} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11563,7 +11612,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{189} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11605,7 +11654,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{190} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11691,7 +11740,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{191} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11733,7 +11782,7 @@ func (m *MaxAge) Reset() { *m = MaxAge{} } func (m *MaxAge) String() string { return proto.CompactTextString(m) } func (*MaxAge) ProtoMessage() {} func (*MaxAge) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{192} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11778,7 +11827,7 @@ func (m *SSOClientRedirectSettings) Reset() { *m = SSOClientRedirectSett func (m *SSOClientRedirectSettings) String() string { return proto.CompactTextString(m) } func (*SSOClientRedirectSettings) ProtoMessage() {} func (*SSOClientRedirectSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{193} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11867,7 +11916,7 @@ func (m *OIDCAuthRequest) Reset() { *m = OIDCAuthRequest{} } func (m *OIDCAuthRequest) String() string { return proto.CompactTextString(m) } func (*OIDCAuthRequest) ProtoMessage() {} func (*OIDCAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{194} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11918,7 +11967,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{195} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11960,7 +12009,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{196} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12037,7 +12086,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{197} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12119,7 +12168,7 @@ func (m *SAMLAuthRequest) Reset() { *m = SAMLAuthRequest{} } func (m *SAMLAuthRequest) String() string { return proto.CompactTextString(m) } func (*SAMLAuthRequest) ProtoMessage() {} func (*SAMLAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{198} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12165,7 +12214,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{199} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12210,7 +12259,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{200} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12261,7 +12310,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{201} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12303,7 +12352,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{202} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12366,7 +12415,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{203} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12445,7 +12494,7 @@ func (m *GithubAuthRequest) Reset() { *m = GithubAuthRequest{} } func (m *GithubAuthRequest) String() string { return proto.CompactTextString(m) } func (*GithubAuthRequest) ProtoMessage() {} func (*GithubAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{204} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12489,7 +12538,7 @@ func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } func (*SSOWarnings) ProtoMessage() {} func (*SSOWarnings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{205} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12545,7 +12594,7 @@ func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } func (*CreateUserParams) ProtoMessage() {} func (*CreateUserParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{206} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12630,7 +12679,7 @@ func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{207} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12674,7 +12723,7 @@ func (m *GithubTokenInfo) Reset() { *m = GithubTokenInfo{} } func (m *GithubTokenInfo) String() string { return proto.CompactTextString(m) } func (*GithubTokenInfo) ProtoMessage() {} func (*GithubTokenInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{208} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12720,7 +12769,7 @@ func (m *GithubClaims) Reset() { *m = GithubClaims{} } func (m *GithubClaims) String() string { return proto.CompactTextString(m) } func (*GithubClaims) ProtoMessage() {} func (*GithubClaims) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{209} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12772,7 +12821,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{210} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12818,7 +12867,7 @@ func (m *TeamRolesMapping) Reset() { *m = TeamRolesMapping{} } func (m *TeamRolesMapping) String() string { return proto.CompactTextString(m) } func (*TeamRolesMapping) ProtoMessage() {} func (*TeamRolesMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{211} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12868,7 +12917,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{212} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12910,7 +12959,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{213} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12966,7 +13015,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{214} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13020,7 +13069,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{215} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13070,7 +13119,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{216} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13131,7 +13180,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{217} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13175,7 +13224,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{218} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13218,7 +13267,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{219} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13271,7 +13320,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{220} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13315,7 +13364,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{221} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13363,7 +13412,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{222} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13407,7 +13456,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{223} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13451,7 +13500,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{224} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13504,7 +13553,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{225} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13545,7 +13594,7 @@ func (m *Resolution) Reset() { *m = Resolution{} } func (m *Resolution) String() string { return proto.CompactTextString(m) } func (*Resolution) ProtoMessage() {} func (*Resolution) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{226} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13628,7 +13677,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{227} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13682,7 +13731,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{228} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13727,7 +13776,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{229} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13771,7 +13820,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{230} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13811,7 +13860,7 @@ func (m *NullableSessionState) Reset() { *m = NullableSessionState{} } func (m *NullableSessionState) String() string { return proto.CompactTextString(m) } func (*NullableSessionState) ProtoMessage() {} func (*NullableSessionState) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{231} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13857,7 +13906,7 @@ func (m *SessionTrackerFilter) Reset() { *m = SessionTrackerFilter{} } func (m *SessionTrackerFilter) String() string { return proto.CompactTextString(m) } func (*SessionTrackerFilter) ProtoMessage() {} func (*SessionTrackerFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{232} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13901,7 +13950,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{233} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13999,7 +14048,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{234} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14046,7 +14095,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{235} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14094,7 +14143,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{236} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14138,7 +14187,7 @@ func (m *UIConfigV1) Reset() { *m = UIConfigV1{} } func (m *UIConfigV1) String() string { return proto.CompactTextString(m) } func (*UIConfigV1) ProtoMessage() {} func (*UIConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{237} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14184,7 +14233,7 @@ func (m *UIConfigSpecV1) Reset() { *m = UIConfigSpecV1{} } func (m *UIConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*UIConfigSpecV1) ProtoMessage() {} func (*UIConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{238} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14235,7 +14284,7 @@ func (m *InstallerV1) Reset() { *m = InstallerV1{} } func (m *InstallerV1) String() string { return proto.CompactTextString(m) } func (*InstallerV1) ProtoMessage() {} func (*InstallerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{239} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14277,7 +14326,7 @@ func (m *InstallerSpecV1) Reset() { *m = InstallerSpecV1{} } func (m *InstallerSpecV1) String() string { return proto.CompactTextString(m) } func (*InstallerSpecV1) ProtoMessage() {} func (*InstallerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{240} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14319,7 +14368,7 @@ func (m *InstallerV1List) Reset() { *m = InstallerV1List{} } func (m *InstallerV1List) String() string { return proto.CompactTextString(m) } func (*InstallerV1List) ProtoMessage() {} func (*InstallerV1List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{241} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14363,7 +14412,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{242} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14409,7 +14458,7 @@ func (m *ConnectionDiagnosticV1) Reset() { *m = ConnectionDiagnosticV1{} func (m *ConnectionDiagnosticV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticV1) ProtoMessage() {} func (*ConnectionDiagnosticV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{243} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14459,7 +14508,7 @@ func (m *ConnectionDiagnosticSpecV1) Reset() { *m = ConnectionDiagnostic func (m *ConnectionDiagnosticSpecV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticSpecV1) ProtoMessage() {} func (*ConnectionDiagnosticSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{244} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14505,7 +14554,7 @@ func (m *ConnectionDiagnosticTrace) Reset() { *m = ConnectionDiagnosticT func (m *ConnectionDiagnosticTrace) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticTrace) ProtoMessage() {} func (*ConnectionDiagnosticTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14548,7 +14597,7 @@ func (m *DatabaseServiceV1) Reset() { *m = DatabaseServiceV1{} } func (m *DatabaseServiceV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceV1) ProtoMessage() {} func (*DatabaseServiceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{246} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14592,7 +14641,7 @@ func (m *DatabaseServiceSpecV1) Reset() { *m = DatabaseServiceSpecV1{} } func (m *DatabaseServiceSpecV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceSpecV1) ProtoMessage() {} func (*DatabaseServiceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{247} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14634,7 +14683,7 @@ func (m *DatabaseResourceMatcher) Reset() { *m = DatabaseResourceMatcher func (m *DatabaseResourceMatcher) String() string { return proto.CompactTextString(m) } func (*DatabaseResourceMatcher) ProtoMessage() {} func (*DatabaseResourceMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{248} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14678,7 +14727,7 @@ func (m *ResourceMatcherAWS) Reset() { *m = ResourceMatcherAWS{} } func (m *ResourceMatcherAWS) String() string { return proto.CompactTextString(m) } func (*ResourceMatcherAWS) ProtoMessage() {} func (*ResourceMatcherAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{249} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14720,7 +14769,7 @@ func (m *ClusterAlert) Reset() { *m = ClusterAlert{} } func (m *ClusterAlert) String() string { return proto.CompactTextString(m) } func (*ClusterAlert) ProtoMessage() {} func (*ClusterAlert) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14766,7 +14815,7 @@ func (m *ClusterAlertSpec) Reset() { *m = ClusterAlertSpec{} } func (m *ClusterAlertSpec) String() string { return proto.CompactTextString(m) } func (*ClusterAlertSpec) ProtoMessage() {} func (*ClusterAlertSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{251} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14819,7 +14868,7 @@ func (m *GetClusterAlertsRequest) Reset() { *m = GetClusterAlertsRequest func (m *GetClusterAlertsRequest) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsRequest) ProtoMessage() {} func (*GetClusterAlertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{252} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14869,7 +14918,7 @@ func (m *AlertAcknowledgement) Reset() { *m = AlertAcknowledgement{} } func (m *AlertAcknowledgement) String() string { return proto.CompactTextString(m) } func (*AlertAcknowledgement) ProtoMessage() {} func (*AlertAcknowledgement) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{253} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14921,7 +14970,7 @@ func (m *Release) Reset() { *m = Release{} } func (m *Release) String() string { return proto.CompactTextString(m) } func (*Release) ProtoMessage() {} func (*Release) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{254} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14979,7 +15028,7 @@ func (m *Asset) Reset() { *m = Asset{} } func (m *Asset) String() string { return proto.CompactTextString(m) } func (*Asset) ProtoMessage() {} func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{255} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15032,7 +15081,7 @@ func (m *PluginV1) Reset() { *m = PluginV1{} } func (m *PluginV1) String() string { return proto.CompactTextString(m) } func (*PluginV1) ProtoMessage() {} func (*PluginV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{256} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15096,7 +15145,7 @@ func (m *PluginSpecV1) Reset() { *m = PluginSpecV1{} } func (m *PluginSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginSpecV1) ProtoMessage() {} func (*PluginSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15326,7 +15375,7 @@ func (m *PluginSlackAccessSettings) Reset() { *m = PluginSlackAccessSett func (m *PluginSlackAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginSlackAccessSettings) ProtoMessage() {} func (*PluginSlackAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{258} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15367,7 +15416,7 @@ func (m *PluginGitlabSettings) Reset() { *m = PluginGitlabSettings{} } func (m *PluginGitlabSettings) String() string { return proto.CompactTextString(m) } func (*PluginGitlabSettings) ProtoMessage() {} func (*PluginGitlabSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{259} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15414,7 +15463,7 @@ func (m *PluginOpsgenieAccessSettings) Reset() { *m = PluginOpsgenieAcce func (m *PluginOpsgenieAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginOpsgenieAccessSettings) ProtoMessage() {} func (*PluginOpsgenieAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15462,7 +15511,7 @@ func (m *PluginServiceNowSettings) Reset() { *m = PluginServiceNowSettin func (m *PluginServiceNowSettings) String() string { return proto.CompactTextString(m) } func (*PluginServiceNowSettings) ProtoMessage() {} func (*PluginServiceNowSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{261} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15508,7 +15557,7 @@ func (m *PluginPagerDutySettings) Reset() { *m = PluginPagerDutySettings func (m *PluginPagerDutySettings) String() string { return proto.CompactTextString(m) } func (*PluginPagerDutySettings) ProtoMessage() {} func (*PluginPagerDutySettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15554,7 +15603,7 @@ func (m *PluginJiraSettings) Reset() { *m = PluginJiraSettings{} } func (m *PluginJiraSettings) String() string { return proto.CompactTextString(m) } func (*PluginJiraSettings) ProtoMessage() {} func (*PluginJiraSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{263} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15594,7 +15643,7 @@ func (m *PluginOpenAISettings) Reset() { *m = PluginOpenAISettings{} } func (m *PluginOpenAISettings) String() string { return proto.CompactTextString(m) } func (*PluginOpenAISettings) ProtoMessage() {} func (*PluginOpenAISettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{264} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15645,7 +15694,7 @@ func (m *PluginMattermostSettings) Reset() { *m = PluginMattermostSettin func (m *PluginMattermostSettings) String() string { return proto.CompactTextString(m) } func (*PluginMattermostSettings) ProtoMessage() {} func (*PluginMattermostSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{265} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15687,7 +15736,7 @@ func (m *PluginJamfSettings) Reset() { *m = PluginJamfSettings{} } func (m *PluginJamfSettings) String() string { return proto.CompactTextString(m) } func (*PluginJamfSettings) ProtoMessage() {} func (*PluginJamfSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{266} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15737,7 +15786,7 @@ func (m *PluginOktaSettings) Reset() { *m = PluginOktaSettings{} } func (m *PluginOktaSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSettings) ProtoMessage() {} func (*PluginOktaSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{267} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15817,7 +15866,7 @@ func (m *PluginOktaSyncSettings) Reset() { *m = PluginOktaSyncSettings{} func (m *PluginOktaSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSyncSettings) ProtoMessage() {} func (*PluginOktaSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{268} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15858,7 +15907,7 @@ func (m *DiscordChannels) Reset() { *m = DiscordChannels{} } func (m *DiscordChannels) String() string { return proto.CompactTextString(m) } func (*DiscordChannels) ProtoMessage() {} func (*DiscordChannels) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{269} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15902,7 +15951,7 @@ func (m *PluginDiscordSettings) Reset() { *m = PluginDiscordSettings{} } func (m *PluginDiscordSettings) String() string { return proto.CompactTextString(m) } func (*PluginDiscordSettings) ProtoMessage() {} func (*PluginDiscordSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{270} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15947,7 +15996,7 @@ func (m *PluginEntraIDSettings) Reset() { *m = PluginEntraIDSettings{} } func (m *PluginEntraIDSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSettings) ProtoMessage() {} func (*PluginEntraIDSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{271} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15987,7 +16036,11 @@ type PluginEntraIDSyncSettings struct { // tenant_id refers to the Azure Directory that this plugin synchronizes with. // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. // For existing plugins, it is filled in using the Entra integration when utilized. - TenantId string `protobuf:"bytes,4,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"` + TenantId string `protobuf:"bytes,4,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"` + // entra_app_id refers to the Entra Application ID that supports the SSO for "sso_connector_id". + // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. + // For existing plugins, it is filled in using the entity descriptor url when utilized. + EntraAppId string `protobuf:"bytes,5,opt,name=entra_app_id,json=entraAppId,proto3" json:"entra_app_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -15997,7 +16050,7 @@ func (m *PluginEntraIDSyncSettings) Reset() { *m = PluginEntraIDSyncSett func (m *PluginEntraIDSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSyncSettings) ProtoMessage() {} func (*PluginEntraIDSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16042,7 +16095,7 @@ func (m *PluginEntraIDAccessGraphSettings) Reset() { *m = PluginEntraIDA func (m *PluginEntraIDAccessGraphSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAccessGraphSettings) ProtoMessage() {} func (*PluginEntraIDAccessGraphSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{273} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16088,7 +16141,7 @@ func (m *PluginEntraIDAppSSOSettings) Reset() { *m = PluginEntraIDAppSSO func (m *PluginEntraIDAppSSOSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAppSSOSettings) ProtoMessage() {} func (*PluginEntraIDAppSSOSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{274} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16134,7 +16187,7 @@ func (m *PluginSCIMSettings) Reset() { *m = PluginSCIMSettings{} } func (m *PluginSCIMSettings) String() string { return proto.CompactTextString(m) } func (*PluginSCIMSettings) ProtoMessage() {} func (*PluginSCIMSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{275} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16178,7 +16231,7 @@ func (m *PluginDatadogAccessSettings) Reset() { *m = PluginDatadogAccess func (m *PluginDatadogAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginDatadogAccessSettings) ProtoMessage() {} func (*PluginDatadogAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{276} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16223,7 +16276,7 @@ func (m *PluginBootstrapCredentialsV1) Reset() { *m = PluginBootstrapCre func (m *PluginBootstrapCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginBootstrapCredentialsV1) ProtoMessage() {} func (*PluginBootstrapCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{277} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16323,7 +16376,7 @@ func (m *PluginIdSecretCredential) Reset() { *m = PluginIdSecretCredenti func (m *PluginIdSecretCredential) String() string { return proto.CompactTextString(m) } func (*PluginIdSecretCredential) ProtoMessage() {} func (*PluginIdSecretCredential) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{278} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16366,7 +16419,7 @@ func (m *PluginOAuth2AuthorizationCodeCredentials) Reset() { func (m *PluginOAuth2AuthorizationCodeCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AuthorizationCodeCredentials) ProtoMessage() {} func (*PluginOAuth2AuthorizationCodeCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{279} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16424,7 +16477,7 @@ func (m *PluginStatusV1) Reset() { *m = PluginStatusV1{} } func (m *PluginStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginStatusV1) ProtoMessage() {} func (*PluginStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{280} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16527,7 +16580,7 @@ func (m *PluginGitlabStatusV1) Reset() { *m = PluginGitlabStatusV1{} } func (m *PluginGitlabStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginGitlabStatusV1) ProtoMessage() {} func (*PluginGitlabStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{281} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16571,7 +16624,7 @@ func (m *PluginEntraIDStatusV1) Reset() { *m = PluginEntraIDStatusV1{} } func (m *PluginEntraIDStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDStatusV1) ProtoMessage() {} func (*PluginEntraIDStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{282} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16625,7 +16678,7 @@ func (m *PluginOktaStatusV1) Reset() { *m = PluginOktaStatusV1{} } func (m *PluginOktaStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusV1) ProtoMessage() {} func (*PluginOktaStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{283} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16673,7 +16726,7 @@ func (m *PluginOktaStatusDetailsSSO) Reset() { *m = PluginOktaStatusDeta func (m *PluginOktaStatusDetailsSSO) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSSO) ProtoMessage() {} func (*PluginOktaStatusDetailsSSO) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{284} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16730,7 +16783,7 @@ func (m *PluginOktaStatusDetailsAppGroupSync) Reset() { *m = PluginOktaS func (m *PluginOktaStatusDetailsAppGroupSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAppGroupSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAppGroupSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{285} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16784,7 +16837,7 @@ func (m *PluginOktaStatusDetailsUsersSync) Reset() { *m = PluginOktaStat func (m *PluginOktaStatusDetailsUsersSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsUsersSync) ProtoMessage() {} func (*PluginOktaStatusDetailsUsersSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{286} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16827,7 +16880,7 @@ func (m *PluginOktaStatusDetailsSCIM) Reset() { *m = PluginOktaStatusDet func (m *PluginOktaStatusDetailsSCIM) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSCIM) ProtoMessage() {} func (*PluginOktaStatusDetailsSCIM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{287} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16889,7 +16942,7 @@ func (m *PluginOktaStatusDetailsAccessListsSync) Reset() { func (m *PluginOktaStatusDetailsAccessListsSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAccessListsSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAccessListsSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{288} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16937,7 +16990,7 @@ func (m *PluginCredentialsV1) Reset() { *m = PluginCredentialsV1{} } func (m *PluginCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginCredentialsV1) ProtoMessage() {} func (*PluginCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{289} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17048,7 +17101,7 @@ func (m *PluginOAuth2AccessTokenCredentials) Reset() { *m = PluginOAuth2 func (m *PluginOAuth2AccessTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AccessTokenCredentials) ProtoMessage() {} func (*PluginOAuth2AccessTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{290} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17089,7 +17142,7 @@ func (m *PluginBearerTokenCredentials) Reset() { *m = PluginBearerTokenC func (m *PluginBearerTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginBearerTokenCredentials) ProtoMessage() {} func (*PluginBearerTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{291} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17131,7 +17184,7 @@ func (m *PluginStaticCredentialsRef) Reset() { *m = PluginStaticCredenti func (m *PluginStaticCredentialsRef) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsRef) ProtoMessage() {} func (*PluginStaticCredentialsRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{292} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17173,7 +17226,7 @@ func (m *PluginListV1) Reset() { *m = PluginListV1{} } func (m *PluginListV1) String() string { return proto.CompactTextString(m) } func (*PluginListV1) ProtoMessage() {} func (*PluginListV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{293} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17216,7 +17269,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{294} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17262,7 +17315,7 @@ func (m *PluginStaticCredentialsSpecV1) Reset() { *m = PluginStaticCrede func (m *PluginStaticCredentialsSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsSpecV1) ProtoMessage() {} func (*PluginStaticCredentialsSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{295} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17364,7 +17417,7 @@ func (m *PluginStaticCredentialsBasicAuth) Reset() { *m = PluginStaticCr func (m *PluginStaticCredentialsBasicAuth) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsBasicAuth) ProtoMessage() {} func (*PluginStaticCredentialsBasicAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{296} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17410,7 +17463,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Reset() { func (m *PluginStaticCredentialsOAuthClientSecret) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsOAuthClientSecret) ProtoMessage() {} func (*PluginStaticCredentialsOAuthClientSecret) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{297} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17453,7 +17506,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{298} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17512,7 +17565,7 @@ func (m *SAMLIdPServiceProviderSpecV1) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderSpecV1) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderSpecV1) ProtoMessage() {} func (*SAMLIdPServiceProviderSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{299} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17559,7 +17612,7 @@ func (m *SAMLAttributeMapping) Reset() { *m = SAMLAttributeMapping{} } func (m *SAMLAttributeMapping) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeMapping) ProtoMessage() {} func (*SAMLAttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{300} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17601,7 +17654,7 @@ func (m *IdPOptions) Reset() { *m = IdPOptions{} } func (m *IdPOptions) String() string { return proto.CompactTextString(m) } func (*IdPOptions) ProtoMessage() {} func (*IdPOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{301} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17643,7 +17696,7 @@ func (m *IdPSAMLOptions) Reset() { *m = IdPSAMLOptions{} } func (m *IdPSAMLOptions) String() string { return proto.CompactTextString(m) } func (*IdPSAMLOptions) ProtoMessage() {} func (*IdPSAMLOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{302} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17693,7 +17746,7 @@ func (m *KubernetesResourceV1) Reset() { *m = KubernetesResourceV1{} } func (m *KubernetesResourceV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceV1) ProtoMessage() {} func (*KubernetesResourceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{303} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17735,7 +17788,7 @@ func (m *KubernetesResourceSpecV1) Reset() { *m = KubernetesResourceSpec func (m *KubernetesResourceSpecV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceSpecV1) ProtoMessage() {} func (*KubernetesResourceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{304} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17781,7 +17834,7 @@ func (m *ClusterMaintenanceConfigV1) Reset() { *m = ClusterMaintenanceCo func (m *ClusterMaintenanceConfigV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigV1) ProtoMessage() {} func (*ClusterMaintenanceConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{305} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17823,7 +17876,7 @@ func (m *ClusterMaintenanceConfigSpecV1) Reset() { *m = ClusterMaintenan func (m *ClusterMaintenanceConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigSpecV1) ProtoMessage() {} func (*ClusterMaintenanceConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{306} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17869,7 +17922,7 @@ func (m *AgentUpgradeWindow) Reset() { *m = AgentUpgradeWindow{} } func (m *AgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeWindow) ProtoMessage() {} func (*AgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17916,7 +17969,7 @@ func (m *ScheduledAgentUpgradeWindow) Reset() { *m = ScheduledAgentUpgra func (m *ScheduledAgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*ScheduledAgentUpgradeWindow) ProtoMessage() {} func (*ScheduledAgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{308} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17959,7 +18012,7 @@ func (m *AgentUpgradeSchedule) Reset() { *m = AgentUpgradeSchedule{} } func (m *AgentUpgradeSchedule) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeSchedule) ProtoMessage() {} func (*AgentUpgradeSchedule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{309} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18002,7 +18055,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{310} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18044,7 +18097,7 @@ func (m *UserGroupSpecV1) Reset() { *m = UserGroupSpecV1{} } func (m *UserGroupSpecV1) String() string { return proto.CompactTextString(m) } func (*UserGroupSpecV1) ProtoMessage() {} func (*UserGroupSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18088,7 +18141,7 @@ func (m *OktaImportRuleSpecV1) Reset() { *m = OktaImportRuleSpecV1{} } func (m *OktaImportRuleSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleSpecV1) ProtoMessage() {} func (*OktaImportRuleSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{312} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18132,7 +18185,7 @@ func (m *OktaImportRuleMappingV1) Reset() { *m = OktaImportRuleMappingV1 func (m *OktaImportRuleMappingV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMappingV1) ProtoMessage() {} func (*OktaImportRuleMappingV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18175,7 +18228,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18223,7 +18276,7 @@ func (m *OktaImportRuleMatchV1) Reset() { *m = OktaImportRuleMatchV1{} } func (m *OktaImportRuleMatchV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMatchV1) ProtoMessage() {} func (*OktaImportRuleMatchV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18266,7 +18319,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{316} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18320,7 +18373,7 @@ func (m *OktaAssignmentSpecV1) Reset() { *m = OktaAssignmentSpecV1{} } func (m *OktaAssignmentSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentSpecV1) ProtoMessage() {} func (*OktaAssignmentSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18364,7 +18417,7 @@ func (m *OktaAssignmentTargetV1) Reset() { *m = OktaAssignmentTargetV1{} func (m *OktaAssignmentTargetV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentTargetV1) ProtoMessage() {} func (*OktaAssignmentTargetV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18409,7 +18462,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{319} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18454,7 +18507,7 @@ func (m *IntegrationSpecV1) Reset() { *m = IntegrationSpecV1{} } func (m *IntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*IntegrationSpecV1) ProtoMessage() {} func (*IntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{320} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18554,7 +18607,7 @@ func (m *AWSOIDCIntegrationSpecV1) Reset() { *m = AWSOIDCIntegrationSpec func (m *AWSOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AWSOIDCIntegrationSpecV1) ProtoMessage() {} func (*AWSOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{321} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18600,7 +18653,7 @@ func (m *AzureOIDCIntegrationSpecV1) Reset() { *m = AzureOIDCIntegration func (m *AzureOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AzureOIDCIntegrationSpecV1) ProtoMessage() {} func (*AzureOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{322} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18652,7 +18705,7 @@ func (m *HeadlessAuthentication) Reset() { *m = HeadlessAuthentication{} func (m *HeadlessAuthentication) String() string { return proto.CompactTextString(m) } func (*HeadlessAuthentication) ProtoMessage() {} func (*HeadlessAuthentication) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{323} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18709,7 +18762,7 @@ func (m *WatchKind) Reset() { *m = WatchKind{} } func (m *WatchKind) String() string { return proto.CompactTextString(m) } func (*WatchKind) ProtoMessage() {} func (*WatchKind) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{324} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18759,7 +18812,7 @@ func (m *WatchStatusV1) Reset() { *m = WatchStatusV1{} } func (m *WatchStatusV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusV1) ProtoMessage() {} func (*WatchStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{325} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18800,7 +18853,7 @@ func (m *WatchStatusSpecV1) Reset() { *m = WatchStatusSpecV1{} } func (m *WatchStatusSpecV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusSpecV1) ProtoMessage() {} func (*WatchStatusSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18850,7 +18903,7 @@ func (m *ServerInfoV1) Reset() { *m = ServerInfoV1{} } func (m *ServerInfoV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoV1) ProtoMessage() {} func (*ServerInfoV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{327} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18892,7 +18945,7 @@ func (m *ServerInfoSpecV1) Reset() { *m = ServerInfoSpecV1{} } func (m *ServerInfoSpecV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoSpecV1) ProtoMessage() {} func (*ServerInfoSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{328} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18969,7 +19022,7 @@ func (m *JamfSpecV1) Reset() { *m = JamfSpecV1{} } func (m *JamfSpecV1) String() string { return proto.CompactTextString(m) } func (*JamfSpecV1) ProtoMessage() {} func (*JamfSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{329} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19034,7 +19087,7 @@ func (m *JamfInventoryEntry) Reset() { *m = JamfInventoryEntry{} } func (m *JamfInventoryEntry) String() string { return proto.CompactTextString(m) } func (*JamfInventoryEntry) ProtoMessage() {} func (*JamfInventoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{330} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19091,7 +19144,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{331} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19155,7 +19208,7 @@ func (m *AWSMatcher) Reset() { *m = AWSMatcher{} } func (m *AWSMatcher) String() string { return proto.CompactTextString(m) } func (*AWSMatcher) ProtoMessage() {} func (*AWSMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{332} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19200,7 +19253,7 @@ func (m *AssumeRole) Reset() { *m = AssumeRole{} } func (m *AssumeRole) String() string { return proto.CompactTextString(m) } func (*AssumeRole) ProtoMessage() {} func (*AssumeRole) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{333} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19262,7 +19315,7 @@ func (m *InstallerParams) Reset() { *m = InstallerParams{} } func (m *InstallerParams) String() string { return proto.CompactTextString(m) } func (*InstallerParams) ProtoMessage() {} func (*InstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{334} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19305,7 +19358,7 @@ func (m *AWSSSM) Reset() { *m = AWSSSM{} } func (m *AWSSSM) String() string { return proto.CompactTextString(m) } func (*AWSSSM) ProtoMessage() {} func (*AWSSSM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{335} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19348,7 +19401,7 @@ func (m *AzureInstallerParams) Reset() { *m = AzureInstallerParams{} } func (m *AzureInstallerParams) String() string { return proto.CompactTextString(m) } func (*AzureInstallerParams) ProtoMessage() {} func (*AzureInstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{336} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19402,7 +19455,7 @@ func (m *AzureMatcher) Reset() { *m = AzureMatcher{} } func (m *AzureMatcher) String() string { return proto.CompactTextString(m) } func (*AzureMatcher) ProtoMessage() {} func (*AzureMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{337} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19457,7 +19510,7 @@ func (m *GCPMatcher) Reset() { *m = GCPMatcher{} } func (m *GCPMatcher) String() string { return proto.CompactTextString(m) } func (*GCPMatcher) ProtoMessage() {} func (*GCPMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19503,7 +19556,7 @@ func (m *KubernetesMatcher) Reset() { *m = KubernetesMatcher{} } func (m *KubernetesMatcher) String() string { return proto.CompactTextString(m) } func (*KubernetesMatcher) ProtoMessage() {} func (*KubernetesMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19545,7 +19598,7 @@ func (m *OktaOptions) Reset() { *m = OktaOptions{} } func (m *OktaOptions) String() string { return proto.CompactTextString(m) } func (*OktaOptions) ProtoMessage() {} func (*OktaOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{340} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19577,17 +19630,19 @@ var xxx_messageInfo_OktaOptions proto.InternalMessageInfo // AccessGraphSync is a configuration for Access Graph service. type AccessGraphSync struct { // AWS is a configuration for AWS Access Graph service poll service. - AWS []*AccessGraphAWSSync `protobuf:"bytes,1,rep,name=AWS,proto3" json:"aws,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + AWS []*AccessGraphAWSSync `protobuf:"bytes,1,rep,name=AWS,proto3" json:"aws,omitempty"` + // PollInterval is the frequency at which to poll for AWS resources + PollInterval time.Duration `protobuf:"bytes,2,opt,name=PollInterval,proto3,stdduration" json:"poll_interval,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AccessGraphSync) Reset() { *m = AccessGraphSync{} } func (m *AccessGraphSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphSync) ProtoMessage() {} func (*AccessGraphSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{341} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19633,7 +19688,7 @@ func (m *AccessGraphAWSSync) Reset() { *m = AccessGraphAWSSync{} } func (m *AccessGraphAWSSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSync) ProtoMessage() {} func (*AccessGraphAWSSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{342} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19817,6 +19872,7 @@ func init() { proto.RegisterType((*AccessRequestFilter)(nil), "types.AccessRequestFilter") proto.RegisterType((*AccessCapabilities)(nil), "types.AccessCapabilities") proto.RegisterType((*AccessCapabilitiesRequest)(nil), "types.AccessCapabilitiesRequest") + proto.RegisterType((*RequestKubernetesResource)(nil), "types.RequestKubernetesResource") proto.RegisterType((*ResourceID)(nil), "types.ResourceID") proto.RegisterType((*PluginDataV3)(nil), "types.PluginDataV3") proto.RegisterType((*PluginDataEntry)(nil), "types.PluginDataEntry") @@ -20071,1745 +20127,1751 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 27793 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x8c, 0x5c, 0x59, - 0x7a, 0x18, 0x86, 0x4f, 0x55, 0xf5, 0xa3, 0xfa, 0xeb, 0x57, 0xf5, 0x69, 0x3e, 0x9a, 0x9c, 0x21, - 0x8b, 0x73, 0x39, 0xc3, 0x21, 0xe7, 0x41, 0x2e, 0x9b, 0x3b, 0xdc, 0x9d, 0x9d, 0x67, 0x75, 0x57, - 0x93, 0x5d, 0x64, 0xb3, 0xbb, 0xf7, 0x56, 0x93, 0xdc, 0xd1, 0x3e, 0xee, 0xde, 0xae, 0x3a, 0xdd, - 0x7d, 0x87, 0x55, 0x75, 0x6b, 0xef, 0xbd, 0xc5, 0x66, 0xaf, 0xec, 0x9f, 0x25, 0xd9, 0xeb, 0xfd, - 0x19, 0x8e, 0x2c, 0x29, 0x96, 0x22, 0x39, 0x90, 0x05, 0x41, 0x8e, 0x1d, 0xc5, 0x81, 0x85, 0x44, - 0xb2, 0x91, 0x04, 0x42, 0x64, 0x29, 0x10, 0x94, 0x8d, 0x0c, 0xc4, 0x02, 0xe2, 0xbc, 0x36, 0x42, - 0x2b, 0x8a, 0x8c, 0x20, 0x20, 0x12, 0x40, 0x8e, 0x01, 0x27, 0x99, 0x40, 0x76, 0x70, 0xbe, 0xf3, - 0xb8, 0xe7, 0xdc, 0x7b, 0xab, 0xba, 0x38, 0xc3, 0xb1, 0xc5, 0x85, 0xfe, 0x21, 0xbb, 0xbe, 0xf3, - 0x7d, 0xdf, 0xb9, 0xe7, 0xfd, 0x9d, 0xef, 0x7c, 0x0f, 0x78, 0x31, 0xa2, 0x2d, 0xda, 0xf5, 0x83, - 0xe8, 0x4a, 0x8b, 0xee, 0xba, 0x8d, 0x83, 0x2b, 0xd1, 0x41, 0x97, 0x86, 0xfc, 0xdf, 0xcb, 0xdd, - 0xc0, 0x8f, 0x7c, 0x32, 0x8a, 0x3f, 0x4e, 0x1f, 0xdb, 0xf5, 0x77, 0x7d, 0x84, 0x5c, 0x61, 0x7f, - 0xf1, 0xc2, 0xd3, 0x67, 0x77, 0x7d, 0x7f, 0xb7, 0x45, 0xaf, 0xe0, 0xaf, 0xed, 0xde, 0xce, 0x95, - 0x66, 0x2f, 0x70, 0x23, 0xcf, 0xef, 0x88, 0xf2, 0x72, 0xb2, 0x3c, 0xf2, 0xda, 0x34, 0x8c, 0xdc, - 0x76, 0x57, 0x20, 0x5c, 0x52, 0x1f, 0xe0, 0x46, 0x11, 0x2b, 0x61, 0xc4, 0x57, 0x1e, 0x5e, 0xd5, - 0x7f, 0x0a, 0xd4, 0x37, 0xb2, 0xbf, 0x75, 0x3f, 0x70, 0xbb, 0x5d, 0x1a, 0xc4, 0x7f, 0x70, 0x74, - 0xeb, 0x17, 0x0a, 0x30, 0x71, 0x9b, 0xd2, 0x6e, 0xa5, 0xe5, 0x3d, 0xa4, 0xe4, 0x3c, 0x8c, 0xac, - 0xbb, 0x6d, 0xba, 0x90, 0x3b, 0x97, 0xbb, 0x38, 0xb1, 0x34, 0xfb, 0xf8, 0xb0, 0x3c, 0x19, 0xd2, - 0xe0, 0x21, 0x0d, 0x9c, 0x8e, 0xdb, 0xa6, 0x36, 0x16, 0x92, 0xd7, 0x60, 0x82, 0xfd, 0x1f, 0x76, - 0xdd, 0x06, 0x5d, 0xc8, 0x23, 0xe6, 0xf4, 0xe3, 0xc3, 0xf2, 0x44, 0x47, 0x02, 0xed, 0xb8, 0x9c, - 0xd4, 0x60, 0x7c, 0xe5, 0x51, 0xd7, 0x0b, 0x68, 0xb8, 0x30, 0x72, 0x2e, 0x77, 0x71, 0x72, 0xf1, - 0xf4, 0x65, 0xde, 0xd8, 0xcb, 0xb2, 0xb1, 0x97, 0xb7, 0x64, 0x63, 0x97, 0xe6, 0xbf, 0x77, 0x58, - 0x7e, 0xee, 0xf1, 0x61, 0x79, 0x9c, 0x72, 0x92, 0x9f, 0xfc, 0x83, 0x72, 0xce, 0x96, 0xf4, 0xe4, - 0x1d, 0x18, 0xd9, 0x3a, 0xe8, 0xd2, 0x85, 0x89, 0x73, 0xb9, 0x8b, 0x33, 0x8b, 0x67, 0x2f, 0xf3, - 0xee, 0x57, 0x1f, 0x1f, 0xff, 0xc5, 0xb0, 0x96, 0x8a, 0x8f, 0x0f, 0xcb, 0x23, 0x0c, 0xc5, 0x46, - 0x2a, 0xf2, 0x06, 0x8c, 0xad, 0xfa, 0x61, 0x54, 0xab, 0x2e, 0x00, 0x7e, 0xf2, 0xf1, 0xc7, 0x87, - 0xe5, 0xb9, 0x3d, 0x3f, 0x8c, 0x1c, 0xaf, 0xf9, 0xba, 0xdf, 0xf6, 0x22, 0xda, 0xee, 0x46, 0x07, - 0xb6, 0x40, 0xb2, 0x1e, 0xc1, 0xb4, 0xc1, 0x8f, 0x4c, 0xc2, 0xf8, 0xdd, 0xf5, 0xdb, 0xeb, 0x1b, - 0xf7, 0xd7, 0x4b, 0xcf, 0x91, 0x22, 0x8c, 0xac, 0x6f, 0x54, 0x57, 0x4a, 0x39, 0x32, 0x0e, 0x85, - 0xca, 0xe6, 0x66, 0x29, 0x4f, 0xa6, 0xa0, 0x58, 0xad, 0x6c, 0x55, 0x96, 0x2a, 0xf5, 0x95, 0x52, - 0x81, 0xcc, 0xc3, 0xec, 0xfd, 0xda, 0x7a, 0x75, 0xe3, 0x7e, 0xdd, 0xa9, 0xae, 0xd4, 0x6f, 0x6f, - 0x6d, 0x6c, 0x96, 0x46, 0xc8, 0x0c, 0xc0, 0xed, 0xbb, 0x4b, 0x2b, 0xf6, 0xfa, 0xca, 0xd6, 0x4a, - 0xbd, 0x34, 0x4a, 0x8e, 0x41, 0x49, 0x92, 0x38, 0xf5, 0x15, 0xfb, 0x5e, 0x6d, 0x79, 0xa5, 0x34, - 0x76, 0x6b, 0xa4, 0x58, 0x28, 0x8d, 0xd8, 0xe3, 0x6b, 0xd4, 0x0d, 0x69, 0xad, 0x6a, 0xfd, 0xad, - 0x02, 0x14, 0xef, 0xd0, 0xc8, 0x6d, 0xba, 0x91, 0x4b, 0x5e, 0x30, 0xc6, 0x07, 0x9b, 0xa8, 0x0d, - 0xcc, 0xf9, 0xf4, 0xc0, 0x8c, 0x3e, 0x3e, 0x2c, 0xe7, 0xde, 0xd0, 0x07, 0xe4, 0x6d, 0x98, 0xac, - 0xd2, 0xb0, 0x11, 0x78, 0x5d, 0x36, 0x69, 0x16, 0x0a, 0x88, 0x76, 0xea, 0xf1, 0x61, 0xf9, 0x78, - 0x33, 0x06, 0x6b, 0x1d, 0xa2, 0x63, 0x93, 0x1a, 0x8c, 0xad, 0xb9, 0xdb, 0xb4, 0x15, 0x2e, 0x8c, - 0x9e, 0x2b, 0x5c, 0x9c, 0x5c, 0x7c, 0x5e, 0x0c, 0x82, 0xfc, 0xc0, 0xcb, 0xbc, 0x74, 0xa5, 0x13, - 0x05, 0x07, 0x4b, 0xc7, 0x1e, 0x1f, 0x96, 0x4b, 0x2d, 0x04, 0xe8, 0x1d, 0xcc, 0x51, 0x48, 0x3d, - 0x9e, 0x18, 0x63, 0x47, 0x4e, 0x8c, 0x33, 0xdf, 0x3b, 0x2c, 0xe7, 0xd8, 0x80, 0x89, 0x89, 0x11, - 0xf3, 0x33, 0xa7, 0xc8, 0x22, 0x14, 0x6d, 0xfa, 0xd0, 0x0b, 0x59, 0xcb, 0x8a, 0xd8, 0xb2, 0x13, - 0x8f, 0x0f, 0xcb, 0x24, 0x10, 0x30, 0xed, 0x33, 0x14, 0xde, 0xe9, 0xb7, 0x60, 0x52, 0xfb, 0x6a, - 0x52, 0x82, 0xc2, 0x03, 0x7a, 0xc0, 0x7b, 0xd8, 0x66, 0x7f, 0x92, 0x63, 0x30, 0xfa, 0xd0, 0x6d, - 0xf5, 0x44, 0x97, 0xda, 0xfc, 0xc7, 0x97, 0xf2, 0x5f, 0xcc, 0xdd, 0x1a, 0x29, 0x8e, 0x97, 0x8a, - 0x76, 0xbe, 0x56, 0xb5, 0xfe, 0xed, 0x11, 0x28, 0xda, 0x3e, 0x5f, 0x88, 0xe4, 0x12, 0x8c, 0xd6, - 0x23, 0x37, 0x92, 0xc3, 0x34, 0xff, 0xf8, 0xb0, 0x3c, 0xcb, 0x16, 0x29, 0xd5, 0xea, 0xe7, 0x18, - 0x0c, 0x75, 0x73, 0xcf, 0x0d, 0xe5, 0x70, 0x21, 0x6a, 0x97, 0x01, 0x74, 0x54, 0xc4, 0x20, 0x17, - 0x60, 0xe4, 0x8e, 0xdf, 0xa4, 0x62, 0xc4, 0xc8, 0xe3, 0xc3, 0xf2, 0x4c, 0xdb, 0x6f, 0xea, 0x88, - 0x58, 0x4e, 0x5e, 0x87, 0x89, 0xe5, 0x5e, 0x10, 0xd0, 0x0e, 0x9b, 0xeb, 0x23, 0x88, 0x3c, 0xf3, - 0xf8, 0xb0, 0x0c, 0x0d, 0x0e, 0x74, 0xbc, 0xa6, 0x1d, 0x23, 0xb0, 0x61, 0xa8, 0x47, 0x6e, 0x10, - 0xd1, 0xe6, 0xc2, 0xe8, 0x50, 0xc3, 0xc0, 0xd6, 0xe7, 0x5c, 0xc8, 0x49, 0x92, 0xc3, 0x20, 0x38, - 0x91, 0x55, 0x98, 0xbc, 0x19, 0xb8, 0x0d, 0xba, 0x49, 0x03, 0xcf, 0x6f, 0xe2, 0xf8, 0x16, 0x96, - 0x2e, 0x3c, 0x3e, 0x2c, 0x9f, 0xd8, 0x65, 0x60, 0xa7, 0x8b, 0xf0, 0x98, 0xfa, 0xe3, 0xc3, 0x72, - 0xb1, 0x2a, 0xb6, 0x44, 0x5b, 0x27, 0x25, 0xdf, 0x64, 0x83, 0x13, 0x46, 0xd8, 0xb5, 0xb4, 0xb9, - 0x30, 0x7e, 0xe4, 0x27, 0x5a, 0xe2, 0x13, 0x4f, 0xb4, 0xdc, 0x30, 0x72, 0x02, 0x4e, 0x97, 0xf8, - 0x4e, 0x9d, 0x25, 0xd9, 0x80, 0x62, 0xbd, 0xb1, 0x47, 0x9b, 0xbd, 0x16, 0xc5, 0x29, 0x33, 0xb9, - 0x78, 0x52, 0x4c, 0x6a, 0x39, 0x9e, 0xb2, 0x78, 0xe9, 0xb4, 0xe0, 0x4d, 0x42, 0x01, 0xd1, 0xe7, - 0x93, 0xc4, 0xfa, 0x52, 0xf1, 0xe7, 0x7e, 0xb1, 0xfc, 0xdc, 0x8f, 0xfc, 0xfe, 0xb9, 0xe7, 0xac, - 0xff, 0x24, 0x0f, 0xa5, 0x24, 0x13, 0xb2, 0x03, 0xd3, 0x77, 0xbb, 0x4d, 0x37, 0xa2, 0xcb, 0x2d, - 0x8f, 0x76, 0xa2, 0x10, 0x27, 0xc9, 0xe0, 0x36, 0xbd, 0x24, 0xea, 0x5d, 0xe8, 0x21, 0xa1, 0xd3, - 0xe0, 0x94, 0x89, 0x56, 0x99, 0x6c, 0xe3, 0x7a, 0xea, 0xb8, 0x81, 0x87, 0x38, 0xc3, 0x9e, 0xac, - 0x1e, 0xbe, 0xf5, 0xf7, 0xa9, 0x47, 0xb0, 0x15, 0x13, 0xa8, 0xd3, 0xdc, 0x3e, 0xc0, 0x99, 0x39, - 0xfc, 0x04, 0x62, 0x24, 0x19, 0x13, 0x88, 0x81, 0xad, 0x7f, 0x9a, 0x83, 0x19, 0x9b, 0x86, 0x7e, - 0x2f, 0x68, 0xd0, 0x55, 0xea, 0x36, 0x69, 0xc0, 0xa6, 0xff, 0x6d, 0xaf, 0xd3, 0x14, 0x6b, 0x0a, - 0xa7, 0xff, 0x03, 0xaf, 0xa3, 0x6f, 0xdd, 0x58, 0x4e, 0x3e, 0x07, 0xe3, 0xf5, 0xde, 0x36, 0xa2, - 0xe6, 0xe3, 0x1d, 0x20, 0xec, 0x6d, 0x3b, 0x09, 0x74, 0x89, 0x46, 0xae, 0xc0, 0xf8, 0x3d, 0x1a, - 0x84, 0xf1, 0x6e, 0x88, 0x47, 0xc3, 0x43, 0x0e, 0xd2, 0x09, 0x04, 0x16, 0xb9, 0x19, 0xef, 0xc8, - 0xe2, 0x50, 0x9b, 0x4d, 0xec, 0x83, 0xf1, 0x54, 0x69, 0x0b, 0x88, 0x3e, 0x55, 0x24, 0x96, 0xf5, - 0x53, 0x79, 0x28, 0x55, 0xdd, 0xc8, 0xdd, 0x76, 0x43, 0xd1, 0x9f, 0xf7, 0xae, 0xb1, 0x3d, 0x5e, - 0x6b, 0x28, 0xee, 0xf1, 0xec, 0xcb, 0x3f, 0x71, 0xf3, 0x5e, 0x4e, 0x36, 0x6f, 0x92, 0x9d, 0xb0, - 0xa2, 0x79, 0x71, 0xa3, 0xde, 0x3d, 0xba, 0x51, 0x25, 0xd1, 0xa8, 0xa2, 0x6c, 0x54, 0xdc, 0x14, - 0xf2, 0x2e, 0x8c, 0xd4, 0xbb, 0xb4, 0x21, 0x36, 0x11, 0x79, 0x2e, 0x98, 0x8d, 0x63, 0x08, 0xf7, - 0xae, 0x2d, 0x4d, 0x09, 0x36, 0x23, 0x61, 0x97, 0x36, 0x6c, 0x24, 0xd3, 0x16, 0xcd, 0x7f, 0x5a, - 0x80, 0x63, 0x59, 0x64, 0x7a, 0x3b, 0xc6, 0x06, 0xb4, 0xe3, 0x22, 0x14, 0xd9, 0x11, 0xce, 0x8e, - 0x45, 0xdc, 0x2e, 0x26, 0x96, 0xa6, 0xd8, 0x27, 0xef, 0x09, 0x98, 0xad, 0x4a, 0xc9, 0x79, 0x25, - 0x11, 0x14, 0x63, 0x7e, 0x42, 0x22, 0x90, 0x72, 0x00, 0x1b, 0x6b, 0xb9, 0x84, 0x51, 0x70, 0x88, - 0xbb, 0x45, 0x82, 0xe3, 0xb1, 0x0e, 0x04, 0xc4, 0x38, 0x66, 0xe4, 0xa1, 0xb0, 0x02, 0x45, 0xd9, - 0xac, 0x85, 0x29, 0x64, 0x34, 0x97, 0xe8, 0xa4, 0x7b, 0xd7, 0xf8, 0x60, 0x36, 0xc5, 0x6f, 0x9d, - 0x8d, 0xc4, 0x21, 0xd7, 0xa0, 0xb8, 0x19, 0xf8, 0x8f, 0x0e, 0x6a, 0xd5, 0x70, 0x61, 0xfa, 0x5c, - 0xe1, 0xe2, 0xc4, 0xd2, 0xc9, 0xc7, 0x87, 0xe5, 0xf9, 0x2e, 0x83, 0x39, 0x5e, 0x53, 0x3f, 0x69, - 0x15, 0xe2, 0xad, 0x91, 0x62, 0xae, 0x94, 0xbf, 0x35, 0x52, 0xcc, 0x97, 0x0a, 0x5c, 0xbc, 0xb8, - 0x35, 0x52, 0x1c, 0x29, 0x8d, 0xde, 0x1a, 0x29, 0x8e, 0xa2, 0xc0, 0x31, 0x51, 0x82, 0x5b, 0x23, - 0xc5, 0xc9, 0xd2, 0x94, 0x71, 0xda, 0x23, 0x83, 0xc8, 0x6f, 0xf8, 0x2d, 0xbb, 0x70, 0xd7, 0xae, - 0xd9, 0x63, 0xcb, 0x95, 0x65, 0x1a, 0x44, 0x76, 0xa1, 0x72, 0xbf, 0x6e, 0x4f, 0x57, 0x0f, 0x3a, - 0x6e, 0xdb, 0x6b, 0xf0, 0xa3, 0xd3, 0x2e, 0xdc, 0x5c, 0xde, 0xb4, 0x2a, 0x30, 0x13, 0xb7, 0x65, - 0xcd, 0x0b, 0x23, 0x72, 0x05, 0x26, 0x24, 0x84, 0x6d, 0x74, 0x85, 0xcc, 0x56, 0xdb, 0x31, 0x8e, - 0xf5, 0x3b, 0x79, 0x80, 0xb8, 0xe4, 0x19, 0x5d, 0x0b, 0x5f, 0x30, 0xd6, 0xc2, 0xf1, 0xe4, 0x5a, - 0xe8, 0xbb, 0x0a, 0xc8, 0xfb, 0x30, 0xc6, 0xc4, 0x82, 0x9e, 0x14, 0x89, 0x4e, 0x26, 0x49, 0xb1, - 0xf0, 0xde, 0xb5, 0xa5, 0x19, 0x41, 0x3c, 0x16, 0x22, 0xc4, 0x16, 0x64, 0xda, 0x32, 0xfa, 0x85, - 0xf1, 0x78, 0x30, 0xc4, 0x02, 0xba, 0x08, 0x6a, 0x40, 0x45, 0x87, 0xe2, 0xca, 0xe8, 0xca, 0x41, - 0x56, 0xa5, 0xe4, 0x14, 0xb0, 0x01, 0x17, 0x9d, 0x3a, 0xfe, 0xf8, 0xb0, 0x5c, 0xe8, 0x05, 0x1e, - 0x4e, 0x02, 0x72, 0x05, 0xc4, 0x34, 0x10, 0x1d, 0xc8, 0x66, 0xdf, 0x5c, 0xc3, 0x75, 0x1a, 0x34, - 0x88, 0xe2, 0x1e, 0x5f, 0xc8, 0xc9, 0xd9, 0x42, 0xba, 0x60, 0x4e, 0x95, 0x85, 0x11, 0x9c, 0x06, - 0x17, 0x33, 0x7b, 0xe5, 0xb2, 0x81, 0xca, 0xc5, 0xc8, 0x73, 0xf2, 0x54, 0x6a, 0xf2, 0x32, 0x27, - 0x25, 0x52, 0x9a, 0x15, 0x90, 0x6b, 0xc0, 0x66, 0xa8, 0xe8, 0x7d, 0x10, 0xf5, 0x54, 0xee, 0xd7, - 0x97, 0x8e, 0x0b, 0x4e, 0xd3, 0xee, 0xbe, 0x4e, 0xce, 0xb0, 0xc9, 0xdb, 0xc0, 0xa6, 0xb0, 0xe8, - 0x77, 0x22, 0x88, 0x6e, 0x2e, 0x6f, 0x2e, 0xb7, 0xfc, 0x5e, 0xb3, 0xfe, 0xe5, 0xb5, 0x98, 0x78, - 0xb7, 0xd1, 0xd5, 0x89, 0x6f, 0x2e, 0x6f, 0x92, 0xb7, 0x61, 0xb4, 0xf2, 0xed, 0x5e, 0x40, 0x85, - 0x7c, 0x32, 0x25, 0xeb, 0x64, 0xb0, 0xa5, 0x93, 0x82, 0x70, 0xd6, 0x65, 0x3f, 0x75, 0xb9, 0x0e, - 0xcb, 0x59, 0xcd, 0x5b, 0x6b, 0x75, 0x21, 0x7b, 0x90, 0x44, 0xb7, 0x6c, 0xad, 0x69, 0x9f, 0x1d, - 0x19, 0xad, 0x66, 0x54, 0xe4, 0x0a, 0xe4, 0x2b, 0x55, 0xbc, 0x11, 0x4d, 0x2e, 0x4e, 0xc8, 0x6a, - 0xab, 0x4b, 0xc7, 0x04, 0xc9, 0x94, 0xab, 0x2f, 0x83, 0x7c, 0xa5, 0x4a, 0x96, 0x60, 0xf4, 0xce, - 0x41, 0xfd, 0xcb, 0x6b, 0x62, 0x33, 0x9b, 0x97, 0xf3, 0x9a, 0xc1, 0x36, 0x70, 0xd9, 0x87, 0xf1, - 0x17, 0xb7, 0x0f, 0xc2, 0x6f, 0xb5, 0xf4, 0x2f, 0x46, 0x34, 0xb2, 0x09, 0x13, 0x95, 0x66, 0xdb, - 0xeb, 0xdc, 0x0d, 0x69, 0xb0, 0x30, 0x89, 0x7c, 0x16, 0x12, 0xdf, 0xad, 0xca, 0x97, 0x16, 0x1e, - 0x1f, 0x96, 0x8f, 0xb9, 0xec, 0xa7, 0xd3, 0x0b, 0x69, 0xa0, 0x71, 0x8b, 0x99, 0x90, 0x4d, 0x80, - 0x3b, 0x7e, 0x67, 0xd7, 0xaf, 0x44, 0x2d, 0x37, 0x4c, 0x6c, 0x8f, 0x71, 0x81, 0x12, 0x1f, 0x8e, - 0xb7, 0x19, 0xcc, 0x71, 0x19, 0x50, 0x63, 0xa8, 0xf1, 0x20, 0x37, 0x60, 0x6c, 0x23, 0x70, 0x1b, - 0x2d, 0xba, 0x30, 0x8d, 0xdc, 0x8e, 0x09, 0x6e, 0x1c, 0x28, 0x5b, 0xba, 0x20, 0x18, 0x96, 0x7c, - 0x04, 0xeb, 0xd7, 0x14, 0x8e, 0x78, 0xfa, 0x3e, 0x90, 0xf4, 0x9c, 0xcc, 0xb8, 0x24, 0xbc, 0xa6, - 0x5f, 0x12, 0xe2, 0x45, 0xbf, 0xec, 0xb7, 0xdb, 0x6e, 0xa7, 0x89, 0xb4, 0xf7, 0x16, 0xb5, 0xbb, - 0x83, 0xf5, 0x2d, 0x98, 0x4b, 0x75, 0xd6, 0x11, 0xf7, 0xbb, 0xf7, 0x60, 0xb6, 0x4a, 0x77, 0xdc, - 0x5e, 0x2b, 0x52, 0x27, 0x09, 0x5f, 0xa2, 0x78, 0xd3, 0x6a, 0xf2, 0x22, 0x47, 0x1e, 0x1f, 0x76, - 0x12, 0xd9, 0x7a, 0x17, 0xa6, 0x8d, 0xe6, 0xb3, 0xab, 0x42, 0xa5, 0xd7, 0xf4, 0x22, 0x1c, 0xc8, - 0x5c, 0x7c, 0x55, 0x70, 0x19, 0x10, 0x87, 0xcb, 0x8e, 0x11, 0xac, 0x7f, 0x4f, 0x97, 0x56, 0xc4, - 0x4e, 0xc4, 0xae, 0xd5, 0x62, 0x3f, 0xc8, 0xc5, 0xb2, 0x53, 0x6a, 0x3f, 0x50, 0xbb, 0xc1, 0x25, - 0xbe, 0x36, 0xf3, 0xa9, 0xb5, 0x39, 0x29, 0x46, 0xa2, 0xe0, 0xee, 0x87, 0x7c, 0x45, 0xaa, 0x99, - 0x5a, 0xf8, 0xe4, 0x33, 0xf5, 0x7d, 0x98, 0xba, 0xe3, 0x76, 0xdc, 0x5d, 0xda, 0x64, 0x2d, 0xe0, - 0x7b, 0xcf, 0xc4, 0xd2, 0xf3, 0x8f, 0x0f, 0xcb, 0x27, 0xdb, 0x1c, 0x8e, 0xad, 0xd4, 0x27, 0x91, - 0x41, 0x40, 0xae, 0xca, 0x95, 0x3d, 0x9a, 0xb1, 0xb2, 0xa7, 0x45, 0xed, 0xa3, 0xb8, 0xb2, 0xc5, - 0x7a, 0xb6, 0x7e, 0x73, 0x02, 0xdb, 0x48, 0x5e, 0x87, 0x31, 0x9b, 0xee, 0xb2, 0xa3, 0x26, 0x17, - 0x0f, 0x52, 0x80, 0x10, 0xbd, 0x63, 0x38, 0x0e, 0xca, 0x19, 0xb4, 0x19, 0xee, 0x79, 0x3b, 0x91, - 0xe8, 0x1d, 0x25, 0x67, 0x08, 0xb0, 0x26, 0x67, 0x08, 0x88, 0x79, 0x9d, 0xe5, 0x30, 0xb6, 0xfb, - 0xd9, 0xd5, 0xba, 0xe8, 0x34, 0xd9, 0xc3, 0x76, 0x55, 0xdb, 0x46, 0x02, 0x43, 0x4a, 0x60, 0xd8, - 0xe4, 0x3a, 0x4c, 0x54, 0x1a, 0x0d, 0xbf, 0xa7, 0xdd, 0x19, 0xf9, 0xba, 0xe5, 0x40, 0x53, 0x45, - 0x12, 0xa3, 0x92, 0x3a, 0x4c, 0xae, 0xb0, 0x8b, 0x96, 0xb7, 0xec, 0x36, 0xf6, 0x64, 0x27, 0xc9, - 0x3d, 0x4c, 0x2b, 0x89, 0x57, 0x2e, 0x45, 0x60, 0x83, 0x01, 0x75, 0x25, 0x83, 0x86, 0x4b, 0xb6, - 0x60, 0xb2, 0x4e, 0x1b, 0x01, 0x8d, 0xea, 0x91, 0x1f, 0xd0, 0xc4, 0x96, 0xac, 0x95, 0x2c, 0x9d, - 0x95, 0x77, 0xbd, 0x10, 0x81, 0x4e, 0xc8, 0xa0, 0x3a, 0x57, 0x0d, 0x99, 0x0b, 0xed, 0x6d, 0x3f, - 0x38, 0xa8, 0x2e, 0x89, 0x6d, 0x3a, 0x3e, 0xd3, 0x39, 0x58, 0x17, 0xda, 0x19, 0xa4, 0xb9, 0x6d, - 0x0a, 0xed, 0x1c, 0x0b, 0x47, 0xaa, 0x5a, 0x47, 0xd9, 0x4a, 0x6c, 0xda, 0xb3, 0x71, 0x2f, 0x23, - 0x58, 0x1b, 0xa9, 0x66, 0x88, 0x92, 0x99, 0x31, 0x52, 0x02, 0x8b, 0x74, 0x81, 0xc8, 0x51, 0xe3, - 0x82, 0x6e, 0x8b, 0x86, 0xa1, 0xd8, 0xcb, 0x4f, 0x25, 0x06, 0x3f, 0x46, 0x58, 0x7a, 0x59, 0x30, - 0x3f, 0x23, 0xa7, 0x81, 0xb8, 0xa7, 0xb1, 0x42, 0xad, 0x9e, 0x0c, 0xde, 0xe4, 0x2d, 0x80, 0x95, - 0x47, 0x11, 0x0d, 0x3a, 0x6e, 0x4b, 0xe9, 0xc1, 0x50, 0xf5, 0x43, 0x05, 0xd4, 0x1c, 0x68, 0x0d, - 0x99, 0x2c, 0xc3, 0x74, 0x25, 0x0c, 0x7b, 0x6d, 0x6a, 0xfb, 0x2d, 0x5a, 0xb1, 0xd7, 0x71, 0xdf, - 0x9f, 0x58, 0x3a, 0xf3, 0xf8, 0xb0, 0x7c, 0xca, 0xc5, 0x02, 0x27, 0xf0, 0x5b, 0xd4, 0x71, 0x03, - 0x7d, 0x76, 0x9b, 0x34, 0x64, 0x03, 0x60, 0xa3, 0x4b, 0x3b, 0x75, 0xea, 0x06, 0x8d, 0xbd, 0xc4, - 0x36, 0x1f, 0x17, 0x2c, 0xbd, 0x20, 0x5a, 0x78, 0xcc, 0xef, 0xd2, 0x4e, 0x88, 0x30, 0xfd, 0xab, - 0x62, 0x4c, 0x72, 0x1f, 0x66, 0x6b, 0x95, 0x3b, 0x9b, 0x7e, 0xcb, 0x6b, 0x1c, 0x08, 0xc9, 0x69, - 0x06, 0xb5, 0x83, 0x27, 0x04, 0xd7, 0x44, 0x29, 0xdf, 0x9e, 0x3c, 0xb7, 0xed, 0x74, 0x11, 0xea, - 0x08, 0xf9, 0x29, 0xc9, 0x85, 0x7c, 0xc8, 0xe6, 0x60, 0xc8, 0x84, 0xc1, 0x2d, 0x77, 0x37, 0x5c, - 0x98, 0x35, 0xb4, 0x5d, 0x95, 0xfb, 0xf5, 0xcb, 0x5a, 0x29, 0x17, 0x53, 0x4e, 0xf3, 0x89, 0x88, - 0x50, 0x27, 0x72, 0x77, 0x43, 0x73, 0x22, 0x2a, 0x6c, 0x72, 0x0b, 0xa0, 0xea, 0x37, 0x7a, 0x6d, - 0xda, 0x89, 0xaa, 0x4b, 0x0b, 0x25, 0xf3, 0x2a, 0xa0, 0x0a, 0xe2, 0xad, 0xad, 0xe9, 0x37, 0x8c, - 0x99, 0xa8, 0x51, 0x9f, 0x7e, 0x0f, 0x4a, 0xc9, 0x0f, 0x79, 0x42, 0x05, 0xd6, 0x74, 0x69, 0x46, - 0x6b, 0xfd, 0xca, 0x23, 0x2f, 0x8c, 0x42, 0xeb, 0x87, 0x8d, 0x15, 0xc8, 0x76, 0x87, 0xdb, 0xf4, - 0x60, 0x33, 0xa0, 0x3b, 0xde, 0x23, 0xb1, 0x99, 0xe1, 0xee, 0xf0, 0x80, 0x1e, 0x38, 0x5d, 0x84, - 0xea, 0xbb, 0x83, 0x42, 0x25, 0x9f, 0x87, 0xe2, 0xed, 0x3b, 0xf5, 0xdb, 0xf4, 0xa0, 0x56, 0x15, - 0x07, 0x15, 0x27, 0x6b, 0x87, 0x0e, 0x23, 0x35, 0xe6, 0x9a, 0xc2, 0xb4, 0x96, 0xe2, 0x9d, 0x90, - 0xd5, 0xbc, 0xdc, 0xea, 0x85, 0x11, 0x0d, 0x6a, 0x55, 0xbd, 0xe6, 0x06, 0x07, 0x26, 0xf6, 0x25, - 0x85, 0x6a, 0xfd, 0xab, 0x3c, 0xee, 0x82, 0x6c, 0xc2, 0xd7, 0x3a, 0x61, 0xe4, 0x76, 0x1a, 0x54, - 0x31, 0xc0, 0x09, 0xef, 0x09, 0x68, 0x62, 0xc2, 0xc7, 0xc8, 0x66, 0xd5, 0xf9, 0xa1, 0xab, 0x66, - 0x55, 0x4a, 0xcd, 0x45, 0xad, 0xaa, 0xab, 0x57, 0x03, 0x01, 0x4d, 0x54, 0x19, 0x23, 0x93, 0x0b, - 0x30, 0x5e, 0xab, 0xdc, 0xa9, 0xf4, 0xa2, 0x3d, 0xdc, 0x83, 0x8b, 0x5c, 0x3e, 0x67, 0xb3, 0xd5, - 0xed, 0x45, 0x7b, 0xb6, 0x2c, 0x24, 0x57, 0xf0, 0xde, 0xd3, 0xa1, 0x11, 0x57, 0xc3, 0x8a, 0x43, - 0x37, 0xe4, 0xa0, 0xc4, 0xb5, 0x87, 0x81, 0xc8, 0xab, 0x30, 0x7a, 0x6f, 0x73, 0xb9, 0x56, 0x15, - 0x17, 0x67, 0x3c, 0x89, 0x1e, 0x76, 0x1b, 0xe6, 0x97, 0x70, 0x14, 0xb2, 0x02, 0x33, 0x75, 0xda, - 0xe8, 0x05, 0x5e, 0x74, 0x70, 0x33, 0xf0, 0x7b, 0xdd, 0x70, 0x61, 0x1c, 0xeb, 0xc0, 0x95, 0x1e, - 0x8a, 0x12, 0x67, 0x17, 0x8b, 0x34, 0xea, 0x04, 0x91, 0xf5, 0x5b, 0xb9, 0x78, 0x9b, 0x24, 0x17, - 0x0c, 0xb1, 0x06, 0x75, 0x37, 0x4c, 0xac, 0xd1, 0x75, 0x37, 0x28, 0xe0, 0xd8, 0x40, 0x96, 0x7b, - 0x61, 0xe4, 0xb7, 0x57, 0x3a, 0xcd, 0xae, 0xef, 0x75, 0x22, 0xa4, 0xe2, 0x9d, 0x6f, 0x3d, 0x3e, - 0x2c, 0x9f, 0x6d, 0x60, 0xa9, 0x43, 0x45, 0xb1, 0x93, 0xe0, 0x92, 0x41, 0xfd, 0x29, 0xc6, 0xc3, - 0xfa, 0xdd, 0xbc, 0x71, 0xbc, 0xb1, 0xcf, 0xb3, 0x69, 0xb7, 0xe5, 0x35, 0xf0, 0x46, 0x8f, 0x0d, - 0x55, 0xb3, 0x0a, 0x3f, 0x2f, 0x88, 0x4b, 0x79, 0x0f, 0x99, 0xbc, 0x33, 0xa8, 0xc9, 0x07, 0x30, - 0xc5, 0x24, 0x0d, 0xf1, 0x33, 0x5c, 0xc8, 0x63, 0x67, 0xbf, 0x80, 0x5a, 0xb8, 0x90, 0x06, 0x8a, - 0x8d, 0x21, 0xa2, 0xe8, 0x14, 0xa4, 0x09, 0x0b, 0x5b, 0x81, 0xdb, 0x09, 0xbd, 0x68, 0xa5, 0xd3, - 0x08, 0x0e, 0x50, 0x32, 0x5a, 0xe9, 0xb8, 0xdb, 0x2d, 0xda, 0xc4, 0xe6, 0x16, 0x97, 0x2e, 0x3e, - 0x3e, 0x2c, 0xbf, 0x14, 0x71, 0x1c, 0x87, 0x2a, 0x24, 0x87, 0x72, 0x2c, 0x8d, 0x73, 0x5f, 0x4e, - 0x4c, 0x92, 0x92, 0xdd, 0x8a, 0x8f, 0x30, 0x5c, 0x48, 0x40, 0x49, 0x4a, 0x8d, 0x06, 0xdb, 0xc3, - 0xf4, 0xcf, 0xd4, 0x09, 0xac, 0x7f, 0x91, 0x8b, 0x0f, 0x60, 0xf2, 0x0e, 0x4c, 0x8a, 0x15, 0xa3, - 0xcd, 0x0b, 0xdc, 0x41, 0xe5, 0xf2, 0x4a, 0x8c, 0xac, 0x8e, 0xce, 0xee, 0xfd, 0x95, 0xe5, 0x35, - 0x6d, 0x6e, 0xe0, 0xbd, 0xdf, 0x6d, 0xb4, 0x92, 0x54, 0x12, 0x8d, 0x4d, 0x82, 0xad, 0xb5, 0xba, - 0xd9, 0x2b, 0x38, 0x09, 0xa2, 0x56, 0x98, 0xd1, 0x0d, 0x1a, 0xf2, 0xa7, 0x6f, 0xf8, 0x7f, 0x9f, - 0xcb, 0x3a, 0xe7, 0xc9, 0x12, 0x4c, 0xdf, 0xf7, 0x83, 0x07, 0x38, 0xbe, 0x5a, 0x27, 0xe0, 0xc8, - 0xef, 0xcb, 0x82, 0x64, 0x83, 0x4c, 0x12, 0xfd, 0xdb, 0xb4, 0xde, 0x30, 0xbf, 0x2d, 0xc1, 0xc1, - 0x20, 0x60, 0xe3, 0xa0, 0x38, 0xaa, 0xd5, 0x81, 0xe3, 0x10, 0x7f, 0x82, 0x31, 0x85, 0x75, 0x74, - 0xeb, 0x3f, 0xcf, 0xe9, 0xe7, 0x39, 0xeb, 0xe4, 0xaa, 0xdf, 0x76, 0xbd, 0x8e, 0xd6, 0x1c, 0xfe, - 0xb0, 0x84, 0xd0, 0xe4, 0x97, 0x68, 0xc8, 0xe4, 0x1a, 0x14, 0xf9, 0x2f, 0xb5, 0xd7, 0xa2, 0x56, - 0x4b, 0x10, 0x9a, 0x07, 0x85, 0x44, 0x4c, 0x8d, 0x4c, 0xe1, 0x49, 0x47, 0xe6, 0x37, 0x73, 0xfa, - 0x51, 0xfc, 0x49, 0x0f, 0x9b, 0xc4, 0x21, 0x93, 0x7f, 0x92, 0x43, 0xe6, 0x53, 0x37, 0xe1, 0x47, - 0x72, 0x30, 0xa9, 0x69, 0x29, 0x58, 0x1b, 0x36, 0x03, 0xff, 0x23, 0xda, 0x88, 0xcc, 0x36, 0x74, - 0x39, 0x30, 0xd1, 0x06, 0x85, 0xfa, 0x29, 0xda, 0x60, 0xfd, 0xb3, 0x9c, 0xb8, 0x23, 0x0d, 0xbd, - 0xcd, 0x9b, 0x5b, 0x72, 0xfe, 0x49, 0x8e, 0xc8, 0x0f, 0x60, 0xd4, 0xa6, 0x4d, 0x2f, 0x14, 0xf7, - 0x9b, 0x39, 0xfd, 0x3e, 0x86, 0x05, 0xb1, 0xdc, 0x14, 0xb0, 0x9f, 0xfa, 0xf9, 0x86, 0xe5, 0x4c, - 0x90, 0xad, 0x85, 0x37, 0x5a, 0xf4, 0x91, 0xc7, 0x17, 0xa3, 0x38, 0x6a, 0xf1, 0x78, 0xf3, 0x42, - 0x67, 0x87, 0x95, 0x08, 0x89, 0x5a, 0x5f, 0x78, 0x06, 0x8d, 0xf5, 0x21, 0x40, 0x5c, 0x25, 0xb9, - 0x0d, 0x25, 0x31, 0x1b, 0xbc, 0xce, 0x2e, 0x17, 0xa4, 0x44, 0x1f, 0x94, 0x1f, 0x1f, 0x96, 0x9f, - 0x6f, 0xa8, 0x32, 0x21, 0x75, 0x6a, 0x7c, 0x53, 0x84, 0xd6, 0xbf, 0x9f, 0x87, 0x7c, 0x05, 0x07, - 0xe4, 0x36, 0x3d, 0x88, 0xdc, 0xed, 0x1b, 0x5e, 0xcb, 0x58, 0x4c, 0x0f, 0x10, 0xea, 0xec, 0x78, - 0x86, 0xba, 0x42, 0x43, 0x66, 0x8b, 0xe9, 0x76, 0xb0, 0xfd, 0x26, 0x12, 0x6a, 0x8b, 0xe9, 0x41, - 0xb0, 0xfd, 0x66, 0x92, 0x4c, 0x21, 0x12, 0x0b, 0xc6, 0xf8, 0xc2, 0x12, 0x73, 0x10, 0x1e, 0x1f, - 0x96, 0xc7, 0xf8, 0xfa, 0xb3, 0x45, 0x09, 0x39, 0x05, 0x85, 0xfa, 0xe6, 0xba, 0xd8, 0x01, 0x51, - 0x2d, 0x18, 0x76, 0x3b, 0x36, 0x83, 0xb1, 0x3a, 0xd7, 0xaa, 0x95, 0x4d, 0x54, 0x04, 0x8c, 0xc6, - 0x75, 0xb6, 0x9a, 0x6e, 0x37, 0xa9, 0x0a, 0x50, 0x88, 0xe4, 0x5d, 0x98, 0xbc, 0x5d, 0x5d, 0x5e, - 0xf5, 0x43, 0xbe, 0x7b, 0x8d, 0xc5, 0x93, 0xff, 0x41, 0xb3, 0xe1, 0xa0, 0x26, 0x3e, 0x79, 0x0c, - 0x68, 0xf8, 0xd6, 0x77, 0xf2, 0x30, 0xa9, 0xe9, 0xc9, 0xc8, 0xe7, 0xc5, 0x03, 0x69, 0xce, 0xb8, - 0x01, 0x68, 0x18, 0xac, 0x94, 0x2b, 0x55, 0xda, 0x7e, 0x93, 0x8a, 0xe7, 0xd2, 0x58, 0x81, 0x91, - 0x1f, 0x46, 0x81, 0xf1, 0x16, 0x00, 0x9f, 0x03, 0xf8, 0xc9, 0x9a, 0x38, 0xa1, 0xd9, 0x49, 0xe8, - 0xe3, 0x12, 0x23, 0x93, 0x7b, 0x30, 0xbf, 0x15, 0xf4, 0xc2, 0xa8, 0x7e, 0x10, 0x46, 0xb4, 0xcd, - 0xb8, 0x6d, 0xfa, 0x7e, 0x4b, 0xcc, 0xbf, 0x97, 0x1e, 0x1f, 0x96, 0xcf, 0x45, 0xac, 0xd8, 0x09, - 0xb1, 0x1c, 0x3f, 0xc0, 0xe9, 0xfa, 0xbe, 0xae, 0xd6, 0xc8, 0x62, 0x60, 0xd9, 0x30, 0xa5, 0x2b, - 0x45, 0xd8, 0xc9, 0x22, 0x1e, 0x93, 0x84, 0xaa, 0x5b, 0x3b, 0x59, 0xc4, 0x57, 0xa6, 0x1f, 0xb7, - 0x4c, 0x12, 0xeb, 0xf3, 0xba, 0x42, 0x6e, 0xd8, 0x85, 0x6d, 0xfd, 0x58, 0x2e, 0xde, 0x46, 0xee, - 0x5d, 0x25, 0x6f, 0xc3, 0x18, 0x7f, 0xbc, 0x13, 0x6f, 0x9c, 0xc7, 0xd5, 0xa5, 0x56, 0x7f, 0xd9, - 0xe3, 0x9a, 0xf0, 0xdf, 0xe3, 0x0f, 0xfc, 0xcf, 0xd9, 0x82, 0x44, 0x29, 0xd1, 0x4d, 0x7d, 0x9a, - 0xe4, 0x8e, 0xea, 0xe2, 0xab, 0x59, 0x4a, 0x74, 0xeb, 0xb7, 0x47, 0x60, 0xc6, 0x44, 0xd3, 0x5f, - 0xf8, 0x72, 0x43, 0xbd, 0xf0, 0x7d, 0x00, 0x45, 0xd6, 0x1f, 0x5e, 0x83, 0x4a, 0x89, 0xec, 0x25, - 0x7c, 0x5a, 0x10, 0x30, 0xe3, 0xe5, 0x1a, 0xf8, 0x70, 0xb0, 0x3b, 0xae, 0xad, 0xa8, 0xc8, 0xa2, - 0xf6, 0x0c, 0x55, 0x88, 0x85, 0x14, 0xf9, 0x0c, 0xa5, 0xaf, 0x07, 0xf5, 0x20, 0xf5, 0x06, 0x8c, - 0x31, 0xf9, 0x5e, 0xa9, 0x60, 0xf0, 0x2b, 0x99, 0xe8, 0x9f, 0x30, 0x51, 0xe1, 0x48, 0xe4, 0x3e, - 0x14, 0xd7, 0xdc, 0x30, 0xaa, 0x53, 0xda, 0x19, 0xe2, 0xed, 0xbe, 0x2c, 0xba, 0x6a, 0x1e, 0x1f, - 0xc6, 0x43, 0x4a, 0x3b, 0x89, 0xc7, 0x57, 0xc5, 0x8c, 0x7c, 0x1d, 0x60, 0xd9, 0xef, 0x44, 0x81, - 0xdf, 0x5a, 0xf3, 0x77, 0x17, 0xc6, 0xf0, 0xee, 0x7b, 0x36, 0x31, 0x00, 0x31, 0x02, 0xbf, 0xfe, - 0x2a, 0x05, 0x4f, 0x83, 0x17, 0x38, 0x2d, 0x7f, 0x57, 0x5f, 0x07, 0x31, 0x3e, 0xb9, 0x01, 0x25, - 0xa9, 0x58, 0xb8, 0xdb, 0xdd, 0x0d, 0x70, 0x82, 0x8c, 0xc7, 0x92, 0x07, 0x7d, 0x14, 0x39, 0x3d, - 0x01, 0xd7, 0x77, 0xca, 0x24, 0x0d, 0xf9, 0x1a, 0x9c, 0x4c, 0xc2, 0xe4, 0x28, 0x17, 0x63, 0x99, - 0x5c, 0x67, 0x97, 0x31, 0xef, 0xfb, 0xb1, 0xb0, 0x3e, 0xce, 0xc3, 0xc9, 0x3e, 0x8d, 0x65, 0xeb, - 0x01, 0x8f, 0x6b, 0x6d, 0x3d, 0x24, 0x4e, 0x69, 0x6e, 0x73, 0x74, 0x0e, 0xf2, 0xe2, 0x80, 0x1b, - 0x59, 0x2a, 0x3d, 0x3e, 0x2c, 0x4f, 0x19, 0xe3, 0x98, 0xaf, 0x55, 0xc9, 0x2d, 0x18, 0x61, 0x43, - 0x34, 0xc4, 0xd3, 0xb9, 0xd4, 0x29, 0xcd, 0x44, 0x9e, 0x3e, 0x7d, 0x70, 0xe8, 0x90, 0x07, 0xf9, - 0x3c, 0x14, 0xb6, 0xb6, 0xd6, 0x70, 0xee, 0x14, 0xb0, 0xed, 0xd3, 0x51, 0xd4, 0x32, 0xa6, 0xea, - 0x34, 0xa3, 0xbd, 0xac, 0x2c, 0x2d, 0x18, 0x3a, 0xf9, 0x4a, 0xc2, 0xa4, 0xe7, 0xd5, 0xc1, 0x03, - 0x3d, 0xbc, 0x85, 0xcf, 0xa7, 0x30, 0xac, 0xb1, 0x7e, 0x3e, 0x1f, 0xaf, 0xe1, 0x1b, 0x5e, 0x2b, - 0xa2, 0x01, 0x39, 0xcd, 0x97, 0x64, 0x2c, 0x9c, 0xd9, 0xea, 0x37, 0x59, 0x88, 0xd7, 0x37, 0x67, - 0xa5, 0x16, 0xf2, 0xab, 0xda, 0x42, 0x2e, 0xe0, 0x42, 0x9e, 0xe9, 0xbb, 0x64, 0x5f, 0xcd, 0x98, - 0x97, 0xb8, 0x10, 0x33, 0xe6, 0xde, 0x4b, 0x30, 0xbd, 0xee, 0xaf, 0x3c, 0x8a, 0x14, 0x22, 0x5b, - 0x80, 0x45, 0xdb, 0x04, 0x32, 0x8e, 0x1b, 0xad, 0x26, 0x0d, 0xb6, 0xf6, 0xdc, 0x8e, 0xf1, 0x76, - 0x6d, 0xa7, 0xe0, 0x0c, 0x77, 0x9d, 0xee, 0x9b, 0xb8, 0xe3, 0x1c, 0x37, 0x09, 0xb7, 0x7e, 0x34, - 0x2f, 0x3b, 0xe3, 0xde, 0xe2, 0x33, 0xfa, 0x46, 0xfa, 0xa6, 0xf1, 0x46, 0x3a, 0xaf, 0xb4, 0xbb, - 0xea, 0xc1, 0x7f, 0xf1, 0x08, 0x3b, 0x81, 0xff, 0x61, 0x14, 0xa6, 0x74, 0x74, 0xd6, 0x0f, 0x95, - 0x66, 0x33, 0xd0, 0xfb, 0xc1, 0x6d, 0x36, 0x03, 0x1b, 0xa1, 0x86, 0x59, 0x40, 0x61, 0xa0, 0x59, - 0xc0, 0x37, 0x60, 0x62, 0xb9, 0xdd, 0x34, 0x1e, 0x2b, 0xad, 0x8c, 0xcf, 0xbb, 0xac, 0x90, 0xf8, - 0x5a, 0x50, 0x4a, 0xcb, 0x46, 0xbb, 0x99, 0x7e, 0xa2, 0x8c, 0x59, 0x1a, 0x16, 0x05, 0xa3, 0x9f, - 0xc6, 0xa2, 0xe0, 0x3a, 0x4c, 0xdc, 0x0d, 0xe9, 0x56, 0xaf, 0xd3, 0xa1, 0x2d, 0x9c, 0x56, 0x45, - 0x2e, 0xeb, 0xf7, 0x42, 0xea, 0x44, 0x08, 0xd5, 0x3f, 0x40, 0xa1, 0xea, 0x03, 0x3c, 0x3e, 0x60, - 0x80, 0xaf, 0x41, 0x71, 0x93, 0xd2, 0x00, 0xfb, 0x74, 0x32, 0x16, 0xe9, 0xba, 0x94, 0x06, 0x0e, - 0xeb, 0x58, 0xc3, 0xd2, 0x40, 0x20, 0x1a, 0xe6, 0x09, 0x53, 0x43, 0x9a, 0x27, 0x90, 0x17, 0x61, - 0xaa, 0xdb, 0xdb, 0x6e, 0x79, 0x0d, 0xe4, 0x2b, 0xec, 0x1a, 0xec, 0x49, 0x0e, 0x63, 0x6c, 0x43, - 0xf2, 0x15, 0x98, 0xc6, 0x3b, 0x8e, 0x9a, 0x72, 0x33, 0xc6, 0xab, 0x9e, 0x51, 0xc6, 0x25, 0x9d, - 0x06, 0x03, 0x39, 0x19, 0xe6, 0x37, 0x26, 0xa3, 0xd3, 0x75, 0x98, 0x31, 0x47, 0xf2, 0x29, 0x3c, - 0xee, 0x29, 0x53, 0x8b, 0x62, 0x69, 0xe2, 0xd6, 0x48, 0x11, 0x4a, 0x93, 0xdc, 0xc8, 0xc2, 0x86, - 0x4d, 0xd5, 0x26, 0x9b, 0xdc, 0xee, 0x6d, 0xd3, 0xa0, 0x43, 0x23, 0x1a, 0x8a, 0x4b, 0x40, 0x68, - 0x8f, 0x54, 0xba, 0xdd, 0xd0, 0xfa, 0xfb, 0x79, 0x18, 0xaf, 0xdc, 0xaf, 0xd7, 0x3a, 0x3b, 0x3e, - 0x3e, 0xd1, 0xa9, 0x97, 0x19, 0xfd, 0x89, 0x4e, 0xbd, 0xcc, 0xe8, 0xef, 0x31, 0x57, 0x32, 0xae, - 0x71, 0x68, 0xc5, 0xab, 0x5d, 0xe3, 0x8c, 0x0b, 0x68, 0xfc, 0x48, 0x55, 0x18, 0xe2, 0x91, 0x4a, - 0xe9, 0x11, 0x47, 0x8e, 0xd6, 0x23, 0xbe, 0x0d, 0x93, 0xb5, 0x4e, 0x44, 0x77, 0x83, 0x78, 0xa6, - 0xab, 0x2b, 0xa5, 0x02, 0xeb, 0xa2, 0xbd, 0x86, 0xcd, 0xa6, 0x11, 0xd7, 0x5d, 0x2a, 0x9d, 0x25, - 0x4e, 0x23, 0xae, 0xe2, 0x4c, 0xe8, 0x03, 0x24, 0xa2, 0x55, 0x4d, 0xcc, 0x11, 0x69, 0x08, 0xc0, - 0x85, 0xcf, 0x99, 0x58, 0x79, 0xcf, 0x3a, 0x76, 0x69, 0x2e, 0xdb, 0x10, 0xc0, 0xfa, 0x6e, 0x1e, - 0x26, 0x2b, 0xdd, 0xee, 0x33, 0x6e, 0x8e, 0xf5, 0x45, 0x63, 0x7b, 0x95, 0x77, 0x21, 0xd5, 0xae, - 0xa1, 0x2c, 0xb1, 0x7e, 0x25, 0x0f, 0xb3, 0x09, 0x0a, 0xfd, 0xeb, 0x73, 0x43, 0x1a, 0x61, 0xe5, - 0x87, 0x34, 0xc2, 0x2a, 0x0c, 0x67, 0x84, 0x35, 0xf2, 0x69, 0xb6, 0xcc, 0x57, 0xa0, 0x50, 0xe9, - 0x76, 0x93, 0x8f, 0xb9, 0xdd, 0xee, 0xbd, 0x6b, 0xfc, 0x3e, 0xeb, 0x76, 0xbb, 0x36, 0xc3, 0x30, - 0xf6, 0xb1, 0xb1, 0x21, 0xf7, 0x31, 0xeb, 0x0d, 0x98, 0x40, 0x5e, 0x68, 0xfa, 0x74, 0x0e, 0x70, - 0x31, 0x0b, 0xab, 0x27, 0xa3, 0x2e, 0xb1, 0xcc, 0xff, 0xdf, 0x1c, 0x8c, 0xe2, 0xef, 0x67, 0x74, - 0x8e, 0x2d, 0x1a, 0x73, 0xac, 0xa4, 0xcd, 0xb1, 0x61, 0x66, 0xd7, 0xdf, 0x2d, 0x00, 0x2c, 0x6f, - 0xd8, 0x75, 0xae, 0xf6, 0x20, 0x37, 0x60, 0xd6, 0x6d, 0xb5, 0xfc, 0x7d, 0xda, 0x74, 0xfc, 0xc0, - 0xdb, 0xf5, 0x3a, 0xbc, 0xe7, 0xe4, 0x0b, 0xa3, 0x59, 0xa4, 0xbf, 0x3b, 0x88, 0xa2, 0x0d, 0x5e, - 0xa2, 0xf3, 0x69, 0xd3, 0x68, 0xcf, 0x6f, 0xca, 0x0b, 0x9c, 0xc1, 0x47, 0x14, 0x65, 0xf0, 0xb9, - 0xc3, 0x4b, 0x74, 0x3e, 0x7b, 0x78, 0x21, 0x95, 0xf2, 0xa3, 0xc1, 0x47, 0x14, 0x65, 0xf0, 0xe1, - 0xb7, 0xd8, 0x90, 0xac, 0xc1, 0x1c, 0x42, 0x9c, 0x46, 0x40, 0x9b, 0xb4, 0x13, 0x79, 0x6e, 0x2b, - 0x14, 0x57, 0x7e, 0x54, 0x0e, 0xa5, 0x0a, 0xf5, 0x2b, 0x0f, 0x16, 0x2e, 0xc7, 0x65, 0xe4, 0x32, - 0x8c, 0xb7, 0xdd, 0x47, 0x8e, 0xbb, 0xcb, 0xdf, 0xda, 0xa7, 0xf9, 0x15, 0x51, 0x80, 0xf4, 0x0d, - 0xbb, 0xed, 0x3e, 0xaa, 0xec, 0x52, 0xd6, 0x0a, 0xfa, 0xa8, 0xeb, 0x87, 0x5a, 0x2b, 0xc6, 0xe2, - 0x56, 0x24, 0x8a, 0xf4, 0x56, 0x88, 0x22, 0xd1, 0x0a, 0xeb, 0xff, 0x1a, 0xc5, 0xa9, 0x2d, 0x36, - 0x01, 0x61, 0x1e, 0x96, 0xcb, 0x30, 0x0f, 0x7b, 0x0b, 0xb4, 0x23, 0x4e, 0x57, 0xed, 0x69, 0x07, - 0xbc, 0x7e, 0x2d, 0x8c, 0x91, 0xc9, 0x83, 0xa4, 0xa1, 0x58, 0x01, 0x57, 0xce, 0xf9, 0xe4, 0xbc, - 0x7a, 0x2a, 0x36, 0x62, 0xab, 0x40, 0x6a, 0x1d, 0x7c, 0xcd, 0xa2, 0xf5, 0x07, 0x5e, 0xf7, 0x1e, - 0x0d, 0xbc, 0x9d, 0x03, 0x31, 0x2e, 0x28, 0x44, 0x79, 0xa2, 0xd4, 0x09, 0x1f, 0x78, 0x5d, 0x76, - 0x6f, 0xf4, 0x76, 0x0e, 0xec, 0x0c, 0x1a, 0xf2, 0x3e, 0x8c, 0xdb, 0x74, 0x3f, 0xf0, 0x22, 0x69, - 0xfe, 0x30, 0xa3, 0xb4, 0x1c, 0x08, 0xe5, 0x43, 0x14, 0xf0, 0x1f, 0xfa, 0x62, 0x15, 0xe5, 0x64, - 0x91, 0x9f, 0x52, 0xdc, 0xcc, 0x61, 0x3a, 0x6e, 0x6d, 0xe5, 0x7e, 0xbd, 0xdf, 0x21, 0x45, 0x2e, - 0xc1, 0x28, 0x1e, 0x75, 0x42, 0x80, 0x43, 0xb7, 0x01, 0x14, 0x78, 0xf4, 0x73, 0x18, 0x31, 0xc8, - 0x59, 0x00, 0xf5, 0x5c, 0x14, 0x2e, 0x14, 0x51, 0xb4, 0xd2, 0x20, 0xc9, 0x73, 0x7a, 0xe2, 0x89, - 0xce, 0xe9, 0x35, 0x28, 0xd9, 0xf4, 0x5b, 0x3d, 0x2f, 0xa0, 0xcd, 0x4a, 0x17, 0xdf, 0x24, 0xc2, - 0x05, 0xc0, 0x09, 0x76, 0xee, 0xf1, 0x61, 0xf9, 0x85, 0x40, 0x94, 0x39, 0x6e, 0x97, 0x3f, 0x65, - 0x18, 0xb3, 0x3b, 0x49, 0x49, 0xde, 0x82, 0x11, 0xb6, 0x23, 0x08, 0x93, 0x32, 0xa9, 0xdb, 0x8d, - 0x37, 0x09, 0x7e, 0xd3, 0x6e, 0xf8, 0xc6, 0x54, 0x45, 0x92, 0xcf, 0xce, 0x4c, 0xeb, 0x57, 0xf2, - 0x70, 0x5e, 0x1d, 0x82, 0x1b, 0x41, 0xbd, 0x72, 0x67, 0xad, 0xd6, 0xdc, 0x14, 0x77, 0xc6, 0xcd, - 0xc0, 0x7f, 0xe8, 0x35, 0x69, 0x70, 0xef, 0xea, 0x11, 0x5b, 0xf8, 0x1a, 0x5f, 0x3e, 0x5c, 0xe1, - 0x9c, 0x37, 0x0c, 0x5a, 0x34, 0x59, 0x43, 0xd8, 0xdc, 0x74, 0xbb, 0x29, 0xfd, 0xf3, 0xea, 0x73, - 0x76, 0xcc, 0x80, 0xfc, 0x58, 0x0e, 0x4e, 0x64, 0x7f, 0x88, 0xd0, 0x23, 0x94, 0xe5, 0x7d, 0xa5, - 0xcf, 0xd7, 0x2e, 0xbd, 0xf2, 0xf8, 0xb0, 0x7c, 0x3e, 0x74, 0xdb, 0x2d, 0xc7, 0x6b, 0xf2, 0xda, - 0xbc, 0x06, 0x75, 0xba, 0x02, 0xc1, 0xa8, 0xb7, 0x4f, 0x4d, 0x5f, 0x02, 0xb9, 0x93, 0x2f, 0xe4, - 0x96, 0x00, 0x8a, 0x52, 0xa7, 0x67, 0xfd, 0x83, 0x1c, 0x68, 0x53, 0xbb, 0x68, 0xd3, 0xa6, 0x17, - 0xd0, 0x46, 0x24, 0x76, 0x73, 0xe1, 0x8e, 0xc3, 0x61, 0x09, 0xfb, 0x25, 0x84, 0x91, 0xf7, 0x60, - 0x5c, 0xec, 0x3a, 0xb8, 0x71, 0xc7, 0x4b, 0x42, 0x68, 0x0b, 0xb9, 0xdf, 0x56, 0x6a, 0xc7, 0x92, - 0x44, 0xec, 0x56, 0x74, 0xeb, 0xfe, 0xd6, 0x72, 0xcb, 0xf5, 0xda, 0xa1, 0x38, 0xfd, 0xb0, 0x5b, - 0x3f, 0xda, 0x8f, 0x9c, 0x06, 0x42, 0xf5, 0x5b, 0x91, 0x42, 0xb5, 0x6e, 0x4a, 0x65, 0xe5, 0x11, - 0x46, 0x78, 0x65, 0x18, 0xbd, 0x17, 0x2b, 0x2d, 0x96, 0x26, 0x1e, 0x1f, 0x96, 0xf9, 0x74, 0xb1, - 0x39, 0xdc, 0xfa, 0xab, 0x39, 0x98, 0x31, 0xe7, 0x13, 0xb9, 0x0c, 0x63, 0xc2, 0x15, 0x26, 0x87, - 0xca, 0x19, 0xd6, 0x0b, 0x63, 0xdc, 0x09, 0xc6, 0x70, 0x7d, 0x11, 0x58, 0xec, 0xfc, 0x16, 0x1c, - 0xc4, 0xe1, 0x85, 0xe7, 0x77, 0x83, 0x83, 0x6c, 0x59, 0x46, 0x2c, 0x26, 0xbc, 0x87, 0xbd, 0x56, - 0xa4, 0xeb, 0xec, 0x03, 0x84, 0xd8, 0xa2, 0xc4, 0x5a, 0x86, 0x31, 0xbe, 0x97, 0x24, 0x8c, 0x7f, - 0x72, 0x4f, 0x60, 0xfc, 0x63, 0x1d, 0xe6, 0x00, 0xea, 0xf5, 0xd5, 0xdb, 0xf4, 0x60, 0xd3, 0xf5, - 0x02, 0x7c, 0x64, 0xc2, 0x7d, 0xfb, 0xb6, 0x58, 0x5c, 0x53, 0xe2, 0x91, 0x89, 0xef, 0xf1, 0x0f, - 0xe8, 0x81, 0xf1, 0xc8, 0x24, 0x51, 0xf1, 0x70, 0x08, 0xbc, 0x87, 0x6e, 0x44, 0x19, 0x61, 0x1e, - 0x09, 0xf9, 0xe1, 0xc0, 0xa1, 0x09, 0x4a, 0x0d, 0x99, 0x7c, 0x1d, 0x66, 0xe2, 0x5f, 0xea, 0xa9, - 0x6c, 0x46, 0x2d, 0x60, 0xb3, 0x70, 0xe9, 0xec, 0xe3, 0xc3, 0xf2, 0x69, 0x8d, 0x6b, 0xf2, 0x11, - 0x2d, 0xc1, 0xcc, 0xfa, 0xa5, 0x1c, 0x3e, 0x10, 0xcb, 0x06, 0x5e, 0x80, 0x11, 0x65, 0xd2, 0x38, - 0x25, 0x76, 0x1d, 0xf3, 0x39, 0x00, 0xcb, 0xc9, 0x79, 0x28, 0xc4, 0x2d, 0xc1, 0xbd, 0xda, 0x6c, - 0x01, 0x2b, 0x25, 0x37, 0x61, 0x7c, 0xa8, 0x6f, 0xc6, 0xa5, 0x91, 0xf1, 0xad, 0x92, 0x1a, 0x47, - 0xe1, 0xd6, 0xfd, 0xad, 0x1f, 0xdc, 0x51, 0xf8, 0x89, 0x3c, 0xcc, 0xb2, 0x7e, 0xad, 0xf4, 0xa2, - 0x3d, 0x3f, 0xf0, 0xa2, 0x83, 0x67, 0x56, 0xbb, 0xf5, 0x8e, 0x21, 0x1a, 0x9f, 0x96, 0xa7, 0x8c, - 0xde, 0xb6, 0xa1, 0x94, 0x5c, 0xbf, 0x33, 0x0a, 0xf3, 0x19, 0x54, 0xe4, 0x75, 0x43, 0x01, 0xbd, - 0x20, 0x5d, 0x5d, 0x3f, 0x3e, 0x2c, 0x4f, 0x49, 0xf4, 0xad, 0xd8, 0xf5, 0x75, 0xd1, 0xb4, 0xb6, - 0xe0, 0x3d, 0x85, 0xfa, 0x68, 0xdd, 0xda, 0xc2, 0xb4, 0xb1, 0xb8, 0x04, 0xa3, 0xb6, 0xdf, 0xa2, - 0xd2, 0xc2, 0x08, 0x25, 0x8c, 0x80, 0x01, 0x8c, 0x17, 0x55, 0x06, 0x20, 0xab, 0x30, 0xce, 0xfe, - 0xb8, 0xe3, 0x76, 0xc5, 0x5b, 0x01, 0x51, 0x97, 0x33, 0x84, 0x76, 0xbd, 0xce, 0xae, 0x7e, 0x3f, - 0x6b, 0x51, 0xa7, 0xed, 0x76, 0x0d, 0x51, 0x88, 0x23, 0x1a, 0xf7, 0xbc, 0x62, 0xff, 0x7b, 0x5e, - 0xee, 0xc8, 0x7b, 0x5e, 0x13, 0xa0, 0xee, 0xed, 0x76, 0xbc, 0xce, 0x6e, 0xa5, 0xb5, 0x2b, 0x1c, - 0x86, 0x2f, 0xf5, 0x1f, 0x85, 0xcb, 0x31, 0x32, 0x4e, 0x5c, 0xfe, 0xa0, 0xc7, 0x61, 0x8e, 0xdb, - 0x32, 0x1e, 0x32, 0x62, 0x54, 0xb2, 0x0e, 0x50, 0x69, 0x44, 0xde, 0x43, 0x36, 0x81, 0x43, 0x21, - 0xb5, 0xc8, 0x0f, 0x5e, 0xae, 0xdc, 0xa6, 0x07, 0x75, 0x1a, 0xc5, 0x0f, 0x23, 0x2e, 0xa2, 0xb2, - 0x75, 0x60, 0xd8, 0xac, 0xc7, 0x1c, 0x48, 0x17, 0x8e, 0x57, 0x9a, 0x4d, 0x8f, 0xb5, 0xc0, 0x6d, - 0xe1, 0x4b, 0x1f, 0x6d, 0x22, 0xeb, 0xa9, 0x6c, 0xd6, 0x97, 0x04, 0xeb, 0x17, 0x5d, 0x45, 0xe5, - 0x44, 0x9c, 0x2c, 0x59, 0x4d, 0x36, 0x63, 0x6b, 0x03, 0x66, 0xcc, 0xa6, 0x9b, 0x6e, 0xce, 0x53, - 0x50, 0xb4, 0xeb, 0x15, 0xa7, 0xbe, 0x5a, 0xb9, 0x5a, 0xca, 0x91, 0x12, 0x4c, 0x89, 0x5f, 0x8b, - 0xce, 0xe2, 0x9b, 0xd7, 0x4b, 0x79, 0x03, 0xf2, 0xe6, 0xd5, 0xc5, 0x94, 0x77, 0xd1, 0x78, 0xa9, - 0xc8, 0xd5, 0x5f, 0xd6, 0xaf, 0xe6, 0xa0, 0x28, 0xbf, 0x9b, 0x5c, 0x87, 0x42, 0xbd, 0xbe, 0x9a, - 0xf0, 0x07, 0x8a, 0xcf, 0x17, 0xbe, 0x93, 0x86, 0xa1, 0x6e, 0xf4, 0xc9, 0x08, 0x18, 0xdd, 0xd6, - 0x5a, 0x5d, 0x88, 0x05, 0x92, 0x2e, 0xde, 0xb6, 0x39, 0x5d, 0x86, 0x93, 0xc4, 0x75, 0x28, 0xdc, - 0xba, 0xbf, 0x25, 0xee, 0x13, 0x92, 0x2e, 0xde, 0x49, 0x39, 0xdd, 0x47, 0xfb, 0xfa, 0xfe, 0xce, - 0x08, 0x2c, 0x1b, 0x26, 0xb5, 0x29, 0xcc, 0x8f, 0xdb, 0xb6, 0xaf, 0xfc, 0x7a, 0xc5, 0x71, 0xcb, - 0x20, 0xb6, 0x28, 0x61, 0xd2, 0xc1, 0x9a, 0xdf, 0x70, 0x5b, 0xe2, 0xdc, 0x46, 0xe9, 0xa0, 0xc5, - 0x00, 0x36, 0x87, 0x5b, 0xbf, 0x95, 0x83, 0x12, 0xca, 0x50, 0x68, 0xb4, 0xe9, 0x3f, 0xa0, 0x9d, - 0x7b, 0x57, 0xc9, 0x1b, 0x72, 0xb1, 0xe5, 0x94, 0xaa, 0x61, 0x14, 0x17, 0x5b, 0xe2, 0xad, 0x42, - 0x2c, 0x38, 0xcd, 0x75, 0x3a, 0x3f, 0xbc, 0xcb, 0xe5, 0x11, 0xae, 0xd3, 0x65, 0x18, 0xc5, 0xcf, - 0x11, 0xdb, 0x22, 0x7e, 0x79, 0xc4, 0x00, 0x36, 0x87, 0x6b, 0xbb, 0xd2, 0x4f, 0xe5, 0x53, 0x6d, - 0x58, 0xfc, 0x81, 0x72, 0x5b, 0x34, 0x1b, 0x37, 0xd4, 0x4e, 0xfd, 0x21, 0x1c, 0x4b, 0x76, 0x09, - 0xaa, 0x81, 0x2a, 0x30, 0x6b, 0xc2, 0xa5, 0x46, 0xe8, 0x64, 0x66, 0x5d, 0xf7, 0x16, 0xed, 0x24, - 0xbe, 0xf5, 0xbf, 0xe4, 0x60, 0x02, 0xff, 0xb4, 0x7b, 0x2d, 0x34, 0x9e, 0xa9, 0xdc, 0xaf, 0x0b, - 0x95, 0xaf, 0x2e, 0xc6, 0xb9, 0xfb, 0xa1, 0x23, 0xb4, 0xc2, 0xc6, 0xfe, 0xa2, 0x90, 0x05, 0x29, - 0xd7, 0xe5, 0x4a, 0xb5, 0x88, 0x22, 0xe5, 0x4a, 0xdf, 0x30, 0x41, 0x2a, 0x90, 0xd1, 0xe4, 0xee, - 0x7e, 0x9d, 0x4d, 0x3f, 0xfd, 0x35, 0x1b, 0xe9, 0xfc, 0x96, 0x69, 0x72, 0xc7, 0xd1, 0xf0, 0x31, - 0xfb, 0x7e, 0xbd, 0x62, 0xaf, 0x1b, 0x8f, 0xd9, 0xec, 0x1b, 0x0d, 0x0b, 0x71, 0x81, 0x64, 0xfd, - 0x43, 0x48, 0x76, 0xa0, 0x38, 0xea, 0x9e, 0x70, 0x6d, 0xbc, 0x0d, 0xa3, 0x95, 0x56, 0xcb, 0xdf, - 0x17, 0xbb, 0x84, 0xd4, 0x4a, 0xa9, 0xfe, 0xe3, 0x27, 0x19, 0x2a, 0x56, 0x0c, 0x57, 0x2c, 0x06, - 0x20, 0xcb, 0x30, 0x51, 0xb9, 0x5f, 0xaf, 0xd5, 0xaa, 0x5b, 0x5b, 0xdc, 0xed, 0xa4, 0xb0, 0xf4, - 0xb2, 0xec, 0x1f, 0xcf, 0x6b, 0x3a, 0xc9, 0xf7, 0xd4, 0x58, 0x72, 0x8f, 0xe9, 0xc8, 0xbb, 0x00, - 0xb7, 0x7c, 0xaf, 0xc3, 0x15, 0x49, 0xa2, 0xf1, 0x67, 0x1e, 0x1f, 0x96, 0x27, 0x3f, 0xf2, 0xbd, - 0x8e, 0xd0, 0x3c, 0xb1, 0x6f, 0x8f, 0x91, 0x6c, 0xed, 0x6f, 0xd6, 0xd3, 0x4b, 0x3e, 0x37, 0x88, - 0x19, 0x8d, 0x7b, 0x7a, 0xdb, 0x4f, 0xd9, 0xc2, 0x48, 0x34, 0xd2, 0x86, 0xd9, 0x7a, 0x6f, 0x77, - 0x97, 0xb2, 0x5d, 0x5d, 0xa8, 0x4e, 0xc6, 0xc4, 0xed, 0x56, 0x05, 0xfb, 0xe0, 0x37, 0x11, 0x76, - 0x3f, 0x09, 0x97, 0x5e, 0x67, 0x13, 0xf9, 0xfb, 0x87, 0x65, 0xf1, 0x4e, 0xcb, 0x84, 0xb4, 0x50, - 0xd2, 0xa7, 0x15, 0x27, 0x49, 0xde, 0x64, 0x03, 0xc6, 0x6e, 0x7a, 0xd1, 0x6a, 0x6f, 0x5b, 0xb8, - 0x51, 0xbc, 0x38, 0x60, 0xd1, 0x70, 0x44, 0xfe, 0x50, 0xb0, 0xeb, 0x45, 0x7b, 0x3d, 0xdd, 0x90, - 0x5d, 0xb0, 0x21, 0xf7, 0xa1, 0xb8, 0xec, 0x05, 0x8d, 0x16, 0x5d, 0xae, 0x89, 0x53, 0xff, 0xfc, - 0x00, 0x96, 0x12, 0x95, 0xf7, 0x4b, 0x03, 0x7f, 0x35, 0x3c, 0x5d, 0x0a, 0x90, 0x18, 0xe4, 0xaf, - 0xe7, 0xe0, 0x79, 0xf5, 0xf5, 0x95, 0x5d, 0xda, 0x89, 0xee, 0xb8, 0x51, 0x63, 0x8f, 0x06, 0xa2, - 0x97, 0x26, 0x06, 0xf5, 0xd2, 0x97, 0x52, 0xbd, 0x74, 0x31, 0xee, 0x25, 0x97, 0x31, 0x73, 0xda, - 0x9c, 0x5b, 0xba, 0xcf, 0x06, 0xd5, 0x4a, 0x1c, 0x80, 0xf8, 0xe5, 0x47, 0xb8, 0xe1, 0xbd, 0x3c, - 0xa0, 0xc1, 0x31, 0xb2, 0x30, 0x9f, 0x57, 0xbf, 0x0d, 0xfb, 0x2f, 0x05, 0x25, 0xb7, 0xa5, 0xcf, - 0x12, 0x97, 0x48, 0xce, 0x0d, 0xe0, 0xcd, 0xfd, 0x98, 0xe6, 0x07, 0x78, 0x27, 0xf2, 0xd1, 0x5e, - 0x73, 0xb7, 0x85, 0x10, 0x72, 0xc4, 0x68, 0xaf, 0xb9, 0xf1, 0x68, 0xb7, 0xdc, 0xe4, 0x68, 0xaf, - 0xb9, 0xdb, 0x64, 0x99, 0x3b, 0x5a, 0x72, 0xaf, 0xbc, 0xb3, 0x83, 0xb8, 0x2d, 0x6f, 0xf2, 0x93, - 0x39, 0xc3, 0xe1, 0xf2, 0xab, 0x30, 0x51, 0xef, 0xba, 0x0d, 0xda, 0xf2, 0x76, 0x22, 0xf1, 0x14, - 0xf8, 0xd2, 0x00, 0x56, 0x0a, 0x57, 0x3c, 0x23, 0xc9, 0x9f, 0xfa, 0x05, 0x49, 0xe1, 0xb0, 0x2f, - 0xdc, 0xda, 0xbc, 0xb3, 0x30, 0x7b, 0xe4, 0x17, 0x6e, 0x6d, 0xde, 0x11, 0x32, 0x47, 0xb7, 0x6d, - 0xc8, 0x1c, 0x9b, 0x77, 0x48, 0x17, 0x66, 0xb6, 0x68, 0x10, 0xb8, 0x3b, 0x7e, 0xd0, 0xe6, 0xaa, - 0x3a, 0xee, 0xe9, 0x71, 0x69, 0x10, 0x3f, 0x83, 0x80, 0xeb, 0x68, 0x23, 0x09, 0x73, 0x92, 0xfa, - 0xbd, 0x04, 0x7f, 0xeb, 0xd7, 0x0b, 0x70, 0xb2, 0xcf, 0x57, 0x92, 0x75, 0xb9, 0x2b, 0xe6, 0x0c, - 0x9d, 0x6a, 0x1f, 0xf4, 0xcb, 0x47, 0x6e, 0x94, 0x6b, 0x50, 0x5a, 0xb9, 0x8d, 0x82, 0x34, 0xd7, - 0x76, 0x2f, 0x57, 0xe4, 0x79, 0x82, 0x7a, 0x3f, 0xfa, 0x00, 0x8d, 0xd7, 0xa4, 0x96, 0xbc, 0x61, - 0x78, 0x69, 0xa6, 0x28, 0x4f, 0xff, 0x68, 0x1e, 0x46, 0xf0, 0x6c, 0x4b, 0xc4, 0xa6, 0xc9, 0x3d, - 0x51, 0x6c, 0x9a, 0x0f, 0x60, 0x6a, 0xe5, 0x36, 0xbf, 0xe6, 0xae, 0xba, 0xe1, 0x9e, 0xd8, 0x79, - 0xf1, 0x2d, 0x98, 0x3e, 0x70, 0xc4, 0xad, 0x78, 0xcf, 0x35, 0xc4, 0x4a, 0x83, 0x82, 0xdc, 0x85, - 0x79, 0xfe, 0x6d, 0xde, 0x8e, 0xd7, 0xe0, 0x21, 0x2e, 0x3c, 0xb7, 0x25, 0xb6, 0xe1, 0xf3, 0x8f, - 0x0f, 0xcb, 0x65, 0xfa, 0x00, 0xcd, 0xf2, 0x44, 0xb9, 0x13, 0x22, 0x82, 0x6e, 0x9f, 0x97, 0x41, - 0xaf, 0xfb, 0xdd, 0xdb, 0x13, 0x58, 0x21, 0xab, 0x8d, 0xd5, 0xcd, 0x70, 0x39, 0x92, 0xf5, 0x0f, - 0x46, 0xe1, 0x74, 0xff, 0x1d, 0x94, 0x7c, 0xd9, 0x1c, 0xc0, 0x0b, 0x47, 0xee, 0xb9, 0x47, 0x8f, - 0xe1, 0x57, 0xe0, 0xd8, 0x4a, 0x27, 0xa2, 0x41, 0x37, 0xf0, 0x64, 0xa4, 0x85, 0x55, 0x3f, 0x94, - 0x66, 0x90, 0x68, 0x8f, 0x48, 0x55, 0xb9, 0xd0, 0x48, 0xa2, 0x51, 0xa6, 0xc6, 0x2a, 0x93, 0x03, - 0x59, 0x81, 0x19, 0x0d, 0xde, 0xea, 0xed, 0x0a, 0x99, 0x81, 0x3f, 0x3a, 0x68, 0x3c, 0x5b, 0x3d, - 0xfd, 0x6a, 0x95, 0x20, 0x3a, 0xfd, 0x4b, 0x05, 0x31, 0x2d, 0xce, 0x43, 0xa1, 0xde, 0xdb, 0x16, - 0xd3, 0x81, 0x5f, 0x0e, 0x8c, 0x83, 0x84, 0x95, 0x92, 0x2f, 0x02, 0xd8, 0xb4, 0xeb, 0x87, 0x5e, - 0xe4, 0x07, 0x07, 0xba, 0xc3, 0x4e, 0xa0, 0xa0, 0xa6, 0x4d, 0xb1, 0x84, 0x92, 0x55, 0x98, 0x8d, - 0x7f, 0x6d, 0xec, 0x77, 0x84, 0x1a, 0x75, 0x82, 0xeb, 0x2f, 0x62, 0x72, 0xc7, 0x67, 0x65, 0xfa, - 0xd1, 0x98, 0x20, 0x23, 0x8b, 0x50, 0xbc, 0xef, 0x07, 0x0f, 0x76, 0xd8, 0x40, 0x8d, 0xc4, 0x87, - 0xf7, 0xbe, 0x80, 0xe9, 0x87, 0x94, 0xc4, 0x63, 0x73, 0x7e, 0xa5, 0xf3, 0xd0, 0x0b, 0xfc, 0x4e, - 0x9b, 0x76, 0x22, 0xfd, 0x9d, 0x9c, 0xc6, 0x60, 0xc3, 0x55, 0x32, 0x06, 0xb3, 0x5b, 0x7a, 0xa5, - 0x11, 0xf9, 0x81, 0x78, 0x24, 0xe7, 0xc3, 0xcd, 0x00, 0xc6, 0x70, 0x33, 0x00, 0xeb, 0x44, 0x9b, - 0xee, 0x88, 0x07, 0x03, 0xec, 0xc4, 0x80, 0xee, 0x18, 0x7e, 0xa0, 0x74, 0x87, 0x09, 0x1f, 0x36, - 0xdd, 0x41, 0xd5, 0x82, 0x11, 0x3e, 0x69, 0x27, 0xa5, 0x94, 0x12, 0x68, 0xd6, 0xf7, 0x26, 0xfa, - 0xce, 0x5b, 0xb6, 0xdb, 0x3f, 0xd9, 0xbc, 0x5d, 0x73, 0x87, 0x98, 0xb7, 0xaf, 0x2b, 0x4b, 0x65, - 0xdd, 0xf9, 0x19, 0x21, 0xfa, 0x71, 0xc3, 0x71, 0x4e, 0xff, 0x72, 0xf1, 0x49, 0x26, 0x91, 0xe8, - 0xa4, 0xfc, 0xb0, 0x9d, 0x54, 0x18, 0xaa, 0x93, 0xc8, 0x12, 0x4c, 0xab, 0x00, 0x5c, 0x9b, 0x6e, - 0x64, 0xec, 0x4d, 0x2a, 0x6a, 0x9a, 0xd3, 0x75, 0x23, 0x7d, 0x6f, 0x32, 0x49, 0xc8, 0x3b, 0x30, - 0x29, 0xcc, 0xf5, 0x91, 0xc3, 0x68, 0x6c, 0x30, 0x29, 0x6d, 0xfb, 0x13, 0xf4, 0x3a, 0x3a, 0x5b, - 0x92, 0x9b, 0x5e, 0x97, 0xb6, 0xbc, 0x0e, 0xad, 0xa3, 0x9e, 0x5e, 0xcc, 0x18, 0x5c, 0x92, 0x5d, - 0x51, 0xe2, 0x70, 0x15, 0xbe, 0xa1, 0xa1, 0x33, 0x88, 0x92, 0x93, 0x75, 0xfc, 0x89, 0x26, 0x2b, - 0xb7, 0x57, 0x0a, 0xd6, 0xfc, 0x5d, 0x4f, 0x5a, 0x68, 0x4a, 0x7b, 0xa5, 0xc0, 0x69, 0x31, 0x68, - 0xc2, 0x5e, 0x89, 0xa3, 0xb2, 0x9b, 0x04, 0xfb, 0x51, 0xab, 0x8a, 0xc7, 0x29, 0xbc, 0x49, 0x20, - 0x91, 0x69, 0x16, 0xcb, 0x91, 0x64, 0x35, 0x2b, 0x6d, 0xd7, 0x6b, 0x09, 0x1f, 0xd7, 0xb8, 0x1a, - 0xca, 0xa0, 0xc9, 0x6a, 0x10, 0x95, 0x34, 0x60, 0xca, 0xa6, 0x3b, 0x9b, 0x81, 0x1f, 0xd1, 0x46, - 0x44, 0x9b, 0x42, 0x7a, 0x92, 0x17, 0x88, 0x25, 0xdf, 0xe7, 0x92, 0xe1, 0xd2, 0x1b, 0xdf, 0x3b, - 0x2c, 0xe7, 0xbe, 0x7f, 0x58, 0x06, 0x06, 0xe2, 0x36, 0xd7, 0x8f, 0x0f, 0xcb, 0x27, 0xd9, 0xf8, - 0x77, 0x25, 0xb1, 0x7e, 0xc4, 0xe8, 0x4c, 0xc9, 0x0f, 0xb3, 0x4d, 0x57, 0x75, 0x49, 0x5c, 0xd9, - 0x54, 0x9f, 0xca, 0xde, 0xcc, 0xac, 0xac, 0xac, 0xf5, 0x76, 0x66, 0xa5, 0x99, 0x95, 0x90, 0x77, - 0x61, 0x72, 0xb9, 0xb6, 0xec, 0x77, 0x76, 0xbc, 0xdd, 0xfa, 0x6a, 0x05, 0x45, 0x30, 0x61, 0x6f, - 0xdf, 0xf0, 0x9c, 0x06, 0xc2, 0x9d, 0x70, 0xcf, 0x35, 0xdc, 0xae, 0x62, 0x7c, 0x72, 0x13, 0x66, - 0xe4, 0x4f, 0x9b, 0xee, 0xdc, 0xb5, 0x6b, 0x28, 0x79, 0x49, 0x27, 0x07, 0xc5, 0x81, 0x75, 0x44, - 0x2f, 0xd0, 0x25, 0xf2, 0x04, 0x19, 0x9b, 0x8c, 0x55, 0xda, 0x6d, 0xf9, 0x07, 0xec, 0xf3, 0xb6, - 0x3c, 0x1a, 0xa0, 0xac, 0x25, 0x26, 0x63, 0x53, 0x95, 0x38, 0x91, 0x67, 0x6c, 0xb7, 0x09, 0x22, - 0xb2, 0x0e, 0x73, 0x62, 0x8a, 0xdf, 0xf3, 0x42, 0x6f, 0xdb, 0x6b, 0x79, 0xd1, 0x01, 0x4a, 0x59, - 0x42, 0x0a, 0x91, 0xeb, 0xe2, 0xa1, 0x2a, 0xd5, 0x98, 0xa5, 0x49, 0xad, 0x5f, 0xcd, 0xc3, 0x0b, - 0x83, 0x6e, 0x1c, 0xa4, 0x6e, 0x6e, 0x66, 0x17, 0x87, 0xb8, 0xa5, 0x1c, 0xbd, 0x9d, 0xad, 0xc0, - 0xcc, 0x46, 0xb0, 0xeb, 0x76, 0xbc, 0x6f, 0xe3, 0x4d, 0x52, 0x99, 0x6d, 0x61, 0x67, 0xf8, 0x5a, - 0x89, 0x39, 0xdb, 0x13, 0x44, 0xa7, 0x1f, 0x8a, 0x6d, 0xee, 0x93, 0x3a, 0x00, 0x5d, 0x87, 0x89, - 0x65, 0xbf, 0x13, 0xd1, 0x47, 0x51, 0xc2, 0xdd, 0x95, 0x03, 0x93, 0xce, 0x4f, 0x12, 0xd5, 0xfa, - 0x57, 0x79, 0x38, 0x33, 0x50, 0xe4, 0x26, 0x5b, 0x66, 0xaf, 0x5d, 0x1a, 0x46, 0x4e, 0x3f, 0xba, - 0xdb, 0x16, 0x53, 0x16, 0x46, 0x47, 0xda, 0xd7, 0x9f, 0xfe, 0x6f, 0x72, 0xa2, 0x93, 0x3e, 0x07, - 0xe3, 0x58, 0x95, 0xea, 0x22, 0xae, 0x8d, 0xc2, 0x5d, 0xd8, 0x33, 0xb5, 0x51, 0x1c, 0x8d, 0x5c, - 0x83, 0xe2, 0xb2, 0xdb, 0x6a, 0x69, 0xce, 0xc0, 0x78, 0x93, 0x68, 0x20, 0x2c, 0x61, 0x90, 0x26, - 0x11, 0xc9, 0x5b, 0x00, 0xfc, 0x6f, 0xed, 0xac, 0xc0, 0xcd, 0x52, 0x90, 0x25, 0x8e, 0x0b, 0x0d, - 0x19, 0x43, 0x08, 0x36, 0x7c, 0xe5, 0x6e, 0xc8, 0x43, 0x08, 0x32, 0x80, 0x11, 0x42, 0x90, 0x01, - 0xac, 0x5f, 0x2b, 0xc0, 0xd9, 0xc1, 0xf7, 0x46, 0x72, 0xd7, 0x1c, 0x82, 0x57, 0x87, 0xba, 0x6d, - 0x1e, 0x3d, 0x06, 0x32, 0x20, 0x27, 0xef, 0x90, 0x8b, 0x69, 0x33, 0xf8, 0x8f, 0x0f, 0xcb, 0x9a, - 0x95, 0xe3, 0x2d, 0xdf, 0xeb, 0x68, 0xaf, 0x12, 0xdf, 0x02, 0xa8, 0x47, 0x6e, 0xe4, 0x35, 0x6e, - 0xdd, 0xbf, 0x2d, 0xe3, 0x55, 0x5c, 0x1f, 0xee, 0xcb, 0x62, 0x3a, 0xbe, 0xaf, 0x08, 0x85, 0x3d, - 0x42, 0x9d, 0x8f, 0xf6, 0x1f, 0x18, 0x37, 0xe3, 0x18, 0xf9, 0xf4, 0x97, 0xa0, 0x94, 0x24, 0x25, - 0x17, 0x60, 0x04, 0x3f, 0x40, 0xb3, 0xe5, 0x4f, 0x70, 0xc0, 0xf2, 0xd3, 0x77, 0xc4, 0xdc, 0x41, - 0xff, 0x68, 0x7c, 0x0a, 0x37, 0x75, 0x70, 0xc2, 0x3f, 0x9a, 0xbf, 0xa4, 0xa7, 0xf5, 0x70, 0x09, - 0x22, 0xeb, 0x4f, 0x72, 0x70, 0xaa, 0xef, 0x8d, 0x9c, 0x6c, 0x9a, 0x03, 0xf6, 0xf2, 0x51, 0x57, - 0xf8, 0x23, 0xc7, 0xea, 0xf4, 0x8f, 0xcb, 0xb9, 0xff, 0x1e, 0x4c, 0xd5, 0x7b, 0xdb, 0xc9, 0x4b, - 0x16, 0x8f, 0x5e, 0xa0, 0xc1, 0xf5, 0x13, 0x4c, 0xc7, 0x67, 0xed, 0x97, 0x6f, 0xfd, 0xc2, 0xa6, - 0x44, 0xb3, 0xaf, 0x52, 0x0e, 0x7c, 0x69, 0xff, 0x70, 0x93, 0xc8, 0xfa, 0x95, 0x7c, 0xf6, 0x6d, - 0x95, 0xdd, 0xee, 0x9f, 0xe0, 0xb6, 0x7a, 0x73, 0x79, 0xf3, 0xe8, 0xb6, 0xff, 0x17, 0xb2, 0xed, - 0xf8, 0xf4, 0x29, 0x76, 0x3c, 0xa9, 0x50, 0x14, 0x4f, 0x9f, 0x72, 0x77, 0x0c, 0xcd, 0xa7, 0x4f, - 0x89, 0x4c, 0xde, 0x84, 0x89, 0x35, 0x9f, 0xbb, 0x6e, 0xcb, 0x16, 0x73, 0x0f, 0x37, 0x09, 0xd4, - 0xb7, 0x47, 0x85, 0xc9, 0xee, 0x16, 0xe6, 0xc0, 0x4b, 0x33, 0x32, 0xbc, 0x5b, 0x24, 0xa6, 0x8b, - 0xa9, 0x76, 0x33, 0xc9, 0xac, 0xff, 0x78, 0x14, 0xac, 0xa3, 0x95, 0x06, 0xe4, 0x43, 0xb3, 0xef, - 0x2e, 0x0f, 0xad, 0x6e, 0x18, 0x6a, 0xcb, 0xad, 0xf4, 0x9a, 0x1e, 0xed, 0x34, 0x4c, 0xbf, 0x6b, - 0x01, 0xd3, 0xb7, 0x40, 0x89, 0xf7, 0x49, 0xdc, 0xa0, 0x4e, 0xff, 0x97, 0x85, 0x78, 0xa9, 0x25, - 0x8e, 0xc6, 0xdc, 0x27, 0x38, 0x1a, 0xc9, 0x6d, 0x28, 0xe9, 0x10, 0xed, 0x0d, 0x14, 0x25, 0x17, - 0x83, 0x51, 0xe2, 0xa3, 0x52, 0x84, 0xe6, 0xf9, 0x5a, 0x18, 0xfe, 0x7c, 0x8d, 0xc5, 0x77, 0xac, - 0x7f, 0x24, 0x2d, 0xbe, 0x27, 0x5d, 0x1d, 0x35, 0x74, 0xe9, 0xa7, 0x1d, 0x8a, 0x43, 0x6b, 0xd4, - 0xf4, 0xd3, 0xce, 0x38, 0xb8, 0x74, 0x74, 0xe9, 0x6a, 0x8e, 0x3f, 0x35, 0x4f, 0x4b, 0xe5, 0x6a, - 0xce, 0xe9, 0xb3, 0x5c, 0xcd, 0x15, 0x09, 0x3b, 0x00, 0xed, 0x5e, 0x87, 0xc7, 0xaa, 0x1d, 0x8f, - 0x0f, 0xc0, 0xa0, 0xd7, 0x71, 0x92, 0xf1, 0x6a, 0x15, 0xa2, 0xf5, 0xe3, 0x79, 0x98, 0xe1, 0x1b, - 0x2e, 0x7f, 0xca, 0x78, 0x66, 0x9f, 0x89, 0xde, 0x36, 0x9e, 0x89, 0x64, 0x70, 0x1e, 0xbd, 0x69, - 0x43, 0x3d, 0x12, 0xed, 0x01, 0x49, 0xd3, 0x10, 0x1b, 0xa6, 0x74, 0xe8, 0xe0, 0xf7, 0xa1, 0xab, - 0x71, 0x1c, 0x27, 0x71, 0xde, 0xe1, 0x23, 0x5d, 0x68, 0x1b, 0x3c, 0xac, 0xbf, 0x9a, 0x87, 0x69, - 0xed, 0x39, 0xff, 0x99, 0xed, 0xf8, 0x2f, 0x19, 0x1d, 0xbf, 0xa0, 0xdc, 0x3d, 0x54, 0xcb, 0x86, - 0xea, 0xf7, 0x1e, 0xcc, 0xa5, 0x48, 0x92, 0x56, 0x11, 0xb9, 0x61, 0xac, 0x22, 0x5e, 0x4f, 0x07, - 0x85, 0xe1, 0xb1, 0x95, 0x55, 0x88, 0x00, 0x3d, 0x0a, 0xcd, 0x4f, 0xe4, 0xe1, 0x98, 0xf8, 0x85, - 0x51, 0xd4, 0xb8, 0xc4, 0xf1, 0xcc, 0x8e, 0x45, 0xc5, 0x18, 0x8b, 0xb2, 0x39, 0x16, 0x5a, 0x03, - 0xfb, 0x0f, 0x89, 0xf5, 0x97, 0x00, 0x16, 0xfa, 0x11, 0x0c, 0xed, 0x55, 0x19, 0xfb, 0xac, 0xe4, - 0x87, 0xf0, 0x59, 0x59, 0x83, 0x12, 0x56, 0x25, 0xe2, 0x24, 0x85, 0xec, 0xde, 0x5a, 0x88, 0x2f, - 0x89, 0x3c, 0xd4, 0x9d, 0x88, 0xdb, 0x14, 0x26, 0x2e, 0xae, 0x29, 0x4a, 0xf2, 0x4b, 0x39, 0x98, - 0x41, 0xe0, 0xca, 0x43, 0xda, 0x89, 0x90, 0xd9, 0x88, 0x70, 0xb1, 0x50, 0xaf, 0x48, 0xf5, 0x28, - 0xf0, 0x3a, 0xbb, 0xe2, 0x19, 0x69, 0x5b, 0x3c, 0x23, 0xbd, 0xc3, 0x9f, 0xbf, 0x2e, 0x37, 0xfc, - 0xf6, 0x95, 0xdd, 0xc0, 0x7d, 0xe8, 0x71, 0x4b, 0x15, 0xb7, 0x75, 0x25, 0x0e, 0xed, 0xdf, 0xf5, - 0x12, 0xc1, 0xfa, 0x05, 0x2b, 0x7c, 0xa2, 0xe3, 0x1f, 0x4a, 0xb1, 0xda, 0xe4, 0xfd, 0xda, 0xfc, - 0x22, 0xf2, 0x43, 0x70, 0x92, 0x47, 0x2f, 0x61, 0xd7, 0x34, 0xaf, 0xd3, 0xf3, 0x7b, 0xe1, 0x92, - 0xdb, 0x78, 0xc0, 0x64, 0x35, 0xee, 0x26, 0x86, 0x2d, 0x6f, 0xa8, 0x42, 0x67, 0x9b, 0x97, 0x1a, - 0x6e, 0xb1, 0xd9, 0x0c, 0xc8, 0x2a, 0xcc, 0xf1, 0xa2, 0x4a, 0x2f, 0xf2, 0xeb, 0x0d, 0xb7, 0xe5, - 0x75, 0x76, 0xf1, 0x40, 0x28, 0xf2, 0xf3, 0xc8, 0xed, 0x45, 0xbe, 0x13, 0x72, 0xb8, 0x7e, 0xdd, - 0x4e, 0x11, 0x91, 0x1a, 0xcc, 0xda, 0xd4, 0x6d, 0xde, 0x71, 0x1f, 0x2d, 0xbb, 0x5d, 0xb7, 0xc1, - 0x2e, 0xef, 0x45, 0x7c, 0x72, 0xc5, 0x53, 0x39, 0xa0, 0x6e, 0xd3, 0x69, 0xbb, 0x8f, 0x9c, 0x86, - 0x28, 0x34, 0xf5, 0xae, 0x06, 0x9d, 0x62, 0xe5, 0x75, 0x14, 0xab, 0x89, 0x24, 0x2b, 0xaf, 0xd3, - 0x9f, 0x55, 0x4c, 0x27, 0x59, 0x6d, 0xb9, 0xc1, 0x2e, 0x8d, 0xb8, 0xa1, 0x27, 0x9c, 0xcb, 0x5d, - 0xcc, 0x69, 0xac, 0x22, 0x2c, 0x73, 0xd0, 0xe8, 0x33, 0xc9, 0x4a, 0xa3, 0x63, 0x33, 0xef, 0x7e, - 0xe0, 0x45, 0x54, 0x6f, 0xe1, 0x24, 0x7e, 0x16, 0xf6, 0x3f, 0x9a, 0xc8, 0xf6, 0x6b, 0x62, 0x8a, - 0x32, 0xe6, 0xa6, 0x35, 0x72, 0x2a, 0xc5, 0x2d, 0xbb, 0x95, 0x29, 0x4a, 0xc5, 0x4d, 0x6f, 0xe7, - 0x34, 0xb6, 0x53, 0xe3, 0xd6, 0xa7, 0xa1, 0x29, 0x4a, 0xb2, 0xce, 0x3a, 0x2d, 0xa2, 0x1d, 0x36, - 0xa3, 0x85, 0xa1, 0xeb, 0x0c, 0x7e, 0xda, 0x4b, 0xc2, 0x5a, 0xab, 0x14, 0xc8, 0x62, 0x27, 0xc3, - 0xec, 0x35, 0x49, 0x4c, 0xfe, 0x1c, 0xcc, 0xde, 0x0d, 0xe9, 0x8d, 0xda, 0x66, 0x5d, 0x06, 0x3b, - 0x41, 0x0d, 0xd1, 0xcc, 0xe2, 0xd5, 0x23, 0x36, 0x9d, 0xcb, 0x3a, 0x0d, 0x46, 0xd8, 0xe7, 0xe3, - 0xd6, 0x0b, 0xa9, 0xb3, 0xe3, 0x75, 0x43, 0x15, 0x39, 0x4a, 0x1f, 0xb7, 0x44, 0x55, 0xd6, 0x2a, - 0xcc, 0xa5, 0xd8, 0x90, 0x19, 0x00, 0x06, 0x74, 0xee, 0xae, 0xd7, 0x57, 0xb6, 0x4a, 0xcf, 0x91, - 0x12, 0x4c, 0xe1, 0xef, 0x95, 0xf5, 0xca, 0xd2, 0xda, 0x4a, 0xb5, 0x94, 0x23, 0x73, 0x30, 0x8d, - 0x90, 0x6a, 0xad, 0xce, 0x41, 0x79, 0x1e, 0x5f, 0xd9, 0x2e, 0xf1, 0xa5, 0x1b, 0xb1, 0x05, 0x80, - 0x67, 0x8a, 0xf5, 0x37, 0xf2, 0x70, 0x4a, 0x1e, 0x2b, 0x34, 0x62, 0x22, 0x98, 0xd7, 0xd9, 0x7d, - 0xc6, 0x4f, 0x87, 0x1b, 0xc6, 0xe9, 0xf0, 0x52, 0xe2, 0xa4, 0x4e, 0xb4, 0x72, 0xc0, 0x11, 0xf1, - 0x9b, 0x13, 0x70, 0x66, 0x20, 0x15, 0xf9, 0x32, 0x3b, 0xcd, 0x3d, 0xda, 0x89, 0x6a, 0xcd, 0x16, - 0xdd, 0xf2, 0xda, 0xd4, 0xef, 0x45, 0xc2, 0xb0, 0xfa, 0x3c, 0x2a, 0x65, 0xb0, 0xd0, 0xf1, 0x9a, - 0x2d, 0xea, 0x44, 0xbc, 0xd8, 0x98, 0x6e, 0x69, 0x6a, 0xc6, 0x52, 0x65, 0xfb, 0xa8, 0x75, 0x22, - 0x1a, 0x3c, 0x44, 0x13, 0x2e, 0xc5, 0xf2, 0x01, 0xa5, 0x5d, 0xc7, 0x65, 0xa5, 0x8e, 0x27, 0x8a, - 0x4d, 0x96, 0x29, 0x6a, 0x72, 0x43, 0x63, 0xb9, 0xcc, 0xae, 0x70, 0x77, 0xdc, 0x47, 0xc2, 0xa6, - 0x44, 0x04, 0xcf, 0x53, 0x2c, 0xb9, 0x27, 0x67, 0xdb, 0x7d, 0x64, 0xa7, 0x49, 0xc8, 0xd7, 0xe1, - 0xb8, 0x38, 0x80, 0x84, 0x27, 0xbe, 0x6c, 0x31, 0xf7, 0xf3, 0x7f, 0xe5, 0xf1, 0x61, 0xf9, 0xa4, - 0x0c, 0x3b, 0x28, 0x63, 0x2f, 0x64, 0xb5, 0x3a, 0x9b, 0x0b, 0xd9, 0x62, 0x07, 0x72, 0xa2, 0x3b, - 0xee, 0xd0, 0x30, 0x94, 0x2e, 0x46, 0xe2, 0x7a, 0xa3, 0x77, 0xa6, 0xd3, 0xe6, 0xe5, 0x76, 0x5f, - 0x4a, 0xb2, 0x0a, 0x33, 0xf7, 0xe9, 0xb6, 0x3e, 0x3e, 0x63, 0x6a, 0xab, 0x2a, 0xed, 0xd3, 0xed, - 0xfe, 0x83, 0x93, 0xa0, 0x23, 0x1e, 0x2a, 0x79, 0x1f, 0x1d, 0xac, 0x79, 0x61, 0x44, 0x3b, 0x34, - 0xc0, 0x08, 0x2f, 0xe3, 0xb8, 0x19, 0x2c, 0xc4, 0x12, 0xb2, 0x59, 0xbe, 0xf4, 0xe2, 0xe3, 0xc3, - 0xf2, 0x19, 0xee, 0xab, 0xd7, 0x12, 0x70, 0x27, 0x91, 0x2b, 0x23, 0xcd, 0x95, 0x7c, 0x13, 0x66, - 0x6d, 0xbf, 0x17, 0x79, 0x9d, 0xdd, 0x7a, 0x14, 0xb8, 0x11, 0xdd, 0xe5, 0x07, 0x52, 0x1c, 0x4a, - 0x26, 0x51, 0x2a, 0xde, 0x07, 0x39, 0xd0, 0x09, 0x05, 0xd4, 0x38, 0x11, 0x4c, 0x02, 0xf2, 0x0d, - 0x98, 0xe1, 0x3e, 0xd8, 0xaa, 0x82, 0x09, 0x23, 0xce, 0xb7, 0x59, 0x78, 0xef, 0xaa, 0x30, 0x01, - 0x40, 0x68, 0x56, 0x05, 0x09, 0x6e, 0xe4, 0xab, 0xa2, 0xb3, 0x36, 0xbd, 0xce, 0xae, 0x9a, 0xc6, - 0x80, 0x3d, 0xff, 0x46, 0xdc, 0x25, 0x5d, 0xf6, 0xb9, 0x72, 0x1a, 0xf7, 0xb1, 0x67, 0x4a, 0xf3, - 0x21, 0x11, 0x9c, 0xa9, 0x84, 0xa1, 0x17, 0x46, 0xc2, 0xfd, 0x60, 0xe5, 0x11, 0x6d, 0xf4, 0x18, - 0x32, 0xbb, 0x28, 0xd2, 0x80, 0x1b, 0xc0, 0x8e, 0x2e, 0x5d, 0x7e, 0x7c, 0x58, 0x7e, 0xd5, 0x45, - 0x44, 0x47, 0x78, 0x2c, 0x38, 0x54, 0xa2, 0x3a, 0xfb, 0x1c, 0x57, 0x6b, 0xc3, 0x60, 0xa6, 0xe4, - 0x1b, 0x70, 0x62, 0xd9, 0x0d, 0x69, 0xad, 0x13, 0xd2, 0x4e, 0xe8, 0x45, 0xde, 0x43, 0x2a, 0x3a, - 0x15, 0x0f, 0xbf, 0x22, 0x66, 0x15, 0xb1, 0x1a, 0x6e, 0xc8, 0x16, 0xa6, 0x42, 0x71, 0xc4, 0xa0, - 0x68, 0xd5, 0xf4, 0xe1, 0x42, 0x6c, 0x98, 0xa9, 0xd7, 0x57, 0xab, 0x9e, 0xab, 0xd6, 0xd5, 0x34, - 0xf6, 0xd7, 0xab, 0xa8, 0x9f, 0x09, 0xf7, 0x9c, 0xa6, 0xe7, 0xaa, 0x05, 0xd5, 0xa7, 0xb3, 0x12, - 0x1c, 0xac, 0xc3, 0x1c, 0x94, 0x92, 0x43, 0x49, 0xbe, 0x02, 0x13, 0xdc, 0x18, 0x88, 0x86, 0x7b, - 0xc2, 0x25, 0x59, 0xda, 0x96, 0x28, 0xb8, 0x49, 0x24, 0xdc, 0x81, 0xb8, 0xa9, 0x11, 0xd5, 0xed, - 0x16, 0xd0, 0x1d, 0x48, 0x12, 0x91, 0x26, 0x4c, 0xf1, 0xd1, 0xa2, 0x18, 0x47, 0x4a, 0xd8, 0x84, - 0xbe, 0xa8, 0xaf, 0x0e, 0x51, 0x94, 0xe0, 0x8f, 0x4f, 0x3f, 0x62, 0x4e, 0x70, 0x04, 0xa3, 0x0a, - 0x83, 0xeb, 0x12, 0x40, 0x51, 0x12, 0x5a, 0xa7, 0xe0, 0x64, 0x9f, 0x6f, 0xb6, 0x1e, 0xe2, 0x73, - 0x70, 0x9f, 0x1a, 0xc9, 0x57, 0xe0, 0x18, 0x12, 0x2e, 0xfb, 0x9d, 0x0e, 0x6d, 0x44, 0xb8, 0x1d, - 0x49, 0x15, 0x6a, 0x81, 0xdb, 0x1c, 0xf0, 0xf6, 0x36, 0x14, 0x82, 0x93, 0xd4, 0xa4, 0x66, 0x72, - 0xb0, 0x7e, 0x36, 0x0f, 0x0b, 0x62, 0x87, 0xb3, 0x69, 0xc3, 0x0f, 0x9a, 0xcf, 0xfe, 0x89, 0xba, - 0x62, 0x9c, 0xa8, 0xe7, 0x55, 0x0c, 0x8a, 0xac, 0x46, 0x0e, 0x38, 0x50, 0x7f, 0x25, 0x07, 0x2f, - 0x0c, 0x22, 0x62, 0xbd, 0xa3, 0xe2, 0x66, 0x4d, 0xa4, 0xe2, 0x63, 0x75, 0x61, 0x1e, 0x07, 0x74, - 0x79, 0x8f, 0x36, 0x1e, 0x84, 0xab, 0x7e, 0x18, 0xa1, 0x49, 0x7a, 0xbe, 0xcf, 0x83, 0xe5, 0xeb, - 0x99, 0x0f, 0x96, 0x27, 0xf8, 0x2c, 0x6b, 0x20, 0x0f, 0x1e, 0xd9, 0xeb, 0x01, 0x3d, 0x08, 0xed, - 0x2c, 0xd6, 0x68, 0x5e, 0x5c, 0xe9, 0x45, 0x7b, 0x9b, 0x01, 0xdd, 0xa1, 0x01, 0xed, 0x34, 0xe8, - 0x0f, 0x98, 0x79, 0xb1, 0xd9, 0xb8, 0xa1, 0x34, 0x18, 0xbf, 0x32, 0x05, 0xc7, 0xb2, 0xc8, 0x58, - 0xbf, 0x68, 0x97, 0xe6, 0x64, 0xd2, 0xb3, 0xbf, 0x98, 0x83, 0xa9, 0x3a, 0x6d, 0xf8, 0x9d, 0xe6, - 0x0d, 0x34, 0x0b, 0x11, 0xbd, 0xe3, 0x70, 0xa1, 0x81, 0xc1, 0x9d, 0x9d, 0x84, 0xbd, 0xc8, 0xc7, - 0x87, 0xe5, 0x0f, 0x86, 0xbb, 0xab, 0x36, 0x7c, 0x8c, 0x23, 0x11, 0x61, 0x50, 0x6e, 0x55, 0x05, - 0xbe, 0xf0, 0x18, 0x95, 0x92, 0x25, 0x98, 0x16, 0xcb, 0xd5, 0xd7, 0xc3, 0xa6, 0xf1, 0x30, 0x1d, - 0xb2, 0x20, 0xa5, 0x7f, 0x34, 0x48, 0xc8, 0x35, 0x28, 0xdc, 0x5d, 0xbc, 0x21, 0xc6, 0x40, 0x86, - 0x35, 0xbf, 0xbb, 0x78, 0x03, 0xd5, 0x61, 0xec, 0x8a, 0x31, 0xdd, 0x5b, 0x34, 0x2c, 0x35, 0xee, - 0x2e, 0xde, 0x20, 0x7f, 0x01, 0x8e, 0x57, 0xbd, 0x50, 0x54, 0xc1, 0x0d, 0xdd, 0x9b, 0xe8, 0xd8, - 0x35, 0xd6, 0x67, 0xf6, 0x7e, 0x21, 0x73, 0xf6, 0xbe, 0xd8, 0x54, 0x4c, 0x1c, 0x6e, 0x45, 0xdf, - 0x4c, 0x86, 0x87, 0xcb, 0xae, 0x87, 0x7c, 0x04, 0x33, 0xa8, 0x3b, 0x47, 0xdb, 0x7f, 0x0c, 0xec, - 0x3b, 0xde, 0xa7, 0xe6, 0xcf, 0x65, 0xd6, 0x7c, 0x9a, 0xbb, 0x87, 0xa3, 0x07, 0x01, 0x06, 0x01, - 0x36, 0x6e, 0xfd, 0x06, 0x67, 0x72, 0x0b, 0x66, 0x85, 0xf8, 0xb5, 0xb1, 0xb3, 0xb5, 0x47, 0xab, - 0xee, 0x81, 0x30, 0xb2, 0xc0, 0x1b, 0x9d, 0x90, 0xd9, 0x1c, 0x7f, 0xc7, 0x89, 0xf6, 0xa8, 0xd3, - 0x74, 0x0d, 0x41, 0x25, 0x41, 0x48, 0x7e, 0x18, 0x26, 0xd7, 0xfc, 0x06, 0x93, 0xbc, 0x71, 0x67, - 0xe0, 0x76, 0x17, 0x1f, 0x62, 0x5a, 0x2d, 0x0e, 0x4e, 0x88, 0x53, 0x1f, 0x1f, 0x96, 0xdf, 0x7e, - 0xd2, 0x49, 0xa3, 0x55, 0x60, 0xeb, 0xb5, 0x91, 0x65, 0x28, 0xde, 0xa7, 0xdb, 0xac, 0xb5, 0xc9, - 0x94, 0x3b, 0x12, 0x2c, 0xcc, 0xaa, 0xc4, 0x2f, 0xc3, 0xac, 0x4a, 0xc0, 0x48, 0x00, 0x73, 0xd8, - 0x3f, 0x9b, 0x6e, 0x18, 0xee, 0xfb, 0x41, 0x13, 0x63, 0xab, 0xf7, 0x33, 0xe9, 0x58, 0xcc, 0xec, - 0xfc, 0x17, 0x78, 0xe7, 0x77, 0x35, 0x0e, 0xba, 0x00, 0x99, 0x62, 0x4f, 0xbe, 0x09, 0x33, 0xc2, - 0xa7, 0xf9, 0xce, 0x8d, 0x0a, 0xae, 0xca, 0x29, 0xc3, 0x3d, 0xce, 0x2c, 0xe4, 0x52, 0xaa, 0x70, - 0x91, 0x96, 0x1a, 0x28, 0xa7, 0xbd, 0xe3, 0x9a, 0xaf, 0x66, 0x3a, 0x09, 0xd9, 0x84, 0xc9, 0x2a, - 0x7d, 0xe8, 0x35, 0x28, 0x3a, 0xf1, 0x08, 0x23, 0x5a, 0x95, 0x33, 0x24, 0x2e, 0xe1, 0xba, 0x98, - 0x26, 0x02, 0xb8, 0x4b, 0x90, 0x69, 0x35, 0xa9, 0x10, 0xc9, 0x75, 0x28, 0xd4, 0xaa, 0x9b, 0xc2, - 0x86, 0x56, 0xfa, 0xc6, 0xd4, 0x9a, 0x9b, 0x32, 0xc3, 0x02, 0x1a, 0x41, 0x79, 0x4d, 0xc3, 0x02, - 0xb7, 0x56, 0xdd, 0x24, 0x3b, 0x30, 0x8d, 0x1d, 0xb0, 0x4a, 0x5d, 0xde, 0xb7, 0xb3, 0x7d, 0xfa, - 0xf6, 0x72, 0x66, 0xdf, 0x2e, 0xf0, 0xbe, 0xdd, 0x13, 0xd4, 0x46, 0xc8, 0x78, 0x9d, 0x2d, 0x13, - 0x69, 0x45, 0x1a, 0x0b, 0x19, 0xe8, 0x7c, 0x6b, 0x0d, 0x8d, 0x3c, 0x84, 0x48, 0x2b, 0xb3, 0x5e, - 0xa8, 0xc8, 0xeb, 0x7d, 0x4d, 0xf4, 0xd3, 0x7c, 0xc8, 0x97, 0x60, 0x64, 0xe3, 0x41, 0xe4, 0x2e, - 0xcc, 0x19, 0xfd, 0xc8, 0x40, 0xb2, 0xf9, 0xa8, 0x85, 0xf4, 0x1f, 0x18, 0x01, 0x84, 0x90, 0x86, - 0x2c, 0xc2, 0xf8, 0x66, 0xed, 0x5e, 0xbd, 0xe5, 0x47, 0x0b, 0x44, 0xdd, 0x93, 0x48, 0xd7, 0x7b, - 0xe8, 0x84, 0x2d, 0xdf, 0x4c, 0x85, 0x23, 0x11, 0xd9, 0xf0, 0xad, 0xba, 0x41, 0x73, 0xdf, 0x0d, - 0xd0, 0xf7, 0x72, 0xde, 0xa8, 0x56, 0x2b, 0xe1, 0xc3, 0xb7, 0x27, 0x00, 0x09, 0x87, 0x4c, 0x9d, - 0x85, 0xd0, 0x30, 0xcc, 0x89, 0x69, 0x22, 0x9a, 0x76, 0xe7, 0x46, 0xc5, 0xfa, 0xcf, 0x72, 0xb8, - 0x61, 0x92, 0x57, 0x31, 0xc6, 0x88, 0x7a, 0x3a, 0x43, 0x5d, 0xa9, 0xdb, 0x4d, 0x44, 0xf5, 0xe5, - 0x28, 0xe4, 0x75, 0x18, 0xbb, 0xe1, 0x36, 0x68, 0x24, 0x1f, 0x38, 0x11, 0x79, 0x07, 0x21, 0xba, - 0x62, 0x95, 0xe3, 0x30, 0x59, 0x8e, 0x4f, 0xa4, 0x4a, 0x9c, 0x83, 0x74, 0xb9, 0x22, 0xdf, 0x37, - 0x51, 0x96, 0x13, 0x13, 0x50, 0x4b, 0x52, 0x9a, 0xb0, 0x05, 0xce, 0xe4, 0x60, 0xfd, 0x71, 0x2e, - 0xde, 0x01, 0xc8, 0x2b, 0x30, 0x62, 0x6f, 0xaa, 0xef, 0xe7, 0x7e, 0x88, 0x89, 0xcf, 0x47, 0x04, - 0xf2, 0x55, 0x38, 0xae, 0xf1, 0x49, 0x19, 0x26, 0xbf, 0x8c, 0x8e, 0x72, 0xda, 0x97, 0x64, 0x5b, - 0x27, 0x67, 0xf3, 0x40, 0xc1, 0x35, 0x2e, 0xa8, 0xd2, 0x8e, 0xc7, 0x79, 0x6b, 0x8d, 0xd5, 0x79, - 0x37, 0x11, 0x21, 0xd9, 0xd8, 0x2c, 0x0e, 0xdc, 0x57, 0xce, 0xfa, 0x8d, 0x9c, 0xb1, 0xb2, 0x55, - 0xb2, 0xc7, 0xdc, 0x11, 0xc9, 0x1e, 0xdf, 0x02, 0xa8, 0xf4, 0x22, 0x7f, 0xa5, 0x13, 0xf8, 0x2d, - 0xae, 0xb1, 0x10, 0x81, 0xad, 0x51, 0x0f, 0x4b, 0x11, 0x6c, 0xb8, 0xf4, 0x28, 0xe4, 0x4c, 0x1b, - 0xee, 0xc2, 0x27, 0xb5, 0xe1, 0xb6, 0x7e, 0x37, 0x67, 0xcc, 0x6d, 0x26, 0x91, 0xc9, 0xe5, 0xa1, - 0x99, 0xd8, 0xa4, 0x97, 0x47, 0xbc, 0x38, 0xfe, 0xff, 0x39, 0x38, 0xc1, 0x8d, 0xa1, 0xd7, 0x7b, - 0xed, 0x6d, 0x1a, 0xdc, 0x73, 0x5b, 0x5e, 0x93, 0xfb, 0x82, 0x72, 0x61, 0xf3, 0x62, 0x7a, 0xa1, - 0x64, 0xe3, 0xf3, 0x4b, 0x21, 0x37, 0xce, 0x76, 0x3a, 0x58, 0xe8, 0x3c, 0x54, 0xa5, 0xfa, 0xa5, - 0x30, 0x9b, 0xde, 0xfa, 0xd5, 0x1c, 0xbc, 0x78, 0x64, 0x2d, 0xe4, 0x0a, 0x8c, 0xcb, 0x88, 0xe2, - 0x39, 0xec, 0x78, 0x34, 0x4c, 0x4c, 0x47, 0x13, 0x97, 0x58, 0xe4, 0x6b, 0x70, 0x5c, 0x67, 0xb5, - 0x15, 0xb8, 0x9e, 0x1e, 0xb7, 0x3b, 0xe3, 0xab, 0x23, 0x86, 0x92, 0x94, 0x8c, 0xb2, 0x99, 0x58, - 0xff, 0x4f, 0x4e, 0x4b, 0xff, 0xfa, 0x8c, 0xca, 0xcb, 0xd7, 0x0d, 0x79, 0x59, 0x46, 0x77, 0x53, - 0xad, 0x62, 0x65, 0x99, 0x77, 0x9c, 0x59, 0xcd, 0xc0, 0x16, 0x01, 0xdf, 0xcd, 0xc3, 0xe4, 0xdd, - 0x90, 0x06, 0xfc, 0xd1, 0xf4, 0x07, 0x2b, 0x8a, 0x97, 0x6a, 0xd7, 0x50, 0x71, 0x96, 0xfe, 0x30, - 0x87, 0xca, 0x74, 0x9d, 0x82, 0xf5, 0x86, 0x96, 0xf2, 0x09, 0x7b, 0x03, 0x93, 0x3d, 0x21, 0x94, - 0x87, 0xf7, 0x59, 0x33, 0xb3, 0xbf, 0x61, 0x0a, 0xc0, 0x35, 0xf2, 0x01, 0x8c, 0xde, 0x45, 0xd5, - 0xa0, 0xe9, 0xf7, 0xaf, 0xf8, 0x63, 0x21, 0xdf, 0xa4, 0x7b, 0xa1, 0x19, 0x92, 0x88, 0x13, 0x92, - 0x3a, 0x8c, 0x2f, 0x07, 0x14, 0x93, 0xb9, 0x8e, 0x0c, 0xef, 0xbb, 0xda, 0xe0, 0x24, 0x49, 0xdf, - 0x55, 0xc1, 0xc9, 0xfa, 0x99, 0x3c, 0x90, 0xb8, 0x8d, 0x98, 0xb9, 0x24, 0x7c, 0x66, 0x07, 0xfd, - 0x7d, 0x63, 0xd0, 0xcf, 0xa4, 0x06, 0x9d, 0x37, 0x6f, 0xa8, 0xb1, 0xff, 0xad, 0x1c, 0x9c, 0xc8, - 0x26, 0x24, 0xe7, 0x61, 0x6c, 0x63, 0x6b, 0x53, 0x86, 0x8e, 0x10, 0x4d, 0xf1, 0xbb, 0x78, 0x2f, - 0xb7, 0x45, 0x11, 0x79, 0x03, 0xc6, 0xbe, 0x6c, 0x2f, 0xb3, 0x73, 0x48, 0x8b, 0x8d, 0xfd, 0xad, - 0xc0, 0x69, 0x98, 0x47, 0x91, 0x40, 0xd2, 0xc7, 0xb6, 0xf0, 0xd4, 0xc6, 0xf6, 0x27, 0xf2, 0x30, - 0x5b, 0x69, 0x34, 0x68, 0x18, 0x32, 0x21, 0x87, 0x86, 0xd1, 0x33, 0x3b, 0xb0, 0xd9, 0x41, 0x21, - 0x8c, 0xb6, 0x0d, 0x35, 0xaa, 0xbf, 0x93, 0x83, 0xe3, 0x92, 0xea, 0xa1, 0x47, 0xf7, 0xb7, 0xf6, - 0x02, 0x1a, 0xee, 0xf9, 0xad, 0xe6, 0xd0, 0x01, 0xf8, 0x99, 0xa0, 0x87, 0x51, 0x75, 0xf5, 0x17, - 0xf4, 0x1d, 0x84, 0x18, 0x82, 0x1e, 0x8f, 0xbc, 0x7b, 0x05, 0xc6, 0x2b, 0xdd, 0x6e, 0xe0, 0x3f, - 0xe4, 0xcb, 0x5e, 0x04, 0x1d, 0x73, 0x39, 0xc8, 0x70, 0xfd, 0xe5, 0x20, 0xf6, 0x19, 0x55, 0xda, - 0xe1, 0xe1, 0xb4, 0xa6, 0xf9, 0x67, 0x34, 0x69, 0x47, 0x97, 0x61, 0xb1, 0xdc, 0xaa, 0x03, 0xd9, - 0x0c, 0xfc, 0xb6, 0x1f, 0xd1, 0x26, 0x6f, 0x0f, 0x7a, 0x4c, 0x1f, 0x19, 0x7e, 0x67, 0xcb, 0x8b, - 0x5a, 0x46, 0xf8, 0x9d, 0x88, 0x01, 0x6c, 0x0e, 0xb7, 0xfe, 0xcf, 0x51, 0x98, 0xd2, 0x7b, 0x87, - 0x58, 0x3c, 0xaa, 0xb6, 0x1f, 0xe8, 0x6e, 0xfb, 0x2e, 0x42, 0x6c, 0x51, 0x12, 0x47, 0xbb, 0xc8, - 0x1f, 0x19, 0xed, 0xe2, 0x3e, 0x4c, 0x6f, 0x06, 0x3e, 0x46, 0x47, 0xe3, 0x49, 0xbe, 0xf9, 0x56, - 0x38, 0xaf, 0xdd, 0xf1, 0xd8, 0x40, 0xe2, 0xdb, 0x23, 0x6a, 0x38, 0xba, 0x02, 0xdb, 0x49, 0xa6, - 0x00, 0x37, 0xf9, 0x70, 0xb3, 0x06, 0x37, 0x14, 0x21, 0x0e, 0x95, 0x59, 0x03, 0x83, 0x98, 0x66, - 0x0d, 0x0c, 0xa2, 0xaf, 0xb5, 0xd1, 0xa7, 0xb5, 0xd6, 0xc8, 0xcf, 0xe4, 0x60, 0xb2, 0xd2, 0xe9, - 0x88, 0x28, 0x1a, 0x47, 0xb8, 0x11, 0x7f, 0x4d, 0x58, 0x36, 0xbc, 0xfd, 0x89, 0x2c, 0x1b, 0x50, - 0x6e, 0x09, 0x51, 0x52, 0x8d, 0x2b, 0xd4, 0x6f, 0x39, 0xda, 0x77, 0x90, 0xb7, 0xa1, 0xa4, 0x26, - 0x79, 0xad, 0xd3, 0xa4, 0x8f, 0x28, 0xcf, 0x4a, 0x34, 0x2d, 0x82, 0x9b, 0xea, 0x92, 0x69, 0x12, - 0x91, 0x6c, 0x01, 0xb8, 0x6a, 0x76, 0x25, 0xd2, 0xab, 0xa5, 0xa7, 0x9f, 0x90, 0x9e, 0xf1, 0x37, - 0x3e, 0x1e, 0xe9, 0xd2, 0x73, 0xcc, 0x87, 0xb4, 0x61, 0x96, 0xe7, 0x36, 0xc3, 0x9c, 0xe7, 0x18, - 0xc3, 0x1b, 0x8e, 0x1c, 0x87, 0x57, 0x84, 0xae, 0xea, 0x79, 0x91, 0x31, 0x0d, 0xd3, 0xa8, 0x3b, - 0x19, 0x01, 0xbd, 0x93, 0xbc, 0x79, 0x28, 0x59, 0xfb, 0x64, 0xfa, 0x7b, 0xf9, 0xa4, 0xff, 0x89, - 0x1c, 0x9c, 0xd0, 0x27, 0x7d, 0xbd, 0xb7, 0xdd, 0xf6, 0xf0, 0x2e, 0x48, 0x2e, 0xc3, 0x84, 0x98, - 0x93, 0xea, 0x12, 0x95, 0x0e, 0x45, 0x1e, 0xa3, 0x90, 0x15, 0x36, 0x0d, 0x19, 0x0f, 0x21, 0x75, - 0xcf, 0x27, 0xf6, 0x29, 0x56, 0x14, 0xe7, 0xcd, 0x0c, 0xf0, 0xb7, 0x39, 0x3f, 0x19, 0xc4, 0x7a, - 0x0f, 0xe6, 0xcc, 0x91, 0xa8, 0xd3, 0x88, 0x5c, 0x82, 0x71, 0x39, 0x7c, 0xb9, 0xec, 0xe1, 0x93, - 0xe5, 0xd6, 0x7d, 0x20, 0x29, 0xfa, 0x10, 0x4d, 0x90, 0x68, 0x24, 0x4d, 0xe4, 0xe4, 0x03, 0x60, - 0x0a, 0x71, 0x69, 0x5e, 0x7c, 0xdf, 0xa4, 0x61, 0xc7, 0xcd, 0x48, 0xad, 0x3f, 0x9e, 0x81, 0xf9, - 0x8c, 0x3d, 0xf7, 0x08, 0x99, 0xa8, 0x6c, 0x6e, 0x10, 0x13, 0x2a, 0x0a, 0x81, 0xdc, 0x16, 0xde, - 0x93, 0x39, 0xff, 0x07, 0x6c, 0x07, 0xdc, 0x8a, 0x3f, 0xb1, 0x0b, 0x70, 0xb2, 0xcf, 0x44, 0x2e, - 0xd2, 0x03, 0x85, 0x8c, 0x3e, 0xb5, 0x40, 0x21, 0x4b, 0x30, 0x2d, 0x5a, 0x25, 0xb6, 0x2b, 0xcd, - 0x9a, 0x34, 0xe0, 0x05, 0x4e, 0x6a, 0xdb, 0x32, 0x49, 0x38, 0x8f, 0xd0, 0x6f, 0x3d, 0xa4, 0x82, - 0xc7, 0xb8, 0xce, 0x03, 0x0b, 0x32, 0x79, 0x68, 0x24, 0xe4, 0x3f, 0xc4, 0xbc, 0x4a, 0x08, 0xd1, - 0xf7, 0xac, 0xe2, 0xa0, 0x3d, 0xab, 0xf9, 0x74, 0xf6, 0xac, 0x33, 0xf2, 0x1b, 0xb3, 0xf7, 0xae, - 0x8c, 0xcf, 0x22, 0xbf, 0x9c, 0x83, 0x39, 0x1e, 0xad, 0x42, 0xff, 0xd8, 0x81, 0x11, 0x08, 0x1a, - 0x4f, 0xe7, 0x63, 0x5f, 0x10, 0xf9, 0x44, 0xb2, 0xbf, 0x35, 0xfd, 0x51, 0xe4, 0x87, 0x00, 0xd4, - 0x8a, 0xe2, 0xe1, 0x1c, 0x27, 0x17, 0x5f, 0xc8, 0xd8, 0x05, 0x14, 0x52, 0x1c, 0xfb, 0x3c, 0x52, - 0x74, 0x46, 0x36, 0x2d, 0x05, 0x25, 0x7f, 0x01, 0x8e, 0xb1, 0xf5, 0xa2, 0x20, 0x22, 0xb6, 0xce, - 0xc2, 0x24, 0xd6, 0xf2, 0xf9, 0xfe, 0x32, 0xd1, 0xe5, 0x2c, 0x32, 0x1e, 0xfc, 0x33, 0x4e, 0x6c, - 0x1a, 0xe9, 0x6e, 0xf8, 0x99, 0x15, 0x61, 0xb0, 0x2a, 0xfc, 0x7a, 0x1e, 0x9f, 0xbc, 0xcf, 0xfe, - 0x76, 0x4a, 0xae, 0x05, 0xbe, 0xbf, 0x85, 0xa6, 0x53, 0x27, 0x82, 0xc8, 0x97, 0x81, 0xa8, 0x30, - 0x0f, 0x1c, 0x46, 0x65, 0xec, 0x72, 0xae, 0xda, 0x8d, 0xc3, 0x45, 0x04, 0xb2, 0x58, 0x9f, 0x24, - 0x69, 0x62, 0x42, 0xe1, 0x98, 0x68, 0x34, 0x83, 0xca, 0xa4, 0x47, 0xe1, 0xc2, 0x8c, 0x11, 0xb9, - 0x28, 0x2e, 0x89, 0x33, 0xa0, 0x6a, 0x99, 0x93, 0x0c, 0x95, 0x53, 0x16, 0x3b, 0x72, 0x1d, 0x26, - 0xd0, 0xb3, 0x72, 0x55, 0x1a, 0x56, 0x09, 0x23, 0x0f, 0xf4, 0xc1, 0x74, 0xf6, 0x4c, 0xf3, 0xa8, - 0x18, 0x95, 0x5d, 0x07, 0xaa, 0xc1, 0x81, 0xdd, 0xeb, 0xa0, 0x02, 0x56, 0xe8, 0x3b, 0x9a, 0xc1, - 0x81, 0x13, 0xf4, 0x4c, 0xd7, 0x5b, 0x44, 0x22, 0xdf, 0x84, 0xc9, 0x3b, 0xee, 0x23, 0xa9, 0x7f, - 0x15, 0x4a, 0xd6, 0x41, 0x3b, 0x90, 0x25, 0x5b, 0xd3, 0x76, 0x1f, 0x39, 0xcd, 0x5e, 0x32, 0xf4, - 0x28, 0x6e, 0x43, 0x3a, 0x4b, 0xf2, 0x75, 0x00, 0x4d, 0x2b, 0x4c, 0x8e, 0xac, 0xe0, 0x45, 0x19, - 0x8b, 0x2b, 0x53, 0x5b, 0x8c, 0xfc, 0x35, 0x86, 0x09, 0xc9, 0xe1, 0xd8, 0x67, 0x27, 0x39, 0x1c, - 0xff, 0xec, 0x24, 0x87, 0xd3, 0xdb, 0x70, 0xaa, 0xef, 0xd2, 0xc9, 0x08, 0x90, 0x7a, 0xc5, 0x0c, - 0x90, 0x7a, 0xaa, 0xdf, 0x11, 0x1b, 0x9a, 0xe1, 0xee, 0xe7, 0x4b, 0xc7, 0xfa, 0x4b, 0x27, 0xdf, - 0xcf, 0x27, 0x8e, 0x5c, 0x71, 0xb1, 0xe0, 0xe9, 0x51, 0xfa, 0xc9, 0x24, 0x79, 0xcc, 0x88, 0xc9, - 0x0f, 0xe5, 0x7c, 0x7c, 0xa1, 0x49, 0x24, 0x11, 0xe7, 0xc7, 0xf3, 0xa7, 0x3d, 0x7d, 0xdf, 0x81, - 0x19, 0x9e, 0xc4, 0xee, 0x36, 0x3d, 0xd8, 0xf7, 0x83, 0xa6, 0xcc, 0x14, 0x8d, 0x32, 0x78, 0x2a, - 0x03, 0x6d, 0x02, 0x97, 0x54, 0xa5, 0xb3, 0xde, 0x28, 0xd6, 0x7e, 0x2a, 0x73, 0x17, 0x63, 0x08, - 0x83, 0xfc, 0xf8, 0xc8, 0x9b, 0x4a, 0x50, 0xa3, 0x81, 0x1e, 0xf4, 0x3e, 0x90, 0xc0, 0x0c, 0x79, - 0x8d, 0x06, 0xd6, 0xef, 0x17, 0x80, 0xf0, 0x9a, 0x96, 0xdd, 0xae, 0x8b, 0xae, 0xac, 0x1e, 0x06, - 0x81, 0x29, 0x09, 0x1c, 0x77, 0xbb, 0x45, 0xf5, 0x08, 0x4a, 0xc2, 0x90, 0x55, 0x95, 0x39, 0xc9, - 0x8b, 0x4e, 0x8a, 0xb0, 0xcf, 0x56, 0x97, 0xff, 0x34, 0x5b, 0xdd, 0x37, 0xe1, 0xf9, 0x4a, 0x17, - 0xb3, 0x61, 0xca, 0x5a, 0x6e, 0xf8, 0x81, 0xdc, 0xa4, 0x0c, 0x27, 0x29, 0x57, 0xa1, 0xa5, 0xbe, - 0x74, 0x10, 0x0b, 0x4d, 0x4e, 0x61, 0xf3, 0xb2, 0x1b, 0xe9, 0x4e, 0xf7, 0x52, 0x4e, 0xe9, 0x62, - 0x49, 0x86, 0x9c, 0xc2, 0x49, 0x24, 0x0f, 0x2f, 0x90, 0x72, 0x0a, 0xa6, 0x79, 0x89, 0x79, 0x78, - 0x01, 0xed, 0x23, 0xeb, 0x28, 0x12, 0xf2, 0x0e, 0x4c, 0x56, 0x7a, 0x91, 0x2f, 0x18, 0x0b, 0x0b, - 0xec, 0xd8, 0x56, 0x5a, 0x7c, 0x8a, 0x71, 0xf5, 0x89, 0xd1, 0xad, 0x3f, 0x2a, 0xc0, 0xa9, 0xf4, - 0xf0, 0x8a, 0x52, 0xb5, 0x3e, 0x72, 0x47, 0xac, 0x8f, 0xac, 0xd9, 0x90, 0x8f, 0x83, 0x90, 0x3f, - 0x8d, 0xd9, 0xc0, 0x93, 0x6a, 0x7e, 0xc2, 0xd9, 0x50, 0x87, 0x49, 0xfd, 0xbc, 0x1b, 0xf9, 0xa4, - 0xe7, 0x9d, 0xce, 0x85, 0x5d, 0xea, 0x79, 0xac, 0x81, 0xd1, 0xf8, 0xe9, 0x28, 0x19, 0x66, 0x80, - 0x63, 0x90, 0xff, 0x1f, 0x9c, 0xe3, 0x7b, 0x52, 0xb2, 0xb1, 0x4b, 0x07, 0x92, 0xa3, 0x18, 0xb8, - 0xc5, 0xc7, 0x87, 0xe5, 0xcb, 0x5c, 0x55, 0xe2, 0xa4, 0xba, 0xcd, 0xd9, 0x3e, 0x70, 0xe4, 0x97, - 0x69, 0x95, 0x1c, 0xc9, 0x1b, 0x33, 0x69, 0x6a, 0x59, 0x0e, 0xdf, 0xc8, 0x72, 0x4d, 0xe1, 0x31, - 0x80, 0x39, 0xd8, 0xf4, 0x4a, 0x91, 0xea, 0xb0, 0x7c, 0xa6, 0x3a, 0x4c, 0xea, 0x53, 0x0a, 0x99, - 0xfa, 0x94, 0x2a, 0xcc, 0xd6, 0x7b, 0xdb, 0xb2, 0xee, 0xa4, 0x6f, 0x5a, 0xd8, 0xdb, 0xce, 0x6a, - 0x50, 0x92, 0xc4, 0xfa, 0x2b, 0x79, 0x98, 0xda, 0x6c, 0xf5, 0x76, 0xbd, 0x4e, 0xd5, 0x8d, 0xdc, - 0x67, 0x56, 0x43, 0xf7, 0x96, 0xa1, 0xa1, 0x53, 0x1e, 0x58, 0xaa, 0x61, 0x43, 0xa9, 0xe7, 0x7e, - 0x3a, 0x07, 0xb3, 0x31, 0x09, 0x3f, 0x67, 0x57, 0x61, 0x84, 0xfd, 0x10, 0xf7, 0xd6, 0x73, 0x29, - 0xc6, 0x3c, 0xb5, 0x96, 0xfa, 0x4b, 0xe8, 0xcc, 0xcc, 0xbc, 0x35, 0xc8, 0xe1, 0xf4, 0x17, 0x60, - 0x22, 0x66, 0xfb, 0x24, 0x29, 0xb5, 0x7e, 0x2d, 0x07, 0xa5, 0x64, 0x4b, 0xc8, 0x6d, 0x18, 0x67, - 0x9c, 0x3c, 0x2a, 0xaf, 0xd4, 0x2f, 0xf5, 0x69, 0xf3, 0x65, 0x81, 0xc6, 0x3f, 0x0f, 0x3b, 0x9f, - 0x72, 0x88, 0x2d, 0x39, 0x9c, 0xb6, 0x61, 0x4a, 0xc7, 0xca, 0xf8, 0xba, 0xd7, 0x4d, 0xe1, 0xe2, - 0x44, 0x76, 0x3f, 0x18, 0x89, 0xc0, 0x8c, 0xaf, 0x16, 0x72, 0xc3, 0x05, 0x63, 0x72, 0x61, 0x5f, - 0x25, 0xe6, 0x0d, 0x9f, 0x66, 0x8b, 0x71, 0x58, 0x72, 0x7d, 0x9e, 0x65, 0x4c, 0x68, 0x85, 0x47, - 0x5e, 0x87, 0x31, 0x5e, 0x9f, 0x9e, 0x10, 0xa7, 0x8b, 0x10, 0x5d, 0xc4, 0xe5, 0x38, 0xd6, 0xdf, - 0x2c, 0xc0, 0x89, 0xf8, 0xf3, 0xee, 0x76, 0x9b, 0x6e, 0x44, 0x37, 0xdd, 0xc0, 0x6d, 0x87, 0x47, - 0xac, 0x80, 0x8b, 0xa9, 0x4f, 0xc3, 0x04, 0x29, 0xf2, 0xd3, 0xb4, 0x0f, 0xb2, 0x12, 0x1f, 0x84, - 0xea, 0x4b, 0xfe, 0x41, 0xf2, 0x33, 0xc8, 0x6d, 0x28, 0xd4, 0x69, 0x24, 0xb6, 0xcd, 0x0b, 0xa9, - 0x5e, 0xd5, 0xbf, 0xeb, 0x72, 0x9d, 0x46, 0x7c, 0x10, 0x79, 0x0c, 0x1c, 0x6a, 0x44, 0x3d, 0xad, - 0xd3, 0x88, 0xdc, 0x87, 0xb1, 0x95, 0x47, 0x5d, 0xda, 0x88, 0x44, 0x42, 0xb8, 0x4b, 0x83, 0xf9, - 0x71, 0x5c, 0x2d, 0x1f, 0x1c, 0x45, 0x80, 0xde, 0x59, 0x1c, 0xe5, 0xf4, 0x75, 0x28, 0xca, 0xca, - 0x9f, 0x64, 0xe6, 0x9e, 0x7e, 0x0b, 0x26, 0xb5, 0x4a, 0x9e, 0x68, 0xd2, 0xff, 0x02, 0xdb, 0x57, - 0xfd, 0x96, 0xcc, 0x21, 0xb7, 0x92, 0x12, 0xf3, 0x72, 0x7a, 0x6e, 0x73, 0x56, 0xe2, 0x3c, 0x10, - 0x45, 0x03, 0xe4, 0xbd, 0x1a, 0xcc, 0xd6, 0x1f, 0x78, 0xdd, 0x38, 0xf8, 0xa4, 0x71, 0x98, 0x62, - 0xc2, 0x08, 0x71, 0xe7, 0x4e, 0x1e, 0xa6, 0x49, 0x3a, 0xeb, 0x4f, 0x72, 0x30, 0xc6, 0xfe, 0xba, - 0x77, 0xfd, 0x19, 0xdd, 0x32, 0xaf, 0x19, 0x5b, 0xe6, 0x9c, 0x16, 0xf9, 0x19, 0x37, 0x8e, 0xeb, - 0x47, 0x6c, 0x96, 0x87, 0x62, 0x80, 0x38, 0x32, 0xb9, 0x09, 0xe3, 0xc2, 0xf2, 0x46, 0x98, 0x48, - 0xeb, 0xa1, 0xa4, 0xa5, 0x4d, 0x8e, 0xba, 0x9c, 0xfb, 0xdd, 0xa4, 0x36, 0x43, 0x52, 0x33, 0x91, - 0x5c, 0x86, 0x01, 0x35, 0x32, 0x8f, 0xfa, 0xe8, 0xd3, 0xc6, 0x43, 0x21, 0x6b, 0xb9, 0x82, 0xfb, - 0x78, 0xbc, 0x57, 0xc4, 0x43, 0x46, 0x61, 0x10, 0x93, 0x13, 0x32, 0x31, 0x63, 0xe6, 0x1b, 0xc7, - 0x3f, 0x39, 0xce, 0x83, 0x08, 0xcb, 0x0f, 0x7b, 0x17, 0xa6, 0x6e, 0xf8, 0xc1, 0xbe, 0x1b, 0xf0, - 0xd0, 0x90, 0xc2, 0x72, 0x80, 0x5d, 0x1d, 0xa7, 0x77, 0x38, 0x9c, 0x07, 0x97, 0xfc, 0xf8, 0xb0, - 0x3c, 0xb2, 0xe4, 0xfb, 0x2d, 0xdb, 0x40, 0x27, 0x1b, 0x30, 0x7d, 0xc7, 0x7d, 0xa4, 0x5d, 0x7a, - 0xb9, 0x93, 0xca, 0x25, 0x36, 0x81, 0xd9, 0xad, 0xf9, 0x68, 0x33, 0x28, 0x93, 0x9e, 0x78, 0x30, - 0xb3, 0xe9, 0x07, 0x91, 0xa8, 0xc4, 0xeb, 0xec, 0x8a, 0xc6, 0xa6, 0x0d, 0xb9, 0xae, 0x64, 0x1a, - 0x72, 0x9d, 0xea, 0xfa, 0x41, 0xe4, 0xec, 0x28, 0x72, 0x23, 0x78, 0x94, 0xc1, 0x98, 0xbc, 0x0b, - 0x73, 0x5a, 0x70, 0xbc, 0x1b, 0x7e, 0xd0, 0x76, 0xa5, 0x50, 0x8e, 0x7a, 0x60, 0xb4, 0x37, 0xd9, - 0x41, 0xb0, 0x9d, 0xc6, 0x24, 0x5f, 0xcd, 0x72, 0xfb, 0x19, 0x8d, 0x2d, 0xc1, 0x32, 0xdc, 0x7e, - 0xfa, 0x59, 0x82, 0xa5, 0x1d, 0x80, 0x76, 0x07, 0x59, 0x8a, 0x16, 0x97, 0xae, 0x8a, 0xeb, 0xf7, - 0xd1, 0x96, 0xa0, 0x6a, 0xdc, 0xfa, 0x58, 0x84, 0x2e, 0x42, 0x61, 0x69, 0xf3, 0x06, 0xbe, 0x5e, - 0x48, 0x43, 0x9b, 0xce, 0x9e, 0xdb, 0x69, 0xa0, 0xb0, 0x2c, 0xac, 0xb3, 0xf5, 0x1d, 0x79, 0x69, - 0xf3, 0x06, 0x71, 0x61, 0x7e, 0x93, 0x06, 0x6d, 0x2f, 0xfa, 0xca, 0xd5, 0xab, 0xda, 0x40, 0x15, - 0xf1, 0xd3, 0xae, 0x88, 0x4f, 0x2b, 0x77, 0x11, 0xc5, 0x79, 0x74, 0xf5, 0x6a, 0xe6, 0x70, 0xa8, - 0x0f, 0xcb, 0xe2, 0xc5, 0x76, 0xc6, 0x3b, 0xee, 0xa3, 0xd8, 0xa8, 0x3e, 0x14, 0x0e, 0x94, 0x67, - 0xe4, 0xc4, 0x8a, 0x0d, 0xf2, 0x8d, 0x9d, 0xd1, 0x24, 0x62, 0x77, 0x9d, 0x78, 0x7a, 0x85, 0xc2, - 0xf5, 0xe4, 0xb4, 0x54, 0xe9, 0x48, 0x2f, 0x5b, 0x5d, 0x60, 0xd7, 0xd0, 0xc9, 0x5d, 0x75, 0x63, - 0xe3, 0x37, 0x1e, 0x91, 0x76, 0xf0, 0x8a, 0x7e, 0x63, 0xe3, 0x8a, 0x14, 0xa3, 0x59, 0xb3, 0xea, - 0x9a, 0xcf, 0xbd, 0x0c, 0x6c, 0x93, 0x4b, 0xfa, 0x22, 0x38, 0xf5, 0xe4, 0x17, 0x41, 0x0a, 0x23, - 0x6b, 0x7e, 0xe3, 0x81, 0x88, 0x78, 0xf5, 0x65, 0xb6, 0xdc, 0x5b, 0x7e, 0xe3, 0xc1, 0xd3, 0xb3, - 0x80, 0x45, 0xf6, 0x64, 0x9d, 0x7d, 0x2a, 0x9b, 0x05, 0xa2, 0x4f, 0x84, 0x55, 0xe5, 0x31, 0x75, - 0x13, 0xd2, 0xca, 0xb8, 0xe0, 0xc3, 0x27, 0x8d, 0xec, 0x5a, 0xdb, 0x24, 0x27, 0x14, 0x4a, 0x55, - 0x1a, 0x3e, 0x88, 0xfc, 0xee, 0x72, 0xcb, 0xeb, 0x6e, 0xfb, 0x6e, 0x20, 0xe3, 0x90, 0xa6, 0xd7, - 0xf7, 0x2b, 0x99, 0xeb, 0x7b, 0xae, 0xc9, 0xe9, 0x9d, 0x86, 0x64, 0x60, 0xa7, 0x58, 0x92, 0xaf, - 0xc2, 0x0c, 0x9b, 0xdc, 0x2b, 0x8f, 0x22, 0xda, 0xe1, 0x23, 0x3f, 0x87, 0xa2, 0xc3, 0x31, 0x2d, - 0xe4, 0xbe, 0x2a, 0xe4, 0x73, 0x0a, 0x17, 0x3b, 0x55, 0x04, 0x46, 0xb4, 0x30, 0x83, 0x15, 0x69, - 0xc2, 0xc2, 0x1d, 0xf7, 0x91, 0x96, 0x2c, 0x51, 0x9b, 0xa4, 0x04, 0x27, 0xd8, 0xc5, 0xc7, 0x87, - 0xe5, 0x97, 0xd8, 0x04, 0x8b, 0x43, 0xe3, 0xf6, 0x99, 0xaf, 0x7d, 0x39, 0x91, 0x1f, 0x86, 0x93, - 0xa2, 0x59, 0x55, 0xcc, 0x43, 0xe3, 0x07, 0x07, 0xf5, 0x3d, 0x17, 0xfd, 0x69, 0xe6, 0x9f, 0x6c, - 0x43, 0x94, 0x1d, 0xd6, 0x94, 0x7c, 0x9c, 0x90, 0x33, 0xb2, 0xfb, 0xd5, 0x40, 0x3e, 0x82, 0x19, - 0xfe, 0x64, 0xb3, 0xea, 0x87, 0x11, 0x5e, 0xe8, 0x8f, 0x3d, 0x99, 0x99, 0x38, 0x7f, 0x07, 0xe2, - 0x8e, 0x15, 0x09, 0x05, 0x40, 0x82, 0x33, 0x79, 0x1b, 0x26, 0x37, 0xbd, 0x0e, 0x8f, 0xe7, 0x57, - 0xdb, 0x44, 0xd5, 0xa3, 0x38, 0x7f, 0xba, 0x5e, 0xc7, 0x91, 0xb7, 0xea, 0xae, 0xda, 0x2e, 0x74, - 0x6c, 0x72, 0x1f, 0x26, 0xeb, 0xf5, 0xd5, 0x1b, 0x1e, 0x3b, 0x00, 0xbb, 0x07, 0x0b, 0x27, 0xfa, - 0x7c, 0xe5, 0xf9, 0xcc, 0xaf, 0x9c, 0x0e, 0xc3, 0x3d, 0x4c, 0x40, 0xef, 0x34, 0xfc, 0xee, 0x81, - 0xad, 0x73, 0xca, 0x30, 0x9d, 0x3e, 0xf9, 0x94, 0x4d, 0xa7, 0x6b, 0x30, 0xab, 0x19, 0x58, 0xa2, - 0x71, 0xe5, 0x42, 0x1c, 0x04, 0x46, 0x37, 0x95, 0x4e, 0xba, 0x0a, 0x26, 0xe9, 0xa4, 0xcd, 0xf4, - 0xa9, 0x27, 0xb5, 0x99, 0xf6, 0x60, 0x8e, 0x0f, 0x86, 0x98, 0x07, 0x38, 0xd2, 0xa7, 0xfb, 0xf4, - 0xe1, 0xa5, 0xcc, 0x3e, 0x9c, 0x17, 0x23, 0x2d, 0x27, 0x19, 0x3e, 0x51, 0xa6, 0xb9, 0x92, 0x1d, - 0x20, 0x02, 0x28, 0xd2, 0xdf, 0x63, 0x5d, 0xcf, 0xf7, 0xa9, 0xeb, 0xa5, 0xcc, 0xba, 0x66, 0x64, - 0x5d, 0xdb, 0xbc, 0x9a, 0x0c, 0x8e, 0xa4, 0x23, 0xeb, 0x91, 0xf3, 0x0b, 0x3b, 0xf6, 0x05, 0x43, - 0x0f, 0x9a, 0x46, 0xe0, 0xc1, 0x74, 0x93, 0x93, 0x36, 0xd9, 0xef, 0x19, 0x9c, 0xc9, 0x23, 0x38, - 0x91, 0xfe, 0x0a, 0xac, 0xf3, 0x0c, 0xd6, 0x79, 0xc6, 0xa8, 0x33, 0x89, 0xc4, 0xe7, 0x8d, 0xd9, - 0xac, 0x64, 0xad, 0x7d, 0xf8, 0x93, 0xbf, 0x94, 0x83, 0x93, 0x77, 0x6e, 0x54, 0x30, 0xeb, 0x9b, - 0xc7, 0xc3, 0x3b, 0x29, 0x17, 0xcb, 0xb3, 0x42, 0x57, 0x9e, 0xd4, 0xdf, 0x4b, 0x89, 0x03, 0xb7, - 0x0a, 0x26, 0x23, 0x9e, 0x6f, 0xef, 0xb8, 0x3c, 0x99, 0x9c, 0x60, 0x91, 0xe1, 0x87, 0xf9, 0x73, - 0x7f, 0x50, 0xce, 0xd9, 0xfd, 0xaa, 0x22, 0x2d, 0x38, 0x6d, 0x76, 0x8b, 0xb4, 0x6a, 0xdf, 0xa3, - 0xad, 0xd6, 0x42, 0x19, 0x67, 0xf4, 0xeb, 0x8f, 0x0f, 0xcb, 0x17, 0x53, 0xbd, 0xab, 0x2c, 0xe5, - 0x19, 0xa6, 0xd6, 0xe0, 0x01, 0xfc, 0x6e, 0x8d, 0x14, 0xa7, 0x4b, 0x33, 0x59, 0xe6, 0xe5, 0xbf, - 0x99, 0x4f, 0x9c, 0x54, 0xa4, 0x06, 0xe3, 0x62, 0x02, 0x0a, 0xd1, 0x3d, 0x3d, 0xcd, 0xce, 0x64, - 0x4e, 0xb3, 0x71, 0x31, 0x97, 0x6d, 0x49, 0x4f, 0xf6, 0x19, 0x2b, 0xfc, 0x0a, 0x71, 0xd7, 0xf9, - 0x3a, 0x3f, 0x88, 0x10, 0x64, 0x1c, 0xb9, 0xd5, 0x27, 0xf7, 0x54, 0x32, 0x1d, 0xe1, 0xf0, 0xec, - 0x95, 0xb5, 0x91, 0x07, 0x3c, 0x31, 0x49, 0x41, 0xb9, 0xbb, 0x98, 0x59, 0x48, 0x9e, 0x5a, 0x85, - 0xac, 0x16, 0xeb, 0x37, 0x72, 0x30, 0x6d, 0x1c, 0x75, 0xe4, 0xba, 0xe6, 0xcb, 0x15, 0xbb, 0x37, - 0x1b, 0x38, 0xb8, 0xfb, 0x25, 0xbd, 0xbc, 0xae, 0x0b, 0x63, 0xf1, 0x7c, 0x7f, 0x3a, 0x9c, 0xfd, - 0x49, 0xd7, 0xbe, 0xc1, 0x9a, 0x41, 0x95, 0xe8, 0x6c, 0xa4, 0x4f, 0xa2, 0xb3, 0xbf, 0xff, 0x3c, - 0xcc, 0x98, 0x77, 0x21, 0xf2, 0x3a, 0x8c, 0xa1, 0x42, 0x55, 0x5e, 0xac, 0x79, 0x82, 0x78, 0x3f, - 0x91, 0xb3, 0x53, 0xe0, 0x90, 0x97, 0x01, 0x94, 0xd5, 0xae, 0x7c, 0x4e, 0x18, 0x7d, 0x7c, 0x58, - 0xce, 0xbd, 0x61, 0x6b, 0x05, 0xe4, 0x1b, 0x00, 0xeb, 0x7e, 0x93, 0xaa, 0xac, 0x90, 0x03, 0x9e, - 0xcc, 0x5f, 0x49, 0x05, 0xed, 0x3f, 0xde, 0xf1, 0x9b, 0x34, 0x1d, 0xa1, 0x5f, 0xe3, 0x48, 0xbe, - 0x04, 0xa3, 0x76, 0x8f, 0x5d, 0xe2, 0xb9, 0xfe, 0x64, 0x52, 0x1e, 0x39, 0xbd, 0x16, 0x8d, 0x6f, - 0x88, 0x41, 0x2f, 0x69, 0x0d, 0xc6, 0x00, 0xe4, 0x7d, 0x1e, 0xcc, 0x5f, 0x44, 0xc2, 0x1b, 0x8d, - 0x1f, 0x58, 0x34, 0x51, 0x24, 0x15, 0x0b, 0x4f, 0x23, 0x21, 0x1b, 0x30, 0xae, 0xbf, 0x0c, 0x68, - 0x4e, 0xc1, 0xfa, 0xeb, 0x91, 0x76, 0xdd, 0x14, 0xe9, 0x24, 0x93, 0x8f, 0x06, 0x92, 0x0b, 0x79, - 0x07, 0x26, 0x18, 0x7b, 0xb6, 0x94, 0x43, 0x71, 0xcd, 0xc0, 0x67, 0x14, 0xed, 0x83, 0xd8, 0x76, - 0x60, 0xc4, 0xab, 0x53, 0x04, 0xe4, 0xab, 0x98, 0xa8, 0x50, 0x74, 0xf5, 0x40, 0x53, 0x8a, 0x0b, - 0xa9, 0xae, 0xc6, 0xcc, 0x85, 0xe9, 0xcc, 0xe7, 0x8a, 0x1f, 0xd9, 0x55, 0x31, 0xa9, 0x86, 0x49, - 0xc0, 0xf0, 0x6a, 0xaa, 0x82, 0x05, 0x19, 0x66, 0x29, 0x9d, 0xdd, 0xd3, 0xe0, 0x4b, 0xba, 0x50, - 0x8a, 0xa5, 0x3c, 0x51, 0x17, 0x0c, 0xaa, 0xeb, 0x8d, 0x54, 0x5d, 0xfa, 0x00, 0xa6, 0xaa, 0x4b, - 0x71, 0x27, 0x4d, 0x98, 0x91, 0x27, 0x86, 0xa8, 0x6f, 0x72, 0x50, 0x7d, 0x2f, 0xa7, 0xea, 0x9b, - 0x6f, 0x6e, 0xa7, 0xeb, 0x49, 0xf0, 0x24, 0xef, 0xc0, 0xb4, 0x84, 0xf0, 0x5c, 0x9b, 0x53, 0x71, - 0x52, 0xc5, 0xe6, 0x76, 0x2a, 0xc3, 0xa6, 0x89, 0xac, 0x53, 0xf3, 0xd9, 0x31, 0x6d, 0x50, 0x27, - 0x67, 0x85, 0x89, 0x4c, 0x3e, 0x84, 0xc9, 0x5a, 0x9b, 0x35, 0xc4, 0xef, 0xb8, 0x11, 0x15, 0x0e, - 0x63, 0xd2, 0x2c, 0x44, 0x2b, 0xd1, 0xa6, 0x2a, 0xcf, 0x22, 0x1a, 0x17, 0x19, 0x59, 0x44, 0x63, - 0x30, 0xeb, 0x3c, 0xfe, 0x14, 0x24, 0xe6, 0xb0, 0x74, 0x26, 0x3b, 0x93, 0x61, 0x9a, 0xa1, 0xb1, - 0x17, 0x11, 0x27, 0x19, 0x54, 0x3e, 0xc5, 0x24, 0x22, 0x4e, 0xea, 0x3c, 0xc9, 0xbb, 0x30, 0x29, - 0x72, 0xd3, 0x54, 0xec, 0xf5, 0x70, 0xa1, 0x84, 0x8d, 0x47, 0x17, 0x78, 0x99, 0xc6, 0xc6, 0x71, - 0x83, 0x84, 0x0d, 0x62, 0x8c, 0x4f, 0xbe, 0x02, 0xc7, 0xee, 0x7b, 0x9d, 0xa6, 0xbf, 0x1f, 0x8a, - 0x63, 0x4a, 0x6c, 0x74, 0x73, 0xb1, 0x07, 0xd0, 0x3e, 0x2f, 0x57, 0xc2, 0x59, 0x6a, 0xe3, 0xcb, - 0xe4, 0x40, 0xfe, 0x7c, 0x8a, 0x33, 0x9f, 0x41, 0x64, 0xd0, 0x0c, 0x5a, 0x4c, 0xcd, 0xa0, 0x74, - 0xf5, 0xc9, 0xe9, 0x94, 0x59, 0x0d, 0xf1, 0x81, 0x98, 0xe7, 0xfb, 0x2d, 0xdf, 0xeb, 0x2c, 0xcc, - 0xe3, 0x5e, 0xf8, 0x7c, 0xd2, 0xe9, 0x1c, 0xf1, 0x44, 0x36, 0x56, 0xeb, 0xf1, 0x61, 0xf9, 0x6c, - 0x52, 0x08, 0xff, 0xc8, 0x37, 0x14, 0xe5, 0x19, 0xac, 0xc9, 0x87, 0x30, 0xc5, 0xfe, 0x57, 0x5a, - 0x82, 0x63, 0x86, 0x31, 0x9f, 0x86, 0x29, 0xea, 0xc1, 0x31, 0xc2, 0xe4, 0x39, 0x19, 0x0a, 0x04, - 0x83, 0x15, 0x79, 0x0b, 0x80, 0xc9, 0x31, 0x62, 0x3b, 0x3e, 0x1e, 0x07, 0xf8, 0x44, 0x31, 0x28, - 0xbd, 0x11, 0xc7, 0xc8, 0xe4, 0x1d, 0x98, 0x64, 0xbf, 0xea, 0xbd, 0xa6, 0xcf, 0xd6, 0xc6, 0x09, - 0xa4, 0xe5, 0x7e, 0x78, 0x8c, 0x36, 0xe4, 0x70, 0xc3, 0x0f, 0x2f, 0x46, 0x27, 0xab, 0x30, 0x8b, - 0x81, 0x58, 0x6b, 0x98, 0xaa, 0x39, 0xf2, 0x68, 0xb8, 0x70, 0x52, 0x7b, 0xc2, 0x66, 0x45, 0x8e, - 0xa7, 0xca, 0xf4, 0xcb, 0x45, 0x82, 0x8c, 0x84, 0x30, 0x1f, 0xef, 0x2e, 0xf1, 0x83, 0xf8, 0x02, - 0x76, 0x92, 0x14, 0xa9, 0xd3, 0x18, 0x7c, 0x3f, 0x66, 0x23, 0xa2, 0x6d, 0x5c, 0xf2, 0x39, 0x41, - 0xaf, 0x30, 0x8b, 0x3b, 0xb1, 0x81, 0xdc, 0x5c, 0xde, 0x4c, 0x46, 0x2a, 0x3d, 0x85, 0x2d, 0xc0, - 0x61, 0xde, 0x6d, 0xc4, 0x69, 0x62, 0x33, 0xa2, 0x95, 0x66, 0x50, 0x93, 0x6f, 0xc3, 0x71, 0xb9, - 0x83, 0x88, 0x22, 0x31, 0xaf, 0x4f, 0x3f, 0xe1, 0x4e, 0xdc, 0xdc, 0x56, 0x55, 0xa7, 0xa6, 0x74, - 0x76, 0x15, 0xc4, 0x85, 0x49, 0x1c, 0x56, 0x51, 0xe3, 0xf3, 0x83, 0x6a, 0xbc, 0x98, 0xaa, 0xf1, - 0x04, 0x4e, 0x94, 0x74, 0x65, 0x3a, 0x4f, 0xb2, 0x04, 0xd3, 0x62, 0x1d, 0x89, 0xd9, 0xf6, 0x02, - 0xf6, 0x16, 0x6a, 0x95, 0xe4, 0x0a, 0x4c, 0x4d, 0x38, 0x93, 0x44, 0xdf, 0x91, 0xf9, 0x33, 0xc2, - 0x19, 0x63, 0x47, 0x4e, 0xbe, 0x1e, 0x98, 0xc8, 0x6c, 0x47, 0x8a, 0xa5, 0x98, 0x95, 0x47, 0xdd, - 0x40, 0xe8, 0x8c, 0xce, 0xc6, 0x09, 0x3c, 0x34, 0xe1, 0xc7, 0xa1, 0x0a, 0x43, 0xdf, 0x12, 0xb2, - 0x38, 0x90, 0xbb, 0x30, 0xaf, 0x4e, 0x6d, 0x8d, 0x71, 0x39, 0x4e, 0x84, 0x12, 0x1f, 0xf5, 0xd9, - 0x7c, 0xb3, 0xe8, 0x89, 0x0b, 0x27, 0x8d, 0x73, 0x5a, 0x63, 0x7d, 0x0e, 0x59, 0x63, 0x5a, 0x62, - 0xf3, 0x90, 0xcf, 0x66, 0xdf, 0x8f, 0x0f, 0xf9, 0x08, 0x4e, 0x27, 0xcf, 0x66, 0xad, 0x96, 0x17, - 0xb1, 0x96, 0x57, 0x1f, 0x1f, 0x96, 0x2f, 0xa4, 0x8e, 0xf7, 0xec, 0x8a, 0x06, 0x70, 0x23, 0xdf, - 0x80, 0x05, 0xf3, 0x7c, 0xd6, 0x6a, 0xb2, 0xb0, 0x26, 0x5c, 0x3a, 0xea, 0x60, 0xcf, 0xae, 0xa1, - 0x2f, 0x0f, 0x12, 0x41, 0x39, 0x73, 0x76, 0x6b, 0xd5, 0x9c, 0x8f, 0x1b, 0x94, 0x5a, 0x25, 0xd9, - 0xd5, 0x1d, 0xc5, 0x92, 0xec, 0xc3, 0xd9, 0xac, 0x63, 0x42, 0xab, 0xf4, 0x25, 0xa5, 0x95, 0x7d, - 0x2d, 0xfb, 0xc8, 0xc9, 0xae, 0xf9, 0x08, 0xb6, 0xe4, 0xab, 0x70, 0x5c, 0x5b, 0x5f, 0x5a, 0x7d, - 0x2f, 0x63, 0x7d, 0xe8, 0xbf, 0xab, 0x2f, 0xcc, 0xec, 0x5a, 0xb2, 0x79, 0x90, 0x36, 0xcc, 0xcb, - 0x86, 0xa3, 0xfa, 0x5b, 0x1c, 0x3d, 0x17, 0x8c, 0x5d, 0x35, 0x8d, 0xa1, 0x25, 0x96, 0xdf, 0x76, - 0xba, 0x31, 0xa1, 0x3e, 0xd3, 0x33, 0xf8, 0x92, 0x55, 0x18, 0xab, 0x6f, 0xd6, 0x6e, 0xdc, 0x58, - 0x59, 0x78, 0x05, 0x6b, 0x90, 0xce, 0x3e, 0x1c, 0x68, 0x5c, 0x9a, 0x84, 0x8d, 0x59, 0xd7, 0xdb, - 0xd9, 0x31, 0x7c, 0xaa, 0x38, 0xea, 0xad, 0x91, 0xe2, 0xc5, 0xd2, 0xa5, 0x5b, 0x23, 0xc5, 0x4b, - 0xa5, 0x57, 0xed, 0x17, 0xb2, 0x53, 0x71, 0xf3, 0xc6, 0xda, 0x17, 0x06, 0x95, 0xc6, 0x5d, 0x61, - 0xfd, 0x42, 0x0e, 0xe6, 0x33, 0xbe, 0x83, 0x5c, 0x80, 0x11, 0xcc, 0x2c, 0xa2, 0xbd, 0xaa, 0x27, - 0x32, 0x8a, 0x60, 0x39, 0xf9, 0x1c, 0x8c, 0x57, 0xd7, 0xeb, 0xf5, 0xca, 0xba, 0xbc, 0xb2, 0xf1, - 0xed, 0xaa, 0x13, 0x3a, 0xa1, 0x6b, 0x3e, 0xc6, 0x09, 0x34, 0xf2, 0x06, 0x8c, 0xd5, 0x36, 0x91, - 0x80, 0x9b, 0x75, 0xe1, 0x15, 0xc6, 0xeb, 0x26, 0xf1, 0x05, 0x92, 0xf5, 0xe3, 0x39, 0x20, 0xe9, - 0x4e, 0x25, 0x57, 0x61, 0x52, 0x1f, 0x3a, 0x7e, 0xc1, 0xc4, 0x87, 0x23, 0x6d, 0x60, 0x6c, 0x1d, - 0x87, 0x54, 0x61, 0x14, 0x73, 0xaf, 0xa9, 0x57, 0xc0, 0xcc, 0x03, 0xe0, 0x64, 0xea, 0x00, 0x18, - 0xc5, 0xcc, 0x6e, 0x36, 0x27, 0xb6, 0x7e, 0x27, 0x07, 0x24, 0x7d, 0x68, 0x0e, 0x6d, 0x85, 0xf0, - 0xa6, 0xe6, 0x96, 0xab, 0xe7, 0x0e, 0x50, 0x89, 0x5f, 0xf4, 0xcb, 0x52, 0xec, 0xc0, 0x7b, 0xc1, - 0xb8, 0x9c, 0xf7, 0xf7, 0xe5, 0xba, 0x04, 0xa3, 0xf7, 0x68, 0xb0, 0x2d, 0x2d, 0x16, 0xd1, 0xca, - 0xe9, 0x21, 0x03, 0xe8, 0x97, 0x55, 0xc4, 0xb0, 0xfe, 0x28, 0x07, 0xc7, 0xb2, 0x24, 0xb9, 0x23, - 0x5c, 0xae, 0xac, 0x84, 0xb7, 0x18, 0x5a, 0x20, 0x70, 0x13, 0x28, 0xe5, 0x23, 0x56, 0x86, 0x51, - 0xd6, 0x58, 0x39, 0xc2, 0xa8, 0x2c, 0x60, 0xbd, 0x11, 0xda, 0x1c, 0xce, 0x10, 0x78, 0xa8, 0xa7, - 0x11, 0x8c, 0x12, 0x86, 0x08, 0x28, 0x28, 0xd8, 0x1c, 0xce, 0x10, 0xee, 0xf8, 0x4d, 0x95, 0x70, - 0x18, 0x11, 0xda, 0x0c, 0x60, 0x73, 0x38, 0xb9, 0x00, 0xe3, 0x1b, 0x9d, 0x35, 0xea, 0x3e, 0x94, - 0xf1, 0xab, 0xd1, 0x62, 0xc2, 0xef, 0x38, 0x2d, 0x06, 0xb3, 0x65, 0xa1, 0xf5, 0xd3, 0x39, 0x98, - 0x4b, 0x09, 0x91, 0x47, 0x7b, 0x95, 0x0d, 0x76, 0xef, 0x18, 0xa6, 0x7d, 0xfc, 0xf3, 0x47, 0xb2, - 0x3f, 0xdf, 0xfa, 0xbf, 0x47, 0xe0, 0x64, 0x9f, 0x3b, 0x7d, 0xec, 0x7e, 0x96, 0x3b, 0xd2, 0xfd, - 0xec, 0x6b, 0xec, 0x0e, 0xed, 0x7a, 0xed, 0x70, 0xcb, 0x8f, 0xbf, 0x38, 0xb6, 0x62, 0xc7, 0x32, - 0x99, 0x73, 0x59, 0x9a, 0x3b, 0x9f, 0xe2, 0x79, 0xef, 0x9d, 0xc8, 0x4f, 0x8b, 0x14, 0x06, 0xb3, - 0x94, 0x03, 0x58, 0xe1, 0x4f, 0x89, 0x03, 0x98, 0xe9, 0x92, 0x30, 0xf2, 0x54, 0x5d, 0x12, 0xb2, - 0xcd, 0x19, 0x47, 0x3f, 0x8d, 0x71, 0xeb, 0x32, 0x4c, 0x73, 0x93, 0x91, 0x4a, 0xc8, 0x07, 0x69, - 0x2c, 0x65, 0x66, 0xe2, 0x86, 0xe9, 0xb1, 0x30, 0x68, 0xc8, 0xaa, 0x69, 0x3e, 0x3f, 0x8e, 0x4f, - 0x5d, 0x17, 0xfa, 0x9b, 0xc7, 0x1b, 0x4f, 0xdc, 0x3a, 0xa9, 0xf5, 0xd3, 0x79, 0xd3, 0x3b, 0xec, - 0x4f, 0xe3, 0xcc, 0xbb, 0x04, 0xa3, 0xf7, 0xf7, 0x68, 0x20, 0xf7, 0x3b, 0xfc, 0x90, 0x7d, 0x06, - 0xd0, 0x3f, 0x04, 0x31, 0xc8, 0x0d, 0x98, 0xd9, 0xe4, 0x23, 0x21, 0xbb, 0x77, 0x24, 0xbe, 0x6a, - 0x75, 0x85, 0x42, 0x20, 0xa3, 0x7f, 0x13, 0x54, 0xd6, 0x4d, 0x38, 0x63, 0x2c, 0x48, 0x11, 0xcd, - 0x82, 0x5b, 0xb1, 0xf3, 0x13, 0x71, 0x26, 0xb6, 0xdb, 0x8f, 0x77, 0x0f, 0x3b, 0x01, 0xb5, 0x76, - 0xe0, 0xec, 0x40, 0x46, 0xec, 0x20, 0x82, 0xae, 0xfa, 0x95, 0x30, 0xb5, 0x1b, 0x48, 0x6a, 0x6b, - 0x74, 0xd6, 0x0f, 0xc3, 0x94, 0xde, 0xcb, 0xb8, 0xa7, 0xb2, 0xdf, 0x62, 0x53, 0xe3, 0x7b, 0x2a, - 0x03, 0xd8, 0x1c, 0x1e, 0xab, 0x70, 0xf3, 0xd9, 0x2a, 0xdc, 0x78, 0xf8, 0x0b, 0x47, 0x0d, 0x3f, - 0xab, 0x1c, 0x97, 0xac, 0x56, 0x39, 0xfe, 0xd6, 0x2b, 0xc7, 0x70, 0x15, 0x36, 0x87, 0x3f, 0xd5, - 0xca, 0x7f, 0x5b, 0x66, 0xf0, 0x40, 0x23, 0x79, 0x79, 0x27, 0x8e, 0x33, 0x02, 0xcf, 0x67, 0xdd, - 0x74, 0x63, 0xcc, 0xf8, 0x90, 0xcc, 0x1f, 0x75, 0x48, 0x3e, 0xc9, 0x44, 0xbc, 0x02, 0xe3, 0x15, - 0xf1, 0x10, 0x3d, 0x12, 0x0b, 0x36, 0x6e, 0xea, 0xd5, 0x59, 0x62, 0x59, 0x3f, 0x97, 0x83, 0xe3, - 0x99, 0xaa, 0x32, 0x56, 0x2b, 0xd7, 0xc9, 0x69, 0xeb, 0x30, 0xa9, 0x90, 0xe3, 0x18, 0x4f, 0xe2, - 0xab, 0x3c, 0x7c, 0x5b, 0xac, 0x17, 0x61, 0x42, 0x3d, 0xd4, 0x90, 0x63, 0x72, 0xe8, 0xd0, 0x3a, - 0x49, 0xea, 0xfb, 0xeb, 0x00, 0xec, 0x0b, 0x9e, 0xaa, 0x2d, 0x9d, 0xf5, 0xdb, 0x79, 0x9e, 0xdd, - 0xed, 0x99, 0x0d, 0xf1, 0x97, 0x6d, 0x00, 0xc7, 0x9a, 0xd4, 0x3f, 0xb0, 0x1f, 0x59, 0x81, 0xb1, - 0x7a, 0xe4, 0x46, 0x3d, 0xe9, 0x62, 0x3d, 0xaf, 0x93, 0x61, 0xc1, 0xbd, 0xc5, 0xd8, 0xc9, 0x36, - 0x44, 0x88, 0x71, 0x39, 0x40, 0x88, 0x66, 0x47, 0xf7, 0x8f, 0x73, 0x30, 0xa5, 0x13, 0x93, 0x0f, - 0x61, 0x46, 0x06, 0x2e, 0xe3, 0x8e, 0xe7, 0xe2, 0x55, 0x49, 0x9a, 0x64, 0xc8, 0xc0, 0x65, 0xba, - 0xa3, 0xba, 0x81, 0xaf, 0x6f, 0xd5, 0x5d, 0x1d, 0x99, 0x34, 0x81, 0xb4, 0x77, 0x5c, 0x67, 0x9f, - 0xba, 0x0f, 0x68, 0x18, 0x39, 0xfc, 0xe9, 0x5c, 0x3c, 0x3e, 0x49, 0xf6, 0x77, 0x6e, 0x54, 0xf8, - 0xab, 0x39, 0x1b, 0x09, 0x11, 0x81, 0x2e, 0x45, 0xa3, 0x6b, 0xd4, 0xdb, 0x3b, 0xee, 0x7d, 0x5e, - 0xc8, 0xe9, 0xac, 0x3f, 0x1e, 0xe3, 0xd3, 0x4d, 0xc4, 0x39, 0xdc, 0x86, 0x99, 0x8d, 0x5a, 0x75, - 0x59, 0xd3, 0xaf, 0x99, 0x69, 0x32, 0x56, 0x1e, 0x45, 0x34, 0xe8, 0xb8, 0x2d, 0x81, 0x70, 0x10, - 0x1f, 0x41, 0xbe, 0xd7, 0x6c, 0x64, 0xeb, 0xde, 0x12, 0x1c, 0x59, 0x1d, 0xfc, 0x0e, 0xa5, 0xea, - 0xc8, 0x0f, 0x59, 0x47, 0xe8, 0xb6, 0x5b, 0x7d, 0xea, 0x30, 0x39, 0x92, 0x3d, 0x28, 0xdd, 0x44, - 0x71, 0x49, 0xab, 0xa5, 0x30, 0xb8, 0x96, 0xf3, 0xa2, 0x96, 0xe7, 0xb9, 0x9c, 0x95, 0x5d, 0x4f, - 0x8a, 0x6b, 0xbc, 0x4f, 0x8c, 0x1c, 0xb9, 0x4f, 0xfc, 0xe5, 0x1c, 0x8c, 0x71, 0x79, 0x4c, 0x4c, - 0xe3, 0x3e, 0x12, 0xdf, 0xfd, 0xa7, 0x23, 0xf1, 0x95, 0xf0, 0x9c, 0x30, 0x26, 0x34, 0x2f, 0x23, - 0xd5, 0xc4, 0xba, 0x90, 0xe6, 0x9f, 0xa8, 0x29, 0xe7, 0x25, 0x47, 0x2f, 0x0b, 0x52, 0x8b, 0xdd, - 0x9e, 0xc7, 0x8f, 0xf4, 0xac, 0x93, 0xae, 0xe2, 0xe3, 0xc2, 0xed, 0xd9, 0x74, 0x76, 0x5e, 0x83, - 0x09, 0xe1, 0x4c, 0xbd, 0x74, 0x20, 0xde, 0xc3, 0x4a, 0x86, 0x89, 0x41, 0x73, 0xe9, 0x20, 0x96, - 0x35, 0x85, 0x3b, 0xb6, 0xb3, 0x7d, 0x60, 0x24, 0xcb, 0x93, 0x88, 0x64, 0x83, 0x27, 0x91, 0xe2, - 0x91, 0x20, 0xcd, 0xd0, 0xcf, 0x0a, 0x2e, 0xc2, 0xb4, 0x48, 0x8f, 0xcc, 0x8c, 0xc0, 0x8f, 0x31, - 0x0f, 0xb2, 0x06, 0x25, 0x34, 0x4b, 0xa1, 0x4d, 0xbe, 0x6a, 0x6a, 0x55, 0xee, 0xb0, 0x2b, 0x4c, - 0x0b, 0x23, 0x5e, 0x26, 0x96, 0x5b, 0xc2, 0x57, 0x26, 0x45, 0xc9, 0xee, 0x87, 0xa5, 0xe4, 0xec, - 0x23, 0xef, 0xc0, 0xa4, 0x8a, 0xc4, 0xa9, 0xbc, 0xf5, 0x50, 0x2f, 0x1e, 0x87, 0xee, 0x34, 0x53, - 0x0f, 0x69, 0xe8, 0x64, 0x11, 0x8a, 0x6c, 0x11, 0x27, 0xd3, 0xf4, 0xf5, 0x04, 0x4c, 0x37, 0xc1, - 0x97, 0x78, 0xa4, 0x0e, 0xf3, 0x6c, 0xd1, 0xd4, 0xbd, 0xce, 0x6e, 0x8b, 0xae, 0xf9, 0xbb, 0x7e, - 0x2f, 0xba, 0x6b, 0xaf, 0x89, 0x3d, 0x9c, 0x4b, 0xe4, 0x6e, 0xbb, 0x65, 0x14, 0x07, 0x46, 0x12, - 0xe6, 0x0c, 0x6a, 0x6d, 0xab, 0xfc, 0x83, 0x3c, 0x4c, 0x6a, 0xf3, 0x89, 0x5c, 0x82, 0x62, 0x2d, - 0x5c, 0xf3, 0x1b, 0x0f, 0x54, 0x1c, 0xaf, 0xe9, 0xc7, 0x87, 0xe5, 0x09, 0x2f, 0x74, 0x5a, 0x08, - 0xb4, 0x55, 0x31, 0x59, 0x82, 0x69, 0xfe, 0x97, 0x8c, 0x90, 0x9e, 0x8f, 0x2d, 0x09, 0x39, 0xb2, - 0x8c, 0x8d, 0xae, 0xef, 0x9e, 0x06, 0x09, 0xf9, 0x3a, 0x00, 0x07, 0xa0, 0xe7, 0x67, 0x61, 0x78, - 0x9f, 0x55, 0x51, 0x41, 0x86, 0xcf, 0xa7, 0xc6, 0x90, 0x7c, 0x93, 0x47, 0xee, 0x94, 0xf3, 0x7f, - 0x64, 0x78, 0xa7, 0x5b, 0xc6, 0xdf, 0xc9, 0xf6, 0xfd, 0xd7, 0x59, 0x8a, 0x90, 0x83, 0xa7, 0x6d, - 0xda, 0xf0, 0x1f, 0xd2, 0xe0, 0xa0, 0x12, 0x21, 0xa2, 0x86, 0x61, 0xfd, 0x8f, 0x39, 0x6d, 0xd5, - 0x90, 0x75, 0xcc, 0x2c, 0xc9, 0x67, 0x84, 0x30, 0x0d, 0x51, 0x77, 0x06, 0x09, 0xb7, 0xe9, 0xce, - 0xd2, 0xf3, 0xc2, 0x90, 0x75, 0x5e, 0xcd, 0xab, 0x44, 0xc6, 0x49, 0x0e, 0x24, 0x1f, 0xc0, 0x08, - 0x76, 0x5d, 0xfe, 0xc8, 0xa6, 0xc9, 0x63, 0x7b, 0x84, 0xf5, 0x19, 0x36, 0x04, 0x29, 0xc9, 0xe7, - 0x84, 0xd7, 0x1c, 0xef, 0xfc, 0x19, 0xed, 0xec, 0x65, 0xdf, 0xa1, 0xce, 0xeb, 0x38, 0xfc, 0x83, - 0x36, 0x7b, 0xfe, 0x9d, 0x3c, 0x94, 0x92, 0x6b, 0x95, 0xbc, 0x0f, 0x53, 0xf2, 0x3c, 0xc5, 0xd4, - 0xe3, 0xac, 0x95, 0x53, 0x22, 0xbc, 0xb6, 0x3c, 0x54, 0x93, 0x99, 0xc7, 0x75, 0x02, 0x26, 0xdc, - 0x6c, 0x89, 0x70, 0x4c, 0xda, 0x2a, 0x89, 0xfc, 0xa8, 0x9b, 0x08, 0xfe, 0x28, 0xd1, 0xc8, 0x9b, - 0x50, 0xb8, 0x73, 0xa3, 0x22, 0x5c, 0x34, 0x4a, 0xc9, 0x53, 0x97, 0x9b, 0xa0, 0x99, 0x06, 0x71, - 0x0c, 0x9f, 0xac, 0x69, 0xb1, 0x55, 0xc7, 0x8c, 0x9c, 0x4a, 0x12, 0xac, 0x1a, 0x77, 0x74, 0x90, - 0x55, 0x9e, 0xd3, 0x5c, 0x44, 0x30, 0xfc, 0x0f, 0x0a, 0x30, 0xa1, 0xea, 0x27, 0x04, 0x50, 0x76, - 0x13, 0x17, 0x26, 0xfc, 0x9b, 0x9c, 0x82, 0xa2, 0x14, 0xd7, 0x84, 0xa7, 0xc6, 0x78, 0x28, 0x44, - 0xb5, 0x05, 0x90, 0x72, 0x19, 0x5f, 0xe6, 0xb6, 0xfc, 0x49, 0xae, 0x82, 0x12, 0xba, 0xfa, 0x49, - 0x67, 0x23, 0x6c, 0xc0, 0x6c, 0x85, 0x46, 0x66, 0x20, 0xef, 0xf1, 0xa8, 0x38, 0x13, 0x76, 0xde, - 0x6b, 0x92, 0xf7, 0xa1, 0xe8, 0x36, 0x9b, 0xb4, 0xe9, 0xb8, 0xd2, 0xc6, 0x62, 0xd0, 0xa4, 0x29, - 0x32, 0x6e, 0xfc, 0x10, 0x40, 0xaa, 0x4a, 0x44, 0x2a, 0x30, 0xd1, 0x72, 0xb9, 0x19, 0x55, 0x73, - 0x88, 0x13, 0x25, 0xe6, 0x50, 0x64, 0x64, 0x77, 0x43, 0xda, 0x24, 0xaf, 0xc0, 0x08, 0x1b, 0x4d, - 0x71, 0x84, 0x48, 0x29, 0x91, 0x0d, 0x26, 0xef, 0xb0, 0xd5, 0xe7, 0x6c, 0x44, 0x20, 0x2f, 0x41, - 0xa1, 0xb7, 0xb8, 0x23, 0x0e, 0x87, 0x52, 0x1c, 0xe7, 0x58, 0xa1, 0xb1, 0x62, 0x72, 0x0d, 0x8a, - 0xfb, 0x66, 0x88, 0xdc, 0xe3, 0x89, 0x61, 0x54, 0xf8, 0x0a, 0x71, 0xa9, 0x08, 0x63, 0xfc, 0x20, - 0xb0, 0xce, 0x02, 0xc4, 0x55, 0xa7, 0x1d, 0x6a, 0xac, 0xaf, 0xc3, 0x84, 0xaa, 0x92, 0x9c, 0x01, - 0x78, 0x40, 0x0f, 0x9c, 0x3d, 0xb7, 0xd3, 0x6c, 0x71, 0x29, 0x72, 0xca, 0x9e, 0x78, 0x40, 0x0f, - 0x56, 0x11, 0x40, 0x4e, 0xc2, 0x78, 0x97, 0x8d, 0xaa, 0x98, 0xba, 0x53, 0xf6, 0x58, 0xb7, 0xb7, - 0xcd, 0x66, 0xe8, 0x02, 0x8c, 0xa3, 0x82, 0x4f, 0x2c, 0xb4, 0x69, 0x5b, 0xfe, 0xb4, 0xfe, 0xab, - 0x3c, 0xa6, 0x87, 0xd0, 0xbe, 0x93, 0x9c, 0x87, 0xe9, 0x46, 0x40, 0xf1, 0xcc, 0x71, 0x99, 0x24, - 0x25, 0xea, 0x99, 0x8a, 0x81, 0xb5, 0x26, 0xb9, 0x00, 0xb3, 0x22, 0x8d, 0x3f, 0xfb, 0xa0, 0xc6, - 0xb6, 0x88, 0x67, 0x3d, 0x65, 0x4f, 0x73, 0xf0, 0x6d, 0x7a, 0xb0, 0xbc, 0x8d, 0xd1, 0x9c, 0x4a, - 0x7a, 0x30, 0xce, 0x48, 0x65, 0x5f, 0xb5, 0x67, 0x35, 0x38, 0x9a, 0x4e, 0x9d, 0x80, 0x31, 0xd7, - 0xdd, 0xed, 0x79, 0x3c, 0xea, 0xca, 0x94, 0x2d, 0x7e, 0x91, 0xd7, 0x60, 0x2e, 0xf4, 0x76, 0x3b, - 0x6e, 0xd4, 0x0b, 0x44, 0x7e, 0x0e, 0x1a, 0xe0, 0x94, 0x9a, 0xb6, 0x4b, 0xaa, 0x60, 0x99, 0xc3, - 0xc9, 0x1b, 0x40, 0xf4, 0xfa, 0xfc, 0xed, 0x8f, 0x68, 0x83, 0x4f, 0xb5, 0x29, 0x7b, 0x4e, 0x2b, - 0xd9, 0xc0, 0x02, 0xf2, 0x22, 0x4c, 0x05, 0x34, 0x44, 0x29, 0x0e, 0xbb, 0x0d, 0xb3, 0x27, 0xd9, - 0x93, 0x12, 0xc6, 0xfa, 0xee, 0x22, 0x94, 0xb4, 0xee, 0xc0, 0x78, 0xa7, 0x3c, 0x98, 0xb3, 0x3d, - 0x13, 0xc3, 0xed, 0x6e, 0xad, 0x69, 0x2d, 0xc1, 0x5c, 0x6a, 0xe5, 0x6a, 0x19, 0xb3, 0xf9, 0x4e, - 0x34, 0x38, 0x63, 0xb6, 0xd5, 0x81, 0x29, 0x7d, 0x27, 0x3e, 0x22, 0xa6, 0xf8, 0x09, 0xf4, 0xda, - 0xe7, 0xdb, 0xd4, 0xd8, 0xe3, 0xc3, 0x72, 0xde, 0x6b, 0xa2, 0xaf, 0xfe, 0x45, 0x28, 0x4a, 0xa1, - 0x41, 0x9c, 0xd5, 0xa8, 0xa0, 0x15, 0xd2, 0xea, 0x81, 0xad, 0x4a, 0xad, 0x57, 0x60, 0x5c, 0x6c, - 0xb6, 0x83, 0xd5, 0xb2, 0xd6, 0x77, 0xf2, 0x30, 0x6b, 0x53, 0xb6, 0x15, 0x50, 0x9e, 0x48, 0xe0, - 0x99, 0xbd, 0x25, 0x66, 0xc7, 0x7e, 0x33, 0xda, 0x36, 0x20, 0x84, 0xff, 0xdf, 0xcb, 0xc1, 0x7c, - 0x06, 0xee, 0x27, 0x4a, 0x61, 0x77, 0x1d, 0x26, 0xaa, 0x9e, 0xdb, 0xaa, 0x34, 0x9b, 0xca, 0x85, - 0x1f, 0x45, 0x4d, 0xcc, 0x73, 0xe1, 0x32, 0xa8, 0x7e, 0xec, 0x2a, 0x54, 0xf2, 0xaa, 0x98, 0x14, - 0x71, 0x16, 0x4f, 0x9c, 0x14, 0x1f, 0x1f, 0x96, 0x81, 0x7f, 0x53, 0x9c, 0xda, 0x17, 0xe3, 0x31, - 0x72, 0x60, 0x6c, 0x62, 0xff, 0xcc, 0x0e, 0x5d, 0x76, 0x3c, 0xc6, 0x64, 0xf3, 0x86, 0x8a, 0xe2, - 0xff, 0xd7, 0xf2, 0x70, 0x22, 0x9b, 0xf0, 0x93, 0x66, 0x23, 0xc4, 0xfc, 0x09, 0x5a, 0x0c, 0x59, - 0xcc, 0x46, 0xc8, 0x93, 0x2d, 0x20, 0x7e, 0x8c, 0x40, 0x76, 0x60, 0x7a, 0xcd, 0x0d, 0xa3, 0x55, - 0xea, 0x06, 0xd1, 0x36, 0x75, 0xa3, 0x21, 0x64, 0xcf, 0x97, 0xe4, 0xeb, 0x27, 0x1e, 0x7f, 0x7b, - 0x92, 0x32, 0x21, 0x1d, 0x9a, 0x6c, 0xd5, 0x44, 0x19, 0x19, 0x62, 0xa2, 0x7c, 0x0b, 0x66, 0xeb, - 0xb4, 0xed, 0x76, 0xf7, 0xfc, 0x40, 0xfa, 0x68, 0x5e, 0x86, 0x69, 0x05, 0xca, 0x9c, 0x2d, 0x66, - 0xb1, 0x81, 0xaf, 0x75, 0x44, 0xbc, 0x95, 0x98, 0xc5, 0xd6, 0xdf, 0xc8, 0xc3, 0xc9, 0x4a, 0x43, - 0x18, 0x25, 0x89, 0x02, 0x69, 0x3b, 0xf9, 0x19, 0xd7, 0x4d, 0xae, 0xc0, 0xc4, 0x1d, 0xf7, 0xd1, - 0x1a, 0x75, 0x43, 0x1a, 0x8a, 0x5c, 0x50, 0x5c, 0x50, 0x73, 0x1f, 0xc5, 0xb6, 0x3a, 0x76, 0x8c, - 0xa3, 0xdf, 0x64, 0x47, 0x3e, 0xe5, 0x4d, 0xd6, 0x82, 0xb1, 0x55, 0xbf, 0xd5, 0x14, 0xc7, 0x98, - 0x78, 0xc5, 0xdb, 0x43, 0x88, 0x2d, 0x4a, 0xd8, 0x05, 0x70, 0x46, 0x7d, 0x31, 0x7e, 0xc2, 0x67, - 0xde, 0x25, 0x17, 0x60, 0x1c, 0x2b, 0x52, 0xd9, 0x74, 0xf1, 0xd0, 0x68, 0x51, 0xcc, 0xe8, 0xd3, - 0xb4, 0x65, 0xa1, 0xde, 0x13, 0xa3, 0x9f, 0xae, 0x27, 0xac, 0xbf, 0x8b, 0x0f, 0x84, 0x7a, 0x2b, - 0xd9, 0x49, 0xa4, 0x7d, 0x48, 0x6e, 0xc8, 0x0f, 0xc9, 0x3f, 0xb5, 0x21, 0x29, 0xf4, 0x1d, 0x92, - 0xef, 0xe6, 0x61, 0x52, 0x7d, 0xec, 0x0f, 0x58, 0x20, 0x63, 0xd5, 0xae, 0xa1, 0xe2, 0x2a, 0xd4, - 0xb5, 0xbd, 0x42, 0x84, 0x2f, 0xf8, 0x00, 0xc6, 0xc4, 0x62, 0xca, 0x25, 0x6c, 0x08, 0x13, 0xa3, - 0xbb, 0x34, 0x23, 0x58, 0x8f, 0xe1, 0x80, 0x86, 0xb6, 0xa0, 0xc3, 0xc0, 0x15, 0xf7, 0xe9, 0xb6, - 0x78, 0x2f, 0x7e, 0x66, 0xcf, 0xa8, 0xec, 0xc0, 0x15, 0x71, 0xc3, 0x86, 0x3a, 0x9d, 0x7e, 0xbe, - 0x08, 0xa5, 0x24, 0xc9, 0xd1, 0xa1, 0xa2, 0x37, 0x7b, 0xdb, 0x5c, 0x0a, 0xe7, 0xa1, 0xa2, 0xbb, - 0xbd, 0x6d, 0x9b, 0xc1, 0xd0, 0x9c, 0x24, 0xf0, 0x1e, 0x62, 0xab, 0xa7, 0x84, 0x39, 0x49, 0xe0, - 0x3d, 0x34, 0xcc, 0x49, 0x02, 0xef, 0x21, 0x5e, 0x7d, 0xd7, 0xea, 0xe8, 0x6b, 0x8b, 0x22, 0xb8, - 0xb8, 0xfa, 0xb6, 0xc2, 0x64, 0x8a, 0x15, 0x89, 0xc6, 0x8e, 0xca, 0x25, 0xea, 0x06, 0x22, 0xac, - 0xb1, 0xd8, 0xce, 0xf0, 0xa8, 0xdc, 0x46, 0x30, 0xcf, 0x88, 0x6c, 0xeb, 0x48, 0xa4, 0x05, 0x44, - 0xfb, 0x29, 0x17, 0xf0, 0xd1, 0xb7, 0x41, 0x69, 0xff, 0x73, 0x4c, 0x67, 0xed, 0xe8, 0xab, 0x39, - 0x83, 0xef, 0xd3, 0x54, 0x40, 0x6e, 0x8a, 0x58, 0x6d, 0xa8, 0xf2, 0x28, 0x1e, 0xc9, 0x4c, 0x3a, - 0xa3, 0x03, 0x8f, 0xe5, 0xa6, 0x14, 0x1f, 0x31, 0x13, 0xf2, 0x1e, 0x4c, 0xea, 0x1e, 0xd4, 0xdc, - 0xcf, 0xf7, 0x05, 0x1e, 0x7e, 0xab, 0x4f, 0x52, 0x3e, 0x9d, 0x80, 0x6c, 0xc3, 0xc9, 0x65, 0xbf, - 0x13, 0xf6, 0xda, 0x32, 0xd0, 0x57, 0x1c, 0x5e, 0x14, 0x70, 0x28, 0xd0, 0x1d, 0xb3, 0x21, 0x50, - 0x84, 0xc3, 0xae, 0x34, 0xd0, 0x36, 0x2f, 0x20, 0xfd, 0x18, 0x91, 0x2d, 0x98, 0x44, 0x25, 0x9e, - 0xb0, 0x00, 0x9b, 0x34, 0xb7, 0x8d, 0xb8, 0xa4, 0xca, 0x16, 0x06, 0x8f, 0x54, 0xe3, 0xb6, 0x5b, - 0xd2, 0x3e, 0x58, 0x57, 0x46, 0x6a, 0xc8, 0xe4, 0xeb, 0x30, 0xc3, 0xaf, 0x9b, 0xf7, 0xe9, 0x36, - 0x9f, 0x3b, 0x53, 0xc6, 0xdd, 0xd9, 0x2c, 0xe4, 0xef, 0xc9, 0x42, 0x75, 0xba, 0x4f, 0xb7, 0xf9, - 0xd8, 0x1b, 0xd6, 0xf9, 0x06, 0x3e, 0xb9, 0x0b, 0xf3, 0xab, 0x6e, 0xc8, 0x81, 0x9a, 0x2b, 0xec, - 0x34, 0xea, 0x14, 0xd1, 0x6a, 0x72, 0xcf, 0x0d, 0xa5, 0x2e, 0x36, 0xd3, 0xf5, 0x35, 0x8b, 0x9e, - 0x7c, 0x27, 0x07, 0x0b, 0x86, 0xaa, 0x56, 0xd8, 0xee, 0xb4, 0x69, 0x27, 0x42, 0x33, 0xfc, 0x19, - 0x95, 0x8b, 0xb9, 0x1f, 0x1a, 0x1f, 0x92, 0x84, 0x36, 0x38, 0x88, 0xcb, 0x75, 0x73, 0xc4, 0x7e, - 0x3c, 0xac, 0xeb, 0xc9, 0xde, 0x13, 0x8a, 0x96, 0x9c, 0x52, 0xb4, 0x1c, 0x83, 0x51, 0xec, 0x23, - 0x19, 0x87, 0x03, 0x7f, 0x58, 0x9f, 0xd3, 0x77, 0x15, 0x21, 0xe4, 0x0d, 0xdc, 0x55, 0xac, 0xff, - 0x76, 0x0c, 0x66, 0x13, 0x83, 0x2c, 0x6e, 0x9d, 0xb9, 0xd4, 0xad, 0xb3, 0x0e, 0xc0, 0x55, 0x8d, - 0x43, 0xea, 0x04, 0xa5, 0x43, 0xcf, 0xa4, 0xf0, 0x8f, 0x53, 0x2b, 0x44, 0x63, 0xc3, 0x98, 0xf2, - 0xf5, 0x37, 0xa4, 0x8e, 0x56, 0x31, 0xe5, 0x4b, 0x58, 0x63, 0x1a, 0xb3, 0x21, 0x65, 0x18, 0xc5, - 0xe0, 0x79, 0xba, 0x3f, 0x95, 0xc7, 0x00, 0x36, 0x87, 0x93, 0xf3, 0x30, 0xc6, 0x44, 0x22, 0x95, - 0xdf, 0x1f, 0x4f, 0x0a, 0x26, 0x33, 0x31, 0xf9, 0x43, 0x14, 0x91, 0xeb, 0x30, 0xc5, 0xff, 0x12, - 0xf1, 0x13, 0xc6, 0x4c, 0xf3, 0x30, 0xc7, 0x6b, 0xca, 0x10, 0x0a, 0x06, 0x1e, 0xbb, 0x2b, 0xd4, - 0x7b, 0xa8, 0x7f, 0xa8, 0x55, 0x45, 0xb4, 0x55, 0xbc, 0x2b, 0x84, 0x1c, 0x88, 0x99, 0xcb, 0x15, - 0x02, 0x93, 0x4c, 0x84, 0x55, 0x73, 0x11, 0x6f, 0x88, 0x28, 0x99, 0x70, 0x6b, 0x66, 0x5b, 0x94, - 0x90, 0x4b, 0x5c, 0xb5, 0x8f, 0x42, 0x1e, 0x4f, 0x10, 0x85, 0x7a, 0x73, 0x54, 0x33, 0xa0, 0xa4, - 0xa7, 0x8a, 0x59, 0xe5, 0xec, 0xef, 0x95, 0xb6, 0xeb, 0xb5, 0xc4, 0x26, 0x81, 0x95, 0x23, 0x2e, - 0x65, 0x50, 0x3b, 0x46, 0x20, 0xef, 0xc0, 0x0c, 0xfb, 0xb1, 0xec, 0xb7, 0xdb, 0x7e, 0x07, 0xd9, - 0x4f, 0xc6, 0xa1, 0x78, 0x90, 0xa4, 0x81, 0x45, 0xbc, 0x96, 0x04, 0x2e, 0x3b, 0x1d, 0xf0, 0xd9, - 0xb0, 0xc7, 0x1f, 0x1d, 0xa6, 0xe2, 0xd3, 0x01, 0x49, 0x43, 0x0e, 0xb7, 0x75, 0x24, 0xf2, 0x16, - 0x4c, 0xb3, 0x9f, 0x37, 0xbd, 0x87, 0x94, 0x57, 0x38, 0x1d, 0xbf, 0x97, 0x23, 0xd5, 0x2e, 0x2b, - 0xe1, 0xf5, 0x99, 0x98, 0xe4, 0xcb, 0x70, 0x1c, 0x39, 0x35, 0xfc, 0x2e, 0x6d, 0x56, 0x76, 0x76, - 0xbc, 0x96, 0xc7, 0xed, 0x75, 0x78, 0xa4, 0x00, 0xd4, 0x01, 0xf3, 0x8a, 0x11, 0xc3, 0x71, 0x63, - 0x14, 0x3b, 0x9b, 0x92, 0xdc, 0x87, 0xd2, 0x72, 0x2f, 0x8c, 0xfc, 0x76, 0x25, 0x8a, 0x02, 0x6f, - 0xbb, 0x17, 0xd1, 0x70, 0x61, 0xd6, 0xf0, 0xa7, 0x67, 0x8b, 0x43, 0x15, 0x72, 0xed, 0x4e, 0x03, - 0x29, 0x1c, 0x57, 0x91, 0xd8, 0x29, 0x26, 0xd6, 0x3f, 0xc9, 0xc1, 0xb4, 0x41, 0x4a, 0xde, 0x84, - 0xa9, 0x1b, 0x81, 0x47, 0x3b, 0xcd, 0xd6, 0x81, 0x76, 0xed, 0xc4, 0x3b, 0xc9, 0x8e, 0x80, 0xf3, - 0x56, 0x1b, 0x68, 0x4a, 0x6b, 0x93, 0xcf, 0x34, 0xa6, 0xbb, 0xc2, 0xdd, 0xfa, 0xc4, 0x04, 0x2d, - 0xc4, 0x01, 0x3e, 0x70, 0x82, 0x8a, 0xd9, 0xa9, 0xa1, 0x90, 0x77, 0x61, 0x8c, 0x3f, 0x30, 0x0a, - 0xcb, 0xae, 0x53, 0x59, 0xcd, 0xe4, 0x2e, 0xa4, 0x38, 0x11, 0xd1, 0x8a, 0x24, 0xb4, 0x05, 0x91, - 0xf5, 0x33, 0x39, 0x20, 0x69, 0xd4, 0x23, 0xb4, 0x58, 0x47, 0x5a, 0xa7, 0x7c, 0xa0, 0x56, 0x63, - 0xc1, 0xd0, 0xd9, 0xb2, 0x9a, 0x78, 0x01, 0xef, 0x78, 0xb1, 0xea, 0x74, 0xb5, 0x1a, 0x2f, 0xb6, - 0xfe, 0x52, 0x1e, 0x20, 0xc6, 0x26, 0x5f, 0xe4, 0x39, 0x4a, 0xbe, 0xdc, 0x73, 0x5b, 0xde, 0x8e, - 0x67, 0x06, 0xed, 0x43, 0x26, 0xdf, 0x92, 0x25, 0xb6, 0x89, 0x48, 0xde, 0x87, 0xd9, 0xfa, 0xa6, - 0x49, 0xab, 0xe5, 0x63, 0x08, 0xbb, 0x4e, 0x82, 0x3c, 0x89, 0x8d, 0x16, 0x9c, 0xfa, 0x68, 0x70, - 0x0b, 0x4e, 0x3e, 0x10, 0xa2, 0x84, 0x6d, 0x2c, 0xf5, 0x4d, 0x61, 0x34, 0xdc, 0xac, 0x55, 0xc5, - 0x2e, 0x85, 0x5f, 0x17, 0x76, 0x9d, 0xae, 0xb0, 0x26, 0x66, 0xfb, 0x84, 0x81, 0x17, 0x77, 0xe4, - 0x68, 0x1f, 0x37, 0xd1, 0x9f, 0x45, 0x25, 0x5e, 0xdb, 0x8f, 0xa8, 0xd0, 0x5d, 0x3c, 0xb3, 0xb7, - 0x98, 0xf8, 0x75, 0x7a, 0xd4, 0xf0, 0x7e, 0x33, 0x5a, 0x27, 0x2c, 0x30, 0xae, 0xc5, 0x57, 0x0e, - 0xfe, 0x4e, 0x9d, 0x61, 0xb4, 0xf1, 0xb7, 0x73, 0x70, 0x3c, 0x93, 0x96, 0x5c, 0x06, 0x88, 0x35, - 0x44, 0xa2, 0x97, 0x70, 0xc7, 0x8c, 0xc3, 0x5a, 0xd8, 0x1a, 0x06, 0xf9, 0x5a, 0x52, 0xb7, 0x73, - 0xf4, 0x41, 0x78, 0x5a, 0x86, 0x2d, 0x32, 0x75, 0x3b, 0x19, 0x1a, 0x1d, 0xeb, 0xef, 0x15, 0x60, - 0x4e, 0x8b, 0x9a, 0xc1, 0xbf, 0xf5, 0x08, 0x8b, 0xda, 0x07, 0x30, 0xc5, 0x5a, 0xe3, 0x35, 0x84, - 0x0b, 0x0e, 0xb7, 0xa4, 0x78, 0x35, 0xe5, 0xbf, 0x24, 0xb8, 0x5d, 0xd6, 0x91, 0x79, 0x30, 0x31, - 0xdc, 0x3a, 0x51, 0x73, 0xde, 0x48, 0xbb, 0xe2, 0x18, 0xcc, 0x49, 0x08, 0xd3, 0xd5, 0x83, 0x8e, - 0xdb, 0x56, 0xb5, 0x71, 0x8b, 0x8a, 0xd7, 0xfa, 0xd6, 0x66, 0x60, 0xf3, 0xea, 0x62, 0x4b, 0x7f, - 0x5e, 0x96, 0xe1, 0x64, 0x6a, 0x50, 0x9d, 0x7e, 0x1f, 0xe6, 0x52, 0x1f, 0xfd, 0x44, 0x71, 0xcd, - 0xee, 0x03, 0x49, 0x7f, 0x47, 0x06, 0x87, 0xd7, 0xcc, 0xa8, 0x79, 0xc7, 0xd5, 0xe3, 0x29, 0x66, - 0x4c, 0xe6, 0xf6, 0x19, 0x8b, 0x7a, 0xd4, 0xb3, 0x9f, 0xcd, 0xeb, 0x3e, 0x64, 0xcf, 0xfa, 0xaa, - 0xfb, 0xc0, 0xb8, 0xdb, 0x9e, 0xed, 0x37, 0xa6, 0x43, 0xe9, 0x10, 0xbe, 0x5f, 0x80, 0x93, 0x7d, - 0x28, 0xc9, 0x41, 0x72, 0x12, 0x71, 0x9d, 0xc2, 0xd5, 0xc1, 0x15, 0x3e, 0x8d, 0xa9, 0x44, 0xbe, - 0xc8, 0xbd, 0xc8, 0x1b, 0x98, 0x95, 0x57, 0xdc, 0xa6, 0x79, 0x92, 0x78, 0x05, 0x4d, 0xba, 0x8f, - 0x73, 0x28, 0x79, 0x1f, 0x46, 0xd1, 0x81, 0x30, 0x11, 0xb5, 0x8b, 0x61, 0x20, 0x5c, 0x0b, 0x71, - 0xc6, 0x7e, 0x1a, 0x21, 0xce, 0x18, 0x80, 0x7c, 0x01, 0x0a, 0x95, 0xfb, 0x75, 0x31, 0x2e, 0x33, - 0x3a, 0xf9, 0xfd, 0x7a, 0x1c, 0x59, 0xdd, 0x35, 0x42, 0xa0, 0x33, 0x0a, 0x46, 0x78, 0x73, 0x79, - 0x53, 0x8c, 0x8a, 0x4e, 0x78, 0x73, 0x79, 0x33, 0x26, 0xdc, 0x6d, 0x18, 0x51, 0x50, 0x6e, 0x2e, - 0x6f, 0x7e, 0x76, 0xd3, 0xfe, 0xdf, 0xca, 0x73, 0xd7, 0x77, 0xde, 0xb0, 0xf7, 0x61, 0xca, 0x88, - 0x6a, 0x9a, 0x8b, 0xe5, 0x31, 0x15, 0x3c, 0x36, 0x61, 0x82, 0x62, 0x10, 0xc8, 0x1c, 0x05, 0xec, - 0x37, 0x4a, 0xbc, 0xba, 0xb1, 0x87, 0xe2, 0x80, 0x32, 0x71, 0x32, 0x47, 0x81, 0x22, 0x21, 0xd7, - 0xa0, 0xb8, 0x45, 0x3b, 0x6e, 0x27, 0x52, 0xea, 0x4d, 0xb4, 0x56, 0x8d, 0x10, 0x66, 0x4a, 0x0d, - 0x0a, 0x11, 0x2d, 0x2b, 0x7b, 0xdb, 0x61, 0x23, 0xf0, 0x30, 0x44, 0x86, 0x3a, 0x8b, 0xb9, 0x65, - 0xa5, 0x56, 0x62, 0x32, 0x48, 0x10, 0x59, 0x3f, 0x9b, 0x83, 0x71, 0x31, 0x90, 0x3c, 0xb7, 0xcc, - 0x6e, 0x7c, 0x96, 0x88, 0xdc, 0x32, 0xbb, 0x5e, 0x32, 0xb7, 0xcc, 0x2e, 0x8f, 0x43, 0x31, 0x21, - 0xbc, 0x38, 0xd5, 0x43, 0x1f, 0x4f, 0x45, 0xce, 0x81, 0x66, 0xb5, 0x31, 0xea, 0xb0, 0x2e, 0x2b, - 0xd6, 0xdf, 0x14, 0x5f, 0x76, 0x73, 0x79, 0x93, 0x2c, 0x42, 0x71, 0xcd, 0xe7, 0x31, 0x4e, 0xf4, - 0x44, 0x81, 0x2d, 0x01, 0xd3, 0x3b, 0x48, 0xe2, 0xb1, 0xef, 0xdb, 0x0c, 0x7c, 0x71, 0x97, 0xd1, - 0xbe, 0xaf, 0xcb, 0x81, 0x89, 0xef, 0x53, 0xa8, 0x43, 0x7f, 0x1f, 0xcd, 0xd8, 0x24, 0xee, 0x5d, - 0xc3, 0xe0, 0xed, 0xb7, 0x74, 0x57, 0x20, 0x51, 0x24, 0x77, 0x8a, 0xd3, 0xfd, 0x76, 0x8a, 0x7b, - 0xd7, 0xec, 0x0c, 0x2a, 0x7c, 0x25, 0x8b, 0xc1, 0x75, 0x1a, 0x3c, 0x7c, 0x86, 0x77, 0xe9, 0xec, - 0x57, 0xb2, 0x64, 0xf3, 0x86, 0xda, 0xa4, 0xff, 0x71, 0x1e, 0x4e, 0x64, 0x13, 0xea, 0x6d, 0xc9, - 0x0d, 0x68, 0xcb, 0x45, 0x28, 0xae, 0xfa, 0x61, 0xa4, 0x59, 0x9d, 0xa1, 0x32, 0x7f, 0x4f, 0xc0, - 0x6c, 0x55, 0xca, 0xee, 0xdc, 0xec, 0x6f, 0xb5, 0x3c, 0x91, 0x1f, 0x3a, 0x7c, 0xb3, 0x3b, 0x37, - 0x2f, 0x22, 0x37, 0xa1, 0x68, 0x0b, 0x57, 0x94, 0x44, 0xd7, 0x48, 0xb0, 0x92, 0xa6, 0x48, 0x20, - 0x20, 0x46, 0x70, 0x59, 0x01, 0x23, 0x15, 0x18, 0x17, 0xa3, 0x9f, 0x78, 0x08, 0xce, 0x98, 0x32, - 0x66, 0xbc, 0x67, 0x49, 0xc7, 0x76, 0x14, 0x7c, 0xd2, 0xab, 0x55, 0xa5, 0x57, 0x09, 0xee, 0x28, - 0xfc, 0xc9, 0xcf, 0x34, 0xf0, 0x53, 0x88, 0xd6, 0x77, 0xf2, 0x00, 0x52, 0x6b, 0xf3, 0xcc, 0xce, - 0xb0, 0x2f, 0x18, 0x33, 0x4c, 0xb3, 0x77, 0x19, 0x3e, 0x17, 0xe2, 0x06, 0xda, 0x9d, 0x0c, 0x9f, - 0x09, 0xb1, 0x0c, 0xa3, 0x5b, 0xb1, 0x42, 0x4b, 0xf8, 0x38, 0xa0, 0x72, 0x99, 0xc3, 0xad, 0x6d, - 0x38, 0x76, 0x93, 0x46, 0xb1, 0x7a, 0x4b, 0x3e, 0x24, 0x0e, 0x66, 0xfb, 0x3a, 0x4c, 0x08, 0x7c, - 0xb5, 0x7f, 0x71, 0x5d, 0x8c, 0x88, 0xa1, 0x80, 0xba, 0x18, 0x89, 0xc0, 0x76, 0xa3, 0x2a, 0x6d, - 0xd1, 0x88, 0x7e, 0xb6, 0xd5, 0xd4, 0x81, 0xf0, 0xa6, 0x60, 0xcb, 0x86, 0xab, 0xe1, 0xc8, 0xfe, - 0xb9, 0x07, 0xc7, 0xd5, 0xb7, 0x3f, 0x4d, 0xbe, 0x57, 0xd8, 0x95, 0x52, 0x84, 0x4a, 0x8e, 0x39, - 0x0e, 0xb0, 0x24, 0x79, 0x04, 0xa7, 0x25, 0xc1, 0x7d, 0x4f, 0x19, 0xee, 0x0d, 0x45, 0x4b, 0xde, - 0x81, 0x49, 0x8d, 0x46, 0x84, 0xfa, 0x45, 0xa5, 0xf3, 0xbe, 0x17, 0xed, 0x39, 0x21, 0x87, 0xeb, - 0x4a, 0x67, 0x0d, 0xdd, 0xfa, 0x2a, 0x3c, 0xaf, 0xfc, 0x50, 0x32, 0xaa, 0x4e, 0x30, 0xcf, 0x3d, - 0x19, 0xf3, 0xf5, 0xb8, 0x59, 0xb5, 0x8e, 0xf2, 0x1d, 0x95, 0xbc, 0x89, 0xde, 0x2c, 0xd1, 0x98, - 0x17, 0x52, 0xde, 0xa8, 0x9a, 0xd3, 0xa9, 0xf5, 0xb6, 0xf6, 0xb1, 0x19, 0x0c, 0x0d, 0xe2, 0x5c, - 0x92, 0xf8, 0x3b, 0x79, 0x98, 0xdd, 0xa8, 0x55, 0x97, 0x95, 0x2d, 0xd1, 0x0f, 0x58, 0xa6, 0x46, - 0xa3, 0x6d, 0xfd, 0xf7, 0x1b, 0xeb, 0x2e, 0xcc, 0x27, 0xba, 0x01, 0x45, 0x87, 0xf7, 0xb8, 0x07, - 0x83, 0x02, 0x4b, 0xb1, 0xe1, 0x44, 0x16, 0xfb, 0x7b, 0xd7, 0xec, 0x04, 0xb6, 0xf5, 0x4f, 0x27, - 0x12, 0x7c, 0xc5, 0x16, 0xf6, 0x3a, 0x4c, 0xd4, 0xc2, 0xb0, 0x47, 0x83, 0xbb, 0xf6, 0x9a, 0xae, - 0x2a, 0xf0, 0x10, 0xe8, 0xf4, 0x82, 0x96, 0x1d, 0x23, 0x90, 0x4b, 0x50, 0x14, 0xd1, 0x6f, 0xe5, - 0x9e, 0x80, 0x5a, 0x5b, 0x15, 0x3c, 0xd7, 0x56, 0xc5, 0xe4, 0x4d, 0x98, 0xe2, 0x7f, 0xf3, 0xd9, - 0x26, 0x3a, 0x1c, 0x95, 0x83, 0x02, 0x9d, 0xcf, 0x4e, 0xdb, 0x40, 0x23, 0xaf, 0x42, 0xa1, 0xb2, - 0x6c, 0x0b, 0x75, 0x90, 0x90, 0x1b, 0x31, 0xff, 0x72, 0x8f, 0x9a, 0x97, 0x88, 0x65, 0x9b, 0x49, - 0x7f, 0xd2, 0x4f, 0x5d, 0x68, 0xb2, 0x79, 0x9a, 0x68, 0x01, 0x4b, 0x1c, 0x66, 0x08, 0x23, 0x57, - 0x60, 0xbc, 0xea, 0x85, 0xdd, 0x96, 0x7b, 0x20, 0xf4, 0xd8, 0x3c, 0x0d, 0x11, 0x07, 0x19, 0xee, - 0xe7, 0x1c, 0x44, 0x2e, 0xc9, 0xf4, 0x2c, 0xc5, 0xd8, 0x11, 0xa2, 0x4f, 0x0e, 0x96, 0xd7, 0x61, - 0x4c, 0xc4, 0x88, 0x9d, 0xd0, 0xa2, 0xbf, 0x27, 0x63, 0xc3, 0x0a, 0x9c, 0xb4, 0x47, 0x24, 0x3c, - 0x4d, 0x8f, 0xc8, 0x6d, 0x38, 0x79, 0x13, 0xb5, 0x37, 0x66, 0x60, 0x95, 0xbb, 0x76, 0x4d, 0xe8, - 0xc3, 0xf1, 0x51, 0x87, 0x2b, 0x78, 0x92, 0xb1, 0x59, 0x9c, 0x5e, 0xa0, 0x67, 0xd5, 0xeb, 0xc7, - 0x88, 0x7c, 0x05, 0x8e, 0x65, 0x15, 0x09, 0xad, 0x39, 0x86, 0x10, 0xc9, 0xae, 0x40, 0x0f, 0x21, - 0x92, 0xc5, 0x81, 0xac, 0x41, 0x89, 0xc3, 0x2b, 0xcd, 0xb6, 0xd7, 0xe1, 0x9a, 0x7f, 0xae, 0x55, - 0x47, 0xcf, 0x04, 0xc1, 0xd5, 0x65, 0x85, 0xfc, 0x05, 0xc0, 0xf0, 0x65, 0x49, 0x50, 0x92, 0x9f, - 0xcc, 0xb1, 0xdb, 0x1c, 0x8f, 0xa8, 0x7a, 0xd7, 0x5e, 0x0b, 0x45, 0xf8, 0xa9, 0x13, 0xb1, 0x9b, - 0x4a, 0x3d, 0x0a, 0xbc, 0xce, 0xae, 0xf0, 0x53, 0xd9, 0x12, 0x7e, 0x2a, 0xef, 0x7c, 0x22, 0x3f, - 0x15, 0xce, 0x2a, 0x7c, 0x7c, 0x58, 0x9e, 0x0a, 0x44, 0x9d, 0xb8, 0x8a, 0x8c, 0x2f, 0xc0, 0x8c, - 0xf0, 0xad, 0x96, 0xbf, 0x7f, 0xb7, 0xc3, 0xe3, 0x39, 0xd2, 0x26, 0x6f, 0xe4, 0x2c, 0xee, 0xe0, - 0x3c, 0x23, 0x3c, 0x2b, 0x77, 0x7a, 0x0a, 0x21, 0xd5, 0xd0, 0x4c, 0x0e, 0xec, 0xe2, 0x29, 0x7d, - 0x21, 0xb8, 0x7b, 0x67, 0x29, 0xbe, 0x78, 0x4a, 0xc7, 0x09, 0x07, 0xa7, 0x91, 0x3e, 0x79, 0x0c, - 0x12, 0x72, 0x05, 0xc6, 0xee, 0xb8, 0x8f, 0x2a, 0xbb, 0x54, 0xa4, 0xdd, 0x9a, 0x96, 0xdb, 0x1f, - 0x02, 0x97, 0x8a, 0xbf, 0xc7, 0x6d, 0xed, 0x9f, 0xb3, 0x05, 0x1a, 0xf9, 0x91, 0x1c, 0x9c, 0xe0, - 0xcb, 0x58, 0xb6, 0xb2, 0x4e, 0xa3, 0x88, 0xf5, 0x83, 0x88, 0x43, 0x25, 0x93, 0x56, 0xd4, 0xeb, - 0x1b, 0xd9, 0x78, 0x3c, 0x7f, 0xb9, 0xd8, 0x19, 0x54, 0xc7, 0x85, 0xa2, 0xd4, 0x88, 0xb0, 0x99, - 0x49, 0x2f, 0xec, 0xc8, 0xbf, 0x20, 0xbf, 0x9c, 0xbc, 0xa1, 0x7b, 0x21, 0x16, 0x50, 0xce, 0x1d, - 0x6f, 0xbb, 0x8f, 0x1c, 0x77, 0x97, 0x1a, 0xaf, 0xd3, 0x42, 0xcf, 0xfc, 0xd3, 0x39, 0x38, 0xd5, - 0xf7, 0xe3, 0xc8, 0x75, 0x38, 0x29, 0x53, 0xd9, 0xef, 0x45, 0x51, 0x37, 0x74, 0xe4, 0x65, 0x40, - 0xf8, 0x2d, 0xda, 0xc7, 0x45, 0xf1, 0x2a, 0x2b, 0x95, 0xf7, 0x83, 0x90, 0xbc, 0x0f, 0x2f, 0x78, - 0x9d, 0x90, 0x36, 0x7a, 0x01, 0x8d, 0x73, 0xe1, 0x7b, 0xcd, 0xc0, 0x09, 0xdc, 0xce, 0xae, 0x74, - 0xc2, 0xb4, 0x4f, 0x49, 0x1c, 0x99, 0x11, 0xdf, 0x6b, 0x06, 0x36, 0x22, 0x58, 0x7f, 0x38, 0xc1, - 0x4f, 0xc5, 0x4a, 0x2f, 0xda, 0x93, 0xe7, 0xe8, 0x62, 0x96, 0x4f, 0x0d, 0x37, 0xf6, 0xd3, 0x7c, - 0x6a, 0x4c, 0x4f, 0x1a, 0xf9, 0x9c, 0x91, 0xcf, 0x7c, 0xce, 0x78, 0x1d, 0x26, 0x96, 0xf7, 0x68, - 0xe3, 0x81, 0xf2, 0x6b, 0x28, 0x0a, 0x7d, 0x31, 0x03, 0xf2, 0xf0, 0xad, 0x31, 0x02, 0xb9, 0x02, - 0x80, 0xae, 0x7c, 0x5c, 0xc8, 0xd2, 0x42, 0xb0, 0xa3, 0xe7, 0x9f, 0xb0, 0x9f, 0xd0, 0x50, 0x90, - 0x7d, 0xdd, 0xbe, 0xa1, 0x1b, 0x5c, 0x70, 0xf6, 0x61, 0xb0, 0x23, 0xd0, 0x63, 0x04, 0xd6, 0x3c, - 0x6d, 0xa9, 0x88, 0x8d, 0xbd, 0x94, 0x5a, 0x4f, 0x3a, 0x12, 0xda, 0x32, 0x4a, 0x23, 0x6e, 0xdc, - 0xd7, 0xa7, 0x84, 0x2d, 0xa3, 0x32, 0xf8, 0xb6, 0x63, 0x04, 0xf2, 0x05, 0x18, 0x5f, 0xa6, 0x41, - 0xb4, 0xb5, 0xb5, 0x86, 0x36, 0x11, 0x3c, 0x4e, 0x79, 0x11, 0x63, 0x4a, 0x47, 0x51, 0xeb, 0xe3, - 0xc3, 0xf2, 0x74, 0xe4, 0xb5, 0xa9, 0x8a, 0xbf, 0x6a, 0x4b, 0x6c, 0xb2, 0x04, 0x25, 0xfe, 0xce, - 0x1b, 0x0b, 0xd3, 0xb8, 0xd5, 0x17, 0xf9, 0xc1, 0x23, 0x1e, 0x85, 0xf7, 0xe9, 0xb6, 0x8a, 0xa8, - 0x9d, 0xc2, 0x27, 0x2b, 0x32, 0x10, 0xbd, 0xde, 0x48, 0x88, 0xb5, 0x3b, 0xc9, 0x25, 0xc0, 0xda, - 0x9a, 0xa6, 0x20, 0x15, 0x98, 0x5e, 0xf6, 0xdb, 0x5d, 0x37, 0xf2, 0x30, 0xab, 0xd3, 0x81, 0xd8, - 0xd5, 0x51, 0x43, 0xd5, 0xd0, 0x0b, 0x8c, 0x23, 0x42, 0x2f, 0x20, 0x37, 0x60, 0xc6, 0xf6, 0x7b, - 0x6c, 0x90, 0xe4, 0xb5, 0x92, 0x6f, 0xdc, 0x68, 0xb9, 0x10, 0xb0, 0x12, 0x76, 0xce, 0x88, 0x3b, - 0xa4, 0x11, 0x1a, 0xcf, 0xa0, 0x22, 0xeb, 0x19, 0xfa, 0x7d, 0x7d, 0xb7, 0xd6, 0xe3, 0x6a, 0xa7, - 0x98, 0x65, 0x3c, 0x0d, 0x5c, 0x83, 0xc9, 0x7a, 0x7d, 0x63, 0x8b, 0x86, 0xd1, 0x8d, 0x96, 0xbf, - 0x8f, 0x9b, 0x75, 0x51, 0xe4, 0x1b, 0x09, 0x7d, 0x27, 0xa2, 0x61, 0xe4, 0xec, 0xb4, 0xfc, 0x7d, - 0x5b, 0xc7, 0x22, 0xdf, 0x60, 0xfd, 0xa1, 0x89, 0x36, 0x22, 0x08, 0xe0, 0x20, 0xe9, 0x0b, 0xb7, - 0xc4, 0x78, 0xc9, 0x30, 0x19, 0xcc, 0xec, 0x2c, 0x0d, 0x1d, 0x9d, 0x74, 0xd8, 0x85, 0xb8, 0xd2, - 0x6c, 0x06, 0x34, 0x0c, 0xc5, 0xae, 0xca, 0x9d, 0x74, 0xf0, 0xf6, 0xec, 0xf2, 0x02, 0xc3, 0x49, - 0x47, 0x23, 0x20, 0xdf, 0xcd, 0xc1, 0x71, 0xdd, 0xce, 0x1f, 0x17, 0x0b, 0x5a, 0x61, 0xf0, 0x3d, - 0xf6, 0x8d, 0xcb, 0xf2, 0x54, 0xb9, 0xac, 0xa1, 0x5d, 0x7e, 0x78, 0xf5, 0x72, 0x25, 0xfe, 0x59, - 0x97, 0x44, 0x22, 0x8e, 0x56, 0x16, 0x3f, 0xfd, 0x84, 0x70, 0x33, 0x48, 0xc9, 0x32, 0x13, 0x3c, - 0xd8, 0x7c, 0x42, 0xab, 0x9e, 0xda, 0x26, 0x6e, 0xd1, 0x42, 0x41, 0x28, 0x66, 0x1f, 0xb7, 0xff, - 0xf1, 0xba, 0xa6, 0x7c, 0xa1, 0xd1, 0x90, 0x1a, 0xcc, 0x72, 0x00, 0xdb, 0x12, 0x78, 0x32, 0x8a, - 0xf9, 0x38, 0x20, 0xb6, 0x60, 0x83, 0x4f, 0xd7, 0x98, 0x90, 0x42, 0x8f, 0x59, 0x97, 0xa0, 0x43, - 0xc9, 0xbf, 0x5e, 0xb9, 0xb3, 0x16, 0x8b, 0xaf, 0x3f, 0x58, 0x76, 0xfa, 0x46, 0xdb, 0x06, 0xd8, - 0xe9, 0xdf, 0xe5, 0x9e, 0x8b, 0x5a, 0x37, 0x48, 0xc9, 0xdf, 0x00, 0x27, 0x25, 0xff, 0x04, 0x8d, - 0x9d, 0xc0, 0xb6, 0x3e, 0x2e, 0x26, 0xf8, 0x0a, 0xdb, 0x3c, 0x0b, 0xc6, 0xb8, 0x60, 0xaf, 0x67, - 0x36, 0xe7, 0x62, 0xbf, 0x2d, 0x4a, 0xc8, 0x29, 0x28, 0xd4, 0xeb, 0x1b, 0xa2, 0x93, 0xd1, 0x42, - 0x2f, 0x0c, 0x7d, 0x9b, 0xc1, 0xd8, 0x08, 0xa1, 0xd9, 0x9d, 0x16, 0xfe, 0x97, 0xed, 0xa0, 0x36, - 0x42, 0x59, 0x7f, 0x4b, 0x31, 0x7b, 0x24, 0xee, 0x6f, 0x21, 0x66, 0xc7, 0xc2, 0xf5, 0x32, 0x2c, - 0x54, 0xc2, 0x90, 0x06, 0x6c, 0x82, 0x0a, 0x6b, 0xae, 0x40, 0x88, 0x82, 0xe2, 0xa0, 0xc0, 0x4a, - 0xdd, 0x46, 0x68, 0xf7, 0x45, 0x24, 0x17, 0xa1, 0x58, 0xe9, 0x35, 0x3d, 0xda, 0x69, 0x18, 0xb1, - 0x7d, 0x5c, 0x01, 0xb3, 0x55, 0x29, 0xf9, 0x32, 0x1c, 0x4f, 0xc4, 0xb7, 0x12, 0x3d, 0x30, 0x1e, - 0xaf, 0x66, 0x29, 0xaa, 0xc6, 0x6f, 0xd6, 0xbc, 0x4b, 0xb2, 0x29, 0x49, 0x05, 0x4a, 0x2b, 0xe8, - 0x97, 0x52, 0xa5, 0x5c, 0x7d, 0xee, 0x07, 0xdc, 0xd7, 0x86, 0x5f, 0x2c, 0xb8, 0xcf, 0x8a, 0xd3, - 0x54, 0x85, 0x76, 0x0a, 0x9d, 0xdc, 0x86, 0xf9, 0x24, 0x8c, 0x9d, 0x09, 0xfc, 0x0e, 0x81, 0xf1, - 0x27, 0x53, 0x5c, 0xf0, 0x54, 0xc8, 0xa2, 0x22, 0xdb, 0x30, 0x17, 0xdb, 0x6c, 0x98, 0x37, 0x0b, - 0x69, 0xd8, 0xa9, 0xca, 0xe5, 0xed, 0xe2, 0x79, 0x31, 0x19, 0xe7, 0x63, 0xfb, 0x0f, 0x75, 0xc3, - 0xb0, 0xd3, 0xec, 0x48, 0x13, 0x66, 0xea, 0xde, 0x6e, 0xc7, 0xeb, 0xec, 0xde, 0xa6, 0x07, 0x9b, - 0xae, 0x17, 0x08, 0x13, 0x3b, 0x69, 0x40, 0x5b, 0x09, 0x0f, 0xda, 0x6d, 0x1a, 0x05, 0x78, 0xda, - 0xb2, 0x72, 0x74, 0x13, 0x65, 0x12, 0xe3, 0xe9, 0x90, 0xd3, 0xa1, 0x0b, 0x56, 0xd7, 0xf5, 0x8c, - 0x63, 0xc5, 0xe4, 0x69, 0xdc, 0xee, 0xa6, 0x86, 0xbc, 0xdd, 0xb5, 0x60, 0x6e, 0xa5, 0xd3, 0x08, - 0x0e, 0xf0, 0x15, 0x43, 0x7e, 0xdc, 0xf4, 0x11, 0x1f, 0xf7, 0x92, 0xf8, 0xb8, 0x17, 0x5c, 0x39, - 0xc3, 0xb2, 0x3e, 0x2f, 0xcd, 0x98, 0xd4, 0x61, 0x0e, 0x25, 0xb6, 0x5a, 0x75, 0xb3, 0xd6, 0xf1, - 0x22, 0x0f, 0xf3, 0x6f, 0xf3, 0xe3, 0xea, 0x65, 0xc1, 0xf3, 0x0c, 0x97, 0xe2, 0xbd, 0x66, 0xd7, - 0xf1, 0x24, 0x8a, 0xce, 0x34, 0x45, 0x3f, 0x48, 0x94, 0x9e, 0xfd, 0xd7, 0x23, 0x4a, 0x63, 0x86, - 0xaa, 0x84, 0xfb, 0x74, 0x29, 0xde, 0xdb, 0x43, 0x2c, 0x62, 0x47, 0x84, 0xdf, 0x43, 0xf1, 0xc4, - 0xc8, 0x50, 0x65, 0xd2, 0x59, 0xdf, 0x9d, 0xe0, 0x7b, 0xbb, 0x2e, 0xbf, 0xf6, 0x33, 0xc6, 0x4b, - 0xc8, 0xb5, 0xf9, 0x27, 0x91, 0x6b, 0x0b, 0x47, 0xcb, 0xb5, 0x23, 0x47, 0xc9, 0xb5, 0x09, 0xc1, - 0x73, 0xf4, 0x89, 0x05, 0xcf, 0xb1, 0x27, 0x10, 0x3c, 0xc7, 0x9f, 0x48, 0xf0, 0x34, 0x24, 0xe8, - 0xe2, 0x51, 0x12, 0xf4, 0x9f, 0x89, 0xa9, 0xcf, 0xaa, 0x98, 0x9a, 0x25, 0x2a, 0x3c, 0x91, 0x98, - 0xda, 0x5f, 0xca, 0x2c, 0xfd, 0x9b, 0x96, 0x32, 0xe7, 0x9e, 0x8e, 0x94, 0x49, 0x3e, 0xa1, 0x94, - 0xf9, 0xe7, 0xa0, 0x94, 0x3c, 0xf8, 0x8e, 0x0e, 0xeb, 0xf7, 0xd4, 0x42, 0x50, 0xb1, 0x63, 0x39, - 0x79, 0xf0, 0xb0, 0x8b, 0xf4, 0x66, 0xe0, 0x3d, 0x74, 0x23, 0x7a, 0x5b, 0x1a, 0x2f, 0x88, 0x90, - 0x94, 0x1c, 0x8a, 0xdb, 0x87, 0x86, 0xa2, 0x64, 0xae, 0x7c, 0x96, 0xcc, 0x65, 0xfd, 0x95, 0x3c, - 0xcc, 0xf1, 0x38, 0x2e, 0xcf, 0xbe, 0x0e, 0xfd, 0x3d, 0x43, 0x92, 0x96, 0xa6, 0x72, 0x89, 0xd6, - 0x0d, 0xd0, 0xa2, 0x7f, 0x1d, 0x8e, 0xa7, 0xba, 0x02, 0xa5, 0xe9, 0xaa, 0x8c, 0xa0, 0x93, 0x92, - 0xa7, 0x17, 0xb2, 0x2b, 0xb9, 0x77, 0xcd, 0x4e, 0x51, 0x58, 0xff, 0x6c, 0x24, 0xc5, 0x5f, 0xe8, - 0xd3, 0x75, 0x0d, 0x79, 0xee, 0xc9, 0x34, 0xe4, 0xf9, 0xe1, 0x34, 0xe4, 0x89, 0x63, 0xaa, 0x30, - 0xcc, 0x31, 0xf5, 0x65, 0x98, 0xde, 0xa2, 0x6e, 0x3b, 0xdc, 0xf2, 0x45, 0xdc, 0x79, 0x6e, 0x2a, - 0x2b, 0x03, 0xe4, 0xb0, 0x32, 0x29, 0x0c, 0x2a, 0x93, 0x9f, 0x88, 0x11, 0xb0, 0xad, 0x95, 0x07, - 0xa2, 0xb7, 0x4d, 0x0e, 0xba, 0x84, 0x3f, 0x3a, 0x40, 0xc2, 0xaf, 0xc3, 0x94, 0xa0, 0x8b, 0x63, - 0x19, 0xc6, 0xa2, 0x28, 0x2b, 0x42, 0xb8, 0xac, 0x5d, 0xa5, 0x43, 0x54, 0xb5, 0x73, 0x29, 0xd4, - 0x60, 0xc2, 0xba, 0x60, 0xa5, 0xd3, 0xec, 0xfa, 0x5e, 0x07, 0xbb, 0x60, 0x3c, 0xee, 0x02, 0x2a, - 0xc0, 0xbc, 0x0b, 0x34, 0x24, 0xf2, 0x0e, 0xcc, 0x54, 0x36, 0x6b, 0x3a, 0x59, 0x31, 0x56, 0xd2, - 0xbb, 0x5d, 0xcf, 0x31, 0x48, 0x13, 0xb8, 0x83, 0xa4, 0xb2, 0x89, 0x7f, 0x3d, 0x52, 0x99, 0xf5, - 0x8f, 0x26, 0xe4, 0xf2, 0xfe, 0x6c, 0x95, 0x81, 0xa6, 0x7a, 0xaf, 0xf0, 0x84, 0xea, 0xbd, 0x91, - 0xa3, 0x84, 0x13, 0x43, 0x62, 0x1a, 0x7d, 0x02, 0x89, 0x69, 0xec, 0x53, 0xab, 0xea, 0xc6, 0x9f, - 0x50, 0x06, 0x4a, 0xac, 0xb4, 0xe2, 0x30, 0x2b, 0x2d, 0x53, 0x6e, 0x9a, 0xf8, 0xf4, 0x72, 0x13, - 0x3c, 0xb1, 0xdc, 0x54, 0x8f, 0xdd, 0xc8, 0x26, 0x8f, 0xb4, 0xe7, 0x3d, 0x23, 0xee, 0x2b, 0x73, - 0xd9, 0x21, 0x7c, 0x94, 0x43, 0xd9, 0x0f, 0x94, 0x30, 0xf6, 0xcd, 0x6c, 0x61, 0x6c, 0xf0, 0x69, - 0xf3, 0x67, 0xe2, 0xd8, 0x53, 0x11, 0xc7, 0x02, 0x1c, 0xb0, 0xfb, 0x6e, 0xd0, 0xc1, 0x2b, 0xe7, - 0x15, 0x18, 0x97, 0x51, 0xb1, 0x72, 0xb1, 0xf6, 0x24, 0x1d, 0x0e, 0x4b, 0x62, 0x91, 0x45, 0x28, - 0x4a, 0x62, 0x3d, 0x90, 0xf8, 0xbe, 0x80, 0x19, 0x01, 0x87, 0x04, 0xcc, 0xfa, 0x3b, 0x23, 0x72, - 0x53, 0x60, 0xdf, 0x21, 0x32, 0x6d, 0x2f, 0x69, 0x93, 0x40, 0x13, 0x06, 0x13, 0xc3, 0x9c, 0xb0, - 0xf4, 0x33, 0x49, 0x3e, 0x51, 0x9c, 0xb2, 0x38, 0xd9, 0x55, 0x61, 0x88, 0x64, 0x57, 0x6f, 0x19, - 0x99, 0xa2, 0x46, 0xe2, 0xd4, 0x24, 0x6c, 0xa1, 0x0c, 0xce, 0x11, 0x75, 0x5d, 0x4f, 0xe9, 0x34, - 0x1a, 0x87, 0xec, 0x40, 0xca, 0x01, 0xc9, 0x9c, 0x94, 0x74, 0x3b, 0xf6, 0x24, 0x11, 0x00, 0xc7, - 0xff, 0x8d, 0x46, 0x00, 0x5c, 0x01, 0xd0, 0xb2, 0x1b, 0xf3, 0xc7, 0x9d, 0x97, 0x59, 0x37, 0x1d, - 0x9d, 0xd9, 0x58, 0x23, 0xb4, 0x7e, 0x97, 0xc0, 0x5c, 0xbd, 0xbe, 0x51, 0xf5, 0xdc, 0xdd, 0x8e, - 0x1f, 0x46, 0x5e, 0xa3, 0xd6, 0xd9, 0xf1, 0x99, 0x68, 0xa7, 0x36, 0x18, 0x2d, 0xd4, 0x5b, 0xbc, - 0xb9, 0xa8, 0x62, 0x76, 0x75, 0x58, 0x09, 0x02, 0x3f, 0xd0, 0xaf, 0x0e, 0x94, 0x01, 0x6c, 0x0e, - 0x67, 0xd2, 0x53, 0xbd, 0xc7, 0xd3, 0xd4, 0xf2, 0xf7, 0x36, 0x94, 0x9e, 0x42, 0x0e, 0xb2, 0x65, - 0x19, 0xa1, 0xe9, 0x09, 0x2b, 0xa4, 0xe9, 0x93, 0x46, 0x1c, 0xc1, 0xb8, 0x98, 0x6f, 0x9f, 0xe2, - 0x78, 0xc3, 0xa5, 0xd8, 0x45, 0xb8, 0xfe, 0x40, 0x9e, 0x5a, 0x03, 0x07, 0x70, 0xdc, 0x70, 0x81, - 0x1a, 0x56, 0x71, 0xf8, 0xaa, 0x90, 0xd6, 0x2c, 0xf4, 0x9f, 0xcd, 0xd0, 0x1e, 0xea, 0xa9, 0x15, - 0x32, 0x6b, 0x20, 0x7f, 0x25, 0x07, 0x67, 0x32, 0x4b, 0xd4, 0xea, 0x9e, 0x34, 0x62, 0x39, 0x6a, - 0x9b, 0x06, 0x4f, 0x22, 0xd1, 0xaf, 0x6a, 0x27, 0x63, 0x2b, 0x18, 0x5c, 0x13, 0xf9, 0xf5, 0x1c, - 0x9c, 0x34, 0x30, 0xd4, 0xf6, 0x19, 0x2a, 0x5f, 0xdf, 0xcc, 0x79, 0xfd, 0xd1, 0xd3, 0x99, 0xd7, - 0xe7, 0xcd, 0xb6, 0xc4, 0xbb, 0xbb, 0xde, 0x86, 0x7e, 0x5f, 0x48, 0x1e, 0xc2, 0x1c, 0x16, 0x49, - 0x25, 0x26, 0x9b, 0xb3, 0x42, 0xf7, 0x79, 0x2c, 0xfe, 0x6c, 0xee, 0xd6, 0x87, 0x89, 0x00, 0x17, - 0xbf, 0x7f, 0x58, 0x9e, 0x36, 0xd0, 0x65, 0x74, 0x44, 0x27, 0xd6, 0x84, 0x7a, 0x9d, 0x1d, 0x5f, - 0x3f, 0x7a, 0x53, 0x55, 0x90, 0x7f, 0x98, 0x83, 0x05, 0x06, 0xe5, 0xcd, 0xb8, 0x11, 0xf8, 0x6d, - 0x55, 0x2e, 0x2d, 0x2d, 0xfa, 0x74, 0x5b, 0xeb, 0xe9, 0x74, 0xdb, 0xcb, 0xf8, 0xc9, 0x7c, 0x4f, - 0x70, 0x76, 0x02, 0xbf, 0x1d, 0x7f, 0xbe, 0x91, 0xbd, 0xb7, 0xdf, 0x47, 0x92, 0x1f, 0xcd, 0xc1, - 0x29, 0x43, 0xf3, 0xa2, 0x87, 0xaa, 0x16, 0xce, 0x93, 0xf3, 0xca, 0x49, 0x3a, 0x2e, 0x5a, 0xba, - 0x2c, 0xe6, 0xff, 0x05, 0xfc, 0x82, 0xf8, 0xb4, 0xc0, 0x6f, 0x71, 0xda, 0x1c, 0x4b, 0xfb, 0x84, - 0xfe, 0xb5, 0x10, 0x0f, 0xe6, 0xf0, 0x8d, 0xd2, 0xb0, 0x08, 0x3a, 0xd6, 0xdf, 0x22, 0x48, 0x25, - 0x6c, 0xc2, 0x00, 0xb5, 0xfd, 0xcd, 0x82, 0xd2, 0x5c, 0xc9, 0x9f, 0x87, 0x53, 0x29, 0xa0, 0x5a, - 0x6d, 0xc7, 0xfb, 0xae, 0xb6, 0xd7, 0x1e, 0x1f, 0x96, 0x5f, 0xc9, 0xaa, 0x2d, 0x6b, 0xa5, 0xf5, - 0xaf, 0x81, 0xb8, 0x00, 0x71, 0xa1, 0x48, 0x02, 0x9c, 0x3d, 0x41, 0x5f, 0x13, 0xf3, 0x43, 0xc3, - 0x67, 0x7b, 0xb9, 0xf6, 0x0d, 0xfa, 0x91, 0x17, 0x23, 0x11, 0x0a, 0x53, 0x5a, 0x70, 0xde, 0x03, - 0xcc, 0x06, 0xdc, 0xb7, 0x92, 0xef, 0x1f, 0x96, 0x0d, 0x6c, 0x26, 0x62, 0xeb, 0x51, 0x7f, 0x75, - 0x11, 0xdb, 0x40, 0x24, 0xbf, 0x96, 0x83, 0x63, 0x0c, 0x10, 0x4f, 0x2a, 0xd1, 0xa8, 0x85, 0x41, - 0xb3, 0x7e, 0xef, 0xe9, 0xcc, 0xfa, 0x17, 0xf1, 0x1b, 0xf5, 0x59, 0x9f, 0xea, 0x92, 0xcc, 0x8f, - 0xc3, 0xd9, 0x6e, 0x3c, 0x87, 0x1b, 0xb3, 0xfd, 0xd4, 0x10, 0xb3, 0x9d, 0x0f, 0xc0, 0xd1, 0xb3, - 0xbd, 0x6f, 0x2d, 0x64, 0x0b, 0xa6, 0x84, 0x74, 0xcd, 0x3b, 0xec, 0xac, 0x11, 0xd8, 0x53, 0x2f, - 0xe2, 0x57, 0x1e, 0x11, 0xbb, 0x38, 0xd5, 0x42, 0x83, 0x0b, 0xe9, 0xc0, 0x3c, 0xff, 0x6d, 0xea, - 0x3a, 0xca, 0x7d, 0x75, 0x1d, 0x17, 0x45, 0x8b, 0xce, 0x09, 0xfe, 0x09, 0x95, 0x87, 0x1e, 0x5b, - 0x21, 0x83, 0x31, 0xe9, 0x02, 0x31, 0xc0, 0x7c, 0xd1, 0x9e, 0x1b, 0xac, 0xe1, 0x78, 0x45, 0xd4, - 0x59, 0x4e, 0xd6, 0x99, 0x5c, 0xb9, 0x19, 0xbc, 0x89, 0x0b, 0xb3, 0x02, 0xca, 0xee, 0xd2, 0xb8, - 0xc3, 0xbf, 0x68, 0x44, 0xb7, 0x48, 0x94, 0x72, 0xc1, 0x5c, 0xd6, 0x84, 0xd1, 0x47, 0x12, 0x1b, - 0x7a, 0x92, 0x1f, 0xd9, 0x80, 0xb9, 0x4a, 0xb7, 0xdb, 0xf2, 0x68, 0x13, 0x5b, 0xc9, 0x73, 0x9b, - 0x5a, 0x71, 0x3e, 0x0b, 0x97, 0x17, 0x8a, 0xdb, 0x42, 0x32, 0xb1, 0x69, 0x9a, 0xd6, 0xfa, 0x6e, - 0x2e, 0xf5, 0xd1, 0xe4, 0x75, 0x98, 0xc0, 0x1f, 0x9a, 0x8b, 0x35, 0x2a, 0x01, 0xf8, 0x27, 0xa2, - 0x32, 0x22, 0x46, 0x60, 0xc2, 0x92, 0x1e, 0x34, 0xa9, 0xc0, 0x85, 0x25, 0x71, 0x53, 0x8d, 0xef, - 0xa6, 0x65, 0x69, 0xa9, 0x59, 0x88, 0x85, 0x2e, 0xb4, 0xd4, 0x14, 0xf6, 0x99, 0xd6, 0x8f, 0xe6, - 0xcd, 0x69, 0x47, 0x2e, 0x6a, 0x72, 0xbb, 0x16, 0xb6, 0x49, 0xca, 0xed, 0x9a, 0xb4, 0xfe, 0xb7, - 0x73, 0x30, 0xbf, 0x11, 0xec, 0xba, 0x1d, 0xef, 0xdb, 0x3c, 0xfc, 0xa3, 0x8f, 0xe3, 0x32, 0x38, - 0x35, 0xd0, 0xd3, 0x4a, 0x71, 0xe2, 0x6b, 0x15, 0xb3, 0x99, 0x82, 0x53, 0xc6, 0xce, 0xfa, 0x1e, - 0xb4, 0x7d, 0xc7, 0x0f, 0xd3, 0x32, 0xcd, 0x70, 0x74, 0x0e, 0xb7, 0xfe, 0x5a, 0x1e, 0x26, 0xb5, - 0x25, 0x40, 0x3e, 0x0f, 0x53, 0x3a, 0x1f, 0x5d, 0x81, 0xa4, 0x57, 0x6b, 0x1b, 0x58, 0xa8, 0x41, - 0xa2, 0x6e, 0xdb, 0xd0, 0x20, 0xb1, 0x89, 0x8e, 0xd0, 0x27, 0xbc, 0xda, 0xbc, 0x9f, 0x71, 0xb5, - 0x79, 0xa2, 0x24, 0xb8, 0xef, 0xa4, 0x2f, 0x38, 0xc3, 0xe7, 0xac, 0xb5, 0x7e, 0x2a, 0x07, 0xa5, - 0xe4, 0x22, 0xfd, 0x4c, 0x7a, 0xe5, 0x09, 0x5e, 0x0b, 0x7e, 0x3c, 0xaf, 0x22, 0x73, 0x4b, 0x8f, - 0x9e, 0x67, 0xd5, 0x24, 0xe6, 0x5d, 0x43, 0x91, 0xff, 0xbc, 0x19, 0x6a, 0x46, 0xf7, 0x85, 0xcd, - 0x8e, 0x2f, 0x35, 0xf2, 0x73, 0xbf, 0x58, 0x7e, 0xce, 0xfa, 0x10, 0x8e, 0x25, 0xbb, 0x03, 0x95, - 0xf9, 0x15, 0x98, 0x35, 0xe1, 0xc9, 0xb8, 0xfe, 0x49, 0x2a, 0x3b, 0x89, 0x6f, 0xfd, 0x5e, 0x3e, - 0xc9, 0x5b, 0x98, 0xc7, 0xb0, 0x4d, 0xa7, 0xe3, 0x6e, 0xb7, 0x54, 0x5c, 0x6f, 0xbe, 0xe9, 0x70, - 0x90, 0x2d, 0xcb, 0x9e, 0x24, 0x9f, 0x86, 0xf2, 0x4b, 0x29, 0x64, 0xfb, 0xa5, 0x90, 0xeb, 0x09, - 0x1b, 0x33, 0x2d, 0x88, 0xc2, 0x3e, 0xdd, 0x76, 0x62, 0x3b, 0xb3, 0x84, 0x69, 0xd9, 0x32, 0x1c, - 0x33, 0xe2, 0x7b, 0x4a, 0xfa, 0xd1, 0x58, 0x77, 0x1b, 0x61, 0x01, 0x27, 0xce, 0x44, 0x26, 0xab, - 0x30, 0xce, 0x3e, 0xf3, 0x8e, 0xdb, 0x15, 0x3a, 0x7a, 0xa2, 0xbc, 0xd4, 0x5a, 0xea, 0xc2, 0xa7, - 0x39, 0xaa, 0xb5, 0x28, 0x3b, 0xf2, 0x8d, 0x1c, 0xd2, 0x1c, 0xd1, 0xfa, 0xe7, 0x39, 0xb6, 0xfe, - 0x1b, 0x0f, 0x7e, 0xc0, 0x92, 0x72, 0xb0, 0x26, 0x0d, 0xb0, 0xde, 0xfa, 0xc3, 0x3c, 0x0f, 0xcd, - 0x2e, 0xa6, 0xcf, 0x5b, 0x30, 0xb6, 0xe5, 0x06, 0xbb, 0x34, 0x12, 0x41, 0xcb, 0x75, 0x2e, 0xbc, - 0x20, 0x0e, 0xf1, 0x10, 0xe1, 0x6f, 0x5b, 0x10, 0xe8, 0xba, 0xb0, 0xfc, 0x50, 0xba, 0x30, 0x4d, - 0xd3, 0x5b, 0x78, 0x6a, 0x9a, 0xde, 0x1f, 0x52, 0x51, 0xd8, 0x2b, 0xd1, 0x10, 0xe1, 0x23, 0xcf, - 0x25, 0xb3, 0x18, 0xa4, 0x02, 0x7d, 0xc6, 0xec, 0xc8, 0x75, 0x3d, 0x2f, 0x82, 0xe6, 0xea, 0x71, - 0x44, 0x06, 0x04, 0xeb, 0x0f, 0x0b, 0xbc, 0x8f, 0x45, 0x47, 0x5d, 0x30, 0xdc, 0xc0, 0x70, 0x9d, - 0xb0, 0x8d, 0x5e, 0xf7, 0xc8, 0x45, 0xc3, 0x8e, 0x0b, 0x30, 0xc2, 0xe6, 0xa6, 0xe8, 0x4d, 0xc4, - 0x63, 0xf3, 0x57, 0xc7, 0x63, 0xe5, 0x6c, 0x2d, 0xe3, 0x99, 0xa4, 0x27, 0xbc, 0xc1, 0x63, 0x4b, - 0x5f, 0xcb, 0x88, 0x41, 0x2e, 0xc2, 0xc8, 0xba, 0xdf, 0x94, 0x61, 0x4a, 0x8f, 0xa1, 0x33, 0xb0, - 0xdf, 0xd4, 0x58, 0x2e, 0xe4, 0x6c, 0xc4, 0x60, 0x6d, 0x55, 0x81, 0xcd, 0xf5, 0xb6, 0xb6, 0x77, - 0xdc, 0x74, 0x22, 0x13, 0x2d, 0x06, 0xfa, 0x0a, 0xcc, 0x98, 0x29, 0x2f, 0x85, 0x6d, 0x1b, 0x6a, - 0x6c, 0x13, 0x99, 0x33, 0x75, 0x45, 0xbb, 0x49, 0x44, 0x96, 0x60, 0xda, 0x08, 0x8f, 0x26, 0x1e, - 0xcb, 0x50, 0xbd, 0x69, 0x06, 0x57, 0xd3, 0xd5, 0x9b, 0x06, 0x09, 0x3b, 0xcf, 0xc5, 0xf7, 0x6b, - 0x4f, 0x66, 0xa9, 0x6f, 0x17, 0x38, 0xe4, 0x1a, 0x14, 0xb9, 0xd7, 0x6d, 0xad, 0xaa, 0x3f, 0x7c, - 0x84, 0x08, 0x4b, 0x78, 0xad, 0x4b, 0x44, 0xcd, 0xcb, 0xf2, 0x73, 0x50, 0x12, 0x5b, 0x52, 0x9c, - 0x5c, 0xf2, 0x05, 0x18, 0x59, 0xae, 0x55, 0x6d, 0x7d, 0x1b, 0x69, 0x78, 0xcd, 0xc0, 0x46, 0x28, - 0x9a, 0xee, 0xaf, 0xd3, 0x68, 0xdf, 0x0f, 0x1e, 0xd8, 0x34, 0x8c, 0x02, 0x8f, 0xe7, 0x4b, 0xc2, - 0x85, 0xf8, 0x79, 0xf2, 0x0e, 0x8c, 0xa2, 0x91, 0x55, 0xe2, 0x64, 0x48, 0xd6, 0xb1, 0x34, 0x2d, - 0x26, 0xf0, 0x28, 0x5a, 0x6c, 0xd9, 0x9c, 0x88, 0xbc, 0x05, 0x23, 0x55, 0xda, 0x39, 0x48, 0xa4, - 0x72, 0x49, 0x11, 0xab, 0x0d, 0xa1, 0x49, 0x3b, 0x07, 0x36, 0x92, 0x58, 0x3f, 0x95, 0x87, 0xe3, - 0x19, 0x9f, 0x75, 0xef, 0xf3, 0xcf, 0xe8, 0xae, 0xb8, 0x64, 0xec, 0x8a, 0xf2, 0xbd, 0xb3, 0x6f, - 0xc7, 0x67, 0x6e, 0x92, 0x3f, 0x9f, 0x83, 0x93, 0xe6, 0x04, 0x15, 0x56, 0x95, 0xf7, 0xae, 0x91, - 0xb7, 0x61, 0x6c, 0x95, 0xba, 0x4d, 0x2a, 0xd3, 0x3c, 0x1c, 0x57, 0xf1, 0x71, 0xb8, 0x4b, 0x21, - 0x2f, 0xe4, 0x6c, 0x63, 0x07, 0x14, 0x0e, 0x25, 0x55, 0xf1, 0x71, 0x5c, 0x1e, 0xb7, 0xa4, 0x7b, - 0x6f, 0x56, 0x55, 0x03, 0xac, 0x06, 0xbe, 0x9f, 0x83, 0xe7, 0x07, 0xd0, 0xb0, 0x81, 0x63, 0x43, - 0xaf, 0x0f, 0x1c, 0x9e, 0xa8, 0x08, 0x25, 0xef, 0xc1, 0xec, 0x96, 0x90, 0xe7, 0xe5, 0x70, 0xe4, - 0xe3, 0xf5, 0x22, 0x45, 0x7d, 0x47, 0x8e, 0x4b, 0x12, 0xd9, 0xf0, 0x3b, 0x2f, 0x0c, 0xf4, 0x3b, - 0xd7, 0xdd, 0xb8, 0x47, 0x86, 0x75, 0xe3, 0xfe, 0x30, 0x99, 0x28, 0x5e, 0x44, 0xd3, 0x8b, 0x9d, - 0xd8, 0x73, 0xfd, 0x9d, 0xd8, 0x07, 0xc6, 0xec, 0xb2, 0xfe, 0x5a, 0x0e, 0x4a, 0x26, 0xef, 0x4f, - 0x3b, 0x9e, 0xef, 0x1a, 0xe3, 0xf9, 0x7c, 0xf6, 0x78, 0xf6, 0x1f, 0xc8, 0xff, 0x23, 0x97, 0x6c, - 0xec, 0x50, 0x23, 0x68, 0xc1, 0x58, 0xd5, 0x6f, 0xbb, 0x5e, 0x47, 0xcf, 0x55, 0xda, 0x44, 0x88, - 0x2d, 0x4a, 0x86, 0xf3, 0xf9, 0x3f, 0x07, 0xa3, 0xeb, 0x7e, 0xa7, 0x52, 0x15, 0x46, 0x87, 0xc8, - 0xa7, 0xe3, 0x77, 0x1c, 0xb7, 0x69, 0xf3, 0x02, 0xb2, 0x06, 0x50, 0x6f, 0x04, 0x94, 0x76, 0xea, - 0xde, 0xb7, 0x69, 0x42, 0xd2, 0x60, 0x3d, 0xd4, 0xea, 0xe1, 0xc6, 0x82, 0x6f, 0x3c, 0x21, 0x22, - 0x3a, 0xa1, 0xf7, 0x6d, 0x7d, 0xbf, 0xd5, 0xe8, 0x2d, 0x0a, 0x10, 0x13, 0x61, 0xe2, 0x36, 0xaf, - 0x29, 0x92, 0xf1, 0x4e, 0x8b, 0xc4, 0x6d, 0x0c, 0x60, 0x24, 0x6e, 0x63, 0x00, 0xb6, 0xb5, 0xaf, - 0x52, 0x6f, 0x77, 0x8f, 0x5b, 0x9f, 0x4c, 0xf3, 0xa9, 0xba, 0x87, 0x10, 0x7d, 0x6b, 0xe7, 0x38, - 0xd6, 0xbf, 0x1c, 0x85, 0x53, 0x36, 0xdd, 0xf5, 0x98, 0x98, 0x7c, 0x37, 0xf4, 0x3a, 0xbb, 0x86, - 0x57, 0xb6, 0x95, 0x98, 0x48, 0x22, 0x20, 0x31, 0x83, 0xa8, 0x8e, 0xb9, 0x04, 0x45, 0x76, 0x2a, - 0x6a, 0x73, 0x09, 0xdf, 0x50, 0x30, 0xd3, 0x38, 0x9f, 0xe4, 0xb2, 0x98, 0xbc, 0x2a, 0x4e, 0x6d, - 0x2d, 0x64, 0x3c, 0x3b, 0xb5, 0x3f, 0x3e, 0x2c, 0x43, 0xfd, 0x20, 0x8c, 0x28, 0xde, 0xd8, 0xc4, - 0xc9, 0xad, 0x44, 0xeb, 0x91, 0x3e, 0xa2, 0xf5, 0x1d, 0x38, 0x56, 0x69, 0xf2, 0xcd, 0xda, 0x6d, - 0x6d, 0x06, 0x5e, 0xa7, 0xe1, 0x75, 0xdd, 0x96, 0xbc, 0x2e, 0x62, 0x2f, 0xbb, 0xaa, 0xdc, 0xe9, - 0x2a, 0x04, 0x3b, 0x93, 0x8c, 0x35, 0xa3, 0xba, 0x5e, 0x47, 0xe7, 0x65, 0xf1, 0x3c, 0x86, 0xcd, - 0x68, 0x76, 0x42, 0x6c, 0x45, 0x68, 0xab, 0x62, 0x14, 0xea, 0xd1, 0x9c, 0x61, 0x6b, 0xad, 0x1e, - 0x7b, 0x27, 0xf1, 0x88, 0xb6, 0xdc, 0xe4, 0x21, 0x6a, 0x85, 0x68, 0xf6, 0x60, 0xe0, 0xc5, 0x74, - 0xf5, 0xfa, 0x2a, 0xa3, 0x2b, 0xa6, 0xe8, 0xc2, 0x70, 0x4f, 0xa7, 0xe3, 0x78, 0xe4, 0x0a, 0x9b, - 0x0a, 0x6d, 0x3f, 0xa2, 0x38, 0xcf, 0x27, 0xe2, 0x2b, 0x40, 0x80, 0x50, 0x7e, 0x05, 0xd0, 0x50, - 0xc8, 0x3b, 0x30, 0xbf, 0xb2, 0xbc, 0x28, 0x95, 0x9a, 0x55, 0xbf, 0xd1, 0xc3, 0x07, 0x6a, 0xc0, - 0xfa, 0x70, 0x0c, 0x69, 0x63, 0x91, 0x4d, 0xee, 0x2c, 0x34, 0x72, 0x01, 0xc6, 0x6b, 0x55, 0xde, - 0xf7, 0x93, 0x7a, 0xda, 0x06, 0x61, 0xf8, 0x21, 0x0b, 0xc9, 0x46, 0x2c, 0xa3, 0x4e, 0x1d, 0x29, - 0x4c, 0x9e, 0x1a, 0x42, 0x3e, 0x7d, 0x0b, 0xa6, 0x97, 0xfc, 0xa8, 0xd6, 0x09, 0x23, 0xb7, 0xd3, - 0xa0, 0xb5, 0xaa, 0x1e, 0x75, 0x71, 0xdb, 0x8f, 0x1c, 0x4f, 0x94, 0xb0, 0x2f, 0x37, 0x31, 0xc9, - 0x17, 0x91, 0xf4, 0x26, 0xed, 0xd0, 0x20, 0x8e, 0xb6, 0x38, 0xca, 0xfb, 0x96, 0x91, 0xee, 0xaa, - 0x12, 0xdb, 0x44, 0x14, 0x29, 0x25, 0x78, 0xea, 0xa2, 0x65, 0xbf, 0x49, 0xc3, 0x7b, 0x57, 0x7f, - 0xc0, 0x52, 0x4a, 0x68, 0x6d, 0xc3, 0x2d, 0xf3, 0x6a, 0xe6, 0xfe, 0xfa, 0xef, 0x62, 0x4a, 0x89, - 0x14, 0x2e, 0xf9, 0x22, 0x8c, 0xe2, 0x4f, 0x21, 0x6c, 0xcd, 0x67, 0xb0, 0x8d, 0x05, 0xad, 0x06, - 0x4f, 0x70, 0x8c, 0x04, 0xa4, 0x06, 0xe3, 0x42, 0xce, 0x7f, 0x92, 0xc0, 0xe8, 0xe2, 0xc2, 0xc0, - 0x67, 0x86, 0xa0, 0xb7, 0x9a, 0x30, 0xa5, 0x57, 0xc8, 0x56, 0xc4, 0xaa, 0x1b, 0xee, 0xd1, 0x26, - 0xfb, 0x25, 0x72, 0x9a, 0xe0, 0x8a, 0xd8, 0x43, 0xa8, 0xc3, 0xbe, 0xc3, 0xd6, 0x50, 0xd8, 0x16, - 0x5f, 0x0b, 0xef, 0x86, 0xe2, 0x53, 0xc4, 0xcd, 0xdf, 0x43, 0x2d, 0x52, 0xd3, 0x16, 0x45, 0xd6, - 0x0f, 0xc1, 0xb1, 0xf5, 0x5e, 0xab, 0xe5, 0x6e, 0xb7, 0xa8, 0x8c, 0x79, 0x8d, 0xf9, 0x0d, 0x97, - 0x60, 0xb4, 0xae, 0x65, 0x4c, 0x9c, 0x57, 0x41, 0xc5, 0x63, 0x1c, 0xb4, 0xb1, 0xcb, 0xa1, 0x23, - 0x79, 0x22, 0x57, 0x22, 0x27, 0xb5, 0xbe, 0x17, 0xa7, 0xda, 0xde, 0x0a, 0xdc, 0xc6, 0x03, 0x95, - 0x36, 0x73, 0xd8, 0xac, 0xe1, 0xb7, 0xe4, 0x47, 0x98, 0xe7, 0x67, 0xd6, 0x07, 0x1f, 0xf5, 0x31, - 0xe4, 0x1d, 0x98, 0x14, 0x67, 0xa8, 0x16, 0xfe, 0x08, 0x63, 0x4c, 0xc8, 0xbc, 0xfd, 0x09, 0x1b, - 0x07, 0x1d, 0x1d, 0x45, 0x03, 0xb3, 0x29, 0xf7, 0xae, 0x7e, 0x16, 0xa2, 0x81, 0x59, 0xc7, 0x80, - 0xa9, 0xfb, 0x9b, 0x93, 0xc9, 0xbe, 0x15, 0x73, 0xf7, 0xba, 0x1e, 0xf0, 0x24, 0x17, 0x5f, 0xd4, - 0xe2, 0x80, 0x27, 0xfa, 0x45, 0x4d, 0xa1, 0xaa, 0x31, 0xc9, 0x1f, 0x31, 0x26, 0xef, 0xc9, 0x31, - 0x29, 0xf4, 0x9f, 0x18, 0xf3, 0x03, 0xc6, 0xa1, 0x1e, 0xaf, 0x90, 0x91, 0xa1, 0x6e, 0xf9, 0xcf, - 0x61, 0x64, 0x57, 0x4e, 0x92, 0xdc, 0x45, 0x05, 0x27, 0x5d, 0x75, 0x30, 0x3a, 0x3c, 0xd3, 0x23, - 0xb6, 0xe6, 0x2f, 0xc1, 0x54, 0x25, 0x8a, 0xdc, 0xc6, 0x1e, 0x6d, 0x56, 0xd9, 0xf6, 0xa4, 0xc5, - 0x66, 0x70, 0x05, 0x5c, 0x7f, 0xc3, 0xd1, 0x71, 0x79, 0xac, 0x31, 0x37, 0x14, 0xd6, 0x7a, 0x2a, - 0xd6, 0x18, 0x83, 0x98, 0xb1, 0xc6, 0x18, 0x84, 0x5c, 0x81, 0xf1, 0x5a, 0xe7, 0xa1, 0xc7, 0xfa, - 0xa4, 0x18, 0xe7, 0xd0, 0xf5, 0x38, 0x48, 0xdf, 0x5c, 0x05, 0x16, 0x79, 0x4b, 0x93, 0xb1, 0x27, - 0xe2, 0xfb, 0x34, 0xd7, 0xc0, 0x28, 0xaf, 0x6e, 0x5d, 0x7e, 0x56, 0x42, 0xf7, 0x75, 0x18, 0x97, - 0x8a, 0x35, 0x88, 0xef, 0xd0, 0x82, 0x32, 0xed, 0xfd, 0x29, 0x91, 0x31, 0x05, 0xa2, 0x96, 0x9b, - 0x65, 0x52, 0x4b, 0x81, 0xa8, 0xe5, 0x66, 0x31, 0x52, 0x20, 0x6a, 0x59, 0x5a, 0x94, 0x4e, 0x62, - 0xea, 0x48, 0x9d, 0xc4, 0x3d, 0x98, 0xda, 0x74, 0x83, 0xc8, 0x63, 0x32, 0x4a, 0x27, 0x0a, 0x17, - 0xa6, 0x0d, 0x35, 0x9e, 0x56, 0xb4, 0x74, 0x56, 0x66, 0xed, 0xeb, 0x6a, 0xf8, 0x66, 0x7a, 0xb9, - 0x18, 0x9e, 0x6d, 0xab, 0x37, 0xf3, 0x69, 0x6c, 0xf5, 0xb0, 0x53, 0x51, 0x75, 0x33, 0x1b, 0x2b, - 0x08, 0x50, 0x86, 0x4e, 0xe8, 0x6f, 0x14, 0x22, 0xf9, 0x1a, 0x4c, 0xb1, 0xbf, 0x31, 0x1f, 0xbf, - 0x47, 0xc3, 0x85, 0x12, 0x36, 0xee, 0x6c, 0xe6, 0xea, 0xe7, 0x49, 0xfb, 0xeb, 0x34, 0xe2, 0x0b, - 0x18, 0x19, 0x27, 0x75, 0xb2, 0x06, 0x37, 0xf2, 0x3e, 0x4c, 0xb1, 0xd9, 0xb7, 0xed, 0x86, 0x5c, - 0x34, 0x9d, 0x8b, 0xad, 0x2d, 0x9b, 0x02, 0x9e, 0x0a, 0xf7, 0xa7, 0x13, 0xb0, 0x63, 0xbe, 0xd2, - 0xe5, 0x1b, 0x24, 0xd1, 0x66, 0x7b, 0x37, 0xb5, 0x39, 0x4a, 0x34, 0xf2, 0x01, 0x4c, 0x55, 0xba, - 0xdd, 0x78, 0xc7, 0x99, 0xd7, 0xf4, 0x32, 0xdd, 0xae, 0x93, 0xb9, 0xeb, 0x18, 0x14, 0xc9, 0x8d, - 0xf9, 0xd8, 0x13, 0x6d, 0xcc, 0xe4, 0x0d, 0x25, 0xad, 0x1f, 0x8f, 0x95, 0x8c, 0xe2, 0x1e, 0x63, - 0x88, 0xfe, 0x5c, 0x70, 0x5f, 0x86, 0x69, 0xae, 0x75, 0x93, 0xd2, 0xcc, 0x89, 0xd4, 0xea, 0xc9, - 0x10, 0x6a, 0x4c, 0x1a, 0xb2, 0x02, 0x33, 0xdc, 0xd1, 0xad, 0x25, 0xe2, 0x30, 0x2e, 0x9c, 0x8c, - 0xb3, 0x3e, 0x73, 0xff, 0xb8, 0x16, 0x86, 0xe7, 0x76, 0x0d, 0x2e, 0x09, 0x22, 0xeb, 0x8f, 0x72, - 0x70, 0xb2, 0xcf, 0x88, 0xab, 0x28, 0x7d, 0xb9, 0xc1, 0x51, 0xfa, 0xd8, 0xce, 0x61, 0x5e, 0xd2, - 0xb1, 0xfd, 0x42, 0xca, 0xd2, 0xc7, 0x4b, 0xca, 0x5b, 0x3e, 0x10, 0x11, 0xcf, 0x5e, 0x54, 0x7d, - 0xcb, 0x47, 0x4d, 0x61, 0x21, 0x7d, 0x08, 0x09, 0x3c, 0xfe, 0x51, 0x4b, 0xd6, 0xe3, 0xc3, 0xf2, - 0x59, 0x11, 0x2e, 0x5f, 0x0d, 0xeb, 0x47, 0xbe, 0xb1, 0x82, 0x33, 0x58, 0x5b, 0x87, 0x39, 0x98, - 0xd4, 0xd6, 0x21, 0x39, 0xa7, 0xb9, 0xcd, 0x95, 0x78, 0xc2, 0x05, 0x8d, 0x43, 0x9e, 0x9f, 0x44, - 0xb8, 0xa8, 0xf2, 0x47, 0xeb, 0x43, 0xef, 0x30, 0x51, 0x48, 0x8b, 0x64, 0xd8, 0x36, 0x94, 0x97, - 0x36, 0x96, 0x63, 0xb2, 0x51, 0x37, 0x8c, 0x2a, 0x8d, 0xc8, 0x7b, 0x48, 0x87, 0x38, 0x74, 0xe2, - 0x64, 0xa3, 0x6e, 0x18, 0x39, 0x2e, 0x92, 0xa5, 0x92, 0x8d, 0x2a, 0x86, 0xd6, 0x8f, 0xe5, 0x00, - 0xee, 0xd6, 0x96, 0x31, 0x14, 0xe9, 0xa7, 0x15, 0x0a, 0xb2, 0xc3, 0xbb, 0x49, 0xee, 0x03, 0xc4, - 0x81, 0xff, 0x2e, 0x07, 0x33, 0x26, 0x1a, 0x79, 0x0f, 0x66, 0xeb, 0x8d, 0xc0, 0x6f, 0xb5, 0xb6, - 0xdd, 0xc6, 0x83, 0x35, 0xaf, 0x43, 0x79, 0x60, 0xad, 0x51, 0x7e, 0x16, 0x85, 0xaa, 0xc8, 0x69, - 0xb1, 0x32, 0x3b, 0x89, 0x4c, 0xfe, 0x62, 0x0e, 0xa6, 0xeb, 0x7b, 0xfe, 0x7e, 0x9c, 0x6a, 0x9e, - 0x0f, 0xc8, 0xd7, 0xd9, 0xda, 0x0e, 0xf7, 0xfc, 0x7d, 0x27, 0x23, 0xdf, 0xfc, 0xc7, 0x87, 0xe5, - 0x77, 0x87, 0x7b, 0x26, 0x6e, 0xf8, 0x78, 0x93, 0x89, 0xc2, 0xcb, 0x46, 0x25, 0xb6, 0x59, 0xa7, - 0xf5, 0x27, 0x39, 0x98, 0xc4, 0x3b, 0x4f, 0xab, 0x85, 0x32, 0xd7, 0x0f, 0x52, 0xea, 0x1f, 0xd5, - 0xae, 0x01, 0x03, 0xfb, 0x26, 0xcc, 0x26, 0xd0, 0x88, 0x05, 0x63, 0x75, 0x74, 0x95, 0xd6, 0x15, - 0x14, 0xdc, 0x79, 0xda, 0x16, 0x25, 0xd6, 0x8a, 0x46, 0x76, 0xef, 0x2a, 0xbe, 0x32, 0x2e, 0x02, - 0x78, 0x12, 0x24, 0x6f, 0x36, 0x24, 0xf9, 0x25, 0xf7, 0xae, 0xda, 0x1a, 0x96, 0xb5, 0x0e, 0x63, - 0x75, 0x3f, 0x88, 0x96, 0x0e, 0xf8, 0x65, 0xa2, 0x4a, 0xc3, 0x86, 0xfe, 0x8c, 0xe8, 0xa1, 0xea, - 0xbe, 0x61, 0x8b, 0x22, 0x52, 0x86, 0xd1, 0x1b, 0x1e, 0x6d, 0x35, 0x75, 0x7b, 0xd1, 0x1d, 0x06, - 0xb0, 0x39, 0x9c, 0x5d, 0xb8, 0x4e, 0xc4, 0x11, 0xbb, 0x63, 0xc3, 0xd4, 0x4f, 0xbb, 0x6e, 0x96, - 0x8d, 0xfe, 0x7d, 0xd1, 0xcc, 0xac, 0x6b, 0xd4, 0x34, 0xa0, 0xab, 0xff, 0xa3, 0x1c, 0x9c, 0xee, - 0x4f, 0xa2, 0xdb, 0xba, 0xe6, 0x06, 0xd8, 0xba, 0xbe, 0x9c, 0x7c, 0xf6, 0x42, 0x34, 0xf1, 0xec, - 0x15, 0x3f, 0x76, 0x55, 0xd1, 0xd4, 0xb8, 0xa1, 0x12, 0x9f, 0x9f, 0x1b, 0xf0, 0xcd, 0x88, 0xc8, - 0x87, 0x39, 0x42, 0x1a, 0x5b, 0xd0, 0x5a, 0xbf, 0x31, 0x02, 0xa7, 0xfa, 0x52, 0x90, 0x55, 0x2d, - 0xf8, 0xff, 0x8c, 0x0a, 0x3b, 0xde, 0x17, 0xff, 0x32, 0xfe, 0x8b, 0xd6, 0x64, 0x49, 0x67, 0x9a, - 0x0d, 0x15, 0xf4, 0x9d, 0x67, 0xb8, 0x7f, 0xed, 0x48, 0x5e, 0x1c, 0x1d, 0x99, 0x41, 0x3a, 0xfe, - 0x3b, 0xba, 0x5d, 0xd1, 0xc8, 0xf5, 0x5a, 0xa1, 0xbe, 0xec, 0x9a, 0x1c, 0x64, 0xcb, 0xb2, 0xd8, - 0x00, 0x79, 0x24, 0xdb, 0x00, 0xd9, 0xfa, 0x97, 0x39, 0x98, 0x50, 0x9f, 0x4d, 0x4e, 0xc3, 0x89, - 0x2d, 0xbb, 0xb2, 0xbc, 0xe2, 0x6c, 0x7d, 0xb8, 0xb9, 0xe2, 0xdc, 0x5d, 0xaf, 0x6f, 0xae, 0x2c, - 0xd7, 0x6e, 0xd4, 0x56, 0xaa, 0xa5, 0xe7, 0xc8, 0x1c, 0x4c, 0xdf, 0x5d, 0xbf, 0xbd, 0xbe, 0x71, - 0x7f, 0xdd, 0x59, 0xb1, 0xed, 0x0d, 0xbb, 0x94, 0x23, 0xd3, 0x30, 0x61, 0x2f, 0x55, 0x96, 0x9d, - 0xf5, 0x8d, 0xea, 0x4a, 0x29, 0x4f, 0x4a, 0x30, 0xb5, 0xbc, 0xb1, 0xbe, 0xbe, 0xb2, 0xbc, 0x55, - 0xbb, 0x57, 0xdb, 0xfa, 0xb0, 0x54, 0x20, 0x04, 0x66, 0x10, 0x61, 0xd3, 0xae, 0xad, 0x2f, 0xd7, - 0x36, 0x2b, 0x6b, 0xa5, 0x11, 0x06, 0x63, 0xf8, 0x1a, 0x6c, 0x54, 0x31, 0xba, 0x7d, 0x77, 0x69, - 0xa5, 0x34, 0xc6, 0x50, 0xd8, 0x5f, 0x1a, 0xca, 0x38, 0xab, 0x1e, 0x51, 0xaa, 0x95, 0xad, 0xca, - 0x52, 0xa5, 0xbe, 0x52, 0x2a, 0x92, 0x93, 0x30, 0x6f, 0x80, 0x9c, 0xb5, 0x8d, 0x9b, 0xb5, 0xf5, - 0xd2, 0x04, 0x39, 0x06, 0x25, 0x05, 0xab, 0x2e, 0x39, 0x77, 0xeb, 0x2b, 0x76, 0x09, 0x92, 0xd0, - 0xf5, 0xca, 0x9d, 0x95, 0xd2, 0xa4, 0xf5, 0x2e, 0x77, 0x73, 0xe2, 0x5d, 0x4d, 0x4e, 0x00, 0xa9, - 0x6f, 0x55, 0xb6, 0xee, 0xd6, 0x13, 0x8d, 0x9f, 0x84, 0xf1, 0xfa, 0xdd, 0xe5, 0xe5, 0x95, 0x7a, - 0xbd, 0x94, 0x23, 0x00, 0x63, 0x37, 0x2a, 0xb5, 0xb5, 0x95, 0x6a, 0x29, 0x6f, 0xfd, 0x64, 0x0e, - 0xe6, 0xa4, 0x04, 0x28, 0xdf, 0x30, 0x3e, 0xe5, 0x5a, 0x7c, 0xcf, 0xb8, 0xd8, 0x4a, 0x2f, 0x94, - 0x44, 0x25, 0x03, 0x96, 0xe1, 0xcf, 0xe7, 0xe0, 0x78, 0x26, 0x36, 0xf9, 0x10, 0x4a, 0xf2, 0x0b, - 0xee, 0xb8, 0x51, 0x63, 0x2f, 0xde, 0xc7, 0xce, 0x26, 0x6a, 0x49, 0xa0, 0x71, 0xb5, 0x66, 0x9c, - 0x5c, 0x30, 0xc5, 0x66, 0xf8, 0x60, 0xb9, 0xd6, 0xcf, 0xe5, 0xe0, 0x64, 0x9f, 0x6a, 0xc8, 0x32, - 0x8c, 0xa9, 0xb0, 0xe9, 0x03, 0x0c, 0xaa, 0x8e, 0x7d, 0xff, 0xb0, 0x2c, 0x10, 0x31, 0x1b, 0x1b, - 0xfe, 0x65, 0x8f, 0xa9, 0x38, 0xe8, 0x18, 0x8c, 0x9c, 0x77, 0xdf, 0xa9, 0x44, 0xcf, 0x8b, 0x9a, - 0x2a, 0xf7, 0xeb, 0x4b, 0x93, 0xa2, 0xef, 0x0a, 0xee, 0x7e, 0x88, 0xd1, 0xc8, 0xad, 0x9f, 0xce, - 0x31, 0xe1, 0x2e, 0x89, 0xc8, 0x64, 0xde, 0x4a, 0x18, 0xf6, 0xda, 0xd4, 0xf6, 0x5b, 0xb4, 0x62, - 0xaf, 0x8b, 0x63, 0x03, 0xa5, 0x55, 0x17, 0x0b, 0xf0, 0x5a, 0xe1, 0xb8, 0x41, 0xc7, 0x78, 0x3c, - 0xd5, 0x69, 0xc8, 0x5b, 0x00, 0x2a, 0x2b, 0xbe, 0x0c, 0x6a, 0xc0, 0x83, 0x7a, 0x08, 0xa8, 0x29, - 0x6f, 0x6b, 0xc8, 0xd6, 0x5f, 0xce, 0xc1, 0x94, 0xb8, 0x34, 0x55, 0x5a, 0x34, 0x88, 0x3e, 0xdd, - 0xf4, 0x7a, 0xcb, 0x98, 0x5e, 0xca, 0x7f, 0x40, 0xe3, 0xcf, 0x8a, 0x33, 0x67, 0xd6, 0x7f, 0x9d, - 0x83, 0x52, 0x12, 0x91, 0xbc, 0x07, 0xc5, 0x3a, 0x7d, 0x48, 0x03, 0x2f, 0x3a, 0x10, 0x1b, 0xa5, - 0x4c, 0x30, 0xc3, 0x71, 0x44, 0x19, 0x9f, 0x0f, 0xa1, 0xf8, 0x65, 0x2b, 0x9a, 0x61, 0xf7, 0x7b, - 0x4d, 0xed, 0x51, 0x78, 0x5a, 0x6a, 0x0f, 0xeb, 0x7f, 0xce, 0xc3, 0xc9, 0x9b, 0x34, 0xd2, 0xdb, - 0xa4, 0x5e, 0xbb, 0x3f, 0x37, 0x5c, 0xbb, 0xb4, 0x96, 0x2c, 0xc0, 0x38, 0x16, 0xc9, 0xf1, 0xb5, - 0xe5, 0x4f, 0xb2, 0xa4, 0xe6, 0x75, 0xc1, 0xc8, 0x60, 0xd1, 0xa7, 0xee, 0xcb, 0x5a, 0x4c, 0x7b, - 0x35, 0xad, 0x2f, 0xc0, 0x0c, 0x06, 0x6d, 0xed, 0xb1, 0xe5, 0x40, 0x9b, 0x42, 0xfd, 0x53, 0xb4, - 0x13, 0x50, 0xf2, 0x2a, 0x94, 0x18, 0xa4, 0xd2, 0x78, 0xd0, 0xf1, 0xf7, 0x5b, 0xb4, 0xb9, 0x4b, - 0x79, 0x1a, 0xf3, 0xa2, 0x9d, 0x82, 0x4b, 0x9e, 0x77, 0x3b, 0xfc, 0xea, 0x46, 0x9b, 0xa8, 0xa3, - 0x11, 0x3c, 0x63, 0xe8, 0xe9, 0xb7, 0x60, 0xf2, 0x13, 0xe6, 0xa7, 0xb0, 0xfe, 0xa7, 0x1c, 0x1c, - 0xc3, 0xc6, 0x69, 0x15, 0xe3, 0x8b, 0xc1, 0xe7, 0xe2, 0xde, 0xd2, 0x42, 0xb6, 0xbb, 0x0c, 0x64, - 0x2e, 0x05, 0xd5, 0x8b, 0xb1, 0x4e, 0x28, 0x3f, 0x84, 0x4e, 0xa8, 0xfe, 0x24, 0x59, 0x4f, 0x87, - 0x54, 0x69, 0xf1, 0x5c, 0xf5, 0xf1, 0x90, 0x5b, 0x7f, 0x31, 0x0f, 0xe3, 0x36, 0xc5, 0x74, 0x90, - 0xe4, 0x02, 0x8c, 0xaf, 0xfb, 0x11, 0x0d, 0xef, 0x18, 0xb9, 0x3f, 0x3b, 0x0c, 0xe4, 0xb4, 0x9b, - 0xb6, 0x2c, 0x64, 0x13, 0x7e, 0x33, 0xf0, 0x9b, 0xbd, 0x46, 0xa4, 0x4f, 0xf8, 0x2e, 0x07, 0xd9, - 0xb2, 0x8c, 0xbc, 0x0e, 0x13, 0x82, 0xb3, 0x7a, 0x63, 0x44, 0xdb, 0xd8, 0x80, 0xaa, 0x74, 0xa2, - 0x31, 0x02, 0xca, 0xb4, 0x5c, 0xc0, 0x18, 0xd1, 0x64, 0xda, 0x94, 0xcc, 0x20, 0x45, 0xf5, 0xd1, - 0x01, 0xa2, 0xfa, 0xe7, 0x60, 0xac, 0x12, 0x86, 0x34, 0x92, 0x4e, 0xda, 0x53, 0x2a, 0x62, 0x4e, - 0x48, 0x23, 0xce, 0xd8, 0xc5, 0x72, 0x5b, 0xe0, 0x59, 0xff, 0x3c, 0x0f, 0xa3, 0xf8, 0x27, 0xbe, - 0xab, 0x06, 0x8d, 0x3d, 0xe3, 0x5d, 0x35, 0x68, 0xec, 0xd9, 0x08, 0x25, 0x57, 0x51, 0x53, 0x21, - 0xb3, 0x0b, 0x88, 0xd6, 0xa3, 0x0a, 0xbe, 0x19, 0x83, 0x6d, 0x1d, 0x47, 0x3d, 0x38, 0x17, 0x32, - 0x43, 0x33, 0x9c, 0x80, 0xfc, 0x46, 0x5d, 0xb4, 0x18, 0x43, 0xc8, 0xf8, 0xa1, 0x9d, 0xdf, 0xa8, - 0x63, 0x6f, 0xac, 0x56, 0x16, 0xdf, 0xbc, 0xae, 0xa7, 0xa9, 0x0d, 0xf7, 0xdc, 0xc5, 0x37, 0xaf, - 0xdb, 0xa2, 0x84, 0xf5, 0x2f, 0x7e, 0x33, 0x3e, 0xbc, 0x72, 0xa7, 0x62, 0xec, 0x5f, 0x6c, 0x1b, - 0x3e, 0xb2, 0xda, 0x31, 0x02, 0x59, 0x84, 0x49, 0xe1, 0xca, 0x8e, 0xf8, 0x9a, 0xab, 0xb9, 0x70, - 0x75, 0xe7, 0x14, 0x3a, 0x12, 0x7f, 0x82, 0x13, 0x03, 0x24, 0x73, 0xa0, 0x89, 0x27, 0x38, 0x39, - 0x84, 0xa1, 0xad, 0xa1, 0xc4, 0x3e, 0xd1, 0xb1, 0xb3, 0xb0, 0xee, 0x13, 0x8d, 0x41, 0x78, 0x15, - 0x82, 0xf5, 0xcb, 0x79, 0x28, 0x6e, 0xb6, 0x7a, 0xbb, 0x5e, 0xe7, 0xde, 0x55, 0x42, 0x00, 0xaf, - 0x71, 0x32, 0x4a, 0x33, 0xfb, 0x9b, 0x9c, 0x82, 0xa2, 0xbc, 0xb9, 0xc9, 0x0d, 0x29, 0x14, 0xb7, - 0xb6, 0x05, 0x90, 0xe3, 0x2e, 0x72, 0xda, 0xcb, 0x9f, 0xe4, 0x2a, 0xa8, 0xfb, 0x57, 0xbf, 0x8b, - 0xda, 0x08, 0x5b, 0x2c, 0xb6, 0x42, 0x23, 0x6f, 0x00, 0x1e, 0x12, 0xe2, 0xf2, 0x20, 0x15, 0xda, - 0xfc, 0xd3, 0x84, 0x9c, 0xc2, 0x49, 0x10, 0x8d, 0x5c, 0x03, 0x31, 0x31, 0x45, 0xe6, 0xcc, 0xe3, - 0x26, 0x01, 0xcf, 0x5e, 0x24, 0x49, 0x04, 0x2a, 0x79, 0x07, 0x26, 0xe3, 0x9c, 0xf5, 0x71, 0x42, - 0x4c, 0x9d, 0x72, 0x39, 0x2e, 0xbf, 0x77, 0xd5, 0xd6, 0xd1, 0xad, 0xef, 0x8c, 0xc3, 0x94, 0xfe, - 0x3d, 0xc4, 0x86, 0xf9, 0xb0, 0xc5, 0xee, 0xee, 0xc2, 0xf6, 0xa9, 0x8b, 0x85, 0xe2, 0x38, 0x3d, - 0x67, 0x7e, 0x10, 0xc3, 0xe3, 0x86, 0x50, 0xd2, 0x07, 0x7f, 0xf5, 0x39, 0x7b, 0x2e, 0x8c, 0xc1, - 0x1c, 0x8f, 0x54, 0xa0, 0xe8, 0x77, 0xc3, 0x5d, 0xda, 0xf1, 0xe4, 0x7b, 0xcb, 0x79, 0x83, 0xd1, - 0x86, 0x28, 0x4c, 0xf1, 0x52, 0x64, 0xe4, 0x4d, 0x18, 0xf3, 0xbb, 0xb4, 0xe3, 0x7a, 0xe2, 0x8c, - 0x7b, 0x3e, 0xc1, 0x80, 0x76, 0x2a, 0x35, 0x8d, 0x50, 0x20, 0x93, 0x2b, 0x30, 0xe2, 0x3f, 0x50, - 0xe3, 0x75, 0xca, 0x24, 0x7a, 0x10, 0xb9, 0x1a, 0x09, 0x22, 0x32, 0x82, 0x8f, 0xdc, 0xf6, 0x8e, - 0x18, 0x31, 0x93, 0xe0, 0x96, 0xdb, 0xde, 0xd1, 0x09, 0x18, 0x22, 0x79, 0x1f, 0xa0, 0xeb, 0xee, - 0xd2, 0xc0, 0x69, 0xf6, 0xa2, 0x03, 0x31, 0x6e, 0x67, 0x0d, 0xb2, 0x4d, 0x56, 0x5c, 0xed, 0x45, - 0x07, 0x1a, 0xed, 0x44, 0x57, 0x02, 0x49, 0x05, 0xa0, 0xed, 0x46, 0x11, 0x0d, 0xda, 0xbe, 0x30, - 0x3e, 0x9b, 0x54, 0x09, 0x27, 0x39, 0x83, 0x3b, 0xaa, 0x58, 0xe3, 0xa0, 0x11, 0xe1, 0x47, 0x7b, - 0x81, 0x2b, 0xf2, 0x97, 0x26, 0x3e, 0xda, 0x0b, 0x8c, 0x56, 0x32, 0x44, 0xf2, 0x45, 0x18, 0x6f, - 0x7a, 0x61, 0xc3, 0x0f, 0x9a, 0x22, 0x38, 0xc3, 0x0b, 0x06, 0x4d, 0x95, 0x97, 0x69, 0x64, 0x12, - 0x9d, 0x7d, 0xad, 0x88, 0xff, 0xb6, 0xee, 0xef, 0xa3, 0x9a, 0x3f, 0xf9, 0xb5, 0x75, 0x55, 0xac, - 0x7f, 0x6d, 0x4c, 0xc4, 0x86, 0x72, 0xd7, 0x8b, 0x5a, 0xee, 0xb6, 0x78, 0xe7, 0x36, 0x87, 0xf2, - 0x26, 0x16, 0xe9, 0x43, 0xc9, 0x91, 0xc9, 0x5b, 0x50, 0xa4, 0x9d, 0x28, 0x70, 0x1d, 0xaf, 0x29, - 0x9c, 0xf6, 0xcc, 0x8f, 0x66, 0x07, 0xb0, 0x5b, 0xab, 0xea, 0x1f, 0x8d, 0xf8, 0xb5, 0x26, 0xeb, - 0x9f, 0xb0, 0xe1, 0xb5, 0x85, 0xaf, 0x9d, 0xd9, 0x3f, 0xf5, 0xe5, 0xda, 0x1d, 0xbd, 0x7f, 0x18, - 0x22, 0x79, 0x0f, 0xc6, 0xd9, 0xfa, 0x6d, 0xfa, 0xbb, 0xc2, 0xe3, 0xdd, 0x32, 0xfb, 0x87, 0x97, - 0xa5, 0xa6, 0xab, 0x24, 0x22, 0x67, 0x01, 0xe2, 0x27, 0x72, 0xfe, 0xa0, 0x61, 0x6b, 0x90, 0x2f, - 0x8d, 0xfc, 0x6f, 0xbf, 0x58, 0xce, 0x2d, 0x01, 0x14, 0x65, 0x74, 0x0b, 0x6b, 0x0d, 0x4e, 0xf5, - 0x5d, 0x54, 0xe4, 0x12, 0x94, 0x76, 0x5c, 0xa1, 0x52, 0x6b, 0xec, 0xb9, 0x9d, 0x0e, 0x6d, 0x89, - 0xed, 0x6c, 0x56, 0xc2, 0x97, 0x39, 0x98, 0x73, 0xb6, 0xde, 0x87, 0x63, 0x59, 0xbd, 0x49, 0x5e, - 0x84, 0x29, 0x3d, 0x90, 0x87, 0x60, 0x32, 0xe9, 0x76, 0x3d, 0x19, 0xca, 0x43, 0x30, 0xf8, 0xf5, - 0x1c, 0xbc, 0x30, 0x68, 0x6d, 0x92, 0xd3, 0x50, 0xec, 0x06, 0x9e, 0x8f, 0x32, 0x20, 0xdf, 0x41, - 0xd5, 0x6f, 0x72, 0x06, 0x80, 0x0b, 0x2b, 0x91, 0xbb, 0x2b, 0x8c, 0xf9, 0xed, 0x09, 0x84, 0x6c, - 0xb9, 0xbb, 0x21, 0x79, 0x0d, 0xe6, 0x9a, 0x74, 0xc7, 0xed, 0xb5, 0x22, 0x27, 0x6c, 0xec, 0xd1, - 0x26, 0xfa, 0xcf, 0xa0, 0x91, 0x96, 0x5d, 0x12, 0x05, 0x75, 0x09, 0x4f, 0x7d, 0xf1, 0x68, 0x9f, - 0x2f, 0xbe, 0x35, 0x52, 0xcc, 0x95, 0xf2, 0x36, 0xda, 0x2a, 0x59, 0x3f, 0x92, 0x87, 0x85, 0x7e, - 0x93, 0x91, 0xbc, 0x9b, 0xd5, 0x07, 0xfc, 0x55, 0x40, 0x87, 0xeb, 0xaf, 0x02, 0x5a, 0x6d, 0x64, - 0x11, 0x94, 0xf7, 0xcb, 0x51, 0x9e, 0xec, 0x12, 0xc6, 0x68, 0xba, 0x6e, 0x18, 0xee, 0xb3, 0xf5, - 0x56, 0xd0, 0x02, 0xf5, 0x09, 0x98, 0x4e, 0x23, 0x61, 0xe4, 0x0b, 0x00, 0x8d, 0x96, 0x1f, 0x52, - 0x7c, 0x7c, 0x17, 0x07, 0x39, 0x37, 0x01, 0x56, 0x50, 0xfd, 0xb5, 0x15, 0xa1, 0xcb, 0x7e, 0x93, - 0x8a, 0x01, 0x74, 0xe1, 0x64, 0x9f, 0xdd, 0x87, 0x0d, 0x4f, 0x9c, 0x18, 0x54, 0xa6, 0x19, 0xe8, - 0xa9, 0xf4, 0xa0, 0xc9, 0x1e, 0xcf, 0xf7, 0x9b, 0x23, 0x07, 0x40, 0xd2, 0x5b, 0x0c, 0xe3, 0x2e, - 0x0c, 0x59, 0x7b, 0x81, 0xe2, 0xce, 0x21, 0x77, 0x83, 0x16, 0x29, 0xc3, 0xa4, 0x4c, 0x23, 0xc4, - 0x04, 0x65, 0xce, 0x1c, 0x04, 0xe8, 0x36, 0xc5, 0xc9, 0x83, 0xf1, 0x24, 0xd1, 0xc7, 0x49, 0x1c, - 0xc1, 0x13, 0x08, 0xd9, 0x3a, 0xe8, 0xca, 0xd6, 0xbd, 0x20, 0xe7, 0xb7, 0xb9, 0xf1, 0x8b, 0xd2, - 0x9f, 0xc9, 0xc9, 0xe1, 0x4f, 0xef, 0x9c, 0x47, 0x7d, 0x1f, 0x01, 0xf4, 0x48, 0x11, 0x1f, 0x86, - 0x7f, 0x33, 0x91, 0x40, 0xae, 0x3a, 0x21, 0x12, 0x88, 0x9f, 0xe4, 0x02, 0xcc, 0x06, 0xdc, 0x66, - 0x31, 0xf2, 0x45, 0x7f, 0xe2, 0x48, 0xd9, 0xd3, 0x1c, 0xbc, 0xe5, 0x63, 0x9f, 0x8a, 0xef, 0xba, - 0xa5, 0x3a, 0x4c, 0x3b, 0x48, 0xc8, 0x65, 0x98, 0x60, 0x07, 0x09, 0xc6, 0xc9, 0x48, 0x98, 0xc2, - 0x23, 0x1e, 0x1e, 0xcb, 0x76, 0xf1, 0x23, 0xf1, 0xb7, 0xe0, 0xf5, 0x8f, 0x72, 0x92, 0x99, 0x7e, - 0x8c, 0x91, 0x93, 0x30, 0xee, 0x07, 0xbb, 0x5a, 0xd3, 0xc6, 0xfc, 0x60, 0x97, 0xb5, 0xeb, 0x22, - 0x94, 0xb8, 0x67, 0x06, 0x77, 0x79, 0x0f, 0x0f, 0x3a, 0xfc, 0x9e, 0x5b, 0xb4, 0x67, 0x38, 0x1c, - 0x73, 0xa5, 0x1e, 0x74, 0x1a, 0x0c, 0x33, 0x0c, 0x7d, 0x47, 0x0f, 0x8e, 0x23, 0x9a, 0x3d, 0x13, - 0x86, 0x7e, 0x1c, 0x25, 0xa7, 0x49, 0x96, 0x60, 0x9a, 0xf1, 0x51, 0x21, 0x7a, 0xc4, 0x29, 0x7b, - 0x26, 0x7d, 0xca, 0x1e, 0x74, 0x1a, 0xf2, 0x13, 0xed, 0xa9, 0x50, 0xfb, 0x25, 0x5a, 0xf3, 0xab, - 0x79, 0x38, 0x91, 0x8d, 0x8e, 0xe3, 0xc5, 0x2a, 0x41, 0x07, 0x25, 0xae, 0x1e, 0xb5, 0x27, 0x18, - 0x84, 0xc7, 0x60, 0xc8, 0xfa, 0xda, 0x7c, 0xe6, 0xd7, 0xbe, 0x0a, 0x73, 0xc8, 0x48, 0xc8, 0x35, - 0x2d, 0x2f, 0x8c, 0x44, 0x68, 0x01, 0x7b, 0x96, 0x15, 0xf0, 0x0d, 0x6e, 0x8d, 0x81, 0xc9, 0xcb, - 0x30, 0x23, 0xb7, 0x28, 0x7f, 0xbf, 0xc3, 0x2a, 0xe6, 0xfb, 0xd3, 0xb4, 0x80, 0x6e, 0x20, 0x90, - 0x1c, 0x87, 0x31, 0xb7, 0xdb, 0x65, 0x55, 0xf2, 0x6d, 0x69, 0xd4, 0xed, 0x76, 0x6b, 0x4d, 0x72, - 0x1e, 0xa6, 0xd1, 0x1d, 0xcb, 0xd9, 0x41, 0x9b, 0x14, 0x61, 0x00, 0x67, 0x4f, 0x21, 0x90, 0xdb, - 0xa9, 0x84, 0x6c, 0x21, 0x30, 0x5a, 0x89, 0x32, 0x8e, 0x28, 0xe0, 0x76, 0x15, 0xc2, 0x29, 0x28, - 0xca, 0xd7, 0x51, 0x6e, 0x55, 0x6e, 0x8f, 0xbb, 0xfc, 0x65, 0x54, 0x74, 0xda, 0x17, 0x61, 0x56, - 0x1c, 0xd4, 0x62, 0xf3, 0x47, 0xa6, 0x62, 0x6a, 0x32, 0x09, 0x5a, 0x44, 0x5e, 0x07, 0x01, 0xaa, - 0x35, 0x65, 0x77, 0xff, 0x7e, 0x0e, 0x8e, 0x67, 0x9e, 0xf4, 0xe4, 0x9b, 0xc0, 0x1d, 0x57, 0x22, - 0xdf, 0x09, 0x68, 0xc3, 0xeb, 0x7a, 0xe8, 0xda, 0xcf, 0x35, 0x61, 0x8b, 0x83, 0x64, 0x04, 0x74, - 0x82, 0xd9, 0xf2, 0x6d, 0x45, 0xc4, 0xaf, 0xe8, 0xa5, 0x20, 0x01, 0x3e, 0xfd, 0x55, 0x38, 0x9e, - 0x89, 0x9a, 0x71, 0x75, 0x7e, 0xdd, 0xcc, 0x50, 0x27, 0xdf, 0x36, 0x12, 0x8d, 0xd6, 0xae, 0xd4, - 0xa2, 0x79, 0xbf, 0xa5, 0x9a, 0x97, 0x90, 0x09, 0xc8, 0x4a, 0x72, 0xc6, 0x66, 0x89, 0xb5, 0x92, - 0xa8, 0xef, 0xa4, 0x25, 0x5f, 0x85, 0xe3, 0x62, 0x16, 0xed, 0x06, 0x6e, 0x77, 0x2f, 0x66, 0xc7, - 0x3f, 0xf4, 0x95, 0x2c, 0x76, 0x7c, 0x7a, 0xdd, 0x64, 0xf8, 0x8a, 0xeb, 0xbc, 0x9b, 0x06, 0x8a, - 0x36, 0xfc, 0x41, 0x4e, 0x0a, 0x04, 0x19, 0x9f, 0x93, 0x31, 0x3f, 0x73, 0x59, 0xf3, 0x73, 0xf8, - 0xc5, 0xb1, 0x0e, 0x44, 0xbb, 0x15, 0x38, 0x5c, 0x59, 0x26, 0xec, 0x70, 0xa4, 0x78, 0x27, 0x3e, - 0x44, 0xbb, 0x4c, 0xd4, 0x79, 0x86, 0xa0, 0xb9, 0x46, 0x12, 0x44, 0x9e, 0x87, 0x09, 0x95, 0x84, - 0x4f, 0x6c, 0x89, 0x45, 0x0e, 0xa8, 0x35, 0x45, 0x0b, 0x7f, 0x34, 0x07, 0xe7, 0x8e, 0xea, 0x21, - 0x72, 0x1f, 0x4e, 0xe0, 0x5b, 0x7f, 0xe8, 0xab, 0x4e, 0x76, 0x1a, 0x6e, 0x63, 0x8f, 0x8a, 0x39, - 0x69, 0x65, 0x76, 0x75, 0xb7, 0x5b, 0xaf, 0x6f, 0x68, 0xbd, 0xdc, 0xed, 0xd6, 0x43, 0x5f, 0xfe, - 0x5e, 0x66, 0xe4, 0xe2, 0x1b, 0x9a, 0xf0, 0xfc, 0x00, 0x4a, 0x6d, 0x7d, 0xe7, 0xf4, 0xf5, 0x7d, - 0x11, 0x4a, 0x3b, 0xb4, 0xc9, 0x64, 0x39, 0xda, 0xc4, 0x4f, 0x7b, 0xb8, 0xc8, 0x93, 0x4a, 0xda, - 0x33, 0x0a, 0x5e, 0x0f, 0xfd, 0x7b, 0x8b, 0xa2, 0x96, 0xb6, 0xdc, 0xaa, 0x75, 0x59, 0x93, 0x5c, - 0x86, 0xf9, 0x44, 0x50, 0x84, 0xd8, 0xcb, 0xd6, 0x9e, 0x63, 0x45, 0x66, 0x08, 0x9d, 0x17, 0x61, - 0x4a, 0x8e, 0x79, 0xa0, 0x7c, 0x75, 0xec, 0x49, 0x01, 0x63, 0x6b, 0x4a, 0x54, 0xd7, 0x93, 0x8d, - 0xca, 0x14, 0x53, 0x87, 0x90, 0x01, 0xc9, 0x1b, 0x40, 0x94, 0xbc, 0xa9, 0xb6, 0x01, 0x51, 0xe1, - 0x9c, 0x2c, 0x51, 0xeb, 0x57, 0x54, 0xfb, 0x77, 0xf2, 0x52, 0x64, 0x5c, 0xf2, 0xfd, 0x28, 0x8c, - 0x02, 0xb7, 0x6b, 0xdc, 0x3b, 0x49, 0x1b, 0x4e, 0xf9, 0x6e, 0x2f, 0xda, 0x5b, 0x74, 0xd8, 0xbf, - 0x7e, 0x20, 0xfd, 0x75, 0x1b, 0xd2, 0xe8, 0x70, 0x72, 0xf1, 0x8a, 0x79, 0x74, 0x54, 0x18, 0x76, - 0x45, 0x47, 0x66, 0x12, 0x8e, 0xc6, 0x75, 0xf5, 0x39, 0xfb, 0x24, 0xe7, 0x99, 0xc2, 0x22, 0xab, - 0x30, 0xb5, 0x4d, 0xdd, 0x80, 0x06, 0x4e, 0x9c, 0x34, 0x3f, 0x79, 0xf1, 0x5c, 0x42, 0x04, 0xb4, - 0xbf, 0x35, 0xb9, 0x4e, 0x6e, 0xc7, 0x25, 0xe4, 0x3d, 0x98, 0xf0, 0x9a, 0x22, 0xd4, 0xa0, 0xb8, - 0x7e, 0x9a, 0x57, 0x9e, 0x5a, 0x93, 0x47, 0x1e, 0x8c, 0x79, 0xb0, 0xbb, 0xab, 0x27, 0xa0, 0x4b, - 0xd3, 0xc6, 0x0d, 0xdd, 0x5a, 0x92, 0xd2, 0x49, 0x9a, 0x2c, 0x95, 0xf2, 0xff, 0x04, 0x8c, 0x85, - 0x5a, 0xec, 0x43, 0x5b, 0xfc, 0xb2, 0xfe, 0x1c, 0x5c, 0x1c, 0xb6, 0x8f, 0xd8, 0x68, 0xf6, 0xe9, - 0xf0, 0x09, 0x7b, 0xce, 0x4d, 0xf5, 0xdb, 0x8b, 0xa0, 0x07, 0x6f, 0xf3, 0xe4, 0x3c, 0x93, 0xb0, - 0xbb, 0x81, 0x67, 0xfd, 0x58, 0x01, 0x66, 0x4c, 0x9d, 0x04, 0x79, 0x0d, 0x46, 0x14, 0xdb, 0x19, - 0xa5, 0x3b, 0xd7, 0x91, 0x18, 0x73, 0x1b, 0x91, 0xd8, 0x01, 0x89, 0x4f, 0x6d, 0x4e, 0x5b, 0x57, - 0x6f, 0xdb, 0x53, 0x08, 0x94, 0x6a, 0xed, 0x5b, 0xc0, 0x53, 0x27, 0xe3, 0x86, 0x1d, 0x79, 0x6d, - 0x3a, 0x84, 0x76, 0xbb, 0xf8, 0xbd, 0xc3, 0xf2, 0x73, 0xa8, 0x97, 0x9c, 0x62, 0xb4, 0x6c, 0xcf, - 0x64, 0x85, 0xda, 0x95, 0x73, 0xa4, 0xff, 0x95, 0x53, 0x34, 0xa5, 0xcf, 0x95, 0x73, 0x74, 0xc0, - 0x95, 0x33, 0xa6, 0xd4, 0xaf, 0x9c, 0xa8, 0x78, 0x18, 0xef, 0xa7, 0x78, 0x88, 0x69, 0xb8, 0xe2, - 0xe1, 0x25, 0xd1, 0xdc, 0xc0, 0xdd, 0x77, 0xb0, 0x1f, 0xb8, 0x51, 0x20, 0x6f, 0x88, 0xed, 0xee, - 0xe3, 0xa3, 0xe4, 0xd2, 0x04, 0xc8, 0x97, 0x4c, 0xeb, 0xaf, 0xe7, 0x12, 0x97, 0x3c, 0x39, 0x14, - 0x2f, 0xc3, 0x8c, 0xd7, 0x66, 0xd2, 0x27, 0x6d, 0x6a, 0x52, 0xd3, 0xb4, 0x3d, 0x2d, 0xa1, 0x5c, - 0x72, 0x7a, 0x05, 0x66, 0x15, 0x1a, 0xf7, 0x1e, 0xe7, 0x1e, 0x0e, 0xb6, 0xa2, 0x16, 0xde, 0xe3, - 0xaf, 0xc1, 0x9c, 0x42, 0x14, 0x82, 0x3a, 0x17, 0x9c, 0xa6, 0xed, 0x92, 0x2c, 0x10, 0x49, 0x40, - 0x43, 0x6b, 0x37, 0x79, 0xf4, 0x7e, 0x46, 0x5f, 0x65, 0xfd, 0x56, 0xc1, 0x10, 0x80, 0x65, 0x35, - 0x4b, 0x30, 0xc9, 0x76, 0x64, 0xd1, 0x49, 0x62, 0x5b, 0x79, 0xb1, 0x4f, 0xf7, 0x8b, 0xb7, 0xe0, - 0x7a, 0x7d, 0xc3, 0x86, 0x30, 0xf4, 0xe5, 0xd3, 0xb0, 0xc3, 0x0f, 0x1d, 0x2e, 0xc3, 0xe1, 0xf4, - 0x93, 0xec, 0xf8, 0x1e, 0xf2, 0xea, 0x60, 0x76, 0x95, 0x6e, 0x17, 0xbf, 0x91, 0xcd, 0x3e, 0x3c, - 0x7c, 0xd4, 0x2f, 0x59, 0xc1, 0x5d, 0xc0, 0xfb, 0x62, 0x68, 0x32, 0x2f, 0x64, 0x08, 0x0f, 0x29, - 0xe6, 0xd8, 0x4b, 0xc8, 0xb9, 0xd4, 0x93, 0x7f, 0x4a, 0xb6, 0x2b, 0x30, 0x15, 0x36, 0xbc, 0xb6, - 0x62, 0x38, 0x92, 0xa1, 0xba, 0x48, 0x37, 0x7e, 0xb9, 0x76, 0xc7, 0x9e, 0x64, 0x74, 0x92, 0xcd, - 0x1e, 0x9c, 0xd2, 0x65, 0x64, 0xf3, 0x23, 0x47, 0x65, 0x54, 0xbe, 0x81, 0x3d, 0x10, 0x8b, 0xd2, - 0xf8, 0xa9, 0x27, 0x5c, 0x13, 0x20, 0xd0, 0xac, 0x3d, 0x38, 0xdd, 0x7f, 0x48, 0xd8, 0xb5, 0x8b, - 0xea, 0xfe, 0xe5, 0xb6, 0xfc, 0xa9, 0x9d, 0xcb, 0x79, 0xfd, 0x5c, 0xd6, 0x25, 0xe6, 0x82, 0x21, - 0x31, 0x5b, 0x7f, 0xab, 0x00, 0xe7, 0x87, 0x18, 0xae, 0x01, 0x75, 0x7e, 0x00, 0x93, 0x5c, 0xe1, - 0xca, 0xb7, 0xcf, 0xbc, 0x21, 0x1a, 0x31, 0xa6, 0x62, 0xaf, 0x63, 0x62, 0x5a, 0xbc, 0xdf, 0x41, - 0xa8, 0xfe, 0x26, 0xdf, 0x84, 0x59, 0xbe, 0xa1, 0x71, 0x73, 0x8e, 0x9d, 0x5e, 0x6b, 0x88, 0x1d, - 0xed, 0x79, 0x69, 0x7b, 0x9e, 0x20, 0xc5, 0x4d, 0x0e, 0x77, 0x8c, 0xba, 0x82, 0x91, 0x2d, 0x98, - 0x44, 0xb4, 0x1d, 0xd7, 0x6b, 0x0d, 0x65, 0x04, 0x2d, 0x2d, 0xdb, 0x75, 0x32, 0x6e, 0x85, 0xc6, - 0x00, 0x37, 0xf0, 0x37, 0xbb, 0xe4, 0x76, 0x7a, 0x6d, 0xc7, 0xed, 0x76, 0xf9, 0x5c, 0x10, 0xaf, - 0x66, 0xa3, 0xf6, 0x74, 0xa7, 0xd7, 0xae, 0x74, 0xbb, 0x38, 0xa4, 0xf8, 0xbc, 0x36, 0xc7, 0xf0, - 0xf8, 0xaa, 0x95, 0x98, 0x63, 0x88, 0xc9, 0x18, 0xf0, 0x75, 0x2b, 0x70, 0x8f, 0x01, 0x37, 0xb6, - 0xe0, 0xcf, 0x05, 0x36, 0xff, 0x61, 0xfd, 0x8b, 0xbc, 0x14, 0x09, 0xfb, 0xcf, 0xfb, 0x3f, 0x1b, - 0xa2, 0x8c, 0x21, 0xba, 0x08, 0x25, 0xd6, 0xf5, 0xf1, 0xa6, 0xa2, 0xc6, 0x68, 0xa6, 0xd3, 0x6b, - 0xab, 0xbe, 0xd3, 0x3b, 0x7e, 0x4c, 0xef, 0xf8, 0x2f, 0x48, 0x91, 0x31, 0x73, 0x7b, 0xe8, 0xdf, - 0xe5, 0xd6, 0xff, 0x5e, 0x80, 0x0b, 0xc3, 0x6d, 0x02, 0x7f, 0x36, 0x6e, 0x19, 0xe3, 0x96, 0x50, - 0x02, 0x8c, 0xa6, 0x94, 0x00, 0x19, 0x6b, 0x6f, 0x2c, 0x6b, 0xed, 0xa5, 0x54, 0x0e, 0xe3, 0x19, - 0x2a, 0x87, 0xcc, 0x05, 0x5a, 0x3c, 0x62, 0x81, 0x4e, 0xe8, 0xf3, 0xe4, 0x7f, 0xcd, 0xc3, 0x7c, - 0xc6, 0x93, 0x12, 0xf9, 0x2a, 0xcc, 0x4b, 0xd1, 0x9e, 0x9f, 0x1c, 0x5c, 0xe4, 0xe6, 0xa7, 0xef, - 0xa5, 0x2c, 0xa1, 0x1e, 0xd1, 0x32, 0x04, 0xef, 0x39, 0x21, 0xce, 0xc7, 0xe5, 0x7f, 0x7a, 0x04, - 0x79, 0xf2, 0x21, 0x9c, 0xc0, 0xb0, 0xb1, 0x0d, 0x47, 0xbf, 0x2c, 0x07, 0x74, 0x47, 0xcc, 0x87, - 0x17, 0x53, 0x62, 0xaf, 0xd7, 0xd0, 0x3e, 0xe7, 0xff, 0xa3, 0xee, 0x6a, 0x7e, 0x1c, 0x39, 0xae, - 0xfb, 0x34, 0xc9, 0x99, 0x9d, 0x79, 0x9c, 0x8f, 0x9e, 0xd2, 0x68, 0x77, 0xb4, 0x3b, 0x3b, 0xab, - 0xf4, 0xae, 0xd7, 0x5a, 0xca, 0x92, 0xbd, 0xda, 0xc8, 0xd2, 0x2a, 0x51, 0xe4, 0x1e, 0xb2, 0x39, - 0x6c, 0x0d, 0xd9, 0xa4, 0xba, 0x9b, 0x33, 0x5e, 0xc9, 0x76, 0x83, 0x1a, 0xf6, 0xcc, 0x30, 0xe6, - 0x34, 0x69, 0xb2, 0x29, 0x79, 0x75, 0x49, 0x82, 0x00, 0x0e, 0x90, 0xc4, 0xf9, 0x30, 0x72, 0x30, - 0x92, 0x00, 0x41, 0x00, 0x1d, 0x72, 0xc8, 0x31, 0xb7, 0xfc, 0x03, 0x06, 0x0c, 0x03, 0x3e, 0xe4, - 0x94, 0x00, 0x42, 0x22, 0x20, 0x39, 0xe4, 0x1a, 0x24, 0x07, 0x9f, 0x82, 0x7a, 0x55, 0xd5, 0x5d, - 0xdd, 0x4d, 0x72, 0x67, 0x76, 0xe5, 0x04, 0x3e, 0xcd, 0xb0, 0xea, 0xbd, 0xea, 0xfa, 0xae, 0x7a, - 0xf5, 0xde, 0xfb, 0x3d, 0xdb, 0x3f, 0xa9, 0x2d, 0xd8, 0x5b, 0xe3, 0x29, 0xe9, 0x69, 0x19, 0xe1, - 0xef, 0x15, 0xd0, 0x9e, 0xdc, 0x5f, 0x28, 0xcb, 0xa5, 0x3b, 0x9c, 0xca, 0x72, 0x52, 0xef, 0xdd, - 0x86, 0xb5, 0x91, 0x7f, 0x32, 0xf2, 0xc7, 0x67, 0x52, 0xf7, 0xad, 0xd8, 0xab, 0x3c, 0x51, 0x74, - 0x8c, 0x00, 0x8b, 0xba, 0xd4, 0x25, 0x5b, 0x30, 0x69, 0xd5, 0x48, 0xf4, 0x9b, 0x3a, 0x0e, 0x74, - 0x36, 0xc9, 0x15, 0x64, 0x3f, 0xde, 0x2d, 0x2c, 0xe7, 0xd4, 0xbc, 0xcd, 0x21, 0xad, 0x4e, 0x7a, - 0x7d, 0x5f, 0xfb, 0x07, 0x45, 0xdc, 0x08, 0xa6, 0x75, 0x1e, 0xf9, 0x40, 0x32, 0x82, 0xca, 0x67, - 0xae, 0x21, 0xd3, 0x58, 0x64, 0x7b, 0x11, 0x8e, 0xb2, 0x84, 0x09, 0x09, 0x94, 0x25, 0x4c, 0x79, - 0x16, 0x4b, 0x8e, 0x87, 0x42, 0x87, 0x4a, 0x77, 0xbb, 0xc3, 0xfb, 0xe4, 0x1e, 0x5c, 0x61, 0x6a, - 0x53, 0x51, 0xd1, 0x8d, 0x44, 0x45, 0x0f, 0xef, 0xdb, 0x22, 0x5f, 0xfb, 0x71, 0xf4, 0xce, 0x93, - 0xa9, 0xfe, 0xe1, 0x7d, 0xf2, 0xc6, 0xc5, 0xcc, 0x99, 0x96, 0x85, 0x39, 0x53, 0x64, 0xca, 0xf4, - 0x66, 0xc2, 0x94, 0xe9, 0xce, 0xfc, 0x7e, 0xe2, 0x4f, 0xcc, 0xe9, 0x68, 0xde, 0xff, 0xa3, 0xc0, - 0xcd, 0xb9, 0x1c, 0x64, 0x07, 0x96, 0xf5, 0x96, 0xe9, 0xc6, 0x23, 0x4b, 0x57, 0x8b, 0x48, 0x21, - 0xfb, 0xb0, 0xb2, 0xd7, 0x19, 0xf7, 0x8e, 0xe9, 0x04, 0x9e, 0xfa, 0x32, 0x96, 0x29, 0x36, 0x22, - 0xaf, 0x2d, 0xd8, 0x31, 0x2f, 0xf1, 0x60, 0x13, 0x57, 0x41, 0x26, 0x5a, 0x6e, 0xfa, 0xc1, 0x20, - 0x53, 0x60, 0x86, 0x8d, 0xee, 0x30, 0x99, 0xc4, 0xf4, 0xe2, 0xfb, 0x48, 0xdc, 0x42, 0x66, 0x57, - 0xf0, 0x12, 0xc0, 0x68, 0x2f, 0xc1, 0x72, 0x4b, 0x28, 0x7f, 0x24, 0xfb, 0x3f, 0xa1, 0xe8, 0xb1, - 0xa3, 0x5c, 0xed, 0x8f, 0x15, 0x21, 0xd5, 0x3f, 0xb9, 0x21, 0x52, 0x18, 0x85, 0xee, 0xfc, 0x30, - 0x0a, 0xdd, 0xa7, 0x0c, 0xa3, 0xa0, 0xfd, 0x1d, 0x87, 0x2d, 0x35, 0xbb, 0xad, 0x54, 0x64, 0xaf, - 0x67, 0xb5, 0xe3, 0x34, 0x12, 0xb3, 0xf3, 0xb6, 0x14, 0xda, 0x25, 0xfb, 0xad, 0xd9, 0xe6, 0x9c, - 0xd2, 0x54, 0xfd, 0x8f, 0x1c, 0xec, 0xcc, 0x63, 0x9f, 0x1a, 0x84, 0x4c, 0xb9, 0x5c, 0x10, 0xb2, - 0x7b, 0xb0, 0xcc, 0xd2, 0x92, 0x91, 0x9d, 0x39, 0x2b, 0xed, 0x70, 0x91, 0x4d, 0x6e, 0xc3, 0x92, - 0x5e, 0x76, 0xe2, 0xd8, 0x13, 0x68, 0x4d, 0xd4, 0x39, 0x1e, 0xa3, 0x9d, 0x0a, 0xcf, 0x22, 0xdf, - 0xc9, 0x86, 0x5b, 0xe1, 0x41, 0x27, 0x6e, 0x48, 0x1d, 0x92, 0x41, 0x14, 0xc6, 0xfa, 0xc6, 0x08, - 0xb8, 0x1c, 0x54, 0xd2, 0xce, 0x86, 0x6e, 0xd1, 0x60, 0xa9, 0x35, 0xf2, 0xc7, 0x7e, 0x28, 0x5b, - 0xfa, 0x0c, 0x31, 0xc5, 0xe6, 0x39, 0xdc, 0x0e, 0xa7, 0xf3, 0x98, 0xb9, 0x5d, 0x2e, 0xc9, 0xae, - 0xf0, 0x68, 0xb8, 0x43, 0x93, 0x6d, 0x89, 0x44, 0xfb, 0x03, 0x05, 0xb6, 0xa6, 0x55, 0x8b, 0xec, - 0x40, 0x21, 0x98, 0x1a, 0x28, 0x26, 0x60, 0xce, 0x5f, 0x45, 0x8c, 0xaa, 0x7b, 0x32, 0x18, 0x9d, - 0x77, 0x42, 0xd9, 0xbc, 0x49, 0x4a, 0xb6, 0x81, 0xfe, 0xa8, 0xe2, 0xff, 0xe4, 0x96, 0xd8, 0x6c, - 0xf3, 0x99, 0xd0, 0x32, 0xf8, 0x47, 0xd3, 0x01, 0xcc, 0x6e, 0xab, 0x39, 0x64, 0x00, 0xb5, 0x0f, - 0xa0, 0x40, 0xab, 0x95, 0x9a, 0x8c, 0x74, 0x3a, 0xe8, 0x8d, 0x3a, 0x27, 0x62, 0xb5, 0x1a, 0x77, - 0xce, 0xfb, 0x36, 0x12, 0x6b, 0x47, 0xb0, 0x9e, 0xa4, 0x20, 0x46, 0x12, 0xd2, 0xac, 0xf8, 0x9a, - 0xca, 0x4b, 0xda, 0x1b, 0x0c, 0x98, 0x89, 0xed, 0xde, 0x0b, 0xff, 0xfc, 0xd9, 0x2d, 0xa0, 0x3f, - 0x19, 0xcf, 0x34, 0xc8, 0x33, 0xed, 0x4f, 0x73, 0xb0, 0x15, 0x7b, 0xf5, 0x89, 0x25, 0xf1, 0x2b, - 0xeb, 0x62, 0xa2, 0x27, 0x5c, 0x20, 0xc4, 0x8d, 0x29, 0xdb, 0xc0, 0x39, 0x96, 0xd7, 0xfb, 0xb0, - 0x3d, 0x8b, 0x9e, 0xbc, 0x9c, 0x89, 0x7a, 0xcf, 0x21, 0x2f, 0xa2, 0xf0, 0xf8, 0x52, 0x10, 0xfc, - 0x9f, 0x29, 0x70, 0x9d, 0x1b, 0x86, 0x36, 0x3a, 0xbd, 0x00, 0x75, 0x0a, 0xc7, 0xfe, 0x17, 0xe3, - 0x22, 0xb5, 0x9f, 0xd8, 0x96, 0xbe, 0x94, 0xb4, 0xff, 0xcd, 0x7c, 0x6d, 0x76, 0x6b, 0xc9, 0x3d, - 0x04, 0x37, 0xe1, 0x0a, 0x94, 0x02, 0x73, 0x49, 0x0d, 0x68, 0x82, 0xec, 0x92, 0x8a, 0x14, 0xda, - 0xef, 0xc0, 0xee, 0xfc, 0x0f, 0x90, 0x6f, 0xc3, 0x1a, 0x06, 0x04, 0x68, 0x0f, 0x4f, 0x47, 0x9d, - 0xae, 0x2f, 0xde, 0xb4, 0xc4, 0x93, 0xa2, 0x9c, 0xc7, 0x00, 0x5d, 0xb8, 0x8b, 0xe4, 0x29, 0x86, - 0x1a, 0xe0, 0x4c, 0x09, 0xeb, 0x6b, 0xb9, 0x34, 0xed, 0x77, 0x15, 0x20, 0xd9, 0x32, 0xc8, 0xd7, - 0x61, 0xb5, 0xed, 0x96, 0x9d, 0xb0, 0x33, 0x0a, 0x6b, 0x83, 0xc9, 0x88, 0x03, 0xa5, 0x30, 0x8f, - 0xb9, 0xf0, 0x98, 0xee, 0x0c, 0xa3, 0xd0, 0x3b, 0x1b, 0x4c, 0x46, 0x76, 0x82, 0x0e, 0xa3, 0x0e, - 0xf8, 0xfe, 0x77, 0xbb, 0x9d, 0xc7, 0xc9, 0xa8, 0x03, 0x3c, 0x2d, 0x11, 0x75, 0x80, 0xa7, 0x69, - 0x9f, 0x2a, 0x70, 0x43, 0x58, 0x7c, 0x74, 0xa7, 0xd4, 0xa5, 0x8c, 0x7e, 0xe1, 0x23, 0x01, 0x14, - 0x37, 0xef, 0x6e, 0xba, 0x29, 0xa0, 0x13, 0xb0, 0x82, 0x78, 0x49, 0x65, 0xbc, 0xe4, 0x1b, 0x50, - 0x70, 0xc2, 0xc1, 0xf0, 0x02, 0xd8, 0x09, 0x6a, 0x34, 0xa2, 0xe1, 0x60, 0x88, 0x45, 0x20, 0xa7, - 0xe6, 0xc3, 0x96, 0x5c, 0x39, 0x51, 0x63, 0xd2, 0x80, 0x2b, 0x1c, 0x49, 0x27, 0xa5, 0x94, 0x9a, - 0xd3, 0xa6, 0xbd, 0x0d, 0x01, 0xd0, 0xc0, 0x81, 0xca, 0x6c, 0x51, 0x86, 0xf6, 0x27, 0x0a, 0x14, - 0xe9, 0xe5, 0x01, 0xc5, 0xb1, 0x67, 0x9d, 0xd2, 0xc9, 0x7b, 0xa0, 0xd0, 0xa0, 0x46, 0xc5, 0x5f, - 0xe8, 0x70, 0x7d, 0x1d, 0x36, 0x52, 0x0c, 0x44, 0x43, 0xd7, 0xdc, 0x7e, 0xef, 0xb8, 0xc3, 0x40, - 0xcc, 0x99, 0xf6, 0x31, 0x91, 0xa6, 0xfd, 0xa1, 0x02, 0x5b, 0x54, 0x78, 0x37, 0xf1, 0xdd, 0xd6, - 0x9e, 0xf4, 0xc5, 0x7a, 0xa7, 0x17, 0x22, 0x61, 0x3a, 0xc4, 0xdc, 0x06, 0xd9, 0x85, 0x88, 0xa7, - 0xd9, 0x51, 0x2e, 0xa9, 0xc1, 0x32, 0x3f, 0x5f, 0xc6, 0x1c, 0x5f, 0x6c, 0x57, 0x7a, 0x15, 0x88, - 0x0b, 0xe6, 0x44, 0xb4, 0x25, 0xb8, 0x85, 0x71, 0x1e, 0x3b, 0xe2, 0xd6, 0xfe, 0x4b, 0x81, 0x6b, - 0x33, 0x78, 0xc8, 0xdb, 0xb0, 0x88, 0x2e, 0x0d, 0x7c, 0xf4, 0x76, 0x66, 0x7c, 0x22, 0x3c, 0x3e, - 0x3b, 0xbc, 0xcf, 0x0e, 0xa2, 0x73, 0xfa, 0xc3, 0x66, 0x5c, 0xe4, 0x03, 0x58, 0xd1, 0xbb, 0x5d, - 0x2e, 0x97, 0xe4, 0x12, 0x72, 0xc9, 0x8c, 0x2f, 0xbe, 0x1a, 0xd1, 0x33, 0xb9, 0x84, 0x19, 0xd7, - 0x76, 0xbb, 0x1e, 0x77, 0xd7, 0x88, 0xcb, 0xbb, 0xfe, 0x9b, 0xb0, 0x9e, 0x24, 0xbe, 0x94, 0x5c, - 0xf2, 0x63, 0x05, 0xd4, 0x64, 0x1d, 0x7e, 0x39, 0xd0, 0x12, 0xd3, 0x86, 0xf9, 0x09, 0x93, 0xea, - 0xcf, 0x73, 0xf0, 0xfc, 0xd4, 0x1e, 0x26, 0xaf, 0xc0, 0x92, 0x3e, 0x1c, 0x9a, 0x15, 0x3e, 0xab, - 0xf8, 0x85, 0x07, 0x9f, 0x7b, 0x13, 0x62, 0x1b, 0x23, 0x22, 0x0f, 0x60, 0x19, 0x67, 0x26, 0x65, - 0xc8, 0xc5, 0x48, 0x5f, 0xec, 0x35, 0x24, 0x85, 0xf4, 0x25, 0x08, 0x49, 0x15, 0xd6, 0xb9, 0x97, - 0xb9, 0xed, 0x9f, 0xfa, 0xdf, 0x8f, 0x20, 0x67, 0x11, 0x15, 0x57, 0xbc, 0x21, 0x7b, 0x23, 0x96, - 0x27, 0xfb, 0x59, 0x27, 0xb9, 0x48, 0x1d, 0x54, 0x2c, 0x53, 0x2e, 0x89, 0xc1, 0x8d, 0xa1, 0xdf, - 0x3f, 0xab, 0xc4, 0x8c, 0xb2, 0x32, 0x9c, 0xd1, 0x70, 0xe9, 0xe3, 0x71, 0xef, 0x34, 0x38, 0xf7, - 0x83, 0xf0, 0x97, 0x37, 0x5c, 0xf1, 0x37, 0x2e, 0x34, 0x5c, 0x7f, 0x51, 0x60, 0x8b, 0x39, 0xcd, - 0x46, 0x6f, 0x34, 0x12, 0xc2, 0x24, 0xde, 0x68, 0x30, 0x6a, 0x28, 0xf3, 0xa3, 0xae, 0xc0, 0x15, - 0xe6, 0xdf, 0x2e, 0x56, 0xc6, 0xcd, 0xa9, 0x55, 0x60, 0x34, 0x87, 0xf7, 0xd9, 0xf5, 0x85, 0xf9, - 0x56, 0x8c, 0x6d, 0xc1, 0x4a, 0x0e, 0xa1, 0x58, 0xee, 0xfb, 0x9d, 0x60, 0x32, 0x74, 0x2f, 0xa6, - 0x06, 0xdc, 0xe6, 0x6d, 0x59, 0x3d, 0x66, 0x6c, 0xa8, 0x3e, 0xc4, 0x9d, 0x5c, 0x2e, 0x88, 0xb8, - 0x91, 0xb9, 0x75, 0x01, 0x9f, 0x1c, 0xbf, 0x36, 0xa7, 0x7f, 0xd2, 0x89, 0xc8, 0x97, 0xf4, 0x25, - 0xe0, 0xf6, 0xd8, 0x1e, 0xac, 0xd7, 0x3b, 0xe3, 0xd0, 0x1d, 0x75, 0x82, 0x31, 0xe2, 0x62, 0x5d, - 0x00, 0x37, 0x44, 0xc4, 0x17, 0x66, 0x4f, 0x91, 0x61, 0xc4, 0xca, 0x9e, 0x22, 0x93, 0xc5, 0xd1, - 0xfb, 0x52, 0xb5, 0x17, 0x74, 0xfa, 0xbd, 0x4f, 0x84, 0x57, 0x0a, 0xbb, 0x2f, 0x9d, 0x88, 0x44, - 0x3b, 0xce, 0xd7, 0xbe, 0x95, 0x19, 0x37, 0x56, 0xcb, 0x22, 0x5c, 0xe1, 0x3e, 0x8b, 0xcc, 0x87, - 0xaf, 0x65, 0x58, 0x15, 0xd3, 0xda, 0x57, 0x15, 0xb2, 0x0e, 0xd0, 0xb2, 0x9b, 0x65, 0xc3, 0x71, - 0xe8, 0xef, 0x1c, 0xfd, 0xcd, 0x1d, 0xfc, 0xaa, 0xed, 0xba, 0x9a, 0x97, 0x7c, 0xfc, 0x0a, 0xda, - 0x4f, 0x15, 0xb8, 0x3a, 0x7d, 0x28, 0x89, 0x0b, 0xe8, 0xe5, 0xc9, 0x15, 0xc2, 0x5f, 0x9f, 0x3b, - 0xee, 0x53, 0x93, 0xd3, 0xde, 0xa2, 0x21, 0xf3, 0x42, 0xcc, 0x09, 0xad, 0x4f, 0x1c, 0x19, 0xb7, - 0xd7, 0xd5, 0xca, 0xb0, 0x3d, 0xab, 0x8c, 0x64, 0x53, 0x37, 0xa0, 0xa8, 0xb7, 0x5a, 0x75, 0xb3, - 0xac, 0xbb, 0x66, 0xd3, 0x52, 0x15, 0xb2, 0x02, 0x8b, 0xfb, 0x76, 0xb3, 0xdd, 0x52, 0x73, 0xda, - 0x8f, 0x14, 0x58, 0x33, 0x83, 0xd0, 0x3f, 0x65, 0x56, 0xba, 0xcf, 0xba, 0xf8, 0xde, 0x4a, 0x2c, - 0xbe, 0xed, 0xc8, 0x1f, 0x3a, 0xfa, 0xc0, 0x85, 0x56, 0xde, 0x3f, 0x29, 0xb0, 0x99, 0xe1, 0x21, - 0x0e, 0x5c, 0xd1, 0x8f, 0x9c, 0xa6, 0x59, 0x29, 0xf3, 0x9a, 0x89, 0x5b, 0x39, 0x4f, 0xcd, 0x7e, - 0x85, 0xf9, 0x10, 0x7d, 0x3c, 0xf6, 0x06, 0xbd, 0xae, 0x14, 0x8f, 0xab, 0xb6, 0x60, 0x8b, 0x92, - 0xf0, 0x24, 0xfb, 0x64, 0x32, 0xf2, 0xb1, 0xd8, 0x5c, 0xe2, 0x45, 0x33, 0x4a, 0xcf, 0x16, 0x8c, - 0x46, 0xa9, 0x1d, 0x9a, 0x9f, 0x2d, 0x3a, 0x2e, 0x6f, 0x6f, 0x0d, 0x8a, 0x5c, 0x6a, 0x41, 0x81, - 0xe0, 0x87, 0x0a, 0x6c, 0xcf, 0xaa, 0x2b, 0x15, 0x84, 0x92, 0x0e, 0x85, 0x57, 0x23, 0x44, 0xe5, - 0xa4, 0x27, 0xa1, 0x20, 0x23, 0xef, 0x40, 0x91, 0x85, 0x1b, 0x77, 0x1e, 0xb4, 0x6d, 0x93, 0x4f, - 0x90, 0x9b, 0xff, 0xf9, 0xd9, 0xad, 0x6b, 0x2c, 0x38, 0xb9, 0x37, 0x7e, 0xe0, 0x4d, 0x46, 0xbd, - 0x04, 0xfa, 0xac, 0xcc, 0xa1, 0xfd, 0x40, 0x81, 0xeb, 0xb3, 0x1b, 0x49, 0x4f, 0x19, 0x97, 0x99, - 0x2f, 0x09, 0x17, 0x26, 0x3c, 0x65, 0x22, 0x1b, 0x27, 0xf9, 0x94, 0x11, 0x84, 0x94, 0x29, 0x8a, - 0x74, 0x99, 0xcb, 0x04, 0xb8, 0x4b, 0x32, 0x09, 0x42, 0xed, 0xaf, 0x72, 0x70, 0x95, 0x4e, 0xa0, - 0xbe, 0x3f, 0x1e, 0xeb, 0x93, 0xf0, 0xcc, 0x0f, 0x42, 0x7e, 0xa5, 0x22, 0x6f, 0xc0, 0xd2, 0xd9, - 0xe5, 0x5e, 0x03, 0x19, 0x39, 0x21, 0x80, 0x9b, 0xb2, 0x30, 0x6a, 0xa5, 0xff, 0x93, 0x9b, 0x20, - 0x05, 0x14, 0xc4, 0x3d, 0x75, 0xd5, 0x5e, 0x19, 0x46, 0x61, 0x05, 0xdf, 0x84, 0x45, 0x94, 0xfe, - 0xf9, 0xd6, 0x28, 0xae, 0xb4, 0xd3, 0x6b, 0x86, 0x6f, 0x03, 0x36, 0x63, 0x20, 0x5f, 0x05, 0x88, - 0x91, 0x7b, 0xf9, 0xde, 0x27, 0xc4, 0xe8, 0x08, 0xbc, 0xd7, 0x5e, 0x39, 0x3f, 0xe9, 0x70, 0x38, - 0xdc, 0x12, 0x6c, 0x8a, 0x2e, 0x19, 0x0a, 0x98, 0x20, 0xae, 0x9e, 0xda, 0x60, 0x19, 0xe6, 0x90, - 0x43, 0x05, 0x69, 0xff, 0x9e, 0x83, 0x95, 0x23, 0x7a, 0x51, 0x40, 0xf1, 0x77, 0xbe, 0x38, 0xfd, - 0x1a, 0x14, 0xeb, 0x83, 0x0e, 0x7f, 0xbb, 0x1f, 0x73, 0xa4, 0x32, 0x74, 0x4c, 0xea, 0x0f, 0x3a, - 0x42, 0x0d, 0x30, 0xb6, 0x65, 0xa2, 0x27, 0x38, 0x55, 0xbd, 0x0b, 0x4b, 0x4c, 0x97, 0xc2, 0x1f, - 0x6a, 0xc4, 0x55, 0x31, 0xaa, 0xd1, 0xab, 0x2c, 0x5b, 0x7a, 0x6e, 0x66, 0xfa, 0x18, 0xf9, 0xde, - 0xc2, 0x81, 0xca, 0x24, 0x61, 0x7f, 0xf1, 0x62, 0xc2, 0xbe, 0x04, 0xc8, 0xb2, 0x74, 0x11, 0x40, - 0x96, 0xeb, 0x0f, 0xa1, 0x28, 0xd5, 0xe7, 0x52, 0x37, 0xc7, 0xdf, 0xcb, 0xc1, 0x1a, 0xb6, 0x2a, - 0x32, 0xac, 0xf8, 0xd5, 0x7c, 0xba, 0x78, 0x2b, 0xf1, 0x74, 0xb1, 0x2d, 0x8f, 0x17, 0x6b, 0xd9, - 0x9c, 0x37, 0x8b, 0x77, 0x61, 0x33, 0x43, 0x48, 0x5e, 0x87, 0x45, 0x5a, 0x7d, 0x21, 0xea, 0xa9, - 0xe9, 0x19, 0x10, 0x83, 0xf7, 0xd1, 0x86, 0x8f, 0x6d, 0x46, 0xad, 0xfd, 0xb7, 0x02, 0xab, 0x1c, - 0xca, 0x39, 0x38, 0x19, 0x3c, 0xb1, 0x3b, 0xef, 0xa6, 0xbb, 0x93, 0xb9, 0x08, 0xf3, 0xee, 0xfc, - 0xbf, 0xee, 0xc4, 0x87, 0x89, 0x4e, 0xbc, 0x16, 0x41, 0xf9, 0x88, 0xe6, 0xcc, 0xe9, 0xc3, 0x7f, - 0x44, 0x70, 0xbb, 0x24, 0x21, 0xf9, 0x0e, 0xac, 0x58, 0xfe, 0xc7, 0x09, 0x89, 0xe9, 0xee, 0x8c, - 0x42, 0x5f, 0x8d, 0x08, 0xd9, 0x9a, 0xc2, 0xc3, 0x26, 0xf0, 0x3f, 0xf6, 0x32, 0x6a, 0x9c, 0xb8, - 0x48, 0x2a, 0x34, 0x25, 0xd9, 0x2e, 0x33, 0xf5, 0xb9, 0x23, 0x09, 0x7a, 0xbd, 0xff, 0x6d, 0x01, - 0x20, 0xb6, 0xc1, 0xa7, 0x0b, 0x30, 0xa1, 0xc1, 0x16, 0x6f, 0xc7, 0x98, 0x24, 0xcf, 0x71, 0xa1, - 0xd8, 0xbe, 0xcb, 0x1f, 0x45, 0x73, 0xb3, 0xa1, 0x96, 0xf0, 0x79, 0xb4, 0xcc, 0x6d, 0xdc, 0xbb, - 0x7e, 0xbf, 0xc3, 0xf6, 0xe2, 0xfc, 0xde, 0x1d, 0x44, 0xd6, 0x8b, 0x52, 0x67, 0xc4, 0xe4, 0x43, - 0x4b, 0xf8, 0x0a, 0x25, 0xc8, 0xf8, 0xb5, 0x14, 0x9e, 0xde, 0xaf, 0x65, 0xf1, 0x29, 0xfc, 0x5a, - 0x96, 0x2e, 0xe8, 0xd7, 0xd2, 0x82, 0x95, 0x5e, 0xf0, 0x91, 0x1f, 0x84, 0x83, 0xd1, 0x63, 0xd4, - 0x52, 0xc7, 0x4f, 0x59, 0xb4, 0xab, 0x4d, 0x91, 0xc7, 0xc6, 0x1b, 0x0f, 0xcc, 0x88, 0x5e, 0x1e, - 0xee, 0x28, 0x91, 0xfc, 0x3a, 0xc4, 0x5a, 0x0f, 0x8e, 0xbf, 0x3e, 0xfb, 0x9c, 0x3d, 0x16, 0x4a, - 0x91, 0x6f, 0x40, 0x52, 0xf9, 0xc1, 0xbd, 0x4a, 0x59, 0xfc, 0x58, 0x39, 0x43, 0x46, 0x17, 0x3b, - 0x96, 0xf4, 0x23, 0xdc, 0xec, 0xf5, 0x17, 0x39, 0x20, 0xd9, 0x8a, 0x93, 0xb7, 0xa0, 0xc8, 0xb6, - 0x7e, 0x6f, 0x34, 0xfe, 0x1e, 0x77, 0xc6, 0x60, 0xa8, 0x06, 0x52, 0xb2, 0x8c, 0x6a, 0xc0, 0x92, - 0xed, 0xf1, 0xf7, 0xfa, 0xe4, 0xdb, 0xf0, 0x1c, 0x0e, 0xfc, 0xd0, 0x1f, 0xf5, 0x06, 0x5d, 0x0f, - 0x21, 0xe8, 0x3a, 0x7d, 0x1e, 0xd9, 0xe7, 0x15, 0x0c, 0x41, 0x97, 0xcd, 0x9e, 0x31, 0x41, 0xd0, - 0xe7, 0xa1, 0x85, 0x94, 0x2d, 0x46, 0x48, 0x5c, 0x50, 0x65, 0xfe, 0x93, 0x49, 0xbf, 0xcf, 0xe7, - 0x5c, 0x89, 0x8a, 0xbf, 0xe9, 0xbc, 0x19, 0x05, 0xaf, 0xc7, 0x05, 0x57, 0x27, 0xfd, 0x3e, 0x79, - 0x03, 0x60, 0x10, 0x78, 0xe7, 0xbd, 0xf1, 0x98, 0x29, 0x32, 0x22, 0x7f, 0xa5, 0x38, 0x55, 0x1e, - 0xbe, 0x41, 0xd0, 0x60, 0x89, 0x74, 0xf8, 0x86, 0x9d, 0x53, 0x1f, 0xbd, 0x84, 0x99, 0xd1, 0x0a, - 0xc7, 0xea, 0x16, 0x89, 0xc9, 0x69, 0x74, 0xea, 0x3b, 0xbd, 0x4f, 0x84, 0xa9, 0xf3, 0xfb, 0xb0, - 0xc9, 0xcd, 0x45, 0x8f, 0x7a, 0xe1, 0x19, 0xbf, 0x77, 0x3f, 0xcb, 0xa5, 0x5d, 0xba, 0x78, 0xff, - 0x4b, 0x01, 0x40, 0x3f, 0x72, 0x04, 0x00, 0xc7, 0x3d, 0x58, 0xa4, 0xd2, 0x84, 0x78, 0x95, 0xc0, - 0x37, 0x5d, 0x2c, 0x57, 0x7e, 0xd3, 0x45, 0x0a, 0xba, 0x4f, 0xd8, 0xfe, 0x29, 0x3e, 0x8c, 0xe5, - 0xe2, 0x27, 0x8c, 0x11, 0x4b, 0x4a, 0xdc, 0x5e, 0x59, 0x12, 0xa9, 0x03, 0xc4, 0x90, 0x18, 0x5c, - 0xbe, 0xdd, 0x8c, 0x7d, 0xcb, 0x79, 0x06, 0x07, 0x61, 0x8e, 0x61, 0x35, 0xe4, 0xe9, 0x13, 0x93, - 0x91, 0x03, 0x28, 0xb8, 0x9d, 0xc8, 0x1b, 0x67, 0x06, 0x50, 0xc8, 0x8b, 0x3c, 0xf2, 0x52, 0x0c, - 0x16, 0xb2, 0x1e, 0x76, 0x12, 0x01, 0xea, 0xb0, 0x10, 0x62, 0xc0, 0x12, 0x8f, 0xaa, 0x39, 0x03, - 0x60, 0x8a, 0x07, 0xd5, 0xe4, 0xb0, 0x92, 0x98, 0x28, 0xdf, 0x76, 0x78, 0xfc, 0xcc, 0xd7, 0x20, - 0xef, 0x38, 0x0d, 0xee, 0x1e, 0xbb, 0x16, 0xcb, 0x2a, 0x8e, 0xd3, 0x10, 0x41, 0x88, 0xcf, 0x25, - 0x36, 0x4a, 0x4c, 0x7e, 0x03, 0x8a, 0xd2, 0x45, 0x9c, 0x3b, 0x96, 0x63, 0x1f, 0xf4, 0xe2, 0x64, - 0x79, 0x3b, 0x93, 0xa8, 0x49, 0x1d, 0xd4, 0x83, 0xc9, 0x87, 0xbe, 0x3e, 0x1c, 0xa2, 0xbb, 0xc8, - 0x47, 0xfe, 0x88, 0x01, 0x44, 0x2f, 0xc7, 0x88, 0x8c, 0x5e, 0x67, 0x38, 0xf4, 0xba, 0x22, 0x57, - 0x7e, 0x99, 0x49, 0x73, 0x92, 0x16, 0x6c, 0x3a, 0x7e, 0x38, 0x19, 0x32, 0x33, 0x8c, 0xea, 0x60, - 0x44, 0x45, 0x13, 0xb6, 0x61, 0x20, 0x78, 0xdd, 0x98, 0x66, 0x0a, 0xdb, 0x97, 0x93, 0xc1, 0x28, - 0x25, 0xa6, 0x64, 0x99, 0x35, 0x5f, 0x1e, 0x72, 0x7a, 0xde, 0x27, 0x05, 0x1e, 0x3c, 0xef, 0x85, - 0xc0, 0x13, 0x8b, 0x39, 0x5f, 0x9d, 0x02, 0x95, 0x82, 0x6a, 0x34, 0x09, 0x2a, 0x25, 0x01, 0x90, - 0xf2, 0x69, 0x41, 0x42, 0xeb, 0xe2, 0x63, 0xf1, 0x36, 0xc0, 0xbb, 0x83, 0x5e, 0xd0, 0xf0, 0xc3, - 0xb3, 0x41, 0x57, 0x42, 0x6c, 0x29, 0xfe, 0xf6, 0xa0, 0x17, 0x78, 0xe7, 0x98, 0xfc, 0x8b, 0xcf, - 0x6e, 0x49, 0x44, 0xb6, 0xf4, 0x3f, 0xf9, 0x0a, 0xac, 0xd0, 0x5f, 0x6e, 0x6c, 0x4c, 0xc2, 0x1e, - 0x30, 0x91, 0x9b, 0x07, 0x33, 0x8f, 0x08, 0xc8, 0x43, 0x44, 0x71, 0xef, 0x0d, 0x43, 0xe9, 0x5a, - 0x2d, 0x20, 0xdb, 0x7b, 0xc3, 0x30, 0x0d, 0xc0, 0x28, 0x11, 0x93, 0x5a, 0x54, 0x75, 0x11, 0x07, - 0x80, 0x83, 0xc5, 0xe3, 0x2b, 0x1d, 0x9f, 0x6b, 0x9e, 0x40, 0x7e, 0x93, 0x23, 0xb6, 0xa5, 0xd8, - 0xb0, 0x12, 0x4e, 0xad, 0xc2, 0xd4, 0x2a, 0xfc, 0x74, 0x63, 0x95, 0x18, 0x9f, 0x75, 0xbd, 0x63, - 0x4c, 0x4e, 0x54, 0x22, 0x22, 0x26, 0x7b, 0xb0, 0xc1, 0x70, 0x05, 0xa2, 0x78, 0x42, 0xfc, 0xa4, - 0xc3, 0xbd, 0x2d, 0x0e, 0x38, 0x24, 0x7f, 0x3e, 0xc5, 0x40, 0xaa, 0xb0, 0x88, 0xa2, 0x25, 0x37, - 0x06, 0xbf, 0x21, 0xcb, 0xd4, 0xe9, 0x75, 0x84, 0xfb, 0x0a, 0x4a, 0xd3, 0xf2, 0xbe, 0x82, 0xa4, - 0xe4, 0x9b, 0x00, 0x46, 0x30, 0x1a, 0xf4, 0xfb, 0x88, 0x4d, 0xb8, 0x8c, 0x82, 0xd9, 0xcd, 0xe4, - 0x7a, 0xc4, 0x52, 0x62, 0x22, 0x8e, 0xa3, 0x83, 0xbf, 0xbd, 0x14, 0x82, 0xa1, 0x54, 0x96, 0x66, - 0xc2, 0x12, 0x5b, 0x8c, 0x88, 0xf3, 0xc9, 0x91, 0xcb, 0x25, 0x94, 0x48, 0x86, 0xf3, 0xc9, 0xd3, - 0xb3, 0x38, 0x9f, 0x12, 0x83, 0x76, 0x00, 0x5b, 0xd3, 0x1a, 0x96, 0x10, 0x86, 0x95, 0x8b, 0x0a, - 0xc3, 0x7f, 0x93, 0x87, 0x55, 0x2c, 0x4d, 0xec, 0xc2, 0x3a, 0xac, 0x39, 0x93, 0x0f, 0x23, 0x10, - 0x0c, 0xb1, 0x1b, 0x63, 0xfd, 0xc6, 0x72, 0x86, 0xac, 0xf0, 0x4a, 0x70, 0x10, 0x03, 0xd6, 0xc5, - 0x49, 0xb0, 0x2f, 0x0c, 0xcc, 0x23, 0x88, 0x4d, 0x01, 0xe4, 0x94, 0x8d, 0xa7, 0x96, 0x62, 0x8a, - 0xcf, 0x83, 0xfc, 0x65, 0xce, 0x83, 0xc2, 0x85, 0xce, 0x83, 0x0f, 0x60, 0x55, 0x7c, 0x0d, 0x77, - 0xf2, 0xc5, 0x67, 0xdb, 0xc9, 0x13, 0x85, 0x91, 0x7a, 0xb4, 0xa3, 0x2f, 0xcd, 0xdd, 0xd1, 0x51, - 0x8b, 0x28, 0x56, 0x59, 0x26, 0x44, 0x32, 0x2f, 0x03, 0x03, 0x0e, 0xed, 0x97, 0x5b, 0x4f, 0x71, - 0x4a, 0xbe, 0x0e, 0x2b, 0xf5, 0x81, 0x50, 0x20, 0x49, 0x2f, 0xf7, 0x7d, 0x91, 0x28, 0x5f, 0x17, - 0x22, 0xca, 0xe8, 0x74, 0xcb, 0x7f, 0x11, 0xa7, 0xdb, 0x43, 0x00, 0xee, 0xb9, 0x10, 0x07, 0x0a, - 0xc1, 0x25, 0x23, 0x7c, 0x94, 0x93, 0x0a, 0x04, 0x89, 0x98, 0xee, 0x4e, 0xdc, 0xd4, 0x44, 0x3f, - 0x3e, 0x1e, 0x4c, 0x82, 0x30, 0x11, 0x59, 0x8f, 0xc3, 0x1d, 0xd0, 0x23, 0x01, 0xf3, 0xe4, 0xed, - 0x21, 0xc5, 0xf6, 0xc5, 0x0e, 0x08, 0x79, 0x2f, 0xb2, 0x91, 0x9b, 0x1b, 0x68, 0x5c, 0xcb, 0xf4, - 0xd0, 0x4c, 0xcb, 0x38, 0xed, 0xa7, 0x8a, 0x8c, 0x6f, 0xfc, 0x14, 0x43, 0xfd, 0x26, 0x40, 0xa4, - 0xc1, 0x17, 0x63, 0xcd, 0x24, 0xb9, 0x28, 0x55, 0xee, 0xe5, 0x98, 0x56, 0x6a, 0x4d, 0xfe, 0x8b, - 0x6a, 0x8d, 0x0b, 0xc5, 0xe6, 0x77, 0xc3, 0x4e, 0x6c, 0xf2, 0x01, 0x4e, 0x74, 0x93, 0xc5, 0x9d, - 0x49, 0x04, 0x44, 0x8f, 0xef, 0xc1, 0x33, 0x03, 0xa2, 0x47, 0x8c, 0xda, 0x7b, 0xb0, 0x21, 0xfb, - 0x2f, 0x3e, 0x0e, 0x8e, 0xc9, 0x6f, 0x31, 0xb4, 0x35, 0x25, 0x21, 0xe3, 0x48, 0x44, 0x74, 0xc7, - 0x7d, 0x1c, 0x1c, 0xb3, 0xfb, 0x4f, 0xe7, 0x63, 0xb9, 0xae, 0x28, 0x7d, 0xfe, 0x5c, 0x01, 0x92, - 0x25, 0x97, 0x77, 0x13, 0xe5, 0xff, 0xe1, 0x76, 0x99, 0xba, 0x95, 0x15, 0x2e, 0x73, 0x2b, 0x2b, - 0xfd, 0x99, 0x02, 0x1b, 0xa6, 0xde, 0xe0, 0x60, 0xc4, 0x4c, 0x13, 0xf1, 0x6b, 0x70, 0xd3, 0xd4, - 0x1b, 0x5e, 0xab, 0x59, 0x37, 0xcb, 0x8f, 0xbc, 0xa9, 0x18, 0x83, 0x37, 0xe1, 0x85, 0x2c, 0x49, - 0xac, 0xb1, 0xd8, 0x81, 0xed, 0x6c, 0xb6, 0xc0, 0x21, 0x9c, 0xce, 0x2c, 0x20, 0x0b, 0xf3, 0xa5, - 0x77, 0x60, 0x43, 0x60, 0xee, 0xb9, 0x75, 0x07, 0x51, 0x7d, 0x37, 0xa0, 0x78, 0x68, 0xd8, 0x66, - 0xf5, 0x91, 0x57, 0x6d, 0xd7, 0xeb, 0xea, 0x02, 0x59, 0x83, 0x15, 0x9e, 0x50, 0xd6, 0x55, 0x85, - 0xac, 0xc2, 0xb2, 0x69, 0x39, 0x46, 0xb9, 0x6d, 0x1b, 0x6a, 0xae, 0xf4, 0x0e, 0xac, 0xb7, 0x46, - 0xbd, 0x8f, 0x3a, 0xa1, 0x7f, 0xe0, 0x3f, 0x46, 0x85, 0xc3, 0x15, 0xc8, 0xdb, 0xfa, 0x91, 0xba, - 0x40, 0x00, 0x96, 0x5a, 0x07, 0x65, 0xe7, 0xfe, 0x7d, 0x55, 0x21, 0x45, 0xb8, 0xb2, 0x5f, 0x6e, - 0x79, 0x07, 0x0d, 0x47, 0xcd, 0xd1, 0x1f, 0xfa, 0x91, 0x83, 0x3f, 0xf2, 0xa5, 0xaf, 0xc1, 0x26, - 0xde, 0x15, 0xea, 0xbd, 0x71, 0xe8, 0x07, 0xfe, 0x08, 0xeb, 0xb0, 0x0a, 0xcb, 0x8e, 0x4f, 0x17, - 0x79, 0xe8, 0xb3, 0x0a, 0x34, 0x26, 0xfd, 0xb0, 0x37, 0xec, 0xfb, 0xdf, 0x57, 0x95, 0xd2, 0x43, - 0xd8, 0xb0, 0x07, 0x93, 0xb0, 0x17, 0x9c, 0x3a, 0x21, 0xa5, 0x38, 0x7d, 0x4c, 0x9e, 0x87, 0xcd, - 0xb6, 0xa5, 0x37, 0xf6, 0xcc, 0xfd, 0x76, 0xb3, 0xed, 0x78, 0x0d, 0xdd, 0x2d, 0xd7, 0x98, 0xba, - 0xa3, 0xd1, 0x74, 0x5c, 0xcf, 0x36, 0xca, 0x86, 0xe5, 0xaa, 0x4a, 0xe9, 0x8f, 0x14, 0x58, 0x6f, - 0x8f, 0xb9, 0x89, 0x6e, 0x1b, 0x1d, 0xed, 0x5e, 0x84, 0x9d, 0xb6, 0x63, 0xd8, 0x9e, 0xdb, 0x3c, - 0x30, 0x2c, 0xaf, 0xed, 0xe8, 0xfb, 0x69, 0x80, 0xcb, 0x5b, 0x70, 0x43, 0xa2, 0xb0, 0x8d, 0x72, - 0xf3, 0xd0, 0xb0, 0xbd, 0x96, 0xee, 0x38, 0x47, 0x4d, 0xbb, 0xa2, 0x2a, 0xe4, 0x3a, 0x5c, 0x9d, - 0x42, 0xd0, 0xa8, 0xea, 0x6a, 0x2e, 0x93, 0x67, 0x19, 0x47, 0x7a, 0xdd, 0xdb, 0x6b, 0xba, 0x6a, - 0xbe, 0xd4, 0xa0, 0x07, 0x1d, 0x02, 0xbb, 0x31, 0x04, 0xff, 0x65, 0x28, 0x58, 0x4d, 0xcb, 0x48, - 0xab, 0xa4, 0x56, 0x61, 0x59, 0x6f, 0xb5, 0xec, 0xe6, 0x21, 0x0e, 0x28, 0xc0, 0x52, 0xc5, 0xb0, - 0x68, 0xcd, 0xf2, 0x34, 0xa7, 0x65, 0x37, 0x1b, 0x4d, 0xd7, 0xa8, 0xa8, 0x85, 0x92, 0x2d, 0x16, - 0x8c, 0x28, 0xf4, 0x78, 0xc0, 0xf4, 0x3f, 0x15, 0xa3, 0xaa, 0xb7, 0xeb, 0x2e, 0xef, 0x90, 0x47, - 0x9e, 0x6d, 0xbc, 0xd7, 0x36, 0x1c, 0xd7, 0x51, 0x15, 0xa2, 0xc2, 0xaa, 0x65, 0x18, 0x15, 0xc7, - 0xb3, 0x8d, 0x43, 0xd3, 0x38, 0x52, 0x73, 0xb4, 0x4c, 0xf6, 0x3f, 0xfd, 0x42, 0xe9, 0x53, 0x05, - 0x08, 0x03, 0xc5, 0x13, 0x48, 0xeb, 0x38, 0x3e, 0xbb, 0x70, 0xbd, 0x46, 0x3b, 0x16, 0x9b, 0xd6, - 0x68, 0x56, 0xd2, 0x5d, 0x76, 0x15, 0x48, 0x2a, 0xbf, 0x59, 0xad, 0xaa, 0x0a, 0xb9, 0x01, 0xcf, - 0xa5, 0xd2, 0x2b, 0x76, 0xb3, 0xa5, 0xe6, 0xae, 0xe7, 0x96, 0x15, 0x72, 0x2d, 0x93, 0x79, 0x60, - 0x18, 0x2d, 0x35, 0x4f, 0x87, 0x28, 0x95, 0x21, 0x26, 0x20, 0x63, 0x2f, 0x94, 0x7e, 0xa0, 0xc0, - 0x55, 0x56, 0x4d, 0x31, 0x9b, 0xa3, 0xaa, 0xee, 0xc0, 0x36, 0x87, 0xfa, 0x9c, 0x56, 0xd1, 0x2d, - 0x50, 0x13, 0xb9, 0xac, 0x9a, 0xcf, 0xc3, 0x66, 0x22, 0x15, 0xeb, 0x91, 0xa3, 0x6b, 0x35, 0x91, - 0xbc, 0x67, 0x38, 0xae, 0x67, 0x54, 0xab, 0x4d, 0xdb, 0x65, 0x15, 0xc9, 0x97, 0x34, 0xd8, 0x2c, - 0xfb, 0xa3, 0x90, 0xca, 0x20, 0xc1, 0xb8, 0x37, 0x08, 0xb0, 0x0a, 0x6b, 0xb0, 0x62, 0x7c, 0xd3, - 0x35, 0x2c, 0xc7, 0x6c, 0x5a, 0xea, 0x42, 0x69, 0x27, 0x45, 0x23, 0x56, 0x8d, 0xe3, 0xd4, 0xd4, - 0x85, 0x52, 0x07, 0xd6, 0x84, 0x49, 0x2c, 0x9b, 0x15, 0xbb, 0x70, 0x5d, 0xcc, 0x35, 0x5c, 0xbf, - 0xe9, 0x26, 0x6c, 0xc3, 0x56, 0x36, 0xdf, 0x70, 0x55, 0x85, 0x8e, 0x42, 0x2a, 0x87, 0xa6, 0xe7, - 0x4a, 0xbf, 0xaf, 0xc0, 0x5a, 0xa4, 0x8b, 0xc0, 0x97, 0xd4, 0x5b, 0x70, 0xa3, 0x51, 0xd5, 0xbd, - 0x8a, 0x71, 0x68, 0x96, 0x0d, 0xef, 0xc0, 0xb4, 0x2a, 0xa9, 0x8f, 0xbc, 0x00, 0xcf, 0x4f, 0x21, - 0xc0, 0xaf, 0x6c, 0xc3, 0x56, 0x3a, 0xcb, 0x6d, 0xba, 0xb4, 0xbf, 0x76, 0x60, 0x3b, 0x9d, 0x73, - 0x64, 0xec, 0xe9, 0x6d, 0xb7, 0x66, 0xa9, 0xf9, 0xd2, 0x5f, 0x2b, 0xb0, 0xcd, 0x23, 0xab, 0x72, - 0xad, 0x08, 0xc3, 0x38, 0x47, 0x10, 0xc0, 0x12, 0xdc, 0x75, 0xed, 0xb6, 0xe3, 0x1a, 0x15, 0xc1, - 0x4e, 0x27, 0xad, 0x69, 0x1b, 0x0d, 0xc3, 0x72, 0x53, 0x75, 0x7b, 0x19, 0xbe, 0x3c, 0x87, 0xd6, - 0x6a, 0xba, 0xe2, 0x37, 0x5d, 0xab, 0x5f, 0x86, 0xdb, 0x73, 0x88, 0x23, 0xc2, 0x5c, 0xe9, 0x5b, - 0xb0, 0x9a, 0x88, 0xdb, 0x72, 0x0d, 0x9e, 0x93, 0x7f, 0xb7, 0xfc, 0xa0, 0xdb, 0x0b, 0x4e, 0xd5, - 0x85, 0x74, 0x86, 0x3d, 0x09, 0x02, 0x9a, 0x81, 0xdb, 0x82, 0x9c, 0xe1, 0xfa, 0xa3, 0xf3, 0x5e, - 0xd0, 0x09, 0xfd, 0xae, 0x9a, 0x2b, 0xbd, 0x0a, 0x6b, 0x09, 0xb4, 0x48, 0x3a, 0xfe, 0xf5, 0x26, - 0xdf, 0x35, 0x1b, 0x46, 0xc5, 0x6c, 0x37, 0xd4, 0x45, 0xba, 0x21, 0xd4, 0xcc, 0xfd, 0x9a, 0x0a, - 0xa5, 0x1f, 0x29, 0xf4, 0xde, 0x8e, 0xfd, 0xd3, 0xa8, 0xea, 0x62, 0xc6, 0xd0, 0xd9, 0xca, 0x30, - 0x68, 0x0d, 0xc7, 0x61, 0x0a, 0xdd, 0x1d, 0xd8, 0xe6, 0x3f, 0x3c, 0xdd, 0xaa, 0x78, 0x35, 0xdd, - 0xae, 0x1c, 0xe9, 0x36, 0x9d, 0xc2, 0x8f, 0xd4, 0x1c, 0xae, 0x4b, 0x29, 0xc5, 0x73, 0x9b, 0xed, - 0x72, 0x4d, 0xcd, 0xd3, 0x65, 0x90, 0x48, 0x6f, 0x99, 0x96, 0x5a, 0xc0, 0x55, 0x9e, 0xa1, 0xc6, - 0x62, 0x69, 0xfe, 0x62, 0xe9, 0x2f, 0x15, 0xd8, 0x9e, 0x05, 0x8b, 0x40, 0xee, 0x82, 0x66, 0x58, - 0xae, 0xad, 0x9b, 0x15, 0xaf, 0x6c, 0x1b, 0x15, 0xc3, 0x72, 0x4d, 0xbd, 0xee, 0x78, 0x4e, 0xb3, - 0x6d, 0x97, 0xe9, 0x14, 0x15, 0x2a, 0xe9, 0xdb, 0x70, 0x6b, 0x0e, 0x5d, 0xd3, 0xac, 0x94, 0x55, - 0x85, 0xdc, 0x87, 0x57, 0xe6, 0x10, 0x39, 0x8f, 0x1c, 0xd7, 0x68, 0xc8, 0x39, 0x6a, 0xae, 0xd4, - 0x03, 0x35, 0xed, 0x7f, 0x9d, 0x51, 0xfb, 0xdb, 0x6d, 0xcb, 0x62, 0x7b, 0xec, 0x06, 0x14, 0x9b, - 0x6e, 0xcd, 0xb0, 0x39, 0x84, 0x31, 0x62, 0x16, 0xb7, 0x2d, 0x3a, 0x55, 0x9b, 0xb6, 0xf9, 0x3e, - 0x6e, 0xb6, 0xdb, 0xb0, 0xe5, 0xd4, 0xf5, 0xf2, 0x01, 0xce, 0x28, 0xd3, 0xf2, 0xca, 0x35, 0xdd, - 0xb2, 0x8c, 0xba, 0x0a, 0xd8, 0x0f, 0xb3, 0x1c, 0xb5, 0xc8, 0x57, 0xe0, 0xa5, 0xe6, 0x81, 0xab, - 0x7b, 0xad, 0x7a, 0x7b, 0xdf, 0xb4, 0x3c, 0xe7, 0x91, 0x55, 0x16, 0xc7, 0x70, 0x39, 0xbb, 0x1f, - 0xbd, 0x04, 0x77, 0xe6, 0x52, 0xc7, 0x60, 0xc3, 0x77, 0x41, 0x9b, 0x4b, 0xc9, 0x1b, 0x52, 0xfa, - 0x99, 0x02, 0x37, 0xe6, 0xe8, 0x2d, 0xc9, 0x2b, 0x70, 0xaf, 0x66, 0xe8, 0x95, 0xba, 0xe1, 0x38, - 0x1e, 0x6d, 0x2f, 0xed, 0x41, 0x66, 0x1e, 0x30, 0x75, 0xb7, 0xb9, 0x07, 0x5f, 0x9a, 0x4f, 0x1e, - 0x9f, 0x5b, 0x2f, 0xc1, 0x9d, 0xf9, 0xa4, 0xfc, 0x1c, 0xcb, 0xd1, 0xd5, 0x3e, 0x9f, 0x32, 0x3a, - 0xff, 0xf2, 0xa5, 0x1f, 0x2a, 0x70, 0x75, 0xba, 0xb8, 0x4f, 0xeb, 0x66, 0x5a, 0x8e, 0xab, 0xd7, - 0xeb, 0x5e, 0x4b, 0xb7, 0xf5, 0x86, 0x67, 0x58, 0x76, 0xb3, 0x5e, 0x9f, 0xb6, 0xef, 0xdf, 0x81, - 0x17, 0x67, 0x93, 0x3a, 0x65, 0xdb, 0x6c, 0xd1, 0xad, 0x4d, 0x83, 0xdd, 0xd9, 0x54, 0x86, 0x59, - 0x36, 0xd4, 0xdc, 0xde, 0xdb, 0x3f, 0xf9, 0xb7, 0xdd, 0x85, 0x9f, 0x7c, 0xbe, 0xab, 0xfc, 0xfc, - 0xf3, 0x5d, 0xe5, 0x5f, 0x3f, 0xdf, 0x55, 0xde, 0x7f, 0xf9, 0x12, 0xe1, 0xdc, 0x3f, 0x5c, 0x42, - 0x7b, 0x98, 0x07, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xca, 0xe8, 0xab, 0x26, 0x05, 0x9a, 0x01, - 0x00, + // 27897 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x5c, 0x59, + 0x7a, 0x18, 0x36, 0xdd, 0x8d, 0x47, 0xe3, 0xc3, 0xab, 0x71, 0xc0, 0x07, 0xc8, 0x19, 0xb2, 0x39, + 0x97, 0x33, 0x1c, 0x72, 0x1e, 0xe4, 0x12, 0xdc, 0xe1, 0xee, 0xec, 0x3c, 0x1b, 0x68, 0x90, 0x68, + 0x12, 0x04, 0xb0, 0xb7, 0x41, 0x72, 0x47, 0xfb, 0xb8, 0x7b, 0xd1, 0x7d, 0x00, 0xdc, 0x61, 0x77, + 0xdf, 0xde, 0x7b, 0x6f, 0x13, 0xc4, 0xae, 0x1d, 0x4b, 0xb2, 0xd7, 0x1b, 0x97, 0x23, 0xcb, 0x8a, + 0xa5, 0x48, 0x4e, 0xc9, 0x2a, 0x95, 0x1c, 0x3b, 0x8a, 0x53, 0x56, 0x25, 0x92, 0x5d, 0x49, 0x4a, + 0x15, 0x59, 0x4a, 0xa9, 0x94, 0x8d, 0x5c, 0x15, 0xab, 0x2a, 0xce, 0x6b, 0xa3, 0x82, 0xa2, 0xc8, + 0x3f, 0x52, 0xac, 0xa4, 0x4a, 0x8e, 0x2b, 0x4e, 0x65, 0x52, 0xb2, 0x53, 0xe7, 0x3b, 0x8f, 0x7b, + 0xce, 0xbd, 0xb7, 0x1b, 0xcd, 0x19, 0x8e, 0x6d, 0x6e, 0xe9, 0x0f, 0x89, 0xfe, 0xce, 0xf7, 0x7d, + 0xe7, 0x9e, 0xf7, 0x77, 0xbe, 0xf3, 0x3d, 0xe0, 0xc5, 0x88, 0xb6, 0x68, 0xd7, 0x0f, 0xa2, 0x2b, + 0x2d, 0xba, 0xeb, 0x36, 0x0e, 0xae, 0x44, 0x07, 0x5d, 0x1a, 0xf2, 0x7f, 0x2f, 0x77, 0x03, 0x3f, + 0xf2, 0xc9, 0x28, 0xfe, 0x38, 0x7d, 0x6c, 0xd7, 0xdf, 0xf5, 0x11, 0x72, 0x85, 0xfd, 0xc5, 0x0b, + 0x4f, 0x9f, 0xdd, 0xf5, 0xfd, 0xdd, 0x16, 0xbd, 0x82, 0xbf, 0xb6, 0x7b, 0x3b, 0x57, 0x9a, 0xbd, + 0xc0, 0x8d, 0x3c, 0xbf, 0x23, 0xca, 0xcb, 0xc9, 0xf2, 0xc8, 0x6b, 0xd3, 0x30, 0x72, 0xdb, 0x5d, + 0x81, 0x70, 0x49, 0x7d, 0x80, 0x1b, 0x45, 0xac, 0x84, 0x11, 0x5f, 0x79, 0x78, 0x55, 0xff, 0x29, + 0x50, 0xdf, 0xc8, 0xfe, 0xd6, 0xfd, 0xc0, 0xed, 0x76, 0x69, 0x10, 0xff, 0xc1, 0xd1, 0xad, 0x5f, + 0x28, 0xc0, 0xc4, 0x6d, 0x4a, 0xbb, 0x95, 0x96, 0xf7, 0x90, 0x92, 0xf3, 0x30, 0xb2, 0xee, 0xb6, + 0xe9, 0x42, 0xee, 0x5c, 0xee, 0xe2, 0xc4, 0xd2, 0xec, 0xe3, 0xc3, 0xf2, 0x64, 0x48, 0x83, 0x87, + 0x34, 0x70, 0x3a, 0x6e, 0x9b, 0xda, 0x58, 0x48, 0x5e, 0x83, 0x09, 0xf6, 0x7f, 0xd8, 0x75, 0x1b, + 0x74, 0x21, 0x8f, 0x98, 0xd3, 0x8f, 0x0f, 0xcb, 0x13, 0x1d, 0x09, 0xb4, 0xe3, 0x72, 0x52, 0x83, + 0xf1, 0x95, 0x47, 0x5d, 0x2f, 0xa0, 0xe1, 0xc2, 0xc8, 0xb9, 0xdc, 0xc5, 0xc9, 0xc5, 0xd3, 0x97, + 0x79, 0x63, 0x2f, 0xcb, 0xc6, 0x5e, 0xde, 0x92, 0x8d, 0x5d, 0x9a, 0xff, 0xfe, 0x61, 0xf9, 0xb9, + 0xc7, 0x87, 0xe5, 0x71, 0xca, 0x49, 0xfe, 0xea, 0x1f, 0x94, 0x73, 0xb6, 0xa4, 0x27, 0xef, 0xc0, + 0xc8, 0xd6, 0x41, 0x97, 0x2e, 0x4c, 0x9c, 0xcb, 0x5d, 0x9c, 0x59, 0x3c, 0x7b, 0x99, 0x77, 0xbf, + 0xfa, 0xf8, 0xf8, 0x2f, 0x86, 0xb5, 0x54, 0x7c, 0x7c, 0x58, 0x1e, 0x61, 0x28, 0x36, 0x52, 0x91, + 0x37, 0x60, 0x6c, 0xd5, 0x0f, 0xa3, 0x5a, 0x75, 0x01, 0xf0, 0x93, 0x8f, 0x3f, 0x3e, 0x2c, 0xcf, + 0xed, 0xf9, 0x61, 0xe4, 0x78, 0xcd, 0xd7, 0xfd, 0xb6, 0x17, 0xd1, 0x76, 0x37, 0x3a, 0xb0, 0x05, + 0x92, 0xf5, 0x08, 0xa6, 0x0d, 0x7e, 0x64, 0x12, 0xc6, 0xef, 0xae, 0xdf, 0x5e, 0xdf, 0xb8, 0xbf, + 0x5e, 0x7a, 0x8e, 0x14, 0x61, 0x64, 0x7d, 0xa3, 0xba, 0x52, 0xca, 0x91, 0x71, 0x28, 0x54, 0x36, + 0x37, 0x4b, 0x79, 0x32, 0x05, 0xc5, 0x6a, 0x65, 0xab, 0xb2, 0x54, 0xa9, 0xaf, 0x94, 0x0a, 0x64, + 0x1e, 0x66, 0xef, 0xd7, 0xd6, 0xab, 0x1b, 0xf7, 0xeb, 0x4e, 0x75, 0xa5, 0x7e, 0x7b, 0x6b, 0x63, + 0xb3, 0x34, 0x42, 0x66, 0x00, 0x6e, 0xdf, 0x5d, 0x5a, 0xb1, 0xd7, 0x57, 0xb6, 0x56, 0xea, 0xa5, + 0x51, 0x72, 0x0c, 0x4a, 0x92, 0xc4, 0xa9, 0xaf, 0xd8, 0xf7, 0x6a, 0xcb, 0x2b, 0xa5, 0xb1, 0x5b, + 0x23, 0xc5, 0x42, 0x69, 0xc4, 0x1e, 0x5f, 0xa3, 0x6e, 0x48, 0x6b, 0x55, 0xeb, 0x6f, 0x16, 0xa0, + 0x78, 0x87, 0x46, 0x6e, 0xd3, 0x8d, 0x5c, 0xf2, 0x82, 0x31, 0x3e, 0xd8, 0x44, 0x6d, 0x60, 0xce, + 0xa7, 0x07, 0x66, 0xf4, 0xf1, 0x61, 0x39, 0xf7, 0x86, 0x3e, 0x20, 0x6f, 0xc3, 0x64, 0x95, 0x86, + 0x8d, 0xc0, 0xeb, 0xb2, 0x49, 0xb3, 0x50, 0x40, 0xb4, 0x53, 0x8f, 0x0f, 0xcb, 0xc7, 0x9b, 0x31, + 0x58, 0xeb, 0x10, 0x1d, 0x9b, 0xd4, 0x60, 0x6c, 0xcd, 0xdd, 0xa6, 0xad, 0x70, 0x61, 0xf4, 0x5c, + 0xe1, 0xe2, 0xe4, 0xe2, 0xf3, 0x62, 0x10, 0xe4, 0x07, 0x5e, 0xe6, 0xa5, 0x2b, 0x9d, 0x28, 0x38, + 0x58, 0x3a, 0xf6, 0xf8, 0xb0, 0x5c, 0x6a, 0x21, 0x40, 0xef, 0x60, 0x8e, 0x42, 0xea, 0xf1, 0xc4, + 0x18, 0x3b, 0x72, 0x62, 0x9c, 0xf9, 0xfe, 0x61, 0x39, 0xc7, 0x06, 0x4c, 0x4c, 0x8c, 0x98, 0x9f, + 0x39, 0x45, 0x16, 0xa1, 0x68, 0xd3, 0x87, 0x5e, 0xc8, 0x5a, 0x56, 0xc4, 0x96, 0x9d, 0x78, 0x7c, + 0x58, 0x26, 0x81, 0x80, 0x69, 0x9f, 0xa1, 0xf0, 0x4e, 0xbf, 0x05, 0x93, 0xda, 0x57, 0x93, 0x12, + 0x14, 0x1e, 0xd0, 0x03, 0xde, 0xc3, 0x36, 0xfb, 0x93, 0x1c, 0x83, 0xd1, 0x87, 0x6e, 0xab, 0x27, + 0xba, 0xd4, 0xe6, 0x3f, 0xbe, 0x94, 0xff, 0x62, 0xee, 0xd6, 0x48, 0x71, 0xbc, 0x54, 0xb4, 0xf3, + 0xb5, 0xaa, 0xf5, 0xef, 0x8e, 0x40, 0xd1, 0xf6, 0xf9, 0x42, 0x24, 0x97, 0x60, 0xb4, 0x1e, 0xb9, + 0x91, 0x1c, 0xa6, 0xf9, 0xc7, 0x87, 0xe5, 0x59, 0xb6, 0x48, 0xa9, 0x56, 0x3f, 0xc7, 0x60, 0xa8, + 0x9b, 0x7b, 0x6e, 0x28, 0x87, 0x0b, 0x51, 0xbb, 0x0c, 0xa0, 0xa3, 0x22, 0x06, 0xb9, 0x00, 0x23, + 0x77, 0xfc, 0x26, 0x15, 0x23, 0x46, 0x1e, 0x1f, 0x96, 0x67, 0xda, 0x7e, 0x53, 0x47, 0xc4, 0x72, + 0xf2, 0x3a, 0x4c, 0x2c, 0xf7, 0x82, 0x80, 0x76, 0xd8, 0x5c, 0x1f, 0x41, 0xe4, 0x99, 0xc7, 0x87, + 0x65, 0x68, 0x70, 0xa0, 0xe3, 0x35, 0xed, 0x18, 0x81, 0x0d, 0x43, 0x3d, 0x72, 0x83, 0x88, 0x36, + 0x17, 0x46, 0x87, 0x1a, 0x06, 0xb6, 0x3e, 0xe7, 0x42, 0x4e, 0x92, 0x1c, 0x06, 0xc1, 0x89, 0xac, + 0xc2, 0xe4, 0xcd, 0xc0, 0x6d, 0xd0, 0x4d, 0x1a, 0x78, 0x7e, 0x13, 0xc7, 0xb7, 0xb0, 0x74, 0xe1, + 0xf1, 0x61, 0xf9, 0xc4, 0x2e, 0x03, 0x3b, 0x5d, 0x84, 0xc7, 0xd4, 0x1f, 0x1f, 0x96, 0x8b, 0x55, + 0xb1, 0x25, 0xda, 0x3a, 0x29, 0xf9, 0x26, 0x1b, 0x9c, 0x30, 0xc2, 0xae, 0xa5, 0xcd, 0x85, 0xf1, + 0x23, 0x3f, 0xd1, 0x12, 0x9f, 0x78, 0xa2, 0xe5, 0x86, 0x91, 0x13, 0x70, 0xba, 0xc4, 0x77, 0xea, + 0x2c, 0xc9, 0x06, 0x14, 0xeb, 0x8d, 0x3d, 0xda, 0xec, 0xb5, 0x28, 0x4e, 0x99, 0xc9, 0xc5, 0x93, + 0x62, 0x52, 0xcb, 0xf1, 0x94, 0xc5, 0x4b, 0xa7, 0x05, 0x6f, 0x12, 0x0a, 0x88, 0x3e, 0x9f, 0x24, + 0xd6, 0x97, 0x8a, 0x3f, 0xf7, 0x8b, 0xe5, 0xe7, 0x7e, 0xf4, 0xf7, 0xcf, 0x3d, 0x67, 0xfd, 0x67, + 0x79, 0x28, 0x25, 0x99, 0x90, 0x1d, 0x98, 0xbe, 0xdb, 0x6d, 0xba, 0x11, 0x5d, 0x6e, 0x79, 0xb4, + 0x13, 0x85, 0x38, 0x49, 0x06, 0xb7, 0xe9, 0x25, 0x51, 0xef, 0x42, 0x0f, 0x09, 0x9d, 0x06, 0xa7, + 0x4c, 0xb4, 0xca, 0x64, 0x1b, 0xd7, 0x53, 0xc7, 0x0d, 0x3c, 0xc4, 0x19, 0xf6, 0x64, 0xf5, 0xf0, + 0xad, 0xbf, 0x4f, 0x3d, 0x82, 0xad, 0x98, 0x40, 0x9d, 0xe6, 0xf6, 0x01, 0xce, 0xcc, 0xe1, 0x27, + 0x10, 0x23, 0xc9, 0x98, 0x40, 0x0c, 0x6c, 0xfd, 0x93, 0x1c, 0xcc, 0xd8, 0x34, 0xf4, 0x7b, 0x41, + 0x83, 0xae, 0x52, 0xb7, 0x49, 0x03, 0x36, 0xfd, 0x6f, 0x7b, 0x9d, 0xa6, 0x58, 0x53, 0x38, 0xfd, + 0x1f, 0x78, 0x1d, 0x7d, 0xeb, 0xc6, 0x72, 0xf2, 0x39, 0x18, 0xaf, 0xf7, 0xb6, 0x11, 0x35, 0x1f, + 0xef, 0x00, 0x61, 0x6f, 0xdb, 0x49, 0xa0, 0x4b, 0x34, 0x72, 0x05, 0xc6, 0xef, 0xd1, 0x20, 0x8c, + 0x77, 0x43, 0x3c, 0x1a, 0x1e, 0x72, 0x90, 0x4e, 0x20, 0xb0, 0xc8, 0xcd, 0x78, 0x47, 0x16, 0x87, + 0xda, 0x6c, 0x62, 0x1f, 0x8c, 0xa7, 0x4a, 0x5b, 0x40, 0xf4, 0xa9, 0x22, 0xb1, 0xac, 0x9f, 0xca, + 0x43, 0xa9, 0xea, 0x46, 0xee, 0xb6, 0x1b, 0x8a, 0xfe, 0xbc, 0x77, 0x8d, 0xed, 0xf1, 0x5a, 0x43, + 0x71, 0x8f, 0x67, 0x5f, 0xfe, 0x89, 0x9b, 0xf7, 0x72, 0xb2, 0x79, 0x93, 0xec, 0x84, 0x15, 0xcd, + 0x8b, 0x1b, 0xf5, 0xee, 0xd1, 0x8d, 0x2a, 0x89, 0x46, 0x15, 0x65, 0xa3, 0xe2, 0xa6, 0x90, 0x77, + 0x61, 0xa4, 0xde, 0xa5, 0x0d, 0xb1, 0x89, 0xc8, 0x73, 0xc1, 0x6c, 0x1c, 0x43, 0xb8, 0x77, 0x6d, + 0x69, 0x4a, 0xb0, 0x19, 0x09, 0xbb, 0xb4, 0x61, 0x23, 0x99, 0xb6, 0x68, 0xfe, 0xf3, 0x02, 0x1c, + 0xcb, 0x22, 0xd3, 0xdb, 0x31, 0x36, 0xa0, 0x1d, 0x17, 0xa1, 0xc8, 0x8e, 0x70, 0x76, 0x2c, 0xe2, + 0x76, 0x31, 0xb1, 0x34, 0xc5, 0x3e, 0x79, 0x4f, 0xc0, 0x6c, 0x55, 0x4a, 0xce, 0x2b, 0x89, 0xa0, + 0x18, 0xf3, 0x13, 0x12, 0x81, 0x94, 0x03, 0xd8, 0x58, 0xcb, 0x25, 0x8c, 0x82, 0x43, 0xdc, 0x2d, + 0x12, 0x1c, 0x8f, 0x75, 0x20, 0x20, 0xc6, 0x31, 0x23, 0x0f, 0x85, 0x15, 0x28, 0xca, 0x66, 0x2d, + 0x4c, 0x21, 0xa3, 0xb9, 0x44, 0x27, 0xdd, 0xbb, 0xc6, 0x07, 0xb3, 0x29, 0x7e, 0xeb, 0x6c, 0x24, + 0x0e, 0xb9, 0x06, 0xc5, 0xcd, 0xc0, 0x7f, 0x74, 0x50, 0xab, 0x86, 0x0b, 0xd3, 0xe7, 0x0a, 0x17, + 0x27, 0x96, 0x4e, 0x3e, 0x3e, 0x2c, 0xcf, 0x77, 0x19, 0xcc, 0xf1, 0x9a, 0xfa, 0x49, 0xab, 0x10, + 0x6f, 0x8d, 0x14, 0x73, 0xa5, 0xfc, 0xad, 0x91, 0x62, 0xbe, 0x54, 0xe0, 0xe2, 0xc5, 0xad, 0x91, + 0xe2, 0x48, 0x69, 0xf4, 0xd6, 0x48, 0x71, 0x14, 0x05, 0x8e, 0x89, 0x12, 0xdc, 0x1a, 0x29, 0x4e, + 0x96, 0xa6, 0x8c, 0xd3, 0x1e, 0x19, 0x44, 0x7e, 0xc3, 0x6f, 0xd9, 0x85, 0xbb, 0x76, 0xcd, 0x1e, + 0x5b, 0xae, 0x2c, 0xd3, 0x20, 0xb2, 0x0b, 0x95, 0xfb, 0x75, 0x7b, 0xba, 0x7a, 0xd0, 0x71, 0xdb, + 0x5e, 0x83, 0x1f, 0x9d, 0x76, 0xe1, 0xe6, 0xf2, 0xa6, 0x55, 0x81, 0x99, 0xb8, 0x2d, 0x6b, 0x5e, + 0x18, 0x91, 0x2b, 0x30, 0x21, 0x21, 0x6c, 0xa3, 0x2b, 0x64, 0xb6, 0xda, 0x8e, 0x71, 0xac, 0xdf, + 0xc9, 0x03, 0xc4, 0x25, 0xcf, 0xe8, 0x5a, 0xf8, 0x82, 0xb1, 0x16, 0x8e, 0x27, 0xd7, 0x42, 0xdf, + 0x55, 0x40, 0xde, 0x87, 0x31, 0x26, 0x16, 0xf4, 0xa4, 0x48, 0x74, 0x32, 0x49, 0x8a, 0x85, 0xf7, + 0xae, 0x2d, 0xcd, 0x08, 0xe2, 0xb1, 0x10, 0x21, 0xb6, 0x20, 0xd3, 0x96, 0xd1, 0x2f, 0x8c, 0xc7, + 0x83, 0x21, 0x16, 0xd0, 0x45, 0x50, 0x03, 0x2a, 0x3a, 0x14, 0x57, 0x46, 0x57, 0x0e, 0xb2, 0x2a, + 0x25, 0xa7, 0x80, 0x0d, 0xb8, 0xe8, 0xd4, 0xf1, 0xc7, 0x87, 0xe5, 0x42, 0x2f, 0xf0, 0x70, 0x12, + 0x90, 0x2b, 0x20, 0xa6, 0x81, 0xe8, 0x40, 0x36, 0xfb, 0xe6, 0x1a, 0xae, 0xd3, 0xa0, 0x41, 0x14, + 0xf7, 0xf8, 0x42, 0x4e, 0xce, 0x16, 0xd2, 0x05, 0x73, 0xaa, 0x2c, 0x8c, 0xe0, 0x34, 0xb8, 0x98, + 0xd9, 0x2b, 0x97, 0x0d, 0x54, 0x2e, 0x46, 0x9e, 0x93, 0xa7, 0x52, 0x93, 0x97, 0x39, 0x29, 0x91, + 0xd2, 0xac, 0x80, 0x5c, 0x03, 0x36, 0x43, 0x45, 0xef, 0x83, 0xa8, 0xa7, 0x72, 0xbf, 0xbe, 0x74, + 0x5c, 0x70, 0x9a, 0x76, 0xf7, 0x75, 0x72, 0x86, 0x4d, 0xde, 0x06, 0x36, 0x85, 0x45, 0xbf, 0x13, + 0x41, 0x74, 0x73, 0x79, 0x73, 0xb9, 0xe5, 0xf7, 0x9a, 0xf5, 0x2f, 0xaf, 0xc5, 0xc4, 0xbb, 0x8d, + 0xae, 0x4e, 0x7c, 0x73, 0x79, 0x93, 0xbc, 0x0d, 0xa3, 0x95, 0x6f, 0xf7, 0x02, 0x2a, 0xe4, 0x93, + 0x29, 0x59, 0x27, 0x83, 0x2d, 0x9d, 0x14, 0x84, 0xb3, 0x2e, 0xfb, 0xa9, 0xcb, 0x75, 0x58, 0xce, + 0x6a, 0xde, 0x5a, 0xab, 0x0b, 0xd9, 0x83, 0x24, 0xba, 0x65, 0x6b, 0x4d, 0xfb, 0xec, 0xc8, 0x68, + 0x35, 0xa3, 0x22, 0x57, 0x20, 0x5f, 0xa9, 0xe2, 0x8d, 0x68, 0x72, 0x71, 0x42, 0x56, 0x5b, 0x5d, + 0x3a, 0x26, 0x48, 0xa6, 0x5c, 0x7d, 0x19, 0xe4, 0x2b, 0x55, 0xb2, 0x04, 0xa3, 0x77, 0x0e, 0xea, + 0x5f, 0x5e, 0x13, 0x9b, 0xd9, 0xbc, 0x9c, 0xd7, 0x0c, 0xb6, 0x81, 0xcb, 0x3e, 0x8c, 0xbf, 0xb8, + 0x7d, 0x10, 0x7e, 0xab, 0xa5, 0x7f, 0x31, 0xa2, 0x91, 0x4d, 0x98, 0xa8, 0x34, 0xdb, 0x5e, 0xe7, + 0x6e, 0x48, 0x83, 0x85, 0x49, 0xe4, 0xb3, 0x90, 0xf8, 0x6e, 0x55, 0xbe, 0xb4, 0xf0, 0xf8, 0xb0, + 0x7c, 0xcc, 0x65, 0x3f, 0x9d, 0x5e, 0x48, 0x03, 0x8d, 0x5b, 0xcc, 0x84, 0x6c, 0x02, 0xdc, 0xf1, + 0x3b, 0xbb, 0x7e, 0x25, 0x6a, 0xb9, 0x61, 0x62, 0x7b, 0x8c, 0x0b, 0x94, 0xf8, 0x70, 0xbc, 0xcd, + 0x60, 0x8e, 0xcb, 0x80, 0x1a, 0x43, 0x8d, 0x07, 0xb9, 0x01, 0x63, 0x1b, 0x81, 0xdb, 0x68, 0xd1, + 0x85, 0x69, 0xe4, 0x76, 0x4c, 0x70, 0xe3, 0x40, 0xd9, 0xd2, 0x05, 0xc1, 0xb0, 0xe4, 0x23, 0x58, + 0xbf, 0xa6, 0x70, 0xc4, 0xd3, 0xf7, 0x81, 0xa4, 0xe7, 0x64, 0xc6, 0x25, 0xe1, 0x35, 0xfd, 0x92, + 0x10, 0x2f, 0xfa, 0x65, 0xbf, 0xdd, 0x76, 0x3b, 0x4d, 0xa4, 0xbd, 0xb7, 0xa8, 0xdd, 0x1d, 0xac, + 0x6f, 0xc1, 0x5c, 0xaa, 0xb3, 0x8e, 0xb8, 0xdf, 0xbd, 0x07, 0xb3, 0x55, 0xba, 0xe3, 0xf6, 0x5a, + 0x91, 0x3a, 0x49, 0xf8, 0x12, 0xc5, 0x9b, 0x56, 0x93, 0x17, 0x39, 0xf2, 0xf8, 0xb0, 0x93, 0xc8, + 0xd6, 0xbb, 0x30, 0x6d, 0x34, 0x9f, 0x5d, 0x15, 0x2a, 0xbd, 0xa6, 0x17, 0xe1, 0x40, 0xe6, 0xe2, + 0xab, 0x82, 0xcb, 0x80, 0x38, 0x5c, 0x76, 0x8c, 0x60, 0xfd, 0x07, 0xba, 0xb4, 0x22, 0x76, 0x22, + 0x76, 0xad, 0x16, 0xfb, 0x41, 0x2e, 0x96, 0x9d, 0x52, 0xfb, 0x81, 0xda, 0x0d, 0x2e, 0xf1, 0xb5, + 0x99, 0x4f, 0xad, 0xcd, 0x49, 0x31, 0x12, 0x05, 0x77, 0x3f, 0xe4, 0x2b, 0x52, 0xcd, 0xd4, 0xc2, + 0x27, 0x9f, 0xa9, 0xef, 0xc3, 0xd4, 0x1d, 0xb7, 0xe3, 0xee, 0xd2, 0x26, 0x6b, 0x01, 0xdf, 0x7b, + 0x26, 0x96, 0x9e, 0x7f, 0x7c, 0x58, 0x3e, 0xd9, 0xe6, 0x70, 0x6c, 0xa5, 0x3e, 0x89, 0x0c, 0x02, + 0x72, 0x55, 0xae, 0xec, 0xd1, 0x8c, 0x95, 0x3d, 0x2d, 0x6a, 0x1f, 0xc5, 0x95, 0x2d, 0xd6, 0xb3, + 0xf5, 0x9b, 0x13, 0xd8, 0x46, 0xf2, 0x3a, 0x8c, 0xd9, 0x74, 0x97, 0x1d, 0x35, 0xb9, 0x78, 0x90, + 0x02, 0x84, 0xe8, 0x1d, 0xc3, 0x71, 0x50, 0xce, 0xa0, 0xcd, 0x70, 0xcf, 0xdb, 0x89, 0x44, 0xef, + 0x28, 0x39, 0x43, 0x80, 0x35, 0x39, 0x43, 0x40, 0xcc, 0xeb, 0x2c, 0x87, 0xb1, 0xdd, 0xcf, 0xae, + 0xd6, 0x45, 0xa7, 0xc9, 0x1e, 0xb6, 0xab, 0xda, 0x36, 0x12, 0x18, 0x52, 0x02, 0xc3, 0x26, 0xd7, + 0x61, 0xa2, 0xd2, 0x68, 0xf8, 0x3d, 0xed, 0xce, 0xc8, 0xd7, 0x2d, 0x07, 0x9a, 0x2a, 0x92, 0x18, + 0x95, 0xd4, 0x61, 0x72, 0x85, 0x5d, 0xb4, 0xbc, 0x65, 0xb7, 0xb1, 0x27, 0x3b, 0x49, 0xee, 0x61, + 0x5a, 0x49, 0xbc, 0x72, 0x29, 0x02, 0x1b, 0x0c, 0xa8, 0x2b, 0x19, 0x34, 0x5c, 0xb2, 0x05, 0x93, + 0x75, 0xda, 0x08, 0x68, 0x54, 0x8f, 0xfc, 0x80, 0x26, 0xb6, 0x64, 0xad, 0x64, 0xe9, 0xac, 0xbc, + 0xeb, 0x85, 0x08, 0x74, 0x42, 0x06, 0xd5, 0xb9, 0x6a, 0xc8, 0x5c, 0x68, 0x6f, 0xfb, 0xc1, 0x41, + 0x75, 0x49, 0x6c, 0xd3, 0xf1, 0x99, 0xce, 0xc1, 0xba, 0xd0, 0xce, 0x20, 0xcd, 0x6d, 0x53, 0x68, + 0xe7, 0x58, 0x38, 0x52, 0xd5, 0x3a, 0xca, 0x56, 0x62, 0xd3, 0x9e, 0x8d, 0x7b, 0x19, 0xc1, 0xda, + 0x48, 0x35, 0x43, 0x94, 0xcc, 0x8c, 0x91, 0x12, 0x58, 0xa4, 0x0b, 0x44, 0x8e, 0x1a, 0x17, 0x74, + 0x5b, 0x34, 0x0c, 0xc5, 0x5e, 0x7e, 0x2a, 0x31, 0xf8, 0x31, 0xc2, 0xd2, 0xcb, 0x82, 0xf9, 0x19, + 0x39, 0x0d, 0xc4, 0x3d, 0x8d, 0x15, 0x6a, 0xf5, 0x64, 0xf0, 0x26, 0x6f, 0x01, 0xac, 0x3c, 0x8a, + 0x68, 0xd0, 0x71, 0x5b, 0x4a, 0x0f, 0x86, 0xaa, 0x1f, 0x2a, 0xa0, 0xe6, 0x40, 0x6b, 0xc8, 0x64, + 0x19, 0xa6, 0x2b, 0x61, 0xd8, 0x6b, 0x53, 0xdb, 0x6f, 0xd1, 0x8a, 0xbd, 0x8e, 0xfb, 0xfe, 0xc4, + 0xd2, 0x99, 0xc7, 0x87, 0xe5, 0x53, 0x2e, 0x16, 0x38, 0x81, 0xdf, 0xa2, 0x8e, 0x1b, 0xe8, 0xb3, + 0xdb, 0xa4, 0x21, 0x1b, 0x00, 0x1b, 0x5d, 0xda, 0xa9, 0x53, 0x37, 0x68, 0xec, 0x25, 0xb6, 0xf9, + 0xb8, 0x60, 0xe9, 0x05, 0xd1, 0xc2, 0x63, 0x7e, 0x97, 0x76, 0x42, 0x84, 0xe9, 0x5f, 0x15, 0x63, + 0x92, 0xfb, 0x30, 0x5b, 0xab, 0xdc, 0xd9, 0xf4, 0x5b, 0x5e, 0xe3, 0x40, 0x48, 0x4e, 0x33, 0xa8, + 0x1d, 0x3c, 0x21, 0xb8, 0x26, 0x4a, 0xf9, 0xf6, 0xe4, 0xb9, 0x6d, 0xa7, 0x8b, 0x50, 0x47, 0xc8, + 0x4f, 0x49, 0x2e, 0xe4, 0x43, 0x36, 0x07, 0x43, 0x26, 0x0c, 0x6e, 0xb9, 0xbb, 0xe1, 0xc2, 0xac, + 0xa1, 0xed, 0xaa, 0xdc, 0xaf, 0x5f, 0xd6, 0x4a, 0xb9, 0x98, 0x72, 0x9a, 0x4f, 0x44, 0x84, 0x3a, + 0x91, 0xbb, 0x1b, 0x9a, 0x13, 0x51, 0x61, 0x93, 0x5b, 0x00, 0x55, 0xbf, 0xd1, 0x6b, 0xd3, 0x4e, + 0x54, 0x5d, 0x5a, 0x28, 0x99, 0x57, 0x01, 0x55, 0x10, 0x6f, 0x6d, 0x4d, 0xbf, 0x61, 0xcc, 0x44, + 0x8d, 0xfa, 0xf4, 0x7b, 0x50, 0x4a, 0x7e, 0xc8, 0x13, 0x2a, 0xb0, 0xa6, 0x4b, 0x33, 0x5a, 0xeb, + 0x57, 0x1e, 0x79, 0x61, 0x14, 0x5a, 0xdf, 0x31, 0x56, 0x20, 0xdb, 0x1d, 0x6e, 0xd3, 0x83, 0xcd, + 0x80, 0xee, 0x78, 0x8f, 0xc4, 0x66, 0x86, 0xbb, 0xc3, 0x03, 0x7a, 0xe0, 0x74, 0x11, 0xaa, 0xef, + 0x0e, 0x0a, 0x95, 0x7c, 0x1e, 0x8a, 0xb7, 0xef, 0xd4, 0x6f, 0xd3, 0x83, 0x5a, 0x55, 0x1c, 0x54, + 0x9c, 0xac, 0x1d, 0x3a, 0x8c, 0xd4, 0x98, 0x6b, 0x0a, 0xd3, 0x5a, 0x8a, 0x77, 0x42, 0x56, 0xf3, + 0x72, 0xab, 0x17, 0x46, 0x34, 0xa8, 0x55, 0xf5, 0x9a, 0x1b, 0x1c, 0x98, 0xd8, 0x97, 0x14, 0xaa, + 0xf5, 0x2f, 0xf3, 0xb8, 0x0b, 0xb2, 0x09, 0x5f, 0xeb, 0x84, 0x91, 0xdb, 0x69, 0x50, 0xc5, 0x00, + 0x27, 0xbc, 0x27, 0xa0, 0x89, 0x09, 0x1f, 0x23, 0x9b, 0x55, 0xe7, 0x87, 0xae, 0x9a, 0x55, 0x29, + 0x35, 0x17, 0xb5, 0xaa, 0xae, 0x5e, 0x0d, 0x04, 0x34, 0x51, 0x65, 0x8c, 0x4c, 0x2e, 0xc0, 0x78, + 0xad, 0x72, 0xa7, 0xd2, 0x8b, 0xf6, 0x70, 0x0f, 0x2e, 0x72, 0xf9, 0x9c, 0xcd, 0x56, 0xb7, 0x17, + 0xed, 0xd9, 0xb2, 0x90, 0x5c, 0xc1, 0x7b, 0x4f, 0x87, 0x46, 0x5c, 0x0d, 0x2b, 0x0e, 0xdd, 0x90, + 0x83, 0x12, 0xd7, 0x1e, 0x06, 0x22, 0xaf, 0xc2, 0xe8, 0xbd, 0xcd, 0xe5, 0x5a, 0x55, 0x5c, 0x9c, + 0xf1, 0x24, 0x7a, 0xd8, 0x6d, 0x98, 0x5f, 0xc2, 0x51, 0xc8, 0x0a, 0xcc, 0xd4, 0x69, 0xa3, 0x17, + 0x78, 0xd1, 0xc1, 0xcd, 0xc0, 0xef, 0x75, 0xc3, 0x85, 0x71, 0xac, 0x03, 0x57, 0x7a, 0x28, 0x4a, + 0x9c, 0x5d, 0x2c, 0xd2, 0xa8, 0x13, 0x44, 0xd6, 0x6f, 0xe5, 0xe2, 0x6d, 0x92, 0x5c, 0x30, 0xc4, + 0x1a, 0xd4, 0xdd, 0x30, 0xb1, 0x46, 0xd7, 0xdd, 0xa0, 0x80, 0x63, 0x03, 0x59, 0xee, 0x85, 0x91, + 0xdf, 0x5e, 0xe9, 0x34, 0xbb, 0xbe, 0xd7, 0x89, 0x90, 0x8a, 0x77, 0xbe, 0xf5, 0xf8, 0xb0, 0x7c, + 0xb6, 0x81, 0xa5, 0x0e, 0x15, 0xc5, 0x4e, 0x82, 0x4b, 0x06, 0xf5, 0xa7, 0x18, 0x0f, 0xeb, 0x77, + 0xf3, 0xc6, 0xf1, 0xc6, 0x3e, 0xcf, 0xa6, 0xdd, 0x96, 0xd7, 0xc0, 0x1b, 0x3d, 0x36, 0x54, 0xcd, + 0x2a, 0xfc, 0xbc, 0x20, 0x2e, 0xe5, 0x3d, 0x64, 0xf2, 0xce, 0xa0, 0x26, 0x1f, 0xc0, 0x14, 0x93, + 0x34, 0xc4, 0xcf, 0x70, 0x21, 0x8f, 0x9d, 0xfd, 0x02, 0x6a, 0xe1, 0x42, 0x1a, 0x28, 0x36, 0x86, + 0x88, 0xa2, 0x53, 0x90, 0x26, 0x2c, 0x6c, 0x05, 0x6e, 0x27, 0xf4, 0xa2, 0x95, 0x4e, 0x23, 0x38, + 0x40, 0xc9, 0x68, 0xa5, 0xe3, 0x6e, 0xb7, 0x68, 0x13, 0x9b, 0x5b, 0x5c, 0xba, 0xf8, 0xf8, 0xb0, + 0xfc, 0x52, 0xc4, 0x71, 0x1c, 0xaa, 0x90, 0x1c, 0xca, 0xb1, 0x34, 0xce, 0x7d, 0x39, 0x31, 0x49, + 0x4a, 0x76, 0x2b, 0x3e, 0xc2, 0x70, 0x21, 0x01, 0x25, 0x29, 0x35, 0x1a, 0x6c, 0x0f, 0xd3, 0x3f, + 0x53, 0x27, 0xb0, 0xfe, 0x79, 0x2e, 0x3e, 0x80, 0xc9, 0x3b, 0x30, 0x29, 0x56, 0x8c, 0x36, 0x2f, + 0x70, 0x07, 0x95, 0xcb, 0x2b, 0x31, 0xb2, 0x3a, 0x3a, 0xbb, 0xf7, 0x57, 0x96, 0xd7, 0xb4, 0xb9, + 0x81, 0xf7, 0x7e, 0xb7, 0xd1, 0x4a, 0x52, 0x49, 0x34, 0x36, 0x09, 0xb6, 0xd6, 0xea, 0x66, 0xaf, + 0xe0, 0x24, 0x88, 0x5a, 0x61, 0x46, 0x37, 0x68, 0xc8, 0x9f, 0xbe, 0xe1, 0xff, 0x63, 0x2e, 0xeb, + 0x9c, 0x27, 0x4b, 0x30, 0x7d, 0xdf, 0x0f, 0x1e, 0xe0, 0xf8, 0x6a, 0x9d, 0x80, 0x23, 0xbf, 0x2f, + 0x0b, 0x92, 0x0d, 0x32, 0x49, 0xf4, 0x6f, 0xd3, 0x7a, 0xc3, 0xfc, 0xb6, 0x04, 0x07, 0x83, 0x80, + 0x8d, 0x83, 0xe2, 0xa8, 0x56, 0x07, 0x8e, 0x43, 0xfc, 0x09, 0xc6, 0x14, 0xd6, 0xd1, 0xad, 0xff, + 0x32, 0xa7, 0x9f, 0xe7, 0xac, 0x93, 0xab, 0x7e, 0xdb, 0xf5, 0x3a, 0x5a, 0x73, 0xf8, 0xc3, 0x12, + 0x42, 0x93, 0x5f, 0xa2, 0x21, 0x93, 0x6b, 0x50, 0xe4, 0xbf, 0xd4, 0x5e, 0x8b, 0x5a, 0x2d, 0x41, + 0x68, 0x1e, 0x14, 0x12, 0x31, 0x35, 0x32, 0x85, 0x27, 0x1d, 0x99, 0xdf, 0xcc, 0xe9, 0x47, 0xf1, + 0x27, 0x3d, 0x6c, 0x12, 0x87, 0x4c, 0xfe, 0x49, 0x0e, 0x99, 0x4f, 0xdd, 0x84, 0x1f, 0xcd, 0xc1, + 0xa4, 0xa6, 0xa5, 0x60, 0x6d, 0xd8, 0x0c, 0xfc, 0x8f, 0x68, 0x23, 0x32, 0xdb, 0xd0, 0xe5, 0xc0, + 0x44, 0x1b, 0x14, 0xea, 0xa7, 0x68, 0x83, 0xf5, 0x4f, 0x73, 0xe2, 0x8e, 0x34, 0xf4, 0x36, 0x6f, + 0x6e, 0xc9, 0xf9, 0x27, 0x39, 0x22, 0x3f, 0x80, 0x51, 0x9b, 0x36, 0xbd, 0x50, 0xdc, 0x6f, 0xe6, + 0xf4, 0xfb, 0x18, 0x16, 0xc4, 0x72, 0x53, 0xc0, 0x7e, 0xea, 0xe7, 0x1b, 0x96, 0x33, 0x41, 0xb6, + 0x16, 0xde, 0x68, 0xd1, 0x47, 0x1e, 0x5f, 0x8c, 0xe2, 0xa8, 0xc5, 0xe3, 0xcd, 0x0b, 0x9d, 0x1d, + 0x56, 0x22, 0x24, 0x6a, 0x7d, 0xe1, 0x19, 0x34, 0xd6, 0x87, 0x00, 0x71, 0x95, 0xe4, 0x36, 0x94, + 0xc4, 0x6c, 0xf0, 0x3a, 0xbb, 0x5c, 0x90, 0x12, 0x7d, 0x50, 0x7e, 0x7c, 0x58, 0x7e, 0xbe, 0xa1, + 0xca, 0x84, 0xd4, 0xa9, 0xf1, 0x4d, 0x11, 0x5a, 0xff, 0x61, 0x1e, 0xf2, 0x15, 0x1c, 0x90, 0xdb, + 0xf4, 0x20, 0x72, 0xb7, 0x6f, 0x78, 0x2d, 0x63, 0x31, 0x3d, 0x40, 0xa8, 0xb3, 0xe3, 0x19, 0xea, + 0x0a, 0x0d, 0x99, 0x2d, 0xa6, 0xdb, 0xc1, 0xf6, 0x9b, 0x48, 0xa8, 0x2d, 0xa6, 0x07, 0xc1, 0xf6, + 0x9b, 0x49, 0x32, 0x85, 0x48, 0x2c, 0x18, 0xe3, 0x0b, 0x4b, 0xcc, 0x41, 0x78, 0x7c, 0x58, 0x1e, + 0xe3, 0xeb, 0xcf, 0x16, 0x25, 0xe4, 0x14, 0x14, 0xea, 0x9b, 0xeb, 0x62, 0x07, 0x44, 0xb5, 0x60, + 0xd8, 0xed, 0xd8, 0x0c, 0xc6, 0xea, 0x5c, 0xab, 0x56, 0x36, 0x51, 0x11, 0x30, 0x1a, 0xd7, 0xd9, + 0x6a, 0xba, 0xdd, 0xa4, 0x2a, 0x40, 0x21, 0x92, 0x77, 0x61, 0xf2, 0x76, 0x75, 0x79, 0xd5, 0x0f, + 0xf9, 0xee, 0x35, 0x16, 0x4f, 0xfe, 0x07, 0xcd, 0x86, 0x83, 0x9a, 0xf8, 0xe4, 0x31, 0xa0, 0xe1, + 0x5b, 0xdf, 0xcd, 0xc3, 0xa4, 0xa6, 0x27, 0x23, 0x9f, 0x17, 0x0f, 0xa4, 0x39, 0xe3, 0x06, 0xa0, + 0x61, 0xb0, 0x52, 0xae, 0x54, 0x69, 0xfb, 0x4d, 0x2a, 0x9e, 0x4b, 0x63, 0x05, 0x46, 0x7e, 0x18, + 0x05, 0xc6, 0x5b, 0x00, 0x7c, 0x0e, 0xe0, 0x27, 0x6b, 0xe2, 0x84, 0x66, 0x27, 0xa1, 0x8f, 0x4b, + 0x8c, 0x4c, 0xee, 0xc1, 0xfc, 0x56, 0xd0, 0x0b, 0xa3, 0xfa, 0x41, 0x18, 0xd1, 0x36, 0xe3, 0xb6, + 0xe9, 0xfb, 0x2d, 0x31, 0xff, 0x5e, 0x7a, 0x7c, 0x58, 0x3e, 0x17, 0xb1, 0x62, 0x27, 0xc4, 0x72, + 0xfc, 0x00, 0xa7, 0xeb, 0xfb, 0xba, 0x5a, 0x23, 0x8b, 0x81, 0x65, 0xc3, 0x94, 0xae, 0x14, 0x61, + 0x27, 0x8b, 0x78, 0x4c, 0x12, 0xaa, 0x6e, 0xed, 0x64, 0x11, 0x5f, 0x99, 0x7e, 0xdc, 0x32, 0x49, + 0xac, 0xcf, 0xeb, 0x0a, 0xb9, 0x61, 0x17, 0xb6, 0xf5, 0xe3, 0xb9, 0x78, 0x1b, 0xb9, 0x77, 0x95, + 0xbc, 0x0d, 0x63, 0xfc, 0xf1, 0x4e, 0xbc, 0x71, 0x1e, 0x57, 0x97, 0x5a, 0xfd, 0x65, 0x8f, 0x6b, + 0xc2, 0x7f, 0x8f, 0x3f, 0xf0, 0x3f, 0x67, 0x0b, 0x12, 0xa5, 0x44, 0x37, 0xf5, 0x69, 0x92, 0x3b, + 0xaa, 0x8b, 0xaf, 0x66, 0x29, 0xd1, 0xad, 0xdf, 0x1e, 0x81, 0x19, 0x13, 0x4d, 0x7f, 0xe1, 0xcb, + 0x0d, 0xf5, 0xc2, 0xf7, 0x01, 0x14, 0x59, 0x7f, 0x78, 0x0d, 0x2a, 0x25, 0xb2, 0x97, 0xf0, 0x69, + 0x41, 0xc0, 0x8c, 0x97, 0x6b, 0xe0, 0xc3, 0xc1, 0xee, 0xb8, 0xb6, 0xa2, 0x22, 0x8b, 0xda, 0x33, + 0x54, 0x21, 0x16, 0x52, 0xe4, 0x33, 0x94, 0xbe, 0x1e, 0xd4, 0x83, 0xd4, 0x1b, 0x30, 0xc6, 0xe4, + 0x7b, 0xa5, 0x82, 0xc1, 0xaf, 0x64, 0xa2, 0x7f, 0xc2, 0x44, 0x85, 0x23, 0x91, 0xfb, 0x50, 0x5c, + 0x73, 0xc3, 0xa8, 0x4e, 0x69, 0x67, 0x88, 0xb7, 0xfb, 0xb2, 0xe8, 0xaa, 0x79, 0x7c, 0x18, 0x0f, + 0x29, 0xed, 0x24, 0x1e, 0x5f, 0x15, 0x33, 0xf2, 0x75, 0x80, 0x65, 0xbf, 0x13, 0x05, 0x7e, 0x6b, + 0xcd, 0xdf, 0x5d, 0x18, 0xc3, 0xbb, 0xef, 0xd9, 0xc4, 0x00, 0xc4, 0x08, 0xfc, 0xfa, 0xab, 0x14, + 0x3c, 0x0d, 0x5e, 0xe0, 0xb4, 0xfc, 0x5d, 0x7d, 0x1d, 0xc4, 0xf8, 0xe4, 0x06, 0x94, 0xa4, 0x62, + 0xe1, 0x6e, 0x77, 0x37, 0xc0, 0x09, 0x32, 0x1e, 0x4b, 0x1e, 0xf4, 0x51, 0xe4, 0xf4, 0x04, 0x5c, + 0xdf, 0x29, 0x93, 0x34, 0xe4, 0x6b, 0x70, 0x32, 0x09, 0x93, 0xa3, 0x5c, 0x8c, 0x65, 0x72, 0x9d, + 0x5d, 0xc6, 0xbc, 0xef, 0xc7, 0xc2, 0xfa, 0x38, 0x0f, 0x27, 0xfb, 0x34, 0x96, 0xad, 0x07, 0x3c, + 0xae, 0xb5, 0xf5, 0x90, 0x38, 0xa5, 0xb9, 0xcd, 0xd1, 0x39, 0xc8, 0x8b, 0x03, 0x6e, 0x64, 0xa9, + 0xf4, 0xf8, 0xb0, 0x3c, 0x65, 0x8c, 0x63, 0xbe, 0x56, 0x25, 0xb7, 0x60, 0x84, 0x0d, 0xd1, 0x10, + 0x4f, 0xe7, 0x52, 0xa7, 0x34, 0x13, 0x79, 0xfa, 0xf4, 0xc1, 0xa1, 0x43, 0x1e, 0xe4, 0xf3, 0x50, + 0xd8, 0xda, 0x5a, 0xc3, 0xb9, 0x53, 0xc0, 0xb6, 0x4f, 0x47, 0x51, 0xcb, 0x98, 0xaa, 0xd3, 0x8c, + 0xf6, 0xb2, 0xb2, 0xb4, 0x60, 0xe8, 0xe4, 0x2b, 0x09, 0x93, 0x9e, 0x57, 0x07, 0x0f, 0xf4, 0xf0, + 0x16, 0x3e, 0x9f, 0xc2, 0xb0, 0xc6, 0xfa, 0xf9, 0x7c, 0xbc, 0x86, 0x6f, 0x78, 0xad, 0x88, 0x06, + 0xe4, 0x34, 0x5f, 0x92, 0xb1, 0x70, 0x66, 0xab, 0xdf, 0x64, 0x21, 0x5e, 0xdf, 0x9c, 0x95, 0x5a, + 0xc8, 0xaf, 0x6a, 0x0b, 0xb9, 0x80, 0x0b, 0x79, 0xa6, 0xef, 0x92, 0x7d, 0x35, 0x63, 0x5e, 0xe2, + 0x42, 0xcc, 0x98, 0x7b, 0x2f, 0xc1, 0xf4, 0xba, 0xbf, 0xf2, 0x28, 0x52, 0x88, 0x6c, 0x01, 0x16, + 0x6d, 0x13, 0xc8, 0x38, 0x6e, 0xb4, 0x9a, 0x34, 0xd8, 0xda, 0x73, 0x3b, 0xc6, 0xdb, 0xb5, 0x9d, + 0x82, 0x33, 0xdc, 0x75, 0xba, 0x6f, 0xe2, 0x8e, 0x73, 0xdc, 0x24, 0xdc, 0xfa, 0xb1, 0xbc, 0xec, + 0x8c, 0x7b, 0x8b, 0xcf, 0xe8, 0x1b, 0xe9, 0x9b, 0xc6, 0x1b, 0xe9, 0xbc, 0xd2, 0xee, 0xaa, 0x07, + 0xff, 0xc5, 0x23, 0xec, 0x04, 0xfe, 0xa7, 0x51, 0x98, 0xd2, 0xd1, 0x59, 0x3f, 0x54, 0x9a, 0xcd, + 0x40, 0xef, 0x07, 0xb7, 0xd9, 0x0c, 0x6c, 0x84, 0x1a, 0x66, 0x01, 0x85, 0x81, 0x66, 0x01, 0xdf, + 0x80, 0x89, 0xe5, 0x76, 0xd3, 0x78, 0xac, 0xb4, 0x32, 0x3e, 0xef, 0xb2, 0x42, 0xe2, 0x6b, 0x41, + 0x29, 0x2d, 0x1b, 0xed, 0x66, 0xfa, 0x89, 0x32, 0x66, 0x69, 0x58, 0x14, 0x8c, 0x7e, 0x1a, 0x8b, + 0x82, 0xeb, 0x30, 0x71, 0x37, 0xa4, 0x5b, 0xbd, 0x4e, 0x87, 0xb6, 0x70, 0x5a, 0x15, 0xb9, 0xac, + 0xdf, 0x0b, 0xa9, 0x13, 0x21, 0x54, 0xff, 0x00, 0x85, 0xaa, 0x0f, 0xf0, 0xf8, 0x80, 0x01, 0xbe, + 0x06, 0xc5, 0x4d, 0x4a, 0x03, 0xec, 0xd3, 0xc9, 0x58, 0xa4, 0xeb, 0x52, 0x1a, 0x38, 0xac, 0x63, + 0x0d, 0x4b, 0x03, 0x81, 0x68, 0x98, 0x27, 0x4c, 0x0d, 0x69, 0x9e, 0x40, 0x5e, 0x84, 0xa9, 0x6e, + 0x6f, 0xbb, 0xe5, 0x35, 0x90, 0xaf, 0xb0, 0x6b, 0xb0, 0x27, 0x39, 0x8c, 0xb1, 0x0d, 0xc9, 0x57, + 0x60, 0x1a, 0xef, 0x38, 0x6a, 0xca, 0xcd, 0x18, 0xaf, 0x7a, 0x46, 0x19, 0x97, 0x74, 0x1a, 0x0c, + 0xe4, 0x64, 0x98, 0xdf, 0x98, 0x8c, 0x4e, 0xd7, 0x61, 0xc6, 0x1c, 0xc9, 0xa7, 0xf0, 0xb8, 0xa7, + 0x4c, 0x2d, 0x8a, 0xa5, 0x89, 0x5b, 0x23, 0x45, 0x28, 0x4d, 0x72, 0x23, 0x0b, 0x1b, 0x36, 0x55, + 0x9b, 0x6c, 0x72, 0xbb, 0xb7, 0x4d, 0x83, 0x0e, 0x8d, 0x68, 0x28, 0x2e, 0x01, 0xa1, 0x3d, 0x52, + 0xe9, 0x76, 0x43, 0xeb, 0xef, 0xe5, 0x61, 0xbc, 0x72, 0xbf, 0x5e, 0xeb, 0xec, 0xf8, 0xf8, 0x44, + 0xa7, 0x5e, 0x66, 0xf4, 0x27, 0x3a, 0xf5, 0x32, 0xa3, 0xbf, 0xc7, 0x5c, 0xc9, 0xb8, 0xc6, 0xa1, + 0x15, 0xaf, 0x76, 0x8d, 0x33, 0x2e, 0xa0, 0xf1, 0x23, 0x55, 0x61, 0x88, 0x47, 0x2a, 0xa5, 0x47, + 0x1c, 0x39, 0x5a, 0x8f, 0xf8, 0x36, 0x4c, 0xd6, 0x3a, 0x11, 0xdd, 0x0d, 0xe2, 0x99, 0xae, 0xae, + 0x94, 0x0a, 0xac, 0x8b, 0xf6, 0x1a, 0x36, 0x9b, 0x46, 0x5c, 0x77, 0xa9, 0x74, 0x96, 0x38, 0x8d, + 0xb8, 0x8a, 0x33, 0xa1, 0x0f, 0x90, 0x88, 0x56, 0x35, 0x31, 0x47, 0xa4, 0x21, 0x00, 0x17, 0x3e, + 0x67, 0x62, 0xe5, 0x3d, 0xeb, 0xd8, 0xa5, 0xb9, 0x6c, 0x43, 0x00, 0xeb, 0x7b, 0x79, 0x98, 0xac, + 0x74, 0xbb, 0xcf, 0xb8, 0x39, 0xd6, 0x17, 0x8d, 0xed, 0x55, 0xde, 0x85, 0x54, 0xbb, 0x86, 0xb2, + 0xc4, 0xfa, 0x95, 0x3c, 0xcc, 0x26, 0x28, 0xf4, 0xaf, 0xcf, 0x0d, 0x69, 0x84, 0x95, 0x1f, 0xd2, + 0x08, 0xab, 0x30, 0x9c, 0x11, 0xd6, 0xc8, 0xa7, 0xd9, 0x32, 0x5f, 0x81, 0x42, 0xa5, 0xdb, 0x4d, + 0x3e, 0xe6, 0x76, 0xbb, 0xf7, 0xae, 0xf1, 0xfb, 0xac, 0xdb, 0xed, 0xda, 0x0c, 0xc3, 0xd8, 0xc7, + 0xc6, 0x86, 0xdc, 0xc7, 0xac, 0x37, 0x60, 0x02, 0x79, 0xa1, 0xe9, 0xd3, 0x39, 0xc0, 0xc5, 0x2c, + 0xac, 0x9e, 0x8c, 0xba, 0xc4, 0x32, 0xff, 0xff, 0x72, 0x30, 0x8a, 0xbf, 0x9f, 0xd1, 0x39, 0xb6, + 0x68, 0xcc, 0xb1, 0x92, 0x36, 0xc7, 0x86, 0x99, 0x5d, 0x7f, 0xa7, 0x00, 0xb0, 0xbc, 0x61, 0xd7, + 0xb9, 0xda, 0x83, 0xdc, 0x80, 0x59, 0xb7, 0xd5, 0xf2, 0xf7, 0x69, 0xd3, 0xf1, 0x03, 0x6f, 0xd7, + 0xeb, 0xf0, 0x9e, 0x93, 0x2f, 0x8c, 0x66, 0x91, 0xfe, 0xee, 0x20, 0x8a, 0x36, 0x78, 0x89, 0xce, + 0xa7, 0x4d, 0xa3, 0x3d, 0xbf, 0x29, 0x2f, 0x70, 0x06, 0x1f, 0x51, 0x94, 0xc1, 0xe7, 0x0e, 0x2f, + 0xd1, 0xf9, 0xec, 0xe1, 0x85, 0x54, 0xca, 0x8f, 0x06, 0x1f, 0x51, 0x94, 0xc1, 0x87, 0xdf, 0x62, + 0x43, 0xb2, 0x06, 0x73, 0x08, 0x71, 0x1a, 0x01, 0x6d, 0xd2, 0x4e, 0xe4, 0xb9, 0xad, 0x50, 0x5c, + 0xf9, 0x51, 0x39, 0x94, 0x2a, 0xd4, 0xaf, 0x3c, 0x58, 0xb8, 0x1c, 0x97, 0x91, 0xcb, 0x30, 0xde, + 0x76, 0x1f, 0x39, 0xee, 0x2e, 0x7f, 0x6b, 0x9f, 0xe6, 0x57, 0x44, 0x01, 0xd2, 0x37, 0xec, 0xb6, + 0xfb, 0xa8, 0xb2, 0x4b, 0x59, 0x2b, 0xe8, 0xa3, 0xae, 0x1f, 0x6a, 0xad, 0x18, 0x8b, 0x5b, 0x91, + 0x28, 0xd2, 0x5b, 0x21, 0x8a, 0x44, 0x2b, 0xac, 0xff, 0x67, 0x14, 0xa7, 0xb6, 0xd8, 0x04, 0x84, + 0x79, 0x58, 0x2e, 0xc3, 0x3c, 0xec, 0x2d, 0xd0, 0x8e, 0x38, 0x5d, 0xb5, 0xa7, 0x1d, 0xf0, 0xfa, + 0xb5, 0x30, 0x46, 0x26, 0x0f, 0x92, 0x86, 0x62, 0x05, 0x5c, 0x39, 0xe7, 0x93, 0xf3, 0xea, 0xa9, + 0xd8, 0x88, 0xad, 0x02, 0xa9, 0x75, 0xf0, 0x35, 0x8b, 0xd6, 0x1f, 0x78, 0xdd, 0x7b, 0x34, 0xf0, + 0x76, 0x0e, 0xc4, 0xb8, 0xa0, 0x10, 0xe5, 0x89, 0x52, 0x27, 0x7c, 0xe0, 0x75, 0xd9, 0xbd, 0xd1, + 0xdb, 0x39, 0xb0, 0x33, 0x68, 0xc8, 0xfb, 0x30, 0x6e, 0xd3, 0xfd, 0xc0, 0x8b, 0xa4, 0xf9, 0xc3, + 0x8c, 0xd2, 0x72, 0x20, 0x94, 0x0f, 0x51, 0xc0, 0x7f, 0xe8, 0x8b, 0x55, 0x94, 0x93, 0x45, 0x7e, + 0x4a, 0x71, 0x33, 0x87, 0xe9, 0xb8, 0xb5, 0x95, 0xfb, 0xf5, 0x7e, 0x87, 0x14, 0xb9, 0x04, 0xa3, + 0x78, 0xd4, 0x09, 0x01, 0x0e, 0xdd, 0x06, 0x50, 0xe0, 0xd1, 0xcf, 0x61, 0xc4, 0x20, 0x67, 0x01, + 0xd4, 0x73, 0x51, 0xb8, 0x50, 0x44, 0xd1, 0x4a, 0x83, 0x24, 0xcf, 0xe9, 0x89, 0x27, 0x3a, 0xa7, + 0xd7, 0xa0, 0x64, 0xd3, 0x6f, 0xf5, 0xbc, 0x80, 0x36, 0x2b, 0x5d, 0x7c, 0x93, 0x08, 0x17, 0x00, + 0x27, 0xd8, 0xb9, 0xc7, 0x87, 0xe5, 0x17, 0x02, 0x51, 0xe6, 0xb8, 0x5d, 0xfe, 0x94, 0x61, 0xcc, + 0xee, 0x24, 0x25, 0x79, 0x0b, 0x46, 0xd8, 0x8e, 0x20, 0x4c, 0xca, 0xa4, 0x6e, 0x37, 0xde, 0x24, + 0xf8, 0x4d, 0xbb, 0xe1, 0x1b, 0x53, 0x15, 0x49, 0x3e, 0x3b, 0x33, 0xad, 0x5f, 0xc9, 0xc3, 0x79, + 0x75, 0x08, 0x6e, 0x04, 0xf5, 0xca, 0x9d, 0xb5, 0x5a, 0x73, 0x53, 0xdc, 0x19, 0x37, 0x03, 0xff, + 0xa1, 0xd7, 0xa4, 0xc1, 0xbd, 0xab, 0x47, 0x6c, 0xe1, 0x6b, 0x7c, 0xf9, 0x70, 0x85, 0x73, 0xde, + 0x30, 0x68, 0xd1, 0x64, 0x0d, 0x61, 0x73, 0xd3, 0xed, 0xa6, 0xf4, 0xcf, 0xab, 0xcf, 0xd9, 0x31, + 0x03, 0xf2, 0xe3, 0x39, 0x38, 0x91, 0xfd, 0x21, 0x42, 0x8f, 0x50, 0x96, 0xf7, 0x95, 0x3e, 0x5f, + 0xbb, 0xf4, 0xca, 0xe3, 0xc3, 0xf2, 0xf9, 0xd0, 0x6d, 0xb7, 0x1c, 0xaf, 0xc9, 0x6b, 0xf3, 0x1a, + 0xd4, 0xe9, 0x0a, 0x04, 0xa3, 0xde, 0x3e, 0x35, 0x7d, 0x09, 0xe4, 0x4e, 0xbe, 0x90, 0x5b, 0x02, + 0x28, 0x4a, 0x9d, 0x9e, 0xf5, 0xf7, 0x73, 0xa0, 0x4d, 0xed, 0xa2, 0x4d, 0x9b, 0x5e, 0x40, 0x1b, + 0x91, 0xd8, 0xcd, 0x85, 0x3b, 0x0e, 0x87, 0x25, 0xec, 0x97, 0x10, 0x46, 0xde, 0x83, 0x71, 0xb1, + 0xeb, 0xe0, 0xc6, 0x1d, 0x2f, 0x09, 0xa1, 0x2d, 0xe4, 0x7e, 0x5b, 0xa9, 0x1d, 0x4b, 0x12, 0xb1, + 0x5b, 0xd1, 0xad, 0xfb, 0x5b, 0xcb, 0x2d, 0xd7, 0x6b, 0x87, 0xe2, 0xf4, 0xc3, 0x6e, 0xfd, 0x68, + 0x3f, 0x72, 0x1a, 0x08, 0xd5, 0x6f, 0x45, 0x0a, 0xd5, 0xba, 0x29, 0x95, 0x95, 0x47, 0x18, 0xe1, + 0x95, 0x61, 0xf4, 0x5e, 0xac, 0xb4, 0x58, 0x9a, 0x78, 0x7c, 0x58, 0xe6, 0xd3, 0xc5, 0xe6, 0x70, + 0xeb, 0x2f, 0xe7, 0x60, 0xc6, 0x9c, 0x4f, 0xe4, 0x32, 0x8c, 0x09, 0x57, 0x98, 0x1c, 0x2a, 0x67, + 0x58, 0x2f, 0x8c, 0x71, 0x27, 0x18, 0xc3, 0xf5, 0x45, 0x60, 0xb1, 0xf3, 0x5b, 0x70, 0x10, 0x87, + 0x17, 0x9e, 0xdf, 0x0d, 0x0e, 0xb2, 0x65, 0x19, 0xb1, 0x98, 0xf0, 0x1e, 0xf6, 0x5a, 0x91, 0xae, + 0xb3, 0x0f, 0x10, 0x62, 0x8b, 0x12, 0x6b, 0x19, 0xc6, 0xf8, 0x5e, 0x92, 0x30, 0xfe, 0xc9, 0x3d, + 0x81, 0xf1, 0x8f, 0x75, 0x98, 0x03, 0xa8, 0xd7, 0x57, 0x6f, 0xd3, 0x83, 0x4d, 0xd7, 0x0b, 0xf0, + 0x91, 0x09, 0xf7, 0xed, 0xdb, 0x62, 0x71, 0x4d, 0x89, 0x47, 0x26, 0xbe, 0xc7, 0x3f, 0xa0, 0x07, + 0xc6, 0x23, 0x93, 0x44, 0xc5, 0xc3, 0x21, 0xf0, 0x1e, 0xba, 0x11, 0x65, 0x84, 0x79, 0x24, 0xe4, + 0x87, 0x03, 0x87, 0x26, 0x28, 0x35, 0x64, 0xf2, 0x75, 0x98, 0x89, 0x7f, 0xa9, 0xa7, 0xb2, 0x19, + 0xb5, 0x80, 0xcd, 0xc2, 0xa5, 0xb3, 0x8f, 0x0f, 0xcb, 0xa7, 0x35, 0xae, 0xc9, 0x47, 0xb4, 0x04, + 0x33, 0xeb, 0x97, 0x72, 0xf8, 0x40, 0x2c, 0x1b, 0x78, 0x01, 0x46, 0x94, 0x49, 0xe3, 0x94, 0xd8, + 0x75, 0xcc, 0xe7, 0x00, 0x2c, 0x27, 0xe7, 0xa1, 0x10, 0xb7, 0x04, 0xf7, 0x6a, 0xb3, 0x05, 0xac, + 0x94, 0xdc, 0x84, 0xf1, 0xa1, 0xbe, 0x19, 0x97, 0x46, 0xc6, 0xb7, 0x4a, 0x6a, 0x1c, 0x85, 0x5b, + 0xf7, 0xb7, 0x7e, 0x78, 0x47, 0xe1, 0x27, 0xf3, 0x30, 0xcb, 0xfa, 0xb5, 0xd2, 0x8b, 0xf6, 0xfc, + 0xc0, 0x8b, 0x0e, 0x9e, 0x59, 0xed, 0xd6, 0x3b, 0x86, 0x68, 0x7c, 0x5a, 0x9e, 0x32, 0x7a, 0xdb, + 0x86, 0x52, 0x72, 0xfd, 0xce, 0x28, 0xcc, 0x67, 0x50, 0x91, 0xd7, 0x0d, 0x05, 0xf4, 0x82, 0x74, + 0x75, 0xfd, 0xf8, 0xb0, 0x3c, 0x25, 0xd1, 0xb7, 0x62, 0xd7, 0xd7, 0x45, 0xd3, 0xda, 0x82, 0xf7, + 0x14, 0xea, 0xa3, 0x75, 0x6b, 0x0b, 0xd3, 0xc6, 0xe2, 0x12, 0x8c, 0xda, 0x7e, 0x8b, 0x4a, 0x0b, + 0x23, 0x94, 0x30, 0x02, 0x06, 0x30, 0x5e, 0x54, 0x19, 0x80, 0xac, 0xc2, 0x38, 0xfb, 0xe3, 0x8e, + 0xdb, 0x15, 0x6f, 0x05, 0x44, 0x5d, 0xce, 0x10, 0xda, 0xf5, 0x3a, 0xbb, 0xfa, 0xfd, 0xac, 0x45, + 0x9d, 0xb6, 0xdb, 0x35, 0x44, 0x21, 0x8e, 0x68, 0xdc, 0xf3, 0x8a, 0xfd, 0xef, 0x79, 0xb9, 0x23, + 0xef, 0x79, 0x4d, 0x80, 0xba, 0xb7, 0xdb, 0xf1, 0x3a, 0xbb, 0x95, 0xd6, 0xae, 0x70, 0x18, 0xbe, + 0xd4, 0x7f, 0x14, 0x2e, 0xc7, 0xc8, 0x38, 0x71, 0xf9, 0x83, 0x1e, 0x87, 0x39, 0x6e, 0xcb, 0x78, + 0xc8, 0x88, 0x51, 0xc9, 0x3a, 0x40, 0xa5, 0x11, 0x79, 0x0f, 0xd9, 0x04, 0x0e, 0x85, 0xd4, 0x22, + 0x3f, 0x78, 0xb9, 0x72, 0x9b, 0x1e, 0xd4, 0x69, 0x14, 0x3f, 0x8c, 0xb8, 0x88, 0xca, 0xd6, 0x81, + 0x61, 0xb3, 0x1e, 0x73, 0x20, 0x5d, 0x38, 0x5e, 0x69, 0x36, 0x3d, 0xd6, 0x02, 0xb7, 0x85, 0x2f, + 0x7d, 0xb4, 0x89, 0xac, 0xa7, 0xb2, 0x59, 0x5f, 0x12, 0xac, 0x5f, 0x74, 0x15, 0x95, 0x13, 0x71, + 0xb2, 0x64, 0x35, 0xd9, 0x8c, 0xad, 0x0d, 0x98, 0x31, 0x9b, 0x6e, 0xba, 0x39, 0x4f, 0x41, 0xd1, + 0xae, 0x57, 0x9c, 0xfa, 0x6a, 0xe5, 0x6a, 0x29, 0x47, 0x4a, 0x30, 0x25, 0x7e, 0x2d, 0x3a, 0x8b, + 0x6f, 0x5e, 0x2f, 0xe5, 0x0d, 0xc8, 0x9b, 0x57, 0x17, 0x53, 0xde, 0x45, 0xe3, 0xa5, 0x22, 0x57, + 0x7f, 0x59, 0xbf, 0x9a, 0x83, 0xa2, 0xfc, 0x6e, 0x72, 0x1d, 0x0a, 0xf5, 0xfa, 0x6a, 0xc2, 0x1f, + 0x28, 0x3e, 0x5f, 0xf8, 0x4e, 0x1a, 0x86, 0xba, 0xd1, 0x27, 0x23, 0x60, 0x74, 0x5b, 0x6b, 0x75, + 0x21, 0x16, 0x48, 0xba, 0x78, 0xdb, 0xe6, 0x74, 0x19, 0x4e, 0x12, 0xd7, 0xa1, 0x70, 0xeb, 0xfe, + 0x96, 0xb8, 0x4f, 0x48, 0xba, 0x78, 0x27, 0xe5, 0x74, 0x1f, 0xed, 0xeb, 0xfb, 0x3b, 0x23, 0xb0, + 0x6c, 0x98, 0xd4, 0xa6, 0x30, 0x3f, 0x6e, 0xdb, 0xbe, 0xf2, 0xeb, 0x15, 0xc7, 0x2d, 0x83, 0xd8, + 0xa2, 0x84, 0x49, 0x07, 0x6b, 0x7e, 0xc3, 0x6d, 0x89, 0x73, 0x1b, 0xa5, 0x83, 0x16, 0x03, 0xd8, + 0x1c, 0x6e, 0xfd, 0x56, 0x0e, 0x4a, 0x28, 0x43, 0xa1, 0xd1, 0xa6, 0xff, 0x80, 0x76, 0xee, 0x5d, + 0x25, 0x6f, 0xc8, 0xc5, 0x96, 0x53, 0xaa, 0x86, 0x51, 0x5c, 0x6c, 0x89, 0xb7, 0x0a, 0xb1, 0xe0, + 0x34, 0xd7, 0xe9, 0xfc, 0xf0, 0x2e, 0x97, 0x47, 0xb8, 0x4e, 0x97, 0x61, 0x14, 0x3f, 0x47, 0x6c, + 0x8b, 0xf8, 0xe5, 0x11, 0x03, 0xd8, 0x1c, 0xae, 0xed, 0x4a, 0x3f, 0x95, 0x4f, 0xb5, 0x61, 0xf1, + 0x87, 0xca, 0x6d, 0xd1, 0x6c, 0xdc, 0x50, 0x3b, 0xf5, 0x87, 0x70, 0x2c, 0xd9, 0x25, 0xa8, 0x06, + 0xaa, 0xc0, 0xac, 0x09, 0x97, 0x1a, 0xa1, 0x93, 0x99, 0x75, 0xdd, 0x5b, 0xb4, 0x93, 0xf8, 0xd6, + 0xff, 0x96, 0x83, 0x09, 0xfc, 0xd3, 0xee, 0xb5, 0xd0, 0x78, 0xa6, 0x72, 0xbf, 0x2e, 0x54, 0xbe, + 0xba, 0x18, 0xe7, 0xee, 0x87, 0x8e, 0xd0, 0x0a, 0x1b, 0xfb, 0x8b, 0x42, 0x16, 0xa4, 0x5c, 0x97, + 0x2b, 0xd5, 0x22, 0x8a, 0x94, 0x2b, 0x7d, 0xc3, 0x04, 0xa9, 0x40, 0x46, 0x93, 0xbb, 0xfb, 0x75, + 0x36, 0xfd, 0xf4, 0xd7, 0x6c, 0xa4, 0xf3, 0x5b, 0xa6, 0xc9, 0x1d, 0x47, 0xc3, 0xc7, 0xec, 0xfb, + 0xf5, 0x8a, 0xbd, 0x6e, 0x3c, 0x66, 0xb3, 0x6f, 0x34, 0x2c, 0xc4, 0x05, 0x92, 0xf5, 0x0f, 0x20, + 0xd9, 0x81, 0xe2, 0xa8, 0x7b, 0xc2, 0xb5, 0xf1, 0x36, 0x8c, 0x56, 0x5a, 0x2d, 0x7f, 0x5f, 0xec, + 0x12, 0x52, 0x2b, 0xa5, 0xfa, 0x8f, 0x9f, 0x64, 0xa8, 0x58, 0x31, 0x5c, 0xb1, 0x18, 0x80, 0x2c, + 0xc3, 0x44, 0xe5, 0x7e, 0xbd, 0x56, 0xab, 0x6e, 0x6d, 0x71, 0xb7, 0x93, 0xc2, 0xd2, 0xcb, 0xb2, + 0x7f, 0x3c, 0xaf, 0xe9, 0x24, 0xdf, 0x53, 0x63, 0xc9, 0x3d, 0xa6, 0x23, 0xef, 0x02, 0xdc, 0xf2, + 0xbd, 0x0e, 0x57, 0x24, 0x89, 0xc6, 0x9f, 0x79, 0x7c, 0x58, 0x9e, 0xfc, 0xc8, 0xf7, 0x3a, 0x42, + 0xf3, 0xc4, 0xbe, 0x3d, 0x46, 0xb2, 0xb5, 0xbf, 0x59, 0x4f, 0x2f, 0xf9, 0xdc, 0x20, 0x66, 0x34, + 0xee, 0xe9, 0x6d, 0x3f, 0x65, 0x0b, 0x23, 0xd1, 0x48, 0x1b, 0x66, 0xeb, 0xbd, 0xdd, 0x5d, 0xca, + 0x76, 0x75, 0xa1, 0x3a, 0x19, 0x13, 0xb7, 0x5b, 0x15, 0xec, 0x83, 0xdf, 0x44, 0xd8, 0xfd, 0x24, + 0x5c, 0x7a, 0x9d, 0x4d, 0xe4, 0x1f, 0x1c, 0x96, 0xc5, 0x3b, 0x2d, 0x13, 0xd2, 0x42, 0x49, 0x9f, + 0x56, 0x9c, 0x24, 0x79, 0x93, 0x0d, 0x18, 0xbb, 0xe9, 0x45, 0xab, 0xbd, 0x6d, 0xe1, 0x46, 0xf1, + 0xe2, 0x80, 0x45, 0xc3, 0x11, 0xf9, 0x43, 0xc1, 0xae, 0x17, 0xed, 0xf5, 0x74, 0x43, 0x76, 0xc1, + 0x86, 0xdc, 0x87, 0xe2, 0xb2, 0x17, 0x34, 0x5a, 0x74, 0xb9, 0x26, 0x4e, 0xfd, 0xf3, 0x03, 0x58, + 0x4a, 0x54, 0xde, 0x2f, 0x0d, 0xfc, 0xd5, 0xf0, 0x74, 0x29, 0x40, 0x62, 0x90, 0xbf, 0x96, 0x83, + 0xe7, 0xd5, 0xd7, 0x57, 0x76, 0x69, 0x27, 0xba, 0xe3, 0x46, 0x8d, 0x3d, 0x1a, 0x88, 0x5e, 0x9a, + 0x18, 0xd4, 0x4b, 0x5f, 0x4a, 0xf5, 0xd2, 0xc5, 0xb8, 0x97, 0x5c, 0xc6, 0xcc, 0x69, 0x73, 0x6e, + 0xe9, 0x3e, 0x1b, 0x54, 0x2b, 0x71, 0x00, 0xe2, 0x97, 0x1f, 0xe1, 0x86, 0xf7, 0xf2, 0x80, 0x06, + 0xc7, 0xc8, 0xc2, 0x7c, 0x5e, 0xfd, 0x36, 0xec, 0xbf, 0x14, 0x94, 0xdc, 0x96, 0x3e, 0x4b, 0x5c, + 0x22, 0x39, 0x37, 0x80, 0x37, 0xf7, 0x63, 0x9a, 0x1f, 0xe0, 0x9d, 0xc8, 0x47, 0x7b, 0xcd, 0xdd, + 0x16, 0x42, 0xc8, 0x11, 0xa3, 0xbd, 0xe6, 0xc6, 0xa3, 0xdd, 0x72, 0x93, 0xa3, 0xbd, 0xe6, 0x6e, + 0x93, 0x65, 0xee, 0x68, 0xc9, 0xbd, 0xf2, 0xce, 0x0e, 0xe2, 0xb6, 0xbc, 0xc9, 0x4f, 0xe6, 0x0c, + 0x87, 0xcb, 0xaf, 0xc2, 0x44, 0xbd, 0xeb, 0x36, 0x68, 0xcb, 0xdb, 0x89, 0xc4, 0x53, 0xe0, 0x4b, + 0x03, 0x58, 0x29, 0x5c, 0xf1, 0x8c, 0x24, 0x7f, 0xea, 0x17, 0x24, 0x85, 0xc3, 0xbe, 0x70, 0x6b, + 0xf3, 0xce, 0xc2, 0xec, 0x91, 0x5f, 0xb8, 0xb5, 0x79, 0x47, 0xc8, 0x1c, 0xdd, 0xb6, 0x21, 0x73, + 0x6c, 0xde, 0x21, 0x5d, 0x98, 0xd9, 0xa2, 0x41, 0xe0, 0xee, 0xf8, 0x41, 0x9b, 0xab, 0xea, 0xb8, + 0xa7, 0xc7, 0xa5, 0x41, 0xfc, 0x0c, 0x02, 0xae, 0xa3, 0x8d, 0x24, 0xcc, 0x49, 0xea, 0xf7, 0x12, + 0xfc, 0xad, 0x5f, 0x2f, 0xc0, 0xc9, 0x3e, 0x5f, 0x49, 0xd6, 0xe5, 0xae, 0x98, 0x33, 0x74, 0xaa, + 0x7d, 0xd0, 0x2f, 0x1f, 0xb9, 0x51, 0xae, 0x41, 0x69, 0xe5, 0x36, 0x0a, 0xd2, 0x5c, 0xdb, 0xbd, + 0x5c, 0x91, 0xe7, 0x09, 0xea, 0xfd, 0xe8, 0x03, 0x34, 0x5e, 0x93, 0x5a, 0xf2, 0x86, 0xe1, 0xa5, + 0x99, 0xa2, 0x3c, 0xfd, 0x63, 0x79, 0x18, 0xc1, 0xb3, 0x2d, 0x11, 0x9b, 0x26, 0xf7, 0x44, 0xb1, + 0x69, 0x3e, 0x80, 0xa9, 0x95, 0xdb, 0xfc, 0x9a, 0xbb, 0xea, 0x86, 0x7b, 0x62, 0xe7, 0xc5, 0xb7, + 0x60, 0xfa, 0xc0, 0x11, 0xb7, 0xe2, 0x3d, 0xd7, 0x10, 0x2b, 0x0d, 0x0a, 0x72, 0x17, 0xe6, 0xf9, + 0xb7, 0x79, 0x3b, 0x5e, 0x83, 0x87, 0xb8, 0xf0, 0xdc, 0x96, 0xd8, 0x86, 0xcf, 0x3f, 0x3e, 0x2c, + 0x97, 0xe9, 0x03, 0x34, 0xcb, 0x13, 0xe5, 0x4e, 0x88, 0x08, 0xba, 0x7d, 0x5e, 0x06, 0xbd, 0xee, + 0x77, 0x6f, 0x4f, 0x60, 0x85, 0xac, 0x36, 0x56, 0x37, 0xc3, 0xe5, 0x48, 0xd6, 0xdf, 0x1f, 0x85, + 0xd3, 0xfd, 0x77, 0x50, 0xf2, 0x65, 0x73, 0x00, 0x2f, 0x1c, 0xb9, 0xe7, 0x1e, 0x3d, 0x86, 0x5f, + 0x81, 0x63, 0x2b, 0x9d, 0x88, 0x06, 0xdd, 0xc0, 0x93, 0x91, 0x16, 0x56, 0xfd, 0x50, 0x9a, 0x41, + 0xa2, 0x3d, 0x22, 0x55, 0xe5, 0x42, 0x23, 0x89, 0x46, 0x99, 0x1a, 0xab, 0x4c, 0x0e, 0x64, 0x05, + 0x66, 0x34, 0x78, 0xab, 0xb7, 0x2b, 0x64, 0x06, 0xfe, 0xe8, 0xa0, 0xf1, 0x6c, 0xf5, 0xf4, 0xab, + 0x55, 0x82, 0xe8, 0xf4, 0x2f, 0x15, 0xc4, 0xb4, 0x38, 0x0f, 0x85, 0x7a, 0x6f, 0x5b, 0x4c, 0x07, + 0x7e, 0x39, 0x30, 0x0e, 0x12, 0x56, 0x4a, 0xbe, 0x08, 0x60, 0xd3, 0xae, 0x1f, 0x7a, 0x91, 0x1f, + 0x1c, 0xe8, 0x0e, 0x3b, 0x81, 0x82, 0x9a, 0x36, 0xc5, 0x12, 0x4a, 0x56, 0x61, 0x36, 0xfe, 0xb5, + 0xb1, 0xdf, 0x11, 0x6a, 0xd4, 0x09, 0xae, 0xbf, 0x88, 0xc9, 0x1d, 0x9f, 0x95, 0xe9, 0x47, 0x63, + 0x82, 0x8c, 0x2c, 0x42, 0xf1, 0xbe, 0x1f, 0x3c, 0xd8, 0x61, 0x03, 0x35, 0x12, 0x1f, 0xde, 0xfb, + 0x02, 0xa6, 0x1f, 0x52, 0x12, 0x8f, 0xcd, 0xf9, 0x95, 0xce, 0x43, 0x2f, 0xf0, 0x3b, 0x6d, 0xda, + 0x89, 0xf4, 0x77, 0x72, 0x1a, 0x83, 0x0d, 0x57, 0xc9, 0x18, 0xcc, 0x6e, 0xe9, 0x95, 0x46, 0xe4, + 0x07, 0xe2, 0x91, 0x9c, 0x0f, 0x37, 0x03, 0x18, 0xc3, 0xcd, 0x00, 0xac, 0x13, 0x6d, 0xba, 0x23, + 0x1e, 0x0c, 0xb0, 0x13, 0x03, 0xba, 0x63, 0xf8, 0x81, 0xd2, 0x1d, 0x26, 0x7c, 0xd8, 0x74, 0x07, + 0x55, 0x0b, 0x46, 0xf8, 0xa4, 0x9d, 0x94, 0x52, 0x4a, 0xa0, 0x59, 0xdf, 0x9f, 0xe8, 0x3b, 0x6f, + 0xd9, 0x6e, 0xff, 0x64, 0xf3, 0x76, 0xcd, 0x1d, 0x62, 0xde, 0xbe, 0xae, 0x2c, 0x95, 0x75, 0xe7, + 0x67, 0x84, 0xe8, 0xc7, 0x0d, 0xc7, 0x39, 0xfd, 0xcb, 0xc5, 0x27, 0x99, 0x44, 0xa2, 0x93, 0xf2, + 0xc3, 0x76, 0x52, 0x61, 0xa8, 0x4e, 0x22, 0x4b, 0x30, 0xad, 0x02, 0x70, 0x6d, 0xba, 0x91, 0xb1, + 0x37, 0xa9, 0xa8, 0x69, 0x4e, 0xd7, 0x8d, 0xf4, 0xbd, 0xc9, 0x24, 0x21, 0xef, 0xc0, 0xa4, 0x30, + 0xd7, 0x47, 0x0e, 0xa3, 0xb1, 0xc1, 0xa4, 0xb4, 0xed, 0x4f, 0xd0, 0xeb, 0xe8, 0x6c, 0x49, 0x6e, + 0x7a, 0x5d, 0xda, 0xf2, 0x3a, 0xb4, 0x8e, 0x7a, 0x7a, 0x31, 0x63, 0x70, 0x49, 0x76, 0x45, 0x89, + 0xc3, 0x55, 0xf8, 0x86, 0x86, 0xce, 0x20, 0x4a, 0x4e, 0xd6, 0xf1, 0x27, 0x9a, 0xac, 0xdc, 0x5e, + 0x29, 0x58, 0xf3, 0x77, 0x3d, 0x69, 0xa1, 0x29, 0xed, 0x95, 0x02, 0xa7, 0xc5, 0xa0, 0x09, 0x7b, + 0x25, 0x8e, 0xca, 0x6e, 0x12, 0xec, 0x47, 0xad, 0x2a, 0x1e, 0xa7, 0xf0, 0x26, 0x81, 0x44, 0xa6, + 0x59, 0x2c, 0x47, 0x92, 0xd5, 0xac, 0xb4, 0x5d, 0xaf, 0x25, 0x7c, 0x5c, 0xe3, 0x6a, 0x28, 0x83, + 0x26, 0xab, 0x41, 0x54, 0xd2, 0x80, 0x29, 0x9b, 0xee, 0x6c, 0x06, 0x7e, 0x44, 0x1b, 0x11, 0x6d, + 0x0a, 0xe9, 0x49, 0x5e, 0x20, 0x96, 0x7c, 0x9f, 0x4b, 0x86, 0x4b, 0x6f, 0x7c, 0xff, 0xb0, 0x9c, + 0xfb, 0xc1, 0x61, 0x19, 0x18, 0x88, 0xdb, 0x5c, 0x3f, 0x3e, 0x2c, 0x9f, 0x64, 0xe3, 0xdf, 0x95, + 0xc4, 0xfa, 0x11, 0xa3, 0x33, 0x25, 0xdf, 0x61, 0x9b, 0xae, 0xea, 0x92, 0xb8, 0xb2, 0xa9, 0x3e, + 0x95, 0xbd, 0x99, 0x59, 0x59, 0x59, 0xeb, 0xed, 0xcc, 0x4a, 0x33, 0x2b, 0x21, 0xef, 0xc2, 0xe4, + 0x72, 0x6d, 0xd9, 0xef, 0xec, 0x78, 0xbb, 0xf5, 0xd5, 0x0a, 0x8a, 0x60, 0xc2, 0xde, 0xbe, 0xe1, + 0x39, 0x0d, 0x84, 0x3b, 0xe1, 0x9e, 0x6b, 0xb8, 0x5d, 0xc5, 0xf8, 0xe4, 0x26, 0xcc, 0xc8, 0x9f, + 0x36, 0xdd, 0xb9, 0x6b, 0xd7, 0x50, 0xf2, 0x92, 0x4e, 0x0e, 0x8a, 0x03, 0xeb, 0x88, 0x5e, 0xa0, + 0x4b, 0xe4, 0x09, 0x32, 0x36, 0x19, 0xab, 0xb4, 0xdb, 0xf2, 0x0f, 0xd8, 0xe7, 0x6d, 0x79, 0x34, + 0x40, 0x59, 0x4b, 0x4c, 0xc6, 0xa6, 0x2a, 0x71, 0x22, 0xcf, 0xd8, 0x6e, 0x13, 0x44, 0x64, 0x1d, + 0xe6, 0xc4, 0x14, 0xbf, 0xe7, 0x85, 0xde, 0xb6, 0xd7, 0xf2, 0xa2, 0x03, 0x94, 0xb2, 0x84, 0x14, + 0x22, 0xd7, 0xc5, 0x43, 0x55, 0xaa, 0x31, 0x4b, 0x93, 0x5a, 0xbf, 0x9a, 0x87, 0x17, 0x06, 0xdd, + 0x38, 0x48, 0xdd, 0xdc, 0xcc, 0x2e, 0x0e, 0x71, 0x4b, 0x39, 0x7a, 0x3b, 0x5b, 0x81, 0x99, 0x8d, + 0x60, 0xd7, 0xed, 0x78, 0xdf, 0xc6, 0x9b, 0xa4, 0x32, 0xdb, 0xc2, 0xce, 0xf0, 0xb5, 0x12, 0x73, + 0xb6, 0x27, 0x88, 0x4e, 0x3f, 0x14, 0xdb, 0xdc, 0x27, 0x75, 0x00, 0xba, 0x0e, 0x13, 0xcb, 0x7e, + 0x27, 0xa2, 0x8f, 0xa2, 0x84, 0xbb, 0x2b, 0x07, 0x26, 0x9d, 0x9f, 0x24, 0xaa, 0xf5, 0x2f, 0xf3, + 0x70, 0x66, 0xa0, 0xc8, 0x4d, 0xb6, 0xcc, 0x5e, 0xbb, 0x34, 0x8c, 0x9c, 0x7e, 0x74, 0xb7, 0x2d, + 0xa6, 0x2c, 0x8c, 0x8e, 0xb4, 0xaf, 0x3f, 0xfd, 0xdf, 0xe5, 0x44, 0x27, 0x7d, 0x0e, 0xc6, 0xb1, + 0x2a, 0xd5, 0x45, 0x5c, 0x1b, 0x85, 0xbb, 0xb0, 0x67, 0x6a, 0xa3, 0x38, 0x1a, 0xb9, 0x06, 0xc5, + 0x65, 0xb7, 0xd5, 0xd2, 0x9c, 0x81, 0xf1, 0x26, 0xd1, 0x40, 0x58, 0xc2, 0x20, 0x4d, 0x22, 0x92, + 0xb7, 0x00, 0xf8, 0xdf, 0xda, 0x59, 0x81, 0x9b, 0xa5, 0x20, 0x4b, 0x1c, 0x17, 0x1a, 0x32, 0x86, + 0x10, 0x6c, 0xf8, 0xca, 0xdd, 0x90, 0x87, 0x10, 0x64, 0x00, 0x23, 0x84, 0x20, 0x03, 0x58, 0xbf, + 0x56, 0x80, 0xb3, 0x83, 0xef, 0x8d, 0xe4, 0xae, 0x39, 0x04, 0xaf, 0x0e, 0x75, 0xdb, 0x3c, 0x7a, + 0x0c, 0x64, 0x40, 0x4e, 0xde, 0x21, 0x17, 0xd3, 0x66, 0xf0, 0x1f, 0x1f, 0x96, 0x35, 0x2b, 0xc7, + 0x5b, 0xbe, 0xd7, 0xd1, 0x5e, 0x25, 0xbe, 0x05, 0x50, 0x8f, 0xdc, 0xc8, 0x6b, 0xdc, 0xba, 0x7f, + 0x5b, 0xc6, 0xab, 0xb8, 0x3e, 0xdc, 0x97, 0xc5, 0x74, 0x7c, 0x5f, 0x11, 0x0a, 0x7b, 0x84, 0x3a, + 0x1f, 0xed, 0x3f, 0x30, 0x6e, 0xc6, 0x31, 0xf2, 0xe9, 0x2f, 0x41, 0x29, 0x49, 0x4a, 0x2e, 0xc0, + 0x08, 0x7e, 0x80, 0x66, 0xcb, 0x9f, 0xe0, 0x80, 0xe5, 0xa7, 0xef, 0x88, 0xb9, 0x83, 0xfe, 0xd1, + 0xf8, 0x14, 0x6e, 0xea, 0xe0, 0x84, 0x7f, 0x34, 0x7f, 0x49, 0x4f, 0xeb, 0xe1, 0x12, 0x44, 0xd6, + 0x9f, 0xe4, 0xe0, 0x54, 0xdf, 0x1b, 0x39, 0xd9, 0x34, 0x07, 0xec, 0xe5, 0xa3, 0xae, 0xf0, 0x47, + 0x8e, 0xd5, 0xe9, 0x9f, 0x90, 0x73, 0xff, 0x3d, 0x98, 0xaa, 0xf7, 0xb6, 0x93, 0x97, 0x2c, 0x1e, + 0xbd, 0x40, 0x83, 0xeb, 0x27, 0x98, 0x8e, 0xcf, 0xda, 0x2f, 0xdf, 0xfa, 0x85, 0x4d, 0x89, 0x66, + 0x5f, 0xa5, 0x1c, 0xf8, 0xd2, 0xfe, 0xe1, 0x26, 0x91, 0xf5, 0x2b, 0xf9, 0xec, 0xdb, 0x2a, 0xbb, + 0xdd, 0x3f, 0xc1, 0x6d, 0xf5, 0xe6, 0xf2, 0xe6, 0xd1, 0x6d, 0xff, 0xaf, 0x64, 0xdb, 0xf1, 0xe9, + 0x53, 0xec, 0x78, 0x52, 0xa1, 0x28, 0x9e, 0x3e, 0xe5, 0xee, 0x18, 0x9a, 0x4f, 0x9f, 0x12, 0x99, + 0xbc, 0x09, 0x13, 0x6b, 0x3e, 0x77, 0xdd, 0x96, 0x2d, 0xe6, 0x1e, 0x6e, 0x12, 0xa8, 0x6f, 0x8f, + 0x0a, 0x93, 0xdd, 0x2d, 0xcc, 0x81, 0x97, 0x66, 0x64, 0x78, 0xb7, 0x48, 0x4c, 0x17, 0x53, 0xed, + 0x66, 0x92, 0x59, 0xff, 0xe9, 0x28, 0x58, 0x47, 0x2b, 0x0d, 0xc8, 0x87, 0x66, 0xdf, 0x5d, 0x1e, + 0x5a, 0xdd, 0x30, 0xd4, 0x96, 0x5b, 0xe9, 0x35, 0x3d, 0xda, 0x69, 0x98, 0x7e, 0xd7, 0x02, 0xa6, + 0x6f, 0x81, 0x12, 0xef, 0x93, 0xb8, 0x41, 0x9d, 0xfe, 0xaf, 0x0b, 0xf1, 0x52, 0x4b, 0x1c, 0x8d, + 0xb9, 0x4f, 0x70, 0x34, 0x92, 0xdb, 0x50, 0xd2, 0x21, 0xda, 0x1b, 0x28, 0x4a, 0x2e, 0x06, 0xa3, + 0xc4, 0x47, 0xa5, 0x08, 0xcd, 0xf3, 0xb5, 0x30, 0xfc, 0xf9, 0x1a, 0x8b, 0xef, 0x58, 0xff, 0x48, + 0x5a, 0x7c, 0x4f, 0xba, 0x3a, 0x6a, 0xe8, 0xd2, 0x4f, 0x3b, 0x14, 0x87, 0xd6, 0xa8, 0xe9, 0xa7, + 0x9d, 0x71, 0x70, 0xe9, 0xe8, 0xd2, 0xd5, 0x1c, 0x7f, 0x6a, 0x9e, 0x96, 0xca, 0xd5, 0x9c, 0xd3, + 0x67, 0xb9, 0x9a, 0x2b, 0x12, 0x76, 0x00, 0xda, 0xbd, 0x0e, 0x8f, 0x55, 0x3b, 0x1e, 0x1f, 0x80, + 0x41, 0xaf, 0xe3, 0x24, 0xe3, 0xd5, 0x2a, 0x44, 0xeb, 0x27, 0xf2, 0x30, 0xc3, 0x37, 0x5c, 0xfe, + 0x94, 0xf1, 0xcc, 0x3e, 0x13, 0xbd, 0x6d, 0x3c, 0x13, 0xc9, 0xe0, 0x3c, 0x7a, 0xd3, 0x86, 0x7a, + 0x24, 0xda, 0x03, 0x92, 0xa6, 0x21, 0x36, 0x4c, 0xe9, 0xd0, 0xc1, 0xef, 0x43, 0x57, 0xe3, 0x38, + 0x4e, 0xe2, 0xbc, 0xc3, 0x47, 0xba, 0xd0, 0x36, 0x78, 0x58, 0x7f, 0x39, 0x0f, 0xd3, 0xda, 0x73, + 0xfe, 0x33, 0xdb, 0xf1, 0x5f, 0x32, 0x3a, 0x7e, 0x41, 0xb9, 0x7b, 0xa8, 0x96, 0x0d, 0xd5, 0xef, + 0x3d, 0x98, 0x4b, 0x91, 0x24, 0xad, 0x22, 0x72, 0xc3, 0x58, 0x45, 0xbc, 0x9e, 0x0e, 0x0a, 0xc3, + 0x63, 0x2b, 0xab, 0x10, 0x01, 0x7a, 0x14, 0x9a, 0x9f, 0xcc, 0xc3, 0x31, 0xf1, 0x0b, 0xa3, 0xa8, + 0x71, 0x89, 0xe3, 0x99, 0x1d, 0x8b, 0x8a, 0x31, 0x16, 0x65, 0x73, 0x2c, 0xb4, 0x06, 0xf6, 0x1f, + 0x12, 0xeb, 0x2f, 0x00, 0x2c, 0xf4, 0x23, 0x18, 0xda, 0xab, 0x32, 0xf6, 0x59, 0xc9, 0x0f, 0xe1, + 0xb3, 0xb2, 0x06, 0x25, 0xac, 0x4a, 0xc4, 0x49, 0x0a, 0xd9, 0xbd, 0xb5, 0x10, 0x5f, 0x12, 0x79, + 0xa8, 0x3b, 0x11, 0xb7, 0x29, 0x4c, 0x5c, 0x5c, 0x53, 0x94, 0xe4, 0x97, 0x72, 0x30, 0x83, 0xc0, + 0x95, 0x87, 0xb4, 0x13, 0x21, 0xb3, 0x11, 0xe1, 0x62, 0xa1, 0x5e, 0x91, 0xea, 0x51, 0xe0, 0x75, + 0x76, 0xc5, 0x33, 0xd2, 0xb6, 0x78, 0x46, 0x7a, 0x87, 0x3f, 0x7f, 0x5d, 0x6e, 0xf8, 0xed, 0x2b, + 0xbb, 0x81, 0xfb, 0xd0, 0xe3, 0x96, 0x2a, 0x6e, 0xeb, 0x4a, 0x1c, 0xda, 0xbf, 0xeb, 0x25, 0x82, + 0xf5, 0x0b, 0x56, 0xf8, 0x44, 0xc7, 0x3f, 0x94, 0x62, 0xb5, 0xc9, 0xfb, 0xb5, 0xf9, 0x45, 0xe4, + 0x47, 0xe0, 0x24, 0x8f, 0x5e, 0xc2, 0xae, 0x69, 0x5e, 0xa7, 0xe7, 0xf7, 0xc2, 0x25, 0xb7, 0xf1, + 0x80, 0xc9, 0x6a, 0xdc, 0x4d, 0x0c, 0x5b, 0xde, 0x50, 0x85, 0xce, 0x36, 0x2f, 0x35, 0xdc, 0x62, + 0xb3, 0x19, 0x90, 0x55, 0x98, 0xe3, 0x45, 0x95, 0x5e, 0xe4, 0xd7, 0x1b, 0x6e, 0xcb, 0xeb, 0xec, + 0xe2, 0x81, 0x50, 0xe4, 0xe7, 0x91, 0xdb, 0x8b, 0x7c, 0x27, 0xe4, 0x70, 0xfd, 0xba, 0x9d, 0x22, + 0x22, 0x35, 0x98, 0xb5, 0xa9, 0xdb, 0xbc, 0xe3, 0x3e, 0x5a, 0x76, 0xbb, 0x6e, 0x83, 0x5d, 0xde, + 0x8b, 0xf8, 0xe4, 0x8a, 0xa7, 0x72, 0x40, 0xdd, 0xa6, 0xd3, 0x76, 0x1f, 0x39, 0x0d, 0x51, 0x68, + 0xea, 0x5d, 0x0d, 0x3a, 0xc5, 0xca, 0xeb, 0x28, 0x56, 0x13, 0x49, 0x56, 0x5e, 0xa7, 0x3f, 0xab, + 0x98, 0x4e, 0xb2, 0xda, 0x72, 0x83, 0x5d, 0x1a, 0x71, 0x43, 0x4f, 0x38, 0x97, 0xbb, 0x98, 0xd3, + 0x58, 0x45, 0x58, 0xe6, 0xa0, 0xd1, 0x67, 0x92, 0x95, 0x46, 0xc7, 0x66, 0xde, 0xfd, 0xc0, 0x8b, + 0xa8, 0xde, 0xc2, 0x49, 0xfc, 0x2c, 0xec, 0x7f, 0x34, 0x91, 0xed, 0xd7, 0xc4, 0x14, 0x65, 0xcc, + 0x4d, 0x6b, 0xe4, 0x54, 0x8a, 0x5b, 0x76, 0x2b, 0x53, 0x94, 0x8a, 0x9b, 0xde, 0xce, 0x69, 0x6c, + 0xa7, 0xc6, 0xad, 0x4f, 0x43, 0x53, 0x94, 0x64, 0x9d, 0x75, 0x5a, 0x44, 0x3b, 0x6c, 0x46, 0x0b, + 0x43, 0xd7, 0x19, 0xfc, 0xb4, 0x97, 0x84, 0xb5, 0x56, 0x29, 0x90, 0xc5, 0x4e, 0x86, 0xd9, 0x6b, + 0x92, 0x98, 0xfc, 0x19, 0x98, 0xbd, 0x1b, 0xd2, 0x1b, 0xb5, 0xcd, 0xba, 0x0c, 0x76, 0x82, 0x1a, + 0xa2, 0x99, 0xc5, 0xab, 0x47, 0x6c, 0x3a, 0x97, 0x75, 0x1a, 0x8c, 0xb0, 0xcf, 0xc7, 0xad, 0x17, + 0x52, 0x67, 0xc7, 0xeb, 0x86, 0x2a, 0x72, 0x94, 0x3e, 0x6e, 0x89, 0xaa, 0xac, 0x55, 0x98, 0x4b, + 0xb1, 0x21, 0x33, 0x00, 0x0c, 0xe8, 0xdc, 0x5d, 0xaf, 0xaf, 0x6c, 0x95, 0x9e, 0x23, 0x25, 0x98, + 0xc2, 0xdf, 0x2b, 0xeb, 0x95, 0xa5, 0xb5, 0x95, 0x6a, 0x29, 0x47, 0xe6, 0x60, 0x1a, 0x21, 0xd5, + 0x5a, 0x9d, 0x83, 0xf2, 0x3c, 0xbe, 0xb2, 0x5d, 0xe2, 0x4b, 0x37, 0x62, 0x0b, 0x00, 0xcf, 0x14, + 0xeb, 0xaf, 0xe7, 0xe1, 0x94, 0x3c, 0x56, 0x68, 0xc4, 0x44, 0x30, 0xaf, 0xb3, 0xfb, 0x8c, 0x9f, + 0x0e, 0x37, 0x8c, 0xd3, 0xe1, 0xa5, 0xc4, 0x49, 0x9d, 0x68, 0xe5, 0x80, 0x23, 0xe2, 0x37, 0x27, + 0xe0, 0xcc, 0x40, 0x2a, 0xf2, 0x65, 0x76, 0x9a, 0x7b, 0xb4, 0x13, 0xd5, 0x9a, 0x2d, 0xba, 0xe5, + 0xb5, 0xa9, 0xdf, 0x8b, 0x84, 0x61, 0xf5, 0x79, 0x54, 0xca, 0x60, 0xa1, 0xe3, 0x35, 0x5b, 0xd4, + 0x89, 0x78, 0xb1, 0x31, 0xdd, 0xd2, 0xd4, 0x8c, 0xa5, 0xca, 0xf6, 0x51, 0xeb, 0x44, 0x34, 0x78, + 0x88, 0x26, 0x5c, 0x8a, 0xe5, 0x03, 0x4a, 0xbb, 0x8e, 0xcb, 0x4a, 0x1d, 0x4f, 0x14, 0x9b, 0x2c, + 0x53, 0xd4, 0xe4, 0x86, 0xc6, 0x72, 0x99, 0x5d, 0xe1, 0xee, 0xb8, 0x8f, 0x84, 0x4d, 0x89, 0x08, + 0x9e, 0xa7, 0x58, 0x72, 0x4f, 0xce, 0xb6, 0xfb, 0xc8, 0x4e, 0x93, 0x90, 0xaf, 0xc3, 0x71, 0x71, + 0x00, 0x09, 0x4f, 0x7c, 0xd9, 0x62, 0xee, 0xe7, 0xff, 0xca, 0xe3, 0xc3, 0xf2, 0x49, 0x19, 0x76, + 0x50, 0xc6, 0x5e, 0xc8, 0x6a, 0x75, 0x36, 0x17, 0xb2, 0xc5, 0x0e, 0xe4, 0x44, 0x77, 0xdc, 0xa1, + 0x61, 0x28, 0x5d, 0x8c, 0xc4, 0xf5, 0x46, 0xef, 0x4c, 0xa7, 0xcd, 0xcb, 0xed, 0xbe, 0x94, 0x64, + 0x15, 0x66, 0xee, 0xd3, 0x6d, 0x7d, 0x7c, 0xc6, 0xd4, 0x56, 0x55, 0xda, 0xa7, 0xdb, 0xfd, 0x07, + 0x27, 0x41, 0x47, 0x3c, 0x54, 0xf2, 0x3e, 0x3a, 0x58, 0xf3, 0xc2, 0x88, 0x76, 0x68, 0x80, 0x11, + 0x5e, 0xc6, 0x71, 0x33, 0x58, 0x88, 0x25, 0x64, 0xb3, 0x7c, 0xe9, 0xc5, 0xc7, 0x87, 0xe5, 0x33, + 0xdc, 0x57, 0xaf, 0x25, 0xe0, 0x4e, 0x22, 0x57, 0x46, 0x9a, 0x2b, 0xf9, 0x26, 0xcc, 0xda, 0x7e, + 0x2f, 0xf2, 0x3a, 0xbb, 0xf5, 0x28, 0x70, 0x23, 0xba, 0xcb, 0x0f, 0xa4, 0x38, 0x94, 0x4c, 0xa2, + 0x54, 0xbc, 0x0f, 0x72, 0xa0, 0x13, 0x0a, 0xa8, 0x71, 0x22, 0x98, 0x04, 0xe4, 0x1b, 0x30, 0xc3, + 0x7d, 0xb0, 0x55, 0x05, 0x13, 0x46, 0x9c, 0x6f, 0xb3, 0xf0, 0xde, 0x55, 0x61, 0x02, 0x80, 0xd0, + 0xac, 0x0a, 0x12, 0xdc, 0xc8, 0x57, 0x45, 0x67, 0x6d, 0x7a, 0x9d, 0x5d, 0x35, 0x8d, 0x01, 0x7b, + 0xfe, 0x8d, 0xb8, 0x4b, 0xba, 0xec, 0x73, 0xe5, 0x34, 0xee, 0x63, 0xcf, 0x94, 0xe6, 0x43, 0x22, + 0x38, 0x53, 0x09, 0x43, 0x2f, 0x8c, 0x84, 0xfb, 0xc1, 0xca, 0x23, 0xda, 0xe8, 0x31, 0x64, 0x76, + 0x51, 0xa4, 0x01, 0x37, 0x80, 0x1d, 0x5d, 0xba, 0xfc, 0xf8, 0xb0, 0xfc, 0xaa, 0x8b, 0x88, 0x8e, + 0xf0, 0x58, 0x70, 0xa8, 0x44, 0x75, 0xf6, 0x39, 0xae, 0xd6, 0x86, 0xc1, 0x4c, 0xc9, 0x37, 0xe0, + 0xc4, 0xb2, 0x1b, 0xd2, 0x5a, 0x27, 0xa4, 0x9d, 0xd0, 0x8b, 0xbc, 0x87, 0x54, 0x74, 0x2a, 0x1e, + 0x7e, 0x45, 0xcc, 0x2a, 0x62, 0x35, 0xdc, 0x90, 0x2d, 0x4c, 0x85, 0xe2, 0x88, 0x41, 0xd1, 0xaa, + 0xe9, 0xc3, 0x85, 0xd8, 0x30, 0x53, 0xaf, 0xaf, 0x56, 0x3d, 0x57, 0xad, 0xab, 0x69, 0xec, 0xaf, + 0x57, 0x51, 0x3f, 0x13, 0xee, 0x39, 0x4d, 0xcf, 0x55, 0x0b, 0xaa, 0x4f, 0x67, 0x25, 0x38, 0x58, + 0x87, 0x39, 0x28, 0x25, 0x87, 0x92, 0x7c, 0x05, 0x26, 0xb8, 0x31, 0x10, 0x0d, 0xf7, 0x84, 0x4b, + 0xb2, 0xb4, 0x2d, 0x51, 0x70, 0x93, 0x48, 0xb8, 0x03, 0x71, 0x53, 0x23, 0xaa, 0xdb, 0x2d, 0xa0, + 0x3b, 0x90, 0x24, 0x22, 0x4d, 0x98, 0xe2, 0xa3, 0x45, 0x31, 0x8e, 0x94, 0xb0, 0x09, 0x7d, 0x51, + 0x5f, 0x1d, 0xa2, 0x28, 0xc1, 0x1f, 0x9f, 0x7e, 0xc4, 0x9c, 0xe0, 0x08, 0x46, 0x15, 0x06, 0xd7, + 0x25, 0x80, 0xa2, 0x24, 0xb4, 0x4e, 0xc1, 0xc9, 0x3e, 0xdf, 0x6c, 0x3d, 0xc4, 0xe7, 0xe0, 0x3e, + 0x35, 0x92, 0xaf, 0xc0, 0x31, 0x24, 0x5c, 0xf6, 0x3b, 0x1d, 0xda, 0x88, 0x70, 0x3b, 0x92, 0x2a, + 0xd4, 0x02, 0xb7, 0x39, 0xe0, 0xed, 0x6d, 0x28, 0x04, 0x27, 0xa9, 0x49, 0xcd, 0xe4, 0x60, 0xfd, + 0x6c, 0x1e, 0x16, 0xc4, 0x0e, 0x67, 0xd3, 0x86, 0x1f, 0x34, 0x9f, 0xfd, 0x13, 0x75, 0xc5, 0x38, + 0x51, 0xcf, 0xab, 0x18, 0x14, 0x59, 0x8d, 0x1c, 0x70, 0xa0, 0xfe, 0x4a, 0x0e, 0x5e, 0x18, 0x44, + 0xc4, 0x7a, 0x47, 0xc5, 0xcd, 0x9a, 0x48, 0xc5, 0xc7, 0xea, 0xc2, 0x3c, 0x0e, 0xe8, 0xf2, 0x1e, + 0x6d, 0x3c, 0x08, 0x57, 0xfd, 0x30, 0x42, 0x93, 0xf4, 0x7c, 0x9f, 0x07, 0xcb, 0xd7, 0x33, 0x1f, + 0x2c, 0x4f, 0xf0, 0x59, 0xd6, 0x40, 0x1e, 0x3c, 0xb2, 0xd7, 0x03, 0x7a, 0x10, 0xda, 0x59, 0xac, + 0xd1, 0xbc, 0xb8, 0xd2, 0x8b, 0xf6, 0x36, 0x03, 0xba, 0x43, 0x03, 0xda, 0x69, 0xd0, 0x1f, 0x32, + 0xf3, 0x62, 0xb3, 0x71, 0x43, 0x69, 0x30, 0x7e, 0x65, 0x0a, 0x8e, 0x65, 0x91, 0xb1, 0x7e, 0xd1, + 0x2e, 0xcd, 0xc9, 0xa4, 0x67, 0x7f, 0x3e, 0x07, 0x53, 0x75, 0xda, 0xf0, 0x3b, 0xcd, 0x1b, 0x68, + 0x16, 0x22, 0x7a, 0xc7, 0xe1, 0x42, 0x03, 0x83, 0x3b, 0x3b, 0x09, 0x7b, 0x91, 0x8f, 0x0f, 0xcb, + 0x1f, 0x0c, 0x77, 0x57, 0x6d, 0xf8, 0x18, 0x47, 0x22, 0xc2, 0xa0, 0xdc, 0xaa, 0x0a, 0x7c, 0xe1, + 0x31, 0x2a, 0x25, 0x4b, 0x30, 0x2d, 0x96, 0xab, 0xaf, 0x87, 0x4d, 0xe3, 0x61, 0x3a, 0x64, 0x41, + 0x4a, 0xff, 0x68, 0x90, 0x90, 0x6b, 0x50, 0xb8, 0xbb, 0x78, 0x43, 0x8c, 0x81, 0x0c, 0x6b, 0x7e, + 0x77, 0xf1, 0x06, 0xaa, 0xc3, 0xd8, 0x15, 0x63, 0xba, 0xb7, 0x68, 0x58, 0x6a, 0xdc, 0x5d, 0xbc, + 0x41, 0xfe, 0x1c, 0x1c, 0xaf, 0x7a, 0xa1, 0xa8, 0x82, 0x1b, 0xba, 0x37, 0xd1, 0xb1, 0x6b, 0xac, + 0xcf, 0xec, 0xfd, 0x42, 0xe6, 0xec, 0x7d, 0xb1, 0xa9, 0x98, 0x38, 0xdc, 0x8a, 0xbe, 0x99, 0x0c, + 0x0f, 0x97, 0x5d, 0x0f, 0xf9, 0x08, 0x66, 0x50, 0x77, 0x8e, 0xb6, 0xff, 0x18, 0xd8, 0x77, 0xbc, + 0x4f, 0xcd, 0x9f, 0xcb, 0xac, 0xf9, 0x34, 0x77, 0x0f, 0x47, 0x0f, 0x02, 0x0c, 0x02, 0x6c, 0xdc, + 0xfa, 0x0d, 0xce, 0xe4, 0x16, 0xcc, 0x0a, 0xf1, 0x6b, 0x63, 0x67, 0x6b, 0x8f, 0x56, 0xdd, 0x03, + 0x61, 0x64, 0x81, 0x37, 0x3a, 0x21, 0xb3, 0x39, 0xfe, 0x8e, 0x13, 0xed, 0x51, 0xa7, 0xe9, 0x1a, + 0x82, 0x4a, 0x82, 0x90, 0x7c, 0x07, 0x26, 0xd7, 0xfc, 0x06, 0x93, 0xbc, 0x71, 0x67, 0xe0, 0x76, + 0x17, 0x1f, 0x62, 0x5a, 0x2d, 0x0e, 0x4e, 0x88, 0x53, 0x1f, 0x1f, 0x96, 0xdf, 0x7e, 0xd2, 0x49, + 0xa3, 0x55, 0x60, 0xeb, 0xb5, 0x91, 0x65, 0x28, 0xde, 0xa7, 0xdb, 0xac, 0xb5, 0xc9, 0x94, 0x3b, + 0x12, 0x2c, 0xcc, 0xaa, 0xc4, 0x2f, 0xc3, 0xac, 0x4a, 0xc0, 0x48, 0x00, 0x73, 0xd8, 0x3f, 0x9b, + 0x6e, 0x18, 0xee, 0xfb, 0x41, 0x13, 0x63, 0xab, 0xf7, 0x33, 0xe9, 0x58, 0xcc, 0xec, 0xfc, 0x17, + 0x78, 0xe7, 0x77, 0x35, 0x0e, 0xba, 0x00, 0x99, 0x62, 0x4f, 0xbe, 0x09, 0x33, 0xc2, 0xa7, 0xf9, + 0xce, 0x8d, 0x0a, 0xae, 0xca, 0x29, 0xc3, 0x3d, 0xce, 0x2c, 0xe4, 0x52, 0xaa, 0x70, 0x91, 0x96, + 0x1a, 0x28, 0xa7, 0xbd, 0xe3, 0x9a, 0xaf, 0x66, 0x3a, 0x09, 0xd9, 0x84, 0xc9, 0x2a, 0x7d, 0xe8, + 0x35, 0x28, 0x3a, 0xf1, 0x08, 0x23, 0x5a, 0x95, 0x33, 0x24, 0x2e, 0xe1, 0xba, 0x98, 0x26, 0x02, + 0xb8, 0x4b, 0x90, 0x69, 0x35, 0xa9, 0x10, 0xc9, 0x75, 0x28, 0xd4, 0xaa, 0x9b, 0xc2, 0x86, 0x56, + 0xfa, 0xc6, 0xd4, 0x9a, 0x9b, 0x32, 0xc3, 0x02, 0x1a, 0x41, 0x79, 0x4d, 0xc3, 0x02, 0xb7, 0x56, + 0xdd, 0x24, 0x3b, 0x30, 0x8d, 0x1d, 0xb0, 0x4a, 0x5d, 0xde, 0xb7, 0xb3, 0x7d, 0xfa, 0xf6, 0x72, + 0x66, 0xdf, 0x2e, 0xf0, 0xbe, 0xdd, 0x13, 0xd4, 0x46, 0xc8, 0x78, 0x9d, 0x2d, 0x13, 0x69, 0x45, + 0x1a, 0x0b, 0x19, 0xe8, 0x7c, 0x6b, 0x0d, 0x8d, 0x3c, 0x84, 0x48, 0x2b, 0xb3, 0x5e, 0xa8, 0xc8, + 0xeb, 0x7d, 0x4d, 0xf4, 0xd3, 0x7c, 0xc8, 0x97, 0x60, 0x64, 0xe3, 0x41, 0xe4, 0x2e, 0xcc, 0x19, + 0xfd, 0xc8, 0x40, 0xb2, 0xf9, 0xa8, 0x85, 0xf4, 0x1f, 0x18, 0x01, 0x84, 0x90, 0x86, 0x2c, 0xc2, + 0xf8, 0x66, 0xed, 0x5e, 0xbd, 0xe5, 0x47, 0x0b, 0x44, 0xdd, 0x93, 0x48, 0xd7, 0x7b, 0xe8, 0x84, + 0x2d, 0xdf, 0x4c, 0x85, 0x23, 0x11, 0xd9, 0xf0, 0xad, 0xba, 0x41, 0x73, 0xdf, 0x0d, 0xd0, 0xf7, + 0x72, 0xde, 0xa8, 0x56, 0x2b, 0xe1, 0xc3, 0xb7, 0x27, 0x00, 0x09, 0x87, 0x4c, 0x9d, 0x85, 0xd0, + 0x30, 0xcc, 0x89, 0x69, 0x22, 0x9a, 0x76, 0xe7, 0x46, 0xc5, 0xfa, 0x2f, 0x72, 0xb8, 0x61, 0x92, + 0x57, 0x31, 0xc6, 0x88, 0x7a, 0x3a, 0x43, 0x5d, 0xa9, 0xdb, 0x4d, 0x44, 0xf5, 0xe5, 0x28, 0xe4, + 0x75, 0x18, 0xbb, 0xe1, 0x36, 0x68, 0x24, 0x1f, 0x38, 0x11, 0x79, 0x07, 0x21, 0xba, 0x62, 0x95, + 0xe3, 0x30, 0x59, 0x8e, 0x4f, 0xa4, 0x4a, 0x9c, 0x83, 0x74, 0xb9, 0x22, 0xdf, 0x37, 0x51, 0x96, + 0x13, 0x13, 0x50, 0x4b, 0x52, 0x9a, 0xb0, 0x05, 0xce, 0xe4, 0x60, 0xfd, 0x71, 0x2e, 0xde, 0x01, + 0xc8, 0x2b, 0x30, 0x62, 0x6f, 0xaa, 0xef, 0xe7, 0x7e, 0x88, 0x89, 0xcf, 0x47, 0x04, 0xf2, 0x55, + 0x38, 0xae, 0xf1, 0x49, 0x19, 0x26, 0xbf, 0x8c, 0x8e, 0x72, 0xda, 0x97, 0x64, 0x5b, 0x27, 0x67, + 0xf3, 0x40, 0xc1, 0x35, 0x2e, 0xa8, 0xd2, 0x8e, 0xc7, 0x79, 0x6b, 0x8d, 0xd5, 0x79, 0x37, 0x11, + 0x21, 0xd9, 0xd8, 0x2c, 0x0e, 0xdc, 0x57, 0xce, 0xfa, 0x8d, 0x9c, 0xb1, 0xb2, 0x55, 0xb2, 0xc7, + 0xdc, 0x11, 0xc9, 0x1e, 0xdf, 0x02, 0xa8, 0xf4, 0x22, 0x7f, 0xa5, 0x13, 0xf8, 0x2d, 0xae, 0xb1, + 0x10, 0x81, 0xad, 0x51, 0x0f, 0x4b, 0x11, 0x6c, 0xb8, 0xf4, 0x28, 0xe4, 0x4c, 0x1b, 0xee, 0xc2, + 0x27, 0xb5, 0xe1, 0xb6, 0x7e, 0x37, 0x67, 0xcc, 0x6d, 0x26, 0x91, 0xc9, 0xe5, 0xa1, 0x99, 0xd8, + 0xa4, 0x97, 0x47, 0xbc, 0x38, 0xfe, 0xed, 0x1c, 0x9c, 0xe0, 0xc6, 0xd0, 0xeb, 0xbd, 0xf6, 0x36, + 0x0d, 0xee, 0xb9, 0x2d, 0xaf, 0xc9, 0x7d, 0x41, 0xb9, 0xb0, 0x79, 0x31, 0xbd, 0x50, 0xb2, 0xf1, + 0xf9, 0xa5, 0x90, 0x1b, 0x67, 0x3b, 0x1d, 0x2c, 0x74, 0x1e, 0xaa, 0x52, 0xfd, 0x52, 0x98, 0x4d, + 0x6f, 0xfd, 0x6a, 0x0e, 0x5e, 0x3c, 0xb2, 0x16, 0x72, 0x05, 0xc6, 0x65, 0x44, 0xf1, 0x1c, 0x76, + 0x3c, 0x1a, 0x26, 0xa6, 0xa3, 0x89, 0x4b, 0x2c, 0xf2, 0x35, 0x38, 0xae, 0xb3, 0xda, 0x0a, 0x5c, + 0x4f, 0x8f, 0xdb, 0x9d, 0xf1, 0xd5, 0x11, 0x43, 0x49, 0x4a, 0x46, 0xd9, 0x4c, 0xac, 0xff, 0x37, + 0xa7, 0xa5, 0x7f, 0x7d, 0x46, 0xe5, 0xe5, 0xeb, 0x86, 0xbc, 0x2c, 0xa3, 0xbb, 0xa9, 0x56, 0xb1, + 0xb2, 0xcc, 0x3b, 0xce, 0xac, 0x66, 0x60, 0x8b, 0x80, 0xef, 0xe5, 0x61, 0xf2, 0x6e, 0x48, 0x03, + 0xfe, 0x68, 0xfa, 0xc3, 0x15, 0xc5, 0x4b, 0xb5, 0x6b, 0xa8, 0x38, 0x4b, 0x7f, 0x98, 0x43, 0x65, + 0xba, 0x4e, 0xc1, 0x7a, 0x43, 0x4b, 0xf9, 0x84, 0xbd, 0x81, 0xc9, 0x9e, 0x10, 0xca, 0xc3, 0xfb, + 0xac, 0x99, 0xd9, 0xdf, 0x30, 0x05, 0xe0, 0x1a, 0xf9, 0x00, 0x46, 0xef, 0xa2, 0x6a, 0xd0, 0xf4, + 0xfb, 0x57, 0xfc, 0xb1, 0x90, 0x6f, 0xd2, 0xbd, 0xd0, 0x0c, 0x49, 0xc4, 0x09, 0x49, 0x1d, 0xc6, + 0x97, 0x03, 0x8a, 0xc9, 0x5c, 0x47, 0x86, 0xf7, 0x5d, 0x6d, 0x70, 0x92, 0xa4, 0xef, 0xaa, 0xe0, + 0x64, 0xfd, 0x4c, 0x1e, 0x48, 0xdc, 0x46, 0xcc, 0x5c, 0x12, 0x3e, 0xb3, 0x83, 0xfe, 0xbe, 0x31, + 0xe8, 0x67, 0x52, 0x83, 0xce, 0x9b, 0x37, 0xd4, 0xd8, 0xff, 0x56, 0x0e, 0x4e, 0x64, 0x13, 0x92, + 0xf3, 0x30, 0xb6, 0xb1, 0xb5, 0x29, 0x43, 0x47, 0x88, 0xa6, 0xf8, 0x5d, 0xbc, 0x97, 0xdb, 0xa2, + 0x88, 0xbc, 0x01, 0x63, 0x5f, 0xb6, 0x97, 0xd9, 0x39, 0xa4, 0xc5, 0xc6, 0xfe, 0x56, 0xe0, 0x34, + 0xcc, 0xa3, 0x48, 0x20, 0xe9, 0x63, 0x5b, 0x78, 0x6a, 0x63, 0xfb, 0x93, 0x79, 0x98, 0xad, 0x34, + 0x1a, 0x34, 0x0c, 0x99, 0x90, 0x43, 0xc3, 0xe8, 0x99, 0x1d, 0xd8, 0xec, 0xa0, 0x10, 0x46, 0xdb, + 0x86, 0x1a, 0xd5, 0xdf, 0xc9, 0xc1, 0x71, 0x49, 0xf5, 0xd0, 0xa3, 0xfb, 0x5b, 0x7b, 0x01, 0x0d, + 0xf7, 0xfc, 0x56, 0x73, 0xe8, 0x00, 0xfc, 0x4c, 0xd0, 0xc3, 0xa8, 0xba, 0xfa, 0x0b, 0xfa, 0x0e, + 0x42, 0x0c, 0x41, 0x8f, 0x47, 0xde, 0xbd, 0x02, 0xe3, 0x95, 0x6e, 0x37, 0xf0, 0x1f, 0xf2, 0x65, + 0x2f, 0x82, 0x8e, 0xb9, 0x1c, 0x64, 0xb8, 0xfe, 0x72, 0x10, 0xfb, 0x8c, 0x2a, 0xed, 0xf0, 0x70, + 0x5a, 0xd3, 0xfc, 0x33, 0x9a, 0xb4, 0xa3, 0xcb, 0xb0, 0x58, 0x6e, 0xd5, 0x81, 0x6c, 0x06, 0x7e, + 0xdb, 0x8f, 0x68, 0x93, 0xb7, 0x07, 0x3d, 0xa6, 0x8f, 0x0c, 0xbf, 0xb3, 0xe5, 0x45, 0x2d, 0x23, + 0xfc, 0x4e, 0xc4, 0x00, 0x36, 0x87, 0x5b, 0xff, 0xd7, 0x28, 0x4c, 0xe9, 0xbd, 0x43, 0x2c, 0x1e, + 0x55, 0xdb, 0x0f, 0x74, 0xb7, 0x7d, 0x17, 0x21, 0xb6, 0x28, 0x89, 0xa3, 0x5d, 0xe4, 0x8f, 0x8c, + 0x76, 0x71, 0x1f, 0xa6, 0x37, 0x03, 0x1f, 0xa3, 0xa3, 0xf1, 0x24, 0xdf, 0x7c, 0x2b, 0x9c, 0xd7, + 0xee, 0x78, 0x6c, 0x20, 0xf1, 0xed, 0x11, 0x35, 0x1c, 0x5d, 0x81, 0xed, 0x24, 0x53, 0x80, 0x9b, + 0x7c, 0xb8, 0x59, 0x83, 0x1b, 0x8a, 0x10, 0x87, 0xca, 0xac, 0x81, 0x41, 0x4c, 0xb3, 0x06, 0x06, + 0xd1, 0xd7, 0xda, 0xe8, 0xd3, 0x5a, 0x6b, 0xe4, 0x67, 0x72, 0x30, 0x59, 0xe9, 0x74, 0x44, 0x14, + 0x8d, 0x23, 0xdc, 0x88, 0xbf, 0x26, 0x2c, 0x1b, 0xde, 0xfe, 0x44, 0x96, 0x0d, 0x28, 0xb7, 0x84, + 0x28, 0xa9, 0xc6, 0x15, 0xea, 0xb7, 0x1c, 0xed, 0x3b, 0xc8, 0xdb, 0x50, 0x52, 0x93, 0xbc, 0xd6, + 0x69, 0xd2, 0x47, 0x94, 0x67, 0x25, 0x9a, 0x16, 0xc1, 0x4d, 0x75, 0xc9, 0x34, 0x89, 0x48, 0xb6, + 0x00, 0x5c, 0x35, 0xbb, 0x12, 0xe9, 0xd5, 0xd2, 0xd3, 0x4f, 0x48, 0xcf, 0xf8, 0x1b, 0x1f, 0x8f, + 0x74, 0xe9, 0x39, 0xe6, 0x43, 0xda, 0x30, 0xcb, 0x73, 0x9b, 0x61, 0xce, 0x73, 0x8c, 0xe1, 0x0d, + 0x47, 0x8e, 0xc3, 0x2b, 0x42, 0x57, 0xf5, 0xbc, 0xc8, 0x98, 0x86, 0x69, 0xd4, 0x9d, 0x8c, 0x80, + 0xde, 0x49, 0xde, 0x3c, 0x94, 0xac, 0x7d, 0x32, 0xfd, 0xbd, 0x7c, 0xd2, 0xff, 0x64, 0x0e, 0x4e, + 0xe8, 0x93, 0xbe, 0xde, 0xdb, 0x6e, 0x7b, 0x78, 0x17, 0x24, 0x97, 0x61, 0x42, 0xcc, 0x49, 0x75, + 0x89, 0x4a, 0x87, 0x22, 0x8f, 0x51, 0xc8, 0x0a, 0x9b, 0x86, 0x8c, 0x87, 0x90, 0xba, 0xe7, 0x13, + 0xfb, 0x14, 0x2b, 0x8a, 0xf3, 0x66, 0x06, 0xf8, 0xdb, 0x9c, 0x9f, 0x0c, 0x62, 0xbd, 0x07, 0x73, + 0xe6, 0x48, 0xd4, 0x69, 0x44, 0x2e, 0xc1, 0xb8, 0x1c, 0xbe, 0x5c, 0xf6, 0xf0, 0xc9, 0x72, 0xeb, + 0x3e, 0x90, 0x14, 0x7d, 0x88, 0x26, 0x48, 0x34, 0x92, 0x26, 0x72, 0xf2, 0x01, 0x30, 0x85, 0xb8, + 0x34, 0x2f, 0xbe, 0x6f, 0xd2, 0xb0, 0xe3, 0x66, 0xa4, 0xd6, 0x1f, 0xcf, 0xc0, 0x7c, 0xc6, 0x9e, + 0x7b, 0x84, 0x4c, 0x54, 0x36, 0x37, 0x88, 0x09, 0x15, 0x85, 0x40, 0x6e, 0x0b, 0xef, 0xc9, 0x9c, + 0xff, 0x03, 0xb6, 0x03, 0x6e, 0xc5, 0x9f, 0xd8, 0x05, 0x38, 0xd9, 0x67, 0x22, 0x17, 0xe9, 0x81, + 0x42, 0x46, 0x9f, 0x5a, 0xa0, 0x90, 0x25, 0x98, 0x16, 0xad, 0x12, 0xdb, 0x95, 0x66, 0x4d, 0x1a, + 0xf0, 0x02, 0x27, 0xb5, 0x6d, 0x99, 0x24, 0x9c, 0x47, 0xe8, 0xb7, 0x1e, 0x52, 0xc1, 0x63, 0x5c, + 0xe7, 0x81, 0x05, 0x99, 0x3c, 0x34, 0x12, 0xf2, 0x1f, 0x63, 0x5e, 0x25, 0x84, 0xe8, 0x7b, 0x56, + 0x71, 0xd0, 0x9e, 0xd5, 0x7c, 0x3a, 0x7b, 0xd6, 0x19, 0xf9, 0x8d, 0xd9, 0x7b, 0x57, 0xc6, 0x67, + 0x91, 0x5f, 0xce, 0xc1, 0x1c, 0x8f, 0x56, 0xa1, 0x7f, 0xec, 0xc0, 0x08, 0x04, 0x8d, 0xa7, 0xf3, + 0xb1, 0x2f, 0x88, 0x7c, 0x22, 0xd9, 0xdf, 0x9a, 0xfe, 0x28, 0xf2, 0x23, 0x00, 0x6a, 0x45, 0xf1, + 0x70, 0x8e, 0x93, 0x8b, 0x2f, 0x64, 0xec, 0x02, 0x0a, 0x29, 0x8e, 0x7d, 0x1e, 0x29, 0x3a, 0x23, + 0x9b, 0x96, 0x82, 0x92, 0x3f, 0x07, 0xc7, 0xd8, 0x7a, 0x51, 0x10, 0x11, 0x5b, 0x67, 0x61, 0x12, + 0x6b, 0xf9, 0x7c, 0x7f, 0x99, 0xe8, 0x72, 0x16, 0x19, 0x0f, 0xfe, 0x19, 0x27, 0x36, 0x8d, 0x74, + 0x37, 0xfc, 0xcc, 0x8a, 0x30, 0x58, 0x15, 0x7e, 0x3d, 0x8f, 0x4f, 0xde, 0x67, 0x7f, 0x3b, 0x25, + 0xd7, 0x02, 0xdf, 0xdf, 0x42, 0xd3, 0xa9, 0x13, 0x41, 0xe4, 0xcb, 0x40, 0x54, 0x98, 0x07, 0x0e, + 0xa3, 0x32, 0x76, 0x39, 0x57, 0xed, 0xc6, 0xe1, 0x22, 0x02, 0x59, 0xac, 0x4f, 0x92, 0x34, 0x31, + 0xa1, 0x70, 0x4c, 0x34, 0x9a, 0x41, 0x65, 0xd2, 0xa3, 0x70, 0x61, 0xc6, 0x88, 0x5c, 0x14, 0x97, + 0xc4, 0x19, 0x50, 0xb5, 0xcc, 0x49, 0x86, 0xca, 0x29, 0x8b, 0x1d, 0xb9, 0x0e, 0x13, 0xe8, 0x59, + 0xb9, 0x2a, 0x0d, 0xab, 0x84, 0x91, 0x07, 0xfa, 0x60, 0x3a, 0x7b, 0xa6, 0x79, 0x54, 0x8c, 0xca, + 0xae, 0x03, 0xd5, 0xe0, 0xc0, 0xee, 0x75, 0x50, 0x01, 0x2b, 0xf4, 0x1d, 0xcd, 0xe0, 0xc0, 0x09, + 0x7a, 0xa6, 0xeb, 0x2d, 0x22, 0x91, 0x6f, 0xc2, 0xe4, 0x1d, 0xf7, 0x91, 0xd4, 0xbf, 0x0a, 0x25, + 0xeb, 0xa0, 0x1d, 0xc8, 0x92, 0xad, 0x69, 0xbb, 0x8f, 0x9c, 0x66, 0x2f, 0x19, 0x7a, 0x14, 0xb7, + 0x21, 0x9d, 0x25, 0xf9, 0x3a, 0x80, 0xa6, 0x15, 0x26, 0x47, 0x56, 0xf0, 0xa2, 0x8c, 0xc5, 0x95, + 0xa9, 0x2d, 0x46, 0xfe, 0x1a, 0xc3, 0x84, 0xe4, 0x70, 0xec, 0xb3, 0x93, 0x1c, 0x8e, 0x7f, 0x76, + 0x92, 0xc3, 0xe9, 0x6d, 0x38, 0xd5, 0x77, 0xe9, 0x64, 0x04, 0x48, 0xbd, 0x62, 0x06, 0x48, 0x3d, + 0xd5, 0xef, 0x88, 0x0d, 0xcd, 0x70, 0xf7, 0xf3, 0xa5, 0x63, 0xfd, 0xa5, 0x93, 0x1f, 0xe4, 0x13, + 0x47, 0xae, 0xb8, 0x58, 0xf0, 0xf4, 0x28, 0xfd, 0x64, 0x92, 0x3c, 0x66, 0xc4, 0xe4, 0x87, 0x72, + 0x3e, 0xbe, 0xd0, 0x24, 0x92, 0x88, 0xf3, 0xe3, 0xf9, 0xd3, 0x9e, 0xbe, 0xef, 0xc0, 0x0c, 0x4f, + 0x62, 0x77, 0x9b, 0x1e, 0xec, 0xfb, 0x41, 0x53, 0x66, 0x8a, 0x46, 0x19, 0x3c, 0x95, 0x81, 0x36, + 0x81, 0x4b, 0xaa, 0xd2, 0x59, 0x6f, 0x14, 0x6b, 0x3f, 0x95, 0xb9, 0x8b, 0x31, 0x84, 0x41, 0x7e, + 0x7c, 0xe4, 0x4d, 0x25, 0xa8, 0xd1, 0x40, 0x0f, 0x7a, 0x1f, 0x48, 0x60, 0x86, 0xbc, 0x46, 0x03, + 0xeb, 0xf7, 0x0b, 0x40, 0x78, 0x4d, 0xcb, 0x6e, 0xd7, 0x45, 0x57, 0x56, 0x0f, 0x83, 0xc0, 0x94, + 0x04, 0x8e, 0xbb, 0xdd, 0xa2, 0x7a, 0x04, 0x25, 0x61, 0xc8, 0xaa, 0xca, 0x9c, 0xe4, 0x45, 0x27, + 0x45, 0xd8, 0x67, 0xab, 0xcb, 0x7f, 0x9a, 0xad, 0xee, 0x9b, 0xf0, 0x7c, 0xa5, 0x8b, 0xd9, 0x30, + 0x65, 0x2d, 0x37, 0xfc, 0x40, 0x6e, 0x52, 0x86, 0x93, 0x94, 0xab, 0xd0, 0x52, 0x5f, 0x3a, 0x88, + 0x85, 0x26, 0xa7, 0xb0, 0x79, 0xd9, 0x8d, 0x74, 0xa7, 0x7b, 0x29, 0xa7, 0x74, 0xb1, 0x24, 0x43, + 0x4e, 0xe1, 0x24, 0x92, 0x87, 0x17, 0x48, 0x39, 0x05, 0xd3, 0xbc, 0xc4, 0x3c, 0xbc, 0x80, 0xf6, + 0x91, 0x75, 0x14, 0x09, 0x79, 0x07, 0x26, 0x2b, 0xbd, 0xc8, 0x17, 0x8c, 0x85, 0x05, 0x76, 0x6c, + 0x2b, 0x2d, 0x3e, 0xc5, 0xb8, 0xfa, 0xc4, 0xe8, 0xd6, 0x1f, 0x15, 0xe0, 0x54, 0x7a, 0x78, 0x45, + 0xa9, 0x5a, 0x1f, 0xb9, 0x23, 0xd6, 0x47, 0xd6, 0x6c, 0xc8, 0xc7, 0x41, 0xc8, 0x9f, 0xc6, 0x6c, + 0xe0, 0x49, 0x35, 0x3f, 0xe1, 0x6c, 0xa8, 0xc3, 0xa4, 0x7e, 0xde, 0x8d, 0x7c, 0xd2, 0xf3, 0x4e, + 0xe7, 0xc2, 0x2e, 0xf5, 0x3c, 0xd6, 0xc0, 0x68, 0xfc, 0x74, 0x94, 0x0c, 0x33, 0xc0, 0x31, 0xc8, + 0xbf, 0x05, 0xe7, 0xf8, 0x9e, 0x94, 0x6c, 0xec, 0xd2, 0x81, 0xe4, 0x28, 0x06, 0x6e, 0xf1, 0xf1, + 0x61, 0xf9, 0x32, 0x57, 0x95, 0x38, 0xa9, 0x6e, 0x73, 0xb6, 0x0f, 0x1c, 0xf9, 0x65, 0x5a, 0x25, + 0x47, 0xf2, 0xb6, 0x96, 0xe1, 0x94, 0x28, 0x8d, 0xbd, 0x5c, 0x65, 0x21, 0x1b, 0xe4, 0x07, 0xb1, + 0xb6, 0x0b, 0x07, 0x39, 0xa1, 0xc8, 0xc2, 0x72, 0x4c, 0xc7, 0xa9, 0xa5, 0x4a, 0x7c, 0x23, 0xcb, + 0xbf, 0x85, 0x07, 0x12, 0xe6, 0x60, 0xd3, 0xb5, 0x45, 0xea, 0xd4, 0xf2, 0x99, 0x3a, 0x35, 0xa9, + 0x94, 0x29, 0x64, 0x2a, 0x65, 0xaa, 0x30, 0x5b, 0xef, 0x6d, 0xcb, 0xba, 0x93, 0x0e, 0x6e, 0x61, + 0x6f, 0x3b, 0xab, 0x57, 0x92, 0x24, 0xd6, 0x5f, 0xca, 0xc3, 0xd4, 0x66, 0xab, 0xb7, 0xeb, 0x75, + 0xaa, 0x6e, 0xe4, 0x3e, 0xb3, 0x6a, 0xbe, 0xb7, 0x0c, 0x35, 0x9f, 0x72, 0xe3, 0x52, 0x0d, 0x1b, + 0x4a, 0xc7, 0xf7, 0xd3, 0x39, 0x98, 0x8d, 0x49, 0xf8, 0x61, 0xbd, 0x0a, 0x23, 0xec, 0x87, 0xb8, + 0xfc, 0x9e, 0x4b, 0x31, 0xe6, 0xf9, 0xb9, 0xd4, 0x5f, 0x42, 0xf1, 0x66, 0x26, 0xbf, 0x41, 0x0e, + 0xa7, 0xbf, 0x00, 0x13, 0x31, 0xdb, 0x27, 0xc9, 0xcb, 0xf5, 0x6b, 0x39, 0x28, 0x25, 0x5b, 0x42, + 0x6e, 0xc3, 0x38, 0xe3, 0xe4, 0x51, 0x79, 0x2f, 0x7f, 0xa9, 0x4f, 0x9b, 0x2f, 0x0b, 0x34, 0xfe, + 0x79, 0xd8, 0xf9, 0x94, 0x43, 0x6c, 0xc9, 0xe1, 0xb4, 0x0d, 0x53, 0x3a, 0x56, 0xc6, 0xd7, 0xbd, + 0x6e, 0x4a, 0x28, 0x27, 0xb2, 0xfb, 0xc1, 0xc8, 0x26, 0x66, 0x7c, 0xb5, 0x10, 0x3e, 0x2e, 0x18, + 0x93, 0x2b, 0x73, 0x55, 0xe1, 0xa4, 0x59, 0x8c, 0x63, 0x9b, 0xeb, 0xf3, 0x2c, 0x63, 0x42, 0x2b, + 0x3c, 0xf2, 0x3a, 0x8c, 0xf1, 0xfa, 0xf4, 0xac, 0x3a, 0x5d, 0x84, 0xe8, 0x72, 0x32, 0xc7, 0xb1, + 0xfe, 0x46, 0x01, 0x4e, 0xc4, 0x9f, 0x77, 0xb7, 0xdb, 0x74, 0x23, 0xba, 0xe9, 0x06, 0x6e, 0x3b, + 0x3c, 0x62, 0x05, 0x5c, 0x4c, 0x7d, 0x1a, 0x66, 0x59, 0x91, 0x9f, 0xa6, 0x7d, 0x90, 0x95, 0xf8, + 0x20, 0xd4, 0x81, 0xf2, 0x0f, 0x92, 0x9f, 0x41, 0x6e, 0x43, 0xa1, 0x4e, 0x23, 0xb1, 0xf7, 0x5e, + 0x48, 0xf5, 0xaa, 0xfe, 0x5d, 0x97, 0xeb, 0x34, 0xe2, 0x83, 0xc8, 0x03, 0xe9, 0x50, 0x23, 0x74, + 0x6a, 0x9d, 0x46, 0xe4, 0x3e, 0x8c, 0xad, 0x3c, 0xea, 0xd2, 0x46, 0x24, 0xb2, 0xca, 0x5d, 0x1a, + 0xcc, 0x8f, 0xe3, 0x6a, 0x49, 0xe5, 0x28, 0x02, 0xf4, 0xce, 0xe2, 0x28, 0xa7, 0xaf, 0x43, 0x51, + 0x56, 0xfe, 0x24, 0x33, 0xf7, 0xf4, 0x5b, 0x30, 0xa9, 0x55, 0xf2, 0x44, 0x93, 0xfe, 0x17, 0xd8, + 0xbe, 0xea, 0xb7, 0x64, 0x22, 0xba, 0x95, 0x94, 0xac, 0x98, 0xd3, 0x13, 0xa4, 0xb3, 0x12, 0xe7, + 0x81, 0x28, 0x1a, 0x20, 0x34, 0xd6, 0x60, 0xb6, 0xfe, 0xc0, 0xeb, 0xc6, 0x11, 0x2c, 0x8d, 0x13, + 0x19, 0xb3, 0x4e, 0x88, 0x8b, 0x7b, 0xf2, 0x44, 0x4e, 0xd2, 0x59, 0x7f, 0x92, 0x83, 0x31, 0xf6, + 0xd7, 0xbd, 0xeb, 0xcf, 0xe8, 0x96, 0x79, 0xcd, 0xd8, 0x32, 0xe7, 0xb4, 0xf0, 0xd1, 0xb8, 0x71, + 0x5c, 0x3f, 0x62, 0xb3, 0x3c, 0x14, 0x03, 0xc4, 0x91, 0xc9, 0x4d, 0x18, 0x17, 0xe6, 0x3b, 0xc2, + 0xce, 0x5a, 0x8f, 0x47, 0x2d, 0x0d, 0x7b, 0xd4, 0x0d, 0xdf, 0xef, 0x26, 0x55, 0x22, 0x92, 0x9a, + 0xc9, 0xf5, 0x32, 0x96, 0xa8, 0x91, 0xbe, 0xd4, 0x47, 0xc7, 0x38, 0x1e, 0x4f, 0x59, 0x4b, 0x38, + 0xdc, 0xc7, 0x6d, 0xbe, 0x22, 0x5e, 0x43, 0x0a, 0x83, 0x98, 0x9c, 0x90, 0xd9, 0x1d, 0x33, 0x1f, + 0x4a, 0xfe, 0xf1, 0x71, 0x1e, 0x89, 0x58, 0x7e, 0xd8, 0xbb, 0x30, 0x75, 0xc3, 0x0f, 0xf6, 0xdd, + 0x80, 0xc7, 0x97, 0x14, 0xe6, 0x07, 0xec, 0xfe, 0x39, 0xbd, 0xc3, 0xe1, 0x3c, 0x42, 0xe5, 0xc7, + 0x87, 0xe5, 0x91, 0x25, 0xdf, 0x6f, 0xd9, 0x06, 0x3a, 0xd9, 0x80, 0xe9, 0x3b, 0xee, 0x23, 0xed, + 0xe6, 0xcc, 0x3d, 0x5d, 0x2e, 0xb1, 0x09, 0xcc, 0xae, 0xde, 0x47, 0xdb, 0x52, 0x99, 0xf4, 0xc4, + 0x83, 0x99, 0x4d, 0x3f, 0x88, 0x44, 0x25, 0x5e, 0x67, 0x57, 0x34, 0x36, 0x6d, 0x0d, 0x76, 0x25, + 0xd3, 0x1a, 0xec, 0x54, 0xd7, 0x0f, 0x22, 0x67, 0x47, 0x91, 0x1b, 0x11, 0xa8, 0x0c, 0xc6, 0xe4, + 0x5d, 0x98, 0xd3, 0x22, 0xec, 0xdd, 0xf0, 0x83, 0xb6, 0x2b, 0x25, 0x7b, 0x54, 0x26, 0xa3, 0xd1, + 0xca, 0x0e, 0x82, 0xed, 0x34, 0x26, 0xf9, 0x6a, 0x96, 0xef, 0xd0, 0x68, 0x6c, 0x4e, 0x96, 0xe1, + 0x3b, 0xd4, 0xcf, 0x9c, 0x2c, 0xed, 0x45, 0xb4, 0x3b, 0xc8, 0xdc, 0xb4, 0xb8, 0x74, 0x55, 0xdc, + 0xe1, 0x8f, 0x36, 0x27, 0x55, 0xe3, 0xd6, 0xc7, 0xac, 0x74, 0x11, 0x0a, 0x4b, 0x9b, 0x37, 0xf0, + 0x09, 0x44, 0x5a, 0xeb, 0x74, 0xf6, 0xdc, 0x4e, 0x03, 0x25, 0x6e, 0x61, 0xe2, 0xad, 0xef, 0xc8, + 0x4b, 0x9b, 0x37, 0x88, 0x0b, 0xf3, 0x9b, 0x34, 0x68, 0x7b, 0xd1, 0x57, 0xae, 0x5e, 0xd5, 0x06, + 0xaa, 0x88, 0x9f, 0x76, 0x45, 0x7c, 0x5a, 0xb9, 0x8b, 0x28, 0xce, 0xa3, 0xab, 0x57, 0x33, 0x87, + 0x43, 0x7d, 0x58, 0x16, 0x2f, 0xb6, 0x33, 0xde, 0x71, 0x1f, 0xc5, 0x96, 0xf9, 0xa1, 0xf0, 0xc2, + 0x3c, 0x23, 0x27, 0x56, 0x6c, 0xd5, 0x6f, 0xec, 0x8c, 0x26, 0x11, 0xbb, 0x30, 0xc5, 0xd3, 0x2b, + 0x14, 0xfe, 0x2b, 0xa7, 0xa5, 0x5e, 0x48, 0xba, 0xea, 0xea, 0x52, 0xbf, 0x86, 0x4e, 0xee, 0xaa, + 0x6b, 0x1f, 0xbf, 0x36, 0x89, 0xdc, 0x85, 0x57, 0xf4, 0x6b, 0x1f, 0xd7, 0xc6, 0x18, 0xcd, 0x9a, + 0x55, 0xba, 0x02, 0xee, 0xaa, 0x60, 0x9b, 0x5c, 0xd2, 0xb7, 0xc9, 0xa9, 0x27, 0xbf, 0x4d, 0x52, + 0x18, 0x59, 0xf3, 0x1b, 0x0f, 0x44, 0xd8, 0xac, 0x2f, 0xb3, 0xe5, 0xde, 0xf2, 0x1b, 0x0f, 0x9e, + 0x9e, 0x19, 0x2d, 0xb2, 0x27, 0xeb, 0xec, 0x53, 0xd9, 0x2c, 0x10, 0x7d, 0x22, 0x4c, 0x33, 0x8f, + 0xa9, 0xeb, 0x94, 0x56, 0xc6, 0x05, 0x1f, 0x3e, 0x69, 0x64, 0xd7, 0xda, 0x26, 0x39, 0xa1, 0x50, + 0xaa, 0xd2, 0xf0, 0x41, 0xe4, 0x77, 0x97, 0x5b, 0x5e, 0x77, 0xdb, 0x77, 0x03, 0x19, 0xcc, 0x34, + 0xbd, 0xbe, 0x5f, 0xc9, 0x5c, 0xdf, 0x73, 0x4d, 0x4e, 0xef, 0x34, 0x24, 0x03, 0x3b, 0xc5, 0x92, + 0x7c, 0x15, 0x66, 0xd8, 0xe4, 0x5e, 0x79, 0x14, 0xd1, 0x0e, 0x1f, 0xf9, 0x39, 0x14, 0x1d, 0x8e, + 0x69, 0x71, 0xfb, 0x55, 0x21, 0x9f, 0x53, 0xb8, 0xd8, 0xa9, 0x22, 0x30, 0x42, 0x8e, 0x19, 0xac, + 0x48, 0x13, 0x16, 0xee, 0xb8, 0x8f, 0xb4, 0x8c, 0x8b, 0xda, 0x24, 0x25, 0x38, 0xc1, 0x2e, 0x3e, + 0x3e, 0x2c, 0xbf, 0xc4, 0x26, 0x58, 0x1c, 0x5f, 0xb7, 0xcf, 0x7c, 0xed, 0xcb, 0x89, 0x7c, 0x07, + 0x4e, 0x8a, 0x66, 0x55, 0x31, 0x99, 0x8d, 0x1f, 0x1c, 0xd4, 0xf7, 0x5c, 0x74, 0xca, 0x99, 0x7f, + 0xb2, 0x0d, 0x51, 0x76, 0x58, 0x53, 0xf2, 0x71, 0x42, 0xce, 0xc8, 0xee, 0x57, 0x03, 0xf9, 0x08, + 0x66, 0xf8, 0xbb, 0xcf, 0xaa, 0x1f, 0x46, 0xa8, 0x15, 0x38, 0xf6, 0x64, 0xb6, 0xe6, 0xfc, 0x31, + 0x89, 0x7b, 0x67, 0x24, 0xb4, 0x08, 0x09, 0xce, 0xe4, 0x6d, 0x98, 0xdc, 0xf4, 0x3a, 0x3c, 0x28, + 0x60, 0x6d, 0x13, 0xf5, 0x97, 0xe2, 0xfc, 0xe9, 0x7a, 0x1d, 0x47, 0x5e, 0xcd, 0xbb, 0x6a, 0xbb, + 0xd0, 0xb1, 0xc9, 0x7d, 0x98, 0xac, 0xd7, 0x57, 0x6f, 0x78, 0xec, 0x00, 0xec, 0x1e, 0x2c, 0x9c, + 0xe8, 0xf3, 0x95, 0xe7, 0x33, 0xbf, 0x72, 0x3a, 0x0c, 0xf7, 0x30, 0x8b, 0xbd, 0xd3, 0xf0, 0xbb, + 0x07, 0xb6, 0xce, 0x29, 0xc3, 0xfe, 0xfa, 0xe4, 0x53, 0xb6, 0xbf, 0xae, 0xc1, 0xac, 0x66, 0xa5, + 0x89, 0x16, 0x9a, 0x0b, 0x71, 0x24, 0x19, 0xdd, 0xde, 0x3a, 0xe9, 0x6f, 0x98, 0xa4, 0x93, 0x86, + 0xd7, 0xa7, 0x9e, 0xd4, 0xf0, 0xda, 0x83, 0x39, 0x3e, 0x18, 0x62, 0x1e, 0xe0, 0x48, 0x9f, 0xee, + 0xd3, 0x87, 0x97, 0x32, 0xfb, 0x70, 0x5e, 0x8c, 0xb4, 0x9c, 0x64, 0xf8, 0xce, 0x99, 0xe6, 0x4a, + 0x76, 0x80, 0x08, 0xa0, 0xc8, 0xa1, 0x8f, 0x75, 0x3d, 0xdf, 0xa7, 0xae, 0x97, 0x32, 0xeb, 0x9a, + 0x91, 0x75, 0x6d, 0xf3, 0x6a, 0x32, 0x38, 0x92, 0x8e, 0xac, 0x47, 0xce, 0x2f, 0xec, 0xd8, 0x17, + 0x0c, 0x65, 0x6a, 0x1a, 0x81, 0x47, 0xe4, 0x4d, 0x4e, 0xda, 0x64, 0xbf, 0x67, 0x70, 0x26, 0x8f, + 0xe0, 0x44, 0xfa, 0x2b, 0xb0, 0xce, 0x33, 0x58, 0xe7, 0x19, 0xa3, 0xce, 0x24, 0x12, 0x9f, 0x37, + 0x66, 0xb3, 0x92, 0xb5, 0xf6, 0xe1, 0x4f, 0xfe, 0x42, 0x0e, 0x4e, 0xde, 0xb9, 0x51, 0xc1, 0xd4, + 0x71, 0x1e, 0x8f, 0x11, 0xa5, 0xfc, 0x34, 0xcf, 0x0a, 0x85, 0x7b, 0xf2, 0x11, 0x40, 0x4a, 0x1c, + 0xb8, 0x55, 0x30, 0x19, 0xf1, 0x7c, 0x7b, 0xc7, 0xe5, 0x19, 0xe9, 0x04, 0x8b, 0x0c, 0x67, 0xce, + 0x9f, 0xfb, 0x83, 0x72, 0xce, 0xee, 0x57, 0x15, 0x69, 0xc1, 0x69, 0xb3, 0x5b, 0xa4, 0x69, 0xfc, + 0x1e, 0x6d, 0xb5, 0x16, 0xca, 0x38, 0xa3, 0x5f, 0x7f, 0x7c, 0x58, 0xbe, 0x98, 0xea, 0x5d, 0x65, + 0x6e, 0xcf, 0x30, 0xb5, 0x06, 0x0f, 0xe0, 0x77, 0x6b, 0xa4, 0x38, 0x5d, 0x9a, 0xc9, 0xb2, 0x51, + 0xff, 0xcd, 0x7c, 0xe2, 0xa4, 0x22, 0x35, 0x18, 0x17, 0x13, 0x50, 0x88, 0xee, 0xe9, 0x69, 0x76, + 0x26, 0x73, 0x9a, 0x8d, 0x8b, 0xb9, 0x6c, 0x4b, 0x7a, 0xb2, 0xcf, 0x58, 0xe1, 0x57, 0x88, 0xbb, + 0xce, 0xd7, 0xf9, 0x41, 0x84, 0x20, 0xe3, 0xc8, 0xad, 0x3e, 0xb9, 0xbb, 0x93, 0xe9, 0x4d, 0x87, + 0x67, 0xaf, 0xac, 0x8d, 0x3c, 0xe0, 0xd9, 0x4d, 0x0a, 0xca, 0x67, 0xc6, 0x4c, 0x65, 0xf2, 0xd4, + 0x2a, 0x64, 0xb5, 0x58, 0xbf, 0x91, 0x83, 0x69, 0xe3, 0xa8, 0x23, 0xd7, 0x35, 0x87, 0xb0, 0xd8, + 0x47, 0xda, 0xc0, 0xc1, 0xdd, 0x2f, 0xe9, 0x2a, 0x76, 0x5d, 0x58, 0x9c, 0xe7, 0xfb, 0xd3, 0xe1, + 0xec, 0x4f, 0xfa, 0x07, 0x0e, 0xd6, 0x0c, 0xaa, 0x6c, 0x69, 0x23, 0x7d, 0xb2, 0xa5, 0xfd, 0xbd, + 0xe7, 0x61, 0xc6, 0xbc, 0x0b, 0x91, 0xd7, 0x61, 0x0c, 0xb5, 0xb2, 0xf2, 0x62, 0xcd, 0xb3, 0xcc, + 0xfb, 0x89, 0xc4, 0x9f, 0x02, 0x87, 0xbc, 0x0c, 0xa0, 0x4c, 0x7f, 0xe5, 0x9b, 0xc4, 0xe8, 0xe3, + 0xc3, 0x72, 0xee, 0x0d, 0x5b, 0x2b, 0x20, 0xdf, 0x00, 0x58, 0xf7, 0x9b, 0x54, 0xa5, 0x96, 0x1c, + 0xf0, 0xee, 0xfe, 0x4a, 0x2a, 0xf2, 0xff, 0xf1, 0x8e, 0xdf, 0xa4, 0xe9, 0x30, 0xff, 0x1a, 0x47, + 0xf2, 0x25, 0x18, 0xb5, 0x7b, 0xec, 0x12, 0xcf, 0xf5, 0x27, 0x93, 0xf2, 0xc8, 0xe9, 0xb5, 0x68, + 0x7c, 0x43, 0x0c, 0x7a, 0x49, 0x93, 0x32, 0x06, 0x20, 0xef, 0xf3, 0x8c, 0x00, 0x22, 0x9c, 0xde, + 0x68, 0xfc, 0x4a, 0xa3, 0x89, 0x22, 0xa9, 0x80, 0x7a, 0x1a, 0x09, 0xd9, 0x80, 0x71, 0xfd, 0x79, + 0x41, 0xf3, 0x2c, 0xd6, 0x9f, 0xa0, 0xb4, 0xeb, 0xa6, 0xc8, 0x49, 0x99, 0x7c, 0x79, 0x90, 0x5c, + 0xc8, 0x3b, 0x30, 0xc1, 0xd8, 0xb3, 0xa5, 0x1c, 0x8a, 0x6b, 0x06, 0xbe, 0xc5, 0x68, 0x1f, 0xc4, + 0xb6, 0x03, 0x23, 0xe8, 0x9d, 0x22, 0x20, 0x5f, 0xc5, 0x6c, 0x87, 0xa2, 0xab, 0x07, 0xda, 0x63, + 0x5c, 0x48, 0x75, 0x35, 0xa6, 0x3f, 0x4c, 0xa7, 0x4f, 0x57, 0xfc, 0xc8, 0xae, 0x0a, 0x6c, 0x35, + 0x4c, 0x16, 0x87, 0x57, 0x53, 0x15, 0x2c, 0xc8, 0x58, 0x4d, 0xe9, 0x14, 0xa1, 0x06, 0x5f, 0xd2, + 0x85, 0x52, 0x2c, 0xe5, 0x89, 0xba, 0x60, 0x50, 0x5d, 0x6f, 0xa4, 0xea, 0xd2, 0x07, 0x30, 0x55, + 0x5d, 0x8a, 0x3b, 0x69, 0xc2, 0x8c, 0x3c, 0x31, 0x44, 0x7d, 0x93, 0x83, 0xea, 0x7b, 0x39, 0x55, + 0xdf, 0x7c, 0x73, 0x3b, 0x5d, 0x4f, 0x82, 0x27, 0x79, 0x07, 0xa6, 0x25, 0x84, 0x27, 0xec, 0x9c, + 0x8a, 0x33, 0x33, 0x36, 0xb7, 0x53, 0x69, 0x3a, 0x4d, 0x64, 0x9d, 0x9a, 0xcf, 0x8e, 0x69, 0x83, + 0x3a, 0x39, 0x2b, 0x4c, 0x64, 0xf2, 0x21, 0x4c, 0xd6, 0xda, 0xac, 0x21, 0x7e, 0xc7, 0x8d, 0xa8, + 0xf0, 0x3a, 0x93, 0xb6, 0x25, 0x5a, 0x89, 0x36, 0x55, 0x79, 0x2a, 0xd2, 0xb8, 0xc8, 0x48, 0x45, + 0x1a, 0x83, 0x59, 0xe7, 0xf1, 0xf7, 0x24, 0x31, 0x87, 0xa5, 0x47, 0xda, 0x99, 0x0c, 0xfb, 0x0e, + 0x8d, 0xbd, 0x08, 0x5b, 0xc9, 0xa0, 0xf2, 0x3d, 0x27, 0x11, 0xb6, 0x52, 0xe7, 0x49, 0xde, 0x85, + 0x49, 0x91, 0xe0, 0xa6, 0x62, 0xaf, 0x87, 0x0b, 0x25, 0x6c, 0x3c, 0xfa, 0xd1, 0xcb, 0x5c, 0x38, + 0x8e, 0x1b, 0x24, 0x0c, 0x19, 0x63, 0x7c, 0xf2, 0x15, 0x38, 0x76, 0xdf, 0xeb, 0x34, 0xfd, 0xfd, + 0x50, 0x1c, 0x53, 0x62, 0xa3, 0x9b, 0x8b, 0xdd, 0x88, 0xf6, 0x79, 0xb9, 0x12, 0xce, 0x52, 0x1b, + 0x5f, 0x26, 0x07, 0xf2, 0x67, 0x53, 0x9c, 0xf9, 0x0c, 0x22, 0x83, 0x66, 0xd0, 0x62, 0x6a, 0x06, + 0xa5, 0xab, 0x4f, 0x4e, 0xa7, 0xcc, 0x6a, 0x88, 0x0f, 0xc4, 0x3c, 0xdf, 0x6f, 0xf9, 0x5e, 0x67, + 0x61, 0x1e, 0xf7, 0xc2, 0xe7, 0x93, 0x9e, 0xeb, 0x88, 0x27, 0x52, 0xba, 0x5a, 0x8f, 0x0f, 0xcb, + 0x67, 0x93, 0x42, 0xf8, 0x47, 0xbe, 0xa1, 0x28, 0xcf, 0x60, 0x4d, 0x3e, 0x84, 0x29, 0xf6, 0xbf, + 0xd2, 0x12, 0x1c, 0x33, 0x2c, 0x02, 0x35, 0x4c, 0x51, 0x0f, 0x8e, 0x11, 0x66, 0xe0, 0xc9, 0x50, + 0x20, 0x18, 0xac, 0xc8, 0x5b, 0x00, 0x4c, 0x8e, 0x11, 0xdb, 0xf1, 0xf1, 0x38, 0x4a, 0x28, 0x8a, + 0x41, 0xe9, 0x8d, 0x38, 0x46, 0x26, 0xef, 0xc0, 0x24, 0xfb, 0x55, 0xef, 0x35, 0x7d, 0xb6, 0x36, + 0x4e, 0x20, 0x2d, 0x77, 0xe6, 0x63, 0xb4, 0x21, 0x87, 0x1b, 0xce, 0x7c, 0x31, 0x3a, 0x59, 0x85, + 0x59, 0x8c, 0xe6, 0x5a, 0xc3, 0x7c, 0xcf, 0x91, 0x47, 0xc3, 0x85, 0x93, 0xda, 0x3b, 0x38, 0x2b, + 0x72, 0x3c, 0x55, 0xa6, 0x5f, 0x2e, 0x12, 0x64, 0x24, 0x84, 0xf9, 0xf4, 0x43, 0x62, 0xb8, 0xb0, + 0x80, 0x9d, 0x24, 0x45, 0xea, 0x34, 0x06, 0xdf, 0x8f, 0xd9, 0x88, 0x68, 0x1b, 0x97, 0x7c, 0x4e, + 0xd0, 0x2b, 0xcc, 0xe2, 0x4e, 0x6c, 0x20, 0x37, 0x97, 0x37, 0x93, 0xe1, 0x4e, 0x4f, 0x61, 0x0b, + 0x70, 0x98, 0x77, 0x1b, 0x71, 0xae, 0xd9, 0x8c, 0x90, 0xa7, 0x19, 0xd4, 0xe4, 0xdb, 0x70, 0x5c, + 0xee, 0x20, 0xa2, 0x48, 0xcc, 0xeb, 0xd3, 0x4f, 0xb8, 0x13, 0x37, 0xb7, 0x55, 0xd5, 0xa9, 0x29, + 0x9d, 0x5d, 0x05, 0x71, 0x61, 0x12, 0x87, 0x55, 0xd4, 0xf8, 0xfc, 0xa0, 0x1a, 0x2f, 0xa6, 0x6a, + 0x3c, 0x81, 0x13, 0x25, 0x5d, 0x99, 0xce, 0x93, 0x2c, 0xc1, 0xb4, 0x58, 0x47, 0x62, 0xb6, 0xbd, + 0x80, 0xbd, 0x85, 0x5a, 0x25, 0xb9, 0x02, 0x53, 0x13, 0xce, 0x24, 0xd1, 0x77, 0x64, 0xfe, 0x8c, + 0x70, 0xc6, 0xd8, 0x91, 0x93, 0xaf, 0x07, 0x26, 0x32, 0xdb, 0x91, 0x62, 0x29, 0x66, 0xe5, 0x51, + 0x37, 0x10, 0x3a, 0xa3, 0xb3, 0x71, 0x16, 0x10, 0x4d, 0xf8, 0x71, 0xa8, 0xc2, 0xd0, 0xb7, 0x84, + 0x2c, 0x0e, 0xe4, 0x2e, 0xcc, 0xab, 0x53, 0x5b, 0x63, 0x5c, 0x8e, 0xb3, 0xa9, 0xc4, 0x47, 0x7d, + 0x36, 0xdf, 0x2c, 0x7a, 0xe2, 0xc2, 0x49, 0xe3, 0x9c, 0xd6, 0x58, 0x9f, 0x43, 0xd6, 0x98, 0xdb, + 0xd8, 0x3c, 0xe4, 0xb3, 0xd9, 0xf7, 0xe3, 0x43, 0x3e, 0x82, 0xd3, 0xc9, 0xb3, 0x59, 0xab, 0xe5, + 0x45, 0xac, 0xe5, 0xd5, 0xc7, 0x87, 0xe5, 0x0b, 0xa9, 0xe3, 0x3d, 0xbb, 0xa2, 0x01, 0xdc, 0xc8, + 0x37, 0x60, 0xc1, 0x3c, 0x9f, 0xb5, 0x9a, 0x2c, 0xac, 0x09, 0x97, 0x8e, 0x3a, 0xd8, 0xb3, 0x6b, + 0xe8, 0xcb, 0x83, 0x44, 0x50, 0xce, 0x9c, 0xdd, 0x5a, 0x35, 0xe7, 0xe3, 0x06, 0xa5, 0x56, 0x49, + 0x76, 0x75, 0x47, 0xb1, 0x24, 0xfb, 0x70, 0x36, 0xeb, 0x98, 0xd0, 0x2a, 0x7d, 0x49, 0x69, 0x65, + 0x5f, 0xcb, 0x3e, 0x72, 0xb2, 0x6b, 0x3e, 0x82, 0x2d, 0xf9, 0x2a, 0x1c, 0xd7, 0xd6, 0x97, 0x56, + 0xdf, 0xcb, 0x58, 0x1f, 0x3a, 0x01, 0xeb, 0x0b, 0x33, 0xbb, 0x96, 0x6c, 0x1e, 0xa4, 0x0d, 0xf3, + 0xb2, 0xe1, 0xa8, 0xfe, 0x16, 0x47, 0xcf, 0x05, 0x63, 0x57, 0x4d, 0x63, 0x68, 0xd9, 0xe9, 0xb7, + 0x9d, 0x6e, 0x4c, 0xa8, 0xcf, 0xf4, 0x0c, 0xbe, 0x64, 0x15, 0xc6, 0xea, 0x9b, 0xb5, 0x1b, 0x37, + 0x56, 0x16, 0x5e, 0xc1, 0x1a, 0xa4, 0xc7, 0x10, 0x07, 0x1a, 0x97, 0x26, 0x61, 0xa8, 0xd6, 0xf5, + 0x76, 0x76, 0x0c, 0xc7, 0x2c, 0x8e, 0x7a, 0x6b, 0xa4, 0x78, 0xb1, 0x74, 0xe9, 0xd6, 0x48, 0xf1, + 0x52, 0xe9, 0x55, 0xfb, 0x85, 0xec, 0x7c, 0xde, 0xbc, 0xb1, 0xf6, 0x85, 0x41, 0xa5, 0x71, 0x57, + 0x58, 0xbf, 0x90, 0x83, 0xf9, 0x8c, 0xef, 0x20, 0x17, 0x60, 0x04, 0xd3, 0x93, 0x68, 0xaf, 0xea, + 0x89, 0xb4, 0x24, 0x58, 0x4e, 0x3e, 0x07, 0xe3, 0xd5, 0xf5, 0x7a, 0xbd, 0xb2, 0x2e, 0xaf, 0x6c, + 0x7c, 0xbb, 0xea, 0x84, 0x4e, 0xe8, 0x9a, 0x8f, 0x71, 0x02, 0x8d, 0xbc, 0x01, 0x63, 0xb5, 0x4d, + 0x24, 0xe0, 0xb6, 0x61, 0x78, 0x85, 0xf1, 0xba, 0x49, 0x7c, 0x81, 0x64, 0xfd, 0x44, 0x0e, 0x48, + 0xba, 0x53, 0xc9, 0x55, 0x98, 0xd4, 0x87, 0x8e, 0x5f, 0x30, 0xf1, 0xe1, 0x48, 0x1b, 0x18, 0x5b, + 0xc7, 0x21, 0x55, 0x18, 0xc5, 0x04, 0x6e, 0xea, 0x15, 0x30, 0xf3, 0x00, 0x38, 0x99, 0x3a, 0x00, + 0x46, 0x31, 0x3d, 0x9c, 0xcd, 0x89, 0xad, 0xdf, 0xc9, 0x01, 0xc9, 0xb6, 0xed, 0x19, 0xca, 0x0a, + 0xe1, 0x4d, 0xcd, 0xb7, 0x57, 0x4f, 0x40, 0xa0, 0xb2, 0xc7, 0xe8, 0x97, 0xa5, 0xd8, 0x0b, 0xf8, + 0x82, 0x71, 0x39, 0xef, 0xef, 0x10, 0x76, 0x09, 0x46, 0xef, 0xd1, 0x60, 0x5b, 0x9a, 0x3d, 0xa2, + 0xa9, 0xd4, 0x43, 0x06, 0xd0, 0x2f, 0xab, 0x88, 0x61, 0xfd, 0x51, 0x0e, 0x8e, 0x65, 0x49, 0x72, + 0x47, 0xf8, 0x6d, 0x59, 0x09, 0x97, 0x33, 0xb4, 0x40, 0xe0, 0x76, 0x54, 0xca, 0xd1, 0xac, 0x0c, + 0xa3, 0xac, 0xb1, 0x72, 0x84, 0x51, 0x59, 0xc0, 0x7a, 0x23, 0xb4, 0x39, 0x9c, 0x21, 0xf0, 0x78, + 0x51, 0x23, 0x18, 0x6a, 0x0c, 0x11, 0x50, 0x50, 0xb0, 0x39, 0x9c, 0x21, 0xdc, 0xf1, 0x9b, 0x2a, + 0x6b, 0x31, 0x22, 0xb4, 0x19, 0xc0, 0xe6, 0x70, 0x72, 0x01, 0xc6, 0x37, 0x3a, 0x6b, 0xd4, 0x7d, + 0x28, 0x83, 0x60, 0xa3, 0xc5, 0x84, 0xdf, 0x71, 0x5a, 0x0c, 0x66, 0xcb, 0x42, 0xeb, 0xa7, 0x73, + 0x30, 0x97, 0x12, 0x22, 0x8f, 0x76, 0x4d, 0x1b, 0xec, 0x23, 0x32, 0x4c, 0xfb, 0xf8, 0xe7, 0x8f, + 0x64, 0x7f, 0xbe, 0xf5, 0x7f, 0x8f, 0xc2, 0xc9, 0x3e, 0x77, 0xfa, 0xd8, 0x87, 0x2d, 0x77, 0xa4, + 0x0f, 0xdb, 0xd7, 0xd8, 0x1d, 0xda, 0xf5, 0xda, 0xe1, 0x96, 0x1f, 0x7f, 0x71, 0x6c, 0x0a, 0x8f, + 0x65, 0x32, 0x71, 0xb3, 0xb4, 0x99, 0x3e, 0xc5, 0x93, 0xe7, 0x3b, 0x91, 0x9f, 0x16, 0x29, 0x0c, + 0x66, 0x29, 0x2f, 0xb2, 0xc2, 0xbf, 0x21, 0x5e, 0x64, 0xa6, 0x5f, 0xc3, 0xc8, 0x53, 0xf5, 0x6b, + 0xc8, 0xb6, 0x89, 0x1c, 0xfd, 0x34, 0x16, 0xb2, 0xcb, 0x30, 0xcd, 0x4d, 0x46, 0x2a, 0x21, 0x1f, + 0xa4, 0xb1, 0x94, 0x99, 0x89, 0x1b, 0xa6, 0xc7, 0xc2, 0xa0, 0x21, 0xab, 0xa6, 0x0d, 0xfe, 0x38, + 0x3e, 0x75, 0x5d, 0xe8, 0x6f, 0x63, 0x6f, 0x3c, 0x71, 0x1b, 0xb6, 0xf6, 0xdf, 0x81, 0x63, 0x59, + 0x97, 0x82, 0x85, 0xa2, 0x61, 0x8d, 0xd6, 0xd7, 0x8a, 0x71, 0xf8, 0xab, 0xc5, 0x83, 0xf4, 0xd5, + 0xc2, 0xfa, 0xe9, 0xbc, 0xe9, 0xdf, 0xf6, 0x6f, 0xe2, 0xb4, 0xbf, 0x04, 0xa3, 0xf7, 0xf7, 0x68, + 0x20, 0x37, 0x5b, 0xfc, 0x90, 0x7d, 0x06, 0xd0, 0x3f, 0x04, 0x31, 0xc8, 0x0d, 0x98, 0xd9, 0xe4, + 0xd3, 0x40, 0x8e, 0xed, 0x48, 0x7c, 0xcf, 0xeb, 0x0a, 0x6d, 0x44, 0xc6, 0xe0, 0x26, 0xa8, 0xac, + 0x9b, 0x70, 0xc6, 0xd8, 0x0d, 0x44, 0x3c, 0x0e, 0x6e, 0x87, 0xcf, 0x8f, 0xe3, 0x99, 0xd8, 0xf3, + 0x20, 0xde, 0xba, 0xec, 0x04, 0xd4, 0xda, 0x81, 0xb3, 0x03, 0x19, 0xb1, 0x53, 0x10, 0xba, 0xea, + 0x57, 0xc2, 0xce, 0x6f, 0x20, 0xa9, 0xad, 0xd1, 0x59, 0xdf, 0x81, 0x29, 0xbd, 0x97, 0x71, 0x43, + 0x67, 0xbf, 0xc5, 0x8e, 0xca, 0x37, 0x74, 0x06, 0xb0, 0x39, 0x3c, 0xd6, 0x1f, 0xe7, 0xb3, 0xf5, + 0xc7, 0xf1, 0xf0, 0x17, 0x8e, 0x1a, 0x7e, 0x56, 0x39, 0xee, 0x17, 0x5a, 0xe5, 0xf8, 0x5b, 0xaf, + 0x1c, 0x03, 0x6e, 0xd8, 0x1c, 0xfe, 0x54, 0x2b, 0xff, 0x6d, 0x99, 0x83, 0x04, 0xcd, 0xfc, 0xe5, + 0xe2, 0x89, 0x73, 0x1a, 0xcf, 0x67, 0xad, 0x85, 0x18, 0x33, 0x3e, 0xa1, 0xf3, 0x47, 0x9d, 0xd0, + 0x4f, 0x32, 0x11, 0xaf, 0xc0, 0x78, 0x45, 0xbc, 0x82, 0x8f, 0xc4, 0x52, 0x95, 0x9b, 0x7a, 0xf2, + 0x96, 0x58, 0xd6, 0xcf, 0xe5, 0xe0, 0x78, 0xa6, 0x9e, 0x8e, 0xd5, 0xca, 0x15, 0x82, 0xda, 0x3a, + 0x4c, 0x6a, 0x03, 0x39, 0xc6, 0x93, 0x78, 0x5b, 0x0f, 0xdf, 0x16, 0xeb, 0x45, 0x98, 0x50, 0xaf, + 0x44, 0xe4, 0x98, 0x1c, 0x3a, 0x34, 0x8d, 0x92, 0x8f, 0x0d, 0x75, 0x00, 0xf6, 0x05, 0x4f, 0xd5, + 0x90, 0xcf, 0xfa, 0xed, 0x3c, 0xcf, 0x4f, 0xf7, 0xcc, 0x06, 0x29, 0xcc, 0xb6, 0xbe, 0x63, 0x4d, + 0xea, 0x1f, 0x9a, 0x90, 0xac, 0xc0, 0x58, 0x3d, 0x72, 0xa3, 0x9e, 0x74, 0x12, 0x9f, 0xd7, 0xc9, + 0xb0, 0xe0, 0xde, 0x62, 0xec, 0x26, 0x1c, 0x22, 0xc4, 0xb8, 0x99, 0x20, 0x44, 0x33, 0xe2, 0xfb, + 0x47, 0x39, 0x98, 0xd2, 0x89, 0xc9, 0x87, 0x30, 0x23, 0x43, 0xaf, 0x71, 0xd7, 0x79, 0xf1, 0xa4, + 0x25, 0xed, 0x41, 0x64, 0xe8, 0x35, 0xdd, 0xd5, 0xde, 0xc0, 0xd7, 0xb7, 0xea, 0xae, 0x8e, 0x4c, + 0x9a, 0x40, 0xda, 0x3b, 0xae, 0xb3, 0x4f, 0xdd, 0x07, 0x34, 0x8c, 0x1c, 0xfe, 0x6e, 0x2f, 0x5e, + 0xbe, 0x24, 0xfb, 0x3b, 0x37, 0x2a, 0xfc, 0xc9, 0x9e, 0x8d, 0x84, 0x88, 0xa1, 0x97, 0xa2, 0xd1, + 0xd5, 0xf9, 0xed, 0x1d, 0xf7, 0x3e, 0x2f, 0xe4, 0x74, 0xd6, 0x1f, 0x8f, 0xf1, 0xe9, 0x26, 0x22, + 0x35, 0x6e, 0xc3, 0xcc, 0x46, 0xad, 0xba, 0xac, 0x29, 0xf7, 0xcc, 0x44, 0x1f, 0x2b, 0x8f, 0x22, + 0x1a, 0x74, 0xdc, 0x96, 0x40, 0x38, 0x88, 0x8f, 0x20, 0xdf, 0x6b, 0x36, 0xb2, 0x15, 0x7f, 0x09, + 0x8e, 0xac, 0x0e, 0x7e, 0x81, 0x53, 0x75, 0xe4, 0x87, 0xac, 0x23, 0x74, 0xdb, 0xad, 0x3e, 0x75, + 0x98, 0x1c, 0xc9, 0x1e, 0x94, 0x6e, 0xa2, 0xac, 0xa6, 0xd5, 0x52, 0x18, 0x5c, 0xcb, 0x79, 0x51, + 0xcb, 0xf3, 0x5c, 0xc8, 0xcb, 0xae, 0x27, 0xc5, 0x35, 0xde, 0x27, 0x46, 0x8e, 0xdc, 0x27, 0xfe, + 0x62, 0x0e, 0xc6, 0xb8, 0x30, 0x28, 0xa6, 0x71, 0x1f, 0x71, 0xf3, 0xfe, 0xd3, 0x11, 0x37, 0x4b, + 0x78, 0x4e, 0x18, 0x13, 0x9a, 0x97, 0x91, 0x6a, 0x62, 0x5d, 0x48, 0xdb, 0x53, 0x54, 0xd3, 0xf3, + 0x92, 0xa3, 0x97, 0x05, 0xa9, 0xc5, 0x8e, 0xdb, 0xe3, 0x47, 0xfa, 0x06, 0x4a, 0x67, 0xf7, 0x71, + 0xe1, 0xb8, 0x6d, 0xba, 0x6b, 0xaf, 0xc1, 0x84, 0x70, 0x07, 0x5f, 0x3a, 0x10, 0x8f, 0x71, 0x25, + 0xc3, 0xbe, 0xa1, 0xb9, 0x74, 0x10, 0x0b, 0xba, 0xc2, 0xa1, 0xdc, 0xd9, 0x3e, 0x30, 0xd2, 0xfd, + 0x49, 0x44, 0xb2, 0xc1, 0xd3, 0x60, 0xf1, 0x58, 0x96, 0x66, 0xf0, 0x6a, 0x05, 0x17, 0x81, 0x66, + 0xa4, 0x4f, 0x69, 0x46, 0xe8, 0xca, 0x98, 0x07, 0x59, 0x83, 0x12, 0xda, 0xc4, 0xd0, 0x26, 0x5f, + 0x35, 0xb5, 0x2a, 0x77, 0x39, 0x16, 0x76, 0x8d, 0x11, 0x2f, 0x13, 0xcb, 0x2d, 0xe1, 0xed, 0x93, + 0xa2, 0x64, 0x97, 0xd3, 0x52, 0x72, 0xf6, 0x91, 0x77, 0x60, 0x52, 0xc5, 0x12, 0x55, 0xfe, 0x86, + 0xa8, 0x94, 0x8f, 0x83, 0x8f, 0x9a, 0xc9, 0x93, 0x34, 0x74, 0xb2, 0x08, 0x45, 0xb6, 0x88, 0x93, + 0x89, 0x06, 0x7b, 0x02, 0xa6, 0xdb, 0xff, 0x4b, 0x3c, 0x52, 0x87, 0x79, 0xb6, 0x68, 0xea, 0x5e, + 0x67, 0xb7, 0x45, 0xd7, 0xfc, 0x5d, 0xbf, 0x17, 0xdd, 0xb5, 0xd7, 0xc4, 0x1e, 0xce, 0xaf, 0x03, + 0x6e, 0xbb, 0x65, 0x14, 0x07, 0x46, 0x1a, 0xe9, 0x0c, 0x6a, 0x6d, 0xab, 0xfc, 0x83, 0x3c, 0x4c, + 0x6a, 0xf3, 0x89, 0x5c, 0x82, 0x62, 0x2d, 0x5c, 0xf3, 0x1b, 0x0f, 0x54, 0x24, 0xb2, 0xe9, 0xc7, + 0x87, 0xe5, 0x09, 0x2f, 0x74, 0x5a, 0x08, 0xb4, 0x55, 0x31, 0x59, 0x82, 0x69, 0xfe, 0x97, 0x8c, + 0xf1, 0x9e, 0x8f, 0xcd, 0x18, 0x39, 0xb2, 0x8c, 0xee, 0xae, 0xef, 0x9e, 0x06, 0x09, 0xf9, 0x3a, + 0x00, 0x07, 0xa0, 0xef, 0x6a, 0x61, 0x78, 0xaf, 0x5b, 0x51, 0x41, 0x86, 0xd7, 0xaa, 0xc6, 0x90, + 0x7c, 0x93, 0xc7, 0x1e, 0x95, 0xf3, 0x7f, 0x64, 0x78, 0xb7, 0x61, 0xc6, 0xdf, 0xc9, 0x8e, 0x5e, + 0xa0, 0xb3, 0x14, 0x41, 0x13, 0x4f, 0xdb, 0xb4, 0xe1, 0x3f, 0xa4, 0xc1, 0x41, 0x25, 0x42, 0x44, + 0x0d, 0xc3, 0xfa, 0x9f, 0x73, 0xda, 0xaa, 0x21, 0xeb, 0x98, 0x1b, 0x93, 0xcf, 0x08, 0x61, 0x97, + 0xa2, 0xee, 0x0c, 0x12, 0x6e, 0xd3, 0x9d, 0xa5, 0xe7, 0x85, 0x15, 0xed, 0xbc, 0x9a, 0x57, 0x89, + 0x9c, 0x99, 0x1c, 0x48, 0x3e, 0x80, 0x11, 0xec, 0xba, 0xfc, 0x91, 0x4d, 0x93, 0xc7, 0xf6, 0x08, + 0xeb, 0x33, 0x6c, 0x08, 0x52, 0x92, 0xcf, 0x09, 0xbf, 0x3f, 0xde, 0xf9, 0x33, 0xda, 0xd9, 0xcb, + 0xbe, 0x43, 0x9d, 0xd7, 0x71, 0x00, 0x0b, 0x6d, 0xf6, 0xfc, 0x7b, 0x79, 0x28, 0x25, 0xd7, 0x2a, + 0x79, 0x1f, 0xa6, 0xe4, 0x79, 0x8a, 0xc9, 0xd3, 0x59, 0x2b, 0xa7, 0x44, 0x80, 0x70, 0x79, 0xa8, + 0x26, 0x73, 0xa7, 0xeb, 0x04, 0x4c, 0xb8, 0xd9, 0x12, 0x01, 0xa5, 0xb4, 0x55, 0x12, 0xf9, 0x51, + 0x37, 0x11, 0xbe, 0x52, 0xa2, 0x91, 0x37, 0xa1, 0x70, 0xe7, 0x46, 0x45, 0xf8, 0x87, 0x94, 0x92, + 0xa7, 0x2e, 0xb7, 0x7f, 0x33, 0xad, 0xf1, 0x18, 0x3e, 0x59, 0xd3, 0xa2, 0xc3, 0x8e, 0x19, 0x59, + 0xa1, 0x24, 0x58, 0x35, 0xee, 0xe8, 0x30, 0xb1, 0x3c, 0x2b, 0xbb, 0x88, 0xc1, 0xf8, 0x1f, 0x15, + 0x60, 0x42, 0xd5, 0x4f, 0x88, 0xee, 0x75, 0xc7, 0x3d, 0xec, 0xc8, 0x29, 0x28, 0x4a, 0x71, 0x4d, + 0xb8, 0x89, 0x8c, 0x87, 0x42, 0x54, 0x5b, 0x00, 0x29, 0x97, 0xf1, 0x65, 0x6e, 0xcb, 0x9f, 0xe4, + 0x2a, 0x28, 0xa1, 0xab, 0x9f, 0x74, 0x36, 0xc2, 0x06, 0xcc, 0x56, 0x68, 0x64, 0x06, 0xf2, 0x1e, + 0x8f, 0xeb, 0x33, 0x61, 0xe7, 0xbd, 0x26, 0x79, 0x1f, 0x8a, 0x6e, 0xb3, 0x49, 0x9b, 0x8e, 0x2b, + 0x0d, 0x3c, 0x06, 0x4d, 0x9a, 0x22, 0xe3, 0xc6, 0x0f, 0x01, 0xa4, 0xaa, 0x44, 0xa4, 0x02, 0x13, + 0x2d, 0x97, 0xdb, 0x70, 0x35, 0x87, 0x38, 0x51, 0x62, 0x0e, 0x45, 0x46, 0x76, 0x37, 0xa4, 0x4d, + 0xf2, 0x0a, 0x8c, 0xb0, 0xd1, 0x14, 0x47, 0x88, 0x94, 0x12, 0xd9, 0x60, 0xf2, 0x0e, 0x5b, 0x7d, + 0xce, 0x46, 0x04, 0xf2, 0x12, 0x14, 0x7a, 0x8b, 0x3b, 0xe2, 0x70, 0x28, 0xc5, 0x91, 0x9a, 0x15, + 0x1a, 0x2b, 0x26, 0xd7, 0xa0, 0xb8, 0x6f, 0x06, 0xf9, 0x3d, 0x9e, 0x18, 0x46, 0x85, 0xaf, 0x10, + 0x97, 0x8a, 0x30, 0xc6, 0x0f, 0x02, 0xeb, 0x2c, 0x40, 0x5c, 0x75, 0xda, 0x9b, 0xc7, 0xfa, 0x3a, + 0x4c, 0xa8, 0x2a, 0xc9, 0x19, 0x80, 0x07, 0xf4, 0xc0, 0xd9, 0x73, 0x3b, 0xcd, 0x16, 0x97, 0x22, + 0xa7, 0xec, 0x89, 0x07, 0xf4, 0x60, 0x15, 0x01, 0xe4, 0x24, 0x8c, 0x77, 0xd9, 0xa8, 0x8a, 0xa9, + 0x3b, 0x65, 0x8f, 0x75, 0x7b, 0xdb, 0x6c, 0x86, 0x2e, 0xc0, 0x38, 0x6a, 0x17, 0xc5, 0x42, 0x9b, + 0xb6, 0xe5, 0x4f, 0xeb, 0xbf, 0xc9, 0x63, 0x82, 0x0b, 0xed, 0x3b, 0xc9, 0x79, 0x98, 0x6e, 0x04, + 0x14, 0xcf, 0x1c, 0x97, 0x49, 0x52, 0xa2, 0x9e, 0xa9, 0x18, 0x58, 0x6b, 0x92, 0x0b, 0x30, 0xdb, + 0xed, 0x6d, 0xb7, 0xbc, 0x06, 0xab, 0xcd, 0x69, 0x6c, 0x8b, 0x88, 0xdc, 0x53, 0xf6, 0x34, 0x07, + 0xdf, 0xa6, 0x07, 0xcb, 0xdb, 0x18, 0x8f, 0xaa, 0xa4, 0x87, 0x13, 0x8d, 0x54, 0xfe, 0x58, 0x7b, + 0x56, 0x83, 0xa3, 0xdd, 0xd6, 0x09, 0x18, 0x73, 0xdd, 0xdd, 0x9e, 0xc7, 0xe3, 0xc6, 0x4c, 0xd9, + 0xe2, 0x17, 0x79, 0x0d, 0xe6, 0x42, 0x6f, 0xb7, 0xe3, 0x46, 0xbd, 0x40, 0x64, 0x18, 0xa1, 0x01, + 0x4e, 0xa9, 0x69, 0xbb, 0xa4, 0x0a, 0x96, 0x39, 0x9c, 0xbc, 0x01, 0x44, 0xaf, 0xcf, 0xdf, 0xfe, + 0x88, 0x36, 0xf8, 0x54, 0x9b, 0xb2, 0xe7, 0xb4, 0x92, 0x0d, 0x2c, 0x20, 0x2f, 0xc2, 0x54, 0x40, + 0x43, 0x94, 0xe2, 0xb0, 0xdb, 0x30, 0xff, 0x93, 0x3d, 0x29, 0x61, 0xac, 0xef, 0x2e, 0x42, 0x49, + 0xeb, 0x0e, 0x8c, 0xd8, 0xca, 0xc3, 0x51, 0xdb, 0x33, 0x31, 0xdc, 0xee, 0xd6, 0x9a, 0xd6, 0x12, + 0xcc, 0xa5, 0x56, 0xae, 0x96, 0xf3, 0x9b, 0xef, 0x44, 0x83, 0x73, 0x7e, 0x5b, 0x1d, 0x98, 0xd2, + 0x77, 0xe2, 0x23, 0xa2, 0xa2, 0x9f, 0xc0, 0xb8, 0x03, 0x7c, 0x9b, 0x1a, 0x7b, 0x7c, 0x58, 0xce, + 0x7b, 0x4d, 0x8c, 0x36, 0x70, 0x11, 0x8a, 0x52, 0x68, 0x10, 0x67, 0x35, 0x6a, 0x87, 0x85, 0xb4, + 0x7a, 0x60, 0xab, 0x52, 0xeb, 0x15, 0x18, 0x17, 0x9b, 0xed, 0x60, 0x9d, 0xb0, 0xf5, 0xdd, 0x3c, + 0xcc, 0xda, 0x94, 0x6d, 0x05, 0x94, 0xa7, 0x42, 0x78, 0x66, 0x6f, 0x89, 0xd9, 0xd1, 0xeb, 0x8c, + 0xb6, 0x0d, 0x48, 0x42, 0xf0, 0x77, 0x73, 0x30, 0x9f, 0x81, 0xfb, 0x89, 0x92, 0xf0, 0x5d, 0x87, + 0x89, 0xaa, 0xe7, 0xb6, 0x2a, 0xcd, 0xa6, 0x0a, 0x42, 0x80, 0xa2, 0x26, 0x66, 0xea, 0x70, 0x19, + 0x54, 0x3f, 0x76, 0x15, 0x2a, 0x79, 0x55, 0x4c, 0x8a, 0x38, 0x0f, 0x29, 0x4e, 0x8a, 0x8f, 0x0f, + 0xcb, 0xc0, 0xbf, 0x29, 0x4e, 0x4e, 0x8c, 0x11, 0x25, 0x39, 0x30, 0xb6, 0xef, 0x7f, 0x66, 0x87, + 0x2e, 0x3b, 0xa2, 0x64, 0xb2, 0x79, 0x43, 0xe5, 0x21, 0xf8, 0x2b, 0x79, 0x38, 0x91, 0x4d, 0xf8, + 0x49, 0xf3, 0x29, 0x62, 0x06, 0x08, 0x2d, 0x0a, 0x2e, 0xe6, 0x53, 0xe4, 0xe9, 0x22, 0x10, 0x3f, + 0x46, 0x20, 0x3b, 0x30, 0xbd, 0xe6, 0x86, 0xd1, 0x2a, 0x75, 0x83, 0x68, 0x9b, 0xba, 0xd1, 0x10, + 0xb2, 0xe7, 0x4b, 0xf2, 0xe9, 0x15, 0x8f, 0xbf, 0x3d, 0x49, 0x99, 0x90, 0x0e, 0x4d, 0xb6, 0x6a, + 0xa2, 0x8c, 0x0c, 0x31, 0x51, 0xbe, 0x05, 0xb3, 0x75, 0xda, 0x76, 0xbb, 0x7b, 0x7e, 0x20, 0x1d, + 0x44, 0x2f, 0xc3, 0xb4, 0x02, 0x65, 0xce, 0x16, 0xb3, 0xd8, 0xc0, 0xd7, 0x3a, 0x22, 0xde, 0x4a, + 0xcc, 0x62, 0xeb, 0xaf, 0xe7, 0xe1, 0x64, 0xa5, 0x21, 0x2c, 0xa2, 0x44, 0x81, 0x34, 0xdc, 0xfc, + 0x8c, 0xeb, 0x26, 0x57, 0x60, 0xe2, 0x8e, 0xfb, 0x68, 0x8d, 0xba, 0x21, 0x0d, 0x45, 0x36, 0x2b, + 0x2e, 0xa8, 0xb9, 0x8f, 0x62, 0x6d, 0xbe, 0x1d, 0xe3, 0xe8, 0x37, 0xd9, 0x91, 0x4f, 0x79, 0x93, + 0xb5, 0x60, 0x6c, 0xd5, 0x6f, 0x35, 0xc5, 0x31, 0x26, 0x9e, 0x10, 0xf7, 0x10, 0x62, 0x8b, 0x12, + 0x76, 0x01, 0x9c, 0x51, 0x5f, 0x8c, 0x9f, 0xf0, 0x99, 0x77, 0xc9, 0x05, 0x18, 0xc7, 0x8a, 0x54, + 0x3e, 0x60, 0x3c, 0x34, 0x5a, 0x14, 0x73, 0x12, 0x35, 0x6d, 0x59, 0xa8, 0xf7, 0xc4, 0xe8, 0xa7, + 0xeb, 0x09, 0xeb, 0xef, 0xe0, 0xeb, 0xa4, 0xde, 0x4a, 0x76, 0x12, 0x69, 0x1f, 0x92, 0x1b, 0xf2, + 0x43, 0xf2, 0x4f, 0x6d, 0x48, 0x0a, 0x7d, 0x87, 0xe4, 0x7b, 0x79, 0x98, 0x54, 0x1f, 0xfb, 0x43, + 0x16, 0x8a, 0x59, 0xb5, 0x6b, 0xa8, 0xa0, 0x0e, 0x75, 0x6d, 0xaf, 0x10, 0xb1, 0x13, 0x3e, 0x80, + 0x31, 0xb1, 0x98, 0x72, 0x09, 0x03, 0xc6, 0xc4, 0xe8, 0x2e, 0xcd, 0x08, 0xd6, 0x63, 0x38, 0xa0, + 0xa1, 0x2d, 0xe8, 0x30, 0x6a, 0xc6, 0x7d, 0xba, 0x2d, 0x1e, 0xab, 0x9f, 0xd9, 0x33, 0x2a, 0x3b, + 0x6a, 0x46, 0xdc, 0xb0, 0xa1, 0x4e, 0xa7, 0x9f, 0x2f, 0x42, 0x29, 0x49, 0x72, 0x74, 0xb0, 0xeb, + 0xcd, 0xde, 0x36, 0x97, 0xc2, 0x79, 0xb0, 0xeb, 0x6e, 0x6f, 0xdb, 0x66, 0x30, 0xb4, 0x65, 0x09, + 0xbc, 0x87, 0xd8, 0xea, 0x29, 0x61, 0xcb, 0x12, 0x78, 0x0f, 0x0d, 0x5b, 0x96, 0xc0, 0x7b, 0x88, + 0x57, 0xdf, 0xb5, 0x3a, 0x3a, 0xfa, 0xa2, 0x08, 0x2e, 0xae, 0xbe, 0xad, 0x30, 0x99, 0x24, 0x46, + 0xa2, 0xb1, 0xa3, 0x72, 0x89, 0xba, 0x81, 0x08, 0xcc, 0x2c, 0xb6, 0x33, 0x3c, 0x2a, 0xb7, 0x11, + 0xcc, 0x73, 0x3a, 0xdb, 0x3a, 0x12, 0x69, 0x01, 0xd1, 0x7e, 0xca, 0x05, 0x7c, 0xf4, 0x6d, 0x50, + 0x1a, 0x1f, 0x1d, 0xd3, 0x59, 0x3b, 0xfa, 0x6a, 0xce, 0xe0, 0xfb, 0x34, 0x15, 0x90, 0x9b, 0x22, + 0xda, 0x1c, 0xaa, 0x3c, 0x8a, 0x47, 0x32, 0x93, 0x9e, 0xf0, 0xc0, 0xa3, 0xd1, 0x29, 0xc5, 0x47, + 0xcc, 0x84, 0xbc, 0x07, 0x93, 0xba, 0xfb, 0x36, 0x77, 0x32, 0x7e, 0x81, 0x07, 0x10, 0xeb, 0x93, + 0x56, 0x50, 0x27, 0x20, 0xdb, 0x70, 0x72, 0xd9, 0xef, 0x84, 0xbd, 0xb6, 0x0c, 0x55, 0x16, 0x07, + 0x48, 0x05, 0x1c, 0x0a, 0xf4, 0x05, 0x6d, 0x08, 0x14, 0xe1, 0x2d, 0x2c, 0xad, 0xc3, 0xcd, 0x0b, + 0x48, 0x3f, 0x46, 0x64, 0x0b, 0x26, 0x51, 0x89, 0x27, 0xcc, 0xcf, 0x26, 0xcd, 0x6d, 0x23, 0x2e, + 0xa9, 0xb2, 0x85, 0xc1, 0xc3, 0xe4, 0xb8, 0xed, 0x96, 0x34, 0x4e, 0xd6, 0x95, 0x91, 0x1a, 0x32, + 0xf9, 0x3a, 0xcc, 0xf0, 0xeb, 0xe6, 0x7d, 0xba, 0xcd, 0xe7, 0xce, 0x94, 0x71, 0x77, 0x36, 0x0b, + 0xf9, 0x7b, 0xb2, 0x50, 0x9d, 0xee, 0xd3, 0x6d, 0x3e, 0xf6, 0x86, 0x6b, 0x80, 0x81, 0x4f, 0xee, + 0xc2, 0xfc, 0xaa, 0x1b, 0x72, 0xa0, 0xe6, 0x87, 0x3b, 0x8d, 0x3a, 0x45, 0x34, 0xd9, 0xdc, 0x73, + 0x43, 0xa9, 0x8b, 0xcd, 0xf4, 0xbb, 0xcd, 0xa2, 0x27, 0xdf, 0xcd, 0xc1, 0x82, 0xa1, 0xaa, 0x15, + 0x86, 0x43, 0x6d, 0xda, 0x89, 0xd0, 0x07, 0x60, 0x46, 0x65, 0x93, 0xee, 0x87, 0xc6, 0x87, 0x24, + 0xa1, 0x0d, 0x0e, 0xe2, 0x72, 0xdd, 0x16, 0xb2, 0x1f, 0x0f, 0xeb, 0x7a, 0xb2, 0xf7, 0x84, 0xa2, + 0x25, 0xa7, 0x14, 0x2d, 0xc7, 0x60, 0x14, 0xfb, 0x48, 0x06, 0x01, 0xc1, 0x1f, 0xd6, 0xe7, 0xf4, + 0x5d, 0x45, 0x08, 0x79, 0x03, 0x77, 0x15, 0xeb, 0xbf, 0x1f, 0x83, 0xd9, 0xc4, 0x20, 0x8b, 0x5b, + 0x67, 0x2e, 0x75, 0xeb, 0xac, 0x03, 0x70, 0x55, 0xe3, 0x90, 0x3a, 0x41, 0xe9, 0x4d, 0x34, 0x29, + 0x9c, 0xf3, 0xd4, 0x0a, 0xd1, 0xd8, 0x30, 0xa6, 0x7c, 0xfd, 0x0d, 0xa9, 0xa3, 0x55, 0x4c, 0xf9, + 0x12, 0xd6, 0x98, 0xc6, 0x6c, 0x48, 0x19, 0x46, 0x31, 0xfc, 0x9f, 0xee, 0xcc, 0xe5, 0x31, 0x80, + 0xcd, 0xe1, 0xe4, 0x3c, 0x8c, 0x31, 0x91, 0xa8, 0x56, 0x15, 0x5b, 0x1a, 0x9e, 0x14, 0x4c, 0x66, + 0x62, 0xf2, 0x87, 0x28, 0x22, 0xd7, 0x61, 0x8a, 0xff, 0x25, 0x82, 0x37, 0x8c, 0x99, 0xb6, 0x69, + 0x8e, 0xd7, 0x94, 0xf1, 0x1b, 0x0c, 0x3c, 0x76, 0x57, 0xa8, 0xf7, 0x50, 0xff, 0x50, 0xab, 0x8a, + 0x78, 0xb1, 0x78, 0x57, 0x08, 0x39, 0x10, 0x73, 0xaf, 0x2b, 0x04, 0x26, 0x99, 0x08, 0x93, 0xea, + 0x22, 0xde, 0x10, 0x51, 0x32, 0xe1, 0xa6, 0xd4, 0xb6, 0x28, 0x21, 0x97, 0xb8, 0x6a, 0x1f, 0x85, + 0x3c, 0x9e, 0xe2, 0x0a, 0xf5, 0xe6, 0xa8, 0x66, 0x40, 0x49, 0x4f, 0x15, 0xb3, 0xca, 0xd9, 0xdf, + 0x2b, 0x6d, 0xd7, 0x6b, 0x89, 0x4d, 0x02, 0x2b, 0x47, 0x5c, 0xca, 0xa0, 0x76, 0x8c, 0x40, 0xde, + 0x81, 0x19, 0xf6, 0x63, 0xd9, 0x6f, 0xb7, 0xfd, 0x0e, 0xb2, 0x9f, 0x8c, 0xe3, 0x00, 0x21, 0x49, + 0x03, 0x8b, 0x78, 0x2d, 0x09, 0x5c, 0x76, 0x3a, 0xe0, 0xb3, 0x61, 0x8f, 0x3f, 0x3a, 0x4c, 0xc5, + 0xa7, 0x03, 0x92, 0x86, 0x1c, 0x6e, 0xeb, 0x48, 0xe4, 0x2d, 0x98, 0x66, 0x3f, 0x6f, 0x7a, 0x0f, + 0x29, 0xaf, 0x70, 0x3a, 0x7e, 0x2f, 0x47, 0xaa, 0x5d, 0x56, 0xc2, 0xeb, 0x33, 0x31, 0xc9, 0x97, + 0xe1, 0x38, 0x72, 0x6a, 0xf8, 0x5d, 0xda, 0xac, 0xec, 0xec, 0x78, 0x2d, 0x8f, 0x1b, 0x0b, 0xf1, + 0x30, 0x05, 0xa8, 0x03, 0xe6, 0x15, 0x23, 0x86, 0xe3, 0xc6, 0x28, 0x76, 0x36, 0x25, 0xb9, 0x0f, + 0xa5, 0xe5, 0x5e, 0x18, 0xf9, 0xed, 0x4a, 0x14, 0x05, 0xde, 0x76, 0x2f, 0xa2, 0xe1, 0xc2, 0xac, + 0xe1, 0xcc, 0xcf, 0x16, 0x87, 0x2a, 0xe4, 0xda, 0x9d, 0x06, 0x52, 0x38, 0xae, 0x22, 0xb1, 0x53, + 0x4c, 0xac, 0x7f, 0x9c, 0x83, 0x69, 0x83, 0x94, 0xbc, 0x09, 0x53, 0x37, 0x02, 0x8f, 0x76, 0x9a, + 0xad, 0x03, 0xed, 0xda, 0x89, 0x77, 0x92, 0x1d, 0x01, 0xe7, 0xad, 0x36, 0xd0, 0x94, 0xd6, 0x26, + 0x9f, 0x69, 0xc9, 0x77, 0x85, 0xfb, 0x14, 0x8a, 0x09, 0x5a, 0x88, 0xa3, 0x8b, 0xe0, 0x04, 0x15, + 0xb3, 0x53, 0x43, 0x21, 0xef, 0xc2, 0x18, 0x7f, 0x60, 0x14, 0x66, 0x65, 0xa7, 0xb2, 0x9a, 0xc9, + 0xfd, 0x57, 0x71, 0x22, 0xa2, 0x15, 0x49, 0x68, 0x0b, 0x22, 0xeb, 0x67, 0x72, 0x40, 0xd2, 0xa8, + 0x47, 0x68, 0xb1, 0x8e, 0xb4, 0x4e, 0xf9, 0x40, 0xad, 0xc6, 0x82, 0xa1, 0xb3, 0x65, 0x35, 0xf1, + 0x02, 0xde, 0xf1, 0x62, 0xd5, 0xe9, 0x6a, 0x35, 0x5e, 0x6c, 0xfd, 0x85, 0x3c, 0x40, 0x8c, 0x4d, + 0xbe, 0xc8, 0xb3, 0xac, 0x7c, 0xb9, 0xe7, 0xb6, 0xbc, 0x1d, 0xcf, 0x0c, 0x3b, 0x88, 0x4c, 0xbe, + 0x25, 0x4b, 0x6c, 0x13, 0x91, 0xbc, 0x0f, 0xb3, 0xf5, 0x4d, 0x93, 0x56, 0xcb, 0x28, 0x11, 0x76, + 0x9d, 0x04, 0x79, 0x12, 0x1b, 0xcd, 0x47, 0xf5, 0xd1, 0xe0, 0xe6, 0xa3, 0x7c, 0x20, 0x44, 0x09, + 0xdb, 0x58, 0xea, 0x9b, 0xc2, 0x62, 0xb9, 0x59, 0xab, 0x8a, 0x5d, 0x0a, 0xbf, 0x2e, 0xec, 0x3a, + 0x5d, 0x61, 0xca, 0xcc, 0xf6, 0x09, 0x03, 0x2f, 0xee, 0xc8, 0xd1, 0x3e, 0x3e, 0xaa, 0x3f, 0x8b, + 0x4a, 0xbc, 0xb6, 0x1f, 0x51, 0xa1, 0xbb, 0x78, 0x66, 0x6f, 0x31, 0xf1, 0xeb, 0xf4, 0xa8, 0xe1, + 0x7a, 0x67, 0xb4, 0x4e, 0x58, 0x60, 0x5c, 0x8b, 0xaf, 0x1c, 0xfc, 0x9d, 0x3a, 0xc3, 0x68, 0xe3, + 0x6f, 0xe5, 0xe0, 0x78, 0x26, 0x2d, 0xb9, 0x0c, 0x10, 0x6b, 0x88, 0x44, 0x2f, 0xe1, 0x8e, 0x19, + 0xc7, 0xd4, 0xb0, 0x35, 0x0c, 0xf2, 0xb5, 0xa4, 0x6e, 0xe7, 0xe8, 0x83, 0xf0, 0xb4, 0x8c, 0x99, + 0x64, 0xea, 0x76, 0x32, 0x34, 0x3a, 0xd6, 0xdf, 0x2d, 0xc0, 0x9c, 0x16, 0xb2, 0x83, 0x7f, 0xeb, + 0x11, 0xe6, 0xbc, 0x0f, 0x60, 0x8a, 0xb5, 0xc6, 0x6b, 0x08, 0xff, 0x1f, 0x6e, 0x49, 0xf1, 0x6a, + 0xca, 0x79, 0x4a, 0x70, 0xbb, 0xac, 0x23, 0xf3, 0x48, 0x66, 0xb8, 0x75, 0xa2, 0xe6, 0xbc, 0x91, + 0xf6, 0x03, 0x32, 0x98, 0x93, 0x10, 0xa6, 0xab, 0x07, 0x1d, 0xb7, 0xad, 0x6a, 0xe3, 0x16, 0x15, + 0xaf, 0xf5, 0xad, 0xcd, 0xc0, 0xe6, 0xd5, 0xc5, 0x6e, 0x06, 0xbc, 0x2c, 0xc3, 0xc3, 0xd5, 0xa0, + 0x3a, 0xfd, 0x3e, 0xcc, 0xa5, 0x3e, 0xfa, 0x89, 0x82, 0xaa, 0xdd, 0x07, 0x92, 0xfe, 0x8e, 0x0c, + 0x0e, 0xaf, 0x99, 0x21, 0xfb, 0x8e, 0xab, 0xc7, 0x53, 0xcc, 0xf9, 0xcc, 0xed, 0x33, 0x16, 0xf5, + 0x90, 0x6b, 0x3f, 0x9b, 0xd7, 0x1d, 0xd8, 0x9e, 0xf5, 0x55, 0xf7, 0x81, 0x71, 0xb7, 0x3d, 0xdb, + 0x6f, 0x4c, 0x87, 0xd2, 0x21, 0xfc, 0xa0, 0x00, 0x27, 0xfb, 0x50, 0x92, 0x83, 0xe4, 0x24, 0xe2, + 0x3a, 0x85, 0xab, 0x83, 0x2b, 0x7c, 0x1a, 0x53, 0x89, 0x7c, 0x91, 0xbb, 0xb0, 0x37, 0x30, 0xaf, + 0xb0, 0xb8, 0x4d, 0xf3, 0x34, 0xf7, 0x0a, 0x9a, 0xf4, 0x5d, 0xe7, 0x50, 0xf2, 0x3e, 0x8c, 0xa2, + 0xf7, 0x62, 0x22, 0x64, 0x18, 0xc3, 0x40, 0xb8, 0x16, 0x5f, 0x8d, 0xfd, 0x34, 0xe2, 0xab, 0x31, + 0x00, 0xf9, 0x02, 0x14, 0x2a, 0xf7, 0xeb, 0x62, 0x5c, 0x66, 0x74, 0xf2, 0xfb, 0xf5, 0x38, 0x36, + 0xbc, 0x6b, 0x04, 0x71, 0x67, 0x14, 0x8c, 0xf0, 0xe6, 0xf2, 0xa6, 0x18, 0x15, 0x9d, 0xf0, 0xe6, + 0xf2, 0x66, 0x4c, 0xb8, 0xdb, 0x30, 0x42, 0xb0, 0xdc, 0x5c, 0xde, 0xfc, 0xec, 0xa6, 0xfd, 0xbf, + 0x93, 0xe7, 0x7e, 0xf7, 0xbc, 0x61, 0xef, 0xc3, 0x94, 0x11, 0x52, 0x35, 0x17, 0xcb, 0x63, 0x2a, + 0xfc, 0x6d, 0xc2, 0x04, 0xc5, 0x20, 0x90, 0x59, 0x16, 0xd8, 0x6f, 0x94, 0x78, 0x75, 0x63, 0x0f, + 0xc5, 0x01, 0x65, 0xe2, 0x64, 0x96, 0x05, 0x45, 0x42, 0xae, 0x41, 0x71, 0x8b, 0x76, 0xdc, 0x4e, + 0xa4, 0xd4, 0x9b, 0x68, 0xad, 0x1a, 0x21, 0xcc, 0x94, 0x1a, 0x14, 0x22, 0x5a, 0x56, 0xf6, 0xb6, + 0xc3, 0x46, 0xe0, 0x61, 0x7c, 0x0e, 0x75, 0x16, 0x73, 0xcb, 0x4a, 0xad, 0xc4, 0x64, 0x90, 0x20, + 0xb2, 0x7e, 0x36, 0x07, 0xe3, 0x62, 0x20, 0x79, 0x76, 0x9c, 0xdd, 0xf8, 0x2c, 0x11, 0xd9, 0x71, + 0x76, 0xbd, 0x64, 0x76, 0x9c, 0x5d, 0x1e, 0x04, 0x63, 0x42, 0xb8, 0x90, 0xaa, 0x87, 0x3e, 0x9e, + 0x4c, 0x9d, 0x03, 0xcd, 0x6a, 0x63, 0xd4, 0x61, 0xfd, 0x65, 0xac, 0xbf, 0x21, 0xbe, 0xec, 0xe6, + 0xf2, 0x26, 0x59, 0x84, 0xe2, 0x9a, 0xcf, 0x03, 0xac, 0xe8, 0xa9, 0x0e, 0x5b, 0x02, 0xa6, 0x77, + 0x90, 0xc4, 0x63, 0xdf, 0xb7, 0x19, 0xf8, 0xe2, 0x2e, 0xa3, 0x7d, 0x5f, 0x97, 0x03, 0x13, 0xdf, + 0xa7, 0x50, 0x87, 0xfe, 0x3e, 0x9a, 0xb1, 0x49, 0xdc, 0xbb, 0x86, 0xe1, 0xe7, 0x6f, 0xe9, 0x7e, + 0x48, 0xa2, 0x48, 0xee, 0x14, 0xa7, 0xfb, 0xed, 0x14, 0xf7, 0xae, 0xd9, 0x19, 0x54, 0xf8, 0x4a, + 0x16, 0x83, 0xeb, 0x34, 0x78, 0xf8, 0x0c, 0xef, 0xd2, 0xd9, 0xaf, 0x64, 0xc9, 0xe6, 0x0d, 0xb5, + 0x49, 0xff, 0xa3, 0x3c, 0x9c, 0xc8, 0x26, 0xd4, 0xdb, 0x92, 0x1b, 0xd0, 0x96, 0x8b, 0x50, 0x5c, + 0xf5, 0xc3, 0x48, 0xb3, 0x3a, 0x43, 0x65, 0xfe, 0x9e, 0x80, 0xd9, 0xaa, 0x94, 0xdd, 0xb9, 0xd9, + 0xdf, 0x6a, 0x79, 0x22, 0x3f, 0xf4, 0x36, 0x67, 0x77, 0x6e, 0x5e, 0x44, 0x6e, 0x42, 0xd1, 0x16, + 0x7e, 0x30, 0x89, 0xae, 0x91, 0x60, 0x25, 0x4d, 0x91, 0x40, 0x40, 0x8c, 0xc8, 0xb6, 0x02, 0x46, + 0x2a, 0x30, 0x2e, 0x46, 0x3f, 0xf1, 0x10, 0x9c, 0x31, 0x65, 0xcc, 0x60, 0xd3, 0x92, 0x8e, 0xed, + 0x28, 0xf8, 0xa4, 0x57, 0xab, 0x4a, 0x97, 0x16, 0xdc, 0x51, 0xf8, 0x93, 0x9f, 0x69, 0xe0, 0xa7, + 0x10, 0xad, 0xef, 0xe6, 0x01, 0xa4, 0xd6, 0xe6, 0x99, 0x9d, 0x61, 0x5f, 0x30, 0x66, 0x98, 0x66, + 0xef, 0x32, 0x7c, 0x36, 0xc7, 0x0d, 0xb4, 0x3b, 0x19, 0x3e, 0x97, 0x63, 0x19, 0x46, 0xb7, 0x62, + 0x85, 0x96, 0xf0, 0x71, 0x40, 0xe5, 0x32, 0x87, 0x5b, 0xdb, 0x70, 0xec, 0x26, 0x8d, 0x62, 0xf5, + 0x96, 0x7c, 0x48, 0x1c, 0xcc, 0xf6, 0x75, 0x98, 0x10, 0xf8, 0x6a, 0xff, 0xe2, 0xba, 0x18, 0x11, + 0xc0, 0x01, 0x75, 0x31, 0x12, 0x81, 0xed, 0x46, 0x55, 0xda, 0xa2, 0x11, 0xfd, 0x6c, 0xab, 0xa9, + 0x03, 0xe1, 0x4d, 0xc1, 0x96, 0x0d, 0x57, 0xc3, 0x91, 0xfd, 0x73, 0x0f, 0x8e, 0xab, 0x6f, 0x7f, + 0x9a, 0x7c, 0xaf, 0xb0, 0x2b, 0xa5, 0x88, 0xd3, 0x1c, 0x73, 0x1c, 0x60, 0x49, 0xf2, 0x08, 0x4e, + 0x4b, 0x82, 0xfb, 0x9e, 0x32, 0xdc, 0x1b, 0x8a, 0x96, 0xbc, 0x03, 0x93, 0x1a, 0x8d, 0x88, 0x33, + 0x8c, 0x4a, 0xe7, 0x7d, 0x2f, 0xda, 0x73, 0x42, 0x0e, 0xd7, 0x95, 0xce, 0x1a, 0xba, 0xf5, 0x55, + 0x78, 0x5e, 0xf9, 0xa1, 0x64, 0x54, 0x9d, 0x60, 0x9e, 0x7b, 0x32, 0xe6, 0xeb, 0x71, 0xb3, 0x6a, + 0x1d, 0xe5, 0xb8, 0x2a, 0x79, 0x13, 0xbd, 0x59, 0xa2, 0x31, 0x2f, 0xa4, 0x5c, 0x61, 0x35, 0x8f, + 0x57, 0xeb, 0x6d, 0xed, 0x63, 0x33, 0x18, 0x1a, 0xc4, 0xb9, 0x24, 0xf1, 0x77, 0xf3, 0x30, 0xbb, + 0x51, 0xab, 0x2e, 0x2b, 0x5b, 0xa2, 0x1f, 0xb2, 0x5c, 0x93, 0x46, 0xdb, 0xfa, 0xef, 0x37, 0xd6, + 0x5d, 0x98, 0x4f, 0x74, 0x03, 0x8a, 0x0e, 0xef, 0x71, 0x0f, 0x06, 0x05, 0x96, 0x62, 0xc3, 0x89, + 0x2c, 0xf6, 0xf7, 0xae, 0xd9, 0x09, 0x6c, 0xeb, 0x9f, 0x4c, 0x24, 0xf8, 0x8a, 0x2d, 0xec, 0x75, + 0x98, 0xa8, 0x85, 0x61, 0x8f, 0x06, 0x77, 0xed, 0x35, 0x5d, 0x55, 0xe0, 0x21, 0xd0, 0xe9, 0x05, + 0x2d, 0x3b, 0x46, 0x20, 0x97, 0xa0, 0x28, 0x42, 0xef, 0xca, 0x3d, 0x01, 0xb5, 0xb6, 0x2a, 0x72, + 0xaf, 0xad, 0x8a, 0xc9, 0x9b, 0x30, 0xc5, 0xff, 0xe6, 0xb3, 0x4d, 0x74, 0x38, 0x2a, 0x07, 0x05, + 0x3a, 0x9f, 0x9d, 0xb6, 0x81, 0x46, 0x5e, 0x85, 0x42, 0x65, 0xd9, 0x16, 0xea, 0x20, 0x21, 0x37, + 0x62, 0x06, 0xe9, 0x1e, 0x35, 0x2f, 0x11, 0xcb, 0x36, 0x93, 0xfe, 0xa4, 0x93, 0xbc, 0xd0, 0x64, + 0xf3, 0x44, 0xd7, 0x02, 0x96, 0x38, 0xcc, 0x10, 0x46, 0xae, 0xc0, 0x78, 0xd5, 0x0b, 0xbb, 0x2d, + 0xf7, 0x40, 0xe8, 0xb1, 0x79, 0x22, 0x25, 0x0e, 0x32, 0x7c, 0xdf, 0x39, 0x88, 0x5c, 0x92, 0x09, + 0x66, 0x8a, 0xb1, 0x23, 0x44, 0x9f, 0x2c, 0x32, 0xaf, 0xc3, 0x98, 0x08, 0x50, 0x3b, 0xa1, 0x85, + 0x9e, 0x4f, 0x06, 0xa6, 0x15, 0x38, 0x69, 0x8f, 0x48, 0x78, 0x9a, 0x1e, 0x91, 0xdb, 0x70, 0xf2, + 0x26, 0x6a, 0x6f, 0xcc, 0xa8, 0x2e, 0x77, 0xed, 0x9a, 0xd0, 0x87, 0xe3, 0xa3, 0x0e, 0x57, 0xf0, + 0x24, 0x03, 0xc3, 0x38, 0xbd, 0x40, 0xcf, 0x0b, 0xd8, 0x8f, 0x11, 0xf9, 0x0a, 0x1c, 0xcb, 0x2a, + 0x12, 0x5a, 0x73, 0x8c, 0x5f, 0x92, 0x5d, 0x81, 0x1e, 0xbf, 0x24, 0x8b, 0x03, 0x59, 0x83, 0x12, + 0x87, 0x57, 0x9a, 0x6d, 0xaf, 0xc3, 0x35, 0xff, 0x5c, 0xab, 0x8e, 0x9e, 0x09, 0x82, 0xab, 0xcb, + 0x0a, 0xf9, 0x0b, 0x80, 0xe1, 0xcb, 0x92, 0xa0, 0x24, 0x7f, 0x35, 0xc7, 0x6e, 0x73, 0x3c, 0x9c, + 0xeb, 0x5d, 0x7b, 0x2d, 0x14, 0xb1, 0xaf, 0x4e, 0xc4, 0x6e, 0x2a, 0xf5, 0x28, 0xf0, 0x3a, 0xbb, + 0xc2, 0x4f, 0x65, 0x4b, 0xf8, 0xa9, 0xbc, 0xf3, 0x89, 0xfc, 0x54, 0x38, 0xab, 0xf0, 0xf1, 0x61, + 0x79, 0x2a, 0x10, 0x75, 0xe2, 0x2a, 0x32, 0xbe, 0x00, 0x73, 0xda, 0xb7, 0x5a, 0xfe, 0xfe, 0xdd, + 0x0e, 0x0f, 0x26, 0x49, 0x9b, 0xbc, 0x91, 0xb3, 0xb8, 0x83, 0xf3, 0x9c, 0xf6, 0xac, 0xdc, 0xe9, + 0x29, 0x84, 0x54, 0x43, 0x33, 0x39, 0xb0, 0x8b, 0xa7, 0xf4, 0x85, 0xe0, 0xee, 0x9d, 0xa5, 0xf8, + 0xe2, 0x29, 0x1d, 0x27, 0x1c, 0x9c, 0x46, 0xfa, 0xe4, 0x31, 0x48, 0xc8, 0x15, 0x18, 0xbb, 0xe3, + 0x3e, 0xaa, 0xec, 0x52, 0x91, 0x38, 0x6c, 0x5a, 0x6e, 0x7f, 0x08, 0x5c, 0x2a, 0xfe, 0x1e, 0xb7, + 0xb5, 0x7f, 0xce, 0x16, 0x68, 0xe4, 0x47, 0x73, 0x70, 0x82, 0x2f, 0x63, 0xd9, 0xca, 0x3a, 0x8d, + 0x22, 0xd6, 0x0f, 0x22, 0x08, 0x96, 0xf4, 0x51, 0xae, 0xd7, 0x37, 0xb2, 0xf1, 0x78, 0x06, 0x76, + 0xb1, 0x33, 0xa8, 0x8e, 0x0b, 0x45, 0xa9, 0x11, 0xde, 0x33, 0x93, 0x5e, 0xd8, 0x91, 0x7f, 0x41, + 0x7e, 0x39, 0x79, 0x43, 0xf7, 0x42, 0x2c, 0xa0, 0x9c, 0x3b, 0xde, 0x76, 0x1f, 0x39, 0xee, 0x2e, + 0x35, 0x5e, 0xa7, 0x85, 0x9e, 0xf9, 0xa7, 0x73, 0x70, 0xaa, 0xef, 0xc7, 0x91, 0xeb, 0x70, 0x52, + 0x26, 0xe3, 0xdf, 0x8b, 0xa2, 0x6e, 0xe8, 0xc8, 0xcb, 0x80, 0xf0, 0x5b, 0xb4, 0x8f, 0x8b, 0xe2, + 0x55, 0x56, 0x2a, 0xef, 0x07, 0x21, 0x79, 0x1f, 0x5e, 0xf0, 0x3a, 0x21, 0x6d, 0xf4, 0x02, 0x1a, + 0x67, 0xf3, 0xf7, 0x9a, 0x81, 0x13, 0xb8, 0x9d, 0x5d, 0xe9, 0x84, 0x69, 0x9f, 0x92, 0x38, 0x32, + 0xa7, 0xbf, 0xd7, 0x0c, 0x6c, 0x44, 0xb0, 0xfe, 0x70, 0x82, 0x9f, 0x8a, 0x95, 0x5e, 0xb4, 0x27, + 0xcf, 0xd1, 0xc5, 0x2c, 0x9f, 0x1a, 0x6e, 0xec, 0xa7, 0xf9, 0xd4, 0x98, 0x9e, 0x34, 0xf2, 0x39, + 0x23, 0x9f, 0xf9, 0x9c, 0xf1, 0x3a, 0x4c, 0x2c, 0xef, 0xd1, 0xc6, 0x03, 0xe5, 0xd7, 0x50, 0x14, + 0xfa, 0x62, 0x06, 0xe4, 0xb1, 0x63, 0x63, 0x04, 0x72, 0x05, 0x00, 0x5d, 0xf9, 0xb8, 0x90, 0xa5, + 0xc5, 0x7f, 0x47, 0xcf, 0x3f, 0x61, 0x3f, 0xa1, 0xa1, 0x20, 0xfb, 0xba, 0x7d, 0x43, 0x37, 0xb8, + 0xe0, 0xec, 0xc3, 0x60, 0x47, 0xa0, 0xc7, 0x08, 0xac, 0x79, 0xda, 0x52, 0x11, 0x1b, 0x7b, 0x29, + 0xb5, 0x9e, 0x74, 0x24, 0xb4, 0x65, 0x94, 0x46, 0xdc, 0xb8, 0xaf, 0x4f, 0x09, 0x5b, 0x46, 0x65, + 0xf0, 0x6d, 0xc7, 0x08, 0xe4, 0x0b, 0x30, 0xbe, 0x4c, 0x83, 0x68, 0x6b, 0x6b, 0x0d, 0x6d, 0x22, + 0x78, 0x90, 0xf4, 0x22, 0x06, 0xb4, 0x8e, 0xa2, 0xd6, 0xc7, 0x87, 0xe5, 0xe9, 0xc8, 0x6b, 0x53, + 0x15, 0xfc, 0xd5, 0x96, 0xd8, 0x64, 0x09, 0x4a, 0xfc, 0x9d, 0x37, 0x16, 0xa6, 0x71, 0xab, 0x2f, + 0xf2, 0x83, 0x47, 0x3c, 0x0a, 0xef, 0xd3, 0x6d, 0x15, 0xce, 0x3b, 0x85, 0x4f, 0x56, 0x64, 0x14, + 0x7c, 0xbd, 0x91, 0x10, 0x6b, 0x77, 0x92, 0x4b, 0x80, 0xb5, 0x35, 0x4d, 0x41, 0x2a, 0x30, 0xbd, + 0xec, 0xb7, 0xbb, 0x6e, 0xe4, 0x61, 0x5e, 0xaa, 0x03, 0xb1, 0xab, 0xa3, 0x86, 0xaa, 0xa1, 0x17, + 0x18, 0x47, 0x84, 0x5e, 0x40, 0x6e, 0xc0, 0x8c, 0xed, 0xf7, 0xd8, 0x20, 0xc9, 0x6b, 0x25, 0xdf, + 0xb8, 0xd1, 0x72, 0x21, 0x60, 0x25, 0xec, 0x9c, 0x11, 0x77, 0x48, 0x23, 0x2e, 0x9f, 0x41, 0x45, + 0xd6, 0x33, 0xf4, 0xfb, 0xfa, 0x6e, 0xad, 0x07, 0xf5, 0x4e, 0x31, 0xcb, 0x78, 0x1a, 0xb8, 0x06, + 0x93, 0xf5, 0xfa, 0xc6, 0x16, 0x0d, 0xa3, 0x1b, 0x2d, 0x7f, 0x1f, 0x37, 0xeb, 0xa2, 0x48, 0x76, + 0x12, 0xfa, 0x4e, 0x44, 0xc3, 0xc8, 0xd9, 0x69, 0xf9, 0xfb, 0xb6, 0x8e, 0x45, 0xbe, 0xc1, 0xfa, + 0x43, 0x13, 0x6d, 0x44, 0x04, 0xc2, 0x41, 0xd2, 0x17, 0x6e, 0x89, 0xf1, 0x92, 0x61, 0x32, 0x98, + 0xd9, 0x59, 0x1a, 0x3a, 0x3a, 0xe9, 0xb0, 0x0b, 0x71, 0xa5, 0xd9, 0x0c, 0x68, 0x18, 0x8a, 0x5d, + 0x95, 0x3b, 0xe9, 0xe0, 0xed, 0xd9, 0xe5, 0x05, 0x86, 0x93, 0x8e, 0x46, 0x40, 0xbe, 0x97, 0x83, + 0xe3, 0xba, 0x9d, 0x3f, 0x2e, 0x16, 0xb4, 0xc2, 0xe0, 0x7b, 0xec, 0x1b, 0x97, 0xe5, 0xa9, 0x72, + 0x59, 0x43, 0xbb, 0xfc, 0xf0, 0xea, 0xe5, 0x4a, 0xfc, 0xb3, 0x2e, 0x89, 0x44, 0x10, 0xaf, 0x2c, + 0x7e, 0xfa, 0x09, 0xe1, 0x66, 0x90, 0x92, 0x65, 0x26, 0x78, 0xb0, 0xf9, 0x84, 0x56, 0x3d, 0xb5, + 0x4d, 0xdc, 0xa2, 0x85, 0x82, 0x50, 0xcc, 0x3e, 0x6e, 0xff, 0xe3, 0x75, 0x4d, 0xf9, 0x42, 0xa3, + 0x21, 0x35, 0x98, 0xe5, 0x00, 0xb6, 0x25, 0xf0, 0x4c, 0x18, 0xf3, 0x71, 0x34, 0x6e, 0xc1, 0x06, + 0x9f, 0xae, 0x31, 0x1b, 0x86, 0x1e, 0x30, 0x2f, 0x41, 0x87, 0x92, 0x7f, 0xbd, 0x72, 0x67, 0x2d, + 0x16, 0x5f, 0x7f, 0xb8, 0xec, 0xf4, 0x8d, 0xb6, 0x0d, 0xb0, 0xd3, 0xbf, 0xcb, 0x3d, 0x17, 0xb5, + 0x6e, 0x90, 0x92, 0xbf, 0x01, 0x4e, 0x4a, 0xfe, 0x09, 0x1a, 0x3b, 0x81, 0x6d, 0x7d, 0x5c, 0x4c, + 0xf0, 0x15, 0xb6, 0x79, 0x16, 0x8c, 0x71, 0xc1, 0x5e, 0xcf, 0xcd, 0xce, 0xc5, 0x7e, 0x5b, 0x94, + 0x90, 0x53, 0x50, 0xa8, 0xd7, 0x37, 0x44, 0x27, 0xa3, 0x85, 0x5e, 0x18, 0xfa, 0x36, 0x83, 0xb1, + 0x11, 0x42, 0xb3, 0x3b, 0x2d, 0xf6, 0x30, 0xdb, 0x41, 0x6d, 0x84, 0xb2, 0xfe, 0x96, 0x62, 0xf6, + 0x48, 0xdc, 0xdf, 0x42, 0xcc, 0x8e, 0x85, 0xeb, 0x65, 0x58, 0xa8, 0x84, 0x21, 0x0d, 0xd8, 0x04, + 0x15, 0xd6, 0x5c, 0x81, 0x10, 0x05, 0xc5, 0x41, 0x81, 0x95, 0xba, 0x8d, 0xd0, 0xee, 0x8b, 0x48, + 0x2e, 0x42, 0xb1, 0xd2, 0x6b, 0x7a, 0xb4, 0xd3, 0x30, 0x02, 0x0b, 0xb9, 0x02, 0x66, 0xab, 0x52, + 0xf2, 0x65, 0x38, 0x9e, 0x08, 0xae, 0x25, 0x7a, 0x60, 0x3c, 0x5e, 0xcd, 0x52, 0x54, 0x8d, 0xdf, + 0xac, 0x79, 0x97, 0x64, 0x53, 0x92, 0x0a, 0x94, 0x56, 0xd0, 0x2f, 0xa5, 0x4a, 0xb9, 0xfa, 0xdc, + 0x0f, 0xb8, 0xaf, 0x0d, 0xbf, 0x58, 0x70, 0x9f, 0x15, 0xa7, 0xa9, 0x0a, 0xed, 0x14, 0x3a, 0xb9, + 0x0d, 0xf3, 0x49, 0x18, 0x3b, 0x13, 0xf8, 0x1d, 0x02, 0x83, 0x5f, 0xa6, 0xb8, 0xe0, 0xa9, 0x90, + 0x45, 0x45, 0xb6, 0x61, 0x2e, 0xb6, 0xd9, 0x30, 0x6f, 0x16, 0xd2, 0xb0, 0x53, 0x95, 0xcb, 0xdb, + 0xc5, 0xf3, 0x62, 0x32, 0xce, 0xc7, 0xf6, 0x1f, 0xea, 0x86, 0x61, 0xa7, 0xd9, 0x91, 0x26, 0xcc, + 0xd4, 0xbd, 0xdd, 0x8e, 0xd7, 0xd9, 0xbd, 0x4d, 0x0f, 0x36, 0x5d, 0x2f, 0x10, 0x26, 0x76, 0xd2, + 0x80, 0xb6, 0x12, 0x1e, 0xb4, 0xdb, 0x34, 0x0a, 0xf0, 0xb4, 0x65, 0xe5, 0xe8, 0x26, 0xca, 0x24, + 0xc6, 0xd3, 0x21, 0xa7, 0x43, 0x17, 0xac, 0xae, 0xeb, 0x19, 0xc7, 0x8a, 0xc9, 0xd3, 0xb8, 0xdd, + 0x4d, 0x0d, 0x79, 0xbb, 0x6b, 0xc1, 0xdc, 0x4a, 0xa7, 0x11, 0x1c, 0xe0, 0x2b, 0x86, 0xfc, 0xb8, + 0xe9, 0x23, 0x3e, 0xee, 0x25, 0xf1, 0x71, 0x2f, 0xb8, 0x72, 0x86, 0x65, 0x7d, 0x5e, 0x9a, 0x31, + 0xa9, 0xc3, 0x1c, 0x4a, 0x6c, 0xb5, 0xea, 0x66, 0xad, 0xe3, 0x45, 0x1e, 0x66, 0x10, 0xe7, 0xc7, + 0xd5, 0xcb, 0x82, 0xe7, 0x19, 0x2e, 0xc5, 0x7b, 0xcd, 0xae, 0xe3, 0x49, 0x14, 0x9d, 0x69, 0x8a, + 0x7e, 0x90, 0x28, 0x3d, 0xfb, 0xaf, 0x46, 0x94, 0xc6, 0xf4, 0x58, 0x09, 0xf7, 0xe9, 0x52, 0xbc, + 0xb7, 0x87, 0x58, 0xc4, 0x8e, 0x08, 0xbf, 0x87, 0xe2, 0x89, 0x91, 0x1e, 0xcb, 0xa4, 0xb3, 0xbe, + 0x37, 0xc1, 0xf7, 0x76, 0x5d, 0x7e, 0xed, 0x67, 0x8c, 0x97, 0x90, 0x6b, 0xf3, 0x4f, 0x22, 0xd7, + 0x16, 0x8e, 0x96, 0x6b, 0x47, 0x8e, 0x92, 0x6b, 0x13, 0x82, 0xe7, 0xe8, 0x13, 0x0b, 0x9e, 0x63, + 0x4f, 0x20, 0x78, 0x8e, 0x3f, 0x91, 0xe0, 0x69, 0x48, 0xd0, 0xc5, 0xa3, 0x24, 0xe8, 0x3f, 0x15, + 0x53, 0x9f, 0x55, 0x31, 0x35, 0x4b, 0x54, 0x78, 0x22, 0x31, 0xb5, 0xbf, 0x94, 0x59, 0xfa, 0xd7, + 0x2d, 0x65, 0xce, 0x3d, 0x1d, 0x29, 0x93, 0x7c, 0x42, 0x29, 0xf3, 0xcf, 0x40, 0x29, 0x79, 0xf0, + 0x1d, 0x1d, 0x53, 0xf0, 0xa9, 0x85, 0xa0, 0x62, 0xc7, 0x72, 0xf2, 0xe0, 0x61, 0x17, 0xe9, 0xcd, + 0xc0, 0x7b, 0xe8, 0x46, 0xf4, 0xb6, 0x34, 0x5e, 0x10, 0xf1, 0x30, 0x39, 0x14, 0xb7, 0x0f, 0x0d, + 0x45, 0xc9, 0x5c, 0xf9, 0x2c, 0x99, 0xcb, 0xfa, 0x4b, 0x79, 0x98, 0xe3, 0x71, 0x5c, 0x9e, 0x7d, + 0x1d, 0xfa, 0x7b, 0x86, 0x24, 0x2d, 0x4d, 0xe5, 0x12, 0xad, 0x1b, 0xa0, 0x45, 0xff, 0x3a, 0x1c, + 0x4f, 0x75, 0x05, 0x4a, 0xd3, 0x55, 0x19, 0x41, 0x27, 0x25, 0x4f, 0x2f, 0x64, 0x57, 0x72, 0xef, + 0x9a, 0x9d, 0xa2, 0xb0, 0xfe, 0xe9, 0x48, 0x8a, 0xbf, 0xd0, 0xa7, 0xeb, 0x1a, 0xf2, 0xdc, 0x93, + 0x69, 0xc8, 0xf3, 0xc3, 0x69, 0xc8, 0x13, 0xc7, 0x54, 0x61, 0x98, 0x63, 0xea, 0xcb, 0x30, 0xbd, + 0x45, 0xdd, 0x76, 0xb8, 0xe5, 0x8b, 0xa0, 0xf7, 0xdc, 0x54, 0x56, 0x06, 0xc8, 0x61, 0x65, 0x52, + 0x18, 0x54, 0x26, 0x3f, 0x11, 0x23, 0x60, 0x5b, 0x2b, 0x8f, 0x82, 0x6f, 0x9b, 0x1c, 0x74, 0x09, + 0x7f, 0x74, 0x80, 0x84, 0x5f, 0x87, 0x29, 0x41, 0x17, 0x07, 0x52, 0x8c, 0x45, 0x51, 0x56, 0x84, + 0x70, 0x59, 0xbb, 0xca, 0xc5, 0xa8, 0x6a, 0xe7, 0x52, 0xa8, 0xc1, 0x84, 0x75, 0xc1, 0x4a, 0xa7, + 0xd9, 0xf5, 0xbd, 0x0e, 0x76, 0xc1, 0x78, 0xdc, 0x05, 0x54, 0x80, 0x79, 0x17, 0x68, 0x48, 0xe4, + 0x1d, 0x98, 0xa9, 0x6c, 0xd6, 0x74, 0xb2, 0x62, 0xac, 0xa4, 0x77, 0xbb, 0x9e, 0x63, 0x90, 0x26, + 0x70, 0x07, 0x49, 0x65, 0x13, 0xff, 0x6a, 0xa4, 0x32, 0xeb, 0x1f, 0x4e, 0xc8, 0xe5, 0xfd, 0xd9, + 0x2a, 0x03, 0x4d, 0xf5, 0x5e, 0xe1, 0x09, 0xd5, 0x7b, 0x23, 0x47, 0x09, 0x27, 0x86, 0xc4, 0x34, + 0xfa, 0x04, 0x12, 0xd3, 0xd8, 0xa7, 0x56, 0xd5, 0x8d, 0x3f, 0xa1, 0x0c, 0x94, 0x58, 0x69, 0xc5, + 0x61, 0x56, 0x5a, 0xa6, 0xdc, 0x34, 0xf1, 0xe9, 0xe5, 0x26, 0x78, 0x62, 0xb9, 0xa9, 0x1e, 0xbb, + 0x91, 0x4d, 0x1e, 0x69, 0xcf, 0x7b, 0x46, 0xdc, 0x57, 0xe6, 0xb2, 0x43, 0xf8, 0x28, 0x87, 0xb2, + 0x1f, 0x2a, 0x61, 0xec, 0x9b, 0xd9, 0xc2, 0xd8, 0xe0, 0xd3, 0xe6, 0x4f, 0xc5, 0xb1, 0xa7, 0x22, + 0x8e, 0x05, 0x38, 0x60, 0xf7, 0xdd, 0xa0, 0x83, 0x57, 0xce, 0x2b, 0x30, 0x2e, 0xa3, 0x62, 0xe5, + 0x62, 0xed, 0x49, 0x3a, 0x1c, 0x96, 0xc4, 0x22, 0x8b, 0x50, 0x94, 0xc4, 0x7a, 0x14, 0xf3, 0x7d, + 0x01, 0x33, 0x02, 0x0e, 0x09, 0x98, 0xf5, 0xb7, 0x47, 0xe4, 0xa6, 0xc0, 0xbe, 0x43, 0xa4, 0xf9, + 0x5e, 0xd2, 0x26, 0x81, 0x26, 0x0c, 0x26, 0x86, 0x39, 0x61, 0xe9, 0x67, 0x92, 0x7c, 0xa2, 0x38, + 0x65, 0x71, 0xa6, 0xad, 0xc2, 0x10, 0x99, 0xb6, 0xde, 0x32, 0xd2, 0x54, 0x8d, 0xc4, 0x79, 0x51, + 0xd8, 0x42, 0x19, 0x9c, 0xa0, 0xea, 0xba, 0x9e, 0x4f, 0x6a, 0x34, 0x0e, 0xd9, 0x81, 0x94, 0x03, + 0x32, 0x49, 0x29, 0xe9, 0x76, 0xec, 0x49, 0x22, 0x00, 0x8e, 0xff, 0x6b, 0x8d, 0x00, 0xb8, 0x02, + 0xa0, 0xa5, 0x56, 0xe6, 0x8f, 0x3b, 0x2f, 0xb3, 0x6e, 0x3a, 0x3a, 0xad, 0xb2, 0x46, 0x68, 0xfd, + 0x2e, 0x81, 0xb9, 0x7a, 0x7d, 0xa3, 0xea, 0xb9, 0xbb, 0x1d, 0x3f, 0x8c, 0xbc, 0x46, 0xad, 0xb3, + 0xe3, 0x33, 0xd1, 0x4e, 0x6d, 0x30, 0x5a, 0xa8, 0xb7, 0x78, 0x73, 0x51, 0xc5, 0xec, 0xea, 0xb0, + 0x12, 0x04, 0x7e, 0xa0, 0x5f, 0x1d, 0x28, 0x03, 0xd8, 0x1c, 0xce, 0xa4, 0xa7, 0x7a, 0x8f, 0xe7, + 0xc8, 0xe5, 0xef, 0x6d, 0x28, 0x3d, 0x85, 0x1c, 0x64, 0xcb, 0x32, 0x42, 0xd3, 0x13, 0x56, 0x48, + 0xd3, 0x27, 0x8d, 0x38, 0x82, 0x71, 0x31, 0xdf, 0x3e, 0xc5, 0xf1, 0x86, 0x4b, 0xb1, 0x8b, 0x70, + 0xfd, 0x81, 0x3c, 0xb5, 0x06, 0x0e, 0xe0, 0xb8, 0xe1, 0x02, 0x35, 0xac, 0xe2, 0xf0, 0x55, 0x21, + 0xad, 0x59, 0xe8, 0x3f, 0x9b, 0xa1, 0x3d, 0xd4, 0xf3, 0x3a, 0x64, 0xd6, 0x40, 0xfe, 0x52, 0x0e, + 0xce, 0x64, 0x96, 0xa8, 0xd5, 0x3d, 0x69, 0xc4, 0x72, 0xd4, 0x36, 0x0d, 0x9e, 0xc1, 0xa2, 0x5f, + 0xd5, 0x4e, 0xc6, 0x56, 0x30, 0xb8, 0x26, 0xf2, 0xeb, 0x39, 0x38, 0x69, 0x60, 0xa8, 0xed, 0x33, + 0x54, 0xbe, 0xbe, 0x99, 0xf3, 0xfa, 0xa3, 0xa7, 0x33, 0xaf, 0xcf, 0x9b, 0x6d, 0x89, 0x77, 0x77, + 0xbd, 0x0d, 0xfd, 0xbe, 0x90, 0x3c, 0x84, 0x39, 0x2c, 0x92, 0x4a, 0x4c, 0x36, 0x67, 0x85, 0xee, + 0xf3, 0x58, 0xfc, 0xd9, 0xdc, 0xad, 0x0f, 0xb3, 0x10, 0x2e, 0xfe, 0xe0, 0xb0, 0x3c, 0x6d, 0xa0, + 0xcb, 0xe8, 0x88, 0x4e, 0xac, 0x09, 0xf5, 0x3a, 0x3b, 0xbe, 0x7e, 0xf4, 0xa6, 0xaa, 0x20, 0xff, + 0x20, 0x07, 0x0b, 0x0c, 0xca, 0x9b, 0x71, 0x23, 0xf0, 0xdb, 0xaa, 0x5c, 0x5a, 0x5a, 0xf4, 0xe9, + 0xb6, 0xd6, 0xd3, 0xe9, 0xb6, 0x97, 0xf1, 0x93, 0xf9, 0x9e, 0xe0, 0xec, 0x04, 0x7e, 0x3b, 0xfe, + 0x7c, 0x23, 0x75, 0x70, 0xbf, 0x8f, 0x24, 0x3f, 0x96, 0x83, 0x53, 0x86, 0xe6, 0x45, 0x0f, 0x55, + 0x2d, 0x9c, 0x27, 0xe7, 0x95, 0x93, 0x74, 0x5c, 0xb4, 0x74, 0x59, 0xcc, 0xff, 0x0b, 0xf8, 0x05, + 0xf1, 0x69, 0x81, 0xdf, 0xe2, 0xb4, 0x39, 0x96, 0xf6, 0x09, 0xfd, 0x6b, 0x21, 0x1e, 0xcc, 0xe1, + 0x1b, 0xa5, 0x61, 0x11, 0x74, 0xac, 0xbf, 0x45, 0x90, 0x0a, 0xe9, 0x8e, 0x01, 0x6a, 0xfb, 0x9b, + 0x05, 0xa5, 0xb9, 0x92, 0x3f, 0x0b, 0xa7, 0x52, 0x40, 0xb5, 0xda, 0x8e, 0xf7, 0x5d, 0x6d, 0xaf, + 0x3d, 0x3e, 0x2c, 0xbf, 0x92, 0x55, 0x5b, 0xd6, 0x4a, 0xeb, 0x5f, 0x03, 0x71, 0x01, 0xe2, 0x42, + 0x91, 0x81, 0x38, 0x7b, 0x82, 0xbe, 0x26, 0xe6, 0x87, 0x86, 0xcf, 0xf6, 0x72, 0xed, 0x1b, 0xf4, + 0x23, 0x2f, 0x46, 0x22, 0x14, 0xa6, 0xb4, 0xe0, 0xbc, 0x07, 0x98, 0x8a, 0xb8, 0x6f, 0x25, 0x3f, + 0x38, 0x2c, 0x1b, 0xd8, 0x4c, 0xc4, 0xd6, 0xa3, 0xfe, 0xea, 0x22, 0xb6, 0x81, 0x48, 0x7e, 0x2d, + 0x07, 0xc7, 0x18, 0x20, 0x9e, 0x54, 0xa2, 0x51, 0x0b, 0x83, 0x66, 0xfd, 0xde, 0xd3, 0x99, 0xf5, + 0x2f, 0xe2, 0x37, 0xea, 0xb3, 0x3e, 0xd5, 0x25, 0x99, 0x1f, 0x87, 0xb3, 0xdd, 0x78, 0x0e, 0x37, + 0x66, 0xfb, 0xa9, 0x21, 0x66, 0x3b, 0x1f, 0x80, 0xa3, 0x67, 0x7b, 0xdf, 0x5a, 0xc8, 0x16, 0x4c, + 0x09, 0xe9, 0x9a, 0x77, 0xd8, 0x59, 0x23, 0xb0, 0xa7, 0x5e, 0xc4, 0xaf, 0x3c, 0x22, 0x76, 0x71, + 0xaa, 0x85, 0x06, 0x17, 0xd2, 0x81, 0x79, 0xfe, 0xdb, 0xd4, 0x75, 0x94, 0xfb, 0xea, 0x3a, 0x2e, + 0x8a, 0x16, 0x9d, 0x13, 0xfc, 0x13, 0x2a, 0x0f, 0x3d, 0xb6, 0x42, 0x06, 0x63, 0xd2, 0x05, 0x62, + 0x80, 0xf9, 0xa2, 0x3d, 0x37, 0x58, 0xc3, 0xf1, 0x8a, 0xa8, 0xb3, 0x9c, 0xac, 0x33, 0xb9, 0x72, + 0x33, 0x78, 0x13, 0x17, 0x66, 0x05, 0x94, 0xdd, 0xa5, 0x71, 0x87, 0x7f, 0xd1, 0x88, 0x6e, 0x91, + 0x28, 0xe5, 0x82, 0xb9, 0xac, 0x09, 0xa3, 0x8f, 0x24, 0x36, 0xf4, 0x24, 0x3f, 0xb2, 0x01, 0x73, + 0x95, 0x6e, 0xb7, 0xe5, 0xd1, 0x26, 0xb6, 0x92, 0x27, 0x56, 0xb5, 0xe2, 0x64, 0x1a, 0x2e, 0x2f, + 0x14, 0xb7, 0x85, 0x64, 0x56, 0xd5, 0x34, 0xad, 0xf5, 0xbd, 0x5c, 0xea, 0xa3, 0xc9, 0xeb, 0x30, + 0x81, 0x3f, 0x34, 0x17, 0x6b, 0x54, 0x02, 0xf0, 0x4f, 0x44, 0x65, 0x44, 0x8c, 0xc0, 0x84, 0x25, + 0x3d, 0x68, 0x52, 0x81, 0x0b, 0x4b, 0xe2, 0xa6, 0x1a, 0xdf, 0x4d, 0xcb, 0xd2, 0x52, 0xb3, 0x10, + 0x0b, 0x5d, 0x68, 0xa9, 0x29, 0xec, 0x33, 0xad, 0x1f, 0xcb, 0x9b, 0xd3, 0x8e, 0x5c, 0xd4, 0xe4, + 0x76, 0x2d, 0x6c, 0x93, 0x94, 0xdb, 0x35, 0x69, 0xfd, 0x6f, 0xe5, 0x60, 0x7e, 0x23, 0xd8, 0x75, + 0x3b, 0xde, 0xb7, 0x79, 0xf8, 0x47, 0x1f, 0xc7, 0x65, 0x70, 0x5e, 0xa2, 0xa7, 0x95, 0x5f, 0xc5, + 0xd7, 0x2a, 0x66, 0x33, 0x05, 0xa7, 0x8c, 0x9d, 0xf5, 0x3d, 0x68, 0xfb, 0x8e, 0x1f, 0xa6, 0xa5, + 0xb9, 0xe1, 0xe8, 0x1c, 0x6e, 0xfd, 0x95, 0x3c, 0x4c, 0x6a, 0x4b, 0x80, 0x7c, 0x1e, 0xa6, 0x74, + 0x3e, 0xba, 0x02, 0x49, 0xaf, 0xd6, 0x36, 0xb0, 0x50, 0x83, 0x44, 0xdd, 0xb6, 0xa1, 0x41, 0x62, + 0x13, 0x1d, 0xa1, 0x4f, 0x78, 0xb5, 0x79, 0x3f, 0xe3, 0x6a, 0xf3, 0x44, 0x19, 0x78, 0xdf, 0x49, + 0x5f, 0x70, 0x86, 0x4f, 0x98, 0x6b, 0xfd, 0x54, 0x0e, 0x4a, 0xc9, 0x45, 0xfa, 0x99, 0xf4, 0xca, + 0x13, 0xbc, 0x16, 0xfc, 0x44, 0x5e, 0x45, 0xe6, 0x96, 0x1e, 0x3d, 0xcf, 0xaa, 0x49, 0xcc, 0xbb, + 0x86, 0x22, 0xff, 0x79, 0x33, 0xd4, 0x8c, 0xee, 0x0b, 0x9b, 0x1d, 0x5f, 0x6a, 0xe4, 0xe7, 0x7e, + 0xb1, 0xfc, 0x9c, 0xf5, 0x21, 0x1c, 0x4b, 0x76, 0x07, 0x2a, 0xf3, 0x2b, 0x30, 0x6b, 0xc2, 0x93, + 0x71, 0xfd, 0x93, 0x54, 0x76, 0x12, 0xdf, 0xfa, 0xbd, 0x7c, 0x92, 0xb7, 0x30, 0x8f, 0x61, 0x9b, + 0x4e, 0xc7, 0xdd, 0x6e, 0xa9, 0xb8, 0xde, 0x7c, 0xd3, 0xe1, 0x20, 0x5b, 0x96, 0x3d, 0x49, 0x3e, + 0x0d, 0xe5, 0x97, 0x52, 0xc8, 0xf6, 0x4b, 0x21, 0xd7, 0x13, 0x36, 0x66, 0x5a, 0x10, 0x85, 0x7d, + 0xba, 0xed, 0xc4, 0x76, 0x66, 0x09, 0xd3, 0xb2, 0x65, 0x38, 0x66, 0xc4, 0xf7, 0x94, 0xf4, 0xa3, + 0xb1, 0xee, 0x36, 0xc2, 0x02, 0x4e, 0x9c, 0x89, 0x4c, 0x56, 0x61, 0x9c, 0x7d, 0xe6, 0x1d, 0xb7, + 0x2b, 0x74, 0xf4, 0x44, 0x79, 0xa9, 0xb5, 0xd4, 0x85, 0x4f, 0x73, 0x54, 0x6b, 0x51, 0x76, 0xe4, + 0x1b, 0x09, 0xac, 0x39, 0xa2, 0xf5, 0xcf, 0x72, 0x6c, 0xfd, 0x37, 0x1e, 0xfc, 0x90, 0x25, 0xe5, + 0x60, 0x4d, 0x1a, 0x60, 0xbd, 0xf5, 0x87, 0x79, 0x1e, 0x9a, 0x5d, 0x4c, 0x9f, 0xb7, 0x60, 0x6c, + 0xcb, 0x0d, 0x76, 0x69, 0x24, 0x82, 0x96, 0xeb, 0x5c, 0x78, 0x41, 0x1c, 0xe2, 0x21, 0xc2, 0xdf, + 0xb6, 0x20, 0xd0, 0x75, 0x61, 0xf9, 0xa1, 0x74, 0x61, 0x9a, 0xa6, 0xb7, 0xf0, 0xd4, 0x34, 0xbd, + 0x3f, 0xa2, 0xa2, 0xb0, 0x57, 0xa2, 0x21, 0xc2, 0x47, 0x9e, 0x4b, 0x66, 0x31, 0x48, 0x05, 0xfa, + 0x8c, 0xd9, 0x91, 0xeb, 0x7a, 0x5e, 0x04, 0xcd, 0xd5, 0xe3, 0x88, 0x0c, 0x08, 0xd6, 0x1f, 0x16, + 0x78, 0x1f, 0x8b, 0x8e, 0xba, 0x60, 0xb8, 0x81, 0xe1, 0x3a, 0x61, 0x1b, 0xbd, 0xee, 0x91, 0x8b, + 0x86, 0x1d, 0x17, 0x60, 0x84, 0xcd, 0x4d, 0xd1, 0x9b, 0x88, 0xc7, 0xe6, 0xaf, 0x8e, 0xc7, 0xca, + 0xd9, 0x5a, 0xc6, 0x33, 0x49, 0x4f, 0x78, 0x83, 0xc7, 0x96, 0xbe, 0x96, 0x11, 0x83, 0x5c, 0x84, + 0x91, 0x75, 0xbf, 0x29, 0xc3, 0x94, 0x1e, 0x43, 0x67, 0x60, 0xbf, 0xa9, 0xb1, 0x5c, 0xc8, 0xd9, + 0x88, 0xc1, 0xda, 0xaa, 0x02, 0x9b, 0xeb, 0x6d, 0x6d, 0xef, 0xb8, 0xe9, 0x44, 0x26, 0x5a, 0x0c, + 0xf4, 0x15, 0x98, 0x31, 0xf3, 0x6d, 0x0a, 0xdb, 0x36, 0xd4, 0xd8, 0x26, 0xd2, 0x76, 0xea, 0x8a, + 0x76, 0x93, 0x88, 0x2c, 0xc1, 0xb4, 0x11, 0x1e, 0x4d, 0x3c, 0x96, 0xa1, 0x7a, 0xd3, 0x0c, 0xae, + 0xa6, 0xab, 0x37, 0x0d, 0x12, 0x76, 0x9e, 0x8b, 0xef, 0xd7, 0x9e, 0xcc, 0x52, 0xdf, 0x2e, 0x70, + 0xc8, 0x35, 0x28, 0x72, 0xaf, 0xdb, 0x5a, 0x55, 0x7f, 0xf8, 0x08, 0x11, 0x96, 0xf0, 0x5a, 0x97, + 0x88, 0x9a, 0x97, 0xe5, 0xe7, 0xa0, 0x24, 0xb6, 0xa4, 0x38, 0xb3, 0xe5, 0x0b, 0x30, 0xb2, 0x5c, + 0xab, 0xda, 0xfa, 0x36, 0xd2, 0xf0, 0x9a, 0x81, 0x8d, 0x50, 0x34, 0xdd, 0x5f, 0xa7, 0xd1, 0xbe, + 0x1f, 0x3c, 0xb0, 0x69, 0x18, 0x05, 0x1e, 0xcf, 0x97, 0x84, 0x0b, 0xf1, 0xf3, 0xe4, 0x1d, 0x18, + 0x45, 0x23, 0xab, 0xc4, 0xc9, 0x90, 0xac, 0x63, 0x69, 0x5a, 0x4c, 0xe0, 0x51, 0xb4, 0xd8, 0xb2, + 0x39, 0x11, 0x79, 0x0b, 0x46, 0xaa, 0xb4, 0x73, 0x90, 0x48, 0xe5, 0x92, 0x22, 0x56, 0x1b, 0x42, + 0x93, 0x76, 0x0e, 0x6c, 0x24, 0xb1, 0x7e, 0x2a, 0x0f, 0xc7, 0x33, 0x3e, 0xeb, 0xde, 0xe7, 0x9f, + 0xd1, 0x5d, 0x71, 0xc9, 0xd8, 0x15, 0xe5, 0x7b, 0x67, 0xdf, 0x8e, 0xcf, 0xdc, 0x24, 0x7f, 0x3e, + 0x07, 0x27, 0xcd, 0x09, 0x2a, 0xac, 0x2a, 0xef, 0x5d, 0x23, 0x6f, 0xc3, 0xd8, 0x2a, 0x75, 0x9b, + 0x54, 0xa6, 0x79, 0x38, 0xae, 0xe2, 0xe3, 0x70, 0x97, 0x42, 0x5e, 0xc8, 0xd9, 0xc6, 0x0e, 0x28, + 0x1c, 0x4a, 0xaa, 0xe2, 0xe3, 0xb8, 0x3c, 0x6e, 0x49, 0xf7, 0xde, 0xac, 0xaa, 0x06, 0x58, 0x0d, + 0xfc, 0x20, 0x07, 0xcf, 0x0f, 0xa0, 0x61, 0x03, 0xc7, 0x86, 0x5e, 0x1f, 0x38, 0x3c, 0x51, 0x11, + 0x4a, 0xde, 0x83, 0xd9, 0x2d, 0x21, 0xcf, 0xcb, 0xe1, 0xc8, 0xc7, 0xeb, 0x45, 0x8a, 0xfa, 0x8e, + 0x1c, 0x97, 0x24, 0xb2, 0xe1, 0x77, 0x5e, 0x18, 0xe8, 0x77, 0xae, 0xbb, 0x71, 0x8f, 0x0c, 0xeb, + 0xc6, 0xfd, 0x61, 0x32, 0x4b, 0xbd, 0x88, 0xa6, 0x17, 0x3b, 0xb1, 0xe7, 0xfa, 0x3b, 0xb1, 0x0f, + 0x8c, 0xd9, 0x65, 0xfd, 0x95, 0x1c, 0x94, 0x4c, 0xde, 0x9f, 0x76, 0x3c, 0xdf, 0x35, 0xc6, 0xf3, + 0xf9, 0xec, 0xf1, 0xec, 0x3f, 0x90, 0xff, 0x67, 0x2e, 0xd9, 0xd8, 0xa1, 0x46, 0xd0, 0x82, 0xb1, + 0xaa, 0xdf, 0x76, 0xbd, 0x8e, 0x9e, 0x28, 0xb5, 0x89, 0x10, 0x5b, 0x94, 0x0c, 0xe7, 0xf3, 0x7f, + 0x0e, 0x46, 0xd7, 0xfd, 0x4e, 0xa5, 0x2a, 0x8c, 0x0e, 0x91, 0x4f, 0xc7, 0xef, 0x38, 0x6e, 0xd3, + 0xe6, 0x05, 0x64, 0x0d, 0xa0, 0xde, 0x08, 0x28, 0xed, 0xd4, 0xbd, 0x6f, 0xd3, 0x84, 0xa4, 0xc1, + 0x7a, 0xa8, 0xd5, 0xc3, 0x8d, 0x05, 0xdf, 0x78, 0x42, 0x44, 0x74, 0x42, 0xef, 0xdb, 0xfa, 0x7e, + 0xab, 0xd1, 0x5b, 0x14, 0x20, 0x26, 0xc2, 0xc4, 0x6d, 0x5e, 0x53, 0x64, 0x02, 0x9e, 0x16, 0x89, + 0xdb, 0x18, 0xc0, 0x48, 0xdc, 0xc6, 0x00, 0x6c, 0x6b, 0x5f, 0xa5, 0xde, 0xee, 0x1e, 0xb7, 0x3e, + 0x99, 0xe6, 0x53, 0x75, 0x0f, 0x21, 0xfa, 0xd6, 0xce, 0x71, 0xac, 0x7f, 0x31, 0x0a, 0xa7, 0x6c, + 0xba, 0xeb, 0x31, 0x31, 0xf9, 0x6e, 0xe8, 0x75, 0x76, 0x0d, 0xaf, 0x6c, 0x2b, 0x31, 0x91, 0x44, + 0x40, 0x62, 0x06, 0x51, 0x1d, 0x73, 0x09, 0x8a, 0xec, 0x54, 0xd4, 0xe6, 0x12, 0xbe, 0xa1, 0x60, + 0x9a, 0x73, 0x3e, 0xc9, 0x65, 0x31, 0x79, 0x55, 0x9c, 0xda, 0x5a, 0xc8, 0x78, 0x76, 0x6a, 0x7f, + 0x7c, 0x58, 0x86, 0xfa, 0x41, 0x18, 0x51, 0xbc, 0xb1, 0x89, 0x93, 0x5b, 0x89, 0xd6, 0x23, 0x7d, + 0x44, 0xeb, 0x3b, 0x70, 0xac, 0xd2, 0xe4, 0x9b, 0xb5, 0xdb, 0xda, 0x0c, 0xbc, 0x4e, 0xc3, 0xeb, + 0xba, 0x2d, 0x79, 0x5d, 0xc4, 0x5e, 0x76, 0x55, 0xb9, 0xd3, 0x55, 0x08, 0x76, 0x26, 0x19, 0x6b, + 0x46, 0x75, 0xbd, 0x8e, 0xce, 0xcb, 0xe2, 0x79, 0x0c, 0x9b, 0xd1, 0xec, 0x84, 0xd8, 0x8a, 0xd0, + 0x56, 0xc5, 0x28, 0xd4, 0xa3, 0x39, 0xc3, 0xd6, 0x5a, 0x3d, 0xf6, 0x4e, 0xe2, 0x11, 0x6d, 0xb9, + 0xc9, 0x43, 0xd4, 0x0a, 0xd1, 0xec, 0xc1, 0xc0, 0x8b, 0xe9, 0xea, 0xf5, 0x55, 0x46, 0x57, 0x4c, + 0xd1, 0x85, 0xe1, 0x9e, 0x4e, 0xc7, 0xf1, 0xc8, 0x15, 0x36, 0x15, 0xda, 0x7e, 0x44, 0x71, 0x9e, + 0x4f, 0xc4, 0x57, 0x80, 0x00, 0xa1, 0xfc, 0x0a, 0xa0, 0xa1, 0x90, 0x77, 0x60, 0x7e, 0x65, 0x79, + 0x51, 0x2a, 0x35, 0xab, 0x7e, 0xa3, 0x87, 0x0f, 0xd4, 0x80, 0xf5, 0xe1, 0x18, 0xd2, 0xc6, 0x22, + 0x9b, 0xdc, 0x59, 0x68, 0xe4, 0x02, 0x8c, 0xd7, 0xaa, 0xbc, 0xef, 0x27, 0xf5, 0xb4, 0x0d, 0xc2, + 0xf0, 0x43, 0x16, 0x92, 0x8d, 0x58, 0x46, 0x9d, 0x3a, 0x52, 0x98, 0x3c, 0x35, 0x84, 0x7c, 0xfa, + 0x16, 0x4c, 0x2f, 0xf9, 0x51, 0xad, 0x13, 0x46, 0x6e, 0xa7, 0x41, 0x6b, 0x55, 0x3d, 0xea, 0xe2, + 0xb6, 0x1f, 0x39, 0x9e, 0x28, 0x61, 0x5f, 0x6e, 0x62, 0x92, 0x2f, 0x22, 0xe9, 0x4d, 0xda, 0xa1, + 0x41, 0x1c, 0x6d, 0x71, 0x94, 0xf7, 0x2d, 0x23, 0xdd, 0x55, 0x25, 0xb6, 0x89, 0x28, 0x52, 0x4a, + 0xf0, 0xd4, 0x45, 0xcb, 0x7e, 0x93, 0x86, 0xf7, 0xae, 0xfe, 0x90, 0xa5, 0x94, 0xd0, 0xda, 0x86, + 0x5b, 0xe6, 0xd5, 0xcc, 0xfd, 0xf5, 0xdf, 0xc7, 0x94, 0x12, 0x29, 0x5c, 0xf2, 0x45, 0x18, 0xc5, + 0x9f, 0x42, 0xd8, 0x9a, 0xcf, 0x60, 0x1b, 0x0b, 0x5a, 0x0d, 0x9e, 0x5d, 0x19, 0x09, 0x48, 0x0d, + 0xc6, 0x85, 0x9c, 0xff, 0x24, 0x81, 0xd1, 0xc5, 0x85, 0x81, 0xcf, 0x0c, 0x41, 0x6f, 0x35, 0x61, + 0x4a, 0xaf, 0x90, 0xad, 0x88, 0x55, 0x37, 0xdc, 0xa3, 0x4d, 0xf6, 0x4b, 0xe4, 0x34, 0xc1, 0x15, + 0xb1, 0x87, 0x50, 0x87, 0x7d, 0x87, 0xad, 0xa1, 0xb0, 0x2d, 0xbe, 0x16, 0xde, 0x0d, 0xc5, 0xa7, + 0x88, 0x9b, 0xbf, 0x87, 0x5a, 0xa4, 0xa6, 0x2d, 0x8a, 0xac, 0x1f, 0x81, 0x63, 0xeb, 0xbd, 0x56, + 0xcb, 0xdd, 0x6e, 0x51, 0x19, 0xf3, 0x1a, 0xf3, 0x1b, 0x2e, 0xc1, 0x68, 0x5d, 0xcb, 0x98, 0x38, + 0xaf, 0x82, 0x8a, 0xc7, 0x38, 0x68, 0x63, 0x97, 0x43, 0x47, 0xf2, 0x44, 0xae, 0x44, 0x4e, 0x6a, + 0x7d, 0x3f, 0xce, 0xf3, 0xbd, 0x15, 0xb8, 0x8d, 0x07, 0x2a, 0x6d, 0xe6, 0xb0, 0x29, 0xcb, 0x6f, + 0xc9, 0x8f, 0x30, 0xcf, 0xcf, 0xac, 0x0f, 0x3e, 0xea, 0x63, 0xc8, 0x3b, 0x30, 0x29, 0xce, 0x50, + 0x2d, 0xfc, 0x11, 0xc6, 0x98, 0x10, 0xb7, 0x8f, 0xa4, 0x71, 0x84, 0x8e, 0x8e, 0xa2, 0x81, 0xd9, + 0x94, 0x7b, 0x57, 0x3f, 0x0b, 0xd1, 0xc0, 0xac, 0x63, 0xc0, 0xd4, 0xfd, 0xcd, 0xc9, 0x64, 0xdf, + 0x8a, 0xb9, 0x7b, 0x5d, 0x0f, 0x78, 0x92, 0x8b, 0x2f, 0x6a, 0x71, 0xc0, 0x13, 0xfd, 0xa2, 0xa6, + 0x50, 0xd5, 0x98, 0xe4, 0x8f, 0x18, 0x93, 0xf7, 0xe4, 0x98, 0x14, 0xfa, 0x4f, 0x8c, 0xf9, 0x01, + 0xe3, 0x50, 0x8f, 0x57, 0xc8, 0xc8, 0x50, 0xb7, 0xfc, 0xe7, 0x30, 0xb2, 0x2b, 0x27, 0x49, 0xee, + 0xa2, 0x82, 0x93, 0xae, 0x3a, 0x18, 0x1d, 0x9e, 0xe9, 0x11, 0x5b, 0xf3, 0x97, 0x60, 0xaa, 0x12, + 0x45, 0x6e, 0x63, 0x8f, 0x36, 0xab, 0x6c, 0x7b, 0xd2, 0x62, 0x33, 0xb8, 0x02, 0xae, 0xbf, 0xe1, + 0xe8, 0xb8, 0x3c, 0xd6, 0x98, 0x1b, 0x0a, 0x6b, 0x3d, 0x15, 0x6b, 0x8c, 0x41, 0xcc, 0x58, 0x63, + 0x0c, 0x42, 0xae, 0xc0, 0x78, 0xad, 0xf3, 0xd0, 0x63, 0x7d, 0x52, 0x8c, 0x73, 0xe8, 0x7a, 0x1c, + 0xa4, 0x6f, 0xae, 0x02, 0x8b, 0xbc, 0xa5, 0xc9, 0xd8, 0x13, 0xf1, 0x7d, 0x9a, 0x6b, 0x60, 0x94, + 0x57, 0xb7, 0x2e, 0x3f, 0x2b, 0xa1, 0xfb, 0x3a, 0x8c, 0x4b, 0xc5, 0x1a, 0xc4, 0x77, 0x68, 0x41, + 0x99, 0xf6, 0xfe, 0x94, 0xc8, 0x98, 0x02, 0x51, 0xcb, 0xcd, 0x32, 0xa9, 0xa5, 0x40, 0xd4, 0x72, + 0xb3, 0x18, 0x29, 0x10, 0xb5, 0x2c, 0x2d, 0x4a, 0x27, 0x31, 0x75, 0xa4, 0x4e, 0xe2, 0x1e, 0x4c, + 0x6d, 0xba, 0x41, 0xe4, 0x31, 0x19, 0xa5, 0x13, 0x85, 0x0b, 0xd3, 0x86, 0x1a, 0x4f, 0x2b, 0x5a, + 0x3a, 0x2b, 0xb3, 0xf6, 0x75, 0x35, 0x7c, 0x33, 0xbd, 0x5c, 0x0c, 0xcf, 0xb6, 0xd5, 0x9b, 0xf9, + 0x34, 0xb6, 0x7a, 0xd8, 0xa9, 0xa8, 0xba, 0x99, 0x8d, 0x15, 0x04, 0x28, 0x43, 0x27, 0xf4, 0x37, + 0x0a, 0x91, 0x7c, 0x0d, 0xa6, 0xd8, 0xdf, 0x9b, 0x7e, 0xcb, 0x6b, 0x78, 0x34, 0x5c, 0x28, 0x61, + 0xe3, 0xce, 0x66, 0xae, 0x7e, 0x44, 0x3a, 0xa8, 0xd3, 0x88, 0x2f, 0x60, 0x64, 0x9c, 0xd4, 0xc9, + 0x1a, 0xdc, 0xc8, 0xfb, 0x30, 0xc5, 0x66, 0xdf, 0xb6, 0x1b, 0x72, 0xd1, 0x74, 0x2e, 0xb6, 0xb6, + 0x6c, 0x0a, 0x78, 0x2a, 0xdc, 0x9f, 0x4e, 0xc0, 0x8e, 0xf9, 0x4a, 0x97, 0x6f, 0x90, 0x44, 0x9b, + 0xed, 0xdd, 0xd4, 0xe6, 0x28, 0xd1, 0xc8, 0x07, 0x30, 0x55, 0xe9, 0x76, 0xe3, 0x1d, 0x67, 0x5e, + 0xd3, 0xcb, 0x74, 0xbb, 0x4e, 0xe6, 0xae, 0x63, 0x50, 0x24, 0x37, 0xe6, 0x63, 0x4f, 0xb4, 0x31, + 0x93, 0x37, 0x94, 0xb4, 0x7e, 0x3c, 0x56, 0x32, 0x8a, 0x7b, 0x8c, 0x21, 0xfa, 0x73, 0xc1, 0x7d, + 0x19, 0xa6, 0xb9, 0xd6, 0x4d, 0x4a, 0x33, 0x27, 0x52, 0xab, 0x27, 0x43, 0xa8, 0x31, 0x69, 0xc8, + 0x0a, 0xcc, 0x70, 0x47, 0xb7, 0x96, 0x88, 0xc3, 0xb8, 0x70, 0x32, 0xce, 0xfa, 0xcc, 0xfd, 0xe3, + 0x5a, 0x18, 0x9e, 0xdb, 0x35, 0xb8, 0x24, 0x88, 0xac, 0x3f, 0xca, 0xc1, 0xc9, 0x3e, 0x23, 0xae, + 0xa2, 0xf4, 0xe5, 0x06, 0x47, 0xe9, 0x63, 0x3b, 0x87, 0x79, 0x49, 0xc7, 0xf6, 0x0b, 0x29, 0x4b, + 0x1f, 0x2f, 0x29, 0x6f, 0xf9, 0x40, 0x44, 0x3c, 0x7b, 0x51, 0xf5, 0x2d, 0x1f, 0x35, 0x85, 0x85, + 0xf4, 0x21, 0x24, 0xf0, 0xf8, 0x47, 0x2d, 0x59, 0x8f, 0x0f, 0xcb, 0x67, 0x45, 0xb8, 0x7c, 0x35, + 0xac, 0x1f, 0xf9, 0xc6, 0x0a, 0xce, 0x60, 0x6d, 0x1d, 0xe6, 0x60, 0x52, 0x5b, 0x87, 0xe4, 0x9c, + 0xe6, 0x36, 0x57, 0xe2, 0x09, 0x17, 0x34, 0x0e, 0x79, 0x7e, 0x12, 0xe1, 0xa2, 0xca, 0x1f, 0xad, + 0x0f, 0xbd, 0xc3, 0x44, 0x21, 0x2d, 0x92, 0x61, 0xdb, 0x50, 0x5e, 0xda, 0x58, 0x8e, 0xc9, 0x46, + 0xdd, 0x30, 0xaa, 0x34, 0x22, 0xef, 0x21, 0x1d, 0xe2, 0xd0, 0x89, 0x93, 0x8d, 0xba, 0x61, 0xe4, + 0xb8, 0x48, 0x96, 0x4a, 0x36, 0xaa, 0x18, 0x5a, 0x3f, 0x9e, 0x03, 0xb8, 0x5b, 0x5b, 0xc6, 0x50, + 0xa4, 0x9f, 0x56, 0x28, 0xc8, 0x0e, 0xef, 0x26, 0xb9, 0x0f, 0x10, 0x07, 0xfe, 0x87, 0x1c, 0xcc, + 0x98, 0x68, 0xe4, 0x3d, 0x98, 0xad, 0x37, 0x02, 0xbf, 0xd5, 0xda, 0x76, 0x1b, 0x0f, 0xd6, 0xbc, + 0x0e, 0xe5, 0x81, 0xb5, 0x46, 0xf9, 0x59, 0x14, 0xaa, 0x22, 0xa7, 0xc5, 0xca, 0xec, 0x24, 0x32, + 0xf9, 0xf3, 0x39, 0x98, 0xae, 0xef, 0xf9, 0xfb, 0x71, 0xaa, 0x79, 0x3e, 0x20, 0x5f, 0x67, 0x6b, + 0x3b, 0xdc, 0xf3, 0xf7, 0x9d, 0x8c, 0x7c, 0xf3, 0x1f, 0x1f, 0x96, 0xdf, 0x1d, 0xee, 0x99, 0xb8, + 0xe1, 0xe3, 0x4d, 0x26, 0x0a, 0x2f, 0x1b, 0x95, 0xd8, 0x66, 0x9d, 0xd6, 0x9f, 0xe4, 0x60, 0x12, + 0xef, 0x3c, 0xad, 0x16, 0xca, 0x5c, 0x3f, 0x4c, 0xa9, 0x7f, 0x54, 0xbb, 0x06, 0x0c, 0xec, 0x9b, + 0x30, 0x9b, 0x40, 0x23, 0x16, 0x8c, 0xd5, 0xd1, 0x55, 0x5a, 0x57, 0x50, 0x70, 0xe7, 0x69, 0x5b, + 0x94, 0x58, 0x2b, 0x1a, 0xd9, 0xbd, 0xab, 0xf8, 0xca, 0xb8, 0x08, 0xe0, 0x49, 0x90, 0xbc, 0xd9, + 0x90, 0xe4, 0x97, 0xdc, 0xbb, 0x6a, 0x6b, 0x58, 0xd6, 0x3a, 0x8c, 0xd5, 0xfd, 0x20, 0x5a, 0x3a, + 0xe0, 0x97, 0x89, 0x2a, 0x0d, 0x1b, 0xfa, 0x33, 0xa2, 0x87, 0xaa, 0xfb, 0x86, 0x2d, 0x8a, 0x48, + 0x19, 0x46, 0x6f, 0x78, 0xb4, 0xd5, 0xd4, 0xed, 0x45, 0x77, 0x18, 0xc0, 0xe6, 0x70, 0x76, 0xe1, + 0x3a, 0x11, 0x47, 0xec, 0x8e, 0x0d, 0x53, 0x3f, 0xed, 0xba, 0x59, 0x36, 0xfa, 0xf7, 0x45, 0x33, + 0xb3, 0xae, 0x51, 0xd3, 0x80, 0xae, 0xfe, 0x4f, 0x72, 0x70, 0xba, 0x3f, 0x89, 0x6e, 0xeb, 0x9a, + 0x1b, 0x60, 0xeb, 0xfa, 0x72, 0xf2, 0xd9, 0x0b, 0xd1, 0xc4, 0xb3, 0x57, 0xfc, 0xd8, 0x55, 0x45, + 0x53, 0xe3, 0x86, 0x4a, 0x7c, 0x7e, 0x6e, 0xc0, 0x37, 0x23, 0x22, 0x1f, 0xe6, 0x08, 0x69, 0x6c, + 0x41, 0x6b, 0xfd, 0xc6, 0x08, 0x9c, 0xea, 0x4b, 0x41, 0x56, 0xb5, 0xe0, 0xff, 0x33, 0x2a, 0xec, + 0x78, 0x5f, 0xfc, 0xcb, 0xf8, 0x2f, 0x5a, 0x93, 0x25, 0x9d, 0x69, 0x36, 0x54, 0xd0, 0x77, 0x9e, + 0xe1, 0xfe, 0xb5, 0x23, 0x79, 0x71, 0x74, 0x64, 0x06, 0xe9, 0xf8, 0xef, 0xe8, 0x76, 0x45, 0x23, + 0xd7, 0x6b, 0x85, 0xfa, 0xb2, 0x6b, 0x72, 0x90, 0x2d, 0xcb, 0x62, 0x03, 0xe4, 0x91, 0x6c, 0x03, + 0x64, 0xeb, 0x5f, 0xe4, 0x60, 0x42, 0x7d, 0x36, 0x39, 0x0d, 0x27, 0xb6, 0xec, 0xca, 0xf2, 0x8a, + 0xb3, 0xf5, 0xe1, 0xe6, 0x8a, 0x73, 0x77, 0xbd, 0xbe, 0xb9, 0xb2, 0x5c, 0xbb, 0x51, 0x5b, 0xa9, + 0x96, 0x9e, 0x23, 0x73, 0x30, 0x7d, 0x77, 0xfd, 0xf6, 0xfa, 0xc6, 0xfd, 0x75, 0x67, 0xc5, 0xb6, + 0x37, 0xec, 0x52, 0x8e, 0x4c, 0xc3, 0x84, 0xbd, 0x54, 0x59, 0x76, 0xd6, 0x37, 0xaa, 0x2b, 0xa5, + 0x3c, 0x29, 0xc1, 0xd4, 0xf2, 0xc6, 0xfa, 0xfa, 0xca, 0xf2, 0x56, 0xed, 0x5e, 0x6d, 0xeb, 0xc3, + 0x52, 0x81, 0x10, 0x98, 0x41, 0x84, 0x4d, 0xbb, 0xb6, 0xbe, 0x5c, 0xdb, 0xac, 0xac, 0x95, 0x46, + 0x18, 0x8c, 0xe1, 0x6b, 0xb0, 0x51, 0xc5, 0xe8, 0xf6, 0xdd, 0xa5, 0x95, 0xd2, 0x18, 0x43, 0x61, + 0x7f, 0x69, 0x28, 0xe3, 0xac, 0x7a, 0x44, 0xa9, 0x56, 0xb6, 0x2a, 0x4b, 0x95, 0xfa, 0x4a, 0xa9, + 0x48, 0x4e, 0xc2, 0xbc, 0x01, 0x72, 0xd6, 0x36, 0x6e, 0xd6, 0xd6, 0x4b, 0x13, 0xe4, 0x18, 0x94, + 0x14, 0xac, 0xba, 0xe4, 0xdc, 0xad, 0xaf, 0xd8, 0x25, 0x48, 0x42, 0xd7, 0x2b, 0x77, 0x56, 0x4a, + 0x93, 0xd6, 0xbb, 0xdc, 0xcd, 0x89, 0x77, 0x35, 0x39, 0x01, 0xa4, 0xbe, 0x55, 0xd9, 0xba, 0x5b, + 0x4f, 0x34, 0x7e, 0x12, 0xc6, 0xeb, 0x77, 0x97, 0x97, 0x57, 0xea, 0xf5, 0x52, 0x8e, 0x00, 0x8c, + 0xdd, 0xa8, 0xd4, 0xd6, 0x56, 0xaa, 0xa5, 0xbc, 0xf5, 0x57, 0x73, 0x30, 0x27, 0x25, 0x40, 0xf9, + 0x86, 0xf1, 0x29, 0xd7, 0xe2, 0x7b, 0xc6, 0xc5, 0x56, 0x7a, 0xa1, 0x24, 0x2a, 0x19, 0xb0, 0x0c, + 0x7f, 0x3e, 0x07, 0xc7, 0x33, 0xb1, 0xc9, 0x87, 0x50, 0x92, 0x5f, 0x70, 0xc7, 0x8d, 0x1a, 0x7b, + 0xf1, 0x3e, 0x76, 0x36, 0x51, 0x4b, 0x02, 0x8d, 0xab, 0x35, 0xe3, 0xe4, 0x82, 0x29, 0x36, 0xc3, + 0x07, 0xcb, 0xb5, 0x7e, 0x2e, 0x07, 0x27, 0xfb, 0x54, 0x43, 0x96, 0x61, 0x4c, 0x85, 0x4d, 0x1f, + 0x60, 0x50, 0x75, 0xec, 0x07, 0x87, 0x65, 0x81, 0x88, 0xd9, 0xd8, 0xf0, 0x2f, 0x7b, 0x4c, 0xc5, + 0x41, 0xc7, 0x60, 0xe4, 0xbc, 0xfb, 0x4e, 0x25, 0x7a, 0x5e, 0xd4, 0x54, 0xb9, 0x5f, 0x5f, 0x9a, + 0x14, 0x7d, 0x57, 0x70, 0xf7, 0x43, 0x8c, 0x46, 0x6e, 0xfd, 0x74, 0x8e, 0x09, 0x77, 0x49, 0x44, + 0x26, 0xf3, 0x56, 0xc2, 0xb0, 0xd7, 0xa6, 0xb6, 0xdf, 0xa2, 0x15, 0x7b, 0x5d, 0x1c, 0x1b, 0x28, + 0xad, 0xba, 0x58, 0x80, 0xd7, 0x0a, 0xc7, 0x0d, 0x3a, 0xc6, 0xe3, 0xa9, 0x4e, 0x43, 0xde, 0x02, + 0x50, 0x59, 0xf1, 0x65, 0x50, 0x03, 0x1e, 0xd4, 0x43, 0x40, 0x4d, 0x79, 0x5b, 0x43, 0xb6, 0xfe, + 0x62, 0x0e, 0xa6, 0xc4, 0xa5, 0xa9, 0xd2, 0xa2, 0x41, 0xf4, 0xe9, 0xa6, 0xd7, 0x5b, 0xc6, 0xf4, + 0x52, 0xfe, 0x03, 0x1a, 0x7f, 0x56, 0x9c, 0x39, 0xb3, 0xfe, 0xdb, 0x1c, 0x94, 0x92, 0x88, 0xe4, + 0x3d, 0x28, 0xd6, 0xe9, 0x43, 0x1a, 0x78, 0xd1, 0x81, 0xd8, 0x28, 0x65, 0x82, 0x19, 0x8e, 0x23, + 0xca, 0xf8, 0x7c, 0x08, 0xc5, 0x2f, 0x5b, 0xd1, 0x0c, 0xbb, 0xdf, 0x6b, 0x6a, 0x8f, 0xc2, 0xd3, + 0x52, 0x7b, 0x58, 0xff, 0x6b, 0x1e, 0x4e, 0xde, 0xa4, 0x91, 0xde, 0x26, 0xf5, 0xda, 0xfd, 0xb9, + 0xe1, 0xda, 0xa5, 0xb5, 0x64, 0x01, 0xc6, 0xb1, 0x48, 0x8e, 0xaf, 0x2d, 0x7f, 0x92, 0x25, 0x35, + 0xaf, 0x0b, 0x46, 0x06, 0x8b, 0x3e, 0x75, 0x5f, 0xd6, 0x62, 0xda, 0xab, 0x69, 0x7d, 0x01, 0x66, + 0x30, 0x68, 0x6b, 0x8f, 0x2d, 0x07, 0xda, 0x14, 0xea, 0x9f, 0xa2, 0x9d, 0x80, 0x92, 0x57, 0xa1, + 0xc4, 0x20, 0x95, 0xc6, 0x83, 0x8e, 0xbf, 0xdf, 0xa2, 0xcd, 0x5d, 0xca, 0xd3, 0x98, 0x17, 0xed, + 0x14, 0x5c, 0xf2, 0xbc, 0xdb, 0xe1, 0x57, 0x37, 0xda, 0x44, 0x1d, 0x8d, 0xe0, 0x19, 0x43, 0x4f, + 0xbf, 0x05, 0x93, 0x9f, 0x30, 0x3f, 0x85, 0xf5, 0xbf, 0xe4, 0xe0, 0x18, 0x36, 0x4e, 0xab, 0x18, + 0x5f, 0x0c, 0x3e, 0x17, 0xf7, 0x96, 0x16, 0xb2, 0xdd, 0x65, 0x20, 0x73, 0x29, 0xa8, 0x5e, 0x8c, + 0x75, 0x42, 0xf9, 0x21, 0x74, 0x42, 0xf5, 0x27, 0xc9, 0x7a, 0x3a, 0xa4, 0x4a, 0x8b, 0xe7, 0xaa, + 0x8f, 0x87, 0xdc, 0xfa, 0xf3, 0x79, 0x18, 0xb7, 0x29, 0xa6, 0x83, 0x24, 0x17, 0x60, 0x7c, 0xdd, + 0x8f, 0x68, 0x78, 0xc7, 0xc8, 0xfd, 0xd9, 0x61, 0x20, 0xa7, 0xdd, 0xb4, 0x65, 0x21, 0x9b, 0xf0, + 0x9b, 0x81, 0xdf, 0xec, 0x35, 0x22, 0x7d, 0xc2, 0x77, 0x39, 0xc8, 0x96, 0x65, 0xe4, 0x75, 0x98, + 0x10, 0x9c, 0xd5, 0x1b, 0x23, 0xda, 0xc6, 0x06, 0x54, 0xa5, 0x13, 0x8d, 0x11, 0x50, 0xa6, 0xe5, + 0x02, 0xc6, 0x88, 0x26, 0xd3, 0xa6, 0x64, 0x06, 0x29, 0xaa, 0x8f, 0x0e, 0x10, 0xd5, 0x3f, 0x07, + 0x63, 0x95, 0x30, 0xa4, 0x91, 0x74, 0xd2, 0x9e, 0x52, 0x11, 0x73, 0x42, 0x1a, 0x71, 0xc6, 0x2e, + 0x96, 0xdb, 0x02, 0xcf, 0xfa, 0x67, 0x79, 0x18, 0xc5, 0x3f, 0xf1, 0x5d, 0x35, 0x68, 0xec, 0x19, + 0xef, 0xaa, 0x41, 0x63, 0xcf, 0x46, 0x28, 0xb9, 0x8a, 0x9a, 0x0a, 0x99, 0x5d, 0x40, 0xb4, 0x1e, + 0x55, 0xf0, 0xcd, 0x18, 0x6c, 0xeb, 0x38, 0xea, 0xc1, 0xb9, 0x90, 0x19, 0x9a, 0xe1, 0x04, 0xe4, + 0x37, 0xea, 0xa2, 0xc5, 0x18, 0x42, 0xc6, 0x0f, 0xed, 0xfc, 0x46, 0x1d, 0x7b, 0x63, 0xb5, 0xb2, + 0xf8, 0xe6, 0x75, 0x3d, 0x4d, 0x6d, 0xb8, 0xe7, 0x2e, 0xbe, 0x79, 0xdd, 0x16, 0x25, 0xac, 0x7f, + 0xf1, 0x9b, 0xf1, 0xe1, 0x95, 0x3b, 0x15, 0x63, 0xff, 0x62, 0xdb, 0xf0, 0x91, 0xd5, 0x8e, 0x11, + 0xc8, 0x22, 0x4c, 0x0a, 0x57, 0x76, 0xc4, 0xd7, 0x5c, 0xcd, 0x85, 0xab, 0x3b, 0xa7, 0xd0, 0x91, + 0xf8, 0x13, 0x9c, 0x18, 0x20, 0x99, 0x03, 0x4d, 0x3c, 0xc1, 0xc9, 0x21, 0x0c, 0x6d, 0x0d, 0x25, + 0xf6, 0x89, 0x8e, 0x9d, 0x85, 0x75, 0x9f, 0x68, 0x0c, 0xc2, 0xab, 0x10, 0xac, 0x5f, 0xce, 0x43, + 0x71, 0xb3, 0xd5, 0xdb, 0xf5, 0x3a, 0xf7, 0xae, 0x12, 0x02, 0x78, 0x8d, 0x93, 0x51, 0x9a, 0xd9, + 0xdf, 0xe4, 0x14, 0x14, 0xe5, 0xcd, 0x4d, 0x6e, 0x48, 0xa1, 0xb8, 0xb5, 0x2d, 0x80, 0x1c, 0x77, + 0x91, 0xd3, 0x5e, 0xfe, 0x24, 0x57, 0x41, 0xdd, 0xbf, 0xfa, 0x5d, 0xd4, 0x46, 0xd8, 0x62, 0xb1, + 0x15, 0x1a, 0x79, 0x03, 0xf0, 0x90, 0x10, 0x97, 0x07, 0xa9, 0xd0, 0xe6, 0x9f, 0x26, 0xe4, 0x14, + 0x4e, 0x82, 0x68, 0xe4, 0x1a, 0x88, 0x89, 0x29, 0x32, 0x67, 0x1e, 0x37, 0x09, 0x78, 0xf6, 0x22, + 0x49, 0x22, 0x50, 0xc9, 0x3b, 0x30, 0x19, 0xe7, 0xac, 0x8f, 0x13, 0x62, 0xea, 0x94, 0xcb, 0x71, + 0xf9, 0xbd, 0xab, 0xb6, 0x8e, 0x6e, 0x7d, 0x77, 0x1c, 0xa6, 0xf4, 0xef, 0x21, 0x36, 0xcc, 0x87, + 0x2d, 0x76, 0x77, 0x17, 0xb6, 0x4f, 0x5d, 0x2c, 0x14, 0xc7, 0xe9, 0x39, 0xf3, 0x83, 0x18, 0x1e, + 0x37, 0x84, 0x92, 0x3e, 0xf8, 0xab, 0xcf, 0xd9, 0x73, 0x61, 0x0c, 0xe6, 0x78, 0xa4, 0x02, 0x45, + 0xbf, 0x1b, 0xee, 0xd2, 0x8e, 0x27, 0xdf, 0x5b, 0xce, 0x1b, 0x8c, 0x36, 0x44, 0x61, 0x8a, 0x97, + 0x22, 0x23, 0x6f, 0xc2, 0x98, 0xdf, 0xa5, 0x1d, 0xd7, 0x13, 0x67, 0xdc, 0xf3, 0x09, 0x06, 0xb4, + 0x53, 0xa9, 0x69, 0x84, 0x02, 0x99, 0x5c, 0x81, 0x11, 0xff, 0x81, 0x1a, 0xaf, 0x53, 0x26, 0xd1, + 0x83, 0xc8, 0xd5, 0x48, 0x10, 0x91, 0x11, 0x7c, 0xe4, 0xb6, 0x77, 0xc4, 0x88, 0x99, 0x04, 0xb7, + 0xdc, 0xf6, 0x8e, 0x4e, 0xc0, 0x10, 0xc9, 0xfb, 0x00, 0x5d, 0x77, 0x97, 0x06, 0x4e, 0xb3, 0x17, + 0x1d, 0x88, 0x71, 0x3b, 0x6b, 0x90, 0x6d, 0xb2, 0xe2, 0x6a, 0x2f, 0x3a, 0xd0, 0x68, 0x27, 0xba, + 0x12, 0x48, 0x2a, 0x00, 0x6d, 0x37, 0x8a, 0x68, 0xd0, 0xf6, 0x85, 0xf1, 0xd9, 0xa4, 0x4a, 0x38, + 0xc9, 0x19, 0xdc, 0x51, 0xc5, 0x1a, 0x07, 0x8d, 0x08, 0x3f, 0xda, 0x0b, 0x5c, 0x91, 0xbf, 0x34, + 0xf1, 0xd1, 0x5e, 0x60, 0xb4, 0x92, 0x21, 0x92, 0x2f, 0xc2, 0x78, 0xd3, 0x0b, 0x1b, 0x7e, 0xd0, + 0x14, 0xc1, 0x19, 0x5e, 0x30, 0x68, 0xaa, 0xbc, 0x4c, 0x23, 0x93, 0xe8, 0xec, 0x6b, 0x45, 0xfc, + 0xb7, 0x75, 0x7f, 0x1f, 0xd5, 0xfc, 0xc9, 0xaf, 0xad, 0xab, 0x62, 0xfd, 0x6b, 0x63, 0x22, 0x36, + 0x94, 0xbb, 0x5e, 0xd4, 0x72, 0xb7, 0xc5, 0x3b, 0xb7, 0x39, 0x94, 0x37, 0xb1, 0x48, 0x1f, 0x4a, + 0x8e, 0x4c, 0xde, 0x82, 0x22, 0xed, 0x44, 0x81, 0xeb, 0x78, 0x4d, 0xe1, 0xb4, 0x67, 0x7e, 0x34, + 0x3b, 0x80, 0xdd, 0x5a, 0x55, 0xff, 0x68, 0xc4, 0xaf, 0x35, 0x59, 0xff, 0x84, 0x0d, 0xaf, 0x2d, + 0x7c, 0xed, 0xcc, 0xfe, 0xa9, 0x2f, 0xd7, 0xee, 0xe8, 0xfd, 0xc3, 0x10, 0xc9, 0x7b, 0x30, 0xce, + 0xd6, 0x6f, 0xd3, 0xdf, 0x15, 0x1e, 0xef, 0x96, 0xd9, 0x3f, 0xbc, 0x2c, 0x35, 0x5d, 0x25, 0x11, + 0x39, 0x0b, 0x10, 0x3f, 0x91, 0xf3, 0x07, 0x0d, 0x5b, 0x83, 0x7c, 0x69, 0xe4, 0x7f, 0xff, 0xc5, + 0x72, 0x6e, 0x09, 0xa0, 0x28, 0xa3, 0x5b, 0x58, 0x6b, 0x70, 0xaa, 0xef, 0xa2, 0x22, 0x97, 0xa0, + 0xb4, 0xe3, 0x0a, 0x95, 0x5a, 0x63, 0xcf, 0xed, 0x74, 0x68, 0x4b, 0x6c, 0x67, 0xb3, 0x12, 0xbe, + 0xcc, 0xc1, 0x9c, 0xb3, 0xf5, 0x3e, 0x1c, 0xcb, 0xea, 0x4d, 0xf2, 0x22, 0x4c, 0xe9, 0x81, 0x3c, + 0x04, 0x93, 0x49, 0xb7, 0xeb, 0xc9, 0x50, 0x1e, 0x82, 0xc1, 0xaf, 0xe7, 0xe0, 0x85, 0x41, 0x6b, + 0x93, 0x9c, 0x86, 0x62, 0x37, 0xf0, 0x7c, 0x94, 0x01, 0xf9, 0x0e, 0xaa, 0x7e, 0x93, 0x33, 0x00, + 0x5c, 0x58, 0x89, 0xdc, 0x5d, 0x61, 0xcc, 0x6f, 0x4f, 0x20, 0x64, 0xcb, 0xdd, 0x0d, 0xc9, 0x6b, + 0x30, 0xd7, 0xa4, 0x3b, 0x6e, 0xaf, 0x15, 0x39, 0x61, 0x63, 0x8f, 0x36, 0xd1, 0x7f, 0x06, 0x8d, + 0xb4, 0xec, 0x92, 0x28, 0xa8, 0x4b, 0x78, 0xea, 0x8b, 0x47, 0xfb, 0x7c, 0xf1, 0xad, 0x91, 0x62, + 0xae, 0x94, 0xb7, 0xd1, 0x56, 0xc9, 0xfa, 0xd1, 0x3c, 0x2c, 0xf4, 0x9b, 0x8c, 0xe4, 0xdd, 0xac, + 0x3e, 0xe0, 0xaf, 0x02, 0x3a, 0x5c, 0x7f, 0x15, 0xd0, 0x6a, 0x23, 0x8b, 0xa0, 0xbc, 0x5f, 0x8e, + 0xf2, 0x64, 0x97, 0x30, 0x46, 0xd3, 0x75, 0xc3, 0x70, 0x9f, 0xad, 0xb7, 0x82, 0x16, 0xa8, 0x4f, + 0xc0, 0x74, 0x1a, 0x09, 0x23, 0x5f, 0x00, 0x68, 0xb4, 0xfc, 0x90, 0xe2, 0xe3, 0xbb, 0x38, 0xc8, + 0xb9, 0x09, 0xb0, 0x82, 0xea, 0xaf, 0xad, 0x08, 0x5d, 0xf6, 0x9b, 0x54, 0x0c, 0xa0, 0x0b, 0x27, + 0xfb, 0xec, 0x3e, 0x6c, 0x78, 0xe2, 0xc4, 0xa0, 0x32, 0xcd, 0x40, 0x4f, 0xa5, 0x07, 0x4d, 0xf6, + 0x78, 0xbe, 0xdf, 0x1c, 0x39, 0x00, 0x92, 0xde, 0x62, 0x18, 0x77, 0x61, 0xc8, 0xda, 0x0b, 0x14, + 0x77, 0x0e, 0xb9, 0x1b, 0xb4, 0x48, 0x19, 0x26, 0x65, 0x1a, 0x21, 0x26, 0x28, 0x73, 0xe6, 0x20, + 0x40, 0xb7, 0x29, 0x4e, 0x1e, 0x8c, 0x27, 0x89, 0x3e, 0x4e, 0xe2, 0x08, 0x9e, 0x40, 0xc8, 0xd6, + 0x41, 0x57, 0xb6, 0xee, 0x05, 0x39, 0xbf, 0xcd, 0x8d, 0x5f, 0x94, 0xfe, 0x4c, 0x4e, 0x0e, 0x7f, + 0x7a, 0xe7, 0x3c, 0xea, 0xfb, 0x08, 0xa0, 0x47, 0x8a, 0xf8, 0x30, 0xfc, 0x9b, 0x89, 0x04, 0x72, + 0xd5, 0x09, 0x91, 0x40, 0xfc, 0x24, 0x17, 0x60, 0x36, 0xe0, 0x36, 0x8b, 0x91, 0x2f, 0xfa, 0x13, + 0x47, 0xca, 0x9e, 0xe6, 0xe0, 0x2d, 0x1f, 0xfb, 0x54, 0x7c, 0xd7, 0x2d, 0xd5, 0x61, 0xda, 0x41, + 0x42, 0x2e, 0xc3, 0x04, 0x3b, 0x48, 0x30, 0x4e, 0x46, 0xc2, 0x14, 0x1e, 0xf1, 0xf0, 0x58, 0xb6, + 0x8b, 0x1f, 0x89, 0xbf, 0x05, 0xaf, 0x7f, 0x98, 0x93, 0xcc, 0xf4, 0x63, 0x8c, 0x9c, 0x84, 0x71, + 0x3f, 0xd8, 0xd5, 0x9a, 0x36, 0xe6, 0x07, 0xbb, 0xac, 0x5d, 0x17, 0xa1, 0xc4, 0x3d, 0x33, 0xb8, + 0xcb, 0x7b, 0x78, 0xd0, 0xe1, 0xf7, 0xdc, 0xa2, 0x3d, 0xc3, 0xe1, 0x98, 0x2b, 0xf5, 0xa0, 0xd3, + 0x60, 0x98, 0x61, 0xe8, 0x3b, 0x7a, 0x70, 0x1c, 0xd1, 0xec, 0x99, 0x30, 0xf4, 0xe3, 0x28, 0x39, + 0x4d, 0xb2, 0x04, 0xd3, 0x8c, 0x8f, 0x0a, 0xd1, 0x23, 0x4e, 0xd9, 0x33, 0xe9, 0x53, 0xf6, 0xa0, + 0xd3, 0x90, 0x9f, 0x68, 0x4f, 0x85, 0xda, 0x2f, 0xd1, 0x9a, 0x5f, 0xcd, 0xc3, 0x89, 0x6c, 0x74, + 0x1c, 0x2f, 0x56, 0x09, 0x3a, 0x28, 0x71, 0xf5, 0xa8, 0x3d, 0xc1, 0x20, 0x3c, 0x06, 0x43, 0xd6, + 0xd7, 0xe6, 0x33, 0xbf, 0xf6, 0x55, 0x98, 0x43, 0x46, 0x42, 0xae, 0x69, 0x79, 0x61, 0x24, 0x42, + 0x0b, 0xd8, 0xb3, 0xac, 0x80, 0x6f, 0x70, 0x6b, 0x0c, 0x4c, 0x5e, 0x86, 0x19, 0xb9, 0x45, 0xf9, + 0xfb, 0x1d, 0x56, 0x31, 0xdf, 0x9f, 0xa6, 0x05, 0x74, 0x03, 0x81, 0xe4, 0x38, 0x8c, 0xb9, 0xdd, + 0x2e, 0xab, 0x92, 0x6f, 0x4b, 0xa3, 0x6e, 0xb7, 0x5b, 0x6b, 0x92, 0xf3, 0x30, 0x8d, 0xee, 0x58, + 0xce, 0x0e, 0xda, 0xa4, 0x08, 0x03, 0x38, 0x7b, 0x0a, 0x81, 0xdc, 0x4e, 0x25, 0x64, 0x0b, 0x81, + 0xd1, 0x4a, 0x94, 0x71, 0x44, 0x01, 0xb7, 0xab, 0x10, 0x4e, 0x41, 0x51, 0xbe, 0x8e, 0x72, 0xab, + 0x72, 0x7b, 0xdc, 0xe5, 0x2f, 0xa3, 0xa2, 0xd3, 0xbe, 0x08, 0xb3, 0xe2, 0xa0, 0x16, 0x9b, 0x3f, + 0x32, 0x15, 0x53, 0x93, 0x49, 0xd0, 0x22, 0xf2, 0x3a, 0x08, 0x50, 0xad, 0x29, 0xbb, 0xfb, 0xf7, + 0x73, 0x70, 0x3c, 0xf3, 0xa4, 0x27, 0xdf, 0x04, 0xee, 0xb8, 0x12, 0xf9, 0x4e, 0x40, 0x1b, 0x5e, + 0xd7, 0x43, 0xd7, 0x7e, 0xae, 0x09, 0x5b, 0x1c, 0x24, 0x23, 0xa0, 0x13, 0xcc, 0x96, 0x6f, 0x2b, + 0x22, 0x7e, 0x45, 0x2f, 0x05, 0x09, 0xf0, 0xe9, 0xaf, 0xc2, 0xf1, 0x4c, 0xd4, 0x8c, 0xab, 0xf3, + 0xeb, 0x66, 0x86, 0x3a, 0xf9, 0xb6, 0x91, 0x68, 0xb4, 0x76, 0xa5, 0x16, 0xcd, 0xfb, 0x2d, 0xd5, + 0xbc, 0x84, 0x4c, 0x40, 0x56, 0x92, 0x33, 0x36, 0x4b, 0xac, 0x95, 0x44, 0x7d, 0x27, 0x2d, 0xf9, + 0x2a, 0x1c, 0x17, 0xb3, 0x68, 0x37, 0x70, 0xbb, 0x7b, 0x31, 0x3b, 0xfe, 0xa1, 0xaf, 0x64, 0xb1, + 0xe3, 0xd3, 0xeb, 0x26, 0xc3, 0x57, 0x5c, 0xe7, 0xdd, 0x34, 0x50, 0xb4, 0xe1, 0xc7, 0xf2, 0x52, + 0x20, 0xc8, 0xf8, 0x9c, 0x8c, 0xf9, 0x99, 0xcb, 0x9a, 0x9f, 0xc3, 0x2f, 0x8e, 0x75, 0x20, 0xda, + 0xad, 0xc0, 0xe1, 0xca, 0x32, 0x61, 0x87, 0x23, 0xc5, 0x3b, 0xf1, 0x21, 0xda, 0x65, 0xa2, 0xce, + 0x33, 0x04, 0xcd, 0x35, 0x92, 0x20, 0xf2, 0x3c, 0x4c, 0xa8, 0x24, 0x7c, 0x62, 0x4b, 0x2c, 0x72, + 0x40, 0xad, 0x49, 0xce, 0xc1, 0x14, 0x97, 0xe4, 0x8c, 0xc5, 0x03, 0x08, 0xab, 0xb0, 0x15, 0x24, + 0xfb, 0x20, 0x07, 0xe7, 0x8e, 0xea, 0x43, 0x72, 0x1f, 0x4e, 0xa0, 0x35, 0x40, 0xe8, 0xab, 0x61, + 0x70, 0x1a, 0x6e, 0x63, 0x8f, 0x8a, 0x59, 0x6b, 0x65, 0x0e, 0x46, 0xb7, 0x5b, 0xaf, 0x6f, 0x68, + 0xe3, 0xd0, 0xed, 0xd6, 0x43, 0x5f, 0xfe, 0x5e, 0x66, 0xe4, 0xe2, 0x1b, 0x9a, 0xf0, 0xfc, 0x00, + 0x4a, 0x6d, 0x07, 0xc8, 0xe9, 0x3b, 0xc0, 0x45, 0x28, 0xed, 0xd0, 0x26, 0x93, 0xf6, 0x68, 0x13, + 0x3f, 0xed, 0xe1, 0x22, 0x4f, 0x3b, 0x69, 0xcf, 0x28, 0x78, 0x3d, 0xf4, 0xef, 0x2d, 0x8a, 0x5a, + 0xda, 0x72, 0x33, 0xd7, 0xa5, 0x51, 0x72, 0x19, 0xe6, 0x13, 0x61, 0x13, 0x62, 0x3f, 0x5c, 0x7b, + 0x8e, 0x15, 0x99, 0x41, 0x76, 0x5e, 0x84, 0x29, 0x39, 0x2b, 0x02, 0xe5, 0xcd, 0x63, 0x4f, 0x0a, + 0x18, 0x5b, 0x75, 0xa2, 0xba, 0x9e, 0x6c, 0x54, 0xa6, 0x20, 0x3b, 0x84, 0x94, 0x48, 0xde, 0x00, + 0xa2, 0x24, 0x52, 0xb5, 0x51, 0x88, 0x0a, 0xe7, 0x64, 0x89, 0x5a, 0xe1, 0xa2, 0xda, 0xbf, 0x9d, + 0x97, 0x42, 0xe5, 0x92, 0xef, 0x47, 0x61, 0x14, 0xb8, 0x5d, 0xe3, 0x66, 0x4a, 0xda, 0x70, 0xca, + 0x77, 0x7b, 0xd1, 0xde, 0xa2, 0xc3, 0xfe, 0xf5, 0x03, 0xe9, 0xd1, 0xdb, 0x90, 0x66, 0x89, 0x93, + 0x8b, 0x57, 0xcc, 0xc3, 0xa5, 0xc2, 0xb0, 0x2b, 0x3a, 0x32, 0x93, 0x81, 0x34, 0xae, 0xab, 0xcf, + 0xd9, 0x27, 0x39, 0xcf, 0x14, 0x16, 0x59, 0x85, 0xa9, 0x6d, 0xea, 0x06, 0x34, 0x70, 0xe2, 0xb4, + 0xfa, 0xc9, 0xab, 0xe9, 0x12, 0x22, 0xa0, 0x85, 0xae, 0xc9, 0x75, 0x72, 0x3b, 0x2e, 0x21, 0xef, + 0xc1, 0x84, 0xd7, 0x14, 0xc1, 0x08, 0xc5, 0x05, 0xd5, 0xbc, 0x14, 0xd5, 0x9a, 0x3c, 0x36, 0x61, + 0xcc, 0x83, 0xdd, 0x6e, 0x3d, 0x01, 0x5d, 0x9a, 0x36, 0xee, 0xf0, 0xd6, 0x92, 0x94, 0x5f, 0xd2, + 0x64, 0x64, 0x06, 0xf2, 0x6a, 0xb6, 0xe5, 0xbd, 0x26, 0x39, 0x01, 0x63, 0xa1, 0x16, 0x1d, 0xd1, + 0x16, 0xbf, 0xac, 0x3f, 0x03, 0x17, 0x87, 0xed, 0x23, 0x36, 0x9a, 0x7d, 0x3a, 0x7c, 0xc2, 0x9e, + 0x73, 0x53, 0xfd, 0xf6, 0x22, 0xe8, 0xe1, 0xdd, 0x3c, 0x39, 0xcf, 0x24, 0xec, 0x6e, 0xe0, 0x59, + 0x3f, 0x5e, 0x80, 0x19, 0x53, 0x6b, 0x41, 0x5e, 0x83, 0x11, 0xc5, 0x76, 0x46, 0x69, 0xd7, 0x75, + 0x24, 0xc6, 0xdc, 0x46, 0x24, 0x76, 0x84, 0xe2, 0x63, 0x9c, 0xd3, 0xd6, 0x15, 0xe0, 0xf6, 0x14, + 0x02, 0xa5, 0xe2, 0xfb, 0x16, 0xf0, 0xe4, 0xca, 0xb8, 0xa5, 0x47, 0x5e, 0x9b, 0x0e, 0xa1, 0xff, + 0x2e, 0x7e, 0xff, 0xb0, 0xfc, 0x1c, 0x6a, 0x2e, 0xa7, 0x18, 0x2d, 0xdb, 0x55, 0x59, 0xa1, 0x76, + 0x29, 0x1d, 0xe9, 0x7f, 0x29, 0x15, 0x4d, 0xe9, 0x73, 0x29, 0x1d, 0x1d, 0x70, 0x29, 0x8d, 0x29, + 0xf5, 0x4b, 0x29, 0xaa, 0x26, 0xc6, 0xfb, 0xa9, 0x26, 0x62, 0x1a, 0xae, 0x9a, 0x78, 0x49, 0x34, + 0x37, 0x70, 0xf7, 0x1d, 0xec, 0x07, 0x6e, 0x36, 0xc8, 0x1b, 0x62, 0xbb, 0xfb, 0xf8, 0x6c, 0xb9, + 0x34, 0x01, 0xf2, 0xad, 0xd3, 0xfa, 0x6b, 0xb9, 0xc4, 0x35, 0x50, 0x0e, 0xc5, 0xcb, 0x30, 0xe3, + 0xb5, 0x99, 0x7c, 0x4a, 0x9b, 0x9a, 0x5c, 0x35, 0x6d, 0x4f, 0x4b, 0x28, 0x97, 0xad, 0x5e, 0x81, + 0x59, 0x85, 0xc6, 0xfd, 0xcb, 0xb9, 0x0f, 0x84, 0xad, 0xa8, 0x85, 0x7f, 0xf9, 0x6b, 0x30, 0xa7, + 0x10, 0x85, 0x28, 0xcf, 0x45, 0xab, 0x69, 0xbb, 0x24, 0x0b, 0x44, 0x9a, 0xd0, 0xd0, 0xda, 0x4d, + 0x1e, 0xce, 0x9f, 0xd1, 0x57, 0x59, 0xbf, 0x55, 0x30, 0x44, 0x64, 0x59, 0xcd, 0x12, 0x4c, 0xb2, + 0x1d, 0x59, 0x74, 0x92, 0xd8, 0x56, 0x5e, 0xec, 0xd3, 0xfd, 0xe2, 0xb5, 0xb8, 0x5e, 0xdf, 0xb0, + 0x21, 0x0c, 0x7d, 0xf9, 0x78, 0xec, 0xf0, 0x43, 0x87, 0x4b, 0x79, 0x38, 0xfd, 0x24, 0x3b, 0xbe, + 0x87, 0xbc, 0x3a, 0x98, 0x5d, 0xa5, 0xdb, 0xc5, 0x6f, 0x64, 0xb3, 0x0f, 0x0f, 0x1f, 0xf5, 0x4b, + 0x56, 0x70, 0x17, 0xf0, 0x46, 0x19, 0x9a, 0xcc, 0x0b, 0x19, 0xe2, 0x45, 0x8a, 0x39, 0xf6, 0x12, + 0x72, 0x2e, 0xf5, 0xe4, 0x9f, 0x92, 0xed, 0x0a, 0x4c, 0x85, 0x0d, 0xaf, 0xad, 0x18, 0x8e, 0x64, + 0x28, 0x37, 0xd2, 0x8d, 0x5f, 0xae, 0xdd, 0xb1, 0x27, 0x19, 0x9d, 0x64, 0xb3, 0x07, 0xa7, 0x74, + 0x29, 0xda, 0xfc, 0xc8, 0x51, 0x19, 0xb7, 0x6f, 0x60, 0x0f, 0xc4, 0xc2, 0x36, 0x7e, 0xea, 0x09, + 0xd7, 0x04, 0x08, 0x34, 0x6b, 0x0f, 0x4e, 0xf7, 0x1f, 0x12, 0x76, 0x31, 0xa3, 0xba, 0x07, 0xba, + 0x2d, 0x7f, 0x6a, 0xe7, 0x72, 0x5e, 0x3f, 0x97, 0x75, 0x99, 0xba, 0x60, 0xc8, 0xd4, 0xd6, 0xdf, + 0x2c, 0xc0, 0xf9, 0x21, 0x86, 0x6b, 0x40, 0x9d, 0x1f, 0xc0, 0x24, 0x57, 0xc9, 0xf2, 0xed, 0x33, + 0x6f, 0x08, 0x4f, 0x8c, 0xa9, 0xd8, 0xeb, 0x98, 0x20, 0x17, 0xef, 0x77, 0x10, 0xaa, 0xbf, 0xc9, + 0x37, 0x61, 0x96, 0x6f, 0x68, 0xdc, 0xe0, 0x63, 0xa7, 0xd7, 0x1a, 0x62, 0x47, 0x7b, 0x5e, 0x5a, + 0xa7, 0x27, 0x48, 0x71, 0x93, 0xc3, 0x1d, 0xa3, 0xae, 0x60, 0x64, 0x0b, 0x26, 0x11, 0x6d, 0xc7, + 0xf5, 0x5a, 0x43, 0x99, 0x49, 0x4b, 0xdb, 0x77, 0x9d, 0x8c, 0xdb, 0xa9, 0x31, 0xc0, 0x0d, 0xfc, + 0xcd, 0xae, 0xc1, 0x9d, 0x5e, 0x9b, 0x89, 0x73, 0x7c, 0x2e, 0x88, 0x77, 0xb5, 0x51, 0x7b, 0xba, + 0xd3, 0x6b, 0x57, 0xba, 0x5d, 0x1c, 0x52, 0x7c, 0x80, 0x9b, 0x63, 0x78, 0x7c, 0xd5, 0x4a, 0xcc, + 0x31, 0xc4, 0x64, 0x0c, 0xf8, 0xba, 0x15, 0xb8, 0xc7, 0x80, 0x9b, 0x63, 0xf0, 0x07, 0x05, 0x9b, + 0xff, 0xb0, 0xfe, 0x79, 0x5e, 0x8a, 0x84, 0xfd, 0xe7, 0xfd, 0x9f, 0x0e, 0x51, 0xc6, 0x10, 0x5d, + 0x84, 0x12, 0xeb, 0xfa, 0x78, 0x53, 0x51, 0x63, 0x34, 0xd3, 0xe9, 0xb5, 0x55, 0xdf, 0xe9, 0x1d, + 0x3f, 0xa6, 0x77, 0xfc, 0x17, 0xa4, 0xc8, 0x98, 0xb9, 0x3d, 0xf4, 0xef, 0x72, 0xeb, 0xff, 0x28, + 0xc0, 0x85, 0xe1, 0x36, 0x81, 0x3f, 0x1d, 0xb7, 0x8c, 0x71, 0x4b, 0xa8, 0x09, 0x46, 0x53, 0x6a, + 0x82, 0xff, 0x9f, 0xba, 0xab, 0xf9, 0x71, 0xe4, 0xb8, 0xee, 0xd3, 0x24, 0x67, 0x76, 0xe6, 0x71, + 0x3e, 0x7a, 0x4a, 0xa3, 0xdd, 0xd1, 0xee, 0xec, 0xac, 0xdc, 0xbb, 0x5e, 0x6b, 0x29, 0x4b, 0xf6, + 0x6a, 0x23, 0x4b, 0xab, 0x44, 0x91, 0x7b, 0xc8, 0xe6, 0xb0, 0x35, 0x64, 0x93, 0xee, 0x6e, 0xce, + 0x78, 0x25, 0xdb, 0x0d, 0x8a, 0xec, 0x99, 0x65, 0xcc, 0x21, 0x69, 0xb2, 0x67, 0xe5, 0xd5, 0x25, + 0x09, 0x02, 0x38, 0x40, 0x12, 0xe7, 0xc3, 0xc8, 0x41, 0x48, 0x02, 0x04, 0x01, 0x74, 0xc8, 0x21, + 0xc7, 0xe4, 0x94, 0x7f, 0xc0, 0x80, 0x61, 0xc0, 0x87, 0x9c, 0x12, 0x40, 0x48, 0x04, 0xc4, 0x87, + 0x5c, 0x83, 0xe4, 0xe0, 0x53, 0x50, 0xaf, 0xaa, 0xba, 0xab, 0x3f, 0xc8, 0x9d, 0xd9, 0x95, 0x93, + 0xf8, 0x34, 0xc3, 0xaa, 0xf7, 0xaa, 0xab, 0xab, 0xeb, 0xe3, 0xbd, 0x7a, 0xef, 0xfd, 0x5e, 0xc6, + 0xda, 0x5b, 0xca, 0x5a, 0x7b, 0xa9, 0x4b, 0x89, 0x4b, 0x19, 0x97, 0x12, 0x99, 0x0b, 0x74, 0xf9, + 0x09, 0x0b, 0x74, 0x45, 0x9e, 0x27, 0x3f, 0xcf, 0xc1, 0x73, 0x19, 0x46, 0x27, 0xf2, 0x3e, 0x3c, + 0x27, 0x44, 0x7b, 0x76, 0x72, 0x30, 0x91, 0x9b, 0x9d, 0xbe, 0x77, 0xb2, 0x84, 0x7a, 0x24, 0xcb, + 0x10, 0xbc, 0x37, 0xb9, 0x38, 0x1f, 0xd5, 0xff, 0xff, 0x11, 0xe4, 0xc9, 0x03, 0xb8, 0x8c, 0xc0, + 0xb2, 0x5d, 0x4f, 0x56, 0xa7, 0x27, 0xfe, 0x31, 0x9f, 0x0f, 0x5f, 0x48, 0x89, 0xbd, 0xfd, 0xae, + 0xd4, 0x1d, 0xdb, 0x3f, 0xae, 0x2d, 0xd8, 0x5b, 0xd3, 0x8c, 0xf2, 0xa4, 0x8e, 0xf0, 0x77, 0x0a, + 0x68, 0x4f, 0x1e, 0x2f, 0xd4, 0xe5, 0x92, 0x03, 0x4e, 0x75, 0x39, 0x69, 0xf4, 0x6e, 0xc2, 0xda, + 0xc4, 0x3f, 0x9e, 0xf8, 0xd3, 0x87, 0xd2, 0xf0, 0xad, 0xd8, 0xab, 0xbc, 0x50, 0x0c, 0x8c, 0x80, + 0x93, 0xba, 0x90, 0x90, 0x2d, 0x98, 0xb4, 0x6a, 0xa8, 0xfa, 0x65, 0x7e, 0x07, 0x3a, 0x9b, 0xe4, + 0x0e, 0xb2, 0x1f, 0xef, 0x16, 0x96, 0x73, 0x6a, 0xde, 0xe6, 0xa0, 0x57, 0xc7, 0xfd, 0x81, 0xaf, + 0xfd, 0xbd, 0x22, 0x24, 0x82, 0xac, 0xc1, 0x23, 0xef, 0x4b, 0x6e, 0x52, 0xf9, 0x94, 0x18, 0x92, + 0xc5, 0x22, 0x7b, 0x94, 0x70, 0x1c, 0x26, 0x2c, 0x88, 0xe1, 0x30, 0x61, 0xc9, 0xb3, 0xf8, 0x7a, + 0xdc, 0x17, 0x56, 0x56, 0xba, 0xdb, 0x1d, 0xde, 0x25, 0x77, 0xe0, 0x12, 0x33, 0xac, 0x8a, 0x8e, + 0x6e, 0xc4, 0x3a, 0x7a, 0x78, 0xd7, 0x16, 0xf5, 0xda, 0xc7, 0x4a, 0x68, 0x1a, 0x4a, 0x76, 0xff, + 0xf0, 0x2e, 0x79, 0xe3, 0x7c, 0x0e, 0x4f, 0xcb, 0xc2, 0xe1, 0x29, 0x74, 0x76, 0x7a, 0x33, 0xe6, + 0xec, 0x74, 0x6b, 0xfe, 0x38, 0xf1, 0x4b, 0xe8, 0x64, 0xbe, 0xef, 0xff, 0x56, 0xe0, 0xfa, 0x5c, + 0x0e, 0xb2, 0x03, 0xcb, 0x7a, 0xcb, 0x74, 0xa3, 0x2f, 0x4b, 0x57, 0x8b, 0x28, 0x21, 0xfb, 0xb0, + 0xb2, 0xd7, 0x99, 0xf6, 0xbb, 0x74, 0x02, 0x67, 0xde, 0x9d, 0xa5, 0x9a, 0x0d, 0xc9, 0x6b, 0x0b, + 0x76, 0xc4, 0x4b, 0x3c, 0xd8, 0xc4, 0x55, 0x90, 0xca, 0xa7, 0x9b, 0xbc, 0x30, 0x48, 0x35, 0x98, + 0x62, 0xa3, 0x3b, 0x4c, 0xaa, 0x30, 0xb9, 0xf8, 0x1e, 0x09, 0x29, 0x64, 0x76, 0x07, 0x2f, 0x00, + 0x9d, 0xf6, 0x12, 0x2c, 0xb7, 0x84, 0x79, 0x48, 0xf2, 0x10, 0x14, 0xa6, 0x20, 0x3b, 0xac, 0xd5, + 0xfe, 0x48, 0x11, 0x5a, 0xfd, 0x93, 0x5f, 0x44, 0x4a, 0xb4, 0xd0, 0x9b, 0x9f, 0x68, 0xa1, 0xf7, + 0x94, 0x89, 0x16, 0xb4, 0xbf, 0xe5, 0xc0, 0xa6, 0x66, 0xaf, 0x95, 0xc8, 0xfd, 0xf5, 0xac, 0x9e, + 0x9e, 0x46, 0x6c, 0x76, 0xde, 0x94, 0x92, 0xbf, 0xa4, 0x9f, 0x35, 0xdb, 0xe1, 0x53, 0x9a, 0xaa, + 0x3f, 0xcf, 0xc1, 0xce, 0x3c, 0xf6, 0xcc, 0x34, 0x65, 0xca, 0xc5, 0xd2, 0x94, 0xdd, 0x81, 0x65, + 0x56, 0x16, 0xcf, 0xfd, 0xcc, 0x59, 0xe9, 0x80, 0x8b, 0x6a, 0x72, 0x13, 0x96, 0xf4, 0xb2, 0x13, + 0x65, 0xa7, 0x40, 0x7f, 0xa3, 0x4e, 0x77, 0x8a, 0x9e, 0x2c, 0xbc, 0x8a, 0x7c, 0x27, 0x9d, 0x90, + 0x85, 0xa7, 0xa5, 0xb8, 0x26, 0x0d, 0x48, 0x0a, 0x73, 0x18, 0xfb, 0x1b, 0x61, 0xe4, 0x72, 0xd8, + 0x49, 0x3b, 0x9d, 0xdc, 0x45, 0x83, 0xa5, 0xd6, 0xc4, 0x9f, 0xfa, 0x81, 0xec, 0x0b, 0x34, 0xc6, + 0x12, 0x9b, 0xd7, 0x70, 0x4f, 0x9d, 0xce, 0x63, 0x16, 0x98, 0xb9, 0x24, 0x07, 0xcb, 0xa3, 0x6b, + 0x0f, 0x2d, 0xb6, 0x25, 0x12, 0xed, 0xf7, 0x15, 0xd8, 0xca, 0xea, 0x16, 0xd9, 0x81, 0xc2, 0x30, + 0x33, 0x95, 0xcc, 0x90, 0x85, 0x87, 0x15, 0x31, 0xef, 0xee, 0xf1, 0x68, 0x72, 0xda, 0x09, 0x64, + 0x07, 0x28, 0xa9, 0xd8, 0x06, 0xfa, 0xa3, 0x8a, 0xff, 0x93, 0x1b, 0x62, 0xb3, 0xcd, 0xa7, 0x92, + 0xcf, 0xe0, 0x1f, 0x4d, 0x07, 0x30, 0x7b, 0xad, 0xe6, 0x98, 0x41, 0xd8, 0xde, 0x83, 0x02, 0xed, + 0x56, 0x62, 0x32, 0xd2, 0xe9, 0xa0, 0x37, 0xea, 0x9c, 0x88, 0xf5, 0x6a, 0xda, 0x39, 0x1d, 0xd8, + 0x48, 0xac, 0x1d, 0xc1, 0x7a, 0x9c, 0x82, 0x18, 0x71, 0xd0, 0xb3, 0xe2, 0x6b, 0x2a, 0x6f, 0x69, + 0x6f, 0x34, 0x62, 0x4e, 0xb8, 0x7b, 0x2f, 0xfc, 0xf3, 0xa7, 0x37, 0x80, 0xfe, 0x64, 0x3c, 0x59, + 0xa0, 0x68, 0xda, 0x9f, 0xe4, 0x60, 0x2b, 0x8a, 0xfb, 0x13, 0x4b, 0xe2, 0x57, 0x36, 0x08, 0x45, + 0x8f, 0x05, 0x49, 0x08, 0x89, 0x29, 0xfd, 0x82, 0x73, 0x7c, 0xb3, 0xf7, 0x61, 0x7b, 0x16, 0x3d, + 0x79, 0x39, 0x95, 0x17, 0x9f, 0x83, 0x62, 0x84, 0x09, 0xf4, 0xa5, 0x34, 0xf9, 0x3f, 0x55, 0xe0, + 0x2a, 0x77, 0x1d, 0x6d, 0x74, 0xfa, 0x43, 0xb4, 0x3a, 0x74, 0xfd, 0xcf, 0x27, 0x88, 0x6a, 0x3f, + 0xb6, 0x2d, 0x7d, 0x31, 0xee, 0x21, 0x9c, 0x7a, 0xda, 0xec, 0xb7, 0x25, 0x77, 0x10, 0xfe, 0x84, + 0x9b, 0x58, 0x0a, 0x2c, 0x68, 0x75, 0x48, 0x0b, 0xe4, 0xa0, 0x55, 0xa4, 0xd0, 0x7e, 0x1b, 0x76, + 0xe7, 0x3f, 0x80, 0x7c, 0x1b, 0xd6, 0x30, 0x65, 0x40, 0x7b, 0x7c, 0x32, 0xe9, 0xf4, 0x7c, 0x71, + 0xa7, 0x25, 0xae, 0x14, 0xe5, 0x3a, 0x06, 0xf9, 0xc2, 0x83, 0x28, 0x4f, 0x30, 0x19, 0x01, 0x67, + 0x8a, 0xf9, 0x67, 0xcb, 0xad, 0x69, 0xbf, 0xa3, 0x00, 0x49, 0xb7, 0x41, 0xbe, 0x06, 0xab, 0x6d, + 0xb7, 0xec, 0x04, 0x9d, 0x49, 0x50, 0x1b, 0x9d, 0x4d, 0x38, 0x94, 0x0a, 0x8b, 0xa9, 0x0b, 0xba, + 0x74, 0x67, 0x98, 0x04, 0xde, 0xc3, 0xd1, 0xd9, 0xc4, 0x8e, 0xd1, 0x61, 0x5e, 0x02, 0xdf, 0xff, + 0x6e, 0xaf, 0xf3, 0x38, 0x9e, 0x97, 0x80, 0x97, 0xc5, 0xf2, 0x12, 0xf0, 0x32, 0xed, 0x13, 0x05, + 0xae, 0x09, 0x9f, 0x90, 0x5e, 0x46, 0x5f, 0xca, 0x18, 0x39, 0x3e, 0x11, 0x50, 0x72, 0xf3, 0x64, + 0xd3, 0x4d, 0x01, 0xae, 0x80, 0x1d, 0x44, 0x21, 0x95, 0xf1, 0x92, 0xaf, 0x43, 0xc1, 0x09, 0x46, + 0xe3, 0x73, 0xa0, 0x2b, 0xa8, 0xe1, 0x17, 0x0d, 0x46, 0x63, 0x6c, 0x02, 0x39, 0x35, 0x1f, 0xb6, + 0xe4, 0xce, 0x89, 0x1e, 0x93, 0x06, 0x5c, 0xe2, 0x58, 0x3b, 0x09, 0xa3, 0xd4, 0x9c, 0x77, 0xda, + 0xdb, 0x10, 0x10, 0x0e, 0x1c, 0xca, 0xcc, 0x16, 0x6d, 0x68, 0x7f, 0xac, 0x40, 0x91, 0x0a, 0x0f, + 0xa8, 0x8e, 0x3d, 0xeb, 0x94, 0x8e, 0xcb, 0x81, 0xc2, 0xc6, 0x1a, 0x36, 0x7f, 0xae, 0xc3, 0xf5, + 0x75, 0xd8, 0x48, 0x30, 0x10, 0x0d, 0x83, 0x77, 0x07, 0xfd, 0x6e, 0x87, 0xc1, 0x9c, 0x33, 0xfb, + 0x64, 0xac, 0x4c, 0xfb, 0x03, 0x05, 0xb6, 0xa8, 0xf2, 0x6e, 0xe2, 0xbd, 0xad, 0x7d, 0x36, 0x10, + 0xeb, 0x9d, 0x0a, 0x44, 0xc2, 0xb9, 0x88, 0x05, 0x16, 0x32, 0x81, 0x88, 0x97, 0xd9, 0x61, 0x2d, + 0xa9, 0xc1, 0x32, 0x3f, 0x5f, 0xa6, 0x1c, 0x81, 0x6c, 0x57, 0xba, 0x15, 0x88, 0x1a, 0xe6, 0x44, + 0xf4, 0x4d, 0x70, 0x0b, 0xe3, 0x3c, 0x76, 0xc8, 0xad, 0xfd, 0xa7, 0x02, 0x57, 0x66, 0xf0, 0x90, + 0xb7, 0x61, 0x11, 0x83, 0x1e, 0xf8, 0xd7, 0xdb, 0x99, 0xf1, 0x88, 0xa0, 0xfb, 0xf0, 0xf0, 0x2e, + 0x3b, 0x88, 0x4e, 0xe9, 0x0f, 0x9b, 0x71, 0x91, 0xf7, 0x61, 0x45, 0xef, 0xf5, 0xb8, 0x5e, 0x92, + 0x8b, 0xe9, 0x25, 0x33, 0x9e, 0xf8, 0x6a, 0x48, 0xcf, 0xf4, 0x12, 0xe6, 0x7e, 0xdb, 0xeb, 0x79, + 0x3c, 0xa0, 0x23, 0x6a, 0xef, 0xea, 0x6f, 0xc0, 0x7a, 0x9c, 0xf8, 0x42, 0x7a, 0xc9, 0xc7, 0x0a, + 0xa8, 0xf1, 0x3e, 0xfc, 0x72, 0xc0, 0x27, 0xb2, 0x3e, 0xf3, 0x13, 0x26, 0xd5, 0x9f, 0xe5, 0xe0, + 0xf9, 0xcc, 0x11, 0x26, 0xaf, 0xc0, 0x92, 0x3e, 0x1e, 0x9b, 0x15, 0x3e, 0xab, 0xb8, 0xc0, 0x83, + 0xd7, 0xbd, 0x31, 0xb5, 0x8d, 0x11, 0x91, 0x7b, 0xb0, 0x8c, 0x33, 0x93, 0x32, 0xe4, 0x22, 0x2c, + 0x30, 0x76, 0x1b, 0x92, 0xc0, 0x02, 0x13, 0x84, 0xa4, 0x0a, 0xeb, 0x3c, 0x0e, 0xdd, 0xf6, 0x4f, + 0xfc, 0xef, 0x87, 0xa0, 0xb4, 0x88, 0x9b, 0x2b, 0xee, 0x90, 0xbd, 0x09, 0xab, 0x93, 0x23, 0xb1, + 0xe3, 0x5c, 0xa4, 0x0e, 0x2a, 0xb6, 0x29, 0xb7, 0xc4, 0x00, 0xc9, 0x10, 0x19, 0x80, 0x75, 0x62, + 0x46, 0x5b, 0x29, 0xce, 0xf0, 0x73, 0xe9, 0xd3, 0x69, 0xff, 0x64, 0x78, 0xea, 0x0f, 0x83, 0x5f, + 0xde, 0xe7, 0x8a, 0x9e, 0x71, 0xae, 0xcf, 0xf5, 0xe7, 0x05, 0xb6, 0x98, 0x93, 0x6c, 0x54, 0xa2, + 0x91, 0x30, 0x28, 0x51, 0xa2, 0xc1, 0xbc, 0xa2, 0x2c, 0xd2, 0xba, 0x02, 0x97, 0x58, 0x04, 0xbc, + 0x58, 0x19, 0xd7, 0x33, 0xbb, 0xc0, 0x68, 0x0e, 0xef, 0x32, 0xf1, 0x85, 0x45, 0x5f, 0x4c, 0x6d, + 0xc1, 0x4a, 0x0e, 0xa1, 0x58, 0x1e, 0xf8, 0x9d, 0xe1, 0xd9, 0xd8, 0x3d, 0x9f, 0x19, 0x70, 0x9b, + 0xbf, 0xcb, 0x6a, 0x97, 0xb1, 0xa1, 0xf9, 0x10, 0x77, 0x72, 0xb9, 0x21, 0xe2, 0x86, 0x0e, 0xd9, + 0x05, 0xbc, 0x72, 0xfc, 0xea, 0x9c, 0xf1, 0x49, 0x16, 0x22, 0x5f, 0x3c, 0xda, 0x80, 0x7b, 0x6c, + 0x7b, 0xb0, 0x5e, 0xef, 0x4c, 0x03, 0x77, 0xd2, 0x19, 0x4e, 0x11, 0x39, 0xeb, 0x1c, 0xc8, 0x22, + 0x22, 0x03, 0x31, 0xbb, 0x8a, 0x0c, 0x42, 0x56, 0x76, 0x15, 0x19, 0x6f, 0x8e, 0xca, 0x4b, 0xd5, + 0xfe, 0xb0, 0x33, 0xe8, 0x7f, 0x24, 0xe2, 0x56, 0x98, 0xbc, 0x74, 0x2c, 0x0a, 0xed, 0xa8, 0x5e, + 0xfb, 0x56, 0xea, 0xbb, 0xb1, 0x5e, 0x16, 0xe1, 0x12, 0x8f, 0x6a, 0x64, 0x51, 0x7e, 0x2d, 0xc3, + 0xaa, 0x98, 0xd6, 0xbe, 0xaa, 0x90, 0x75, 0x80, 0x96, 0xdd, 0x2c, 0x1b, 0x8e, 0x43, 0x7f, 0xe7, + 0xe8, 0x6f, 0x1e, 0x02, 0x58, 0x6d, 0xd7, 0xd5, 0xbc, 0x14, 0x05, 0x58, 0xd0, 0x7e, 0xa2, 0xc0, + 0xe5, 0xec, 0x4f, 0x49, 0x5c, 0xc0, 0x38, 0x50, 0x6e, 0x10, 0xfe, 0xda, 0xdc, 0xef, 0x9e, 0x59, + 0x9c, 0x8c, 0x27, 0x0d, 0x58, 0x9c, 0x62, 0x4e, 0x58, 0x7d, 0xa2, 0xdc, 0xb9, 0xfd, 0x9e, 0x56, + 0x86, 0xed, 0x59, 0x6d, 0xc4, 0x5f, 0x75, 0x03, 0x8a, 0x7a, 0xab, 0x55, 0x37, 0xcb, 0xba, 0x6b, + 0x36, 0x2d, 0x55, 0x21, 0x2b, 0xb0, 0xb8, 0x6f, 0x37, 0xdb, 0x2d, 0x35, 0xa7, 0xfd, 0x48, 0x81, + 0x35, 0x73, 0x18, 0xf8, 0x27, 0xcc, 0x8f, 0xf7, 0x59, 0x17, 0xdf, 0x5b, 0xb1, 0xc5, 0xb7, 0x1d, + 0x46, 0x4c, 0x87, 0x0f, 0x38, 0xd7, 0xca, 0xfb, 0x27, 0x05, 0x36, 0x53, 0x3c, 0xc4, 0x81, 0x4b, + 0xfa, 0x91, 0xd3, 0x34, 0x2b, 0x65, 0xde, 0x33, 0x21, 0x95, 0xf3, 0xd2, 0xf4, 0x53, 0x58, 0x94, + 0xd1, 0x87, 0x53, 0x6f, 0xd4, 0xef, 0x49, 0x19, 0xbb, 0x6a, 0x0b, 0xb6, 0x68, 0x09, 0x4f, 0xb2, + 0x8f, 0xce, 0x26, 0x3e, 0x36, 0x9b, 0x8b, 0xdd, 0x68, 0x86, 0xe5, 0xe9, 0x86, 0xd1, 0x6d, 0xb5, + 0x43, 0xeb, 0xd3, 0x4d, 0x47, 0xed, 0xed, 0xad, 0x41, 0x91, 0x6b, 0x2d, 0xa8, 0x10, 0xfc, 0x50, + 0x81, 0xed, 0x59, 0x7d, 0xa5, 0x8a, 0x50, 0x3c, 0xe4, 0xf0, 0x72, 0x88, 0xb9, 0x1c, 0x8f, 0x35, + 0x14, 0x64, 0xe4, 0x1d, 0x28, 0xb2, 0x84, 0xe4, 0xce, 0xbd, 0xb6, 0x6d, 0xf2, 0x09, 0x72, 0xfd, + 0x3f, 0x3e, 0xbd, 0x71, 0x85, 0xa5, 0x2f, 0xf7, 0xa6, 0xf7, 0xbc, 0xb3, 0x49, 0x3f, 0x86, 0x4f, + 0x2b, 0x73, 0x68, 0x3f, 0x50, 0xe0, 0xea, 0xec, 0x97, 0xa4, 0xa7, 0x8c, 0xcb, 0x1c, 0x9c, 0x44, + 0x90, 0x13, 0x9e, 0x32, 0xa1, 0x17, 0x94, 0x7c, 0xca, 0x08, 0x42, 0xca, 0x14, 0xe6, 0xc2, 0xcc, + 0xa5, 0x52, 0xe0, 0xc5, 0x99, 0x04, 0xa1, 0xf6, 0x97, 0x39, 0xb8, 0x4c, 0x27, 0xd0, 0xc0, 0x9f, + 0x4e, 0xf5, 0xb3, 0xe0, 0xa1, 0x3f, 0x0c, 0xb8, 0x48, 0x45, 0xde, 0x80, 0xa5, 0x87, 0x17, 0xbb, + 0x0d, 0x64, 0xe4, 0x84, 0x00, 0x6e, 0xca, 0xc2, 0xed, 0x95, 0xfe, 0x4f, 0xae, 0x83, 0x94, 0x72, + 0x10, 0xf7, 0xd4, 0x55, 0x7b, 0x65, 0x1c, 0x26, 0x1e, 0x7c, 0x13, 0x16, 0x51, 0xfb, 0xe7, 0x5b, + 0xa3, 0x10, 0x69, 0xb3, 0x7b, 0x86, 0x77, 0x03, 0x36, 0x63, 0x20, 0x5f, 0x01, 0x88, 0xb0, 0x7d, + 0xf9, 0xde, 0x27, 0xd4, 0xe8, 0x10, 0xde, 0xd7, 0x5e, 0x39, 0x3d, 0xee, 0x70, 0xc0, 0xdc, 0x12, + 0x6c, 0x8a, 0x21, 0x19, 0x0b, 0x20, 0x21, 0x6e, 0x9e, 0xda, 0x60, 0x15, 0xe6, 0x98, 0x83, 0x09, + 0x69, 0xff, 0x9e, 0x83, 0x95, 0x23, 0x2a, 0x28, 0xa0, 0xfa, 0x3b, 0x5f, 0x9d, 0x7e, 0x0d, 0x8a, + 0xf5, 0x51, 0x87, 0xdf, 0xdd, 0x4f, 0x39, 0x96, 0x19, 0x86, 0x2e, 0x0d, 0x46, 0x1d, 0x61, 0x06, + 0x98, 0xda, 0x32, 0xd1, 0x13, 0xc2, 0xae, 0xde, 0x85, 0x25, 0x66, 0x4b, 0xe1, 0x17, 0x35, 0x42, + 0x54, 0x0c, 0x7b, 0xf4, 0x2a, 0xab, 0x96, 0xae, 0x9b, 0x99, 0x3d, 0x46, 0x96, 0x5b, 0x38, 0x94, + 0x99, 0xa4, 0xec, 0x2f, 0x9e, 0x4f, 0xd9, 0x97, 0x20, 0x5b, 0x96, 0xce, 0x03, 0xd9, 0x72, 0xf5, + 0x3e, 0x14, 0xa5, 0xfe, 0x5c, 0x48, 0x72, 0xfc, 0xdd, 0x1c, 0xac, 0xe1, 0x5b, 0x85, 0x8e, 0x15, + 0xbf, 0x9a, 0x57, 0x17, 0x6f, 0xc5, 0xae, 0x2e, 0xb6, 0xe5, 0xef, 0xc5, 0xde, 0x6c, 0xce, 0x9d, + 0xc5, 0xbb, 0xb0, 0x99, 0x22, 0x24, 0xaf, 0xc3, 0x22, 0xed, 0xbe, 0x50, 0xf5, 0xd4, 0xe4, 0x0c, + 0x88, 0xe0, 0xfd, 0xe8, 0x8b, 0x4f, 0x6d, 0x46, 0xad, 0xfd, 0x97, 0x02, 0xab, 0x1c, 0xec, 0x79, + 0x78, 0x3c, 0x7a, 0xe2, 0x70, 0xde, 0x4e, 0x0e, 0x27, 0x0b, 0x22, 0xe6, 0xc3, 0xf9, 0xbf, 0x3d, + 0x88, 0xf7, 0x63, 0x83, 0x78, 0x25, 0x04, 0xfb, 0x11, 0xaf, 0x33, 0x67, 0x0c, 0xff, 0x11, 0xe1, + 0xef, 0xe2, 0x84, 0xe4, 0x3b, 0xb0, 0x62, 0xf9, 0x1f, 0xc6, 0x34, 0xa6, 0xdb, 0x33, 0x1a, 0x7d, + 0x35, 0x24, 0x64, 0x6b, 0x0a, 0x0f, 0x9b, 0xa1, 0xff, 0xa1, 0x97, 0x32, 0xe3, 0x44, 0x4d, 0x52, + 0xa5, 0x29, 0xce, 0x76, 0x91, 0xa9, 0xcf, 0x43, 0x4d, 0x30, 0x2e, 0xfe, 0x6f, 0x0a, 0x00, 0x91, + 0x97, 0x3e, 0x5d, 0x80, 0x31, 0x0b, 0xb6, 0xb8, 0x3b, 0xc6, 0x22, 0x79, 0x8e, 0x0b, 0xc3, 0xf6, + 0x6d, 0x7e, 0x29, 0x9a, 0x9b, 0x0d, 0xc6, 0x84, 0xd7, 0xa3, 0x65, 0xee, 0x05, 0xdf, 0xf3, 0x07, + 0x1d, 0xb6, 0x17, 0xe7, 0xf7, 0x6e, 0x21, 0xf6, 0x5e, 0x58, 0x3a, 0x23, 0x6b, 0x1f, 0xfa, 0xca, + 0x57, 0x28, 0x41, 0x2a, 0xf2, 0xa5, 0xf0, 0xf4, 0x91, 0x2f, 0x8b, 0x4f, 0x11, 0xf9, 0xb2, 0x74, + 0xce, 0xc8, 0x97, 0x16, 0xac, 0xf4, 0x87, 0x8f, 0xfc, 0x61, 0x30, 0x9a, 0x3c, 0x46, 0x2b, 0x75, + 0x74, 0x95, 0x45, 0x87, 0xda, 0x14, 0x75, 0xec, 0x7b, 0xe3, 0x81, 0x19, 0xd2, 0xcb, 0x9f, 0x3b, + 0x2c, 0x24, 0xbf, 0x06, 0x91, 0xd5, 0x83, 0x23, 0xb4, 0xcf, 0x3e, 0x67, 0xbb, 0xc2, 0x28, 0xf2, + 0x75, 0x88, 0x1b, 0x3f, 0x78, 0xdc, 0x29, 0xcb, 0x30, 0x2b, 0x57, 0xc8, 0xf8, 0x63, 0x5d, 0xc9, + 0x3e, 0xc2, 0xdd, 0x5e, 0x7f, 0x91, 0x03, 0x92, 0xee, 0x38, 0x79, 0x0b, 0x8a, 0x6c, 0xeb, 0xf7, + 0x26, 0xd3, 0xef, 0xf1, 0x70, 0x0d, 0x86, 0x7b, 0x20, 0x15, 0xcb, 0xb8, 0x07, 0xac, 0xd8, 0x9e, + 0x7e, 0x6f, 0x40, 0xbe, 0x0d, 0xcf, 0xe1, 0x87, 0x1f, 0xfb, 0x93, 0xfe, 0xa8, 0xe7, 0x21, 0x48, + 0x5d, 0x67, 0xc0, 0x73, 0xff, 0xbc, 0x82, 0x49, 0xea, 0xd2, 0xd5, 0x33, 0x26, 0x08, 0x46, 0x45, + 0xb4, 0x90, 0xb2, 0xc5, 0x08, 0x89, 0x0b, 0xaa, 0xcc, 0x7f, 0x7c, 0x36, 0x18, 0xf0, 0x39, 0x57, + 0xa2, 0xea, 0x6f, 0xb2, 0x6e, 0x46, 0xc3, 0xeb, 0x51, 0xc3, 0xd5, 0xb3, 0xc1, 0x80, 0xbc, 0x01, + 0x30, 0x1a, 0x7a, 0xa7, 0xfd, 0xe9, 0x94, 0x19, 0x32, 0xc2, 0x88, 0xa6, 0xa8, 0x54, 0xfe, 0x7c, + 0xa3, 0x61, 0x83, 0x15, 0xd2, 0xcf, 0x37, 0xee, 0x9c, 0xf8, 0x18, 0x47, 0xcc, 0x9c, 0x56, 0x38, + 0x9a, 0xb7, 0x28, 0x8c, 0x4f, 0xa3, 0x13, 0xdf, 0xe9, 0x7f, 0x24, 0x5c, 0x9d, 0xdf, 0x83, 0x4d, + 0xee, 0x2e, 0x7a, 0xd4, 0x0f, 0x1e, 0x72, 0xb9, 0xfb, 0x59, 0x84, 0x76, 0x49, 0xf0, 0xfe, 0x97, + 0x02, 0x80, 0x7e, 0xe4, 0x08, 0x88, 0x8e, 0x3b, 0xb0, 0x48, 0xb5, 0x09, 0x71, 0x2b, 0x81, 0x77, + 0xba, 0xd8, 0xae, 0x7c, 0xa7, 0x8b, 0x14, 0x74, 0x9f, 0xb0, 0xfd, 0x13, 0xbc, 0x18, 0xcb, 0x45, + 0x57, 0x18, 0x13, 0x56, 0x14, 0x93, 0x5e, 0x59, 0x11, 0xa9, 0x03, 0x44, 0xa0, 0x19, 0x5c, 0xbf, + 0xdd, 0x8c, 0xa2, 0xcf, 0x79, 0x05, 0x87, 0x69, 0x8e, 0x80, 0x37, 0xe4, 0xe9, 0x13, 0x91, 0x91, + 0x03, 0x28, 0xb8, 0x9d, 0x30, 0x5e, 0x67, 0x06, 0x94, 0xc8, 0x8b, 0x3c, 0x37, 0x53, 0x04, 0x27, + 0xb2, 0x1e, 0x74, 0x62, 0x29, 0xec, 0xb0, 0x11, 0x62, 0xc0, 0x12, 0xcf, 0xbb, 0x39, 0x03, 0x82, + 0x8a, 0xa7, 0xdd, 0xe4, 0xc0, 0x93, 0x58, 0x28, 0x4b, 0x3b, 0x3c, 0xc3, 0xe6, 0x6b, 0x90, 0x77, + 0x9c, 0x06, 0x0f, 0xa0, 0x5d, 0x8b, 0x74, 0x15, 0xc7, 0x69, 0x88, 0x34, 0xc5, 0xa7, 0x12, 0x1b, + 0x25, 0x26, 0xbf, 0x0e, 0x45, 0x49, 0x10, 0xe7, 0xa1, 0xe7, 0x38, 0x06, 0xfd, 0xa8, 0x58, 0xde, + 0xce, 0x24, 0x6a, 0x52, 0x07, 0xf5, 0xe0, 0xec, 0x03, 0x5f, 0x1f, 0x8f, 0x31, 0xa0, 0xe4, 0x91, + 0x3f, 0x61, 0x10, 0xd2, 0xcb, 0x11, 0x66, 0x23, 0x06, 0x28, 0xf4, 0x44, 0xad, 0x7c, 0x33, 0x93, + 0xe4, 0x24, 0x2d, 0xd8, 0x74, 0xfc, 0xe0, 0x6c, 0xcc, 0xdc, 0x30, 0xaa, 0xa3, 0x09, 0x55, 0x4d, + 0xd8, 0x86, 0x81, 0xf0, 0x76, 0x53, 0x5a, 0x29, 0x7c, 0x5f, 0x8e, 0x47, 0x93, 0x84, 0x9a, 0x92, + 0x66, 0xd6, 0x7c, 0xf9, 0x93, 0xd3, 0xf3, 0x3e, 0xae, 0xf0, 0xe0, 0x79, 0x2f, 0x14, 0x9e, 0x48, + 0xcd, 0xf9, 0x4a, 0x06, 0x98, 0x0a, 0x9a, 0xd1, 0x24, 0x30, 0x95, 0x18, 0x84, 0xca, 0x27, 0x05, + 0x09, 0xcf, 0x8b, 0x7f, 0x8b, 0xb7, 0x01, 0xde, 0x1d, 0xf5, 0x87, 0x0d, 0x3f, 0x78, 0x38, 0xea, + 0x49, 0x98, 0x2e, 0xc5, 0xdf, 0x1a, 0xf5, 0x87, 0xde, 0x29, 0x16, 0xff, 0xe2, 0xd3, 0x1b, 0x12, + 0x91, 0x2d, 0xfd, 0x4f, 0xbe, 0x0c, 0x2b, 0xf4, 0x97, 0x1b, 0x39, 0x93, 0xb0, 0x0b, 0x4c, 0xe4, + 0xe6, 0xe9, 0xce, 0x43, 0x02, 0x72, 0x1f, 0x71, 0xde, 0xfb, 0xe3, 0x40, 0x12, 0xab, 0x05, 0xa8, + 0x7b, 0x7f, 0x1c, 0x24, 0x21, 0x1a, 0x25, 0x62, 0x52, 0x0b, 0xbb, 0x2e, 0x32, 0x05, 0x70, 0x38, + 0x79, 0xbc, 0xa5, 0xe3, 0x73, 0xcd, 0x13, 0xd8, 0x70, 0x72, 0x4e, 0xb7, 0x04, 0x1b, 0x76, 0xc2, + 0xa9, 0x55, 0x98, 0x59, 0x85, 0x9f, 0x6e, 0xac, 0x13, 0xd3, 0x87, 0x3d, 0xaf, 0x8b, 0xc5, 0xb1, + 0x4e, 0x84, 0xc4, 0x64, 0x0f, 0x36, 0x18, 0xf2, 0x40, 0x98, 0x71, 0x88, 0x9f, 0x74, 0xb8, 0xb7, + 0x45, 0x29, 0x89, 0xe4, 0xc7, 0x27, 0x18, 0x48, 0x15, 0x16, 0x51, 0xb5, 0xe4, 0xce, 0xe0, 0xd7, + 0x64, 0x9d, 0x3a, 0xb9, 0x8e, 0x70, 0x5f, 0x41, 0x6d, 0x5a, 0xde, 0x57, 0x90, 0x94, 0x7c, 0x13, + 0xc0, 0x18, 0x4e, 0x46, 0x83, 0x01, 0xa2, 0x17, 0x2e, 0xa3, 0x62, 0x76, 0x3d, 0xbe, 0x1e, 0xb1, + 0x95, 0x88, 0x88, 0x23, 0xed, 0xe0, 0x6f, 0x2f, 0x81, 0x71, 0x28, 0xb5, 0xa5, 0x99, 0xb0, 0xc4, + 0x16, 0x23, 0x22, 0x81, 0x72, 0x6c, 0x73, 0x09, 0x47, 0x92, 0x21, 0x81, 0xf2, 0xf2, 0x34, 0x12, + 0xa8, 0xc4, 0xa0, 0x1d, 0xc0, 0x56, 0xd6, 0x8b, 0xc5, 0x94, 0x61, 0xe5, 0xbc, 0xca, 0xf0, 0x5f, + 0xe7, 0x61, 0x15, 0x5b, 0x13, 0xbb, 0xb0, 0x0e, 0x6b, 0xce, 0xd9, 0x07, 0x21, 0x4c, 0x86, 0xd8, + 0x8d, 0xb1, 0x7f, 0x53, 0xb9, 0x42, 0x36, 0x78, 0xc5, 0x38, 0x88, 0x01, 0xeb, 0xe2, 0x24, 0xd8, + 0x17, 0x0e, 0xe6, 0x21, 0x08, 0xa7, 0x80, 0x7a, 0x4a, 0x67, 0x5c, 0x4b, 0x30, 0x45, 0xe7, 0x41, + 0xfe, 0x22, 0xe7, 0x41, 0xe1, 0x5c, 0xe7, 0xc1, 0xfb, 0xb0, 0x2a, 0x9e, 0x86, 0x3b, 0xf9, 0xe2, + 0xb3, 0xed, 0xe4, 0xb1, 0xc6, 0x48, 0x3d, 0xdc, 0xd1, 0x97, 0xe6, 0xee, 0xe8, 0x68, 0x45, 0x14, + 0xab, 0x2c, 0x95, 0x44, 0x99, 0xb7, 0x81, 0x29, 0x89, 0xf6, 0xcb, 0xad, 0xa7, 0x38, 0x25, 0x5f, + 0x87, 0x95, 0xfa, 0x48, 0x18, 0x90, 0xa4, 0x9b, 0xfb, 0x81, 0x28, 0x94, 0xc5, 0x85, 0x90, 0x32, + 0x3c, 0xdd, 0xf2, 0x9f, 0xc7, 0xe9, 0x76, 0x1f, 0x80, 0x47, 0x2e, 0x44, 0xa9, 0x44, 0x70, 0xc9, + 0x88, 0x28, 0xe6, 0xb8, 0x01, 0x41, 0x22, 0xa6, 0xbb, 0x13, 0x77, 0x35, 0xd1, 0xbb, 0xdd, 0xd1, + 0xd9, 0x30, 0x88, 0xe5, 0xde, 0xe3, 0x80, 0x08, 0xf4, 0x48, 0xc0, 0x3a, 0x79, 0x7b, 0x48, 0xb0, + 0x7d, 0xbe, 0x1f, 0x84, 0x7c, 0x23, 0xf4, 0x91, 0x9b, 0x9b, 0x8a, 0x5c, 0x4b, 0x8d, 0xd0, 0x4c, + 0xcf, 0x38, 0xed, 0x27, 0x8a, 0x8c, 0x80, 0xfc, 0x14, 0x9f, 0xfa, 0x4d, 0x80, 0xd0, 0x82, 0x2f, + 0xbe, 0x35, 0xd3, 0xe4, 0xc2, 0x52, 0x79, 0x94, 0x23, 0x5a, 0xe9, 0x6d, 0xf2, 0x9f, 0xd7, 0xdb, + 0xb8, 0x50, 0x6c, 0x7e, 0x37, 0xe8, 0x44, 0x2e, 0x1f, 0xe0, 0x84, 0x92, 0x2c, 0xee, 0x4c, 0x22, + 0x65, 0x7a, 0x24, 0x07, 0xcf, 0x4c, 0x99, 0x1e, 0x32, 0x6a, 0xff, 0xa0, 0xc0, 0x86, 0x1c, 0xc0, + 0xf8, 0x78, 0xd8, 0x25, 0xbf, 0xc9, 0x00, 0xd9, 0x94, 0x98, 0x92, 0x23, 0x11, 0xd1, 0x2d, 0xf7, + 0xf1, 0xb0, 0xcb, 0x04, 0xa0, 0xce, 0x87, 0x72, 0x67, 0x29, 0x23, 0xf9, 0x00, 0x56, 0x5b, 0xa3, + 0xc1, 0x80, 0x8a, 0x35, 0x93, 0x47, 0x5c, 0x01, 0xa0, 0x0d, 0x25, 0xed, 0x08, 0xa2, 0x43, 0x7b, + 0x37, 0xb9, 0x06, 0x7e, 0x65, 0x4c, 0xf7, 0xfb, 0x3e, 0xe7, 0x8b, 0x9a, 0xfd, 0x18, 0x23, 0xa3, + 0xe4, 0x36, 0xb5, 0x9f, 0x29, 0x40, 0xd2, 0x5d, 0x92, 0xb7, 0x2c, 0xe5, 0xff, 0x40, 0x84, 0x4d, + 0x88, 0x7e, 0x85, 0x8b, 0x88, 0x7e, 0xa5, 0x3f, 0x55, 0x60, 0xc3, 0xd4, 0x1b, 0x1c, 0x13, 0x99, + 0x99, 0x3b, 0xbe, 0x00, 0xd7, 0x4d, 0xbd, 0xe1, 0xb5, 0x9a, 0x75, 0xb3, 0xfc, 0xc0, 0xcb, 0x84, + 0x3a, 0xbc, 0x0e, 0x2f, 0xa4, 0x49, 0x22, 0xb3, 0xc8, 0x0e, 0x6c, 0xa7, 0xab, 0x05, 0x1c, 0x62, + 0x36, 0xb3, 0x40, 0x4e, 0xcc, 0x97, 0xde, 0x81, 0x0d, 0x01, 0xfd, 0xe7, 0xd6, 0x1d, 0x04, 0x17, + 0xde, 0x80, 0xe2, 0xa1, 0x61, 0x9b, 0xd5, 0x07, 0x5e, 0xb5, 0x5d, 0xaf, 0xab, 0x0b, 0x64, 0x0d, + 0x56, 0x78, 0x41, 0x59, 0x57, 0x15, 0xb2, 0x0a, 0xcb, 0xa6, 0xe5, 0x18, 0xe5, 0xb6, 0x6d, 0xa8, + 0xb9, 0xd2, 0x3b, 0xb0, 0xde, 0x9a, 0xf4, 0x1f, 0x75, 0x02, 0xff, 0xc0, 0x7f, 0x8c, 0x56, 0x8d, + 0x4b, 0x90, 0xb7, 0xf5, 0x23, 0x75, 0x81, 0x00, 0x2c, 0xb5, 0x0e, 0xca, 0xce, 0xdd, 0xbb, 0xaa, + 0x42, 0x8a, 0x70, 0x69, 0xbf, 0xdc, 0xf2, 0x0e, 0x1a, 0x8e, 0x9a, 0xa3, 0x3f, 0xf4, 0x23, 0x07, + 0x7f, 0xe4, 0x4b, 0x5f, 0x85, 0x4d, 0x14, 0x48, 0xea, 0xfd, 0x69, 0xe0, 0x0f, 0xfd, 0x09, 0xf6, + 0x61, 0x15, 0x96, 0x1d, 0x9f, 0xee, 0x24, 0x81, 0xcf, 0x3a, 0xd0, 0x38, 0x1b, 0x04, 0xfd, 0xf1, + 0xc0, 0xff, 0xbe, 0xaa, 0x94, 0xee, 0xc3, 0x86, 0x3d, 0x3a, 0x0b, 0xfa, 0xc3, 0x13, 0x27, 0xa0, + 0x14, 0x27, 0x8f, 0xc9, 0xf3, 0xb0, 0xd9, 0xb6, 0xf4, 0xc6, 0x9e, 0xb9, 0xdf, 0x6e, 0xb6, 0x1d, + 0xaf, 0xa1, 0xbb, 0xe5, 0x1a, 0xb3, 0xa9, 0x34, 0x9a, 0x8e, 0xeb, 0xd9, 0x46, 0xd9, 0xb0, 0x5c, + 0x55, 0x29, 0xfd, 0xa1, 0x02, 0xeb, 0xed, 0x29, 0xf7, 0x03, 0x6e, 0x63, 0x34, 0xdf, 0x8b, 0xb0, + 0xd3, 0x76, 0x0c, 0xdb, 0x73, 0x9b, 0x07, 0x86, 0xe5, 0xb5, 0x1d, 0x7d, 0x3f, 0x89, 0xb3, 0x79, + 0x03, 0xae, 0x49, 0x14, 0xb6, 0x51, 0x6e, 0x1e, 0x1a, 0xb6, 0xd7, 0xd2, 0x1d, 0xe7, 0xa8, 0x69, + 0x57, 0x54, 0x85, 0x5c, 0x85, 0xcb, 0x19, 0x04, 0x8d, 0xaa, 0xae, 0xe6, 0x52, 0x75, 0x96, 0x71, + 0xa4, 0xd7, 0xbd, 0xbd, 0xa6, 0xab, 0xe6, 0x4b, 0x0d, 0x7a, 0x9a, 0x22, 0xbe, 0x1c, 0x4b, 0x24, + 0xb0, 0x0c, 0x05, 0xab, 0x69, 0x19, 0x49, 0xbb, 0xd7, 0x2a, 0x2c, 0xeb, 0xad, 0x96, 0xdd, 0x3c, + 0xc4, 0x0f, 0x0a, 0xb0, 0x54, 0x31, 0x2c, 0xda, 0xb3, 0x3c, 0xad, 0x69, 0xd9, 0xcd, 0x46, 0xd3, + 0x35, 0x2a, 0x6a, 0xa1, 0x64, 0x8b, 0x05, 0x23, 0x1a, 0xed, 0x8e, 0x98, 0x91, 0xa9, 0x62, 0x54, + 0xf5, 0x76, 0xdd, 0xe5, 0x03, 0xf2, 0xc0, 0xb3, 0x8d, 0x6f, 0xb4, 0x0d, 0xc7, 0x75, 0x54, 0x85, + 0xa8, 0xb0, 0x6a, 0x19, 0x46, 0xc5, 0xf1, 0x6c, 0xe3, 0xd0, 0x34, 0x8e, 0xd4, 0x1c, 0x6d, 0x93, + 0xfd, 0x4f, 0x9f, 0x50, 0xfa, 0x44, 0x01, 0xc2, 0xb0, 0xf9, 0x04, 0xe0, 0x3b, 0x7e, 0x9f, 0x5d, + 0xb8, 0x5a, 0xa3, 0x03, 0x8b, 0xaf, 0xd6, 0x68, 0x56, 0x92, 0x43, 0x76, 0x19, 0x48, 0xa2, 0xbe, + 0x59, 0xad, 0xaa, 0x0a, 0xb9, 0x06, 0xcf, 0x25, 0xca, 0x2b, 0x76, 0xb3, 0xa5, 0xe6, 0xae, 0xe6, + 0x96, 0x15, 0x72, 0x25, 0x55, 0x79, 0x60, 0x18, 0x2d, 0x35, 0x4f, 0x3f, 0x51, 0xa2, 0x42, 0x4c, + 0x40, 0xc6, 0x5e, 0x28, 0xfd, 0x40, 0x81, 0xcb, 0xac, 0x9b, 0x62, 0x36, 0x87, 0x5d, 0xdd, 0x81, + 0x6d, 0x8e, 0x38, 0x9a, 0xd5, 0xd1, 0x2d, 0x50, 0x63, 0xb5, 0xac, 0x9b, 0xcf, 0xc3, 0x66, 0xac, + 0x14, 0xfb, 0x91, 0xa3, 0x6b, 0x35, 0x56, 0xbc, 0x67, 0x38, 0xae, 0x67, 0x54, 0xab, 0x4d, 0xdb, + 0x65, 0x1d, 0xc9, 0x97, 0x34, 0xd8, 0x2c, 0xfb, 0x93, 0x80, 0x2a, 0x3a, 0xc3, 0x69, 0x7f, 0x34, + 0xc4, 0x2e, 0xac, 0xc1, 0x8a, 0xf1, 0x4d, 0xd7, 0xb0, 0x1c, 0xb3, 0x69, 0xa9, 0x0b, 0xa5, 0x9d, + 0x04, 0x8d, 0x58, 0x35, 0x8e, 0x53, 0x53, 0x17, 0x4a, 0x1d, 0x58, 0x13, 0x7e, 0xb7, 0x6c, 0x56, + 0xec, 0xc2, 0x55, 0x31, 0xd7, 0x70, 0xfd, 0x26, 0x5f, 0x61, 0x1b, 0xb6, 0xd2, 0xf5, 0x86, 0xab, + 0x2a, 0xf4, 0x2b, 0x24, 0x6a, 0x68, 0x79, 0xae, 0xf4, 0x7b, 0x0a, 0xac, 0x85, 0x06, 0x0f, 0xbc, + 0xae, 0xbd, 0x01, 0xd7, 0x1a, 0x55, 0xdd, 0xab, 0x18, 0x87, 0x66, 0xd9, 0xf0, 0x0e, 0x4c, 0xab, + 0x92, 0x78, 0xc8, 0x0b, 0xf0, 0x7c, 0x06, 0x01, 0x3e, 0x65, 0x1b, 0xb6, 0x92, 0x55, 0x6e, 0xd3, + 0xa5, 0xe3, 0xb5, 0x03, 0xdb, 0xc9, 0x9a, 0x23, 0x63, 0x4f, 0x6f, 0xbb, 0x35, 0x4b, 0xcd, 0x97, + 0xfe, 0x4a, 0x81, 0x6d, 0x9e, 0xe0, 0x95, 0x9b, 0x5e, 0x18, 0xd4, 0x3a, 0x62, 0x11, 0x96, 0xe0, + 0xb6, 0x6b, 0xb7, 0x1d, 0xd7, 0xa8, 0x08, 0x76, 0x3a, 0x69, 0x4d, 0xdb, 0x68, 0x18, 0x96, 0x9b, + 0xe8, 0xdb, 0xcb, 0xf0, 0xa5, 0x39, 0xb4, 0x56, 0xd3, 0x15, 0xbf, 0xe9, 0x5a, 0xfd, 0x12, 0xdc, + 0x9c, 0x43, 0x1c, 0x12, 0xe6, 0x4a, 0xdf, 0x82, 0xd5, 0x58, 0xfa, 0x98, 0x2b, 0xf0, 0x9c, 0xfc, + 0xbb, 0xe5, 0x0f, 0x7b, 0xfd, 0xe1, 0x89, 0xba, 0x90, 0xac, 0xb0, 0xcf, 0x86, 0x43, 0x5a, 0x81, + 0xdb, 0x82, 0x5c, 0xe1, 0xfa, 0x93, 0xd3, 0xfe, 0xb0, 0x13, 0xf8, 0x3d, 0x35, 0x57, 0x7a, 0x15, + 0xd6, 0x62, 0xa0, 0x95, 0xf4, 0xfb, 0xd7, 0x9b, 0x7c, 0xd7, 0x6c, 0x18, 0x15, 0xb3, 0xdd, 0x50, + 0x17, 0xe9, 0x86, 0x50, 0x33, 0xf7, 0x6b, 0x2a, 0x94, 0x7e, 0xa4, 0x50, 0xe5, 0x00, 0xc7, 0xa7, + 0x51, 0xd5, 0xc5, 0x8c, 0xa1, 0xb3, 0x95, 0x41, 0xe1, 0x1a, 0x8e, 0xc3, 0xac, 0xc6, 0x3b, 0xb0, + 0xcd, 0x7f, 0x78, 0xba, 0x55, 0xf1, 0x6a, 0xba, 0x5d, 0x39, 0xd2, 0x6d, 0x3a, 0x85, 0x1f, 0xa8, + 0x39, 0x5c, 0x97, 0x52, 0x89, 0xe7, 0x36, 0xdb, 0xe5, 0x9a, 0x9a, 0xa7, 0xcb, 0x20, 0x56, 0xde, + 0x32, 0x2d, 0xb5, 0x80, 0xab, 0x3c, 0x45, 0x8d, 0xcd, 0xd2, 0xfa, 0xc5, 0xd2, 0x5f, 0x28, 0xb0, + 0x3d, 0x0b, 0x9d, 0x81, 0xdc, 0x06, 0xcd, 0xb0, 0x5c, 0x5b, 0x37, 0x2b, 0x5e, 0xd9, 0x36, 0x2a, + 0x86, 0xe5, 0x9a, 0x7a, 0xdd, 0xf1, 0x9c, 0x66, 0xdb, 0x2e, 0xd3, 0x29, 0x2a, 0xec, 0xde, 0x37, + 0xe1, 0xc6, 0x1c, 0xba, 0xa6, 0x59, 0x29, 0xab, 0x0a, 0xb9, 0x0b, 0xaf, 0xcc, 0x21, 0x72, 0x1e, + 0x38, 0xae, 0xd1, 0x90, 0x6b, 0xd4, 0x5c, 0xa9, 0x0f, 0x6a, 0x32, 0xc8, 0x3b, 0xe5, 0x5b, 0x60, + 0xb7, 0x2d, 0x8b, 0xed, 0xb1, 0x1b, 0x50, 0x6c, 0xba, 0x35, 0xc3, 0xe6, 0x48, 0xca, 0x08, 0x9d, + 0xdc, 0xb6, 0xe8, 0x54, 0x6d, 0xda, 0xe6, 0x7b, 0xb8, 0xd9, 0x6e, 0xc3, 0x96, 0x53, 0xd7, 0xcb, + 0x07, 0x38, 0xa3, 0x4c, 0xcb, 0x2b, 0xd7, 0x74, 0xcb, 0x32, 0xea, 0x2a, 0xe0, 0x38, 0xcc, 0x8a, + 0x06, 0x23, 0x5f, 0x86, 0x97, 0x9a, 0x07, 0xae, 0xee, 0xb5, 0xea, 0xed, 0x7d, 0xd3, 0xf2, 0x9c, + 0x07, 0x56, 0x59, 0x1c, 0xc3, 0xe5, 0xf4, 0x7e, 0xf4, 0x12, 0xdc, 0x9a, 0x4b, 0x1d, 0x61, 0x1e, + 0xdf, 0x06, 0x6d, 0x2e, 0x25, 0x7f, 0x91, 0xd2, 0x4f, 0x15, 0xb8, 0x36, 0xc7, 0x38, 0x4a, 0x5e, + 0x81, 0x3b, 0x35, 0x43, 0xaf, 0xd4, 0x0d, 0xc7, 0xf1, 0xe8, 0xfb, 0xd2, 0x11, 0x64, 0x3e, 0x08, + 0x99, 0xbb, 0xcd, 0x1d, 0xf8, 0xe2, 0x7c, 0xf2, 0xe8, 0xdc, 0x7a, 0x09, 0x6e, 0xcd, 0x27, 0xe5, + 0xe7, 0x58, 0x8e, 0xae, 0xf6, 0xf9, 0x94, 0xe1, 0xf9, 0x97, 0x2f, 0xfd, 0x50, 0x81, 0xcb, 0xd9, + 0x77, 0x0a, 0xb4, 0x6f, 0xa6, 0xe5, 0xb8, 0x7a, 0xbd, 0xee, 0xb5, 0x74, 0x5b, 0x6f, 0x78, 0x86, + 0x65, 0x37, 0xeb, 0xf5, 0xac, 0x7d, 0xff, 0x16, 0xbc, 0x38, 0x9b, 0xd4, 0x29, 0xdb, 0x66, 0x8b, + 0x6e, 0x6d, 0x1a, 0xec, 0xce, 0xa6, 0x32, 0xcc, 0xb2, 0xa1, 0xe6, 0xf6, 0xde, 0xfe, 0xf1, 0xbf, + 0xed, 0x2e, 0xfc, 0xf8, 0xb3, 0x5d, 0xe5, 0x67, 0x9f, 0xed, 0x2a, 0xff, 0xfa, 0xd9, 0xae, 0xf2, + 0xde, 0xcb, 0x17, 0xc8, 0x2a, 0xff, 0xc1, 0x12, 0x0a, 0xcb, 0xf7, 0xfe, 0x27, 0x00, 0x00, 0xff, + 0xff, 0x25, 0x0d, 0xec, 0xa8, 0x4e, 0x9b, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -22699,6 +22761,9 @@ func (this *PluginEntraIDSyncSettings) Equal(that interface{}) bool { if this.TenantId != that1.TenantId { return false } + if this.EntraAppId != that1.EntraAppId { + return false + } if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { return false } @@ -30607,6 +30672,40 @@ func (m *AccessCapabilitiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } +func (m *RequestKubernetesResource) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RequestKubernetesResource) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RequestKubernetesResource) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Kind) > 0 { + i -= len(m.Kind) + copy(dAtA[i:], m.Kind) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Kind))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ResourceID) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -32326,6 +32425,20 @@ func (m *AccessRequestConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.KubernetesResources) > 0 { + for iNdEx := len(m.KubernetesResources) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KubernetesResources[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + } + } if m.MaxDuration != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.MaxDuration)) i-- @@ -41956,6 +42069,13 @@ func (m *PluginEntraIDSyncSettings) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.EntraAppId) > 0 { + i -= len(m.EntraAppId) + copy(dAtA[i:], m.EntraAppId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.EntraAppId))) + i-- + dAtA[i] = 0x2a + } if len(m.TenantId) > 0 { i -= len(m.TenantId) copy(dAtA[i:], m.TenantId) @@ -45890,6 +46010,14 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + n390, err390 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err390 != nil { + return 0, err390 + } + i -= n390 + i = encodeVarintTypes(dAtA, i, uint64(n390)) + i-- + dAtA[i] = 0x12 if len(m.AWS) > 0 { for iNdEx := len(m.AWS) - 1; iNdEx >= 0; iNdEx-- { { @@ -49430,6 +49558,22 @@ func (m *AccessCapabilitiesRequest) Size() (n int) { return n } +func (m *RequestKubernetesResource) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Kind) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ResourceID) Size() (n int) { if m == nil { return 0 @@ -50218,6 +50362,12 @@ func (m *AccessRequestConditions) Size() (n int) { if m.MaxDuration != 0 { n += 1 + sovTypes(uint64(m.MaxDuration)) } + if len(m.KubernetesResources) > 0 { + for _, e := range m.KubernetesResources { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -54605,6 +54755,10 @@ func (m *PluginEntraIDSyncSettings) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.EntraAppId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -56394,6 +56548,8 @@ func (m *AccessGraphSync) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) } } + l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval) + n += 1 + l + sovTypes(uint64(l)) if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -79361,6 +79517,89 @@ func (m *AccessCapabilitiesRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *RequestKubernetesResource) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: RequestKubernetesResource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RequestKubernetesResource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ResourceID) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -84754,6 +84993,40 @@ func (m *AccessRequestConditions) Unmarshal(dAtA []byte) error { break } } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesResources", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubernetesResources = append(m.KubernetesResources, RequestKubernetesResource{}) + if err := m.KubernetesResources[len(m.KubernetesResources)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -112747,6 +113020,38 @@ func (m *PluginEntraIDSyncSettings) Unmarshal(dAtA []byte) error { } m.TenantId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EntraAppId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.EntraAppId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -123190,6 +123495,39 @@ func (m *AccessGraphSync) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PollInterval", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.PollInterval, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/api/version.go b/api/version.go index 92b6f3447a9d8..151a562dcff65 100644 --- a/api/version.go +++ b/api/version.go @@ -3,6 +3,6 @@ package api import "github.com/coreos/go-semver/semver" -const Version = "16.4.6" +const Version = "16.4.7" var SemVersion = semver.New(Version) diff --git a/build.assets/macos/tsh/tsh.app/Contents/Info.plist b/build.assets/macos/tsh/tsh.app/Contents/Info.plist index 0980ed7c1c8d3..ff9406764b6e8 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 - 16.4.6 + 16.4.7 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.4.6 + 16.4.7 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 5f4cd92b17219..5672e09df2f4b 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 - 16.4.6 + 16.4.7 CFBundleSupportedPlatforms MacOSX CFBundleVersion - 16.4.6 + 16.4.7 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild diff --git a/build.assets/please-run.sh b/build.assets/please-run.sh new file mode 100755 index 0000000000000..236684efbb2b1 --- /dev/null +++ b/build.assets/please-run.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +# This script is a helper that tells developers what generated content is out of date +# and which command to run. +# When running on GitHub actions, the script will also create an error in the PR and +# collapse the diff to improve readability. + +set -eu + +# only echoes the string if we are in GitHub Actions +echo_gha() { + [ -n "${GITHUB_ACTIONS+x}" ] && echo "$@" +} + +main() { + if [ $# -ne 2 ]; then + echo "Usage: $0 " >&2 + exit 1 + fi + + KIND="$1" + GENERATE_COMMAND="$2" + + TITLE="$KIND are out-of-date" + MESSAGE="Please run the command \`$GENERATE_COMMAND\`" + + # Create a GitHub error + echo_gha "::error file=Makefile,title=$TITLE::$MESSAGE" + + echo "=============" + echo "$TITLE" + echo "$MESSAGE" + echo "=============" + + echo_gha "::group::Diff output" + git diff || true + echo_gha "::endgroup::" +} + +main "$@" \ No newline at end of file diff --git a/build.assets/tooling/go.mod b/build.assets/tooling/go.mod index b9ff5668cc560..d20a6bc101c60 100644 --- a/build.assets/tooling/go.mod +++ b/build.assets/tooling/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/build.assets/tooling -go 1.22.8 +go 1.22.9 require ( github.com/Masterminds/sprig/v3 v3.2.3 diff --git a/build.assets/versions.mk b/build.assets/versions.mk index 17a89a06bce84..78b9d1e7a4f06 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -3,7 +3,7 @@ # Keep versions in sync with devbox.json, when applicable. # Sync with devbox.json. -GOLANG_VERSION ?= go1.22.8 +GOLANG_VERSION ?= go1.22.9 GOLANGCI_LINT_VERSION ?= v1.61.0 NODE_VERSION ?= 20.17.0 diff --git a/docs/config.json b/docs/config.json index a937123578112..3c7d6d5ebd6a7 100644 --- a/docs/config.json +++ b/docs/config.json @@ -185,18 +185,18 @@ "teleport": { "git": "api/14.0.0-gd1e081e", "major_version": "16", - "version": "16.4.6", + "version": "16.4.7", "url": "teleport.example.com", "golang": "1.22", "plugin": { - "version": "16.4.6" + "version": "16.4.7" }, "helm_repo_url": "https://charts.releases.teleport.dev", - "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.4.6", - "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.4.6", - "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.4.6", - "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.4.6", - "teleport_install_script_url": "https://cdn.teleport.dev/install-v16.4.6.sh" + "latest_oss_docker_image": "public.ecr.aws/gravitational/teleport-distroless:16.4.7", + "latest_oss_debug_docker_image": "public.ecr.aws/gravitational/teleport-distroless-debug:16.4.7", + "latest_ent_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless:16.4.7", + "latest_ent_debug_docker_image": "public.ecr.aws/gravitational/teleport-ent-distroless-debug:16.4.7", + "teleport_install_script_url": "https://cdn.teleport.dev/install-v16.4.7.sh" }, "terraform": { "version": "1.0.0" @@ -420,7 +420,7 @@ }, { "source": "/application-access/jwt/", - "destination": "/enroll-resources/application-access/jwt/", + "destination": "/enroll-resources/application-access/jwt/jwt/", "permanent": true }, { diff --git a/docs/cspell.json b/docs/cspell.json index 9e08456c0f3be..2cb8dc3c8f5d1 100644 --- a/docs/cspell.json +++ b/docs/cspell.json @@ -574,6 +574,7 @@ "jumphost", "jwks", "jwkset", + "keepalive", "keepalives", "keyfile", "keymap", @@ -953,6 +954,7 @@ "unconfigured", "uninstallation", "uniqueid", + "unmanaged", "unmarshal", "unprefixed", "unregistering", @@ -1026,4 +1028,4 @@ "**/reference/terraform-provider/**", "**/reference/operator-resources/**" ] -} \ No newline at end of file +} diff --git a/docs/pages/admin-guides/deploy-a-cluster/hsm.mdx b/docs/pages/admin-guides/deploy-a-cluster/hsm.mdx index bf627fcefcb0c..786a64e8cd944 100644 --- a/docs/pages/admin-guides/deploy-a-cluster/hsm.mdx +++ b/docs/pages/admin-guides/deploy-a-cluster/hsm.mdx @@ -207,7 +207,7 @@ to use. Created session 0 # Create an Authenticate Key for Teleport - yubihsm> put authkey 0 0 "Teleport Auth Key" 1 generate-asymmetric-key:sign-pkcs:delete-asymmetric-key sign-pkcs:sign-pss:decrypt-pkcs:decrypt-oaep hunter22 + yubihsm> put authkey 0 0 "Teleport Auth Key" 1 generate-asymmetric-key:sign-pkcs:sign-pss:sign-ecdsa:delete-asymmetric-key sign-pkcs:sign-pss:decrypt-pkcs:decrypt-oaep:sign-ecdsa hunter22 Stored Authentication key 0x85cf # Make sure you can open a session with the new authentication key and password diff --git a/docs/pages/admin-guides/management/guides/guides.mdx b/docs/pages/admin-guides/management/guides/guides.mdx index bc817ac0bae83..db09c71368850 100644 --- a/docs/pages/admin-guides/management/guides/guides.mdx +++ b/docs/pages/admin-guides/management/guides/guides.mdx @@ -8,6 +8,8 @@ You can integrate Teleport with third-party tools in order to complete various tasks in your cluster. These guides describe Teleport integrations that are not documented elsewhere: + - [AWS OIDC Integration with Teleport](awsoidc-integration.mdx). How + to set up the AWS OIDC integration to allow Teleport to interact with AWS. - [EC2 tags as Teleport agent labels](ec2-tags.mdx). How to set up Teleport agent labels based on EC2 tags. - [GCP tags and labels as Teleport agent labels](gcp-tags.mdx). How diff --git a/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx b/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx index 464041d58c8d1..b639ab2a0673a 100644 --- a/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx +++ b/docs/pages/enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx @@ -35,135 +35,15 @@ database. Service. - (!docs/pages/includes/tctl.mdx!) -## Step 1/5. Install the Teleport Database Service -(!docs/pages/includes/tctl-token.mdx serviceName="Database" tokenType="db" tokenFile="/tmp/token"!) - -Install Teleport on the host where you will run the Teleport Database Service: - -(!docs/pages/includes/install-linux.mdx!) - -Create the Database Service configuration. - - - - -- Specify the region for your database(s) in `--azure-postgres-discovery`. - -- Replace the `--proxy` value with your Teleport proxy address or Teleport cloud - URI (e.g. `mytenant.teleport.sh:443`): - - ```code - $ sudo teleport db configure create \ - -o file \ - --proxy=teleport.example.com:443 \ - --token=/tmp/token \ - --azure-postgres-discovery=eastus - ``` - - - - -- Specify the region for your database(s) in `--azure-mysql-discovery`. - -- Replace the `--proxy` value with your Teleport proxy address or Teleport cloud - URI (e.g. `mytenant.teleport.sh:443`): - - ```code - $ sudo teleport db configure create \ - -o file \ - --proxy=teleport.example.com:443 \ - --token=/tmp/token \ - --azure-mysql-discovery=eastus - ``` - - - - - -Run the following command on your Database Service host: - - ```code - $ sudo teleport db configure create \ - -o file \ - --proxy=teleport.example.com:443 \ - --token=/tmp/token \ - --azure-mysql-discovery=eastus \ - --azure-postgres-discovery=eastus - ``` - - -This will create two `types` entities in `teleport.yaml`, one for each database -type. This is useful if you want different regions, tags, or labels for each -database type. - -Alternatively, you can edit `teleport.yaml` to include both database types in a -single entry: - -```yaml -db_service: - azure: - - types: ["mysql", "postgres"] - ... -``` - - - - - - - -This command will generate a Database Service configuration with Azure MySQL/Postgres -database auto-discovery enabled in the `eastus` region and place it at the -`/etc/teleport.yaml` location. - -### Create a Teleport role - -On your workstation logged in to your Teleport cluster with `tsh`, define a new -role to provide access to your Azure database. Create a file called `azure-database-role.yaml` with the following content: - -```yaml -version: v7 -kind: role -metadata: - name: azure-database-access -spec: - allow: - db_labels: - 'engine': - - "Microsoft.DBforMySQL/servers" - - "Microsoft.DBforMySQL/flexibleServers" - - "Microsoft.DBforPostgreSQL/servers" - - "Microsoft.DBforPostgreSQL/flexibleServers" - db_names: - - '*' - db_users: - - teleport -``` - -| Flag | Description | -|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------| -| `--db-users` | List of database usernames the user will be allowed to use when connecting to the databases. A wildcard allows any user. | -| `--db-names` | List of logical databases (aka schemas) the user will be allowed to connect to within a database server. A wildcard allows any database. | -| `--db-labels` | List of labels assigned to the database the user will be able to access. A wildcard entry allows any database. | - -Save this file and apply it to your Teleport cluster: - -```code -$ tctl create -f azure-database-role.yaml -role 'azure-database-role.yaml' has been created -``` - -(\!docs/pages/includes/add-role-to-user.mdx role="azure-database-access" \!) - -## Step 2/5. Configure Azure service principal +## Step 1/5. Configure Azure service principal To authenticate with PostgreSQL or MySQL databases, Teleport Database Service needs to obtain access tokens from Azure AD. (!docs/pages/includes/database-access/azure-configure-service-principal.mdx!) -## Step 3/5. Configure IAM permissions for Teleport +## Step 2/5. Configure IAM permissions for Teleport ### Create a custom role @@ -228,7 +108,7 @@ and replace the subscription in "assignableScopes" with your own subscription id (!docs/pages/includes/database-access/azure-assign-service-principal.mdx!) -## Step 4/5. Create Azure database users +## Step 3/5. Create Azure database users To let Teleport connect to your Azure database authenticating as a service principal, you need to create Azure AD users authenticated by that principal in the database. @@ -367,6 +247,137 @@ GRANT ALL ON `%`.* TO 'teleport'@'%'; You can create multiple database users identified by the same service principal. +## Step 4/5. Install the Teleport Database Service + +(!docs/pages/includes/tctl-token.mdx serviceName="Database" tokenType="db" tokenFile="/tmp/token"!) + +Install Teleport on the host where you will run the Teleport Database Service: + +(!docs/pages/includes/install-linux.mdx!) + +Create the Database Service configuration. + + + + +- Specify the region for your database(s) in `--azure-postgres-discovery`. + +- Replace the `--proxy` value with your Teleport Proxy Service address or Teleport Enterprise (Cloud) + URI (e.g. `example.teleport.sh:443`): + + ```code + $ sudo teleport db configure create \ + -o file \ + --proxy=teleport.example.com:443 \ + --token=/tmp/token \ + --azure-postgres-discovery=eastus + ``` + + + + +- Specify the region for your database(s) in `--azure-mysql-discovery`. + +- Replace the `--proxy` value with your Teleport Proxy Service address or Teleport Enterprise (Cloud) + URI (e.g. `example.teleport.sh:443`): + + ```code + $ sudo teleport db configure create \ + -o file \ + --proxy=teleport.example.com:443 \ + --token=/tmp/token \ + --azure-mysql-discovery=eastus + ``` + + + + + +Run the following command on your Database Service host: + + ```code + $ sudo teleport db configure create \ + -o file \ + --proxy=teleport.example.com:443 \ + --token=/tmp/token \ + --azure-mysql-discovery=eastus \ + --azure-postgres-discovery=eastus + ``` + +This will create two `types` entities in `teleport.yaml`, one for each database +type. This is useful if you want different regions, tags, or labels for each +database type. + +Alternatively, you can edit `teleport.yaml` to include both database types in a +single entry: + +```yaml +db_service: + azure: + - types: ["mysql", "postgres"] + ... +``` + + + + + +This command will generate a Database Service configuration with Azure MySQL/Postgres +database auto-discovery enabled in the `eastus` region and place it at the +`/etc/teleport.yaml` location. + +### Create a Teleport role + +On your workstation logged in to your Teleport cluster with `tsh`, define a new +role to provide access to your Azure database. Create a file called `azure-database-role.yaml` with the following content: + +```yaml +version: v7 +kind: role +metadata: + name: azure-database-access +spec: + allow: + db_labels: + 'engine': + - "Microsoft.DBforMySQL/servers" + - "Microsoft.DBforMySQL/flexibleServers" + - "Microsoft.DBforPostgreSQL/servers" + - "Microsoft.DBforPostgreSQL/flexibleServers" + db_names: + - '*' + db_users: + - teleport +``` + +| Flag | Description | +|----------------------------|------------------------------------------------------------------------------------------------------------------------------------------| +| `--db-users` | List of database usernames the user will be allowed to use when connecting to the databases. A wildcard allows any user. | +| `--db-names` | List of logical databases (aka schemas) the user will be allowed to connect to within a database server. A wildcard allows any database. | +| `--db-labels` | List of labels assigned to the database the user will be able to access. A wildcard entry allows any database. | + +Save this file and apply it to your Teleport cluster: + +```code +$ tctl create -f azure-database-role.yaml +role 'azure-database-role.yaml' has been created +``` + +(\!docs/pages/includes/add-role-to-user.mdx role="azure-database-access" \!) + +### Start Teleport Database Service + +(!docs/pages/includes/start-teleport.mdx service="the Teleport Database Service"!) + + + A single Teleport process can run multiple different services, for example + multiple Database Service agents as well as the SSH Service or Application + Service. + + ## Step 5/5. Connect Log in to your Teleport cluster. Your Azure database should appear in the list of diff --git a/docs/pages/enroll-resources/machine-id/troubleshooting.mdx b/docs/pages/enroll-resources/machine-id/troubleshooting.mdx index c51225c3cb4b7..ede717d90962c 100644 --- a/docs/pages/enroll-resources/machine-id/troubleshooting.mdx +++ b/docs/pages/enroll-resources/machine-id/troubleshooting.mdx @@ -320,3 +320,18 @@ outputs: Failure to add the `disable_exec_plugin` flag will result in a warning being displayed: `Destination kubernetes_secret: identity-output must be a directory in exec plugin mode`. + +## Configuring `tbot` for split DNS proxies + +When you have deployed your Proxy Service in such a way that it is +accessible via two different DNS names, e.g an internal and external address, +you may find that a `tbot` that is configured to use one of these addresses may +attempt to use the other address and that this may cause connections to fail. + +This is because `tbot` queries an auto-configuration endpoint exposed by the +Proxy Service to determine the canonical address to use when connecting. + +To fix this, set a variable of `TBOT_USE_PROXY_ADDR=yes` in the environment of the +`tbot` process. This configures `tbot` to prefer using the address that you have +explicitly provided. This only functions correctly in cases where TLS +routing/multiplexing is enabled for the Teleport cluster. diff --git a/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx b/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx index 175e6693b56fb..1ebd25154c1f9 100644 --- a/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx +++ b/docs/pages/includes/helm-reference/zz_generated.teleport-kube-agent.mdx @@ -266,7 +266,7 @@ annotations: `azureDatabases` configures Azure database auto-discovery. - For Azure database auto-discovery to work, your Database Service pods will need to have appropriate IAM permissions as per the [database documentation](../../enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx#step-35-configure-iam-permissions-for-teleport). + For Azure database auto-discovery to work, your Database Service pods will need to have appropriate IAM permissions as per the [database documentation](../../enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx#step-25-configure-iam-permissions-for-teleport). After configuring a service principal with appropriate IAM permissions, you must pass credentials to the pods. The easiest way is to use an Azure client secret. diff --git a/docs/pages/includes/okta-permissions.mdx b/docs/pages/includes/okta-permissions.mdx index 6adf791d09e0a..7d4896d613c30 100644 --- a/docs/pages/includes/okta-permissions.mdx +++ b/docs/pages/includes/okta-permissions.mdx @@ -13,8 +13,7 @@ The permissions required are: ### Group permissions -- View groups and their details -- Manage group membership +- Manage groups ### Application permissions diff --git a/docs/pages/includes/plugins/config-toml-teleport.mdx b/docs/pages/includes/plugins/config-toml-teleport.mdx index f8570c029b28f..874f9a9d472e4 100644 --- a/docs/pages/includes/plugins/config-toml-teleport.mdx +++ b/docs/pages/includes/plugins/config-toml-teleport.mdx @@ -2,7 +2,7 @@ **`addr`**: Include the hostname and HTTPS port of your Teleport Proxy Service -or Teleport Enterprise Cloud tenant (e.g., `teleport.example.com:443` or +or Teleport Enterprise Cloud account (e.g., `teleport.example.com:443` or `mytenant.teleport.sh:443`). **`identity`**: Fill this in with the path to the identity file you exported diff --git a/docs/pages/reference/cli/tsh.mdx b/docs/pages/reference/cli/tsh.mdx index d5f91affbc852..dac5863a853f6 100644 --- a/docs/pages/reference/cli/tsh.mdx +++ b/docs/pages/reference/cli/tsh.mdx @@ -13,7 +13,7 @@ Environment variables configure your tsh client and can help you avoid using fla | Environment Variable | Description | Example Value | | - | - | - | -| TELEPORT_AUTH | Name of a defined SAML, OIDC, or GitHub auth connector (or a local user) | okta | +| TELEPORT_AUTH | Any defined [authentication connector](../access-controls/authentication.mdx), including `passwordless` and `local` (i.e., no authentication connector) | okta | | TELEPORT_MFA_MODE | Preferred mode for MFA and Passwordless assertions | otp | | TELEPORT_CLUSTER | Name of a Teleport root or leaf cluster | cluster.example.com | | TELEPORT_LOGIN | Login name to be used by default on the remote host | root | diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx index 204ff9b9b9cd4..0841d62f4fcd6 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx @@ -112,6 +112,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specallowrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specallowrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -126,6 +127,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.allow.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.allow.request.thresholds items |Field|Type|Description| @@ -262,6 +269,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specdenyrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specdenyrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -276,6 +284,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.deny.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.deny.request.thresholds items |Field|Type|Description| @@ -495,6 +509,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specallowrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specallowrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -509,6 +524,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.allow.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.allow.request.thresholds items |Field|Type|Description| @@ -645,6 +666,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specdenyrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specdenyrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -659,6 +681,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.deny.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.deny.request.thresholds items |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx index 1ea906c390622..c44fdf7a4987f 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx @@ -112,6 +112,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specallowrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specallowrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -126,6 +127,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.allow.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.allow.request.thresholds items |Field|Type|Description| @@ -262,6 +269,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specdenyrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specdenyrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -276,6 +284,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.deny.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.deny.request.thresholds items |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx index 877857b1dd5e1..6ca51d211375d 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx @@ -112,6 +112,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specallowrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specallowrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -126,6 +127,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.allow.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.allow.request.thresholds items |Field|Type|Description| @@ -262,6 +269,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |---|---|---| |annotations|object|Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions.| |claims_to_roles|[][object](#specdenyrequestclaims_to_roles-items)|ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.| +|kubernetes_resources|[][object](#specdenyrequestkubernetes_resources-items)|kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources.| |max_duration|string|MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.| |roles|[]string|Roles is the name of roles which will match the request rule.| |search_as_roles|[]string|SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request.| @@ -276,6 +284,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |roles|[]string|Roles is a list of static teleport roles to match.| |value|string|Value is a claim value to match.| +### spec.deny.request.kubernetes_resources items + +|Field|Type|Description| +|---|---|---| +|kind|string|kind specifies the Kubernetes Resource type.| + ### spec.deny.request.thresholds items |Field|Type|Description| diff --git a/docs/pages/reference/terraform-provider/data-sources/role.mdx b/docs/pages/reference/terraform-provider/data-sources/role.mdx index c86fe26c731c1..e6e632f2d84a1 100644 --- a/docs/pages/reference/terraform-provider/data-sources/role.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/role.mdx @@ -130,6 +130,7 @@ Optional: - `annotations` (Map of List of String) Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions. - `claims_to_roles` (Attributes List) ClaimsToRoles specifies a mapping from claims (traits) to teleport roles. (see [below for nested schema](#nested-schema-for-specallowrequestclaims_to_roles)) +- `kubernetes_resources` (Attributes List) kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources. (see [below for nested schema](#nested-schema-for-specallowrequestkubernetes_resources)) - `max_duration` (String) MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. - `roles` (List of String) Roles is the name of roles which will match the request rule. - `search_as_roles` (List of String) SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request. @@ -145,6 +146,13 @@ Optional: - `value` (String) Value is a claim value to match. +### Nested Schema for `spec.allow.request.kubernetes_resources` + +Optional: + +- `kind` (String) kind specifies the Kubernetes Resource type. + + ### Nested Schema for `spec.allow.request.thresholds` Optional: @@ -293,6 +301,7 @@ Optional: - `annotations` (Map of List of String) Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions. - `claims_to_roles` (Attributes List) ClaimsToRoles specifies a mapping from claims (traits) to teleport roles. (see [below for nested schema](#nested-schema-for-specdenyrequestclaims_to_roles)) +- `kubernetes_resources` (Attributes List) kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources. (see [below for nested schema](#nested-schema-for-specdenyrequestkubernetes_resources)) - `max_duration` (String) MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. - `roles` (List of String) Roles is the name of roles which will match the request rule. - `search_as_roles` (List of String) SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request. @@ -308,6 +317,13 @@ Optional: - `value` (String) Value is a claim value to match. +### Nested Schema for `spec.deny.request.kubernetes_resources` + +Optional: + +- `kind` (String) kind specifies the Kubernetes Resource type. + + ### Nested Schema for `spec.deny.request.thresholds` Optional: diff --git a/docs/pages/reference/terraform-provider/resources/role.mdx b/docs/pages/reference/terraform-provider/resources/role.mdx index e18ddabb1f0e5..95761be14a8ff 100644 --- a/docs/pages/reference/terraform-provider/resources/role.mdx +++ b/docs/pages/reference/terraform-provider/resources/role.mdx @@ -184,6 +184,7 @@ Optional: - `annotations` (Map of List of String) Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions. - `claims_to_roles` (Attributes List) ClaimsToRoles specifies a mapping from claims (traits) to teleport roles. (see [below for nested schema](#nested-schema-for-specallowrequestclaims_to_roles)) +- `kubernetes_resources` (Attributes List) kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources. (see [below for nested schema](#nested-schema-for-specallowrequestkubernetes_resources)) - `max_duration` (String) MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. - `roles` (List of String) Roles is the name of roles which will match the request rule. - `search_as_roles` (List of String) SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request. @@ -199,6 +200,13 @@ Optional: - `value` (String) Value is a claim value to match. +### Nested Schema for `spec.allow.request.kubernetes_resources` + +Optional: + +- `kind` (String) kind specifies the Kubernetes Resource type. + + ### Nested Schema for `spec.allow.request.thresholds` Optional: @@ -347,6 +355,7 @@ Optional: - `annotations` (Map of List of String) Annotations is a collection of annotations to be programmatically appended to pending Access Requests at the time of their creation. These annotations serve as a mechanism to propagate extra information to plugins. Since these annotations support variable interpolation syntax, they also offer a mechanism for forwarding claims from an external identity provider, to a plugin via `{{external.trait_name}}` style substitutions. - `claims_to_roles` (Attributes List) ClaimsToRoles specifies a mapping from claims (traits) to teleport roles. (see [below for nested schema](#nested-schema-for-specdenyrequestclaims_to_roles)) +- `kubernetes_resources` (Attributes List) kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind "kube_cluster" or any of its subresources like "namespaces". This field can be defined such that it prevents a user from requesting "kube_cluster" and enforce requesting any of its subresources. (see [below for nested schema](#nested-schema-for-specdenyrequestkubernetes_resources)) - `max_duration` (String) MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used. - `roles` (List of String) Roles is the name of roles which will match the request rule. - `search_as_roles` (List of String) SearchAsRoles is a list of extra roles which should apply to a user while they are searching for resources as part of a Resource Access Request, and defines the underlying roles which will be requested as part of any Resource Access Request. @@ -362,6 +371,13 @@ Optional: - `value` (String) Value is a claim value to match. +### Nested Schema for `spec.deny.request.kubernetes_resources` + +Optional: + +- `kind` (String) kind specifies the Kubernetes Resource type. + + ### Nested Schema for `spec.deny.request.thresholds` Optional: diff --git a/docs/pages/upcoming-releases.mdx b/docs/pages/upcoming-releases.mdx index 52e9e955cfb6d..80025b0f0cea9 100644 --- a/docs/pages/upcoming-releases.mdx +++ b/docs/pages/upcoming-releases.mdx @@ -45,6 +45,11 @@ members in other Access Lists. *Delayed from Teleport 16.2.0.* +#### Access Lists UI/UX improvements + +Teleport web UI will have an updated Access Lists page that will include the new table +view, improved search and filtering capabilities. + #### Signed and notarized macOS assets macOS teleport.pkg installer will include signed and notarized `tsh.app` and `tctl.app` @@ -94,9 +99,9 @@ using Teleport web UI without needing to self-host the email plugin. | Version | Date | |---------|---------------| -| 1.25.0 | December 2024 | +| 1.26.0 | December 2024 | -### 1.25.0 +### 1.26.0 #### Support for Teleport trusted clusters diff --git a/e b/e index cc7fefb390f14..ad68682e1267c 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit cc7fefb390f14edad07539c81264b327070e2558 +Subproject commit ad68682e1267c3a553e33591629e99ccb40d5623 diff --git a/examples/chart/access/datadog/Chart.yaml b/examples/chart/access/datadog/Chart.yaml index 0890fd9dfc1ab..ef85231344cbb 100644 --- a/examples/chart/access/datadog/Chart.yaml +++ b/examples/chart/access/datadog/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" apiVersion: v2 name: teleport-plugin-datadog diff --git a/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap b/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap index 56dd7199ba7af..b194f5c252398 100644 --- a/examples/chart/access/datadog/tests/__snapshot__/configmap_test.yaml.snap +++ b/examples/chart/access/datadog/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-datadog - app.kubernetes.io/version: 16.4.6 - helm.sh/chart: teleport-plugin-datadog-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-datadog-16.4.7 name: RELEASE-NAME-teleport-plugin-datadog diff --git a/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap b/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap index c3775fbc7a82e..2a84bf67272e5 100644 --- a/examples/chart/access/datadog/tests/__snapshot__/deployment_test.yaml.snap +++ b/examples/chart/access/datadog/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-datadog - app.kubernetes.io/version: 16.4.6 - helm.sh/chart: teleport-plugin-datadog-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-datadog-16.4.7 name: RELEASE-NAME-teleport-plugin-datadog 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-datadog - app.kubernetes.io/version: 16.4.6 - helm.sh/chart: teleport-plugin-datadog-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-datadog-16.4.7 spec: containers: - command: diff --git a/examples/chart/access/discord/Chart.yaml b/examples/chart/access/discord/Chart.yaml index 73cd6a1bda849..79d0d417c39ed 100644 --- a/examples/chart/access/discord/Chart.yaml +++ b/examples/chart/access/discord/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 d82974e5efbcc..96f347cec52a8 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: 16.4.6 - helm.sh/chart: teleport-plugin-discord-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-discord-16.4.7 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 7a5a50d2fa848..710db17a9a870 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: 16.4.6 - helm.sh/chart: teleport-plugin-discord-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-discord-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-discord-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-discord-16.4.7 spec: containers: - command: diff --git a/examples/chart/access/email/Chart.yaml b/examples/chart/access/email/Chart.yaml index 4b9446bea396c..e4cd1873a948e 100644 --- a/examples/chart/access/email/Chart.yaml +++ b/examples/chart/access/email/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 60895d9bf7941..59f912185059d 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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 7a37605bdbc3f..95635815b439e 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-email-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-email-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-email:16.4.7 imagePullPolicy: IfNotPresent name: teleport-plugin-email ports: diff --git a/examples/chart/access/jira/Chart.yaml b/examples/chart/access/jira/Chart.yaml index 9f3c2deead7ce..3b655d17ac5ac 100644 --- a/examples/chart/access/jira/Chart.yaml +++ b/examples/chart/access/jira/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 4bde4506647d8..c114f518deeb2 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: 16.4.6 - helm.sh/chart: teleport-plugin-jira-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-jira-16.4.7 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 f8a501e1e743a..a3e20daf4427d 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: 16.4.6 - helm.sh/chart: teleport-plugin-jira-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-jira-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-jira-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-jira-16.4.7 spec: containers: - command: diff --git a/examples/chart/access/mattermost/Chart.yaml b/examples/chart/access/mattermost/Chart.yaml index d7204abe3e613..dbae17e383d46 100644 --- a/examples/chart/access/mattermost/Chart.yaml +++ b/examples/chart/access/mattermost/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 bfc1390082811..a1a335a768d91 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: 16.4.6 - helm.sh/chart: teleport-plugin-mattermost-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-mattermost-16.4.7 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 3435c7cfd663c..87b57b5d0f505 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: 16.4.6 - helm.sh/chart: teleport-plugin-mattermost-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-mattermost-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-mattermost-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-mattermost-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-mattermost-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-mattermost-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-mattermost-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-mattermost-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-mattermost-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-mattermost-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-mattermost-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-mattermost-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-mattermost:16.4.7 imagePullPolicy: IfNotPresent name: teleport-plugin-mattermost ports: diff --git a/examples/chart/access/msteams/Chart.yaml b/examples/chart/access/msteams/Chart.yaml index 3c959bbd6021c..bfae2b7fe601a 100644 --- a/examples/chart/access/msteams/Chart.yaml +++ b/examples/chart/access/msteams/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 8b42b66ddf7e0..172521c030cfe 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: 16.4.6 - helm.sh/chart: teleport-plugin-msteams-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-msteams-16.4.7 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 39a1dcb63c149..0cd9e3a0842ee 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: 16.4.6 - helm.sh/chart: teleport-plugin-msteams-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-msteams-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-msteams-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-msteams-16.4.7 spec: containers: - command: diff --git a/examples/chart/access/pagerduty/Chart.yaml b/examples/chart/access/pagerduty/Chart.yaml index 663773f75c2e1..6184c48aef6d8 100644 --- a/examples/chart/access/pagerduty/Chart.yaml +++ b/examples/chart/access/pagerduty/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 83d48445a1a14..6bbcec04a9afa 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: 16.4.6 - helm.sh/chart: teleport-plugin-pagerduty-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-pagerduty-16.4.7 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 8d473fa5f8dad..2e18b9849f278 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: 16.4.6 - helm.sh/chart: teleport-plugin-pagerduty-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-pagerduty-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-pagerduty-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-pagerduty-16.4.7 spec: containers: - command: diff --git a/examples/chart/access/slack/Chart.yaml b/examples/chart/access/slack/Chart.yaml index 685edc49cc5a8..899a294446c8a 100644 --- a/examples/chart/access/slack/Chart.yaml +++ b/examples/chart/access/slack/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 b6c08e6142674..a75b106514508 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: 16.4.6 - helm.sh/chart: teleport-plugin-slack-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-slack-16.4.7 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 2638a3320017c..45d14bba7e340 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: 16.4.6 - helm.sh/chart: teleport-plugin-slack-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-slack-16.4.7 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: 16.4.6 - helm.sh/chart: teleport-plugin-slack-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-slack-16.4.7 spec: containers: - command: diff --git a/examples/chart/event-handler/Chart.yaml b/examples/chart/event-handler/Chart.yaml index 637bf235b7c42..1c712ffbf4811 100644 --- a/examples/chart/event-handler/Chart.yaml +++ b/examples/chart/event-handler/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" apiVersion: v2 name: teleport-plugin-event-handler diff --git a/examples/chart/event-handler/README.md b/examples/chart/event-handler/README.md index b520604cac6e9..07a6d885197f8 100644 --- a/examples/chart/event-handler/README.md +++ b/examples/chart/event-handler/README.md @@ -21,7 +21,9 @@ The following values can be set for the Helm chart: teleport.address - Host/port combination of the teleport auth server + hostname and HTTPS port of your Teleport Proxy Service +or Teleport Enterprise Cloud account (e.g., `teleport.example.com:443` or +`mytenant.teleport.sh:443`) string "" yes 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 0d7ad5ac45b17..d9d81d6846c5e 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: 16.4.6 - helm.sh/chart: teleport-plugin-event-handler-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-event-handler-16.4.7 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 133577d211a2a..1ca17d0c03a8c 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: 16.4.6 - helm.sh/chart: teleport-plugin-event-handler-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-plugin-event-handler-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-plugin-event-handler:16.4.7 imagePullPolicy: IfNotPresent name: teleport-plugin-event-handler ports: diff --git a/examples/chart/tbot/Chart.yaml b/examples/chart/tbot/Chart.yaml index eeade7ed7e299..08eee5f0ac1a8 100644 --- a/examples/chart/tbot/Chart.yaml +++ b/examples/chart/tbot/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 b597ada4840b0..76fade9ae50ff 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-16.4.6 + helm.sh/chart: tbot-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/tbot-distroless:16.4.7 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-16.4.6 + helm.sh/chart: tbot-16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/tbot-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-cluster/Chart.yaml b/examples/chart/teleport-cluster/Chart.yaml index 42285ae340b16..45443aeca068b 100644 --- a/examples/chart/teleport-cluster/Chart.yaml +++ b/examples/chart/teleport-cluster/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 ebdad0d1d516a..73a0f26b4ea79 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 "16.4.6" +.version: &version "16.4.7" name: teleport-operator apiVersion: v2 diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml index 7ab8f4da5929f..501e25ec12dcc 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml @@ -326,6 +326,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -852,6 +867,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -1670,6 +1700,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -2196,6 +2241,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml index a0d50c80bec2e..886b50224e63a 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml @@ -329,6 +329,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -855,6 +870,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml index ebf0a0a486337..83b59cc0ba273 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml @@ -329,6 +329,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -855,6 +870,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration diff --git a/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml b/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml index a8edf708e0e07..860c790645fa4 100644 --- a/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml +++ b/examples/chart/teleport-cluster/templates/auth/predeploy_job.yaml @@ -36,7 +36,7 @@ spec: {{- if $auth.resources }} resources: {{- toYaml $auth.resources | nindent 10 }} -{{- end }} +{{- end }} {{- if or $auth.extraEnv $auth.tls.existingCASecretName }} env: {{- if (gt (len $auth.extraEnv) 0) }} @@ -104,4 +104,5 @@ spec: {{- if .Values.extraVolumes }} {{- toYaml .Values.extraVolumes | nindent 6 }} {{- end }} + serviceAccountName: {{ include "teleport-cluster.auth.serviceAccountName" . }} {{- end }} diff --git a/examples/chart/teleport-cluster/templates/auth/predeploy_serviceaccount.yaml b/examples/chart/teleport-cluster/templates/auth/predeploy_serviceaccount.yaml new file mode 100644 index 0000000000000..8510f30145fb0 --- /dev/null +++ b/examples/chart/teleport-cluster/templates/auth/predeploy_serviceaccount.yaml @@ -0,0 +1,34 @@ +# this is a carbon copy of the regular serviceAccount object which is only used to run pre-deploy jobs +# upon first install of the chart. it will be deleted by Helm after the pre-deploy hooks run, then the +# regular serviceAccount is created with the same name and exists for the lifetime of the release. +{{- $auth := mustMergeOverwrite (mustDeepCopy .Values) .Values.auth -}} +{{- $projectedServiceAccountToken := semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version }} +{{- if $auth.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ template "teleport-cluster.auth.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "teleport-cluster.auth.labels" . | nindent 4 }} + {{- if $auth.extraLabels.serviceAccount }} + {{- toYaml $auth.extraLabels.serviceAccount | nindent 4 }} + {{- end }} + annotations: + # this ServiceAccount resource MUST only be hooked on pre-install, as it would conflict + # with the existing ServiceAccount if hooked on pre-upgrade. + "helm.sh/hook": pre-install + "helm.sh/hook-weight": "3" + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded + {{- if or $auth.annotations.serviceAccount $auth.azure.clientID }} + {{- if $auth.annotations.serviceAccount }} + {{- toYaml $auth.annotations.serviceAccount | nindent 4 }} + {{- end }} + {{- if $auth.azure.clientID }} + azure.workload.identity/client-id: "{{ $auth.azure.clientID }}" + {{- end }} + {{- end -}} +{{- if $projectedServiceAccountToken }} +automountServiceAccountToken: false +{{- end }} +{{- end }} diff --git a/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml b/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml index a0d8547d158da..627aa4c626fcc 100644 --- a/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml +++ b/examples/chart/teleport-cluster/templates/proxy/predeploy_job.yaml @@ -100,4 +100,5 @@ spec: {{- if $proxy.extraVolumes }} {{- toYaml $proxy.extraVolumes | nindent 6 }} {{- end }} + serviceAccountName: {{ include "teleport-cluster.proxy.serviceAccountName" . }} {{- end }} diff --git a/examples/chart/teleport-cluster/templates/proxy/predeploy_serviceaccount.yaml b/examples/chart/teleport-cluster/templates/proxy/predeploy_serviceaccount.yaml new file mode 100644 index 0000000000000..89a056ceed58e --- /dev/null +++ b/examples/chart/teleport-cluster/templates/proxy/predeploy_serviceaccount.yaml @@ -0,0 +1,29 @@ +# this is a carbon copy of the regular serviceAccount object which is only used to run pre-deploy jobs +# upon first install of the chart. it will be deleted by Helm after the pre-deploy hooks run, then the +# regular serviceAccount is created with the same name and exists for the lifetime of the release. +{{- $proxy := mustMergeOverwrite (mustDeepCopy .Values) .Values.proxy -}} +{{- $projectedServiceAccountToken := semverCompare ">=1.20.0-0" .Capabilities.KubeVersion.Version }} +{{- if $proxy.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "teleport-cluster.proxy.serviceAccountName" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "teleport-cluster.proxy.labels" . | nindent 4 }} + {{- if $proxy.extraLabels.serviceAccount }} + {{- toYaml $proxy.extraLabels.serviceAccount | nindent 4 }} + {{- end }} + annotations: + # this ServiceAccount resource MUST only be hooked on pre-install, as it would conflict + # with the existing ServiceAccount if hooked on pre-upgrade. + "helm.sh/hook": pre-install + "helm.sh/hook-weight": "3" + "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded +{{- if $proxy.annotations.serviceAccount }} + {{- toYaml $proxy.annotations.serviceAccount | nindent 4 }} +{{- end -}} +{{- if $projectedServiceAccountToken }} +automountServiceAccountToken: false +{{- end }} +{{- end }} 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 a1aff5af64057..edefea8084221 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: 16.4.6 - helm.sh/chart: teleport-cluster-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-cluster-16.4.7 teleport.dev/majorVersion: "16" 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 ecf6965c8b3eb..85bfe1a0b0765 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: 16.4.6 - helm.sh/chart: teleport-cluster-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-cluster-16.4.7 teleport.dev/majorVersion: "16" 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 9d5cb7258d941..9bc63e77616c5 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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 792468bc82e58..9af824de3af0b 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: 16.4.6 - helm.sh/chart: teleport-cluster-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-cluster-16.4.7 teleport.dev/majorVersion: "16" 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 dfcf64330c17a..601322f727f0f 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: 16.4.6 - helm.sh/chart: teleport-cluster-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-cluster-16.4.7 teleport.dev/majorVersion: "16" name: RELEASE-NAME-proxy namespace: NAMESPACE @@ -26,7 +26,7 @@ sets clusterDomain on Deployment Pods: template: metadata: annotations: - checksum/config: 87177e0131f696376c17d797df17be252ebdc247a7f84bb05b7a5680ebcd205c + checksum/config: 4d75a6aeb6da8681563b88b73f750f2d68b1f852c88b793da66cc72b9cd96c0f 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: 16.4.6 - helm.sh/chart: teleport-cluster-16.4.6 + app.kubernetes.io/version: 16.4.7 + helm.sh/chart: teleport-cluster-16.4.7 teleport.dev/majorVersion: "16" 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -105,7 +105,7 @@ sets clusterDomain on Deployment Pods: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.test.com - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -262,7 +262,7 @@ should set nodeSelector when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -489,7 +489,7 @@ should set resources when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -597,7 +597,7 @@ should set securityContext for initContainers when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent lifecycle: preStop: @@ -705,7 +705,7 @@ should set securityContext when set in values: - wait - no-resolve - RELEASE-NAME-auth-v15.NAMESPACE.svc.cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 name: wait-auth-update securityContext: allowPrivilegeEscalation: false diff --git a/examples/chart/teleport-cluster/tests/predeploy_test.yaml b/examples/chart/teleport-cluster/tests/predeploy_test.yaml index 50a1bdb5f6ff3..c9de357957901 100644 --- a/examples/chart/teleport-cluster/tests/predeploy_test.yaml +++ b/examples/chart/teleport-cluster/tests/predeploy_test.yaml @@ -188,3 +188,43 @@ tests: - equal: path: metadata.labels.baz value: overridden + + - it: should use default serviceAccount name for auth predeploy job SA when not set in values + template: auth/predeploy_job.yaml + set: + clusterName: helm-lint + asserts: + - equal: + path: spec.template.spec.serviceAccountName + value: RELEASE-NAME + + - it: should use serviceAccount.name for auth predeploy job SA when set in values + template: auth/predeploy_job.yaml + set: + clusterName: helm-lint + serviceAccount: + name: helm-test-sa + asserts: + - equal: + path: spec.template.spec.serviceAccountName + value: helm-test-sa + + - it: should use default serviceAccount name for proxy predeploy job SA when not set in values + template: proxy/predeploy_job.yaml + set: + clusterName: helm-lint + asserts: + - equal: + path: spec.template.spec.serviceAccountName + value: RELEASE-NAME-proxy + + - it: should use serviceAccount.name for proxy predeploy job SA when set in values + template: proxy/predeploy_job.yaml + set: + clusterName: helm-lint + serviceAccount: + name: helm-test-sa + asserts: + - equal: + path: spec.template.spec.serviceAccountName + value: helm-test-sa-proxy diff --git a/examples/chart/teleport-kube-agent/Chart.yaml b/examples/chart/teleport-kube-agent/Chart.yaml index dfde28b61027a..e4f4455f8640b 100644 --- a/examples/chart/teleport-kube-agent/Chart.yaml +++ b/examples/chart/teleport-kube-agent/Chart.yaml @@ -1,4 +1,4 @@ -.version: &version "16.4.6" +.version: &version "16.4.7" 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 f5e31039e76c1..16a65b7023c3c 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -109,7 +109,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -173,7 +173,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -237,7 +237,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -322,7 +322,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -387,7 +387,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -451,7 +451,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -513,7 +513,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -589,7 +589,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -665,7 +665,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -729,7 +729,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -793,7 +793,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -862,7 +862,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf an value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -932,7 +932,7 @@ should mount jamfCredentialsSecret.name when role is jamf and action is Upgrade: value: "true" - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1004,7 +1004,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1078,7 +1078,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1148,7 +1148,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1270,7 +1270,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1334,7 +1334,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1411,7 +1411,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1539,7 +1539,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -1603,7 +1603,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1669,7 +1669,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1809,7 +1809,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1874,7 +1874,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1948,7 +1948,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2012,7 +2012,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2083,7 +2083,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2147,7 +2147,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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 42fcb3b5daff5..736c581842208 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -108,7 +108,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -138,7 +138,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -168,7 +168,7 @@ should set nodeSelector in post-delete hook: fieldPath: metadata.namespace - name: RELEASE_NAME value: RELEASE-NAME - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent name: post-delete-job securityContext: @@ -200,7 +200,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent name: post-delete-job resources: 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 dc8114993ae9e..08959806aee10 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -90,7 +90,7 @@ sets Pod labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -186,7 +186,7 @@ sets StatefulSet labels when specified: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -290,7 +290,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -362,7 +362,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -454,7 +454,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -536,7 +536,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -608,7 +608,7 @@ should expose diag port: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -680,7 +680,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -766,7 +766,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -850,7 +850,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -922,7 +922,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -994,7 +994,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1068,7 +1068,7 @@ should mount extraVolumes and extraVolumeMounts: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1145,7 +1145,7 @@ should mount jamfCredentialsSecret if it already exists and when role is jamf: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1225,7 +1225,7 @@ should mount jamfCredentialsSecret.name when role is jamf: value: RELEASE-NAME - name: TELEPORT_KUBE_CLUSTER_DOMAIN value: cluster.local - image: public.ecr.aws/gravitational/teleport-distroless:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1307,7 +1307,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1391,7 +1391,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1471,7 +1471,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1543,7 +1543,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1673,7 +1673,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1745,7 +1745,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1830,7 +1830,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -1974,7 +1974,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: Always livenessProbe: failureThreshold: 6 @@ -2046,7 +2046,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2132,7 +2132,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2204,7 +2204,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2286,7 +2286,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2358,7 +2358,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2437,7 +2437,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2509,7 +2509,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2581,7 +2581,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -2653,7 +2653,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-distroless:16.4.7 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 6dcc564ba4623..c7ea64dcbde4f 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:16.4.6 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 @@ -73,7 +73,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:16.4.6 + image: public.ecr.aws/gravitational/teleport-kube-agent-updater:16.4.7 imagePullPolicy: IfNotPresent livenessProbe: failureThreshold: 6 diff --git a/examples/chart/teleport-kube-agent/values.yaml b/examples/chart/teleport-kube-agent/values.yaml index beb0d284b1efe..0286db419342f 100644 --- a/examples/chart/teleport-kube-agent/values.yaml +++ b/examples/chart/teleport-kube-agent/values.yaml @@ -219,7 +219,7 @@ awsDatabases: [] # azureDatabases(list) -- configures Azure database auto-discovery. # -# For Azure database auto-discovery to work, your Database Service pods will need to have appropriate IAM permissions as per the [database documentation](../../enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx#step-35-configure-iam-permissions-for-teleport). +# For Azure database auto-discovery to work, your Database Service pods will need to have appropriate IAM permissions as per the [database documentation](../../enroll-resources/database-access/enroll-azure-databases/azure-postgres-mysql.mdx#step-25-configure-iam-permissions-for-teleport). # # After configuring a service principal with appropriate IAM permissions, you must pass credentials to the pods. # The easiest way is to use an Azure client secret. diff --git a/go.mod b/go.mod index 5597b1f7884fe..a44fa4b407250 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport -go 1.22.8 +go 1.22.9 require ( cloud.google.com/go/cloudsqlconn v1.9.0 diff --git a/integration/hostuser_test.go b/integration/hostuser_test.go index 242908525cdf3..2f7a741e513f5 100644 --- a/integration/hostuser_test.go +++ b/integration/hostuser_test.go @@ -583,6 +583,28 @@ func TestRootHostUsers(t *testing.T) { require.NoError(t, err) require.False(t, hasExpirations) }) + + t.Run("Test migrate unmanaged user", func(t *testing.T) { + t.Cleanup(func() { cleanupUsersAndGroups([]string{testuser}, []string{types.TeleportKeepGroup}) }) + + users := srv.NewHostUsers(context.Background(), presence, "host_uuid") + _, err := host.UserAdd(testuser, nil, host.UserOpts{}) + require.NoError(t, err) + + closer, err := users.UpsertUser(testuser, services.HostUsersInfo{Mode: services.HostUserModeKeep, Groups: []string{types.TeleportKeepGroup}}) + require.NoError(t, err) + require.Nil(t, closer) + + u, err := user.Lookup(testuser) + require.NoError(t, err) + + gids, err := u.GroupIds() + require.NoError(t, err) + + keepGroup, err := user.LookupGroup(types.TeleportKeepGroup) + require.NoError(t, err) + require.Contains(t, gids, keepGroup.Gid) + }) } type hostUsersBackendWithExp struct { diff --git a/integration/kube_integration_test.go b/integration/kube_integration_test.go index 14793b1b399e5..27ad39e51a13a 100644 --- a/integration/kube_integration_test.go +++ b/integration/kube_integration_test.go @@ -793,7 +793,7 @@ func testKubeTrustedClustersClientCert(t *testing.T, suite *KubeSuite) { loop: for { select { - case event := <-main.UploadEventsC: + case event := <-aux.UploadEventsC: sessionID = event.SessionID break loop case <-timeoutC: @@ -802,7 +802,7 @@ loop: } // read back the entire session and verify that it matches the stated output - capturedStream, err := main.Process.GetAuthServer().GetSessionChunk(apidefaults.Namespace, session.ID(sessionID), 0, events.MaxChunkBytes) + capturedStream, err := aux.Process.GetAuthServer().GetSessionChunk(apidefaults.Namespace, session.ID(sessionID), 0, events.MaxChunkBytes) require.NoError(t, err) require.Equal(t, sessionStream, string(capturedStream)) @@ -1620,7 +1620,6 @@ func waitForContainer(ctx context.Context, podClient corev1client.PodInterface, } s := getContainerStatusByName(p, containerName) - fmt.Println("test", s) if s == nil { return false, nil } diff --git a/integrations/access/email/app.go b/integrations/access/email/app.go index 67855505a032e..4e29aca01e5df 100644 --- a/integrations/access/email/app.go +++ b/integrations/access/email/app.go @@ -123,6 +123,7 @@ func (a *App) run(ctx context.Context) error { // init inits plugin func (a *App) init(ctx context.Context) error { + log := logger.Get(ctx) ctx, cancel := context.WithTimeout(ctx, initTimeout) defer cancel() @@ -146,6 +147,11 @@ func (a *App) init(ctx context.Context) error { return trace.Wrap(err) } + log.Debug("Starting client connection health check...") + if err = a.client.CheckHealth(ctx); err != nil { + return trace.Wrap(err, "client connection health check failed") + } + log.Debug("Client connection health check finished ok") return nil } diff --git a/integrations/access/email/client.go b/integrations/access/email/client.go index ce1b8cad48400..b65516962d8c4 100644 --- a/integrations/access/email/client.go +++ b/integrations/access/email/client.go @@ -59,12 +59,12 @@ func NewClient(ctx context.Context, conf Config, clusterName, webProxyAddr strin } if conf.Mailgun != nil { - mailer = NewMailgunMailer(*conf.Mailgun, conf.Delivery.Sender, clusterName) + mailer = NewMailgunMailer(*conf.Mailgun, conf.StatusSink, conf.Delivery.Sender, clusterName, conf.RoleToRecipients[types.Wildcard]) logger.Get(ctx).WithField("domain", conf.Mailgun.Domain).Info("Using Mailgun as email transport") } if conf.SMTP != nil { - mailer = NewSMTPMailer(*conf.SMTP, conf.Delivery.Sender, clusterName) + mailer = NewSMTPMailer(*conf.SMTP, conf.StatusSink, conf.Delivery.Sender, clusterName) logger.Get(ctx).WithFields(logger.Fields{ "host": conf.SMTP.Host, "port": conf.SMTP.Port, @@ -79,6 +79,11 @@ func NewClient(ctx context.Context, conf Config, clusterName, webProxyAddr strin }, nil } +// CheckHealth checks if the Email client connection is healthy. +func (c *Client) CheckHealth(ctx context.Context) error { + return trace.Wrap(c.mailer.CheckHealth(ctx)) +} + // SendNewThreads sends emails on new requests. Returns EmailData. func (c *Client) SendNewThreads(ctx context.Context, recipients []string, reqID string, reqData RequestData) ([]EmailThread, error) { var threads []EmailThread diff --git a/integrations/access/email/config.go b/integrations/access/email/config.go index 772d616a9031c..9d3967a48f75c 100644 --- a/integrations/access/email/config.go +++ b/integrations/access/email/config.go @@ -64,6 +64,10 @@ type Config struct { Delivery DeliveryConfig `toml:"delivery"` RoleToRecipients common.RawRecipientsMap `toml:"role_to_recipients"` Log logger.Config `toml:"log"` + + // StatusSink receives any status updates from the plugin for + // further processing. Status updates will be ignored if not set. + StatusSink common.StatusSink } // LoadConfig reads the config file, initializes a new Config struct object, and returns it. diff --git a/integrations/access/email/mailers.go b/integrations/access/email/mailers.go index 5f690bb70256a..17864322fbc4b 100644 --- a/integrations/access/email/mailers.go +++ b/integrations/access/email/mailers.go @@ -21,6 +21,7 @@ import ( "crypto/rand" "encoding/binary" "fmt" + "net/http" "os" "strconv" "strings" @@ -29,11 +30,25 @@ import ( "github.com/gravitational/trace" "github.com/mailgun/mailgun-go/v4" "gopkg.in/mail.v2" + + "github.com/gravitational/teleport/integrations/access/common" + "github.com/gravitational/teleport/integrations/lib/logger" +) + +const ( + // statusEmitTimeout specifies the max timeout to emit status. + statusEmitTimeout = 10 * time.Second + // mailgunHTTPTimeout specifies the max timeout for mailgun api send request. + mailgunHTTPTimeout = 10 * time.Second + // smtpDialerTimeout specifies the max timeout for smtp dialer read/write operations. + smtpDialerTimeout = 10 * time.Second ) // Mailer is an interface to mail sender type Mailer interface { Send(ctx context.Context, id, recipient, body, references string) (string, error) + // CheckHealth checks if the Email client connection is healthy. + CheckHealth(ctx context.Context) error } // SMTPMailer implements SMTP mailer @@ -41,6 +56,7 @@ type SMTPMailer struct { dialer *mail.Dialer sender string clusterName string + sink common.StatusSink } // MailgunMailer implements mailgun mailer @@ -48,23 +64,59 @@ type MailgunMailer struct { mailgun *mailgun.MailgunImpl sender string clusterName string + + // fallbackRecipients specifies the list of default recipients. + // This is only used for initial health check. + fallbackRecipients []string } // NewSMTPMailer inits new SMTP mailer -func NewSMTPMailer(c SMTPConfig, sender, clusterName string) Mailer { +func NewSMTPMailer(c SMTPConfig, sink common.StatusSink, sender, clusterName string) Mailer { dialer := mail.NewDialer(c.Host, c.Port, c.Username, c.Password) dialer.StartTLSPolicy = c.MailStartTLSPolicy + dialer.Timeout = smtpDialerTimeout - return &SMTPMailer{dialer, sender, clusterName} + return &SMTPMailer{ + dialer: dialer, + sender: sender, + clusterName: clusterName, + sink: sink, + } } // NewMailgunMailer inits new Mailgun mailer -func NewMailgunMailer(c MailgunConfig, sender, clusterName string) Mailer { +func NewMailgunMailer(c MailgunConfig, sink common.StatusSink, sender, clusterName string, fallbackRecipients []string) Mailer { m := mailgun.NewMailgun(c.Domain, c.PrivateKey) if c.APIBase != "" { m.SetAPIBase(c.APIBase) } - return &MailgunMailer{m, sender, clusterName} + client := &http.Client{ + Transport: &statusSinkTransport{ + RoundTripper: http.DefaultTransport, + sink: sink, + }, + } + m.SetClient(client) + return &MailgunMailer{ + mailgun: m, + sender: sender, + clusterName: clusterName, + fallbackRecipients: fallbackRecipients, + } +} + +// CheckHealth checks the health of the SMTP service. +func (m *SMTPMailer) CheckHealth(ctx context.Context) error { + log := logger.Get(ctx) + client, err := m.dialer.Dial() + m.emitStatus(ctx, err) + if err != nil { + return trace.Wrap(err) + } + if err := client.Close(); err != nil { + log.Debug("Failed to close client connection after health check") + } + return nil } // Send sends email via SMTP @@ -91,10 +143,10 @@ func (m *SMTPMailer) Send(ctx context.Context, id, recipient, body, references s } err = m.dialer.DialAndSend(msg) + m.emitStatus(ctx, err) if err != nil { return "", trace.Wrap(err) } - return id, nil } @@ -123,6 +175,38 @@ func (m *SMTPMailer) base36(input uint64) string { return strings.ToUpper(strconv.FormatUint(input, 36)) } +// emitStatus emits status based on provided statusErr. +func (m *SMTPMailer) emitStatus(ctx context.Context, statusErr error) { + if m.sink == nil { + return + } + + ctx, cancel := context.WithTimeout(ctx, statusEmitTimeout) + defer cancel() + + log := logger.Get(ctx) + code := http.StatusOK + if statusErr != nil { + // Returned error is undocumented. Using generic error code for all errors. + code = http.StatusInternalServerError + } + if err := m.sink.Emit(ctx, common.StatusFromStatusCode(code)); err != nil { + log.WithError(err).Error("Error while emitting Email plugin status") + } +} + +// CheckHealth checks the health of the Mailgun service. +func (m *MailgunMailer) CheckHealth(ctx context.Context) error { + ctx, cancel := context.WithTimeout(ctx, mailgunHTTPTimeout) + defer cancel() + + msg := m.mailgun.NewMessage(m.sender, "Health Check", "Testing Mailgun API connection...", m.fallbackRecipients...) + msg.SetRequireTLS(true) + msg.EnableTestMode() // Test message submission without delivering to recipients. + _, _, err := m.mailgun.Send(ctx, msg) + return trace.Wrap(err) +} + // Send sends email via Mailgun func (m *MailgunMailer) Send(ctx context.Context, id, recipient, body, references string) (string, error) { subject := fmt.Sprintf("%v Role Request %v", m.clusterName, id) @@ -136,7 +220,7 @@ func (m *MailgunMailer) Send(ctx context.Context, id, recipient, body, reference msg.AddHeader("In-Reply-To", refHeader) } - ctx, cancel := context.WithTimeout(ctx, time.Second*10) + ctx, cancel := context.WithTimeout(ctx, mailgunHTTPTimeout) defer cancel() _, id, err := m.mailgun.Send(ctx, msg) @@ -147,3 +231,29 @@ func (m *MailgunMailer) Send(ctx context.Context, id, recipient, body, reference return id, nil } + +// statusSinkTransport wraps the Mailgun client transport and +// emits plugin status. +type statusSinkTransport struct { + http.RoundTripper + sink common.StatusSink +} + +// RoundTrip implements the http.RoundTripper interface. +func (t *statusSinkTransport) RoundTrip(req *http.Request) (*http.Response, error) { + log := logger.Get(req.Context()) + resp, err := t.RoundTripper.RoundTrip(req) + if err != nil { + return nil, trace.Wrap(err) + } + if t.sink != nil { + ctx, cancel := context.WithTimeout(req.Context(), statusEmitTimeout) + defer cancel() + + status := common.StatusFromStatusCode(resp.StatusCode) + if err := t.sink.Emit(ctx, status); err != nil { + log.WithError(err).Error("Error while emitting Email plugin status") + } + } + return resp, nil +} diff --git a/integrations/access/email/testlib/mock_mailgun.go b/integrations/access/email/testlib/mock_mailgun.go index 8b0a856d9bc73..58cbbc8ebb098 100644 --- a/integrations/access/email/testlib/mock_mailgun.go +++ b/integrations/access/email/testlib/mock_mailgun.go @@ -63,6 +63,13 @@ func newMockMailgunServer(concurrency int) *mockMailgunServer { id := uuid.New().String() + // The testmode flag is only used during health check. + // Do no create message when in testmode. + if r.PostFormValue("o:testmode") == "yes" { + fmt.Fprintf(w, `{"id": "%v"}`, id) + return + } + message := mockMailgunMessage{ ID: id, Sender: r.PostFormValue("from"), diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 72bb9c208a88a..66d3e5b11ef50 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/event-handler -go 1.22.8 +go 1.22.9 require ( github.com/alecthomas/kong v0.9.0 diff --git a/integrations/operator/Makefile b/integrations/operator/Makefile index f22f4e5347ec6..ca7c7c234f929 100644 --- a/integrations/operator/Makefile +++ b/integrations/operator/Makefile @@ -72,6 +72,9 @@ help: ## Display this help. ##@ Development +.PHONY: crd ## Single command to generate anything CRD-related (manifests and docs) +crd: crdgen crd-docs + .PHONY: crdgen crdgen: ## Generate CRDs make -C crdgen @@ -139,6 +142,10 @@ test: export KUBEBUILDER_ASSETS=$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p test: go test ./... -coverprofile cover.out +.PHONY: echo-kubebuilder-assets +echo-kubebuilder-assets: + @echo KUBEBUILDER_ASSETS=$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) -p path) + .PHONY: crdgen-test crdgen-test: ## Run crdgen tests. make -C crdgen test diff --git a/integrations/operator/apis/resources/v3/oidcconnector_types.go b/integrations/operator/apis/resources/v3/oidcconnector_types.go index 3eedf1d9b5264..d23f25f4fe6d6 100644 --- a/integrations/operator/apis/resources/v3/oidcconnector_types.go +++ b/integrations/operator/apis/resources/v3/oidcconnector_types.go @@ -21,6 +21,7 @@ package v3 import ( "encoding/json" + "github.com/gravitational/trace" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/gravitational/teleport/api/types" @@ -97,14 +98,49 @@ func (spec *TeleportOIDCConnectorSpec) DeepCopyInto(out *TeleportOIDCConnectorSp } } +// Custom json.Marshaller and json.Unmarshaler are here to cope with inconsistencies between our CRD and go types. +// They are invoked when the kubernetes client converts the unstructured object into a typed resource. +// We have two inconsistencies: +// - the utils.Strings typr that marshals inconsistently: single elements are strings, multiple elements are lists +// - the max_age setting which is an embedded pointer to another single-value message, which breaks JSON parsing + // MarshalJSON serializes a spec into a JSON string func (spec TeleportOIDCConnectorSpec) MarshalJSON() ([]byte, error) { type Alias TeleportOIDCConnectorSpec + + var maxAge types.Duration + if spec.MaxAge != nil { + maxAge = spec.MaxAge.Value + } + return json.Marshal(&struct { - RedirectURLs []string `json:"redirect_url"` + RedirectURLs []string `json:"redirect_url,omitempty"` + MaxAge types.Duration `json:"max_age,omitempty"` Alias }{ RedirectURLs: spec.RedirectURLs, + MaxAge: maxAge, Alias: (Alias)(spec), }) } + +// UnmarshalJSON serializes a JSON string into a spec. This override is required to deal with the +// MaxAge field which is special case because it' an object embedded into the spec. +func (spec *TeleportOIDCConnectorSpec) UnmarshalJSON(data []byte) error { + *spec = *new(TeleportOIDCConnectorSpec) + type Alias TeleportOIDCConnectorSpec + + temp := &struct { + MaxAge types.Duration `json:"max_age"` + *Alias + }{ + Alias: (*Alias)(spec), + } + if err := json.Unmarshal(data, &temp); err != nil { + return trace.Wrap(err, "unmarshalling custom teleport oidc connector spec") + } + if temp.MaxAge != 0 { + spec.MaxAge = &types.MaxAge{Value: temp.MaxAge} + } + return nil +} diff --git a/integrations/operator/apis/resources/v3/oidcconnector_types_test.go b/integrations/operator/apis/resources/v3/oidcconnector_types_test.go index c6abb53659989..5c511d5d82905 100644 --- a/integrations/operator/apis/resources/v3/oidcconnector_types_test.go +++ b/integrations/operator/apis/resources/v3/oidcconnector_types_test.go @@ -21,9 +21,11 @@ package v3 import ( "encoding/json" "testing" + "time" "github.com/stretchr/testify/require" + "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/wrappers" ) @@ -50,6 +52,11 @@ func TestTeleportOIDCConnectorSpec_MarshalJSON(t *testing.T) { TeleportOIDCConnectorSpec{RedirectURLs: wrappers.Strings{"foo", "bar"}}, `{"redirect_url":["foo","bar"],"issuer_url":"","client_id":"","client_secret":""}`, }, + { + "MaxAge", + TeleportOIDCConnectorSpec{MaxAge: &types.MaxAge{Value: types.Duration(time.Hour)}}, + `{"max_age":"1h0m0s","issuer_url":"","client_id":"","client_secret":""}`, + }, } for _, tc := range tests { tc := tc @@ -60,3 +67,39 @@ func TestTeleportOIDCConnectorSpec_MarshalJSON(t *testing.T) { }) } } +func TestTeleportOIDCConnectorSpec_UnmarshalJSON(t *testing.T) { + tests := []struct { + name string + expectedSpec TeleportOIDCConnectorSpec + inputJSON string + }{ + { + "Empty string", + TeleportOIDCConnectorSpec{RedirectURLs: wrappers.Strings{""}}, + `{"redirect_url":[""],"issuer_url":"","client_id":"","client_secret":""}`, + }, + { + "Single string", + TeleportOIDCConnectorSpec{RedirectURLs: wrappers.Strings{"foo"}}, + `{"redirect_url":["foo"],"issuer_url":"","client_id":"","client_secret":""}`, + }, + { + "Multiple strings", + TeleportOIDCConnectorSpec{RedirectURLs: wrappers.Strings{"foo", "bar"}}, + `{"redirect_url":["foo","bar"],"issuer_url":"","client_id":"","client_secret":""}`, + }, + { + "MaxAge", + TeleportOIDCConnectorSpec{MaxAge: &types.MaxAge{Value: types.Duration(time.Hour)}}, + `{"max_age":"1h0m0s","issuer_url":"","client_id":"","client_secret":""}`, + }, + } + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + var spec TeleportOIDCConnectorSpec + require.NoError(t, json.Unmarshal([]byte(tc.inputJSON), &spec)) + require.Equal(t, tc.expectedSpec, spec) + }) + } +} diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml index 7ab8f4da5929f..501e25ec12dcc 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml @@ -326,6 +326,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -852,6 +867,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -1670,6 +1700,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -2196,6 +2241,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml index a0d50c80bec2e..886b50224e63a 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml @@ -329,6 +329,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -855,6 +870,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml index ebf0a0a486337..83b59cc0ba273 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml @@ -329,6 +329,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration @@ -855,6 +870,21 @@ spec: type: string type: object type: array + kubernetes_resources: + description: 'kubernetes_resources can optionally enforce + a requester to request only certain kinds of kube resources. + Eg: Users can make request to either a resource kind "kube_cluster" + or any of its subresources like "namespaces". This field + can be defined such that it prevents a user from requesting + "kube_cluster" and enforce requesting any of its subresources.' + items: + properties: + kind: + description: kind specifies the Kubernetes Resource + type. + type: string + type: object + type: array max_duration: description: MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration diff --git a/integrations/operator/controllers/resources/oidc_connector_controller_test.go b/integrations/operator/controllers/resources/oidc_connector_controller_test.go index 35228bc8188f7..39359c2704967 100644 --- a/integrations/operator/controllers/resources/oidc_connector_controller_test.go +++ b/integrations/operator/controllers/resources/oidc_connector_controller_test.go @@ -21,6 +21,7 @@ package resources_test import ( "context" "testing" + "time" "github.com/google/go-cmp/cmp" "github.com/gravitational/trace" @@ -46,6 +47,7 @@ var oidcSpec = types.OIDCConnectorSpecV3{ Roles: []string{"roleA"}, }}, RedirectURLs: []string{"https://redirect"}, + MaxAge: &types.MaxAge{Value: types.Duration(time.Hour)}, } type oidcTestingPrimitives struct { diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index 4a1e307345f4d..3ed99da94882f 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -1,6 +1,6 @@ module github.com/gravitational/teleport/integrations/terraform -go 1.22.8 +go 1.22.9 // Doc generation tooling require github.com/hashicorp/terraform-plugin-docs v0.0.0 // replaced diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index 5c7886edaa3ba..5380b4f28181c 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -1773,6 +1773,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Description: "ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.", Optional: true, }, + "kubernetes_resources": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"kind": { + Description: "kind specifies the Kubernetes Resource type.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }}), + Description: "kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind \"kube_cluster\" or any of its subresources like \"namespaces\". This field can be defined such that it prevents a user from requesting \"kube_cluster\" and enforce requesting any of its subresources.", + Optional: true, + }, "max_duration": { Description: "MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.", Optional: true, @@ -2206,6 +2215,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Description: "ClaimsToRoles specifies a mapping from claims (traits) to teleport roles.", Optional: true, }, + "kubernetes_resources": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"kind": { + Description: "kind specifies the Kubernetes Resource type.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }}), + Description: "kubernetes_resources can optionally enforce a requester to request only certain kinds of kube resources. Eg: Users can make request to either a resource kind \"kube_cluster\" or any of its subresources like \"namespaces\". This field can be defined such that it prevents a user from requesting \"kube_cluster\" and enforce requesting any of its subresources.", + Optional: true, + }, "max_duration": { Description: "MaxDuration is the amount of time the access will be granted for. If this is zero, the default duration is used.", Optional: true, @@ -16539,6 +16557,51 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["kubernetes_resources"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.KubernetesResources = make([]github_com_gravitational_teleport_api_types.RequestKubernetesResource, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t github_com_gravitational_teleport_api_types.RequestKubernetesResource + if !v.Null && !v.Unknown { + tf := v + obj := &t + { + a, ok := tf.Attrs["kind"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources.kind"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources.kind", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Kind = t + } + } + } + } + obj.KubernetesResources[k] = t + } + } + } + } + } + } } } } @@ -18346,6 +18409,51 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["kubernetes_resources"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.KubernetesResources = make([]github_com_gravitational_teleport_api_types.RequestKubernetesResource, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t github_com_gravitational_teleport_api_types.RequestKubernetesResource + if !v.Null && !v.Unknown { + tf := v + obj := &t + { + a, ok := tf.Attrs["kind"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources.kind"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources.kind", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Kind = t + } + } + } + } + obj.KubernetesResources[k] = t + } + } + } + } + } + } } } } @@ -21706,6 +21814,84 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["max_duration"] = v } } + { + a, ok := tf.AttrTypes["kubernetes_resources"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["kubernetes_resources"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.KubernetesResources)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.KubernetesResources)) + } + } + if obj.KubernetesResources != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.KubernetesResources) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.KubernetesResources)) + } + for k, a := range obj.KubernetesResources { + v, ok := tf.Attrs["kubernetes_resources"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + { + obj := a + tf := &v + { + t, ok := tf.AttrTypes["kind"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources.kind"}) + } else { + v, ok := tf.Attrs["kind"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Allow.Request.kubernetes_resources.kind", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.Request.kubernetes_resources.kind", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Kind) == "" + } + v.Value = string(obj.Kind) + v.Unknown = false + tf.Attrs["kind"] = v + } + } + } + v.Unknown = false + c.Elems[k] = v + } + if len(obj.KubernetesResources) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["kubernetes_resources"] = c + } + } + } } v.Unknown = false tf.Attrs["request"] = v @@ -24872,6 +25058,84 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["max_duration"] = v } } + { + a, ok := tf.AttrTypes["kubernetes_resources"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["kubernetes_resources"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.KubernetesResources)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.KubernetesResources)) + } + } + if obj.KubernetesResources != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.KubernetesResources) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.KubernetesResources)) + } + for k, a := range obj.KubernetesResources { + v, ok := tf.Attrs["kubernetes_resources"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + { + obj := a + tf := &v + { + t, ok := tf.AttrTypes["kind"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources.kind"}) + } else { + v, ok := tf.Attrs["kind"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Deny.Request.kubernetes_resources.kind", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.Request.kubernetes_resources.kind", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Kind) == "" + } + v.Value = string(obj.Kind) + v.Unknown = false + tf.Attrs["kind"] = v + } + } + } + v.Unknown = false + c.Elems[k] = v + } + if len(obj.KubernetesResources) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["kubernetes_resources"] = c + } + } + } } v.Unknown = false tf.Attrs["request"] = v diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 05ec154ab725a..7138e6e150750 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -379,7 +379,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { if !modules.GetModules().Features().GetEntitlement(entitlements.HSM).Enabled { return nil, fmt.Errorf("Google Cloud KMS support requires a license with the HSM feature enabled: %w", ErrRequiresEnterprise) } - } else if cfg.KeyStoreConfig.AWSKMS != (servicecfg.AWSKMSConfig{}) { + } else if cfg.KeyStoreConfig.AWSKMS != nil { if !modules.GetModules().Features().GetEntitlement(entitlements.HSM).Enabled { return nil, fmt.Errorf("AWS KMS support requires a license with the HSM feature enabled: %w", ErrRequiresEnterprise) } @@ -1930,13 +1930,20 @@ func (a *Server) GetClusterID(ctx context.Context, opts ...services.MarshalOptio } // GetAnonymizationKey returns the anonymization key that identifies this client. -// It falls back to the cluster ID if the anonymization key is not set in license file. +// The anonymization key may be any of the following, in order of precedence: +// - (Teleport Cloud) a key provided by the Teleport Cloud API +// - a key embedded in the license file +// - the cluster's UUID func (a *Server) GetAnonymizationKey(ctx context.Context, opts ...services.MarshalOption) (string, error) { - if a.license == nil || len(a.license.AnonymizationKey) == 0 { - return a.GetClusterID(ctx, opts...) + if key := modules.GetModules().Features().CloudAnonymizationKey; len(key) > 0 { + return string(key), nil } - return string(a.license.AnonymizationKey), nil + if a.license != nil && len(a.license.AnonymizationKey) > 0 { + return string(a.license.AnonymizationKey), nil + } + id, err := a.GetClusterID(ctx, opts...) + return id, trace.Wrap(err) } // GetDomainName returns the domain name that identifies this authority server. diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index c86ffb32c12f5..f3953f691f2d1 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -4188,3 +4188,65 @@ func TestAccessRequestNotifications(t *testing.T) { require.Len(t, userNotifsResp, 2) require.Contains(t, userNotifsResp[1].GetMetadata().GetLabels()[types.NotificationTitleLabel], "reviewer denied your access request") } + +func TestServer_GetAnonymizationKey(t *testing.T) { + tests := []struct { + name string + testModules *modules.TestModules + license *license.License + want string + errCheck require.ErrorAssertionFunc + }{ + { + name: "returns CloudAnonymizationKey if present", + testModules: &modules.TestModules{ + TestFeatures: modules.Features{CloudAnonymizationKey: []byte("cloud-key")}, + }, + license: &license.License{ + AnonymizationKey: []byte("license-key"), + }, + want: "cloud-key", + errCheck: require.NoError, + }, + { + name: "Returns license AnonymizationKey if no Cloud Key is present", + testModules: &modules.TestModules{}, + license: &license.License{ + AnonymizationKey: []byte("license-key"), + }, + want: "license-key", + errCheck: require.NoError, + }, + { + name: "Returns clusterID if no cloud key nor license key is present", + testModules: &modules.TestModules{}, + license: &license.License{}, + want: "cluster-id", + errCheck: require.NoError, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + testAuthServer, err := NewTestAuthServer(TestAuthServerConfig{ + Dir: t.TempDir(), + Clock: clockwork.NewFakeClock(), + ClusterID: "cluster-id", + }) + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, testAuthServer.Close()) }) + + testTLSServer, err := testAuthServer.NewTestTLSServer() + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, testTLSServer.Close()) }) + + modules.SetTestModules(t, tt.testModules) + + testTLSServer.AuthServer.AuthServer.SetLicense(tt.license) + + got, err := testTLSServer.AuthServer.AuthServer.GetAnonymizationKey(context.Background()) + tt.errCheck(t, err) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index aab4709018164..576cc24b06c61 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -3773,7 +3773,7 @@ func (a *ServerWithRoles) CreateSAMLConnector(ctx context.Context, connector typ return nil, trace.Wrap(err) } - if err := a.context.AuthorizeAdminAction(); err != nil { + if err := a.context.AuthorizeAdminActionAllowReusedMFA(); err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/client_tls_config_generator.go b/lib/auth/client_tls_config_generator.go index 61cd6c4707eac..082abcca7656b 100644 --- a/lib/auth/client_tls_config_generator.go +++ b/lib/auth/client_tls_config_generator.go @@ -204,10 +204,10 @@ func (c *ClientTLSConfigGenerator) refreshClientTLSConfigs(ctx context.Context) } } -// watchForCAChanges sets up a cert authority watcher and triggers regeneration of client -// tls configs for a given cluster whenever a CA associated with that cluster is modified. -// note that this function errs on the side of regenerating more often than might be -// strictly necessary. +// watchForCAChanges sets up a cert authority watcher to ensure that we don't serve outdated +// tls configs. for the local cluster it aggressively triggers regeneration. for other clusters +// it invalidates extant state, allowing lazy generation on first need. this function errs on the +// side of caution and triggers regen/invalidation more often than might be strictly necessary. func (c *ClientTLSConfigGenerator) watchForCAChanges(ctx context.Context) error { watcher, err := c.cfg.AccessPoint.NewWatcher(ctx, types.Watch{ Name: "client-tls-config-generator", @@ -247,8 +247,14 @@ func (c *ClientTLSConfigGenerator) watchForCAChanges(ctx context.Context) error // ignore non-local cluster CA events when we aren't configured to support them continue } - // trigger regen of client tls configs for the associated cluster. - c.clientTLSConfigs.Generate(event.Resource.GetName()) + + if event.Resource.GetName() == c.cfg.ClusterName { + // actively regenerate on modifications associated with the local cluster + c.clientTLSConfigs.Generate(event.Resource.GetName()) + } else { + // clear extant state on modifications associated with non-local clusters + c.clientTLSConfigs.Terminate(event.Resource.GetName()) + } } case <-ctx.Done(): return nil diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 05a194278bf48..22bc3b221e1fd 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -67,6 +67,8 @@ import ( type TestAuthServerConfig struct { // ClusterName is cluster name ClusterName string + // ClusterID is the cluster ID; optional - sets to random UUID string if not present + ClusterID string // Dir is directory for local backend Dir string // AcceptedUsage is an optional list of restricted @@ -276,6 +278,7 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ ClusterName: cfg.ClusterName, + ClusterID: cfg.ClusterID, }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/auth/integration/integrationv1/awsoidc.go b/lib/auth/integration/integrationv1/awsoidc.go index bdc7e7da08b40..17d19797000c7 100644 --- a/lib/auth/integration/integrationv1/awsoidc.go +++ b/lib/auth/integration/integrationv1/awsoidc.go @@ -692,15 +692,7 @@ func (s *AWSOIDCService) ListEKSClusters(ctx context.Context, req *integrationpb clustersList := make([]*integrationpb.EKSCluster, 0, len(listEKSClustersResp.Clusters)) for _, cluster := range listEKSClustersResp.Clusters { - clusterPb := &integrationpb.EKSCluster{ - Name: cluster.Name, - Region: cluster.Region, - Arn: cluster.Arn, - Labels: cluster.Labels, - JoinLabels: cluster.JoinLabels, - Status: cluster.Status, - } - clustersList = append(clustersList, clusterPb) + clustersList = append(clustersList, convertEKSCluster(cluster)) } return &integrationpb.ListEKSClustersResponse{ @@ -709,6 +701,19 @@ func (s *AWSOIDCService) ListEKSClusters(ctx context.Context, req *integrationpb }, nil } +func convertEKSCluster(clusterService awsoidc.EKSCluster) *integrationpb.EKSCluster { + return &integrationpb.EKSCluster{ + Name: clusterService.Name, + Region: clusterService.Region, + Arn: clusterService.Arn, + Labels: clusterService.Labels, + JoinLabels: clusterService.JoinLabels, + Status: clusterService.Status, + EndpointPublicAccess: clusterService.EndpointPublicAccess, + AuthenticationMode: clusterService.AuthenticationMode, + } +} + // ListSubnets returns a list of AWS VPC subnets. func (s *AWSOIDCService) ListSubnets(ctx context.Context, req *integrationpb.ListSubnetsRequest) (*integrationpb.ListSubnetsResponse, error) { authCtx, err := s.authorizer.Authorize(ctx) diff --git a/lib/auth/integration/integrationv1/awsoidc_test.go b/lib/auth/integration/integrationv1/awsoidc_test.go index b247b6c5c7e15..d490b0f931022 100644 --- a/lib/auth/integration/integrationv1/awsoidc_test.go +++ b/lib/auth/integration/integrationv1/awsoidc_test.go @@ -449,3 +449,39 @@ func TestRBAC(t *testing.T) { } }) } + +func TestConvertEKSCluster(t *testing.T) { + for _, tt := range []struct { + name string + input awsoidc.EKSCluster + expected *integrationv1.EKSCluster + }{ + { + name: "valid", + input: awsoidc.EKSCluster{ + Name: "my-cluster", + Region: "us-east-1", + Arn: "my-arn", + Labels: map[string]string{}, + JoinLabels: map[string]string{}, + Status: "ACTIVE", + AuthenticationMode: "API", + EndpointPublicAccess: true, + }, + expected: &integrationv1.EKSCluster{ + Name: "my-cluster", + Region: "us-east-1", + Arn: "my-arn", + Labels: map[string]string{}, + JoinLabels: map[string]string{}, + Status: "ACTIVE", + AuthenticationMode: "API", + EndpointPublicAccess: true, + }, + }, + } { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.expected, convertEKSCluster(tt.input)) + }) + } +} diff --git a/lib/auth/keystore/aws_kms.go b/lib/auth/keystore/aws_kms.go index 19d52069b0ea8..d8726b1ae0e48 100644 --- a/lib/auth/keystore/aws_kms.go +++ b/lib/auth/keystore/aws_kms.go @@ -64,10 +64,10 @@ type CloudClientProvider interface { type awsKMSKeystore struct { kms kmsiface.KMSAPI - clusterName types.ClusterName awsAccount string awsRegion string multiRegionEnabled bool + tags map[string]string clock clockwork.Clock logger *slog.Logger } @@ -89,14 +89,23 @@ func newAWSKMSKeystore(ctx context.Context, cfg *servicecfg.AWSKMSConfig, opts * if err != nil { return nil, trace.Wrap(err) } + + tags := cfg.Tags + if tags == nil { + tags = make(map[string]string, 1) + } + if _, ok := tags[clusterTagKey]; !ok { + tags[clusterTagKey] = opts.ClusterName.GetClusterName() + } + clock := opts.clockworkOverride if clock == nil { clock = clockwork.NewRealClock() } return &awsKMSKeystore{ - clusterName: opts.ClusterName, awsAccount: cfg.AWSAccount, awsRegion: cfg.AWSRegion, + tags: tags, multiRegionEnabled: cfg.MultiRegion.Enabled, kms: kmsClient, clock: clock, @@ -117,16 +126,18 @@ func (a *awsKMSKeystore) keyTypeDescription() string { // generateRSA creates a new RSA private key and returns its identifier and a crypto.Signer. The returned // identifier can be passed to getSigner later to get an equivalent crypto.Signer. func (a *awsKMSKeystore) generateRSA(ctx context.Context, _ ...rsaKeyOption) ([]byte, crypto.Signer, error) { + tags := make([]*kms.Tag, 0, len(a.tags)) + for k, v := range a.tags { + tags = append(tags, &kms.Tag{ + TagKey: aws.String(k), + TagValue: aws.String(v), + }) + } output, err := a.kms.CreateKey(&kms.CreateKeyInput{ Description: aws.String("Teleport CA key"), KeySpec: aws.String("RSA_2048"), KeyUsage: aws.String("SIGN_VERIFY"), - Tags: []*kms.Tag{ - { - TagKey: aws.String(clusterTagKey), - TagValue: aws.String(a.clusterName.GetClusterName()), - }, - }, + Tags: tags, MultiRegion: aws.Bool(a.multiRegionEnabled), }) if err != nil { @@ -351,11 +362,14 @@ func (a *awsKMSKeystore) deleteUnusedKeys(ctx context.Context, activeKeys [][]by } return trace.Wrap(err, "failed to fetch tags for AWS KMS key %q", keyARN) } - if !slices.ContainsFunc(output.Tags, func(tag *kms.Tag) bool { - return aws.StringValue(tag.TagKey) == clusterTagKey && aws.StringValue(tag.TagValue) == a.clusterName.GetClusterName() - }) { - // This key was not created by this Teleport cluster, never delete it. - return nil + + // All tags must match for this key to be considered for deletion. + for k, v := range a.tags { + if !slices.ContainsFunc(output.Tags, func(tag *kms.Tag) bool { + return aws.StringValue(tag.TagKey) == k && aws.StringValue(tag.TagValue) == v + }) { + return nil + } } // Check if this key is not enabled or was created in the past 5 minutes. diff --git a/lib/auth/keystore/aws_kms_test.go b/lib/auth/keystore/aws_kms_test.go index 95fbc1ac3d9b2..abce572a8bb04 100644 --- a/lib/auth/keystore/aws_kms_test.go +++ b/lib/auth/keystore/aws_kms_test.go @@ -56,80 +56,113 @@ func TestAWSKMS_DeleteUnusedKeys(t *testing.T) { ctx := context.Background() clock := clockwork.NewFakeClock() - const pageSize int = 4 - fakeKMS := newFakeAWSKMSService(t, clock, "123456789012", "us-west-2", pageSize) - cfg := servicecfg.KeystoreConfig{ - AWSKMS: servicecfg.AWSKMSConfig{ - AWSAccount: "123456789012", - AWSRegion: "us-west-2", + for _, tc := range []struct { + name string + tags map[string]string + }{ + { + name: "delete keys with default tags", }, - } - clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ClusterName: "test-cluster"}) - require.NoError(t, err) - opts := &Options{ - ClusterName: clusterName, - HostUUID: "uuid", - CloudClients: &cloud.TestCloudClients{ - KMS: fakeKMS, - STS: &fakeAWSSTSClient{ - account: "123456789012", + { + name: "delete keys with custom tags", + tags: map[string]string{ + "test-key-1": "test-value-1", }, }, - clockworkOverride: clock, - } - keyStore, err := NewManager(ctx, &cfg, opts) - require.NoError(t, err) + { + name: "delete keys with override cluster tag", + tags: map[string]string{ + "TeleportCluster": "test-cluster-2", + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { + const pageSize int = 4 + fakeKMS := newFakeAWSKMSService(t, clock, "123456789012", "us-west-2", pageSize) + cfg := servicecfg.KeystoreConfig{ + AWSKMS: &servicecfg.AWSKMSConfig{ + AWSAccount: "123456789012", + AWSRegion: "us-west-2", + Tags: tc.tags, + }, + } + clusterName, err := services.NewClusterNameWithRandomID(types.ClusterNameSpecV2{ClusterName: "test-cluster"}) + require.NoError(t, err) + opts := &Options{ + ClusterName: clusterName, + HostUUID: "uuid", + CloudClients: &cloud.TestCloudClients{ + KMS: fakeKMS, + STS: &fakeAWSSTSClient{ + account: "123456789012", + }, + }, + clockworkOverride: clock, + } + keyStore, err := NewManager(ctx, &cfg, opts) + require.NoError(t, err) - totalKeys := pageSize * 3 - for i := 0; i < totalKeys; i++ { - _, err := keyStore.NewSSHKeyPair(ctx) - require.NoError(t, err) - } + var otherTags []*kms.Tag + for k, v := range keyStore.backendForNewKeys.(*awsKMSKeystore).tags { + if k != clusterTagKey { + otherTags = append(otherTags, &kms.Tag{ + TagKey: aws.String(k), + TagValue: aws.String(v), + }) + } + } - // Newly created keys should not be deleted. - err = keyStore.DeleteUnusedKeys(ctx, nil /*activeKeys*/) - require.NoError(t, err) - for _, key := range fakeKMS.keys { - assert.Equal(t, "Enabled", key.state) - } + totalKeys := pageSize * 3 + for i := 0; i < totalKeys; i++ { + _, err := keyStore.NewSSHKeyPair(ctx) + require.NoError(t, err, trace.DebugReport(err)) + } - // Keys created more than 5 minutes ago should be deleted. - clock.Advance(6 * time.Minute) - err = keyStore.DeleteUnusedKeys(ctx, nil /*activeKeys*/) - require.NoError(t, err) - for _, key := range fakeKMS.keys { - assert.Equal(t, "PendingDeletion", key.state) - } + // Newly created keys should not be deleted. + err = keyStore.DeleteUnusedKeys(ctx, nil /*activeKeys*/) + require.NoError(t, err) + for _, key := range fakeKMS.keys { + assert.Equal(t, kms.KeyStateEnabled, key.state) + } - // Insert a key created by a different Teleport cluster, it should not be - // deleted by the keystore. - output, err := fakeKMS.CreateKey(&kms.CreateKeyInput{ - Tags: []*kms.Tag{ - &kms.Tag{ - TagKey: aws.String(clusterTagKey), - TagValue: aws.String("other-cluster"), - }, - }, - }) - require.NoError(t, err) - otherClusterKeyARN := aws.StringValue(output.KeyMetadata.Arn) + // Keys created more than 5 minutes ago should be deleted. + clock.Advance(6 * time.Minute) + err = keyStore.DeleteUnusedKeys(ctx, nil /*activeKeys*/) + require.NoError(t, err) + for _, key := range fakeKMS.keys { + assert.Equal(t, kms.KeyStatePendingDeletion, key.state) + } - clock.Advance(6 * time.Minute) - err = keyStore.DeleteUnusedKeys(ctx, nil /*activeKeys*/) - require.NoError(t, err) - for _, key := range fakeKMS.keys { - if key.arn == otherClusterKeyARN { - assert.Equal(t, "Enabled", key.state) - } else { - assert.Equal(t, "PendingDeletion", key.state) - } + // Insert a key created by a different Teleport cluster, it should not be + // deleted by the keystore. + output, err := fakeKMS.CreateKey(&kms.CreateKeyInput{ + KeySpec: aws.String(kms.KeySpecEccNistP256), + Tags: append(otherTags, &kms.Tag{ + TagKey: aws.String(clusterTagKey), + TagValue: aws.String("other-cluster"), + }), + }) + require.NoError(t, err) + otherClusterKeyARN := aws.StringValue(output.KeyMetadata.Arn) + + clock.Advance(6 * time.Minute) + err = keyStore.DeleteUnusedKeys(ctx, nil /*activeKeys*/) + require.NoError(t, err) + for _, key := range fakeKMS.keys { + if key.arn == otherClusterKeyARN { + assert.Equal(t, kms.KeyStateEnabled, key.state) + } else { + assert.Equal(t, kms.KeyStatePendingDeletion, key.state) + } + } + }) } } func TestAWSKMS_WrongAccount(t *testing.T) { clock := clockwork.NewFakeClock() cfg := &servicecfg.KeystoreConfig{ - AWSKMS: servicecfg.AWSKMSConfig{ + AWSKMS: &servicecfg.AWSKMSConfig{ AWSAccount: "111111111111", AWSRegion: "us-west-2", }, @@ -161,7 +194,7 @@ func TestAWSKMS_RetryWhilePending(t *testing.T) { pageLimit: 1000, } cfg := &servicecfg.KeystoreConfig{ - AWSKMS: servicecfg.AWSKMSConfig{ + AWSKMS: &servicecfg.AWSKMSConfig{ AWSAccount: "111111111111", AWSRegion: "us-west-2", }, @@ -214,13 +247,13 @@ func TestAWSKMS_RetryWhilePending(t *testing.T) { require.Error(t, err) } -// TestMultiRegionKeys asserts that a keystore created with multi-region enabled -// correctly passes this argument to the AWS client. This gives very little real -// coverage since the AWS KMS service here is faked, but at least we know the -// keystore passed the bool to the client correctly. TestBackends and -// TestManager are both able to run with a real AWS KMS client and you can -// confirm the keys are really multi-region there. -func TestMultiRegionKeys(t *testing.T) { +// TestKeyAWSKeyCreationParameters asserts that an AWS keystore created with a +// variety of parameters correctly passes these parameters to the AWS client. +// This gives very little real coverage since the AWS KMS service here is faked, +// but at least we know the keystore passed the parameters to the client correctly. +// TestBackends and TestManager are both able to run with a real AWS KMS client +// and you can confirm the keys are configured correctly there. +func TestAWSKeyCreationParameters(t *testing.T) { ctx := context.Background() clock := clockwork.NewFakeClock() @@ -240,15 +273,36 @@ func TestMultiRegionKeys(t *testing.T) { clockworkOverride: clock, } - for _, multiRegion := range []bool{false, true} { - t.Run(fmt.Sprint(multiRegion), func(t *testing.T) { + for _, tc := range []struct { + name string + multiRegion bool + tags map[string]string + }{ + { + name: "multi-region enabled with default tags", + multiRegion: true, + }, + { + name: "multi-region disabled with default tags", + multiRegion: false, + }, + { + name: "multi region disabled with custom tags", + multiRegion: false, + tags: map[string]string{ + "key": "value", + }, + }, + } { + t.Run(tc.name, func(t *testing.T) { cfg := servicecfg.KeystoreConfig{ - AWSKMS: servicecfg.AWSKMSConfig{ + AWSKMS: &servicecfg.AWSKMSConfig{ AWSAccount: "123456789012", AWSRegion: "us-west-2", MultiRegion: struct{ Enabled bool }{ - Enabled: multiRegion, + Enabled: tc.multiRegion, }, + Tags: tc.tags, }, } keyStore, err := NewManager(ctx, &cfg, opts) @@ -260,11 +314,24 @@ func TestMultiRegionKeys(t *testing.T) { keyID, err := parseAWSKMSKeyID(sshKeyPair.PrivateKey) require.NoError(t, err) - if multiRegion { + if tc.multiRegion { assert.Contains(t, keyID.arn, "mrk-") } else { assert.NotContains(t, keyID.arn, "mrk-") } + + tagsOut, err := fakeKMS.ListResourceTagsWithContext(ctx, &kms.ListResourceTagsInput{KeyId: &keyID.arn}) + require.NoError(t, err) + if len(tc.tags) == 0 { + tc.tags = map[string]string{ + "TeleportCluster": clusterName.GetClusterName(), + } + } + require.Equal(t, len(tc.tags), len(tagsOut.Tags)) + for _, tag := range tagsOut.Tags { + v := tc.tags[aws.StringValue(tag.TagKey)] + require.Equal(t, v, aws.StringValue(tag.TagValue)) + } }) } } diff --git a/lib/auth/keystore/keystore_test.go b/lib/auth/keystore/keystore_test.go index 86405cd3fc937..85610451c67b9 100644 --- a/lib/auth/keystore/keystore_test.go +++ b/lib/auth/keystore/keystore_test.go @@ -525,7 +525,7 @@ func newTestPack(ctx context.Context, t *testing.T) *testPack { if config, ok := awsKMSTestConfig(t); ok { config.AWSKMS.MultiRegion.Enabled = multiRegion - backend, err := newAWSKMSKeystore(ctx, &config.AWSKMS, opts) + backend, err := newAWSKMSKeystore(ctx, config.AWSKMS, opts) require.NoError(t, err) name := "aws_kms" if multiRegion { @@ -552,7 +552,7 @@ func newTestPack(ctx context.Context, t *testing.T) *testPack { // Always test with fake AWS client. fakeAWSKMSConfig := servicecfg.KeystoreConfig{ - AWSKMS: servicecfg.AWSKMSConfig{ + AWSKMS: &servicecfg.AWSKMSConfig{ AWSAccount: "123456789012", AWSRegion: "us-west-2", MultiRegion: struct{ Enabled bool }{ @@ -560,7 +560,7 @@ func newTestPack(ctx context.Context, t *testing.T) *testPack { }, }, } - fakeAWSKMSBackend, err := newAWSKMSKeystore(ctx, &fakeAWSKMSConfig.AWSKMS, opts) + fakeAWSKMSBackend, err := newAWSKMSKeystore(ctx, fakeAWSKMSConfig.AWSKMS, opts) require.NoError(t, err) name := "fake_aws_kms" if multiRegion { diff --git a/lib/auth/keystore/manager.go b/lib/auth/keystore/manager.go index c0c712098f935..877cd3bbc4b03 100644 --- a/lib/auth/keystore/manager.go +++ b/lib/auth/keystore/manager.go @@ -215,8 +215,8 @@ func NewManager(ctx context.Context, cfg *servicecfg.KeystoreConfig, opts *Optio } backendForNewKeys = gcpBackend usableSigningBackends = []backend{gcpBackend, softwareBackend} - case cfg.AWSKMS != (servicecfg.AWSKMSConfig{}): - awsBackend, err := newAWSKMSKeystore(ctx, &cfg.AWSKMS, opts) + case cfg.AWSKMS != nil: + awsBackend, err := newAWSKMSKeystore(ctx, cfg.AWSKMS, opts) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/keystore/testhelpers.go b/lib/auth/keystore/testhelpers.go index 6c8e113a9af21..f88588548af7e 100644 --- a/lib/auth/keystore/testhelpers.go +++ b/lib/auth/keystore/testhelpers.go @@ -95,7 +95,7 @@ func awsKMSTestConfig(t *testing.T) (servicecfg.KeystoreConfig, bool) { return servicecfg.KeystoreConfig{}, false } return servicecfg.KeystoreConfig{ - AWSKMS: servicecfg.AWSKMSConfig{ + AWSKMS: &servicecfg.AWSKMSConfig{ AWSAccount: awsKMSAccount, AWSRegion: awsKMSRegion, }, diff --git a/lib/auth/native/boring.go b/lib/auth/native/boring.go new file mode 100644 index 0000000000000..0c4a8dfc30ede --- /dev/null +++ b/lib/auth/native/boring.go @@ -0,0 +1,32 @@ +// 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 . + +//go:build boringcrypto + +package native + +import "crypto/boring" + +// IsBoringBinary checks if the binary was compiled with BoringCrypto. +// +// It's possible to enable the boringcrypto GOEXPERIMENT (which will enable the +// boringcrypto build tag) even on platforms that don't support the boringcrypto +// module, which results in crypto packages being available and working, but not +// actually using a certified cryptographic module, so we have to check +// [boring.Enabled] even if this is compiled in. +func IsBoringBinary() bool { + return boring.Enabled() +} diff --git a/lib/auth/native/native.go b/lib/auth/native/native.go index f3b84d45de69a..6e1543cabc7ee 100644 --- a/lib/auth/native/native.go +++ b/lib/auth/native/native.go @@ -22,10 +22,8 @@ import ( "crypto/ed25519" "crypto/rand" "crypto/rsa" - "crypto/sha256" "crypto/x509" "encoding/pem" - "reflect" "sync" "testing" "time" @@ -48,15 +46,6 @@ var precomputedKeys = make(chan *rsa.PrivateKey, 25) // startPrecomputeOnce is used to start the background task that precomputes key pairs. var startPrecomputeOnce sync.Once -// IsBoringBinary checks if the binary was compiled with BoringCrypto. -func IsBoringBinary() bool { - // Check the package name for one of the boring primitives, if the package - // path is from BoringCrypto, we know this binary was compiled against the - // dev.boringcrypto branch of Go. - hash := sha256.New() - return reflect.TypeOf(hash).Elem().PkgPath() == "crypto/internal/boring" -} - // GenerateKeyPair generates a new RSA key pair. func GenerateKeyPair() ([]byte, []byte, error) { priv, err := GeneratePrivateKey() diff --git a/lib/auth/native/notboring.go b/lib/auth/native/notboring.go new file mode 100644 index 0000000000000..3fa57fb55e5cb --- /dev/null +++ b/lib/auth/native/notboring.go @@ -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 . + +//go:build !boringcrypto + +package native + +// IsBoringBinary checks if the binary was compiled with BoringCrypto. +// +// The boringcrypto GOEXPERIMENT always sets the boringcrypto build tag, so if +// this is compiled in, we're not using BoringCrypto. +func IsBoringBinary() bool { + return false +} diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index 78bbab730437f..294e1104373cc 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -554,7 +554,17 @@ func (a *Server) CreateAppSessionFromReq(ctx context.Context, req NewAppSessionR log.Debugf("Generated application web session for %v with TTL %v.", req.User, req.SessionTTL) UserLoginCount.Inc() - userMetadata := req.Identity.GetUserMetadata() + // Extract the identity of the user from the certificate, this will include metadata from any actively assumed access requests. + certificate, err := tlsca.ParseCertificatePEM(session.GetTLSCert()) + if err != nil { + return nil, trace.Wrap(err) + } + identity, err := tlsca.FromSubject(certificate.Subject, certificate.NotAfter) + if err != nil { + return nil, trace.Wrap(err) + } + + userMetadata := identity.GetUserMetadata() userMetadata.User = session.GetUser() userMetadata.AWSRoleARN = req.AWSRoleARN diff --git a/lib/auth/trustedcluster.go b/lib/auth/trustedcluster.go index 4bbf2cf61cb4e..6132d7f15ed34 100644 --- a/lib/auth/trustedcluster.go +++ b/lib/auth/trustedcluster.go @@ -55,13 +55,15 @@ func (a *Server) UpsertTrustedCluster(ctx context.Context, tc types.TrustedClust // It is recommended to omit trusted cluster name because the trusted cluster name // is updated to the roots cluster name during the handshake with the root cluster. var existingCluster types.TrustedCluster - var cas []types.CertAuthority if tc.GetName() != "" { - var err error - existingCluster, err = a.GetTrustedCluster(ctx, tc.GetName()) + ec, err := a.GetTrustedCluster(ctx, tc.GetName()) if err != nil && !trace.IsNotFound(err) { return nil, trace.Wrap(err) } + + if err == nil { + existingCluster = ec + } } // if there is no existing cluster, switch to the create case diff --git a/lib/auth/webauthncli/fido2.go b/lib/auth/webauthncli/fido2.go index d3030ca211529..a20b714fc2fcb 100644 --- a/lib/auth/webauthncli/fido2.go +++ b/lib/auth/webauthncli/fido2.go @@ -25,6 +25,7 @@ import ( "context" "crypto/sha256" "encoding/base64" + "encoding/hex" "encoding/json" "errors" "fmt" @@ -220,7 +221,7 @@ func fido2Login( if uv { opts.UV = libfido2.True } - assertions, err := dev.Assertion(actualRPID, ccdHash[:], allowedCreds, pin, opts) + assertions, err := devAssertion(dev, info, actualRPID, ccdHash[:], allowedCreds, pin, opts) if errors.Is(err, libfido2.ErrUnsupportedOption) && uv && pin != "" { // Try again if we are getting "unsupported option" and the PIN is set. // Happens inconsistently in some authenticator series (YubiKey 5). @@ -228,7 +229,7 @@ func fido2Login( // authenticator will set the UV bit regardless of it being requested. log.Debugf("FIDO2: Device %v: retrying assertion without UV", info.path) opts.UV = libfido2.Default - assertions, err = dev.Assertion(actualRPID, ccdHash[:], allowedCreds, pin, opts) + assertions, err = devAssertion(dev, info, actualRPID, ccdHash[:], allowedCreds, pin, opts) } if errors.Is(err, libfido2.ErrNoCredentials) { // U2F devices error instantly with ErrNoCredentials. @@ -312,13 +313,75 @@ func usesAppID(dev FIDODevice, info *deviceInfo, ccdHash []byte, allowedCreds [] isRegistered := func(id string) bool { const pin = "" // Not necessary here. - _, err := dev.Assertion(id, ccdHash, allowedCreds, pin, opts) + _, err := devAssertion(dev, info, id, ccdHash, allowedCreds, pin, opts) return err == nil || (!info.fido2 && errors.Is(err, libfido2.ErrUserPresenceRequired)) } return isRegistered(appID) && !isRegistered(rpID) } +func devAssertion( + dev FIDODevice, + info *deviceInfo, + rpID string, + ccdHash []byte, + allowedCreds [][]byte, + pin string, + opts *libfido2.AssertionOpts, +) ([]*libfido2.Assertion, error) { + // Handle U2F devices separately when there is more than one allowed + // credential. + // This avoids "internal errors" on older Yubikey models (eg, FIDO U2F + // Security Key firmware 4.1.8). + if !info.fido2 && len(allowedCreds) > 1 { + cred, ok := findFirstKnownCredential(dev, info, rpID, ccdHash, allowedCreds) + if ok { + isCredentialCheck := pin == "" && opts != nil && opts.UP == libfido2.False + if isCredentialCheck { + // No need to assert again, reply as the U2F authenticator would. + return nil, trace.Wrap(libfido2.ErrUserPresenceRequired) + } + + if log.IsLevelEnabled(log.DebugLevel) { + credPrefix := hex.EncodeToString(cred) + const prefixLen = 10 + if len(credPrefix) > prefixLen { + credPrefix = credPrefix[:prefixLen] + } + log.Debugf("FIDO2: Device %v: Using credential %v...", info.path, credPrefix) + } + + allowedCreds = [][]byte{cred} + } + } + + assertion, err := dev.Assertion(rpID, ccdHash, allowedCreds, pin, opts) + return assertion, trace.Wrap(err) +} + +func findFirstKnownCredential( + dev FIDODevice, + info *deviceInfo, + rpID string, + ccdHash []byte, + allowedCreds [][]byte, +) ([]byte, bool) { + const pin = "" + opts := &libfido2.AssertionOpts{ + UP: libfido2.False, + } + for _, cred := range allowedCreds { + _, err := dev.Assertion(rpID, ccdHash, [][]byte{cred}, pin, opts) + // FIDO2 devices return err=nil on up=false queries; U2F devices return + // libfido2.ErrUserPresenceRequired. + // https://github.com/Yubico/libfido2/blob/03c18d396eb209a42bbf62f5f4415203cba2fc50/src/u2f.c#L787-L791. + if err == nil || (!info.fido2 && errors.Is(err, libfido2.ErrUserPresenceRequired)) { + return cred, true + } + } + return nil, false +} + func pickAssertion( assertions []*libfido2.Assertion, prompt LoginPrompt, user string, passwordless bool, ) (*libfido2.Assertion, error) { @@ -452,7 +515,7 @@ func fido2Register( // Does the device hold an excluded credential? const pin = "" // not required to filter - switch _, err := dev.Assertion(rp.ID, ccdHash[:], excludeList, pin, &libfido2.AssertionOpts{ + switch _, err := devAssertion(dev, info, rp.ID, ccdHash[:], excludeList, pin, &libfido2.AssertionOpts{ UP: libfido2.False, }); { case errors.Is(err, libfido2.ErrNoCredentials): diff --git a/lib/auth/webauthncli/fido2_test.go b/lib/auth/webauthncli/fido2_test.go index 0e4486ab85db3..e1fc0890981d5 100644 --- a/lib/auth/webauthncli/fido2_test.go +++ b/lib/auth/webauthncli/fido2_test.go @@ -1954,6 +1954,102 @@ func TestFIDO2Register_u2fExcludedCredentials(t *testing.T) { require.NoError(t, err, "FIDO2Register errored, expected a successful registration") } +// TestFIDO2Login_u2fInternalError tests the scenario described by issue +// https://github.com/gravitational/teleport/issues/44912. +func TestFIDO2Login_u2fInternalError(t *testing.T) { + resetFIDO2AfterTests(t) + + dev1 := mustNewFIDO2Device("/dev1", "" /* pin */, &libfido2.DeviceInfo{ + Options: authOpts, + }) + dev2 := mustNewFIDO2Device("/dev2", "" /* pin */, &libfido2.DeviceInfo{ + Options: authOpts, + }) + u2fDev := mustNewFIDO2Device("/u2f", "" /* pin */, nil /* info */) + u2fDev.u2fOnly = true + u2fDev.errorOnUnknownCredential = true + + f2 := newFakeFIDO2(dev1, dev2, u2fDev) + f2.setCallbacks() + + const origin = "https://example.com" + ctx := context.Background() + + // Register all authenticators. + cc := &wantypes.CredentialCreation{ + Response: wantypes.PublicKeyCredentialCreationOptions{ + Challenge: make([]byte, 32), + RelyingParty: wantypes.RelyingPartyEntity{ + CredentialEntity: protocol.CredentialEntity{ + Name: "example.com", + }, + ID: "example.com", + }, + User: wantypes.UserEntity{ + CredentialEntity: protocol.CredentialEntity{ + Name: "alpaca", + }, + DisplayName: "Alpaca", + ID: []byte{1, 2, 3, 4, 5}, // arbitrary + }, + Parameters: []wantypes.CredentialParameter{ + {Type: protocol.PublicKeyCredentialType, Algorithm: webauthncose.AlgES256}, + }, + AuthenticatorSelection: wantypes.AuthenticatorSelection{ + RequireResidentKey: protocol.ResidentKeyNotRequired(), + ResidentKey: protocol.ResidentKeyRequirementDiscouraged, + UserVerification: protocol.VerificationDiscouraged, + }, + Attestation: protocol.PreferNoAttestation, + }, + } + allowedCreds := make([]wantypes.CredentialDescriptor, 0, len(f2.devices)) + for _, dev := range f2.devices { + ctx, cancel := context.WithTimeout(ctx, 1*time.Second) + mfaResp, err := wancli.FIDO2Register(ctx, origin, cc, dev) + cancel() + require.NoError(t, err, "FIDO2Register failed") + + allowedCreds = append(allowedCreds, wantypes.CredentialDescriptor{ + Type: protocol.PublicKeyCredentialType, + CredentialID: mfaResp.GetWebauthn().RawId, + }) + } + + // Sanity check: authenticator errors in the presence of unknown credentials. + u2fDev.open() + _, err := u2fDev.Assertion( + "example.com", + []byte(`55cde2973243a946b85a477d2e164a35d2e4f3daaeb11ac5e9a1c4cf3297033e`), // clientDataHash + [][]byte{ + u2fDev.credentialID(), + bytes.Repeat([]byte("A"), 96), + }, + "", // pin + &libfido2.AssertionOpts{UP: libfido2.False}, + ) + require.ErrorIs(t, err, libfido2.ErrInternal, "u2fDev.Assert error mismatch") + u2fDev.Close() + + t.Run("login with multiple credentials", func(t *testing.T) { + assertion := &wantypes.CredentialAssertion{ + Response: wantypes.PublicKeyCredentialRequestOptions{ + Challenge: make([]byte, 32), + RelyingPartyID: "example.com", + AllowedCredentials: allowedCreds, + UserVerification: protocol.VerificationDiscouraged, + }, + } + + ctx, cancel := context.WithTimeout(ctx, 1*time.Second) + defer cancel() + _, _, err := wancli.FIDO2Login(ctx, origin, assertion, u2fDev, &wancli.LoginOpts{ + User: "alpaca", + }) + require.NoError(t, err, "FIDO2Login failed") + }) +} + func resetFIDO2AfterTests(t *testing.T) { pollInterval := wancli.FIDO2PollInterval devLocations := wancli.FIDODeviceLocations @@ -2015,6 +2111,10 @@ type fakeFIDO2Device struct { // Causes libfido2.ErrNotFIDO2 on Info. u2fOnly bool + // errorOnUnknownCredential makes the device fail assertions if an unknown + // credential is present. + errorOnUnknownCredential bool + // assertionErrors is a chain of errors to return from Assertion. // Errors are returned from start to end and removed, one-by-one, on each // invocation of the Assertion method. @@ -2291,6 +2391,9 @@ func (f *fakeFIDO2Device) Assertion( found = true break } + if f.errorOnUnknownCredential { + return nil, fmt.Errorf("failed to get assertion: %w", libfido2.ErrInternal) + } } if !found { return nil, libfido2.ErrNoCredentials @@ -2316,6 +2419,13 @@ func (f *fakeFIDO2Device) Assertion( credIDs := make(map[string]struct{}) for _, cred := range credentialIDs { credIDs[string(cred)] = struct{}{} + + // Simulate "internal error" on unknown credential handles. + // Sometimes happens with Yubikeys firmware 4.1.8. + // Requires a tap to happen. + if f.errorOnUnknownCredential && !bytes.Equal(cred, f.key.KeyHandle) { + return nil, fmt.Errorf("failed to get assertion: %w", libfido2.ErrInternal) + } } // Assemble one assertion for each allowed credential we hold. diff --git a/lib/client/api.go b/lib/client/api.go index a3f33038d0f8d..c4e2d3f916c0c 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -2267,13 +2267,11 @@ func playSession(ctx context.Context, sessionID string, speed float64, streamer } playing = !playing case keyLeft, keyDown: - current := time.Duration(player.LastPlayed() * int64(time.Millisecond)) - player.SetPos(max(current-skipDuration, 0)) // rewind + player.SetPos(max(player.LastPlayed()-skipDuration, 0)) // rewind term.Clear() term.SetCursorPos(1, 1) case keyRight, keyUp: - current := time.Duration(player.LastPlayed() * int64(time.Millisecond)) - player.SetPos(current + skipDuration) // advance forward + player.SetPos(player.LastPlayed() + skipDuration) // advance forward } } }() diff --git a/lib/client/mfa/cli.go b/lib/client/mfa/cli.go index 40127b314e06d..a956775961012 100644 --- a/lib/client/mfa/cli.go +++ b/lib/client/mfa/cli.go @@ -72,12 +72,6 @@ func NewCLIPrompt(cfg *CLIPromptConfig) *CLIPrompt { } } -// NewCLIPromptV2 returns a new CLI mfa prompt with the given config. -// TODO(Joerger): remove once /e is no longer dependent on this. -func NewCLIPromptV2(cfg *CLIPromptConfig) *CLIPrompt { - return NewCLIPrompt(cfg) -} - func (c *CLIPrompt) stdin() prompt.StdinReader { if c.cfg.StdinFunc == nil { return prompt.Stdin() diff --git a/lib/config/configuration.go b/lib/config/configuration.go index bea0b44d7d874..66a924fe6aaf0 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -1171,6 +1171,7 @@ func applyAWSKMSConfig(kmsConfig *AWSKMS, cfg *servicecfg.Config) error { } cfg.Auth.KeyStore.AWSKMS.AWSRegion = kmsConfig.Region cfg.Auth.KeyStore.AWSKMS.MultiRegion = kmsConfig.MultiRegion + cfg.Auth.KeyStore.AWSKMS.Tags = kmsConfig.Tags return nil } @@ -1749,6 +1750,9 @@ kubernetes matchers are present`) AssumeRole: assumeRole, }) } + if fc.Discovery.AccessGraph.PollInterval > 0 { + tMatcher.PollInterval = fc.Discovery.AccessGraph.PollInterval + } cfg.Discovery.AccessGraph = &tMatcher } diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index 9506232b47e81..eece0bcffa812 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -3670,9 +3670,9 @@ func TestAuthHostedPlugins(t *testing.T) { applyErr: require.NoError, assert: func(t *testing.T, p servicecfg.HostedPluginsConfig) { require.True(t, p.Enabled) - require.NotNil(t, p.OAuthProviders.Slack) - require.Equal(t, "foo", p.OAuthProviders.Slack.ID) - require.Equal(t, "bar", p.OAuthProviders.Slack.Secret) + require.NotNil(t, p.OAuthProviders.SlackCredentials) + require.Equal(t, "foo", p.OAuthProviders.SlackCredentials.ClientID) + require.Equal(t, "bar", p.OAuthProviders.SlackCredentials.ClientSecret) }, }, } diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index 1fbabce2e4b43..5eb117d5c4991 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -33,7 +33,6 @@ import ( "strings" "time" - "github.com/coreos/go-oidc/oauth2" "github.com/gravitational/trace" log "github.com/sirupsen/logrus" "golang.org/x/crypto/acme" @@ -922,6 +921,11 @@ type AWSKMS struct { // Enabled configures new keys to be multi-region. Enabled bool } `yaml:"multi_region,omitempty"` + // Tags are key/value pairs used as AWS resource tags. The 'TeleportCluster' + // tag is added automatically if not specified in the set of tags. Changing tags + // after Teleport has already created KMS keys may require manually updating + // the tags of existing keys. + Tags map[string]string `yaml:"tags,omitempty"` } // TrustedCluster struct holds configuration values under "trusted_clusters" key @@ -1304,7 +1308,7 @@ func (p *PluginOAuthProviders) Parse() (servicecfg.PluginOAuthProviders, error) if err != nil { return out, trace.Wrap(err) } - out.Slack = slack + out.SlackCredentials = slack } return out, nil } @@ -1318,7 +1322,7 @@ type OAuthClientCredentials struct { ClientSecret string `yaml:"client_secret"` } -func (o *OAuthClientCredentials) Parse() (*oauth2.ClientCredentials, error) { +func (o *OAuthClientCredentials) Parse() (*servicecfg.OAuthClientCredentials, error) { if o.ClientID == "" || o.ClientSecret == "" { return nil, trace.BadParameter("both client_id and client_secret paths must be specified") } @@ -1337,9 +1341,9 @@ func (o *OAuthClientCredentials) Parse() (*oauth2.ClientCredentials, error) { } clientSecret = strings.TrimSpace(string(content)) - return &oauth2.ClientCredentials{ - ID: clientID, - Secret: clientSecret, + return &servicecfg.OAuthClientCredentials{ + ClientID: clientID, + ClientSecret: clientSecret, }, nil } @@ -1502,6 +1506,8 @@ type GCPMatcher struct { type AccessGraphSync struct { // AWS is the AWS configuration for the AccessGraph Sync service. AWS []AccessGraphAWSSync `yaml:"aws,omitempty"` + // PollInterval is the frequency at which to poll for AWS resources + PollInterval time.Duration `yaml:"poll_interval,omitempty"` } // AccessGraphAWSSync represents the configuration for the AWS AccessGraph Sync service. diff --git a/lib/events/dynamoevents/dynamoevents.go b/lib/events/dynamoevents/dynamoevents.go index 323a10afb75a8..a81886e69a02b 100644 --- a/lib/events/dynamoevents/dynamoevents.go +++ b/lib/events/dynamoevents/dynamoevents.go @@ -466,11 +466,17 @@ func (l *Log) putAuditEvent(ctx context.Context, sessionID string, in apievents. // item event index/session id. Since we can't change the session // id, update the event index with a new value and retry the put // item. - l. - WithError(err). - WithFields(log.Fields{"event_type": in.GetType(), "session_id": sessionID, "event_index": in.GetIndex()}). - Error("Conflict on event session_id and event_index") - return trace.Wrap(l.handleConditionError(ctx, err, sessionID, in)) + if err2 := l.handleConditionError(ctx, err, sessionID, in); err2 != nil { + // Only log about the original conflict if updating + // the session information fails. + l. + WithError(err). + WithFields(log.Fields{"event_type": in.GetType(), "session_id": sessionID, "event_index": in.GetIndex()}). + Error("Conflict on event session_id and event_index") + return trace.Wrap(err2) + } + + return nil } return err diff --git a/lib/integrations/awsoidc/eks_enroll_clusters.go b/lib/integrations/awsoidc/eks_enroll_clusters.go index e23a3c3ee7799..587ec248538e0 100644 --- a/lib/integrations/awsoidc/eks_enroll_clusters.go +++ b/lib/integrations/awsoidc/eks_enroll_clusters.go @@ -552,12 +552,13 @@ func checkAgentAlreadyInstalled(ctx context.Context, actionConfig *action.Config var err error // We setup a little backoff loop because sometimes access entry auth needs a bit more time to propagate and take // effect, so we could get errors when trying to access cluster right after giving us permissions to do so. + // From real scenarios, we've seen this taking as long as 20 seconds. for attempt := 1; attempt <= 3; attempt++ { listCmd := action.NewList(actionConfig) releases, err = listCmd.Run() if err != nil { select { - case <-time.After(time.Duration(attempt) * time.Second): + case <-time.After(time.Duration(attempt*5) * time.Second): case <-ctx.Done(): return false, trace.NewAggregate(err, ctx.Err()) } diff --git a/lib/integrations/awsoidc/eks_list_clusters.go b/lib/integrations/awsoidc/eks_list_clusters.go index 4079f98034b1b..f24c7ec1f6102 100644 --- a/lib/integrations/awsoidc/eks_list_clusters.go +++ b/lib/integrations/awsoidc/eks_list_clusters.go @@ -79,9 +79,9 @@ type EKSCluster struct { // https://aws.amazon.com/blogs/containers/a-deep-dive-into-simplified-amazon-eks-access-management-controls/ AuthenticationMode string - // EndpointPublicAddress indicates whether the Cluster's VPC Config has its endpoint as a public address. + // EndpointPublicAccess indicates whether the Cluster's VPC Config has its endpoint as a public address. // For Teleport Cloud, this is required to access the cluster and proceed with the installation. - EndpointPublicAddress bool + EndpointPublicAccess bool } // ListEKSClustersResponse contains a page of AWS EKS Clusters. @@ -171,14 +171,14 @@ func ListEKSClusters(ctx context.Context, clt ListEKSClustersClient, req ListEKS } ret.Clusters = append(ret.Clusters, EKSCluster{ - Name: aws.ToString(cluster.Name), - Region: req.Region, - Arn: aws.ToString(cluster.Arn), - Labels: cluster.Tags, - JoinLabels: extraLabels, - Status: strings.ToLower(string(cluster.Status)), - AuthenticationMode: string(cluster.AccessConfig.AuthenticationMode), - EndpointPublicAddress: cluster.ResourcesVpcConfig.EndpointPublicAccess, + Name: aws.ToString(cluster.Name), + Region: req.Region, + Arn: aws.ToString(cluster.Arn), + Labels: cluster.Tags, + JoinLabels: extraLabels, + Status: strings.ToLower(string(cluster.Status)), + AuthenticationMode: string(cluster.AccessConfig.AuthenticationMode), + EndpointPublicAccess: cluster.ResourcesVpcConfig.EndpointPublicAccess, }) return nil }) diff --git a/lib/integrations/awsoidc/eks_list_clusters_test.go b/lib/integrations/awsoidc/eks_list_clusters_test.go index 64298bdc6fc4d..9fe472d8cb659 100644 --- a/lib/integrations/awsoidc/eks_list_clusters_test.go +++ b/lib/integrations/awsoidc/eks_list_clusters_test.go @@ -178,9 +178,9 @@ func TestListEKSClusters(t *testing.T) { "region": "us-east-1", "teleport.dev/cloud": "AWS", }, - Status: "active", - AuthenticationMode: "API", - EndpointPublicAddress: true, + Status: "active", + AuthenticationMode: "API", + EndpointPublicAccess: true, }, }, expectedFetchingErrors: map[string]error{}, @@ -224,9 +224,9 @@ func TestListEKSClusters(t *testing.T) { "region": "us-east-1", "teleport.dev/cloud": "AWS", }, - Status: "active", - AuthenticationMode: "API", - EndpointPublicAddress: true, + Status: "active", + AuthenticationMode: "API", + EndpointPublicAccess: true, }, { Name: "EKS2", @@ -238,9 +238,9 @@ func TestListEKSClusters(t *testing.T) { "region": "us-east-1", "teleport.dev/cloud": "AWS", }, - Status: "active", - AuthenticationMode: "API", - EndpointPublicAddress: true, + Status: "active", + AuthenticationMode: "API", + EndpointPublicAccess: true, }, }, expectedFetchingErrors: map[string]error{}, @@ -296,9 +296,9 @@ func TestListEKSClusters(t *testing.T) { "region": "us-east-1", "teleport.dev/cloud": "AWS", }, - Status: "active", - AuthenticationMode: "API", - EndpointPublicAddress: true, + Status: "active", + AuthenticationMode: "API", + EndpointPublicAccess: true, }, }, expectedFetchingErrors: map[string]error{"erroredCluster": errors.New("erroredCluster")}, diff --git a/lib/jwt/jwt.go b/lib/jwt/jwt.go index e6b6b63b48a45..bfdb78dba21c0 100644 --- a/lib/jwt/jwt.go +++ b/lib/jwt/jwt.go @@ -31,7 +31,6 @@ import ( "strings" "time" - "github.com/coreos/go-oidc" "github.com/go-jose/go-jose/v3" "github.com/go-jose/go-jose/v3/cryptosigner" "github.com/go-jose/go-jose/v3/jwt" @@ -649,11 +648,18 @@ func GenerateKeyPair() ([]byte, []byte, error) { return public, private, nil } +// IDToken allows introspecting claims from an OpenID Connect +// ID Token. +type IDToken interface { + // Claims unmarshals the raw JSON payload of the ID Token into a provided struct. + Claims(v any) error +} + // CheckNotBefore ensures the token was not issued in the future. // https://www.rfc-editor.org/rfc/rfc7519#section-4.1.5 // 4.1.5. "nbf" (Not Before) Claim // TODO(strideynet): upstream support for `nbf` into the go-oidc lib. -func CheckNotBefore(now time.Time, leeway time.Duration, token *oidc.IDToken) error { +func CheckNotBefore(now time.Time, leeway time.Duration, token IDToken) error { claims := struct { NotBefore *JSONTime `json:"nbf"` }{} diff --git a/lib/kube/grpc/grpc.go b/lib/kube/grpc/grpc.go index 90d5329c4bd86..cafcc869692f1 100644 --- a/lib/kube/grpc/grpc.go +++ b/lib/kube/grpc/grpc.go @@ -134,7 +134,8 @@ func (s *Server) ListKubernetesResources(ctx context.Context, req *proto.ListKub if req.UseSearchAsRoles || req.UsePreviewAsRoles { var extraRoles []string if req.UseSearchAsRoles { - extraRoles = append(extraRoles, userContext.Checker.GetAllowedSearchAsRoles()...) + allowedSearchAsRoles := userContext.Checker.GetAllowedSearchAsRolesForKubeResourceKind(req.ResourceType) + extraRoles = append(extraRoles, allowedSearchAsRoles...) } if req.UsePreviewAsRoles { extraRoles = append(extraRoles, userContext.Checker.GetAllowedPreviewAsRoles()...) diff --git a/lib/kube/grpc/grpc_test.go b/lib/kube/grpc/grpc_test.go index b2c53c0520c67..d5125ca4b7f8d 100644 --- a/lib/kube/grpc/grpc_test.go +++ b/lib/kube/grpc/grpc_test.go @@ -47,11 +47,13 @@ import ( func TestListKubernetesResources(t *testing.T) { modules.SetInsecureTestMode(true) var ( - usernameWithFullAccess = "full_user" - usernameNoAccess = "limited_user" - kubeCluster = "test_cluster" - kubeUsers = []string{"kube_user"} - kubeGroups = []string{"kube_user"} + usernameWithFullAccess = "full_user" + usernameNoAccess = "limited_user" + usernameWithEnforceKubePodOrNamespace = "request_kind_enforce_pod_user" + usernameWithEnforceKubeSecret = "request_kind_enforce_secret_user" + kubeCluster = "test_cluster" + kubeUsers = []string{"kube_user"} + kubeGroups = []string{"kube_user"} ) // kubeMock is a Kubernetes API mock for the session tests. // Once a new session is created, this mock will write to @@ -94,6 +96,45 @@ func TestListKubernetesResources(t *testing.T) { }, ) + userWithEnforceKubePodOrNamespace, _ := testCtx.CreateUserAndRole( + testCtx.Context, + t, + usernameWithEnforceKubePodOrNamespace, + kubeproxy.RoleSpec{ + Name: usernameWithEnforceKubePodOrNamespace, + KubeUsers: kubeUsers, + KubeGroups: kubeGroups, + SetupRoleFunc: func(role types.Role) { + // override the role to deny access to all kube resources. + role.SetKubernetesLabels(types.Allow, nil) + // set the role to allow searching as fullAccessRole. + role.SetSearchAsRoles(types.Allow, []string{fullAccessRole.GetName()}) + // restrict querying to pods only + role.SetRequestKubernetesResources(types.Allow, []types.RequestKubernetesResource{{Kind: "namespace"}, {Kind: "pod"}}) + }, + }, + ) + + userWithEnforceKubeSecret, _ := testCtx.CreateUserAndRole( + testCtx.Context, + t, + usernameWithEnforceKubeSecret, + kubeproxy.RoleSpec{ + Name: usernameWithEnforceKubeSecret, + KubeUsers: kubeUsers, + KubeGroups: kubeGroups, + SetupRoleFunc: func(role types.Role) { + // override the role to deny access to all kube resources. + role.SetKubernetesLabels(types.Allow, nil) + // set the role to allow searching as fullAccessRole. + role.SetSearchAsRoles(types.Allow, []string{fullAccessRole.GetName()}) + // restrict querying to secrets only + role.SetRequestKubernetesResources(types.Allow, []types.RequestKubernetesResource{{Kind: "secret"}}) + + }, + }, + ) + userNoAccess, _ := testCtx.CreateUserAndRole( testCtx.Context, t, @@ -357,6 +398,82 @@ func TestListKubernetesResources(t *testing.T) { }, assertErr: require.NoError, }, + { + name: "user with no access, deny listing dev pod, with role that enforces secret", + args: args{ + user: userWithEnforceKubeSecret, + searchAsRoles: true, + namespace: "dev", + resourceKind: types.KindKubePod, + }, + assertErr: require.Error, + }, + { + name: "user with no access, allow listing dev secret, with role that enforces secret", + args: args{ + user: userWithEnforceKubeSecret, + searchAsRoles: true, + namespace: "dev", + resourceKind: types.KindKubeSecret, + }, + want: &proto.ListKubernetesResourcesResponse{ + Resources: []*types.KubernetesResourceV1{ + { + Kind: types.KindKubeSecret, + Version: "v1", + Metadata: types.Metadata{ + Name: "secret-1", + }, + Spec: types.KubernetesResourceSpecV1{ + Namespace: "dev", + }, + }, + { + Kind: types.KindKubeSecret, + Version: "v1", + Metadata: types.Metadata{ + Name: "secret-2", + }, + Spec: types.KubernetesResourceSpecV1{ + Namespace: "dev", + }, + }, + }, + }, + assertErr: require.NoError, + }, + { + name: "user with no access, allow listing dev pod, with role that enforces namespace or pods", + args: args{ + user: userWithEnforceKubePodOrNamespace, + searchAsRoles: true, + namespace: "dev", + resourceKind: types.KindKubePod, + }, + want: &proto.ListKubernetesResourcesResponse{ + Resources: []*types.KubernetesResourceV1{ + { + Kind: "pod", + Metadata: types.Metadata{ + Name: "nginx-1", + }, + Spec: types.KubernetesResourceSpecV1{ + Namespace: "dev", + }, + }, + { + Kind: "pod", + Metadata: types.Metadata{ + Name: "nginx-2", + }, + Spec: types.KubernetesResourceSpecV1{ + Namespace: "dev", + }, + }, + }, + }, + assertErr: require.NoError, + }, { name: "user with full access and listing secrets in all namespaces", args: args{ diff --git a/lib/kube/proxy/ephemeral_containers.go b/lib/kube/proxy/ephemeral_containers.go index e39cb7dbca3a8..1c9ae08e417a4 100644 --- a/lib/kube/proxy/ephemeral_containers.go +++ b/lib/kube/proxy/ephemeral_containers.go @@ -104,7 +104,7 @@ func (f *Forwarder) ephemeralContainers(authCtx *authContext, w http.ResponseWri f.log.Errorf("Failed to set up forwarding headers: %v.", err) return nil, trace.Wrap(err) } - if !f.isLocalKubeCluster(sess.teleportCluster.isRemote, sess.kubeClusterName) { + if !sess.isLocalKubernetesCluster { sess.forwarder.ServeHTTP(w, req) return nil, nil } diff --git a/lib/kube/proxy/forwarder.go b/lib/kube/proxy/forwarder.go index bf38e9a3b010d..1b109d42a488b 100644 --- a/lib/kube/proxy/forwarder.go +++ b/lib/kube/proxy/forwarder.go @@ -441,6 +441,10 @@ type authContext struct { kubeServers []types.KubeServer // apiResource holds the information about the requested API resource. apiResource apiResource + // isLocalKubernetesCluster is true if the target cluster is served by this teleport service. + // It is false if the target cluster is served by another teleport service or a different + // Teleport cluster. + isLocalKubernetesCluster bool } func (c authContext) String() string { @@ -778,7 +782,8 @@ func (f *Forwarder) setupContext( return nil, trace.NotFound("Kubernetes cluster %q not found", kubeCluster) } } - if f.isLocalKubeCluster(isRemoteCluster, kubeCluster) { + isLocalKubernetesCluster := f.isLocalKubeCluster(isRemoteCluster, kubeCluster) + if isLocalKubernetesCluster { kubeResource, apiResource, err = f.parseResourceFromRequest(req, kubeCluster) if err != nil { return nil, trace.Wrap(err) @@ -812,10 +817,11 @@ func (f *Forwarder) setupContext( remoteAddr: utils.NetAddr{AddrNetwork: "tcp", Addr: req.RemoteAddr}, isRemote: isRemoteCluster, }, - kubeServers: kubeServers, - requestVerb: apiResource.getVerb(req), - apiResource: apiResource, - kubeResource: kubeResource, + kubeServers: kubeServers, + requestVerb: apiResource.getVerb(req), + apiResource: apiResource, + kubeResource: kubeResource, + isLocalKubernetesCluster: isLocalKubernetesCluster, }, nil } @@ -868,9 +874,11 @@ func (f *Forwarder) emitAuditEvent(req *http.Request, sess *clusterSession, stat ) defer span.End() - if sess.noAuditEvents { + // If the session is not local, don't emit the event. + if !sess.isLocalKubernetesCluster { return } + r := sess.apiResource if r.skipEvent { return @@ -1164,7 +1172,7 @@ func (f *Forwarder) join(ctx *authContext, w http.ResponseWriter, req *http.Requ return nil, trace.Wrap(err) } - if !f.isLocalKubeCluster(ctx.teleportCluster.isRemote, ctx.kubeClusterName) { + if !sess.isLocalKubernetesCluster { return f.remoteJoin(ctx, w, req, p, sess) } @@ -1657,7 +1665,7 @@ func (f *Forwarder) exec(authCtx *authContext, w http.ResponseWriter, req *http. return upgradeRequestToRemoteCommandProxy(request, func(proxy *remoteCommandProxy) error { - if sess.noAuditEvents { + if !sess.isLocalKubernetesCluster { // We're forwarding this to another kubernetes_service instance, let it handle multiplexing. return f.remoteExec(authCtx, w, req, p, sess, request, proxy) } @@ -1754,7 +1762,7 @@ func (f *Forwarder) portForward(authCtx *authContext, w http.ResponseWriter, req } onPortForward := func(addr string, success bool) { - if sess.noAuditEvents { + if !sess.isLocalKubernetesCluster { return } portForward := &apievents.PortForward{ @@ -2029,7 +2037,7 @@ func (f *Forwarder) catchAll(authCtx *authContext, w http.ResponseWriter, req *h return nil, trace.Wrap(err) } - isLocalKubeCluster := f.isLocalKubeCluster(sess.teleportCluster.isRemote, sess.kubeClusterName) + isLocalKubeCluster := sess.isLocalKubernetesCluster isListRequest := authCtx.requestVerb == types.KubeVerbList // Watch requests can be send to a single resource or to a collection of resources. // isWatchingCollectionRequest is true when the request is a watch request and @@ -2103,7 +2111,7 @@ func isRelevantWebsocketError(err error) bool { func (f *Forwarder) getExecutor(sess *clusterSession, req *http.Request) (remotecommand.Executor, error) { isWSSupported := false - if sess.noAuditEvents { + if !sess.isLocalKubernetesCluster { // We're forwarding it to another kube_service, check if it supports new protocol. isWSSupported = f.allServersSupportExecSubprotocolV5(sess) } else { @@ -2224,10 +2232,8 @@ type clusterSession struct { // nil otherwise. kubeAPICreds kubeCreds forwarder *reverseproxy.Forwarder - // noAuditEvents is true if this teleport service should leave audit event - // logging to another service. - noAuditEvents bool - targetAddr string + // targetAddr is the address of the target cluster. + targetAddr string // kubeAddress is the address of this session's active connection (if there is one) kubeAddress string // upgradeToHTTP2 indicates whether the transport should be configured to use HTTP2. @@ -2435,11 +2441,8 @@ func (f *Forwarder) newClusterSessionLocal(ctx context.Context, authCtx authCont func (f *Forwarder) newClusterSessionDirect(ctx context.Context, authCtx authContext) (*clusterSession, error) { connCtx, cancel := context.WithCancelCause(ctx) return &clusterSession{ - parent: f, - authContext: authCtx, - // This session talks to a kubernetes_service, which should handle - // audit logging. Avoid duplicate logging. - noAuditEvents: true, + parent: f, + authContext: authCtx, requestContext: ctx, connCtx: connCtx, connMonitorCancel: cancel, @@ -2463,7 +2466,7 @@ func (f *Forwarder) makeSessionForwarder(sess *clusterSession) (*reverseproxy.Fo reverseproxy.WithLogger(f.log), reverseproxy.WithErrorHandler(f.formatForwardResponseError), } - if f.isLocalKubeCluster(sess.teleportCluster.isRemote, sess.kubeClusterName) { + if sess.isLocalKubernetesCluster { // If the target cluster is local, i.e. the cluster that is served by this // teleport service, then we set up the forwarder to allow re-writing // the response to the client to include user friendly error messages. diff --git a/lib/kube/proxy/resource_deletecollection.go b/lib/kube/proxy/resource_deletecollection.go index dced5822ffc71..89c658c551c05 100644 --- a/lib/kube/proxy/resource_deletecollection.go +++ b/lib/kube/proxy/resource_deletecollection.go @@ -62,7 +62,7 @@ func (f *Forwarder) deleteResourcesCollection(sess *clusterSession, w http.Respo defer span.End() req = req.WithContext(ctx) var ( - isLocalKubeCluster = f.isLocalKubeCluster(sess.teleportCluster.isRemote, sess.kubeClusterName) + isLocalKubeCluster = sess.isLocalKubernetesCluster kubeObjType string namespace string ) diff --git a/lib/kube/proxy/resource_list.go b/lib/kube/proxy/resource_list.go index a53313778608b..355cfbb2a3407 100644 --- a/lib/kube/proxy/resource_list.go +++ b/lib/kube/proxy/resource_list.go @@ -53,7 +53,7 @@ func (f *Forwarder) listResources(sess *clusterSession, w http.ResponseWriter, r req = req.WithContext(ctx) - isLocalKubeCluster := f.isLocalKubeCluster(sess.teleportCluster.isRemote, sess.kubeClusterName) + isLocalKubeCluster := sess.isLocalKubernetesCluster supportsType := false resourceKind := "" if isLocalKubeCluster { diff --git a/lib/kube/proxy/self_subject_reviews.go b/lib/kube/proxy/self_subject_reviews.go index fe8b463acea33..2130cfdaed034 100644 --- a/lib/kube/proxy/self_subject_reviews.go +++ b/lib/kube/proxy/self_subject_reviews.go @@ -80,7 +80,7 @@ func (f *Forwarder) selfSubjectAccessReviews(authCtx *authContext, w http.Respon // only allow self subject access reviews for the service that proxies the // request to the kubernetes API server. - if f.isLocalKubeCluster(sess.teleportCluster.isRemote, sess.kubeClusterName) { + if sess.isLocalKubernetesCluster { if err := f.validateSelfSubjectAccessReview(sess, w, req); trace.IsAccessDenied(err) { return nil, nil } else if err != nil { diff --git a/lib/kube/proxy/sess.go b/lib/kube/proxy/sess.go index 54ed10105b8e7..8a12d764fba99 100644 --- a/lib/kube/proxy/sess.go +++ b/lib/kube/proxy/sess.go @@ -748,7 +748,7 @@ func (s *session) lockedSetupLaunch(request *remoteCommandRequest, eventPodMeta s.started = true sessionStart := s.forwarder.cfg.Clock.Now().UTC() - if !s.sess.noAuditEvents { + if s.sess.isLocalKubernetesCluster { s.terminalSizeQueue.callback = func(termSize terminalResizeMessage) { s.mu.Lock() defer s.mu.Unlock() diff --git a/lib/modules/modules.go b/lib/modules/modules.go index c52d6c0a42d42..6370a3a1da895 100644 --- a/lib/modules/modules.go +++ b/lib/modules/modules.go @@ -61,6 +61,10 @@ type Features struct { SupportType proto.SupportType // Entitlements reflect Cloud Entitlements including access and limits Entitlements map[entitlements.EntitlementKind]EntitlementInfo + // CloudAnonymizationKey is the key used to anonymize usage events in a cluster. + // Only applicable for Cloud customers (self-hosted clusters get their anonymization key from the + // license file). + CloudAnonymizationKey []byte // todo (michellescripts) have the following fields evaluated for deprecation, consolidation, or fetch from Cloud // AdvancedAccessWorkflows is currently set to the value of the Cloud Access Requests entitlement @@ -128,6 +132,7 @@ func (f Features) ToProto() *proto.Features { RecoveryCodes: f.RecoveryCodes, AccessMonitoringConfigured: f.AccessMonitoringConfigured, Entitlements: f.EntitlementsToProto(), + CloudAnonymizationKey: f.CloudAnonymizationKey, } // remove setLegacyLogic in v18 diff --git a/lib/modules/modules_test.go b/lib/modules/modules_test.go index 4d0946adf6011..3af74c0d61790 100644 --- a/lib/modules/modules_test.go +++ b/lib/modules/modules_test.go @@ -106,6 +106,7 @@ func TestFeatures_ToProto(t *testing.T) { Questionnaire: true, RecoveryCodes: true, AccessMonitoringConfigured: false, + CloudAnonymizationKey: []byte("001"), Entitlements: map[string]*proto.EntitlementInfo{ string(entitlements.AccessLists): {Enabled: true, Limit: 111}, string(entitlements.AccessMonitoring): {Enabled: true, Limit: 2113}, @@ -179,6 +180,7 @@ func TestFeatures_ToProto(t *testing.T) { Questionnaire: true, RecoveryCodes: true, AccessMonitoringConfigured: false, + CloudAnonymizationKey: []byte("001"), Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ entitlements.AccessLists: {Enabled: true, Limit: 111}, entitlements.AccessMonitoring: {Enabled: true, Limit: 2113}, diff --git a/lib/msgraph/client.go b/lib/msgraph/client.go index 5764b1459f4bb..e5a2f987936e7 100644 --- a/lib/msgraph/client.go +++ b/lib/msgraph/client.go @@ -360,6 +360,19 @@ func (c *Client) UpdateApplication(ctx context.Context, appObjectID string, app return trace.Wrap(c.patch(ctx, uri.String(), app)) } +// GetApplication returns the application with the given app client ID. +// Note that appID here is the app the application "client ID" ([Application.AppID]) not "object ID" ([Application.ID]). +// Ref: [https://learn.microsoft.com/en-us/graph/api/application-get]. +func (c *Client) GetApplication(ctx context.Context, applicationID string) (*Application, error) { + applicationIDFilter := fmt.Sprintf("applications(appId='%s')", applicationID) + uri := c.endpointURI(applicationIDFilter) + out, err := roundtrip[*Application](ctx, c, http.MethodGet, uri.String(), nil) + if err != nil { + return nil, trace.Wrap(err) + } + return out, nil +} + // UpdateServicePrincipal issues a partial update for a [ServicePrincipal]. // Ref: [https://learn.microsoft.com/en-us/graph/api/serviceprincipal-update]. func (c *Client) UpdateServicePrincipal(ctx context.Context, spID string, sp *ServicePrincipal) error { diff --git a/lib/msgraph/client_test.go b/lib/msgraph/client_test.go index 8e49692249c0a..ac0e1c3e5b172 100644 --- a/lib/msgraph/client_test.go +++ b/lib/msgraph/client_test.go @@ -19,6 +19,7 @@ package msgraph import ( "context" "encoding/json" + "fmt" "io" "net/http" "net/http/httptest" @@ -474,3 +475,79 @@ func TestIterateGroupMembers(t *testing.T) { require.Equal(t, "Test Group 1", *group.DisplayName) } } + +const getApplicationPayload = ` +{ + "id": "aeee7e9f-57ad-4ea6-a236-cd10b2dbc0b4", + "appId": "d2a39a2a-1636-457f-82f9-c2d76527e20e", + "displayName": "test SAML App", + "groupMembershipClaims": "SecurityGroup", + "identifierUris": [ + "goteleport.com" + ], + "optionalClaims": { + "accessToken": [], + "idToken": [], + "saml2Token": [ + { + "additionalProperties": [ + "sam_account_name" + ], + "essential": false, + "name": "groups", + "source": null + } + ] + } + }` + +func TestGetApplication(t *testing.T) { + + mux := http.NewServeMux() + appID := "d2a39a2a-1636-457f-82f9-c2d76527e20e" + mux.Handle(fmt.Sprintf("GET /applications(appId='%s')", appID), + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte(getApplicationPayload)) + })) + + srv := httptest.NewServer(mux) + t.Cleanup(func() { srv.Close() }) + + uri, err := url.Parse(srv.URL) + require.NoError(t, err) + client := &Client{ + httpClient: &http.Client{}, + tokenProvider: &fakeTokenProvider{}, + retryConfig: retryConfig, + baseURL: uri, + pageSize: 2, // smaller page size so we actually fetch multiple pages with our small test payload + } + + app, err := client.GetApplication(context.Background(), appID) + require.NoError(t, err) + require.Equal(t, "aeee7e9f-57ad-4ea6-a236-cd10b2dbc0b4", *app.ID) + + expectation := &Application{ + AppID: toPtr("d2a39a2a-1636-457f-82f9-c2d76527e20e"), + DirectoryObject: DirectoryObject{ + DisplayName: toPtr("test SAML App"), + ID: toPtr("aeee7e9f-57ad-4ea6-a236-cd10b2dbc0b4"), + }, + GroupMembershipClaims: toPtr("SecurityGroup"), + IdentifierURIs: &[]string{"goteleport.com"}, + OptionalClaims: &OptionalClaims{ + SAML2Token: []OptionalClaim{ + { + AdditionalProperties: []string{"sam_account_name"}, + Essential: toPtr(false), + Name: toPtr("groups"), + Source: nil, + }, + }, + }, + } + require.EqualValues(t, expectation, app) + +} + +func toPtr[T any](s T) *T { return &s } diff --git a/lib/msgraph/models.go b/lib/msgraph/models.go index 1150c8943e7d1..c5ea66a1700e5 100644 --- a/lib/msgraph/models.go +++ b/lib/msgraph/models.go @@ -35,7 +35,14 @@ type DirectoryObject struct { type Group struct { DirectoryObject + // GroupTypes is a list of group type strings. GroupTypes []string `json:"groupTypes,omitempty"` + // OnPremisesDomainName is the on-premises domain name of the group. + OnPremisesDomainName *string `json:"onPremisesDomainName,omitempty"` + // OnPremisesNetBiosName is the on-premises NetBIOS name of the group. + OnPremisesNetBiosName *string `json:"onPremisesNetBiosName,omitempty"` + // OnPremisesSamAccountName is the on-premises SAM account name of the group. + OnPremisesSamAccountName *string `json:"onPremisesSamAccountName,omitempty"` } func (g *Group) IsOffice365Group() bool { @@ -64,6 +71,47 @@ type Application struct { IdentifierURIs *[]string `json:"identifierUris,omitempty"` Web *WebApplication `json:"web,omitempty"` GroupMembershipClaims *string `json:"groupMembershipClaims,omitempty"` + OptionalClaims *OptionalClaims `json:"optionalClaims,omitempty"` +} + +const ( + // OPTIONAL_CLAIM_GROUP_NAME is the group claim. + OPTIONAL_CLAIM_GROUP_NAME = "groups" +) + +const ( + // OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_SAM_ACCOUNT_NAME is the sAMAccountName claim. + OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_SAM_ACCOUNT_NAME = "sam_account_name" + // OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_DNS_DOMAIN_AND_SAM_ACCOUNT_NAME is the dnsDomainName\sAMAccountName claim. + OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_DNS_DOMAIN_AND_SAM_ACCOUNT_NAME = "dns_domain_and_sam_account_name" + // OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_NETBIOS_DOMAIN_AND_SAM_ACCOUNT_NAME is the netbiosDomainName\sAMAccountName claim. + OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_NETBIOS_DOMAIN_AND_SAM_ACCOUNT_NAME = "netbios_domain_and_sam_account_name" + // OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_EMIT_AS_ROLES is the emit_as_roles claim. + OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_EMIT_AS_ROLES = "emit_as_roles" + // OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_CLOUD_DISPLAYNAME is the cloud_displayname claim. + OPTIONAL_CLAIM_ADDITIONAL_PROPERTIES_CLOUD_DISPLAYNAME = "cloud_displayname" +) + +// OptionalClaim represents an optional claim in a token. +// https://learn.microsoft.com/en-us/entra/identity-platform/optional-claims?tabs=appui +type OptionalClaim struct { + // AdditionalProperties is a list of additional properties. + // Possible values: + // - sam_account_name: sAMAccountName + // - dns_domain_and_sam_account_name: dnsDomainName\sAMAccountName + // - netbios_domain_and_sam_account_name: netbiosDomainName\sAMAccountName + // - emit_as_roles + // - cloud_displayname + AdditionalProperties []string `json:"additionalProperties,omitempty"` + Essential *bool `json:"essential,omitempty"` + Name *string `json:"name,omitempty"` + Source *string `json:"source,omitempty"` +} + +// OptionalClaims represents optional claims in a token. +// Currently, only SAML2 tokens are supported. +type OptionalClaims struct { + SAML2Token []OptionalClaim `json:"saml2Token,omitempty"` } type WebApplication struct { diff --git a/lib/player/player.go b/lib/player/player.go index fa52f790d8611..d29bacc17acbe 100644 --- a/lib/player/player.go +++ b/lib/player/player.go @@ -62,7 +62,7 @@ type Player struct { advanceTo atomic.Int64 emit chan events.AuditEvent - wake chan int64 + wake chan time.Duration done chan struct{} // playPause holds a channel to be closed when @@ -81,7 +81,12 @@ type Player struct { translator sessionPrintTranslator } -const normalPlayback = math.MinInt64 +const ( + normalPlayback = time.Duration(0) + // MaxIdleTime defines the max idle time when skipping idle + // periods on the recording. + MaxIdleTime = 500 * time.Millisecond +) // Streamer is the underlying streamer that provides // access to recorded session events. @@ -134,18 +139,19 @@ func New(cfg *Config) (*Player, error) { } p := &Player{ - clock: clk, - log: log, - sessionID: cfg.SessionID, - streamer: cfg.Streamer, - emit: make(chan events.AuditEvent, 1024), - playPause: make(chan chan struct{}, 1), - wake: make(chan int64), - done: make(chan struct{}), + clock: clk, + log: log, + sessionID: cfg.SessionID, + streamer: cfg.Streamer, + emit: make(chan events.AuditEvent, 1024), + playPause: make(chan chan struct{}, 1), + wake: make(chan time.Duration), + done: make(chan struct{}), + skipIdleTime: cfg.SkipIdleTime, } p.speed.Store(float64(defaultPlaybackSpeed)) - p.advanceTo.Store(normalPlayback) + p.advanceTo.Store(int64(normalPlayback)) // start in a paused state p.playPause <- make(chan struct{}) @@ -183,7 +189,7 @@ func (p *Player) stream() { defer cancel() eventsC, errC := p.streamer.StreamSessionEvents(ctx, p.sessionID, 0) - lastDelay := int64(0) + var lastDelay time.Duration for { select { case <-p.done: @@ -215,7 +221,7 @@ func (p *Player) stream() { currentDelay := getDelay(evt) if currentDelay > 0 && currentDelay >= lastDelay { - switch adv := p.advanceTo.Load(); { + switch adv := time.Duration(p.advanceTo.Load()); { case adv >= currentDelay: // no timing delay necessary, we are fast forwarding break @@ -223,12 +229,12 @@ func (p *Player) stream() { // any negative value other than normalPlayback means // we rewind (by restarting the stream and seeking forward // to the rewind point) - p.advanceTo.Store(adv * -1) + p.advanceTo.Store(int64(adv) * -1) go p.stream() return default: if adv != normalPlayback { - p.advanceTo.Store(normalPlayback) + p.advanceTo.Store(int64(normalPlayback)) // we're catching back up to real time, so the delay // is calculated not from the last event but from the @@ -256,7 +262,7 @@ func (p *Player) stream() { // // TODO: consider a select with a timeout to detect blocked readers? p.emit <- evt - p.lastPlayed.Store(currentDelay) + p.lastPlayed.Store(int64(currentDelay)) } } } @@ -308,14 +314,14 @@ func (p *Player) SetPos(d time.Duration) error { if d == 0 { d = 1 * time.Millisecond } - if d.Milliseconds() < p.lastPlayed.Load() { + if d < time.Duration(p.lastPlayed.Load()) { d = -1 * d } - p.advanceTo.Store(d.Milliseconds()) + p.advanceTo.Store(int64(d)) // try to wake up the player if it's waiting to emit an event select { - case p.wake <- d.Milliseconds(): + case p.wake <- d: default: } @@ -332,18 +338,18 @@ func (p *Player) SetPos(d time.Duration) error { // // A nil return value indicates that the delay has elapsed and that // the next even can be emitted. -func (p *Player) applyDelay(lastDelay, currentDelay int64) error { +func (p *Player) applyDelay(lastDelay, currentDelay time.Duration) error { loop: for { // TODO(zmb3): changing play speed during a long sleep // will not apply until after the sleep completes speed := p.speed.Load().(float64) - scaled := float64(currentDelay-lastDelay) / speed + scaled := time.Duration(float64(currentDelay-lastDelay) / speed) if p.skipIdleTime { - scaled = min(scaled, 500.0*float64(time.Millisecond)) + scaled = min(scaled, MaxIdleTime) } - timer := p.clock.NewTimer(time.Duration(scaled) * time.Millisecond) + timer := p.clock.NewTimer(scaled) defer timer.Stop() start := time.Now() @@ -357,7 +363,7 @@ loop: case newPos == interruptForPause: // the user paused playback while we were waiting to emit the next event: // 1) figure out much of the sleep we completed - dur := float64(time.Since(start).Milliseconds()) * speed + dur := time.Duration(float64(time.Since(start)) * speed) // 2) wait here until the user resumes playback if err := p.waitWhilePaused(); errors.Is(err, errSeekWhilePaused) { @@ -369,7 +375,7 @@ loop: // now that we're playing again, update our delay to account // for the portion that was already satisfied and apply the // remaining delay - lastDelay += int64(dur) + lastDelay += dur timer.Stop() continue loop case newPos > currentDelay: @@ -454,8 +460,8 @@ func (p *Player) waitWhilePaused() error { // LastPlayed returns the time of the last played event, // expressed as milliseconds since the start of the session. -func (p *Player) LastPlayed() int64 { - return p.lastPlayed.Load() +func (p *Player) LastPlayed() time.Duration { + return time.Duration(p.lastPlayed.Load()) } // translateEvent translates events if applicable and return if they should be @@ -490,13 +496,13 @@ var databaseTranslators = map[string]newSessionPrintTranslatorFunc{ // player. var SupportedDatabaseProtocols = maps.Keys(databaseTranslators) -func getDelay(e events.AuditEvent) int64 { +func getDelay(e events.AuditEvent) time.Duration { switch x := e.(type) { case *events.DesktopRecording: - return x.DelayMilliseconds + return time.Duration(x.DelayMilliseconds) * time.Millisecond case *events.SessionPrint: - return x.DelayMilliseconds + return time.Duration(x.DelayMilliseconds) * time.Millisecond default: - return int64(0) + return time.Duration(0) } } diff --git a/lib/player/player_test.go b/lib/player/player_test.go index 836b58a506f89..83fac3bb32d97 100644 --- a/lib/player/player_test.go +++ b/lib/player/player_test.go @@ -26,6 +26,7 @@ import ( "time" "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" apievents "github.com/gravitational/teleport/api/types/events" @@ -169,7 +170,7 @@ func TestClose(t *testing.T) { _, ok := <-p.C() require.False(t, ok, "player channel should have been closed") require.NoError(t, p.Err()) - require.Equal(t, int64(1000), p.LastPlayed()) + require.Equal(t, time.Second, p.LastPlayed()) } func TestSeekForward(t *testing.T) { @@ -321,6 +322,34 @@ func TestUseDatabaseTranslator(t *testing.T) { }) } +func TestSkipIdlePeriods(t *testing.T) { + eventCount := 3 + delayMilliseconds := 60000 + clk := clockwork.NewFakeClock() + p, err := player.New(&player.Config{ + Clock: clk, + SessionID: "test-session", + SkipIdleTime: true, + Streamer: &simpleStreamer{count: int64(eventCount), delay: int64(delayMilliseconds)}, + }) + require.NoError(t, err) + require.NoError(t, p.Play()) + + for i := range eventCount { + // Consume events in an eventually loop to avoid firing the clock + // events before the timer is set. + require.EventuallyWithT(t, func(t *assert.CollectT) { + clk.Advance(player.MaxIdleTime) + select { + case evt := <-p.C(): + assert.Equal(t, int64(i), evt.GetIndex()) + default: + assert.Fail(t, "expected to receive event after short period, but got nothing") + } + }, 3*time.Second, 100*time.Millisecond) + } +} + // simpleStreamer streams a fake session that contains // count events, emitted at a particular interval type simpleStreamer struct { diff --git a/lib/secretsscanner/authorizedkeys/authorized_keys.go b/lib/secretsscanner/authorizedkeys/authorized_keys.go index f5bd382a9ddd4..43351dd0e43b8 100644 --- a/lib/secretsscanner/authorizedkeys/authorized_keys.go +++ b/lib/secretsscanner/authorizedkeys/authorized_keys.go @@ -28,6 +28,8 @@ import ( "os/user" "path/filepath" "runtime" + "slices" + "sort" "sync" "time" @@ -58,6 +60,8 @@ type Watcher struct { clock clockwork.Clock hostID string getHostUsers func() ([]user.User, error) + // keyNames is the list of key names that have been reported to the cluster. + keyNames []string } // ClusterClient is the client to use to communicate with the cluster. @@ -197,17 +201,15 @@ func (w *Watcher) start(ctx context.Context) error { // maxReSendInterval is the maximum interval to re-send the authorized keys report // to the cluster in case of no changes. const maxReSendInterval = accessgraph.AuthorizedKeyDefaultKeyTTL - 20*time.Minute - timer := w.clock.NewTimer(jitterFunc(maxReSendInterval)) - defer timer.Stop() - for { + expirationTimer := w.clock.NewTimer(jitterFunc(maxReSendInterval)) + defer expirationTimer.Stop() - err := w.fetchAndReportAuthorizedKeys(ctx, fileWatcher) - interval := maxReSendInterval - if err != nil { - w.logger.WarnContext(ctx, "Failed to report authorized keys", "error", err) - interval = maxInitialDelay - } + // monitorTimer is the timer to monitor existing authorized keys. + const monitorTimerInterval = 3 * time.Minute + monitorTimer := w.clock.NewTimer(jitterFunc(monitorTimerInterval)) + defer monitorTimer.Stop() + resetTimer := func(timer clockwork.Timer, interval time.Duration) { if !timer.Stop() { select { case <-timer.Chan(): @@ -215,12 +217,35 @@ func (w *Watcher) start(ctx context.Context) error { } } timer.Reset(jitterFunc(interval)) + } + + var requiresReportToExtendTTL bool + for { + + keysReported, err := w.fetchAndReportAuthorizedKeys(ctx, fileWatcher, requiresReportToExtendTTL) + expirationTimerInterval := maxReSendInterval + if err != nil { + w.logger.WarnContext(ctx, "Failed to report authorized keys", "error", err) + expirationTimerInterval = maxInitialDelay + } + + // reset the mandatory report flag. + requiresReportToExtendTTL = false + + // If the keys were reported, reset the expiration timer. + if keysReported { + resetTimer(expirationTimer, expirationTimerInterval) + } + + resetTimer(monitorTimer, monitorTimerInterval) select { case <-ctx.Done(): return nil case <-reload: - case <-timer.Chan(): + case <-expirationTimer.Chan(): + requiresReportToExtendTTL = true + case <-monitorTimer.Chan(): } } } @@ -234,15 +259,14 @@ func (w *Watcher) isAuthorizedKeysReportEnabled(ctx context.Context) (bool, erro return accessGraphConfig.GetEnabled() && accessGraphConfig.GetSecretsScanConfig().GetSshScanEnabled(), nil } -// fetchAndReportAuthorizedKeys fetches the authorized keys from the system and reports them to the cluster. -func (w *Watcher) fetchAndReportAuthorizedKeys( +// fetchAuthorizedKeys fetches the authorized keys from the system. +func (w *Watcher) fetchAuthorizedKeys( ctx context.Context, fileWatcher *fsnotify.Watcher, -) (returnErr error) { - +) ([]*accessgraphsecretsv1pb.AuthorizedKey, error) { users, err := w.getHostUsers() if err != nil { - return trace.Wrap(err) + return nil, trace.Wrap(err) } var keys []*accessgraphsecretsv1pb.AuthorizedKey for _, u := range users { @@ -272,10 +296,39 @@ func (w *Watcher) fetchAndReportAuthorizedKeys( keys = append(keys, hostKeys...) } } + return keys, nil +} + +// fetchAndReportAuthorizedKeys fetches the authorized keys from the system and reports them to the cluster. +func (w *Watcher) fetchAndReportAuthorizedKeys( + ctx context.Context, + fileWatcher *fsnotify.Watcher, + requiresReportToExtendTTL bool, +) (reported bool, returnErr error) { + + // fetchAuthorizedKeys fetches the authorized keys from the system. + keys, err := w.fetchAuthorizedKeys(ctx, fileWatcher) + if err != nil { + return false, trace.Wrap(err) + } + + // for the given keys, sort the key names and return them. + // This is used to compare the key names with the previously reported key names. + // Key names are hashed fingerprints of the keys and the host user name so they + // are unique per key and user. + keyNames := getSortedKeyNames(keys) + // If the cluster does not require a report to extend the TTL of the authorized keys, + // and the key names are the same, there is no need to report the keys. + if !requiresReportToExtendTTL && slices.Equal(w.keyNames, keyNames) { + return false, nil + } + + // Report the authorized keys to the cluster. + w.keyNames = keyNames stream, err := w.client.AccessGraphSecretsScannerClient().ReportAuthorizedKeys(ctx) if err != nil { - return trace.Wrap(err) + return false, trace.Wrap(err) } defer func() { if closeErr := stream.CloseSend(); closeErr != nil && !errors.Is(closeErr, io.EOF) { @@ -303,16 +356,16 @@ func (w *Watcher) fetchAndReportAuthorizedKeys( Operation: accessgraphsecretsv1pb.OperationType_OPERATION_TYPE_ADD, }, ); err != nil { - return trace.Wrap(err) + return false, trace.Wrap(err) } } if err := stream.Send( &accessgraphsecretsv1pb.ReportAuthorizedKeysRequest{Operation: accessgraphsecretsv1pb.OperationType_OPERATION_TYPE_SYNC}, ); err != nil { - return trace.Wrap(err) + return false, trace.Wrap(err) } - return nil + return true, nil } func (w *Watcher) parseAuthorizedKeysFile(ctx context.Context, u user.User, authorizedKeysPath string) ([]*accessgraphsecretsv1pb.AuthorizedKey, error) { @@ -368,3 +421,12 @@ func getOS(config WatcherConfig) string { } return goos } + +func getSortedKeyNames(keys []*accessgraphsecretsv1pb.AuthorizedKey) []string { + keyNames := make([]string, 0, len(keys)) + for _, key := range keys { + keyNames = append(keyNames, key.GetMetadata().GetName()) + } + sort.Strings(keyNames) + return keyNames +} diff --git a/lib/service/discovery.go b/lib/service/discovery.go index 845c9edbc4de2..b69f5f558994c 100644 --- a/lib/service/discovery.go +++ b/lib/service/discovery.go @@ -98,7 +98,8 @@ func (process *TeleportProcess) initDiscoveryService() error { Emitter: asyncEmitter, AccessPoint: accessPoint, ServerID: process.Config.HostUUID, - Log: process.log, + Log: process.logger, + LegacyLogger: process.log, ClusterName: conn.ClientIdentity.ClusterName, ClusterFeatures: process.GetClusterFeatures, PollInterval: process.Config.Discovery.PollInterval, diff --git a/lib/service/service.go b/lib/service/service.go index 7f0b89e1bc3b1..83c11173898ba 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -160,6 +160,7 @@ import ( "github.com/gravitational/teleport/lib/utils" awsutils "github.com/gravitational/teleport/lib/utils/aws" "github.com/gravitational/teleport/lib/utils/cert" + "github.com/gravitational/teleport/lib/utils/hostid" logutils "github.com/gravitational/teleport/lib/utils/log" vc "github.com/gravitational/teleport/lib/versioncontrol" "github.com/gravitational/teleport/lib/versioncontrol/endpoint" @@ -2830,7 +2831,7 @@ func (process *TeleportProcess) initSSH() error { storagePresence := local.NewPresenceService(process.storage.BackendStorage) // read the host UUID: - serverID, err := utils.ReadOrMakeHostUUID(cfg.DataDir) + serverID, err := hostid.ReadOrCreateFile(cfg.DataDir) if err != nil { return trace.Wrap(err) } @@ -4307,7 +4308,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { } // read the host UUID: - serverID, err := utils.ReadOrMakeHostUUID(cfg.DataDir) + serverID, err := hostid.ReadOrCreateFile(cfg.DataDir) if err != nil { return trace.Wrap(err) } @@ -6307,7 +6308,7 @@ func readOrGenerateHostID(ctx context.Context, cfg *servicecfg.Config, kubeBacke if err := persistHostIDToStorages(ctx, cfg, kubeBackend); err != nil { return trace.Wrap(err) } - } else if kubeBackend != nil && utils.HostUUIDExistsLocally(cfg.DataDir) { + } else if kubeBackend != nil && hostid.ExistsLocally(cfg.DataDir) { // This case is used when loading a Teleport pre-11 agent with storage attached. // In this case, we have to copy the "host_uuid" from the agent to the secret // in case storage is removed later. @@ -6346,14 +6347,14 @@ func readHostIDFromStorages(ctx context.Context, dataDir string, kubeBackend kub } // Even if running in Kubernetes fallback to local storage if `host_uuid` was // not found in secret. - hostID, err := utils.ReadHostUUID(dataDir) + hostID, err := hostid.ReadFile(dataDir) return hostID, trace.Wrap(err) } // persistHostIDToStorages writes the cfg.HostUUID to local data and to // Kubernetes Secret if this process is running on a Kubernetes Cluster. func persistHostIDToStorages(ctx context.Context, cfg *servicecfg.Config, kubeBackend kubernetesBackend) error { - if err := utils.WriteHostUUID(cfg.DataDir, cfg.HostUUID); err != nil { + if err := hostid.WriteFile(cfg.DataDir, cfg.HostUUID); err != nil { if errors.Is(err, fs.ErrPermission) { cfg.Logger.ErrorContext(ctx, "Teleport does not have permission to write to the data directory. Ensure that you are running as a user with appropriate permissions.", "data_dir", cfg.DataDir) } @@ -6372,7 +6373,7 @@ func persistHostIDToStorages(ctx context.Context, cfg *servicecfg.Config, kubeBa // loadHostIDFromKubeSecret reads the host_uuid from the Kubernetes secret with // the expected key: `/host_uuid`. func loadHostIDFromKubeSecret(ctx context.Context, kubeBackend kubernetesBackend) (string, error) { - item, err := kubeBackend.Get(ctx, backend.NewKey(utils.HostUUIDFile)) + item, err := kubeBackend.Get(ctx, backend.NewKey(hostid.FileName)) if err != nil { return "", trace.Wrap(err) } @@ -6385,7 +6386,7 @@ func writeHostIDToKubeSecret(ctx context.Context, kubeBackend kubernetesBackend, _, err := kubeBackend.Put( ctx, backend.Item{ - Key: backend.NewKey(utils.HostUUIDFile), + Key: backend.NewKey(hostid.FileName), Value: []byte(id), }, ) diff --git a/lib/service/service_test.go b/lib/service/service_test.go index b94d776627999..6c5cb7b606e4e 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -69,6 +69,7 @@ import ( "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/local" "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" ) func TestMain(m *testing.M) { @@ -1177,7 +1178,7 @@ func Test_readOrGenerateHostID(t *testing.T) { dataDir := t.TempDir() // write host_uuid file to temp dir. if len(tt.args.hostIDContent) > 0 { - err := utils.WriteHostUUID(dataDir, tt.args.hostIDContent) + err := hostid.WriteFile(dataDir, tt.args.hostIDContent) require.NoError(t, err) } diff --git a/lib/service/servicecfg/auth.go b/lib/service/servicecfg/auth.go index 3663ea25ae0ea..1b09042215aed 100644 --- a/lib/service/servicecfg/auth.go +++ b/lib/service/servicecfg/auth.go @@ -21,7 +21,6 @@ package servicecfg import ( "slices" - "github.com/coreos/go-oidc/oauth2" "github.com/dustin/go-humanize" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" @@ -178,7 +177,14 @@ type HostedPluginsConfig struct { // PluginOAuthProviders holds application credentials for each // 3rd party API provider type PluginOAuthProviders struct { - Slack *oauth2.ClientCredentials + SlackCredentials *OAuthClientCredentials +} + +// OAuthClientCredentials stores the client_id and client_secret +// of an OAuth application. +type OAuthClientCredentials struct { + ClientID string + ClientSecret string } // KeystoreConfig configures the auth keystore. @@ -188,7 +194,7 @@ type KeystoreConfig struct { // GCPKMS holds configuration parameters specific to GCP KMS keystores. GCPKMS GCPKMSConfig // AWSKMS holds configuration parameter specific to AWS KMS keystores. - AWSKMS AWSKMSConfig + AWSKMS *AWSKMSConfig } // CheckAndSetDefaults checks that required parameters of the config are @@ -207,7 +213,7 @@ func (cfg *KeystoreConfig) CheckAndSetDefaults() error { } count++ } - if cfg.AWSKMS != (AWSKMSConfig{}) { + if cfg.AWSKMS != nil { if err := cfg.AWSKMS.CheckAndSetDefaults(); err != nil { return trace.Wrap(err, "validating aws_kms config") } @@ -283,6 +289,11 @@ type AWSKMSConfig struct { // Enabled configures new keys to be multi-region. Enabled bool } + // Tags are key/value pairs used as AWS resource tags. The 'TeleportCluster' + // tag is added automatically if not specified in the set of tags. Changing tags + // after Teleport has already created KMS keys may require manually updating + // the tags of existing keys. + Tags map[string]string } // CheckAndSetDefaults checks that required parameters of the config are diff --git a/lib/services/access_checker.go b/lib/services/access_checker.go index 8091ef220e39e..f1ec3453671cf 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -182,7 +182,11 @@ type AccessChecker interface { CertificateExtensions() []*types.CertExtension // GetAllowedSearchAsRoles returns all of the allowed SearchAsRoles. - GetAllowedSearchAsRoles() []string + GetAllowedSearchAsRoles(allowFilters ...SearchAsRolesOption) []string + + // GetAllowedSearchAsRolesForKubeResourceKind returns all of the allowed SearchAsRoles + // that allowed requesting to the requested Kubernetes resource kind. + GetAllowedSearchAsRolesForKubeResourceKind(requestedKubeResourceKind string) []string // GetAllowedPreviewAsRoles returns all of the allowed PreviewAsRoles. GetAllowedPreviewAsRoles() []string diff --git a/lib/services/access_request.go b/lib/services/access_request.go index 9a62cc22c11f7..de954e629d47d 100644 --- a/lib/services/access_request.go +++ b/lib/services/access_request.go @@ -20,6 +20,7 @@ package services import ( "context" + "fmt" "log/slog" "slices" "sort" @@ -58,6 +59,11 @@ const ( // requestTTL is the TTL for an access request, i.e. the amount of time that // the access request can be reviewed. Defaults to 1 week. requestTTL = 7 * day + + // InvalidKubernetesKindAccessRequest is used in part of error messages related to + // `request.kubernetes_resources` config. It's also used to determine if a returned error + // contains this string (in tests and tsh) to customize error messages shown to user. + InvalidKubernetesKindAccessRequest = `your Teleport role's "request.kubernetes_resources" field` ) // ValidateAccessRequest validates the AccessRequest and sets default values @@ -275,10 +281,10 @@ func CalculateAccessCapabilities(ctx context.Context, clock clockwork.Clock, clt return &caps, nil } -// applicableSearchAsRoles prunes the search_as_roles and only returns those -// applications for the given list of resourceIDs. -func (m *RequestValidator) applicableSearchAsRoles(ctx context.Context, resourceIDs []types.ResourceID, loginHint string) ([]string, error) { - // First, collect all possible search_as_roles. +// allowedSearchAsRoles returns all allowed `allow.request.search_as_roles` for the user that are +// not in the `deny.request.search_as_roles`. It does not filter out any roles that should not be +// allowed based on requests. +func (m *RequestValidator) allowedSearchAsRoles() ([]string, error) { var rolesToRequest []string for _, roleName := range m.Roles.AllowSearch { if !m.CanSearchAsRole(roleName) { @@ -290,9 +296,19 @@ func (m *RequestValidator) applicableSearchAsRoles(ctx context.Context, resource return nil, trace.AccessDenied(`Resource Access Requests require usable "search_as_roles", none found for user %q`, m.userState.GetName()) } + return rolesToRequest, nil +} + +// applicableSearchAsRoles prunes the search_as_roles and only returns those +// applicable for the given list of resourceIDs. +func (m *RequestValidator) applicableSearchAsRoles(ctx context.Context, resourceIDs []types.ResourceID, loginHint string) ([]string, error) { + rolesToRequest, err := m.allowedSearchAsRoles() + if err != nil { + return nil, trace.Wrap(err) + } + // Prune the list of roles to request to only those which may be necessary // to access the requested resources. - var err error rolesToRequest, err = m.pruneResourceRequestRoles(ctx, resourceIDs, loginHint, rolesToRequest) if err != nil { return nil, trace.Wrap(err) @@ -1028,9 +1044,20 @@ type RequestValidator struct { getter RequestValidatorGetter userState UserState requireReason bool - autoRequest bool - prompt string - opts struct { + // Used to enforce that the configuration found in the static + // role that defined the search_as_role, is respected. + // An empty map or list means nothing was configured. + kubernetesResource struct { + // allow is a map from the user's allowed search_as_roles to the list of + // kubernetes resource kinds the user is allowed to request with that role. + allow map[string][]types.RequestKubernetesResource + // deny is the list of kubernetes resource kinds the user is explicitly + // denied from requesting. + deny []types.RequestKubernetesResource + } + autoRequest bool + prompt string + opts struct { expandVars bool } Roles struct { @@ -1081,6 +1108,8 @@ func NewRequestValidator(ctx context.Context, clock clockwork.Clock, getter Requ m.Annotations.Deny = make(map[singleAnnotation]struct{}) } + m.kubernetesResource.allow = make(map[string][]types.RequestKubernetesResource) + // load all statically assigned roles for the user and // use them to build our validation state. for _, roleName := range m.userState.GetRoles() { @@ -1154,6 +1183,17 @@ func (m *RequestValidator) Validate(ctx context.Context, req types.AccessRequest } } + // Verify that each requested role allows requesting every requested kube resource kind. + if len(req.GetRequestedResourceIDs()) > 0 && len(req.GetRoles()) > 0 { + // If there were pruned roles, then the request will be rejected. + // A pruned role meant that role did not allow requesting to all of requested kube resource. + prunedRoles, mappedRequestedRolesToAllowedKinds := m.pruneRequestedRolesNotMatchingKubernetesResourceKinds(req.GetRequestedResourceIDs(), req.GetRoles()) + if len(prunedRoles) != len(req.GetRoles()) { + return getInvalidKubeKindAccessRequestsError(mappedRequestedRolesToAllowedKinds, true /* requestedRoles */) + } + + } + if m.opts.expandVars { // deduplicate requested resource IDs var deduplicated []types.ResourceID @@ -1494,6 +1534,29 @@ func (m *RequestValidator) GetRequestableRoles(ctx context.Context, identity tls return expanded, nil } +// setAllowRequestKubeResourceLookup goes through each search as roles and sets it with the allowed roles. +// Multiple allow request.kubernetes_resources found for a role will be merged, except when an empty configuration +// is encountered. In this case, empty configuration will override configured request field +// (which results in allowing anything). +func setAllowRequestKubeResourceLookup(allowKubernetesResources []types.RequestKubernetesResource, searchAsRoles []string, lookup map[string][]types.RequestKubernetesResource) { + if len(allowKubernetesResources) == 0 { + // Empty configuration overrides any configured request.kubernetes_resources field. + for _, searchAsRoles := range searchAsRoles { + lookup[searchAsRoles] = []types.RequestKubernetesResource{} + } + return + } + + for _, searchAsRole := range searchAsRoles { + currentAllowedResources, exists := lookup[searchAsRole] + if exists && len(currentAllowedResources) == 0 { + // Already allowed to access all kube resource kinds. + continue + } + lookup[searchAsRole] = append(currentAllowedResources, allowKubernetesResources...) + } +} + // push compiles a role's configuration into the request validator. // All of the requesting user's statically assigned roles must be pushed // before validation begins. @@ -1508,6 +1571,12 @@ func (m *RequestValidator) push(ctx context.Context, role types.Role) error { allow, deny := role.GetAccessRequestConditions(types.Allow), role.GetAccessRequestConditions(types.Deny) + setAllowRequestKubeResourceLookup(allow.KubernetesResources, allow.SearchAsRoles, m.kubernetesResource.allow) + + if len(deny.KubernetesResources) > 0 { + m.kubernetesResource.deny = append(m.kubernetesResource.deny, deny.KubernetesResources...) + } + m.Roles.DenyRequest, err = appendRoleMatchers(m.Roles.DenyRequest, deny.Roles, deny.ClaimsToRoles, m.userState.GetTraits()) if err != nil { return trace.Wrap(err) @@ -1593,6 +1662,70 @@ func (m *RequestValidator) setRolesForResourceRequest(ctx context.Context, req t return nil } +// pruneRequestedRolesNotMatchingKubernetesResourceKinds will filter out the kubernetes kinds from the requested resource IDs (kube_cluster and its subresources) +// disregarding whether it's leaf or root cluster request, and for each requested role, ensures that all requested kube resource kind are allowed by the role. +// Roles not matching with every kind requested, will be pruned from the requested roles. +// +// Returns pruned roles, and a map of requested roles with allowed kinds (with denied applied), used to help aid user in case a request gets rejected, +// lets user know which kinds are allowed for each requested roles. +func (m *RequestValidator) pruneRequestedRolesNotMatchingKubernetesResourceKinds(requestedResourceIDs []types.ResourceID, requestedRoles []string) ([]string, map[string][]string) { + // Filter for the kube_cluster and its subresource kinds. + requestedKubeKinds := make(map[string]struct{}) + for _, resourceID := range requestedResourceIDs { + if resourceID.Kind == types.KindKubernetesCluster || slices.Contains(types.KubernetesResourcesKinds, resourceID.Kind) { + requestedKubeKinds[resourceID.Kind] = struct{}{} + } + } + + if len(requestedKubeKinds) == 0 { + return requestedRoles, nil + } + + goodRolesLookup := make(map[string]struct{}) + mappedRequestedRolesToAllowedKinds := make(map[string][]string) + for _, requestedRoleName := range requestedRoles { + allowedKinds, deniedKinds := getKubeResourceKinds(m.kubernetesResource.allow[requestedRoleName]), getKubeResourceKinds(m.kubernetesResource.deny) + + // Any resource is allowed. + if len(allowedKinds) == 0 && len(deniedKinds) == 0 { + goodRolesLookup[requestedRoleName] = struct{}{} + continue + } + + // All supported kube kinds are allowed when there was nothing configured. + if len(allowedKinds) == 0 { + allowedKinds = types.KubernetesResourcesKinds + allowedKinds = append(allowedKinds, types.KindKubernetesCluster) + } + + // Filter out denied kinds from the allowed kinds + if len(deniedKinds) > 0 && len(allowedKinds) > 0 { + allowedKinds = getAllowedKubeResourceKinds(allowedKinds, deniedKinds) + } + + mappedRequestedRolesToAllowedKinds[requestedRoleName] = allowedKinds + + roleIsDenied := false + for requestedKubeKind := range requestedKubeKinds { + if !slices.Contains(allowedKinds, requestedKubeKind) { + roleIsDenied = true + continue + } + } + + if !roleIsDenied { + goodRolesLookup[requestedRoleName] = struct{}{} + } + } + + goodRoles := make([]string, 0, len(goodRolesLookup)) + for key := range goodRolesLookup { + goodRoles = append(goodRoles, key) + } + + return goodRoles, mappedRequestedRolesToAllowedKinds +} + // thresholdCollector is a helper that assembles the Thresholds array for a request. // the push() method is used to insert groups of related thresholds and calculate their // corresponding index set. @@ -1900,17 +2033,40 @@ func UnmarshalAccessRequestAllowedPromotion(data []byte) (*types.AccessRequestAl return &accessListIDs, nil } -// pruneResourceRequestRoles takes an access request and does one of two things: -// 1. If it is a role request, returns it unchanged. -// 2. If it is a resource request, all available `search_as_roles` for the user -// should have been populated on the request by `ValidateAccessReqeustForUser`. -// This function will attempt to prune these roles to a minimal necessary set -// based on the following rules: -// - If a role does not grant access to any resources in the set, it is pruned. -// - If the request includes a LoginHint, access to a node with that login -// should be satisfied by exactly 1 role. The first such role will be -// requested, all others will be pruned unless they are necessary to access -// a different resource in the set. +func getInvalidKubeKindAccessRequestsError(mappedRequestedRolesToAllowedKinds map[string][]string, requestedRoles bool) error { + allowedStr := "" + for roleName, allowedKinds := range mappedRequestedRolesToAllowedKinds { + if len(allowedStr) > 0 { + allowedStr = fmt.Sprintf("%s, %s: %v", allowedStr, roleName, allowedKinds) + } else { + allowedStr = fmt.Sprintf("%s: %v", roleName, allowedKinds) + } + } + + requestWord := "requestable" + if requestedRoles { + requestWord = "requested" + } + + // This error must be in sync with web UI's RequestCheckout.tsx ("checkSupportForKubeResources"). + // Web UI relies on the exact format of this error message to determine what kube kinds are + // supported since web UI does not support all kube resources at this time. + return trace.BadParameter(`%s did not allow requesting to some or all of the requested `+ + `Kubernetes resources. allowed kinds for each %s roles: %v`, + InvalidKubernetesKindAccessRequest, requestWord, allowedStr) +} + +// pruneResourceRequestRoles takes a list of requested resource IDs and +// a list of candidate roles to request, and returns a "pruned" list of roles. +// +// Candidate roles are *always* pruned when the user is not allowed to +// request the role with all requested resources. +// +// A best-effort attempt is made to prune roles that would not allow +// access to any of the requested resources, this is skipped when any +// resource is in a leaf cluster. +// +// If loginHint is provided, it will attempt to prune the list to a single role. func (m *RequestValidator) pruneResourceRequestRoles( ctx context.Context, resourceIDs []types.ResourceID, @@ -1922,6 +2078,12 @@ func (m *RequestValidator) pruneResourceRequestRoles( return roles, nil } + var mappedRequestedRolesToAllowedKinds map[string][]string + roles, mappedRequestedRolesToAllowedKinds = m.pruneRequestedRolesNotMatchingKubernetesResourceKinds(resourceIDs, roles) + if len(roles) == 0 { // all roles got pruned from not matching every kube requested kind. + return nil, getInvalidKubeKindAccessRequestsError(mappedRequestedRolesToAllowedKinds, false /* requestedRoles */) + } + clusterNameResource, err := m.getter.GetClusterName() if err != nil { return nil, trace.Wrap(err) @@ -1961,6 +2123,7 @@ func (m *RequestValidator) pruneResourceRequestRoles( if len(kubernetesResources) > 0 { resourceMatcher = NewKubeResourcesMatcher(kubernetesResources) } + for _, role := range allRoles { roleAllowsAccess, err := m.roleAllowsResource(ctx, role, resource, loginHint, resourceMatcherToMatcherSlice(resourceMatcher)...) if err != nil { @@ -2042,6 +2205,37 @@ func countAllowedLogins(role types.Role) int { return len(allowed) } +// getKubeResourceKinds just extracts the kinds from the list. +// If a wildcard is present, then all supported resource types are returned. +func getKubeResourceKinds(kubernetesResources []types.RequestKubernetesResource) []string { + var kinds []string + for _, rm := range kubernetesResources { + if rm.Kind == types.Wildcard { + return types.KubernetesResourcesKinds + } + kinds = append(kinds, rm.Kind) + } + return kinds +} + +// getAllowedKubeResourceKinds returns only the allowed kinds that were not in the +// denied list. +func getAllowedKubeResourceKinds(allowedKinds []string, deniedKinds []string) []string { + allowedLookup := make(map[string]struct{}, len(allowedKinds)) + for _, kind := range allowedKinds { + allowedLookup[kind] = struct{}{} + } + for _, kind := range deniedKinds { + delete(allowedLookup, kind) + } + + allowed := make([]string, 0, len(allowedLookup)) + for key := range allowedLookup { + allowed = append(allowed, key) + } + return allowed +} + func (m *RequestValidator) roleAllowsResource( ctx context.Context, role types.Role, diff --git a/lib/services/access_request_test.go b/lib/services/access_request_test.go index d761c95f6a6cc..e79f278dce36a 100644 --- a/lib/services/access_request_test.go +++ b/lib/services/access_request_test.go @@ -2556,6 +2556,589 @@ func TestValidate_RequestedPendingTTLAndMaxDuration(t *testing.T) { require.Equal(t, now.Add(requestedPendingTTL), req.Expiry()) } +// TestValidate_WithAllowRequestKubernetesResources tests that requests containing +// kubernetes resources, the kinds are enforced defined by users static role +// field `request.kubernetes_resources` +func TestValidate_WithAllowRequestKubernetesResources(t *testing.T) { + myClusterName := "teleport-cluster" + + // set up test roles + roleDesc := map[string]types.RoleSpecV6{ + "kube-access-wildcard": { + Allow: types.RoleConditions{ + KubernetesLabels: types.Labels{ + "*": {"*"}, + }, + KubernetesResources: []types.KubernetesResource{ + {Kind: "*", Namespace: "*", Name: "*", Verbs: []string{"*"}}, + }, + }, + }, + "kube-no-access": { + Allow: types.RoleConditions{}, + }, + "kube-access-namespace": { + Allow: types.RoleConditions{ + KubernetesLabels: types.Labels{ + "*": {"*"}, + }, + KubernetesResources: []types.KubernetesResource{ + {Kind: types.KindNamespace, Namespace: "*", Name: "*", Verbs: []string{"*"}}, + }, + }, + }, + "kube-access-pod": { + Allow: types.RoleConditions{ + KubernetesLabels: types.Labels{ + "*": {"*"}, + }, + KubernetesResources: []types.KubernetesResource{ + {Kind: types.KindKubePod, Namespace: "*", Name: "*", Verbs: []string{"*"}}, + }, + }, + }, + "kube-access-deployment": { + Allow: types.RoleConditions{ + KubernetesLabels: types.Labels{ + "*": {"*"}, + }, + KubernetesResources: []types.KubernetesResource{ + {Kind: types.KindKubeDeployment, Namespace: "*", Name: "*", Verbs: []string{"*"}}, + }, + }, + }, + "db-access-wildcard": { + Allow: types.RoleConditions{ + DatabaseLabels: types.Labels{ + "*": {"*"}, + }, + }, + }, + + "request-undefined_search-wildcard": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-wildcard", "db-access-wildcard"}, + }, + }, + }, + "request-pod_search-as-roles-undefined": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubePod}, + }, + }, + }, + }, + "request-namespace_search-namespace": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-namespace", "db-access-wildcard"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubeNamespace}, + }, + }, + }, + }, + // Allows requesting for any subresources, but NOT kube_cluster + "request-wildcard_search-wildcard": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-wildcard", "db-access-wildcard"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.Wildcard}, + }, + }, + }, + }, + // Allows wildcard search, but should only accept kube secret + "request-secret_search-wildcard": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-wildcard"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubeSecret}, + }, + }, + }, + }, + "request-pod_search-pods": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-pod"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubePod}, + }, + }, + }, + }, + "request-deployment_search-deployment": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-deployment"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubeDeployment}, + }, + }, + }, + }, + "request-deployment-pod_search-deployment-pod": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-deployment", "kube-access-pod"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubeDeployment}, + {Kind: types.KindKubePod}, + }, + }, + }, + }, + "request-namespace-but-no-access": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"db-access-wildcard", "kube-no-access"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindNamespace}, + }, + }, + }, + }, + "request-namespace_search-namespace_deny-secret": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-namespace"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindNamespace}, + }, + }, + }, + Deny: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubeSecret}, + }, + }, + }, + }, + "request-undefined_search-wildcard_deny-deployment-pod": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-wildcard"}, + }, + }, + Deny: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubeDeployment}, + {Kind: types.KindKubePod}, + }, + }, + }, + }, + "request-wildcard-cancels-deny-wildcard": { + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: []string{"kube-access-namespace"}, + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.Wildcard}, + }, + }, + }, + Deny: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.Wildcard}, + }, + }, + }, + }, + } + roles := make(map[string]types.Role) + for name, spec := range roleDesc { + role, err := types.NewRole(name, spec) + require.NoError(t, err) + roles[name] = role + } + + // Define a kube server + kube, err := types.NewKubernetesClusterV3(types.Metadata{ + Name: "kube", + }, + types.KubernetesClusterSpecV3{}, + ) + require.NoError(t, err) + kubeServer, err := types.NewKubernetesServerV3FromCluster(kube, "_", "_") + require.NoError(t, err) + + // Define a db server + db, err := types.NewDatabaseV3(types.Metadata{ + Name: "db", + }, types.DatabaseSpecV3{ + Protocol: "postgres", + URI: "example.com:3000", + }) + require.NoError(t, err) + dbServer, err := types.NewDatabaseServerV3(types.Metadata{ + Name: db.GetName(), + }, types.DatabaseServerSpecV3{ + HostID: "db-server", + Hostname: "db-server", + Database: db, + }) + require.NoError(t, err) + + // start test + testCases := []struct { + desc string + userStaticRoles []string + requestResourceIDs []types.ResourceID + requestRoles []string + wantInvalidRequestKindErr bool + wantNoRolesConfiguredErr bool + expectedRequestRoles []string + }{ + { + desc: "request.kubernetes_resources undefined allows anything (kube_cluster and its subresources)", + userStaticRoles: []string{"request-undefined_search-wildcard"}, + expectedRequestRoles: []string{"kube-access-wildcard", "db-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + }, + }, + { + desc: "request.kubernetes_resources undefined takes precedence over configured allow field (allows anything)", + userStaticRoles: []string{"request-undefined_search-wildcard", "request-secret_search-wildcard"}, + expectedRequestRoles: []string{"kube-access-wildcard", "db-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + }, + }, + { + desc: "configured deny request.kubernetes_resources takes precedence over undefined deny field", + userStaticRoles: []string{"request-wildcard-cancels-deny-wildcard", "request-namespace_search-namespace"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "request.kubernetes_resources does not get applied with a role without search_as_roles defined", + userStaticRoles: []string{"request-namespace_search-namespace", "request-pod_search-as-roles-undefined"}, + expectedRequestRoles: []string{"kube-access-namespace", "db-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + }, + }, + { + desc: "wildcard allows any kube subresources", + userStaticRoles: []string{"request-wildcard_search-wildcard"}, + expectedRequestRoles: []string{"kube-access-wildcard", "db-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeSecret, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/secret-name"}, + }, + }, + { + desc: "wildcard rejects kube_cluster kind among other valid requests", + userStaticRoles: []string{"request-wildcard_search-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "wildcard rejects single kube_cluster request", + userStaticRoles: []string{"request-wildcard_search-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "error with `no roles configured` if search_as_roles does not grant kube resource access", + userStaticRoles: []string{"request-namespace-but-no-access"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + }, + wantNoRolesConfiguredErr: true, + }, + { + desc: "prune search_as_roles that does not meet request.kubernetes_resources (unconfigured field)", + // search as role "kube-access-namespace" got pruned b/c the request included "kube_cluster" which wasn't allowed. + userStaticRoles: []string{"request-undefined_search-wildcard", "request-namespace_search-namespace"}, + expectedRequestRoles: []string{"kube-access-wildcard", "db-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + }, + }, + { + desc: "prune search_as_roles that does not match request.kubernetes_resources field", + userStaticRoles: []string{ + "request-pod_search-pods", + "request-namespace_search-namespace", + "request-deployment_search-deployment", + }, + expectedRequestRoles: []string{"kube-access-namespace", "db-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + }, + }, + { + desc: "reject when kinds don't match (root only)", + userStaticRoles: []string{ + "request-pod_search-pods", + "request-namespace_search-namespace", + "request-deployment_search-deployment", + }, + expectedRequestRoles: []string{"kube-access-pod", "kube-access-namespace", "db-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindDatabase, ClusterName: myClusterName, Name: "db"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubePod, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/pod-name"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "reject when kinds don't match (leaf only)", + userStaticRoles: []string{ + "request-pod_search-pods", + "request-namespace_search-namespace", + "request-deployment_search-deployment", + }, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindDatabase, ClusterName: "some-leaf", Name: "db2"}, + {Kind: types.KindKubeSecret, ClusterName: "some-leaf", Name: "leaf-kube", SubResourceName: "namespace/secret-name"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "reject when kinds don't match (mix of leaf and root cluster)", + userStaticRoles: []string{ + "request-pod_search-pods", + "request-namespace_search-namespace", + "request-deployment_search-deployment", + }, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeDeployment, ClusterName: "some-leaf", Name: "kube", SubResourceName: "namespace/secret-name"}, + {Kind: types.KindNamespace, ClusterName: "some-leaf", Name: "kube-leaf", SubResourceName: "namespace"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "prune roles that does not give you access", + userStaticRoles: []string{ + "request-namespace_search-namespace", + "request-namespace-but-no-access", + "request-deployment_search-deployment", + }, + expectedRequestRoles: []string{"kube-access-namespace"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace2"}, + }, + }, + { + desc: "don't further prune roles when leaf requests are present", + userStaticRoles: []string{ + "request-namespace_search-namespace", + "request-namespace-but-no-access", + "request-deployment_search-deployment", + }, + // db-access-wildcard and kube-no-access shouldn't be in the list, but a leaf is present + // which skips matcher tests. + expectedRequestRoles: []string{"kube-access-namespace", "db-access-wildcard", "kube-no-access"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace2"}, + {Kind: types.KindNamespace, ClusterName: "some-leaf", Name: "kube-leaf", SubResourceName: "namespace"}, + }, + }, + { + desc: "reject if kinds don't match even though search_as_roles allows wildcard access", + userStaticRoles: []string{"request-secret_search-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "some-namespace"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "allow namespace request when deny is not matched", + userStaticRoles: []string{"request-namespace_search-namespace_deny-secret"}, + expectedRequestRoles: []string{"kube-access-namespace"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace2"}, + }, + }, + { + desc: "allow namespace request when deny is not matched with leaf clusters", + userStaticRoles: []string{"request-namespace_search-namespace_deny-secret"}, + expectedRequestRoles: []string{"kube-access-namespace"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: "leaf-cluster", Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeNamespace, ClusterName: "leaf-cluster", Name: "kube", SubResourceName: "namespace2"}, + }, + }, + { + desc: "allow a list of different request.kubernetes_resources from same role", + userStaticRoles: []string{"request-deployment-pod_search-deployment-pod", "request-namespace_search-namespace"}, + expectedRequestRoles: []string{"kube-access-deployment", "kube-access-pod"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeDeployment, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/deployment"}, + {Kind: types.KindKubePod, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/pod"}, + }, + }, + { + desc: "deny request when deny is defined from another role (denies are globally matched)", + userStaticRoles: []string{"request-namespace_search-namespace_deny-secret", "request-secret_search-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeSecret, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/secret-name"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "allow wildcard request when deny is not matched", + userStaticRoles: []string{"request-undefined_search-wildcard_deny-deployment-pod"}, + expectedRequestRoles: []string{"kube-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + }, + }, + { + desc: "deny wildcard request when deny is matched", + userStaticRoles: []string{"request-undefined_search-wildcard_deny-deployment-pod"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + {Kind: types.KindKubeDeployment, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/deployment"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "request.kubernetes_resources cancel each other (config error where no kube resources becomes requestable)", + userStaticRoles: []string{"request-wildcard-cancels-deny-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeDeployment, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/deployment"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "request.kubernetes_resources cancel each other also rejects kube_cluster kinds (config error)", + userStaticRoles: []string{"request-wildcard-cancels-deny-wildcard"}, + expectedRequestRoles: []string{"kube-access-wildcard"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubernetesCluster, ClusterName: myClusterName, Name: "kube"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "allow when requested role matches requested kinds", + userStaticRoles: []string{ + "request-namespace_search-namespace", + "request-namespace-but-no-access", + "request-deployment_search-deployment", + }, + requestRoles: []string{"kube-access-namespace"}, + expectedRequestRoles: []string{"kube-access-namespace"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace2"}, + }, + }, + { + desc: "reject when requested role does not match ALL requested kinds", + userStaticRoles: []string{ + "request-namespace_search-namespace", + "request-namespace-but-no-access", + "request-deployment_search-deployment", + }, + requestRoles: []string{"kube-access-namespace", "kube-access-deployment"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace2"}, + }, + wantInvalidRequestKindErr: true, + }, + { + desc: "reject when requested role does not allow all requested kinds", + userStaticRoles: []string{ + "request-namespace_search-namespace", + "request-namespace-but-no-access", + "request-deployment_search-deployment", + }, + requestRoles: []string{"kube-access-namespace"}, + requestResourceIDs: []types.ResourceID{ + {Kind: types.KindKubeNamespace, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace"}, + {Kind: types.KindKubeDeployment, ClusterName: myClusterName, Name: "kube", SubResourceName: "namespace/deployment"}, + }, + wantInvalidRequestKindErr: true, + }, + } + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + uls, err := userloginstate.New(header.Metadata{ + Name: "test-user", + }, userloginstate.Spec{ + Roles: tc.userStaticRoles, + }) + require.NoError(t, err) + userStates := map[string]*userloginstate.UserLoginState{ + uls.GetName(): uls, + } + + g := &mockGetter{ + roles: roles, + userStates: userStates, + clusterName: myClusterName, + kubeServers: make(map[string]types.KubeServer), + dbServers: make(map[string]types.DatabaseServer), + } + g.kubeServers[kube.GetName()] = kubeServer + g.dbServers[dbServer.GetName()] = dbServer + + req, err := types.NewAccessRequestWithResources( + "some-id", uls.GetName(), tc.requestRoles, tc.requestResourceIDs) + require.NoError(t, err) + + clock := clockwork.NewFakeClock() + identity := tlsca.Identity{ + Expires: clock.Now().UTC().Add(8 * time.Hour), + } + + validator, err := NewRequestValidator(context.Background(), clock, g, uls.GetName(), ExpandVars(true)) + require.NoError(t, err) + + err = validator.Validate(context.Background(), req, identity) + if tc.wantInvalidRequestKindErr { + require.Error(t, err) + require.Contains(t, err.Error(), InvalidKubernetesKindAccessRequest) + } else if tc.wantNoRolesConfiguredErr { + require.Error(t, err) + require.Contains(t, err.Error(), `no roles configured in the "search_as_roles"`) + } else { + require.NoError(t, err) + require.ElementsMatch(t, tc.expectedRequestRoles, req.GetRoles()) + } + }) + } +} + type roleTestSet map[string]struct { condition types.RoleConditions options types.RoleOptions diff --git a/lib/services/local/trust.go b/lib/services/local/trust.go index 2a2e454cdcb19..1b867c45b6884 100644 --- a/lib/services/local/trust.go +++ b/lib/services/local/trust.go @@ -232,13 +232,6 @@ func (s *CA) UpsertCertAuthority(ctx context.Context, ca types.CertAuthority) er return trace.Wrap(err) } - // try to skip writes that would have no effect - if existing, err := s.GetCertAuthority(ctx, ca.GetID(), true); err == nil { - if services.CertAuthoritiesEquivalent(existing, ca) { - return nil - } - } - item, err := caToItem(activeCAKey(ca.GetID()), ca) if err != nil { return trace.Wrap(err) diff --git a/lib/services/oidc.go b/lib/services/oidc.go index 27e7e9e2260b6..721230fa7afa4 100644 --- a/lib/services/oidc.go +++ b/lib/services/oidc.go @@ -21,40 +21,12 @@ package services import ( "net/url" - "github.com/coreos/go-oidc/jose" "github.com/gravitational/trace" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/utils" ) -// GetClaimNames returns a list of claim names from the claim values -func GetClaimNames(claims jose.Claims) []string { - var out []string - for claim := range claims { - out = append(out, claim) - } - return out -} - -// OIDCClaimsToTraits converts OIDC-style claims into teleport-specific trait format -func OIDCClaimsToTraits(claims jose.Claims) map[string][]string { - traits := make(map[string][]string) - - for claimName := range claims { - claimValue, ok, _ := claims.StringClaim(claimName) - if ok { - traits[claimName] = []string{claimValue} - } - claimValues, ok, _ := claims.StringsClaim(claimName) - if ok { - traits[claimName] = claimValues - } - } - - return traits -} - // GetRedirectURL gets a redirect URL for the given connector. If the connector // has a redirect URL which matches the host of the given Proxy address, then // that one will be returned. Otherwise, the first URL in the list will be returned. diff --git a/lib/services/oidc_test.go b/lib/services/oidc_test.go index ca3dd2f048a96..7504e24398fcf 100644 --- a/lib/services/oidc_test.go +++ b/lib/services/oidc_test.go @@ -21,7 +21,6 @@ package services import ( "testing" - "github.com/coreos/go-oidc/jose" "github.com/gravitational/trace" "github.com/stretchr/testify/require" @@ -29,35 +28,6 @@ import ( "github.com/gravitational/teleport/api/types" ) -// TestOIDCRoleMapping verifies basic mapping from OIDC claims to roles. -func TestOIDCRoleMapping(t *testing.T) { - // create a connector - oidcConnector, err := types.NewOIDCConnector("example", types.OIDCConnectorSpecV3{ - IssuerURL: "https://www.exmaple.com", - ClientID: "example-client-id", - ClientSecret: "example-client-secret", - Display: "sign in with example.com", - Scope: []string{"foo", "bar"}, - ClaimsToRoles: []types.ClaimMapping{{Claim: "roles", Value: "teleport-user", Roles: []string{"user"}}}, - RedirectURLs: []string{"https://localhost:3080/v1/webapi/oidc/callback"}, - }) - require.NoError(t, err) - - // create some claims - var claims = make(jose.Claims) - claims.Add("roles", "teleport-user") - claims.Add("email", "foo@example.com") - claims.Add("nickname", "foo") - claims.Add("full_name", "foo bar") - - traits := OIDCClaimsToTraits(claims) - require.Len(t, traits, 4) - - _, roles := TraitsToRoles(oidcConnector.GetTraitMappings(), traits) - require.Len(t, roles, 1) - require.Equal(t, "user", roles[0]) -} - // TestOIDCUnmarshal tests UnmarshalOIDCConnector func TestOIDCUnmarshal(t *testing.T) { for _, tc := range []struct { diff --git a/lib/services/role.go b/lib/services/role.go index 9e82b812cf0f7..15e82fc1cdda6 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -3234,8 +3234,11 @@ func (set RoleSet) ExtractConditionForIdentifier(ctx RuleContext, namespace, res return &types.WhereExpr{And: types.WhereExpr2{L: denyCond, R: allowCond}}, nil } +// SearchAsRolesOption is a functional option for filtering SearchAsRoles. +type SearchAsRolesOption func(role types.Role) bool + // GetSearchAsRoles returns all SearchAsRoles for this RoleSet. -func (set RoleSet) GetAllowedSearchAsRoles() []string { +func (set RoleSet) GetAllowedSearchAsRoles(allowFilters ...SearchAsRolesOption) []string { denied := make(map[string]struct{}) var allowed []string for _, role := range set { @@ -3244,15 +3247,55 @@ func (set RoleSet) GetAllowedSearchAsRoles() []string { } } for _, role := range set { + if slices.ContainsFunc(allowFilters, func(filter SearchAsRolesOption) bool { + return !filter(role) + }) { + // Don't consider this base role if it's filtered out. + continue + } for _, a := range role.GetSearchAsRoles(types.Allow) { - if _, ok := denied[a]; !ok { - allowed = append(allowed, a) + if _, isDenied := denied[a]; isDenied { + continue } + allowed = append(allowed, a) } } return apiutils.Deduplicate(allowed) } +// GetAllowedSearchAsRolesForKubeResourceKind returns all of the allowed SearchAsRoles +// that allowed requesting to the requested Kubernetes resource kind. +func (set RoleSet) GetAllowedSearchAsRolesForKubeResourceKind(requestedKubeResourceKind string) []string { + // Return no results if encountering any denies since its globally matched. + for _, role := range set { + for _, kr := range role.GetAccessRequestConditions(types.Deny).KubernetesResources { + if kr.Kind == types.Wildcard || kr.Kind == requestedKubeResourceKind { + return nil + } + } + } + return set.GetAllowedSearchAsRoles(WithAllowedKubernetesResourceKindFilter(requestedKubeResourceKind)) +} + +// WithAllowedKubernetesResourceKindFilter returns a SearchAsRolesOption func +// that will check that the requestedKubeResourceKind exists in the allow list +// for the current role. +func WithAllowedKubernetesResourceKindFilter(requestedKubeResourceKind string) SearchAsRolesOption { + return func(role types.Role) bool { + allowed := role.GetAccessRequestConditions(types.Allow).KubernetesResources + // any kind is allowed if nothing was configured. + if len(allowed) == 0 { + return true + } + for _, kr := range role.GetAccessRequestConditions(types.Allow).KubernetesResources { + if kr.Kind == types.Wildcard || kr.Kind == requestedKubeResourceKind { + return true + } + } + return false + } +} + // GetAllowedPreviewAsRoles returns all PreviewAsRoles for this RoleSet. func (set RoleSet) GetAllowedPreviewAsRoles() []string { denied := make(map[string]struct{}) diff --git a/lib/services/role_test.go b/lib/services/role_test.go index 489894389ada6..9360d601bd5d9 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -189,6 +189,40 @@ func TestRoleParse(t *testing.T) { error: trace.BadParameter(""), matchMessage: "KubernetesResource must include Namespace", }, + { + name: "validation error, invalid kubernetes_resources kind", + in: `{ + "kind": "role", + "version": "v6", + "metadata": {"name": "name1"}, + "spec": { + "allow": { + "request": { + "kubernetes_resources": [{"kind":"abcd"}] + } + } + } + }`, + error: trace.BadParameter(""), + matchMessage: "invalid or unsupported", + }, + { + name: "validation error, kubernetes_resources kind namespace not supported in v6", + in: `{ + "kind": "role", + "version": "v6", + "metadata": {"name": "name1"}, + "spec": { + "allow": { + "request": { + "kubernetes_resources": [{"kind":"namespace"}] + } + } + } + }`, + error: trace.BadParameter(""), + matchMessage: "not supported in role version \"v6\"", + }, { name: "validation error, missing podname in pod names", in: `{ @@ -318,46 +352,52 @@ func TestRoleParse(t *testing.T) { { name: "full valid role v6", in: `{ - "kind": "role", - "version": "v6", - "metadata": {"name": "name1", "labels": {"a-b": "c"}}, - "spec": { - "options": { - "cert_format": "standard", - "max_session_ttl": "20h", - "port_forwarding": true, - "client_idle_timeout": "17m", - "disconnect_expired_cert": "yes", - "enhanced_recording": ["command", "network"], - "desktop_clipboard": true, - "desktop_directory_sharing": true, - "ssh_file_copy" : false + "kind": "role", + "version": "v6", + "metadata": {"name": "name1", "labels": {"a-b": "c"}}, + "spec": { + "options": { + "cert_format": "standard", + "max_session_ttl": "20h", + "port_forwarding": true, + "client_idle_timeout": "17m", + "disconnect_expired_cert": "yes", + "enhanced_recording": ["command", "network"], + "desktop_clipboard": true, + "desktop_directory_sharing": true, + "ssh_file_copy" : false + }, + "allow": { + "request": { + "kubernetes_resources": [{"kind":"pod"}] }, - "allow": { - "node_labels": {"a": "b", "c-d": "e"}, - "app_labels": {"a": "b", "c-d": "e"}, - "group_labels": {"a": "b", "c-d": "e"}, - "kubernetes_labels": {"a": "b", "c-d": "e"}, - "db_labels": {"a": "b", "c-d": "e"}, - "db_names": ["postgres"], - "db_users": ["postgres"], - "namespaces": ["default"], - "rules": [ - { - "resources": ["role"], - "verbs": ["read", "list"], - "where": "contains(user.spec.traits[\"groups\"], \"prod\")", - "actions": [ - "log(\"info\", \"log entry\")" - ] - } - ] + "node_labels": {"a": "b", "c-d": "e"}, + "app_labels": {"a": "b", "c-d": "e"}, + "group_labels": {"a": "b", "c-d": "e"}, + "kubernetes_labels": {"a": "b", "c-d": "e"}, + "db_labels": {"a": "b", "c-d": "e"}, + "db_names": ["postgres"], + "db_users": ["postgres"], + "namespaces": ["default"], + "rules": [ + { + "resources": ["role"], + "verbs": ["read", "list"], + "where": "contains(user.spec.traits[\"groups\"], \"prod\")", + "actions": [ + "log(\"info\", \"log entry\")" + ] + } + ] + }, + "deny": { + "request": { + "kubernetes_resources": [{"kind":"pod"}] }, - "deny": { - "logins": ["c"] - } + "logins": ["c"] } - }`, + } + }`, role: types.RoleV6{ Kind: types.KindRole, Version: types.V6, @@ -409,10 +449,20 @@ func TestRoleParse(t *testing.T) { }, }, }, + Request: &types.AccessRequestConditions{ + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubePod}, + }, + }, }, Deny: types.RoleConditions{ Namespaces: []string{apidefaults.Namespace}, Logins: []string{"c"}, + Request: &types.AccessRequestConditions{ + KubernetesResources: []types.RequestKubernetesResource{ + {Kind: types.KindKubePod}, + }, + }, }, }, }, @@ -4491,6 +4541,91 @@ func TestGetAllowedLoginsForResource(t *testing.T) { } } +func TestGetAllowedSearchAsRoles_WithAllowedKubernetesResourceKindFilter(t *testing.T) { + newRole := func( + allowRoles []string, + denyRoles []string, + allowedResources []types.RequestKubernetesResource, + deniedResources []types.RequestKubernetesResource, + ) *types.RoleV6 { + return &types.RoleV6{ + Spec: types.RoleSpecV6{ + Allow: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: allowRoles, + KubernetesResources: allowedResources, + }, + }, + Deny: types.RoleConditions{ + Request: &types.AccessRequestConditions{ + SearchAsRoles: denyRoles, + KubernetesResources: deniedResources, + }, + }, + }, + } + } + + roleWithNamespace := newRole([]string{"sar1"}, nil, []types.RequestKubernetesResource{{Kind: types.KindNamespace}}, []types.RequestKubernetesResource{}) + roleWithSecret := newRole([]string{"sar2"}, nil, []types.RequestKubernetesResource{{Kind: types.KindKubeSecret}}, []types.RequestKubernetesResource{}) + roleWithNoConfigure := newRole([]string{"sar3"}, nil, nil, nil) + roleWithDenyRole := newRole([]string{"sar4", "sar5", "sar6", "sar7"}, []string{"sar4", "sar6"}, []types.RequestKubernetesResource{{Kind: types.KindNamespace}, {Kind: types.KindKubePod}}, []types.RequestKubernetesResource{{Kind: types.KindKubePod}}) + roleWithDenyWildcard := newRole([]string{"sar10"}, nil, []types.RequestKubernetesResource{{Kind: types.KindNamespace}}, []types.RequestKubernetesResource{{Kind: types.Wildcard}}) + roleWithAllowWildcard := newRole([]string{"sar4", "sar5"}, nil, []types.RequestKubernetesResource{{Kind: types.Wildcard}}, nil) + + tt := []struct { + name string + roleSet RoleSet + requestType string + expectedAllowedRoles []string + }{ + { + name: "single match", + roleSet: NewRoleSet(roleWithNamespace, roleWithSecret), + requestType: types.KindKubeSecret, + expectedAllowedRoles: []string{"sar2"}, + }, + { + name: "multi match", + roleSet: NewRoleSet(roleWithNamespace, roleWithNoConfigure), + requestType: types.KindNamespace, + expectedAllowedRoles: []string{"sar1", "sar3"}, + }, + { + name: "wildcard allow", + roleSet: NewRoleSet(roleWithAllowWildcard, roleWithNamespace), + requestType: types.KindNamespace, + expectedAllowedRoles: []string{"sar1", "sar4", "sar5"}, + }, + { + name: "wildcard deny", + roleSet: NewRoleSet(roleWithAllowWildcard, roleWithDenyWildcard), + requestType: types.KindNamespace, + expectedAllowedRoles: []string{}, + }, + { + name: "wildcard deny with unconfigured allow", + roleSet: NewRoleSet(roleWithNoConfigure, roleWithDenyWildcard), + requestType: types.KindNamespace, + expectedAllowedRoles: []string{}, + }, + { + name: "with deny role", + roleSet: NewRoleSet(roleWithDenyRole, roleWithNamespace), + requestType: types.KindNamespace, + expectedAllowedRoles: []string{"sar5", "sar7", "sar1"}, + }, + } + for _, tc := range tt { + accessChecker := makeAccessCheckerWithRoleSet(tc.roleSet) + t.Run(tc.name, func(t *testing.T) { + + allowedRoles := accessChecker.GetAllowedSearchAsRolesForKubeResourceKind(tc.requestType) + require.ElementsMatch(t, tc.expectedAllowedRoles, allowedRoles) + }) + } +} + // mustMakeTestServer creates a server with labels and an empty spec. // It panics in case of an error. Used only for testing func mustMakeTestServer(labels map[string]string) types.Server { diff --git a/lib/services/user_test.go b/lib/services/user_test.go index 7e64cc25ec965..4f47f15c72aa3 100644 --- a/lib/services/user_test.go +++ b/lib/services/user_test.go @@ -273,7 +273,7 @@ func TestOIDCMapping(t *testing.T) { } for _, input := range testCase.inputs { comment := fmt.Sprintf("OIDC Test case %v %q, input %q", i, testCase.comment, input.comment) - _, outRoles := TraitsToRoles(conn.GetTraitMappings(), OIDCClaimsToTraits(input.claims)) + _, outRoles := TraitsToRoles(conn.GetTraitMappings(), oidcClaimsToTraits(input.claims)) require.Empty(t, cmp.Diff(outRoles, input.expectedRoles), comment) } @@ -325,6 +325,25 @@ func claimMappingsToAttributeMappings(in []types.ClaimMapping) []types.Attribute return out } +// oidcClaimsToTraits converts OIDC-style claims into teleport-specific trait format +func oidcClaimsToTraits(claims jose.Claims) map[string][]string { + traits := make(map[string][]string) + + for claimName := range claims { + claimValue, ok, _ := claims.StringClaim(claimName) + if ok { + traits[claimName] = []string{claimValue} + continue + } + claimValues, ok, _ := claims.StringsClaim(claimName) + if ok { + traits[claimName] = claimValues + } + } + + return traits +} + // claimsToAttributes maps jose.Claims type to attributes for testing func claimsToAttributes(claims jose.Claims) saml2.AssertionInfo { info := saml2.AssertionInfo{ diff --git a/lib/srv/desktop/rdp/rdpclient/src/network_client.rs b/lib/srv/desktop/rdp/rdpclient/src/network_client.rs index 48ce0ceabff72..246353d562e4a 100644 --- a/lib/srv/desktop/rdp/rdpclient/src/network_client.rs +++ b/lib/srv/desktop/rdp/rdpclient/src/network_client.rs @@ -54,6 +54,11 @@ impl NetworkClient { const DEFAULT_KERBEROS_PORT: u16 = 88; +// Maximum response size from KDC we accept, Windows uses maximum token size of 48kB and recommends +// not to exceed 64kB +// https://learn.microsoft.com/en-us/troubleshoot/windows-server/windows-security/kerberos-authentication-problems-if-user-belongs-to-groups#calculating-the-maximum-token-size +const MAX_RESPONSE_LENGTH: u32 = 65535; + impl NetworkClient { async fn send_tcp(&self, url: &Url, data: &[u8]) -> ConnectorResult> { let addr = format!( @@ -77,6 +82,14 @@ impl NetworkClient { reason_err!("NLA", "reading data from Key Distribution Center failed") })?; + if len > MAX_RESPONSE_LENGTH { + error!("KDC response too large: {} > {}", len, MAX_RESPONSE_LENGTH); + return Err(reason_err!( + "NLA", + "response from Key Distribution Center was too large" + )); + } + let mut buf = vec![0; len as usize + 4]; buf[0..4].copy_from_slice(&(len.to_be_bytes())); diff --git a/lib/srv/discovery/access_graph.go b/lib/srv/discovery/access_graph.go index f3ba28a2d479f..f0a0bc88e567e 100644 --- a/lib/srv/discovery/access_graph.go +++ b/lib/srv/discovery/access_graph.go @@ -48,6 +48,8 @@ const ( // batchSize is the maximum number of resources to send in a single // request to the access graph service. batchSize = 500 + // defaultPollInterval is the default interval between polling for access graph resources + defaultPollInterval = 15 * time.Minute ) // errNoAccessGraphFetchers is returned when there are no TAG fetchers. @@ -66,7 +68,7 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources * upsert, toDel := aws_sync.ReconcileResults(currentTAGResources, &aws_sync.Resources{}) if err := push(stream, upsert, toDel); err != nil { - s.Log.WithError(err).Error("Error pushing empty resources to TAGs") + s.Log.ErrorContext(ctx, "Error pushing empty resources to TAGs", "error", err) } return trace.Wrap(errNoAccessGraphFetchers) } @@ -109,7 +111,7 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources * // Aggregate all errors into a single error. err := trace.NewAggregate(errs...) if err != nil { - s.Log.WithError(err).Error("Error polling TAGs") + s.Log.ErrorContext(ctx, "Error polling TAGs", "error", err) } result := aws_sync.MergeResources(results...) // Merge all results into a single result @@ -122,7 +124,7 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources * } if pushErr != nil { - s.Log.WithError(pushErr).Error("Error pushing TAGs") + s.Log.ErrorContext(ctx, "Error pushing TAGs", "error", pushErr) return nil } // Update the currentTAGResources with the result of the reconciliation. @@ -135,7 +137,7 @@ func (s *Server) reconcileAccessGraph(ctx context.Context, currentTAGResources * }, }, }); err != nil { - s.Log.WithError(err).Error("Error submitting usage event") + s.Log.ErrorContext(ctx, "Error submitting usage event", "error", err) } return nil @@ -315,7 +317,7 @@ func (s *Server) initializeAndWatchAccessGraph(ctx context.Context, reloadCh <-c defer func() { lease.Stop() if err := lease.Wait(); err != nil { - s.Log.WithError(err).Warn("error cleaning up semaphore") + s.Log.WarnContext(ctx, "Error cleaning up semaphore", "error", err) } }() @@ -336,12 +338,12 @@ func (s *Server) initializeAndWatchAccessGraph(ctx context.Context, reloadCh <-c stream, err := client.AWSEventsStream(ctx) if err != nil { - s.Log.WithError(err).Error("Failed to get access graph service stream") + s.Log.ErrorContext(ctx, "Failed to get access graph service stream", "error", err) return trace.Wrap(err) } header, err := stream.Header() if err != nil { - s.Log.WithError(err).Error("Failed to get access graph service stream header") + s.Log.ErrorContext(ctx, "Failed to get access graph service stream header", "error", err) return trace.Wrap(err) } const ( @@ -361,13 +363,27 @@ func (s *Server) initializeAndWatchAccessGraph(ctx context.Context, reloadCh <-c defer wg.Done() defer cancel() if !accessGraphConn.WaitForStateChange(ctx, connectivity.Ready) { - s.Log.Info("access graph service connection was closed") + s.Log.InfoContext(ctx, "Access graph service connection was closed") } }() + // Configure the poll interval + tickerInterval := defaultPollInterval + if s.Config.Matchers.AccessGraph != nil { + if s.Config.Matchers.AccessGraph.PollInterval > defaultPollInterval { + tickerInterval = s.Config.Matchers.AccessGraph.PollInterval + } else { + s.Log.WarnContext(ctx, + "Access graph service poll interval cannot be less than the default", + "default_poll_interval", + defaultPollInterval) + } + } + s.Log.InfoContext(ctx, "Access graph service poll interval", "poll_interval", tickerInterval) + currentTAGResources := &aws_sync.Resources{} - ticker := time.NewTicker(15 * time.Minute) - defer ticker.Stop() + timer := time.NewTimer(tickerInterval) + defer timer.Stop() for { err := s.reconcileAccessGraph(ctx, currentTAGResources, stream, features) if errors.Is(err, errNoAccessGraphFetchers) { @@ -380,10 +396,17 @@ func (s *Server) initializeAndWatchAccessGraph(ctx context.Context, reloadCh <-c } return trace.Wrap(err) } + if !timer.Stop() { + select { + case <-timer.C: // drain + default: + } + } + timer.Reset(tickerInterval) select { case <-ctx.Done(): return trace.Wrap(ctx.Err()) - case <-ticker.C: + case <-timer.C: case <-reloadCh: } } @@ -411,7 +434,7 @@ func grpcCredentials(config AccessGraphConfig, certs []tls.Certificate) (grpc.Di func (s *Server) initAccessGraphWatchers(ctx context.Context, cfg *Config) error { fetchers, err := s.accessGraphFetchersFromMatchers(ctx, cfg.Matchers, "" /* discoveryConfigName */) if err != nil { - s.Log.WithError(err).Error("Error initializing access graph fetchers") + s.Log.ErrorContext(ctx, "Error initializing access graph fetchers", "error", err) } s.staticTAGSyncFetchers = fetchers @@ -424,7 +447,7 @@ func (s *Server) initAccessGraphWatchers(ctx context.Context, cfg *Config) error // We will wait for the config to change and re-evaluate the fetchers // before starting the sync. if len(allFetchers) == 0 { - s.Log.Debug("No AWS sync fetchers configured. Access graph sync will not be enabled.") + s.Log.DebugContext(ctx, "No AWS sync fetchers configured. Access graph sync will not be enabled.") select { case <-ctx.Done(): return @@ -435,10 +458,10 @@ func (s *Server) initAccessGraphWatchers(ctx context.Context, cfg *Config) error } // reset the currentTAGResources to force a full sync if err := s.initializeAndWatchAccessGraph(ctx, reloadCh); errors.Is(err, errTAGFeatureNotEnabled) { - s.Log.Warn("Access Graph specified in config, but the license does not include Teleport Policy. Access graph sync will not be enabled.") + s.Log.WarnContext(ctx, "Access Graph specified in config, but the license does not include Teleport Policy. Access graph sync will not be enabled.") break } else if err != nil { - s.Log.Warnf("Error initializing and watching access graph: %v", err) + s.Log.WarnContext(ctx, "Error initializing and watching access graph", "error", err) } select { diff --git a/lib/srv/discovery/database_watcher.go b/lib/srv/discovery/database_watcher.go index c3ab1abb437bf..77b03d68113bb 100644 --- a/lib/srv/discovery/database_watcher.go +++ b/lib/srv/discovery/database_watcher.go @@ -52,7 +52,7 @@ func (s *Server) startDatabaseWatchers() error { defer mu.Unlock() return utils.FromSlice(newDatabases, types.Database.GetName) }, - Log: s.Log.WithField("kind", types.KindDatabase), + Log: s.LegacyLogger.WithField("kind", types.KindDatabase), OnCreate: s.onDatabaseCreate, OnUpdate: s.onDatabaseUpdate, OnDelete: s.onDatabaseDelete, @@ -64,7 +64,7 @@ func (s *Server) startDatabaseWatchers() error { watcher, err := common.NewWatcher(s.ctx, common.WatcherConfig{ FetchersFn: s.getAllDatabaseFetchers, - Log: s.Log.WithField("kind", types.KindDatabase), + Log: s.LegacyLogger.WithField("kind", types.KindDatabase), DiscoveryGroup: s.DiscoveryGroup, Interval: s.PollInterval, TriggerFetchC: s.newDiscoveryConfigChangedSub(), @@ -94,7 +94,7 @@ func (s *Server) startDatabaseWatchers() error { mu.Unlock() if err := reconciler.Reconcile(s.ctx); err != nil { - s.Log.WithError(err).Warn("Unable to reconcile database resources.") + s.Log.WarnContext(s.ctx, "Unable to reconcile database resources", "error", err) } else if s.onDatabaseReconcile != nil { s.onDatabaseReconcile() } @@ -126,7 +126,7 @@ func (s *Server) getAllDatabaseFetchers() []common.Fetcher { func (s *Server) getCurrentDatabases() map[string]types.Database { databases, err := s.AccessPoint.GetDatabases(s.ctx) if err != nil { - s.Log.WithError(err).Warn("Failed to get databases from cache.") + s.Log.WarnContext(s.ctx, "Failed to get databases from cache", "error", err) return nil } @@ -136,7 +136,7 @@ func (s *Server) getCurrentDatabases() map[string]types.Database { } func (s *Server) onDatabaseCreate(ctx context.Context, database types.Database) error { - s.Log.Debugf("Creating database %s.", database.GetName()) + s.Log.DebugContext(ctx, "Creating database", "database", database.GetName()) err := s.AccessPoint.CreateDatabase(ctx, database) // If the database already exists but has cloud origin and an empty // discovery group, then update it. @@ -161,18 +161,18 @@ func (s *Server) onDatabaseCreate(ctx context.Context, database types.Database) }, }) if err != nil { - s.Log.WithError(err).Debug("Error emitting usage event.") + s.Log.DebugContext(ctx, "Error emitting usage event", "error", err) } return nil } func (s *Server) onDatabaseUpdate(ctx context.Context, database, _ types.Database) error { - s.Log.Debugf("Updating database %s.", database.GetName()) + s.Log.DebugContext(ctx, "Updating database", "database", database.GetName()) return trace.Wrap(s.AccessPoint.UpdateDatabase(ctx, database)) } func (s *Server) onDatabaseDelete(ctx context.Context, database types.Database) error { - s.Log.Debugf("Deleting database %s.", database.GetName()) + s.Log.DebugContext(ctx, "Deleting database", "database", database.GetName()) return trace.Wrap(s.AccessPoint.DeleteDatabase(ctx, database.GetName())) } diff --git a/lib/srv/discovery/discovery.go b/lib/srv/discovery/discovery.go index 829b16c3c01f7..a27b9c18b45fe 100644 --- a/lib/srv/discovery/discovery.go +++ b/lib/srv/discovery/discovery.go @@ -23,6 +23,7 @@ import ( "crypto/tls" "errors" "fmt" + "log/slog" "slices" "strings" "sync" @@ -59,6 +60,7 @@ import ( aws_sync "github.com/gravitational/teleport/lib/srv/discovery/fetchers/aws-sync" "github.com/gravitational/teleport/lib/srv/discovery/fetchers/db" "github.com/gravitational/teleport/lib/srv/server" + logutils "github.com/gravitational/teleport/lib/utils/log" "github.com/gravitational/teleport/lib/utils/spreadwork" ) @@ -119,7 +121,10 @@ type Config struct { // AccessPoint is a discovery access point AccessPoint authclient.DiscoveryAccessPoint // Log is the logger. - Log logrus.FieldLogger + Log *slog.Logger + // LegacyLogger is the old logger + // Deprecated: use Log instead. + LegacyLogger logrus.FieldLogger // ServerID identifies the Teleport instance where this service runs. ServerID string // onDatabaseReconcile is called after each database resource reconciliation. @@ -222,7 +227,10 @@ kubernetes matchers are present.`) } if c.Log == nil { - c.Log = logrus.New() + c.Log = slog.Default() + } + if c.LegacyLogger == nil { + c.LegacyLogger = logrus.New() } if c.protocolChecker == nil { c.protocolChecker = fetchers.NewProtoChecker(false) @@ -243,11 +251,13 @@ kubernetes matchers are present.`) return trace.BadParameter("cluster features are required") } - c.Log = c.Log.WithField(teleport.ComponentKey, teleport.ComponentDiscovery) + c.Log = c.Log.With(teleport.ComponentKey, teleport.ComponentDiscovery) + c.LegacyLogger = c.LegacyLogger.WithField(teleport.ComponentKey, teleport.ComponentDiscovery) if c.DiscoveryGroup == "" { - c.Log.Warn("discovery_service.discovery_group is not set. This field is required for the discovery service to work properly.\n" + - "Please set discovery_service.discovery_group according to the documentation: https://goteleport.com/docs/reference/config/#discovery-service") + const warningMessage = "discovery_service.discovery_group is not set. This field is required for the discovery service to work properly.\n" + + "Please set discovery_service.discovery_group according to the documentation: https://goteleport.com/docs/reference/config/#discovery-service" + c.Log.WarnContext(context.Background(), warningMessage) } c.Matchers.Azure = services.SimplifyAzureMatchers(c.Matchers.Azure) @@ -497,7 +507,7 @@ func (s *Server) initAWSWatchers(matchers []types.AWSMatcher) error { _, otherMatchers = splitMatchers(otherMatchers, db.IsAWSMatcherType) // Add non-integration kube fetchers. - kubeFetchers, err := fetchers.MakeEKSFetchersFromAWSMatchers(s.Log, s.CloudClients, otherMatchers) + kubeFetchers, err := fetchers.MakeEKSFetchersFromAWSMatchers(s.LegacyLogger, s.CloudClients, otherMatchers) if err != nil { return trace.Wrap(err) } @@ -525,7 +535,7 @@ func (s *Server) initKubeAppWatchers(matchers []types.KubernetesMatcher) error { KubernetesClient: kubeClient, FilterLabels: matcher.Labels, Namespaces: matcher.Namespaces, - Log: s.Log, + Log: s.LegacyLogger, ClusterName: s.DiscoveryGroup, ProtocolChecker: s.Config.protocolChecker, }) @@ -623,7 +633,7 @@ func (s *Server) kubeFetchersFromMatchers(matchers Matchers) ([]common.Fetcher, return matcherType == types.AWSMatcherEKS }) if len(awsKubeMatchers) > 0 { - eksFetchers, err := fetchers.MakeEKSFetchersFromAWSMatchers(s.Log, s.CloudClients, awsKubeMatchers) + eksFetchers, err := fetchers.MakeEKSFetchersFromAWSMatchers(s.LegacyLogger, s.CloudClients, awsKubeMatchers) if err != nil { return nil, trace.Wrap(err) } @@ -681,7 +691,7 @@ func (s *Server) initAzureWatchers(ctx context.Context, matchers []types.AzureMa Regions: matcher.Regions, FilterLabels: matcher.ResourceTags, ResourceGroups: matcher.ResourceGroups, - Log: s.Log, + Log: s.LegacyLogger, }) if err != nil { return trace.Wrap(err) @@ -762,7 +772,7 @@ func (s *Server) initGCPWatchers(ctx context.Context, matchers []types.GCPMatche Location: location, FilterLabels: matcher.GetLabels(), ProjectID: projectID, - Log: s.Log, + Log: s.LegacyLogger, }) if err != nil { return trace.Wrap(err) @@ -875,7 +885,7 @@ func (s *Server) handleEC2Instances(instances *server.EC2Instances) error { } if err := s.emitUsageEvents(instances.MakeEvents()); err != nil { - s.Log.WithError(err).Debug("Error emitting usage event.") + s.Log.DebugContext(s.ctx, "Error emitting usage event", "error", err) } return nil @@ -894,7 +904,7 @@ func (s *Server) heartbeatEICEInstance(instances *server.EC2Instances) { for _, ec2Instance := range instances.Instances { eiceNode, err := common.NewAWSNodeFromEC2v1Instance(ec2Instance.OriginalInstance, awsInfo) if err != nil { - s.Log.WithField("instance_id", ec2Instance.InstanceID).Warnf("Error converting to Teleport EICE Node: %v", err) + s.Log.WarnContext(s.ctx, "Error converting to Teleport EICE Node", "error", err, "instance_id", ec2Instance.InstanceID) s.awsEC2ResourcesStatus.incrementFailed(awsResourceGroup{ discoveryConfig: instances.DiscoveryConfig, @@ -905,7 +915,7 @@ func (s *Server) heartbeatEICEInstance(instances *server.EC2Instances) { existingNode, err := s.nodeWatcher.GetNode(s.ctx, eiceNode.GetName()) if err != nil && !trace.IsNotFound(err) { - s.Log.Warnf("Error finding the existing node with name %q: %v", eiceNode.GetName(), err) + s.Log.WarnContext(s.ctx, "Error finding the existing node", "node_name", eiceNode.GetName(), "error", err) continue } @@ -937,7 +947,7 @@ func (s *Server) heartbeatEICEInstance(instances *server.EC2Instances) { err := spreadwork.ApplyOverTime(s.ctx, applyOverTimeConfig, nodesToUpsert, func(eiceNode types.Server) { if _, err := s.AccessPoint.UpsertNode(s.ctx, eiceNode); err != nil { instanceID := eiceNode.GetAWSInstanceID() - s.Log.WithField("instance_id", instanceID).Warnf("Error upserting EC2 instance: %v", err) + s.Log.WarnContext(s.ctx, "Error upserting EC2 instance", "instance_id", instanceID, "error", err) s.awsEC2ResourcesStatus.incrementFailed(awsResourceGroup{ discoveryConfig: instances.DiscoveryConfig, integration: instances.Integration, @@ -945,7 +955,7 @@ func (s *Server) heartbeatEICEInstance(instances *server.EC2Instances) { } }) if err != nil { - s.Log.Warnf("Failed to upsert EC2 nodes: %v", err) + s.Log.WarnContext(s.ctx, "Failed to upsert EC2 nodes", "error", err) } } @@ -959,8 +969,7 @@ func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) err return trace.Wrap(err) } - s.Log.Debugf("Running Teleport installation on these instances: AccountID: %s, Instances: %s", - instances.AccountID, genEC2InstancesLogStr(instances.Instances)) + s.Log.DebugContext(s.ctx, "Running Teleport installation on instances", "account_id", instances.AccountID, "instances", genEC2InstancesLogStr(instances.Instances)) req := server.SSMRunRequest{ DocumentName: instances.DocumentName, @@ -1005,11 +1014,17 @@ func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) err func (s *Server) logHandleInstancesErr(err error) { var aErr awserr.Error if errors.As(err, &aErr) && aErr.Code() == ssm.ErrCodeInvalidInstanceId { - s.Log.WithError(err).Error("SSM SendCommand failed with ErrCodeInvalidInstanceId. Make sure that the instances have AmazonSSMManagedInstanceCore policy assigned. Also check that SSM agent is running and registered with the SSM endpoint on that instance and try restarting or reinstalling it in case of issues. See https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendCommand.html#API_SendCommand_Errors for more details.") + const errorMessage = "SSM SendCommand failed with ErrCodeInvalidInstanceId. " + + "Make sure that the instances have AmazonSSMManagedInstanceCore policy assigned. " + + "Also check that SSM agent is running and registered with the SSM endpoint on that instance and try restarting or reinstalling it in case of issues. " + + "See https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendCommand.html#API_SendCommand_Errors for more details." + s.Log.ErrorContext(s.ctx, + errorMessage, + "error", err) } else if trace.IsNotFound(err) { - s.Log.Debug("All discovered EC2 instances are already part of the cluster.") + s.Log.DebugContext(s.ctx, "All discovered EC2 instances are already part of the cluster") } else { - s.Log.WithError(err).Error("Failed to enroll discovered EC2 instances.") + s.Log.ErrorContext(s.ctx, "Failed to enroll discovered EC2 instances", "error", err) } } @@ -1022,13 +1037,13 @@ func (s *Server) watchCARotation(ctx context.Context) { nodes, err := s.findUnrotatedEC2Nodes(ctx) if err != nil { if trace.IsNotFound(err) { - s.Log.Debug("No OpenSSH nodes require CA rotation") + s.Log.DebugContext(ctx, "No OpenSSH nodes require CA rotation") continue } - s.Log.Errorf("Error finding OpenSSH nodes requiring CA rotation: %s", err) + s.Log.ErrorContext(ctx, "Error finding OpenSSH nodes requiring CA rotation", "error", err) continue } - s.Log.Debugf("Found %d nodes requiring rotation", len(nodes)) + s.Log.DebugContext(ctx, "Found nodes requiring rotation", "nodes_count", len(nodes)) s.caRotationCh <- nodes case <-s.ctx.Done(): return @@ -1085,7 +1100,7 @@ func (s *Server) findUnrotatedEC2Nodes(ctx context.Context) ([]types.Server, err func (s *Server) handleEC2Discovery() { if err := s.nodeWatcher.WaitInitialization(); err != nil { - s.Log.WithError(err).Error("Failed to initialize nodeWatcher.") + s.Log.ErrorContext(s.ctx, "Failed to initialize nodeWatcher", "error", err) return } @@ -1096,8 +1111,7 @@ func (s *Server) handleEC2Discovery() { select { case instances := <-s.ec2Watcher.InstancesC: ec2Instances := instances.EC2 - s.Log.Debugf("EC2 instances discovered (AccountID: %s, Instances: %v), starting installation", - ec2Instances.AccountID, genEC2InstancesLogStr(ec2Instances.Instances)) + s.Log.DebugContext(s.ctx, "EC2 instances discovered, starting installation", "account_id", ec2Instances.AccountID, "instances", genEC2InstancesLogStr(ec2Instances.Instances)) s.awsEC2ResourcesStatus.incrementFound(awsResourceGroup{ discoveryConfig: instances.EC2.DiscoveryConfig, @@ -1155,9 +1169,7 @@ func (s *Server) handleAzureInstances(instances *server.AzureInstances) error { return trace.Wrap(errNoInstances) } - s.Log.Debugf("Running Teleport installation on these virtual machines: SubscriptionID: %s, VMs: %s", - instances.SubscriptionID, genAzureInstancesLogStr(instances.Instances), - ) + s.Log.DebugContext(s.ctx, "Running Teleport installation on virtual machines", "subscription_id", instances.SubscriptionID, "vms", genAzureInstancesLogStr(instances.Instances)) req := server.AzureRunRequest{ Client: client, Instances: instances.Instances, @@ -1172,14 +1184,14 @@ func (s *Server) handleAzureInstances(instances *server.AzureInstances) error { return trace.Wrap(err) } if err := s.emitUsageEvents(instances.MakeEvents()); err != nil { - s.Log.WithError(err).Debug("Error emitting usage event.") + s.Log.DebugContext(s.ctx, "Error emitting usage event", "error", err) } return nil } func (s *Server) handleAzureDiscovery() { if err := s.nodeWatcher.WaitInitialization(); err != nil { - s.Log.WithError(err).Error("Failed to initialize nodeWatcher.") + s.Log.ErrorContext(s.ctx, "Failed to initialize nodeWatcher", "error", err) return } @@ -1188,14 +1200,12 @@ func (s *Server) handleAzureDiscovery() { select { case instances := <-s.azureWatcher.InstancesC: azureInstances := instances.Azure - s.Log.Debugf("Azure instances discovered (SubscriptionID: %s, Instances: %v), starting installation", - azureInstances.SubscriptionID, genAzureInstancesLogStr(azureInstances.Instances), - ) + s.Log.DebugContext(s.ctx, "Azure instances discovered, starting installation", "subscription_id", azureInstances.SubscriptionID, "instances", genAzureInstancesLogStr(azureInstances.Instances)) if err := s.handleAzureInstances(azureInstances); err != nil { if errors.Is(err, errNoInstances) { - s.Log.Debug("All discovered Azure VMs are already part of the cluster.") + s.Log.DebugContext(s.ctx, "All discovered Azure VMs are already part of the cluster") } else { - s.Log.WithError(err).Error("Failed to enroll discovered Azure VMs.") + s.Log.ErrorContext(s.ctx, "Failed to enroll discovered Azure VMs", "error", err) } } case <-s.ctx.Done(): @@ -1241,9 +1251,7 @@ func (s *Server) handleGCPInstances(instances *server.GCPInstances) error { return trace.Wrap(errNoInstances) } - s.Log.Debugf("Running Teleport installation on these virtual machines: ProjectID: %s, VMs: %s", - instances.ProjectID, genGCPInstancesLogStr(instances.Instances), - ) + s.Log.DebugContext(s.ctx, "Running Teleport installation on virtual machines", "project_id", instances.ProjectID, "vms", genGCPInstancesLogStr(instances.Instances)) req := server.GCPRunRequest{ Client: client, Instances: instances.Instances, @@ -1257,14 +1265,14 @@ func (s *Server) handleGCPInstances(instances *server.GCPInstances) error { return trace.Wrap(err) } if err := s.emitUsageEvents(instances.MakeEvents()); err != nil { - s.Log.WithError(err).Debug("Error emitting usage event.") + s.Log.DebugContext(s.ctx, "Error emitting usage event", "error", err) } return nil } func (s *Server) handleGCPDiscovery() { if err := s.nodeWatcher.WaitInitialization(); err != nil { - s.Log.WithError(err).Error("Failed to initialize nodeWatcher.") + s.Log.ErrorContext(s.ctx, "Failed to initialize nodeWatcher", "error", err) return } go s.gcpWatcher.Run() @@ -1272,14 +1280,12 @@ func (s *Server) handleGCPDiscovery() { select { case instances := <-s.gcpWatcher.InstancesC: gcpInstances := instances.GCP - s.Log.Debugf("GCP instances discovered (ProjectID: %s, Instances %v), starting installation", - gcpInstances.ProjectID, genGCPInstancesLogStr(gcpInstances.Instances), - ) + s.Log.DebugContext(s.ctx, "GCP instances discovered, starting installation", "project_id", gcpInstances.ProjectID, "instances", genGCPInstancesLogStr(gcpInstances.Instances)) if err := s.handleGCPInstances(gcpInstances); err != nil { if errors.Is(err, errNoInstances) { - s.Log.Debug("All discovered GCP VMs are already part of the cluster.") + s.Log.DebugContext(s.ctx, "All discovered GCP VMs are already part of the cluster") } else { - s.Log.WithError(err).Error("Failed to enroll discovered GCP VMs.") + s.Log.ErrorContext(s.ctx, "Failed to enroll discovered GCP VMs", "error", err) } } case <-s.ctx.Done(): @@ -1342,7 +1348,7 @@ func (s *Server) submitFetchEvent(cloudProvider, resourceType string) { }, }) if err != nil { - s.Log.WithError(err).Debug("Error emitting discovery fetch event.") + s.Log.DebugContext(s.ctx, "Error emitting discovery fetch event", "error", err) } } @@ -1435,7 +1441,7 @@ func (s *Server) loadExistingDynamicDiscoveryConfigs() error { for { dcs, respNextKey, err := s.AccessPoint.ListDiscoveryConfigs(s.ctx, 0, nextKey) if err != nil { - s.Log.WithError(err).Warnf("failed to list discovery configs") + s.Log.WarnContext(s.ctx, "Failed to list discovery configs", "error", err) return trace.Wrap(err) } @@ -1444,7 +1450,7 @@ func (s *Server) loadExistingDynamicDiscoveryConfigs() error { continue } if err := s.upsertDynamicMatchers(s.ctx, dc); err != nil { - s.Log.WithError(err).Warnf("failed to update dynamic matchers for discovery config %q", dc.GetName()) + s.Log.WarnContext(s.ctx, "Failed to update dynamic matchers for discovery config", "discovery_config", dc.GetName(), "error", err) continue } s.dynamicDiscoveryConfig[dc.GetName()] = dc @@ -1470,7 +1476,7 @@ func (s *Server) startDynamicWatcherUpdater() { case types.OpPut: dc, ok := event.Resource.(*discoveryconfig.DiscoveryConfig) if !ok { - s.Log.Warnf("dynamic matcher watcher: unexpected resource type %T", event.Resource) + s.Log.WarnContext(s.ctx, "Dynamic matcher watcher: unexpected resource type", "expected", logutils.TypeAttr(dc), "got", logutils.TypeAttr(event.Resource)) return } @@ -1498,7 +1504,7 @@ func (s *Server) startDynamicWatcherUpdater() { } if err := s.upsertDynamicMatchers(s.ctx, dc); err != nil { - s.Log.WithError(err).Warnf("failed to update dynamic matchers for discovery config %q", dc.GetName()) + s.Log.WarnContext(s.ctx, "Failed to update dynamic matchers for discovery config", "discovery_config", dc.GetName(), "error", err) continue } s.dynamicDiscoveryConfig[dc.GetName()] = dc @@ -1515,10 +1521,10 @@ func (s *Server) startDynamicWatcherUpdater() { delete(s.dynamicDiscoveryConfig, name) s.notifyDiscoveryConfigChanged() default: - s.Log.Warnf("Skipping unknown event type %s", event.Type) + s.Log.WarnContext(s.ctx, "Skipping unknown event type %s", "got", event.Type) } case <-s.dynamicMatcherWatcher.Done(): - s.Log.Warnf("dynamic matcher watcher error: %v", s.dynamicMatcherWatcher.Error()) + s.Log.WarnContext(s.ctx, "Dynamic matcher watcher error", "error", s.dynamicMatcherWatcher.Error()) return } } @@ -1650,7 +1656,7 @@ func (s *Server) discardUnsupportedMatchers(m *Matchers) { validAWSMatchers := make([]types.AWSMatcher, 0, len(m.AWS)) for i, m := range m.AWS { if m.Integration == "" { - s.Log.Warnf("discarding AWS matcher [%d] - missing integration", i) + s.Log.WarnContext(s.ctx, "Discarding AWS matcher - missing integration", "matcher_pos", i) continue } validAWSMatchers = append(validAWSMatchers, m) @@ -1658,17 +1664,17 @@ func (s *Server) discardUnsupportedMatchers(m *Matchers) { m.AWS = validAWSMatchers if len(m.GCP) > 0 { - s.Log.Warnf("discarding GCP matchers - missing integration") + s.Log.WarnContext(s.ctx, "Discarding GCP matchers - missing integration") m.GCP = []types.GCPMatcher{} } if len(m.Azure) > 0 { - s.Log.Warnf("discarding Azure matchers - missing integration") + s.Log.WarnContext(s.ctx, "Discarding Azure matchers - missing integration") m.Azure = []types.AzureMatcher{} } if len(m.Kubernetes) > 0 { - s.Log.Warnf("discarding Kubernetes matchers - missing integration") + s.Log.WarnContext(s.ctx, "Discarding Kubernetes matchers - missing integration") m.Kubernetes = []types.KubernetesMatcher{} } } @@ -1687,7 +1693,7 @@ func (s *Server) Stop() { } if s.dynamicMatcherWatcher != nil { if err := s.dynamicMatcherWatcher.Close(); err != nil { - s.Log.Warnf("dynamic matcher watcher closing error: ", trace.Wrap(err)) + s.Log.WarnContext(s.ctx, "Dynamic matcher watcher closing error", "error", err) } } } @@ -1719,7 +1725,7 @@ func (s *Server) initTeleportNodeWatcher() (err error) { s.nodeWatcher, err = services.NewNodeWatcher(s.ctx, services.NodeWatcherConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentDiscovery, - Log: s.Log, + Log: s.LegacyLogger, Client: s.AccessPoint, MaxStaleness: time.Minute, }, diff --git a/lib/srv/discovery/discovery_test.go b/lib/srv/discovery/discovery_test.go index 100973a56e242..84e2d9e7bcf01 100644 --- a/lib/srv/discovery/discovery_test.go +++ b/lib/srv/discovery/discovery_test.go @@ -87,6 +87,7 @@ import ( "github.com/gravitational/teleport/lib/srv/discovery/common" "github.com/gravitational/teleport/lib/srv/server" usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport" + libutils "github.com/gravitational/teleport/lib/utils" ) func TestMain(m *testing.M) { @@ -679,7 +680,9 @@ func TestDiscoveryServer(t *testing.T) { require.NoError(t, err) } - logger := logrus.New() + legacyLogger := logrus.New() + logger := libutils.NewSlogLoggerForTests() + reporter := &mockUsageReporter{} installer := &mockSSMInstaller{ installedInstances: make(map[string]struct{}), @@ -700,6 +703,7 @@ func TestDiscoveryServer(t *testing.T) { Matchers: tc.staticMatchers, Emitter: tc.emitter, Log: logger, + LegacyLogger: legacyLogger, DiscoveryGroup: defaultDiscoveryGroup, clock: fakeClock, }) @@ -759,7 +763,8 @@ func TestDiscoveryServer(t *testing.T) { func TestDiscoveryServerConcurrency(t *testing.T) { t.Parallel() ctx := context.Background() - logger := logrus.New() + legacyLogger := logrus.New() + logger := libutils.NewSlogLoggerForTests() defaultDiscoveryGroup := "dg01" awsMatcher := types.AWSMatcher{ @@ -839,6 +844,7 @@ func TestDiscoveryServerConcurrency(t *testing.T) { Matchers: staticMatcher, Emitter: emitter, Log: logger, + LegacyLogger: legacyLogger, DiscoveryGroup: defaultDiscoveryGroup, }) require.NoError(t, err) @@ -1336,9 +1342,11 @@ func TestDiscoveryInCloudKube(t *testing.T) { require.NoError(t, w.Close()) }) - logger := logrus.New() - logger.SetOutput(w) - logger.SetLevel(logrus.DebugLevel) + legacyLogger := logrus.New() + logger := libutils.NewSlogLoggerForTests() + + legacyLogger.SetOutput(w) + legacyLogger.SetLevel(logrus.DebugLevel) clustersNotUpdated := make(chan string, 10) go func() { // reconcileRegexp is the regex extractor of a log message emitted by reconciler when @@ -1377,6 +1385,7 @@ func TestDiscoveryInCloudKube(t *testing.T) { }, Emitter: authClient, Log: logger, + LegacyLogger: legacyLogger, DiscoveryGroup: mainDiscoveryGroup, }) @@ -2668,7 +2677,9 @@ func TestAzureVMDiscovery(t *testing.T) { require.NoError(t, err) } - logger := logrus.New() + legacyLogger := logrus.New() + logger := libutils.NewSlogLoggerForTests() + emitter := &mockEmitter{} reporter := &mockUsageReporter{} installer := &mockAzureInstaller{ @@ -2683,6 +2694,7 @@ func TestAzureVMDiscovery(t *testing.T) { Matchers: tc.staticMatchers, Emitter: emitter, Log: logger, + LegacyLogger: legacyLogger, DiscoveryGroup: defaultDiscoveryGroup, }) @@ -2974,7 +2986,8 @@ func TestGCPVMDiscovery(t *testing.T) { require.NoError(t, err) } - logger := logrus.New() + legacyLogger := logrus.New() + logger := libutils.NewSlogLoggerForTests() emitter := &mockEmitter{} reporter := &mockUsageReporter{} installer := &mockGCPInstaller{ @@ -2989,6 +3002,7 @@ func TestGCPVMDiscovery(t *testing.T) { Matchers: tc.staticMatchers, Emitter: emitter, Log: logger, + LegacyLogger: legacyLogger, DiscoveryGroup: defaultDiscoveryGroup, }) @@ -3035,7 +3049,8 @@ func TestServer_onCreate(t *testing.T) { Config: &Config{ DiscoveryGroup: "test-cluster", AccessPoint: accessPoint, - Log: logrus.New(), + Log: libutils.NewSlogLoggerForTests(), + LegacyLogger: logrus.New(), }, } diff --git a/lib/srv/discovery/kube_integration_watcher.go b/lib/srv/discovery/kube_integration_watcher.go index 58c7228b4f031..d8efaceda4bf8 100644 --- a/lib/srv/discovery/kube_integration_watcher.go +++ b/lib/srv/discovery/kube_integration_watcher.go @@ -68,7 +68,7 @@ func (s *Server) startKubeIntegrationWatchers() error { s.submitFetchersEvent(kubeIntegrationFetchers) return kubeIntegrationFetchers }, - Log: s.Log.WithField("kind", types.KindKubernetesCluster), + Log: s.LegacyLogger.WithField("kind", types.KindKubernetesCluster), DiscoveryGroup: s.DiscoveryGroup, Interval: s.PollInterval, Origin: types.OriginCloud, @@ -88,13 +88,13 @@ func (s *Server) startKubeIntegrationWatchers() error { existingServers, err := clt.GetKubernetesServers(s.ctx) if err != nil { - s.Log.WithError(err).Warn("Failed to get Kubernetes servers from cache.") + s.Log.WarnContext(s.ctx, "Failed to get Kubernetes servers from cache", "error", err) continue } existingClusters, err := clt.GetKubernetesClusters(s.ctx) if err != nil { - s.Log.WithError(err).Warn("Failed to get Kubernetes clusters from cache.") + s.Log.WarnContext(s.ctx, "Failed to get Kubernetes clusters from cache", "error", err) continue } @@ -120,7 +120,7 @@ func (s *Server) startKubeIntegrationWatchers() error { agentVersion, err := s.getKubeAgentVersion(releaseChannels) if err != nil { - s.Log.WithError(err).Warn("Could not get agent version to enroll EKS clusters") + s.Log.WarnContext(s.ctx, "Could not get agent version to enroll EKS clusters", "error", err) continue } @@ -195,19 +195,19 @@ func (s *Server) enrollEKSClusters(region, integration string, clusters []types. AgentVersion: agentVersion, }) if err != nil { - s.Log.WithError(err).Errorf("failed to enroll EKS clusters %v", clusterNames) + s.Log.ErrorContext(ctx, "Failed to enroll EKS clusters", "cluster_names", clusterNames, "error", err) continue } for _, r := range rsp.Results { if r.Error != "" { if !strings.Contains(r.Error, "teleport-kube-agent is already installed on the cluster") { - s.Log.Errorf("failed to enroll EKS cluster %q: %s", r.EksClusterName, r.Error) + s.Log.ErrorContext(ctx, "Failed to enroll EKS cluster", "cluster_name", r.EksClusterName, "error", err) } else { - s.Log.Debugf("EKS cluster %q already has installed kube agent", r.EksClusterName) + s.Log.DebugContext(ctx, "EKS cluster already has installed kube agent", "cluster_name", r.EksClusterName) } } else { - s.Log.Infof("successfully enrolled EKS cluster %q", r.EksClusterName) + s.Log.InfoContext(ctx, "Successfully enrolled EKS cluster", "cluster_name", r.EksClusterName) } } } diff --git a/lib/srv/discovery/kube_integration_watcher_test.go b/lib/srv/discovery/kube_integration_watcher_test.go index f6cab69c9ec46..556796981c996 100644 --- a/lib/srv/discovery/kube_integration_watcher_test.go +++ b/lib/srv/discovery/kube_integration_watcher_test.go @@ -52,6 +52,7 @@ import ( "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/srv/discovery/common" "github.com/gravitational/teleport/lib/srv/discovery/fetchers" + libutils "github.com/gravitational/teleport/lib/utils" ) func TestServer_getKubeFetchers(t *testing.T) { @@ -380,7 +381,8 @@ func TestDiscoveryKubeIntegrationEKS(t *testing.T) { AWS: tc.awsMatchers, }, Emitter: authClient, - Log: logrus.New(), + Log: libutils.NewSlogLoggerForTests(), + LegacyLogger: logrus.New(), DiscoveryGroup: mainDiscoveryGroup, }) diff --git a/lib/srv/discovery/kube_services_watcher.go b/lib/srv/discovery/kube_services_watcher.go index eb6d68cc964f7..8a80aea590b89 100644 --- a/lib/srv/discovery/kube_services_watcher.go +++ b/lib/srv/discovery/kube_services_watcher.go @@ -50,7 +50,7 @@ func (s *Server) startKubeAppsWatchers() error { GetCurrentResources: func() map[string]types.Application { apps, err := s.AccessPoint.GetApps(s.ctx) if err != nil { - s.Log.WithError(err).Warn("Unable to get applications from cache.") + s.Log.WarnContext(s.ctx, "Unable to get applications from cache", "error", err) return nil } @@ -61,7 +61,7 @@ func (s *Server) startKubeAppsWatchers() error { defer mu.Unlock() return utils.FromSlice(appResources, types.Application.GetName) }, - Log: s.Log.WithField("kind", types.KindApp), + Log: s.LegacyLogger.WithField("kind", types.KindApp), OnCreate: s.onAppCreate, OnUpdate: s.onAppUpdate, OnDelete: s.onAppDelete, @@ -74,7 +74,7 @@ func (s *Server) startKubeAppsWatchers() error { watcher, err := common.NewWatcher(s.ctx, common.WatcherConfig{ FetchersFn: common.StaticFetchers(s.kubeAppsFetchers), Interval: 5 * time.Minute, - Log: s.Log.WithField("kind", types.KindApp), + Log: s.LegacyLogger.WithField("kind", types.KindApp), DiscoveryGroup: s.DiscoveryGroup, Origin: types.OriginDiscoveryKubernetes, }) @@ -102,7 +102,7 @@ func (s *Server) startKubeAppsWatchers() error { mu.Unlock() if err := reconciler.Reconcile(s.ctx); err != nil { - s.Log.WithError(err).Warn("Unable to reconcile resources.") + s.Log.WarnContext(s.ctx, "Unable to reconcile resources", "error", err) } case <-s.ctx.Done(): @@ -114,7 +114,7 @@ func (s *Server) startKubeAppsWatchers() error { } func (s *Server) onAppCreate(ctx context.Context, app types.Application) error { - s.Log.Debugf("Creating app %s", app.GetName()) + s.Log.DebugContext(ctx, "Creating app", "app_name", app.GetName()) err := s.AccessPoint.CreateApp(ctx, app) // If the resource already exists, it means that the resource was created // by a previous discovery_service instance that didn't support the discovery @@ -139,17 +139,17 @@ func (s *Server) onAppCreate(ctx context.Context, app types.Application) error { }, }) if err != nil { - s.Log.WithError(err).Debug("Error emitting usage event.") + s.Log.DebugContext(ctx, "Error emitting usage event", "error", err) } return nil } func (s *Server) onAppUpdate(ctx context.Context, app, _ types.Application) error { - s.Log.Debugf("Updating app %s.", app.GetName()) + s.Log.DebugContext(ctx, "Updating app", "app_name", app.GetName()) return trace.Wrap(s.AccessPoint.UpdateApp(ctx, app)) } func (s *Server) onAppDelete(ctx context.Context, app types.Application) error { - s.Log.Debugf("Deleting app %s.", app.GetName()) + s.Log.DebugContext(ctx, "Deleting app", "app_name", app.GetName()) return trace.Wrap(s.AccessPoint.DeleteApp(ctx, app.GetName())) } diff --git a/lib/srv/discovery/kube_watcher.go b/lib/srv/discovery/kube_watcher.go index e18cc23e68c99..5247ff213b2e7 100644 --- a/lib/srv/discovery/kube_watcher.go +++ b/lib/srv/discovery/kube_watcher.go @@ -49,7 +49,7 @@ func (s *Server) startKubeWatchers() error { GetCurrentResources: func() map[string]types.KubeCluster { kcs, err := s.AccessPoint.GetKubernetesClusters(s.ctx) if err != nil { - s.Log.WithError(err).Warn("Unable to get Kubernetes clusters from cache.") + s.Log.WarnContext(s.ctx, "Unable to get Kubernetes clusters from cache", "error", err) return nil } @@ -60,7 +60,7 @@ func (s *Server) startKubeWatchers() error { defer mu.Unlock() return utils.FromSlice(kubeResources, types.KubeCluster.GetName) }, - Log: s.Log.WithField("kind", types.KindKubernetesCluster), + Log: s.LegacyLogger.WithField("kind", types.KindKubernetesCluster), OnCreate: s.onKubeCreate, OnUpdate: s.onKubeUpdate, OnDelete: s.onKubeDelete, @@ -76,7 +76,7 @@ func (s *Server) startKubeWatchers() error { s.submitFetchersEvent(kubeNonIntegrationFetchers) return kubeNonIntegrationFetchers }, - Log: s.Log.WithField("kind", types.KindKubernetesCluster), + Log: s.LegacyLogger.WithField("kind", types.KindKubernetesCluster), DiscoveryGroup: s.DiscoveryGroup, Interval: s.PollInterval, Origin: types.OriginCloud, @@ -106,7 +106,7 @@ func (s *Server) startKubeWatchers() error { mu.Unlock() if err := reconciler.Reconcile(s.ctx); err != nil { - s.Log.WithError(err).Warn("Unable to reconcile resources.") + s.Log.WarnContext(s.ctx, "Unable to reconcile resources", "error", err) } case <-s.ctx.Done(): @@ -118,7 +118,7 @@ func (s *Server) startKubeWatchers() error { } func (s *Server) onKubeCreate(ctx context.Context, kubeCluster types.KubeCluster) error { - s.Log.Debugf("Creating kube_cluster %s.", kubeCluster.GetName()) + s.Log.DebugContext(ctx, "Creating kube_cluster", "kube_cluster_name", kubeCluster.GetName()) err := s.AccessPoint.CreateKubernetesCluster(ctx, kubeCluster) // If the kube already exists but has an empty discovery group, update it. if err != nil { @@ -138,17 +138,17 @@ func (s *Server) onKubeCreate(ctx context.Context, kubeCluster types.KubeCluster }, }) if err != nil { - s.Log.WithError(err).Debug("Error emitting usage event.") + s.Log.DebugContext(ctx, "Error emitting usage event", "error", err) } return nil } func (s *Server) onKubeUpdate(ctx context.Context, kubeCluster, _ types.KubeCluster) error { - s.Log.Debugf("Updating kube_cluster %s.", kubeCluster.GetName()) + s.Log.DebugContext(ctx, "Updating kube_cluster", "kube_cluster_name", kubeCluster.GetName()) return trace.Wrap(s.AccessPoint.UpdateKubernetesCluster(ctx, kubeCluster)) } func (s *Server) onKubeDelete(ctx context.Context, kubeCluster types.KubeCluster) error { - s.Log.Debugf("Deleting kube_cluster %s.", kubeCluster.GetName()) + s.Log.DebugContext(ctx, "Deleting kube_cluster", "kube_cluster_name", kubeCluster.GetName()) return trace.Wrap(s.AccessPoint.DeleteKubernetesCluster(ctx, kubeCluster.GetName())) } diff --git a/lib/srv/discovery/reconciler.go b/lib/srv/discovery/reconciler.go index 26b17410e1bd6..dd9dc1d605f9c 100644 --- a/lib/srv/discovery/reconciler.go +++ b/lib/srv/discovery/reconciler.go @@ -20,12 +20,12 @@ package discovery import ( "context" + "log/slog" "sync" "time" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/sirupsen/logrus" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/retryutils" @@ -46,7 +46,7 @@ type serverInfoUpserter interface { type labelReconcilerConfig struct { clock clockwork.Clock - log logrus.FieldLogger + log *slog.Logger accessPoint serverInfoUpserter } @@ -58,7 +58,7 @@ func (c *labelReconcilerConfig) checkAndSetDefaults() error { c.clock = clockwork.NewRealClock() } if c.log == nil { - c.log = logrus.New() + c.log = slog.Default() } return nil } @@ -124,7 +124,7 @@ func (r *labelReconciler) run(ctx context.Context) { for _, si := range batch { if err := r.cfg.accessPoint.UpsertServerInfo(ctx, si); err != nil { - r.cfg.log.WithError(err).Error("Failed to upsert server info.") + r.cfg.log.ErrorContext(ctx, "Failed to upsert server info", "error", err) // Allow the server info to be queued again. delete(r.discoveredServers, si.GetName()) } diff --git a/lib/srv/discovery/status.go b/lib/srv/discovery/status.go index 7fe0b0f39398d..321619bb02636 100644 --- a/lib/srv/discovery/status.go +++ b/lib/srv/discovery/status.go @@ -25,7 +25,6 @@ import ( "time" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "google.golang.org/protobuf/types/known/timestamppb" discoveryconfigv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" @@ -45,6 +44,12 @@ import ( // - AWS Sync (TAG) status // - AWS EC2 Auto Discover status func (s *Server) updateDiscoveryConfigStatus(discoveryConfigName string) { + // Static configurations (ie those in `teleport.yaml/discovery_config..matchers`) do not have a DiscoveryConfig resource. + // Those are discarded because there's no Status to update. + if discoveryConfigName == "" { + return + } + discoveryConfigStatus := discoveryconfig.Status{ State: discoveryconfigv1.DiscoveryConfigState_DISCOVERY_CONFIG_STATE_SYNCING.String(), LastSyncTime: s.clock.Now(), @@ -63,9 +68,9 @@ func (s *Server) updateDiscoveryConfigStatus(discoveryConfigName string) { _, err := s.AccessPoint.UpdateDiscoveryConfigStatus(ctx, discoveryConfigName, discoveryConfigStatus) switch { case trace.IsNotImplemented(err): - s.Log.Warn("UpdateDiscoveryConfigStatus method is not implemented in Auth Server. Please upgrade it to a recent version.") + s.Log.WarnContext(ctx, "UpdateDiscoveryConfigStatus method is not implemented in Auth Server. Please upgrade it to a recent version.") case err != nil: - s.Log.WithError(err).WithField("discovery_config_name", discoveryConfigName).Info("Error updating discovery config status") + s.Log.InfoContext(ctx, "Error updating discovery config status", "discovery_config_name", discoveryConfigName, "error", err) } } @@ -422,7 +427,7 @@ func (s *Server) acquireSemaphoreForUserTask(userTaskName string) (releaseFn fun cancel() lease.Stop() if err := lease.Wait(); err != nil { - s.Log.WithError(err).WithField("semaphore", userTaskName).Warn("error cleaning up UserTask semaphore") + s.Log.WarnContext(ctx, "Error cleaning up UserTask semaphore", "semaphore", semaphoreName, "error", err) } } @@ -522,13 +527,13 @@ func (s *Server) upsertTasksForAWSEC2FailedEnrollments() { } if err := s.mergeUpsertDiscoverEC2Task(g, instancesIssueByID); err != nil { - s.Log.WithError(err).WithFields(logrus.Fields{ - "integration": g.integration, - "issue_type": g.issueType, - "aws_account_id": g.accountID, - "aws_region": g.region, - }, - ).Warning("Failed to create discover ec2 user task.", g.integration, g.issueType, g.accountID, g.region) + s.Log.WarnContext(s.ctx, "Failed to create discover ec2 user task", + "integration", g.integration, + "issue_type", g.issueType, + "aws_account_id", g.accountID, + "aws_region", g.region, + "error", err, + ) continue } diff --git a/lib/srv/regular/sshserver.go b/lib/srv/regular/sshserver.go index df0e87f4abb48..6425e1dab27b7 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -72,6 +72,7 @@ import ( "github.com/gravitational/teleport/lib/sshutils/x11" "github.com/gravitational/teleport/lib/teleagent" "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" "github.com/gravitational/teleport/lib/utils/uds" ) @@ -726,7 +727,7 @@ func New( options ...ServerOption, ) (*Server, error) { // read the host UUID: - uuid, err := utils.ReadOrMakeHostUUID(dataDir) + uuid, err := hostid.ReadOrCreateFile(dataDir) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/srv/usermgmt.go b/lib/srv/usermgmt.go index a4460afbc9529..e12bf8c8c633b 100644 --- a/lib/srv/usermgmt.go +++ b/lib/srv/usermgmt.go @@ -688,6 +688,7 @@ func (u *HostUserManagement) getHostUser(username string) (*HostUser, error) { return &HostUser{ Name: username, UID: usr.Uid, + GID: usr.Gid, Home: usr.HomeDir, Groups: groups, }, trace.NewAggregate(groupErrs...) diff --git a/lib/tbot/service_application_tunnel.go b/lib/tbot/service_application_tunnel.go index 21bb7c458ae56..427a4558d4e5c 100644 --- a/lib/tbot/service_application_tunnel.go +++ b/lib/tbot/service_application_tunnel.go @@ -133,7 +133,10 @@ func (s *ApplicationTunnelService) buildLocalProxyConfig(ctx context.Context) (l if err != nil { return alpnproxy.LocalProxyConfig{}, trace.Wrap(err, "pinging proxy") } - proxyAddr := proxyPing.Proxy.SSH.PublicAddr + proxyAddr, err := proxyPing.proxyWebAddr() + if err != nil { + return alpnproxy.LocalProxyConfig{}, trace.Wrap(err, "determining proxy web addr") + } s.log.DebugContext(ctx, "Issuing initial certificate for local proxy.") appCert, app, err := s.issueCert(ctx, roles) diff --git a/lib/tbot/service_database_tunnel.go b/lib/tbot/service_database_tunnel.go index 6cd7f18ff362a..4ba5c5c3647cf 100644 --- a/lib/tbot/service_database_tunnel.go +++ b/lib/tbot/service_database_tunnel.go @@ -93,7 +93,10 @@ func (s *DatabaseTunnelService) buildLocalProxyConfig(ctx context.Context) (lpCf if err != nil { return alpnproxy.LocalProxyConfig{}, trace.Wrap(err, "pinging proxy") } - proxyAddr := proxyPing.Proxy.SSH.PublicAddr + proxyAddr, err := proxyPing.proxyWebAddr() + if err != nil { + return alpnproxy.LocalProxyConfig{}, trace.Wrap(err, "determining proxy web address") + } // Fetch information about the database and then issue the initial // certificate. We issue the initial certificate to allow us to fail faster. diff --git a/lib/tbot/service_identity_output.go b/lib/tbot/service_identity_output.go index e6a60d66ff71c..9a9a9ce65a695 100644 --- a/lib/tbot/service_identity_output.go +++ b/lib/tbot/service_identity_output.go @@ -29,7 +29,6 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/client/proto" - "github.com/gravitational/teleport/api/client/webclient" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/config/openssh" @@ -251,7 +250,7 @@ type alpnTester interface { func renderSSHConfig( ctx context.Context, log *slog.Logger, - proxyPing *webclient.PingResponse, + proxyPing *proxyPingResponse, clusterNames []string, dest bot.Destination, certAuthGetter certAuthGetter, @@ -267,11 +266,16 @@ func renderSSHConfig( ) defer span.End() - proxyHost, proxyPort, err := utils.SplitHostPort(proxyPing.Proxy.SSH.PublicAddr) + proxyAddr, err := proxyPing.proxyWebAddr() + if err != nil { + return trace.Wrap(err, "determining proxy web addr") + } + + proxyHost, proxyPort, err := utils.SplitHostPort(proxyAddr) if err != nil { return trace.BadParameter( "proxy %+v has no usable public address: %v", - proxyPing.Proxy.SSH.PublicAddr, err, + proxyAddr, err, ) } @@ -318,7 +322,6 @@ func renderSSHConfig( knownHostsPath := filepath.Join(absDestPath, ssh.KnownHostsName) identityFilePath := filepath.Join(absDestPath, identity.PrivateKeyKey) certificateFilePath := filepath.Join(absDestPath, identity.SSHCertKey) - sshConf := openssh.NewSSHConfig(getOpenSSHVersion, nil) if getEnv(sshConfigProxyModeEnv) == "legacy" { @@ -344,7 +347,7 @@ func renderSSHConfig( connUpgradeRequired := false if proxyPing.Proxy.TLSRoutingEnabled { connUpgradeRequired, err = alpnTester.isUpgradeRequired( - ctx, proxyPing.Proxy.SSH.PublicAddr, botCfg.Insecure, + ctx, proxyAddr, botCfg.Insecure, ) if err != nil { return trace.Wrap(err, "determining if ALPN upgrade is required") diff --git a/lib/tbot/service_identity_output_test.go b/lib/tbot/service_identity_output_test.go index d63e111c86e35..80b3f12d78686 100644 --- a/lib/tbot/service_identity_output_test.go +++ b/lib/tbot/service_identity_output_test.go @@ -169,12 +169,14 @@ func Test_renderSSHConfig(t *testing.T) { err := renderSSHConfig( context.Background(), utils.NewSlogLoggerForTests(), - &webclient.PingResponse{ - ClusterName: mockClusterName, - Proxy: webclient.ProxySettings{ - TLSRoutingEnabled: tc.TLSRouting, - SSH: webclient.SSHProxySettings{ - PublicAddr: mockProxyAddr, + &proxyPingResponse{ + PingResponse: &webclient.PingResponse{ + ClusterName: mockClusterName, + Proxy: webclient.ProxySettings{ + TLSRoutingEnabled: tc.TLSRouting, + SSH: webclient.SSHProxySettings{ + PublicAddr: mockProxyAddr, + }, }, }, }, diff --git a/lib/tbot/service_kubernetes_output.go b/lib/tbot/service_kubernetes_output.go index bf0be90e10bb8..2277e292d4538 100644 --- a/lib/tbot/service_kubernetes_output.go +++ b/lib/tbot/service_kubernetes_output.go @@ -32,7 +32,6 @@ import ( 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/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth/authclient" @@ -418,7 +417,7 @@ func getKubeCluster(ctx context.Context, clt *authclient.Client, name string) (t // selectKubeConnectionMethod determines the address and SNI that should be // put into the kubeconfig file. -func selectKubeConnectionMethod(proxyPong *webclient.PingResponse) ( +func selectKubeConnectionMethod(proxyPong *proxyPingResponse) ( clusterAddr string, sni string, err error, ) { // First we check for TLS routing. If this is enabled, we use the Proxy's @@ -427,8 +426,11 @@ func selectKubeConnectionMethod(proxyPong *webclient.PingResponse) ( // Even if KubePublicAddr is specified, we still use the general // PublicAddr when using TLS routing. if proxyPong.Proxy.TLSRoutingEnabled { - addr := proxyPong.Proxy.SSH.PublicAddr - host, _, err := net.SplitHostPort(proxyPong.Proxy.SSH.PublicAddr) + addr, err := proxyPong.proxyWebAddr() + if err != nil { + return "", "", trace.Wrap(err) + } + host, _, err := net.SplitHostPort(addr) if err != nil { return "", "", trace.Wrap(err, "parsing proxy public_addr") } diff --git a/lib/tbot/service_kubernetes_output_test.go b/lib/tbot/service_kubernetes_output_test.go index 778c947fd07be..aeb3157df6cf7 100644 --- a/lib/tbot/service_kubernetes_output_test.go +++ b/lib/tbot/service_kubernetes_output_test.go @@ -279,7 +279,9 @@ func Test_selectKubeConnectionMethod(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - addr, sni, err := selectKubeConnectionMethod(tt.proxyPing) + addr, sni, err := selectKubeConnectionMethod(&proxyPingResponse{ + PingResponse: tt.proxyPing, + }) require.NoError(t, err) require.Equal(t, tt.wantAddr, addr) require.Equal(t, tt.wantSNI, sni) diff --git a/lib/tbot/service_ssh_multiplexer.go b/lib/tbot/service_ssh_multiplexer.go index 6a678db209302..c6566ecf5d38a 100644 --- a/lib/tbot/service_ssh_multiplexer.go +++ b/lib/tbot/service_ssh_multiplexer.go @@ -274,11 +274,15 @@ func (s *SSHMultiplexerService) setup(ctx context.Context) ( if err != nil { return nil, nil, "", nil, trace.Wrap(err) } - proxyAddr := proxyPing.Proxy.SSH.PublicAddr - proxyHost, _, err = net.SplitHostPort(proxyPing.Proxy.SSH.PublicAddr) + proxyAddr, err := proxyPing.proxyWebAddr() + if err != nil { + return nil, nil, "", nil, trace.Wrap(err, "determining proxy web addr") + } + proxyHost, _, err = net.SplitHostPort(proxyAddr) if err != nil { return nil, nil, "", nil, trace.Wrap(err) } + connUpgradeRequired := false if proxyPing.Proxy.TLSRoutingEnabled { connUpgradeRequired, err = s.alpnUpgradeCache.isUpgradeRequired( diff --git a/lib/tbot/tbot.go b/lib/tbot/tbot.go index 36f89e21137f9..a4a64de322768 100644 --- a/lib/tbot/tbot.go +++ b/lib/tbot/tbot.go @@ -154,17 +154,32 @@ func (b *Bot) Run(ctx context.Context) (err error) { return trace.Wrap(err) } - addr, _ := b.cfg.Address() - resolver, err := reversetunnelclient.CachingResolver( - ctx, - reversetunnelclient.WebClientResolver(&webclient.Config{ - Context: ctx, - ProxyAddr: addr, - Insecure: b.cfg.Insecure, - }), - nil /* clock */) - if err != nil { - return trace.Wrap(err) + addr, addrKind := b.cfg.Address() + var resolver reversetunnelclient.Resolver + if shouldUseProxyAddr() { + if addrKind != config.AddressKindProxy { + return trace.BadParameter("TBOT_USE_PROXY_ADDR requires that a proxy address is set using --proxy-server or proxy_server") + } + // If the user has indicated they want tbot to prefer using the proxy + // address they have configured, we use a static resolver set to this + // address. We also assume that they have TLS routing/multiplexing + // enabled, since otherwise we'd need them to manually configure an + // an entry for each kind of address. + resolver = reversetunnelclient.StaticResolver( + addr, types.ProxyListenerMode_Multiplex, + ) + } else { + resolver, err = reversetunnelclient.CachingResolver( + ctx, + reversetunnelclient.WebClientResolver(&webclient.Config{ + Context: ctx, + ProxyAddr: addr, + Insecure: b.cfg.Insecure, + }), + nil /* clock */) + if err != nil { + return trace.Wrap(err) + } } // Create an error group to manage all the services lifetimes. @@ -529,7 +544,8 @@ func (b *Bot) preRunChecks(ctx context.Context) (_ func() error, err error) { ctx, span := tracer.Start(ctx, "Bot/preRunChecks") defer func() { apitracing.EndSpan(span, err) }() - switch _, addrKind := b.cfg.Address(); addrKind { + _, addrKind := b.cfg.Address() + switch addrKind { case config.AddressKindUnspecified: return nil, trace.BadParameter( "either a proxy or auth address must be set using --proxy, --auth-server or configuration", @@ -704,10 +720,10 @@ type proxyPingCache struct { log *slog.Logger mu sync.RWMutex - cachedValue *webclient.PingResponse + cachedValue *proxyPingResponse } -func (p *proxyPingCache) ping(ctx context.Context) (*webclient.PingResponse, error) { +func (p *proxyPingCache) ping(ctx context.Context) (*proxyPingResponse, error) { p.mu.Lock() defer p.mu.Unlock() if p.cachedValue != nil { @@ -741,11 +757,50 @@ func (p *proxyPingCache) ping(ctx context.Context) (*webclient.PingResponse, err return nil, trace.Wrap(err) } p.log.DebugContext(ctx, "Successfully pinged proxy.", "pong", res) - p.cachedValue = res + p.cachedValue = &proxyPingResponse{ + PingResponse: res, + configuredProxyAddr: p.botCfg.ProxyServer, + } return p.cachedValue, nil } +type proxyPingResponse struct { + *webclient.PingResponse + configuredProxyAddr string +} + +// useProxyAddrEnv is an environment variable which can be set to +// force `tbot` to prefer using the proxy address explicitly provided by the +// user over the one fetched from the proxy ping. This is only intended to work +// in cases where TLS routing is enabled, and is intended to support cases where +// the Proxy is accessible from multiple addresses, and the one included in the +// ProxyPing is incorrect. +const useProxyAddrEnv = "TBOT_USE_PROXY_ADDR" + +// shouldUseProxyAddr returns true if the TBOT_USE_PROXY_ADDR environment +// variable is set to "yes". More generally, this indicates that the user wishes +// for tbot to prefer using the proxy address that has been explicitly provided +// by the user rather than the one fetched via a discovery process (e.g ping). +func shouldUseProxyAddr() bool { + return os.Getenv(useProxyAddrEnv) == "yes" +} + +// proxyWebAddr returns the address to use to connect to the proxy web port. +// In TLS routing mode, this address should be used for most/all connections. +// This function takes into account the TBOT_USE_PROXY_ADDR environment +// variable, which can be used to force the use of the proxy address explicitly +// provided by the user rather than use the one fetched from the proxy ping. +func (p *proxyPingResponse) proxyWebAddr() (string, error) { + if shouldUseProxyAddr() { + if p.configuredProxyAddr == "" { + return "", trace.BadParameter("TBOT_USE_PROXY_ADDR set but no explicit proxy address configured") + } + return p.configuredProxyAddr, nil + } + return p.Proxy.SSH.PublicAddr, nil +} + type alpnProxyConnUpgradeRequiredCache struct { botCfg *config.BotConfig log *slog.Logger diff --git a/lib/teleterm/services/connectmycomputer/connectmycomputer.go b/lib/teleterm/services/connectmycomputer/connectmycomputer.go index 1cc0f8914a052..26ecc8aafe8d9 100644 --- a/lib/teleterm/services/connectmycomputer/connectmycomputer.go +++ b/lib/teleterm/services/connectmycomputer/connectmycomputer.go @@ -41,6 +41,7 @@ import ( "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/teleterm/clusters" "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" ) type RoleSetup struct { @@ -395,7 +396,7 @@ func (n *NodeJoinWait) getNodeNameFromHostUUIDFile(ctx context.Context, cluster // the file is empty. // // Here we need to be able to distinguish between both of those two cases. - out, err := utils.ReadPath(utils.GetHostUUIDPath(dataDir)) + out, err := utils.ReadPath(hostid.GetPath(dataDir)) if err != nil { if trace.IsNotFound(err) { continue @@ -536,7 +537,7 @@ type NodeDelete struct { // Run grabs the host UUID of an agent from a disk and deletes the node with that name. func (n *NodeDelete) Run(ctx context.Context, presence Presence, cluster *clusters.Cluster) error { - hostUUID, err := utils.ReadHostUUID(getAgentDataDir(n.cfg.AgentsDir, cluster.ProfileName)) + hostUUID, err := hostid.ReadFile(getAgentDataDir(n.cfg.AgentsDir, cluster.ProfileName)) if trace.IsNotFound(err) { return nil } @@ -585,7 +586,7 @@ type NodeName struct { // Get returns the host UUID of the agent from a disk. func (n *NodeName) Get(cluster *clusters.Cluster) (string, error) { - hostUUID, err := utils.ReadHostUUID(getAgentDataDir(n.cfg.AgentsDir, cluster.ProfileName)) + hostUUID, err := hostid.ReadFile(getAgentDataDir(n.cfg.AgentsDir, cluster.ProfileName)) return hostUUID, trace.Wrap(err) } diff --git a/lib/teleterm/services/connectmycomputer/connectmycomputer_test.go b/lib/teleterm/services/connectmycomputer/connectmycomputer_test.go index 9a0af0b749edf..e7b453b94b2bc 100644 --- a/lib/teleterm/services/connectmycomputer/connectmycomputer_test.go +++ b/lib/teleterm/services/connectmycomputer/connectmycomputer_test.go @@ -35,7 +35,7 @@ import ( "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/teleterm/api/uri" "github.com/gravitational/teleport/lib/teleterm/clusters" - "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" ) func TestRoleSetupRun_WithNonLocalUser(t *testing.T) { @@ -472,7 +472,7 @@ func mustMakeHostUUIDFile(t *testing.T, agentsDir string, profileName string) st err = os.MkdirAll(dataDir, agentsDirStat.Mode()) require.NoError(t, err) - hostUUID, err := utils.ReadOrMakeHostUUID(dataDir) + hostUUID, err := hostid.ReadOrCreateFile(dataDir) require.NoError(t, err) return hostUUID diff --git a/lib/usagereporter/teleport/aggregating/reporter.go b/lib/usagereporter/teleport/aggregating/reporter.go index 11f5004c6f14d..53d2cb61101a1 100644 --- a/lib/usagereporter/teleport/aggregating/reporter.go +++ b/lib/usagereporter/teleport/aggregating/reporter.go @@ -63,8 +63,8 @@ type ReporterConfig struct { // HostID is the host ID of the current Teleport instance, added to reports // for auditing purposes. Required. HostID string - // AnonymizationKey is the key used to anonymize data user or resource names. Optional. - AnonymizationKey string + // Anonymizer is used to anonymize data user or resource names. Required. + Anonymizer utils.Anonymizer } // CheckAndSetDefaults checks the [ReporterConfig] for validity, returning nil @@ -86,8 +86,8 @@ func (cfg *ReporterConfig) CheckAndSetDefaults() error { if cfg.HostID == "" { return trace.BadParameter("missing HostID") } - if cfg.AnonymizationKey == "" { - return trace.BadParameter("missing AnonymizationKey") + if cfg.Anonymizer == nil { + return trace.BadParameter("missing Anonymizer") } return nil } @@ -100,15 +100,10 @@ func NewReporter(ctx context.Context, cfg ReporterConfig) (*Reporter, error) { return nil, trace.Wrap(err) } - anonymizer, err := utils.NewHMACAnonymizer(cfg.AnonymizationKey) - if err != nil { - return nil, trace.Wrap(err) - } - baseCtx, baseCancel := context.WithCancel(ctx) r := &Reporter{ - anonymizer: anonymizer, + anonymizer: cfg.Anonymizer, svc: reportService{cfg.Backend}, log: cfg.Log, clock: cfg.Clock, @@ -117,8 +112,8 @@ func NewReporter(ctx context.Context, cfg ReporterConfig) (*Reporter, error) { closing: make(chan struct{}), done: make(chan struct{}), - clusterName: anonymizer.AnonymizeNonEmpty(cfg.ClusterName.GetClusterName()), - hostID: anonymizer.AnonymizeNonEmpty(cfg.HostID), + clusterName: cfg.ClusterName.GetClusterName(), + hostID: cfg.HostID, baseCancel: baseCancel, } @@ -145,10 +140,10 @@ type Reporter struct { // done is closed at the end of the background goroutine. done chan struct{} - // clusterName is the anonymized cluster name. - clusterName []byte - // hostID is the anonymized host ID of the reporter (this instance). - hostID []byte + // clusterName is the un-anonymized cluster name. + clusterName string + // hostID is the un-anonymized host ID of the reporter (this instance). + hostID string // baseCancel cancels the context used by the background goroutine. baseCancel context.CancelFunc @@ -303,7 +298,6 @@ Ingest: select { case <-ticker.Chan(): case ae = <-r.ingest: - case <-ctx.Done(): r.closingOnce.Do(func() { close(r.closing) }) break Ingest @@ -410,7 +404,10 @@ func (r *Reporter) persistUserActivity(ctx context.Context, startTime time.Time, records = append(records, record) } - reports, err := prepareUserActivityReports(r.clusterName, r.hostID, startTime, records) + anonymizedClusterName := r.anonymizer.AnonymizeNonEmpty(r.clusterName) + anonymizedHostID := r.anonymizer.AnonymizeNonEmpty(r.hostID) + + reports, err := prepareUserActivityReports(anonymizedClusterName, anonymizedHostID, startTime, records) if err != nil { r.log.WithError(err).WithFields(logrus.Fields{ "start_time": startTime, @@ -452,7 +449,10 @@ func (r *Reporter) persistResourcePresence(ctx context.Context, startTime time.T records = append(records, record) } - reports, err := prepareResourcePresenceReports(r.clusterName, r.hostID, startTime, records) + anonymizedClusterName := r.anonymizer.AnonymizeNonEmpty(r.clusterName) + anonymizedHostID := r.anonymizer.AnonymizeNonEmpty(r.hostID) + + reports, err := prepareResourcePresenceReports(anonymizedClusterName, anonymizedHostID, startTime, records) if err != nil { r.log.WithError(err).WithFields(logrus.Fields{ "start_time": startTime, diff --git a/lib/usagereporter/teleport/aggregating/reporter_test.go b/lib/usagereporter/teleport/aggregating/reporter_test.go index 718cc0ad1ad63..cab9be6e52158 100644 --- a/lib/usagereporter/teleport/aggregating/reporter_test.go +++ b/lib/usagereporter/teleport/aggregating/reporter_test.go @@ -36,6 +36,7 @@ import ( "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/services" usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport" + "github.com/gravitational/teleport/lib/utils" ) func TestReporter(t *testing.T) { @@ -68,13 +69,16 @@ func TestReporter(t *testing.T) { }) require.NoError(t, err) + anonymizer, err := utils.NewHMACAnonymizer("0123456789abcdef") + require.NoError(t, err) + r, err := NewReporter(ctx, ReporterConfig{ - Backend: bk, - Log: logrus.StandardLogger(), - Clock: clk, - ClusterName: clusterName, - HostID: uuid.NewString(), - AnonymizationKey: "0123456789abcdef", + Backend: bk, + Log: logrus.StandardLogger(), + Clock: clk, + ClusterName: clusterName, + HostID: uuid.NewString(), + Anonymizer: anonymizer, }) require.NoError(t, err) diff --git a/lib/usagereporter/teleport/usagereporter.go b/lib/usagereporter/teleport/usagereporter.go index 8ed4910c12f1d..d074faa3f5a45 100644 --- a/lib/usagereporter/teleport/usagereporter.go +++ b/lib/usagereporter/teleport/usagereporter.go @@ -122,20 +122,16 @@ func (t *StreamingUsageReporter) Run(ctx context.Context) { type SubmitFunc = usagereporter.SubmitFunc[prehogv1a.SubmitEventRequest] -func NewStreamingUsageReporter(log logrus.FieldLogger, clusterName types.ClusterName, anonymizationKey string, submitter SubmitFunc) (*StreamingUsageReporter, error) { +func NewStreamingUsageReporter(log logrus.FieldLogger, clusterName types.ClusterName, anonymizer utils.Anonymizer, submitter SubmitFunc) (*StreamingUsageReporter, error) { if log == nil { log = logrus.StandardLogger() } - if anonymizationKey == "" { - return nil, trace.BadParameter("anonymization key is required") - } - anonymizer, err := utils.NewHMACAnonymizer(anonymizationKey) - if err != nil { - return nil, trace.Wrap(err) + if anonymizer == nil { + return nil, trace.BadParameter("missing anonymizer") } - err = metrics.RegisterPrometheusCollectors(usagereporter.UsagePrometheusCollectors...) + err := metrics.RegisterPrometheusCollectors(usagereporter.UsagePrometheusCollectors...) if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/utils/anonymizer.go b/lib/utils/anonymizer.go index 7cbb80b5dae31..050cbd78691bc 100644 --- a/lib/utils/anonymizer.go +++ b/lib/utils/anonymizer.go @@ -23,6 +23,7 @@ import ( "crypto/sha256" "encoding/base64" "strings" + "sync" "github.com/gravitational/trace" ) @@ -38,16 +39,26 @@ type Anonymizer interface { // AnonymizeNonEmpty anonymizes the given string into bytes if the string is // nonempty, otherwise returns an empty slice. AnonymizeNonEmpty(s string) []byte + + // SetAnonymizationKey updates the underlying anonymization key. + SetAnonymizationKey(k []byte) } -// hmacAnonymizer implements anonymization using HMAC +// HMACAnonymizer implements anonymization using HMAC type HMACAnonymizer struct { // key is the HMAC key key []byte + mu sync.RWMutex } var _ Anonymizer = (*HMACAnonymizer)(nil) +func (a *HMACAnonymizer) SetAnonymizationKey(k []byte) { + a.mu.Lock() + a.key = k + a.mu.Unlock() +} + // NewHMACAnonymizer returns a new HMAC-based anonymizer func NewHMACAnonymizer(key string) (*HMACAnonymizer, error) { if strings.TrimSpace(key) == "" { @@ -58,7 +69,11 @@ func NewHMACAnonymizer(key string) (*HMACAnonymizer, error) { // Anonymize anonymizes the provided data using HMAC func (a *HMACAnonymizer) Anonymize(data []byte) string { - h := hmac.New(sha256.New, a.key) + a.mu.RLock() + k := a.key + a.mu.RUnlock() + + h := hmac.New(sha256.New, k) h.Write(data) return base64.StdEncoding.EncodeToString(h.Sum(nil)) } @@ -73,7 +88,12 @@ func (a *HMACAnonymizer) AnonymizeNonEmpty(s string) []byte { if s == "" { return nil } - h := hmac.New(sha256.New, a.key) + + a.mu.RLock() + k := a.key + a.mu.RUnlock() + + h := hmac.New(sha256.New, k) h.Write([]byte(s)) return h.Sum(nil) } diff --git a/lib/utils/hostid/hostid.go b/lib/utils/hostid/hostid.go new file mode 100644 index 0000000000000..094e4cf9547ae --- /dev/null +++ b/lib/utils/hostid/hostid.go @@ -0,0 +1,61 @@ +// 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 hostid + +import ( + "errors" + "io/fs" + "path/filepath" + "strings" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/lib/utils" +) + +const ( + // FileName is the file name where the host UUID file is stored + FileName = "host_uuid" +) + +// GetPath returns the path to the host UUID file given the data directory. +func GetPath(dataDir string) string { + return filepath.Join(dataDir, FileName) +} + +// ExistsLocally checks if dataDir/host_uuid file exists in local storage. +func ExistsLocally(dataDir string) bool { + _, err := ReadFile(dataDir) + return err == nil +} + +// ReadFile reads host UUID from the file in the data dir +func ReadFile(dataDir string) (string, error) { + out, err := utils.ReadPath(GetPath(dataDir)) + if err != nil { + if errors.Is(err, fs.ErrPermission) { + //do not convert to system error as this loses the ability to compare that it is a permission error + return "", trace.Wrap(err) + } + return "", trace.ConvertSystemError(err) + } + id := strings.TrimSpace(string(out)) + if id == "" { + return "", trace.NotFound("host uuid is empty") + } + return id, nil +} diff --git a/lib/utils/hostid/hostid_test.go b/lib/utils/hostid/hostid_test.go new file mode 100644 index 0000000000000..2ea22c4e71e7f --- /dev/null +++ b/lib/utils/hostid/hostid_test.go @@ -0,0 +1,116 @@ +//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 hostid_test + +import ( + "fmt" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.org/x/sync/errgroup" + + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" +) + +func TestMain(m *testing.M) { + utils.InitLoggerForTests() + os.Exit(m.Run()) +} + +func TestReadOrCreate(t *testing.T) { + t.Parallel() + + dir := t.TempDir() + + var wg errgroup.Group + concurrency := 10 + ids := make([]string, concurrency) + barrier := make(chan struct{}) + + for i := 0; i < concurrency; i++ { + i := i + wg.Go(func() error { + <-barrier + id, err := hostid.ReadOrCreateFile(dir) + ids[i] = id + return err + }) + } + + close(barrier) + + require.NoError(t, wg.Wait()) + for _, id := range ids { + assert.Equal(t, ids[0], id) + } +} + +func TestIdempotence(t *testing.T) { + t.Parallel() + + // call twice, get same result + dir := t.TempDir() + id, err := hostid.ReadOrCreateFile(dir) + require.Len(t, id, 36) + require.NoError(t, err) + uuidCopy, err := hostid.ReadOrCreateFile(dir) + require.NoError(t, err) + require.Equal(t, id, uuidCopy) +} + +func TestBadLocation(t *testing.T) { + t.Parallel() + + // call with a read-only dir, make sure to get an error + id, err := hostid.ReadOrCreateFile("/bad-location") + require.Empty(t, id) + require.Error(t, err) + require.Regexp(t, "^.*no such file or directory.*$", err.Error()) +} + +func TestIgnoreWhitespace(t *testing.T) { + t.Parallel() + + // newlines are getting ignored + dir := t.TempDir() + id := fmt.Sprintf("%s\n", uuid.NewString()) + err := os.WriteFile(filepath.Join(dir, hostid.FileName), []byte(id), 0666) + require.NoError(t, err) + out, err := hostid.ReadFile(dir) + require.NoError(t, err) + require.Equal(t, strings.TrimSpace(id), out) +} + +func TestRegenerateEmpty(t *testing.T) { + t.Parallel() + + // empty UUID in file is regenerated + dir := t.TempDir() + err := os.WriteFile(filepath.Join(dir, hostid.FileName), nil, 0666) + require.NoError(t, err) + out, err := hostid.ReadOrCreateFile(dir) + require.NoError(t, err) + require.Len(t, out, 36) +} diff --git a/lib/utils/hostid/hostid_unix.go b/lib/utils/hostid/hostid_unix.go new file mode 100644 index 0000000000000..b5334e641c232 --- /dev/null +++ b/lib/utils/hostid/hostid_unix.go @@ -0,0 +1,105 @@ +//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 hostid + +import ( + "errors" + "io/fs" + "time" + + "github.com/google/renameio/v2" + "github.com/google/uuid" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/lib/utils" +) + +// WriteFile writes host UUID into a file +func WriteFile(dataDir string, id string) error { + err := renameio.WriteFile(GetPath(dataDir), []byte(id), 0o400) + if err != nil { + if errors.Is(err, fs.ErrPermission) { + //do not convert to system error as this loses the ability to compare that it is a permission error + return trace.Wrap(err) + } + return trace.ConvertSystemError(err) + } + return nil +} + +// ReadOrCreateFile looks for a hostid file in the data dir. If present, +// returns the UUID from it, otherwise generates one +func ReadOrCreateFile(dataDir string) (string, error) { + hostUUIDFileLock := GetPath(dataDir) + ".lock" + const iterationLimit = 3 + + for i := 0; i < iterationLimit; i++ { + if read, err := ReadFile(dataDir); err == nil { + return read, nil + } else if !trace.IsNotFound(err) { + return "", trace.Wrap(err) + } + + // Checking error instead of the usual uuid.New() in case uuid generation + // fails due to not enough randomness. It's been known to happen happen when + // Teleport starts very early in the node initialization cycle and /dev/urandom + // isn't ready yet. + rawID, err := uuid.NewRandom() + if err != nil { + return "", trace.BadParameter("" + + "Teleport failed to generate host UUID. " + + "This may happen if randomness source is not fully initialized when the node is starting up. " + + "Please try restarting Teleport again.") + } + + writeFile := func(potentialID string) (string, error) { + unlock, err := utils.FSTryWriteLock(hostUUIDFileLock) + if err != nil { + return "", trace.Wrap(err) + } + defer unlock() + + if read, err := ReadFile(dataDir); err == nil { + return read, nil + } else if !trace.IsNotFound(err) { + return "", trace.Wrap(err) + } + + if err := WriteFile(dataDir, potentialID); err != nil { + return "", trace.Wrap(err) + } + + return potentialID, nil + } + + id, err := writeFile(rawID.String()) + if err != nil { + if errors.Is(err, utils.ErrUnsuccessfulLockTry) { + time.Sleep(100 * time.Millisecond) + continue + } + + return "", trace.Wrap(err) + } + + return id, nil + } + + return "", trace.LimitExceeded("failed to obtain host uuid") +} diff --git a/lib/utils/hostid/hostid_windows.go b/lib/utils/hostid/hostid_windows.go new file mode 100644 index 0000000000000..ab2a5a55e56d7 --- /dev/null +++ b/lib/utils/hostid/hostid_windows.go @@ -0,0 +1,30 @@ +// 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 hostid + +import "github.com/gravitational/trace" + +// WriteFile writes host UUID into a file +func WriteFile(dataDir string, id string) error { + return trace.NotImplemented("host id writing is not supported on windows") +} + +// ReadOrCreateFile looks for a hostid file in the data dir. If present, +// returns the UUID from it, otherwise generates one +func ReadOrCreateFile(dataDir string) (string, error) { + return "", trace.NotImplemented("host id writing is not supported on windows") +} diff --git a/lib/utils/utils.go b/lib/utils/utils.go index b1931e2ae8cf4..5da5b39d05685 100644 --- a/lib/utils/utils.go +++ b/lib/utils/utils.go @@ -37,7 +37,6 @@ import ( "time" "unicode" - "github.com/google/uuid" "github.com/gravitational/trace" log "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/util/validation" @@ -468,75 +467,6 @@ func GetFreeTCPPorts(n int, offset ...int) (PortList, error) { return PortList{ports: list}, nil } -// GetHostUUIDPath returns the path to the host UUID file given the data directory. -func GetHostUUIDPath(dataDir string) string { - return filepath.Join(dataDir, HostUUIDFile) -} - -// HostUUIDExistsLocally checks if dataDir/host_uuid file exists in local storage. -func HostUUIDExistsLocally(dataDir string) bool { - _, err := ReadHostUUID(dataDir) - return err == nil -} - -// ReadHostUUID reads host UUID from the file in the data dir -func ReadHostUUID(dataDir string) (string, error) { - out, err := ReadPath(GetHostUUIDPath(dataDir)) - if err != nil { - if errors.Is(err, fs.ErrPermission) { - //do not convert to system error as this loses the ability to compare that it is a permission error - return "", err - } - return "", trace.ConvertSystemError(err) - } - id := strings.TrimSpace(string(out)) - if id == "" { - return "", trace.NotFound("host uuid is empty") - } - return id, nil -} - -// WriteHostUUID writes host UUID into a file -func WriteHostUUID(dataDir string, id string) error { - err := os.WriteFile(GetHostUUIDPath(dataDir), []byte(id), os.ModeExclusive|0400) - if err != nil { - if errors.Is(err, fs.ErrPermission) { - //do not convert to system error as this loses the ability to compare that it is a permission error - return err - } - return trace.ConvertSystemError(err) - } - return nil -} - -// ReadOrMakeHostUUID looks for a hostid file in the data dir. If present, -// returns the UUID from it, otherwise generates one -func ReadOrMakeHostUUID(dataDir string) (string, error) { - id, err := ReadHostUUID(dataDir) - if err == nil { - return id, nil - } - if !trace.IsNotFound(err) { - return "", trace.Wrap(err) - } - // Checking error instead of the usual uuid.New() in case uuid generation - // fails due to not enough randomness. It's been known to happen happen when - // Teleport starts very early in the node initialization cycle and /dev/urandom - // isn't ready yet. - rawID, err := uuid.NewRandom() - if err != nil { - return "", trace.BadParameter("" + - "Teleport failed to generate host UUID. " + - "This may happen if randomness source is not fully initialized when the node is starting up. " + - "Please try restarting Teleport again.") - } - id = rawID.String() - if err = WriteHostUUID(dataDir, id); err != nil { - return "", trace.Wrap(err) - } - return id, nil -} - // StringSliceSubset returns true if b is a subset of a. func StringSliceSubset(a []string, b []string) error { aset := make(map[string]bool) @@ -712,8 +642,6 @@ const ( // CertExtensionAuthority specifies teleport authority's name // that signed this domain CertExtensionAuthority = "x-teleport-authority" - // HostUUIDFile is the file name where the host UUID file is stored - HostUUIDFile = "host_uuid" // CertTeleportClusterName is a name of the teleport cluster CertTeleportClusterName = "x-teleport-cluster-name" // CertTeleportUserCertificate is the certificate of the authenticated in user. diff --git a/lib/utils/utils_test.go b/lib/utils/utils_test.go index 42ca172f35b78..e1625915bb204 100644 --- a/lib/utils/utils_test.go +++ b/lib/utils/utils_test.go @@ -20,14 +20,12 @@ package utils import ( "bytes" - "fmt" "os" "path/filepath" "strings" "testing" "time" - "github.com/google/uuid" "github.com/gravitational/trace" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -41,54 +39,6 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -func TestHostUUIDIdempotent(t *testing.T) { - t.Parallel() - - // call twice, get same result - dir := t.TempDir() - id, err := ReadOrMakeHostUUID(dir) - require.Len(t, id, 36) - require.NoError(t, err) - uuidCopy, err := ReadOrMakeHostUUID(dir) - require.NoError(t, err) - require.Equal(t, id, uuidCopy) -} - -func TestHostUUIDBadLocation(t *testing.T) { - t.Parallel() - - // call with a read-only dir, make sure to get an error - id, err := ReadOrMakeHostUUID("/bad-location") - require.Empty(t, id) - require.Error(t, err) - require.Regexp(t, "^.*no such file or directory.*$", err.Error()) -} - -func TestHostUUIDIgnoreWhitespace(t *testing.T) { - t.Parallel() - - // newlines are getting ignored - dir := t.TempDir() - id := fmt.Sprintf("%s\n", uuid.NewString()) - err := os.WriteFile(filepath.Join(dir, HostUUIDFile), []byte(id), 0666) - require.NoError(t, err) - out, err := ReadHostUUID(dir) - require.NoError(t, err) - require.Equal(t, strings.TrimSpace(id), out) -} - -func TestHostUUIDRegenerateEmpty(t *testing.T) { - t.Parallel() - - // empty UUID in file is regenerated - dir := t.TempDir() - err := os.WriteFile(filepath.Join(dir, HostUUIDFile), nil, 0666) - require.NoError(t, err) - out, err := ReadOrMakeHostUUID(dir) - require.NoError(t, err) - require.Len(t, out, 36) -} - func TestSelfSignedCert(t *testing.T) { t.Parallel() diff --git a/lib/web/features.go b/lib/web/features.go index 395838b21158a..0077e0ee1c43a 100644 --- a/lib/web/features.go +++ b/lib/web/features.go @@ -19,6 +19,8 @@ package web import ( + "bytes" + "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/entitlements" ) @@ -28,6 +30,10 @@ func (h *Handler) SetClusterFeatures(features proto.Features) { h.Mutex.Lock() defer h.Mutex.Unlock() + if !bytes.Equal(h.clusterFeatures.CloudAnonymizationKey, features.CloudAnonymizationKey) { + h.log.Info("Received new cloud anonymization key from server") + } + entitlements.BackfillFeatures(&features) h.clusterFeatures = features } diff --git a/lib/web/ui/server.go b/lib/web/ui/server.go index af1adf66d3190..f448d820b03db 100644 --- a/lib/web/ui/server.go +++ b/lib/web/ui/server.go @@ -103,12 +103,14 @@ func MakeServer(clusterName string, server types.Server, logins []string, requir // EKSCluster represents and EKS cluster, analog of awsoidc.EKSCluster, but used by web ui. type EKSCluster struct { - Name string `json:"name"` - Region string `json:"region"` - Arn string `json:"arn"` - Labels []ui.Label `json:"labels"` - JoinLabels []ui.Label `json:"joinLabels"` - Status string `json:"status"` + Name string `json:"name"` + Region string `json:"region"` + Arn string `json:"arn"` + Labels []ui.Label `json:"labels"` + JoinLabels []ui.Label `json:"joinLabels"` + Status string `json:"status"` + EndpointPublicAccess bool `json:"endpointPublicAccess"` + AuthenticationMode string `json:"authenticationMode"` } // KubeCluster describes a kube cluster. @@ -149,12 +151,14 @@ func MakeEKSClusters(clusters []*integrationv1.EKSCluster) []EKSCluster { for _, cluster := range clusters { uiEKSClusters = append(uiEKSClusters, EKSCluster{ - Name: cluster.Name, - Region: cluster.Region, - Arn: cluster.Arn, - Labels: ui.MakeLabelsWithoutInternalPrefixes(cluster.Labels), - JoinLabels: ui.MakeLabelsWithoutInternalPrefixes(cluster.JoinLabels), - Status: cluster.Status, + Name: cluster.Name, + Region: cluster.Region, + Arn: cluster.Arn, + Labels: ui.MakeLabelsWithoutInternalPrefixes(cluster.Labels), + JoinLabels: ui.MakeLabelsWithoutInternalPrefixes(cluster.JoinLabels), + Status: cluster.Status, + EndpointPublicAccess: cluster.EndpointPublicAccess, + AuthenticationMode: cluster.AuthenticationMode, }) } return uiEKSClusters diff --git a/tool/tctl/common/admin_action_test.go b/tool/tctl/common/admin_action_test.go index 7e9ff52ceae3a..b910cf239b5ab 100644 --- a/tool/tctl/common/admin_action_test.go +++ b/tool/tctl/common/admin_action_test.go @@ -56,6 +56,7 @@ import ( "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" tctl "github.com/gravitational/teleport/tool/tctl/common" testserver "github.com/gravitational/teleport/tool/teleport/testenv" tsh "github.com/gravitational/teleport/tool/tsh/common" @@ -1076,7 +1077,7 @@ func newAdminActionTestSuite(t *testing.T) *adminActionTestSuite { }) require.NoError(t, err) - hostUUID, err := utils.ReadHostUUID(process.Config.DataDir) + hostUUID, err := hostid.ReadFile(process.Config.DataDir) require.NoError(t, err) localAdmin, err := storage.ReadLocalIdentity( filepath.Join(process.Config.DataDir, teleport.ComponentProcess), diff --git a/tool/tctl/common/plugin/entraid.go b/tool/tctl/common/plugin/entraid.go index ea5010504ca9f..c537be2680da8 100644 --- a/tool/tctl/common/plugin/entraid.go +++ b/tool/tctl/common/plugin/entraid.go @@ -36,6 +36,7 @@ import ( "github.com/gravitational/trace" pluginspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" + "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" entraapiutils "github.com/gravitational/teleport/api/utils/entraid" "github.com/gravitational/teleport/lib/integrations/azureoidc" @@ -65,10 +66,21 @@ To rerun the script, type 'exit' to close and then restart the process. ` step2Template = ` - + ` + bold("Step 2: Input Tenant ID and Client ID") + ` With the output of Step 1, please copy and paste the following information: +` + + manualConfigurationTemplate = ` + +` + bold("Step 1: Input Tenant ID and Client ID") + ` + +To finish the Entra ID integration, manually configure the Application in Microsoft Entra ID. + +Follow the instructions provided in the Teleport documentation: [https://goteleport.com/docs/admin-guides/teleport-policy/integrations/entra-id/]. + +After completing the Entra ID setup, copy and paste the following information: ` ) @@ -79,10 +91,11 @@ type entraArgs struct { useSystemCredentials bool accessGraph bool force bool + manualEntraIDSetup bool } func (p *PluginsCommand) initInstallEntra(parent *kingpin.CmdClause) { - p.install.entraID.cmd = parent.Command("entraid", "Install an EntraId integration.") + p.install.entraID.cmd = parent.Command("entraid", "Install an Microsoft Entra ID integration.") cmd := p.install.entraID.cmd cmd. Flag("name", "Name of the plugin resource to create"). @@ -112,6 +125,12 @@ func (p *PluginsCommand) initInstallEntra(parent *kingpin.CmdClause) { Short('f'). Default("false"). BoolVar(&p.install.entraID.force) + + cmd. + Flag("manual-setup", "Manually set up the EntraID integration."). + Short('m'). + Default("false"). + BoolVar(&p.install.entraID.manualEntraIDSetup) } type entraSettings struct { @@ -120,11 +139,15 @@ type entraSettings struct { tenantID string } -var ( - errCancel = trace.BadParameter("operation canceled") -) +var errCancel = trace.BadParameter("operation canceled") + +func (p *PluginsCommand) entraSetupGuide(proxyPublicAddr string, manualEntraIDSetup bool) (entraSettings, error) { + if manualEntraIDSetup { + fmt.Fprint(os.Stdout, manualConfigurationTemplate) + settings, err := readAzureInputs(p.install.entraID.accessGraph) + return settings, trace.Wrap(err) + } -func (p *PluginsCommand) entraSetupGuide(proxyPublicAddr string) (entraSettings, error) { pwd, err := os.Getwd() if err != nil { return entraSettings{}, trace.Wrap(err, "failed to get working dir") @@ -164,14 +187,19 @@ func (p *PluginsCommand) entraSetupGuide(proxyPublicAddr string) (entraSettings, return entraSettings{}, errCancel } + fmt.Fprint(os.Stdout, step2Template) + + settings, err := readAzureInputs(p.install.entraID.accessGraph) + return settings, trace.Wrap(err) +} + +func readAzureInputs(acessGraph bool) (entraSettings, error) { validUUID := func(input string) bool { _, err := uuid.Parse(input) return err == nil } - - fmt.Fprint(os.Stdout, step2Template) - var settings entraSettings + var err error settings.tenantID, err = readData(os.Stdin, os.Stdout, "Enter the Tenant ID", validUUID, "Invalid Tenant ID") if err != nil { return settings, trace.Wrap(err, "failed to read Tenant ID") @@ -182,7 +210,7 @@ func (p *PluginsCommand) entraSetupGuide(proxyPublicAddr string) (entraSettings, return settings, trace.Wrap(err, "failed to read Client ID") } - if p.install.entraID.accessGraph { + if acessGraph { dataValidator := func(input string) bool { settings.accessGraphCache, err = readTAGCache(input) return err == nil @@ -219,7 +247,7 @@ func (p *PluginsCommand) InstallEntra(ctx context.Context, args installPluginArg return trace.Wrap(err) } - settings, err := p.entraSetupGuide(proxyPublicAddr) + settings, err := p.entraSetupGuide(proxyPublicAddr, inputs.entraID.manualEntraIDSetup) if err != nil { if errors.Is(err, errCancel) { return nil @@ -234,6 +262,14 @@ func (p *PluginsCommand) InstallEntra(ctx context.Context, args installPluginArg } } + // Prompt for admin action MFA if required, allowing reuse for UpsertToken and CreateBot. + mfaResponse, err := mfa.PerformAdminActionMFACeremony(ctx, args.authClient.PerformMFACeremony, true /*allowReuse*/) + if err == nil { + ctx = mfa.ContextWithMFAResponse(ctx, mfaResponse) + } else if !errors.Is(err, &mfa.ErrMFANotRequired) && !errors.Is(err, &mfa.ErrMFANotSupported) { + return trace.Wrap(err) + } + saml, err := types.NewSAMLConnector(inputs.entraID.authConnectorName, types.SAMLConnectorSpecV2{ AssertionConsumerService: strings.TrimRight(proxyPublicAddr, "/") + "/v1/webapi/saml/acs/" + inputs.entraID.authConnectorName, AllowIDPInitiated: true, @@ -310,6 +346,7 @@ func (p *PluginsCommand) InstallEntra(ctx context.Context, args installPluginArg SsoConnectorId: inputs.entraID.authConnectorName, CredentialsSource: credentialsSource, TenantId: settings.tenantID, + EntraAppId: settings.clientID, }, AccessGraphSettings: tagSyncSettings, }, diff --git a/tool/tctl/common/plugin/plugins_command.go b/tool/tctl/common/plugin/plugins_command.go index df8b9eeb4ed3b..bcc2661caf8c7 100644 --- a/tool/tctl/common/plugin/plugins_command.go +++ b/tool/tctl/common/plugin/plugins_command.go @@ -32,6 +32,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/client/proto" pluginsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" + "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/service/servicecfg" @@ -128,7 +129,6 @@ func (p *PluginsCommand) initInstallSCIM(parent *kingpin.CmdClause) { Short('f'). Default("false"). BoolVar(&p.install.scim.force) - } func (p *PluginsCommand) initDelete(parent *kingpin.CmdClause) { @@ -208,6 +208,7 @@ type authClient interface { GetIntegration(ctx context.Context, name string) (types.Integration, error) UpdateIntegration(ctx context.Context, ig types.Integration) (types.Integration, error) Ping(ctx context.Context) (proto.PingResponse, error) + PerformMFACeremony(ctx context.Context, challengeRequest *proto.CreateAuthenticateChallengeRequest, promptOpts ...mfa.PromptOpt) (*proto.MFAAuthenticateResponse, error) } type pluginsClient interface { diff --git a/tool/tctl/common/plugin/plugins_command_test.go b/tool/tctl/common/plugin/plugins_command_test.go index 9033311f3272c..3254e813ee205 100644 --- a/tool/tctl/common/plugin/plugins_command_test.go +++ b/tool/tctl/common/plugin/plugins_command_test.go @@ -32,6 +32,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" pluginsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/plugins/v1" + "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/service/servicecfg" ) @@ -494,5 +495,9 @@ func (m *mockAuthClient) Ping(ctx context.Context) (proto.PingResponse, error) { return result.Get(0).(proto.PingResponse), result.Error(1) } +func (m *mockAuthClient) PerformMFACeremony(ctx context.Context, challengeRequest *proto.CreateAuthenticateChallengeRequest, promptOpts ...mfa.PromptOpt) (*proto.MFAAuthenticateResponse, error) { + return &proto.MFAAuthenticateResponse{}, nil +} + // anyContext is an argument matcher for testify mocks that matches any context. var anyContext any = mock.MatchedBy(func(context.Context) bool { return true }) diff --git a/tool/tctl/common/tctl.go b/tool/tctl/common/tctl.go index b4d0883c8464b..6ee12979b73bc 100644 --- a/tool/tctl/common/tctl.go +++ b/tool/tctl/common/tctl.go @@ -52,6 +52,7 @@ import ( "github.com/gravitational/teleport/lib/reversetunnelclient" "github.com/gravitational/teleport/lib/service/servicecfg" "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" "github.com/gravitational/teleport/tool/common" ) @@ -380,16 +381,16 @@ func ApplyConfig(ccf *GlobalCLIFlags, cfg *servicecfg.Config) (*authclient.Confi authConfig := new(authclient.Config) // read the host UUID only in case the identity was not provided, // because it will be used for reading local auth server identity - cfg.HostUUID, err = utils.ReadHostUUID(cfg.DataDir) + cfg.HostUUID, err = hostid.ReadFile(cfg.DataDir) if err != nil { if errors.Is(err, fs.ErrNotExist) { return nil, trace.Wrap(err, "Could not load Teleport host UUID file at %s. "+ "Please make sure that a Teleport Auth Service instance is running on this host prior to using tctl or provide credentials by logging in with tsh first.", - filepath.Join(cfg.DataDir, utils.HostUUIDFile)) + filepath.Join(cfg.DataDir, hostid.FileName)) } else if errors.Is(err, fs.ErrPermission) { return nil, trace.Wrap(err, "Teleport does not have permission to read Teleport host UUID file at %s. "+ "Ensure that you are running as a user with appropriate permissions or provide credentials by logging in with tsh first.", - filepath.Join(cfg.DataDir, utils.HostUUIDFile)) + filepath.Join(cfg.DataDir, hostid.FileName)) } return nil, trace.Wrap(err) } diff --git a/tool/teleport/testenv/test_server.go b/tool/teleport/testenv/test_server.go index 759abe0d56a4e..234ad8296792b 100644 --- a/tool/teleport/testenv/test_server.go +++ b/tool/teleport/testenv/test_server.go @@ -62,6 +62,7 @@ import ( "github.com/gravitational/teleport/lib/sshutils" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/hostid" "github.com/gravitational/teleport/tool/teleport/common" ) @@ -695,7 +696,7 @@ func MakeDefaultAuthClient(t *testing.T, process *service.TeleportProcess) *auth t.Helper() cfg := process.Config - hostUUID, err := utils.ReadHostUUID(process.Config.DataDir) + hostUUID, err := hostid.ReadFile(process.Config.DataDir) require.NoError(t, err) identity, err := storage.ReadLocalIdentity( diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 8dbcb60688e7a..167f3a5d07cbb 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -2659,6 +2659,10 @@ func executeAccessRequest(cf *CLIConf, tc *client.TeleportClient) error { req, err = clt.CreateAccessRequestV2(cf.Context, req) return trace.Wrap(err) }); err != nil { + if strings.Contains(err.Error(), services.InvalidKubernetesKindAccessRequest) { + friendlyMsg := fmt.Sprintf("%s\nTry searching for specific kinds with:\n> tsh request search --kube-cluster=KUBE_CLUSTER_NAME --kind=KIND", err.Error()) + return trace.BadParameter(friendlyMsg) + } return trace.Wrap(err) } cf.RequestID = req.GetName() diff --git a/web/packages/design/src/DataTable/Table.tsx b/web/packages/design/src/DataTable/Table.tsx index 47cc0348eb861..fd4b76ca2378a 100644 --- a/web/packages/design/src/DataTable/Table.tsx +++ b/web/packages/design/src/DataTable/Table.tsx @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -import React from 'react'; +import React, { PropsWithChildren } from 'react'; import { Box, Flex, Indicator, Text } from 'design'; import * as Icons from 'design/Icon'; @@ -110,6 +110,22 @@ export function Table({ return ; } data.map((item, rowIdx) => { + const TableRow: React.FC = ({ children }) => ( + row?.onClick?.(item)} + style={row?.getStyle?.(item)} + > + {children} + + ); + + const customRow = row?.customRow?.(item); + if (customRow) { + rows.push({customRow}); + return; + } + const cells = columns.flatMap((column, columnIdx) => { if (column.isNonRender) { return []; // does not include this column. @@ -127,15 +143,7 @@ export function Table({ ); }); - rows.push( - row?.onClick?.(item)} - style={row?.getStyle?.(item)} - > - {cells} - - ); + rows.push({cells}); }); if (rows.length) { diff --git a/web/packages/design/src/DataTable/types.ts b/web/packages/design/src/DataTable/types.ts index 53a0abe644e60..afdaf940c2212 100644 --- a/web/packages/design/src/DataTable/types.ts +++ b/web/packages/design/src/DataTable/types.ts @@ -79,6 +79,14 @@ export type TableProps = { * conditionally style a row (eg: cursor: pointer, disabled) */ getStyle?(row: T): React.CSSProperties; + /** + * conditionally render a custom row + * use case: by default all columns are represented by cells + * but certain rows you need all the columns to be merged + * into one cell to render other related elements like a + * dropdown selector. + */ + customRow?(row: T): JSX.Element; }; }; diff --git a/web/packages/design/src/Icon/script/StoryTemplate.txt b/web/packages/design/src/Icon/script/StoryTemplate.txt index 1566b54266c9d..895fc4dab3d6e 100644 --- a/web/packages/design/src/Icon/script/StoryTemplate.txt +++ b/web/packages/design/src/Icon/script/StoryTemplate.txt @@ -16,12 +16,14 @@ * along with this program. If not, see . */ -import React from 'react'; +import { ComponentType } from 'react'; import { Text } from '..'; import Flex from './../Flex'; +import { IconProps } from './Icon'; + import * as Icon from '.'; export default { @@ -40,7 +42,13 @@ export const Icons = () => ( ); -const IconBox = ({ IconCmpt, text }) => ( +const IconBox = ({ + IconCmpt, + text, +}: { + IconCmpt: ComponentType; + text: string; +}) => ( {text} diff --git a/web/packages/design/src/Link/Link.jsx b/web/packages/design/src/Link/Link.jsx index 957be80a5f7be..260c31f85094b 100644 --- a/web/packages/design/src/Link/Link.jsx +++ b/web/packages/design/src/Link/Link.jsx @@ -31,7 +31,6 @@ const StyledButtonLink = styled.a.attrs({ rel: 'noreferrer', })` color: ${({ theme }) => theme.colors.buttons.link.default}; - font-weight: normal; background: none; text-decoration: underline; text-transform: none; diff --git a/web/packages/design/src/Onboard/__snapshots__/WelcomeWrapper.story.test.tsx.snap b/web/packages/design/src/Onboard/__snapshots__/WelcomeWrapper.story.test.tsx.snap index 7a40b24bb5ff9..71b0808b0f065 100644 --- a/web/packages/design/src/Onboard/__snapshots__/WelcomeWrapper.story.test.tsx.snap +++ b/web/packages/design/src/Onboard/__snapshots__/WelcomeWrapper.story.test.tsx.snap @@ -35,7 +35,6 @@ exports[`wrapper 1`] = ` .c13 { color: #009EFF; - font-weight: normal; background: none; text-decoration: underline; text-transform: none; diff --git a/web/packages/shared/components/AccessRequests/NewRequest/CheckableOption.tsx b/web/packages/shared/components/AccessRequests/NewRequest/CheckableOption.tsx new file mode 100644 index 0000000000000..f10b940050628 --- /dev/null +++ b/web/packages/shared/components/AccessRequests/NewRequest/CheckableOption.tsx @@ -0,0 +1,48 @@ +/** + * 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 . + */ + +import React from 'react'; +import { Flex, Text } from 'design'; +import { components, OptionProps } from 'react-select'; + +import { Option as BaseOption } from 'shared/components/Select'; + +export type Option = BaseOption & { + isAdded?: boolean; + kind: 'app' | 'user_group' | 'namespace'; +}; + +export const CheckableOptionComponent = ( + props: OptionProps