diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 9e1f033d39cd3..43b6cc4c1dedf 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -6994,6 +6994,7 @@ message PluginStaticCredentialsSpecV1 { string APIToken = 1; PluginStaticCredentialsBasicAuth BasicAuth = 2; PluginStaticCredentialsOAuthClientSecret OAuthClientSecret = 3; + PluginStaticCredentialsSSHCertAuthorities SSHCertAuthorities = 4; } } @@ -7015,6 +7016,14 @@ message PluginStaticCredentialsOAuthClientSecret { string ClientSecret = 2 [(gogoproto.jsontag) = "client_secret"]; } +// PluginStaticCredentialsSSHCertAuthorities contains the active SSH CAs used +// for the integration or plugin. +message PluginStaticCredentialsSSHCertAuthorities { + // CertAuthorities contains the active SSH CAs used for the integration or + // plugin. + repeated SSHKeyPair cert_authorities = 1; +} + // SAMLIdPServiceProviderV1 is the representation of a SAML IdP service provider. message SAMLIdPServiceProviderV1 { option (gogoproto.goproto_stringer) = false; @@ -7365,6 +7374,9 @@ message IntegrationSpecV1 { // GitHub contains the specific fields to handle the GitHub integration subkind. GitHubIntegrationSpecV1 GitHub = 3 [(gogoproto.jsontag) = "github,omitempty"]; } + + // Credentials contains credentials for the integration. + PluginCredentialsV1 credentials = 4; } // AWSOIDCIntegrationSpecV1 contains the spec properties for the AWS OIDC SubKind Integration. @@ -7413,27 +7425,12 @@ message AzureOIDCIntegrationSpecV1 { message GitHubIntegrationSpecV1 { // Organization specifies the name of the organization for the GitHub integration. string Organization = 1 [(gogoproto.jsontag) = "organization,omitempty"]; - - // Proxy specifies GitHub proxy related settings. - GitHubProxy proxy = 2 [(gogoproto.jsontag) = "proxy,omitempty"]; -} - -// GitHubProxy specifies GitHub proxy related settings. -message GitHubProxy { - // CertAuthority contains the active SSH CAs used between Teleport and - // GitHub. GitHub does not allow the same CA to be used for a different - // organization so the CA is defined per integration. TODO(greedy52) support - // rotation, HSM encryption. - repeated SSHKeyPair cert_authorities = 1 [(gogoproto.jsontag) = "cert_authorities,omitempty"]; - - // Connector specifies the GitHub connector spec used to obtain user ID and - // username. - GitHubProxyConnector connector = 2 [(gogoproto.jsontag) = "connector,omitempty"]; } // GitHubProxyConnector specifies the GitHub connector spec for a GitHub proxy. // This type is a subset of GithubConnectorSpecV3 but does not require fields -// like TeamRolesMapping. +// like TeamRolesMapping. ClientID and ClientSecret are defined for object +// creation request and then will be saved in static credentials instead. message GitHubProxyConnector { // ClientID is the Github OAuth app client ID. string ClientID = 1 [(gogoproto.jsontag) = "client_id"]; diff --git a/api/types/integration.go b/api/types/integration.go index fb8331da64d92..36f8779ba4571 100644 --- a/api/types/integration.go +++ b/api/types/integration.go @@ -22,6 +22,8 @@ import ( "net/url" "github.com/gravitational/trace" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/protoadapt" "github.com/gravitational/teleport/api/utils" ) @@ -70,8 +72,12 @@ type Integration interface { // SetGitHubIntegrationSpec returns the GitHub spec. SetGitHubIntegrationSpec(*GitHubIntegrationSpecV1) - // WithoutSecrets returns an instance of resource without secrets. - WithoutSecrets() Integration + // SetCredentials updates credentials. + SetCredentials(creds PluginCredentials) error + // GetCredentials retrieves credentials. + GetCredentials() PluginCredentials + // WithoutCredentials returns a copy without credentials. + WithoutCredentials() Integration } var _ ResourceWithLabels = (*IntegrationV1)(nil) @@ -272,40 +278,8 @@ func (s *IntegrationSpecV1_GitHub) CheckAndSetDefaults() error { if s == nil || s.GitHub == nil { return trace.BadParameter("github is required for %q subkind", IntegrationSubKindGitHub) } - if s.GitHub.Organization == "" { - return trace.BadParameter("organization must be set") - } - if s.GitHub.Proxy == nil { - s.GitHub.Proxy = &GitHubProxy{} - } - if err := s.GitHub.Proxy.CheckAndSetDefaults(); err != nil { - return trace.Wrap(err) - } - return nil -} - -// CheckAndSetDefaults validates the configuration for GitHub proxy settings. -func (p *GitHubProxy) CheckAndSetDefaults() error { - for _, ca := range p.CertAuthorities { - if err := ca.CheckAndSetDefaults(); err != nil { - return trace.Wrap(err) - } - } - if p.Connector != nil { - if err := p.Connector.CheckAndSetDefaults(); err != nil { - return trace.Wrap(err) - } - } - return nil -} - -// CheckAndSetDefaults validates the configuration for GitHub Proxy connector. -func (c *GitHubProxyConnector) CheckAndSetDefaults() error { - if c.ClientID == "" { - return trace.BadParameter("client_id must be set") - } - if c.RedirectURL == "" { - return trace.BadParameter("redirect must be set") + if err := ValidateGitHubOrganizationName(s.GitHub.Organization); err != nil { + return trace.Wrap(err, "invalid organization name") } return nil } @@ -414,9 +388,10 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { d := struct { ResourceHeader `json:""` Spec struct { - AWSOIDC json.RawMessage `json:"aws_oidc"` - AzureOIDC json.RawMessage `json:"azure_oidc"` - GitHub json.RawMessage `json:"github"` + AWSOIDC json.RawMessage `json:"aws_oidc"` + AzureOIDC json.RawMessage `json:"azure_oidc"` + GitHub json.RawMessage `json:"github"` + Credentials json.RawMessage `json:"credentials"` } `json:"spec"` }{} @@ -426,6 +401,13 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { } integration.ResourceHeader = d.ResourceHeader + if len(d.Spec.Credentials) != 0 { + var credentials PluginCredentialsV1 + if err := protojson.Unmarshal(d.Spec.Credentials, protoadapt.MessageV2Of(&credentials)); err != nil { + return trace.Wrap(err) + } + integration.Spec.Credentials = &credentials + } switch integration.SubKind { case IntegrationSubKindAWSOIDC: @@ -481,13 +463,21 @@ func (ig *IntegrationV1) MarshalJSON() ([]byte, error) { d := struct { ResourceHeader `json:""` Spec struct { - AWSOIDC AWSOIDCIntegrationSpecV1 `json:"aws_oidc,omitempty"` - AzureOIDC AzureOIDCIntegrationSpecV1 `json:"azure_oidc,omitempty"` - GitHub GitHubIntegrationSpecV1 `json:"github,omitempty"` + AWSOIDC AWSOIDCIntegrationSpecV1 `json:"aws_oidc,omitempty"` + AzureOIDC AzureOIDCIntegrationSpecV1 `json:"azure_oidc,omitempty"` + GitHub GitHubIntegrationSpecV1 `json:"github,omitempty"` + Credentials json.RawMessage `json:"credentials,omitempty"` } `json:"spec"` }{} d.ResourceHeader = ig.ResourceHeader + if ig.Spec.Credentials != nil { + data, err := protojson.Marshal(protoadapt.MessageV2Of(ig.Spec.Credentials)) + if err != nil { + return nil, trace.Wrap(err) + } + d.Spec.Credentials = json.RawMessage(data) + } switch ig.SubKind { case IntegrationSubKindAWSOIDC: @@ -515,30 +505,36 @@ func (ig *IntegrationV1) MarshalJSON() ([]byte, error) { return out, trace.Wrap(err) } -// Copy returns a deep copy of the integration. -func (ig *IntegrationV1) Copy() *IntegrationV1 { - return utils.CloneProtoMsg(ig) +// SetCredentials updates credentials. +func (ig *IntegrationV1) SetCredentials(creds PluginCredentials) error { + if creds == nil { + ig.Spec.Credentials = nil + return nil + } + switch creds := creds.(type) { + case *PluginCredentialsV1: + ig.Spec.Credentials = creds + default: + return trace.BadParameter("unsupported plugin credential type %T", creds) + } + return nil } -// WithoutSecrets returns an instance of resource without secrets. -func (ig *IntegrationV1) WithoutSecrets() Integration { - switch ig.SubKind { - case IntegrationSubKindGitHub: - spec := ig.GetGitHubIntegrationSpec() - if spec == nil || spec.Proxy == nil { - return ig - } +// GetCredentials retrieves credentials. +func (ig *IntegrationV1) GetCredentials() PluginCredentials { + if ig.Spec.Credentials == nil { + return nil + } + return ig.Spec.Credentials +} - clone := ig.Copy() - spec = clone.GetGitHubIntegrationSpec() - for i := range spec.Proxy.CertAuthorities { - spec.Proxy.CertAuthorities[i].PrivateKey = nil - } - if spec.Proxy.Connector != nil { - spec.Proxy.Connector.ClientSecret = "" - } - clone.SetGitHubIntegrationSpec(spec) - return clone +// WithoutCredentials returns a copy without credentials. +func (ig *IntegrationV1) WithoutCredentials() Integration { + if ig == nil || ig.GetCredentials() == nil { + return ig } - return ig + + clone := utils.CloneProtoMsg(ig) + clone.SetCredentials(nil) + return clone } diff --git a/api/types/integration_github.go b/api/types/integration_github.go new file mode 100644 index 0000000000000..b14777f3356ad --- /dev/null +++ b/api/types/integration_github.go @@ -0,0 +1,32 @@ +/* +Copyright 2024 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package types + +import "regexp" + +// validGitHubOrganizationName filters the allowed characters in GitHub +// organization name. +// +// GitHub shows the following error when inputing an invalid org name: +// The name '_' may only contain alphanumeric characters or single hyphens, and +// cannot begin or end with a hyphen. +var validGitHubOrganizationName = regexp.MustCompile(`^[a-zA-Z0-9]([-a-zA-Z0-9]*[a-zA-Z0-9])?$`) + +// ValidateGitHubOrganizationName returns an error if a given string is not a +// valid GitHub organization name. +func ValidateGitHubOrganizationName(name string) error { + return ValidateResourceName(validGitHubOrganizationName, name) +} diff --git a/api/types/integration_github_test.go b/api/types/integration_github_test.go new file mode 100644 index 0000000000000..9aac25698e198 --- /dev/null +++ b/api/types/integration_github_test.go @@ -0,0 +1,60 @@ +/* +Copyright 2024 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestValidateGitHubOrganizationName(t *testing.T) { + tests := []struct { + name string + checkError require.ErrorAssertionFunc + }{ + { + name: "valid-org", + checkError: require.NoError, + }, + { + name: "a", + checkError: require.NoError, + }, + { + name: "1-valid-start-with-digit", + checkError: require.NoError, + }, + { + name: "-invalid-start-with-hyphen", + checkError: require.Error, + }, + { + name: "invalid-end-with-hyphen-", + checkError: require.Error, + }, + { + name: "invalid charactersc", + checkError: require.Error, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + test.checkError(t, ValidateGitHubOrganizationName(test.name)) + }) + } +} diff --git a/api/types/integration_test.go b/api/types/integration_test.go index 22cefac9785dd..e743b1629d239 100644 --- a/api/types/integration_test.go +++ b/api/types/integration_test.go @@ -308,7 +308,6 @@ func TestIntegrationCheckAndSetDefaults(t *testing.T) { SubKindSpec: &IntegrationSpecV1_GitHub{ GitHub: &GitHubIntegrationSpecV1{ Organization: "my-org", - Proxy: &GitHubProxy{}, }, }, }, @@ -317,7 +316,7 @@ func TestIntegrationCheckAndSetDefaults(t *testing.T) { expectedErrorIs: noErrorFunc, }, { - name: "github: error when no org is provided", + name: "github: error when invalid org is provided", integration: func(name string) (*IntegrationV1, error) { return NewIntegrationGitHub( Metadata{ @@ -328,44 +327,6 @@ func TestIntegrationCheckAndSetDefaults(t *testing.T) { }, expectedErrorIs: trace.IsBadParameter, }, - { - name: "github: error when invalid CA is provided", - integration: func(name string) (*IntegrationV1, error) { - return NewIntegrationGitHub( - Metadata{ - Name: name, - }, - &GitHubIntegrationSpecV1{ - Organization: "my-org", - Proxy: &GitHubProxy{ - CertAuthorities: []*SSHKeyPair{{ - PrivateKey: []byte("missing pub key"), - }}, - }, - }, - ) - }, - expectedErrorIs: trace.IsBadParameter, - }, - { - name: "github: error when invalid connector is provided", - integration: func(name string) (*IntegrationV1, error) { - return NewIntegrationGitHub( - Metadata{ - Name: name, - }, - &GitHubIntegrationSpecV1{ - Organization: "my-org", - Proxy: &GitHubProxy{ - Connector: &GitHubProxyConnector{ - ClientID: "no-redirect-url", - }, - }, - }, - ) - }, - expectedErrorIs: trace.IsBadParameter, - }, } { t.Run(tt.name, func(t *testing.T) { name := uuid.NewString() @@ -380,91 +341,3 @@ func TestIntegrationCheckAndSetDefaults(t *testing.T) { }) } } - -func TestIntegrationWithoutSecrets(t *testing.T) { - for _, tt := range []struct { - name string - integration func(string) (*IntegrationV1, error) - expectedIntegration func(*testing.T, string) *IntegrationV1 - }{ - { - name: "github: no secrets", - integration: func(name string) (*IntegrationV1, error) { - return NewIntegrationGitHub( - Metadata{ - Name: name, - }, - &GitHubIntegrationSpecV1{ - Organization: "my-org", - }, - ) - }, - expectedIntegration: func(t *testing.T, name string) *IntegrationV1 { - t.Helper() - ig, err := NewIntegrationGitHub( - Metadata{ - Name: name, - }, - &GitHubIntegrationSpecV1{ - Organization: "my-org", - }, - ) - require.NoError(t, err) - return ig - }, - }, - { - name: "github: secrets removed", - integration: func(name string) (*IntegrationV1, error) { - return NewIntegrationGitHub( - Metadata{ - Name: name, - }, - &GitHubIntegrationSpecV1{ - Organization: "my-org", - Proxy: &GitHubProxy{ - CertAuthorities: []*SSHKeyPair{{ - PublicKey: []byte("pub"), - PrivateKey: []byte("key"), - }}, - Connector: &GitHubProxyConnector{ - ClientID: "id", - ClientSecret: "secret", - RedirectURL: "redirect", - }, - }, - }, - ) - }, - expectedIntegration: func(t *testing.T, name string) *IntegrationV1 { - t.Helper() - ig, err := NewIntegrationGitHub( - Metadata{ - Name: name, - }, - &GitHubIntegrationSpecV1{ - Organization: "my-org", - Proxy: &GitHubProxy{ - CertAuthorities: []*SSHKeyPair{{ - PublicKey: []byte("pub"), - }}, - Connector: &GitHubProxyConnector{ - ClientID: "id", - RedirectURL: "redirect", - }, - }, - }, - ) - require.NoError(t, err) - return ig - }, - }, - } { - t.Run(tt.name, func(t *testing.T) { - name := uuid.NewString() - ig, err := tt.integration(name) - require.NoError(t, err) - require.Equal(t, tt.expectedIntegration(t, name), ig.WithoutSecrets()) - }) - } -} diff --git a/api/types/plugin.go b/api/types/plugin.go index ee946c9615979..fc69231cc6622 100644 --- a/api/types/plugin.go +++ b/api/types/plugin.go @@ -118,6 +118,7 @@ type Plugin interface { // PluginCredentials are the credentials embedded in Plugin type PluginCredentials interface { GetOauth2AccessToken() *PluginOAuth2AccessTokenCredentials + GetIdSecret() *PluginIdSecretCredential GetStaticCredentialsRef() *PluginStaticCredentialsRef } diff --git a/api/types/plugin_static_credentials.go b/api/types/plugin_static_credentials.go index 236f2d3c8c0e4..cf605fc6a6a2a 100644 --- a/api/types/plugin_static_credentials.go +++ b/api/types/plugin_static_credentials.go @@ -33,6 +33,9 @@ type PluginStaticCredentials interface { // GetOAuthClientSecret will return the attached client ID and client secret. IF they are not // present, the client ID and client secret will be empty. GetOAuthClientSecret() (clientID string, clientSecret string) + + // GetSSHCertAuthorities will return the attached SSH CA keys. + GetSSHCertAuthorities() []*SSHKeyPair } // NewPluginStaticCredentials creates a new PluginStaticCredentialsV1 resource. @@ -88,6 +91,15 @@ func (p *PluginStaticCredentialsV1) CheckAndSetDefaults() error { if credentials.OAuthClientSecret.ClientSecret == "" { return trace.BadParameter("client secret is empty") } + case *PluginStaticCredentialsSpecV1_SSHCertAuthorities: + if credentials.SSHCertAuthorities == nil { + return trace.BadParameter("SSH CAs are missing") + } + for _, ca := range credentials.SSHCertAuthorities.CertAuthorities { + if err := ca.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err, "invalid SSH CA") + } + } default: return trace.BadParameter("credentials are not set or have an unknown type %T", credentials) } @@ -133,6 +145,15 @@ func (p *PluginStaticCredentialsV1) GetOAuthClientSecret() (clientID string, cli return credentials.OAuthClientSecret.ClientId, credentials.OAuthClientSecret.ClientSecret } +// GetSSHCertAuthorities will return the attached SSH CA keys. +func (p *PluginStaticCredentialsV1) GetSSHCertAuthorities() []*SSHKeyPair { + credentials, ok := p.Spec.Credentials.(*PluginStaticCredentialsSpecV1_SSHCertAuthorities) + if !ok { + return nil + } + return credentials.SSHCertAuthorities.CertAuthorities +} + // MatchSearch is a dummy value as credentials are not searchable. func (p *PluginStaticCredentialsV1) MatchSearch(_ []string) bool { return false diff --git a/api/types/types.pb.go b/api/types/types.pb.go index ac20f27e270b3..759808feefe28 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1261,7 +1261,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{333, 0} + return fileDescriptor_9198ee693835762e, []int{334, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1293,7 +1293,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{334, 0} + return fileDescriptor_9198ee693835762e, []int{335, 0} } type KeepAlive struct { @@ -18363,6 +18363,7 @@ type PluginStaticCredentialsSpecV1 struct { // *PluginStaticCredentialsSpecV1_APIToken // *PluginStaticCredentialsSpecV1_BasicAuth // *PluginStaticCredentialsSpecV1_OAuthClientSecret + // *PluginStaticCredentialsSpecV1_SSHCertAuthorities Credentials isPluginStaticCredentialsSpecV1_Credentials `protobuf_oneof:"credentials"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -18417,11 +18418,16 @@ type PluginStaticCredentialsSpecV1_BasicAuth struct { type PluginStaticCredentialsSpecV1_OAuthClientSecret struct { OAuthClientSecret *PluginStaticCredentialsOAuthClientSecret `protobuf:"bytes,3,opt,name=OAuthClientSecret,proto3,oneof" json:"OAuthClientSecret,omitempty"` } +type PluginStaticCredentialsSpecV1_SSHCertAuthorities struct { + SSHCertAuthorities *PluginStaticCredentialsSSHCertAuthorities `protobuf:"bytes,4,opt,name=SSHCertAuthorities,proto3,oneof" json:"SSHCertAuthorities,omitempty"` +} func (*PluginStaticCredentialsSpecV1_APIToken) isPluginStaticCredentialsSpecV1_Credentials() {} func (*PluginStaticCredentialsSpecV1_BasicAuth) isPluginStaticCredentialsSpecV1_Credentials() {} func (*PluginStaticCredentialsSpecV1_OAuthClientSecret) isPluginStaticCredentialsSpecV1_Credentials() { } +func (*PluginStaticCredentialsSpecV1_SSHCertAuthorities) isPluginStaticCredentialsSpecV1_Credentials() { +} func (m *PluginStaticCredentialsSpecV1) GetCredentials() isPluginStaticCredentialsSpecV1_Credentials { if m != nil { @@ -18451,12 +18457,20 @@ func (m *PluginStaticCredentialsSpecV1) GetOAuthClientSecret() *PluginStaticCred return nil } +func (m *PluginStaticCredentialsSpecV1) GetSSHCertAuthorities() *PluginStaticCredentialsSSHCertAuthorities { + if x, ok := m.GetCredentials().(*PluginStaticCredentialsSpecV1_SSHCertAuthorities); ok { + return x.SSHCertAuthorities + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*PluginStaticCredentialsSpecV1) XXX_OneofWrappers() []interface{} { return []interface{}{ (*PluginStaticCredentialsSpecV1_APIToken)(nil), (*PluginStaticCredentialsSpecV1_BasicAuth)(nil), (*PluginStaticCredentialsSpecV1_OAuthClientSecret)(nil), + (*PluginStaticCredentialsSpecV1_SSHCertAuthorities)(nil), } } @@ -18550,6 +18564,54 @@ func (m *PluginStaticCredentialsOAuthClientSecret) XXX_DiscardUnknown() { var xxx_messageInfo_PluginStaticCredentialsOAuthClientSecret proto.InternalMessageInfo +// PluginStaticCredentialsSSHCertAuthorities contains the active SSH CAs used +// for the integration or plugin. +type PluginStaticCredentialsSSHCertAuthorities struct { + // CertAuthorities contains the active SSH CAs used for the integration or + // plugin. + CertAuthorities []*SSHKeyPair `protobuf:"bytes,1,rep,name=cert_authorities,json=certAuthorities,proto3" json:"cert_authorities,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PluginStaticCredentialsSSHCertAuthorities) Reset() { + *m = PluginStaticCredentialsSSHCertAuthorities{} +} +func (m *PluginStaticCredentialsSSHCertAuthorities) String() string { + return proto.CompactTextString(m) +} +func (*PluginStaticCredentialsSSHCertAuthorities) ProtoMessage() {} +func (*PluginStaticCredentialsSSHCertAuthorities) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{314} +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities.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 *PluginStaticCredentialsSSHCertAuthorities) XXX_Merge(src proto.Message) { + xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities.Merge(m, src) +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Size() int { + return m.Size() +} +func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_DiscardUnknown() { + xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities.DiscardUnknown(m) +} + +var xxx_messageInfo_PluginStaticCredentialsSSHCertAuthorities proto.InternalMessageInfo + // SAMLIdPServiceProviderV1 is the representation of a SAML IdP service provider. type SAMLIdPServiceProviderV1 struct { // Header is the resource header for the SAML IdP service provider. @@ -18564,7 +18626,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18635,7 +18697,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{315} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18682,7 +18744,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{316} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18724,7 +18786,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{317} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18766,7 +18828,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{318} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18816,7 +18878,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{319} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18858,7 +18920,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{320} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18904,7 +18966,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{321} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18946,7 +19008,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{322} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18992,7 +19054,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{323} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19039,7 +19101,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{324} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19082,7 +19144,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{325} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19125,7 +19187,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19167,7 +19229,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{327} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19211,7 +19273,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{328} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19255,7 +19317,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{329} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19298,7 +19360,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{330} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19346,7 +19408,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{331} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19389,7 +19451,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{332} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19443,7 +19505,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{333} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19487,7 +19549,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{334} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19532,7 +19594,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{335} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19568,17 +19630,19 @@ type IntegrationSpecV1 struct { // *IntegrationSpecV1_AWSOIDC // *IntegrationSpecV1_AzureOIDC // *IntegrationSpecV1_GitHub - SubKindSpec isIntegrationSpecV1_SubKindSpec `protobuf_oneof:"SubKindSpec"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + SubKindSpec isIntegrationSpecV1_SubKindSpec `protobuf_oneof:"SubKindSpec"` + // Credentials contains credentials for the integration. + Credentials *PluginCredentialsV1 `protobuf:"bytes,4,opt,name=credentials,proto3" json:"credentials,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } 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{336} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19697,7 +19761,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{337} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19743,7 +19807,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{338} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19775,19 +19839,17 @@ var xxx_messageInfo_AzureOIDCIntegrationSpecV1 proto.InternalMessageInfo // GitHubIntegrationSpecV1 contains the specific fields to handle the GitHub integration subkind. type GitHubIntegrationSpecV1 struct { // Organization specifies the name of the organization for the GitHub integration. - Organization string `protobuf:"bytes,1,opt,name=Organization,proto3" json:"organization,omitempty"` - // Proxy specifies GitHub proxy related settings. - Proxy *GitHubProxy `protobuf:"bytes,2,opt,name=proxy,proto3" json:"proxy,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Organization string `protobuf:"bytes,1,opt,name=Organization,proto3" json:"organization,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GitHubIntegrationSpecV1) Reset() { *m = GitHubIntegrationSpecV1{} } func (m *GitHubIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*GitHubIntegrationSpecV1) ProtoMessage() {} func (*GitHubIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *GitHubIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19816,57 +19878,10 @@ func (m *GitHubIntegrationSpecV1) XXX_DiscardUnknown() { var xxx_messageInfo_GitHubIntegrationSpecV1 proto.InternalMessageInfo -// GitHubProxy specifies GitHub proxy related settings. -type GitHubProxy struct { - // CertAuthority contains the active SSH CAs used between Teleport and - // GitHub. GitHub does not allow the same CA to be used for a different - // organization so the CA is defined per integration. TODO(greedy52) support - // rotation, HSM encryption. - CertAuthorities []*SSHKeyPair `protobuf:"bytes,1,rep,name=cert_authorities,json=certAuthorities,proto3" json:"cert_authorities,omitempty"` - // Connector specifies the GitHub connector spec used to obtain user ID and - // username. - Connector *GitHubProxyConnector `protobuf:"bytes,2,opt,name=connector,proto3" json:"connector,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GitHubProxy) Reset() { *m = GitHubProxy{} } -func (m *GitHubProxy) String() string { return proto.CompactTextString(m) } -func (*GitHubProxy) ProtoMessage() {} -func (*GitHubProxy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{340} -} -func (m *GitHubProxy) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GitHubProxy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GitHubProxy.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 *GitHubProxy) XXX_Merge(src proto.Message) { - xxx_messageInfo_GitHubProxy.Merge(m, src) -} -func (m *GitHubProxy) XXX_Size() int { - return m.Size() -} -func (m *GitHubProxy) XXX_DiscardUnknown() { - xxx_messageInfo_GitHubProxy.DiscardUnknown(m) -} - -var xxx_messageInfo_GitHubProxy proto.InternalMessageInfo - // GitHubProxyConnector specifies the GitHub connector spec for a GitHub proxy. // This type is a subset of GithubConnectorSpecV3 but does not require fields -// like TeamRolesMapping. +// like TeamRolesMapping. ClientID and ClientSecret are defined for object +// creation request and then will be saved in static credentials instead. type GitHubProxyConnector struct { // ClientID is the Github OAuth app client ID. ClientID string `protobuf:"bytes,1,opt,name=ClientID,proto3" json:"client_id"` @@ -21312,6 +21327,7 @@ func init() { proto.RegisterType((*PluginStaticCredentialsSpecV1)(nil), "types.PluginStaticCredentialsSpecV1") proto.RegisterType((*PluginStaticCredentialsBasicAuth)(nil), "types.PluginStaticCredentialsBasicAuth") proto.RegisterType((*PluginStaticCredentialsOAuthClientSecret)(nil), "types.PluginStaticCredentialsOAuthClientSecret") + proto.RegisterType((*PluginStaticCredentialsSSHCertAuthorities)(nil), "types.PluginStaticCredentialsSSHCertAuthorities") proto.RegisterType((*SAMLIdPServiceProviderV1)(nil), "types.SAMLIdPServiceProviderV1") proto.RegisterType((*SAMLIdPServiceProviderSpecV1)(nil), "types.SAMLIdPServiceProviderSpecV1") proto.RegisterType((*SAMLAttributeMapping)(nil), "types.SAMLAttributeMapping") @@ -21339,7 +21355,6 @@ func init() { proto.RegisterType((*AWSOIDCIntegrationSpecV1)(nil), "types.AWSOIDCIntegrationSpecV1") proto.RegisterType((*AzureOIDCIntegrationSpecV1)(nil), "types.AzureOIDCIntegrationSpecV1") proto.RegisterType((*GitHubIntegrationSpecV1)(nil), "types.GitHubIntegrationSpecV1") - proto.RegisterType((*GitHubProxy)(nil), "types.GitHubProxy") proto.RegisterType((*GitHubProxyConnector)(nil), "types.GitHubProxyConnector") proto.RegisterType((*HeadlessAuthentication)(nil), "types.HeadlessAuthentication") proto.RegisterType((*WatchKind)(nil), "types.WatchKind") @@ -21368,7 +21383,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 29597 bytes of a gzipped FileDescriptorProto + // 29584 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x6b, 0x70, 0x1c, 0x59, 0x76, 0x20, 0x06, 0x77, 0x55, 0xe1, 0x51, 0x38, 0x78, 0x15, 0x2e, 0x40, 0x12, 0x44, 0x37, 0xbb, 0xd8, 0xd9, 0xdd, 0x6c, 0x76, 0x4f, 0x37, 0x39, 0x04, 0xa7, 0x39, 0xd3, 0xd3, 0xaf, 0x29, 0x3c, @@ -22848,377 +22863,376 @@ var fileDescriptor_9198ee693835762e = []byte{ 0xce, 0xea, 0x91, 0x2a, 0xf5, 0xd1, 0x9a, 0x6e, 0x84, 0x3e, 0xef, 0xb7, 0xe3, 0xcf, 0x4b, 0x09, 0x77, 0x6c, 0x35, 0xbd, 0xae, 0xb3, 0xee, 0x27, 0x8a, 0xa8, 0xff, 0xd2, 0xfe, 0x22, 0x9c, 0xa2, 0xc9, 0xb7, 0x13, 0xb8, 0x9d, 0xdd, 0x84, 0x9d, 0x6c, 0xe8, 0x2b, 0x59, 0xec, 0xe4, 0xac, 0xbc, - 0xf1, 0xff, 0xb1, 0xf7, 0x75, 0xb1, 0x6d, 0x64, 0xd7, 0xc1, 0x1a, 0x92, 0x92, 0xa8, 0x43, 0xfd, - 0x8c, 0xae, 0xb5, 0xb6, 0x56, 0xf2, 0xca, 0xeb, 0xf1, 0x4f, 0x6c, 0x3a, 0xbb, 0x89, 0xbd, 0x5f, - 0xb2, 0x71, 0x92, 0x4d, 0x32, 0x22, 0x87, 0x22, 0x2d, 0xfe, 0x65, 0x86, 0x94, 0xe2, 0x6c, 0x92, - 0xf9, 0x68, 0x71, 0x24, 0x4d, 0x43, 0x91, 0x0c, 0x87, 0xb4, 0xe3, 0xa0, 0x40, 0x1b, 0x14, 0x48, - 0x80, 0xfe, 0xa5, 0x4d, 0x0b, 0x34, 0x28, 0x0a, 0xf4, 0xa1, 0x8b, 0xa2, 0x0f, 0x79, 0x2d, 0x5a, - 0xb4, 0x05, 0x8a, 0xbc, 0x05, 0x08, 0x02, 0x04, 0xe8, 0x5b, 0x0b, 0x2c, 0xda, 0x05, 0xda, 0x87, - 0xb6, 0x6f, 0x45, 0xf3, 0x90, 0xa7, 0xe2, 0x9e, 0x7b, 0xef, 0xcc, 0x9d, 0x1f, 0xd2, 0x72, 0xbc, - 0x69, 0x13, 0x20, 0x4f, 0xe4, 0x9c, 0x7b, 0xce, 0x9d, 0x3b, 0xf7, 0xf7, 0x9c, 0x73, 0xcf, 0x0f, - 0xc5, 0xf7, 0x6b, 0xbd, 0xd0, 0x89, 0x03, 0xf9, 0x37, 0x7c, 0x3d, 0x25, 0x96, 0x7a, 0x42, 0x73, - 0x12, 0xa6, 0xb5, 0x92, 0x34, 0xad, 0xcf, 0xbf, 0xa6, 0xea, 0x40, 0xe4, 0xcd, 0x8a, 0x69, 0x3d, - 0xb9, 0x41, 0x95, 0xe0, 0xd3, 0x79, 0x43, 0xa4, 0xad, 0xc1, 0x62, 0xc9, 0x34, 0xd7, 0x8f, 0xa2, - 0x20, 0xb2, 0x0d, 0x4b, 0x7e, 0xbe, 0x6a, 0x7e, 0x70, 0x64, 0x19, 0xa0, 0xd2, 0x25, 0xaf, 0xc2, - 0x32, 0x63, 0xc9, 0x43, 0x6b, 0x0e, 0x10, 0xa6, 0xd3, 0x85, 0x27, 0xfa, 0x40, 0x81, 0x57, 0x9f, - 0xd5, 0x87, 0xe4, 0x10, 0x2e, 0xa2, 0x59, 0x87, 0x37, 0xf0, 0x87, 0xc1, 0x3e, 0xea, 0x1c, 0x9d, - 0x3a, 0x7c, 0xd6, 0x6a, 0x89, 0x83, 0x31, 0x1c, 0x5a, 0x56, 0x43, 0x1a, 0x87, 0xe1, 0xd0, 0xf2, - 0x06, 0xe2, 0xb9, 0x40, 0xc9, 0x79, 0x1b, 0xba, 0xb0, 0x3d, 0x83, 0x52, 0xda, 0x38, 0x14, 0x79, - 0xe3, 0xb8, 0x05, 0xea, 0xb1, 0xd3, 0xa5, 0x3c, 0xb1, 0xd3, 0xc5, 0xa6, 0x3d, 0xbe, 0xc7, 0x32, - 0xb4, 0x9b, 0xab, 0x3e, 0xdc, 0xf2, 0x06, 0x07, 0xf7, 0xf8, 0x5b, 0xce, 0xc4, 0x91, 0x27, 0x8b, - 0x15, 0xe4, 0x75, 0xb8, 0x10, 0x09, 0x38, 0x12, 0x78, 0xb0, 0x9b, 0xeb, 0xb4, 0x28, 0x1c, 0x9e, - 0xea, 0x2a, 0x2c, 0x8b, 0x59, 0x31, 0xf2, 0xfd, 0xe0, 0xcc, 0x1c, 0x87, 0xd1, 0x55, 0xc7, 0x5f, - 0x37, 0x11, 0x1f, 0x95, 0x28, 0x91, 0x9c, 0x83, 0x97, 0x26, 0xaf, 0x01, 0xf1, 0xf9, 0x76, 0x7f, - 0xa3, 0xe0, 0x2f, 0x5c, 0x17, 0x25, 0xfe, 0x0a, 0xe7, 0xaf, 0xfd, 0xbb, 0x14, 0x5c, 0x48, 0x10, - 0x65, 0xa8, 0x10, 0xe0, 0xf6, 0xc7, 0xce, 0x09, 0x13, 0x21, 0xe4, 0x8f, 0x5c, 0x93, 0xe0, 0x5c, - 0x3f, 0xb5, 0xc0, 0x32, 0x90, 0xf3, 0x77, 0xf1, 0x27, 0xba, 0x79, 0x74, 0x46, 0x42, 0xf5, 0x42, - 0xff, 0x92, 0x0a, 0xac, 0x63, 0x5a, 0x05, 0xcf, 0x1d, 0x60, 0x76, 0x06, 0x64, 0x42, 0x32, 0x21, - 0x61, 0x07, 0x5b, 0xd1, 0x94, 0x90, 0x28, 0x17, 0x62, 0xaa, 0xc3, 0x08, 0x84, 0x7c, 0x02, 0xb6, - 0xa4, 0xb3, 0xc6, 0x8e, 0xac, 0x3c, 0xb4, 0x74, 0x37, 0x2f, 0x75, 0xfc, 0x53, 0xa7, 0x18, 0x5a, - 0x83, 0xbb, 0xb0, 0x83, 0x83, 0xe8, 0x76, 0x87, 0x76, 0x2c, 0x0f, 0x07, 0x7e, 0x2a, 0x0b, 0x5c, - 0xbf, 0x45, 0xb1, 0x2a, 0xdd, 0x61, 0x24, 0x25, 0x07, 0xfd, 0x6a, 0xde, 0x7d, 0x6f, 0xc3, 0x4b, - 0x89, 0x2d, 0xa6, 0x07, 0x0c, 0x1a, 0x52, 0x05, 0xbc, 0xd1, 0x22, 0x7d, 0xa6, 0xcc, 0xd1, 0x55, - 0x58, 0x7e, 0xe4, 0x74, 0x46, 0xce, 0x88, 0x9f, 0xdc, 0x7c, 0x4a, 0x30, 0x98, 0x7c, 0x70, 0x77, - 0xc3, 0x43, 0xc3, 0x75, 0x46, 0xa4, 0x06, 0x17, 0xd8, 0x09, 0xe8, 0x9e, 0x21, 0x33, 0xc8, 0xf5, - 0x4c, 0x4a, 0x88, 0x1d, 0x42, 0x12, 0x3c, 0x9a, 0x2a, 0x88, 0xc5, 0xa8, 0xcd, 0xf5, 0x93, 0x28, - 0x88, 0xae, 0xe8, 0x8b, 0xc9, 0xd8, 0x64, 0x17, 0x72, 0xac, 0x72, 0x26, 0x16, 0xb0, 0x0b, 0x82, - 0xab, 0x33, 0xdf, 0x50, 0x40, 0xfb, 0x62, 0xcf, 0xff, 0x4f, 0xcf, 0x6b, 0xbc, 0x8b, 0xb5, 0xcf, - 0xe4, 0xfb, 0x0f, 0x73, 0x19, 0x81, 0xfc, 0xde, 0x43, 0xfb, 0x07, 0x45, 0x7c, 0x6a, 0x48, 0x38, - 0xa6, 0x53, 0xcb, 0x73, 0xfa, 0xe2, 0x0e, 0x68, 0xc9, 0xe4, 0x4f, 0xcf, 0x39, 0xd5, 0xc9, 0x9b, - 0xb0, 0x4c, 0xab, 0x3d, 0x99, 0xf4, 0xd9, 0x94, 0x4b, 0x87, 0x02, 0xed, 0xd4, 0x58, 0x11, 0x1d, - 0xb6, 0xf2, 0x9c, 0x99, 0x3b, 0x0b, 0x1e, 0x29, 0xb7, 0xec, 0x9d, 0x8d, 0x87, 0xf2, 0x44, 0x15, - 0x8a, 0x42, 0xab, 0xd6, 0x6a, 0x72, 0x92, 0x2c, 0xc5, 0x09, 0xb8, 0xe5, 0xdd, 0x05, 0xa6, 0x2a, - 0xd4, 0xee, 0x40, 0x4e, 0xaa, 0x9b, 0x7e, 0x0c, 0xf3, 0x9c, 0x11, 0x1f, 0xc3, 0x9e, 0xf8, 0x60, - 0x3f, 0x82, 0xac, 0xa8, 0x92, 0x8a, 0x05, 0xa7, 0x03, 0x4f, 0x2c, 0x72, 0xfc, 0x4f, 0x61, 0xb4, - 0x97, 0xf1, 0x23, 0xe7, 0x4d, 0xfc, 0x8f, 0x67, 0xc9, 0xb8, 0x43, 0xe5, 0x81, 0x9e, 0x67, 0x0f, - 0xd1, 0x02, 0xcb, 0x67, 0x9e, 0x29, 0xbc, 0xd5, 0xf3, 0x98, 0x5d, 0x16, 0x7f, 0xc7, 0x5f, 0xfb, - 0x87, 0x70, 0x44, 0x9b, 0x30, 0x6d, 0xcf, 0x0c, 0x1d, 0x19, 0xa9, 0xf8, 0x91, 0xc1, 0x02, 0xa8, - 0x70, 0x4a, 0xf6, 0x66, 0x40, 0x18, 0x1e, 0x19, 0xd2, 0xce, 0x90, 0x09, 0xed, 0x0c, 0x92, 0x4c, - 0x1e, 0x8c, 0x1e, 0x3b, 0x71, 0x84, 0x4c, 0x1e, 0xdd, 0xa7, 0xfe, 0x3c, 0x25, 0x54, 0x04, 0xbb, - 0x83, 0xc1, 0xd8, 0x1b, 0x8f, 0x3a, 0xc3, 0x90, 0x2a, 0x94, 0x9c, 0xc1, 0xcb, 0xc8, 0x41, 0xdf, - 0xc3, 0x14, 0x16, 0x83, 0x91, 0x88, 0xd9, 0xe1, 0xcf, 0xdc, 0xdc, 0xbd, 0x0f, 0x85, 0x79, 0x7c, - 0x9d, 0x62, 0xeb, 0x32, 0x32, 0x9d, 0xb0, 0x52, 0xad, 0xe5, 0x39, 0xf3, 0x12, 0xab, 0x33, 0x86, - 0x45, 0xca, 0x09, 0x8b, 0x38, 0xaa, 0x0b, 0xdd, 0x0d, 0x56, 0x74, 0xb8, 0x56, 0x79, 0xad, 0x93, - 0x4f, 0xc1, 0x92, 0xdb, 0x95, 0x33, 0x35, 0x46, 0xb5, 0x70, 0x95, 0x2e, 0x8b, 0x16, 0x1d, 0xd4, - 0x41, 0xe7, 0x9c, 0xcb, 0xa1, 0xbb, 0x2b, 0x21, 0xa5, 0xb1, 0xb6, 0x2b, 0xa4, 0xd1, 0x38, 0x19, - 0x59, 0x85, 0x94, 0x3f, 0xc2, 0x29, 0xb7, 0xcb, 0x96, 0x57, 0x10, 0xaf, 0xda, 0xe4, 0x4f, 0xda, - 0xaf, 0xc2, 0xad, 0xf3, 0xf6, 0x11, 0x5d, 0x8a, 0x53, 0x3a, 0x7c, 0xc9, 0x5c, 0xef, 0xc4, 0xfa, - 0xed, 0x2a, 0xc8, 0xe1, 0x76, 0x5d, 0xb1, 0xf9, 0x09, 0x58, 0x7b, 0xe4, 0x6a, 0x7f, 0x95, 0x86, - 0xd5, 0xb0, 0x9a, 0x9c, 0xdc, 0x81, 0x8c, 0xb4, 0x03, 0x5d, 0x4a, 0xd0, 0xa5, 0xe3, 0xbe, 0x83, - 0x48, 0xe7, 0xda, 0x71, 0xc8, 0x03, 0x58, 0x45, 0xc3, 0x3d, 0x64, 0x3d, 0xc7, 0x2e, 0xbf, 0x7c, - 0x99, 0x7d, 0x7f, 0x96, 0xfd, 0xfe, 0xbb, 0x57, 0xe6, 0xf0, 0xaa, 0x6c, 0x99, 0xd2, 0x52, 0xee, - 0x8f, 0x16, 0x4a, 0x5a, 0xd0, 0xcc, 0x74, 0x2d, 0x28, 0xff, 0x94, 0x29, 0x5a, 0xd0, 0xf9, 0x19, - 0x5a, 0xd0, 0x80, 0x52, 0xd6, 0x82, 0xa2, 0x2e, 0x7c, 0x71, 0x9a, 0x2e, 0x3c, 0xa0, 0x61, 0xba, - 0xf0, 0x40, 0x8b, 0x99, 0x9d, 0xaa, 0xc5, 0x0c, 0x68, 0xb8, 0x16, 0xf3, 0x3a, 0xef, 0xa3, 0x51, - 0xe7, 0x89, 0x8d, 0x9d, 0xc7, 0x8f, 0x45, 0xfc, 0x7a, 0xb3, 0xf3, 0x04, 0x8d, 0x6b, 0x76, 0x97, - 0x40, 0x58, 0xe4, 0x68, 0x7f, 0xa0, 0x44, 0x34, 0x81, 0x62, 0xfc, 0x6e, 0xc0, 0x2a, 0x3b, 0xac, - 0x9c, 0xae, 0x24, 0x6b, 0xae, 0x98, 0x2b, 0x02, 0xca, 0xe4, 0xcd, 0x0f, 0xc0, 0x9a, 0x8f, 0xc6, - 0x45, 0x2e, 0xf4, 0xd4, 0x33, 0x7d, 0x6a, 0x1e, 0x76, 0xe6, 0x0e, 0xac, 0xfb, 0x88, 0x5c, 0x9b, - 0xc3, 0xc4, 0xcd, 0x15, 0x53, 0x15, 0x05, 0x4d, 0x0e, 0xd7, 0x4e, 0xa2, 0x92, 0xc7, 0xcf, 0xa8, - 0x55, 0xda, 0xf7, 0xd2, 0x21, 0x2d, 0x89, 0x78, 0x0d, 0x3d, 0x45, 0xbd, 0x81, 0xcd, 0x3b, 0x89, - 0xef, 0x45, 0x57, 0xa7, 0x8c, 0x19, 0xb7, 0x69, 0xb2, 0xac, 0x86, 0x09, 0x9e, 0x37, 0x10, 0x26, - 0x4e, 0x36, 0xe3, 0xa8, 0xd9, 0xb9, 0x8f, 0x73, 0x56, 0x54, 0xc7, 0x36, 0x9e, 0xfc, 0xec, 0xea, - 0x84, 0x98, 0x4a, 0xa7, 0x2c, 0x72, 0xd6, 0xfe, 0x93, 0x78, 0x41, 0x1b, 0x50, 0xa9, 0xe8, 0x85, - 0x2b, 0x4f, 0x27, 0xc8, 0x4e, 0xb1, 0xca, 0xb1, 0x97, 0xb0, 0x66, 0x75, 0x22, 0xfe, 0x8a, 0x6a, - 0x0d, 0x58, 0x46, 0x1d, 0x85, 0xa8, 0x30, 0x93, 0xa0, 0x82, 0x8f, 0x7f, 0x7c, 0xa1, 0x52, 0x33, - 0x73, 0x94, 0x4e, 0x54, 0x73, 0x0a, 0x2f, 0xcb, 0x9a, 0x85, 0x70, 0x23, 0xe7, 0x45, 0x14, 0xdd, - 0x99, 0x3d, 0x10, 0x28, 0x20, 0xb0, 0xa9, 0x17, 0x3b, 0x61, 0x00, 0x47, 0xd3, 0x4e, 0x61, 0x6b, - 0xfa, 0x90, 0xcc, 0xc8, 0xd0, 0x14, 0x1c, 0xa0, 0x29, 0xf9, 0x00, 0x95, 0xf5, 0x0c, 0xe9, 0x90, - 0x9e, 0x41, 0xfb, 0xb3, 0x34, 0x5c, 0x3b, 0xc7, 0x70, 0xcd, 0x78, 0xe7, 0x67, 0xc2, 0xec, 0x59, - 0x2a, 0x24, 0x19, 0xd2, 0x4a, 0xf9, 0x06, 0x49, 0xa5, 0xd4, 0x64, 0xe6, 0xec, 0xff, 0xc3, 0x1a, - 0xdb, 0x05, 0x99, 0x59, 0xe2, 0xf1, 0xa4, 0x77, 0x8e, 0x6d, 0x70, 0x5b, 0xf8, 0x50, 0x45, 0x48, - 0x71, 0x67, 0xc4, 0x1d, 0xc3, 0xf2, 0x61, 0xa4, 0x05, 0x39, 0x44, 0x3b, 0xee, 0xb8, 0xbd, 0x73, - 0x39, 0xf3, 0x08, 0x0f, 0x2d, 0x99, 0x8c, 0x59, 0x53, 0x53, 0x40, 0x09, 0x9f, 0xc9, 0x4d, 0x58, - 0xeb, 0x4f, 0xce, 0x28, 0xe3, 0xc1, 0xe6, 0x02, 0xb7, 0xfe, 0x98, 0x37, 0x57, 0xfa, 0x93, 0x33, - 0x7d, 0x38, 0xc4, 0x21, 0x45, 0x33, 0x91, 0x75, 0x8a, 0xc7, 0x56, 0xad, 0xc0, 0x5c, 0x40, 0x4c, - 0x5a, 0x01, 0x5b, 0xb7, 0x1c, 0x77, 0x03, 0x98, 0xd1, 0x20, 0xcf, 0x50, 0xc5, 0x1e, 0xb4, 0x1f, - 0xa7, 0x84, 0xbc, 0x3b, 0x7d, 0xde, 0xff, 0x72, 0x88, 0x12, 0x86, 0xe8, 0x16, 0xa8, 0xb4, 0xeb, - 0x83, 0x4d, 0xc5, 0x1f, 0xa3, 0xd5, 0xfe, 0xe4, 0xcc, 0xef, 0x3b, 0xb9, 0xe3, 0x17, 0xe4, 0x8e, - 0x7f, 0x53, 0xc8, 0xc3, 0x89, 0xdb, 0xc3, 0xf4, 0x2e, 0xd7, 0xfe, 0x33, 0x0d, 0x37, 0xcf, 0xb7, - 0x09, 0xfc, 0x72, 0xdc, 0x12, 0xc6, 0x2d, 0xa2, 0x3a, 0x9d, 0x8f, 0xa9, 0x4e, 0x13, 0xd6, 0xde, - 0x42, 0xd2, 0xda, 0x8b, 0x29, 0x6a, 0x17, 0x13, 0x14, 0xb5, 0x89, 0x0b, 0x34, 0xfb, 0x8c, 0x05, - 0xba, 0x24, 0xcf, 0x93, 0x7f, 0xf3, 0x15, 0x18, 0x61, 0x79, 0xe0, 0x6d, 0xb8, 0x20, 0xe4, 0x01, - 0x76, 0x72, 0x04, 0xfa, 0xf7, 0xdc, 0xbd, 0xdb, 0x49, 0x92, 0x00, 0xa2, 0x25, 0x70, 0xeb, 0xeb, - 0x5c, 0x06, 0x08, 0xca, 0x7f, 0x7e, 0xb8, 0x7f, 0xf2, 0x10, 0x2e, 0x62, 0x7c, 0xf7, 0x23, 0xf9, - 0xe6, 0xc0, 0x1e, 0x39, 0xc7, 0x7c, 0x3e, 0x5c, 0x8d, 0xf1, 0xca, 0xee, 0x91, 0xd4, 0x1c, 0xd3, - 0x39, 0x2e, 0xcf, 0x99, 0x1b, 0x5e, 0x02, 0x3c, 0x2a, 0x58, 0x7c, 0x57, 0x01, 0xed, 0xd9, 0xfd, - 0x85, 0x8a, 0xaa, 0x68, 0x87, 0x2f, 0x99, 0xb9, 0x8e, 0xd4, 0x7b, 0xd7, 0x60, 0x65, 0xe4, 0x1c, - 0x8f, 0x1c, 0xef, 0x34, 0xa4, 0x01, 0x59, 0xe6, 0x40, 0xd1, 0x31, 0x22, 0xca, 0xe4, 0x73, 0x71, - 0xe6, 0x82, 0x48, 0x2b, 0xf9, 0xf2, 0x62, 0xe2, 0x38, 0xd0, 0xd9, 0x24, 0x37, 0x90, 0x3d, 0x3c, - 0xc8, 0x64, 0x53, 0x6a, 0xda, 0xe4, 0xb1, 0x30, 0x8f, 0xdd, 0x9e, 0xa3, 0xfd, 0x8d, 0x22, 0x38, - 0x82, 0xa4, 0xce, 0x23, 0x6f, 0x4b, 0xc6, 0xbc, 0xe9, 0x18, 0x1b, 0x92, 0x44, 0x22, 0xdb, 0x3d, - 0xf2, 0xf0, 0x8c, 0x08, 0x08, 0x85, 0x67, 0x44, 0xc8, 0x0b, 0x58, 0x24, 0x72, 0xa9, 0xf9, 0xbe, - 0xb0, 0x08, 0xa2, 0x7b, 0xde, 0xc1, 0x5d, 0x72, 0x1b, 0x16, 0x99, 0x11, 0x90, 0x68, 0xee, 0x5a, - 0xa8, 0xb9, 0x07, 0x77, 0x4d, 0x51, 0xae, 0x7d, 0xc7, 0xbf, 0xd7, 0x8a, 0x7d, 0xc4, 0xc1, 0x5d, - 0xf2, 0xe6, 0xf9, 0x8c, 0x73, 0xb3, 0xc2, 0x38, 0xd7, 0x37, 0xcc, 0xfd, 0x58, 0xc8, 0x30, 0xf7, - 0xfa, 0xec, 0xde, 0xe2, 0xb7, 0x91, 0x2c, 0x1c, 0x61, 0x10, 0xa6, 0xea, 0xc7, 0x0a, 0xbc, 0x32, - 0x93, 0x82, 0x5c, 0x86, 0xac, 0xde, 0xac, 0xb4, 0x82, 0xf1, 0xa5, 0x6b, 0x46, 0x40, 0xc8, 0x1e, - 0x2c, 0xed, 0x76, 0x3c, 0xf7, 0x88, 0x4e, 0xe3, 0xc4, 0xeb, 0x81, 0x58, 0xb5, 0x3e, 0x7a, 0x79, - 0xce, 0x0c, 0x68, 0x89, 0x0d, 0xeb, 0xb8, 0x16, 0x42, 0xa9, 0x9f, 0xd2, 0x09, 0xba, 0x86, 0x58, - 0x85, 0x31, 0x32, 0xba, 0xcf, 0xc4, 0x80, 0xd1, 0x25, 0xf8, 0x58, 0xf0, 0x22, 0xd3, 0x1b, 0xf8, - 0x1c, 0x71, 0x55, 0x6f, 0x41, 0xb6, 0x29, 0xec, 0x04, 0x24, 0x6b, 0x76, 0x61, 0x13, 0x60, 0xfa, - 0xa5, 0xda, 0x6f, 0x2b, 0x42, 0x21, 0xf0, 0xec, 0x0f, 0x91, 0xb2, 0x66, 0x75, 0x67, 0x67, 0xcd, - 0xea, 0xfe, 0x94, 0x59, 0xb3, 0xb4, 0xbf, 0xe0, 0x51, 0xcf, 0x2b, 0xdd, 0x66, 0x44, 0x33, 0xfb, - 0xa2, 0x5e, 0x09, 0x46, 0x68, 0x76, 0x5e, 0x93, 0xb2, 0x2e, 0xc6, 0xdf, 0x35, 0xdd, 0x39, 0x41, - 0x9a, 0xaa, 0x7f, 0x94, 0x86, 0xcb, 0xb3, 0xc8, 0x13, 0xf3, 0x3a, 0x2b, 0xcf, 0x97, 0xd7, 0xf9, - 0x36, 0x64, 0x19, 0xcc, 0x37, 0xb9, 0xc7, 0x0e, 0xe7, 0xa4, 0xb4, 0xc3, 0x45, 0x31, 0xb9, 0x06, - 0x0b, 0x7a, 0xc1, 0x0a, 0x52, 0x8d, 0xa1, 0x6d, 0x6c, 0xe7, 0xc8, 0x43, 0xab, 0x4b, 0x5e, 0x44, - 0xbe, 0x14, 0xcf, 0xae, 0xc7, 0x73, 0x8c, 0x6d, 0x4b, 0x1d, 0x12, 0x4b, 0x48, 0x80, 0xed, 0x0d, - 0x02, 0xe8, 0xf3, 0x98, 0xd4, 0x66, 0x3c, 0x53, 0x9f, 0x06, 0x0b, 0xcd, 0x91, 0xe3, 0x39, 0x63, - 0xd9, 0x6e, 0x75, 0x88, 0x10, 0x93, 0x97, 0x70, 0xab, 0xd2, 0xce, 0x53, 0x16, 0x44, 0x60, 0x41, - 0x0e, 0xec, 0x82, 0x66, 0xa8, 0x14, 0x6c, 0x4a, 0x28, 0x94, 0xa0, 0xda, 0x99, 0xf4, 0x8f, 0x4e, - 0xdb, 0x66, 0x95, 0xb3, 0x1a, 0x8c, 0xa0, 0x87, 0x50, 0xfa, 0x81, 0x9e, 0x29, 0xa1, 0x68, 0xdf, - 0x54, 0x60, 0x23, 0xe9, 0x3b, 0xc8, 0x65, 0xc8, 0xf4, 0x13, 0x13, 0x09, 0xf6, 0x99, 0xef, 0x73, - 0x8e, 0xfe, 0xda, 0xc7, 0x83, 0xd1, 0x59, 0x67, 0x2c, 0x5b, 0xf7, 0x4a, 0x60, 0x13, 0xe8, 0x43, - 0x09, 0xff, 0x93, 0x2b, 0x62, 0x8f, 0x4e, 0xc7, 0x52, 0x0f, 0xe2, 0x8f, 0xa6, 0x03, 0x54, 0xba, - 0xcd, 0xc6, 0x90, 0x05, 0xc4, 0x7f, 0x03, 0x32, 0xb4, 0x59, 0x91, 0xd9, 0x4b, 0xe7, 0x8f, 0x5e, - 0xab, 0x72, 0x24, 0xd6, 0x2a, 0xaf, 0x73, 0xd6, 0x33, 0x11, 0x59, 0x3b, 0x84, 0xd5, 0x30, 0x06, - 0x31, 0xc2, 0x21, 0x54, 0x73, 0xf7, 0x54, 0x5e, 0xd3, 0xee, 0x60, 0xc0, 0x3c, 0x4c, 0x76, 0x5f, - 0xfe, 0xc7, 0x77, 0xaf, 0x00, 0x7d, 0x64, 0x34, 0x49, 0x21, 0x56, 0xb5, 0x6f, 0xa5, 0x60, 0x23, - 0x70, 0x6a, 0x17, 0x6b, 0xe8, 0x17, 0xd6, 0xc3, 0x52, 0x0f, 0x79, 0x00, 0x0a, 0x46, 0x2b, 0xfe, - 0x81, 0x33, 0x1c, 0x8f, 0xf6, 0x60, 0x73, 0x1a, 0x3e, 0xb9, 0x03, 0x4b, 0x18, 0x07, 0x69, 0xd8, - 0x39, 0x72, 0xe4, 0xbd, 0xaf, 0x2f, 0x80, 0x66, 0x50, 0xae, 0xfd, 0x50, 0x81, 0x2d, 0xee, 0x17, - 0x51, 0xeb, 0xb8, 0x7d, 0x54, 0xab, 0x1f, 0x39, 0xef, 0x8f, 0x87, 0xf0, 0x5e, 0x68, 0x1f, 0xbb, - 0x11, 0x76, 0x7f, 0x89, 0xbd, 0x6d, 0xfa, 0xd7, 0x92, 0xdb, 0x18, 0xdb, 0x8b, 0x5f, 0x3b, 0x67, - 0x58, 0x44, 0x86, 0x3e, 0x05, 0xc8, 0x11, 0x19, 0x10, 0x43, 0xfb, 0x35, 0xd8, 0x99, 0xfd, 0x02, - 0xf2, 0x45, 0x58, 0xc1, 0x64, 0x51, 0xed, 0xe1, 0xc9, 0xa8, 0xd3, 0x75, 0x84, 0x2a, 0x4c, 0xa8, - 0x2f, 0xe5, 0x32, 0x16, 0xaa, 0x8c, 0x47, 0x08, 0x38, 0xc1, 0x34, 0x54, 0x9c, 0x28, 0xe4, 0x7c, - 0x24, 0xd7, 0xa6, 0xfd, 0xba, 0x02, 0x24, 0x5e, 0x07, 0xf9, 0x28, 0x2c, 0xb7, 0x5b, 0x05, 0x6b, - 0xdc, 0x19, 0x8d, 0xcb, 0x83, 0xc9, 0x88, 0xc7, 0x09, 0x63, 0x0e, 0xe3, 0xe3, 0x23, 0x9b, 0x5d, - 0xa0, 0x9c, 0x0e, 0x26, 0x23, 0x33, 0x84, 0x87, 0x59, 0x8e, 0x1c, 0xe7, 0xcb, 0xdd, 0xce, 0xd3, - 0x70, 0x96, 0x23, 0x0e, 0x0b, 0x65, 0x39, 0xe2, 0x30, 0xed, 0x1d, 0x05, 0xb6, 0x85, 0x35, 0x61, - 0x37, 0xa1, 0x2d, 0x05, 0x0c, 0x8b, 0x32, 0x12, 0x81, 0x69, 0x67, 0xb1, 0xb4, 0xeb, 0x22, 0x72, - 0x10, 0x36, 0x10, 0x79, 0x5b, 0x46, 0x4b, 0x3e, 0x03, 0x19, 0x6b, 0x3c, 0x18, 0x9e, 0x23, 0x74, - 0x90, 0xea, 0x8f, 0xe8, 0x78, 0x30, 0xc4, 0x2a, 0x90, 0x52, 0x73, 0x60, 0x43, 0x6e, 0x9c, 0x68, - 0x31, 0xa9, 0xc1, 0x22, 0x8f, 0x11, 0x17, 0xb9, 0xa8, 0x9f, 0xf1, 0x4d, 0xbb, 0x6b, 0x22, 0x3e, - 0x11, 0x0f, 0x8c, 0x6a, 0x8a, 0x3a, 0xb4, 0xdf, 0x55, 0x20, 0x47, 0xb9, 0x0d, 0x94, 0xe2, 0x5e, - 0x74, 0x4a, 0x87, 0x19, 0x47, 0x61, 0x77, 0xe2, 0x57, 0x7f, 0xae, 0xd3, 0xf8, 0x23, 0xb0, 0x16, - 0x21, 0x20, 0x1a, 0x46, 0xa6, 0xe8, 0xb9, 0x47, 0x1d, 0x96, 0x34, 0x85, 0xd9, 0x6c, 0x84, 0x60, - 0xda, 0x6f, 0x2a, 0xb0, 0x41, 0x65, 0x7e, 0x76, 0xcf, 0x69, 0x4e, 0x7a, 0x62, 0xbd, 0x53, 0x0e, - 0x4a, 0x98, 0xa5, 0x32, 0xaf, 0x79, 0xc6, 0x41, 0x71, 0x98, 0xe9, 0x97, 0x92, 0x32, 0x64, 0xf9, - 0xf9, 0xe2, 0xf1, 0x78, 0xa6, 0x3b, 0x92, 0x32, 0x21, 0xa8, 0x98, 0x23, 0xd1, 0x2f, 0xc1, 0x2d, - 0x8c, 0xd3, 0x98, 0x3e, 0xb5, 0xf6, 0x5f, 0x0a, 0x5c, 0x9a, 0x42, 0x43, 0xde, 0x82, 0x79, 0xf4, - 0xe8, 0xe3, 0xa3, 0x77, 0x79, 0xca, 0x2b, 0xc6, 0x47, 0xa7, 0x07, 0x77, 0xd9, 0x41, 0x74, 0x46, - 0x1f, 0x4c, 0x46, 0x45, 0xde, 0x86, 0x25, 0xbd, 0xdb, 0xe5, 0xe2, 0x4c, 0x2a, 0x24, 0xce, 0x4c, - 0x79, 0xe3, 0xeb, 0x3e, 0x3e, 0x13, 0x67, 0x98, 0x6f, 0x49, 0xb7, 0x6b, 0x73, 0x6f, 0xc5, 0xa0, - 0xbe, 0xad, 0x4f, 0xc2, 0x6a, 0x18, 0xf9, 0xb9, 0x1c, 0xac, 0xbe, 0xa3, 0x80, 0x1a, 0x6e, 0xc3, - 0xcf, 0x26, 0xb2, 0x52, 0xd2, 0x30, 0x3f, 0x63, 0x52, 0xfd, 0x7e, 0x0a, 0x5e, 0x4a, 0xec, 0x61, - 0xf2, 0x1a, 0x2c, 0xe8, 0xc3, 0x61, 0xa5, 0xc8, 0x67, 0x15, 0xe7, 0x90, 0x50, 0x4b, 0x1c, 0x92, - 0xf6, 0x18, 0x12, 0x79, 0x03, 0xb2, 0xec, 0x3a, 0xbd, 0x28, 0x36, 0x1c, 0x0c, 0x15, 0xc3, 0xef, - 0xfa, 0xc3, 0x91, 0x45, 0x05, 0x22, 0x29, 0xc1, 0x2a, 0x0f, 0xb2, 0x62, 0x3a, 0x27, 0xce, 0x57, - 0xfd, 0x10, 0xf7, 0x18, 0x85, 0x5f, 0xa8, 0x9e, 0xed, 0x11, 0x2b, 0x93, 0xc3, 0x8c, 0x84, 0xa9, - 0x48, 0x15, 0x54, 0xac, 0x53, 0xae, 0x89, 0x85, 0x37, 0xc5, 0xb0, 0x37, 0xac, 0x11, 0x53, 0xea, - 0x8a, 0x51, 0xfa, 0xc3, 0xa5, 0x7b, 0x9e, 0x7b, 0xd2, 0x3f, 0x73, 0xfa, 0xe3, 0x9f, 0xdd, 0x70, - 0x05, 0xef, 0x38, 0xd7, 0x70, 0xfd, 0x61, 0x86, 0x2d, 0xe6, 0x28, 0x19, 0xe5, 0x68, 0xa4, 0x88, - 0xd6, 0xc8, 0xd1, 0x50, 0xa1, 0x89, 0x87, 0x11, 0x29, 0xc2, 0x22, 0x0b, 0xef, 0x22, 0x56, 0xc6, - 0x2b, 0x89, 0x4d, 0x60, 0x38, 0x07, 0x77, 0x19, 0xfb, 0xc2, 0x5c, 0x0b, 0x3d, 0x53, 0x90, 0x92, - 0x03, 0xc8, 0x15, 0x7a, 0x4e, 0xa7, 0x3f, 0x19, 0xb6, 0xce, 0x77, 0xe5, 0xb8, 0xc9, 0xbf, 0x65, - 0xf9, 0x88, 0x91, 0xe1, 0x55, 0x25, 0xee, 0xe4, 0x72, 0x45, 0xa4, 0xe5, 0x7b, 0x1b, 0x65, 0x50, - 0x53, 0xf9, 0xe1, 0x19, 0xfd, 0x13, 0x05, 0x22, 0x5d, 0xd8, 0x95, 0x8e, 0xbb, 0x23, 0xd9, 0xb0, - 0x5a, 0xed, 0x78, 0xe3, 0xd6, 0xa8, 0xd3, 0xf7, 0x30, 0x2c, 0xe4, 0x39, 0xc2, 0x66, 0x6d, 0x8b, - 0x94, 0xc3, 0xa8, 0x63, 0x1c, 0xfb, 0xa4, 0x4c, 0x83, 0x19, 0xae, 0x8e, 0xf2, 0x4b, 0x25, 0xb7, - 0xdf, 0xe9, 0xb9, 0x5f, 0x13, 0x4e, 0x99, 0x8c, 0x5f, 0x3a, 0x16, 0x40, 0x33, 0x28, 0xd7, 0xbe, - 0x10, 0x1b, 0x37, 0xd6, 0xca, 0x1c, 0x2c, 0x72, 0x97, 0x7d, 0xe6, 0xc2, 0xde, 0x34, 0xea, 0xc5, - 0x4a, 0x7d, 0x4f, 0x55, 0xc8, 0x2a, 0x40, 0xd3, 0x6c, 0x14, 0x0c, 0xcb, 0xa2, 0xcf, 0x29, 0xfa, - 0xcc, 0xfd, 0xdb, 0x4b, 0xed, 0xaa, 0x9a, 0x96, 0x5c, 0xdc, 0x33, 0xda, 0x0f, 0x14, 0xb8, 0x98, - 0x3c, 0x94, 0xa4, 0x05, 0x18, 0xe4, 0x80, 0x5f, 0x3e, 0x7f, 0x74, 0xe6, 0xb8, 0x27, 0x82, 0xa3, - 0xc1, 0x12, 0xc6, 0xcc, 0x09, 0x3f, 0x25, 0x2e, 0x8b, 0x98, 0x57, 0x9f, 0xdb, 0x35, 0x53, 0x6e, - 0x57, 0x2b, 0xc0, 0xe6, 0xb4, 0x3a, 0xc2, 0x9f, 0xba, 0x06, 0x39, 0xbd, 0xd9, 0xac, 0x56, 0x0a, - 0x7a, 0xab, 0xd2, 0xa8, 0xab, 0x0a, 0x59, 0x82, 0xf9, 0x3d, 0xb3, 0xd1, 0x6e, 0xaa, 0x29, 0xed, - 0xdb, 0x0a, 0xac, 0x54, 0x02, 0x33, 0xad, 0x17, 0x5d, 0x7c, 0x1f, 0x0f, 0x2d, 0xbe, 0x4d, 0x3f, - 0x1c, 0x88, 0xff, 0x82, 0x73, 0xad, 0xbc, 0x77, 0x52, 0xb0, 0x1e, 0xa3, 0x21, 0x16, 0x2c, 0xea, - 0x87, 0x56, 0xa3, 0x52, 0x2c, 0xf0, 0x96, 0x5d, 0x09, 0xec, 0x8b, 0x30, 0xe3, 0x53, 0xec, 0x2d, - 0xcc, 0x85, 0xf6, 0x89, 0x67, 0x0f, 0xdc, 0xae, 0x94, 0xad, 0xb5, 0x3c, 0x67, 0x8a, 0x9a, 0xf0, - 0x24, 0xfb, 0xda, 0x64, 0xe4, 0x60, 0xb5, 0xa9, 0x90, 0x22, 0xd4, 0x87, 0xc7, 0x2b, 0x46, 0x87, - 0x87, 0x0e, 0x2d, 0x8f, 0x57, 0x1d, 0xd4, 0x47, 0xea, 0xb0, 0xb0, 0xe7, 0x8e, 0xcb, 0x93, 0x47, - 0x7c, 0xfd, 0xee, 0x04, 0xf9, 0x7f, 0xca, 0x93, 0x47, 0xf1, 0x6a, 0x51, 0xc7, 0xc7, 0xc2, 0xdd, - 0x84, 0xaa, 0xe4, 0xb5, 0xec, 0xae, 0x40, 0x8e, 0x4b, 0x41, 0x28, 0x60, 0x7c, 0x4f, 0x81, 0xcd, - 0x69, 0xdf, 0x4e, 0x05, 0xab, 0xb0, 0x7f, 0xfe, 0x45, 0x3f, 0x23, 0x44, 0xd8, 0x31, 0x5f, 0xa0, - 0x91, 0x4f, 0x43, 0xae, 0xe2, 0x79, 0x13, 0x67, 0x64, 0xbd, 0xd1, 0x36, 0x2b, 0x7c, 0xc2, 0xbd, - 0xf2, 0xef, 0xef, 0x5e, 0xb9, 0x84, 0x6e, 0x0e, 0x23, 0xdb, 0x7b, 0xc3, 0x9e, 0x8c, 0xdc, 0x50, - 0xf4, 0x7c, 0x99, 0x82, 0xf2, 0xc1, 0x9d, 0x49, 0xd7, 0x75, 0x84, 0x14, 0x20, 0x7c, 0x98, 0x39, - 0x4c, 0x3e, 0x95, 0x04, 0x4c, 0xfb, 0x86, 0x02, 0x5b, 0xd3, 0x3b, 0x9a, 0x9e, 0x74, 0x2d, 0x66, - 0x45, 0x24, 0xbc, 0x88, 0xf1, 0xa4, 0xf3, 0x4d, 0x8d, 0xe4, 0x3a, 0x05, 0x22, 0x25, 0xf2, 0xb3, - 0xb1, 0xa7, 0x62, 0x29, 0x98, 0xc3, 0x44, 0x02, 0x11, 0xe3, 0x30, 0x4c, 0x19, 0x17, 0xf2, 0xa9, - 0xc4, 0x44, 0x33, 0xe8, 0x9a, 0x23, 0x27, 0x9a, 0x09, 0xa5, 0x20, 0x93, 0x53, 0xce, 0xbc, 0x05, - 0xf3, 0x18, 0xf5, 0x9b, 0x4f, 0x30, 0x12, 0x9a, 0x06, 0x18, 0xfa, 0x9b, 0xc9, 0x4b, 0x88, 0x24, - 0xcb, 0x4b, 0x08, 0xd0, 0xfe, 0x5e, 0x81, 0x9c, 0x84, 0x4b, 0xbe, 0x00, 0x2a, 0x66, 0xc2, 0xe6, - 0x36, 0x33, 0x63, 0xd7, 0x8f, 0x2c, 0xba, 0xee, 0x67, 0x84, 0x2b, 0xef, 0x3b, 0x4f, 0x9b, 0x1d, - 0x77, 0xc4, 0x8e, 0xf7, 0x28, 0xba, 0x9c, 0x5a, 0x8a, 0x96, 0xe9, 0x41, 0x11, 0x31, 0x61, 0xc9, - 0x37, 0x59, 0x8d, 0x1c, 0xa2, 0x52, 0x23, 0x7c, 0xdb, 0x55, 0xde, 0xb7, 0xe2, 0x31, 0xe4, 0xfb, - 0x23, 0x80, 0xda, 0x77, 0x15, 0xd8, 0x48, 0x22, 0xfe, 0xf9, 0x4c, 0x9c, 0xaf, 0xfd, 0x47, 0x0a, - 0x2e, 0xd2, 0x0d, 0xad, 0xe7, 0x78, 0x1e, 0xed, 0x1a, 0xa7, 0x3f, 0xe6, 0x2c, 0x3e, 0x79, 0x13, - 0x16, 0x4e, 0x9f, 0x4f, 0x9d, 0xcd, 0xd0, 0x09, 0x01, 0x64, 0x12, 0x84, 0x03, 0x0f, 0xfd, 0x4f, - 0xae, 0x82, 0x9c, 0x00, 0x3d, 0x8d, 0x21, 0x58, 0x53, 0x9b, 0x8a, 0xb9, 0x34, 0xf4, 0x73, 0x15, - 0x7f, 0x0c, 0xe6, 0x51, 0x85, 0xc5, 0x8f, 0x6b, 0x21, 0x66, 0x25, 0xb7, 0x0e, 0x15, 0x5c, 0x26, - 0x23, 0x20, 0x1f, 0x02, 0x08, 0xb2, 0x57, 0xf0, 0xf3, 0x58, 0xa8, 0x76, 0xfc, 0x04, 0x16, 0xe6, - 0xd2, 0xd9, 0x71, 0x87, 0xa7, 0x84, 0xc8, 0xc3, 0xba, 0xe8, 0xf7, 0xa1, 0x88, 0xdc, 0xc8, 0x6f, - 0x5a, 0xd7, 0x58, 0x41, 0x65, 0x28, 0xa2, 0x37, 0x5e, 0x8f, 0x25, 0x71, 0xc6, 0x00, 0xce, 0x91, - 0x4c, 0xcd, 0xd7, 0x63, 0x99, 0x9a, 0xb3, 0x0c, 0x4b, 0x4e, 0xc7, 0xac, 0xfd, 0x6b, 0x0a, 0x96, - 0x0e, 0x29, 0x23, 0x8c, 0xea, 0x9d, 0xd9, 0xea, 0xa2, 0x7b, 0x90, 0xab, 0x0e, 0x3a, 0xfc, 0x4a, - 0x8b, 0xfb, 0xbd, 0xb0, 0xd1, 0xec, 0x0d, 0x3a, 0xe2, 0x76, 0xcc, 0x33, 0x65, 0xa4, 0x67, 0xf8, - 0xcc, 0x3f, 0x80, 0x05, 0x76, 0xc5, 0xc8, 0x35, 0x97, 0x42, 0x14, 0xf2, 0x5b, 0xf4, 0x3a, 0x2b, - 0x96, 0x6e, 0x61, 0xd8, 0x35, 0xa5, 0xcc, 0x97, 0xf3, 0x38, 0xb4, 0x92, 0x32, 0x6b, 0xfe, 0x7c, - 0xca, 0x2c, 0x29, 0xde, 0xde, 0xc2, 0x79, 0xe2, 0xed, 0x6d, 0xdd, 0x87, 0x9c, 0xd4, 0x9e, 0xe7, - 0x92, 0x8c, 0xbe, 0x9e, 0x82, 0x15, 0xfc, 0x2a, 0xdf, 0xde, 0xe8, 0x17, 0x53, 0x35, 0xf7, 0xf1, - 0x90, 0x6a, 0x6e, 0x53, 0x1e, 0x2f, 0xf6, 0x65, 0x33, 0x74, 0x72, 0x0f, 0x60, 0x3d, 0x86, 0x48, - 0x3e, 0x02, 0xf3, 0xb4, 0xf9, 0x62, 0x13, 0x55, 0xa3, 0x33, 0x20, 0x88, 0xcd, 0x4c, 0x3f, 0xdc, - 0x33, 0x19, 0xb6, 0xf6, 0xdf, 0x0a, 0x2c, 0xf3, 0xd4, 0x28, 0xfd, 0xe3, 0xc1, 0x33, 0xbb, 0xf3, - 0x66, 0xb4, 0x3b, 0x59, 0x04, 0x18, 0xde, 0x9d, 0xff, 0xdb, 0x9d, 0x78, 0x3f, 0xd4, 0x89, 0x97, - 0xfc, 0x48, 0x8d, 0xe2, 0x73, 0x66, 0xf4, 0xe1, 0xdf, 0x62, 0xec, 0xe2, 0x30, 0x22, 0xf9, 0x12, - 0x2c, 0xd5, 0x9d, 0x27, 0x21, 0x8d, 0xc0, 0xcd, 0x29, 0x95, 0xbe, 0xee, 0x23, 0xb2, 0x35, 0x85, - 0xcc, 0x54, 0xdf, 0x79, 0x62, 0xc7, 0x6e, 0x37, 0x83, 0x2a, 0xb7, 0x3e, 0x09, 0xab, 0x61, 0xb2, - 0xe7, 0x99, 0xfa, 0xdc, 0x09, 0x17, 0x83, 0x1a, 0x7d, 0x33, 0x0d, 0x10, 0xf8, 0x2f, 0xd2, 0x05, - 0x18, 0x32, 0xec, 0x10, 0x97, 0x29, 0x08, 0x92, 0xe7, 0xb8, 0xb0, 0xf7, 0xb8, 0xc9, 0x95, 0xfe, - 0xa9, 0xe9, 0x91, 0x34, 0x51, 0xfd, 0x5f, 0xe0, 0x0e, 0x73, 0x5d, 0xa7, 0xd7, 0x61, 0x7b, 0x7b, - 0x7a, 0xf7, 0x3a, 0x06, 0x4e, 0xf6, 0xa1, 0x53, 0x72, 0x5c, 0xa3, 0x5b, 0x5d, 0x91, 0x22, 0xc4, - 0x7c, 0x82, 0x33, 0xcf, 0xe7, 0x13, 0xdc, 0x84, 0x25, 0xb7, 0xff, 0xd8, 0xe9, 0x8f, 0x07, 0xa3, - 0xa7, 0x78, 0xd3, 0x11, 0xa8, 0x50, 0x69, 0x17, 0x54, 0x44, 0x19, 0x1b, 0x07, 0x3c, 0xc8, 0x7d, - 0x7c, 0x79, 0x18, 0x7c, 0xa0, 0xef, 0xd3, 0x3c, 0xaf, 0x2e, 0x3c, 0xc8, 0x64, 0x17, 0xd4, 0xc5, - 0x07, 0x99, 0x6c, 0x56, 0x5d, 0x7a, 0x90, 0xc9, 0x2e, 0xa9, 0x60, 0x4a, 0x77, 0x87, 0xfe, 0xdd, - 0xa0, 0x74, 0x96, 0x87, 0xcf, 0x69, 0xed, 0x27, 0x29, 0x20, 0xf1, 0x66, 0x90, 0x8f, 0x43, 0x8e, - 0x6d, 0xb0, 0xf6, 0xc8, 0xfb, 0x0a, 0x77, 0x89, 0x60, 0xa1, 0xa1, 0x24, 0xb0, 0x1c, 0x1a, 0x8a, - 0x81, 0x4d, 0xef, 0x2b, 0x3d, 0xf2, 0x45, 0xb8, 0x80, 0xdd, 0x3b, 0x74, 0x46, 0xee, 0xa0, 0x6b, - 0x63, 0x1c, 0xdf, 0x4e, 0x8f, 0xe7, 0xa3, 0x7c, 0x0d, 0x13, 0x27, 0xc7, 0x8b, 0xa7, 0x0c, 0x03, - 0xba, 0x29, 0x36, 0x11, 0xb3, 0xc9, 0x10, 0x49, 0x0b, 0x54, 0x99, 0xfe, 0x78, 0xd2, 0xeb, 0xf1, - 0x91, 0xcd, 0x53, 0x2e, 0x2b, 0x5a, 0x36, 0xa5, 0xe2, 0xd5, 0xa0, 0xe2, 0xd2, 0xa4, 0xd7, 0x23, - 0x6f, 0x02, 0x0c, 0xfa, 0xf6, 0x99, 0xeb, 0x79, 0xec, 0xfe, 0xcc, 0xf7, 0xa8, 0x0e, 0xa0, 0xf2, - 0x60, 0x0c, 0xfa, 0x35, 0x06, 0x24, 0xff, 0x0f, 0x30, 0xa2, 0x04, 0x86, 0x5a, 0x61, 0x16, 0x53, - 0x3c, 0xc3, 0x8c, 0x00, 0x86, 0x1d, 0xb8, 0x4f, 0x1c, 0xcb, 0xfd, 0x9a, 0x70, 0x47, 0xf9, 0x3c, - 0xac, 0x73, 0x03, 0xe7, 0x43, 0x77, 0x7c, 0xca, 0xa5, 0xb7, 0x17, 0x11, 0xfd, 0x24, 0xf1, 0xed, - 0x9f, 0x32, 0x00, 0xfa, 0xa1, 0x25, 0xa2, 0x98, 0xdd, 0x86, 0x79, 0x2a, 0x93, 0x0a, 0xdd, 0x16, - 0x72, 0xba, 0x58, 0xaf, 0xcc, 0xe9, 0x22, 0x06, 0x5d, 0x8d, 0x26, 0x1a, 0xfe, 0x0b, 0xbd, 0x16, - 0xae, 0x46, 0xe6, 0x0b, 0x10, 0x8a, 0x22, 0xcd, 0xb1, 0x48, 0x15, 0x20, 0x88, 0x2b, 0xc6, 0xa5, - 0xac, 0xf5, 0x20, 0x40, 0x0f, 0x2f, 0xe0, 0x99, 0x2c, 0x82, 0xd8, 0x64, 0xf2, 0xf4, 0x09, 0xd0, - 0xc8, 0x3e, 0x64, 0x5a, 0x1d, 0xdf, 0x5f, 0x78, 0x4a, 0xb4, 0xb5, 0x57, 0x79, 0xbe, 0xd0, 0x20, - 0xe2, 0xda, 0xea, 0xb8, 0x13, 0x4a, 0xab, 0x8c, 0x95, 0x10, 0x03, 0x16, 0x78, 0x2e, 0xf8, 0x29, - 0x51, 0x3a, 0x79, 0x2a, 0x78, 0x1e, 0x9b, 0x1b, 0x81, 0x32, 0x4f, 0xc1, 0xb3, 0xbe, 0xdf, 0x83, - 0xb4, 0x65, 0xd5, 0x78, 0x8c, 0x91, 0x95, 0x40, 0xe2, 0xb5, 0xac, 0x1a, 0x63, 0x7e, 0x3d, 0xef, - 0x4c, 0x22, 0xa3, 0xc8, 0xe4, 0x13, 0x90, 0x93, 0x84, 0x18, 0x1e, 0x9d, 0x07, 0xfb, 0x40, 0xf2, - 0xc8, 0x92, 0x37, 0x0d, 0x09, 0x9b, 0x54, 0x41, 0xdd, 0x9f, 0x3c, 0x72, 0xf4, 0xe1, 0x10, 0x5d, - 0x35, 0x1f, 0x3b, 0x23, 0xc6, 0xb6, 0x65, 0x83, 0xb0, 0xd6, 0xe8, 0xc7, 0xd1, 0x15, 0xa5, 0xb2, - 0x7e, 0x2f, 0x4a, 0x49, 0x9a, 0xb0, 0x6e, 0x39, 0xe3, 0xc9, 0x90, 0xd9, 0x00, 0x95, 0x06, 0x23, - 0x2a, 0x90, 0xb2, 0x58, 0x3e, 0x18, 0x01, 0xd8, 0xa3, 0x85, 0xc2, 0xf0, 0xea, 0x78, 0x30, 0x8a, - 0x08, 0xa7, 0x71, 0x62, 0xcd, 0x91, 0x87, 0x9c, 0x9e, 0xaa, 0x61, 0x31, 0x17, 0x4f, 0x55, 0x21, - 0xe6, 0x06, 0xc2, 0xed, 0x87, 0x12, 0xe2, 0xcd, 0xe1, 0x65, 0xac, 0x14, 0x6f, 0x2e, 0x14, 0x65, - 0xee, 0x9d, 0x8c, 0x14, 0xf2, 0x94, 0x8f, 0xc5, 0x5b, 0x00, 0x0f, 0x06, 0x6e, 0xbf, 0xe6, 0x8c, - 0x4f, 0x07, 0x5d, 0x29, 0xec, 0x5d, 0xee, 0x57, 0x06, 0x6e, 0xdf, 0x3e, 0x43, 0xf0, 0x4f, 0xde, - 0xbd, 0x22, 0x21, 0x99, 0xd2, 0x7f, 0xf2, 0x41, 0x58, 0xa2, 0x4f, 0xad, 0xc0, 0x92, 0x89, 0xa9, - 0xc1, 0x91, 0x9a, 0x25, 0x06, 0x09, 0x10, 0xc8, 0x7d, 0x4c, 0x85, 0xe3, 0x0e, 0xc7, 0x12, 0xf3, - 0x2a, 0xf2, 0xde, 0xb8, 0xc3, 0x71, 0x34, 0x8a, 0xb5, 0x84, 0x4c, 0xca, 0x7e, 0xd3, 0x45, 0xf6, - 0x2a, 0x9e, 0x71, 0x07, 0x85, 0x41, 0x3e, 0xd7, 0x6c, 0x11, 0x3e, 0x57, 0x16, 0x06, 0x23, 0x64, - 0xd8, 0x08, 0xab, 0x5c, 0x64, 0x97, 0x73, 0x9c, 0xa9, 0x65, 0x8d, 0xf0, 0x4e, 0xbb, 0xf6, 0x11, - 0x82, 0x43, 0x8d, 0xf0, 0x91, 0xc9, 0x2e, 0xac, 0x31, 0x1e, 0xdf, 0xcf, 0x82, 0xc9, 0x59, 0x5c, - 0xdc, 0xdb, 0x82, 0x34, 0x99, 0xf2, 0xeb, 0x23, 0x04, 0xa4, 0x04, 0xf3, 0xa8, 0x1c, 0xe0, 0xee, - 0x0b, 0xdb, 0xb2, 0x66, 0x26, 0xba, 0x8e, 0x70, 0x5f, 0x41, 0x9d, 0x8c, 0xbc, 0xaf, 0x20, 0x2a, - 0xf9, 0x1c, 0x80, 0xd1, 0x1f, 0x0d, 0x7a, 0x3d, 0x0c, 0xf0, 0x9c, 0x45, 0x51, 0xea, 0x95, 0xf0, - 0x7a, 0xc4, 0x5a, 0x02, 0x24, 0x1e, 0x8c, 0x10, 0x9f, 0xed, 0x48, 0x18, 0x68, 0xa9, 0x2e, 0xad, - 0x02, 0x0b, 0x6c, 0x31, 0x62, 0xb0, 0x74, 0x9e, 0xfe, 0x45, 0x0a, 0xb5, 0xcd, 0x82, 0xa5, 0x73, - 0x78, 0x3c, 0x58, 0xba, 0x44, 0xa0, 0xed, 0xc3, 0x46, 0xd2, 0x87, 0x85, 0xd4, 0x19, 0xca, 0x79, - 0xd5, 0x19, 0x7f, 0x9a, 0x86, 0x65, 0xac, 0x4d, 0xec, 0xc2, 0x3a, 0xac, 0x58, 0x93, 0x47, 0x7e, - 0x24, 0x31, 0xb1, 0x1b, 0x63, 0xfb, 0x3c, 0xb9, 0x40, 0xbe, 0x36, 0x0d, 0x51, 0x10, 0x03, 0x56, - 0xc5, 0x49, 0xb0, 0x27, 0xbc, 0x1b, 0xfc, 0x38, 0xe5, 0x22, 0x1a, 0x66, 0x3c, 0x0b, 0x70, 0x84, - 0x28, 0x38, 0x0f, 0xd2, 0xcf, 0x73, 0x1e, 0x64, 0xce, 0x75, 0x1e, 0xbc, 0x0d, 0xcb, 0xe2, 0x6d, - 0xb8, 0x93, 0xcf, 0xbf, 0xd8, 0x4e, 0x1e, 0xaa, 0x8c, 0x54, 0xfd, 0x1d, 0x7d, 0x61, 0xe6, 0x8e, - 0x8e, 0x77, 0xd1, 0x62, 0x95, 0x0d, 0x11, 0x16, 0xdf, 0xd8, 0x31, 0x4d, 0xe6, 0x5e, 0xa1, 0xf9, - 0x53, 0x9c, 0x92, 0x1f, 0x81, 0xa5, 0xea, 0x40, 0x5c, 0x43, 0x4a, 0xf7, 0x3f, 0x3d, 0x01, 0x94, - 0xd9, 0x05, 0x1f, 0xd3, 0x3f, 0xdd, 0xd2, 0xef, 0xc7, 0xe9, 0x76, 0x1f, 0x80, 0xbb, 0xcd, 0x04, - 0xe9, 0xed, 0x70, 0xc9, 0x88, 0x28, 0x2a, 0xe1, 0x6b, 0x28, 0x09, 0x99, 0xee, 0x4e, 0xdc, 0xc2, - 0x49, 0x3f, 0x3a, 0x1a, 0x4c, 0xfa, 0xe3, 0x50, 0x3e, 0x68, 0xe1, 0x65, 0xdb, 0xe1, 0x65, 0xf2, - 0xf6, 0x10, 0x21, 0x7b, 0x7f, 0x07, 0x84, 0x7c, 0xd6, 0x37, 0xd0, 0x5c, 0x9c, 0xd5, 0x43, 0x5a, - 0xac, 0x87, 0xa6, 0x9a, 0x65, 0x6a, 0x3f, 0x50, 0xe4, 0x24, 0x11, 0x3f, 0xc5, 0x50, 0x7f, 0x0c, - 0xc0, 0xb7, 0x03, 0x11, 0x63, 0xcd, 0xe4, 0x25, 0x1f, 0x2a, 0xf7, 0x72, 0x80, 0x2b, 0x7d, 0x4d, - 0xfa, 0xfd, 0xfa, 0x9a, 0x16, 0xe4, 0x1a, 0x5f, 0x1e, 0x77, 0x02, 0xc3, 0x21, 0xb0, 0x7c, 0x4e, - 0x16, 0x77, 0xa6, 0xf4, 0xee, 0x0d, 0x3c, 0x1b, 0x02, 0x3e, 0x78, 0x0a, 0x0b, 0x2c, 0x11, 0x6a, - 0x7f, 0xa9, 0xc0, 0x9a, 0x1c, 0x1a, 0xe0, 0x69, 0xff, 0x88, 0x7c, 0x8a, 0xc5, 0xac, 0x55, 0x42, - 0x22, 0x8b, 0x84, 0x44, 0xb7, 0xdc, 0xa7, 0xfd, 0x23, 0xc6, 0x00, 0x75, 0x9e, 0xc8, 0x8d, 0xa5, - 0x84, 0xe4, 0x11, 0x2c, 0x37, 0x07, 0xbd, 0x1e, 0x65, 0x6b, 0x46, 0x8f, 0xb9, 0x00, 0x40, 0x2b, - 0x8a, 0xde, 0x46, 0x89, 0x06, 0xed, 0x5e, 0xe3, 0x72, 0xee, 0xa5, 0x21, 0xdd, 0xef, 0x5d, 0x4e, - 0x17, 0x54, 0xfb, 0x1d, 0xf4, 0xe5, 0x93, 0xeb, 0xd4, 0x7e, 0xa4, 0x00, 0x89, 0x37, 0x49, 0xde, - 0xb2, 0x94, 0xff, 0x03, 0x16, 0x36, 0xc2, 0xfa, 0x65, 0x9e, 0x87, 0xf5, 0xcb, 0xff, 0x9e, 0x02, - 0x6b, 0x15, 0xbd, 0xc6, 0xd3, 0x46, 0xb0, 0x4b, 0xb3, 0xab, 0xf0, 0x4a, 0x45, 0xaf, 0xd9, 0xcd, - 0x46, 0xb5, 0x52, 0x78, 0x68, 0x27, 0x46, 0x83, 0x7e, 0x05, 0x5e, 0x8e, 0xa3, 0x04, 0x97, 0x6b, - 0x97, 0x61, 0x33, 0x5e, 0x2c, 0x22, 0x46, 0x27, 0x13, 0x8b, 0xe0, 0xd2, 0xe9, 0xfc, 0xa7, 0x61, - 0x4d, 0x44, 0x47, 0x6e, 0x55, 0x2d, 0xcc, 0xbf, 0xb0, 0x06, 0xb9, 0x03, 0xc3, 0xac, 0x94, 0x1e, - 0xda, 0xa5, 0x76, 0xb5, 0xaa, 0xce, 0x91, 0x15, 0x58, 0xe2, 0x80, 0x82, 0xae, 0x2a, 0x64, 0x19, - 0xb2, 0x95, 0xba, 0x65, 0x14, 0xda, 0xa6, 0xa1, 0xa6, 0xf2, 0x9f, 0x86, 0xd5, 0xe6, 0xc8, 0x7d, - 0xdc, 0x19, 0x3b, 0xfb, 0xce, 0x53, 0xbc, 0x1b, 0x5b, 0x84, 0xb4, 0xa9, 0x1f, 0xaa, 0x73, 0x04, - 0x60, 0xa1, 0xb9, 0x5f, 0xb0, 0xee, 0xde, 0x55, 0x15, 0x92, 0x83, 0xc5, 0xbd, 0x42, 0xd3, 0xde, - 0xaf, 0x59, 0x6a, 0x8a, 0x3e, 0xe8, 0x87, 0x16, 0x3e, 0xa4, 0xf3, 0x1f, 0x86, 0x75, 0x64, 0x48, - 0xaa, 0xae, 0x37, 0x76, 0xfa, 0xce, 0x08, 0xdb, 0xb0, 0x0c, 0x59, 0xcb, 0xa1, 0x3b, 0xc9, 0xd8, - 0x61, 0x0d, 0xa8, 0x4d, 0x7a, 0x63, 0x77, 0xd8, 0x73, 0xbe, 0xaa, 0x2a, 0xf9, 0xfb, 0xb0, 0x66, - 0x0e, 0x26, 0x63, 0xb7, 0x7f, 0x62, 0x8d, 0x29, 0xc6, 0xc9, 0x53, 0xf2, 0x12, 0xac, 0xb7, 0xeb, - 0x7a, 0x6d, 0xb7, 0xb2, 0xd7, 0x6e, 0xb4, 0x2d, 0xbb, 0xa6, 0xb7, 0x0a, 0x65, 0x76, 0x33, 0x57, - 0x6b, 0x58, 0x2d, 0xdb, 0x34, 0x0a, 0x46, 0xbd, 0xa5, 0x2a, 0xf9, 0x6f, 0xa1, 0x6e, 0xe5, 0x68, - 0xd0, 0xef, 0x96, 0x3a, 0x47, 0xe3, 0xc1, 0x08, 0x1b, 0xac, 0xc1, 0x8e, 0x65, 0x14, 0x1a, 0xf5, - 0xa2, 0x5d, 0xd2, 0x0b, 0xad, 0x86, 0x99, 0x14, 0x8e, 0x7c, 0x0b, 0x2e, 0x26, 0xe0, 0x34, 0x5a, - 0x4d, 0x55, 0x21, 0x57, 0x60, 0x3b, 0xa1, 0xec, 0xd0, 0xd8, 0xd5, 0xdb, 0xad, 0x72, 0x5d, 0x4d, - 0x4d, 0x21, 0xb6, 0xac, 0x86, 0x9a, 0xce, 0xff, 0x96, 0x02, 0xab, 0x6d, 0x8f, 0x9b, 0xc5, 0xb7, - 0xd1, 0x23, 0xf6, 0x55, 0xb8, 0xdc, 0xb6, 0x0c, 0xd3, 0x6e, 0x35, 0xf6, 0x8d, 0xba, 0xdd, 0xb6, - 0xf4, 0xbd, 0x68, 0x6b, 0xae, 0xc0, 0xb6, 0x84, 0x61, 0x1a, 0x85, 0xc6, 0x81, 0x61, 0xda, 0x4d, - 0xdd, 0xb2, 0x0e, 0x1b, 0x66, 0x51, 0x55, 0xe8, 0x1b, 0x13, 0x10, 0x6a, 0x25, 0x9d, 0xb5, 0x26, - 0x54, 0x56, 0x37, 0x0e, 0xf5, 0xaa, 0xbd, 0xdb, 0x68, 0xa9, 0xe9, 0x7c, 0x8d, 0x9e, 0xef, 0x18, - 0x14, 0x98, 0x19, 0x73, 0x66, 0x21, 0x53, 0x6f, 0xd4, 0x8d, 0xe8, 0x7d, 0xee, 0x32, 0x64, 0xf5, - 0x66, 0xd3, 0x6c, 0x1c, 0xe0, 0x14, 0x03, 0x58, 0x28, 0x1a, 0x75, 0xda, 0xb2, 0x34, 0x2d, 0x69, - 0x9a, 0x8d, 0x5a, 0xa3, 0x65, 0x14, 0xd5, 0x4c, 0xde, 0x14, 0x4b, 0x58, 0x54, 0x7a, 0x34, 0x60, - 0x97, 0xa7, 0x45, 0xa3, 0xa4, 0xb7, 0xab, 0x2d, 0x3e, 0x44, 0x0f, 0x6d, 0xd3, 0xf8, 0x6c, 0xdb, - 0xb0, 0x5a, 0x96, 0xaa, 0x10, 0x15, 0x96, 0xeb, 0x86, 0x51, 0xb4, 0x6c, 0xd3, 0x38, 0xa8, 0x18, - 0x87, 0x6a, 0x8a, 0xd6, 0xc9, 0xfe, 0xd3, 0x37, 0xe4, 0xdf, 0x51, 0x80, 0xb0, 0x80, 0xca, 0x22, - 0x4b, 0x0f, 0xce, 0x98, 0x1d, 0xd8, 0x2a, 0xd3, 0xa1, 0xc6, 0x4f, 0xab, 0x35, 0x8a, 0xd1, 0x2e, - 0xbb, 0x08, 0x24, 0x52, 0xde, 0x28, 0x95, 0x54, 0x85, 0x6c, 0xc3, 0x85, 0x08, 0xbc, 0x68, 0x36, - 0x9a, 0x6a, 0x6a, 0x2b, 0x95, 0x55, 0xc8, 0xa5, 0x58, 0xe1, 0xbe, 0x61, 0x34, 0xd5, 0x34, 0x1d, - 0xa2, 0x48, 0x81, 0x58, 0x12, 0x8c, 0x3c, 0x93, 0xff, 0x86, 0x02, 0x17, 0x59, 0x33, 0xc5, 0xfa, - 0xf2, 0x9b, 0x7a, 0x19, 0x36, 0x79, 0x98, 0xf8, 0xa4, 0x86, 0x6e, 0x80, 0x1a, 0x2a, 0x65, 0xcd, - 0x7c, 0x09, 0xd6, 0x43, 0x50, 0x6c, 0x47, 0x8a, 0xee, 0x1e, 0x21, 0xf0, 0xae, 0x61, 0xb5, 0x6c, - 0xa3, 0x54, 0x6a, 0x98, 0x2d, 0xd6, 0x90, 0x74, 0x5e, 0x83, 0xf5, 0x82, 0x33, 0x1a, 0x53, 0xd1, - 0xab, 0xef, 0xb9, 0x83, 0x3e, 0x36, 0x61, 0x05, 0x96, 0x8c, 0xcf, 0xb5, 0x8c, 0xba, 0x55, 0x69, - 0xd4, 0xd5, 0xb9, 0xfc, 0xe5, 0x08, 0x8e, 0x58, 0xc7, 0x96, 0x55, 0x56, 0xe7, 0xf2, 0x1d, 0x58, - 0x11, 0x06, 0xe8, 0x6c, 0x56, 0xec, 0xc0, 0x96, 0x98, 0x6b, 0xb8, 0xa3, 0x44, 0x3f, 0x61, 0x13, - 0x36, 0xe2, 0xe5, 0x46, 0x4b, 0x55, 0xe8, 0x28, 0x44, 0x4a, 0x28, 0x3c, 0x95, 0xff, 0x0d, 0x05, - 0x56, 0xfc, 0x4b, 0x13, 0x54, 0xd3, 0x5e, 0x81, 0xed, 0x5a, 0x49, 0xb7, 0x8b, 0xc6, 0x41, 0xa5, - 0x60, 0xd8, 0xfb, 0x95, 0x7a, 0x31, 0xf2, 0x92, 0x97, 0xe1, 0xa5, 0x04, 0x04, 0x7c, 0xcb, 0x26, - 0x6c, 0x44, 0x8b, 0x5a, 0x74, 0xa9, 0xa6, 0x68, 0xd7, 0x47, 0x4b, 0xfc, 0x75, 0x9a, 0xce, 0xff, - 0x89, 0x02, 0x9b, 0xad, 0xd1, 0xc4, 0x1b, 0x3b, 0x5d, 0x7e, 0x7d, 0xc3, 0xf2, 0xe3, 0x60, 0x00, - 0xe9, 0x3c, 0xdc, 0x6c, 0x99, 0x6d, 0xab, 0x65, 0x14, 0x05, 0x39, 0x9d, 0xb4, 0x15, 0xd3, 0xa8, - 0x19, 0xf5, 0x56, 0xa4, 0x6d, 0x77, 0xe0, 0x03, 0x33, 0x70, 0xeb, 0x8d, 0x96, 0x78, 0xa6, 0x6b, - 0xf5, 0x03, 0x70, 0x6d, 0x06, 0xb2, 0x8f, 0x98, 0xca, 0x1f, 0xc0, 0xaa, 0xa5, 0xd7, 0xaa, 0xa5, - 0xc1, 0xe8, 0xc8, 0xd1, 0x27, 0xe3, 0xd3, 0x3e, 0xd9, 0x86, 0x4b, 0xa5, 0x86, 0x59, 0x30, 0x6c, - 0xfc, 0x82, 0x48, 0x23, 0x2e, 0xc0, 0x9a, 0x5c, 0xf8, 0xd0, 0xa0, 0xab, 0x8b, 0xc0, 0xaa, 0x0c, - 0xac, 0x37, 0xd4, 0x54, 0xfe, 0x0b, 0xb0, 0x1c, 0xca, 0x25, 0x78, 0x09, 0x2e, 0xc8, 0xcf, 0x4d, - 0xa7, 0xdf, 0x75, 0xfb, 0x27, 0xea, 0x5c, 0xb4, 0xc0, 0x9c, 0xf4, 0xfb, 0xb4, 0x00, 0xb7, 0x1b, - 0xb9, 0xa0, 0xe5, 0x8c, 0xce, 0xdc, 0x7e, 0x67, 0xec, 0x74, 0xd5, 0x54, 0xfe, 0x75, 0x58, 0x09, - 0x45, 0x30, 0xa7, 0xf3, 0xaa, 0xda, 0xe0, 0xe7, 0x43, 0xcd, 0x28, 0x56, 0xda, 0x35, 0x75, 0x9e, - 0x6e, 0x34, 0xe5, 0xca, 0x5e, 0x59, 0x85, 0xfc, 0xb7, 0x15, 0x2a, 0x06, 0x61, 0xbf, 0xd7, 0x4a, - 0xba, 0x98, 0x89, 0x74, 0x15, 0xb0, 0xbc, 0x08, 0x86, 0x65, 0x31, 0x2b, 0x8b, 0xcb, 0xb0, 0xc9, - 0x1f, 0x6c, 0xbd, 0x5e, 0xb4, 0xcb, 0xba, 0x59, 0x3c, 0xd4, 0x4d, 0xba, 0x34, 0x1e, 0xaa, 0x29, - 0x5c, 0xef, 0x12, 0xc4, 0x6e, 0x35, 0xda, 0x85, 0xb2, 0x9a, 0xa6, 0xcb, 0x2b, 0x04, 0x6f, 0x56, - 0xea, 0x6a, 0x06, 0x77, 0x8f, 0x18, 0x36, 0x56, 0x4b, 0xcb, 0xe7, 0xf3, 0xef, 0x29, 0x70, 0xc9, - 0x72, 0x4f, 0xfa, 0x9d, 0xf1, 0x64, 0xe4, 0xe8, 0xbd, 0x93, 0xc1, 0xc8, 0x1d, 0x9f, 0x9e, 0x59, - 0x13, 0x77, 0xec, 0x90, 0xdb, 0x70, 0xc3, 0xaa, 0xec, 0xd5, 0xf5, 0x16, 0x5d, 0xfd, 0x7a, 0x75, - 0xaf, 0x61, 0x56, 0x5a, 0xe5, 0x9a, 0x6d, 0xb5, 0x2b, 0xb1, 0x85, 0x71, 0x1d, 0x5e, 0x9d, 0x8e, - 0x5a, 0x35, 0xf6, 0xf4, 0xc2, 0x43, 0x55, 0x99, 0x5d, 0xe1, 0xae, 0x5e, 0xd5, 0xeb, 0x05, 0xa3, - 0x68, 0x1f, 0xdc, 0x55, 0x53, 0xe4, 0x06, 0x5c, 0x9d, 0x8e, 0x5a, 0xaa, 0x34, 0x2d, 0x8a, 0x96, - 0x9e, 0xfd, 0xde, 0xb2, 0x55, 0xa3, 0x58, 0x99, 0xfc, 0x1f, 0x2b, 0xb0, 0x39, 0x2d, 0x8c, 0x15, - 0xb9, 0x09, 0x9a, 0x51, 0x6f, 0x99, 0x7a, 0xa5, 0x68, 0x17, 0x4c, 0xa3, 0x68, 0xd4, 0x5b, 0x15, - 0xbd, 0x6a, 0xd9, 0x56, 0xa3, 0x4d, 0x67, 0x53, 0x60, 0x0c, 0x73, 0x0d, 0xae, 0xcc, 0xc0, 0x6b, - 0x54, 0x8a, 0x05, 0x55, 0x21, 0x77, 0xe1, 0xb5, 0x19, 0x48, 0xd6, 0x43, 0xab, 0x65, 0xd4, 0xe4, - 0x12, 0x35, 0x95, 0x2f, 0xc0, 0xd6, 0xf4, 0x38, 0x37, 0xf4, 0x14, 0x09, 0xf7, 0x74, 0x16, 0x32, - 0x45, 0x7a, 0x70, 0x85, 0xd2, 0x67, 0xe4, 0x5d, 0x50, 0xa3, 0xa1, 0x2a, 0x62, 0x56, 0x4b, 0x66, - 0xbb, 0x5e, 0x67, 0xa7, 0xdc, 0x1a, 0xe4, 0x1a, 0xad, 0xb2, 0x61, 0xf2, 0x04, 0x24, 0x98, 0x71, - 0xa4, 0x5d, 0xa7, 0x0b, 0xa7, 0x61, 0x56, 0x3e, 0x8f, 0xc7, 0xdd, 0x26, 0x6c, 0x58, 0x55, 0xbd, - 0xb0, 0x8f, 0x6b, 0xba, 0x52, 0xb7, 0x0b, 0x65, 0xbd, 0x5e, 0x37, 0xaa, 0x2a, 0x60, 0x67, 0x4e, - 0x73, 0x4f, 0x25, 0x1f, 0x84, 0x5b, 0x8d, 0xfd, 0x96, 0x6e, 0x37, 0xab, 0xed, 0xbd, 0x4a, 0xdd, - 0xb6, 0x1e, 0xd6, 0x0b, 0x82, 0x35, 0x2b, 0xc4, 0x4f, 0x84, 0x5b, 0x70, 0x7d, 0x26, 0x76, 0x90, - 0x2a, 0xe4, 0x26, 0x68, 0x33, 0x31, 0xf9, 0x87, 0xe4, 0x7f, 0xa8, 0xc0, 0xf6, 0x8c, 0x2b, 0x6e, - 0xf2, 0x1a, 0xdc, 0x2e, 0x1b, 0x7a, 0xb1, 0x6a, 0x58, 0x16, 0x6e, 0x14, 0x74, 0x18, 0x98, 0x75, - 0x53, 0xe2, 0x7e, 0x7f, 0x1b, 0x6e, 0xcc, 0x46, 0x0f, 0x38, 0x87, 0x5b, 0x70, 0x7d, 0x36, 0x2a, - 0xe7, 0x24, 0x52, 0x74, 0xbf, 0x9d, 0x8d, 0xe9, 0x73, 0x20, 0xe9, 0xfc, 0xef, 0x28, 0x70, 0x31, - 0x59, 0xcf, 0x44, 0xdb, 0x56, 0xa9, 0x5b, 0x2d, 0xbd, 0x5a, 0xb5, 0x9b, 0xba, 0xa9, 0xd7, 0x6c, - 0xa3, 0x6e, 0x36, 0xaa, 0xd5, 0xa4, 0x93, 0xf7, 0x3a, 0xbc, 0x3a, 0x1d, 0xd5, 0x2a, 0x98, 0x95, - 0x26, 0x3d, 0x5c, 0x34, 0xd8, 0x99, 0x8e, 0x65, 0x54, 0x0a, 0x86, 0x9a, 0xda, 0x7d, 0xeb, 0xfb, - 0xff, 0xb2, 0x33, 0xf7, 0xfd, 0xf7, 0x76, 0x94, 0x1f, 0xbd, 0xb7, 0xa3, 0xfc, 0xf3, 0x7b, 0x3b, - 0xca, 0xe7, 0xef, 0x9c, 0x2f, 0xcb, 0x16, 0x8a, 0x25, 0x8f, 0x16, 0x50, 0x80, 0x7a, 0xe3, 0x7f, - 0x02, 0x00, 0x00, 0xff, 0xff, 0xbc, 0xb9, 0x65, 0xe7, 0x39, 0xb3, 0x01, 0x00, + 0xf1, 0xff, 0xb1, 0xf7, 0x35, 0x31, 0x6e, 0x24, 0xd7, 0xc1, 0xd3, 0x24, 0x67, 0xc4, 0x79, 0x9c, + 0x9f, 0x9e, 0x92, 0x56, 0x9a, 0x9d, 0xd1, 0x4a, 0xab, 0x96, 0x56, 0x96, 0xb8, 0xde, 0xb5, 0xa5, + 0xfd, 0xec, 0xf5, 0xfa, 0xbf, 0x87, 0x6c, 0x0e, 0x29, 0xf1, 0xcf, 0xdd, 0xe4, 0x8c, 0xe5, 0xb5, + 0xdd, 0x5f, 0x8b, 0xec, 0x99, 0xe9, 0x98, 0x43, 0xd2, 0x6c, 0x72, 0xd7, 0x32, 0x02, 0x24, 0x46, + 0x00, 0x1b, 0xc8, 0x9f, 0x13, 0x27, 0x40, 0x8c, 0x20, 0x40, 0x0e, 0x31, 0x82, 0x1c, 0x7c, 0x0d, + 0x12, 0x24, 0xb9, 0xf8, 0x66, 0xc0, 0x30, 0x60, 0x20, 0x37, 0x07, 0x58, 0x24, 0x0b, 0x24, 0x07, + 0x27, 0xb7, 0x20, 0x39, 0xf8, 0x14, 0xd4, 0xab, 0xaa, 0xee, 0xea, 0x1f, 0x52, 0x33, 0xd6, 0x3a, + 0xb1, 0x01, 0x9f, 0xc8, 0x7e, 0xf5, 0x5e, 0x75, 0x75, 0xfd, 0xbe, 0xf7, 0xea, 0xfd, 0x50, 0xfc, + 0xa0, 0xd6, 0x8b, 0x4e, 0x12, 0xc8, 0xbf, 0xe1, 0x6b, 0x19, 0xb1, 0xd4, 0x53, 0x9a, 0x93, 0x32, + 0xad, 0x95, 0xb4, 0x69, 0x7d, 0xf6, 0x35, 0xd5, 0x04, 0x22, 0x6f, 0x56, 0x4c, 0xeb, 0xc9, 0x0d, + 0xaa, 0x04, 0x9f, 0xce, 0x1b, 0x22, 0x6d, 0x0d, 0x16, 0x4b, 0xa6, 0xb9, 0xd5, 0x8b, 0x83, 0xc8, + 0x2e, 0xac, 0x06, 0xf9, 0xaa, 0xf9, 0xc1, 0x91, 0x67, 0x80, 0x5a, 0x9f, 0xbc, 0x08, 0x6b, 0x8c, + 0x25, 0x8f, 0xac, 0x39, 0x40, 0x98, 0x4e, 0x17, 0x9e, 0xe8, 0x03, 0x05, 0x5e, 0x7c, 0x5a, 0x1f, + 0x92, 0x43, 0xb8, 0x8c, 0x66, 0x1d, 0xfe, 0x28, 0x18, 0x06, 0xbb, 0xe7, 0xf4, 0x4e, 0x5c, 0x3e, + 0x6b, 0xb5, 0xd4, 0xc1, 0x18, 0x8f, 0x2d, 0xab, 0x25, 0x8d, 0xc3, 0x78, 0x6c, 0xf9, 0x23, 0xf1, + 0x5c, 0xa2, 0xe4, 0xbc, 0x0d, 0x7d, 0xd8, 0x5d, 0x40, 0x29, 0x6d, 0x1c, 0x8a, 0xbc, 0x71, 0xdc, + 0x01, 0xf5, 0xc8, 0xed, 0x53, 0x9e, 0xd8, 0xed, 0x63, 0xd3, 0xde, 0xba, 0xcf, 0x32, 0xb4, 0x9b, + 0x1b, 0x01, 0xdc, 0xf2, 0x47, 0x07, 0xf7, 0xf9, 0x5b, 0x4e, 0xc5, 0x91, 0x27, 0x8b, 0x15, 0xe4, + 0x55, 0xb8, 0x18, 0x0b, 0x38, 0x12, 0x7a, 0xb0, 0x9b, 0x5b, 0xb4, 0x28, 0x1a, 0x9e, 0xea, 0x06, + 0xac, 0x89, 0x59, 0x31, 0x09, 0xfc, 0xe0, 0xcc, 0x02, 0x87, 0xd1, 0x55, 0xc7, 0x5f, 0x37, 0x13, + 0x1f, 0x95, 0x2a, 0x91, 0x9c, 0x81, 0x97, 0x26, 0xaf, 0x00, 0x09, 0xf8, 0xf6, 0x60, 0xa3, 0xe0, + 0x2f, 0xdc, 0x12, 0x25, 0xc1, 0x0a, 0xe7, 0xaf, 0xfd, 0x87, 0x0c, 0x5c, 0x4c, 0x11, 0x65, 0xa8, + 0x10, 0xe0, 0x0d, 0xa7, 0xee, 0x31, 0x13, 0x21, 0xe4, 0x8f, 0xdc, 0x94, 0xe0, 0x5c, 0x3f, 0xb5, + 0xc2, 0x32, 0x90, 0xf3, 0x77, 0xf1, 0x27, 0xba, 0x79, 0x38, 0x13, 0xa1, 0x7a, 0xa1, 0x7f, 0x49, + 0x0d, 0xb6, 0x30, 0xad, 0x82, 0xef, 0x8d, 0x30, 0x3b, 0x03, 0x32, 0x21, 0xb9, 0x88, 0xb0, 0x83, + 0xad, 0x68, 0x4b, 0x48, 0x94, 0x0b, 0x31, 0xd5, 0x71, 0x0c, 0x42, 0x3e, 0x06, 0x3b, 0xd2, 0x59, + 0x63, 0xc7, 0x56, 0x1e, 0x5a, 0xba, 0x9b, 0x57, 0x9c, 0xe0, 0xd4, 0x29, 0x47, 0xd6, 0xe0, 0x1e, + 0x5c, 0xc3, 0x41, 0xf4, 0xfa, 0x63, 0x3b, 0x91, 0x87, 0x03, 0x3f, 0x95, 0x05, 0xae, 0xdf, 0xa1, + 0x58, 0xb5, 0xfe, 0x38, 0x96, 0x92, 0x83, 0x7e, 0x35, 0xef, 0xbe, 0x37, 0xe1, 0xb9, 0xd4, 0x16, + 0xd3, 0x03, 0x06, 0x0d, 0xa9, 0x42, 0xde, 0xe8, 0x02, 0x7d, 0xa6, 0xcc, 0xd1, 0x0d, 0x58, 0x7b, + 0xec, 0x3a, 0x13, 0x77, 0xc2, 0x4f, 0x6e, 0x3e, 0x25, 0x18, 0x4c, 0x3e, 0xb8, 0xfb, 0xd1, 0xa1, + 0xe1, 0x3a, 0x23, 0xd2, 0x80, 0x8b, 0xec, 0x04, 0xf4, 0x4e, 0x91, 0x19, 0xe4, 0x7a, 0x26, 0x25, + 0xc2, 0x0e, 0x21, 0x09, 0x1e, 0x4d, 0x35, 0xc4, 0x62, 0xd4, 0xe6, 0xd6, 0x71, 0x1c, 0x44, 0x57, + 0xf4, 0xe5, 0x74, 0x6c, 0xb2, 0x07, 0x05, 0x56, 0x39, 0x13, 0x0b, 0xd8, 0x05, 0xc1, 0x8d, 0x85, + 0x6f, 0x28, 0xa1, 0x7d, 0xb1, 0x1f, 0xfc, 0xa7, 0xe7, 0x35, 0xde, 0xc5, 0xda, 0xa7, 0xf2, 0xfd, + 0x87, 0xb9, 0x86, 0x40, 0x7e, 0xef, 0xa1, 0xfd, 0xa3, 0x22, 0x3e, 0x35, 0x22, 0x1c, 0xd3, 0xa9, + 0xe5, 0xbb, 0x43, 0x71, 0x07, 0xb4, 0x6a, 0xf2, 0xa7, 0x73, 0x4e, 0x75, 0xf2, 0x3a, 0xac, 0xd1, + 0x6a, 0x8f, 0x67, 0x43, 0x36, 0xe5, 0xb2, 0x91, 0x40, 0x3b, 0x0d, 0x56, 0x44, 0x87, 0xad, 0xba, + 0x64, 0x16, 0x4e, 0xc3, 0x47, 0xca, 0x2d, 0xfb, 0xa7, 0xd3, 0xb1, 0x3c, 0x51, 0x85, 0xa2, 0xd0, + 0x6a, 0x74, 0xda, 0x9c, 0x24, 0x4f, 0x71, 0x42, 0x6e, 0x79, 0x6f, 0x85, 0xa9, 0x0a, 0xb5, 0x97, + 0xa1, 0x20, 0xd5, 0x4d, 0x3f, 0x86, 0x79, 0xce, 0x88, 0x8f, 0x61, 0x4f, 0x7c, 0xb0, 0x1f, 0x43, + 0x5e, 0x54, 0x49, 0xc5, 0x82, 0x93, 0x91, 0x2f, 0x16, 0x39, 0xfe, 0xa7, 0x30, 0xda, 0xcb, 0xf8, + 0x91, 0xcb, 0x26, 0xfe, 0xc7, 0xb3, 0x64, 0xea, 0x50, 0x79, 0x60, 0xe0, 0xdb, 0x63, 0xb4, 0xc0, + 0x0a, 0x98, 0x67, 0x0a, 0xef, 0x0c, 0x7c, 0x66, 0x97, 0xc5, 0xdf, 0xf1, 0xb7, 0xc1, 0x21, 0x1c, + 0xd3, 0x26, 0xcc, 0xdb, 0x33, 0x23, 0x47, 0x46, 0x26, 0x79, 0x64, 0xb0, 0x00, 0x2a, 0x9c, 0x92, + 0xbd, 0x19, 0x10, 0x86, 0x47, 0x86, 0xb4, 0x33, 0xe4, 0x22, 0x3b, 0x83, 0x24, 0x93, 0x87, 0xa3, + 0xc7, 0x4e, 0x1c, 0x21, 0x93, 0xc7, 0xf7, 0xa9, 0xbf, 0xcc, 0x08, 0x15, 0xc1, 0xde, 0x68, 0x34, + 0xf5, 0xa7, 0x13, 0x67, 0x1c, 0x51, 0x85, 0x92, 0x53, 0x78, 0x1e, 0x39, 0xe8, 0xfb, 0x98, 0xc2, + 0x62, 0x34, 0x11, 0x31, 0x3b, 0x82, 0x99, 0x5b, 0xb8, 0xff, 0x81, 0x28, 0x8f, 0xaf, 0x53, 0x6c, + 0x5d, 0x46, 0xa6, 0x13, 0x56, 0xaa, 0xb5, 0xba, 0x64, 0x5e, 0x61, 0x75, 0x26, 0xb0, 0x48, 0x35, + 0x65, 0x11, 0xc7, 0x75, 0xa1, 0x7b, 0xe1, 0x8a, 0x8e, 0xd6, 0x2a, 0xaf, 0x75, 0xf2, 0x49, 0x58, + 0xf5, 0xfa, 0x72, 0xa6, 0xc6, 0xb8, 0x16, 0xae, 0xd6, 0x67, 0xd1, 0xa2, 0xc3, 0x3a, 0xe8, 0x9c, + 0xf3, 0x38, 0x74, 0x6f, 0x3d, 0xa2, 0x34, 0xd6, 0xf6, 0x84, 0x34, 0x9a, 0x24, 0x23, 0x1b, 0x90, + 0x09, 0x46, 0x38, 0xe3, 0xf5, 0xd9, 0xf2, 0x0a, 0xe3, 0x55, 0x9b, 0xfc, 0x49, 0xfb, 0x75, 0xb8, + 0x73, 0xd6, 0x3e, 0xa2, 0x4b, 0x71, 0x4e, 0x87, 0xaf, 0x9a, 0x5b, 0x4e, 0xa2, 0xdf, 0x6e, 0x80, + 0x1c, 0x6e, 0xd7, 0x13, 0x9b, 0x9f, 0x80, 0x75, 0x27, 0x9e, 0xf6, 0x37, 0x59, 0xd8, 0x88, 0xaa, + 0xc9, 0xc9, 0xcb, 0x90, 0x93, 0x76, 0xa0, 0x2b, 0x29, 0xba, 0x74, 0xdc, 0x77, 0x10, 0xe9, 0x4c, + 0x3b, 0x0e, 0x79, 0x00, 0x1b, 0x68, 0xb8, 0x87, 0xac, 0xe7, 0xd4, 0xe3, 0x97, 0x2f, 0x8b, 0xef, + 0xcf, 0xf2, 0xdf, 0x7f, 0xe7, 0xfa, 0x12, 0x5e, 0x95, 0xad, 0x51, 0x5a, 0xca, 0xfd, 0xd1, 0x42, + 0x49, 0x0b, 0x9a, 0x9b, 0xaf, 0x05, 0xe5, 0x9f, 0x32, 0x47, 0x0b, 0xba, 0xbc, 0x40, 0x0b, 0x1a, + 0x52, 0xca, 0x5a, 0x50, 0xd4, 0x85, 0x5f, 0x98, 0xa7, 0x0b, 0x0f, 0x69, 0x98, 0x2e, 0x3c, 0xd4, + 0x62, 0xe6, 0xe7, 0x6a, 0x31, 0x43, 0x1a, 0xae, 0xc5, 0xbc, 0xc5, 0xfb, 0x68, 0xe2, 0xbc, 0x6d, + 0x63, 0xe7, 0xf1, 0x63, 0x11, 0xbf, 0xde, 0x74, 0xde, 0x46, 0xe3, 0x9a, 0xbd, 0x55, 0x10, 0x16, + 0x39, 0xda, 0x1f, 0x29, 0x31, 0x4d, 0xa0, 0x18, 0xbf, 0x97, 0x60, 0x83, 0x1d, 0x56, 0x6e, 0x5f, + 0x92, 0x35, 0xd7, 0xcd, 0x75, 0x01, 0x65, 0xf2, 0xe6, 0xfb, 0x60, 0x33, 0x40, 0xe3, 0x22, 0x17, + 0x7a, 0xea, 0x99, 0x01, 0x35, 0x0f, 0x3b, 0xf3, 0x32, 0x6c, 0x05, 0x88, 0x5c, 0x9b, 0xc3, 0xc4, + 0xcd, 0x75, 0x53, 0x15, 0x05, 0x6d, 0x0e, 0xd7, 0x8e, 0xe3, 0x92, 0xc7, 0xcf, 0xa9, 0x55, 0xda, + 0xf7, 0xb2, 0x11, 0x2d, 0x89, 0x78, 0x0d, 0x3d, 0x45, 0xfd, 0x91, 0xcd, 0x3b, 0x89, 0xef, 0x45, + 0x37, 0xe6, 0x8c, 0x19, 0xb7, 0x69, 0xb2, 0xac, 0x96, 0x09, 0xbe, 0x3f, 0x12, 0x26, 0x4e, 0x36, + 0xe3, 0xa8, 0xd9, 0xb9, 0x8f, 0x73, 0x56, 0x54, 0xc7, 0x36, 0x9e, 0xe2, 0xe2, 0xea, 0x84, 0x98, + 0x4a, 0xa7, 0x2c, 0x72, 0xd6, 0xc1, 0x93, 0x78, 0x41, 0x17, 0x50, 0xa9, 0xe8, 0x47, 0x2b, 0xcf, + 0xa6, 0xc8, 0x4e, 0x89, 0xca, 0xb1, 0x97, 0xb0, 0x66, 0x75, 0x26, 0xfe, 0x8a, 0x6a, 0x0d, 0x58, + 0x43, 0x1d, 0x85, 0xa8, 0x30, 0x97, 0xa2, 0x82, 0x4f, 0x7e, 0x7c, 0xa9, 0xd6, 0x30, 0x0b, 0x94, + 0x4e, 0x54, 0x73, 0x02, 0xcf, 0xcb, 0x9a, 0x85, 0x68, 0x23, 0x97, 0x45, 0x14, 0xdd, 0x85, 0x3d, + 0x10, 0x2a, 0x20, 0xb0, 0xa9, 0x97, 0x9d, 0x28, 0x80, 0xa3, 0x69, 0x27, 0xb0, 0x33, 0x7f, 0x48, + 0x16, 0x64, 0x68, 0x0a, 0x0f, 0xd0, 0x8c, 0x7c, 0x80, 0xca, 0x7a, 0x86, 0x6c, 0x44, 0xcf, 0xa0, + 0xfd, 0x45, 0x16, 0x6e, 0x9e, 0x61, 0xb8, 0x16, 0xbc, 0xf3, 0xd3, 0x51, 0xf6, 0x2c, 0x13, 0x91, + 0x0c, 0x69, 0xa5, 0x7c, 0x83, 0xa4, 0x52, 0x6a, 0x3a, 0x73, 0xf6, 0xff, 0x61, 0x93, 0xed, 0x82, + 0xcc, 0x2c, 0xf1, 0x68, 0x36, 0x38, 0xc3, 0x36, 0xb8, 0x2b, 0x7c, 0xa8, 0x62, 0xa4, 0xb8, 0x33, + 0xe2, 0x8e, 0x61, 0x05, 0x30, 0xd2, 0x81, 0x02, 0xa2, 0x1d, 0x39, 0xde, 0xe0, 0x4c, 0xce, 0x3c, + 0xc2, 0x43, 0x4b, 0x26, 0x63, 0xd6, 0xd4, 0x14, 0x50, 0xc1, 0x67, 0x72, 0x1b, 0x36, 0x87, 0xb3, + 0x53, 0xca, 0x78, 0xb0, 0xb9, 0xc0, 0xad, 0x3f, 0x96, 0xcd, 0xf5, 0xe1, 0xec, 0x54, 0x1f, 0x8f, + 0x71, 0x48, 0xd1, 0x4c, 0x64, 0x8b, 0xe2, 0xb1, 0x55, 0x2b, 0x30, 0x57, 0x10, 0x93, 0x56, 0xc0, + 0xd6, 0x2d, 0xc7, 0xbd, 0x04, 0xcc, 0x68, 0x90, 0x67, 0xa8, 0x62, 0x0f, 0xda, 0x7f, 0x67, 0x84, + 0xbc, 0x3b, 0x7f, 0xde, 0xff, 0x6a, 0x88, 0x52, 0x86, 0xe8, 0x0e, 0xa8, 0xb4, 0xeb, 0xc3, 0x4d, + 0x25, 0x18, 0xa3, 0x8d, 0xe1, 0xec, 0x34, 0xe8, 0x3b, 0xb9, 0xe3, 0x57, 0xe4, 0x8e, 0x7f, 0x5d, + 0xc8, 0xc3, 0xa9, 0xdb, 0xc3, 0xfc, 0x2e, 0xd7, 0xfe, 0x23, 0x0b, 0xb7, 0xcf, 0xb6, 0x09, 0xfc, + 0x6a, 0xdc, 0x52, 0xc6, 0x2d, 0xa6, 0x3a, 0x5d, 0x4e, 0xa8, 0x4e, 0x53, 0xd6, 0xde, 0x4a, 0xda, + 0xda, 0x4b, 0x28, 0x6a, 0x2f, 0xa4, 0x28, 0x6a, 0x53, 0x17, 0x68, 0xfe, 0x29, 0x0b, 0x74, 0x55, + 0x9e, 0x27, 0xff, 0x16, 0x28, 0x30, 0xa2, 0xf2, 0xc0, 0x9b, 0x70, 0x51, 0xc8, 0x03, 0xec, 0xe4, + 0x08, 0xf5, 0xef, 0x85, 0xfb, 0x77, 0xd3, 0x24, 0x01, 0x44, 0x4b, 0xe1, 0xd6, 0xb7, 0xb8, 0x0c, + 0x10, 0x96, 0xff, 0xe2, 0x70, 0xff, 0xe4, 0x11, 0x5c, 0xc6, 0xf8, 0xee, 0x3d, 0xf9, 0xe6, 0xc0, + 0x9e, 0xb8, 0x47, 0x7c, 0x3e, 0xdc, 0x48, 0xf0, 0xca, 0x5e, 0x4f, 0x6a, 0x8e, 0xe9, 0x1e, 0x55, + 0x97, 0xcc, 0x4b, 0x7e, 0x0a, 0x3c, 0x2e, 0x58, 0x7c, 0x57, 0x01, 0xed, 0xe9, 0xfd, 0x85, 0x8a, + 0xaa, 0x78, 0x87, 0xaf, 0x9a, 0x05, 0x47, 0xea, 0xbd, 0x9b, 0xb0, 0x3e, 0x71, 0x8f, 0x26, 0xae, + 0x7f, 0x12, 0xd1, 0x80, 0xac, 0x71, 0xa0, 0xe8, 0x18, 0x11, 0x65, 0xf2, 0x5c, 0x9c, 0xb9, 0x20, + 0xd2, 0x2a, 0x81, 0xbc, 0x98, 0x3a, 0x0e, 0x74, 0x36, 0xc9, 0x0d, 0x64, 0x0f, 0x0f, 0x72, 0xf9, + 0x8c, 0x9a, 0x35, 0x79, 0x2c, 0xcc, 0x23, 0x6f, 0xe0, 0x6a, 0x7f, 0xa7, 0x08, 0x8e, 0x20, 0xad, + 0xf3, 0xc8, 0x9b, 0x92, 0x31, 0x6f, 0x36, 0xc1, 0x86, 0xa4, 0x91, 0xc8, 0x76, 0x8f, 0x3c, 0x3c, + 0x23, 0x02, 0x22, 0xe1, 0x19, 0x11, 0xf2, 0x0c, 0x16, 0x89, 0x5c, 0x6a, 0x7e, 0x43, 0x58, 0x04, + 0xd1, 0x3d, 0xef, 0xe0, 0x1e, 0xb9, 0x0b, 0x17, 0x98, 0x11, 0x90, 0x68, 0xee, 0x66, 0xa4, 0xb9, + 0x07, 0xf7, 0x4c, 0x51, 0xae, 0x7d, 0x3b, 0xb8, 0xd7, 0x4a, 0x7c, 0xc4, 0xc1, 0x3d, 0xf2, 0xfa, + 0xd9, 0x8c, 0x73, 0xf3, 0xc2, 0x38, 0x37, 0x30, 0xcc, 0xfd, 0x48, 0xc4, 0x30, 0xf7, 0xd6, 0xe2, + 0xde, 0xe2, 0xb7, 0x91, 0x2c, 0x1c, 0x61, 0x18, 0xa6, 0xea, 0xc7, 0x19, 0x78, 0x61, 0x21, 0x05, + 0xb9, 0x0a, 0x79, 0xbd, 0x5d, 0xeb, 0x84, 0xe3, 0x4b, 0xd7, 0x8c, 0x80, 0x90, 0x7d, 0x58, 0xdd, + 0x73, 0x7c, 0xaf, 0x47, 0xa7, 0x71, 0xea, 0xf5, 0x40, 0xa2, 0xda, 0x00, 0xbd, 0xba, 0x64, 0x86, + 0xb4, 0xc4, 0x86, 0x2d, 0x5c, 0x0b, 0x91, 0xd4, 0x4f, 0xd9, 0x14, 0x5d, 0x43, 0xa2, 0xc2, 0x04, + 0x19, 0xdd, 0x67, 0x12, 0x40, 0xf2, 0x18, 0x88, 0x65, 0x55, 0x4b, 0xee, 0x64, 0xca, 0x65, 0xf0, + 0xa9, 0x17, 0x58, 0x7a, 0x7e, 0xf0, 0x29, 0x7d, 0x97, 0xa0, 0xab, 0x2e, 0x99, 0x29, 0xb5, 0xc5, + 0x97, 0xf9, 0x5b, 0x82, 0xdf, 0x99, 0xdf, 0x09, 0xe7, 0x88, 0xdd, 0x7a, 0x07, 0xf2, 0x6d, 0x61, + 0x8b, 0x20, 0x59, 0xcc, 0x0b, 0xbb, 0x03, 0x33, 0x28, 0xd5, 0x7e, 0x57, 0x11, 0x4a, 0x87, 0xa7, + 0x77, 0x96, 0x94, 0x99, 0xab, 0xbf, 0x38, 0x33, 0x57, 0xff, 0x67, 0xcc, 0xcc, 0xa5, 0x79, 0x70, + 0xf7, 0xcc, 0x1d, 0x4b, 0x3e, 0x0e, 0x2a, 0x26, 0x31, 0x72, 0xa4, 0x41, 0x62, 0xeb, 0x6b, 0x2b, + 0x08, 0xe6, 0x5d, 0xe5, 0x99, 0xe2, 0xcc, 0xcd, 0x5e, 0x94, 0x5a, 0xfb, 0x2b, 0x1e, 0xc4, 0xbd, + 0xd6, 0x6f, 0xc7, 0x14, 0xcd, 0xcf, 0xea, 0x64, 0x61, 0x44, 0x16, 0xdb, 0x4d, 0x29, 0x89, 0x64, + 0xf2, 0x5d, 0xf3, 0x7d, 0x2d, 0xa4, 0x95, 0xf7, 0x27, 0x59, 0xb8, 0xba, 0x88, 0x3c, 0x35, 0x4d, + 0xb5, 0x72, 0xbe, 0x34, 0xd5, 0x77, 0x21, 0xcf, 0x60, 0x81, 0x07, 0x01, 0x8e, 0x2d, 0x27, 0xa5, + 0x63, 0x2b, 0x8a, 0xc9, 0x4d, 0x58, 0xd1, 0x4b, 0x56, 0x98, 0x39, 0x0d, 0x4d, 0x7d, 0x9d, 0x9e, + 0x8f, 0x46, 0xa4, 0xbc, 0x88, 0x7c, 0x31, 0x99, 0x2c, 0x90, 0xa7, 0x4c, 0xdb, 0x95, 0x3a, 0x24, + 0x91, 0x5f, 0x01, 0xdb, 0x1b, 0xe6, 0x03, 0xe0, 0x21, 0xb6, 0xcd, 0x64, 0xe2, 0x41, 0x0d, 0x56, + 0xda, 0x13, 0xd7, 0x77, 0xa7, 0xb2, 0x19, 0xee, 0x18, 0x21, 0x26, 0x2f, 0xe1, 0x46, 0xb2, 0xce, + 0x13, 0x16, 0x13, 0x61, 0x45, 0x8e, 0x53, 0x83, 0x56, 0xb5, 0x14, 0x6c, 0x4a, 0x28, 0x94, 0xa0, + 0xee, 0xcc, 0x86, 0xbd, 0x93, 0xae, 0x59, 0xe7, 0x9c, 0x13, 0x23, 0x18, 0x20, 0x94, 0x7e, 0xa0, + 0x6f, 0x4a, 0x28, 0xda, 0x37, 0x14, 0xb8, 0x94, 0xf6, 0x1d, 0xe4, 0x2a, 0xe4, 0x86, 0xa9, 0x79, + 0x11, 0x87, 0xcc, 0x95, 0xbb, 0x40, 0x7f, 0xed, 0xa3, 0xd1, 0xe4, 0xd4, 0x99, 0xca, 0xc6, 0xca, + 0x12, 0xd8, 0x04, 0xfa, 0x50, 0xc1, 0xff, 0xe4, 0xba, 0x38, 0x72, 0xb2, 0x89, 0x4c, 0x8a, 0xf8, + 0xa3, 0xe9, 0x00, 0xb5, 0x7e, 0xbb, 0x35, 0x66, 0xf1, 0xfd, 0x5f, 0x83, 0x1c, 0x6d, 0x56, 0x6c, + 0xf6, 0xd2, 0xf9, 0xa3, 0x37, 0xea, 0x1c, 0x89, 0xb5, 0xca, 0x77, 0x4e, 0x07, 0x26, 0x22, 0x6b, + 0x87, 0xb0, 0x11, 0xc5, 0x20, 0x46, 0x34, 0x22, 0x6c, 0xe1, 0xbe, 0xca, 0x6b, 0xda, 0x1b, 0x8d, + 0x98, 0xc3, 0xcc, 0xde, 0xf3, 0x3f, 0x7e, 0xe7, 0x3a, 0xd0, 0x47, 0x46, 0x93, 0x16, 0x31, 0x56, + 0xfb, 0x66, 0x06, 0x2e, 0x85, 0x3e, 0xfa, 0x62, 0x0d, 0xfd, 0xd2, 0x3a, 0x8c, 0xea, 0x11, 0x87, + 0x46, 0xc1, 0x37, 0x26, 0x3f, 0x70, 0x81, 0x1f, 0xd5, 0x3e, 0x6c, 0xcf, 0xc3, 0x27, 0x2f, 0xc3, + 0x2a, 0x86, 0x75, 0x1a, 0x3b, 0x3d, 0x57, 0xde, 0x66, 0x87, 0x02, 0x68, 0x86, 0xe5, 0xda, 0x0f, + 0x15, 0xd8, 0xe1, 0x6e, 0x1e, 0x0d, 0xc7, 0x1b, 0xe2, 0x2d, 0x41, 0xcf, 0x7d, 0x6f, 0x1c, 0x9e, + 0xf7, 0x23, 0xfb, 0xd8, 0x4b, 0x51, 0x6f, 0x9e, 0xc4, 0xdb, 0xe6, 0x7f, 0x2d, 0xb9, 0x8b, 0xa1, + 0xca, 0xf8, 0x2d, 0x7a, 0x8e, 0x05, 0x98, 0x18, 0x52, 0x80, 0x1c, 0x60, 0x02, 0x31, 0xb4, 0xdf, + 0x80, 0x6b, 0x8b, 0x5f, 0x40, 0xbe, 0x00, 0xeb, 0x98, 0xfb, 0xaa, 0x3b, 0x3e, 0x9e, 0x38, 0x7d, + 0x57, 0x68, 0xf6, 0x84, 0x36, 0x56, 0x2e, 0x63, 0x91, 0xd7, 0x78, 0xc0, 0x83, 0x63, 0xcc, 0xaa, + 0xc5, 0x89, 0x22, 0xbe, 0x54, 0x72, 0x6d, 0xda, 0x6f, 0x2a, 0x40, 0x92, 0x75, 0x90, 0x0f, 0xc3, + 0x5a, 0xb7, 0x53, 0xb2, 0xa6, 0xce, 0x64, 0x5a, 0x1d, 0xcd, 0x26, 0x3c, 0xec, 0x19, 0xf3, 0x7f, + 0x9f, 0xf6, 0x6c, 0x76, 0x1f, 0x74, 0x32, 0x9a, 0x4d, 0xcc, 0x08, 0x1e, 0x26, 0x6d, 0x72, 0xdd, + 0x2f, 0xf5, 0x9d, 0x27, 0xd1, 0xa4, 0x4d, 0x1c, 0x16, 0x49, 0xda, 0xc4, 0x61, 0xda, 0x77, 0x14, + 0xd8, 0x15, 0xc6, 0x91, 0xfd, 0x94, 0xb6, 0x94, 0x30, 0xca, 0xcb, 0x44, 0xc4, 0xd9, 0x5d, 0xc4, + 0xa1, 0x6f, 0x89, 0x40, 0x48, 0xd8, 0x40, 0x64, 0xd5, 0x19, 0x2d, 0xf9, 0x34, 0xe4, 0xac, 0xe9, + 0x68, 0x7c, 0x86, 0x48, 0x48, 0x6a, 0x30, 0xa2, 0xd3, 0xd1, 0x18, 0xab, 0x40, 0x4a, 0xcd, 0x85, + 0x4b, 0x72, 0xe3, 0x44, 0x8b, 0x49, 0x03, 0x2e, 0xf0, 0x90, 0x77, 0x31, 0xbb, 0x83, 0x05, 0xdf, + 0xb4, 0xb7, 0x29, 0xc2, 0x2d, 0xf1, 0x38, 0xaf, 0xa6, 0xa8, 0x43, 0xfb, 0x7d, 0x05, 0x0a, 0x94, + 0xb1, 0x41, 0xa1, 0xf4, 0x59, 0xa7, 0x74, 0x94, 0x0f, 0x16, 0x66, 0x34, 0x41, 0xf5, 0x67, 0x3a, + 0x8d, 0x3f, 0x04, 0x9b, 0x31, 0x02, 0xa2, 0x61, 0xa0, 0x8d, 0x81, 0xd7, 0x73, 0x58, 0x0e, 0x18, + 0x66, 0x82, 0x12, 0x81, 0x69, 0xbf, 0xad, 0xc0, 0xa5, 0xd6, 0x97, 0xa6, 0x0e, 0xbb, 0xb6, 0x35, + 0x67, 0x03, 0xb1, 0xde, 0x29, 0xb3, 0x26, 0xac, 0x6c, 0x59, 0x10, 0x00, 0xc6, 0xac, 0x71, 0x98, + 0x19, 0x94, 0x92, 0x2a, 0xe4, 0xf9, 0xf9, 0xe2, 0xf3, 0xf0, 0xac, 0xd7, 0x24, 0xdd, 0x48, 0x58, + 0x31, 0x47, 0xa2, 0x5f, 0x82, 0x5b, 0x18, 0xa7, 0x31, 0x03, 0x6a, 0xed, 0x3f, 0x15, 0xb8, 0x32, + 0x87, 0x86, 0x7c, 0x02, 0x96, 0xd1, 0x41, 0x91, 0x8f, 0xde, 0xd5, 0x39, 0xaf, 0x98, 0xf6, 0x4e, + 0x0e, 0xee, 0xb1, 0x83, 0xe8, 0x94, 0x3e, 0x98, 0x8c, 0x8a, 0xbc, 0x09, 0xab, 0x7a, 0xbf, 0xcf, + 0xa5, 0xb3, 0x4c, 0x44, 0x3a, 0x9b, 0xf3, 0xc6, 0x57, 0x03, 0x7c, 0x26, 0x9d, 0x31, 0x57, 0x99, + 0x7e, 0xdf, 0xe6, 0xce, 0x97, 0x61, 0x7d, 0x3b, 0x1f, 0x87, 0x8d, 0x28, 0xf2, 0xb9, 0xfc, 0xc5, + 0xbe, 0xad, 0x80, 0x1a, 0x6d, 0xc3, 0xcf, 0x27, 0x50, 0x54, 0xda, 0x30, 0x3f, 0x65, 0x52, 0xfd, + 0x61, 0x06, 0x9e, 0x4b, 0xed, 0x61, 0xf2, 0x0a, 0xac, 0xe8, 0xe3, 0x71, 0xad, 0xcc, 0x67, 0x15, + 0xe7, 0x90, 0x50, 0xe9, 0x1d, 0x11, 0x5e, 0x19, 0x12, 0x79, 0x0d, 0xf2, 0xcc, 0x3a, 0xa0, 0x2c, + 0x36, 0x1c, 0x8c, 0x7c, 0xc3, 0x4d, 0x17, 0xa2, 0x81, 0x52, 0x05, 0x22, 0xa9, 0xc0, 0x06, 0x8f, + 0x19, 0x63, 0xba, 0xc7, 0xee, 0x57, 0x82, 0x88, 0xfd, 0x98, 0x54, 0x40, 0x68, 0xd2, 0xed, 0x09, + 0x2b, 0x93, 0xa3, 0xa6, 0x44, 0xa9, 0x48, 0x1d, 0x54, 0xac, 0x53, 0xae, 0x89, 0x45, 0x6b, 0xc5, + 0x28, 0x3e, 0xac, 0x11, 0x73, 0xea, 0x4a, 0x50, 0x06, 0xc3, 0xa5, 0xfb, 0xbe, 0x77, 0x3c, 0x3c, + 0x75, 0x87, 0xd3, 0x9f, 0xdf, 0x70, 0x85, 0xef, 0x38, 0xd3, 0x70, 0xfd, 0x71, 0x8e, 0x2d, 0xe6, + 0x38, 0x19, 0xe5, 0x68, 0xa4, 0x00, 0xdd, 0xc8, 0xd1, 0x50, 0xf9, 0x8c, 0x47, 0x45, 0x29, 0xc3, + 0x05, 0x16, 0xad, 0x46, 0xac, 0x8c, 0x17, 0x52, 0x9b, 0xc0, 0x70, 0x0e, 0xee, 0x31, 0xf6, 0x85, + 0x79, 0x4a, 0xfa, 0xa6, 0x20, 0x25, 0x07, 0x50, 0x28, 0x0d, 0x5c, 0x67, 0x38, 0x1b, 0x77, 0xce, + 0x76, 0x83, 0xba, 0xcd, 0xbf, 0x65, 0xad, 0xc7, 0xc8, 0xf0, 0xe6, 0x15, 0x77, 0x72, 0xb9, 0x22, + 0xd2, 0x09, 0x9c, 0xa7, 0x72, 0xa8, 0x78, 0xfd, 0xe0, 0x82, 0xfe, 0x89, 0x03, 0x91, 0x2e, 0xea, + 0x19, 0xc8, 0xbd, 0xab, 0x6c, 0xd8, 0xa8, 0x3b, 0xfe, 0xb4, 0x33, 0x71, 0x86, 0x3e, 0x46, 0xb9, + 0x3c, 0x43, 0x14, 0xb0, 0x5d, 0x91, 0x41, 0x19, 0x55, 0xa6, 0xd3, 0x80, 0x94, 0x29, 0x64, 0xa3, + 0xd5, 0x51, 0x7e, 0xa9, 0xe2, 0x0d, 0x9d, 0x81, 0xf7, 0x55, 0xe1, 0x63, 0xca, 0xf8, 0xa5, 0x23, + 0x01, 0x34, 0xc3, 0x72, 0xed, 0xf3, 0x89, 0x71, 0x63, 0xad, 0x2c, 0xc0, 0x05, 0x1e, 0x81, 0x80, + 0x79, 0xe4, 0xb7, 0x8d, 0x66, 0xb9, 0xd6, 0xdc, 0x57, 0x15, 0xb2, 0x01, 0xd0, 0x36, 0x5b, 0x25, + 0xc3, 0xb2, 0xe8, 0x73, 0x86, 0x3e, 0x73, 0x77, 0xfd, 0x4a, 0xb7, 0xae, 0x66, 0x25, 0x8f, 0xfd, + 0x9c, 0xf6, 0x03, 0x05, 0x2e, 0xa7, 0x0f, 0x25, 0xe9, 0x00, 0xc6, 0x6c, 0xe0, 0x77, 0xe9, 0x1f, + 0x5e, 0x38, 0xee, 0xa9, 0xe0, 0x78, 0xec, 0x87, 0x29, 0x8b, 0x29, 0x90, 0x11, 0x77, 0x5f, 0xcc, + 0x49, 0xd1, 0xeb, 0x9b, 0x19, 0xaf, 0xaf, 0x95, 0x60, 0x7b, 0x5e, 0x1d, 0xd1, 0x4f, 0xdd, 0x84, + 0x82, 0xde, 0x6e, 0xd7, 0x6b, 0x25, 0xbd, 0x53, 0x6b, 0x35, 0x55, 0x85, 0xac, 0xc2, 0xf2, 0xbe, + 0xd9, 0xea, 0xb6, 0xd5, 0x8c, 0xf6, 0x2d, 0x05, 0xd6, 0x6b, 0xa1, 0xd5, 0xd9, 0xb3, 0x2e, 0xbe, + 0x8f, 0x46, 0x16, 0xdf, 0x76, 0x10, 0xdd, 0x24, 0x78, 0xc1, 0x99, 0x56, 0xde, 0xbb, 0x19, 0xd8, + 0x4a, 0xd0, 0x10, 0x0b, 0x2e, 0xe8, 0x87, 0x56, 0xab, 0x56, 0x2e, 0xf1, 0x96, 0x5d, 0x0f, 0xcd, + 0xa5, 0x30, 0x81, 0x55, 0xe2, 0x2d, 0xcc, 0x23, 0xf8, 0x6d, 0xdf, 0x1e, 0x79, 0x7d, 0x29, 0xf9, + 0x6c, 0x75, 0xc9, 0x14, 0x35, 0xe1, 0x49, 0xf6, 0xd5, 0xd9, 0xc4, 0xc5, 0x6a, 0x33, 0x11, 0xbd, + 0x6e, 0x00, 0x4f, 0x56, 0x8c, 0xfe, 0x1b, 0x0e, 0x2d, 0x4f, 0x56, 0x1d, 0xd6, 0x47, 0x9a, 0xb0, + 0xb2, 0xef, 0x4d, 0xab, 0xb3, 0xc7, 0x7c, 0xfd, 0x5e, 0x0b, 0xd3, 0x19, 0x55, 0x67, 0x8f, 0x93, + 0xd5, 0xa2, 0xca, 0x92, 0x45, 0xef, 0x89, 0x54, 0xc9, 0x6b, 0x89, 0x3b, 0x31, 0xe6, 0xce, 0xe5, + 0xc4, 0xb8, 0xb7, 0x0e, 0x05, 0x2e, 0x43, 0xa1, 0x78, 0xf2, 0x3d, 0x05, 0xb6, 0xe7, 0xf5, 0x1c, + 0x15, 0xcb, 0xa2, 0xc1, 0x0a, 0x2e, 0x07, 0xe9, 0x31, 0xa2, 0x51, 0x0a, 0x04, 0x1a, 0xf9, 0x14, + 0x14, 0x6a, 0xbe, 0x3f, 0x73, 0x27, 0xd6, 0x6b, 0x5d, 0xb3, 0xc6, 0xa7, 0xeb, 0x0b, 0x3f, 0x79, + 0xe7, 0xfa, 0x15, 0xf4, 0xf9, 0x98, 0xd8, 0xfe, 0x6b, 0xf6, 0x6c, 0xe2, 0x45, 0x52, 0x09, 0xc8, + 0x14, 0x94, 0x8b, 0x76, 0x66, 0x7d, 0xcf, 0x15, 0x32, 0x84, 0x70, 0xe8, 0xe6, 0x30, 0xf9, 0x4c, + 0x13, 0x30, 0xed, 0xeb, 0x0a, 0xec, 0xcc, 0x1f, 0x26, 0x7a, 0x4e, 0x76, 0x98, 0x49, 0x95, 0x70, + 0xa9, 0xc6, 0x73, 0x32, 0xb0, 0xbb, 0x92, 0xeb, 0x14, 0x88, 0x94, 0x28, 0x48, 0x4d, 0x9f, 0x49, + 0xe4, 0xa3, 0x8e, 0x12, 0x09, 0x44, 0xed, 0x11, 0x5c, 0x99, 0x33, 0xa8, 0xe4, 0x93, 0xa9, 0x49, + 0x77, 0xd0, 0x4d, 0x49, 0x4e, 0xba, 0x13, 0x49, 0xc7, 0x26, 0xc1, 0xb5, 0xef, 0x2a, 0x70, 0x89, + 0xd5, 0x8d, 0x31, 0xcf, 0x03, 0x1b, 0xd8, 0x5f, 0xcc, 0x1c, 0xfa, 0xda, 0xbf, 0x67, 0xe0, 0x32, + 0xdd, 0x0c, 0x06, 0xae, 0xef, 0xeb, 0xb3, 0xe9, 0x09, 0x9d, 0x7d, 0x8c, 0x3d, 0x26, 0xaf, 0xc3, + 0xca, 0xc9, 0xf9, 0x34, 0xdb, 0x0c, 0x9d, 0x10, 0xc0, 0x03, 0x56, 0xf8, 0xf2, 0xd0, 0xff, 0xe4, + 0x06, 0xc8, 0xb9, 0xd0, 0xb3, 0x18, 0x8d, 0x35, 0xb3, 0xad, 0x98, 0xab, 0xe3, 0x20, 0x6d, 0xf1, + 0x47, 0x60, 0x19, 0xd5, 0x3f, 0xfc, 0xa8, 0x13, 0x22, 0x4a, 0x7a, 0xeb, 0x50, 0x39, 0x64, 0x32, + 0x02, 0xf2, 0x01, 0x80, 0x30, 0x91, 0x05, 0x3f, 0xcb, 0x84, 0x5a, 0x24, 0xc8, 0x65, 0x61, 0xae, + 0x9e, 0x1e, 0x39, 0x3c, 0x3b, 0x44, 0x11, 0xb6, 0x44, 0xbf, 0x8f, 0x45, 0x10, 0x47, 0x7e, 0xe9, + 0xba, 0xc9, 0x0a, 0x6a, 0x63, 0x11, 0xc8, 0xf1, 0x56, 0x22, 0x9f, 0x33, 0xc6, 0x72, 0x8e, 0x25, + 0x6d, 0xbe, 0x95, 0x48, 0xda, 0x9c, 0x67, 0x58, 0x72, 0x66, 0x66, 0xed, 0x5f, 0x33, 0xb0, 0x7a, + 0x48, 0x99, 0x48, 0x54, 0x8d, 0x2c, 0x56, 0xb5, 0xdc, 0x87, 0x42, 0x7d, 0xe4, 0xf0, 0xdb, 0x2d, + 0xee, 0x02, 0xc3, 0x46, 0x73, 0x30, 0x72, 0xc4, 0x45, 0x99, 0x6f, 0xca, 0x48, 0x4f, 0x71, 0x9f, + 0x7f, 0x00, 0x2b, 0xec, 0xb6, 0x91, 0x6b, 0xfd, 0x84, 0x18, 0x11, 0xb4, 0xe8, 0x55, 0x56, 0x2c, + 0x5d, 0xc8, 0xb0, 0x1b, 0x4b, 0x99, 0xa7, 0xe5, 0x21, 0x69, 0x25, 0x45, 0xd0, 0xf2, 0xd9, 0x14, + 0x41, 0x52, 0xe8, 0xbd, 0x95, 0xb3, 0x84, 0xde, 0xdb, 0x79, 0x03, 0x0a, 0x52, 0x7b, 0xce, 0x25, + 0x55, 0x7c, 0x2d, 0x03, 0xeb, 0xf8, 0x55, 0x81, 0xe9, 0xd1, 0x2f, 0xa7, 0x5a, 0xeb, 0xa3, 0x11, + 0xb5, 0xd6, 0xb6, 0x3c, 0x5e, 0xec, 0xcb, 0x16, 0xe8, 0xb3, 0x1e, 0xc0, 0x56, 0x02, 0x91, 0x7c, + 0x08, 0x96, 0x69, 0xf3, 0x85, 0x1a, 0x40, 0x8d, 0xcf, 0x80, 0x30, 0x4c, 0x33, 0xfd, 0x70, 0xdf, + 0x64, 0xd8, 0xda, 0x7f, 0x29, 0xb0, 0xc6, 0xb3, 0xa4, 0x0c, 0x8f, 0x46, 0x4f, 0xed, 0xce, 0xdb, + 0xf1, 0xee, 0x64, 0xc1, 0x60, 0x78, 0x77, 0xfe, 0x6f, 0x77, 0xe2, 0x1b, 0x91, 0x4e, 0xbc, 0x12, + 0x04, 0x6d, 0x14, 0x9f, 0xb3, 0xa0, 0x0f, 0xff, 0x1e, 0xc3, 0x18, 0x47, 0x11, 0xc9, 0x17, 0x61, + 0xb5, 0xe9, 0xbe, 0x1d, 0x91, 0xa6, 0x6f, 0xcf, 0xa9, 0xf4, 0xd5, 0x00, 0x91, 0xad, 0x29, 0x64, + 0x44, 0x86, 0xee, 0xdb, 0x76, 0xe2, 0xa2, 0x33, 0xac, 0x92, 0x0a, 0xd4, 0x51, 0xb2, 0xf3, 0x4c, + 0x7d, 0xee, 0x8f, 0x8b, 0xf1, 0x8d, 0xbe, 0x91, 0x05, 0x08, 0x5d, 0x19, 0xe9, 0x02, 0x8c, 0xd8, + 0x78, 0x88, 0x8b, 0x08, 0x04, 0xc9, 0x73, 0x5c, 0x98, 0x7e, 0xdc, 0xe6, 0x0a, 0xf3, 0xcc, 0xfc, + 0xa0, 0x9a, 0xa8, 0x3a, 0x2f, 0x71, 0xdf, 0xb9, 0xbe, 0x3b, 0x70, 0xd8, 0xde, 0x9e, 0xdd, 0xbb, + 0x85, 0x31, 0x94, 0x03, 0xe8, 0x9c, 0x74, 0xd7, 0xe8, 0x61, 0x57, 0xa6, 0x08, 0x09, 0xf7, 0xe0, + 0xdc, 0xf9, 0xdc, 0x83, 0xdb, 0xb0, 0xea, 0x0d, 0xdf, 0x72, 0x87, 0xd3, 0xd1, 0xe4, 0x09, 0xde, + 0x12, 0x84, 0xea, 0x47, 0xda, 0x05, 0x35, 0x51, 0xc6, 0xc6, 0x01, 0x59, 0x84, 0x00, 0x5f, 0x1e, + 0x86, 0x00, 0x18, 0xb8, 0x37, 0x2f, 0xab, 0x2b, 0x0f, 0x72, 0xf9, 0x15, 0xf5, 0xc2, 0x83, 0x5c, + 0x3e, 0xaf, 0xae, 0x3e, 0xc8, 0xe5, 0x57, 0x55, 0x30, 0xa5, 0x2b, 0xbe, 0xe0, 0x0a, 0x4f, 0x3a, + 0xcb, 0xa3, 0xe7, 0xb4, 0xf6, 0xd3, 0x0c, 0x90, 0x64, 0x33, 0xc8, 0x47, 0xa1, 0xc0, 0x36, 0x58, + 0x7b, 0xe2, 0x7f, 0x99, 0x7b, 0x47, 0xb0, 0x28, 0x51, 0x12, 0x58, 0x8e, 0x12, 0xc5, 0xc0, 0xa6, + 0xff, 0xe5, 0x01, 0xf9, 0x02, 0x5c, 0xc4, 0xee, 0x1d, 0xbb, 0x13, 0x6f, 0xd4, 0xb7, 0x31, 0xa4, + 0xaf, 0x33, 0xe0, 0xa9, 0x29, 0x5f, 0xc1, 0x1c, 0xca, 0xc9, 0xe2, 0x39, 0xc3, 0x80, 0x1e, 0x8b, + 0x6d, 0xc4, 0x6c, 0x33, 0x44, 0xd2, 0x01, 0x55, 0xa6, 0x3f, 0x9a, 0x0d, 0x06, 0x7c, 0x64, 0x8b, + 0x3f, 0x79, 0xe7, 0xfa, 0x4e, 0xbc, 0x6c, 0x4e, 0xc5, 0x1b, 0x61, 0xc5, 0x95, 0xd9, 0x60, 0x40, + 0x5e, 0x07, 0x18, 0x0d, 0xed, 0x53, 0xcf, 0xf7, 0xd9, 0xdd, 0x53, 0xe0, 0x5c, 0x1d, 0x42, 0xe5, + 0xc1, 0x18, 0x0d, 0x1b, 0x0c, 0x48, 0xfe, 0x1f, 0x60, 0x70, 0x09, 0x8c, 0xba, 0xc2, 0x8c, 0xa7, + 0x78, 0xb2, 0x19, 0x01, 0x8c, 0xfa, 0x72, 0x1f, 0xbb, 0x96, 0xf7, 0x55, 0xe1, 0x99, 0xf2, 0x39, + 0xd8, 0xe2, 0xb6, 0xce, 0x87, 0xde, 0xf4, 0x84, 0x4b, 0x3e, 0xcf, 0x22, 0x36, 0x49, 0xa2, 0xcf, + 0x3f, 0xe5, 0x00, 0xf4, 0x43, 0x4b, 0x04, 0x34, 0xbb, 0x0b, 0xcb, 0x54, 0x9e, 0x13, 0x7a, 0x21, + 0xd4, 0xaa, 0x63, 0xbd, 0xb2, 0x56, 0x1d, 0x31, 0xe8, 0x6a, 0x34, 0xd1, 0x07, 0x40, 0xe8, 0x84, + 0x70, 0x35, 0x32, 0xb7, 0x80, 0x48, 0x40, 0x69, 0x8e, 0x45, 0xea, 0x00, 0x61, 0x88, 0x31, 0x2e, + 0xa1, 0x6c, 0x85, 0xb1, 0x7a, 0x78, 0x01, 0x4f, 0x6a, 0x11, 0x86, 0x29, 0x93, 0xa7, 0x4f, 0x88, + 0x46, 0x1e, 0x42, 0xae, 0xe3, 0x04, 0xae, 0xc3, 0x73, 0x02, 0xaf, 0xbd, 0xc8, 0x53, 0x87, 0x86, + 0xc1, 0xd7, 0x36, 0xa6, 0x4e, 0x24, 0xc3, 0x32, 0x56, 0x42, 0x0c, 0x58, 0xe1, 0x69, 0xe1, 0xe7, + 0x04, 0xec, 0xe4, 0x59, 0xe1, 0x79, 0x98, 0x6e, 0x04, 0xca, 0x3c, 0x05, 0x4f, 0x00, 0x7f, 0x1f, + 0xb2, 0x96, 0xd5, 0xe0, 0xe1, 0x46, 0xd6, 0x43, 0x69, 0xd1, 0xb2, 0x1a, 0x8c, 0xf9, 0xf5, 0xfd, + 0x53, 0x89, 0x8c, 0x22, 0x93, 0x8f, 0x41, 0x41, 0xe2, 0xe1, 0x79, 0xa0, 0x1e, 0xec, 0x03, 0xc9, + 0x39, 0x4b, 0xde, 0x34, 0x24, 0x6c, 0x52, 0x07, 0xf5, 0xe1, 0xec, 0xb1, 0xab, 0x8f, 0xc7, 0xe8, + 0xb5, 0xf9, 0x96, 0x3b, 0x61, 0x6c, 0x5b, 0x3e, 0x8c, 0x70, 0x8d, 0x2e, 0x1d, 0x7d, 0x51, 0x2a, + 0xeb, 0xc6, 0xe2, 0x94, 0xa4, 0x0d, 0x5b, 0x96, 0x3b, 0x9d, 0x8d, 0x99, 0x39, 0x50, 0x65, 0x34, + 0xa1, 0xe2, 0x18, 0x0b, 0xeb, 0x83, 0xc1, 0x80, 0x7d, 0x5a, 0x28, 0x6c, 0xb0, 0x8e, 0x46, 0x93, + 0x98, 0x68, 0x96, 0x24, 0xd6, 0x5c, 0x79, 0xc8, 0xe9, 0xa9, 0x1a, 0x15, 0xf2, 0xf0, 0x54, 0x15, + 0x42, 0x5e, 0x28, 0xda, 0x7d, 0x20, 0x25, 0xf4, 0x1c, 0x5e, 0x64, 0x4a, 0xa1, 0xe7, 0x22, 0x01, + 0xe7, 0xbe, 0x93, 0x93, 0xa2, 0x9f, 0xf2, 0xb1, 0xf8, 0x04, 0xc0, 0x83, 0x91, 0x37, 0x6c, 0xb8, + 0xd3, 0x93, 0x51, 0x5f, 0x8a, 0x80, 0x57, 0xf8, 0xb5, 0x91, 0x37, 0xb4, 0x4f, 0x11, 0xfc, 0xd3, + 0x77, 0xae, 0x4b, 0x48, 0xa6, 0xf4, 0x9f, 0xbc, 0x1f, 0x56, 0xe9, 0x53, 0x27, 0x34, 0x6a, 0x62, + 0x2a, 0x64, 0xa4, 0x66, 0x39, 0x42, 0x42, 0x04, 0xf2, 0x06, 0x66, 0xc5, 0xf1, 0xc6, 0x53, 0x89, + 0x79, 0x15, 0x29, 0x70, 0xbc, 0xf1, 0x34, 0x1e, 0xd0, 0x5a, 0x42, 0x26, 0xd5, 0xa0, 0xe9, 0x22, + 0x91, 0x15, 0x4f, 0xbe, 0x83, 0x7a, 0x52, 0x3e, 0xd7, 0x6c, 0x11, 0x49, 0x57, 0x4e, 0x39, 0x1c, + 0x23, 0xc3, 0x46, 0x58, 0xd5, 0x32, 0xbb, 0xd8, 0xe2, 0x4c, 0x2d, 0x6b, 0x84, 0x7f, 0xd2, 0xb7, + 0x7b, 0x08, 0x8e, 0x34, 0x22, 0x40, 0x26, 0x7b, 0xb0, 0xc9, 0x78, 0xfc, 0x20, 0x21, 0x26, 0x67, + 0x71, 0x71, 0x6f, 0x0b, 0x33, 0x66, 0xca, 0xaf, 0x8f, 0x11, 0x90, 0x0a, 0x2c, 0xa3, 0x68, 0xcc, + 0x3d, 0x19, 0x76, 0x65, 0xad, 0x46, 0x7c, 0x1d, 0xe1, 0xbe, 0x82, 0xfa, 0x0c, 0x79, 0x5f, 0x41, + 0x54, 0xf2, 0x59, 0x00, 0x63, 0x38, 0x19, 0x0d, 0x06, 0x18, 0xeb, 0x39, 0x8f, 0xa2, 0xd4, 0x0b, + 0xd1, 0xf5, 0x88, 0xb5, 0x84, 0x48, 0x3c, 0x2e, 0x21, 0x3e, 0xdb, 0xb1, 0x88, 0xd0, 0x52, 0x5d, + 0x5a, 0x0d, 0x56, 0xd8, 0x62, 0xc4, 0xb8, 0xe9, 0x3c, 0x13, 0x8c, 0x14, 0x75, 0x9b, 0xc5, 0x4d, + 0xe7, 0xf0, 0x64, 0xdc, 0x74, 0x89, 0x40, 0x7b, 0x08, 0x97, 0xd2, 0x3e, 0x2c, 0x22, 0xcc, 0x2b, + 0x67, 0x15, 0xe6, 0xff, 0x3c, 0x0b, 0x6b, 0x58, 0x9b, 0xd8, 0x85, 0x75, 0x58, 0xb7, 0x66, 0x8f, + 0x83, 0xa0, 0x62, 0x62, 0x37, 0xc6, 0xf6, 0xf9, 0x72, 0x81, 0x7c, 0xe5, 0x18, 0xa1, 0x20, 0x06, + 0x6c, 0x88, 0x93, 0x60, 0x5f, 0x38, 0x3a, 0x04, 0x21, 0xcb, 0x45, 0x60, 0xcc, 0x64, 0x42, 0xe0, + 0x18, 0x51, 0x78, 0x1e, 0x64, 0xcf, 0x73, 0x1e, 0xe4, 0xce, 0x74, 0x1e, 0xbc, 0x09, 0x6b, 0xe2, + 0x6d, 0xb8, 0x93, 0x2f, 0x3f, 0xdb, 0x4e, 0x1e, 0xa9, 0x8c, 0xd4, 0x83, 0x1d, 0x7d, 0x65, 0xe1, + 0x8e, 0x8e, 0xf7, 0xb8, 0x62, 0x95, 0x8d, 0x11, 0x96, 0xdc, 0xd8, 0x31, 0x63, 0xe6, 0x7e, 0xa9, + 0xfd, 0x33, 0x9c, 0x92, 0x1f, 0x82, 0xd5, 0xfa, 0x48, 0x5c, 0xe1, 0x49, 0x77, 0x27, 0x03, 0x01, + 0x94, 0xd9, 0x85, 0x00, 0x33, 0x38, 0xdd, 0xb2, 0xef, 0xc5, 0xe9, 0xf6, 0x06, 0x00, 0xf7, 0xa0, + 0x09, 0x33, 0xdd, 0xe1, 0x92, 0x11, 0x01, 0x55, 0xa2, 0x57, 0x38, 0x12, 0x32, 0xdd, 0x9d, 0xb8, + 0x75, 0x90, 0xde, 0xeb, 0x8d, 0x66, 0xc3, 0x69, 0x24, 0x35, 0xb4, 0x70, 0xb8, 0x75, 0x78, 0x99, + 0xbc, 0x3d, 0xc4, 0xc8, 0xde, 0xdb, 0x01, 0x21, 0x9f, 0x09, 0x6c, 0x35, 0x2f, 0x2c, 0xea, 0x21, + 0x2d, 0xd1, 0x43, 0x73, 0x2d, 0x34, 0xb5, 0x1f, 0x28, 0x72, 0xbe, 0x88, 0x9f, 0x61, 0xa8, 0x3f, + 0x02, 0x10, 0xd8, 0x50, 0x88, 0xb1, 0x66, 0xf2, 0x52, 0x00, 0x95, 0x7b, 0x39, 0xc4, 0x95, 0xbe, + 0x26, 0xfb, 0x5e, 0x7d, 0x4d, 0x07, 0x0a, 0xad, 0x2f, 0x4d, 0x9d, 0xd0, 0xe8, 0x06, 0xac, 0x80, + 0x93, 0xc5, 0x9d, 0x29, 0xbb, 0xf7, 0x12, 0x9e, 0x0d, 0x21, 0x1f, 0x3c, 0x87, 0x05, 0x96, 0x08, + 0xb5, 0xbf, 0x56, 0x60, 0x53, 0x8e, 0x12, 0xf0, 0x64, 0xd8, 0x23, 0x9f, 0x64, 0xe1, 0x6b, 0x95, + 0x88, 0xc8, 0x22, 0x21, 0xd1, 0x2d, 0xf7, 0xc9, 0xb0, 0xc7, 0x18, 0x20, 0xe7, 0x6d, 0xb9, 0xb1, + 0x94, 0x90, 0x3c, 0x86, 0xb5, 0xf6, 0x68, 0x30, 0xa0, 0x6c, 0xcd, 0xe4, 0x2d, 0x2e, 0x00, 0xd0, + 0x8a, 0xe2, 0x37, 0x39, 0xa2, 0x41, 0x7b, 0x37, 0xb9, 0x9c, 0x7b, 0x65, 0x4c, 0xf7, 0x7b, 0x8f, + 0xd3, 0x85, 0xd5, 0x7e, 0x1b, 0xdd, 0xfa, 0xe4, 0x3a, 0xb5, 0x1f, 0x29, 0x40, 0x92, 0x4d, 0x92, + 0xb7, 0x2c, 0xe5, 0xff, 0x80, 0x85, 0x8d, 0xb1, 0x7e, 0xb9, 0xf3, 0xb0, 0x7e, 0xc5, 0x3f, 0x50, + 0x60, 0xb3, 0xa6, 0x37, 0x78, 0x06, 0x09, 0x76, 0xe1, 0x74, 0x03, 0x5e, 0xa8, 0xe9, 0x0d, 0xbb, + 0xdd, 0xaa, 0xd7, 0x4a, 0x8f, 0xec, 0xd4, 0xc0, 0xd0, 0x2f, 0xc0, 0xf3, 0x49, 0x94, 0xf0, 0x62, + 0xea, 0x2a, 0x6c, 0x27, 0x8b, 0x45, 0xf0, 0xe8, 0x74, 0x62, 0x11, 0x67, 0x3a, 0x5b, 0xfc, 0x14, + 0x6c, 0x8a, 0x40, 0xc9, 0x9d, 0xba, 0x85, 0xa9, 0x18, 0x36, 0xa1, 0x70, 0x60, 0x98, 0xb5, 0xca, + 0x23, 0xbb, 0xd2, 0xad, 0xd7, 0xd5, 0x25, 0xb2, 0x0e, 0xab, 0x1c, 0x50, 0xd2, 0x55, 0x85, 0xac, + 0x41, 0xbe, 0xd6, 0xb4, 0x8c, 0x52, 0xd7, 0x34, 0xd4, 0x4c, 0xf1, 0x53, 0xb0, 0xd1, 0x9e, 0x78, + 0x6f, 0x39, 0x53, 0xf7, 0xa1, 0xfb, 0x04, 0xef, 0x95, 0x2e, 0x40, 0xd6, 0xd4, 0x0f, 0xd5, 0x25, + 0x02, 0xb0, 0xd2, 0x7e, 0x58, 0xb2, 0xee, 0xdd, 0x53, 0x15, 0x52, 0x80, 0x0b, 0xfb, 0xa5, 0xb6, + 0xfd, 0xb0, 0x61, 0xa9, 0x19, 0xfa, 0xa0, 0x1f, 0x5a, 0xf8, 0x90, 0x2d, 0x7e, 0x10, 0xb6, 0x90, + 0x21, 0xa9, 0x7b, 0xfe, 0xd4, 0x1d, 0xba, 0x13, 0x6c, 0xc3, 0x1a, 0xe4, 0x2d, 0x97, 0xee, 0x24, + 0x53, 0x97, 0x35, 0xa0, 0x31, 0x1b, 0x4c, 0xbd, 0xf1, 0xc0, 0xfd, 0x8a, 0xaa, 0x14, 0xdf, 0x80, + 0x4d, 0x73, 0x34, 0x9b, 0x7a, 0xc3, 0x63, 0x6b, 0x4a, 0x31, 0x8e, 0x9f, 0x90, 0xe7, 0x60, 0xab, + 0xdb, 0xd4, 0x1b, 0x7b, 0xb5, 0xfd, 0x6e, 0xab, 0x6b, 0xd9, 0x0d, 0xbd, 0x53, 0xaa, 0xb2, 0x5b, + 0xad, 0x46, 0xcb, 0xea, 0xd8, 0xa6, 0x51, 0x32, 0x9a, 0x1d, 0x55, 0x29, 0x7e, 0x13, 0x75, 0x2b, + 0xbd, 0xd1, 0xb0, 0x5f, 0x71, 0x7a, 0xd3, 0xd1, 0x04, 0x1b, 0xac, 0xc1, 0x35, 0xcb, 0x28, 0xb5, + 0x9a, 0x65, 0xbb, 0xa2, 0x97, 0x3a, 0x2d, 0x33, 0x2d, 0x32, 0xf9, 0x0e, 0x5c, 0x4e, 0xc1, 0x69, + 0x75, 0xda, 0xaa, 0x42, 0xae, 0xc3, 0x6e, 0x4a, 0xd9, 0xa1, 0xb1, 0xa7, 0x77, 0x3b, 0xd5, 0xa6, + 0x9a, 0x99, 0x43, 0x6c, 0x59, 0x2d, 0x35, 0x5b, 0xfc, 0x1d, 0x05, 0x36, 0xba, 0x3e, 0xb7, 0x90, + 0xef, 0xa2, 0x73, 0xec, 0x8b, 0x70, 0xb5, 0x6b, 0x19, 0xa6, 0xdd, 0x69, 0x3d, 0x34, 0x9a, 0x76, + 0xd7, 0xd2, 0xf7, 0xe3, 0xad, 0xb9, 0x0e, 0xbb, 0x12, 0x86, 0x69, 0x94, 0x5a, 0x07, 0x86, 0x69, + 0xb7, 0x75, 0xcb, 0x3a, 0x6c, 0x99, 0x65, 0x55, 0xa1, 0x6f, 0x4c, 0x41, 0x68, 0x54, 0x74, 0xd6, + 0x9a, 0x48, 0x59, 0xd3, 0x38, 0xd4, 0xeb, 0xf6, 0x5e, 0xab, 0xa3, 0x66, 0x8b, 0x0d, 0x7a, 0xbe, + 0x63, 0x7c, 0x60, 0x66, 0x08, 0x99, 0x87, 0x5c, 0xb3, 0xd5, 0x34, 0xe2, 0x77, 0xa1, 0x6b, 0x90, + 0xd7, 0xdb, 0x6d, 0xb3, 0x75, 0x80, 0x53, 0x0c, 0x60, 0xa5, 0x6c, 0x34, 0x69, 0xcb, 0xb2, 0xb4, + 0xa4, 0x6d, 0xb6, 0x1a, 0xad, 0x8e, 0x51, 0x56, 0x73, 0x45, 0x53, 0x2c, 0x61, 0x51, 0x69, 0x6f, + 0xc4, 0x2e, 0x1e, 0xcb, 0x46, 0x45, 0xef, 0xd6, 0x3b, 0x7c, 0x88, 0x1e, 0xd9, 0xa6, 0xf1, 0x99, + 0xae, 0x61, 0x75, 0x2c, 0x55, 0x21, 0x2a, 0xac, 0x35, 0x0d, 0xa3, 0x6c, 0xd9, 0xa6, 0x71, 0x50, + 0x33, 0x0e, 0xd5, 0x0c, 0xad, 0x93, 0xfd, 0xa7, 0x6f, 0x28, 0x7e, 0x47, 0x01, 0xc2, 0x62, 0x2b, + 0x8b, 0x84, 0x3d, 0x38, 0x63, 0xae, 0xc1, 0x4e, 0x95, 0x0e, 0x35, 0x7e, 0x5a, 0xa3, 0x55, 0x8e, + 0x77, 0xd9, 0x65, 0x20, 0xb1, 0xf2, 0x56, 0xa5, 0xa2, 0x2a, 0x64, 0x17, 0x2e, 0xc6, 0xe0, 0x65, + 0xb3, 0xd5, 0x56, 0x33, 0x3b, 0x99, 0xbc, 0x42, 0xae, 0x24, 0x0a, 0x1f, 0x1a, 0x46, 0x5b, 0xcd, + 0xd2, 0x21, 0x8a, 0x15, 0x88, 0x25, 0xc1, 0xc8, 0x73, 0xc5, 0xaf, 0x2b, 0x70, 0x99, 0x35, 0x53, + 0xac, 0xaf, 0xa0, 0xa9, 0x57, 0x61, 0x9b, 0x47, 0x8c, 0x4f, 0x6b, 0xe8, 0x25, 0x50, 0x23, 0xa5, + 0xac, 0x99, 0xcf, 0xc1, 0x56, 0x04, 0x8a, 0xed, 0xc8, 0xd0, 0xdd, 0x23, 0x02, 0xde, 0x33, 0xac, + 0x8e, 0x6d, 0x54, 0x2a, 0x2d, 0xb3, 0xc3, 0x1a, 0x92, 0x2d, 0x6a, 0xb0, 0x55, 0x72, 0x27, 0x53, + 0x2a, 0x7a, 0x0d, 0x7d, 0x6f, 0x34, 0xc4, 0x26, 0xac, 0xc3, 0xaa, 0xf1, 0xd9, 0x8e, 0xd1, 0xb4, + 0x6a, 0xad, 0xa6, 0xba, 0x54, 0xbc, 0x1a, 0xc3, 0x11, 0xeb, 0xd8, 0xb2, 0xaa, 0xea, 0x52, 0xd1, + 0x81, 0x75, 0x61, 0x27, 0xce, 0x66, 0xc5, 0x35, 0xd8, 0x11, 0x73, 0x0d, 0x77, 0x94, 0xf8, 0x27, + 0x6c, 0xc3, 0xa5, 0x64, 0xb9, 0xd1, 0x51, 0x15, 0x3a, 0x0a, 0xb1, 0x12, 0x0a, 0xcf, 0x14, 0x7f, + 0x4b, 0x81, 0xf5, 0xe0, 0xd2, 0x04, 0xd5, 0xb4, 0xd7, 0x61, 0xb7, 0x51, 0xd1, 0xed, 0xb2, 0x71, + 0x50, 0x2b, 0x19, 0xf6, 0xc3, 0x5a, 0xb3, 0x1c, 0x7b, 0xc9, 0xf3, 0xf0, 0x5c, 0x0a, 0x02, 0xbe, + 0x65, 0x1b, 0x2e, 0xc5, 0x8b, 0x3a, 0x74, 0xa9, 0x66, 0x68, 0xd7, 0xc7, 0x4b, 0x82, 0x75, 0x9a, + 0x2d, 0xfe, 0x99, 0x02, 0xdb, 0x9d, 0xc9, 0xcc, 0x9f, 0xba, 0x7d, 0x7e, 0x7d, 0xc3, 0x52, 0xe5, + 0x60, 0x2c, 0xe9, 0x22, 0xdc, 0xee, 0x98, 0x5d, 0xab, 0x63, 0x94, 0x05, 0x39, 0x9d, 0xb4, 0x35, + 0xd3, 0x68, 0x18, 0xcd, 0x4e, 0xac, 0x6d, 0x2f, 0xc3, 0xfb, 0x16, 0xe0, 0x36, 0x5b, 0x1d, 0xf1, + 0x4c, 0xd7, 0xea, 0xfb, 0xe0, 0xe6, 0x02, 0xe4, 0x00, 0x31, 0x53, 0x3c, 0x80, 0x0d, 0x4b, 0x6f, + 0xd4, 0x2b, 0xa3, 0x49, 0xcf, 0xd5, 0x67, 0xd3, 0x93, 0x21, 0xd9, 0x85, 0x2b, 0x95, 0x96, 0x59, + 0x32, 0x6c, 0xfc, 0x82, 0x58, 0x23, 0x2e, 0xc2, 0xa6, 0x5c, 0xf8, 0xc8, 0xa0, 0xab, 0x8b, 0xc0, + 0x86, 0x0c, 0x6c, 0xb6, 0xd4, 0x4c, 0xf1, 0xf3, 0xb0, 0x16, 0x49, 0x2b, 0x78, 0x05, 0x2e, 0xca, + 0xcf, 0x6d, 0x77, 0xd8, 0xf7, 0x86, 0xc7, 0xea, 0x52, 0xbc, 0xc0, 0x9c, 0x0d, 0x87, 0xb4, 0x00, + 0xb7, 0x1b, 0xb9, 0xa0, 0xe3, 0x4e, 0x4e, 0xbd, 0xa1, 0x33, 0x75, 0xfb, 0x6a, 0xa6, 0xf8, 0x2a, + 0xac, 0x47, 0x82, 0x99, 0xd3, 0x79, 0x55, 0x6f, 0xf1, 0xf3, 0xa1, 0x61, 0x94, 0x6b, 0xdd, 0x86, + 0xba, 0x4c, 0x37, 0x9a, 0x6a, 0x6d, 0xbf, 0xaa, 0x42, 0xf1, 0x5b, 0x0a, 0x15, 0x83, 0xb0, 0xdf, + 0x1b, 0x15, 0x5d, 0xcc, 0x44, 0xba, 0x0a, 0x58, 0x8a, 0x04, 0xc3, 0xb2, 0x98, 0x85, 0xc2, 0x55, + 0xd8, 0xe6, 0x0f, 0xb6, 0xde, 0x2c, 0xdb, 0x55, 0xdd, 0x2c, 0x1f, 0xea, 0x26, 0x5d, 0x1a, 0x8f, + 0xd4, 0x0c, 0xae, 0x77, 0x09, 0x62, 0x77, 0x5a, 0xdd, 0x52, 0x55, 0xcd, 0xd2, 0xe5, 0x15, 0x81, + 0xb7, 0x6b, 0x4d, 0x35, 0x87, 0xbb, 0x47, 0x02, 0x1b, 0xab, 0xa5, 0xe5, 0xcb, 0xc5, 0x77, 0x15, + 0xb8, 0x62, 0x79, 0xc7, 0x43, 0x67, 0x3a, 0x9b, 0xb8, 0xfa, 0xe0, 0x78, 0x34, 0xf1, 0xa6, 0x27, + 0xa7, 0xd6, 0xcc, 0x9b, 0xba, 0xe4, 0x2e, 0xbc, 0x64, 0xd5, 0xf6, 0x9b, 0x7a, 0x87, 0xae, 0x7e, + 0xbd, 0xbe, 0xdf, 0x32, 0x6b, 0x9d, 0x6a, 0xc3, 0xb6, 0xba, 0xb5, 0xc4, 0xc2, 0xb8, 0x05, 0x2f, + 0xce, 0x47, 0xad, 0x1b, 0xfb, 0x7a, 0xe9, 0x91, 0xaa, 0x2c, 0xae, 0x70, 0x4f, 0xaf, 0xeb, 0xcd, + 0x92, 0x51, 0xb6, 0x0f, 0xee, 0xa9, 0x19, 0xf2, 0x12, 0xdc, 0x98, 0x8f, 0x5a, 0xa9, 0xb5, 0x2d, + 0x8a, 0x96, 0x5d, 0xfc, 0xde, 0xaa, 0xd5, 0xa0, 0x58, 0xb9, 0xe2, 0x9f, 0x2a, 0xb0, 0x3d, 0x2f, + 0xa2, 0x15, 0xb9, 0x0d, 0x9a, 0xd1, 0xec, 0x98, 0x7a, 0xad, 0x6c, 0x97, 0x4c, 0xa3, 0x6c, 0x34, + 0x3b, 0x35, 0xbd, 0x6e, 0xd9, 0x56, 0xab, 0x4b, 0x67, 0x53, 0x68, 0x48, 0x72, 0x13, 0xae, 0x2f, + 0xc0, 0x6b, 0xd5, 0xca, 0x25, 0x55, 0x21, 0xf7, 0xe0, 0x95, 0x05, 0x48, 0xd6, 0x23, 0xab, 0x63, + 0x34, 0xe4, 0x12, 0x35, 0x53, 0x2c, 0xc1, 0xce, 0xfc, 0x90, 0x37, 0xf4, 0x14, 0x89, 0xf6, 0x74, + 0x1e, 0x72, 0x65, 0x7a, 0x70, 0x45, 0x32, 0x69, 0x14, 0x3d, 0x50, 0xe3, 0x51, 0x2b, 0x12, 0x16, + 0x3f, 0x66, 0xb7, 0xd9, 0x64, 0xa7, 0xdc, 0x26, 0x14, 0x5a, 0x9d, 0xaa, 0x61, 0xf2, 0x5c, 0x24, + 0x98, 0x7c, 0xa4, 0xdb, 0xa4, 0x0b, 0xa7, 0x65, 0xd6, 0x3e, 0x87, 0xc7, 0xdd, 0x36, 0x5c, 0xb2, + 0xea, 0x7a, 0xe9, 0x21, 0xae, 0xe9, 0x5a, 0xd3, 0x2e, 0x55, 0xf5, 0x66, 0xd3, 0xa8, 0xab, 0x80, + 0x9d, 0x39, 0xcf, 0x53, 0x95, 0xbc, 0x1f, 0xee, 0xb4, 0x1e, 0x76, 0x74, 0xbb, 0x5d, 0xef, 0xee, + 0xd7, 0x9a, 0xb6, 0xf5, 0xa8, 0x59, 0x12, 0xac, 0x59, 0x29, 0x79, 0x22, 0xdc, 0x81, 0x5b, 0x0b, + 0xb1, 0xc3, 0xac, 0x21, 0xb7, 0x41, 0x5b, 0x88, 0xc9, 0x3f, 0xa4, 0xf8, 0x43, 0x05, 0x76, 0x17, + 0x5c, 0x71, 0x93, 0x57, 0xe0, 0x6e, 0xd5, 0xd0, 0xcb, 0x75, 0xc3, 0xb2, 0x70, 0xa3, 0xa0, 0xc3, + 0xc0, 0x2c, 0x83, 0x52, 0xf7, 0xfb, 0xbb, 0xf0, 0xd2, 0x62, 0xf4, 0x90, 0x73, 0xb8, 0x03, 0xb7, + 0x16, 0xa3, 0x72, 0x4e, 0x22, 0x43, 0xf7, 0xdb, 0xc5, 0x98, 0x01, 0x07, 0x92, 0x2d, 0xfe, 0x9e, + 0x02, 0x97, 0xd3, 0xf5, 0x4c, 0xb4, 0x6d, 0xb5, 0xa6, 0xd5, 0xd1, 0xeb, 0x75, 0xbb, 0xad, 0x9b, + 0x7a, 0xc3, 0x36, 0x9a, 0x66, 0xab, 0x5e, 0x4f, 0x3b, 0x79, 0x6f, 0xc1, 0x8b, 0xf3, 0x51, 0xad, + 0x92, 0x59, 0x6b, 0xd3, 0xc3, 0x45, 0x83, 0x6b, 0xf3, 0xb1, 0x8c, 0x5a, 0xc9, 0x50, 0x33, 0x7b, + 0x9f, 0xf8, 0xfe, 0xbf, 0x5c, 0x5b, 0xfa, 0xfe, 0xbb, 0xd7, 0x94, 0x1f, 0xbd, 0x7b, 0x4d, 0xf9, + 0xe7, 0x77, 0xaf, 0x29, 0x9f, 0x7b, 0xf9, 0x6c, 0x09, 0xb7, 0x50, 0x2c, 0x79, 0xbc, 0x82, 0x02, + 0xd4, 0x6b, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xa5, 0x61, 0x07, 0x7f, 0x44, 0xb3, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -46457,6 +46471,27 @@ func (m *PluginStaticCredentialsSpecV1_OAuthClientSecret) MarshalToSizedBuffer(d } return len(dAtA) - i, nil } +func (m *PluginStaticCredentialsSpecV1_SSHCertAuthorities) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginStaticCredentialsSpecV1_SSHCertAuthorities) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SSHCertAuthorities != nil { + { + size, err := m.SSHCertAuthorities.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} func (m *PluginStaticCredentialsBasicAuth) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -46539,6 +46574,47 @@ func (m *PluginStaticCredentialsOAuthClientSecret) MarshalToSizedBuffer(dAtA []b return len(dAtA) - i, nil } +func (m *PluginStaticCredentialsSSHCertAuthorities) 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 *PluginStaticCredentialsSSHCertAuthorities) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginStaticCredentialsSSHCertAuthorities) 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.CertAuthorities) > 0 { + for iNdEx := len(m.CertAuthorities) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.CertAuthorities[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *SAMLIdPServiceProviderV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -47055,21 +47131,21 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n383, err383 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err383 != nil { - return 0, err383 - } - i -= n383 - i = encodeVarintTypes(dAtA, i, uint64(n383)) - i-- - dAtA[i] = 0x12 - n384, err384 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + n384, err384 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) if err384 != nil { return 0, err384 } i -= n384 i = encodeVarintTypes(dAtA, i, uint64(n384)) i-- + dAtA[i] = 0x12 + n385, err385 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err385 != nil { + return 0, err385 + } + i -= n385 + i = encodeVarintTypes(dAtA, i, uint64(n385)) + i-- dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -47495,12 +47571,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n391, err391 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err391 != nil { - return 0, err391 + n392, err392 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err392 != nil { + return 0, err392 } - i -= n391 - i = encodeVarintTypes(dAtA, i, uint64(n391)) + i -= n392 + i = encodeVarintTypes(dAtA, i, uint64(n392)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -47508,12 +47584,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n392, err392 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err392 != nil { - return 0, err392 + n393, err393 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err393 != nil { + return 0, err393 } - i -= n392 - i = encodeVarintTypes(dAtA, i, uint64(n392)) + i -= n393 + i = encodeVarintTypes(dAtA, i, uint64(n393)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -47650,6 +47726,18 @@ func (m *IntegrationSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Credentials != nil { + { + size, err := m.Credentials.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } if m.SubKindSpec != nil { { size := m.SubKindSpec.Size() @@ -47838,18 +47926,6 @@ func (m *GitHubIntegrationSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Proxy != nil { - { - size, err := m.Proxy.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } if len(m.Organization) > 0 { i -= len(m.Organization) copy(dAtA[i:], m.Organization) @@ -47860,59 +47936,6 @@ func (m *GitHubIntegrationSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *GitHubProxy) 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 *GitHubProxy) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GitHubProxy) 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 m.Connector != nil { - { - size, err := m.Connector.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if len(m.CertAuthorities) > 0 { - for iNdEx := len(m.CertAuthorities) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.CertAuthorities[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - func (m *GitHubProxyConnector) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -59085,6 +59108,18 @@ func (m *PluginStaticCredentialsSpecV1_OAuthClientSecret) Size() (n int) { } return n } +func (m *PluginStaticCredentialsSpecV1_SSHCertAuthorities) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SSHCertAuthorities != nil { + l = m.SSHCertAuthorities.Size() + n += 1 + l + sovTypes(uint64(l)) + } + return n +} func (m *PluginStaticCredentialsBasicAuth) Size() (n int) { if m == nil { return 0 @@ -59125,6 +59160,24 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Size() (n int) { return n } +func (m *PluginStaticCredentialsSSHCertAuthorities) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.CertAuthorities) > 0 { + for _, e := range m.CertAuthorities { + l = e.Size() + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *SAMLIdPServiceProviderV1) Size() (n int) { if m == nil { return 0 @@ -59600,6 +59653,10 @@ func (m *IntegrationSpecV1) Size() (n int) { if m.SubKindSpec != nil { n += m.SubKindSpec.Size() } + if m.Credentials != nil { + l = m.Credentials.Size() + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -59696,32 +59753,6 @@ func (m *GitHubIntegrationSpecV1) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } - if m.Proxy != nil { - l = m.Proxy.Size() - n += 1 + l + sovTypes(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GitHubProxy) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.CertAuthorities) > 0 { - for _, e := range m.CertAuthorities { - l = e.Size() - n += 1 + l + sovTypes(uint64(l)) - } - } - if m.Connector != nil { - l = m.Connector.Size() - n += 1 + l + sovTypes(uint64(l)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -123441,6 +123472,41 @@ func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { } m.Credentials = &PluginStaticCredentialsSpecV1_OAuthClientSecret{v} iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSHCertAuthorities", 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 + } + v := &PluginStaticCredentialsSSHCertAuthorities{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Credentials = &PluginStaticCredentialsSpecV1_SSHCertAuthorities{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -123693,6 +123759,91 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error } return nil } +func (m *PluginStaticCredentialsSSHCertAuthorities) 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: PluginStaticCredentialsSSHCertAuthorities: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PluginStaticCredentialsSSHCertAuthorities: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CertAuthorities", 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.CertAuthorities = append(m.CertAuthorities, &SSHKeyPair{}) + if err := m.CertAuthorities[len(m.CertAuthorities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -126542,167 +126693,13 @@ func (m *IntegrationV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *IntegrationSpecV1) 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: IntegrationSpecV1: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: IntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AWSOIDC", 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 - } - v := &AWSOIDCIntegrationSpecV1{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.SubKindSpec = &IntegrationSpecV1_AWSOIDC{v} iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AzureOIDC", 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 - } - v := &AzureOIDCIntegrationSpecV1{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.SubKindSpec = &IntegrationSpecV1_AzureOIDC{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GitHub", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -126729,11 +126726,9 @@ func (m *IntegrationSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &GitHubIntegrationSpecV1{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.SubKindSpec = &IntegrationSpecV1_GitHub{v} iNdEx = postIndex default: iNdEx = preIndex @@ -126757,7 +126752,7 @@ func (m *IntegrationSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { +func (m *IntegrationSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -126780,17 +126775,17 @@ func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AWSOIDCIntegrationSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: IntegrationSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AWSOIDCIntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: IntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleARN", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AWSOIDC", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -126800,29 +126795,32 @@ func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.RoleARN = string(dAtA[iNdEx:postIndex]) + v := &AWSOIDCIntegrationSpecV1{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.SubKindSpec = &IntegrationSpecV1_AWSOIDC{v} iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field IssuerS3URI", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AzureOIDC", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -126832,29 +126830,32 @@ func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.IssuerS3URI = string(dAtA[iNdEx:postIndex]) + v := &AzureOIDCIntegrationSpecV1{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.SubKindSpec = &IntegrationSpecV1_AzureOIDC{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Audience", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field GitHub", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -126864,23 +126865,62 @@ func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Audience = string(dAtA[iNdEx:postIndex]) + v := &GitHubIntegrationSpecV1{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.SubKindSpec = &IntegrationSpecV1_GitHub{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Credentials", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Credentials == nil { + m.Credentials = &PluginCredentialsV1{} + } + if err := m.Credentials.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -126904,7 +126944,7 @@ func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *AzureOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { +func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -126927,15 +126967,15 @@ func (m *AzureOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AzureOIDCIntegrationSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: AWSOIDCIntegrationSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AzureOIDCIntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AWSOIDCIntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TenantID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RoleARN", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -126963,11 +127003,11 @@ func (m *AzureOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.TenantID = string(dAtA[iNdEx:postIndex]) + m.RoleARN = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IssuerS3URI", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -126995,7 +127035,39 @@ func (m *AzureOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientID = string(dAtA[iNdEx:postIndex]) + m.IssuerS3URI = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Audience", 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.Audience = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -127019,7 +127091,7 @@ func (m *AzureOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *GitHubIntegrationSpecV1) Unmarshal(dAtA []byte) error { +func (m *AzureOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -127042,15 +127114,15 @@ func (m *GitHubIntegrationSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GitHubIntegrationSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: AzureOIDCIntegrationSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GitHubIntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AzureOIDCIntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Organization", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TenantID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -127078,13 +127150,13 @@ func (m *GitHubIntegrationSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Organization = string(dAtA[iNdEx:postIndex]) + m.TenantID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Proxy", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClientID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -127094,27 +127166,23 @@ func (m *GitHubIntegrationSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Proxy == nil { - m.Proxy = &GitHubProxy{} - } - if err := m.Proxy.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ClientID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -127138,7 +127206,7 @@ func (m *GitHubIntegrationSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *GitHubProxy) Unmarshal(dAtA []byte) error { +func (m *GitHubIntegrationSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -127161,51 +127229,17 @@ func (m *GitHubProxy) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GitHubProxy: wiretype end group for non-group") + return fmt.Errorf("proto: GitHubIntegrationSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GitHubProxy: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GitHubIntegrationSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CertAuthorities", 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.CertAuthorities = append(m.CertAuthorities, &SSHKeyPair{}) - if err := m.CertAuthorities[len(m.CertAuthorities)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Connector", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Organization", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -127215,27 +127249,23 @@ func (m *GitHubProxy) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Connector == nil { - m.Connector = &GitHubProxyConnector{} - } - if err := m.Connector.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Organization = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/lib/auth/auth.go b/lib/auth/auth.go index dcbcf632b598d..e8fb01a506f58 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -329,6 +329,12 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { return nil, trace.Wrap(err) } } + if cfg.PluginStaticCredentials == nil { + cfg.PluginStaticCredentials, err = local.NewPluginStaticCredentialsService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } + } if cfg.UserTasks == nil { cfg.UserTasks, err = local.NewUserTasksService(cfg.Backend) if err != nil { @@ -483,6 +489,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { StaticHostUser: cfg.StaticHostUsers, ProvisioningStates: cfg.ProvisioningStates, IdentityCenter: cfg.IdentityCenter, + PluginStaticCredentials: cfg.PluginStaticCredentials, } as := Server{ @@ -693,6 +700,7 @@ type Services struct { services.AutoUpdateService services.ProvisioningStates services.IdentityCenter + services.PluginStaticCredentials } // GetWebSession returns existing web session described by req. diff --git a/lib/auth/init.go b/lib/auth/init.go index 36ca37518e68b..16316c2b173c4 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -335,6 +335,9 @@ type InitConfig struct { // IdentityCenter is the Identity Center state storage service to use in // this node. IdentityCenter services.IdentityCenter + + // PluginStaticCredentials handles credentials for integrations and plugins. + PluginStaticCredentials services.PluginStaticCredentials } // Init instantiates and configures an instance of AuthServer diff --git a/lib/auth/integration/integrationv1/credentials.go b/lib/auth/integration/integrationv1/credentials.go new file mode 100644 index 0000000000000..b3315c4067cea --- /dev/null +++ b/lib/auth/integration/integrationv1/credentials.go @@ -0,0 +1,228 @@ +/* + * 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 integrationv1 + +import ( + "context" + "maps" + + "github.com/google/uuid" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/cryptosuites" + "github.com/gravitational/trace" +) + +const ( + // labelStaticCredentialsIntegration is the label used to store the + // UUID ref in the static credentials. + labelStaticCredentialsIntegration = types.TeleportInternalLabelPrefix + types.KindIntegration + // labelStaticCredentialsPurpose is the label used to store the purpose of + // the static credentials. + labelStaticCredentialsPurpose = "purpose" + + // purposeGitHubSSHCA is the label value that indicates the static + // credentials contains the GitHub SSH CA. + purposeGitHubSSHCA = "github-sshca" + // purposeGitHubOAuth is the label value that indicates the static + // credentials contains the GitHub OAuth ID and secret. + purposeGitHubOAuth = "github-oauth" +) + +func newStaticCredentialsRef(uuid string) *types.PluginStaticCredentialsRef { + return &types.PluginStaticCredentialsRef{ + Labels: map[string]string{ + labelStaticCredentialsIntegration: uuid, + }, + } +} + +func copyRefLabels(cred types.PluginStaticCredentials, ref *types.PluginStaticCredentialsRef) { + labels := cred.GetStaticLabels() + if labels == nil { + labels = make(map[string]string) + } + maps.Copy(labels, ref.Labels) + + cred.SetStaticLabels(labels) +} + +func buildGitHubOAuthCredentials(ig types.Integration) (*types.PluginStaticCredentialsV1, error) { + if ig.GetCredentials() == nil || ig.GetCredentials().GetIdSecret() == nil { + return nil, trace.BadParameter("GitHub integration requires OAuth ID and secret for credentials") + } + + return &types.PluginStaticCredentialsV1{ + ResourceHeader: types.ResourceHeader{ + Metadata: types.Metadata{ + Name: uuid.NewString(), + Labels: map[string]string{ + labelStaticCredentialsPurpose: purposeGitHubOAuth, + }, + }, + }, + Spec: &types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_OAuthClientSecret{ + OAuthClientSecret: &types.PluginStaticCredentialsOAuthClientSecret{ + ClientId: ig.GetCredentials().GetIdSecret().Id, + ClientSecret: ig.GetCredentials().GetIdSecret().Secret, + }, + }, + }, + }, nil +} + +func (s *Service) newGitHubSSHCA(ctx context.Context) (*types.PluginStaticCredentialsV1, error) { + ca, err := s.keyStoreManager.NewSSHKeyPair(ctx, cryptosuites.GitHubProxyCASSH) + if err != nil { + return nil, trace.Wrap(err) + } + return &types.PluginStaticCredentialsV1{ + ResourceHeader: types.ResourceHeader{ + Metadata: types.Metadata{ + Name: uuid.NewString(), + Labels: map[string]string{ + labelStaticCredentialsPurpose: purposeGitHubSSHCA, + }, + }, + }, + Spec: &types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_SSHCertAuthorities{ + SSHCertAuthorities: &types.PluginStaticCredentialsSSHCertAuthorities{ + CertAuthorities: []*types.SSHKeyPair{ca}, + }, + }, + }, + }, nil +} + +func (s *Service) createGitHubCredentials(ctx context.Context, ig types.Integration) error { + var creds []types.PluginStaticCredentials + + if oauthCred, err := buildGitHubOAuthCredentials(ig); err != nil { + return trace.Wrap(err) + } else { + creds = append(creds, oauthCred) + } + + // TODO(greedy52) support per auth CA like HSM. + if caCred, err := s.newGitHubSSHCA(ctx); err != nil { + return trace.Wrap(err) + } else { + creds = append(creds, caCred) + } + + return trace.Wrap(s.createStaticCredentials(ctx, ig, creds...)) +} + +func (s *Service) createStaticCredentials(ctx context.Context, ig types.Integration, creds ...types.PluginStaticCredentials) error { + ref := newStaticCredentialsRef(uuid.NewString()) + + for _, cred := range creds { + s.logger.DebugContext(ctx, "Removing static credentials.", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) + copyRefLabels(cred, ref) + if err := s.backend.CreatePluginStaticCredentials(ctx, cred); err != nil { + return trace.Wrap(err) + } + } + + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_StaticCredentialsRef{ + StaticCredentialsRef: ref, + }, + }) + return nil +} + +func (s *Service) maybeUpdateStaticCredentials(ctx context.Context, newIg types.Integration) error { + oldIg, err := s.backend.GetIntegration(ctx, newIg.GetName()) + if err != nil { + return trace.Wrap(err) + } + + // Preserve existing credentials. + if newIg.GetCredentials() == nil { + newIg.SetCredentials(oldIg.GetCredentials()) + return nil + } + + switch newIg.GetSubKind() { + case types.IntegrationSubKindGitHub: + if oauthCred, err := buildGitHubOAuthCredentials(newIg); err != nil { + return trace.Wrap(err) + } else { + // Copy ref. + newIg.SetCredentials(oldIg.GetCredentials()) + return trace.Wrap(s.updateStaticCredentials(ctx, newIg, oauthCred)) + } + } + return nil +} + +func (s *Service) updateStaticCredentials(ctx context.Context, ig types.Integration, creds ...types.PluginStaticCredentials) error { + if ig.GetCredentials() == nil || ig.GetCredentials().GetStaticCredentialsRef() == nil { + return trace.BadParameter("missing credentials ref") + } + + ref := ig.GetCredentials().GetStaticCredentialsRef() + for _, cred := range creds { + s.logger.DebugContext(ctx, "Updating static credentials.", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) + + // Use same labels to find existing credentials. + copyRefLabels(cred, ref) + oldCreds, err := s.backend.GetPluginStaticCredentialsByLabels(ctx, cred.GetStaticLabels()) + if err != nil { + return trace.Wrap(err) + } + if len(oldCreds) != 1 { + return trace.CompareFailed("expecting one credential but got %v", len(oldCreds)) + } + + cred.SetName(oldCreds[0].GetName()) + cred.SetRevision(oldCreds[0].GetRevision()) + if _, err := s.backend.UpdatePluginStaticCredentials(ctx, cred); err != nil { + return trace.Wrap(err) + } + } + return nil +} + +func (s *Service) removeStaticCredentials(ctx context.Context, ig types.Integration) error { + creds := ig.GetCredentials() + if creds == nil { + return nil + } + + ref := creds.GetStaticCredentialsRef() + if ref == nil { + return trace.NotFound("missing static credentials ref") + } + + staticCreds, err := s.backend.GetPluginStaticCredentialsByLabels(ctx, ref.Labels) + if err != nil { + return trace.Wrap(err) + } + var errors []error + for _, cred := range staticCreds { + s.logger.DebugContext(ctx, "Removing static credentials.", "integration", ig.GetName(), "labels", cred.GetStaticLabels()) + if err := s.backend.DeletePluginStaticCredentials(ctx, cred.GetName()); err != nil { + errors = append(errors, err) + } + } + return trace.NewAggregate(err) +} diff --git a/lib/auth/integration/integrationv1/service.go b/lib/auth/integration/integrationv1/service.go index 4400768078f26..7becb2cdbda92 100644 --- a/lib/auth/integration/integrationv1/service.go +++ b/lib/auth/integration/integrationv1/service.go @@ -65,11 +65,18 @@ type KeyStoreManager interface { GetSSHSignerFromKeySet(ctx context.Context, keySet types.CAKeySet) (ssh.Signer, error) } +// Backend defines the interface for all the backend services that the +// integration service needs. +type Backend interface { + services.Integrations + services.PluginStaticCredentials +} + // ServiceConfig holds configuration options for // the Integration gRPC service. type ServiceConfig struct { Authorizer authz.Authorizer - Backend services.Integrations + Backend Backend Cache Cache KeyStoreManager KeyStoreManager Logger *slog.Logger @@ -118,7 +125,7 @@ type Service struct { authorizer authz.Authorizer cache Cache keyStoreManager KeyStoreManager - backend services.Integrations + backend Backend logger *slog.Logger clock clockwork.Clock emitter apievents.Emitter @@ -161,6 +168,7 @@ func (s *Service) ListIntegrations(ctx context.Context, req *integrationpb.ListI igs := make([]*types.IntegrationV1, len(results)) for i, r := range results { + r = r.WithoutCredentials() v1, ok := r.(*types.IntegrationV1) if !ok { return nil, trace.BadParameter("unexpected Integration type %T", r) @@ -190,6 +198,7 @@ func (s *Service) GetIntegration(ctx context.Context, req *integrationpb.GetInte return nil, trace.Wrap(err) } + integration = integration.WithoutCredentials() igV1, ok := integration.(*types.IntegrationV1) if !ok { return nil, trace.BadParameter("unexpected Integration type %T", integration) @@ -198,25 +207,6 @@ func (s *Service) GetIntegration(ctx context.Context, req *integrationpb.GetInte return igV1, nil } -func (s *Service) initIntegrationResource(ctx context.Context, req *integrationpb.CreateIntegrationRequest) (*types.IntegrationV1, error) { - ig := req.GetIntegration() - switch ig.GetSubKind() { - case types.IntegrationSubKindGitHub: - spec := ig.GetGitHubIntegrationSpec() - if spec.Proxy == nil { - spec.Proxy = &types.GitHubProxy{} - } - // Generate SSH CA for the integration. - // TODO(greedy52) support per auth CA like HSM. - ca, err := s.keyStoreManager.NewSSHKeyPair(ctx, cryptosuites.GitHubProxyCASSH) - if err != nil { - return nil, trace.Wrap(err) - } - spec.Proxy.CertAuthorities = append(spec.Proxy.CertAuthorities, ca) - } - return ig, nil -} - // CreateIntegration creates a new Okta import rule resource. func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.CreateIntegrationRequest) (*types.IntegrationV1, error) { authCtx, err := s.authorizer.Authorize(ctx) @@ -228,11 +218,15 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea return nil, trace.Wrap(err) } - reqIg, err := s.initIntegrationResource(ctx, req) - if err != nil { - return nil, trace.Wrap(err) + switch req.Integration.GetSubKind() { + case types.IntegrationSubKindGitHub: + // TODO(greedy52) add entitlement check + if err := s.createGitHubCredentials(ctx, req.Integration); err != nil { + return nil, trace.Wrap(err) + } } - ig, err := s.backend.CreateIntegration(ctx, reqIg) + + ig, err := s.backend.CreateIntegration(ctx, req.Integration) if err != nil { return nil, trace.Wrap(err) } @@ -258,6 +252,7 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea s.logger.WarnContext(ctx, "Failed to emit integration create event.", "error", err) } + ig = ig.WithoutCredentials() igV1, ok := ig.(*types.IntegrationV1) if !ok { return nil, trace.BadParameter("unexpected Integration type %T", ig) @@ -266,7 +261,7 @@ func (s *Service) CreateIntegration(ctx context.Context, req *integrationpb.Crea return igV1, nil } -// UpdateIntegration updates an existing Okta import rule resource. +// UpdateIntegration updates an existing integration. func (s *Service) UpdateIntegration(ctx context.Context, req *integrationpb.UpdateIntegrationRequest) (*types.IntegrationV1, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -277,11 +272,16 @@ func (s *Service) UpdateIntegration(ctx context.Context, req *integrationpb.Upda return nil, trace.Wrap(err) } - ig, err := s.backend.UpdateIntegration(ctx, req.GetIntegration()) + if err := s.maybeUpdateStaticCredentials(ctx, req.Integration); err != nil { + return nil, trace.Wrap(err) + } + + ig, err := s.backend.UpdateIntegration(ctx, req.Integration) if err != nil { return nil, trace.Wrap(err) } + ig = ig.WithoutCredentials() igMeta, err := getIntegrationMetadata(ig) if err != nil { s.logger.WarnContext(ctx, "Failed to build all integration metadata for audit event.", "error", err) @@ -327,6 +327,10 @@ func (s *Service) DeleteIntegration(ctx context.Context, req *integrationpb.Dele return nil, trace.Wrap(err) } + if err := s.removeStaticCredentials(ctx, ig); err != nil { + return nil, trace.Wrap(err) + } + if err := s.backend.DeleteIntegration(ctx, req.GetName()); err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/integration/integrationv1/service_test.go b/lib/auth/integration/integrationv1/service_test.go index 5e8af860e5ffb..6bf73b4897157 100644 --- a/lib/auth/integration/integrationv1/service_test.go +++ b/lib/auth/integration/integrationv1/service_test.go @@ -24,6 +24,7 @@ import ( "github.com/google/uuid" "github.com/gravitational/trace" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" @@ -62,37 +63,44 @@ func TestIntegrationCRUD(t *testing.T) { return ig } + newGitHubIntegration := func(name, id, secret string) (*types.IntegrationV1, error) { + ig, err := types.NewIntegrationGitHub( + types.Metadata{ + Name: name, + }, + &types.GitHubIntegrationSpecV1{ + Organization: "my-org", + }, + ) + if err != nil { + return nil, trace.Wrap(err) + } + + if secret != "" { + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_IdSecret{ + IdSecret: &types.PluginIdSecretCredential{ + Id: id, + Secret: secret, + }, + }, + }) + } + return ig, nil + } + tt := []struct { Name string Role types.RoleSpecV6 Setup func(t *testing.T, igName string) Test func(ctx context.Context, resourceSvc *Service, igName string) error + Validate func(t *testing.T, igName string) Cleanup func(t *testing.T, igName string) ErrAssertion func(error) bool }{ // Read { Name: "allowed read access to integrations", - Role: types.RoleSpecV6{ - Allow: types.RoleConditions{Rules: []types.Rule{{ - Resources: []string{types.KindIntegration}, - Verbs: []string{types.VerbReadNoSecrets}, - }}}, - }, - Setup: func(t *testing.T, igName string) { - _, err := localClient.CreateIntegration(ctx, sampleIntegrationFn(t, igName)) - require.NoError(t, err) - }, - Test: func(ctx context.Context, resourceSvc *Service, igName string) error { - _, err := resourceSvc.GetIntegration(ctx, &integrationpb.GetIntegrationRequest{ - Name: igName, - }) - return err - }, - ErrAssertion: noError, - }, - { - Name: "allowed read access to integrations with secrets", Role: types.RoleSpecV6{ Allow: types.RoleConditions{Rules: []types.Rule{{ Resources: []string{types.KindIntegration}, @@ -105,8 +113,7 @@ func TestIntegrationCRUD(t *testing.T) { }, Test: func(ctx context.Context, resourceSvc *Service, igName string) error { _, err := resourceSvc.GetIntegration(ctx, &integrationpb.GetIntegrationRequest{ - Name: igName, - WithSecrets: true, + Name: igName, }) return err }, @@ -123,23 +130,6 @@ func TestIntegrationCRUD(t *testing.T) { }, ErrAssertion: trace.IsAccessDenied, }, - { - Name: "no access to read integrations with secrets", - Role: types.RoleSpecV6{ - Allow: types.RoleConditions{Rules: []types.Rule{{ - Resources: []string{types.KindIntegration}, - Verbs: []string{types.VerbReadNoSecrets}, - }}}, - }, - Test: func(ctx context.Context, resourceSvc *Service, igName string) error { - _, err := resourceSvc.GetIntegration(ctx, &integrationpb.GetIntegrationRequest{ - Name: igName, - WithSecrets: true, - }) - return err - }, - ErrAssertion: trace.IsAccessDenied, - }, { Name: "denied access to read integrations", Role: types.RoleSpecV6{ @@ -198,24 +188,6 @@ func TestIntegrationCRUD(t *testing.T) { }, ErrAssertion: trace.IsAccessDenied, }, - { - Name: "no list access to integrations with secrets", - Role: types.RoleSpecV6{ - Allow: types.RoleConditions{Rules: []types.Rule{{ - Resources: []string{types.KindIntegration}, - Verbs: []string{types.VerbList, types.VerbReadNoSecrets}, - }}}, - }, - Test: func(ctx context.Context, resourceSvc *Service, igName string) error { - _, err := resourceSvc.ListIntegrations(ctx, &integrationpb.ListIntegrationsRequest{ - Limit: 0, - NextKey: "", - WithSecrets: true, - }) - return err - }, - ErrAssertion: trace.IsAccessDenied, - }, // Create { @@ -244,7 +216,7 @@ func TestIntegrationCRUD(t *testing.T) { ErrAssertion: noError, }, { - Name: "create github integrations with generated CAs", + Name: "create github integrations", Role: types.RoleSpecV6{ Allow: types.RoleConditions{Rules: []types.Rule{{ Resources: []string{types.KindIntegration}, @@ -252,30 +224,16 @@ func TestIntegrationCRUD(t *testing.T) { }}}, }, Test: func(ctx context.Context, resourceSvc *Service, igName string) error { - ig, err := types.NewIntegrationGitHub( - types.Metadata{Name: igName}, - &types.GitHubIntegrationSpecV1{ - Organization: "my-org", - }, - ) + ig, err := newGitHubIntegration(igName, "id", "secret") if err != nil { return trace.Wrap(err) } - created, err := resourceSvc.CreateIntegration(ctx, &integrationpb.CreateIntegrationRequest{Integration: ig}) - if err != nil { - return trace.Wrap(err) - } - spec := created.GetGitHubIntegrationSpec() - if spec == nil || spec.Proxy == nil || len(spec.Proxy.CertAuthorities) == 0 { - return trace.BadParameter("missing CAs") - } - for _, ca := range spec.Proxy.CertAuthorities { - if len(ca.PublicKey) == 0 || len(ca.PrivateKey) == 0 { - return trace.BadParameter("missing CA keys") - } - } - return nil + _, err = resourceSvc.CreateIntegration(ctx, &integrationpb.CreateIntegrationRequest{Integration: ig}) + return trace.Wrap(err) + }, + Validate: func(t *testing.T, igName string) { + mustFindGitHubCredentials(t, localClient, igName, "id", "secret") }, ErrAssertion: noError, }, @@ -310,6 +268,66 @@ func TestIntegrationCRUD(t *testing.T) { }, ErrAssertion: noError, }, + { + Name: "credentials updated", + Role: types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbUpdate, types.VerbCreate}, + }}}, + }, + Test: func(ctx context.Context, resourceSvc *Service, igName string) error { + oldIg, err := newGitHubIntegration(igName, "id", "secret") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.CreateIntegration(ctx, &integrationpb.CreateIntegrationRequest{Integration: oldIg}) + if err != nil { + return trace.Wrap(err) + } + + newIg, err := newGitHubIntegration(igName, "new-id", "new-secret") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.UpdateIntegration(ctx, &integrationpb.UpdateIntegrationRequest{Integration: newIg}) + return err + }, + Validate: func(t *testing.T, igName string) { + mustFindGitHubCredentials(t, localClient, igName, "new-id", "new-secret") + }, + ErrAssertion: noError, + }, + { + Name: "credentials preserved", + Role: types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbUpdate, types.VerbCreate}, + }}}, + }, + Test: func(ctx context.Context, resourceSvc *Service, igName string) error { + oldIg, err := newGitHubIntegration(igName, "id", "secret") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.CreateIntegration(ctx, &integrationpb.CreateIntegrationRequest{Integration: oldIg}) + if err != nil { + return trace.Wrap(err) + } + + newIg, err := newGitHubIntegration(igName, "", "") + if err != nil { + return trace.Wrap(err) + } + _, err = resourceSvc.UpdateIntegration(ctx, &integrationpb.UpdateIntegrationRequest{Integration: newIg}) + return err + }, + Validate: func(t *testing.T, igName string) { + mustFindGitHubCredentials(t, localClient, igName, "id", "secret") + }, + ErrAssertion: noError, + }, // Delete { @@ -413,6 +431,68 @@ func TestIntegrationCRUD(t *testing.T) { }, ErrAssertion: noError, }, + { + Name: "credentials are also deleted", + Role: types.RoleSpecV6{ + Allow: types.RoleConditions{Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbDelete}, + }}}, + }, + Setup: func(t *testing.T, igName string) { + t.Helper() + + ig := sampleIntegrationFn(t, igName) + refUUID := uuid.NewString() + ig.SetCredentials(&types.PluginCredentialsV1{ + Credentials: &types.PluginCredentialsV1_StaticCredentialsRef{ + StaticCredentialsRef: newStaticCredentialsRef(refUUID), + }, + }) + + _, err := localClient.CreateIntegration(ctx, ig) + require.NoError(t, err) + + // Save a fake credentials that can be found using igName. + cred := &types.PluginStaticCredentialsV1{ + ResourceHeader: types.ResourceHeader{ + Metadata: types.Metadata{ + Name: igName, + Labels: map[string]string{ + labelStaticCredentialsIntegration: refUUID, + labelStaticCredentialsPurpose: "test", + }, + }, + }, + Spec: &types.PluginStaticCredentialsSpecV1{ + Credentials: &types.PluginStaticCredentialsSpecV1_OAuthClientSecret{ + OAuthClientSecret: &types.PluginStaticCredentialsOAuthClientSecret{ + ClientId: "id", + ClientSecret: "secret", + }, + }, + }, + } + err = localClient.CreatePluginStaticCredentials(ctx, cred) + require.NoError(t, err) + + // double-check + staticCreds, err := localClient.GetPluginStaticCredentials(context.Background(), igName) + require.NoError(t, err) + require.NotNil(t, staticCreds) + }, + Test: func(ctx context.Context, resourceSvc *Service, igName string) error { + _, err := resourceSvc.DeleteIntegration(ctx, &integrationpb.DeleteIntegrationRequest{Name: igName}) + return err + }, + Validate: func(t *testing.T, igName string) { + t.Helper() + _, err := localClient.GetPluginStaticCredentials(context.Background(), igName) + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }, + ErrAssertion: noError, + }, // Delete all { @@ -447,6 +527,11 @@ func TestIntegrationCRUD(t *testing.T) { err := tc.Test(localCtx, resourceSvc, igName) require.True(t, tc.ErrAssertion(err), err) + + // Extra validation + if tc.Validate != nil { + tc.Validate(t, igName) + } }) } } @@ -479,13 +564,14 @@ func authorizerForDummyUser(t *testing.T, ctx context.Context, roleSpec types.Ro type localClient interface { CreateUser(ctx context.Context, user types.User) (types.User, error) CreateRole(ctx context.Context, role types.Role) (types.Role, error) - CreateIntegration(ctx context.Context, ig types.Integration) (types.Integration, error) GenerateDraftExternalAuditStorage(ctx context.Context, integrationName, region string) (*externalauditstorage.ExternalAuditStorage, error) DeleteDraftExternalAuditStorage(ctx context.Context) error PromoteToClusterExternalAuditStorage(ctx context.Context) error DisableClusterExternalAuditStorage(ctx context.Context) error CreatePlugin(ctx context.Context, plugin types.Plugin) error DeletePlugin(ctx context.Context, name string) error + services.PluginStaticCredentials + services.Integrations } type testClient struct { @@ -544,6 +630,16 @@ func initSvc(t *testing.T, ca types.CertAuthority, clusterName string, proxyPubl localResourceService, err := local.NewIntegrationsService(backend) require.NoError(t, err) + localCredService, err := local.NewPluginStaticCredentialsService(backend) + require.NoError(t, err) + + backendSvc := struct { + services.Integrations + services.PluginStaticCredentials + }{ + Integrations: localResourceService, + PluginStaticCredentials: localCredService, + } cacheResourceService, err := local.NewIntegrationsService(backend, local.WithIntegrationsServiceCacheMode(true)) require.NoError(t, err) @@ -560,7 +656,7 @@ func initSvc(t *testing.T, ca types.CertAuthority, clusterName string, proxyPubl } resourceSvc, err := NewService(&ServiceConfig{ - Backend: localResourceService, + Backend: backendSvc, Authorizer: authorizer, Cache: cache, KeyStoreManager: keystore.NewSoftwareKeystoreForTests(t), @@ -574,12 +670,14 @@ func initSvc(t *testing.T, ca types.CertAuthority, clusterName string, proxyPubl *local.ExternalAuditStorageService *local.IntegrationsService *local.PluginsService + *local.PluginStaticCredentialsService }{ - AccessService: roleSvc, - IdentityService: userSvc, - ExternalAuditStorageService: easSvc, - IntegrationsService: localResourceService, - PluginsService: pluginSvc, + AccessService: roleSvc, + IdentityService: userSvc, + ExternalAuditStorageService: easSvc, + IntegrationsService: localResourceService, + PluginsService: pluginSvc, + PluginStaticCredentialsService: localCredService, }, resourceSvc } @@ -670,3 +768,33 @@ func newPlugin(t *testing.T, integrationName string) *types.PluginV1 { }, } } + +func mustFindGitHubCredentials(t *testing.T, localClient Backend, igName, wantId, wantSecret string) { + t.Helper() + + ig, err := localClient.GetIntegration(context.Background(), igName) + require.NoError(t, err) + + creds := ig.GetCredentials() + require.NotNil(t, creds) + require.NotNil(t, creds.GetStaticCredentialsRef()) + + staticCreds, err := localClient.GetPluginStaticCredentialsByLabels(context.Background(), creds.GetStaticCredentialsRef().Labels) + require.NoError(t, err) + require.Len(t, staticCreds, 2) + + var seenSSHCA, seenOAuth bool + for _, cred := range staticCreds { + if len(cred.GetSSHCertAuthorities()) != 0 { + seenSSHCA = true + continue + } + if id, secret := cred.GetOAuthClientSecret(); id != "" { + assert.Equal(t, wantId, id) + assert.Equal(t, wantSecret, secret) + seenOAuth = true + } + } + assert.True(t, seenSSHCA) + assert.True(t, seenOAuth) +}