diff --git a/.golangci.yml b/.golangci.yml index f254119212d6f..63bc28550550a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -113,6 +113,8 @@ linters: deny: - pkg: github.com/gravitational/teleport/integration desc: integration test should not be imported outside of intergation tests + - pkg: github.com/gravitational/teleport/lib/utils/mcptest + desc: testing packages should not be imported outside of _test.go files logging: deny: - pkg: github.com/sirupsen/logrus @@ -213,6 +215,7 @@ linters: - '!**/lib/services/suite/**' - '!**/lib/tbot/workloadidentity/workloadattest/sigstore/sigstoretest/sigstoretest.go' - '!**/lib/teleterm/gatewaytest/**' + - '!**/lib/utils/mcptest/**' - '!**/lib/utils/testutils/**' - '!**/integration/appaccess/fixtures.go' - '!**/integration/appaccess/jwt.go' @@ -272,6 +275,7 @@ linters: - '!**/lib/tbot/workloadidentity/workloadattest/sigstore/sigstoretest/sigstoretest.go' - '!**/lib/teleterm/gatewaytest/**' - '!**/lib/utils/cli.go' + - '!**/lib/utils/mcptest/**' - '!**/lib/utils/testutils/**' - '!**/tool/teleport/testenv/**' deny: diff --git a/api/constants/constants.go b/api/constants/constants.go index d8a3f5fb8c633..140cea0bfd374 100644 --- a/api/constants/constants.go +++ b/api/constants/constants.go @@ -417,6 +417,9 @@ const ( // TraitGitHubOrgs is the name of the variable to specify the GitHub // organizations for GitHub integration. TraitGitHubOrgs = "github_orgs" + // TraitMCPTools is the name of the variable to specify the MCP tools for + // MCP servers. + TraitMCPTools = "mcp_tools" ) const ( diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 92f0a7f58f05c..7e884fb0ed733 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4809,6 +4809,10 @@ message OneOf { events.AutoUpdateAgentRolloutTrigger AutoUpdateAgentRolloutTrigger = 213; events.AutoUpdateAgentRolloutForceDone AutoUpdateAgentRolloutForceDone = 214; events.AutoUpdateAgentRolloutRollback AutoUpdateAgentRolloutRollback = 215; + events.MCPSessionStart MCPSessionStart = 216; + events.MCPSessionEnd MCPSessionEnd = 217; + events.MCPSessionRequest MCPSessionRequest = 218; + events.MCPSessionNotification MCPSessionNotification = 219; } } @@ -8518,3 +8522,172 @@ message SigstorePolicyDelete { (gogoproto.jsontag) = "" ]; } + +// MCPSessionStart is emitted when a user starts a MCP session. +message MCPSessionStart { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // User is a common user event metadata + UserMetadata User = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // SessionMetadata is a common event session metadata + SessionMetadata Session = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // ServerMetadata is a common server metadata + ServerMetadata Server = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // App is a common application resource metadata. + AppMetadata App = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// MCPSessionEnd is emitted when an MCP session ends. +message MCPSessionEnd { + // Metadata is a common event metadata + Metadata Metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // User is a common user event metadata + UserMetadata User = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // SessionMetadata is a common event session metadata + SessionMetadata Session = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // ServerMetadata is a common server metadata + ServerMetadata Server = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // ConnectionMetadata holds information about the connection + ConnectionMetadata Connection = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // App is a common application resource metadata. + AppMetadata App = 6 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; +} + +// MCPJSONRPCMessage includes details of a MCP request or notification. +// https://modelcontextprotocol.io/docs/concepts/transports#requests +message MCPJSONRPCMessage { + // JSONRPC specifies the version of the protocol. + string JSONRPC = 1 [(gogoproto.jsontag) = "jsonrpc"]; + // ID is the ID of a request. Notifications have no IDs. + string ID = 2 [(gogoproto.jsontag) = "id,omitempty"]; + // Method is the method of this message. + string method = 3 [(gogoproto.jsontag) = "method"]; + // Params is the optional parameters. + google.protobuf.Struct params = 5 [ + (gogoproto.jsontag) = "params,omitempty", + (gogoproto.casttype) = "Struct" + ]; +} + +// MCPSessionRequest is emitted when a request is sent by client during a MCP session. +message MCPSessionRequest { + // Metadata is a common event metadata + Metadata metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // User is a common user event metadata + UserMetadata user = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // SessionMetadata is a common event session metadata + SessionMetadata session = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // App is a common application resource metadata. + AppMetadata App = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // Status contains information whether the request is successful or not. + Status status = 5 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // Message contains details of the message. + MCPJSONRPCMessage message = 6 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "message,omitempty" + ]; +} + +// MCPSessionNotification is emitted when a notification is sent by client +// during a MCP session. +message MCPSessionNotification { + // Metadata is a common event metadata + Metadata metadata = 1 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // User is a common user event metadata + UserMetadata user = 2 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // SessionMetadata is a common event session metadata + SessionMetadata session = 3 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // App is a common application resource metadata. + AppMetadata App = 4 [ + (gogoproto.nullable) = false, + (gogoproto.embed) = true, + (gogoproto.jsontag) = "" + ]; + // Message contains details of the message. + MCPJSONRPCMessage message = 5 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "message,omitempty" + ]; +} diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 22a7f419a5df9..ced8523db48ec 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -1122,6 +1122,19 @@ message AppSpecV3 { // want the app to be accessible from any of them. If `public_addr` is explicitly set in the app spec, // setting this value to true will overwrite that public address in the web UI. bool UseAnyProxyPublicAddr = 14 [(gogoproto.jsontag) = "use_any_proxy_public_addr,omitempty"]; + // MCP contains MCP server related configurations. + MCP MCP = 15 [(gogoproto.jsontag) = "mcp,omitempty"]; +} + +// MCP contains MCP server-related configurations. +message MCP { + // Command to launch stdio-based MCP servers. + string command = 1; + // Args to execute with the command. + repeated string args = 2; + // RunAsHostUser is the host user account under which the command will be + // executed. Required for stdio-based MCP servers. + string run_as_host_user = 3; } // Rewrite is a list of rewriting rules to apply to requests and responses. @@ -3800,6 +3813,9 @@ message RoleConditions { // WorkloadIdentityLabelsExpression is a predicate expression used to // allow/deny access to issuing a WorkloadIdentity. string WorkloadIdentityLabelsExpression = 45 [(gogoproto.jsontag) = "workload_identity_labels_expression,omitempty"]; + + // MCPPermissions defines MCP servers related permissions. + MCPPermissions MCP = 46 [(gogoproto.jsontag) = "mcp,omitempty"]; } // IdentityCenterAccountAssignment captures an AWS Identity Center account @@ -3814,6 +3830,15 @@ message GitHubPermission { repeated string organizations = 1 [(gogoproto.jsontag) = "orgs,omitempty"]; } +// MCPPermissions defines MCP servers related permissions. +message MCPPermissions { + // Tools defines the list of tools allowed or denied for this role. Each entry + // can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular + // expression (must start with '^' and end with '$'). If the list is empty, no + // tools are allowed. + repeated string tools = 1; +} + // SPIFFERoleCondition sets out which SPIFFE identities this role is allowed or // denied to generate. The Path matcher is required, and is evaluated first. If, // the Path does not match then the other matcher fields are not evaluated. diff --git a/api/types/app.go b/api/types/app.go index 790c43c4a4691..0ddf8512f988f 100644 --- a/api/types/app.go +++ b/api/types/app.go @@ -18,6 +18,7 @@ package types import ( "fmt" + "iter" "net/url" "slices" "strconv" @@ -70,6 +71,8 @@ type Application interface { IsGCP() bool // IsTCP returns true if this app represents a TCP endpoint. IsTCP() bool + // IsMCP returns true if this app represents a MCP server. + IsMCP() bool // GetProtocol returns the application protocol. GetProtocol() string // GetAWSAccountID returns value of label containing AWS account ID on this app. @@ -101,6 +104,8 @@ type Application interface { SetTCPPorts([]*PortRange) // GetIdentityCenter fetches identity center info for the app, if any. GetIdentityCenter() *AppIdentityCenter + // GetMCP fetches MCP specific configuration. + GetMCP() *MCP } // NewAppV3 creates a new app resource. @@ -286,15 +291,28 @@ func (a *AppV3) IsTCP() bool { return IsAppTCP(a.Spec.URI) } +// IsMCP returns true if provided uri is an MCP app. +func (a *AppV3) IsMCP() bool { + return IsAppMCP(a.Spec.URI) +} + func IsAppTCP(uri string) bool { return strings.HasPrefix(uri, "tcp://") } +// IsAppMCP returns true if provided uri is an MCP app. +func IsAppMCP(uri string) bool { + return GetMCPServerTransportType(uri) != "" +} + // GetProtocol returns the application protocol. func (a *AppV3) GetProtocol() string { if a.IsTCP() { return "TCP" } + if a.IsMCP() { + return "MCP" + } return "HTTP" } @@ -400,10 +418,14 @@ func (a *AppV3) CheckAndSetDefaults() error { return trace.BadParameter("app %q invalid label key: %q", a.GetName(), key) } } + if a.Spec.URI == "" { - if a.Spec.Cloud != "" { + switch { + case a.Spec.Cloud != "": a.Spec.URI = fmt.Sprintf("cloud://%v", a.Spec.Cloud) - } else { + case a.Spec.MCP != nil && a.Spec.MCP.Command != "": + a.Spec.URI = SchemaMCPStdio + default: return trace.BadParameter("app %q URI is empty", a.GetName()) } } @@ -453,6 +475,13 @@ func (a *AppV3) CheckAndSetDefaults() error { } } + if a.IsMCP() { + a.SetSubKind(SubKindMCP) + if err := a.checkMCP(); err != nil { + return trace.Wrap(err) + } + } + return nil } @@ -486,6 +515,32 @@ func (a *AppV3) checkTCPPorts() error { return nil } +func (a *AppV3) checkMCP() error { + switch GetMCPServerTransportType(a.Spec.URI) { + case MCPTransportStdio: + return trace.Wrap(a.checkMCPStdio()) + default: + return trace.BadParameter("unsupported MCP server %q with URI %q", a.GetName(), a.Spec.URI) + } +} + +func (a *AppV3) checkMCPStdio() error { + // Skip validation for internal demo resource. + if resourceType, _ := a.GetLabel(TeleportInternalResourceType); resourceType == DemoResource { + return nil + } + if a.Spec.MCP == nil { + return trace.BadParameter("MCP server %q is missing 'mcp' spec", a.GetName()) + } + if a.Spec.MCP.Command == "" { + return trace.BadParameter("MCP server %q is missing 'command' which specifies the executable to launch the MCP server. Arguments should be specified through the 'args' field", a.GetName()) + } + if a.Spec.MCP.RunAsHostUser == "" { + return trace.BadParameter("MCP server %q is missing 'run_as_host_user' which specifies a valid host user to execute the command", a.GetName()) + } + return nil +} + // GetIdentityCenter returns the Identity Center information for the app, if any. // May be nil. func (a *AppV3) GetIdentityCenter() *AppIdentityCenter { @@ -511,20 +566,34 @@ func (a *AppV3) IsEqual(i Application) bool { return false } +// GetMCP returns MCP specific configuration. +func (a *AppV3) GetMCP() *MCP { + return a.Spec.MCP +} + // DeduplicateApps deduplicates apps by combination of app name and public address. // Apps can have the same name but also could have different addresses. -func DeduplicateApps(apps []Application) (result []Application) { +func DeduplicateApps(apps []Application) []Application { + return slices.Collect(DeduplicatedApps(slices.Values(apps))) +} + +// DeduplicatedApps iterates deduplicated apps by combination of app name and +// public address. This is the iter.Seq version of DeduplicateApps. +func DeduplicatedApps(apps iter.Seq[Application]) iter.Seq[Application] { type key struct{ name, addr string } seen := make(map[key]struct{}) - for _, app := range apps { - key := key{app.GetName(), app.GetPublicAddr()} - if _, ok := seen[key]; ok { - continue + return func(yield func(Application) bool) { + for app := range apps { + key := key{app.GetName(), app.GetPublicAddr()} + if _, ok := seen[key]; ok { + continue + } + seen[key] = struct{}{} + if !yield(app) { + return + } } - seen[key] = struct{}{} - result = append(result, app) } - return result } // Apps is a list of app resources. @@ -596,3 +665,15 @@ func (p *PortRange) String() string { return fmt.Sprintf("%d-%d", p.Port, p.EndPort) } } + +// GetMCPServerTransportType returns the transport of the MCP server based on +// the URI. If no MCP transport type can be determined from the URI, an empty +// string is returned. +func GetMCPServerTransportType(uri string) string { + switch { + case strings.HasPrefix(uri, SchemaMCPStdio): + return MCPTransportStdio + default: + return "" + } +} diff --git a/api/types/app_test.go b/api/types/app_test.go index b4b57c0023e4c..3d47af4ad11b4 100644 --- a/api/types/app_test.go +++ b/api/types/app_test.go @@ -18,6 +18,7 @@ package types import ( "fmt" + "slices" "strconv" "testing" @@ -603,6 +604,88 @@ func TestNewAppV3(t *testing.T) { want: nil, wantErr: require.Error, }, + { + name: "mcp with command", + meta: Metadata{ + Name: "mcp-everything", + }, + spec: AppSpecV3{ + MCP: &MCP{ + Command: "docker", + Args: []string{"run", "-i", "--rm", "mcp/everything"}, + RunAsHostUser: "docker", + }, + }, + want: &AppV3{ + Kind: "app", + SubKind: "mcp", + Version: "v3", + Metadata: Metadata{ + Name: "mcp-everything", + Namespace: "default", + }, + Spec: AppSpecV3{ + URI: "mcp+stdio://", + MCP: &MCP{ + Command: "docker", + Args: []string{"run", "-i", "--rm", "mcp/everything"}, + RunAsHostUser: "docker", + }, + }, + }, + wantErr: require.NoError, + }, + { + name: "mcp missing spec", + meta: Metadata{ + Name: "mcp-missing-run-as", + }, + spec: AppSpecV3{ + URI: "mcp+stdio://", + }, + wantErr: require.Error, + }, + { + name: "mcp missing run_as_host_user", + meta: Metadata{ + Name: "mcp-missing-spec", + }, + spec: AppSpecV3{ + MCP: &MCP{ + Command: "docker", + Args: []string{"run", "-i", "--rm", "mcp/everything"}, + }, + }, + wantErr: require.Error, + }, + { + name: "mcp demo", + meta: Metadata{ + Name: "teleport-mcp-demo", + Labels: map[string]string{ + TeleportInternalResourceType: DemoResource, + }, + }, + spec: AppSpecV3{ + URI: "mcp+stdio://teleport-mcp-demo", + }, + want: &AppV3{ + Kind: "app", + SubKind: "mcp", + Version: "v3", + Metadata: Metadata{ + Name: "teleport-mcp-demo", + Namespace: "default", + Labels: map[string]string{ + TeleportInternalResourceType: DemoResource, + }, + }, + Spec: AppSpecV3{ + URI: "mcp+stdio://teleport-mcp-demo", + }, + }, + wantErr: require.NoError, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -658,3 +741,43 @@ func hasErrAndContains(msg string) require.ErrorAssertionFunc { require.ErrorContains(t, err, msg, msgAndArgs...) } } + +func TestGetMCPServerTransportType(t *testing.T) { + tests := []struct { + name string + uri string + want string + }{ + { + name: "stdio", + uri: "mcp+stdio://", + want: MCPTransportStdio, + }, + { + name: "unknown", + uri: "http://localhost", + want: "", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + require.Equal(t, tt.want, GetMCPServerTransportType(tt.uri)) + }) + } +} + +func TestDeduplicateApps(t *testing.T) { + var apps []Application + for _, name := range []string{"a", "b", "c", "b", "a", "d"} { + app_, err := NewAppV3(Metadata{ + Name: name, + }, AppSpecV3{ + URI: "localhost:3080", + }) + require.NoError(t, err) + apps = append(apps, app_) + } + + deduped := DeduplicateApps(apps) + require.Equal(t, []string{"a", "b", "c", "d"}, slices.Collect(ResourceNames(deduped))) +} diff --git a/api/types/appserver.go b/api/types/appserver.go index f2094e25391af..449b7ce98610a 100644 --- a/api/types/appserver.go +++ b/api/types/appserver.go @@ -18,6 +18,8 @@ package types import ( "fmt" + "iter" + "slices" "sort" "time" @@ -26,6 +28,7 @@ import ( "github.com/gravitational/teleport/api" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/teleport/api/utils/iterutils" ) // AppServer represents a single proxied web app. @@ -409,3 +412,10 @@ func (s AppServers) GetFieldVals(field string) ([]string, error) { return vals, nil } + +// Applications iterates over the applications that the AppServers proxy. +func (s AppServers) Applications() iter.Seq[Application] { + return iterutils.Map(func(appServer AppServer) Application { + return appServer.GetApp() + }, slices.Values(s)) +} diff --git a/api/types/constants.go b/api/types/constants.go index 36f390d7e1ed9..3bffd1465612a 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -180,6 +180,14 @@ const ( // KindApp is a web app resource. KindApp = "app" + // SubKindMCP represents an MCP server as a subkind of app. + SubKindMCP = KindMCP + + // KindMCP is an MCP server resource. + // Currently, MCP servers are accessed through apps. + // In the future, they may become a standalone resource kind. + KindMCP = "mcp" + // KindDatabaseServer is a database proxy server resource. KindDatabaseServer = "db_server" @@ -907,6 +915,11 @@ const ( // CloudGCP identifies that a resource was discovered in GCP. CloudGCP = "GCP" + // SchemaMCPStdio is a URI schema for MCP servers using stdio transport. + SchemaMCPStdio = "mcp+stdio://" + // MCPTransportStdio indicates the MCP server uses stdio transport. + MCPTransportStdio = "stdio" + // DiscoveredResourceNode identifies a discovered SSH node. DiscoveredResourceNode = "node" // DiscoveredResourceDatabase identifies a discovered database. @@ -1132,10 +1145,15 @@ const ( // should not change these resources. SystemResource = "system" - // PresetResource are resources resources will be created if they don't exist. Updates may be applied + // PresetResource are resources that will be created if they don't exist. Updates may be applied // to them, but user changes to these resources will be preserved. PresetResource = "preset" + // DemoResource are resources that demonstrates specific Teleport features. + // These resources are typically managed internally by Teleport and enabled + // via flags. Users should not change these resources. + DemoResource = "demo" + // ProxyGroupIDLabel is the internal-use label for proxy heartbeats that's // used by reverse tunnel agents to keep track of multiple independent sets // of proxies in proxy peering mode. diff --git a/api/types/derived.gen.go b/api/types/derived.gen.go index 932217f61bb8d..c339772cba44c 100644 --- a/api/types/derived.gen.go +++ b/api/types/derived.gen.go @@ -197,7 +197,8 @@ func deriveTeleportEqual(this, that *AppSpecV3) bool { deriveTeleportEqual_22(this.CORS, that.CORS) && deriveTeleportEqual_23(this.IdentityCenter, that.IdentityCenter) && deriveTeleportEqual_24(this.TCPPorts, that.TCPPorts) && - this.UseAnyProxyPublicAddr == that.UseAnyProxyPublicAddr + this.UseAnyProxyPublicAddr == that.UseAnyProxyPublicAddr && + deriveTeleportEqual_25(this.MCP, that.MCP) } // deriveTeleportEqual_ returns whether this and that are equal. @@ -322,12 +323,12 @@ func deriveTeleportEqual_11(this, that *DatabaseSpecV3) bool { deriveTeleportEqualAWS(&this.AWS, &that.AWS) && deriveTeleportEqualGCPCloudSQL(&this.GCP, &that.GCP) && deriveTeleportEqualAzure(&this.Azure, &that.Azure) && - deriveTeleportEqual_25(&this.TLS, &that.TLS) && - deriveTeleportEqual_26(&this.AD, &that.AD) && - deriveTeleportEqual_27(&this.MySQL, &that.MySQL) && - deriveTeleportEqual_28(this.AdminUser, that.AdminUser) && - deriveTeleportEqual_29(&this.MongoAtlas, &that.MongoAtlas) && - deriveTeleportEqual_30(&this.Oracle, &that.Oracle) + deriveTeleportEqual_26(&this.TLS, &that.TLS) && + deriveTeleportEqual_27(&this.AD, &that.AD) && + deriveTeleportEqual_28(&this.MySQL, &that.MySQL) && + deriveTeleportEqual_29(this.AdminUser, that.AdminUser) && + deriveTeleportEqual_30(&this.MongoAtlas, &that.MongoAtlas) && + deriveTeleportEqual_31(&this.Oracle, &that.Oracle) } // deriveTeleportEqual_12 returns whether this and that are equal. @@ -337,7 +338,7 @@ func deriveTeleportEqual_12(this, that *DynamicWindowsDesktopSpecV1) bool { this.Addr == that.Addr && this.Domain == that.Domain && this.NonAD == that.NonAD && - deriveTeleportEqual_31(this.ScreenSize, that.ScreenSize) + deriveTeleportEqual_32(this.ScreenSize, that.ScreenSize) } // deriveTeleportEqual_13 returns whether this and that are equal. @@ -348,7 +349,7 @@ func deriveTeleportEqual_13(this, that *WindowsDesktopSpecV3) bool { this.Domain == that.Domain && this.HostID == that.HostID && this.NonAD == that.NonAD && - deriveTeleportEqual_31(this.ScreenSize, that.ScreenSize) + deriveTeleportEqual_32(this.ScreenSize, that.ScreenSize) } // deriveTeleportEqual_14 returns whether this and that are equal. @@ -369,7 +370,7 @@ func deriveTeleportEqual_15(this, that *KubernetesServerSpecV3) bool { this.Version == that.Version && this.Hostname == that.Hostname && this.HostID == that.HostID && - deriveTeleportEqual_32(&this.Rotation, &that.Rotation) && + deriveTeleportEqual_33(&this.Rotation, &that.Rotation) && deriveTeleportEqualKubernetesClusterV3(this.Cluster, that.Cluster) && deriveTeleportEqual_21(this.ProxyIDs, that.ProxyIDs) } @@ -379,7 +380,7 @@ func deriveTeleportEqual_16(this, that *OktaAssignmentSpecV1) bool { return (this == nil && that == nil) || this != nil && that != nil && this.User == that.User && - deriveTeleportEqual_33(this.Targets, that.Targets) && + deriveTeleportEqual_34(this.Targets, that.Targets) && this.CleanupTime.Equal(that.CleanupTime) && this.Status == that.Status && this.LastTransition.Equal(that.LastTransition) && @@ -406,7 +407,7 @@ func deriveTeleportEqual_18(this, that map[string]CommandLabelV2) bool { if !ok { return false } - if !(deriveTeleportEqual_34(&v, &thatv)) { + if !(deriveTeleportEqual_35(&v, &thatv)) { return false } } @@ -418,7 +419,7 @@ func deriveTeleportEqual_19(this, that *Rewrite) bool { return (this == nil && that == nil) || this != nil && that != nil && deriveTeleportEqual_21(this.Redirect, that.Redirect) && - deriveTeleportEqual_35(this.Headers, that.Headers) && + deriveTeleportEqual_36(this.Headers, that.Headers) && this.JWTClaims == that.JWTClaims } @@ -427,7 +428,7 @@ func deriveTeleportEqual_20(this, that *AppAWS) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ExternalID == that.ExternalID && - deriveTeleportEqual_36(this.RolesAnywhereProfile, that.RolesAnywhereProfile) + deriveTeleportEqual_37(this.RolesAnywhereProfile, that.RolesAnywhereProfile) } // deriveTeleportEqual_21 returns whether this and that are equal. @@ -463,7 +464,7 @@ func deriveTeleportEqual_23(this, that *AppIdentityCenter) bool { return (this == nil && that == nil) || this != nil && that != nil && this.AccountID == that.AccountID && - deriveTeleportEqual_37(this.PermissionSets, that.PermissionSets) + deriveTeleportEqual_38(this.PermissionSets, that.PermissionSets) } // deriveTeleportEqual_24 returns whether this and that are equal. @@ -475,7 +476,7 @@ func deriveTeleportEqual_24(this, that []*PortRange) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_38(this[i], that[i])) { + if !(deriveTeleportEqual_39(this[i], that[i])) { return false } } @@ -483,7 +484,16 @@ func deriveTeleportEqual_24(this, that []*PortRange) bool { } // deriveTeleportEqual_25 returns whether this and that are equal. -func deriveTeleportEqual_25(this, that *DatabaseTLS) bool { +func deriveTeleportEqual_25(this, that *MCP) bool { + return (this == nil && that == nil) || + this != nil && that != nil && + this.Command == that.Command && + deriveTeleportEqual_21(this.Args, that.Args) && + this.RunAsHostUser == that.RunAsHostUser +} + +// deriveTeleportEqual_26 returns whether this and that are equal. +func deriveTeleportEqual_26(this, that *DatabaseTLS) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Mode == that.Mode && @@ -492,8 +502,8 @@ func deriveTeleportEqual_25(this, that *DatabaseTLS) bool { this.TrustSystemCertPool == that.TrustSystemCertPool } -// deriveTeleportEqual_26 returns whether this and that are equal. -func deriveTeleportEqual_26(this, that *AD) bool { +// deriveTeleportEqual_27 returns whether this and that are equal. +func deriveTeleportEqual_27(this, that *AD) bool { return (this == nil && that == nil) || this != nil && that != nil && this.KeytabFile == that.KeytabFile && @@ -506,45 +516,45 @@ func deriveTeleportEqual_26(this, that *AD) bool { this.LDAPServiceAccountSID == that.LDAPServiceAccountSID } -// deriveTeleportEqual_27 returns whether this and that are equal. -func deriveTeleportEqual_27(this, that *MySQLOptions) bool { +// deriveTeleportEqual_28 returns whether this and that are equal. +func deriveTeleportEqual_28(this, that *MySQLOptions) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ServerVersion == that.ServerVersion } -// deriveTeleportEqual_28 returns whether this and that are equal. -func deriveTeleportEqual_28(this, that *DatabaseAdminUser) bool { +// deriveTeleportEqual_29 returns whether this and that are equal. +func deriveTeleportEqual_29(this, that *DatabaseAdminUser) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name && this.DefaultDatabase == that.DefaultDatabase } -// deriveTeleportEqual_29 returns whether this and that are equal. -func deriveTeleportEqual_29(this, that *MongoAtlas) bool { +// deriveTeleportEqual_30 returns whether this and that are equal. +func deriveTeleportEqual_30(this, that *MongoAtlas) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name } -// deriveTeleportEqual_30 returns whether this and that are equal. -func deriveTeleportEqual_30(this, that *OracleOptions) bool { +// deriveTeleportEqual_31 returns whether this and that are equal. +func deriveTeleportEqual_31(this, that *OracleOptions) bool { return (this == nil && that == nil) || this != nil && that != nil && this.AuditUser == that.AuditUser } -// deriveTeleportEqual_31 returns whether this and that are equal. -func deriveTeleportEqual_31(this, that *Resolution) bool { +// deriveTeleportEqual_32 returns whether this and that are equal. +func deriveTeleportEqual_32(this, that *Resolution) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Width == that.Width && this.Height == that.Height } -// deriveTeleportEqual_32 returns whether this and that are equal. -func deriveTeleportEqual_32(this, that *Rotation) bool { +// deriveTeleportEqual_33 returns whether this and that are equal. +func deriveTeleportEqual_33(this, that *Rotation) bool { return (this == nil && that == nil) || this != nil && that != nil && this.State == that.State && @@ -554,11 +564,11 @@ func deriveTeleportEqual_32(this, that *Rotation) bool { this.Started.Equal(that.Started) && this.GracePeriod == that.GracePeriod && this.LastRotated.Equal(that.LastRotated) && - deriveTeleportEqual_39(&this.Schedule, &that.Schedule) + deriveTeleportEqual_40(&this.Schedule, &that.Schedule) } -// deriveTeleportEqual_33 returns whether this and that are equal. -func deriveTeleportEqual_33(this, that []*OktaAssignmentTargetV1) bool { +// deriveTeleportEqual_34 returns whether this and that are equal. +func deriveTeleportEqual_34(this, that []*OktaAssignmentTargetV1) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -566,15 +576,15 @@ func deriveTeleportEqual_33(this, that []*OktaAssignmentTargetV1) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_40(this[i], that[i])) { + if !(deriveTeleportEqual_41(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_34 returns whether this and that are equal. -func deriveTeleportEqual_34(this, that *CommandLabelV2) bool { +// deriveTeleportEqual_35 returns whether this and that are equal. +func deriveTeleportEqual_35(this, that *CommandLabelV2) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Period == that.Period && @@ -582,8 +592,8 @@ func deriveTeleportEqual_34(this, that *CommandLabelV2) bool { this.Result == that.Result } -// deriveTeleportEqual_35 returns whether this and that are equal. -func deriveTeleportEqual_35(this, that []*Header) bool { +// deriveTeleportEqual_36 returns whether this and that are equal. +func deriveTeleportEqual_36(this, that []*Header) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -591,23 +601,23 @@ func deriveTeleportEqual_35(this, that []*Header) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_41(this[i], that[i])) { + if !(deriveTeleportEqual_42(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_36 returns whether this and that are equal. -func deriveTeleportEqual_36(this, that *AppAWSRolesAnywhereProfile) bool { +// deriveTeleportEqual_37 returns whether this and that are equal. +func deriveTeleportEqual_37(this, that *AppAWSRolesAnywhereProfile) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ProfileARN == that.ProfileARN && this.AcceptRoleSessionName == that.AcceptRoleSessionName } -// deriveTeleportEqual_37 returns whether this and that are equal. -func deriveTeleportEqual_37(this, that []*IdentityCenterPermissionSet) bool { +// deriveTeleportEqual_38 returns whether this and that are equal. +func deriveTeleportEqual_38(this, that []*IdentityCenterPermissionSet) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -615,23 +625,23 @@ func deriveTeleportEqual_37(this, that []*IdentityCenterPermissionSet) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_42(this[i], that[i])) { + if !(deriveTeleportEqual_43(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_38 returns whether this and that are equal. -func deriveTeleportEqual_38(this, that *PortRange) bool { +// deriveTeleportEqual_39 returns whether this and that are equal. +func deriveTeleportEqual_39(this, that *PortRange) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Port == that.Port && this.EndPort == that.EndPort } -// deriveTeleportEqual_39 returns whether this and that are equal. -func deriveTeleportEqual_39(this, that *RotationSchedule) bool { +// deriveTeleportEqual_40 returns whether this and that are equal. +func deriveTeleportEqual_40(this, that *RotationSchedule) bool { return (this == nil && that == nil) || this != nil && that != nil && this.UpdateClients.Equal(that.UpdateClients) && @@ -639,24 +649,24 @@ func deriveTeleportEqual_39(this, that *RotationSchedule) bool { this.Standby.Equal(that.Standby) } -// deriveTeleportEqual_40 returns whether this and that are equal. -func deriveTeleportEqual_40(this, that *OktaAssignmentTargetV1) bool { +// deriveTeleportEqual_41 returns whether this and that are equal. +func deriveTeleportEqual_41(this, that *OktaAssignmentTargetV1) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Type == that.Type && this.Id == that.Id } -// deriveTeleportEqual_41 returns whether this and that are equal. -func deriveTeleportEqual_41(this, that *Header) bool { +// deriveTeleportEqual_42 returns whether this and that are equal. +func deriveTeleportEqual_42(this, that *Header) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name && this.Value == that.Value } -// deriveTeleportEqual_42 returns whether this and that are equal. -func deriveTeleportEqual_42(this, that *IdentityCenterPermissionSet) bool { +// deriveTeleportEqual_43 returns whether this and that are equal. +func deriveTeleportEqual_43(this, that *IdentityCenterPermissionSet) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ARN == that.ARN && diff --git a/api/types/events/events.go b/api/types/events/events.go index d988a5ebcbfd4..36ca54eddcc6e 100644 --- a/api/types/events/events.go +++ b/api/types/events/events.go @@ -183,7 +183,7 @@ func (m *Struct) nonEmptyStrs() int { return toTrim } -func (m *Struct) trimToMaxSize(maxSize int) *Struct { +func (m *Struct) trimToMaxFieldSize(maxFieldSize int) *Struct { if len(m.Fields) == 0 { return m } @@ -194,11 +194,11 @@ func (m *Struct) trimToMaxSize(maxSize int) *Struct { }, } for k, v := range m.Fields { - trimmedKey := trimStr(k, maxSize) + trimmedKey := trimStr(k, maxFieldSize) if v != nil { if strVal := v.GetStringValue(); strVal != "" { - trimmedVal := trimStr(strVal, maxSize) + trimmedVal := trimStr(strVal, maxFieldSize) out.Fields[trimmedKey] = &types.Value{ Kind: &types.Value_StringValue{ StringValue: trimmedVal, @@ -207,7 +207,7 @@ func (m *Struct) trimToMaxSize(maxSize int) *Struct { } else if l := v.GetListValue(); l != nil { for i, lv := range l.Values { if strVal := lv.GetStringValue(); strVal != "" { - trimmedVal := trimStr(strVal, maxSize) + trimmedVal := trimStr(strVal, maxFieldSize) l.Values[i] = &types.Value{ Kind: &types.Value_StringValue{ StringValue: trimmedVal, @@ -510,7 +510,7 @@ func (m *AccessRequestCreate) TrimToMaxSize(maxSize int) AuditEvent { out.Roles = trimStrSlice(m.Roles, maxFieldsSize) out.Reason = trimStr(m.Reason, maxFieldsSize) - out.Annotations = m.Annotations.trimToMaxSize(maxFieldsSize) + out.Annotations = m.Annotations.trimToMaxFieldSize(maxFieldsSize) return out } @@ -815,7 +815,7 @@ func (m *AppSessionDynamoDBRequest) TrimToMaxSize(maxSize int) AuditEvent { out.Path = trimStr(m.Path, maxFieldsSize) out.RawQuery = trimStr(m.RawQuery, maxFieldsSize) out.Target = trimStr(m.Target, maxFieldsSize) - out.Body = m.Body.trimToMaxSize(maxFieldsSize) + out.Body = m.Body.trimToMaxFieldSize(maxFieldsSize) return out } @@ -1305,7 +1305,7 @@ func (m *DynamoDBRequest) TrimToMaxSize(maxSize int) AuditEvent { out.Path = trimStr(m.Path, maxFieldsSize) out.RawQuery = trimStr(m.RawQuery, maxFieldsSize) - out.Body = m.Body.trimToMaxSize(maxFieldsSize) + out.Body = m.Body.trimToMaxFieldSize(maxFieldsSize) out.Target = trimStr(m.Target, maxFieldsSize) return out @@ -1663,7 +1663,7 @@ func (m *BotJoin) TrimToMaxSize(maxSize int) AuditEvent { customFieldsCount := m.Attributes.nonEmptyStrs() maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) - out.Attributes = m.Attributes.trimToMaxSize(maxFieldsSize) + out.Attributes = m.Attributes.trimToMaxFieldSize(maxFieldsSize) return out } @@ -2161,7 +2161,7 @@ func (m *SpannerRPC) TrimToMaxSize(maxSize int) AuditEvent { out.Status = m.Status.trimToMaxSize(maxFieldsSize) out.Procedure = trimStr(m.Procedure, maxFieldsSize) - out.Args = m.Args.trimToMaxSize(maxFieldsSize) + out.Args = m.Args.trimToMaxFieldSize(maxFieldsSize) return out } @@ -2422,7 +2422,7 @@ func (m *WorkloadIdentityCreate) TrimToMaxSize(maxSize int) AuditEvent { customFieldsCount := m.WorkloadIdentityData.nonEmptyStrs() maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) - out.WorkloadIdentityData = m.WorkloadIdentityData.trimToMaxSize(maxFieldsSize) + out.WorkloadIdentityData = m.WorkloadIdentityData.trimToMaxFieldSize(maxFieldsSize) return out } @@ -2441,7 +2441,7 @@ func (m *WorkloadIdentityUpdate) TrimToMaxSize(maxSize int) AuditEvent { customFieldsCount := m.WorkloadIdentityData.nonEmptyStrs() maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) - out.WorkloadIdentityData = m.WorkloadIdentityData.trimToMaxSize(maxFieldsSize) + out.WorkloadIdentityData = m.WorkloadIdentityData.trimToMaxFieldSize(maxFieldsSize) return out } @@ -2548,3 +2548,53 @@ func (m *SigstorePolicyUpdate) TrimToMaxSize(int) AuditEvent { func (m *SigstorePolicyDelete) TrimToMaxSize(int) AuditEvent { return m } + +func (m *MCPSessionStart) TrimToMaxSize(maxSize int) AuditEvent { + return m +} +func (m *MCPSessionEnd) TrimToMaxSize(maxSize int) AuditEvent { + return m +} + +func (m *MCPJSONRPCMessage) trimToMaxSize(maxSize int) MCPJSONRPCMessage { + if m == nil { + return MCPJSONRPCMessage{} + } + + out := MCPJSONRPCMessage{} + + customFieldsCount := nonEmptyStrs(m.JSONRPC, m.ID, m.Method) + m.Params.nonEmptyStrs() + maxFieldsSize := maxSizePerField(maxSize, customFieldsCount) + + out.JSONRPC = trimStr(m.JSONRPC, maxFieldsSize) + out.ID = trimStr(m.ID, maxFieldsSize) + out.Method = trimStr(m.Method, maxFieldsSize) + out.Params = m.Params.trimToMaxFieldSize(maxFieldsSize) + return out +} + +func (m *MCPSessionRequest) TrimToMaxSize(maxSize int) AuditEvent { + size := m.Size() + if size <= maxSize { + return m + } + + out := utils.CloneProtoMsg(m) + out.Message = MCPJSONRPCMessage{} + maxSize = adjustedMaxSize(out, maxSize) + out.Message = m.Message.trimToMaxSize(maxSize) + return out +} + +func (m *MCPSessionNotification) TrimToMaxSize(maxSize int) AuditEvent { + size := m.Size() + if size <= maxSize { + return m + } + + out := utils.CloneProtoMsg(m) + out.Message = MCPJSONRPCMessage{} + maxSize = adjustedMaxSize(out, maxSize) + out.Message = m.Message.trimToMaxSize(maxSize) + return out +} diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index a964b84ac1508..7f2ad0ed8f102 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -8097,6 +8097,10 @@ type OneOf struct { // *OneOf_AutoUpdateAgentRolloutTrigger // *OneOf_AutoUpdateAgentRolloutForceDone // *OneOf_AutoUpdateAgentRolloutRollback + // *OneOf_MCPSessionStart + // *OneOf_MCPSessionEnd + // *OneOf_MCPSessionRequest + // *OneOf_MCPSessionNotification Event isOneOf_Event `protobuf_oneof:"Event"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -8775,6 +8779,18 @@ type OneOf_AutoUpdateAgentRolloutForceDone struct { type OneOf_AutoUpdateAgentRolloutRollback struct { AutoUpdateAgentRolloutRollback *AutoUpdateAgentRolloutRollback `protobuf:"bytes,215,opt,name=AutoUpdateAgentRolloutRollback,proto3,oneof" json:"AutoUpdateAgentRolloutRollback,omitempty"` } +type OneOf_MCPSessionStart struct { + MCPSessionStart *MCPSessionStart `protobuf:"bytes,216,opt,name=MCPSessionStart,proto3,oneof" json:"MCPSessionStart,omitempty"` +} +type OneOf_MCPSessionEnd struct { + MCPSessionEnd *MCPSessionEnd `protobuf:"bytes,217,opt,name=MCPSessionEnd,proto3,oneof" json:"MCPSessionEnd,omitempty"` +} +type OneOf_MCPSessionRequest struct { + MCPSessionRequest *MCPSessionRequest `protobuf:"bytes,218,opt,name=MCPSessionRequest,proto3,oneof" json:"MCPSessionRequest,omitempty"` +} +type OneOf_MCPSessionNotification struct { + MCPSessionNotification *MCPSessionNotification `protobuf:"bytes,219,opt,name=MCPSessionNotification,proto3,oneof" json:"MCPSessionNotification,omitempty"` +} func (*OneOf_UserLogin) isOneOf_Event() {} func (*OneOf_UserCreate) isOneOf_Event() {} @@ -8987,6 +9003,10 @@ func (*OneOf_SigstorePolicyDelete) isOneOf_Event() {} func (*OneOf_AutoUpdateAgentRolloutTrigger) isOneOf_Event() {} func (*OneOf_AutoUpdateAgentRolloutForceDone) isOneOf_Event() {} func (*OneOf_AutoUpdateAgentRolloutRollback) isOneOf_Event() {} +func (*OneOf_MCPSessionStart) isOneOf_Event() {} +func (*OneOf_MCPSessionEnd) isOneOf_Event() {} +func (*OneOf_MCPSessionRequest) isOneOf_Event() {} +func (*OneOf_MCPSessionNotification) isOneOf_Event() {} func (m *OneOf) GetEvent() isOneOf_Event { if m != nil { @@ -10472,6 +10492,34 @@ func (m *OneOf) GetAutoUpdateAgentRolloutRollback() *AutoUpdateAgentRolloutRollb return nil } +func (m *OneOf) GetMCPSessionStart() *MCPSessionStart { + if x, ok := m.GetEvent().(*OneOf_MCPSessionStart); ok { + return x.MCPSessionStart + } + return nil +} + +func (m *OneOf) GetMCPSessionEnd() *MCPSessionEnd { + if x, ok := m.GetEvent().(*OneOf_MCPSessionEnd); ok { + return x.MCPSessionEnd + } + return nil +} + +func (m *OneOf) GetMCPSessionRequest() *MCPSessionRequest { + if x, ok := m.GetEvent().(*OneOf_MCPSessionRequest); ok { + return x.MCPSessionRequest + } + return nil +} + +func (m *OneOf) GetMCPSessionNotification() *MCPSessionNotification { + if x, ok := m.GetEvent().(*OneOf_MCPSessionNotification); ok { + return x.MCPSessionNotification + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*OneOf) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -10686,6 +10734,10 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_AutoUpdateAgentRolloutTrigger)(nil), (*OneOf_AutoUpdateAgentRolloutForceDone)(nil), (*OneOf_AutoUpdateAgentRolloutRollback)(nil), + (*OneOf_MCPSessionStart)(nil), + (*OneOf_MCPSessionEnd)(nil), + (*OneOf_MCPSessionRequest)(nil), + (*OneOf_MCPSessionNotification)(nil), } } @@ -16721,6 +16773,262 @@ func (m *SigstorePolicyDelete) XXX_DiscardUnknown() { var xxx_messageInfo_SigstorePolicyDelete proto.InternalMessageInfo +// MCPSessionStart is emitted when a user starts a MCP session. +type MCPSessionStart struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,2,opt,name=User,proto3,embedded=User" json:""` + // SessionMetadata is a common event session metadata + SessionMetadata `protobuf:"bytes,3,opt,name=Session,proto3,embedded=Session" json:""` + // ServerMetadata is a common server metadata + ServerMetadata `protobuf:"bytes,4,opt,name=Server,proto3,embedded=Server" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,5,opt,name=Connection,proto3,embedded=Connection" json:""` + // App is a common application resource metadata. + AppMetadata `protobuf:"bytes,6,opt,name=App,proto3,embedded=App" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MCPSessionStart) Reset() { *m = MCPSessionStart{} } +func (m *MCPSessionStart) String() string { return proto.CompactTextString(m) } +func (*MCPSessionStart) ProtoMessage() {} +func (*MCPSessionStart) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{262} +} +func (m *MCPSessionStart) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MCPSessionStart) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MCPSessionStart.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 *MCPSessionStart) XXX_Merge(src proto.Message) { + xxx_messageInfo_MCPSessionStart.Merge(m, src) +} +func (m *MCPSessionStart) XXX_Size() int { + return m.Size() +} +func (m *MCPSessionStart) XXX_DiscardUnknown() { + xxx_messageInfo_MCPSessionStart.DiscardUnknown(m) +} + +var xxx_messageInfo_MCPSessionStart proto.InternalMessageInfo + +// MCPSessionEnd is emitted when an MCP session ends. +type MCPSessionEnd struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,2,opt,name=User,proto3,embedded=User" json:""` + // SessionMetadata is a common event session metadata + SessionMetadata `protobuf:"bytes,3,opt,name=Session,proto3,embedded=Session" json:""` + // ServerMetadata is a common server metadata + ServerMetadata `protobuf:"bytes,4,opt,name=Server,proto3,embedded=Server" json:""` + // ConnectionMetadata holds information about the connection + ConnectionMetadata `protobuf:"bytes,5,opt,name=Connection,proto3,embedded=Connection" json:""` + // App is a common application resource metadata. + AppMetadata `protobuf:"bytes,6,opt,name=App,proto3,embedded=App" json:""` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MCPSessionEnd) Reset() { *m = MCPSessionEnd{} } +func (m *MCPSessionEnd) String() string { return proto.CompactTextString(m) } +func (*MCPSessionEnd) ProtoMessage() {} +func (*MCPSessionEnd) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{263} +} +func (m *MCPSessionEnd) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MCPSessionEnd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MCPSessionEnd.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 *MCPSessionEnd) XXX_Merge(src proto.Message) { + xxx_messageInfo_MCPSessionEnd.Merge(m, src) +} +func (m *MCPSessionEnd) XXX_Size() int { + return m.Size() +} +func (m *MCPSessionEnd) XXX_DiscardUnknown() { + xxx_messageInfo_MCPSessionEnd.DiscardUnknown(m) +} + +var xxx_messageInfo_MCPSessionEnd proto.InternalMessageInfo + +// MCPJSONRPCMessage includes details of a MCP request or notification. +// https://modelcontextprotocol.io/docs/concepts/transports#requests +type MCPJSONRPCMessage struct { + // JSONRPC specifies the version of the protocol. + JSONRPC string `protobuf:"bytes,1,opt,name=JSONRPC,proto3" json:"jsonrpc"` + // ID is the ID of a request. Notifications have no IDs. + ID string `protobuf:"bytes,2,opt,name=ID,proto3" json:"id,omitempty"` + // Method is the method of this message. + Method string `protobuf:"bytes,3,opt,name=method,proto3" json:"method"` + // Params is the optional parameters. + Params *Struct `protobuf:"bytes,5,opt,name=params,proto3,casttype=Struct" json:"params,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MCPJSONRPCMessage) Reset() { *m = MCPJSONRPCMessage{} } +func (m *MCPJSONRPCMessage) String() string { return proto.CompactTextString(m) } +func (*MCPJSONRPCMessage) ProtoMessage() {} +func (*MCPJSONRPCMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{264} +} +func (m *MCPJSONRPCMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MCPJSONRPCMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MCPJSONRPCMessage.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 *MCPJSONRPCMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_MCPJSONRPCMessage.Merge(m, src) +} +func (m *MCPJSONRPCMessage) XXX_Size() int { + return m.Size() +} +func (m *MCPJSONRPCMessage) XXX_DiscardUnknown() { + xxx_messageInfo_MCPJSONRPCMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_MCPJSONRPCMessage proto.InternalMessageInfo + +// MCPSessionRequest is emitted when a request is sent by client during a MCP session. +type MCPSessionRequest struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=metadata,proto3,embedded=metadata" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,2,opt,name=user,proto3,embedded=user" json:""` + // SessionMetadata is a common event session metadata + SessionMetadata `protobuf:"bytes,3,opt,name=session,proto3,embedded=session" json:""` + // App is a common application resource metadata. + AppMetadata `protobuf:"bytes,4,opt,name=App,proto3,embedded=App" json:""` + // Status contains information whether the request is successful or not. + Status `protobuf:"bytes,5,opt,name=status,proto3,embedded=status" json:""` + // Message contains details of the message. + Message MCPJSONRPCMessage `protobuf:"bytes,6,opt,name=message,proto3" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MCPSessionRequest) Reset() { *m = MCPSessionRequest{} } +func (m *MCPSessionRequest) String() string { return proto.CompactTextString(m) } +func (*MCPSessionRequest) ProtoMessage() {} +func (*MCPSessionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{265} +} +func (m *MCPSessionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MCPSessionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MCPSessionRequest.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 *MCPSessionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_MCPSessionRequest.Merge(m, src) +} +func (m *MCPSessionRequest) XXX_Size() int { + return m.Size() +} +func (m *MCPSessionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_MCPSessionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_MCPSessionRequest proto.InternalMessageInfo + +// MCPSessionNotification is emitted when a notification is sent by client +// during a MCP session. +type MCPSessionNotification struct { + // Metadata is a common event metadata + Metadata `protobuf:"bytes,1,opt,name=metadata,proto3,embedded=metadata" json:""` + // User is a common user event metadata + UserMetadata `protobuf:"bytes,2,opt,name=user,proto3,embedded=user" json:""` + // SessionMetadata is a common event session metadata + SessionMetadata `protobuf:"bytes,3,opt,name=session,proto3,embedded=session" json:""` + // App is a common application resource metadata. + AppMetadata `protobuf:"bytes,4,opt,name=App,proto3,embedded=App" json:""` + // Message contains details of the message. + Message MCPJSONRPCMessage `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MCPSessionNotification) Reset() { *m = MCPSessionNotification{} } +func (m *MCPSessionNotification) String() string { return proto.CompactTextString(m) } +func (*MCPSessionNotification) ProtoMessage() {} +func (*MCPSessionNotification) Descriptor() ([]byte, []int) { + return fileDescriptor_007ba1c3d6266d56, []int{266} +} +func (m *MCPSessionNotification) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MCPSessionNotification) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MCPSessionNotification.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 *MCPSessionNotification) XXX_Merge(src proto.Message) { + xxx_messageInfo_MCPSessionNotification.Merge(m, src) +} +func (m *MCPSessionNotification) XXX_Size() int { + return m.Size() +} +func (m *MCPSessionNotification) XXX_DiscardUnknown() { + xxx_messageInfo_MCPSessionNotification.DiscardUnknown(m) +} + +var xxx_messageInfo_MCPSessionNotification proto.InternalMessageInfo + func init() { proto.RegisterEnum("events.UserKind", UserKind_name, UserKind_value) proto.RegisterEnum("events.UserOrigin", UserOrigin_name, UserOrigin_value) @@ -17009,6 +17317,11 @@ func init() { proto.RegisterType((*SigstorePolicyCreate)(nil), "events.SigstorePolicyCreate") proto.RegisterType((*SigstorePolicyUpdate)(nil), "events.SigstorePolicyUpdate") proto.RegisterType((*SigstorePolicyDelete)(nil), "events.SigstorePolicyDelete") + proto.RegisterType((*MCPSessionStart)(nil), "events.MCPSessionStart") + proto.RegisterType((*MCPSessionEnd)(nil), "events.MCPSessionEnd") + proto.RegisterType((*MCPJSONRPCMessage)(nil), "events.MCPJSONRPCMessage") + proto.RegisterType((*MCPSessionRequest)(nil), "events.MCPSessionRequest") + proto.RegisterType((*MCPSessionNotification)(nil), "events.MCPSessionNotification") } func init() { @@ -17016,1182 +17329,1203 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 18798 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7b, 0x78, 0x25, 0xc9, - 0x75, 0x18, 0x86, 0xe3, 0x3e, 0x70, 0x01, 0x1c, 0x3c, 0xe6, 0x4e, 0xcd, 0xab, 0x67, 0x76, 0x76, - 0xef, 0x6e, 0xef, 0x72, 0x38, 0xb3, 0xdc, 0x9d, 0xd9, 0x9d, 0x7d, 0x90, 0xfb, 0x20, 0x97, 0x17, - 0xb8, 0xc0, 0xe0, 0xce, 0xe0, 0xc5, 0xbe, 0x98, 0x99, 0x5d, 0x52, 0xe4, 0x55, 0xe3, 0x76, 0x0d, - 0xd0, 0x8b, 0x8b, 0xee, 0xcb, 0xee, 0xbe, 0x83, 0xc1, 0xfa, 0xf7, 0x4b, 0x44, 0x59, 0x96, 0x44, - 0x9b, 0xa2, 0x18, 0x2a, 0x12, 0x65, 0xc9, 0x4e, 0x28, 0x3b, 0x4e, 0x64, 0x89, 0x16, 0x23, 0x87, - 0xd1, 0x9b, 0xb6, 0x64, 0xf9, 0x41, 0x89, 0x92, 0x22, 0xc9, 0x96, 0xe2, 0x2f, 0x71, 0x20, 0x47, - 0x89, 0xff, 0xc1, 0x97, 0xe4, 0xd3, 0x97, 0xe8, 0x8b, 0x19, 0x27, 0xce, 0x97, 0xaf, 0x4e, 0x55, - 0x77, 0x57, 0xbf, 0x2e, 0x9e, 0x2b, 0x2c, 0x76, 0xf0, 0xcf, 0x0c, 0xee, 0x39, 0xa7, 0x4e, 0x55, - 0x9f, 0x3a, 0x55, 0x75, 0xaa, 0xea, 0xd4, 0x39, 0x70, 0xc5, 0xa3, 0x6d, 0xda, 0xb1, 0x1d, 0xef, - 0x5a, 0x9b, 0x2e, 0xeb, 0xad, 0x8d, 0x6b, 0xde, 0x46, 0x87, 0xba, 0xd7, 0xe8, 0x7d, 0x6a, 0x79, - 0xfe, 0x7f, 0x57, 0x3b, 0x8e, 0xed, 0xd9, 0xa4, 0xc4, 0x7f, 0x5d, 0x38, 0xbd, 0x6c, 0x2f, 0xdb, - 0x08, 0xba, 0xc6, 0xfe, 0xe2, 0xd8, 0x0b, 0x17, 0x97, 0x6d, 0x7b, 0xb9, 0x4d, 0xaf, 0xe1, 0xaf, - 0xa5, 0xee, 0xbd, 0x6b, 0xae, 0xe7, 0x74, 0x5b, 0x9e, 0xc0, 0x56, 0xe2, 0x58, 0xcf, 0x5c, 0xa3, - 0xae, 0xa7, 0xaf, 0x75, 0x04, 0xc1, 0x63, 0x71, 0x82, 0x75, 0x47, 0xef, 0x74, 0xa8, 0x23, 0x2a, - 0xbf, 0xf0, 0xc1, 0xa0, 0x9d, 0x7a, 0xab, 0x45, 0x5d, 0xb7, 0x6d, 0xba, 0xde, 0xb5, 0xfb, 0xcf, - 0x4b, 0xbf, 0x04, 0xe1, 0x13, 0xe9, 0x1f, 0x84, 0xff, 0x0a, 0x92, 0x67, 0xd3, 0x49, 0xfc, 0x1a, - 0x63, 0x55, 0xab, 0x5f, 0xce, 0xc3, 0xe0, 0x2c, 0xf5, 0x74, 0x43, 0xf7, 0x74, 0x72, 0x11, 0xfa, - 0xeb, 0x96, 0x41, 0x1f, 0x28, 0xb9, 0xc7, 0x73, 0x97, 0x0b, 0xe3, 0xa5, 0xad, 0xcd, 0x4a, 0x9e, - 0x9a, 0x1a, 0x07, 0x92, 0x47, 0xa1, 0xb8, 0xb8, 0xd1, 0xa1, 0x4a, 0xfe, 0xf1, 0xdc, 0xe5, 0xa1, - 0xf1, 0xa1, 0xad, 0xcd, 0x4a, 0x3f, 0x0a, 0x4d, 0x43, 0x30, 0x79, 0x02, 0xf2, 0xf5, 0x9a, 0x52, - 0x40, 0xe4, 0xc9, 0xad, 0xcd, 0xca, 0x68, 0xd7, 0x34, 0x9e, 0xb1, 0xd7, 0x4c, 0x8f, 0xae, 0x75, - 0xbc, 0x0d, 0x2d, 0x5f, 0xaf, 0x91, 0x4b, 0x50, 0x9c, 0xb0, 0x0d, 0xaa, 0x14, 0x91, 0x88, 0x6c, - 0x6d, 0x56, 0xc6, 0x5a, 0xb6, 0x41, 0x25, 0x2a, 0xc4, 0x93, 0x8f, 0x43, 0x71, 0xd1, 0x5c, 0xa3, - 0x4a, 0xff, 0xe3, 0xb9, 0xcb, 0xc3, 0xd7, 0x2f, 0x5c, 0xe5, 0xe2, 0xbb, 0xea, 0x8b, 0xef, 0xea, - 0xa2, 0x2f, 0xdf, 0xf1, 0xf2, 0xb7, 0x36, 0x2b, 0x7d, 0x5b, 0x9b, 0x95, 0x22, 0x13, 0xf9, 0x97, - 0xfe, 0xa4, 0x92, 0xd3, 0xb0, 0x24, 0x79, 0x1d, 0x86, 0x27, 0xda, 0x5d, 0xd7, 0xa3, 0xce, 0x9c, - 0xbe, 0x46, 0x95, 0x12, 0x56, 0x78, 0x61, 0x6b, 0xb3, 0x72, 0xb6, 0xc5, 0xc1, 0x4d, 0x4b, 0x5f, - 0x93, 0x2b, 0x96, 0xc9, 0xd5, 0x5f, 0xca, 0xc1, 0x89, 0x06, 0x75, 0x5d, 0xd3, 0xb6, 0x02, 0xd9, - 0x7c, 0x00, 0x86, 0x04, 0xa8, 0x5e, 0x43, 0xf9, 0x0c, 0x8d, 0x0f, 0x6c, 0x6d, 0x56, 0x0a, 0xae, - 0x69, 0x68, 0x21, 0x86, 0x3c, 0x07, 0x03, 0x77, 0x4d, 0x6f, 0x65, 0x76, 0xaa, 0x2a, 0xe4, 0x74, - 0x76, 0x6b, 0xb3, 0x42, 0xd6, 0x4d, 0x6f, 0xa5, 0xb9, 0x76, 0x4f, 0x97, 0x2a, 0xf4, 0xc9, 0xc8, - 0x0c, 0x94, 0x17, 0x1c, 0xf3, 0xbe, 0xee, 0xd1, 0x5b, 0x74, 0x63, 0xc1, 0x6e, 0x9b, 0xad, 0x0d, - 0x21, 0xc5, 0xc7, 0xb7, 0x36, 0x2b, 0x17, 0x3b, 0x1c, 0xd7, 0x5c, 0xa5, 0x1b, 0xcd, 0x0e, 0x62, - 0x25, 0x26, 0x89, 0x92, 0xea, 0xe7, 0x07, 0x60, 0xe4, 0xb6, 0x4b, 0x9d, 0xa0, 0xdd, 0x97, 0xa0, - 0xc8, 0x7e, 0x8b, 0x26, 0xa3, 0xcc, 0xbb, 0x2e, 0x75, 0x64, 0x99, 0x33, 0x3c, 0xb9, 0x02, 0xfd, - 0x33, 0xf6, 0xb2, 0x69, 0x89, 0x66, 0x9f, 0xda, 0xda, 0xac, 0x9c, 0x68, 0x33, 0x80, 0x44, 0xc9, - 0x29, 0xc8, 0xc7, 0x60, 0xa4, 0xbe, 0xc6, 0x74, 0xc8, 0xb6, 0x74, 0xcf, 0x76, 0x44, 0x6b, 0x51, - 0xba, 0xa6, 0x04, 0x97, 0x0a, 0x46, 0xe8, 0xc9, 0xab, 0x00, 0xd5, 0xbb, 0x0d, 0xcd, 0x6e, 0xd3, - 0xaa, 0x36, 0x27, 0x94, 0x01, 0x4b, 0xeb, 0xeb, 0x6e, 0xd3, 0xb1, 0xdb, 0xb4, 0xa9, 0x3b, 0x72, - 0xb5, 0x12, 0x35, 0x99, 0x84, 0xb1, 0x2a, 0x8e, 0x0a, 0x8d, 0x7e, 0xb6, 0x4b, 0x5d, 0xcf, 0x55, - 0xfa, 0x1f, 0x2f, 0x5c, 0x1e, 0x1a, 0x7f, 0x74, 0x6b, 0xb3, 0x72, 0x9e, 0x8f, 0x97, 0xa6, 0x23, - 0x50, 0x12, 0x8b, 0x58, 0x21, 0x32, 0x0e, 0xa3, 0xd5, 0x77, 0xba, 0x0e, 0xad, 0x1b, 0xd4, 0xf2, - 0x4c, 0x6f, 0x43, 0x68, 0xc8, 0xc5, 0xad, 0xcd, 0x8a, 0xa2, 0x33, 0x44, 0xd3, 0x14, 0x18, 0x89, - 0x49, 0xb4, 0x08, 0x99, 0x87, 0x93, 0x37, 0x26, 0x16, 0x1a, 0xd4, 0xb9, 0x6f, 0xb6, 0x68, 0xb5, - 0xd5, 0xb2, 0xbb, 0x96, 0xa7, 0x0c, 0x20, 0x9f, 0x27, 0xb6, 0x36, 0x2b, 0x8f, 0x2e, 0xb7, 0x3a, - 0x4d, 0x97, 0x63, 0x9b, 0x3a, 0x47, 0x4b, 0xcc, 0x92, 0x65, 0xc9, 0x27, 0x61, 0x74, 0xd1, 0x61, - 0x5a, 0x68, 0xd4, 0x28, 0x83, 0x2b, 0x83, 0xa8, 0xff, 0x67, 0xaf, 0x8a, 0x99, 0x8a, 0x43, 0xfd, - 0x9e, 0xe5, 0x8d, 0xf5, 0x78, 0x81, 0xa6, 0x81, 0x38, 0xb9, 0xb1, 0x11, 0x56, 0x84, 0x82, 0xc2, - 0x3e, 0xde, 0x74, 0xa8, 0x91, 0xd0, 0xb6, 0x21, 0x6c, 0xf3, 0x95, 0xad, 0xcd, 0xca, 0x07, 0x1c, - 0x41, 0xd3, 0xec, 0xa9, 0x76, 0x99, 0xac, 0xc8, 0x24, 0x0c, 0x32, 0x6d, 0xba, 0x65, 0x5a, 0x86, - 0x02, 0x8f, 0xe7, 0x2e, 0x8f, 0x5d, 0x2f, 0xfb, 0xad, 0xf7, 0xe1, 0xe3, 0xe7, 0xb6, 0x36, 0x2b, - 0xa7, 0x98, 0x0e, 0x36, 0x57, 0x4d, 0x4b, 0x9e, 0x22, 0x82, 0xa2, 0x6c, 0x14, 0x8d, 0xdb, 0x1e, - 0x0e, 0xdd, 0xe1, 0x70, 0x14, 0x2d, 0xd9, 0x5e, 0x7c, 0xd8, 0xfa, 0x64, 0x64, 0x02, 0x46, 0xc7, - 0x6d, 0xaf, 0x6e, 0xb9, 0x9e, 0x6e, 0xb5, 0x68, 0xbd, 0xa6, 0x8c, 0x60, 0x39, 0x54, 0x0b, 0x56, - 0xce, 0x14, 0x98, 0x66, 0x64, 0x52, 0x8a, 0x96, 0x21, 0xb3, 0x00, 0xac, 0x09, 0xf3, 0x8e, 0xc9, - 0x06, 0xc2, 0x28, 0xb6, 0x9f, 0xc8, 0xed, 0xe7, 0x98, 0xf1, 0xf3, 0x5b, 0x9b, 0x95, 0x33, 0xf8, - 0x05, 0x36, 0x02, 0x64, 0x5d, 0x0d, 0xc9, 0xd4, 0x7f, 0x5b, 0x84, 0x31, 0xd6, 0xc5, 0xd2, 0x68, - 0xac, 0xb2, 0x89, 0x85, 0x41, 0x58, 0xa3, 0xdd, 0x8e, 0xde, 0xa2, 0x62, 0x60, 0xa2, 0x50, 0x2c, - 0x1f, 0x28, 0x31, 0x8c, 0xd3, 0x93, 0x2b, 0x30, 0xc8, 0x41, 0xf5, 0x9a, 0x18, 0xab, 0xa3, 0x5b, - 0x9b, 0x95, 0x21, 0x17, 0x61, 0x4d, 0xd3, 0xd0, 0x02, 0x34, 0x1b, 0x2c, 0xfc, 0xef, 0x69, 0xdb, - 0xf5, 0x18, 0x73, 0x31, 0x54, 0x51, 0x2a, 0xa2, 0xc0, 0x8a, 0x40, 0xc9, 0x83, 0x25, 0x5a, 0x88, - 0xbc, 0x02, 0xc0, 0x21, 0x55, 0xc3, 0x70, 0xc4, 0x78, 0x45, 0x11, 0x08, 0x16, 0xba, 0x61, 0xc8, - 0x83, 0x5d, 0x22, 0x26, 0x6b, 0x30, 0xc2, 0x7f, 0xcd, 0xe8, 0x4b, 0xb4, 0xcd, 0x07, 0xeb, 0xf0, - 0xf5, 0xcb, 0xbe, 0x4c, 0xa3, 0xd2, 0xb9, 0x2a, 0x93, 0x4e, 0x5a, 0x9e, 0xb3, 0x31, 0x5e, 0x11, - 0xf3, 0xfb, 0x39, 0x51, 0x55, 0x1b, 0x71, 0xf2, 0xcc, 0x22, 0x97, 0x61, 0xd3, 0xfe, 0x94, 0xed, - 0xac, 0xeb, 0x8e, 0x41, 0x8d, 0xf1, 0x0d, 0x79, 0xda, 0xbf, 0xe7, 0x83, 0x9b, 0x4b, 0xb2, 0x26, - 0xcb, 0xe4, 0x4c, 0x87, 0x38, 0xb7, 0x46, 0x77, 0x09, 0x35, 0x78, 0x20, 0x21, 0x2d, 0xb7, 0xbb, - 0x14, 0xd7, 0xda, 0x68, 0x19, 0x36, 0xb3, 0x70, 0xc0, 0x1d, 0xea, 0xb0, 0x35, 0x01, 0x07, 0xb1, - 0x98, 0x59, 0x04, 0x93, 0xfb, 0x1c, 0x93, 0xe4, 0x21, 0x8a, 0x5c, 0x78, 0x03, 0x4e, 0x26, 0x44, - 0x41, 0xca, 0x50, 0x58, 0xa5, 0x1b, 0x5c, 0x5d, 0x34, 0xf6, 0x27, 0x39, 0x0d, 0xfd, 0xf7, 0xf5, - 0x76, 0x57, 0xac, 0xc8, 0x1a, 0xff, 0xf1, 0x6a, 0xfe, 0x23, 0x39, 0xb6, 0x80, 0x91, 0x09, 0xdb, - 0xb2, 0x68, 0xcb, 0x93, 0xd7, 0xb0, 0x97, 0x61, 0x68, 0xc6, 0x6e, 0xe9, 0x6d, 0xec, 0x47, 0xae, - 0x77, 0xca, 0xd6, 0x66, 0xe5, 0x34, 0xeb, 0xc0, 0xab, 0x6d, 0x86, 0x91, 0xda, 0x14, 0x92, 0x32, - 0x05, 0xd0, 0xe8, 0x9a, 0xed, 0x51, 0x2c, 0x98, 0x0f, 0x15, 0x00, 0x0b, 0x3a, 0x88, 0x92, 0x15, - 0x20, 0x24, 0x26, 0xd7, 0x60, 0x70, 0x81, 0x2d, 0xdb, 0x2d, 0xbb, 0x2d, 0x94, 0x0f, 0x57, 0x16, - 0x5c, 0xca, 0xe5, 0xa1, 0xef, 0x13, 0xa9, 0xd3, 0x30, 0x36, 0xd1, 0x36, 0xa9, 0xe5, 0xc9, 0xad, - 0x66, 0x83, 0xaa, 0xba, 0x4c, 0x2d, 0x4f, 0x6e, 0x35, 0x0e, 0x40, 0x9d, 0x41, 0xe5, 0x56, 0x07, - 0xa4, 0xea, 0xef, 0x15, 0xe0, 0xfc, 0xad, 0xee, 0x12, 0x75, 0x2c, 0xea, 0x51, 0x57, 0xac, 0xef, - 0x01, 0xd7, 0x39, 0x38, 0x99, 0x40, 0x0a, 0xee, 0xb8, 0xee, 0xae, 0x06, 0xc8, 0xa6, 0x30, 0x19, - 0xe4, 0xc9, 0x3b, 0x51, 0x94, 0x4c, 0xc3, 0x89, 0x10, 0xc8, 0x1a, 0xe1, 0x2a, 0x79, 0x5c, 0x99, - 0x1e, 0xdb, 0xda, 0xac, 0x5c, 0x90, 0xb8, 0xb1, 0x66, 0xcb, 0x1a, 0x1c, 0x2f, 0x46, 0x6e, 0x41, - 0x39, 0x04, 0xdd, 0x70, 0xec, 0x6e, 0xc7, 0x55, 0x0a, 0xc8, 0xaa, 0xb2, 0xb5, 0x59, 0x79, 0x44, - 0x62, 0xb5, 0x8c, 0x48, 0xd9, 0x1e, 0x88, 0x17, 0x24, 0xdf, 0x97, 0x93, 0xb9, 0x89, 0x51, 0x58, - 0xc4, 0x51, 0xf8, 0x61, 0x7f, 0x14, 0x66, 0x0a, 0xe9, 0x6a, 0xbc, 0xa4, 0x18, 0x94, 0xb1, 0x66, - 0x24, 0x06, 0x65, 0xa2, 0xc6, 0x0b, 0x13, 0x70, 0x26, 0x95, 0xd7, 0xae, 0xb4, 0xfa, 0xdf, 0x14, - 0x64, 0x2e, 0x0b, 0xb6, 0x11, 0x74, 0xe6, 0xbc, 0xdc, 0x99, 0x0b, 0xb6, 0x81, 0x2b, 0x47, 0x2e, - 0x5c, 0x8a, 0xa5, 0xc6, 0x76, 0x6c, 0x23, 0xbe, 0x88, 0x24, 0xcb, 0x92, 0xcf, 0xc0, 0xd9, 0x04, - 0x90, 0x4f, 0xd7, 0x5c, 0xfb, 0x2f, 0x6d, 0x6d, 0x56, 0xd4, 0x14, 0xae, 0xf1, 0xd9, 0x3b, 0x83, - 0x0b, 0xd1, 0xe1, 0x9c, 0x24, 0x75, 0xdb, 0xf2, 0x74, 0xd3, 0x12, 0xb6, 0x2a, 0x1f, 0x25, 0x1f, - 0xdc, 0xda, 0xac, 0x3c, 0x29, 0xeb, 0xa0, 0x4f, 0x13, 0x6f, 0x7c, 0x16, 0x1f, 0x62, 0x80, 0x92, - 0x82, 0xaa, 0xaf, 0xe9, 0xcb, 0xbe, 0x01, 0x7e, 0x79, 0x6b, 0xb3, 0xf2, 0x54, 0x6a, 0x1d, 0x26, - 0xa3, 0x92, 0x17, 0xfc, 0x2c, 0x4e, 0x44, 0x03, 0x12, 0xe2, 0xe6, 0x6c, 0x83, 0xe2, 0x37, 0xf4, - 0x23, 0x7f, 0x75, 0x6b, 0xb3, 0xf2, 0x98, 0xc4, 0xdf, 0xb2, 0x0d, 0x1a, 0x6f, 0x7e, 0x4a, 0x69, - 0xf5, 0x97, 0x0a, 0xf0, 0x58, 0xa3, 0x3a, 0x3b, 0x53, 0x37, 0x7c, 0x0b, 0x69, 0xc1, 0xb1, 0xef, - 0x9b, 0x86, 0x34, 0x7a, 0x97, 0xe0, 0x5c, 0x0c, 0x35, 0x89, 0x46, 0x59, 0x60, 0x9b, 0xe3, 0xb7, - 0xf9, 0xd6, 0x57, 0x47, 0xd0, 0x34, 0xb9, 0xe5, 0x16, 0xb5, 0x01, 0xb2, 0x18, 0xb1, 0x3e, 0x8a, - 0xa1, 0x1a, 0x2b, 0xb6, 0xe3, 0xb5, 0xba, 0x9e, 0x50, 0x02, 0xec, 0xa3, 0x44, 0x1d, 0xae, 0x20, - 0xea, 0x51, 0x85, 0xcf, 0x87, 0x7c, 0x3e, 0x07, 0xe5, 0xaa, 0xe7, 0x39, 0xe6, 0x52, 0xd7, 0xa3, - 0xb3, 0x7a, 0xa7, 0x63, 0x5a, 0xcb, 0x38, 0xd6, 0x87, 0xaf, 0xbf, 0x1e, 0xac, 0x91, 0x3d, 0x25, - 0x71, 0x35, 0x5e, 0x5c, 0x1a, 0xa2, 0xba, 0x8f, 0x6a, 0xae, 0x71, 0x9c, 0x3c, 0x44, 0xe3, 0xe5, - 0xd8, 0x10, 0x4d, 0xe5, 0xb5, 0xab, 0x21, 0xfa, 0xe5, 0x02, 0x5c, 0x9c, 0x5f, 0xf5, 0x74, 0x8d, - 0xba, 0x76, 0xd7, 0x69, 0x51, 0xf7, 0x76, 0xc7, 0xd0, 0x3d, 0x1a, 0x8e, 0xd4, 0x0a, 0xf4, 0x57, - 0x0d, 0x83, 0x1a, 0xc8, 0xae, 0x9f, 0xef, 0x22, 0x75, 0x06, 0xd0, 0x38, 0x9c, 0x7c, 0x00, 0x06, - 0x44, 0x19, 0xe4, 0xde, 0x3f, 0x3e, 0xbc, 0xb5, 0x59, 0x19, 0xe8, 0x72, 0x90, 0xe6, 0xe3, 0x18, - 0x59, 0x8d, 0xb6, 0x29, 0x23, 0x2b, 0x84, 0x64, 0x06, 0x07, 0x69, 0x3e, 0x8e, 0x7c, 0x02, 0xc6, - 0x90, 0x6d, 0xd0, 0x1e, 0x31, 0xf7, 0x9d, 0xf6, 0xa5, 0x2b, 0x37, 0x96, 0x2f, 0x4d, 0xd8, 0x9a, - 0xa6, 0xe3, 0x17, 0xd0, 0x62, 0x0c, 0xc8, 0x5d, 0x28, 0x8b, 0x46, 0x84, 0x4c, 0xfb, 0x7b, 0x30, - 0x3d, 0xb3, 0xb5, 0x59, 0x39, 0x29, 0xda, 0x2f, 0xb1, 0x4d, 0x30, 0x61, 0x8c, 0x45, 0xb3, 0x43, - 0xc6, 0xa5, 0xed, 0x18, 0x8b, 0x2f, 0x96, 0x19, 0xc7, 0x99, 0xa8, 0x6f, 0xc1, 0x88, 0x5c, 0x90, - 0x9c, 0xc5, 0x9d, 0x3a, 0x1f, 0x27, 0xb8, 0xc7, 0x37, 0x0d, 0xdc, 0x9e, 0x3f, 0x0f, 0xc3, 0x35, - 0xea, 0xb6, 0x1c, 0xb3, 0xc3, 0xac, 0x06, 0xa1, 0xe4, 0x27, 0xb6, 0x36, 0x2b, 0xc3, 0x46, 0x08, - 0xd6, 0x64, 0x1a, 0xf5, 0xff, 0xcc, 0xc1, 0x59, 0xc6, 0xbb, 0xea, 0xba, 0xe6, 0xb2, 0xb5, 0x26, - 0x2f, 0xdb, 0xcf, 0x40, 0xa9, 0x81, 0xf5, 0x89, 0x9a, 0x4e, 0x6f, 0x6d, 0x56, 0xca, 0xbc, 0x05, - 0x92, 0x1e, 0x0a, 0x9a, 0x60, 0x9b, 0x9a, 0xdf, 0x66, 0x9b, 0xca, 0x4c, 0x5a, 0x4f, 0x77, 0x3c, - 0xd3, 0x5a, 0x6e, 0x78, 0xba, 0xd7, 0x75, 0x23, 0x26, 0xad, 0xc0, 0x34, 0x5d, 0x44, 0x45, 0x4c, - 0xda, 0x48, 0x21, 0xf2, 0x06, 0x8c, 0x4c, 0x5a, 0x46, 0xc8, 0x84, 0x4f, 0x88, 0x8f, 0x30, 0x4b, - 0x93, 0x22, 0x3c, 0xc9, 0x22, 0x52, 0x40, 0xfd, 0x4e, 0x0e, 0x14, 0xbe, 0xa7, 0x9c, 0x31, 0x5d, - 0x6f, 0x96, 0xae, 0x2d, 0x49, 0xb3, 0xd3, 0x94, 0xbf, 0x49, 0x65, 0x38, 0x69, 0x2d, 0x42, 0x53, - 0x40, 0x6c, 0x52, 0xdb, 0xa6, 0x9b, 0xd8, 0xcd, 0xc4, 0x4a, 0x91, 0x3a, 0x0c, 0x70, 0xce, 0xdc, - 0x96, 0x18, 0xbe, 0xae, 0xf8, 0x8a, 0x10, 0xaf, 0x9a, 0x2b, 0xc3, 0x1a, 0x27, 0x96, 0xf7, 0x47, - 0xa2, 0x3c, 0xa9, 0xc3, 0x89, 0xb0, 0xcc, 0xa2, 0xe9, 0xb5, 0xfd, 0x45, 0x80, 0xcf, 0x14, 0x52, - 0x9b, 0x3c, 0x86, 0x94, 0xed, 0x93, 0x58, 0x39, 0xf5, 0xab, 0x05, 0x28, 0xc7, 0xeb, 0x27, 0x77, - 0x61, 0xf0, 0xa6, 0x6d, 0x5a, 0xd4, 0x98, 0xb7, 0xf0, 0x63, 0x7b, 0x1f, 0xdb, 0xf8, 0x66, 0xfd, - 0xa9, 0xb7, 0xb1, 0x4c, 0x53, 0x36, 0x86, 0xf1, 0x14, 0x27, 0x60, 0x46, 0x3e, 0x09, 0x43, 0xcc, - 0x9c, 0xbc, 0x8f, 0x9c, 0xf3, 0xdb, 0x72, 0x7e, 0x5c, 0x70, 0x3e, 0xed, 0xf0, 0x42, 0x49, 0xd6, - 0x21, 0x3b, 0xa6, 0xa2, 0x1a, 0xd5, 0x5d, 0xdb, 0x12, 0x4a, 0x84, 0x2a, 0xea, 0x20, 0x44, 0x56, - 0x51, 0x4e, 0xc3, 0xac, 0x60, 0xfe, 0xb1, 0xd8, 0xa3, 0xd2, 0x36, 0x88, 0x8b, 0x3d, 0xde, 0x99, - 0x12, 0x31, 0xb1, 0xe0, 0x84, 0xe8, 0x9b, 0x15, 0xb3, 0x83, 0x1b, 0x08, 0x5c, 0x22, 0xc7, 0xae, - 0x5f, 0xba, 0xea, 0x1f, 0xd7, 0x5d, 0x95, 0x0e, 0xfb, 0xee, 0x3f, 0x7f, 0x75, 0x36, 0x20, 0xc7, - 0x3d, 0x33, 0xaa, 0x77, 0x8c, 0x85, 0xac, 0x38, 0x6b, 0x11, 0x72, 0xf5, 0xfb, 0xf3, 0xf0, 0x6c, - 0xd8, 0x45, 0x1a, 0xbd, 0x6f, 0xd2, 0xf5, 0x90, 0xa3, 0xd8, 0xbd, 0xb3, 0xd1, 0xea, 0x4e, 0xac, - 0xe8, 0xd6, 0x32, 0x35, 0xc8, 0x15, 0xe8, 0xd7, 0xec, 0x36, 0x75, 0x95, 0x1c, 0x5a, 0x9a, 0x38, - 0x13, 0x3a, 0x0c, 0x20, 0x1f, 0xff, 0x20, 0x05, 0xb1, 0xa1, 0xb4, 0xe8, 0xe8, 0xa6, 0xe7, 0x2b, - 0x65, 0x35, 0xa9, 0x94, 0x3b, 0xa8, 0xf1, 0x2a, 0xe7, 0xc1, 0x97, 0x2b, 0x14, 0xbc, 0x87, 0x00, - 0x59, 0xf0, 0x9c, 0xe4, 0xc2, 0x2b, 0x30, 0x2c, 0x11, 0xef, 0x6a, 0x3d, 0xfa, 0xbe, 0x7e, 0x79, - 0x98, 0xfa, 0xcd, 0x12, 0xc3, 0xf4, 0x1a, 0x1b, 0x5e, 0xae, 0xcb, 0x0c, 0x22, 0x3e, 0x3e, 0xc5, - 0x20, 0x42, 0x50, 0x74, 0x10, 0x21, 0x88, 0xbc, 0x00, 0x83, 0x9c, 0x45, 0xb0, 0xf5, 0xc6, 0x6d, - 0xbb, 0x83, 0xb0, 0xa8, 0x55, 0x11, 0x10, 0x92, 0x9f, 0xc9, 0xc1, 0xa3, 0x3d, 0x25, 0x81, 0xca, - 0x37, 0x7c, 0xfd, 0xa5, 0x3d, 0x89, 0x71, 0xfc, 0xd9, 0xad, 0xcd, 0xca, 0x15, 0x49, 0x33, 0x1c, - 0x89, 0xa6, 0xd9, 0xe2, 0x44, 0x52, 0xbb, 0x7a, 0x37, 0x85, 0xd9, 0xbd, 0xbc, 0xd2, 0x29, 0x3c, - 0x44, 0xb3, 0x5a, 0x1b, 0x7e, 0x23, 0x8b, 0xa1, 0xdd, 0x2b, 0xbe, 0xf7, 0x9e, 0x4f, 0x92, 0x52, - 0x4d, 0x06, 0x17, 0xd2, 0x82, 0x73, 0x1c, 0x53, 0xd3, 0x37, 0xe6, 0xef, 0xcd, 0xda, 0x96, 0xb7, - 0xe2, 0x57, 0xd0, 0x2f, 0x9f, 0x42, 0x61, 0x05, 0x86, 0xbe, 0xd1, 0xb4, 0xef, 0x35, 0xd7, 0x18, - 0x55, 0x4a, 0x1d, 0x59, 0x9c, 0xd8, 0x1a, 0x21, 0xc6, 0xb8, 0x3f, 0x7b, 0x96, 0xc2, 0x33, 0x42, - 0x7f, 0x5e, 0x48, 0xce, 0x95, 0xb1, 0x42, 0x69, 0x53, 0xe6, 0xc0, 0x1e, 0xa7, 0xcc, 0x3a, 0x8c, - 0xcc, 0xd8, 0xad, 0xd5, 0x40, 0xf3, 0x5e, 0x81, 0xd2, 0xa2, 0xee, 0x2c, 0x53, 0x0f, 0xc5, 0x3a, - 0x7c, 0xfd, 0xe4, 0x55, 0x7e, 0x84, 0xcf, 0x88, 0x38, 0x62, 0x7c, 0x4c, 0x4c, 0x64, 0x25, 0x0f, - 0x7f, 0x6b, 0xa2, 0x80, 0xfa, 0x0f, 0x4a, 0x30, 0x22, 0x8e, 0x9b, 0x71, 0x4d, 0x23, 0xaf, 0x86, - 0x07, 0xf8, 0x62, 0xe6, 0x0d, 0x8e, 0xdc, 0x82, 0xa3, 0xc2, 0x11, 0xc6, 0xec, 0xf7, 0x37, 0x2b, - 0xb9, 0xad, 0xcd, 0x4a, 0x9f, 0x36, 0x28, 0x6d, 0xad, 0xc3, 0x55, 0x57, 0x32, 0x33, 0xe4, 0x03, - 0xe4, 0x58, 0x59, 0xbe, 0x0a, 0xbf, 0x01, 0x03, 0xa2, 0x0d, 0x42, 0x79, 0xcf, 0x85, 0x27, 0x3a, - 0x91, 0x63, 0xf3, 0x58, 0x69, 0xbf, 0x14, 0x79, 0x1d, 0x4a, 0xfc, 0x84, 0x43, 0x08, 0xe0, 0x6c, - 0xfa, 0x89, 0x50, 0xac, 0xb8, 0x28, 0x43, 0xa6, 0x01, 0xc2, 0xd3, 0x8d, 0xe0, 0x96, 0x40, 0x70, - 0x48, 0x9e, 0x7b, 0xc4, 0xb8, 0x48, 0x65, 0xc9, 0xcb, 0x30, 0xb2, 0x48, 0x9d, 0x35, 0xd3, 0xd2, - 0xdb, 0x0d, 0xf3, 0x1d, 0xff, 0xa2, 0x00, 0xcd, 0x0f, 0xd7, 0x7c, 0x47, 0xee, 0xd3, 0x08, 0x1d, - 0xf9, 0x74, 0xda, 0xe9, 0xc1, 0x00, 0x36, 0xe4, 0x89, 0x6d, 0xb7, 0xd5, 0xb1, 0xf6, 0xa4, 0x1c, - 0x26, 0x7c, 0x02, 0x46, 0x23, 0x1b, 0x47, 0x71, 0x12, 0xfc, 0x68, 0x92, 0xb5, 0xb4, 0x0b, 0x8e, - 0xb1, 0x8d, 0x72, 0x60, 0x83, 0xa2, 0x6e, 0x99, 0x9e, 0xa9, 0xb7, 0x27, 0xec, 0xb5, 0x35, 0xdd, - 0x32, 0x94, 0xa1, 0x70, 0x50, 0x98, 0x1c, 0xd3, 0x6c, 0x71, 0x94, 0x3c, 0x28, 0xa2, 0x85, 0xc8, - 0x2d, 0x28, 0x8b, 0x3e, 0xd4, 0x68, 0xcb, 0x76, 0x98, 0x45, 0x84, 0x07, 0xbd, 0x62, 0x54, 0xb8, - 0x1c, 0xd7, 0x74, 0x7c, 0xa4, 0xbc, 0xe5, 0x88, 0x17, 0x64, 0x13, 0x70, 0xdd, 0xba, 0x6f, 0x32, - 0x23, 0x7e, 0x04, 0x1b, 0x83, 0x13, 0xb0, 0xc9, 0x41, 0xf2, 0x04, 0x2c, 0xa8, 0xa4, 0x05, 0x7b, - 0x74, 0xfb, 0x05, 0xfb, 0x66, 0x71, 0x70, 0xb8, 0x3c, 0x12, 0x3f, 0xfa, 0x57, 0xff, 0x6e, 0x01, - 0x86, 0x45, 0x4b, 0x98, 0x91, 0x71, 0x3c, 0x7e, 0xf6, 0x33, 0x7e, 0x52, 0xc7, 0x41, 0xe9, 0xa0, - 0xc6, 0x81, 0xfa, 0x85, 0x7c, 0x30, 0xd9, 0x2d, 0x38, 0xa6, 0xb5, 0xbf, 0xc9, 0xee, 0x12, 0xc0, - 0xc4, 0x4a, 0xd7, 0x5a, 0xe5, 0x57, 0x9c, 0xf9, 0xf0, 0x8a, 0xb3, 0x65, 0x6a, 0x12, 0x86, 0x3c, - 0x0a, 0xc5, 0x1a, 0xe3, 0xcf, 0x7a, 0x66, 0x64, 0x7c, 0xe8, 0x5b, 0x9c, 0x53, 0xee, 0x59, 0x0d, - 0xc1, 0x6c, 0x07, 0x3b, 0xbe, 0xe1, 0x51, 0xbe, 0x67, 0x28, 0xf0, 0x1d, 0xec, 0x12, 0x03, 0x68, - 0x1c, 0x4e, 0x5e, 0x84, 0x93, 0x35, 0xda, 0xd6, 0x37, 0x66, 0xcd, 0x76, 0xdb, 0x74, 0x69, 0xcb, - 0xb6, 0x0c, 0x17, 0x85, 0x2c, 0xaa, 0x5b, 0x73, 0xb5, 0x24, 0x01, 0x51, 0xa1, 0x34, 0x7f, 0xef, - 0x9e, 0x4b, 0x3d, 0x14, 0x5f, 0x61, 0x1c, 0xd8, 0xdc, 0x6f, 0x23, 0x44, 0x13, 0x18, 0xf5, 0xeb, - 0x39, 0xb6, 0x45, 0x74, 0x57, 0x3d, 0xbb, 0x13, 0x0e, 0xa2, 0xfd, 0x88, 0xe4, 0x4a, 0x68, 0x01, - 0xe5, 0xf1, 0x6b, 0x4f, 0x88, 0xaf, 0x1d, 0x10, 0x56, 0x50, 0x68, 0xfb, 0xa4, 0x7e, 0x55, 0x61, - 0x9b, 0xaf, 0x52, 0xff, 0x2c, 0x0f, 0xe7, 0x44, 0x8b, 0x27, 0xda, 0x66, 0x67, 0xc9, 0xd6, 0x1d, - 0x43, 0xa3, 0x2d, 0x6a, 0xde, 0xa7, 0x47, 0x73, 0xe0, 0x45, 0x87, 0x4e, 0x71, 0x1f, 0x43, 0xe7, - 0x3a, 0xee, 0xb6, 0x99, 0x64, 0xf0, 0x54, 0x9d, 0x9b, 0x3f, 0xe5, 0xad, 0xcd, 0xca, 0x88, 0xc1, - 0xc1, 0x78, 0xaf, 0xa2, 0xc9, 0x44, 0x4c, 0x49, 0x66, 0xa8, 0xb5, 0xec, 0xad, 0xa0, 0x92, 0xf4, - 0x73, 0x25, 0x69, 0x23, 0x44, 0x13, 0x18, 0xf5, 0x7f, 0xcd, 0xc3, 0xe9, 0xb8, 0xc8, 0x1b, 0xd4, - 0x32, 0x8e, 0xe5, 0xfd, 0xee, 0xc8, 0xfb, 0xcf, 0x0b, 0xf0, 0x88, 0x28, 0xd3, 0x58, 0xd1, 0x1d, - 0x6a, 0xd4, 0x4c, 0x87, 0xb6, 0x3c, 0xdb, 0xd9, 0x38, 0xc2, 0xf6, 0xd9, 0xc1, 0x89, 0xfd, 0x45, - 0x28, 0x89, 0x33, 0x16, 0xbe, 0xce, 0x8c, 0x05, 0x2d, 0x41, 0x68, 0x62, 0x85, 0xe2, 0xe7, 0x33, - 0xb1, 0xce, 0x2a, 0xed, 0xa4, 0xb3, 0x3e, 0x02, 0xa3, 0x81, 0xe8, 0x71, 0x8b, 0x3e, 0x10, 0x1a, - 0x73, 0x86, 0x8f, 0xc0, 0x5d, 0xba, 0x16, 0x25, 0xc4, 0xda, 0x7c, 0x40, 0xbd, 0x86, 0xc6, 0xd6, - 0xa8, 0xa8, 0x2d, 0x28, 0x67, 0x1a, 0x9a, 0x4c, 0xa4, 0x6e, 0x16, 0xe1, 0x42, 0x7a, 0xb7, 0x6b, - 0x54, 0x37, 0x8e, 0x7b, 0xfd, 0x7d, 0xd9, 0xeb, 0xe4, 0x09, 0x28, 0x2e, 0xe8, 0xde, 0x8a, 0x70, - 0x99, 0xc0, 0x8b, 0xf7, 0x7b, 0x66, 0x9b, 0x36, 0x3b, 0xba, 0xb7, 0xa2, 0x21, 0x4a, 0x9a, 0x33, - 0x00, 0x39, 0xa6, 0xcc, 0x19, 0xd2, 0x62, 0x3f, 0xfc, 0x78, 0xee, 0x72, 0x31, 0x75, 0xb1, 0xff, - 0x93, 0x62, 0xd6, 0xbc, 0x72, 0xd7, 0x31, 0x3d, 0x7a, 0xac, 0x61, 0xc7, 0x1a, 0xb6, 0x4f, 0x0d, - 0xfb, 0xc3, 0x3c, 0x8c, 0x06, 0x7b, 0xb2, 0xb7, 0x69, 0xeb, 0x70, 0xd6, 0xaa, 0x70, 0x2b, 0x53, - 0xd8, 0xf7, 0x56, 0x66, 0x3f, 0x0a, 0xa5, 0x06, 0x7b, 0x4b, 0x6e, 0x1a, 0xa0, 0xc4, 0xf8, 0xde, - 0x32, 0x38, 0x02, 0x7e, 0x02, 0x06, 0x66, 0xf5, 0x07, 0xe6, 0x5a, 0x77, 0x4d, 0x58, 0xe9, 0xe8, - 0x02, 0xb8, 0xa6, 0x3f, 0xd0, 0x7c, 0xb8, 0xfa, 0x2f, 0x72, 0x30, 0x26, 0x84, 0x2a, 0x98, 0xef, - 0x4b, 0xaa, 0xa1, 0x74, 0xf2, 0xfb, 0x96, 0x4e, 0x61, 0xef, 0xd2, 0x51, 0xff, 0x46, 0x01, 0x94, - 0x29, 0xb3, 0x4d, 0x17, 0x1d, 0xdd, 0x72, 0xef, 0x51, 0x47, 0x6c, 0xa7, 0x27, 0x19, 0xab, 0x7d, - 0x7d, 0xa0, 0x34, 0xa5, 0xe4, 0xf7, 0x34, 0xa5, 0x7c, 0x08, 0x86, 0x44, 0x63, 0x02, 0xf7, 0x53, - 0x1c, 0x35, 0x8e, 0x0f, 0xd4, 0x42, 0x3c, 0x23, 0xae, 0x76, 0x3a, 0x8e, 0x7d, 0x9f, 0x3a, 0xfc, - 0x2a, 0x50, 0x10, 0xeb, 0x3e, 0x50, 0x0b, 0xf1, 0x12, 0x67, 0xea, 0xdb, 0x8b, 0x32, 0x67, 0xea, - 0x68, 0x21, 0x9e, 0x5c, 0x86, 0xc1, 0x19, 0xbb, 0xa5, 0xa3, 0xa0, 0xf9, 0xb4, 0x32, 0xb2, 0xb5, - 0x59, 0x19, 0x6c, 0x0b, 0x98, 0x16, 0x60, 0x19, 0x65, 0xcd, 0x5e, 0xb7, 0xda, 0xb6, 0xce, 0x3d, - 0x8c, 0x06, 0x39, 0xa5, 0x21, 0x60, 0x5a, 0x80, 0x65, 0x94, 0x4c, 0xe6, 0xe8, 0xb9, 0x35, 0x18, - 0xf2, 0xbc, 0x27, 0x60, 0x5a, 0x80, 0x55, 0xbf, 0x5e, 0x64, 0xda, 0xeb, 0x9a, 0xef, 0x3c, 0xf4, - 0xeb, 0x42, 0x38, 0x60, 0xfa, 0xf7, 0x30, 0x60, 0x1e, 0x9a, 0xf3, 0x40, 0xf5, 0xdf, 0x0e, 0x00, - 0x08, 0xe9, 0x4f, 0x1e, 0x6f, 0x0e, 0xf7, 0xa7, 0x35, 0x35, 0x38, 0x39, 0x69, 0xad, 0xe8, 0x56, - 0x8b, 0x1a, 0xe1, 0xa9, 0x68, 0x09, 0x87, 0x36, 0x3a, 0xae, 0x52, 0x81, 0x0c, 0x8f, 0x45, 0xb5, - 0x64, 0x01, 0xf2, 0x3c, 0x0c, 0xd7, 0x2d, 0x8f, 0x3a, 0x7a, 0xcb, 0x33, 0xef, 0x53, 0x31, 0x35, - 0xe0, 0xf5, 0xbb, 0x19, 0x82, 0x35, 0x99, 0x86, 0xbc, 0x08, 0x23, 0x0b, 0xba, 0xe3, 0x99, 0x2d, - 0xb3, 0xa3, 0x5b, 0x9e, 0xab, 0x0c, 0xe2, 0x8c, 0x86, 0x16, 0x46, 0x47, 0x82, 0x6b, 0x11, 0x2a, - 0xf2, 0x69, 0x18, 0xc2, 0xad, 0x29, 0xfa, 0xd8, 0x0f, 0x6d, 0x7b, 0xa5, 0xfa, 0x64, 0xe8, 0x83, - 0xc9, 0x0f, 0x77, 0xf1, 0x9a, 0x3d, 0x7e, 0xab, 0x1a, 0x70, 0x24, 0x6f, 0xc2, 0xc0, 0xa4, 0x65, - 0x20, 0x73, 0xd8, 0x96, 0xb9, 0x2a, 0x98, 0x9f, 0x0d, 0x99, 0xdb, 0x9d, 0x18, 0x6f, 0x9f, 0x5d, - 0xfa, 0x28, 0x1b, 0x7e, 0xf7, 0x46, 0xd9, 0xc8, 0xbb, 0x70, 0xea, 0x3e, 0x7a, 0x50, 0xa7, 0xee, - 0x63, 0x7b, 0x3c, 0x75, 0x57, 0xdf, 0x81, 0xe1, 0xf1, 0x85, 0xa9, 0x60, 0xf4, 0x9e, 0x87, 0xc2, - 0x82, 0x70, 0x07, 0x29, 0x72, 0x7b, 0xa6, 0x63, 0x1a, 0x1a, 0x83, 0x91, 0x2b, 0x30, 0x38, 0x81, - 0x3e, 0x86, 0xe2, 0xbe, 0xb3, 0xc8, 0xd7, 0xbf, 0x16, 0xc2, 0xd0, 0xd5, 0xd8, 0x47, 0x93, 0x0f, - 0xc0, 0xc0, 0x82, 0x63, 0x2f, 0x3b, 0xfa, 0x9a, 0x58, 0x83, 0xd1, 0x1f, 0xa7, 0xc3, 0x41, 0x9a, - 0x8f, 0x53, 0x7f, 0x24, 0xe7, 0x9b, 0xed, 0xac, 0x44, 0xa3, 0x8b, 0x47, 0xf3, 0x58, 0xf7, 0x20, - 0x2f, 0xe1, 0x72, 0x90, 0xe6, 0xe3, 0xc8, 0x15, 0xe8, 0x9f, 0x74, 0x1c, 0xdb, 0x91, 0xdf, 0x25, - 0x50, 0x06, 0x90, 0x2f, 0xa6, 0x91, 0x82, 0x7c, 0x18, 0x86, 0xf9, 0x9c, 0xc3, 0x4f, 0x34, 0x0b, - 0xbd, 0xee, 0x74, 0x65, 0x4a, 0xf5, 0x37, 0x0b, 0x92, 0xcd, 0xc6, 0x25, 0xfe, 0x10, 0xde, 0x0a, - 0xbc, 0x00, 0x85, 0xf1, 0x85, 0x29, 0x31, 0x01, 0x9e, 0xf2, 0x8b, 0x4a, 0xaa, 0x12, 0x2b, 0xc7, - 0xa8, 0xc9, 0x45, 0x28, 0x2e, 0x30, 0xf5, 0x29, 0xa1, 0x7a, 0x0c, 0x6e, 0x6d, 0x56, 0x8a, 0x1d, - 0xa6, 0x3f, 0x08, 0x45, 0x2c, 0xdb, 0xcc, 0xf0, 0x1d, 0x13, 0xc7, 0x86, 0xfb, 0x98, 0x8b, 0x50, - 0xac, 0x3a, 0xcb, 0xf7, 0xc5, 0xac, 0x85, 0x58, 0xdd, 0x59, 0xbe, 0xaf, 0x21, 0x94, 0x5c, 0x03, - 0xd0, 0xa8, 0xd7, 0x75, 0x2c, 0x7c, 0x32, 0x34, 0x84, 0xe7, 0x6f, 0x38, 0x1b, 0x3a, 0x08, 0x6d, - 0xb6, 0x6c, 0x83, 0x6a, 0x12, 0x89, 0xfa, 0x77, 0xc2, 0x8b, 0x9d, 0x9a, 0xe9, 0xae, 0x1e, 0x77, - 0xe1, 0x2e, 0xba, 0x50, 0x17, 0x47, 0x9c, 0xc9, 0x4e, 0xaa, 0x40, 0xff, 0x54, 0x5b, 0x5f, 0x76, - 0xb1, 0x0f, 0x85, 0xc3, 0xde, 0x3d, 0x06, 0xd0, 0x38, 0x3c, 0xd6, 0x4f, 0x83, 0xdb, 0xf7, 0xd3, - 0x57, 0xfa, 0x83, 0xd1, 0x36, 0x47, 0xbd, 0x75, 0xdb, 0x39, 0xee, 0xaa, 0x9d, 0x76, 0xd5, 0x25, - 0x18, 0x68, 0x38, 0x2d, 0xe9, 0xe8, 0x02, 0xf7, 0x03, 0xae, 0xd3, 0xe2, 0xc7, 0x16, 0x3e, 0x92, - 0xd1, 0xd5, 0x5c, 0x0f, 0xe9, 0x06, 0x42, 0x3a, 0xc3, 0xf5, 0x04, 0x9d, 0x40, 0x0a, 0xba, 0x05, - 0xdb, 0xf1, 0x44, 0xc7, 0x05, 0x74, 0x1d, 0xdb, 0xf1, 0x34, 0x1f, 0x49, 0x3e, 0x04, 0xb0, 0x38, - 0xb1, 0xe0, 0xbf, 0x68, 0x18, 0x0a, 0x1d, 0x2e, 0xc5, 0x53, 0x06, 0x4d, 0x42, 0x93, 0x45, 0x18, - 0x9a, 0xef, 0x50, 0x87, 0x6f, 0x85, 0xf8, 0x23, 0xa0, 0x0f, 0xc6, 0x44, 0x2b, 0xfa, 0xfd, 0xaa, - 0xf8, 0x3f, 0x20, 0xe7, 0xeb, 0x8b, 0xed, 0xff, 0xd4, 0x42, 0x46, 0xe4, 0xc3, 0x50, 0xaa, 0x72, - 0x3b, 0x6f, 0x18, 0x59, 0x06, 0x22, 0xc3, 0x2d, 0x28, 0x47, 0xf1, 0x3d, 0xbb, 0x8e, 0x7f, 0x6b, - 0x82, 0x5c, 0xbd, 0x02, 0xe5, 0x78, 0x35, 0x64, 0x18, 0x06, 0x26, 0xe6, 0xe7, 0xe6, 0x26, 0x27, - 0x16, 0xcb, 0x7d, 0x64, 0x10, 0x8a, 0x8d, 0xc9, 0xb9, 0x5a, 0x39, 0xa7, 0x7e, 0x4d, 0x9a, 0x41, - 0x98, 0x6a, 0x1d, 0x5f, 0x0d, 0xef, 0xeb, 0xbe, 0xa5, 0x8c, 0xf7, 0xa1, 0x78, 0x62, 0xb0, 0x66, - 0x7a, 0x1e, 0x35, 0xc4, 0x2a, 0x81, 0xf7, 0x85, 0xde, 0x03, 0x2d, 0x81, 0x27, 0xcf, 0xc0, 0x28, - 0xc2, 0xc4, 0x15, 0x21, 0xdf, 0x1f, 0x8b, 0x02, 0xce, 0x03, 0x2d, 0x8a, 0x54, 0xbf, 0x1d, 0xde, - 0x0e, 0xcf, 0x50, 0xfd, 0xa8, 0xde, 0x28, 0xbe, 0x47, 0xfa, 0x4b, 0xfd, 0x95, 0x7e, 0xfe, 0xce, - 0x86, 0xbf, 0xf1, 0x3c, 0x0c, 0x51, 0x86, 0x47, 0xba, 0x85, 0x5d, 0x1c, 0xe9, 0x3e, 0x03, 0xa5, - 0x59, 0xea, 0xad, 0xd8, 0xbe, 0x8b, 0x1a, 0xfa, 0x84, 0xac, 0x21, 0x44, 0xf6, 0x09, 0xe1, 0x34, - 0x64, 0x15, 0x88, 0xff, 0x80, 0x33, 0xf0, 0x76, 0xf7, 0x8f, 0x90, 0xcf, 0x25, 0xf6, 0x29, 0x0d, - 0x7c, 0xe6, 0x8d, 0x0f, 0x19, 0x4e, 0x07, 0xde, 0xf4, 0x92, 0xcf, 0xd8, 0xbf, 0xdb, 0xac, 0x94, - 0x38, 0x8d, 0x96, 0xc2, 0x96, 0x7c, 0x02, 0x86, 0x66, 0xa7, 0xaa, 0xe2, 0x31, 0x27, 0xf7, 0x8a, - 0x38, 0x1f, 0x48, 0xd1, 0x47, 0x04, 0x22, 0xc1, 0x47, 0x4d, 0x6b, 0xf7, 0xf4, 0xe4, 0x5b, 0xce, - 0x90, 0x0b, 0xd3, 0x16, 0xfe, 0x3c, 0x4a, 0x9c, 0x2e, 0x04, 0xda, 0x12, 0x7d, 0x34, 0x15, 0x97, - 0x15, 0xc7, 0xc6, 0xb4, 0x65, 0x70, 0x1f, 0xa3, 0x7b, 0x1e, 0x4e, 0x56, 0x3b, 0x9d, 0xb6, 0x49, - 0x0d, 0xd4, 0x17, 0xad, 0xdb, 0xa6, 0xae, 0xf0, 0x28, 0xc2, 0x17, 0x37, 0x3a, 0x47, 0x36, 0xf1, - 0x09, 0x71, 0xd3, 0xe9, 0x46, 0x3d, 0x49, 0x93, 0x65, 0xf1, 0xc5, 0x36, 0x67, 0x6f, 0x3b, 0xf5, - 0x9a, 0xf0, 0x29, 0xe2, 0x2f, 0xb6, 0x7d, 0x70, 0xd4, 0xc3, 0x52, 0x26, 0x57, 0x7f, 0x2c, 0x0f, - 0x67, 0x27, 0x1c, 0xaa, 0x7b, 0x74, 0x76, 0xaa, 0x5a, 0xed, 0xa2, 0x2f, 0x60, 0xbb, 0x4d, 0xad, - 0xe5, 0xc3, 0x99, 0x14, 0x5e, 0x83, 0xb1, 0xa0, 0x01, 0x8d, 0x96, 0xdd, 0xa1, 0xf2, 0xdb, 0xb7, - 0x96, 0x8f, 0x69, 0xba, 0x0c, 0xa5, 0xc5, 0x48, 0xc9, 0x2d, 0x38, 0x15, 0x40, 0xaa, 0xed, 0xb6, - 0xbd, 0xae, 0xd1, 0xae, 0xcb, 0x1d, 0x8e, 0x07, 0xb9, 0xc3, 0x71, 0xc8, 0x41, 0x67, 0xf8, 0xa6, - 0xc3, 0x08, 0xb4, 0xb4, 0x52, 0xea, 0x57, 0x0b, 0x70, 0xee, 0x8e, 0xde, 0x36, 0x8d, 0x50, 0x34, - 0x1a, 0x75, 0x3b, 0xb6, 0xe5, 0xd2, 0x23, 0x34, 0xc6, 0x23, 0x03, 0xa9, 0x78, 0x20, 0x03, 0x29, - 0xd9, 0x45, 0xfd, 0xfb, 0xee, 0xa2, 0xd2, 0x9e, 0xba, 0xe8, 0x7f, 0xc9, 0x41, 0xd9, 0x7f, 0x9b, - 0x21, 0x3f, 0xdb, 0x97, 0x1e, 0x0e, 0xe0, 0x01, 0x64, 0xcc, 0xbf, 0x1c, 0xf1, 0xa4, 0x01, 0x03, - 0x93, 0x0f, 0x3a, 0xa6, 0x43, 0xdd, 0x1d, 0x38, 0xc7, 0x3f, 0x2a, 0x0e, 0x5b, 0x4e, 0x52, 0x5e, - 0x24, 0x71, 0xce, 0xc2, 0xc1, 0xf8, 0xe2, 0x92, 0xbf, 0x4e, 0x19, 0xf7, 0x63, 0x11, 0xf0, 0x17, - 0x97, 0xe2, 0x15, 0x4b, 0xe4, 0x09, 0x6d, 0x48, 0x4a, 0x9e, 0x84, 0xc2, 0xe2, 0xe2, 0x8c, 0x98, - 0x87, 0x31, 0x06, 0x84, 0xe7, 0xc9, 0x4f, 0x4a, 0x19, 0x56, 0xfd, 0x57, 0x79, 0xfe, 0xca, 0x9a, - 0x0f, 0xd7, 0x43, 0x51, 0xc2, 0x71, 0x18, 0xf4, 0x05, 0x2e, 0xd4, 0x30, 0x78, 0x58, 0x11, 0xef, - 0x88, 0x78, 0xdd, 0xc1, 0x23, 0x9a, 0x8a, 0xef, 0x30, 0xcf, 0x6f, 0x11, 0x70, 0x5f, 0x84, 0x0e, - 0xf3, 0xbe, 0x9b, 0xfc, 0x87, 0x60, 0x28, 0x98, 0xa1, 0xe4, 0xdb, 0x83, 0x60, 0x3a, 0xd3, 0x42, - 0x7c, 0x6c, 0x62, 0x2e, 0xed, 0x63, 0x19, 0xf7, 0xc5, 0xcb, 0x7b, 0xe5, 0x58, 0xbc, 0x07, 0x2c, - 0xde, 0x2f, 0x0a, 0xf1, 0xf2, 0x47, 0x56, 0x47, 0x56, 0xbc, 0x07, 0x76, 0x72, 0xae, 0xfe, 0x61, - 0x0e, 0x08, 0x6b, 0xd6, 0x82, 0xee, 0xba, 0xeb, 0xb6, 0x63, 0x70, 0x27, 0xfc, 0x43, 0x11, 0xcc, - 0xc1, 0xdd, 0x76, 0xfe, 0xc0, 0x10, 0x9c, 0x8a, 0xb8, 0x0d, 0x1f, 0xf1, 0xc9, 0xea, 0x4a, 0x74, - 0x34, 0xf5, 0x7a, 0xdd, 0xf3, 0x94, 0x7c, 0x9d, 0xda, 0x1f, 0x79, 0x23, 0x28, 0xdd, 0xa3, 0x3e, - 0x0b, 0x23, 0xe2, 0x07, 0x5b, 0xa1, 0xfd, 0x7b, 0x32, 0x1c, 0xa5, 0x2e, 0x03, 0x68, 0x11, 0x34, - 0x79, 0x09, 0x86, 0xd8, 0x80, 0x59, 0xc6, 0x70, 0x31, 0x03, 0xe1, 0xcb, 0x19, 0xc3, 0x07, 0xca, - 0xeb, 0x49, 0x40, 0x29, 0xb9, 0x7b, 0x0f, 0xee, 0xe0, 0x7d, 0xd6, 0x67, 0x60, 0xb8, 0x6a, 0x59, - 0xb6, 0x87, 0x5b, 0x7c, 0x57, 0x5c, 0x6c, 0x64, 0xda, 0xf4, 0x4f, 0x62, 0xfc, 0x82, 0x90, 0x3e, - 0xd5, 0xa8, 0x97, 0x19, 0x92, 0xeb, 0xfe, 0xeb, 0x1f, 0xea, 0x08, 0xf3, 0x14, 0x2f, 0x77, 0x1c, - 0x01, 0x4b, 0x3e, 0xfe, 0xc1, 0xce, 0x1b, 0x5d, 0x70, 0xec, 0x8e, 0xed, 0x52, 0x83, 0x0b, 0x6a, - 0x38, 0x8c, 0x06, 0xd1, 0x11, 0x08, 0x7c, 0x6a, 0x18, 0x09, 0xdd, 0x12, 0x29, 0x42, 0xee, 0xc1, - 0x69, 0xff, 0x9a, 0x39, 0x78, 0xd4, 0x59, 0xaf, 0xb9, 0xe8, 0x32, 0x3f, 0x1c, 0xc6, 0x27, 0x09, - 0x51, 0xe3, 0x8f, 0xf9, 0x97, 0x2a, 0xfe, 0xab, 0xd0, 0xa6, 0x69, 0xc8, 0x5d, 0x9d, 0xca, 0x8f, - 0x7c, 0x37, 0x0c, 0xcf, 0xea, 0x0f, 0x6a, 0x5d, 0x71, 0x72, 0x33, 0xba, 0xf3, 0xbb, 0x9b, 0x35, - 0xfd, 0x41, 0xd3, 0x10, 0xe5, 0x62, 0x36, 0x85, 0xcc, 0x92, 0x34, 0xe1, 0xec, 0x82, 0x63, 0xaf, - 0xd9, 0x1e, 0x35, 0x62, 0xef, 0x23, 0x4f, 0x84, 0x0f, 0xaa, 0x3b, 0x82, 0xa2, 0xd9, 0xe3, 0xa1, - 0x64, 0x06, 0x1b, 0xb2, 0x06, 0x27, 0xaa, 0xae, 0xdb, 0x5d, 0xa3, 0xe1, 0xfd, 0x56, 0x79, 0xdb, - 0xcf, 0xf8, 0xa0, 0xf0, 0x79, 0x7e, 0x44, 0xc7, 0xa2, 0xfc, 0x7a, 0xab, 0xe9, 0x99, 0x72, 0x8d, - 0xf8, 0x2d, 0x71, 0xde, 0xac, 0x77, 0x7d, 0x01, 0xe2, 0xd3, 0x7e, 0xe5, 0x24, 0x0e, 0x2f, 0xec, - 0xdd, 0x40, 0xf4, 0x18, 0x16, 0x40, 0xee, 0xdd, 0x48, 0x91, 0x9b, 0xc5, 0xc1, 0xb1, 0xf2, 0x09, - 0xed, 0x5c, 0xf2, 0x83, 0xf8, 0xcb, 0xa1, 0xbf, 0x99, 0x8f, 0xcd, 0x44, 0xdc, 0x46, 0xdb, 0xd7, - 0x4c, 0x24, 0xcf, 0x28, 0xf9, 0x3d, 0xce, 0x28, 0x4f, 0x25, 0xbd, 0x2e, 0x52, 0xa6, 0x89, 0xef, - 0x86, 0x31, 0xbf, 0x04, 0xb6, 0x7b, 0x23, 0x58, 0x6a, 0xb2, 0xbb, 0xe3, 0xa2, 0xe8, 0x8e, 0x32, - 0x1a, 0xa9, 0x1b, 0xb1, 0x3e, 0x88, 0xf1, 0x53, 0xbf, 0x99, 0x03, 0x08, 0x95, 0x98, 0x3c, 0x1b, - 0x8d, 0xfb, 0x95, 0x0b, 0xaf, 0xa2, 0x44, 0x10, 0x8f, 0x48, 0xa0, 0x2f, 0x72, 0x11, 0x8a, 0x18, - 0xe8, 0x25, 0x1f, 0x1e, 0x7d, 0xaf, 0x9a, 0x96, 0xa1, 0x21, 0x94, 0x61, 0xa5, 0x88, 0x0c, 0x88, - 0x45, 0xb7, 0x0b, 0x6e, 0x79, 0xd7, 0xe0, 0x44, 0xa3, 0xbb, 0x24, 0x77, 0xa6, 0x1c, 0xca, 0xca, - 0xed, 0x2e, 0x05, 0x6f, 0xb2, 0x23, 0xd1, 0x7c, 0xa2, 0x45, 0xd4, 0xaf, 0xe7, 0x62, 0xfd, 0x7b, - 0x88, 0x86, 0xc5, 0x8e, 0xfa, 0x54, 0xfd, 0x83, 0x02, 0x0c, 0x2f, 0xd8, 0x8e, 0x27, 0x22, 0xe7, - 0x1c, 0xed, 0x95, 0x5e, 0xda, 0x8f, 0x16, 0x77, 0xb1, 0x1f, 0xbd, 0x08, 0x45, 0xc9, 0x89, 0x9c, - 0xdf, 0x5c, 0x19, 0x86, 0xa3, 0x21, 0xf4, 0x5d, 0x7e, 0x14, 0x93, 0xbc, 0xa6, 0x1e, 0xd8, 0xb7, - 0x33, 0xc8, 0xf7, 0xe4, 0x01, 0xde, 0x7c, 0xfe, 0xf9, 0x87, 0xb8, 0x4b, 0xd5, 0x9f, 0xcc, 0xc1, - 0x09, 0x71, 0xf9, 0x2b, 0xc5, 0xfc, 0x1b, 0xf0, 0xaf, 0xed, 0xe5, 0x99, 0x84, 0x83, 0x34, 0x1f, - 0xc7, 0x0c, 0x83, 0xc9, 0x07, 0xa6, 0x87, 0xf7, 0x5f, 0x52, 0xd0, 0x3f, 0x2a, 0x60, 0xb2, 0x61, - 0xe0, 0xd3, 0x91, 0x67, 0xfd, 0x6b, 0xed, 0x42, 0x68, 0x0d, 0xb1, 0x02, 0x93, 0xa9, 0x57, 0xdb, - 0xea, 0x2f, 0x14, 0xa1, 0x38, 0xf9, 0x80, 0xb6, 0x8e, 0x78, 0xd7, 0x48, 0x87, 0xe5, 0xc5, 0x7d, - 0x1e, 0x96, 0xef, 0xc5, 0x4f, 0xe7, 0x8d, 0xb0, 0x3f, 0x4b, 0xd1, 0xea, 0x63, 0x3d, 0x1f, 0xaf, - 0xde, 0xef, 0xe9, 0xa3, 0xe7, 0xe6, 0xf5, 0x4f, 0x0a, 0x50, 0x68, 0x4c, 0x2c, 0x1c, 0xeb, 0xcd, - 0xa1, 0xea, 0x4d, 0x6f, 0x3f, 0x08, 0x35, 0xb8, 0xda, 0x1c, 0x0c, 0x3d, 0x8f, 0x63, 0xb7, 0x98, - 0x7f, 0x5e, 0x80, 0xb1, 0xc6, 0xd4, 0xe2, 0x82, 0x74, 0xbb, 0x70, 0x8b, 0x7b, 0x87, 0xa2, 0x9f, - 0x22, 0xef, 0xd2, 0x8b, 0x09, 0xb3, 0xea, 0x76, 0xdd, 0xf2, 0x5e, 0x7e, 0xf1, 0x8e, 0xde, 0xee, - 0x52, 0x3c, 0x90, 0xe3, 0xbe, 0xe4, 0xae, 0xf9, 0x0e, 0xfd, 0x2a, 0x86, 0xd9, 0xf0, 0x19, 0x90, - 0xd7, 0xa0, 0x70, 0x5b, 0x78, 0xf9, 0x64, 0xf1, 0x79, 0xe1, 0x3a, 0xe7, 0xc3, 0x26, 0xc1, 0x42, - 0xd7, 0x34, 0x90, 0x03, 0x2b, 0xc5, 0x0a, 0xdf, 0x10, 0x26, 0xc3, 0x8e, 0x0a, 0x2f, 0xfb, 0x85, - 0x6f, 0xd4, 0x6b, 0xa4, 0x01, 0xc3, 0x0b, 0xd4, 0x59, 0x33, 0xb1, 0xa3, 0xfc, 0x39, 0xbb, 0x37, - 0x13, 0xb6, 0x7f, 0x1d, 0xee, 0x84, 0x85, 0x90, 0x99, 0xcc, 0x85, 0xbc, 0x05, 0xc0, 0xad, 0xaa, - 0x1d, 0xc6, 0x91, 0x7d, 0x14, 0x77, 0x83, 0x7c, 0xc3, 0x91, 0x62, 0xf9, 0x4b, 0xcc, 0xc8, 0x2a, - 0x94, 0x67, 0x6d, 0xc3, 0xbc, 0x67, 0x72, 0x77, 0x5e, 0xac, 0xa0, 0xb4, 0xbd, 0x13, 0x1d, 0xdb, - 0x60, 0xac, 0x49, 0xe5, 0xd2, 0xaa, 0x49, 0x30, 0x56, 0xff, 0x61, 0x3f, 0x14, 0x59, 0xb7, 0x1f, - 0x8f, 0xdf, 0xfd, 0x8c, 0xdf, 0x2a, 0x94, 0xef, 0xda, 0xce, 0xaa, 0x69, 0x2d, 0x07, 0x2f, 0x2d, - 0xc4, 0x89, 0x05, 0x7a, 0x87, 0xad, 0x73, 0x5c, 0x33, 0x78, 0x94, 0xa1, 0x25, 0xc8, 0xb7, 0x19, - 0xc1, 0xaf, 0x00, 0xf0, 0xf0, 0x0c, 0x48, 0x33, 0x18, 0x86, 0x86, 0xe1, 0xc1, 0x1b, 0xf0, 0xf1, - 0x86, 0x1c, 0x1a, 0x26, 0x24, 0x26, 0x57, 0x7c, 0xff, 0x9a, 0x21, 0x7c, 0xcb, 0x81, 0x47, 0x33, - 0xe8, 0x5f, 0x23, 0x1b, 0x01, 0xdc, 0xd3, 0x66, 0x01, 0x40, 0xba, 0xb3, 0x84, 0x98, 0x20, 0x22, - 0x93, 0x83, 0x88, 0xeb, 0x98, 0x72, 0x65, 0xa9, 0x49, 0x3c, 0xc8, 0xcb, 0x31, 0xa7, 0x0a, 0x12, - 0xe1, 0x96, 0xe9, 0x53, 0x11, 0x3a, 0xe5, 0x8d, 0x6c, 0xe7, 0x94, 0xa7, 0xfe, 0x6c, 0x01, 0x86, - 0x19, 0xb7, 0x46, 0x77, 0x6d, 0x4d, 0x77, 0x36, 0x8e, 0x15, 0x79, 0x3f, 0x8a, 0xdc, 0x84, 0x93, - 0xf2, 0x23, 0x0c, 0x66, 0xba, 0xfa, 0x31, 0xc2, 0x82, 0x2d, 0x7c, 0x9c, 0x80, 0xdb, 0x96, 0x38, - 0xef, 0x7b, 0x02, 0x8c, 0x27, 0x4e, 0xae, 0x96, 0xe4, 0xa5, 0xfe, 0x68, 0x0e, 0xca, 0x71, 0x68, - 0xa0, 0xfb, 0xb9, 0x54, 0xdd, 0x7f, 0x06, 0x86, 0x84, 0x5b, 0x86, 0x6e, 0x08, 0x2f, 0xd1, 0xb1, - 0xad, 0xcd, 0x0a, 0xe0, 0x9b, 0xf8, 0xa6, 0x43, 0x75, 0x43, 0x0b, 0x09, 0xc8, 0x4b, 0x30, 0x82, - 0x3f, 0xee, 0x3a, 0xa6, 0xe7, 0x51, 0xde, 0x19, 0x45, 0x7e, 0x57, 0xc4, 0x0b, 0xac, 0x73, 0x84, - 0x16, 0x21, 0x53, 0x7f, 0x3b, 0x0f, 0x43, 0x8d, 0xee, 0x92, 0xbb, 0xe1, 0x7a, 0x74, 0xed, 0x88, - 0xeb, 0x90, 0x7f, 0xac, 0x50, 0x4c, 0x3d, 0x56, 0x78, 0xd2, 0x1f, 0x5a, 0xd2, 0x9d, 0x46, 0xb0, - 0x31, 0xf0, 0x3d, 0x5d, 0x43, 0x2d, 0x2a, 0xed, 0x5e, 0x8b, 0xd4, 0xbf, 0x9f, 0x87, 0x32, 0x77, - 0x08, 0xa8, 0x99, 0x6e, 0xeb, 0x00, 0x1e, 0x29, 0x1d, 0xbe, 0x4c, 0xf7, 0xe7, 0x44, 0xb3, 0x83, - 0xa7, 0x5f, 0xea, 0xe7, 0xf2, 0x30, 0x5c, 0xed, 0x7a, 0x2b, 0x55, 0x0f, 0xe7, 0xb7, 0x87, 0x72, - 0x8f, 0xfc, 0x5b, 0x39, 0x38, 0xc1, 0x1a, 0xb2, 0x68, 0xaf, 0x52, 0xeb, 0x00, 0xae, 0x44, 0x0e, - 0xe2, 0x20, 0xd2, 0x97, 0x65, 0x61, 0x77, 0xb2, 0xc4, 0x8b, 0x3c, 0xcd, 0x6e, 0xd3, 0xa3, 0xfd, - 0x19, 0x07, 0x78, 0x91, 0xe7, 0x0b, 0xe4, 0x00, 0x2e, 0x8e, 0xdf, 0x5f, 0x02, 0x39, 0x80, 0x13, - 0xd9, 0xf7, 0x87, 0x40, 0x7e, 0x33, 0x07, 0x43, 0xe3, 0xb6, 0x77, 0xc4, 0x07, 0xbe, 0xf8, 0x8a, - 0xa3, 0xad, 0xe6, 0xfe, 0x57, 0x1c, 0x6d, 0xdd, 0x54, 0x7f, 0x3c, 0x0f, 0xa7, 0x45, 0x9e, 0x0a, - 0x71, 0x06, 0x76, 0x3c, 0x1d, 0x8b, 0xc1, 0x96, 0x14, 0xcd, 0xf1, 0x3c, 0x24, 0x44, 0xf3, 0xd3, - 0x05, 0x38, 0x8d, 0x71, 0xb0, 0xd9, 0x8e, 0xea, 0x7d, 0x60, 0x8b, 0x90, 0x56, 0xd4, 0x3d, 0x63, - 0x36, 0xc5, 0x3d, 0xe3, 0xdf, 0x6d, 0x56, 0x5e, 0x5e, 0x36, 0xbd, 0x95, 0xee, 0xd2, 0xd5, 0x96, - 0xbd, 0x76, 0x6d, 0xd9, 0xd1, 0xef, 0x9b, 0xdc, 0x31, 0x41, 0x6f, 0x5f, 0x0b, 0xd3, 0x47, 0x75, - 0x4c, 0x91, 0x0c, 0xaa, 0x81, 0x3b, 0x25, 0xc6, 0xd5, 0x77, 0xec, 0x70, 0x01, 0x6e, 0xda, 0xa6, - 0x25, 0x7c, 0xa5, 0xb9, 0xa1, 0xdb, 0xd8, 0xda, 0xac, 0x9c, 0x79, 0xdb, 0x36, 0xad, 0x66, 0xdc, - 0x61, 0x7a, 0xb7, 0xf5, 0x85, 0xac, 0x35, 0xa9, 0x1a, 0xf5, 0x9f, 0xe7, 0xe0, 0x7c, 0x54, 0x8b, - 0xdf, 0x0f, 0xb6, 0xe3, 0x5f, 0xcf, 0xc3, 0x99, 0x1b, 0x28, 0x9c, 0xc0, 0xc5, 0xec, 0x78, 0xde, - 0x12, 0x83, 0x33, 0x45, 0x36, 0xc7, 0x16, 0x65, 0xb6, 0x6c, 0x8e, 0x27, 0x75, 0x21, 0x9b, 0xdf, - 0xcd, 0xc1, 0xa9, 0xf9, 0x7a, 0x6d, 0xe2, 0x7d, 0x32, 0xa2, 0x92, 0xdf, 0x73, 0xc4, 0x0d, 0xce, - 0xc4, 0xf7, 0x1c, 0x71, 0xd3, 0xf3, 0xcb, 0x79, 0x38, 0xd5, 0xa8, 0xce, 0xce, 0xbc, 0x5f, 0x66, - 0xf0, 0x09, 0xd9, 0x1f, 0xda, 0x3f, 0x04, 0x13, 0xb6, 0x80, 0xfc, 0x99, 0x77, 0xae, 0x67, 0xfb, - 0x49, 0x27, 0x85, 0x72, 0xc4, 0xa7, 0xee, 0x03, 0x11, 0x0a, 0xd3, 0xfc, 0x08, 0xf5, 0x11, 0xd7, - 0xfc, 0x7f, 0x5c, 0x82, 0xe1, 0x5b, 0xdd, 0x25, 0x2a, 0x5c, 0xba, 0x1e, 0xea, 0x93, 0xdf, 0xeb, - 0x30, 0x2c, 0xc4, 0x80, 0x37, 0x1c, 0x52, 0x50, 0x50, 0x11, 0xe4, 0x89, 0xc7, 0x5d, 0x93, 0x89, - 0xc8, 0x45, 0x28, 0xde, 0xa1, 0xce, 0x92, 0xfc, 0x5e, 0xfe, 0x3e, 0x75, 0x96, 0x34, 0x84, 0x92, - 0x99, 0xf0, 0x31, 0x4f, 0x75, 0xa1, 0x8e, 0x59, 0xb8, 0xc4, 0xa5, 0x21, 0xa6, 0x15, 0x0b, 0xdc, - 0x42, 0xf5, 0x8e, 0xc9, 0xf3, 0x77, 0xc9, 0xb1, 0x3a, 0xe2, 0x25, 0xc9, 0x1c, 0x9c, 0x8c, 0xb8, - 0x8b, 0x62, 0x0a, 0xaa, 0xc1, 0x14, 0x76, 0x69, 0xc9, 0xa7, 0x92, 0x45, 0xc9, 0x1b, 0x30, 0xe2, - 0x03, 0xd1, 0xf1, 0x71, 0x28, 0xcc, 0x7b, 0x12, 0xb0, 0x8a, 0xe5, 0x96, 0x88, 0x14, 0x90, 0x19, - 0xe0, 0x25, 0x06, 0xa4, 0x30, 0x88, 0x39, 0xeb, 0x46, 0x0a, 0x90, 0x97, 0x90, 0x01, 0x3e, 0x40, - 0x43, 0x87, 0xa9, 0x61, 0x7c, 0x4c, 0x8e, 0x17, 0x40, 0x8e, 0x80, 0xf3, 0x90, 0x01, 0x11, 0x32, - 0x32, 0x0f, 0x10, 0x3a, 0xb6, 0x88, 0xc0, 0x2c, 0xbb, 0x76, 0xb9, 0x91, 0x58, 0xc8, 0x37, 0x79, - 0xa3, 0x7b, 0xb9, 0xc9, 0x53, 0x7f, 0xac, 0x00, 0xc3, 0xd5, 0x4e, 0x27, 0x18, 0x0a, 0xcf, 0x42, - 0xa9, 0xda, 0xe9, 0xdc, 0xd6, 0xea, 0x72, 0x32, 0x09, 0xbd, 0xd3, 0x69, 0x76, 0x1d, 0x53, 0xf6, - 0x56, 0xe7, 0x44, 0x64, 0x02, 0x46, 0xab, 0x9d, 0xce, 0x42, 0x77, 0xa9, 0x6d, 0xb6, 0xa4, 0xb4, - 0x7a, 0x3c, 0x8f, 0x69, 0xa7, 0xd3, 0xec, 0x20, 0x26, 0x9e, 0x5b, 0x31, 0x5a, 0x86, 0x7c, 0x06, - 0xc3, 0x99, 0x89, 0xac, 0x6e, 0x3c, 0x6f, 0x94, 0x1a, 0xa4, 0x91, 0x08, 0xdb, 0x76, 0x35, 0x20, - 0xe2, 0xe9, 0x36, 0x2e, 0xfa, 0x49, 0x52, 0x58, 0x45, 0x89, 0xec, 0x6d, 0x21, 0x4b, 0xf2, 0x1c, - 0x0c, 0x54, 0x3b, 0x1d, 0xe9, 0xb6, 0x0a, 0x1d, 0xdb, 0x58, 0xa9, 0x78, 0x1e, 0x4e, 0x41, 0x26, - 0x3e, 0x4b, 0xdc, 0x6f, 0xdb, 0x8e, 0x87, 0x43, 0x6a, 0x34, 0xfc, 0x2c, 0xff, 0x42, 0xdc, 0x96, - 0x23, 0x08, 0x69, 0xd1, 0x32, 0x17, 0x5e, 0x87, 0xb1, 0x68, 0x8b, 0x77, 0x95, 0xf3, 0xe3, 0x3b, - 0x39, 0x94, 0xca, 0x11, 0x7f, 0xb2, 0xf1, 0x02, 0x14, 0xaa, 0x9d, 0x8e, 0x98, 0xd4, 0x4e, 0xa5, - 0x74, 0x6a, 0x3c, 0x3e, 0x44, 0xb5, 0xd3, 0xf1, 0x3f, 0xfd, 0x88, 0xbf, 0xfd, 0xda, 0xd3, 0xa7, - 0xff, 0x26, 0xff, 0xf4, 0xa3, 0xfd, 0x2e, 0x4b, 0xfd, 0x85, 0x02, 0x9c, 0xa8, 0x76, 0x3a, 0xc7, - 0x09, 0x3e, 0x0e, 0x2a, 0x0a, 0xc5, 0xf3, 0x00, 0xd2, 0x1c, 0x3b, 0x10, 0xbc, 0x4c, 0x1d, 0x96, - 0xe6, 0x57, 0x25, 0xa7, 0x49, 0x44, 0xbe, 0xfa, 0x0d, 0xee, 0x4a, 0xfd, 0x3e, 0x57, 0xc0, 0x89, - 0xef, 0xa8, 0x47, 0xd4, 0x7b, 0xaf, 0x74, 0x9b, 0xe8, 0x83, 0xd2, 0xae, 0xfa, 0xe0, 0x37, 0x22, - 0x83, 0x07, 0x33, 0x3a, 0x1c, 0xf7, 0x42, 0xff, 0xbe, 0x6c, 0xeb, 0x31, 0x59, 0x98, 0x22, 0xcc, - 0x97, 0x9f, 0xca, 0x4f, 0x04, 0x9d, 0x6b, 0x31, 0x54, 0xd3, 0x34, 0xb4, 0x18, 0xad, 0xdf, 0x87, - 0x03, 0xbb, 0xea, 0xc3, 0xcd, 0x3c, 0x06, 0x96, 0x08, 0x82, 0xd6, 0xed, 0x7f, 0x8b, 0x72, 0x0d, - 0x80, 0xbb, 0x2f, 0x04, 0xfe, 0xf9, 0xa3, 0x3c, 0x3e, 0x15, 0xcf, 0xf0, 0x27, 0xe2, 0x53, 0x85, - 0x24, 0x81, 0xbb, 0x53, 0x21, 0xd5, 0xdd, 0xe9, 0x0a, 0x0c, 0x6a, 0xfa, 0xfa, 0x27, 0xba, 0x54, - 0x3c, 0x66, 0xf2, 0x63, 0xc2, 0xea, 0xeb, 0xcd, 0xcf, 0x32, 0xa0, 0x16, 0xa0, 0x89, 0x1a, 0x44, - 0x26, 0x91, 0xdc, 0x4a, 0xf8, 0x41, 0x7b, 0x10, 0x8f, 0x64, 0x2f, 0x8a, 0x4e, 0x5e, 0x85, 0x42, - 0xf5, 0x6e, 0x43, 0x48, 0x36, 0xe8, 0xda, 0xea, 0xdd, 0x86, 0x90, 0x57, 0x66, 0xd9, 0xbb, 0x0d, - 0xf5, 0x73, 0x79, 0x20, 0x49, 0x4a, 0xf2, 0x32, 0x0c, 0x21, 0x74, 0x99, 0xe9, 0x8c, 0x9c, 0x1a, - 0x7a, 0xdd, 0x6d, 0x3a, 0x08, 0x8d, 0x58, 0x88, 0x3e, 0x29, 0x79, 0x05, 0x73, 0xf9, 0x8b, 0xe4, - 0xa4, 0x91, 0xd4, 0xd0, 0xeb, 0xae, 0x9f, 0xfd, 0x3e, 0x96, 0xca, 0x5f, 0x10, 0xa3, 0x71, 0x79, - 0xb7, 0x31, 0x6d, 0xbb, 0x9e, 0x10, 0x35, 0x37, 0x2e, 0xd7, 0x5d, 0xcc, 0x49, 0x1e, 0x31, 0x2e, - 0x39, 0x19, 0xe6, 0x55, 0xbc, 0xdb, 0xe0, 0xaf, 0xf0, 0x0c, 0xcd, 0x0e, 0x72, 0x18, 0xf2, 0xbc, - 0x8a, 0xeb, 0x6e, 0x93, 0xbf, 0xe0, 0x33, 0x9a, 0x8e, 0xdd, 0x8e, 0xe6, 0x55, 0x8c, 0x94, 0x52, - 0x7f, 0x68, 0x10, 0xca, 0x35, 0xdd, 0xd3, 0x97, 0x74, 0x97, 0x4a, 0x5b, 0xf2, 0x13, 0x3e, 0xcc, - 0xff, 0x1c, 0x49, 0x0e, 0xc6, 0x52, 0xca, 0xd7, 0xc4, 0x0b, 0x90, 0xd7, 0x42, 0xbe, 0x41, 0xd6, - 0x6b, 0x39, 0x8d, 0xe6, 0x52, 0xb3, 0x23, 0xc0, 0x5a, 0x82, 0x90, 0x3c, 0x03, 0xc3, 0x3e, 0x8c, - 0xed, 0x22, 0x0a, 0xa1, 0xce, 0x18, 0x4b, 0x6c, 0x13, 0xa1, 0xc9, 0x68, 0xf2, 0x0a, 0x8c, 0xf8, - 0x3f, 0x25, 0xfb, 0x9c, 0xe7, 0x04, 0x5d, 0x4a, 0x6c, 0xc1, 0x64, 0x52, 0xb9, 0x28, 0xce, 0x6f, - 0xfd, 0x91, 0xa2, 0xb1, 0xb4, 0x9b, 0x11, 0x52, 0xf2, 0x59, 0x18, 0xf3, 0x7f, 0x8b, 0x5d, 0x07, - 0xf7, 0x3e, 0x7c, 0xc6, 0x57, 0xc2, 0xb8, 0x58, 0xaf, 0x46, 0xc9, 0xf9, 0xfe, 0xe3, 0x11, 0x3f, - 0xfd, 0xa3, 0xb1, 0x94, 0xdc, 0x7e, 0xc4, 0x2a, 0x20, 0x75, 0x38, 0xe9, 0x43, 0x42, 0x0d, 0x1d, - 0x08, 0xb7, 0x9d, 0xc6, 0x52, 0x33, 0x55, 0x49, 0x93, 0xa5, 0x48, 0x1b, 0x2e, 0x46, 0x80, 0x86, - 0xbb, 0x62, 0xde, 0xf3, 0xc4, 0x9e, 0x51, 0x04, 0x68, 0x17, 0xa9, 0x83, 0x03, 0xae, 0x9c, 0xc6, - 0xcf, 0x01, 0x1e, 0x0d, 0x41, 0xd3, 0x93, 0x1b, 0x69, 0xc0, 0x69, 0x1f, 0x7f, 0x63, 0x62, 0x61, - 0xc1, 0xb1, 0xdf, 0xa6, 0x2d, 0xaf, 0x5e, 0x13, 0x7b, 0x6e, 0x0c, 0xdc, 0x69, 0x2c, 0x35, 0x97, - 0x5b, 0x1d, 0xa6, 0x14, 0x0c, 0x17, 0x65, 0x9e, 0x5a, 0x98, 0xdc, 0x81, 0x33, 0x12, 0xbc, 0x6e, - 0xb9, 0x9e, 0x6e, 0xb5, 0x68, 0x10, 0x30, 0x07, 0x0f, 0x05, 0x04, 0x57, 0x53, 0x20, 0xa3, 0x6c, - 0xd3, 0x8b, 0x93, 0xd7, 0x61, 0xd4, 0x47, 0xf0, 0xab, 0xc8, 0x61, 0xbc, 0x8a, 0xc4, 0x21, 0x69, - 0x2c, 0x35, 0xe3, 0x8f, 0xc5, 0xa3, 0xc4, 0xb2, 0x46, 0x2d, 0x6e, 0x74, 0xa8, 0x70, 0x0b, 0xf6, - 0x35, 0xca, 0xdb, 0xe8, 0xa4, 0x2a, 0x23, 0x23, 0x25, 0x6f, 0x84, 0x1a, 0x35, 0xef, 0x98, 0xcb, - 0xa6, 0x9f, 0xda, 0xeb, 0x9c, 0xd0, 0x0f, 0x1b, 0x81, 0x69, 0xfa, 0xc1, 0xc9, 0x2f, 0x54, 0xe1, - 0x54, 0x8a, 0x8e, 0xed, 0x6a, 0xc7, 0xf8, 0x85, 0x7c, 0xd8, 0x88, 0x23, 0xbe, 0x6d, 0x1c, 0x87, - 0x41, 0xff, 0x4b, 0x84, 0xf1, 0xa0, 0x64, 0x0d, 0xcd, 0x38, 0x0f, 0x1f, 0x1f, 0x11, 0xc7, 0x11, - 0xdf, 0x4a, 0x1e, 0x84, 0x38, 0xbe, 0x95, 0x0b, 0xc5, 0x71, 0xc4, 0xb7, 0x97, 0xbf, 0x55, 0x0c, - 0xe7, 0xa4, 0xe3, 0x3d, 0xe6, 0x41, 0x99, 0xc9, 0xa1, 0x33, 0x6d, 0x69, 0x17, 0x6f, 0x88, 0x65, - 0xd5, 0x1c, 0xd8, 0x9b, 0x6a, 0x92, 0xd7, 0x61, 0x78, 0xc1, 0x76, 0xbd, 0x65, 0x87, 0xba, 0x0b, - 0x41, 0x82, 0x11, 0x7c, 0x7f, 0xde, 0x11, 0xe0, 0x66, 0x27, 0x1a, 0x34, 0x4d, 0x22, 0x97, 0x62, - 0xc9, 0x0d, 0xed, 0x3e, 0x96, 0x9c, 0xfa, 0xc7, 0x85, 0x84, 0x2e, 0x71, 0xb3, 0xf7, 0x48, 0xea, - 0xd2, 0x01, 0x4c, 0x14, 0xe4, 0x7a, 0xb8, 0x86, 0xf2, 0xfd, 0x41, 0xbf, 0x14, 0x7b, 0x75, 0x49, - 0x6c, 0x0f, 0xa2, 0x24, 0xe4, 0x53, 0x70, 0x2e, 0x02, 0x58, 0xd0, 0x1d, 0x7d, 0x8d, 0x7a, 0x61, - 0xd2, 0x5a, 0x8c, 0xa6, 0xe7, 0x97, 0x6e, 0x76, 0x02, 0xb4, 0x9c, 0x08, 0x37, 0x83, 0x83, 0xa4, - 0x98, 0x03, 0xbb, 0xf0, 0xf2, 0xfe, 0x4a, 0x21, 0x34, 0x93, 0xa2, 0x51, 0xb1, 0x35, 0xea, 0x76, - 0xdb, 0xde, 0xc3, 0xdb, 0xc1, 0x7b, 0xcb, 0x39, 0x34, 0x0d, 0x27, 0xaa, 0xf7, 0xee, 0xd1, 0x96, - 0xe7, 0x07, 0xfb, 0x77, 0x45, 0x1c, 0x54, 0xbe, 0x6d, 0x11, 0x28, 0x11, 0xbc, 0xdd, 0x8d, 0xa4, - 0x11, 0x8e, 0x16, 0x53, 0xff, 0x65, 0x11, 0x94, 0x60, 0xdb, 0x10, 0xbc, 0x76, 0x3c, 0xc4, 0x25, - 0xfa, 0x3d, 0xd1, 0x2b, 0x26, 0x9c, 0x0c, 0x85, 0x21, 0x9e, 0x99, 0x29, 0xfd, 0xb8, 0x2d, 0xa9, - 0xc4, 0x99, 0x85, 0x84, 0x7c, 0x27, 0x72, 0x41, 0xec, 0x44, 0x48, 0xf8, 0x9a, 0xb4, 0xe9, 0x72, - 0x16, 0x5a, 0x92, 0x2b, 0xf9, 0x62, 0x0e, 0x4e, 0xfb, 0x9d, 0x32, 0xbf, 0xc4, 0x4c, 0xf2, 0x09, - 0xbb, 0x6b, 0x05, 0x6f, 0xb0, 0x5e, 0xcd, 0xae, 0x8e, 0x77, 0xd2, 0xd5, 0xb4, 0xc2, 0xbc, 0x25, - 0x41, 0xcc, 0x9e, 0x40, 0x21, 0x6c, 0xa4, 0x69, 0xb6, 0x90, 0x48, 0x4b, 0xad, 0xf7, 0xc2, 0x0d, - 0x38, 0x9f, 0xc9, 0x72, 0x3b, 0x13, 0xb8, 0x5f, 0x36, 0x81, 0xff, 0x28, 0x17, 0x4e, 0x44, 0x31, - 0x21, 0x91, 0xab, 0x00, 0x21, 0x48, 0x6c, 0x8a, 0xf1, 0x89, 0x57, 0x28, 0x34, 0x4d, 0xa2, 0x20, - 0xf3, 0x50, 0x12, 0x62, 0xe1, 0x09, 0xe2, 0x3f, 0xb4, 0x4d, 0x2f, 0x5c, 0x95, 0xe5, 0x80, 0x1b, - 0x5e, 0xf1, 0xcd, 0x82, 0xcd, 0x85, 0x57, 0x60, 0x78, 0xaf, 0xdf, 0xf5, 0xc5, 0x02, 0x10, 0x79, - 0x07, 0x7b, 0x88, 0xe6, 0xfd, 0x11, 0x9e, 0xc2, 0x2e, 0xc3, 0x20, 0xfb, 0x04, 0x4c, 0x44, 0x24, - 0x05, 0x1e, 0xef, 0x0a, 0x98, 0x16, 0x60, 0xc3, 0xb8, 0x7d, 0x03, 0xe9, 0x71, 0xfb, 0xd4, 0x1f, - 0x2d, 0xc0, 0x59, 0xb9, 0x43, 0x6a, 0x14, 0x73, 0x99, 0x1c, 0x77, 0xca, 0xbb, 0xd8, 0x29, 0x2a, - 0x94, 0xf8, 0xc6, 0x45, 0x24, 0x95, 0xe1, 0x87, 0x4a, 0x08, 0xd1, 0x04, 0x46, 0xfd, 0x9f, 0xf2, - 0x30, 0x1a, 0x18, 0x87, 0xba, 0xe3, 0x3e, 0xc4, 0xdd, 0xf1, 0x11, 0x18, 0xc5, 0xc8, 0x6b, 0x6b, - 0xd4, 0xe2, 0xd1, 0xc9, 0xfa, 0xa5, 0x2c, 0x50, 0x3e, 0x42, 0x24, 0xfc, 0x8b, 0x10, 0x32, 0xed, - 0xe7, 0x96, 0x9f, 0x14, 0x0f, 0x8f, 0x9b, 0x7d, 0x1c, 0xae, 0xfe, 0xad, 0x02, 0x8c, 0xf8, 0x52, - 0x1e, 0x37, 0x8f, 0xea, 0x2d, 0xd1, 0xe1, 0x0a, 0xf9, 0x1a, 0xc0, 0x82, 0xed, 0x78, 0x7a, 0x7b, - 0x2e, 0xd4, 0x7c, 0x3c, 0x5e, 0xed, 0x20, 0x94, 0x97, 0x91, 0x48, 0x70, 0xfd, 0x0a, 0xcd, 0x6a, - 0x3e, 0x31, 0xf1, 0xf5, 0x2b, 0x80, 0x6a, 0x12, 0x85, 0xfa, 0xab, 0x79, 0x38, 0xe1, 0x77, 0xd2, - 0xe4, 0x03, 0xda, 0xea, 0x3e, 0xcc, 0x73, 0x53, 0x54, 0xda, 0xfd, 0xdb, 0x4a, 0x5b, 0xfd, 0x3f, - 0xa4, 0x89, 0x64, 0xa2, 0x6d, 0x1f, 0x4f, 0x24, 0x7f, 0x11, 0x3a, 0xae, 0x7e, 0x5f, 0x01, 0x4e, - 0xfb, 0x52, 0x9f, 0xea, 0x5a, 0x78, 0x30, 0x31, 0xa1, 0xb7, 0xdb, 0x0f, 0xf3, 0x6e, 0x7c, 0xd8, - 0x17, 0xc4, 0xbc, 0x08, 0x65, 0x2a, 0x92, 0xaf, 0xde, 0x13, 0xe0, 0xa6, 0x6d, 0x1a, 0x9a, 0x4c, - 0x44, 0xde, 0x80, 0x11, 0xff, 0x67, 0xd5, 0x59, 0xf6, 0xb7, 0xe0, 0x78, 0xcd, 0x10, 0x14, 0xd2, - 0x9d, 0x48, 0x6c, 0x8e, 0x48, 0x01, 0xf5, 0x73, 0x03, 0x70, 0xe1, 0xae, 0x69, 0x19, 0xf6, 0xba, - 0xeb, 0xe7, 0xee, 0x3d, 0xf2, 0xc7, 0x6c, 0x87, 0x9d, 0xb3, 0xf7, 0x13, 0x70, 0x26, 0x2e, 0x52, - 0x27, 0xc8, 0xa8, 0x20, 0x7a, 0x67, 0x9d, 0x13, 0x34, 0xfd, 0x2c, 0xbe, 0xe2, 0xae, 0x4e, 0x4b, - 0x2f, 0x19, 0x4f, 0x03, 0x3c, 0xb0, 0x93, 0x34, 0xc0, 0x4f, 0x43, 0xa9, 0x66, 0xaf, 0xe9, 0xa6, - 0x1f, 0xa5, 0x09, 0x47, 0x71, 0x50, 0x2f, 0x62, 0x34, 0x41, 0xc1, 0xf8, 0x8b, 0x8a, 0xb1, 0xcb, - 0x86, 0x42, 0xfe, 0x7e, 0x01, 0x66, 0xa5, 0x69, 0x32, 0x11, 0xb1, 0x61, 0x54, 0x54, 0x27, 0x6e, - 0xd6, 0x00, 0x37, 0x4f, 0x2f, 0xf9, 0x32, 0xca, 0x56, 0xab, 0xab, 0x91, 0x72, 0x7c, 0x1b, 0xc5, - 0xb3, 0x13, 0x8b, 0x8f, 0xe1, 0x77, 0x6c, 0x5a, 0x94, 0xbf, 0x24, 0x04, 0x9c, 0x64, 0x86, 0x93, - 0x42, 0xc0, 0x59, 0x46, 0x26, 0x22, 0x93, 0x70, 0x12, 0x23, 0xd7, 0x07, 0x5b, 0x29, 0xa6, 0x12, - 0x23, 0x68, 0x54, 0xe2, 0x85, 0x0d, 0x0f, 0x76, 0xcf, 0x3e, 0xae, 0xd9, 0x12, 0x68, 0x2d, 0x59, - 0x82, 0x9c, 0x87, 0xc2, 0xdc, 0x4c, 0x15, 0x6f, 0x7a, 0x06, 0x79, 0xce, 0x39, 0xab, 0xad, 0x6b, - 0x0c, 0x76, 0xe1, 0xe3, 0x40, 0x92, 0x9f, 0xb3, 0xab, 0xdb, 0x9c, 0x7f, 0x2a, 0x6d, 0xf9, 0x8e, - 0xba, 0x3f, 0xce, 0x41, 0x4c, 0x84, 0x91, 0x74, 0x8f, 0xfd, 0xef, 0x66, 0xba, 0xc7, 0xd2, 0x81, - 0xa6, 0x7b, 0x54, 0x7f, 0x2e, 0x07, 0x27, 0x13, 0xd9, 0x1d, 0xc8, 0x0b, 0x00, 0x1c, 0x22, 0x45, - 0x78, 0xc5, 0x00, 0x44, 0x61, 0xc6, 0x07, 0xb1, 0x3c, 0x86, 0x64, 0xe4, 0x1a, 0x0c, 0xf2, 0x5f, - 0x22, 0xc6, 0x59, 0xb2, 0x48, 0xb7, 0x6b, 0x1a, 0x5a, 0x40, 0x14, 0xd6, 0x82, 0xf7, 0x99, 0x85, - 0xd4, 0x22, 0xde, 0x46, 0x27, 0xa8, 0x85, 0x91, 0xa9, 0x3f, 0x94, 0x87, 0x91, 0xa0, 0xc1, 0x55, - 0xe3, 0xb0, 0x74, 0xae, 0x24, 0x12, 0x65, 0x14, 0xb6, 0x4b, 0x94, 0x11, 0x9b, 0x6f, 0x45, 0x66, - 0x8c, 0x83, 0x7b, 0xd3, 0xf5, 0xa5, 0x3c, 0x9c, 0x08, 0x6a, 0x3d, 0xc4, 0xab, 0xb3, 0xf7, 0x90, - 0x48, 0xbe, 0x98, 0x03, 0x65, 0xdc, 0x6c, 0xb7, 0x4d, 0x6b, 0xb9, 0x6e, 0xdd, 0xb3, 0x9d, 0x35, - 0x9c, 0x10, 0x0f, 0xef, 0x08, 0x57, 0xfd, 0x81, 0x1c, 0x9c, 0x14, 0x0d, 0x9a, 0xd0, 0x1d, 0xe3, - 0xf0, 0xce, 0xc7, 0xe2, 0x2d, 0x39, 0x3c, 0x7d, 0x51, 0x7f, 0x39, 0x0f, 0x30, 0x63, 0xb7, 0x56, - 0x8f, 0xf8, 0x93, 0xb0, 0xd7, 0xa0, 0xc4, 0x9d, 0xea, 0x85, 0xc6, 0x9e, 0x14, 0x4f, 0x9f, 0xd8, - 0xa7, 0x71, 0xc4, 0x78, 0x59, 0xcc, 0xc7, 0x25, 0xee, 0x97, 0xaf, 0xe4, 0x34, 0x51, 0x84, 0x55, - 0xca, 0xe8, 0xc4, 0x82, 0x11, 0x54, 0xca, 0x60, 0xd1, 0x4a, 0xb7, 0x36, 0x2b, 0xc5, 0xb6, 0xdd, - 0x5a, 0xd5, 0x90, 0x5e, 0xfd, 0x7f, 0x72, 0x5c, 0x76, 0x47, 0xfc, 0x61, 0xab, 0xff, 0xf9, 0xc5, - 0x5d, 0x7e, 0xfe, 0x5f, 0xcd, 0xc1, 0x69, 0x8d, 0xb6, 0xec, 0xfb, 0xd4, 0xd9, 0x98, 0xb0, 0x0d, - 0x7a, 0x83, 0x5a, 0xd4, 0x39, 0xac, 0x11, 0xf5, 0x6b, 0x98, 0x59, 0x28, 0x6c, 0xcc, 0x6d, 0x97, - 0x1a, 0x47, 0x27, 0xeb, 0x93, 0xfa, 0x8d, 0x01, 0x50, 0x52, 0xad, 0xde, 0x23, 0x6b, 0xce, 0x65, - 0x6e, 0x65, 0x8a, 0x07, 0xb5, 0x95, 0xe9, 0xdf, 0xdd, 0x56, 0xa6, 0xb4, 0xdb, 0xad, 0xcc, 0xc0, - 0x4e, 0xb6, 0x32, 0x6b, 0xf1, 0xad, 0xcc, 0x20, 0x6e, 0x65, 0x5e, 0xe8, 0xb9, 0x95, 0x99, 0xb4, - 0x8c, 0x3d, 0x6e, 0x64, 0x8e, 0x6c, 0x3e, 0xf3, 0xbd, 0xec, 0xc0, 0x2e, 0xb3, 0x49, 0xb1, 0x65, - 0x3b, 0x06, 0x35, 0xc4, 0xc6, 0x0b, 0x4f, 0xfd, 0x1d, 0x01, 0xd3, 0x02, 0x6c, 0x22, 0x39, 0xfc, - 0xe8, 0x4e, 0x92, 0xc3, 0x1f, 0xc0, 0xfe, 0xeb, 0x0b, 0x79, 0x38, 0x39, 0x41, 0x1d, 0x8f, 0x47, - 0xb2, 0x3d, 0x08, 0x87, 0xba, 0x2a, 0x9c, 0x90, 0x18, 0xa2, 0x45, 0x9e, 0x0f, 0x9d, 0x04, 0x5b, - 0xd4, 0xf1, 0xe2, 0x3e, 0x86, 0x71, 0x7a, 0x56, 0xbd, 0x9f, 0xa0, 0x51, 0x8c, 0xdd, 0xa0, 0x7a, - 0x1f, 0xce, 0x05, 0x69, 0x8a, 0x5f, 0x5a, 0x40, 0x2f, 0xf9, 0xc9, 0x14, 0xf7, 0xe0, 0x27, 0xf3, - 0xb5, 0x1c, 0x5c, 0xd2, 0xa8, 0x45, 0xd7, 0xf5, 0xa5, 0x36, 0x95, 0x9a, 0x25, 0x56, 0x06, 0x36, - 0x6b, 0x98, 0xee, 0x9a, 0xee, 0xb5, 0x56, 0xf6, 0x25, 0xa3, 0x29, 0x18, 0x91, 0xe7, 0xaf, 0x5d, - 0xcc, 0x6d, 0x91, 0x72, 0xea, 0x37, 0x8a, 0x30, 0x30, 0x6e, 0x7b, 0x37, 0xed, 0x7d, 0x26, 0x01, - 0x0d, 0xa7, 0xfc, 0xfc, 0x2e, 0xce, 0x7a, 0x9e, 0xc3, 0xca, 0xa5, 0xac, 0x1b, 0xe8, 0x80, 0xba, - 0x64, 0x27, 0x32, 0xc0, 0xf8, 0x64, 0xbb, 0x4c, 0xff, 0xf9, 0x32, 0x0c, 0x61, 0x00, 0x1a, 0xe9, - 0x34, 0x16, 0xdd, 0xbb, 0x3d, 0x06, 0x8c, 0xd7, 0x11, 0x92, 0x92, 0x4f, 0x45, 0x42, 0xef, 0x96, - 0xf6, 0x9f, 0x2e, 0x54, 0x8e, 0xc2, 0xfb, 0x02, 0xbf, 0xc8, 0xc3, 0x36, 0x49, 0xc9, 0x91, 0xf0, - 0x14, 0x25, 0xd6, 0xa4, 0x80, 0xf0, 0x00, 0x53, 0x79, 0x4e, 0xc0, 0xe8, 0xb8, 0xed, 0x49, 0xae, - 0xc4, 0x43, 0xe1, 0x4b, 0x54, 0x26, 0xf9, 0x74, 0x3f, 0xe2, 0x68, 0x19, 0xf5, 0xcf, 0x8b, 0x30, - 0xe2, 0xff, 0x3c, 0x24, 0xdd, 0x79, 0x16, 0x4a, 0xd3, 0xb6, 0x94, 0xbb, 0x04, 0xdd, 0x8f, 0x57, - 0x6c, 0x37, 0xe6, 0x57, 0x2d, 0x88, 0x98, 0xd4, 0xe7, 0x6c, 0x43, 0x76, 0x9e, 0x47, 0xa9, 0x5b, - 0xb6, 0x91, 0x78, 0xc1, 0x1c, 0x10, 0x92, 0x4b, 0x50, 0xc4, 0x77, 0x07, 0xd2, 0x41, 0x7e, 0xec, - 0xad, 0x01, 0xe2, 0x25, 0xad, 0x2c, 0xed, 0x56, 0x2b, 0x07, 0xf6, 0xaa, 0x95, 0x83, 0x07, 0xab, - 0x95, 0x6f, 0xc1, 0x08, 0xd6, 0xe4, 0xa7, 0x97, 0xdc, 0x7e, 0x61, 0x3d, 0x2f, 0xd6, 0xbe, 0x51, - 0xde, 0x6e, 0x91, 0x64, 0x12, 0x97, 0xbc, 0x08, 0xab, 0x98, 0xee, 0xc2, 0x3e, 0xb6, 0xd3, 0x7f, - 0x9c, 0x83, 0x81, 0xdb, 0xd6, 0xaa, 0x65, 0xaf, 0xef, 0x4f, 0xe3, 0x5e, 0x80, 0x61, 0xc1, 0x46, - 0x5a, 0x5d, 0xf0, 0x51, 0x7a, 0x97, 0x83, 0x9b, 0xc8, 0x49, 0x93, 0xa9, 0xc8, 0xeb, 0x41, 0x21, - 0x7c, 0x5a, 0x54, 0x08, 0xb3, 0xff, 0xf8, 0x85, 0x5a, 0xd1, 0xf4, 0x1f, 0x32, 0x39, 0xb9, 0x08, - 0xc5, 0x1a, 0x6b, 0xaa, 0x14, 0x06, 0x98, 0x35, 0x45, 0x43, 0xa8, 0xfa, 0x85, 0x22, 0x8c, 0xc5, - 0x0e, 0xbe, 0x9e, 0x86, 0x21, 0x71, 0xf0, 0x64, 0xfa, 0xf9, 0x48, 0xf0, 0xe9, 0x51, 0x00, 0xd4, - 0x06, 0xf9, 0x9f, 0x75, 0x83, 0x7c, 0x0c, 0x06, 0x6c, 0x17, 0x17, 0x45, 0xfc, 0x96, 0xb1, 0x70, - 0x08, 0xcd, 0x37, 0x58, 0xdb, 0xf9, 0xe0, 0x10, 0x24, 0xb2, 0x46, 0xda, 0x2e, 0x7e, 0xda, 0x8b, - 0x30, 0xa4, 0xbb, 0x2e, 0xf5, 0x9a, 0x9e, 0xbe, 0x2c, 0xa7, 0x28, 0x09, 0x80, 0xf2, 0xe8, 0x40, - 0xe0, 0xa2, 0xbe, 0x4c, 0x3e, 0x0e, 0xa3, 0x2d, 0x87, 0xe2, 0xb2, 0xa9, 0xb7, 0x59, 0x2b, 0x25, - 0xb3, 0x36, 0x82, 0x90, 0xef, 0x4f, 0x42, 0x44, 0xdd, 0x20, 0x77, 0x60, 0x54, 0x7c, 0x0e, 0xf7, - 0xfb, 0xc7, 0x81, 0x36, 0x16, 0x2e, 0x63, 0x5c, 0x24, 0xdc, 0xf3, 0x5f, 0x3c, 0xff, 0x90, 0xc9, - 0x65, 0xbe, 0x86, 0x44, 0x4a, 0xe6, 0x81, 0xac, 0xd3, 0xa5, 0xa6, 0xde, 0xf5, 0x56, 0x58, 0x5d, - 0x3c, 0xc2, 0xbe, 0xc8, 0xd7, 0x8a, 0x6f, 0x26, 0x92, 0x58, 0xf9, 0x29, 0xc9, 0x3a, 0x5d, 0xaa, - 0x46, 0x90, 0xe4, 0x2e, 0x9c, 0x49, 0x16, 0x61, 0x9f, 0xcc, 0x2f, 0x07, 0x9e, 0xdc, 0xda, 0xac, - 0x54, 0x52, 0x09, 0x24, 0xb6, 0xa7, 0x12, 0x6c, 0xeb, 0xc6, 0xcd, 0xe2, 0xe0, 0x40, 0x79, 0x50, - 0x1b, 0x63, 0x65, 0x7d, 0x13, 0xd2, 0x34, 0xd4, 0x6f, 0xe7, 0x98, 0xa9, 0xc8, 0x3e, 0x08, 0xd3, - 0xdd, 0x33, 0x5d, 0x5f, 0xdb, 0xa5, 0xae, 0xaf, 0x85, 0xa9, 0x65, 0x4b, 0x6e, 0x8f, 0xd9, 0x55, - 0x13, 0x58, 0x72, 0x15, 0x4a, 0x86, 0x7c, 0x6a, 0x76, 0x36, 0xda, 0x09, 0x7e, 0x3d, 0x9a, 0xa0, - 0x22, 0x97, 0xa1, 0xc8, 0x96, 0xac, 0xf8, 0x96, 0x59, 0xb6, 0x2e, 0x34, 0xa4, 0x50, 0xbf, 0x27, - 0x0f, 0x23, 0xd2, 0xd7, 0x5c, 0xdf, 0xd7, 0xe7, 0xbc, 0xba, 0xb3, 0x66, 0xfa, 0x4e, 0x2f, 0xb8, - 0x97, 0xf2, 0x9b, 0xfc, 0x62, 0x20, 0x8a, 0x1d, 0x5d, 0x48, 0x09, 0xc1, 0xbc, 0x2c, 0x3e, 0xb4, - 0xb4, 0xf3, 0xed, 0x23, 0xa3, 0xbf, 0x59, 0x1c, 0xcc, 0x97, 0x0b, 0x37, 0x8b, 0x83, 0xc5, 0x72, - 0x3f, 0x86, 0x02, 0xc3, 0xe8, 0xdb, 0x7c, 0x6f, 0x6e, 0xdd, 0x33, 0x97, 0x8f, 0xf8, 0xcb, 0x93, - 0x83, 0x0d, 0x93, 0x16, 0x93, 0xcd, 0x11, 0x7f, 0x86, 0xf2, 0xae, 0xca, 0xe6, 0x38, 0x15, 0xad, - 0x90, 0xcd, 0xbf, 0xcc, 0x81, 0x92, 0x2a, 0x9b, 0xea, 0x21, 0xf9, 0x41, 0x1c, 0x5c, 0x42, 0xda, - 0x3f, 0xcd, 0xc3, 0xc9, 0xba, 0xe5, 0xd1, 0x65, 0xbe, 0x63, 0x3c, 0xe2, 0x53, 0xc5, 0x2d, 0x18, - 0x96, 0x3e, 0x46, 0xf4, 0xf9, 0x23, 0xc1, 0x7e, 0x3c, 0x44, 0x65, 0x70, 0x92, 0x4b, 0x1f, 0xdc, - 0x3b, 0x9e, 0xb8, 0x90, 0x8f, 0xf8, 0x9c, 0x73, 0x34, 0x84, 0x7c, 0xc4, 0x27, 0xaf, 0xf7, 0xa8, - 0x90, 0xbf, 0x54, 0x80, 0x53, 0x29, 0x95, 0x93, 0x4b, 0x30, 0xd0, 0xe8, 0x2e, 0x61, 0xe4, 0xaf, - 0x5c, 0xe8, 0x31, 0xec, 0x76, 0x97, 0x30, 0xe8, 0x97, 0xe6, 0x23, 0xc9, 0x22, 0x3e, 0xcd, 0x9f, - 0xaf, 0xd7, 0x26, 0x84, 0x54, 0x55, 0x29, 0xc8, 0x00, 0x03, 0xa7, 0x7d, 0x59, 0xf0, 0x7c, 0xdf, - 0x36, 0x8d, 0x56, 0xec, 0xf9, 0x3e, 0x2b, 0x43, 0xbe, 0x0b, 0x86, 0xaa, 0xef, 0x74, 0x1d, 0x8a, - 0x7c, 0xb9, 0xc4, 0x9f, 0x0a, 0xf8, 0xfa, 0x88, 0x34, 0xce, 0x3c, 0x12, 0x01, 0xa3, 0x88, 0xf3, - 0x0e, 0x19, 0x92, 0x79, 0x28, 0xdd, 0x30, 0xbd, 0xe9, 0xee, 0x92, 0xe8, 0x85, 0x20, 0x3a, 0x18, - 0x87, 0xa6, 0xf1, 0xc5, 0x5d, 0x39, 0x8f, 0x72, 0x2c, 0xef, 0x81, 0x78, 0x01, 0x32, 0x03, 0xfd, - 0xd5, 0xbb, 0x0d, 0xad, 0x2a, 0x7a, 0xe2, 0x71, 0x39, 0xce, 0x42, 0x35, 0x93, 0x1d, 0xbe, 0x1a, - 0xd7, 0xe5, 0x3c, 0x48, 0x48, 0xaf, 0xfe, 0x50, 0x0e, 0x2e, 0x64, 0x0b, 0x8f, 0x3c, 0x07, 0x03, - 0x9a, 0xdd, 0xa6, 0x55, 0x6d, 0x4e, 0xf4, 0x0c, 0xcf, 0x2d, 0x6d, 0xb7, 0x69, 0x53, 0x77, 0xe4, - 0xbd, 0x88, 0x4f, 0x46, 0x3e, 0x0a, 0xc3, 0x75, 0xd7, 0xed, 0x52, 0xa7, 0xf1, 0xc2, 0x6d, 0xad, - 0x2e, 0xb6, 0xac, 0xb8, 0x25, 0x32, 0x11, 0xdc, 0x74, 0x5f, 0x88, 0x85, 0x1e, 0x93, 0xe9, 0xd5, - 0x1f, 0xcc, 0xc1, 0xc5, 0x5e, 0x42, 0x27, 0x2f, 0xc0, 0xe0, 0x22, 0xb5, 0x74, 0xcb, 0xab, 0xd7, - 0x44, 0x93, 0x70, 0x07, 0xe8, 0x21, 0x2c, 0xba, 0x91, 0x09, 0x08, 0x59, 0x21, 0x7e, 0xec, 0x19, - 0xf8, 0x59, 0xf0, 0x23, 0x5a, 0x84, 0xc5, 0x0a, 0xf9, 0x84, 0xea, 0xa7, 0xe0, 0x7c, 0x66, 0x1f, - 0x91, 0x8f, 0xc1, 0xc8, 0xbc, 0xb3, 0xac, 0x5b, 0xe6, 0x3b, 0x7c, 0x88, 0xe5, 0xc2, 0x5d, 0xb6, - 0x2d, 0xc1, 0xe5, 0x9d, 0x9f, 0x4c, 0xaf, 0x2e, 0x81, 0x92, 0xd5, 0x61, 0x64, 0x0a, 0xc6, 0x30, - 0x38, 0x75, 0xd5, 0x6a, 0xad, 0xd8, 0x4e, 0x28, 0x7b, 0x7c, 0x98, 0xe5, 0x31, 0x4c, 0x53, 0x47, - 0x54, 0xac, 0x0f, 0x62, 0xa5, 0xd4, 0xdf, 0xcb, 0xc3, 0xc8, 0x42, 0xbb, 0xbb, 0x6c, 0x4a, 0x0b, - 0xf3, 0x9e, 0xf7, 0x33, 0xfe, 0xee, 0x22, 0xbf, 0xbb, 0xdd, 0x05, 0x9b, 0xce, 0x9c, 0x3d, 0x4e, - 0x67, 0x7e, 0x39, 0xf2, 0x3a, 0x94, 0x3a, 0xf8, 0x1d, 0xf1, 0x93, 0x6e, 0xfe, 0x75, 0x59, 0x27, - 0xdd, 0xbc, 0x0c, 0x9b, 0xbf, 0x5a, 0xfb, 0x98, 0xbf, 0xc2, 0xb2, 0x92, 0x40, 0xc3, 0x45, 0xf8, - 0x58, 0xa0, 0x07, 0x22, 0xd0, 0x70, 0xc1, 0x3d, 0x16, 0xe8, 0x3e, 0x04, 0xfa, 0x8d, 0x3c, 0x8c, - 0x45, 0xab, 0x24, 0xcf, 0xc1, 0x30, 0xaf, 0x86, 0x9f, 0xbb, 0xe5, 0x24, 0xa7, 0xed, 0x10, 0xac, - 0x01, 0xff, 0x21, 0x0e, 0x10, 0x4f, 0xac, 0xe8, 0x6e, 0x33, 0x3c, 0x01, 0xe3, 0xf7, 0xe3, 0x83, - 0xdc, 0xd3, 0x2c, 0x86, 0xd2, 0xc6, 0x56, 0x74, 0x77, 0x22, 0xfc, 0x4d, 0x26, 0x81, 0x38, 0xb4, - 0xeb, 0xd2, 0x28, 0x83, 0x22, 0x32, 0xe0, 0xab, 0x47, 0x02, 0xab, 0x9d, 0xe4, 0x30, 0x99, 0xcd, - 0xa7, 0x83, 0x66, 0xa3, 0x32, 0xf4, 0xf7, 0x3e, 0x45, 0x7e, 0x72, 0x6b, 0xb3, 0x72, 0x46, 0xa2, - 0x4f, 0x3f, 0x46, 0xe6, 0x04, 0x35, 0xdd, 0xd3, 0xf9, 0xa1, 0x87, 0xdf, 0x01, 0xea, 0xef, 0x7c, - 0x6f, 0x0e, 0xfa, 0xe7, 0x2d, 0x3a, 0x7f, 0x8f, 0x3c, 0x0f, 0x43, 0x4c, 0x63, 0x66, 0x6c, 0xd6, - 0x99, 0x39, 0xe1, 0xa0, 0x22, 0xa9, 0x12, 0x22, 0xa6, 0xfb, 0xb4, 0x90, 0x8a, 0xbc, 0x08, 0x10, - 0xbe, 0xe1, 0x13, 0xea, 0x47, 0xe4, 0x32, 0x1c, 0x33, 0xdd, 0xa7, 0x49, 0x74, 0x7e, 0x29, 0xf1, - 0x02, 0xaa, 0x90, 0x2c, 0xc5, 0x31, 0x7e, 0x29, 0x31, 0x40, 0x66, 0x80, 0xb0, 0x5f, 0x0b, 0xba, - 0xeb, 0xae, 0xdb, 0x8e, 0x31, 0xb1, 0xa2, 0x5b, 0xcb, 0x34, 0xbe, 0x3d, 0x4d, 0x52, 0x4c, 0xf7, - 0x69, 0x29, 0xe5, 0xc8, 0xab, 0x30, 0x22, 0x7b, 0xec, 0xc6, 0xbd, 0x6a, 0x64, 0xdc, 0x74, 0x9f, - 0x16, 0xa1, 0x25, 0x1f, 0x86, 0x61, 0xf1, 0xfb, 0xa6, 0x2d, 0xae, 0xec, 0xa5, 0x50, 0x51, 0x12, - 0x6a, 0xba, 0x4f, 0x93, 0x29, 0xa5, 0x4a, 0x17, 0x1c, 0xd3, 0xf2, 0xc4, 0x23, 0xf0, 0x78, 0xa5, - 0x88, 0x93, 0x2a, 0xc5, 0xdf, 0xe4, 0xa3, 0x30, 0x1a, 0xc4, 0xe0, 0x7a, 0x9b, 0xb6, 0x3c, 0x71, - 0xbb, 0x70, 0x26, 0x56, 0x98, 0x23, 0xa7, 0xfb, 0xb4, 0x28, 0x35, 0xb9, 0x0c, 0x25, 0x8d, 0xba, - 0xe6, 0x3b, 0xfe, 0x7d, 0xfc, 0x98, 0x34, 0xd0, 0xcd, 0x77, 0x98, 0x94, 0x04, 0x9e, 0xf5, 0x4e, - 0xe8, 0x00, 0x20, 0xee, 0x02, 0x48, 0xac, 0x96, 0x49, 0xcb, 0x60, 0xbd, 0x23, 0x79, 0x7f, 0x7c, - 0x3c, 0x8c, 0x4c, 0x26, 0x12, 0xf3, 0x0e, 0xc7, 0x43, 0x40, 0xc8, 0xd8, 0xe9, 0x3e, 0x2d, 0x46, - 0x2f, 0x49, 0xb5, 0x66, 0xba, 0xab, 0x22, 0xa2, 0x6c, 0x5c, 0xaa, 0x0c, 0x25, 0x49, 0x95, 0xfd, - 0x94, 0xaa, 0x9e, 0xa3, 0xde, 0xba, 0xed, 0xac, 0x8a, 0xf8, 0xb1, 0xf1, 0xaa, 0x05, 0x56, 0xaa, - 0x5a, 0x40, 0xe4, 0xaa, 0xd9, 0x88, 0x1b, 0x4b, 0xaf, 0x5a, 0xf7, 0x74, 0xb9, 0x6a, 0x7e, 0xd4, - 0xe9, 0x77, 0xd2, 0x0c, 0xd5, 0xef, 0x53, 0xe5, 0x44, 0x6a, 0x87, 0x22, 0x4e, 0xea, 0x50, 0xfc, - 0xcd, 0x2a, 0x95, 0xb2, 0xf6, 0x2b, 0xe5, 0x68, 0xa5, 0x12, 0x8a, 0x55, 0x2a, 0xe7, 0xf7, 0x7f, - 0x51, 0x4e, 0x0d, 0xaf, 0x9c, 0x8c, 0x76, 0x50, 0x88, 0x61, 0x1d, 0x24, 0xa5, 0x90, 0xaf, 0x60, - 0xda, 0x69, 0x85, 0x20, 0xf9, 0x70, 0xd0, 0xc2, 0x89, 0x85, 0xe9, 0x3e, 0x0d, 0x13, 0x52, 0xab, - 0x3c, 0xa1, 0xb9, 0x72, 0x0a, 0x29, 0x46, 0x7c, 0x0a, 0x06, 0x9b, 0xee, 0xd3, 0x78, 0xb2, 0xf3, - 0xe7, 0xa5, 0xa4, 0x8f, 0xca, 0xe9, 0xe8, 0x14, 0x11, 0x20, 0xd8, 0x14, 0x11, 0xa6, 0x86, 0x9c, - 0x4a, 0xa6, 0x36, 0x54, 0xce, 0x44, 0xd7, 0x9a, 0x38, 0x7e, 0xba, 0x4f, 0x4b, 0xa6, 0x43, 0xfc, - 0x70, 0x24, 0xdb, 0x9f, 0x72, 0x36, 0x16, 0x9f, 0x2d, 0x44, 0x31, 0x71, 0xc9, 0x79, 0x01, 0xe7, - 0xe1, 0x14, 0x4f, 0x16, 0x2c, 0x22, 0xac, 0x89, 0xc9, 0xea, 0x5c, 0x74, 0x67, 0x98, 0x42, 0x32, - 0xdd, 0xa7, 0xa5, 0x95, 0x24, 0x13, 0x89, 0x9c, 0x7b, 0x8a, 0x12, 0x75, 0x3e, 0x8a, 0xa1, 0xa7, - 0xfb, 0xb4, 0x44, 0x96, 0xbe, 0x17, 0xe5, 0x64, 0x77, 0xca, 0xf9, 0x68, 0x27, 0x86, 0x18, 0xd6, - 0x89, 0x52, 0x52, 0xbc, 0x17, 0xe5, 0x04, 0x68, 0xca, 0x85, 0x64, 0xa9, 0x70, 0xe6, 0x94, 0x12, - 0xa5, 0x69, 0xe9, 0x39, 0x9d, 0x94, 0x47, 0x44, 0x66, 0x67, 0x51, 0x3e, 0x8d, 0x66, 0xba, 0x4f, - 0x4b, 0xcf, 0x07, 0xa5, 0xa5, 0x27, 0x43, 0x52, 0x2e, 0xf6, 0xe2, 0x19, 0xb4, 0x2e, 0x3d, 0x91, - 0x92, 0xde, 0x23, 0x35, 0x8d, 0xf2, 0x68, 0x74, 0x0f, 0x99, 0x49, 0x38, 0xdd, 0xa7, 0xf5, 0x48, - 0x70, 0x73, 0x3b, 0x23, 0x4f, 0x8c, 0xf2, 0x58, 0x34, 0xb1, 0x7b, 0x2a, 0xd1, 0x74, 0x9f, 0x96, - 0x91, 0x65, 0xe6, 0x76, 0x46, 0x1a, 0x11, 0xa5, 0xd2, 0x93, 0x6d, 0x20, 0x8f, 0x8c, 0x24, 0x24, - 0xf3, 0xa9, 0x19, 0x38, 0x94, 0xc7, 0xa3, 0xaa, 0x9b, 0x42, 0xc2, 0x54, 0x37, 0x2d, 0x77, 0xc7, - 0x7c, 0x6a, 0xca, 0x08, 0xe5, 0x89, 0x1e, 0x0c, 0x83, 0x36, 0xa6, 0x26, 0x9b, 0x98, 0x4f, 0xcd, - 0xd9, 0xa0, 0xa8, 0x51, 0x86, 0x29, 0x24, 0x8c, 0x61, 0x5a, 0xb6, 0x87, 0xf9, 0xd4, 0xd0, 0xfe, - 0xca, 0x93, 0x3d, 0x18, 0x86, 0x2d, 0x4c, 0x4b, 0x0a, 0xf0, 0xe1, 0x48, 0x6c, 0x7d, 0xe5, 0xa9, - 0xe8, 0xbc, 0x21, 0xa1, 0xd8, 0xbc, 0x21, 0x47, 0xe1, 0x9f, 0x48, 0x04, 0xfe, 0x55, 0x3e, 0x10, - 0x1d, 0xe6, 0x31, 0x34, 0x1b, 0xe6, 0xf1, 0x50, 0xc1, 0x13, 0x89, 0x00, 0xa8, 0xca, 0xa5, 0x2c, - 0x26, 0x88, 0x8e, 0x32, 0xe1, 0x21, 0x53, 0xeb, 0x29, 0x11, 0x38, 0x95, 0x0f, 0x46, 0x1d, 0xe7, - 0x13, 0x04, 0xd3, 0x7d, 0x5a, 0x4a, 0xdc, 0x4e, 0x2d, 0x3d, 0xdc, 0x94, 0x72, 0x39, 0x3a, 0x6c, - 0xd3, 0x68, 0xd8, 0xb0, 0x4d, 0x0d, 0x55, 0x35, 0x93, 0xf6, 0xba, 0x47, 0xb9, 0x12, 0x35, 0xcc, - 0x92, 0x14, 0xcc, 0x30, 0x4b, 0x79, 0x15, 0xa4, 0xa5, 0x07, 0x31, 0x52, 0x9e, 0xee, 0xd9, 0x42, - 0xa4, 0x49, 0x69, 0x21, 0x8f, 0xe9, 0x13, 0xda, 0x4e, 0xb7, 0x3b, 0x6d, 0x5b, 0x37, 0x94, 0x0f, - 0xa5, 0xda, 0x4e, 0x1c, 0x29, 0xd9, 0x4e, 0x1c, 0xc0, 0x56, 0x79, 0xf9, 0x11, 0x89, 0xf2, 0x4c, - 0x74, 0x95, 0x97, 0x71, 0x6c, 0x95, 0x8f, 0x3c, 0x38, 0x99, 0x48, 0x3c, 0xb8, 0x50, 0x9e, 0x8d, - 0x2a, 0x40, 0x0c, 0xcd, 0x14, 0x20, 0xfe, 0x44, 0xe3, 0x33, 0xd9, 0x4f, 0x14, 0x94, 0xab, 0xd1, - 0xb3, 0xb0, 0x2c, 0xba, 0xe9, 0x3e, 0x2d, 0xfb, 0x99, 0x43, 0x3d, 0xe5, 0xc5, 0x81, 0x72, 0x2d, - 0xaa, 0x60, 0x09, 0x02, 0xa6, 0x60, 0xc9, 0x77, 0x0a, 0xf5, 0x94, 0x27, 0x03, 0xca, 0x73, 0x99, - 0xac, 0x82, 0x6f, 0x4e, 0x79, 0x68, 0xf0, 0xa2, 0xec, 0xf3, 0xaf, 0x3c, 0x1f, 0x5d, 0xec, 0x42, - 0x0c, 0x5b, 0xec, 0xa4, 0xb7, 0x01, 0x2f, 0xca, 0xde, 0xee, 0xca, 0xf5, 0x64, 0xa9, 0x70, 0x89, - 0x94, 0xbc, 0xe2, 0xb5, 0x74, 0x27, 0x71, 0xe5, 0x85, 0xa8, 0xd6, 0xa5, 0xd1, 0x30, 0xad, 0x4b, - 0x75, 0x30, 0x9f, 0x4a, 0xfa, 0x7a, 0x2b, 0x2f, 0xc6, 0x77, 0xd9, 0x51, 0x3c, 0xb3, 0x7c, 0x12, - 0xfe, 0xe1, 0x1f, 0x8f, 0xc7, 0x42, 0x54, 0x5e, 0x8a, 0xdd, 0xab, 0x47, 0xb0, 0xcc, 0xbe, 0x8d, - 0xc5, 0x4e, 0xfc, 0x78, 0x3c, 0x7c, 0xa0, 0xf2, 0x72, 0x3a, 0x87, 0x40, 0x57, 0xe2, 0xe1, 0x06, - 0x3f, 0x1e, 0x8f, 0xb8, 0xa7, 0x7c, 0x38, 0x9d, 0x43, 0x20, 0xdd, 0x78, 0x84, 0xbe, 0xe7, 0xa5, - 0x1c, 0x00, 0xca, 0x47, 0xa2, 0xa6, 0x63, 0x80, 0x60, 0xa6, 0x63, 0x98, 0x29, 0xe0, 0x79, 0x29, - 0x76, 0xbe, 0xf2, 0x4a, 0xa2, 0x48, 0xd0, 0x58, 0x29, 0xc2, 0xfe, 0xf3, 0x52, 0xcc, 0x79, 0xe5, - 0xd5, 0x44, 0x91, 0xa0, 0x75, 0x52, 0x64, 0x7a, 0xa3, 0xd7, 0x03, 0x61, 0xe5, 0xb5, 0xe8, 0x69, - 0x7b, 0x36, 0xe5, 0x74, 0x9f, 0xd6, 0xeb, 0xa1, 0xf1, 0x67, 0xb2, 0x3d, 0xe7, 0x95, 0xd7, 0xa3, - 0x43, 0x38, 0x8b, 0x8e, 0x0d, 0xe1, 0x4c, 0xef, 0xfb, 0x8f, 0xc6, 0x82, 0x85, 0x28, 0x1f, 0x8d, - 0x4e, 0x71, 0x11, 0x24, 0x9b, 0xe2, 0xe2, 0xa1, 0x45, 0x22, 0x51, 0x30, 0x94, 0x8f, 0x45, 0xa7, - 0x38, 0x19, 0xc7, 0xa6, 0xb8, 0x48, 0xc4, 0x8c, 0x89, 0x44, 0x70, 0x06, 0xe5, 0x8d, 0xe8, 0x14, - 0x17, 0x43, 0xb3, 0x29, 0x2e, 0x1e, 0xce, 0xe1, 0xa3, 0xb1, 0x18, 0x05, 0xca, 0xc7, 0xd3, 0xdb, - 0x8f, 0x48, 0xb9, 0xfd, 0x3c, 0xa2, 0x81, 0x96, 0xfe, 0xd8, 0x5e, 0xa9, 0x46, 0xc7, 0x6f, 0x1a, - 0x0d, 0x1b, 0xbf, 0xa9, 0x0f, 0xf5, 0xe3, 0x1b, 0x07, 0xa1, 0x55, 0xe3, 0x3d, 0x36, 0x0e, 0xa1, - 0x29, 0x92, 0x02, 0x8e, 0xec, 0x91, 0xf9, 0x46, 0x68, 0x22, 0x63, 0x8f, 0xec, 0x6f, 0x83, 0x62, - 0xf4, 0x6c, 0x76, 0x4d, 0x38, 0x72, 0x2b, 0xb5, 0xe8, 0xec, 0x9a, 0x20, 0x60, 0xb3, 0x6b, 0xd2, - 0xfd, 0x7b, 0x0a, 0xca, 0x42, 0x8b, 0xb8, 0x7f, 0xba, 0x69, 0x2d, 0x2b, 0x93, 0xb1, 0x07, 0xad, - 0x31, 0x3c, 0x9b, 0x9d, 0xe2, 0x30, 0x5c, 0xaf, 0x39, 0x6c, 0xa2, 0x6d, 0x76, 0x96, 0x6c, 0xdd, - 0x31, 0x1a, 0xd4, 0x32, 0x94, 0xa9, 0xd8, 0x7a, 0x9d, 0x42, 0x83, 0xeb, 0x75, 0x0a, 0x1c, 0x63, - 0xf0, 0xc5, 0xe0, 0x1a, 0x6d, 0x51, 0xf3, 0x3e, 0x55, 0x6e, 0x20, 0xdb, 0x4a, 0x16, 0x5b, 0x41, - 0x36, 0xdd, 0xa7, 0x65, 0x71, 0x60, 0xb6, 0xfa, 0xec, 0x46, 0xe3, 0x13, 0x33, 0x41, 0x7c, 0x87, - 0x05, 0x87, 0x76, 0x74, 0x87, 0x2a, 0xd3, 0x51, 0x5b, 0x3d, 0x95, 0x88, 0xd9, 0xea, 0xa9, 0x88, - 0x24, 0x5b, 0x7f, 0x2c, 0xd4, 0x7b, 0xb1, 0x0d, 0x47, 0x44, 0x7a, 0x69, 0x36, 0x3b, 0x45, 0x11, - 0x4c, 0x40, 0x33, 0xb6, 0xb5, 0x8c, 0x27, 0x15, 0x37, 0xa3, 0xb3, 0x53, 0x36, 0x25, 0x9b, 0x9d, - 0xb2, 0xb1, 0x4c, 0xd5, 0xa3, 0x58, 0x3e, 0x06, 0x6f, 0x45, 0x55, 0x3d, 0x85, 0x84, 0xa9, 0x7a, - 0x0a, 0x38, 0xc9, 0x50, 0xa3, 0x2e, 0xf5, 0x94, 0x99, 0x5e, 0x0c, 0x91, 0x24, 0xc9, 0x10, 0xc1, - 0x49, 0x86, 0x53, 0xd4, 0x6b, 0xad, 0x28, 0xb3, 0xbd, 0x18, 0x22, 0x49, 0x92, 0x21, 0x82, 0xd9, - 0x66, 0x33, 0x0a, 0x1e, 0xef, 0xb6, 0x57, 0xfd, 0x3e, 0x9b, 0x8b, 0x6e, 0x36, 0x33, 0x09, 0xd9, - 0x66, 0x33, 0x13, 0x49, 0x7e, 0x70, 0xc7, 0x0f, 0x0d, 0x94, 0x79, 0xac, 0xf0, 0x6a, 0x68, 0x17, - 0xec, 0xa4, 0xd4, 0x74, 0x9f, 0xb6, 0xd3, 0x87, 0x0c, 0x1f, 0x0a, 0xbc, 0x72, 0x95, 0x05, 0xac, - 0xea, 0x44, 0x70, 0x56, 0xc1, 0xc1, 0xd3, 0x7d, 0x5a, 0xe0, 0xb7, 0xfb, 0x61, 0x18, 0xc6, 0x8f, - 0xaa, 0x5b, 0xa6, 0x57, 0x1b, 0x57, 0x3e, 0x11, 0xdd, 0x32, 0x49, 0x28, 0xb6, 0x65, 0x92, 0x7e, - 0xb2, 0x49, 0x1c, 0x7f, 0xf2, 0x29, 0xa6, 0x36, 0xae, 0x68, 0xd1, 0x49, 0x3c, 0x82, 0x64, 0x93, - 0x78, 0x04, 0x10, 0xd4, 0x5b, 0x73, 0xec, 0x4e, 0x6d, 0x5c, 0x69, 0xa4, 0xd4, 0xcb, 0x51, 0x41, - 0xbd, 0xfc, 0x67, 0x50, 0x6f, 0x63, 0xa5, 0xeb, 0xd5, 0xd8, 0x37, 0x2e, 0xa6, 0xd4, 0xeb, 0x23, - 0x83, 0x7a, 0x7d, 0x00, 0x9b, 0x0a, 0x11, 0xb0, 0xe0, 0xd8, 0x6c, 0xd2, 0xbe, 0x65, 0xb6, 0xdb, - 0xca, 0xed, 0xe8, 0x54, 0x18, 0xc7, 0xb3, 0xa9, 0x30, 0x0e, 0x63, 0xa6, 0x27, 0x6f, 0x15, 0x5d, - 0xea, 0x2e, 0x2b, 0x77, 0xa2, 0xa6, 0x67, 0x88, 0x61, 0xa6, 0x67, 0xf8, 0x0b, 0x77, 0x17, 0xec, - 0x97, 0x46, 0xef, 0x39, 0xd4, 0x5d, 0x51, 0xee, 0xc6, 0x76, 0x17, 0x12, 0x0e, 0x77, 0x17, 0xd2, - 0x6f, 0xb2, 0x0c, 0x8f, 0x44, 0x16, 0x1a, 0xff, 0xd6, 0xa6, 0x41, 0x75, 0xa7, 0xb5, 0xa2, 0xbc, - 0x89, 0xac, 0x9e, 0x4c, 0x5d, 0xaa, 0xa2, 0xa4, 0xd3, 0x7d, 0x5a, 0x2f, 0x4e, 0xb8, 0x2d, 0xff, - 0xc4, 0x0c, 0x0f, 0xd4, 0xab, 0x2d, 0x4c, 0xf8, 0x9b, 0xd0, 0xb7, 0x62, 0xdb, 0xf2, 0x24, 0x09, - 0x6e, 0xcb, 0x93, 0x60, 0xd2, 0x81, 0xc7, 0x62, 0x5b, 0xb5, 0x59, 0xbd, 0xcd, 0xf6, 0x25, 0xd4, - 0x58, 0xd0, 0x5b, 0xab, 0xd4, 0x53, 0x3e, 0x89, 0xbc, 0x2f, 0x65, 0x6c, 0xf8, 0x62, 0xd4, 0xd3, - 0x7d, 0xda, 0x36, 0xfc, 0x88, 0x0a, 0xc5, 0xc6, 0xd4, 0xe2, 0x82, 0xf2, 0xa9, 0xe8, 0xf9, 0x26, - 0x83, 0x4d, 0xf7, 0x69, 0x88, 0x63, 0x56, 0xda, 0xed, 0xce, 0xb2, 0xa3, 0x1b, 0x94, 0x1b, 0x5a, - 0x68, 0xbb, 0x09, 0x03, 0xf4, 0xbb, 0xa2, 0x56, 0x5a, 0x16, 0x1d, 0xb3, 0xd2, 0xb2, 0x70, 0x4c, - 0x51, 0x23, 0x39, 0x69, 0x94, 0x4f, 0x47, 0x15, 0x35, 0x82, 0x64, 0x8a, 0x1a, 0xcd, 0x60, 0xf3, - 0x26, 0x9c, 0x0d, 0xf6, 0xf3, 0x62, 0xfd, 0xe5, 0x9d, 0xa6, 0x7c, 0x06, 0xf9, 0x3c, 0x96, 0xb8, - 0x0c, 0x88, 0x50, 0x4d, 0xf7, 0x69, 0x19, 0xe5, 0xd9, 0x8a, 0x9b, 0xc8, 0xd9, 0x26, 0xcc, 0x8b, - 0xef, 0x8e, 0xae, 0xb8, 0x19, 0x64, 0x6c, 0xc5, 0xcd, 0x40, 0xa5, 0x32, 0x17, 0x42, 0xd5, 0xb7, - 0x61, 0x1e, 0xc8, 0x34, 0x8b, 0x43, 0x2a, 0x73, 0x61, 0xa9, 0x2d, 0x6d, 0xc3, 0x3c, 0xb0, 0xd6, - 0xb2, 0x38, 0x90, 0xcb, 0x50, 0x6a, 0x34, 0x66, 0xb5, 0xae, 0xa5, 0xb4, 0x62, 0xee, 0xc8, 0x08, - 0x9d, 0xee, 0xd3, 0x04, 0x9e, 0x99, 0x41, 0x93, 0x6d, 0xdd, 0xf5, 0xcc, 0x96, 0x8b, 0x23, 0xc6, - 0x1f, 0x21, 0x46, 0xd4, 0x0c, 0x4a, 0xa3, 0x61, 0x66, 0x50, 0x1a, 0x9c, 0xd9, 0x8b, 0x13, 0xba, - 0xeb, 0xea, 0x96, 0xe1, 0xe8, 0xe3, 0xb8, 0x4c, 0xd0, 0xd8, 0x73, 0xb7, 0x08, 0x96, 0xd9, 0x8b, - 0x51, 0x08, 0x1e, 0xbe, 0xfb, 0x10, 0xdf, 0xcc, 0xb9, 0x17, 0x3b, 0x7c, 0x8f, 0xe1, 0xf1, 0xf0, - 0x3d, 0x06, 0x43, 0xbb, 0xd3, 0x87, 0x69, 0x74, 0xd9, 0x64, 0x22, 0x52, 0x96, 0x63, 0x76, 0x67, - 0x9c, 0x00, 0xed, 0xce, 0x38, 0x30, 0xd2, 0x24, 0x7f, 0xb9, 0x5d, 0xc9, 0x68, 0x52, 0xb8, 0xca, - 0x26, 0xca, 0xb0, 0xf5, 0x3b, 0x1c, 0x1c, 0xb5, 0x0d, 0x4b, 0x5f, 0xb3, 0x6b, 0xe3, 0xbe, 0xd4, - 0xcd, 0xe8, 0xfa, 0x9d, 0x49, 0xc8, 0xd6, 0xef, 0x4c, 0x24, 0x9b, 0x5d, 0xfd, 0x8d, 0xd6, 0x8a, - 0xee, 0x50, 0xa3, 0x66, 0x3a, 0x78, 0xb2, 0xb8, 0xc1, 0xb7, 0x86, 0x6f, 0x47, 0x67, 0xd7, 0x1e, - 0xa4, 0x6c, 0x76, 0xed, 0x81, 0x66, 0x46, 0x5e, 0x3a, 0x5a, 0xa3, 0xba, 0xa1, 0xac, 0x46, 0x8d, - 0xbc, 0x6c, 0x4a, 0x66, 0xe4, 0x65, 0x63, 0xb3, 0x3f, 0xe7, 0xae, 0x63, 0x7a, 0x54, 0x69, 0xef, - 0xe4, 0x73, 0x90, 0x34, 0xfb, 0x73, 0x10, 0xcd, 0x36, 0x84, 0xf1, 0x0e, 0x59, 0x8b, 0x6e, 0x08, - 0x93, 0xdd, 0x10, 0x2f, 0xc1, 0x2c, 0x16, 0xf1, 0xea, 0x51, 0xb1, 0xa2, 0x16, 0x8b, 0x00, 0x33, - 0x8b, 0x25, 0x7c, 0x17, 0x19, 0x79, 0xeb, 0xa6, 0xd8, 0xd1, 0x35, 0x54, 0xc6, 0xb1, 0x35, 0x34, - 0xf2, 0x2e, 0xee, 0xc3, 0x91, 0x87, 0x1c, 0x4a, 0x27, 0x6a, 0x75, 0x48, 0x28, 0x66, 0x75, 0xc8, - 0x4f, 0x3e, 0x26, 0xe0, 0x04, 0xde, 0x82, 0x6b, 0xdd, 0xe0, 0x1e, 0xe7, 0xb3, 0xd1, 0xcf, 0x8c, - 0xa1, 0xd9, 0x67, 0xc6, 0x40, 0x11, 0x26, 0x62, 0xda, 0x72, 0x32, 0x98, 0x84, 0xe7, 0x83, 0x31, - 0x10, 0x99, 0x01, 0xd2, 0xa8, 0xce, 0xce, 0xd4, 0x8d, 0x05, 0xf9, 0x8a, 0xcc, 0x8d, 0x9e, 0xc0, - 0x26, 0x29, 0xa6, 0xfb, 0xb4, 0x94, 0x72, 0xe4, 0x6d, 0xb8, 0x28, 0xa0, 0xe2, 0x49, 0xfb, 0x82, - 0x63, 0xdf, 0x37, 0x8d, 0x60, 0x41, 0xf0, 0xa2, 0x8e, 0x82, 0xbd, 0x68, 0xa7, 0xfb, 0xb4, 0x9e, - 0xbc, 0xb2, 0xeb, 0x12, 0xeb, 0x43, 0x77, 0x27, 0x75, 0x05, 0x8b, 0x44, 0x4f, 0x5e, 0xd9, 0x75, - 0x09, 0xb9, 0xdf, 0xdf, 0x49, 0x5d, 0x41, 0x27, 0xf4, 0xe4, 0x45, 0x5c, 0xa8, 0xf4, 0xc2, 0x57, - 0xdb, 0x6d, 0x65, 0x1d, 0xab, 0xfb, 0xe0, 0x4e, 0xaa, 0xab, 0xa2, 0xc1, 0xb9, 0x1d, 0x47, 0x36, - 0x4b, 0xcf, 0x77, 0xa8, 0xd5, 0x88, 0x2c, 0x40, 0x0f, 0xa2, 0xb3, 0x74, 0x82, 0x80, 0xcd, 0xd2, - 0x09, 0x20, 0x1b, 0x50, 0xf2, 0x7b, 0x20, 0x65, 0x23, 0x3a, 0xa0, 0x64, 0x1c, 0x1b, 0x50, 0x91, - 0xb7, 0x43, 0xf3, 0x70, 0x6a, 0x7e, 0xd5, 0xd3, 0x7d, 0x0b, 0xd2, 0x15, 0x5d, 0xf9, 0x4e, 0xec, - 0x92, 0x29, 0x49, 0x82, 0x97, 0x4c, 0x49, 0x30, 0x1b, 0x23, 0x0c, 0xdc, 0xd8, 0xb0, 0x5a, 0x53, - 0xba, 0xd9, 0xee, 0x3a, 0x54, 0xf9, 0x4b, 0xd1, 0x31, 0x12, 0x43, 0xb3, 0x31, 0x12, 0x03, 0xb1, - 0x05, 0x9a, 0x81, 0xaa, 0xae, 0x6b, 0x2e, 0x5b, 0x62, 0x5f, 0xd9, 0x6d, 0x7b, 0xca, 0xff, 0x2f, - 0xba, 0x40, 0xa7, 0xd1, 0xb0, 0x05, 0x3a, 0x0d, 0x8e, 0xa7, 0x4e, 0xac, 0x17, 0xd8, 0xe2, 0x21, - 0xdf, 0x55, 0xfe, 0xff, 0x63, 0xa7, 0x4e, 0x29, 0x34, 0x78, 0xea, 0x94, 0x02, 0x67, 0xeb, 0x23, - 0xb7, 0xc9, 0x66, 0xcc, 0xe0, 0xae, 0xfa, 0x3f, 0x88, 0xae, 0x8f, 0x71, 0x3c, 0x5b, 0x1f, 0xe3, - 0xb0, 0x28, 0x1f, 0xd1, 0x05, 0xff, 0x61, 0x16, 0x9f, 0x40, 0xfe, 0x89, 0x32, 0xe4, 0x86, 0xcc, - 0x47, 0x8c, 0x94, 0xef, 0xc9, 0x65, 0x31, 0x0a, 0x86, 0x47, 0xa2, 0x50, 0x94, 0x91, 0x46, 0xef, - 0x9b, 0x74, 0x5d, 0xf9, 0x5c, 0x26, 0x23, 0x4e, 0x10, 0x65, 0xc4, 0x61, 0xe4, 0x2d, 0x38, 0x1b, - 0xc2, 0x66, 0xe9, 0xda, 0x52, 0x30, 0x33, 0x7d, 0x6f, 0x2e, 0x6a, 0x06, 0xa7, 0x93, 0x31, 0x33, - 0x38, 0x1d, 0x93, 0xc6, 0x5a, 0x88, 0xee, 0x2f, 0x6f, 0xc3, 0x3a, 0x90, 0x60, 0x06, 0x83, 0x34, - 0xd6, 0x42, 0x9a, 0xdf, 0xb7, 0x0d, 0xeb, 0x40, 0xa6, 0x19, 0x0c, 0xc8, 0xe7, 0x73, 0x70, 0x29, - 0x1d, 0x55, 0x6d, 0xb7, 0xa7, 0x6c, 0x27, 0xc4, 0x29, 0x7f, 0x25, 0x17, 0x3d, 0x68, 0xd8, 0x59, - 0xb1, 0xe9, 0x3e, 0x6d, 0x87, 0x15, 0x90, 0x8f, 0xc1, 0x68, 0xb5, 0x6b, 0x98, 0x1e, 0x5e, 0xbc, - 0x31, 0xc3, 0xf9, 0xfb, 0x73, 0xb1, 0x2d, 0x8e, 0x8c, 0xc5, 0x2d, 0x8e, 0x0c, 0x20, 0x37, 0xe1, - 0x64, 0x83, 0xb6, 0xba, 0x8e, 0xe9, 0x6d, 0x68, 0xb4, 0x63, 0x3b, 0x1e, 0xe3, 0xf1, 0x03, 0xb9, - 0xe8, 0x24, 0x96, 0xa0, 0x60, 0x93, 0x58, 0x02, 0x48, 0xee, 0x24, 0x6e, 0xe5, 0x45, 0x67, 0xfe, - 0x60, 0xae, 0xe7, 0xb5, 0x7c, 0xd0, 0x97, 0xe9, 0xc5, 0xc9, 0x42, 0xec, 0x16, 0x5d, 0x70, 0xfd, - 0x7c, 0xae, 0xc7, 0x35, 0xba, 0x34, 0xc3, 0x25, 0xc1, 0x8c, 0x63, 0x4a, 0x96, 0x7f, 0xe5, 0xaf, - 0xe6, 0x7a, 0x5c, 0x7b, 0x87, 0x1c, 0x53, 0xc0, 0xe4, 0x25, 0xee, 0x29, 0x22, 0x18, 0xfd, 0xb5, - 0x5c, 0xd2, 0x55, 0x24, 0x28, 0x2f, 0x11, 0xb2, 0x62, 0xb7, 0xdd, 0x40, 0xe9, 0xbf, 0x90, 0x4b, - 0xfa, 0xe6, 0x85, 0xc5, 0xc2, 0x5f, 0x84, 0xc2, 0x85, 0xc9, 0x07, 0x1e, 0x75, 0x2c, 0xbd, 0x8d, - 0xdd, 0xd9, 0xf0, 0x6c, 0x47, 0x5f, 0xa6, 0x93, 0x96, 0xbe, 0xd4, 0xa6, 0xca, 0x0f, 0xe5, 0xa2, - 0x16, 0x6c, 0x36, 0x29, 0xb3, 0x60, 0xb3, 0xb1, 0x64, 0x05, 0x1e, 0x49, 0xc3, 0xd6, 0x4c, 0x17, - 0xeb, 0xf9, 0x62, 0x2e, 0x6a, 0xc2, 0xf6, 0xa0, 0x65, 0x26, 0x6c, 0x0f, 0x34, 0xb9, 0x0e, 0x43, - 0xe3, 0xb6, 0x3f, 0xfd, 0xfe, 0x70, 0xcc, 0x19, 0x32, 0xc0, 0x4c, 0xf7, 0x69, 0x21, 0x99, 0x28, - 0x23, 0x06, 0xf5, 0x97, 0x92, 0x65, 0xc2, 0xcb, 0xa7, 0xe0, 0x87, 0x28, 0x23, 0xc4, 0xfd, 0x1f, - 0x25, 0xcb, 0x84, 0x77, 0x5c, 0xc1, 0x0f, 0x36, 0x93, 0xf0, 0x1a, 0x67, 0xa7, 0xaa, 0xcc, 0x6e, - 0x9b, 0x58, 0xd1, 0xdb, 0x6d, 0x6a, 0x2d, 0x53, 0xe5, 0xcb, 0xb1, 0x99, 0x24, 0x9d, 0x8c, 0xcd, - 0x24, 0xe9, 0x18, 0xf2, 0x5d, 0x70, 0xee, 0x8e, 0xde, 0x36, 0x8d, 0x10, 0xe7, 0xe7, 0x7c, 0x57, - 0x7e, 0x24, 0x17, 0xdd, 0x4d, 0x67, 0xd0, 0xb1, 0xdd, 0x74, 0x06, 0x8a, 0xcc, 0x02, 0xc1, 0x65, - 0x34, 0x98, 0x2d, 0xd8, 0xfa, 0xac, 0xfc, 0xc7, 0xb9, 0xa8, 0x9d, 0x9a, 0x24, 0x61, 0x76, 0x6a, - 0x12, 0x4a, 0x9a, 0xd9, 0xb9, 0x57, 0x94, 0x1f, 0xcd, 0x45, 0x4f, 0x6b, 0xb2, 0x08, 0xa7, 0xfb, - 0xb4, 0xec, 0x04, 0x2e, 0x37, 0xa0, 0xdc, 0x58, 0xa8, 0x4f, 0x4d, 0x4d, 0x36, 0xee, 0xd4, 0x6b, - 0xf8, 0x54, 0xc3, 0x50, 0x7e, 0x2c, 0xb6, 0x62, 0xc5, 0x09, 0xd8, 0x8a, 0x15, 0x87, 0x91, 0xd7, - 0x60, 0x84, 0xb5, 0x9f, 0x0d, 0x18, 0xfc, 0xe4, 0xaf, 0xe4, 0xa2, 0xe6, 0x94, 0x8c, 0x64, 0xe6, - 0x94, 0xfc, 0x9b, 0x34, 0xe0, 0x34, 0x93, 0xe2, 0x82, 0x43, 0xef, 0x51, 0x87, 0x5a, 0x2d, 0x7f, - 0x4c, 0xff, 0x78, 0x2e, 0x6a, 0x65, 0xa4, 0x11, 0x31, 0x2b, 0x23, 0x0d, 0x4e, 0x56, 0xe1, 0x62, - 0xfc, 0x24, 0x48, 0x7e, 0xd7, 0xab, 0xfc, 0xf5, 0x5c, 0xcc, 0x18, 0xee, 0x41, 0x8c, 0xc6, 0x70, - 0x0f, 0x3c, 0xb1, 0xe0, 0x51, 0x71, 0xac, 0x22, 0x1c, 0x2e, 0xe3, 0xb5, 0xfd, 0x04, 0xaf, 0xed, - 0x03, 0xa1, 0x43, 0x60, 0x0f, 0xea, 0xe9, 0x3e, 0xad, 0x37, 0x3b, 0xa6, 0x67, 0xc9, 0x0c, 0x23, - 0xca, 0x4f, 0xe6, 0xd2, 0x3d, 0x52, 0x22, 0x6e, 0xca, 0x69, 0xa9, 0x49, 0xde, 0xca, 0xca, 0x8f, - 0xa1, 0xfc, 0x8d, 0xd8, 0x78, 0x4b, 0x27, 0x63, 0xe3, 0x2d, 0x23, 0xc1, 0xc6, 0x4d, 0x38, 0xc9, - 0x95, 0x7a, 0x41, 0xc7, 0x61, 0x68, 0x2d, 0x53, 0x43, 0xf9, 0x9b, 0xb1, 0xd5, 0x2e, 0x41, 0x81, - 0xae, 0x3d, 0x71, 0x20, 0x9b, 0xba, 0x1b, 0x1d, 0xdd, 0xb2, 0xf0, 0x98, 0x55, 0xf9, 0x4f, 0x62, - 0x53, 0x77, 0x88, 0x42, 0xc7, 0xdd, 0xe0, 0x17, 0xd3, 0x84, 0x5e, 0xb9, 0xa5, 0x94, 0xff, 0x34, - 0xa6, 0x09, 0xbd, 0x88, 0x99, 0x26, 0xf4, 0x4c, 0x54, 0x75, 0x27, 0xe3, 0x8d, 0xbd, 0xf2, 0xd5, - 0xd8, 0x8a, 0x9c, 0x4a, 0xc5, 0x56, 0xe4, 0xf4, 0x27, 0xfa, 0x77, 0x32, 0xde, 0xa7, 0x2b, 0x3f, - 0xd5, 0x9b, 0x6f, 0xb8, 0xd2, 0xa7, 0x3f, 0x6f, 0xbf, 0x93, 0xf1, 0xb6, 0x5b, 0xf9, 0x5b, 0xbd, - 0xf9, 0x86, 0x8e, 0x7d, 0xe9, 0x4f, 0xc3, 0x9b, 0xd9, 0xef, 0xa2, 0x95, 0xbf, 0x1d, 0x9f, 0xba, - 0x32, 0x08, 0x71, 0xea, 0xca, 0x7a, 0x5c, 0xbd, 0x04, 0xe7, 0xb9, 0x86, 0xdc, 0x70, 0xf4, 0xce, - 0x4a, 0x83, 0x7a, 0x9e, 0x69, 0x2d, 0xfb, 0x3b, 0xb1, 0xff, 0x2c, 0x17, 0x3b, 0x1e, 0xcb, 0xa2, - 0xc4, 0xe3, 0xb1, 0x2c, 0x24, 0x53, 0xde, 0xc4, 0x0b, 0x68, 0xe5, 0xef, 0xc4, 0x94, 0x37, 0x41, - 0xc1, 0x94, 0x37, 0xf9, 0x70, 0xfa, 0x66, 0xca, 0x43, 0x5f, 0xe5, 0x3f, 0xcf, 0xe6, 0x15, 0xb4, - 0x2f, 0xe5, 0x7d, 0xf0, 0xcd, 0x94, 0xf7, 0xac, 0xca, 0x7f, 0x91, 0xcd, 0x2b, 0xf4, 0x41, 0x4a, - 0x3e, 0x83, 0x7d, 0x0b, 0xce, 0xf2, 0xd9, 0x7c, 0x8a, 0x1a, 0x34, 0xf2, 0xa1, 0x3f, 0x1d, 0x1b, - 0xfb, 0xe9, 0x64, 0x78, 0xe4, 0x9e, 0x8a, 0x49, 0x63, 0x2d, 0xda, 0xfa, 0x77, 0xb7, 0x61, 0x1d, - 0x6e, 0x08, 0xd2, 0x31, 0x6c, 0xbd, 0x91, 0x5f, 0xbf, 0x29, 0x3f, 0x13, 0x5b, 0x6f, 0x64, 0x24, - 0xba, 0x73, 0xc8, 0x4f, 0xe5, 0x5e, 0x8b, 0xbe, 0xf4, 0x52, 0x7e, 0x36, 0xb5, 0x70, 0xd0, 0x01, - 0xd1, 0x67, 0x61, 0xaf, 0x45, 0x5f, 0x35, 0x29, 0x5f, 0x4b, 0x2d, 0x1c, 0x7c, 0x40, 0xf4, 0x09, - 0x14, 0xdb, 0x22, 0x75, 0x3d, 0x9b, 0xb3, 0x8a, 0x4c, 0x0f, 0x7f, 0x2f, 0xbe, 0x45, 0x4a, 0x25, - 0xc3, 0x2d, 0x52, 0x2a, 0x26, 0x8d, 0xb5, 0xf8, 0xbc, 0x9f, 0xdb, 0x86, 0xb5, 0xb4, 0xb1, 0x4b, - 0xc5, 0xa4, 0xb1, 0x16, 0x1f, 0xff, 0xf5, 0x6d, 0x58, 0x4b, 0x1b, 0xbb, 0x54, 0x0c, 0x33, 0xc7, - 0x42, 0xcc, 0x1d, 0xea, 0xb8, 0xa1, 0xfa, 0xfd, 0x97, 0x31, 0x73, 0x2c, 0x83, 0x8e, 0x99, 0x63, - 0x19, 0xa8, 0x54, 0xee, 0x42, 0x28, 0x3f, 0xbf, 0x1d, 0xf7, 0xf0, 0x5e, 0x26, 0x03, 0x95, 0xca, - 0x5d, 0xc8, 0xe5, 0xef, 0x6f, 0xc7, 0x3d, 0xbc, 0x98, 0xc9, 0x40, 0x31, 0xa3, 0xa8, 0xe1, 0xe9, - 0x9e, 0xd9, 0x9a, 0xb6, 0x5d, 0x4f, 0x5a, 0xe4, 0xff, 0xab, 0x98, 0x51, 0x94, 0x46, 0xc4, 0x8c, - 0xa2, 0x34, 0x78, 0x92, 0xa9, 0x90, 0xc6, 0x37, 0x7a, 0x32, 0x0d, 0x2d, 0xad, 0x34, 0x78, 0x92, - 0xa9, 0x10, 0xc2, 0x7f, 0xdd, 0x93, 0x69, 0xe8, 0x29, 0x9f, 0x06, 0x67, 0x96, 0xe9, 0x84, 0x63, - 0xaf, 0x5b, 0x37, 0xe9, 0x3a, 0x6d, 0x8b, 0x4f, 0xff, 0x85, 0x98, 0x65, 0x1a, 0x27, 0xc0, 0x5b, - 0x94, 0x18, 0x2c, 0xca, 0x48, 0x7c, 0xee, 0x2f, 0x66, 0x32, 0x0a, 0x8f, 0x89, 0xe2, 0xb0, 0x28, - 0x23, 0xf1, 0x89, 0xbf, 0x94, 0xc9, 0x28, 0x3c, 0x26, 0x8a, 0xc3, 0x48, 0x15, 0xc6, 0xf0, 0xad, - 0x84, 0xee, 0xfa, 0x9e, 0x9f, 0xbf, 0x96, 0x8b, 0xde, 0x7a, 0x45, 0xd1, 0xd3, 0x7d, 0x5a, 0xac, - 0x80, 0xcc, 0x42, 0x7c, 0xd2, 0x37, 0x33, 0x58, 0x84, 0xfe, 0x8e, 0x51, 0x88, 0xcc, 0x42, 0x7c, - 0xcc, 0x3f, 0xc8, 0x60, 0x11, 0x3a, 0x3c, 0x46, 0x21, 0xe4, 0x23, 0x30, 0xdc, 0x98, 0x5a, 0x5c, - 0xf0, 0xf3, 0x1f, 0xfe, 0xc3, 0x5c, 0xec, 0x55, 0x51, 0x88, 0xc3, 0x57, 0x45, 0xe1, 0x4f, 0xf2, - 0x31, 0x18, 0x9d, 0xb0, 0x2d, 0x4f, 0x6f, 0xf9, 0x1b, 0xd0, 0x5f, 0x8f, 0x9d, 0xa1, 0x44, 0xb0, - 0xd3, 0x7d, 0x5a, 0x94, 0x5c, 0x2a, 0x2f, 0xda, 0xfe, 0x1b, 0xe9, 0xe5, 0x83, 0xa6, 0x47, 0xc9, - 0xd9, 0x8c, 0x76, 0xd7, 0x76, 0x56, 0xdb, 0xb6, 0x6e, 0xf8, 0x21, 0x37, 0x45, 0x43, 0xfe, 0x51, - 0x6c, 0x46, 0x4b, 0x27, 0x63, 0x33, 0x5a, 0x3a, 0x26, 0x8d, 0xb5, 0xe8, 0xa2, 0xdf, 0xdc, 0x86, - 0x75, 0x38, 0x0f, 0xa7, 0x63, 0xd2, 0x58, 0x8b, 0xcf, 0xff, 0xc7, 0xdb, 0xb0, 0x0e, 0xe7, 0xe1, - 0x74, 0x0c, 0x33, 0xad, 0x6f, 0x98, 0x9e, 0xff, 0xb0, 0xed, 0x9f, 0xc4, 0x4c, 0xeb, 0x10, 0xc5, - 0x4c, 0xeb, 0xf0, 0x17, 0xa1, 0x70, 0x21, 0x78, 0x2a, 0x19, 0xee, 0x5d, 0xeb, 0xd6, 0x7d, 0xb6, - 0x3f, 0x56, 0xfe, 0x69, 0xec, 0x54, 0x24, 0x9b, 0x74, 0xba, 0x4f, 0xeb, 0xc1, 0x88, 0x2c, 0xc4, - 0xfc, 0x14, 0x79, 0x50, 0x3f, 0xe5, 0x9f, 0xe5, 0x7a, 0x38, 0x2a, 0x72, 0x9a, 0x84, 0xa3, 0x22, - 0x07, 0x8b, 0x39, 0x6b, 0xa9, 0x4d, 0x6f, 0xcf, 0xd5, 0xdf, 0x94, 0x66, 0xd7, 0x6f, 0x25, 0xe7, - 0xac, 0x04, 0x91, 0x98, 0xb3, 0x12, 0x70, 0xf2, 0x97, 0x73, 0xf0, 0x54, 0x5c, 0xbe, 0x6f, 0xbe, - 0xf4, 0xdc, 0x2b, 0x1a, 0xbd, 0x6f, 0xb7, 0x64, 0xcb, 0xea, 0xb7, 0x78, 0x2d, 0xcf, 0x64, 0x75, - 0x57, 0x5a, 0xa1, 0xe9, 0x3e, 0x6d, 0x47, 0xcc, 0x77, 0xd0, 0x0a, 0xa1, 0x34, 0xbf, 0xbd, 0xab, - 0x56, 0x04, 0x2a, 0xb4, 0x23, 0xe6, 0x3b, 0x68, 0x85, 0x18, 0x15, 0xdf, 0xde, 0x55, 0x2b, 0x82, - 0x31, 0xb2, 0x23, 0xe6, 0xb8, 0xfb, 0xbc, 0xdb, 0xa8, 0x4f, 0x04, 0xbe, 0x3e, 0x1b, 0x56, 0x4b, - 0xf9, 0x9d, 0xf8, 0xee, 0x33, 0x4e, 0x81, 0xbb, 0xcf, 0x38, 0x90, 0x2d, 0xf7, 0xd3, 0x54, 0x6f, - 0xb3, 0xed, 0x28, 0x6d, 0xad, 0x46, 0x8c, 0xb7, 0xdf, 0x8d, 0x2d, 0xf7, 0x19, 0x74, 0x6c, 0xb9, - 0xcf, 0x40, 0xa5, 0x72, 0x17, 0x12, 0xfa, 0xbd, 0xed, 0xb8, 0x87, 0xa6, 0x4a, 0x06, 0x2a, 0x95, - 0xbb, 0xd0, 0x82, 0xff, 0x66, 0x3b, 0xee, 0xa1, 0xa9, 0x92, 0x81, 0x22, 0x3f, 0x9c, 0x83, 0xcb, - 0x69, 0xdd, 0xc1, 0x63, 0x7f, 0xcc, 0xdf, 0xa7, 0x8e, 0x63, 0x1a, 0xfe, 0x05, 0xf2, 0xef, 0xf3, - 0xfa, 0x9e, 0xeb, 0xd5, 0xdf, 0x69, 0x05, 0xa7, 0xfb, 0xb4, 0x1d, 0x57, 0xb2, 0xc3, 0x16, 0x09, - 0x09, 0xfc, 0xc1, 0xae, 0x5b, 0x14, 0x88, 0x64, 0xc7, 0x95, 0xe0, 0x84, 0x63, 0x2e, 0xbb, 0x9e, - 0xed, 0xd0, 0x05, 0xbb, 0x6d, 0xb6, 0xfc, 0xf5, 0xe6, 0x0f, 0xe3, 0x13, 0x4e, 0x0a, 0x11, 0x4e, - 0x38, 0x29, 0xf0, 0x24, 0x53, 0xa1, 0x31, 0xff, 0xbc, 0x27, 0x53, 0xc9, 0x9c, 0x4b, 0x81, 0x27, - 0x99, 0x0a, 0x31, 0xfd, 0x8b, 0x9e, 0x4c, 0x25, 0x73, 0x2e, 0x05, 0x4e, 0x2c, 0x78, 0x34, 0x34, - 0x74, 0xab, 0xcb, 0xd4, 0xf2, 0x34, 0xbb, 0xdd, 0xb6, 0xbb, 0xde, 0xa2, 0x63, 0x2e, 0x2f, 0x53, - 0x47, 0xf9, 0xa3, 0xd8, 0x01, 0x59, 0x4f, 0xea, 0xe9, 0x3e, 0xad, 0x37, 0x3b, 0xe2, 0x41, 0x25, - 0x9d, 0x60, 0xca, 0x76, 0x5a, 0xb4, 0x66, 0x5b, 0x54, 0xf9, 0xe3, 0x5c, 0xf4, 0x7a, 0x7a, 0x1b, - 0xfa, 0xe9, 0x3e, 0x6d, 0x3b, 0x96, 0xe4, 0xb3, 0xf0, 0x58, 0x3a, 0x09, 0xfb, 0x6f, 0x49, 0x6f, - 0xad, 0x2a, 0xff, 0x6d, 0x2e, 0xea, 0xf3, 0xd7, 0x9b, 0x7c, 0xba, 0x4f, 0xdb, 0x86, 0xe1, 0xf8, - 0x00, 0xf4, 0xe3, 0xa5, 0xf4, 0xcd, 0xd2, 0xe0, 0x2f, 0xe7, 0xca, 0xbf, 0x92, 0xbb, 0x59, 0x1a, - 0xfc, 0x95, 0x5c, 0xf9, 0x57, 0xd9, 0xff, 0xbf, 0x9a, 0x2b, 0xff, 0x5a, 0x4e, 0x3b, 0x1f, 0x63, - 0xb0, 0xd0, 0xd6, 0xc5, 0x4a, 0x91, 0x8a, 0xe2, 0x3f, 0x53, 0x51, 0x22, 0x6b, 0xeb, 0x57, 0x73, - 0x30, 0xd2, 0xf0, 0x1c, 0xaa, 0xaf, 0x89, 0x20, 0xc8, 0x17, 0x60, 0x90, 0x3f, 0x23, 0xf3, 0xa3, - 0xf6, 0x68, 0xc1, 0x6f, 0x72, 0x09, 0xc6, 0x66, 0x74, 0xd7, 0xc3, 0x26, 0xd6, 0x2d, 0x83, 0x3e, - 0xc0, 0x10, 0x0a, 0x05, 0x2d, 0x06, 0x25, 0x33, 0x9c, 0x8e, 0x97, 0xc3, 0xb8, 0xf7, 0x85, 0x6d, - 0x63, 0xff, 0x0e, 0x7e, 0x6b, 0xb3, 0xd2, 0x87, 0xa1, 0x7e, 0x63, 0x65, 0xd5, 0x6f, 0xe7, 0x20, - 0xf1, 0xc0, 0x6d, 0xef, 0xc1, 0xbe, 0xe6, 0xe1, 0x44, 0x2c, 0xd7, 0x82, 0x88, 0x03, 0xb1, 0xc3, - 0x54, 0x0c, 0xf1, 0xd2, 0xe4, 0x83, 0x41, 0xfc, 0x81, 0xdb, 0xda, 0x8c, 0x88, 0xeb, 0x8c, 0x19, - 0xc9, 0xba, 0x4e, 0x5b, 0x93, 0x50, 0x22, 0x6e, 0xe7, 0x77, 0xca, 0x61, 0x20, 0x79, 0x72, 0x49, - 0x44, 0x1e, 0xcb, 0x85, 0xd1, 0xa0, 0xbb, 0x2e, 0x75, 0xe4, 0x68, 0xd0, 0x18, 0x69, 0xec, 0x63, - 0x30, 0x52, 0x5f, 0xeb, 0x50, 0xc7, 0xb5, 0x2d, 0xdd, 0xb3, 0x1d, 0x11, 0x19, 0x09, 0x63, 0x18, - 0x99, 0x12, 0x5c, 0x8e, 0x61, 0x24, 0xd3, 0x93, 0x2b, 0x7e, 0x52, 0xe5, 0x02, 0x86, 0xf0, 0xc7, - 0xe8, 0x20, 0x98, 0x54, 0x59, 0x0e, 0x33, 0x85, 0x14, 0x8c, 0xf4, 0xb6, 0xab, 0x63, 0xa4, 0x8a, - 0x80, 0xb4, 0xcb, 0x00, 0x32, 0x29, 0x52, 0x90, 0x67, 0xa0, 0x84, 0x26, 0x9e, 0x8b, 0xc9, 0xd2, - 0x45, 0x8c, 0xea, 0x36, 0x42, 0xe4, 0x68, 0x58, 0x9c, 0x86, 0xdc, 0x82, 0x72, 0xe8, 0xb6, 0x78, - 0xc3, 0xb1, 0xbb, 0x1d, 0x3f, 0x3d, 0x62, 0x65, 0x6b, 0xb3, 0xf2, 0xc8, 0x6a, 0x80, 0x6b, 0x2e, - 0x23, 0x52, 0x62, 0x91, 0x28, 0x48, 0xa6, 0xe1, 0x44, 0x08, 0x63, 0x22, 0xf2, 0xd3, 0xb2, 0x62, - 0xe4, 0x25, 0x89, 0x17, 0x13, 0x67, 0x24, 0x25, 0x7e, 0xac, 0x18, 0xa9, 0xc3, 0x80, 0x1f, 0xa0, - 0x7a, 0x70, 0x5b, 0x25, 0x3d, 0x25, 0x02, 0x54, 0x0f, 0xc8, 0xa1, 0xa9, 0xfd, 0xf2, 0x64, 0x0a, - 0xc6, 0x34, 0xbb, 0xeb, 0xd1, 0x45, 0x5b, 0x9c, 0xf7, 0x8b, 0x40, 0xe8, 0xd8, 0x26, 0x87, 0x61, - 0x9a, 0x9e, 0xdd, 0x6c, 0x71, 0x9c, 0x1c, 0x0d, 0x2a, 0x5a, 0x8a, 0xcc, 0xc1, 0xc9, 0x84, 0x83, - 0x27, 0x06, 0xb6, 0x18, 0xe2, 0xa1, 0x86, 0xa5, 0xcf, 0x4b, 0x32, 0x4b, 0x16, 0x25, 0xdf, 0x9f, - 0x83, 0xd2, 0xa2, 0xa3, 0x9b, 0x9e, 0x2b, 0x82, 0x5c, 0x9c, 0xb9, 0xba, 0xee, 0xe8, 0x1d, 0xa6, - 0x1f, 0x57, 0x31, 0x47, 0xc3, 0x1d, 0xbd, 0xdd, 0xa5, 0xee, 0xf8, 0x5d, 0xf6, 0x75, 0xff, 0xdd, - 0x66, 0xe5, 0x35, 0x1e, 0xd1, 0xec, 0x6a, 0xcb, 0x5e, 0xbb, 0xb6, 0xec, 0xe8, 0xf7, 0x4d, 0x0f, - 0xad, 0x30, 0xbd, 0x7d, 0xcd, 0xa3, 0x6d, 0xbc, 0xad, 0xbe, 0xa6, 0x77, 0xcc, 0x6b, 0x98, 0x0b, - 0xe8, 0x5a, 0xc0, 0x89, 0xd7, 0xc0, 0x54, 0xc0, 0xc3, 0xbf, 0x64, 0x15, 0xe0, 0x38, 0x32, 0x07, - 0x20, 0x3e, 0xb5, 0xda, 0xe9, 0x88, 0x88, 0x19, 0xd2, 0x1d, 0xaf, 0x8f, 0xe1, 0x8a, 0x1d, 0x08, - 0x4c, 0xef, 0x48, 0xf9, 0x2f, 0x34, 0x89, 0x03, 0xd3, 0x82, 0x45, 0xd1, 0x22, 0x5f, 0x4c, 0xa3, - 0x52, 0xfc, 0x2d, 0x81, 0x4a, 0x11, 0x52, 0xbc, 0x18, 0x59, 0x82, 0x13, 0x82, 0x6f, 0x90, 0x2d, - 0x6f, 0x2c, 0x3a, 0x2b, 0xc4, 0xd0, 0x5c, 0x69, 0x83, 0x36, 0x1a, 0x02, 0x2c, 0xd7, 0x11, 0x2b, - 0x41, 0xc6, 0x61, 0xd4, 0xff, 0x7b, 0x4e, 0x5f, 0xa3, 0xae, 0x72, 0x02, 0x35, 0xf6, 0xe2, 0xd6, - 0x66, 0x45, 0xf1, 0xcb, 0x63, 0xac, 0x76, 0x59, 0x74, 0xd1, 0x22, 0x32, 0x0f, 0xae, 0xf5, 0xe5, - 0x14, 0x1e, 0x71, 0x9d, 0x8f, 0x16, 0x21, 0x13, 0x30, 0x1a, 0x3c, 0xd8, 0xbd, 0x7d, 0xbb, 0x5e, - 0xc3, 0x90, 0x1c, 0x22, 0x5c, 0x7f, 0x2c, 0x9f, 0x9d, 0xcc, 0x24, 0x52, 0x46, 0x8a, 0xd3, 0xc6, - 0x63, 0x74, 0xc4, 0xe2, 0xb4, 0x75, 0x52, 0xe2, 0xb4, 0x2d, 0x90, 0x8f, 0xc2, 0x70, 0xf5, 0x6e, - 0x43, 0xc4, 0x9f, 0x73, 0x95, 0x53, 0x61, 0x72, 0x54, 0x0c, 0x7a, 0x27, 0x62, 0xd5, 0xc9, 0x4d, - 0x97, 0xe9, 0xc9, 0x24, 0x8c, 0x45, 0x76, 0x7f, 0xae, 0x72, 0x1a, 0x39, 0x60, 0xcb, 0x75, 0xc4, - 0x34, 0x1d, 0x81, 0x92, 0x87, 0x57, 0xb4, 0x10, 0xd3, 0x9a, 0x9a, 0xe9, 0x62, 0xa2, 0x49, 0x8d, - 0x62, 0xa8, 0x3b, 0x0c, 0xf0, 0x31, 0xc8, 0xb5, 0xc6, 0x10, 0xa8, 0xa6, 0xc3, 0x71, 0x72, 0x8f, - 0xc6, 0x8a, 0x91, 0xb7, 0x81, 0x60, 0x6a, 0x4a, 0x6a, 0xf8, 0x7b, 0x8b, 0x7a, 0xcd, 0x55, 0xce, - 0x62, 0xae, 0x1a, 0x12, 0x8f, 0x4c, 0x55, 0xaf, 0x8d, 0x5f, 0x12, 0xd3, 0xc7, 0x63, 0x3a, 0x2f, - 0xd5, 0xf4, 0xa3, 0x52, 0x35, 0x4d, 0x43, 0x6e, 0x71, 0x0a, 0x57, 0xb2, 0x0e, 0xe7, 0x16, 0x1c, - 0x7a, 0xdf, 0xb4, 0xbb, 0xae, 0xbf, 0x7c, 0xf8, 0xf3, 0xd6, 0xb9, 0x6d, 0xe7, 0xad, 0x27, 0x44, - 0xc5, 0x67, 0x3a, 0x0e, 0xbd, 0xdf, 0xf4, 0x33, 0x94, 0x44, 0x02, 0xec, 0x67, 0x71, 0x67, 0xe2, - 0xc2, 0x30, 0x7f, 0x02, 0x6e, 0x52, 0x57, 0x51, 0xc2, 0xa9, 0x96, 0x07, 0x55, 0x34, 0x03, 0x9c, - 0x2c, 0xae, 0x58, 0x31, 0xa2, 0x01, 0xb9, 0x31, 0xe1, 0xbb, 0x03, 0x56, 0x5b, 0x2d, 0xbb, 0x6b, - 0x79, 0xae, 0x72, 0x1e, 0x99, 0xa9, 0x4c, 0x2c, 0xcb, 0xad, 0x20, 0x5b, 0x51, 0x53, 0x17, 0x78, - 0x59, 0x2c, 0xc9, 0xd2, 0x64, 0x06, 0xca, 0x0b, 0x0e, 0x5e, 0x4e, 0xde, 0xa2, 0x1b, 0xdc, 0x48, - 0xc5, 0x38, 0x23, 0x62, 0xaa, 0xec, 0x70, 0x5c, 0x73, 0x95, 0x6e, 0x34, 0x3b, 0x88, 0x95, 0x97, - 0x95, 0x78, 0x49, 0x39, 0x7b, 0xc8, 0x23, 0x3b, 0xcb, 0x1e, 0x42, 0xa1, 0x2c, 0x9c, 0x09, 0x1f, - 0x78, 0xd4, 0x62, 0x4b, 0xbd, 0x2b, 0x62, 0x8a, 0x28, 0x31, 0xe7, 0xc3, 0x00, 0xcf, 0xa7, 0x0e, - 0x31, 0xca, 0x68, 0x00, 0x96, 0x1b, 0x16, 0x2f, 0x92, 0x4c, 0xb1, 0xf1, 0xe8, 0x1e, 0x52, 0x6c, - 0xfc, 0x6f, 0x05, 0x79, 0xfe, 0x25, 0x17, 0xa1, 0x28, 0x65, 0xc0, 0xc4, 0xfc, 0x01, 0x98, 0x2d, - 0xa8, 0x28, 0xd2, 0xa2, 0x0c, 0x09, 0xdb, 0x25, 0x88, 0xc4, 0x88, 0x29, 0xcf, 0xc3, 0x98, 0xf2, - 0x5a, 0x48, 0x80, 0xe9, 0xa6, 0xbb, 0x4b, 0x6d, 0xb3, 0x85, 0x39, 0xa4, 0x0a, 0x52, 0xe4, 0x32, - 0x84, 0xf2, 0x14, 0x52, 0x12, 0x09, 0xb9, 0x0e, 0xc3, 0xfe, 0xa5, 0x78, 0x98, 0x3f, 0x03, 0x53, - 0x0b, 0x89, 0xd9, 0x5a, 0x64, 0x2e, 0x92, 0x88, 0xc8, 0xab, 0x00, 0xe1, 0x74, 0x20, 0x2c, 0x2d, - 0x5c, 0x2a, 0xe4, 0xd9, 0x43, 0x5e, 0x2a, 0x42, 0x6a, 0x36, 0x71, 0xca, 0xea, 0xe8, 0x27, 0xd8, - 0xc7, 0x89, 0x33, 0xa2, 0xc3, 0xb2, 0x82, 0x44, 0x8b, 0x90, 0x79, 0x38, 0x99, 0xd0, 0x40, 0x91, - 0x6d, 0xe3, 0x89, 0xad, 0xcd, 0xca, 0xa3, 0x29, 0xea, 0x2b, 0x2f, 0xcc, 0x89, 0xb2, 0xe4, 0x49, - 0x28, 0xdc, 0xd6, 0xea, 0x22, 0xe2, 0x3f, 0x4f, 0x16, 0x11, 0x89, 0xb7, 0xc9, 0xb0, 0xe4, 0x15, - 0x00, 0x9e, 0x51, 0x6f, 0xc1, 0x76, 0x3c, 0xb4, 0x28, 0x46, 0xc7, 0xcf, 0xb3, 0xb1, 0xcc, 0x33, - 0xee, 0x35, 0xd9, 0x32, 0x26, 0x7f, 0x74, 0x48, 0xac, 0x7e, 0x6f, 0x3e, 0xb1, 0xac, 0x31, 0xc1, - 0x8b, 0x56, 0x48, 0x9d, 0x8f, 0x82, 0xf7, 0x9b, 0xce, 0x05, 0x2f, 0x11, 0x91, 0xcb, 0x30, 0xb8, - 0xc0, 0x26, 0x95, 0x96, 0xdd, 0x16, 0xaa, 0x80, 0x61, 0x5f, 0x3b, 0x02, 0xa6, 0x05, 0x58, 0x72, - 0x9d, 0x67, 0xa2, 0xb1, 0x62, 0xf9, 0x77, 0xba, 0x02, 0x16, 0x4f, 0x44, 0xc3, 0x60, 0xac, 0x4c, - 0x24, 0x45, 0xad, 0x28, 0x93, 0xb2, 0xa4, 0x86, 0x29, 0x69, 0x03, 0x83, 0xb6, 0x7f, 0x3b, 0x83, - 0x56, 0xfd, 0xf5, 0x5c, 0x72, 0x88, 0x92, 0x17, 0x93, 0xa9, 0x30, 0x70, 0xfd, 0x0a, 0x80, 0x72, - 0xad, 0x41, 0x52, 0x8c, 0x48, 0x52, 0x8b, 0xfc, 0x9e, 0x93, 0x5a, 0x14, 0x76, 0x99, 0xd4, 0x42, - 0xfd, 0xbf, 0x8b, 0x3d, 0xdf, 0xcd, 0x1d, 0x4a, 0xf0, 0xe3, 0x57, 0xd8, 0xa6, 0x8c, 0xd5, 0x5e, - 0x75, 0x13, 0x5b, 0x0b, 0xfe, 0x2c, 0xa8, 0xa9, 0xf3, 0x51, 0xe9, 0x6a, 0x51, 0x4a, 0xf2, 0x06, - 0x8c, 0xf8, 0x1f, 0x80, 0xc9, 0x52, 0xa4, 0x24, 0x1f, 0xc1, 0x82, 0x18, 0x4b, 0x2b, 0x12, 0x29, - 0x40, 0x5e, 0x82, 0x21, 0x34, 0x87, 0x3a, 0x7a, 0xcb, 0xcf, 0xa4, 0xc3, 0x53, 0xef, 0xf8, 0x40, - 0x39, 0xc0, 0x6f, 0x40, 0x49, 0x3e, 0x0d, 0x25, 0x91, 0x4e, 0xae, 0x84, 0x4b, 0xf4, 0xb5, 0x1d, - 0x3c, 0x34, 0xbc, 0x2a, 0xa7, 0x92, 0xe3, 0x1b, 0x1c, 0x04, 0x44, 0x36, 0x38, 0x3c, 0x8b, 0xdc, - 0x22, 0x9c, 0x5a, 0x70, 0xa8, 0x81, 0x4f, 0x5a, 0x27, 0x1f, 0x74, 0x1c, 0x91, 0xe8, 0x8f, 0x4f, - 0x10, 0xb8, 0xbe, 0x75, 0x7c, 0x34, 0x5b, 0x79, 0x05, 0x5e, 0x4e, 0xe7, 0x91, 0x52, 0x9c, 0x19, - 0x3d, 0xbc, 0x25, 0xb7, 0xe8, 0xc6, 0xba, 0xed, 0x18, 0x3c, 0x17, 0x9e, 0x98, 0xfa, 0x85, 0xa0, - 0x57, 0x05, 0x4a, 0x36, 0x7a, 0xa2, 0x85, 0x2e, 0xbc, 0x02, 0xc3, 0x7b, 0x4d, 0xc7, 0xf6, 0xf3, - 0xf9, 0x8c, 0x17, 0xe8, 0x0f, 0x6f, 0x46, 0xec, 0x0a, 0xf4, 0xf3, 0x28, 0x3f, 0x5c, 0xf9, 0x86, - 0xb6, 0x36, 0x2b, 0xfd, 0x9f, 0x45, 0x97, 0x60, 0x0e, 0x57, 0xff, 0x3c, 0x9f, 0xf1, 0xbc, 0xfe, - 0xe1, 0x95, 0x19, 0x5b, 0x78, 0x7c, 0x61, 0xd4, 0x6b, 0x28, 0xb9, 0x51, 0xb1, 0xf0, 0xf8, 0x60, - 0x66, 0x54, 0xc8, 0x44, 0xe4, 0x2a, 0xc0, 0x82, 0xee, 0xe8, 0x6b, 0xd4, 0x63, 0x7b, 0x1d, 0x7e, - 0x5a, 0x80, 0x56, 0x48, 0x27, 0x80, 0x6a, 0x12, 0x85, 0xfa, 0xd3, 0x85, 0x5e, 0xe1, 0x07, 0x8e, - 0x65, 0xbf, 0x1b, 0xd9, 0x5f, 0x87, 0xe1, 0x40, 0xb2, 0xf5, 0x1a, 0xda, 0x4b, 0xa3, 0x41, 0xf2, - 0x47, 0x0e, 0xc6, 0x32, 0x12, 0x11, 0xb9, 0xc2, 0xdb, 0xda, 0x30, 0xdf, 0xe1, 0x69, 0xc8, 0x46, - 0x45, 0x82, 0x29, 0xdd, 0xd3, 0x9b, 0xae, 0xf9, 0x0e, 0xd5, 0x02, 0xb4, 0xfa, 0x8f, 0xf2, 0xa9, - 0x31, 0x1c, 0x8e, 0xfb, 0x68, 0x17, 0x7d, 0x94, 0x22, 0x44, 0x1e, 0x7d, 0xe2, 0x58, 0x88, 0xbb, - 0x10, 0xe2, 0x9f, 0xe5, 0x53, 0x63, 0x75, 0x1c, 0x0b, 0x71, 0x37, 0xb3, 0xc5, 0x33, 0x30, 0xa4, - 0xd9, 0xeb, 0xee, 0x04, 0xee, 0x89, 0xf8, 0x5c, 0x81, 0x13, 0xb5, 0x63, 0xaf, 0xbb, 0x4d, 0xdc, - 0xed, 0x68, 0x21, 0x81, 0xfa, 0x9d, 0x7c, 0x8f, 0x68, 0x26, 0xc7, 0x82, 0x7f, 0x37, 0x97, 0xc8, - 0x5f, 0xcc, 0x47, 0xa2, 0xa5, 0x3c, 0xbc, 0xc2, 0xbe, 0x06, 0xd0, 0x68, 0xad, 0xd0, 0x35, 0x5d, - 0x4a, 0xe5, 0x8a, 0x47, 0x16, 0x2e, 0x42, 0xf9, 0x36, 0x58, 0x22, 0x51, 0x7f, 0x39, 0x1f, 0x0b, - 0x17, 0x73, 0x2c, 0xbb, 0x1d, 0xcb, 0x2e, 0xd0, 0x3a, 0x11, 0x01, 0xe7, 0x58, 0x72, 0x3b, 0x95, - 0xdc, 0x0f, 0xe6, 0x63, 0xc1, 0x82, 0x1e, 0x5a, 0xd9, 0xb1, 0x01, 0x98, 0x0c, 0x62, 0xf4, 0xd0, - 0x6a, 0xd2, 0x33, 0x30, 0x24, 0xe4, 0x10, 0x2c, 0x15, 0x7c, 0xde, 0xe7, 0x40, 0x3c, 0xa0, 0x0d, - 0x08, 0xd4, 0xbf, 0x92, 0x87, 0x68, 0x10, 0xa7, 0x87, 0x54, 0x87, 0x7e, 0x31, 0x1f, 0x0d, 0x5f, - 0xf5, 0xf0, 0xea, 0xcf, 0x55, 0x80, 0x46, 0x77, 0xa9, 0x25, 0x9c, 0x44, 0xfb, 0xa5, 0x13, 0xfe, - 0x00, 0xaa, 0x49, 0x14, 0xea, 0xbf, 0xcf, 0xa7, 0xc6, 0xd4, 0x7a, 0x78, 0x05, 0xf8, 0x02, 0x9e, - 0x8a, 0xb7, 0xac, 0x70, 0x22, 0xc7, 0x43, 0x48, 0x36, 0xfe, 0x12, 0xf9, 0xbf, 0x7d, 0x42, 0xf2, - 0x91, 0x14, 0x73, 0x0d, 0xb3, 0x93, 0x85, 0xe6, 0x9a, 0x7c, 0x98, 0x2f, 0x19, 0x6e, 0xbf, 0x9d, - 0xdf, 0x2e, 0x04, 0xd9, 0xc3, 0xbc, 0xaa, 0x0e, 0x2c, 0xe8, 0x1b, 0x18, 0x2a, 0x9b, 0xf5, 0xc4, - 0x08, 0xcf, 0x4e, 0xdd, 0xe1, 0x20, 0xf9, 0xda, 0x4e, 0x50, 0xa9, 0xff, 0xa6, 0x3f, 0x3d, 0xfe, - 0xd5, 0xc3, 0x2b, 0xc2, 0x8b, 0x50, 0x5c, 0xd0, 0xbd, 0x15, 0xa1, 0xc9, 0x78, 0x1b, 0xd8, 0xd1, - 0xbd, 0x15, 0x0d, 0xa1, 0xe4, 0x0a, 0x0c, 0x6a, 0xfa, 0x3a, 0x3f, 0xf3, 0x2c, 0x85, 0x99, 0xc3, - 0x1d, 0x7d, 0xbd, 0xc9, 0xcf, 0x3d, 0x03, 0x34, 0x51, 0x83, 0xcc, 0xf5, 0xfc, 0xe4, 0x1b, 0xd3, - 0x26, 0xf3, 0xcc, 0xf5, 0x41, 0xbe, 0xfa, 0x8b, 0x50, 0x1c, 0xb7, 0x8d, 0x0d, 0xbc, 0xf9, 0x1a, - 0xe1, 0x95, 0x2d, 0xd9, 0xc6, 0x86, 0x86, 0x50, 0xf2, 0xf9, 0x1c, 0x0c, 0x4c, 0x53, 0xdd, 0x60, - 0x23, 0x64, 0xa8, 0x97, 0xc3, 0xca, 0x9b, 0x07, 0xe3, 0xb0, 0x72, 0x72, 0x85, 0x57, 0x26, 0x2b, - 0x8a, 0xa8, 0x9f, 0xdc, 0x80, 0xc1, 0x09, 0xdd, 0xa3, 0xcb, 0xb6, 0xb3, 0x81, 0x2e, 0x38, 0x63, - 0xe1, 0x1b, 0xca, 0x88, 0xfe, 0xf8, 0x44, 0xfc, 0x66, 0xac, 0x25, 0x7e, 0x69, 0x41, 0x61, 0x26, - 0x16, 0x7e, 0x33, 0x87, 0x3e, 0x38, 0x42, 0x2c, 0xfc, 0x0a, 0x4f, 0x13, 0x98, 0xf0, 0x58, 0x79, - 0x24, 0xfd, 0x58, 0x19, 0xad, 0x47, 0x74, 0xd3, 0xc3, 0x7c, 0xf1, 0xa3, 0xb8, 0xe8, 0x73, 0xeb, - 0x11, 0xa1, 0x98, 0x2e, 0x5e, 0x93, 0x48, 0xd4, 0x3f, 0xe9, 0x87, 0xd4, 0x68, 0x39, 0xc7, 0x4a, - 0x7e, 0xac, 0xe4, 0xa1, 0x92, 0xd7, 0x12, 0x4a, 0x7e, 0x21, 0x19, 0x7f, 0xe9, 0x3d, 0xaa, 0xe1, - 0x5f, 0x29, 0x26, 0xa2, 0xb7, 0x3d, 0xdc, 0xbb, 0xcb, 0x50, 0x7a, 0xfd, 0xdb, 0x4a, 0x2f, 0x18, - 0x10, 0xa5, 0x6d, 0x07, 0xc4, 0xc0, 0x4e, 0x07, 0xc4, 0x60, 0xe6, 0x80, 0x08, 0x15, 0x64, 0x28, - 0x53, 0x41, 0xea, 0x62, 0xd0, 0x40, 0xef, 0x2c, 0x72, 0x17, 0xb7, 0x36, 0x2b, 0x63, 0x6c, 0x34, - 0xa5, 0xa6, 0x8f, 0x43, 0x16, 0xea, 0xb7, 0x8b, 0x3d, 0x42, 0x2e, 0x1e, 0x8a, 0x8e, 0xbc, 0x00, - 0x85, 0x6a, 0xa7, 0x23, 0xf4, 0xe3, 0x94, 0x14, 0xed, 0x31, 0xa3, 0x14, 0xa3, 0x26, 0xaf, 0x42, - 0xa1, 0x7a, 0xb7, 0x11, 0x4f, 0x1c, 0x57, 0xbd, 0xdb, 0x10, 0x5f, 0x92, 0x59, 0xf6, 0x6e, 0x83, - 0xbc, 0x1e, 0x46, 0x70, 0x5f, 0xe9, 0x5a, 0xab, 0x62, 0xa3, 0x28, 0x3c, 0x75, 0x7d, 0x4f, 0x9e, - 0x16, 0x43, 0xb1, 0xed, 0x62, 0x8c, 0x36, 0xa6, 0x4d, 0xa5, 0x9d, 0x6b, 0xd3, 0xc0, 0xb6, 0xda, - 0x34, 0xb8, 0x53, 0x6d, 0x1a, 0xda, 0x81, 0x36, 0xc1, 0xb6, 0xda, 0x34, 0xbc, 0x7f, 0x6d, 0xea, - 0xc0, 0x85, 0x64, 0x98, 0xdc, 0x40, 0x23, 0x34, 0x20, 0x49, 0xac, 0x70, 0x2c, 0xc1, 0xab, 0xff, - 0x2e, 0xc7, 0x36, 0xd7, 0x11, 0xdd, 0x74, 0x19, 0x5e, 0x76, 0x6d, 0x4b, 0x96, 0x56, 0x7f, 0x3e, - 0x9f, 0x1d, 0xdd, 0xf7, 0x68, 0x4e, 0x71, 0xdf, 0x9d, 0x2a, 0xa5, 0x62, 0xec, 0x5d, 0x61, 0xa6, - 0x94, 0x63, 0x6c, 0xd3, 0x64, 0xf6, 0xf5, 0x7c, 0x56, 0xc8, 0xe1, 0x7d, 0x49, 0xec, 0x03, 0x49, - 0x67, 0x38, 0x74, 0xf1, 0x77, 0xa3, 0x5e, 0x70, 0x53, 0x30, 0x22, 0x0b, 0x51, 0x48, 0x69, 0x27, - 0x02, 0x8e, 0x94, 0x23, 0xaf, 0x07, 0xf9, 0xfd, 0x24, 0xff, 0x18, 0xf4, 0x74, 0xf3, 0xc7, 0x6c, - 0xcc, 0x3d, 0x46, 0x26, 0x27, 0xcf, 0x40, 0x69, 0x0a, 0x13, 0xe6, 0xc8, 0x83, 0x9d, 0xa7, 0xd0, - 0x91, 0xbd, 0x56, 0x38, 0x8d, 0xfa, 0xeb, 0x39, 0x38, 0x75, 0xab, 0xbb, 0x44, 0x85, 0xa3, 0x5d, - 0xd0, 0x86, 0xb7, 0x01, 0x18, 0x58, 0x38, 0xcc, 0xe4, 0xd0, 0x61, 0xe6, 0x43, 0x72, 0x68, 0xe2, - 0x58, 0x81, 0xab, 0x21, 0x35, 0x77, 0x96, 0x79, 0xd4, 0xf7, 0x39, 0x5d, 0xed, 0x2e, 0xd1, 0x66, - 0xc2, 0x6b, 0x46, 0xe2, 0x7e, 0xe1, 0xa3, 0xdc, 0x9b, 0x7f, 0xaf, 0x0e, 0x2a, 0x3f, 0x97, 0xcf, - 0x8c, 0x06, 0x7d, 0x64, 0xf3, 0xc2, 0x7f, 0x2a, 0xb5, 0x57, 0xe2, 0xf9, 0xe1, 0x53, 0x48, 0x62, - 0x1c, 0xd3, 0xb8, 0xa4, 0x0b, 0xec, 0x10, 0x27, 0x96, 0xf7, 0xbc, 0xc0, 0xfe, 0x20, 0x97, 0x19, - 0xb5, 0xfb, 0xa8, 0x0a, 0x4c, 0xfd, 0x9f, 0x0b, 0x7e, 0xb0, 0xf0, 0x7d, 0x7d, 0xc2, 0x33, 0x30, - 0x24, 0xde, 0x8f, 0x47, 0xfd, 0x84, 0xc5, 0xb1, 0x21, 0x1e, 0x43, 0x07, 0x04, 0xcc, 0xa4, 0x90, - 0x9c, 0x98, 0x25, 0x3f, 0x61, 0xc9, 0x81, 0x59, 0x93, 0x48, 0x98, 0xd1, 0x30, 0xf9, 0xc0, 0xf4, - 0xd0, 0x02, 0x61, 0x7d, 0x59, 0xe0, 0x46, 0x03, 0x7d, 0x60, 0x7a, 0xdc, 0xfe, 0x08, 0xd0, 0xcc, - 0x20, 0xe0, 0xb6, 0x88, 0x98, 0xf7, 0xd0, 0x20, 0xe0, 0xa6, 0x8a, 0x26, 0x30, 0xac, 0xb5, 0xc2, - 0xf9, 0x56, 0xb8, 0xb4, 0x88, 0xd6, 0x0a, 0x77, 0x5d, 0x6c, 0x6d, 0x40, 0xc0, 0x38, 0x6a, 0x74, - 0x39, 0x74, 0xe2, 0x43, 0x8e, 0x0e, 0x42, 0x34, 0x81, 0x21, 0xd7, 0x61, 0xac, 0xe1, 0xe9, 0x96, - 0xa1, 0x3b, 0xc6, 0x7c, 0xd7, 0xeb, 0x74, 0x3d, 0xd9, 0x00, 0x76, 0x3d, 0xc3, 0xee, 0x7a, 0x5a, - 0x8c, 0x82, 0x3c, 0x07, 0xa3, 0x3e, 0x64, 0xd2, 0x71, 0x6c, 0x47, 0xb6, 0x72, 0x5c, 0xcf, 0xa0, - 0x8e, 0xa3, 0x45, 0x09, 0xc8, 0x47, 0x60, 0xb4, 0x6e, 0x05, 0xcf, 0xa1, 0xb5, 0x19, 0x61, 0xf3, - 0xe0, 0x8b, 0x31, 0x33, 0x40, 0x34, 0xbb, 0x4e, 0x5b, 0x8b, 0x12, 0xaa, 0x5b, 0xf9, 0x64, 0x4c, - 0xf5, 0x87, 0x77, 0x83, 0x74, 0x25, 0xea, 0xb8, 0x87, 0xde, 0xaa, 0x68, 0x7c, 0xca, 0x7e, 0xc3, - 0xdc, 0x06, 0xbd, 0x0e, 0x83, 0xb7, 0xe8, 0x06, 0xf7, 0x31, 0x2d, 0x85, 0x6e, 0xc9, 0xab, 0x02, - 0x26, 0x9f, 0xee, 0xfa, 0x74, 0xea, 0x37, 0xf3, 0xc9, 0x68, 0xf1, 0x0f, 0xaf, 0xb0, 0x9f, 0x83, - 0x01, 0x14, 0x65, 0xdd, 0xbf, 0x5e, 0x40, 0x01, 0xa2, 0xb8, 0xa3, 0xde, 0xce, 0x3e, 0x99, 0xfa, - 0x53, 0xa5, 0x78, 0x0a, 0x81, 0x87, 0x57, 0x7a, 0xaf, 0xc1, 0xf0, 0x84, 0x6d, 0xb9, 0xa6, 0xeb, - 0x51, 0xab, 0xe5, 0x2b, 0x2c, 0x3a, 0xfe, 0xb7, 0x42, 0xb0, 0x6c, 0x03, 0x4a, 0xd4, 0x7b, 0x51, - 0x5e, 0xf2, 0x32, 0x0c, 0xa1, 0xc8, 0xd1, 0xe6, 0xe4, 0x13, 0x1e, 0xde, 0x4c, 0x2c, 0x31, 0x60, - 0xdc, 0xe2, 0x0c, 0x49, 0xc9, 0x6d, 0x18, 0x9c, 0x58, 0x31, 0xdb, 0x86, 0x43, 0x2d, 0xf4, 0x4d, - 0x96, 0x22, 0xb5, 0x45, 0xfb, 0xf2, 0x2a, 0xfe, 0x8b, 0xb4, 0xbc, 0x39, 0x2d, 0x51, 0x2c, 0xf2, - 0x58, 0x4c, 0xc0, 0x2e, 0xfc, 0x68, 0x1e, 0x20, 0x2c, 0x40, 0x1e, 0x87, 0xbc, 0xff, 0x22, 0x99, - 0xbb, 0xc4, 0x44, 0x34, 0x28, 0x8f, 0x4b, 0x85, 0x18, 0xdb, 0xf9, 0x6d, 0xc7, 0xf6, 0x6d, 0x28, - 0xf1, 0xd3, 0x35, 0xf4, 0x5a, 0x97, 0x9e, 0x8d, 0x67, 0x36, 0xf8, 0x2a, 0xd2, 0x73, 0x5b, 0x1a, - 0x2d, 0xcf, 0x88, 0x07, 0x38, 0x67, 0x76, 0xa1, 0x05, 0xfd, 0xf8, 0x17, 0xb9, 0x04, 0xc5, 0x45, - 0x3f, 0x85, 0xff, 0x28, 0x9f, 0xa5, 0x63, 0xf2, 0x43, 0x3c, 0xeb, 0xa6, 0x09, 0xdb, 0xf2, 0x58, - 0xd5, 0xd8, 0xea, 0x11, 0x21, 0x17, 0x01, 0x8b, 0xc8, 0x45, 0xc0, 0xd4, 0x7f, 0x96, 0x4f, 0x49, - 0x6e, 0xf1, 0xf0, 0x0e, 0x93, 0x57, 0x00, 0xf0, 0xe5, 0x39, 0x93, 0xa7, 0xff, 0x1c, 0x04, 0x47, - 0x09, 0x32, 0x42, 0xb5, 0x8d, 0x6c, 0x3b, 0x42, 0x62, 0xf5, 0xb7, 0x72, 0x89, 0x8c, 0x08, 0xfb, - 0x92, 0xa3, 0x6c, 0x95, 0xe5, 0xf7, 0x68, 0xc6, 0xfa, 0x7d, 0x51, 0xd8, 0x5d, 0x5f, 0x44, 0xbf, - 0xe5, 0x00, 0x2c, 0xd3, 0xc3, 0xfc, 0x96, 0x3f, 0xc9, 0xa7, 0xe5, 0x87, 0x38, 0x9a, 0x2a, 0xfe, - 0x62, 0x60, 0x94, 0x16, 0x63, 0x19, 0x79, 0x10, 0x1a, 0x2b, 0xe6, 0x9b, 0xa9, 0x9f, 0x81, 0x13, - 0xb1, 0xac, 0x09, 0x38, 0xff, 0x4b, 0xa1, 0x26, 0xd2, 0x73, 0x2b, 0x64, 0xc7, 0x2c, 0x88, 0x90, - 0xa9, 0xff, 0x6f, 0xae, 0x77, 0xce, 0x8c, 0x43, 0x57, 0x9d, 0x14, 0x01, 0x14, 0xfe, 0x62, 0x04, - 0x70, 0x00, 0xdb, 0xe0, 0xa3, 0x2d, 0x80, 0xf7, 0xc8, 0xe4, 0xf1, 0x6e, 0x0b, 0xe0, 0xa7, 0x72, - 0xdb, 0xa6, 0x3c, 0x39, 0x6c, 0x19, 0xa8, 0xff, 0x43, 0x2e, 0x35, 0x35, 0xc9, 0xbe, 0xda, 0xf5, - 0x3a, 0x94, 0xb8, 0x0b, 0x8f, 0x68, 0x95, 0x94, 0xcc, 0x95, 0x41, 0x33, 0xca, 0x8b, 0x32, 0x64, - 0x06, 0x06, 0x78, 0x1b, 0x0c, 0xd1, 0x1b, 0x4f, 0xf5, 0xc8, 0x8f, 0x62, 0x64, 0x4d, 0x8e, 0x02, - 0xad, 0xfe, 0x46, 0x2e, 0x91, 0x29, 0xe5, 0x10, 0xbf, 0x2d, 0x9c, 0xaa, 0x0b, 0x3b, 0x9f, 0xaa, - 0xd5, 0x7f, 0x9d, 0x4f, 0x4f, 0xd4, 0x72, 0x88, 0x1f, 0x72, 0x10, 0xc7, 0x69, 0x7b, 0x5b, 0xb7, - 0x16, 0x61, 0x2c, 0x2a, 0x0b, 0xb1, 0x6c, 0x3d, 0x96, 0x9e, 0xae, 0x26, 0xa3, 0x15, 0x31, 0x1e, - 0xea, 0x8f, 0xe4, 0x93, 0x39, 0x66, 0x0e, 0x7d, 0x7e, 0xda, 0x93, 0xb6, 0x90, 0x3a, 0x9c, 0x08, - 0xbf, 0x64, 0xd1, 0xf4, 0xda, 0xfe, 0xe9, 0x3e, 0xc6, 0x04, 0x10, 0x31, 0x2c, 0xda, 0xa6, 0xeb, - 0x35, 0x3d, 0x86, 0x8c, 0x44, 0x53, 0x88, 0x96, 0x8b, 0x49, 0xe5, 0x3d, 0xb2, 0x6c, 0xbd, 0xc7, - 0xa4, 0xf2, 0x1e, 0x59, 0xcb, 0x0e, 0x5d, 0x2a, 0x3f, 0x93, 0xcf, 0xca, 0x41, 0x74, 0xe8, 0xb2, - 0xf9, 0xa4, 0xdc, 0x5f, 0xbc, 0x65, 0x42, 0x4a, 0x8f, 0x67, 0x25, 0xfd, 0xc9, 0xe0, 0x99, 0xe0, - 0xb3, 0xb7, 0x49, 0x2c, 0x55, 0x58, 0xef, 0x91, 0xe1, 0x75, 0x34, 0x84, 0xf5, 0x1e, 0x19, 0x75, - 0xef, 0x3d, 0x61, 0xfd, 0x4a, 0x7e, 0xa7, 0x89, 0xaf, 0x8e, 0x85, 0x97, 0x10, 0xde, 0x97, 0xf2, - 0xc9, 0x84, 0x6c, 0x87, 0x2e, 0xa6, 0x29, 0x28, 0x89, 0xd4, 0x70, 0x99, 0xc2, 0xe1, 0xf8, 0x2c, - 0x93, 0x4d, 0x7c, 0xc7, 0x8b, 0x20, 0x6e, 0xaa, 0x76, 0x26, 0x12, 0x4e, 0xab, 0x7e, 0x27, 0x17, - 0xcb, 0x5e, 0x76, 0x28, 0x67, 0x24, 0x7b, 0x5b, 0xdd, 0x3e, 0xea, 0x9f, 0xd6, 0x16, 0x63, 0xf1, - 0x7b, 0x83, 0xef, 0xa9, 0x51, 0x4f, 0x37, 0xdb, 0xf1, 0xf2, 0x22, 0xc0, 0xc2, 0x37, 0xf3, 0x70, - 0x32, 0x41, 0x4a, 0x2e, 0x45, 0x42, 0x1a, 0xe1, 0xb9, 0x6b, 0xcc, 0x13, 0x9f, 0x07, 0x37, 0xda, - 0xc5, 0x51, 0xf1, 0x25, 0x28, 0xd6, 0xf4, 0x0d, 0xfe, 0x6d, 0xfd, 0x9c, 0xa5, 0xa1, 0x6f, 0xc8, - 0x47, 0x8a, 0x88, 0x27, 0x4b, 0x70, 0x86, 0x5f, 0xf8, 0x98, 0xb6, 0xb5, 0x68, 0xae, 0xd1, 0xba, - 0x35, 0x6b, 0xb6, 0xdb, 0xa6, 0x2b, 0x6e, 0x2d, 0x9f, 0xd9, 0xda, 0xac, 0x5c, 0xf6, 0x6c, 0x4f, - 0x6f, 0x37, 0xa9, 0x4f, 0xd6, 0xf4, 0xcc, 0x35, 0xda, 0x34, 0xad, 0xe6, 0x1a, 0x52, 0x4a, 0x2c, - 0xd3, 0x59, 0x91, 0x3a, 0x4f, 0x14, 0xd4, 0x68, 0xe9, 0x96, 0x45, 0x8d, 0xba, 0x35, 0xbe, 0xe1, - 0x51, 0x7e, 0xdb, 0x59, 0xe0, 0x67, 0x9e, 0xfc, 0xa1, 0x3d, 0x47, 0x33, 0xc6, 0x4b, 0x8c, 0x40, - 0x4b, 0x29, 0xa4, 0xfe, 0x6a, 0x31, 0x25, 0x71, 0xdd, 0x11, 0x52, 0x1f, 0xbf, 0xa7, 0x8b, 0xdb, - 0xf4, 0xf4, 0x35, 0x18, 0x10, 0x99, 0x18, 0xc4, 0x0d, 0x0a, 0xbe, 0x0c, 0xb8, 0xcf, 0x41, 0xf2, - 0x15, 0x94, 0xa0, 0x22, 0x6d, 0xb8, 0xb0, 0xc8, 0xba, 0x29, 0xbd, 0x33, 0x4b, 0x7b, 0xe8, 0xcc, - 0x1e, 0xfc, 0xc8, 0x5b, 0x70, 0x0e, 0xb1, 0x29, 0xdd, 0x3a, 0x80, 0x55, 0xa1, 0xad, 0xc7, 0xab, - 0x4a, 0xef, 0xdc, 0xac, 0xf2, 0xe4, 0x93, 0x30, 0x12, 0x0c, 0x10, 0x93, 0xba, 0xe2, 0x6a, 0xa6, - 0xc7, 0x38, 0xe3, 0x81, 0xf8, 0x18, 0x18, 0xfd, 0xf1, 0xa2, 0xc1, 0xdc, 0x22, 0xbc, 0xd4, 0xff, - 0x3e, 0xd7, 0x2b, 0x81, 0xde, 0xa1, 0xcf, 0xca, 0x1f, 0x85, 0x01, 0x83, 0x7f, 0x94, 0xd0, 0xa9, - 0xde, 0x29, 0xf6, 0x38, 0xa9, 0xe6, 0x97, 0x51, 0xff, 0x55, 0xae, 0x67, 0xde, 0xbe, 0xa3, 0xfe, - 0x79, 0x5f, 0x2a, 0x64, 0x7c, 0x9e, 0x98, 0x44, 0xaf, 0x40, 0xd9, 0x0c, 0x13, 0x0b, 0x35, 0xc3, - 0x58, 0x5e, 0xda, 0x09, 0x09, 0x8e, 0xa3, 0xeb, 0x45, 0x08, 0x3c, 0xd2, 0x1c, 0xdf, 0xdd, 0xce, - 0x6d, 0x76, 0x1d, 0x93, 0x8f, 0x4b, 0xed, 0xb4, 0x1b, 0xf3, 0xc5, 0x73, 0x6f, 0x3b, 0x26, 0xab, - 0x40, 0xf7, 0x56, 0xa8, 0xa5, 0x37, 0xd7, 0x6d, 0x67, 0x15, 0xa3, 0xbd, 0xf2, 0xc1, 0xa9, 0x9d, - 0xe0, 0xf0, 0xbb, 0x3e, 0x98, 0x3c, 0x09, 0xa3, 0xcb, 0xed, 0x2e, 0x0d, 0xe2, 0x6b, 0xf2, 0xcb, - 0x4c, 0x6d, 0x84, 0x01, 0x83, 0x2b, 0xa0, 0x47, 0x01, 0x90, 0x08, 0xa3, 0xf8, 0xf3, 0x9b, 0x4b, - 0x6d, 0x88, 0x41, 0x16, 0x45, 0x77, 0x5d, 0xe0, 0x5a, 0xcd, 0x85, 0xd4, 0x6c, 0xdb, 0xd6, 0x72, - 0xd3, 0xa3, 0xce, 0x1a, 0x36, 0x14, 0xbd, 0x35, 0xb4, 0xb3, 0x48, 0x81, 0x77, 0x43, 0xee, 0x8c, - 0x6d, 0x2d, 0x2f, 0x52, 0x67, 0x8d, 0x35, 0xf5, 0x19, 0x20, 0xa2, 0xa9, 0x0e, 0x9e, 0xea, 0xf0, - 0x8f, 0x43, 0x77, 0x0d, 0x4d, 0x7c, 0x04, 0x3f, 0xee, 0xc1, 0x0f, 0xab, 0xc0, 0x30, 0x0f, 0x32, - 0xc8, 0x85, 0x86, 0x3e, 0x1a, 0x1a, 0x70, 0x10, 0xca, 0xeb, 0x2c, 0x08, 0xf7, 0x11, 0xee, 0x22, - 0xaf, 0x89, 0x5f, 0xea, 0x17, 0x0a, 0x69, 0xa9, 0x06, 0xf7, 0xa5, 0x68, 0xe1, 0xb4, 0x9a, 0xdf, - 0xd5, 0xb4, 0x7a, 0xc2, 0xea, 0xae, 0x35, 0xf5, 0x4e, 0xa7, 0x79, 0xcf, 0x6c, 0xe3, 0x1b, 0x35, - 0x5c, 0xf8, 0xb4, 0x51, 0xab, 0xbb, 0x56, 0xed, 0x74, 0xa6, 0x38, 0x90, 0x3c, 0x0d, 0x27, 0x19, - 0x1d, 0x76, 0x52, 0x40, 0x59, 0x44, 0x4a, 0xc6, 0x00, 0xa3, 0xf4, 0xfa, 0xb4, 0xe7, 0x61, 0x50, - 0xf0, 0xe4, 0x6b, 0x55, 0xbf, 0x36, 0xc0, 0x99, 0xb9, 0xac, 0xe7, 0x02, 0x36, 0x7c, 0x72, 0xed, - 0xd7, 0x86, 0xfc, 0xf2, 0x18, 0x8b, 0xda, 0xea, 0xae, 0xf1, 0xf0, 0x62, 0x03, 0x88, 0x0c, 0x7e, - 0x93, 0x4b, 0x30, 0xc6, 0xb8, 0x04, 0x02, 0xe3, 0xe1, 0x7b, 0xfb, 0xb5, 0x18, 0x94, 0x5c, 0x87, - 0xd3, 0x11, 0x08, 0xb7, 0x41, 0xf9, 0x9b, 0x8b, 0x7e, 0x2d, 0x15, 0xa7, 0xfe, 0x72, 0x21, 0x9a, - 0x00, 0xf1, 0x10, 0x3a, 0xe2, 0x1c, 0x0c, 0xd8, 0xce, 0x72, 0xb3, 0xeb, 0xb4, 0xc5, 0xd8, 0x2b, - 0xd9, 0xce, 0xf2, 0x6d, 0xa7, 0x4d, 0xce, 0x40, 0x89, 0xf5, 0x8e, 0x69, 0x88, 0x21, 0xd6, 0xaf, - 0x77, 0x3a, 0x75, 0x83, 0x54, 0x79, 0x87, 0x60, 0xe8, 0xd7, 0x66, 0x0b, 0xb7, 0xf6, 0xdc, 0xeb, - 0xa2, 0x9f, 0xaf, 0x78, 0x09, 0x24, 0xf6, 0x13, 0x06, 0x84, 0xe5, 0x07, 0x01, 0x31, 0x16, 0x06, - 0x6e, 0x4b, 0x0c, 0xde, 0x27, 0x71, 0x16, 0x02, 0x19, 0xb2, 0xe0, 0x9b, 0x18, 0x83, 0xd4, 0x80, - 0x84, 0x54, 0x6b, 0xb6, 0x61, 0xde, 0x33, 0x29, 0x7f, 0x22, 0xd3, 0xcf, 0x6f, 0xb6, 0x93, 0x58, - 0xad, 0xec, 0x33, 0x99, 0x15, 0x10, 0xf2, 0x1a, 0x57, 0x42, 0x4e, 0x87, 0x6b, 0x1f, 0xef, 0x5b, - 0x6e, 0xa7, 0xc5, 0x50, 0xa8, 0x99, 0x58, 0x1e, 0x17, 0x42, 0xf5, 0x1b, 0xa5, 0x64, 0x16, 0xcc, - 0x43, 0xb1, 0x6b, 0xa6, 0x01, 0x44, 0x92, 0xdb, 0xf0, 0xf6, 0xf0, 0x82, 0x94, 0xd1, 0x46, 0x60, - 0x32, 0x78, 0x48, 0x65, 0xc9, 0x15, 0x18, 0xe4, 0x5f, 0x54, 0xaf, 0x09, 0x7b, 0x07, 0x7d, 0xe0, - 0xdc, 0x8e, 0x79, 0xef, 0x1e, 0x3a, 0xcc, 0x05, 0x68, 0x72, 0x09, 0x06, 0x6a, 0x73, 0x8d, 0x46, - 0x75, 0xce, 0xbf, 0x0a, 0xc7, 0xc7, 0x3a, 0x86, 0xe5, 0x36, 0x5d, 0xdd, 0x72, 0x35, 0x1f, 0x49, - 0x9e, 0x84, 0x52, 0x7d, 0x01, 0xc9, 0xf8, 0x13, 0xd4, 0xe1, 0xad, 0xcd, 0xca, 0x80, 0xd9, 0xe1, - 0x54, 0x02, 0x85, 0xf5, 0xde, 0xa9, 0xd7, 0x24, 0x7f, 0x10, 0x5e, 0xef, 0x7d, 0xd3, 0xc0, 0x7b, - 0x75, 0x2d, 0x40, 0x93, 0x97, 0x60, 0xa4, 0x41, 0x1d, 0x53, 0x6f, 0xcf, 0x75, 0x71, 0xab, 0x28, - 0x85, 0xb4, 0x74, 0x11, 0xde, 0xb4, 0x10, 0xa1, 0x45, 0xc8, 0xc8, 0x45, 0x28, 0x4e, 0x9b, 0x96, - 0xff, 0x1e, 0x04, 0x1f, 0x0c, 0xac, 0x98, 0x96, 0xa7, 0x21, 0x94, 0x3c, 0x09, 0x85, 0x9b, 0x8b, - 0x75, 0xe1, 0xea, 0x86, 0xbc, 0xde, 0xf6, 0x22, 0xe1, 0x31, 0x6f, 0x2e, 0xd6, 0xc9, 0x4b, 0x30, - 0xc4, 0x16, 0x31, 0x6a, 0xb5, 0xa8, 0xab, 0x0c, 0xe3, 0xc7, 0xf0, 0x98, 0x8c, 0x3e, 0x50, 0x76, - 0x5a, 0x09, 0x28, 0xc9, 0x2d, 0x28, 0xc7, 0xb3, 0x3d, 0x88, 0x37, 0x49, 0x68, 0x71, 0xad, 0x0b, - 0x5c, 0x5a, 0x54, 0xd0, 0x44, 0x41, 0x62, 0x80, 0x12, 0x87, 0xb1, 0x7d, 0x1d, 0x5a, 0x9d, 0x3c, - 0x20, 0xf5, 0xe5, 0xad, 0xcd, 0xca, 0x53, 0x09, 0xa6, 0x4d, 0x47, 0x50, 0x49, 0xdc, 0x33, 0x39, - 0x91, 0x4f, 0x01, 0x54, 0x3d, 0xcf, 0x31, 0x97, 0xba, 0xcc, 0x3c, 0x1c, 0xeb, 0xfd, 0xa4, 0x41, - 0xdd, 0xda, 0xac, 0x9c, 0xd6, 0x03, 0xf2, 0xd4, 0x87, 0x0d, 0x12, 0x3b, 0xf5, 0x7f, 0xcf, 0xa7, - 0xa7, 0x6d, 0x3d, 0x84, 0xa9, 0x6f, 0x8f, 0x6e, 0x03, 0xb1, 0x01, 0x57, 0xdc, 0xc7, 0x80, 0xbb, - 0x07, 0x27, 0xaa, 0xc6, 0x9a, 0x69, 0x55, 0xf1, 0xa7, 0x3b, 0x3b, 0x55, 0xc5, 0xa9, 0x54, 0x7a, - 0xfb, 0x19, 0x43, 0x8b, 0xef, 0xe1, 0x81, 0xa8, 0x19, 0xaa, 0xa9, 0x73, 0x5c, 0x73, 0xed, 0x9e, - 0xde, 0x6c, 0xf1, 0x8c, 0xa7, 0x5a, 0x9c, 0xa9, 0xfa, 0x23, 0xf9, 0x6d, 0x32, 0xcd, 0x3e, 0x8c, - 0xd2, 0x57, 0xbf, 0x9c, 0xef, 0x9d, 0xec, 0xf7, 0xa1, 0x14, 0xca, 0x9f, 0xe5, 0x53, 0x52, 0xef, - 0xee, 0x4b, 0x12, 0x57, 0x60, 0x90, 0xb3, 0x09, 0xfc, 0xb6, 0x71, 0x76, 0xe7, 0xca, 0x8a, 0xab, - 0x8a, 0x8f, 0x26, 0x73, 0x70, 0xba, 0x7a, 0xef, 0x1e, 0x6d, 0x79, 0x61, 0x48, 0xf2, 0xb9, 0x30, - 0xc2, 0x2f, 0x0f, 0xc1, 0x2c, 0xf0, 0x61, 0x48, 0x73, 0x8c, 0x64, 0x93, 0x5a, 0x8e, 0x2c, 0xc2, - 0xd9, 0x38, 0xbc, 0xc1, 0xb7, 0x44, 0x45, 0x29, 0x2a, 0x73, 0x82, 0x23, 0xff, 0x4f, 0xcb, 0x28, - 0x9b, 0xd6, 0x4a, 0x5c, 0xba, 0xfa, 0x7b, 0xb5, 0x12, 0xd7, 0xb1, 0xd4, 0x72, 0xea, 0x37, 0x0b, - 0x72, 0x86, 0xe2, 0x87, 0xd7, 0xc3, 0xee, 0xc5, 0x88, 0x5f, 0xfd, 0x4e, 0x87, 0xcc, 0x4b, 0x22, - 0x3c, 0x8d, 0xd1, 0x75, 0x7c, 0x17, 0xd4, 0x20, 0x3c, 0x06, 0x02, 0xe5, 0x75, 0x39, 0xa0, 0x24, - 0x75, 0x28, 0x56, 0x9d, 0x65, 0x6e, 0xee, 0x6f, 0xf7, 0x62, 0x4f, 0x77, 0x96, 0xd3, 0x17, 0x36, - 0x64, 0xa1, 0xfe, 0x70, 0xbe, 0x47, 0x52, 0xe1, 0x87, 0x72, 0x12, 0xf9, 0x89, 0x7c, 0x56, 0x7a, - 0xe0, 0xa3, 0xea, 0x2b, 0xf8, 0x2e, 0x0b, 0xe7, 0x68, 0x3b, 0x52, 0x1e, 0xa0, 0x70, 0x7e, 0x3f, - 0x9f, 0x95, 0xeb, 0xf8, 0x58, 0x38, 0x7b, 0x9b, 0x20, 0x53, 0x45, 0xfa, 0x10, 0xdb, 0xdc, 0xb2, - 0x2a, 0xf4, 0xef, 0xd1, 0x5f, 0x2e, 0x4d, 0xa4, 0xc7, 0x43, 0x78, 0x5f, 0x5a, 0xfa, 0x07, 0xf9, - 0xcc, 0x9c, 0xde, 0xc7, 0x32, 0x3d, 0x48, 0x99, 0x1e, 0x0f, 0xfd, 0x7d, 0x0d, 0xfd, 0x54, 0x99, - 0x1e, 0x8f, 0xfd, 0x7d, 0xe9, 0xe9, 0xcf, 0xe6, 0xb7, 0xc9, 0xf3, 0x79, 0xc4, 0xcf, 0x55, 0xcf, - 0x42, 0x49, 0xdc, 0x3c, 0x60, 0xae, 0x43, 0x4d, 0xfc, 0xda, 0xa3, 0xb4, 0xfe, 0x5e, 0x7e, 0xdb, - 0x2c, 0xa5, 0xc7, 0xf2, 0x92, 0xe4, 0xf5, 0xb5, 0xfc, 0x76, 0xf9, 0x55, 0x8f, 0xc5, 0x25, 0x89, - 0xeb, 0xf7, 0xf2, 0x98, 0xe4, 0xdc, 0x33, 0x5b, 0xd3, 0xb6, 0xeb, 0x49, 0x79, 0xca, 0xff, 0xe2, - 0x57, 0x8c, 0x83, 0xf0, 0x2f, 0xf7, 0xbb, 0xa7, 0xb8, 0xaf, 0xee, 0xe9, 0xdf, 0xc7, 0x96, 0x26, - 0x29, 0xd0, 0x43, 0x5b, 0x82, 0xdf, 0xaf, 0x02, 0x3d, 0x80, 0xf5, 0xf7, 0x61, 0x16, 0xe8, 0x5f, - 0x2b, 0x40, 0x79, 0xc2, 0xb1, 0xd7, 0xad, 0x9b, 0x74, 0x9d, 0xb6, 0x0f, 0x6d, 0xb8, 0xbf, 0x27, - 0x0c, 0x44, 0x67, 0x8f, 0x06, 0xa2, 0x5f, 0x8e, 0xbc, 0x01, 0x27, 0x42, 0x59, 0xca, 0x31, 0x1e, - 0xf1, 0x6e, 0xbb, 0xc5, 0x50, 0xcd, 0xb7, 0x19, 0x4e, 0x04, 0x23, 0x8b, 0x53, 0xab, 0xdf, 0x89, - 0xf4, 0xc6, 0xc3, 0x6d, 0xae, 0xef, 0xbb, 0x37, 0x6e, 0xc3, 0xd9, 0x89, 0xae, 0xe3, 0x50, 0xcb, - 0x4b, 0xef, 0x14, 0xbc, 0x49, 0x6b, 0x71, 0x8a, 0x66, 0xb2, 0x73, 0x32, 0x0a, 0x33, 0xb6, 0xe2, - 0x6d, 0x59, 0x9c, 0xed, 0x40, 0xc8, 0xb6, 0xcb, 0x29, 0xd2, 0xd8, 0xa6, 0x17, 0x56, 0x7f, 0x3b, - 0x2f, 0x77, 0xfd, 0xa1, 0xcd, 0x6a, 0xef, 0x8b, 0xae, 0x57, 0xbf, 0x50, 0x80, 0x31, 0xd6, 0xac, - 0x45, 0xdd, 0x5d, 0x3d, 0x36, 0x61, 0xf6, 0xb3, 0x40, 0xb0, 0xaf, 0xf0, 0x25, 0x89, 0xe3, 0x46, - 0xfa, 0x0a, 0x1f, 0x9e, 0xf5, 0x15, 0x3e, 0x5e, 0xfd, 0xb9, 0x62, 0xd8, 0x1d, 0xc7, 0x06, 0xd0, - 0x61, 0x77, 0x07, 0x99, 0x87, 0xd3, 0x62, 0x6e, 0xf3, 0x41, 0x98, 0xec, 0x47, 0xcc, 0x5f, 0x3c, - 0x67, 0xa8, 0x98, 0x16, 0xbb, 0x2e, 0x75, 0x9a, 0x9e, 0xee, 0xae, 0x36, 0x31, 0x3b, 0x90, 0x96, - 0x5a, 0x90, 0x31, 0x14, 0xb3, 0x5a, 0x94, 0xe1, 0x60, 0xc8, 0xd0, 0x9f, 0x10, 0x13, 0x0c, 0xd3, - 0x0a, 0xaa, 0xbf, 0x98, 0x83, 0x72, 0xfc, 0x73, 0xc8, 0x55, 0x18, 0x64, 0xbf, 0x83, 0xa0, 0x27, - 0xc2, 0x25, 0x3b, 0xe4, 0xc8, 0xfd, 0x85, 0x7c, 0x1a, 0xf2, 0x32, 0x0c, 0xa1, 0x6b, 0x16, 0x16, - 0xc8, 0x87, 0xb1, 0x66, 0xc2, 0x02, 0x98, 0x61, 0x9b, 0x17, 0x0b, 0x49, 0xc9, 0x6b, 0x30, 0x5c, - 0x0f, 0x7d, 0x50, 0xc5, 0x05, 0x34, 0xba, 0xbe, 0x4b, 0x25, 0x43, 0x02, 0x4d, 0xa6, 0x56, 0xbf, - 0x95, 0x0f, 0x55, 0xfd, 0xd8, 0x34, 0xdd, 0x97, 0x69, 0xfa, 0xf3, 0x05, 0x18, 0x9d, 0xb0, 0x2d, - 0x4f, 0x6f, 0x79, 0xc7, 0x87, 0xc1, 0xfb, 0x39, 0x64, 0x23, 0x15, 0xe8, 0x9f, 0x5c, 0xd3, 0xcd, - 0xb6, 0x30, 0x7c, 0x30, 0x22, 0x36, 0x65, 0x00, 0x8d, 0xc3, 0xc9, 0x0d, 0x8c, 0x03, 0xc5, 0x24, - 0x1d, 0x38, 0xe2, 0x8d, 0x85, 0xc1, 0x83, 0x25, 0x94, 0x48, 0x9f, 0xcd, 0x01, 0x7c, 0xe4, 0xc8, - 0x25, 0xe5, 0x3e, 0x3b, 0x3e, 0x18, 0x3d, 0x22, 0x7d, 0xf6, 0x95, 0x02, 0x9c, 0x8d, 0x3b, 0x04, - 0x1e, 0x0f, 0x38, 0xd1, 0x79, 0x7f, 0x09, 0x4e, 0xc7, 0x65, 0x53, 0x63, 0xd2, 0xe8, 0xef, 0xed, - 0x3b, 0x72, 0x75, 0x6b, 0xb3, 0xf2, 0x78, 0xd2, 0x17, 0x93, 0x55, 0x96, 0xea, 0x4d, 0x92, 0x5a, - 0x49, 0x6a, 0xcf, 0xbc, 0x47, 0x5e, 0x09, 0x3f, 0xe4, 0x3d, 0xf3, 0x13, 0xf9, 0x64, 0xcf, 0x1c, - 0x4f, 0x78, 0x62, 0xe1, 0xfe, 0x9d, 0x3c, 0x3c, 0x15, 0x17, 0xce, 0x9b, 0x2f, 0x3d, 0xf7, 0x8a, - 0x46, 0xfd, 0xa0, 0xa1, 0xc7, 0xd3, 0x8b, 0x50, 0x62, 0x8c, 0xfe, 0xaa, 0xbb, 0xc1, 0xcb, 0x41, - 0x11, 0xfd, 0x95, 0x41, 0x34, 0x81, 0xd9, 0x81, 0x38, 0x8f, 0xe7, 0x84, 0x5d, 0x88, 0xf3, 0xa7, - 0xb7, 0x15, 0xe7, 0xf1, 0x40, 0xf6, 0xdd, 0xd5, 0x8a, 0x00, 0x37, 0x4c, 0x4f, 0x84, 0x56, 0x3e, - 0xe2, 0x57, 0x65, 0x92, 0x9f, 0x6b, 0x71, 0x4f, 0x7e, 0xae, 0x61, 0xc0, 0xa4, 0xfe, 0x3d, 0x04, - 0x4c, 0x7a, 0x03, 0x06, 0x84, 0x1c, 0xc5, 0xbe, 0xfd, 0x5c, 0xf8, 0x15, 0x08, 0xce, 0xaa, 0xde, - 0x97, 0xfe, 0x07, 0x60, 0xc0, 0xe5, 0x41, 0xc4, 0xc4, 0xbe, 0x1a, 0xdf, 0xd3, 0x08, 0x90, 0xe6, - 0xff, 0x41, 0x2e, 0x02, 0xe6, 0xc3, 0x90, 0x9f, 0xbb, 0xf0, 0xfc, 0x18, 0xec, 0x5f, 0x52, 0x87, - 0x01, 0xf1, 0x6a, 0x40, 0x01, 0x7c, 0xab, 0x1b, 0xa8, 0x65, 0xd8, 0xcf, 0xfc, 0xf1, 0x00, 0x3f, - 0xb3, 0x16, 0xc4, 0xf2, 0x23, 0x66, 0x01, 0x52, 0x7f, 0x23, 0x07, 0xe5, 0x78, 0x21, 0xf2, 0x0c, - 0x94, 0xf8, 0x5f, 0x62, 0x87, 0x8e, 0xb1, 0x4c, 0x79, 0x09, 0x39, 0x96, 0xa9, 0xa0, 0x7e, 0x09, - 0x86, 0x34, 0xff, 0x29, 0x88, 0xd8, 0xa1, 0xa3, 0xff, 0x6e, 0xf0, 0x3e, 0x44, 0xf6, 0xdf, 0x0d, - 0x28, 0xc9, 0x93, 0x50, 0x98, 0x6f, 0x1b, 0x62, 0x63, 0x8e, 0x6f, 0x76, 0xec, 0xb6, 0x1c, 0xa8, - 0x95, 0x61, 0x19, 0xd1, 0x1c, 0x5d, 0x17, 0xce, 0xde, 0x48, 0x64, 0xd1, 0x75, 0x99, 0x68, 0x8e, - 0xae, 0xab, 0xbf, 0x9b, 0xf3, 0xdd, 0x77, 0x67, 0x4c, 0xd7, 0xab, 0x5b, 0xf7, 0xf5, 0xb6, 0x19, - 0x74, 0x04, 0xb9, 0x01, 0x63, 0x21, 0x52, 0x7a, 0xf3, 0x9f, 0x88, 0x8d, 0x83, 0xaf, 0xc2, 0x1f, - 0x0f, 0x79, 0xc7, 0x8a, 0x91, 0x4b, 0x92, 0xf2, 0x4b, 0xa7, 0x16, 0xf2, 0x43, 0x72, 0xe1, 0x8a, - 0x3d, 0x32, 0x6b, 0xba, 0xae, 0x69, 0x2d, 0xf3, 0xf7, 0x88, 0x05, 0x7c, 0x6a, 0x84, 0xe7, 0x27, - 0x6b, 0x1c, 0xde, 0x74, 0x18, 0x42, 0x7e, 0x33, 0x2d, 0x17, 0x50, 0xff, 0x7d, 0x0e, 0x2e, 0x30, - 0x4e, 0x18, 0xa5, 0x33, 0xf1, 0x61, 0xfb, 0x1a, 0xc0, 0x6b, 0x3d, 0x24, 0x25, 0x46, 0xf5, 0x13, - 0xc9, 0xc0, 0x14, 0x31, 0xc2, 0x18, 0xf7, 0x1e, 0xb2, 0xdf, 0x5b, 0xa0, 0xb4, 0xdf, 0xc9, 0xe1, - 0xf5, 0xe0, 0x52, 0x9b, 0xde, 0x9e, 0xab, 0xbf, 0x79, 0x40, 0x17, 0xd8, 0x7b, 0x9d, 0xba, 0x3e, - 0x0e, 0x65, 0x17, 0xdb, 0xd2, 0xec, 0x5a, 0xe6, 0x03, 0x3c, 0xf9, 0x12, 0x1f, 0x73, 0x56, 0xfa, - 0x18, 0xa9, 0xad, 0xda, 0x18, 0xa7, 0xbf, 0x6d, 0x99, 0x0f, 0x30, 0x48, 0xe9, 0xc7, 0x30, 0xee, - 0xbb, 0x44, 0x41, 0x2e, 0xc0, 0x20, 0xe3, 0x63, 0x05, 0xca, 0xa8, 0x05, 0xbf, 0x49, 0x19, 0x0a, - 0x5d, 0xd3, 0xc0, 0x66, 0xf6, 0x6b, 0xec, 0x4f, 0xf5, 0x8f, 0x0a, 0x70, 0xb2, 0x7a, 0xb7, 0x51, - 0x9f, 0x08, 0x5e, 0x31, 0x88, 0x87, 0xa6, 0x6b, 0xbb, 0x94, 0x85, 0x4f, 0x4f, 0x26, 0x60, 0x8c, - 0x07, 0x0a, 0x10, 0xc1, 0xec, 0xf9, 0xb9, 0x54, 0x3f, 0x7f, 0x4d, 0x11, 0xc5, 0x48, 0x4a, 0x3a, - 0x8a, 0x18, 0x11, 0xf3, 0xde, 0x25, 0x2d, 0x38, 0x1f, 0x21, 0x6d, 0xea, 0x41, 0x1c, 0x36, 0x3f, - 0x06, 0xc6, 0x07, 0xb7, 0x36, 0x2b, 0x4f, 0x66, 0x12, 0x49, 0xac, 0xcf, 0xc9, 0xac, 0xc3, 0x78, - 0x6e, 0x2e, 0xb9, 0x05, 0x27, 0x79, 0x79, 0x3c, 0xb4, 0x0b, 0x9c, 0x24, 0x18, 0x73, 0x29, 0xde, - 0x81, 0x84, 0x94, 0x63, 0x5b, 0x21, 0x92, 0x09, 0x5c, 0x3c, 0x12, 0xbe, 0x0b, 0x67, 0x38, 0x7d, - 0x87, 0x3a, 0x38, 0x12, 0x6d, 0xab, 0xe9, 0x52, 0x4f, 0xbc, 0x35, 0x1e, 0x7f, 0x72, 0x6b, 0xb3, - 0x52, 0x49, 0x25, 0x90, 0x98, 0x9e, 0x42, 0x82, 0x85, 0x00, 0xdf, 0xa0, 0x9e, 0xec, 0xa7, 0x51, - 0xda, 0x85, 0x9a, 0xff, 0x64, 0x1e, 0xce, 0x4d, 0x53, 0xbd, 0xed, 0xad, 0x4c, 0xac, 0xd0, 0xd6, - 0xea, 0xb1, 0xab, 0x74, 0xc4, 0x6a, 0x49, 0x95, 0xce, 0xb1, 0x89, 0xdc, 0x4b, 0x3a, 0xc7, 0x16, - 0xaf, 0x90, 0xce, 0xd7, 0xf2, 0x70, 0x39, 0x6d, 0x73, 0x80, 0xb7, 0x03, 0xce, 0xfc, 0x7d, 0xea, - 0x38, 0xa6, 0x41, 0x0f, 0x71, 0x51, 0x39, 0x38, 0x7b, 0x58, 0xee, 0xb0, 0xe2, 0x1e, 0x3d, 0x62, - 0x77, 0x26, 0xae, 0x43, 0x4c, 0x62, 0xf3, 0xde, 0x12, 0xd7, 0x8f, 0xe7, 0xe1, 0x74, 0xc3, 0x5c, - 0x76, 0x3d, 0xdb, 0xa1, 0x0b, 0x18, 0xb1, 0xe3, 0x58, 0x93, 0x32, 0x45, 0x73, 0x88, 0xb9, 0xa2, - 0xde, 0xeb, 0xa2, 0x39, 0x1e, 0x50, 0x1c, 0xff, 0x74, 0x8b, 0xdf, 0x86, 0xdf, 0x32, 0x2d, 0x83, - 0x9c, 0x87, 0x33, 0xb7, 0x1b, 0x93, 0x5a, 0xf3, 0x56, 0x7d, 0xae, 0xd6, 0xbc, 0x3d, 0xd7, 0x58, - 0x98, 0x9c, 0xa8, 0x4f, 0xd5, 0x27, 0x6b, 0xe5, 0x3e, 0x72, 0x0a, 0x4e, 0x84, 0xa8, 0xe9, 0xdb, - 0xb3, 0xd5, 0xb9, 0x72, 0x8e, 0x9c, 0x84, 0xd1, 0x10, 0x38, 0x3e, 0xbf, 0x58, 0xce, 0x93, 0xd3, - 0x50, 0x0e, 0x41, 0x8d, 0xb7, 0x1a, 0x8b, 0x93, 0xb3, 0xe5, 0xc2, 0xd3, 0x3f, 0x91, 0x03, 0x60, - 0xb5, 0xcc, 0x3b, 0xe6, 0xb2, 0x69, 0x91, 0x47, 0xe0, 0x1c, 0x12, 0xcd, 0x6b, 0xf5, 0x1b, 0xf5, - 0xb9, 0x58, 0x4d, 0x67, 0xe0, 0xa4, 0x8c, 0x9c, 0x99, 0x9f, 0xa8, 0xce, 0x94, 0x73, 0x41, 0x03, - 0x04, 0xb8, 0xd1, 0x98, 0x97, 0x6a, 0x13, 0xc0, 0xf9, 0x5b, 0x8b, 0xd5, 0x72, 0x21, 0x0e, 0x6d, - 0x4c, 0xd4, 0x67, 0xcb, 0x45, 0x72, 0x0e, 0x4e, 0xc9, 0xd0, 0xc9, 0xb9, 0x45, 0xad, 0x5a, 0xaf, - 0x95, 0xfb, 0x9f, 0xfe, 0x20, 0x0c, 0x63, 0x44, 0x21, 0xb1, 0xa3, 0x1e, 0x81, 0xc1, 0xf9, 0xf1, - 0xc6, 0xa4, 0x76, 0x07, 0x5b, 0x03, 0x50, 0xaa, 0x4d, 0xce, 0xb1, 0x96, 0xe5, 0x9e, 0xfe, 0xbf, - 0x72, 0x00, 0x8d, 0xa9, 0xc5, 0x05, 0x41, 0x38, 0x0c, 0x03, 0xf5, 0xb9, 0x3b, 0xd5, 0x99, 0x3a, - 0xa3, 0x1b, 0x84, 0xe2, 0xfc, 0xc2, 0x24, 0x13, 0xca, 0x10, 0xf4, 0x4f, 0xcc, 0xcc, 0x37, 0x26, - 0xcb, 0x79, 0x06, 0xd4, 0x26, 0xab, 0xb5, 0x72, 0x81, 0x01, 0xef, 0x6a, 0xf5, 0xc5, 0xc9, 0x72, - 0x91, 0xfd, 0x39, 0xd3, 0x58, 0xac, 0x2e, 0x96, 0xfb, 0xd9, 0x9f, 0x53, 0xf8, 0x67, 0x89, 0x31, - 0x6b, 0x4c, 0x2e, 0xe2, 0x8f, 0x01, 0xd6, 0x84, 0x29, 0xff, 0xd7, 0x20, 0x43, 0x31, 0xd6, 0xb5, - 0xba, 0x56, 0x1e, 0x62, 0x3f, 0x18, 0x4b, 0xf6, 0x03, 0x58, 0xe3, 0xb4, 0xc9, 0xd9, 0xf9, 0x3b, - 0x93, 0xe5, 0x61, 0xc6, 0x6b, 0xf6, 0x16, 0x03, 0x8f, 0xb0, 0x3f, 0xb5, 0x59, 0xf6, 0xe7, 0x28, - 0xe3, 0xa4, 0x4d, 0x56, 0x67, 0x16, 0xaa, 0x8b, 0xd3, 0xe5, 0x31, 0xd6, 0x1e, 0xe4, 0x79, 0x82, - 0x97, 0x9c, 0xab, 0xce, 0x4e, 0x96, 0xcb, 0x82, 0xa6, 0x36, 0x53, 0x9f, 0xbb, 0x55, 0x3e, 0x89, - 0x0d, 0x79, 0x6b, 0x16, 0x7f, 0x10, 0x56, 0x00, 0xff, 0x3a, 0xf5, 0xf4, 0x77, 0x41, 0x69, 0xbe, - 0x81, 0x77, 0xfb, 0xe7, 0xe0, 0xd4, 0x7c, 0xa3, 0xb9, 0xf8, 0xd6, 0xc2, 0x64, 0xac, 0xe3, 0x4e, - 0xc2, 0xa8, 0x8f, 0x98, 0xa9, 0xcf, 0xdd, 0x7e, 0x93, 0x2b, 0x88, 0x0f, 0x9a, 0xad, 0x4e, 0xcc, - 0x37, 0xca, 0x79, 0xd6, 0x8f, 0x3e, 0xe8, 0x6e, 0x7d, 0xae, 0x36, 0x7f, 0xb7, 0x51, 0x2e, 0x3c, - 0x7d, 0x1f, 0x46, 0x6a, 0xf4, 0xbe, 0xd9, 0xa2, 0x42, 0x41, 0x1e, 0x85, 0xf3, 0xb5, 0xc9, 0x3b, - 0xf5, 0x89, 0xc9, 0x4c, 0x15, 0x89, 0xa2, 0xab, 0x0b, 0xf5, 0x72, 0x8e, 0x9c, 0x05, 0x12, 0x05, - 0xdf, 0xac, 0xce, 0x4e, 0x95, 0xf3, 0x44, 0x81, 0xd3, 0x51, 0x78, 0x7d, 0x6e, 0xf1, 0xf6, 0xdc, - 0x64, 0xb9, 0xf0, 0xf4, 0xdf, 0xce, 0xc1, 0x99, 0xd4, 0xfc, 0xe0, 0x44, 0x85, 0xc7, 0x26, 0x67, - 0xaa, 0x8d, 0xc5, 0xfa, 0x44, 0x63, 0xb2, 0xaa, 0x4d, 0x4c, 0x37, 0x27, 0xaa, 0x8b, 0x93, 0x37, - 0xe6, 0xb5, 0xb7, 0x9a, 0x37, 0x26, 0xe7, 0x26, 0xb5, 0xea, 0x4c, 0xb9, 0x8f, 0x3c, 0x09, 0x95, - 0x0c, 0x9a, 0xc6, 0xe4, 0xc4, 0x6d, 0xad, 0xbe, 0xf8, 0x56, 0x39, 0x47, 0x9e, 0x80, 0x47, 0x33, - 0x89, 0xd8, 0xef, 0x72, 0x9e, 0x3c, 0x06, 0x17, 0xb2, 0x48, 0x3e, 0x31, 0x53, 0x2e, 0x3c, 0xfd, - 0xe3, 0x39, 0x20, 0xc9, 0x04, 0xcf, 0xe4, 0x71, 0xb8, 0xc8, 0xf4, 0xa2, 0x99, 0xdd, 0xc0, 0x27, - 0xe0, 0xd1, 0x54, 0x0a, 0xa9, 0x79, 0x15, 0x78, 0x24, 0x83, 0x44, 0x34, 0xee, 0x22, 0x28, 0xe9, - 0x04, 0xd8, 0xb4, 0x5f, 0xc8, 0xc1, 0x99, 0xd4, 0x20, 0x1b, 0xe4, 0x32, 0x3c, 0x55, 0xad, 0xcd, - 0xb2, 0xbe, 0x99, 0x58, 0xac, 0xcf, 0xcf, 0x35, 0x9a, 0xb3, 0x53, 0xd5, 0x26, 0xd3, 0xbe, 0xdb, - 0x8d, 0x58, 0x6f, 0x5e, 0x02, 0xb5, 0x07, 0xe5, 0xc4, 0x74, 0x75, 0xee, 0x06, 0x1b, 0x7e, 0xe4, - 0x29, 0x78, 0x3c, 0x93, 0x6e, 0x72, 0xae, 0x3a, 0x3e, 0x33, 0x59, 0x2b, 0xe7, 0xc9, 0x07, 0xe0, - 0x89, 0x4c, 0xaa, 0x5a, 0xbd, 0xc1, 0xc9, 0x0a, 0x4f, 0xeb, 0x91, 0xab, 0x5f, 0xf6, 0x95, 0x13, - 0xf3, 0x73, 0x8b, 0xd5, 0x89, 0xc5, 0x34, 0xcd, 0x3e, 0x0f, 0x67, 0x22, 0xd8, 0xf1, 0xdb, 0x8d, - 0xfa, 0xdc, 0x64, 0xa3, 0x51, 0xce, 0x25, 0x50, 0x81, 0x68, 0xf3, 0xe3, 0xb5, 0x6f, 0xfd, 0x8f, - 0x8f, 0xf5, 0x7d, 0xeb, 0x4f, 0x1f, 0xcb, 0xfd, 0xfe, 0x9f, 0x3e, 0x96, 0xfb, 0xd7, 0x7f, 0xfa, - 0x58, 0xee, 0x93, 0xd7, 0x77, 0x93, 0x1b, 0x9c, 0x4f, 0xe4, 0x4b, 0x25, 0xbc, 0x7d, 0x7b, 0xe1, - 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x06, 0xac, 0xa6, 0xb9, 0xe4, 0xb2, 0x01, 0x00, + // 19128 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x78, 0x64, 0xc9, + 0x75, 0x18, 0x86, 0x7e, 0xa0, 0x01, 0x1c, 0xbc, 0x1a, 0x35, 0xaf, 0x3b, 0xb3, 0xb3, 0xdb, 0xbb, + 0xbd, 0xbb, 0xc3, 0x99, 0xe5, 0xee, 0xcc, 0xee, 0xec, 0x83, 0xdc, 0x07, 0xb9, 0x6c, 0x34, 0x80, + 0x41, 0xcf, 0xe0, 0xd1, 0xbc, 0x8d, 0x99, 0xd9, 0x25, 0x45, 0xb6, 0x2e, 0xfa, 0xd6, 0x00, 0x77, + 0xa7, 0x71, 0x6f, 0xf3, 0xde, 0xdb, 0x83, 0xc1, 0x3a, 0x0f, 0xd1, 0xa2, 0x25, 0xd1, 0xa6, 0x28, + 0x86, 0x8a, 0x44, 0x59, 0xb2, 0x13, 0xca, 0x8e, 0x13, 0x59, 0xa2, 0xc5, 0xc8, 0x61, 0xf4, 0xa6, + 0x2d, 0x59, 0x7e, 0x50, 0xa2, 0xa4, 0x88, 0xb2, 0xa5, 0x28, 0xb6, 0x03, 0x39, 0x4a, 0xfc, 0x07, + 0x5f, 0x92, 0x4f, 0x5f, 0xa2, 0x2f, 0xa6, 0x9d, 0x38, 0x9f, 0xbf, 0x3a, 0x55, 0xf7, 0xde, 0xba, + 0xaf, 0xc6, 0x73, 0x85, 0x01, 0x07, 0x7f, 0x66, 0xd0, 0xe7, 0x9c, 0x3a, 0x55, 0xf7, 0xd4, 0xa9, + 0xaa, 0x53, 0x55, 0xa7, 0xce, 0x81, 0x4b, 0x2e, 0x6d, 0xd3, 0x8e, 0x65, 0xbb, 0x57, 0xda, 0x74, + 0x45, 0x6b, 0x6d, 0x5c, 0x71, 0x37, 0x3a, 0xd4, 0xb9, 0x42, 0xef, 0x51, 0xd3, 0xf5, 0xfe, 0xbb, + 0xdc, 0xb1, 0x2d, 0xd7, 0x22, 0x05, 0xfe, 0xeb, 0xdc, 0xc9, 0x15, 0x6b, 0xc5, 0x42, 0xd0, 0x15, + 0xf6, 0x17, 0xc7, 0x9e, 0x3b, 0xbf, 0x62, 0x59, 0x2b, 0x6d, 0x7a, 0x05, 0x7f, 0x2d, 0x77, 0xef, + 0x5c, 0x71, 0x5c, 0xbb, 0xdb, 0x72, 0x05, 0xb6, 0x14, 0xc5, 0xba, 0xc6, 0x1a, 0x75, 0x5c, 0x6d, + 0xad, 0x23, 0x08, 0x1e, 0x8b, 0x12, 0xac, 0xdb, 0x5a, 0xa7, 0x43, 0x6d, 0x51, 0xf9, 0xb9, 0xf7, + 0xf9, 0xed, 0xd4, 0x5a, 0x2d, 0xea, 0x38, 0x6d, 0xc3, 0x71, 0xaf, 0xdc, 0x7b, 0x41, 0xfa, 0x25, + 0x08, 0x9f, 0x48, 0xfe, 0x20, 0xfc, 0x57, 0x90, 0x3c, 0x97, 0x4c, 0xe2, 0xd5, 0x18, 0xa9, 0xba, + 0xfc, 0xc5, 0x2c, 0x0c, 0xce, 0x53, 0x57, 0xd3, 0x35, 0x57, 0x23, 0xe7, 0xa1, 0xbf, 0x66, 0xea, + 0xf4, 0xbe, 0x92, 0x79, 0x3c, 0x73, 0x31, 0x37, 0x59, 0xd8, 0xda, 0x2c, 0x65, 0xa9, 0xa1, 0x72, + 0x20, 0x79, 0x14, 0xf2, 0x4b, 0x1b, 0x1d, 0xaa, 0x64, 0x1f, 0xcf, 0x5c, 0x1c, 0x9a, 0x1c, 0xda, + 0xda, 0x2c, 0xf5, 0xa3, 0xd0, 0x54, 0x04, 0x93, 0x27, 0x20, 0x5b, 0x9b, 0x52, 0x72, 0x88, 0x9c, + 0xd8, 0xda, 0x2c, 0x8d, 0x76, 0x0d, 0xfd, 0x59, 0x6b, 0xcd, 0x70, 0xe9, 0x5a, 0xc7, 0xdd, 0x50, + 0xb3, 0xb5, 0x29, 0x72, 0x01, 0xf2, 0x55, 0x4b, 0xa7, 0x4a, 0x1e, 0x89, 0xc8, 0xd6, 0x66, 0x69, + 0xac, 0x65, 0xe9, 0x54, 0xa2, 0x42, 0x3c, 0xf9, 0x08, 0xe4, 0x97, 0x8c, 0x35, 0xaa, 0xf4, 0x3f, + 0x9e, 0xb9, 0x38, 0x7c, 0xf5, 0xdc, 0x65, 0x2e, 0xbe, 0xcb, 0x9e, 0xf8, 0x2e, 0x2f, 0x79, 0xf2, + 0x9d, 0x2c, 0x7e, 0x63, 0xb3, 0xd4, 0xb7, 0xb5, 0x59, 0xca, 0x33, 0x91, 0x7f, 0xe1, 0x8f, 0x4b, + 0x19, 0x15, 0x4b, 0x92, 0x37, 0x60, 0xb8, 0xda, 0xee, 0x3a, 0x2e, 0xb5, 0x17, 0xb4, 0x35, 0xaa, + 0x14, 0xb0, 0xc2, 0x73, 0x5b, 0x9b, 0xa5, 0xd3, 0x2d, 0x0e, 0x6e, 0x9a, 0xda, 0x9a, 0x5c, 0xb1, + 0x4c, 0x5e, 0xfe, 0xc5, 0x0c, 0x8c, 0x37, 0xa8, 0xe3, 0x18, 0x96, 0xe9, 0xcb, 0xe6, 0x69, 0x18, + 0x12, 0xa0, 0xda, 0x14, 0xca, 0x67, 0x68, 0x72, 0x60, 0x6b, 0xb3, 0x94, 0x73, 0x0c, 0x5d, 0x0d, + 0x30, 0xe4, 0x79, 0x18, 0xb8, 0x6d, 0xb8, 0xab, 0xf3, 0x33, 0x15, 0x21, 0xa7, 0xd3, 0x5b, 0x9b, + 0x25, 0xb2, 0x6e, 0xb8, 0xab, 0xcd, 0xb5, 0x3b, 0x9a, 0x54, 0xa1, 0x47, 0x46, 0xe6, 0xa0, 0x58, + 0xb7, 0x8d, 0x7b, 0x9a, 0x4b, 0x6f, 0xd0, 0x8d, 0xba, 0xd5, 0x36, 0x5a, 0x1b, 0x42, 0x8a, 0x8f, + 0x6f, 0x6d, 0x96, 0xce, 0x77, 0x38, 0xae, 0x79, 0x97, 0x6e, 0x34, 0x3b, 0x88, 0x95, 0x98, 0xc4, + 0x4a, 0x96, 0x3f, 0x3b, 0x00, 0x23, 0x37, 0x1d, 0x6a, 0xfb, 0xed, 0xbe, 0x00, 0x79, 0xf6, 0x5b, + 0x34, 0x19, 0x65, 0xde, 0x75, 0xa8, 0x2d, 0xcb, 0x9c, 0xe1, 0xc9, 0x25, 0xe8, 0x9f, 0xb3, 0x56, + 0x0c, 0x53, 0x34, 0xfb, 0xc4, 0xd6, 0x66, 0x69, 0xbc, 0xcd, 0x00, 0x12, 0x25, 0xa7, 0x20, 0x1f, + 0x86, 0x91, 0xda, 0x1a, 0xd3, 0x21, 0xcb, 0xd4, 0x5c, 0xcb, 0x16, 0xad, 0x45, 0xe9, 0x1a, 0x12, + 0x5c, 0x2a, 0x18, 0xa2, 0x27, 0xaf, 0x01, 0x54, 0x6e, 0x37, 0x54, 0xab, 0x4d, 0x2b, 0xea, 0x82, + 0x50, 0x06, 0x2c, 0xad, 0xad, 0x3b, 0x4d, 0xdb, 0x6a, 0xd3, 0xa6, 0x66, 0xcb, 0xd5, 0x4a, 0xd4, + 0x64, 0x1a, 0xc6, 0x2a, 0x38, 0x2a, 0x54, 0xfa, 0xa9, 0x2e, 0x75, 0x5c, 0x47, 0xe9, 0x7f, 0x3c, + 0x77, 0x71, 0x68, 0xf2, 0xd1, 0xad, 0xcd, 0xd2, 0x59, 0x3e, 0x5e, 0x9a, 0xb6, 0x40, 0x49, 0x2c, + 0x22, 0x85, 0xc8, 0x24, 0x8c, 0x56, 0xde, 0xed, 0xda, 0xb4, 0xa6, 0x53, 0xd3, 0x35, 0xdc, 0x0d, + 0xa1, 0x21, 0xe7, 0xb7, 0x36, 0x4b, 0x8a, 0xc6, 0x10, 0x4d, 0x43, 0x60, 0x24, 0x26, 0xe1, 0x22, + 0x64, 0x11, 0x26, 0xae, 0x55, 0xeb, 0x0d, 0x6a, 0xdf, 0x33, 0x5a, 0xb4, 0xd2, 0x6a, 0x59, 0x5d, + 0xd3, 0x55, 0x06, 0x90, 0xcf, 0x13, 0x5b, 0x9b, 0xa5, 0x47, 0x57, 0x5a, 0x9d, 0xa6, 0xc3, 0xb1, + 0x4d, 0x8d, 0xa3, 0x25, 0x66, 0xf1, 0xb2, 0xe4, 0x63, 0x30, 0xba, 0x64, 0x33, 0x2d, 0xd4, 0xa7, + 0x28, 0x83, 0x2b, 0x83, 0xa8, 0xff, 0xa7, 0x2f, 0x8b, 0x99, 0x8a, 0x43, 0xbd, 0x9e, 0xe5, 0x8d, + 0x75, 0x79, 0x81, 0xa6, 0x8e, 0x38, 0xb9, 0xb1, 0x21, 0x56, 0x84, 0x82, 0xc2, 0x3e, 0xde, 0xb0, + 0xa9, 0x1e, 0xd3, 0xb6, 0x21, 0x6c, 0xf3, 0xa5, 0xad, 0xcd, 0xd2, 0xd3, 0xb6, 0xa0, 0x69, 0xf6, + 0x54, 0xbb, 0x54, 0x56, 0x64, 0x1a, 0x06, 0x99, 0x36, 0xdd, 0x30, 0x4c, 0x5d, 0x81, 0xc7, 0x33, + 0x17, 0xc7, 0xae, 0x16, 0xbd, 0xd6, 0x7b, 0xf0, 0xc9, 0x33, 0x5b, 0x9b, 0xa5, 0x13, 0x4c, 0x07, + 0x9b, 0x77, 0x0d, 0x53, 0x9e, 0x22, 0xfc, 0xa2, 0x6c, 0x14, 0x4d, 0x5a, 0x2e, 0x0e, 0xdd, 0xe1, + 0x60, 0x14, 0x2d, 0x5b, 0x6e, 0x74, 0xd8, 0x7a, 0x64, 0xa4, 0x0a, 0xa3, 0x93, 0x96, 0x5b, 0x33, + 0x1d, 0x57, 0x33, 0x5b, 0xb4, 0x36, 0xa5, 0x8c, 0x60, 0x39, 0x54, 0x0b, 0x56, 0xce, 0x10, 0x98, + 0x66, 0x68, 0x52, 0x0a, 0x97, 0x21, 0xf3, 0x00, 0xac, 0x09, 0x8b, 0xb6, 0xc1, 0x06, 0xc2, 0x28, + 0xb6, 0x9f, 0xc8, 0xed, 0xe7, 0x98, 0xc9, 0xb3, 0x5b, 0x9b, 0xa5, 0x53, 0xf8, 0x05, 0x16, 0x02, + 0x64, 0x5d, 0x0d, 0xc8, 0xca, 0xff, 0x26, 0x0f, 0x63, 0xac, 0x8b, 0xa5, 0xd1, 0x58, 0x61, 0x13, + 0x0b, 0x83, 0xb0, 0x46, 0x3b, 0x1d, 0xad, 0x45, 0xc5, 0xc0, 0x44, 0xa1, 0x98, 0x1e, 0x50, 0x62, + 0x18, 0xa5, 0x27, 0x97, 0x60, 0x90, 0x83, 0x6a, 0x53, 0x62, 0xac, 0x8e, 0x6e, 0x6d, 0x96, 0x86, + 0x1c, 0x84, 0x35, 0x0d, 0x5d, 0xf5, 0xd1, 0x6c, 0xb0, 0xf0, 0xbf, 0x67, 0x2d, 0xc7, 0x65, 0xcc, + 0xc5, 0x50, 0x45, 0xa9, 0x88, 0x02, 0xab, 0x02, 0x25, 0x0f, 0x96, 0x70, 0x21, 0xf2, 0x2a, 0x00, + 0x87, 0x54, 0x74, 0xdd, 0x16, 0xe3, 0x15, 0x45, 0x20, 0x58, 0x68, 0xba, 0x2e, 0x0f, 0x76, 0x89, + 0x98, 0xac, 0xc1, 0x08, 0xff, 0x35, 0xa7, 0x2d, 0xd3, 0x36, 0x1f, 0xac, 0xc3, 0x57, 0x2f, 0x7a, + 0x32, 0x0d, 0x4b, 0xe7, 0xb2, 0x4c, 0x3a, 0x6d, 0xba, 0xf6, 0xc6, 0x64, 0x49, 0xcc, 0xef, 0x67, + 0x44, 0x55, 0x6d, 0xc4, 0xc9, 0x33, 0x8b, 0x5c, 0x86, 0x4d, 0xfb, 0x33, 0x96, 0xbd, 0xae, 0xd9, + 0x3a, 0xd5, 0x27, 0x37, 0xe4, 0x69, 0xff, 0x8e, 0x07, 0x6e, 0x2e, 0xcb, 0x9a, 0x2c, 0x93, 0x33, + 0x1d, 0xe2, 0xdc, 0x1a, 0xdd, 0x65, 0xd4, 0xe0, 0x81, 0x98, 0xb4, 0x9c, 0xee, 0x72, 0x54, 0x6b, + 0xc3, 0x65, 0xd8, 0xcc, 0xc2, 0x01, 0xb7, 0xa8, 0xcd, 0xd6, 0x04, 0x1c, 0xc4, 0x62, 0x66, 0x11, + 0x4c, 0xee, 0x71, 0x4c, 0x9c, 0x87, 0x28, 0x72, 0xee, 0x4d, 0x98, 0x88, 0x89, 0x82, 0x14, 0x21, + 0x77, 0x97, 0x6e, 0x70, 0x75, 0x51, 0xd9, 0x9f, 0xe4, 0x24, 0xf4, 0xdf, 0xd3, 0xda, 0x5d, 0xb1, + 0x22, 0xab, 0xfc, 0xc7, 0x6b, 0xd9, 0x0f, 0x66, 0xd8, 0x02, 0x46, 0xaa, 0x96, 0x69, 0xd2, 0x96, + 0x2b, 0xaf, 0x61, 0xaf, 0xc0, 0xd0, 0x9c, 0xd5, 0xd2, 0xda, 0xd8, 0x8f, 0x5c, 0xef, 0x94, 0xad, + 0xcd, 0xd2, 0x49, 0xd6, 0x81, 0x97, 0xdb, 0x0c, 0x23, 0xb5, 0x29, 0x20, 0x65, 0x0a, 0xa0, 0xd2, + 0x35, 0xcb, 0xa5, 0x58, 0x30, 0x1b, 0x28, 0x00, 0x16, 0xb4, 0x11, 0x25, 0x2b, 0x40, 0x40, 0x4c, + 0xae, 0xc0, 0x60, 0x9d, 0x2d, 0xdb, 0x2d, 0xab, 0x2d, 0x94, 0x0f, 0x57, 0x16, 0x5c, 0xca, 0xe5, + 0xa1, 0xef, 0x11, 0x95, 0x67, 0x61, 0xac, 0xda, 0x36, 0xa8, 0xe9, 0xca, 0xad, 0x66, 0x83, 0xaa, + 0xb2, 0x42, 0x4d, 0x57, 0x6e, 0x35, 0x0e, 0x40, 0x8d, 0x41, 0xe5, 0x56, 0xfb, 0xa4, 0xe5, 0xdf, + 0xcd, 0xc1, 0xd9, 0x1b, 0xdd, 0x65, 0x6a, 0x9b, 0xd4, 0xa5, 0x8e, 0x58, 0xdf, 0x7d, 0xae, 0x0b, + 0x30, 0x11, 0x43, 0x0a, 0xee, 0xb8, 0xee, 0xde, 0xf5, 0x91, 0x4d, 0x61, 0x32, 0xc8, 0x93, 0x77, + 0xac, 0x28, 0x99, 0x85, 0xf1, 0x00, 0xc8, 0x1a, 0xe1, 0x28, 0x59, 0x5c, 0x99, 0x1e, 0xdb, 0xda, + 0x2c, 0x9d, 0x93, 0xb8, 0xb1, 0x66, 0xcb, 0x1a, 0x1c, 0x2d, 0x46, 0x6e, 0x40, 0x31, 0x00, 0x5d, + 0xb3, 0xad, 0x6e, 0xc7, 0x51, 0x72, 0xc8, 0xaa, 0xb4, 0xb5, 0x59, 0x7a, 0x44, 0x62, 0xb5, 0x82, + 0x48, 0xd9, 0x1e, 0x88, 0x16, 0x24, 0x9f, 0xc9, 0xc8, 0xdc, 0xc4, 0x28, 0xcc, 0xe3, 0x28, 0xfc, + 0x80, 0x37, 0x0a, 0x53, 0x85, 0x74, 0x39, 0x5a, 0x52, 0x0c, 0xca, 0x48, 0x33, 0x62, 0x83, 0x32, + 0x56, 0xe3, 0xb9, 0x2a, 0x9c, 0x4a, 0xe4, 0xb5, 0x2b, 0xad, 0xfe, 0xd7, 0x39, 0x99, 0x4b, 0xdd, + 0xd2, 0xfd, 0xce, 0x5c, 0x94, 0x3b, 0xb3, 0x6e, 0xe9, 0xb8, 0x72, 0x64, 0x82, 0xa5, 0x58, 0x6a, + 0x6c, 0xc7, 0xd2, 0xa3, 0x8b, 0x48, 0xbc, 0x2c, 0xf9, 0x24, 0x9c, 0x8e, 0x01, 0xf9, 0x74, 0xcd, + 0xb5, 0xff, 0xc2, 0xd6, 0x66, 0xa9, 0x9c, 0xc0, 0x35, 0x3a, 0x7b, 0xa7, 0x70, 0x21, 0x1a, 0x9c, + 0x91, 0xa4, 0x6e, 0x99, 0xae, 0x66, 0x98, 0xc2, 0x56, 0xe5, 0xa3, 0xe4, 0x7d, 0x5b, 0x9b, 0xa5, + 0x27, 0x65, 0x1d, 0xf4, 0x68, 0xa2, 0x8d, 0x4f, 0xe3, 0x43, 0x74, 0x50, 0x12, 0x50, 0xb5, 0x35, + 0x6d, 0xc5, 0x33, 0xc0, 0x2f, 0x6e, 0x6d, 0x96, 0x9e, 0x4a, 0xac, 0xc3, 0x60, 0x54, 0xf2, 0x82, + 0x9f, 0xc6, 0x89, 0xa8, 0x40, 0x02, 0xdc, 0x82, 0xa5, 0x53, 0xfc, 0x86, 0x7e, 0xe4, 0x5f, 0xde, + 0xda, 0x2c, 0x3d, 0x26, 0xf1, 0x37, 0x2d, 0x9d, 0x46, 0x9b, 0x9f, 0x50, 0xba, 0xfc, 0x8b, 0x39, + 0x78, 0xac, 0x51, 0x99, 0x9f, 0xab, 0xe9, 0x9e, 0x85, 0x54, 0xb7, 0xad, 0x7b, 0x86, 0x2e, 0x8d, + 0xde, 0x65, 0x38, 0x13, 0x41, 0x4d, 0xa3, 0x51, 0xe6, 0xdb, 0xe6, 0xf8, 0x6d, 0x9e, 0xf5, 0xd5, + 0x11, 0x34, 0x4d, 0x6e, 0xb9, 0x85, 0x6d, 0x80, 0x34, 0x46, 0xac, 0x8f, 0x22, 0xa8, 0xc6, 0xaa, + 0x65, 0xbb, 0xad, 0xae, 0x2b, 0x94, 0x00, 0xfb, 0x28, 0x56, 0x87, 0x23, 0x88, 0x7a, 0x54, 0xe1, + 0xf1, 0x21, 0x9f, 0xcd, 0x40, 0xb1, 0xe2, 0xba, 0xb6, 0xb1, 0xdc, 0x75, 0xe9, 0xbc, 0xd6, 0xe9, + 0x18, 0xe6, 0x0a, 0x8e, 0xf5, 0xe1, 0xab, 0x6f, 0xf8, 0x6b, 0x64, 0x4f, 0x49, 0x5c, 0x8e, 0x16, + 0x97, 0x86, 0xa8, 0xe6, 0xa1, 0x9a, 0x6b, 0x1c, 0x27, 0x0f, 0xd1, 0x68, 0x39, 0x36, 0x44, 0x13, + 0x79, 0xed, 0x6a, 0x88, 0x7e, 0x31, 0x07, 0xe7, 0x17, 0xef, 0xba, 0x9a, 0x4a, 0x1d, 0xab, 0x6b, + 0xb7, 0xa8, 0x73, 0xb3, 0xa3, 0x6b, 0x2e, 0x0d, 0x46, 0x6a, 0x09, 0xfa, 0x2b, 0xba, 0x4e, 0x75, + 0x64, 0xd7, 0xcf, 0x77, 0x91, 0x1a, 0x03, 0xa8, 0x1c, 0x4e, 0x9e, 0x86, 0x01, 0x51, 0x06, 0xb9, + 0xf7, 0x4f, 0x0e, 0x6f, 0x6d, 0x96, 0x06, 0xba, 0x1c, 0xa4, 0x7a, 0x38, 0x46, 0x36, 0x45, 0xdb, + 0x94, 0x91, 0xe5, 0x02, 0x32, 0x9d, 0x83, 0x54, 0x0f, 0x47, 0x3e, 0x0a, 0x63, 0xc8, 0xd6, 0x6f, + 0x8f, 0x98, 0xfb, 0x4e, 0x7a, 0xd2, 0x95, 0x1b, 0xcb, 0x97, 0x26, 0x6c, 0x4d, 0xd3, 0xf6, 0x0a, + 0xa8, 0x11, 0x06, 0xe4, 0x36, 0x14, 0x45, 0x23, 0x02, 0xa6, 0xfd, 0x3d, 0x98, 0x9e, 0xda, 0xda, + 0x2c, 0x4d, 0x88, 0xf6, 0x4b, 0x6c, 0x63, 0x4c, 0x18, 0x63, 0xd1, 0xec, 0x80, 0x71, 0x61, 0x3b, + 0xc6, 0xe2, 0x8b, 0x65, 0xc6, 0x51, 0x26, 0xe5, 0xb7, 0x61, 0x44, 0x2e, 0x48, 0x4e, 0xe3, 0x4e, + 0x9d, 0x8f, 0x13, 0xdc, 0xe3, 0x1b, 0x3a, 0x6e, 0xcf, 0x5f, 0x80, 0xe1, 0x29, 0xea, 0xb4, 0x6c, + 0xa3, 0xc3, 0xac, 0x06, 0xa1, 0xe4, 0xe3, 0x5b, 0x9b, 0xa5, 0x61, 0x3d, 0x00, 0xab, 0x32, 0x4d, + 0xf9, 0xff, 0xc9, 0xc0, 0x69, 0xc6, 0xbb, 0xe2, 0x38, 0xc6, 0x8a, 0xb9, 0x26, 0x2f, 0xdb, 0xcf, + 0x42, 0xa1, 0x81, 0xf5, 0x89, 0x9a, 0x4e, 0x6e, 0x6d, 0x96, 0x8a, 0xbc, 0x05, 0x92, 0x1e, 0x0a, + 0x1a, 0x7f, 0x9b, 0x9a, 0xdd, 0x66, 0x9b, 0xca, 0x4c, 0x5a, 0x57, 0xb3, 0x5d, 0xc3, 0x5c, 0x69, + 0xb8, 0x9a, 0xdb, 0x75, 0x42, 0x26, 0xad, 0xc0, 0x34, 0x1d, 0x44, 0x85, 0x4c, 0xda, 0x50, 0x21, + 0xf2, 0x26, 0x8c, 0x4c, 0x9b, 0x7a, 0xc0, 0x84, 0x4f, 0x88, 0x8f, 0x30, 0x4b, 0x93, 0x22, 0x3c, + 0xce, 0x22, 0x54, 0xa0, 0xfc, 0xed, 0x0c, 0x28, 0x7c, 0x4f, 0x39, 0x67, 0x38, 0xee, 0x3c, 0x5d, + 0x5b, 0x96, 0x66, 0xa7, 0x19, 0x6f, 0x93, 0xca, 0x70, 0xd2, 0x5a, 0x84, 0xa6, 0x80, 0xd8, 0xa4, + 0xb6, 0x0d, 0x27, 0xb6, 0x9b, 0x89, 0x94, 0x22, 0x35, 0x18, 0xe0, 0x9c, 0xb9, 0x2d, 0x31, 0x7c, + 0x55, 0xf1, 0x14, 0x21, 0x5a, 0x35, 0x57, 0x86, 0x35, 0x4e, 0x2c, 0xef, 0x8f, 0x44, 0x79, 0x52, + 0x83, 0xf1, 0xa0, 0xcc, 0x92, 0xe1, 0xb6, 0xbd, 0x45, 0x80, 0xcf, 0x14, 0x52, 0x9b, 0x5c, 0x86, + 0x94, 0xed, 0x93, 0x48, 0xb9, 0xf2, 0x97, 0x73, 0x50, 0x8c, 0xd6, 0x4f, 0x6e, 0xc3, 0xe0, 0x75, + 0xcb, 0x30, 0xa9, 0xbe, 0x68, 0xe2, 0xc7, 0xf6, 0x3e, 0xb6, 0xf1, 0xcc, 0xfa, 0x13, 0xef, 0x60, + 0x99, 0xa6, 0x6c, 0x0c, 0xe3, 0x29, 0x8e, 0xcf, 0x8c, 0x7c, 0x0c, 0x86, 0x98, 0x39, 0x79, 0x0f, + 0x39, 0x67, 0xb7, 0xe5, 0xfc, 0xb8, 0xe0, 0x7c, 0xd2, 0xe6, 0x85, 0xe2, 0xac, 0x03, 0x76, 0x4c, + 0x45, 0x55, 0xaa, 0x39, 0x96, 0x29, 0x94, 0x08, 0x55, 0xd4, 0x46, 0x88, 0xac, 0xa2, 0x9c, 0x86, + 0x59, 0xc1, 0xfc, 0x63, 0xb1, 0x47, 0xa5, 0x6d, 0x10, 0x17, 0x7b, 0xb4, 0x33, 0x25, 0x62, 0x62, + 0xc2, 0xb8, 0xe8, 0x9b, 0x55, 0xa3, 0x83, 0x1b, 0x08, 0x5c, 0x22, 0xc7, 0xae, 0x5e, 0xb8, 0xec, + 0x1d, 0xd7, 0x5d, 0x96, 0x0e, 0xfb, 0xee, 0xbd, 0x70, 0x79, 0xde, 0x27, 0xc7, 0x3d, 0x33, 0xaa, + 0x77, 0x84, 0x85, 0xac, 0x38, 0x6b, 0x21, 0xf2, 0xf2, 0xf7, 0x65, 0xe1, 0xb9, 0xa0, 0x8b, 0x54, + 0x7a, 0xcf, 0xa0, 0xeb, 0x01, 0x47, 0xb1, 0x7b, 0x67, 0xa3, 0xd5, 0xa9, 0xae, 0x6a, 0xe6, 0x0a, + 0xd5, 0xc9, 0x25, 0xe8, 0x57, 0xad, 0x36, 0x75, 0x94, 0x0c, 0x5a, 0x9a, 0x38, 0x13, 0xda, 0x0c, + 0x20, 0x1f, 0xff, 0x20, 0x05, 0xb1, 0xa0, 0xb0, 0x64, 0x6b, 0x86, 0xeb, 0x29, 0x65, 0x25, 0xae, + 0x94, 0x3b, 0xa8, 0xf1, 0x32, 0xe7, 0xc1, 0x97, 0x2b, 0x14, 0xbc, 0x8b, 0x00, 0x59, 0xf0, 0x9c, + 0xe4, 0xdc, 0xab, 0x30, 0x2c, 0x11, 0xef, 0x6a, 0x3d, 0xfa, 0x4c, 0xbf, 0x3c, 0x4c, 0xbd, 0x66, + 0x89, 0x61, 0x7a, 0x85, 0x0d, 0x2f, 0xc7, 0x61, 0x06, 0x11, 0x1f, 0x9f, 0x62, 0x10, 0x21, 0x28, + 0x3c, 0x88, 0x10, 0x44, 0x5e, 0x84, 0x41, 0xce, 0xc2, 0xdf, 0x7a, 0xe3, 0xb6, 0xdd, 0x46, 0x58, + 0xd8, 0xaa, 0xf0, 0x09, 0xc9, 0x4f, 0x67, 0xe0, 0xd1, 0x9e, 0x92, 0x40, 0xe5, 0x1b, 0xbe, 0xfa, + 0xf2, 0x9e, 0xc4, 0x38, 0xf9, 0xdc, 0xd6, 0x66, 0xe9, 0x92, 0xa4, 0x19, 0xb6, 0x44, 0xd3, 0x6c, + 0x71, 0x22, 0xa9, 0x5d, 0xbd, 0x9b, 0xc2, 0xec, 0x5e, 0x5e, 0xe9, 0x0c, 0x1e, 0xa2, 0x99, 0xad, + 0x0d, 0xaf, 0x91, 0xf9, 0xc0, 0xee, 0x15, 0xdf, 0x7b, 0xc7, 0x23, 0x49, 0xa8, 0x26, 0x85, 0x0b, + 0x69, 0xc1, 0x19, 0x8e, 0x99, 0xd2, 0x36, 0x16, 0xef, 0xcc, 0x5b, 0xa6, 0xbb, 0xea, 0x55, 0xd0, + 0x2f, 0x9f, 0x42, 0x61, 0x05, 0xba, 0xb6, 0xd1, 0xb4, 0xee, 0x34, 0xd7, 0x18, 0x55, 0x42, 0x1d, + 0x69, 0x9c, 0xd8, 0x1a, 0x21, 0xc6, 0xb8, 0x37, 0x7b, 0x16, 0x82, 0x33, 0x42, 0x6f, 0x5e, 0x88, + 0xcf, 0x95, 0x91, 0x42, 0x49, 0x53, 0xe6, 0xc0, 0x1e, 0xa7, 0xcc, 0x1a, 0x8c, 0xcc, 0x59, 0xad, + 0xbb, 0xbe, 0xe6, 0xbd, 0x0a, 0x85, 0x25, 0xcd, 0x5e, 0xa1, 0x2e, 0x8a, 0x75, 0xf8, 0xea, 0xc4, + 0x65, 0x7e, 0x84, 0xcf, 0x88, 0x38, 0x62, 0x72, 0x4c, 0x4c, 0x64, 0x05, 0x17, 0x7f, 0xab, 0xa2, + 0x40, 0xf9, 0xef, 0x15, 0x60, 0x44, 0x1c, 0x37, 0xe3, 0x9a, 0x46, 0x5e, 0x0b, 0x0e, 0xf0, 0xc5, + 0xcc, 0xeb, 0x1f, 0xb9, 0xf9, 0x47, 0x85, 0x23, 0x8c, 0xd9, 0xef, 0x6d, 0x96, 0x32, 0x5b, 0x9b, + 0xa5, 0x3e, 0x75, 0x50, 0xda, 0x5a, 0x07, 0xab, 0xae, 0x64, 0x66, 0xc8, 0x07, 0xc8, 0x91, 0xb2, + 0x7c, 0x15, 0x7e, 0x13, 0x06, 0x44, 0x1b, 0x84, 0xf2, 0x9e, 0x09, 0x4e, 0x74, 0x42, 0xc7, 0xe6, + 0x91, 0xd2, 0x5e, 0x29, 0xf2, 0x06, 0x14, 0xf8, 0x09, 0x87, 0x10, 0xc0, 0xe9, 0xe4, 0x13, 0xa1, + 0x48, 0x71, 0x51, 0x86, 0xcc, 0x02, 0x04, 0xa7, 0x1b, 0xfe, 0x2d, 0x81, 0xe0, 0x10, 0x3f, 0xf7, + 0x88, 0x70, 0x91, 0xca, 0x92, 0x57, 0x60, 0x64, 0x89, 0xda, 0x6b, 0x86, 0xa9, 0xb5, 0x1b, 0xc6, + 0xbb, 0xde, 0x45, 0x01, 0x9a, 0x1f, 0x8e, 0xf1, 0xae, 0xdc, 0xa7, 0x21, 0x3a, 0xf2, 0x89, 0xa4, + 0xd3, 0x83, 0x01, 0x6c, 0xc8, 0x13, 0xdb, 0x6e, 0xab, 0x23, 0xed, 0x49, 0x38, 0x4c, 0xf8, 0x28, + 0x8c, 0x86, 0x36, 0x8e, 0xe2, 0x24, 0xf8, 0xd1, 0x38, 0x6b, 0x69, 0x17, 0x1c, 0x61, 0x1b, 0xe6, + 0xc0, 0x06, 0x45, 0xcd, 0x34, 0x5c, 0x43, 0x6b, 0x57, 0xad, 0xb5, 0x35, 0xcd, 0xd4, 0x95, 0xa1, + 0x60, 0x50, 0x18, 0x1c, 0xd3, 0x6c, 0x71, 0x94, 0x3c, 0x28, 0xc2, 0x85, 0xc8, 0x0d, 0x28, 0x8a, + 0x3e, 0x54, 0x69, 0xcb, 0xb2, 0x99, 0x45, 0x84, 0x07, 0xbd, 0x62, 0x54, 0x38, 0x1c, 0xd7, 0xb4, + 0x3d, 0xa4, 0xbc, 0xe5, 0x88, 0x16, 0x64, 0x13, 0x70, 0xcd, 0xbc, 0x67, 0x30, 0x23, 0x7e, 0x04, + 0x1b, 0x83, 0x13, 0xb0, 0xc1, 0x41, 0xf2, 0x04, 0x2c, 0xa8, 0xa4, 0x05, 0x7b, 0x74, 0xfb, 0x05, + 0xfb, 0x7a, 0x7e, 0x70, 0xb8, 0x38, 0x12, 0x3d, 0xfa, 0x2f, 0xff, 0xed, 0x1c, 0x0c, 0x8b, 0x96, + 0x30, 0x23, 0xe3, 0x78, 0xfc, 0xec, 0x67, 0xfc, 0x24, 0x8e, 0x83, 0xc2, 0x41, 0x8d, 0x83, 0xf2, + 0xe7, 0xb2, 0xfe, 0x64, 0x57, 0xb7, 0x0d, 0x73, 0x7f, 0x93, 0xdd, 0x05, 0x80, 0xea, 0x6a, 0xd7, + 0xbc, 0xcb, 0xaf, 0x38, 0xb3, 0xc1, 0x15, 0x67, 0xcb, 0x50, 0x25, 0x0c, 0x79, 0x14, 0xf2, 0x53, + 0x8c, 0x3f, 0xeb, 0x99, 0x91, 0xc9, 0xa1, 0x6f, 0x70, 0x4e, 0x99, 0xe7, 0x54, 0x04, 0xb3, 0x1d, + 0xec, 0xe4, 0x86, 0x4b, 0xf9, 0x9e, 0x21, 0xc7, 0x77, 0xb0, 0xcb, 0x0c, 0xa0, 0x72, 0x38, 0x79, + 0x09, 0x26, 0xa6, 0x68, 0x5b, 0xdb, 0x98, 0x37, 0xda, 0x6d, 0xc3, 0xa1, 0x2d, 0xcb, 0xd4, 0x1d, + 0x14, 0xb2, 0xa8, 0x6e, 0xcd, 0x51, 0xe3, 0x04, 0xa4, 0x0c, 0x85, 0xc5, 0x3b, 0x77, 0x1c, 0xea, + 0xa2, 0xf8, 0x72, 0x93, 0xc0, 0xe6, 0x7e, 0x0b, 0x21, 0xaa, 0xc0, 0x94, 0xbf, 0x9a, 0x61, 0x5b, + 0x44, 0xe7, 0xae, 0x6b, 0x75, 0x82, 0x41, 0xb4, 0x1f, 0x91, 0x5c, 0x0a, 0x2c, 0xa0, 0x2c, 0x7e, + 0xed, 0xb8, 0xf8, 0xda, 0x01, 0x61, 0x05, 0x05, 0xb6, 0x4f, 0xe2, 0x57, 0xe5, 0xb6, 0xf9, 0xaa, + 0xf2, 0x9f, 0x66, 0xe1, 0x8c, 0x68, 0x71, 0xb5, 0x6d, 0x74, 0x96, 0x2d, 0xcd, 0xd6, 0x55, 0xda, + 0xa2, 0xc6, 0x3d, 0x7a, 0x34, 0x07, 0x5e, 0x78, 0xe8, 0xe4, 0xf7, 0x31, 0x74, 0xae, 0xe2, 0x6e, + 0x9b, 0x49, 0x06, 0x4f, 0xd5, 0xb9, 0xf9, 0x53, 0xdc, 0xda, 0x2c, 0x8d, 0xe8, 0x1c, 0x8c, 0xf7, + 0x2a, 0xaa, 0x4c, 0xc4, 0x94, 0x64, 0x8e, 0x9a, 0x2b, 0xee, 0x2a, 0x2a, 0x49, 0x3f, 0x57, 0x92, + 0x36, 0x42, 0x54, 0x81, 0x29, 0xff, 0x1f, 0x59, 0x38, 0x19, 0x15, 0x79, 0x83, 0x9a, 0xfa, 0xb1, + 0xbc, 0xdf, 0x1b, 0x79, 0xff, 0x59, 0x0e, 0x1e, 0x11, 0x65, 0x1a, 0xab, 0x9a, 0x4d, 0xf5, 0x29, + 0xc3, 0xa6, 0x2d, 0xd7, 0xb2, 0x37, 0x8e, 0xb0, 0x7d, 0x76, 0x70, 0x62, 0x7f, 0x09, 0x0a, 0xe2, + 0x8c, 0x85, 0xaf, 0x33, 0x63, 0x7e, 0x4b, 0x10, 0x1a, 0x5b, 0xa1, 0xf8, 0xf9, 0x4c, 0xa4, 0xb3, + 0x0a, 0x3b, 0xe9, 0xac, 0x0f, 0xc2, 0xa8, 0x2f, 0x7a, 0xdc, 0xa2, 0x0f, 0x04, 0xc6, 0x9c, 0xee, + 0x21, 0x70, 0x97, 0xae, 0x86, 0x09, 0xb1, 0x36, 0x0f, 0x50, 0x9b, 0x42, 0x63, 0x6b, 0x54, 0xd4, + 0xe6, 0x97, 0x33, 0x74, 0x55, 0x26, 0x2a, 0x6f, 0xe6, 0xe1, 0x5c, 0x72, 0xb7, 0xab, 0x54, 0xd3, + 0x8f, 0x7b, 0xfd, 0x3b, 0xb2, 0xd7, 0xc9, 0x13, 0x90, 0xaf, 0x6b, 0xee, 0xaa, 0x70, 0x99, 0xc0, + 0x8b, 0xf7, 0x3b, 0x46, 0x9b, 0x36, 0x3b, 0x9a, 0xbb, 0xaa, 0x22, 0x4a, 0x9a, 0x33, 0x00, 0x39, + 0x26, 0xcc, 0x19, 0xd2, 0x62, 0x3f, 0xfc, 0x78, 0xe6, 0x62, 0x3e, 0x71, 0xb1, 0xff, 0xe3, 0x7c, + 0xda, 0xbc, 0x72, 0xdb, 0x36, 0x5c, 0x7a, 0xac, 0x61, 0xc7, 0x1a, 0xb6, 0x4f, 0x0d, 0xfb, 0xfd, + 0x2c, 0x8c, 0xfa, 0x7b, 0xb2, 0x77, 0x68, 0xeb, 0x70, 0xd6, 0xaa, 0x60, 0x2b, 0x93, 0xdb, 0xf7, + 0x56, 0x66, 0x3f, 0x0a, 0x55, 0xf6, 0xf7, 0x96, 0xdc, 0x34, 0x40, 0x89, 0xf1, 0xbd, 0xa5, 0x7f, + 0x04, 0xfc, 0x04, 0x0c, 0xcc, 0x6b, 0xf7, 0x8d, 0xb5, 0xee, 0x9a, 0xb0, 0xd2, 0xd1, 0x05, 0x70, + 0x4d, 0xbb, 0xaf, 0x7a, 0xf0, 0xf2, 0x3f, 0xcb, 0xc0, 0x98, 0x10, 0xaa, 0x60, 0xbe, 0x2f, 0xa9, + 0x06, 0xd2, 0xc9, 0xee, 0x5b, 0x3a, 0xb9, 0xbd, 0x4b, 0xa7, 0xfc, 0xd7, 0x72, 0xa0, 0xcc, 0x18, + 0x6d, 0xba, 0x64, 0x6b, 0xa6, 0x73, 0x87, 0xda, 0x62, 0x3b, 0x3d, 0xcd, 0x58, 0xed, 0xeb, 0x03, + 0xa5, 0x29, 0x25, 0xbb, 0xa7, 0x29, 0xe5, 0xfd, 0x30, 0x24, 0x1a, 0xe3, 0xbb, 0x9f, 0xe2, 0xa8, + 0xb1, 0x3d, 0xa0, 0x1a, 0xe0, 0x19, 0x71, 0xa5, 0xd3, 0xb1, 0xad, 0x7b, 0xd4, 0xe6, 0x57, 0x81, + 0x82, 0x58, 0xf3, 0x80, 0x6a, 0x80, 0x97, 0x38, 0x53, 0xcf, 0x5e, 0x94, 0x39, 0x53, 0x5b, 0x0d, + 0xf0, 0xe4, 0x22, 0x0c, 0xce, 0x59, 0x2d, 0x0d, 0x05, 0xcd, 0xa7, 0x95, 0x91, 0xad, 0xcd, 0xd2, + 0x60, 0x5b, 0xc0, 0x54, 0x1f, 0xcb, 0x28, 0xa7, 0xac, 0x75, 0xb3, 0x6d, 0x69, 0xdc, 0xc3, 0x68, + 0x90, 0x53, 0xea, 0x02, 0xa6, 0xfa, 0x58, 0x46, 0xc9, 0x64, 0x8e, 0x9e, 0x5b, 0x83, 0x01, 0xcf, + 0x3b, 0x02, 0xa6, 0xfa, 0xd8, 0xf2, 0x57, 0xf3, 0x4c, 0x7b, 0x1d, 0xe3, 0xdd, 0x87, 0x7e, 0x5d, + 0x08, 0x06, 0x4c, 0xff, 0x1e, 0x06, 0xcc, 0x43, 0x73, 0x1e, 0x58, 0xfe, 0x37, 0x03, 0x00, 0x42, + 0xfa, 0xd3, 0xc7, 0x9b, 0xc3, 0xfd, 0x69, 0xcd, 0x14, 0x4c, 0x4c, 0x9b, 0xab, 0x9a, 0xd9, 0xa2, + 0x7a, 0x70, 0x2a, 0x5a, 0xc0, 0xa1, 0x8d, 0x8e, 0xab, 0x54, 0x20, 0x83, 0x63, 0x51, 0x35, 0x5e, + 0x80, 0xbc, 0x00, 0xc3, 0x35, 0xd3, 0xa5, 0xb6, 0xd6, 0x72, 0x8d, 0x7b, 0x54, 0x4c, 0x0d, 0x78, + 0xfd, 0x6e, 0x04, 0x60, 0x55, 0xa6, 0x21, 0x2f, 0xc1, 0x48, 0x5d, 0xb3, 0x5d, 0xa3, 0x65, 0x74, + 0x34, 0xd3, 0x75, 0x94, 0x41, 0x9c, 0xd1, 0xd0, 0xc2, 0xe8, 0x48, 0x70, 0x35, 0x44, 0x45, 0x3e, + 0x01, 0x43, 0xb8, 0x35, 0x45, 0x1f, 0xfb, 0xa1, 0x6d, 0xaf, 0x54, 0x9f, 0x0c, 0x7c, 0x30, 0xf9, + 0xe1, 0x2e, 0x5e, 0xb3, 0x47, 0x6f, 0x55, 0x7d, 0x8e, 0xe4, 0x2d, 0x18, 0x98, 0x36, 0x75, 0x64, + 0x0e, 0xdb, 0x32, 0x2f, 0x0b, 0xe6, 0xa7, 0x03, 0xe6, 0x56, 0x27, 0xc2, 0xdb, 0x63, 0x97, 0x3c, + 0xca, 0x86, 0xdf, 0xbb, 0x51, 0x36, 0xf2, 0x1e, 0x9c, 0xba, 0x8f, 0x1e, 0xd4, 0xa9, 0xfb, 0xd8, + 0x1e, 0x4f, 0xdd, 0xcb, 0xef, 0xc2, 0xf0, 0x64, 0x7d, 0xc6, 0x1f, 0xbd, 0x67, 0x21, 0x57, 0x17, + 0xee, 0x20, 0x79, 0x6e, 0xcf, 0x74, 0x0c, 0x5d, 0x65, 0x30, 0x72, 0x09, 0x06, 0xab, 0xe8, 0x63, + 0x28, 0xee, 0x3b, 0xf3, 0x7c, 0xfd, 0x6b, 0x21, 0x0c, 0x5d, 0x8d, 0x3d, 0x34, 0x79, 0x1a, 0x06, + 0xea, 0xb6, 0xb5, 0x62, 0x6b, 0x6b, 0x62, 0x0d, 0x46, 0x7f, 0x9c, 0x0e, 0x07, 0xa9, 0x1e, 0xae, + 0xfc, 0xc3, 0x19, 0xcf, 0x6c, 0x67, 0x25, 0x1a, 0x5d, 0x3c, 0x9a, 0xc7, 0xba, 0x07, 0x79, 0x09, + 0x87, 0x83, 0x54, 0x0f, 0x47, 0x2e, 0x41, 0xff, 0xb4, 0x6d, 0x5b, 0xb6, 0xfc, 0x2e, 0x81, 0x32, + 0x80, 0x7c, 0x31, 0x8d, 0x14, 0xe4, 0x03, 0x30, 0xcc, 0xe7, 0x1c, 0x7e, 0xa2, 0x99, 0xeb, 0x75, + 0xa7, 0x2b, 0x53, 0x96, 0x7f, 0x23, 0x27, 0xd9, 0x6c, 0x5c, 0xe2, 0x0f, 0xe1, 0xad, 0xc0, 0x8b, + 0x90, 0x9b, 0xac, 0xcf, 0x88, 0x09, 0xf0, 0x84, 0x57, 0x54, 0x52, 0x95, 0x48, 0x39, 0x46, 0x4d, + 0xce, 0x43, 0xbe, 0xce, 0xd4, 0xa7, 0x80, 0xea, 0x31, 0xb8, 0xb5, 0x59, 0xca, 0x77, 0x98, 0xfe, + 0x20, 0x14, 0xb1, 0x6c, 0x33, 0xc3, 0x77, 0x4c, 0x1c, 0x1b, 0xec, 0x63, 0xce, 0x43, 0xbe, 0x62, + 0xaf, 0xdc, 0x13, 0xb3, 0x16, 0x62, 0x35, 0x7b, 0xe5, 0x9e, 0x8a, 0x50, 0x72, 0x05, 0x40, 0xa5, + 0x6e, 0xd7, 0x36, 0xf1, 0xc9, 0xd0, 0x10, 0x9e, 0xbf, 0xe1, 0x6c, 0x68, 0x23, 0xb4, 0xd9, 0xb2, + 0x74, 0xaa, 0x4a, 0x24, 0xe5, 0xbf, 0x15, 0x5c, 0xec, 0x4c, 0x19, 0xce, 0xdd, 0xe3, 0x2e, 0xdc, + 0x45, 0x17, 0x6a, 0xe2, 0x88, 0x33, 0xde, 0x49, 0x25, 0xe8, 0x9f, 0x69, 0x6b, 0x2b, 0x0e, 0xf6, + 0xa1, 0x70, 0xd8, 0xbb, 0xc3, 0x00, 0x2a, 0x87, 0x47, 0xfa, 0x69, 0x70, 0xfb, 0x7e, 0xfa, 0x52, + 0xbf, 0x3f, 0xda, 0x16, 0xa8, 0xbb, 0x6e, 0xd9, 0xc7, 0x5d, 0xb5, 0xd3, 0xae, 0xba, 0x00, 0x03, + 0x0d, 0xbb, 0x25, 0x1d, 0x5d, 0xe0, 0x7e, 0xc0, 0xb1, 0x5b, 0xfc, 0xd8, 0xc2, 0x43, 0x32, 0xba, + 0x29, 0xc7, 0x45, 0xba, 0x81, 0x80, 0x4e, 0x77, 0x5c, 0x41, 0x27, 0x90, 0x82, 0xae, 0x6e, 0xd9, + 0xae, 0xe8, 0x38, 0x9f, 0xae, 0x63, 0xd9, 0xae, 0xea, 0x21, 0xc9, 0xfb, 0x01, 0x96, 0xaa, 0x75, + 0xef, 0x45, 0xc3, 0x50, 0xe0, 0x70, 0x29, 0x9e, 0x32, 0xa8, 0x12, 0x9a, 0x2c, 0xc1, 0xd0, 0x62, + 0x87, 0xda, 0x7c, 0x2b, 0xc4, 0x1f, 0x01, 0xbd, 0x2f, 0x22, 0x5a, 0xd1, 0xef, 0x97, 0xc5, 0xff, + 0x3e, 0x39, 0x5f, 0x5f, 0x2c, 0xef, 0xa7, 0x1a, 0x30, 0x22, 0x1f, 0x80, 0x42, 0x85, 0xdb, 0x79, + 0xc3, 0xc8, 0xd2, 0x17, 0x19, 0x6e, 0x41, 0x39, 0x8a, 0xef, 0xd9, 0x35, 0xfc, 0x5b, 0x15, 0xe4, + 0xe5, 0x4b, 0x50, 0x8c, 0x56, 0x43, 0x86, 0x61, 0xa0, 0xba, 0xb8, 0xb0, 0x30, 0x5d, 0x5d, 0x2a, + 0xf6, 0x91, 0x41, 0xc8, 0x37, 0xa6, 0x17, 0xa6, 0x8a, 0x99, 0xf2, 0x57, 0xa4, 0x19, 0x84, 0xa9, + 0xd6, 0xf1, 0xd5, 0xf0, 0xbe, 0xee, 0x5b, 0x8a, 0x78, 0x1f, 0x8a, 0x27, 0x06, 0x6b, 0x86, 0xeb, + 0x52, 0x5d, 0xac, 0x12, 0x78, 0x5f, 0xe8, 0xde, 0x57, 0x63, 0x78, 0xf2, 0x2c, 0x8c, 0x22, 0x4c, + 0x5c, 0x11, 0xf2, 0xfd, 0xb1, 0x28, 0x60, 0xdf, 0x57, 0xc3, 0xc8, 0xf2, 0x37, 0x83, 0xdb, 0xe1, + 0x39, 0xaa, 0x1d, 0xd5, 0x1b, 0xc5, 0x07, 0xa4, 0xbf, 0xca, 0xbf, 0xdc, 0xcf, 0xdf, 0xd9, 0xf0, + 0x37, 0x9e, 0x87, 0x21, 0xca, 0xe0, 0x48, 0x37, 0xb7, 0x8b, 0x23, 0xdd, 0x67, 0xa1, 0x30, 0x4f, + 0xdd, 0x55, 0xcb, 0x73, 0x51, 0x43, 0x9f, 0x90, 0x35, 0x84, 0xc8, 0x3e, 0x21, 0x9c, 0x86, 0xdc, + 0x05, 0xe2, 0x3d, 0xe0, 0xf4, 0xbd, 0xdd, 0xbd, 0x23, 0xe4, 0x33, 0xb1, 0x7d, 0x4a, 0x03, 0x9f, + 0x79, 0xe3, 0x43, 0x86, 0x93, 0xbe, 0x37, 0xbd, 0xe4, 0x33, 0xf6, 0xef, 0x36, 0x4b, 0x05, 0x4e, + 0xa3, 0x26, 0xb0, 0x25, 0x1f, 0x85, 0xa1, 0xf9, 0x99, 0x8a, 0x78, 0xcc, 0xc9, 0xbd, 0x22, 0xce, + 0xfa, 0x52, 0xf4, 0x10, 0xbe, 0x48, 0xf0, 0x51, 0xd3, 0xda, 0x1d, 0x2d, 0xfe, 0x96, 0x33, 0xe0, + 0xc2, 0xb4, 0x85, 0x3f, 0x8f, 0x12, 0xa7, 0x0b, 0xbe, 0xb6, 0x84, 0x1f, 0x4d, 0x45, 0x65, 0xc5, + 0xb1, 0x11, 0x6d, 0x19, 0xdc, 0xc7, 0xe8, 0x5e, 0x84, 0x89, 0x4a, 0xa7, 0xd3, 0x36, 0xa8, 0x8e, + 0xfa, 0xa2, 0x76, 0xdb, 0xd4, 0x11, 0x1e, 0x45, 0xf8, 0xe2, 0x46, 0xe3, 0xc8, 0x26, 0x3e, 0x21, + 0x6e, 0xda, 0xdd, 0xb0, 0x27, 0x69, 0xbc, 0x2c, 0xbe, 0xd8, 0xe6, 0xec, 0x2d, 0xbb, 0x36, 0x25, + 0x7c, 0x8a, 0xf8, 0x8b, 0x6d, 0x0f, 0x1c, 0xf6, 0xb0, 0x94, 0xc9, 0xcb, 0x3f, 0x9a, 0x85, 0xd3, + 0x55, 0x9b, 0x6a, 0x2e, 0x9d, 0x9f, 0xa9, 0x54, 0xba, 0xe8, 0x0b, 0xd8, 0x6e, 0x53, 0x73, 0xe5, + 0x70, 0x26, 0x85, 0xd7, 0x61, 0xcc, 0x6f, 0x40, 0xa3, 0x65, 0x75, 0xa8, 0xfc, 0xf6, 0xad, 0xe5, + 0x61, 0x9a, 0x0e, 0x43, 0xa9, 0x11, 0x52, 0x72, 0x03, 0x4e, 0xf8, 0x90, 0x4a, 0xbb, 0x6d, 0xad, + 0xab, 0xb4, 0xeb, 0x70, 0x87, 0xe3, 0x41, 0xee, 0x70, 0x1c, 0x70, 0xd0, 0x18, 0xbe, 0x69, 0x33, + 0x02, 0x35, 0xa9, 0x54, 0xf9, 0xcb, 0x39, 0x38, 0x73, 0x4b, 0x6b, 0x1b, 0x7a, 0x20, 0x1a, 0x95, + 0x3a, 0x1d, 0xcb, 0x74, 0xe8, 0x11, 0x1a, 0xe3, 0xa1, 0x81, 0x94, 0x3f, 0x90, 0x81, 0x14, 0xef, + 0xa2, 0xfe, 0x7d, 0x77, 0x51, 0x61, 0x4f, 0x5d, 0xf4, 0xbf, 0x67, 0xa0, 0xe8, 0xbd, 0xcd, 0x90, + 0x9f, 0xed, 0x4b, 0x0f, 0x07, 0xf0, 0x00, 0x32, 0xe2, 0x5f, 0x8e, 0x78, 0xd2, 0x80, 0x81, 0xe9, + 0xfb, 0x1d, 0xc3, 0xa6, 0xce, 0x0e, 0x9c, 0xe3, 0x1f, 0x15, 0x87, 0x2d, 0x13, 0x94, 0x17, 0x89, + 0x9d, 0xb3, 0x70, 0x30, 0xbe, 0xb8, 0xe4, 0xaf, 0x53, 0x26, 0xbd, 0x58, 0x04, 0xfc, 0xc5, 0xa5, + 0x78, 0xc5, 0x12, 0x7a, 0x42, 0x1b, 0x90, 0x92, 0x27, 0x21, 0xb7, 0xb4, 0x34, 0x27, 0xe6, 0x61, + 0x8c, 0x01, 0xe1, 0xba, 0xf2, 0x93, 0x52, 0x86, 0x2d, 0xff, 0xcb, 0x2c, 0x7f, 0x65, 0xcd, 0x87, + 0xeb, 0xa1, 0x28, 0xe1, 0x24, 0x0c, 0x7a, 0x02, 0x17, 0x6a, 0xe8, 0x3f, 0xac, 0x88, 0x76, 0x44, + 0xb4, 0x6e, 0xff, 0x11, 0x4d, 0xc9, 0x73, 0x98, 0xe7, 0xb7, 0x08, 0xb8, 0x2f, 0x42, 0x87, 0x79, + 0xcf, 0x4d, 0xfe, 0xfd, 0x30, 0xe4, 0xcf, 0x50, 0xf2, 0xed, 0x81, 0x3f, 0x9d, 0xa9, 0x01, 0x3e, + 0x32, 0x31, 0x17, 0xf6, 0xb1, 0x8c, 0x7b, 0xe2, 0xe5, 0xbd, 0x72, 0x2c, 0xde, 0x03, 0x16, 0xef, + 0xe7, 0x85, 0x78, 0xf9, 0x23, 0xab, 0x23, 0x2b, 0xde, 0x03, 0x3b, 0x39, 0x2f, 0xff, 0x7e, 0x06, + 0x08, 0x6b, 0x56, 0x5d, 0x73, 0x9c, 0x75, 0xcb, 0xd6, 0xb9, 0x13, 0xfe, 0xa1, 0x08, 0xe6, 0xe0, + 0x6e, 0x3b, 0xbf, 0x7f, 0x08, 0x4e, 0x84, 0xdc, 0x86, 0x8f, 0xf8, 0x64, 0x75, 0x29, 0x3c, 0x9a, + 0x7a, 0xbd, 0xee, 0x79, 0x4a, 0xbe, 0x4e, 0xed, 0x0f, 0xbd, 0x11, 0x94, 0xee, 0x51, 0x9f, 0x83, + 0x11, 0xf1, 0x83, 0xad, 0xd0, 0xde, 0x3d, 0x19, 0x8e, 0x52, 0x87, 0x01, 0xd4, 0x10, 0x9a, 0xbc, + 0x0c, 0x43, 0x6c, 0xc0, 0xac, 0x60, 0xb8, 0x98, 0x81, 0xe0, 0xe5, 0x8c, 0xee, 0x01, 0xe5, 0xf5, + 0xc4, 0xa7, 0x94, 0xdc, 0xbd, 0x07, 0x77, 0xf0, 0x3e, 0xeb, 0x93, 0x30, 0x5c, 0x31, 0x4d, 0xcb, + 0xc5, 0x2d, 0xbe, 0x23, 0x2e, 0x36, 0x52, 0x6d, 0xfa, 0x27, 0x31, 0x7e, 0x41, 0x40, 0x9f, 0x68, + 0xd4, 0xcb, 0x0c, 0xc9, 0x55, 0xef, 0xf5, 0x0f, 0xb5, 0x85, 0x79, 0x8a, 0x97, 0x3b, 0xb6, 0x80, + 0xc5, 0x1f, 0xff, 0x60, 0xe7, 0x8d, 0xd6, 0x6d, 0xab, 0x63, 0x39, 0x54, 0xe7, 0x82, 0x1a, 0x0e, + 0xa2, 0x41, 0x74, 0x04, 0x02, 0x9f, 0x1a, 0x86, 0x42, 0xb7, 0x84, 0x8a, 0x90, 0x3b, 0x70, 0xd2, + 0xbb, 0x66, 0xf6, 0x1f, 0x75, 0xd6, 0xa6, 0x1c, 0x74, 0x99, 0x1f, 0x0e, 0xe2, 0x93, 0x04, 0xa8, + 0xc9, 0xc7, 0xbc, 0x4b, 0x15, 0xef, 0x55, 0x68, 0xd3, 0xd0, 0xe5, 0xae, 0x4e, 0xe4, 0x47, 0xbe, + 0x1b, 0x86, 0xe7, 0xb5, 0xfb, 0x53, 0x5d, 0x71, 0x72, 0x33, 0xba, 0xf3, 0xbb, 0x9b, 0x35, 0xed, + 0x7e, 0x53, 0x17, 0xe5, 0x22, 0x36, 0x85, 0xcc, 0x92, 0x34, 0xe1, 0x74, 0xdd, 0xb6, 0xd6, 0x2c, + 0x97, 0xea, 0x91, 0xf7, 0x91, 0xe3, 0xc1, 0x83, 0xea, 0x8e, 0xa0, 0x68, 0xf6, 0x78, 0x28, 0x99, + 0xc2, 0x86, 0xac, 0xc1, 0x78, 0xc5, 0x71, 0xba, 0x6b, 0x34, 0xb8, 0xdf, 0x2a, 0x6e, 0xfb, 0x19, + 0xef, 0x13, 0x3e, 0xcf, 0x8f, 0x68, 0x58, 0x94, 0x5f, 0x6f, 0x35, 0x5d, 0x43, 0xae, 0x11, 0xbf, + 0x25, 0xca, 0x9b, 0xf5, 0xae, 0x27, 0x40, 0x7c, 0xda, 0xaf, 0x4c, 0xe0, 0xf0, 0xc2, 0xde, 0xf5, + 0x45, 0x8f, 0x61, 0x01, 0xe4, 0xde, 0x0d, 0x15, 0xb9, 0x9e, 0x1f, 0x1c, 0x2b, 0x8e, 0xab, 0x67, + 0xe2, 0x1f, 0xc4, 0x5f, 0x0e, 0xfd, 0xf5, 0x6c, 0x64, 0x26, 0xe2, 0x36, 0xda, 0xbe, 0x66, 0x22, + 0x79, 0x46, 0xc9, 0xee, 0x71, 0x46, 0x79, 0x2a, 0xee, 0x75, 0x91, 0x30, 0x4d, 0x7c, 0x37, 0x8c, + 0x79, 0x25, 0xb0, 0xdd, 0x1b, 0xfe, 0x52, 0x93, 0xde, 0x1d, 0xe7, 0x45, 0x77, 0x14, 0xd1, 0x48, + 0xdd, 0x88, 0xf4, 0x41, 0x84, 0x5f, 0xf9, 0xeb, 0x19, 0x80, 0x40, 0x89, 0xc9, 0x73, 0xe1, 0xb8, + 0x5f, 0x99, 0xe0, 0x2a, 0x4a, 0x04, 0xf1, 0x08, 0x05, 0xfa, 0x22, 0xe7, 0x21, 0x8f, 0x81, 0x5e, + 0xb2, 0xc1, 0xd1, 0xf7, 0x5d, 0xc3, 0xd4, 0x55, 0x84, 0x32, 0xac, 0x14, 0x91, 0x01, 0xb1, 0xe8, + 0x76, 0xc1, 0x2d, 0xef, 0x29, 0x18, 0x6f, 0x74, 0x97, 0xe5, 0xce, 0x94, 0x43, 0x59, 0x39, 0xdd, + 0x65, 0xff, 0x4d, 0x76, 0x28, 0x9a, 0x4f, 0xb8, 0x48, 0xf9, 0xab, 0x99, 0x48, 0xff, 0x1e, 0xa2, + 0x61, 0xb1, 0xa3, 0x3e, 0x2d, 0x7f, 0x2b, 0x07, 0xc3, 0x75, 0xcb, 0x76, 0x45, 0xe4, 0x9c, 0xa3, + 0xbd, 0xd2, 0x4b, 0xfb, 0xd1, 0xfc, 0x2e, 0xf6, 0xa3, 0xe7, 0x21, 0x2f, 0x39, 0x91, 0xf3, 0x9b, + 0x2b, 0x5d, 0xb7, 0x55, 0x84, 0xbe, 0xc7, 0x8f, 0x62, 0xe2, 0xd7, 0xd4, 0x03, 0xfb, 0x76, 0x06, + 0xf9, 0x9e, 0x2c, 0xc0, 0x5b, 0x2f, 0xbc, 0xf0, 0x10, 0x77, 0x69, 0xf9, 0x27, 0x32, 0x30, 0x2e, + 0x2e, 0x7f, 0xa5, 0x98, 0x7f, 0x03, 0xde, 0xb5, 0xbd, 0x3c, 0x93, 0x70, 0x90, 0xea, 0xe1, 0x98, + 0x61, 0x30, 0x7d, 0xdf, 0x70, 0xf1, 0xfe, 0x4b, 0x0a, 0xfa, 0x47, 0x05, 0x4c, 0x36, 0x0c, 0x3c, + 0x3a, 0xf2, 0x9c, 0x77, 0xad, 0x9d, 0x0b, 0xac, 0x21, 0x56, 0x60, 0x3a, 0xf1, 0x6a, 0xbb, 0xfc, + 0xf3, 0x79, 0xc8, 0x4f, 0xdf, 0xa7, 0xad, 0x23, 0xde, 0x35, 0xd2, 0x61, 0x79, 0x7e, 0x9f, 0x87, + 0xe5, 0x7b, 0xf1, 0xd3, 0x79, 0x33, 0xe8, 0xcf, 0x42, 0xb8, 0xfa, 0x48, 0xcf, 0x47, 0xab, 0xf7, + 0x7a, 0xfa, 0xe8, 0xb9, 0x79, 0xfd, 0xa3, 0x1c, 0xe4, 0x1a, 0xd5, 0xfa, 0xb1, 0xde, 0x1c, 0xaa, + 0xde, 0xf4, 0xf6, 0x83, 0x28, 0xfb, 0x57, 0x9b, 0x83, 0x81, 0xe7, 0x71, 0xe4, 0x16, 0xf3, 0xcf, + 0x72, 0x30, 0xd6, 0x98, 0x59, 0xaa, 0x4b, 0xb7, 0x0b, 0x37, 0xb8, 0x77, 0x28, 0xfa, 0x29, 0xf2, + 0x2e, 0x3d, 0x1f, 0x33, 0xab, 0x6e, 0xd6, 0x4c, 0xf7, 0x95, 0x97, 0x6e, 0x69, 0xed, 0x2e, 0xc5, + 0x03, 0x39, 0xee, 0x4b, 0xee, 0x18, 0xef, 0xd2, 0x2f, 0x63, 0x98, 0x0d, 0x8f, 0x01, 0x79, 0x1d, + 0x72, 0x37, 0x85, 0x97, 0x4f, 0x1a, 0x9f, 0x17, 0xaf, 0x72, 0x3e, 0x6c, 0x12, 0xcc, 0x75, 0x0d, + 0x1d, 0x39, 0xb0, 0x52, 0xac, 0xf0, 0x35, 0x61, 0x32, 0xec, 0xa8, 0xf0, 0x8a, 0x57, 0xf8, 0x5a, + 0x6d, 0x8a, 0x34, 0x60, 0xb8, 0x4e, 0xed, 0x35, 0x03, 0x3b, 0xca, 0x9b, 0xb3, 0x7b, 0x33, 0x61, + 0xfb, 0xd7, 0xe1, 0x4e, 0x50, 0x08, 0x99, 0xc9, 0x5c, 0xc8, 0xdb, 0x00, 0xdc, 0xaa, 0xda, 0x61, + 0x1c, 0xd9, 0x47, 0x71, 0x37, 0xc8, 0x37, 0x1c, 0x09, 0x96, 0xbf, 0xc4, 0x8c, 0xdc, 0x85, 0xe2, + 0xbc, 0xa5, 0x1b, 0x77, 0x0c, 0xee, 0xce, 0x8b, 0x15, 0x14, 0xb6, 0x77, 0xa2, 0x63, 0x1b, 0x8c, + 0x35, 0xa9, 0x5c, 0x52, 0x35, 0x31, 0xc6, 0xe5, 0xbf, 0xdf, 0x0f, 0x79, 0xd6, 0xed, 0xc7, 0xe3, + 0x77, 0x3f, 0xe3, 0xb7, 0x02, 0xc5, 0xdb, 0x96, 0x7d, 0xd7, 0x30, 0x57, 0xfc, 0x97, 0x16, 0xe2, + 0xc4, 0x02, 0xbd, 0xc3, 0xd6, 0x39, 0xae, 0xe9, 0x3f, 0xca, 0x50, 0x63, 0xe4, 0xdb, 0x8c, 0xe0, + 0x57, 0x01, 0x78, 0x78, 0x06, 0xa4, 0x19, 0x0c, 0x42, 0xc3, 0xf0, 0xe0, 0x0d, 0xf8, 0x78, 0x43, + 0x0e, 0x0d, 0x13, 0x10, 0x93, 0x4b, 0x9e, 0x7f, 0xcd, 0x10, 0xbe, 0xe5, 0xc0, 0xa3, 0x19, 0xf4, + 0xaf, 0x91, 0x8d, 0x00, 0xee, 0x69, 0x53, 0x07, 0x90, 0xee, 0x2c, 0x21, 0x22, 0x88, 0xd0, 0xe4, + 0x20, 0xe2, 0x3a, 0x26, 0x5c, 0x59, 0xaa, 0x12, 0x0f, 0xf2, 0x4a, 0xc4, 0xa9, 0x82, 0x84, 0xb8, + 0xa5, 0xfa, 0x54, 0x04, 0x4e, 0x79, 0x23, 0xdb, 0x39, 0xe5, 0x95, 0x7f, 0x26, 0x07, 0xc3, 0x8c, + 0x5b, 0xa3, 0xbb, 0xb6, 0xa6, 0xd9, 0x1b, 0xc7, 0x8a, 0xbc, 0x1f, 0x45, 0x6e, 0xc2, 0x84, 0xfc, + 0x08, 0x83, 0x99, 0xae, 0x5e, 0x8c, 0x30, 0x7f, 0x0b, 0x1f, 0x25, 0xe0, 0xb6, 0x25, 0xce, 0xfb, + 0xae, 0x00, 0xe3, 0x89, 0x93, 0xa3, 0xc6, 0x79, 0x95, 0x7f, 0x24, 0x03, 0xc5, 0x28, 0xd4, 0xd7, + 0xfd, 0x4c, 0xa2, 0xee, 0x3f, 0x0b, 0x43, 0xc2, 0x2d, 0x43, 0xd3, 0x85, 0x97, 0xe8, 0xd8, 0xd6, + 0x66, 0x09, 0xf0, 0x4d, 0x7c, 0xd3, 0xa6, 0x9a, 0xae, 0x06, 0x04, 0xe4, 0x65, 0x18, 0xc1, 0x1f, + 0xb7, 0x6d, 0xc3, 0x75, 0x29, 0xef, 0x8c, 0x3c, 0xbf, 0x2b, 0xe2, 0x05, 0xd6, 0x39, 0x42, 0x0d, + 0x91, 0x95, 0x7f, 0x2b, 0x0b, 0x43, 0x8d, 0xee, 0xb2, 0xb3, 0xe1, 0xb8, 0x74, 0xed, 0x88, 0xeb, + 0x90, 0x77, 0xac, 0x90, 0x4f, 0x3c, 0x56, 0x78, 0xd2, 0x1b, 0x5a, 0xd2, 0x9d, 0x86, 0xbf, 0x31, + 0xf0, 0x3c, 0x5d, 0x03, 0x2d, 0x2a, 0xec, 0x5e, 0x8b, 0xca, 0x7f, 0x37, 0x0b, 0x45, 0xee, 0x10, + 0x30, 0x65, 0x38, 0xad, 0x03, 0x78, 0xa4, 0x74, 0xf8, 0x32, 0xdd, 0x9f, 0x13, 0xcd, 0x0e, 0x9e, + 0x7e, 0x95, 0x3f, 0x9d, 0x85, 0xe1, 0x4a, 0xd7, 0x5d, 0xad, 0xb8, 0x38, 0xbf, 0x3d, 0x94, 0x7b, + 0xe4, 0xdf, 0xcc, 0xc0, 0x38, 0x6b, 0xc8, 0x92, 0x75, 0x97, 0x9a, 0x07, 0x70, 0x25, 0x72, 0x10, + 0x07, 0x91, 0x9e, 0x2c, 0x73, 0xbb, 0x93, 0x25, 0x5e, 0xe4, 0xa9, 0x56, 0x9b, 0x1e, 0xed, 0xcf, + 0x38, 0xc0, 0x8b, 0x3c, 0x4f, 0x20, 0x07, 0x70, 0x71, 0xfc, 0x9d, 0x25, 0x90, 0x03, 0x38, 0x91, + 0xfd, 0xce, 0x10, 0xc8, 0x6f, 0x64, 0x60, 0x68, 0xd2, 0x72, 0x8f, 0xf8, 0xc0, 0x17, 0x5f, 0x71, + 0xb4, 0xd5, 0xdc, 0xfb, 0x8a, 0xa3, 0xad, 0x9b, 0xe5, 0x1f, 0xcb, 0xc2, 0x49, 0x91, 0xa7, 0x42, + 0x9c, 0x81, 0x1d, 0x4f, 0xc7, 0x62, 0xb0, 0xc5, 0x45, 0x73, 0x3c, 0x0f, 0x09, 0xd1, 0xfc, 0x54, + 0x0e, 0x4e, 0x62, 0x1c, 0x6c, 0xb6, 0xa3, 0xfa, 0x0e, 0xb0, 0x45, 0x48, 0x2b, 0xec, 0x9e, 0x31, + 0x9f, 0xe0, 0x9e, 0xf1, 0xef, 0x36, 0x4b, 0xaf, 0xac, 0x18, 0xee, 0x6a, 0x77, 0xf9, 0x72, 0xcb, + 0x5a, 0xbb, 0xb2, 0x62, 0x6b, 0xf7, 0x0c, 0xee, 0x98, 0xa0, 0xb5, 0xaf, 0x04, 0xe9, 0xa3, 0x3a, + 0x86, 0x48, 0x06, 0xd5, 0xc0, 0x9d, 0x12, 0xe3, 0xea, 0x39, 0x76, 0x38, 0x00, 0xd7, 0x2d, 0xc3, + 0x14, 0xbe, 0xd2, 0xdc, 0xd0, 0x6d, 0x6c, 0x6d, 0x96, 0x4e, 0xbd, 0x63, 0x19, 0x66, 0x33, 0xea, + 0x30, 0xbd, 0xdb, 0xfa, 0x02, 0xd6, 0xaa, 0x54, 0x4d, 0xf9, 0x9f, 0x66, 0xe0, 0x6c, 0x58, 0x8b, + 0xbf, 0x13, 0x6c, 0xc7, 0xbf, 0x9a, 0x85, 0x53, 0xd7, 0x50, 0x38, 0xbe, 0x8b, 0xd9, 0xf1, 0xbc, + 0x25, 0x06, 0x67, 0x82, 0x6c, 0x8e, 0x2d, 0xca, 0x74, 0xd9, 0x1c, 0x4f, 0xea, 0x42, 0x36, 0xbf, + 0x93, 0x81, 0x13, 0x8b, 0xb5, 0xa9, 0xea, 0x77, 0xc8, 0x88, 0x8a, 0x7f, 0xcf, 0x11, 0x37, 0x38, + 0x63, 0xdf, 0x73, 0xc4, 0x4d, 0xcf, 0x2f, 0x66, 0xe1, 0x44, 0xa3, 0x32, 0x3f, 0xf7, 0x9d, 0x32, + 0x83, 0x57, 0x65, 0x7f, 0x68, 0xef, 0x10, 0x4c, 0xd8, 0x02, 0xf2, 0x67, 0xde, 0xba, 0x9a, 0xee, + 0x27, 0x1d, 0x17, 0xca, 0x11, 0x9f, 0xba, 0x0f, 0x44, 0x28, 0x4c, 0xf3, 0x43, 0xd4, 0x47, 0x5c, + 0xf3, 0xff, 0x61, 0x01, 0x86, 0x6f, 0x74, 0x97, 0xa9, 0x70, 0xe9, 0x7a, 0xa8, 0x4f, 0x7e, 0xaf, + 0xc2, 0xb0, 0x10, 0x03, 0xde, 0x70, 0x48, 0x41, 0x41, 0x45, 0x90, 0x27, 0x1e, 0x77, 0x4d, 0x26, + 0x22, 0xe7, 0x21, 0x7f, 0x8b, 0xda, 0xcb, 0xf2, 0x7b, 0xf9, 0x7b, 0xd4, 0x5e, 0x56, 0x11, 0x4a, + 0xe6, 0x82, 0xc7, 0x3c, 0x95, 0x7a, 0x0d, 0xb3, 0x70, 0x89, 0x4b, 0x43, 0x4c, 0x2b, 0xe6, 0xbb, + 0x85, 0x6a, 0x1d, 0x83, 0xe7, 0xef, 0x92, 0x63, 0x75, 0x44, 0x4b, 0x92, 0x05, 0x98, 0x08, 0xb9, + 0x8b, 0x62, 0x0a, 0xaa, 0xc1, 0x04, 0x76, 0x49, 0xc9, 0xa7, 0xe2, 0x45, 0xc9, 0x9b, 0x30, 0xe2, + 0x01, 0xd1, 0xf1, 0x71, 0x28, 0xc8, 0x7b, 0xe2, 0xb3, 0x8a, 0xe4, 0x96, 0x08, 0x15, 0x90, 0x19, + 0xe0, 0x25, 0x06, 0x24, 0x30, 0x88, 0x38, 0xeb, 0x86, 0x0a, 0x90, 0x97, 0x91, 0x01, 0x3e, 0x40, + 0x43, 0x87, 0xa9, 0x61, 0x7c, 0x4c, 0x8e, 0x17, 0x40, 0xb6, 0x80, 0xf3, 0x90, 0x01, 0x21, 0x32, + 0xb2, 0x08, 0x10, 0x38, 0xb6, 0x88, 0xc0, 0x2c, 0xbb, 0x76, 0xb9, 0x91, 0x58, 0xc8, 0x37, 0x79, + 0xa3, 0x7b, 0xb9, 0xc9, 0x2b, 0xff, 0x68, 0x0e, 0x86, 0x2b, 0x9d, 0x8e, 0x3f, 0x14, 0x9e, 0x83, + 0x42, 0xa5, 0xd3, 0xb9, 0xa9, 0xd6, 0xe4, 0x64, 0x12, 0x5a, 0xa7, 0xd3, 0xec, 0xda, 0x86, 0xec, + 0xad, 0xce, 0x89, 0x48, 0x15, 0x46, 0x2b, 0x9d, 0x4e, 0xbd, 0xbb, 0xdc, 0x36, 0x5a, 0x52, 0x5a, + 0x3d, 0x9e, 0xc7, 0xb4, 0xd3, 0x69, 0x76, 0x10, 0x13, 0xcd, 0xad, 0x18, 0x2e, 0x43, 0x3e, 0x89, + 0xe1, 0xcc, 0x44, 0x56, 0x37, 0x9e, 0x37, 0xaa, 0xec, 0xa7, 0x91, 0x08, 0xda, 0x76, 0xd9, 0x27, + 0xe2, 0xe9, 0x36, 0xce, 0x7b, 0x49, 0x52, 0x58, 0x45, 0xb1, 0xec, 0x6d, 0x01, 0x4b, 0xf2, 0x3c, + 0x0c, 0x54, 0x3a, 0x1d, 0xe9, 0xb6, 0x0a, 0x1d, 0xdb, 0x58, 0xa9, 0x68, 0x1e, 0x4e, 0x41, 0x26, + 0x3e, 0x4b, 0xdc, 0x6f, 0x5b, 0xb6, 0x8b, 0x43, 0x6a, 0x34, 0xf8, 0x2c, 0xef, 0x42, 0xdc, 0x92, + 0x23, 0x08, 0xa9, 0xe1, 0x32, 0xe7, 0xde, 0x80, 0xb1, 0x70, 0x8b, 0x77, 0x95, 0xf3, 0xe3, 0xdb, + 0x19, 0x94, 0xca, 0x11, 0x7f, 0xb2, 0xf1, 0x22, 0xe4, 0x2a, 0x9d, 0x8e, 0x98, 0xd4, 0x4e, 0x24, + 0x74, 0x6a, 0x34, 0x3e, 0x44, 0xa5, 0xd3, 0xf1, 0x3e, 0xfd, 0x88, 0xbf, 0xfd, 0xda, 0xd3, 0xa7, + 0xff, 0x06, 0xff, 0xf4, 0xa3, 0xfd, 0x2e, 0xab, 0xfc, 0xf3, 0x39, 0x18, 0xaf, 0x74, 0x3a, 0xc7, + 0x09, 0x3e, 0x0e, 0x2a, 0x0a, 0xc5, 0x0b, 0x00, 0xd2, 0x1c, 0x3b, 0xe0, 0xbf, 0x4c, 0x1d, 0x96, + 0xe6, 0x57, 0x25, 0xa3, 0x4a, 0x44, 0x9e, 0xfa, 0x0d, 0xee, 0x4a, 0xfd, 0x3e, 0x9d, 0xc3, 0x89, + 0xef, 0xa8, 0x47, 0xd4, 0x7b, 0x50, 0xba, 0x4d, 0xf4, 0x41, 0x61, 0x57, 0x7d, 0xf0, 0xeb, 0xa1, + 0xc1, 0x83, 0x19, 0x1d, 0x8e, 0x7b, 0xa1, 0x7f, 0x5f, 0xb6, 0xf5, 0x98, 0x2c, 0x4c, 0x11, 0xe6, + 0xcb, 0x4b, 0xe5, 0x27, 0x82, 0xce, 0xb5, 0x18, 0xaa, 0x69, 0xe8, 0x6a, 0x84, 0xd6, 0xeb, 0xc3, + 0x81, 0x5d, 0xf5, 0xe1, 0x66, 0x16, 0x03, 0x4b, 0xf8, 0x41, 0xeb, 0xf6, 0xbf, 0x45, 0xb9, 0x02, + 0xc0, 0xdd, 0x17, 0x7c, 0xff, 0xfc, 0x51, 0x1e, 0x9f, 0x8a, 0x67, 0xf8, 0x13, 0xf1, 0xa9, 0x02, + 0x12, 0xdf, 0xdd, 0x29, 0x97, 0xe8, 0xee, 0x74, 0x09, 0x06, 0x55, 0x6d, 0xfd, 0xa3, 0x5d, 0x2a, + 0x1e, 0x33, 0x79, 0x31, 0x61, 0xb5, 0xf5, 0xe6, 0xa7, 0x18, 0x50, 0xf5, 0xd1, 0xa4, 0xec, 0x47, + 0x26, 0x91, 0xdc, 0x4a, 0xf8, 0x41, 0xbb, 0x1f, 0x8f, 0x64, 0x2f, 0x8a, 0x4e, 0x5e, 0x83, 0x5c, + 0xe5, 0x76, 0x43, 0x48, 0xd6, 0xef, 0xda, 0xca, 0xed, 0x86, 0x90, 0x57, 0x6a, 0xd9, 0xdb, 0x8d, + 0xf2, 0xa7, 0xb3, 0x40, 0xe2, 0x94, 0xe4, 0x15, 0x18, 0x42, 0xe8, 0x0a, 0xd3, 0x19, 0x39, 0x35, + 0xf4, 0xba, 0xd3, 0xb4, 0x11, 0x1a, 0xb2, 0x10, 0x3d, 0x52, 0xf2, 0x2a, 0xe6, 0xf2, 0x17, 0xc9, + 0x49, 0x43, 0xa9, 0xa1, 0xd7, 0x1d, 0x2f, 0xfb, 0x7d, 0x24, 0x95, 0xbf, 0x20, 0x46, 0xe3, 0xf2, + 0x76, 0x63, 0xd6, 0x72, 0x5c, 0x21, 0x6a, 0x6e, 0x5c, 0xae, 0x3b, 0x98, 0x93, 0x3c, 0x64, 0x5c, + 0x72, 0x32, 0xcc, 0xab, 0x78, 0xbb, 0xc1, 0x5f, 0xe1, 0xe9, 0xaa, 0xe5, 0xe7, 0x30, 0xe4, 0x79, + 0x15, 0xd7, 0x9d, 0x26, 0x7f, 0xc1, 0xa7, 0x37, 0x6d, 0xab, 0x1d, 0xce, 0xab, 0x18, 0x2a, 0x55, + 0xfe, 0xc1, 0x41, 0x28, 0x4e, 0x69, 0xae, 0xb6, 0xac, 0x39, 0x54, 0xda, 0x92, 0x8f, 0x7b, 0x30, + 0xef, 0x73, 0x24, 0x39, 0xe8, 0xcb, 0x09, 0x5f, 0x13, 0x2d, 0x40, 0x5e, 0x0f, 0xf8, 0xfa, 0x59, + 0xaf, 0xe5, 0x34, 0x9a, 0xcb, 0xcd, 0x8e, 0x00, 0xab, 0x31, 0x42, 0xf2, 0x2c, 0x0c, 0x7b, 0x30, + 0xb6, 0x8b, 0xc8, 0x05, 0x3a, 0xa3, 0x2f, 0xb3, 0x4d, 0x84, 0x2a, 0xa3, 0xc9, 0xab, 0x30, 0xe2, + 0xfd, 0x94, 0xec, 0x73, 0x9e, 0x13, 0x74, 0x39, 0xb6, 0x05, 0x93, 0x49, 0xe5, 0xa2, 0x38, 0xbf, + 0xf5, 0x87, 0x8a, 0x46, 0xd2, 0x6e, 0x86, 0x48, 0xc9, 0xa7, 0x60, 0xcc, 0xfb, 0x2d, 0x76, 0x1d, + 0xdc, 0xfb, 0xf0, 0x59, 0x4f, 0x09, 0xa3, 0x62, 0xbd, 0x1c, 0x26, 0xe7, 0xfb, 0x8f, 0x47, 0xbc, + 0xf4, 0x8f, 0xfa, 0x72, 0x7c, 0xfb, 0x11, 0xa9, 0x80, 0xd4, 0x60, 0xc2, 0x83, 0x04, 0x1a, 0x3a, + 0x10, 0x6c, 0x3b, 0xf5, 0xe5, 0x66, 0xa2, 0x92, 0xc6, 0x4b, 0x91, 0x36, 0x9c, 0x0f, 0x01, 0x75, + 0x67, 0xd5, 0xb8, 0xe3, 0x8a, 0x3d, 0xa3, 0x08, 0xd0, 0x2e, 0x52, 0x07, 0xfb, 0x5c, 0x39, 0x8d, + 0x97, 0x03, 0x3c, 0x1c, 0x82, 0xa6, 0x27, 0x37, 0xd2, 0x80, 0x93, 0x1e, 0xfe, 0x5a, 0xb5, 0x5e, + 0xb7, 0xad, 0x77, 0x68, 0xcb, 0xad, 0x4d, 0x89, 0x3d, 0x37, 0x06, 0xee, 0xd4, 0x97, 0x9b, 0x2b, + 0xad, 0x0e, 0x53, 0x0a, 0x86, 0x0b, 0x33, 0x4f, 0x2c, 0x4c, 0x6e, 0xc1, 0x29, 0x09, 0x5e, 0x33, + 0x1d, 0x57, 0x33, 0x5b, 0xd4, 0x0f, 0x98, 0x83, 0x87, 0x02, 0x82, 0xab, 0x21, 0x90, 0x61, 0xb6, + 0xc9, 0xc5, 0xc9, 0x1b, 0x30, 0xea, 0x21, 0xf8, 0x55, 0xe4, 0x30, 0x5e, 0x45, 0xe2, 0x90, 0xd4, + 0x97, 0x9b, 0xd1, 0xc7, 0xe2, 0x61, 0x62, 0x59, 0xa3, 0x96, 0x36, 0x3a, 0x54, 0xb8, 0x05, 0x7b, + 0x1a, 0xe5, 0x6e, 0x74, 0x12, 0x95, 0x91, 0x91, 0x92, 0x37, 0x03, 0x8d, 0x5a, 0xb4, 0x8d, 0x15, + 0xc3, 0x4b, 0xed, 0x75, 0x46, 0xe8, 0x87, 0x85, 0xc0, 0x24, 0xfd, 0xe0, 0xe4, 0xe7, 0x2a, 0x70, + 0x22, 0x41, 0xc7, 0x76, 0xb5, 0x63, 0xfc, 0x5c, 0x36, 0x68, 0xc4, 0x11, 0xdf, 0x36, 0x4e, 0xc2, + 0xa0, 0xf7, 0x25, 0xc2, 0x78, 0x50, 0xd2, 0x86, 0x66, 0x94, 0x87, 0x87, 0x0f, 0x89, 0xe3, 0x88, + 0x6f, 0x25, 0x0f, 0x42, 0x1c, 0xdf, 0xc8, 0x04, 0xe2, 0x38, 0xe2, 0xdb, 0xcb, 0xdf, 0xcc, 0x07, + 0x73, 0xd2, 0xf1, 0x1e, 0xf3, 0xa0, 0xcc, 0xe4, 0xc0, 0x99, 0xb6, 0xb0, 0x8b, 0x37, 0xc4, 0xb2, + 0x6a, 0x0e, 0xec, 0x4d, 0x35, 0xc9, 0x1b, 0x30, 0x5c, 0xb7, 0x1c, 0x77, 0xc5, 0xa6, 0x4e, 0xdd, + 0x4f, 0x30, 0x82, 0xef, 0xcf, 0x3b, 0x02, 0xdc, 0xec, 0x84, 0x83, 0xa6, 0x49, 0xe4, 0x52, 0x2c, + 0xb9, 0xa1, 0xdd, 0xc7, 0x92, 0x2b, 0xff, 0x61, 0x2e, 0xa6, 0x4b, 0xdc, 0xec, 0x3d, 0x92, 0xba, + 0x74, 0x00, 0x13, 0x05, 0xb9, 0x1a, 0xac, 0xa1, 0x7c, 0x7f, 0xd0, 0x2f, 0xc5, 0x5e, 0x5d, 0x16, + 0xdb, 0x83, 0x30, 0x09, 0xf9, 0x38, 0x9c, 0x09, 0x01, 0xea, 0x9a, 0xad, 0xad, 0x51, 0x37, 0x48, + 0x5a, 0x8b, 0xd1, 0xf4, 0xbc, 0xd2, 0xcd, 0x8e, 0x8f, 0x96, 0x13, 0xe1, 0xa6, 0x70, 0x90, 0x14, + 0x73, 0x60, 0x17, 0x5e, 0xde, 0x5f, 0xca, 0x05, 0x66, 0x52, 0x38, 0x2a, 0xb6, 0x4a, 0x9d, 0x6e, + 0xdb, 0x7d, 0x78, 0x3b, 0x78, 0x6f, 0x39, 0x87, 0x66, 0x61, 0xbc, 0x72, 0xe7, 0x0e, 0x6d, 0xb9, + 0x5e, 0xb0, 0x7f, 0x47, 0xc4, 0x41, 0xe5, 0xdb, 0x16, 0x81, 0x12, 0xc1, 0xdb, 0x9d, 0x50, 0x1a, + 0xe1, 0x70, 0xb1, 0xf2, 0x1f, 0xe5, 0x41, 0xf1, 0xb7, 0x0d, 0xfe, 0x6b, 0xc7, 0x43, 0x5c, 0xa2, + 0x1f, 0x88, 0x5e, 0x31, 0x60, 0x22, 0x10, 0x86, 0x78, 0x66, 0xa6, 0xf4, 0xe3, 0xb6, 0xa4, 0x14, + 0x65, 0x16, 0x10, 0xf2, 0x9d, 0xc8, 0x39, 0xb1, 0x13, 0x21, 0xc1, 0x6b, 0xd2, 0xa6, 0xc3, 0x59, + 0xa8, 0x71, 0xae, 0xe4, 0xf3, 0x19, 0x38, 0xe9, 0x75, 0xca, 0xe2, 0x32, 0x33, 0xc9, 0xab, 0x56, + 0xd7, 0xf4, 0xdf, 0x60, 0xbd, 0x96, 0x5e, 0x1d, 0xef, 0xa4, 0xcb, 0x49, 0x85, 0x79, 0x4b, 0xfc, + 0x98, 0x3d, 0xbe, 0x42, 0x58, 0x48, 0xd3, 0x6c, 0x21, 0x91, 0x9a, 0x58, 0xef, 0xb9, 0x6b, 0x70, + 0x36, 0x95, 0xe5, 0x76, 0x26, 0x70, 0xbf, 0x6c, 0x02, 0xff, 0x41, 0x26, 0x98, 0x88, 0x22, 0x42, + 0x22, 0x97, 0x01, 0x02, 0x90, 0xd8, 0x14, 0xe3, 0x13, 0xaf, 0x40, 0x68, 0xaa, 0x44, 0x41, 0x16, + 0xa1, 0x20, 0xc4, 0xc2, 0x13, 0xc4, 0xbf, 0x7f, 0x9b, 0x5e, 0xb8, 0x2c, 0xcb, 0x01, 0x37, 0xbc, + 0xe2, 0x9b, 0x05, 0x9b, 0x73, 0xaf, 0xc2, 0xf0, 0x5e, 0xbf, 0xeb, 0xf3, 0x39, 0x20, 0xf2, 0x0e, + 0xf6, 0x10, 0xcd, 0xfb, 0x23, 0x3c, 0x85, 0x5d, 0x84, 0x41, 0xf6, 0x09, 0x98, 0x88, 0x48, 0x0a, + 0x3c, 0xde, 0x15, 0x30, 0xd5, 0xc7, 0x06, 0x71, 0xfb, 0x06, 0x92, 0xe3, 0xf6, 0x95, 0x7f, 0x24, + 0x07, 0xa7, 0xe5, 0x0e, 0x99, 0xa2, 0x98, 0xcb, 0xe4, 0xb8, 0x53, 0xde, 0xc3, 0x4e, 0x29, 0x43, + 0x81, 0x6f, 0x5c, 0x44, 0x52, 0x19, 0x7e, 0xa8, 0x84, 0x10, 0x55, 0x60, 0xca, 0xff, 0x6b, 0x16, + 0x46, 0x7d, 0xe3, 0x50, 0xb3, 0x9d, 0x87, 0xb8, 0x3b, 0x3e, 0x08, 0xa3, 0x18, 0x79, 0x6d, 0x8d, + 0x9a, 0x3c, 0x3a, 0x59, 0xbf, 0x94, 0x05, 0xca, 0x43, 0x88, 0x84, 0x7f, 0x21, 0x42, 0xa6, 0xfd, + 0xdc, 0xf2, 0x93, 0xe2, 0xe1, 0x71, 0xb3, 0x8f, 0xc3, 0xcb, 0x7f, 0x23, 0x07, 0x23, 0x9e, 0x94, + 0x27, 0x8d, 0xa3, 0x7a, 0x4b, 0x74, 0xb8, 0x42, 0xbe, 0x02, 0x50, 0xb7, 0x6c, 0x57, 0x6b, 0x2f, + 0x04, 0x9a, 0x8f, 0xc7, 0xab, 0x1d, 0x84, 0xf2, 0x32, 0x12, 0x09, 0xae, 0x5f, 0x81, 0x59, 0xcd, + 0x27, 0x26, 0xbe, 0x7e, 0xf9, 0x50, 0x55, 0xa2, 0x28, 0xff, 0x4a, 0x16, 0xc6, 0xbd, 0x4e, 0x9a, + 0xbe, 0x4f, 0x5b, 0xdd, 0x87, 0x79, 0x6e, 0x0a, 0x4b, 0xbb, 0x7f, 0x5b, 0x69, 0x97, 0xff, 0x6f, + 0x69, 0x22, 0xa9, 0xb6, 0xad, 0xe3, 0x89, 0xe4, 0xcf, 0x43, 0xc7, 0xcb, 0x9f, 0xc9, 0xc1, 0x49, + 0x4f, 0xea, 0x33, 0x5d, 0x13, 0x0f, 0x26, 0xaa, 0x5a, 0xbb, 0xfd, 0x30, 0xef, 0xc6, 0x87, 0x3d, + 0x41, 0x2c, 0x8a, 0x50, 0xa6, 0x22, 0xf9, 0xea, 0x1d, 0x01, 0x6e, 0x5a, 0x86, 0xae, 0xca, 0x44, + 0xe4, 0x4d, 0x18, 0xf1, 0x7e, 0x56, 0xec, 0x15, 0x6f, 0x0b, 0x8e, 0xd7, 0x0c, 0x7e, 0x21, 0xcd, + 0x0e, 0xc5, 0xe6, 0x08, 0x15, 0x28, 0x7f, 0x7a, 0x00, 0xce, 0xdd, 0x36, 0x4c, 0xdd, 0x5a, 0x77, + 0xbc, 0xdc, 0xbd, 0x47, 0xfe, 0x98, 0xed, 0xb0, 0x73, 0xf6, 0x7e, 0x14, 0x4e, 0x45, 0x45, 0x6a, + 0xfb, 0x19, 0x15, 0x44, 0xef, 0xac, 0x73, 0x82, 0xa6, 0x97, 0xc5, 0x57, 0xdc, 0xd5, 0xa9, 0xc9, + 0x25, 0xa3, 0x69, 0x80, 0x07, 0x76, 0x92, 0x06, 0xf8, 0x19, 0x28, 0x4c, 0x59, 0x6b, 0x9a, 0xe1, + 0x45, 0x69, 0xc2, 0x51, 0xec, 0xd7, 0x8b, 0x18, 0x55, 0x50, 0x30, 0xfe, 0xa2, 0x62, 0xec, 0xb2, + 0xa1, 0x80, 0xbf, 0x57, 0x80, 0x59, 0x69, 0xaa, 0x4c, 0x44, 0x2c, 0x18, 0x15, 0xd5, 0x89, 0x9b, + 0x35, 0xc0, 0xcd, 0xd3, 0xcb, 0x9e, 0x8c, 0xd2, 0xd5, 0xea, 0x72, 0xa8, 0x1c, 0xdf, 0x46, 0xf1, + 0xec, 0xc4, 0xe2, 0x63, 0xf8, 0x1d, 0x9b, 0x1a, 0xe6, 0x2f, 0x09, 0x01, 0x27, 0x99, 0xe1, 0xb8, + 0x10, 0x70, 0x96, 0x91, 0x89, 0xc8, 0x34, 0x4c, 0x60, 0xe4, 0x7a, 0x7f, 0x2b, 0xc5, 0x54, 0x62, + 0x04, 0x8d, 0x4a, 0xbc, 0xb0, 0xe1, 0xc1, 0xee, 0xd9, 0xc7, 0x35, 0x5b, 0x02, 0xad, 0xc6, 0x4b, + 0x90, 0xb3, 0x90, 0x5b, 0x98, 0xab, 0xe0, 0x4d, 0xcf, 0x20, 0xcf, 0x39, 0x67, 0xb6, 0x35, 0x95, + 0xc1, 0xce, 0x7d, 0x04, 0x48, 0xfc, 0x73, 0x76, 0x75, 0x9b, 0xf3, 0x8f, 0xa5, 0x2d, 0xdf, 0x51, + 0xf7, 0xc7, 0x39, 0x88, 0x89, 0x30, 0x94, 0xee, 0xb1, 0xff, 0xbd, 0x4c, 0xf7, 0x58, 0x38, 0xd0, + 0x74, 0x8f, 0xe5, 0x9f, 0xcd, 0xc0, 0x44, 0x2c, 0xbb, 0x03, 0x79, 0x11, 0x80, 0x43, 0xa4, 0x08, + 0xaf, 0x18, 0x80, 0x28, 0xc8, 0xf8, 0x20, 0x96, 0xc7, 0x80, 0x8c, 0x5c, 0x81, 0x41, 0xfe, 0x4b, + 0xc4, 0x38, 0x8b, 0x17, 0xe9, 0x76, 0x0d, 0x5d, 0xf5, 0x89, 0x82, 0x5a, 0xf0, 0x3e, 0x33, 0x97, + 0x58, 0xc4, 0xdd, 0xe8, 0xf8, 0xb5, 0x30, 0xb2, 0xf2, 0x0f, 0x66, 0x61, 0xc4, 0x6f, 0x70, 0x45, + 0x3f, 0x2c, 0x9d, 0x2b, 0x88, 0x44, 0x19, 0xb9, 0xed, 0x12, 0x65, 0x44, 0xe6, 0x5b, 0x91, 0x19, + 0xe3, 0xe0, 0xde, 0x74, 0x7d, 0x21, 0x0b, 0xe3, 0x7e, 0xad, 0x87, 0x78, 0x75, 0xf6, 0x00, 0x89, + 0xe4, 0xf3, 0x19, 0x50, 0x26, 0x8d, 0x76, 0xdb, 0x30, 0x57, 0x6a, 0xe6, 0x1d, 0xcb, 0x5e, 0xc3, + 0x09, 0xf1, 0xf0, 0x8e, 0x70, 0xcb, 0xdf, 0x9f, 0x81, 0x09, 0xd1, 0xa0, 0xaa, 0x66, 0xeb, 0x87, + 0x77, 0x3e, 0x16, 0x6d, 0xc9, 0xe1, 0xe9, 0x4b, 0xf9, 0x97, 0xb2, 0x00, 0x73, 0x56, 0xeb, 0xee, + 0x11, 0x7f, 0x12, 0xf6, 0x3a, 0x14, 0xb8, 0x53, 0xbd, 0xd0, 0xd8, 0x09, 0xf1, 0xf4, 0x89, 0x7d, + 0x1a, 0x47, 0x4c, 0x16, 0xc5, 0x7c, 0x5c, 0xe0, 0x7e, 0xf9, 0x4a, 0x46, 0x15, 0x45, 0x58, 0xa5, + 0x8c, 0x4e, 0x2c, 0x18, 0x7e, 0xa5, 0x0c, 0x16, 0xae, 0x74, 0x6b, 0xb3, 0x94, 0x6f, 0x5b, 0xad, + 0xbb, 0x2a, 0xd2, 0x97, 0xff, 0xbf, 0x0c, 0x97, 0xdd, 0x11, 0x7f, 0xd8, 0xea, 0x7d, 0x7e, 0x7e, + 0x97, 0x9f, 0xff, 0x97, 0x33, 0x70, 0x52, 0xa5, 0x2d, 0xeb, 0x1e, 0xb5, 0x37, 0xaa, 0x96, 0x4e, + 0xaf, 0x51, 0x93, 0xda, 0x87, 0x35, 0xa2, 0x7e, 0x15, 0x33, 0x0b, 0x05, 0x8d, 0xb9, 0xe9, 0x50, + 0xfd, 0xe8, 0x64, 0x7d, 0x2a, 0x7f, 0x6d, 0x00, 0x94, 0x44, 0xab, 0xf7, 0xc8, 0x9a, 0x73, 0xa9, + 0x5b, 0x99, 0xfc, 0x41, 0x6d, 0x65, 0xfa, 0x77, 0xb7, 0x95, 0x29, 0xec, 0x76, 0x2b, 0x33, 0xb0, + 0x93, 0xad, 0xcc, 0x5a, 0x74, 0x2b, 0x33, 0x88, 0x5b, 0x99, 0x17, 0x7b, 0x6e, 0x65, 0xa6, 0x4d, + 0x7d, 0x8f, 0x1b, 0x99, 0x23, 0x9b, 0xcf, 0x7c, 0x2f, 0x3b, 0xb0, 0x8b, 0x6c, 0x52, 0x6c, 0x59, + 0xb6, 0x4e, 0x75, 0xb1, 0xf1, 0xc2, 0x53, 0x7f, 0x5b, 0xc0, 0x54, 0x1f, 0x1b, 0x4b, 0x0e, 0x3f, + 0xba, 0x93, 0xe4, 0xf0, 0x07, 0xb0, 0xff, 0xfa, 0x5c, 0x16, 0x26, 0xaa, 0xd4, 0x76, 0x79, 0x24, + 0xdb, 0x83, 0x70, 0xa8, 0xab, 0xc0, 0xb8, 0xc4, 0x10, 0x2d, 0xf2, 0x6c, 0xe0, 0x24, 0xd8, 0xa2, + 0xb6, 0x1b, 0xf5, 0x31, 0x8c, 0xd2, 0xb3, 0xea, 0xbd, 0x04, 0x8d, 0x62, 0xec, 0xfa, 0xd5, 0x7b, + 0x70, 0x2e, 0x48, 0x43, 0xfc, 0x52, 0x7d, 0x7a, 0xc9, 0x4f, 0x26, 0xbf, 0x07, 0x3f, 0x99, 0xaf, + 0x64, 0xe0, 0x82, 0x4a, 0x4d, 0xba, 0xae, 0x2d, 0xb7, 0xa9, 0xd4, 0x2c, 0xb1, 0x32, 0xb0, 0x59, + 0xc3, 0x70, 0xd6, 0x34, 0xb7, 0xb5, 0xba, 0x2f, 0x19, 0xcd, 0xc0, 0x88, 0x3c, 0x7f, 0xed, 0x62, + 0x6e, 0x0b, 0x95, 0x2b, 0x7f, 0x2d, 0x0f, 0x03, 0x93, 0x96, 0x7b, 0xdd, 0xda, 0x67, 0x12, 0xd0, + 0x60, 0xca, 0xcf, 0xee, 0xe2, 0xac, 0xe7, 0x79, 0xac, 0x5c, 0xca, 0xba, 0x81, 0x0e, 0xa8, 0xcb, + 0x56, 0x2c, 0x03, 0x8c, 0x47, 0xb6, 0xcb, 0xf4, 0x9f, 0xaf, 0xc0, 0x10, 0x06, 0xa0, 0x91, 0x4e, + 0x63, 0xd1, 0xbd, 0xdb, 0x65, 0xc0, 0x68, 0x1d, 0x01, 0x29, 0xf9, 0x78, 0x28, 0xf4, 0x6e, 0x61, + 0xff, 0xe9, 0x42, 0xe5, 0x28, 0xbc, 0x2f, 0xf2, 0x8b, 0x3c, 0x6c, 0x93, 0x94, 0x1c, 0x09, 0x4f, + 0x51, 0x22, 0x4d, 0xf2, 0x09, 0x0f, 0x30, 0x95, 0x67, 0x15, 0x46, 0x27, 0x2d, 0x57, 0x72, 0x25, + 0x1e, 0x0a, 0x5e, 0xa2, 0x32, 0xc9, 0x27, 0xfb, 0x11, 0x87, 0xcb, 0x94, 0xff, 0x2c, 0x0f, 0x23, + 0xde, 0xcf, 0x43, 0xd2, 0x9d, 0xe7, 0xa0, 0x30, 0x6b, 0x49, 0xb9, 0x4b, 0xd0, 0xfd, 0x78, 0xd5, + 0x72, 0x22, 0x7e, 0xd5, 0x82, 0x88, 0x49, 0x7d, 0xc1, 0xd2, 0x65, 0xe7, 0x79, 0x94, 0xba, 0x69, + 0xe9, 0xb1, 0x17, 0xcc, 0x3e, 0x21, 0xb9, 0x00, 0x79, 0x7c, 0x77, 0x20, 0x1d, 0xe4, 0x47, 0xde, + 0x1a, 0x20, 0x5e, 0xd2, 0xca, 0xc2, 0x6e, 0xb5, 0x72, 0x60, 0xaf, 0x5a, 0x39, 0x78, 0xb0, 0x5a, + 0xf9, 0x36, 0x8c, 0x60, 0x4d, 0x5e, 0x7a, 0xc9, 0xed, 0x17, 0xd6, 0xb3, 0x62, 0xed, 0x1b, 0xe5, + 0xed, 0x16, 0x49, 0x26, 0x71, 0xc9, 0x0b, 0xb1, 0x8a, 0xe8, 0x2e, 0xec, 0x63, 0x3b, 0xfd, 0x87, + 0x19, 0x18, 0xb8, 0x69, 0xde, 0x35, 0xad, 0xf5, 0xfd, 0x69, 0xdc, 0x8b, 0x30, 0x2c, 0xd8, 0x48, + 0xab, 0x0b, 0x3e, 0x4a, 0xef, 0x72, 0x70, 0x13, 0x39, 0xa9, 0x32, 0x15, 0x79, 0xc3, 0x2f, 0x84, + 0x4f, 0x8b, 0x72, 0x41, 0xf6, 0x1f, 0xaf, 0x50, 0x2b, 0x9c, 0xfe, 0x43, 0x26, 0x27, 0xe7, 0x21, + 0x3f, 0xc5, 0x9a, 0x2a, 0x85, 0x01, 0x66, 0x4d, 0x51, 0x11, 0x5a, 0xfe, 0x5c, 0x1e, 0xc6, 0x22, + 0x07, 0x5f, 0xcf, 0xc0, 0x90, 0x38, 0x78, 0x32, 0xbc, 0x7c, 0x24, 0xf8, 0xf4, 0xc8, 0x07, 0xaa, + 0x83, 0xfc, 0xcf, 0x9a, 0x4e, 0x3e, 0x0c, 0x03, 0x96, 0x83, 0x8b, 0x22, 0x7e, 0xcb, 0x58, 0x30, + 0x84, 0x16, 0x1b, 0xac, 0xed, 0x7c, 0x70, 0x08, 0x12, 0x59, 0x23, 0x2d, 0x07, 0x3f, 0xed, 0x25, + 0x18, 0xd2, 0x1c, 0x87, 0xba, 0x4d, 0x57, 0x5b, 0x91, 0x53, 0x94, 0xf8, 0x40, 0x79, 0x74, 0x20, + 0x70, 0x49, 0x5b, 0x21, 0x1f, 0x81, 0xd1, 0x96, 0x4d, 0x71, 0xd9, 0xd4, 0xda, 0xac, 0x95, 0x92, + 0x59, 0x1b, 0x42, 0xc8, 0xf7, 0x27, 0x01, 0xa2, 0xa6, 0x93, 0x5b, 0x30, 0x2a, 0x3e, 0x87, 0xfb, + 0xfd, 0xe3, 0x40, 0x1b, 0x0b, 0x96, 0x31, 0x2e, 0x12, 0xee, 0xf9, 0x2f, 0x9e, 0x7f, 0xc8, 0xe4, + 0x32, 0x5f, 0x5d, 0x22, 0x25, 0x8b, 0x40, 0xd6, 0xe9, 0x72, 0x53, 0xeb, 0xba, 0xab, 0xac, 0x2e, + 0x1e, 0x61, 0x5f, 0xe4, 0x6b, 0xc5, 0x37, 0x13, 0x71, 0xac, 0xfc, 0x94, 0x64, 0x9d, 0x2e, 0x57, + 0x42, 0x48, 0x72, 0x1b, 0x4e, 0xc5, 0x8b, 0xb0, 0x4f, 0xe6, 0x97, 0x03, 0x4f, 0x6e, 0x6d, 0x96, + 0x4a, 0x89, 0x04, 0x12, 0xdb, 0x13, 0x31, 0xb6, 0x35, 0xfd, 0x7a, 0x7e, 0x70, 0xa0, 0x38, 0xa8, + 0x8e, 0xb1, 0xb2, 0x9e, 0x09, 0x69, 0xe8, 0xe5, 0x6f, 0x66, 0x98, 0xa9, 0xc8, 0x3e, 0x08, 0xd3, + 0xdd, 0x33, 0x5d, 0x5f, 0xdb, 0xa5, 0xae, 0xaf, 0x05, 0xa9, 0x65, 0x0b, 0x4e, 0x8f, 0xd9, 0x55, + 0x15, 0x58, 0x72, 0x19, 0x0a, 0xba, 0x7c, 0x6a, 0x76, 0x3a, 0xdc, 0x09, 0x5e, 0x3d, 0xaa, 0xa0, + 0x22, 0x17, 0x21, 0xcf, 0x96, 0xac, 0xe8, 0x96, 0x59, 0xb6, 0x2e, 0x54, 0xa4, 0x28, 0x7f, 0x4f, + 0x16, 0x46, 0xa4, 0xaf, 0xb9, 0xba, 0xaf, 0xcf, 0x79, 0x6d, 0x67, 0xcd, 0xf4, 0x9c, 0x5e, 0x70, + 0x2f, 0xe5, 0x35, 0xf9, 0x25, 0x5f, 0x14, 0x3b, 0xba, 0x90, 0x12, 0x82, 0x79, 0x45, 0x7c, 0x68, + 0x61, 0xe7, 0xdb, 0x47, 0x46, 0x7f, 0x3d, 0x3f, 0x98, 0x2d, 0xe6, 0xae, 0xe7, 0x07, 0xf3, 0xc5, + 0x7e, 0x0c, 0x05, 0x86, 0xd1, 0xb7, 0xf9, 0xde, 0xdc, 0xbc, 0x63, 0xac, 0x1c, 0xf1, 0x97, 0x27, + 0x07, 0x1b, 0x26, 0x2d, 0x22, 0x9b, 0x23, 0xfe, 0x0c, 0xe5, 0x3d, 0x95, 0xcd, 0x71, 0x2a, 0x5a, + 0x21, 0x9b, 0x3f, 0xca, 0x80, 0x92, 0x28, 0x9b, 0xca, 0x21, 0xf9, 0x41, 0x1c, 0x5c, 0x42, 0xda, + 0x3f, 0xc9, 0xc2, 0x44, 0xcd, 0x74, 0xe9, 0x0a, 0xdf, 0x31, 0x1e, 0xf1, 0xa9, 0xe2, 0x06, 0x0c, + 0x4b, 0x1f, 0x23, 0xfa, 0xfc, 0x11, 0x7f, 0x3f, 0x1e, 0xa0, 0x52, 0x38, 0xc9, 0xa5, 0x0f, 0xee, + 0x1d, 0x4f, 0x54, 0xc8, 0x47, 0x7c, 0xce, 0x39, 0x1a, 0x42, 0x3e, 0xe2, 0x93, 0xd7, 0x03, 0x2a, + 0xe4, 0x2f, 0xe4, 0xe0, 0x44, 0x42, 0xe5, 0xe4, 0x02, 0x0c, 0x34, 0xba, 0xcb, 0x18, 0xf9, 0x2b, + 0x13, 0x78, 0x0c, 0x3b, 0xdd, 0x65, 0x0c, 0xfa, 0xa5, 0x7a, 0x48, 0xb2, 0x84, 0x4f, 0xf3, 0x17, + 0x6b, 0x53, 0x55, 0x21, 0xd5, 0xb2, 0x14, 0x64, 0x80, 0x81, 0x93, 0xbe, 0xcc, 0x7f, 0xbe, 0x6f, + 0x19, 0x7a, 0x2b, 0xf2, 0x7c, 0x9f, 0x95, 0x21, 0xdf, 0x05, 0x43, 0x95, 0x77, 0xbb, 0x36, 0x45, + 0xbe, 0x5c, 0xe2, 0x4f, 0xf9, 0x7c, 0x3d, 0x44, 0x12, 0x67, 0x1e, 0x89, 0x80, 0x51, 0x44, 0x79, + 0x07, 0x0c, 0xc9, 0x22, 0x14, 0xae, 0x19, 0xee, 0x6c, 0x77, 0x59, 0xf4, 0x82, 0x1f, 0x1d, 0x8c, + 0x43, 0x93, 0xf8, 0xe2, 0xae, 0x9c, 0x47, 0x39, 0x96, 0xf7, 0x40, 0xbc, 0x00, 0x99, 0x83, 0xfe, + 0xca, 0xed, 0x86, 0x5a, 0x11, 0x3d, 0xf1, 0xb8, 0x1c, 0x67, 0xa1, 0x92, 0xca, 0x0e, 0x5f, 0x8d, + 0x6b, 0x72, 0x1e, 0x24, 0xa4, 0x2f, 0xff, 0x60, 0x06, 0xce, 0xa5, 0x0b, 0x8f, 0x3c, 0x0f, 0x03, + 0xaa, 0xd5, 0xa6, 0x15, 0x75, 0x41, 0xf4, 0x0c, 0xcf, 0x2d, 0x6d, 0xb5, 0x69, 0x53, 0xb3, 0xe5, + 0xbd, 0x88, 0x47, 0x46, 0x3e, 0x04, 0xc3, 0x35, 0xc7, 0xe9, 0x52, 0xbb, 0xf1, 0xe2, 0x4d, 0xb5, + 0x26, 0xb6, 0xac, 0xb8, 0x25, 0x32, 0x10, 0xdc, 0x74, 0x5e, 0x8c, 0x84, 0x1e, 0x93, 0xe9, 0xcb, + 0x3f, 0x90, 0x81, 0xf3, 0xbd, 0x84, 0x4e, 0x5e, 0x84, 0xc1, 0x25, 0x6a, 0x6a, 0xa6, 0x5b, 0x9b, + 0x12, 0x4d, 0xc2, 0x1d, 0xa0, 0x8b, 0xb0, 0xf0, 0x46, 0xc6, 0x27, 0x64, 0x85, 0xf8, 0xb1, 0xa7, + 0xef, 0x67, 0xc1, 0x8f, 0x68, 0x11, 0x16, 0x29, 0xe4, 0x11, 0x96, 0x3f, 0x0e, 0x67, 0x53, 0xfb, + 0x88, 0x7c, 0x18, 0x46, 0x16, 0xed, 0x15, 0xcd, 0x34, 0xde, 0xe5, 0x43, 0x2c, 0x13, 0xec, 0xb2, + 0x2d, 0x09, 0x2e, 0xef, 0xfc, 0x64, 0xfa, 0xf2, 0x32, 0x28, 0x69, 0x1d, 0x46, 0x66, 0x60, 0x0c, + 0x83, 0x53, 0x57, 0xcc, 0xd6, 0xaa, 0x65, 0x07, 0xb2, 0xc7, 0x87, 0x59, 0x2e, 0xc3, 0x34, 0x35, + 0x44, 0x45, 0xfa, 0x20, 0x52, 0xaa, 0xfc, 0xbb, 0x59, 0x18, 0xa9, 0xb7, 0xbb, 0x2b, 0x86, 0xb4, + 0x30, 0xef, 0x79, 0x3f, 0xe3, 0xed, 0x2e, 0xb2, 0xbb, 0xdb, 0x5d, 0xb0, 0xe9, 0xcc, 0xde, 0xe3, + 0x74, 0xe6, 0x95, 0x23, 0x6f, 0x40, 0xa1, 0x83, 0xdf, 0x11, 0x3d, 0xe9, 0xe6, 0x5f, 0x97, 0x76, + 0xd2, 0xcd, 0xcb, 0xb0, 0xf9, 0xab, 0xb5, 0x8f, 0xf9, 0x2b, 0x28, 0x2b, 0x09, 0x34, 0x58, 0x84, + 0x8f, 0x05, 0x7a, 0x20, 0x02, 0x0d, 0x16, 0xdc, 0x63, 0x81, 0xee, 0x43, 0xa0, 0x5f, 0xcb, 0xc2, + 0x58, 0xb8, 0x4a, 0xf2, 0x3c, 0x0c, 0xf3, 0x6a, 0xf8, 0xb9, 0x5b, 0x46, 0x72, 0xda, 0x0e, 0xc0, + 0x2a, 0xf0, 0x1f, 0xe2, 0x00, 0x71, 0x7c, 0x55, 0x73, 0x9a, 0xc1, 0x09, 0x18, 0xbf, 0x1f, 0x1f, + 0xe4, 0x9e, 0x66, 0x11, 0x94, 0x3a, 0xb6, 0xaa, 0x39, 0xd5, 0xe0, 0x37, 0x99, 0x06, 0x62, 0xd3, + 0xae, 0x43, 0xc3, 0x0c, 0xf2, 0xc8, 0x80, 0xaf, 0x1e, 0x31, 0xac, 0x3a, 0xc1, 0x61, 0x32, 0x9b, + 0x4f, 0xf8, 0xcd, 0x46, 0x65, 0xe8, 0xef, 0x7d, 0x8a, 0xfc, 0xe4, 0xd6, 0x66, 0xe9, 0x94, 0x44, + 0x9f, 0x7c, 0x8c, 0xcc, 0x09, 0xa6, 0x34, 0x57, 0xe3, 0x87, 0x1e, 0x5e, 0x07, 0x94, 0xff, 0xed, + 0x67, 0x32, 0xd0, 0xbf, 0x68, 0xd2, 0xc5, 0x3b, 0xe4, 0x05, 0x18, 0x62, 0x1a, 0x33, 0x67, 0xb1, + 0xce, 0xcc, 0x08, 0x07, 0x15, 0x49, 0x95, 0x10, 0x31, 0xdb, 0xa7, 0x06, 0x54, 0xe4, 0x25, 0x80, + 0xe0, 0x0d, 0x9f, 0x50, 0x3f, 0x22, 0x97, 0xe1, 0x98, 0xd9, 0x3e, 0x55, 0xa2, 0xf3, 0x4a, 0x89, + 0x17, 0x50, 0xb9, 0x78, 0x29, 0x8e, 0xf1, 0x4a, 0x89, 0x01, 0x32, 0x07, 0x84, 0xfd, 0xaa, 0x6b, + 0x8e, 0xb3, 0x6e, 0xd9, 0x7a, 0x75, 0x55, 0x33, 0x57, 0x68, 0x74, 0x7b, 0x1a, 0xa7, 0x98, 0xed, + 0x53, 0x13, 0xca, 0x91, 0xd7, 0x60, 0x44, 0xf6, 0xd8, 0x8d, 0x7a, 0xd5, 0xc8, 0xb8, 0xd9, 0x3e, + 0x35, 0x44, 0x4b, 0x3e, 0x00, 0xc3, 0xe2, 0xf7, 0x75, 0x4b, 0x5c, 0xd9, 0x4b, 0xa1, 0xa2, 0x24, + 0xd4, 0x6c, 0x9f, 0x2a, 0x53, 0x4a, 0x95, 0xd6, 0x6d, 0xc3, 0x74, 0xc5, 0x23, 0xf0, 0x68, 0xa5, + 0x88, 0x93, 0x2a, 0xc5, 0xdf, 0xe4, 0x43, 0x30, 0xea, 0xc7, 0xe0, 0x7a, 0x87, 0xb6, 0x5c, 0x71, + 0xbb, 0x70, 0x2a, 0x52, 0x98, 0x23, 0x67, 0xfb, 0xd4, 0x30, 0x35, 0xb9, 0x08, 0x05, 0x95, 0x3a, + 0xc6, 0xbb, 0xde, 0x7d, 0xfc, 0x98, 0x34, 0xd0, 0x8d, 0x77, 0x99, 0x94, 0x04, 0x9e, 0xf5, 0x4e, + 0xe0, 0x00, 0x20, 0xee, 0x02, 0x48, 0xa4, 0x96, 0x69, 0x53, 0x67, 0xbd, 0x23, 0x79, 0x7f, 0x7c, + 0x24, 0x88, 0x4c, 0x26, 0x12, 0xf3, 0x0e, 0x47, 0x43, 0x40, 0xc8, 0xd8, 0xd9, 0x3e, 0x35, 0x42, + 0x2f, 0x49, 0x75, 0xca, 0x70, 0xee, 0x8a, 0x88, 0xb2, 0x51, 0xa9, 0x32, 0x94, 0x24, 0x55, 0xf6, + 0x53, 0xaa, 0x7a, 0x81, 0xba, 0xeb, 0x96, 0x7d, 0x57, 0xc4, 0x8f, 0x8d, 0x56, 0x2d, 0xb0, 0x52, + 0xd5, 0x02, 0x22, 0x57, 0xcd, 0x46, 0xdc, 0x58, 0x72, 0xd5, 0x9a, 0xab, 0xc9, 0x55, 0xf3, 0xa3, + 0x4e, 0xaf, 0x93, 0xe6, 0xa8, 0x76, 0x8f, 0x2a, 0xe3, 0x89, 0x1d, 0x8a, 0x38, 0xa9, 0x43, 0xf1, + 0x37, 0xab, 0x54, 0xca, 0xda, 0xaf, 0x14, 0xc3, 0x95, 0x4a, 0x28, 0x56, 0xa9, 0x9c, 0xdf, 0xff, + 0x25, 0x39, 0x35, 0xbc, 0x32, 0x11, 0xee, 0xa0, 0x00, 0xc3, 0x3a, 0x48, 0x4a, 0x21, 0x5f, 0xc2, + 0xb4, 0xd3, 0x0a, 0x41, 0xf2, 0x61, 0xbf, 0x85, 0xd5, 0xfa, 0x6c, 0x9f, 0x8a, 0x09, 0xa9, 0xcb, + 0x3c, 0xa1, 0xb9, 0x72, 0x02, 0x29, 0x46, 0x3c, 0x0a, 0x06, 0x9b, 0xed, 0x53, 0x79, 0xb2, 0xf3, + 0x17, 0xa4, 0xa4, 0x8f, 0xca, 0xc9, 0xf0, 0x14, 0xe1, 0x23, 0xd8, 0x14, 0x11, 0xa4, 0x86, 0x9c, + 0x89, 0xa7, 0x36, 0x54, 0x4e, 0x85, 0xd7, 0x9a, 0x28, 0x7e, 0xb6, 0x4f, 0x8d, 0xa7, 0x43, 0xfc, + 0x40, 0x28, 0xdb, 0x9f, 0x72, 0x3a, 0x12, 0x9f, 0x2d, 0x40, 0x31, 0x71, 0xc9, 0x79, 0x01, 0x17, + 0xe1, 0x04, 0x4f, 0x16, 0x2c, 0x22, 0xac, 0x89, 0xc9, 0xea, 0x4c, 0x78, 0x67, 0x98, 0x40, 0x32, + 0xdb, 0xa7, 0x26, 0x95, 0x24, 0xd5, 0x58, 0xce, 0x3d, 0x45, 0x09, 0x3b, 0x1f, 0x45, 0xd0, 0xb3, + 0x7d, 0x6a, 0x2c, 0x4b, 0xdf, 0x4b, 0x72, 0xb2, 0x3b, 0xe5, 0x6c, 0xb8, 0x13, 0x03, 0x0c, 0xeb, + 0x44, 0x29, 0x29, 0xde, 0x4b, 0x72, 0x02, 0x34, 0xe5, 0x5c, 0xbc, 0x54, 0x30, 0x73, 0x4a, 0x89, + 0xd2, 0xd4, 0xe4, 0x9c, 0x4e, 0xca, 0x23, 0x22, 0xb3, 0xb3, 0x28, 0x9f, 0x44, 0x33, 0xdb, 0xa7, + 0x26, 0xe7, 0x83, 0x52, 0x93, 0x93, 0x21, 0x29, 0xe7, 0x7b, 0xf1, 0xf4, 0x5b, 0x97, 0x9c, 0x48, + 0x49, 0xeb, 0x91, 0x9a, 0x46, 0x79, 0x34, 0xbc, 0x87, 0x4c, 0x25, 0x9c, 0xed, 0x53, 0x7b, 0x24, + 0xb8, 0xb9, 0x99, 0x92, 0x27, 0x46, 0x79, 0x2c, 0x9c, 0xd8, 0x3d, 0x91, 0x68, 0xb6, 0x4f, 0x4d, + 0xc9, 0x32, 0x73, 0x33, 0x25, 0x8d, 0x88, 0x52, 0xea, 0xc9, 0xd6, 0x97, 0x47, 0x4a, 0x12, 0x92, + 0xc5, 0xc4, 0x0c, 0x1c, 0xca, 0xe3, 0x61, 0xd5, 0x4d, 0x20, 0x61, 0xaa, 0x9b, 0x94, 0xbb, 0x63, + 0x31, 0x31, 0x65, 0x84, 0xf2, 0x44, 0x0f, 0x86, 0x7e, 0x1b, 0x13, 0x93, 0x4d, 0x2c, 0x26, 0xe6, + 0x6c, 0x50, 0xca, 0x61, 0x86, 0x09, 0x24, 0x8c, 0x61, 0x52, 0xb6, 0x87, 0xc5, 0xc4, 0xd0, 0xfe, + 0xca, 0x93, 0x3d, 0x18, 0x06, 0x2d, 0x4c, 0x4a, 0x0a, 0xf0, 0x81, 0x50, 0x6c, 0x7d, 0xe5, 0xa9, + 0xf0, 0xbc, 0x21, 0xa1, 0xd8, 0xbc, 0x21, 0x47, 0xe1, 0xaf, 0xc6, 0x02, 0xff, 0x2a, 0x4f, 0x87, + 0x87, 0x79, 0x04, 0xcd, 0x86, 0x79, 0x34, 0x54, 0x70, 0x35, 0x16, 0x00, 0x55, 0xb9, 0x90, 0xc6, + 0x04, 0xd1, 0x61, 0x26, 0x3c, 0x64, 0x6a, 0x2d, 0x21, 0x02, 0xa7, 0xf2, 0xbe, 0xb0, 0xe3, 0x7c, + 0x8c, 0x60, 0xb6, 0x4f, 0x4d, 0x88, 0xdb, 0xa9, 0x26, 0x87, 0x9b, 0x52, 0x2e, 0x86, 0x87, 0x6d, + 0x12, 0x0d, 0x1b, 0xb6, 0x89, 0xa1, 0xaa, 0xe6, 0x92, 0x5e, 0xf7, 0x28, 0x97, 0xc2, 0x86, 0x59, + 0x9c, 0x82, 0x19, 0x66, 0x09, 0xaf, 0x82, 0xd4, 0xe4, 0x20, 0x46, 0xca, 0x33, 0x3d, 0x5b, 0x88, + 0x34, 0x09, 0x2d, 0xe4, 0x31, 0x7d, 0x02, 0xdb, 0xe9, 0x66, 0xa7, 0x6d, 0x69, 0xba, 0xf2, 0xfe, + 0x44, 0xdb, 0x89, 0x23, 0x25, 0xdb, 0x89, 0x03, 0xd8, 0x2a, 0x2f, 0x3f, 0x22, 0x51, 0x9e, 0x0d, + 0xaf, 0xf2, 0x32, 0x8e, 0xad, 0xf2, 0xa1, 0x07, 0x27, 0xd5, 0xd8, 0x83, 0x0b, 0xe5, 0xb9, 0xb0, + 0x02, 0x44, 0xd0, 0x4c, 0x01, 0xa2, 0x4f, 0x34, 0x3e, 0x99, 0xfe, 0x44, 0x41, 0xb9, 0x1c, 0x3e, + 0x0b, 0x4b, 0xa3, 0x9b, 0xed, 0x53, 0xd3, 0x9f, 0x39, 0xd4, 0x12, 0x5e, 0x1c, 0x28, 0x57, 0xc2, + 0x0a, 0x16, 0x23, 0x60, 0x0a, 0x16, 0x7f, 0xa7, 0x50, 0x4b, 0x78, 0x32, 0xa0, 0x3c, 0x9f, 0xca, + 0xca, 0xff, 0xe6, 0x84, 0x87, 0x06, 0x2f, 0xc9, 0x3e, 0xff, 0xca, 0x0b, 0xe1, 0xc5, 0x2e, 0xc0, + 0xb0, 0xc5, 0x4e, 0x7a, 0x1b, 0xf0, 0x92, 0xec, 0xed, 0xae, 0x5c, 0x8d, 0x97, 0x0a, 0x96, 0x48, + 0xc9, 0x2b, 0x5e, 0x4d, 0x76, 0x12, 0x57, 0x5e, 0x0c, 0x6b, 0x5d, 0x12, 0x0d, 0xd3, 0xba, 0x44, + 0x07, 0xf3, 0x99, 0xb8, 0xaf, 0xb7, 0xf2, 0x52, 0x74, 0x97, 0x1d, 0xc6, 0x33, 0xcb, 0x27, 0xe6, + 0x1f, 0xfe, 0x91, 0x68, 0x2c, 0x44, 0xe5, 0xe5, 0xc8, 0xbd, 0x7a, 0x08, 0xcb, 0xec, 0xdb, 0x48, + 0xec, 0xc4, 0x8f, 0x44, 0xc3, 0x07, 0x2a, 0xaf, 0x24, 0x73, 0xf0, 0x75, 0x25, 0x1a, 0x6e, 0xf0, + 0x23, 0xd1, 0x88, 0x7b, 0xca, 0x07, 0x92, 0x39, 0xf8, 0xd2, 0x8d, 0x46, 0xe8, 0x7b, 0x41, 0xca, + 0x01, 0xa0, 0x7c, 0x30, 0x6c, 0x3a, 0xfa, 0x08, 0x66, 0x3a, 0x06, 0x99, 0x02, 0x5e, 0x90, 0x62, + 0xe7, 0x2b, 0xaf, 0xc6, 0x8a, 0xf8, 0x8d, 0x95, 0x22, 0xec, 0xbf, 0x20, 0xc5, 0x9c, 0x57, 0x5e, + 0x8b, 0x15, 0xf1, 0x5b, 0x27, 0x45, 0xa6, 0xd7, 0x7b, 0x3d, 0x10, 0x56, 0x5e, 0x0f, 0x9f, 0xb6, + 0xa7, 0x53, 0xce, 0xf6, 0xa9, 0xbd, 0x1e, 0x1a, 0x7f, 0x32, 0xdd, 0x73, 0x5e, 0x79, 0x23, 0x3c, + 0x84, 0xd3, 0xe8, 0xd8, 0x10, 0x4e, 0xf5, 0xbe, 0xff, 0x50, 0x24, 0x58, 0x88, 0xf2, 0xa1, 0xf0, + 0x14, 0x17, 0x42, 0xb2, 0x29, 0x2e, 0x1a, 0x5a, 0x24, 0x14, 0x05, 0x43, 0xf9, 0x70, 0x78, 0x8a, + 0x93, 0x71, 0x6c, 0x8a, 0x0b, 0x45, 0xcc, 0xa8, 0xc6, 0x82, 0x33, 0x28, 0x6f, 0x86, 0xa7, 0xb8, + 0x08, 0x9a, 0x4d, 0x71, 0xd1, 0x70, 0x0e, 0x1f, 0x8a, 0xc4, 0x28, 0x50, 0x3e, 0x92, 0xdc, 0x7e, + 0x44, 0xca, 0xed, 0xe7, 0x11, 0x0d, 0xd4, 0xe4, 0xc7, 0xf6, 0x4a, 0x25, 0x3c, 0x7e, 0x93, 0x68, + 0xd8, 0xf8, 0x4d, 0x7c, 0xa8, 0x1f, 0xdd, 0x38, 0x08, 0xad, 0x9a, 0xec, 0xb1, 0x71, 0x08, 0x4c, + 0x91, 0x04, 0x70, 0x68, 0x8f, 0xcc, 0x37, 0x42, 0xd5, 0x94, 0x3d, 0xb2, 0xb7, 0x0d, 0x8a, 0xd0, + 0xb3, 0xd9, 0x35, 0xe6, 0xc8, 0xad, 0x4c, 0x85, 0x67, 0xd7, 0x18, 0x01, 0x9b, 0x5d, 0xe3, 0xee, + 0xdf, 0x33, 0x50, 0x14, 0x5a, 0xc4, 0xfd, 0xd3, 0x0d, 0x73, 0x45, 0x99, 0x8e, 0x3c, 0x68, 0x8d, + 0xe0, 0xd9, 0xec, 0x14, 0x85, 0xe1, 0x7a, 0xcd, 0x61, 0xd5, 0xb6, 0xd1, 0x59, 0xb6, 0x34, 0x5b, + 0x6f, 0x50, 0x53, 0x57, 0x66, 0x22, 0xeb, 0x75, 0x02, 0x0d, 0xae, 0xd7, 0x09, 0x70, 0x8c, 0xc1, + 0x17, 0x81, 0xab, 0xb4, 0x45, 0x8d, 0x7b, 0x54, 0xb9, 0x86, 0x6c, 0x4b, 0x69, 0x6c, 0x05, 0xd9, + 0x6c, 0x9f, 0x9a, 0xc6, 0x81, 0xd9, 0xea, 0xf3, 0x1b, 0x8d, 0x8f, 0xce, 0xf9, 0xf1, 0x1d, 0xea, + 0x36, 0xed, 0x68, 0x36, 0x55, 0x66, 0xc3, 0xb6, 0x7a, 0x22, 0x11, 0xb3, 0xd5, 0x13, 0x11, 0x71, + 0xb6, 0xde, 0x58, 0xa8, 0xf5, 0x62, 0x1b, 0x8c, 0x88, 0xe4, 0xd2, 0x6c, 0x76, 0x0a, 0x23, 0x98, + 0x80, 0xe6, 0x2c, 0x73, 0x05, 0x4f, 0x2a, 0xae, 0x87, 0x67, 0xa7, 0x74, 0x4a, 0x36, 0x3b, 0xa5, + 0x63, 0x99, 0xaa, 0x87, 0xb1, 0x7c, 0x0c, 0xde, 0x08, 0xab, 0x7a, 0x02, 0x09, 0x53, 0xf5, 0x04, + 0x70, 0x9c, 0xa1, 0x4a, 0x1d, 0xea, 0x2a, 0x73, 0xbd, 0x18, 0x22, 0x49, 0x9c, 0x21, 0x82, 0xe3, + 0x0c, 0x67, 0xa8, 0xdb, 0x5a, 0x55, 0xe6, 0x7b, 0x31, 0x44, 0x92, 0x38, 0x43, 0x04, 0xb3, 0xcd, + 0x66, 0x18, 0x3c, 0xd9, 0x6d, 0xdf, 0xf5, 0xfa, 0x6c, 0x21, 0xbc, 0xd9, 0x4c, 0x25, 0x64, 0x9b, + 0xcd, 0x54, 0x24, 0xf9, 0x81, 0x1d, 0x3f, 0x34, 0x50, 0x16, 0xb1, 0xc2, 0xcb, 0x81, 0x5d, 0xb0, + 0x93, 0x52, 0xb3, 0x7d, 0xea, 0x4e, 0x1f, 0x32, 0xbc, 0xdf, 0xf7, 0xca, 0x55, 0xea, 0x58, 0xd5, + 0xb8, 0x7f, 0x56, 0xc1, 0xc1, 0xb3, 0x7d, 0xaa, 0xef, 0xb7, 0xfb, 0x01, 0x18, 0xc6, 0x8f, 0xaa, + 0x99, 0x86, 0x3b, 0x35, 0xa9, 0x7c, 0x34, 0xbc, 0x65, 0x92, 0x50, 0x6c, 0xcb, 0x24, 0xfd, 0x64, + 0x93, 0x38, 0xfe, 0xe4, 0x53, 0xcc, 0xd4, 0xa4, 0xa2, 0x86, 0x27, 0xf1, 0x10, 0x92, 0x4d, 0xe2, + 0x21, 0x80, 0x5f, 0xef, 0x94, 0x6d, 0x75, 0xa6, 0x26, 0x95, 0x46, 0x42, 0xbd, 0x1c, 0xe5, 0xd7, + 0xcb, 0x7f, 0xfa, 0xf5, 0x36, 0x56, 0xbb, 0xee, 0x14, 0xfb, 0xc6, 0xa5, 0x84, 0x7a, 0x3d, 0xa4, + 0x5f, 0xaf, 0x07, 0x60, 0x53, 0x21, 0x02, 0xea, 0xb6, 0xc5, 0x26, 0xed, 0x1b, 0x46, 0xbb, 0xad, + 0xdc, 0x0c, 0x4f, 0x85, 0x51, 0x3c, 0x9b, 0x0a, 0xa3, 0x30, 0x66, 0x7a, 0xf2, 0x56, 0xd1, 0xe5, + 0xee, 0x8a, 0x72, 0x2b, 0x6c, 0x7a, 0x06, 0x18, 0x66, 0x7a, 0x06, 0xbf, 0x70, 0x77, 0xc1, 0x7e, + 0xa9, 0xf4, 0x8e, 0x4d, 0x9d, 0x55, 0xe5, 0x76, 0x64, 0x77, 0x21, 0xe1, 0x70, 0x77, 0x21, 0xfd, + 0x26, 0x2b, 0xf0, 0x48, 0x68, 0xa1, 0xf1, 0x6e, 0x6d, 0x1a, 0x54, 0xb3, 0x5b, 0xab, 0xca, 0x5b, + 0xc8, 0xea, 0xc9, 0xc4, 0xa5, 0x2a, 0x4c, 0x3a, 0xdb, 0xa7, 0xf6, 0xe2, 0x84, 0xdb, 0xf2, 0x8f, + 0xce, 0xf1, 0x40, 0xbd, 0x6a, 0xbd, 0xea, 0x6d, 0x42, 0xdf, 0x8e, 0x6c, 0xcb, 0xe3, 0x24, 0xb8, + 0x2d, 0x8f, 0x83, 0x49, 0x07, 0x1e, 0x8b, 0x6c, 0xd5, 0xe6, 0xb5, 0x36, 0xdb, 0x97, 0x50, 0xbd, + 0xae, 0xb5, 0xee, 0x52, 0x57, 0xf9, 0x18, 0xf2, 0xbe, 0x90, 0xb2, 0xe1, 0x8b, 0x50, 0xcf, 0xf6, + 0xa9, 0xdb, 0xf0, 0x23, 0x65, 0xc8, 0x37, 0x66, 0x96, 0xea, 0xca, 0xc7, 0xc3, 0xe7, 0x9b, 0x0c, + 0x36, 0xdb, 0xa7, 0x22, 0x8e, 0x59, 0x69, 0x37, 0x3b, 0x2b, 0xb6, 0xa6, 0x53, 0x6e, 0x68, 0xa1, + 0xed, 0x26, 0x0c, 0xd0, 0xef, 0x0a, 0x5b, 0x69, 0x69, 0x74, 0xcc, 0x4a, 0x4b, 0xc3, 0x31, 0x45, + 0x0d, 0xe5, 0xa4, 0x51, 0x3e, 0x11, 0x56, 0xd4, 0x10, 0x92, 0x29, 0x6a, 0x38, 0x83, 0xcd, 0x5b, + 0x70, 0xda, 0xdf, 0xcf, 0x8b, 0xf5, 0x97, 0x77, 0x9a, 0xf2, 0x49, 0xe4, 0xf3, 0x58, 0xec, 0x32, + 0x20, 0x44, 0x35, 0xdb, 0xa7, 0xa6, 0x94, 0x67, 0x2b, 0x6e, 0x2c, 0x67, 0x9b, 0x30, 0x2f, 0xbe, + 0x3b, 0xbc, 0xe2, 0xa6, 0x90, 0xb1, 0x15, 0x37, 0x05, 0x95, 0xc8, 0x5c, 0x08, 0x55, 0xdb, 0x86, + 0xb9, 0x2f, 0xd3, 0x34, 0x0e, 0x89, 0xcc, 0x85, 0xa5, 0xb6, 0xbc, 0x0d, 0x73, 0xdf, 0x5a, 0x4b, + 0xe3, 0x40, 0x2e, 0x42, 0xa1, 0xd1, 0x98, 0x57, 0xbb, 0xa6, 0xd2, 0x8a, 0xb8, 0x23, 0x23, 0x74, + 0xb6, 0x4f, 0x15, 0x78, 0x66, 0x06, 0x4d, 0xb7, 0x35, 0xc7, 0x35, 0x5a, 0x0e, 0x8e, 0x18, 0x6f, + 0x84, 0xe8, 0x61, 0x33, 0x28, 0x89, 0x86, 0x99, 0x41, 0x49, 0x70, 0x66, 0x2f, 0x56, 0x35, 0xc7, + 0xd1, 0x4c, 0xdd, 0xd6, 0x26, 0x71, 0x99, 0xa0, 0x91, 0xe7, 0x6e, 0x21, 0x2c, 0xb3, 0x17, 0xc3, + 0x10, 0x3c, 0x7c, 0xf7, 0x20, 0x9e, 0x99, 0x73, 0x27, 0x72, 0xf8, 0x1e, 0xc1, 0xe3, 0xe1, 0x7b, + 0x04, 0x86, 0x76, 0xa7, 0x07, 0x53, 0xe9, 0x8a, 0xc1, 0x44, 0xa4, 0xac, 0x44, 0xec, 0xce, 0x28, + 0x01, 0xda, 0x9d, 0x51, 0x60, 0xa8, 0x49, 0xde, 0x72, 0xbb, 0x9a, 0xd2, 0xa4, 0x60, 0x95, 0x8d, + 0x95, 0x61, 0xeb, 0x77, 0x30, 0x38, 0xa6, 0x36, 0x4c, 0x6d, 0xcd, 0x9a, 0x9a, 0xf4, 0xa4, 0x6e, + 0x84, 0xd7, 0xef, 0x54, 0x42, 0xb6, 0x7e, 0xa7, 0x22, 0xd9, 0xec, 0xea, 0x6d, 0xb4, 0x56, 0x35, + 0x9b, 0xea, 0x53, 0x86, 0x8d, 0x27, 0x8b, 0x1b, 0x7c, 0x6b, 0xf8, 0x4e, 0x78, 0x76, 0xed, 0x41, + 0xca, 0x66, 0xd7, 0x1e, 0x68, 0x66, 0xe4, 0x25, 0xa3, 0x55, 0xaa, 0xe9, 0xca, 0xdd, 0xb0, 0x91, + 0x97, 0x4e, 0xc9, 0x8c, 0xbc, 0x74, 0x6c, 0xfa, 0xe7, 0xdc, 0xb6, 0x0d, 0x97, 0x2a, 0xed, 0x9d, + 0x7c, 0x0e, 0x92, 0xa6, 0x7f, 0x0e, 0xa2, 0xd9, 0x86, 0x30, 0xda, 0x21, 0x6b, 0xe1, 0x0d, 0x61, + 0xbc, 0x1b, 0xa2, 0x25, 0x98, 0xc5, 0x22, 0x5e, 0x3d, 0x2a, 0x66, 0xd8, 0x62, 0x11, 0x60, 0x66, + 0xb1, 0x04, 0xef, 0x22, 0x43, 0x6f, 0xdd, 0x14, 0x2b, 0xbc, 0x86, 0xca, 0x38, 0xb6, 0x86, 0x86, + 0xde, 0xc5, 0x7d, 0x20, 0xf4, 0x90, 0x43, 0xe9, 0x84, 0xad, 0x0e, 0x09, 0xc5, 0xac, 0x0e, 0xf9, + 0xc9, 0x47, 0x15, 0xc6, 0xf1, 0x16, 0x5c, 0xed, 0xfa, 0xf7, 0x38, 0x9f, 0x0a, 0x7f, 0x66, 0x04, + 0xcd, 0x3e, 0x33, 0x02, 0x0a, 0x31, 0x11, 0xd3, 0x96, 0x9d, 0xc2, 0x24, 0x38, 0x1f, 0x8c, 0x80, + 0xc8, 0x1c, 0x90, 0x46, 0x65, 0x7e, 0xae, 0xa6, 0xd7, 0xe5, 0x2b, 0x32, 0x27, 0x7c, 0x02, 0x1b, + 0xa7, 0x98, 0xed, 0x53, 0x13, 0xca, 0x91, 0x77, 0xe0, 0xbc, 0x80, 0x8a, 0x27, 0xed, 0x75, 0xdb, + 0xba, 0x67, 0xe8, 0xfe, 0x82, 0xe0, 0x86, 0x1d, 0x05, 0x7b, 0xd1, 0xce, 0xf6, 0xa9, 0x3d, 0x79, + 0xa5, 0xd7, 0x25, 0xd6, 0x87, 0xee, 0x4e, 0xea, 0xf2, 0x17, 0x89, 0x9e, 0xbc, 0xd2, 0xeb, 0x12, + 0x72, 0xbf, 0xb7, 0x93, 0xba, 0xfc, 0x4e, 0xe8, 0xc9, 0x8b, 0x38, 0x50, 0xea, 0x85, 0xaf, 0xb4, + 0xdb, 0xca, 0x3a, 0x56, 0xf7, 0xbe, 0x9d, 0x54, 0x57, 0x41, 0x83, 0x73, 0x3b, 0x8e, 0x6c, 0x96, + 0x5e, 0xec, 0x50, 0xb3, 0x11, 0x5a, 0x80, 0xee, 0x87, 0x67, 0xe9, 0x18, 0x01, 0x9b, 0xa5, 0x63, + 0x40, 0x36, 0xa0, 0xe4, 0xf7, 0x40, 0xca, 0x46, 0x78, 0x40, 0xc9, 0x38, 0x36, 0xa0, 0x42, 0x6f, + 0x87, 0x16, 0xe1, 0xc4, 0xe2, 0x5d, 0x57, 0xf3, 0x2c, 0x48, 0x47, 0x74, 0xe5, 0xbb, 0x91, 0x4b, + 0xa6, 0x38, 0x09, 0x5e, 0x32, 0xc5, 0xc1, 0x6c, 0x8c, 0x30, 0x70, 0x63, 0xc3, 0x6c, 0xcd, 0x68, + 0x46, 0xbb, 0x6b, 0x53, 0xe5, 0x2f, 0x84, 0xc7, 0x48, 0x04, 0xcd, 0xc6, 0x48, 0x04, 0xc4, 0x16, + 0x68, 0x06, 0xaa, 0x38, 0x8e, 0xb1, 0x62, 0x8a, 0x7d, 0x65, 0xb7, 0xed, 0x2a, 0xff, 0x51, 0x78, + 0x81, 0x4e, 0xa2, 0x61, 0x0b, 0x74, 0x12, 0x1c, 0x4f, 0x9d, 0x58, 0x2f, 0xb0, 0xc5, 0x43, 0xbe, + 0xab, 0xfc, 0x8f, 0x23, 0xa7, 0x4e, 0x09, 0x34, 0x78, 0xea, 0x94, 0x00, 0x67, 0xeb, 0x23, 0xb7, + 0xc9, 0xe6, 0x0c, 0xff, 0xae, 0xfa, 0x3f, 0x09, 0xaf, 0x8f, 0x51, 0x3c, 0x5b, 0x1f, 0xa3, 0xb0, + 0x30, 0x1f, 0xd1, 0x05, 0xff, 0x69, 0x1a, 0x1f, 0x5f, 0xfe, 0xb1, 0x32, 0xe4, 0x9a, 0xcc, 0x47, + 0x8c, 0x94, 0xef, 0xc9, 0xa4, 0x31, 0xf2, 0x87, 0x47, 0xac, 0x50, 0x98, 0x91, 0x4a, 0xef, 0x19, + 0x74, 0x5d, 0xf9, 0x74, 0x2a, 0x23, 0x4e, 0x10, 0x66, 0xc4, 0x61, 0xe4, 0x6d, 0x38, 0x1d, 0xc0, + 0xe6, 0xe9, 0xda, 0xb2, 0x3f, 0x33, 0xfd, 0xc5, 0x4c, 0xd8, 0x0c, 0x4e, 0x26, 0x63, 0x66, 0x70, + 0x32, 0x26, 0x89, 0xb5, 0x10, 0xdd, 0xf7, 0x6e, 0xc3, 0xda, 0x97, 0x60, 0x0a, 0x83, 0x24, 0xd6, + 0x42, 0x9a, 0x9f, 0xd9, 0x86, 0xb5, 0x2f, 0xd3, 0x14, 0x06, 0xe4, 0xb3, 0x19, 0xb8, 0x90, 0x8c, + 0xaa, 0xb4, 0xdb, 0x33, 0x96, 0x1d, 0xe0, 0x94, 0xbf, 0x94, 0x09, 0x1f, 0x34, 0xec, 0xac, 0xd8, + 0x6c, 0x9f, 0xba, 0xc3, 0x0a, 0xc8, 0x87, 0x61, 0xb4, 0xd2, 0xd5, 0x0d, 0x17, 0x2f, 0xde, 0x98, + 0xe1, 0xfc, 0x7d, 0x99, 0xc8, 0x16, 0x47, 0xc6, 0xe2, 0x16, 0x47, 0x06, 0x90, 0xeb, 0x30, 0xd1, + 0xa0, 0xad, 0xae, 0x6d, 0xb8, 0x1b, 0x2a, 0xed, 0x58, 0xb6, 0xcb, 0x78, 0x7c, 0x7f, 0x26, 0x3c, + 0x89, 0xc5, 0x28, 0xd8, 0x24, 0x16, 0x03, 0x92, 0x5b, 0xb1, 0x5b, 0x79, 0xd1, 0x99, 0x3f, 0x90, + 0xe9, 0x79, 0x2d, 0xef, 0xf7, 0x65, 0x72, 0x71, 0x52, 0x8f, 0xdc, 0xa2, 0x0b, 0xae, 0x9f, 0xcd, + 0xf4, 0xb8, 0x46, 0x97, 0x66, 0xb8, 0x38, 0x98, 0x71, 0x4c, 0xc8, 0xf2, 0xaf, 0xfc, 0xe5, 0x4c, + 0x8f, 0x6b, 0xef, 0x80, 0x63, 0x02, 0x98, 0xbc, 0xcc, 0x3d, 0x45, 0x04, 0xa3, 0xbf, 0x92, 0x89, + 0xbb, 0x8a, 0xf8, 0xe5, 0x25, 0x42, 0x56, 0xec, 0xa6, 0xe3, 0x2b, 0xfd, 0xe7, 0x32, 0x71, 0xdf, + 0xbc, 0xa0, 0x58, 0xf0, 0x8b, 0x50, 0x38, 0x37, 0x7d, 0xdf, 0xa5, 0xb6, 0xa9, 0xb5, 0xb1, 0x3b, + 0x1b, 0xae, 0x65, 0x6b, 0x2b, 0x74, 0xda, 0xd4, 0x96, 0xdb, 0x54, 0xf9, 0xc1, 0x4c, 0xd8, 0x82, + 0x4d, 0x27, 0x65, 0x16, 0x6c, 0x3a, 0x96, 0xac, 0xc2, 0x23, 0x49, 0xd8, 0x29, 0xc3, 0xc1, 0x7a, + 0x3e, 0x9f, 0x09, 0x9b, 0xb0, 0x3d, 0x68, 0x99, 0x09, 0xdb, 0x03, 0x4d, 0xae, 0xc2, 0xd0, 0xa4, + 0xe5, 0x4d, 0xbf, 0x3f, 0x14, 0x71, 0x86, 0xf4, 0x31, 0xb3, 0x7d, 0x6a, 0x40, 0x26, 0xca, 0x88, + 0x41, 0xfd, 0x85, 0x78, 0x99, 0xe0, 0xf2, 0xc9, 0xff, 0x21, 0xca, 0x08, 0x71, 0xff, 0x67, 0xf1, + 0x32, 0xc1, 0x1d, 0x97, 0xff, 0x83, 0xcd, 0x24, 0xbc, 0xc6, 0xf9, 0x99, 0x0a, 0xb3, 0xdb, 0xaa, + 0xab, 0x5a, 0xbb, 0x4d, 0xcd, 0x15, 0xaa, 0x7c, 0x31, 0x32, 0x93, 0x24, 0x93, 0xb1, 0x99, 0x24, + 0x19, 0x43, 0xbe, 0x0b, 0xce, 0xdc, 0xd2, 0xda, 0x86, 0x1e, 0xe0, 0xbc, 0x9c, 0xef, 0xca, 0x0f, + 0x67, 0xc2, 0xbb, 0xe9, 0x14, 0x3a, 0xb6, 0x9b, 0x4e, 0x41, 0x91, 0x79, 0x20, 0xb8, 0x8c, 0xfa, + 0xb3, 0x05, 0x5b, 0x9f, 0x95, 0xff, 0x3c, 0x13, 0xb6, 0x53, 0xe3, 0x24, 0xcc, 0x4e, 0x8d, 0x43, + 0x49, 0x33, 0x3d, 0xf7, 0x8a, 0xf2, 0x23, 0x99, 0xf0, 0x69, 0x4d, 0x1a, 0xe1, 0x6c, 0x9f, 0x9a, + 0x9e, 0xc0, 0xe5, 0x1a, 0x14, 0x1b, 0xf5, 0xda, 0xcc, 0xcc, 0x74, 0xe3, 0x56, 0x6d, 0x0a, 0x9f, + 0x6a, 0xe8, 0xca, 0x8f, 0x46, 0x56, 0xac, 0x28, 0x01, 0x5b, 0xb1, 0xa2, 0x30, 0xf2, 0x3a, 0x8c, + 0xb0, 0xf6, 0xb3, 0x01, 0x83, 0x9f, 0xfc, 0xa5, 0x4c, 0xd8, 0x9c, 0x92, 0x91, 0xcc, 0x9c, 0x92, + 0x7f, 0x93, 0x06, 0x9c, 0x64, 0x52, 0xac, 0xdb, 0xf4, 0x0e, 0xb5, 0xa9, 0xd9, 0xf2, 0xc6, 0xf4, + 0x8f, 0x65, 0xc2, 0x56, 0x46, 0x12, 0x11, 0xb3, 0x32, 0x92, 0xe0, 0xe4, 0x2e, 0x9c, 0x8f, 0x9e, + 0x04, 0xc9, 0xef, 0x7a, 0x95, 0xbf, 0x9a, 0x89, 0x18, 0xc3, 0x3d, 0x88, 0xd1, 0x18, 0xee, 0x81, + 0x27, 0x26, 0x3c, 0x2a, 0x8e, 0x55, 0x84, 0xc3, 0x65, 0xb4, 0xb6, 0x1f, 0xe7, 0xb5, 0x3d, 0x1d, + 0x38, 0x04, 0xf6, 0xa0, 0x9e, 0xed, 0x53, 0x7b, 0xb3, 0x63, 0x7a, 0x16, 0xcf, 0x30, 0xa2, 0xfc, + 0x44, 0x26, 0xd9, 0x23, 0x25, 0xe4, 0xa6, 0x9c, 0x94, 0x9a, 0xe4, 0xed, 0xb4, 0xfc, 0x18, 0xca, + 0x5f, 0x8b, 0x8c, 0xb7, 0x64, 0x32, 0x36, 0xde, 0x52, 0x12, 0x6c, 0x5c, 0x87, 0x09, 0xae, 0xd4, + 0x75, 0x0d, 0x87, 0xa1, 0xb9, 0x42, 0x75, 0xe5, 0xaf, 0x47, 0x56, 0xbb, 0x18, 0x05, 0xba, 0xf6, + 0x44, 0x81, 0x6c, 0xea, 0x6e, 0x74, 0x34, 0xd3, 0xc4, 0x63, 0x56, 0xe5, 0xbf, 0x88, 0x4c, 0xdd, + 0x01, 0x0a, 0x1d, 0x77, 0xfd, 0x5f, 0x4c, 0x13, 0x7a, 0xe5, 0x96, 0x52, 0xfe, 0xcb, 0x88, 0x26, + 0xf4, 0x22, 0x66, 0x9a, 0xd0, 0x33, 0x51, 0xd5, 0xad, 0x94, 0x37, 0xf6, 0xca, 0x97, 0x23, 0x2b, + 0x72, 0x22, 0x15, 0x5b, 0x91, 0x93, 0x9f, 0xe8, 0xdf, 0x4a, 0x79, 0x9f, 0xae, 0xfc, 0x64, 0x6f, + 0xbe, 0xc1, 0x4a, 0x9f, 0xfc, 0xbc, 0xfd, 0x56, 0xca, 0xdb, 0x6e, 0xe5, 0x6f, 0xf4, 0xe6, 0x1b, + 0x38, 0xf6, 0x25, 0x3f, 0x0d, 0x6f, 0xa6, 0xbf, 0x8b, 0x56, 0xfe, 0x66, 0x74, 0xea, 0x4a, 0x21, + 0xc4, 0xa9, 0x2b, 0xed, 0x71, 0xf5, 0x32, 0x9c, 0xe5, 0x1a, 0x72, 0xcd, 0xd6, 0x3a, 0xab, 0x0d, + 0xea, 0xba, 0x86, 0xb9, 0xe2, 0xed, 0xc4, 0xfe, 0xab, 0x4c, 0xe4, 0x78, 0x2c, 0x8d, 0x12, 0x8f, + 0xc7, 0xd2, 0x90, 0x4c, 0x79, 0x63, 0x2f, 0xa0, 0x95, 0xbf, 0x15, 0x51, 0xde, 0x18, 0x05, 0x53, + 0xde, 0xf8, 0xc3, 0xe9, 0xeb, 0x09, 0x0f, 0x7d, 0x95, 0xff, 0x3a, 0x9d, 0x97, 0xdf, 0xbe, 0x84, + 0xf7, 0xc1, 0xd7, 0x13, 0xde, 0xb3, 0x2a, 0xff, 0x4d, 0x3a, 0xaf, 0xc0, 0x07, 0x29, 0xfe, 0x0c, + 0xf6, 0x6d, 0x38, 0xcd, 0x67, 0xf3, 0x19, 0xaa, 0xd3, 0xd0, 0x87, 0xfe, 0x54, 0x64, 0xec, 0x27, + 0x93, 0xe1, 0x91, 0x7b, 0x22, 0x26, 0x89, 0xb5, 0x68, 0xeb, 0xdf, 0xde, 0x86, 0x75, 0xb0, 0x21, + 0x48, 0xc6, 0xb0, 0xf5, 0x46, 0x7e, 0xfd, 0xa6, 0xfc, 0x74, 0x64, 0xbd, 0x91, 0x91, 0xe8, 0xce, + 0x21, 0x3f, 0x95, 0x7b, 0x3d, 0xfc, 0xd2, 0x4b, 0xf9, 0x99, 0xc4, 0xc2, 0x7e, 0x07, 0x84, 0x9f, + 0x85, 0xbd, 0x1e, 0x7e, 0xd5, 0xa4, 0x7c, 0x25, 0xb1, 0xb0, 0xff, 0x01, 0xe1, 0x27, 0x50, 0x6c, + 0x8b, 0xd4, 0x75, 0x2d, 0xce, 0x2a, 0x34, 0x3d, 0xfc, 0x9d, 0xe8, 0x16, 0x29, 0x91, 0x0c, 0xb7, + 0x48, 0x89, 0x98, 0x24, 0xd6, 0xe2, 0xf3, 0x7e, 0x76, 0x1b, 0xd6, 0xd2, 0xc6, 0x2e, 0x11, 0x93, + 0xc4, 0x5a, 0x7c, 0xfc, 0x57, 0xb7, 0x61, 0x2d, 0x6d, 0xec, 0x12, 0x31, 0xcc, 0x1c, 0x0b, 0x30, + 0xb7, 0xa8, 0xed, 0x04, 0xea, 0xf7, 0xdf, 0x46, 0xcc, 0xb1, 0x14, 0x3a, 0x66, 0x8e, 0xa5, 0xa0, + 0x12, 0xb9, 0x0b, 0xa1, 0xfc, 0xdc, 0x76, 0xdc, 0x83, 0x7b, 0x99, 0x14, 0x54, 0x22, 0x77, 0x21, + 0x97, 0xbf, 0xbb, 0x1d, 0xf7, 0xe0, 0x62, 0x26, 0x05, 0xc5, 0x8c, 0xa2, 0x86, 0xab, 0xb9, 0x46, + 0x6b, 0xd6, 0x72, 0x5c, 0x69, 0x91, 0xff, 0xef, 0x22, 0x46, 0x51, 0x12, 0x11, 0x33, 0x8a, 0x92, + 0xe0, 0x71, 0xa6, 0x42, 0x1a, 0x5f, 0xeb, 0xc9, 0x34, 0xb0, 0xb4, 0x92, 0xe0, 0x71, 0xa6, 0x42, + 0x08, 0xff, 0x7d, 0x4f, 0xa6, 0x81, 0xa7, 0x7c, 0x12, 0x9c, 0x59, 0xa6, 0x55, 0xdb, 0x5a, 0x37, + 0xaf, 0xd3, 0x75, 0xda, 0x16, 0x9f, 0xfe, 0xf3, 0x11, 0xcb, 0x34, 0x4a, 0x80, 0xb7, 0x28, 0x11, + 0x58, 0x98, 0x91, 0xf8, 0xdc, 0x5f, 0x48, 0x65, 0x14, 0x1c, 0x13, 0x45, 0x61, 0x61, 0x46, 0xe2, + 0x13, 0x7f, 0x31, 0x95, 0x51, 0x70, 0x4c, 0x14, 0x85, 0x91, 0x0a, 0x8c, 0xe1, 0x5b, 0x09, 0xcd, + 0xf1, 0x3c, 0x3f, 0x7f, 0x35, 0x13, 0xbe, 0xf5, 0x0a, 0xa3, 0x67, 0xfb, 0xd4, 0x48, 0x01, 0x99, + 0x85, 0xf8, 0xa4, 0xaf, 0xa7, 0xb0, 0x08, 0xfc, 0x1d, 0xc3, 0x10, 0x99, 0x85, 0xf8, 0x98, 0xbf, + 0x97, 0xc2, 0x22, 0x70, 0x78, 0x0c, 0x43, 0xc8, 0x07, 0x61, 0xb8, 0x31, 0xb3, 0x54, 0xf7, 0xf2, + 0x1f, 0xfe, 0xfd, 0x4c, 0xe4, 0x55, 0x51, 0x80, 0xc3, 0x57, 0x45, 0xc1, 0x4f, 0xf2, 0x61, 0x18, + 0xad, 0x5a, 0xa6, 0xab, 0xb5, 0xbc, 0x0d, 0xe8, 0xaf, 0x45, 0xce, 0x50, 0x42, 0xd8, 0xd9, 0x3e, + 0x35, 0x4c, 0x2e, 0x95, 0x17, 0x6d, 0xff, 0xf5, 0xe4, 0xf2, 0x7e, 0xd3, 0xc3, 0xe4, 0x6c, 0x46, + 0xbb, 0x6d, 0xd9, 0x77, 0xdb, 0x96, 0xa6, 0x7b, 0x21, 0x37, 0x45, 0x43, 0xfe, 0x41, 0x64, 0x46, + 0x4b, 0x26, 0x63, 0x33, 0x5a, 0x32, 0x26, 0x89, 0xb5, 0xe8, 0xa2, 0xdf, 0xd8, 0x86, 0x75, 0x30, + 0x0f, 0x27, 0x63, 0x92, 0x58, 0x8b, 0xcf, 0xff, 0x87, 0xdb, 0xb0, 0x0e, 0xe6, 0xe1, 0x64, 0x0c, + 0x33, 0xad, 0xaf, 0x19, 0xae, 0xf7, 0xb0, 0xed, 0x1f, 0x45, 0x4c, 0xeb, 0x00, 0xc5, 0x4c, 0xeb, + 0xe0, 0x17, 0xa1, 0x70, 0xce, 0x7f, 0x2a, 0x19, 0xec, 0x5d, 0x6b, 0xe6, 0x3d, 0xb6, 0x3f, 0x56, + 0xfe, 0x71, 0xe4, 0x54, 0x24, 0x9d, 0x74, 0xb6, 0x4f, 0xed, 0xc1, 0x88, 0xd4, 0x23, 0x7e, 0x8a, + 0x3c, 0xa8, 0x9f, 0xf2, 0x4f, 0x32, 0x3d, 0x1c, 0x15, 0x39, 0x4d, 0xcc, 0x51, 0x91, 0x83, 0xc5, + 0x9c, 0xb5, 0xdc, 0xa6, 0x37, 0x17, 0x6a, 0x6f, 0x49, 0xb3, 0xeb, 0x37, 0xe2, 0x73, 0x56, 0x8c, + 0x48, 0xcc, 0x59, 0x31, 0x38, 0xf9, 0xde, 0x0c, 0x3c, 0x15, 0x95, 0xef, 0x5b, 0x2f, 0x3f, 0xff, + 0xaa, 0x4a, 0xef, 0x59, 0x2d, 0xd9, 0xb2, 0xfa, 0x4d, 0x5e, 0xcb, 0xb3, 0x69, 0xdd, 0x95, 0x54, + 0x68, 0xb6, 0x4f, 0xdd, 0x11, 0xf3, 0x1d, 0xb4, 0x42, 0x28, 0xcd, 0x6f, 0xed, 0xaa, 0x15, 0xbe, + 0x0a, 0xed, 0x88, 0xf9, 0x0e, 0x5a, 0x21, 0x46, 0xc5, 0x37, 0x77, 0xd5, 0x0a, 0x7f, 0x8c, 0xec, + 0x88, 0x39, 0xee, 0x3e, 0x6f, 0x37, 0x6a, 0x55, 0xdf, 0xd7, 0x67, 0xc3, 0x6c, 0x29, 0xbf, 0x1d, + 0xdd, 0x7d, 0x46, 0x29, 0x70, 0xf7, 0x19, 0x05, 0xb2, 0xe5, 0x7e, 0x96, 0x6a, 0x6d, 0xb6, 0x1d, + 0xa5, 0xad, 0xbb, 0x21, 0xe3, 0xed, 0x77, 0x22, 0xcb, 0x7d, 0x0a, 0x1d, 0x5b, 0xee, 0x53, 0x50, + 0x89, 0xdc, 0x85, 0x84, 0x7e, 0x77, 0x3b, 0xee, 0x81, 0xa9, 0x92, 0x82, 0x4a, 0xe4, 0x2e, 0xb4, + 0xe0, 0x7f, 0xd8, 0x8e, 0x7b, 0x60, 0xaa, 0xa4, 0xa0, 0xc8, 0x0f, 0x65, 0xe0, 0x62, 0x52, 0x77, + 0xf0, 0xd8, 0x1f, 0x8b, 0xf7, 0xa8, 0x6d, 0x1b, 0xba, 0x77, 0x81, 0xfc, 0x7b, 0xbc, 0xbe, 0xe7, + 0x7b, 0xf5, 0x77, 0x52, 0xc1, 0xd9, 0x3e, 0x75, 0xc7, 0x95, 0xec, 0xb0, 0x45, 0x42, 0x02, 0xdf, + 0xda, 0x75, 0x8b, 0x7c, 0x91, 0xec, 0xb8, 0x12, 0x9c, 0x70, 0x8c, 0x15, 0xc7, 0xb5, 0x6c, 0x5a, + 0xb7, 0xda, 0x46, 0xcb, 0x5b, 0x6f, 0x7e, 0x3f, 0x3a, 0xe1, 0x24, 0x10, 0xe1, 0x84, 0x93, 0x00, + 0x8f, 0x33, 0x15, 0x1a, 0xf3, 0x4f, 0x7b, 0x32, 0x95, 0xcc, 0xb9, 0x04, 0x78, 0x9c, 0xa9, 0x10, + 0xd3, 0x3f, 0xeb, 0xc9, 0x54, 0x32, 0xe7, 0x12, 0xe0, 0xc4, 0x84, 0x47, 0x03, 0x43, 0xb7, 0xb2, + 0x42, 0x4d, 0x57, 0xb5, 0xda, 0x6d, 0xab, 0xeb, 0x2e, 0xd9, 0xc6, 0xca, 0x0a, 0xb5, 0x95, 0x3f, + 0x88, 0x1c, 0x90, 0xf5, 0xa4, 0x9e, 0xed, 0x53, 0x7b, 0xb3, 0x23, 0x2e, 0x94, 0x92, 0x09, 0x66, + 0x2c, 0xbb, 0x45, 0xa7, 0x2c, 0x93, 0x2a, 0x7f, 0x98, 0x09, 0x5f, 0x4f, 0x6f, 0x43, 0x3f, 0xdb, + 0xa7, 0x6e, 0xc7, 0x92, 0x7c, 0x0a, 0x1e, 0x4b, 0x26, 0x61, 0xff, 0x2d, 0x6b, 0xad, 0xbb, 0xca, + 0xff, 0x98, 0x09, 0xfb, 0xfc, 0xf5, 0x26, 0x9f, 0xed, 0x53, 0xb7, 0x61, 0x48, 0xa6, 0x60, 0x7c, + 0xbe, 0x5a, 0x0f, 0x3d, 0xe8, 0xf8, 0xa3, 0x4c, 0xe4, 0xf9, 0x55, 0x18, 0x8f, 0xcf, 0xaf, 0xc2, + 0x20, 0x66, 0x4f, 0x05, 0xa0, 0x69, 0x53, 0x57, 0xfe, 0xa7, 0x88, 0x3d, 0x15, 0xc2, 0xa2, 0x7f, + 0xa9, 0x0c, 0x60, 0xf3, 0x6c, 0x00, 0xf0, 0xee, 0xe5, 0xff, 0x79, 0x64, 0x9e, 0x8d, 0x51, 0xb0, + 0x79, 0x36, 0x06, 0x64, 0x56, 0x4e, 0x00, 0x5c, 0xb0, 0x84, 0xcb, 0xaf, 0x61, 0x99, 0xca, 0xbf, + 0x88, 0x58, 0x39, 0xc9, 0x64, 0xcc, 0xca, 0x49, 0xc6, 0x4c, 0x0e, 0x40, 0x3f, 0xde, 0xe0, 0x5f, + 0x2f, 0x0c, 0xfe, 0x52, 0xa6, 0xf8, 0xcb, 0x99, 0xeb, 0x85, 0xc1, 0x5f, 0xce, 0x14, 0x7f, 0x85, + 0xfd, 0xff, 0x2b, 0x99, 0xe2, 0xaf, 0x66, 0xd4, 0xb3, 0x11, 0x69, 0xd7, 0xdb, 0x9a, 0x58, 0x56, + 0x13, 0x51, 0xfc, 0x67, 0x22, 0x4a, 0xa4, 0xb8, 0xfd, 0x72, 0x06, 0x46, 0x1a, 0xae, 0x4d, 0xb5, + 0x35, 0x11, 0x31, 0xfa, 0x1c, 0x0c, 0xf2, 0x37, 0x77, 0x5e, 0x88, 0x23, 0xd5, 0xff, 0x4d, 0x2e, + 0xc0, 0xd8, 0x9c, 0xe6, 0xb8, 0xd8, 0xc4, 0x9a, 0xa9, 0xd3, 0xfb, 0x18, 0x6f, 0x22, 0xa7, 0x46, + 0xa0, 0x64, 0x8e, 0xd3, 0xf1, 0x72, 0x98, 0x24, 0x20, 0xb7, 0x6d, 0xa0, 0xe4, 0xc1, 0x6f, 0x6c, + 0x96, 0xfa, 0x30, 0x2e, 0x72, 0xa4, 0x6c, 0xf9, 0x9b, 0x19, 0x88, 0xbd, 0x06, 0xdc, 0x7b, 0x64, + 0xb4, 0x45, 0x18, 0x8f, 0x24, 0xa6, 0x10, 0x41, 0x33, 0x76, 0x98, 0xb7, 0x22, 0x5a, 0x9a, 0xbc, + 0xcf, 0x0f, 0xd6, 0x70, 0x53, 0x9d, 0x13, 0x41, 0xb0, 0x31, 0x7d, 0x5b, 0xd7, 0x6e, 0xab, 0x12, + 0x4a, 0x04, 0x39, 0xfd, 0x76, 0x31, 0x88, 0xba, 0x4f, 0x2e, 0x88, 0x30, 0x6d, 0x99, 0x20, 0x74, + 0x76, 0xd7, 0xa1, 0xb6, 0x1c, 0x3a, 0x1b, 0xc3, 0xb2, 0x7d, 0x18, 0x46, 0x6a, 0x6b, 0x1d, 0x6a, + 0x3b, 0x96, 0xa9, 0xb9, 0x96, 0x2d, 0xc2, 0x48, 0x61, 0xc0, 0x27, 0x43, 0x82, 0xcb, 0x01, 0x9f, + 0x64, 0x7a, 0x72, 0xc9, 0xcb, 0x40, 0x9d, 0xc3, 0x7c, 0x07, 0x18, 0x4a, 0x05, 0x33, 0x50, 0xcb, + 0x31, 0xb9, 0x90, 0x82, 0x91, 0xde, 0x74, 0x34, 0x0c, 0xeb, 0xe1, 0x93, 0x76, 0x19, 0x40, 0x26, + 0x45, 0x0a, 0xf2, 0x2c, 0x14, 0xd0, 0x1e, 0x76, 0x30, 0xb3, 0xbc, 0x08, 0xe8, 0xdd, 0x46, 0x88, + 0x1c, 0x3a, 0x8c, 0xd3, 0x90, 0x1b, 0x50, 0x0c, 0x7c, 0x3c, 0xaf, 0xd9, 0x56, 0xb7, 0xe3, 0xe5, + 0x92, 0x2c, 0x6d, 0x6d, 0x96, 0x1e, 0xb9, 0xeb, 0xe3, 0x9a, 0x2b, 0x88, 0x94, 0x58, 0xc4, 0x0a, + 0x92, 0x59, 0x18, 0x0f, 0x60, 0x4c, 0x44, 0x5e, 0x0e, 0x5b, 0x0c, 0x53, 0x25, 0xf1, 0x62, 0xe2, + 0x94, 0x59, 0x45, 0x8b, 0x91, 0x1a, 0x0c, 0x78, 0xd1, 0xbc, 0x07, 0xb7, 0x55, 0xd2, 0x13, 0x22, + 0x9a, 0xf7, 0x80, 0x1c, 0xc7, 0xdb, 0x2b, 0x4f, 0x66, 0x60, 0x4c, 0xb5, 0xba, 0x2e, 0x5d, 0xb2, + 0xc4, 0xe5, 0x88, 0x88, 0x1a, 0x8f, 0x6d, 0xb2, 0x19, 0xa6, 0xe9, 0x5a, 0xcd, 0x16, 0xc7, 0xc9, + 0xa1, 0xb3, 0xc2, 0xa5, 0xc8, 0x02, 0x4c, 0xc4, 0xbc, 0x61, 0x31, 0x0a, 0xc8, 0x10, 0x8f, 0xcb, + 0x2c, 0x7d, 0x5e, 0x9c, 0x59, 0xbc, 0x28, 0xf9, 0xbe, 0x0c, 0x14, 0x96, 0x6c, 0xcd, 0x70, 0x1d, + 0x11, 0x11, 0xe4, 0xd4, 0xe5, 0x75, 0x5b, 0xeb, 0x30, 0xfd, 0xb8, 0x8c, 0x09, 0x2d, 0x6e, 0x69, + 0xed, 0x2e, 0x75, 0x26, 0x6f, 0xb3, 0xaf, 0xfb, 0xe7, 0x9b, 0xa5, 0xd7, 0x79, 0xf8, 0xb7, 0xcb, + 0x2d, 0x6b, 0xed, 0xca, 0x8a, 0xad, 0xdd, 0x33, 0x5c, 0x9c, 0x9d, 0xb4, 0xf6, 0x15, 0x97, 0xb6, + 0xf1, 0x6a, 0xff, 0x8a, 0xd6, 0x31, 0xae, 0x60, 0xe2, 0xa4, 0x2b, 0x3e, 0x27, 0x5e, 0x03, 0x53, + 0x01, 0x17, 0xff, 0x92, 0x55, 0x80, 0xe3, 0xc8, 0x02, 0x80, 0xf8, 0xd4, 0x4a, 0xa7, 0x23, 0xc2, + 0x8b, 0x48, 0x17, 0xe2, 0x1e, 0x86, 0x2b, 0xb6, 0x2f, 0x30, 0xad, 0x23, 0x25, 0x0b, 0x51, 0x25, + 0x0e, 0x4c, 0x0b, 0x96, 0x44, 0x8b, 0x3c, 0x31, 0x8d, 0x4a, 0xc1, 0xca, 0x04, 0x2a, 0x41, 0x48, + 0xd1, 0x62, 0x64, 0x19, 0xc6, 0x05, 0x5f, 0x3f, 0xb5, 0xe0, 0x58, 0x78, 0x56, 0x88, 0xa0, 0xb9, + 0xd2, 0xfa, 0x6d, 0xd4, 0x05, 0x58, 0xae, 0x23, 0x52, 0x82, 0x4c, 0xc2, 0xa8, 0xf7, 0xf7, 0x82, + 0xb6, 0x46, 0x1d, 0x65, 0x1c, 0x35, 0xf6, 0xfc, 0xd6, 0x66, 0x49, 0xf1, 0xca, 0x63, 0x60, 0x7b, + 0x59, 0x74, 0xe1, 0x22, 0x32, 0x0f, 0xae, 0xf5, 0xc5, 0x04, 0x1e, 0x51, 0x9d, 0x0f, 0x17, 0x21, + 0x55, 0x18, 0xf5, 0x5f, 0x37, 0xdf, 0xbc, 0x59, 0x9b, 0xc2, 0xf8, 0x25, 0x22, 0xb7, 0x41, 0x24, + 0xf9, 0x9f, 0xcc, 0x24, 0x54, 0x46, 0x0a, 0x6a, 0xc7, 0x03, 0x9a, 0x44, 0x82, 0xda, 0x75, 0x12, + 0x82, 0xda, 0xd5, 0xc9, 0x87, 0x60, 0xb8, 0x72, 0xbb, 0x21, 0x82, 0xf5, 0x39, 0xca, 0x89, 0x20, + 0x93, 0x2c, 0x46, 0x08, 0x14, 0x81, 0xfd, 0xe4, 0xa6, 0xcb, 0xf4, 0x64, 0x1a, 0xc6, 0x42, 0x5b, + 0x65, 0x47, 0x39, 0x89, 0x1c, 0xb0, 0xe5, 0x1a, 0x62, 0x9a, 0xb6, 0x40, 0xc9, 0xc3, 0x2b, 0x5c, + 0x88, 0x69, 0xcd, 0x94, 0xe1, 0x60, 0x56, 0x4e, 0x95, 0x62, 0x5c, 0x40, 0x8c, 0x86, 0x32, 0xc8, + 0xb5, 0x46, 0x17, 0xa8, 0xa6, 0xcd, 0x71, 0x72, 0x8f, 0x46, 0x8a, 0x91, 0x77, 0x80, 0x60, 0x1e, + 0x4f, 0xaa, 0x7b, 0x1b, 0xb1, 0xda, 0x94, 0xa3, 0x9c, 0xc6, 0xc4, 0x3e, 0x24, 0x1a, 0xc6, 0xab, + 0x36, 0x35, 0x79, 0x41, 0x4c, 0x1f, 0x8f, 0x69, 0xbc, 0x54, 0xd3, 0x0b, 0xe1, 0xd5, 0x34, 0x74, + 0xb9, 0xc5, 0x09, 0x5c, 0xc9, 0x3a, 0x9c, 0xa9, 0xdb, 0xf4, 0x9e, 0x61, 0x75, 0x1d, 0x6f, 0xf9, + 0xf0, 0xe6, 0xad, 0x33, 0xdb, 0xce, 0x5b, 0x4f, 0x88, 0x8a, 0x4f, 0x75, 0x6c, 0x7a, 0xaf, 0xe9, + 0xa5, 0x73, 0x09, 0x65, 0x23, 0x48, 0xe3, 0xce, 0xc4, 0x85, 0x31, 0x11, 0x05, 0xdc, 0xa0, 0x8e, + 0xa2, 0x04, 0x53, 0x2d, 0x8f, 0x40, 0x69, 0xf8, 0x38, 0x59, 0x5c, 0x91, 0x62, 0x44, 0x05, 0x72, + 0xad, 0xea, 0xf9, 0x4e, 0x56, 0x5a, 0x2d, 0xab, 0x6b, 0xba, 0x8e, 0x72, 0x16, 0x99, 0x95, 0x99, + 0x58, 0x56, 0x5a, 0x7e, 0x6a, 0xa7, 0xa6, 0x26, 0xf0, 0xb2, 0x58, 0xe2, 0xa5, 0xc9, 0x1c, 0x14, + 0xeb, 0x36, 0xde, 0xe4, 0xde, 0xa0, 0x1b, 0xdc, 0xa2, 0xc7, 0xa0, 0x2c, 0x62, 0xaa, 0xec, 0x70, + 0x5c, 0xf3, 0x2e, 0xdd, 0x68, 0x76, 0x10, 0x2b, 0x2f, 0x2b, 0xd1, 0x92, 0x72, 0xaa, 0x95, 0x47, + 0x76, 0x96, 0x6a, 0x85, 0x42, 0x51, 0x78, 0x5e, 0xde, 0x77, 0xa9, 0xc9, 0x96, 0x7a, 0x47, 0x04, + 0x60, 0x51, 0x22, 0x9e, 0x9a, 0x3e, 0x9e, 0x4f, 0x1d, 0x62, 0x94, 0x51, 0x1f, 0x2c, 0x37, 0x2c, + 0x5a, 0x24, 0x9e, 0x8f, 0xe4, 0xd1, 0x3d, 0xe4, 0x23, 0xf9, 0x3f, 0x73, 0xf2, 0xfc, 0x4b, 0xce, + 0x43, 0x5e, 0x4a, 0x17, 0x8a, 0xc9, 0x16, 0x30, 0xb5, 0x52, 0x5e, 0xe4, 0x90, 0x19, 0x12, 0xb6, + 0x8b, 0x1f, 0xb6, 0x12, 0xf3, 0xc3, 0x07, 0x01, 0xf8, 0xd5, 0x80, 0x00, 0x73, 0x73, 0x77, 0x97, + 0xdb, 0x46, 0x0b, 0x13, 0x6e, 0xe5, 0xa4, 0x30, 0x6f, 0x08, 0xe5, 0xf9, 0xb6, 0x24, 0x12, 0x72, + 0x15, 0x86, 0x3d, 0x0f, 0x82, 0x20, 0xd9, 0x08, 0xe6, 0x61, 0x12, 0xb3, 0xb5, 0x48, 0xf3, 0x24, + 0x11, 0x91, 0xd7, 0x00, 0x82, 0xe9, 0x40, 0x58, 0x5a, 0xb8, 0x54, 0xc8, 0xb3, 0x87, 0xbc, 0x54, + 0x04, 0xd4, 0x6c, 0xe2, 0x94, 0xd5, 0x71, 0x43, 0xe4, 0x20, 0xc1, 0x89, 0x33, 0xa4, 0xc3, 0xb2, + 0x82, 0x84, 0x8b, 0x90, 0x45, 0x98, 0x88, 0x69, 0xa0, 0x48, 0x4d, 0xf2, 0xc4, 0xd6, 0x66, 0xe9, + 0xd1, 0x04, 0xf5, 0x95, 0x17, 0xe6, 0x58, 0x59, 0xf2, 0x24, 0xe4, 0x6e, 0xaa, 0x35, 0x91, 0x1e, + 0x81, 0x67, 0xd6, 0x08, 0x05, 0x27, 0x65, 0x58, 0xf2, 0x2a, 0x00, 0x4f, 0x3f, 0x58, 0xb7, 0x6c, + 0x17, 0x2d, 0x8a, 0xd1, 0xc9, 0xb3, 0x6c, 0x2c, 0xf3, 0xf4, 0x84, 0x4d, 0xb6, 0x8c, 0xc9, 0x1f, + 0x1d, 0x10, 0x97, 0xff, 0x62, 0x36, 0xb6, 0xac, 0x31, 0xc1, 0x8b, 0x56, 0x48, 0x9d, 0x8f, 0x82, + 0xf7, 0x9a, 0xce, 0x05, 0x2f, 0x11, 0x91, 0x8b, 0x30, 0x58, 0x67, 0x93, 0x4a, 0xcb, 0x6a, 0x0b, + 0x55, 0xc0, 0x18, 0xb9, 0x1d, 0x01, 0x53, 0x7d, 0x2c, 0xb9, 0xca, 0xd3, 0xf6, 0x98, 0x91, 0x64, + 0x45, 0x5d, 0x01, 0x8b, 0x66, 0xed, 0x61, 0x30, 0x56, 0x26, 0x94, 0xcf, 0x57, 0x94, 0x49, 0x58, + 0x52, 0x83, 0xfc, 0xbd, 0xbe, 0x41, 0xdb, 0xbf, 0x9d, 0x41, 0x5b, 0xfe, 0xb5, 0x4c, 0x7c, 0x88, + 0x92, 0x97, 0xe2, 0x79, 0x43, 0x70, 0xfd, 0xf2, 0x81, 0x72, 0xad, 0x7e, 0x06, 0x91, 0x50, 0x06, + 0x90, 0xec, 0x9e, 0x33, 0x80, 0xe4, 0x76, 0x99, 0x01, 0xa4, 0xfc, 0xff, 0xe6, 0x7b, 0x3e, 0x32, + 0x3c, 0x94, 0x48, 0xd1, 0xaf, 0xb2, 0x4d, 0x19, 0xab, 0xbd, 0xe2, 0xc4, 0xb6, 0x16, 0xfc, 0x0d, + 0x55, 0x53, 0xe3, 0xa3, 0xd2, 0x51, 0xc3, 0x94, 0xe4, 0x4d, 0x18, 0xf1, 0x3e, 0x00, 0x33, 0xcb, + 0x48, 0x19, 0x51, 0xfc, 0x05, 0x31, 0x92, 0x83, 0x25, 0x54, 0x80, 0xbc, 0x0c, 0x43, 0x68, 0x0e, + 0x75, 0xb4, 0x96, 0x97, 0x76, 0x88, 0xe7, 0x29, 0xf2, 0x80, 0x72, 0x34, 0x64, 0x9f, 0x92, 0x7c, + 0x02, 0x0a, 0x22, 0xf7, 0x5e, 0x01, 0x97, 0xe8, 0x2b, 0x3b, 0x78, 0x95, 0x79, 0x59, 0xce, 0xbb, + 0xc7, 0x37, 0x38, 0x08, 0x08, 0x6d, 0x70, 0x78, 0xca, 0xbd, 0x25, 0x38, 0x51, 0xb7, 0xa9, 0x8e, + 0xef, 0x7f, 0xa7, 0xef, 0x77, 0x6c, 0x91, 0x15, 0x91, 0x4f, 0x10, 0xb8, 0xbe, 0x75, 0x3c, 0x34, + 0x5b, 0x79, 0x05, 0x5e, 0xce, 0x7d, 0x92, 0x50, 0x9c, 0x19, 0x3d, 0xbc, 0x25, 0x37, 0xe8, 0xc6, + 0xba, 0x65, 0xeb, 0x3c, 0x71, 0xa0, 0x98, 0xfa, 0x85, 0xa0, 0xef, 0x0a, 0x94, 0x6c, 0xf4, 0x84, + 0x0b, 0x9d, 0x7b, 0x15, 0x86, 0xf7, 0x9a, 0xbb, 0xee, 0xe7, 0xb2, 0x29, 0xcf, 0xf5, 0x1f, 0xde, + 0xf4, 0xe1, 0x25, 0xe8, 0xe7, 0x21, 0x91, 0xb8, 0xf2, 0x0d, 0x6d, 0x6d, 0x96, 0xfa, 0x3f, 0x85, + 0xfe, 0xd3, 0x1c, 0x5e, 0xfe, 0xb3, 0x6c, 0x4a, 0x2c, 0x82, 0x87, 0x57, 0x66, 0x6c, 0xe1, 0xf1, + 0x84, 0x51, 0x9b, 0x42, 0xc9, 0x8d, 0x8a, 0x85, 0xc7, 0x03, 0x33, 0xa3, 0x42, 0x26, 0x22, 0x97, + 0x01, 0xea, 0x9a, 0xad, 0xad, 0x51, 0x97, 0xed, 0x75, 0xf8, 0x69, 0x01, 0x5a, 0x21, 0x1d, 0x1f, + 0xaa, 0x4a, 0x14, 0xe5, 0x9f, 0xca, 0xf5, 0x8a, 0xd5, 0x70, 0x2c, 0xfb, 0xdd, 0xc8, 0xfe, 0x2a, + 0x0c, 0xfb, 0x92, 0xad, 0x4d, 0xa1, 0xbd, 0x34, 0xea, 0x67, 0xca, 0xe4, 0x60, 0x2c, 0x23, 0x11, + 0x91, 0x4b, 0xbc, 0xad, 0x0d, 0xe3, 0x5d, 0x9e, 0xb3, 0x6d, 0x54, 0x64, 0xe3, 0xd2, 0x5c, 0xad, + 0xe9, 0x18, 0xef, 0x52, 0xd5, 0x47, 0x97, 0xff, 0x41, 0x36, 0x31, 0xe0, 0xc5, 0x71, 0x1f, 0xed, + 0xa2, 0x8f, 0x12, 0x84, 0xc8, 0x43, 0x75, 0x1c, 0x0b, 0x71, 0x17, 0x42, 0xfc, 0xd3, 0x6c, 0x62, + 0x60, 0x93, 0x63, 0x21, 0xee, 0x66, 0xb6, 0x78, 0x16, 0x86, 0x54, 0x6b, 0xdd, 0xa9, 0xe2, 0x9e, + 0x88, 0xcf, 0x15, 0x38, 0x51, 0xdb, 0xd6, 0xba, 0xd3, 0xc4, 0xdd, 0x8e, 0x1a, 0x10, 0x94, 0xbf, + 0x9d, 0xed, 0x11, 0xfa, 0xe5, 0x58, 0xf0, 0xef, 0xe5, 0x12, 0xf9, 0x0b, 0xd9, 0x50, 0x68, 0x99, + 0x87, 0x57, 0xd8, 0x57, 0x00, 0x1a, 0xad, 0x55, 0xba, 0xa6, 0x49, 0x79, 0x6f, 0xf1, 0xc8, 0xc2, + 0x41, 0x28, 0xdf, 0x06, 0x4b, 0x24, 0xe5, 0x5f, 0xca, 0x46, 0x62, 0xeb, 0x1c, 0xcb, 0x6e, 0xc7, + 0xb2, 0xf3, 0xb5, 0x4e, 0x84, 0x0b, 0x3a, 0x96, 0xdc, 0x4e, 0x25, 0xf7, 0x03, 0xd9, 0x48, 0x64, + 0xa5, 0x87, 0x56, 0x76, 0x6c, 0x00, 0xc6, 0x23, 0x3e, 0x3d, 0xb4, 0x9a, 0xf4, 0x2c, 0x0c, 0x09, + 0x39, 0xf8, 0x4b, 0x05, 0x9f, 0xf7, 0x39, 0x10, 0x0f, 0x68, 0x7d, 0x82, 0xf2, 0x5f, 0xca, 0x42, + 0x38, 0xe2, 0xd5, 0x43, 0xaa, 0x43, 0xbf, 0x90, 0x0d, 0xc7, 0xfa, 0x7a, 0x78, 0xf5, 0xe7, 0x32, + 0x40, 0xa3, 0xbb, 0xdc, 0x12, 0x1e, 0xb5, 0xfd, 0xd2, 0x09, 0xbf, 0x0f, 0x55, 0x25, 0x8a, 0xf2, + 0xbf, 0xcf, 0x26, 0x06, 0x20, 0x7b, 0x78, 0x05, 0xf8, 0x22, 0x9e, 0x8a, 0xb7, 0xcc, 0x60, 0x22, + 0xc7, 0x43, 0x48, 0x36, 0xfe, 0x62, 0xc9, 0xd2, 0x3d, 0x42, 0xf2, 0xc1, 0x04, 0x73, 0x0d, 0x53, + 0xb9, 0x05, 0xe6, 0x9a, 0x7c, 0x98, 0x2f, 0x19, 0x6e, 0xbf, 0x95, 0xdd, 0x2e, 0x5e, 0xdb, 0xc3, + 0xbc, 0xaa, 0x0e, 0xd4, 0xb5, 0x0d, 0x8c, 0x2b, 0xce, 0x7a, 0x62, 0x84, 0xa7, 0xf2, 0xee, 0x70, + 0x90, 0x7c, 0x6d, 0x27, 0xa8, 0xca, 0xff, 0xba, 0x3f, 0x39, 0x58, 0xd8, 0xc3, 0x2b, 0xc2, 0xf3, + 0x90, 0xaf, 0x6b, 0xee, 0xaa, 0xd0, 0x64, 0xbc, 0x0d, 0xec, 0x68, 0xee, 0xaa, 0x8a, 0x50, 0x72, + 0x09, 0x06, 0x55, 0x6d, 0x9d, 0x9f, 0x79, 0x16, 0x82, 0x34, 0xeb, 0xb6, 0xb6, 0xde, 0xe4, 0xe7, + 0x9e, 0x3e, 0x9a, 0x94, 0xfd, 0x34, 0xff, 0xfc, 0xe4, 0x1b, 0x73, 0x4c, 0xf3, 0x34, 0xff, 0x7e, + 0x72, 0xff, 0xf3, 0x90, 0x9f, 0xb4, 0xf4, 0x0d, 0xbc, 0xf9, 0x1a, 0xe1, 0x95, 0x2d, 0x5b, 0xfa, + 0x86, 0x8a, 0x50, 0xf2, 0xd9, 0x0c, 0x0c, 0xcc, 0x52, 0x4d, 0x67, 0x23, 0x64, 0xa8, 0x97, 0xc3, + 0xca, 0x5b, 0x07, 0xe3, 0xb0, 0x32, 0xb1, 0xca, 0x2b, 0x93, 0x15, 0x45, 0xd4, 0x4f, 0xae, 0xc1, + 0x60, 0x55, 0x73, 0xe9, 0x8a, 0x65, 0x6f, 0xa0, 0x0b, 0xce, 0x58, 0xf0, 0xe0, 0x34, 0xa4, 0x3f, + 0x1e, 0x11, 0xbf, 0x19, 0x6b, 0x89, 0x5f, 0xaa, 0x5f, 0x98, 0x89, 0x85, 0xdf, 0xcc, 0xa1, 0x0f, + 0x8e, 0x10, 0x0b, 0xbf, 0xc2, 0x53, 0x05, 0x26, 0x38, 0x56, 0x1e, 0x49, 0x3e, 0x56, 0x46, 0xeb, + 0x11, 0xdd, 0xf4, 0x30, 0xb9, 0xfe, 0x28, 0x2e, 0xfa, 0xdc, 0x7a, 0x44, 0x28, 0xe6, 0xd6, 0x57, + 0x25, 0x92, 0xf2, 0x1f, 0xf7, 0x43, 0x62, 0x68, 0xa1, 0x63, 0x25, 0x3f, 0x56, 0xf2, 0x40, 0xc9, + 0xa7, 0x62, 0x4a, 0x7e, 0x2e, 0x1e, 0xac, 0xea, 0x01, 0xd5, 0xf0, 0x2f, 0xe5, 0x63, 0xa1, 0xee, + 0x1e, 0xee, 0xdd, 0x65, 0x20, 0xbd, 0xfe, 0x6d, 0xa5, 0xe7, 0x0f, 0x88, 0xc2, 0xb6, 0x03, 0x62, + 0x60, 0xa7, 0x03, 0x62, 0x30, 0x75, 0x40, 0x04, 0x0a, 0x32, 0x94, 0xaa, 0x20, 0x35, 0x31, 0x68, + 0xa0, 0x77, 0xca, 0xbd, 0xf3, 0x5b, 0x9b, 0xa5, 0x31, 0x36, 0x9a, 0x12, 0x73, 0xed, 0x21, 0x8b, + 0xf2, 0x37, 0xf3, 0x3d, 0xe2, 0x53, 0x1e, 0x8a, 0x8e, 0xbc, 0x08, 0xb9, 0x4a, 0xa7, 0x23, 0xf4, + 0xe3, 0x84, 0x14, 0x1a, 0x33, 0xa5, 0x14, 0xa3, 0x26, 0xaf, 0x41, 0xae, 0x72, 0xbb, 0x11, 0xcd, + 0xb2, 0x57, 0xb9, 0xdd, 0x10, 0x5f, 0x92, 0x5a, 0xf6, 0x76, 0x83, 0xbc, 0x11, 0x84, 0xbb, 0x5f, + 0xed, 0x9a, 0x77, 0xc5, 0x46, 0x51, 0x78, 0xea, 0x7a, 0x9e, 0x3c, 0x2d, 0x86, 0x62, 0xdb, 0xc5, + 0x08, 0x6d, 0x44, 0x9b, 0x0a, 0x3b, 0xd7, 0xa6, 0x81, 0x6d, 0xb5, 0x69, 0x70, 0xa7, 0xda, 0x34, + 0xb4, 0x03, 0x6d, 0x82, 0x6d, 0xb5, 0x69, 0x78, 0xff, 0xda, 0xd4, 0x81, 0x73, 0xf1, 0x98, 0xc2, + 0xbe, 0x46, 0xa8, 0x40, 0xe2, 0x58, 0xe1, 0x58, 0x82, 0x57, 0xff, 0x5d, 0x8e, 0x6d, 0xae, 0x23, + 0xba, 0xe9, 0x30, 0xbc, 0xec, 0xda, 0x16, 0x2f, 0x5d, 0xfe, 0xb9, 0x6c, 0x7a, 0x28, 0xe4, 0xa3, + 0x39, 0xc5, 0x7d, 0x77, 0xa2, 0x94, 0xf2, 0x91, 0x47, 0x98, 0xa9, 0x52, 0x8e, 0xb0, 0x4d, 0x92, + 0xd9, 0x57, 0xb3, 0x69, 0xf1, 0x99, 0xf7, 0x25, 0xb1, 0xa7, 0xe3, 0xce, 0x70, 0xe8, 0xe2, 0xef, + 0x84, 0xbd, 0xe0, 0x66, 0x60, 0x44, 0x16, 0xa2, 0x90, 0xd2, 0x4e, 0x04, 0x1c, 0x2a, 0x47, 0xde, + 0xf0, 0x93, 0x21, 0x4a, 0xfe, 0x31, 0xe8, 0xe9, 0xe6, 0x8d, 0xd9, 0x88, 0x7b, 0x8c, 0x4c, 0x4e, + 0x9e, 0x85, 0xc2, 0x0c, 0x66, 0x17, 0x92, 0x07, 0x3b, 0xcf, 0x37, 0x24, 0x7b, 0xad, 0x70, 0x9a, + 0xf2, 0xaf, 0x65, 0xe0, 0xc4, 0x8d, 0xee, 0x32, 0x15, 0x8e, 0x76, 0x7e, 0x1b, 0xde, 0x01, 0x60, + 0x60, 0xe1, 0x30, 0x93, 0x41, 0x87, 0x99, 0xf7, 0xcb, 0x71, 0x9c, 0x23, 0x05, 0x2e, 0x07, 0xd4, + 0xdc, 0x59, 0xe6, 0x51, 0xcf, 0xe7, 0xf4, 0x6e, 0x77, 0x99, 0x36, 0x63, 0x5e, 0x33, 0x12, 0xf7, + 0x73, 0x1f, 0xe2, 0xde, 0xfc, 0x7b, 0x75, 0x50, 0xf9, 0xd9, 0x6c, 0x6a, 0xe8, 0xec, 0x23, 0x9b, + 0x44, 0xff, 0xe3, 0x89, 0xbd, 0x12, 0x4d, 0xa6, 0x9f, 0x40, 0x12, 0xe1, 0x98, 0xc4, 0x25, 0x59, + 0x60, 0x87, 0x38, 0xb1, 0x3c, 0xf0, 0x02, 0xfb, 0x56, 0x26, 0x35, 0xc4, 0xf9, 0x51, 0x15, 0x58, + 0xf9, 0x7f, 0xcb, 0x79, 0x91, 0xd5, 0xf7, 0xf5, 0x09, 0xcf, 0xc2, 0x90, 0x78, 0x6c, 0x1f, 0xf6, + 0x13, 0x16, 0xc7, 0x86, 0x78, 0x0c, 0xed, 0x13, 0x30, 0x93, 0x42, 0x72, 0x62, 0x96, 0xfc, 0x84, + 0x25, 0x07, 0x66, 0x55, 0x22, 0x61, 0x46, 0xc3, 0xf4, 0x7d, 0xc3, 0x45, 0x0b, 0x84, 0xf5, 0x65, + 0x8e, 0x1b, 0x0d, 0xf4, 0xbe, 0xe1, 0x72, 0xfb, 0xc3, 0x47, 0x33, 0x83, 0x80, 0xdb, 0x22, 0x62, + 0xde, 0x43, 0x83, 0x80, 0x9b, 0x2a, 0xaa, 0xc0, 0xb0, 0xd6, 0x0a, 0xe7, 0x5b, 0xe1, 0xd2, 0x22, + 0x5a, 0x2b, 0xdc, 0x75, 0xb1, 0xb5, 0x3e, 0x01, 0xe3, 0xa8, 0xd2, 0x95, 0xc0, 0x89, 0x0f, 0x39, + 0xda, 0x08, 0x51, 0x05, 0x86, 0x5c, 0x85, 0xb1, 0x86, 0xab, 0x99, 0xba, 0x66, 0xeb, 0x8b, 0x5d, + 0xb7, 0xd3, 0x75, 0x65, 0x03, 0xd8, 0x71, 0x75, 0xab, 0xeb, 0xaa, 0x11, 0x0a, 0xf2, 0x3c, 0x8c, + 0x7a, 0x90, 0x69, 0xdb, 0xb6, 0x6c, 0xd9, 0xca, 0x71, 0x5c, 0x9d, 0xda, 0xb6, 0x1a, 0x26, 0x20, + 0x1f, 0x84, 0xd1, 0x9a, 0xe9, 0xbf, 0x1d, 0x57, 0xe7, 0x84, 0xcd, 0x83, 0x2f, 0xc6, 0x0c, 0x1f, + 0xd1, 0xec, 0xda, 0x6d, 0x35, 0x4c, 0x58, 0xde, 0xca, 0xc6, 0x03, 0xd0, 0x3f, 0xbc, 0x1b, 0xa4, + 0x4b, 0x61, 0xc7, 0x3d, 0xf4, 0x56, 0x45, 0xe3, 0x53, 0xf6, 0x1b, 0xe6, 0x36, 0xe8, 0x55, 0x18, + 0xbc, 0x41, 0x37, 0xb8, 0x8f, 0x69, 0x21, 0x70, 0x4b, 0xbe, 0x2b, 0x60, 0xf2, 0xe9, 0xae, 0x47, + 0x57, 0xfe, 0x7a, 0x36, 0x1e, 0x5a, 0xff, 0xe1, 0x15, 0xf6, 0xf3, 0x30, 0x80, 0xa2, 0xac, 0x79, + 0xd7, 0x0b, 0x28, 0x40, 0x14, 0x77, 0xd8, 0xdb, 0xd9, 0x23, 0x2b, 0xff, 0x64, 0x21, 0x9a, 0x6f, + 0xe1, 0xe1, 0x95, 0xde, 0xeb, 0x30, 0x5c, 0xb5, 0x4c, 0xc7, 0x70, 0x5c, 0x6a, 0xb6, 0x3c, 0x85, + 0x45, 0xc7, 0xff, 0x56, 0x00, 0x96, 0x6d, 0x40, 0x89, 0x7a, 0x2f, 0xca, 0x4b, 0x5e, 0x81, 0x21, + 0x14, 0x39, 0xda, 0x9c, 0x7c, 0xc2, 0xc3, 0x9b, 0x89, 0x65, 0x06, 0x8c, 0x5a, 0x9c, 0x01, 0x29, + 0xb9, 0x09, 0x83, 0xd5, 0x55, 0xa3, 0xad, 0xdb, 0xd4, 0x44, 0xdf, 0x64, 0x29, 0xac, 0x5d, 0xb8, + 0x2f, 0x2f, 0xe3, 0xbf, 0x48, 0xcb, 0x9b, 0xd3, 0x12, 0xc5, 0x42, 0x8f, 0xc5, 0x04, 0xec, 0xdc, + 0x8f, 0x64, 0x01, 0x82, 0x02, 0xe4, 0x71, 0xc8, 0x7a, 0x2f, 0x92, 0xb9, 0x4b, 0x4c, 0x48, 0x83, + 0xb2, 0xb8, 0x54, 0x88, 0xb1, 0x9d, 0xdd, 0x76, 0x6c, 0xdf, 0x84, 0x02, 0x3f, 0x5d, 0x43, 0xaf, + 0x75, 0xe9, 0x8d, 0x7d, 0x6a, 0x83, 0x2f, 0x23, 0x3d, 0xb7, 0xa5, 0xd1, 0xf2, 0x0c, 0x79, 0x80, + 0x73, 0x66, 0xe7, 0x5a, 0xd0, 0x8f, 0x7f, 0x91, 0x0b, 0x90, 0x47, 0x29, 0x66, 0x70, 0xcf, 0x8c, + 0xb3, 0x74, 0x44, 0x7e, 0x88, 0x67, 0xdd, 0x54, 0xb5, 0x4c, 0x97, 0x55, 0x8d, 0xad, 0x1e, 0x11, + 0x72, 0x11, 0xb0, 0x90, 0x5c, 0x04, 0xac, 0xfc, 0x4f, 0xb2, 0x09, 0x99, 0x40, 0x1e, 0xde, 0x61, + 0xf2, 0x2a, 0x00, 0xbe, 0x3c, 0x67, 0xf2, 0xf4, 0x9e, 0x83, 0xe0, 0x28, 0x41, 0x46, 0xa8, 0xb6, + 0xa1, 0x6d, 0x47, 0x40, 0x5c, 0xfe, 0xcd, 0x4c, 0x2c, 0x7d, 0xc4, 0xbe, 0xe4, 0x28, 0x5b, 0x65, + 0xd9, 0x3d, 0x9a, 0xb1, 0x5e, 0x5f, 0xe4, 0x76, 0xd7, 0x17, 0xe1, 0x6f, 0x39, 0x00, 0xcb, 0xf4, + 0x30, 0xbf, 0xe5, 0x8f, 0xb3, 0x49, 0xc9, 0x34, 0x8e, 0xa6, 0x8a, 0xbf, 0xe4, 0x1b, 0xa5, 0xf9, + 0x48, 0xfa, 0x22, 0x84, 0x46, 0x8a, 0x79, 0x66, 0xea, 0x27, 0x61, 0x3c, 0x92, 0x62, 0x02, 0xe7, + 0x7f, 0x29, 0x2e, 0x47, 0x72, 0x22, 0x8a, 0xf4, 0x98, 0x05, 0x21, 0xb2, 0xf2, 0xff, 0x9f, 0xe9, + 0x9d, 0x60, 0xe4, 0xd0, 0x55, 0x27, 0x41, 0x00, 0xb9, 0x3f, 0x1f, 0x01, 0x1c, 0xc0, 0x36, 0xf8, + 0x68, 0x0b, 0xe0, 0x01, 0x99, 0x3c, 0xde, 0x6b, 0x01, 0xfc, 0x64, 0x66, 0xdb, 0xfc, 0x30, 0x87, + 0x2d, 0x83, 0xf2, 0xff, 0x9c, 0x49, 0xcc, 0xe3, 0xb2, 0xaf, 0x76, 0xbd, 0x01, 0x05, 0xee, 0xc2, + 0x23, 0x5a, 0x25, 0x65, 0xbe, 0x65, 0xd0, 0x94, 0xf2, 0xa2, 0x0c, 0x99, 0x83, 0x01, 0xde, 0x06, + 0x5d, 0xf4, 0xc6, 0x53, 0x3d, 0x92, 0xc9, 0xe8, 0x69, 0x93, 0xa3, 0x40, 0x97, 0x7f, 0x3d, 0x13, + 0x4b, 0x2b, 0x73, 0x88, 0xdf, 0x16, 0x4c, 0xd5, 0xb9, 0x9d, 0x4f, 0xd5, 0xe5, 0x7f, 0x95, 0x4d, + 0xce, 0x6a, 0x73, 0x88, 0x1f, 0x72, 0x10, 0xc7, 0x69, 0x7b, 0x5b, 0xb7, 0x96, 0x60, 0x2c, 0x2c, + 0x0b, 0xb1, 0x6c, 0x3d, 0x96, 0x9c, 0xdb, 0x27, 0xa5, 0x15, 0x11, 0x1e, 0xe5, 0x1f, 0xce, 0xc6, + 0x13, 0xf2, 0x1c, 0xfa, 0xfc, 0xb4, 0x27, 0x6d, 0x21, 0x35, 0x18, 0x0f, 0xbe, 0x64, 0xc9, 0x70, + 0xdb, 0xde, 0xe9, 0x3e, 0xc6, 0x04, 0x10, 0x31, 0x2c, 0xda, 0x86, 0xe3, 0x36, 0x5d, 0x86, 0x0c, + 0x45, 0x53, 0x08, 0x97, 0x8b, 0x48, 0xe5, 0x01, 0x59, 0xb6, 0x1e, 0x30, 0xa9, 0x3c, 0x20, 0x6b, + 0xd9, 0xa1, 0x4b, 0xe5, 0xa7, 0xb3, 0x69, 0x09, 0x9b, 0x0e, 0x5d, 0x36, 0x1f, 0x93, 0xfb, 0x8b, + 0xb7, 0x4c, 0x48, 0xe9, 0xf1, 0xb4, 0x0c, 0x49, 0x29, 0x3c, 0x63, 0x7c, 0xf6, 0x36, 0x89, 0x25, + 0x0a, 0xeb, 0x01, 0x19, 0x5e, 0x47, 0x43, 0x58, 0x0f, 0xc8, 0xa8, 0x7b, 0xf0, 0x84, 0xf5, 0xcb, + 0xd9, 0x9d, 0x66, 0x09, 0x3b, 0x16, 0x5e, 0x4c, 0x78, 0x5f, 0xc8, 0xc6, 0xb3, 0xd7, 0x1d, 0xba, + 0x98, 0x66, 0xa0, 0x20, 0xf2, 0xe8, 0xa5, 0x0a, 0x87, 0xe3, 0xd3, 0x4c, 0x36, 0xf1, 0x1d, 0x2f, + 0x81, 0xb8, 0xa9, 0xda, 0x99, 0x48, 0x38, 0x6d, 0xf9, 0xdb, 0x99, 0x48, 0xaa, 0xb7, 0x43, 0x39, + 0x23, 0xd9, 0xdb, 0xea, 0xf6, 0x21, 0xef, 0xb4, 0x36, 0x1f, 0x09, 0x76, 0xec, 0x7f, 0xcf, 0x14, + 0x75, 0x35, 0xa3, 0x1d, 0x2d, 0x2f, 0x02, 0x2c, 0x7c, 0x3d, 0x0b, 0x13, 0x31, 0x52, 0x72, 0x21, + 0x14, 0xd2, 0x08, 0xcf, 0x5d, 0x23, 0x9e, 0xf8, 0x3c, 0xb8, 0xd1, 0x2e, 0x8e, 0x8a, 0x2f, 0x40, + 0x7e, 0x4a, 0xdb, 0xe0, 0xdf, 0xd6, 0xcf, 0x59, 0xea, 0xda, 0x86, 0x7c, 0xa4, 0x88, 0x78, 0xb2, + 0x0c, 0xa7, 0xf8, 0x85, 0x8f, 0x61, 0x99, 0x4b, 0xc6, 0x1a, 0xad, 0x99, 0xf3, 0x46, 0xbb, 0x6d, + 0x38, 0xe2, 0xd6, 0xf2, 0xd9, 0xad, 0xcd, 0xd2, 0x45, 0xd7, 0x72, 0xb5, 0x76, 0x93, 0x7a, 0x64, + 0x4d, 0xd7, 0x58, 0xa3, 0x4d, 0xc3, 0x6c, 0xae, 0x21, 0xa5, 0xc4, 0x32, 0x99, 0x15, 0xa9, 0xf1, + 0xac, 0x4a, 0x8d, 0x96, 0x66, 0x9a, 0x54, 0xaf, 0x99, 0x93, 0x1b, 0x2e, 0xe5, 0xb7, 0x9d, 0x39, + 0x7e, 0xe6, 0xc9, 0x1f, 0xda, 0x73, 0x34, 0x63, 0xbc, 0xcc, 0x08, 0xd4, 0x84, 0x42, 0xe5, 0x5f, + 0xc9, 0x27, 0x64, 0xf9, 0x3b, 0x42, 0xea, 0xe3, 0xf5, 0x74, 0x7e, 0x9b, 0x9e, 0xbe, 0x02, 0x03, + 0x22, 0x6d, 0x85, 0xb8, 0x41, 0xc1, 0x97, 0x01, 0xf7, 0x38, 0x48, 0xbe, 0x82, 0x12, 0x54, 0xa4, + 0x0d, 0xe7, 0x96, 0x58, 0x37, 0x25, 0x77, 0x66, 0x61, 0x0f, 0x9d, 0xd9, 0x83, 0x1f, 0x79, 0x1b, + 0xce, 0x20, 0x36, 0xa1, 0x5b, 0x07, 0xb0, 0x2a, 0xb4, 0xf5, 0x78, 0x55, 0xc9, 0x9d, 0x9b, 0x56, + 0x9e, 0x7c, 0x0c, 0x46, 0xfc, 0x01, 0x62, 0x50, 0x47, 0x5c, 0xcd, 0xf4, 0x18, 0x67, 0x3c, 0x10, + 0x1f, 0x03, 0xa3, 0x3f, 0x5e, 0x38, 0x98, 0x5b, 0x88, 0x57, 0xf9, 0x5f, 0x64, 0x7a, 0x65, 0x1b, + 0x3c, 0xf4, 0x59, 0xf9, 0x43, 0x30, 0xa0, 0xf3, 0x8f, 0x12, 0x3a, 0xd5, 0x3b, 0x1f, 0x21, 0x27, + 0x55, 0xbd, 0x32, 0xe5, 0x7f, 0x99, 0xe9, 0x99, 0xe4, 0xf0, 0xa8, 0x7f, 0xde, 0x17, 0x72, 0x29, + 0x9f, 0x27, 0x26, 0xd1, 0x4b, 0x50, 0x34, 0x82, 0x2c, 0x4c, 0xcd, 0x20, 0x96, 0x97, 0x3a, 0x2e, + 0xc1, 0x71, 0x74, 0xbd, 0x04, 0xbe, 0x47, 0x9a, 0xed, 0xb9, 0xdb, 0x39, 0xcd, 0xae, 0x6d, 0xf0, + 0x71, 0xa9, 0x9e, 0x74, 0x22, 0xbe, 0x78, 0xce, 0x4d, 0xdb, 0x60, 0x15, 0x68, 0xee, 0x2a, 0x35, + 0xb5, 0xe6, 0xba, 0x65, 0xdf, 0xc5, 0x68, 0xaf, 0x7c, 0x70, 0xaa, 0xe3, 0x1c, 0x7e, 0xdb, 0x03, + 0x93, 0x27, 0x61, 0x74, 0xa5, 0xdd, 0xa5, 0x7e, 0x7c, 0x4d, 0x7e, 0x99, 0xa9, 0x8e, 0x30, 0xa0, + 0x7f, 0x05, 0xf4, 0x28, 0x00, 0x12, 0x61, 0xca, 0x03, 0x7e, 0x73, 0xa9, 0x0e, 0x31, 0xc8, 0x92, + 0xe8, 0xae, 0x73, 0x5c, 0xab, 0xb9, 0x90, 0x9a, 0x6d, 0xcb, 0x5c, 0x69, 0xba, 0xd4, 0x5e, 0xc3, + 0x86, 0xa2, 0xb7, 0x86, 0x7a, 0x1a, 0x29, 0xf0, 0x6e, 0xc8, 0x99, 0xb3, 0xcc, 0x95, 0x25, 0x6a, + 0xaf, 0xb1, 0xa6, 0x3e, 0x0b, 0x44, 0x34, 0xd5, 0xc6, 0x53, 0x1d, 0xfe, 0x71, 0xe8, 0xae, 0xa1, + 0x8a, 0x8f, 0xe0, 0xc7, 0x3d, 0xf8, 0x61, 0x25, 0x18, 0xe6, 0x41, 0x06, 0xb9, 0xd0, 0xd0, 0x47, + 0x43, 0x05, 0x0e, 0x42, 0x79, 0x9d, 0x06, 0xe1, 0x3e, 0xc2, 0x5d, 0xe4, 0x55, 0xf1, 0xab, 0xfc, + 0xb9, 0x5c, 0x52, 0x5e, 0xc6, 0x7d, 0x29, 0x5a, 0x30, 0xad, 0x66, 0x77, 0x35, 0xad, 0x8e, 0x9b, + 0xdd, 0xb5, 0xa6, 0xd6, 0xe9, 0x34, 0xef, 0x18, 0x6d, 0x7c, 0xa3, 0x86, 0x0b, 0x9f, 0x3a, 0x6a, + 0x76, 0xd7, 0x2a, 0x9d, 0xce, 0x0c, 0x07, 0x92, 0x67, 0x60, 0x82, 0xd1, 0x61, 0x27, 0xf9, 0x94, + 0x79, 0xa4, 0x64, 0x0c, 0x30, 0x4a, 0xaf, 0x47, 0x7b, 0x16, 0x06, 0x05, 0x4f, 0xbe, 0x56, 0xf5, + 0xab, 0x03, 0x9c, 0x99, 0xc3, 0x7a, 0xce, 0x67, 0xc3, 0x27, 0xd7, 0x7e, 0x75, 0xc8, 0x2b, 0x8f, + 0xb1, 0xa8, 0xcd, 0xee, 0x1a, 0x0f, 0x2f, 0x36, 0x80, 0x48, 0xff, 0x37, 0xb9, 0x00, 0x63, 0x8c, + 0x8b, 0x2f, 0x30, 0x1e, 0xbe, 0xb7, 0x5f, 0x8d, 0x40, 0xc9, 0x55, 0x38, 0x19, 0x82, 0x70, 0x1b, + 0x94, 0xbf, 0xb9, 0xe8, 0x57, 0x13, 0x71, 0xe5, 0x5f, 0xca, 0x85, 0xb3, 0x45, 0x1e, 0x42, 0x47, + 0x9c, 0x81, 0x01, 0xcb, 0x5e, 0x69, 0x76, 0xed, 0xb6, 0x18, 0x7b, 0x05, 0xcb, 0x5e, 0xb9, 0x69, + 0xb7, 0xc9, 0x29, 0x28, 0xb0, 0xde, 0x31, 0x74, 0x31, 0xc4, 0xfa, 0xb5, 0x4e, 0xa7, 0xa6, 0x93, + 0x0a, 0xef, 0x10, 0x0c, 0xfd, 0xda, 0x6c, 0xe1, 0xd6, 0x9e, 0x7b, 0x5d, 0xf4, 0xf3, 0x15, 0x2f, + 0x86, 0xc4, 0x7e, 0xc2, 0x80, 0xb0, 0xfc, 0x20, 0x20, 0xc2, 0x42, 0xc7, 0x6d, 0x89, 0xce, 0xfb, + 0x24, 0xca, 0x42, 0x20, 0x03, 0x16, 0x7c, 0x13, 0xa3, 0x93, 0x29, 0x20, 0x01, 0xd5, 0x9a, 0xa5, + 0x1b, 0x77, 0x0c, 0xca, 0x9f, 0xc8, 0xf4, 0xf3, 0x9b, 0xed, 0x38, 0x56, 0x2d, 0x7a, 0x4c, 0xe6, + 0x05, 0x84, 0xbc, 0xce, 0x95, 0x90, 0xd3, 0xe1, 0xda, 0xc7, 0xfb, 0x96, 0xdb, 0x69, 0x11, 0x14, + 0x6a, 0x26, 0x96, 0xc7, 0x85, 0xb0, 0xfc, 0xb5, 0x42, 0x3c, 0x65, 0xe8, 0xa1, 0xd8, 0x35, 0xb3, + 0x00, 0x22, 0x23, 0x70, 0x70, 0x7b, 0x78, 0x4e, 0x4a, 0xff, 0x23, 0x30, 0x29, 0x3c, 0xa4, 0xb2, + 0xe4, 0x12, 0x0c, 0xf2, 0x2f, 0xaa, 0x4d, 0x09, 0x7b, 0x07, 0x7d, 0xe0, 0x9c, 0x8e, 0x71, 0xe7, + 0x0e, 0x3a, 0xcc, 0xf9, 0x68, 0x72, 0x01, 0x06, 0xa6, 0x16, 0x1a, 0x8d, 0xca, 0x82, 0x77, 0x15, + 0x8e, 0x8f, 0x75, 0x74, 0xd3, 0x69, 0x3a, 0x9a, 0xe9, 0xa8, 0x1e, 0x92, 0x3c, 0x09, 0x85, 0x5a, + 0x1d, 0xc9, 0xf8, 0x13, 0xd4, 0xe1, 0xad, 0xcd, 0xd2, 0x80, 0xd1, 0xe1, 0x54, 0x02, 0x85, 0xf5, + 0xde, 0xaa, 0x4d, 0x49, 0xfe, 0x20, 0xbc, 0xde, 0x7b, 0x86, 0x8e, 0xf7, 0xea, 0xaa, 0x8f, 0x26, + 0x2f, 0xc3, 0x48, 0x83, 0xda, 0x86, 0xd6, 0x5e, 0xe8, 0xe2, 0x56, 0x51, 0x0a, 0x69, 0xe9, 0x20, + 0xbc, 0x69, 0x22, 0x42, 0x0d, 0x91, 0x91, 0xf3, 0x90, 0x9f, 0x35, 0x4c, 0xef, 0x3d, 0x08, 0x3e, + 0x18, 0x58, 0x35, 0x4c, 0x57, 0x45, 0x28, 0x79, 0x12, 0x72, 0xd7, 0x97, 0x6a, 0xc2, 0xd5, 0x0d, + 0x79, 0xbd, 0xe3, 0x86, 0xc2, 0x63, 0x5e, 0x5f, 0xaa, 0x91, 0x97, 0x61, 0x88, 0x2d, 0x62, 0xd4, + 0x6c, 0x51, 0x47, 0x19, 0xc6, 0x8f, 0xe1, 0x31, 0x19, 0x3d, 0xa0, 0xec, 0xb4, 0xe2, 0x53, 0x92, + 0x1b, 0x50, 0x8c, 0xa6, 0xc6, 0x10, 0x6f, 0x92, 0xd0, 0xe2, 0x5a, 0x17, 0xb8, 0xa4, 0xa8, 0xa0, + 0xb1, 0x82, 0x44, 0x07, 0x25, 0x0a, 0x63, 0xfb, 0x3a, 0xb4, 0x3a, 0x79, 0x40, 0xea, 0x8b, 0x5b, + 0x9b, 0xa5, 0xa7, 0x62, 0x4c, 0x9b, 0xb6, 0xa0, 0x92, 0xb8, 0xa7, 0x72, 0x22, 0x1f, 0x07, 0xa8, + 0xb8, 0xae, 0x6d, 0x2c, 0x77, 0x99, 0x79, 0x38, 0xd6, 0xfb, 0x49, 0x43, 0x79, 0x6b, 0xb3, 0x74, + 0x52, 0xf3, 0xc9, 0x13, 0x1f, 0x36, 0x48, 0xec, 0xca, 0xff, 0x57, 0x36, 0x39, 0xc7, 0xed, 0x21, + 0x4c, 0x7d, 0x7b, 0x74, 0x1b, 0x88, 0x0c, 0xb8, 0xfc, 0x3e, 0x06, 0xdc, 0x1d, 0x18, 0xaf, 0xe8, + 0x6b, 0x86, 0x59, 0xc1, 0x9f, 0xce, 0xfc, 0x4c, 0x05, 0xa7, 0x52, 0xe9, 0xed, 0x67, 0x04, 0x2d, + 0xbe, 0x87, 0x07, 0xa2, 0x66, 0xa8, 0xa6, 0xc6, 0x71, 0xcd, 0xb5, 0x3b, 0x5a, 0xb3, 0xc5, 0xd3, + 0xc3, 0xaa, 0x51, 0xa6, 0xe5, 0x1f, 0xce, 0x6e, 0x93, 0x96, 0xf7, 0x61, 0x94, 0x7e, 0xf9, 0x8b, + 0xd9, 0xde, 0x99, 0x91, 0x1f, 0x4a, 0xa1, 0xfc, 0x69, 0x36, 0x21, 0x4f, 0xf1, 0xbe, 0x24, 0x71, + 0x09, 0x06, 0x39, 0x1b, 0xdf, 0x6f, 0x1b, 0x67, 0x77, 0xae, 0xac, 0xb8, 0xaa, 0x78, 0x68, 0xb2, + 0x00, 0x27, 0x2b, 0x77, 0xee, 0xd0, 0x96, 0x1b, 0x84, 0x24, 0x5f, 0x08, 0x22, 0xfc, 0xf2, 0x10, + 0xcc, 0x02, 0x1f, 0x84, 0x34, 0xc7, 0x48, 0x36, 0x89, 0xe5, 0xc8, 0x12, 0x9c, 0x8e, 0xc2, 0x1b, + 0x7c, 0x4b, 0x94, 0x97, 0xa2, 0x32, 0xc7, 0x38, 0xf2, 0xff, 0xd4, 0x94, 0xb2, 0x49, 0xad, 0xc4, + 0xa5, 0xab, 0xbf, 0x57, 0x2b, 0x71, 0x1d, 0x4b, 0x2c, 0x57, 0xfe, 0x7a, 0x4e, 0x4e, 0xe7, 0xfc, + 0xf0, 0x7a, 0xd8, 0xbd, 0x14, 0xf2, 0xab, 0xdf, 0xe9, 0x90, 0x79, 0x59, 0x84, 0xa7, 0xd1, 0xbb, + 0xb6, 0xe7, 0x82, 0xea, 0x87, 0xc7, 0x40, 0xa0, 0xbc, 0x2e, 0xfb, 0x94, 0xa4, 0x06, 0xf9, 0x8a, + 0xbd, 0xc2, 0xcd, 0xfd, 0xed, 0x5e, 0xec, 0x69, 0xf6, 0x4a, 0xf2, 0xc2, 0x86, 0x2c, 0xca, 0x3f, + 0x94, 0xed, 0x91, 0x81, 0xf9, 0xa1, 0x9c, 0x44, 0x7e, 0x3c, 0x9b, 0x96, 0x4b, 0xf9, 0xa8, 0xfa, + 0x0a, 0xbe, 0xc7, 0xc2, 0x39, 0xda, 0x8e, 0x94, 0x07, 0x28, 0x9c, 0xdf, 0xcb, 0xa6, 0x25, 0x86, + 0x3e, 0x16, 0xce, 0xde, 0x26, 0xc8, 0x44, 0x91, 0x3e, 0xc4, 0x36, 0xb7, 0xac, 0x0a, 0xfd, 0x7b, + 0xf4, 0x97, 0x4b, 0x12, 0xe9, 0xf1, 0x10, 0xde, 0x97, 0x96, 0x7e, 0x2b, 0x9b, 0x9a, 0x00, 0xfd, + 0x58, 0xa6, 0x07, 0x29, 0xd3, 0xe3, 0xa1, 0xbf, 0xaf, 0xa1, 0x9f, 0x28, 0xd3, 0xe3, 0xb1, 0xbf, + 0x2f, 0x3d, 0xfd, 0x99, 0xec, 0x36, 0x49, 0x51, 0x8f, 0xf8, 0xb9, 0xea, 0x69, 0x28, 0x88, 0x9b, + 0x07, 0xcc, 0x75, 0xa8, 0x8a, 0x5f, 0x7b, 0x94, 0xd6, 0xdf, 0xc9, 0x6e, 0x9b, 0xd2, 0xf5, 0x58, + 0x5e, 0x92, 0xbc, 0xbe, 0x92, 0xdd, 0x2e, 0x19, 0xed, 0xb1, 0xb8, 0x24, 0x71, 0xfd, 0x6e, 0x16, + 0x33, 0xc2, 0xbb, 0x46, 0x6b, 0xd6, 0x72, 0x5c, 0x29, 0xa9, 0xfb, 0x9f, 0xff, 0x8a, 0x71, 0x10, + 0xfe, 0xe5, 0x5e, 0xf7, 0xe4, 0xf7, 0xd5, 0x3d, 0xfd, 0xfb, 0xd8, 0xd2, 0xc4, 0x05, 0x7a, 0x68, + 0x4b, 0xf0, 0x77, 0xaa, 0x40, 0x0f, 0x60, 0xfd, 0x7d, 0x98, 0x05, 0xfa, 0x57, 0x72, 0x50, 0xac, + 0xda, 0xd6, 0xba, 0x79, 0x9d, 0xae, 0xd3, 0xf6, 0xa1, 0x0d, 0xf7, 0x07, 0xc2, 0x40, 0xb4, 0xf7, + 0x68, 0x20, 0x7a, 0xe5, 0xc8, 0x9b, 0x30, 0x1e, 0xc8, 0x52, 0x8e, 0xf1, 0x88, 0x77, 0xdb, 0x2d, + 0x86, 0x6a, 0xbe, 0xc3, 0x70, 0x22, 0x18, 0x59, 0x94, 0xba, 0xfc, 0xed, 0x50, 0x6f, 0x3c, 0xdc, + 0xe6, 0xfa, 0xbe, 0x7b, 0xe3, 0x26, 0x9c, 0xae, 0x76, 0x6d, 0x9b, 0x9a, 0x6e, 0x72, 0xa7, 0xe0, + 0x4d, 0x5a, 0x8b, 0x53, 0x34, 0xe3, 0x9d, 0x93, 0x52, 0x98, 0xb1, 0x15, 0x6f, 0xcb, 0xa2, 0x6c, + 0x07, 0x02, 0xb6, 0x5d, 0x4e, 0x91, 0xc4, 0x36, 0xb9, 0x70, 0xf9, 0xb7, 0xb2, 0x72, 0xd7, 0x1f, + 0xda, 0xac, 0xf6, 0x1d, 0xd1, 0xf5, 0xe5, 0xcf, 0xe5, 0x60, 0x8c, 0x35, 0x6b, 0x49, 0x73, 0xee, + 0x1e, 0x9b, 0x30, 0xfb, 0x59, 0x20, 0xd8, 0x57, 0x78, 0x92, 0xc4, 0x71, 0x23, 0x7d, 0x85, 0x07, + 0x4f, 0xfb, 0x0a, 0x0f, 0x5f, 0xfe, 0xd9, 0x7c, 0xd0, 0x1d, 0xc7, 0x06, 0xd0, 0x61, 0x77, 0x07, + 0x59, 0x84, 0x93, 0x62, 0x6e, 0xf3, 0x40, 0x98, 0xec, 0x47, 0xcc, 0x5f, 0x3c, 0x67, 0xa8, 0x98, + 0x16, 0xbb, 0x0e, 0xb5, 0x9b, 0xae, 0xe6, 0xdc, 0x6d, 0x62, 0x76, 0x20, 0x35, 0xb1, 0x20, 0x63, + 0x28, 0x66, 0xb5, 0x30, 0xc3, 0xc1, 0x80, 0xa1, 0x37, 0x21, 0xc6, 0x18, 0x26, 0x15, 0x2c, 0xff, + 0x42, 0x06, 0x8a, 0xd1, 0xcf, 0x21, 0x97, 0x61, 0x90, 0xfd, 0xf6, 0x83, 0x9e, 0x08, 0x97, 0xec, + 0x80, 0x23, 0xf7, 0x17, 0xf2, 0x68, 0xc8, 0x2b, 0x30, 0x84, 0xae, 0x59, 0x58, 0x20, 0x1b, 0xc4, + 0x9a, 0x09, 0x0a, 0x60, 0x86, 0x6d, 0x5e, 0x2c, 0x20, 0x25, 0xaf, 0xc3, 0x70, 0x2d, 0xf0, 0x41, + 0x15, 0x17, 0xd0, 0xe8, 0xfa, 0x2e, 0x95, 0x0c, 0x08, 0x54, 0x99, 0xba, 0xfc, 0x8d, 0x6c, 0xa0, + 0xea, 0xc7, 0xa6, 0xe9, 0xbe, 0x4c, 0xd3, 0x9f, 0xcb, 0xc1, 0x68, 0xd5, 0x32, 0x5d, 0xad, 0xe5, + 0x1e, 0x1f, 0x06, 0xef, 0xe7, 0x90, 0x8d, 0x94, 0xa0, 0x7f, 0x7a, 0x4d, 0x33, 0xda, 0xc2, 0xf0, + 0xc1, 0x88, 0xd8, 0x94, 0x01, 0x54, 0x0e, 0x27, 0xd7, 0x30, 0x0e, 0x14, 0x93, 0xb4, 0xef, 0x88, + 0x37, 0x16, 0x04, 0x0f, 0x96, 0x50, 0x22, 0x7d, 0x36, 0x07, 0xf0, 0x91, 0x23, 0x97, 0x94, 0xfb, + 0xec, 0xf8, 0x60, 0xf4, 0x88, 0xf4, 0xd9, 0x97, 0x72, 0x70, 0x3a, 0xea, 0x10, 0x78, 0x3c, 0xe0, + 0x44, 0xe7, 0xfd, 0x05, 0x38, 0x19, 0x95, 0xcd, 0x14, 0x93, 0x46, 0x7f, 0x6f, 0xdf, 0x91, 0xcb, + 0x5b, 0x9b, 0xa5, 0xc7, 0xe3, 0xbe, 0x98, 0xac, 0xb2, 0x44, 0x6f, 0x92, 0xc4, 0x4a, 0x12, 0x7b, + 0xe6, 0x01, 0x79, 0x25, 0xfc, 0x90, 0xf7, 0xcc, 0x8f, 0x67, 0xe3, 0x3d, 0x73, 0x3c, 0xe1, 0x89, + 0x85, 0xfb, 0xb7, 0xb3, 0xf0, 0x54, 0x54, 0x38, 0x6f, 0xbd, 0xfc, 0xfc, 0xab, 0x2a, 0xf5, 0x82, + 0x86, 0x1e, 0x4f, 0x2f, 0x42, 0x89, 0x31, 0xfa, 0xab, 0xe6, 0xf8, 0x2f, 0x07, 0x45, 0xf4, 0x57, + 0x06, 0x51, 0x05, 0x66, 0x07, 0xe2, 0x3c, 0x9e, 0x13, 0x76, 0x21, 0xce, 0x9f, 0xda, 0x56, 0x9c, + 0xc7, 0x03, 0xd9, 0x73, 0x57, 0xcb, 0x03, 0x5c, 0x33, 0x5c, 0x11, 0x5a, 0xf9, 0x88, 0x5f, 0x95, + 0x49, 0x7e, 0xae, 0xf9, 0x3d, 0xf9, 0xb9, 0x06, 0x01, 0x93, 0xfa, 0xf7, 0x10, 0x30, 0xe9, 0x4d, + 0x18, 0x10, 0x72, 0x14, 0xfb, 0xf6, 0x33, 0xc1, 0x57, 0x20, 0x38, 0xad, 0x7a, 0x4f, 0xfa, 0x4f, + 0xc3, 0x80, 0xc3, 0x83, 0x88, 0x89, 0x7d, 0x35, 0xbe, 0xa7, 0x11, 0x20, 0xd5, 0xfb, 0x83, 0x9c, + 0x07, 0xcc, 0x87, 0x21, 0x3f, 0x77, 0xe1, 0xf9, 0x31, 0xd8, 0xbf, 0xa4, 0x06, 0x03, 0xe2, 0xd5, + 0x80, 0x02, 0xf8, 0x56, 0xd7, 0x57, 0xcb, 0xa0, 0x9f, 0xf9, 0xe3, 0x01, 0x7e, 0x66, 0x2d, 0x88, + 0xe5, 0x47, 0xcc, 0x02, 0x54, 0xfe, 0xf5, 0x0c, 0x14, 0xa3, 0x85, 0xc8, 0xb3, 0x50, 0xe0, 0x7f, + 0x89, 0x1d, 0x3a, 0xc6, 0x32, 0xe5, 0x25, 0xe4, 0x58, 0xa6, 0x82, 0xfa, 0x65, 0x18, 0x52, 0xbd, + 0xa7, 0x20, 0x62, 0x87, 0x8e, 0xfe, 0xbb, 0xfe, 0xfb, 0x10, 0xd9, 0x7f, 0xd7, 0xa7, 0x24, 0x4f, + 0x42, 0x6e, 0xb1, 0xad, 0x8b, 0x8d, 0x39, 0xbe, 0xd9, 0xb1, 0xda, 0x72, 0xa0, 0x56, 0x86, 0x65, + 0x44, 0x0b, 0x74, 0x5d, 0x38, 0x7b, 0x23, 0x91, 0x49, 0xd7, 0x65, 0xa2, 0x05, 0xba, 0x5e, 0xfe, + 0x9d, 0x8c, 0xe7, 0xbe, 0x3b, 0x67, 0x38, 0x6e, 0xcd, 0xbc, 0xa7, 0xb5, 0x0d, 0xbf, 0x23, 0xc8, + 0x35, 0x18, 0x0b, 0x90, 0xd2, 0x9b, 0xff, 0x58, 0x6c, 0x1c, 0x7c, 0x15, 0xfe, 0x78, 0xc0, 0x3b, + 0x52, 0x8c, 0x5c, 0x90, 0x94, 0x5f, 0x3a, 0xb5, 0x90, 0x1f, 0x92, 0x0b, 0x57, 0xec, 0x91, 0x79, + 0xc3, 0x71, 0x0c, 0x73, 0x85, 0xbf, 0x47, 0xcc, 0xe1, 0x53, 0x23, 0x3c, 0x3f, 0x59, 0xe3, 0xf0, + 0xa6, 0xcd, 0x10, 0xf2, 0x9b, 0x69, 0xb9, 0x40, 0xf9, 0xdf, 0x67, 0xe0, 0x1c, 0xe3, 0x84, 0x51, + 0x3a, 0x63, 0x1f, 0xb6, 0xaf, 0x01, 0xbc, 0xd6, 0x43, 0x52, 0x62, 0x54, 0x3f, 0x11, 0x0f, 0x4c, + 0x11, 0x21, 0x8c, 0x70, 0xef, 0x21, 0xfb, 0xbd, 0x05, 0x4a, 0xfb, 0xed, 0x0c, 0x5e, 0x0f, 0x2e, + 0xb7, 0xe9, 0xcd, 0x85, 0xda, 0x5b, 0x07, 0x74, 0x81, 0xbd, 0xd7, 0xa9, 0xeb, 0x23, 0x50, 0x74, + 0xb0, 0x2d, 0xcd, 0xae, 0x69, 0xdc, 0xc7, 0x93, 0x2f, 0xf1, 0x31, 0xa7, 0xa5, 0x8f, 0x91, 0xda, + 0xaa, 0x8e, 0x71, 0xfa, 0x9b, 0xa6, 0x71, 0x1f, 0x83, 0x94, 0x7e, 0x18, 0xe3, 0xbe, 0x4b, 0x14, + 0xe4, 0x1c, 0x0c, 0x32, 0x3e, 0xa6, 0xaf, 0x8c, 0xaa, 0xff, 0x9b, 0x14, 0x21, 0xd7, 0x35, 0x74, + 0x6c, 0x66, 0xbf, 0xca, 0xfe, 0x2c, 0xff, 0x41, 0x0e, 0x26, 0x2a, 0xb7, 0x1b, 0xb5, 0xaa, 0xff, + 0x8a, 0x41, 0x3c, 0x34, 0x5d, 0xdb, 0xa5, 0x2c, 0x3c, 0x7a, 0x52, 0x85, 0x31, 0x1e, 0x28, 0x40, + 0x04, 0xb3, 0xe7, 0xe7, 0x52, 0xfd, 0xfc, 0x35, 0x45, 0x18, 0x23, 0x29, 0xe9, 0x28, 0x62, 0x44, + 0xcc, 0x7b, 0x87, 0xb4, 0xe0, 0x6c, 0x88, 0xb4, 0xa9, 0xf9, 0x71, 0xd8, 0xbc, 0x18, 0x18, 0xef, + 0xdb, 0xda, 0x2c, 0x3d, 0x99, 0x4a, 0x24, 0xb1, 0x3e, 0x23, 0xb3, 0x0e, 0xe2, 0xb9, 0x39, 0xe4, + 0x06, 0x4c, 0xf0, 0xf2, 0x78, 0x68, 0xe7, 0x3b, 0x49, 0x30, 0xe6, 0x52, 0xbc, 0x03, 0x09, 0x29, + 0xc7, 0xb6, 0x42, 0x24, 0x13, 0xb8, 0x78, 0x24, 0x7c, 0x1b, 0x4e, 0x71, 0xfa, 0x0e, 0xb5, 0x71, + 0x24, 0x5a, 0x66, 0xd3, 0xa1, 0xae, 0x78, 0x6b, 0x3c, 0xf9, 0xe4, 0xd6, 0x66, 0xa9, 0x94, 0x48, + 0x20, 0x31, 0x3d, 0x81, 0x04, 0x75, 0x1f, 0xdf, 0xa0, 0xae, 0xec, 0xa7, 0x51, 0xd8, 0x85, 0x9a, + 0xff, 0x44, 0x16, 0xce, 0xcc, 0x52, 0xad, 0xed, 0xae, 0x56, 0x57, 0x69, 0xeb, 0xee, 0xb1, 0xab, + 0x74, 0xc8, 0x6a, 0x49, 0x94, 0xce, 0xb1, 0x89, 0xdc, 0x4b, 0x3a, 0xc7, 0x16, 0xaf, 0x90, 0xce, + 0x57, 0xb2, 0x70, 0x31, 0x69, 0x73, 0x80, 0xb7, 0x03, 0xf6, 0xe2, 0x3d, 0x6a, 0xdb, 0x86, 0x4e, + 0x0f, 0x71, 0x51, 0x39, 0x38, 0x7b, 0x58, 0xee, 0xb0, 0xfc, 0x1e, 0x3d, 0x62, 0x77, 0x26, 0xae, + 0x43, 0x4c, 0x62, 0xf3, 0x60, 0x89, 0xeb, 0xc7, 0xb2, 0x70, 0xb2, 0x61, 0xac, 0x38, 0xae, 0x65, + 0xd3, 0x3a, 0x46, 0xec, 0x38, 0xd6, 0xa4, 0x54, 0xd1, 0x1c, 0x62, 0xae, 0xa8, 0x07, 0x5d, 0x34, + 0xc7, 0x03, 0x4a, 0x88, 0xe6, 0x7b, 0x73, 0x30, 0x3e, 0x5f, 0xad, 0x8b, 0x1d, 0x3a, 0xa6, 0xe7, + 0x3b, 0x9a, 0x6f, 0x68, 0x83, 0xb3, 0x85, 0xfc, 0x1e, 0xce, 0x16, 0x0e, 0xce, 0xbd, 0x40, 0x64, + 0x0f, 0x2d, 0xec, 0x26, 0x7b, 0x68, 0xf9, 0xd3, 0x39, 0x18, 0x0d, 0x7a, 0x61, 0xfa, 0x90, 0x4e, + 0x8a, 0x1e, 0xee, 0x3e, 0xf8, 0x56, 0x06, 0x26, 0xe6, 0xab, 0xf5, 0xeb, 0x8d, 0xc5, 0x05, 0xb5, + 0x5e, 0x9d, 0xa7, 0x8e, 0xa3, 0xad, 0x50, 0xf2, 0x34, 0x0c, 0x08, 0x88, 0x38, 0xba, 0xc0, 0x33, + 0xa3, 0x77, 0x1c, 0xcb, 0xb4, 0x3b, 0x2d, 0xd5, 0xc3, 0x89, 0xbc, 0x37, 0xd9, 0x1e, 0x79, 0x6f, + 0xca, 0x20, 0x52, 0xa3, 0x8a, 0x53, 0x97, 0x50, 0xb2, 0x54, 0xfe, 0x3f, 0x59, 0x84, 0x42, 0x47, + 0xb3, 0xb5, 0x35, 0x67, 0xbb, 0x2b, 0x98, 0xc7, 0xb6, 0x36, 0x4b, 0x45, 0x4e, 0x9a, 0x78, 0xe5, + 0x22, 0xd8, 0xb0, 0xd1, 0x3d, 0x11, 0xe8, 0x95, 0x94, 0x54, 0x77, 0xcf, 0xdb, 0xd7, 0x57, 0x20, + 0xdf, 0xdd, 0xa5, 0x6e, 0x75, 0x85, 0x6e, 0x39, 0x7b, 0xd2, 0x2d, 0x51, 0xca, 0xeb, 0xd3, 0xfc, + 0xae, 0xb2, 0xf2, 0x06, 0x01, 0x3b, 0xfb, 0x77, 0x1e, 0xb0, 0x93, 0x2c, 0xc0, 0xc0, 0x1a, 0xef, + 0x7e, 0xa1, 0x42, 0x7e, 0x38, 0xbe, 0x98, 0x7e, 0x4c, 0x9e, 0x15, 0xf9, 0x33, 0x27, 0x44, 0x09, + 0xf9, 0x9c, 0x4f, 0x80, 0xca, 0xbf, 0x9f, 0x85, 0xd3, 0x41, 0x2f, 0x2c, 0x58, 0xae, 0x71, 0xc7, + 0xe0, 0xe7, 0xe4, 0x0f, 0x51, 0x57, 0x48, 0x42, 0xed, 0x3f, 0x00, 0xa1, 0x3e, 0xd3, 0xe2, 0x6e, + 0x5c, 0x37, 0x0c, 0x53, 0x27, 0x67, 0xe1, 0xd4, 0xcd, 0xc6, 0xb4, 0xda, 0xbc, 0x51, 0x5b, 0x98, + 0x6a, 0xde, 0x5c, 0x68, 0xd4, 0xa7, 0xab, 0xb5, 0x99, 0xda, 0xf4, 0x54, 0xb1, 0x8f, 0x9c, 0x80, + 0xf1, 0x00, 0x35, 0x7b, 0x73, 0xbe, 0xb2, 0x50, 0xcc, 0x90, 0x09, 0x18, 0x0d, 0x80, 0x93, 0x8b, + 0x4b, 0xc5, 0x2c, 0x39, 0x09, 0xc5, 0x00, 0xd4, 0x78, 0xbb, 0xb1, 0x34, 0x3d, 0x5f, 0xcc, 0x3d, + 0xf3, 0xe3, 0x19, 0x00, 0x56, 0xcb, 0xa2, 0x6d, 0xac, 0x18, 0x26, 0x79, 0x04, 0xce, 0x20, 0xd1, + 0xa2, 0x5a, 0xbb, 0x56, 0x5b, 0x88, 0xd4, 0x74, 0x0a, 0x26, 0x64, 0xe4, 0xdc, 0x62, 0xb5, 0x32, + 0x57, 0xcc, 0xf8, 0x0d, 0x10, 0xe0, 0x46, 0x63, 0x51, 0xaa, 0x4d, 0x00, 0x17, 0x6f, 0x2c, 0x55, + 0x8a, 0xb9, 0x28, 0xb4, 0x51, 0xad, 0xcd, 0x17, 0xf3, 0xe4, 0x0c, 0x9c, 0x90, 0xa1, 0xd3, 0x0b, + 0x4b, 0x6a, 0xa5, 0x36, 0x55, 0xec, 0x7f, 0xe6, 0x7d, 0x30, 0x8c, 0xa1, 0xf0, 0xc4, 0x51, 0xf0, + 0x08, 0x0c, 0x2e, 0x4e, 0x36, 0xa6, 0xd5, 0x5b, 0xd8, 0x1a, 0x80, 0xc2, 0xd4, 0xf4, 0x02, 0x6b, + 0x59, 0xe6, 0x99, 0x7f, 0x9b, 0x01, 0x68, 0xcc, 0x2c, 0xd5, 0x05, 0xe1, 0x30, 0x0c, 0xd4, 0x16, + 0x6e, 0x55, 0xe6, 0x6a, 0x8c, 0x6e, 0x10, 0xf2, 0x8b, 0xf5, 0x69, 0x26, 0x94, 0x21, 0xe8, 0xaf, + 0xce, 0x2d, 0x36, 0xa6, 0x8b, 0x59, 0x06, 0x54, 0xa7, 0x2b, 0x53, 0xc5, 0x1c, 0x03, 0xde, 0x56, + 0x6b, 0x4b, 0xd3, 0xc5, 0x3c, 0xfb, 0x73, 0xae, 0xb1, 0x54, 0x59, 0x2a, 0xf6, 0xb3, 0x3f, 0x67, + 0xf0, 0xcf, 0x02, 0x63, 0xd6, 0x98, 0x5e, 0xc2, 0x1f, 0x03, 0xac, 0x09, 0x33, 0xde, 0xaf, 0x41, + 0x86, 0x62, 0xac, 0xa7, 0x6a, 0x6a, 0x71, 0x88, 0xfd, 0x60, 0x2c, 0xd9, 0x0f, 0x60, 0x8d, 0x53, + 0xa7, 0xe7, 0x17, 0x6f, 0x4d, 0x17, 0x87, 0x19, 0xaf, 0xf9, 0x1b, 0x0c, 0x3c, 0xc2, 0xfe, 0x54, + 0xe7, 0xd9, 0x9f, 0xa3, 0x8c, 0x93, 0x3a, 0x5d, 0x99, 0xab, 0x57, 0x96, 0x66, 0x8b, 0x63, 0xac, + 0x3d, 0xc8, 0x73, 0x9c, 0x97, 0x5c, 0xa8, 0xcc, 0x4f, 0x17, 0x8b, 0x82, 0x66, 0x6a, 0xae, 0xb6, + 0x70, 0xa3, 0x38, 0x81, 0x0d, 0x79, 0x7b, 0x1e, 0x7f, 0x10, 0x56, 0x00, 0xff, 0x3a, 0xf1, 0xcc, + 0x77, 0x41, 0x61, 0xb1, 0x81, 0x4e, 0x69, 0x67, 0xe0, 0xc4, 0x62, 0xa3, 0xb9, 0xf4, 0x76, 0x7d, + 0x3a, 0xd2, 0x71, 0x13, 0x30, 0xea, 0x21, 0xe6, 0x6a, 0x0b, 0x37, 0xdf, 0xe2, 0x0a, 0xe2, 0x81, + 0xe6, 0x2b, 0xd5, 0xc5, 0x46, 0x31, 0xcb, 0xfa, 0xd1, 0x03, 0xdd, 0xae, 0x2d, 0x4c, 0x2d, 0xde, + 0x6e, 0x14, 0x73, 0xcf, 0xdc, 0x83, 0x91, 0x29, 0x7a, 0xcf, 0x68, 0x51, 0xa1, 0x20, 0x8f, 0xc2, + 0xd9, 0xa9, 0xe9, 0x5b, 0xb5, 0xea, 0x74, 0xaa, 0x8a, 0x84, 0xd1, 0x95, 0x7a, 0xad, 0x98, 0x21, + 0xa7, 0x81, 0x84, 0xc1, 0xd7, 0x2b, 0xf3, 0x33, 0xc5, 0x2c, 0x51, 0xe0, 0x64, 0x18, 0x5e, 0x5b, + 0x58, 0xba, 0xb9, 0x30, 0x5d, 0xcc, 0x3d, 0xf3, 0x37, 0x33, 0x70, 0x6a, 0xba, 0xad, 0x39, 0xae, + 0xd1, 0x72, 0x42, 0x69, 0xff, 0x49, 0x19, 0x1e, 0x9b, 0x9e, 0xab, 0x34, 0x96, 0x6a, 0xd5, 0xc6, + 0x74, 0x45, 0xad, 0xce, 0x36, 0xab, 0x95, 0xa5, 0xe9, 0x6b, 0x8b, 0xea, 0xdb, 0xcd, 0x6b, 0xd3, + 0x0b, 0xd3, 0x6a, 0x65, 0xae, 0xd8, 0x47, 0x9e, 0x84, 0x52, 0x0a, 0x4d, 0x63, 0xba, 0x7a, 0x53, + 0xad, 0x2d, 0xbd, 0x5d, 0xcc, 0x90, 0x27, 0xe0, 0xd1, 0x54, 0x22, 0xf6, 0xbb, 0x98, 0x25, 0x8f, + 0xc1, 0xb9, 0x34, 0x92, 0x8f, 0xce, 0x15, 0x73, 0xcf, 0xfc, 0x58, 0x06, 0xc8, 0x62, 0x87, 0x9a, + 0x8d, 0x70, 0x13, 0x1f, 0x87, 0xf3, 0x4c, 0x2f, 0x9a, 0xe9, 0x0d, 0x7c, 0x02, 0x1e, 0x4d, 0xa4, + 0x90, 0x9a, 0x57, 0x82, 0x47, 0x52, 0x48, 0x44, 0xe3, 0xce, 0x83, 0x92, 0x4c, 0x80, 0x4d, 0xfb, + 0xf9, 0x0c, 0x9c, 0x4a, 0x8c, 0x0e, 0x45, 0x2e, 0xc2, 0x53, 0x95, 0xa9, 0x79, 0xd6, 0x37, 0xd5, + 0xa5, 0xda, 0xe2, 0x42, 0xa3, 0x39, 0x3f, 0x53, 0x69, 0x32, 0xed, 0xbb, 0xd9, 0x88, 0xf4, 0xe6, + 0x05, 0x28, 0xf7, 0xa0, 0xac, 0xce, 0x56, 0x16, 0xae, 0xb1, 0xe1, 0x47, 0x9e, 0x82, 0xc7, 0x53, + 0xe9, 0xa6, 0x17, 0x2a, 0x93, 0x73, 0xd3, 0x53, 0xc5, 0x2c, 0x79, 0x1a, 0x9e, 0x48, 0xa5, 0x9a, + 0xaa, 0x35, 0x38, 0x59, 0xee, 0x19, 0x2d, 0xe4, 0xb3, 0xc4, 0xbe, 0xb2, 0xba, 0xb8, 0xb0, 0x54, + 0xa9, 0x2e, 0x25, 0x69, 0xf6, 0x59, 0x38, 0x15, 0xc2, 0x4e, 0xde, 0x6c, 0xd4, 0x16, 0xa6, 0x1b, + 0x8d, 0x62, 0x26, 0x86, 0xf2, 0x45, 0x9b, 0x9d, 0x9c, 0xfa, 0xc6, 0xff, 0xf2, 0x58, 0xdf, 0x37, + 0xfe, 0xe4, 0xb1, 0xcc, 0xef, 0xfd, 0xc9, 0x63, 0x99, 0x7f, 0xf5, 0x27, 0x8f, 0x65, 0x3e, 0x76, + 0x75, 0xc5, 0x70, 0x57, 0xbb, 0xcb, 0x97, 0x5b, 0xd6, 0xda, 0x95, 0x15, 0x5b, 0xbb, 0x67, 0xb8, + 0xb8, 0x7a, 0x69, 0xed, 0x2b, 0x2e, 0x6d, 0x63, 0x58, 0xe2, 0x2b, 0x5a, 0xc7, 0xb8, 0x82, 0x59, + 0xdc, 0xae, 0xf0, 0x59, 0x7d, 0xb9, 0x80, 0x36, 0xcb, 0x8b, 0xff, 0x21, 0x00, 0x00, 0xff, 0xff, + 0x37, 0xbe, 0x9c, 0x70, 0xca, 0xba, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -33956,6 +34290,98 @@ func (m *OneOf_AutoUpdateAgentRolloutRollback) MarshalToSizedBuffer(dAtA []byte) } return len(dAtA) - i, nil } +func (m *OneOf_MCPSessionStart) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_MCPSessionStart) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MCPSessionStart != nil { + { + size, err := m.MCPSessionStart.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xd + i-- + dAtA[i] = 0xc2 + } + return len(dAtA) - i, nil +} +func (m *OneOf_MCPSessionEnd) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_MCPSessionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MCPSessionEnd != nil { + { + size, err := m.MCPSessionEnd.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xd + i-- + dAtA[i] = 0xca + } + return len(dAtA) - i, nil +} +func (m *OneOf_MCPSessionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_MCPSessionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MCPSessionRequest != nil { + { + size, err := m.MCPSessionRequest.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xd + i-- + dAtA[i] = 0xd2 + } + return len(dAtA) - i, nil +} +func (m *OneOf_MCPSessionNotification) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OneOf_MCPSessionNotification) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MCPSessionNotification != nil { + { + size, err := m.MCPSessionNotification.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xd + i-- + dAtA[i] = 0xda + } + return len(dAtA) - i, nil +} func (m *StreamStatus) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -33980,12 +34406,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n687, err687 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err687 != nil { - return 0, err687 + n691, err691 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err691 != nil { + return 0, err691 } - i -= n687 - i = encodeVarintEvents(dAtA, i, uint64(n687)) + i -= n691 + i = encodeVarintEvents(dAtA, i, uint64(n691)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -34144,12 +34570,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n691, err691 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err691 != nil { - return 0, err691 + n695, err695 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err695 != nil { + return 0, err695 } - i -= n691 - i = encodeVarintEvents(dAtA, i, uint64(n691)) + i -= n695 + i = encodeVarintEvents(dAtA, i, uint64(n695)) i-- dAtA[i] = 0x1 i-- @@ -34297,12 +34723,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n695, err695 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err695 != nil { - return 0, err695 + n699, err699 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err699 != nil { + return 0, err699 } - i -= n695 - i = encodeVarintEvents(dAtA, i, uint64(n695)) + i -= n699 + i = encodeVarintEvents(dAtA, i, uint64(n699)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -42801,6 +43227,404 @@ func (m *SigstorePolicyDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *MCPSessionStart) 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 *MCPSessionStart) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MCPSessionStart) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.AppMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.ServerMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.SessionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MCPSessionEnd) 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 *MCPSessionEnd) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MCPSessionEnd) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.AppMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + { + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.ServerMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.SessionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MCPJSONRPCMessage) 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 *MCPJSONRPCMessage) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MCPJSONRPCMessage) 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.Params != nil { + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if len(m.Method) > 0 { + i -= len(m.Method) + copy(dAtA[i:], m.Method) + i = encodeVarintEvents(dAtA, i, uint64(len(m.Method))) + i-- + dAtA[i] = 0x1a + } + if len(m.ID) > 0 { + i -= len(m.ID) + copy(dAtA[i:], m.ID) + i = encodeVarintEvents(dAtA, i, uint64(len(m.ID))) + i-- + dAtA[i] = 0x12 + } + if len(m.JSONRPC) > 0 { + i -= len(m.JSONRPC) + copy(dAtA[i:], m.JSONRPC) + i = encodeVarintEvents(dAtA, i, uint64(len(m.JSONRPC))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MCPSessionRequest) 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 *MCPSessionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MCPSessionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.AppMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.SessionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *MCPSessionNotification) 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 *MCPSessionNotification) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MCPSessionNotification) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + { + size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + { + size, err := m.AppMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + { + size, err := m.SessionMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + { + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func encodeVarintEvents(dAtA []byte, offset int, v uint64) int { offset -= sovEvents(v) base := offset @@ -49324,6 +50148,54 @@ func (m *OneOf_AutoUpdateAgentRolloutRollback) Size() (n int) { } return n } +func (m *OneOf_MCPSessionStart) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MCPSessionStart != nil { + l = m.MCPSessionStart.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_MCPSessionEnd) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MCPSessionEnd != nil { + l = m.MCPSessionEnd.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_MCPSessionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MCPSessionRequest != nil { + l = m.MCPSessionRequest.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} +func (m *OneOf_MCPSessionNotification) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MCPSessionNotification != nil { + l = m.MCPSessionNotification.Size() + n += 2 + l + sovEvents(uint64(l)) + } + return n +} func (m *StreamStatus) Size() (n int) { if m == nil { return 0 @@ -52443,6 +53315,128 @@ func (m *SigstorePolicyDelete) Size() (n int) { return n } +func (m *MCPSessionStart) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.SessionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ServerMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.AppMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *MCPSessionEnd) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.SessionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ServerMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.ConnectionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.AppMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *MCPJSONRPCMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.JSONRPC) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.ID) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + l = len(m.Method) + if l > 0 { + n += 1 + l + sovEvents(uint64(l)) + } + if m.Params != nil { + l = m.Params.Size() + n += 1 + l + sovEvents(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *MCPSessionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.SessionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.AppMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Message.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *MCPSessionNotification) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Metadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.UserMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.SessionMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.AppMetadata.Size() + n += 1 + l + sovEvents(uint64(l)) + l = m.Message.Size() + n += 1 + l + sovEvents(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func sovEvents(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -92614,62 +93608,11 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { } m.Event = &OneOf_AutoUpdateAgentRolloutRollback{v} iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - 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 *StreamStatus) 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 ErrIntOverflowEvents - } - 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: StreamStatus: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 216: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MCPSessionStart", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -92679,46 +93622,30 @@ func (m *StreamStatus) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.UploadID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) - } - m.LastEventIndex = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.LastEventIndex |= int64(b&0x7F) << shift - if b < 0x80 { - break - } + v := &MCPSessionStart{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - case 3: + m.Event = &OneOf_MCPSessionStart{v} + iNdEx = postIndex + case 217: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MCPSessionEnd", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -92745,9 +93672,81 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + v := &MCPSessionEnd{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Event = &OneOf_MCPSessionEnd{v} + iNdEx = postIndex + case 218: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MCPSessionRequest", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &MCPSessionRequest{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_MCPSessionRequest{v} + iNdEx = postIndex + case 219: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MCPSessionNotification", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &MCPSessionNotification{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &OneOf_MCPSessionNotification{v} iNdEx = postIndex default: iNdEx = preIndex @@ -92771,7 +93770,7 @@ func (m *StreamStatus) Unmarshal(dAtA []byte) error { } return nil } -func (m *SessionUpload) Unmarshal(dAtA []byte) error { +func (m *StreamStatus) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -92794,17 +93793,17 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") + return fmt.Errorf("proto: StreamStatus: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StreamStatus: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UploadID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -92814,30 +93813,29 @@ func (m *SessionUpload) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.UploadID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field LastEventIndex", wireType) } - var msglen int + m.LastEventIndex = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -92847,30 +93845,16 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.LastEventIndex |= int64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field LastUploadTime", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -92880,23 +93864,24 @@ func (m *SessionUpload) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.SessionURL = string(dAtA[iNdEx:postIndex]) + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.LastUploadTime, dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -92920,7 +93905,7 @@ func (m *SessionUpload) Unmarshal(dAtA []byte) error { } return nil } -func (m *Identity) Unmarshal(dAtA []byte) error { +func (m *SessionUpload) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -92943,17 +93928,17 @@ func (m *Identity) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Identity: wiretype end group for non-group") + return fmt.Errorf("proto: SessionUpload: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SessionUpload: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -92963,29 +93948,30 @@ func (m *Identity) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.User = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -92995,27 +93981,28 @@ func (m *Identity) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Impersonator = string(dAtA[iNdEx:postIndex]) + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionURL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -93043,11 +94030,62 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) + m.SessionURL = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *Identity) 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 ErrIntOverflowEvents + } + 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: Identity: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Identity: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -93075,11 +94113,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) + m.User = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Impersonator", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -93107,11 +94145,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) + m.Impersonator = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -93139,11 +94177,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) + m.Roles = append(m.Roles, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 7: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Usage", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -93171,13 +94209,13 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) + m.Usage = append(m.Usage, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 8: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Logins", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -93187,28 +94225,27 @@ func (m *Identity) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Logins = append(m.Logins, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 9: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesGroups", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -93236,11 +94273,11 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.RouteToCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesGroups = append(m.KubernetesGroups, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 10: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesUsers", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -93268,11 +94305,108 @@ func (m *Identity) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) + m.KubernetesUsers = append(m.KubernetesUsers, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 11: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Expires", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(&m.Expires, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RouteToCluster", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RouteToCluster = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KubernetesCluster", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KubernetesCluster = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Traits", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -116414,17 +117548,762 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessListInvalidMetadata: wiretype end group for non-group") + return fmt.Errorf("proto: AccessListInvalidMetadata: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AccessListInvalidMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessListName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AccessListName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.User = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MissingRoles", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.MissingRoles = append(m.MissingRoles, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *UserLoginAccessListInvalid) 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 ErrIntOverflowEvents + } + 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: UserLoginAccessListInvalid: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UserLoginAccessListInvalid: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessListInvalidMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.AccessListInvalidMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *StableUNIXUserCreate) 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 ErrIntOverflowEvents + } + 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: StableUNIXUserCreate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StableUNIXUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StableUnixUser", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.StableUnixUser == nil { + m.StableUnixUser = &StableUNIXUser{} + } + if err := m.StableUnixUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *StableUNIXUser) 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 ErrIntOverflowEvents + } + 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: StableUNIXUser: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StableUNIXUser: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Username = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType) + } + m.Uid = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Uid |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *AWSICResourceSync) 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 ErrIntOverflowEvents + } + 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: AWSICResourceSync: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AWSICResourceSync: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalAccounts", wireType) + } + m.TotalAccounts = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalAccounts |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalAccountAssignments", wireType) + } + m.TotalAccountAssignments = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalAccountAssignments |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalUserGroups", wireType) + } + m.TotalUserGroups = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalUserGroups |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TotalPermissionSets", wireType) + } + m.TotalPermissionSets = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TotalPermissionSets |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents + } + 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 *HealthCheckConfigCreate) 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 ErrIntOverflowEvents + } + 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: HealthCheckConfigCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessListInvalidMetadata: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HealthCheckConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessListName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -116434,29 +118313,30 @@ func (m *AccessListInvalidMetadata) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AccessListName = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field User", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -116466,29 +118346,30 @@ func (m *AccessListInvalidMetadata) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.User = string(dAtA[iNdEx:postIndex]) + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MissingRoles", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -116498,23 +118379,57 @@ func (m *AccessListInvalidMetadata) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.MissingRoles = append(m.MissingRoles, string(dAtA[iNdEx:postIndex])) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -116538,7 +118453,7 @@ func (m *AccessListInvalidMetadata) Unmarshal(dAtA []byte) error { } return nil } -func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { +func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116561,10 +118476,10 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: UserLoginAccessListInvalid: wiretype end group for non-group") + return fmt.Errorf("proto: HealthCheckConfigUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: UserLoginAccessListInvalid: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HealthCheckConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -116602,7 +118517,7 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AccessListInvalidMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -116629,13 +118544,13 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.AccessListInvalidMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -116662,7 +118577,40 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -116688,7 +118636,7 @@ func (m *UserLoginAccessListInvalid) Unmarshal(dAtA []byte) error { } return nil } -func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { +func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116711,10 +118659,10 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StableUNIXUserCreate: wiretype end group for non-group") + return fmt.Errorf("proto: HealthCheckConfigDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StableUNIXUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: HealthCheckConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -116752,7 +118700,7 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -116779,13 +118727,13 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StableUnixUser", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -116812,10 +118760,40 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.StableUnixUser == nil { - m.StableUnixUser = &StableUNIXUser{} + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if err := m.StableUnixUser.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -116841,7 +118819,7 @@ func (m *StableUNIXUserCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StableUNIXUser) Unmarshal(dAtA []byte) error { +func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116864,17 +118842,17 @@ func (m *StableUNIXUser) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StableUNIXUser: wiretype end group for non-group") + return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StableUNIXUser: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -116884,29 +118862,30 @@ func (m *StableUNIXUser) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.Username = string(dAtA[iNdEx:postIndex]) + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Uid", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - m.Uid = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -116916,65 +118895,61 @@ func (m *StableUNIXUser) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Uid |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err + if msglen < 0 { + return ErrInvalidLengthEvents } - if (skippy < 0) || (iNdEx+skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthEvents } - if (iNdEx + skippy) > l { + if postIndex > 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 *AWSICResourceSync) 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 ErrIntOverflowEvents + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if iNdEx >= l { + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: AWSICResourceSync: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AWSICResourceSync: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117001,34 +118976,66 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalAccounts", wireType) + default: + iNdEx = preIndex + skippy, err := skipEvents(dAtA[iNdEx:]) + if err != nil { + return err } - m.TotalAccounts = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TotalAccounts |= int32(b&0x7F) << shift - if b < 0x80 { - break - } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthEvents } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalAccountAssignments", wireType) + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - m.TotalAccountAssignments = 0 + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *WorkloadIdentityX509IssuerOverrideDelete) 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 ErrIntOverflowEvents + } + 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: WorkloadIdentityX509IssuerOverrideDelete: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideDelete: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -117038,16 +119045,30 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TotalAccountAssignments |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalUserGroups", wireType) + if msglen < 0 { + return ErrInvalidLengthEvents } - m.TotalUserGroups = 0 + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -117057,16 +119078,30 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TotalUserGroups |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TotalPermissionSets", wireType) + if msglen < 0 { + return ErrInvalidLengthEvents } - m.TotalPermissionSets = 0 + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + } + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -117076,14 +119111,28 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.TotalPermissionSets |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 6: + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117110,7 +119159,7 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -117136,7 +119185,7 @@ func (m *AWSICResourceSync) Unmarshal(dAtA []byte) error { } return nil } -func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { +func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -117159,10 +119208,10 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckConfigCreate: wiretype end group for non-group") + return fmt.Errorf("proto: SigstorePolicyCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HealthCheckConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SigstorePolicyCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -117200,7 +119249,7 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117227,13 +119276,13 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117260,13 +119309,13 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117293,7 +119342,7 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -117319,7 +119368,7 @@ func (m *HealthCheckConfigCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -117342,10 +119391,10 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: SigstorePolicyUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HealthCheckConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SigstorePolicyUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -117383,7 +119432,7 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117410,13 +119459,13 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117443,13 +119492,13 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117476,7 +119525,7 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -117502,7 +119551,7 @@ func (m *HealthCheckConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { +func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -117525,10 +119574,10 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: HealthCheckConfigDelete: wiretype end group for non-group") + return fmt.Errorf("proto: SigstorePolicyDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: HealthCheckConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SigstorePolicyDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -117566,7 +119615,7 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117593,13 +119642,13 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117626,13 +119675,13 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117659,7 +119708,7 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -117685,7 +119734,7 @@ func (m *HealthCheckConfigDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error { +func (m *MCPSessionStart) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -117708,10 +119757,10 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: wiretype end group for non-group") + return fmt.Errorf("proto: MCPSessionStart: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPSessionStart: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -117743,13 +119792,79 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117776,11 +119891,11 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -117813,9 +119928,9 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error return err } iNdEx = postIndex - case 4: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -117842,7 +119957,7 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -117868,7 +119983,7 @@ func (m *WorkloadIdentityX509IssuerOverrideCreate) Unmarshal(dAtA []byte) error } return nil } -func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error { +func (m *MCPSessionEnd) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -117891,10 +120006,10 @@ func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideDelete: wiretype end group for non-group") + return fmt.Errorf("proto: MCPSessionEnd: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: WorkloadIdentityX509IssuerOverrideDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPSessionEnd: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -117964,6 +120079,72 @@ func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error } iNdEx = postIndex case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ServerMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ServerMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -117996,9 +120177,9 @@ func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error return err } iNdEx = postIndex - case 4: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118025,7 +120206,7 @@ func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -118051,7 +120232,7 @@ func (m *WorkloadIdentityX509IssuerOverrideDelete) Unmarshal(dAtA []byte) error } return nil } -func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { +func (m *MCPJSONRPCMessage) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118074,17 +120255,17 @@ func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SigstorePolicyCreate: wiretype end group for non-group") + return fmt.Errorf("proto: MCPJSONRPCMessage: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SigstorePolicyCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPJSONRPCMessage: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field JSONRPC", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118094,30 +120275,29 @@ func (m *SigstorePolicyCreate) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.JSONRPC = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118127,30 +120307,29 @@ func (m *SigstorePolicyCreate) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Method", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -118160,28 +120339,27 @@ func (m *SigstorePolicyCreate) 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 ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Method = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118208,7 +120386,10 @@ func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Params == nil { + m.Params = &Struct{} + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -118234,7 +120415,7 @@ func (m *SigstorePolicyCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { +func (m *MCPSessionRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118257,10 +120438,10 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SigstorePolicyUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: MCPSessionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SigstorePolicyUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPSessionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -118331,7 +120512,7 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118358,13 +120539,13 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118391,7 +120572,73 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -118417,7 +120664,7 @@ func (m *SigstorePolicyUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { +func (m *MCPSessionNotification) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -118440,10 +120687,10 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SigstorePolicyDelete: wiretype end group for non-group") + return fmt.Errorf("proto: MCPSessionNotification: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SigstorePolicyDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: MCPSessionNotification: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -118514,7 +120761,7 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118541,13 +120788,13 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AppMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -118574,7 +120821,40 @@ func (m *SigstorePolicyDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AppMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex diff --git a/api/types/events/events_test.go b/api/types/events/events_test.go index 74abf79895739..02009bf10d3e9 100644 --- a/api/types/events/events_test.go +++ b/api/types/events/events_test.go @@ -195,8 +195,56 @@ func TestStructTrimToMaxSize(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - got := tc.in.trimToMaxSize(tc.maxSize) + got := tc.in.trimToMaxFieldSize(tc.maxSize) require.Equal(t, tc.want, got) }) } } + +func TestTrimMCPJSONRPCMessage(t *testing.T) { + m := MCPJSONRPCMessage{ + JSONRPC: "2.0", + ID: "some-id", + Method: "tools/call", + Params: &Struct{ + Struct: types.Struct{ + Fields: map[string]*types.Value{ + strings.Repeat("A", 100): { + Kind: &types.Value_StringValue{ + StringValue: "A", + }, + }, + }, + }, + }, + } + + orgSize := m.Size() + t.Run("not trimmed", func(t *testing.T) { + notTrimmed := m.trimToMaxSize(10000) + require.Equal(t, orgSize, m.Size()) + require.Equal(t, notTrimmed, m) + }) + + t.Run("trimmed", func(t *testing.T) { + trimmed := m.trimToMaxSize(50) + require.Equal(t, orgSize, m.Size()) + require.Less(t, trimmed.Size(), 50) + require.Equal(t, MCPJSONRPCMessage{ + JSONRPC: "2.0", + ID: "some-id", + Method: "tools/ca", + Params: &Struct{ + Struct: types.Struct{ + Fields: map[string]*types.Value{ + strings.Repeat("A", 8): { + Kind: &types.Value_StringValue{ + StringValue: "A", + }, + }, + }, + }, + }, + }, trimmed) + }) +} diff --git a/api/types/events/oneof.go b/api/types/events/oneof.go index 094f4d02ac3f2..8cd8ba8c2899e 100644 --- a/api/types/events/oneof.go +++ b/api/types/events/oneof.go @@ -886,6 +886,22 @@ func ToOneOf(in AuditEvent) (*OneOf, error) { out.Event = &OneOf_SigstorePolicyDelete{ SigstorePolicyDelete: e, } + case *MCPSessionStart: + out.Event = &OneOf_MCPSessionStart{ + MCPSessionStart: e, + } + case *MCPSessionEnd: + out.Event = &OneOf_MCPSessionEnd{ + MCPSessionEnd: e, + } + case *MCPSessionRequest: + out.Event = &OneOf_MCPSessionRequest{ + MCPSessionRequest: e, + } + case *MCPSessionNotification: + out.Event = &OneOf_MCPSessionNotification{ + MCPSessionNotification: e, + } default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", in.GetType()) unknown := &Unknown{} diff --git a/api/types/resource.go b/api/types/resource.go index 544f7b1f92b8c..50acafcd77129 100644 --- a/api/types/resource.go +++ b/api/types/resource.go @@ -92,6 +92,11 @@ func ResourceNames[R Resource, S ~[]R](s S) iter.Seq[string] { return iterutils.Map(GetName, slices.Values(s)) } +// CompareResourceByNames compares resources by their names. +func CompareResourceByNames[R Resource](a, b R) int { + return strings.Compare(a.GetName(), b.GetName()) +} + // ResourceDetails includes details about the resource type ResourceDetails struct { Hostname string diff --git a/api/types/role.go b/api/types/role.go index f020377a92d5e..3e444bdba9895 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -300,6 +300,12 @@ type Role interface { // GetIdentityCenterAccountAssignments sets the allow or deny Account // Assignments for the role SetIdentityCenterAccountAssignments(RoleConditionType, []IdentityCenterAccountAssignment) + + // GetMCPPermissions returns the allow or deny MCP permissions. + GetMCPPermissions(RoleConditionType) *MCPPermissions + // SetMCPPermissions sets the allow or deny MCP permissions. + SetMCPPermissions(RoleConditionType, *MCPPermissions) + // Clone creats a copy of the role. Clone() Role } @@ -2361,6 +2367,23 @@ func (r *RoleV6) SetIdentityCenterAccountAssignments(rct RoleConditionType, assi cond.AccountAssignments = assignments } +// GetMCPPermissions returns the allow or deny MCP permissions. +func (r *RoleV6) GetMCPPermissions(rct RoleConditionType) *MCPPermissions { + if rct == Allow { + return r.Spec.Allow.MCP + } + return r.Spec.Deny.MCP +} + +// SetMCPPermissions sets the allow or deny MCP permissions. +func (r *RoleV6) SetMCPPermissions(rct RoleConditionType, perms *MCPPermissions) { + if rct == Allow { + r.Spec.Allow.MCP = perms + } else { + r.Spec.Deny.MCP = perms + } +} + func (r *RoleV6) Clone() Role { return utils.CloneProtoMsg(r) } diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 7f2ac32eaea13..4ef29ac6cb49f 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1143,7 +1143,7 @@ func (x CertAuthoritySpecV2_SigningAlgType) String() string { } func (CertAuthoritySpecV2_SigningAlgType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{60, 0} + return fileDescriptor_9198ee693835762e, []int{61, 0} } // FIPSEndpointState represents an AWS FIPS endpoint state. @@ -1176,7 +1176,7 @@ func (x ClusterAuditConfigSpecV2_FIPSEndpointState) String() string { } func (ClusterAuditConfigSpecV2_FIPSEndpointState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{88, 0} + return fileDescriptor_9198ee693835762e, []int{89, 0} } // TraceType is an identification of the checkpoint. @@ -1246,7 +1246,7 @@ func (x ConnectionDiagnosticTrace_TraceType) String() string { } func (ConnectionDiagnosticTrace_TraceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272, 0} + return fileDescriptor_9198ee693835762e, []int{274, 0} } // StatusType describes whether this was a success or a failure. @@ -1275,7 +1275,7 @@ func (x ConnectionDiagnosticTrace_StatusType) String() string { } func (ConnectionDiagnosticTrace_StatusType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272, 1} + return fileDescriptor_9198ee693835762e, []int{274, 1} } // OktaAssignmentStatus represents the status of an Okta assignment. @@ -1315,7 +1315,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{363, 0} + return fileDescriptor_9198ee693835762e, []int{365, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1347,7 +1347,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{364, 0} + return fileDescriptor_9198ee693835762e, []int{366, 0} } type KeepAlive struct { @@ -3853,10 +3853,12 @@ type AppSpecV3 struct { // request originated from. This should be true if your proxy has multiple proxy public addrs and you // want the app to be accessible from any of them. If `public_addr` is explicitly set in the app spec, // setting this value to true will overwrite that public address in the web UI. - UseAnyProxyPublicAddr bool `protobuf:"varint,14,opt,name=UseAnyProxyPublicAddr,proto3" json:"use_any_proxy_public_addr,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + UseAnyProxyPublicAddr bool `protobuf:"varint,14,opt,name=UseAnyProxyPublicAddr,proto3" json:"use_any_proxy_public_addr,omitempty"` + // MCP contains MCP server related configurations. + MCP *MCP `protobuf:"bytes,15,opt,name=MCP,proto3" json:"mcp,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *AppSpecV3) Reset() { *m = AppSpecV3{} } @@ -3892,6 +3894,53 @@ func (m *AppSpecV3) XXX_DiscardUnknown() { var xxx_messageInfo_AppSpecV3 proto.InternalMessageInfo +// MCP contains MCP server-related configurations. +type MCP struct { + // Command to launch stdio-based MCP servers. + Command string `protobuf:"bytes,1,opt,name=command,proto3" json:"command,omitempty"` + // Args to execute with the command. + Args []string `protobuf:"bytes,2,rep,name=args,proto3" json:"args,omitempty"` + // RunAsHostUser is the host user account under which the command will be + // executed. Required for stdio-based MCP servers. + RunAsHostUser string `protobuf:"bytes,3,opt,name=run_as_host_user,json=runAsHostUser,proto3" json:"run_as_host_user,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MCP) Reset() { *m = MCP{} } +func (m *MCP) String() string { return proto.CompactTextString(m) } +func (*MCP) ProtoMessage() {} +func (*MCP) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{50} +} +func (m *MCP) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MCP) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MCP.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 *MCP) XXX_Merge(src proto.Message) { + xxx_messageInfo_MCP.Merge(m, src) +} +func (m *MCP) XXX_Size() int { + return m.Size() +} +func (m *MCP) XXX_DiscardUnknown() { + xxx_messageInfo_MCP.DiscardUnknown(m) +} + +var xxx_messageInfo_MCP proto.InternalMessageInfo + // Rewrite is a list of rewriting rules to apply to requests and responses. type Rewrite struct { // Redirect defines a list of hosts which will be rewritten to the public @@ -3911,7 +3960,7 @@ func (m *Rewrite) Reset() { *m = Rewrite{} } func (m *Rewrite) String() string { return proto.CompactTextString(m) } func (*Rewrite) ProtoMessage() {} func (*Rewrite) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{50} + return fileDescriptor_9198ee693835762e, []int{51} } func (m *Rewrite) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3955,7 +4004,7 @@ func (m *Header) Reset() { *m = Header{} } func (m *Header) String() string { return proto.CompactTextString(m) } func (*Header) ProtoMessage() {} func (*Header) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{51} + return fileDescriptor_9198ee693835762e, []int{52} } func (m *Header) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4002,7 +4051,7 @@ type PortRange struct { func (m *PortRange) Reset() { *m = PortRange{} } func (*PortRange) ProtoMessage() {} func (*PortRange) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{52} + return fileDescriptor_9198ee693835762e, []int{53} } func (m *PortRange) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4049,7 +4098,7 @@ func (m *CommandLabelV2) Reset() { *m = CommandLabelV2{} } func (m *CommandLabelV2) String() string { return proto.CompactTextString(m) } func (*CommandLabelV2) ProtoMessage() {} func (*CommandLabelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{53} + return fileDescriptor_9198ee693835762e, []int{54} } func (m *CommandLabelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4094,7 +4143,7 @@ func (m *AppAWS) Reset() { *m = AppAWS{} } func (m *AppAWS) String() string { return proto.CompactTextString(m) } func (*AppAWS) ProtoMessage() {} func (*AppAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{54} + return fileDescriptor_9198ee693835762e, []int{55} } func (m *AppAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4142,7 +4191,7 @@ func (m *AppAWSRolesAnywhereProfile) Reset() { *m = AppAWSRolesAnywhereP func (m *AppAWSRolesAnywhereProfile) String() string { return proto.CompactTextString(m) } func (*AppAWSRolesAnywhereProfile) ProtoMessage() {} func (*AppAWSRolesAnywhereProfile) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{55} + return fileDescriptor_9198ee693835762e, []int{56} } func (m *AppAWSRolesAnywhereProfile) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4188,7 +4237,7 @@ func (m *SSHKeyPair) Reset() { *m = SSHKeyPair{} } func (m *SSHKeyPair) String() string { return proto.CompactTextString(m) } func (*SSHKeyPair) ProtoMessage() {} func (*SSHKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{56} + return fileDescriptor_9198ee693835762e, []int{57} } func (m *SSHKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4234,7 +4283,7 @@ func (m *TLSKeyPair) Reset() { *m = TLSKeyPair{} } func (m *TLSKeyPair) String() string { return proto.CompactTextString(m) } func (*TLSKeyPair) ProtoMessage() {} func (*TLSKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{57} + return fileDescriptor_9198ee693835762e, []int{58} } func (m *TLSKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4280,7 +4329,7 @@ func (m *JWTKeyPair) Reset() { *m = JWTKeyPair{} } func (m *JWTKeyPair) String() string { return proto.CompactTextString(m) } func (*JWTKeyPair) ProtoMessage() {} func (*JWTKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{58} + return fileDescriptor_9198ee693835762e, []int{59} } func (m *JWTKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4329,7 +4378,7 @@ type CertAuthorityV2 struct { func (m *CertAuthorityV2) Reset() { *m = CertAuthorityV2{} } func (*CertAuthorityV2) ProtoMessage() {} func (*CertAuthorityV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{59} + return fileDescriptor_9198ee693835762e, []int{60} } func (m *CertAuthorityV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4390,7 +4439,7 @@ func (m *CertAuthoritySpecV2) Reset() { *m = CertAuthoritySpecV2{} } func (m *CertAuthoritySpecV2) String() string { return proto.CompactTextString(m) } func (*CertAuthoritySpecV2) ProtoMessage() {} func (*CertAuthoritySpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{60} + return fileDescriptor_9198ee693835762e, []int{61} } func (m *CertAuthoritySpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4436,7 +4485,7 @@ func (m *CAKeySet) Reset() { *m = CAKeySet{} } func (m *CAKeySet) String() string { return proto.CompactTextString(m) } func (*CAKeySet) ProtoMessage() {} func (*CAKeySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{61} + return fileDescriptor_9198ee693835762e, []int{62} } func (m *CAKeySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4481,7 +4530,7 @@ func (m *RoleMapping) Reset() { *m = RoleMapping{} } func (m *RoleMapping) String() string { return proto.CompactTextString(m) } func (*RoleMapping) ProtoMessage() {} func (*RoleMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{62} + return fileDescriptor_9198ee693835762e, []int{63} } func (m *RoleMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4529,7 +4578,7 @@ type ProvisionTokenV1 struct { func (m *ProvisionTokenV1) Reset() { *m = ProvisionTokenV1{} } func (*ProvisionTokenV1) ProtoMessage() {} func (*ProvisionTokenV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{63} + return fileDescriptor_9198ee693835762e, []int{64} } func (m *ProvisionTokenV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4582,7 +4631,7 @@ type ProvisionTokenV2 struct { func (m *ProvisionTokenV2) Reset() { *m = ProvisionTokenV2{} } func (*ProvisionTokenV2) ProtoMessage() {} func (*ProvisionTokenV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{64} + return fileDescriptor_9198ee693835762e, []int{65} } func (m *ProvisionTokenV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4624,7 +4673,7 @@ func (m *ProvisionTokenV2List) Reset() { *m = ProvisionTokenV2List{} } func (m *ProvisionTokenV2List) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenV2List) ProtoMessage() {} func (*ProvisionTokenV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{65} + return fileDescriptor_9198ee693835762e, []int{66} } func (m *ProvisionTokenV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4676,7 +4725,7 @@ func (m *TokenRule) Reset() { *m = TokenRule{} } func (m *TokenRule) String() string { return proto.CompactTextString(m) } func (*TokenRule) ProtoMessage() {} func (*TokenRule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{66} + return fileDescriptor_9198ee693835762e, []int{67} } func (m *TokenRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4766,7 +4815,7 @@ func (m *ProvisionTokenSpecV2) Reset() { *m = ProvisionTokenSpecV2{} } func (m *ProvisionTokenSpecV2) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2) ProtoMessage() {} func (*ProvisionTokenSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{67} + return fileDescriptor_9198ee693835762e, []int{68} } func (m *ProvisionTokenSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4815,7 +4864,7 @@ func (m *ProvisionTokenSpecV2AzureDevops) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2AzureDevops) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2AzureDevops) ProtoMessage() {} func (*ProvisionTokenSpecV2AzureDevops) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{68} + return fileDescriptor_9198ee693835762e, []int{69} } func (m *ProvisionTokenSpecV2AzureDevops) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4887,7 +4936,7 @@ func (m *ProvisionTokenSpecV2AzureDevops_Rule) Reset() { *m = ProvisionT func (m *ProvisionTokenSpecV2AzureDevops_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2AzureDevops_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2AzureDevops_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{68, 0} + return fileDescriptor_9198ee693835762e, []int{69, 0} } func (m *ProvisionTokenSpecV2AzureDevops_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4939,7 +4988,7 @@ func (m *ProvisionTokenSpecV2TPM) Reset() { *m = ProvisionTokenSpecV2TPM func (m *ProvisionTokenSpecV2TPM) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TPM) ProtoMessage() {} func (*ProvisionTokenSpecV2TPM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{69} + return fileDescriptor_9198ee693835762e, []int{70} } func (m *ProvisionTokenSpecV2TPM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4995,7 +5044,7 @@ func (m *ProvisionTokenSpecV2TPM_Rule) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2TPM_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TPM_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2TPM_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{69, 0} + return fileDescriptor_9198ee693835762e, []int{70, 0} } func (m *ProvisionTokenSpecV2TPM_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5064,7 +5113,7 @@ func (m *ProvisionTokenSpecV2GitHub) Reset() { *m = ProvisionTokenSpecV2 func (m *ProvisionTokenSpecV2GitHub) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitHub) ProtoMessage() {} func (*ProvisionTokenSpecV2GitHub) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{70} + return fileDescriptor_9198ee693835762e, []int{71} } func (m *ProvisionTokenSpecV2GitHub) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5126,7 +5175,7 @@ func (m *ProvisionTokenSpecV2GitHub_Rule) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2GitHub_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitHub_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GitHub_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{70, 0} + return fileDescriptor_9198ee693835762e, []int{71, 0} } func (m *ProvisionTokenSpecV2GitHub_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5179,7 +5228,7 @@ func (m *ProvisionTokenSpecV2GitLab) Reset() { *m = ProvisionTokenSpecV2 func (m *ProvisionTokenSpecV2GitLab) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitLab) ProtoMessage() {} func (*ProvisionTokenSpecV2GitLab) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{71} + return fileDescriptor_9198ee693835762e, []int{72} } func (m *ProvisionTokenSpecV2GitLab) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5281,7 +5330,7 @@ func (m *ProvisionTokenSpecV2GitLab_Rule) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2GitLab_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GitLab_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GitLab_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{71, 0} + return fileDescriptor_9198ee693835762e, []int{72, 0} } func (m *ProvisionTokenSpecV2GitLab_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5326,7 +5375,7 @@ func (m *ProvisionTokenSpecV2CircleCI) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2CircleCI) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2CircleCI) ProtoMessage() {} func (*ProvisionTokenSpecV2CircleCI) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{72} + return fileDescriptor_9198ee693835762e, []int{73} } func (m *ProvisionTokenSpecV2CircleCI) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5367,7 +5416,7 @@ func (m *ProvisionTokenSpecV2CircleCI_Rule) Reset() { *m = ProvisionToke func (m *ProvisionTokenSpecV2CircleCI_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2CircleCI_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2CircleCI_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{72, 0} + return fileDescriptor_9198ee693835762e, []int{73, 0} } func (m *ProvisionTokenSpecV2CircleCI_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5417,7 +5466,7 @@ func (m *ProvisionTokenSpecV2Spacelift) Reset() { *m = ProvisionTokenSpe func (m *ProvisionTokenSpecV2Spacelift) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Spacelift) ProtoMessage() {} func (*ProvisionTokenSpecV2Spacelift) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{73} + return fileDescriptor_9198ee693835762e, []int{74} } func (m *ProvisionTokenSpecV2Spacelift) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5476,7 +5525,7 @@ func (m *ProvisionTokenSpecV2Spacelift_Rule) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2Spacelift_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Spacelift_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Spacelift_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{73, 0} + return fileDescriptor_9198ee693835762e, []int{74, 0} } func (m *ProvisionTokenSpecV2Spacelift_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5528,7 +5577,7 @@ func (m *ProvisionTokenSpecV2Kubernetes) Reset() { *m = ProvisionTokenSp func (m *ProvisionTokenSpecV2Kubernetes) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Kubernetes) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{74} + return fileDescriptor_9198ee693835762e, []int{75} } func (m *ProvisionTokenSpecV2Kubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5575,7 +5624,7 @@ func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) String() string { } func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{74, 0} + return fileDescriptor_9198ee693835762e, []int{75, 0} } func (m *ProvisionTokenSpecV2Kubernetes_StaticJWKSConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5619,7 +5668,7 @@ func (m *ProvisionTokenSpecV2Kubernetes_Rule) Reset() { *m = ProvisionTo func (m *ProvisionTokenSpecV2Kubernetes_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Kubernetes_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Kubernetes_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{74, 1} + return fileDescriptor_9198ee693835762e, []int{75, 1} } func (m *ProvisionTokenSpecV2Kubernetes_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5663,7 +5712,7 @@ func (m *ProvisionTokenSpecV2Azure) Reset() { *m = ProvisionTokenSpecV2A func (m *ProvisionTokenSpecV2Azure) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Azure) ProtoMessage() {} func (*ProvisionTokenSpecV2Azure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{75} + return fileDescriptor_9198ee693835762e, []int{76} } func (m *ProvisionTokenSpecV2Azure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5709,7 +5758,7 @@ func (m *ProvisionTokenSpecV2Azure_Rule) Reset() { *m = ProvisionTokenSp func (m *ProvisionTokenSpecV2Azure_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Azure_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Azure_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{75, 0} + return fileDescriptor_9198ee693835762e, []int{76, 0} } func (m *ProvisionTokenSpecV2Azure_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5753,7 +5802,7 @@ func (m *ProvisionTokenSpecV2GCP) Reset() { *m = ProvisionTokenSpecV2GCP func (m *ProvisionTokenSpecV2GCP) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GCP) ProtoMessage() {} func (*ProvisionTokenSpecV2GCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{76} + return fileDescriptor_9198ee693835762e, []int{77} } func (m *ProvisionTokenSpecV2GCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5802,7 +5851,7 @@ func (m *ProvisionTokenSpecV2GCP_Rule) Reset() { *m = ProvisionTokenSpec func (m *ProvisionTokenSpecV2GCP_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2GCP_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2GCP_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{76, 0} + return fileDescriptor_9198ee693835762e, []int{77, 0} } func (m *ProvisionTokenSpecV2GCP_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5859,7 +5908,7 @@ func (m *ProvisionTokenSpecV2TerraformCloud) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2TerraformCloud) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TerraformCloud) ProtoMessage() {} func (*ProvisionTokenSpecV2TerraformCloud) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{77} + return fileDescriptor_9198ee693835762e, []int{78} } func (m *ProvisionTokenSpecV2TerraformCloud) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5924,7 +5973,7 @@ func (m *ProvisionTokenSpecV2TerraformCloud_Rule) Reset() { func (m *ProvisionTokenSpecV2TerraformCloud_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2TerraformCloud_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2TerraformCloud_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{77, 0} + return fileDescriptor_9198ee693835762e, []int{78, 0} } func (m *ProvisionTokenSpecV2TerraformCloud_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5976,7 +6025,7 @@ func (m *ProvisionTokenSpecV2Bitbucket) Reset() { *m = ProvisionTokenSpe func (m *ProvisionTokenSpecV2Bitbucket) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Bitbucket) ProtoMessage() {} func (*ProvisionTokenSpecV2Bitbucket) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{78} + return fileDescriptor_9198ee693835762e, []int{79} } func (m *ProvisionTokenSpecV2Bitbucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6034,7 +6083,7 @@ func (m *ProvisionTokenSpecV2Bitbucket_Rule) Reset() { *m = ProvisionTok func (m *ProvisionTokenSpecV2Bitbucket_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Bitbucket_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Bitbucket_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{78, 0} + return fileDescriptor_9198ee693835762e, []int{79, 0} } func (m *ProvisionTokenSpecV2Bitbucket_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6078,7 +6127,7 @@ func (m *ProvisionTokenSpecV2Oracle) Reset() { *m = ProvisionTokenSpecV2 func (m *ProvisionTokenSpecV2Oracle) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Oracle) ProtoMessage() {} func (*ProvisionTokenSpecV2Oracle) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{79} + return fileDescriptor_9198ee693835762e, []int{80} } func (m *ProvisionTokenSpecV2Oracle) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6129,7 +6178,7 @@ func (m *ProvisionTokenSpecV2Oracle_Rule) Reset() { *m = ProvisionTokenS func (m *ProvisionTokenSpecV2Oracle_Rule) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2Oracle_Rule) ProtoMessage() {} func (*ProvisionTokenSpecV2Oracle_Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{79, 0} + return fileDescriptor_9198ee693835762e, []int{80, 0} } func (m *ProvisionTokenSpecV2Oracle_Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6181,7 +6230,7 @@ func (m *ProvisionTokenSpecV2BoundKeypair) Reset() { *m = ProvisionToken func (m *ProvisionTokenSpecV2BoundKeypair) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenSpecV2BoundKeypair) ProtoMessage() {} func (*ProvisionTokenSpecV2BoundKeypair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{80} + return fileDescriptor_9198ee693835762e, []int{81} } func (m *ProvisionTokenSpecV2BoundKeypair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6247,7 +6296,7 @@ func (m *ProvisionTokenSpecV2BoundKeypair_OnboardingSpec) String() string { } func (*ProvisionTokenSpecV2BoundKeypair_OnboardingSpec) ProtoMessage() {} func (*ProvisionTokenSpecV2BoundKeypair_OnboardingSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{80, 0} + return fileDescriptor_9198ee693835762e, []int{81, 0} } func (m *ProvisionTokenSpecV2BoundKeypair_OnboardingSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6315,7 +6364,7 @@ func (m *ProvisionTokenSpecV2BoundKeypair_RecoverySpec) String() string { } func (*ProvisionTokenSpecV2BoundKeypair_RecoverySpec) ProtoMessage() {} func (*ProvisionTokenSpecV2BoundKeypair_RecoverySpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{80, 1} + return fileDescriptor_9198ee693835762e, []int{81, 1} } func (m *ProvisionTokenSpecV2BoundKeypair_RecoverySpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6359,7 +6408,7 @@ func (m *ProvisionTokenStatusV2) Reset() { *m = ProvisionTokenStatusV2{} func (m *ProvisionTokenStatusV2) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenStatusV2) ProtoMessage() {} func (*ProvisionTokenStatusV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{81} + return fileDescriptor_9198ee693835762e, []int{82} } func (m *ProvisionTokenStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6434,7 +6483,7 @@ func (m *ProvisionTokenStatusV2BoundKeypair) Reset() { *m = ProvisionTok func (m *ProvisionTokenStatusV2BoundKeypair) String() string { return proto.CompactTextString(m) } func (*ProvisionTokenStatusV2BoundKeypair) ProtoMessage() {} func (*ProvisionTokenStatusV2BoundKeypair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{82} + return fileDescriptor_9198ee693835762e, []int{83} } func (m *ProvisionTokenStatusV2BoundKeypair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6483,7 +6532,7 @@ type StaticTokensV2 struct { func (m *StaticTokensV2) Reset() { *m = StaticTokensV2{} } func (*StaticTokensV2) ProtoMessage() {} func (*StaticTokensV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{83} + return fileDescriptor_9198ee693835762e, []int{84} } func (m *StaticTokensV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6526,7 +6575,7 @@ func (m *StaticTokensSpecV2) Reset() { *m = StaticTokensSpecV2{} } func (m *StaticTokensSpecV2) String() string { return proto.CompactTextString(m) } func (*StaticTokensSpecV2) ProtoMessage() {} func (*StaticTokensSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{84} + return fileDescriptor_9198ee693835762e, []int{85} } func (m *StaticTokensSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6575,7 +6624,7 @@ type ClusterNameV2 struct { func (m *ClusterNameV2) Reset() { *m = ClusterNameV2{} } func (*ClusterNameV2) ProtoMessage() {} func (*ClusterNameV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{85} + return fileDescriptor_9198ee693835762e, []int{86} } func (m *ClusterNameV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6621,7 +6670,7 @@ func (m *ClusterNameSpecV2) Reset() { *m = ClusterNameSpecV2{} } func (m *ClusterNameSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNameSpecV2) ProtoMessage() {} func (*ClusterNameSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{86} + return fileDescriptor_9198ee693835762e, []int{87} } func (m *ClusterNameSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6671,7 +6720,7 @@ func (m *ClusterAuditConfigV2) Reset() { *m = ClusterAuditConfigV2{} } func (m *ClusterAuditConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigV2) ProtoMessage() {} func (*ClusterAuditConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{87} + return fileDescriptor_9198ee693835762e, []int{88} } func (m *ClusterAuditConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6741,7 +6790,7 @@ func (m *ClusterAuditConfigSpecV2) Reset() { *m = ClusterAuditConfigSpec func (m *ClusterAuditConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterAuditConfigSpecV2) ProtoMessage() {} func (*ClusterAuditConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{88} + return fileDescriptor_9198ee693835762e, []int{89} } func (m *ClusterAuditConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6792,7 +6841,7 @@ func (m *ClusterNetworkingConfigV2) Reset() { *m = ClusterNetworkingConf func (m *ClusterNetworkingConfigV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigV2) ProtoMessage() {} func (*ClusterNetworkingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{89} + return fileDescriptor_9198ee693835762e, []int{90} } func (m *ClusterNetworkingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6871,7 +6920,7 @@ func (m *ClusterNetworkingConfigSpecV2) Reset() { *m = ClusterNetworking func (m *ClusterNetworkingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*ClusterNetworkingConfigSpecV2) ProtoMessage() {} func (*ClusterNetworkingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{90} + return fileDescriptor_9198ee693835762e, []int{91} } func (m *ClusterNetworkingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6915,7 +6964,7 @@ func (m *TunnelStrategyV1) Reset() { *m = TunnelStrategyV1{} } func (m *TunnelStrategyV1) String() string { return proto.CompactTextString(m) } func (*TunnelStrategyV1) ProtoMessage() {} func (*TunnelStrategyV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{91} + return fileDescriptor_9198ee693835762e, []int{92} } func (m *TunnelStrategyV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7000,7 +7049,7 @@ func (m *AgentMeshTunnelStrategy) Reset() { *m = AgentMeshTunnelStrategy func (m *AgentMeshTunnelStrategy) String() string { return proto.CompactTextString(m) } func (*AgentMeshTunnelStrategy) ProtoMessage() {} func (*AgentMeshTunnelStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{92} + return fileDescriptor_9198ee693835762e, []int{93} } func (m *AgentMeshTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7041,7 +7090,7 @@ func (m *ProxyPeeringTunnelStrategy) Reset() { *m = ProxyPeeringTunnelSt func (m *ProxyPeeringTunnelStrategy) String() string { return proto.CompactTextString(m) } func (*ProxyPeeringTunnelStrategy) ProtoMessage() {} func (*ProxyPeeringTunnelStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{93} + return fileDescriptor_9198ee693835762e, []int{94} } func (m *ProxyPeeringTunnelStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7092,7 +7141,7 @@ func (m *SessionRecordingConfigV2) Reset() { *m = SessionRecordingConfig func (m *SessionRecordingConfigV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigV2) ProtoMessage() {} func (*SessionRecordingConfigV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{94} + return fileDescriptor_9198ee693835762e, []int{95} } func (m *SessionRecordingConfigV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7138,7 +7187,7 @@ func (m *SessionRecordingConfigSpecV2) Reset() { *m = SessionRecordingCo func (m *SessionRecordingConfigSpecV2) String() string { return proto.CompactTextString(m) } func (*SessionRecordingConfigSpecV2) ProtoMessage() {} func (*SessionRecordingConfigSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{95} + return fileDescriptor_9198ee693835762e, []int{96} } func (m *SessionRecordingConfigSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7188,7 +7237,7 @@ type AuthPreferenceV2 struct { func (m *AuthPreferenceV2) Reset() { *m = AuthPreferenceV2{} } func (*AuthPreferenceV2) ProtoMessage() {} func (*AuthPreferenceV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{96} + return fileDescriptor_9198ee693835762e, []int{97} } func (m *AuthPreferenceV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7287,7 +7336,7 @@ func (m *AuthPreferenceSpecV2) Reset() { *m = AuthPreferenceSpecV2{} } func (m *AuthPreferenceSpecV2) String() string { return proto.CompactTextString(m) } func (*AuthPreferenceSpecV2) ProtoMessage() {} func (*AuthPreferenceSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{97} + return fileDescriptor_9198ee693835762e, []int{98} } func (m *AuthPreferenceSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7338,7 +7387,7 @@ func (m *StableUNIXUserConfig) Reset() { *m = StableUNIXUserConfig{} } func (m *StableUNIXUserConfig) String() string { return proto.CompactTextString(m) } func (*StableUNIXUserConfig) ProtoMessage() {} func (*StableUNIXUserConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{98} + return fileDescriptor_9198ee693835762e, []int{99} } func (m *StableUNIXUserConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7389,7 +7438,7 @@ func (m *U2F) Reset() { *m = U2F{} } func (m *U2F) String() string { return proto.CompactTextString(m) } func (*U2F) ProtoMessage() {} func (*U2F) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{99} + return fileDescriptor_9198ee693835762e, []int{100} } func (m *U2F) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7457,7 +7506,7 @@ func (m *Webauthn) Reset() { *m = Webauthn{} } func (m *Webauthn) String() string { return proto.CompactTextString(m) } func (*Webauthn) ProtoMessage() {} func (*Webauthn) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{100} + return fileDescriptor_9198ee693835762e, []int{101} } func (m *Webauthn) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7528,7 +7577,7 @@ func (m *DeviceTrust) Reset() { *m = DeviceTrust{} } func (m *DeviceTrust) String() string { return proto.CompactTextString(m) } func (*DeviceTrust) ProtoMessage() {} func (*DeviceTrust) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{101} + return fileDescriptor_9198ee693835762e, []int{102} } func (m *DeviceTrust) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7578,7 +7627,7 @@ func (m *HardwareKey) Reset() { *m = HardwareKey{} } func (m *HardwareKey) String() string { return proto.CompactTextString(m) } func (*HardwareKey) ProtoMessage() {} func (*HardwareKey) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{102} + return fileDescriptor_9198ee693835762e, []int{103} } func (m *HardwareKey) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7625,7 +7674,7 @@ func (m *HardwareKeySerialNumberValidation) Reset() { *m = HardwareKeySe func (m *HardwareKeySerialNumberValidation) String() string { return proto.CompactTextString(m) } func (*HardwareKeySerialNumberValidation) ProtoMessage() {} func (*HardwareKeySerialNumberValidation) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{103} + return fileDescriptor_9198ee693835762e, []int{104} } func (m *HardwareKeySerialNumberValidation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7675,7 +7724,7 @@ func (m *Namespace) Reset() { *m = Namespace{} } func (m *Namespace) String() string { return proto.CompactTextString(m) } func (*Namespace) ProtoMessage() {} func (*Namespace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{104} + return fileDescriptor_9198ee693835762e, []int{105} } func (m *Namespace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7715,7 +7764,7 @@ func (m *NamespaceSpec) Reset() { *m = NamespaceSpec{} } func (m *NamespaceSpec) String() string { return proto.CompactTextString(m) } func (*NamespaceSpec) ProtoMessage() {} func (*NamespaceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{105} + return fileDescriptor_9198ee693835762e, []int{106} } func (m *NamespaceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7763,7 +7812,7 @@ type UserTokenV3 struct { func (m *UserTokenV3) Reset() { *m = UserTokenV3{} } func (*UserTokenV3) ProtoMessage() {} func (*UserTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{106} + return fileDescriptor_9198ee693835762e, []int{107} } func (m *UserTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7810,7 +7859,7 @@ func (m *UserTokenSpecV3) Reset() { *m = UserTokenSpecV3{} } func (m *UserTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSpecV3) ProtoMessage() {} func (*UserTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{107} + return fileDescriptor_9198ee693835762e, []int{108} } func (m *UserTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7858,7 +7907,7 @@ type UserTokenSecretsV3 struct { func (m *UserTokenSecretsV3) Reset() { *m = UserTokenSecretsV3{} } func (*UserTokenSecretsV3) ProtoMessage() {} func (*UserTokenSecretsV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{108} + return fileDescriptor_9198ee693835762e, []int{109} } func (m *UserTokenSecretsV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7903,7 +7952,7 @@ func (m *UserTokenSecretsSpecV3) Reset() { *m = UserTokenSecretsSpecV3{} func (m *UserTokenSecretsSpecV3) String() string { return proto.CompactTextString(m) } func (*UserTokenSecretsSpecV3) ProtoMessage() {} func (*UserTokenSecretsSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{109} + return fileDescriptor_9198ee693835762e, []int{110} } func (m *UserTokenSecretsSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7952,7 +8001,7 @@ type AccessRequestV3 struct { func (m *AccessRequestV3) Reset() { *m = AccessRequestV3{} } func (*AccessRequestV3) ProtoMessage() {} func (*AccessRequestV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{110} + return fileDescriptor_9198ee693835762e, []int{111} } func (m *AccessRequestV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8004,7 +8053,7 @@ func (m *AccessReviewThreshold) Reset() { *m = AccessReviewThreshold{} } func (m *AccessReviewThreshold) String() string { return proto.CompactTextString(m) } func (*AccessReviewThreshold) ProtoMessage() {} func (*AccessReviewThreshold) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{111} + return fileDescriptor_9198ee693835762e, []int{112} } func (m *AccessReviewThreshold) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8049,7 +8098,7 @@ func (m *PromotedAccessList) Reset() { *m = PromotedAccessList{} } func (m *PromotedAccessList) String() string { return proto.CompactTextString(m) } func (*PromotedAccessList) ProtoMessage() {} func (*PromotedAccessList) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{112} + return fileDescriptor_9198ee693835762e, []int{113} } func (m *PromotedAccessList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8094,7 +8143,7 @@ func (m *AccessRequestDryRunEnrichment) Reset() { *m = AccessRequestDryR func (m *AccessRequestDryRunEnrichment) String() string { return proto.CompactTextString(m) } func (*AccessRequestDryRunEnrichment) ProtoMessage() {} func (*AccessRequestDryRunEnrichment) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{113} + return fileDescriptor_9198ee693835762e, []int{114} } func (m *AccessRequestDryRunEnrichment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8155,7 +8204,7 @@ func (m *AccessReview) Reset() { *m = AccessReview{} } func (m *AccessReview) String() string { return proto.CompactTextString(m) } func (*AccessReview) ProtoMessage() {} func (*AccessReview) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{114} + return fileDescriptor_9198ee693835762e, []int{115} } func (m *AccessReview) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8200,7 +8249,7 @@ func (m *AccessReviewSubmission) Reset() { *m = AccessReviewSubmission{} func (m *AccessReviewSubmission) String() string { return proto.CompactTextString(m) } func (*AccessReviewSubmission) ProtoMessage() {} func (*AccessReviewSubmission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{115} + return fileDescriptor_9198ee693835762e, []int{116} } func (m *AccessReviewSubmission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8243,7 +8292,7 @@ func (m *ThresholdIndexSet) Reset() { *m = ThresholdIndexSet{} } func (m *ThresholdIndexSet) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSet) ProtoMessage() {} func (*ThresholdIndexSet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{116} + return fileDescriptor_9198ee693835762e, []int{117} } func (m *ThresholdIndexSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8286,7 +8335,7 @@ func (m *ThresholdIndexSets) Reset() { *m = ThresholdIndexSets{} } func (m *ThresholdIndexSets) String() string { return proto.CompactTextString(m) } func (*ThresholdIndexSets) ProtoMessage() {} func (*ThresholdIndexSets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{117} + return fileDescriptor_9198ee693835762e, []int{118} } func (m *ThresholdIndexSets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8393,7 +8442,7 @@ func (m *AccessRequestSpecV3) Reset() { *m = AccessRequestSpecV3{} } func (m *AccessRequestSpecV3) String() string { return proto.CompactTextString(m) } func (*AccessRequestSpecV3) ProtoMessage() {} func (*AccessRequestSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{118} + return fileDescriptor_9198ee693835762e, []int{119} } func (m *AccessRequestSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8450,7 +8499,7 @@ func (m *AccessRequestFilter) Reset() { *m = AccessRequestFilter{} } func (m *AccessRequestFilter) String() string { return proto.CompactTextString(m) } func (*AccessRequestFilter) ProtoMessage() {} func (*AccessRequestFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{119} + return fileDescriptor_9198ee693835762e, []int{120} } func (m *AccessRequestFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8506,7 +8555,7 @@ func (m *AccessCapabilities) Reset() { *m = AccessCapabilities{} } func (m *AccessCapabilities) String() string { return proto.CompactTextString(m) } func (*AccessCapabilities) ProtoMessage() {} func (*AccessCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{120} + return fileDescriptor_9198ee693835762e, []int{121} } func (m *AccessCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8564,7 +8613,7 @@ func (m *AccessCapabilitiesRequest) Reset() { *m = AccessCapabilitiesReq func (m *AccessCapabilitiesRequest) String() string { return proto.CompactTextString(m) } func (*AccessCapabilitiesRequest) ProtoMessage() {} func (*AccessCapabilitiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{121} + return fileDescriptor_9198ee693835762e, []int{122} } func (m *AccessCapabilitiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8610,7 +8659,7 @@ func (m *RequestKubernetesResource) Reset() { *m = RequestKubernetesReso func (m *RequestKubernetesResource) String() string { return proto.CompactTextString(m) } func (*RequestKubernetesResource) ProtoMessage() {} func (*RequestKubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{122} + return fileDescriptor_9198ee693835762e, []int{123} } func (m *RequestKubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8663,7 +8712,7 @@ func (m *ResourceID) Reset() { *m = ResourceID{} } func (m *ResourceID) String() string { return proto.CompactTextString(m) } func (*ResourceID) ProtoMessage() {} func (*ResourceID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{123} + return fileDescriptor_9198ee693835762e, []int{124} } func (m *ResourceID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8712,7 +8761,7 @@ type PluginDataV3 struct { func (m *PluginDataV3) Reset() { *m = PluginDataV3{} } func (*PluginDataV3) ProtoMessage() {} func (*PluginDataV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{124} + return fileDescriptor_9198ee693835762e, []int{125} } func (m *PluginDataV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8755,7 +8804,7 @@ func (m *PluginDataEntry) Reset() { *m = PluginDataEntry{} } func (m *PluginDataEntry) String() string { return proto.CompactTextString(m) } func (*PluginDataEntry) ProtoMessage() {} func (*PluginDataEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{125} + return fileDescriptor_9198ee693835762e, []int{126} } func (m *PluginDataEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8797,7 +8846,7 @@ func (m *PluginDataSpecV3) Reset() { *m = PluginDataSpecV3{} } func (m *PluginDataSpecV3) String() string { return proto.CompactTextString(m) } func (*PluginDataSpecV3) ProtoMessage() {} func (*PluginDataSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{126} + return fileDescriptor_9198ee693835762e, []int{127} } func (m *PluginDataSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8844,7 +8893,7 @@ func (m *PluginDataFilter) Reset() { *m = PluginDataFilter{} } func (m *PluginDataFilter) String() string { return proto.CompactTextString(m) } func (*PluginDataFilter) ProtoMessage() {} func (*PluginDataFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{127} + return fileDescriptor_9198ee693835762e, []int{128} } func (m *PluginDataFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8895,7 +8944,7 @@ func (m *PluginDataUpdateParams) Reset() { *m = PluginDataUpdateParams{} func (m *PluginDataUpdateParams) String() string { return proto.CompactTextString(m) } func (*PluginDataUpdateParams) ProtoMessage() {} func (*PluginDataUpdateParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{128} + return fileDescriptor_9198ee693835762e, []int{129} } func (m *PluginDataUpdateParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8939,7 +8988,7 @@ func (m *RoleFilter) Reset() { *m = RoleFilter{} } func (m *RoleFilter) String() string { return proto.CompactTextString(m) } func (*RoleFilter) ProtoMessage() {} func (*RoleFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{129} + return fileDescriptor_9198ee693835762e, []int{130} } func (m *RoleFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8989,7 +9038,7 @@ type RoleV6 struct { func (m *RoleV6) Reset() { *m = RoleV6{} } func (*RoleV6) ProtoMessage() {} func (*RoleV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{130} + return fileDescriptor_9198ee693835762e, []int{131} } func (m *RoleV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9036,7 +9085,7 @@ func (m *RoleSpecV6) Reset() { *m = RoleSpecV6{} } func (m *RoleSpecV6) String() string { return proto.CompactTextString(m) } func (*RoleSpecV6) ProtoMessage() {} func (*RoleSpecV6) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{131} + return fileDescriptor_9198ee693835762e, []int{132} } func (m *RoleSpecV6) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9077,7 +9126,7 @@ func (m *SSHLocalPortForwarding) Reset() { *m = SSHLocalPortForwarding{} func (m *SSHLocalPortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHLocalPortForwarding) ProtoMessage() {} func (*SSHLocalPortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{132} + return fileDescriptor_9198ee693835762e, []int{133} } func (m *SSHLocalPortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9118,7 +9167,7 @@ func (m *SSHRemotePortForwarding) Reset() { *m = SSHRemotePortForwarding func (m *SSHRemotePortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHRemotePortForwarding) ProtoMessage() {} func (*SSHRemotePortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{133} + return fileDescriptor_9198ee693835762e, []int{134} } func (m *SSHRemotePortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9162,7 +9211,7 @@ func (m *SSHPortForwarding) Reset() { *m = SSHPortForwarding{} } func (m *SSHPortForwarding) String() string { return proto.CompactTextString(m) } func (*SSHPortForwarding) ProtoMessage() {} func (*SSHPortForwarding) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{134} + return fileDescriptor_9198ee693835762e, []int{135} } func (m *SSHPortForwarding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9294,7 +9343,7 @@ func (m *RoleOptions) Reset() { *m = RoleOptions{} } func (m *RoleOptions) String() string { return proto.CompactTextString(m) } func (*RoleOptions) ProtoMessage() {} func (*RoleOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{135} + return fileDescriptor_9198ee693835762e, []int{136} } func (m *RoleOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9340,7 +9389,7 @@ func (m *RecordSession) Reset() { *m = RecordSession{} } func (m *RecordSession) String() string { return proto.CompactTextString(m) } func (*RecordSession) ProtoMessage() {} func (*RecordSession) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{136} + return fileDescriptor_9198ee693835762e, []int{137} } func (m *RecordSession) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9392,7 +9441,7 @@ func (m *CertExtension) Reset() { *m = CertExtension{} } func (m *CertExtension) String() string { return proto.CompactTextString(m) } func (*CertExtension) ProtoMessage() {} func (*CertExtension) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{137} + return fileDescriptor_9198ee693835762e, []int{138} } func (m *CertExtension) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9527,17 +9576,19 @@ type RoleConditions struct { WorkloadIdentityLabels Labels `protobuf:"bytes,44,opt,name=WorkloadIdentityLabels,proto3,customtype=Labels" json:"workload_identity_labels,omitempty"` // WorkloadIdentityLabelsExpression is a predicate expression used to // allow/deny access to issuing a WorkloadIdentity. - WorkloadIdentityLabelsExpression string `protobuf:"bytes,45,opt,name=WorkloadIdentityLabelsExpression,proto3" json:"workload_identity_labels_expression,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + WorkloadIdentityLabelsExpression string `protobuf:"bytes,45,opt,name=WorkloadIdentityLabelsExpression,proto3" json:"workload_identity_labels_expression,omitempty"` + // MCPPermissions defines MCP servers related permissions. + MCP *MCPPermissions `protobuf:"bytes,46,opt,name=MCP,proto3" json:"mcp,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{138} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9580,7 +9631,7 @@ func (m *IdentityCenterAccountAssignment) Reset() { *m = IdentityCenterA func (m *IdentityCenterAccountAssignment) String() string { return proto.CompactTextString(m) } func (*IdentityCenterAccountAssignment) ProtoMessage() {} func (*IdentityCenterAccountAssignment) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{139} + return fileDescriptor_9198ee693835762e, []int{140} } func (m *IdentityCenterAccountAssignment) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9621,7 +9672,7 @@ func (m *GitHubPermission) Reset() { *m = GitHubPermission{} } func (m *GitHubPermission) String() string { return proto.CompactTextString(m) } func (*GitHubPermission) ProtoMessage() {} func (*GitHubPermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{140} + return fileDescriptor_9198ee693835762e, []int{141} } func (m *GitHubPermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9650,6 +9701,51 @@ func (m *GitHubPermission) XXX_DiscardUnknown() { var xxx_messageInfo_GitHubPermission proto.InternalMessageInfo +// MCPPermissions defines MCP servers related permissions. +type MCPPermissions struct { + // Tools defines the list of tools allowed or denied for this role. Each entry + // can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular + // expression (must start with '^' and end with '$'). If the list is empty, no + // tools are allowed. + Tools []string `protobuf:"bytes,1,rep,name=tools,proto3" json:"tools,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MCPPermissions) Reset() { *m = MCPPermissions{} } +func (m *MCPPermissions) String() string { return proto.CompactTextString(m) } +func (*MCPPermissions) ProtoMessage() {} +func (*MCPPermissions) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{142} +} +func (m *MCPPermissions) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MCPPermissions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MCPPermissions.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 *MCPPermissions) XXX_Merge(src proto.Message) { + xxx_messageInfo_MCPPermissions.Merge(m, src) +} +func (m *MCPPermissions) XXX_Size() int { + return m.Size() +} +func (m *MCPPermissions) XXX_DiscardUnknown() { + xxx_messageInfo_MCPPermissions.DiscardUnknown(m) +} + +var xxx_messageInfo_MCPPermissions proto.InternalMessageInfo + // SPIFFERoleCondition sets out which SPIFFE identities this role is allowed or // denied to generate. The Path matcher is required, and is evaluated first. If, // the Path does not match then the other matcher fields are not evaluated. @@ -9697,7 +9793,7 @@ func (m *SPIFFERoleCondition) Reset() { *m = SPIFFERoleCondition{} } func (m *SPIFFERoleCondition) String() string { return proto.CompactTextString(m) } func (*SPIFFERoleCondition) ProtoMessage() {} func (*SPIFFERoleCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{141} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9741,7 +9837,7 @@ func (m *DatabasePermission) Reset() { *m = DatabasePermission{} } func (m *DatabasePermission) String() string { return proto.CompactTextString(m) } func (*DatabasePermission) ProtoMessage() {} func (*DatabasePermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{142} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9794,7 +9890,7 @@ func (m *KubernetesResource) Reset() { *m = KubernetesResource{} } func (m *KubernetesResource) String() string { return proto.CompactTextString(m) } func (*KubernetesResource) ProtoMessage() {} func (*KubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{143} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9847,7 +9943,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{144} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9895,7 +9991,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{145} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9971,7 +10067,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{146} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10017,7 +10113,7 @@ func (m *AccessRequestConditionsReason) Reset() { *m = AccessRequestCond func (m *AccessRequestConditionsReason) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditionsReason) ProtoMessage() {} func (*AccessRequestConditionsReason) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{147} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *AccessRequestConditionsReason) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10070,7 +10166,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{148} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10112,7 +10208,7 @@ func (m *AccessRequestAllowedPromotion) Reset() { *m = AccessRequestAllo func (m *AccessRequestAllowedPromotion) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotion) ProtoMessage() {} func (*AccessRequestAllowedPromotion) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{149} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10155,7 +10251,7 @@ func (m *AccessRequestAllowedPromotions) Reset() { *m = AccessRequestAll func (m *AccessRequestAllowedPromotions) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotions) ProtoMessage() {} func (*AccessRequestAllowedPromotions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{150} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10201,7 +10297,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{151} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10247,7 +10343,7 @@ func (m *TraitMapping) Reset() { *m = TraitMapping{} } func (m *TraitMapping) String() string { return proto.CompactTextString(m) } func (*TraitMapping) ProtoMessage() {} func (*TraitMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{152} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10296,7 +10392,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{153} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10344,7 +10440,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{154} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10386,7 +10482,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{155} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10428,7 +10524,7 @@ func (m *UserFilter) Reset() { *m = UserFilter{} } func (m *UserFilter) String() string { return proto.CompactTextString(m) } func (*UserFilter) ProtoMessage() {} func (*UserFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{156} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10479,7 +10575,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{157} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10528,7 +10624,7 @@ func (m *UserStatusV2) Reset() { *m = UserStatusV2{} } func (m *UserStatusV2) String() string { return proto.CompactTextString(m) } func (*UserStatusV2) ProtoMessage() {} func (*UserStatusV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{158} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10602,7 +10698,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{159} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10652,7 +10748,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{160} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10700,7 +10796,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{161} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10745,7 +10841,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{162} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10794,7 +10890,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10851,7 +10947,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{164} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10961,7 +11057,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{165} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11007,7 +11103,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{166} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11089,7 +11185,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{167} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11135,7 +11231,7 @@ func (m *SSOMFADevice) Reset() { *m = SSOMFADevice{} } func (m *SSOMFADevice) String() string { return proto.CompactTextString(m) } func (*SSOMFADevice) ProtoMessage() {} func (*SSOMFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{168} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11178,7 +11274,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{169} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11224,7 +11320,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{170} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11266,7 +11362,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{171} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11316,7 +11412,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{172} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11363,7 +11459,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{173} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11412,7 +11508,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{174} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11460,7 +11556,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{175} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11508,7 +11604,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{176} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11559,7 +11655,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{177} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11607,7 +11703,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{178} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11653,7 +11749,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{179} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11702,7 +11798,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{180} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11744,7 +11840,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{181} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11793,7 +11889,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{182} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11878,7 +11974,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{183} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11923,7 +12019,7 @@ func (m *DeviceWebToken) Reset() { *m = DeviceWebToken{} } func (m *DeviceWebToken) String() string { return proto.CompactTextString(m) } func (*DeviceWebToken) ProtoMessage() {} func (*DeviceWebToken) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{184} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11965,7 +12061,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{185} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12036,7 +12132,7 @@ func (m *SAMLSessionData) Reset() { *m = SAMLSessionData{} } func (m *SAMLSessionData) String() string { return proto.CompactTextString(m) } func (*SAMLSessionData) ProtoMessage() {} func (*SAMLSessionData) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{186} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12085,7 +12181,7 @@ func (m *SAMLAttribute) Reset() { *m = SAMLAttribute{} } func (m *SAMLAttribute) String() string { return proto.CompactTextString(m) } func (*SAMLAttribute) ProtoMessage() {} func (*SAMLAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{187} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12132,7 +12228,7 @@ func (m *SAMLAttributeValue) Reset() { *m = SAMLAttributeValue{} } func (m *SAMLAttributeValue) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeValue) ProtoMessage() {} func (*SAMLAttributeValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{188} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12183,7 +12279,7 @@ func (m *SAMLNameID) Reset() { *m = SAMLNameID{} } func (m *SAMLNameID) String() string { return proto.CompactTextString(m) } func (*SAMLNameID) ProtoMessage() {} func (*SAMLNameID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{189} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12232,7 +12328,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{190} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12276,7 +12372,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{191} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12326,7 +12422,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{192} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12375,7 +12471,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{193} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12426,7 +12522,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{194} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12474,7 +12570,7 @@ func (m *KubeAzure) Reset() { *m = KubeAzure{} } func (m *KubeAzure) String() string { return proto.CompactTextString(m) } func (*KubeAzure) ProtoMessage() {} func (*KubeAzure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{195} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12520,7 +12616,7 @@ func (m *KubeAWS) Reset() { *m = KubeAWS{} } func (m *KubeAWS) String() string { return proto.CompactTextString(m) } func (*KubeAWS) ProtoMessage() {} func (*KubeAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{196} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12566,7 +12662,7 @@ func (m *KubeGCP) Reset() { *m = KubeGCP{} } func (m *KubeGCP) String() string { return proto.CompactTextString(m) } func (*KubeGCP) ProtoMessage() {} func (*KubeGCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{197} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12608,7 +12704,7 @@ func (m *KubernetesClusterV3List) Reset() { *m = KubernetesClusterV3List func (m *KubernetesClusterV3List) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterV3List) ProtoMessage() {} func (*KubernetesClusterV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{198} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12657,7 +12753,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{199} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12709,7 +12805,7 @@ func (m *KubernetesServerSpecV3) Reset() { *m = KubernetesServerSpecV3{} func (m *KubernetesServerSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesServerSpecV3) ProtoMessage() {} func (*KubernetesServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{200} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12761,7 +12857,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{201} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12805,7 +12901,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{202} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12849,7 +12945,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{203} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12893,7 +12989,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{204} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12937,7 +13033,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{205} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12981,7 +13077,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{206} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13023,7 +13119,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{207} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13072,7 +13168,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{208} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13119,7 +13215,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{209} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13163,7 +13259,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{210} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13205,7 +13301,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{211} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13256,7 +13352,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{212} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13298,7 +13394,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{213} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13388,7 +13484,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{214} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13430,7 +13526,7 @@ func (m *MaxAge) Reset() { *m = MaxAge{} } func (m *MaxAge) String() string { return proto.CompactTextString(m) } func (*MaxAge) ProtoMessage() {} func (*MaxAge) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{215} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13475,7 +13571,7 @@ func (m *SSOClientRedirectSettings) Reset() { *m = SSOClientRedirectSett func (m *SSOClientRedirectSettings) String() string { return proto.CompactTextString(m) } func (*SSOClientRedirectSettings) ProtoMessage() {} func (*SSOClientRedirectSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{216} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13532,7 +13628,7 @@ func (m *OIDCConnectorMFASettings) Reset() { *m = OIDCConnectorMFASettin func (m *OIDCConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorMFASettings) ProtoMessage() {} func (*OIDCConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{217} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13627,7 +13723,7 @@ func (m *OIDCAuthRequest) Reset() { *m = OIDCAuthRequest{} } func (m *OIDCAuthRequest) String() string { return proto.CompactTextString(m) } func (*OIDCAuthRequest) ProtoMessage() {} func (*OIDCAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{218} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13678,7 +13774,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{219} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13720,7 +13816,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{220} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13810,7 +13906,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{221} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13869,7 +13965,7 @@ func (m *SAMLConnectorMFASettings) Reset() { *m = SAMLConnectorMFASettin func (m *SAMLConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorMFASettings) ProtoMessage() {} func (*SAMLConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{222} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13962,7 +14058,7 @@ func (m *SAMLAuthRequest) Reset() { *m = SAMLAuthRequest{} } func (m *SAMLAuthRequest) String() string { return proto.CompactTextString(m) } func (*SAMLAuthRequest) ProtoMessage() {} func (*SAMLAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{223} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14008,7 +14104,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{224} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14053,7 +14149,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{225} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14104,7 +14200,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{226} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14146,7 +14242,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{227} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14209,7 +14305,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{228} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14298,7 +14394,7 @@ func (m *GithubAuthRequest) Reset() { *m = GithubAuthRequest{} } func (m *GithubAuthRequest) String() string { return proto.CompactTextString(m) } func (*GithubAuthRequest) ProtoMessage() {} func (*GithubAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{229} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14342,7 +14438,7 @@ func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } func (*SSOWarnings) ProtoMessage() {} func (*SSOWarnings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{230} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14398,7 +14494,7 @@ func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } func (*CreateUserParams) ProtoMessage() {} func (*CreateUserParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{231} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14483,7 +14579,7 @@ func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{232} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14527,7 +14623,7 @@ func (m *GithubTokenInfo) Reset() { *m = GithubTokenInfo{} } func (m *GithubTokenInfo) String() string { return proto.CompactTextString(m) } func (*GithubTokenInfo) ProtoMessage() {} func (*GithubTokenInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{233} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14578,7 +14674,7 @@ func (m *GithubClaims) Reset() { *m = GithubClaims{} } func (m *GithubClaims) String() string { return proto.CompactTextString(m) } func (*GithubClaims) ProtoMessage() {} func (*GithubClaims) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{234} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14630,7 +14726,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{235} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14676,7 +14772,7 @@ func (m *TeamRolesMapping) Reset() { *m = TeamRolesMapping{} } func (m *TeamRolesMapping) String() string { return proto.CompactTextString(m) } func (*TeamRolesMapping) ProtoMessage() {} func (*TeamRolesMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{236} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14726,7 +14822,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{237} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14768,7 +14864,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{238} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14824,7 +14920,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{239} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14878,7 +14974,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{240} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14928,7 +15024,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{241} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14985,7 +15081,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{242} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15029,7 +15125,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{243} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15072,7 +15168,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{244} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15125,7 +15221,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15169,7 +15265,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{246} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15217,7 +15313,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{247} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15261,7 +15357,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{248} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15305,7 +15401,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{249} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15358,7 +15454,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15402,7 +15498,7 @@ func (m *DynamicWindowsDesktopV1) Reset() { *m = DynamicWindowsDesktopV1 func (m *DynamicWindowsDesktopV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopV1) ProtoMessage() {} func (*DynamicWindowsDesktopV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{251} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15453,7 +15549,7 @@ func (m *DynamicWindowsDesktopSpecV1) Reset() { *m = DynamicWindowsDeskt func (m *DynamicWindowsDesktopSpecV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopSpecV1) ProtoMessage() {} func (*DynamicWindowsDesktopSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{252} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15494,7 +15590,7 @@ func (m *Resolution) Reset() { *m = Resolution{} } func (m *Resolution) String() string { return proto.CompactTextString(m) } func (*Resolution) ProtoMessage() {} func (*Resolution) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{253} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15581,7 +15677,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{254} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15635,7 +15731,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{255} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15680,7 +15776,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{256} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15724,7 +15820,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15764,7 +15860,7 @@ func (m *NullableSessionState) Reset() { *m = NullableSessionState{} } func (m *NullableSessionState) String() string { return proto.CompactTextString(m) } func (*NullableSessionState) ProtoMessage() {} func (*NullableSessionState) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{258} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15810,7 +15906,7 @@ func (m *SessionTrackerFilter) Reset() { *m = SessionTrackerFilter{} } func (m *SessionTrackerFilter) String() string { return proto.CompactTextString(m) } func (*SessionTrackerFilter) ProtoMessage() {} func (*SessionTrackerFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{259} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15854,7 +15950,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15952,7 +16048,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{261} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15999,7 +16095,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16047,7 +16143,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{263} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16091,7 +16187,7 @@ func (m *UIConfigV1) Reset() { *m = UIConfigV1{} } func (m *UIConfigV1) String() string { return proto.CompactTextString(m) } func (*UIConfigV1) ProtoMessage() {} func (*UIConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{264} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16137,7 +16233,7 @@ func (m *UIConfigSpecV1) Reset() { *m = UIConfigSpecV1{} } func (m *UIConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*UIConfigSpecV1) ProtoMessage() {} func (*UIConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{265} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16188,7 +16284,7 @@ func (m *InstallerV1) Reset() { *m = InstallerV1{} } func (m *InstallerV1) String() string { return proto.CompactTextString(m) } func (*InstallerV1) ProtoMessage() {} func (*InstallerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{266} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16230,7 +16326,7 @@ func (m *InstallerSpecV1) Reset() { *m = InstallerSpecV1{} } func (m *InstallerSpecV1) String() string { return proto.CompactTextString(m) } func (*InstallerSpecV1) ProtoMessage() {} func (*InstallerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{267} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16272,7 +16368,7 @@ func (m *InstallerV1List) Reset() { *m = InstallerV1List{} } func (m *InstallerV1List) String() string { return proto.CompactTextString(m) } func (*InstallerV1List) ProtoMessage() {} func (*InstallerV1List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{268} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16316,7 +16412,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{269} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16362,7 +16458,7 @@ func (m *ConnectionDiagnosticV1) Reset() { *m = ConnectionDiagnosticV1{} func (m *ConnectionDiagnosticV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticV1) ProtoMessage() {} func (*ConnectionDiagnosticV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{270} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16412,7 +16508,7 @@ func (m *ConnectionDiagnosticSpecV1) Reset() { *m = ConnectionDiagnostic func (m *ConnectionDiagnosticSpecV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticSpecV1) ProtoMessage() {} func (*ConnectionDiagnosticSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{271} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16458,7 +16554,7 @@ func (m *ConnectionDiagnosticTrace) Reset() { *m = ConnectionDiagnosticT func (m *ConnectionDiagnosticTrace) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticTrace) ProtoMessage() {} func (*ConnectionDiagnosticTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16501,7 +16597,7 @@ func (m *DatabaseServiceV1) Reset() { *m = DatabaseServiceV1{} } func (m *DatabaseServiceV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceV1) ProtoMessage() {} func (*DatabaseServiceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{273} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16545,7 +16641,7 @@ func (m *DatabaseServiceSpecV1) Reset() { *m = DatabaseServiceSpecV1{} } func (m *DatabaseServiceSpecV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceSpecV1) ProtoMessage() {} func (*DatabaseServiceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{274} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16587,7 +16683,7 @@ func (m *DatabaseResourceMatcher) Reset() { *m = DatabaseResourceMatcher func (m *DatabaseResourceMatcher) String() string { return proto.CompactTextString(m) } func (*DatabaseResourceMatcher) ProtoMessage() {} func (*DatabaseResourceMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{275} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16631,7 +16727,7 @@ func (m *ResourceMatcherAWS) Reset() { *m = ResourceMatcherAWS{} } func (m *ResourceMatcherAWS) String() string { return proto.CompactTextString(m) } func (*ResourceMatcherAWS) ProtoMessage() {} func (*ResourceMatcherAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{276} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16673,7 +16769,7 @@ func (m *ClusterAlert) Reset() { *m = ClusterAlert{} } func (m *ClusterAlert) String() string { return proto.CompactTextString(m) } func (*ClusterAlert) ProtoMessage() {} func (*ClusterAlert) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{277} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16719,7 +16815,7 @@ func (m *ClusterAlertSpec) Reset() { *m = ClusterAlertSpec{} } func (m *ClusterAlertSpec) String() string { return proto.CompactTextString(m) } func (*ClusterAlertSpec) ProtoMessage() {} func (*ClusterAlertSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{278} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16772,7 +16868,7 @@ func (m *GetClusterAlertsRequest) Reset() { *m = GetClusterAlertsRequest func (m *GetClusterAlertsRequest) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsRequest) ProtoMessage() {} func (*GetClusterAlertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{279} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16822,7 +16918,7 @@ func (m *AlertAcknowledgement) Reset() { *m = AlertAcknowledgement{} } func (m *AlertAcknowledgement) String() string { return proto.CompactTextString(m) } func (*AlertAcknowledgement) ProtoMessage() {} func (*AlertAcknowledgement) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{280} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16874,7 +16970,7 @@ func (m *Release) Reset() { *m = Release{} } func (m *Release) String() string { return proto.CompactTextString(m) } func (*Release) ProtoMessage() {} func (*Release) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{281} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16932,7 +17028,7 @@ func (m *Asset) Reset() { *m = Asset{} } func (m *Asset) String() string { return proto.CompactTextString(m) } func (*Asset) ProtoMessage() {} func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{282} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16985,7 +17081,7 @@ func (m *PluginV1) Reset() { *m = PluginV1{} } func (m *PluginV1) String() string { return proto.CompactTextString(m) } func (*PluginV1) ProtoMessage() {} func (*PluginV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{283} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17054,7 +17150,7 @@ func (m *PluginSpecV1) Reset() { *m = PluginSpecV1{} } func (m *PluginSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginSpecV1) ProtoMessage() {} func (*PluginSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{284} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17358,7 +17454,7 @@ func (m *PluginGithubSettings) Reset() { *m = PluginGithubSettings{} } func (m *PluginGithubSettings) String() string { return proto.CompactTextString(m) } func (*PluginGithubSettings) ProtoMessage() {} func (*PluginGithubSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{285} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *PluginGithubSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17398,7 +17494,7 @@ func (m *PluginSlackAccessSettings) Reset() { *m = PluginSlackAccessSett func (m *PluginSlackAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginSlackAccessSettings) ProtoMessage() {} func (*PluginSlackAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{286} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17439,7 +17535,7 @@ func (m *PluginGitlabSettings) Reset() { *m = PluginGitlabSettings{} } func (m *PluginGitlabSettings) String() string { return proto.CompactTextString(m) } func (*PluginGitlabSettings) ProtoMessage() {} func (*PluginGitlabSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{287} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17486,7 +17582,7 @@ func (m *PluginOpsgenieAccessSettings) Reset() { *m = PluginOpsgenieAcce func (m *PluginOpsgenieAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginOpsgenieAccessSettings) ProtoMessage() {} func (*PluginOpsgenieAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{288} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17534,7 +17630,7 @@ func (m *PluginServiceNowSettings) Reset() { *m = PluginServiceNowSettin func (m *PluginServiceNowSettings) String() string { return proto.CompactTextString(m) } func (*PluginServiceNowSettings) ProtoMessage() {} func (*PluginServiceNowSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{289} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17580,7 +17676,7 @@ func (m *PluginPagerDutySettings) Reset() { *m = PluginPagerDutySettings func (m *PluginPagerDutySettings) String() string { return proto.CompactTextString(m) } func (*PluginPagerDutySettings) ProtoMessage() {} func (*PluginPagerDutySettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{290} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17626,7 +17722,7 @@ func (m *PluginJiraSettings) Reset() { *m = PluginJiraSettings{} } func (m *PluginJiraSettings) String() string { return proto.CompactTextString(m) } func (*PluginJiraSettings) ProtoMessage() {} func (*PluginJiraSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{291} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17666,7 +17762,7 @@ func (m *PluginOpenAISettings) Reset() { *m = PluginOpenAISettings{} } func (m *PluginOpenAISettings) String() string { return proto.CompactTextString(m) } func (*PluginOpenAISettings) ProtoMessage() {} func (*PluginOpenAISettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{292} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17717,7 +17813,7 @@ func (m *PluginMattermostSettings) Reset() { *m = PluginMattermostSettin func (m *PluginMattermostSettings) String() string { return proto.CompactTextString(m) } func (*PluginMattermostSettings) ProtoMessage() {} func (*PluginMattermostSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{293} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17759,7 +17855,7 @@ func (m *PluginJamfSettings) Reset() { *m = PluginJamfSettings{} } func (m *PluginJamfSettings) String() string { return proto.CompactTextString(m) } func (*PluginJamfSettings) ProtoMessage() {} func (*PluginJamfSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{294} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17811,7 +17907,7 @@ func (m *PluginOktaSettings) Reset() { *m = PluginOktaSettings{} } func (m *PluginOktaSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSettings) ProtoMessage() {} func (*PluginOktaSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{295} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17858,7 +17954,7 @@ func (m *PluginOktaCredentialsInfo) Reset() { *m = PluginOktaCredentials func (m *PluginOktaCredentialsInfo) String() string { return proto.CompactTextString(m) } func (*PluginOktaCredentialsInfo) ProtoMessage() {} func (*PluginOktaCredentialsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{296} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17959,7 +18055,7 @@ func (m *PluginOktaSyncSettings) Reset() { *m = PluginOktaSyncSettings{} func (m *PluginOktaSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSyncSettings) ProtoMessage() {} func (*PluginOktaSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{297} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18000,7 +18096,7 @@ func (m *DiscordChannels) Reset() { *m = DiscordChannels{} } func (m *DiscordChannels) String() string { return proto.CompactTextString(m) } func (*DiscordChannels) ProtoMessage() {} func (*DiscordChannels) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{298} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18044,7 +18140,7 @@ func (m *PluginDiscordSettings) Reset() { *m = PluginDiscordSettings{} } func (m *PluginDiscordSettings) String() string { return proto.CompactTextString(m) } func (*PluginDiscordSettings) ProtoMessage() {} func (*PluginDiscordSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{299} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18089,7 +18185,7 @@ func (m *PluginEntraIDSettings) Reset() { *m = PluginEntraIDSettings{} } func (m *PluginEntraIDSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSettings) ProtoMessage() {} func (*PluginEntraIDSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{300} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18143,7 +18239,7 @@ func (m *PluginEntraIDSyncSettings) Reset() { *m = PluginEntraIDSyncSett func (m *PluginEntraIDSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSyncSettings) ProtoMessage() {} func (*PluginEntraIDSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{301} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18188,7 +18284,7 @@ func (m *PluginEntraIDAccessGraphSettings) Reset() { *m = PluginEntraIDA func (m *PluginEntraIDAccessGraphSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAccessGraphSettings) ProtoMessage() {} func (*PluginEntraIDAccessGraphSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{302} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18234,7 +18330,7 @@ func (m *PluginEntraIDAppSSOSettings) Reset() { *m = PluginEntraIDAppSSO func (m *PluginEntraIDAppSSOSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAppSSOSettings) ProtoMessage() {} func (*PluginEntraIDAppSSOSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{303} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18280,7 +18376,7 @@ func (m *PluginSCIMSettings) Reset() { *m = PluginSCIMSettings{} } func (m *PluginSCIMSettings) String() string { return proto.CompactTextString(m) } func (*PluginSCIMSettings) ProtoMessage() {} func (*PluginSCIMSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{304} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18324,7 +18420,7 @@ func (m *PluginDatadogAccessSettings) Reset() { *m = PluginDatadogAccess func (m *PluginDatadogAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginDatadogAccessSettings) ProtoMessage() {} func (*PluginDatadogAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{305} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18426,7 +18522,7 @@ func (m *PluginAWSICSettings) Reset() { *m = PluginAWSICSettings{} } func (m *PluginAWSICSettings) String() string { return proto.CompactTextString(m) } func (*PluginAWSICSettings) ProtoMessage() {} func (*PluginAWSICSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{306} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18471,7 +18567,7 @@ func (m *AWSICCredentials) Reset() { *m = AWSICCredentials{} } func (m *AWSICCredentials) String() string { return proto.CompactTextString(m) } func (*AWSICCredentials) ProtoMessage() {} func (*AWSICCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *AWSICCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18561,7 +18657,7 @@ func (m *AWSICCredentialSourceSystem) Reset() { *m = AWSICCredentialSour func (m *AWSICCredentialSourceSystem) String() string { return proto.CompactTextString(m) } func (*AWSICCredentialSourceSystem) ProtoMessage() {} func (*AWSICCredentialSourceSystem) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{308} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *AWSICCredentialSourceSystem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18605,7 +18701,7 @@ func (m *AWSICCredentialSourceOIDC) Reset() { *m = AWSICCredentialSource func (m *AWSICCredentialSourceOIDC) String() string { return proto.CompactTextString(m) } func (*AWSICCredentialSourceOIDC) ProtoMessage() {} func (*AWSICCredentialSourceOIDC) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{309} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *AWSICCredentialSourceOIDC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18661,7 +18757,7 @@ func (m *AWSICResourceFilter) Reset() { *m = AWSICResourceFilter{} } func (m *AWSICResourceFilter) String() string { return proto.CompactTextString(m) } func (*AWSICResourceFilter) ProtoMessage() {} func (*AWSICResourceFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{310} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *AWSICResourceFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18784,7 +18880,7 @@ func (m *AWSICUserSyncFilter) Reset() { *m = AWSICUserSyncFilter{} } func (m *AWSICUserSyncFilter) String() string { return proto.CompactTextString(m) } func (*AWSICUserSyncFilter) ProtoMessage() {} func (*AWSICUserSyncFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *AWSICUserSyncFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18831,7 +18927,7 @@ func (m *AWSICProvisioningSpec) Reset() { *m = AWSICProvisioningSpec{} } func (m *AWSICProvisioningSpec) String() string { return proto.CompactTextString(m) } func (*AWSICProvisioningSpec) ProtoMessage() {} func (*AWSICProvisioningSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{312} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18873,7 +18969,7 @@ func (m *PluginAWSICStatusV1) Reset() { *m = PluginAWSICStatusV1{} } func (m *PluginAWSICStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginAWSICStatusV1) ProtoMessage() {} func (*PluginAWSICStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *PluginAWSICStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18918,7 +19014,7 @@ func (m *AWSICGroupImportStatus) Reset() { *m = AWSICGroupImportStatus{} func (m *AWSICGroupImportStatus) String() string { return proto.CompactTextString(m) } func (*AWSICGroupImportStatus) ProtoMessage() {} func (*AWSICGroupImportStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *AWSICGroupImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18969,7 +19065,7 @@ func (m *PluginEmailSettings) Reset() { *m = PluginEmailSettings{} } func (m *PluginEmailSettings) String() string { return proto.CompactTextString(m) } func (*PluginEmailSettings) ProtoMessage() {} func (*PluginEmailSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *PluginEmailSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19057,7 +19153,7 @@ func (m *MailgunSpec) Reset() { *m = MailgunSpec{} } func (m *MailgunSpec) String() string { return proto.CompactTextString(m) } func (*MailgunSpec) ProtoMessage() {} func (*MailgunSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{316} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *MailgunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19104,7 +19200,7 @@ func (m *SMTPSpec) Reset() { *m = SMTPSpec{} } func (m *SMTPSpec) String() string { return proto.CompactTextString(m) } func (*SMTPSpec) ProtoMessage() {} func (*SMTPSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *SMTPSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19154,7 +19250,7 @@ func (m *PluginMSTeamsSettings) Reset() { *m = PluginMSTeamsSettings{} } func (m *PluginMSTeamsSettings) String() string { return proto.CompactTextString(m) } func (*PluginMSTeamsSettings) ProtoMessage() {} func (*PluginMSTeamsSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *PluginMSTeamsSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19201,7 +19297,7 @@ func (m *PluginNetIQSettings) Reset() { *m = PluginNetIQSettings{} } func (m *PluginNetIQSettings) String() string { return proto.CompactTextString(m) } func (*PluginNetIQSettings) ProtoMessage() {} func (*PluginNetIQSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{319} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *PluginNetIQSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19246,7 +19342,7 @@ func (m *PluginBootstrapCredentialsV1) Reset() { *m = PluginBootstrapCre func (m *PluginBootstrapCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginBootstrapCredentialsV1) ProtoMessage() {} func (*PluginBootstrapCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{320} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19346,7 +19442,7 @@ func (m *PluginIdSecretCredential) Reset() { *m = PluginIdSecretCredenti func (m *PluginIdSecretCredential) String() string { return proto.CompactTextString(m) } func (*PluginIdSecretCredential) ProtoMessage() {} func (*PluginIdSecretCredential) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{321} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19389,7 +19485,7 @@ func (m *PluginOAuth2AuthorizationCodeCredentials) Reset() { func (m *PluginOAuth2AuthorizationCodeCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AuthorizationCodeCredentials) ProtoMessage() {} func (*PluginOAuth2AuthorizationCodeCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{322} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19449,7 +19545,7 @@ func (m *PluginStatusV1) Reset() { *m = PluginStatusV1{} } func (m *PluginStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginStatusV1) ProtoMessage() {} func (*PluginStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{323} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19578,7 +19674,7 @@ func (m *PluginNetIQStatusV1) Reset() { *m = PluginNetIQStatusV1{} } func (m *PluginNetIQStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginNetIQStatusV1) ProtoMessage() {} func (*PluginNetIQStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{324} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *PluginNetIQStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19624,7 +19720,7 @@ func (m *PluginGitlabStatusV1) Reset() { *m = PluginGitlabStatusV1{} } func (m *PluginGitlabStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginGitlabStatusV1) ProtoMessage() {} func (*PluginGitlabStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{325} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19668,7 +19764,7 @@ func (m *PluginEntraIDStatusV1) Reset() { *m = PluginEntraIDStatusV1{} } func (m *PluginEntraIDStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDStatusV1) ProtoMessage() {} func (*PluginEntraIDStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19725,7 +19821,7 @@ func (m *PluginOktaStatusV1) Reset() { *m = PluginOktaStatusV1{} } func (m *PluginOktaStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusV1) ProtoMessage() {} func (*PluginOktaStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{327} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19778,7 +19874,7 @@ func (m *PluginOktaStatusDetailsSSO) Reset() { *m = PluginOktaStatusDeta func (m *PluginOktaStatusDetailsSSO) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSSO) ProtoMessage() {} func (*PluginOktaStatusDetailsSSO) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{328} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19835,7 +19931,7 @@ func (m *PluginOktaStatusDetailsAppGroupSync) Reset() { *m = PluginOktaS func (m *PluginOktaStatusDetailsAppGroupSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAppGroupSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAppGroupSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{329} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19889,7 +19985,7 @@ func (m *PluginOktaStatusDetailsUsersSync) Reset() { *m = PluginOktaStat func (m *PluginOktaStatusDetailsUsersSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsUsersSync) ProtoMessage() {} func (*PluginOktaStatusDetailsUsersSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{330} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19932,7 +20028,7 @@ func (m *PluginOktaStatusDetailsSCIM) Reset() { *m = PluginOktaStatusDet func (m *PluginOktaStatusDetailsSCIM) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSCIM) ProtoMessage() {} func (*PluginOktaStatusDetailsSCIM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{331} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19994,7 +20090,7 @@ func (m *PluginOktaStatusDetailsAccessListsSync) Reset() { func (m *PluginOktaStatusDetailsAccessListsSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAccessListsSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAccessListsSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{332} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20046,7 +20142,7 @@ func (m *PluginOktaStatusSystemLogExporter) Reset() { *m = PluginOktaSta func (m *PluginOktaStatusSystemLogExporter) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusSystemLogExporter) ProtoMessage() {} func (*PluginOktaStatusSystemLogExporter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{333} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *PluginOktaStatusSystemLogExporter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20094,7 +20190,7 @@ func (m *PluginCredentialsV1) Reset() { *m = PluginCredentialsV1{} } func (m *PluginCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginCredentialsV1) ProtoMessage() {} func (*PluginCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{334} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20205,7 +20301,7 @@ func (m *PluginOAuth2AccessTokenCredentials) Reset() { *m = PluginOAuth2 func (m *PluginOAuth2AccessTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AccessTokenCredentials) ProtoMessage() {} func (*PluginOAuth2AccessTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{335} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20246,7 +20342,7 @@ func (m *PluginBearerTokenCredentials) Reset() { *m = PluginBearerTokenC func (m *PluginBearerTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginBearerTokenCredentials) ProtoMessage() {} func (*PluginBearerTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{336} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20288,7 +20384,7 @@ func (m *PluginStaticCredentialsRef) Reset() { *m = PluginStaticCredenti func (m *PluginStaticCredentialsRef) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsRef) ProtoMessage() {} func (*PluginStaticCredentialsRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{337} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20330,7 +20426,7 @@ func (m *PluginListV1) Reset() { *m = PluginListV1{} } func (m *PluginListV1) String() string { return proto.CompactTextString(m) } func (*PluginListV1) ProtoMessage() {} func (*PluginListV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20373,7 +20469,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20421,7 +20517,7 @@ func (m *PluginStaticCredentialsSpecV1) Reset() { *m = PluginStaticCrede func (m *PluginStaticCredentialsSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsSpecV1) ProtoMessage() {} func (*PluginStaticCredentialsSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{340} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20548,7 +20644,7 @@ func (m *PluginStaticCredentialsBasicAuth) Reset() { *m = PluginStaticCr func (m *PluginStaticCredentialsBasicAuth) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsBasicAuth) ProtoMessage() {} func (*PluginStaticCredentialsBasicAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{341} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20594,7 +20690,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Reset() { func (m *PluginStaticCredentialsOAuthClientSecret) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsOAuthClientSecret) ProtoMessage() {} func (*PluginStaticCredentialsOAuthClientSecret) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{342} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20642,7 +20738,7 @@ func (m *PluginStaticCredentialsSSHCertAuthorities) String() string { } func (*PluginStaticCredentialsSSHCertAuthorities) ProtoMessage() {} func (*PluginStaticCredentialsSSHCertAuthorities) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{343} + return fileDescriptor_9198ee693835762e, []int{345} } func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20685,7 +20781,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{344} + return fileDescriptor_9198ee693835762e, []int{346} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20756,7 +20852,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{345} + return fileDescriptor_9198ee693835762e, []int{347} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20803,7 +20899,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{346} + return fileDescriptor_9198ee693835762e, []int{348} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20845,7 +20941,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{347} + return fileDescriptor_9198ee693835762e, []int{349} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20887,7 +20983,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{348} + return fileDescriptor_9198ee693835762e, []int{350} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20937,7 +21033,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{349} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20979,7 +21075,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{350} + return fileDescriptor_9198ee693835762e, []int{352} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21025,7 +21121,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{351} + return fileDescriptor_9198ee693835762e, []int{353} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21067,7 +21163,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{352} + return fileDescriptor_9198ee693835762e, []int{354} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21113,7 +21209,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{353} + return fileDescriptor_9198ee693835762e, []int{355} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21160,7 +21256,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{354} + return fileDescriptor_9198ee693835762e, []int{356} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21203,7 +21299,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{355} + return fileDescriptor_9198ee693835762e, []int{357} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21246,7 +21342,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{356} + return fileDescriptor_9198ee693835762e, []int{358} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21288,7 +21384,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{357} + return fileDescriptor_9198ee693835762e, []int{359} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21332,7 +21428,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{358} + return fileDescriptor_9198ee693835762e, []int{360} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21376,7 +21472,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{359} + return fileDescriptor_9198ee693835762e, []int{361} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21419,7 +21515,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{360} + return fileDescriptor_9198ee693835762e, []int{362} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21467,7 +21563,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{361} + return fileDescriptor_9198ee693835762e, []int{363} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21510,7 +21606,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{362} + return fileDescriptor_9198ee693835762e, []int{364} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21564,7 +21660,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{363} + return fileDescriptor_9198ee693835762e, []int{365} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21608,7 +21704,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{364} + return fileDescriptor_9198ee693835762e, []int{366} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21655,7 +21751,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{365} + return fileDescriptor_9198ee693835762e, []int{367} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21704,7 +21800,7 @@ func (m *IntegrationSpecV1) Reset() { *m = IntegrationSpecV1{} } func (m *IntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*IntegrationSpecV1) ProtoMessage() {} func (*IntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{366} + return fileDescriptor_9198ee693835762e, []int{368} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21815,7 +21911,7 @@ func (m *IntegrationStatusV1) Reset() { *m = IntegrationStatusV1{} } func (m *IntegrationStatusV1) String() string { return proto.CompactTextString(m) } func (*IntegrationStatusV1) ProtoMessage() {} func (*IntegrationStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{367} + return fileDescriptor_9198ee693835762e, []int{369} } func (m *IntegrationStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21877,7 +21973,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{368} + return fileDescriptor_9198ee693835762e, []int{370} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21923,7 +22019,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{369} + return fileDescriptor_9198ee693835762e, []int{371} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21965,7 +22061,7 @@ 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{370} + return fileDescriptor_9198ee693835762e, []int{372} } func (m *GitHubIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22010,7 +22106,7 @@ func (m *AWSRAIntegrationSpecV1) Reset() { *m = AWSRAIntegrationSpecV1{} func (m *AWSRAIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AWSRAIntegrationSpecV1) ProtoMessage() {} func (*AWSRAIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{371} + return fileDescriptor_9198ee693835762e, []int{373} } func (m *AWSRAIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22073,7 +22169,7 @@ func (m *AWSRolesAnywhereProfileSyncConfig) Reset() { *m = AWSRolesAnywh func (m *AWSRolesAnywhereProfileSyncConfig) String() string { return proto.CompactTextString(m) } func (*AWSRolesAnywhereProfileSyncConfig) ProtoMessage() {} func (*AWSRolesAnywhereProfileSyncConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{372} + return fileDescriptor_9198ee693835762e, []int{374} } func (m *AWSRolesAnywhereProfileSyncConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22115,7 +22211,7 @@ func (m *AWSRAIntegrationStatusV1) Reset() { *m = AWSRAIntegrationStatus func (m *AWSRAIntegrationStatusV1) String() string { return proto.CompactTextString(m) } func (*AWSRAIntegrationStatusV1) ProtoMessage() {} func (*AWSRAIntegrationStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{373} + return fileDescriptor_9198ee693835762e, []int{375} } func (m *AWSRAIntegrationStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22169,7 +22265,7 @@ func (m *AWSRolesAnywhereProfileSyncIterationSummary) String() string { } func (*AWSRolesAnywhereProfileSyncIterationSummary) ProtoMessage() {} func (*AWSRolesAnywhereProfileSyncIterationSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{374} + return fileDescriptor_9198ee693835762e, []int{376} } func (m *AWSRolesAnywhereProfileSyncIterationSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22226,7 +22322,7 @@ func (m *HeadlessAuthentication) Reset() { *m = HeadlessAuthentication{} func (m *HeadlessAuthentication) String() string { return proto.CompactTextString(m) } func (*HeadlessAuthentication) ProtoMessage() {} func (*HeadlessAuthentication) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{375} + return fileDescriptor_9198ee693835762e, []int{377} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22283,7 +22379,7 @@ func (m *WatchKind) Reset() { *m = WatchKind{} } func (m *WatchKind) String() string { return proto.CompactTextString(m) } func (*WatchKind) ProtoMessage() {} func (*WatchKind) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{376} + return fileDescriptor_9198ee693835762e, []int{378} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22333,7 +22429,7 @@ func (m *WatchStatusV1) Reset() { *m = WatchStatusV1{} } func (m *WatchStatusV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusV1) ProtoMessage() {} func (*WatchStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{377} + return fileDescriptor_9198ee693835762e, []int{379} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22374,7 +22470,7 @@ func (m *WatchStatusSpecV1) Reset() { *m = WatchStatusSpecV1{} } func (m *WatchStatusSpecV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusSpecV1) ProtoMessage() {} func (*WatchStatusSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{378} + return fileDescriptor_9198ee693835762e, []int{380} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22424,7 +22520,7 @@ func (m *ServerInfoV1) Reset() { *m = ServerInfoV1{} } func (m *ServerInfoV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoV1) ProtoMessage() {} func (*ServerInfoV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{379} + return fileDescriptor_9198ee693835762e, []int{381} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22466,7 +22562,7 @@ func (m *ServerInfoSpecV1) Reset() { *m = ServerInfoSpecV1{} } func (m *ServerInfoSpecV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoSpecV1) ProtoMessage() {} func (*ServerInfoSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{380} + return fileDescriptor_9198ee693835762e, []int{382} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22523,7 +22619,7 @@ func (m *JamfSpecV1) Reset() { *m = JamfSpecV1{} } func (m *JamfSpecV1) String() string { return proto.CompactTextString(m) } func (*JamfSpecV1) ProtoMessage() {} func (*JamfSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{381} + return fileDescriptor_9198ee693835762e, []int{383} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22588,7 +22684,7 @@ func (m *JamfInventoryEntry) Reset() { *m = JamfInventoryEntry{} } func (m *JamfInventoryEntry) String() string { return proto.CompactTextString(m) } func (*JamfInventoryEntry) ProtoMessage() {} func (*JamfInventoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{382} + return fileDescriptor_9198ee693835762e, []int{384} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22645,7 +22741,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{383} + return fileDescriptor_9198ee693835762e, []int{385} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22709,7 +22805,7 @@ func (m *AWSMatcher) Reset() { *m = AWSMatcher{} } func (m *AWSMatcher) String() string { return proto.CompactTextString(m) } func (*AWSMatcher) ProtoMessage() {} func (*AWSMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{384} + return fileDescriptor_9198ee693835762e, []int{386} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22754,7 +22850,7 @@ func (m *AssumeRole) Reset() { *m = AssumeRole{} } func (m *AssumeRole) String() string { return proto.CompactTextString(m) } func (*AssumeRole) ProtoMessage() {} func (*AssumeRole) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{385} + return fileDescriptor_9198ee693835762e, []int{387} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22816,7 +22912,7 @@ func (m *InstallerParams) Reset() { *m = InstallerParams{} } func (m *InstallerParams) String() string { return proto.CompactTextString(m) } func (*InstallerParams) ProtoMessage() {} func (*InstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{386} + return fileDescriptor_9198ee693835762e, []int{388} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22859,7 +22955,7 @@ func (m *AWSSSM) Reset() { *m = AWSSSM{} } func (m *AWSSSM) String() string { return proto.CompactTextString(m) } func (*AWSSSM) ProtoMessage() {} func (*AWSSSM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{387} + return fileDescriptor_9198ee693835762e, []int{389} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22902,7 +22998,7 @@ func (m *AzureInstallerParams) Reset() { *m = AzureInstallerParams{} } func (m *AzureInstallerParams) String() string { return proto.CompactTextString(m) } func (*AzureInstallerParams) ProtoMessage() {} func (*AzureInstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{388} + return fileDescriptor_9198ee693835762e, []int{390} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22956,7 +23052,7 @@ func (m *AzureMatcher) Reset() { *m = AzureMatcher{} } func (m *AzureMatcher) String() string { return proto.CompactTextString(m) } func (*AzureMatcher) ProtoMessage() {} func (*AzureMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{389} + return fileDescriptor_9198ee693835762e, []int{391} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23011,7 +23107,7 @@ func (m *GCPMatcher) Reset() { *m = GCPMatcher{} } func (m *GCPMatcher) String() string { return proto.CompactTextString(m) } func (*GCPMatcher) ProtoMessage() {} func (*GCPMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{390} + return fileDescriptor_9198ee693835762e, []int{392} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23057,7 +23153,7 @@ func (m *KubernetesMatcher) Reset() { *m = KubernetesMatcher{} } func (m *KubernetesMatcher) String() string { return proto.CompactTextString(m) } func (*KubernetesMatcher) ProtoMessage() {} func (*KubernetesMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{391} + return fileDescriptor_9198ee693835762e, []int{393} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23099,7 +23195,7 @@ func (m *OktaOptions) Reset() { *m = OktaOptions{} } func (m *OktaOptions) String() string { return proto.CompactTextString(m) } func (*OktaOptions) ProtoMessage() {} func (*OktaOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{392} + return fileDescriptor_9198ee693835762e, []int{394} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23145,7 +23241,7 @@ func (m *AccessGraphSync) Reset() { *m = AccessGraphSync{} } func (m *AccessGraphSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphSync) ProtoMessage() {} func (*AccessGraphSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{393} + return fileDescriptor_9198ee693835762e, []int{395} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23190,7 +23286,7 @@ func (m *AccessGraphAWSSyncCloudTrailLogs) Reset() { *m = AccessGraphAWS func (m *AccessGraphAWSSyncCloudTrailLogs) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSyncCloudTrailLogs) ProtoMessage() {} func (*AccessGraphAWSSyncCloudTrailLogs) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{394} + return fileDescriptor_9198ee693835762e, []int{396} } func (m *AccessGraphAWSSyncCloudTrailLogs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23238,7 +23334,7 @@ func (m *AccessGraphAWSSync) Reset() { *m = AccessGraphAWSSync{} } func (m *AccessGraphAWSSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSync) ProtoMessage() {} func (*AccessGraphAWSSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{395} + return fileDescriptor_9198ee693835762e, []int{397} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23282,7 +23378,7 @@ func (m *AccessGraphAzureSync) Reset() { *m = AccessGraphAzureSync{} } func (m *AccessGraphAzureSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAzureSync) ProtoMessage() {} func (*AccessGraphAzureSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{396} + return fileDescriptor_9198ee693835762e, []int{398} } func (m *AccessGraphAzureSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23338,7 +23434,7 @@ func (m *TargetHealth) Reset() { *m = TargetHealth{} } func (m *TargetHealth) String() string { return proto.CompactTextString(m) } func (*TargetHealth) ProtoMessage() {} func (*TargetHealth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{397} + return fileDescriptor_9198ee693835762e, []int{399} } func (m *TargetHealth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23459,6 +23555,7 @@ func init() { proto.RegisterType((*AppIdentityCenter)(nil), "types.AppIdentityCenter") proto.RegisterType((*AppSpecV3)(nil), "types.AppSpecV3") proto.RegisterMapType((map[string]CommandLabelV2)(nil), "types.AppSpecV3.DynamicLabelsEntry") + proto.RegisterType((*MCP)(nil), "types.MCP") proto.RegisterType((*Rewrite)(nil), "types.Rewrite") proto.RegisterType((*Header)(nil), "types.Header") proto.RegisterType((*PortRange)(nil), "types.PortRange") @@ -23570,6 +23667,7 @@ func init() { proto.RegisterType((*RoleConditions)(nil), "types.RoleConditions") proto.RegisterType((*IdentityCenterAccountAssignment)(nil), "types.IdentityCenterAccountAssignment") proto.RegisterType((*GitHubPermission)(nil), "types.GitHubPermission") + proto.RegisterType((*MCPPermissions)(nil), "types.MCPPermissions") proto.RegisterType((*SPIFFERoleCondition)(nil), "types.SPIFFERoleCondition") proto.RegisterType((*DatabasePermission)(nil), "types.DatabasePermission") proto.RegisterType((*KubernetesResource)(nil), "types.KubernetesResource") @@ -23842,2085 +23940,2091 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 33233 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xfd, 0x7d, 0x70, 0x1c, 0x49, - 0x76, 0x18, 0x88, 0x4f, 0x77, 0xe3, 0xa3, 0xf1, 0xd0, 0x00, 0x1a, 0x09, 0x90, 0x04, 0x31, 0x1f, - 0xe0, 0xd4, 0xcc, 0x70, 0xc8, 0xf9, 0x20, 0x97, 0xe0, 0x0e, 0x77, 0x67, 0xe7, 0x6b, 0x1b, 0x68, - 0x90, 0x68, 0x12, 0x04, 0x7b, 0xaa, 0x01, 0x72, 0x47, 0xbb, 0xb3, 0xb5, 0x85, 0xee, 0x04, 0x50, - 0x83, 0xee, 0xaa, 0xde, 0xaa, 0x6a, 0x92, 0xd0, 0x5a, 0x3f, 0x4b, 0x96, 0xf6, 0x27, 0x2b, 0x74, - 0x92, 0x2c, 0x59, 0xb2, 0xd6, 0x17, 0xb6, 0xc2, 0x21, 0xdb, 0x77, 0x3e, 0x3b, 0xa4, 0xb0, 0x25, - 0xfb, 0xce, 0x17, 0x0a, 0xc9, 0xab, 0x3b, 0x5b, 0xd6, 0x39, 0x2e, 0x4e, 0x0a, 0xdb, 0xf7, 0xb5, - 0xa1, 0x80, 0xc2, 0xa7, 0x8b, 0xfb, 0x83, 0x11, 0x17, 0x27, 0xdd, 0x45, 0x5c, 0xc4, 0xad, 0x42, - 0xbe, 0x8b, 0x7c, 0x99, 0x59, 0x95, 0x59, 0x55, 0xdd, 0x68, 0xcc, 0x70, 0x64, 0x71, 0x43, 0xff, - 0x90, 0xe8, 0x97, 0xef, 0xbd, 0xac, 0xfc, 0x7e, 0xf9, 0xf2, 0x7d, 0xc0, 0xf3, 0x21, 0x6d, 0xd3, - 0xae, 0xe7, 0x87, 0x97, 0xdb, 0x74, 0xcf, 0x6e, 0x1e, 0x5e, 0x0e, 0x0f, 0xbb, 0x34, 0xe0, 0xff, - 0x5e, 0xea, 0xfa, 0x5e, 0xe8, 0x91, 0x51, 0xfc, 0xb1, 0x38, 0xbf, 0xe7, 0xed, 0x79, 0x08, 0xb9, - 0xcc, 0xfe, 0xe2, 0x85, 0x8b, 0xcf, 0xed, 0x79, 0xde, 0x5e, 0x9b, 0x5e, 0xc6, 0x5f, 0x3b, 0xbd, - 0xdd, 0xcb, 0xad, 0x9e, 0x6f, 0x87, 0x8e, 0xe7, 0x8a, 0xf2, 0xa5, 0x64, 0x79, 0xe8, 0x74, 0x68, - 0x10, 0xda, 0x9d, 0x6e, 0x3f, 0x06, 0x0f, 0x7c, 0xbb, 0xdb, 0xa5, 0xbe, 0xa8, 0x7d, 0xf1, 0x62, - 0xf4, 0x81, 0x76, 0x18, 0x32, 0x4a, 0xc6, 0xfc, 0xf2, 0xfd, 0x2b, 0xea, 0x4f, 0x81, 0x7a, 0xad, - 0x4f, 0x5b, 0xfc, 0x5e, 0x10, 0xd2, 0x96, 0xd5, 0xa2, 0xf7, 0x9d, 0x26, 0xb5, 0x7c, 0xfa, 0xf5, - 0x9e, 0xe3, 0xd3, 0x0e, 0x75, 0x43, 0x41, 0xf7, 0x7a, 0x36, 0x9d, 0xfc, 0x90, 0xc4, 0x17, 0x19, - 0xbf, 0x50, 0x80, 0x89, 0x5b, 0x94, 0x76, 0x2b, 0x6d, 0xe7, 0x3e, 0x25, 0x2f, 0xc0, 0xc8, 0xa6, - 0xdd, 0xa1, 0x0b, 0xb9, 0x73, 0xb9, 0x0b, 0x13, 0x2b, 0x33, 0x8f, 0x8e, 0x96, 0x26, 0x03, 0xea, - 0xdf, 0xa7, 0xbe, 0xe5, 0xda, 0x1d, 0x6a, 0x62, 0x21, 0x79, 0x15, 0x26, 0xd8, 0xff, 0x41, 0xd7, - 0x6e, 0xd2, 0x85, 0x3c, 0x62, 0x4e, 0x3d, 0x3a, 0x5a, 0x9a, 0x70, 0x25, 0xd0, 0x8c, 0xcb, 0x49, - 0x0d, 0xc6, 0xd7, 0x1e, 0x76, 0x1d, 0x9f, 0x06, 0x0b, 0x23, 0xe7, 0x72, 0x17, 0x26, 0x97, 0x17, - 0x2f, 0xf1, 0x3e, 0xba, 0x24, 0xfb, 0xe8, 0xd2, 0x96, 0xec, 0xc4, 0x95, 0xb9, 0xdf, 0x3e, 0x5a, - 0x7a, 0xea, 0xd1, 0xd1, 0xd2, 0x38, 0xe5, 0x24, 0x7f, 0xe5, 0xf7, 0x97, 0x72, 0xa6, 0xa4, 0x27, - 0x6f, 0xc3, 0xc8, 0xd6, 0x61, 0x97, 0x2e, 0x4c, 0x9c, 0xcb, 0x5d, 0x98, 0x5e, 0x7e, 0xee, 0x12, - 0x1f, 0xd6, 0xe8, 0xe3, 0xe3, 0xbf, 0x18, 0xd6, 0x4a, 0xf1, 0xd1, 0xd1, 0xd2, 0x08, 0x43, 0x31, - 0x91, 0x8a, 0xbc, 0x0e, 0x63, 0xeb, 0x5e, 0x10, 0xd6, 0xaa, 0x0b, 0x80, 0x9f, 0x7c, 0xea, 0xd1, - 0xd1, 0xd2, 0xec, 0xbe, 0x17, 0x84, 0x96, 0xd3, 0x7a, 0xcd, 0xeb, 0x38, 0x21, 0xed, 0x74, 0xc3, - 0x43, 0x53, 0x20, 0x19, 0x0f, 0x61, 0x4a, 0xe3, 0x47, 0x26, 0x61, 0x7c, 0x7b, 0xf3, 0xd6, 0xe6, - 0x9d, 0x7b, 0x9b, 0xe5, 0xa7, 0x48, 0x11, 0x46, 0x36, 0xef, 0x54, 0xd7, 0xca, 0x39, 0x32, 0x0e, - 0x85, 0x4a, 0xbd, 0x5e, 0xce, 0x93, 0x12, 0x14, 0xab, 0x95, 0xad, 0xca, 0x4a, 0xa5, 0xb1, 0x56, - 0x2e, 0x90, 0x39, 0x98, 0xb9, 0x57, 0xdb, 0xac, 0xde, 0xb9, 0xd7, 0xb0, 0xaa, 0x6b, 0x8d, 0x5b, - 0x5b, 0x77, 0xea, 0xe5, 0x11, 0x32, 0x0d, 0x70, 0x6b, 0x7b, 0x65, 0xcd, 0xdc, 0x5c, 0xdb, 0x5a, - 0x6b, 0x94, 0x47, 0xc9, 0x3c, 0x94, 0x25, 0x89, 0xd5, 0x58, 0x33, 0xef, 0xd6, 0x56, 0xd7, 0xca, - 0x63, 0x37, 0x47, 0x8a, 0x85, 0xf2, 0x88, 0x39, 0xbe, 0x41, 0xed, 0x80, 0xd6, 0xaa, 0xc6, 0xdf, - 0x2e, 0x40, 0xf1, 0x36, 0x0d, 0xed, 0x96, 0x1d, 0xda, 0xe4, 0x19, 0x6d, 0x7c, 0xb0, 0x89, 0xca, - 0xc0, 0xbc, 0x90, 0x1e, 0x98, 0xd1, 0x47, 0x47, 0x4b, 0xb9, 0xd7, 0xd5, 0x01, 0x79, 0x0b, 0x26, - 0xab, 0x34, 0x68, 0xfa, 0x4e, 0x97, 0x4d, 0xb6, 0x85, 0x02, 0xa2, 0x9d, 0x7d, 0x74, 0xb4, 0x74, - 0xaa, 0x15, 0x83, 0x95, 0x0e, 0x51, 0xb1, 0x49, 0x0d, 0xc6, 0x36, 0xec, 0x1d, 0xda, 0x0e, 0x16, - 0x46, 0xcf, 0x15, 0x2e, 0x4c, 0x2e, 0x3f, 0x2d, 0x06, 0x41, 0x7e, 0xe0, 0x25, 0x5e, 0xba, 0xe6, - 0x86, 0xfe, 0xe1, 0xca, 0xfc, 0xa3, 0xa3, 0xa5, 0x72, 0x1b, 0x01, 0x6a, 0x07, 0x73, 0x14, 0xd2, - 0x88, 0x27, 0xc6, 0xd8, 0xb1, 0x13, 0xe3, 0xd9, 0xdf, 0x3e, 0x5a, 0xca, 0xb1, 0x01, 0x13, 0x13, - 0x23, 0xe6, 0xa7, 0x4f, 0x91, 0x65, 0x28, 0x9a, 0xf4, 0xbe, 0x13, 0xb0, 0x96, 0x15, 0xb1, 0x65, - 0xa7, 0x1f, 0x1d, 0x2d, 0x11, 0x5f, 0xc0, 0x94, 0xcf, 0x88, 0xf0, 0x16, 0xdf, 0x84, 0x49, 0xe5, - 0xab, 0x49, 0x19, 0x0a, 0x07, 0xf4, 0x90, 0xf7, 0xb0, 0xc9, 0xfe, 0x24, 0xf3, 0x30, 0x7a, 0xdf, - 0x6e, 0xf7, 0x44, 0x97, 0x9a, 0xfc, 0xc7, 0x17, 0xf2, 0x9f, 0xcf, 0xdd, 0x1c, 0x29, 0x8e, 0x97, - 0x8b, 0x66, 0xbe, 0x56, 0x35, 0x7e, 0x66, 0x04, 0x8a, 0xa6, 0xc7, 0x17, 0x30, 0xb9, 0x08, 0xa3, - 0x8d, 0xd0, 0x0e, 0xe5, 0x30, 0xcd, 0x3d, 0x3a, 0x5a, 0x9a, 0x61, 0x8b, 0x9b, 0x2a, 0xf5, 0x73, - 0x0c, 0x86, 0x5a, 0xdf, 0xb7, 0x03, 0x39, 0x5c, 0x88, 0xda, 0x65, 0x00, 0x15, 0x15, 0x31, 0xc8, - 0x79, 0x18, 0xb9, 0xed, 0xb5, 0xa8, 0x18, 0x31, 0xf2, 0xe8, 0x68, 0x69, 0xba, 0xe3, 0xb5, 0x54, - 0x44, 0x2c, 0x27, 0xaf, 0xc1, 0xc4, 0x6a, 0xcf, 0xf7, 0xa9, 0xcb, 0xe6, 0xfa, 0x08, 0x22, 0x4f, - 0x3f, 0x3a, 0x5a, 0x82, 0x26, 0x07, 0x5a, 0x4e, 0xcb, 0x8c, 0x11, 0xd8, 0x30, 0x34, 0x42, 0xdb, - 0x0f, 0x69, 0x6b, 0x61, 0x74, 0xa8, 0x61, 0x60, 0xeb, 0x73, 0x36, 0xe0, 0x24, 0xc9, 0x61, 0x10, - 0x9c, 0xc8, 0x3a, 0x4c, 0xde, 0xf0, 0xed, 0x26, 0xad, 0x53, 0xdf, 0xf1, 0x5a, 0x38, 0xbe, 0x85, - 0x95, 0xf3, 0x8f, 0x8e, 0x96, 0x4e, 0xef, 0x31, 0xb0, 0xd5, 0x45, 0x78, 0x4c, 0xfd, 0xdd, 0xa3, - 0xa5, 0x62, 0x55, 0x6c, 0xb5, 0xa6, 0x4a, 0x4a, 0xbe, 0xc6, 0x06, 0x27, 0x08, 0xb1, 0x6b, 0x69, - 0x6b, 0x61, 0xfc, 0xd8, 0x4f, 0x34, 0xc4, 0x27, 0x9e, 0x6e, 0xdb, 0x41, 0x68, 0xf9, 0x9c, 0x2e, - 0xf1, 0x9d, 0x2a, 0x4b, 0x72, 0x07, 0x8a, 0x8d, 0xe6, 0x3e, 0x6d, 0xf5, 0xda, 0x14, 0xa7, 0xcc, - 0xe4, 0xf2, 0x19, 0x31, 0xa9, 0xe5, 0x78, 0xca, 0xe2, 0x95, 0x45, 0xc1, 0x9b, 0x04, 0x02, 0xa2, - 0xce, 0x27, 0x89, 0xf5, 0x85, 0xe2, 0xb7, 0xfe, 0xd6, 0xd2, 0x53, 0x3f, 0xf8, 0x7b, 0xe7, 0x9e, - 0x32, 0xfe, 0x8b, 0x3c, 0x94, 0x93, 0x4c, 0xc8, 0x2e, 0x4c, 0x6d, 0x77, 0x5b, 0x76, 0x48, 0x57, - 0xdb, 0x0e, 0x75, 0xc3, 0x00, 0x27, 0xc9, 0xe0, 0x36, 0xbd, 0x28, 0xea, 0x5d, 0xe8, 0x21, 0xa1, - 0xd5, 0xe4, 0x94, 0x89, 0x56, 0xe9, 0x6c, 0xe3, 0x7a, 0x1a, 0xb8, 0x81, 0x07, 0x38, 0xc3, 0x4e, - 0x56, 0x0f, 0xdf, 0xfa, 0xfb, 0xd4, 0x23, 0xd8, 0x8a, 0x09, 0xe4, 0xb6, 0x76, 0x0e, 0x71, 0x66, - 0x0e, 0x3f, 0x81, 0x18, 0x49, 0xc6, 0x04, 0x62, 0x60, 0xe3, 0x7f, 0xcd, 0xc1, 0xb4, 0x49, 0x03, - 0xaf, 0xe7, 0x37, 0xe9, 0x3a, 0xb5, 0x5b, 0xd4, 0x67, 0xd3, 0xff, 0x96, 0xe3, 0xb6, 0xc4, 0x9a, - 0xc2, 0xe9, 0x7f, 0xe0, 0xb8, 0xea, 0xd6, 0x8d, 0xe5, 0xe4, 0x33, 0x30, 0xde, 0xe8, 0xed, 0x20, - 0x6a, 0x3e, 0xde, 0x01, 0x82, 0xde, 0x8e, 0x95, 0x40, 0x97, 0x68, 0xe4, 0x32, 0x8c, 0xdf, 0xa5, - 0x7e, 0x10, 0xef, 0x86, 0x78, 0x34, 0xdc, 0xe7, 0x20, 0x95, 0x40, 0x60, 0x91, 0x1b, 0xf1, 0x8e, - 0x2c, 0x0e, 0xb5, 0x99, 0xc4, 0x3e, 0x18, 0x4f, 0x95, 0x8e, 0x80, 0xa8, 0x53, 0x45, 0x62, 0x19, - 0xff, 0x53, 0x1e, 0xca, 0x55, 0x3b, 0xb4, 0x77, 0xec, 0x40, 0xf4, 0xe7, 0xdd, 0xab, 0x6c, 0x8f, - 0x57, 0x1a, 0x8a, 0x7b, 0x3c, 0xfb, 0xf2, 0x8f, 0xdd, 0xbc, 0x97, 0x92, 0xcd, 0x9b, 0x64, 0x27, - 0xac, 0x68, 0x5e, 0xdc, 0xa8, 0x77, 0x8e, 0x6f, 0x54, 0x59, 0x34, 0xaa, 0x28, 0x1b, 0x15, 0x37, - 0x85, 0xbc, 0x03, 0x23, 0x8d, 0x2e, 0x6d, 0x8a, 0x4d, 0x44, 0x9e, 0x0b, 0x7a, 0xe3, 0x18, 0xc2, - 0xdd, 0xab, 0x2b, 0x25, 0xc1, 0x66, 0x24, 0xe8, 0xd2, 0xa6, 0x89, 0x64, 0x64, 0x0d, 0xc6, 0xd8, - 0x86, 0xd8, 0x93, 0x87, 0xc1, 0xb3, 0xd9, 0x0c, 0x10, 0xe5, 0xee, 0xd5, 0x95, 0x69, 0xc1, 0x62, - 0x2c, 0x40, 0x88, 0x29, 0x88, 0x95, 0xb5, 0xf7, 0x4f, 0x0b, 0x30, 0x9f, 0x55, 0xbb, 0xda, 0x1d, - 0x63, 0x03, 0xba, 0xe3, 0x02, 0x14, 0x99, 0x24, 0xc0, 0x4e, 0x57, 0xdc, 0x75, 0x26, 0x56, 0x4a, - 0xac, 0xe5, 0xfb, 0x02, 0x66, 0x46, 0xa5, 0xe4, 0x85, 0x48, 0xb0, 0x28, 0xc6, 0xfc, 0x84, 0x60, - 0x21, 0xc5, 0x09, 0x36, 0x65, 0xe4, 0x4e, 0x80, 0xf2, 0x47, 0xdc, 0xbb, 0x12, 0x1c, 0x4f, 0x19, - 0x5f, 0x40, 0xb4, 0xd3, 0x4a, 0x9e, 0x2d, 0x6b, 0x50, 0x94, 0xcd, 0x5a, 0x28, 0x21, 0xa3, 0xd9, - 0x44, 0x57, 0xdd, 0xbd, 0xca, 0xe7, 0x44, 0x4b, 0xfc, 0x56, 0xd9, 0x48, 0x1c, 0x72, 0x15, 0x8a, - 0x75, 0xdf, 0x7b, 0x78, 0x58, 0xab, 0x06, 0x0b, 0x53, 0xe7, 0x0a, 0x17, 0x26, 0x56, 0xce, 0x3c, - 0x3a, 0x5a, 0x9a, 0xeb, 0x32, 0x98, 0xe5, 0xb4, 0xd4, 0x03, 0x3b, 0x42, 0xbc, 0x39, 0x52, 0xcc, - 0x95, 0xf3, 0x37, 0x47, 0x8a, 0xf9, 0x72, 0x81, 0x4b, 0x29, 0x37, 0x47, 0x8a, 0x23, 0xe5, 0xd1, - 0x9b, 0x23, 0xc5, 0x51, 0x94, 0x5b, 0x26, 0xca, 0x70, 0x73, 0xa4, 0x38, 0x59, 0x2e, 0x69, 0x42, - 0x03, 0x32, 0x08, 0xbd, 0xa6, 0xd7, 0x36, 0x0b, 0xdb, 0x66, 0xcd, 0x1c, 0x5b, 0xad, 0xac, 0x52, - 0x3f, 0x34, 0x0b, 0x95, 0x7b, 0x0d, 0x73, 0xaa, 0x7a, 0xe8, 0xda, 0x1d, 0xa7, 0xc9, 0x4f, 0x60, - 0xb3, 0x70, 0x63, 0xb5, 0x6e, 0xb8, 0x70, 0x3a, 0x7b, 0xd8, 0xc9, 0x16, 0x94, 0xb6, 0x6c, 0x7f, - 0x8f, 0x86, 0xeb, 0xd4, 0x6e, 0x87, 0xfb, 0x0b, 0xd3, 0xd8, 0x01, 0x73, 0xa2, 0x03, 0xd4, 0xa2, - 0x95, 0xa7, 0x1f, 0x1d, 0x2d, 0x9d, 0x09, 0x11, 0x62, 0xed, 0x23, 0x48, 0x69, 0x92, 0xc6, 0xc5, - 0xa8, 0xc0, 0x74, 0xdc, 0x77, 0x1b, 0x4e, 0x10, 0x92, 0xcb, 0x30, 0x21, 0x21, 0x6c, 0x7f, 0x2e, - 0x64, 0xf6, 0xb2, 0x19, 0xe3, 0x18, 0xbf, 0x95, 0x07, 0x88, 0x4b, 0x9e, 0xd0, 0x25, 0xfc, 0x39, - 0x6d, 0x09, 0x9f, 0x4a, 0xae, 0xc0, 0xfe, 0x8b, 0xf7, 0xbd, 0xc4, 0xe2, 0x3d, 0x93, 0x24, 0x1d, - 0x7e, 0xd9, 0xfe, 0xc2, 0x78, 0x3c, 0x18, 0x62, 0xc1, 0x5e, 0x80, 0x68, 0x02, 0x89, 0x0e, 0xc5, - 0x95, 0xd8, 0x95, 0x93, 0x2a, 0x2a, 0x25, 0x67, 0x81, 0x4d, 0x30, 0xd1, 0xa9, 0xe3, 0x8f, 0x8e, - 0x96, 0x0a, 0x3d, 0xdf, 0xc1, 0x49, 0x47, 0x2e, 0x83, 0x98, 0x76, 0xa2, 0x03, 0xd9, 0x6c, 0x9f, - 0x6d, 0xda, 0x56, 0x93, 0xfa, 0x61, 0xdc, 0xe3, 0x0b, 0x39, 0x39, 0x3b, 0x49, 0x17, 0xf4, 0xa9, - 0xb9, 0x30, 0x82, 0xd3, 0xe0, 0x42, 0x66, 0xaf, 0x5c, 0xd2, 0x50, 0xb9, 0xf4, 0x7b, 0x4e, 0x1e, - 0xa6, 0x2d, 0x5e, 0x66, 0xa5, 0x24, 0x61, 0xbd, 0x02, 0x72, 0x15, 0xd8, 0x8a, 0x10, 0xbd, 0x0f, - 0xa2, 0x9e, 0xca, 0xbd, 0xc6, 0xca, 0x29, 0xc1, 0x69, 0xca, 0x7e, 0xa0, 0x92, 0x33, 0x6c, 0xf2, - 0x16, 0xb0, 0x25, 0x23, 0xfa, 0x9d, 0x08, 0xa2, 0x1b, 0xab, 0xf5, 0xd5, 0xb6, 0xd7, 0x6b, 0x35, - 0xde, 0xdf, 0x88, 0x89, 0xf7, 0x9a, 0x5d, 0x95, 0xf8, 0xc6, 0x6a, 0x9d, 0xbc, 0x05, 0xa3, 0x95, - 0xef, 0xef, 0xf9, 0x54, 0x88, 0x55, 0x25, 0x59, 0x27, 0x83, 0xad, 0x9c, 0x11, 0x84, 0x33, 0x36, - 0xfb, 0xa9, 0x8a, 0xa3, 0x58, 0xce, 0x6a, 0xde, 0xda, 0x68, 0x08, 0x91, 0x89, 0x24, 0xba, 0x65, - 0x6b, 0x43, 0xf9, 0xec, 0x50, 0x6b, 0x35, 0xa3, 0x22, 0x97, 0x21, 0x5f, 0xa9, 0xe2, 0x45, 0x6e, - 0x72, 0x79, 0x42, 0x56, 0x5b, 0x5d, 0x99, 0x17, 0x24, 0x25, 0x5b, 0x5d, 0x06, 0xf9, 0x4a, 0x95, - 0xac, 0xc0, 0xe8, 0xed, 0xc3, 0xc6, 0xfb, 0x1b, 0x62, 0xf3, 0x94, 0x4b, 0x1e, 0x61, 0x77, 0x70, - 0x9b, 0x09, 0xe2, 0x2f, 0xee, 0x1c, 0x06, 0x5f, 0x6f, 0xab, 0x5f, 0x8c, 0x68, 0xa4, 0x0e, 0x13, - 0x95, 0x56, 0xc7, 0x71, 0xb7, 0x03, 0xea, 0x2f, 0x4c, 0x22, 0x9f, 0x85, 0xc4, 0x77, 0x47, 0xe5, - 0x2b, 0x0b, 0x8f, 0x8e, 0x96, 0xe6, 0x6d, 0xf6, 0xd3, 0xea, 0x05, 0xd4, 0x57, 0xb8, 0xc5, 0x4c, - 0x48, 0x1d, 0xe0, 0xb6, 0xe7, 0xee, 0x79, 0x95, 0xb0, 0x6d, 0x07, 0x89, 0xed, 0x38, 0x2e, 0x88, - 0xa4, 0x9e, 0x53, 0x1d, 0x06, 0xb3, 0x6c, 0x06, 0x54, 0x18, 0x2a, 0x3c, 0xc8, 0x75, 0x18, 0xbb, - 0xe3, 0xdb, 0xcd, 0x36, 0x5d, 0x98, 0x42, 0x6e, 0xf3, 0x82, 0x1b, 0x07, 0xca, 0x96, 0x2e, 0x08, - 0x86, 0x65, 0x0f, 0xc1, 0xea, 0xed, 0x8a, 0x23, 0x2e, 0xde, 0x03, 0x92, 0x9e, 0x93, 0x19, 0x77, - 0x9b, 0x57, 0xd5, 0xbb, 0x4d, 0xbc, 0xe8, 0x57, 0xbd, 0x4e, 0xc7, 0x76, 0x5b, 0x48, 0x7b, 0x77, - 0x59, 0xb9, 0xf2, 0x18, 0x5f, 0x87, 0xd9, 0x54, 0x67, 0x1d, 0x73, 0x2d, 0x7d, 0x17, 0x66, 0xaa, - 0x74, 0xd7, 0xee, 0xb5, 0xc3, 0xe8, 0xe4, 0xe2, 0x4b, 0x14, 0x2f, 0x88, 0x2d, 0x5e, 0x64, 0xc9, - 0xe3, 0xca, 0x4c, 0x22, 0x1b, 0xef, 0xc0, 0x94, 0xd6, 0x7c, 0x76, 0xc3, 0xa9, 0xf4, 0x5a, 0x4e, - 0x88, 0x03, 0x99, 0x8b, 0x6f, 0x38, 0x36, 0x03, 0xe2, 0x70, 0x99, 0x31, 0x82, 0xf1, 0x77, 0x54, - 0x21, 0x4b, 0x9e, 0x24, 0xaf, 0x47, 0xfb, 0x41, 0x2e, 0x16, 0xf9, 0x52, 0xfb, 0x41, 0xb4, 0x1b, - 0x5c, 0xe4, 0x6b, 0x33, 0x9f, 0x5a, 0x9b, 0x93, 0x62, 0x24, 0x0a, 0xf6, 0x83, 0x80, 0xaf, 0xc8, - 0x68, 0xa6, 0x16, 0x3e, 0xfe, 0x4c, 0x7d, 0x0f, 0x4a, 0xb7, 0x6d, 0xd7, 0xde, 0xa3, 0x2d, 0xd6, - 0x02, 0xbe, 0xf7, 0x4c, 0xf0, 0x23, 0xad, 0xc3, 0xe1, 0xd8, 0x4a, 0x75, 0x12, 0x69, 0x04, 0xe4, - 0x8a, 0x5c, 0xd9, 0xa3, 0x19, 0x2b, 0x7b, 0x4a, 0xd4, 0x3e, 0x8a, 0x2b, 0x5b, 0xac, 0x67, 0xe3, - 0xdb, 0x13, 0xd8, 0x46, 0xf2, 0x1a, 0x8c, 0x99, 0x74, 0x8f, 0x1d, 0x35, 0xb9, 0x78, 0x90, 0x7c, - 0x84, 0xa8, 0x1d, 0xc3, 0x71, 0x50, 0xae, 0xa1, 0xad, 0x60, 0xdf, 0xd9, 0x0d, 0x45, 0xef, 0x44, - 0x72, 0x8d, 0x00, 0x2b, 0x72, 0x8d, 0x80, 0xe8, 0xb7, 0x70, 0x0e, 0x63, 0xbb, 0x9f, 0x59, 0x6d, - 0x88, 0x4e, 0x93, 0x3d, 0x6c, 0x56, 0x95, 0x6d, 0xc4, 0xd7, 0xa4, 0x12, 0x86, 0x4d, 0xae, 0xc1, - 0x44, 0xa5, 0xd9, 0xf4, 0x7a, 0xca, 0x55, 0x97, 0xaf, 0x5b, 0x0e, 0xd4, 0x35, 0x3b, 0x31, 0x2a, - 0x69, 0xc0, 0xe4, 0x1a, 0xbb, 0x1f, 0x3a, 0xab, 0x76, 0x73, 0x5f, 0x76, 0x92, 0xdc, 0xc3, 0x94, - 0x92, 0x78, 0xe5, 0x52, 0x04, 0x36, 0x19, 0x50, 0xd5, 0x8d, 0x28, 0xb8, 0x64, 0x0b, 0x26, 0x1b, - 0xb4, 0xe9, 0xd3, 0xb0, 0x11, 0x7a, 0x3e, 0x4d, 0x6c, 0xc9, 0x4a, 0xc9, 0xca, 0x73, 0xf2, 0x8a, - 0x1a, 0x20, 0xd0, 0x0a, 0x18, 0x54, 0xe5, 0xaa, 0x20, 0xf3, 0xbb, 0x46, 0xc7, 0xf3, 0x0f, 0xab, - 0x2b, 0x62, 0x9b, 0x8e, 0xcf, 0x74, 0x0e, 0x56, 0xef, 0x1a, 0x0c, 0xd2, 0xda, 0xd1, 0xef, 0x1a, - 0x1c, 0x0b, 0x47, 0xaa, 0xda, 0x40, 0x59, 0x4e, 0x6c, 0xda, 0x33, 0x71, 0x2f, 0x23, 0x58, 0x19, - 0xa9, 0x56, 0x80, 0x92, 0xa0, 0x36, 0x52, 0x02, 0x8b, 0x74, 0x81, 0xc8, 0x51, 0xe3, 0xe2, 0x59, - 0x9b, 0x06, 0x81, 0xd8, 0xcb, 0xcf, 0x26, 0x06, 0x3f, 0x46, 0x58, 0x79, 0x49, 0x30, 0x7f, 0x56, - 0x4e, 0x03, 0x71, 0xbd, 0x64, 0x85, 0x4a, 0x3d, 0x19, 0xbc, 0xc9, 0x9b, 0x00, 0x6b, 0x0f, 0x43, - 0xea, 0xbb, 0x76, 0x3b, 0x52, 0xdf, 0xa1, 0xc6, 0x8a, 0x0a, 0xa8, 0x3e, 0xd0, 0x0a, 0x32, 0x59, - 0x85, 0xa9, 0x4a, 0x10, 0xf4, 0x3a, 0xd4, 0xf4, 0xda, 0xb4, 0x62, 0x6e, 0xe2, 0xbe, 0x3f, 0xb1, - 0xf2, 0xec, 0xa3, 0xa3, 0xa5, 0xb3, 0x36, 0x16, 0x58, 0xbe, 0xd7, 0xa6, 0x96, 0xed, 0xab, 0xb3, - 0x5b, 0xa7, 0x21, 0x77, 0x00, 0xee, 0x74, 0xa9, 0xdb, 0xa0, 0xb6, 0xdf, 0xdc, 0x4f, 0x6c, 0xf3, - 0x71, 0xc1, 0xca, 0x33, 0xa2, 0x85, 0xf3, 0x5e, 0x97, 0xba, 0x01, 0xc2, 0xd4, 0xaf, 0x8a, 0x31, - 0xc9, 0x3d, 0x98, 0xa9, 0x55, 0x6e, 0xd7, 0xbd, 0xb6, 0xd3, 0x3c, 0x14, 0x92, 0xd3, 0x34, 0x2a, - 0x35, 0x4f, 0x0b, 0xae, 0x89, 0x52, 0xbe, 0x3d, 0x39, 0x76, 0xc7, 0xea, 0x22, 0xd4, 0x12, 0xf2, - 0x53, 0x92, 0x0b, 0xf9, 0x80, 0xcd, 0xc1, 0x80, 0x09, 0x83, 0x5b, 0xf6, 0x5e, 0xb0, 0x30, 0xa3, - 0x29, 0xe9, 0x2a, 0xf7, 0x1a, 0x97, 0x94, 0x52, 0x2e, 0xa6, 0x2c, 0xf2, 0x89, 0x88, 0x50, 0x2b, - 0xb4, 0xf7, 0x02, 0x7d, 0x22, 0x46, 0xd8, 0xe4, 0x26, 0x40, 0xd5, 0x6b, 0xf6, 0x3a, 0xd4, 0x0d, - 0xab, 0x2b, 0x0b, 0x65, 0xfd, 0xea, 0x11, 0x15, 0xc4, 0x5b, 0x5b, 0xcb, 0x6b, 0x6a, 0x33, 0x51, - 0xa1, 0x5e, 0x7c, 0x17, 0xca, 0xc9, 0x0f, 0x39, 0xa1, 0xde, 0x6d, 0xaa, 0x3c, 0xad, 0xb4, 0x7e, - 0xed, 0xa1, 0x13, 0x84, 0x81, 0xf1, 0x0d, 0x6d, 0x05, 0xb2, 0xdd, 0xe1, 0x16, 0x3d, 0xac, 0xfb, - 0x74, 0xd7, 0x79, 0x28, 0x36, 0x33, 0xdc, 0x1d, 0x0e, 0xe8, 0xa1, 0xd5, 0x45, 0xa8, 0xba, 0x3b, - 0x44, 0xa8, 0xe4, 0xb3, 0x50, 0xbc, 0x75, 0xbb, 0x71, 0x8b, 0x1e, 0xd6, 0xaa, 0xe2, 0xa0, 0xe2, - 0x64, 0x9d, 0xc0, 0x62, 0xa4, 0xda, 0x5c, 0x8b, 0x30, 0x8d, 0x95, 0x78, 0x27, 0x64, 0x35, 0xaf, - 0xb6, 0x7b, 0x41, 0x48, 0xfd, 0x5a, 0x55, 0xad, 0xb9, 0xc9, 0x81, 0x89, 0x7d, 0x29, 0x42, 0x35, - 0xfe, 0xdf, 0x3c, 0xee, 0x82, 0x6c, 0xc2, 0xd7, 0xdc, 0x20, 0xb4, 0xdd, 0x26, 0x8d, 0x18, 0xe0, - 0x84, 0x77, 0x04, 0x34, 0x31, 0xe1, 0x63, 0x64, 0xbd, 0xea, 0xfc, 0xd0, 0x55, 0xb3, 0x2a, 0xa5, - 0xc2, 0xa5, 0x56, 0x55, 0xb5, 0xc2, 0xbe, 0x80, 0x26, 0xaa, 0x8c, 0x91, 0xc9, 0x79, 0x18, 0xaf, - 0x55, 0x6e, 0x57, 0x7a, 0xe1, 0x3e, 0xee, 0xc1, 0x45, 0x2e, 0x9f, 0xb3, 0xd9, 0x6a, 0xf7, 0xc2, - 0x7d, 0x53, 0x16, 0x92, 0xcb, 0x78, 0xef, 0x71, 0x69, 0xc8, 0xb5, 0xc7, 0xe2, 0xd0, 0x0d, 0x38, - 0x28, 0x71, 0xed, 0x61, 0x20, 0xf2, 0x0a, 0x8c, 0xde, 0xad, 0xaf, 0xd6, 0xaa, 0xe2, 0xa2, 0x8e, - 0x27, 0xd1, 0xfd, 0x6e, 0x53, 0xff, 0x12, 0x8e, 0x42, 0xd6, 0x60, 0xba, 0x41, 0x9b, 0x3d, 0xdf, - 0x09, 0x0f, 0x6f, 0xf8, 0x5e, 0xaf, 0x1b, 0x2c, 0x8c, 0x63, 0x1d, 0xb8, 0xd2, 0x03, 0x51, 0x62, - 0xed, 0x61, 0x91, 0x42, 0x9d, 0x20, 0x32, 0x7e, 0x33, 0x17, 0x6f, 0x93, 0xe4, 0xbc, 0x26, 0xd6, - 0xa0, 0xca, 0x89, 0x89, 0x35, 0xaa, 0xca, 0x09, 0x05, 0x1c, 0x13, 0xc8, 0x6a, 0x2f, 0x08, 0xbd, - 0xce, 0x9a, 0xdb, 0xea, 0x7a, 0x8e, 0x1b, 0x22, 0x15, 0xef, 0x7c, 0xe3, 0xd1, 0xd1, 0xd2, 0x73, - 0x4d, 0x2c, 0xb5, 0xa8, 0x28, 0xb6, 0x12, 0x5c, 0x32, 0xa8, 0x3f, 0xc1, 0x78, 0x18, 0xff, 0x2a, - 0xaf, 0x1d, 0x6f, 0xec, 0xf3, 0x4c, 0xda, 0x6d, 0x3b, 0x4d, 0xd4, 0x20, 0x60, 0x43, 0xa3, 0x59, - 0x85, 0x9f, 0xe7, 0xc7, 0xa5, 0xbc, 0x87, 0x74, 0xde, 0x19, 0xd4, 0xe4, 0x8b, 0x50, 0x62, 0x92, - 0x86, 0xf8, 0x19, 0x2c, 0xe4, 0xb1, 0xb3, 0x9f, 0x41, 0xe5, 0x61, 0x40, 0xfd, 0x88, 0x8d, 0x26, - 0xa2, 0xa8, 0x14, 0xa4, 0x05, 0x0b, 0x5b, 0xbe, 0xed, 0x06, 0x4e, 0xb8, 0xe6, 0x36, 0xfd, 0x43, - 0x94, 0x8c, 0xd6, 0x5c, 0x7b, 0xa7, 0x4d, 0x5b, 0xd8, 0xdc, 0xe2, 0xca, 0x85, 0x47, 0x47, 0x4b, - 0x2f, 0x86, 0x1c, 0xc7, 0xa2, 0x11, 0x92, 0x45, 0x39, 0x96, 0xc2, 0xb9, 0x2f, 0x27, 0x26, 0x49, - 0xc9, 0x6e, 0xc5, 0xb7, 0x23, 0x2e, 0x24, 0xa0, 0x24, 0x15, 0x8d, 0x06, 0xdb, 0xc3, 0xd4, 0xcf, - 0x54, 0x09, 0x8c, 0xff, 0x3b, 0x17, 0x1f, 0xc0, 0xe4, 0x6d, 0x98, 0x14, 0x2b, 0x46, 0x99, 0x17, - 0xb8, 0x83, 0xca, 0xe5, 0x95, 0x18, 0x59, 0x15, 0x9d, 0xdd, 0xfb, 0x2b, 0xab, 0x1b, 0xca, 0xdc, - 0xc0, 0x7b, 0xbf, 0xdd, 0x6c, 0x27, 0xa9, 0x24, 0x1a, 0x9b, 0x04, 0x5b, 0x1b, 0x0d, 0xbd, 0x57, - 0x70, 0x12, 0x84, 0xed, 0x20, 0xa3, 0x1b, 0x14, 0xe4, 0x4f, 0xde, 0xf0, 0xff, 0x31, 0x97, 0x75, - 0xce, 0x93, 0x15, 0x98, 0xba, 0xe7, 0xf9, 0x07, 0x38, 0xbe, 0x4a, 0x27, 0xe0, 0xc8, 0x3f, 0x90, - 0x05, 0xc9, 0x06, 0xe9, 0x24, 0xea, 0xb7, 0x29, 0xbd, 0xa1, 0x7f, 0x5b, 0x82, 0x83, 0x46, 0xc0, - 0xc6, 0x21, 0xe2, 0x18, 0xad, 0x0e, 0x1c, 0x87, 0xf8, 0x13, 0xb4, 0x29, 0xac, 0xa2, 0x1b, 0xbf, - 0x9e, 0x53, 0xcf, 0x73, 0xd6, 0xc9, 0x55, 0xaf, 0x63, 0x3b, 0xae, 0xd2, 0x1c, 0xfe, 0x1e, 0x86, - 0xd0, 0xe4, 0x97, 0x28, 0xc8, 0xe4, 0x2a, 0x14, 0xf9, 0xaf, 0x68, 0xaf, 0x45, 0x2d, 0x9a, 0x20, - 0xd4, 0x0f, 0x0a, 0x89, 0x98, 0x1a, 0x99, 0xc2, 0x49, 0x47, 0xe6, 0xdb, 0x39, 0xf5, 0x28, 0xfe, - 0xb8, 0x87, 0x4d, 0xe2, 0x90, 0xc9, 0x9f, 0xe4, 0x90, 0xf9, 0xc4, 0x4d, 0xf8, 0xc1, 0x1c, 0x4c, - 0x2a, 0x5a, 0x0a, 0xd6, 0x86, 0xba, 0xef, 0x7d, 0x44, 0x9b, 0xa1, 0xde, 0x86, 0x2e, 0x07, 0x26, - 0xda, 0x10, 0xa1, 0x7e, 0x82, 0x36, 0x18, 0x7f, 0x94, 0x13, 0x77, 0xa4, 0xa1, 0xb7, 0x79, 0x7d, - 0x4b, 0xce, 0x9f, 0xe4, 0x88, 0xfc, 0x22, 0x8c, 0x9a, 0xb4, 0xe5, 0x04, 0xe2, 0x7e, 0x33, 0xab, - 0xde, 0xc7, 0xb0, 0x20, 0x96, 0x9b, 0x7c, 0xf6, 0x53, 0x3d, 0xdf, 0xb0, 0x9c, 0x09, 0xb2, 0xb5, - 0xe0, 0x7a, 0x9b, 0x3e, 0x74, 0xf8, 0x62, 0x14, 0x47, 0x2d, 0x1e, 0x6f, 0x4e, 0x60, 0xed, 0xb2, - 0x12, 0x21, 0x51, 0xab, 0x0b, 0x4f, 0xa3, 0x31, 0x3e, 0x00, 0x88, 0xab, 0x24, 0xb7, 0xa0, 0x2c, - 0x66, 0x83, 0xe3, 0xee, 0x71, 0x41, 0x4a, 0xf4, 0xc1, 0xd2, 0xa3, 0xa3, 0xa5, 0xa7, 0x9b, 0x51, - 0x99, 0x90, 0x3a, 0x15, 0xbe, 0x29, 0x42, 0xe3, 0x7f, 0x2b, 0x40, 0xbe, 0x82, 0x03, 0x72, 0x8b, - 0x1e, 0x86, 0xf6, 0xce, 0x75, 0xa7, 0xad, 0x2d, 0xa6, 0x03, 0x84, 0x5a, 0xbb, 0x8e, 0xa6, 0xae, - 0x50, 0x90, 0xd9, 0x62, 0xba, 0xe5, 0xef, 0xbc, 0x81, 0x84, 0xca, 0x62, 0x3a, 0xf0, 0x77, 0xde, - 0x48, 0x92, 0x45, 0x88, 0xc4, 0x80, 0x31, 0xbe, 0xb0, 0xc4, 0x1c, 0x84, 0x47, 0x47, 0x4b, 0x63, - 0x7c, 0xfd, 0x99, 0xa2, 0x84, 0x9c, 0x85, 0x42, 0xa3, 0xbe, 0x29, 0x76, 0x40, 0x54, 0x0b, 0x06, - 0x5d, 0xd7, 0x64, 0x30, 0x56, 0xe7, 0x46, 0xb5, 0x52, 0x47, 0x45, 0xc0, 0x68, 0x5c, 0x67, 0xbb, - 0x65, 0x77, 0x93, 0xaa, 0x80, 0x08, 0x91, 0xbc, 0x03, 0x93, 0xb7, 0xaa, 0xab, 0xeb, 0x5e, 0xc0, - 0x77, 0xaf, 0xb1, 0x78, 0xf2, 0x1f, 0xb4, 0x9a, 0x16, 0x6a, 0xfe, 0x93, 0xc7, 0x80, 0x82, 0x4f, - 0x2c, 0x38, 0xcd, 0x58, 0xb1, 0x21, 0x71, 0x9a, 0x54, 0x5c, 0x4a, 0x37, 0xe3, 0x77, 0x86, 0x97, - 0x1f, 0x1d, 0x2d, 0xbd, 0x80, 0x5f, 0x10, 0x70, 0x14, 0x4b, 0x5e, 0x67, 0x13, 0x5c, 0xfb, 0xb0, - 0x21, 0x5f, 0x81, 0x53, 0xe9, 0x92, 0x46, 0xf4, 0x3e, 0x71, 0xfe, 0xd1, 0xd1, 0x92, 0x91, 0xc9, - 0x3f, 0xd0, 0xe6, 0x6f, 0x36, 0x13, 0xe3, 0x9b, 0x79, 0x98, 0x54, 0xd4, 0x7c, 0xe4, 0xb3, 0xe2, - 0x59, 0x3a, 0xa7, 0x5d, 0x60, 0x14, 0x0c, 0x56, 0xca, 0x75, 0x42, 0x1d, 0xaf, 0x45, 0xc5, 0x23, - 0x75, 0xac, 0x7f, 0xc9, 0x0f, 0xa3, 0x7f, 0x79, 0x13, 0x80, 0x4f, 0x61, 0xec, 0x27, 0x45, 0x1a, - 0x52, 0xac, 0x53, 0xd4, 0x69, 0x15, 0x23, 0x93, 0xbb, 0x30, 0xb7, 0xe5, 0xf7, 0x82, 0xb0, 0x71, - 0x18, 0x84, 0xb4, 0xc3, 0xb8, 0xd5, 0x3d, 0xaf, 0x2d, 0x96, 0xcf, 0x8b, 0x8f, 0x8e, 0x96, 0xce, - 0xa1, 0x49, 0x8d, 0x15, 0x60, 0x39, 0x7e, 0x80, 0xd5, 0xf5, 0x3c, 0x55, 0x2b, 0x93, 0xc5, 0xc0, - 0x30, 0xa1, 0xa4, 0xea, 0x74, 0xd8, 0xc1, 0x28, 0x9e, 0xf0, 0x84, 0xa6, 0x5e, 0x39, 0x18, 0xc5, - 0x57, 0xa6, 0x9f, 0x14, 0x75, 0x12, 0xe3, 0xb3, 0xaa, 0x3e, 0x71, 0xd8, 0x7d, 0xc9, 0xf8, 0x4b, - 0xb9, 0x78, 0x17, 0xbc, 0x7b, 0x85, 0xbc, 0x05, 0x63, 0xfc, 0xc9, 0x54, 0xbc, 0x2c, 0x9f, 0x8a, - 0xee, 0xe4, 0xea, 0x7b, 0x2a, 0x57, 0xe4, 0xff, 0x2e, 0x37, 0xab, 0x78, 0xca, 0x14, 0x24, 0xd1, - 0x1b, 0x80, 0xae, 0x0e, 0x94, 0xdc, 0x51, 0xdb, 0x7d, 0x25, 0xeb, 0x0d, 0xc0, 0xf8, 0x17, 0xa3, - 0x30, 0xad, 0xa3, 0xa9, 0xef, 0xaa, 0xb9, 0xa1, 0xde, 0x55, 0xbf, 0x08, 0x45, 0x31, 0xdf, 0xa4, - 0x40, 0xf9, 0x22, 0xbe, 0x8c, 0x08, 0x98, 0x66, 0x2f, 0x00, 0x7c, 0x38, 0xd8, 0x15, 0xdd, 0x8c, - 0xa8, 0xc8, 0xb2, 0xf2, 0x6a, 0x57, 0x88, 0x65, 0x2c, 0xf9, 0x6a, 0xa7, 0x2e, 0xe7, 0xe8, 0xfd, - 0xee, 0x75, 0x18, 0x63, 0xd7, 0x93, 0x48, 0x83, 0x84, 0x5f, 0xc9, 0x6e, 0x2e, 0x09, 0xc3, 0x20, - 0x8e, 0x44, 0xee, 0x41, 0x71, 0xc3, 0x0e, 0xc2, 0x06, 0xa5, 0xee, 0x10, 0x16, 0x13, 0x4b, 0xa2, - 0xab, 0xe6, 0xd0, 0x1c, 0x21, 0xa0, 0xd4, 0x4d, 0x3c, 0x79, 0x47, 0xcc, 0xc8, 0x87, 0x00, 0xab, - 0x9e, 0x1b, 0xfa, 0x5e, 0x7b, 0xc3, 0xdb, 0x5b, 0x18, 0xc3, 0xab, 0xfb, 0x73, 0x89, 0x01, 0x88, - 0x11, 0xf8, 0xed, 0x3d, 0xd2, 0x4f, 0x35, 0x79, 0x81, 0xd5, 0xf6, 0xf6, 0xd4, 0x75, 0x10, 0xe3, - 0x93, 0xeb, 0x50, 0x96, 0x7a, 0x91, 0xed, 0xee, 0x9e, 0x8f, 0x13, 0x64, 0x3c, 0x16, 0x9c, 0xe8, - 0xc3, 0xd0, 0xea, 0x09, 0xb8, 0xba, 0xd1, 0x27, 0x69, 0xc8, 0x57, 0xe0, 0x4c, 0x12, 0x26, 0x47, - 0xb9, 0x18, 0x5f, 0x29, 0x54, 0x76, 0x19, 0xf3, 0xbe, 0x1f, 0x0b, 0x72, 0x03, 0x66, 0x58, 0x87, - 0xdc, 0xa6, 0x76, 0xd0, 0xe3, 0x66, 0x6d, 0x42, 0xb3, 0x24, 0x1f, 0x84, 0xc5, 0x2a, 0x6c, 0x7b, - 0xcd, 0x03, 0x05, 0xc9, 0x4c, 0x52, 0x91, 0x6b, 0x30, 0xc9, 0xed, 0x14, 0xfc, 0x9a, 0xbb, 0xeb, - 0x89, 0x67, 0x03, 0xa9, 0x4d, 0x17, 0x25, 0x77, 0x97, 0x59, 0x99, 0xa9, 0x22, 0x1a, 0x47, 0x79, - 0x38, 0x9d, 0x5d, 0x07, 0xf9, 0x8b, 0x70, 0x4a, 0xf4, 0x67, 0x9b, 0xfa, 0x0a, 0xce, 0x10, 0x16, - 0x1c, 0xaf, 0x8b, 0x71, 0x7a, 0xbe, 0x19, 0x31, 0x88, 0x36, 0x1c, 0xc6, 0x22, 0x31, 0x29, 0xb2, - 0xeb, 0x21, 0x5f, 0x83, 0x49, 0xb5, 0xda, 0xfc, 0xf0, 0xc6, 0x30, 0x03, 0xea, 0x52, 0x59, 0x12, - 0x1b, 0x66, 0x4c, 0xfa, 0xf5, 0x1e, 0x0d, 0x42, 0x69, 0x8e, 0x23, 0x24, 0x96, 0xb3, 0xa9, 0x5a, - 0x24, 0x42, 0xa4, 0xf6, 0x2a, 0xfb, 0x9c, 0xd2, 0x92, 0x46, 0x93, 0xdf, 0x62, 0xec, 0x93, 0xfc, - 0x8c, 0xef, 0xe6, 0xe1, 0x4c, 0x9f, 0xe9, 0xcc, 0x76, 0x3c, 0x94, 0x27, 0x95, 0x1d, 0x2f, 0x21, - 0x46, 0x72, 0x5b, 0xbe, 0x73, 0x90, 0x17, 0x12, 0xd8, 0xc8, 0x4a, 0xf9, 0xd1, 0xd1, 0x52, 0x49, - 0x5b, 0xa9, 0xf9, 0x5a, 0x95, 0xdc, 0x84, 0x11, 0xd6, 0x0d, 0x43, 0x98, 0xa4, 0x48, 0xa5, 0xe7, - 0x74, 0xe8, 0xa8, 0x1b, 0x04, 0xf6, 0x0d, 0xf2, 0x20, 0x9f, 0x85, 0xc2, 0xd6, 0xd6, 0x06, 0xee, - 0x0e, 0x05, 0x9c, 0xdd, 0x53, 0x61, 0xd8, 0xd6, 0x36, 0xa3, 0x29, 0x46, 0x1b, 0xf5, 0x88, 0xc9, - 0xd0, 0xc9, 0x97, 0x12, 0xa6, 0x72, 0xaf, 0x0c, 0x5e, 0xca, 0xc3, 0x5b, 0xce, 0x7d, 0x02, 0x83, - 0x35, 0xe3, 0x27, 0x72, 0xd2, 0x2a, 0x48, 0x4c, 0x7e, 0x72, 0x4e, 0xae, 0x13, 0xbc, 0x98, 0x0b, - 0x2e, 0x2a, 0x88, 0x3c, 0x07, 0xc0, 0x7f, 0x6e, 0x6f, 0x8b, 0x4e, 0x2f, 0x99, 0x0a, 0x84, 0x7c, - 0x21, 0x62, 0x29, 0x54, 0x99, 0x05, 0x94, 0x04, 0x12, 0x6b, 0x8d, 0x97, 0x99, 0x3a, 0xaa, 0xf1, - 0x1b, 0xf9, 0xf8, 0xd4, 0xb8, 0xee, 0xb4, 0x43, 0xea, 0x93, 0x45, 0x7e, 0x08, 0xc4, 0xb7, 0x19, - 0x33, 0xfa, 0x4d, 0x16, 0xe2, 0x13, 0x85, 0x37, 0x2d, 0x3a, 0x3a, 0x5e, 0x51, 0x8e, 0x8e, 0x02, - 0x1e, 0x1d, 0xd3, 0x7d, 0x0f, 0x89, 0x57, 0x32, 0x76, 0x42, 0xdc, 0xfa, 0x33, 0x76, 0xbb, 0x17, - 0x61, 0x6a, 0xd3, 0x5b, 0x7b, 0x18, 0x46, 0x88, 0x6c, 0xcb, 0x2f, 0x9a, 0x3a, 0x90, 0x71, 0xbc, - 0xd3, 0x6e, 0x51, 0x7f, 0x6b, 0xdf, 0x76, 0x35, 0xe3, 0x12, 0x33, 0x05, 0x67, 0xb8, 0x9b, 0xf4, - 0x81, 0x8e, 0x3b, 0xce, 0x71, 0x93, 0xf0, 0xe4, 0xe0, 0x14, 0x53, 0x83, 0x63, 0xfc, 0x50, 0x5e, - 0x76, 0xd7, 0xdd, 0xe5, 0x27, 0xd4, 0xec, 0xe0, 0x0d, 0xcd, 0xec, 0x60, 0x2e, 0x7a, 0x30, 0x89, - 0x6c, 0x76, 0x96, 0xb3, 0x04, 0x0e, 0xc5, 0x66, 0xe0, 0xef, 0x8c, 0x41, 0x49, 0x45, 0x67, 0xfd, - 0x50, 0x69, 0xb5, 0x7c, 0xb5, 0x1f, 0xec, 0x56, 0xcb, 0x37, 0x11, 0xaa, 0x59, 0xf6, 0x14, 0x06, - 0x5a, 0xf6, 0x7c, 0x15, 0x26, 0x56, 0x3b, 0x2d, 0xed, 0xfd, 0xdf, 0xc8, 0xf8, 0xbc, 0x4b, 0x11, - 0x12, 0x5f, 0xbd, 0xd1, 0x3b, 0x40, 0xb3, 0xd3, 0x4a, 0xbf, 0xfa, 0xc7, 0x2c, 0x35, 0xa3, 0xa0, - 0xd1, 0x4f, 0x62, 0x14, 0x74, 0x0d, 0x26, 0xb6, 0x03, 0xba, 0xd5, 0x73, 0x5d, 0xda, 0xc6, 0x89, - 0x57, 0xe4, 0xd7, 0xe7, 0x5e, 0x40, 0xad, 0x10, 0xa1, 0xea, 0x07, 0x44, 0xa8, 0xea, 0x00, 0x8f, - 0x0f, 0x18, 0xe0, 0xab, 0x50, 0xac, 0x53, 0xea, 0x63, 0x9f, 0x4e, 0xc6, 0xb7, 0xa4, 0x2e, 0xa5, - 0xbe, 0xc5, 0x3a, 0x56, 0x33, 0x16, 0x12, 0x88, 0x9a, 0x85, 0x51, 0x69, 0x48, 0x0b, 0x23, 0xf2, - 0x3c, 0x94, 0xba, 0xbd, 0x9d, 0xb6, 0xd3, 0x44, 0xbe, 0xc2, 0x34, 0xc9, 0x9c, 0xe4, 0x30, 0xc6, - 0x36, 0x20, 0x5f, 0x82, 0x29, 0x54, 0x1b, 0x44, 0x53, 0x6e, 0x5a, 0x3b, 0xda, 0xb5, 0x32, 0x2e, - 0x7d, 0x37, 0x19, 0xc8, 0xca, 0x30, 0xc4, 0xd3, 0x19, 0x91, 0x9b, 0x30, 0xbe, 0xe7, 0x84, 0xd6, - 0x7e, 0x6f, 0x67, 0x61, 0x46, 0xb3, 0x62, 0xbb, 0xe1, 0x84, 0xeb, 0xbd, 0x1d, 0x3e, 0xe4, 0x11, - 0x6b, 0xdc, 0xa3, 0xf7, 0x9c, 0x70, 0xbf, 0xa7, 0xbe, 0x72, 0x8c, 0xed, 0x21, 0xee, 0x62, 0x03, - 0xa6, 0xf5, 0x59, 0xf1, 0x18, 0xde, 0xde, 0x23, 0xcb, 0xab, 0x62, 0x79, 0xe2, 0xe6, 0x48, 0x11, - 0xca, 0x93, 0xdc, 0xe6, 0xca, 0x84, 0x7a, 0xd4, 0x3f, 0x26, 0xb9, 0xd5, 0xdb, 0xa1, 0xbe, 0x4b, - 0x43, 0x1a, 0x88, 0x3b, 0x7a, 0x60, 0x8e, 0x54, 0xba, 0xdd, 0xc0, 0xf8, 0xc7, 0x79, 0x18, 0xaf, - 0xdc, 0x6b, 0xe0, 0xae, 0xff, 0x9a, 0xfa, 0x70, 0xaa, 0xbe, 0xa0, 0x47, 0x0f, 0xa7, 0xea, 0x73, - 0xe9, 0xe5, 0x0c, 0x2d, 0x0b, 0xfa, 0x06, 0x28, 0x5a, 0x16, 0x4d, 0x3f, 0x14, 0xbf, 0x21, 0x17, - 0x86, 0x78, 0x43, 0x8e, 0xd4, 0xfc, 0x23, 0xc7, 0xab, 0xf9, 0xdf, 0x82, 0xc9, 0x9a, 0x1b, 0xd2, - 0x3d, 0x3f, 0x5e, 0x35, 0x91, 0xc6, 0x27, 0x02, 0xab, 0x37, 0x6f, 0x05, 0x9b, 0x4d, 0x49, 0xfe, - 0xb4, 0x10, 0x3d, 0x29, 0xe0, 0x94, 0xe4, 0x2f, 0x10, 0x09, 0x75, 0x9d, 0x44, 0x34, 0xaa, 0x89, - 0xf9, 0x26, 0xed, 0x74, 0xb8, 0xd0, 0x37, 0x1d, 0xbf, 0xad, 0xb1, 0x8e, 0x5d, 0x99, 0xcd, 0xb6, - 0xd3, 0x31, 0xfe, 0x6a, 0x0e, 0xe6, 0xb3, 0xa6, 0x11, 0x79, 0x17, 0x4a, 0x9e, 0xbf, 0x67, 0xbb, - 0xce, 0xf7, 0xf3, 0x16, 0x29, 0x3a, 0x65, 0x15, 0xae, 0x6a, 0xd2, 0x54, 0x38, 0xeb, 0x10, 0xa5, - 0xe5, 0xba, 0x0a, 0x2c, 0xb3, 0x43, 0x14, 0xb0, 0xf1, 0xa3, 0x79, 0x98, 0xac, 0x74, 0xbb, 0x4f, - 0xb8, 0xe9, 0xe9, 0xe7, 0xb5, 0x03, 0x44, 0x6a, 0x20, 0xa2, 0x76, 0xf5, 0x37, 0x5c, 0x53, 0xce, - 0x90, 0x5f, 0xce, 0xc3, 0x4c, 0x82, 0x42, 0xfd, 0xfa, 0xdc, 0x90, 0x96, 0xa2, 0xf9, 0x21, 0x2d, - 0x45, 0x0b, 0xc3, 0x59, 0x8a, 0x8e, 0x7c, 0x92, 0x43, 0xe1, 0x65, 0x28, 0x54, 0xba, 0xdd, 0xa4, - 0x05, 0x48, 0xb7, 0x7b, 0xf7, 0x2a, 0x57, 0x82, 0xd9, 0xdd, 0xae, 0xc9, 0x30, 0xb4, 0x9d, 0x7a, - 0x6c, 0xc8, 0x9d, 0xda, 0x78, 0x1d, 0x26, 0x90, 0x17, 0xda, 0x4b, 0x9e, 0x03, 0xdc, 0x62, 0x84, - 0xa9, 0xa4, 0x56, 0x97, 0xd8, 0x7c, 0xfe, 0x38, 0x07, 0xa3, 0xf8, 0xfb, 0x09, 0x9d, 0x63, 0xcb, - 0xda, 0x1c, 0x2b, 0x2b, 0x73, 0x6c, 0x98, 0xd9, 0xf5, 0xf7, 0x0b, 0x00, 0xab, 0x77, 0xcc, 0x06, - 0xd7, 0x95, 0x92, 0xeb, 0x30, 0x63, 0xb7, 0xdb, 0xde, 0x03, 0xda, 0xb2, 0x3c, 0xdf, 0xd9, 0x73, - 0x5c, 0xde, 0x73, 0xd2, 0x2c, 0x41, 0x2f, 0x52, 0x1f, 0x2b, 0x45, 0xd1, 0x1d, 0x5e, 0xa2, 0xf2, - 0xe9, 0xd0, 0x70, 0xdf, 0x6b, 0x49, 0xb5, 0x89, 0xc6, 0x47, 0x14, 0x65, 0xf0, 0xb9, 0xcd, 0x4b, - 0x54, 0x3e, 0xfb, 0xa8, 0x06, 0x92, 0x32, 0xb4, 0xc6, 0x47, 0x14, 0x65, 0xf0, 0xe1, 0xba, 0xa3, - 0x80, 0x6c, 0xc0, 0x2c, 0x42, 0xac, 0xa6, 0x4f, 0x5b, 0xd4, 0x0d, 0x1d, 0xbb, 0x1d, 0x08, 0x45, - 0x1b, 0x6a, 0x94, 0x53, 0x85, 0xaa, 0xa2, 0x01, 0x0b, 0x57, 0xe3, 0x32, 0x72, 0x09, 0xc6, 0x3b, - 0xf6, 0x43, 0xcb, 0xde, 0xe3, 0x06, 0x3a, 0x53, 0x5c, 0x31, 0x23, 0x40, 0xea, 0x31, 0xd2, 0xb1, - 0x1f, 0x56, 0xf6, 0x28, 0x6b, 0x05, 0x7d, 0xd8, 0xf5, 0x02, 0xa5, 0x15, 0x63, 0x71, 0x2b, 0x12, - 0x45, 0x6a, 0x2b, 0x44, 0x91, 0x68, 0x85, 0xf1, 0x4b, 0x39, 0x78, 0xba, 0x86, 0x5f, 0x11, 0x1e, - 0xae, 0x52, 0x37, 0xa4, 0x7e, 0x9d, 0xfa, 0x1d, 0x07, 0xcd, 0x15, 0x1a, 0x34, 0x24, 0x2f, 0x40, - 0xa1, 0x62, 0x6e, 0x8a, 0xf9, 0xcb, 0xf7, 0x7b, 0xcd, 0x78, 0x84, 0x95, 0x46, 0xba, 0xbb, 0xfc, - 0x31, 0x6f, 0x0a, 0x15, 0x28, 0x55, 0x82, 0xc0, 0xd9, 0x73, 0x3b, 0xdc, 0x5f, 0xa7, 0xa0, 0x99, - 0xa7, 0x08, 0x78, 0xea, 0x31, 0x4c, 0x25, 0x31, 0xfe, 0xf3, 0x1c, 0xcc, 0x56, 0xba, 0x5d, 0xfd, - 0x93, 0x75, 0xd3, 0xa8, 0xdc, 0xf0, 0xa6, 0x51, 0x0e, 0x4c, 0x6b, 0xcd, 0xe5, 0x53, 0x2a, 0x16, - 0x7c, 0x07, 0xf4, 0x0c, 0xff, 0xec, 0x6e, 0x04, 0xb2, 0x02, 0xfd, 0x5d, 0x3f, 0xc1, 0xd8, 0xf8, - 0xf7, 0xe3, 0xb8, 0x87, 0x88, 0xdd, 0x56, 0x18, 0xef, 0xe6, 0x32, 0x8c, 0x77, 0xdf, 0x04, 0x45, - 0xc2, 0x51, 0x8f, 0x38, 0x45, 0x56, 0x54, 0xb5, 0x5e, 0x31, 0x32, 0x39, 0x48, 0x9a, 0xf1, 0x16, - 0xb0, 0x35, 0x2f, 0x24, 0x17, 0xf0, 0x63, 0xb1, 0xe0, 0x5d, 0x07, 0x52, 0x73, 0xd1, 0xd6, 0x80, - 0x36, 0x0e, 0x9c, 0xee, 0x5d, 0xea, 0x3b, 0xbb, 0x87, 0x62, 0x01, 0x60, 0xe7, 0x3b, 0xa2, 0xd4, - 0x0a, 0x0e, 0x9c, 0xae, 0x75, 0x1f, 0xcb, 0xcd, 0x0c, 0x1a, 0xf2, 0x1e, 0x8c, 0x9b, 0xf4, 0x81, - 0xef, 0x84, 0xd2, 0x38, 0x6d, 0x3a, 0x52, 0xe2, 0x22, 0x94, 0xaf, 0x05, 0x9f, 0xff, 0x50, 0x77, - 0x45, 0x51, 0x4e, 0x96, 0xb9, 0x90, 0xc2, 0x8d, 0xd0, 0xa6, 0xe2, 0xd6, 0x56, 0xee, 0x35, 0xfa, - 0xc9, 0x28, 0xe4, 0x22, 0x8c, 0xa2, 0xa4, 0x23, 0xee, 0x02, 0xe8, 0x8b, 0x86, 0xb2, 0xb3, 0x2a, - 0x86, 0x21, 0x06, 0xea, 0x04, 0xe4, 0x63, 0x7e, 0xb0, 0x50, 0x44, 0x29, 0x5d, 0x81, 0x24, 0xc5, - 0xb4, 0x89, 0x13, 0x89, 0x69, 0x1b, 0x50, 0x36, 0xb9, 0x5b, 0x6b, 0xab, 0xd2, 0xc5, 0x17, 0xe3, - 0x60, 0x01, 0x70, 0x25, 0x9f, 0x7b, 0x74, 0xb4, 0xf4, 0x8c, 0x70, 0x79, 0x6d, 0x59, 0x76, 0x97, - 0x3f, 0x34, 0x6b, 0xdb, 0x48, 0x92, 0x92, 0xbc, 0x09, 0x23, 0x6c, 0xeb, 0x15, 0x06, 0xbf, 0xf2, - 0xe5, 0x2d, 0xde, 0x8d, 0xf9, 0xe2, 0x6c, 0x7a, 0xda, 0x9e, 0x80, 0x24, 0xc4, 0x82, 0x69, 0x7d, - 0xba, 0x0b, 0xdb, 0xaf, 0x85, 0xb8, 0x3f, 0xf5, 0x72, 0xf1, 0x1c, 0x27, 0x60, 0x56, 0x13, 0x81, - 0xea, 0x0a, 0x48, 0x2c, 0xd2, 0x35, 0x28, 0x6e, 0xad, 0xd6, 0xeb, 0x9e, 0x1f, 0xf2, 0xab, 0x4e, - 0x7c, 0xb2, 0x30, 0x98, 0x69, 0xbb, 0x7b, 0x94, 0x9f, 0xc5, 0x61, 0xb3, 0x6b, 0x75, 0x19, 0x9a, - 0x7a, 0x16, 0x4b, 0x52, 0xf2, 0x21, 0x9c, 0xda, 0x0e, 0x68, 0xc5, 0x3d, 0xc4, 0xd3, 0x59, 0x59, - 0x2a, 0xd3, 0x38, 0xf5, 0xf0, 0x41, 0x89, 0x5d, 0x05, 0x6d, 0xf7, 0xd0, 0xe2, 0xa7, 0x7a, 0xf6, - 0xc2, 0xc9, 0xe6, 0xf2, 0xe9, 0xd9, 0x12, 0xff, 0x93, 0x1c, 0x28, 0x13, 0xb6, 0x68, 0xd2, 0x96, - 0xe3, 0xd3, 0x66, 0x28, 0x0e, 0x43, 0xe1, 0xb9, 0xc9, 0x61, 0x09, 0x9b, 0x51, 0x84, 0x91, 0x77, - 0x61, 0x5c, 0x6c, 0xda, 0x62, 0x93, 0x92, 0x13, 0x5d, 0x3c, 0x71, 0x70, 0x17, 0xdf, 0xd4, 0x86, - 0x2f, 0x89, 0xd8, 0x1e, 0x79, 0xf3, 0xde, 0xd6, 0x6a, 0xdb, 0x76, 0x3a, 0x81, 0xd8, 0x79, 0x71, - 0x99, 0x7e, 0xf4, 0x20, 0xb4, 0x9a, 0x08, 0x55, 0xf7, 0xc8, 0x08, 0xd5, 0xb8, 0x21, 0x5f, 0x58, - 0x8e, 0x31, 0x7c, 0x5e, 0x82, 0xd1, 0xbb, 0xb1, 0x1e, 0x6e, 0x65, 0xe2, 0xd1, 0xd1, 0x12, 0x6f, - 0xbd, 0xc9, 0xe1, 0x06, 0x85, 0x89, 0x68, 0xa0, 0x19, 0x2f, 0xf6, 0x03, 0x79, 0x4d, 0x71, 0x5e, - 0x6c, 0xc8, 0x4d, 0x84, 0x32, 0xc1, 0x68, 0xcd, 0x6d, 0x21, 0x42, 0x1e, 0x11, 0xb0, 0x7b, 0xa8, - 0xdb, 0xc2, 0x79, 0xa1, 0xb6, 0x4e, 0xa0, 0x29, 0xe2, 0xc7, 0x8f, 0xe7, 0x60, 0x5a, 0x1f, 0x05, - 0x72, 0x09, 0xc6, 0x84, 0x73, 0x66, 0x0e, 0xd5, 0x9a, 0x8c, 0xdb, 0x18, 0x77, 0xcb, 0xd4, 0x9c, - 0x31, 0x05, 0x16, 0x93, 0xb2, 0x04, 0x07, 0x21, 0x62, 0xa0, 0x94, 0xd5, 0xe4, 0x20, 0x53, 0x96, - 0x11, 0x83, 0x5d, 0xfc, 0x82, 0x5e, 0x3b, 0x54, 0x9f, 0x63, 0x7d, 0x84, 0x98, 0xa2, 0xc4, 0xf8, - 0x76, 0x0e, 0xc6, 0xf8, 0x4e, 0x94, 0x30, 0xec, 0xcc, 0x9d, 0xc4, 0xb0, 0xf3, 0x1b, 0x30, 0x6f, - 0x7a, 0x6d, 0x1a, 0x54, 0xdc, 0xc3, 0x07, 0xfb, 0xd4, 0xa7, 0x75, 0xdf, 0xdb, 0x95, 0x2f, 0xc7, - 0x93, 0xcb, 0xcf, 0x6b, 0x3b, 0x5e, 0x16, 0x22, 0x7f, 0xfa, 0xf3, 0x59, 0x09, 0x5b, 0x17, 0x58, - 0xc4, 0x16, 0x47, 0xe2, 0xa5, 0x39, 0xb3, 0x12, 0xe3, 0x1f, 0xe4, 0x60, 0xb1, 0x3f, 0x6b, 0x3c, - 0xaf, 0xf8, 0x9f, 0xb1, 0xa0, 0xc0, 0xcf, 0x2b, 0x0e, 0x4d, 0x58, 0x9b, 0x2a, 0xc8, 0xc4, 0x84, - 0x53, 0x95, 0x66, 0x93, 0x76, 0x43, 0xc6, 0x58, 0xd8, 0x48, 0x46, 0x82, 0x44, 0x91, 0xeb, 0x33, - 0x6c, 0x44, 0xe0, 0x76, 0xab, 0xd2, 0x72, 0x13, 0x67, 0x5d, 0x36, 0xa9, 0x71, 0x94, 0x03, 0x68, - 0x34, 0xd6, 0x6f, 0xd1, 0xc3, 0xba, 0xed, 0xa0, 0x64, 0xc0, 0x17, 0xf7, 0x2d, 0xb1, 0x7c, 0x4b, - 0xc2, 0xd6, 0x82, 0xef, 0x09, 0x07, 0xf4, 0x50, 0xb3, 0xb5, 0x90, 0xa8, 0xbc, 0x55, 0xce, 0x7d, - 0x3b, 0xa4, 0x8c, 0x10, 0xf5, 0xc0, 0xb2, 0x55, 0x08, 0x4d, 0x50, 0x2a, 0xc8, 0xe4, 0x43, 0x98, - 0x8e, 0x7f, 0x45, 0x16, 0x23, 0xd3, 0xd1, 0x16, 0xa1, 0x17, 0xae, 0x3c, 0xf7, 0xe8, 0x68, 0x69, - 0x51, 0xe1, 0x9a, 0xb4, 0x25, 0x49, 0x30, 0x33, 0x7e, 0x31, 0x87, 0x76, 0x52, 0xb2, 0x81, 0xe7, - 0x61, 0x24, 0xb2, 0xec, 0x2f, 0x89, 0xed, 0x5d, 0x7f, 0x56, 0xc6, 0x72, 0x26, 0xc8, 0xc5, 0x2d, - 0xc1, 0x43, 0x51, 0x6f, 0x01, 0x2b, 0x25, 0x37, 0x60, 0x7c, 0xa8, 0x6f, 0xc6, 0xe5, 0x98, 0xf1, - 0xad, 0x92, 0x1a, 0x47, 0xe1, 0xe6, 0xbd, 0xad, 0xef, 0xdd, 0x51, 0xf8, 0xa9, 0x3c, 0xcc, 0xb0, - 0x7e, 0xad, 0xf4, 0xc2, 0x7d, 0xcf, 0x77, 0xc2, 0xc3, 0x27, 0x56, 0x23, 0xfd, 0xb6, 0x76, 0xd9, - 0x5b, 0x94, 0xe7, 0x98, 0xda, 0xb6, 0xa1, 0x14, 0xd3, 0xff, 0xed, 0x28, 0xcc, 0x65, 0x50, 0x91, - 0xd7, 0xb4, 0x67, 0xae, 0x05, 0x19, 0xa8, 0xe2, 0xbb, 0x47, 0x4b, 0x25, 0x89, 0xbe, 0x15, 0x07, - 0xae, 0x58, 0xd6, 0x8d, 0x0e, 0x79, 0x4f, 0xe1, 0xab, 0x97, 0x6a, 0x74, 0xa8, 0x9b, 0x1a, 0x5e, - 0x84, 0x51, 0xdc, 0x99, 0x84, 0xa1, 0x2d, 0x8a, 0x72, 0xb8, 0xd7, 0x69, 0x86, 0x45, 0x0c, 0x40, - 0xd6, 0x61, 0x9c, 0xfd, 0x71, 0xdb, 0xee, 0x8a, 0x37, 0x67, 0x12, 0xa9, 0x1b, 0x10, 0xda, 0x75, - 0xdc, 0x3d, 0x55, 0xe3, 0xd0, 0xa6, 0x56, 0xc7, 0xee, 0x6a, 0x32, 0x27, 0x47, 0xd4, 0x34, 0x17, - 0xc5, 0xfe, 0x9a, 0x8b, 0xdc, 0xb1, 0x9a, 0x8b, 0x5d, 0x80, 0x86, 0xb3, 0xe7, 0x3a, 0xee, 0x5e, - 0xa5, 0xbd, 0x27, 0xc2, 0x7d, 0x5c, 0xec, 0x3f, 0x0a, 0x97, 0x62, 0x64, 0x9c, 0xb8, 0x4f, 0xa3, - 0x61, 0x08, 0x87, 0x59, 0x76, 0x7b, 0x4f, 0xf3, 0xef, 0x53, 0x38, 0x93, 0x4d, 0x80, 0x4a, 0x33, - 0x74, 0xee, 0xb3, 0x29, 0x1c, 0x08, 0x01, 0x51, 0x7e, 0xf2, 0x6a, 0xe5, 0x16, 0x3d, 0xc4, 0x4b, - 0x8d, 0x7c, 0x62, 0xb7, 0x11, 0x95, 0xad, 0x04, 0xcd, 0x79, 0x2b, 0xe6, 0x40, 0xba, 0x70, 0xaa, - 0xd2, 0x6a, 0x39, 0xac, 0x0d, 0x76, 0x7b, 0x8b, 0x07, 0x6a, 0x41, 0xd6, 0xa5, 0x6c, 0xd6, 0x17, - 0xe5, 0xab, 0xb0, 0x1d, 0x51, 0x59, 0x32, 0xbe, 0x4b, 0xa2, 0x9a, 0x6c, 0xc6, 0x46, 0x03, 0xa6, - 0xf5, 0xc6, 0xeb, 0x61, 0x4a, 0x4a, 0x50, 0x34, 0x1b, 0x15, 0xab, 0xb1, 0x5e, 0xb9, 0x52, 0xce, - 0x91, 0x32, 0x94, 0xc4, 0xaf, 0x65, 0x6b, 0xf9, 0x8d, 0x6b, 0xe5, 0xbc, 0x06, 0x79, 0xe3, 0xca, - 0x72, 0xb9, 0xb0, 0x98, 0x5f, 0xc8, 0x25, 0x5c, 0x7b, 0xc7, 0xcb, 0x45, 0xae, 0x6c, 0x36, 0x7e, - 0x25, 0x07, 0x45, 0xf9, 0xed, 0xe4, 0x1a, 0x14, 0x1a, 0x8d, 0xf5, 0x84, 0x73, 0x6c, 0x7c, 0xca, - 0xf0, 0xfd, 0x34, 0x08, 0x54, 0x0f, 0x08, 0x46, 0xc0, 0xe8, 0xb6, 0x36, 0x1a, 0x42, 0x5e, 0x93, - 0x74, 0xf1, 0xe6, 0xcd, 0xe9, 0x32, 0x3c, 0x06, 0xaf, 0x41, 0xe1, 0xe6, 0xbd, 0x2d, 0x71, 0x7d, - 0x93, 0x74, 0xf1, 0x7e, 0xca, 0xe9, 0x3e, 0x7a, 0xa0, 0xee, 0xf2, 0x8c, 0xc0, 0x30, 0x61, 0x52, - 0x99, 0xc8, 0x5c, 0x40, 0xe9, 0x78, 0x51, 0x6c, 0x0e, 0x21, 0xa0, 0x30, 0x88, 0x29, 0x4a, 0x98, - 0xd8, 0xb6, 0xe1, 0x35, 0xed, 0xb6, 0x90, 0x74, 0x50, 0x6c, 0x6b, 0x33, 0x80, 0xc9, 0xe1, 0xc6, - 0x6f, 0xe6, 0xa0, 0x5c, 0xf7, 0x3d, 0x1e, 0x3f, 0x64, 0xcb, 0x3b, 0xa0, 0xee, 0xdd, 0x2b, 0xe4, - 0x75, 0xb9, 0xe4, 0x72, 0x91, 0x0a, 0x6d, 0x14, 0x97, 0x5c, 0xe2, 0x1d, 0x52, 0x2c, 0x3b, 0x25, - 0xfc, 0x49, 0x7e, 0xf8, 0xb0, 0x09, 0xc7, 0x84, 0x3f, 0x59, 0x82, 0x51, 0xfc, 0x1c, 0xb1, 0x39, - 0xe2, 0x97, 0x87, 0x0c, 0x60, 0x72, 0xb8, 0xb2, 0x37, 0x1d, 0xe5, 0x53, 0x6d, 0x58, 0xfe, 0x9e, - 0x0a, 0x3d, 0xa0, 0x37, 0xae, 0xff, 0x7e, 0x4d, 0x6e, 0xf5, 0x09, 0x3d, 0x90, 0x60, 0xc0, 0x3d, - 0x07, 0x97, 0xf9, 0xf3, 0x04, 0xf7, 0xbf, 0x51, 0x95, 0x50, 0x29, 0x4f, 0xe6, 0x0f, 0x60, 0x3e, - 0xd9, 0xbf, 0xa8, 0x2b, 0xad, 0xc0, 0x8c, 0x0e, 0x97, 0x6a, 0xd3, 0x33, 0x99, 0xf5, 0xde, 0x5d, - 0x36, 0x93, 0xf8, 0xc6, 0xff, 0x92, 0x83, 0x09, 0xfc, 0xd3, 0xec, 0x71, 0x69, 0xb3, 0x72, 0xaf, - 0x21, 0x34, 0x38, 0xaa, 0xb4, 0x69, 0x3f, 0x08, 0xa4, 0x69, 0x9f, 0xb6, 0x61, 0x45, 0xc8, 0x82, - 0x94, 0x3f, 0xc3, 0x48, 0xdd, 0x61, 0x44, 0xca, 0xdf, 0x6b, 0x82, 0x04, 0xa9, 0x40, 0x46, 0x63, - 0x76, 0x2e, 0xfe, 0xaa, 0x86, 0x56, 0x48, 0xe7, 0xb5, 0x75, 0x63, 0x76, 0x8e, 0x86, 0x76, 0x56, - 0xf7, 0x1a, 0x4c, 0x22, 0x56, 0xed, 0xac, 0xd8, 0x37, 0x6a, 0xd2, 0xb0, 0x40, 0x32, 0x7e, 0x7d, - 0x2a, 0xd9, 0x81, 0xe2, 0xf4, 0x3c, 0xe1, 0x42, 0x7b, 0x0b, 0x46, 0x2b, 0xed, 0xb6, 0xf7, 0x40, - 0x6c, 0x39, 0xf2, 0x82, 0x1d, 0xf5, 0x1f, 0x3f, 0x1c, 0x51, 0xfb, 0xa8, 0x39, 0x39, 0x33, 0x00, - 0x59, 0x85, 0x89, 0xca, 0xbd, 0x46, 0xad, 0x56, 0xdd, 0xda, 0xe2, 0x0e, 0x9d, 0x85, 0x95, 0x97, - 0x64, 0xff, 0x38, 0x4e, 0xcb, 0x4a, 0x1a, 0x82, 0xc4, 0x17, 0xa7, 0x98, 0x8e, 0xbc, 0x03, 0x70, - 0xd3, 0x73, 0x5c, 0xae, 0x6d, 0x15, 0x8d, 0x7f, 0xf6, 0xd1, 0xd1, 0xd2, 0xe4, 0x47, 0x9e, 0xe3, - 0x0a, 0xf5, 0x2c, 0xfb, 0xf6, 0x18, 0xc9, 0x54, 0xfe, 0x66, 0x3d, 0xbd, 0xe2, 0x71, 0x03, 0xd1, - 0xd1, 0xb8, 0xa7, 0x77, 0xbc, 0x94, 0x5a, 0x50, 0xa2, 0x91, 0x0e, 0xcc, 0x34, 0x7a, 0x7b, 0x7b, - 0x94, 0x1d, 0x13, 0x42, 0xed, 0x35, 0x26, 0xae, 0xe4, 0x51, 0xf4, 0x2f, 0x7e, 0x11, 0x64, 0xb7, - 0xd0, 0x60, 0xe5, 0x35, 0xb6, 0x2a, 0xbe, 0x73, 0xb4, 0x24, 0x0c, 0x4c, 0x98, 0xdc, 0x17, 0x48, - 0xfa, 0xb4, 0xd2, 0x2b, 0xc9, 0x9b, 0xdc, 0x81, 0x31, 0xfe, 0xb4, 0x25, 0x1c, 0x14, 0x9f, 0x1f, - 0xb0, 0x02, 0x39, 0x62, 0xbf, 0xc7, 0x53, 0x5e, 0x4a, 0xee, 0x41, 0x71, 0xd5, 0xf1, 0x9b, 0x6d, - 0xba, 0x5a, 0x13, 0x82, 0xc4, 0x0b, 0x03, 0x58, 0x4a, 0x54, 0xde, 0x2f, 0x4d, 0xfc, 0xd5, 0x74, - 0x54, 0xc1, 0x42, 0x62, 0x90, 0xbf, 0x9a, 0x83, 0xa7, 0xa3, 0xaf, 0xaf, 0xec, 0x51, 0x37, 0xbc, - 0x6d, 0x87, 0xcd, 0x7d, 0xea, 0x8b, 0x5e, 0x9a, 0x18, 0xd4, 0x4b, 0x5f, 0x48, 0xf5, 0xd2, 0x85, - 0xb8, 0x97, 0x6c, 0xc6, 0xcc, 0xea, 0x70, 0x6e, 0xe9, 0x3e, 0x1b, 0x54, 0x2b, 0xb1, 0x00, 0xe2, - 0x47, 0x5b, 0x61, 0xa9, 0xf6, 0xd2, 0x80, 0x06, 0xc7, 0xc8, 0xc2, 0x31, 0x2d, 0xfa, 0xad, 0x59, - 0x56, 0x47, 0x50, 0x72, 0x4b, 0x7a, 0x03, 0x73, 0x11, 0xe7, 0xdc, 0x00, 0xde, 0xdc, 0x43, 0x78, - 0x6e, 0x80, 0xdf, 0x3f, 0x1f, 0xed, 0x0d, 0x7b, 0x47, 0x48, 0x35, 0xc7, 0x8c, 0xf6, 0x86, 0x1d, - 0x8f, 0x76, 0xdb, 0x4e, 0x8e, 0xf6, 0x86, 0xbd, 0x43, 0x56, 0x79, 0x08, 0x03, 0xee, 0xef, 0xfe, - 0xdc, 0x20, 0x6e, 0xab, 0x75, 0x7e, 0xcc, 0x67, 0x84, 0x32, 0xf8, 0x32, 0x4c, 0x34, 0xba, 0x76, - 0x93, 0xb6, 0x9d, 0xdd, 0x50, 0x58, 0x04, 0xbc, 0x38, 0x80, 0x55, 0x84, 0x2b, 0x5e, 0x80, 0xe5, - 0x4f, 0xf5, 0xce, 0x15, 0xe1, 0xb0, 0x2f, 0xdc, 0xaa, 0xdf, 0x16, 0x46, 0x01, 0x83, 0xbe, 0x70, - 0xab, 0x7e, 0x5b, 0x08, 0x30, 0xdd, 0x8e, 0x26, 0xc0, 0xd4, 0x6f, 0x93, 0x2e, 0x4c, 0x6f, 0x51, - 0xdf, 0xb7, 0x77, 0x3d, 0xbf, 0xc3, 0xd5, 0xac, 0xdc, 0x87, 0xf2, 0xe2, 0x20, 0x7e, 0x1a, 0x01, - 0xd7, 0x2e, 0x86, 0x12, 0x66, 0x25, 0x75, 0xb3, 0x09, 0xfe, 0xac, 0x4f, 0x56, 0x9c, 0x70, 0xa7, - 0xd7, 0x3c, 0xa0, 0xe1, 0xc2, 0xec, 0xb1, 0x7d, 0x12, 0xe1, 0xf2, 0x3e, 0xd9, 0x91, 0x3f, 0xd5, - 0x3e, 0x89, 0x70, 0xd8, 0x34, 0x10, 0x81, 0x0a, 0xc8, 0xb1, 0xd3, 0x80, 0x23, 0xf2, 0x69, 0xd0, - 0x2f, 0x62, 0x01, 0xd9, 0x87, 0xd2, 0x8a, 0xd7, 0x73, 0x99, 0x5c, 0xdb, 0xb5, 0x1d, 0x7f, 0x61, - 0x0e, 0xd9, 0xbe, 0x3c, 0xe8, 0x83, 0x15, 0x74, 0x6e, 0x7f, 0xbf, 0xc3, 0x20, 0x4c, 0x74, 0x66, - 0x20, 0xf5, 0xc1, 0x44, 0x45, 0x25, 0x2d, 0x98, 0xc4, 0xa9, 0x5c, 0xa5, 0xf7, 0xbd, 0x6e, 0xb0, - 0x30, 0x8f, 0x15, 0x9d, 0x3f, 0x6e, 0x51, 0x70, 0x6c, 0xfe, 0x32, 0x8f, 0x4b, 0xc3, 0x6a, 0x21, - 0x44, 0xd5, 0x62, 0x2b, 0x88, 0xc6, 0x3f, 0x1e, 0x85, 0xa5, 0x63, 0x98, 0x91, 0xbb, 0xf2, 0x6c, - 0xe2, 0x12, 0xc0, 0xab, 0xc3, 0x7d, 0xc3, 0xa5, 0x63, 0x8f, 0xad, 0xb7, 0x60, 0xfa, 0x8e, 0x62, - 0x24, 0x10, 0x19, 0x6d, 0x20, 0x8d, 0x6a, 0x3e, 0x60, 0x39, 0x2d, 0x33, 0x81, 0xba, 0xf8, 0xc7, - 0x05, 0x18, 0x41, 0xc1, 0xe2, 0x05, 0x28, 0x34, 0x7a, 0x3b, 0xea, 0x43, 0x57, 0xa0, 0x6d, 0xd7, - 0xac, 0x94, 0xbc, 0x0d, 0x93, 0xc2, 0x1d, 0x47, 0xb9, 0x9d, 0x62, 0x27, 0x49, 0xdf, 0x9d, 0xa4, - 0x2f, 0x84, 0x82, 0x4e, 0xde, 0x83, 0x52, 0xdd, 0xe9, 0xd2, 0xb6, 0xe3, 0x52, 0xc5, 0xb2, 0x1f, - 0xc7, 0xb2, 0x2b, 0xe0, 0xa9, 0xc7, 0x2f, 0x95, 0x40, 0x77, 0x1c, 0x1a, 0x19, 0xde, 0x71, 0xe8, - 0x3d, 0x28, 0x55, 0xe9, 0xae, 0xe3, 0x3a, 0xa2, 0x7f, 0x46, 0xe3, 0x8a, 0x5b, 0x11, 0x5c, 0xa7, - 0xd6, 0x08, 0xc8, 0x0a, 0x4c, 0x99, 0xb4, 0xeb, 0x05, 0x4e, 0xe8, 0xf9, 0x87, 0xdb, 0x66, 0x4d, - 0x18, 0x94, 0xa0, 0x82, 0xce, 0x8f, 0x0a, 0xac, 0x9e, 0xaf, 0x9e, 0x44, 0x3a, 0x09, 0xd9, 0x84, - 0xd9, 0x18, 0xa0, 0x1b, 0x62, 0x89, 0x97, 0x8e, 0x88, 0x4f, 0xda, 0x84, 0x3a, 0x4d, 0xaa, 0x7f, - 0x93, 0x49, 0x77, 0x85, 0x41, 0x76, 0xf2, 0x9b, 0x7c, 0xba, 0x9b, 0xfd, 0x4d, 0x26, 0xdd, 0x35, - 0x7e, 0xad, 0x00, 0x67, 0xfa, 0x6c, 0x6d, 0x64, 0x53, 0x9f, 0xae, 0x2f, 0x0c, 0xde, 0x09, 0x8f, - 0x9f, 0xa6, 0x1b, 0x50, 0x5e, 0xbb, 0x85, 0x17, 0x7a, 0xfe, 0x8e, 0xbc, 0x5a, 0x91, 0x42, 0x28, - 0x36, 0x9f, 0x1e, 0xa0, 0x33, 0x86, 0x7c, 0x7f, 0x6e, 0x6a, 0x41, 0x53, 0x52, 0x94, 0x8b, 0x3f, - 0x94, 0x17, 0xf3, 0x36, 0x11, 0xe1, 0x32, 0x77, 0xa2, 0x08, 0x97, 0x5f, 0x84, 0xd2, 0xda, 0x2d, - 0xae, 0x6e, 0x5b, 0xb7, 0x83, 0x7d, 0x31, 0xa7, 0xb0, 0x0b, 0xe9, 0x81, 0x7c, 0x37, 0xd9, 0xb7, - 0xb5, 0x8b, 0xad, 0x46, 0x41, 0xb6, 0x61, 0x8e, 0x7f, 0x9b, 0xb3, 0xeb, 0x34, 0x79, 0xa0, 0x3c, - 0xc7, 0x6e, 0x8b, 0x19, 0xf6, 0xc2, 0xa3, 0xa3, 0xa5, 0x25, 0x7a, 0x80, 0x6e, 0x26, 0xa2, 0xdc, - 0x0a, 0x10, 0x41, 0xf5, 0x37, 0xc9, 0xa0, 0x57, 0xc3, 0x6e, 0x99, 0x13, 0x58, 0x21, 0xab, 0x8d, - 0xd5, 0xcd, 0x70, 0x39, 0x92, 0xf1, 0x87, 0xa3, 0xb0, 0xd8, 0x5f, 0xec, 0x22, 0xef, 0xeb, 0x03, - 0x78, 0xfe, 0x58, 0x41, 0xed, 0xf8, 0x31, 0xfc, 0x12, 0xcc, 0xaf, 0xb9, 0x21, 0xf5, 0xbb, 0xbe, - 0x23, 0xc3, 0x75, 0xad, 0x7b, 0x81, 0x74, 0xeb, 0x41, 0x25, 0x3b, 0x8d, 0xca, 0x85, 0x83, 0x1a, - 0xfa, 0x48, 0xa9, 0x4a, 0xf6, 0x2c, 0x0e, 0x64, 0x0d, 0xa6, 0x15, 0x78, 0xbb, 0xb7, 0xa7, 0x3e, - 0x8e, 0xab, 0x3c, 0xdb, 0x3d, 0xd5, 0xe7, 0x21, 0x41, 0x84, 0xae, 0x43, 0xa1, 0x1d, 0x3a, 0xcd, - 0x9b, 0xf7, 0x6e, 0x35, 0xc4, 0x70, 0x72, 0xd7, 0x21, 0x84, 0x5a, 0x1f, 0x3d, 0x38, 0xd0, 0xe4, - 0xa6, 0x18, 0x79, 0xf1, 0x17, 0x4f, 0xb4, 0x13, 0x7e, 0x1e, 0x20, 0x5e, 0x4a, 0xaa, 0xeb, 0x7d, - 0xbc, 0xf4, 0x74, 0xef, 0x40, 0x09, 0x25, 0xeb, 0x30, 0x13, 0xff, 0xba, 0xf3, 0xc0, 0xa5, 0xbe, - 0x68, 0x2a, 0xaa, 0x60, 0x95, 0x95, 0xeb, 0xb1, 0x32, 0x55, 0x14, 0x4f, 0x90, 0x91, 0x65, 0x28, - 0xde, 0xf3, 0xfc, 0x83, 0x5d, 0x36, 0xc6, 0x23, 0xf1, 0x65, 0xe1, 0x81, 0x80, 0xa9, 0x42, 0xb1, - 0xc4, 0x63, 0xcb, 0x65, 0xcd, 0xbd, 0xef, 0xf8, 0x1e, 0x1a, 0x14, 0xa8, 0x26, 0x75, 0x34, 0x06, - 0x6b, 0x41, 0x4f, 0x62, 0x30, 0xb9, 0x08, 0xa3, 0x95, 0x66, 0xe8, 0xf9, 0x62, 0xfb, 0xe3, 0x33, - 0x85, 0x01, 0xb4, 0x99, 0xc2, 0x00, 0xac, 0x13, 0xd9, 0x9e, 0x34, 0x1e, 0x77, 0xa2, 0xbe, 0x11, - 0xb1, 0x52, 0x76, 0xd9, 0x31, 0xe9, 0x2e, 0x6a, 0x47, 0xb5, 0xf8, 0xad, 0xbb, 0x29, 0xbd, 0xba, - 0x40, 0x33, 0x7e, 0x18, 0xfa, 0x4e, 0x79, 0x26, 0x5d, 0x9e, 0x6c, 0xca, 0x6f, 0xd8, 0x43, 0x4c, - 0xf9, 0xd7, 0x22, 0x9f, 0x43, 0x35, 0x8c, 0x11, 0x42, 0x54, 0xb9, 0x46, 0x78, 0x1f, 0xea, 0xf3, - 0xaf, 0x70, 0x92, 0xf9, 0xf7, 0xf7, 0x8a, 0x27, 0x99, 0x7f, 0xa2, 0x7f, 0xf3, 0xc3, 0xf6, 0x6f, - 0x61, 0xa8, 0xfe, 0x65, 0x87, 0x4a, 0x14, 0x3c, 0xb8, 0x6e, 0x87, 0xda, 0x8e, 0x18, 0x45, 0x7c, - 0xb6, 0xba, 0xb6, 0x16, 0x60, 0x4f, 0x27, 0x51, 0x84, 0x04, 0xe4, 0x30, 0x9a, 0x16, 0x12, 0x12, - 0xf4, 0x2a, 0x3a, 0xdb, 0x08, 0xe4, 0x99, 0xdf, 0x40, 0x0f, 0x36, 0x31, 0xd9, 0xb8, 0xb9, 0x89, - 0x14, 0x13, 0xb8, 0x73, 0x9b, 0xf6, 0x3e, 0xa1, 0x11, 0x25, 0xe7, 0xf9, 0xf8, 0x89, 0xe6, 0x39, - 0xb7, 0xb0, 0xf6, 0x37, 0xbc, 0x3d, 0x47, 0xfa, 0x39, 0x49, 0x0b, 0x6b, 0xdf, 0x6a, 0x33, 0x68, - 0xc2, 0xc2, 0x9a, 0xa3, 0x92, 0xd7, 0x61, 0x8c, 0xfd, 0xa8, 0x55, 0x85, 0x0d, 0x04, 0x2a, 0x3d, - 0x90, 0x48, 0x77, 0x2e, 0xe3, 0x48, 0xb2, 0x9a, 0xb5, 0x8e, 0xed, 0xb4, 0x45, 0xa0, 0x9b, 0xb8, - 0x1a, 0xca, 0xa0, 0xc9, 0x6a, 0x10, 0x95, 0x34, 0xa1, 0x64, 0xd2, 0xdd, 0xba, 0xef, 0x85, 0xb4, - 0x19, 0xd2, 0x96, 0xb8, 0xe8, 0x49, 0x5d, 0xc7, 0x8a, 0xe7, 0xf1, 0x4b, 0x2c, 0xfa, 0x21, 0xe5, - 0xbe, 0x73, 0xb4, 0x04, 0x0c, 0xc4, 0x3d, 0x17, 0x99, 0xc8, 0xc3, 0xc6, 0xbf, 0x2b, 0x89, 0xd5, - 0x83, 0x4d, 0x65, 0x4a, 0xbe, 0xc1, 0xb6, 0xfa, 0xa8, 0x4b, 0xe2, 0xca, 0x4a, 0x7d, 0x2a, 0x7b, - 0x23, 0xb3, 0xb2, 0x25, 0xa5, 0xb7, 0x33, 0x2b, 0xcd, 0xac, 0x84, 0xbc, 0x03, 0x93, 0xab, 0xb5, - 0x55, 0xcf, 0xdd, 0x75, 0xf6, 0x1a, 0xeb, 0x15, 0xbc, 0x2d, 0x0a, 0x79, 0xad, 0xe9, 0x58, 0x4d, - 0x84, 0x5b, 0xc1, 0xbe, 0xad, 0xc5, 0x5e, 0x88, 0xf1, 0xc9, 0x0d, 0x98, 0x96, 0x3f, 0x4d, 0xba, - 0xcb, 0xe4, 0xb5, 0x69, 0xc5, 0xd3, 0x39, 0xe2, 0xc0, 0x3a, 0x42, 0x17, 0xd9, 0x12, 0x64, 0x6c, - 0x32, 0x56, 0x69, 0xb7, 0xed, 0x1d, 0xb2, 0xcf, 0xdb, 0x72, 0xa8, 0x8f, 0xd7, 0x42, 0x31, 0x19, - 0x5b, 0x51, 0x89, 0x15, 0x3a, 0xba, 0xe5, 0x87, 0x4e, 0xc4, 0x44, 0x3f, 0x31, 0xc5, 0xef, 0x3a, - 0x81, 0xb3, 0xe3, 0xb4, 0x9d, 0xf0, 0x10, 0x2f, 0x84, 0x42, 0xf6, 0x91, 0xeb, 0xe2, 0x7e, 0x54, - 0xaa, 0x8a, 0x7e, 0x29, 0x52, 0xe3, 0x57, 0xf2, 0xf0, 0xcc, 0x20, 0xe5, 0x08, 0x69, 0xe8, 0xfb, - 0xe0, 0x85, 0x21, 0x14, 0x2a, 0xc7, 0xef, 0x84, 0x6b, 0x7d, 0xee, 0x19, 0xd8, 0x19, 0x89, 0x7b, - 0x86, 0xda, 0x19, 0x89, 0x1b, 0xc7, 0x7d, 0xb1, 0xcd, 0x7d, 0xdc, 0x28, 0x00, 0xd7, 0x60, 0x62, - 0xd5, 0x73, 0x43, 0xfa, 0x30, 0x4c, 0xc4, 0xbc, 0xe1, 0xc0, 0x64, 0x04, 0x04, 0x89, 0x6a, 0xfc, - 0x9b, 0x02, 0x3c, 0x3b, 0x50, 0x3b, 0x40, 0xb6, 0xf4, 0x5e, 0xbb, 0x38, 0x8c, 0x4a, 0xe1, 0xf8, - 0x6e, 0x5b, 0x4e, 0x59, 0x0c, 0x1f, 0xef, 0xa5, 0x6a, 0x02, 0xe1, 0xa1, 0x3d, 0x6e, 0xb4, 0xbd, - 0x1d, 0xd4, 0x1f, 0x39, 0xee, 0x9e, 0x08, 0x09, 0xc2, 0x3d, 0x2e, 0xb1, 0xd4, 0xda, 0x6b, 0x7b, - 0x3b, 0x5c, 0x0f, 0xe5, 0xb8, 0xaa, 0x58, 0x94, 0x41, 0xbd, 0xf8, 0x6f, 0x72, 0xa2, 0xe3, 0x3f, - 0x03, 0xe3, 0xf8, 0xf9, 0x51, 0xb7, 0x73, 0xcd, 0x3e, 0xee, 0xec, 0x8e, 0xae, 0xd9, 0xe7, 0x68, - 0xe4, 0x2a, 0x14, 0x57, 0xed, 0x76, 0x5b, 0x89, 0x32, 0x84, 0x4a, 0x83, 0x26, 0xc2, 0x12, 0xa6, - 0xf4, 0x12, 0x91, 0x1d, 0x85, 0xfc, 0x6f, 0xe5, 0xfc, 0xc1, 0x0d, 0x58, 0x90, 0x25, 0x8e, 0x20, - 0x05, 0x19, 0x43, 0xaa, 0x37, 0xbd, 0x28, 0x8e, 0x09, 0x0f, 0xa9, 0xce, 0x00, 0x5a, 0x48, 0x75, - 0x06, 0x30, 0x7e, 0xb5, 0x00, 0xcf, 0x0d, 0x56, 0x9b, 0x91, 0x6d, 0x7d, 0x58, 0x5f, 0x19, 0x4a, - 0xd9, 0x76, 0xfc, 0xb8, 0xca, 0x04, 0x05, 0xbc, 0x43, 0x2e, 0xa4, 0xdd, 0x17, 0xbf, 0x7b, 0xb4, - 0xa4, 0xf8, 0x67, 0xdc, 0xf4, 0x1c, 0x57, 0x79, 0xe7, 0xfd, 0x7a, 0x4a, 0x50, 0x98, 0x5c, 0xbe, - 0x36, 0xdc, 0x97, 0xc5, 0x74, 0x7c, 0xaf, 0x1a, 0x56, 0xc0, 0xf8, 0x02, 0x94, 0x93, 0xa4, 0xe4, - 0x3c, 0x8c, 0xe0, 0x07, 0x28, 0x3e, 0x98, 0x09, 0x0e, 0x58, 0xbe, 0x78, 0x5b, 0xcc, 0x1d, 0x0c, - 0xbc, 0xa4, 0x06, 0x09, 0x10, 0x94, 0x22, 0xf0, 0x92, 0x16, 0x61, 0x40, 0x0f, 0xbc, 0xa4, 0x12, - 0x19, 0x7f, 0x92, 0x83, 0xb3, 0x7d, 0xf5, 0x1e, 0xa4, 0xae, 0x0f, 0xd8, 0x4b, 0xc7, 0x29, 0x4a, - 0x8e, 0x1d, 0xab, 0xc5, 0x9f, 0x90, 0x73, 0xff, 0x5d, 0x28, 0x35, 0x7a, 0x3b, 0xc9, 0xeb, 0x22, - 0x0f, 0x8b, 0xa6, 0xc0, 0xd5, 0x53, 0x51, 0xc5, 0x67, 0xed, 0x97, 0x9e, 0xf5, 0xc2, 0x1c, 0x52, - 0xb1, 0xc1, 0x8e, 0x22, 0x83, 0xa4, 0x03, 0x4f, 0xe9, 0x44, 0xc6, 0x2f, 0xe7, 0xb3, 0xef, 0xdd, - 0x37, 0x56, 0xeb, 0x27, 0xb9, 0x77, 0xdf, 0x58, 0xad, 0x1f, 0xdf, 0xf6, 0xff, 0x4a, 0xb6, 0x9d, - 0x1b, 0x2a, 0xf1, 0x5d, 0x54, 0xbe, 0xa7, 0x48, 0x43, 0x25, 0xb1, 0xe3, 0x06, 0x09, 0x43, 0x25, - 0x81, 0x4c, 0xde, 0x80, 0x89, 0x0d, 0x8f, 0xc7, 0x84, 0x92, 0x2d, 0xe6, 0xa1, 0x33, 0x24, 0x50, - 0xdd, 0x72, 0x23, 0x4c, 0x76, 0xd5, 0xd1, 0x07, 0x5e, 0x9a, 0x9a, 0xe3, 0x55, 0x27, 0x31, 0x5d, - 0xf4, 0x57, 0x07, 0x9d, 0xcc, 0xf8, 0x47, 0xa3, 0x60, 0x1c, 0xaf, 0x33, 0x25, 0x1f, 0xe8, 0x7d, - 0x77, 0x69, 0x68, 0x6d, 0xeb, 0x50, 0xdb, 0x78, 0xa5, 0xd7, 0x72, 0xa8, 0xdb, 0xd4, 0x03, 0x3a, - 0x09, 0x98, 0xba, 0x05, 0x4a, 0xbc, 0x8f, 0x13, 0xa0, 0x60, 0xf1, 0x5f, 0x16, 0xe2, 0xa5, 0x96, - 0x38, 0x6e, 0x73, 0x1f, 0xe3, 0xb8, 0x25, 0xb7, 0xa0, 0xac, 0x42, 0x14, 0xbd, 0x1d, 0x4a, 0x43, - 0x1a, 0xa3, 0xc4, 0x47, 0xa5, 0x08, 0xf5, 0x33, 0xbb, 0x30, 0xfc, 0x99, 0x9d, 0xd0, 0x1b, 0x8e, - 0x9c, 0x4c, 0x6f, 0x28, 0x02, 0x40, 0x05, 0xe2, 0xd0, 0x1a, 0xd5, 0x03, 0x40, 0x65, 0x1c, 0x5c, - 0x2a, 0xba, 0x8c, 0x61, 0x85, 0x3f, 0x95, 0x10, 0x2e, 0x51, 0x0c, 0x2b, 0x4e, 0x9f, 0x15, 0xc3, - 0x2a, 0x22, 0x61, 0x07, 0xa0, 0xd9, 0x73, 0x79, 0xee, 0x8e, 0xf1, 0xf8, 0x00, 0xf4, 0x7b, 0xae, - 0x95, 0xcc, 0xdf, 0x11, 0x21, 0x1a, 0xff, 0x74, 0x24, 0x5b, 0xe0, 0x88, 0xd5, 0xea, 0x27, 0x10, - 0x38, 0x22, 0xa2, 0x4f, 0x67, 0xa6, 0x6e, 0xc3, 0x9c, 0xb4, 0x56, 0xc6, 0xda, 0x5b, 0xd4, 0xdf, - 0x36, 0x37, 0xc4, 0x10, 0xa3, 0x1a, 0x2b, 0xb2, 0x73, 0xee, 0x8a, 0x72, 0xab, 0xe7, 0x6b, 0x6a, - 0xac, 0x0c, 0xfa, 0xc5, 0x7f, 0x22, 0xb5, 0x74, 0xea, 0x20, 0xa0, 0x67, 0x79, 0x2e, 0x6b, 0x10, - 0x7a, 0x3d, 0x6d, 0x18, 0x75, 0x12, 0xbe, 0xf7, 0x46, 0x1a, 0xd5, 0x6d, 0x5d, 0xfe, 0x54, 0xb5, - 0xb0, 0x3a, 0x97, 0x04, 0x11, 0xd9, 0x83, 0xb3, 0xb1, 0x78, 0xae, 0xdc, 0x3e, 0x90, 0x23, 0x6f, - 0xf0, 0xc5, 0x47, 0x47, 0x4b, 0x2f, 0x29, 0xe2, 0xbd, 0x7a, 0x89, 0x49, 0x70, 0xef, 0xcf, 0x8b, - 0xed, 0xb7, 0x2b, 0xbe, 0xed, 0x36, 0xf7, 0x95, 0x39, 0x8f, 0xfb, 0xed, 0x0e, 0x42, 0x53, 0x61, - 0x6c, 0x62, 0x64, 0xe3, 0x6f, 0xe7, 0xb3, 0xd5, 0x1c, 0xe2, 0xf5, 0xe4, 0x04, 0x6a, 0x0e, 0x4e, - 0x71, 0xfc, 0x29, 0xf1, 0x8f, 0xe4, 0x29, 0xf1, 0x12, 0x8c, 0x6f, 0x51, 0xd7, 0x76, 0xa3, 0xf0, - 0x50, 0x68, 0xc5, 0x11, 0x72, 0x90, 0x29, 0xcb, 0xc8, 0xfb, 0x40, 0xea, 0xb6, 0x4f, 0xdd, 0x70, - 0xd5, 0xeb, 0x74, 0x6d, 0x3f, 0xec, 0x60, 0x76, 0x13, 0x7e, 0x34, 0x3c, 0xff, 0xe8, 0x68, 0xe9, - 0xd9, 0x2e, 0x96, 0x5a, 0x4d, 0xa5, 0x58, 0x15, 0x50, 0xd3, 0xc4, 0xe4, 0x32, 0x8c, 0x4b, 0xe3, - 0x84, 0x42, 0x1c, 0x31, 0x32, 0x6d, 0x98, 0x20, 0xb1, 0x8c, 0x7f, 0x39, 0x0a, 0xe7, 0x8e, 0x7b, - 0x2a, 0x22, 0xbb, 0x00, 0x77, 0xdc, 0x1d, 0xcf, 0xf6, 0x5b, 0x4c, 0x84, 0xce, 0x1d, 0x2b, 0x68, - 0xa9, 0xc4, 0x97, 0x62, 0x4a, 0x56, 0xc8, 0xbd, 0x66, 0xbd, 0x08, 0x66, 0x2a, 0x9c, 0xc9, 0x57, - 0xa1, 0x68, 0xd2, 0xa6, 0x77, 0x9f, 0x0a, 0x75, 0xe0, 0xe4, 0xf2, 0x67, 0x87, 0xad, 0x45, 0xd2, - 0x61, 0x1d, 0xe8, 0x4e, 0xe8, 0x0b, 0x88, 0x19, 0xf1, 0x24, 0x5f, 0x83, 0x49, 0x9e, 0xc4, 0xa6, - 0xb2, 0x1b, 0x0a, 0x95, 0xe1, 0xf1, 0xe1, 0x40, 0x72, 0x6c, 0x93, 0xe4, 0x69, 0x71, 0x2c, 0x7b, - 0x57, 0x73, 0x4f, 0xe0, 0xe1, 0x40, 0x14, 0x96, 0x8b, 0xff, 0x59, 0x1e, 0xa6, 0xf5, 0x06, 0x93, - 0x0d, 0x28, 0xd7, 0x5c, 0x27, 0x74, 0xec, 0xb6, 0x6e, 0xbe, 0x2a, 0xee, 0xad, 0x0e, 0x2f, 0xb3, - 0x32, 0xcd, 0x58, 0x53, 0x94, 0x6c, 0xce, 0xb0, 0xa1, 0x0b, 0x42, 0x6e, 0x35, 0xc1, 0xa3, 0xb7, - 0x8a, 0x45, 0xfc, 0x3c, 0x0f, 0x16, 0x1c, 0x97, 0x5a, 0x3c, 0x5e, 0xb2, 0x1e, 0x99, 0x32, 0x49, - 0x4c, 0xee, 0x03, 0xb9, 0xdd, 0x0b, 0x42, 0x5e, 0x42, 0xfd, 0x15, 0xba, 0xeb, 0xf9, 0xc3, 0xc4, - 0x01, 0x79, 0x45, 0x74, 0xce, 0x73, 0x9d, 0x5e, 0x10, 0x5a, 0xbe, 0x20, 0xb7, 0x76, 0x90, 0x3e, - 0xd1, 0x49, 0x19, 0x35, 0x2c, 0xde, 0x86, 0x92, 0x3a, 0x6a, 0x68, 0x45, 0xe6, 0x74, 0x1c, 0x69, - 0xcf, 0xcf, 0xad, 0xc8, 0x18, 0xc0, 0xe4, 0x70, 0xf2, 0x8c, 0x08, 0x9c, 0x95, 0x8f, 0x8d, 0xad, - 0xe2, 0x00, 0x59, 0xc6, 0x8f, 0xe4, 0xe0, 0x74, 0xb6, 0x05, 0x12, 0xf9, 0x28, 0xf1, 0x52, 0x9a, - 0x1b, 0xf4, 0x8e, 0x2c, 0xcd, 0x96, 0x3e, 0xde, 0x5b, 0xa9, 0xf1, 0x97, 0x47, 0x52, 0x52, 0x56, - 0x06, 0x47, 0x72, 0x23, 0x73, 0x1c, 0x73, 0xca, 0xb9, 0x98, 0x1e, 0xc7, 0xcc, 0xd1, 0x7b, 0x1b, - 0xa6, 0x91, 0x71, 0x3c, 0xb9, 0x14, 0x1d, 0x2b, 0xff, 0xe4, 0x78, 0x6a, 0x99, 0x09, 0x5c, 0x52, - 0x03, 0x82, 0x90, 0x15, 0x2f, 0x54, 0x1c, 0xd6, 0x95, 0x8b, 0x26, 0xe7, 0xb0, 0xe3, 0x85, 0x96, - 0xea, 0xba, 0x9e, 0x41, 0x44, 0x3e, 0x0f, 0x53, 0x72, 0x38, 0x57, 0xf1, 0x56, 0x33, 0x82, 0xc3, - 0x88, 0xf7, 0x21, 0xb9, 0x16, 0x2d, 0x14, 0x45, 0x4d, 0x1d, 0x91, 0x74, 0x78, 0x08, 0x23, 0x01, - 0xa4, 0xad, 0x4a, 0x38, 0x44, 0x9c, 0xa8, 0x97, 0xc5, 0xec, 0x7b, 0x9a, 0xa7, 0xad, 0x92, 0xb4, - 0x96, 0x1d, 0x26, 0xa6, 0x5e, 0x92, 0x37, 0xd9, 0x83, 0x29, 0x25, 0x9d, 0x55, 0x25, 0x1c, 0x22, - 0x9b, 0xda, 0x4b, 0xa2, 0xb2, 0xb3, 0x6a, 0x8e, 0xac, 0x74, 0x55, 0x3a, 0x5f, 0xe3, 0x27, 0xf2, - 0x30, 0xcd, 0x6f, 0x8b, 0xdc, 0x0c, 0xed, 0x89, 0xb5, 0x17, 0x7c, 0x4b, 0xb3, 0x17, 0x94, 0x21, - 0xcb, 0xd5, 0xa6, 0x0d, 0x65, 0xdd, 0xbd, 0x0f, 0x24, 0x4d, 0x43, 0x4c, 0x28, 0xa9, 0xd0, 0xc1, - 0xb6, 0x7d, 0x57, 0xe2, 0xe8, 0xf6, 0xe2, 0xb2, 0x8e, 0xd6, 0x9a, 0x81, 0xa9, 0xf1, 0x30, 0x7e, - 0x3c, 0x0f, 0x53, 0x8a, 0x75, 0xf7, 0x13, 0xdb, 0xf1, 0x5f, 0xd0, 0x3a, 0x7e, 0x21, 0x8a, 0xd8, - 0x11, 0xb5, 0x6c, 0xa8, 0x7e, 0xef, 0xc1, 0x6c, 0x8a, 0x24, 0x69, 0x24, 0x9f, 0x1b, 0xc6, 0x48, - 0xfe, 0xb5, 0x74, 0xa8, 0x6c, 0x9e, 0x28, 0x2f, 0x0a, 0x9c, 0xaa, 0xc6, 0xe6, 0xfe, 0xa9, 0x3c, - 0xcc, 0x8b, 0x5f, 0x98, 0x5b, 0x82, 0xab, 0x4b, 0x9e, 0xd8, 0xb1, 0xa8, 0x68, 0x63, 0xb1, 0xa4, - 0x8f, 0x85, 0xd2, 0xc0, 0xfe, 0x43, 0x62, 0xfc, 0x08, 0xc0, 0x42, 0x3f, 0x82, 0xa1, 0x43, 0x79, - 0xc5, 0xa1, 0x42, 0xf2, 0x43, 0x84, 0x0a, 0xd9, 0x80, 0x32, 0x56, 0x25, 0xdc, 0x9b, 0x82, 0x6d, - 0xb3, 0x26, 0x3a, 0x09, 0xa5, 0x0f, 0x9e, 0x00, 0x44, 0xf8, 0x44, 0x05, 0x09, 0x4d, 0x7e, 0x8a, - 0x92, 0xfc, 0x62, 0x0e, 0xa6, 0x11, 0xb8, 0x76, 0x9f, 0x89, 0x9b, 0x8c, 0xd9, 0x88, 0x88, 0x21, - 0x11, 0x59, 0x00, 0x36, 0x42, 0xdf, 0x71, 0xf7, 0x84, 0x09, 0xe0, 0x8e, 0x30, 0x01, 0x7c, 0x9b, - 0x9b, 0x2e, 0x5e, 0x6a, 0x7a, 0x9d, 0xcb, 0x7b, 0xbe, 0x7d, 0xdf, 0xe1, 0x8e, 0x0b, 0x76, 0xfb, - 0x72, 0x9c, 0xdf, 0xb5, 0xeb, 0x24, 0x32, 0xaf, 0x0a, 0x56, 0x68, 0x5e, 0xc9, 0x3f, 0x94, 0x62, - 0xb5, 0xc9, 0x07, 0x07, 0xfd, 0x8b, 0xc8, 0xf7, 0xc1, 0x19, 0xae, 0xba, 0x5d, 0xf5, 0xdc, 0xd0, - 0x71, 0x7b, 0x5e, 0x2f, 0x58, 0xb1, 0x9b, 0x07, 0xbd, 0x6e, 0x20, 0x22, 0xfd, 0x60, 0xcb, 0x9b, - 0x51, 0xa1, 0xb5, 0xc3, 0x4b, 0xb5, 0x68, 0x7b, 0xd9, 0x0c, 0xc8, 0x3a, 0xcc, 0xf2, 0xa2, 0x4a, - 0x2f, 0xf4, 0x1a, 0x4d, 0xbb, 0xcd, 0x04, 0xe2, 0x71, 0xe4, 0xca, 0xed, 0x9c, 0x7a, 0xa1, 0x67, - 0x05, 0x1c, 0xae, 0xbe, 0x3f, 0xa4, 0x88, 0x48, 0x0d, 0x66, 0x4c, 0x6a, 0xb7, 0x6e, 0xdb, 0x0f, - 0x57, 0xed, 0xae, 0xdd, 0x74, 0x42, 0x9e, 0x64, 0xa2, 0xc0, 0x55, 0x0a, 0x3e, 0xb5, 0x5b, 0x56, - 0xc7, 0x7e, 0x68, 0x35, 0x45, 0xa1, 0xfe, 0x86, 0xad, 0xd1, 0x45, 0xac, 0x1c, 0x37, 0x62, 0x35, - 0x91, 0x64, 0xe5, 0xb8, 0xfd, 0x59, 0xc5, 0x74, 0x92, 0x15, 0xcf, 0xf6, 0xc5, 0x5d, 0x31, 0xe1, - 0x5c, 0xee, 0x42, 0x4e, 0x61, 0x25, 0x52, 0x84, 0xa1, 0x5b, 0x66, 0x92, 0x95, 0x42, 0xc7, 0x66, - 0xde, 0x3d, 0xdf, 0x09, 0xa9, 0xda, 0xc2, 0x49, 0xfc, 0x2c, 0xec, 0x7f, 0x74, 0x62, 0xed, 0xd7, - 0xc4, 0x14, 0x65, 0xcc, 0x4d, 0x69, 0x64, 0x29, 0xc5, 0x2d, 0xbb, 0x95, 0x29, 0xca, 0x88, 0x9b, - 0xda, 0xce, 0x29, 0x6c, 0xa7, 0xc2, 0xad, 0x4f, 0x43, 0x53, 0x94, 0x64, 0x93, 0x75, 0x5a, 0xc8, - 0x6e, 0xee, 0x9e, 0x2b, 0x7c, 0x44, 0xa7, 0xf1, 0xd3, 0x5e, 0x14, 0x62, 0x43, 0xd9, 0x97, 0xc5, - 0x56, 0x86, 0xc7, 0x68, 0x92, 0x98, 0xfc, 0x05, 0x98, 0xd9, 0x0e, 0xe8, 0xf5, 0x5a, 0xbd, 0x21, - 0x43, 0x40, 0xe3, 0x93, 0xd9, 0xf4, 0xf2, 0x95, 0x63, 0x36, 0x9d, 0x4b, 0x2a, 0x0d, 0xa6, 0x4b, - 0xe5, 0xe3, 0xd6, 0x0b, 0xa8, 0xb5, 0xeb, 0x74, 0x83, 0x28, 0x9e, 0xbe, 0x3a, 0x6e, 0x89, 0xaa, - 0x8c, 0x75, 0x98, 0x4d, 0xb1, 0x21, 0xd3, 0x00, 0x0c, 0x68, 0x6d, 0x6f, 0x36, 0xd6, 0xb6, 0xca, - 0x4f, 0x91, 0x32, 0x94, 0xf0, 0xf7, 0xda, 0x66, 0x65, 0x65, 0x63, 0xad, 0x5a, 0xce, 0x91, 0x59, - 0x98, 0x42, 0x48, 0xb5, 0xd6, 0xe0, 0xa0, 0x3c, 0xcf, 0x72, 0x67, 0x96, 0xf9, 0xd2, 0x0d, 0xf1, - 0xb1, 0x85, 0x9d, 0x29, 0xc6, 0x5f, 0xcf, 0xc3, 0x59, 0x79, 0xac, 0xd0, 0xf0, 0x81, 0xe7, 0x1f, - 0x38, 0xee, 0xde, 0x13, 0x7e, 0x3a, 0x5c, 0xd7, 0x4e, 0x87, 0x17, 0x13, 0x27, 0x75, 0xa2, 0x95, - 0x03, 0x8e, 0x88, 0x6f, 0x4f, 0xc0, 0xb3, 0x03, 0xa9, 0xc8, 0xfb, 0xec, 0x34, 0x77, 0xa8, 0x1b, - 0xd6, 0x5a, 0x6d, 0xca, 0x44, 0x54, 0xaf, 0x17, 0x0a, 0x9f, 0xe4, 0x17, 0xf0, 0x45, 0x09, 0x0b, - 0x2d, 0xa7, 0xd5, 0xa6, 0x56, 0xc8, 0x8b, 0xb5, 0xe9, 0x96, 0xa6, 0x66, 0x2c, 0xa3, 0xd4, 0xcd, - 0x35, 0x37, 0xa4, 0xfe, 0x7d, 0xf4, 0xe5, 0x89, 0x58, 0x1e, 0x50, 0xda, 0xb5, 0x6c, 0x56, 0x6a, - 0x39, 0xa2, 0x58, 0x67, 0x99, 0xa2, 0x26, 0xd7, 0x15, 0x96, 0x28, 0xe5, 0xdf, 0xb6, 0x1f, 0x0a, - 0x7f, 0x00, 0x91, 0x52, 0x24, 0x62, 0xc9, 0xc3, 0x6b, 0x74, 0xec, 0x87, 0x66, 0x9a, 0x84, 0x7c, - 0x08, 0xa7, 0xc4, 0x01, 0x24, 0xc2, 0x3f, 0xca, 0x16, 0xf3, 0xe0, 0x92, 0x2f, 0xb3, 0x8b, 0x99, - 0x74, 0xe9, 0x95, 0x21, 0x5d, 0xb3, 0x5a, 0x9d, 0xcd, 0x85, 0x6c, 0xb1, 0x03, 0x39, 0xd1, 0x1d, - 0xb7, 0x69, 0x10, 0xc8, 0x18, 0x2a, 0x42, 0x37, 0xab, 0x76, 0xa6, 0xd5, 0xe1, 0xe5, 0x66, 0x5f, - 0x4a, 0xb2, 0x0e, 0xd3, 0xf7, 0xe8, 0x8e, 0x3a, 0x3e, 0x63, 0xd1, 0x56, 0x55, 0x7e, 0x40, 0x77, - 0xfa, 0x0f, 0x4e, 0x82, 0x8e, 0x38, 0xf8, 0xea, 0xfd, 0xf0, 0x70, 0x83, 0x5d, 0x9c, 0x5d, 0xea, - 0xe3, 0xfd, 0x77, 0x1c, 0x37, 0x83, 0x85, 0x58, 0x42, 0xd6, 0xcb, 0x85, 0xee, 0x08, 0xc3, 0x16, - 0xb4, 0x05, 0xdc, 0x4a, 0x24, 0x3e, 0x4e, 0x73, 0x25, 0x5f, 0x83, 0x19, 0xd3, 0xeb, 0x85, 0x8e, - 0xbb, 0xd7, 0x60, 0x37, 0x4c, 0xba, 0xc7, 0x0f, 0xa4, 0x38, 0x42, 0x75, 0xa2, 0x54, 0xd8, 0x5a, - 0x71, 0xa0, 0x15, 0x08, 0xa8, 0x76, 0x22, 0xe8, 0x04, 0xe4, 0xab, 0x30, 0xcd, 0xc3, 0xe8, 0x45, - 0x15, 0x4c, 0x68, 0xd9, 0x0f, 0xf5, 0xc2, 0xbb, 0x57, 0x84, 0xf9, 0x36, 0x42, 0xb3, 0x2a, 0x48, - 0x70, 0x23, 0x5f, 0x16, 0x9d, 0x55, 0x77, 0xdc, 0xbd, 0x68, 0x1a, 0x03, 0xf6, 0xfc, 0xeb, 0x71, - 0x97, 0x74, 0xd9, 0xe7, 0xca, 0x69, 0xdc, 0xc7, 0x17, 0x25, 0xcd, 0x87, 0x84, 0xf0, 0x6c, 0x25, - 0x08, 0x9c, 0x20, 0x14, 0x9e, 0xfb, 0x6b, 0x0f, 0x69, 0xb3, 0xc7, 0x90, 0xef, 0x79, 0xfe, 0x01, - 0xf5, 0xb9, 0x37, 0xe4, 0xe8, 0xca, 0xa5, 0x47, 0x47, 0x4b, 0xaf, 0xd8, 0x88, 0x68, 0x09, 0x67, - 0x7f, 0x8b, 0x4a, 0x54, 0xeb, 0x01, 0xc7, 0x55, 0xda, 0x30, 0x98, 0x29, 0xf9, 0x2a, 0x9c, 0x5e, - 0xb5, 0x03, 0x5a, 0x73, 0x03, 0xea, 0x06, 0x4e, 0xe8, 0xdc, 0xa7, 0xa2, 0x53, 0xf1, 0xf0, 0x2b, - 0xf2, 0xd0, 0xe4, 0x4d, 0x3b, 0x60, 0x0b, 0x33, 0x42, 0xb1, 0xc4, 0xa0, 0xa8, 0x91, 0xcf, 0xb3, - 0xb9, 0x10, 0x13, 0xa6, 0x1b, 0x8d, 0xf5, 0xaa, 0x63, 0x47, 0xeb, 0x6a, 0x0a, 0xfb, 0xeb, 0x15, - 0x7c, 0x5c, 0x0a, 0xf6, 0xad, 0x96, 0x63, 0x47, 0x0b, 0xaa, 0x4f, 0x67, 0x25, 0x38, 0x18, 0x47, - 0x39, 0x28, 0x27, 0x87, 0x92, 0x7c, 0x09, 0x26, 0xb8, 0x23, 0x07, 0x0d, 0xf6, 0x85, 0xfe, 0x45, - 0xfa, 0x05, 0x44, 0x70, 0x9d, 0x48, 0x44, 0xdf, 0xe1, 0x6e, 0x22, 0x54, 0x35, 0x1f, 0x5d, 0x7f, - 0xca, 0x8c, 0x99, 0x91, 0x16, 0x94, 0xf8, 0x68, 0x51, 0x8c, 0xae, 0x9f, 0x88, 0x67, 0xa0, 0x16, - 0x25, 0xf8, 0x73, 0xa3, 0x69, 0x3e, 0x27, 0x38, 0x82, 0x56, 0x85, 0xc6, 0x75, 0x05, 0xa0, 0x28, - 0x09, 0x8d, 0xb3, 0x70, 0xa6, 0xcf, 0x37, 0x1b, 0xf7, 0x51, 0xe7, 0xdc, 0xa7, 0x46, 0xf2, 0x25, - 0x98, 0x47, 0xc2, 0x55, 0xcf, 0x75, 0x69, 0x33, 0xc4, 0xed, 0x48, 0xbe, 0xff, 0x16, 0xb8, 0xe9, - 0x27, 0x6f, 0x6f, 0x33, 0x42, 0xb0, 0x92, 0xcf, 0xc0, 0x99, 0x1c, 0x8c, 0x9f, 0xcf, 0xc3, 0x82, - 0xd8, 0xe1, 0x4c, 0xda, 0xf4, 0x50, 0xfb, 0xf8, 0x84, 0x9f, 0xa8, 0x6b, 0xda, 0x89, 0xfa, 0x42, - 0x14, 0x46, 0x34, 0xab, 0x91, 0x03, 0x0e, 0xd4, 0x5f, 0xce, 0xc1, 0x33, 0x83, 0x88, 0x22, 0xad, - 0x62, 0x2e, 0x4b, 0xab, 0x48, 0xba, 0x30, 0x87, 0x03, 0xba, 0xba, 0x4f, 0x9b, 0x07, 0xc1, 0xba, - 0x17, 0x84, 0xe8, 0x9f, 0x9c, 0xef, 0x63, 0xc1, 0xf5, 0x5a, 0xa6, 0x05, 0xd7, 0x69, 0x3e, 0xcb, - 0x9a, 0xc8, 0x83, 0xe7, 0x3b, 0x38, 0xa0, 0x87, 0x81, 0x99, 0xc5, 0xda, 0xf8, 0xe9, 0x3c, 0xbb, - 0xb2, 0x85, 0xfb, 0x75, 0x9f, 0xee, 0x52, 0x9f, 0xba, 0x4d, 0xfa, 0x3d, 0xe6, 0x67, 0xaa, 0x37, - 0x6e, 0x28, 0x0d, 0xc6, 0xb7, 0xa6, 0x61, 0x3e, 0x8b, 0x8c, 0xf5, 0x8b, 0x72, 0x69, 0x2e, 0xca, - 0xc0, 0x00, 0xe2, 0xaa, 0xfc, 0xcd, 0x1c, 0x94, 0x1a, 0xb4, 0xe9, 0xb9, 0xad, 0xeb, 0x68, 0x62, - 0x2b, 0x7a, 0xc7, 0xe6, 0x42, 0x03, 0x83, 0x5b, 0xbb, 0x09, 0xdb, 0xdb, 0xef, 0x1e, 0x2d, 0x7d, - 0x71, 0xb8, 0xbb, 0x6a, 0xd3, 0x43, 0xdd, 0x67, 0x88, 0xa9, 0x0a, 0xa3, 0x2a, 0xf8, 0xd7, 0x98, - 0x5a, 0xb5, 0x64, 0x05, 0xa6, 0xc4, 0x82, 0xf5, 0xd4, 0x7c, 0x0c, 0x3c, 0xd6, 0xaa, 0x2c, 0x48, - 0x3d, 0x9f, 0x6a, 0x24, 0xe4, 0x2a, 0x14, 0xb6, 0x97, 0xaf, 0x8b, 0x51, 0x90, 0xe9, 0x1e, 0xb7, - 0x97, 0xaf, 0xa3, 0x42, 0x8c, 0x5d, 0x32, 0xa6, 0x7a, 0xcb, 0x9a, 0xf1, 0xea, 0xf6, 0xf2, 0x75, - 0xf2, 0x17, 0xe1, 0x54, 0xd5, 0x09, 0x44, 0x15, 0xdc, 0xe7, 0xb9, 0x85, 0x91, 0x3e, 0xc6, 0xfa, - 0xcc, 0xdf, 0xcf, 0x65, 0xce, 0xdf, 0xe7, 0x5b, 0x11, 0x13, 0x8b, 0x3b, 0x54, 0xb7, 0x92, 0x79, - 0x27, 0xb2, 0xeb, 0x21, 0x1f, 0xc1, 0x34, 0xbe, 0x8d, 0xa1, 0x1b, 0x38, 0x26, 0x3c, 0x1b, 0xef, - 0x53, 0xf3, 0x67, 0x32, 0x6b, 0x5e, 0xe4, 0x11, 0xf0, 0xd0, 0x99, 0x1c, 0x93, 0xa3, 0x69, 0xf7, - 0x7e, 0x8d, 0x33, 0xb9, 0x09, 0x33, 0x42, 0x00, 0xbb, 0xb3, 0xbb, 0xb5, 0x4f, 0xab, 0xf6, 0xa1, - 0xb0, 0x3b, 0xc5, 0x3b, 0x9d, 0x90, 0xda, 0x2c, 0x6f, 0xd7, 0x0a, 0xf7, 0xa9, 0xd5, 0xb2, 0x35, - 0x51, 0x25, 0x41, 0x48, 0xbe, 0x01, 0x93, 0x1b, 0x5e, 0x93, 0xc9, 0xde, 0xb8, 0x37, 0x70, 0x53, - 0xd4, 0x0f, 0xd8, 0x52, 0x6e, 0x73, 0x70, 0x42, 0xa0, 0xfa, 0xee, 0xd1, 0xd2, 0x5b, 0x27, 0x9d, - 0x36, 0x4a, 0x05, 0xa6, 0x5a, 0x1b, 0x59, 0x85, 0xe2, 0x3d, 0xba, 0xc3, 0x5a, 0x9b, 0x4c, 0x7d, - 0x2e, 0xc1, 0xc2, 0x48, 0x5d, 0xfc, 0xd2, 0x8c, 0xd4, 0x05, 0x8c, 0xf8, 0x30, 0x8b, 0xfd, 0x53, - 0xb7, 0x83, 0xe0, 0x81, 0xe7, 0xb7, 0x30, 0xe7, 0x64, 0x3f, 0x2b, 0xd7, 0xe5, 0xcc, 0xce, 0x7f, - 0x86, 0x77, 0x7e, 0x57, 0xe1, 0xa0, 0x8a, 0x90, 0x29, 0xf6, 0xe4, 0x6b, 0x30, 0x2d, 0xa2, 0x89, - 0xdd, 0xbe, 0x5e, 0xc1, 0x95, 0x50, 0xd2, 0xe2, 0xa5, 0xe8, 0x85, 0xf2, 0xbd, 0x0a, 0x61, 0x51, - 0x5c, 0x9e, 0xce, 0xae, 0xad, 0x3f, 0x3c, 0xab, 0x24, 0xa4, 0x0e, 0x93, 0x55, 0x7a, 0xdf, 0x69, - 0x52, 0x8c, 0xe9, 0x20, 0x5c, 0x20, 0xa3, 0x5c, 0xca, 0x71, 0x09, 0xd7, 0xc6, 0xb4, 0x10, 0xc0, - 0x23, 0x44, 0xe8, 0xee, 0x2b, 0x11, 0x22, 0xb9, 0x06, 0x85, 0x5a, 0xb5, 0x2e, 0x3c, 0x20, 0x67, - 0xa3, 0x98, 0x7d, 0x75, 0x99, 0x79, 0x16, 0xed, 0xc2, 0x9d, 0x96, 0xe6, 0x3f, 0x59, 0xab, 0xd6, - 0xc9, 0x2e, 0x4c, 0x61, 0x07, 0xac, 0x53, 0x9b, 0xf7, 0xed, 0x4c, 0x9f, 0xbe, 0xbd, 0x94, 0xd9, - 0xb7, 0x0b, 0xbc, 0x6f, 0xf7, 0x05, 0xb5, 0x96, 0x4a, 0x53, 0x65, 0xcb, 0x84, 0x5a, 0x91, 0xde, - 0x57, 0x26, 0x80, 0xdc, 0xda, 0x40, 0xbb, 0x57, 0x21, 0xd4, 0xca, 0x6c, 0xc0, 0x51, 0x46, 0xca, - 0xbe, 0x0e, 0xd6, 0x69, 0x3e, 0xe4, 0x0b, 0x30, 0x72, 0xe7, 0x20, 0xb4, 0x85, 0xaf, 0xa3, 0xec, - 0x47, 0x06, 0x92, 0xcd, 0x47, 0x3d, 0xa4, 0x77, 0xa0, 0x45, 0x81, 0x46, 0x1a, 0x36, 0x14, 0xeb, - 0xb6, 0xdf, 0x7a, 0x60, 0xfb, 0x18, 0x58, 0x67, 0x4e, 0x63, 0xa1, 0x94, 0xf0, 0xa1, 0xd8, 0x17, - 0x80, 0xc4, 0x03, 0xa7, 0xca, 0x82, 0x7c, 0x1f, 0x9c, 0x0d, 0x9c, 0x3d, 0xd7, 0x0e, 0x7b, 0x3e, - 0xb5, 0xec, 0xf6, 0x9e, 0xe7, 0x3b, 0xe1, 0x7e, 0xc7, 0x0a, 0x7a, 0x4e, 0x48, 0xd1, 0xe9, 0x70, - 0x3a, 0x92, 0x19, 0x1b, 0x12, 0xaf, 0x22, 0xd1, 0x1a, 0x0c, 0xcb, 0x3c, 0x13, 0x64, 0x17, 0x90, - 0x2f, 0xc3, 0x94, 0xba, 0x25, 0x07, 0x0b, 0xa7, 0xce, 0x15, 0x2e, 0x4c, 0x47, 0x57, 0x8f, 0xe4, - 0x16, 0x2e, 0xb3, 0xd0, 0x28, 0x67, 0x44, 0xa0, 0x67, 0xa1, 0x51, 0x78, 0x11, 0x13, 0xce, 0x04, - 0x5c, 0xbf, 0xd1, 0x73, 0x9d, 0x87, 0x98, 0x69, 0x58, 0xd8, 0x47, 0x2f, 0x9c, 0xd6, 0x8e, 0xbe, - 0x06, 0x62, 0x6d, 0x6f, 0xd6, 0xbe, 0xb4, 0x1d, 0x50, 0x5f, 0x98, 0x49, 0xcf, 0x73, 0xda, 0x6d, - 0xd7, 0x79, 0x18, 0x43, 0xb9, 0xf2, 0xe4, 0xe6, 0x48, 0x91, 0x94, 0xe7, 0xcc, 0x59, 0xb1, 0x0a, - 0xc4, 0xc8, 0xdd, 0xbe, 0x5e, 0x31, 0xc7, 0xeb, 0xb5, 0xbb, 0x8d, 0xb6, 0x17, 0x1a, 0xfb, 0x30, - 0x9f, 0xc5, 0x95, 0x2c, 0xc0, 0xb8, 0xc8, 0x77, 0x87, 0x87, 0x63, 0xd1, 0x94, 0x3f, 0xc9, 0xd3, - 0x30, 0xb1, 0xeb, 0xf8, 0x41, 0x68, 0xf5, 0x1c, 0x2e, 0x2f, 0x8c, 0x9a, 0x45, 0x04, 0x6c, 0x3b, - 0x2d, 0x72, 0x16, 0x8a, 0xf8, 0xc6, 0xc5, 0xca, 0x0a, 0x58, 0x36, 0xce, 0x7e, 0x6f, 0x3b, 0x2d, - 0xe3, 0xbf, 0xcc, 0xe1, 0x11, 0x44, 0x5e, 0xc1, 0xc0, 0xb4, 0x91, 0xfd, 0x09, 0xea, 0x9f, 0xed, - 0x6e, 0x22, 0x7f, 0x1c, 0x47, 0x21, 0xaf, 0xc1, 0xd8, 0x75, 0xbb, 0x49, 0x23, 0xb3, 0x06, 0x44, - 0xde, 0x45, 0x88, 0xaa, 0xac, 0xe6, 0x38, 0x4c, 0x3e, 0xe6, 0x4b, 0xb3, 0x12, 0x86, 0x34, 0xe0, - 0xfb, 0xe7, 0x6a, 0x45, 0x9a, 0x32, 0xa0, 0x7c, 0x2c, 0x96, 0xb4, 0x1d, 0x23, 0x24, 0xdc, 0xdc, - 0x32, 0x39, 0x18, 0x7f, 0x98, 0x8b, 0xf7, 0x54, 0xf2, 0x32, 0x8c, 0x98, 0xf5, 0xe8, 0xfb, 0x79, - 0xa8, 0x9f, 0xc4, 0xe7, 0x23, 0x02, 0xf9, 0x32, 0x9c, 0x52, 0xf8, 0xa4, 0x7c, 0xee, 0x5e, 0xc2, - 0x48, 0x34, 0xca, 0x97, 0x64, 0x3b, 0xde, 0x65, 0xf3, 0xc0, 0xcb, 0x40, 0x5c, 0x50, 0xa5, 0xae, - 0xc3, 0x79, 0x2b, 0x8d, 0x55, 0x79, 0xb7, 0x10, 0x21, 0xd9, 0xd8, 0x2c, 0x0e, 0x3c, 0x10, 0x8d, - 0xf1, 0x1b, 0x39, 0x6d, 0xaf, 0x24, 0xe7, 0x35, 0x39, 0x17, 0xd7, 0x75, 0x42, 0x29, 0xc0, 0x25, - 0xde, 0x37, 0x01, 0x2a, 0xbd, 0xd0, 0x5b, 0x73, 0x7d, 0xaf, 0xdd, 0x16, 0x51, 0xd4, 0x78, 0x88, - 0x8b, 0x5e, 0xe8, 0x59, 0x14, 0xc1, 0x5a, 0x88, 0x8b, 0x08, 0x39, 0xd3, 0x3d, 0xb1, 0xf0, 0x71, - 0xdd, 0x13, 0x8d, 0x9f, 0xcb, 0x6b, 0x3b, 0x0c, 0x93, 0x72, 0xc5, 0xa4, 0x57, 0x6d, 0xae, 0xbb, - 0xce, 0x7d, 0x2b, 0x68, 0x7b, 0x5a, 0x40, 0x3f, 0x81, 0x46, 0xfe, 0x72, 0x0e, 0x4e, 0x73, 0x3f, - 0xbf, 0xcd, 0x5e, 0x67, 0x87, 0xfa, 0x77, 0xed, 0xb6, 0xd3, 0x8a, 0xc3, 0x7e, 0xc7, 0x46, 0xfd, - 0x4a, 0x35, 0xd9, 0xf8, 0xfc, 0xa2, 0xcd, 0xfd, 0x0e, 0x2d, 0x17, 0x0b, 0xad, 0xfb, 0x51, 0xa9, - 0x7a, 0xd1, 0xce, 0xa6, 0x27, 0x35, 0x98, 0xac, 0x3b, 0x2e, 0xa6, 0x17, 0x8d, 0x23, 0x63, 0xbc, - 0xcc, 0xdd, 0x76, 0xd9, 0x14, 0x6e, 0xee, 0xd3, 0x01, 0x5b, 0xb7, 0x4a, 0x6b, 0xfc, 0x4a, 0x0e, - 0x9e, 0x3f, 0xf6, 0x83, 0xc9, 0x65, 0x18, 0x5f, 0x53, 0xd7, 0x3f, 0xb7, 0x04, 0x4a, 0xa7, 0xc0, - 0x94, 0x58, 0xe4, 0x2b, 0x70, 0x4a, 0x65, 0xb5, 0xe5, 0xdb, 0x8e, 0xea, 0xa1, 0x9c, 0xd1, 0x01, - 0x21, 0x43, 0x49, 0x8a, 0xad, 0xd9, 0x4c, 0x8c, 0xff, 0x27, 0x07, 0x13, 0x91, 0x8b, 0xd3, 0x13, - 0x7a, 0x9d, 0xb9, 0xa6, 0x5d, 0x67, 0x64, 0xfe, 0x84, 0xa8, 0x55, 0xdc, 0xf4, 0x28, 0xe3, 0x0a, - 0x3a, 0xa3, 0x38, 0x84, 0x21, 0xe0, 0x47, 0xf3, 0x30, 0xc9, 0xb6, 0x6a, 0xfe, 0xa6, 0xfd, 0xbd, - 0x15, 0x45, 0x3e, 0x6a, 0xd7, 0x50, 0x71, 0xbe, 0xff, 0x5d, 0x0e, 0xdf, 0x3a, 0x54, 0x0a, 0xd6, - 0x1b, 0x0c, 0xa4, 0xf6, 0x06, 0x3b, 0x51, 0x4d, 0x84, 0xf2, 0xa8, 0xc7, 0x1b, 0xa2, 0x27, 0x44, - 0xd4, 0xe3, 0xb6, 0xc9, 0x60, 0xe4, 0x8b, 0x30, 0xba, 0x8d, 0x9a, 0x5b, 0x3d, 0x4a, 0x5f, 0xc4, - 0x1f, 0x0b, 0xf9, 0x7e, 0xdf, 0x0b, 0xf4, 0x90, 0xd8, 0x9c, 0x90, 0x34, 0x60, 0x7c, 0xd5, 0xa7, - 0x76, 0x48, 0x5b, 0xa2, 0x43, 0x86, 0x8a, 0x31, 0xd5, 0xe4, 0x24, 0xc9, 0x18, 0x53, 0x82, 0x13, - 0xdb, 0xc7, 0x48, 0xdc, 0x46, 0xb4, 0xda, 0x09, 0x9e, 0xd8, 0x41, 0x7f, 0x4f, 0x1b, 0xf4, 0x67, - 0x53, 0x83, 0xce, 0x9b, 0x37, 0xd4, 0xd8, 0xff, 0x66, 0x0e, 0x4e, 0x67, 0x13, 0x92, 0x17, 0x60, - 0xec, 0xce, 0x56, 0x3d, 0xb6, 0x94, 0xc3, 0xa6, 0x78, 0x5d, 0x54, 0x9b, 0x98, 0xa2, 0x88, 0xbc, - 0x0e, 0x63, 0xef, 0x9b, 0xab, 0xb1, 0x41, 0x18, 0x6e, 0x70, 0x5f, 0x67, 0x92, 0x97, 0x76, 0xaa, - 0x09, 0x24, 0x75, 0x6c, 0x0b, 0x8f, 0x6d, 0x6c, 0x7f, 0x2a, 0x0f, 0x33, 0x95, 0x66, 0x93, 0x06, - 0x81, 0xc8, 0xda, 0xf5, 0xc4, 0x0e, 0x6c, 0x76, 0x08, 0x47, 0xad, 0x6d, 0x43, 0x8d, 0xea, 0x6f, - 0xe5, 0x78, 0x40, 0x56, 0x46, 0x75, 0xdf, 0xa1, 0x0f, 0xb6, 0xf6, 0x7d, 0x1a, 0xec, 0x7b, 0xed, - 0xd6, 0xd0, 0x59, 0x63, 0x99, 0xcc, 0x88, 0x99, 0xad, 0x54, 0x03, 0x87, 0x5d, 0x84, 0x68, 0x32, - 0x23, 0xcf, 0x7e, 0x75, 0x19, 0xc6, 0x2b, 0xdd, 0xae, 0xef, 0xdd, 0xe7, 0xcb, 0x5e, 0x04, 0xbd, - 0xb7, 0x39, 0x48, 0x8b, 0xaa, 0xc5, 0x41, 0xec, 0x33, 0xaa, 0xd4, 0x3d, 0x54, 0xcd, 0xd3, 0x5a, - 0xd4, 0x55, 0x2f, 0x25, 0x58, 0x6e, 0x34, 0x80, 0xd4, 0x7d, 0xaf, 0xe3, 0x85, 0xb4, 0xc5, 0xdb, - 0x83, 0xc1, 0xc8, 0x8e, 0x8d, 0x5f, 0xbc, 0xe5, 0x84, 0x6d, 0x2d, 0x7e, 0x71, 0xc8, 0x00, 0x26, - 0x87, 0xb3, 0xb3, 0xfb, 0x59, 0xad, 0x4f, 0xab, 0xfe, 0xa1, 0xd9, 0x73, 0xd7, 0x5c, 0xdf, 0x69, - 0xee, 0xa3, 0xdf, 0xec, 0x26, 0x80, 0x49, 0xed, 0xc0, 0x73, 0x15, 0x61, 0xed, 0x12, 0xcf, 0x99, - 0xcb, 0xa0, 0x69, 0xbd, 0xc3, 0xac, 0xe0, 0x14, 0x53, 0x99, 0x0a, 0x07, 0x52, 0x81, 0x29, 0xfe, - 0x8b, 0x35, 0xa6, 0x1b, 0x09, 0xe2, 0x4f, 0x73, 0x2f, 0x56, 0x64, 0xd9, 0xc5, 0x12, 0x3d, 0xc2, - 0x85, 0x42, 0x61, 0xfc, 0x9f, 0xa3, 0x50, 0x52, 0x87, 0x94, 0x18, 0x3c, 0x01, 0xa4, 0xe7, 0xab, - 0x31, 0x01, 0x6d, 0x84, 0x98, 0xa2, 0x24, 0x0e, 0xa8, 0x99, 0x3f, 0x36, 0xa0, 0xe6, 0x3d, 0x98, - 0xaa, 0xfb, 0x1e, 0xa6, 0x14, 0xc0, 0xd7, 0x66, 0xb1, 0x7f, 0xcf, 0x29, 0x5a, 0x03, 0x36, 0xfb, - 0xf0, 0x3d, 0x1b, 0xef, 0x65, 0x5d, 0x81, 0x6d, 0x31, 0xd1, 0x57, 0xd3, 0x99, 0x69, 0x7c, 0xb8, - 0xa9, 0x0c, 0x6b, 0x89, 0x9a, 0x28, 0x87, 0x37, 0x5a, 0x37, 0x95, 0x61, 0x10, 0x75, 0x83, 0x18, - 0x7d, 0x5c, 0x1b, 0x04, 0xf9, 0xb9, 0x1c, 0x4c, 0x56, 0x5c, 0x57, 0x04, 0xea, 0x3c, 0x26, 0xac, - 0xd8, 0x57, 0x84, 0xb5, 0xcc, 0x5b, 0x1f, 0xcb, 0x5a, 0x06, 0x85, 0xad, 0x00, 0x25, 0xf5, 0xb8, - 0x42, 0x2d, 0xd8, 0x4e, 0x0c, 0x26, 0x6f, 0x41, 0x39, 0x5a, 0x99, 0x35, 0xb7, 0x45, 0x1f, 0x52, - 0x9e, 0xff, 0x7f, 0x4a, 0xe4, 0x29, 0x52, 0x25, 0xf3, 0x24, 0x22, 0xd9, 0x02, 0xb0, 0xa3, 0x25, - 0x21, 0x1e, 0xf1, 0xce, 0xc6, 0x0f, 0x2e, 0x89, 0x35, 0x23, 0x6e, 0x0f, 0xf8, 0x1b, 0x1f, 0x24, - 0xd5, 0xdb, 0x43, 0xcc, 0x87, 0x74, 0x60, 0xa6, 0x12, 0x04, 0xbd, 0x0e, 0x6d, 0x84, 0xb6, 0x1f, - 0x62, 0x32, 0x42, 0x18, 0xde, 0x0c, 0xd4, 0x46, 0x52, 0x36, 0x23, 0xfc, 0xd0, 0xca, 0xc8, 0x4c, - 0x98, 0xe4, 0xcd, 0xb3, 0x42, 0x99, 0x67, 0xd2, 0xdf, 0xcb, 0x57, 0xea, 0x4f, 0xe5, 0xe0, 0xb4, - 0x3a, 0xe9, 0x1b, 0xbd, 0x1d, 0x91, 0x8a, 0x81, 0x5c, 0x82, 0x09, 0x31, 0x27, 0xa3, 0x4b, 0x64, - 0x3a, 0xa7, 0x62, 0x8c, 0x42, 0xd6, 0xd8, 0x34, 0x64, 0x3c, 0xc4, 0xad, 0x63, 0x2e, 0xb1, 0xb9, - 0xb2, 0xa2, 0x95, 0x85, 0x38, 0x29, 0x24, 0xfb, 0xad, 0xcf, 0x4f, 0x06, 0x31, 0xde, 0x85, 0x59, - 0x7d, 0x24, 0x1a, 0x34, 0x24, 0x17, 0x61, 0x5c, 0x0e, 0x5f, 0x2e, 0x7b, 0xf8, 0x64, 0xb9, 0x71, - 0x0f, 0x48, 0x8a, 0x3e, 0x40, 0xb3, 0x36, 0x76, 0x3f, 0xe7, 0x66, 0x97, 0xf2, 0x51, 0x39, 0x85, - 0xb8, 0x32, 0x27, 0xbe, 0x6f, 0x52, 0x73, 0x6c, 0xc4, 0xb4, 0x14, 0xbf, 0x55, 0x86, 0xb9, 0x8c, - 0x83, 0xe2, 0x18, 0x41, 0x6e, 0x49, 0xdf, 0x20, 0x26, 0xa2, 0xa8, 0x84, 0x72, 0x5b, 0x78, 0x17, - 0x46, 0x8f, 0xdd, 0x0e, 0xb8, 0x5b, 0x6b, 0x62, 0x17, 0xe0, 0x64, 0x9f, 0x8a, 0x30, 0xa7, 0x46, - 0x21, 0x1d, 0x7d, 0x6c, 0x51, 0x48, 0x31, 0x0c, 0x91, 0xb2, 0x89, 0xeb, 0xa1, 0x91, 0x78, 0x8e, - 0xd0, 0xd4, 0xb6, 0xa5, 0x93, 0x70, 0x1e, 0x81, 0xd7, 0xbe, 0x4f, 0x05, 0x8f, 0x71, 0x95, 0x07, - 0x16, 0x64, 0xf2, 0x50, 0x48, 0xc8, 0x3f, 0xc8, 0x01, 0x11, 0x10, 0x75, 0xcf, 0x2a, 0x0e, 0xda, - 0xb3, 0x5a, 0x8f, 0x67, 0xcf, 0x7a, 0x56, 0x7e, 0x63, 0xf6, 0xde, 0x95, 0xf1, 0x59, 0xe4, 0xef, - 0xe5, 0x60, 0x96, 0x47, 0xaf, 0x54, 0x3f, 0x76, 0x60, 0x44, 0xc2, 0xe6, 0xe3, 0xf9, 0xd8, 0x67, - 0x44, 0x76, 0xd8, 0xec, 0x6f, 0x4d, 0x7f, 0x14, 0xf9, 0x3e, 0x80, 0x68, 0x45, 0xf1, 0xd4, 0x1c, - 0x93, 0xcb, 0xcf, 0x64, 0xec, 0x02, 0x11, 0x52, 0x9c, 0x12, 0x31, 0x8c, 0xe8, 0xd4, 0x6d, 0x33, - 0xe6, 0x46, 0xfe, 0x22, 0x8f, 0xeb, 0x1f, 0x41, 0x44, 0xe0, 0xde, 0x85, 0x49, 0xac, 0xe5, 0xb3, - 0xfd, 0x05, 0xb9, 0x4b, 0x59, 0x64, 0x3c, 0x91, 0x4b, 0x64, 0x64, 0xed, 0x87, 0x9d, 0x64, 0x6c, - 0xff, 0x24, 0x05, 0xc6, 0xc3, 0xc6, 0xaf, 0xe7, 0x69, 0x0b, 0xfb, 0xec, 0x6f, 0x67, 0xe5, 0x5a, - 0xe0, 0xfb, 0x5b, 0xc2, 0x19, 0x09, 0x41, 0xe4, 0x7d, 0x20, 0x51, 0xd8, 0x47, 0x0e, 0xa3, 0x32, - 0xa5, 0x21, 0x7f, 0x2c, 0x88, 0xc3, 0x47, 0xfa, 0xb2, 0x58, 0x9d, 0x24, 0x69, 0x62, 0x42, 0x61, - 0x5e, 0x34, 0x9a, 0x41, 0xb9, 0x03, 0x71, 0xad, 0x1a, 0x2c, 0x4c, 0x6b, 0x61, 0x91, 0xe3, 0x92, - 0x95, 0xe7, 0x64, 0x06, 0xe0, 0xc8, 0x13, 0x59, 0x77, 0xe9, 0xcd, 0x64, 0x47, 0xae, 0xc1, 0x04, - 0x86, 0x2f, 0x59, 0x97, 0xc6, 0x7a, 0xc2, 0x70, 0x08, 0x03, 0x9d, 0x58, 0xfb, 0xba, 0xc9, 0x5d, - 0x8c, 0xca, 0xee, 0x30, 0x5c, 0x02, 0x44, 0x95, 0xbe, 0x50, 0xd2, 0xb4, 0xfc, 0x43, 0xcb, 0xef, - 0xe9, 0xa1, 0x71, 0x10, 0x89, 0x7c, 0x0d, 0x26, 0x6f, 0xdb, 0x0f, 0xa3, 0x4c, 0xc3, 0xb3, 0xc3, - 0xe7, 0x33, 0xee, 0xd8, 0x0f, 0xa3, 0x34, 0xc3, 0x49, 0x07, 0x26, 0x85, 0x25, 0xf9, 0x10, 0x40, - 0x79, 0x67, 0x20, 0xc7, 0x56, 0xf0, 0xbc, 0x0c, 0xf6, 0x9d, 0xf9, 0xfe, 0x80, 0xfc, 0x15, 0x86, - 0x09, 0xc9, 0x61, 0xfe, 0xd3, 0x93, 0x1c, 0x4e, 0x7d, 0x7a, 0x92, 0x03, 0x7f, 0xe6, 0xe2, 0x63, - 0x8f, 0x3b, 0xf8, 0xa1, 0xd0, 0xf2, 0x0f, 0xaa, 0xed, 0x19, 0x69, 0x0a, 0x8a, 0x47, 0xc1, 0x61, - 0xa2, 0x8a, 0x04, 0x3f, 0xe2, 0x43, 0x39, 0x79, 0x31, 0x58, 0x38, 0xa3, 0x59, 0x16, 0x0e, 0xbc, - 0x44, 0x70, 0x75, 0xab, 0x98, 0x46, 0x16, 0x8d, 0xe0, 0xaa, 0x50, 0x97, 0xa4, 0x59, 0xdc, 0x81, - 0xb3, 0x7d, 0x37, 0x84, 0x8c, 0xdc, 0x35, 0x97, 0xf5, 0xdc, 0x35, 0x67, 0xfb, 0x09, 0x0e, 0x81, - 0x9e, 0x8f, 0x73, 0xae, 0x3c, 0xdf, 0x5f, 0xe6, 0xfa, 0x4e, 0x3e, 0x21, 0x48, 0x88, 0x3b, 0x1e, - 0xcf, 0x5e, 0xdd, 0x4f, 0xd2, 0xca, 0xd7, 0xaa, 0xec, 0x52, 0x87, 0xa2, 0x86, 0x92, 0x3d, 0x8c, - 0x89, 0x1a, 0xaa, 0xa8, 0x82, 0x42, 0xc7, 0x27, 0x95, 0x29, 0xde, 0x86, 0xe9, 0x06, 0xb5, 0xfd, - 0xe6, 0xfe, 0x2d, 0x7a, 0xf8, 0xc0, 0xf3, 0x5b, 0x3c, 0xcb, 0xad, 0xb8, 0x59, 0x04, 0x58, 0xa2, - 0x87, 0x6c, 0x50, 0x71, 0x49, 0x55, 0xc6, 0xe4, 0x18, 0xc5, 0xda, 0xcf, 0x66, 0xee, 0xcd, 0x0c, - 0x61, 0x50, 0xb8, 0x0e, 0xf2, 0x46, 0x24, 0x7e, 0x52, 0x5f, 0xcd, 0xca, 0xe9, 0x4b, 0x60, 0x86, - 0x14, 0x4a, 0x7d, 0xe3, 0xf7, 0x0a, 0x40, 0x78, 0x4d, 0xab, 0x76, 0xd7, 0xc6, 0x28, 0x38, 0x0e, - 0x86, 0xba, 0x2d, 0x0b, 0x1c, 0x7b, 0xa7, 0x4d, 0xd5, 0x38, 0xd1, 0xc2, 0xe4, 0x3b, 0x2a, 0xb3, - 0x92, 0xd7, 0xb7, 0x14, 0x61, 0x9f, 0x0d, 0x3c, 0xff, 0x49, 0x36, 0xf0, 0xaf, 0xc1, 0xd3, 0x95, - 0x6e, 0xb7, 0xed, 0x34, 0xa3, 0x5a, 0xae, 0x7b, 0xbe, 0x5c, 0x2e, 0x5a, 0x2c, 0x04, 0x3b, 0x42, - 0x4b, 0x7d, 0xe9, 0x20, 0x16, 0x8a, 0xf4, 0xc5, 0x2f, 0xbc, 0x6a, 0xbc, 0x2e, 0x29, 0x7d, 0x65, - 0x5d, 0x91, 0x15, 0x12, 0xc9, 0xc3, 0xf1, 0xa5, 0xf4, 0x35, 0x1a, 0x67, 0x9f, 0x91, 0x2f, 0xdc, - 0xd9, 0x12, 0x5c, 0x44, 0x42, 0xde, 0x86, 0xc9, 0x4a, 0x2f, 0xf4, 0x04, 0x63, 0xe1, 0xab, 0x10, - 0x7b, 0x15, 0x88, 0x4f, 0xd1, 0x2e, 0x74, 0x31, 0xba, 0xf1, 0x07, 0x05, 0x38, 0x9b, 0x1e, 0x5e, - 0x51, 0x1a, 0xad, 0x8f, 0xdc, 0x31, 0xeb, 0x23, 0x6b, 0x36, 0xe4, 0xe3, 0x7c, 0x84, 0x8f, 0x63, - 0x36, 0xf0, 0x08, 0x3c, 0x1f, 0x73, 0x36, 0x34, 0x60, 0x52, 0x3d, 0xc5, 0x47, 0x3e, 0xee, 0x29, - 0xae, 0x72, 0x21, 0x17, 0x61, 0x94, 0x87, 0x29, 0x1b, 0x8d, 0x1f, 0x04, 0x93, 0x11, 0xca, 0x38, - 0x06, 0xf9, 0xff, 0xc1, 0x39, 0xbe, 0x27, 0x25, 0x1b, 0xbb, 0x72, 0x28, 0x39, 0x8a, 0x81, 0x5b, - 0x7e, 0x74, 0xb4, 0x74, 0x89, 0x6b, 0xad, 0xac, 0x54, 0xb7, 0x59, 0x3b, 0x87, 0x96, 0xfc, 0x32, - 0xa5, 0x92, 0x63, 0x79, 0x1b, 0x0f, 0xe1, 0xac, 0x28, 0x8d, 0x83, 0xd9, 0xc8, 0x42, 0x36, 0xc8, - 0x07, 0xb1, 0xe2, 0x11, 0x07, 0x39, 0xa1, 0x53, 0xc4, 0x72, 0x72, 0x15, 0x8a, 0x95, 0x7a, 0x8d, - 0x67, 0x48, 0x57, 0x42, 0x11, 0xd9, 0x5d, 0x87, 0x47, 0x5d, 0xd1, 0xa2, 0x1b, 0x08, 0x44, 0xe3, - 0xd7, 0x73, 0x00, 0x71, 0xa7, 0x91, 0xd7, 0xb3, 0xdc, 0xc7, 0x78, 0x8a, 0x2b, 0x0e, 0xd6, 0x3d, - 0xc7, 0xa4, 0x4e, 0x34, 0x9f, 0xa9, 0x13, 0x95, 0x4a, 0xb5, 0x42, 0xa6, 0x52, 0xad, 0x0a, 0x33, - 0x8d, 0xde, 0x8e, 0xac, 0x3b, 0x19, 0xfc, 0x22, 0xe8, 0xed, 0x64, 0x75, 0x65, 0x92, 0xc4, 0xf8, - 0xb1, 0x3c, 0x94, 0xea, 0xed, 0xde, 0x9e, 0xe3, 0x56, 0xed, 0xd0, 0x7e, 0x62, 0xd5, 0xb4, 0x6f, - 0x6a, 0x6a, 0xda, 0xc8, 0x4b, 0x32, 0x6a, 0xd8, 0x50, 0x3a, 0xda, 0x9f, 0xcd, 0xc1, 0x4c, 0x4c, - 0xc2, 0x4f, 0xf8, 0x75, 0x18, 0x61, 0x3f, 0x84, 0x1e, 0xe0, 0x5c, 0x8a, 0x31, 0x62, 0x5d, 0x8a, - 0xfe, 0x12, 0x8a, 0x53, 0x3d, 0x3d, 0x38, 0x72, 0x58, 0xfc, 0x1c, 0x4c, 0xc4, 0x6c, 0xd3, 0x82, - 0xc3, 0xbc, 0x2a, 0x38, 0x4c, 0xa8, 0xd9, 0xed, 0x7e, 0x35, 0x07, 0xe5, 0x64, 0x4b, 0xc8, 0x2d, - 0x18, 0x67, 0x9c, 0x1c, 0x2a, 0x55, 0x14, 0x2f, 0xf6, 0x69, 0xf3, 0x25, 0x81, 0xc6, 0x3f, 0x0f, - 0x3b, 0x9f, 0x72, 0x88, 0x29, 0x39, 0x2c, 0x9a, 0x50, 0x52, 0xb1, 0x32, 0xbe, 0xee, 0x35, 0x5d, - 0xac, 0x39, 0x9d, 0xdd, 0x0f, 0xea, 0x57, 0xff, 0x0d, 0xed, 0xab, 0x85, 0xc4, 0x72, 0x5e, 0x9b, - 0x5c, 0x99, 0x4b, 0x11, 0x27, 0x0d, 0x26, 0xf1, 0x13, 0xfb, 0x46, 0x5e, 0x0d, 0x2f, 0x99, 0x9a, - 0xd0, 0x11, 0x1e, 0x79, 0x0d, 0xc6, 0x78, 0x7d, 0x6a, 0xae, 0xf0, 0x2e, 0x42, 0xd4, 0x2b, 0x03, - 0xc7, 0x31, 0xfe, 0x66, 0x01, 0x4e, 0xc7, 0x9f, 0xb7, 0xdd, 0x6d, 0xd9, 0x21, 0xad, 0xdb, 0xbe, - 0xdd, 0x09, 0x8e, 0x59, 0x01, 0x17, 0x52, 0x9f, 0x26, 0xc2, 0x2a, 0x70, 0x98, 0xf2, 0x41, 0x46, - 0xe2, 0x83, 0x50, 0x1d, 0xcc, 0x3f, 0x48, 0x7e, 0x06, 0xb9, 0x05, 0x85, 0x06, 0x0d, 0xc5, 0x86, - 0x7d, 0x3e, 0xd5, 0xab, 0xea, 0x77, 0x5d, 0x6a, 0xd0, 0x90, 0x0f, 0x22, 0x0f, 0xdc, 0xa9, 0x05, - 0x30, 0x60, 0x5c, 0xc8, 0x3d, 0x18, 0x5b, 0x7b, 0xd8, 0xa5, 0xcd, 0x10, 0xb3, 0x35, 0x29, 0x9e, - 0xfc, 0xd9, 0xfc, 0x38, 0x2e, 0x67, 0x39, 0x2f, 0x64, 0x70, 0x3d, 0x43, 0xa2, 0x60, 0xb7, 0x78, - 0x0d, 0x8a, 0xb2, 0xf2, 0x93, 0xcc, 0xdc, 0xc5, 0x37, 0x61, 0x52, 0xa9, 0xe4, 0x44, 0x93, 0xfe, - 0x17, 0xd8, 0xbe, 0xea, 0xb5, 0xa9, 0x98, 0x38, 0x6b, 0x29, 0x01, 0x53, 0x49, 0x74, 0xcc, 0x05, - 0x4c, 0xeb, 0x40, 0x14, 0x0d, 0x90, 0x34, 0x6b, 0x30, 0xd3, 0x38, 0x70, 0xba, 0x71, 0x72, 0x0f, - 0xed, 0x18, 0xc7, 0x64, 0xaa, 0x42, 0x87, 0x91, 0x3c, 0xc6, 0x93, 0x74, 0xc6, 0x9f, 0xe4, 0x60, - 0x8c, 0xfd, 0x75, 0xf7, 0xda, 0x13, 0xba, 0x65, 0x5e, 0xd5, 0xb6, 0xcc, 0x59, 0x25, 0x59, 0x17, - 0x6e, 0x1c, 0xd7, 0x8e, 0xd9, 0x2c, 0x8f, 0xc4, 0x00, 0x71, 0x64, 0x72, 0x03, 0xc6, 0x85, 0x6d, - 0x9c, 0x70, 0x63, 0x50, 0xb3, 0x7f, 0x49, 0xab, 0xb9, 0x48, 0xd9, 0xe1, 0x75, 0x93, 0xda, 0x21, - 0x49, 0xcd, 0x2e, 0x03, 0x32, 0xcd, 0x8a, 0x9a, 0xfc, 0x93, 0xb1, 0x59, 0xf5, 0x5c, 0x9e, 0xbb, - 0x2a, 0x58, 0x39, 0x23, 0x38, 0xf5, 0x0b, 0x54, 0x54, 0x11, 0xaf, 0x59, 0x85, 0x41, 0x4c, 0x4e, - 0x0b, 0x26, 0xd9, 0x0f, 0x5d, 0x1d, 0x38, 0xdd, 0x68, 0xac, 0xa3, 0x1d, 0x6d, 0xdd, 0xf3, 0xc3, - 0xeb, 0x9e, 0xff, 0x40, 0xc4, 0x63, 0x69, 0xe8, 0x36, 0x24, 0x59, 0xd6, 0x8d, 0x2f, 0x67, 0x5a, - 0x37, 0x0e, 0xb0, 0x33, 0x31, 0x5c, 0x38, 0xd3, 0x68, 0xac, 0xf3, 0xcc, 0x51, 0x7f, 0x1a, 0xf5, - 0xfd, 0x6a, 0x0e, 0x66, 0x1b, 0x8d, 0xf5, 0x44, 0x55, 0x1b, 0x32, 0x65, 0x55, 0x4e, 0x7b, 0xc8, - 0xce, 0xee, 0x08, 0x1c, 0x85, 0x1c, 0x17, 0x0b, 0x9b, 0x5a, 0xe0, 0x71, 0xce, 0x84, 0xd4, 0xa3, - 0x24, 0x59, 0x79, 0xcd, 0xb5, 0xa5, 0x4f, 0x43, 0x51, 0xd9, 0x2f, 0x1c, 0x43, 0x59, 0xa9, 0xae, - 0xec, 0x67, 0x10, 0xe3, 0x5f, 0x9c, 0xe6, 0x69, 0xb8, 0xe4, 0x6c, 0x79, 0x07, 0x4a, 0x82, 0x1e, - 0xfd, 0x3f, 0x84, 0x4d, 0xcf, 0x59, 0xb6, 0x41, 0xee, 0x72, 0x38, 0xcf, 0xa8, 0xf2, 0xdd, 0xa3, - 0xa5, 0x11, 0xd6, 0x35, 0xa6, 0x86, 0x4e, 0xee, 0xc0, 0xd4, 0x6d, 0xfb, 0xa1, 0xa2, 0xd9, 0xe1, - 0xde, 0x7d, 0x17, 0xd9, 0xae, 0xd2, 0xb1, 0x1f, 0x0e, 0x61, 0x3d, 0xaa, 0xd3, 0x93, 0x03, 0x98, - 0xd6, 0xdb, 0x24, 0x66, 0x60, 0x7a, 0xc4, 0xae, 0x64, 0x8e, 0xd8, 0xd9, 0xae, 0xe7, 0x87, 0xd6, - 0x6e, 0x44, 0xae, 0xa5, 0x9c, 0x4b, 0xb0, 0x26, 0xef, 0xc0, 0xac, 0x12, 0xde, 0xfd, 0xba, 0xe7, - 0x77, 0x6c, 0x79, 0x4b, 0xc3, 0xe7, 0x0e, 0x34, 0x2b, 0xdb, 0x45, 0xb0, 0x99, 0xc6, 0x24, 0x5f, - 0xce, 0xf2, 0x98, 0x1c, 0x8d, 0x4d, 0x68, 0x33, 0x3c, 0x26, 0xfb, 0x99, 0xd0, 0xa6, 0x7d, 0x27, - 0xf7, 0x06, 0x99, 0xd8, 0x17, 0x79, 0xeb, 0x87, 0x32, 0xa1, 0x8f, 0x46, 0xae, 0x8f, 0x29, 0xfd, - 0x32, 0x14, 0x56, 0xea, 0xd7, 0xf1, 0x91, 0x4e, 0xda, 0xd3, 0xb9, 0xfb, 0xb6, 0xdb, 0xc4, 0xdb, - 0x93, 0x70, 0x6c, 0x51, 0x0f, 0xca, 0x95, 0xfa, 0x75, 0x62, 0xc3, 0x1c, 0xa6, 0x10, 0x0f, 0xbf, - 0x74, 0xe5, 0x8a, 0x32, 0x54, 0x45, 0xfc, 0xb4, 0xcb, 0xe2, 0xd3, 0x96, 0x30, 0x01, 0x79, 0x68, - 0x3d, 0xbc, 0x72, 0x25, 0x73, 0x40, 0xa2, 0x0f, 0xcb, 0xe2, 0xc5, 0x0e, 0xac, 0xdb, 0xf6, 0xc3, - 0xd8, 0x1f, 0x29, 0x10, 0xbe, 0xe7, 0xcf, 0xca, 0xa9, 0x15, 0xfb, 0x32, 0x69, 0x07, 0x96, 0x4e, - 0xc4, 0x2e, 0xbf, 0xf1, 0x04, 0x0b, 0x84, 0xd7, 0xde, 0xa2, 0xd4, 0x5c, 0xca, 0x00, 0x05, 0xea, - 0x0d, 0x4e, 0x41, 0x27, 0xdb, 0xd1, 0x15, 0x9e, 0x5f, 0x81, 0xd1, 0xd0, 0x7d, 0x62, 0xe5, 0xb2, - 0x7a, 0x85, 0xe7, 0xfa, 0x42, 0xad, 0x59, 0x33, 0x91, 0xde, 0x87, 0x3b, 0x68, 0x99, 0x3a, 0x97, - 0xb4, 0x66, 0xa0, 0x74, 0x72, 0xcd, 0x00, 0x85, 0x91, 0x0d, 0xaf, 0x79, 0x20, 0xa2, 0x27, 0xbf, - 0xcf, 0x76, 0xe1, 0xb6, 0xd7, 0x3c, 0x78, 0x7c, 0xae, 0x03, 0xc8, 0x9e, 0x6c, 0xf2, 0xe8, 0x3b, - 0x7e, 0x4b, 0xf4, 0x89, 0x30, 0x47, 0x9f, 0x8f, 0xae, 0xc6, 0x4a, 0x59, 0x1c, 0x93, 0xc7, 0x6f, - 0xc9, 0xae, 0x35, 0x75, 0x72, 0x42, 0xa1, 0x5c, 0xa5, 0xc1, 0x41, 0xe8, 0x75, 0x57, 0xdb, 0x4e, - 0x17, 0x03, 0x5a, 0x89, 0xf4, 0x3b, 0x43, 0xef, 0xc9, 0x2d, 0x4e, 0x6f, 0x35, 0x25, 0x03, 0x33, - 0xc5, 0x92, 0x7c, 0x19, 0xa6, 0xd9, 0xe4, 0x5e, 0x7b, 0x18, 0x52, 0x97, 0x8f, 0xfc, 0x2c, 0x4a, - 0x74, 0xf3, 0x4a, 0xf2, 0xca, 0xa8, 0x90, 0xcf, 0x29, 0x5c, 0xec, 0x34, 0x22, 0xd0, 0x22, 0x4f, - 0x6b, 0xac, 0x48, 0x0b, 0x16, 0x6e, 0xdb, 0x0f, 0xe3, 0x8b, 0xb2, 0x3a, 0x49, 0x09, 0x4e, 0xb0, - 0x0b, 0x8f, 0x8e, 0x96, 0x5e, 0x64, 0x13, 0x2c, 0xce, 0x08, 0xd5, 0x67, 0xbe, 0xf6, 0xe5, 0x44, - 0xbe, 0x01, 0x67, 0x44, 0xb3, 0xaa, 0x98, 0x64, 0xdb, 0xf3, 0x0f, 0x1b, 0xfb, 0x36, 0xba, 0x22, - 0xce, 0xf5, 0xe9, 0xb0, 0xcb, 0xd9, 0x5b, 0xa2, 0xec, 0xb0, 0x96, 0xe4, 0x63, 0x05, 0x9c, 0x91, - 0xd9, 0xaf, 0x06, 0xf2, 0x11, 0x4c, 0xf3, 0x97, 0xc9, 0x75, 0x2f, 0x08, 0x51, 0xc3, 0x33, 0x7f, - 0x32, 0xff, 0x1a, 0xfe, 0xdc, 0xc9, 0x7d, 0xd2, 0x12, 0x1a, 0xa1, 0x04, 0x67, 0xf2, 0x16, 0x9a, - 0xb0, 0xf2, 0xd8, 0xf0, 0xb5, 0x3a, 0x6a, 0xd8, 0xc5, 0x09, 0xd4, 0x75, 0x5c, 0x4b, 0xaa, 0x59, - 0xba, 0xd1, 0x76, 0xa1, 0x62, 0x93, 0x7b, 0x30, 0xd9, 0x68, 0xac, 0x5f, 0x77, 0x98, 0x5c, 0xd2, - 0x95, 0x0a, 0xf3, 0xf4, 0x57, 0xbe, 0x90, 0xf9, 0x95, 0x53, 0x41, 0xb0, 0x6f, 0x61, 0x1e, 0xe8, - 0xa6, 0xd7, 0x3d, 0x34, 0x55, 0x4e, 0x19, 0x3e, 0x27, 0x67, 0x1e, 0xb3, 0xcf, 0x49, 0x0d, 0x66, - 0x14, 0x3b, 0x6a, 0x34, 0xcb, 0x59, 0x88, 0x83, 0x7f, 0xaa, 0x3e, 0x26, 0x49, 0x2f, 0xeb, 0x24, - 0x9d, 0x74, 0x36, 0x39, 0x7b, 0x52, 0x67, 0x13, 0x07, 0x66, 0xf9, 0x60, 0x88, 0x79, 0x80, 0x23, - 0xbd, 0xd8, 0xa7, 0x0f, 0x2f, 0x66, 0xf6, 0xe1, 0x9c, 0x18, 0x69, 0x39, 0xc9, 0xf0, 0x25, 0x3e, - 0xcd, 0x95, 0xec, 0x02, 0x11, 0x40, 0x3b, 0xb4, 0x77, 0xec, 0x80, 0x62, 0x5d, 0x4f, 0xf7, 0xa9, - 0xeb, 0xc5, 0xcc, 0xba, 0xa6, 0x65, 0x5d, 0x3b, 0xbc, 0x9a, 0x0c, 0x8e, 0xc4, 0x95, 0xf5, 0xc8, - 0xf9, 0x85, 0x1d, 0xfb, 0x8c, 0xa6, 0x18, 0x4f, 0x23, 0xf0, 0x38, 0x9a, 0xc9, 0x49, 0x9b, 0xec, - 0xf7, 0x0c, 0xce, 0xe4, 0x21, 0x9c, 0x4e, 0x7f, 0x05, 0xd6, 0xf9, 0x2c, 0xd6, 0xf9, 0xac, 0x56, - 0x67, 0x12, 0x89, 0xcf, 0x1b, 0xbd, 0x59, 0xc9, 0x5a, 0xfb, 0xf0, 0x27, 0x3f, 0x92, 0x83, 0x33, - 0xb7, 0xaf, 0x57, 0xee, 0x52, 0x9f, 0x8b, 0x25, 0x8e, 0xe7, 0x46, 0xde, 0xe9, 0xcf, 0x89, 0xc7, - 0x93, 0xe4, 0xc3, 0x91, 0x94, 0x38, 0x70, 0xab, 0x60, 0xa2, 0xfb, 0x0b, 0x9d, 0x5d, 0xdb, 0xba, - 0xaf, 0xb0, 0xc8, 0x70, 0x61, 0xff, 0xd6, 0xef, 0x2f, 0xe5, 0xcc, 0x7e, 0x55, 0x91, 0x36, 0x2c, - 0xea, 0xdd, 0x22, 0xdd, 0x81, 0xf6, 0x69, 0xbb, 0xbd, 0xb0, 0x84, 0x33, 0xfa, 0xb5, 0x47, 0x47, - 0x4b, 0x17, 0x52, 0xbd, 0x1b, 0xb9, 0x18, 0x31, 0x4c, 0xa5, 0xc1, 0x03, 0xf8, 0x91, 0x4e, 0x86, - 0xd0, 0xbd, 0x70, 0x4e, 0x0b, 0x63, 0x95, 0x2a, 0x8f, 0xc2, 0xac, 0x3d, 0xcb, 0xd6, 0x7b, 0x5f, - 0x01, 0xd1, 0x4c, 0x73, 0xbe, 0x39, 0x52, 0x9c, 0x2a, 0x4f, 0x67, 0xf8, 0xc9, 0x18, 0xdf, 0xce, - 0x27, 0x0e, 0x46, 0x52, 0x83, 0x71, 0x31, 0xdf, 0xfb, 0x5e, 0x32, 0x9e, 0xcd, 0x9c, 0xd5, 0xe3, - 0x62, 0xe9, 0x98, 0x92, 0x9e, 0x3c, 0x60, 0xac, 0xb0, 0xd1, 0xe2, 0xc6, 0xfb, 0x21, 0x3f, 0xf7, - 0x10, 0xa4, 0x9d, 0xf0, 0xd5, 0x93, 0xfb, 0x94, 0xea, 0x2e, 0xcb, 0x78, 0xd4, 0xcb, 0xda, 0xc8, - 0x01, 0xcf, 0x25, 0x5c, 0x88, 0xdc, 0x12, 0xf5, 0xc4, 0xc1, 0x8f, 0xad, 0x42, 0x56, 0x8b, 0xf1, - 0x1b, 0x39, 0x98, 0xd2, 0x4e, 0x56, 0x72, 0x4d, 0xf1, 0xba, 0x8d, 0x03, 0x51, 0x68, 0x38, 0xb8, - 0xd9, 0x26, 0xfd, 0x71, 0xaf, 0x29, 0x01, 0x1c, 0xfb, 0xd0, 0xe1, 0x62, 0x4b, 0x3a, 0x61, 0x0f, - 0xd6, 0x0f, 0x2f, 0xc1, 0x28, 0x8f, 0xe0, 0x33, 0x12, 0x1b, 0x5d, 0xa2, 0x7e, 0xc5, 0xe4, 0x70, - 0xe3, 0x3f, 0x5d, 0x82, 0x69, 0xfd, 0x46, 0x4c, 0x5e, 0x83, 0x31, 0x54, 0xe8, 0x4b, 0xf5, 0x0a, - 0xaa, 0x85, 0x50, 0xe7, 0xaf, 0xf9, 0x25, 0x71, 0x1c, 0xf2, 0x12, 0x40, 0x64, 0xc0, 0x2f, 0x9f, - 0xb3, 0x46, 0x1f, 0x1d, 0x2d, 0xe5, 0x5e, 0x37, 0x95, 0x02, 0xf2, 0x55, 0x80, 0x4d, 0xaf, 0x45, - 0x45, 0x6a, 0xcc, 0xc2, 0x20, 0x43, 0x94, 0x97, 0x53, 0xa9, 0x31, 0x4f, 0xb9, 0x5e, 0x8b, 0xa6, - 0xf3, 0x60, 0x2a, 0x1c, 0xc9, 0x17, 0x60, 0xd4, 0xec, 0xb5, 0xa9, 0x7c, 0xf6, 0x98, 0x94, 0x27, - 0x5c, 0xaf, 0x4d, 0x63, 0x3d, 0x81, 0xdf, 0x4b, 0xda, 0x58, 0x32, 0x00, 0x79, 0x8f, 0xa7, 0xcc, - 0x14, 0x01, 0xd7, 0x47, 0xe3, 0x07, 0x3e, 0x45, 0xf2, 0x49, 0x85, 0x5c, 0x57, 0x48, 0xc8, 0x1d, - 0x18, 0x57, 0x5f, 0xa6, 0x94, 0xf0, 0x0d, 0xea, 0xeb, 0xa5, 0xa2, 0x74, 0x10, 0x91, 0x67, 0x93, - 0x8f, 0x56, 0x92, 0x0b, 0x79, 0x1b, 0x26, 0x18, 0x7b, 0xb6, 0x73, 0x04, 0xe2, 0x56, 0x83, 0xcf, - 0x78, 0xca, 0x07, 0xb1, 0xdd, 0x47, 0x0b, 0x8b, 0x1e, 0x11, 0x90, 0x2f, 0xc3, 0x44, 0xa5, 0xdb, - 0x15, 0x5d, 0x3d, 0xd0, 0x40, 0xe9, 0x7c, 0xaa, 0xab, 0xe7, 0xed, 0x6e, 0x37, 0xdd, 0xd3, 0x31, - 0x3f, 0xb2, 0x17, 0x45, 0x0f, 0x1c, 0x26, 0xcd, 0xe9, 0x2b, 0xa9, 0x0a, 0x16, 0x64, 0x40, 0xbc, - 0x54, 0x25, 0x3a, 0x5f, 0xd2, 0x85, 0x72, 0x2c, 0x54, 0x8a, 0xba, 0x60, 0x50, 0x5d, 0xaf, 0xa7, - 0xea, 0x52, 0x07, 0x30, 0x55, 0x5d, 0x8a, 0x3b, 0x69, 0xc1, 0xb4, 0x3c, 0xa0, 0x44, 0x7d, 0x93, - 0x83, 0xea, 0x7b, 0x29, 0x55, 0xdf, 0x5c, 0x6b, 0x27, 0x5d, 0x4f, 0x82, 0x27, 0x79, 0x1b, 0xa6, - 0x24, 0x04, 0xd7, 0x07, 0x1a, 0x06, 0x09, 0x85, 0x60, 0x6b, 0x07, 0x5d, 0x86, 0xb4, 0x5e, 0xd1, - 0x90, 0x55, 0x6a, 0x3e, 0x3b, 0xa6, 0x34, 0xea, 0xe4, 0xac, 0xd0, 0x91, 0xc9, 0x07, 0x30, 0x59, - 0xeb, 0xb0, 0x86, 0x78, 0xae, 0x1d, 0x52, 0xe1, 0xd8, 0x2b, 0x8d, 0xad, 0x94, 0x12, 0x65, 0xaa, - 0xa2, 0x99, 0x89, 0x13, 0x17, 0xa9, 0xd7, 0x4c, 0x85, 0x82, 0x75, 0x1e, 0x7f, 0x8a, 0x14, 0x73, - 0x58, 0x3a, 0xfd, 0x3e, 0x9b, 0x61, 0xf0, 0xa4, 0xb0, 0x17, 0xc1, 0xb5, 0x19, 0x54, 0x3e, 0x05, - 0x26, 0x12, 0x1b, 0xa8, 0x3c, 0xc9, 0x3b, 0x30, 0x29, 0x32, 0x40, 0x57, 0xcc, 0xcd, 0x60, 0xa1, - 0x1c, 0xdb, 0x6b, 0xcb, 0x64, 0xd1, 0x96, 0xed, 0x27, 0x2c, 0x7b, 0x63, 0x7c, 0xf2, 0x25, 0x98, - 0xbf, 0xe7, 0xb8, 0x2d, 0xef, 0x41, 0x20, 0x8e, 0x29, 0xb1, 0xd1, 0xcd, 0xc6, 0x7e, 0x85, 0x0f, - 0x78, 0x79, 0x24, 0x0b, 0xa6, 0x36, 0xbe, 0x4c, 0x0e, 0xe4, 0x07, 0x52, 0x9c, 0xf9, 0x0c, 0x22, - 0x83, 0x66, 0xd0, 0x72, 0x6a, 0x06, 0xa5, 0xab, 0x4f, 0x4e, 0xa7, 0xcc, 0x6a, 0x88, 0x07, 0x44, - 0x3f, 0xdf, 0x6f, 0x7a, 0x8e, 0xbb, 0x30, 0x87, 0x7b, 0xe1, 0xd3, 0xc9, 0xf0, 0x20, 0x88, 0x57, - 0xf7, 0xda, 0x4e, 0xf3, 0x90, 0x67, 0x7b, 0x49, 0xca, 0xfc, 0x1f, 0x79, 0xda, 0x73, 0x49, 0x06, - 0x6b, 0xf2, 0x01, 0x94, 0xd8, 0xff, 0x91, 0x52, 0x62, 0x5e, 0x33, 0x91, 0x55, 0x30, 0x45, 0x3d, - 0x38, 0x46, 0x98, 0xa2, 0x3a, 0x43, 0x5f, 0xa1, 0xb1, 0x22, 0x6f, 0x02, 0x30, 0xb1, 0x49, 0x6c, - 0xc7, 0xa7, 0xe2, 0x3c, 0x12, 0x28, 0x75, 0xa5, 0x37, 0xe2, 0x18, 0x99, 0xbc, 0x0d, 0x93, 0xec, - 0x57, 0xa3, 0xd7, 0xf2, 0xd8, 0xda, 0x38, 0x8d, 0xb4, 0xdc, 0xc7, 0x9a, 0xd1, 0x06, 0x1c, 0xae, - 0xf9, 0x58, 0xc7, 0xe8, 0x64, 0x1d, 0x66, 0x30, 0xdf, 0x87, 0x88, 0x34, 0xef, 0xd0, 0x60, 0xe1, - 0x8c, 0x62, 0x42, 0x81, 0x69, 0x5a, 0x9d, 0xa8, 0x4c, 0xbd, 0xcb, 0x24, 0xc8, 0x48, 0x00, 0x73, - 0xe9, 0x37, 0xe8, 0x60, 0x61, 0x01, 0x3b, 0x49, 0x4a, 0xf0, 0x69, 0x0c, 0xbe, 0x1f, 0xb3, 0x11, - 0x51, 0x36, 0x2e, 0xf9, 0xa8, 0xa4, 0x56, 0x98, 0xc5, 0x9d, 0x98, 0x40, 0x6e, 0xac, 0xd6, 0x93, - 0x09, 0x31, 0xce, 0x62, 0x0b, 0x70, 0x98, 0xf7, 0x9a, 0x5d, 0x6b, 0x40, 0x52, 0x8c, 0x0c, 0x6a, - 0xf2, 0xfd, 0x70, 0x4a, 0xee, 0x20, 0xa2, 0x48, 0xcc, 0xeb, 0xc5, 0x13, 0xee, 0xc4, 0xad, 0x9d, - 0xa8, 0xea, 0xd4, 0x94, 0xce, 0xae, 0x82, 0xd8, 0x30, 0x89, 0xc3, 0x2a, 0x6a, 0x7c, 0x7a, 0x50, - 0x8d, 0x17, 0x52, 0x35, 0x9e, 0xc6, 0x89, 0x92, 0xae, 0x4c, 0xe5, 0x49, 0x56, 0x60, 0x4a, 0xac, - 0x23, 0x31, 0xdb, 0x9e, 0xc1, 0xde, 0x42, 0x25, 0x96, 0x5c, 0x81, 0xa9, 0x09, 0xa7, 0x93, 0xa8, - 0x3b, 0x32, 0x7f, 0x4c, 0x7a, 0x56, 0xdb, 0x91, 0x93, 0x6f, 0x48, 0x3a, 0x32, 0xdb, 0x91, 0x62, - 0x29, 0x66, 0xed, 0x61, 0xd7, 0x17, 0x2a, 0xaa, 0xe7, 0xe2, 0x8c, 0x97, 0x8a, 0xf0, 0x63, 0xd1, - 0x08, 0x43, 0xdd, 0x12, 0xb2, 0x38, 0x90, 0x6d, 0x98, 0x8b, 0x4e, 0x6d, 0x85, 0xf1, 0x52, 0x9c, - 0x72, 0x21, 0x3e, 0xea, 0xb3, 0xf9, 0x66, 0xd1, 0x13, 0x1b, 0xce, 0x68, 0xe7, 0xb4, 0xc2, 0xfa, - 0x1c, 0xb2, 0x7e, 0x99, 0xdd, 0xc8, 0xf4, 0x43, 0x3e, 0x9b, 0x7d, 0x3f, 0x3e, 0xe4, 0x23, 0x58, - 0x4c, 0x9e, 0xcd, 0x4a, 0x2d, 0xcf, 0x63, 0x2d, 0xaf, 0x3c, 0x3a, 0x5a, 0x3a, 0x9f, 0x3a, 0xde, - 0xb3, 0x2b, 0x1a, 0xc0, 0x8d, 0x7c, 0x15, 0x16, 0xf4, 0xf3, 0x59, 0xa9, 0xc9, 0xc0, 0x9a, 0x70, - 0xe9, 0x44, 0x07, 0x7b, 0x76, 0x0d, 0x7d, 0x79, 0x90, 0x10, 0x96, 0x32, 0x67, 0xb7, 0x52, 0xcd, - 0x0b, 0x71, 0x83, 0x52, 0xab, 0x24, 0xbb, 0xba, 0xe3, 0x58, 0x92, 0x07, 0xf0, 0x5c, 0xd6, 0x31, - 0xa1, 0x54, 0xfa, 0x62, 0xa4, 0x04, 0x7e, 0x35, 0xfb, 0xc8, 0xc9, 0xae, 0xf9, 0x18, 0xb6, 0xe4, - 0xcb, 0x70, 0x4a, 0x59, 0x5f, 0x4a, 0x7d, 0x2f, 0x61, 0x7d, 0x18, 0x15, 0x40, 0x5d, 0x98, 0xd9, - 0xb5, 0x64, 0xf3, 0x20, 0x1d, 0x98, 0x93, 0x0d, 0x47, 0x6d, 0xbb, 0x38, 0x7a, 0xce, 0x6b, 0xbb, - 0x6a, 0x1a, 0x63, 0xe5, 0x9c, 0xd8, 0x55, 0x17, 0x5a, 0x3b, 0x56, 0x37, 0x26, 0x54, 0x67, 0x7a, - 0x06, 0x5f, 0xb2, 0x0e, 0x63, 0x8d, 0x7a, 0xed, 0xfa, 0xf5, 0xb5, 0x85, 0x97, 0xb1, 0x06, 0xe9, - 0xf7, 0xc7, 0x81, 0xda, 0xa5, 0x49, 0xd8, 0x38, 0x76, 0x9d, 0xdd, 0x5d, 0xed, 0xc1, 0x8a, 0xa3, - 0x92, 0x1f, 0x40, 0xeb, 0x42, 0xb6, 0xa3, 0x56, 0x82, 0xc0, 0xd9, 0x73, 0x79, 0x32, 0x8b, 0x57, - 0xb4, 0xf7, 0x7e, 0x99, 0xde, 0x64, 0x15, 0x93, 0xd1, 0xa6, 0xd0, 0xb9, 0xb4, 0xc9, 0xee, 0xff, - 0x62, 0xe7, 0xb6, 0xec, 0x98, 0x95, 0xba, 0x89, 0xa7, 0x2b, 0x62, 0xfd, 0xb6, 0xe7, 0x84, 0xd6, - 0x7e, 0x4f, 0x6b, 0xfe, 0xc2, 0xab, 0x5a, 0x30, 0x71, 0x9e, 0xa2, 0x57, 0xe9, 0xb5, 0x17, 0x45, - 0x85, 0xcf, 0xf0, 0xdb, 0x72, 0x9f, 0x9e, 0x9b, 0xdd, 0x4b, 0xd0, 0x05, 0xe4, 0x87, 0x73, 0x70, - 0xfa, 0x9e, 0xe7, 0x1f, 0xb4, 0x3d, 0xbb, 0x25, 0x5b, 0x25, 0xf6, 0xf0, 0xd7, 0x06, 0xed, 0xe1, - 0x9f, 0x4d, 0xed, 0xe1, 0xc6, 0x03, 0xc1, 0xc6, 0x8a, 0xb2, 0xc3, 0xa4, 0xf6, 0xf3, 0x3e, 0x55, - 0x91, 0x1f, 0x80, 0x73, 0xd9, 0x25, 0xca, 0xa4, 0x7c, 0x1d, 0x27, 0xe5, 0x95, 0x47, 0x47, 0x4b, - 0xaf, 0xf7, 0xab, 0x29, 0x7b, 0x82, 0x1e, 0xcb, 0xfa, 0xe6, 0x48, 0xf1, 0x42, 0xf9, 0xe2, 0xcd, - 0x91, 0xe2, 0xc5, 0xf2, 0x2b, 0xe6, 0x33, 0x8d, 0xca, 0xed, 0x8d, 0x5a, 0x4b, 0x1e, 0xae, 0x32, - 0x81, 0x0d, 0xa7, 0x31, 0xcf, 0x0f, 0x2a, 0x8d, 0x39, 0x1a, 0x7f, 0x2d, 0x07, 0x4b, 0xc7, 0x4c, - 0x12, 0x76, 0x9e, 0xc5, 0x23, 0xd1, 0x88, 0x92, 0x26, 0x70, 0xc7, 0xc0, 0xa8, 0xc0, 0xd2, 0xcd, - 0x46, 0x74, 0x12, 0x74, 0x1a, 0x15, 0xb9, 0xd7, 0x14, 0xdf, 0xe1, 0x74, 0xce, 0x35, 0x89, 0x65, - 0x6c, 0x40, 0x39, 0x39, 0x79, 0xc8, 0xe7, 0x61, 0x4a, 0xcd, 0xfc, 0x24, 0x55, 0x09, 0x3c, 0x62, - 0x8e, 0xbf, 0xa7, 0x1d, 0x88, 0x1a, 0xa2, 0xf1, 0x0b, 0x39, 0x98, 0xcb, 0x58, 0x61, 0xe4, 0x3c, - 0x8c, 0x60, 0xba, 0x57, 0xc5, 0x6a, 0x28, 0x91, 0xe6, 0x15, 0xcb, 0xc9, 0x67, 0x60, 0xbc, 0xba, - 0xd9, 0x68, 0x54, 0x36, 0xa5, 0x32, 0x82, 0x1f, 0xc4, 0x6e, 0x60, 0x05, 0xb6, 0x6e, 0x6c, 0x20, - 0xd0, 0xc8, 0xeb, 0x30, 0x56, 0xab, 0x23, 0x81, 0x92, 0x16, 0xc6, 0xe9, 0x26, 0xf1, 0x05, 0x92, - 0xf1, 0x13, 0x39, 0x20, 0xe9, 0xed, 0x82, 0x5c, 0x81, 0x49, 0x75, 0x53, 0xe2, 0xed, 0xc5, 0x17, - 0x58, 0x65, 0xe1, 0x98, 0x2a, 0x0e, 0xa9, 0xc2, 0x28, 0x66, 0x4f, 0x8c, 0xac, 0x1c, 0x32, 0x97, - 0xc5, 0x99, 0xd4, 0xb2, 0x18, 0xc5, 0x8c, 0x8c, 0x26, 0x27, 0x36, 0xfe, 0x38, 0x07, 0x24, 0xdb, - 0xe0, 0x71, 0x28, 0x2b, 0xab, 0x37, 0x94, 0xd8, 0x13, 0xaa, 0xc5, 0x63, 0x94, 0x8d, 0x57, 0x55, - 0x03, 0xc4, 0x51, 0x2a, 0xce, 0x6b, 0x6a, 0xa7, 0xfe, 0x0e, 0xcb, 0x17, 0x61, 0xf4, 0x2e, 0xf5, - 0x77, 0xa4, 0x2d, 0x38, 0xda, 0x8f, 0xde, 0x67, 0x00, 0x55, 0x0d, 0x83, 0x18, 0x9a, 0xe9, 0xe5, - 0xe8, 0xb0, 0xa6, 0x97, 0x7f, 0x90, 0x83, 0xf9, 0xac, 0x8b, 0xcd, 0x31, 0xce, 0xc8, 0x46, 0xc2, - 0x8f, 0x1a, 0xcd, 0xb2, 0xb8, 0x45, 0x6a, 0xe4, 0x3d, 0xbd, 0x04, 0xa3, 0xac, 0x87, 0xe4, 0xb4, - 0x40, 0xdd, 0x19, 0xeb, 0xc2, 0xc0, 0xe4, 0x70, 0x86, 0x10, 0x67, 0xf3, 0x18, 0xe5, 0x08, 0x3c, - 0x89, 0x07, 0x87, 0x33, 0x84, 0xdb, 0x5e, 0x8b, 0x4a, 0x9d, 0x12, 0x22, 0x74, 0x18, 0xc0, 0xe4, - 0x70, 0x72, 0x1e, 0xc6, 0xef, 0xb8, 0x1b, 0xd4, 0xbe, 0x2f, 0xb3, 0x86, 0xa1, 0x19, 0x99, 0xe7, - 0x5a, 0x6d, 0x06, 0x33, 0x65, 0xa1, 0xf1, 0xb3, 0x39, 0x98, 0x4d, 0xdd, 0xa9, 0x8e, 0xf7, 0xb7, - 0x1e, 0xec, 0x43, 0x38, 0x4c, 0xfb, 0xf8, 0xe7, 0x8f, 0x64, 0x7f, 0xbe, 0xf1, 0xdf, 0x8c, 0xc1, - 0x99, 0x3e, 0x2a, 0xae, 0xd8, 0xc7, 0x39, 0x77, 0xac, 0x8f, 0xf3, 0x57, 0x60, 0x6a, 0xb5, 0x6d, - 0x3b, 0x9d, 0x60, 0xcb, 0x8b, 0xbf, 0x38, 0x76, 0x95, 0xc2, 0x32, 0xe1, 0x71, 0x11, 0xf9, 0xd4, - 0x9c, 0x6d, 0x22, 0x85, 0x15, 0x7a, 0x69, 0x09, 0x5b, 0x63, 0x96, 0xf2, 0x32, 0x2e, 0xfc, 0x19, - 0xf1, 0x32, 0xd6, 0xfd, 0xde, 0x46, 0x1e, 0xab, 0xdf, 0x5b, 0xb6, 0x75, 0xf9, 0xe8, 0x27, 0xf1, - 0x35, 0x58, 0x85, 0x29, 0x6e, 0x47, 0x57, 0x09, 0xf8, 0x20, 0x8d, 0xa5, 0x6c, 0xef, 0xec, 0x20, - 0x3d, 0x16, 0x1a, 0x0d, 0x59, 0xd7, 0x7d, 0xb4, 0xc6, 0xf1, 0xa1, 0xf9, 0x7c, 0x7f, 0x1f, 0x2c, - 0x3d, 0xd0, 0x8f, 0xea, 0x8b, 0xf5, 0x0d, 0x98, 0xcf, 0xba, 0x23, 0x2f, 0x14, 0x35, 0x13, 0xdd, - 0xbe, 0xf6, 0xe0, 0xc3, 0xdf, 0xb4, 0x0f, 0x32, 0x6f, 0xda, 0xd2, 0x77, 0x7e, 0xa2, 0xbf, 0xe3, - 0x51, 0xbc, 0x16, 0x38, 0xee, 0x60, 0x0f, 0x7b, 0xe3, 0x2b, 0x89, 0xe0, 0x07, 0x49, 0x72, 0xf2, - 0x96, 0x16, 0xa3, 0xea, 0xe5, 0x74, 0x8c, 0xaa, 0xec, 0x78, 0x07, 0x3c, 0x01, 0xd4, 0xcf, 0xe6, - 0x75, 0x8f, 0xed, 0x3f, 0x8b, 0x0b, 0xf5, 0x22, 0x8c, 0xde, 0xdb, 0xa7, 0xbe, 0x3c, 0x53, 0xf0, - 0x43, 0x1e, 0x30, 0x80, 0xfa, 0x21, 0x88, 0x41, 0xae, 0xc3, 0x74, 0x9d, 0x4f, 0x5c, 0x39, 0x1b, - 0x47, 0x62, 0x45, 0x4d, 0x57, 0xa8, 0x13, 0x33, 0xa6, 0x63, 0x82, 0xca, 0xb8, 0x91, 0xe8, 0x74, - 0x11, 0x61, 0x8b, 0xfb, 0x60, 0x71, 0xa9, 0x63, 0x3a, 0xf6, 0xa5, 0x8b, 0x37, 0x5b, 0x33, 0x01, - 0x35, 0x76, 0xe1, 0xb9, 0x81, 0x8c, 0xd8, 0x61, 0x0f, 0xdd, 0xe8, 0x57, 0xc2, 0x5c, 0x7b, 0x20, - 0xa9, 0xa9, 0xd0, 0x19, 0xdf, 0x80, 0x92, 0xda, 0xcb, 0x78, 0x04, 0xb1, 0xdf, 0x62, 0x56, 0xf0, - 0x23, 0x88, 0x01, 0x4c, 0x0e, 0x8f, 0x1f, 0x80, 0xf2, 0xd9, 0x0f, 0x40, 0xf1, 0xf0, 0x17, 0x8e, - 0x1b, 0x7e, 0x56, 0x39, 0xee, 0x70, 0x4a, 0xe5, 0xf8, 0x5b, 0xad, 0x1c, 0xe3, 0x5e, 0x99, 0x1c, - 0xfe, 0x58, 0x2b, 0xff, 0xe7, 0x32, 0x81, 0x20, 0xba, 0x78, 0xc9, 0xe5, 0x9e, 0x8b, 0x73, 0xc5, - 0x66, 0xad, 0xde, 0x18, 0x33, 0x16, 0x44, 0xf2, 0xc7, 0x0a, 0x22, 0x27, 0x98, 0x88, 0x28, 0x2c, - 0xf3, 0x21, 0x1d, 0x89, 0x85, 0x47, 0x3b, 0x65, 0x22, 0x23, 0xb1, 0x8c, 0x6f, 0xe5, 0xe0, 0x54, - 0xa6, 0xa2, 0x9d, 0xd5, 0xca, 0x35, 0xfa, 0xca, 0x3a, 0x4c, 0xaa, 0xf3, 0x39, 0xc6, 0x49, 0xe2, - 0x87, 0x0c, 0xdf, 0x16, 0xe3, 0x79, 0x98, 0x88, 0x9e, 0x79, 0xc9, 0xbc, 0x1c, 0x3a, 0x1e, 0x20, - 0x51, 0xbc, 0x16, 0x36, 0x00, 0xd8, 0x17, 0x3c, 0x56, 0x7b, 0x6c, 0xe3, 0x9f, 0xe7, 0x61, 0x8c, - 0x71, 0x7d, 0x62, 0x43, 0x39, 0x67, 0x1b, 0x51, 0xb3, 0x26, 0xf5, 0x0f, 0xe0, 0x4c, 0xd6, 0x60, - 0x8c, 0x27, 0xbf, 0x13, 0x4f, 0x86, 0x73, 0x2a, 0x99, 0xcc, 0x8a, 0x17, 0x05, 0xbe, 0x08, 0x10, - 0xa2, 0xa9, 0x16, 0x10, 0xa2, 0xd8, 0x62, 0xff, 0x4e, 0x0e, 0x4a, 0x2a, 0x31, 0xf9, 0x00, 0xa6, - 0x65, 0x78, 0x5a, 0x1e, 0x0c, 0x46, 0xbc, 0x49, 0x4b, 0xfb, 0x31, 0x19, 0x9e, 0x56, 0x0d, 0x1e, - 0xa3, 0xe1, 0xab, 0x5b, 0x75, 0x57, 0x45, 0x26, 0x2d, 0x20, 0x9d, 0x5d, 0xdb, 0x7a, 0x40, 0xed, - 0x03, 0x1a, 0x84, 0x16, 0xb7, 0xf3, 0x11, 0x4f, 0xd7, 0x92, 0xfd, 0xed, 0xeb, 0x15, 0x6e, 0xe2, - 0xc3, 0x46, 0x42, 0xc4, 0x19, 0x4e, 0xd1, 0xa8, 0xef, 0x71, 0x9d, 0x5d, 0xfb, 0x1e, 0x2f, 0xe4, - 0x74, 0xc6, 0x1f, 0x8e, 0xf1, 0xe9, 0x26, 0xe2, 0x59, 0xef, 0xc0, 0xf4, 0x9d, 0x5a, 0x75, 0x55, - 0xd1, 0xce, 0xeb, 0xe9, 0xd0, 0xd6, 0x1e, 0x86, 0xd4, 0x77, 0xed, 0xb6, 0xbc, 0x24, 0xc7, 0x47, - 0x90, 0xe7, 0xb4, 0x9a, 0xd9, 0x9a, 0xfb, 0x04, 0x47, 0x56, 0x07, 0xbf, 0x8e, 0x47, 0x75, 0xe4, - 0x87, 0xac, 0x23, 0xb0, 0x3b, 0xed, 0x3e, 0x75, 0xe8, 0x1c, 0xc9, 0x3e, 0xde, 0x97, 0xf7, 0x7b, - 0x3b, 0x4a, 0x2d, 0x85, 0xc1, 0xb5, 0xbc, 0x20, 0x6a, 0x79, 0x5a, 0xe8, 0x62, 0x32, 0xeb, 0x49, - 0x71, 0x8d, 0xf7, 0x89, 0x91, 0x63, 0xf7, 0x89, 0xff, 0x7f, 0x0e, 0xc6, 0xb8, 0xf8, 0x2a, 0xa6, - 0x71, 0x1f, 0x01, 0xf9, 0xde, 0xe3, 0x11, 0x90, 0xcb, 0x78, 0x4e, 0x68, 0x13, 0x9a, 0x97, 0x91, - 0x6a, 0x62, 0x5d, 0x48, 0x17, 0x02, 0x7c, 0x67, 0xe3, 0x25, 0xc7, 0x2f, 0x0b, 0x52, 0x8b, 0x43, - 0x91, 0x8c, 0x1f, 0xeb, 0x7f, 0x2e, 0xc3, 0xb7, 0x8c, 0x8b, 0x50, 0x24, 0x7a, 0x00, 0x92, 0x0d, - 0x98, 0x10, 0x01, 0x4e, 0x56, 0x0e, 0xc5, 0x6b, 0x7a, 0x59, 0xb3, 0x87, 0x6a, 0xad, 0x1c, 0xc6, - 0xa2, 0xb9, 0x08, 0x91, 0x62, 0xed, 0xa8, 0xbe, 0x04, 0x31, 0x03, 0x72, 0x87, 0x67, 0x3a, 0xe7, - 0xf1, 0xbe, 0xf5, 0x14, 0x1f, 0x11, 0x5c, 0xc4, 0x7b, 0x93, 0x51, 0x12, 0x32, 0xc2, 0x7b, 0xc7, - 0x3c, 0xc8, 0x06, 0x94, 0xd1, 0x86, 0x8e, 0xb6, 0xf8, 0xaa, 0xa9, 0x55, 0x79, 0x10, 0x0d, 0x61, - 0x07, 0x1d, 0xf2, 0x32, 0xb1, 0xdc, 0x12, 0x9e, 0x9e, 0x29, 0x4a, 0xe3, 0x67, 0xf2, 0x50, 0x4e, - 0xce, 0x3e, 0xf2, 0x36, 0x4c, 0x46, 0xf1, 0xd6, 0x23, 0x5f, 0x73, 0x7c, 0x55, 0x8b, 0x03, 0xb4, - 0xeb, 0xf9, 0xb1, 0x15, 0x74, 0xb2, 0x0c, 0x45, 0xb6, 0x88, 0xdd, 0x38, 0x5c, 0x26, 0x6e, 0xdb, - 0x3d, 0x01, 0x53, 0x6f, 0xf5, 0x12, 0x8f, 0x34, 0x60, 0x8e, 0x2d, 0x9a, 0x86, 0xe3, 0xee, 0xb5, - 0xe9, 0x86, 0xb7, 0xe7, 0xf5, 0xc2, 0x38, 0x5d, 0x34, 0xbf, 0xc0, 0xd8, 0x9d, 0xb6, 0x56, 0xac, - 0x27, 0x8b, 0xce, 0xa0, 0x26, 0xaf, 0xf3, 0x63, 0xa6, 0x56, 0x15, 0xc6, 0x30, 0x78, 0x54, 0xa3, - 0x11, 0x97, 0xf6, 0xf1, 0x02, 0x49, 0xd9, 0x59, 0x7f, 0x3f, 0x0f, 0x93, 0xca, 0xf4, 0x23, 0x17, - 0xa1, 0x58, 0x0b, 0x36, 0xbc, 0xe6, 0x41, 0x14, 0x3f, 0x74, 0xea, 0xd1, 0xd1, 0xd2, 0x84, 0x13, - 0x58, 0x6d, 0x04, 0x9a, 0x51, 0x31, 0x59, 0x81, 0x29, 0xfe, 0x97, 0x4c, 0x9c, 0x93, 0x8f, 0x15, - 0x72, 0x1c, 0x59, 0xa6, 0xcc, 0x51, 0x37, 0x5b, 0x8d, 0x84, 0x7c, 0x08, 0xc0, 0x01, 0x18, 0xbc, - 0xa1, 0x30, 0x7c, 0xd8, 0x09, 0x51, 0x41, 0x46, 0xd8, 0x06, 0x85, 0x21, 0xf9, 0x1a, 0x0f, 0xe7, - 0x2e, 0x97, 0xcb, 0xc8, 0xf0, 0x71, 0x33, 0x18, 0x7f, 0x2b, 0x3b, 0x7c, 0x8f, 0xca, 0x52, 0xe4, - 0xba, 0x5a, 0x94, 0x89, 0x4d, 0x2b, 0x21, 0x22, 0x2a, 0x18, 0xc6, 0xff, 0x9c, 0x53, 0x16, 0x19, - 0xd9, 0x84, 0x89, 0x68, 0x02, 0x09, 0x3b, 0xb4, 0xe8, 0x8a, 0x21, 0xe1, 0x26, 0xdd, 0x5d, 0x79, - 0x5a, 0x98, 0xc4, 0xcd, 0x45, 0xd3, 0x50, 0x5b, 0x73, 0x12, 0x48, 0xbe, 0x08, 0x23, 0xd8, 0x75, - 0xf9, 0x63, 0x9b, 0x26, 0x4f, 0xf9, 0x11, 0xd6, 0x67, 0xd8, 0x10, 0xa4, 0x24, 0x9f, 0x11, 0x2e, - 0xe2, 0xbc, 0xf3, 0xa7, 0x95, 0xa3, 0x9a, 0x7d, 0x47, 0x74, 0xbc, 0xc7, 0x11, 0x9c, 0x94, 0xd9, - 0xf3, 0xd7, 0xf2, 0x50, 0x4e, 0x2e, 0x6d, 0xf2, 0x1e, 0x94, 0xe4, 0xf1, 0xbb, 0x6e, 0x8b, 0xac, - 0x2f, 0x25, 0x91, 0x75, 0x45, 0x9e, 0xc1, 0xfb, 0xb6, 0x6a, 0xb7, 0x66, 0x6a, 0x04, 0x4c, 0x16, - 0xda, 0x12, 0x61, 0x20, 0x95, 0x45, 0x15, 0x7a, 0x61, 0x37, 0x11, 0x45, 0x5c, 0xa2, 0x91, 0x37, - 0xa0, 0x70, 0xfb, 0x7a, 0x45, 0x78, 0x05, 0x96, 0x93, 0x87, 0x34, 0x37, 0xaf, 0xd5, 0x8d, 0x7d, - 0x19, 0x3e, 0xd9, 0x50, 0x02, 0xee, 0x8f, 0x69, 0x36, 0x8a, 0x12, 0x1c, 0x35, 0xee, 0xf8, 0xc8, - 0xfb, 0x37, 0x47, 0x8a, 0x85, 0xf2, 0x88, 0x08, 0xc2, 0xfc, 0xaf, 0x0b, 0x30, 0x11, 0xd5, 0x4f, - 0x88, 0xea, 0xa0, 0x2d, 0x9c, 0xb1, 0xcf, 0x42, 0x51, 0x4a, 0x77, 0xc2, 0x39, 0x70, 0x3c, 0x10, - 0x92, 0xdd, 0x02, 0x48, 0x31, 0x8e, 0xef, 0x0a, 0xa6, 0xfc, 0x49, 0xae, 0x40, 0x24, 0xa3, 0xf5, - 0x13, 0xe6, 0x46, 0xd8, 0x80, 0x99, 0x11, 0x1a, 0x99, 0x86, 0xbc, 0xc3, 0x03, 0xdb, 0x4d, 0x98, - 0x79, 0xa7, 0x45, 0xde, 0x83, 0xa2, 0xdd, 0x6a, 0x61, 0x16, 0xdb, 0x21, 0x12, 0xe0, 0x16, 0x19, - 0x37, 0x7e, 0x66, 0x20, 0x55, 0x25, 0x24, 0x15, 0x98, 0xe0, 0x91, 0xc2, 0x03, 0xda, 0x1a, 0xe2, - 0x00, 0x8a, 0x39, 0x60, 0x80, 0xf1, 0xed, 0x80, 0xb6, 0xc8, 0xcb, 0x30, 0xc2, 0x46, 0x53, 0x9c, - 0x38, 0x52, 0xa8, 0x64, 0x83, 0xc9, 0x3b, 0x6c, 0xfd, 0x29, 0x13, 0x11, 0xc8, 0x8b, 0x50, 0xe8, - 0x2d, 0xef, 0x8a, 0xb3, 0xa4, 0x1c, 0x27, 0xbf, 0x88, 0xd0, 0x58, 0x31, 0xb9, 0x0a, 0xc5, 0x07, - 0x7a, 0xde, 0x84, 0x53, 0x89, 0x61, 0x8c, 0xf0, 0x23, 0x44, 0xf2, 0x32, 0x14, 0x82, 0xc0, 0x13, - 0x56, 0x50, 0x73, 0x91, 0x69, 0xea, 0x9d, 0x68, 0xd4, 0x18, 0xf7, 0x20, 0xf0, 0x56, 0x8a, 0x30, - 0xc6, 0x0f, 0x18, 0xe3, 0x39, 0x80, 0xf8, 0x1b, 0xd3, 0xce, 0x9e, 0xc6, 0x87, 0x30, 0x11, 0x7d, - 0x1b, 0x79, 0x16, 0xe0, 0x80, 0x1e, 0x5a, 0xfb, 0xb6, 0xdb, 0x6a, 0x73, 0xe9, 0xb4, 0x64, 0x4e, - 0x1c, 0xd0, 0xc3, 0x75, 0x04, 0x90, 0x33, 0x30, 0xde, 0x65, 0xc3, 0x2f, 0xe6, 0x78, 0xc9, 0x1c, - 0xeb, 0xf6, 0x76, 0xd8, 0x54, 0x5e, 0x80, 0x71, 0xd4, 0xb3, 0x8a, 0x15, 0x39, 0x65, 0xca, 0x9f, - 0xc6, 0x1f, 0x15, 0x30, 0xbd, 0x98, 0xd2, 0x20, 0xf2, 0x02, 0x4c, 0x35, 0x7d, 0x8a, 0x67, 0x99, - 0xcd, 0x24, 0x34, 0x51, 0x4f, 0x29, 0x06, 0xd6, 0x5a, 0xe4, 0x3c, 0xcc, 0xc4, 0x99, 0xa0, 0xad, - 0xe6, 0x8e, 0xc8, 0x87, 0x52, 0x32, 0xa7, 0xba, 0x32, 0x1f, 0xf4, 0xea, 0x0e, 0x46, 0x6e, 0x2c, - 0xab, 0x81, 0xc7, 0x59, 0x8f, 0x88, 0xf9, 0x37, 0xa3, 0xc0, 0xd1, 0xa0, 0xf3, 0x34, 0x8c, 0xd9, - 0xf6, 0x5e, 0xcf, 0xe1, 0x11, 0xd6, 0x4a, 0xa6, 0xf8, 0x45, 0x5e, 0x85, 0xd9, 0x38, 0x92, 0xbf, - 0x6c, 0xc6, 0x28, 0x36, 0xa3, 0x1c, 0x15, 0xac, 0x72, 0x38, 0x79, 0x1d, 0x88, 0x5a, 0x9f, 0xb7, - 0xf3, 0x11, 0x6d, 0xf2, 0x39, 0x59, 0x32, 0x67, 0x95, 0x92, 0x3b, 0x58, 0x40, 0x9e, 0x87, 0x92, - 0x4f, 0x03, 0x94, 0x0e, 0xb1, 0xdb, 0x30, 0xfb, 0xa6, 0x39, 0x29, 0x61, 0xac, 0xef, 0x2e, 0x40, - 0x59, 0xe9, 0x0e, 0x8c, 0xed, 0xce, 0x53, 0x81, 0x98, 0xd3, 0x31, 0xdc, 0xec, 0xd6, 0x5a, 0xe4, - 0x4b, 0xb0, 0xa8, 0x60, 0xf2, 0x44, 0xa0, 0x16, 0x6d, 0x3b, 0x7b, 0xce, 0x4e, 0x9b, 0x8a, 0xf9, - 0x96, 0x9e, 0xd5, 0xd1, 0x15, 0xd2, 0x5c, 0x88, 0xa9, 0x79, 0x8a, 0xd0, 0x35, 0x41, 0x4b, 0x36, - 0x60, 0x3e, 0xc1, 0x99, 0xb6, 0xac, 0x5e, 0xb7, 0x6f, 0x48, 0xc3, 0x98, 0x27, 0xd1, 0x79, 0xd2, - 0xd6, 0x76, 0xd7, 0xf8, 0x06, 0x94, 0xd4, 0x39, 0xc9, 0x3a, 0x41, 0x95, 0x4b, 0xc4, 0xec, 0x9b, - 0x8c, 0x60, 0x35, 0x76, 0x2f, 0x9c, 0x8e, 0x51, 0x70, 0x10, 0xf9, 0xf6, 0x32, 0x15, 0x41, 0x71, - 0x08, 0x9f, 0x87, 0x52, 0xcb, 0x09, 0xba, 0x6d, 0xfb, 0x10, 0xcd, 0xf2, 0xc4, 0x48, 0x4f, 0x0a, - 0x18, 0x2a, 0x7e, 0x56, 0x60, 0x36, 0xb5, 0x0f, 0x2a, 0x92, 0x06, 0xdf, 0xd7, 0x07, 0x4b, 0x1a, - 0x86, 0x0b, 0x25, 0xf5, 0x5c, 0x3b, 0x26, 0x71, 0xcf, 0x69, 0x0c, 0xf8, 0xc3, 0x37, 0xfd, 0xb1, - 0x47, 0x47, 0x4b, 0x79, 0xa7, 0x85, 0x61, 0x7e, 0x2e, 0x40, 0x51, 0x4a, 0x6c, 0x42, 0x50, 0xc2, - 0xc7, 0x04, 0xf9, 0x9e, 0x69, 0x46, 0xa5, 0xc6, 0xcb, 0x30, 0x2e, 0x8e, 0xae, 0xc1, 0x4f, 0x08, - 0xc6, 0x37, 0xf3, 0x30, 0x63, 0x52, 0xb6, 0xb1, 0x52, 0x9e, 0xad, 0xeb, 0x89, 0xbd, 0xa2, 0x67, - 0x47, 0xf0, 0xd5, 0xda, 0x36, 0x20, 0x4f, 0xd6, 0x2f, 0xe5, 0x60, 0x2e, 0x03, 0xf7, 0x63, 0xe5, - 0x89, 0xbe, 0x06, 0x13, 0x55, 0xc7, 0x6e, 0x57, 0x5a, 0xad, 0x28, 0xfa, 0x0f, 0xca, 0xf9, 0x98, - 0x4c, 0xce, 0x66, 0x50, 0x55, 0x88, 0x89, 0x50, 0xc9, 0x2b, 0x62, 0x52, 0x14, 0xa2, 0x6e, 0xc5, - 0x49, 0xf1, 0xdd, 0xa3, 0x25, 0xe0, 0xdf, 0xb4, 0x15, 0x4d, 0x11, 0x8c, 0xaa, 0xcd, 0x81, 0xb1, - 0x33, 0xd6, 0x13, 0x3b, 0x74, 0xd9, 0x51, 0xb5, 0x93, 0xcd, 0x1b, 0x2a, 0x55, 0xd6, 0x4f, 0xe6, - 0xe1, 0x74, 0x36, 0xe1, 0xc7, 0x4d, 0xf9, 0x8d, 0x49, 0xca, 0x94, 0x4c, 0x00, 0x98, 0xf2, 0x9b, - 0x67, 0x34, 0x43, 0xfc, 0x18, 0x81, 0xec, 0xf2, 0xd4, 0xfa, 0xeb, 0xd4, 0xf6, 0xc3, 0x1d, 0x6a, - 0x87, 0x43, 0x48, 0xf2, 0xd2, 0x04, 0x63, 0x01, 0x85, 0x89, 0x7d, 0x49, 0x99, 0x95, 0x59, 0x3f, - 0x62, 0x1b, 0x4d, 0x94, 0x91, 0x21, 0x26, 0xca, 0xd7, 0x61, 0xa6, 0x41, 0x3b, 0x76, 0x77, 0xdf, - 0xf3, 0x65, 0x90, 0x85, 0x4b, 0x30, 0x15, 0x81, 0x32, 0x67, 0x8b, 0x5e, 0xac, 0xe1, 0x2b, 0x1d, - 0x11, 0x6f, 0x25, 0x7a, 0xb1, 0xf1, 0xd7, 0xf3, 0x70, 0xa6, 0xd2, 0x14, 0xf6, 0xa4, 0xa2, 0x40, - 0x9a, 0xbd, 0x7f, 0xca, 0x75, 0x93, 0xcb, 0x30, 0x71, 0xdb, 0x7e, 0xb8, 0x41, 0xed, 0x80, 0x06, - 0x22, 0xcd, 0x04, 0x17, 0x7b, 0xed, 0x87, 0xf1, 0xe3, 0x8f, 0x19, 0xe3, 0xa8, 0x6a, 0x84, 0x91, - 0x4f, 0xa8, 0x46, 0x30, 0x60, 0x6c, 0xdd, 0x6b, 0xb7, 0xc4, 0x59, 0x2f, 0x5e, 0x9c, 0xf7, 0x11, - 0x62, 0x8a, 0x12, 0xe3, 0x0f, 0x72, 0x30, 0x1d, 0x7d, 0x31, 0x7e, 0xc2, 0xa7, 0xde, 0x25, 0xe7, - 0x61, 0x1c, 0x2b, 0xaa, 0x55, 0xd5, 0x43, 0xa3, 0x4d, 0x31, 0x6d, 0x66, 0xcb, 0x94, 0x85, 0x6a, - 0x4f, 0x8c, 0x7e, 0xb2, 0x9e, 0x30, 0xfe, 0x3e, 0x3e, 0x66, 0xab, 0xad, 0x64, 0x27, 0x91, 0xf2, - 0x21, 0xb9, 0x21, 0x3f, 0x24, 0xff, 0xd8, 0x86, 0xa4, 0xd0, 0x77, 0x48, 0x7e, 0x34, 0x0f, 0x93, - 0xd1, 0xc7, 0x7e, 0x8f, 0xa5, 0xa3, 0x88, 0xda, 0x35, 0x54, 0x60, 0xa4, 0x86, 0xb2, 0x57, 0x88, - 0xf8, 0x43, 0x5f, 0x84, 0x31, 0xb1, 0x98, 0x72, 0x09, 0xf3, 0xef, 0xc4, 0xe8, 0xae, 0x4c, 0x0b, - 0xd6, 0x63, 0x38, 0xa0, 0x81, 0x29, 0xe8, 0x30, 0xf2, 0xd4, 0x3d, 0xba, 0x23, 0x6c, 0x1b, 0x9e, - 0xd8, 0x33, 0x2a, 0x3b, 0xf2, 0x54, 0xdc, 0xb0, 0xa1, 0x4e, 0xa7, 0xff, 0xae, 0x08, 0xe5, 0x24, - 0xc9, 0xf1, 0x09, 0x3f, 0xea, 0xbd, 0x1d, 0x7e, 0x55, 0xe1, 0x09, 0x3f, 0xba, 0xbd, 0x1d, 0x93, - 0xc1, 0xd0, 0x5e, 0xca, 0x77, 0xee, 0x63, 0xab, 0x4b, 0xc2, 0x5e, 0xca, 0x77, 0xee, 0x6b, 0xf6, - 0x52, 0xbe, 0x73, 0x1f, 0x15, 0x09, 0x1b, 0x0d, 0x8c, 0xca, 0x80, 0xf7, 0x14, 0xa1, 0x48, 0x68, - 0x07, 0xc9, 0x2c, 0x86, 0x12, 0x8d, 0x1d, 0x95, 0x2b, 0xd4, 0xf6, 0x45, 0x72, 0x0a, 0xb1, 0x9d, - 0xe1, 0x51, 0xb9, 0x83, 0x60, 0x2b, 0x64, 0x70, 0x53, 0x45, 0x22, 0x6d, 0x20, 0xca, 0x4f, 0xb9, - 0x80, 0x8f, 0xbf, 0x5b, 0x4b, 0xd3, 0xcd, 0x79, 0x95, 0xb5, 0xa5, 0xae, 0xe6, 0x0c, 0xbe, 0x8f, - 0x53, 0xfb, 0x5b, 0x17, 0xc1, 0x6b, 0x51, 0x81, 0x54, 0x3c, 0x96, 0x99, 0x8c, 0x26, 0x03, 0x3c, - 0xb8, 0x6d, 0xa4, 0x46, 0x8a, 0x99, 0x90, 0x77, 0x61, 0x52, 0x8d, 0xb5, 0xc1, 0x23, 0x42, 0x3c, - 0xc3, 0x23, 0x77, 0xf6, 0xc9, 0x7c, 0xad, 0x12, 0x90, 0x1d, 0x38, 0xb3, 0xea, 0xb9, 0x41, 0xaf, - 0x23, 0x63, 0x84, 0xc6, 0xf1, 0xd6, 0x01, 0x87, 0x02, 0x1d, 0xf7, 0x9b, 0x02, 0x45, 0x84, 0x76, - 0x90, 0xbe, 0x35, 0xfa, 0x05, 0xa4, 0x1f, 0x23, 0xb2, 0x05, 0x93, 0xa8, 0x41, 0x15, 0x76, 0x92, - 0x93, 0xfa, 0xb6, 0x11, 0x97, 0x54, 0xd9, 0xc2, 0xe0, 0xa1, 0xe6, 0xec, 0x4e, 0x5b, 0xba, 0x76, - 0xa8, 0x9a, 0x60, 0x05, 0x99, 0x7c, 0x08, 0xd3, 0xfc, 0x8a, 0x76, 0x8f, 0xee, 0xf0, 0xb9, 0x53, - 0xd2, 0x34, 0x11, 0x7a, 0x21, 0x7f, 0xcc, 0x17, 0x7a, 0xeb, 0x07, 0x74, 0x87, 0x8f, 0xbd, 0xe6, - 0x58, 0xa5, 0xe1, 0x93, 0x6d, 0x98, 0x5b, 0xb7, 0x03, 0x0e, 0x54, 0x82, 0x26, 0x4c, 0xa1, 0x86, - 0x16, 0x0d, 0xde, 0xf7, 0xed, 0x40, 0x2a, 0xc2, 0x33, 0x83, 0x24, 0x64, 0xd1, 0x93, 0x6f, 0xe6, - 0x60, 0x41, 0xd3, 0x93, 0x0b, 0x3b, 0x33, 0x0c, 0x3c, 0x3b, 0x8d, 0x4f, 0x5e, 0x4b, 0x52, 0x28, - 0xed, 0x83, 0xc6, 0x87, 0x24, 0xa1, 0x8a, 0xf7, 0xe3, 0x72, 0xd5, 0x92, 0xbc, 0x1f, 0x0f, 0xb1, - 0x50, 0x71, 0x4d, 0xcf, 0xe8, 0x0b, 0x35, 0xb1, 0xae, 0x25, 0x9a, 0x71, 0x2d, 0xd9, 0xdf, 0x42, - 0xd1, 0x95, 0x8b, 0x14, 0x5d, 0xf3, 0x30, 0x8a, 0xbd, 0x2a, 0x43, 0x6f, 0xe1, 0x0f, 0xe3, 0x33, - 0xea, 0x3e, 0x24, 0xc4, 0xc2, 0x81, 0xfb, 0x90, 0xf1, 0xdf, 0x8f, 0xc1, 0x4c, 0x62, 0x5a, 0x88, - 0x7b, 0x6a, 0x2e, 0x75, 0x4f, 0x6d, 0x00, 0x70, 0x55, 0xef, 0x90, 0x3a, 0x59, 0xe9, 0xbd, 0x39, - 0x29, 0x7c, 0xaf, 0xa3, 0x35, 0xa5, 0xb0, 0x61, 0x4c, 0xf9, 0x8a, 0x1d, 0x52, 0x47, 0x1e, 0x31, - 0xe5, 0x8b, 0x5e, 0x61, 0x1a, 0xb3, 0x21, 0x4b, 0x30, 0x8a, 0x91, 0x7a, 0x55, 0xe7, 0x59, 0x87, - 0x01, 0x4c, 0x0e, 0x27, 0x2f, 0xc0, 0x18, 0x13, 0xa2, 0x6a, 0x55, 0xb1, 0x09, 0xe2, 0xd9, 0xc2, - 0xa4, 0x2c, 0x26, 0xb1, 0x88, 0x22, 0x72, 0x0d, 0x4a, 0xfc, 0x2f, 0x11, 0x9b, 0x67, 0x4c, 0xb7, - 0x98, 0xb4, 0x9c, 0x96, 0x0c, 0xcf, 0xa3, 0xe1, 0xb1, 0xdb, 0x45, 0xa3, 0x87, 0x6a, 0x9d, 0x5a, - 0x55, 0x04, 0xac, 0xc7, 0xdb, 0x45, 0xc0, 0x81, 0xac, 0x8a, 0x18, 0x81, 0xc9, 0x32, 0xc2, 0x85, - 0xa5, 0x88, 0x77, 0x4a, 0x94, 0x65, 0xb8, 0xeb, 0x8a, 0x29, 0x4a, 0xc8, 0x45, 0xfe, 0x12, 0x83, - 0x62, 0x21, 0xcf, 0xda, 0x8a, 0xef, 0x16, 0xa8, 0x98, 0x40, 0xd9, 0x30, 0x2a, 0x66, 0x95, 0xb3, - 0xbf, 0xd7, 0x3a, 0xb6, 0xd3, 0x16, 0xdb, 0x0a, 0x56, 0x8e, 0xb8, 0x94, 0x41, 0xcd, 0x18, 0x81, - 0xbc, 0x0d, 0xd3, 0x3c, 0xbb, 0x62, 0xa7, 0xe3, 0xb9, 0xc8, 0x7e, 0x32, 0x8e, 0xbe, 0x27, 0x32, - 0x3e, 0xb2, 0x22, 0x5e, 0x4b, 0x02, 0x97, 0x9d, 0x27, 0xf8, 0xca, 0xdb, 0xe3, 0x6f, 0x44, 0xa5, - 0xf8, 0x3c, 0x41, 0xd2, 0x80, 0xc3, 0x4d, 0x15, 0x89, 0xbc, 0x09, 0x53, 0xec, 0xe7, 0x0d, 0xe7, - 0x3e, 0xe5, 0x15, 0x4e, 0xc5, 0xe6, 0x0d, 0x48, 0xb5, 0xc7, 0x4a, 0x78, 0x7d, 0x3a, 0x26, 0x79, - 0x1f, 0x4e, 0x21, 0xa7, 0xa6, 0xd7, 0xa5, 0xad, 0xca, 0xee, 0xae, 0xd3, 0x76, 0xb8, 0x35, 0x1a, - 0x8f, 0x42, 0x83, 0x3a, 0x78, 0x5e, 0x31, 0x62, 0x58, 0x76, 0x8c, 0x62, 0x66, 0x53, 0x92, 0x7b, - 0x50, 0x5e, 0xed, 0x05, 0xa1, 0xd7, 0xa9, 0x84, 0xa1, 0xef, 0xec, 0xf4, 0x42, 0x1a, 0x2c, 0xcc, - 0x68, 0xb1, 0x5a, 0xd8, 0xe2, 0x88, 0x0a, 0xb9, 0x3e, 0xa8, 0x89, 0x14, 0x96, 0x1d, 0x91, 0x98, - 0x29, 0x26, 0xc6, 0xbf, 0xcd, 0xc1, 0x94, 0x46, 0x4a, 0xde, 0x80, 0xd2, 0x75, 0xdf, 0xa1, 0x6e, - 0xab, 0x7d, 0xa8, 0x5c, 0x54, 0xf1, 0x16, 0xb3, 0x2b, 0xe0, 0xbc, 0xd5, 0x1a, 0x5a, 0xa4, 0xe7, - 0xc9, 0x67, 0x9a, 0x8a, 0x5e, 0xe6, 0x3e, 0xdc, 0x62, 0x82, 0x16, 0xe2, 0xe0, 0x51, 0x38, 0x41, - 0xc5, 0xec, 0x54, 0x50, 0xc8, 0x3b, 0x30, 0xc6, 0xdf, 0x83, 0x85, 0xdd, 0xe2, 0xd9, 0xac, 0x66, - 0xf2, 0x78, 0x01, 0x38, 0x11, 0xd1, 0xe8, 0x27, 0x30, 0x05, 0x91, 0xf1, 0x73, 0x39, 0x20, 0x69, - 0xd4, 0x63, 0xf4, 0x5e, 0xc7, 0x1a, 0x13, 0x7d, 0x31, 0x5a, 0x8d, 0x05, 0x4d, 0x67, 0xce, 0x6a, - 0xe2, 0x05, 0xbc, 0xe3, 0xc5, 0xaa, 0x53, 0x15, 0x71, 0xbc, 0xd8, 0xf8, 0x91, 0x3c, 0x40, 0x8c, - 0x4d, 0x3e, 0xcf, 0x73, 0xd3, 0xbd, 0xdf, 0xb3, 0xdb, 0xce, 0xae, 0xa3, 0x47, 0x08, 0x46, 0x26, - 0x5f, 0x97, 0x25, 0xa6, 0x8e, 0x48, 0xde, 0x83, 0x99, 0x46, 0x5d, 0xa7, 0x55, 0x6c, 0xe9, 0x83, - 0xae, 0x95, 0x20, 0x4f, 0x62, 0xa3, 0x7d, 0xb2, 0x3a, 0x1a, 0xdc, 0x3e, 0x99, 0x0f, 0x84, 0x28, - 0x61, 0x1b, 0x4b, 0xa3, 0x2e, 0xdc, 0x05, 0x5a, 0xd1, 0xab, 0x26, 0x7e, 0x5d, 0xd0, 0xb5, 0xba, - 0xc2, 0x8f, 0x80, 0xed, 0x13, 0x1a, 0x5e, 0xdc, 0x91, 0xa3, 0x7d, 0x62, 0x02, 0xfc, 0x3c, 0xaa, - 0xfd, 0x3a, 0x5e, 0x48, 0x85, 0xb6, 0xe3, 0x89, 0xbd, 0xf7, 0xc4, 0xc6, 0x04, 0xa3, 0x9a, 0xab, - 0xb3, 0xd6, 0x3a, 0x61, 0x30, 0x73, 0x35, 0xbe, 0xa4, 0x70, 0xb3, 0x82, 0x0c, 0x1b, 0x9b, 0xbf, - 0x9b, 0x83, 0x53, 0x99, 0xb4, 0xe4, 0x12, 0x40, 0xac, 0x53, 0x12, 0xbd, 0x84, 0x3b, 0x66, 0x1c, - 0x32, 0xc9, 0x54, 0x30, 0xc8, 0x57, 0x92, 0xda, 0xa0, 0xe3, 0x0f, 0xc2, 0x45, 0x19, 0xa9, 0x50, - 0xd7, 0x06, 0x65, 0xe8, 0x80, 0x8c, 0x5f, 0x2a, 0xc0, 0xac, 0x12, 0x91, 0x89, 0x7f, 0xeb, 0x31, - 0xf6, 0xe2, 0x07, 0x50, 0x62, 0xad, 0x71, 0x9a, 0xc2, 0x57, 0x87, 0x1b, 0xbe, 0xbc, 0x92, 0x72, - 0x56, 0x15, 0xdc, 0x2e, 0xa9, 0xc8, 0x3c, 0x7e, 0x28, 0x6e, 0x9d, 0xf8, 0x20, 0xd1, 0x4c, 0xfb, - 0xe9, 0x68, 0xcc, 0x49, 0x00, 0x53, 0xd5, 0x43, 0xd7, 0xee, 0x44, 0xb5, 0x71, 0x03, 0x98, 0x57, - 0xfb, 0xd6, 0xa6, 0x61, 0xf3, 0xea, 0x62, 0xb7, 0x2e, 0x5e, 0x96, 0x11, 0x51, 0x40, 0xa3, 0x5a, - 0x7c, 0x0f, 0x66, 0x53, 0x1f, 0x7d, 0xa2, 0x50, 0xa6, 0xf7, 0x80, 0xa4, 0xbf, 0x23, 0x83, 0xc3, - 0xab, 0x7a, 0xa0, 0xdc, 0x53, 0xd1, 0xe3, 0x75, 0xa7, 0x63, 0xbb, 0x2d, 0x6e, 0x4e, 0xb3, 0xac, - 0x06, 0x3a, 0xfd, 0xf9, 0xbc, 0xea, 0x30, 0xfc, 0xa4, 0xaf, 0xba, 0x2f, 0x6a, 0xb7, 0xe1, 0xe7, - 0xfa, 0x8d, 0xe9, 0x50, 0x5a, 0x87, 0xef, 0x14, 0xe0, 0x4c, 0x1f, 0x4a, 0x72, 0x98, 0x9c, 0x44, - 0x5c, 0x0b, 0x71, 0x65, 0x70, 0x85, 0x8f, 0x63, 0x2a, 0x91, 0xcf, 0xf3, 0x90, 0x21, 0x22, 0x91, - 0x35, 0xbf, 0x7f, 0xa3, 0x1a, 0xff, 0x20, 0x82, 0x26, 0x63, 0x85, 0x70, 0x28, 0x79, 0x0f, 0x46, - 0xd1, 0x5b, 0x3c, 0x11, 0x13, 0x92, 0x61, 0x20, 0x5c, 0x89, 0x6a, 0xca, 0x7e, 0x6a, 0x51, 0x4d, - 0x19, 0x80, 0x7c, 0x0e, 0x0a, 0x95, 0x7b, 0x0d, 0x31, 0x2e, 0xd3, 0x2a, 0xf9, 0xbd, 0x46, 0x9c, - 0x9c, 0xc6, 0xd6, 0xb2, 0xc8, 0x30, 0x0a, 0x46, 0x78, 0x63, 0xb5, 0x2e, 0x46, 0x45, 0x25, 0xbc, - 0xb1, 0x5a, 0x8f, 0x09, 0xf7, 0x9a, 0x5a, 0x84, 0xad, 0x1b, 0xab, 0xf5, 0x4f, 0x6f, 0xda, 0xff, - 0x47, 0x79, 0x1e, 0xe7, 0x84, 0x37, 0xec, 0x3d, 0x28, 0x69, 0x81, 0xcc, 0x73, 0xb1, 0x3c, 0x16, - 0x45, 0xaa, 0x4f, 0x58, 0x0c, 0x69, 0x04, 0x32, 0xcd, 0x13, 0xfb, 0xad, 0x06, 0x70, 0x8f, 0xd2, - 0x3c, 0x21, 0x87, 0xa4, 0x2b, 0x91, 0x4e, 0x42, 0xae, 0x42, 0x71, 0x8b, 0xba, 0xb6, 0x1b, 0x46, - 0x0a, 0x51, 0x34, 0x2e, 0x0e, 0x11, 0xa6, 0x4b, 0x0d, 0x11, 0x22, 0x1a, 0xc2, 0xf6, 0x76, 0x82, - 0xa6, 0xef, 0x60, 0x3c, 0xa4, 0xe8, 0x2c, 0xe6, 0x86, 0xb0, 0x4a, 0x89, 0xce, 0x20, 0x41, 0x64, - 0xfc, 0x7c, 0x0e, 0xc6, 0xc5, 0x40, 0xf2, 0xf4, 0x7c, 0x7b, 0xf1, 0x59, 0x22, 0x9c, 0x07, 0xf6, - 0x9c, 0xa4, 0xf3, 0xc0, 0x1e, 0x0f, 0x3a, 0x34, 0x21, 0xbc, 0xf1, 0xa2, 0xa7, 0x41, 0x9c, 0x8d, - 0xd2, 0x57, 0x54, 0xcf, 0xbe, 0x16, 0xa1, 0x0e, 0xeb, 0xc5, 0x65, 0xfc, 0x4d, 0xf1, 0x65, 0x37, - 0x56, 0xeb, 0x64, 0x19, 0x8a, 0x1b, 0x1e, 0x8f, 0x9f, 0xa5, 0xe6, 0x9a, 0x6e, 0x0b, 0x98, 0xda, - 0x41, 0x12, 0x8f, 0x7d, 0x5f, 0xdd, 0xf7, 0xc4, 0x5d, 0x46, 0xf9, 0xbe, 0x2e, 0x07, 0x26, 0xbe, - 0x2f, 0x42, 0x1d, 0xfa, 0xfb, 0x68, 0xc6, 0x26, 0x71, 0xf7, 0x2a, 0xe6, 0xbf, 0xb9, 0xa9, 0x7a, - 0xc7, 0x89, 0x22, 0xb9, 0x53, 0x2c, 0xf6, 0xdb, 0x29, 0xee, 0x5e, 0x35, 0x33, 0xa8, 0xf0, 0x5d, - 0x2d, 0x06, 0x37, 0xa8, 0x7f, 0xff, 0x09, 0xde, 0xa5, 0xb3, 0xdf, 0xd5, 0x92, 0xcd, 0x1b, 0x6a, - 0x93, 0xfe, 0x9d, 0x3c, 0x9c, 0xce, 0x26, 0x54, 0xdb, 0x92, 0x1b, 0xd0, 0x96, 0x0b, 0x50, 0x5c, - 0xf7, 0x82, 0x50, 0x31, 0x12, 0x44, 0xf5, 0xff, 0xbe, 0x80, 0x99, 0x51, 0x29, 0xbb, 0x73, 0xb3, - 0xbf, 0xa3, 0xe5, 0x89, 0xfc, 0x30, 0xba, 0x07, 0xbb, 0x73, 0xf3, 0x22, 0x72, 0x03, 0x8a, 0xa6, - 0x70, 0xb4, 0x4a, 0x74, 0x8d, 0x04, 0x47, 0xd2, 0x14, 0xf1, 0x05, 0x44, 0x8b, 0x27, 0x2f, 0x60, - 0xa4, 0x02, 0xe3, 0x62, 0xf4, 0x13, 0x4f, 0xc7, 0x19, 0x53, 0x46, 0x4f, 0xf1, 0x20, 0xe9, 0xd8, - 0x8e, 0x82, 0x8f, 0x80, 0xb5, 0xaa, 0xf4, 0x99, 0xc2, 0x1d, 0x85, 0x3f, 0x12, 0xea, 0xf6, 0x98, - 0x11, 0xa2, 0xf1, 0xcd, 0x3c, 0x80, 0xd4, 0xda, 0x3c, 0xb1, 0x33, 0xec, 0x73, 0xda, 0x0c, 0x53, - 0xec, 0x8d, 0x86, 0xcf, 0x81, 0x7d, 0x07, 0xcd, 0x79, 0x86, 0xcf, 0x80, 0xbd, 0x04, 0xa3, 0x5b, - 0xb1, 0x42, 0x4b, 0xb8, 0xa4, 0xa0, 0x3a, 0x9a, 0xc3, 0x8d, 0x1d, 0x98, 0xbf, 0x41, 0xc3, 0x58, - 0xbd, 0x25, 0x9f, 0x1e, 0x07, 0xb3, 0x7d, 0x0d, 0x26, 0x04, 0x7e, 0xb4, 0x7f, 0x71, 0x5d, 0x8c, - 0x08, 0x98, 0x83, 0xba, 0x18, 0x89, 0xc0, 0x76, 0xa3, 0x2a, 0x6d, 0xd3, 0x90, 0x7e, 0xba, 0xd5, - 0x34, 0x80, 0xf0, 0xa6, 0x60, 0xcb, 0x86, 0xab, 0xe1, 0xd8, 0xfe, 0xb9, 0x0b, 0xa7, 0xa2, 0x6f, - 0x7f, 0x9c, 0x7c, 0x2f, 0xb3, 0x2b, 0xa5, 0xc8, 0x8e, 0x10, 0x73, 0x1c, 0x60, 0x7b, 0xf2, 0x7b, - 0x39, 0x58, 0x94, 0x14, 0xf7, 0x9c, 0xc8, 0x72, 0x72, 0x28, 0x62, 0xf2, 0x36, 0x4c, 0x2a, 0x34, - 0x22, 0xbc, 0x3f, 0xea, 0xa9, 0x1f, 0x38, 0xe1, 0xbe, 0x15, 0x70, 0xb8, 0xaa, 0xa7, 0x56, 0xd0, - 0xc9, 0x0e, 0x2c, 0x36, 0x2a, 0xb7, 0x37, 0xee, 0xda, 0x6d, 0xa7, 0x85, 0xdb, 0xc0, 0xa6, 0x77, - 0xdd, 0x6b, 0xb7, 0xbd, 0x07, 0xdb, 0xe6, 0x86, 0xcc, 0xd1, 0x83, 0x51, 0x41, 0x50, 0xe9, 0x7d, - 0x3f, 0x42, 0xb3, 0x5c, 0xcf, 0xda, 0x45, 0x44, 0xab, 0xe7, 0xb7, 0x03, 0x73, 0x00, 0x17, 0xe3, - 0x9f, 0xe5, 0xe0, 0xe9, 0xc8, 0x39, 0x29, 0xa3, 0x7d, 0x89, 0x16, 0xe4, 0x1e, 0x67, 0x0b, 0xf2, - 0x8f, 0xa5, 0x05, 0x9b, 0xf1, 0xf8, 0xd4, 0xdc, 0xc8, 0x31, 0x5c, 0x7e, 0x3f, 0x51, 0xc7, 0x47, - 0x8c, 0xca, 0x33, 0x29, 0x57, 0x73, 0xc5, 0xa3, 0xdc, 0x78, 0x4b, 0xe9, 0x90, 0x0c, 0x86, 0x1a, - 0x71, 0x2e, 0x49, 0xfc, 0xcd, 0x3c, 0xcc, 0xdc, 0xa9, 0x55, 0x57, 0x23, 0x3b, 0xaa, 0xef, 0xb1, - 0x5c, 0xe3, 0x5a, 0xdb, 0xfa, 0xef, 0x9c, 0xc6, 0x36, 0xcc, 0x25, 0xba, 0x01, 0x85, 0xa0, 0x77, - 0xb9, 0xeb, 0x4c, 0x04, 0x96, 0x02, 0xd0, 0xe9, 0x2c, 0xf6, 0x77, 0xaf, 0x9a, 0x09, 0x6c, 0xe3, - 0xff, 0x80, 0x04, 0x5f, 0xb1, 0x19, 0xbf, 0x06, 0x13, 0xb5, 0x20, 0xe8, 0x51, 0x7f, 0xdb, 0xdc, - 0x50, 0x95, 0x1e, 0x0e, 0x02, 0xd9, 0x1c, 0x32, 0x63, 0x04, 0x72, 0x11, 0x8a, 0x22, 0x46, 0xbc, - 0xdc, 0xdd, 0x50, 0xff, 0x1c, 0x85, 0x98, 0x37, 0xa3, 0x62, 0xf2, 0x06, 0x94, 0xf8, 0xdf, 0x7c, - 0x46, 0x8b, 0x0e, 0x47, 0x35, 0xa7, 0x40, 0xe7, 0x2b, 0xc0, 0xd4, 0xd0, 0xc8, 0x2b, 0x50, 0xa8, - 0xac, 0x9a, 0x42, 0xb1, 0x25, 0x24, 0x60, 0xdf, 0xe2, 0xda, 0x47, 0xed, 0x3a, 0xb4, 0x6a, 0x32, - 0x39, 0x56, 0xc6, 0xda, 0x10, 0x3a, 0x79, 0x9c, 0x01, 0x52, 0x6f, 0x96, 0x38, 0x96, 0x11, 0x46, - 0x2e, 0xc3, 0x78, 0x95, 0x1b, 0xff, 0x09, 0x8d, 0x3c, 0xcf, 0x49, 0xc9, 0x41, 0x5a, 0x6c, 0x09, - 0x0e, 0x22, 0x17, 0x65, 0x56, 0xbb, 0x62, 0xec, 0x81, 0xd3, 0x27, 0x75, 0xdd, 0x6b, 0x30, 0x26, - 0x22, 0xa9, 0x4f, 0x28, 0xa9, 0x6b, 0x92, 0x11, 0xd4, 0x05, 0x4e, 0xda, 0x15, 0x17, 0x1e, 0xa7, - 0x2b, 0xee, 0x0e, 0x9c, 0xb9, 0x81, 0x7a, 0x28, 0x3d, 0x1e, 0xd8, 0xb6, 0x59, 0x13, 0x9a, 0x7d, - 0x7c, 0xd0, 0xe2, 0xaa, 0xaa, 0x64, 0x48, 0x31, 0xab, 0xe7, 0xab, 0x29, 0x96, 0xfb, 0x31, 0x22, - 0x5f, 0x82, 0xf9, 0xac, 0x22, 0xa1, 0xff, 0xc7, 0xc8, 0x57, 0xd9, 0x15, 0xa8, 0x91, 0xaf, 0xb2, - 0x38, 0x90, 0x0d, 0x28, 0x73, 0x78, 0xa5, 0xd5, 0x71, 0x5c, 0xfe, 0x86, 0xc1, 0xdf, 0x07, 0xd0, - 0x25, 0x46, 0x70, 0xb5, 0x59, 0x21, 0x7f, 0xcb, 0xd0, 0x9c, 0xa8, 0x12, 0x94, 0xe4, 0xaf, 0xe4, - 0xd8, 0xbd, 0x94, 0xc7, 0x1d, 0xc7, 0xed, 0x73, 0x5a, 0xbc, 0x86, 0x46, 0x5e, 0x4d, 0x8d, 0xd0, - 0x77, 0xdc, 0x3d, 0xe1, 0x20, 0xb5, 0x25, 0x1c, 0xa4, 0xde, 0xfe, 0x58, 0x0e, 0x52, 0x9c, 0x55, - 0xf0, 0xe8, 0x68, 0xa9, 0xe4, 0x8b, 0x3a, 0x71, 0x15, 0x69, 0x5f, 0xc0, 0xba, 0x0e, 0xbd, 0x84, - 0xb7, 0x5d, 0x1e, 0xf5, 0x98, 0xb6, 0x78, 0x23, 0x67, 0x70, 0x63, 0xc7, 0xae, 0xb3, 0xf9, 0x26, - 0x1e, 0x21, 0xa4, 0x1a, 0x9a, 0xc9, 0x81, 0x5d, 0xa1, 0xa5, 0x13, 0x0e, 0xf7, 0x2b, 0x2e, 0xc7, - 0x57, 0x68, 0xe9, 0xb1, 0x63, 0xe1, 0x34, 0x52, 0x27, 0x8f, 0x46, 0x42, 0x2e, 0xc3, 0xd8, 0x6d, - 0xfb, 0x61, 0x65, 0x8f, 0x8a, 0x1c, 0xac, 0x53, 0x72, 0xfb, 0x43, 0xe0, 0x4a, 0xf1, 0x77, 0xb9, - 0xd7, 0xc6, 0x53, 0xa6, 0x40, 0x23, 0x3f, 0x98, 0x83, 0xd3, 0x7c, 0x19, 0xcb, 0x56, 0x36, 0x68, - 0x18, 0xb2, 0x7e, 0x10, 0xe1, 0x13, 0xcf, 0xc5, 0xa6, 0xe7, 0xd9, 0x78, 0x18, 0x43, 0xc0, 0x10, - 0x3b, 0x43, 0xd4, 0x71, 0x81, 0x28, 0xd5, 0xe2, 0x50, 0x67, 0xd2, 0x93, 0x2d, 0x98, 0xbc, 0x7d, - 0xbd, 0x12, 0x55, 0xcb, 0x83, 0xd3, 0x2f, 0x65, 0xed, 0x8e, 0x0a, 0x5a, 0x96, 0xcf, 0x84, 0xca, - 0x06, 0x45, 0xff, 0x5b, 0xab, 0x6b, 0xe8, 0xb6, 0x3f, 0x1f, 0x2b, 0x13, 0xba, 0x07, 0x4d, 0x9a, - 0x0c, 0x90, 0x1d, 0x21, 0x0a, 0xe7, 0x88, 0xcf, 0xc9, 0x4e, 0x24, 0xaf, 0xab, 0x9e, 0xb8, 0x05, - 0xe4, 0x30, 0xde, 0xb1, 0x1f, 0x5a, 0xf6, 0x1e, 0xd5, 0x8c, 0x04, 0x84, 0xf2, 0xfe, 0x67, 0x73, - 0x70, 0xb6, 0x6f, 0x3f, 0x91, 0x6b, 0x70, 0xc6, 0xe6, 0xfe, 0xe5, 0xd6, 0x7e, 0x18, 0x76, 0x03, - 0x4b, 0xde, 0xb0, 0x84, 0xef, 0xae, 0x79, 0x4a, 0x14, 0xaf, 0xb3, 0x52, 0x79, 0xe9, 0x0a, 0xc8, - 0x7b, 0xf0, 0x8c, 0xe3, 0x06, 0xb4, 0xd9, 0xf3, 0xa9, 0x25, 0x19, 0x34, 0x9d, 0x96, 0x6f, 0xf9, - 0xb6, 0xbb, 0x27, 0x1d, 0x91, 0xcd, 0xb3, 0x12, 0x47, 0xf8, 0xb0, 0xaf, 0x3a, 0x2d, 0xdf, 0x44, - 0x04, 0xe3, 0xdf, 0xe6, 0x60, 0xa1, 0x5f, 0x3f, 0x92, 0x05, 0x18, 0xa7, 0x4a, 0x6e, 0x9b, 0xa2, - 0x29, 0x7f, 0x92, 0xa7, 0x21, 0x3e, 0x1e, 0x84, 0xc8, 0x50, 0x6c, 0x8a, 0x3c, 0x23, 0x68, 0xd9, - 0xaf, 0x1e, 0x06, 0xc2, 0x3e, 0xbb, 0xd4, 0x54, 0x8f, 0x84, 0x67, 0x01, 0xe2, 0x33, 0x80, 0xeb, - 0x65, 0xcc, 0x09, 0xbb, 0xe9, 0xf3, 0xe5, 0x4a, 0x4e, 0xc3, 0x18, 0xdf, 0x63, 0x85, 0xfb, 0x87, - 0xf8, 0xc5, 0x0e, 0x7b, 0xd1, 0xc9, 0x78, 0x38, 0x14, 0x56, 0x4a, 0x5a, 0x67, 0x8f, 0x75, 0x70, - 0x70, 0x8c, 0x5f, 0x2b, 0x71, 0xb9, 0xa3, 0xd2, 0x0b, 0xf7, 0xa5, 0xa4, 0xb2, 0x9c, 0xe5, 0x2e, - 0xc7, 0x4d, 0x49, 0x15, 0xb3, 0x74, 0xdd, 0x49, 0x4e, 0x3e, 0x7d, 0xe5, 0x33, 0x9f, 0xbe, 0x5e, - 0x83, 0x89, 0xd5, 0x7d, 0xda, 0x3c, 0x88, 0x7c, 0x90, 0x8a, 0xe2, 0x6d, 0x81, 0x01, 0x79, 0x18, - 0xf9, 0x18, 0x81, 0x5c, 0x06, 0x40, 0x2f, 0x5d, 0x2e, 0x90, 0x2b, 0xa9, 0x60, 0xd0, 0xa9, 0x57, - 0x58, 0xe7, 0x28, 0x28, 0xc8, 0xbe, 0x61, 0x5e, 0x57, 0xcd, 0x79, 0x38, 0xfb, 0xc0, 0xdf, 0x15, - 0xe8, 0x31, 0x02, 0x6b, 0x9e, 0xb2, 0x19, 0x89, 0xa3, 0xb3, 0x9c, 0xda, 0xb1, 0x54, 0x24, 0xf2, - 0x39, 0x18, 0x5f, 0xa5, 0x7e, 0xb8, 0xb5, 0xb5, 0x81, 0x36, 0x34, 0x3c, 0x03, 0x4a, 0x11, 0xb3, - 0x55, 0x84, 0x61, 0xfb, 0xbb, 0x47, 0x4b, 0x53, 0xa1, 0xd3, 0xa1, 0x51, 0x64, 0x77, 0x53, 0x62, - 0x93, 0x15, 0x28, 0xf3, 0x57, 0xfe, 0xf8, 0x2a, 0x85, 0xc7, 0x63, 0x91, 0x1f, 0xd6, 0xc2, 0x24, - 0xe0, 0x01, 0xdd, 0x89, 0x72, 0x75, 0xa4, 0xf0, 0xc9, 0x9a, 0x4c, 0x71, 0xa3, 0x7e, 0x36, 0xc4, - 0xcb, 0x31, 0xb9, 0x6d, 0xb0, 0xaf, 0x4f, 0x53, 0x90, 0x0a, 0x4c, 0xad, 0x7a, 0x9d, 0xae, 0x1d, - 0x3a, 0x98, 0x40, 0xf4, 0x50, 0x9c, 0x84, 0xa8, 0x9f, 0x6c, 0xaa, 0x05, 0xda, 0xb1, 0xaa, 0x16, - 0x90, 0xeb, 0x30, 0x6d, 0x7a, 0x3d, 0xd6, 0xed, 0x52, 0xa9, 0xc0, 0x0f, 0x3b, 0xb4, 0x74, 0xf1, - 0x59, 0x09, 0x3b, 0x9b, 0x85, 0x06, 0x41, 0x8b, 0x82, 0xab, 0x51, 0x91, 0xcd, 0x8c, 0xd7, 0x1d, - 0xf5, 0x84, 0x53, 0x33, 0x76, 0xa4, 0x98, 0x65, 0x3c, 0x0c, 0x5d, 0x85, 0xc9, 0x46, 0xe3, 0xce, - 0x16, 0x0d, 0xc2, 0xeb, 0x6d, 0xef, 0x01, 0x1e, 0x70, 0x45, 0x91, 0x60, 0x2e, 0xf0, 0xac, 0x90, - 0x06, 0xa1, 0xb5, 0xdb, 0xf6, 0x1e, 0x98, 0x2a, 0x16, 0xf9, 0x2a, 0xeb, 0x0f, 0x45, 0x1c, 0x14, - 0xf1, 0x7e, 0x07, 0x49, 0xac, 0x78, 0x8c, 0xc4, 0x8b, 0x80, 0xc9, 0xad, 0x7a, 0x67, 0x29, 0xe8, - 0xe8, 0x22, 0xe7, 0x7b, 0x0f, 0x0f, 0x2b, 0xad, 0x96, 0x4f, 0x83, 0x40, 0x9c, 0x44, 0xdc, 0x45, - 0x0e, 0x75, 0x27, 0x36, 0x2f, 0xd0, 0x5c, 0xe4, 0x14, 0x02, 0xb2, 0xca, 0x44, 0x24, 0x36, 0x8a, - 0x68, 0x7b, 0x55, 0xab, 0xe3, 0x61, 0x22, 0x94, 0xb2, 0x62, 0xcc, 0xb9, 0x95, 0x96, 0xd3, 0xd5, - 0x25, 0x21, 0x85, 0x86, 0xd4, 0x60, 0x86, 0x03, 0xd8, 0xd2, 0xe2, 0xe9, 0xa5, 0xe6, 0xe2, 0x04, - 0x17, 0x82, 0x0d, 0x9a, 0x0b, 0x60, 0x8a, 0x29, 0x35, 0x28, 0x6c, 0x82, 0x8e, 0xbc, 0x07, 0xd3, - 0x18, 0xbb, 0x3f, 0xf2, 0x33, 0xc2, 0x33, 0xa1, 0xc4, 0x63, 0xdb, 0x8a, 0x92, 0x84, 0xf3, 0x5e, - 0x29, 0x08, 0xf6, 0xeb, 0xd2, 0x01, 0x89, 0x31, 0x40, 0x73, 0x9f, 0x98, 0xc1, 0xa9, 0x98, 0x81, - 0x28, 0x49, 0x32, 0x08, 0xdb, 0x41, 0xcc, 0xe0, 0x67, 0x72, 0x70, 0x96, 0x55, 0xa4, 0xba, 0x14, - 0xe1, 0xa6, 0x80, 0xb6, 0x4c, 0x3c, 0xef, 0xc8, 0xeb, 0x97, 0xa4, 0x7c, 0x72, 0x49, 0x41, 0xbb, - 0x74, 0xff, 0xca, 0xa5, 0x4a, 0xfc, 0xb3, 0x21, 0x89, 0x78, 0xb4, 0xcf, 0xbe, 0x3c, 0x55, 0x39, - 0x30, 0x08, 0xf6, 0xb3, 0x38, 0xe0, 0x47, 0xb1, 0x8f, 0xcf, 0xfe, 0xa8, 0x33, 0x1f, 0xfb, 0xa3, - 0xfa, 0xf2, 0x54, 0x3f, 0x2a, 0x6c, 0x07, 0x99, 0x1f, 0x75, 0x0d, 0xa6, 0xf0, 0x94, 0x16, 0xd2, - 0x91, 0x2f, 0xb2, 0x9a, 0xe0, 0x9a, 0xd0, 0x0a, 0xcc, 0x12, 0xfb, 0x79, 0x57, 0xfc, 0xba, 0x39, - 0x52, 0x1c, 0x2f, 0x17, 0x6f, 0x8e, 0x14, 0x67, 0xcb, 0xc4, 0x9c, 0x88, 0x3a, 0xde, 0x3c, 0x95, - 0xf9, 0x21, 0x78, 0x6b, 0x65, 0x37, 0xec, 0xf8, 0xea, 0xf5, 0xbd, 0xe5, 0x5f, 0xa3, 0xb5, 0x6d, - 0x80, 0x7f, 0xcd, 0x36, 0x77, 0xf7, 0x56, 0xba, 0x41, 0xde, 0x5a, 0x35, 0x70, 0xf2, 0xd6, 0x9a, - 0xa0, 0x31, 0x13, 0xd8, 0xc6, 0x37, 0x27, 0x13, 0x7c, 0x85, 0x4d, 0xad, 0x01, 0x63, 0xfc, 0x52, - 0x2a, 0x3a, 0x19, 0x8d, 0x2b, 0xf8, 0x95, 0xd5, 0x14, 0x25, 0xe4, 0x2c, 0x14, 0x1a, 0x8d, 0x3b, - 0xa2, 0x93, 0xd1, 0xb2, 0x36, 0x08, 0x3c, 0x93, 0xc1, 0xd8, 0x08, 0xa1, 0xb9, 0xac, 0x92, 0x71, - 0x81, 0x9d, 0x64, 0x26, 0x42, 0x59, 0x7f, 0xcb, 0x2b, 0xe2, 0x48, 0xdc, 0xdf, 0xe2, 0x8a, 0x18, - 0x5f, 0x0c, 0x57, 0x61, 0xa1, 0x12, 0x04, 0xd4, 0x67, 0x33, 0x42, 0x58, 0x61, 0xfa, 0xe2, 0x1a, - 0x23, 0x8e, 0x60, 0xac, 0xd4, 0x6e, 0x06, 0x66, 0x5f, 0x44, 0x72, 0x01, 0x8a, 0x95, 0x5e, 0xcb, - 0xa1, 0x6e, 0x53, 0x8b, 0x1f, 0x67, 0x0b, 0x98, 0x19, 0x95, 0x92, 0xf7, 0xe1, 0x54, 0x22, 0xbe, - 0xa4, 0xe8, 0x81, 0xf1, 0x78, 0x57, 0x95, 0xd7, 0xac, 0xd8, 0x72, 0x84, 0x77, 0x49, 0x36, 0x25, - 0xa9, 0x40, 0x79, 0x0d, 0xfd, 0xc9, 0xaa, 0x94, 0x3f, 0x62, 0x79, 0x3e, 0x77, 0x24, 0xe4, 0x97, - 0x62, 0x11, 0x45, 0xb3, 0x15, 0x15, 0x9a, 0x29, 0x74, 0x72, 0x0b, 0xe6, 0x92, 0x30, 0x76, 0x36, - 0xf3, 0xfb, 0x2f, 0xee, 0x6a, 0x29, 0x2e, 0x78, 0x3a, 0x67, 0x51, 0x91, 0x1d, 0x98, 0x8d, 0x2d, - 0xa7, 0xf4, 0x5b, 0xb1, 0x34, 0xc8, 0x8e, 0xca, 0xe5, 0xcd, 0xf8, 0x69, 0x31, 0x19, 0xe7, 0x62, - 0x2b, 0xac, 0xe8, 0x76, 0x6c, 0xa6, 0xd9, 0x91, 0x16, 0x4c, 0x37, 0x9c, 0x3d, 0xd7, 0x71, 0xf7, - 0x6e, 0xd1, 0xc3, 0xba, 0xed, 0xf8, 0xc2, 0x34, 0x56, 0x1a, 0xbe, 0x57, 0x82, 0xc3, 0x4e, 0x87, - 0x86, 0x3e, 0xae, 0x7a, 0x56, 0x8e, 0xce, 0xf2, 0xec, 0xb6, 0xb3, 0x18, 0x70, 0x3a, 0xf4, 0x2f, - 0xed, 0xda, 0x8e, 0x76, 0xbc, 0xeb, 0x3c, 0x35, 0xcd, 0x44, 0x69, 0x48, 0xcd, 0x44, 0x1b, 0x66, - 0xd7, 0xdc, 0xa6, 0x7f, 0x88, 0x6f, 0x89, 0xf2, 0xe3, 0xa6, 0x8e, 0xf9, 0xb8, 0x17, 0xc5, 0xc7, - 0x3d, 0x63, 0xcb, 0x19, 0x96, 0xf5, 0x79, 0x69, 0xc6, 0xa4, 0x01, 0xb3, 0x28, 0xe2, 0xd7, 0xaa, - 0xf5, 0x9a, 0xeb, 0x84, 0x8e, 0x1d, 0xd2, 0x96, 0x10, 0x1b, 0xa2, 0x3c, 0x35, 0xfc, 0x06, 0xea, - 0xb4, 0xba, 0x96, 0x23, 0x51, 0x54, 0xa6, 0x29, 0xfa, 0x41, 0xd7, 0xc0, 0x99, 0x3f, 0xa5, 0x6b, - 0x60, 0x0d, 0x66, 0x92, 0x31, 0x27, 0xca, 0xf1, 0x69, 0x1f, 0x60, 0x11, 0x13, 0x1a, 0xbc, 0x1e, - 0x8a, 0x89, 0x5a, 0x6a, 0xd8, 0x44, 0xb4, 0x89, 0xc4, 0x8d, 0x72, 0x56, 0xbb, 0x51, 0x6a, 0xbb, - 0xd2, 0x49, 0x6e, 0x94, 0x75, 0x80, 0xeb, 0x9e, 0xdf, 0xa4, 0x15, 0x74, 0xe4, 0x26, 0x5a, 0x36, - 0x2f, 0xc6, 0x34, 0x2e, 0xe4, 0xeb, 0x67, 0x97, 0xfd, 0xb6, 0x92, 0xfe, 0xf8, 0x0a, 0x0f, 0x62, - 0xc3, 0x99, 0xba, 0x4f, 0x77, 0xa9, 0xef, 0xd3, 0x96, 0xb8, 0xc1, 0xac, 0x38, 0x6e, 0x4b, 0xa6, - 0x68, 0x13, 0xf1, 0xbc, 0xbb, 0x12, 0x25, 0x32, 0x24, 0xdf, 0xe1, 0x48, 0xea, 0x61, 0xda, 0x87, - 0x8f, 0xf1, 0xe3, 0x79, 0x58, 0xe8, 0xd7, 0xe2, 0x01, 0x77, 0xbf, 0x57, 0x21, 0xbd, 0x89, 0x88, - 0x3b, 0x60, 0x99, 0x26, 0xb7, 0x92, 0x65, 0xc8, 0xde, 0x2b, 0xc4, 0x9d, 0x70, 0x2e, 0x49, 0xb0, - 0xed, 0xb7, 0xc9, 0x35, 0x98, 0x54, 0xfa, 0x07, 0xb7, 0xeb, 0x7e, 0xbd, 0x69, 0xc2, 0x6e, 0xdc, - 0x65, 0xa7, 0x41, 0x9c, 0x16, 0xf2, 0xce, 0xc8, 0x7f, 0x91, 0x32, 0x77, 0x97, 0x1f, 0xe3, 0x16, - 0x11, 0x41, 0xe0, 0x11, 0x02, 0x78, 0x34, 0xf0, 0x5d, 0xd6, 0xc4, 0xbf, 0x8d, 0x5f, 0x2c, 0xf1, - 0x43, 0x5f, 0xbd, 0x32, 0xf6, 0xb3, 0x95, 0x4e, 0x5c, 0x25, 0xf3, 0x27, 0xb9, 0x4a, 0x16, 0x8e, - 0xbf, 0x4a, 0x8e, 0x1c, 0x77, 0x95, 0x4c, 0xdc, 0xf5, 0x46, 0x4f, 0x78, 0xd7, 0x1b, 0x3f, 0xd1, - 0x5d, 0x4f, 0xbb, 0x86, 0x16, 0x8f, 0xbb, 0x86, 0xfe, 0xf9, 0xcd, 0xf0, 0x49, 0xbd, 0x19, 0x66, - 0x49, 0x85, 0x27, 0xba, 0x19, 0xa6, 0x2e, 0x76, 0xb3, 0x8f, 0xe7, 0x62, 0x47, 0x1e, 0xdb, 0xc5, - 0x6e, 0xee, 0x93, 0x5e, 0xec, 0xe6, 0x1f, 0xe7, 0xc5, 0xee, 0xd4, 0x9f, 0xc5, 0x8b, 0xdd, 0xe9, - 0xff, 0x30, 0x17, 0xbb, 0xab, 0x50, 0xac, 0x7b, 0x41, 0x78, 0xdd, 0xf3, 0x3b, 0x78, 0xb7, 0x2c, - 0x09, 0x95, 0xac, 0x17, 0xf0, 0x2c, 0xc9, 0x9a, 0x70, 0x25, 0x10, 0xc9, 0x8a, 0x9c, 0x70, 0xf2, - 0x26, 0xb5, 0x10, 0x6b, 0xc5, 0xc5, 0x4c, 0x11, 0x17, 0xaa, 0xf4, 0x7c, 0x13, 0x24, 0x37, 0x47, - 0x8a, 0x63, 0xe5, 0xf1, 0x9b, 0x23, 0xc5, 0x72, 0x79, 0x76, 0x88, 0x9b, 0xe1, 0x5f, 0x80, 0x72, - 0x52, 0x58, 0x3d, 0x3e, 0xdc, 0xf3, 0x63, 0x8b, 0xb5, 0xc9, 0x44, 0xe9, 0xa4, 0xb0, 0x48, 0x2e, - 0x03, 0xd4, 0x7d, 0xe7, 0xbe, 0x1d, 0xd2, 0x5b, 0xd2, 0xec, 0x4f, 0xc4, 0x37, 0xe7, 0x50, 0x36, - 0x41, 0x4d, 0x05, 0x25, 0xba, 0x27, 0xe5, 0xb3, 0xee, 0x49, 0xc6, 0x8f, 0xe5, 0x61, 0x96, 0x07, - 0xac, 0x7b, 0xf2, 0xdf, 0x6c, 0xdf, 0xd5, 0x6e, 0xbf, 0xcf, 0xc4, 0x19, 0x15, 0xd4, 0xd6, 0x0d, - 0x78, 0xb5, 0xfd, 0x10, 0x4e, 0xa5, 0xba, 0x02, 0x6f, 0xc0, 0x55, 0x19, 0x2a, 0x30, 0x75, 0x07, - 0x5e, 0xc8, 0xae, 0xe4, 0xee, 0x55, 0x33, 0x45, 0x61, 0xfc, 0xd1, 0x48, 0x8a, 0xbf, 0x78, 0xbf, - 0x55, 0x5f, 0x64, 0x73, 0x27, 0x7b, 0x91, 0xcd, 0x0f, 0xf7, 0x22, 0x9b, 0x90, 0x20, 0x0a, 0xc3, - 0x48, 0x10, 0xef, 0xc3, 0xd4, 0x16, 0xb5, 0x3b, 0xc1, 0x96, 0x27, 0xd2, 0x73, 0x71, 0x27, 0x13, - 0x19, 0x09, 0x90, 0x95, 0xc9, 0x0b, 0x5c, 0x64, 0x2c, 0x1b, 0x32, 0x02, 0x76, 0x46, 0xf2, 0x7c, - 0x5d, 0xa6, 0xce, 0x41, 0xbd, 0x95, 0x8f, 0x0e, 0xb8, 0x95, 0x37, 0xa0, 0x24, 0xe8, 0xe2, 0x18, - 0xd7, 0xf1, 0xf5, 0x91, 0x15, 0x21, 0x5c, 0xd6, 0x2e, 0xbd, 0x3d, 0xa7, 0xa3, 0xda, 0xf9, 0xcd, - 0x51, 0x63, 0xc2, 0xba, 0x60, 0xcd, 0x6d, 0x75, 0x3d, 0xc7, 0xc5, 0x2e, 0x18, 0x8f, 0xbb, 0x80, - 0x0a, 0x30, 0xef, 0x02, 0x05, 0x89, 0xbc, 0x0d, 0xd3, 0x95, 0x7a, 0x4d, 0x25, 0x2b, 0xc6, 0x8f, - 0xc2, 0x76, 0xd7, 0xb1, 0x34, 0xd2, 0x04, 0xee, 0xa0, 0x9b, 0xd4, 0xc4, 0x9f, 0xce, 0x4d, 0xca, - 0xf8, 0x8d, 0x92, 0x5c, 0xde, 0x9f, 0xee, 0xd3, 0x88, 0xfe, 0xd8, 0x51, 0x38, 0xe1, 0x63, 0xc7, - 0xc8, 0x71, 0x52, 0xa6, 0x22, 0xcc, 0x8e, 0x7d, 0xe2, 0x87, 0x8b, 0xf1, 0x13, 0x8a, 0xa7, 0x89, - 0xb5, 0x53, 0x1c, 0x66, 0xed, 0x64, 0x8a, 0xb4, 0x13, 0x9f, 0x5c, 0xa4, 0x85, 0x13, 0x8b, 0xb4, - 0x8d, 0xd8, 0x09, 0x7b, 0xf2, 0x58, 0xdf, 0x96, 0x67, 0x85, 0xd6, 0x60, 0x36, 0x3b, 0x9c, 0x60, - 0xe4, 0x8e, 0xfd, 0x3d, 0x25, 0x27, 0x7f, 0x2d, 0x5b, 0x4e, 0x1e, 0x7c, 0x7e, 0xfc, 0xb9, 0xa4, - 0xfc, 0xe7, 0x92, 0xf2, 0x9f, 0x8a, 0xa4, 0x7c, 0x07, 0x88, 0xdd, 0x0b, 0xf7, 0xa9, 0x1b, 0x3a, - 0x4d, 0x0c, 0x69, 0xcb, 0x86, 0x18, 0x65, 0x66, 0xb1, 0x46, 0xd2, 0xa5, 0xea, 0x1a, 0xd1, 0x4a, - 0xd9, 0x0c, 0xe0, 0x61, 0x40, 0x87, 0x96, 0x80, 0x7d, 0x5c, 0x51, 0xf7, 0x6c, 0xdf, 0x45, 0x35, - 0xd1, 0x65, 0x18, 0x97, 0x21, 0x54, 0x73, 0xb1, 0x92, 0x39, 0x1d, 0x3b, 0x55, 0x62, 0x91, 0x65, - 0x28, 0x4a, 0x62, 0x35, 0x11, 0xd0, 0x03, 0x01, 0xd3, 0xa2, 0x53, 0x0a, 0x98, 0xf1, 0x9f, 0x8c, - 0xc8, 0x5d, 0x9b, 0x7d, 0x70, 0xdd, 0xf6, 0xed, 0x0e, 0xe6, 0x08, 0x8c, 0x16, 0x95, 0x22, 0x7f, - 0x27, 0xd6, 0x61, 0xc2, 0x2d, 0x41, 0x27, 0xf9, 0x58, 0x31, 0x70, 0xe3, 0x34, 0xcc, 0x85, 0x21, - 0xd2, 0x30, 0xbf, 0xa9, 0xe5, 0x30, 0x1e, 0x89, 0x93, 0x66, 0xb2, 0x9d, 0x6c, 0x70, 0xf6, 0xe2, - 0x6b, 0x6a, 0xb2, 0xe1, 0xd1, 0x38, 0x22, 0x19, 0x52, 0x0e, 0x48, 0x33, 0x1c, 0x5d, 0x28, 0xc6, - 0x4e, 0x12, 0x5d, 0x7a, 0xfc, 0x3f, 0x68, 0x74, 0xe9, 0x35, 0x00, 0x71, 0xba, 0xc6, 0xb6, 0x08, - 0x2f, 0xe1, 0xe6, 0x23, 0x4c, 0xac, 0xc3, 0xb0, 0xdd, 0x27, 0xfd, 0x88, 0x42, 0x68, 0xfc, 0x2b, - 0x02, 0xb3, 0x8d, 0xc6, 0x9d, 0xaa, 0x63, 0xef, 0xb9, 0x5e, 0x10, 0x3a, 0xcd, 0x9a, 0xbb, 0xeb, - 0x31, 0x69, 0x3a, 0x3a, 0x01, 0x94, 0xb8, 0xc0, 0xf1, 0xee, 0x1f, 0x15, 0xb3, 0xdb, 0xda, 0x9a, - 0xef, 0x4b, 0x7d, 0x26, 0xbf, 0xad, 0x51, 0x06, 0x30, 0x39, 0x9c, 0x09, 0xac, 0x8d, 0x1e, 0x46, - 0xe5, 0x10, 0x06, 0x1f, 0x28, 0xb0, 0x06, 0x1c, 0x64, 0xca, 0x32, 0x42, 0xd3, 0x13, 0x56, 0x5c, - 0x60, 0xce, 0x68, 0x31, 0xaa, 0xe3, 0x62, 0xbe, 0x76, 0x85, 0xfc, 0x81, 0xbb, 0x76, 0x17, 0xe1, - 0xaa, 0x0d, 0x5c, 0x6a, 0x0d, 0x1c, 0xc2, 0x29, 0xcd, 0x5f, 0x7b, 0xd8, 0xf7, 0x95, 0x57, 0x84, - 0x80, 0x6c, 0xa0, 0x9d, 0x71, 0xc6, 0x23, 0x8b, 0x9a, 0xf4, 0x2f, 0xb3, 0x06, 0xf2, 0x63, 0x39, - 0x78, 0x36, 0xb3, 0x24, 0x5a, 0xdd, 0x93, 0x5a, 0x9c, 0x70, 0x65, 0xd3, 0xe0, 0xe9, 0x0d, 0xfb, - 0x55, 0x6d, 0x65, 0x6c, 0x05, 0x83, 0x6b, 0x22, 0xbf, 0x96, 0x83, 0x33, 0x1a, 0x46, 0xb4, 0x5b, - 0x06, 0x51, 0x28, 0x93, 0xcc, 0x79, 0xfd, 0xd1, 0xe3, 0x99, 0xd7, 0x2f, 0xe8, 0x6d, 0x89, 0x77, - 0x4b, 0xb5, 0x0d, 0xfd, 0xbe, 0x90, 0xdc, 0x87, 0x59, 0x2c, 0x92, 0x6f, 0x3d, 0x6c, 0xce, 0x8a, - 0x27, 0xa2, 0xf9, 0xf8, 0xb3, 0x79, 0x0c, 0x02, 0x4c, 0x51, 0xbf, 0xfc, 0x9d, 0xa3, 0xa5, 0x29, - 0x0d, 0x5d, 0x46, 0xde, 0xb6, 0xe2, 0x07, 0x23, 0xc7, 0xdd, 0xf5, 0xd4, 0x7d, 0x3f, 0x55, 0x05, - 0xf9, 0x67, 0x39, 0xae, 0xfe, 0xe7, 0xcd, 0xb8, 0xee, 0x7b, 0x9d, 0xa8, 0x5c, 0x1a, 0x53, 0xf6, - 0xe9, 0xb6, 0xf6, 0xe3, 0xe9, 0xb6, 0x97, 0xf0, 0x93, 0xf9, 0x9e, 0x60, 0xed, 0xfa, 0x5e, 0x27, - 0xfe, 0x7c, 0xb5, 0xe3, 0xfa, 0x7e, 0x24, 0xf9, 0xa1, 0x1c, 0x9c, 0xd5, 0xb4, 0x96, 0x6a, 0x1a, - 0x14, 0x11, 0xe9, 0x61, 0x2e, 0x8a, 0x01, 0x13, 0x17, 0xad, 0x5c, 0x12, 0xf3, 0xff, 0x3c, 0x7e, - 0x81, 0x12, 0x72, 0x94, 0x21, 0x59, 0x1d, 0x8e, 0xa5, 0x7c, 0x42, 0xff, 0x5a, 0x88, 0x03, 0xb3, - 0x68, 0x52, 0xa3, 0x19, 0xfd, 0xce, 0xf7, 0x37, 0xfa, 0x8d, 0x12, 0x1c, 0x61, 0xf2, 0x83, 0xfe, - 0x96, 0xbf, 0x69, 0xae, 0xe4, 0x07, 0xe0, 0x6c, 0x0a, 0x18, 0xad, 0xb6, 0x53, 0x7d, 0x57, 0xdb, - 0xab, 0x8f, 0x8e, 0x96, 0x5e, 0xce, 0xaa, 0x2d, 0x6b, 0xa5, 0xf5, 0xaf, 0x81, 0xd8, 0x00, 0x71, - 0xa1, 0x90, 0x7e, 0xb2, 0x27, 0xe8, 0xab, 0x62, 0x7e, 0x28, 0xf8, 0x6c, 0x2f, 0x57, 0xbe, 0x41, - 0x3d, 0xf2, 0x62, 0x24, 0x42, 0xa1, 0xa4, 0x24, 0x7e, 0x38, 0x14, 0x56, 0x26, 0x7d, 0x2a, 0xf9, - 0xce, 0xd1, 0x92, 0x86, 0xcd, 0xee, 0x40, 0x6a, 0x46, 0x09, 0x4d, 0xd8, 0x54, 0x11, 0xc9, 0xaf, - 0xe6, 0x60, 0x9e, 0x01, 0xe2, 0x49, 0x25, 0x1a, 0xb5, 0x30, 0x68, 0xd6, 0xef, 0x3f, 0x9e, 0x59, - 0xff, 0x3c, 0x7e, 0xa3, 0x3a, 0xeb, 0x53, 0x5d, 0x92, 0xf9, 0x71, 0x38, 0xdb, 0x35, 0xeb, 0x2d, - 0x6d, 0xb6, 0x9f, 0x1d, 0x62, 0xb6, 0xf3, 0x01, 0x38, 0x7e, 0xb6, 0xf7, 0xad, 0x85, 0x6c, 0x41, - 0x49, 0x5c, 0x7f, 0x78, 0x87, 0x3d, 0xa7, 0x85, 0xa0, 0x56, 0x8b, 0xf8, 0x9d, 0x54, 0xe4, 0xc5, - 0x48, 0xb5, 0x50, 0xe3, 0x42, 0x5c, 0x98, 0xe3, 0xbf, 0x75, 0xf5, 0xd2, 0x52, 0x5f, 0xf5, 0xd2, - 0x05, 0xd1, 0xa2, 0x73, 0x82, 0x7f, 0x42, 0xcb, 0xa4, 0x86, 0x8e, 0xca, 0x60, 0x4c, 0xba, 0x40, - 0x34, 0x30, 0x5f, 0xb4, 0xe7, 0x06, 0x2b, 0x95, 0x5e, 0x16, 0x75, 0x2e, 0x25, 0xeb, 0x4c, 0xae, - 0xdc, 0x0c, 0xde, 0xc4, 0x86, 0x19, 0x01, 0xf5, 0x0e, 0x28, 0xdf, 0xe1, 0x9f, 0xd7, 0x82, 0x77, - 0x25, 0x4a, 0xf9, 0x1d, 0x4e, 0xd6, 0x84, 0xc1, 0xd5, 0x12, 0x1b, 0x7a, 0x92, 0x1f, 0xb9, 0x03, - 0xb3, 0x95, 0x6e, 0xb7, 0xed, 0xd0, 0x16, 0xb6, 0xd2, 0xec, 0xb1, 0x36, 0x19, 0x71, 0x6a, 0x39, - 0x9b, 0x17, 0x8a, 0x8b, 0xa5, 0xdf, 0x4b, 0x6c, 0x37, 0x29, 0x5a, 0xe3, 0x47, 0x73, 0xa9, 0x8f, - 0x26, 0xaf, 0xc1, 0x04, 0xfe, 0x50, 0xe2, 0xc1, 0xa0, 0x96, 0x86, 0x7f, 0x22, 0xea, 0x7f, 0x62, - 0x04, 0x26, 0x2c, 0xa9, 0x31, 0x21, 0x0b, 0x5c, 0x58, 0x12, 0xaa, 0x84, 0x58, 0x79, 0xb0, 0x24, - 0x9d, 0x31, 0x0a, 0xb1, 0xd0, 0x85, 0xce, 0x18, 0xc2, 0x05, 0xc3, 0xf8, 0x87, 0x79, 0x7d, 0xda, - 0x91, 0x0b, 0x8a, 0xdc, 0xae, 0x44, 0xa5, 0x94, 0x72, 0xbb, 0x22, 0xad, 0xff, 0xdd, 0x1c, 0xcc, - 0xdd, 0x51, 0x12, 0x99, 0x6e, 0x79, 0x38, 0x2e, 0x83, 0x53, 0x7b, 0x3e, 0xae, 0x6c, 0x83, 0x6a, - 0x06, 0x55, 0x36, 0x53, 0x70, 0xca, 0x98, 0x59, 0xdf, 0x83, 0x8e, 0x7a, 0xf8, 0x61, 0x4a, 0xd2, - 0x47, 0x8e, 0xce, 0xe1, 0x27, 0xcc, 0x92, 0x61, 0xfc, 0x64, 0x1e, 0x26, 0x95, 0x15, 0x43, 0x3e, - 0x0b, 0x25, 0xb5, 0x5a, 0x55, 0xc5, 0xa7, 0x7e, 0xa5, 0xa9, 0x61, 0xa1, 0x8e, 0x8f, 0xda, 0x1d, - 0x4d, 0xc7, 0xc7, 0xd6, 0x05, 0x42, 0x4f, 0x78, 0x13, 0x7a, 0x2f, 0xe3, 0x26, 0x84, 0xb3, 0x5c, - 0xd1, 0xe9, 0x0c, 0xbc, 0x0f, 0xbd, 0x9d, 0xbe, 0x0f, 0xa1, 0x7a, 0x49, 0xa1, 0xef, 0x7f, 0x2b, - 0x32, 0x7e, 0x3a, 0x07, 0xe5, 0xe4, 0x9a, 0xfe, 0x54, 0x7a, 0xe5, 0x04, 0xef, 0x39, 0x3f, 0x91, - 0x8f, 0x92, 0xc4, 0x48, 0x6f, 0xe5, 0x27, 0xd5, 0xd0, 0xf0, 0x1d, 0xed, 0xa9, 0xe5, 0x69, 0x3d, - 0xf0, 0x9e, 0x1a, 0xe7, 0x23, 0x3b, 0xda, 0xe6, 0xc8, 0xb7, 0xfe, 0xd6, 0xd2, 0x53, 0xc6, 0x07, - 0x30, 0x9f, 0xec, 0x0e, 0x7c, 0x6e, 0xa9, 0xc0, 0x8c, 0x0e, 0x4f, 0xa6, 0x98, 0x4a, 0x52, 0x99, - 0x49, 0x7c, 0xe3, 0x77, 0xf3, 0x49, 0xde, 0xc2, 0xe8, 0x90, 0xed, 0x51, 0xaa, 0x9d, 0x8b, 0xd8, - 0xa3, 0x38, 0xc8, 0x94, 0x65, 0x27, 0x49, 0xed, 0x16, 0xf9, 0xdc, 0x16, 0xb2, 0x7d, 0x6e, 0xc9, - 0xb5, 0x84, 0x05, 0xb5, 0x12, 0x20, 0xea, 0x01, 0xdd, 0xb1, 0x62, 0x2b, 0xea, 0x94, 0xe1, 0xf4, - 0xbc, 0x16, 0xed, 0x5c, 0xd2, 0x8f, 0xc6, 0xda, 0xf5, 0x10, 0x0b, 0x38, 0x71, 0x26, 0x32, 0x59, - 0x87, 0x71, 0xf6, 0x99, 0xb7, 0xed, 0xae, 0x78, 0x45, 0x21, 0x91, 0x07, 0x7e, 0x3b, 0xba, 0x1f, - 0x2a, 0x4e, 0xf8, 0x6d, 0xca, 0x24, 0x04, 0x75, 0x62, 0x09, 0x44, 0xe3, 0xff, 0xca, 0xb1, 0xf5, - 0xdf, 0x3c, 0xf8, 0x1e, 0xcb, 0x0f, 0xc7, 0x9a, 0x34, 0xc0, 0x26, 0xf6, 0xdf, 0xe5, 0x79, 0xda, - 0x1f, 0x31, 0x7d, 0xde, 0x84, 0xb1, 0x2d, 0xdb, 0xdf, 0x13, 0x29, 0xbd, 0x75, 0x2e, 0xbc, 0x20, - 0x0e, 0x5f, 0x15, 0xe2, 0x6f, 0x53, 0x10, 0xa8, 0xaa, 0xb3, 0xfc, 0x50, 0xaa, 0x33, 0x45, 0x73, - 0x5f, 0x78, 0x6c, 0x9a, 0xfb, 0xef, 0x8b, 0x32, 0xfc, 0x54, 0xc2, 0x21, 0x82, 0x69, 0x9f, 0x4b, - 0x26, 0xd4, 0x4a, 0x85, 0x3d, 0x8f, 0xd9, 0x91, 0x6b, 0x6a, 0x8a, 0x2e, 0xc5, 0xf9, 0xf3, 0x98, - 0x64, 0x5c, 0xc6, 0x7f, 0x5d, 0xe0, 0x7d, 0x2c, 0x3a, 0xea, 0xbc, 0xe6, 0xe2, 0x8e, 0xeb, 0x24, - 0xa1, 0xd5, 0xe4, 0xce, 0xee, 0xe7, 0x61, 0x84, 0xcd, 0x4d, 0xd1, 0x9b, 0x88, 0xc7, 0xe6, 0xaf, - 0x8a, 0xc7, 0xca, 0xd9, 0x5a, 0xc6, 0x33, 0x49, 0xcd, 0xbd, 0x88, 0xc7, 0x96, 0xba, 0x96, 0x11, - 0x83, 0xb5, 0x20, 0x4a, 0x60, 0xa1, 0xb6, 0xa0, 0xb3, 0x6b, 0xa7, 0x33, 0xe5, 0x29, 0x59, 0x73, - 0xd6, 0x60, 0xfa, 0x9e, 0xe3, 0xb6, 0xbc, 0x07, 0x41, 0x95, 0x06, 0x07, 0xa1, 0xd7, 0x15, 0x76, - 0xc0, 0xa8, 0xe1, 0x7f, 0xc0, 0x4b, 0xac, 0x16, 0x2f, 0x52, 0x9f, 0x43, 0x74, 0x22, 0xb2, 0x02, - 0x53, 0x5a, 0x08, 0x58, 0xf1, 0x48, 0x89, 0x3a, 0x4e, 0x3d, 0x80, 0xac, 0xaa, 0xe3, 0xd4, 0x48, - 0xd8, 0x29, 0x2d, 0xbe, 0x5f, 0x79, 0xaa, 0x4c, 0x7d, 0xbb, 0xc0, 0x21, 0x57, 0xa1, 0xc8, 0xe3, - 0x84, 0xd4, 0xaa, 0xea, 0xf3, 0x54, 0x80, 0xb0, 0x44, 0x9c, 0x1d, 0x89, 0x18, 0xc7, 0x85, 0xe0, - 0x4e, 0x72, 0xe6, 0xc8, 0xa6, 0xd7, 0xa2, 0xc6, 0x67, 0xa0, 0x2c, 0x36, 0x9d, 0x38, 0x5b, 0xfc, - 0x33, 0x30, 0xb2, 0x5a, 0xab, 0x9a, 0xea, 0x46, 0xd1, 0x74, 0x5a, 0xbe, 0x89, 0x50, 0xf4, 0x91, - 0xdb, 0xa4, 0xe1, 0x03, 0xcf, 0x3f, 0x30, 0x69, 0x10, 0xfa, 0x0e, 0x4f, 0xce, 0x89, 0x4b, 0xed, - 0xb3, 0xe4, 0x6d, 0x18, 0x45, 0xe3, 0xd4, 0xc4, 0xde, 0x9f, 0xac, 0x63, 0x65, 0x4a, 0x4c, 0xd1, - 0x51, 0xb4, 0x74, 0x35, 0x39, 0x11, 0x79, 0x13, 0x46, 0xaa, 0xd4, 0x3d, 0x4c, 0xe4, 0x0d, 0x4c, - 0x11, 0x47, 0x4b, 0xbe, 0x45, 0xdd, 0x43, 0x13, 0x49, 0x8c, 0x9f, 0xce, 0xc3, 0xa9, 0x8c, 0xcf, - 0xba, 0xfb, 0xd9, 0x27, 0x74, 0xdf, 0x5b, 0xd1, 0xf6, 0x3d, 0xf9, 0xe6, 0xdc, 0xb7, 0xe3, 0x33, - 0xb7, 0xc1, 0xbf, 0x91, 0x83, 0x33, 0xfa, 0x64, 0x15, 0xd6, 0xe8, 0x77, 0xaf, 0x92, 0xb7, 0x60, - 0x6c, 0x9d, 0xda, 0x2d, 0x2a, 0x93, 0x84, 0x9d, 0x8a, 0xa2, 0xfb, 0xf1, 0x30, 0x02, 0xbc, 0x90, - 0xb3, 0x8d, 0x9d, 0x4e, 0x39, 0x94, 0x54, 0xc5, 0xc7, 0x71, 0x01, 0xdd, 0x90, 0xc1, 0x49, 0xb2, - 0xaa, 0x1a, 0x60, 0xb9, 0xf1, 0x9d, 0x1c, 0x3c, 0x3d, 0x80, 0x86, 0x0d, 0x1c, 0x1b, 0x7a, 0x75, - 0xe0, 0xf0, 0xcc, 0x44, 0x28, 0x79, 0x17, 0x66, 0xb6, 0x84, 0x80, 0x2f, 0x87, 0x23, 0x1f, 0xaf, - 0x1d, 0x29, 0xfb, 0x4b, 0xdb, 0x22, 0x33, 0x89, 0xac, 0x45, 0xcd, 0x29, 0x0c, 0x8c, 0x9a, 0xa3, - 0x06, 0xa1, 0x19, 0x19, 0x36, 0x08, 0xcd, 0x07, 0x30, 0xaf, 0xb7, 0x4d, 0xc4, 0x02, 0x8e, 0x43, - 0xf0, 0xe4, 0xfa, 0x87, 0xe0, 0x19, 0x18, 0x71, 0xd4, 0xf8, 0xc9, 0x1c, 0x94, 0x75, 0xde, 0x9f, - 0x74, 0x3c, 0xdf, 0xd1, 0xc6, 0xf3, 0xe9, 0xec, 0xf1, 0xec, 0x3f, 0x90, 0xff, 0x7b, 0x2e, 0xd9, - 0xd8, 0xa1, 0x46, 0xd0, 0x80, 0xb1, 0xaa, 0xd7, 0xb1, 0x1d, 0x39, 0x70, 0xe8, 0x4a, 0xd2, 0x42, - 0x88, 0x29, 0x4a, 0x86, 0x8b, 0x58, 0x74, 0x0e, 0x46, 0x37, 0x3d, 0xb7, 0x52, 0x15, 0x36, 0xb9, - 0xc8, 0xc7, 0xf5, 0x5c, 0xcb, 0x6e, 0x99, 0xbc, 0x80, 0x6c, 0x00, 0x34, 0x9a, 0x3e, 0xa5, 0x6e, - 0xc3, 0xf9, 0x7e, 0x9a, 0x90, 0x25, 0x58, 0x0f, 0xb5, 0x7b, 0xb8, 0xb1, 0xf0, 0xa7, 0x54, 0x44, - 0xb4, 0x02, 0xe7, 0xfb, 0xd5, 0xbd, 0x57, 0xa1, 0xc7, 0x75, 0x25, 0x82, 0xba, 0x25, 0xc6, 0xe1, - 0xca, 0xa7, 0xb1, 0xae, 0x32, 0xab, 0xc2, 0x1e, 0xbe, 0x92, 0x39, 0x1c, 0xbf, 0x93, 0x83, 0xa7, - 0x07, 0xd0, 0x3c, 0x86, 0x51, 0xf9, 0xd3, 0xee, 0x70, 0x0a, 0x10, 0x13, 0x61, 0x5a, 0x66, 0xa7, - 0x15, 0xf2, 0xc4, 0x7f, 0x53, 0x22, 0x2d, 0x33, 0x03, 0x68, 0x69, 0x99, 0x19, 0x80, 0x9d, 0xab, - 0xeb, 0xd4, 0xd9, 0xdb, 0xe7, 0x26, 0x57, 0x53, 0x7c, 0x6f, 0xd8, 0x47, 0x88, 0x7a, 0xae, 0x72, - 0x1c, 0xe3, 0x5f, 0x8f, 0xc1, 0x59, 0x93, 0xee, 0x39, 0xec, 0xe6, 0xb1, 0x1d, 0x38, 0xee, 0x9e, - 0x16, 0xc4, 0xc7, 0x48, 0xac, 0x5c, 0x91, 0xf1, 0x82, 0x41, 0xa2, 0x99, 0x78, 0x11, 0x8a, 0xec, - 0x58, 0x55, 0x16, 0x2f, 0xbe, 0x62, 0xb9, 0x5e, 0x8b, 0x8a, 0x28, 0xd1, 0xb2, 0x98, 0xbc, 0x22, - 0x04, 0x21, 0x25, 0x27, 0x11, 0x13, 0x84, 0xbe, 0x7b, 0xb4, 0x04, 0x8d, 0xc3, 0x20, 0xa4, 0x78, - 0x09, 0x16, 0xc2, 0x50, 0x74, 0x5b, 0x19, 0xe9, 0x73, 0x5b, 0xb9, 0x0d, 0xf3, 0x95, 0x16, 0x3f, - 0x1d, 0xed, 0x76, 0xdd, 0x77, 0xdc, 0xa6, 0xd3, 0xb5, 0xdb, 0xf2, 0x06, 0x8e, 0xbd, 0x6c, 0x47, - 0xe5, 0x56, 0x37, 0x42, 0x30, 0x33, 0xc9, 0x58, 0x33, 0xaa, 0x9b, 0x0d, 0x8c, 0x10, 0x23, 0x1e, - 0x28, 0xb1, 0x19, 0x2d, 0x37, 0xc0, 0x56, 0x04, 0x66, 0x54, 0x8c, 0xf7, 0x24, 0x7c, 0x8e, 0xde, - 0xda, 0x68, 0xdc, 0x12, 0x59, 0xd3, 0x64, 0xca, 0x04, 0x6e, 0x68, 0x10, 0xb6, 0x03, 0x34, 0x6f, - 0xd4, 0xf0, 0x62, 0xba, 0x46, 0x63, 0x9d, 0xd1, 0x15, 0x53, 0x74, 0x41, 0xb0, 0xaf, 0xd2, 0x71, - 0x3c, 0x72, 0x99, 0x4d, 0x85, 0x8e, 0x17, 0x52, 0x9c, 0xc2, 0x13, 0xf1, 0xad, 0xca, 0x47, 0x28, - 0xbf, 0x55, 0x29, 0x28, 0xe4, 0x6d, 0x98, 0x5b, 0x5b, 0x5d, 0x96, 0x6a, 0xe5, 0xaa, 0xd7, 0xec, - 0xa1, 0x61, 0x00, 0x60, 0x7d, 0x38, 0x86, 0xb4, 0xb9, 0xcc, 0x76, 0x93, 0x2c, 0x34, 0x72, 0x1e, - 0xc6, 0x6b, 0x55, 0xde, 0xf7, 0x93, 0x6a, 0x5e, 0x30, 0x61, 0xed, 0x24, 0x0b, 0xc9, 0x9d, 0x58, - 0xec, 0x2f, 0x1d, 0x2b, 0x9f, 0x9f, 0x1d, 0x42, 0xe4, 0x7f, 0x13, 0xa6, 0x56, 0xbc, 0xb0, 0xe6, - 0x06, 0xa1, 0xed, 0x36, 0x69, 0xad, 0xaa, 0x06, 0xe9, 0xde, 0xf1, 0x42, 0xcb, 0x11, 0x25, 0xec, - 0xcb, 0x75, 0x4c, 0xf2, 0x79, 0x24, 0xbd, 0x41, 0x5d, 0xea, 0xc7, 0xc1, 0xb9, 0x47, 0x79, 0xdf, - 0x32, 0xd2, 0xbd, 0xa8, 0xc4, 0xd4, 0x11, 0x89, 0x09, 0xa7, 0x30, 0xc9, 0xbf, 0xd7, 0x0b, 0xf4, - 0xca, 0x67, 0x62, 0x91, 0xb6, 0x2b, 0x10, 0xac, 0xe4, 0x57, 0x64, 0x93, 0x8a, 0x3c, 0x68, 0x3c, - 0x7b, 0xe9, 0xaa, 0xd7, 0xa2, 0x01, 0xdf, 0x81, 0xbe, 0x87, 0xf2, 0xa0, 0x29, 0x6d, 0x1b, 0xb0, - 0x2b, 0xff, 0xc7, 0x98, 0x07, 0x2d, 0x85, 0x4b, 0x3e, 0x0f, 0xa3, 0xf8, 0x53, 0x48, 0xcc, 0x73, - 0x19, 0x6c, 0x63, 0x69, 0xb9, 0xc9, 0x30, 0x4d, 0x4e, 0x40, 0x6a, 0x30, 0x2e, 0xae, 0x63, 0x27, - 0xc9, 0xe6, 0x23, 0xee, 0x75, 0x7c, 0xb6, 0x09, 0x7a, 0xa3, 0x05, 0x25, 0xb5, 0x42, 0xb6, 0xca, - 0xd6, 0xed, 0x60, 0x9f, 0xb6, 0xd8, 0x2f, 0x91, 0x88, 0x0f, 0x57, 0xd9, 0x3e, 0x42, 0x2d, 0xf6, - 0x1d, 0xa6, 0x82, 0xc2, 0xce, 0xe9, 0x5a, 0xb0, 0x1d, 0x88, 0x4f, 0x11, 0x0a, 0x1a, 0x07, 0x95, - 0x7d, 0x2d, 0x53, 0x14, 0x19, 0xdf, 0x07, 0xf3, 0x9b, 0xbd, 0x76, 0xdb, 0xde, 0x69, 0x53, 0x99, - 0xa8, 0x05, 0x33, 0xa2, 0xaf, 0xc0, 0x68, 0x43, 0xc9, 0xb1, 0x1e, 0x25, 0xcb, 0x54, 0x70, 0xd0, - 0x58, 0x35, 0x87, 0x11, 0x80, 0x12, 0xd9, 0xd5, 0x39, 0xa9, 0xf1, 0xdb, 0x39, 0x98, 0x97, 0x46, - 0x06, 0xbe, 0xdd, 0x3c, 0x88, 0x12, 0xed, 0x9f, 0xd7, 0xe6, 0x1a, 0x2e, 0x82, 0xc4, 0x34, 0xe2, - 0xb3, 0xee, 0xa6, 0xfc, 0x08, 0x5d, 0x08, 0xca, 0xfa, 0xe0, 0xe3, 0x3e, 0x86, 0xbc, 0x0d, 0x93, - 0xe2, 0xc8, 0x55, 0x22, 0x70, 0x62, 0x00, 0x32, 0x71, 0x9d, 0x4c, 0x9a, 0xbc, 0xa8, 0xe8, 0x28, - 0xdf, 0xe9, 0x4d, 0xf9, 0xa4, 0x72, 0x45, 0xb6, 0x7c, 0xa7, 0xd7, 0x31, 0x60, 0xea, 0x7e, 0x7b, - 0x32, 0xd9, 0xb7, 0x62, 0xee, 0x5e, 0x53, 0x63, 0xee, 0xe5, 0xe2, 0x9b, 0x77, 0x1c, 0x73, 0x4f, - 0xbd, 0x79, 0x47, 0xa8, 0xd1, 0x98, 0xe4, 0x8f, 0x19, 0x93, 0x77, 0xe5, 0x98, 0x14, 0xfa, 0x4f, - 0x8c, 0xb9, 0x01, 0xe3, 0xd0, 0x88, 0x57, 0xc8, 0xc8, 0x50, 0xca, 0x98, 0xa7, 0x30, 0xb9, 0x00, - 0x27, 0x49, 0xee, 0xcc, 0x82, 0x93, 0xaa, 0xe1, 0x19, 0x1d, 0x9e, 0xe9, 0x31, 0xdb, 0xfd, 0x17, - 0xa0, 0x54, 0x09, 0x43, 0xbb, 0xb9, 0x4f, 0x5b, 0x55, 0xb6, 0x3d, 0x29, 0x41, 0xb5, 0x6c, 0x01, - 0x57, 0x5f, 0xe6, 0x54, 0x5c, 0x1e, 0xee, 0xd6, 0x0e, 0x84, 0x91, 0x6c, 0x14, 0xee, 0x96, 0x41, - 0xf4, 0x70, 0xb7, 0x0c, 0x42, 0x2e, 0xc3, 0x78, 0xcd, 0xbd, 0xef, 0xb0, 0x3e, 0xe1, 0x71, 0xb5, - 0x50, 0xa3, 0xe5, 0x70, 0x90, 0xba, 0xb9, 0x0a, 0x2c, 0xf2, 0xa6, 0x72, 0x51, 0x9a, 0x88, 0x15, - 0x24, 0x5c, 0x51, 0x16, 0xc5, 0xc0, 0x51, 0x2f, 0x41, 0xd1, 0xcd, 0xe9, 0x1a, 0x8c, 0x4b, 0xfd, - 0x27, 0xc4, 0x27, 0x88, 0xa0, 0x4c, 0x87, 0xa0, 0x90, 0xc8, 0x98, 0x34, 0x5d, 0x49, 0x28, 0x38, - 0xa9, 0x24, 0x4d, 0x57, 0x12, 0x0a, 0x6a, 0x49, 0xd3, 0x95, 0xd4, 0x82, 0x91, 0xea, 0xa8, 0x74, - 0xac, 0xea, 0xe8, 0x2e, 0x94, 0xea, 0xb6, 0x1f, 0x3a, 0x4c, 0xee, 0x71, 0xc3, 0x60, 0x61, 0x4a, - 0xd3, 0xb6, 0x2a, 0x45, 0x2b, 0xcf, 0xc9, 0xc4, 0xdd, 0x5d, 0x05, 0x5f, 0xcf, 0x30, 0x1d, 0xc3, - 0xb3, 0x4d, 0x64, 0xa7, 0x3f, 0x89, 0x89, 0x2c, 0x76, 0x2a, 0x6a, 0xd8, 0x66, 0x62, 0x8d, 0x0f, - 0x5e, 0x84, 0x12, 0x6a, 0xb6, 0x08, 0x91, 0x7c, 0x05, 0x4a, 0xec, 0xef, 0xba, 0xd7, 0x76, 0x9a, - 0x0e, 0x0d, 0x16, 0xca, 0xd8, 0xb8, 0xe7, 0x32, 0x57, 0x3f, 0x22, 0x1d, 0x36, 0x68, 0xc8, 0x17, - 0x30, 0x32, 0x4e, 0xaa, 0xce, 0x35, 0x6e, 0xe4, 0x3d, 0x28, 0xb1, 0xd9, 0xb7, 0x63, 0x07, 0x5c, - 0xdc, 0x9d, 0x8d, 0x8d, 0x9c, 0x5b, 0x02, 0x9e, 0x8a, 0x38, 0xad, 0x12, 0xb0, 0x63, 0xbe, 0xd2, - 0xe5, 0x1b, 0x24, 0x51, 0x66, 0x7b, 0x37, 0xb5, 0x39, 0x4a, 0x34, 0xf2, 0x45, 0x28, 0x55, 0xba, - 0xdd, 0x78, 0xc7, 0x99, 0x53, 0x14, 0x6d, 0xdd, 0xae, 0x95, 0xb9, 0xeb, 0x68, 0x14, 0xc9, 0x8d, - 0x79, 0xfe, 0x44, 0x1b, 0x33, 0x79, 0x3d, 0xba, 0x01, 0x9c, 0x8a, 0x75, 0xc1, 0xe2, 0x32, 0xaa, - 0x5d, 0x27, 0xf8, 0x65, 0x60, 0x15, 0xa6, 0xb8, 0x72, 0x54, 0x4a, 0x33, 0xa7, 0x53, 0xab, 0x27, - 0x43, 0xa8, 0xd1, 0x69, 0xc8, 0x1a, 0x4c, 0x73, 0x2f, 0xef, 0xb6, 0x08, 0x05, 0xbe, 0x70, 0x06, - 0x57, 0x2d, 0x72, 0xe1, 0xce, 0xe1, 0x6d, 0xcc, 0x10, 0x63, 0x6b, 0x5c, 0x12, 0x44, 0xc6, 0x1f, - 0xe4, 0xe0, 0x4c, 0x9f, 0x11, 0x8f, 0x02, 0x45, 0xe7, 0x06, 0x07, 0x8a, 0x66, 0x3b, 0x87, 0xae, - 0x69, 0xc1, 0xf6, 0xa7, 0x9d, 0xb7, 0x22, 0x79, 0xcb, 0x03, 0x22, 0x92, 0x30, 0x89, 0xaa, 0x6f, - 0x7a, 0xa8, 0xd0, 0x2d, 0xa4, 0x0f, 0x21, 0x81, 0xc7, 0x3f, 0x8a, 0x87, 0xd7, 0x14, 0x39, 0x9e, - 0xa2, 0x61, 0xfd, 0xc8, 0xd3, 0x56, 0x70, 0x06, 0x6b, 0xe3, 0x28, 0x07, 0x93, 0xca, 0x3a, 0x24, - 0xe7, 0x14, 0xd7, 0xe0, 0x32, 0xcf, 0x12, 0xa6, 0x70, 0xc8, 0xf3, 0x93, 0x08, 0x17, 0x55, 0xfe, - 0x78, 0xb5, 0x35, 0x46, 0x22, 0x53, 0x82, 0x69, 0x27, 0x82, 0x90, 0x61, 0x39, 0xf9, 0x10, 0x60, - 0xc3, 0x0e, 0xc2, 0x4a, 0x33, 0x74, 0xee, 0xd3, 0x21, 0x0e, 0x1d, 0x19, 0x5e, 0xf0, 0x14, 0xe6, - 0xa5, 0xb0, 0x91, 0x2c, 0x71, 0x46, 0x28, 0x0c, 0x8d, 0xbf, 0x94, 0x03, 0xd8, 0xae, 0xad, 0x62, - 0x34, 0xfc, 0x4f, 0x2a, 0x14, 0x64, 0x47, 0x18, 0x96, 0xdc, 0x07, 0x88, 0x03, 0xff, 0x43, 0x0e, - 0xa6, 0x75, 0x34, 0xf2, 0x2e, 0xcc, 0x34, 0x9a, 0xbe, 0xd7, 0x6e, 0xef, 0xd8, 0xcd, 0x83, 0x0d, - 0xc7, 0xa5, 0x3c, 0xea, 0xea, 0x28, 0x3f, 0x8b, 0x82, 0xa8, 0xc8, 0x6a, 0xb3, 0x32, 0x33, 0x89, - 0x4c, 0x7e, 0x38, 0x07, 0x53, 0x8d, 0x7d, 0xef, 0x41, 0x14, 0xc4, 0x54, 0x0c, 0xc8, 0x87, 0x6c, - 0x6d, 0x07, 0xfb, 0xde, 0x83, 0x38, 0xc5, 0xa8, 0x66, 0x61, 0xfa, 0xce, 0x70, 0x8f, 0xff, 0x4d, - 0x0f, 0xef, 0x23, 0x61, 0x70, 0x49, 0xab, 0xc4, 0xd4, 0xeb, 0x34, 0xfe, 0x24, 0x07, 0x93, 0x78, - 0x73, 0x69, 0xb7, 0x51, 0xe6, 0xfa, 0x5e, 0xca, 0x57, 0x19, 0xb5, 0x6b, 0xc0, 0xc0, 0xbe, 0x01, - 0x33, 0x09, 0x34, 0x62, 0xc0, 0x58, 0x03, 0xbd, 0xfe, 0x55, 0xa5, 0x07, 0x8f, 0x03, 0x60, 0x8a, - 0x12, 0x63, 0x4d, 0x21, 0xbb, 0x7b, 0x05, 0x1f, 0x83, 0x97, 0x01, 0x1c, 0x09, 0x92, 0x37, 0x1b, - 0x92, 0xfc, 0x92, 0xbb, 0x57, 0x4c, 0x05, 0xcb, 0xd8, 0x84, 0xb1, 0x86, 0xe7, 0x87, 0x2b, 0x87, - 0xfc, 0x32, 0x51, 0xa5, 0x41, 0x53, 0x7d, 0xed, 0x75, 0xf0, 0x2d, 0xa6, 0x69, 0x8a, 0x22, 0xb2, - 0x04, 0xa3, 0xd7, 0x1d, 0xda, 0x6e, 0xa9, 0x56, 0xc0, 0xbb, 0x0c, 0x60, 0x72, 0x38, 0xbb, 0x70, - 0x9d, 0x8e, 0x93, 0xc6, 0xc4, 0xe6, 0xc6, 0x9f, 0x74, 0xdd, 0xac, 0x6a, 0xfd, 0xfb, 0x7c, 0x94, - 0xa8, 0x21, 0x5d, 0xd3, 0x80, 0xae, 0xfe, 0x87, 0x39, 0x58, 0xec, 0x4f, 0xa2, 0x5a, 0x30, 0xe7, - 0x06, 0x58, 0x30, 0xbf, 0x94, 0x7c, 0x9d, 0x44, 0x34, 0xf1, 0x3a, 0x19, 0xbf, 0x49, 0x56, 0xd1, - 0x80, 0xbc, 0x49, 0x65, 0xa6, 0x98, 0x73, 0x03, 0xbe, 0x19, 0x11, 0xf9, 0x30, 0x87, 0x48, 0x63, - 0x0a, 0x5a, 0xe3, 0x37, 0x46, 0xe0, 0x6c, 0x5f, 0x0a, 0xb2, 0xae, 0xe4, 0x9f, 0x9a, 0x8e, 0x32, - 0xdf, 0xf4, 0xc5, 0xbf, 0x84, 0xff, 0xa2, 0x8d, 0x60, 0xd2, 0x2b, 0xed, 0x4e, 0x94, 0x77, 0x28, - 0x8f, 0xbc, 0x5e, 0x3d, 0x96, 0x17, 0x47, 0x47, 0x66, 0x90, 0x4e, 0x41, 0x84, 0xfe, 0x8b, 0x34, - 0xb4, 0x9d, 0x76, 0xa0, 0x2e, 0xbb, 0x16, 0x07, 0x99, 0xb2, 0x2c, 0x36, 0x2b, 0x1f, 0xc9, 0x36, - 0x2b, 0x37, 0xfe, 0x7d, 0x0e, 0x26, 0xa2, 0xcf, 0x26, 0x8b, 0x70, 0x7a, 0xcb, 0xac, 0xac, 0xae, - 0x59, 0x5b, 0x1f, 0xd4, 0xd7, 0xac, 0xed, 0xcd, 0x46, 0x7d, 0x6d, 0xb5, 0x76, 0xbd, 0xb6, 0x56, - 0x2d, 0x3f, 0x45, 0x66, 0x61, 0x6a, 0x7b, 0xf3, 0xd6, 0xe6, 0x9d, 0x7b, 0x9b, 0xd6, 0x9a, 0x69, - 0xde, 0x31, 0xcb, 0x39, 0x32, 0x05, 0x13, 0xe6, 0x4a, 0x65, 0xd5, 0xda, 0xbc, 0x53, 0x5d, 0x2b, - 0xe7, 0x49, 0x19, 0x4a, 0xab, 0x77, 0x36, 0x37, 0xd7, 0x56, 0xb7, 0x6a, 0x77, 0x6b, 0x5b, 0x1f, - 0x94, 0x0b, 0x84, 0xc0, 0x34, 0x22, 0xd4, 0xcd, 0xda, 0xe6, 0x6a, 0xad, 0x5e, 0xd9, 0x28, 0x8f, - 0x30, 0x18, 0xc3, 0x57, 0x60, 0xa3, 0x11, 0xa3, 0x5b, 0xdb, 0x2b, 0x6b, 0xe5, 0xff, 0x8f, 0xbd, - 0xb7, 0x8b, 0x91, 0xe4, 0x48, 0x0e, 0x83, 0xb7, 0xba, 0x7b, 0x66, 0x7a, 0x62, 0xfe, 0x6a, 0x72, - 0x67, 0x77, 0x67, 0xff, 0xb9, 0x45, 0x72, 0x6f, 0x39, 0x3c, 0xf2, 0xb8, 0xcb, 0x8f, 0xc7, 0xdb, - 0xbb, 0x23, 0xa9, 0x9a, 0xee, 0x9e, 0x99, 0xde, 0xed, 0x3f, 0x66, 0xf5, 0xec, 0x6a, 0x8f, 0x92, - 0x4a, 0xb5, 0xdd, 0x35, 0x33, 0xc5, 0xed, 0xe9, 0x6a, 0x56, 0x55, 0x73, 0x39, 0x87, 0x0f, 0xf0, - 0x09, 0x82, 0x4f, 0x80, 0x6d, 0x59, 0xb2, 0x75, 0x86, 0x09, 0xc1, 0x86, 0x0c, 0xf8, 0x20, 0xe8, - 0x41, 0x80, 0x1f, 0xfc, 0x62, 0xf8, 0x9e, 0x04, 0xbf, 0x08, 0x38, 0x9c, 0x61, 0xc3, 0x80, 0x1f, - 0x4e, 0x06, 0x21, 0x9d, 0x60, 0xc3, 0x38, 0xf8, 0x4d, 0xb0, 0x1f, 0x04, 0x08, 0x30, 0x32, 0x32, - 0xb3, 0x2a, 0xab, 0xba, 0xba, 0x77, 0xf6, 0xc8, 0xb3, 0x2d, 0xe0, 0x9e, 0x66, 0x3a, 0x32, 0x22, - 0x2a, 0xff, 0x33, 0x32, 0x22, 0x32, 0x62, 0x9e, 0xa1, 0xb0, 0xff, 0x14, 0x94, 0x05, 0xf6, 0x79, - 0x44, 0xa9, 0x9a, 0x5d, 0x73, 0xdb, 0xb4, 0x6a, 0x7a, 0x99, 0x5c, 0x80, 0xb3, 0x29, 0x90, 0xdd, - 0x68, 0xef, 0xd6, 0x5b, 0xfa, 0x22, 0xd9, 0x00, 0x3d, 0x86, 0x55, 0xb7, 0xed, 0x7d, 0xab, 0x46, - 0x75, 0xc8, 0x42, 0x5b, 0x66, 0xb3, 0xa6, 0x2f, 0x19, 0xef, 0xf0, 0xf7, 0x82, 0xbc, 0xab, 0xc9, - 0x79, 0x20, 0x56, 0xd7, 0xec, 0xee, 0x5b, 0x99, 0xc6, 0x2f, 0xc1, 0x82, 0xb5, 0x5f, 0xa9, 0xd4, - 0x2c, 0x4b, 0xd7, 0x08, 0xc0, 0xfc, 0x8e, 0x59, 0x6f, 0xd4, 0xaa, 0x7a, 0xc1, 0xf8, 0x5d, 0x0d, - 0xd6, 0xa5, 0x04, 0x28, 0x0d, 0x51, 0x9f, 0x73, 0x2d, 0xbe, 0x9b, 0xba, 0xd8, 0xca, 0xc7, 0x5f, - 0x99, 0x8f, 0xcc, 0x58, 0x86, 0xff, 0x4c, 0x83, 0x73, 0xb9, 0xd8, 0xe4, 0x11, 0xe8, 0xb2, 0x06, - 0x4d, 0x27, 0xea, 0x1d, 0x25, 0xfb, 0xd8, 0xb5, 0xcc, 0x57, 0x32, 0x68, 0x5c, 0x55, 0x9a, 0x64, - 0xc4, 0x9e, 0x60, 0x73, 0xfa, 0x7c, 0x0d, 0xc6, 0xa7, 0x1a, 0x5c, 0x98, 0xf2, 0x19, 0x52, 0x81, - 0xf9, 0x38, 0x73, 0xcf, 0x0c, 0x37, 0xb9, 0x8d, 0x1f, 0x7f, 0x76, 0x5d, 0x20, 0x62, 0x0a, 0x61, - 0xfc, 0x8f, 0xce, 0xc7, 0xa9, 0x78, 0x30, 0x1f, 0x0e, 0xef, 0xbe, 0x8b, 0x99, 0x9e, 0x17, 0x5f, - 0x32, 0x1f, 0x5a, 0xdb, 0x4b, 0xa2, 0xef, 0x8a, 0xce, 0xd3, 0x10, 0x13, 0xe2, 0x18, 0xdf, 0xd3, - 0x98, 0x70, 0x97, 0x45, 0x64, 0x32, 0xaf, 0x19, 0x86, 0xe3, 0x63, 0x97, 0xfa, 0x03, 0xd7, 0xa4, - 0x2d, 0x71, 0x6c, 0xa0, 0xb4, 0xea, 0x60, 0x01, 0x5e, 0x2b, 0x6c, 0x27, 0x48, 0x3d, 0xf7, 0x4f, - 0xd1, 0x90, 0xbb, 0x00, 0xb5, 0x4f, 0x22, 0x37, 0x18, 0x3a, 0x83, 0x38, 0x70, 0x0b, 0x8f, 0x68, - 0x25, 0xa0, 0x69, 0x79, 0x5b, 0x41, 0x36, 0xbe, 0xab, 0xc1, 0xb2, 0xb8, 0x34, 0x99, 0x03, 0x37, - 0x88, 0x3e, 0xdf, 0xf4, 0xba, 0x9b, 0x9a, 0x5e, 0xf1, 0xab, 0x10, 0x85, 0x3f, 0x2b, 0xce, 0x9d, - 0x59, 0xff, 0x5e, 0x03, 0x3d, 0x8b, 0x48, 0xde, 0x85, 0xb2, 0xe5, 0x7e, 0xec, 0x06, 0x5e, 0x74, - 0x22, 0x36, 0x4a, 0x99, 0xe3, 0x90, 0xe3, 0x88, 0x32, 0x3e, 0x1f, 0x42, 0xf1, 0x8b, 0xc6, 0x34, - 0xa7, 0xdd, 0xef, 0x15, 0xb5, 0x47, 0xf1, 0x8b, 0x52, 0x7b, 0x18, 0x7f, 0x5e, 0x80, 0x0b, 0xbb, - 0x6e, 0xa4, 0xb6, 0x29, 0x76, 0x5f, 0x78, 0xe3, 0x74, 0xed, 0x52, 0x5a, 0xb2, 0x09, 0x0b, 0x58, - 0x24, 0xc7, 0x97, 0xca, 0x9f, 0x64, 0x3b, 0x9e, 0xd7, 0xc5, 0x54, 0x12, 0xb5, 0x29, 0xdf, 0x7e, - 0x5d, 0x49, 0xab, 0x14, 0x4f, 0xeb, 0x9b, 0xb0, 0x8a, 0x11, 0xfd, 0xc7, 0x6c, 0x39, 0xb8, 0x7d, - 0xa1, 0xfe, 0x29, 0xd3, 0x0c, 0x94, 0x6c, 0x81, 0xce, 0x20, 0x66, 0xef, 0xc9, 0xd0, 0x7f, 0x3a, - 0x70, 0xfb, 0x87, 0x6e, 0x1f, 0x8f, 0xf5, 0x32, 0x9d, 0x80, 0x4b, 0x9e, 0xfb, 0x43, 0x7e, 0x75, - 0x73, 0xfb, 0xa8, 0xa3, 0x11, 0x3c, 0x13, 0xe8, 0xa5, 0xbb, 0xb0, 0xf4, 0x33, 0xa6, 0x48, 0x33, - 0xfe, 0x4c, 0x83, 0x0d, 0x6c, 0x9c, 0xf2, 0x61, 0x99, 0xbe, 0x56, 0xf6, 0x96, 0x92, 0x35, 0xc8, - 0x61, 0xa0, 0xf4, 0x52, 0x88, 0x7b, 0x31, 0xd1, 0x09, 0x15, 0x4e, 0xa1, 0x13, 0xb2, 0x9e, 0x27, - 0x55, 0xff, 0x29, 0x55, 0x5a, 0xf7, 0x4a, 0xe5, 0xa2, 0x5e, 0x4a, 0x86, 0xdc, 0xf8, 0xcd, 0x02, - 0x2c, 0x50, 0x17, 0x73, 0x98, 0x93, 0x9b, 0xb0, 0xd0, 0xf2, 0x23, 0x37, 0x6c, 0xa6, 0x12, 0xd6, - 0x0f, 0x19, 0xc8, 0x3e, 0xee, 0x53, 0x59, 0xc8, 0x26, 0x7c, 0x27, 0xf0, 0xfb, 0xe3, 0x5e, 0xa4, - 0x4e, 0xf8, 0x11, 0x07, 0x51, 0x59, 0x46, 0xbe, 0x0c, 0x8b, 0x82, 0x73, 0x6c, 0x28, 0x46, 0x8f, - 0xe7, 0xc0, 0x8d, 0x73, 0xe0, 0x27, 0x08, 0x28, 0xd3, 0x72, 0x01, 0xa3, 0xa4, 0xc8, 0xb4, 0x13, - 0x32, 0x83, 0x14, 0xd5, 0xe7, 0x66, 0x88, 0xea, 0x6f, 0xc0, 0xbc, 0x19, 0x86, 0x6e, 0x24, 0xa3, - 0x1d, 0x2c, 0xc7, 0xe1, 0xe2, 0x42, 0x37, 0xe2, 0x8c, 0x1d, 0x2c, 0xa7, 0x02, 0xcf, 0xf8, 0xab, - 0x02, 0xcc, 0xe1, 0xbf, 0x68, 0x86, 0x0d, 0x7a, 0x47, 0x29, 0x33, 0x6c, 0xd0, 0x3b, 0xa2, 0x08, - 0x25, 0xb7, 0x51, 0x53, 0x21, 0x13, 0x5c, 0x89, 0xd6, 0xa3, 0x0a, 0xbe, 0x9f, 0x80, 0xa9, 0x8a, - 0x13, 0x7b, 0x0d, 0x14, 0x73, 0x63, 0x9c, 0x9c, 0x87, 0x42, 0xdb, 0x12, 0x2d, 0xc6, 0x30, 0x59, - 0x7e, 0x48, 0x0b, 0x6d, 0x0b, 0x7b, 0x63, 0xcf, 0xbc, 0xf3, 0xd6, 0x57, 0x45, 0x43, 0x79, 0x6f, - 0x1c, 0x39, 0x77, 0xde, 0xfa, 0x2a, 0x15, 0x25, 0xac, 0x7f, 0xb1, 0xce, 0x68, 0xcc, 0xe5, 0x6f, - 0xf9, 0xb1, 0x7f, 0xb1, 0x6d, 0x68, 0xb8, 0xa5, 0x09, 0x02, 0xb9, 0x03, 0x4b, 0x22, 0x26, 0x04, - 0xe2, 0x2b, 0x31, 0x1b, 0x44, 0xcc, 0x08, 0x4e, 0xa1, 0x22, 0x71, 0xb3, 0x9e, 0x18, 0x20, 0x99, - 0x86, 0x57, 0x98, 0xf5, 0xe4, 0x10, 0x86, 0x54, 0x41, 0x61, 0x55, 0xe2, 0x76, 0xc1, 0xe4, 0x8d, - 0x3e, 0x56, 0x49, 0x18, 0x0f, 0x31, 0x7b, 0x42, 0x8c, 0x60, 0xfc, 0x51, 0x01, 0xca, 0x9d, 0xc1, - 0xf8, 0xd0, 0x1b, 0x3e, 0xb8, 0x4d, 0x08, 0xe0, 0x35, 0x4e, 0xa6, 0xd7, 0x60, 0xff, 0x93, 0x8b, - 0x50, 0x96, 0x37, 0x37, 0xb9, 0x21, 0x85, 0xe2, 0xd6, 0xb6, 0x09, 0x72, 0xdc, 0x45, 0x3c, 0x34, - 0xf9, 0x93, 0xdc, 0x86, 0xf8, 0xfe, 0x35, 0xed, 0xa2, 0x56, 0x62, 0x8b, 0x85, 0xc6, 0x68, 0xe4, - 0x35, 0xc0, 0x43, 0x42, 0x5c, 0x1e, 0xa4, 0x42, 0x9b, 0x57, 0x4d, 0xc8, 0x29, 0x9c, 0x04, 0xd1, - 0xc8, 0x9b, 0x20, 0x26, 0xa6, 0x48, 0xf7, 0x7e, 0x2e, 0x4d, 0xc0, 0x13, 0x68, 0x4a, 0x12, 0x81, - 0x4a, 0xbe, 0x09, 0x4b, 0xbd, 0xc0, 0x45, 0x4b, 0xa6, 0x33, 0x48, 0xb2, 0xb8, 0xab, 0x94, 0x95, - 0xa4, 0xfc, 0xc1, 0x6d, 0xaa, 0xa2, 0x1b, 0xdf, 0x5b, 0x84, 0x65, 0xb5, 0x3e, 0x84, 0xc2, 0xd9, - 0x70, 0xc0, 0xee, 0xee, 0xc2, 0x99, 0x6d, 0x84, 0x85, 0xe2, 0x38, 0x7d, 0x21, 0x5d, 0x21, 0x86, - 0xc7, 0x3d, 0xdb, 0x64, 0x30, 0x8b, 0xbd, 0x33, 0x74, 0x3d, 0x4c, 0xc0, 0x1c, 0x8f, 0x98, 0x50, - 0xf6, 0x47, 0xe1, 0xa1, 0x3b, 0xf4, 0xa4, 0xbd, 0xe5, 0xc5, 0x14, 0xa3, 0xb6, 0x28, 0x9c, 0xe0, - 0x15, 0x93, 0x91, 0xb7, 0x60, 0xde, 0x1f, 0xb9, 0x43, 0xc7, 0x13, 0x67, 0xdc, 0xe5, 0x0c, 0x03, - 0x77, 0x68, 0xd6, 0x15, 0x42, 0x81, 0x4c, 0xbe, 0x02, 0x25, 0xff, 0x49, 0x3c, 0x5e, 0x17, 0xd3, - 0x44, 0x4f, 0x22, 0x47, 0x21, 0x41, 0x44, 0x46, 0xf0, 0xa1, 0x73, 0x7c, 0x20, 0x46, 0x2c, 0x4d, - 0x70, 0xcf, 0x39, 0x3e, 0x50, 0x09, 0x18, 0x22, 0x79, 0x0f, 0x60, 0xe4, 0x1c, 0xba, 0x81, 0xdd, - 0x1f, 0x47, 0x27, 0x62, 0xdc, 0xae, 0xa5, 0xc8, 0x3a, 0xac, 0xb8, 0x3a, 0x8e, 0x4e, 0x14, 0xda, - 0xc5, 0x91, 0x04, 0x12, 0x13, 0xe0, 0xd8, 0x89, 0x22, 0x37, 0x38, 0xf6, 0x85, 0x37, 0x61, 0x12, - 0xfc, 0x90, 0x33, 0x68, 0xc6, 0xc5, 0x0a, 0x07, 0x85, 0x08, 0x2b, 0xed, 0x05, 0x8e, 0x48, 0xba, - 0x9f, 0xa9, 0xb4, 0x17, 0xa4, 0x5a, 0xc9, 0x10, 0xc9, 0xd7, 0x60, 0xa1, 0xef, 0x85, 0x3d, 0x3f, - 0xe8, 0x8b, 0x28, 0x27, 0x57, 0x52, 0x34, 0x55, 0x5e, 0xa6, 0x90, 0x49, 0x74, 0x56, 0x5b, 0x11, - 0xfc, 0xb4, 0xe5, 0x3f, 0x45, 0x35, 0x7f, 0xb6, 0xb6, 0x56, 0x5c, 0xac, 0xd6, 0x36, 0x21, 0x62, - 0x43, 0x79, 0xe8, 0x45, 0x03, 0xe7, 0xb1, 0xb0, 0x9d, 0xa7, 0x87, 0x72, 0x17, 0x8b, 0xd4, 0xa1, - 0xe4, 0xc8, 0xe4, 0x2e, 0x94, 0xdd, 0x61, 0x14, 0x38, 0xb6, 0xd7, 0x17, 0x4f, 0x31, 0xd3, 0x95, - 0x66, 0x07, 0xb0, 0x53, 0xaf, 0xaa, 0x95, 0x46, 0xfc, 0x7a, 0x9f, 0xf5, 0x4f, 0xd8, 0xf3, 0x8e, - 0xc5, 0x0b, 0xca, 0x74, 0xff, 0x58, 0x95, 0x7a, 0x53, 0xed, 0x1f, 0x86, 0x48, 0xde, 0x85, 0x05, - 0xb6, 0x7e, 0xfb, 0xfe, 0xa1, 0x08, 0x34, 0x61, 0xa4, 0xfb, 0x87, 0x97, 0x4d, 0x4c, 0x57, 0x49, - 0xc4, 0x16, 0xb2, 0xf3, 0x34, 0xb4, 0xbd, 0x1e, 0xc6, 0xc4, 0xcc, 0x2e, 0x47, 0xf3, 0xa1, 0x55, - 0xaf, 0x28, 0x64, 0x73, 0xce, 0xd3, 0xb0, 0xde, 0x23, 0x77, 0x60, 0x0e, 0x33, 0x4f, 0x88, 0x00, - 0x98, 0x69, 0x1a, 0xcc, 0x39, 0xa1, 0xd2, 0x20, 0x2a, 0x1b, 0xc8, 0xe3, 0x10, 0x1f, 0xa5, 0x88, - 0xfc, 0x0f, 0xe9, 0x3e, 0x69, 0x5a, 0xf8, 0x52, 0x45, 0xad, 0xa2, 0x40, 0x67, 0x55, 0x1c, 0xba, - 0x91, 0xed, 0x7d, 0x24, 0x32, 0x38, 0xa4, 0x3f, 0xd7, 0x72, 0xa3, 0xfa, 0xfb, 0xea, 0xe7, 0x86, - 0x6e, 0x54, 0xff, 0x48, 0x0c, 0xdd, 0xd1, 0xf8, 0x31, 0xea, 0xd2, 0x73, 0x86, 0xee, 0x68, 0x9c, - 0x1d, 0xba, 0xa3, 0xf1, 0x63, 0x72, 0x0d, 0x20, 0xf1, 0x42, 0xe0, 0xf6, 0x1d, 0xaa, 0x40, 0xbe, - 0x5e, 0xfa, 0xef, 0xff, 0xe2, 0xba, 0xb6, 0x0d, 0x50, 0x96, 0x51, 0x73, 0x98, 0x3c, 0xbd, 0x91, - 0xc7, 0x94, 0xdc, 0x80, 0x65, 0x35, 0xa6, 0x8f, 0xd8, 0xd5, 0x97, 0x9c, 0x91, 0x27, 0xa3, 0xfa, - 0xcc, 0x4e, 0x84, 0xf0, 0x2a, 0xac, 0xa7, 0x9e, 0x00, 0x25, 0x0e, 0x81, 0x54, 0x57, 0x0b, 0xf0, - 0x10, 0xad, 0x00, 0x84, 0x91, 0x13, 0x44, 0x76, 0xdf, 0x89, 0x4e, 0xa3, 0xde, 0x2d, 0xb3, 0x8d, - 0x99, 0x7b, 0x5c, 0x23, 0x5d, 0xd5, 0x89, 0x5c, 0xde, 0x38, 0xa3, 0x01, 0x17, 0xa7, 0x6e, 0x9a, - 0xe4, 0x15, 0xd0, 0x0f, 0x1c, 0xa1, 0x32, 0xed, 0x1d, 0x39, 0xc3, 0xa1, 0x3b, 0x10, 0x0d, 0x5b, - 0x93, 0xf0, 0x0a, 0x07, 0x0b, 0x6e, 0xef, 0x29, 0xbd, 0xa3, 0xac, 0x96, 0x53, 0xf4, 0x8e, 0x60, - 0xf0, 0x03, 0x0d, 0xae, 0xcc, 0xda, 0x7b, 0xc9, 0x25, 0x28, 0x8f, 0x02, 0xcf, 0x47, 0x19, 0x5f, - 0xf4, 0xa1, 0xfc, 0x8d, 0x79, 0x22, 0x50, 0x18, 0x8d, 0x9c, 0x43, 0xf1, 0xa6, 0x86, 0x2e, 0x22, - 0xa4, 0xeb, 0x1c, 0x86, 0xac, 0x8b, 0xfb, 0xee, 0x81, 0x33, 0x1e, 0x44, 0x76, 0xd8, 0x3b, 0x72, - 0xfb, 0xf8, 0xea, 0x0d, 0x3d, 0x29, 0xa9, 0x2e, 0x0a, 0x2c, 0x09, 0x9f, 0xa8, 0xf1, 0xdc, 0x94, - 0x1a, 0xdf, 0x2b, 0x95, 0x35, 0xbd, 0x40, 0xd1, 0x75, 0xcd, 0xf8, 0x4e, 0x01, 0x36, 0xa7, 0x6d, - 0x36, 0xe4, 0x9d, 0xbc, 0x3e, 0xe0, 0x56, 0x1f, 0x15, 0xae, 0x5a, 0x7d, 0xd4, 0xd9, 0x73, 0x07, - 0xe2, 0x37, 0x6b, 0xcf, 0x8a, 0x3f, 0x21, 0x61, 0x8c, 0x66, 0xe4, 0x84, 0xe1, 0x53, 0xb6, 0x9f, - 0x16, 0x95, 0x28, 0xc4, 0x02, 0xa6, 0xd2, 0x48, 0x18, 0x79, 0x1b, 0xa0, 0x37, 0xf0, 0x43, 0x17, - 0x9d, 0x2b, 0x84, 0xa0, 0xc6, 0x3d, 0xf1, 0x63, 0xa8, 0x6a, 0x4d, 0x47, 0x68, 0xc5, 0xef, 0xcb, - 0xf9, 0xe4, 0xc0, 0x85, 0x29, 0xa7, 0x0b, 0x1b, 0x1e, 0x7c, 0x84, 0xc6, 0x37, 0x13, 0x91, 0xff, - 0x8b, 0x41, 0x78, 0xde, 0x9a, 0x6c, 0x8f, 0x17, 0xa6, 0xcd, 0x91, 0x13, 0x20, 0x93, 0x47, 0x08, - 0xe3, 0x2e, 0x3c, 0xcf, 0xc7, 0x41, 0xcc, 0x9d, 0x43, 0xf6, 0x83, 0x01, 0xb9, 0x0e, 0x4b, 0x32, - 0x53, 0x29, 0xbb, 0x08, 0x71, 0xe6, 0x20, 0x40, 0xf7, 0x5d, 0x9c, 0x3c, 0x18, 0x03, 0x16, 0x5f, - 0x26, 0x8a, 0x95, 0xb7, 0x88, 0x90, 0xee, 0xc9, 0x48, 0xb6, 0xee, 0x8a, 0x9c, 0xdf, 0xe9, 0x83, - 0x5d, 0x94, 0xfe, 0x13, 0x4d, 0x0e, 0xff, 0xe4, 0xc9, 0xf8, 0xac, 0xfa, 0x11, 0xc0, 0x87, 0x61, - 0xa2, 0x62, 0xf8, 0x3f, 0x13, 0xf9, 0xe4, 0xaa, 0x13, 0x22, 0x9f, 0xf8, 0x49, 0x6e, 0xc2, 0x5a, - 0xc0, 0x1d, 0x8b, 0x23, 0x5f, 0xf4, 0x27, 0x4f, 0x8b, 0xb2, 0xc2, 0xc1, 0x5d, 0x1f, 0xfb, 0x54, - 0xd4, 0xeb, 0x5e, 0xdc, 0x61, 0x8a, 0xa0, 0x40, 0x5e, 0x87, 0x45, 0x26, 0x28, 0x60, 0xf8, 0xa1, - 0xcc, 0x8b, 0x14, 0xc4, 0x43, 0xb1, 0x8b, 0x96, 0x3f, 0x14, 0xff, 0x0b, 0x5e, 0xff, 0xa6, 0x20, - 0x99, 0xa9, 0x62, 0x0a, 0xb9, 0x00, 0x0b, 0x7e, 0x70, 0xa8, 0x34, 0x6d, 0xde, 0x0f, 0x0e, 0x59, - 0xbb, 0x6e, 0x81, 0xce, 0x1f, 0x48, 0xf1, 0x40, 0x15, 0xe1, 0xc9, 0x90, 0xeb, 0x31, 0xca, 0x74, - 0x95, 0xc3, 0xf7, 0x43, 0x37, 0xb0, 0x4e, 0x86, 0x3d, 0x86, 0x19, 0x86, 0xbe, 0xad, 0x46, 0x11, - 0x13, 0xcd, 0x5e, 0x0d, 0x43, 0x3f, 0x09, 0x27, 0xd6, 0x27, 0xdb, 0xb0, 0xc2, 0xf8, 0xc4, 0xb1, - 0xcc, 0xc4, 0x0e, 0x78, 0x75, 0x52, 0x8a, 0x3a, 0x19, 0xf6, 0x64, 0x15, 0xe9, 0x72, 0xa8, 0xfc, - 0x22, 0xf7, 0x41, 0x57, 0xc4, 0x4d, 0x7c, 0x31, 0x9b, 0x71, 0x72, 0x4f, 0xd8, 0x28, 0x62, 0x6a, - 0x7d, 0x78, 0xe0, 0xd3, 0xb5, 0x5e, 0x1a, 0x10, 0xef, 0x04, 0xf3, 0xfa, 0x02, 0xdd, 0x14, 0xcd, - 0x0d, 0xd1, 0x7b, 0xd2, 0x1e, 0xf8, 0x87, 0xb6, 0xfb, 0x09, 0x1b, 0x13, 0xe3, 0x0f, 0x34, 0xb9, - 0xd7, 0xe6, 0x30, 0x25, 0x06, 0xac, 0x1c, 0x39, 0xa1, 0x1d, 0x86, 0xc7, 0xdc, 0xa9, 0x4f, 0x84, - 0x52, 0x5e, 0x3a, 0x72, 0x42, 0x2b, 0x3c, 0x96, 0x79, 0x5b, 0xce, 0x31, 0x1c, 0xdf, 0x19, 0x47, - 0x47, 0xb6, 0x2a, 0x5c, 0xf3, 0x1e, 0x3d, 0x7b, 0xe4, 0x84, 0x6d, 0x56, 0xa6, 0xf0, 0x26, 0x2f, - 0xc1, 0x2a, 0xf2, 0xed, 0x79, 0x92, 0x31, 0x06, 0x23, 0xa1, 0xcb, 0x8c, 0x71, 0xcf, 0xe3, 0x9c, - 0xc5, 0xe0, 0xfe, 0xb0, 0x04, 0xe7, 0xf3, 0x7b, 0x0f, 0xa7, 0x2f, 0xeb, 0x73, 0x7c, 0x36, 0x29, - 0xea, 0xb6, 0xc8, 0x20, 0x3c, 0x90, 0x4c, 0xde, 0xe0, 0x15, 0x72, 0x07, 0x6f, 0x0b, 0xd6, 0x91, - 0x91, 0x10, 0xe3, 0x07, 0x5e, 0x18, 0x89, 0xf8, 0x28, 0x74, 0x8d, 0x15, 0xf0, 0xfd, 0xbe, 0xc1, - 0xc0, 0xe4, 0x65, 0x58, 0x95, 0x3b, 0xb6, 0xff, 0x74, 0xc8, 0x3e, 0xcc, 0xb7, 0xeb, 0x15, 0x01, - 0x6d, 0x23, 0x90, 0x9c, 0x83, 0x79, 0x67, 0x34, 0x62, 0x9f, 0xe4, 0xbb, 0xf4, 0x9c, 0x33, 0x1a, - 0xf1, 0xdc, 0x42, 0xf8, 0x48, 0xd4, 0x3e, 0x40, 0x17, 0x2c, 0xe1, 0x43, 0x4a, 0x97, 0x11, 0xc8, - 0xdd, 0xb2, 0x42, 0xb6, 0x2f, 0x30, 0x5a, 0x89, 0xb2, 0x80, 0x28, 0xe0, 0x8c, 0x62, 0x84, 0x8b, - 0x50, 0x96, 0xce, 0x00, 0xfc, 0x55, 0x0c, 0x5d, 0x70, 0x84, 0x23, 0xc0, 0x5b, 0x70, 0xa1, 0xef, - 0x85, 0x62, 0xb4, 0x59, 0x93, 0x46, 0x23, 0xf1, 0x2c, 0x95, 0x87, 0x31, 0xa6, 0x1b, 0xa2, 0x98, - 0xf5, 0xa4, 0x39, 0x1a, 0xc5, 0x8f, 0x53, 0x2f, 0x49, 0xb2, 0xc7, 0x1e, 0x8f, 0xd7, 0xc6, 0x1d, - 0x62, 0x71, 0x71, 0x00, 0x52, 0x6e, 0x0a, 0x8c, 0x6d, 0x15, 0x41, 0x2e, 0x93, 0x78, 0x25, 0xd9, - 0x5c, 0x79, 0x28, 0x24, 0x17, 0x34, 0x19, 0xe3, 0xa0, 0x21, 0x94, 0xbc, 0x0d, 0x53, 0xe7, 0x22, - 0x4a, 0xb8, 0x65, 0x7a, 0x8e, 0x97, 0x73, 0x47, 0xdf, 0x86, 0x7f, 0x58, 0xc3, 0x42, 0xf2, 0x1e, - 0x5c, 0x91, 0x15, 0x74, 0xc2, 0xd0, 0x3b, 0x1c, 0xda, 0x72, 0x14, 0xd0, 0x17, 0x03, 0xa5, 0xdc, - 0x32, 0xbd, 0x28, 0x70, 0x4c, 0x44, 0xa9, 0x72, 0x0c, 0x7c, 0xd6, 0x28, 0x66, 0xd3, 0xd7, 0x60, - 0x4d, 0x08, 0xec, 0x42, 0x48, 0xc0, 0xde, 0x16, 0x5b, 0x18, 0xbb, 0x49, 0x8b, 0x7c, 0x55, 0x20, - 0x40, 0xf5, 0xbe, 0xa4, 0xfc, 0x2f, 0x1a, 0x9c, 0xcb, 0x95, 0xf8, 0xc9, 0xaf, 0x03, 0x7f, 0x67, - 0x18, 0xf9, 0x76, 0xe0, 0xf6, 0xbc, 0x91, 0x87, 0x81, 0x5b, 0xb8, 0x46, 0xfc, 0xce, 0xac, 0xbb, - 0x02, 0xbe, 0x59, 0xec, 0xfa, 0x34, 0x26, 0xe2, 0xaa, 0x3a, 0x3d, 0xc8, 0x80, 0x2f, 0x7d, 0x00, - 0xe7, 0x72, 0x51, 0x73, 0x54, 0x68, 0x5f, 0x4e, 0x27, 0x4b, 0x97, 0x36, 0xce, 0x4c, 0xa3, 0x15, - 0xd5, 0x9a, 0x68, 0xde, 0x9f, 0xc4, 0xcd, 0xcb, 0xdc, 0x0d, 0x48, 0x2d, 0xbb, 0xb3, 0xe5, 0x5d, - 0x6f, 0x25, 0xd1, 0xf4, 0xcd, 0xed, 0x03, 0x38, 0x27, 0x96, 0xd7, 0x61, 0xe0, 0x8c, 0x8e, 0x12, - 0x76, 0xbc, 0xa2, 0x5f, 0xca, 0x63, 0xc7, 0xd7, 0xdd, 0x2e, 0xc3, 0x8f, 0xb9, 0x9e, 0x75, 0x26, - 0x81, 0xa2, 0x0d, 0xbf, 0x51, 0x90, 0x9b, 0x59, 0x4e, 0x75, 0x72, 0x16, 0xae, 0x96, 0xb7, 0x70, - 0x4f, 0xbf, 0x6b, 0xb4, 0x80, 0xa8, 0xdb, 0xb5, 0x98, 0xf7, 0xdc, 0x1f, 0x4f, 0x5e, 0xf3, 0x44, - 0x45, 0x94, 0xcd, 0x8f, 0x2f, 0x04, 0xba, 0xde, 0xcb, 0x82, 0x98, 0x2c, 0x1e, 0xe7, 0x83, 0x17, - 0x47, 0x67, 0x99, 0x03, 0xea, 0x7d, 0xf2, 0x02, 0x2c, 0xf3, 0x1b, 0x5d, 0x6a, 0x57, 0x01, 0x84, - 0x99, 0x6c, 0x6b, 0x91, 0x7d, 0xa0, 0xc1, 0x0b, 0xcf, 0xea, 0x43, 0xf2, 0x10, 0xce, 0xa3, 0x57, - 0x50, 0xe8, 0xc7, 0xc3, 0x60, 0xf7, 0x9c, 0xde, 0x91, 0x2b, 0x66, 0xad, 0x91, 0x3b, 0x18, 0xa3, - 0x91, 0x65, 0xb5, 0x95, 0x71, 0x18, 0x8d, 0xac, 0xd0, 0x97, 0xbf, 0x2b, 0x8c, 0x5c, 0xd4, 0xa1, - 0x0f, 0x97, 0x67, 0x50, 0x2a, 0x5b, 0xa3, 0xa6, 0x6e, 0x8d, 0xb7, 0x40, 0x3f, 0x70, 0xfb, 0xec, - 0x9a, 0xe3, 0xf6, 0xb1, 0x6a, 0x1f, 0xdf, 0xc1, 0x8e, 0x5f, 0xa6, 0xab, 0x31, 0xdc, 0x0a, 0xfd, - 0x07, 0x77, 0xc4, 0x57, 0x8e, 0xe5, 0xa1, 0xaf, 0xde, 0x4a, 0xc9, 0xeb, 0x70, 0x36, 0x13, 0x14, - 0x27, 0x89, 0xb2, 0x40, 0xd7, 0x59, 0x51, 0x3a, 0x84, 0xda, 0x0d, 0x58, 0x56, 0x37, 0x12, 0x29, - 0xe1, 0xf5, 0x93, 0xad, 0x43, 0x7c, 0x6e, 0x2c, 0x1b, 0x95, 0x7b, 0xa1, 0x3d, 0xcd, 0x5d, 0xeb, - 0x35, 0x20, 0xf1, 0xcd, 0x25, 0xde, 0x28, 0xc4, 0x07, 0xd7, 0x65, 0x49, 0xbc, 0xc2, 0xc5, 0x67, - 0xff, 0xf5, 0x3c, 0x9c, 0xcd, 0xb9, 0x09, 0x93, 0xd7, 0x40, 0xf7, 0x86, 0x91, 0x7b, 0x18, 0x28, - 0x57, 0x33, 0x2e, 0xbd, 0x17, 0x36, 0x35, 0xba, 0xa6, 0x94, 0x09, 0x15, 0xe7, 0x3c, 0xcf, 0xf2, - 0x2f, 0xbe, 0x27, 0x7e, 0xb1, 0x0d, 0xc4, 0x09, 0xa4, 0xf6, 0x8e, 0xfd, 0x4b, 0xea, 0xb0, 0x8e, - 0x19, 0x41, 0x42, 0xcf, 0xc7, 0xc4, 0x22, 0x28, 0x8a, 0x95, 0x52, 0xf7, 0x65, 0xac, 0x49, 0x47, - 0x41, 0x62, 0xb2, 0x18, 0xd5, 0x47, 0x19, 0x08, 0xf9, 0x06, 0x5c, 0x52, 0x4e, 0x54, 0x3b, 0xb3, - 0xfa, 0xf0, 0x01, 0x06, 0xbd, 0xe0, 0xc4, 0x67, 0x6b, 0x35, 0xb5, 0x0e, 0xb7, 0x81, 0x67, 0x11, - 0xf6, 0xfa, 0x23, 0x7b, 0x22, 0x85, 0x0c, 0x36, 0x97, 0x27, 0x44, 0xb8, 0xc4, 0xb0, 0xea, 0xfd, - 0x51, 0x26, 0x9b, 0x0c, 0xb6, 0xba, 0x93, 0xbb, 0x42, 0x17, 0x70, 0x85, 0x5e, 0x55, 0x1b, 0x33, - 0xb1, 0x3e, 0xb1, 0x17, 0x73, 0xd6, 0xe8, 0x21, 0xac, 0x27, 0x27, 0x9d, 0x3c, 0xa0, 0xcb, 0xa9, - 0xac, 0xff, 0xc8, 0x50, 0x4a, 0x90, 0xfc, 0xc4, 0xe6, 0x81, 0x22, 0x26, 0x08, 0xd5, 0x70, 0x28, - 0xe3, 0x14, 0x41, 0x48, 0x1a, 0xb0, 0xe1, 0x3c, 0x0d, 0x65, 0x6e, 0xd2, 0x30, 0xfe, 0xd6, 0xe2, - 0xe4, 0xb7, 0xa4, 0xbd, 0x8e, 0x93, 0x52, 0xe2, 0x3c, 0x0d, 0x45, 0xca, 0xd2, 0x50, 0x72, 0xfb, - 0x10, 0x08, 0x17, 0x3b, 0x52, 0xf5, 0x86, 0x67, 0xf1, 0x12, 0x89, 0x4d, 0x27, 0x28, 0xd5, 0xa0, - 0x6e, 0x58, 0xaa, 0xd6, 0xbc, 0x9b, 0xd6, 0xb1, 0x2e, 0xa5, 0x0c, 0x84, 0xd9, 0xde, 0xe6, 0xc6, - 0x4b, 0x05, 0x5f, 0xbd, 0x6a, 0x2a, 0x60, 0xbc, 0x5d, 0x60, 0xd0, 0x27, 0xac, 0xc7, 0x31, 0xbb, - 0x07, 0x2e, 0x8b, 0xdb, 0x05, 0x03, 0xb3, 0x0a, 0x34, 0x93, 0x1b, 0xdf, 0xa7, 0x1a, 0xe8, 0xd9, - 0x4f, 0x91, 0x6f, 0xc2, 0x3c, 0x17, 0x3a, 0xc4, 0x09, 0x66, 0xe4, 0xd7, 0x89, 0x8f, 0x34, 0x97, - 0x3f, 0xf6, 0xce, 0x50, 0x41, 0x43, 0xbe, 0x0a, 0x25, 0xdf, 0xeb, 0x4b, 0x83, 0xe7, 0x0b, 0xb3, - 0x68, 0xdb, 0xf5, 0x6a, 0x05, 0x95, 0xa4, 0x5e, 0x5f, 0x5c, 0x51, 0xb6, 0xcb, 0x30, 0xcf, 0x3b, - 0xd6, 0xf8, 0x10, 0x2e, 0xcf, 0xf8, 0x20, 0xa9, 0xc1, 0x5a, 0xc6, 0x18, 0x7c, 0x4a, 0x3b, 0xb1, - 0x93, 0xd8, 0x89, 0x03, 0x29, 0x3b, 0x0f, 0xe0, 0xe2, 0xd4, 0x0a, 0x92, 0xfa, 0xd4, 0x1d, 0x04, - 0xc3, 0x92, 0x64, 0xcb, 0xd4, 0xc9, 0x9a, 0xd9, 0x5d, 0xc4, 0xd7, 0x7e, 0xbb, 0x00, 0x67, 0x73, - 0x26, 0x11, 0x31, 0xa0, 0x20, 0xf7, 0xfa, 0x49, 0x57, 0xc3, 0xbd, 0x33, 0xb4, 0xe0, 0xf5, 0xc9, - 0x5d, 0x00, 0xcc, 0x01, 0x1b, 0xb8, 0x87, 0xee, 0x27, 0x42, 0x97, 0x80, 0x37, 0xfc, 0x04, 0x9a, - 0xa2, 0x59, 0x44, 0xf3, 0x0d, 0x03, 0x93, 0xdb, 0x00, 0xee, 0x27, 0xbd, 0xc1, 0xb8, 0xef, 0xc6, - 0xb7, 0xb3, 0x9c, 0xcf, 0x68, 0x74, 0x51, 0x60, 0xd5, 0xfb, 0x64, 0x0f, 0x88, 0x24, 0x51, 0xbe, - 0x5a, 0x7a, 0xc6, 0x57, 0x35, 0xaa, 0x0b, 0xaa, 0x96, 0xfc, 0xb8, 0x18, 0xdd, 0x45, 0x58, 0xf0, - 0x86, 0x58, 0xc2, 0xfe, 0x15, 0x48, 0xc6, 0x1f, 0x6b, 0xa2, 0x3f, 0xd2, 0x9b, 0x01, 0xe9, 0x82, - 0xf0, 0x35, 0x10, 0x1b, 0xc7, 0xcd, 0xe9, 0x1b, 0x87, 0x6a, 0xc2, 0x15, 0xf1, 0x69, 0x10, 0xa0, - 0x1a, 0x2a, 0x39, 0xe4, 0x73, 0x18, 0x57, 0xc5, 0xf0, 0x7d, 0x00, 0xe7, 0x72, 0x37, 0x76, 0x76, - 0xdb, 0x40, 0x97, 0xe5, 0xe4, 0x22, 0xbd, 0xc0, 0x7e, 0xb3, 0x9b, 0xf4, 0x0d, 0x58, 0x7e, 0xec, - 0x3a, 0x81, 0x1b, 0x88, 0x6b, 0x9c, 0x38, 0x3d, 0x39, 0x4c, 0xbd, 0xc5, 0xf5, 0xd3, 0xa7, 0x98, - 0xb0, 0xce, 0x90, 0x26, 0x9c, 0xe5, 0xbb, 0x8b, 0x77, 0x8c, 0x9a, 0x03, 0x61, 0xd1, 0xd1, 0x52, - 0x77, 0x67, 0x24, 0xc1, 0x7b, 0x4a, 0x1d, 0xb1, 0x38, 0x35, 0x5d, 0x3f, 0xcc, 0x82, 0x98, 0xf0, - 0x73, 0x3e, 0x1f, 0x9b, 0x6c, 0xc3, 0x12, 0x67, 0xce, 0x75, 0x48, 0xdc, 0x14, 0x7f, 0x63, 0xe6, - 0x17, 0x2a, 0xf8, 0x92, 0x27, 0x8c, 0xff, 0x67, 0x97, 0x37, 0xf4, 0x7a, 0xb2, 0x8f, 0x55, 0x4f, - 0x03, 0xba, 0x8c, 0x40, 0xe1, 0x61, 0x60, 0xfc, 0x27, 0x4d, 0x36, 0x35, 0xa5, 0x86, 0x66, 0x27, - 0x70, 0xe8, 0x0e, 0xa5, 0xb7, 0xc5, 0x22, 0x15, 0xbf, 0x9e, 0x53, 0x2a, 0x20, 0x6f, 0xc3, 0x32, - 0x63, 0x7b, 0x38, 0x1e, 0xf2, 0x93, 0xb9, 0x98, 0x8a, 0x9b, 0xd7, 0xe4, 0x45, 0x6c, 0xd8, 0xf6, - 0xce, 0xd0, 0xa5, 0xe3, 0xe4, 0x27, 0x79, 0x1d, 0x16, 0xc3, 0xe3, 0x68, 0xa4, 0x9e, 0xe7, 0xd2, - 0x24, 0x67, 0x35, 0xbb, 0x1d, 0x41, 0x52, 0x66, 0x38, 0x89, 0x6a, 0x65, 0x7b, 0x9e, 0x1b, 0xe5, - 0x8c, 0x57, 0x61, 0x49, 0xe1, 0xcd, 0x1a, 0xc3, 0xdf, 0xbd, 0xca, 0xc6, 0xf0, 0x5f, 0x62, 0xb0, - 0x1f, 0x43, 0x59, 0xb2, 0x24, 0x04, 0x4a, 0x47, 0x7e, 0x28, 0xe5, 0x21, 0xfc, 0x9f, 0xc1, 0xf0, - 0xc2, 0xc7, 0x1a, 0x39, 0x47, 0xf1, 0x7f, 0x14, 0xbb, 0x51, 0x7d, 0x8c, 0xd1, 0x96, 0xd1, 0xd7, - 0x39, 0xd6, 0xb4, 0x30, 0x78, 0x77, 0x10, 0x72, 0x0f, 0x68, 0xa9, 0xf3, 0x89, 0xef, 0x2b, 0x19, - 0xbd, 0xfd, 0x34, 0xf1, 0x32, 0x25, 0x5d, 0x17, 0x26, 0xa5, 0x6b, 0x1e, 0x0f, 0x4d, 0x50, 0xf2, - 0x2f, 0x03, 0xc2, 0x50, 0xba, 0x56, 0x04, 0xa8, 0x52, 0x4a, 0x80, 0x52, 0x14, 0xb8, 0xc9, 0xe8, - 0x71, 0xe1, 0x5c, 0x2a, 0x70, 0xb3, 0x22, 0xdd, 0xf7, 0xe3, 0x19, 0x92, 0xb2, 0x1c, 0x90, 0x3b, - 0x70, 0x8e, 0x6b, 0x51, 0x44, 0x9a, 0xfb, 0x8c, 0x2c, 0x79, 0x16, 0x0b, 0x79, 0x96, 0xbc, 0x58, - 0xa6, 0x7c, 0xb6, 0x82, 0x92, 0xbc, 0x01, 0x1b, 0x71, 0x8e, 0xe5, 0xf0, 0x89, 0x37, 0xe2, 0x39, - 0x26, 0x4f, 0x84, 0x7e, 0x83, 0xc8, 0x32, 0xeb, 0x89, 0x37, 0xc2, 0x7c, 0x93, 0xb2, 0x87, 0xff, - 0xb0, 0x20, 0xd5, 0xde, 0xdb, 0xbe, 0x1f, 0x85, 0x51, 0xe0, 0x8c, 0x52, 0xb6, 0x51, 0x72, 0x0c, - 0x17, 0xb1, 0x4a, 0x77, 0x30, 0xd1, 0x95, 0x1f, 0x48, 0x33, 0x41, 0xbc, 0xc0, 0x96, 0xee, 0x7c, - 0x25, 0xad, 0xb7, 0x32, 0x19, 0xb6, 0xa9, 0x22, 0xb3, 0x75, 0xa5, 0x70, 0xdd, 0x3b, 0x43, 0x2f, - 0x70, 0x9e, 0x13, 0x58, 0x64, 0x2f, 0x67, 0xaf, 0xc9, 0x1a, 0x47, 0xb7, 0x93, 0x8d, 0x27, 0xcd, - 0x55, 0xdd, 0x92, 0xc8, 0xbb, 0xb0, 0xe8, 0xf5, 0xd5, 0xe4, 0xce, 0x59, 0xb3, 0x5c, 0xbd, 0xcf, - 0xd3, 0x4c, 0x24, 0x3c, 0xd8, 0xd2, 0xf0, 0x04, 0x74, 0x7b, 0x25, 0x25, 0xe1, 0x18, 0xdb, 0x52, - 0xc3, 0x3a, 0x49, 0x46, 0x56, 0x93, 0xb3, 0x0f, 0xcf, 0x39, 0xdc, 0x05, 0x92, 0x44, 0x17, 0x54, - 0xfc, 0x32, 0xfe, 0x7f, 0xb8, 0x75, 0xda, 0x3e, 0x62, 0x3b, 0xc6, 0x94, 0x0e, 0x5f, 0xe4, 0xf1, - 0xb1, 0xd3, 0xfd, 0x76, 0x03, 0xd4, 0xb8, 0xfe, 0x9e, 0x9c, 0x22, 0x12, 0xb6, 0x1f, 0x78, 0xc6, - 0xff, 0x28, 0xc2, 0x6a, 0xda, 0x6e, 0x4e, 0x5e, 0x85, 0x92, 0xb2, 0x51, 0x5e, 0xc8, 0x31, 0xae, - 0xe3, 0xf6, 0x88, 0x48, 0xa7, 0xda, 0x18, 0xc9, 0x3d, 0x58, 0x45, 0x4f, 0x7e, 0x14, 0xe0, 0x22, - 0x4f, 0x98, 0x92, 0x4e, 0x6b, 0x24, 0x5a, 0x66, 0xb4, 0xec, 0x60, 0x64, 0x85, 0x8a, 0x59, 0xb4, - 0x34, 0xdd, 0x2c, 0x2a, 0x9a, 0x32, 0xc5, 0x2c, 0x3a, 0x37, 0xc3, 0x2c, 0x9a, 0x50, 0xaa, 0x66, - 0x51, 0x34, 0x8e, 0x2f, 0x4c, 0x33, 0x8e, 0x27, 0x34, 0xdc, 0x38, 0x9e, 0x98, 0x35, 0xcb, 0x53, - 0xcd, 0x9a, 0x09, 0x8d, 0x30, 0x6b, 0x26, 0x86, 0xc6, 0xc5, 0xa9, 0x86, 0x46, 0x85, 0x88, 0x1b, - 0x1a, 0x5f, 0x12, 0x1d, 0x1b, 0x38, 0x4f, 0x6d, 0xec, 0x71, 0x71, 0x33, 0xc2, 0x2e, 0xa3, 0xce, - 0x53, 0x74, 0xd1, 0x65, 0x82, 0x89, 0xf0, 0xeb, 0x35, 0x7e, 0x90, 0xd9, 0x80, 0xe4, 0x98, 0xbf, - 0x0c, 0xab, 0xfc, 0x1c, 0x16, 0x71, 0xd7, 0xf9, 0x41, 0xbc, 0x42, 0x57, 0x24, 0x94, 0xeb, 0x55, - 0xbf, 0x04, 0x6b, 0x31, 0x9a, 0x50, 0x2d, 0x62, 0x08, 0x01, 0x1a, 0x53, 0x0b, 0xa5, 0xa2, 0xca, - 0x2f, 0x10, 0x31, 0xe5, 0x52, 0xfc, 0x78, 0xc0, 0xb1, 0xd7, 0x80, 0x24, 0x68, 0xf1, 0x2b, 0x87, - 0x12, 0xa2, 0xae, 0xc7, 0xa8, 0xf1, 0x53, 0x84, 0xdf, 0xd3, 0x32, 0x06, 0xbd, 0x9f, 0x57, 0xf5, - 0x5f, 0x85, 0xf8, 0xeb, 0xb6, 0x30, 0xca, 0xc8, 0x16, 0xe8, 0xb2, 0xa0, 0x23, 0xe0, 0xc6, 0x61, - 0x56, 0x7d, 0xf6, 0x73, 0xaa, 0x95, 0xf1, 0x87, 0xa5, 0x94, 0xb1, 0x43, 0x7e, 0x86, 0xc9, 0x37, - 0xa1, 0x6f, 0x8b, 0x21, 0x16, 0xdb, 0xef, 0x8d, 0x29, 0xd3, 0x54, 0xf8, 0x75, 0x5b, 0x56, 0x9b, - 0x42, 0x18, 0xfa, 0xd2, 0xcd, 0xdb, 0xe6, 0x6a, 0x21, 0xe5, 0xbe, 0x27, 0xd9, 0xf1, 0xbd, 0x76, - 0x6b, 0x36, 0x3b, 0xa9, 0x4d, 0x66, 0xab, 0x14, 0xd5, 0x43, 0xf1, 0x2f, 0xf9, 0x81, 0x7d, 0x40, - 0xdb, 0x60, 0x98, 0x66, 0x5e, 0xcc, 0x51, 0x00, 0x4e, 0x30, 0xc7, 0x5e, 0x42, 0xce, 0xa8, 0x6a, - 0x0e, 0x55, 0xb6, 0x35, 0x58, 0x46, 0x53, 0x82, 0x64, 0x58, 0xca, 0x71, 0x43, 0x98, 0x6c, 0x7c, - 0xa5, 0xde, 0xa4, 0x4b, 0x8c, 0x4e, 0xb2, 0x39, 0x82, 0x8b, 0xaa, 0x01, 0x20, 0x5d, 0xc9, 0x39, - 0x99, 0x2d, 0x61, 0x66, 0x0f, 0x24, 0x76, 0x02, 0xac, 0xea, 0x79, 0x27, 0x0d, 0x90, 0x5f, 0xea, - 0xc1, 0xc5, 0x09, 0xf5, 0x77, 0xfc, 0x25, 0xee, 0x16, 0x73, 0x6b, 0xca, 0x97, 0x32, 0x7a, 0x71, - 0x37, 0xa0, 0xe7, 0xc3, 0x34, 0x48, 0x7c, 0x04, 0xdf, 0x51, 0x4c, 0x1f, 0xf8, 0x19, 0x09, 0x32, - 0x13, 0x01, 0xaa, 0xa0, 0x0a, 0x50, 0xaa, 0xd1, 0xa1, 0x98, 0x36, 0x3a, 0xec, 0xc0, 0x0b, 0x6c, - 0xcf, 0x13, 0x33, 0xc7, 0xfd, 0xd8, 0x0d, 0x4e, 0xfc, 0x21, 0x06, 0xde, 0x1b, 0xc5, 0x4b, 0x9f, - 0x5b, 0x49, 0xae, 0x30, 0x3c, 0x9c, 0x17, 0x35, 0x81, 0xd5, 0x44, 0x24, 0x1e, 0x50, 0xf2, 0x5f, - 0x16, 0xe1, 0xc5, 0x53, 0x4c, 0xae, 0x19, 0x75, 0xff, 0xa5, 0xb4, 0x98, 0x5f, 0x48, 0x29, 0x63, - 0x19, 0x53, 0x71, 0x82, 0x9d, 0x0c, 0x7b, 0x53, 0x84, 0xfc, 0x5f, 0x87, 0x35, 0x7e, 0x4c, 0xf1, - 0x87, 0x24, 0x07, 0xe3, 0xc1, 0x29, 0xce, 0xa9, 0xcb, 0xf2, 0xd5, 0x7b, 0x86, 0x14, 0x8f, 0x2e, - 0xdc, 0x9d, 0xad, 0x18, 0x46, 0xba, 0xb0, 0x84, 0x68, 0x07, 0x8e, 0x37, 0x38, 0xd5, 0xf3, 0x6b, - 0xf9, 0xa6, 0x5e, 0x25, 0xe3, 0xef, 0xdf, 0x18, 0x60, 0x07, 0x7f, 0x93, 0x9b, 0xb0, 0x36, 0x1c, - 0x1f, 0x33, 0x01, 0x96, 0xcf, 0x5c, 0xe1, 0xaf, 0x3b, 0x47, 0x57, 0x86, 0xe3, 0x63, 0x73, 0x34, - 0xc2, 0x09, 0x88, 0x8e, 0xbd, 0xeb, 0x0c, 0x8f, 0xef, 0x31, 0x12, 0x73, 0x1e, 0x31, 0x19, 0x03, - 0xbe, 0xcb, 0x08, 0xdc, 0x0d, 0xe0, 0xcf, 0x3c, 0x44, 0xa2, 0x51, 0xfe, 0xc3, 0xf8, 0x5f, 0x05, - 0xa9, 0x62, 0x9e, 0xbe, 0x4a, 0x7f, 0x31, 0x44, 0x39, 0x43, 0x74, 0x0b, 0x74, 0xd6, 0xf5, 0xc9, - 0x16, 0x18, 0x8f, 0xd1, 0xea, 0x70, 0x7c, 0x1c, 0xf7, 0x9d, 0xda, 0xf1, 0xf3, 0x6a, 0xc7, 0xbf, - 0x2d, 0x55, 0xd0, 0xb9, 0x9b, 0xd9, 0xf4, 0x2e, 0x67, 0xf2, 0xdd, 0xcd, 0xd3, 0x6d, 0x59, 0xbf, - 0x18, 0xb7, 0x9c, 0x71, 0xcb, 0xd8, 0x63, 0xe7, 0x26, 0xec, 0xb1, 0x39, 0x6b, 0x6f, 0x3e, 0x6f, - 0xed, 0x4d, 0x58, 0x7f, 0x17, 0x72, 0xac, 0xbf, 0xb9, 0x0b, 0xb4, 0xfc, 0x8c, 0x05, 0xba, 0xa8, - 0xce, 0x93, 0x1f, 0x15, 0xe0, 0xc6, 0x33, 0xcf, 0x8d, 0x5f, 0x8c, 0x74, 0xce, 0x48, 0xe7, 0xf7, - 0xe7, 0x7f, 0x2b, 0x48, 0x79, 0x39, 0x7d, 0x01, 0xfe, 0x00, 0xce, 0xca, 0x0b, 0x30, 0x97, 0x1b, - 0x12, 0x27, 0x89, 0xa5, 0x3b, 0xaf, 0xe4, 0x5d, 0x7d, 0x11, 0x2d, 0xe7, 0x7a, 0xba, 0x2e, 0x2e, - 0xbd, 0x49, 0xf9, 0xff, 0x3b, 0xd7, 0x5d, 0xf2, 0x08, 0xce, 0x63, 0x1e, 0xa5, 0x9e, 0xea, 0xde, - 0x61, 0x07, 0xee, 0x81, 0xe8, 0xf5, 0x1b, 0x13, 0x97, 0x43, 0xaf, 0xa7, 0x54, 0x87, 0xba, 0x07, - 0x7b, 0x67, 0xe8, 0x46, 0x98, 0x03, 0xcf, 0xde, 0xa4, 0xff, 0x58, 0x03, 0xe3, 0xd9, 0xfd, 0x85, - 0x4a, 0x8f, 0x6c, 0x87, 0x2f, 0xd2, 0x25, 0x47, 0xe9, 0xbd, 0x17, 0x61, 0x25, 0x70, 0x0f, 0x02, - 0x37, 0x3c, 0x4a, 0x69, 0x26, 0x97, 0x05, 0x50, 0x76, 0x8c, 0x0c, 0xe6, 0xfe, 0x5c, 0x57, 0x51, - 0x49, 0x64, 0xec, 0xc4, 0x0a, 0x92, 0xdc, 0x71, 0x60, 0xb3, 0x49, 0xad, 0x20, 0xff, 0x71, 0xaf, - 0x54, 0x2e, 0xe8, 0x45, 0x2a, 0x42, 0xce, 0x1f, 0x78, 0x03, 0xd7, 0xf8, 0xb7, 0xb1, 0xa4, 0x96, - 0xd7, 0x79, 0xe4, 0x03, 0xe5, 0x39, 0x5b, 0x71, 0x42, 0x08, 0xcd, 0x23, 0x39, 0x8d, 0xda, 0xb8, - 0xf1, 0x05, 0xa9, 0x8d, 0xef, 0x4a, 0x9f, 0x78, 0x76, 0x86, 0x3c, 0xb8, 0x4d, 0x5e, 0x81, 0x05, - 0xee, 0x06, 0x2f, 0xab, 0xbb, 0x96, 0xaa, 0xee, 0x83, 0xdb, 0x54, 0x96, 0x1b, 0x9f, 0xc6, 0xce, - 0x47, 0x13, 0x8d, 0x78, 0x70, 0x9b, 0xbc, 0x7d, 0xba, 0xe7, 0x69, 0x65, 0xf9, 0x3c, 0x2d, 0x7e, - 0x9a, 0xf6, 0xb5, 0xd4, 0xd3, 0xb4, 0x97, 0x66, 0xf7, 0x96, 0x70, 0x29, 0xe3, 0x61, 0xbc, 0xe3, - 0x40, 0xb0, 0xc6, 0xdf, 0x14, 0xe0, 0xea, 0x4c, 0x0a, 0x72, 0x05, 0xca, 0x66, 0xa7, 0xde, 0x4d, - 0xc6, 0x97, 0xad, 0x19, 0x09, 0x21, 0xbb, 0xb0, 0xb8, 0xed, 0x84, 0x5e, 0x8f, 0x4d, 0xe3, 0x5c, - 0x0f, 0x87, 0x09, 0xb6, 0x31, 0xfa, 0xde, 0x19, 0x9a, 0xd0, 0x12, 0x1b, 0xd6, 0x71, 0x2d, 0xa4, - 0x92, 0xa4, 0x16, 0x73, 0x94, 0x6b, 0x13, 0x0c, 0x27, 0xc8, 0xd8, 0x3e, 0x33, 0x01, 0x24, 0x8f, - 0x81, 0x58, 0xd6, 0x5e, 0xc5, 0x0d, 0x22, 0xa1, 0x74, 0x8a, 0xbc, 0xf8, 0xad, 0xd3, 0x1b, 0xcf, - 0xe8, 0xbb, 0x09, 0xba, 0xbd, 0x33, 0x34, 0x87, 0x1b, 0xb9, 0x01, 0x6a, 0x36, 0x5f, 0x94, 0x79, - 0x96, 0xf7, 0xce, 0x50, 0x18, 0xc5, 0x59, 0x7d, 0xb3, 0x3b, 0xc1, 0xc7, 0x52, 0xc4, 0x9c, 0xde, - 0x4f, 0xcf, 0x91, 0x45, 0xe1, 0x16, 0x94, 0x3b, 0xd2, 0xe7, 0x54, 0x79, 0x56, 0x2a, 0xfd, 0x4b, - 0x69, 0x5c, 0x6a, 0xfc, 0x03, 0x4d, 0x2a, 0xe2, 0x9e, 0xdd, 0x9f, 0x4a, 0x9a, 0xdb, 0xfe, 0xec, - 0x34, 0xb7, 0xfd, 0x9f, 0x31, 0xcd, 0xad, 0xe1, 0xc1, 0x2b, 0xa7, 0xee, 0x7b, 0xf2, 0x4d, 0xd0, - 0x31, 0x83, 0xa8, 0xa3, 0x8c, 0x23, 0x5f, 0x82, 0xeb, 0x71, 0x5a, 0x9d, 0x3d, 0x91, 0x76, 0x99, - 0xae, 0xf5, 0xd2, 0xd4, 0xc6, 0x1f, 0x89, 0x74, 0x4a, 0xf5, 0x7e, 0x27, 0x63, 0x4a, 0xff, 0xbc, - 0x2f, 0x91, 0x6b, 0xa9, 0xf5, 0xf8, 0xa2, 0x92, 0xae, 0x7d, 0xf2, 0x5b, 0xd3, 0x1f, 0x24, 0x2b, - 0x8b, 0xf3, 0x9f, 0x16, 0xe1, 0xca, 0x2c, 0x72, 0x62, 0x82, 0x5e, 0xe3, 0xc1, 0x0a, 0xc5, 0x1b, - 0x30, 0x3f, 0x50, 0xd3, 0xfb, 0xf1, 0x40, 0x86, 0x76, 0x3f, 0x2e, 0xa4, 0x13, 0xe8, 0x6c, 0x6c, - 0x39, 0x2c, 0x7e, 0x66, 0x8b, 0x63, 0x2b, 0x48, 0xd9, 0xd8, 0xca, 0x62, 0xf2, 0x22, 0xcc, 0x9b, - 0x15, 0x2b, 0x49, 0x43, 0x8c, 0xef, 0xe1, 0x9c, 0x5e, 0x88, 0x2f, 0xad, 0x44, 0x11, 0xf9, 0xb5, - 0xc9, 0xcc, 0xdb, 0x22, 0xff, 0xf0, 0x65, 0xa5, 0x43, 0x26, 0x32, 0x9d, 0x61, 0x7d, 0x93, 0xcc, - 0x5c, 0x22, 0xd9, 0x0d, 0x9d, 0xcc, 0xe2, 0x6d, 0xc0, 0x7c, 0x27, 0x70, 0x43, 0x37, 0x52, 0xdf, - 0xaa, 0x8d, 0x10, 0x42, 0x45, 0x89, 0x78, 0x49, 0xe6, 0x9c, 0xf0, 0xc0, 0x61, 0xf3, 0x6a, 0x80, - 0x48, 0x7c, 0x7a, 0xc6, 0xc0, 0x54, 0x41, 0x61, 0x04, 0x0d, 0x67, 0x3c, 0xec, 0x1d, 0xed, 0xd3, - 0x86, 0x10, 0x56, 0x39, 0xc1, 0x00, 0xa1, 0xac, 0x81, 0x21, 0x55, 0x50, 0x8c, 0xdf, 0xd2, 0x60, - 0x23, 0xaf, 0x1d, 0xe4, 0x0a, 0x94, 0x86, 0xb9, 0x49, 0xc6, 0x87, 0x3c, 0xde, 0xd1, 0x12, 0x5a, - 0x5c, 0x0f, 0xfc, 0xe0, 0xd8, 0x89, 0xd4, 0x17, 0x7d, 0x0a, 0x98, 0xa2, 0x85, 0x78, 0x07, 0xff, - 0x27, 0xd7, 0xe5, 0xa9, 0x54, 0x9c, 0x48, 0x4b, 0x8e, 0x7f, 0x0c, 0x13, 0xa0, 0xde, 0xef, 0xb4, - 0x47, 0x3c, 0xd3, 0xd6, 0x9b, 0x50, 0x62, 0xd5, 0xca, 0xcc, 0x5e, 0x36, 0x7f, 0xcc, 0x66, 0x43, - 0x20, 0xf1, 0x5a, 0x85, 0xce, 0xf1, 0x80, 0x22, 0xb2, 0xf1, 0x10, 0x56, 0xd3, 0x18, 0xa4, 0x96, - 0x4e, 0xb6, 0xb0, 0x74, 0x47, 0x17, 0x9c, 0xb6, 0x7d, 0x9f, 0xbf, 0x2a, 0xdf, 0xbe, 0xf8, 0xe3, - 0xcf, 0xae, 0x03, 0xfb, 0xc9, 0x69, 0xf2, 0x92, 0x31, 0x18, 0xbf, 0x53, 0x80, 0x8d, 0x24, 0x90, - 0x95, 0x5c, 0x43, 0x7f, 0x6b, 0xa3, 0xaa, 0x98, 0xa9, 0xa8, 0x1f, 0x52, 0xb4, 0x9c, 0x6c, 0xe0, - 0x8c, 0x60, 0x03, 0xbb, 0xb0, 0x39, 0x0d, 0x9f, 0xbc, 0x0a, 0x8b, 0x18, 0x4f, 0x75, 0xe4, 0xf4, - 0x5c, 0x75, 0x9b, 0x1d, 0x4a, 0x20, 0x4d, 0xca, 0x8d, 0x1f, 0x69, 0x70, 0x49, 0xbc, 0x85, 0x6e, - 0x3a, 0xde, 0x10, 0x0d, 0x7c, 0x3d, 0xf7, 0x8b, 0x89, 0x0a, 0xb4, 0x9b, 0xda, 0xc7, 0x5e, 0x4e, - 0x3f, 0x79, 0x9f, 0xf8, 0xda, 0xf4, 0xd6, 0x92, 0x57, 0x30, 0x46, 0xb0, 0xf0, 0x15, 0x2c, 0xf1, - 0x28, 0x6c, 0x43, 0x06, 0x50, 0xa3, 0xb0, 0x21, 0x86, 0xf1, 0x77, 0xe0, 0xda, 0xec, 0x0f, 0x90, - 0x5f, 0x85, 0x15, 0x4c, 0x82, 0xbb, 0x3f, 0x3a, 0x0c, 0x9c, 0xbe, 0x2b, 0x55, 0xbf, 0xd2, 0x42, - 0xa1, 0x96, 0xf1, 0x90, 0xc7, 0x22, 0x2a, 0xd8, 0x21, 0xa6, 0xd7, 0x15, 0x44, 0xa9, 0x80, 0x03, - 0x2a, 0x37, 0xe3, 0x3b, 0x1a, 0x90, 0x49, 0x1e, 0xe4, 0xab, 0xb0, 0xbc, 0xdf, 0xad, 0x58, 0x91, - 0x13, 0x44, 0x7b, 0xfe, 0x38, 0x10, 0xf1, 0x86, 0x79, 0x90, 0xa8, 0xa8, 0x67, 0x73, 0x53, 0xee, - 0x91, 0x3f, 0x0e, 0x68, 0x0a, 0x0f, 0xd3, 0xa7, 0xba, 0xee, 0x93, 0xbe, 0x73, 0x92, 0x4e, 0x9f, - 0x2a, 0x60, 0xa9, 0xf4, 0xa9, 0x02, 0x66, 0x7c, 0x5f, 0x83, 0xcb, 0xf2, 0x11, 0x4c, 0x3f, 0xa7, - 0x2e, 0x15, 0x0c, 0x85, 0x18, 0xc8, 0x14, 0x16, 0xb3, 0x84, 0xf8, 0x75, 0x19, 0x2d, 0x14, 0x2b, - 0x88, 0xd2, 0x3c, 0xa7, 0x25, 0xbf, 0x04, 0x25, 0x2b, 0xf2, 0x47, 0xa7, 0x08, 0x17, 0xaa, 0xc7, - 0x23, 0x1a, 0xf9, 0x23, 0x64, 0x81, 0x94, 0x86, 0x0b, 0x1b, 0x6a, 0xe5, 0x64, 0x8d, 0x49, 0x13, - 0x16, 0x44, 0xac, 0xe9, 0x8c, 0x77, 0xe5, 0x8c, 0x36, 0x6d, 0xaf, 0xc9, 0x98, 0xa4, 0x22, 0xd9, - 0x02, 0x95, 0x3c, 0x8c, 0x7f, 0xa8, 0xc1, 0x12, 0x13, 0x6c, 0x50, 0x0f, 0xf0, 0x79, 0xa7, 0x74, - 0x5a, 0x54, 0x96, 0xce, 0xc2, 0x31, 0xfb, 0x53, 0x9d, 0xc6, 0x6f, 0xc1, 0x5a, 0x86, 0x80, 0x18, - 0x18, 0x8d, 0x6e, 0xe0, 0xf5, 0x1c, 0x9e, 0x8d, 0x91, 0x3b, 0xda, 0xa6, 0x60, 0xc6, 0xdf, 0xd3, - 0x60, 0xa3, 0xfd, 0x24, 0x72, 0xb8, 0xc7, 0x05, 0x1d, 0x0f, 0xe4, 0x7a, 0x67, 0xc2, 0x9a, 0x7c, - 0x4d, 0xc5, 0x23, 0x65, 0x71, 0x61, 0x4d, 0xc0, 0x68, 0x5c, 0x4a, 0xf6, 0xa0, 0x2c, 0xce, 0x97, - 0x50, 0xe4, 0x45, 0xb8, 0xa6, 0x28, 0x29, 0x12, 0xc6, 0x02, 0x89, 0xb5, 0x04, 0xb7, 0x30, 0x41, - 0x43, 0x63, 0x6a, 0xe3, 0xaf, 0x34, 0xb8, 0x30, 0x85, 0x86, 0xbc, 0x03, 0x73, 0x18, 0xc5, 0x43, - 0x8c, 0xde, 0x95, 0x29, 0x9f, 0x88, 0x7a, 0x47, 0x0f, 0x6e, 0xf3, 0x83, 0xe8, 0x98, 0xfd, 0xa0, - 0x9c, 0x8a, 0x7c, 0x00, 0x8b, 0x66, 0xbf, 0x2f, 0x2e, 0x70, 0x85, 0xd4, 0x05, 0x6e, 0xca, 0x17, - 0x5f, 0x8f, 0xf1, 0xf9, 0x05, 0x8e, 0xbf, 0x27, 0xef, 0xf7, 0x6d, 0x11, 0xa1, 0x24, 0xe1, 0x77, - 0xe9, 0x9b, 0xb0, 0x9a, 0x46, 0x7e, 0xae, 0xa0, 0x0a, 0x9f, 0x6a, 0xa0, 0xa7, 0xeb, 0xf0, 0xf3, - 0x89, 0xa6, 0x9a, 0x37, 0xcc, 0xcf, 0x98, 0x54, 0xff, 0xa8, 0x00, 0xe7, 0x72, 0x7b, 0x98, 0xbc, - 0x06, 0xf3, 0xe6, 0x68, 0x54, 0xaf, 0x8a, 0x59, 0x25, 0x24, 0x24, 0xb4, 0x57, 0xa4, 0xee, 0xb7, - 0x1c, 0x89, 0xbc, 0x09, 0x65, 0xee, 0xd8, 0x53, 0x95, 0x1b, 0x0e, 0x86, 0x87, 0x14, 0x5e, 0x47, - 0xe9, 0x0c, 0x05, 0x12, 0x91, 0xec, 0xc0, 0xaa, 0x08, 0xac, 0x88, 0x5e, 0x5e, 0x71, 0x32, 0x2c, - 0x74, 0x8c, 0x93, 0x46, 0x10, 0xee, 0x1f, 0x96, 0xda, 0x3b, 0x33, 0x54, 0xa4, 0x01, 0x3a, 0xf2, - 0x54, 0x39, 0xf1, 0x34, 0x09, 0x8a, 0x63, 0xe5, 0x14, 0x5e, 0x13, 0x94, 0xf1, 0x70, 0xf1, 0xc7, - 0x0d, 0xc7, 0xee, 0x30, 0xfa, 0xf9, 0x0d, 0x57, 0xf2, 0x8d, 0x53, 0x0d, 0xd7, 0xf7, 0x4a, 0x7c, - 0x31, 0x67, 0xc9, 0x98, 0x44, 0xa3, 0xe4, 0xbe, 0x41, 0x89, 0x86, 0xdd, 0xcf, 0x44, 0xe8, 0xc0, - 0x2a, 0x2c, 0xf0, 0x90, 0x8e, 0x72, 0x65, 0x5c, 0xcd, 0xad, 0x02, 0xc7, 0x79, 0x70, 0x9b, 0x8b, - 0x2f, 0x3c, 0x9c, 0x48, 0x48, 0x25, 0x29, 0x79, 0x00, 0x4b, 0x95, 0x81, 0xeb, 0x0c, 0xc7, 0xa3, - 0xee, 0xe9, 0xbc, 0x0a, 0x36, 0x45, 0x5b, 0x96, 0x7b, 0x9c, 0x0c, 0xbd, 0x11, 0x70, 0x27, 0x57, - 0x19, 0x91, 0x6e, 0x1c, 0x61, 0xa0, 0x84, 0x1a, 0xd0, 0x37, 0x66, 0xf4, 0x4f, 0x16, 0x88, 0x74, - 0xe9, 0xf0, 0x19, 0x22, 0x04, 0x81, 0x0d, 0xab, 0x0d, 0x27, 0x8c, 0xba, 0x81, 0x33, 0x0c, 0x31, - 0xbc, 0xfc, 0x29, 0x42, 0xe5, 0x5e, 0x16, 0x15, 0xe6, 0x9a, 0xd1, 0x28, 0x26, 0xe5, 0x9a, 0xd1, - 0x34, 0x3b, 0x26, 0x2f, 0xed, 0x78, 0x43, 0x67, 0xe0, 0x7d, 0x5b, 0x06, 0x62, 0xe1, 0xf2, 0xd2, - 0x81, 0x04, 0xd2, 0xa4, 0xdc, 0xf8, 0x95, 0x89, 0x71, 0xe3, 0xb5, 0x5c, 0x82, 0x05, 0x11, 0xa6, - 0x8b, 0x87, 0xad, 0xea, 0xd4, 0x5a, 0xd5, 0x7a, 0x6b, 0x57, 0xd7, 0xc8, 0x2a, 0x40, 0x87, 0xb6, - 0x2b, 0x35, 0xcb, 0x62, 0xbf, 0x0b, 0xec, 0xb7, 0x88, 0x69, 0xb5, 0xb3, 0xdf, 0xd0, 0x8b, 0x4a, - 0x58, 0xab, 0x92, 0xf1, 0x43, 0x0d, 0xce, 0xe7, 0x0f, 0x25, 0xe9, 0x02, 0x06, 0x36, 0x13, 0xfe, - 0x25, 0x5f, 0x9d, 0x39, 0xee, 0xb9, 0xe0, 0x6c, 0x80, 0xb4, 0x88, 0x07, 0xde, 0x2a, 0x48, 0xb3, - 0x25, 0x8f, 0xe4, 0xe1, 0xf5, 0x69, 0xc1, 0xeb, 0x1b, 0x15, 0xd8, 0x9c, 0xc6, 0x23, 0xdd, 0xd4, - 0x35, 0x58, 0x32, 0x3b, 0x9d, 0x46, 0xbd, 0x62, 0x76, 0xeb, 0xed, 0x96, 0xae, 0x91, 0x45, 0x98, - 0xdb, 0xa5, 0xed, 0xfd, 0x8e, 0x5e, 0x30, 0xfe, 0xb3, 0x06, 0x2b, 0xf5, 0xc4, 0xf3, 0xf5, 0xf3, - 0x2e, 0xbe, 0xaf, 0xa7, 0x16, 0xdf, 0x66, 0x1c, 0x02, 0x30, 0xfe, 0xc0, 0x0c, 0x09, 0x72, 0x3b, - 0x8e, 0xd3, 0x52, 0x4c, 0xf9, 0x89, 0xa8, 0xd4, 0x32, 0x02, 0x46, 0x9c, 0xbf, 0x2b, 0x1d, 0xc7, - 0x45, 0x59, 0xbd, 0xff, 0xaa, 0x08, 0xeb, 0x13, 0xdf, 0x25, 0x16, 0x2c, 0x98, 0x0f, 0xad, 0x76, - 0xbd, 0x5a, 0x11, 0xad, 0xbb, 0x9e, 0x78, 0x4b, 0x62, 0x3a, 0xda, 0x89, 0x9a, 0xf2, 0xd0, 0x3b, - 0x4f, 0x43, 0xdb, 0xf7, 0xfa, 0xbd, 0x94, 0xbb, 0xae, 0xe4, 0x84, 0xa7, 0xe1, 0xb7, 0xc7, 0x01, - 0x7a, 0x20, 0x8b, 0x96, 0xc7, 0x4e, 0x98, 0x12, 0x3e, 0xc9, 0x18, 0x7d, 0x72, 0x1d, 0x56, 0x3e, - 0xc9, 0x3a, 0xe1, 0x47, 0x5a, 0x30, 0xbf, 0xeb, 0x45, 0x7b, 0xe3, 0xc7, 0xa2, 0x57, 0xae, 0x25, - 0xc9, 0x49, 0xf7, 0xc6, 0x8f, 0x27, 0xd9, 0xa2, 0x66, 0x94, 0x3f, 0xbb, 0x4f, 0xb1, 0x14, 0x5c, - 0xc8, 0x7d, 0x98, 0x33, 0x1f, 0x5a, 0xd4, 0x14, 0x2b, 0x54, 0xf1, 0x47, 0xa5, 0xe6, 0x14, 0x6e, - 0xac, 0xf5, 0x81, 0x93, 0xe2, 0xc6, 0x79, 0x64, 0x43, 0x8f, 0x94, 0x9e, 0x2b, 0xf4, 0xc8, 0xf6, - 0x0a, 0x2c, 0x89, 0x4b, 0x1d, 0xde, 0x97, 0x3e, 0x81, 0xb3, 0x39, 0x43, 0x4d, 0x1c, 0xf4, 0x7a, - 0x47, 0x5b, 0xba, 0x39, 0x3c, 0x79, 0x7a, 0xe4, 0x06, 0xee, 0xe4, 0xd8, 0xa5, 0xeb, 0x2e, 0x67, - 0x49, 0x6e, 0xed, 0xe9, 0x04, 0x3b, 0xe3, 0x4f, 0x34, 0xd8, 0x9c, 0x36, 0x01, 0xd8, 0x0d, 0x35, - 0x1d, 0xdc, 0xec, 0x7c, 0x9c, 0x84, 0x2f, 0xed, 0xad, 0x2e, 0xd1, 0xc8, 0x7b, 0xb0, 0xc4, 0x3d, - 0x1a, 0xad, 0x37, 0xf7, 0x69, 0x5d, 0xac, 0xdc, 0xab, 0x3f, 0xfd, 0xec, 0xfa, 0x05, 0xe1, 0x04, - 0x19, 0xbe, 0x69, 0x8f, 0x03, 0x2f, 0x21, 0xdd, 0xd4, 0xa8, 0x4a, 0xc1, 0x2e, 0x14, 0xce, 0xb8, - 0xef, 0xb9, 0xf2, 0x3a, 0x25, 0x03, 0x40, 0x09, 0x98, 0x7a, 0xbc, 0x4b, 0x98, 0xf1, 0x5d, 0x0d, - 0x2e, 0x4d, 0x9f, 0x6d, 0x4c, 0x64, 0xe8, 0x72, 0xc7, 0x50, 0x19, 0x82, 0x09, 0x45, 0x86, 0xd8, - 0x7b, 0x54, 0xe5, 0x29, 0x11, 0x19, 0x91, 0x50, 0xf6, 0x49, 0x7d, 0x11, 0x12, 0xc5, 0xba, 0x40, - 0x95, 0x48, 0x22, 0x1a, 0x8f, 0xe0, 0xc2, 0x94, 0xb9, 0x49, 0xde, 0xcd, 0x4d, 0xed, 0x89, 0x2f, - 0xf3, 0xd5, 0xd0, 0x0b, 0xa9, 0x1c, 0xd1, 0x0a, 0xdc, 0xf8, 0x8f, 0xdc, 0x15, 0x3a, 0x67, 0xa2, - 0x32, 0xe9, 0x06, 0x53, 0x49, 0x9a, 0xc3, 0xde, 0x91, 0x1f, 0x24, 0x83, 0x85, 0xd2, 0x4d, 0xc4, - 0x4a, 0x6c, 0x07, 0x8b, 0x32, 0x83, 0x96, 0xa1, 0x22, 0x3e, 0xac, 0x77, 0x02, 0xff, 0xc0, 0xe3, - 0x6f, 0x49, 0xf9, 0xa5, 0x54, 0xac, 0xe9, 0x5b, 0xca, 0x74, 0x53, 0xa7, 0xcf, 0x04, 0x7e, 0x9c, - 0x2f, 0x8a, 0x81, 0xb9, 0xc7, 0x4d, 0x0f, 0x0b, 0xe8, 0x24, 0x6f, 0xe3, 0xc7, 0x05, 0xb8, 0xf1, - 0x4c, 0x8e, 0xa7, 0xcd, 0x88, 0xf9, 0x15, 0x00, 0x41, 0xcb, 0x7a, 0x40, 0x51, 0x39, 0xc9, 0xca, - 0x38, 0xc1, 0x90, 0x2a, 0x28, 0xe4, 0x09, 0x5c, 0x95, 0xbf, 0x7a, 0x3d, 0x77, 0x14, 0x85, 0xac, - 0x1e, 0x22, 0xc4, 0x72, 0x1c, 0x5c, 0xaa, 0xbc, 0xfd, 0xf2, 0x4f, 0x3f, 0xbb, 0x7e, 0x23, 0xe6, - 0xc1, 0x31, 0xf9, 0x83, 0x0d, 0x19, 0xad, 0x19, 0x15, 0x5f, 0xb3, 0x79, 0x91, 0x9b, 0xc9, 0x4a, - 0x2a, 0x25, 0x0a, 0x6b, 0xb9, 0x92, 0x92, 0xf5, 0xb3, 0x07, 0x44, 0x30, 0x62, 0x64, 0x3b, 0xaa, - 0x85, 0x9a, 0xef, 0x9a, 0xb2, 0x26, 0x5c, 0x91, 0xc6, 0xcb, 0x69, 0x0e, 0x8d, 0xf1, 0x7b, 0x7c, - 0x61, 0xe7, 0xee, 0x0e, 0xe4, 0x29, 0xac, 0x31, 0x29, 0x43, 0xe9, 0x6c, 0xb1, 0xaf, 0xdc, 0x79, - 0xf6, 0x40, 0xd7, 0x23, 0x11, 0xba, 0xc4, 0x1a, 0x1f, 0x1f, 0x3b, 0xc1, 0xc9, 0xf6, 0x45, 0x99, - 0xda, 0x11, 0xa5, 0x19, 0x75, 0xec, 0x69, 0xf6, 0x2b, 0xc6, 0x5f, 0x16, 0xe0, 0xd5, 0xe7, 0xe0, - 0x4d, 0x3a, 0xb0, 0x88, 0xf7, 0x79, 0x94, 0x04, 0x9f, 0xad, 0x0f, 0x38, 0x2f, 0xce, 0x46, 0x11, - 0xba, 0x24, 0x96, 0x03, 0x13, 0x26, 0xe4, 0x1e, 0x9b, 0x4e, 0x7d, 0xe4, 0xf7, 0x6c, 0xdd, 0xc0, - 0x86, 0x54, 0x93, 0xb9, 0xc3, 0x7e, 0xc2, 0x4d, 0x32, 0x50, 0xc2, 0xab, 0x15, 0xa7, 0x86, 0x57, - 0x7b, 0x0b, 0x96, 0x6b, 0x8a, 0xdb, 0xac, 0x18, 0x7e, 0xb4, 0x14, 0xa4, 0x7c, 0x6c, 0x69, 0x0a, - 0x8d, 0x7c, 0x03, 0x56, 0xb9, 0x4f, 0x80, 0xe8, 0x1d, 0xee, 0xb1, 0x36, 0x27, 0x72, 0x40, 0x60, - 0x89, 0xec, 0xea, 0x90, 0x66, 0x50, 0xd9, 0xc2, 0x3a, 0xcf, 0xa4, 0x92, 0x81, 0x1b, 0x86, 0xe6, - 0x38, 0x3a, 0x62, 0xa7, 0x0e, 0xbf, 0xa7, 0x93, 0xb7, 0x61, 0xfe, 0xe8, 0xf9, 0xac, 0x70, 0x1c, - 0x9d, 0x10, 0x40, 0x49, 0x5f, 0x06, 0x8f, 0x60, 0xff, 0x93, 0xaf, 0xc1, 0x1c, 0x2a, 0x99, 0x85, - 0x40, 0x2d, 0x15, 0x21, 0xf9, 0x9f, 0x46, 0x15, 0x34, 0xe5, 0x04, 0x6c, 0xb5, 0x26, 0x39, 0x2b, - 0xc5, 0x79, 0x2c, 0x95, 0xaf, 0x71, 0xda, 0x4a, 0xba, 0x78, 0x7c, 0xe0, 0x88, 0x44, 0x90, 0x5b, - 0xb0, 0x2e, 0xf7, 0xde, 0x91, 0xcc, 0xa7, 0x20, 0xbc, 0x69, 0xd6, 0x44, 0x80, 0x9b, 0x91, 0xcc, - 0xa9, 0xf0, 0x12, 0xac, 0x86, 0xe1, 0x91, 0x2d, 0xe2, 0xa3, 0x3d, 0x91, 0xa9, 0x9a, 0xe8, 0x72, - 0x18, 0x1e, 0xf1, 0x40, 0x69, 0xf7, 0xdd, 0x13, 0x86, 0x85, 0x6f, 0x13, 0x12, 0xac, 0x32, 0xc7, - 0x8a, 0x06, 0x61, 0x8c, 0x25, 0x42, 0xfb, 0x41, 0x82, 0x65, 0xfc, 0xd7, 0x02, 0x2c, 0x3e, 0x64, - 0x97, 0x57, 0x54, 0xc9, 0xce, 0x56, 0xf1, 0xde, 0x81, 0xa5, 0x86, 0xef, 0x08, 0xc3, 0xbb, 0x08, - 0xa1, 0xc0, 0x1f, 0x33, 0x0d, 0x7c, 0x47, 0xda, 0xf0, 0x43, 0xaa, 0x22, 0x3d, 0x23, 0xb6, 0xdd, - 0x3d, 0x98, 0xe7, 0x2b, 0x5c, 0x58, 0x1b, 0xa4, 0xfa, 0x22, 0xae, 0xd1, 0xeb, 0xbc, 0x58, 0xb1, - 0x15, 0xf3, 0x5d, 0x42, 0xbd, 0x4b, 0x8b, 0x87, 0x4b, 0x8a, 0x02, 0x7a, 0xee, 0x74, 0x0a, 0x68, - 0x25, 0x2e, 0xfe, 0xfc, 0x69, 0xe2, 0xe2, 0x5f, 0xba, 0x0b, 0x4b, 0x4a, 0x7d, 0x9e, 0x4b, 0x9b, - 0xf1, 0x1b, 0x05, 0x58, 0xc1, 0x56, 0xc5, 0xbb, 0xd6, 0xdf, 0x4e, 0x75, 0xfa, 0xd7, 0x53, 0xea, - 0xf4, 0x4d, 0x75, 0xbc, 0x84, 0x2b, 0xcf, 0x74, 0x3d, 0xfa, 0x3d, 0x58, 0x9f, 0x40, 0x24, 0x6f, - 0xc1, 0x1c, 0xab, 0xbe, 0x54, 0x3f, 0xea, 0xd9, 0x19, 0x90, 0xe4, 0x50, 0x62, 0x0d, 0x0f, 0x29, - 0xc7, 0x36, 0xfe, 0xa7, 0x06, 0xcb, 0x22, 0x45, 0xea, 0xf0, 0xc0, 0x7f, 0x66, 0x77, 0xde, 0xcc, - 0x76, 0x27, 0x8f, 0xd4, 0x2a, 0xba, 0xf3, 0xff, 0x74, 0x27, 0xde, 0x4d, 0x75, 0xe2, 0x85, 0x38, - 0xa3, 0x82, 0x6c, 0xce, 0x8c, 0x3e, 0xfc, 0x01, 0xe6, 0x18, 0x4a, 0x23, 0x92, 0x5f, 0x83, 0xc5, - 0x96, 0xfb, 0x34, 0xa5, 0xc5, 0xbb, 0x39, 0x85, 0xe9, 0xeb, 0x31, 0x22, 0x5f, 0x53, 0xfc, 0x41, - 0xa1, 0xfb, 0xd4, 0x9e, 0xf0, 0xc1, 0x48, 0x58, 0x5e, 0xfa, 0x26, 0xac, 0xa6, 0xc9, 0x9e, 0x67, - 0xea, 0x8b, 0x78, 0x4f, 0x18, 0x7c, 0xf8, 0xb7, 0x8a, 0x00, 0x49, 0xa8, 0x1c, 0xb6, 0x00, 0x53, - 0x4e, 0x5e, 0xd2, 0x00, 0x8a, 0x20, 0x75, 0x8e, 0x4b, 0xdf, 0xaf, 0x9b, 0xc2, 0x50, 0x57, 0x98, - 0x9e, 0xf1, 0x62, 0x28, 0xc3, 0x7d, 0x71, 0xff, 0xe8, 0x81, 0xc3, 0xdf, 0x12, 0x15, 0xb7, 0x5f, - 0xc2, 0x04, 0x47, 0x31, 0x34, 0x95, 0x8e, 0xa0, 0x5c, 0x1d, 0x8b, 0xc4, 0x6a, 0x18, 0xa1, 0xa5, - 0xca, 0x10, 0x26, 0xc2, 0x4f, 0x95, 0x9e, 0x2f, 0xfc, 0x54, 0x07, 0x16, 0xbd, 0xe1, 0xc7, 0xee, - 0x30, 0xf2, 0x83, 0x13, 0xb4, 0x4e, 0x26, 0x66, 0x0f, 0xd6, 0x05, 0x75, 0x59, 0xc6, 0xc7, 0x01, - 0x25, 0xcd, 0x18, 0x5f, 0x1d, 0x86, 0x18, 0x18, 0x07, 0xcd, 0x99, 0xd3, 0xe7, 0x79, 0xe8, 0x9c, - 0x7b, 0xa5, 0x72, 0x59, 0x5f, 0xbc, 0x57, 0x2a, 0x2f, 0xea, 0x40, 0x15, 0xd7, 0x82, 0xd8, 0x75, - 0x40, 0xb1, 0xf6, 0xa7, 0x2d, 0xf9, 0xc6, 0x5f, 0x17, 0x80, 0x4c, 0x56, 0x83, 0x7c, 0x1d, 0x96, - 0xf8, 0x06, 0x6b, 0x07, 0xe1, 0x47, 0xe2, 0x41, 0x25, 0x7f, 0x05, 0xad, 0x80, 0xd5, 0x10, 0xce, - 0x1c, 0x4c, 0xc3, 0x8f, 0x06, 0xe4, 0x57, 0xe1, 0x2c, 0x76, 0xef, 0xc8, 0x0d, 0x3c, 0xbf, 0x6f, - 0x63, 0xbe, 0x1d, 0x67, 0x80, 0x63, 0x55, 0xdc, 0x7e, 0xed, 0xa7, 0x9f, 0x5d, 0xbf, 0x9a, 0x53, - 0x3c, 0x65, 0x18, 0x30, 0xe2, 0x4d, 0x07, 0x31, 0x3b, 0x1c, 0x91, 0x74, 0x41, 0x57, 0xe9, 0x0f, - 0xc6, 0x83, 0x81, 0x18, 0xd9, 0x2d, 0x76, 0x35, 0xc8, 0x96, 0x4d, 0x61, 0xbc, 0x9a, 0x30, 0xde, - 0x19, 0x0f, 0x06, 0xe4, 0x6d, 0x00, 0x7f, 0x68, 0x1f, 0x7b, 0x61, 0xc8, 0x6d, 0xde, 0xf1, 0x23, - 0xdb, 0x04, 0xaa, 0x0e, 0x86, 0x3f, 0x6c, 0x72, 0x20, 0xf9, 0xff, 0x00, 0x23, 0x3f, 0x62, 0x48, - 0x54, 0x21, 0xcd, 0xf0, 0xdb, 0x82, 0x04, 0xa6, 0x63, 0x85, 0x1d, 0xba, 0x96, 0xf7, 0x6d, 0xf9, - 0x16, 0xf9, 0x5b, 0xb0, 0x2e, 0x24, 0xa3, 0x87, 0x5e, 0x74, 0x24, 0x34, 0x2e, 0x9f, 0x47, 0x5d, - 0xa3, 0xa8, 0x4b, 0xfe, 0xac, 0x04, 0x60, 0x3e, 0xb4, 0x64, 0xb4, 0xf1, 0x57, 0x60, 0xae, 0xcb, - 0xd8, 0x08, 0x7d, 0x34, 0x0a, 0x5c, 0xc8, 0x57, 0xb5, 0xe6, 0x21, 0x06, 0x5b, 0x8d, 0x14, 0x9f, - 0x0d, 0x4a, 0x5d, 0x34, 0xae, 0x46, 0xfe, 0x92, 0x30, 0x95, 0xed, 0x49, 0x60, 0x91, 0x06, 0x40, - 0x12, 0xff, 0x5b, 0x68, 0x35, 0xd6, 0x93, 0x40, 0xba, 0xa2, 0x40, 0x64, 0xb1, 0x4c, 0xde, 0x86, - 0xab, 0xd3, 0x27, 0x41, 0x23, 0xf7, 0xa1, 0xd4, 0x75, 0xe2, 0xd0, 0x54, 0x53, 0xa2, 0xa2, 0x63, - 0x86, 0xf4, 0x54, 0x64, 0xf4, 0xd5, 0xc8, 0x39, 0x54, 0x6b, 0x87, 0x4c, 0x48, 0x0d, 0xe6, 0x3b, - 0x4e, 0xe0, 0x1c, 0x87, 0xd3, 0xb2, 0x69, 0xf0, 0x52, 0x99, 0x43, 0x0b, 0x81, 0xaa, 0x4c, 0xc1, - 0x8b, 0xc9, 0x1d, 0x28, 0x5a, 0x56, 0x53, 0x3c, 0x7a, 0x58, 0x49, 0x6e, 0x13, 0x96, 0xd5, 0xe4, - 0x42, 0x6f, 0x18, 0x1e, 0x2b, 0x64, 0x0c, 0x99, 0x7c, 0x03, 0x96, 0x94, 0x4b, 0x8a, 0x88, 0xa2, - 0x8b, 0x7d, 0xa0, 0x3c, 0x4c, 0x57, 0x37, 0x0d, 0x05, 0x9b, 0x34, 0x40, 0xbf, 0x3f, 0x7e, 0xec, - 0x9a, 0xa3, 0x11, 0xc6, 0xc4, 0xf9, 0xd8, 0x0d, 0xb8, 0x20, 0x57, 0x4e, 0xd2, 0x4f, 0xe1, 0x2b, - 0xd0, 0xbe, 0x2c, 0x55, 0xd5, 0x21, 0x59, 0x4a, 0xd2, 0x81, 0x75, 0xcb, 0x8d, 0xc6, 0x23, 0xee, - 0xa9, 0xb8, 0xc3, 0xaf, 0xd3, 0x3c, 0xe6, 0x2e, 0x66, 0xea, 0x09, 0x59, 0xa1, 0x74, 0x0f, 0x3d, - 0x98, 0xb8, 0x52, 0x4f, 0x12, 0x1b, 0xae, 0x3a, 0xe4, 0xea, 0x3d, 0x50, 0x9b, 0x75, 0x0f, 0xfc, - 0x4a, 0x4e, 0x5c, 0x78, 0xbc, 0xcd, 0x2a, 0x71, 0xe1, 0x53, 0xd1, 0xe0, 0xbf, 0x5f, 0x52, 0x52, - 0x93, 0x88, 0xb1, 0x78, 0x07, 0xe0, 0x9e, 0xef, 0x0d, 0x9b, 0x6e, 0x74, 0xe4, 0xf7, 0x95, 0xb0, - 0x03, 0x4b, 0x1f, 0xfa, 0xde, 0xd0, 0x3e, 0x46, 0xf0, 0x5f, 0x7f, 0x76, 0x5d, 0x41, 0xa2, 0xca, - 0xff, 0xe4, 0xcb, 0xb0, 0xc8, 0x7e, 0x75, 0x13, 0x7f, 0x4b, 0x6e, 0xba, 0x42, 0x6a, 0x9e, 0x14, - 0x34, 0x41, 0x20, 0x77, 0x31, 0x0d, 0xae, 0x37, 0x8a, 0x14, 0xe1, 0x55, 0xe6, 0xbc, 0xf5, 0x46, - 0x51, 0x36, 0xe6, 0x80, 0x82, 0x4c, 0xf6, 0xe2, 0xaa, 0xcb, 0xcc, 0xd5, 0x22, 0xdb, 0xae, 0x08, - 0x5c, 0x80, 0x45, 0xb6, 0x4c, 0x73, 0xa3, 0x06, 0x2e, 0xc8, 0x90, 0x61, 0x25, 0xac, 0xbd, 0xaa, - 0xd0, 0x5d, 0xcc, 0x29, 0x95, 0x08, 0x8f, 0xfa, 0x42, 0x13, 0x91, 0xaa, 0x44, 0x8c, 0x4c, 0xb6, - 0x61, 0x8d, 0x4b, 0xfd, 0x98, 0xd7, 0x1a, 0x53, 0xae, 0xce, 0x27, 0x7b, 0x1b, 0xcf, 0x80, 0xcd, - 0xee, 0x1d, 0xea, 0xe7, 0x33, 0x04, 0x64, 0x07, 0xe6, 0x50, 0x0f, 0x25, 0x5e, 0x15, 0x5e, 0x56, - 0x35, 0xa1, 0xd9, 0x75, 0x84, 0xfb, 0x0a, 0xea, 0x40, 0xd5, 0x7d, 0x05, 0x51, 0xc9, 0x2f, 0x03, - 0xd4, 0x86, 0x81, 0x3f, 0x18, 0x60, 0x22, 0xa6, 0x72, 0x2a, 0xbe, 0x89, 0xe0, 0x83, 0x5c, 0x12, - 0x24, 0x91, 0x34, 0x00, 0x7f, 0xdb, 0x99, 0x74, 0x4d, 0x0a, 0x2f, 0xa3, 0x0e, 0xf3, 0x7c, 0x31, - 0x62, 0x52, 0x33, 0x91, 0xfa, 0x55, 0x49, 0x89, 0xc5, 0x93, 0x9a, 0x09, 0xf8, 0x64, 0x52, 0x33, - 0x85, 0xc0, 0xb8, 0x0f, 0x1b, 0x79, 0x0d, 0x4b, 0x69, 0xce, 0xb4, 0xd3, 0x6a, 0xce, 0xfe, 0xa0, - 0x08, 0xcb, 0xc8, 0x4d, 0xee, 0xc2, 0x26, 0xac, 0x58, 0xe3, 0xc7, 0x71, 0xc4, 0x6f, 0xb9, 0x1b, - 0x63, 0xfd, 0x42, 0xb5, 0x40, 0x75, 0x75, 0x48, 0x51, 0x90, 0x1a, 0xac, 0xca, 0x93, 0x60, 0x57, - 0xbe, 0xc0, 0x8b, 0xf3, 0x89, 0xc9, 0x87, 0x89, 0xc2, 0x2f, 0x5f, 0x55, 0x8b, 0xa5, 0x89, 0x92, - 0xf3, 0xa0, 0xf8, 0x3c, 0xe7, 0x41, 0xe9, 0x54, 0xe7, 0xc1, 0x07, 0xb0, 0x2c, 0xbf, 0x86, 0x3b, - 0xf9, 0xdc, 0xe7, 0xdb, 0xc9, 0x53, 0xcc, 0x48, 0x23, 0xde, 0xd1, 0xe7, 0x67, 0xee, 0xe8, 0xe8, - 0x3f, 0x22, 0x57, 0xd9, 0x08, 0x61, 0x93, 0x1b, 0xbb, 0xf1, 0x17, 0x45, 0x80, 0xdd, 0x4a, 0xe7, - 0x67, 0x38, 0x25, 0xdf, 0x82, 0xc5, 0x86, 0x2f, 0x5d, 0x07, 0x14, 0x9b, 0xed, 0x40, 0x02, 0x55, - 0x71, 0x21, 0xc6, 0x8c, 0x4f, 0xb7, 0xe2, 0x17, 0x71, 0xba, 0xdd, 0x45, 0xed, 0xe0, 0x87, 0x6e, - 0x2f, 0x4a, 0x52, 0xdb, 0xe3, 0x92, 0x91, 0x01, 0x3b, 0xd3, 0xa6, 0x63, 0x05, 0x99, 0xed, 0x4e, - 0xc2, 0x2b, 0x51, 0x46, 0xe1, 0x11, 0xfa, 0x38, 0xdc, 0x9d, 0x64, 0x28, 0x23, 0x19, 0xd8, 0x47, - 0xdd, 0x1e, 0x32, 0x64, 0x5f, 0xec, 0x80, 0x90, 0xf7, 0x63, 0x37, 0xf2, 0x85, 0x59, 0x3d, 0x64, - 0x4c, 0xf4, 0xd0, 0x54, 0xe7, 0x71, 0xe3, 0x87, 0x9a, 0x9a, 0xcc, 0xf1, 0x67, 0x18, 0xea, 0xaf, - 0x01, 0xc4, 0xbe, 0x5b, 0x72, 0xac, 0xe3, 0x00, 0x2c, 0x1c, 0xaa, 0xf6, 0x72, 0x82, 0xab, 0xb4, - 0xa6, 0xf8, 0x45, 0xb5, 0xa6, 0x0b, 0x4b, 0xed, 0x27, 0x91, 0x93, 0x38, 0xfb, 0x81, 0x15, 0x4b, - 0xb2, 0xb8, 0x33, 0x15, 0x51, 0xb9, 0x7b, 0x4e, 0x91, 0x83, 0xa7, 0x88, 0xc0, 0x0a, 0xa1, 0xf1, - 0x37, 0x1a, 0xac, 0xa9, 0x31, 0xd8, 0x4e, 0x86, 0x3d, 0xf2, 0x2e, 0xcf, 0x2d, 0xa3, 0xa5, 0xae, - 0x2c, 0x0a, 0x12, 0xdb, 0x72, 0x4f, 0x86, 0x3d, 0x2e, 0x00, 0x39, 0x4f, 0xd5, 0xca, 0x32, 0x42, - 0xf2, 0x18, 0x96, 0x3b, 0xfe, 0x60, 0xc0, 0xc4, 0x9a, 0xe0, 0x63, 0x71, 0x01, 0x60, 0x8c, 0xb2, - 0x8a, 0x49, 0x59, 0xa1, 0xed, 0x17, 0xc5, 0x3d, 0xf7, 0xc2, 0x88, 0xed, 0xf7, 0x9e, 0xa0, 0x4b, - 0xd8, 0x7e, 0x8a, 0x4f, 0xec, 0x55, 0x9e, 0xc9, 0xd9, 0x94, 0x4e, 0x4a, 0xa8, 0xd6, 0x92, 0x15, - 0x63, 0x3d, 0x67, 0x9c, 0x4d, 0xc6, 0xdf, 0xd5, 0xe0, 0x85, 0xc9, 0xa6, 0x55, 0x06, 0xfe, 0xb8, - 0xdf, 0x0d, 0x1c, 0x6f, 0xd0, 0xf0, 0x0f, 0x43, 0x9e, 0x93, 0xe3, 0x30, 0xb1, 0x73, 0x88, 0x9c, - 0x1c, 0x87, 0x5e, 0x36, 0x27, 0x07, 0xc6, 0xdc, 0x78, 0x13, 0xca, 0xd6, 0xfb, 0xd6, 0xfb, 0x63, - 0x57, 0xde, 0x85, 0xf9, 0xfe, 0x10, 0x7e, 0x14, 0xda, 0x1f, 0x31, 0xa0, 0x7a, 0x62, 0x48, 0x44, - 0xe3, 0xdf, 0x15, 0x80, 0x4c, 0xd6, 0x43, 0xdd, 0x82, 0xb5, 0xff, 0x0b, 0x22, 0x79, 0x46, 0x94, - 0x2d, 0x3d, 0x97, 0x28, 0xfb, 0x11, 0xe8, 0x3d, 0xd6, 0x8f, 0x76, 0xc4, 0x3a, 0xd2, 0x1e, 0xf8, - 0xf1, 0x89, 0xf0, 0xa5, 0xa9, 0x73, 0x2a, 0xdd, 0xf1, 0x7c, 0x4f, 0xca, 0x32, 0x51, 0x0f, 0xb7, - 0x5e, 0x0a, 0xdf, 0xf8, 0x7d, 0x0d, 0x36, 0xf2, 0xa6, 0x00, 0x3b, 0x3c, 0xd5, 0xd3, 0x34, 0x3e, - 0xcb, 0xf1, 0xf0, 0x54, 0x0f, 0xe0, 0xf4, 0x89, 0x9e, 0x21, 0xca, 0xf6, 0x47, 0xe1, 0x79, 0xfa, - 0xc3, 0xf8, 0xcb, 0x22, 0x2c, 0x73, 0xc3, 0xfe, 0x9e, 0xeb, 0x0c, 0xa2, 0x23, 0x36, 0xb8, 0x32, - 0xc9, 0xae, 0xe2, 0xfe, 0x3d, 0x23, 0xbb, 0xee, 0x1d, 0x28, 0x77, 0xd8, 0xe2, 0xe9, 0xf9, 0x03, - 0x55, 0x29, 0x38, 0x12, 0x30, 0x75, 0x62, 0x49, 0x3c, 0x36, 0x77, 0x53, 0x4a, 0x7d, 0x9e, 0xd7, - 0x11, 0x21, 0xea, 0xdc, 0x15, 0xea, 0xfd, 0x4f, 0xe0, 0x6c, 0xe2, 0xab, 0x11, 0x1b, 0x0e, 0x4e, - 0xf1, 0x7e, 0x6d, 0x4b, 0x58, 0x4d, 0xae, 0x25, 0xee, 0x1f, 0x68, 0x61, 0xc0, 0xd2, 0x4c, 0xa2, - 0x99, 0xbc, 0x4f, 0x90, 0xfb, 0xa0, 0x27, 0x60, 0x91, 0x01, 0x87, 0x4b, 0xbc, 0x18, 0x9d, 0x4e, - 0x61, 0x3b, 0x91, 0x0c, 0x67, 0x82, 0x90, 0x1d, 0x72, 0x09, 0xac, 0x96, 0x3c, 0x55, 0x95, 0x46, - 0xc4, 0x98, 0x17, 0xda, 0x2c, 0xd4, 0x43, 0x2e, 0x43, 0xc6, 0xc6, 0x48, 0x9a, 0x3a, 0x16, 0x92, - 0x31, 0x12, 0x46, 0x0e, 0x75, 0x8c, 0x04, 0xd6, 0xd6, 0xef, 0x6a, 0xb0, 0x56, 0x37, 0x9b, 0x22, - 0x49, 0x2b, 0xef, 0xd5, 0x1b, 0x70, 0xb5, 0x6e, 0x36, 0xed, 0x4e, 0xbb, 0x51, 0xaf, 0x3c, 0xb2, - 0x73, 0x73, 0xaf, 0x5d, 0x85, 0x8b, 0x93, 0x28, 0x89, 0x5b, 0xcb, 0x15, 0xd8, 0x9c, 0x2c, 0x96, - 0xf9, 0xd9, 0xf2, 0x89, 0x65, 0x2a, 0xb7, 0xe2, 0xd6, 0x7b, 0xb0, 0x26, 0x73, 0x91, 0x75, 0x1b, - 0x16, 0x66, 0x3b, 0x5d, 0x83, 0xa5, 0x07, 0x35, 0x5a, 0xdf, 0x79, 0x64, 0xef, 0xec, 0x37, 0x1a, - 0xfa, 0x19, 0xb2, 0x02, 0x8b, 0x02, 0x50, 0x31, 0x75, 0x8d, 0x2c, 0x43, 0xb9, 0xde, 0xb2, 0x6a, - 0x95, 0x7d, 0x5a, 0xd3, 0x0b, 0x5b, 0xff, 0x5c, 0x83, 0x95, 0xfd, 0x51, 0xdf, 0x89, 0xdc, 0x40, - 0xb4, 0xe8, 0x1a, 0x5c, 0xda, 0xef, 0x54, 0xcd, 0x6e, 0x8d, 0xe6, 0x37, 0xe7, 0x1c, 0xac, 0x67, - 0xca, 0xdb, 0xf7, 0x75, 0x8d, 0x5c, 0x86, 0x0b, 0x19, 0x70, 0xb5, 0x6e, 0x99, 0xdb, 0xbc, 0x15, - 0x17, 0xe1, 0x5c, 0xa6, 0xb0, 0x53, 0x6f, 0xb5, 0x6a, 0x55, 0xbd, 0xc8, 0x1a, 0x38, 0xf1, 0x39, - 0x5a, 0x33, 0xab, 0x8c, 0x54, 0x2f, 0x6d, 0xbd, 0x07, 0xab, 0x9d, 0xf8, 0xad, 0x0e, 0x7a, 0xcd, - 0x2c, 0x40, 0x91, 0x9a, 0x0f, 0xf5, 0x33, 0x04, 0x60, 0xbe, 0x73, 0xbf, 0x62, 0xdd, 0xbe, 0xad, - 0x6b, 0x64, 0x09, 0x16, 0x76, 0x2b, 0x1d, 0xfb, 0x7e, 0xd3, 0xd2, 0x0b, 0xec, 0x87, 0xf9, 0xd0, - 0xc2, 0x1f, 0xc5, 0xad, 0x37, 0xd0, 0x56, 0xfc, 0xc9, 0x49, 0xc3, 0x0b, 0x23, 0x77, 0xe8, 0x06, - 0xd8, 0x47, 0xcb, 0x50, 0xb6, 0x5c, 0x26, 0xaf, 0x44, 0x2e, 0xef, 0xa0, 0xe6, 0x78, 0x10, 0x79, - 0xa3, 0x81, 0xfb, 0x89, 0xae, 0x6d, 0xdd, 0x85, 0x35, 0xea, 0x8f, 0x23, 0x6f, 0x78, 0x68, 0x45, - 0x0c, 0xe3, 0xf0, 0x04, 0xdb, 0xdc, 0x32, 0x9b, 0xdb, 0xf5, 0xdd, 0xfd, 0xf6, 0xbe, 0x65, 0x37, - 0xcd, 0x6e, 0x65, 0x8f, 0xfb, 0xec, 0x34, 0xdb, 0x56, 0xd7, 0xa6, 0xb5, 0x4a, 0xad, 0xd5, 0xd5, - 0xb5, 0xad, 0xdf, 0x41, 0x0d, 0x6e, 0xcf, 0x1f, 0xf6, 0x77, 0x9c, 0x5e, 0xe4, 0x07, 0x58, 0x61, - 0x03, 0xae, 0x59, 0xb5, 0x4a, 0xbb, 0x55, 0xb5, 0x77, 0xcc, 0x4a, 0xb7, 0x4d, 0xf3, 0x92, 0x13, - 0x5e, 0x82, 0xf3, 0x39, 0x38, 0xed, 0x6e, 0x47, 0xd7, 0xc8, 0x75, 0xb8, 0x9c, 0x53, 0xf6, 0xb0, - 0xb6, 0x6d, 0xee, 0x77, 0xf7, 0x5a, 0x7a, 0x61, 0x0a, 0xb1, 0x65, 0xb5, 0xf5, 0xe2, 0xd6, 0xdf, - 0xd7, 0x60, 0x75, 0x3f, 0x14, 0x4f, 0x04, 0xf7, 0xd1, 0x60, 0xf7, 0x02, 0x5c, 0xd9, 0xb7, 0x6a, - 0xd4, 0xee, 0xb6, 0xef, 0xd7, 0x5a, 0xf6, 0xbe, 0x65, 0xee, 0x66, 0x6b, 0x73, 0x1d, 0x2e, 0x2b, - 0x18, 0xb4, 0x56, 0x69, 0x3f, 0xa8, 0x51, 0xbb, 0x63, 0x5a, 0xd6, 0xc3, 0x36, 0xad, 0xea, 0x1a, - 0xfb, 0x62, 0x0e, 0x42, 0x73, 0xc7, 0xe4, 0xb5, 0x49, 0x95, 0xb5, 0x6a, 0x0f, 0xcd, 0x86, 0xbd, - 0xdd, 0xee, 0xea, 0xc5, 0xad, 0x26, 0xbb, 0x45, 0x60, 0x8a, 0x30, 0xfe, 0xcc, 0xa3, 0x0c, 0xa5, - 0x56, 0xbb, 0x55, 0xcb, 0x7a, 0x7a, 0x2d, 0x43, 0xd9, 0xec, 0x74, 0x68, 0xfb, 0x01, 0x4e, 0x1e, - 0x80, 0xf9, 0x6a, 0xad, 0x55, 0xc7, 0xd9, 0xb2, 0x0c, 0xe5, 0x0e, 0x6d, 0x37, 0xdb, 0xdd, 0x5a, - 0x55, 0x2f, 0x6d, 0x51, 0x79, 0xb0, 0x4a, 0xa6, 0x3d, 0x9f, 0xbb, 0x55, 0x55, 0x6b, 0x3b, 0xe6, - 0x7e, 0xa3, 0x2b, 0x86, 0xe8, 0x91, 0x4d, 0x6b, 0xef, 0xef, 0xd7, 0xac, 0xae, 0xa5, 0x6b, 0x44, - 0x87, 0xe5, 0x56, 0xad, 0x56, 0xb5, 0x6c, 0x5a, 0x7b, 0x50, 0xaf, 0x3d, 0xd4, 0x0b, 0x8c, 0x27, - 0xff, 0x9f, 0x7d, 0x61, 0xeb, 0xfb, 0x1a, 0x10, 0x9e, 0x5e, 0x4d, 0xe6, 0xec, 0xc6, 0x19, 0x73, - 0x0d, 0x2e, 0xed, 0xb1, 0xa1, 0xc6, 0xa6, 0x35, 0xdb, 0xd5, 0x6c, 0x97, 0x9d, 0x07, 0x92, 0x29, - 0x6f, 0xef, 0xec, 0xe0, 0xb2, 0x38, 0x9b, 0x81, 0x57, 0x69, 0xbb, 0xa3, 0x17, 0x2e, 0x15, 0xca, - 0x1a, 0xb9, 0x30, 0x51, 0x78, 0xbf, 0x56, 0xeb, 0xe8, 0x45, 0x36, 0x44, 0x99, 0x02, 0xb9, 0x64, - 0x39, 0x79, 0x69, 0xeb, 0xbb, 0x1a, 0x9c, 0xe7, 0xd5, 0x94, 0xeb, 0x3f, 0xae, 0xea, 0x15, 0xd8, - 0x14, 0x49, 0x23, 0xf3, 0x2a, 0xba, 0x01, 0x7a, 0xaa, 0x94, 0x57, 0xf3, 0x1c, 0xac, 0xa7, 0xa0, - 0x58, 0x8f, 0x02, 0xdb, 0xdd, 0x52, 0xe0, 0xed, 0x9a, 0xd5, 0xb5, 0x6b, 0x3b, 0x3b, 0x6d, 0xda, - 0xe5, 0x15, 0x29, 0x6e, 0x19, 0xb0, 0x5e, 0x71, 0x83, 0xa8, 0xf6, 0x49, 0xe4, 0x0e, 0x43, 0xcf, - 0x1f, 0x62, 0x15, 0x56, 0x60, 0xb1, 0xf6, 0xcb, 0xdd, 0x5a, 0xcb, 0xaa, 0xb7, 0x5b, 0xfa, 0x99, - 0xad, 0x2b, 0x19, 0x1c, 0xb9, 0x8e, 0x2d, 0x6b, 0x4f, 0x3f, 0xb3, 0xe5, 0xc0, 0x8a, 0x7c, 0x05, - 0xc7, 0x67, 0xc5, 0x35, 0xb8, 0x24, 0xe7, 0x1a, 0xee, 0x09, 0xd9, 0x26, 0x6c, 0xc2, 0xc6, 0x64, - 0x79, 0xad, 0xab, 0x6b, 0x6c, 0x14, 0x32, 0x25, 0x0c, 0x5e, 0xd8, 0xfa, 0x4d, 0x0d, 0x56, 0x62, - 0x63, 0x2d, 0x1a, 0x83, 0xae, 0xc3, 0xe5, 0xe6, 0x8e, 0x69, 0x57, 0x6b, 0x0f, 0xea, 0x95, 0x9a, - 0x7d, 0xbf, 0xde, 0xaa, 0x66, 0x3e, 0x72, 0x11, 0xce, 0xe5, 0x20, 0xe0, 0x57, 0x36, 0x61, 0x23, - 0x5b, 0xd4, 0x65, 0x4b, 0xb5, 0xc0, 0xba, 0x3e, 0x5b, 0x12, 0xaf, 0xd3, 0xe2, 0xd6, 0x03, 0x58, - 0xb5, 0xcc, 0x66, 0x63, 0xc7, 0x0f, 0x7a, 0xae, 0x39, 0x8e, 0x8e, 0x86, 0x6c, 0xd3, 0xdc, 0x69, - 0xd3, 0x4a, 0xcd, 0x46, 0x94, 0x4c, 0x0d, 0xce, 0xc2, 0x9a, 0x5a, 0xf8, 0xa8, 0xc6, 0xa6, 0x2f, - 0x81, 0x55, 0x15, 0xd8, 0x6a, 0xeb, 0x85, 0xad, 0x5f, 0x81, 0x65, 0xe1, 0xc1, 0xc1, 0xfb, 0xef, - 0x02, 0x9c, 0x55, 0x7f, 0x77, 0xdc, 0x61, 0xdf, 0x1b, 0x1e, 0xea, 0x67, 0xb2, 0x05, 0x74, 0x3c, - 0x1c, 0xb2, 0x02, 0x5c, 0xcf, 0x6a, 0x41, 0xd7, 0x0d, 0x8e, 0xbd, 0xa1, 0x13, 0xb9, 0x7d, 0xbd, - 0xb0, 0xf5, 0x3a, 0xac, 0xa4, 0x12, 0x06, 0xb2, 0x81, 0x6b, 0xb4, 0xc5, 0x06, 0xdc, 0xac, 0x55, - 0xeb, 0xfb, 0x4d, 0x7d, 0x8e, 0xad, 0xe4, 0xbd, 0xfa, 0xee, 0x9e, 0x0e, 0x5b, 0xff, 0x58, 0x83, - 0x55, 0x91, 0x06, 0xbc, 0xb9, 0x63, 0xca, 0xa1, 0x66, 0xd3, 0x8c, 0xa7, 0x21, 0xad, 0x59, 0x16, - 0x77, 0x70, 0xbc, 0x02, 0x9b, 0xe2, 0x87, 0x6d, 0xb6, 0xaa, 0xf6, 0x9e, 0x49, 0xab, 0x0f, 0x4d, - 0xca, 0xe6, 0xde, 0x23, 0xbd, 0x80, 0x0b, 0x4a, 0x81, 0xd8, 0xdd, 0xf6, 0x7e, 0x65, 0x4f, 0x2f, - 0xb2, 0xf9, 0x9b, 0x82, 0x77, 0xea, 0x2d, 0xbd, 0x84, 0xcb, 0x73, 0x02, 0x1b, 0xd9, 0xb2, 0xf2, - 0xb9, 0xad, 0x9f, 0x68, 0x70, 0xc1, 0xf2, 0x0e, 0x87, 0x4e, 0x34, 0x0e, 0x5c, 0x73, 0x70, 0xe8, - 0x07, 0x5e, 0x74, 0x74, 0x6c, 0x8d, 0xbd, 0xc8, 0x25, 0xaf, 0xc0, 0xcb, 0x56, 0x7d, 0xb7, 0x65, - 0x76, 0xd9, 0xf2, 0x32, 0x1b, 0xbb, 0x6d, 0x5a, 0xef, 0xee, 0x35, 0x6d, 0x6b, 0xbf, 0x3e, 0x31, - 0xf3, 0x5e, 0x82, 0x17, 0xa6, 0xa3, 0x36, 0x6a, 0xbb, 0x66, 0xe5, 0x91, 0xae, 0xcd, 0x66, 0xb8, - 0x6d, 0x36, 0xcc, 0x56, 0xa5, 0x56, 0xb5, 0x1f, 0xdc, 0xd6, 0x0b, 0xe4, 0x65, 0xb8, 0x31, 0x1d, - 0x75, 0xa7, 0xde, 0xb1, 0x18, 0x5a, 0x71, 0xf6, 0x77, 0xf7, 0xac, 0x26, 0xc3, 0x2a, 0x6d, 0xfd, - 0xbe, 0x06, 0x9b, 0xd3, 0xc2, 0x7e, 0x93, 0x9b, 0x60, 0xd4, 0x5a, 0x5d, 0x6a, 0xd6, 0xab, 0x76, - 0x85, 0xd6, 0xaa, 0xb5, 0x56, 0xb7, 0x6e, 0x36, 0x2c, 0xdb, 0x6a, 0xef, 0xb3, 0xd9, 0x94, 0xf8, - 0xa1, 0xbe, 0x08, 0xd7, 0x67, 0xe0, 0xb5, 0xeb, 0xd5, 0x8a, 0xae, 0x91, 0xdb, 0xf0, 0xda, 0x0c, - 0x24, 0xeb, 0x91, 0xd5, 0xad, 0x35, 0xd5, 0x12, 0xbd, 0x80, 0x1b, 0x56, 0x7e, 0xc4, 0x63, 0xd6, - 0x3a, 0x2c, 0x99, 0x5d, 0xb1, 0x1b, 0x70, 0x75, 0x2a, 0x96, 0xa8, 0xd6, 0x8b, 0x70, 0x7d, 0x2a, - 0x0a, 0xaf, 0x94, 0x5e, 0xd8, 0xfa, 0x00, 0x2e, 0x4d, 0x8f, 0xba, 0xc9, 0xce, 0x8b, 0xf4, 0x90, - 0x97, 0xa1, 0x54, 0x65, 0x47, 0x54, 0x2a, 0x6d, 0x2e, 0x9b, 0x9d, 0xb4, 0x56, 0x6f, 0x76, 0xd8, - 0x46, 0x28, 0x0e, 0x17, 0x3c, 0x3d, 0xbe, 0xa3, 0x81, 0x9e, 0x0d, 0x55, 0x37, 0xe1, 0xd2, 0x4c, - 0xf7, 0x5b, 0x2d, 0x7e, 0xd0, 0xad, 0xc1, 0x52, 0xbb, 0xbb, 0x57, 0xa3, 0x22, 0x23, 0x31, 0xa6, - 0x20, 0xde, 0x6f, 0xb1, 0xa5, 0xdd, 0xa6, 0xf5, 0x6f, 0xe1, 0x89, 0xb7, 0x09, 0x1b, 0x56, 0xc3, - 0xac, 0xdc, 0xb7, 0x5b, 0xed, 0xae, 0x5d, 0x6f, 0xd9, 0x95, 0x3d, 0xb3, 0xd5, 0xaa, 0x35, 0x74, - 0x60, 0x7b, 0x76, 0xfb, 0x7e, 0xd7, 0xb4, 0x2b, 0xed, 0xd6, 0x4e, 0x7d, 0x57, 0xb0, 0xd8, 0xc0, - 0x59, 0x30, 0x2d, 0x54, 0x06, 0xf9, 0x32, 0xdc, 0x42, 0x9a, 0x4e, 0x63, 0x7f, 0xb7, 0xde, 0xb2, - 0xad, 0x47, 0xad, 0x8a, 0x14, 0xbb, 0x2a, 0x93, 0x67, 0xc5, 0x2d, 0x78, 0x69, 0x26, 0x76, 0x92, - 0x52, 0xf8, 0x26, 0x18, 0x33, 0x31, 0x45, 0xfb, 0xb6, 0x7e, 0xa4, 0xc1, 0xe5, 0x19, 0x4e, 0x37, - 0xe4, 0x35, 0x78, 0x65, 0xaf, 0x66, 0x56, 0x1b, 0x35, 0xcb, 0xc2, 0x1d, 0x8e, 0x0d, 0x22, 0xf7, - 0x88, 0xce, 0x3d, 0x09, 0x5e, 0x81, 0x97, 0x67, 0xa3, 0x27, 0x32, 0xc5, 0x2d, 0x78, 0x69, 0x36, - 0xaa, 0x90, 0x31, 0x0a, 0x64, 0x0b, 0x6e, 0xce, 0xc6, 0x8c, 0x65, 0x93, 0xe2, 0xd6, 0x6f, 0x6b, - 0x70, 0x3e, 0x5f, 0xcf, 0xcd, 0xea, 0x56, 0x6f, 0x59, 0x5d, 0xb3, 0xd1, 0xb0, 0x3b, 0x26, 0x35, - 0x9b, 0x76, 0xad, 0x45, 0xdb, 0x8d, 0x46, 0xde, 0x99, 0xfc, 0x12, 0xbc, 0x30, 0x1d, 0xd5, 0xaa, - 0xd0, 0x7a, 0x87, 0x1d, 0x3b, 0x06, 0x5c, 0x9b, 0x8e, 0x55, 0xab, 0x57, 0x6a, 0x7a, 0x61, 0xfb, - 0x9d, 0x3f, 0xfd, 0x8b, 0x6b, 0x67, 0xfe, 0xf4, 0x27, 0xd7, 0xb4, 0xff, 0xf0, 0x93, 0x6b, 0xda, - 0x9f, 0xff, 0xe4, 0x9a, 0xf6, 0xad, 0x57, 0x4f, 0x97, 0x8d, 0x1f, 0x6f, 0xed, 0x8f, 0xe7, 0xf1, - 0xfa, 0xf7, 0xe6, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xb5, 0x71, 0xc3, 0x2a, 0xe6, 0x01, - 0x00, + // 33338 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6d, 0x70, 0x1c, 0x49, + 0x76, 0x18, 0xb8, 0xdd, 0x8d, 0x8f, 0xc6, 0x43, 0x03, 0x68, 0x24, 0x40, 0x12, 0xc4, 0x0c, 0xa7, + 0x39, 0x35, 0x33, 0x1c, 0x72, 0x3e, 0xc8, 0x25, 0xb8, 0xc3, 0xdd, 0xd9, 0xf9, 0xda, 0x06, 0x1a, + 0x24, 0x40, 0x82, 0x64, 0x4f, 0x35, 0x40, 0xee, 0x6a, 0x77, 0xb6, 0xb6, 0xd0, 0x9d, 0x00, 0x6a, + 0xd0, 0x5d, 0xd5, 0x5b, 0x55, 0x4d, 0x12, 0x5a, 0xeb, 0x2c, 0x59, 0xda, 0x93, 0x15, 0x3a, 0x49, + 0x96, 0x2c, 0x59, 0xeb, 0x0b, 0x5b, 0xe1, 0x90, 0xed, 0x0b, 0x9f, 0x1d, 0xd2, 0xd9, 0x92, 0x7d, + 0xe7, 0x0b, 0x85, 0xe4, 0xd5, 0x9d, 0x2d, 0xeb, 0x1c, 0x17, 0x27, 0x85, 0xed, 0xfb, 0xda, 0x50, + 0x40, 0xe1, 0xd3, 0xc5, 0xfd, 0x40, 0xc4, 0xc5, 0x49, 0x77, 0x11, 0x17, 0x71, 0xab, 0xd0, 0xdd, + 0x45, 0xbe, 0xcc, 0xac, 0xca, 0xac, 0xaa, 0x6e, 0x34, 0x66, 0x38, 0xb2, 0xb8, 0xa1, 0x3f, 0x24, + 0x3a, 0xf3, 0xbd, 0x97, 0x95, 0x5f, 0x2f, 0x5f, 0xbe, 0x7c, 0x1f, 0xf0, 0x7c, 0x48, 0xdb, 0xb4, + 0xeb, 0xf9, 0xe1, 0x95, 0x36, 0xdd, 0xb5, 0x9b, 0x07, 0x57, 0xc2, 0x83, 0x2e, 0x0d, 0xf8, 0xbf, + 0x97, 0xbb, 0xbe, 0x17, 0x7a, 0x64, 0x14, 0x7f, 0x2c, 0xce, 0xef, 0x7a, 0xbb, 0x1e, 0x96, 0x5c, + 0x61, 0x7f, 0xf1, 0xca, 0xc5, 0xe7, 0x76, 0x3d, 0x6f, 0xb7, 0x4d, 0xaf, 0xe0, 0xaf, 0xed, 0xde, + 0xce, 0x95, 0x56, 0xcf, 0xb7, 0x43, 0xc7, 0x73, 0x45, 0x7d, 0x25, 0x59, 0x1f, 0x3a, 0x1d, 0x1a, + 0x84, 0x76, 0xa7, 0xdb, 0x8f, 0xc0, 0x23, 0xdf, 0xee, 0x76, 0xa9, 0x2f, 0x5a, 0x5f, 0xbc, 0x14, + 0x7d, 0xa0, 0x1d, 0x86, 0x0c, 0x93, 0x11, 0xbf, 0xf2, 0xf0, 0xaa, 0xfa, 0x53, 0x80, 0x5e, 0xef, + 0xd3, 0x17, 0xbf, 0x17, 0x84, 0xb4, 0x65, 0xb5, 0xe8, 0x43, 0xa7, 0x49, 0x2d, 0x9f, 0x7e, 0xbd, + 0xe7, 0xf8, 0xb4, 0x43, 0xdd, 0x50, 0xe0, 0xbd, 0x9e, 0x8d, 0x27, 0x3f, 0x24, 0xf1, 0x45, 0xc6, + 0x2f, 0x14, 0x60, 0xe2, 0x36, 0xa5, 0xdd, 0x6a, 0xdb, 0x79, 0x48, 0xc9, 0x0b, 0x30, 0x72, 0xd7, + 0xee, 0xd0, 0x85, 0xdc, 0xf9, 0xdc, 0xc5, 0x89, 0xe5, 0x99, 0xa3, 0xc3, 0xca, 0x64, 0x40, 0xfd, + 0x87, 0xd4, 0xb7, 0x5c, 0xbb, 0x43, 0x4d, 0xac, 0x24, 0xaf, 0xc2, 0x04, 0xfb, 0x3f, 0xe8, 0xda, + 0x4d, 0xba, 0x90, 0x47, 0xc8, 0xa9, 0xa3, 0xc3, 0xca, 0x84, 0x2b, 0x0b, 0xcd, 0xb8, 0x9e, 0xac, + 0xc3, 0xf8, 0xea, 0xe3, 0xae, 0xe3, 0xd3, 0x60, 0x61, 0xe4, 0x7c, 0xee, 0xe2, 0xe4, 0xd2, 0xe2, + 0x65, 0x3e, 0x46, 0x97, 0xe5, 0x18, 0x5d, 0xde, 0x94, 0x83, 0xb8, 0x3c, 0xf7, 0xdb, 0x87, 0x95, + 0x4f, 0x1d, 0x1d, 0x56, 0xc6, 0x29, 0x47, 0xf9, 0x2b, 0xbf, 0x5f, 0xc9, 0x99, 0x12, 0x9f, 0xbc, + 0x0d, 0x23, 0x9b, 0x07, 0x5d, 0xba, 0x30, 0x71, 0x3e, 0x77, 0x71, 0x7a, 0xe9, 0xb9, 0xcb, 0x7c, + 0x5a, 0xa3, 0x8f, 0x8f, 0xff, 0x62, 0x50, 0xcb, 0xc5, 0xa3, 0xc3, 0xca, 0x08, 0x03, 0x31, 0x11, + 0x8b, 0xbc, 0x0e, 0x63, 0x6b, 0x5e, 0x10, 0xae, 0xd7, 0x16, 0x00, 0x3f, 0xf9, 0xd4, 0xd1, 0x61, + 0x65, 0x76, 0xcf, 0x0b, 0x42, 0xcb, 0x69, 0xbd, 0xe6, 0x75, 0x9c, 0x90, 0x76, 0xba, 0xe1, 0x81, + 0x29, 0x80, 0x8c, 0xc7, 0x30, 0xa5, 0xd1, 0x23, 0x93, 0x30, 0xbe, 0x75, 0xf7, 0xf6, 0xdd, 0x7b, + 0x0f, 0xee, 0x96, 0x3f, 0x45, 0x8a, 0x30, 0x72, 0xf7, 0x5e, 0x6d, 0xb5, 0x9c, 0x23, 0xe3, 0x50, + 0xa8, 0xd6, 0xeb, 0xe5, 0x3c, 0x29, 0x41, 0xb1, 0x56, 0xdd, 0xac, 0x2e, 0x57, 0x1b, 0xab, 0xe5, + 0x02, 0x99, 0x83, 0x99, 0x07, 0xeb, 0x77, 0x6b, 0xf7, 0x1e, 0x34, 0xac, 0xda, 0x6a, 0xe3, 0xf6, + 0xe6, 0xbd, 0x7a, 0x79, 0x84, 0x4c, 0x03, 0xdc, 0xde, 0x5a, 0x5e, 0x35, 0xef, 0xae, 0x6e, 0xae, + 0x36, 0xca, 0xa3, 0x64, 0x1e, 0xca, 0x12, 0xc5, 0x6a, 0xac, 0x9a, 0xf7, 0xd7, 0x57, 0x56, 0xcb, + 0x63, 0xb7, 0x46, 0x8a, 0x85, 0xf2, 0x88, 0x39, 0xbe, 0x41, 0xed, 0x80, 0xae, 0xd7, 0x8c, 0xbf, + 0x5d, 0x80, 0xe2, 0x1d, 0x1a, 0xda, 0x2d, 0x3b, 0xb4, 0xc9, 0xb3, 0xda, 0xfc, 0x60, 0x17, 0x95, + 0x89, 0x79, 0x21, 0x3d, 0x31, 0xa3, 0x47, 0x87, 0x95, 0xdc, 0xeb, 0xea, 0x84, 0xbc, 0x05, 0x93, + 0x35, 0x1a, 0x34, 0x7d, 0xa7, 0xcb, 0x16, 0xdb, 0x42, 0x01, 0xc1, 0xce, 0x1e, 0x1d, 0x56, 0x4e, + 0xb5, 0xe2, 0x62, 0x65, 0x40, 0x54, 0x68, 0xb2, 0x0e, 0x63, 0x1b, 0xf6, 0x36, 0x6d, 0x07, 0x0b, + 0xa3, 0xe7, 0x0b, 0x17, 0x27, 0x97, 0x9e, 0x11, 0x93, 0x20, 0x3f, 0xf0, 0x32, 0xaf, 0x5d, 0x75, + 0x43, 0xff, 0x60, 0x79, 0xfe, 0xe8, 0xb0, 0x52, 0x6e, 0x63, 0x81, 0x3a, 0xc0, 0x1c, 0x84, 0x34, + 0xe2, 0x85, 0x31, 0x76, 0xec, 0xc2, 0x38, 0xf7, 0xdb, 0x87, 0x95, 0x1c, 0x9b, 0x30, 0xb1, 0x30, + 0x62, 0x7a, 0xfa, 0x12, 0x59, 0x82, 0xa2, 0x49, 0x1f, 0x3a, 0x01, 0xeb, 0x59, 0x11, 0x7b, 0x76, + 0xfa, 0xe8, 0xb0, 0x42, 0x7c, 0x51, 0xa6, 0x7c, 0x46, 0x04, 0xb7, 0xf8, 0x26, 0x4c, 0x2a, 0x5f, + 0x4d, 0xca, 0x50, 0xd8, 0xa7, 0x07, 0x7c, 0x84, 0x4d, 0xf6, 0x27, 0x99, 0x87, 0xd1, 0x87, 0x76, + 0xbb, 0x27, 0x86, 0xd4, 0xe4, 0x3f, 0x3e, 0x9f, 0xff, 0x5c, 0xee, 0xd6, 0x48, 0x71, 0xbc, 0x5c, + 0x34, 0xf3, 0xeb, 0x35, 0xe3, 0x67, 0x46, 0xa0, 0x68, 0x7a, 0x7c, 0x03, 0x93, 0x4b, 0x30, 0xda, + 0x08, 0xed, 0x50, 0x4e, 0xd3, 0xdc, 0xd1, 0x61, 0x65, 0x86, 0x6d, 0x6e, 0xaa, 0xb4, 0xcf, 0x21, + 0x18, 0x68, 0x7d, 0xcf, 0x0e, 0xe4, 0x74, 0x21, 0x68, 0x97, 0x15, 0xa8, 0xa0, 0x08, 0x41, 0x2e, + 0xc0, 0xc8, 0x1d, 0xaf, 0x45, 0xc5, 0x8c, 0x91, 0xa3, 0xc3, 0xca, 0x74, 0xc7, 0x6b, 0xa9, 0x80, + 0x58, 0x4f, 0x5e, 0x83, 0x89, 0x95, 0x9e, 0xef, 0x53, 0x97, 0xad, 0xf5, 0x11, 0x04, 0x9e, 0x3e, + 0x3a, 0xac, 0x40, 0x93, 0x17, 0x5a, 0x4e, 0xcb, 0x8c, 0x01, 0xd8, 0x34, 0x34, 0x42, 0xdb, 0x0f, + 0x69, 0x6b, 0x61, 0x74, 0xa8, 0x69, 0x60, 0xfb, 0x73, 0x36, 0xe0, 0x28, 0xc9, 0x69, 0x10, 0x94, + 0xc8, 0x1a, 0x4c, 0xde, 0xf4, 0xed, 0x26, 0xad, 0x53, 0xdf, 0xf1, 0x5a, 0x38, 0xbf, 0x85, 0xe5, + 0x0b, 0x47, 0x87, 0x95, 0xd3, 0xbb, 0xac, 0xd8, 0xea, 0x62, 0x79, 0x8c, 0xfd, 0xdd, 0xc3, 0x4a, + 0xb1, 0x26, 0x58, 0xad, 0xa9, 0xa2, 0x92, 0xaf, 0xb1, 0xc9, 0x09, 0x42, 0x1c, 0x5a, 0xda, 0x5a, + 0x18, 0x3f, 0xf6, 0x13, 0x0d, 0xf1, 0x89, 0xa7, 0xdb, 0x76, 0x10, 0x5a, 0x3e, 0xc7, 0x4b, 0x7c, + 0xa7, 0x4a, 0x92, 0xdc, 0x83, 0x62, 0xa3, 0xb9, 0x47, 0x5b, 0xbd, 0x36, 0xc5, 0x25, 0x33, 0xb9, + 0x74, 0x46, 0x2c, 0x6a, 0x39, 0x9f, 0xb2, 0x7a, 0x79, 0x51, 0xd0, 0x26, 0x81, 0x28, 0x51, 0xd7, + 0x93, 0x84, 0xfa, 0x7c, 0xf1, 0x5b, 0x7f, 0xab, 0xf2, 0xa9, 0x1f, 0xfc, 0xbd, 0xf3, 0x9f, 0x32, + 0xfe, 0x8b, 0x3c, 0x94, 0x93, 0x44, 0xc8, 0x0e, 0x4c, 0x6d, 0x75, 0x5b, 0x76, 0x48, 0x57, 0xda, + 0x0e, 0x75, 0xc3, 0x00, 0x17, 0xc9, 0xe0, 0x3e, 0xbd, 0x28, 0xda, 0x5d, 0xe8, 0x21, 0xa2, 0xd5, + 0xe4, 0x98, 0x89, 0x5e, 0xe9, 0x64, 0xe3, 0x76, 0x1a, 0xc8, 0xc0, 0x03, 0x5c, 0x61, 0x27, 0x6b, + 0x87, 0xb3, 0xfe, 0x3e, 0xed, 0x08, 0xb2, 0x62, 0x01, 0xb9, 0xad, 0xed, 0x03, 0x5c, 0x99, 0xc3, + 0x2f, 0x20, 0x86, 0x92, 0xb1, 0x80, 0x58, 0xb1, 0xf1, 0xbf, 0xe6, 0x60, 0xda, 0xa4, 0x81, 0xd7, + 0xf3, 0x9b, 0x74, 0x8d, 0xda, 0x2d, 0xea, 0xb3, 0xe5, 0x7f, 0xdb, 0x71, 0x5b, 0x62, 0x4f, 0xe1, + 0xf2, 0xdf, 0x77, 0x5c, 0x95, 0x75, 0x63, 0x3d, 0xf9, 0x34, 0x8c, 0x37, 0x7a, 0xdb, 0x08, 0x9a, + 0x8f, 0x39, 0x40, 0xd0, 0xdb, 0xb6, 0x12, 0xe0, 0x12, 0x8c, 0x5c, 0x81, 0xf1, 0xfb, 0xd4, 0x0f, + 0x62, 0x6e, 0x88, 0x47, 0xc3, 0x43, 0x5e, 0xa4, 0x22, 0x08, 0x28, 0x72, 0x33, 0xe6, 0xc8, 0xe2, + 0x50, 0x9b, 0x49, 0xf0, 0xc1, 0x78, 0xa9, 0x74, 0x44, 0x89, 0xba, 0x54, 0x24, 0x94, 0xf1, 0x3f, + 0xe5, 0xa1, 0x5c, 0xb3, 0x43, 0x7b, 0xdb, 0x0e, 0xc4, 0x78, 0xde, 0xbf, 0xc6, 0x78, 0xbc, 0xd2, + 0x51, 0xe4, 0xf1, 0xec, 0xcb, 0x3f, 0x72, 0xf7, 0x5e, 0x4a, 0x76, 0x6f, 0x92, 0x9d, 0xb0, 0xa2, + 0x7b, 0x71, 0xa7, 0xde, 0x39, 0xbe, 0x53, 0x65, 0xd1, 0xa9, 0xa2, 0xec, 0x54, 0xdc, 0x15, 0xf2, + 0x0e, 0x8c, 0x34, 0xba, 0xb4, 0x29, 0x98, 0x88, 0x3c, 0x17, 0xf4, 0xce, 0x31, 0x80, 0xfb, 0xd7, + 0x96, 0x4b, 0x82, 0xcc, 0x48, 0xd0, 0xa5, 0x4d, 0x13, 0xd1, 0xc8, 0x2a, 0x8c, 0x31, 0x86, 0xd8, + 0x93, 0x87, 0xc1, 0xb9, 0x6c, 0x02, 0x08, 0x72, 0xff, 0xda, 0xf2, 0xb4, 0x20, 0x31, 0x16, 0x60, + 0x89, 0x29, 0x90, 0x95, 0xbd, 0xf7, 0x4f, 0x0b, 0x30, 0x9f, 0xd5, 0xba, 0x3a, 0x1c, 0x63, 0x03, + 0x86, 0xe3, 0x22, 0x14, 0x99, 0x24, 0xc0, 0x4e, 0x57, 0xe4, 0x3a, 0x13, 0xcb, 0x25, 0xd6, 0xf3, + 0x3d, 0x51, 0x66, 0x46, 0xb5, 0xe4, 0x85, 0x48, 0xb0, 0x28, 0xc6, 0xf4, 0x84, 0x60, 0x21, 0xc5, + 0x09, 0xb6, 0x64, 0x24, 0x27, 0x40, 0xf9, 0x23, 0x1e, 0x5d, 0x59, 0x1c, 0x2f, 0x19, 0x5f, 0x94, + 0x68, 0xa7, 0x95, 0x3c, 0x5b, 0x56, 0xa1, 0x28, 0xbb, 0xb5, 0x50, 0x42, 0x42, 0xb3, 0x89, 0xa1, + 0xba, 0x7f, 0x8d, 0xaf, 0x89, 0x96, 0xf8, 0xad, 0x92, 0x91, 0x30, 0xe4, 0x1a, 0x14, 0xeb, 0xbe, + 0xf7, 0xf8, 0x60, 0xbd, 0x16, 0x2c, 0x4c, 0x9d, 0x2f, 0x5c, 0x9c, 0x58, 0x3e, 0x73, 0x74, 0x58, + 0x99, 0xeb, 0xb2, 0x32, 0xcb, 0x69, 0xa9, 0x07, 0x76, 0x04, 0x78, 0x6b, 0xa4, 0x98, 0x2b, 0xe7, + 0x6f, 0x8d, 0x14, 0xf3, 0xe5, 0x02, 0x97, 0x52, 0x6e, 0x8d, 0x14, 0x47, 0xca, 0xa3, 0xb7, 0x46, + 0x8a, 0xa3, 0x28, 0xb7, 0x4c, 0x94, 0xe1, 0xd6, 0x48, 0x71, 0xb2, 0x5c, 0xd2, 0x84, 0x06, 0x24, + 0x10, 0x7a, 0x4d, 0xaf, 0x6d, 0x16, 0xb6, 0xcc, 0x75, 0x73, 0x6c, 0xa5, 0xba, 0x42, 0xfd, 0xd0, + 0x2c, 0x54, 0x1f, 0x34, 0xcc, 0xa9, 0xda, 0x81, 0x6b, 0x77, 0x9c, 0x26, 0x3f, 0x81, 0xcd, 0xc2, + 0xcd, 0x95, 0xba, 0xe1, 0xc2, 0xe9, 0xec, 0x69, 0x27, 0x9b, 0x50, 0xda, 0xb4, 0xfd, 0x5d, 0x1a, + 0xae, 0x51, 0xbb, 0x1d, 0xee, 0x2d, 0x4c, 0xe3, 0x00, 0xcc, 0x89, 0x01, 0x50, 0xab, 0x96, 0x9f, + 0x39, 0x3a, 0xac, 0x9c, 0x09, 0xb1, 0xc4, 0xda, 0xc3, 0x22, 0xa5, 0x4b, 0x1a, 0x15, 0xa3, 0x0a, + 0xd3, 0xf1, 0xd8, 0x6d, 0x38, 0x41, 0x48, 0xae, 0xc0, 0x84, 0x2c, 0x61, 0xfc, 0xb9, 0x90, 0x39, + 0xca, 0x66, 0x0c, 0x63, 0xfc, 0x56, 0x1e, 0x20, 0xae, 0x79, 0x4a, 0xb7, 0xf0, 0x67, 0xb5, 0x2d, + 0x7c, 0x2a, 0xb9, 0x03, 0xfb, 0x6f, 0xde, 0xf7, 0x12, 0x9b, 0xf7, 0x4c, 0x12, 0x75, 0xf8, 0x6d, + 0xfb, 0x0b, 0xe3, 0xf1, 0x64, 0x88, 0x0d, 0x7b, 0x11, 0xa2, 0x05, 0x24, 0x06, 0x14, 0x77, 0x62, + 0x57, 0x2e, 0xaa, 0xa8, 0x96, 0x9c, 0x05, 0xb6, 0xc0, 0xc4, 0xa0, 0x8e, 0x1f, 0x1d, 0x56, 0x0a, + 0x3d, 0xdf, 0xc1, 0x45, 0x47, 0xae, 0x80, 0x58, 0x76, 0x62, 0x00, 0xd9, 0x6a, 0x9f, 0x6d, 0xda, + 0x56, 0x93, 0xfa, 0x61, 0x3c, 0xe2, 0x0b, 0x39, 0xb9, 0x3a, 0x49, 0x17, 0xf4, 0xa5, 0xb9, 0x30, + 0x82, 0xcb, 0xe0, 0x62, 0xe6, 0xa8, 0x5c, 0xd6, 0x40, 0xb9, 0xf4, 0x7b, 0x5e, 0x1e, 0xa6, 0x2d, + 0x5e, 0x67, 0xa5, 0x24, 0x61, 0xbd, 0x01, 0x72, 0x0d, 0xd8, 0x8e, 0x10, 0xa3, 0x0f, 0xa2, 0x9d, + 0xea, 0x83, 0xc6, 0xf2, 0x29, 0x41, 0x69, 0xca, 0x7e, 0xa4, 0xa2, 0x33, 0x68, 0xf2, 0x16, 0xb0, + 0x2d, 0x23, 0xc6, 0x9d, 0x08, 0xa4, 0x9b, 0x2b, 0xf5, 0x95, 0xb6, 0xd7, 0x6b, 0x35, 0xde, 0xdf, + 0x88, 0x91, 0x77, 0x9b, 0x5d, 0x15, 0xf9, 0xe6, 0x4a, 0x9d, 0xbc, 0x05, 0xa3, 0xd5, 0xef, 0xef, + 0xf9, 0x54, 0x88, 0x55, 0x25, 0xd9, 0x26, 0x2b, 0x5b, 0x3e, 0x23, 0x10, 0x67, 0x6c, 0xf6, 0x53, + 0x15, 0x47, 0xb1, 0x9e, 0xb5, 0xbc, 0xb9, 0xd1, 0x10, 0x22, 0x13, 0x49, 0x0c, 0xcb, 0xe6, 0x86, + 0xf2, 0xd9, 0xa1, 0xd6, 0x6b, 0x86, 0x45, 0xae, 0x40, 0xbe, 0x5a, 0xc3, 0x8b, 0xdc, 0xe4, 0xd2, + 0x84, 0x6c, 0xb6, 0xb6, 0x3c, 0x2f, 0x50, 0x4a, 0xb6, 0xba, 0x0d, 0xf2, 0xd5, 0x1a, 0x59, 0x86, + 0xd1, 0x3b, 0x07, 0x8d, 0xf7, 0x37, 0x04, 0xf3, 0x94, 0x5b, 0x1e, 0xcb, 0xee, 0x21, 0x9b, 0x09, + 0xe2, 0x2f, 0xee, 0x1c, 0x04, 0x5f, 0x6f, 0xab, 0x5f, 0x8c, 0x60, 0xa4, 0x0e, 0x13, 0xd5, 0x56, + 0xc7, 0x71, 0xb7, 0x02, 0xea, 0x2f, 0x4c, 0x22, 0x9d, 0x85, 0xc4, 0x77, 0x47, 0xf5, 0xcb, 0x0b, + 0x47, 0x87, 0x95, 0x79, 0x9b, 0xfd, 0xb4, 0x7a, 0x01, 0xf5, 0x15, 0x6a, 0x31, 0x11, 0x52, 0x07, + 0xb8, 0xe3, 0xb9, 0xbb, 0x5e, 0x35, 0x6c, 0xdb, 0x41, 0x82, 0x1d, 0xc7, 0x15, 0x91, 0xd4, 0x73, + 0xaa, 0xc3, 0xca, 0x2c, 0x9b, 0x15, 0x2a, 0x04, 0x15, 0x1a, 0xe4, 0x06, 0x8c, 0xdd, 0xf3, 0xed, + 0x66, 0x9b, 0x2e, 0x4c, 0x21, 0xb5, 0x79, 0x41, 0x8d, 0x17, 0xca, 0x9e, 0x2e, 0x08, 0x82, 0x65, + 0x0f, 0x8b, 0xd5, 0xdb, 0x15, 0x07, 0x5c, 0x7c, 0x00, 0x24, 0xbd, 0x26, 0x33, 0xee, 0x36, 0xaf, + 0xaa, 0x77, 0x9b, 0x78, 0xd3, 0xaf, 0x78, 0x9d, 0x8e, 0xed, 0xb6, 0x10, 0xf7, 0xfe, 0x92, 0x72, + 0xe5, 0x31, 0xbe, 0x0e, 0xb3, 0xa9, 0xc1, 0x3a, 0xe6, 0x5a, 0xfa, 0x2e, 0xcc, 0xd4, 0xe8, 0x8e, + 0xdd, 0x6b, 0x87, 0xd1, 0xc9, 0xc5, 0xb7, 0x28, 0x5e, 0x10, 0x5b, 0xbc, 0xca, 0x92, 0xc7, 0x95, + 0x99, 0x04, 0x36, 0xde, 0x81, 0x29, 0xad, 0xfb, 0xec, 0x86, 0x53, 0xed, 0xb5, 0x9c, 0x10, 0x27, + 0x32, 0x17, 0xdf, 0x70, 0x6c, 0x56, 0x88, 0xd3, 0x65, 0xc6, 0x00, 0xc6, 0xdf, 0x51, 0x85, 0x2c, + 0x79, 0x92, 0xbc, 0x1e, 0xf1, 0x83, 0x5c, 0x2c, 0xf2, 0xa5, 0xf8, 0x41, 0xc4, 0x0d, 0x2e, 0xf1, + 0xbd, 0x99, 0x4f, 0xed, 0xcd, 0x49, 0x31, 0x13, 0x05, 0xfb, 0x51, 0xc0, 0x77, 0x64, 0xb4, 0x52, + 0x0b, 0x1f, 0x7d, 0xa5, 0xbe, 0x07, 0xa5, 0x3b, 0xb6, 0x6b, 0xef, 0xd2, 0x16, 0xeb, 0x01, 0xe7, + 0x3d, 0x13, 0xfc, 0x48, 0xeb, 0xf0, 0x72, 0xec, 0xa5, 0xba, 0x88, 0x34, 0x04, 0x72, 0x55, 0xee, + 0xec, 0xd1, 0x8c, 0x9d, 0x3d, 0x25, 0x5a, 0x1f, 0xc5, 0x9d, 0x2d, 0xf6, 0xb3, 0xf1, 0xed, 0x09, + 0xec, 0x23, 0x79, 0x0d, 0xc6, 0x4c, 0xba, 0xcb, 0x8e, 0x9a, 0x5c, 0x3c, 0x49, 0x3e, 0x96, 0xa8, + 0x03, 0xc3, 0x61, 0x50, 0xae, 0xa1, 0xad, 0x60, 0xcf, 0xd9, 0x09, 0xc5, 0xe8, 0x44, 0x72, 0x8d, + 0x28, 0x56, 0xe4, 0x1a, 0x51, 0xa2, 0xdf, 0xc2, 0x79, 0x19, 0xe3, 0x7e, 0x66, 0xad, 0x21, 0x06, + 0x4d, 0x8e, 0xb0, 0x59, 0x53, 0xd8, 0x88, 0xaf, 0x49, 0x25, 0x0c, 0x9a, 0x5c, 0x87, 0x89, 0x6a, + 0xb3, 0xe9, 0xf5, 0x94, 0xab, 0x2e, 0xdf, 0xb7, 0xbc, 0x50, 0xd7, 0xec, 0xc4, 0xa0, 0xa4, 0x01, + 0x93, 0xab, 0xec, 0x7e, 0xe8, 0xac, 0xd8, 0xcd, 0x3d, 0x39, 0x48, 0x92, 0x87, 0x29, 0x35, 0xf1, + 0xce, 0xa5, 0x58, 0xd8, 0x64, 0x85, 0xaa, 0x6e, 0x44, 0x81, 0x25, 0x9b, 0x30, 0xd9, 0xa0, 0x4d, + 0x9f, 0x86, 0x8d, 0xd0, 0xf3, 0x69, 0x82, 0x25, 0x2b, 0x35, 0xcb, 0xcf, 0xc9, 0x2b, 0x6a, 0x80, + 0x85, 0x56, 0xc0, 0x4a, 0x55, 0xaa, 0x0a, 0x30, 0xbf, 0x6b, 0x74, 0x3c, 0xff, 0xa0, 0xb6, 0x2c, + 0xd8, 0x74, 0x7c, 0xa6, 0xf3, 0x62, 0xf5, 0xae, 0xc1, 0x4a, 0x5a, 0xdb, 0xfa, 0x5d, 0x83, 0x43, + 0xe1, 0x4c, 0xd5, 0x1a, 0x28, 0xcb, 0x09, 0xa6, 0x3d, 0x13, 0x8f, 0x32, 0x16, 0x2b, 0x33, 0xd5, + 0x0a, 0x50, 0x12, 0xd4, 0x66, 0x4a, 0x40, 0x91, 0x2e, 0x10, 0x39, 0x6b, 0x5c, 0x3c, 0x6b, 0xd3, + 0x20, 0x10, 0xbc, 0xfc, 0x6c, 0x62, 0xf2, 0x63, 0x80, 0xe5, 0x97, 0x04, 0xf1, 0x73, 0x72, 0x19, + 0x88, 0xeb, 0x25, 0xab, 0x54, 0xda, 0xc9, 0xa0, 0x4d, 0xde, 0x04, 0x58, 0x7d, 0x1c, 0x52, 0xdf, + 0xb5, 0xdb, 0x91, 0xfa, 0x0e, 0x35, 0x56, 0x54, 0x94, 0xea, 0x13, 0xad, 0x00, 0x93, 0x15, 0x98, + 0xaa, 0x06, 0x41, 0xaf, 0x43, 0x4d, 0xaf, 0x4d, 0xab, 0xe6, 0x5d, 0xe4, 0xfb, 0x13, 0xcb, 0xe7, + 0x8e, 0x0e, 0x2b, 0x67, 0x6d, 0xac, 0xb0, 0x7c, 0xaf, 0x4d, 0x2d, 0xdb, 0x57, 0x57, 0xb7, 0x8e, + 0x43, 0xee, 0x01, 0xdc, 0xeb, 0x52, 0xb7, 0x41, 0x6d, 0xbf, 0xb9, 0x97, 0x60, 0xf3, 0x71, 0xc5, + 0xf2, 0xb3, 0xa2, 0x87, 0xf3, 0x5e, 0x97, 0xba, 0x01, 0x96, 0xa9, 0x5f, 0x15, 0x43, 0x92, 0x07, + 0x30, 0xb3, 0x5e, 0xbd, 0x53, 0xf7, 0xda, 0x4e, 0xf3, 0x40, 0x48, 0x4e, 0xd3, 0xa8, 0xd4, 0x3c, + 0x2d, 0xa8, 0x26, 0x6a, 0x39, 0x7b, 0x72, 0xec, 0x8e, 0xd5, 0xc5, 0x52, 0x4b, 0xc8, 0x4f, 0x49, + 0x2a, 0xe4, 0x4b, 0x6c, 0x0d, 0x06, 0x4c, 0x18, 0xdc, 0xb4, 0x77, 0x83, 0x85, 0x19, 0x4d, 0x49, + 0x57, 0x7d, 0xd0, 0xb8, 0xac, 0xd4, 0x72, 0x31, 0x65, 0x91, 0x2f, 0x44, 0x2c, 0xb5, 0x42, 0x7b, + 0x37, 0xd0, 0x17, 0x62, 0x04, 0x4d, 0x6e, 0x01, 0xd4, 0xbc, 0x66, 0xaf, 0x43, 0xdd, 0xb0, 0xb6, + 0xbc, 0x50, 0xd6, 0xaf, 0x1e, 0x51, 0x45, 0xcc, 0xda, 0x5a, 0x5e, 0x53, 0x5b, 0x89, 0x0a, 0xf6, + 0xe2, 0xbb, 0x50, 0x4e, 0x7e, 0xc8, 0x09, 0xf5, 0x6e, 0x53, 0xe5, 0x69, 0xa5, 0xf7, 0xab, 0x8f, + 0x9d, 0x20, 0x0c, 0x8c, 0x6f, 0x68, 0x3b, 0x90, 0x71, 0x87, 0xdb, 0xf4, 0xa0, 0xee, 0xd3, 0x1d, + 0xe7, 0xb1, 0x60, 0x66, 0xc8, 0x1d, 0xf6, 0xe9, 0x81, 0xd5, 0xc5, 0x52, 0x95, 0x3b, 0x44, 0xa0, + 0xe4, 0x33, 0x50, 0xbc, 0x7d, 0xa7, 0x71, 0x9b, 0x1e, 0xac, 0xd7, 0xc4, 0x41, 0xc5, 0xd1, 0x3a, + 0x81, 0xc5, 0x50, 0xb5, 0xb5, 0x16, 0x41, 0x1a, 0xcb, 0x31, 0x27, 0x64, 0x2d, 0xaf, 0xb4, 0x7b, + 0x41, 0x48, 0xfd, 0xf5, 0x9a, 0xda, 0x72, 0x93, 0x17, 0x26, 0xf8, 0x52, 0x04, 0x6a, 0xfc, 0x7f, + 0x79, 0xe4, 0x82, 0x6c, 0xc1, 0xaf, 0xbb, 0x41, 0x68, 0xbb, 0x4d, 0x1a, 0x11, 0xc0, 0x05, 0xef, + 0x88, 0xd2, 0xc4, 0x82, 0x8f, 0x81, 0xf5, 0xa6, 0xf3, 0x43, 0x37, 0xcd, 0x9a, 0x94, 0x0a, 0x97, + 0xf5, 0x9a, 0xaa, 0x15, 0xf6, 0x45, 0x69, 0xa2, 0xc9, 0x18, 0x98, 0x5c, 0x80, 0xf1, 0xf5, 0xea, + 0x9d, 0x6a, 0x2f, 0xdc, 0x43, 0x1e, 0x5c, 0xe4, 0xf2, 0x39, 0x5b, 0xad, 0x76, 0x2f, 0xdc, 0x33, + 0x65, 0x25, 0xb9, 0x82, 0xf7, 0x1e, 0x97, 0x86, 0x5c, 0x7b, 0x2c, 0x0e, 0xdd, 0x80, 0x17, 0x25, + 0xae, 0x3d, 0xac, 0x88, 0xbc, 0x02, 0xa3, 0xf7, 0xeb, 0x2b, 0xeb, 0x35, 0x71, 0x51, 0xc7, 0x93, + 0xe8, 0x61, 0xb7, 0xa9, 0x7f, 0x09, 0x07, 0x21, 0xab, 0x30, 0xdd, 0xa0, 0xcd, 0x9e, 0xef, 0x84, + 0x07, 0x37, 0x7d, 0xaf, 0xd7, 0x0d, 0x16, 0xc6, 0xb1, 0x0d, 0xdc, 0xe9, 0x81, 0xa8, 0xb1, 0x76, + 0xb1, 0x4a, 0xc1, 0x4e, 0x20, 0x19, 0xbf, 0x99, 0x8b, 0xd9, 0x24, 0xb9, 0xa0, 0x89, 0x35, 0xa8, + 0x72, 0x62, 0x62, 0x8d, 0xaa, 0x72, 0x42, 0x01, 0xc7, 0x04, 0xb2, 0xd2, 0x0b, 0x42, 0xaf, 0xb3, + 0xea, 0xb6, 0xba, 0x9e, 0xe3, 0x86, 0x88, 0xc5, 0x07, 0xdf, 0x38, 0x3a, 0xac, 0x3c, 0xd7, 0xc4, + 0x5a, 0x8b, 0x8a, 0x6a, 0x2b, 0x41, 0x25, 0x03, 0xfb, 0x63, 0xcc, 0x87, 0xf1, 0xaf, 0xf2, 0xda, + 0xf1, 0xc6, 0x3e, 0xcf, 0xa4, 0xdd, 0xb6, 0xd3, 0x44, 0x0d, 0x02, 0x76, 0x34, 0x5a, 0x55, 0xf8, + 0x79, 0x7e, 0x5c, 0xcb, 0x47, 0x48, 0xa7, 0x9d, 0x81, 0x4d, 0xbe, 0x00, 0x25, 0x26, 0x69, 0x88, + 0x9f, 0xc1, 0x42, 0x1e, 0x07, 0xfb, 0x59, 0x54, 0x1e, 0x06, 0xd4, 0x8f, 0xc8, 0x68, 0x22, 0x8a, + 0x8a, 0x41, 0x5a, 0xb0, 0xb0, 0xe9, 0xdb, 0x6e, 0xe0, 0x84, 0xab, 0x6e, 0xd3, 0x3f, 0x40, 0xc9, + 0x68, 0xd5, 0xb5, 0xb7, 0xdb, 0xb4, 0x85, 0xdd, 0x2d, 0x2e, 0x5f, 0x3c, 0x3a, 0xac, 0xbc, 0x18, + 0x72, 0x18, 0x8b, 0x46, 0x40, 0x16, 0xe5, 0x50, 0x0a, 0xe5, 0xbe, 0x94, 0x98, 0x24, 0x25, 0x87, + 0x15, 0xdf, 0x8e, 0xb8, 0x90, 0x80, 0x92, 0x54, 0x34, 0x1b, 0x8c, 0x87, 0xa9, 0x9f, 0xa9, 0x22, + 0x18, 0xff, 0x77, 0x2e, 0x3e, 0x80, 0xc9, 0xdb, 0x30, 0x29, 0x76, 0x8c, 0xb2, 0x2e, 0x90, 0x83, + 0xca, 0xed, 0x95, 0x98, 0x59, 0x15, 0x9c, 0xdd, 0xfb, 0xab, 0x2b, 0x1b, 0xca, 0xda, 0xc0, 0x7b, + 0xbf, 0xdd, 0x6c, 0x27, 0xb1, 0x24, 0x18, 0x5b, 0x04, 0x9b, 0x1b, 0x0d, 0x7d, 0x54, 0x70, 0x11, + 0x84, 0xed, 0x20, 0x63, 0x18, 0x14, 0xe0, 0x8f, 0xdf, 0xf1, 0xff, 0x31, 0x97, 0x75, 0xce, 0x93, + 0x65, 0x98, 0x7a, 0xe0, 0xf9, 0xfb, 0x38, 0xbf, 0xca, 0x20, 0xe0, 0xcc, 0x3f, 0x92, 0x15, 0xc9, + 0x0e, 0xe9, 0x28, 0xea, 0xb7, 0x29, 0xa3, 0xa1, 0x7f, 0x5b, 0x82, 0x82, 0x86, 0xc0, 0xe6, 0x21, + 0xa2, 0x18, 0xed, 0x0e, 0x9c, 0x87, 0xf8, 0x13, 0xb4, 0x25, 0xac, 0x82, 0x1b, 0xbf, 0x9e, 0x53, + 0xcf, 0x73, 0x36, 0xc8, 0x35, 0xaf, 0x63, 0x3b, 0xae, 0xd2, 0x1d, 0xfe, 0x1e, 0x86, 0xa5, 0xc9, + 0x2f, 0x51, 0x80, 0xc9, 0x35, 0x28, 0xf2, 0x5f, 0x11, 0xaf, 0x45, 0x2d, 0x9a, 0x40, 0xd4, 0x0f, + 0x0a, 0x09, 0x98, 0x9a, 0x99, 0xc2, 0x49, 0x67, 0xe6, 0xdb, 0x39, 0xf5, 0x28, 0xfe, 0xa8, 0x87, + 0x4d, 0xe2, 0x90, 0xc9, 0x9f, 0xe4, 0x90, 0xf9, 0xd8, 0x5d, 0xf8, 0xc1, 0x1c, 0x4c, 0x2a, 0x5a, + 0x0a, 0xd6, 0x87, 0xba, 0xef, 0x7d, 0x48, 0x9b, 0xa1, 0xde, 0x87, 0x2e, 0x2f, 0x4c, 0xf4, 0x21, + 0x02, 0xfd, 0x18, 0x7d, 0x30, 0xfe, 0x28, 0x27, 0xee, 0x48, 0x43, 0xb3, 0x79, 0x9d, 0x25, 0xe7, + 0x4f, 0x72, 0x44, 0x7e, 0x01, 0x46, 0x4d, 0xda, 0x72, 0x02, 0x71, 0xbf, 0x99, 0x55, 0xef, 0x63, + 0x58, 0x11, 0xcb, 0x4d, 0x3e, 0xfb, 0xa9, 0x9e, 0x6f, 0x58, 0xcf, 0x04, 0xd9, 0xf5, 0xe0, 0x46, + 0x9b, 0x3e, 0x76, 0xf8, 0x66, 0x14, 0x47, 0x2d, 0x1e, 0x6f, 0x4e, 0x60, 0xed, 0xb0, 0x1a, 0x21, + 0x51, 0xab, 0x1b, 0x4f, 0xc3, 0x31, 0xbe, 0x04, 0x10, 0x37, 0x49, 0x6e, 0x43, 0x59, 0xac, 0x06, + 0xc7, 0xdd, 0xe5, 0x82, 0x94, 0x18, 0x83, 0xca, 0xd1, 0x61, 0xe5, 0x99, 0x66, 0x54, 0x27, 0xa4, + 0x4e, 0x85, 0x6e, 0x0a, 0xd1, 0xf8, 0xdf, 0x0a, 0x90, 0xaf, 0xe2, 0x84, 0xdc, 0xa6, 0x07, 0xa1, + 0xbd, 0x7d, 0xc3, 0x69, 0x6b, 0x9b, 0x69, 0x1f, 0x4b, 0xad, 0x1d, 0x47, 0x53, 0x57, 0x28, 0xc0, + 0x6c, 0x33, 0xdd, 0xf6, 0xb7, 0xdf, 0x40, 0x44, 0x65, 0x33, 0xed, 0xfb, 0xdb, 0x6f, 0x24, 0xd1, + 0x22, 0x40, 0x62, 0xc0, 0x18, 0xdf, 0x58, 0x62, 0x0d, 0xc2, 0xd1, 0x61, 0x65, 0x8c, 0xef, 0x3f, + 0x53, 0xd4, 0x90, 0xb3, 0x50, 0x68, 0xd4, 0xef, 0x0a, 0x0e, 0x88, 0x6a, 0xc1, 0xa0, 0xeb, 0x9a, + 0xac, 0x8c, 0xb5, 0xb9, 0x51, 0xab, 0xd6, 0x51, 0x11, 0x30, 0x1a, 0xb7, 0xd9, 0x6e, 0xd9, 0xdd, + 0xa4, 0x2a, 0x20, 0x02, 0x24, 0xef, 0xc0, 0xe4, 0xed, 0xda, 0xca, 0x9a, 0x17, 0x70, 0xee, 0x35, + 0x16, 0x2f, 0xfe, 0xfd, 0x56, 0xd3, 0x42, 0xcd, 0x7f, 0xf2, 0x18, 0x50, 0xe0, 0x89, 0x05, 0xa7, + 0x19, 0x29, 0x36, 0x25, 0x4e, 0x93, 0x8a, 0x4b, 0xe9, 0xdd, 0xf8, 0x9d, 0xe1, 0xe5, 0xa3, 0xc3, + 0xca, 0x0b, 0xf8, 0x05, 0x01, 0x07, 0xb1, 0xe4, 0x75, 0x36, 0x41, 0xb5, 0x0f, 0x19, 0xf2, 0x15, + 0x38, 0x95, 0xae, 0x69, 0x44, 0xef, 0x13, 0x17, 0x8e, 0x0e, 0x2b, 0x46, 0x26, 0xfd, 0x40, 0x5b, + 0xbf, 0xd9, 0x44, 0x8c, 0x6f, 0xe6, 0x61, 0x52, 0x51, 0xf3, 0x91, 0xcf, 0x88, 0x67, 0xe9, 0x9c, + 0x76, 0x81, 0x51, 0x20, 0x58, 0x2d, 0xd7, 0x09, 0x75, 0xbc, 0x16, 0x15, 0x8f, 0xd4, 0xb1, 0xfe, + 0x25, 0x3f, 0x8c, 0xfe, 0xe5, 0x4d, 0x00, 0xbe, 0x84, 0x71, 0x9c, 0x14, 0x69, 0x48, 0xb1, 0x4e, + 0x51, 0x97, 0x55, 0x0c, 0x4c, 0xee, 0xc3, 0xdc, 0xa6, 0xdf, 0x0b, 0xc2, 0xc6, 0x41, 0x10, 0xd2, + 0x0e, 0xa3, 0x56, 0xf7, 0xbc, 0xb6, 0xd8, 0x3e, 0x2f, 0x1e, 0x1d, 0x56, 0xce, 0xa3, 0x49, 0x8d, + 0x15, 0x60, 0x3d, 0x7e, 0x80, 0xd5, 0xf5, 0x3c, 0x55, 0x2b, 0x93, 0x45, 0xc0, 0x30, 0xa1, 0xa4, + 0xea, 0x74, 0xd8, 0xc1, 0x28, 0x9e, 0xf0, 0x84, 0xa6, 0x5e, 0x39, 0x18, 0xc5, 0x57, 0xa6, 0x9f, + 0x14, 0x75, 0x14, 0xe3, 0x33, 0xaa, 0x3e, 0x71, 0x58, 0xbe, 0x64, 0xfc, 0xa5, 0x5c, 0xcc, 0x05, + 0xef, 0x5f, 0x25, 0x6f, 0xc1, 0x18, 0x7f, 0x32, 0x15, 0x2f, 0xcb, 0xa7, 0xa2, 0x3b, 0xb9, 0xfa, + 0x9e, 0xca, 0x15, 0xf9, 0xbf, 0xcb, 0xcd, 0x2a, 0x3e, 0x65, 0x0a, 0x94, 0xe8, 0x0d, 0x40, 0x57, + 0x07, 0x4a, 0xea, 0xa8, 0xed, 0xbe, 0x9a, 0xf5, 0x06, 0x60, 0xfc, 0x8b, 0x51, 0x98, 0xd6, 0xc1, + 0xd4, 0x77, 0xd5, 0xdc, 0x50, 0xef, 0xaa, 0x5f, 0x80, 0xa2, 0x58, 0x6f, 0x52, 0xa0, 0x7c, 0x11, + 0x5f, 0x46, 0x44, 0x99, 0x66, 0x2f, 0x00, 0x7c, 0x3a, 0xd8, 0x15, 0xdd, 0x8c, 0xb0, 0xc8, 0x92, + 0xf2, 0x6a, 0x57, 0x88, 0x65, 0x2c, 0xf9, 0x6a, 0xa7, 0x6e, 0xe7, 0xe8, 0xfd, 0xee, 0x75, 0x18, + 0x63, 0xd7, 0x93, 0x48, 0x83, 0x84, 0x5f, 0xc9, 0x6e, 0x2e, 0x09, 0xc3, 0x20, 0x0e, 0x44, 0x1e, + 0x40, 0x71, 0xc3, 0x0e, 0xc2, 0x06, 0xa5, 0xee, 0x10, 0x16, 0x13, 0x15, 0x31, 0x54, 0x73, 0x68, + 0x8e, 0x10, 0x50, 0xea, 0x26, 0x9e, 0xbc, 0x23, 0x62, 0xe4, 0x03, 0x80, 0x15, 0xcf, 0x0d, 0x7d, + 0xaf, 0xbd, 0xe1, 0xed, 0x2e, 0x8c, 0xe1, 0xd5, 0xfd, 0xb9, 0xc4, 0x04, 0xc4, 0x00, 0xfc, 0xf6, + 0x1e, 0xe9, 0xa7, 0x9a, 0xbc, 0xc2, 0x6a, 0x7b, 0xbb, 0xea, 0x3e, 0x88, 0xe1, 0xc9, 0x0d, 0x28, + 0x4b, 0xbd, 0xc8, 0x56, 0x77, 0xd7, 0xc7, 0x05, 0x32, 0x1e, 0x0b, 0x4e, 0xf4, 0x71, 0x68, 0xf5, + 0x44, 0xb9, 0xca, 0xe8, 0x93, 0x38, 0xe4, 0x2b, 0x70, 0x26, 0x59, 0x26, 0x67, 0xb9, 0x18, 0x5f, + 0x29, 0x54, 0x72, 0x19, 0xeb, 0xbe, 0x1f, 0x09, 0x72, 0x13, 0x66, 0xd8, 0x80, 0xdc, 0xa1, 0x76, + 0xd0, 0xe3, 0x66, 0x6d, 0x42, 0xb3, 0x24, 0x1f, 0x84, 0xc5, 0x2e, 0x6c, 0x7b, 0xcd, 0x7d, 0x05, + 0xc8, 0x4c, 0x62, 0x91, 0xeb, 0x30, 0xc9, 0xed, 0x14, 0xfc, 0x75, 0x77, 0xc7, 0x13, 0xcf, 0x06, + 0x52, 0x9b, 0x2e, 0x6a, 0xee, 0x2f, 0xb1, 0x3a, 0x53, 0x05, 0x34, 0x0e, 0xf3, 0x70, 0x3a, 0xbb, + 0x0d, 0xf2, 0x17, 0xe1, 0x94, 0x18, 0xcf, 0x36, 0xf5, 0x15, 0x98, 0x21, 0x2c, 0x38, 0x5e, 0x17, + 0xf3, 0xf4, 0x7c, 0x33, 0x22, 0x10, 0x31, 0x1c, 0x46, 0x22, 0xb1, 0x28, 0xb2, 0xdb, 0x21, 0x5f, + 0x83, 0x49, 0xb5, 0xd9, 0xfc, 0xf0, 0xc6, 0x30, 0x03, 0xda, 0x52, 0x49, 0x12, 0x1b, 0x66, 0x4c, + 0xfa, 0xf5, 0x1e, 0x0d, 0x42, 0x69, 0x8e, 0x23, 0x24, 0x96, 0xb3, 0xa9, 0x56, 0x24, 0x40, 0xa4, + 0xf6, 0x2a, 0xfb, 0x1c, 0xd3, 0x92, 0x46, 0x93, 0xdf, 0x62, 0xe4, 0x93, 0xf4, 0x8c, 0xef, 0xe6, + 0xe1, 0x4c, 0x9f, 0xe5, 0xcc, 0x38, 0x1e, 0xca, 0x93, 0x0a, 0xc7, 0x4b, 0x88, 0x91, 0xdc, 0x96, + 0xef, 0x3c, 0xe4, 0x85, 0x04, 0x36, 0xb2, 0x5c, 0x3e, 0x3a, 0xac, 0x94, 0xb4, 0x9d, 0x9a, 0x5f, + 0xaf, 0x91, 0x5b, 0x30, 0xc2, 0x86, 0x61, 0x08, 0x93, 0x14, 0xa9, 0xf4, 0x9c, 0x0e, 0x1d, 0x95, + 0x41, 0xe0, 0xd8, 0x20, 0x0d, 0xf2, 0x19, 0x28, 0x6c, 0x6e, 0x6e, 0x20, 0x77, 0x28, 0xe0, 0xea, + 0x9e, 0x0a, 0xc3, 0xb6, 0xc6, 0x8c, 0xa6, 0x18, 0x6e, 0x34, 0x22, 0x26, 0x03, 0x27, 0x5f, 0x4c, + 0x98, 0xca, 0xbd, 0x32, 0x78, 0x2b, 0x0f, 0x6f, 0x39, 0xf7, 0x31, 0x0c, 0xd6, 0x8c, 0x9f, 0xc8, + 0x49, 0xab, 0x20, 0xb1, 0xf8, 0xc9, 0x79, 0xb9, 0x4f, 0xf0, 0x62, 0x2e, 0xa8, 0xa8, 0x45, 0xe4, + 0x39, 0x00, 0xfe, 0x73, 0x6b, 0x4b, 0x0c, 0x7a, 0xc9, 0x54, 0x4a, 0xc8, 0xe7, 0x23, 0x92, 0x42, + 0x95, 0x59, 0x40, 0x49, 0x20, 0xb1, 0xd7, 0x78, 0x9d, 0xa9, 0x83, 0x1a, 0xbf, 0x91, 0x8f, 0x4f, + 0x8d, 0x1b, 0x4e, 0x3b, 0xa4, 0x3e, 0x59, 0xe4, 0x87, 0x40, 0x7c, 0x9b, 0x31, 0xa3, 0xdf, 0x64, + 0x21, 0x3e, 0x51, 0x78, 0xd7, 0xa2, 0xa3, 0xe3, 0x15, 0xe5, 0xe8, 0x28, 0xe0, 0xd1, 0x31, 0xdd, + 0xf7, 0x90, 0x78, 0x25, 0x83, 0x13, 0x22, 0xeb, 0xcf, 0xe0, 0x76, 0x2f, 0xc2, 0xd4, 0x5d, 0x6f, + 0xf5, 0x71, 0x18, 0x01, 0x32, 0x96, 0x5f, 0x34, 0xf5, 0x42, 0x46, 0xf1, 0x5e, 0xbb, 0x45, 0xfd, + 0xcd, 0x3d, 0xdb, 0xd5, 0x8c, 0x4b, 0xcc, 0x54, 0x39, 0x83, 0xbd, 0x4b, 0x1f, 0xe9, 0xb0, 0xe3, + 0x1c, 0x36, 0x59, 0x9e, 0x9c, 0x9c, 0x62, 0x6a, 0x72, 0x8c, 0x1f, 0xca, 0xcb, 0xe1, 0xba, 0xbf, + 0xf4, 0x94, 0x9a, 0x1d, 0xbc, 0xa1, 0x99, 0x1d, 0xcc, 0x45, 0x0f, 0x26, 0x91, 0xcd, 0xce, 0x52, + 0x96, 0xc0, 0xa1, 0xd8, 0x0c, 0xfc, 0x9d, 0x31, 0x28, 0xa9, 0xe0, 0x6c, 0x1c, 0xaa, 0xad, 0x96, + 0xaf, 0x8e, 0x83, 0xdd, 0x6a, 0xf9, 0x26, 0x96, 0x6a, 0x96, 0x3d, 0x85, 0x81, 0x96, 0x3d, 0x5f, + 0x85, 0x89, 0x95, 0x4e, 0x4b, 0x7b, 0xff, 0x37, 0x32, 0x3e, 0xef, 0x72, 0x04, 0xc4, 0x77, 0x6f, + 0xf4, 0x0e, 0xd0, 0xec, 0xb4, 0xd2, 0xaf, 0xfe, 0x31, 0x49, 0xcd, 0x28, 0x68, 0xf4, 0xe3, 0x18, + 0x05, 0x5d, 0x87, 0x89, 0xad, 0x80, 0x6e, 0xf6, 0x5c, 0x97, 0xb6, 0x71, 0xe1, 0x15, 0xf9, 0xf5, + 0xb9, 0x17, 0x50, 0x2b, 0xc4, 0x52, 0xf5, 0x03, 0x22, 0x50, 0x75, 0x82, 0xc7, 0x07, 0x4c, 0xf0, + 0x35, 0x28, 0xd6, 0x29, 0xf5, 0x71, 0x4c, 0x27, 0xe3, 0x5b, 0x52, 0x97, 0x52, 0xdf, 0x62, 0x03, + 0xab, 0x19, 0x0b, 0x09, 0x40, 0xcd, 0xc2, 0xa8, 0x34, 0xa4, 0x85, 0x11, 0x79, 0x1e, 0x4a, 0xdd, + 0xde, 0x76, 0xdb, 0x69, 0x22, 0x5d, 0x61, 0x9a, 0x64, 0x4e, 0xf2, 0x32, 0x46, 0x36, 0x20, 0x5f, + 0x84, 0x29, 0x54, 0x1b, 0x44, 0x4b, 0x6e, 0x5a, 0x3b, 0xda, 0xb5, 0x3a, 0x2e, 0x7d, 0x37, 0x59, + 0x91, 0x95, 0x61, 0x88, 0xa7, 0x13, 0x22, 0xb7, 0x60, 0x7c, 0xd7, 0x09, 0xad, 0xbd, 0xde, 0xf6, + 0xc2, 0x8c, 0x66, 0xc5, 0x76, 0xd3, 0x09, 0xd7, 0x7a, 0xdb, 0x7c, 0xca, 0x23, 0xd2, 0xc8, 0xa3, + 0x77, 0x9d, 0x70, 0xaf, 0xa7, 0xbe, 0x72, 0x8c, 0xed, 0x22, 0xec, 0x62, 0x03, 0xa6, 0xf5, 0x55, + 0xf1, 0x04, 0xde, 0xde, 0x23, 0xcb, 0xab, 0x62, 0x79, 0xe2, 0xd6, 0x48, 0x11, 0xca, 0x93, 0xdc, + 0xe6, 0xca, 0x84, 0x7a, 0x34, 0x3e, 0x26, 0xb9, 0xdd, 0xdb, 0xa6, 0xbe, 0x4b, 0x43, 0x1a, 0x88, + 0x3b, 0x7a, 0x60, 0x8e, 0x54, 0xbb, 0xdd, 0xc0, 0xf8, 0xc7, 0x79, 0x18, 0xaf, 0x3e, 0x68, 0x20, + 0xd7, 0x7f, 0x4d, 0x7d, 0x38, 0x55, 0x5f, 0xd0, 0xa3, 0x87, 0x53, 0xf5, 0xb9, 0xf4, 0x4a, 0x86, + 0x96, 0x05, 0x7d, 0x03, 0x14, 0x2d, 0x8b, 0xa6, 0x1f, 0x8a, 0xdf, 0x90, 0x0b, 0x43, 0xbc, 0x21, + 0x47, 0x6a, 0xfe, 0x91, 0xe3, 0xd5, 0xfc, 0x6f, 0xc1, 0xe4, 0xba, 0x1b, 0xd2, 0x5d, 0x3f, 0xde, + 0x35, 0x91, 0xc6, 0x27, 0x2a, 0x56, 0x6f, 0xde, 0x0a, 0x34, 0x5b, 0x92, 0xfc, 0x69, 0x21, 0x7a, + 0x52, 0xc0, 0x25, 0xc9, 0x5f, 0x20, 0x12, 0xea, 0x3a, 0x09, 0x68, 0xd4, 0x12, 0xeb, 0x4d, 0xda, + 0xe9, 0x70, 0xa1, 0x6f, 0x3a, 0x7e, 0x5b, 0x63, 0x03, 0xbb, 0x3c, 0x9b, 0x6d, 0xa7, 0x63, 0xfc, + 0xd5, 0x1c, 0xcc, 0x67, 0x2d, 0x23, 0xf2, 0x2e, 0x94, 0x3c, 0x7f, 0xd7, 0x76, 0x9d, 0xef, 0xe7, + 0x3d, 0x52, 0x74, 0xca, 0x6a, 0xb9, 0xaa, 0x49, 0x53, 0xcb, 0xd9, 0x80, 0x28, 0x3d, 0xd7, 0x55, + 0x60, 0x99, 0x03, 0xa2, 0x14, 0x1b, 0x3f, 0x9a, 0x87, 0xc9, 0x6a, 0xb7, 0xfb, 0x94, 0x9b, 0x9e, + 0x7e, 0x4e, 0x3b, 0x40, 0xa4, 0x06, 0x22, 0xea, 0x57, 0x7f, 0xc3, 0x35, 0xe5, 0x0c, 0xf9, 0xe5, + 0x3c, 0xcc, 0x24, 0x30, 0xd4, 0xaf, 0xcf, 0x0d, 0x69, 0x29, 0x9a, 0x1f, 0xd2, 0x52, 0xb4, 0x30, + 0x9c, 0xa5, 0xe8, 0xc8, 0xc7, 0x39, 0x14, 0x5e, 0x86, 0x42, 0xb5, 0xdb, 0x4d, 0x5a, 0x80, 0x74, + 0xbb, 0xf7, 0xaf, 0x71, 0x25, 0x98, 0xdd, 0xed, 0x9a, 0x0c, 0x42, 0xe3, 0xd4, 0x63, 0x43, 0x72, + 0x6a, 0xe3, 0x75, 0x98, 0x40, 0x5a, 0x68, 0x2f, 0x79, 0x1e, 0x90, 0xc5, 0x08, 0x53, 0x49, 0xad, + 0x2d, 0xc1, 0x7c, 0xfe, 0x38, 0x07, 0xa3, 0xf8, 0xfb, 0x29, 0x5d, 0x63, 0x4b, 0xda, 0x1a, 0x2b, + 0x2b, 0x6b, 0x6c, 0x98, 0xd5, 0xf5, 0xf7, 0x0b, 0x00, 0x2b, 0xf7, 0xcc, 0x06, 0xd7, 0x95, 0x92, + 0x1b, 0x30, 0x63, 0xb7, 0xdb, 0xde, 0x23, 0xda, 0xb2, 0x3c, 0xdf, 0xd9, 0x75, 0x5c, 0x3e, 0x72, + 0xd2, 0x2c, 0x41, 0xaf, 0x52, 0x1f, 0x2b, 0x45, 0xd5, 0x3d, 0x5e, 0xa3, 0xd2, 0xe9, 0xd0, 0x70, + 0xcf, 0x6b, 0x49, 0xb5, 0x89, 0x46, 0x47, 0x54, 0x65, 0xd0, 0xb9, 0xc3, 0x6b, 0x54, 0x3a, 0x7b, + 0xa8, 0x06, 0x92, 0x32, 0xb4, 0x46, 0x47, 0x54, 0x65, 0xd0, 0xe1, 0xba, 0xa3, 0x80, 0x6c, 0xc0, + 0x2c, 0x96, 0x58, 0x4d, 0x9f, 0xb6, 0xa8, 0x1b, 0x3a, 0x76, 0x3b, 0x10, 0x8a, 0x36, 0xd4, 0x28, + 0xa7, 0x2a, 0x55, 0x45, 0x03, 0x56, 0xae, 0xc4, 0x75, 0xe4, 0x32, 0x8c, 0x77, 0xec, 0xc7, 0x96, + 0xbd, 0xcb, 0x0d, 0x74, 0xa6, 0xb8, 0x62, 0x46, 0x14, 0xa9, 0xc7, 0x48, 0xc7, 0x7e, 0x5c, 0xdd, + 0xa5, 0xac, 0x17, 0xf4, 0x71, 0xd7, 0x0b, 0x94, 0x5e, 0x8c, 0xc5, 0xbd, 0x48, 0x54, 0xa9, 0xbd, + 0x10, 0x55, 0xa2, 0x17, 0xc6, 0x2f, 0xe5, 0xe0, 0x99, 0x75, 0xfc, 0x8a, 0xf0, 0x60, 0x85, 0xba, + 0x21, 0xf5, 0xeb, 0xd4, 0xef, 0x38, 0x68, 0xae, 0xd0, 0xa0, 0x21, 0x79, 0x01, 0x0a, 0x55, 0xf3, + 0xae, 0x58, 0xbf, 0x9c, 0xdf, 0x6b, 0xc6, 0x23, 0xac, 0x36, 0xd2, 0xdd, 0xe5, 0x8f, 0x79, 0x53, + 0xa8, 0x42, 0xa9, 0x1a, 0x04, 0xce, 0xae, 0xdb, 0xe1, 0xfe, 0x3a, 0x05, 0xcd, 0x3c, 0x45, 0x94, + 0xa7, 0x1e, 0xc3, 0x54, 0x14, 0xe3, 0x3f, 0xcf, 0xc1, 0x6c, 0xb5, 0xdb, 0xd5, 0x3f, 0x59, 0x37, + 0x8d, 0xca, 0x0d, 0x6f, 0x1a, 0xe5, 0xc0, 0xb4, 0xd6, 0x5d, 0xbe, 0xa4, 0x62, 0xc1, 0x77, 0xc0, + 0xc8, 0xf0, 0xcf, 0xee, 0x46, 0x45, 0x56, 0xa0, 0xbf, 0xeb, 0x27, 0x08, 0x1b, 0xff, 0x59, 0x11, + 0x79, 0x88, 0xe0, 0xb6, 0xc2, 0x78, 0x37, 0x97, 0x61, 0xbc, 0xfb, 0x26, 0x28, 0x12, 0x8e, 0x7a, + 0xc4, 0x29, 0xb2, 0xa2, 0xaa, 0xf5, 0x8a, 0x81, 0xc9, 0x7e, 0xd2, 0x8c, 0xb7, 0x80, 0xbd, 0x79, + 0x21, 0xb9, 0x81, 0x9f, 0x88, 0x05, 0xef, 0x1a, 0x90, 0x75, 0x17, 0x6d, 0x0d, 0x68, 0x63, 0xdf, + 0xe9, 0xde, 0xa7, 0xbe, 0xb3, 0x73, 0x20, 0x36, 0x00, 0x0e, 0xbe, 0x23, 0x6a, 0xad, 0x60, 0xdf, + 0xe9, 0x5a, 0x0f, 0xb1, 0xde, 0xcc, 0xc0, 0x21, 0xef, 0xc1, 0xb8, 0x49, 0x1f, 0xf9, 0x4e, 0x28, + 0x8d, 0xd3, 0xa6, 0x23, 0x25, 0x2e, 0x96, 0xf2, 0xbd, 0xe0, 0xf3, 0x1f, 0x2a, 0x57, 0x14, 0xf5, + 0x64, 0x89, 0x0b, 0x29, 0xdc, 0x08, 0x6d, 0x2a, 0xee, 0x6d, 0xf5, 0x41, 0xa3, 0x9f, 0x8c, 0x42, + 0x2e, 0xc1, 0x28, 0x4a, 0x3a, 0xe2, 0x2e, 0x80, 0xbe, 0x68, 0x28, 0x3b, 0xab, 0x62, 0x18, 0x42, + 0xa0, 0x4e, 0x40, 0x3e, 0xe6, 0x07, 0x0b, 0x45, 0x94, 0xd2, 0x95, 0x92, 0xa4, 0x98, 0x36, 0x71, + 0x22, 0x31, 0x6d, 0x03, 0xca, 0x26, 0x77, 0x6b, 0x6d, 0x55, 0xbb, 0xf8, 0x62, 0x1c, 0x2c, 0x00, + 0xee, 0xe4, 0xf3, 0x47, 0x87, 0x95, 0x67, 0x85, 0xcb, 0x6b, 0xcb, 0xb2, 0xbb, 0xfc, 0xa1, 0x59, + 0x63, 0x23, 0x49, 0x4c, 0xf2, 0x26, 0x8c, 0x30, 0xd6, 0x2b, 0x0c, 0x7e, 0xe5, 0xcb, 0x5b, 0xcc, + 0x8d, 0xf9, 0xe6, 0x6c, 0x7a, 0x1a, 0x4f, 0x40, 0x14, 0x62, 0xc1, 0xb4, 0xbe, 0xdc, 0x85, 0xed, + 0xd7, 0x42, 0x3c, 0x9e, 0x7a, 0xbd, 0x78, 0x8e, 0x13, 0x65, 0x56, 0x13, 0x0b, 0xd5, 0x1d, 0x90, + 0xd8, 0xa4, 0xab, 0x50, 0xdc, 0x5c, 0xa9, 0xd7, 0x3d, 0x3f, 0xe4, 0x57, 0x9d, 0xf8, 0x64, 0x61, + 0x65, 0xa6, 0xed, 0xee, 0x52, 0x7e, 0x16, 0x87, 0xcd, 0xae, 0xd5, 0x65, 0x60, 0xea, 0x59, 0x2c, + 0x51, 0xc9, 0x07, 0x70, 0x6a, 0x2b, 0xa0, 0x55, 0xf7, 0x00, 0x4f, 0x67, 0x65, 0xab, 0x4c, 0xe3, + 0xd2, 0xc3, 0x07, 0x25, 0x76, 0x15, 0xb4, 0xdd, 0x03, 0x8b, 0x9f, 0xea, 0xd9, 0x1b, 0x27, 0x9b, + 0x0a, 0xb9, 0x02, 0x85, 0x3b, 0x2b, 0x75, 0x71, 0x27, 0x92, 0xa6, 0x99, 0x77, 0x56, 0xea, 0x7c, + 0x21, 0x75, 0x74, 0xbb, 0xf2, 0x3b, 0x2b, 0xf5, 0x4f, 0xce, 0xf8, 0xf8, 0x2b, 0xf8, 0x25, 0x64, + 0x01, 0xc6, 0x9b, 0x1c, 0x46, 0x50, 0x93, 0x3f, 0x09, 0x81, 0x11, 0xdb, 0xdf, 0x15, 0xc7, 0xa0, + 0x89, 0x7f, 0x93, 0x97, 0xa1, 0xec, 0xf7, 0x5c, 0xcb, 0x0e, 0xf8, 0xd3, 0x5c, 0x2f, 0xa0, 0x3e, + 0x67, 0xb3, 0xe6, 0x94, 0xdf, 0x73, 0xab, 0x01, 0x93, 0xbb, 0xd0, 0x50, 0xf8, 0x9f, 0xe4, 0x40, + 0xd9, 0x3f, 0x45, 0x93, 0xb6, 0x1c, 0x9f, 0x36, 0x43, 0x71, 0x36, 0x0b, 0x47, 0x52, 0x5e, 0x96, + 0x30, 0x61, 0xc5, 0x32, 0xf2, 0x2e, 0x8c, 0x8b, 0x33, 0x44, 0xf0, 0x4c, 0xb9, 0xef, 0xc4, 0x8b, + 0x0b, 0xf7, 0x38, 0x4e, 0x9d, 0x3f, 0x12, 0x89, 0xb1, 0xec, 0x5b, 0x0f, 0x36, 0x57, 0xda, 0xb6, + 0xd3, 0x09, 0xc4, 0x41, 0x80, 0x5c, 0xe3, 0xc3, 0x47, 0xa1, 0xd5, 0xc4, 0x52, 0x95, 0x65, 0x47, + 0xa0, 0xc6, 0x4d, 0xf9, 0xe0, 0x73, 0x8c, 0x1d, 0x76, 0x05, 0x46, 0xef, 0xc7, 0x6a, 0xc1, 0xe5, + 0x89, 0xa3, 0xc3, 0x0a, 0x1f, 0x5b, 0x93, 0x97, 0x1b, 0x14, 0x26, 0xa2, 0x75, 0xc7, 0x68, 0xb1, + 0x1f, 0x48, 0x6b, 0x8a, 0xd3, 0x62, 0x2b, 0xd0, 0xc4, 0x52, 0x26, 0xa7, 0xad, 0xba, 0x2d, 0x04, + 0xc8, 0x23, 0x00, 0x0e, 0x0f, 0x75, 0x5b, 0xb8, 0x4c, 0xd5, 0xde, 0x09, 0x30, 0x45, 0x1a, 0xfa, + 0xf1, 0x1c, 0x4c, 0xeb, 0x73, 0x4c, 0x2e, 0xc3, 0x98, 0xf0, 0x15, 0xcd, 0xa1, 0x96, 0x95, 0x51, + 0x1b, 0xe3, 0x5e, 0xa2, 0x9a, 0x6f, 0xa8, 0x80, 0x62, 0x42, 0x9f, 0xa0, 0x20, 0x24, 0x1e, 0x14, + 0xfa, 0xc4, 0x2a, 0x30, 0x65, 0x1d, 0x31, 0xd8, 0x3d, 0x34, 0xe8, 0xb5, 0x43, 0xf5, 0x75, 0xd8, + 0xc7, 0x12, 0x53, 0xd4, 0x18, 0xdf, 0xce, 0xc1, 0x18, 0x67, 0x8c, 0x09, 0x3b, 0xd3, 0xdc, 0x49, + 0xec, 0x4c, 0xbf, 0x01, 0xf3, 0xa6, 0xd7, 0xa6, 0x41, 0xd5, 0x3d, 0x78, 0xb4, 0x47, 0x7d, 0x5a, + 0xf7, 0xbd, 0x1d, 0xf9, 0x90, 0x3d, 0xb9, 0xf4, 0xbc, 0xc6, 0x80, 0xb3, 0x00, 0xf9, 0x4b, 0xa4, + 0xcf, 0x6a, 0xd8, 0x36, 0xc5, 0x2a, 0xb6, 0x57, 0x13, 0x0f, 0xdf, 0x99, 0x8d, 0x18, 0xff, 0x20, + 0x07, 0x8b, 0xfd, 0x49, 0xe3, 0xf1, 0xc9, 0xff, 0x8c, 0xe5, 0x16, 0x7e, 0x7c, 0xf2, 0xd2, 0x84, + 0xf1, 0xab, 0x02, 0x4c, 0x4c, 0x38, 0x55, 0x6d, 0x36, 0x69, 0x37, 0x64, 0x84, 0x85, 0xc9, 0x66, + 0x24, 0xd7, 0x14, 0xb9, 0x7a, 0xc5, 0x46, 0x00, 0x6e, 0x46, 0x2b, 0x0d, 0x49, 0x71, 0xd5, 0x65, + 0xa3, 0x1a, 0x87, 0x39, 0x80, 0x46, 0x63, 0xed, 0x36, 0x3d, 0xa8, 0xdb, 0x0e, 0x0a, 0x2a, 0x9c, + 0xd7, 0xdc, 0x16, 0xcc, 0xa1, 0x24, 0x4c, 0x3f, 0x38, 0x8b, 0xda, 0xa7, 0x07, 0x9a, 0xe9, 0x87, + 0x04, 0xe5, 0xbd, 0x72, 0x1e, 0xda, 0x21, 0x65, 0x88, 0xa8, 0x96, 0x96, 0xbd, 0xc2, 0xd2, 0x04, + 0xa6, 0x02, 0x4c, 0x3e, 0x80, 0xe9, 0xf8, 0x57, 0x64, 0xc0, 0x32, 0x1d, 0x31, 0x20, 0xbd, 0x72, + 0xf9, 0xb9, 0xa3, 0xc3, 0xca, 0xa2, 0x42, 0x35, 0x69, 0xda, 0x92, 0x20, 0x66, 0xfc, 0x62, 0x0e, + 0xcd, 0xb6, 0x64, 0x07, 0x2f, 0xc0, 0x48, 0xe4, 0x68, 0x50, 0x12, 0xa7, 0x8d, 0xfe, 0xca, 0x8d, + 0xf5, 0x4c, 0xae, 0x8c, 0x7b, 0x82, 0xac, 0x55, 0xef, 0x01, 0xab, 0x25, 0x37, 0x61, 0x7c, 0xa8, + 0x6f, 0xc6, 0xed, 0x98, 0xf1, 0xad, 0x12, 0x1b, 0x67, 0xe1, 0xd6, 0x83, 0xcd, 0xef, 0xdd, 0x59, + 0xf8, 0xa9, 0x3c, 0xcc, 0xb0, 0x71, 0xad, 0xf6, 0xc2, 0x3d, 0xcf, 0x77, 0xc2, 0x83, 0xa7, 0x56, + 0x41, 0xfe, 0xb6, 0x76, 0xf7, 0x5c, 0x94, 0xa7, 0xa4, 0xda, 0xb7, 0xa1, 0xf4, 0xe4, 0xff, 0xed, + 0x28, 0xcc, 0x65, 0x60, 0x91, 0xd7, 0xb4, 0x57, 0xb7, 0x05, 0x19, 0x37, 0xe3, 0xbb, 0x87, 0x95, + 0x92, 0x04, 0xdf, 0x8c, 0xe3, 0x68, 0x2c, 0xe9, 0x36, 0x90, 0x7c, 0xa4, 0xf0, 0x11, 0x4e, 0xb5, + 0x81, 0xd4, 0x2d, 0x1f, 0x2f, 0xc1, 0x28, 0x72, 0x26, 0x61, 0xf7, 0x8b, 0x92, 0x25, 0xf2, 0x3a, + 0xcd, 0xce, 0x89, 0x15, 0x90, 0x35, 0x18, 0x67, 0x7f, 0xdc, 0xb1, 0xbb, 0xe2, 0x09, 0x9c, 0x44, + 0xda, 0x0f, 0x2c, 0xed, 0x3a, 0xee, 0xae, 0xaa, 0x00, 0x69, 0x53, 0xab, 0x63, 0x77, 0x35, 0x11, + 0x98, 0x03, 0x6a, 0x8a, 0x94, 0x62, 0x7f, 0x45, 0x4a, 0xee, 0x58, 0x45, 0xca, 0x0e, 0x40, 0xc3, + 0xd9, 0x75, 0x1d, 0x77, 0xb7, 0xda, 0xde, 0x15, 0xd1, 0x47, 0x2e, 0xf5, 0x9f, 0x85, 0xcb, 0x31, + 0x30, 0x2e, 0xdc, 0x67, 0xd0, 0x4e, 0x85, 0x97, 0x59, 0x76, 0x7b, 0x57, 0x73, 0x37, 0x54, 0x28, + 0x93, 0xbb, 0x00, 0xd5, 0x66, 0xe8, 0x3c, 0x64, 0x4b, 0x38, 0x10, 0xf2, 0xaa, 0xfc, 0xe4, 0x95, + 0xea, 0x6d, 0x7a, 0x80, 0x77, 0x2c, 0xf9, 0xe2, 0x6f, 0x23, 0x28, 0xdb, 0x09, 0x9a, 0x2f, 0x59, + 0x4c, 0x81, 0x74, 0xe1, 0x54, 0xb5, 0xd5, 0x72, 0x58, 0x1f, 0xec, 0xf6, 0x26, 0x8f, 0x1b, 0x83, + 0xa4, 0x4b, 0xd9, 0xa4, 0x2f, 0xc9, 0x47, 0x6a, 0x3b, 0xc2, 0xb2, 0x64, 0xb8, 0x99, 0x44, 0x33, + 0xd9, 0x84, 0x8d, 0x06, 0x4c, 0xeb, 0x9d, 0xd7, 0xa3, 0xa6, 0x94, 0xa0, 0x68, 0x36, 0xaa, 0x56, + 0x63, 0xad, 0x7a, 0xb5, 0x9c, 0x23, 0x65, 0x28, 0x89, 0x5f, 0x4b, 0xd6, 0xd2, 0x1b, 0xd7, 0xcb, + 0x79, 0xad, 0xe4, 0x8d, 0xab, 0x4b, 0xe5, 0xc2, 0x62, 0x7e, 0x21, 0x97, 0xf0, 0x34, 0x1e, 0x2f, + 0x17, 0xb9, 0xee, 0xdb, 0xf8, 0x95, 0x1c, 0x14, 0xe5, 0xb7, 0x93, 0xeb, 0x50, 0x68, 0x34, 0xd6, + 0x12, 0xbe, 0xba, 0xf1, 0x29, 0xc3, 0xf9, 0x69, 0x10, 0xa8, 0x0e, 0x19, 0x0c, 0x81, 0xe1, 0x6d, + 0x6e, 0x34, 0x84, 0xbc, 0x26, 0xf1, 0x62, 0xe6, 0xcd, 0xf1, 0x32, 0x1c, 0x18, 0xaf, 0x43, 0xe1, + 0xd6, 0x83, 0x4d, 0x71, 0x9b, 0x94, 0x78, 0x31, 0x3f, 0xe5, 0x78, 0x1f, 0x3e, 0x52, 0xb9, 0x3c, + 0x43, 0x30, 0x4c, 0x98, 0x54, 0x16, 0x32, 0x17, 0x50, 0x3a, 0x5e, 0x14, 0x2a, 0x44, 0x08, 0x28, + 0xac, 0xc4, 0x14, 0x35, 0x4c, 0x6c, 0xdb, 0xf0, 0x9a, 0x76, 0x5b, 0x48, 0x3a, 0x28, 0xb6, 0xb5, + 0x59, 0x81, 0xc9, 0xcb, 0x8d, 0xdf, 0xcc, 0x41, 0xb9, 0xee, 0x7b, 0x3c, 0x9c, 0xc9, 0xa6, 0xb7, + 0x4f, 0xdd, 0xfb, 0x57, 0xc9, 0xeb, 0x72, 0xcb, 0xe5, 0x22, 0x8d, 0xde, 0x28, 0x6e, 0xb9, 0xc4, + 0xb3, 0xa8, 0xd8, 0x76, 0x4a, 0x34, 0x96, 0xfc, 0xf0, 0x51, 0x1c, 0x8e, 0x89, 0xc6, 0x52, 0x81, + 0x51, 0xfc, 0x1c, 0xc1, 0x1c, 0xf1, 0xcb, 0x43, 0x56, 0x60, 0xf2, 0x72, 0x85, 0x37, 0x1d, 0xe6, + 0x53, 0x7d, 0x58, 0xfa, 0x9e, 0x8a, 0x84, 0xa0, 0x77, 0xae, 0x3f, 0xbf, 0x26, 0xb7, 0xfb, 0x44, + 0x42, 0x48, 0x10, 0xe0, 0x8e, 0x8c, 0x4b, 0xfc, 0xb5, 0x84, 0xbb, 0x03, 0xa9, 0x3a, 0xb1, 0x94, + 0x63, 0xf5, 0x97, 0x60, 0x3e, 0x39, 0xbe, 0xa8, 0xba, 0xad, 0xc2, 0x8c, 0x5e, 0x2e, 0xb5, 0xb8, + 0x67, 0x32, 0xdb, 0xbd, 0xbf, 0x64, 0x26, 0xe1, 0x8d, 0xff, 0x25, 0x07, 0x13, 0xf8, 0xa7, 0xd9, + 0xe3, 0xd2, 0x66, 0xf5, 0x41, 0x43, 0x28, 0x94, 0x54, 0x69, 0xd3, 0x7e, 0x14, 0x48, 0x4b, 0x43, + 0x8d, 0x61, 0x45, 0xc0, 0x02, 0x95, 0xbf, 0x0a, 0x49, 0x55, 0x66, 0x84, 0xca, 0x9f, 0x8f, 0x82, + 0x04, 0xaa, 0x00, 0x46, 0xdb, 0x7a, 0x2e, 0xfe, 0xaa, 0x76, 0x5f, 0x88, 0xe7, 0xb5, 0x75, 0xdb, + 0x7a, 0x0e, 0x86, 0x66, 0x5f, 0x0f, 0x1a, 0x4c, 0x22, 0x56, 0xcd, 0xbe, 0xd8, 0x37, 0x6a, 0xd2, + 0xb0, 0x00, 0x32, 0x7e, 0x7d, 0x2a, 0x39, 0x80, 0xe2, 0xf4, 0x3c, 0xe1, 0x46, 0x7b, 0x0b, 0x46, + 0xab, 0xed, 0xb6, 0xf7, 0x48, 0xb0, 0x1c, 0x79, 0xdf, 0x8f, 0xc6, 0x8f, 0x1f, 0x8e, 0xa8, 0x0c, + 0xd5, 0x7c, 0xae, 0x59, 0x01, 0x59, 0x81, 0x89, 0xea, 0x83, 0xc6, 0xfa, 0x7a, 0x6d, 0x73, 0x93, + 0xfb, 0x97, 0x16, 0x96, 0x5f, 0x92, 0xe3, 0xe3, 0x38, 0x2d, 0x2b, 0x69, 0x97, 0x12, 0x5f, 0x9c, + 0x62, 0x3c, 0xf2, 0x0e, 0xc0, 0x2d, 0xcf, 0x71, 0xb9, 0xf2, 0x57, 0x74, 0xfe, 0xdc, 0xd1, 0x61, + 0x65, 0xf2, 0x43, 0xcf, 0x71, 0x85, 0xb6, 0x98, 0x7d, 0x7b, 0x0c, 0x64, 0x2a, 0x7f, 0xb3, 0x91, + 0x5e, 0xf6, 0xb8, 0xbd, 0xea, 0x68, 0x3c, 0xd2, 0xdb, 0x5e, 0x4a, 0x4b, 0x29, 0xc1, 0x48, 0x07, + 0x66, 0x1a, 0xbd, 0xdd, 0x5d, 0xca, 0x8e, 0x09, 0xa1, 0x85, 0x1b, 0x13, 0x17, 0xfe, 0x28, 0x18, + 0x19, 0xbf, 0x08, 0xb2, 0x5b, 0x68, 0xb0, 0xfc, 0x1a, 0xdb, 0x15, 0xdf, 0x39, 0xac, 0x08, 0x7b, + 0x17, 0x26, 0xf7, 0x05, 0x12, 0x3f, 0xad, 0x83, 0x4b, 0xd2, 0x26, 0xf7, 0x60, 0x8c, 0xbf, 0xb4, + 0x09, 0x7f, 0xc9, 0xe7, 0x07, 0xec, 0x40, 0x0e, 0xd8, 0xef, 0x2d, 0x97, 0xd7, 0x92, 0x07, 0x50, + 0x5c, 0x71, 0xfc, 0x66, 0x9b, 0xae, 0xac, 0x0b, 0x41, 0xe2, 0x85, 0x01, 0x24, 0x25, 0x28, 0x1f, + 0x97, 0x26, 0xfe, 0x6a, 0x3a, 0xaa, 0x60, 0x21, 0x21, 0xc8, 0x5f, 0xcd, 0xc1, 0x33, 0xd1, 0xd7, + 0x57, 0x77, 0xa9, 0x1b, 0xde, 0xb1, 0xc3, 0xe6, 0x1e, 0xf5, 0xc5, 0x28, 0x4d, 0x0c, 0x1a, 0xa5, + 0xcf, 0xa7, 0x46, 0xe9, 0x62, 0x3c, 0x4a, 0x36, 0x23, 0x66, 0x75, 0x38, 0xb5, 0xf4, 0x98, 0x0d, + 0x6a, 0x95, 0x58, 0x00, 0xf1, 0x1b, 0xb2, 0x30, 0x9c, 0x7b, 0x69, 0x40, 0x87, 0x63, 0x60, 0xe1, + 0x27, 0x17, 0xfd, 0xd6, 0x0c, 0xbd, 0xa3, 0x52, 0x72, 0x5b, 0x3a, 0x27, 0x73, 0x11, 0xe7, 0xfc, + 0x00, 0xda, 0xdc, 0x61, 0x79, 0x6e, 0x40, 0x18, 0x02, 0x3e, 0xdb, 0x1b, 0xf6, 0xb6, 0x90, 0x6a, + 0x8e, 0x99, 0xed, 0x0d, 0x3b, 0x9e, 0xed, 0xb6, 0x9d, 0x9c, 0xed, 0x0d, 0x7b, 0x9b, 0xac, 0xf0, + 0x88, 0x0a, 0xdc, 0xfd, 0xfe, 0xb9, 0x41, 0xd4, 0xa4, 0x06, 0x2c, 0x23, 0xb2, 0xc2, 0x97, 0x61, + 0xa2, 0xd1, 0xb5, 0x9b, 0xb4, 0xed, 0xec, 0x84, 0xc2, 0x40, 0xe1, 0xc5, 0x01, 0xa4, 0x22, 0x58, + 0xf1, 0x20, 0x2d, 0x7f, 0xaa, 0x77, 0xae, 0x08, 0x86, 0x7d, 0xe1, 0x66, 0xfd, 0x8e, 0xd0, 0xc7, + 0x0d, 0xfa, 0xc2, 0xcd, 0xfa, 0x1d, 0x21, 0xc0, 0x74, 0x3b, 0x9a, 0x00, 0x53, 0xbf, 0x43, 0xba, + 0x30, 0xbd, 0x49, 0x7d, 0xdf, 0xde, 0xf1, 0xfc, 0x0e, 0xd7, 0xfa, 0x72, 0x97, 0xce, 0x4b, 0x83, + 0xe8, 0x69, 0x08, 0x5c, 0xd9, 0x19, 0xca, 0x32, 0x2b, 0xa9, 0x2a, 0x4e, 0xd0, 0x67, 0x63, 0xb2, + 0xec, 0x84, 0xdb, 0xbd, 0xe6, 0x3e, 0x0d, 0x17, 0x66, 0x8f, 0x1d, 0x93, 0x08, 0x96, 0x8f, 0xc9, + 0xb6, 0xfc, 0xa9, 0x8e, 0x49, 0x04, 0xc3, 0x96, 0x81, 0x88, 0x9b, 0x40, 0x8e, 0x5d, 0x06, 0x1c, + 0x90, 0x2f, 0x83, 0x7e, 0x01, 0x14, 0xc8, 0x1e, 0x94, 0x96, 0xbd, 0x9e, 0xcb, 0xe4, 0xda, 0xae, + 0xed, 0xf8, 0x0b, 0x73, 0x48, 0xf6, 0xe5, 0x41, 0x1f, 0xac, 0x80, 0x73, 0x77, 0x80, 0x6d, 0x56, + 0xc2, 0x44, 0x67, 0x56, 0xa4, 0xbe, 0xdf, 0xa8, 0xa0, 0xa4, 0x05, 0x93, 0xb8, 0x94, 0x6b, 0xf4, + 0xa1, 0xd7, 0x0d, 0x16, 0xe6, 0xb1, 0xa1, 0x0b, 0xc7, 0x6d, 0x0a, 0x0e, 0xcd, 0x0d, 0x05, 0x70, + 0x6b, 0x58, 0x2d, 0x2c, 0x51, 0x95, 0xea, 0x0a, 0xa0, 0xf1, 0x8f, 0x47, 0xa1, 0x72, 0x0c, 0x31, + 0x72, 0x5f, 0x9e, 0x4d, 0x5c, 0x02, 0x78, 0x75, 0xb8, 0x6f, 0xb8, 0x7c, 0xec, 0xb1, 0xf5, 0x16, + 0x4c, 0xdf, 0x53, 0x6c, 0x16, 0x22, 0x1b, 0x12, 0xc4, 0x51, 0xad, 0x19, 0x2c, 0xa7, 0x65, 0x26, + 0x40, 0x17, 0xff, 0xb8, 0x00, 0x23, 0x28, 0x58, 0xbc, 0x00, 0x85, 0x46, 0x6f, 0x5b, 0x7d, 0x77, + 0x0b, 0x34, 0x76, 0xcd, 0x6a, 0xc9, 0xdb, 0x30, 0x29, 0xbc, 0x83, 0x94, 0xdb, 0x29, 0x0e, 0x92, + 0x74, 0x25, 0x4a, 0xba, 0x66, 0x28, 0xe0, 0xe4, 0x3d, 0x28, 0xd5, 0x9d, 0x2e, 0x6d, 0x3b, 0x2e, + 0x55, 0x1c, 0x0d, 0x70, 0x2e, 0xbb, 0xa2, 0x3c, 0xf5, 0x16, 0xa7, 0x22, 0xe8, 0x7e, 0x4c, 0x23, + 0xc3, 0xfb, 0x31, 0xbd, 0x07, 0xa5, 0x1a, 0xdd, 0x71, 0x5c, 0x47, 0x8c, 0xcf, 0x68, 0xdc, 0x70, + 0x2b, 0x2a, 0xd7, 0xb1, 0x35, 0x04, 0xb2, 0x0c, 0x53, 0x26, 0xed, 0x7a, 0x81, 0x13, 0x7a, 0xfe, + 0xc1, 0x96, 0xb9, 0x2e, 0xec, 0x5b, 0x50, 0x41, 0xe7, 0x47, 0x15, 0x56, 0xcf, 0x57, 0x4f, 0x22, + 0x1d, 0x85, 0xdc, 0x85, 0xd9, 0xb8, 0x40, 0xb7, 0x0b, 0x13, 0x0f, 0x2f, 0x11, 0x9d, 0xb4, 0x45, + 0x77, 0x1a, 0x55, 0xff, 0x26, 0x93, 0xee, 0x08, 0xfb, 0xf0, 0xe4, 0x37, 0xf9, 0x74, 0x27, 0xfb, + 0x9b, 0x4c, 0xba, 0x63, 0xfc, 0x5a, 0x01, 0xce, 0xf4, 0x61, 0x6d, 0xe4, 0xae, 0xbe, 0x5c, 0x5f, + 0x18, 0xcc, 0x09, 0x8f, 0x5f, 0xa6, 0x1b, 0x50, 0x5e, 0xbd, 0x8d, 0x17, 0x7a, 0xfe, 0xac, 0xbd, + 0x52, 0x95, 0x42, 0x28, 0x76, 0x9f, 0xee, 0xa3, 0x6f, 0x88, 0x7c, 0x0e, 0x6f, 0x6a, 0x31, 0x5c, + 0x52, 0x98, 0x8b, 0x3f, 0x94, 0x17, 0xeb, 0x36, 0x11, 0x70, 0x33, 0x77, 0xa2, 0x80, 0x9b, 0x5f, + 0x80, 0xd2, 0xea, 0x6d, 0xae, 0x6e, 0x5b, 0xb3, 0x83, 0x3d, 0xb1, 0xa6, 0x70, 0x08, 0xe9, 0xbe, + 0x7c, 0xc6, 0xd9, 0xb3, 0xb5, 0x8b, 0xad, 0x86, 0x41, 0xb6, 0x60, 0x8e, 0x7f, 0x9b, 0xb3, 0xe3, + 0x34, 0x79, 0xdc, 0x3e, 0xc7, 0x6e, 0x8b, 0x15, 0xf6, 0xc2, 0xd1, 0x61, 0xa5, 0x42, 0xf7, 0xd1, + 0xeb, 0x45, 0xd4, 0x5b, 0x01, 0x02, 0xa8, 0xee, 0x2f, 0x19, 0xf8, 0x6a, 0x14, 0x30, 0x73, 0x02, + 0x1b, 0x64, 0xad, 0xb1, 0xb6, 0x19, 0x2c, 0x07, 0x32, 0xfe, 0x70, 0x14, 0x16, 0xfb, 0x8b, 0x5d, + 0xe4, 0x7d, 0x7d, 0x02, 0x2f, 0x1c, 0x2b, 0xa8, 0x1d, 0x3f, 0x87, 0x5f, 0x84, 0xf9, 0x55, 0x37, + 0xa4, 0x7e, 0xd7, 0x77, 0x64, 0xf4, 0xb0, 0x35, 0x2f, 0x90, 0x5e, 0x46, 0xa8, 0x64, 0xa7, 0x51, + 0xbd, 0xf0, 0x97, 0xc3, 0x77, 0x21, 0x55, 0xc9, 0x9e, 0x45, 0x81, 0xac, 0xc2, 0xb4, 0x52, 0xde, + 0xee, 0xed, 0xaa, 0x6f, 0xf5, 0x2a, 0xcd, 0x76, 0x4f, 0x75, 0xc1, 0x48, 0x20, 0xa1, 0x27, 0x53, + 0x68, 0x87, 0x4e, 0xf3, 0xd6, 0x83, 0xdb, 0x0d, 0x31, 0x9d, 0xdc, 0x93, 0x09, 0x4b, 0xad, 0x0f, + 0x1f, 0xed, 0x6b, 0x72, 0x53, 0x0c, 0xbc, 0xf8, 0x8b, 0x27, 0xe2, 0x84, 0x9f, 0x03, 0x88, 0xb7, + 0x92, 0x1a, 0x09, 0x20, 0xde, 0x7a, 0xba, 0xb3, 0xa2, 0x2c, 0x25, 0x6b, 0x30, 0x13, 0xff, 0xba, + 0xf7, 0xc8, 0x95, 0xef, 0x65, 0x5c, 0x05, 0xab, 0xec, 0x5c, 0x8f, 0xd5, 0xa9, 0xa2, 0x78, 0x02, + 0x8d, 0x2c, 0x41, 0xf1, 0x81, 0xe7, 0xef, 0xef, 0xb0, 0x39, 0x1e, 0x89, 0x2f, 0x0b, 0x8f, 0x44, + 0x99, 0x2a, 0x14, 0x4b, 0x38, 0xb6, 0x5d, 0x56, 0xdd, 0x87, 0x8e, 0xef, 0xa1, 0x7d, 0x83, 0x6a, + 0xe1, 0x47, 0xe3, 0x62, 0x2d, 0x06, 0x4b, 0x5c, 0x4c, 0x2e, 0xc1, 0x68, 0xb5, 0x19, 0x7a, 0xbe, + 0x60, 0x7f, 0x7c, 0xa5, 0xb0, 0x02, 0x6d, 0xa5, 0xb0, 0x02, 0x36, 0x88, 0x8c, 0x27, 0x8d, 0xc7, + 0x83, 0xa8, 0x33, 0x22, 0x56, 0xcb, 0x2e, 0x3b, 0x26, 0xdd, 0x41, 0xed, 0xa8, 0x16, 0x4e, 0x76, + 0x27, 0xa5, 0x57, 0x17, 0x60, 0xc6, 0x0f, 0x43, 0xdf, 0x25, 0xcf, 0xa4, 0xcb, 0x93, 0x2d, 0xf9, + 0x0d, 0x7b, 0x88, 0x25, 0xff, 0x5a, 0xe4, 0x02, 0xa9, 0x46, 0x55, 0xc2, 0x12, 0x55, 0xae, 0x11, + 0xce, 0x90, 0xfa, 0xfa, 0x2b, 0x9c, 0x64, 0xfd, 0xfd, 0xbd, 0xe2, 0x49, 0xd6, 0x9f, 0x18, 0xdf, + 0xfc, 0xb0, 0xe3, 0x5b, 0x18, 0x6a, 0x7c, 0xd9, 0xa1, 0x12, 0xc5, 0x32, 0xae, 0xdb, 0xa1, 0xc6, + 0x11, 0xa3, 0x00, 0xd4, 0x56, 0xd7, 0xd6, 0xe2, 0xfd, 0xe9, 0x28, 0x8a, 0x90, 0x80, 0x14, 0x46, + 0xd3, 0x42, 0x42, 0x02, 0x5f, 0x05, 0x67, 0x8c, 0x40, 0x9e, 0xf9, 0x0d, 0x74, 0xa8, 0x13, 0x8b, + 0x8d, 0x5b, 0xbf, 0x48, 0x31, 0x81, 0xfb, 0xda, 0x69, 0xef, 0x13, 0x1a, 0x52, 0x72, 0x9d, 0x8f, + 0x9f, 0x68, 0x9d, 0x73, 0x83, 0x6f, 0x7f, 0xc3, 0xdb, 0x75, 0xa4, 0xdb, 0x95, 0x34, 0xf8, 0xf6, + 0xad, 0x36, 0x2b, 0x4d, 0x18, 0x7c, 0x73, 0x50, 0xf2, 0x3a, 0x8c, 0xb1, 0x1f, 0xeb, 0x35, 0x61, + 0x92, 0x81, 0x4a, 0x0f, 0x44, 0xd2, 0x7d, 0xdd, 0x38, 0x90, 0x6c, 0x66, 0xb5, 0x63, 0x3b, 0x6d, + 0x11, 0x77, 0x27, 0x6e, 0x86, 0xb2, 0xd2, 0x64, 0x33, 0x08, 0x4a, 0x9a, 0x50, 0x32, 0xe9, 0x4e, + 0xdd, 0xf7, 0x42, 0xda, 0x0c, 0x69, 0x4b, 0x5c, 0xf4, 0xa4, 0xae, 0x63, 0xd9, 0xf3, 0xf8, 0x25, + 0x16, 0xdd, 0xa2, 0x72, 0xdf, 0x39, 0xac, 0x00, 0x2b, 0xe2, 0x8e, 0x94, 0x4c, 0xe4, 0x61, 0xf3, + 0xdf, 0x95, 0xc8, 0xea, 0xc1, 0xa6, 0x12, 0x25, 0xdf, 0x60, 0xac, 0x3e, 0x1a, 0x92, 0xb8, 0xb1, + 0x52, 0x9f, 0xc6, 0xde, 0xc8, 0x6c, 0xac, 0xa2, 0x8c, 0x76, 0x66, 0xa3, 0x99, 0x8d, 0x90, 0x77, + 0x60, 0x72, 0x65, 0x7d, 0xc5, 0x73, 0x77, 0x9c, 0xdd, 0xc6, 0x5a, 0x15, 0x6f, 0x8b, 0x42, 0x5e, + 0x6b, 0x3a, 0x56, 0x13, 0xcb, 0xad, 0x60, 0xcf, 0xd6, 0x42, 0x41, 0xc4, 0xf0, 0xe4, 0x26, 0x4c, + 0xcb, 0x9f, 0x26, 0xdd, 0x61, 0xf2, 0xda, 0xb4, 0xe2, 0x78, 0x1d, 0x51, 0x60, 0x03, 0xa1, 0x8b, + 0x6c, 0x09, 0x34, 0xb6, 0x18, 0x6b, 0xb4, 0xdb, 0xf6, 0x0e, 0xd8, 0xe7, 0x6d, 0x3a, 0xd4, 0xc7, + 0x6b, 0xa1, 0x58, 0x8c, 0xad, 0xa8, 0xc6, 0x0a, 0x1d, 0xdd, 0x10, 0x45, 0x47, 0x62, 0xa2, 0x9f, + 0x58, 0xe2, 0xf7, 0x9d, 0xc0, 0xd9, 0x76, 0xda, 0x4e, 0x78, 0x80, 0x17, 0x42, 0x21, 0xfb, 0xc8, + 0x7d, 0xf1, 0x30, 0xaa, 0x55, 0x45, 0xbf, 0x14, 0xaa, 0xf1, 0x2b, 0x79, 0x78, 0x76, 0x90, 0x72, + 0x84, 0x34, 0x74, 0x3e, 0x78, 0x71, 0x08, 0x85, 0xca, 0xf1, 0x9c, 0x70, 0xb5, 0xcf, 0x3d, 0x03, + 0x07, 0x23, 0x71, 0xcf, 0x50, 0x07, 0x23, 0x71, 0xe3, 0x78, 0x28, 0xd8, 0xdc, 0x47, 0x0d, 0x4a, + 0x70, 0x1d, 0x26, 0x56, 0x3c, 0x37, 0xa4, 0x8f, 0xc3, 0x44, 0x08, 0x1e, 0x5e, 0x98, 0x0c, 0xc8, + 0x20, 0x41, 0x8d, 0x7f, 0x53, 0x80, 0x73, 0x03, 0xb5, 0x03, 0x64, 0x53, 0x1f, 0xb5, 0x4b, 0xc3, + 0xa8, 0x14, 0x8e, 0x1f, 0xb6, 0xa5, 0x94, 0x01, 0xf3, 0xf1, 0x4e, 0xb3, 0x26, 0x10, 0x1e, 0x69, + 0xe4, 0x66, 0xdb, 0xdb, 0x46, 0xfd, 0x91, 0xe3, 0xee, 0x8a, 0x08, 0x25, 0xdc, 0x01, 0x14, 0x6b, + 0xad, 0xdd, 0xb6, 0xb7, 0xcd, 0xf5, 0x50, 0x8e, 0xab, 0x8a, 0x45, 0x19, 0xd8, 0x8b, 0xff, 0x26, + 0x27, 0x06, 0xfe, 0xd3, 0x30, 0x8e, 0x9f, 0x1f, 0x0d, 0x3b, 0xd7, 0xec, 0x23, 0x67, 0x77, 0x74, + 0xcd, 0x3e, 0x07, 0x23, 0xd7, 0xa0, 0xb8, 0x62, 0xb7, 0xdb, 0x4a, 0xd0, 0x23, 0x54, 0x1a, 0x34, + 0xb1, 0x2c, 0x61, 0xd9, 0x2f, 0x01, 0xd9, 0x51, 0xc8, 0xff, 0x56, 0xce, 0x1f, 0x64, 0xc0, 0x02, + 0x2d, 0x71, 0x04, 0x29, 0xc0, 0x18, 0xe1, 0xbd, 0xe9, 0x45, 0x61, 0x55, 0x78, 0x84, 0x77, 0x56, + 0xa0, 0x45, 0x78, 0x67, 0x05, 0xc6, 0xaf, 0x16, 0xe0, 0xb9, 0xc1, 0x6a, 0x33, 0xb2, 0xa5, 0x4f, + 0xeb, 0x2b, 0x43, 0x29, 0xdb, 0x8e, 0x9f, 0x57, 0x99, 0x2f, 0x81, 0x0f, 0xc8, 0xc5, 0xb4, 0x37, + 0xe5, 0x77, 0x0f, 0x2b, 0x8a, 0xbb, 0xc8, 0x2d, 0xcf, 0x71, 0x95, 0x77, 0xde, 0xaf, 0xa7, 0x04, + 0x85, 0xc9, 0xa5, 0xeb, 0xc3, 0x7d, 0x59, 0x8c, 0xc7, 0x79, 0xd5, 0xb0, 0x02, 0xc6, 0xe7, 0xa1, + 0x9c, 0x44, 0x25, 0x17, 0x60, 0x04, 0x3f, 0x40, 0x71, 0x09, 0x4d, 0x50, 0xc0, 0xfa, 0xc5, 0x3b, + 0x62, 0xed, 0x60, 0x1c, 0x28, 0x35, 0x66, 0x81, 0xc0, 0x14, 0x71, 0xa0, 0xb4, 0x80, 0x07, 0x7a, + 0x1c, 0x28, 0x15, 0xc9, 0xf8, 0x93, 0x1c, 0x9c, 0xed, 0xab, 0xf7, 0x20, 0x75, 0x7d, 0xc2, 0x5e, + 0x3a, 0x4e, 0x51, 0x72, 0xec, 0x5c, 0x2d, 0xfe, 0x84, 0x5c, 0xfb, 0xef, 0x42, 0xa9, 0xd1, 0xdb, + 0x4e, 0x5e, 0x17, 0x79, 0x94, 0x36, 0xa5, 0x5c, 0x3d, 0x15, 0x55, 0x78, 0xd6, 0x7f, 0xe9, 0xe8, + 0x2f, 0xac, 0x33, 0x15, 0x93, 0xf0, 0x28, 0x50, 0x49, 0x3a, 0x0e, 0x96, 0x8e, 0x64, 0xfc, 0x72, + 0x3e, 0xfb, 0xde, 0x7d, 0x73, 0xa5, 0x7e, 0x92, 0x7b, 0xf7, 0xcd, 0x95, 0xfa, 0xf1, 0x7d, 0xff, + 0xaf, 0x64, 0xdf, 0xb9, 0xa1, 0x12, 0xe7, 0xa2, 0xf2, 0x3d, 0x45, 0x1a, 0x2a, 0x09, 0x8e, 0x1b, + 0x24, 0x0c, 0x95, 0x04, 0x30, 0x79, 0x03, 0x26, 0x36, 0x3c, 0x1e, 0xa2, 0x4a, 0xf6, 0x98, 0x47, + 0xf2, 0x90, 0x85, 0x2a, 0xcb, 0x8d, 0x20, 0xd9, 0x55, 0x47, 0x9f, 0x78, 0x69, 0xf9, 0x8e, 0x57, + 0x9d, 0xc4, 0x72, 0xd1, 0x5f, 0x1d, 0x74, 0x34, 0xe3, 0x1f, 0x8d, 0x82, 0x71, 0xbc, 0xce, 0x94, + 0x7c, 0x49, 0x1f, 0xbb, 0xcb, 0x43, 0x6b, 0x5b, 0x87, 0x62, 0xe3, 0xd5, 0x5e, 0xcb, 0xa1, 0x6e, + 0x53, 0x8f, 0x2f, 0x25, 0xca, 0x54, 0x16, 0x28, 0xe1, 0x3e, 0x4a, 0xbc, 0x84, 0xc5, 0x7f, 0x59, + 0x88, 0xb7, 0x5a, 0xe2, 0xb8, 0xcd, 0x7d, 0x84, 0xe3, 0x96, 0xdc, 0x86, 0xb2, 0x5a, 0xa2, 0xe8, + 0xed, 0x50, 0x1a, 0xd2, 0x08, 0x25, 0x3e, 0x2a, 0x85, 0xa8, 0x9f, 0xd9, 0x85, 0xe1, 0xcf, 0xec, + 0x84, 0xde, 0x70, 0xe4, 0x64, 0x7a, 0x43, 0x11, 0x8f, 0x2a, 0x10, 0x87, 0xd6, 0xa8, 0x1e, 0x8f, + 0x2a, 0xe3, 0xe0, 0x52, 0xc1, 0x65, 0x48, 0x2d, 0xfc, 0xa9, 0x44, 0x94, 0x89, 0x42, 0x6a, 0x71, + 0xfc, 0xac, 0x90, 0x5a, 0x11, 0x0a, 0x3b, 0x00, 0xcd, 0x9e, 0xcb, 0x53, 0x89, 0x8c, 0xc7, 0x07, + 0xa0, 0xdf, 0x73, 0xad, 0x64, 0x3a, 0x91, 0x08, 0xd0, 0xf8, 0xa7, 0x23, 0xd9, 0x02, 0x47, 0xac, + 0x56, 0x3f, 0x81, 0xc0, 0x11, 0x21, 0x7d, 0x32, 0x2b, 0x75, 0x0b, 0xe6, 0xa4, 0xf1, 0x34, 0xb6, + 0xde, 0xa2, 0xfe, 0x96, 0xb9, 0x21, 0xa6, 0x18, 0xd5, 0x58, 0x91, 0xd9, 0x75, 0x57, 0xd4, 0x5b, + 0x3d, 0x5f, 0x53, 0x63, 0x65, 0xe0, 0x2f, 0xfe, 0x13, 0xa9, 0xa5, 0x53, 0x27, 0x01, 0x1d, 0xdd, + 0x73, 0x59, 0x93, 0xd0, 0xeb, 0x69, 0xd3, 0xa8, 0xa3, 0x70, 0xde, 0x1b, 0x69, 0x54, 0xb7, 0x74, + 0xf9, 0x53, 0xd5, 0xc2, 0xea, 0x54, 0x12, 0x48, 0x64, 0x17, 0xce, 0xc6, 0xe2, 0xb9, 0x72, 0xfb, + 0x40, 0x8a, 0xbc, 0xc3, 0x97, 0x8e, 0x0e, 0x2b, 0x2f, 0x29, 0xe2, 0xbd, 0x7a, 0x89, 0x49, 0x50, + 0xef, 0x4f, 0x8b, 0xf1, 0xdb, 0x65, 0xdf, 0x76, 0x9b, 0x7b, 0xca, 0x9a, 0x47, 0x7e, 0xbb, 0x8d, + 0xa5, 0xa9, 0xa8, 0x3a, 0x31, 0xb0, 0xf1, 0xb7, 0xf3, 0xd9, 0x6a, 0x0e, 0xf1, 0x7a, 0x72, 0x02, + 0x35, 0x07, 0xc7, 0x38, 0xfe, 0x94, 0xf8, 0x47, 0xf2, 0x94, 0x78, 0x09, 0xc6, 0x37, 0xa9, 0x6b, + 0xbb, 0x51, 0xb4, 0x2a, 0xb4, 0xe2, 0x08, 0x79, 0x91, 0x29, 0xeb, 0xc8, 0xfb, 0x40, 0xea, 0xb6, + 0x4f, 0xdd, 0x70, 0xc5, 0xeb, 0x74, 0x6d, 0x3f, 0xec, 0x60, 0xb2, 0x15, 0x7e, 0x34, 0x3c, 0x7f, + 0x74, 0x58, 0x39, 0xd7, 0xc5, 0x5a, 0xab, 0xa9, 0x54, 0xab, 0x02, 0x6a, 0x1a, 0x99, 0x5c, 0x81, + 0x71, 0x69, 0x9c, 0x50, 0x88, 0x03, 0x58, 0xa6, 0x0d, 0x13, 0x24, 0x94, 0xf1, 0x2f, 0x47, 0xe1, + 0xfc, 0x71, 0x4f, 0x45, 0x64, 0x07, 0xe0, 0x9e, 0xbb, 0xed, 0xd9, 0x7e, 0x8b, 0x89, 0xd0, 0xb9, + 0x63, 0x05, 0x2d, 0x15, 0xf9, 0x72, 0x8c, 0xc9, 0x2a, 0xb9, 0x13, 0xaf, 0x17, 0x95, 0x99, 0x0a, + 0x65, 0xf2, 0x55, 0x28, 0x9a, 0xb4, 0xe9, 0x3d, 0xa4, 0x42, 0x1d, 0x38, 0xb9, 0xf4, 0x99, 0x61, + 0x5b, 0x91, 0x78, 0xd8, 0x06, 0x7a, 0x37, 0xfa, 0xa2, 0xc4, 0x8c, 0x68, 0x92, 0xaf, 0xc1, 0x24, + 0xcf, 0xa9, 0x53, 0xdd, 0x09, 0x85, 0xca, 0xf0, 0xf8, 0xe8, 0x24, 0x39, 0xc6, 0x24, 0x79, 0x96, + 0x1e, 0xcb, 0xde, 0xd1, 0xbc, 0x25, 0x78, 0x74, 0x12, 0x85, 0xe4, 0xe2, 0x7f, 0x9a, 0x87, 0x69, + 0xbd, 0xc3, 0x64, 0x03, 0xca, 0xeb, 0xae, 0x13, 0x3a, 0x76, 0x5b, 0x37, 0x5f, 0x15, 0xf7, 0x56, + 0x87, 0xd7, 0x59, 0x99, 0x66, 0xac, 0x29, 0x4c, 0xb6, 0x66, 0xd8, 0xd4, 0x05, 0x21, 0xb7, 0x9a, + 0xe0, 0xc1, 0x64, 0xc5, 0x26, 0x7e, 0x9e, 0xc7, 0x2e, 0x8e, 0x6b, 0x2d, 0x1e, 0xbe, 0x59, 0x0f, + 0x94, 0x99, 0x44, 0x26, 0x0f, 0x81, 0xdc, 0xe9, 0x05, 0x21, 0xaf, 0xa1, 0xfe, 0x32, 0xdd, 0xf1, + 0xfc, 0x61, 0xc2, 0x92, 0xbc, 0x22, 0x06, 0xe7, 0xb9, 0x4e, 0x2f, 0x08, 0x2d, 0x5f, 0xa0, 0x5b, + 0xdb, 0x88, 0x9f, 0x18, 0xa4, 0x8c, 0x16, 0x16, 0xef, 0x40, 0x49, 0x9d, 0x35, 0xb4, 0x22, 0x73, + 0x3a, 0x8e, 0xb4, 0xe7, 0xe7, 0x56, 0x64, 0xac, 0xc0, 0xe4, 0xe5, 0xe4, 0x59, 0x11, 0xc7, 0x2b, + 0x1f, 0x1b, 0x5b, 0xc5, 0xf1, 0xba, 0x8c, 0x1f, 0xc9, 0xc1, 0xe9, 0x6c, 0x0b, 0x24, 0xf2, 0x61, + 0xe2, 0xa5, 0x34, 0x37, 0xe8, 0x1d, 0x59, 0x9a, 0x2d, 0x7d, 0xb4, 0xb7, 0x52, 0xe3, 0x2f, 0x8f, + 0xa4, 0xa4, 0xac, 0x0c, 0x8a, 0xe4, 0x66, 0xe6, 0x3c, 0xe6, 0x94, 0x73, 0x31, 0x3d, 0x8f, 0x99, + 0xb3, 0xf7, 0x36, 0x4c, 0x23, 0xe1, 0x78, 0x71, 0x29, 0x3a, 0x56, 0xfe, 0xc9, 0xf1, 0xd2, 0x32, + 0x13, 0xb0, 0x64, 0x1d, 0x08, 0x96, 0x2c, 0x7b, 0xa1, 0xe2, 0x3f, 0xaf, 0x5c, 0x34, 0x39, 0x85, + 0x6d, 0x2f, 0xb4, 0x54, 0x4f, 0xfa, 0x0c, 0x24, 0xf2, 0x39, 0x98, 0x92, 0xd3, 0xb9, 0x82, 0xb7, + 0x9a, 0x11, 0x9c, 0x46, 0xbc, 0x0f, 0xc9, 0xbd, 0x68, 0xa1, 0x28, 0x6a, 0xea, 0x80, 0xa4, 0xc3, + 0x23, 0x2a, 0x89, 0x42, 0xda, 0xaa, 0x86, 0x43, 0x84, 0xad, 0x7a, 0x59, 0xac, 0xbe, 0x67, 0x78, + 0x16, 0x2d, 0x89, 0x6b, 0xd9, 0x61, 0x62, 0xe9, 0x25, 0x69, 0x93, 0x5d, 0x98, 0x52, 0xb2, 0x6b, + 0x55, 0xc3, 0x21, 0x92, 0xbb, 0xbd, 0x24, 0x1a, 0x3b, 0xab, 0xa6, 0xec, 0x4a, 0x37, 0xa5, 0xd3, + 0x35, 0x7e, 0x22, 0x0f, 0xd3, 0xfc, 0xb6, 0xc8, 0xcd, 0xd0, 0x9e, 0x5a, 0x7b, 0xc1, 0xb7, 0x34, + 0x7b, 0x41, 0x19, 0x41, 0x5d, 0xed, 0xda, 0x50, 0xd6, 0xdd, 0x7b, 0x40, 0xd2, 0x38, 0xc4, 0x84, + 0x92, 0x5a, 0x3a, 0xd8, 0xb6, 0xef, 0x6a, 0x1c, 0x6c, 0x5f, 0x5c, 0xd6, 0xd1, 0x5a, 0x33, 0x30, + 0x35, 0x1a, 0xc6, 0x8f, 0xe7, 0x61, 0x4a, 0xb1, 0xee, 0x7e, 0x6a, 0x07, 0xfe, 0xf3, 0xda, 0xc0, + 0x2f, 0x44, 0x01, 0x44, 0xa2, 0x9e, 0x0d, 0x35, 0xee, 0x3d, 0x98, 0x4d, 0xa1, 0x24, 0x8d, 0xe4, + 0x73, 0xc3, 0x18, 0xc9, 0xbf, 0x96, 0x8e, 0xdc, 0xcd, 0xf3, 0xf6, 0x45, 0x71, 0x5c, 0xd5, 0x50, + 0xe1, 0x3f, 0x95, 0x87, 0x79, 0xf1, 0x0b, 0x53, 0x5d, 0x70, 0x75, 0xc9, 0x53, 0x3b, 0x17, 0x55, + 0x6d, 0x2e, 0x2a, 0xfa, 0x5c, 0x28, 0x1d, 0xec, 0x3f, 0x25, 0xc6, 0x8f, 0x00, 0x2c, 0xf4, 0x43, + 0x18, 0x3a, 0xb2, 0x58, 0x1c, 0xb9, 0x24, 0x3f, 0x44, 0xe4, 0x92, 0x0d, 0x28, 0x63, 0x53, 0xc2, + 0xbd, 0x29, 0xd8, 0x32, 0xd7, 0xc5, 0x20, 0xa1, 0xf4, 0xc1, 0xf3, 0x91, 0x08, 0x9f, 0xa8, 0x20, + 0xa1, 0xc9, 0x4f, 0x61, 0x92, 0x5f, 0xcc, 0xc1, 0x34, 0x16, 0xae, 0x3e, 0x64, 0xe2, 0x26, 0x23, + 0x36, 0x22, 0x42, 0x5a, 0x44, 0x16, 0x80, 0x8d, 0xd0, 0x77, 0xdc, 0x5d, 0x61, 0x02, 0xb8, 0x2d, + 0x4c, 0x00, 0xdf, 0xe6, 0xa6, 0x8b, 0x97, 0x9b, 0x5e, 0xe7, 0xca, 0xae, 0x6f, 0x3f, 0x74, 0xb8, + 0xe3, 0x82, 0xdd, 0xbe, 0x12, 0xa7, 0x9b, 0xed, 0x3a, 0x89, 0x44, 0xb0, 0x82, 0x14, 0x9a, 0x57, + 0xf2, 0x0f, 0xa5, 0xd8, 0x6c, 0xf2, 0xc1, 0x41, 0xff, 0x22, 0xf2, 0x7d, 0x70, 0x86, 0xab, 0x6e, + 0x57, 0x3c, 0x37, 0x74, 0xdc, 0x9e, 0xd7, 0x0b, 0x96, 0xed, 0xe6, 0x7e, 0xaf, 0x1b, 0x88, 0xc0, + 0x43, 0xd8, 0xf3, 0x66, 0x54, 0x69, 0x6d, 0xf3, 0x5a, 0x2d, 0xf8, 0x5f, 0x36, 0x01, 0xb2, 0x06, + 0xb3, 0xbc, 0xaa, 0xda, 0x0b, 0xbd, 0x46, 0xd3, 0x6e, 0x33, 0x81, 0x78, 0x1c, 0xa9, 0x72, 0x3b, + 0xa7, 0x5e, 0xe8, 0x59, 0x01, 0x2f, 0x57, 0xdf, 0x1f, 0x52, 0x48, 0x64, 0x1d, 0x66, 0x4c, 0x6a, + 0xb7, 0xee, 0xd8, 0x8f, 0x57, 0xec, 0xae, 0xdd, 0x74, 0x42, 0x9e, 0xf3, 0xa2, 0xc0, 0x55, 0x0a, + 0x3e, 0xb5, 0x5b, 0x56, 0xc7, 0x7e, 0x6c, 0x35, 0x45, 0xa5, 0xfe, 0x86, 0xad, 0xe1, 0x45, 0xa4, + 0x1c, 0x37, 0x22, 0x35, 0x91, 0x24, 0xe5, 0xb8, 0xfd, 0x49, 0xc5, 0x78, 0x92, 0x14, 0x4f, 0x3e, + 0xc6, 0x5d, 0x31, 0xe1, 0x7c, 0xee, 0x62, 0x4e, 0x21, 0x25, 0x32, 0x96, 0xa1, 0x5b, 0x66, 0x92, + 0x94, 0x82, 0xc7, 0x56, 0xde, 0x03, 0xdf, 0x09, 0xa9, 0xda, 0xc3, 0x49, 0xfc, 0x2c, 0x1c, 0x7f, + 0x74, 0x62, 0xed, 0xd7, 0xc5, 0x14, 0x66, 0x4c, 0x4d, 0xe9, 0x64, 0x29, 0x45, 0x2d, 0xbb, 0x97, + 0x29, 0xcc, 0x88, 0x9a, 0xda, 0xcf, 0x29, 0xec, 0xa7, 0x42, 0xad, 0x4f, 0x47, 0x53, 0x98, 0xe4, + 0x2e, 0x1b, 0xb4, 0x90, 0xdd, 0xdc, 0x3d, 0x57, 0xf8, 0x88, 0x4e, 0xe3, 0xa7, 0xbd, 0x28, 0xc4, + 0x86, 0xb2, 0x2f, 0xab, 0xad, 0x0c, 0x8f, 0xd1, 0x24, 0x32, 0xf9, 0x0b, 0x30, 0xb3, 0x15, 0xd0, + 0x1b, 0xeb, 0xf5, 0x86, 0x8c, 0x48, 0x8d, 0x4f, 0x66, 0xd3, 0x4b, 0x57, 0x8f, 0x61, 0x3a, 0x97, + 0x55, 0x1c, 0xcc, 0xde, 0xca, 0xe7, 0xad, 0x17, 0x50, 0x6b, 0xc7, 0xe9, 0x06, 0x51, 0x78, 0x7f, + 0x75, 0xde, 0x12, 0x4d, 0x19, 0x6b, 0x30, 0x9b, 0x22, 0x43, 0xa6, 0x01, 0x58, 0xa1, 0xb5, 0x75, + 0xb7, 0xb1, 0xba, 0x59, 0xfe, 0x14, 0x29, 0x43, 0x09, 0x7f, 0xaf, 0xde, 0xad, 0x2e, 0x6f, 0xac, + 0xd6, 0xca, 0x39, 0x32, 0x0b, 0x53, 0x58, 0x52, 0x5b, 0x6f, 0xf0, 0xa2, 0x3c, 0x4f, 0xba, 0x67, + 0x96, 0xf9, 0xd6, 0x0d, 0xf1, 0xb1, 0x85, 0x9d, 0x29, 0xc6, 0x5f, 0xcf, 0xc3, 0x59, 0x79, 0xac, + 0xd0, 0xf0, 0x91, 0xe7, 0xef, 0x3b, 0xee, 0xee, 0x53, 0x7e, 0x3a, 0xdc, 0xd0, 0x4e, 0x87, 0x17, + 0x13, 0x27, 0x75, 0xa2, 0x97, 0x03, 0x8e, 0x88, 0x6f, 0x4f, 0xc0, 0xb9, 0x81, 0x58, 0xe4, 0x7d, + 0x76, 0x9a, 0x3b, 0xd4, 0x0d, 0xd7, 0x5b, 0x6d, 0xca, 0x44, 0x54, 0xaf, 0x17, 0x0a, 0x9f, 0xe4, + 0x17, 0xf0, 0x45, 0x09, 0x2b, 0x2d, 0xa7, 0xd5, 0xa6, 0x56, 0xc8, 0xab, 0xb5, 0xe5, 0x96, 0xc6, + 0x66, 0x24, 0xa3, 0x4c, 0xd2, 0xeb, 0x6e, 0x48, 0xfd, 0x87, 0xe8, 0xcb, 0x13, 0x91, 0xdc, 0xa7, + 0xb4, 0x6b, 0xd9, 0xac, 0xd6, 0x72, 0x44, 0xb5, 0x4e, 0x32, 0x85, 0x4d, 0x6e, 0x28, 0x24, 0x51, + 0xca, 0xbf, 0x63, 0x3f, 0x16, 0xfe, 0x00, 0x22, 0xc3, 0x49, 0x44, 0x92, 0x47, 0xfb, 0xe8, 0xd8, + 0x8f, 0xcd, 0x34, 0x0a, 0xf9, 0x00, 0x4e, 0x89, 0x03, 0x48, 0x44, 0xa3, 0x94, 0x3d, 0xe6, 0xb1, + 0x2e, 0x5f, 0x66, 0x17, 0x33, 0xe9, 0xd2, 0x2b, 0x23, 0xcc, 0x66, 0xf5, 0x3a, 0x9b, 0x0a, 0xd9, + 0x64, 0x07, 0x72, 0x62, 0x38, 0xee, 0xd0, 0x20, 0x90, 0x21, 0x5d, 0x84, 0x6e, 0x56, 0x1d, 0x4c, + 0xab, 0xc3, 0xeb, 0xcd, 0xbe, 0x98, 0x64, 0x0d, 0xa6, 0x1f, 0xd0, 0x6d, 0x75, 0x7e, 0xc6, 0x22, + 0x56, 0x55, 0x7e, 0x44, 0xb7, 0xfb, 0x4f, 0x4e, 0x02, 0x8f, 0x38, 0xf8, 0xea, 0xfd, 0xf8, 0x60, + 0x83, 0x5d, 0x9c, 0x5d, 0xea, 0xe3, 0xfd, 0x77, 0x1c, 0x99, 0xc1, 0x42, 0x2c, 0x21, 0xeb, 0xf5, + 0x42, 0x77, 0x84, 0x51, 0x14, 0xda, 0xa2, 0xdc, 0x4a, 0xe4, 0x61, 0x4e, 0x53, 0x25, 0x5f, 0x83, + 0x19, 0xd3, 0xeb, 0x85, 0x8e, 0xbb, 0xdb, 0x60, 0x37, 0x4c, 0xba, 0xcb, 0x0f, 0xa4, 0x38, 0x60, + 0x76, 0xa2, 0x56, 0xd8, 0x5a, 0xf1, 0x42, 0x2b, 0x10, 0xa5, 0xda, 0x89, 0xa0, 0x23, 0x90, 0xaf, + 0xc2, 0x34, 0x8f, 0xea, 0x17, 0x35, 0x30, 0xa1, 0x25, 0x63, 0xd4, 0x2b, 0xef, 0x5f, 0x15, 0xe6, + 0xdb, 0x58, 0x9a, 0xd5, 0x40, 0x82, 0x1a, 0xf9, 0xb2, 0x18, 0xac, 0xba, 0xe3, 0xee, 0x46, 0xcb, + 0x18, 0x70, 0xe4, 0x5f, 0x8f, 0x87, 0xa4, 0xcb, 0x3e, 0x57, 0x2e, 0xe3, 0x3e, 0xbe, 0x28, 0x69, + 0x3a, 0x24, 0x84, 0x73, 0xd5, 0x20, 0x70, 0x82, 0x50, 0x78, 0xee, 0xaf, 0x3e, 0xa6, 0xcd, 0x1e, + 0x03, 0x7e, 0xe0, 0xf9, 0xfb, 0xd4, 0xe7, 0xde, 0x90, 0xa3, 0xcb, 0x97, 0x8f, 0x0e, 0x2b, 0xaf, + 0xd8, 0x08, 0x68, 0x09, 0x67, 0x7f, 0x8b, 0x4a, 0x50, 0xeb, 0x11, 0x87, 0x55, 0xfa, 0x30, 0x98, + 0x28, 0xf9, 0x2a, 0x9c, 0x5e, 0xb1, 0x03, 0xba, 0xee, 0x06, 0xd4, 0x0d, 0x9c, 0xd0, 0x79, 0x48, + 0xc5, 0xa0, 0xe2, 0xe1, 0x57, 0xe4, 0x91, 0xd2, 0x9b, 0x76, 0xc0, 0x36, 0x66, 0x04, 0x62, 0x89, + 0x49, 0x51, 0x03, 0xb1, 0x67, 0x53, 0x21, 0x26, 0x4c, 0x37, 0x1a, 0x6b, 0x35, 0xc7, 0x8e, 0xf6, + 0xd5, 0x14, 0x8e, 0xd7, 0x2b, 0xf8, 0xb8, 0x14, 0xec, 0x59, 0x2d, 0xc7, 0x8e, 0x36, 0x54, 0x9f, + 0xc1, 0x4a, 0x50, 0x30, 0x0e, 0x73, 0x50, 0x4e, 0x4e, 0x25, 0xf9, 0x22, 0x4c, 0x70, 0x47, 0x0e, + 0x1a, 0xec, 0x09, 0xfd, 0x8b, 0xf4, 0x0b, 0x88, 0xca, 0x75, 0x24, 0x11, 0x0c, 0x88, 0xbb, 0x89, + 0x50, 0xd5, 0x7c, 0x74, 0xed, 0x53, 0x66, 0x4c, 0x8c, 0xb4, 0xa0, 0xc4, 0x67, 0x8b, 0x62, 0xb0, + 0xff, 0x44, 0x3c, 0x03, 0xb5, 0x2a, 0x41, 0x9f, 0x1b, 0x4d, 0xf3, 0x35, 0xc1, 0x01, 0xb4, 0x26, + 0x34, 0xaa, 0xcb, 0x00, 0x45, 0x89, 0x68, 0x9c, 0x85, 0x33, 0x7d, 0xbe, 0xd9, 0x78, 0x88, 0x3a, + 0xe7, 0x3e, 0x2d, 0x92, 0x2f, 0xc2, 0x3c, 0x22, 0xae, 0x78, 0xae, 0x4b, 0x9b, 0x21, 0xb2, 0x23, + 0xf9, 0xfe, 0x5b, 0xe0, 0xa6, 0x9f, 0xbc, 0xbf, 0xcd, 0x08, 0xc0, 0x4a, 0x3e, 0x03, 0x67, 0x52, + 0x30, 0x7e, 0x3e, 0x0f, 0x0b, 0x82, 0xc3, 0x99, 0xb4, 0xe9, 0xa1, 0xf6, 0xf1, 0x29, 0x3f, 0x51, + 0x57, 0xb5, 0x13, 0xf5, 0x85, 0x28, 0xaa, 0x69, 0x56, 0x27, 0x07, 0x1c, 0xa8, 0xbf, 0x9c, 0x83, + 0x67, 0x07, 0x21, 0x45, 0x5a, 0xc5, 0x5c, 0x96, 0x56, 0x91, 0x74, 0x61, 0x0e, 0x27, 0x74, 0x65, + 0x8f, 0x36, 0xf7, 0x31, 0x10, 0x0b, 0xfa, 0x27, 0xe7, 0xfb, 0x58, 0x70, 0xbd, 0x96, 0x69, 0xc1, + 0x75, 0x9a, 0xaf, 0xb2, 0x26, 0xd2, 0xe0, 0x31, 0x5e, 0xf6, 0xe9, 0x41, 0x60, 0x66, 0x91, 0x36, + 0x7e, 0x3a, 0xcf, 0xae, 0x6c, 0xe1, 0x5e, 0xdd, 0xa7, 0x3b, 0xd4, 0xa7, 0x6e, 0x93, 0x7e, 0x8f, + 0xf9, 0x99, 0xea, 0x9d, 0x1b, 0x4a, 0x83, 0xf1, 0xad, 0x69, 0x98, 0xcf, 0x42, 0x63, 0xe3, 0xa2, + 0x5c, 0x9a, 0x8b, 0x32, 0x30, 0x80, 0xb8, 0x2a, 0x7f, 0x33, 0x07, 0xa5, 0x06, 0x6d, 0x7a, 0x6e, + 0xeb, 0x06, 0x9a, 0xd8, 0x8a, 0xd1, 0xb1, 0xb9, 0xd0, 0xc0, 0xca, 0xad, 0x9d, 0x84, 0xed, 0xed, + 0x77, 0x0f, 0x2b, 0x5f, 0x18, 0xee, 0xae, 0xda, 0xf4, 0x50, 0xf7, 0x19, 0x62, 0xe6, 0xc4, 0xa8, + 0x09, 0xfe, 0x35, 0xa6, 0xd6, 0x2c, 0x59, 0x86, 0x29, 0xb1, 0x61, 0x3d, 0x35, 0x3d, 0x04, 0x0f, + 0xfd, 0x2a, 0x2b, 0x52, 0xcf, 0xa7, 0x1a, 0x0a, 0xb9, 0x06, 0x85, 0xad, 0xa5, 0x1b, 0x62, 0x16, + 0x64, 0x88, 0xa3, 0xad, 0xa5, 0x1b, 0xa8, 0x10, 0x63, 0x97, 0x8c, 0xa9, 0xde, 0x92, 0x66, 0xbc, + 0xba, 0xb5, 0x74, 0x83, 0xfc, 0x45, 0x38, 0x55, 0x73, 0x02, 0xd1, 0x04, 0xf7, 0x79, 0x6e, 0x61, + 0xa4, 0x8f, 0xb1, 0x3e, 0xeb, 0xf7, 0xb3, 0x99, 0xeb, 0xf7, 0xf9, 0x56, 0x44, 0xc4, 0xe2, 0x0e, + 0xd5, 0xad, 0x64, 0x1a, 0x8c, 0xec, 0x76, 0xc8, 0x87, 0x30, 0x8d, 0x6f, 0x63, 0xe8, 0x06, 0x8e, + 0xf9, 0xd7, 0xc6, 0xfb, 0xb4, 0xfc, 0xe9, 0xcc, 0x96, 0x17, 0x79, 0x40, 0x3e, 0x74, 0x26, 0xc7, + 0x5c, 0x6d, 0xda, 0xbd, 0x5f, 0xa3, 0x4c, 0x6e, 0xc1, 0x8c, 0x10, 0xc0, 0xee, 0xed, 0x6c, 0xee, + 0xd1, 0x9a, 0x7d, 0x20, 0xec, 0x4e, 0xf1, 0x4e, 0x27, 0xa4, 0x36, 0xcb, 0xdb, 0xb1, 0xc2, 0x3d, + 0x6a, 0xb5, 0x6c, 0x4d, 0x54, 0x49, 0x20, 0x92, 0x6f, 0xc0, 0xe4, 0x86, 0xd7, 0x64, 0xb2, 0x37, + 0xf2, 0x06, 0x6e, 0x8a, 0xfa, 0x25, 0xb6, 0x95, 0xdb, 0xbc, 0x38, 0x21, 0x50, 0x7d, 0xf7, 0xb0, + 0xf2, 0xd6, 0x49, 0x97, 0x8d, 0xd2, 0x80, 0xa9, 0xb6, 0x46, 0x56, 0xa0, 0xf8, 0x80, 0x6e, 0xb3, + 0xde, 0x26, 0x33, 0xb1, 0xcb, 0x62, 0x61, 0xa4, 0x2e, 0x7e, 0x69, 0x46, 0xea, 0xa2, 0x8c, 0xf8, + 0x30, 0x8b, 0xe3, 0x53, 0xb7, 0x83, 0xe0, 0x91, 0xe7, 0xb7, 0x30, 0x05, 0x66, 0x3f, 0x2b, 0xd7, + 0xa5, 0xcc, 0xc1, 0x7f, 0x96, 0x0f, 0x7e, 0x57, 0xa1, 0xa0, 0x8a, 0x90, 0x29, 0xf2, 0xe4, 0x6b, + 0x30, 0x2d, 0x82, 0x9b, 0xdd, 0xb9, 0x51, 0xc5, 0x9d, 0x50, 0xd2, 0xe2, 0xa5, 0xe8, 0x95, 0xf2, + 0xbd, 0x0a, 0xcb, 0xa2, 0xb8, 0x3c, 0x9d, 0x1d, 0x5b, 0x7f, 0x78, 0x56, 0x51, 0x48, 0x1d, 0x26, + 0x6b, 0xf4, 0xa1, 0xd3, 0xa4, 0x18, 0xd3, 0x41, 0xb8, 0x40, 0x46, 0xa9, 0x9d, 0xe3, 0x1a, 0xae, + 0x8d, 0x69, 0x61, 0x01, 0x8f, 0x10, 0xa1, 0xbb, 0xaf, 0x44, 0x80, 0xe4, 0x3a, 0x14, 0xd6, 0x6b, + 0x75, 0xe1, 0x01, 0x39, 0x1b, 0x85, 0x10, 0xac, 0xcb, 0x44, 0xb8, 0x68, 0x17, 0xee, 0xb4, 0x34, + 0xff, 0xc9, 0xf5, 0x5a, 0x9d, 0xec, 0xc0, 0x14, 0x0e, 0xc0, 0x1a, 0xb5, 0xf9, 0xd8, 0xce, 0xf4, + 0x19, 0xdb, 0xcb, 0x99, 0x63, 0xbb, 0xc0, 0xc7, 0x76, 0x4f, 0x60, 0x6b, 0x99, 0x3d, 0x55, 0xb2, + 0x4c, 0xa8, 0x15, 0xd9, 0x86, 0x65, 0x3e, 0xca, 0xcd, 0x0d, 0xb4, 0x7b, 0x15, 0x42, 0xad, 0x4c, + 0x4e, 0x1c, 0x25, 0xc8, 0xec, 0xeb, 0x60, 0x9d, 0xa6, 0x43, 0x3e, 0x0f, 0x23, 0xf7, 0xf6, 0x43, + 0x5b, 0xf8, 0x3a, 0xca, 0x71, 0x64, 0x45, 0xb2, 0xfb, 0xa8, 0x87, 0xf4, 0xf6, 0xb5, 0xa0, 0xd4, + 0x88, 0xc3, 0xa6, 0x62, 0xcd, 0xf6, 0x5b, 0x8f, 0x6c, 0x1f, 0x03, 0xeb, 0xcc, 0x69, 0x24, 0x94, + 0x1a, 0x3e, 0x15, 0x7b, 0xa2, 0x20, 0xf1, 0xc0, 0xa9, 0x92, 0x20, 0xdf, 0x07, 0x67, 0x03, 0x67, + 0xd7, 0xb5, 0xc3, 0x9e, 0x4f, 0x2d, 0xbb, 0xbd, 0xeb, 0xf9, 0x4e, 0xb8, 0xd7, 0xb1, 0x82, 0x9e, + 0x13, 0x52, 0x74, 0x3a, 0x9c, 0x8e, 0x64, 0xc6, 0x86, 0x84, 0xab, 0x4a, 0xb0, 0x06, 0x83, 0x32, + 0xcf, 0x04, 0xd9, 0x15, 0xe4, 0xcb, 0x30, 0xa5, 0xb2, 0xe4, 0x60, 0xe1, 0xd4, 0xf9, 0xc2, 0xc5, + 0xe9, 0xe8, 0xea, 0x91, 0x64, 0xe1, 0x32, 0x29, 0x8e, 0x72, 0x46, 0x04, 0x7a, 0x52, 0x1c, 0x85, + 0x16, 0x31, 0xe1, 0x4c, 0xc0, 0xf5, 0x1b, 0x3d, 0xd7, 0x79, 0x8c, 0xf1, 0xdb, 0x84, 0x7d, 0xf4, + 0xc2, 0x69, 0xed, 0xe8, 0x6b, 0x20, 0xd4, 0xd6, 0xdd, 0xf5, 0x2f, 0x6e, 0x05, 0xd4, 0x17, 0x66, + 0xd2, 0xf3, 0x1c, 0x77, 0xcb, 0x75, 0x1e, 0xc7, 0xa5, 0x5c, 0x79, 0x72, 0x6b, 0xa4, 0x48, 0xca, + 0x73, 0xe6, 0xac, 0xd8, 0x05, 0x62, 0xe6, 0xee, 0xdc, 0xa8, 0x9a, 0xe3, 0xf5, 0xf5, 0xfb, 0x8d, + 0xb6, 0x17, 0x1a, 0x7b, 0x30, 0x9f, 0x45, 0x95, 0x2c, 0xc0, 0xb8, 0x48, 0xbf, 0x87, 0x87, 0x63, + 0xd1, 0x94, 0x3f, 0xc9, 0x33, 0x30, 0xb1, 0xe3, 0xf8, 0x41, 0x68, 0xf5, 0x1c, 0x2e, 0x2f, 0x8c, + 0x9a, 0x45, 0x2c, 0xd8, 0x72, 0x5a, 0xe4, 0x2c, 0x14, 0xf1, 0x8d, 0x8b, 0xd5, 0x15, 0xb0, 0x6e, + 0x9c, 0xfd, 0xde, 0x72, 0x5a, 0xc6, 0x7f, 0x99, 0xc3, 0x23, 0x88, 0xbc, 0x82, 0x71, 0x72, 0x23, + 0xfb, 0x13, 0xd4, 0x3f, 0xdb, 0xdd, 0x44, 0x3a, 0x3b, 0x0e, 0x42, 0x5e, 0x83, 0xb1, 0x1b, 0x76, + 0x93, 0x46, 0x66, 0x0d, 0x08, 0xbc, 0x83, 0x25, 0xaa, 0xb2, 0x9a, 0xc3, 0x30, 0xf9, 0x98, 0x6f, + 0xcd, 0x6a, 0x18, 0xd2, 0x80, 0xf3, 0xcf, 0x95, 0xaa, 0x34, 0x65, 0x40, 0xf9, 0x58, 0x6c, 0x69, + 0x3b, 0x06, 0x48, 0xb8, 0xb9, 0x65, 0x52, 0x30, 0xfe, 0x30, 0x17, 0xf3, 0x54, 0xf2, 0x32, 0x8c, + 0x98, 0xf5, 0xe8, 0xfb, 0x79, 0xa8, 0x9f, 0xc4, 0xe7, 0x23, 0x00, 0xf9, 0x32, 0x9c, 0x52, 0xe8, + 0xa4, 0x7c, 0xee, 0x5e, 0xc2, 0x48, 0x34, 0xca, 0x97, 0x64, 0x3b, 0xde, 0x65, 0xd3, 0xc0, 0xcb, + 0x40, 0x5c, 0x51, 0xa3, 0xae, 0xc3, 0x69, 0x2b, 0x9d, 0x55, 0x69, 0xb7, 0x10, 0x20, 0xd9, 0xd9, + 0x2c, 0x0a, 0x3c, 0x10, 0x8d, 0xf1, 0x1b, 0x39, 0x8d, 0x57, 0x92, 0x0b, 0x9a, 0x9c, 0x8b, 0xfb, + 0x3a, 0xa1, 0x14, 0xe0, 0x12, 0xef, 0x9b, 0x00, 0xd5, 0x5e, 0xe8, 0xad, 0xba, 0xbe, 0xd7, 0x6e, + 0x8b, 0x28, 0x6a, 0x3c, 0xc4, 0x45, 0x2f, 0xf4, 0x2c, 0x8a, 0xc5, 0x5a, 0x88, 0x8b, 0x08, 0x38, + 0xd3, 0x3d, 0xb1, 0xf0, 0x51, 0xdd, 0x13, 0x8d, 0x9f, 0xcb, 0x6b, 0x1c, 0x86, 0x49, 0xb9, 0x62, + 0xd1, 0xab, 0x36, 0xd7, 0x5d, 0xe7, 0xa1, 0x15, 0xb4, 0x3d, 0x2d, 0xa0, 0x9f, 0x00, 0x23, 0x7f, + 0x39, 0x07, 0xa7, 0xb9, 0x9f, 0xdf, 0xdd, 0x5e, 0x67, 0x9b, 0xfa, 0xf7, 0xed, 0xb6, 0xd3, 0x8a, + 0xa3, 0x90, 0xc7, 0x46, 0xfd, 0x4a, 0x33, 0xd9, 0xf0, 0xfc, 0xa2, 0xcd, 0xfd, 0x0e, 0x2d, 0x17, + 0x2b, 0xad, 0x87, 0x51, 0xad, 0x7a, 0xd1, 0xce, 0xc6, 0x27, 0xeb, 0x30, 0x59, 0x77, 0x5c, 0xcc, + 0x76, 0x1a, 0x47, 0xc6, 0x78, 0x99, 0xbb, 0xed, 0xb2, 0x25, 0xdc, 0xdc, 0xa3, 0x03, 0x58, 0xb7, + 0x8a, 0x6b, 0xfc, 0x4a, 0x0e, 0x9e, 0x3f, 0xf6, 0x83, 0xc9, 0x15, 0x18, 0x5f, 0x55, 0xf7, 0x3f, + 0xb7, 0x04, 0x4a, 0x67, 0xe4, 0x94, 0x50, 0xe4, 0x2b, 0x70, 0x4a, 0x25, 0xb5, 0xe9, 0xdb, 0x8e, + 0xea, 0xa1, 0x9c, 0x31, 0x00, 0x21, 0x03, 0x49, 0x8a, 0xad, 0xd9, 0x44, 0x8c, 0xff, 0x27, 0x07, + 0x13, 0x91, 0x8b, 0xd3, 0x53, 0x7a, 0x9d, 0xb9, 0xae, 0x5d, 0x67, 0x64, 0x3a, 0x87, 0xa8, 0x57, + 0xdc, 0xf4, 0x28, 0xe3, 0x0a, 0x3a, 0xa3, 0x38, 0x84, 0x61, 0xc1, 0x8f, 0xe6, 0x61, 0x92, 0xb1, + 0x6a, 0xfe, 0xa6, 0xfd, 0xbd, 0x15, 0xd4, 0x3e, 0xea, 0xd7, 0x50, 0x61, 0xc7, 0xff, 0x5d, 0x0e, + 0xdf, 0x3a, 0x54, 0x0c, 0x36, 0x1a, 0xac, 0x48, 0x1d, 0x0d, 0x76, 0xa2, 0x9a, 0x58, 0xca, 0x83, + 0x30, 0x6f, 0x88, 0x91, 0x10, 0x41, 0x98, 0xdb, 0x26, 0x2b, 0x23, 0x5f, 0x80, 0xd1, 0x2d, 0xd4, + 0xdc, 0xea, 0x51, 0xfa, 0x22, 0xfa, 0x58, 0xc9, 0xf9, 0x7d, 0x2f, 0xd0, 0x23, 0x74, 0x73, 0x44, + 0xd2, 0x80, 0xf1, 0x15, 0x9f, 0xda, 0x21, 0x6d, 0x89, 0x01, 0x19, 0x2a, 0xc6, 0x54, 0x93, 0xa3, + 0x24, 0x63, 0x4c, 0x09, 0x4a, 0x8c, 0x8f, 0x91, 0xb8, 0x8f, 0x68, 0xb5, 0x13, 0x3c, 0xb5, 0x93, + 0xfe, 0x9e, 0x36, 0xe9, 0xe7, 0x52, 0x93, 0xce, 0xbb, 0x37, 0xd4, 0xdc, 0xff, 0x66, 0x0e, 0x4e, + 0x67, 0x23, 0x92, 0x17, 0x60, 0xec, 0xde, 0x66, 0x3d, 0xb6, 0x94, 0xc3, 0xae, 0x78, 0x5d, 0x54, + 0x9b, 0x98, 0xa2, 0x8a, 0xbc, 0x0e, 0x63, 0xef, 0x9b, 0x2b, 0xb1, 0x41, 0x18, 0x32, 0xb8, 0xaf, + 0x33, 0xc9, 0x4b, 0x3b, 0xd5, 0x04, 0x90, 0x3a, 0xb7, 0x85, 0x27, 0x36, 0xb7, 0x3f, 0x95, 0x87, + 0x99, 0x6a, 0xb3, 0x49, 0x83, 0x40, 0x24, 0x11, 0x7b, 0x6a, 0x27, 0x36, 0x3b, 0x84, 0xa3, 0xd6, + 0xb7, 0xa1, 0x66, 0xf5, 0xb7, 0x72, 0x3c, 0x20, 0x2b, 0xc3, 0x7a, 0xe8, 0xd0, 0x47, 0x9b, 0x7b, + 0x3e, 0x0d, 0xf6, 0xbc, 0x76, 0x6b, 0xe8, 0x24, 0xb6, 0x4c, 0x66, 0xc4, 0x44, 0x5b, 0xaa, 0x81, + 0xc3, 0x0e, 0x96, 0x68, 0x32, 0x23, 0x4f, 0xc6, 0x75, 0x05, 0xc6, 0xab, 0xdd, 0xae, 0xef, 0x3d, + 0xe4, 0xdb, 0x5e, 0xc4, 0xe0, 0xb7, 0x79, 0x91, 0x16, 0x55, 0x8b, 0x17, 0xb1, 0xcf, 0xa8, 0x51, + 0xf7, 0x40, 0x35, 0x4f, 0x6b, 0x51, 0x57, 0xbd, 0x94, 0x60, 0xbd, 0xd1, 0x00, 0x52, 0xf7, 0xbd, + 0x8e, 0x17, 0xd2, 0x16, 0xef, 0x0f, 0x06, 0x23, 0x3b, 0x36, 0x7e, 0xf1, 0xa6, 0x13, 0xb6, 0xb5, + 0xf8, 0xc5, 0x21, 0x2b, 0x30, 0x79, 0x39, 0x3b, 0xbb, 0xcf, 0x69, 0x63, 0x5a, 0xf3, 0x0f, 0xcc, + 0x9e, 0xbb, 0xea, 0xfa, 0x4e, 0x73, 0x0f, 0xfd, 0x66, 0xef, 0x02, 0x98, 0xd4, 0x0e, 0x3c, 0x57, + 0x11, 0xd6, 0x2e, 0xf3, 0x14, 0xbe, 0xac, 0x34, 0xad, 0x77, 0x98, 0x15, 0x94, 0x62, 0x2c, 0x53, + 0xa1, 0x40, 0xaa, 0x30, 0xc5, 0x7f, 0xb1, 0xce, 0x74, 0x23, 0x41, 0xfc, 0x19, 0xee, 0xc5, 0x8a, + 0x24, 0xbb, 0x58, 0xa3, 0x47, 0xb8, 0x50, 0x30, 0x8c, 0xff, 0x73, 0x14, 0x4a, 0xea, 0x94, 0x12, + 0x83, 0xe7, 0xa3, 0xf4, 0x7c, 0x35, 0x26, 0xa0, 0x8d, 0x25, 0xa6, 0xa8, 0x89, 0x03, 0x6a, 0xe6, + 0x8f, 0x0d, 0xa8, 0xf9, 0x00, 0xa6, 0xea, 0xbe, 0x87, 0x19, 0x0e, 0xf0, 0xb5, 0x59, 0xf0, 0xef, + 0x39, 0x45, 0x6b, 0xc0, 0x56, 0x1f, 0xbe, 0x67, 0xe3, 0xbd, 0xac, 0x2b, 0xa0, 0x2d, 0x26, 0xfa, + 0x6a, 0x3a, 0x33, 0x8d, 0x0e, 0x37, 0x95, 0x61, 0x3d, 0x51, 0xf3, 0xf6, 0xf0, 0x4e, 0xeb, 0xa6, + 0x32, 0xac, 0x44, 0x65, 0x10, 0xa3, 0x4f, 0x8a, 0x41, 0x90, 0x9f, 0xcb, 0xc1, 0x64, 0xd5, 0x75, + 0x45, 0xa0, 0xce, 0x63, 0xc2, 0x8a, 0x7d, 0x45, 0x58, 0xcb, 0xbc, 0xf5, 0x91, 0xac, 0x65, 0x50, + 0xd8, 0x0a, 0x50, 0x52, 0x8f, 0x1b, 0xd4, 0x82, 0xed, 0xc4, 0xc5, 0xe4, 0x2d, 0x28, 0x47, 0x3b, + 0x73, 0xdd, 0x6d, 0xd1, 0xc7, 0x34, 0x58, 0x18, 0x3f, 0x5f, 0xb8, 0x38, 0x25, 0xd2, 0x26, 0xa9, + 0x92, 0x79, 0x12, 0x90, 0x6c, 0x02, 0xd8, 0xd1, 0x96, 0x10, 0x8f, 0x78, 0x67, 0xe3, 0x07, 0x97, + 0xc4, 0x9e, 0x11, 0xb7, 0x07, 0xfc, 0x8d, 0x0f, 0x92, 0xea, 0xed, 0x21, 0xa6, 0x43, 0x3a, 0x30, + 0x53, 0x0d, 0x82, 0x5e, 0x87, 0x36, 0x42, 0xdb, 0x0f, 0x31, 0x37, 0x22, 0x0c, 0x6f, 0x06, 0x6a, + 0x23, 0x2a, 0x5b, 0x11, 0x7e, 0x68, 0x65, 0x24, 0x4a, 0x4c, 0xd2, 0xe6, 0x49, 0xaa, 0xcc, 0x33, + 0xe9, 0xef, 0xe5, 0x3b, 0xf5, 0xa7, 0x72, 0x70, 0x5a, 0x5d, 0xf4, 0x8d, 0xde, 0xb6, 0xc8, 0x0c, + 0x41, 0x2e, 0xc3, 0x84, 0x58, 0x93, 0xd1, 0x25, 0x32, 0x9d, 0xe2, 0x31, 0x06, 0x21, 0xab, 0x6c, + 0x19, 0x32, 0x1a, 0xe2, 0xd6, 0x31, 0x97, 0x60, 0xae, 0xac, 0x6a, 0x79, 0x21, 0xce, 0x51, 0xc9, + 0x7e, 0xeb, 0xeb, 0x93, 0x95, 0x18, 0xef, 0xc2, 0xac, 0x3e, 0x13, 0x0d, 0x1a, 0x92, 0x4b, 0x30, + 0x2e, 0xa7, 0x2f, 0x97, 0x3d, 0x7d, 0xb2, 0xde, 0x78, 0x00, 0x24, 0x85, 0x1f, 0xa0, 0x59, 0x1b, + 0xbb, 0x9f, 0x73, 0xb3, 0x4b, 0xf9, 0xa8, 0x9c, 0x02, 0x5c, 0x9e, 0x13, 0xdf, 0x37, 0xa9, 0x39, + 0x36, 0x62, 0x96, 0x8c, 0xdf, 0x2a, 0xc3, 0x5c, 0xc6, 0x41, 0x71, 0x8c, 0x20, 0x57, 0xd1, 0x19, + 0xc4, 0x44, 0x14, 0x95, 0x50, 0xb2, 0x85, 0x77, 0x61, 0xf4, 0x58, 0x76, 0xc0, 0xdd, 0x5a, 0x13, + 0x5c, 0x80, 0xa3, 0x7d, 0x22, 0xc2, 0x9c, 0x1a, 0x85, 0x74, 0xf4, 0x89, 0x45, 0x21, 0xc5, 0x30, + 0x44, 0x0a, 0x13, 0xd7, 0x43, 0x23, 0xf1, 0x94, 0xa5, 0x29, 0xb6, 0xa5, 0xa3, 0x70, 0x1a, 0x81, + 0xd7, 0x7e, 0x48, 0x05, 0x8d, 0x71, 0x95, 0x06, 0x56, 0x64, 0xd2, 0x50, 0x50, 0xc8, 0x3f, 0xc8, + 0x01, 0x11, 0x25, 0x2a, 0xcf, 0x2a, 0x0e, 0xe2, 0x59, 0xad, 0x27, 0xc3, 0xb3, 0xce, 0xc9, 0x6f, + 0xcc, 0xe6, 0x5d, 0x19, 0x9f, 0x45, 0xfe, 0x5e, 0x0e, 0x66, 0x79, 0xf4, 0x4a, 0xf5, 0x63, 0x07, + 0x46, 0x24, 0x6c, 0x3e, 0x99, 0x8f, 0x7d, 0x56, 0x24, 0xab, 0xcd, 0xfe, 0xd6, 0xf4, 0x47, 0x91, + 0xef, 0x03, 0x88, 0x76, 0x14, 0xcf, 0x14, 0x32, 0xb9, 0xf4, 0x6c, 0x06, 0x17, 0x88, 0x80, 0xe2, + 0x0c, 0x8d, 0x61, 0x84, 0xa7, 0xb2, 0xcd, 0x98, 0x1a, 0xf9, 0x8b, 0x3c, 0xae, 0x7f, 0x54, 0x22, + 0x02, 0xf7, 0x2e, 0x4c, 0x62, 0x2b, 0x9f, 0xe9, 0x2f, 0xc8, 0x5d, 0xce, 0x42, 0xe3, 0x79, 0x65, + 0x22, 0x23, 0x6b, 0x3f, 0xec, 0x24, 0x63, 0xfb, 0x27, 0x31, 0x30, 0x1e, 0x36, 0x7e, 0x3d, 0xcf, + 0xa2, 0xd8, 0x87, 0xbf, 0x9d, 0x95, 0x7b, 0x81, 0xf3, 0xb7, 0x84, 0x33, 0x12, 0x16, 0x91, 0xf7, + 0x81, 0x44, 0x61, 0x1f, 0x79, 0x19, 0x95, 0x19, 0x16, 0xf9, 0x63, 0x41, 0x1c, 0x3e, 0xd2, 0x97, + 0xd5, 0xea, 0x22, 0x49, 0x23, 0x13, 0x0a, 0xf3, 0xa2, 0xd3, 0xac, 0x94, 0x3b, 0x10, 0xaf, 0xd7, + 0x82, 0x85, 0x69, 0x2d, 0x2c, 0x72, 0x5c, 0xb3, 0xfc, 0x9c, 0x4c, 0x48, 0x1c, 0x79, 0x22, 0xeb, + 0x2e, 0xbd, 0x99, 0xe4, 0xc8, 0x75, 0x98, 0xc0, 0xf0, 0x25, 0x6b, 0xd2, 0x58, 0x4f, 0x18, 0x0e, + 0x61, 0xa0, 0x13, 0x6b, 0x4f, 0x37, 0xb9, 0x8b, 0x41, 0xd9, 0x1d, 0x86, 0x4b, 0x80, 0xa8, 0xd2, + 0x17, 0x4a, 0x9a, 0x96, 0x7f, 0x60, 0xf9, 0x3d, 0x3d, 0x34, 0x0e, 0x02, 0x91, 0xaf, 0xc1, 0xe4, + 0x1d, 0xfb, 0x71, 0x94, 0xf8, 0x78, 0x76, 0xf8, 0xf4, 0xca, 0x1d, 0xfb, 0x71, 0x94, 0xf5, 0x38, + 0xe9, 0xc0, 0xa4, 0x90, 0x24, 0x1f, 0x00, 0x28, 0xef, 0x0c, 0xe4, 0xd8, 0x06, 0x9e, 0x97, 0xc1, + 0xbe, 0x33, 0xdf, 0x1f, 0x90, 0xbe, 0x42, 0x30, 0x21, 0x39, 0xcc, 0x7f, 0x72, 0x92, 0xc3, 0xa9, + 0x4f, 0x4e, 0x72, 0xe0, 0xcf, 0x5c, 0x7c, 0xee, 0x91, 0x83, 0x1f, 0x08, 0x2d, 0xff, 0xa0, 0xd6, + 0x9e, 0x95, 0xa6, 0xa0, 0x78, 0x14, 0x1c, 0x24, 0x9a, 0x48, 0xd0, 0x23, 0x3e, 0x94, 0x93, 0x17, + 0x83, 0x85, 0x33, 0x9a, 0x65, 0xe1, 0xc0, 0x4b, 0x04, 0x57, 0xb7, 0x8a, 0x65, 0x64, 0xd1, 0xa8, + 0x5c, 0x15, 0xea, 0x92, 0x38, 0x8b, 0xdb, 0x70, 0xb6, 0x2f, 0x43, 0xc8, 0xc8, 0x8c, 0x73, 0x45, + 0xcf, 0x8c, 0x73, 0xb6, 0x9f, 0xe0, 0x10, 0xe8, 0xe9, 0x41, 0xe7, 0xca, 0xf3, 0xfd, 0x65, 0xae, + 0xef, 0xe4, 0x13, 0x82, 0x84, 0xb8, 0xe3, 0xf1, 0x64, 0xda, 0xfd, 0x24, 0xad, 0xfc, 0x7a, 0x8d, + 0x5d, 0xea, 0x50, 0xd4, 0x50, 0x92, 0x99, 0x31, 0x51, 0x43, 0x15, 0x55, 0x50, 0xe8, 0xf8, 0xb8, + 0x32, 0xc5, 0xdb, 0x30, 0xdd, 0xa0, 0xb6, 0xdf, 0xdc, 0xbb, 0x4d, 0x0f, 0x1e, 0x79, 0x7e, 0x8b, + 0x27, 0xdd, 0x15, 0x37, 0x8b, 0x00, 0x6b, 0xf4, 0x90, 0x0d, 0x2a, 0x2c, 0xa9, 0xc9, 0x98, 0x1c, + 0xa3, 0xd8, 0xfa, 0xd9, 0x4c, 0xde, 0xcc, 0x00, 0x06, 0x85, 0xeb, 0x20, 0x6f, 0x44, 0xe2, 0x27, + 0xf5, 0xd5, 0x24, 0xa1, 0xbe, 0x2c, 0xcc, 0x90, 0x42, 0xa9, 0x6f, 0xfc, 0x5e, 0x01, 0x08, 0x6f, + 0x69, 0xc5, 0xee, 0xda, 0x18, 0x05, 0xc7, 0xc1, 0x50, 0xb7, 0x65, 0x01, 0x63, 0x6f, 0xb7, 0xa9, + 0x1a, 0x27, 0x5a, 0x98, 0x7c, 0x47, 0x75, 0x56, 0xf2, 0xfa, 0x96, 0x42, 0xec, 0xc3, 0xc0, 0xf3, + 0x1f, 0x87, 0x81, 0x7f, 0x0d, 0x9e, 0xa9, 0x76, 0xbb, 0x6d, 0xa7, 0x19, 0xb5, 0x72, 0xc3, 0xf3, + 0xe5, 0x76, 0xd1, 0x62, 0x21, 0xd8, 0x11, 0x58, 0xea, 0x4b, 0x07, 0x91, 0x50, 0xa4, 0x2f, 0x7e, + 0xe1, 0x55, 0xe3, 0x75, 0x49, 0xe9, 0x2b, 0xeb, 0x8a, 0xac, 0xa0, 0x48, 0x1a, 0x8e, 0x2f, 0xa5, + 0xaf, 0xd1, 0x38, 0xfb, 0x8c, 0x7c, 0xe1, 0xce, 0x96, 0xe0, 0x22, 0x14, 0xf2, 0x36, 0x4c, 0x56, + 0x7b, 0xa1, 0x27, 0x08, 0x0b, 0x5f, 0x85, 0xd8, 0xab, 0x40, 0x7c, 0x8a, 0x76, 0xa1, 0x8b, 0xc1, + 0x8d, 0x3f, 0x28, 0xc0, 0xd9, 0xf4, 0xf4, 0x8a, 0xda, 0x68, 0x7f, 0xe4, 0x8e, 0xd9, 0x1f, 0x59, + 0xab, 0x21, 0x1f, 0xa7, 0x47, 0x7c, 0x12, 0xab, 0x81, 0x47, 0xe0, 0xf9, 0x88, 0xab, 0xa1, 0x01, + 0x93, 0xea, 0x29, 0x3e, 0xf2, 0x51, 0x4f, 0x71, 0x95, 0x0a, 0xb9, 0x04, 0xa3, 0x3c, 0x4c, 0xd9, + 0x68, 0xfc, 0x20, 0x98, 0x8c, 0x50, 0xc6, 0x21, 0xc8, 0x7f, 0x00, 0xe7, 0x39, 0x4f, 0x4a, 0x76, + 0x76, 0xf9, 0x40, 0x52, 0x14, 0x13, 0xb7, 0x74, 0x74, 0x58, 0xb9, 0xcc, 0xb5, 0x56, 0x56, 0x6a, + 0xd8, 0xac, 0xed, 0x03, 0x4b, 0x7e, 0x99, 0xd2, 0xc8, 0xb1, 0xb4, 0x8d, 0xc7, 0x70, 0x56, 0xd4, + 0xc6, 0xc1, 0x6c, 0x64, 0x25, 0x9b, 0xe4, 0xfd, 0x58, 0xf1, 0x88, 0x93, 0x9c, 0xd0, 0x29, 0x62, + 0x3d, 0xb9, 0x06, 0xc5, 0x6a, 0x7d, 0x9d, 0x27, 0x6c, 0x57, 0x42, 0x11, 0xd9, 0x5d, 0x87, 0x47, + 0x5d, 0xd1, 0xa2, 0x1b, 0x08, 0x40, 0xe3, 0xd7, 0x73, 0x00, 0xf1, 0xa0, 0x91, 0xd7, 0xb3, 0xdc, + 0xc7, 0x78, 0x8a, 0x2b, 0x5e, 0xac, 0x7b, 0x8e, 0x49, 0x9d, 0x68, 0x3e, 0x53, 0x27, 0x2a, 0x95, + 0x6a, 0x85, 0x4c, 0xa5, 0x5a, 0x0d, 0x66, 0x1a, 0xbd, 0x6d, 0xd9, 0x76, 0x32, 0xf8, 0x45, 0xd0, + 0xdb, 0xce, 0x1a, 0xca, 0x24, 0x8a, 0xf1, 0x63, 0x79, 0x28, 0xd5, 0xdb, 0xbd, 0x5d, 0xc7, 0xad, + 0xd9, 0xa1, 0xfd, 0xd4, 0xaa, 0x69, 0xdf, 0xd4, 0xd4, 0xb4, 0x91, 0x97, 0x64, 0xd4, 0xb1, 0xa1, + 0x74, 0xb4, 0x3f, 0x9b, 0x83, 0x99, 0x18, 0x85, 0x9f, 0xf0, 0x6b, 0x30, 0xc2, 0x7e, 0x08, 0x3d, + 0xc0, 0xf9, 0x14, 0x61, 0x84, 0xba, 0x1c, 0xfd, 0x25, 0x14, 0xa7, 0x7a, 0xb6, 0x72, 0xa4, 0xb0, + 0xf8, 0x59, 0x98, 0x88, 0xc9, 0xa6, 0x05, 0x87, 0x79, 0x55, 0x70, 0x98, 0x50, 0x73, 0xe7, 0xfd, + 0x6a, 0x0e, 0xca, 0xc9, 0x9e, 0x90, 0xdb, 0x30, 0xce, 0x28, 0x39, 0x54, 0xaa, 0x28, 0x5e, 0xec, + 0xd3, 0xe7, 0xcb, 0x02, 0x8c, 0x7f, 0x1e, 0x0e, 0x3e, 0xe5, 0x25, 0xa6, 0xa4, 0xb0, 0x68, 0x42, + 0x49, 0x85, 0xca, 0xf8, 0xba, 0xd7, 0x74, 0xb1, 0xe6, 0x74, 0xf6, 0x38, 0xa8, 0x5f, 0xfd, 0x37, + 0xb4, 0xaf, 0x16, 0x12, 0xcb, 0x05, 0x6d, 0x71, 0x65, 0x6e, 0x45, 0x5c, 0x34, 0x98, 0xc4, 0x4f, + 0xf0, 0x8d, 0xbc, 0x1a, 0x5e, 0x32, 0xb5, 0xa0, 0x23, 0x38, 0xf2, 0x1a, 0x8c, 0xf1, 0xf6, 0xd4, + 0xd4, 0xe5, 0x5d, 0x2c, 0x51, 0xaf, 0x0c, 0x1c, 0xc6, 0xf8, 0x9b, 0x05, 0x38, 0x1d, 0x7f, 0xde, + 0x56, 0xb7, 0x65, 0x87, 0xb4, 0x6e, 0xfb, 0x76, 0x27, 0x38, 0x66, 0x07, 0x5c, 0x4c, 0x7d, 0x9a, + 0x08, 0xab, 0xc0, 0xcb, 0x94, 0x0f, 0x32, 0x12, 0x1f, 0x84, 0xea, 0x60, 0xfe, 0x41, 0xf2, 0x33, + 0xc8, 0x6d, 0x28, 0x34, 0x68, 0x28, 0x18, 0xf6, 0x85, 0xd4, 0xa8, 0xaa, 0xdf, 0x75, 0xb9, 0x41, + 0x43, 0x3e, 0x89, 0x3c, 0x70, 0xa7, 0x16, 0xc0, 0x80, 0x51, 0x21, 0x0f, 0x60, 0x6c, 0xf5, 0x71, + 0x97, 0x36, 0x43, 0xcc, 0xd6, 0xa4, 0x78, 0xf2, 0x67, 0xd3, 0xe3, 0xb0, 0x9c, 0xe4, 0xbc, 0x90, + 0xc1, 0xf5, 0x0c, 0x89, 0x82, 0xdc, 0xe2, 0x75, 0x28, 0xca, 0xc6, 0x4f, 0xb2, 0x72, 0x17, 0xdf, + 0x84, 0x49, 0xa5, 0x91, 0x13, 0x2d, 0xfa, 0x5f, 0x60, 0x7c, 0xd5, 0x6b, 0x53, 0xb1, 0x70, 0x56, + 0x53, 0x02, 0xa6, 0x92, 0x77, 0x99, 0x0b, 0x98, 0xd6, 0xbe, 0xa8, 0x1a, 0x20, 0x69, 0xae, 0xc3, + 0x4c, 0x63, 0xdf, 0xe9, 0xc6, 0xc9, 0x3d, 0xb4, 0x63, 0x1c, 0x73, 0xbb, 0x0a, 0x1d, 0x46, 0xf2, + 0x18, 0x4f, 0xe2, 0x19, 0x7f, 0x92, 0x83, 0x31, 0xf6, 0xd7, 0xfd, 0xeb, 0x4f, 0x29, 0xcb, 0xbc, + 0xa6, 0xb1, 0xcc, 0x59, 0x25, 0x59, 0x17, 0x32, 0x8e, 0xeb, 0xc7, 0x30, 0xcb, 0x43, 0x31, 0x41, + 0x1c, 0x98, 0xdc, 0x84, 0x71, 0x61, 0x1b, 0x27, 0xdc, 0x18, 0xd4, 0xec, 0x5f, 0xd2, 0x6a, 0x2e, + 0x52, 0x76, 0x78, 0xdd, 0xa4, 0x76, 0x48, 0x62, 0xb3, 0xcb, 0x80, 0x4c, 0xb3, 0xa2, 0xa6, 0x16, + 0x65, 0x64, 0x56, 0x3c, 0x97, 0xe7, 0xae, 0x0a, 0x96, 0xcf, 0x08, 0x4a, 0xfd, 0x02, 0x15, 0x55, + 0xc5, 0x6b, 0x56, 0x61, 0x10, 0x91, 0xd3, 0x82, 0x48, 0xf6, 0x43, 0x57, 0x07, 0x4e, 0x37, 0x1a, + 0x6b, 0x68, 0x47, 0x5b, 0xf7, 0xfc, 0xf0, 0x86, 0xe7, 0x3f, 0x12, 0xf1, 0x58, 0x1a, 0xba, 0x0d, + 0x49, 0x96, 0x75, 0xe3, 0xcb, 0x99, 0xd6, 0x8d, 0x03, 0xec, 0x4c, 0x0c, 0x17, 0xce, 0x34, 0x1a, + 0x6b, 0x3c, 0x73, 0xd4, 0x9f, 0x46, 0x7b, 0xbf, 0x9a, 0x83, 0xd9, 0x46, 0x63, 0x2d, 0xd1, 0xd4, + 0x86, 0x4c, 0x59, 0x95, 0xd3, 0x1e, 0xb2, 0xb3, 0x07, 0x02, 0x67, 0x21, 0xc7, 0xc5, 0xc2, 0xa6, + 0x16, 0x78, 0x9c, 0x13, 0x21, 0xf5, 0x28, 0x49, 0x56, 0x5e, 0x73, 0x6d, 0xe9, 0xd3, 0x51, 0x54, + 0xf6, 0x0b, 0xc7, 0x50, 0x56, 0xab, 0x2b, 0xfb, 0x59, 0x89, 0xf1, 0x2f, 0x4e, 0xf3, 0x34, 0x5c, + 0x72, 0xb5, 0xbc, 0x03, 0x25, 0x81, 0x8f, 0xfe, 0x1f, 0xc2, 0xa6, 0xe7, 0x2c, 0x63, 0x90, 0x3b, + 0xbc, 0x9c, 0x67, 0x54, 0xf9, 0xee, 0x61, 0x65, 0x84, 0x0d, 0x8d, 0xa9, 0x81, 0x93, 0x7b, 0x30, + 0x75, 0xc7, 0x7e, 0xac, 0x68, 0x76, 0xb8, 0x77, 0xdf, 0x25, 0xc6, 0x55, 0x3a, 0xf6, 0xe3, 0x21, + 0xac, 0x47, 0x75, 0x7c, 0xb2, 0x0f, 0xd3, 0x7a, 0x9f, 0xc4, 0x0a, 0x4c, 0xcf, 0xd8, 0xd5, 0xcc, + 0x19, 0x3b, 0xdb, 0xf5, 0xfc, 0xd0, 0xda, 0x89, 0xd0, 0xb5, 0x94, 0x73, 0x09, 0xd2, 0xe4, 0x1d, + 0x98, 0x55, 0xc2, 0xbb, 0xdf, 0xf0, 0xfc, 0x8e, 0x2d, 0x6f, 0x69, 0xf8, 0xdc, 0x81, 0x66, 0x65, + 0x3b, 0x58, 0x6c, 0xa6, 0x21, 0xc9, 0x97, 0xb3, 0x3c, 0x26, 0x47, 0x63, 0x13, 0xda, 0x0c, 0x8f, + 0xc9, 0x7e, 0x26, 0xb4, 0x69, 0xdf, 0xc9, 0xdd, 0x41, 0x26, 0xf6, 0x45, 0xde, 0xfb, 0xa1, 0x4c, + 0xe8, 0xa3, 0x99, 0xeb, 0x63, 0x4a, 0xbf, 0x04, 0x85, 0xe5, 0xfa, 0x0d, 0x7c, 0xa4, 0x93, 0xf6, + 0x74, 0xee, 0x9e, 0xed, 0x36, 0xf1, 0xf6, 0x24, 0x1c, 0x5b, 0xd4, 0x83, 0x72, 0xb9, 0x7e, 0x83, + 0xd8, 0x30, 0x87, 0x19, 0xcd, 0xc3, 0x2f, 0x5e, 0xbd, 0xaa, 0x4c, 0x55, 0x11, 0x3f, 0xed, 0x8a, + 0xf8, 0xb4, 0x0a, 0xe6, 0x43, 0x0f, 0xad, 0xc7, 0x57, 0xaf, 0x66, 0x4e, 0x48, 0xf4, 0x61, 0x59, + 0xb4, 0xd8, 0x81, 0x75, 0xc7, 0x7e, 0x1c, 0xfb, 0x23, 0x05, 0xc2, 0xf7, 0xfc, 0x9c, 0x5c, 0x5a, + 0xb1, 0x2f, 0x93, 0x76, 0x60, 0xe9, 0x48, 0xec, 0xf2, 0x1b, 0x2f, 0xb0, 0x40, 0x78, 0xed, 0x2d, + 0x4a, 0xcd, 0xa5, 0x0c, 0x50, 0xa0, 0xde, 0xe0, 0x14, 0x70, 0xb2, 0x15, 0x5d, 0xe1, 0xf9, 0x15, + 0x18, 0x0d, 0xdd, 0x27, 0x96, 0xaf, 0xa8, 0x57, 0x78, 0xae, 0x2f, 0xd4, 0xba, 0x35, 0x13, 0xe9, + 0x7d, 0xb8, 0x83, 0x96, 0xa9, 0x53, 0x49, 0x6b, 0x06, 0x4a, 0x27, 0xd7, 0x0c, 0x50, 0x18, 0xd9, + 0xf0, 0x9a, 0xfb, 0x22, 0x7a, 0xf2, 0xfb, 0x8c, 0x0b, 0xb7, 0xbd, 0xe6, 0xfe, 0x93, 0x73, 0x1d, + 0x40, 0xf2, 0xe4, 0x2e, 0x8f, 0xbe, 0xe3, 0xb7, 0xc4, 0x98, 0x08, 0x73, 0xf4, 0xf9, 0xe8, 0x6a, + 0xac, 0xd4, 0xc5, 0x31, 0x79, 0xfc, 0x96, 0x1c, 0x5a, 0x53, 0x47, 0x27, 0x14, 0xca, 0x35, 0x1a, + 0xec, 0x87, 0x5e, 0x77, 0xa5, 0xed, 0x74, 0x31, 0xa0, 0x95, 0x48, 0xbf, 0x33, 0x34, 0x4f, 0x6e, + 0x71, 0x7c, 0xab, 0x29, 0x09, 0x98, 0x29, 0x92, 0xe4, 0xcb, 0x30, 0xcd, 0x16, 0xf7, 0xea, 0xe3, + 0x90, 0xba, 0x7c, 0xe6, 0x67, 0x51, 0xa2, 0x9b, 0x57, 0x92, 0x57, 0x46, 0x95, 0x7c, 0x4d, 0xe1, + 0x66, 0xa7, 0x11, 0x82, 0x16, 0x79, 0x5a, 0x23, 0x45, 0x5a, 0xb0, 0x70, 0xc7, 0x7e, 0x1c, 0x5f, + 0x94, 0xd5, 0x45, 0x4a, 0x70, 0x81, 0x5d, 0x3c, 0x3a, 0xac, 0xbc, 0xc8, 0x16, 0x58, 0x9c, 0x11, + 0xaa, 0xcf, 0x7a, 0xed, 0x4b, 0x89, 0x7c, 0x03, 0xce, 0x88, 0x6e, 0xd5, 0x30, 0xc9, 0xb6, 0xe7, + 0x1f, 0x34, 0xf6, 0x6c, 0x74, 0x45, 0x9c, 0xeb, 0x33, 0x60, 0x57, 0xb2, 0x59, 0xa2, 0x1c, 0xb0, + 0x96, 0xa4, 0x63, 0x05, 0x9c, 0x90, 0xd9, 0xaf, 0x05, 0xf2, 0x21, 0x4c, 0xf3, 0x97, 0x49, 0x99, + 0x22, 0x5c, 0xe8, 0xd4, 0x87, 0xf6, 0xaf, 0xe1, 0xcf, 0x9d, 0x71, 0xde, 0x71, 0x6d, 0x38, 0x35, + 0xca, 0xe4, 0x2d, 0x34, 0x61, 0xe5, 0xb1, 0xe1, 0xd7, 0xeb, 0xa8, 0x61, 0x17, 0x27, 0x50, 0xd7, + 0x71, 0x2d, 0xa9, 0x66, 0xe9, 0x46, 0xec, 0x42, 0x85, 0x26, 0x0f, 0x60, 0xb2, 0xd1, 0x58, 0xbb, + 0xe1, 0x30, 0xb9, 0xa4, 0x2b, 0x15, 0xe6, 0xe9, 0xaf, 0x7c, 0x21, 0xf3, 0x2b, 0xa7, 0x82, 0x60, + 0xcf, 0xc2, 0x3c, 0xd0, 0x4d, 0xaf, 0x7b, 0x60, 0xaa, 0x94, 0x32, 0x7c, 0x4e, 0xce, 0x3c, 0x61, + 0x9f, 0x93, 0x75, 0x98, 0x51, 0xec, 0xa8, 0xd1, 0x2c, 0x67, 0x21, 0x0e, 0xfe, 0xa9, 0xfa, 0x98, + 0x24, 0xbd, 0xac, 0x93, 0x78, 0xd2, 0xd9, 0xe4, 0xec, 0x49, 0x9d, 0x4d, 0x1c, 0x98, 0xe5, 0x93, + 0x21, 0xd6, 0x01, 0xce, 0xf4, 0x62, 0x9f, 0x31, 0xbc, 0x94, 0x39, 0x86, 0x73, 0x62, 0xa6, 0xe5, + 0x22, 0xc3, 0x97, 0xf8, 0x34, 0x55, 0xb2, 0x03, 0x44, 0x14, 0xda, 0xa1, 0xbd, 0x6d, 0x07, 0x14, + 0xdb, 0x7a, 0xa6, 0x4f, 0x5b, 0x2f, 0x66, 0xb6, 0x35, 0x2d, 0xdb, 0xda, 0xe6, 0xcd, 0x64, 0x50, + 0x24, 0xae, 0x6c, 0x47, 0xae, 0x2f, 0x1c, 0xd8, 0x67, 0x35, 0xc5, 0x78, 0x1a, 0x80, 0xc7, 0xd1, + 0x4c, 0x2e, 0xda, 0xe4, 0xb8, 0x67, 0x50, 0x26, 0x8f, 0xe1, 0x74, 0xfa, 0x2b, 0xb0, 0xcd, 0x73, + 0xd8, 0xe6, 0x39, 0xad, 0xcd, 0x24, 0x10, 0x5f, 0x37, 0x7a, 0xb7, 0x92, 0xad, 0xf6, 0xa1, 0x4f, + 0x7e, 0x24, 0x07, 0x67, 0xee, 0xdc, 0xa8, 0xde, 0xa7, 0x3e, 0x17, 0x4b, 0x1c, 0xcf, 0x8d, 0xbc, + 0xd3, 0x9f, 0x13, 0x8f, 0x27, 0xc9, 0x87, 0x23, 0x29, 0x71, 0x20, 0xab, 0x60, 0xa2, 0xfb, 0x0b, + 0x9d, 0x1d, 0xdb, 0x7a, 0xa8, 0x90, 0xc8, 0x70, 0x61, 0xff, 0xd6, 0xef, 0x57, 0x72, 0x66, 0xbf, + 0xa6, 0x48, 0x1b, 0x16, 0xf5, 0x61, 0x91, 0xee, 0x40, 0x7b, 0xb4, 0xdd, 0x5e, 0xa8, 0xe0, 0x8a, + 0x7e, 0xed, 0xe8, 0xb0, 0x72, 0x31, 0x35, 0xba, 0x91, 0x8b, 0x11, 0x83, 0x54, 0x3a, 0x3c, 0x80, + 0x1e, 0xe9, 0x64, 0x08, 0xdd, 0x0b, 0xe7, 0xb5, 0x30, 0x56, 0xa9, 0xfa, 0x28, 0xcc, 0xda, 0x39, + 0xb6, 0xdf, 0xfb, 0x0a, 0x88, 0x66, 0x9a, 0xf2, 0xad, 0x91, 0xe2, 0x54, 0x79, 0x3a, 0xc3, 0x4f, + 0xc6, 0xf8, 0x76, 0x3e, 0x71, 0x30, 0x92, 0x75, 0x18, 0x17, 0xeb, 0xbd, 0xef, 0x25, 0xe3, 0x5c, + 0xe6, 0xaa, 0x1e, 0x17, 0x5b, 0xc7, 0x94, 0xf8, 0xe4, 0x11, 0x23, 0x85, 0x9d, 0x16, 0x37, 0xde, + 0x0f, 0xf8, 0xb9, 0x87, 0x45, 0xda, 0x09, 0x5f, 0x3b, 0xb9, 0x4f, 0xa9, 0xee, 0xb2, 0x8c, 0x47, + 0xbd, 0x6c, 0x8d, 0xec, 0xf3, 0x5c, 0xc2, 0x85, 0xc8, 0x2d, 0x51, 0x4f, 0x1c, 0xfc, 0xc4, 0x1a, + 0x64, 0xad, 0x18, 0xbf, 0x91, 0x83, 0x29, 0xed, 0x64, 0x25, 0xd7, 0x15, 0xaf, 0xdb, 0x38, 0x10, + 0x85, 0x06, 0x83, 0xcc, 0x36, 0xe9, 0x8f, 0x7b, 0x5d, 0x09, 0xe0, 0xd8, 0x07, 0x0f, 0x37, 0x5b, + 0xd2, 0x09, 0x7b, 0xb0, 0x7e, 0xb8, 0x02, 0xa3, 0x3c, 0x82, 0xcf, 0x48, 0x6c, 0x74, 0x89, 0xfa, + 0x15, 0x93, 0x97, 0x1b, 0x7f, 0x50, 0x81, 0x69, 0xfd, 0x46, 0x4c, 0x5e, 0x83, 0x31, 0x54, 0xe8, + 0x4b, 0xf5, 0x0a, 0xaa, 0x85, 0x50, 0xe7, 0xaf, 0xf9, 0x25, 0x71, 0x18, 0xf2, 0x12, 0x40, 0x64, + 0xc0, 0x2f, 0x9f, 0xb3, 0x46, 0x8f, 0x0e, 0x2b, 0xb9, 0xd7, 0x4d, 0xa5, 0x82, 0x7c, 0x15, 0xe0, + 0xae, 0xd7, 0xa2, 0x22, 0x35, 0x66, 0x61, 0x90, 0x21, 0xca, 0xcb, 0xa9, 0xd4, 0x98, 0xa7, 0x5c, + 0xaf, 0x45, 0xd3, 0x79, 0x30, 0x15, 0x8a, 0xe4, 0xf3, 0x30, 0x6a, 0xf6, 0xda, 0x54, 0x3e, 0x7b, + 0x4c, 0xca, 0x13, 0xae, 0xd7, 0xa6, 0xb1, 0x9e, 0xc0, 0xef, 0x25, 0x6d, 0x2c, 0x59, 0x01, 0x79, + 0x8f, 0xa7, 0xcc, 0x14, 0x01, 0xd7, 0x47, 0xe3, 0x07, 0x3e, 0x45, 0xf2, 0x49, 0x85, 0x5c, 0x57, + 0x50, 0xc8, 0x3d, 0x18, 0x57, 0x5f, 0xa6, 0x94, 0xf0, 0x0d, 0xea, 0xeb, 0xa5, 0xa2, 0x74, 0x10, + 0x91, 0x67, 0x93, 0x8f, 0x56, 0x92, 0x0a, 0x79, 0x1b, 0x26, 0x18, 0x79, 0xc6, 0x39, 0x02, 0x71, + 0xab, 0xc1, 0x67, 0x3c, 0xe5, 0x83, 0x18, 0xf7, 0xd1, 0xc2, 0xa2, 0x47, 0x08, 0xe4, 0xcb, 0x30, + 0x51, 0xed, 0x76, 0xc5, 0x50, 0x0f, 0x34, 0x50, 0xba, 0x90, 0x1a, 0xea, 0x79, 0xbb, 0xdb, 0x4d, + 0x8f, 0x74, 0x4c, 0x8f, 0xec, 0x46, 0xd1, 0x03, 0x87, 0x49, 0x73, 0xfa, 0x4a, 0xaa, 0x81, 0x05, + 0x19, 0x10, 0x2f, 0xd5, 0x88, 0x4e, 0x97, 0x74, 0xa1, 0x1c, 0x0b, 0x95, 0xa2, 0x2d, 0x18, 0xd4, + 0xd6, 0xeb, 0xa9, 0xb6, 0xd4, 0x09, 0x4c, 0x35, 0x97, 0xa2, 0x4e, 0x5a, 0x30, 0x2d, 0x0f, 0x28, + 0xd1, 0xde, 0xe4, 0xa0, 0xf6, 0x5e, 0x4a, 0xb5, 0x37, 0xd7, 0xda, 0x4e, 0xb7, 0x93, 0xa0, 0x49, + 0xde, 0x86, 0x29, 0x59, 0x82, 0xfb, 0x03, 0x0d, 0x83, 0x84, 0x42, 0xb0, 0xb5, 0x8d, 0x2e, 0x43, + 0xda, 0xa8, 0x68, 0xc0, 0x2a, 0x36, 0x5f, 0x1d, 0x53, 0x1a, 0x76, 0x72, 0x55, 0xe8, 0xc0, 0xe4, + 0x4b, 0x30, 0xb9, 0xde, 0x61, 0x1d, 0xf1, 0x5c, 0x3b, 0xa4, 0xc2, 0xb1, 0x57, 0x1a, 0x5b, 0x29, + 0x35, 0xca, 0x52, 0x45, 0x33, 0x13, 0x27, 0xae, 0x52, 0xaf, 0x99, 0x0a, 0x06, 0x1b, 0x3c, 0xfe, + 0x14, 0x29, 0xd6, 0xb0, 0x74, 0xfa, 0x3d, 0x97, 0x61, 0xf0, 0xa4, 0x90, 0x17, 0xc1, 0xb5, 0x59, + 0xa9, 0x7c, 0x0a, 0x4c, 0x24, 0x36, 0x50, 0x69, 0x92, 0x77, 0x60, 0x52, 0x64, 0x80, 0xae, 0x9a, + 0x77, 0x83, 0x85, 0x72, 0x6c, 0xaf, 0x2d, 0x93, 0x45, 0x5b, 0xb6, 0x9f, 0xb0, 0xec, 0x8d, 0xe1, + 0xc9, 0x17, 0x61, 0xfe, 0x81, 0xe3, 0xb6, 0xbc, 0x47, 0x81, 0x38, 0xa6, 0x04, 0xa3, 0x9b, 0x8d, + 0xfd, 0x0a, 0x1f, 0xf1, 0xfa, 0x48, 0x16, 0x4c, 0x31, 0xbe, 0x4c, 0x0a, 0xe4, 0x07, 0x52, 0x94, + 0xf9, 0x0a, 0x22, 0x83, 0x56, 0xd0, 0x52, 0x6a, 0x05, 0xa5, 0x9b, 0x4f, 0x2e, 0xa7, 0xcc, 0x66, + 0x88, 0x07, 0x44, 0x3f, 0xdf, 0x6f, 0x79, 0x8e, 0xbb, 0x30, 0x87, 0xbc, 0xf0, 0x99, 0x64, 0x78, + 0x10, 0x84, 0xab, 0x7b, 0x6d, 0xa7, 0x79, 0xc0, 0xb3, 0xbd, 0x24, 0x65, 0xfe, 0x0f, 0x3d, 0xed, + 0xb9, 0x24, 0x83, 0x34, 0xf9, 0x12, 0x94, 0xd8, 0xff, 0x91, 0x52, 0x62, 0x5e, 0x33, 0x91, 0x55, + 0x20, 0x45, 0x3b, 0x38, 0x47, 0x98, 0xa2, 0x3a, 0x43, 0x5f, 0xa1, 0x91, 0x22, 0x6f, 0x02, 0x30, + 0xb1, 0x49, 0xb0, 0xe3, 0x53, 0x71, 0x1e, 0x09, 0x94, 0xba, 0xd2, 0x8c, 0x38, 0x06, 0x26, 0x6f, + 0xc3, 0x24, 0xfb, 0xd5, 0xe8, 0xb5, 0x3c, 0xb6, 0x37, 0x4e, 0x23, 0x2e, 0xf7, 0xb1, 0x66, 0xb8, + 0x01, 0x2f, 0xd7, 0x7c, 0xac, 0x63, 0x70, 0xb2, 0x06, 0x33, 0x98, 0xef, 0x43, 0x44, 0x9a, 0x77, + 0x68, 0xb0, 0x70, 0x46, 0x31, 0xa1, 0xc0, 0x34, 0xad, 0x4e, 0x54, 0xa7, 0xde, 0x65, 0x12, 0x68, + 0x24, 0x80, 0xb9, 0xf4, 0x1b, 0x74, 0xb0, 0xb0, 0x80, 0x83, 0x24, 0x25, 0xf8, 0x34, 0x04, 0xe7, + 0xc7, 0x6c, 0x46, 0x14, 0xc6, 0x25, 0x1f, 0x95, 0xd4, 0x06, 0xb3, 0xa8, 0x13, 0x13, 0xc8, 0xcd, + 0x95, 0x7a, 0x32, 0x21, 0xc6, 0x59, 0xec, 0x01, 0x4e, 0xf3, 0x6e, 0xb3, 0x6b, 0x0d, 0x48, 0x8a, + 0x91, 0x81, 0x4d, 0xbe, 0x1f, 0x4e, 0x49, 0x0e, 0x22, 0xaa, 0xc4, 0xba, 0x5e, 0x3c, 0x21, 0x27, + 0x6e, 0x6d, 0x47, 0x4d, 0xa7, 0x96, 0x74, 0x76, 0x13, 0xc4, 0x86, 0x49, 0x9c, 0x56, 0xd1, 0xe2, + 0x33, 0x83, 0x5a, 0xbc, 0x98, 0x6a, 0xf1, 0x34, 0x2e, 0x94, 0x74, 0x63, 0x2a, 0x4d, 0xb2, 0x0c, + 0x53, 0x62, 0x1f, 0x89, 0xd5, 0xf6, 0x2c, 0x8e, 0x16, 0x2a, 0xb1, 0xe4, 0x0e, 0x4c, 0x2d, 0x38, + 0x1d, 0x45, 0xe5, 0xc8, 0xfc, 0x31, 0xe9, 0x9c, 0xc6, 0x91, 0x93, 0x6f, 0x48, 0x3a, 0x30, 0xe3, + 0x48, 0xb1, 0x14, 0xb3, 0xfa, 0xb8, 0xeb, 0x0b, 0x15, 0xd5, 0x73, 0x71, 0xc6, 0x4b, 0x45, 0xf8, + 0xb1, 0x68, 0x04, 0xa1, 0xb2, 0x84, 0x2c, 0x0a, 0x64, 0x0b, 0xe6, 0xa2, 0x53, 0x5b, 0x21, 0x5c, + 0x89, 0x53, 0x2e, 0xc4, 0x47, 0x7d, 0x36, 0xdd, 0x2c, 0x7c, 0x62, 0xc3, 0x19, 0xed, 0x9c, 0x56, + 0x48, 0x9f, 0x47, 0xd2, 0x2f, 0xb3, 0x1b, 0x99, 0x7e, 0xc8, 0x67, 0x93, 0xef, 0x47, 0x87, 0x7c, + 0x08, 0x8b, 0xc9, 0xb3, 0x59, 0x69, 0xe5, 0x79, 0x6c, 0xe5, 0x95, 0xa3, 0xc3, 0xca, 0x85, 0xd4, + 0xf1, 0x9e, 0xdd, 0xd0, 0x00, 0x6a, 0xe4, 0xab, 0xb0, 0xa0, 0x9f, 0xcf, 0x4a, 0x4b, 0x06, 0xb6, + 0x84, 0x5b, 0x27, 0x3a, 0xd8, 0xb3, 0x5b, 0xe8, 0x4b, 0x83, 0x84, 0x50, 0xc9, 0x5c, 0xdd, 0x4a, + 0x33, 0x2f, 0xc4, 0x1d, 0x4a, 0xed, 0x92, 0xec, 0xe6, 0x8e, 0x23, 0x49, 0x1e, 0xc1, 0x73, 0x59, + 0xc7, 0x84, 0xd2, 0xe8, 0x8b, 0x91, 0x12, 0xf8, 0xd5, 0xec, 0x23, 0x27, 0xbb, 0xe5, 0x63, 0xc8, + 0x92, 0x2f, 0xc3, 0x29, 0x65, 0x7f, 0x29, 0xed, 0xbd, 0x84, 0xed, 0x61, 0x54, 0x00, 0x75, 0x63, + 0x66, 0xb7, 0x92, 0x4d, 0x83, 0x74, 0x60, 0x4e, 0x76, 0x1c, 0xb5, 0xed, 0xe2, 0xe8, 0xb9, 0xa0, + 0x71, 0xd5, 0x34, 0xc4, 0xf2, 0x79, 0xc1, 0x55, 0x17, 0x5a, 0xdb, 0x56, 0x37, 0x46, 0x54, 0x57, + 0x7a, 0x06, 0x5d, 0xb2, 0x06, 0x63, 0x8d, 0xfa, 0xfa, 0x8d, 0x1b, 0xab, 0x0b, 0x2f, 0x63, 0x0b, + 0xd2, 0xef, 0x8f, 0x17, 0x6a, 0x97, 0x26, 0x61, 0xe3, 0xd8, 0x75, 0x76, 0x76, 0xb4, 0x07, 0x2b, + 0x0e, 0x4a, 0x7e, 0x00, 0xad, 0x0b, 0x19, 0x47, 0xad, 0x06, 0x81, 0xb3, 0xeb, 0xf2, 0x64, 0x16, + 0xaf, 0x68, 0xef, 0xfd, 0x32, 0xbd, 0xc9, 0x0a, 0x26, 0xa3, 0x4d, 0x81, 0x73, 0x69, 0x93, 0xdd, + 0xff, 0x05, 0xe7, 0xb6, 0xec, 0x98, 0x94, 0xca, 0xc4, 0xd3, 0x0d, 0xb1, 0x71, 0xdb, 0x75, 0x42, + 0x6b, 0xaf, 0xa7, 0x75, 0x7f, 0xe1, 0x55, 0x2d, 0x98, 0x38, 0x4f, 0xd1, 0xab, 0x8c, 0xda, 0x8b, + 0xa2, 0xc1, 0x67, 0xf9, 0x6d, 0xb9, 0xcf, 0xc8, 0xcd, 0xee, 0x26, 0xf0, 0x02, 0xf2, 0xc3, 0x39, + 0x38, 0xfd, 0xc0, 0xf3, 0xf7, 0xdb, 0x9e, 0xdd, 0x92, 0xbd, 0x12, 0x3c, 0xfc, 0xb5, 0x41, 0x3c, + 0xfc, 0x33, 0x29, 0x1e, 0x6e, 0x3c, 0x12, 0x64, 0xac, 0x28, 0x3b, 0x4c, 0x8a, 0x9f, 0xf7, 0x69, + 0x8a, 0xfc, 0x00, 0x9c, 0xcf, 0xae, 0x51, 0x16, 0xe5, 0xeb, 0xb8, 0x28, 0xaf, 0x1e, 0x1d, 0x56, + 0x5e, 0xef, 0xd7, 0x52, 0xf6, 0x02, 0x3d, 0x96, 0x34, 0xf9, 0x3c, 0x14, 0xee, 0xac, 0xd4, 0x17, + 0x2e, 0x6b, 0x4f, 0xcf, 0x77, 0x56, 0xea, 0xca, 0x40, 0x71, 0x8d, 0x66, 0xa7, 0xa9, 0x69, 0x34, + 0xef, 0xac, 0xd4, 0x6f, 0x8d, 0x14, 0x2f, 0x96, 0x2f, 0xdd, 0x1a, 0x29, 0x5e, 0x2a, 0xbf, 0x62, + 0x3e, 0xdb, 0xa8, 0xde, 0xd9, 0x58, 0x6f, 0xc9, 0x83, 0x59, 0x26, 0xbf, 0xe1, 0xed, 0x99, 0x17, + 0x06, 0xd5, 0xc6, 0x5f, 0x63, 0xfc, 0xb5, 0x1c, 0x54, 0x8e, 0x59, 0x60, 0xec, 0x2c, 0x8c, 0x3f, + 0xae, 0x11, 0x25, 0x5c, 0xe0, 0x4e, 0x85, 0x51, 0x85, 0xa5, 0x9b, 0x9c, 0xe8, 0x28, 0xe8, 0x70, + 0x2a, 0xf2, 0xb6, 0x29, 0x7e, 0xc7, 0xe9, 0x7c, 0x6d, 0x12, 0xca, 0xd8, 0x80, 0x72, 0x72, 0xe1, + 0x91, 0xcf, 0xc1, 0x94, 0x9a, 0x35, 0x4a, 0xaa, 0x21, 0x78, 0xb4, 0x1d, 0x7f, 0x57, 0x3b, 0x4c, + 0x35, 0x40, 0xe3, 0x02, 0x4c, 0xeb, 0x43, 0x4c, 0xe6, 0x61, 0x34, 0xf4, 0xbc, 0xb6, 0xa0, 0x61, + 0xf2, 0x1f, 0xc6, 0x2f, 0xe4, 0x60, 0x2e, 0x63, 0x17, 0x93, 0x0b, 0x30, 0x82, 0x29, 0x65, 0x15, + 0xcb, 0xa4, 0x44, 0x2a, 0x59, 0xac, 0x27, 0x9f, 0x86, 0xf1, 0xda, 0xdd, 0x46, 0xa3, 0x7a, 0x57, + 0x2a, 0x3c, 0xf8, 0x61, 0xef, 0x06, 0x56, 0x60, 0xeb, 0x06, 0x0d, 0x02, 0x8c, 0xbc, 0x0e, 0x63, + 0xeb, 0x75, 0x44, 0x50, 0x52, 0xcf, 0x38, 0xdd, 0x24, 0xbc, 0x00, 0x32, 0x7e, 0x22, 0x07, 0x24, + 0xcd, 0x92, 0xc8, 0x55, 0x98, 0x54, 0x19, 0x1f, 0x1f, 0x17, 0x7c, 0xe5, 0x55, 0x36, 0xa7, 0xa9, + 0xc2, 0x90, 0x1a, 0x8c, 0x62, 0x86, 0xc6, 0xc8, 0x92, 0x22, 0x73, 0xeb, 0x9d, 0x49, 0x6d, 0xbd, + 0x51, 0xcc, 0xfa, 0x68, 0x72, 0x64, 0xe3, 0x8f, 0x73, 0x40, 0xb2, 0x8d, 0x2a, 0x87, 0xb2, 0xe4, + 0x7a, 0x43, 0x89, 0x6f, 0xa1, 0x5a, 0x55, 0x46, 0x19, 0x7f, 0x55, 0x55, 0x43, 0x1c, 0x09, 0xe3, + 0x82, 0xa6, 0xda, 0xea, 0xef, 0x14, 0x7d, 0x09, 0x46, 0xef, 0x53, 0x7f, 0x5b, 0xda, 0x9b, 0xa3, + 0x8d, 0xea, 0x43, 0x56, 0xa0, 0xaa, 0x7a, 0x10, 0x42, 0x33, 0xef, 0x1c, 0x1d, 0xd6, 0xbc, 0xf3, + 0x0f, 0x72, 0x30, 0x9f, 0x75, 0x79, 0x3a, 0xc6, 0xe1, 0xd9, 0x48, 0xf8, 0x6a, 0xa3, 0xe9, 0x17, + 0xb7, 0x7a, 0x8d, 0x3c, 0xb4, 0x2b, 0x30, 0xca, 0x46, 0x48, 0x2e, 0x0b, 0xd4, 0xcf, 0xb1, 0x21, + 0x0c, 0x4c, 0x5e, 0xce, 0x00, 0xe2, 0x8c, 0x21, 0xa3, 0x1c, 0x80, 0x27, 0x0a, 0xe1, 0xe5, 0x0c, + 0xe0, 0x8e, 0xd7, 0xa2, 0x52, 0x6f, 0x85, 0x00, 0x1d, 0x56, 0x60, 0xf2, 0x72, 0x72, 0x01, 0xc6, + 0xef, 0xb9, 0x1b, 0xd4, 0x7e, 0x28, 0x33, 0x93, 0xa1, 0xa9, 0x9a, 0xe7, 0x5a, 0x6d, 0x56, 0x66, + 0xca, 0x4a, 0xe3, 0x67, 0x73, 0x30, 0x9b, 0xba, 0xb7, 0x1d, 0xef, 0xd3, 0x3d, 0xd8, 0x4f, 0x71, + 0x98, 0xfe, 0xf1, 0xcf, 0x1f, 0xc9, 0xfe, 0x7c, 0xe3, 0xbf, 0x19, 0x83, 0x33, 0x7d, 0xd4, 0x68, + 0xb1, 0x1f, 0x75, 0xee, 0x58, 0x3f, 0xea, 0xaf, 0xc0, 0xd4, 0x4a, 0xdb, 0x76, 0x3a, 0xc1, 0xa6, + 0x17, 0x7f, 0x71, 0xec, 0x8e, 0x85, 0x75, 0xc2, 0xab, 0x23, 0xf2, 0xdb, 0x39, 0xdb, 0x44, 0x0c, + 0x2b, 0xf4, 0xd2, 0x52, 0xbc, 0x46, 0x2c, 0xe5, 0xc9, 0x5c, 0xf8, 0x33, 0xe2, 0xc9, 0xac, 0xfb, + 0xd6, 0x8d, 0x3c, 0x51, 0xdf, 0xba, 0x6c, 0x0b, 0xf6, 0xd1, 0x8f, 0xe3, 0xcf, 0xb0, 0x02, 0x53, + 0xdc, 0x56, 0xaf, 0x1a, 0xf0, 0x49, 0x1a, 0x4b, 0xd9, 0xf7, 0xd9, 0x41, 0x7a, 0x2e, 0x34, 0x1c, + 0xb2, 0xa6, 0xfb, 0x81, 0x8d, 0xe3, 0x63, 0xf6, 0x85, 0xfe, 0x7e, 0x5e, 0x7a, 0x30, 0x21, 0xd5, + 0xdf, 0xeb, 0x1b, 0x30, 0x9f, 0x75, 0x0f, 0x5f, 0x28, 0x6a, 0x66, 0xc0, 0x7d, 0x6d, 0xce, 0x87, + 0xbf, 0xcd, 0xef, 0x67, 0xde, 0xe6, 0xa5, 0x7f, 0xfe, 0x44, 0x7f, 0xe7, 0xa6, 0x78, 0x2f, 0x70, + 0xd8, 0xc1, 0x5e, 0xfc, 0xc6, 0x57, 0x12, 0x01, 0x16, 0x92, 0xe8, 0xe4, 0x2d, 0x2d, 0x0e, 0xd6, + 0xcb, 0xe9, 0x38, 0x58, 0xd9, 0x31, 0x15, 0x78, 0x92, 0xa9, 0x9f, 0xcd, 0xeb, 0x5e, 0xe1, 0x7f, + 0x16, 0x37, 0xea, 0x25, 0x18, 0x7d, 0xb0, 0x47, 0x7d, 0x79, 0xa6, 0xe0, 0x87, 0x3c, 0x62, 0x05, + 0xea, 0x87, 0x20, 0x04, 0xb9, 0x01, 0xd3, 0x75, 0xbe, 0x70, 0xe5, 0x6a, 0x1c, 0x89, 0x95, 0x41, + 0x5d, 0xa1, 0xb2, 0xcc, 0x58, 0x8e, 0x09, 0x2c, 0xe3, 0x66, 0x62, 0xd0, 0x45, 0x14, 0x2f, 0xee, + 0xe7, 0xc5, 0xa5, 0x8e, 0xe9, 0xd8, 0x5f, 0x2f, 0x66, 0xb6, 0x66, 0xa2, 0xd4, 0xd8, 0x81, 0xe7, + 0x06, 0x12, 0x62, 0x87, 0x3d, 0x74, 0xa3, 0x5f, 0x09, 0x93, 0xf0, 0x81, 0xa8, 0xa6, 0x82, 0x67, + 0x7c, 0x03, 0x4a, 0xea, 0x28, 0xe3, 0x11, 0xc4, 0x7e, 0x8b, 0x55, 0xc1, 0x8f, 0x20, 0x56, 0x60, + 0xf2, 0xf2, 0xf8, 0x91, 0x29, 0x9f, 0xfd, 0xc8, 0x14, 0x4f, 0x7f, 0xe1, 0xb8, 0xe9, 0x67, 0x8d, + 0x23, 0x87, 0x53, 0x1a, 0xc7, 0xdf, 0x6a, 0xe3, 0x18, 0x5b, 0xcb, 0xe4, 0xe5, 0x4f, 0xb4, 0xf1, + 0x7f, 0x2e, 0x93, 0x14, 0xa2, 0x1b, 0x99, 0xdc, 0xee, 0xb9, 0x38, 0x1f, 0x6d, 0xd6, 0xee, 0x8d, + 0x21, 0x63, 0x41, 0x24, 0x7f, 0xac, 0x20, 0x72, 0x82, 0x85, 0x88, 0x42, 0x35, 0x9f, 0xd2, 0x91, + 0x58, 0x78, 0xb4, 0x53, 0x66, 0x38, 0x12, 0xca, 0xf8, 0x56, 0x0e, 0x4e, 0x65, 0x2a, 0xf3, 0x59, + 0xab, 0xfc, 0xd5, 0x40, 0xd9, 0x87, 0xc9, 0x27, 0x03, 0x0e, 0x71, 0x92, 0x18, 0x25, 0xc3, 0xf7, + 0xc5, 0x78, 0x1e, 0x26, 0xa2, 0xa7, 0x64, 0x26, 0x9c, 0xf3, 0xa9, 0xe3, 0x41, 0x18, 0xc5, 0x8b, + 0x64, 0x03, 0x80, 0x7d, 0xc1, 0x13, 0xb5, 0xf9, 0x36, 0xfe, 0x79, 0x1e, 0xc6, 0x18, 0xd5, 0xa7, + 0x36, 0x5c, 0x74, 0xb6, 0xa1, 0x36, 0xeb, 0x52, 0xff, 0x20, 0xd1, 0x64, 0x15, 0xc6, 0x78, 0x82, + 0x3d, 0xf1, 0x2c, 0x39, 0xa7, 0xa2, 0xc9, 0xcc, 0x7b, 0x51, 0x70, 0x8d, 0x00, 0x4b, 0x34, 0xf5, + 0x05, 0x96, 0x28, 0xf6, 0xde, 0xbf, 0x93, 0x83, 0x92, 0x8a, 0x4c, 0xbe, 0x04, 0xd3, 0x32, 0x04, + 0x2e, 0x0f, 0x38, 0x23, 0xde, 0xbd, 0xa5, 0x8d, 0x9a, 0x0c, 0x81, 0xab, 0x06, 0xa8, 0xd1, 0xe0, + 0x55, 0x56, 0xdd, 0x55, 0x81, 0x49, 0x0b, 0x48, 0x67, 0xc7, 0xb6, 0x1e, 0x51, 0x7b, 0x9f, 0x06, + 0xa1, 0xc5, 0x6d, 0x89, 0xc4, 0xf3, 0xb8, 0x24, 0x7f, 0xe7, 0x46, 0x95, 0x9b, 0x11, 0xb1, 0x99, + 0x10, 0xb1, 0x8c, 0x53, 0x38, 0xea, 0x9b, 0x5f, 0x67, 0xc7, 0x7e, 0xc0, 0x2b, 0x39, 0x9e, 0xf1, + 0x87, 0x63, 0x7c, 0xb9, 0x89, 0x98, 0xd9, 0xdb, 0x30, 0x7d, 0x6f, 0xbd, 0xb6, 0xa2, 0xbc, 0x00, + 0xe8, 0x29, 0xd7, 0x56, 0x1f, 0x87, 0xd4, 0x77, 0xed, 0xb6, 0xbc, 0x4c, 0xc7, 0x47, 0x90, 0xe7, + 0xb4, 0x9a, 0xd9, 0xaf, 0x03, 0x09, 0x8a, 0xac, 0x0d, 0x7e, 0x6d, 0x8f, 0xda, 0xc8, 0x0f, 0xd9, + 0x46, 0x60, 0x77, 0xda, 0x7d, 0xda, 0xd0, 0x29, 0x92, 0x3d, 0xbc, 0x57, 0xef, 0xf5, 0xb6, 0x95, + 0x56, 0x0a, 0x83, 0x5b, 0x79, 0x41, 0xb4, 0xf2, 0x8c, 0xd0, 0xf7, 0x64, 0xb6, 0x93, 0xa2, 0x1a, + 0xf3, 0x89, 0x91, 0x63, 0xf9, 0xc4, 0x7f, 0x98, 0x83, 0x31, 0x2e, 0xbe, 0x8a, 0x65, 0xdc, 0x47, + 0x40, 0x7e, 0xf0, 0x64, 0x04, 0xe4, 0x32, 0x9e, 0x13, 0xda, 0x82, 0xe6, 0x75, 0xa4, 0x96, 0xd8, + 0x17, 0xd2, 0x4d, 0x01, 0xdf, 0xf2, 0x78, 0xcd, 0xf1, 0xdb, 0x82, 0xac, 0xc7, 0xe1, 0x4e, 0xc6, + 0x8f, 0xf5, 0x71, 0x97, 0x21, 0x62, 0xc6, 0x45, 0xb8, 0x13, 0x3d, 0xc8, 0xc9, 0x06, 0x4c, 0x88, + 0x20, 0x2a, 0xcb, 0x07, 0xe2, 0xc5, 0xbe, 0xac, 0xd9, 0x5c, 0xb5, 0x96, 0x0f, 0x62, 0xd1, 0x5c, + 0x84, 0x61, 0xb1, 0xb6, 0x55, 0x7f, 0x85, 0x98, 0x00, 0xb9, 0xc7, 0xb3, 0xa9, 0xf3, 0x98, 0xe2, + 0x7a, 0x1a, 0x91, 0xa8, 0x5c, 0xc4, 0x94, 0x93, 0x91, 0x18, 0x32, 0x42, 0x88, 0xc7, 0x34, 0xc8, + 0x06, 0x94, 0xd1, 0x4e, 0x8f, 0xb6, 0xf8, 0xae, 0x59, 0xaf, 0xf1, 0x40, 0x1d, 0xc2, 0xd6, 0x3a, + 0xe4, 0x75, 0x62, 0xbb, 0x25, 0xbc, 0x49, 0x53, 0x98, 0xc6, 0xcf, 0xe4, 0xa1, 0x9c, 0x5c, 0x7d, + 0xe4, 0x6d, 0x98, 0x8c, 0x62, 0xba, 0x47, 0xfe, 0xec, 0xf8, 0x72, 0x17, 0x07, 0x81, 0xd7, 0x73, + 0x70, 0x2b, 0xe0, 0x64, 0x09, 0x8a, 0x6c, 0x13, 0xbb, 0x71, 0x48, 0x4e, 0x64, 0xdb, 0x3d, 0x51, + 0xa6, 0xde, 0xea, 0x25, 0x1c, 0x69, 0xc0, 0x1c, 0xdb, 0x34, 0x0d, 0xc7, 0xdd, 0x6d, 0xd3, 0x0d, + 0x6f, 0xd7, 0xeb, 0x85, 0x71, 0x4a, 0x6a, 0x7e, 0x81, 0xb1, 0x3b, 0x6d, 0xad, 0x5a, 0x4f, 0x48, + 0x9d, 0x81, 0x4d, 0x5e, 0xe7, 0xc7, 0xcc, 0x7a, 0x4d, 0x18, 0xdc, 0xe0, 0x51, 0x8d, 0x86, 0x62, + 0xda, 0xc7, 0x0b, 0x20, 0x85, 0xb3, 0xfe, 0x7e, 0x1e, 0x26, 0x95, 0xe5, 0x47, 0x2e, 0x41, 0x71, + 0x3d, 0xd8, 0xf0, 0x9a, 0xfb, 0x51, 0x8c, 0xd2, 0xa9, 0xa3, 0xc3, 0xca, 0x84, 0x13, 0x58, 0x6d, + 0x2c, 0x34, 0xa3, 0x6a, 0xb2, 0x0c, 0x53, 0xfc, 0x2f, 0x99, 0x9c, 0x27, 0x1f, 0x2b, 0xee, 0x38, + 0xb0, 0x4c, 0xcb, 0xa3, 0x32, 0x5b, 0x0d, 0x85, 0x7c, 0x00, 0xc0, 0x0b, 0x30, 0x40, 0x44, 0x61, + 0xf8, 0xd0, 0x16, 0xa2, 0x81, 0x8c, 0xd0, 0x10, 0x0a, 0x41, 0xf2, 0x35, 0x1e, 0x32, 0x5e, 0x6e, + 0x97, 0x91, 0xe1, 0x63, 0x73, 0x30, 0xfa, 0x56, 0x76, 0x88, 0x20, 0x95, 0xa4, 0xc8, 0xa7, 0xb5, + 0x28, 0x93, 0xa7, 0x56, 0x43, 0x04, 0x54, 0x20, 0x8c, 0xff, 0x39, 0xa7, 0x6c, 0x32, 0x72, 0x17, + 0x26, 0xa2, 0x05, 0x24, 0x6c, 0xdd, 0xa2, 0x2b, 0x86, 0x2c, 0x37, 0xe9, 0xce, 0xf2, 0x33, 0xc2, + 0xec, 0x6e, 0x2e, 0x5a, 0x86, 0xda, 0x9e, 0x93, 0x85, 0xe4, 0x0b, 0x30, 0x82, 0x43, 0x97, 0x3f, + 0xb6, 0x6b, 0xf2, 0x94, 0x1f, 0x61, 0x63, 0x86, 0x1d, 0x41, 0x4c, 0xf2, 0x69, 0xe1, 0x86, 0xce, + 0x07, 0x7f, 0x5a, 0x39, 0xaa, 0xd9, 0x77, 0x44, 0xc7, 0x7b, 0x1c, 0x25, 0x4a, 0x59, 0x3d, 0x7f, + 0x2d, 0x0f, 0xe5, 0xe4, 0xd6, 0x26, 0xef, 0x41, 0x49, 0x1e, 0xbf, 0x6b, 0xb6, 0xc8, 0x2c, 0x53, + 0x12, 0x99, 0x5d, 0xe4, 0x19, 0xbc, 0x67, 0xab, 0xb6, 0x71, 0xa6, 0x86, 0xc0, 0x64, 0xa1, 0x4d, + 0x11, 0x6a, 0x52, 0xd9, 0x54, 0xa1, 0x17, 0x76, 0x13, 0x91, 0xca, 0x25, 0x18, 0x79, 0x03, 0x0a, + 0x77, 0x6e, 0x54, 0x85, 0xe7, 0x61, 0x39, 0x79, 0x48, 0x0b, 0x85, 0xb7, 0x66, 0x50, 0xcc, 0xe0, + 0xc9, 0x86, 0x12, 0xd4, 0x7f, 0x4c, 0xb3, 0x83, 0x94, 0xc5, 0x51, 0xe7, 0x8e, 0x8f, 0xee, 0x7f, + 0x6b, 0xa4, 0x58, 0x28, 0x8f, 0x88, 0x40, 0xcf, 0xff, 0xba, 0x00, 0x13, 0x51, 0xfb, 0x84, 0xa8, + 0x4e, 0xe0, 0xc2, 0xe1, 0xfb, 0x2c, 0x14, 0xa5, 0x74, 0x27, 0x1c, 0x10, 0xc7, 0x03, 0x21, 0xd9, + 0x2d, 0x80, 0x14, 0xe3, 0x38, 0x57, 0x30, 0xe5, 0x4f, 0x72, 0x15, 0x22, 0x19, 0xad, 0x9f, 0x30, + 0x37, 0xc2, 0x26, 0xcc, 0x8c, 0xc0, 0xc8, 0x34, 0xe4, 0x1d, 0x1e, 0x3c, 0x6f, 0xc2, 0xcc, 0x3b, + 0x2d, 0xf2, 0x1e, 0x14, 0xed, 0x56, 0x0b, 0x33, 0xe5, 0x0e, 0x91, 0x64, 0xb7, 0xc8, 0xa8, 0xf1, + 0x33, 0x03, 0xb1, 0xaa, 0x21, 0xa9, 0xc2, 0x04, 0x8f, 0x46, 0x1e, 0xd0, 0xd6, 0x10, 0x07, 0x50, + 0x4c, 0x01, 0x83, 0x98, 0x6f, 0x05, 0xb4, 0x45, 0x5e, 0x86, 0x11, 0x36, 0x9b, 0xe2, 0xc4, 0x91, + 0x42, 0x25, 0x9b, 0x4c, 0x3e, 0x60, 0x6b, 0x9f, 0x32, 0x11, 0x80, 0xbc, 0x08, 0x85, 0xde, 0xd2, + 0x8e, 0x38, 0x4b, 0xca, 0x71, 0x82, 0x8d, 0x08, 0x8c, 0x55, 0x93, 0x6b, 0x50, 0x7c, 0xa4, 0xe7, + 0x66, 0x38, 0x95, 0x98, 0xc6, 0x08, 0x3e, 0x02, 0x24, 0x2f, 0x43, 0x21, 0x08, 0x3c, 0x61, 0x69, + 0x35, 0x17, 0x99, 0xbf, 0xde, 0x8b, 0x66, 0x8d, 0x51, 0x0f, 0x02, 0x6f, 0xb9, 0x08, 0x63, 0xfc, + 0x80, 0x31, 0x9e, 0x03, 0x88, 0xbf, 0x31, 0xed, 0x50, 0x6a, 0x7c, 0x00, 0x13, 0xd1, 0xb7, 0x91, + 0x73, 0x00, 0xfb, 0xf4, 0xc0, 0xda, 0xb3, 0xdd, 0x56, 0x9b, 0x4b, 0xa7, 0x25, 0x73, 0x62, 0x9f, + 0x1e, 0xac, 0x61, 0x01, 0x39, 0x03, 0xe3, 0x5d, 0x36, 0xfd, 0x62, 0x8d, 0x97, 0xcc, 0xb1, 0x6e, + 0x6f, 0x9b, 0x2d, 0xe5, 0x05, 0x18, 0x47, 0x3d, 0xab, 0xd8, 0x91, 0x53, 0xa6, 0xfc, 0x69, 0xfc, + 0x51, 0x01, 0x53, 0x98, 0x29, 0x1d, 0x22, 0x2f, 0xc0, 0x54, 0xd3, 0xa7, 0x78, 0x96, 0xd9, 0x4c, + 0x42, 0x13, 0xed, 0x94, 0xe2, 0xc2, 0xf5, 0x16, 0xb9, 0x00, 0x33, 0x71, 0xb6, 0x69, 0xab, 0xb9, + 0x2d, 0x72, 0xae, 0x94, 0xcc, 0xa9, 0xae, 0xcc, 0x39, 0xbd, 0xb2, 0x8d, 0xd1, 0x21, 0xcb, 0x6a, + 0x70, 0x73, 0x36, 0x22, 0x62, 0xfd, 0xcd, 0x28, 0xe5, 0x68, 0x34, 0x7a, 0x1a, 0xc6, 0x6c, 0x7b, + 0xb7, 0xe7, 0xf0, 0x28, 0x6e, 0x25, 0x53, 0xfc, 0x22, 0xaf, 0xc2, 0x6c, 0x9c, 0x2d, 0x40, 0x76, + 0x63, 0x14, 0xbb, 0x51, 0x8e, 0x2a, 0x56, 0x78, 0x39, 0x79, 0x1d, 0x88, 0xda, 0x9e, 0xb7, 0xfd, + 0x21, 0x6d, 0xf2, 0x35, 0x59, 0x32, 0x67, 0x95, 0x9a, 0x7b, 0x58, 0x41, 0x9e, 0x87, 0x92, 0x4f, + 0x03, 0x94, 0x0e, 0x71, 0xd8, 0x30, 0xc3, 0xa7, 0x39, 0x29, 0xcb, 0xd8, 0xd8, 0x5d, 0x84, 0xb2, + 0x32, 0x1c, 0x18, 0x3f, 0x9e, 0xa7, 0x1b, 0x31, 0xa7, 0xe3, 0x72, 0xb3, 0xbb, 0xde, 0x22, 0x5f, + 0x84, 0x45, 0x05, 0x92, 0x27, 0x1b, 0xb5, 0x68, 0xdb, 0xd9, 0x75, 0xb6, 0xdb, 0x54, 0xac, 0xb7, + 0xf4, 0xaa, 0x8e, 0xae, 0x90, 0xe6, 0x42, 0x8c, 0xcd, 0xd3, 0x90, 0xae, 0x0a, 0x5c, 0xb2, 0x01, + 0xf3, 0x09, 0xca, 0xb4, 0x65, 0xf5, 0xba, 0x7d, 0xc3, 0x26, 0xc6, 0x34, 0x89, 0x4e, 0x93, 0xb6, + 0xb6, 0xba, 0xc6, 0x37, 0xa0, 0xa4, 0xae, 0x49, 0x36, 0x08, 0xaa, 0x5c, 0x22, 0x56, 0xdf, 0x64, + 0x54, 0xb6, 0xce, 0xee, 0x85, 0xd3, 0x31, 0x08, 0x4e, 0x22, 0x67, 0x2f, 0x53, 0x51, 0x29, 0x4e, + 0xe1, 0xf3, 0x50, 0x6a, 0x39, 0x41, 0xb7, 0x6d, 0x1f, 0xa0, 0xe9, 0x9f, 0x98, 0xe9, 0x49, 0x51, + 0x86, 0x8a, 0x9f, 0x65, 0x98, 0x4d, 0xf1, 0x41, 0x45, 0xd2, 0xe0, 0x7c, 0x7d, 0xb0, 0xa4, 0x61, + 0xb8, 0x50, 0x52, 0xcf, 0xb5, 0x63, 0x92, 0x03, 0x9d, 0xc6, 0xa0, 0x42, 0x9c, 0xe9, 0x8f, 0x1d, + 0x1d, 0x56, 0xf2, 0x4e, 0x0b, 0x43, 0x09, 0x5d, 0x84, 0xa2, 0x94, 0xd8, 0x84, 0xa0, 0x84, 0x8f, + 0x09, 0xf2, 0xcd, 0xd4, 0x8c, 0x6a, 0x8d, 0x97, 0x61, 0x5c, 0x1c, 0x5d, 0x83, 0x9f, 0x10, 0x8c, + 0x6f, 0xe6, 0x61, 0xc6, 0xa4, 0x8c, 0xb1, 0x52, 0x9e, 0x11, 0xec, 0xa9, 0xbd, 0xa2, 0x67, 0x47, + 0x09, 0xd6, 0xfa, 0x36, 0x20, 0x17, 0xd7, 0x2f, 0xe5, 0x60, 0x2e, 0x03, 0xf6, 0x23, 0xe5, 0xa2, + 0xbe, 0x0e, 0x13, 0x35, 0xc7, 0x6e, 0x57, 0x5b, 0xad, 0x28, 0xc2, 0x10, 0xca, 0xf9, 0x98, 0xb0, + 0xce, 0x66, 0xa5, 0xaa, 0x10, 0x13, 0x81, 0x92, 0x57, 0xc4, 0xa2, 0x28, 0x44, 0xc3, 0x8a, 0x8b, + 0xe2, 0xbb, 0x87, 0x15, 0xe0, 0xdf, 0xb4, 0x19, 0x2d, 0x11, 0x8c, 0xdc, 0xcd, 0x0b, 0x63, 0x87, + 0xaf, 0xa7, 0x76, 0xea, 0xb2, 0x23, 0x77, 0x27, 0xbb, 0x37, 0x54, 0x3a, 0xae, 0x9f, 0xcc, 0xc3, + 0xe9, 0x6c, 0xc4, 0x8f, 0x9a, 0x56, 0x1c, 0x13, 0xa1, 0x29, 0xd9, 0x06, 0x30, 0xad, 0x38, 0xcf, + 0x9a, 0x86, 0xf0, 0x31, 0x00, 0xd9, 0xe1, 0xe9, 0xfb, 0xd7, 0xa8, 0xed, 0x87, 0xdb, 0xd4, 0x0e, + 0x87, 0x90, 0xe4, 0xa5, 0x99, 0xc7, 0x02, 0x0a, 0x13, 0x7b, 0x12, 0x33, 0x2b, 0x7b, 0x7f, 0x44, + 0x36, 0x5a, 0x28, 0x23, 0x43, 0x2c, 0x94, 0xaf, 0xc3, 0x4c, 0x83, 0x76, 0xec, 0xee, 0x9e, 0xe7, + 0xcb, 0x40, 0x0e, 0x97, 0x61, 0x2a, 0x2a, 0xca, 0x5c, 0x2d, 0x7a, 0xb5, 0x06, 0xaf, 0x0c, 0x44, + 0xcc, 0x4a, 0xf4, 0x6a, 0xe3, 0xaf, 0xe7, 0xe1, 0x4c, 0xb5, 0x29, 0x6c, 0x56, 0x45, 0x85, 0x34, + 0xad, 0xff, 0x84, 0xdb, 0x26, 0x57, 0x60, 0xe2, 0x8e, 0xfd, 0x78, 0x83, 0xda, 0x01, 0x0d, 0x44, + 0x2a, 0x0b, 0x2e, 0xf6, 0xda, 0x8f, 0xe3, 0xc7, 0x1f, 0x33, 0x86, 0x51, 0xd5, 0x08, 0x23, 0x1f, + 0x53, 0x8d, 0x60, 0xc0, 0xd8, 0x9a, 0xd7, 0x6e, 0x89, 0xb3, 0x5e, 0xbc, 0x38, 0xef, 0x61, 0x89, + 0x29, 0x6a, 0x8c, 0x3f, 0xc8, 0xc1, 0x74, 0xf4, 0xc5, 0xf8, 0x09, 0x9f, 0xf8, 0x90, 0x5c, 0x80, + 0x71, 0x6c, 0x68, 0xbd, 0xa6, 0x1e, 0x1a, 0x6d, 0x8a, 0xa9, 0x39, 0x5b, 0xa6, 0xac, 0x54, 0x47, + 0x62, 0xf4, 0xe3, 0x8d, 0x84, 0xf1, 0xf7, 0xf1, 0x31, 0x5b, 0xed, 0x25, 0x3b, 0x89, 0x94, 0x0f, + 0xc9, 0x0d, 0xf9, 0x21, 0xf9, 0x27, 0x36, 0x25, 0x85, 0xbe, 0x53, 0xf2, 0xa3, 0x79, 0x98, 0x8c, + 0x3e, 0xf6, 0x7b, 0x2c, 0xe5, 0x45, 0xd4, 0xaf, 0xa1, 0x82, 0x2f, 0x35, 0x14, 0x5e, 0x21, 0x62, + 0x1c, 0x7d, 0x01, 0xc6, 0xc4, 0x66, 0xca, 0x25, 0x4c, 0xcc, 0x13, 0xb3, 0xbb, 0x3c, 0x2d, 0x48, + 0x8f, 0xe1, 0x84, 0x06, 0xa6, 0xc0, 0xc3, 0xe8, 0x56, 0x0f, 0xe8, 0xb6, 0xb0, 0x6d, 0x78, 0x6a, + 0xcf, 0xa8, 0xec, 0xe8, 0x56, 0x71, 0xc7, 0x86, 0x3a, 0x9d, 0xfe, 0xbb, 0x22, 0x94, 0x93, 0x28, + 0xc7, 0x27, 0x15, 0xa9, 0xf7, 0xb6, 0xf9, 0x55, 0x85, 0x27, 0x15, 0xe9, 0xf6, 0xb6, 0x4d, 0x56, + 0x86, 0xf6, 0x52, 0xbe, 0xf3, 0x10, 0x7b, 0x5d, 0x12, 0xf6, 0x52, 0xbe, 0xf3, 0x50, 0xb3, 0x97, + 0xf2, 0x9d, 0x87, 0xa8, 0x48, 0xd8, 0x68, 0x60, 0xe4, 0x07, 0xbc, 0xa7, 0x08, 0x45, 0x42, 0x3b, + 0x48, 0x66, 0x4a, 0x94, 0x60, 0xec, 0xa8, 0x5c, 0xa6, 0xb6, 0x2f, 0x12, 0x60, 0x08, 0x76, 0x86, + 0x47, 0xe5, 0x36, 0x16, 0x5b, 0x21, 0x2b, 0x37, 0x55, 0x20, 0xd2, 0x06, 0xa2, 0xfc, 0x94, 0x1b, + 0xf8, 0xf8, 0xbb, 0xb5, 0x34, 0x0f, 0x9d, 0x57, 0x49, 0x5b, 0xea, 0x6e, 0xce, 0xa0, 0xfb, 0x24, + 0xb5, 0xbf, 0x75, 0x11, 0x20, 0x17, 0x15, 0x48, 0xc5, 0x63, 0x89, 0xc9, 0x88, 0x35, 0xc0, 0x03, + 0xe8, 0x46, 0x6a, 0xa4, 0x98, 0x08, 0x79, 0x17, 0x26, 0xd5, 0x78, 0x1e, 0x3c, 0xea, 0xc4, 0xb3, + 0x3c, 0x3a, 0x68, 0x9f, 0xec, 0xda, 0x2a, 0x02, 0xd9, 0x86, 0x33, 0x2b, 0x9e, 0x1b, 0xf4, 0x3a, + 0x32, 0x0e, 0x69, 0x1c, 0xd3, 0x1d, 0x70, 0x2a, 0x30, 0x38, 0x40, 0x53, 0x80, 0x88, 0xf0, 0x11, + 0xd2, 0x7f, 0x47, 0xbf, 0x80, 0xf4, 0x23, 0x44, 0x36, 0x61, 0x12, 0x35, 0xa8, 0xc2, 0x16, 0x73, + 0x52, 0x67, 0x1b, 0x71, 0x4d, 0x8d, 0x6d, 0x0c, 0x1e, 0xce, 0xce, 0xee, 0xb4, 0xa5, 0xfb, 0x88, + 0xaa, 0x09, 0x56, 0x80, 0xc9, 0x07, 0x30, 0xcd, 0xaf, 0x68, 0x0f, 0xe8, 0x36, 0x5f, 0x3b, 0x25, + 0x4d, 0x13, 0xa1, 0x57, 0xf2, 0xc7, 0x7c, 0xa1, 0xb7, 0x7e, 0x44, 0xb7, 0xf9, 0xdc, 0x6b, 0xce, + 0x5b, 0x1a, 0x3c, 0xd9, 0x82, 0xb9, 0x35, 0x3b, 0xe0, 0x85, 0x4a, 0x60, 0x86, 0x29, 0xd4, 0xd0, + 0xa2, 0x51, 0xfd, 0x9e, 0x1d, 0x48, 0x45, 0x78, 0x66, 0x20, 0x86, 0x2c, 0x7c, 0xf2, 0xcd, 0x1c, + 0x2c, 0x68, 0x7a, 0x72, 0x61, 0x67, 0x86, 0xc1, 0x6d, 0xa7, 0xf1, 0xc9, 0xab, 0x22, 0x85, 0xd2, + 0x3e, 0x60, 0x7c, 0x4a, 0x12, 0xaa, 0x78, 0x3f, 0xae, 0x57, 0xad, 0xd5, 0xfb, 0xd1, 0x10, 0x1b, + 0x15, 0xf7, 0xf4, 0x8c, 0xbe, 0x51, 0x13, 0xfb, 0x5a, 0x82, 0x19, 0xd7, 0x93, 0xe3, 0x2d, 0x14, + 0x5d, 0xb9, 0x48, 0xd1, 0x85, 0x26, 0x98, 0x6c, 0x22, 0x44, 0x78, 0x2f, 0xfc, 0x61, 0x7c, 0x5a, + 0xe5, 0x43, 0x42, 0x2c, 0x1c, 0xc8, 0x87, 0x8c, 0xff, 0x7e, 0x0c, 0x66, 0x12, 0xcb, 0x42, 0xdc, + 0x53, 0x73, 0xa9, 0x7b, 0x6a, 0x03, 0x80, 0xab, 0x7a, 0x87, 0xd4, 0xc9, 0x4a, 0x0f, 0xd1, 0x49, + 0xe1, 0xdf, 0x1d, 0xed, 0x29, 0x85, 0x0c, 0x23, 0xca, 0x77, 0xec, 0x90, 0x3a, 0xf2, 0x88, 0x28, + 0xdf, 0xf4, 0x0a, 0xd1, 0x98, 0x0c, 0xa9, 0xc0, 0x28, 0x46, 0x03, 0x56, 0x1d, 0x74, 0x1d, 0x56, + 0x60, 0xf2, 0x72, 0xf2, 0x02, 0x8c, 0x31, 0x21, 0x6a, 0xbd, 0x26, 0x98, 0x20, 0x9e, 0x2d, 0x4c, + 0xca, 0x62, 0x12, 0x8b, 0xa8, 0x22, 0xd7, 0xa1, 0xc4, 0xff, 0x12, 0xf1, 0x7f, 0xc6, 0x74, 0x8b, + 0x49, 0xcb, 0x69, 0xc9, 0x10, 0x40, 0x1a, 0x1c, 0xbb, 0x5d, 0x34, 0x7a, 0xa8, 0xd6, 0x59, 0xaf, + 0x89, 0xa0, 0xf8, 0x78, 0xbb, 0x08, 0x78, 0x21, 0x6b, 0x22, 0x06, 0x60, 0xb2, 0x8c, 0x70, 0x93, + 0x29, 0xe2, 0x9d, 0x12, 0x65, 0x19, 0xee, 0x1e, 0x63, 0x8a, 0x1a, 0x72, 0x89, 0xbf, 0xc4, 0xa0, + 0x58, 0xc8, 0x33, 0xc3, 0xe2, 0xbb, 0x05, 0x2a, 0x26, 0x50, 0x36, 0x8c, 0xaa, 0x59, 0xe3, 0xec, + 0xef, 0xd5, 0x8e, 0xed, 0xb4, 0x05, 0x5b, 0xc1, 0xc6, 0x11, 0x96, 0xb2, 0x52, 0x33, 0x06, 0x20, + 0x6f, 0xc3, 0x34, 0xcf, 0xe0, 0xd8, 0xe9, 0x78, 0x2e, 0x92, 0x9f, 0x8c, 0x23, 0xfc, 0x89, 0xac, + 0x92, 0xac, 0x8a, 0xb7, 0x92, 0x80, 0x65, 0xe7, 0x09, 0xbe, 0xf2, 0xf6, 0xf8, 0x1b, 0x51, 0x29, + 0x3e, 0x4f, 0x10, 0x35, 0xe0, 0xe5, 0xa6, 0x0a, 0x44, 0xde, 0x84, 0x29, 0xf6, 0xf3, 0xa6, 0xf3, + 0x90, 0xf2, 0x06, 0xa7, 0x62, 0xf3, 0x06, 0xc4, 0xda, 0x65, 0x35, 0xbc, 0x3d, 0x1d, 0x92, 0xbc, + 0x0f, 0xa7, 0x90, 0x52, 0xd3, 0xeb, 0xd2, 0x56, 0x75, 0x67, 0xc7, 0x69, 0x3b, 0xdc, 0x1a, 0x8d, + 0x47, 0xba, 0x41, 0x1d, 0x3c, 0x6f, 0x18, 0x21, 0x2c, 0x3b, 0x06, 0x31, 0xb3, 0x31, 0xc9, 0x03, + 0x28, 0xaf, 0xf4, 0x82, 0xd0, 0xeb, 0x54, 0xc3, 0xd0, 0x77, 0xb6, 0x7b, 0x21, 0x0d, 0x16, 0x66, + 0xb4, 0x78, 0x30, 0x6c, 0x73, 0x44, 0x95, 0x5c, 0x1f, 0xd4, 0x44, 0x0c, 0xcb, 0x8e, 0x50, 0xcc, + 0x14, 0x11, 0xe3, 0xdf, 0xe6, 0x60, 0x4a, 0x43, 0x25, 0x6f, 0x40, 0xe9, 0x86, 0xef, 0x50, 0xb7, + 0xd5, 0x3e, 0x50, 0x2e, 0xaa, 0x78, 0x8b, 0xd9, 0x11, 0xe5, 0xbc, 0xd7, 0x1a, 0x58, 0xa4, 0xe7, + 0xc9, 0x67, 0x9a, 0x8a, 0x5e, 0xe1, 0x7e, 0xe2, 0x62, 0x81, 0x16, 0xe2, 0x00, 0x55, 0xb8, 0x40, + 0xc5, 0xea, 0x54, 0x40, 0xc8, 0x3b, 0x30, 0xc6, 0xdf, 0x83, 0x85, 0xdd, 0xe2, 0xd9, 0xac, 0x6e, + 0xf2, 0x98, 0x04, 0xb8, 0x10, 0xd1, 0xe8, 0x27, 0x30, 0x05, 0x92, 0xf1, 0x73, 0x39, 0x20, 0x69, + 0xd0, 0x63, 0xf4, 0x5e, 0xc7, 0x1a, 0x13, 0x7d, 0x21, 0xda, 0x8d, 0x05, 0x4d, 0x67, 0xce, 0x5a, + 0xe2, 0x15, 0x7c, 0xe0, 0xc5, 0xae, 0x53, 0x15, 0x71, 0xbc, 0xda, 0xf8, 0x91, 0x3c, 0x40, 0x0c, + 0x4d, 0x3e, 0xc7, 0xf3, 0xdf, 0xbd, 0xdf, 0xb3, 0xdb, 0xce, 0x8e, 0xa3, 0x47, 0x21, 0x46, 0x22, + 0x5f, 0x97, 0x35, 0xa6, 0x0e, 0x48, 0xde, 0x83, 0x99, 0x46, 0x5d, 0xc7, 0x55, 0x6c, 0xee, 0x83, + 0xae, 0x95, 0x40, 0x4f, 0x42, 0xa3, 0x7d, 0xb2, 0x3a, 0x1b, 0xdc, 0x3e, 0x99, 0x4f, 0x84, 0xa8, + 0x61, 0x8c, 0xa5, 0x51, 0x17, 0x6e, 0x05, 0xad, 0xe8, 0x55, 0x13, 0xbf, 0x2e, 0xe8, 0x5a, 0x5d, + 0xe1, 0x6f, 0xc0, 0xf8, 0x84, 0x06, 0x17, 0x0f, 0xe4, 0x68, 0x9f, 0xb8, 0x03, 0x3f, 0x8f, 0x6a, + 0xbf, 0x8e, 0x17, 0x52, 0xa1, 0xed, 0x78, 0x6a, 0xef, 0x3d, 0xb1, 0x31, 0xc1, 0xa8, 0xe6, 0x4e, + 0xad, 0xf5, 0x4e, 0x18, 0xcc, 0x5c, 0x8b, 0x2f, 0x29, 0xdc, 0xac, 0x20, 0xc3, 0xc6, 0xe6, 0xef, + 0xe6, 0xe0, 0x54, 0x26, 0x2e, 0xb9, 0x0c, 0x10, 0xeb, 0x94, 0xc4, 0x28, 0x21, 0xc7, 0x8c, 0xc3, + 0x32, 0x99, 0x0a, 0x04, 0xf9, 0x4a, 0x52, 0x1b, 0x74, 0xfc, 0x41, 0xb8, 0x28, 0xa3, 0x21, 0xea, + 0xda, 0xa0, 0x0c, 0x1d, 0x90, 0xf1, 0x4b, 0x05, 0x98, 0x55, 0xa2, 0x3e, 0xf1, 0x6f, 0x3d, 0xc6, + 0x5e, 0x7c, 0x1f, 0x4a, 0xac, 0x37, 0x4e, 0x53, 0xf8, 0x03, 0x71, 0xc3, 0x97, 0x57, 0x52, 0x0e, + 0xb1, 0x82, 0xda, 0x65, 0x15, 0x98, 0xc7, 0x28, 0x45, 0xd6, 0x89, 0x0f, 0x12, 0xcd, 0xb4, 0x2f, + 0x90, 0x46, 0x9c, 0x04, 0x30, 0x55, 0x3b, 0x70, 0xed, 0x4e, 0xd4, 0x1a, 0x37, 0x80, 0x79, 0xb5, + 0x6f, 0x6b, 0x1a, 0x34, 0x6f, 0x2e, 0x76, 0x1d, 0xe3, 0x75, 0x19, 0x51, 0x0b, 0x34, 0xac, 0xc5, + 0xf7, 0x60, 0x36, 0xf5, 0xd1, 0x27, 0x0a, 0x97, 0xfa, 0x00, 0x48, 0xfa, 0x3b, 0x32, 0x28, 0xbc, + 0xaa, 0x07, 0xe3, 0x3d, 0x15, 0x3d, 0x5e, 0x77, 0x3a, 0xb6, 0xdb, 0xe2, 0xe6, 0x34, 0x4b, 0x6a, + 0x30, 0xd5, 0x9f, 0xcf, 0xab, 0x4e, 0xc9, 0x4f, 0xfb, 0xae, 0xfb, 0x82, 0x76, 0x1b, 0x7e, 0xae, + 0xdf, 0x9c, 0x0e, 0xa5, 0x75, 0xf8, 0x4e, 0x01, 0xce, 0xf4, 0xc1, 0x24, 0x07, 0xc9, 0x45, 0xc4, + 0xb5, 0x10, 0x57, 0x07, 0x37, 0xf8, 0x24, 0x96, 0x12, 0xf9, 0x1c, 0x0f, 0x4b, 0x22, 0x92, 0x65, + 0xf3, 0xfb, 0x37, 0xaa, 0xf1, 0xf7, 0xa3, 0xd2, 0x64, 0x3c, 0x12, 0x5e, 0x4a, 0xde, 0x83, 0x51, + 0xf4, 0x48, 0x4f, 0xc4, 0x9d, 0x64, 0x10, 0x58, 0xae, 0x44, 0x4e, 0x65, 0x3f, 0xb5, 0xc8, 0xa9, + 0xac, 0x80, 0x7c, 0x16, 0x0a, 0xd5, 0x07, 0x0d, 0x31, 0x2f, 0xd3, 0x2a, 0xfa, 0x83, 0x46, 0x9c, + 0x00, 0xc7, 0xd6, 0x32, 0xd5, 0x30, 0x0c, 0x86, 0x78, 0x73, 0xa5, 0x2e, 0x66, 0x45, 0x45, 0xbc, + 0xb9, 0x52, 0x8f, 0x11, 0x77, 0x75, 0x9f, 0xb7, 0x9b, 0x2b, 0xf5, 0x4f, 0x6e, 0xd9, 0xff, 0x47, + 0x79, 0x1e, 0x4b, 0x85, 0x77, 0xec, 0x3d, 0x28, 0x69, 0xc1, 0xd2, 0x73, 0xb1, 0x3c, 0x16, 0x45, + 0xc3, 0x4f, 0x58, 0x0c, 0x69, 0x08, 0x32, 0x95, 0x14, 0xfb, 0xad, 0x06, 0x89, 0x8f, 0x52, 0x49, + 0x21, 0x85, 0xa4, 0x2b, 0x91, 0x8e, 0x42, 0xae, 0x41, 0x71, 0x93, 0xba, 0xb6, 0x1b, 0x46, 0x0a, + 0x51, 0x34, 0x2e, 0x0e, 0xb1, 0x4c, 0x97, 0x1a, 0x22, 0x40, 0x34, 0x84, 0xed, 0x6d, 0x07, 0x4d, + 0xdf, 0xc1, 0x98, 0x4b, 0xd1, 0x59, 0xcc, 0x0d, 0x61, 0x95, 0x1a, 0x9d, 0x40, 0x02, 0xc9, 0xf8, + 0xf9, 0x1c, 0x8c, 0x8b, 0x89, 0xe4, 0x29, 0x00, 0x77, 0xe3, 0xb3, 0x44, 0x38, 0x0f, 0xec, 0x3a, + 0x49, 0xe7, 0x81, 0x5d, 0x1e, 0xd8, 0x68, 0x42, 0x78, 0xed, 0x45, 0x4f, 0x83, 0xb8, 0x1a, 0xa5, + 0x3f, 0xaa, 0x9e, 0xe1, 0x2d, 0x02, 0x1d, 0xd6, 0x8b, 0xcb, 0xf8, 0x9b, 0xe2, 0xcb, 0x6e, 0xae, + 0xd4, 0xc9, 0x12, 0x14, 0x37, 0x3c, 0x1e, 0xa3, 0x4b, 0xcd, 0x67, 0xdd, 0x16, 0x65, 0xea, 0x00, + 0x49, 0x38, 0xf6, 0x7d, 0x75, 0xdf, 0x13, 0x77, 0x19, 0xe5, 0xfb, 0xba, 0xbc, 0x30, 0xf1, 0x7d, + 0x11, 0xe8, 0xd0, 0xdf, 0x47, 0x33, 0x98, 0xc4, 0xfd, 0x6b, 0x98, 0x63, 0xe7, 0x96, 0xea, 0x1d, + 0x27, 0xaa, 0x24, 0xa7, 0x58, 0xec, 0xc7, 0x29, 0xee, 0x5f, 0x33, 0x33, 0xb0, 0xf0, 0x5d, 0x2d, + 0x2e, 0x6e, 0x50, 0xff, 0xe1, 0x53, 0xcc, 0xa5, 0xb3, 0xdf, 0xd5, 0x92, 0xdd, 0x1b, 0x8a, 0x49, + 0xff, 0x4e, 0x1e, 0x4e, 0x67, 0x23, 0xaa, 0x7d, 0xc9, 0x0d, 0xe8, 0xcb, 0x45, 0x28, 0xae, 0x79, + 0x41, 0xa8, 0x18, 0x09, 0xa2, 0xfa, 0x7f, 0x4f, 0x94, 0x99, 0x51, 0x2d, 0xbb, 0x73, 0xb3, 0xbf, + 0xa3, 0xed, 0x89, 0xf4, 0x30, 0x82, 0x08, 0xbb, 0x73, 0xf3, 0x2a, 0x72, 0x13, 0x8a, 0xa6, 0x70, + 0xb4, 0x4a, 0x0c, 0x8d, 0x2c, 0x8e, 0xa4, 0x29, 0xe2, 0x8b, 0x12, 0x2d, 0x66, 0xbd, 0x28, 0x23, + 0x55, 0x18, 0x17, 0xb3, 0x9f, 0x78, 0x3a, 0xce, 0x58, 0x32, 0x7a, 0x1a, 0x09, 0x89, 0xc7, 0x38, + 0x0a, 0x3e, 0x02, 0xae, 0xd7, 0xa4, 0xcf, 0x14, 0x72, 0x14, 0xfe, 0x48, 0xa8, 0xdb, 0x63, 0x46, + 0x80, 0xc6, 0x37, 0xf3, 0x00, 0x52, 0x6b, 0xf3, 0xd4, 0xae, 0xb0, 0xcf, 0x6a, 0x2b, 0x4c, 0xb1, + 0x37, 0x1a, 0x3e, 0xcf, 0xf6, 0x3d, 0x34, 0xe7, 0x19, 0x3e, 0xcb, 0x76, 0x05, 0x46, 0x37, 0x63, + 0x85, 0x96, 0x70, 0x49, 0x41, 0x75, 0x34, 0x2f, 0x37, 0xb6, 0x61, 0xfe, 0x26, 0x0d, 0x63, 0xf5, + 0x96, 0x7c, 0x7a, 0x1c, 0x4c, 0xf6, 0x35, 0x98, 0x10, 0xf0, 0x11, 0xff, 0xe2, 0xba, 0x18, 0x11, + 0x94, 0x07, 0x75, 0x31, 0x12, 0x80, 0x71, 0xa3, 0x1a, 0x6d, 0xd3, 0x90, 0x7e, 0xb2, 0xcd, 0x34, + 0x80, 0xf0, 0xae, 0x60, 0xcf, 0x86, 0x6b, 0xe1, 0xd8, 0xf1, 0xb9, 0x0f, 0xa7, 0xa2, 0x6f, 0x7f, + 0x92, 0x74, 0xaf, 0xb0, 0x2b, 0xa5, 0xc8, 0xc0, 0x10, 0x53, 0x1c, 0x60, 0x7b, 0xf2, 0x7b, 0x39, + 0x58, 0x94, 0x18, 0x0f, 0x9c, 0xc8, 0x72, 0x72, 0x28, 0x64, 0xf2, 0x36, 0x4c, 0x2a, 0x38, 0x22, + 0x85, 0x00, 0xea, 0xa9, 0x1f, 0x39, 0xe1, 0x9e, 0x15, 0xf0, 0x72, 0x55, 0x4f, 0xad, 0x80, 0x93, + 0x6d, 0x58, 0x6c, 0x54, 0xef, 0x6c, 0xdc, 0xb7, 0xdb, 0x4e, 0x0b, 0xd9, 0xc0, 0x5d, 0xef, 0x86, + 0xd7, 0x6e, 0x7b, 0x8f, 0xb6, 0xcc, 0x0d, 0x99, 0x07, 0x08, 0x23, 0x8f, 0xa0, 0xd2, 0xfb, 0x61, + 0x04, 0x66, 0xb9, 0x9e, 0xb5, 0x83, 0x80, 0x56, 0xcf, 0x6f, 0x07, 0xe6, 0x00, 0x2a, 0xc6, 0x3f, + 0xcb, 0xc1, 0x33, 0x91, 0x73, 0x52, 0x46, 0xff, 0x12, 0x3d, 0xc8, 0x3d, 0xc9, 0x1e, 0xe4, 0x9f, + 0x48, 0x0f, 0xee, 0xc6, 0xf3, 0xb3, 0xee, 0x46, 0x8e, 0xe1, 0xf2, 0xfb, 0x89, 0x3a, 0x3f, 0x62, + 0x56, 0x9e, 0x4d, 0xb9, 0x9a, 0x2b, 0x1e, 0xe5, 0xc6, 0x5b, 0xca, 0x80, 0x64, 0x10, 0xd4, 0x90, + 0x73, 0x49, 0xe4, 0x6f, 0xe6, 0x61, 0xe6, 0xde, 0x7a, 0x6d, 0x25, 0xb2, 0xa3, 0xfa, 0x1e, 0xcb, + 0x67, 0xae, 0xf5, 0xad, 0x3f, 0xe7, 0x34, 0xb6, 0x60, 0x2e, 0x31, 0x0c, 0x28, 0x04, 0xbd, 0xcb, + 0x5d, 0x67, 0xa2, 0x62, 0x29, 0x00, 0x9d, 0xce, 0x22, 0x7f, 0xff, 0x9a, 0x99, 0x80, 0x36, 0xfe, + 0x0f, 0x48, 0xd0, 0x15, 0xcc, 0xf8, 0x35, 0x98, 0x58, 0x0f, 0x82, 0x1e, 0xf5, 0xb7, 0xcc, 0x0d, + 0x55, 0xe9, 0xe1, 0x60, 0x21, 0x5b, 0x43, 0x66, 0x0c, 0x40, 0x2e, 0x41, 0x51, 0xc4, 0xa1, 0x97, + 0xdc, 0x0d, 0xf5, 0xcf, 0x51, 0x18, 0x7b, 0x33, 0xaa, 0x26, 0x6f, 0x40, 0x89, 0xff, 0xcd, 0x57, + 0xb4, 0x18, 0x70, 0x54, 0x73, 0x0a, 0x70, 0xbe, 0x03, 0x4c, 0x0d, 0x8c, 0xbc, 0x02, 0x85, 0xea, + 0x8a, 0x29, 0x14, 0x5b, 0x42, 0x02, 0xf6, 0x2d, 0xae, 0x7d, 0xd4, 0xae, 0x43, 0x2b, 0x26, 0x93, + 0x63, 0x65, 0x4c, 0x0e, 0xa1, 0x93, 0xc7, 0x15, 0x20, 0xf5, 0x66, 0x89, 0x63, 0x19, 0xcb, 0xc8, + 0x15, 0x18, 0xaf, 0x71, 0xe3, 0x3f, 0xa1, 0x91, 0xe7, 0x79, 0x2f, 0x79, 0x91, 0x16, 0x5b, 0x82, + 0x17, 0x91, 0x4b, 0x32, 0x73, 0x5e, 0x31, 0xf6, 0xc0, 0xe9, 0x93, 0x1e, 0xef, 0x35, 0x18, 0x13, + 0xd1, 0xda, 0x27, 0x94, 0xf4, 0x38, 0xc9, 0x28, 0xed, 0x02, 0x26, 0xed, 0x8a, 0x0b, 0x4f, 0xd2, + 0x15, 0x77, 0x1b, 0xce, 0xdc, 0x44, 0x3d, 0x94, 0x1e, 0x73, 0x6c, 0xcb, 0x5c, 0x17, 0x9a, 0x7d, + 0x7c, 0xd0, 0xe2, 0xaa, 0xaa, 0x64, 0xd8, 0x32, 0xab, 0xe7, 0xab, 0x69, 0x9c, 0xfb, 0x11, 0x22, + 0x5f, 0x84, 0xf9, 0xac, 0x2a, 0xa1, 0xff, 0xc7, 0xe8, 0x5a, 0xd9, 0x0d, 0xa8, 0xd1, 0xb5, 0xb2, + 0x28, 0x90, 0x0d, 0x28, 0xf3, 0xf2, 0x6a, 0xab, 0xe3, 0xb8, 0xfc, 0x0d, 0x83, 0xbf, 0x0f, 0xa0, + 0x4b, 0x8c, 0xa0, 0x6a, 0xb3, 0x4a, 0xfe, 0x96, 0xa1, 0x39, 0x51, 0x25, 0x30, 0xc9, 0x5f, 0xc9, + 0xb1, 0x7b, 0x29, 0x8f, 0x6d, 0x8e, 0xec, 0x73, 0x5a, 0xbc, 0x86, 0x46, 0x5e, 0x4d, 0x8d, 0xd0, + 0x77, 0xdc, 0x5d, 0xe1, 0x20, 0xb5, 0x29, 0x1c, 0xa4, 0xde, 0xfe, 0x48, 0x0e, 0x52, 0x9c, 0x54, + 0x70, 0x74, 0x58, 0x29, 0xf9, 0xa2, 0x4d, 0xdc, 0x45, 0xda, 0x17, 0xb0, 0xa1, 0x43, 0x2f, 0xe1, + 0x2d, 0x97, 0x47, 0x56, 0xa6, 0x2d, 0xde, 0xc9, 0x19, 0x64, 0xec, 0x38, 0x74, 0x36, 0x67, 0xe2, + 0x11, 0x40, 0xaa, 0xa3, 0x99, 0x14, 0xd8, 0x15, 0x5a, 0x3a, 0xe1, 0x70, 0xbf, 0xe2, 0x72, 0x7c, + 0x85, 0x96, 0x1e, 0x3b, 0x16, 0x2e, 0x23, 0x75, 0xf1, 0x68, 0x28, 0xe4, 0x0a, 0x8c, 0xdd, 0xb1, + 0x1f, 0x57, 0x77, 0xa9, 0xc8, 0xf3, 0x3a, 0x25, 0xd9, 0x1f, 0x16, 0x2e, 0x17, 0x7f, 0x97, 0x7b, + 0x6d, 0x7c, 0xca, 0x14, 0x60, 0xe4, 0x07, 0x73, 0x70, 0x9a, 0x6f, 0x63, 0xd9, 0xcb, 0x06, 0x0d, + 0x43, 0x36, 0x0e, 0x22, 0x44, 0xe3, 0xf9, 0xd8, 0xf4, 0x3c, 0x1b, 0x0e, 0x63, 0x08, 0x18, 0x82, + 0x33, 0x44, 0x03, 0x17, 0x88, 0x5a, 0x2d, 0xd6, 0x75, 0x26, 0x3e, 0xd9, 0x84, 0xc9, 0x3b, 0x37, + 0xaa, 0x51, 0xb3, 0x3c, 0x00, 0x7e, 0x25, 0x8b, 0x3b, 0x2a, 0x60, 0x59, 0x3e, 0x13, 0x2a, 0x19, + 0x14, 0xfd, 0x6f, 0xaf, 0xac, 0xa2, 0xdb, 0xfe, 0x7c, 0xac, 0x4c, 0xe8, 0xee, 0x37, 0x69, 0x32, + 0x08, 0x77, 0x04, 0x28, 0x9c, 0x23, 0x3e, 0x2b, 0x07, 0x91, 0xbc, 0xae, 0x7a, 0xe2, 0x16, 0x90, + 0xc2, 0x78, 0xc7, 0x7e, 0x6c, 0xd9, 0xbb, 0x54, 0x33, 0x12, 0x10, 0xca, 0xfb, 0x9f, 0xcd, 0xc1, + 0xd9, 0xbe, 0xe3, 0x44, 0xae, 0xc3, 0x19, 0x9b, 0xfb, 0x97, 0x5b, 0x7b, 0x61, 0xd8, 0x0d, 0x2c, + 0x79, 0xc3, 0x92, 0x51, 0x78, 0x4e, 0x89, 0xea, 0x35, 0x56, 0x2b, 0x2f, 0x5d, 0x01, 0x79, 0x0f, + 0x9e, 0x75, 0xdc, 0x80, 0x36, 0x7b, 0x3e, 0xb5, 0x24, 0x81, 0xa6, 0xd3, 0xf2, 0x2d, 0xdf, 0x76, + 0x77, 0xa5, 0x23, 0xb2, 0x79, 0x56, 0xc2, 0x08, 0x1f, 0xf6, 0x15, 0xa7, 0xe5, 0x9b, 0x08, 0x60, + 0xfc, 0xdb, 0x1c, 0x2c, 0xf4, 0x1b, 0x47, 0xb2, 0x00, 0xe3, 0x54, 0xc9, 0x9f, 0x53, 0x34, 0xe5, + 0x4f, 0xf2, 0x0c, 0xc4, 0xc7, 0x83, 0x10, 0x19, 0x8a, 0x4d, 0x91, 0xcb, 0x04, 0x2d, 0xfb, 0xd5, + 0xc3, 0x40, 0xd8, 0x67, 0x97, 0x9a, 0xea, 0x91, 0x70, 0x0e, 0x20, 0x3e, 0x03, 0xb8, 0x5e, 0xc6, + 0x9c, 0xb0, 0x9b, 0x3e, 0xdf, 0xae, 0xe4, 0x34, 0x8c, 0x71, 0x1e, 0x2b, 0xdc, 0x3f, 0xc4, 0x2f, + 0x76, 0xd8, 0x8b, 0x41, 0xc6, 0xc3, 0xa1, 0xb0, 0x5c, 0xd2, 0x06, 0x7b, 0xac, 0x83, 0x93, 0x63, + 0xfc, 0x5a, 0x89, 0xcb, 0x1d, 0xd5, 0x5e, 0xb8, 0x27, 0x25, 0x95, 0xa5, 0x2c, 0x77, 0x39, 0x6e, + 0x4a, 0xaa, 0x98, 0xa5, 0xeb, 0x4e, 0x72, 0xf2, 0xe9, 0x2b, 0x9f, 0xf9, 0xf4, 0xf5, 0x1a, 0x4c, + 0xac, 0xec, 0xd1, 0xe6, 0x7e, 0xe4, 0x83, 0x54, 0x14, 0x6f, 0x0b, 0xac, 0x90, 0x87, 0xaa, 0x8f, + 0x01, 0xc8, 0x15, 0x00, 0xf4, 0xd2, 0xe5, 0x02, 0xb9, 0x92, 0x6e, 0x06, 0x9d, 0x7a, 0x85, 0x75, + 0x8e, 0x02, 0x82, 0xe4, 0x1b, 0xe6, 0x0d, 0xd5, 0x9c, 0x87, 0x93, 0x0f, 0xfc, 0x1d, 0x01, 0x1e, + 0x03, 0xb0, 0xee, 0x29, 0xcc, 0x48, 0x1c, 0x9d, 0xe5, 0x14, 0xc7, 0x52, 0x81, 0xc8, 0x67, 0x61, + 0x7c, 0x85, 0xfa, 0xe1, 0xe6, 0xe6, 0x06, 0xda, 0xd0, 0xf0, 0x2c, 0x2b, 0x45, 0xcc, 0x88, 0x11, + 0x86, 0xed, 0xef, 0x1e, 0x56, 0xa6, 0x42, 0xa7, 0x43, 0xa3, 0xe8, 0xf1, 0xa6, 0x84, 0x26, 0xcb, + 0x50, 0xe6, 0xaf, 0xfc, 0xf1, 0x55, 0x0a, 0x8f, 0xc7, 0x22, 0x3f, 0xac, 0x85, 0x49, 0xc0, 0x23, + 0xba, 0x1d, 0xe5, 0x03, 0x49, 0xc1, 0x93, 0x55, 0x99, 0x46, 0x47, 0xfd, 0x6c, 0x88, 0xb7, 0x63, + 0x92, 0x6d, 0xb0, 0xaf, 0x4f, 0x63, 0x90, 0x2a, 0x4c, 0xad, 0x78, 0x9d, 0xae, 0x1d, 0x3a, 0x98, + 0xa4, 0xf4, 0x40, 0x9c, 0x84, 0xa8, 0x9f, 0x6c, 0xaa, 0x15, 0xda, 0xb1, 0xaa, 0x56, 0x90, 0x1b, + 0x30, 0x6d, 0x7a, 0x3d, 0x36, 0xec, 0x52, 0xa9, 0xc0, 0x0f, 0x3b, 0xb4, 0x74, 0xf1, 0x59, 0x0d, + 0x3b, 0x9b, 0x85, 0x06, 0x41, 0x8b, 0xb4, 0xab, 0x61, 0x91, 0xbb, 0x19, 0xaf, 0x3b, 0xea, 0x09, + 0xa7, 0x66, 0x05, 0x49, 0x11, 0xcb, 0x78, 0x18, 0xba, 0x06, 0x93, 0x8d, 0xc6, 0xbd, 0x4d, 0x1a, + 0x84, 0x37, 0xda, 0xde, 0x23, 0x3c, 0xe0, 0x8a, 0x22, 0x89, 0x5d, 0xe0, 0x59, 0x21, 0x0d, 0x42, + 0x6b, 0xa7, 0xed, 0x3d, 0x32, 0x55, 0x28, 0xf2, 0x55, 0x36, 0x1e, 0x8a, 0x38, 0x28, 0x62, 0x0a, + 0x0f, 0x92, 0x58, 0xf1, 0x18, 0x89, 0x37, 0x01, 0x93, 0x5b, 0xf5, 0xc1, 0x52, 0xc0, 0xd1, 0x45, + 0xce, 0xf7, 0x1e, 0x1f, 0x54, 0x5b, 0x2d, 0x9f, 0x06, 0x81, 0x38, 0x89, 0xb8, 0x8b, 0x1c, 0xea, + 0x4e, 0x6c, 0x5e, 0xa1, 0xb9, 0xc8, 0x29, 0x08, 0x64, 0x85, 0x89, 0x48, 0x6c, 0x16, 0xd1, 0xf6, + 0x6a, 0xbd, 0x8e, 0x87, 0x89, 0x50, 0xca, 0x8a, 0x39, 0xe7, 0x56, 0x5a, 0x4e, 0x57, 0x97, 0x84, + 0x14, 0x1c, 0xb2, 0x0e, 0x33, 0xbc, 0x80, 0x6d, 0x2d, 0x9e, 0xc2, 0x6a, 0x2e, 0x4e, 0xa2, 0x21, + 0xc8, 0xa0, 0xb9, 0x00, 0xa6, 0xb1, 0x52, 0x03, 0xcf, 0x26, 0xf0, 0xc8, 0x7b, 0x30, 0x8d, 0xf9, + 0x01, 0x22, 0x3f, 0x23, 0x3c, 0x13, 0x4a, 0x3c, 0x7e, 0xae, 0xa8, 0x49, 0x38, 0xef, 0x95, 0x82, + 0x60, 0xaf, 0x2e, 0x1d, 0x90, 0x18, 0x01, 0x34, 0xf7, 0x89, 0x09, 0x9c, 0x8a, 0x09, 0x88, 0x9a, + 0x24, 0x81, 0xb0, 0x1d, 0xc4, 0x04, 0x7e, 0x26, 0x07, 0x67, 0x59, 0x43, 0xaa, 0x4b, 0x11, 0x32, + 0x05, 0xb4, 0x65, 0xe2, 0xb9, 0x4d, 0x5e, 0xbf, 0x2c, 0xe5, 0x93, 0xcb, 0x0a, 0xd8, 0xe5, 0x87, + 0x57, 0x2f, 0x57, 0xe3, 0x9f, 0x0d, 0x89, 0xc4, 0x23, 0x8a, 0xf6, 0xa5, 0xa9, 0xca, 0x81, 0x41, + 0xb0, 0x97, 0x45, 0x01, 0x3f, 0x8a, 0x7d, 0x7c, 0xf6, 0x47, 0x9d, 0xf9, 0xc8, 0x1f, 0xd5, 0x97, + 0xa6, 0xfa, 0x51, 0x61, 0x3b, 0xc8, 0xfc, 0xa8, 0xeb, 0x30, 0x85, 0xa7, 0xb4, 0x90, 0x8e, 0x7c, + 0x91, 0x39, 0x05, 0xf7, 0x84, 0x56, 0x61, 0x96, 0xd8, 0xcf, 0xfb, 0xe2, 0xd7, 0xad, 0x91, 0xe2, + 0x78, 0xb9, 0x78, 0x6b, 0xa4, 0x38, 0x5b, 0x26, 0xe6, 0x44, 0x34, 0xf0, 0xe6, 0xa9, 0xcc, 0x0f, + 0xc1, 0x5b, 0x2b, 0xbb, 0x61, 0xc7, 0x57, 0xaf, 0xef, 0x2d, 0xff, 0x1a, 0xad, 0x6f, 0x03, 0xfc, + 0x6b, 0xb6, 0xb8, 0xbb, 0xb7, 0x32, 0x0c, 0xf2, 0xd6, 0xaa, 0x15, 0x27, 0x6f, 0xad, 0x09, 0x1c, + 0x33, 0x01, 0x6d, 0x7c, 0x73, 0x32, 0x41, 0x57, 0xd8, 0xd4, 0x1a, 0x30, 0xc6, 0x2f, 0xa5, 0x62, + 0x90, 0xd1, 0xb8, 0x82, 0x5f, 0x59, 0x4d, 0x51, 0x43, 0xce, 0x42, 0xa1, 0xd1, 0xb8, 0x27, 0x06, + 0x19, 0x2d, 0x6b, 0x83, 0xc0, 0x33, 0x59, 0x19, 0x9b, 0x21, 0x34, 0x97, 0x55, 0xb2, 0x3a, 0xb0, + 0x93, 0xcc, 0xc4, 0x52, 0x36, 0xde, 0xf2, 0x8a, 0x38, 0x12, 0x8f, 0xb7, 0xb8, 0x22, 0xc6, 0x17, + 0xc3, 0x15, 0x58, 0xa8, 0x06, 0x01, 0xf5, 0xd9, 0x8a, 0x10, 0x56, 0x98, 0xbe, 0xb8, 0xc6, 0x88, + 0x23, 0x18, 0x1b, 0xb5, 0x9b, 0x81, 0xd9, 0x17, 0x90, 0x5c, 0x84, 0x62, 0xb5, 0xd7, 0x72, 0xa8, + 0xdb, 0xd4, 0xe2, 0xc7, 0xd9, 0xa2, 0xcc, 0x8c, 0x6a, 0xc9, 0xfb, 0x70, 0x2a, 0x11, 0x87, 0x52, + 0x8c, 0xc0, 0x78, 0xcc, 0x55, 0xe5, 0x35, 0x2b, 0xb6, 0x1c, 0xe1, 0x43, 0x92, 0x8d, 0x49, 0xaa, + 0x50, 0x5e, 0x45, 0x7f, 0xb2, 0x1a, 0xe5, 0x8f, 0x58, 0x9e, 0xcf, 0x1d, 0x09, 0xf9, 0xa5, 0x58, + 0x44, 0xea, 0x6c, 0x45, 0x95, 0x66, 0x0a, 0x9c, 0xdc, 0x86, 0xb9, 0x64, 0x19, 0x3b, 0x9b, 0xf9, + 0xfd, 0x17, 0xb9, 0x5a, 0x8a, 0x0a, 0x9e, 0xce, 0x59, 0x58, 0x64, 0x1b, 0x66, 0x63, 0xcb, 0x29, + 0xfd, 0x56, 0x2c, 0x0d, 0xb2, 0xa3, 0x7a, 0x79, 0x33, 0x7e, 0x46, 0x2c, 0xc6, 0xb9, 0xd8, 0x0a, + 0x2b, 0xba, 0x1d, 0x9b, 0x69, 0x72, 0xa4, 0x05, 0xd3, 0x0d, 0x67, 0xd7, 0x75, 0xdc, 0xdd, 0xdb, + 0xf4, 0xa0, 0x6e, 0x3b, 0xbe, 0x30, 0x8d, 0x95, 0x86, 0xef, 0xd5, 0xe0, 0xa0, 0xd3, 0xa1, 0xa1, + 0x8f, 0xbb, 0x9e, 0xd5, 0xa3, 0xb3, 0x3c, 0xbb, 0xed, 0x2c, 0x06, 0x1c, 0x0f, 0xfd, 0x4b, 0xbb, + 0xb6, 0xa3, 0x1d, 0xef, 0x3a, 0x4d, 0x4d, 0x33, 0x51, 0x1a, 0x52, 0x33, 0xd1, 0x86, 0xd9, 0x55, + 0xb7, 0xe9, 0x1f, 0xe0, 0x5b, 0xa2, 0xfc, 0xb8, 0xa9, 0x63, 0x3e, 0xee, 0x45, 0xf1, 0x71, 0xcf, + 0xda, 0x72, 0x85, 0x65, 0x7d, 0x5e, 0x9a, 0x30, 0x69, 0xc0, 0x2c, 0x8a, 0xf8, 0xeb, 0xb5, 0xfa, + 0xba, 0xeb, 0x84, 0x8e, 0x1d, 0xd2, 0x96, 0x10, 0x1b, 0xa2, 0x5c, 0x38, 0xfc, 0x06, 0xea, 0xb4, + 0xba, 0x96, 0x23, 0x41, 0x54, 0xa2, 0x29, 0xfc, 0x41, 0xd7, 0xc0, 0x99, 0x3f, 0xa5, 0x6b, 0xe0, + 0x3a, 0xcc, 0x24, 0x63, 0x4e, 0x94, 0xe3, 0xd3, 0x3e, 0xc0, 0x2a, 0x26, 0x34, 0x78, 0x3d, 0x14, + 0x13, 0xb5, 0xf4, 0xb3, 0x89, 0x68, 0x13, 0x89, 0x1b, 0xe5, 0xac, 0x76, 0xa3, 0xd4, 0xb8, 0xd2, + 0x49, 0x6e, 0x94, 0x75, 0x80, 0x1b, 0x9e, 0xdf, 0xa4, 0x55, 0x74, 0xe4, 0x26, 0x5a, 0xc6, 0x30, + 0x46, 0x34, 0xae, 0xe4, 0xfb, 0x67, 0x87, 0xfd, 0xb6, 0x92, 0xfe, 0xf8, 0x0a, 0x0d, 0x62, 0xc3, + 0x99, 0xba, 0x4f, 0x77, 0xa8, 0xef, 0xd3, 0x96, 0xb8, 0xc1, 0x2c, 0x3b, 0x6e, 0x4b, 0xa6, 0x81, + 0x13, 0x31, 0xc3, 0xbb, 0x12, 0x24, 0x32, 0x24, 0xdf, 0xe6, 0x40, 0xea, 0x61, 0xda, 0x87, 0x8e, + 0xf1, 0xe3, 0x79, 0x58, 0xe8, 0xd7, 0xe3, 0x01, 0x77, 0xbf, 0x57, 0x21, 0xcd, 0x44, 0xc4, 0x1d, + 0xb0, 0x4c, 0x93, 0xac, 0x64, 0x09, 0xb2, 0x79, 0x85, 0xb8, 0x13, 0xce, 0x25, 0x11, 0xb6, 0xfc, + 0x36, 0xb9, 0x0e, 0x93, 0xca, 0xf8, 0x20, 0xbb, 0xee, 0x37, 0x9a, 0x26, 0xec, 0xc4, 0x43, 0x76, + 0x1a, 0xc4, 0x69, 0x21, 0xef, 0x8c, 0xfc, 0x17, 0x29, 0x73, 0x77, 0xf9, 0x31, 0x6e, 0x11, 0x11, + 0x04, 0x1e, 0x21, 0x80, 0x47, 0x03, 0xe7, 0xb2, 0x26, 0xfe, 0x6d, 0xfc, 0x62, 0x89, 0x1f, 0xfa, + 0xea, 0x95, 0xb1, 0x9f, 0xad, 0x74, 0xe2, 0x2a, 0x99, 0x3f, 0xc9, 0x55, 0xb2, 0x70, 0xfc, 0x55, + 0x72, 0xe4, 0xb8, 0xab, 0x64, 0xe2, 0xae, 0x37, 0x7a, 0xc2, 0xbb, 0xde, 0xf8, 0x89, 0xee, 0x7a, + 0xda, 0x35, 0xb4, 0x78, 0xdc, 0x35, 0xf4, 0xcf, 0x6f, 0x86, 0x4f, 0xeb, 0xcd, 0x30, 0x4b, 0x2a, + 0x3c, 0xd1, 0xcd, 0x30, 0x75, 0xb1, 0x9b, 0x7d, 0x32, 0x17, 0x3b, 0xf2, 0xc4, 0x2e, 0x76, 0x73, + 0x1f, 0xf7, 0x62, 0x37, 0xff, 0x24, 0x2f, 0x76, 0xa7, 0xfe, 0x2c, 0x5e, 0xec, 0x4e, 0xff, 0xfb, + 0xb9, 0xd8, 0x5d, 0x83, 0x62, 0xdd, 0x0b, 0xc2, 0x1b, 0x9e, 0xdf, 0xc1, 0xbb, 0x65, 0x49, 0xa8, + 0x64, 0xbd, 0x80, 0x67, 0x62, 0xd6, 0x84, 0x2b, 0x01, 0x48, 0x96, 0xe5, 0x82, 0x93, 0x37, 0xa9, + 0x85, 0x58, 0x2b, 0x2e, 0x56, 0x8a, 0xb8, 0x50, 0xa5, 0xd7, 0x9b, 0x40, 0xb9, 0x35, 0x52, 0x1c, + 0x2b, 0x8f, 0xdf, 0x1a, 0x29, 0x96, 0xcb, 0xb3, 0x43, 0xdc, 0x0c, 0xff, 0x02, 0x94, 0x93, 0xc2, + 0xea, 0xf1, 0xe1, 0x9e, 0x9f, 0x58, 0xac, 0x4d, 0x26, 0x4a, 0x27, 0x85, 0x45, 0x72, 0x05, 0xa0, + 0xee, 0x3b, 0x0f, 0xed, 0x90, 0xde, 0x96, 0x66, 0x7f, 0x22, 0xbe, 0x39, 0x2f, 0x65, 0x0b, 0xd4, + 0x54, 0x40, 0xa2, 0x7b, 0x52, 0x3e, 0xeb, 0x9e, 0x64, 0xfc, 0x58, 0x1e, 0x66, 0x79, 0xc0, 0xba, + 0xa7, 0xff, 0xcd, 0xf6, 0x5d, 0xed, 0xf6, 0xfb, 0x6c, 0x9c, 0xb5, 0x41, 0xed, 0xdd, 0x80, 0x57, + 0xdb, 0x0f, 0xe0, 0x54, 0x6a, 0x28, 0xf0, 0x06, 0x5c, 0x93, 0xa1, 0x02, 0x53, 0x77, 0xe0, 0x85, + 0xec, 0x46, 0xee, 0x5f, 0x33, 0x53, 0x18, 0xc6, 0x1f, 0x8d, 0xa4, 0xe8, 0x8b, 0xf7, 0x5b, 0xf5, + 0x45, 0x36, 0x77, 0xb2, 0x17, 0xd9, 0xfc, 0x70, 0x2f, 0xb2, 0x09, 0x09, 0xa2, 0x30, 0x8c, 0x04, + 0xf1, 0x3e, 0x4c, 0x6d, 0x52, 0xbb, 0x13, 0x6c, 0x7a, 0x22, 0x05, 0x18, 0x77, 0x32, 0x91, 0x91, + 0x00, 0x59, 0x9d, 0xbc, 0xc0, 0x45, 0xc6, 0xb2, 0x21, 0x43, 0x60, 0x67, 0x24, 0xcf, 0x09, 0x66, + 0xea, 0x14, 0xd4, 0x5b, 0xf9, 0xe8, 0x80, 0x5b, 0x79, 0x03, 0x4a, 0x02, 0x2f, 0x8e, 0x71, 0x1d, + 0x5f, 0x1f, 0x59, 0x15, 0x96, 0xcb, 0xd6, 0xa5, 0xb7, 0xe7, 0x74, 0xd4, 0x3a, 0xbf, 0x39, 0x6a, + 0x44, 0xd8, 0x10, 0xac, 0xba, 0xad, 0xae, 0xe7, 0xb8, 0x38, 0x04, 0xe3, 0xf1, 0x10, 0x50, 0x51, + 0xcc, 0x87, 0x40, 0x01, 0x22, 0x6f, 0xc3, 0x74, 0xb5, 0xbe, 0xae, 0xa2, 0x15, 0xe3, 0x47, 0x61, + 0xbb, 0xeb, 0x58, 0x1a, 0x6a, 0x02, 0x76, 0xd0, 0x4d, 0x6a, 0xe2, 0x4f, 0xe7, 0x26, 0x65, 0xfc, + 0x46, 0x49, 0x6e, 0xef, 0x4f, 0xf6, 0x69, 0x44, 0x7f, 0xec, 0x28, 0x9c, 0xf0, 0xb1, 0x63, 0xe4, + 0x38, 0x29, 0x53, 0x11, 0x66, 0xc7, 0x3e, 0xf6, 0xc3, 0xc5, 0xf8, 0x09, 0xc5, 0xd3, 0xc4, 0xde, + 0x29, 0x0e, 0xb3, 0x77, 0x32, 0x45, 0xda, 0x89, 0x8f, 0x2f, 0xd2, 0xc2, 0x89, 0x45, 0xda, 0x46, + 0xec, 0x84, 0x3d, 0x79, 0xac, 0x6f, 0xcb, 0x39, 0xa1, 0x35, 0x98, 0xcd, 0x0e, 0x27, 0x18, 0xb9, + 0x63, 0x7f, 0x4f, 0xc9, 0xc9, 0x5f, 0xcb, 0x96, 0x93, 0x07, 0x9f, 0x1f, 0x7f, 0x2e, 0x29, 0xff, + 0xb9, 0xa4, 0xfc, 0xa7, 0x22, 0x29, 0xdf, 0x03, 0x62, 0xf7, 0xc2, 0x3d, 0xea, 0x86, 0x4e, 0x13, + 0x43, 0xda, 0xb2, 0x29, 0x46, 0x99, 0x59, 0xec, 0x91, 0x74, 0xad, 0xba, 0x47, 0xb4, 0x5a, 0xb6, + 0x02, 0x78, 0x18, 0xd0, 0xa1, 0x25, 0x60, 0x1f, 0x77, 0xd4, 0x03, 0xdb, 0x77, 0x51, 0x4d, 0x74, + 0x05, 0xc6, 0x65, 0x08, 0xd5, 0x5c, 0xac, 0x64, 0x4e, 0xc7, 0x4e, 0x95, 0x50, 0x64, 0x09, 0x8a, + 0x12, 0x59, 0x4d, 0x04, 0xf4, 0x48, 0x94, 0x69, 0xd1, 0x29, 0x45, 0x99, 0xf1, 0x9f, 0x8c, 0x48, + 0xae, 0xcd, 0x3e, 0xb8, 0x6e, 0xfb, 0x76, 0x07, 0xf3, 0x10, 0x46, 0x9b, 0x4a, 0x91, 0xbf, 0x13, + 0xfb, 0x30, 0xe1, 0x96, 0xa0, 0xa3, 0x7c, 0xa4, 0x18, 0xb8, 0x71, 0xaa, 0xe7, 0xc2, 0x10, 0xa9, + 0x9e, 0xdf, 0xd4, 0xf2, 0x24, 0x8f, 0xc4, 0x89, 0x39, 0x19, 0x27, 0x1b, 0x9c, 0x21, 0xf9, 0xba, + 0x9a, 0xd0, 0x78, 0x34, 0x8e, 0x48, 0x86, 0x98, 0x03, 0x52, 0x19, 0x47, 0x17, 0x8a, 0xb1, 0x93, + 0x44, 0x97, 0x1e, 0xff, 0xf7, 0x1a, 0x5d, 0x7a, 0x15, 0x40, 0x9c, 0xae, 0xb1, 0x2d, 0xc2, 0x4b, + 0xc8, 0x7c, 0x84, 0x89, 0x75, 0x18, 0xb6, 0xfb, 0xa4, 0x1f, 0x51, 0x10, 0x8d, 0x7f, 0x45, 0x60, + 0xb6, 0xd1, 0xb8, 0x57, 0x73, 0xec, 0x5d, 0xd7, 0x0b, 0x42, 0xa7, 0xb9, 0xee, 0xee, 0x78, 0x4c, + 0x9a, 0x8e, 0x4e, 0x00, 0x25, 0x2e, 0x70, 0xcc, 0xfd, 0xa3, 0x6a, 0x76, 0x5b, 0x5b, 0xf5, 0x7d, + 0xa9, 0xcf, 0xe4, 0xb7, 0x35, 0xca, 0x0a, 0x4c, 0x5e, 0xce, 0x04, 0xd6, 0x46, 0x0f, 0xa3, 0x72, + 0x08, 0x83, 0x0f, 0x14, 0x58, 0x03, 0x5e, 0x64, 0xca, 0x3a, 0x42, 0xd3, 0x0b, 0x56, 0x5c, 0x60, + 0xce, 0x68, 0x31, 0xaa, 0xe3, 0x6a, 0xbe, 0x77, 0x85, 0xfc, 0x81, 0x5c, 0xbb, 0x8b, 0xe5, 0xaa, + 0x0d, 0x5c, 0x6a, 0x0f, 0x1c, 0xc0, 0x29, 0xcd, 0x5f, 0x7b, 0xd8, 0xf7, 0x95, 0x57, 0x84, 0x80, + 0x6c, 0xa0, 0x9d, 0x71, 0xc6, 0x23, 0x8b, 0x9a, 0x58, 0x30, 0xb3, 0x05, 0xf2, 0x63, 0x39, 0x38, + 0x97, 0x59, 0x13, 0xed, 0xee, 0x49, 0x2d, 0x4e, 0xb8, 0xc2, 0x34, 0x78, 0x0a, 0xc5, 0x7e, 0x4d, + 0x5b, 0x19, 0xac, 0x60, 0x70, 0x4b, 0xe4, 0xd7, 0x72, 0x70, 0x46, 0x83, 0x88, 0xb8, 0x65, 0x10, + 0x85, 0x32, 0xc9, 0x5c, 0xd7, 0x1f, 0x3e, 0x99, 0x75, 0xfd, 0x82, 0xde, 0x97, 0x98, 0x5b, 0xaa, + 0x7d, 0xe8, 0xf7, 0x85, 0xe4, 0x21, 0xcc, 0x62, 0x95, 0x7c, 0xeb, 0x61, 0x6b, 0x56, 0x3c, 0x11, + 0xcd, 0xc7, 0x9f, 0xcd, 0x63, 0x10, 0x60, 0x1a, 0xfc, 0xa5, 0xef, 0x1c, 0x56, 0xa6, 0x34, 0x70, + 0x19, 0x79, 0xdb, 0x8a, 0x1f, 0x8c, 0x1c, 0x77, 0xc7, 0x53, 0xf9, 0x7e, 0xaa, 0x09, 0xf2, 0xcf, + 0x72, 0x5c, 0xfd, 0xcf, 0xbb, 0x71, 0xc3, 0xf7, 0x3a, 0x51, 0xbd, 0x34, 0xa6, 0xec, 0x33, 0x6c, + 0xed, 0x27, 0x33, 0x6c, 0x2f, 0xe1, 0x27, 0x73, 0x9e, 0x60, 0xed, 0xf8, 0x5e, 0x27, 0xfe, 0x7c, + 0x75, 0xe0, 0xfa, 0x7e, 0x24, 0xf9, 0xa1, 0x1c, 0x9c, 0xd5, 0xb4, 0x96, 0x6a, 0x1a, 0x14, 0x11, + 0xe9, 0x61, 0x2e, 0x8a, 0x01, 0x13, 0x57, 0x2d, 0x5f, 0x16, 0xeb, 0xff, 0x02, 0x7e, 0x81, 0x12, + 0x72, 0x94, 0x01, 0x59, 0x1d, 0x0e, 0xa5, 0x7c, 0x42, 0xff, 0x56, 0x88, 0x03, 0xb3, 0x68, 0x52, + 0xa3, 0x19, 0xfd, 0xce, 0xf7, 0x37, 0xfa, 0x8d, 0x12, 0x1c, 0x61, 0xf2, 0x83, 0xfe, 0x96, 0xbf, + 0x69, 0xaa, 0xe4, 0x07, 0xe0, 0x6c, 0xaa, 0x30, 0xda, 0x6d, 0xa7, 0xfa, 0xee, 0xb6, 0x57, 0x8f, + 0x0e, 0x2b, 0x2f, 0x67, 0xb5, 0x96, 0xb5, 0xd3, 0xfa, 0xb7, 0x40, 0x6c, 0x80, 0xb8, 0x52, 0x48, + 0x3f, 0xd9, 0x0b, 0xf4, 0x55, 0xb1, 0x3e, 0x14, 0x78, 0xc6, 0xcb, 0x95, 0x6f, 0x50, 0x8f, 0xbc, + 0x18, 0x88, 0x50, 0x28, 0x29, 0x89, 0x1f, 0x0e, 0x84, 0x95, 0x49, 0x9f, 0x46, 0xbe, 0x73, 0x58, + 0xd1, 0xa0, 0xd9, 0x1d, 0x48, 0xcd, 0x28, 0xa1, 0x09, 0x9b, 0x2a, 0x20, 0xf9, 0xd5, 0x1c, 0xcc, + 0xb3, 0x82, 0x78, 0x51, 0x89, 0x4e, 0x2d, 0x0c, 0x5a, 0xf5, 0x7b, 0x4f, 0x66, 0xd5, 0x3f, 0x8f, + 0xdf, 0xa8, 0xae, 0xfa, 0xd4, 0x90, 0x64, 0x7e, 0x1c, 0xae, 0x76, 0xcd, 0x7a, 0x4b, 0x5b, 0xed, + 0x67, 0x87, 0x58, 0xed, 0x7c, 0x02, 0x8e, 0x5f, 0xed, 0x7d, 0x5b, 0x21, 0x9b, 0x50, 0x12, 0xd7, + 0x1f, 0x3e, 0x60, 0xcf, 0x69, 0x21, 0xa8, 0xd5, 0x2a, 0x7e, 0x27, 0x15, 0x79, 0x31, 0x52, 0x3d, + 0xd4, 0xa8, 0x10, 0x17, 0xe6, 0xf8, 0x6f, 0x5d, 0xbd, 0x54, 0xe9, 0xab, 0x5e, 0xba, 0x28, 0x7a, + 0x74, 0x5e, 0xd0, 0x4f, 0x68, 0x99, 0xd4, 0xd0, 0x51, 0x19, 0x84, 0x49, 0x17, 0x88, 0x56, 0xcc, + 0x37, 0xed, 0xf9, 0xc1, 0x4a, 0xa5, 0x97, 0x45, 0x9b, 0x95, 0x64, 0x9b, 0xc9, 0x9d, 0x9b, 0x41, + 0x9b, 0xd8, 0x30, 0x23, 0x4a, 0xbd, 0x7d, 0xca, 0x39, 0xfc, 0xf3, 0x5a, 0xf0, 0xae, 0x44, 0x2d, + 0xbf, 0xc3, 0xc9, 0x96, 0x30, 0xb8, 0x5a, 0x82, 0xa1, 0x27, 0xe9, 0x91, 0x7b, 0x30, 0x5b, 0xed, + 0x76, 0xdb, 0x0e, 0x6d, 0x61, 0x2f, 0xcd, 0x1e, 0xeb, 0x93, 0x11, 0xa7, 0x96, 0xb3, 0x79, 0xa5, + 0xb8, 0x58, 0xfa, 0xbd, 0x04, 0xbb, 0x49, 0xe1, 0x1a, 0x3f, 0x9a, 0x4b, 0x7d, 0x34, 0x79, 0x0d, + 0x26, 0xf0, 0x87, 0x12, 0x0f, 0x06, 0xb5, 0x34, 0xfc, 0x13, 0x51, 0xff, 0x13, 0x03, 0x30, 0x61, + 0x49, 0x8d, 0x09, 0x59, 0xe0, 0xc2, 0x92, 0x50, 0x25, 0xc4, 0xca, 0x83, 0x8a, 0x74, 0xc6, 0x28, + 0xc4, 0x42, 0x17, 0x3a, 0x63, 0x08, 0x17, 0x0c, 0xe3, 0x1f, 0xe6, 0xf5, 0x65, 0x47, 0x2e, 0x2a, + 0x72, 0xbb, 0x12, 0x95, 0x52, 0xca, 0xed, 0x8a, 0xb4, 0xfe, 0x77, 0x73, 0x30, 0x77, 0x4f, 0x49, + 0x78, 0xba, 0xe9, 0xe1, 0xbc, 0x0c, 0x4e, 0xed, 0xf9, 0xa4, 0xb2, 0x0d, 0xaa, 0x99, 0x56, 0xd9, + 0x4a, 0xc1, 0x25, 0x63, 0x66, 0x7d, 0x0f, 0x3a, 0xea, 0xe1, 0x87, 0x29, 0x49, 0x1f, 0x39, 0x38, + 0x2f, 0x3f, 0x61, 0x96, 0x0c, 0xe3, 0x27, 0xf3, 0x30, 0xa9, 0xec, 0x18, 0xf2, 0x19, 0x28, 0xa9, + 0xcd, 0xaa, 0x2a, 0x3e, 0xf5, 0x2b, 0x4d, 0x0d, 0x0a, 0x75, 0x7c, 0xd4, 0xee, 0x68, 0x3a, 0x3e, + 0xb6, 0x2f, 0xb0, 0xf4, 0x84, 0x37, 0xa1, 0xf7, 0x32, 0x6e, 0x42, 0xb8, 0xca, 0x15, 0x9d, 0xce, + 0xc0, 0xfb, 0xd0, 0xdb, 0xe9, 0xfb, 0x10, 0xaa, 0x97, 0x14, 0xfc, 0xfe, 0xb7, 0x22, 0xe3, 0xa7, + 0x73, 0x50, 0x4e, 0xee, 0xe9, 0x4f, 0x64, 0x54, 0x4e, 0xf0, 0x9e, 0xf3, 0x13, 0xf9, 0x28, 0x49, + 0x8c, 0xf4, 0x56, 0x7e, 0x5a, 0x0d, 0x0d, 0xdf, 0xd1, 0x9e, 0x5a, 0x9e, 0xd1, 0x03, 0xef, 0xa9, + 0x71, 0x3e, 0xb2, 0xa3, 0x6d, 0x8e, 0x7c, 0xeb, 0x6f, 0x55, 0x3e, 0x65, 0x7c, 0x09, 0xe6, 0x93, + 0xc3, 0x81, 0xcf, 0x2d, 0x55, 0x98, 0xd1, 0xcb, 0x93, 0x29, 0xa6, 0x92, 0x58, 0x66, 0x12, 0xde, + 0xf8, 0xdd, 0x7c, 0x92, 0xb6, 0x30, 0x3a, 0x64, 0x3c, 0x4a, 0xb5, 0x73, 0x11, 0x3c, 0x8a, 0x17, + 0x99, 0xb2, 0xee, 0x24, 0xa9, 0xdd, 0x22, 0x9f, 0xdb, 0x42, 0xb6, 0xcf, 0x2d, 0xb9, 0x9e, 0xb0, + 0xa0, 0x56, 0x02, 0x44, 0x3d, 0xa2, 0xdb, 0x56, 0x6c, 0x45, 0x9d, 0x32, 0x9c, 0x9e, 0xd7, 0xa2, + 0x9d, 0x4b, 0xfc, 0xd1, 0x58, 0xbb, 0x1e, 0x62, 0x05, 0x47, 0xce, 0x04, 0x26, 0x6b, 0x30, 0xce, + 0x3e, 0xf3, 0x8e, 0xdd, 0x15, 0xaf, 0x28, 0x24, 0xf2, 0xc0, 0x6f, 0x47, 0xf7, 0x43, 0xc5, 0x09, + 0xbf, 0x4d, 0x99, 0x84, 0xa0, 0x2e, 0x2c, 0x01, 0x68, 0xfc, 0x5f, 0x39, 0xb6, 0xff, 0x9b, 0xfb, + 0xdf, 0x63, 0xf9, 0xe1, 0x58, 0x97, 0x06, 0xd8, 0xc4, 0xfe, 0xbb, 0x3c, 0x4f, 0xfb, 0x23, 0x96, + 0xcf, 0x9b, 0x30, 0xb6, 0x69, 0xfb, 0xbb, 0x22, 0xf5, 0xb7, 0x4e, 0x85, 0x57, 0xc4, 0xe1, 0xab, + 0x42, 0xfc, 0x6d, 0x0a, 0x04, 0x55, 0x75, 0x96, 0x1f, 0x4a, 0x75, 0xa6, 0x68, 0xee, 0x0b, 0x4f, + 0x4c, 0x73, 0xff, 0x7d, 0x51, 0x86, 0x9f, 0x6a, 0x38, 0x44, 0x30, 0xed, 0xf3, 0xc9, 0x84, 0x5a, + 0xa9, 0xb0, 0xe7, 0x31, 0x39, 0x72, 0x5d, 0x4d, 0xd1, 0xa5, 0x38, 0x7f, 0x1e, 0x93, 0x8c, 0xcb, + 0xf8, 0xaf, 0x0b, 0x7c, 0x8c, 0xc5, 0x40, 0x5d, 0xd0, 0x5c, 0xdc, 0x71, 0x9f, 0x24, 0xb4, 0x9a, + 0xdc, 0xd9, 0xfd, 0x02, 0x8c, 0xb0, 0xb5, 0x29, 0x46, 0x13, 0xe1, 0xd8, 0xfa, 0x55, 0xe1, 0x58, + 0x3d, 0xdb, 0xcb, 0x78, 0x26, 0xa9, 0xb9, 0x17, 0xf1, 0xd8, 0x52, 0xf7, 0x32, 0x42, 0xb0, 0x1e, + 0x44, 0x09, 0x2c, 0xd4, 0x1e, 0x74, 0x76, 0xec, 0x74, 0xa6, 0x3c, 0x25, 0x6b, 0xce, 0x2a, 0x4c, + 0x3f, 0x70, 0xdc, 0x96, 0xf7, 0x28, 0xa8, 0xd1, 0x60, 0x3f, 0xf4, 0xba, 0xc2, 0x0e, 0x18, 0x35, + 0xfc, 0x8f, 0x78, 0x8d, 0xd5, 0xe2, 0x55, 0xea, 0x73, 0x88, 0x8e, 0x44, 0x96, 0x61, 0x4a, 0x0b, + 0x01, 0x2b, 0x1e, 0x29, 0x51, 0xc7, 0xa9, 0x07, 0x90, 0x55, 0x75, 0x9c, 0x1a, 0x0a, 0x3b, 0xa5, + 0xc5, 0xf7, 0x2b, 0x4f, 0x95, 0xa9, 0x6f, 0x17, 0x30, 0xe4, 0x1a, 0x14, 0x79, 0x9c, 0x90, 0xf5, + 0x9a, 0xfa, 0x3c, 0x15, 0x60, 0x59, 0x22, 0xce, 0x8e, 0x04, 0x8c, 0xe3, 0x42, 0x70, 0x27, 0x39, + 0x73, 0xe4, 0xae, 0xd7, 0xa2, 0xc6, 0xa7, 0xa1, 0x2c, 0x98, 0x4e, 0x9c, 0x2d, 0xfe, 0x59, 0x18, + 0x59, 0x59, 0xaf, 0x99, 0x2a, 0xa3, 0x68, 0x3a, 0x2d, 0xdf, 0xc4, 0x52, 0xf4, 0x91, 0xbb, 0x4b, + 0xc3, 0x47, 0x9e, 0xbf, 0x6f, 0xd2, 0x20, 0xf4, 0x1d, 0x9e, 0x9c, 0x13, 0xb7, 0xda, 0x67, 0xc8, + 0xdb, 0x30, 0x8a, 0xc6, 0xa9, 0x09, 0xde, 0x9f, 0x6c, 0x63, 0x79, 0x4a, 0x2c, 0xd1, 0x51, 0xb4, + 0x74, 0x35, 0x39, 0x12, 0x79, 0x13, 0x46, 0x6a, 0xd4, 0x3d, 0x48, 0xe4, 0x0d, 0x4c, 0x21, 0x47, + 0x5b, 0xbe, 0x45, 0xdd, 0x03, 0x13, 0x51, 0x8c, 0x9f, 0xce, 0xc3, 0xa9, 0x8c, 0xcf, 0xba, 0xff, + 0x99, 0xa7, 0x94, 0xef, 0x2d, 0x6b, 0x7c, 0x4f, 0xbe, 0x39, 0xf7, 0x1d, 0xf8, 0x4c, 0x36, 0xf8, + 0x37, 0x72, 0x70, 0x46, 0x5f, 0xac, 0xc2, 0x1a, 0xfd, 0xfe, 0x35, 0xf2, 0x16, 0x8c, 0xad, 0x51, + 0xbb, 0x45, 0x65, 0x92, 0xb0, 0x53, 0x51, 0x74, 0x3f, 0x1e, 0x46, 0x80, 0x57, 0x72, 0xb2, 0xb1, + 0xd3, 0x29, 0x2f, 0x25, 0x35, 0xf1, 0x71, 0x5c, 0x40, 0x37, 0x64, 0x70, 0x92, 0xac, 0xa6, 0x06, + 0x58, 0x6e, 0x7c, 0x27, 0x07, 0xcf, 0x0c, 0xc0, 0x61, 0x13, 0xc7, 0xa6, 0x5e, 0x9d, 0x38, 0x3c, + 0x33, 0xb1, 0x94, 0xbc, 0x0b, 0x33, 0x9b, 0x42, 0xc0, 0x97, 0xd3, 0x91, 0x8f, 0xf7, 0x8e, 0x94, + 0xfd, 0xa5, 0x6d, 0x91, 0x99, 0x04, 0xd6, 0xa2, 0xe6, 0x14, 0x06, 0x46, 0xcd, 0x51, 0x83, 0xd0, + 0x8c, 0x0c, 0x1b, 0x84, 0xe6, 0x4b, 0x30, 0xaf, 0xf7, 0x4d, 0xc4, 0x02, 0x8e, 0x43, 0xf0, 0xe4, + 0xfa, 0x87, 0xe0, 0x19, 0x18, 0x71, 0xd4, 0xf8, 0xc9, 0x1c, 0x94, 0x75, 0xda, 0x1f, 0x77, 0x3e, + 0xdf, 0xd1, 0xe6, 0xf3, 0x99, 0xec, 0xf9, 0xec, 0x3f, 0x91, 0xff, 0x7b, 0x2e, 0xd9, 0xd9, 0xa1, + 0x66, 0xd0, 0x80, 0xb1, 0x9a, 0xd7, 0xb1, 0x1d, 0x39, 0x71, 0xe8, 0x4a, 0xd2, 0xc2, 0x12, 0x53, + 0xd4, 0x0c, 0x17, 0xb1, 0xe8, 0x3c, 0x8c, 0xde, 0xf5, 0xdc, 0x6a, 0x4d, 0xd8, 0xe4, 0x22, 0x1d, + 0xd7, 0x73, 0x2d, 0xbb, 0x65, 0xf2, 0x0a, 0xb2, 0x01, 0xd0, 0x68, 0xfa, 0x94, 0xba, 0x0d, 0xe7, + 0xfb, 0x69, 0x42, 0x96, 0x60, 0x23, 0xd4, 0xee, 0x21, 0x63, 0xe1, 0x4f, 0xa9, 0x08, 0x68, 0x05, + 0xce, 0xf7, 0xab, 0xbc, 0x57, 0xc1, 0xc7, 0x7d, 0x25, 0x82, 0xba, 0x25, 0xe6, 0xe1, 0xea, 0x27, + 0xb1, 0xaf, 0x32, 0x9b, 0xc2, 0x11, 0xbe, 0x9a, 0x39, 0x1d, 0xbf, 0x93, 0x83, 0x67, 0x06, 0xe0, + 0x3c, 0x81, 0x59, 0xf9, 0xd3, 0x1e, 0x70, 0x0a, 0x10, 0x23, 0x61, 0x5a, 0x66, 0xa7, 0x15, 0xf2, + 0xc4, 0x7f, 0x53, 0x22, 0x2d, 0x33, 0x2b, 0xd0, 0xd2, 0x32, 0xb3, 0x02, 0x76, 0xae, 0xae, 0x51, + 0x67, 0x77, 0x8f, 0x9b, 0x5c, 0x4d, 0x71, 0xde, 0xb0, 0x87, 0x25, 0xea, 0xb9, 0xca, 0x61, 0x8c, + 0x7f, 0x3d, 0x06, 0x67, 0x4d, 0xba, 0xeb, 0xb0, 0x9b, 0xc7, 0x56, 0xe0, 0xb8, 0xbb, 0x5a, 0x10, + 0x1f, 0x23, 0xb1, 0x73, 0x45, 0xc6, 0x0b, 0x56, 0x12, 0xad, 0xc4, 0x4b, 0x50, 0x64, 0xc7, 0xaa, + 0xb2, 0x79, 0xf1, 0x15, 0xcb, 0xf5, 0x5a, 0x54, 0x44, 0x89, 0x96, 0xd5, 0xe4, 0x15, 0x21, 0x08, + 0x29, 0x39, 0x89, 0x98, 0x20, 0xf4, 0xdd, 0xc3, 0x0a, 0x34, 0x0e, 0x82, 0x90, 0xe2, 0x25, 0x58, + 0x08, 0x43, 0xd1, 0x6d, 0x65, 0xa4, 0xcf, 0x6d, 0xe5, 0x0e, 0xcc, 0x57, 0x5b, 0xfc, 0x74, 0xb4, + 0xdb, 0x75, 0xdf, 0x71, 0x9b, 0x4e, 0xd7, 0x6e, 0xcb, 0x1b, 0x38, 0x8e, 0xb2, 0x1d, 0xd5, 0x5b, + 0xdd, 0x08, 0xc0, 0xcc, 0x44, 0x63, 0xdd, 0xa8, 0xdd, 0x6d, 0x60, 0x84, 0x18, 0xf1, 0x40, 0x89, + 0xdd, 0x68, 0xb9, 0x01, 0xf6, 0x22, 0x30, 0xa3, 0x6a, 0xbc, 0x27, 0xe1, 0x73, 0xf4, 0xe6, 0x46, + 0xe3, 0xb6, 0xc8, 0x9a, 0x26, 0x53, 0x26, 0x70, 0x43, 0x83, 0xb0, 0x1d, 0xa0, 0x79, 0xa3, 0x06, + 0x17, 0xe3, 0x35, 0x1a, 0x6b, 0x0c, 0xaf, 0x98, 0xc2, 0x0b, 0x82, 0x3d, 0x15, 0x8f, 0xc3, 0x91, + 0x2b, 0x6c, 0x29, 0x74, 0xbc, 0x90, 0xe2, 0x12, 0x9e, 0x88, 0x6f, 0x55, 0x3e, 0x96, 0xf2, 0x5b, + 0x95, 0x02, 0x42, 0xde, 0x86, 0xb9, 0xd5, 0x95, 0x25, 0xa9, 0x56, 0xae, 0x79, 0xcd, 0x1e, 0x1a, + 0x06, 0x00, 0xb6, 0x87, 0x73, 0x48, 0x9b, 0x4b, 0x8c, 0x9b, 0x64, 0x81, 0x91, 0x0b, 0x30, 0xbe, + 0x5e, 0xe3, 0x63, 0x3f, 0xa9, 0xe6, 0x05, 0x13, 0xd6, 0x4e, 0xb2, 0x92, 0xdc, 0x8b, 0xc5, 0xfe, + 0xd2, 0xb1, 0xf2, 0xf9, 0xd9, 0x21, 0x44, 0xfe, 0x37, 0x61, 0x6a, 0xd9, 0x0b, 0xd7, 0xdd, 0x20, + 0xb4, 0xdd, 0x26, 0x5d, 0xaf, 0xa9, 0x41, 0xba, 0xb7, 0xbd, 0xd0, 0x72, 0x44, 0x0d, 0xfb, 0x72, + 0x1d, 0x92, 0x7c, 0x0e, 0x51, 0x6f, 0x52, 0x97, 0xfa, 0x71, 0x70, 0xee, 0x51, 0x3e, 0xb6, 0x0c, + 0x75, 0x37, 0xaa, 0x31, 0x75, 0x40, 0x62, 0xc2, 0x29, 0x4c, 0xf2, 0xef, 0xf5, 0x02, 0xbd, 0xf1, + 0x99, 0x58, 0xa4, 0xed, 0x0a, 0x00, 0x2b, 0xf9, 0x15, 0xd9, 0xa8, 0x22, 0x0f, 0x1a, 0xcf, 0x5e, + 0xba, 0xe2, 0xb5, 0x68, 0xc0, 0x39, 0xd0, 0xf7, 0x50, 0x1e, 0x34, 0xa5, 0x6f, 0x03, 0xb8, 0xf2, + 0x7f, 0x8c, 0x79, 0xd0, 0x52, 0xb0, 0xe4, 0x73, 0x30, 0x8a, 0x3f, 0x85, 0xc4, 0x3c, 0x97, 0x41, + 0x36, 0x96, 0x96, 0x9b, 0x0c, 0xd2, 0xe4, 0x08, 0x64, 0x1d, 0xc6, 0xc5, 0x75, 0xec, 0x24, 0xd9, + 0x7c, 0xc4, 0xbd, 0x8e, 0xaf, 0x36, 0x81, 0x6f, 0xb4, 0xa0, 0xa4, 0x36, 0xc8, 0x76, 0xd9, 0x9a, + 0x1d, 0xec, 0xd1, 0x16, 0xfb, 0x25, 0x12, 0xf1, 0xe1, 0x2e, 0xdb, 0xc3, 0x52, 0x8b, 0x7d, 0x87, + 0xa9, 0x80, 0xb0, 0x73, 0x7a, 0x3d, 0xd8, 0x0a, 0xc4, 0xa7, 0x08, 0x05, 0x8d, 0x83, 0xca, 0xbe, + 0x96, 0x29, 0xaa, 0x8c, 0xef, 0x83, 0xf9, 0xbb, 0xbd, 0x76, 0xdb, 0xde, 0x6e, 0x53, 0x99, 0xa8, + 0x05, 0x33, 0xa2, 0x2f, 0xc3, 0x68, 0x43, 0xc9, 0xb1, 0x1e, 0x25, 0xcb, 0x54, 0x60, 0xd0, 0x58, + 0x35, 0x87, 0x11, 0x80, 0x12, 0xd9, 0xd5, 0x39, 0xaa, 0xf1, 0xdb, 0x39, 0x98, 0x97, 0x46, 0x06, + 0xbe, 0xdd, 0xdc, 0x8f, 0x12, 0xed, 0x5f, 0xd0, 0xd6, 0x1a, 0x6e, 0x82, 0xc4, 0x32, 0xe2, 0xab, + 0xee, 0x96, 0xfc, 0x08, 0x5d, 0x08, 0xca, 0xfa, 0xe0, 0xe3, 0x3e, 0x86, 0xbc, 0x0d, 0x93, 0xe2, + 0xc8, 0x55, 0x22, 0x70, 0x62, 0x00, 0x32, 0x71, 0x9d, 0x4c, 0x9a, 0xbc, 0xa8, 0xe0, 0x28, 0xdf, + 0xe9, 0x5d, 0xf9, 0xb8, 0x72, 0x45, 0xb6, 0x7c, 0xa7, 0xb7, 0x31, 0x60, 0xe9, 0x7e, 0x7b, 0x32, + 0x39, 0xb6, 0x62, 0xed, 0x5e, 0x57, 0x63, 0xee, 0xe5, 0xe2, 0x9b, 0x77, 0x1c, 0x73, 0x4f, 0xbd, + 0x79, 0x47, 0xa0, 0xd1, 0x9c, 0xe4, 0x8f, 0x99, 0x93, 0x77, 0xe5, 0x9c, 0x14, 0xfa, 0x2f, 0x8c, + 0xb9, 0x01, 0xf3, 0xd0, 0x88, 0x77, 0xc8, 0xc8, 0x50, 0xca, 0x98, 0x4f, 0x61, 0x72, 0x01, 0x8e, + 0x92, 0xe4, 0xcc, 0x82, 0x92, 0xaa, 0xe1, 0x19, 0x1d, 0x9e, 0xe8, 0x31, 0xec, 0xfe, 0xf3, 0x50, + 0xaa, 0x86, 0xa1, 0xdd, 0xdc, 0xa3, 0xad, 0x1a, 0x63, 0x4f, 0x4a, 0x50, 0x2d, 0x5b, 0x94, 0xab, + 0x2f, 0x73, 0x2a, 0x2c, 0x0f, 0x77, 0x6b, 0x07, 0xc2, 0x48, 0x36, 0x0a, 0x77, 0xcb, 0x4a, 0xf4, + 0x70, 0xb7, 0xac, 0x84, 0x5c, 0x81, 0xf1, 0x75, 0xf7, 0xa1, 0xc3, 0xc6, 0x84, 0xc7, 0xd5, 0x42, + 0x8d, 0x96, 0xc3, 0x8b, 0x54, 0xe6, 0x2a, 0xa0, 0xc8, 0x9b, 0xca, 0x45, 0x69, 0x22, 0x56, 0x90, + 0x70, 0x45, 0x59, 0x14, 0x03, 0x47, 0xbd, 0x04, 0x45, 0x37, 0xa7, 0xeb, 0x30, 0x2e, 0xf5, 0x9f, + 0x10, 0x9f, 0x20, 0x02, 0x33, 0x1d, 0x82, 0x42, 0x02, 0x63, 0xd2, 0x74, 0x25, 0xa1, 0xe0, 0xa4, + 0x92, 0x34, 0x5d, 0x49, 0x28, 0xa8, 0x25, 0x4d, 0x57, 0x52, 0x0b, 0x46, 0xaa, 0xa3, 0xd2, 0xb1, + 0xaa, 0xa3, 0xfb, 0x50, 0xaa, 0xdb, 0x7e, 0xe8, 0x30, 0xb9, 0xc7, 0x0d, 0x83, 0x85, 0x29, 0x4d, + 0xdb, 0xaa, 0x54, 0x2d, 0x3f, 0x27, 0x13, 0x77, 0x77, 0x15, 0x78, 0x3d, 0xc3, 0x74, 0x5c, 0x9e, + 0x6d, 0x22, 0x3b, 0xfd, 0x71, 0x4c, 0x64, 0x71, 0x50, 0x51, 0xc3, 0x36, 0x13, 0x6b, 0x7c, 0xf0, + 0x22, 0x94, 0x50, 0xb3, 0x45, 0x80, 0xe4, 0x2b, 0x50, 0x62, 0x7f, 0xd7, 0xbd, 0xb6, 0xd3, 0x74, + 0x68, 0xb0, 0x50, 0xc6, 0xce, 0x3d, 0x97, 0xb9, 0xfb, 0x11, 0xe8, 0xa0, 0x41, 0x43, 0xbe, 0x81, + 0x91, 0x70, 0x52, 0x75, 0xae, 0x51, 0x23, 0xef, 0x41, 0x89, 0xad, 0xbe, 0x6d, 0x3b, 0xe0, 0xe2, + 0xee, 0x6c, 0x6c, 0xe4, 0xdc, 0x12, 0xe5, 0xa9, 0x88, 0xd3, 0x2a, 0x02, 0x3b, 0xe6, 0xab, 0x5d, + 0xce, 0x20, 0x89, 0xb2, 0xda, 0xbb, 0x29, 0xe6, 0x28, 0xc1, 0xc8, 0x17, 0xa0, 0x54, 0xed, 0x76, + 0x63, 0x8e, 0x33, 0xa7, 0x28, 0xda, 0xba, 0x5d, 0x2b, 0x93, 0xeb, 0x68, 0x18, 0x49, 0xc6, 0x3c, + 0x7f, 0x22, 0xc6, 0x4c, 0x5e, 0x8f, 0x6e, 0x00, 0xa7, 0x62, 0x5d, 0xb0, 0xb8, 0x8c, 0x6a, 0xd7, + 0x09, 0x7e, 0x19, 0x58, 0x81, 0x29, 0xae, 0x1c, 0x95, 0xd2, 0xcc, 0xe9, 0xd4, 0xee, 0xc9, 0x10, + 0x6a, 0x74, 0x1c, 0xb2, 0x0a, 0xd3, 0xdc, 0xcb, 0xbb, 0x2d, 0x42, 0x81, 0x2f, 0x9c, 0xc1, 0x5d, + 0x8b, 0x54, 0xb8, 0x73, 0x78, 0x1b, 0x33, 0xc4, 0xd8, 0x1a, 0x95, 0x04, 0x92, 0xf1, 0x07, 0x39, + 0x38, 0xd3, 0x67, 0xc6, 0xa3, 0x40, 0xd1, 0xb9, 0xc1, 0x81, 0xa2, 0x19, 0xe7, 0xd0, 0x35, 0x2d, + 0xd8, 0xff, 0xb4, 0xf3, 0x56, 0x24, 0x6f, 0x79, 0x40, 0x44, 0x12, 0x26, 0xd1, 0xf4, 0x2d, 0x0f, + 0x15, 0xba, 0x85, 0xf4, 0x21, 0x24, 0xe0, 0xf8, 0x47, 0xf1, 0xf0, 0x9a, 0x22, 0xc7, 0x53, 0x34, + 0xad, 0x1f, 0x7a, 0xda, 0x0e, 0xce, 0x20, 0x6d, 0x1c, 0xe6, 0x60, 0x52, 0xd9, 0x87, 0xe4, 0xbc, + 0xe2, 0x1a, 0x5c, 0xe6, 0x59, 0xc2, 0x14, 0x0a, 0x79, 0x7e, 0x12, 0xe1, 0xa6, 0xca, 0x1f, 0xaf, + 0xb6, 0xc6, 0x48, 0x64, 0x4a, 0x30, 0xed, 0x44, 0x10, 0x32, 0xac, 0x27, 0x1f, 0x00, 0x6c, 0xd8, + 0x41, 0x58, 0x6d, 0x86, 0xce, 0x43, 0x3a, 0xc4, 0xa1, 0x23, 0xc3, 0x0b, 0x9e, 0xc2, 0xbc, 0x14, + 0x36, 0xa2, 0x25, 0xce, 0x08, 0x85, 0xa0, 0xf1, 0x97, 0x72, 0x00, 0x5b, 0xeb, 0x2b, 0x18, 0x0d, + 0xff, 0xe3, 0x0a, 0x05, 0xd9, 0x11, 0x86, 0x25, 0xf5, 0x01, 0xe2, 0xc0, 0xff, 0x90, 0x83, 0x69, + 0x1d, 0x8c, 0xbc, 0x0b, 0x33, 0x8d, 0xa6, 0xef, 0xb5, 0xdb, 0xdb, 0x76, 0x73, 0x7f, 0xc3, 0x71, + 0x29, 0x8f, 0xba, 0x3a, 0xca, 0xcf, 0xa2, 0x20, 0xaa, 0xb2, 0xda, 0xac, 0xce, 0x4c, 0x02, 0x93, + 0x1f, 0xce, 0xc1, 0x54, 0x63, 0xcf, 0x7b, 0x14, 0x05, 0x31, 0x15, 0x13, 0xf2, 0x01, 0xdb, 0xdb, + 0xc1, 0x9e, 0xf7, 0x28, 0x4e, 0x31, 0xaa, 0x59, 0x98, 0xbe, 0x33, 0xdc, 0xe3, 0x7f, 0xd3, 0xc3, + 0xfb, 0x48, 0x18, 0x5c, 0xd6, 0x1a, 0x31, 0xf5, 0x36, 0x8d, 0x3f, 0xc9, 0xc1, 0x24, 0xde, 0x5c, + 0xda, 0x6d, 0x94, 0xb9, 0xbe, 0x97, 0xf2, 0x55, 0x46, 0xfd, 0x1a, 0x30, 0xb1, 0x6f, 0xc0, 0x4c, + 0x02, 0x8c, 0x18, 0x30, 0xd6, 0x40, 0xaf, 0x7f, 0x55, 0xe9, 0xc1, 0xe3, 0x00, 0x98, 0xa2, 0xc6, + 0x58, 0x55, 0xd0, 0xee, 0x5f, 0xc5, 0xc7, 0xe0, 0x25, 0x00, 0x47, 0x16, 0xc9, 0x9b, 0x0d, 0x49, + 0x7e, 0xc9, 0xfd, 0xab, 0xa6, 0x02, 0x65, 0xdc, 0x85, 0xb1, 0x86, 0xe7, 0x87, 0xcb, 0x07, 0xfc, + 0x32, 0x51, 0xa3, 0x41, 0x53, 0x7d, 0xed, 0x75, 0xf0, 0x2d, 0xa6, 0x69, 0x8a, 0x2a, 0x52, 0x81, + 0xd1, 0x1b, 0x0e, 0x6d, 0xb7, 0x54, 0x2b, 0xe0, 0x1d, 0x56, 0x60, 0xf2, 0x72, 0x76, 0xe1, 0x3a, + 0x1d, 0x27, 0x8d, 0x89, 0xcd, 0x8d, 0x3f, 0xee, 0xbe, 0x59, 0xd1, 0xc6, 0xf7, 0xf9, 0x28, 0x51, + 0x43, 0xba, 0xa5, 0x01, 0x43, 0xfd, 0x0f, 0x73, 0xb0, 0xd8, 0x1f, 0x45, 0xb5, 0x60, 0xce, 0x0d, + 0xb0, 0x60, 0x7e, 0x29, 0xf9, 0x3a, 0x89, 0x60, 0xe2, 0x75, 0x32, 0x7e, 0x93, 0xac, 0xa1, 0x01, + 0x79, 0x93, 0xca, 0x4c, 0x31, 0xe7, 0x07, 0x7c, 0x33, 0x02, 0xf2, 0x69, 0x0e, 0x11, 0xc7, 0x14, + 0xb8, 0xc6, 0x6f, 0x8c, 0xc0, 0xd9, 0xbe, 0x18, 0x64, 0x4d, 0xc9, 0x3f, 0x35, 0x1d, 0x65, 0xbe, + 0xe9, 0x0b, 0x7f, 0x19, 0xff, 0x45, 0x1b, 0xc1, 0xa4, 0x57, 0xda, 0xbd, 0x28, 0xef, 0x50, 0x1e, + 0x69, 0xbd, 0x7a, 0x2c, 0x2d, 0x0e, 0x8e, 0xc4, 0x20, 0x9d, 0x82, 0x08, 0xfd, 0x17, 0x69, 0x68, + 0x3b, 0xed, 0x40, 0xdd, 0x76, 0x2d, 0x5e, 0x64, 0xca, 0xba, 0xd8, 0xac, 0x7c, 0x24, 0xdb, 0xac, + 0xdc, 0xf8, 0x7f, 0x73, 0x30, 0x11, 0x7d, 0x36, 0x59, 0x84, 0xd3, 0x9b, 0x66, 0x75, 0x65, 0xd5, + 0xda, 0xfc, 0x52, 0x7d, 0xd5, 0xda, 0xba, 0xdb, 0xa8, 0xff, 0xff, 0xec, 0xbd, 0x5d, 0x8c, 0x24, + 0x47, 0x72, 0x18, 0xbc, 0xd5, 0xdd, 0x33, 0xd3, 0x13, 0xf3, 0x57, 0x93, 0x3b, 0xbb, 0x3b, 0xfb, + 0xcf, 0x2d, 0x92, 0x7b, 0xcb, 0xe1, 0x91, 0xc7, 0x5d, 0x7e, 0x3c, 0xde, 0xde, 0x1d, 0x49, 0xd5, + 0x74, 0xd7, 0xcc, 0xf4, 0x6e, 0xff, 0x31, 0xab, 0x67, 0x57, 0x7b, 0x94, 0x54, 0xaa, 0xed, 0xae, + 0x99, 0x69, 0x6e, 0x4f, 0x57, 0xb3, 0xaa, 0x9a, 0xcb, 0x39, 0x7c, 0x80, 0x4f, 0x10, 0x7c, 0x02, + 0x6c, 0xcb, 0x92, 0xad, 0x33, 0x4c, 0x08, 0x36, 0x64, 0xc0, 0x07, 0x41, 0x0f, 0x02, 0xfc, 0xe0, + 0x17, 0xc3, 0xf7, 0x24, 0xf8, 0x45, 0xc0, 0xe1, 0x0c, 0x1b, 0x06, 0xfc, 0x70, 0x32, 0x08, 0xe9, + 0x04, 0x1b, 0xc6, 0xc1, 0x6f, 0x82, 0xfd, 0x20, 0x40, 0x80, 0x91, 0x91, 0x99, 0x55, 0x59, 0xd5, + 0xd5, 0xbd, 0xb3, 0x47, 0x9e, 0x6d, 0x01, 0xf7, 0x34, 0xd3, 0x91, 0x11, 0x51, 0xf9, 0x9f, 0x91, + 0x11, 0x91, 0x11, 0x56, 0xa5, 0xb6, 0x53, 0xb3, 0xaa, 0xfa, 0x19, 0xb2, 0x0e, 0x2b, 0xfb, 0xcd, + 0xfb, 0xcd, 0xd6, 0xc3, 0xa6, 0x63, 0x51, 0xda, 0xa2, 0xba, 0x46, 0x56, 0x60, 0x91, 0x6e, 0x9b, + 0x15, 0xa7, 0xd9, 0xaa, 0x5a, 0x7a, 0x81, 0xe8, 0xb0, 0x5c, 0x69, 0x35, 0x9b, 0x56, 0xa5, 0x53, + 0x7b, 0x50, 0xeb, 0x3c, 0xd2, 0x8b, 0x84, 0xc0, 0x2a, 0x22, 0xb4, 0x69, 0xad, 0x59, 0xa9, 0xb5, + 0xcd, 0xba, 0x5e, 0x62, 0x30, 0x86, 0xaf, 0xc0, 0xe6, 0x62, 0x46, 0xf7, 0xf7, 0xb7, 0x2d, 0x7d, + 0x9e, 0xa1, 0xb0, 0xff, 0x14, 0x94, 0x05, 0xf6, 0x79, 0x44, 0xa9, 0x9a, 0x1d, 0x73, 0xdb, 0xb4, + 0x2d, 0xbd, 0x4c, 0x2e, 0xc0, 0xd9, 0x14, 0xc8, 0xa9, 0xb7, 0x76, 0x6b, 0x4d, 0x7d, 0x91, 0x6c, + 0x80, 0x1e, 0xc3, 0xaa, 0xdb, 0xce, 0xbe, 0x6d, 0x51, 0x1d, 0xb2, 0xd0, 0xa6, 0xd9, 0xb0, 0xf4, + 0x25, 0xe3, 0x1d, 0xfe, 0x5e, 0x90, 0x77, 0x35, 0x39, 0x0f, 0xc4, 0xee, 0x98, 0x9d, 0x7d, 0x3b, + 0xd3, 0xf8, 0x25, 0x58, 0xb0, 0xf7, 0x2b, 0x15, 0xcb, 0xb6, 0x75, 0x8d, 0x00, 0xcc, 0xef, 0x98, + 0xb5, 0xba, 0x55, 0xd5, 0x0b, 0xc6, 0xef, 0x6a, 0xb0, 0x2e, 0x25, 0x40, 0x69, 0x88, 0xfa, 0x9c, + 0x6b, 0xf1, 0xdd, 0xd4, 0xc5, 0x56, 0x3e, 0xfe, 0xca, 0x7c, 0x64, 0xc6, 0x32, 0xfc, 0x67, 0x1a, + 0x9c, 0xcb, 0xc5, 0x26, 0x8f, 0x40, 0x97, 0x35, 0x68, 0xb8, 0x51, 0xf7, 0x28, 0xd9, 0xc7, 0xae, + 0x65, 0xbe, 0x92, 0x41, 0xe3, 0xaa, 0xd2, 0x24, 0x23, 0xf6, 0x04, 0x9b, 0xd3, 0xe7, 0x6b, 0x30, + 0x3e, 0xd5, 0xe0, 0xc2, 0x94, 0xcf, 0x90, 0x0a, 0xcc, 0xc7, 0x99, 0x7b, 0x66, 0xb8, 0xc9, 0x6d, + 0xfc, 0xf8, 0xb3, 0xeb, 0x02, 0x11, 0x53, 0x08, 0xe3, 0x7f, 0x74, 0x3e, 0x4e, 0xc5, 0x83, 0xf9, + 0x70, 0x78, 0xf7, 0x5d, 0xcc, 0xf4, 0xbc, 0xf8, 0x92, 0xf9, 0xd0, 0xde, 0x5e, 0x12, 0x7d, 0x57, + 0x74, 0x9f, 0x86, 0x98, 0x10, 0xc7, 0xf8, 0x9e, 0xc6, 0x84, 0xbb, 0x2c, 0x22, 0x93, 0x79, 0xcd, + 0x30, 0x1c, 0x1f, 0x7b, 0xd4, 0x1f, 0x78, 0x26, 0x6d, 0x8a, 0x63, 0x03, 0xa5, 0x55, 0x17, 0x0b, + 0xf0, 0x5a, 0xe1, 0xb8, 0x41, 0xea, 0xb9, 0x7f, 0x8a, 0x86, 0xdc, 0x05, 0xb0, 0x3e, 0x89, 0xbc, + 0x60, 0xe8, 0x0e, 0xe2, 0xc0, 0x2d, 0x3c, 0xa2, 0x95, 0x80, 0xa6, 0xe5, 0x6d, 0x05, 0xd9, 0xf8, + 0xae, 0x06, 0xcb, 0xe2, 0xd2, 0x64, 0x0e, 0xbc, 0x20, 0xfa, 0x7c, 0xd3, 0xeb, 0x6e, 0x6a, 0x7a, + 0xc5, 0xaf, 0x42, 0x14, 0xfe, 0xac, 0x38, 0x77, 0x66, 0xfd, 0x7b, 0x0d, 0xf4, 0x2c, 0x22, 0x79, + 0x17, 0xca, 0xb6, 0xf7, 0xb1, 0x17, 0xf4, 0xa3, 0x13, 0xb1, 0x51, 0xca, 0x1c, 0x87, 0x1c, 0x47, + 0x94, 0xf1, 0xf9, 0x10, 0x8a, 0x5f, 0x34, 0xa6, 0x39, 0xed, 0x7e, 0xaf, 0xa8, 0x3d, 0x8a, 0x5f, + 0x94, 0xda, 0xc3, 0xf8, 0xf3, 0x02, 0x5c, 0xd8, 0xf5, 0x22, 0xb5, 0x4d, 0xb1, 0xfb, 0xc2, 0x1b, + 0xa7, 0x6b, 0x97, 0xd2, 0x92, 0x4d, 0x58, 0xc0, 0x22, 0x39, 0xbe, 0x54, 0xfe, 0x24, 0xdb, 0xf1, + 0xbc, 0x2e, 0xa6, 0x92, 0xa8, 0x4d, 0xf9, 0xf6, 0xeb, 0x4a, 0x5a, 0xa5, 0x78, 0x5a, 0xdf, 0x84, + 0x55, 0x8c, 0xe8, 0x3f, 0x66, 0xcb, 0xc1, 0xeb, 0x09, 0xf5, 0x4f, 0x99, 0x66, 0xa0, 0x64, 0x0b, + 0x74, 0x06, 0x31, 0xbb, 0x4f, 0x86, 0xfe, 0xd3, 0x81, 0xd7, 0x3b, 0xf4, 0x7a, 0x78, 0xac, 0x97, + 0xe9, 0x04, 0x5c, 0xf2, 0xdc, 0x1f, 0xf2, 0xab, 0x9b, 0xd7, 0x43, 0x1d, 0x8d, 0xe0, 0x99, 0x40, + 0x2f, 0xdd, 0x85, 0xa5, 0x9f, 0x31, 0x45, 0x9a, 0xf1, 0x67, 0x1a, 0x6c, 0x60, 0xe3, 0x94, 0x0f, + 0xcb, 0xf4, 0xb5, 0xb2, 0xb7, 0x94, 0xac, 0x41, 0x2e, 0x03, 0xa5, 0x97, 0x42, 0xdc, 0x8b, 0x89, + 0x4e, 0xa8, 0x70, 0x0a, 0x9d, 0x90, 0xfd, 0x3c, 0xa9, 0xfa, 0x4f, 0xa9, 0xd2, 0xba, 0x57, 0x2a, + 0x17, 0xf5, 0x52, 0x32, 0xe4, 0xc6, 0x6f, 0x16, 0x60, 0x81, 0x7a, 0x98, 0xc3, 0x9c, 0xdc, 0x84, + 0x85, 0xa6, 0x1f, 0x79, 0x61, 0x23, 0x95, 0xb0, 0x7e, 0xc8, 0x40, 0xce, 0x71, 0x8f, 0xca, 0x42, + 0x36, 0xe1, 0xdb, 0x81, 0xdf, 0x1b, 0x77, 0x23, 0x75, 0xc2, 0x8f, 0x38, 0x88, 0xca, 0x32, 0xf2, + 0x65, 0x58, 0x14, 0x9c, 0x63, 0x43, 0x31, 0x7a, 0x3c, 0x07, 0x5e, 0x9c, 0x03, 0x3f, 0x41, 0x40, + 0x99, 0x96, 0x0b, 0x18, 0x25, 0x45, 0xa6, 0x9d, 0x90, 0x19, 0xa4, 0xa8, 0x3e, 0x37, 0x43, 0x54, + 0x7f, 0x03, 0xe6, 0xcd, 0x30, 0xf4, 0x22, 0x19, 0xed, 0x60, 0x39, 0x0e, 0x17, 0x17, 0x7a, 0x11, + 0x67, 0xec, 0x62, 0x39, 0x15, 0x78, 0xc6, 0x5f, 0x15, 0x60, 0x0e, 0xff, 0x45, 0x33, 0x6c, 0xd0, + 0x3d, 0x4a, 0x99, 0x61, 0x83, 0xee, 0x11, 0x45, 0x28, 0xb9, 0x8d, 0x9a, 0x0a, 0x99, 0xe0, 0x4a, + 0xb4, 0x1e, 0x55, 0xf0, 0xbd, 0x04, 0x4c, 0x55, 0x9c, 0xd8, 0x6b, 0xa0, 0x98, 0x1b, 0xe3, 0xe4, + 0x3c, 0x14, 0x5a, 0xb6, 0x68, 0x31, 0x86, 0xc9, 0xf2, 0x43, 0x5a, 0x68, 0xd9, 0xd8, 0x1b, 0x7b, + 0xe6, 0x9d, 0xb7, 0xbe, 0x2a, 0x1a, 0xca, 0x7b, 0xe3, 0xc8, 0xbd, 0xf3, 0xd6, 0x57, 0xa9, 0x28, + 0x61, 0xfd, 0x8b, 0x75, 0x46, 0x63, 0x2e, 0x7f, 0xcb, 0x8f, 0xfd, 0x8b, 0x6d, 0x43, 0xc3, 0x2d, + 0x4d, 0x10, 0xc8, 0x1d, 0x58, 0x12, 0x31, 0x21, 0x10, 0x5f, 0x89, 0xd9, 0x20, 0x62, 0x46, 0x70, + 0x0a, 0x15, 0x89, 0x9b, 0xf5, 0xc4, 0x00, 0xc9, 0x34, 0xbc, 0xc2, 0xac, 0x27, 0x87, 0x30, 0xa4, + 0x0a, 0x0a, 0xab, 0x12, 0xb7, 0x0b, 0x26, 0x6f, 0xf4, 0xb1, 0x4a, 0xc2, 0x78, 0x88, 0xd9, 0x13, + 0x62, 0x04, 0xe3, 0x8f, 0x0a, 0x50, 0x6e, 0x0f, 0xc6, 0x87, 0xfd, 0xe1, 0x83, 0xdb, 0x84, 0x00, + 0x5e, 0xe3, 0x64, 0x7a, 0x0d, 0xf6, 0x3f, 0xb9, 0x08, 0x65, 0x79, 0x73, 0x93, 0x1b, 0x52, 0x28, + 0x6e, 0x6d, 0x9b, 0x20, 0xc7, 0x5d, 0xc4, 0x43, 0x93, 0x3f, 0xc9, 0x6d, 0x88, 0xef, 0x5f, 0xd3, + 0x2e, 0x6a, 0x25, 0xb6, 0x58, 0x68, 0x8c, 0x46, 0x5e, 0x03, 0x3c, 0x24, 0xc4, 0xe5, 0x41, 0x2a, + 0xb4, 0x79, 0xd5, 0x84, 0x9c, 0xc2, 0x49, 0x10, 0x8d, 0xbc, 0x09, 0x62, 0x62, 0x8a, 0x74, 0xef, + 0xe7, 0xd2, 0x04, 0x3c, 0x81, 0xa6, 0x24, 0x11, 0xa8, 0xe4, 0x9b, 0xb0, 0xd4, 0x0d, 0x3c, 0xb4, + 0x64, 0xba, 0x83, 0x24, 0x8b, 0xbb, 0x4a, 0x59, 0x49, 0xca, 0x1f, 0xdc, 0xa6, 0x2a, 0xba, 0xf1, + 0xbd, 0x45, 0x58, 0x56, 0xeb, 0x43, 0x28, 0x9c, 0x0d, 0x07, 0xec, 0xee, 0x2e, 0x9c, 0xd9, 0x46, + 0x58, 0x28, 0x8e, 0xd3, 0x17, 0xd2, 0x15, 0x62, 0x78, 0xdc, 0xb3, 0x4d, 0x06, 0xb3, 0xd8, 0x3b, + 0x43, 0xd7, 0xc3, 0x04, 0xcc, 0xf1, 0x88, 0x09, 0x65, 0x7f, 0x14, 0x1e, 0x7a, 0xc3, 0xbe, 0xb4, + 0xb7, 0xbc, 0x98, 0x62, 0xd4, 0x12, 0x85, 0x13, 0xbc, 0x62, 0x32, 0xf2, 0x16, 0xcc, 0xfb, 0x23, + 0x6f, 0xe8, 0xf6, 0xc5, 0x19, 0x77, 0x39, 0xc3, 0xc0, 0x1b, 0x9a, 0x35, 0x85, 0x50, 0x20, 0x93, + 0xaf, 0x40, 0xc9, 0x7f, 0x12, 0x8f, 0xd7, 0xc5, 0x34, 0xd1, 0x93, 0xc8, 0x55, 0x48, 0x10, 0x91, + 0x11, 0x7c, 0xe8, 0x1e, 0x1f, 0x88, 0x11, 0x4b, 0x13, 0xdc, 0x73, 0x8f, 0x0f, 0x54, 0x02, 0x86, + 0x48, 0xde, 0x03, 0x18, 0xb9, 0x87, 0x5e, 0xe0, 0xf4, 0xc6, 0xd1, 0x89, 0x18, 0xb7, 0x6b, 0x29, + 0xb2, 0x36, 0x2b, 0xae, 0x8e, 0xa3, 0x13, 0x85, 0x76, 0x71, 0x24, 0x81, 0xc4, 0x04, 0x38, 0x76, + 0xa3, 0xc8, 0x0b, 0x8e, 0x7d, 0xe1, 0x4d, 0x98, 0x04, 0x3f, 0xe4, 0x0c, 0x1a, 0x71, 0xb1, 0xc2, + 0x41, 0x21, 0xc2, 0x4a, 0xf7, 0x03, 0x57, 0x24, 0xdd, 0xcf, 0x54, 0xba, 0x1f, 0xa4, 0x5a, 0xc9, + 0x10, 0xc9, 0xd7, 0x60, 0xa1, 0xd7, 0x0f, 0xbb, 0x7e, 0xd0, 0x13, 0x51, 0x4e, 0xae, 0xa4, 0x68, + 0xaa, 0xbc, 0x4c, 0x21, 0x93, 0xe8, 0xac, 0xb6, 0x22, 0xf8, 0x69, 0xd3, 0x7f, 0x8a, 0x6a, 0xfe, + 0x6c, 0x6d, 0xed, 0xb8, 0x58, 0xad, 0x6d, 0x42, 0xc4, 0x86, 0xf2, 0xb0, 0x1f, 0x0d, 0xdc, 0xc7, + 0xc2, 0x76, 0x9e, 0x1e, 0xca, 0x5d, 0x2c, 0x52, 0x87, 0x92, 0x23, 0x93, 0xbb, 0x50, 0xf6, 0x86, + 0x51, 0xe0, 0x3a, 0xfd, 0x9e, 0x78, 0x8a, 0x99, 0xae, 0x34, 0x3b, 0x80, 0xdd, 0x5a, 0x55, 0xad, + 0x34, 0xe2, 0xd7, 0x7a, 0xac, 0x7f, 0xc2, 0x6e, 0xff, 0x58, 0xbc, 0xa0, 0x4c, 0xf7, 0x8f, 0x5d, + 0xa9, 0x35, 0xd4, 0xfe, 0x61, 0x88, 0xe4, 0x5d, 0x58, 0x60, 0xeb, 0xb7, 0xe7, 0x1f, 0x8a, 0x40, + 0x13, 0x46, 0xba, 0x7f, 0x78, 0xd9, 0xc4, 0x74, 0x95, 0x44, 0x6c, 0x21, 0xbb, 0x4f, 0x43, 0xa7, + 0xdf, 0xc5, 0x98, 0x98, 0xd9, 0xe5, 0x68, 0x3e, 0xb4, 0x6b, 0x15, 0x85, 0x6c, 0xce, 0x7d, 0x1a, + 0xd6, 0xba, 0xe4, 0x0e, 0xcc, 0x61, 0xe6, 0x09, 0x11, 0x00, 0x33, 0x4d, 0x83, 0x39, 0x27, 0x54, + 0x1a, 0x44, 0x65, 0x03, 0x79, 0x1c, 0xe2, 0xa3, 0x14, 0x91, 0xff, 0x21, 0xdd, 0x27, 0x0d, 0x1b, + 0x5f, 0xaa, 0xa8, 0x55, 0x14, 0xe8, 0xac, 0x8a, 0x43, 0x2f, 0x72, 0xfa, 0x1f, 0x89, 0x0c, 0x0e, + 0xe9, 0xcf, 0x35, 0xbd, 0xa8, 0xf6, 0xbe, 0xfa, 0xb9, 0xa1, 0x17, 0xd5, 0x3e, 0x12, 0x43, 0x77, + 0x34, 0x7e, 0x8c, 0xba, 0xf4, 0x9c, 0xa1, 0x3b, 0x1a, 0x67, 0x87, 0xee, 0x68, 0xfc, 0x98, 0x5c, + 0x03, 0x48, 0xbc, 0x10, 0xb8, 0x7d, 0x87, 0x2a, 0x90, 0xaf, 0x97, 0xfe, 0xfb, 0xbf, 0xb8, 0xae, + 0x6d, 0x03, 0x94, 0x65, 0xd4, 0x1c, 0x26, 0x4f, 0x6f, 0xe4, 0x31, 0x25, 0x37, 0x60, 0x59, 0x8d, + 0xe9, 0x23, 0x76, 0xf5, 0x25, 0x77, 0xd4, 0x97, 0x51, 0x7d, 0x66, 0x27, 0x42, 0x78, 0x15, 0xd6, + 0x53, 0x4f, 0x80, 0x12, 0x87, 0x40, 0xaa, 0xab, 0x05, 0x78, 0x88, 0x56, 0x00, 0xc2, 0xc8, 0x0d, + 0x22, 0xa7, 0xe7, 0x46, 0xa7, 0x51, 0xef, 0x96, 0xd9, 0xc6, 0xcc, 0x3d, 0xae, 0x91, 0xae, 0xea, + 0x46, 0x1e, 0x6f, 0x9c, 0x51, 0x87, 0x8b, 0x53, 0x37, 0x4d, 0xf2, 0x0a, 0xe8, 0x07, 0xae, 0x50, + 0x99, 0x76, 0x8f, 0xdc, 0xe1, 0xd0, 0x1b, 0x88, 0x86, 0xad, 0x49, 0x78, 0x85, 0x83, 0x05, 0xb7, + 0xf7, 0x94, 0xde, 0x51, 0x56, 0xcb, 0x29, 0x7a, 0x47, 0x30, 0xf8, 0x81, 0x06, 0x57, 0x66, 0xed, + 0xbd, 0xe4, 0x12, 0x94, 0x47, 0x41, 0xdf, 0x47, 0x19, 0x5f, 0xf4, 0xa1, 0xfc, 0x8d, 0x79, 0x22, + 0x50, 0x18, 0x8d, 0xdc, 0x43, 0xf1, 0xa6, 0x86, 0x2e, 0x22, 0xa4, 0xe3, 0x1e, 0x86, 0xac, 0x8b, + 0x7b, 0xde, 0x81, 0x3b, 0x1e, 0x44, 0x4e, 0xd8, 0x3d, 0xf2, 0x7a, 0xf8, 0xea, 0x0d, 0x3d, 0x29, + 0xa9, 0x2e, 0x0a, 0x6c, 0x09, 0x9f, 0xa8, 0xf1, 0xdc, 0x94, 0x1a, 0xdf, 0x2b, 0x95, 0x35, 0xbd, + 0x40, 0xd1, 0x75, 0xcd, 0xf8, 0x4e, 0x01, 0x36, 0xa7, 0x6d, 0x36, 0xe4, 0x9d, 0xbc, 0x3e, 0xe0, + 0x56, 0x1f, 0x15, 0xae, 0x5a, 0x7d, 0xd4, 0xd9, 0x73, 0x07, 0xe2, 0x37, 0x6b, 0xcf, 0x8a, 0x3f, + 0x21, 0x61, 0x8c, 0x66, 0xe4, 0x86, 0xe1, 0x53, 0xb6, 0x9f, 0x16, 0x95, 0x28, 0xc4, 0x02, 0xa6, + 0xd2, 0x48, 0x18, 0x79, 0x1b, 0xa0, 0x3b, 0xf0, 0x43, 0x0f, 0x9d, 0x2b, 0x84, 0xa0, 0xc6, 0x3d, + 0xf1, 0x63, 0xa8, 0x6a, 0x4d, 0x47, 0x68, 0xc5, 0xef, 0xc9, 0xf9, 0xe4, 0xc2, 0x85, 0x29, 0xa7, + 0x0b, 0x1b, 0x1e, 0x7c, 0x84, 0xc6, 0x37, 0x13, 0x91, 0xff, 0x8b, 0x41, 0x78, 0xde, 0x9a, 0x6c, + 0x8f, 0x17, 0xa6, 0xcd, 0x91, 0x13, 0x20, 0x93, 0x47, 0x08, 0xe3, 0x2e, 0x3c, 0xcf, 0xc7, 0x41, + 0xcc, 0x9d, 0x43, 0xf6, 0x83, 0x01, 0xb9, 0x0e, 0x4b, 0x32, 0x53, 0x29, 0xbb, 0x08, 0x71, 0xe6, + 0x20, 0x40, 0xf7, 0x3d, 0x9c, 0x3c, 0x18, 0x03, 0x16, 0x5f, 0x26, 0x8a, 0x95, 0xb7, 0x88, 0x90, + 0xce, 0xc9, 0x48, 0xb6, 0xee, 0x8a, 0x9c, 0xdf, 0xe9, 0x83, 0x5d, 0x94, 0xfe, 0x13, 0x4d, 0x0e, + 0xff, 0xe4, 0xc9, 0xf8, 0xac, 0xfa, 0x11, 0xc0, 0x87, 0x61, 0xa2, 0x62, 0xf8, 0x3f, 0x13, 0xf9, + 0xe4, 0xaa, 0x13, 0x22, 0x9f, 0xf8, 0x49, 0x6e, 0xc2, 0x5a, 0xc0, 0x1d, 0x8b, 0x23, 0x5f, 0xf4, + 0x27, 0x4f, 0x8b, 0xb2, 0xc2, 0xc1, 0x1d, 0x1f, 0xfb, 0x54, 0xd4, 0xeb, 0x5e, 0xdc, 0x61, 0x8a, + 0xa0, 0x40, 0x5e, 0x87, 0x45, 0x26, 0x28, 0x60, 0xf8, 0xa1, 0xcc, 0x8b, 0x14, 0xc4, 0x43, 0xb1, + 0x8b, 0x96, 0x3f, 0x14, 0xff, 0x0b, 0x5e, 0xff, 0xa6, 0x20, 0x99, 0xa9, 0x62, 0x0a, 0xb9, 0x00, + 0x0b, 0x7e, 0x70, 0xa8, 0x34, 0x6d, 0xde, 0x0f, 0x0e, 0x59, 0xbb, 0x6e, 0x81, 0xce, 0x1f, 0x48, + 0xf1, 0x40, 0x15, 0xe1, 0xc9, 0x90, 0xeb, 0x31, 0xca, 0x74, 0x95, 0xc3, 0xf7, 0x43, 0x2f, 0xb0, + 0x4f, 0x86, 0x5d, 0x86, 0x19, 0x86, 0xbe, 0xa3, 0x46, 0x11, 0x13, 0xcd, 0x5e, 0x0d, 0x43, 0x3f, + 0x09, 0x27, 0xd6, 0x23, 0xdb, 0xb0, 0xc2, 0xf8, 0xc4, 0xb1, 0xcc, 0xc4, 0x0e, 0x78, 0x75, 0x52, + 0x8a, 0x3a, 0x19, 0x76, 0x65, 0x15, 0xe9, 0x72, 0xa8, 0xfc, 0x22, 0xf7, 0x41, 0x57, 0xc4, 0x4d, + 0x7c, 0x31, 0x9b, 0x71, 0x72, 0x4f, 0xd8, 0x28, 0x62, 0x6a, 0x6d, 0x78, 0xe0, 0xd3, 0xb5, 0x6e, + 0x1a, 0x10, 0xef, 0x04, 0xf3, 0xfa, 0x02, 0xdd, 0x14, 0xcd, 0x0d, 0xd1, 0x7b, 0xd2, 0x19, 0xf8, + 0x87, 0x8e, 0xf7, 0x09, 0x1b, 0x13, 0xe3, 0x0f, 0x34, 0xb9, 0xd7, 0xe6, 0x30, 0x25, 0x06, 0xac, + 0x1c, 0xb9, 0xa1, 0x13, 0x86, 0xc7, 0xdc, 0xa9, 0x4f, 0x84, 0x52, 0x5e, 0x3a, 0x72, 0x43, 0x3b, + 0x3c, 0x96, 0x79, 0x5b, 0xce, 0x31, 0x1c, 0xdf, 0x1d, 0x47, 0x47, 0x8e, 0x2a, 0x5c, 0xf3, 0x1e, + 0x3d, 0x7b, 0xe4, 0x86, 0x2d, 0x56, 0xa6, 0xf0, 0x26, 0x2f, 0xc1, 0x2a, 0xf2, 0xed, 0xf6, 0x25, + 0x63, 0x0c, 0x46, 0x42, 0x97, 0x19, 0xe3, 0x6e, 0x9f, 0x73, 0x16, 0x83, 0xfb, 0xc3, 0x12, 0x9c, + 0xcf, 0xef, 0x3d, 0x9c, 0xbe, 0xac, 0xcf, 0xf1, 0xd9, 0xa4, 0xa8, 0xdb, 0x22, 0x83, 0xf0, 0x40, + 0x32, 0x79, 0x83, 0x57, 0xc8, 0x1d, 0xbc, 0x2d, 0x58, 0x47, 0x46, 0x42, 0x8c, 0x1f, 0xf4, 0xc3, + 0x48, 0xc4, 0x47, 0xa1, 0x6b, 0xac, 0x80, 0xef, 0xf7, 0x75, 0x06, 0x26, 0x2f, 0xc3, 0xaa, 0xdc, + 0xb1, 0xfd, 0xa7, 0x43, 0xf6, 0x61, 0xbe, 0x5d, 0xaf, 0x08, 0x68, 0x0b, 0x81, 0xe4, 0x1c, 0xcc, + 0xbb, 0xa3, 0x11, 0xfb, 0x24, 0xdf, 0xa5, 0xe7, 0xdc, 0xd1, 0x88, 0xe7, 0x16, 0xc2, 0x47, 0xa2, + 0xce, 0x01, 0xba, 0x60, 0x09, 0x1f, 0x52, 0xba, 0x8c, 0x40, 0xee, 0x96, 0x15, 0xb2, 0x7d, 0x81, + 0xd1, 0x4a, 0x94, 0x05, 0x44, 0x01, 0x77, 0x14, 0x23, 0x5c, 0x84, 0xb2, 0x74, 0x06, 0xe0, 0xaf, + 0x62, 0xe8, 0x82, 0x2b, 0x1c, 0x01, 0xde, 0x82, 0x0b, 0xbd, 0x7e, 0x28, 0x46, 0x9b, 0x35, 0x69, + 0x34, 0x12, 0xcf, 0x52, 0x79, 0x18, 0x63, 0xba, 0x21, 0x8a, 0x59, 0x4f, 0x9a, 0xa3, 0x51, 0xfc, + 0x38, 0xf5, 0x92, 0x24, 0x7b, 0xdc, 0xe7, 0xf1, 0xda, 0xb8, 0x43, 0x2c, 0x2e, 0x0e, 0x40, 0xca, + 0x4d, 0x81, 0xb1, 0xad, 0x22, 0xc8, 0x65, 0x12, 0xaf, 0x24, 0x87, 0x2b, 0x0f, 0x85, 0xe4, 0x82, + 0x26, 0x63, 0x1c, 0x34, 0x84, 0x92, 0xb7, 0x61, 0xea, 0x5c, 0x44, 0x09, 0xb7, 0x4c, 0xcf, 0xf1, + 0x72, 0xee, 0xe8, 0x5b, 0xf7, 0x0f, 0x2d, 0x2c, 0x24, 0xef, 0xc1, 0x15, 0x59, 0x41, 0x37, 0x0c, + 0xfb, 0x87, 0x43, 0x47, 0x8e, 0x02, 0xfa, 0x62, 0xa0, 0x94, 0x5b, 0xa6, 0x17, 0x05, 0x8e, 0x89, + 0x28, 0x55, 0x8e, 0x81, 0xcf, 0x1a, 0xc5, 0x6c, 0xfa, 0x1a, 0xac, 0x09, 0x81, 0x5d, 0x08, 0x09, + 0xd8, 0xdb, 0x62, 0x0b, 0x63, 0x37, 0x69, 0x91, 0xaf, 0x0a, 0x04, 0xa8, 0xd6, 0x93, 0x94, 0xff, + 0x45, 0x83, 0x73, 0xb9, 0x12, 0x3f, 0xf9, 0x75, 0xe0, 0xef, 0x0c, 0x23, 0xdf, 0x09, 0xbc, 0x6e, + 0x7f, 0xd4, 0xc7, 0xc0, 0x2d, 0x5c, 0x23, 0x7e, 0x67, 0xd6, 0x5d, 0x01, 0xdf, 0x2c, 0x76, 0x7c, + 0x1a, 0x13, 0x71, 0x55, 0x9d, 0x1e, 0x64, 0xc0, 0x97, 0x3e, 0x80, 0x73, 0xb9, 0xa8, 0x39, 0x2a, + 0xb4, 0x2f, 0xa7, 0x93, 0xa5, 0x4b, 0x1b, 0x67, 0xa6, 0xd1, 0x8a, 0x6a, 0x4d, 0x34, 0xef, 0x4f, + 0xe2, 0xe6, 0x65, 0xee, 0x06, 0xc4, 0xca, 0xee, 0x6c, 0x79, 0xd7, 0x5b, 0x49, 0x34, 0x7d, 0x73, + 0xfb, 0x00, 0xce, 0x89, 0xe5, 0x75, 0x18, 0xb8, 0xa3, 0xa3, 0x84, 0x1d, 0xaf, 0xe8, 0x97, 0xf2, + 0xd8, 0xf1, 0x75, 0xb7, 0xcb, 0xf0, 0x63, 0xae, 0x67, 0xdd, 0x49, 0xa0, 0x68, 0xc3, 0x6f, 0x14, + 0xe4, 0x66, 0x96, 0x53, 0x9d, 0x9c, 0x85, 0xab, 0xe5, 0x2d, 0xdc, 0xd3, 0xef, 0x1a, 0x4d, 0x20, + 0xea, 0x76, 0x2d, 0xe6, 0x3d, 0xf7, 0xc7, 0x93, 0xd7, 0x3c, 0x51, 0x11, 0x65, 0xf3, 0xe3, 0x0b, + 0x81, 0xae, 0x77, 0xb3, 0x20, 0x26, 0x8b, 0xc7, 0xf9, 0xe0, 0xc5, 0xd1, 0x59, 0xe6, 0x80, 0x5a, + 0x8f, 0xbc, 0x00, 0xcb, 0xfc, 0x46, 0x97, 0xda, 0x55, 0x00, 0x61, 0x26, 0xdb, 0x5a, 0x64, 0x1f, + 0x68, 0xf0, 0xc2, 0xb3, 0xfa, 0x90, 0x3c, 0x84, 0xf3, 0xe8, 0x15, 0x14, 0xfa, 0xf1, 0x30, 0x38, + 0x5d, 0xb7, 0x7b, 0xe4, 0x89, 0x59, 0x6b, 0xe4, 0x0e, 0xc6, 0x68, 0x64, 0xdb, 0x2d, 0x65, 0x1c, + 0x46, 0x23, 0x3b, 0xf4, 0xe5, 0xef, 0x0a, 0x23, 0x17, 0x75, 0xe8, 0xc1, 0xe5, 0x19, 0x94, 0xca, + 0xd6, 0xa8, 0xa9, 0x5b, 0xe3, 0x2d, 0xd0, 0x0f, 0xbc, 0x1e, 0xbb, 0xe6, 0x78, 0x3d, 0xac, 0xda, + 0xc7, 0x77, 0xb0, 0xe3, 0x97, 0xe9, 0x6a, 0x0c, 0xb7, 0x43, 0xff, 0xc1, 0x1d, 0xf1, 0x95, 0x63, + 0x79, 0xe8, 0xab, 0xb7, 0x52, 0xf2, 0x3a, 0x9c, 0xcd, 0x04, 0xc5, 0x49, 0xa2, 0x2c, 0xd0, 0x75, + 0x56, 0x94, 0x0e, 0xa1, 0x76, 0x03, 0x96, 0xd5, 0x8d, 0x44, 0x4a, 0x78, 0xbd, 0x64, 0xeb, 0x10, + 0x9f, 0x1b, 0xcb, 0x46, 0xe5, 0x5e, 0x68, 0x4f, 0x73, 0xd7, 0x7a, 0x0d, 0x48, 0x7c, 0x73, 0x89, + 0x37, 0x0a, 0xf1, 0xc1, 0x75, 0x59, 0x12, 0xaf, 0x70, 0xf1, 0xd9, 0x7f, 0x3d, 0x0f, 0x67, 0x73, + 0x6e, 0xc2, 0xe4, 0x35, 0xd0, 0xfb, 0xc3, 0xc8, 0x3b, 0x0c, 0x94, 0xab, 0x19, 0x97, 0xde, 0x0b, + 0x9b, 0x1a, 0x5d, 0x53, 0xca, 0x84, 0x8a, 0x73, 0x9e, 0x67, 0xf9, 0x17, 0xdf, 0x13, 0xbf, 0xd8, + 0x06, 0xe2, 0x06, 0x52, 0x7b, 0xc7, 0xfe, 0x25, 0x35, 0x58, 0xc7, 0x8c, 0x20, 0x61, 0xdf, 0xc7, + 0xc4, 0x22, 0x28, 0x8a, 0x95, 0x52, 0xf7, 0x65, 0xac, 0x49, 0x5b, 0x41, 0x62, 0xb2, 0x18, 0xd5, + 0x47, 0x19, 0x08, 0xf9, 0x06, 0x5c, 0x52, 0x4e, 0x54, 0x27, 0xb3, 0xfa, 0xf0, 0x01, 0x06, 0xbd, + 0xe0, 0xc6, 0x67, 0x6b, 0x35, 0xb5, 0x0e, 0xb7, 0x81, 0x67, 0x11, 0xee, 0xf7, 0x46, 0xce, 0x44, + 0x0a, 0x19, 0x6c, 0x2e, 0x4f, 0x88, 0x70, 0x89, 0x61, 0xd5, 0x7a, 0xa3, 0x4c, 0x36, 0x19, 0x6c, + 0x75, 0x3b, 0x77, 0x85, 0x2e, 0xe0, 0x0a, 0xbd, 0xaa, 0x36, 0x66, 0x62, 0x7d, 0x62, 0x2f, 0xe6, + 0xac, 0xd1, 0x43, 0x58, 0x4f, 0x4e, 0x3a, 0x79, 0x40, 0x97, 0x53, 0x59, 0xff, 0x91, 0xa1, 0x94, + 0x20, 0xf9, 0x89, 0xcd, 0x03, 0x45, 0x4c, 0x10, 0xaa, 0xe1, 0x50, 0xc6, 0x29, 0x82, 0x90, 0xd4, + 0x61, 0xc3, 0x7d, 0x1a, 0xca, 0xdc, 0xa4, 0x61, 0xfc, 0xad, 0xc5, 0xc9, 0x6f, 0x49, 0x7b, 0x1d, + 0x27, 0xa5, 0xc4, 0x7d, 0x1a, 0x8a, 0x94, 0xa5, 0xa1, 0xe4, 0xf6, 0x21, 0x10, 0x2e, 0x76, 0xa4, + 0xea, 0x0d, 0xcf, 0xe2, 0x25, 0x12, 0x9b, 0x4e, 0x50, 0xaa, 0x41, 0xdd, 0xb0, 0x54, 0xad, 0x79, + 0x27, 0xad, 0x63, 0x5d, 0x4a, 0x19, 0x08, 0xb3, 0xbd, 0xcd, 0x8d, 0x97, 0x0a, 0xbe, 0x7a, 0xd5, + 0x54, 0xc0, 0x78, 0xbb, 0xc0, 0xa0, 0x4f, 0x58, 0x8f, 0x63, 0x76, 0x0f, 0x5c, 0x16, 0xb7, 0x0b, + 0x06, 0x66, 0x15, 0x68, 0x24, 0x37, 0xbe, 0x4f, 0x35, 0xd0, 0xb3, 0x9f, 0x22, 0xdf, 0x84, 0x79, + 0x2e, 0x74, 0x88, 0x13, 0xcc, 0xc8, 0xaf, 0x13, 0x1f, 0x69, 0x2e, 0x7f, 0xec, 0x9d, 0xa1, 0x82, + 0x86, 0x7c, 0x15, 0x4a, 0x7e, 0xbf, 0x27, 0x0d, 0x9e, 0x2f, 0xcc, 0xa2, 0x6d, 0xd5, 0xaa, 0x15, + 0x54, 0x92, 0xf6, 0x7b, 0xe2, 0x8a, 0xb2, 0x5d, 0x86, 0x79, 0xde, 0xb1, 0xc6, 0x87, 0x70, 0x79, + 0xc6, 0x07, 0x89, 0x05, 0x6b, 0x19, 0x63, 0xf0, 0x29, 0xed, 0xc4, 0x6e, 0x62, 0x27, 0x0e, 0xa4, + 0xec, 0x3c, 0x80, 0x8b, 0x53, 0x2b, 0x48, 0x6a, 0x53, 0x77, 0x10, 0x0c, 0x4b, 0x92, 0x2d, 0x53, + 0x27, 0x6b, 0x66, 0x77, 0x11, 0x5f, 0xfb, 0xed, 0x02, 0x9c, 0xcd, 0x99, 0x44, 0xc4, 0x80, 0x82, + 0xdc, 0xeb, 0x27, 0x5d, 0x0d, 0xf7, 0xce, 0xd0, 0x42, 0xbf, 0x47, 0xee, 0x02, 0x60, 0x0e, 0xd8, + 0xc0, 0x3b, 0xf4, 0x3e, 0x11, 0xba, 0x04, 0xbc, 0xe1, 0x27, 0xd0, 0x14, 0xcd, 0x22, 0x9a, 0x6f, + 0x18, 0x98, 0xdc, 0x06, 0xf0, 0x3e, 0xe9, 0x0e, 0xc6, 0x3d, 0x2f, 0xbe, 0x9d, 0xe5, 0x7c, 0x46, + 0xa3, 0x8b, 0x02, 0xab, 0xd6, 0x23, 0x7b, 0x40, 0x24, 0x89, 0xf2, 0xd5, 0xd2, 0x33, 0xbe, 0xaa, + 0x51, 0x5d, 0x50, 0x35, 0xe5, 0xc7, 0xc5, 0xe8, 0x2e, 0xc2, 0x42, 0x7f, 0x88, 0x25, 0xec, 0x5f, + 0x81, 0x64, 0xfc, 0xb1, 0x26, 0xfa, 0x23, 0xbd, 0x19, 0x90, 0x0e, 0x08, 0x5f, 0x03, 0xb1, 0x71, + 0xdc, 0x9c, 0xbe, 0x71, 0xa8, 0x26, 0x5c, 0x11, 0x9f, 0x06, 0x01, 0xaa, 0xa1, 0x92, 0x43, 0x3e, + 0x87, 0x71, 0x55, 0x0c, 0xdf, 0x07, 0x70, 0x2e, 0x77, 0x63, 0x67, 0xb7, 0x0d, 0x74, 0x59, 0x4e, + 0x2e, 0xd2, 0x0b, 0xec, 0x37, 0xbb, 0x49, 0xdf, 0x80, 0xe5, 0xc7, 0x9e, 0x1b, 0x78, 0x81, 0xb8, + 0xc6, 0x89, 0xd3, 0x93, 0xc3, 0xd4, 0x5b, 0x5c, 0x2f, 0x7d, 0x8a, 0x09, 0xeb, 0x0c, 0x69, 0xc0, + 0x59, 0xbe, 0xbb, 0xf4, 0x8f, 0x51, 0x73, 0x20, 0x2c, 0x3a, 0x5a, 0xea, 0xee, 0x8c, 0x24, 0x78, + 0x4f, 0xa9, 0x21, 0x16, 0xa7, 0xa6, 0xeb, 0x87, 0x59, 0x10, 0x13, 0x7e, 0xce, 0xe7, 0x63, 0x93, + 0x6d, 0x58, 0xe2, 0xcc, 0xb9, 0x0e, 0x89, 0x9b, 0xe2, 0x6f, 0xcc, 0xfc, 0x42, 0x05, 0x5f, 0xf2, + 0x84, 0xf1, 0xff, 0xec, 0xf2, 0x86, 0x5e, 0x4f, 0xce, 0xb1, 0xea, 0x69, 0x40, 0x97, 0x11, 0x28, + 0x3c, 0x0c, 0x8c, 0xff, 0xa4, 0xc9, 0xa6, 0xa6, 0xd4, 0xd0, 0xec, 0x04, 0x0e, 0xbd, 0xa1, 0xf4, + 0xb6, 0x58, 0xa4, 0xe2, 0xd7, 0x73, 0x4a, 0x05, 0xe4, 0x6d, 0x58, 0x66, 0x6c, 0x0f, 0xc7, 0x43, + 0x7e, 0x32, 0x17, 0x53, 0x71, 0xf3, 0x1a, 0xbc, 0x88, 0x0d, 0xdb, 0xde, 0x19, 0xba, 0x74, 0x9c, + 0xfc, 0x24, 0xaf, 0xc3, 0x62, 0x78, 0x1c, 0x8d, 0xd4, 0xf3, 0x5c, 0x9a, 0xe4, 0xec, 0x46, 0xa7, + 0x2d, 0x48, 0xca, 0x0c, 0x27, 0x51, 0xad, 0x6c, 0xcf, 0x73, 0xa3, 0x9c, 0xf1, 0x2a, 0x2c, 0x29, + 0xbc, 0x59, 0x63, 0xf8, 0xbb, 0x57, 0xd9, 0x18, 0xfe, 0x4b, 0x0c, 0xf6, 0x63, 0x28, 0x4b, 0x96, + 0x84, 0x40, 0xe9, 0xc8, 0x0f, 0xa5, 0x3c, 0x84, 0xff, 0x33, 0x18, 0x5e, 0xf8, 0x58, 0x23, 0xe7, + 0x28, 0xfe, 0x8f, 0x62, 0x37, 0xaa, 0x8f, 0x31, 0xda, 0x32, 0xfa, 0x3a, 0xc7, 0x9a, 0x16, 0x06, + 0xef, 0x0c, 0x42, 0xee, 0x01, 0x2d, 0x75, 0x3e, 0xf1, 0x7d, 0x25, 0xa3, 0xb7, 0x9f, 0x26, 0x5e, + 0xa6, 0xa4, 0xeb, 0xc2, 0xa4, 0x74, 0xcd, 0xe3, 0xa1, 0x09, 0x4a, 0xfe, 0x65, 0x40, 0x18, 0x4a, + 0xd7, 0x8a, 0x00, 0x55, 0x4a, 0x09, 0x50, 0x8a, 0x02, 0x37, 0x19, 0x3d, 0x2e, 0x9c, 0x4b, 0x05, + 0x6e, 0x56, 0xa4, 0xfb, 0x7e, 0x3c, 0x43, 0x52, 0x96, 0x03, 0x72, 0x07, 0xce, 0x71, 0x2d, 0x8a, + 0x48, 0x73, 0x9f, 0x91, 0x25, 0xcf, 0x62, 0x21, 0xcf, 0x92, 0x17, 0xcb, 0x94, 0xcf, 0x56, 0x50, + 0x92, 0x37, 0x60, 0x23, 0xce, 0xb1, 0x1c, 0x3e, 0xe9, 0x8f, 0x78, 0x8e, 0xc9, 0x13, 0xa1, 0xdf, + 0x20, 0xb2, 0xcc, 0x7e, 0xd2, 0x1f, 0x61, 0xbe, 0x49, 0xd9, 0xc3, 0x7f, 0x58, 0x90, 0x6a, 0xef, + 0x6d, 0xdf, 0x8f, 0xc2, 0x28, 0x70, 0x47, 0x29, 0xdb, 0x28, 0x39, 0x86, 0x8b, 0x58, 0xa5, 0x3b, + 0x98, 0xe8, 0xca, 0x0f, 0xa4, 0x99, 0x20, 0x5e, 0x60, 0x4b, 0x77, 0xbe, 0x92, 0xd6, 0x5b, 0x99, + 0x0c, 0xdb, 0x54, 0x91, 0xd9, 0xba, 0x52, 0xb8, 0xee, 0x9d, 0xa1, 0x17, 0x38, 0xcf, 0x09, 0x2c, + 0xb2, 0x97, 0xb3, 0xd7, 0x64, 0x8d, 0xa3, 0xdb, 0xc9, 0xc6, 0x93, 0xe6, 0xaa, 0x6e, 0x49, 0xe4, + 0x5d, 0x58, 0xec, 0xf7, 0xd4, 0xe4, 0xce, 0x59, 0xb3, 0x5c, 0xad, 0xc7, 0xd3, 0x4c, 0x24, 0x3c, + 0xd8, 0xd2, 0xe8, 0x0b, 0xe8, 0xf6, 0x4a, 0x4a, 0xc2, 0x31, 0xb6, 0xa5, 0x86, 0x75, 0x92, 0x8c, + 0xac, 0x26, 0x67, 0x1f, 0x9e, 0x73, 0xb8, 0x0b, 0x24, 0x89, 0x2e, 0xa8, 0xf8, 0x65, 0xfc, 0xff, + 0x70, 0xeb, 0xb4, 0x7d, 0xc4, 0x76, 0x8c, 0x29, 0x1d, 0xbe, 0xc8, 0xe3, 0x63, 0xa7, 0xfb, 0xed, + 0x06, 0xa8, 0x71, 0xfd, 0xfb, 0x72, 0x8a, 0x48, 0xd8, 0x7e, 0xd0, 0x37, 0xfe, 0x47, 0x11, 0x56, + 0xd3, 0x76, 0x73, 0xf2, 0x2a, 0x94, 0x94, 0x8d, 0xf2, 0x42, 0x8e, 0x71, 0x1d, 0xb7, 0x47, 0x44, + 0x3a, 0xd5, 0xc6, 0x48, 0xee, 0xc1, 0x2a, 0x7a, 0xf2, 0xa3, 0x00, 0x17, 0xf5, 0x85, 0x29, 0xe9, + 0xb4, 0x46, 0xa2, 0x65, 0x46, 0xcb, 0x0e, 0x46, 0x56, 0xa8, 0x98, 0x45, 0x4b, 0xd3, 0xcd, 0xa2, + 0xa2, 0x29, 0x53, 0xcc, 0xa2, 0x73, 0x33, 0xcc, 0xa2, 0x09, 0xa5, 0x6a, 0x16, 0x45, 0xe3, 0xf8, + 0xc2, 0x34, 0xe3, 0x78, 0x42, 0xc3, 0x8d, 0xe3, 0x89, 0x59, 0xb3, 0x3c, 0xd5, 0xac, 0x99, 0xd0, + 0x08, 0xb3, 0x66, 0x62, 0x68, 0x5c, 0x9c, 0x6a, 0x68, 0x54, 0x88, 0xb8, 0xa1, 0xf1, 0x25, 0xd1, + 0xb1, 0x81, 0xfb, 0xd4, 0xc1, 0x1e, 0x17, 0x37, 0x23, 0xec, 0x32, 0xea, 0x3e, 0x45, 0x17, 0x5d, + 0x26, 0x98, 0x08, 0xbf, 0x5e, 0xe3, 0x07, 0x99, 0x0d, 0x48, 0x8e, 0xf9, 0xcb, 0xb0, 0xca, 0xcf, + 0x61, 0x11, 0x77, 0x9d, 0x1f, 0xc4, 0x2b, 0x74, 0x45, 0x42, 0xb9, 0x5e, 0xf5, 0x4b, 0xb0, 0x16, + 0xa3, 0x09, 0xd5, 0x22, 0x86, 0x10, 0xa0, 0x31, 0xb5, 0x50, 0x2a, 0xaa, 0xfc, 0x02, 0x11, 0x53, + 0x2e, 0xc5, 0x8f, 0x07, 0x1c, 0x7b, 0x0d, 0x48, 0x82, 0x16, 0xbf, 0x72, 0x28, 0x21, 0xea, 0x7a, + 0x8c, 0x1a, 0x3f, 0x45, 0xf8, 0x3d, 0x2d, 0x63, 0xd0, 0xfb, 0x79, 0x55, 0xff, 0x55, 0x88, 0xbf, + 0xee, 0x08, 0xa3, 0x8c, 0x6c, 0x81, 0x2e, 0x0b, 0xda, 0x02, 0x6e, 0x1c, 0x66, 0xd5, 0x67, 0x3f, + 0xa7, 0x5a, 0x19, 0x7f, 0x58, 0x4a, 0x19, 0x3b, 0xe4, 0x67, 0x98, 0x7c, 0x13, 0xfa, 0x8e, 0x18, + 0x62, 0xb1, 0xfd, 0xde, 0x98, 0x32, 0x4d, 0x85, 0x5f, 0xb7, 0x6d, 0xb7, 0x28, 0x84, 0xa1, 0x2f, + 0xdd, 0xbc, 0x1d, 0xae, 0x16, 0x52, 0xee, 0x7b, 0x92, 0x1d, 0xdf, 0x6b, 0xb7, 0x66, 0xb3, 0x93, + 0xda, 0x64, 0xb6, 0x4a, 0x51, 0x3d, 0x14, 0xff, 0x92, 0x1f, 0xd8, 0x07, 0xb4, 0x0d, 0x86, 0x69, + 0xe6, 0xc5, 0x1c, 0x05, 0xe0, 0x04, 0x73, 0xec, 0x25, 0xe4, 0x8c, 0xaa, 0xe6, 0x50, 0x65, 0x6b, + 0xc1, 0x32, 0x9a, 0x12, 0x24, 0xc3, 0x52, 0x8e, 0x1b, 0xc2, 0x64, 0xe3, 0x2b, 0xb5, 0x06, 0x5d, + 0x62, 0x74, 0x92, 0xcd, 0x11, 0x5c, 0x54, 0x0d, 0x00, 0xe9, 0x4a, 0xce, 0xc9, 0x6c, 0x09, 0x33, + 0x7b, 0x20, 0xb1, 0x13, 0x60, 0x55, 0xcf, 0xbb, 0x69, 0x80, 0xfc, 0x52, 0x17, 0x2e, 0x4e, 0xa8, + 0xbf, 0xe3, 0x2f, 0x71, 0xb7, 0x98, 0x5b, 0x53, 0xbe, 0x94, 0xd1, 0x8b, 0x7b, 0x01, 0x3d, 0x1f, + 0xa6, 0x41, 0xe2, 0x23, 0xf8, 0x8e, 0x62, 0xfa, 0xc0, 0xcf, 0x48, 0x90, 0x99, 0x08, 0x50, 0x05, + 0x55, 0x80, 0x52, 0x8d, 0x0e, 0xc5, 0xb4, 0xd1, 0x61, 0x07, 0x5e, 0x60, 0x7b, 0x9e, 0x98, 0x39, + 0xde, 0xc7, 0x5e, 0x70, 0xe2, 0x0f, 0x31, 0xf0, 0xde, 0x28, 0x5e, 0xfa, 0xdc, 0x4a, 0x72, 0x85, + 0xe1, 0xe1, 0xbc, 0xb0, 0x04, 0x56, 0x03, 0x91, 0x78, 0x40, 0xc9, 0x7f, 0x59, 0x84, 0x17, 0x4f, + 0x31, 0xb9, 0x66, 0xd4, 0xfd, 0x97, 0xd2, 0x62, 0x7e, 0x21, 0xa5, 0x8c, 0x65, 0x4c, 0xc5, 0x09, + 0x76, 0x32, 0xec, 0x4e, 0x11, 0xf2, 0x7f, 0x1d, 0xd6, 0xf8, 0x31, 0xc5, 0x1f, 0x92, 0x1c, 0x8c, + 0x07, 0xa7, 0x38, 0xa7, 0x2e, 0xcb, 0x57, 0xef, 0x19, 0x52, 0x3c, 0xba, 0x70, 0x77, 0xb6, 0x63, + 0x18, 0xe9, 0xc0, 0x12, 0xa2, 0x1d, 0xb8, 0xfd, 0xc1, 0xa9, 0x9e, 0x5f, 0xcb, 0x37, 0xf5, 0x2a, + 0x19, 0x7f, 0xff, 0xc6, 0x00, 0x3b, 0xf8, 0x9b, 0xdc, 0x84, 0xb5, 0xe1, 0xf8, 0x98, 0x09, 0xb0, + 0x7c, 0xe6, 0x0a, 0x7f, 0xdd, 0x39, 0xba, 0x32, 0x1c, 0x1f, 0x9b, 0xa3, 0x11, 0x4e, 0x40, 0x74, + 0xec, 0x5d, 0x67, 0x78, 0x7c, 0x8f, 0x91, 0x98, 0xf3, 0x88, 0xc9, 0x18, 0xf0, 0x5d, 0x46, 0xe0, + 0x6e, 0x00, 0x7f, 0xe6, 0x21, 0x12, 0x8d, 0xf2, 0x1f, 0xc6, 0xff, 0x2a, 0x48, 0x15, 0xf3, 0xf4, + 0x55, 0xfa, 0x8b, 0x21, 0xca, 0x19, 0xa2, 0x5b, 0xa0, 0xb3, 0xae, 0x4f, 0xb6, 0xc0, 0x78, 0x8c, + 0x56, 0x87, 0xe3, 0xe3, 0xb8, 0xef, 0xd4, 0x8e, 0x9f, 0x57, 0x3b, 0xfe, 0x6d, 0xa9, 0x82, 0xce, + 0xdd, 0xcc, 0xa6, 0x77, 0x39, 0x93, 0xef, 0x6e, 0x9e, 0x6e, 0xcb, 0xfa, 0xc5, 0xb8, 0xe5, 0x8c, + 0x5b, 0xc6, 0x1e, 0x3b, 0x37, 0x61, 0x8f, 0xcd, 0x59, 0x7b, 0xf3, 0x79, 0x6b, 0x6f, 0xc2, 0xfa, + 0xbb, 0x90, 0x63, 0xfd, 0xcd, 0x5d, 0xa0, 0xe5, 0x67, 0x2c, 0xd0, 0x45, 0x75, 0x9e, 0xfc, 0xa8, + 0x00, 0x37, 0x9e, 0x79, 0x6e, 0xfc, 0x62, 0xa4, 0x73, 0x46, 0x3a, 0xbf, 0x3f, 0xff, 0x5b, 0x41, + 0xca, 0xcb, 0xe9, 0x0b, 0xf0, 0x07, 0x70, 0x56, 0x5e, 0x80, 0xb9, 0xdc, 0x90, 0x38, 0x49, 0x2c, + 0xdd, 0x79, 0x25, 0xef, 0xea, 0x8b, 0x68, 0x39, 0xd7, 0xd3, 0x75, 0x71, 0xe9, 0x4d, 0xca, 0xff, + 0xdf, 0xb9, 0xee, 0x92, 0x47, 0x70, 0x1e, 0xf3, 0x28, 0x75, 0x55, 0xf7, 0x0e, 0x27, 0xf0, 0x0e, + 0x44, 0xaf, 0xdf, 0x98, 0xb8, 0x1c, 0xf6, 0xbb, 0x4a, 0x75, 0xa8, 0x77, 0xb0, 0x77, 0x86, 0x6e, + 0x84, 0x39, 0xf0, 0xec, 0x4d, 0xfa, 0x8f, 0x35, 0x30, 0x9e, 0xdd, 0x5f, 0xa8, 0xf4, 0xc8, 0x76, + 0xf8, 0x22, 0x5d, 0x72, 0x95, 0xde, 0x7b, 0x11, 0x56, 0x02, 0xef, 0x20, 0xf0, 0xc2, 0xa3, 0x94, + 0x66, 0x72, 0x59, 0x00, 0x65, 0xc7, 0xc8, 0x60, 0xee, 0xcf, 0x75, 0x15, 0x95, 0x44, 0xc6, 0x4e, + 0xac, 0x20, 0xc9, 0x1d, 0x07, 0x36, 0x9b, 0xd4, 0x0a, 0xf2, 0x1f, 0xf7, 0x4a, 0xe5, 0x82, 0x5e, + 0xa4, 0x22, 0xe4, 0xfc, 0x41, 0x7f, 0xe0, 0x19, 0xff, 0x36, 0x96, 0xd4, 0xf2, 0x3a, 0x8f, 0x7c, + 0xa0, 0x3c, 0x67, 0x2b, 0x4e, 0x08, 0xa1, 0x79, 0x24, 0xa7, 0x51, 0x1b, 0xd7, 0xbf, 0x20, 0xb5, + 0xf1, 0x5d, 0xe9, 0x13, 0xcf, 0xce, 0x90, 0x07, 0xb7, 0xc9, 0x2b, 0xb0, 0xc0, 0xdd, 0xe0, 0x65, + 0x75, 0xd7, 0x52, 0xd5, 0x7d, 0x70, 0x9b, 0xca, 0x72, 0xe3, 0xd3, 0xd8, 0xf9, 0x68, 0xa2, 0x11, + 0x0f, 0x6e, 0x93, 0xb7, 0x4f, 0xf7, 0x3c, 0xad, 0x2c, 0x9f, 0xa7, 0xc5, 0x4f, 0xd3, 0xbe, 0x96, + 0x7a, 0x9a, 0xf6, 0xd2, 0xec, 0xde, 0x12, 0x2e, 0x65, 0x3c, 0x8c, 0x77, 0x1c, 0x08, 0xd6, 0xf8, + 0x9b, 0x02, 0x5c, 0x9d, 0x49, 0x41, 0xae, 0x40, 0xd9, 0x6c, 0xd7, 0x3a, 0xc9, 0xf8, 0xb2, 0x35, + 0x23, 0x21, 0x64, 0x17, 0x16, 0xb7, 0xdd, 0xb0, 0xdf, 0x65, 0xd3, 0x38, 0xd7, 0xc3, 0x61, 0x82, + 0x6d, 0x8c, 0xbe, 0x77, 0x86, 0x26, 0xb4, 0xc4, 0x81, 0x75, 0x5c, 0x0b, 0xa9, 0x24, 0xa9, 0xc5, + 0x1c, 0xe5, 0xda, 0x04, 0xc3, 0x09, 0x32, 0xb6, 0xcf, 0x4c, 0x00, 0xc9, 0x63, 0x20, 0xb6, 0xbd, + 0x57, 0xf1, 0x82, 0x48, 0x28, 0x9d, 0xa2, 0x7e, 0xfc, 0xd6, 0xe9, 0x8d, 0x67, 0xf4, 0xdd, 0x04, + 0xdd, 0xde, 0x19, 0x9a, 0xc3, 0x8d, 0xdc, 0x00, 0x35, 0x9b, 0x2f, 0xca, 0x3c, 0xcb, 0x7b, 0x67, + 0x28, 0x8c, 0xe2, 0xac, 0xbe, 0xd9, 0x9d, 0xe0, 0x63, 0x29, 0x62, 0x4e, 0xef, 0xa7, 0xe7, 0xc8, + 0xa2, 0x70, 0x0b, 0xca, 0x6d, 0xe9, 0x73, 0xaa, 0x3c, 0x2b, 0x95, 0xfe, 0xa5, 0x34, 0x2e, 0x35, + 0xfe, 0x81, 0x26, 0x15, 0x71, 0xcf, 0xee, 0x4f, 0x25, 0xcd, 0x6d, 0x6f, 0x76, 0x9a, 0xdb, 0xde, + 0xcf, 0x98, 0xe6, 0xd6, 0xe8, 0xc3, 0x2b, 0xa7, 0xee, 0x7b, 0xf2, 0x4d, 0xd0, 0x31, 0x83, 0xa8, + 0xab, 0x8c, 0x23, 0x5f, 0x82, 0xeb, 0x71, 0x5a, 0x9d, 0x3d, 0x91, 0x76, 0x99, 0xae, 0x75, 0xd3, + 0xd4, 0xc6, 0x1f, 0x89, 0x74, 0x4a, 0xb5, 0x5e, 0x3b, 0x63, 0x4a, 0xff, 0xbc, 0x2f, 0x91, 0xad, + 0xd4, 0x7a, 0x7c, 0x51, 0x49, 0xd7, 0x3e, 0xf9, 0xad, 0xe9, 0x0f, 0x92, 0x95, 0xc5, 0xf9, 0x4f, + 0x8b, 0x70, 0x65, 0x16, 0x39, 0x31, 0x41, 0xb7, 0x78, 0xb0, 0x42, 0xf1, 0x06, 0xcc, 0x0f, 0xd4, + 0xf4, 0x7e, 0x3c, 0x90, 0xa1, 0xd3, 0x8b, 0x0b, 0xe9, 0x04, 0x3a, 0x1b, 0x5b, 0x0e, 0x8b, 0x9f, + 0xd9, 0xe2, 0xd8, 0x0a, 0x52, 0x36, 0xb6, 0xb2, 0x98, 0xbc, 0x08, 0xf3, 0x66, 0xc5, 0x4e, 0xd2, + 0x10, 0xe3, 0x7b, 0x38, 0xb7, 0x1b, 0xe2, 0x4b, 0x2b, 0x51, 0x44, 0x7e, 0x6d, 0x32, 0xf3, 0xb6, + 0xc8, 0x3f, 0x7c, 0x59, 0xe9, 0x90, 0x89, 0x4c, 0x67, 0x58, 0xdf, 0x24, 0x33, 0x97, 0x48, 0x76, + 0x43, 0x27, 0xb3, 0x78, 0x1b, 0x30, 0xdf, 0x0e, 0xbc, 0xd0, 0x8b, 0xd4, 0xb7, 0x6a, 0x23, 0x84, + 0x50, 0x51, 0x22, 0x5e, 0x92, 0xb9, 0x27, 0x3c, 0x70, 0xd8, 0xbc, 0x1a, 0x20, 0x12, 0x9f, 0x9e, + 0x31, 0x30, 0x55, 0x50, 0x18, 0x41, 0xdd, 0x1d, 0x0f, 0xbb, 0x47, 0xfb, 0xb4, 0x2e, 0x84, 0x55, + 0x4e, 0x30, 0x40, 0x28, 0x6b, 0x60, 0x48, 0x15, 0x14, 0xe3, 0xb7, 0x34, 0xd8, 0xc8, 0x6b, 0x07, + 0xb9, 0x02, 0xa5, 0x61, 0x6e, 0x92, 0xf1, 0x21, 0x8f, 0x77, 0xb4, 0x84, 0x16, 0xd7, 0x03, 0x3f, + 0x38, 0x76, 0x23, 0xf5, 0x45, 0x9f, 0x02, 0xa6, 0x68, 0x21, 0xde, 0xc1, 0xff, 0xc9, 0x75, 0x79, + 0x2a, 0x15, 0x27, 0xd2, 0x92, 0xe3, 0x1f, 0xc3, 0x04, 0xa8, 0xf5, 0xda, 0xad, 0x11, 0xcf, 0xb4, + 0xf5, 0x26, 0x94, 0x58, 0xb5, 0x32, 0xb3, 0x97, 0xcd, 0x1f, 0xb3, 0x51, 0x17, 0x48, 0xbc, 0x56, + 0xa1, 0x7b, 0x3c, 0xa0, 0x88, 0x6c, 0x3c, 0x84, 0xd5, 0x34, 0x06, 0xb1, 0xd2, 0xc9, 0x16, 0x96, + 0xee, 0xe8, 0x82, 0xd3, 0xb6, 0xef, 0xf3, 0x57, 0xe5, 0xdb, 0x17, 0x7f, 0xfc, 0xd9, 0x75, 0x60, + 0x3f, 0x39, 0x4d, 0x5e, 0x32, 0x06, 0xe3, 0x77, 0x0a, 0xb0, 0x91, 0x04, 0xb2, 0x92, 0x6b, 0xe8, + 0x6f, 0x6d, 0x54, 0x15, 0x33, 0x15, 0xf5, 0x43, 0x8a, 0x96, 0x93, 0x0d, 0x9c, 0x11, 0x6c, 0x60, + 0x17, 0x36, 0xa7, 0xe1, 0x93, 0x57, 0x61, 0x11, 0xe3, 0xa9, 0x8e, 0xdc, 0xae, 0xa7, 0x6e, 0xb3, + 0x43, 0x09, 0xa4, 0x49, 0xb9, 0xf1, 0x23, 0x0d, 0x2e, 0x89, 0xb7, 0xd0, 0x0d, 0xb7, 0x3f, 0x44, + 0x03, 0x5f, 0xd7, 0xfb, 0x62, 0xa2, 0x02, 0xed, 0xa6, 0xf6, 0xb1, 0x97, 0xd3, 0x4f, 0xde, 0x27, + 0xbe, 0x36, 0xbd, 0xb5, 0xe4, 0x15, 0x8c, 0x11, 0x2c, 0x7c, 0x05, 0x4b, 0x3c, 0x0a, 0xdb, 0x90, + 0x01, 0xd4, 0x28, 0x6c, 0x88, 0x61, 0xfc, 0x1d, 0xb8, 0x36, 0xfb, 0x03, 0xe4, 0x57, 0x61, 0x05, + 0x93, 0xe0, 0xee, 0x8f, 0x0e, 0x03, 0xb7, 0xe7, 0x49, 0xd5, 0xaf, 0xb4, 0x50, 0xa8, 0x65, 0x3c, + 0xe4, 0xb1, 0x88, 0x0a, 0x76, 0x88, 0xe9, 0x75, 0x05, 0x51, 0x2a, 0xe0, 0x80, 0xca, 0xcd, 0xf8, + 0x8e, 0x06, 0x64, 0x92, 0x07, 0xf9, 0x2a, 0x2c, 0xef, 0x77, 0x2a, 0x76, 0xe4, 0x06, 0xd1, 0x9e, + 0x3f, 0x0e, 0x44, 0xbc, 0x61, 0x1e, 0x24, 0x2a, 0xea, 0x3a, 0xdc, 0x94, 0x7b, 0xe4, 0x8f, 0x03, + 0x9a, 0xc2, 0xc3, 0xf4, 0xa9, 0x9e, 0xf7, 0xa4, 0xe7, 0x9e, 0xa4, 0xd3, 0xa7, 0x0a, 0x58, 0x2a, + 0x7d, 0xaa, 0x80, 0x19, 0xdf, 0xd7, 0xe0, 0xb2, 0x7c, 0x04, 0xd3, 0xcb, 0xa9, 0x4b, 0x05, 0x43, + 0x21, 0x06, 0x32, 0x85, 0xc5, 0x2c, 0x21, 0x7e, 0x5d, 0x46, 0x0b, 0xc5, 0x0a, 0xa2, 0x34, 0xcf, + 0x69, 0xc9, 0x2f, 0x41, 0xc9, 0x8e, 0xfc, 0xd1, 0x29, 0xc2, 0x85, 0xea, 0xf1, 0x88, 0x46, 0xfe, + 0x08, 0x59, 0x20, 0xa5, 0xe1, 0xc1, 0x86, 0x5a, 0x39, 0x59, 0x63, 0xd2, 0x80, 0x05, 0x11, 0x6b, + 0x3a, 0xe3, 0x5d, 0x39, 0xa3, 0x4d, 0xdb, 0x6b, 0x32, 0x26, 0xa9, 0x48, 0xb6, 0x40, 0x25, 0x0f, + 0xe3, 0x1f, 0x6a, 0xb0, 0xc4, 0x04, 0x1b, 0xd4, 0x03, 0x7c, 0xde, 0x29, 0x9d, 0x16, 0x95, 0xa5, + 0xb3, 0x70, 0xcc, 0xfe, 0x54, 0xa7, 0xf1, 0x5b, 0xb0, 0x96, 0x21, 0x20, 0x06, 0x46, 0xa3, 0x1b, + 0xf4, 0xbb, 0x2e, 0xcf, 0xc6, 0xc8, 0x1d, 0x6d, 0x53, 0x30, 0xe3, 0xef, 0x69, 0xb0, 0xd1, 0x7a, + 0x12, 0xb9, 0xdc, 0xe3, 0x82, 0x8e, 0x07, 0x72, 0xbd, 0x33, 0x61, 0x4d, 0xbe, 0xa6, 0xe2, 0x91, + 0xb2, 0xb8, 0xb0, 0x26, 0x60, 0x34, 0x2e, 0x25, 0x7b, 0x50, 0x16, 0xe7, 0x4b, 0x28, 0xf2, 0x22, + 0x5c, 0x53, 0x94, 0x14, 0x09, 0x63, 0x81, 0xc4, 0x5a, 0x82, 0x5b, 0x98, 0xa0, 0xa1, 0x31, 0xb5, + 0xf1, 0x57, 0x1a, 0x5c, 0x98, 0x42, 0x43, 0xde, 0x81, 0x39, 0x8c, 0xe2, 0x21, 0x46, 0xef, 0xca, + 0x94, 0x4f, 0x44, 0xdd, 0xa3, 0x07, 0xb7, 0xf9, 0x41, 0x74, 0xcc, 0x7e, 0x50, 0x4e, 0x45, 0x3e, + 0x80, 0x45, 0xb3, 0xd7, 0x13, 0x17, 0xb8, 0x42, 0xea, 0x02, 0x37, 0xe5, 0x8b, 0xaf, 0xc7, 0xf8, + 0xfc, 0x02, 0xc7, 0xdf, 0x93, 0xf7, 0x7a, 0x8e, 0x88, 0x50, 0x92, 0xf0, 0xbb, 0xf4, 0x4d, 0x58, + 0x4d, 0x23, 0x3f, 0x57, 0x50, 0x85, 0x4f, 0x35, 0xd0, 0xd3, 0x75, 0xf8, 0xf9, 0x44, 0x53, 0xcd, + 0x1b, 0xe6, 0x67, 0x4c, 0xaa, 0x7f, 0x54, 0x80, 0x73, 0xb9, 0x3d, 0x4c, 0x5e, 0x83, 0x79, 0x73, + 0x34, 0xaa, 0x55, 0xc5, 0xac, 0x12, 0x12, 0x12, 0xda, 0x2b, 0x52, 0xf7, 0x5b, 0x8e, 0x44, 0xde, + 0x84, 0x32, 0x77, 0xec, 0xa9, 0xca, 0x0d, 0x07, 0xc3, 0x43, 0x0a, 0xaf, 0xa3, 0x74, 0x86, 0x02, + 0x89, 0x48, 0x76, 0x60, 0x55, 0x04, 0x56, 0x44, 0x2f, 0xaf, 0x38, 0x19, 0x16, 0x3a, 0xc6, 0x49, + 0x23, 0x08, 0xf7, 0x0f, 0x4b, 0xed, 0x9d, 0x19, 0x2a, 0x52, 0x07, 0x1d, 0x79, 0xaa, 0x9c, 0x78, + 0x9a, 0x04, 0xc5, 0xb1, 0x72, 0x0a, 0xaf, 0x09, 0xca, 0x78, 0xb8, 0xf8, 0xe3, 0x86, 0x63, 0x6f, + 0x18, 0xfd, 0xfc, 0x86, 0x2b, 0xf9, 0xc6, 0xa9, 0x86, 0xeb, 0x7b, 0x25, 0xbe, 0x98, 0xb3, 0x64, + 0x4c, 0xa2, 0x51, 0x72, 0xdf, 0xa0, 0x44, 0xc3, 0xee, 0x67, 0x22, 0x74, 0x60, 0x15, 0x16, 0x78, + 0x48, 0x47, 0xb9, 0x32, 0xae, 0xe6, 0x56, 0x81, 0xe3, 0x3c, 0xb8, 0xcd, 0xc5, 0x17, 0x1e, 0x4e, + 0x24, 0xa4, 0x92, 0x94, 0x3c, 0x80, 0xa5, 0xca, 0xc0, 0x73, 0x87, 0xe3, 0x51, 0xe7, 0x74, 0x5e, + 0x05, 0x9b, 0xa2, 0x2d, 0xcb, 0x5d, 0x4e, 0x86, 0xde, 0x08, 0xb8, 0x93, 0xab, 0x8c, 0x48, 0x27, + 0x8e, 0x30, 0x50, 0x42, 0x0d, 0xe8, 0x1b, 0x33, 0xfa, 0x27, 0x0b, 0x44, 0xba, 0x74, 0xf8, 0x0c, + 0x11, 0x82, 0xc0, 0x81, 0xd5, 0xba, 0x1b, 0x46, 0x9d, 0xc0, 0x1d, 0x86, 0x18, 0x5e, 0xfe, 0x14, + 0xa1, 0x72, 0x2f, 0x8b, 0x0a, 0x73, 0xcd, 0x68, 0x14, 0x93, 0x72, 0xcd, 0x68, 0x9a, 0x1d, 0x93, + 0x97, 0x76, 0xfa, 0x43, 0x77, 0xd0, 0xff, 0xb6, 0x0c, 0xc4, 0xc2, 0xe5, 0xa5, 0x03, 0x09, 0xa4, + 0x49, 0xb9, 0xf1, 0x2b, 0x13, 0xe3, 0xc6, 0x6b, 0xb9, 0x04, 0x0b, 0x22, 0x4c, 0x17, 0x0f, 0x5b, + 0xd5, 0xb6, 0x9a, 0xd5, 0x5a, 0x73, 0x57, 0xd7, 0xc8, 0x2a, 0x40, 0x9b, 0xb6, 0x2a, 0x96, 0x6d, + 0xb3, 0xdf, 0x05, 0xf6, 0x5b, 0xc4, 0xb4, 0xda, 0xd9, 0xaf, 0xeb, 0x45, 0x25, 0xac, 0x55, 0xc9, + 0xf8, 0xa1, 0x06, 0xe7, 0xf3, 0x87, 0x92, 0x74, 0x00, 0x03, 0x9b, 0x09, 0xff, 0x92, 0xaf, 0xce, + 0x1c, 0xf7, 0x5c, 0x70, 0x36, 0x40, 0x5a, 0xc4, 0x03, 0x6f, 0x15, 0xa4, 0xd9, 0x92, 0x47, 0xf2, + 0xe8, 0xf7, 0x68, 0xa1, 0xdf, 0x33, 0x2a, 0xb0, 0x39, 0x8d, 0x47, 0xba, 0xa9, 0x6b, 0xb0, 0x64, + 0xb6, 0xdb, 0xf5, 0x5a, 0xc5, 0xec, 0xd4, 0x5a, 0x4d, 0x5d, 0x23, 0x8b, 0x30, 0xb7, 0x4b, 0x5b, + 0xfb, 0x6d, 0xbd, 0x60, 0xfc, 0x67, 0x0d, 0x56, 0x6a, 0x89, 0xe7, 0xeb, 0xe7, 0x5d, 0x7c, 0x5f, + 0x4f, 0x2d, 0xbe, 0xcd, 0x38, 0x04, 0x60, 0xfc, 0x81, 0x19, 0x12, 0xe4, 0x76, 0x1c, 0xa7, 0xa5, + 0x98, 0xf2, 0x13, 0x51, 0xa9, 0x65, 0x04, 0x8c, 0x38, 0x7f, 0x57, 0x3a, 0x8e, 0x8b, 0xb2, 0x7a, + 0xff, 0x55, 0x11, 0xd6, 0x27, 0xbe, 0x4b, 0x6c, 0x58, 0x30, 0x1f, 0xda, 0xad, 0x5a, 0xb5, 0x22, + 0x5a, 0x77, 0x3d, 0xf1, 0x96, 0xc4, 0x74, 0xb4, 0x13, 0x35, 0xe5, 0xa1, 0x77, 0x9e, 0x86, 0x8e, + 0xdf, 0xef, 0x75, 0x53, 0xee, 0xba, 0x92, 0x13, 0x9e, 0x86, 0xdf, 0x1e, 0x07, 0xe8, 0x81, 0x2c, + 0x5a, 0x1e, 0x3b, 0x61, 0x4a, 0xf8, 0x24, 0x63, 0xf4, 0xc9, 0x75, 0x59, 0xf9, 0x24, 0xeb, 0x84, + 0x1f, 0x69, 0xc2, 0xfc, 0x6e, 0x3f, 0xda, 0x1b, 0x3f, 0x16, 0xbd, 0x72, 0x2d, 0x49, 0x4e, 0xba, + 0x37, 0x7e, 0x3c, 0xc9, 0x16, 0x35, 0xa3, 0xfc, 0xd9, 0x7d, 0x8a, 0xa5, 0xe0, 0x42, 0xee, 0xc3, + 0x9c, 0xf9, 0xd0, 0xa6, 0xa6, 0x58, 0xa1, 0x8a, 0x3f, 0x2a, 0x35, 0xa7, 0x70, 0x63, 0xad, 0x0f, + 0xdc, 0x14, 0x37, 0xce, 0x23, 0x1b, 0x7a, 0xa4, 0xf4, 0x5c, 0xa1, 0x47, 0xb6, 0x57, 0x60, 0x49, + 0x5c, 0xea, 0xf0, 0xbe, 0xf4, 0x09, 0x9c, 0xcd, 0x19, 0x6a, 0xe2, 0xa2, 0xd7, 0x3b, 0xda, 0xd2, + 0xcd, 0xe1, 0xc9, 0xd3, 0x23, 0x2f, 0xf0, 0x26, 0xc7, 0x2e, 0x5d, 0x77, 0x39, 0x4b, 0x72, 0x6b, + 0x4f, 0x27, 0xd8, 0x19, 0x7f, 0xa2, 0xc1, 0xe6, 0xb4, 0x09, 0xc0, 0x6e, 0xa8, 0xe9, 0xe0, 0x66, + 0xe7, 0xe3, 0x24, 0x7c, 0x69, 0x6f, 0x75, 0x89, 0x46, 0xde, 0x83, 0x25, 0xee, 0xd1, 0x68, 0xbf, + 0xb9, 0x4f, 0x6b, 0x62, 0xe5, 0x5e, 0xfd, 0xe9, 0x67, 0xd7, 0x2f, 0x08, 0x27, 0xc8, 0xf0, 0x4d, + 0x67, 0x1c, 0xf4, 0x13, 0xd2, 0x4d, 0x8d, 0xaa, 0x14, 0xec, 0x42, 0xe1, 0x8e, 0x7b, 0x7d, 0x4f, + 0x5e, 0xa7, 0x64, 0x00, 0x28, 0x01, 0x53, 0x8f, 0x77, 0x09, 0x33, 0xbe, 0xab, 0xc1, 0xa5, 0xe9, + 0xb3, 0x8d, 0x89, 0x0c, 0x1d, 0xee, 0x18, 0x2a, 0x43, 0x30, 0xa1, 0xc8, 0x10, 0x7b, 0x8f, 0xaa, + 0x3c, 0x25, 0x22, 0x23, 0x12, 0xca, 0x3e, 0xa9, 0x2f, 0x42, 0xa2, 0x58, 0x17, 0xa8, 0x12, 0x49, + 0x44, 0xe3, 0x11, 0x5c, 0x98, 0x32, 0x37, 0xc9, 0xbb, 0xb9, 0xa9, 0x3d, 0xf1, 0x65, 0xbe, 0x1a, + 0x7a, 0x21, 0x95, 0x23, 0x5a, 0x81, 0x1b, 0xff, 0x91, 0xbb, 0x42, 0xe7, 0x4c, 0x54, 0x26, 0xdd, + 0x60, 0x2a, 0x49, 0x73, 0xd8, 0x3d, 0xf2, 0x83, 0x64, 0xb0, 0x50, 0xba, 0x89, 0x58, 0x89, 0xe3, + 0x62, 0x51, 0x66, 0xd0, 0x32, 0x54, 0xc4, 0x87, 0xf5, 0x76, 0xe0, 0x1f, 0xf4, 0xf9, 0x5b, 0x52, + 0x7e, 0x29, 0x15, 0x6b, 0xfa, 0x96, 0x32, 0xdd, 0xd4, 0xe9, 0x33, 0x81, 0x1f, 0xe7, 0x8b, 0x62, + 0x60, 0xee, 0x71, 0xd3, 0xc5, 0x02, 0x3a, 0xc9, 0xdb, 0xf8, 0x71, 0x01, 0x6e, 0x3c, 0x93, 0xe3, + 0x69, 0x33, 0x62, 0x7e, 0x05, 0x40, 0xd0, 0xb2, 0x1e, 0x50, 0x54, 0x4e, 0xb2, 0x32, 0x6e, 0x30, + 0xa4, 0x0a, 0x0a, 0x79, 0x02, 0x57, 0xe5, 0xaf, 0x6e, 0xd7, 0x1b, 0x45, 0x21, 0xab, 0x87, 0x08, + 0xb1, 0x1c, 0x07, 0x97, 0x2a, 0x6f, 0xbf, 0xfc, 0xd3, 0xcf, 0xae, 0xdf, 0x88, 0x79, 0x70, 0x4c, + 0xfe, 0x60, 0x43, 0x46, 0x6b, 0x46, 0xc5, 0xd7, 0x6c, 0x5e, 0xe4, 0x66, 0xb2, 0x92, 0x4a, 0x89, + 0xc2, 0x5a, 0xae, 0xa4, 0x64, 0xfd, 0xec, 0x01, 0x11, 0x8c, 0x18, 0xd9, 0x8e, 0x6a, 0xa1, 0xe6, + 0xbb, 0xa6, 0xac, 0x09, 0x57, 0xa4, 0xf1, 0x72, 0x9a, 0x43, 0x63, 0xfc, 0x1e, 0x5f, 0xd8, 0xb9, + 0xbb, 0x03, 0x79, 0x0a, 0x6b, 0x4c, 0xca, 0x50, 0x3a, 0x5b, 0xec, 0x2b, 0x77, 0x9e, 0x3d, 0xd0, + 0xb5, 0x48, 0x84, 0x2e, 0xb1, 0xc7, 0xc7, 0xc7, 0x6e, 0x70, 0xb2, 0x7d, 0x51, 0xa6, 0x76, 0x44, + 0x69, 0x46, 0x1d, 0x7b, 0x9a, 0xfd, 0x8a, 0xf1, 0x97, 0x05, 0x78, 0xf5, 0x39, 0x78, 0x93, 0x36, + 0x2c, 0xe2, 0x7d, 0x1e, 0x25, 0xc1, 0x67, 0xeb, 0x03, 0xce, 0x8b, 0xb3, 0x51, 0x84, 0x2e, 0x89, + 0xe5, 0xc0, 0x84, 0x09, 0xb9, 0xc7, 0xa6, 0x53, 0x0f, 0xf9, 0x3d, 0x5b, 0x37, 0xb0, 0x21, 0xd5, + 0x64, 0xde, 0xb0, 0x97, 0x70, 0x93, 0x0c, 0x94, 0xf0, 0x6a, 0xc5, 0xa9, 0xe1, 0xd5, 0xde, 0x82, + 0x65, 0x4b, 0x71, 0x9b, 0x15, 0xc3, 0x8f, 0x96, 0x82, 0x94, 0x8f, 0x2d, 0x4d, 0xa1, 0x91, 0x6f, + 0xc0, 0x2a, 0xf7, 0x09, 0x10, 0xbd, 0xc3, 0x3d, 0xd6, 0xe6, 0x44, 0x0e, 0x08, 0x2c, 0x91, 0x5d, + 0x1d, 0xd2, 0x0c, 0x2a, 0x5b, 0x58, 0xe7, 0x99, 0x54, 0x32, 0xf0, 0xc2, 0xd0, 0x1c, 0x47, 0x47, + 0xec, 0xd4, 0xe1, 0xf7, 0x74, 0xf2, 0x36, 0xcc, 0x1f, 0x3d, 0x9f, 0x15, 0x8e, 0xa3, 0x13, 0x02, + 0x28, 0xe9, 0xcb, 0xe0, 0x11, 0xec, 0x7f, 0xf2, 0x35, 0x98, 0x43, 0x25, 0xb3, 0x10, 0xa8, 0xa5, + 0x22, 0x24, 0xff, 0xd3, 0xa8, 0x82, 0xa6, 0x9c, 0x80, 0xad, 0xd6, 0x24, 0x67, 0xa5, 0x38, 0x8f, + 0xa5, 0xf2, 0x35, 0x4e, 0x5b, 0x49, 0x17, 0x8f, 0x0f, 0x5c, 0x91, 0x08, 0x72, 0x0b, 0xd6, 0xe5, + 0xde, 0x3b, 0x92, 0xf9, 0x14, 0x84, 0x37, 0xcd, 0x9a, 0x08, 0x70, 0x33, 0x92, 0x39, 0x15, 0x5e, + 0x82, 0xd5, 0x30, 0x3c, 0x72, 0x44, 0x7c, 0xb4, 0x27, 0x32, 0x55, 0x13, 0x5d, 0x0e, 0xc3, 0x23, + 0x1e, 0x28, 0xed, 0xbe, 0x77, 0xc2, 0xb0, 0xf0, 0x6d, 0x42, 0x82, 0x55, 0xe6, 0x58, 0xd1, 0x20, + 0x8c, 0xb1, 0x44, 0x68, 0x3f, 0x48, 0xb0, 0x8c, 0xff, 0x5a, 0x80, 0xc5, 0x87, 0xec, 0xf2, 0x8a, + 0x2a, 0xd9, 0xd9, 0x2a, 0xde, 0x3b, 0xb0, 0x54, 0xf7, 0x5d, 0x61, 0x78, 0x17, 0x21, 0x14, 0xf8, + 0x63, 0xa6, 0x81, 0xef, 0x4a, 0x1b, 0x7e, 0x48, 0x55, 0xa4, 0x67, 0xc4, 0xb6, 0xbb, 0x07, 0xf3, + 0x7c, 0x85, 0x0b, 0x6b, 0x83, 0x54, 0x5f, 0xc4, 0x35, 0x7a, 0x9d, 0x17, 0x2b, 0xb6, 0x62, 0xbe, + 0x4b, 0xa8, 0x77, 0x69, 0xf1, 0x70, 0x49, 0x51, 0x40, 0xcf, 0x9d, 0x4e, 0x01, 0xad, 0xc4, 0xc5, + 0x9f, 0x3f, 0x4d, 0x5c, 0xfc, 0x4b, 0x77, 0x61, 0x49, 0xa9, 0xcf, 0x73, 0x69, 0x33, 0x7e, 0xa3, + 0x00, 0x2b, 0xd8, 0xaa, 0x78, 0xd7, 0xfa, 0xdb, 0xa9, 0x4e, 0xff, 0x7a, 0x4a, 0x9d, 0xbe, 0xa9, + 0x8e, 0x97, 0x70, 0xe5, 0x99, 0xae, 0x47, 0xbf, 0x07, 0xeb, 0x13, 0x88, 0xe4, 0x2d, 0x98, 0x63, + 0xd5, 0x97, 0xea, 0x47, 0x3d, 0x3b, 0x03, 0x92, 0x1c, 0x4a, 0xac, 0xe1, 0x21, 0xe5, 0xd8, 0xc6, + 0xff, 0xd4, 0x60, 0x59, 0xa4, 0x48, 0x1d, 0x1e, 0xf8, 0xcf, 0xec, 0xce, 0x9b, 0xd9, 0xee, 0xe4, + 0x91, 0x5a, 0x45, 0x77, 0xfe, 0x9f, 0xee, 0xc4, 0xbb, 0xa9, 0x4e, 0xbc, 0x10, 0x67, 0x54, 0x90, + 0xcd, 0x99, 0xd1, 0x87, 0x3f, 0xc0, 0x1c, 0x43, 0x69, 0x44, 0xf2, 0x6b, 0xb0, 0xd8, 0xf4, 0x9e, + 0xa6, 0xb4, 0x78, 0x37, 0xa7, 0x30, 0x7d, 0x3d, 0x46, 0xe4, 0x6b, 0x8a, 0x3f, 0x28, 0xf4, 0x9e, + 0x3a, 0x13, 0x3e, 0x18, 0x09, 0xcb, 0x4b, 0xdf, 0x84, 0xd5, 0x34, 0xd9, 0xf3, 0x4c, 0x7d, 0x11, + 0xef, 0x09, 0x83, 0x0f, 0xff, 0x56, 0x11, 0x20, 0x09, 0x95, 0xc3, 0x16, 0x60, 0xca, 0xc9, 0x4b, + 0x1a, 0x40, 0x11, 0xa4, 0xce, 0x71, 0xe9, 0xfb, 0x75, 0x53, 0x18, 0xea, 0x0a, 0xd3, 0x33, 0x5e, + 0x0c, 0x65, 0xb8, 0x2f, 0xee, 0x1f, 0x3d, 0x70, 0xf9, 0x5b, 0xa2, 0xe2, 0xf6, 0x4b, 0x98, 0xe0, + 0x28, 0x86, 0xa6, 0xd2, 0x11, 0x94, 0xab, 0x63, 0x91, 0x58, 0x0d, 0x23, 0xb4, 0x54, 0x19, 0xc2, + 0x44, 0xf8, 0xa9, 0xd2, 0xf3, 0x85, 0x9f, 0x6a, 0xc3, 0x62, 0x7f, 0xf8, 0xb1, 0x37, 0x8c, 0xfc, + 0xe0, 0x04, 0xad, 0x93, 0x89, 0xd9, 0x83, 0x75, 0x41, 0x4d, 0x96, 0xf1, 0x71, 0x40, 0x49, 0x33, + 0xc6, 0x57, 0x87, 0x21, 0x06, 0xc6, 0x41, 0x73, 0xe6, 0xf4, 0x79, 0x1e, 0x3a, 0xe7, 0x5e, 0xa9, + 0x5c, 0xd6, 0x17, 0xef, 0x95, 0xca, 0x8b, 0x3a, 0x50, 0xc5, 0xb5, 0x20, 0x76, 0x1d, 0x50, 0xac, + 0xfd, 0x69, 0x4b, 0xbe, 0xf1, 0xd7, 0x05, 0x20, 0x93, 0xd5, 0x20, 0x5f, 0x87, 0x25, 0xbe, 0xc1, + 0x3a, 0x41, 0xf8, 0x91, 0x78, 0x50, 0xc9, 0x5f, 0x41, 0x2b, 0x60, 0x35, 0x84, 0x33, 0x07, 0xd3, + 0xf0, 0xa3, 0x01, 0xf9, 0x55, 0x38, 0x8b, 0xdd, 0x3b, 0xf2, 0x82, 0xbe, 0xdf, 0x73, 0x30, 0xdf, + 0x8e, 0x3b, 0xc0, 0xb1, 0x2a, 0x6e, 0xbf, 0xf6, 0xd3, 0xcf, 0xae, 0x5f, 0xcd, 0x29, 0x9e, 0x32, + 0x0c, 0x18, 0xf1, 0xa6, 0x8d, 0x98, 0x6d, 0x8e, 0x48, 0x3a, 0xa0, 0xab, 0xf4, 0x07, 0xe3, 0xc1, + 0x40, 0x8c, 0xec, 0x16, 0xbb, 0x1a, 0x64, 0xcb, 0xa6, 0x30, 0x5e, 0x4d, 0x18, 0xef, 0x8c, 0x07, + 0x03, 0xf2, 0x36, 0x80, 0x3f, 0x74, 0x8e, 0xfb, 0x61, 0xc8, 0x6d, 0xde, 0xf1, 0x23, 0xdb, 0x04, + 0xaa, 0x0e, 0x86, 0x3f, 0x6c, 0x70, 0x20, 0xf9, 0xff, 0x00, 0x23, 0x3f, 0x62, 0x48, 0x54, 0x21, + 0xcd, 0xf0, 0xdb, 0x82, 0x04, 0xa6, 0x63, 0x85, 0x1d, 0x7a, 0x76, 0xff, 0xdb, 0xf2, 0x2d, 0xf2, + 0xb7, 0x60, 0x5d, 0x48, 0x46, 0x0f, 0xfb, 0xd1, 0x91, 0xd0, 0xb8, 0x7c, 0x1e, 0x75, 0x8d, 0xa2, + 0x2e, 0xf9, 0xb3, 0x12, 0x80, 0xf9, 0xd0, 0x96, 0xd1, 0xc6, 0x5f, 0x81, 0xb9, 0x0e, 0x63, 0x23, + 0xf4, 0xd1, 0x28, 0x70, 0x21, 0x5f, 0xd5, 0x9a, 0x87, 0x18, 0x6c, 0x35, 0x52, 0x7c, 0x36, 0x28, + 0x75, 0xd1, 0xb8, 0x1a, 0xf9, 0x4b, 0xc2, 0x54, 0xb6, 0x27, 0x81, 0x45, 0xea, 0x00, 0x49, 0xfc, + 0x6f, 0xa1, 0xd5, 0x58, 0x4f, 0x02, 0xe9, 0x8a, 0x02, 0x91, 0xc5, 0x32, 0x79, 0x1b, 0xae, 0x4e, + 0x9f, 0x04, 0x8d, 0xdc, 0x87, 0x52, 0xc7, 0x8d, 0x43, 0x53, 0x4d, 0x89, 0x8a, 0x8e, 0x19, 0xd2, + 0x53, 0x91, 0xd1, 0x57, 0x23, 0xf7, 0x50, 0xad, 0x1d, 0x32, 0x21, 0x16, 0xcc, 0xb7, 0xdd, 0xc0, + 0x3d, 0x0e, 0xa7, 0x65, 0xd3, 0xe0, 0xa5, 0x32, 0x87, 0x16, 0x02, 0x55, 0x99, 0x82, 0x17, 0x93, + 0x3b, 0x50, 0xb4, 0xed, 0x86, 0x78, 0xf4, 0xb0, 0x92, 0xdc, 0x26, 0x6c, 0xbb, 0xc1, 0x85, 0xde, + 0x30, 0x3c, 0x56, 0xc8, 0x18, 0x32, 0xf9, 0x06, 0x2c, 0x29, 0x97, 0x14, 0x11, 0x45, 0x17, 0xfb, + 0x40, 0x79, 0x98, 0xae, 0x6e, 0x1a, 0x0a, 0x36, 0xa9, 0x83, 0x7e, 0x7f, 0xfc, 0xd8, 0x33, 0x47, + 0x23, 0x8c, 0x89, 0xf3, 0xb1, 0x17, 0x70, 0x41, 0xae, 0x9c, 0xa4, 0x9f, 0xc2, 0x57, 0xa0, 0x3d, + 0x59, 0xaa, 0xaa, 0x43, 0xb2, 0x94, 0xa4, 0x0d, 0xeb, 0xb6, 0x17, 0x8d, 0x47, 0xdc, 0x53, 0x71, + 0x87, 0x5f, 0xa7, 0x79, 0xcc, 0x5d, 0xcc, 0xd4, 0x13, 0xb2, 0x42, 0xe9, 0x1e, 0x7a, 0x30, 0x71, + 0xa5, 0x9e, 0x24, 0x36, 0x3c, 0x75, 0xc8, 0xd5, 0x7b, 0xa0, 0x36, 0xeb, 0x1e, 0xf8, 0x95, 0x9c, + 0xb8, 0xf0, 0x78, 0x9b, 0x55, 0xe2, 0xc2, 0xa7, 0xa2, 0xc1, 0x7f, 0xbf, 0xa4, 0xa4, 0x26, 0x11, + 0x63, 0xf1, 0x0e, 0xc0, 0x3d, 0xbf, 0x3f, 0x6c, 0x78, 0xd1, 0x91, 0xdf, 0x53, 0xc2, 0x0e, 0x2c, + 0x7d, 0xe8, 0xf7, 0x87, 0xce, 0x31, 0x82, 0xff, 0xfa, 0xb3, 0xeb, 0x0a, 0x12, 0x55, 0xfe, 0x27, + 0x5f, 0x86, 0x45, 0xf6, 0xab, 0x93, 0xf8, 0x5b, 0x72, 0xd3, 0x15, 0x52, 0xf3, 0xa4, 0xa0, 0x09, + 0x02, 0xb9, 0x8b, 0x69, 0x70, 0xfb, 0xa3, 0x48, 0x11, 0x5e, 0x65, 0xce, 0xdb, 0xfe, 0x28, 0xca, + 0xc6, 0x1c, 0x50, 0x90, 0xc9, 0x5e, 0x5c, 0x75, 0x99, 0xb9, 0x5a, 0x64, 0xdb, 0x15, 0x81, 0x0b, + 0xb0, 0xc8, 0x91, 0x69, 0x6e, 0xd4, 0xc0, 0x05, 0x19, 0x32, 0xac, 0x84, 0xbd, 0x57, 0x15, 0xba, + 0x8b, 0x39, 0xa5, 0x12, 0xe1, 0x51, 0x4f, 0x68, 0x22, 0x52, 0x95, 0x88, 0x91, 0xc9, 0x36, 0xac, + 0x71, 0xa9, 0x1f, 0xf3, 0x5a, 0x63, 0xca, 0xd5, 0xf9, 0x64, 0x6f, 0xe3, 0x19, 0xb0, 0xd9, 0xbd, + 0x43, 0xfd, 0x7c, 0x86, 0x80, 0xec, 0xc0, 0x1c, 0xea, 0xa1, 0xc4, 0xab, 0xc2, 0xcb, 0xaa, 0x26, + 0x34, 0xbb, 0x8e, 0x70, 0x5f, 0x41, 0x1d, 0xa8, 0xba, 0xaf, 0x20, 0x2a, 0xf9, 0x65, 0x00, 0x6b, + 0x18, 0xf8, 0x83, 0x01, 0x26, 0x62, 0x2a, 0xa7, 0xe2, 0x9b, 0x08, 0x3e, 0xc8, 0x25, 0x41, 0x12, + 0x49, 0x03, 0xf0, 0xb7, 0x93, 0x49, 0xd7, 0xa4, 0xf0, 0x32, 0x6a, 0x30, 0xcf, 0x17, 0x23, 0x26, + 0x35, 0x13, 0xa9, 0x5f, 0x95, 0x94, 0x58, 0x3c, 0xa9, 0x99, 0x80, 0x4f, 0x26, 0x35, 0x53, 0x08, + 0x8c, 0xfb, 0xb0, 0x91, 0xd7, 0xb0, 0x94, 0xe6, 0x4c, 0x3b, 0xad, 0xe6, 0xec, 0x0f, 0x8a, 0xb0, + 0x8c, 0xdc, 0xe4, 0x2e, 0x6c, 0xc2, 0x8a, 0x3d, 0x7e, 0x1c, 0x47, 0xfc, 0x96, 0xbb, 0x31, 0xd6, + 0x2f, 0x54, 0x0b, 0x54, 0x57, 0x87, 0x14, 0x05, 0xb1, 0x60, 0x55, 0x9e, 0x04, 0xbb, 0xf2, 0x05, + 0x5e, 0x9c, 0x4f, 0x4c, 0x3e, 0x4c, 0x14, 0x7e, 0xf9, 0xaa, 0x5a, 0x2c, 0x4d, 0x94, 0x9c, 0x07, + 0xc5, 0xe7, 0x39, 0x0f, 0x4a, 0xa7, 0x3a, 0x0f, 0x3e, 0x80, 0x65, 0xf9, 0x35, 0xdc, 0xc9, 0xe7, + 0x3e, 0xdf, 0x4e, 0x9e, 0x62, 0x46, 0xea, 0xf1, 0x8e, 0x3e, 0x3f, 0x73, 0x47, 0x47, 0xff, 0x11, + 0xb9, 0xca, 0x46, 0x08, 0x9b, 0xdc, 0xd8, 0x8d, 0xbf, 0x28, 0x02, 0xec, 0x56, 0xda, 0x3f, 0xc3, + 0x29, 0xf9, 0x16, 0x2c, 0xd6, 0x7d, 0xe9, 0x3a, 0xa0, 0xd8, 0x6c, 0x07, 0x12, 0xa8, 0x8a, 0x0b, + 0x31, 0x66, 0x7c, 0xba, 0x15, 0xbf, 0x88, 0xd3, 0xed, 0x2e, 0x6a, 0x07, 0x3f, 0xf4, 0xba, 0x51, + 0x92, 0xda, 0x1e, 0x97, 0x8c, 0x0c, 0xd8, 0x99, 0x36, 0x1d, 0x2b, 0xc8, 0x6c, 0x77, 0x12, 0x5e, + 0x89, 0x32, 0x0a, 0x8f, 0xd0, 0xc7, 0xe1, 0xee, 0x24, 0x43, 0x19, 0xc9, 0xc0, 0x3e, 0xea, 0xf6, + 0x90, 0x21, 0xfb, 0x62, 0x07, 0x84, 0xbc, 0x1f, 0xbb, 0x91, 0x2f, 0xcc, 0xea, 0x21, 0x63, 0xa2, + 0x87, 0xa6, 0x3a, 0x8f, 0x1b, 0x3f, 0xd4, 0xd4, 0x64, 0x8e, 0x3f, 0xc3, 0x50, 0x7f, 0x0d, 0x20, + 0xf6, 0xdd, 0x92, 0x63, 0x1d, 0x07, 0x60, 0xe1, 0x50, 0xb5, 0x97, 0x13, 0x5c, 0xa5, 0x35, 0xc5, + 0x2f, 0xaa, 0x35, 0x1d, 0x58, 0x6a, 0x3d, 0x89, 0xdc, 0xc4, 0xd9, 0x0f, 0xec, 0x58, 0x92, 0xc5, + 0x9d, 0xa9, 0x88, 0xca, 0xdd, 0x73, 0x8a, 0x1c, 0x3c, 0x45, 0x04, 0x56, 0x08, 0x8d, 0xbf, 0xd1, + 0x60, 0x4d, 0x8d, 0xc1, 0x76, 0x32, 0xec, 0x92, 0x77, 0x79, 0x6e, 0x19, 0x2d, 0x75, 0x65, 0x51, + 0x90, 0xd8, 0x96, 0x7b, 0x32, 0xec, 0x72, 0x01, 0xc8, 0x7d, 0xaa, 0x56, 0x96, 0x11, 0x92, 0xc7, + 0xb0, 0xdc, 0xf6, 0x07, 0x03, 0x26, 0xd6, 0x04, 0x1f, 0x8b, 0x0b, 0x00, 0x63, 0x94, 0x55, 0x4c, + 0xca, 0x0a, 0x6d, 0xbf, 0x28, 0xee, 0xb9, 0x17, 0x46, 0x6c, 0xbf, 0xef, 0x0b, 0xba, 0x84, 0xed, + 0xa7, 0xf8, 0xc4, 0x5e, 0xe5, 0x99, 0x9c, 0x4d, 0xe9, 0xa4, 0x84, 0x6a, 0x2d, 0x59, 0x31, 0xd6, + 0x73, 0xc6, 0xd9, 0x64, 0xfc, 0x5d, 0x0d, 0x5e, 0x98, 0x6c, 0x5a, 0x65, 0xe0, 0x8f, 0x7b, 0x9d, + 0xc0, 0xed, 0x0f, 0xea, 0xfe, 0x61, 0xc8, 0x73, 0x72, 0x1c, 0x26, 0x76, 0x0e, 0x91, 0x93, 0xe3, + 0xb0, 0x9f, 0xcd, 0xc9, 0x81, 0x31, 0x37, 0xde, 0x84, 0xb2, 0xfd, 0xbe, 0xfd, 0xfe, 0xd8, 0x93, + 0x77, 0x61, 0xbe, 0x3f, 0x84, 0x1f, 0x85, 0xce, 0x47, 0x0c, 0xa8, 0x9e, 0x18, 0x12, 0xd1, 0xf8, + 0x77, 0x05, 0x20, 0x93, 0xf5, 0x50, 0xb7, 0x60, 0xed, 0xff, 0x82, 0x48, 0x9e, 0x11, 0x65, 0x4b, + 0xcf, 0x25, 0xca, 0x7e, 0x04, 0x7a, 0x97, 0xf5, 0xa3, 0x13, 0xb1, 0x8e, 0x74, 0x06, 0x7e, 0x7c, + 0x22, 0x7c, 0x69, 0xea, 0x9c, 0x4a, 0x77, 0x3c, 0xdf, 0x93, 0xb2, 0x4c, 0xd4, 0xc3, 0xad, 0x9b, + 0xc2, 0x37, 0x7e, 0x5f, 0x83, 0x8d, 0xbc, 0x29, 0xc0, 0x0e, 0x4f, 0xf5, 0x34, 0x8d, 0xcf, 0x72, + 0x3c, 0x3c, 0xd5, 0x03, 0x38, 0x7d, 0xa2, 0x67, 0x88, 0xb2, 0xfd, 0x51, 0x78, 0x9e, 0xfe, 0x30, + 0xfe, 0xb2, 0x08, 0xcb, 0xdc, 0xb0, 0xbf, 0xe7, 0xb9, 0x83, 0xe8, 0x88, 0x0d, 0xae, 0x4c, 0xb2, + 0xab, 0xb8, 0x7f, 0xcf, 0xc8, 0xae, 0x7b, 0x07, 0xca, 0x6d, 0xb6, 0x78, 0xba, 0xfe, 0x40, 0x55, + 0x0a, 0x8e, 0x04, 0x4c, 0x9d, 0x58, 0x12, 0x8f, 0xcd, 0xdd, 0x94, 0x52, 0x9f, 0xe7, 0x75, 0x44, + 0x88, 0x3a, 0x77, 0x85, 0x7a, 0xff, 0x13, 0x38, 0x9b, 0xf8, 0x6a, 0xc4, 0x86, 0x83, 0x53, 0xbc, + 0x5f, 0xdb, 0x12, 0x56, 0x93, 0x6b, 0x89, 0xfb, 0x07, 0x5a, 0x18, 0xb0, 0x34, 0x93, 0x68, 0x26, + 0xef, 0x13, 0xe4, 0x3e, 0xe8, 0x09, 0x58, 0x64, 0xc0, 0xe1, 0x12, 0x2f, 0x46, 0xa7, 0x53, 0xd8, + 0x4e, 0x24, 0xc3, 0x99, 0x20, 0x64, 0x87, 0x5c, 0x02, 0xb3, 0x92, 0xa7, 0xaa, 0xd2, 0x88, 0x18, + 0xf3, 0x42, 0x9b, 0x85, 0x7a, 0xc8, 0x65, 0xc8, 0xd8, 0x18, 0x49, 0x53, 0xc7, 0x42, 0x32, 0x46, + 0xc2, 0xc8, 0xa1, 0x8e, 0x91, 0xc0, 0xda, 0xfa, 0x5d, 0x0d, 0xd6, 0x6a, 0x66, 0x43, 0x24, 0x69, + 0xe5, 0xbd, 0x7a, 0x03, 0xae, 0xd6, 0xcc, 0x86, 0xd3, 0x6e, 0xd5, 0x6b, 0x95, 0x47, 0x4e, 0x6e, + 0xee, 0xb5, 0xab, 0x70, 0x71, 0x12, 0x25, 0x71, 0x6b, 0xb9, 0x02, 0x9b, 0x93, 0xc5, 0x32, 0x3f, + 0x5b, 0x3e, 0xb1, 0x4c, 0xe5, 0x56, 0xdc, 0x7a, 0x0f, 0xd6, 0x64, 0x2e, 0xb2, 0x4e, 0xdd, 0xc6, + 0x6c, 0xa7, 0x6b, 0xb0, 0xf4, 0xc0, 0xa2, 0xb5, 0x9d, 0x47, 0xce, 0xce, 0x7e, 0xbd, 0xae, 0x9f, + 0x21, 0x2b, 0xb0, 0x28, 0x00, 0x15, 0x53, 0xd7, 0xc8, 0x32, 0x94, 0x6b, 0x4d, 0xdb, 0xaa, 0xec, + 0x53, 0x4b, 0x2f, 0x6c, 0xfd, 0x73, 0x0d, 0x56, 0xf6, 0x47, 0x3d, 0x37, 0xf2, 0x02, 0xd1, 0xa2, + 0x6b, 0x70, 0x69, 0xbf, 0x5d, 0x35, 0x3b, 0x16, 0xcd, 0x6f, 0xce, 0x39, 0x58, 0xcf, 0x94, 0xb7, + 0xee, 0xeb, 0x1a, 0xb9, 0x0c, 0x17, 0x32, 0xe0, 0x6a, 0xcd, 0x36, 0xb7, 0x79, 0x2b, 0x2e, 0xc2, + 0xb9, 0x4c, 0x61, 0xbb, 0xd6, 0x6c, 0x5a, 0x55, 0xbd, 0xc8, 0x1a, 0x38, 0xf1, 0x39, 0x6a, 0x99, + 0x55, 0x46, 0xaa, 0x97, 0xb6, 0xde, 0x83, 0xd5, 0x76, 0xfc, 0x56, 0x07, 0xbd, 0x66, 0x16, 0xa0, + 0x48, 0xcd, 0x87, 0xfa, 0x19, 0x02, 0x30, 0xdf, 0xbe, 0x5f, 0xb1, 0x6f, 0xdf, 0xd6, 0x35, 0xb2, + 0x04, 0x0b, 0xbb, 0x95, 0xb6, 0x73, 0xbf, 0x61, 0xeb, 0x05, 0xf6, 0xc3, 0x7c, 0x68, 0xe3, 0x8f, + 0xe2, 0xd6, 0x1b, 0x68, 0x2b, 0xfe, 0xe4, 0xa4, 0xde, 0x0f, 0x23, 0x6f, 0xe8, 0x05, 0xd8, 0x47, + 0xcb, 0x50, 0xb6, 0x3d, 0x26, 0xaf, 0x44, 0x1e, 0xef, 0xa0, 0xc6, 0x78, 0x10, 0xf5, 0x47, 0x03, + 0xef, 0x13, 0x5d, 0xdb, 0xba, 0x0b, 0x6b, 0xd4, 0x1f, 0x47, 0xfd, 0xe1, 0xa1, 0x1d, 0x31, 0x8c, + 0xc3, 0x13, 0x6c, 0x73, 0xd3, 0x6c, 0x6c, 0xd7, 0x76, 0xf7, 0x5b, 0xfb, 0xb6, 0xd3, 0x30, 0x3b, + 0x95, 0x3d, 0xee, 0xb3, 0xd3, 0x68, 0xd9, 0x1d, 0x87, 0x5a, 0x15, 0xab, 0xd9, 0xd1, 0xb5, 0xad, + 0xdf, 0x41, 0x0d, 0x6e, 0xd7, 0x1f, 0xf6, 0x76, 0xdc, 0x6e, 0xe4, 0x07, 0x58, 0x61, 0x03, 0xae, + 0xd9, 0x56, 0xa5, 0xd5, 0xac, 0x3a, 0x3b, 0x66, 0xa5, 0xd3, 0xa2, 0x79, 0xc9, 0x09, 0x2f, 0xc1, + 0xf9, 0x1c, 0x9c, 0x56, 0xa7, 0xad, 0x6b, 0xe4, 0x3a, 0x5c, 0xce, 0x29, 0x7b, 0x68, 0x6d, 0x9b, + 0xfb, 0x9d, 0xbd, 0xa6, 0x5e, 0x98, 0x42, 0x6c, 0xdb, 0x2d, 0xbd, 0xb8, 0xf5, 0xf7, 0x35, 0x58, + 0xdd, 0x0f, 0xc5, 0x13, 0xc1, 0x7d, 0x34, 0xd8, 0xbd, 0x00, 0x57, 0xf6, 0x6d, 0x8b, 0x3a, 0x9d, + 0xd6, 0x7d, 0xab, 0xe9, 0xec, 0xdb, 0xe6, 0x6e, 0xb6, 0x36, 0xd7, 0xe1, 0xb2, 0x82, 0x41, 0xad, + 0x4a, 0xeb, 0x81, 0x45, 0x9d, 0xb6, 0x69, 0xdb, 0x0f, 0x5b, 0xb4, 0xaa, 0x6b, 0xec, 0x8b, 0x39, + 0x08, 0x8d, 0x1d, 0x93, 0xd7, 0x26, 0x55, 0xd6, 0xb4, 0x1e, 0x9a, 0x75, 0x67, 0xbb, 0xd5, 0xd1, + 0x8b, 0x5b, 0x0d, 0x76, 0x8b, 0xc0, 0x14, 0x61, 0xfc, 0x99, 0x47, 0x19, 0x4a, 0xcd, 0x56, 0xd3, + 0xca, 0x7a, 0x7a, 0x2d, 0x43, 0xd9, 0x6c, 0xb7, 0x69, 0xeb, 0x01, 0x4e, 0x1e, 0x80, 0xf9, 0xaa, + 0xd5, 0xac, 0xe1, 0x6c, 0x59, 0x86, 0x72, 0x9b, 0xb6, 0x1a, 0xad, 0x8e, 0x55, 0xd5, 0x4b, 0x5b, + 0x54, 0x1e, 0xac, 0x92, 0x69, 0xd7, 0xe7, 0x6e, 0x55, 0x55, 0x6b, 0xc7, 0xdc, 0xaf, 0x77, 0xc4, + 0x10, 0x3d, 0x72, 0xa8, 0xf5, 0xfe, 0xbe, 0x65, 0x77, 0x6c, 0x5d, 0x23, 0x3a, 0x2c, 0x37, 0x2d, + 0xab, 0x6a, 0x3b, 0xd4, 0x7a, 0x50, 0xb3, 0x1e, 0xea, 0x05, 0xc6, 0x93, 0xff, 0xcf, 0xbe, 0xb0, + 0xf5, 0x7d, 0x0d, 0x08, 0x4f, 0xaf, 0x26, 0x73, 0x76, 0xe3, 0x8c, 0xb9, 0x06, 0x97, 0xf6, 0xd8, + 0x50, 0x63, 0xd3, 0x1a, 0xad, 0x6a, 0xb6, 0xcb, 0xce, 0x03, 0xc9, 0x94, 0xb7, 0x76, 0x76, 0x70, + 0x59, 0x9c, 0xcd, 0xc0, 0xab, 0xb4, 0xd5, 0xd6, 0x0b, 0x97, 0x0a, 0x65, 0x8d, 0x5c, 0x98, 0x28, + 0xbc, 0x6f, 0x59, 0x6d, 0xbd, 0xc8, 0x86, 0x28, 0x53, 0x20, 0x97, 0x2c, 0x27, 0x2f, 0x6d, 0x7d, + 0x57, 0x83, 0xf3, 0xbc, 0x9a, 0x72, 0xfd, 0xc7, 0x55, 0xbd, 0x02, 0x9b, 0x22, 0x69, 0x64, 0x5e, + 0x45, 0x37, 0x40, 0x4f, 0x95, 0xf2, 0x6a, 0x9e, 0x83, 0xf5, 0x14, 0x14, 0xeb, 0x51, 0x60, 0xbb, + 0x5b, 0x0a, 0xbc, 0x6d, 0xd9, 0x1d, 0xc7, 0xda, 0xd9, 0x69, 0xd1, 0x0e, 0xaf, 0x48, 0x71, 0xcb, + 0x80, 0xf5, 0x8a, 0x17, 0x44, 0xd6, 0x27, 0x91, 0x37, 0x0c, 0xfb, 0xfe, 0x10, 0xab, 0xb0, 0x02, + 0x8b, 0xd6, 0x2f, 0x77, 0xac, 0xa6, 0x5d, 0x6b, 0x35, 0xf5, 0x33, 0x5b, 0x57, 0x32, 0x38, 0x72, + 0x1d, 0xdb, 0xf6, 0x9e, 0x7e, 0x66, 0xcb, 0x85, 0x15, 0xf9, 0x0a, 0x8e, 0xcf, 0x8a, 0x6b, 0x70, + 0x49, 0xce, 0x35, 0xdc, 0x13, 0xb2, 0x4d, 0xd8, 0x84, 0x8d, 0xc9, 0x72, 0xab, 0xa3, 0x6b, 0x6c, + 0x14, 0x32, 0x25, 0x0c, 0x5e, 0xd8, 0xfa, 0x4d, 0x0d, 0x56, 0x62, 0x63, 0x2d, 0x1a, 0x83, 0xae, + 0xc3, 0xe5, 0xc6, 0x8e, 0xe9, 0x54, 0xad, 0x07, 0xb5, 0x8a, 0xe5, 0xdc, 0xaf, 0x35, 0xab, 0x99, + 0x8f, 0x5c, 0x84, 0x73, 0x39, 0x08, 0xf8, 0x95, 0x4d, 0xd8, 0xc8, 0x16, 0x75, 0xd8, 0x52, 0x2d, + 0xb0, 0xae, 0xcf, 0x96, 0xc4, 0xeb, 0xb4, 0xb8, 0xf5, 0x00, 0x56, 0x6d, 0xb3, 0x51, 0xdf, 0xf1, + 0x83, 0xae, 0x67, 0x8e, 0xa3, 0xa3, 0x21, 0xdb, 0x34, 0x77, 0x5a, 0xb4, 0x62, 0x39, 0x88, 0x92, + 0xa9, 0xc1, 0x59, 0x58, 0x53, 0x0b, 0x1f, 0x59, 0x6c, 0xfa, 0x12, 0x58, 0x55, 0x81, 0xcd, 0x96, + 0x5e, 0xd8, 0xfa, 0x15, 0x58, 0x16, 0x1e, 0x1c, 0xbc, 0xff, 0x2e, 0xc0, 0x59, 0xf5, 0x77, 0xdb, + 0x1b, 0xf6, 0xfa, 0xc3, 0x43, 0xfd, 0x4c, 0xb6, 0x80, 0x8e, 0x87, 0x43, 0x56, 0x80, 0xeb, 0x59, + 0x2d, 0xe8, 0x78, 0xc1, 0x71, 0x7f, 0xe8, 0x46, 0x5e, 0x4f, 0x2f, 0x6c, 0xbd, 0x0e, 0x2b, 0xa9, + 0x84, 0x81, 0x6c, 0xe0, 0xea, 0x2d, 0xb1, 0x01, 0x37, 0xac, 0x6a, 0x6d, 0xbf, 0xa1, 0xcf, 0xb1, + 0x95, 0xbc, 0x57, 0xdb, 0xdd, 0xd3, 0x61, 0xeb, 0x1f, 0x6b, 0xb0, 0x2a, 0xd2, 0x80, 0x37, 0x76, + 0x4c, 0x39, 0xd4, 0x6c, 0x9a, 0xf1, 0x34, 0xa4, 0x96, 0x6d, 0x73, 0x07, 0xc7, 0x2b, 0xb0, 0x29, + 0x7e, 0x38, 0x66, 0xb3, 0xea, 0xec, 0x99, 0xb4, 0xfa, 0xd0, 0xa4, 0x6c, 0xee, 0x3d, 0xd2, 0x0b, + 0xb8, 0xa0, 0x14, 0x88, 0xd3, 0x69, 0xed, 0x57, 0xf6, 0xf4, 0x22, 0x9b, 0xbf, 0x29, 0x78, 0xbb, + 0xd6, 0xd4, 0x4b, 0xb8, 0x3c, 0x27, 0xb0, 0x91, 0x2d, 0x2b, 0x9f, 0xdb, 0xfa, 0x89, 0x06, 0x17, + 0xec, 0xfe, 0xe1, 0xd0, 0x8d, 0xc6, 0x81, 0x67, 0x0e, 0x0e, 0xfd, 0xa0, 0x1f, 0x1d, 0x1d, 0xdb, + 0xe3, 0x7e, 0xe4, 0x91, 0x57, 0xe0, 0x65, 0xbb, 0xb6, 0xdb, 0x34, 0x3b, 0x6c, 0x79, 0x99, 0xf5, + 0xdd, 0x16, 0xad, 0x75, 0xf6, 0x1a, 0x8e, 0xbd, 0x5f, 0x9b, 0x98, 0x79, 0x2f, 0xc1, 0x0b, 0xd3, + 0x51, 0xeb, 0xd6, 0xae, 0x59, 0x79, 0xa4, 0x6b, 0xb3, 0x19, 0x6e, 0x9b, 0x75, 0xb3, 0x59, 0xb1, + 0xaa, 0xce, 0x83, 0xdb, 0x7a, 0x81, 0xbc, 0x0c, 0x37, 0xa6, 0xa3, 0xee, 0xd4, 0xda, 0x36, 0x43, + 0x2b, 0xce, 0xfe, 0xee, 0x9e, 0xdd, 0x60, 0x58, 0xa5, 0xad, 0xdf, 0xd7, 0x60, 0x73, 0x5a, 0xd8, + 0x6f, 0x72, 0x13, 0x0c, 0xab, 0xd9, 0xa1, 0x66, 0xad, 0xea, 0x54, 0xa8, 0x55, 0xb5, 0x9a, 0x9d, + 0x9a, 0x59, 0xb7, 0x1d, 0xbb, 0xb5, 0xcf, 0x66, 0x53, 0xe2, 0x87, 0xfa, 0x22, 0x5c, 0x9f, 0x81, + 0xd7, 0xaa, 0x55, 0x2b, 0xba, 0x46, 0x6e, 0xc3, 0x6b, 0x33, 0x90, 0xec, 0x47, 0x76, 0xc7, 0x6a, + 0xa8, 0x25, 0x7a, 0x01, 0x37, 0xac, 0xfc, 0x88, 0xc7, 0xac, 0x75, 0x58, 0x32, 0xbb, 0x62, 0x37, + 0xe0, 0xea, 0x54, 0x2c, 0x51, 0xad, 0x17, 0xe1, 0xfa, 0x54, 0x14, 0x5e, 0x29, 0xbd, 0xb0, 0xf5, + 0x01, 0x5c, 0x9a, 0x1e, 0x75, 0x93, 0x9d, 0x17, 0xe9, 0x21, 0x2f, 0x43, 0xa9, 0xca, 0x8e, 0xa8, + 0x54, 0xda, 0x5c, 0x36, 0x3b, 0xa9, 0x55, 0x6b, 0xb4, 0xd9, 0x46, 0x28, 0x0e, 0x17, 0x3c, 0x3d, + 0xbe, 0xa3, 0x81, 0x9e, 0x0d, 0x55, 0x37, 0xe1, 0xd2, 0x4c, 0xf7, 0x9b, 0x4d, 0x7e, 0xd0, 0xad, + 0xc1, 0x52, 0xab, 0xb3, 0x67, 0x51, 0x91, 0x91, 0x18, 0x53, 0x10, 0xef, 0x37, 0xd9, 0xd2, 0x6e, + 0xd1, 0xda, 0xb7, 0xf0, 0xc4, 0xdb, 0x84, 0x0d, 0xbb, 0x6e, 0x56, 0xee, 0x3b, 0xcd, 0x56, 0xc7, + 0xa9, 0x35, 0x9d, 0xca, 0x9e, 0xd9, 0x6c, 0x5a, 0x75, 0x1d, 0xd8, 0x9e, 0xdd, 0xba, 0xdf, 0x31, + 0x9d, 0x4a, 0xab, 0xb9, 0x53, 0xdb, 0x15, 0x2c, 0x36, 0x70, 0x16, 0x4c, 0x0b, 0x95, 0x41, 0xbe, + 0x0c, 0xb7, 0x90, 0xa6, 0x5d, 0xdf, 0xdf, 0xad, 0x35, 0x1d, 0xfb, 0x51, 0xb3, 0x22, 0xc5, 0xae, + 0xca, 0xe4, 0x59, 0x71, 0x0b, 0x5e, 0x9a, 0x89, 0x9d, 0xa4, 0x14, 0xbe, 0x09, 0xc6, 0x4c, 0x4c, + 0xd1, 0xbe, 0xad, 0x1f, 0x69, 0x70, 0x79, 0x86, 0xd3, 0x0d, 0x79, 0x0d, 0x5e, 0xd9, 0xb3, 0xcc, + 0x6a, 0xdd, 0xb2, 0x6d, 0xdc, 0xe1, 0xd8, 0x20, 0x72, 0x8f, 0xe8, 0xdc, 0x93, 0xe0, 0x15, 0x78, + 0x79, 0x36, 0x7a, 0x22, 0x53, 0xdc, 0x82, 0x97, 0x66, 0xa3, 0x0a, 0x19, 0xa3, 0x40, 0xb6, 0xe0, + 0xe6, 0x6c, 0xcc, 0x58, 0x36, 0x29, 0x6e, 0xfd, 0xb6, 0x06, 0xe7, 0xf3, 0xf5, 0xdc, 0xac, 0x6e, + 0xb5, 0xa6, 0xdd, 0x31, 0xeb, 0x75, 0xa7, 0x6d, 0x52, 0xb3, 0xe1, 0x58, 0x4d, 0xda, 0xaa, 0xd7, + 0xf3, 0xce, 0xe4, 0x97, 0xe0, 0x85, 0xe9, 0xa8, 0x76, 0x85, 0xd6, 0xda, 0xec, 0xd8, 0x31, 0xe0, + 0xda, 0x74, 0x2c, 0xab, 0x56, 0xb1, 0xf4, 0xc2, 0xf6, 0x3b, 0x7f, 0xfa, 0x17, 0xd7, 0xce, 0xfc, + 0xe9, 0x4f, 0xae, 0x69, 0xff, 0xe1, 0x27, 0xd7, 0xb4, 0x3f, 0xff, 0xc9, 0x35, 0xed, 0x5b, 0xaf, + 0x9e, 0x2e, 0x1b, 0x3f, 0xde, 0xda, 0x1f, 0xcf, 0xe3, 0xf5, 0xef, 0xcd, 0xff, 0x1d, 0x00, 0x00, + 0xff, 0xff, 0xb7, 0xa3, 0xb5, 0x2e, 0x1d, 0xe7, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -31077,6 +31181,18 @@ func (m *AppSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.MCP != nil { + { + size, err := m.MCP.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x7a + } if m.UseAnyProxyPublicAddr { i-- if m.UseAnyProxyPublicAddr { @@ -31232,6 +31348,56 @@ func (m *AppSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *MCP) 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 *MCP) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MCP) 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.RunAsHostUser) > 0 { + i -= len(m.RunAsHostUser) + copy(dAtA[i:], m.RunAsHostUser) + i = encodeVarintTypes(dAtA, i, uint64(len(m.RunAsHostUser))) + i-- + dAtA[i] = 0x1a + } + if len(m.Args) > 0 { + for iNdEx := len(m.Args) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Args[iNdEx]) + copy(dAtA[i:], m.Args[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Args[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Command) > 0 { + i -= len(m.Command) + copy(dAtA[i:], m.Command) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Command))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *Rewrite) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -31955,12 +32121,12 @@ func (m *ProvisionTokenV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n75, err75 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err75 != nil { - return 0, err75 + n76, err76 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err76 != nil { + return 0, err76 } - i -= n75 - i = encodeVarintTypes(dAtA, i, uint64(n75)) + i -= n76 + i = encodeVarintTypes(dAtA, i, uint64(n76)) i-- dAtA[i] = 0x12 if len(m.Roles) > 0 { @@ -33856,12 +34022,12 @@ func (m *ProvisionTokenSpecV2BoundKeypair) MarshalToSizedBuffer(dAtA []byte) (in copy(dAtA[i:], m.XXX_unrecognized) } if m.RotateAfter != nil { - n97, err97 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.RotateAfter, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.RotateAfter):]) - if err97 != nil { - return 0, err97 + n98, err98 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.RotateAfter, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.RotateAfter):]) + if err98 != nil { + return 0, err98 } - i -= n97 - i = encodeVarintTypes(dAtA, i, uint64(n97)) + i -= n98 + i = encodeVarintTypes(dAtA, i, uint64(n98)) i-- dAtA[i] = 0x1a } @@ -33917,12 +34083,12 @@ func (m *ProvisionTokenSpecV2BoundKeypair_OnboardingSpec) MarshalToSizedBuffer(d copy(dAtA[i:], m.XXX_unrecognized) } if m.MustRegisterBefore != nil { - n100, err100 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.MustRegisterBefore, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.MustRegisterBefore):]) - if err100 != nil { - return 0, err100 + n101, err101 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.MustRegisterBefore, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.MustRegisterBefore):]) + if err101 != nil { + return 0, err101 } - i -= n100 - i = encodeVarintTypes(dAtA, i, uint64(n100)) + i -= n101 + i = encodeVarintTypes(dAtA, i, uint64(n101)) i-- dAtA[i] = 0x1a } @@ -34046,22 +34212,22 @@ func (m *ProvisionTokenStatusV2BoundKeypair) MarshalToSizedBuffer(dAtA []byte) ( copy(dAtA[i:], m.XXX_unrecognized) } if m.LastRotatedAt != nil { - n102, err102 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastRotatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastRotatedAt):]) - if err102 != nil { - return 0, err102 + n103, err103 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastRotatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastRotatedAt):]) + if err103 != nil { + return 0, err103 } - i -= n102 - i = encodeVarintTypes(dAtA, i, uint64(n102)) + i -= n103 + i = encodeVarintTypes(dAtA, i, uint64(n103)) i-- dAtA[i] = 0x32 } if m.LastRecoveredAt != nil { - n103, err103 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastRecoveredAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastRecoveredAt):]) - if err103 != nil { - return 0, err103 + n104, err104 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastRecoveredAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastRecoveredAt):]) + if err104 != nil { + return 0, err104 } - i -= n103 - i = encodeVarintTypes(dAtA, i, uint64(n103)) + i -= n104 + i = encodeVarintTypes(dAtA, i, uint64(n104)) i-- dAtA[i] = 0x2a } @@ -35032,20 +35198,20 @@ func (m *AuthPreferenceSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xb2 } if len(m.SecondFactors) > 0 { - dAtA123 := make([]byte, len(m.SecondFactors)*10) - var j122 int + dAtA124 := make([]byte, len(m.SecondFactors)*10) + var j123 int for _, num := range m.SecondFactors { for num >= 1<<7 { - dAtA123[j122] = uint8(uint64(num)&0x7f | 0x80) + dAtA124[j123] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j122++ + j123++ } - dAtA123[j122] = uint8(num) - j122++ + dAtA124[j123] = uint8(num) + j123++ } - i -= j122 - copy(dAtA[i:], dAtA123[:j122]) - i = encodeVarintTypes(dAtA, i, uint64(j122)) + i -= j123 + copy(dAtA[i:], dAtA124[:j123]) + i = encodeVarintTypes(dAtA, i, uint64(j123)) i-- dAtA[i] = 0x1 i-- @@ -35718,12 +35884,12 @@ func (m *UserTokenSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n139, err139 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err139 != nil { - return 0, err139 + n140, err140 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err140 != nil { + return 0, err140 } - i -= n139 - i = encodeVarintTypes(dAtA, i, uint64(n139)) + i -= n140 + i = encodeVarintTypes(dAtA, i, uint64(n140)) i-- dAtA[i] = 0x22 if m.Usage != 0 { @@ -35840,12 +36006,12 @@ func (m *UserTokenSecretsSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n142, err142 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err142 != nil { - return 0, err142 + n143, err143 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err143 != nil { + return 0, err143 } - i -= n142 - i = encodeVarintTypes(dAtA, i, uint64(n142)) + i -= n143 + i = encodeVarintTypes(dAtA, i, uint64(n143)) i-- dAtA[i] = 0x1a if len(m.QRCode) > 0 { @@ -36093,12 +36259,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if m.AssumeStartTime != nil { - n145, err145 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) - if err145 != nil { - return 0, err145 + n146, err146 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) + if err146 != nil { + return 0, err146 } - i -= n145 - i = encodeVarintTypes(dAtA, i, uint64(n145)) + i -= n146 + i = encodeVarintTypes(dAtA, i, uint64(n146)) i-- dAtA[i] = 0x52 } @@ -36115,20 +36281,20 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x4a } if len(m.ThresholdIndexes) > 0 { - dAtA148 := make([]byte, len(m.ThresholdIndexes)*10) - var j147 int + dAtA149 := make([]byte, len(m.ThresholdIndexes)*10) + var j148 int for _, num := range m.ThresholdIndexes { for num >= 1<<7 { - dAtA148[j147] = uint8(uint64(num)&0x7f | 0x80) + dAtA149[j148] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j147++ + j148++ } - dAtA148[j147] = uint8(num) - j147++ + dAtA149[j148] = uint8(num) + j148++ } - i -= j147 - copy(dAtA[i:], dAtA148[:j147]) - i = encodeVarintTypes(dAtA, i, uint64(j147)) + i -= j148 + copy(dAtA[i:], dAtA149[:j148]) + i = encodeVarintTypes(dAtA, i, uint64(j148)) i-- dAtA[i] = 0x3a } @@ -36142,12 +36308,12 @@ func (m *AccessReview) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x32 - n150, err150 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err150 != nil { - return 0, err150 + n151, err151 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err151 != nil { + return 0, err151 } - i -= n150 - i = encodeVarintTypes(dAtA, i, uint64(n150)) + i -= n151 + i = encodeVarintTypes(dAtA, i, uint64(n151)) i-- dAtA[i] = 0x2a if len(m.Reason) > 0 { @@ -36250,20 +36416,20 @@ func (m *ThresholdIndexSet) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Indexes) > 0 { - dAtA153 := make([]byte, len(m.Indexes)*10) - var j152 int + dAtA154 := make([]byte, len(m.Indexes)*10) + var j153 int for _, num := range m.Indexes { for num >= 1<<7 { - dAtA153[j152] = uint8(uint64(num)&0x7f | 0x80) + dAtA154[j153] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j152++ + j153++ } - dAtA153[j152] = uint8(num) - j152++ + dAtA154[j153] = uint8(num) + j153++ } - i -= j152 - copy(dAtA[i:], dAtA153[:j152]) - i = encodeVarintTypes(dAtA, i, uint64(j152)) + i -= j153 + copy(dAtA[i:], dAtA154[:j153]) + i = encodeVarintTypes(dAtA, i, uint64(j153)) i-- dAtA[i] = 0xa } @@ -36350,24 +36516,24 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xba } if m.ResourceExpiry != nil { - n155, err155 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ResourceExpiry, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ResourceExpiry):]) - if err155 != nil { - return 0, err155 + n156, err156 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.ResourceExpiry, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.ResourceExpiry):]) + if err156 != nil { + return 0, err156 } - i -= n155 - i = encodeVarintTypes(dAtA, i, uint64(n155)) + i -= n156 + i = encodeVarintTypes(dAtA, i, uint64(n156)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0xb2 } if m.AssumeStartTime != nil { - n156, err156 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) - if err156 != nil { - return 0, err156 + n157, err157 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.AssumeStartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.AssumeStartTime):]) + if err157 != nil { + return 0, err157 } - i -= n156 - i = encodeVarintTypes(dAtA, i, uint64(n156)) + i -= n157 + i = encodeVarintTypes(dAtA, i, uint64(n157)) i-- dAtA[i] = 0x1 i-- @@ -36387,22 +36553,22 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xa2 } - n158, err158 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SessionTTL, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SessionTTL):]) - if err158 != nil { - return 0, err158 + n159, err159 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.SessionTTL, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.SessionTTL):]) + if err159 != nil { + return 0, err159 } - i -= n158 - i = encodeVarintTypes(dAtA, i, uint64(n158)) + i -= n159 + i = encodeVarintTypes(dAtA, i, uint64(n159)) i-- dAtA[i] = 0x1 i-- dAtA[i] = 0x92 - n159, err159 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MaxDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MaxDuration):]) - if err159 != nil { - return 0, err159 + n160, err160 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.MaxDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.MaxDuration):]) + if err160 != nil { + return 0, err160 } - i -= n159 - i = encodeVarintTypes(dAtA, i, uint64(n159)) + i -= n160 + i = encodeVarintTypes(dAtA, i, uint64(n160)) i-- dAtA[i] = 0x1 i-- @@ -36535,21 +36701,21 @@ func (m *AccessRequestSpecV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n163, err163 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err163 != nil { - return 0, err163 - } - i -= n163 - i = encodeVarintTypes(dAtA, i, uint64(n163)) - i-- - dAtA[i] = 0x2a - n164, err164 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n164, err164 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err164 != nil { return 0, err164 } i -= n164 i = encodeVarintTypes(dAtA, i, uint64(n164)) i-- + dAtA[i] = 0x2a + n165, err165 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err165 != nil { + return 0, err165 + } + i -= n165 + i = encodeVarintTypes(dAtA, i, uint64(n165)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -37552,12 +37718,12 @@ func (m *RoleOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0xfa } - n178, err178 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) - if err178 != nil { - return 0, err178 + n179, err179 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.MFAVerificationInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.MFAVerificationInterval):]) + if err179 != nil { + return 0, err179 } - i -= n178 - i = encodeVarintTypes(dAtA, i, uint64(n178)) + i -= n179 + i = encodeVarintTypes(dAtA, i, uint64(n179)) i-- dAtA[i] = 0x1 i-- @@ -37967,6 +38133,20 @@ func (m *RoleConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.MCP != nil { + { + size, err := m.MCP.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xf2 + } if len(m.WorkloadIdentityLabelsExpression) > 0 { i -= len(m.WorkloadIdentityLabelsExpression) copy(dAtA[i:], m.WorkloadIdentityLabelsExpression) @@ -38530,6 +38710,42 @@ func (m *GitHubPermission) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *MCPPermissions) 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 *MCPPermissions) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MCPPermissions) 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.Tools) > 0 { + for iNdEx := len(m.Tools) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Tools[iNdEx]) + copy(dAtA[i:], m.Tools[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Tools[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *SPIFFERoleCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -39578,12 +39794,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n209, err209 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err209 != nil { - return 0, err209 + n211, err211 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err211 != nil { + return 0, err211 } - i -= n209 - i = encodeVarintTypes(dAtA, i, uint64(n209)) + i -= n211 + i = encodeVarintTypes(dAtA, i, uint64(n211)) i-- dAtA[i] = 0x3a { @@ -39739,20 +39955,20 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n212, err212 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) - if err212 != nil { - return 0, err212 + n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) + if err214 != nil { + return 0, err214 } - i -= n212 - i = encodeVarintTypes(dAtA, i, uint64(n212)) + i -= n214 + i = encodeVarintTypes(dAtA, i, uint64(n214)) i-- dAtA[i] = 0x22 - n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) - if err213 != nil { - return 0, err213 + n215, err215 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err215 != nil { + return 0, err215 } - i -= n213 - i = encodeVarintTypes(dAtA, i, uint64(n213)) + i -= n215 + i = encodeVarintTypes(dAtA, i, uint64(n215)) i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { @@ -39809,12 +40025,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n215, err215 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err215 != nil { - return 0, err215 + n217, err217 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err217 != nil { + return 0, err217 } - i -= n215 - i = encodeVarintTypes(dAtA, i, uint64(n215)) + i -= n217 + i = encodeVarintTypes(dAtA, i, uint64(n217)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -39932,20 +40148,20 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n218, err218 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err218 != nil { - return 0, err218 + n220, err220 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) + if err220 != nil { + return 0, err220 } - i -= n218 - i = encodeVarintTypes(dAtA, i, uint64(n218)) + i -= n220 + i = encodeVarintTypes(dAtA, i, uint64(n220)) i-- dAtA[i] = 0x3a - n219, err219 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) - if err219 != nil { - return 0, err219 + n221, err221 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err221 != nil { + return 0, err221 } - i -= n219 - i = encodeVarintTypes(dAtA, i, uint64(n219)) + i -= n221 + i = encodeVarintTypes(dAtA, i, uint64(n221)) i-- dAtA[i] = 0x32 if len(m.Id) > 0 { @@ -40642,12 +40858,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n231, err231 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err231 != nil { - return 0, err231 + n233, err233 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err233 != nil { + return 0, err233 } - i -= n231 - i = encodeVarintTypes(dAtA, i, uint64(n231)) + i -= n233 + i = encodeVarintTypes(dAtA, i, uint64(n233)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -40739,12 +40955,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - n232, err232 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err232 != nil { - return 0, err232 + n234, err234 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err234 != nil { + return 0, err234 } - i -= n232 - i = encodeVarintTypes(dAtA, i, uint64(n232)) + i -= n234 + i = encodeVarintTypes(dAtA, i, uint64(n234)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -40793,12 +41009,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n233, err233 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err233 != nil { - return 0, err233 + n235, err235 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err235 != nil { + return 0, err235 } - i -= n233 - i = encodeVarintTypes(dAtA, i, uint64(n233)) + i -= n235 + i = encodeVarintTypes(dAtA, i, uint64(n235)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -40856,12 +41072,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - n234, err234 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err234 != nil { - return 0, err234 + n236, err236 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err236 != nil { + return 0, err236 } - i -= n234 - i = encodeVarintTypes(dAtA, i, uint64(n234)) + i -= n236 + i = encodeVarintTypes(dAtA, i, uint64(n236)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -41133,28 +41349,28 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n241, err241 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err241 != nil { - return 0, err241 + n243, err243 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) + if err243 != nil { + return 0, err243 } - i -= n241 - i = encodeVarintTypes(dAtA, i, uint64(n241)) + i -= n243 + i = encodeVarintTypes(dAtA, i, uint64(n243)) i-- dAtA[i] = 0x42 - n242, err242 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err242 != nil { - return 0, err242 + n244, err244 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err244 != nil { + return 0, err244 } - i -= n242 - i = encodeVarintTypes(dAtA, i, uint64(n242)) + i -= n244 + i = encodeVarintTypes(dAtA, i, uint64(n244)) i-- dAtA[i] = 0x3a - n243, err243 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) - if err243 != nil { - return 0, err243 + n245, err245 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err245 != nil { + return 0, err245 } - i -= n243 - i = encodeVarintTypes(dAtA, i, uint64(n243)) + i -= n245 + i = encodeVarintTypes(dAtA, i, uint64(n245)) i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { @@ -41387,20 +41603,20 @@ func (m *SAMLSessionData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - n244, err244 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) - if err244 != nil { - return 0, err244 + n246, err246 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) + if err246 != nil { + return 0, err246 } - i -= n244 - i = encodeVarintTypes(dAtA, i, uint64(n244)) + i -= n246 + i = encodeVarintTypes(dAtA, i, uint64(n246)) i-- dAtA[i] = 0x1a - n245, err245 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) - if err245 != nil { - return 0, err245 + n247, err247 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + if err247 != nil { + return 0, err247 } - i -= n245 - i = encodeVarintTypes(dAtA, i, uint64(n245)) + i -= n247 + i = encodeVarintTypes(dAtA, i, uint64(n247)) i-- dAtA[i] = 0x12 if len(m.ID) > 0 { @@ -41682,12 +41898,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n249, err249 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err249 != nil { - return 0, err249 + n251, err251 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err251 != nil { + return 0, err251 } - i -= n249 - i = encodeVarintTypes(dAtA, i, uint64(n249)) + i -= n251 + i = encodeVarintTypes(dAtA, i, uint64(n251)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -44474,12 +44690,12 @@ func (m *GithubAuthRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x62 } if m.Expires != nil { - n287, err287 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err287 != nil { - return 0, err287 + n289, err289 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err289 != nil { + return 0, err289 } - i -= n287 - i = encodeVarintTypes(dAtA, i, uint64(n287)) + i -= n289 + i = encodeVarintTypes(dAtA, i, uint64(n289)) i-- dAtA[i] = 0x5a } @@ -45491,21 +45707,21 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a } - n305, err305 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) - if err305 != nil { - return 0, err305 + n307, err307 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) + if err307 != nil { + return 0, err307 } - i -= n305 - i = encodeVarintTypes(dAtA, i, uint64(n305)) + i -= n307 + i = encodeVarintTypes(dAtA, i, uint64(n307)) i-- dAtA[i] = 0x22 if m.Expires != nil { - n306, err306 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err306 != nil { - return 0, err306 + n308, err308 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err308 != nil { + return 0, err308 } - i -= n306 - i = encodeVarintTypes(dAtA, i, uint64(n306)) + i -= n308 + i = encodeVarintTypes(dAtA, i, uint64(n308)) i-- dAtA[i] = 0x1a } @@ -46222,12 +46438,12 @@ func (m *RegisterUsingTokenRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro dAtA[i] = 0x6a } if m.Expires != nil { - n318, err318 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err318 != nil { - return 0, err318 + n320, err320 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err320 != nil { + return 0, err320 } - i -= n318 - i = encodeVarintTypes(dAtA, i, uint64(n318)) + i -= n320 + i = encodeVarintTypes(dAtA, i, uint64(n320)) i-- dAtA[i] = 0x62 } @@ -46407,12 +46623,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n321, err321 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err321 != nil { - return 0, err321 + n323, err323 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err323 != nil { + return 0, err323 } - i -= n321 - i = encodeVarintTypes(dAtA, i, uint64(n321)) + i -= n323 + i = encodeVarintTypes(dAtA, i, uint64(n323)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -46792,20 +47008,20 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n325, err325 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err325 != nil { - return 0, err325 + n327, err327 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err327 != nil { + return 0, err327 } - i -= n325 - i = encodeVarintTypes(dAtA, i, uint64(n325)) + i -= n327 + i = encodeVarintTypes(dAtA, i, uint64(n327)) i-- dAtA[i] = 0x2a - n326, err326 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err326 != nil { - return 0, err326 + n328, err328 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err328 != nil { + return 0, err328 } - i -= n326 - i = encodeVarintTypes(dAtA, i, uint64(n326)) + i -= n328 + i = encodeVarintTypes(dAtA, i, uint64(n328)) i-- dAtA[i] = 0x22 if m.State != 0 { @@ -46909,12 +47125,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n327, err327 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err327 != nil { - return 0, err327 + n329, err329 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err329 != nil { + return 0, err329 } - i -= n327 - i = encodeVarintTypes(dAtA, i, uint64(n327)) + i -= n329 + i = encodeVarintTypes(dAtA, i, uint64(n329)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -47626,12 +47842,12 @@ func (m *ClusterAlertSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n340, err340 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err340 != nil { - return 0, err340 + n342, err342 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err342 != nil { + return 0, err342 } - i -= n340 - i = encodeVarintTypes(dAtA, i, uint64(n340)) + i -= n342 + i = encodeVarintTypes(dAtA, i, uint64(n342)) i-- dAtA[i] = 0x1a if len(m.Message) > 0 { @@ -47761,12 +47977,12 @@ func (m *AlertAcknowledgement) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n341, err341 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err341 != nil { - return 0, err341 + n343, err343 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err343 != nil { + return 0, err343 } - i -= n341 - i = encodeVarintTypes(dAtA, i, uint64(n341)) + i -= n343 + i = encodeVarintTypes(dAtA, i, uint64(n343)) i-- dAtA[i] = 0x22 if len(m.Reason) > 0 { @@ -48518,12 +48734,12 @@ func (m *PluginGithubSettings) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n365, err365 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) - if err365 != nil { - return 0, err365 + n367, err367 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + if err367 != nil { + return 0, err367 } - i -= n365 - i = encodeVarintTypes(dAtA, i, uint64(n365)) + i -= n367 + i = encodeVarintTypes(dAtA, i, uint64(n367)) i-- dAtA[i] = 0x22 if len(m.OrganizationName) > 0 { @@ -50642,12 +50858,12 @@ func (m *PluginStatusV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n382, err382 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) - if err382 != nil { - return 0, err382 + n384, err384 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) + if err384 != nil { + return 0, err384 } - i -= n382 - i = encodeVarintTypes(dAtA, i, uint64(n382)) + i -= n384 + i = encodeVarintTypes(dAtA, i, uint64(n384)) i-- dAtA[i] = 0x1a if len(m.ErrorMessage) > 0 { @@ -51097,22 +51313,22 @@ func (m *PluginOktaStatusDetailsAppGroupSync) MarshalToSizedBuffer(dAtA []byte) dAtA[i] = 0x28 } if m.LastFailed != nil { - n394, err394 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err394 != nil { - return 0, err394 + n396, err396 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err396 != nil { + return 0, err396 } - i -= n394 - i = encodeVarintTypes(dAtA, i, uint64(n394)) + i -= n396 + i = encodeVarintTypes(dAtA, i, uint64(n396)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n395, err395 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err395 != nil { - return 0, err395 + n397, err397 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err397 != nil { + return 0, err397 } - i -= n395 - i = encodeVarintTypes(dAtA, i, uint64(n395)) + i -= n397 + i = encodeVarintTypes(dAtA, i, uint64(n397)) i-- dAtA[i] = 0x1a } @@ -51171,22 +51387,22 @@ func (m *PluginOktaStatusDetailsUsersSync) MarshalToSizedBuffer(dAtA []byte) (in dAtA[i] = 0x28 } if m.LastFailed != nil { - n396, err396 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err396 != nil { - return 0, err396 + n398, err398 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err398 != nil { + return 0, err398 } - i -= n396 - i = encodeVarintTypes(dAtA, i, uint64(n396)) + i -= n398 + i = encodeVarintTypes(dAtA, i, uint64(n398)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n397, err397 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err397 != nil { - return 0, err397 + n399, err399 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err399 != nil { + return 0, err399 } - i -= n397 - i = encodeVarintTypes(dAtA, i, uint64(n397)) + i -= n399 + i = encodeVarintTypes(dAtA, i, uint64(n399)) i-- dAtA[i] = 0x1a } @@ -51304,75 +51520,6 @@ func (m *PluginOktaStatusDetailsAccessListsSync) MarshalToSizedBuffer(dAtA []byt dAtA[i] = 0x2a } } - if m.LastFailed != nil { - n398, err398 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err398 != nil { - return 0, err398 - } - i -= n398 - i = encodeVarintTypes(dAtA, i, uint64(n398)) - i-- - dAtA[i] = 0x22 - } - if m.LastSuccessful != nil { - n399, err399 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err399 != nil { - return 0, err399 - } - i -= n399 - i = encodeVarintTypes(dAtA, i, uint64(n399)) - i-- - dAtA[i] = 0x1a - } - if m.StatusCode != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.StatusCode)) - i-- - dAtA[i] = 0x10 - } - if m.Enabled { - i-- - if m.Enabled { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *PluginOktaStatusSystemLogExporter) 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 *PluginOktaStatusSystemLogExporter) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *PluginOktaStatusSystemLogExporter) 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.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x4a - } if m.LastFailed != nil { n400, err400 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) if err400 != nil { @@ -51411,6 +51558,75 @@ func (m *PluginOktaStatusSystemLogExporter) MarshalToSizedBuffer(dAtA []byte) (i return len(dAtA) - i, nil } +func (m *PluginOktaStatusSystemLogExporter) 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 *PluginOktaStatusSystemLogExporter) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PluginOktaStatusSystemLogExporter) 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.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x4a + } + if m.LastFailed != nil { + n402, err402 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err402 != nil { + return 0, err402 + } + i -= n402 + i = encodeVarintTypes(dAtA, i, uint64(n402)) + i-- + dAtA[i] = 0x22 + } + if m.LastSuccessful != nil { + n403, err403 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err403 != nil { + return 0, err403 + } + i -= n403 + i = encodeVarintTypes(dAtA, i, uint64(n403)) + i-- + dAtA[i] = 0x1a + } + if m.StatusCode != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.StatusCode)) + i-- + dAtA[i] = 0x10 + } + if m.Enabled { + i-- + if m.Enabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *PluginCredentialsV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -51555,12 +51771,12 @@ func (m *PluginOAuth2AccessTokenCredentials) MarshalToSizedBuffer(dAtA []byte) ( i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n406, err406 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err406 != nil { - return 0, err406 + n408, err408 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err408 != nil { + return 0, err408 } - i -= n406 - i = encodeVarintTypes(dAtA, i, uint64(n406)) + i -= n408 + i = encodeVarintTypes(dAtA, i, uint64(n408)) i-- dAtA[i] = 0x1a if len(m.RefreshToken) > 0 { @@ -52518,20 +52734,20 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n421, err421 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err421 != nil { - return 0, err421 + n423, err423 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) + if err423 != nil { + return 0, err423 } - i -= n421 - i = encodeVarintTypes(dAtA, i, uint64(n421)) + i -= n423 + i = encodeVarintTypes(dAtA, i, uint64(n423)) i-- dAtA[i] = 0x12 - n422, err422 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) - if err422 != nil { - return 0, err422 + n424, err424 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err424 != nil { + return 0, err424 } - i -= n422 - i = encodeVarintTypes(dAtA, i, uint64(n422)) + i -= n424 + i = encodeVarintTypes(dAtA, i, uint64(n424)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -52958,12 +53174,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n429, err429 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err429 != nil { - return 0, err429 + n431, err431 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err431 != nil { + return 0, err431 } - i -= n429 - i = encodeVarintTypes(dAtA, i, uint64(n429)) + i -= n431 + i = encodeVarintTypes(dAtA, i, uint64(n431)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -52971,12 +53187,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n430, err430 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err430 != nil { - return 0, err430 + n432, err432 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err432 != nil { + return 0, err432 } - i -= n430 - i = encodeVarintTypes(dAtA, i, uint64(n430)) + i -= n432 + i = encodeVarintTypes(dAtA, i, uint64(n432)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -53591,20 +53807,20 @@ func (m *AWSRolesAnywhereProfileSyncIterationSummary) MarshalToSizedBuffer(dAtA i-- dAtA[i] = 0x1a } - n442, err442 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) - if err442 != nil { - return 0, err442 + n444, err444 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndTime):]) + if err444 != nil { + return 0, err444 } - i -= n442 - i = encodeVarintTypes(dAtA, i, uint64(n442)) + i -= n444 + i = encodeVarintTypes(dAtA, i, uint64(n444)) i-- dAtA[i] = 0x12 - n443, err443 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) - if err443 != nil { - return 0, err443 + n445, err445 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartTime):]) + if err445 != nil { + return 0, err445 } - i -= n443 - i = encodeVarintTypes(dAtA, i, uint64(n443)) + i -= n445 + i = encodeVarintTypes(dAtA, i, uint64(n445)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -54780,12 +54996,12 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - n462, err462 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) - if err462 != nil { - return 0, err462 + n464, err464 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err464 != nil { + return 0, err464 } - i -= n462 - i = encodeVarintTypes(dAtA, i, uint64(n462)) + i -= n464 + i = encodeVarintTypes(dAtA, i, uint64(n464)) i-- dAtA[i] = 0x12 if len(m.AWS) > 0 { @@ -55000,12 +55216,12 @@ func (m *TargetHealth) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2a } if m.TransitionTimestamp != nil { - n465, err465 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) - if err465 != nil { - return 0, err465 + n467, err467 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) + if err467 != nil { + return 0, err467 } - i -= n465 - i = encodeVarintTypes(dAtA, i, uint64(n465)) + i -= n467 + i = encodeVarintTypes(dAtA, i, uint64(n467)) i-- dAtA[i] = 0x22 } @@ -56511,6 +56727,36 @@ func (m *AppSpecV3) Size() (n int) { if m.UseAnyProxyPublicAddr { n += 2 } + if m.MCP != nil { + l = m.MCP.Size() + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *MCP) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Command) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if len(m.Args) > 0 { + for _, s := range m.Args { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.RunAsHostUser) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -59724,6 +59970,10 @@ func (m *RoleConditions) Size() (n int) { if l > 0 { n += 2 + l + sovTypes(uint64(l)) } + if m.MCP != nil { + l = m.MCP.Size() + n += 2 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -59768,6 +60018,24 @@ func (m *GitHubPermission) Size() (n int) { return n } +func (m *MCPPermissions) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Tools) > 0 { + for _, s := range m.Tools { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *SPIFFERoleCondition) Size() (n int) { if m == nil { return 0 @@ -77751,6 +78019,189 @@ func (m *AppSpecV3) Unmarshal(dAtA []byte) error { } } m.UseAnyProxyPublicAddr = bool(v != 0) + case 15: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MCP", 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.MCP == nil { + m.MCP = &MCP{} + } + if err := m.MCP.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 *MCP) 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: MCP: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MCP: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Command", 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.Command = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Args", 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.Args = append(m.Args, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RunAsHostUser", 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.RunAsHostUser = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -98691,6 +99142,42 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { } m.WorkloadIdentityLabelsExpression = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 46: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MCP", 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.MCP == nil { + m.MCP = &MCPPermissions{} + } + if err := m.MCP.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -98911,6 +99398,89 @@ func (m *GitHubPermission) Unmarshal(dAtA []byte) error { } return nil } +func (m *MCPPermissions) 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: MCPPermissions: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MCPPermissions: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tools", 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.Tools = append(m.Tools, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *SPIFFERoleCondition) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/api/types/user.go b/api/types/user.go index 4005465989ea6..bb705701c6fc4 100644 --- a/api/types/user.go +++ b/api/types/user.go @@ -123,6 +123,8 @@ type User interface { SetHostUserUID(uid string) // SetHostUserGID sets the GID for host users SetHostUserGID(gid string) + // SetMCPTools sets a list of allowed MCP tools for the user + SetMCPTools(mcpTools []string) // GetCreatedBy returns information about user GetCreatedBy() CreatedBy // SetCreatedBy sets created by information @@ -417,6 +419,11 @@ func (u *UserV2) SetHostUserGID(uid string) { u.setTrait(constants.TraitHostUserGID, []string{uid}) } +// SetMCPTools sets a list of allowed MCP tools for the user +func (u *UserV2) SetMCPTools(mcpTools []string) { + u.setTrait(constants.TraitMCPTools, mcpTools) +} + // GetStatus returns login status of the user func (u *UserV2) GetStatus() LoginStatus { return u.Spec.Status diff --git a/constants.go b/constants.go index 4ddbea83d3002..01836d37b5186 100644 --- a/constants.go +++ b/constants.go @@ -298,6 +298,9 @@ const ( // ComponentForwardingGit represents the SSH proxy that forwards Git commands. ComponentForwardingGit = "git:forward" + // ComponentMCP represents the MCP server handler. + ComponentMCP = "mcp" + // VerboseLogsEnvVar forces all logs to be verbose (down to DEBUG level) VerboseLogsEnvVar = "TELEPORT_DEBUG" @@ -654,6 +657,10 @@ const ( // TraitInternalGitHubOrgs is the variable used to store allowed GitHub // organizations for GitHub integrations. TraitInternalGitHubOrgs = "{{internal.github_orgs}}" + + // TraitInternalMCPTools is the variable used to store allowed MCP tools for + // MCP servers. + TraitInternalMCPTools = "{{internal.mcp_tools}}" ) // SCP is Secure Copy. diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-appsv3.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-appsv3.mdx new file mode 100644 index 0000000000000..c49e726ab3f96 --- /dev/null +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-appsv3.mdx @@ -0,0 +1,129 @@ +--- +title: TeleportAppV3 +description: Provides a comprehensive list of fields in the TeleportAppV3 resource available through the Teleport Kubernetes operator +tocDepth: 3 +--- + +{/*Auto-generated file. Do not edit.*/} +{/*To regenerate, navigate to integrations/operator and run "make crd-docs".*/} + +This guide is a comprehensive reference to the fields in the `TeleportAppV3` +resource, which you can apply after installing the Teleport Kubernetes operator. + + +## resources.teleport.dev/v1 + +**apiVersion:** resources.teleport.dev/v1 + +|Field|Type|Description| +|---|---|---| +|apiVersion|string|APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources| +|kind|string|Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds| +|metadata|object|| +|spec|[object](#spec)|App resource definition v3 from Teleport| + +### spec + +|Field|Type|Description| +|---|---|---| +|UserGroups|[]string|UserGroups are a list of user group IDs that this app is associated with.| +|aws|[object](#specaws)|AWS contains additional options for AWS applications.| +|cloud|string|Cloud identifies the cloud instance the app represents.| +|cors|[object](#speccors)|CORSPolicy defines the Cross-Origin Resource Sharing settings for the app.| +|dynamic_labels|[object](#specdynamic_labels)|DynamicLabels are the app's command labels.| +|identity_center|[object](#specidentity_center)|IdentityCenter encasulates AWS identity-center specific information. Only valid for Identity Center account apps.| +|insecure_skip_verify|boolean|InsecureSkipVerify disables app's TLS certificate verification.| +|integration|string|Integration is the integration name that must be used to access this Application. Only applicable to AWS App Access. If present, the Application must use the Integration's credentials instead of ambient credentials to access Cloud APIs.| +|mcp|[object](#specmcp)|MCP contains MCP server related configurations.| +|public_addr|string|PublicAddr is the public address the application is accessible at.| +|required_app_names|[]string|RequiredAppNames is a list of app names that are required for this app to function. Any app listed here will be part of the authentication redirect flow and authenticate along side this app.| +|rewrite|[object](#specrewrite)|Rewrite is a list of rewriting rules to apply to requests and responses.| +|tcp_ports|[][object](#spectcp_ports-items)|TCPPorts is a list of ports and port ranges that an app agent can forward connections to. Only applicable to TCP App Access. If this field is not empty, URI is expected to contain no port number and start with the tcp protocol.| +|uri|string|URI is the web app endpoint.| +|use_any_proxy_public_addr|boolean|UseAnyProxyPublicAddr will rebuild this app's fqdn based on the proxy public addr that the request originated from. This should be true if your proxy has multiple proxy public addrs and you want the app to be accessible from any of them. If `public_addr` is explicitly set in the app spec, setting this value to true will overwrite that public address in the web UI.| + +### spec.aws + +|Field|Type|Description| +|---|---|---| +|external_id|string|ExternalID is the AWS External ID used when assuming roles in this app.| +|roles_anywhere_profile|[object](#specawsroles_anywhere_profile)|RolesAnywhereProfile contains the IAM Roles Anywhere fields associated with this Application. These fields are set when performing the synchronization of AWS IAM Roles Anywhere Profiles into Teleport Apps.| + +### spec.aws.roles_anywhere_profile + +|Field|Type|Description| +|---|---|---| +|accept_role_session_name|boolean|Whether this Roles Anywhere Profile accepts a custom role session name. When not supported, the AWS Session Name will be the X.509 certificate's serial number. When supported, the AWS Session Name will be the identity's username. This values comes from: https://docs.aws.amazon.com/rolesanywhere/latest/APIReference/API_ProfileDetail.html / acceptRoleSessionName| +|profile_arn|string|ProfileARN is the AWS IAM Roles Anywhere Profile ARN that originated this Teleport App.| + +### spec.cors + +|Field|Type|Description| +|---|---|---| +|allow_credentials|boolean|allow_credentials indicates whether credentials are allowed.| +|allowed_headers|[]string|allowed_headers specifies which headers can be used when accessing the app.| +|allowed_methods|[]string|allowed_methods specifies which methods are allowed when accessing the app.| +|allowed_origins|[]string|allowed_origins specifies which origins are allowed to access the app.| +|exposed_headers|[]string|exposed_headers indicates which headers are made available to scripts via the browser.| +|max_age|integer|max_age indicates how long (in seconds) the results of a preflight request can be cached.| + +### spec.dynamic_labels + +|Field|Type|Description| +|---|---|---| +|key|string|| +|value|[object](#specdynamic_labelsvalue)|| + +### spec.dynamic_labels.value + +|Field|Type|Description| +|---|---|---| +|command|[]string|Command is a command to run| +|period|string|Period is a time between command runs| +|result|string|Result captures standard output| + +### spec.identity_center + +|Field|Type|Description| +|---|---|---| +|account_id|string|Account ID is the AWS-assigned ID of the account| +|permission_sets|[][object](#specidentity_centerpermission_sets-items)|PermissionSets lists the available permission sets on the given account| + +### spec.identity_center.permission_sets items + +|Field|Type|Description| +|---|---|---| +|arn|string|ARN is the fully-formed ARN of the Permission Set.| +|assignment_name|string|AssignmentID is the ID of the Teleport Account Assignment resource that represents this permission being assigned on the enclosing Account.| +|name|string|Name is the human-readable name of the Permission Set.| + +### spec.mcp + +|Field|Type|Description| +|---|---|---| +|args|[]string|Args to execute with the command.| +|command|string|Command to launch stdio-based MCP servers.| +|run_as_host_user|string|RunAsHostUser is the host user account under which the command will be executed. Required for stdio-based MCP servers.| + +### spec.rewrite + +|Field|Type|Description| +|---|---|---| +|headers|[][object](#specrewriteheaders-items)|Headers is a list of headers to inject when passing the request over to the application.| +|jwt_claims|string|JWTClaims configures whether roles/traits are included in the JWT token.| +|redirect|[]string|Redirect defines a list of hosts which will be rewritten to the public address of the application if they occur in the "Location" header.| + +### spec.rewrite.headers items + +|Field|Type|Description| +|---|---|---| +|name|string|Name is the http header name.| +|value|string|Value is the http header value.| + +### spec.tcp_ports items + +|Field|Type|Description| +|---|---|---| +|end_port|integer|EndPort describes the end of the range, inclusive. If set, it must be between 2 and 65535 and be greater than Port when describing a port range. When omitted or set to zero, it signifies that the port range defines a single port.| +|port|integer|Port describes the start of the range. It must be between 1 and 65535.| + diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx index dd65bace39445..a6a12a5f871d4 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx @@ -67,6 +67,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specallowkubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specallowmcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specallowrequest)|| @@ -127,6 +128,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.allow.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.allow.request |Field|Type|Description| @@ -250,6 +257,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specdenykubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specdenymcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specdenyrequest)|| @@ -310,6 +318,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.deny.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.deny.request |Field|Type|Description| @@ -536,6 +550,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specallowkubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specallowmcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specallowrequest)|| @@ -596,6 +611,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.allow.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.allow.request |Field|Type|Description| @@ -719,6 +740,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specdenykubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specdenymcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specdenyrequest)|| @@ -779,6 +801,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.deny.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.deny.request |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx index 58b56bb03e1d8..5347d5cfed839 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx @@ -67,6 +67,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specallowkubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specallowmcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specallowrequest)|| @@ -127,6 +128,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.allow.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.allow.request |Field|Type|Description| @@ -250,6 +257,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specdenykubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specdenymcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specdenyrequest)|| @@ -310,6 +318,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.deny.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.deny.request |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx index 3133ae150b7a6..edb112200dc21 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx @@ -67,6 +67,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specallowkubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specallowmcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specallowrequest)|| @@ -127,6 +128,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.allow.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.allow.request |Field|Type|Description| @@ -250,6 +257,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specdenykubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specdenymcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specdenyrequest)|| @@ -310,6 +318,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.deny.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.deny.request |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv8.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv8.mdx index f2d1476c8bdcf..96b2db07aa5cd 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv8.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv8.mdx @@ -67,6 +67,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specallowkubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specallowmcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specallowrequest)|| @@ -127,6 +128,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.allow.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.allow.request |Field|Type|Description| @@ -250,6 +257,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |kubernetes_resources|[][object](#specdenykubernetes_resources-items)|KubernetesResources is the Kubernetes Resources this Role grants access to.| |kubernetes_users|[]string|KubeUsers is an optional kubernetes users to impersonate| |logins|[]string|Logins is a list of *nix system logins.| +|mcp|[object](#specdenymcp)|MCPPermissions defines MCP servers related permissions.| |node_labels|object|NodeLabels is a map of node labels (used to dynamically grant access to nodes).| |node_labels_expression|string|NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes.| |request|[object](#specdenyrequest)|| @@ -310,6 +318,12 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| +### spec.deny.mcp + +|Field|Type|Description| +|---|---|---| +|tools|[]string|Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.| + ### spec.deny.request |Field|Type|Description| diff --git a/docs/pages/reference/terraform-provider/data-sources/app.mdx b/docs/pages/reference/terraform-provider/data-sources/app.mdx index 0eed6d9ef8eeb..8755c43bd1cd4 100644 --- a/docs/pages/reference/terraform-provider/data-sources/app.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/app.mdx @@ -51,6 +51,7 @@ Optional: - `identity_center` (Attributes) IdentityCenter encasulates AWS identity-center specific information. Only valid for Identity Center account apps. (see [below for nested schema](#nested-schema-for-specidentity_center)) - `insecure_skip_verify` (Boolean) InsecureSkipVerify disables app's TLS certificate verification. - `integration` (String) Integration is the integration name that must be used to access this Application. Only applicable to AWS App Access. If present, the Application must use the Integration's credentials instead of ambient credentials to access Cloud APIs. +- `mcp` (Attributes) MCP contains MCP server related configurations. (see [below for nested schema](#nested-schema-for-specmcp)) - `public_addr` (String) PublicAddr is the public address the application is accessible at. - `required_app_names` (List of String) RequiredAppNames is a list of app names that are required for this app to function. Any app listed here will be part of the authentication redirect flow and authenticate along side this app. - `rewrite` (Attributes) Rewrite is a list of rewriting rules to apply to requests and responses. (see [below for nested schema](#nested-schema-for-specrewrite)) @@ -113,6 +114,15 @@ Optional: +### Nested Schema for `spec.mcp` + +Optional: + +- `args` (List of String) Args to execute with the command. +- `command` (String) Command to launch stdio-based MCP servers. +- `run_as_host_user` (String) RunAsHostUser is the host user account under which the command will be executed. Required for stdio-based MCP servers. + + ### Nested Schema for `spec.rewrite` Optional: diff --git a/docs/pages/reference/terraform-provider/data-sources/role.mdx b/docs/pages/reference/terraform-provider/data-sources/role.mdx index aa9c78783bdb5..ef0b316a5c1c0 100644 --- a/docs/pages/reference/terraform-provider/data-sources/role.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/role.mdx @@ -82,6 +82,7 @@ Optional: - `kubernetes_resources` (Attributes List) KubernetesResources is the Kubernetes Resources this Role grants access to. (see [below for nested schema](#nested-schema-for-specallowkubernetes_resources)) - `kubernetes_users` (List of String) KubeUsers is an optional kubernetes users to impersonate - `logins` (List of String) Logins is a list of *nix system logins. +- `mcp` (Attributes) MCPPermissions defines MCP servers related permissions. (see [below for nested schema](#nested-schema-for-specallowmcp)) - `node_labels` (Map of List of String) NodeLabels is a map of node labels (used to dynamically grant access to nodes). - `node_labels_expression` (String) NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes. - `request` (Attributes) (see [below for nested schema](#nested-schema-for-specallowrequest)) @@ -148,6 +149,13 @@ Optional: - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. +### Nested Schema for `spec.allow.mcp` + +Optional: + +- `tools` (List of String) Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed. + + ### Nested Schema for `spec.allow.request` Optional: @@ -282,6 +290,7 @@ Optional: - `kubernetes_resources` (Attributes List) KubernetesResources is the Kubernetes Resources this Role grants access to. (see [below for nested schema](#nested-schema-for-specdenykubernetes_resources)) - `kubernetes_users` (List of String) KubeUsers is an optional kubernetes users to impersonate - `logins` (List of String) Logins is a list of *nix system logins. +- `mcp` (Attributes) MCPPermissions defines MCP servers related permissions. (see [below for nested schema](#nested-schema-for-specdenymcp)) - `node_labels` (Map of List of String) NodeLabels is a map of node labels (used to dynamically grant access to nodes). - `node_labels_expression` (String) NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes. - `request` (Attributes) (see [below for nested schema](#nested-schema-for-specdenyrequest)) @@ -348,6 +357,13 @@ Optional: - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. +### Nested Schema for `spec.deny.mcp` + +Optional: + +- `tools` (List of String) Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed. + + ### Nested Schema for `spec.deny.request` Optional: diff --git a/docs/pages/reference/terraform-provider/resources/app.mdx b/docs/pages/reference/terraform-provider/resources/app.mdx index b8a32cffa475a..e3f509a32dc2c 100644 --- a/docs/pages/reference/terraform-provider/resources/app.mdx +++ b/docs/pages/reference/terraform-provider/resources/app.mdx @@ -73,6 +73,7 @@ Optional: - `identity_center` (Attributes) IdentityCenter encasulates AWS identity-center specific information. Only valid for Identity Center account apps. (see [below for nested schema](#nested-schema-for-specidentity_center)) - `insecure_skip_verify` (Boolean) InsecureSkipVerify disables app's TLS certificate verification. - `integration` (String) Integration is the integration name that must be used to access this Application. Only applicable to AWS App Access. If present, the Application must use the Integration's credentials instead of ambient credentials to access Cloud APIs. +- `mcp` (Attributes) MCP contains MCP server related configurations. (see [below for nested schema](#nested-schema-for-specmcp)) - `public_addr` (String) PublicAddr is the public address the application is accessible at. - `required_app_names` (List of String) RequiredAppNames is a list of app names that are required for this app to function. Any app listed here will be part of the authentication redirect flow and authenticate along side this app. - `rewrite` (Attributes) Rewrite is a list of rewriting rules to apply to requests and responses. (see [below for nested schema](#nested-schema-for-specrewrite)) @@ -135,6 +136,15 @@ Optional: +### Nested Schema for `spec.mcp` + +Optional: + +- `args` (List of String) Args to execute with the command. +- `command` (String) Command to launch stdio-based MCP servers. +- `run_as_host_user` (String) RunAsHostUser is the host user account under which the command will be executed. Required for stdio-based MCP servers. + + ### Nested Schema for `spec.rewrite` Optional: diff --git a/docs/pages/reference/terraform-provider/resources/role.mdx b/docs/pages/reference/terraform-provider/resources/role.mdx index 812327df3af6d..1afe83d36f285 100644 --- a/docs/pages/reference/terraform-provider/resources/role.mdx +++ b/docs/pages/reference/terraform-provider/resources/role.mdx @@ -147,6 +147,7 @@ Optional: - `kubernetes_resources` (Attributes List) KubernetesResources is the Kubernetes Resources this Role grants access to. (see [below for nested schema](#nested-schema-for-specallowkubernetes_resources)) - `kubernetes_users` (List of String) KubeUsers is an optional kubernetes users to impersonate - `logins` (List of String) Logins is a list of *nix system logins. +- `mcp` (Attributes) MCPPermissions defines MCP servers related permissions. (see [below for nested schema](#nested-schema-for-specallowmcp)) - `node_labels` (Map of List of String) NodeLabels is a map of node labels (used to dynamically grant access to nodes). - `node_labels_expression` (String) NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes. - `request` (Attributes) (see [below for nested schema](#nested-schema-for-specallowrequest)) @@ -213,6 +214,13 @@ Optional: - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. +### Nested Schema for `spec.allow.mcp` + +Optional: + +- `tools` (List of String) Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed. + + ### Nested Schema for `spec.allow.request` Optional: @@ -347,6 +355,7 @@ Optional: - `kubernetes_resources` (Attributes List) KubernetesResources is the Kubernetes Resources this Role grants access to. (see [below for nested schema](#nested-schema-for-specdenykubernetes_resources)) - `kubernetes_users` (List of String) KubeUsers is an optional kubernetes users to impersonate - `logins` (List of String) Logins is a list of *nix system logins. +- `mcp` (Attributes) MCPPermissions defines MCP servers related permissions. (see [below for nested schema](#nested-schema-for-specdenymcp)) - `node_labels` (Map of List of String) NodeLabels is a map of node labels (used to dynamically grant access to nodes). - `node_labels_expression` (String) NodeLabelsExpression is a predicate expression used to allow/deny access to SSH nodes. - `request` (Attributes) (see [below for nested schema](#nested-schema-for-specdenyrequest)) @@ -413,6 +422,13 @@ Optional: - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. +### Nested Schema for `spec.deny.mcp` + +Optional: + +- `tools` (List of String) Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. "prefix_*"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed. + + ### Nested Schema for `spec.deny.request` Optional: diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_appsv3.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_appsv3.yaml new file mode 100644 index 0000000000000..e1feb5d38f100 --- /dev/null +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_appsv3.yaml @@ -0,0 +1,353 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: teleportappsv3.resources.teleport.dev +spec: + group: resources.teleport.dev + names: + kind: TeleportAppV3 + listKind: TeleportAppV3List + plural: teleportappsv3 + shortNames: + - appv3 + - appsv3 + singular: teleportappv3 + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: AppV3 is the Schema for the appsv3 API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: App resource definition v3 from Teleport + properties: + UserGroups: + description: UserGroups are a list of user group IDs that this app + is associated with. + items: + type: string + nullable: true + type: array + aws: + description: AWS contains additional options for AWS applications. + nullable: true + properties: + external_id: + description: ExternalID is the AWS External ID used when assuming + roles in this app. + type: string + roles_anywhere_profile: + description: RolesAnywhereProfile contains the IAM Roles Anywhere + fields associated with this Application. These fields are set + when performing the synchronization of AWS IAM Roles Anywhere + Profiles into Teleport Apps. + nullable: true + properties: + accept_role_session_name: + description: 'Whether this Roles Anywhere Profile accepts + a custom role session name. When not supported, the AWS + Session Name will be the X.509 certificate''s serial number. + When supported, the AWS Session Name will be the identity''s + username. This values comes from: https://docs.aws.amazon.com/rolesanywhere/latest/APIReference/API_ProfileDetail.html + / acceptRoleSessionName' + type: boolean + profile_arn: + description: ProfileARN is the AWS IAM Roles Anywhere Profile + ARN that originated this Teleport App. + type: string + type: object + type: object + cloud: + description: Cloud identifies the cloud instance the app represents. + type: string + cors: + description: CORSPolicy defines the Cross-Origin Resource Sharing + settings for the app. + nullable: true + properties: + allow_credentials: + description: allow_credentials indicates whether credentials are + allowed. + type: boolean + allowed_headers: + description: allowed_headers specifies which headers can be used + when accessing the app. + items: + type: string + nullable: true + type: array + allowed_methods: + description: allowed_methods specifies which methods are allowed + when accessing the app. + items: + type: string + nullable: true + type: array + allowed_origins: + description: allowed_origins specifies which origins are allowed + to access the app. + items: + type: string + nullable: true + type: array + exposed_headers: + description: exposed_headers indicates which headers are made + available to scripts via the browser. + items: + type: string + nullable: true + type: array + max_age: + description: max_age indicates how long (in seconds) the results + of a preflight request can be cached. + format: int32 + type: integer + type: object + dynamic_labels: + description: DynamicLabels are the app's command labels. + properties: + key: + type: string + value: + nullable: true + properties: + command: + description: Command is a command to run + items: + type: string + nullable: true + type: array + period: + description: Period is a time between command runs + format: duration + type: string + result: + description: Result captures standard output + type: string + type: object + type: object + identity_center: + description: IdentityCenter encasulates AWS identity-center specific + information. Only valid for Identity Center account apps. + nullable: true + properties: + account_id: + description: Account ID is the AWS-assigned ID of the account + type: string + permission_sets: + description: PermissionSets lists the available permission sets + on the given account + items: + properties: + arn: + description: ARN is the fully-formed ARN of the Permission + Set. + type: string + assignment_name: + description: AssignmentID is the ID of the Teleport Account + Assignment resource that represents this permission being + assigned on the enclosing Account. + type: string + name: + description: Name is the human-readable name of the Permission + Set. + type: string + type: object + nullable: true + type: array + type: object + insecure_skip_verify: + description: InsecureSkipVerify disables app's TLS certificate verification. + type: boolean + integration: + description: Integration is the integration name that must be used + to access this Application. Only applicable to AWS App Access. If + present, the Application must use the Integration's credentials + instead of ambient credentials to access Cloud APIs. + type: string + mcp: + description: MCP contains MCP server related configurations. + nullable: true + properties: + args: + description: Args to execute with the command. + items: + type: string + nullable: true + type: array + command: + description: Command to launch stdio-based MCP servers. + type: string + run_as_host_user: + description: RunAsHostUser is the host user account under which + the command will be executed. Required for stdio-based MCP servers. + type: string + type: object + public_addr: + description: PublicAddr is the public address the application is accessible + at. + type: string + required_app_names: + description: RequiredAppNames is a list of app names that are required + for this app to function. Any app listed here will be part of the + authentication redirect flow and authenticate along side this app. + items: + type: string + nullable: true + type: array + rewrite: + description: Rewrite is a list of rewriting rules to apply to requests + and responses. + nullable: true + properties: + headers: + description: Headers is a list of headers to inject when passing + the request over to the application. + items: + properties: + name: + description: Name is the http header name. + type: string + value: + description: Value is the http header value. + type: string + type: object + nullable: true + type: array + jwt_claims: + description: JWTClaims configures whether roles/traits are included + in the JWT token. + type: string + redirect: + description: Redirect defines a list of hosts which will be rewritten + to the public address of the application if they occur in the + "Location" header. + items: + type: string + nullable: true + type: array + type: object + tcp_ports: + description: TCPPorts is a list of ports and port ranges that an app + agent can forward connections to. Only applicable to TCP App Access. + If this field is not empty, URI is expected to contain no port number + and start with the tcp protocol. + items: + properties: + end_port: + description: EndPort describes the end of the range, inclusive. + If set, it must be between 2 and 65535 and be greater than + Port when describing a port range. When omitted or set to + zero, it signifies that the port range defines a single port. + format: int32 + type: integer + port: + description: Port describes the start of the range. It must + be between 1 and 65535. + format: int32 + type: integer + type: object + nullable: true + type: array + uri: + description: URI is the web app endpoint. + type: string + use_any_proxy_public_addr: + description: UseAnyProxyPublicAddr will rebuild this app's fqdn based + on the proxy public addr that the request originated from. This + should be true if your proxy has multiple proxy public addrs and + you want the app to be accessible from any of them. If `public_addr` + is explicitly set in the app spec, setting this value to true will + overwrite that public address in the web UI. + type: boolean + type: object + status: + description: Status defines the observed state of the Teleport resource + properties: + conditions: + description: Conditions represent the latest available observations + of an object's state + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + teleportResourceID: + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml index 09ce2f3da3ba5..afc432cfe5e14 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml @@ -305,6 +305,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -901,6 +916,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1794,6 +1824,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -2390,6 +2435,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml index 512eee6828114..e7fc487230110 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml @@ -308,6 +308,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -904,6 +919,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml index e72c51466862f..b875e7d043479 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml @@ -308,6 +308,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -904,6 +919,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv8.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv8.yaml index c4847df93f7f0..2e6f94e71e111 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv8.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv8.yaml @@ -308,6 +308,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -904,6 +919,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/gen/preset-roles.json b/gen/preset-roles.json index 3290103e32492..b37a422df4a97 100755 --- a/gen/preset-roles.json +++ b/gen/preset-roles.json @@ -145,7 +145,12 @@ "{{internal.github_orgs}}" ] } - ] + ], + "mcp": { + "tools": [ + "{{internal.mcp_tools}}" + ] + } }, "deny": {} } diff --git a/go.mod b/go.mod index 95250c8c62feb..f749d5ace83fa 100644 --- a/go.mod +++ b/go.mod @@ -163,6 +163,7 @@ require ( github.com/keys-pub/go-libfido2 v1.5.3-0.20220306005615-8ab03fb1ec27 // replaced github.com/lib/pq v1.10.9 github.com/mailgun/mailgun-go/v4 v4.23.0 + github.com/mark3labs/mcp-go v0.32.0 github.com/mattn/go-shellwords v1.0.12 github.com/mattn/go-sqlite3 v1.14.28 github.com/mdlayher/netlink v1.7.2 @@ -201,6 +202,8 @@ require ( github.com/spiffe/aws-spiffe-workload-helper v0.0.1-rc.8 github.com/spiffe/go-spiffe/v2 v2.5.0 github.com/stretchr/testify v1.10.0 + github.com/tidwall/pretty v1.2.0 + github.com/tidwall/sjson v1.2.5 github.com/ucarion/urlpath v0.0.0-20200424170820-7ccc79b76bbb github.com/vulcand/predicate v1.2.0 // replaced github.com/yusufpapurcu/wmi v1.2.4 @@ -525,6 +528,8 @@ require ( github.com/thales-e-security/pool v0.0.2 // indirect github.com/theupdateframework/go-tuf v0.7.0 // indirect github.com/theupdateframework/go-tuf/v2 v2.0.2 // indirect + github.com/tidwall/gjson v1.14.2 // indirect + github.com/tidwall/match v1.1.1 // indirect github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect @@ -540,6 +545,7 @@ require ( github.com/xhit/go-str2duration/v2 v2.1.0 // indirect github.com/xlab/treeprint v1.2.0 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yuin/gopher-lua v1.1.1 // indirect github.com/zeebo/errs v1.4.0 // indirect diff --git a/go.sum b/go.sum index d936b1f6de93a..2c571bc70f61e 100644 --- a/go.sum +++ b/go.sum @@ -1801,6 +1801,8 @@ github.com/mailgun/mailgun-go/v4 v4.23.0 h1:jPEMJzzin2s7lvehcfv/0UkyBu18GvcURPr2 github.com/mailgun/mailgun-go/v4 v4.23.0/go.mod h1:imTtizoFtpfZqPqGP8vltVBB6q9yWcv6llBhfFeElZU= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/mark3labs/mcp-go v0.32.0 h1:fgwmbfL2gbd67obg57OfV2Dnrhs1HtSdlY/i5fn7MU8= +github.com/mark3labs/mcp-go v0.32.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU= github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -2177,7 +2179,15 @@ github.com/theupdateframework/go-tuf v0.7.0 h1:CqbQFrWo1ae3/I0UCblSbczevCCbS31Qv github.com/theupdateframework/go-tuf v0.7.0/go.mod h1:uEB7WSY+7ZIugK6R1hiBMBjQftaFzn7ZCDJcp1tCUug= github.com/theupdateframework/go-tuf/v2 v2.0.2 h1:PyNnjV9BJNzN1ZE6BcWK+5JbF+if370jjzO84SS+Ebo= github.com/theupdateframework/go-tuf/v2 v2.0.2/go.mod h1:baB22nBHeHBCeuGZcIlctNq4P61PcOdyARlplg5xmLA= +github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= +github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tink-crypto/tink-go-awskms/v2 v2.1.0 h1:N9UxlsOzu5mttdjhxkDLbzwtEecuXmlxZVo/ds7JKJI= github.com/tink-crypto/tink-go-awskms/v2 v2.1.0/go.mod h1:PxSp9GlOkKL9rlybW804uspnHuO9nbD98V/fDX4uSis= github.com/tink-crypto/tink-go-gcpkms/v2 v2.2.0 h1:3B9i6XBXNTRspfkTC0asN5W0K6GhOSgcujNiECNRNb0= @@ -2225,6 +2235,8 @@ github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZ github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yashtewari/glob-intersection v0.2.0 h1:8iuHdN88yYuCzCdjt0gDe+6bAhUwBeEWqThExu54RFg= github.com/yashtewari/glob-intersection v0.2.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= diff --git a/integration/appaccess/appaccess_test.go b/integration/appaccess/appaccess_test.go index 8d71d6cbe6787..fc1f5baf42f37 100644 --- a/integration/appaccess/appaccess_test.go +++ b/integration/appaccess/appaccess_test.go @@ -72,6 +72,8 @@ func TestAppAccess(t *testing.T) { t.Run("NoHeaderOverrides", bind(pack, testNoHeaderOverrides)) t.Run("AuditEvents", bind(pack, testAuditEvents)) + t.Run("MCP", bind(pack, testMCP)) + // This test should go last because it stops/starts app servers. t.Run("TestAppServersHA", bind(pack, testServersHA)) } diff --git a/integration/appaccess/mcp_test.go b/integration/appaccess/mcp_test.go new file mode 100644 index 0000000000000..782927e207bd8 --- /dev/null +++ b/integration/appaccess/mcp_test.go @@ -0,0 +1,64 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package appaccess + +import ( + "context" + "testing" + + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/require" + + libmcp "github.com/gravitational/teleport/lib/srv/mcp" + "github.com/gravitational/teleport/lib/utils/mcptest" +) + +func testMCP(pack *Pack, t *testing.T) { + t.Run("DialMCPServer stdio no server found", func(t *testing.T) { + testMCPDialStdioNoServerFound(t, pack) + }) + + t.Run("DialMCPServer stdio success", func(t *testing.T) { + testMCPDialStdio(t, pack) + }) +} + +func testMCPDialStdioNoServerFound(t *testing.T, pack *Pack) { + require.NoError(t, pack.tc.SaveProfile(false)) + + _, err := pack.tc.DialMCPServer(context.Background(), "not-found") + require.Error(t, err) +} + +func testMCPDialStdio(t *testing.T, pack *Pack) { + require.NoError(t, pack.tc.SaveProfile(false)) + + serverConn, err := pack.tc.DialMCPServer(context.Background(), libmcp.DemoServerName) + require.NoError(t, err) + + ctx := context.Background() + stdioClient := mcptest.NewStdioClientFromConn(t, serverConn) + + _, err = mcptest.InitializeClient(ctx, stdioClient) + require.NoError(t, err) + + listTools, err := stdioClient.ListTools(ctx, mcp.ListToolsRequest{}) + require.NoError(t, err) + require.Len(t, listTools.Tools, 3) +} diff --git a/integration/appaccess/pack.go b/integration/appaccess/pack.go index 8f6d26525a3fa..08eff48cf5d26 100644 --- a/integration/appaccess/pack.go +++ b/integration/appaccess/pack.go @@ -29,6 +29,7 @@ import ( "net" "net/http" "net/url" + "slices" "testing" "time" @@ -59,6 +60,7 @@ import ( "github.com/gravitational/teleport/lib/srv/app/common" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/utils/log/logtest" + sliceutils "github.com/gravitational/teleport/lib/utils/slices" "github.com/gravitational/teleport/lib/web" "github.com/gravitational/teleport/lib/web/app" websession "github.com/gravitational/teleport/lib/web/session" @@ -771,6 +773,7 @@ func (p *Pack) startRootAppServers(t *testing.T, count int, opts AppTestOptions) raConf.Proxy.Enabled = false raConf.SSH.Enabled = false raConf.Apps.Enabled = true + raConf.Apps.MCPDemoServer = true raConf.CircuitBreakerConfig = breaker.NoopBreakerConfig() raConf.Apps.MonitorCloseChannel = opts.MonitorCloseChannel raConf.Apps.Apps = append([]servicecfg.App{ @@ -1073,12 +1076,12 @@ func waitForAppRegInRemoteSiteCache(t *testing.T, tunnel reversetunnelclient.Ser apps, err := ap.GetApplicationServers(context.Background(), apidefaults.Namespace) assert.NoError(t, err) - counter := 0 - for _, v := range apps { - if v.GetHostID() == hostUUID { - counter++ - } - } - assert.Len(t, cfgApps, counter) + wantNames := sliceutils.Map(cfgApps, func(app servicecfg.App) string { + return app.Name + }) + assert.Subset(t, + slices.Collect(types.ResourceNames(apps)), + wantNames, + ) }, time.Minute*2, time.Millisecond*200) } diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_appsv3.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_appsv3.yaml new file mode 100644 index 0000000000000..e1feb5d38f100 --- /dev/null +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_appsv3.yaml @@ -0,0 +1,353 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + creationTimestamp: null + name: teleportappsv3.resources.teleport.dev +spec: + group: resources.teleport.dev + names: + kind: TeleportAppV3 + listKind: TeleportAppV3List + plural: teleportappsv3 + shortNames: + - appv3 + - appsv3 + singular: teleportappv3 + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: AppV3 is the Schema for the appsv3 API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: App resource definition v3 from Teleport + properties: + UserGroups: + description: UserGroups are a list of user group IDs that this app + is associated with. + items: + type: string + nullable: true + type: array + aws: + description: AWS contains additional options for AWS applications. + nullable: true + properties: + external_id: + description: ExternalID is the AWS External ID used when assuming + roles in this app. + type: string + roles_anywhere_profile: + description: RolesAnywhereProfile contains the IAM Roles Anywhere + fields associated with this Application. These fields are set + when performing the synchronization of AWS IAM Roles Anywhere + Profiles into Teleport Apps. + nullable: true + properties: + accept_role_session_name: + description: 'Whether this Roles Anywhere Profile accepts + a custom role session name. When not supported, the AWS + Session Name will be the X.509 certificate''s serial number. + When supported, the AWS Session Name will be the identity''s + username. This values comes from: https://docs.aws.amazon.com/rolesanywhere/latest/APIReference/API_ProfileDetail.html + / acceptRoleSessionName' + type: boolean + profile_arn: + description: ProfileARN is the AWS IAM Roles Anywhere Profile + ARN that originated this Teleport App. + type: string + type: object + type: object + cloud: + description: Cloud identifies the cloud instance the app represents. + type: string + cors: + description: CORSPolicy defines the Cross-Origin Resource Sharing + settings for the app. + nullable: true + properties: + allow_credentials: + description: allow_credentials indicates whether credentials are + allowed. + type: boolean + allowed_headers: + description: allowed_headers specifies which headers can be used + when accessing the app. + items: + type: string + nullable: true + type: array + allowed_methods: + description: allowed_methods specifies which methods are allowed + when accessing the app. + items: + type: string + nullable: true + type: array + allowed_origins: + description: allowed_origins specifies which origins are allowed + to access the app. + items: + type: string + nullable: true + type: array + exposed_headers: + description: exposed_headers indicates which headers are made + available to scripts via the browser. + items: + type: string + nullable: true + type: array + max_age: + description: max_age indicates how long (in seconds) the results + of a preflight request can be cached. + format: int32 + type: integer + type: object + dynamic_labels: + description: DynamicLabels are the app's command labels. + properties: + key: + type: string + value: + nullable: true + properties: + command: + description: Command is a command to run + items: + type: string + nullable: true + type: array + period: + description: Period is a time between command runs + format: duration + type: string + result: + description: Result captures standard output + type: string + type: object + type: object + identity_center: + description: IdentityCenter encasulates AWS identity-center specific + information. Only valid for Identity Center account apps. + nullable: true + properties: + account_id: + description: Account ID is the AWS-assigned ID of the account + type: string + permission_sets: + description: PermissionSets lists the available permission sets + on the given account + items: + properties: + arn: + description: ARN is the fully-formed ARN of the Permission + Set. + type: string + assignment_name: + description: AssignmentID is the ID of the Teleport Account + Assignment resource that represents this permission being + assigned on the enclosing Account. + type: string + name: + description: Name is the human-readable name of the Permission + Set. + type: string + type: object + nullable: true + type: array + type: object + insecure_skip_verify: + description: InsecureSkipVerify disables app's TLS certificate verification. + type: boolean + integration: + description: Integration is the integration name that must be used + to access this Application. Only applicable to AWS App Access. If + present, the Application must use the Integration's credentials + instead of ambient credentials to access Cloud APIs. + type: string + mcp: + description: MCP contains MCP server related configurations. + nullable: true + properties: + args: + description: Args to execute with the command. + items: + type: string + nullable: true + type: array + command: + description: Command to launch stdio-based MCP servers. + type: string + run_as_host_user: + description: RunAsHostUser is the host user account under which + the command will be executed. Required for stdio-based MCP servers. + type: string + type: object + public_addr: + description: PublicAddr is the public address the application is accessible + at. + type: string + required_app_names: + description: RequiredAppNames is a list of app names that are required + for this app to function. Any app listed here will be part of the + authentication redirect flow and authenticate along side this app. + items: + type: string + nullable: true + type: array + rewrite: + description: Rewrite is a list of rewriting rules to apply to requests + and responses. + nullable: true + properties: + headers: + description: Headers is a list of headers to inject when passing + the request over to the application. + items: + properties: + name: + description: Name is the http header name. + type: string + value: + description: Value is the http header value. + type: string + type: object + nullable: true + type: array + jwt_claims: + description: JWTClaims configures whether roles/traits are included + in the JWT token. + type: string + redirect: + description: Redirect defines a list of hosts which will be rewritten + to the public address of the application if they occur in the + "Location" header. + items: + type: string + nullable: true + type: array + type: object + tcp_ports: + description: TCPPorts is a list of ports and port ranges that an app + agent can forward connections to. Only applicable to TCP App Access. + If this field is not empty, URI is expected to contain no port number + and start with the tcp protocol. + items: + properties: + end_port: + description: EndPort describes the end of the range, inclusive. + If set, it must be between 2 and 65535 and be greater than + Port when describing a port range. When omitted or set to + zero, it signifies that the port range defines a single port. + format: int32 + type: integer + port: + description: Port describes the start of the range. It must + be between 1 and 65535. + format: int32 + type: integer + type: object + nullable: true + type: array + uri: + description: URI is the web app endpoint. + type: string + use_any_proxy_public_addr: + description: UseAnyProxyPublicAddr will rebuild this app's fqdn based + on the proxy public addr that the request originated from. This + should be true if your proxy has multiple proxy public addrs and + you want the app to be accessible from any of them. If `public_addr` + is explicitly set in the app spec, setting this value to true will + overwrite that public address in the web UI. + type: boolean + type: object + status: + description: Status defines the observed state of the Teleport resource + properties: + conditions: + description: Conditions represent the latest available observations + of an object's state + items: + description: Condition contains details for one aspect of the current + state of this API Resource. + properties: + lastTransitionTime: + description: |- + lastTransitionTime is the last time the condition transitioned from one status to another. + This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + format: date-time + type: string + message: + description: |- + message is a human readable message indicating details about the transition. + This may be an empty string. + maxLength: 32768 + type: string + observedGeneration: + description: |- + observedGeneration represents the .metadata.generation that the condition was set based upon. + For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date + with respect to the current state of the instance. + format: int64 + minimum: 0 + type: integer + reason: + description: |- + reason contains a programmatic identifier indicating the reason for the condition's last transition. + Producers of specific condition types may define expected values and meanings for this field, + and whether the values are considered a guaranteed API. + The value should be a CamelCase string. + This field may not be empty. + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + description: status of the condition, one of True, False, Unknown. + enum: + - "True" + - "False" + - Unknown + type: string + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + teleportResourceID: + format: int64 + type: integer + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: null + storedVersions: null diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml index 09ce2f3da3ba5..afc432cfe5e14 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml @@ -305,6 +305,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -901,6 +916,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1794,6 +1824,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -2390,6 +2435,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml index 512eee6828114..e7fc487230110 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml @@ -308,6 +308,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -904,6 +919,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml index e72c51466862f..b875e7d043479 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml @@ -308,6 +308,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -904,6 +919,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv8.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv8.yaml index c4847df93f7f0..2e6f94e71e111 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv8.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv8.yaml @@ -308,6 +308,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -904,6 +919,21 @@ spec: type: string nullable: true type: array + mcp: + description: MCPPermissions defines MCP servers related permissions. + nullable: true + properties: + tools: + description: Tools defines the list of tools allowed or denied + for this role. Each entry can be a literal string, a glob + pattern (e.g. "prefix_*"), or a regular expression (must + start with '^' and end with '$'). If the list is empty, + no tools are allowed. + items: + type: string + nullable: true + type: array + type: object node_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/terraform-mwi/go.mod b/integrations/terraform-mwi/go.mod index f1365f7a11671..784237951728e 100644 --- a/integrations/terraform-mwi/go.mod +++ b/integrations/terraform-mwi/go.mod @@ -337,6 +337,7 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.9.0 // indirect + github.com/mark3labs/mcp-go v0.32.0 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -461,6 +462,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect github.com/xlab/treeprint v1.2.0 // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yuin/goldmark v1.7.7 // indirect github.com/yuin/goldmark-meta v1.1.0 // indirect diff --git a/integrations/terraform-mwi/go.sum b/integrations/terraform-mwi/go.sum index 854e2d3552ce6..b1f2c966bc487 100644 --- a/integrations/terraform-mwi/go.sum +++ b/integrations/terraform-mwi/go.sum @@ -970,6 +970,8 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/mark3labs/mcp-go v0.32.0 h1:fgwmbfL2gbd67obg57OfV2Dnrhs1HtSdlY/i5fn7MU8= +github.com/mark3labs/mcp-go v0.32.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU= github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -1322,6 +1324,8 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index caf296982fe66..94ddd2f7cdd90 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -335,6 +335,7 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect github.com/mailru/easyjson v0.9.0 // indirect + github.com/mark3labs/mcp-go v0.32.0 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -459,6 +460,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect github.com/xlab/treeprint v1.2.0 // indirect + github.com/yosida95/uritemplate/v3 v3.0.2 // indirect github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect github.com/yuin/goldmark v1.7.4 // indirect github.com/yuin/goldmark-meta v1.1.0 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index e6500facdc934..58126dc6b2448 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -1093,6 +1093,8 @@ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/mark3labs/mcp-go v0.32.0 h1:fgwmbfL2gbd67obg57OfV2Dnrhs1HtSdlY/i5fn7MU8= +github.com/mark3labs/mcp-go v0.32.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattermost/xml-roundtrip-validator v0.1.0 h1:RXbVD2UAl7A7nOTR4u7E3ILa4IbtvKBHw64LDsmu9hU= github.com/mattermost/xml-roundtrip-validator v0.1.0/go.mod h1:qccnGMcpgwcNaBnxqpJpWWUiPNr5H3O8eDgGV9gT5To= @@ -1472,6 +1474,8 @@ github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= +github.com/yosida95/uritemplate/v3 v3.0.2/go.mod h1:ILOh0sOhIJR3+L/8afwt/kE++YT040gmv5BQTMR2HP4= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index 125d09344a1dd..3e4162f29a16d 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -984,6 +984,27 @@ func GenSchemaAppV3(ctx context.Context) (github_com_hashicorp_terraform_plugin_ Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, + "mcp": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "args": { + Description: "Args to execute with the command.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }, + "command": { + Description: "Command to launch stdio-based MCP servers.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + "run_as_host_user": { + Description: "RunAsHostUser is the host user account under which the command will be executed. Required for stdio-based MCP servers.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + }), + Description: "MCP contains MCP server related configurations.", + Optional: true, + }, "public_addr": { Description: "PublicAddr is the public address the application is accessible at.", Optional: true, @@ -2650,6 +2671,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, }, + "mcp": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"tools": { + Description: "Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. \"prefix_*\"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }}), + Description: "MCPPermissions defines MCP servers related permissions.", + Optional: true, + }, "node_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ Description: "NodeLabels is a map of node labels (used to dynamically grant access to nodes).", Optional: true, @@ -3147,6 +3177,15 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, }, + "mcp": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{"tools": { + Description: "Tools defines the list of tools allowed or denied for this role. Each entry can be a literal string, a glob pattern (e.g. \"prefix_*\"), or a regular expression (must start with '^' and end with '$'). If the list is empty, no tools are allowed.", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.StringType}, + }}), + Description: "MCPPermissions defines MCP servers related permissions.", + Optional: true, + }, "node_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ Description: "NodeLabels is a map of node labels (used to dynamically grant access to nodes).", Optional: true, @@ -12066,6 +12105,85 @@ func CopyAppV3FromTerraform(_ context.Context, tf github_com_hashicorp_terraform } } } + { + a, ok := tf.Attrs["mcp"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.MCP"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.MCP", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.MCP = nil + if !v.Null && !v.Unknown { + tf := v + obj.MCP = &github_com_gravitational_teleport_api_types.MCP{} + obj := obj.MCP + { + a, ok := tf.Attrs["command"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.MCP.command"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.MCP.command", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Command = t + } + } + } + { + a, ok := tf.Attrs["args"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.MCP.args"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.MCP.args", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.Args = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.MCP.args", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Args[k] = t + } + } + } + } + } + } + { + a, ok := tf.Attrs["run_as_host_user"] + if !ok { + diags.Append(attrReadMissingDiag{"AppV3.Spec.MCP.run_as_host_user"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"AppV3.Spec.MCP.run_as_host_user", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.RunAsHostUser = t + } + } + } + } + } + } + } } } } @@ -13661,6 +13779,135 @@ func CopyAppV3ToTerraform(ctx context.Context, obj *github_com_gravitational_tel tf.Attrs["use_any_proxy_public_addr"] = v } } + { + a, ok := tf.AttrTypes["mcp"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.MCP"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.MCP", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["mcp"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if obj.MCP == nil { + v.Null = true + } else { + obj := obj.MCP + tf := &v + { + t, ok := tf.AttrTypes["command"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.MCP.command"}) + } else { + v, ok := tf.Attrs["command"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"AppV3.Spec.MCP.command", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.MCP.command", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Command) == "" + } + v.Value = string(obj.Command) + v.Unknown = false + tf.Attrs["command"] = v + } + } + { + a, ok := tf.AttrTypes["args"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.MCP.args"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.MCP.args", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["args"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Args)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Args)) + } + } + if obj.Args != nil { + t := o.ElemType + if len(obj.Args) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Args)) + } + for k, a := range obj.Args { + v, ok := tf.Attrs["args"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"AppV3.Spec.MCP.args", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.MCP.args", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.Args) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["args"] = c + } + } + } + { + t, ok := tf.AttrTypes["run_as_host_user"] + if !ok { + diags.Append(attrWriteMissingDiag{"AppV3.Spec.MCP.run_as_host_user"}) + } else { + v, ok := tf.Attrs["run_as_host_user"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"AppV3.Spec.MCP.run_as_host_user", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"AppV3.Spec.MCP.run_as_host_user", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.RunAsHostUser) == "" + } + v.Value = string(obj.RunAsHostUser) + v.Unknown = false + tf.Attrs["run_as_host_user"] = v + } + } + } + v.Unknown = false + tf.Attrs["mcp"] = v + } + } + } } v.Unknown = false tf.Attrs["spec"] = v @@ -27237,6 +27484,51 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["mcp"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.MCP"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.MCP", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.MCP = nil + if !v.Null && !v.Unknown { + tf := v + obj.MCP = &github_com_gravitational_teleport_api_types.MCPPermissions{} + obj := obj.MCP + { + a, ok := tf.Attrs["tools"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.MCP.tools"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.MCP.tools", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.Tools = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.MCP.tools", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Tools[k] = t + } + } + } + } + } + } + } + } + } + } } } } @@ -29299,6 +29591,51 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["mcp"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.MCP"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.MCP", "github.com/hashicorp/terraform-plugin-framework/types.Object"}) + } else { + obj.MCP = nil + if !v.Null && !v.Unknown { + tf := v + obj.MCP = &github_com_gravitational_teleport_api_types.MCPPermissions{} + obj := obj.MCP + { + a, ok := tf.Attrs["tools"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.MCP.tools"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.MCP.tools", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.Tools = make([]string, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.MCP.tools", "github_com_hashicorp_terraform_plugin_framework_types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Tools[k] = t + } + } + } + } + } + } + } + } + } + } } } } @@ -34161,6 +34498,91 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["workload_identity_labels_expression"] = v } } + { + a, ok := tf.AttrTypes["mcp"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.MCP"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.MCP", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["mcp"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if obj.MCP == nil { + v.Null = true + } else { + obj := obj.MCP + tf := &v + { + a, ok := tf.AttrTypes["tools"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.MCP.tools"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.MCP.tools", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["tools"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Tools)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Tools)) + } + } + if obj.Tools != nil { + t := o.ElemType + if len(obj.Tools) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Tools)) + } + for k, a := range obj.Tools { + v, ok := tf.Attrs["tools"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Allow.MCP.tools", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.MCP.tools", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.Tools) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["tools"] = c + } + } + } + } + v.Unknown = false + tf.Attrs["mcp"] = v + } + } + } } v.Unknown = false tf.Attrs["allow"] = v @@ -37743,6 +38165,91 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te tf.Attrs["workload_identity_labels_expression"] = v } } + { + a, ok := tf.AttrTypes["mcp"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.MCP"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.MCP", "github.com/hashicorp/terraform-plugin-framework/types.ObjectType"}) + } else { + v, ok := tf.Attrs["mcp"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + if obj.MCP == nil { + v.Null = true + } else { + obj := obj.MCP + tf := &v + { + a, ok := tf.AttrTypes["tools"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.MCP.tools"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.MCP.tools", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["tools"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Tools)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Tools)) + } + } + if obj.Tools != nil { + t := o.ElemType + if len(obj.Tools) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.Tools)) + } + for k, a := range obj.Tools { + v, ok := tf.Attrs["tools"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Deny.MCP.tools", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.MCP.tools", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(a) == "" + } + v.Value = string(a) + v.Unknown = false + c.Elems[k] = v + } + if len(obj.Tools) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["tools"] = c + } + } + } + } + v.Unknown = false + tf.Attrs["mcp"] = v + } + } + } } v.Unknown = false tf.Attrs["deny"] = v diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index 24b28d8062f0f..2681046fbceb6 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -608,6 +608,12 @@ func (a *Server) CreateAppSessionFromReq(ctx context.Context, req NewAppSessionR a.logger.DebugContext(ctx, "Generated application web session", "user", req.User, "ttl", req.SessionTTL) UserLoginCount.Inc() + // Do not send app session start for MCP. They have their own events on + // connections. + if types.IsAppMCP(req.AppURI) { + return session, nil + } + // Extract the identity of the user from the certificate, this will include metadata from any actively assumed access requests. certificate, err := tlsca.ParseCertificatePEM(session.GetTLSCert()) if err != nil { diff --git a/lib/client/api.go b/lib/client/api.go index 74abb65b31dbe..1fbbb8ad6c192 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -72,6 +72,7 @@ import ( "github.com/gravitational/teleport/api/utils/grpc/interceptors" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/keys/hardwarekey" + "github.com/gravitational/teleport/api/utils/pingconn" "github.com/gravitational/teleport/api/utils/prompt" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/touchid" @@ -5490,3 +5491,140 @@ func (tc *TeleportClient) HeadlessApprove(ctx context.Context, headlessAuthentic err = rootClient.UpdateHeadlessAuthenticationState(ctx, headlessAuthenticationID, types.HeadlessAuthenticationState_HEADLESS_AUTHENTICATION_STATE_APPROVED, mfaResp) return trace.Wrap(err) } + +// DialALPN dials the Proxy with provided client certificate and ALPN protocol. +func (tc *TeleportClient) DialALPN(ctx context.Context, clientCert tls.Certificate, protocol alpncommon.Protocol) (net.Conn, error) { + ctx, span := tc.Tracer.Start( + ctx, + "teleportClient/DialALPN", + oteltrace.WithSpanKind(oteltrace.SpanKindClient), + oteltrace.WithAttributes( + attribute.String("protocol", string(protocol)), + ), + ) + defer span.End() + + dialConfig := client.ALPNDialerConfig{ + ALPNConnUpgradeRequired: tc.TLSRoutingConnUpgradeRequired, + TLSConfig: &tls.Config{ + NextProtos: alpncommon.ProtocolToStringsWithPing(protocol), + InsecureSkipVerify: tc.InsecureSkipVerify, + Certificates: []tls.Certificate{clientCert}, + }, + GetClusterCAs: tc.RootClusterCACertPool, + } + + tlsConn, err := client.DialALPN(ctx, tc.WebProxyAddr, dialConfig) + if err != nil { + return nil, trace.Wrap(err) + } + if alpncommon.IsPingProtocol(alpncommon.Protocol(tlsConn.ConnectionState().NegotiatedProtocol)) { + return pingconn.NewTLS(tlsConn), nil + } + return tlsConn, nil +} + +// DialMCPServer makes a connection to the remote MCP server. +func (tc *TeleportClient) DialMCPServer(ctx context.Context, appName string) (net.Conn, error) { + ctx, span := tc.Tracer.Start( + ctx, + "teleportClient/DialMCPServer", + oteltrace.WithSpanKind(oteltrace.SpanKindClient), + oteltrace.WithAttributes( + attribute.String("app", appName), + ), + ) + defer span.End() + + apps, err := tc.ListApps(ctx, &proto.ListResourcesRequest{ + ResourceType: types.KindAppServer, + Namespace: apidefaults.Namespace, + PredicateExpression: fmt.Sprintf("name == %q", strings.TrimSpace(appName)), + }) + if err != nil { + return nil, trace.Wrap(err) + } + switch len(apps) { + case 0: + return nil, trace.NotFound("no MCP servers found") + case 1: + default: + log.WarnContext(ctx, "multiple apps found, using the first one") + } + if !apps[0].IsMCP() { + return nil, trace.BadParameter("app %q is not a MCP server", appName) + } + + cert, err := tc.issueMCPCertWithMFA(ctx, apps[0]) + if err != nil { + return nil, trace.Wrap(err) + } + return tc.DialALPN(ctx, cert, alpncommon.ProtocolMCP) +} + +func (tc *TeleportClient) issueMCPCertWithMFA(ctx context.Context, mcpServer types.Application) (tls.Certificate, error) { + profile, err := tc.ProfileStatus() + if err != nil { + return tls.Certificate{}, trace.Wrap(err) + } + + appCertParams := ReissueParams{ + RouteToCluster: tc.SiteName, + RouteToApp: proto.RouteToApp{ + Name: mcpServer.GetName(), + PublicAddr: mcpServer.GetPublicAddr(), + ClusterName: tc.SiteName, + URI: mcpServer.GetURI(), + }, + AccessRequests: profile.ActiveRequests, + } + + // Do NOT write the keyring to avoid race condition when AI clients run + // multiple tsh at the same time. + keyRing, err := tc.IssueUserCertsWithMFA(ctx, appCertParams) + if err != nil { + return tls.Certificate{}, trace.Wrap(err) + } + + cert, err := keyRing.AppTLSCert(mcpServer.GetName()) + return cert, trace.Wrap(err) +} + +// DialDatabase makes a remote connection to the database. +// +// TODO(gabrielcorado): support acccess requests connections. +func (tc *TeleportClient) DialDatabase(ctx context.Context, route proto.RouteToDatabase) (net.Conn, error) { + ctx, span := tc.Tracer.Start( + ctx, + "teleportClient/DialDatabase", + oteltrace.WithSpanKind(oteltrace.SpanKindClient), + oteltrace.WithAttributes( + attribute.String("db", route.GetServiceName()), + attribute.String("protocol", route.GetProtocol()), + ), + ) + defer span.End() + + dbCertParams := ReissueParams{ + RouteToCluster: tc.SiteName, + RouteToDatabase: route, + TTL: tc.KeyTTL, + } + + alpnProtocol, err := alpncommon.ToALPNProtocol(route.GetProtocol()) + if err != nil { + return nil, trace.Wrap(err) + } + + keyRing, err := tc.IssueUserCertsWithMFA(ctx, dbCertParams) + if err != nil { + return nil, trace.Wrap(err) + } + + cert, err := keyRing.DBTLSCert(route.GetServiceName()) + if err != nil { + return nil, trace.Wrap(err) + } + + return tc.DialALPN(ctx, cert, alpnProtocol) +} diff --git a/lib/client/db/mcp/errors.go b/lib/client/db/mcp/errors.go new file mode 100644 index 0000000000000..19fdc90dbb2ac --- /dev/null +++ b/lib/client/db/mcp/errors.go @@ -0,0 +1,74 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "errors" + "io" + "strings" + + "github.com/gravitational/trace" + + apiclient "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/lib/client/mcp" + "github.com/gravitational/teleport/lib/utils" +) + +// FormatErrorMessage formats the database MCP error messages. +// format. +func FormatErrorMessage(err error) error { + switch { + case errors.Is(err, apiclient.ErrClientCredentialsHaveExpired) || utils.IsCertExpiredError(err): + return trace.BadParameter(ReloginRequiredErrorMessage) + case strings.Contains(err.Error(), "connection reset by peer") || errors.Is(err, io.ErrClosedPipe): + return trace.BadParameter(LocalProxyConnectionErrorMessage) + } + + return err +} + +const ( + // ReloginRequiredErrorMessage is the message returned to the MCP client + // when the tsh session expired. + ReloginRequiredErrorMessage = `It looks like your Teleport session expired, +you must relogin (using "tsh login" on a terminal) before continue using this +tool. After that, there is no need to update or relaunch the MCP client - just +try using it again.` + // LocalProxyConnectionErrorMessage is the message returned to the MCP client when + // the database client cannot connect to the local proxy. + LocalProxyConnectionErrorMessage = `Teleport MCP server is having issue while +establishing the database connection. You can verify the MCP logs for more +details on what is causing this issue. After identifying and fixing the issue +a restart on the MCP client might be necessary.` + // EmptyDatabasesListErrorMessage is the message returned to the MCP client when + // the started database server is serving no databases. + EmptyDatabasesListErrorMessage = `There are no active Teleport databases available +for use on the MCP server. You can check the MCP server logs to see if any +database was not included due to an error. You can also verify that the list +of databases on the MCP command is correct.` +) + +var ( + // WrongDatabaseURIFormatError is the message returned to the MCP client + // when it sends a malformed database resource URI. + WrongDatabaseURIFormatError = trace.BadParameter("Malformed database resource URI. Database resources must follow the format: %q", mcp.SampleDatabaseResource) + // DatabaseNotFoundError is the message returned to the MCP client when the + // requested database is not available as MCP resource. + DatabaseNotFoundError = trace.NotFound(`Database not found. Only registered databases +can be used. Ask the user to attach the database resource or list the available +resources with %q tool`, listDatabasesToolName) +) diff --git a/lib/client/db/mcp/mcp.go b/lib/client/db/mcp/mcp.go new file mode 100644 index 0000000000000..fdb514860bf5a --- /dev/null +++ b/lib/client/db/mcp/mcp.go @@ -0,0 +1,101 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "context" + "log/slog" + "net" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client/mcp" +) + +// NewServerConfig configuration passed to the server constructors. +type NewServerConfig struct { + Logger *slog.Logger + RootServer *RootServer + Databases []*Database +} + +// NewServerFunc the MCP server constructor function definition. +type NewServerFunc func(context.Context, *NewServerConfig) (Server, error) + +// Server represents a MCP server. +type Server interface { + // Close closes the server. + Close(context.Context) error +} + +// Registry represents the available databases MCP servers per protocol and +// their constructors. +type Registry map[string]NewServerFunc + +// IsSupported returns if the database protocol is supported by any MCP server +// available. +func (m Registry) IsSupported(protocol string) bool { + _, ok := m[protocol] + return ok +} + +// LookupFunc is the function used to resolve database address. Follows the +// net.Resolver.LookupAddr format. +type LookupFunc func(ctx context.Context, host string) (addrs []string, err error) + +// DialContextFunc is a function used to dial the database. Follows the +// net.Dialer.DialContext format. +type DialContextFunc func(ctx context.Context, network string, addr string) (net.Conn, error) + +// Database the database served by an MCP server. +type Database struct { + // DB contains all information from the database. + DB types.Database + // ClusterName is the cluster name where the database is located. + ClusterName string + // DatabaseUser is the database username used on the connections. + DatabaseUser string + // DatabaseName is the database name used on the connections. + DatabaseName string + // LookupFunc is the lookup function to resolve database address. + LookupFunc LookupFunc + // DialContextFunc is the dial function used to connect to the database. + DialContextFunc DialContextFunc +} + +// ResourceURI returns the database MCP resource URI. +func (d Database) ResourceURI() mcp.ResourceURI { + return mcp.NewDatabaseResourceURI(d.ClusterName, d.DB.GetName()) +} + +// DatabaseResource MCP resource representation of a Teleport database. +type DatabaseResource struct { + types.Metadata + // URI is the MCP URI resource. + URI string `json:"uri"` + // Protocol is the database protocol. + Protocol string `json:"protocol"` + // ClusterName is the cluster the database is. + ClusterName string `json:"cluster_name"` +} + +// ToolName generates a database access tool name. +func ToolName(protocol, name string) string { + return ToolPrefix + protocol + "_" + name +} + +// ToolPrefix is the default tool prefix for every MCP tool. +const ToolPrefix = "teleport_" diff --git a/lib/client/db/mcp/server.go b/lib/client/db/mcp/server.go new file mode 100644 index 0000000000000..eb693032e78e6 --- /dev/null +++ b/lib/client/db/mcp/server.go @@ -0,0 +1,158 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "context" + "fmt" + "io" + "log/slog" + "sync" + + "github.com/ghodss/yaml" + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + mcpserver "github.com/mark3labs/mcp-go/server" + + "github.com/gravitational/teleport" +) + +// listDatabasesTool is the MCP tool that list all databases being served +// (from all protocols). +var listDatabasesTool = mcp.NewTool(listDatabasesToolName, + mcp.WithDescription("List database resources available to be used with Teleport tools."), +) + +// RootServer database access root MCP server. It includes common MCP tools and +// resources across different databases and serves as a root server where +// database-specific MCP servers register their tools. +type RootServer struct { + *mcpserver.MCPServer + + mu sync.RWMutex + logger *slog.Logger + availableDatabases map[string]*Database +} + +// NewRootServer initializes a new root MCP server. +func NewRootServer(logger *slog.Logger) *RootServer { + server := &RootServer{ + MCPServer: mcpserver.NewMCPServer(serverName, teleport.Version), + logger: logger, + availableDatabases: make(map[string]*Database), + } + server.AddTool(listDatabasesTool, server.ListDatabases) + + return server +} + +// ListDatabases tool function used to list all available/served databases. +// +// Note: Given some MCP clients not fully support resources of any kind (including +// embedded and references), we must return the databases as plain text result so +// the tool keeps working on those clients. +func (s *RootServer) ListDatabases(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + if len(s.availableDatabases) == 0 { + return mcp.NewToolResultError(EmptyDatabasesListErrorMessage), nil + } + + var res []mcp.Content + for _, db := range s.availableDatabases { + contents, err := encodeDatabaseResource(db) + if err != nil { + s.logger.ErrorContext(ctx, "error while list databases", "error", err) + return mcp.NewToolResultError(FormatErrorMessage(err).Error()), nil + } + res = append(res, mcp.NewTextContent(contents)) + } + + return &mcp.CallToolResult{ + Content: res, + }, nil +} + +// GetDatabaseResource resource handler for databases. +func (s *RootServer) GetDatabaseResource(ctx context.Context, request mcp.ReadResourceRequest) ([]mcp.ResourceContents, error) { + s.mu.RLock() + defer s.mu.RUnlock() + + db, ok := s.availableDatabases[request.Params.URI] + if !ok { + return nil, trace.NotFound("Database is %q not available as MCP resource", request.Params.URI) + } + + encodedDb, err := encodeDatabaseResource(db) + if err != nil { + return nil, trace.Wrap(err) + } + + return []mcp.ResourceContents{mcp.TextResourceContents{ + URI: request.Params.URI, + MIMEType: databaseResourceMIMEType, + Text: encodedDb, + }}, nil +} + +// RegisterDatabase register a database on the root server. This make it +// available as a MCP resource. +// +// TODO(gabrielcorado): support dynamically registering/deregistering databases +// after the server starts. +func (s *RootServer) RegisterDatabase(db *Database) { + s.mu.Lock() + defer s.mu.Unlock() + + uri := db.ResourceURI().WithoutParams().String() + s.availableDatabases[uri] = db + s.AddResource(mcp.NewResource(uri, fmt.Sprintf("%s Datatabase", db.DB.GetName()), mcp.WithMIMEType(databaseResourceMIMEType)), s.GetDatabaseResource) +} + +// ServeStdio starts serving the root MCP using STDIO transport. +func (s *RootServer) ServeStdio(ctx context.Context, in io.Reader, out io.Writer) error { + return trace.Wrap(mcpserver.NewStdioServer(s.MCPServer).Listen(ctx, in, out)) +} + +func buildDatabaseResource(db *Database) DatabaseResource { + return DatabaseResource{ + Metadata: db.DB.GetMetadata(), + URI: db.ResourceURI().WithoutParams().String(), + Protocol: db.DB.GetProtocol(), + ClusterName: db.ClusterName, + } +} + +func encodeDatabaseResource(db *Database) (string, error) { + resource := buildDatabaseResource(db) + out, err := yaml.Marshal(resource) + if err != nil { + return "", trace.Wrap(err) + } + + return string(out), nil +} + +const ( + // serverName is the database MCP server name. + serverName = "teleport_databases" + // listDatabasesTool is the list databases tool name. + listDatabasesToolName = ToolPrefix + "list_databases" + // databaseResourceMIMEType is the MIME type of the database resources. + databaseResourceMIMEType = "application/yaml" +) diff --git a/lib/client/db/mcp/server_test.go b/lib/client/db/mcp/server_test.go new file mode 100644 index 0000000000000..997c90c7d9e8c --- /dev/null +++ b/lib/client/db/mcp/server_test.go @@ -0,0 +1,176 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "log/slog" + "slices" + "strings" + "testing" + + "github.com/ghodss/yaml" + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + mcpclient "github.com/mark3labs/mcp-go/client" + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/defaults" +) + +func TestRegisterDatabase(t *testing.T) { + server := NewRootServer(slog.New(slog.DiscardHandler)) + databases := []*Database{ + buildDatabase(t, "first"), + buildDatabase(t, "second"), + buildDatabase(t, "third"), + } + // sort databases by name to ensure the same order every test. + slices.SortFunc(databases, func(a, b *Database) int { + return strings.Compare(a.ResourceURI().WithoutParams().String(), b.ResourceURI().WithoutParams().String()) + }) + + for _, db := range databases { + server.RegisterDatabase(db) + } + + clt := buildClient(t, server) + t.Run("Resources", func(t *testing.T) { + listResult, err := clt.ListResources(t.Context(), mcp.ListResourcesRequest{}) + require.NoError(t, err) + require.Len(t, listResult.Resources, len(databases)) + + // sort the result using the same field as databases to avoid flaky + // test. + slices.SortFunc(listResult.Resources, func(a, b mcp.Resource) int { + return strings.Compare(a.URI, b.URI) + }) + + for i, r := range listResult.Resources { + req := mcp.ReadResourceRequest{} + req.Params.URI = r.URI + readResult, err := clt.ReadResource(t.Context(), req) + require.NoError(t, err) + require.Len(t, readResult.Contents, 1) + assertDatabaseResource(t, databases[i], readResult.Contents[0]) + } + }) + + t.Run("Tool", func(t *testing.T) { + req := mcp.CallToolRequest{} + req.Params.Name = listDatabasesToolName + res, err := clt.CallTool(t.Context(), req) + require.NoError(t, err) + require.False(t, res.IsError) + require.Len(t, res.Content, len(databases)) + + for _, c := range res.Content { + require.IsType(t, mcp.TextContent{}, c) + } + + // Although we're not sorting by the URI directly, the only field that + // is different across the databases is their name and URI (which would + // cause them to have the same order). So here we sort by the YAML + // contents to avoid having to decode. + slices.SortFunc(res.Content, func(a, b mcp.Content) int { + resourceA := a.(mcp.TextContent).Text + resourceB := b.(mcp.TextContent).Text + return strings.Compare(resourceA, resourceB) + }) + + for i, c := range res.Content { + var database DatabaseResource + content := c.(mcp.TextContent) + require.NoError(t, yaml.Unmarshal([]byte(content.Text), &database)) + require.Empty(t, cmp.Diff(buildDatabaseResource(databases[i]), database, cmpopts.IgnoreFields(types.Metadata{}, "Namespace"))) + } + }) +} + +func TestEmptyDatabasesServer(t *testing.T) { + server := NewRootServer(slog.New(slog.DiscardHandler)) + + clt := buildClient(t, server) + t.Run("Resources", func(t *testing.T) { + _, err := clt.ListResources(t.Context(), mcp.ListResourcesRequest{}) + require.Error(t, err) + }) + + t.Run("Tool", func(t *testing.T) { + req := mcp.CallToolRequest{} + req.Params.Name = listDatabasesToolName + res, err := clt.CallTool(t.Context(), req) + require.NoError(t, err) + require.True(t, res.IsError) + + require.Len(t, res.Content, 1) + content := res.Content[0] + require.IsType(t, mcp.TextContent{}, content) + textError := content.(mcp.TextContent).Text + require.Contains(t, textError, EmptyDatabasesListErrorMessage, "expected empty databases error but got: %s", textError) + }) +} + +func assertDatabaseResource(t *testing.T, db *Database, resource mcp.ResourceContents) { + t.Helper() + require.IsType(t, mcp.TextResourceContents{}, resource) + contents := resource.(mcp.TextResourceContents) + var database DatabaseResource + require.Equal(t, databaseResourceMIMEType, contents.MIMEType) + require.NoError(t, yaml.Unmarshal([]byte(contents.Text), &database)) + require.Empty(t, cmp.Diff(buildDatabaseResource(db), database, cmpopts.IgnoreFields(types.Metadata{}, "Namespace"))) +} + +func buildDatabase(t *testing.T, name string) *Database { + t.Helper() + + db, err := types.NewDatabaseV3(types.Metadata{ + Name: name, + Labels: map[string]string{"env": "test"}, + }, types.DatabaseSpecV3{ + Protocol: defaults.ProtocolPostgres, + URI: "localhost:5432", + }) + require.NoError(t, err) + + return &Database{ + DB: db, + ClusterName: "root", + } +} + +func buildClient(t *testing.T, server *RootServer) *mcpclient.Client { + t.Helper() + + clt, err := mcpclient.NewInProcessClient(server.MCPServer) + require.NoError(t, err) + t.Cleanup(func() { clt.Close() }) + require.NoError(t, clt.Start(t.Context())) + + initRequest := mcp.InitializeRequest{} + initRequest.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION + initRequest.Params.ClientInfo = mcp.Implementation{ + Name: "test-client", + Version: "1.0.0", + } + + _, err = clt.Initialize(t.Context(), initRequest) + require.NoError(t, err) + require.NoError(t, clt.Ping(t.Context())) + return clt +} diff --git a/lib/client/db/postgres/mcp/mcp.go b/lib/client/db/postgres/mcp/mcp.go new file mode 100644 index 0000000000000..4e2004df9eb7f --- /dev/null +++ b/lib/client/db/postgres/mcp/mcp.go @@ -0,0 +1,261 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "context" + "encoding/json" + "log/slog" + "net" + "time" + + "github.com/gravitational/trace" + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgxpool" + "github.com/mark3labs/mcp-go/mcp" + + dbmcp "github.com/gravitational/teleport/lib/client/db/mcp" + clientmcp "github.com/gravitational/teleport/lib/client/mcp" + "github.com/gravitational/teleport/lib/defaults" +) + +// queryTool is the run query MCP tool definition. +var queryTool = mcp.NewTool(dbmcp.ToolName(defaults.ProtocolPostgres, "query"), + mcp.WithDescription("Execute SQL query against PostgreSQL database connected using Teleport"), + mcp.WithString(queryToolDatabaseParam, + mcp.Required(), + mcp.Description("Teleport database resource URI where the query will be executed"), + ), + mcp.WithString(queryToolQueryParam, + mcp.Required(), + mcp.Description("PostgresSQL SQL query to execute"), + ), +) + +type database struct { + *dbmcp.Database + pool *pgxpool.Pool +} + +// Server handles PostgreSQL-specific MCP tools requests. +type Server struct { + logger *slog.Logger + databases map[string]*database +} + +// NewServer initializes a PostgreSQL MCP server, creating the database +// configurations and registering Server tools into the root server. +func NewServer(ctx context.Context, cfg *dbmcp.NewServerConfig) (dbmcp.Server, error) { + s := &Server{logger: cfg.Logger, databases: make(map[string]*database)} + + for _, db := range cfg.Databases { + if db.DatabaseUser == "" || db.DatabaseName == "" { + return nil, trace.BadParameter("database %q is missing the username and database name", db.DB.GetName()) + } + + connCfg, err := buildConnConfig(db) + if err != nil { + return nil, trace.Wrap(err) + } + + pool, err := pgxpool.NewWithConfig(ctx, connCfg) + if err != nil { + return nil, trace.BadParameter("failed to parse database %q connection config: %s", db.DB.GetName(), err) + } + + s.databases[db.ResourceURI().WithoutParams().String()] = &database{ + Database: db, + pool: pool, + } + } + + cfg.RootServer.AddTool(queryTool, s.RunQuery) + return s, nil +} + +// Close implements dbmcp.Server. +func (s *Server) Close(context.Context) error { + for _, db := range s.databases { + db.pool.Close() + } + + return nil +} + +// RunQueryResult is the run query tool result. +type RunQueryResult struct { + // Data contains the data returned from the query. It can be empty in case + // the query doesn't return any data. + Data []map[string]any `json:"data"` + // RowsCount number of rows affected by the query or returned as data. + RowsCount int `json:"rowsCount"` + // ErrorMessage if the query wasn't successful, this field contains the + // error message. + ErrorMessage string `json:"error,omitempty"` +} + +// RunQuery tool function used to execute queries on databases. +func (s *Server) RunQuery(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + uri, err := request.RequireString(queryToolDatabaseParam) + if err != nil { + return s.wrapErrorResult(ctx, trace.Wrap(err)) + } + + sql, err := request.RequireString(queryToolQueryParam) + if err != nil { + return s.wrapErrorResult(ctx, trace.Wrap(err)) + } + + db, err := s.getDatabase(uri) + if err != nil { + return s.wrapErrorResult(ctx, err) + } + + // TODO(gabrielcorado): ensure the connection used is consistent for the + // session, making most of its queries to be present in a single audit + // session/recording. + rows, err := db.pool.Query(ctx, sql) + if err != nil { + return s.wrapErrorResult(ctx, err) + } + + // Returned rows are being closed by this function. + result, err := buildQueryResult(rows) + if err != nil { + return s.wrapErrorResult(ctx, err) + } + + return mcp.NewToolResultText(result), nil +} + +func (s *Server) wrapErrorResult(ctx context.Context, toolErr error) (*mcp.CallToolResult, error) { + s.logger.ErrorContext(ctx, "error while querying database", "error", toolErr) + out, err := json.Marshal(RunQueryResult{ErrorMessage: dbmcp.FormatErrorMessage(toolErr).Error()}) + return mcp.NewToolResultError(string(out)), trace.Wrap(err) +} + +// buildQueryResult takes a the response from pgx and converts into a JSON +// format (which will be returned to LLMs). +func buildQueryResult(rows pgx.Rows) (string, error) { + // Just ensure the rows is always closed. It is safe if this is called + // multiple times. + defer rows.Close() + + var data []map[string]any + columns := rows.FieldDescriptions() + + for rows.Next() { + values, err := rows.Values() + if err != nil { + return "", trace.Wrap(err) + } + + item := make(map[string]any, len(values)) + for i, v := range values { + item[columns[i].Name] = v + } + + data = append(data, item) + } + + // Close the rows to finish consuming it. Depending on the its type + // we can only collect the command tag after rows is closed. + rows.Close() + commandTag := rows.CommandTag() + + // Initialize the slice so the resulting JSON will have an empty array + // instead of null. + if len(data) == 0 && commandTag.Select() { + data = []map[string]any{} + } + + out, err := json.Marshal(RunQueryResult{ + Data: data, + RowsCount: int(commandTag.RowsAffected()), + }) + return string(out), trace.Wrap(err) +} + +func (s *Server) getDatabase(uri string) (*database, error) { + if !clientmcp.IsDatabaseResourceURI(uri) { + return nil, dbmcp.WrongDatabaseURIFormatError + } + + db, ok := s.databases[uri] + if !ok { + return nil, dbmcp.DatabaseNotFoundError + } + + return db, nil +} + +func buildConnConfig(db *dbmcp.Database) (*pgxpool.Config, error) { + // No need to provide a valid address here as the Lookup and DialContext + // will handle the connection. + config, err := pgxpool.ParseConfig("postgres://") + if err != nil { + return nil, trace.Wrap(err) + } + + config.MaxConnIdleTime = connectionIdleTime + config.MaxConns = int32(maxConnections) + + config.ConnConfig.LookupFunc = func(ctx context.Context, host string) ([]string, error) { + return db.LookupFunc(ctx, host) + } + config.ConnConfig.DialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) { + return db.DialContextFunc(ctx, network, addr) + } + + config.ConnConfig.User = db.DatabaseUser + config.ConnConfig.Database = db.DatabaseName + config.ConnConfig.ConnectTimeout = defaults.DatabaseConnectTimeout + config.ConnConfig.RuntimeParams = map[string]string{ + applicationNameParamName: applicationNameParamValue, + } + config.ConnConfig.TLSConfig = nil + // Use simple protocol to have a closer behavior to DB REPL and psql. + // + // This also avoids each query being prepared, binded and executed, reducing + // the amount of audit events per query executed. + config.ConnConfig.DefaultQueryExecMode = pgx.QueryExecModeSimpleProtocol + return config, nil +} + +const ( + // queryToolDatabaseParam is the name of the database URI param name from + // query tool. + queryToolDatabaseParam = "database" + // queryToolQueryParam is the name of the query param name from query tool. + queryToolQueryParam = "query" + + // applicationNameParamName defines the application name parameter name. + // + // https://www.postgresql.org/docs/17/libpq-connect.html#LIBPQ-CONNECT-APPLICATION-NAME + applicationNameParamName = "application_name" + // applicationNameParamValue defines the application name parameter value. + applicationNameParamValue = "teleport-mcp" + // connectionIdleTime is the max connection idle time before it gets closed + // automatically. + connectionIdleTime = 1 * time.Minute + // maxConnections defines the max number of concurrent connections the pool + // can have. + // + // Given the current MCP usage, the clients will most likely do one query at + // time, even on multiple sessions. + maxConnections = 1 +) diff --git a/lib/client/db/postgres/mcp/mcp_test.go b/lib/client/db/postgres/mcp/mcp_test.go new file mode 100644 index 0000000000000..9e3936b5a253e --- /dev/null +++ b/lib/client/db/postgres/mcp/mcp_test.go @@ -0,0 +1,225 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "context" + "encoding/json" + "log/slog" + "net" + "testing" + + "github.com/jackc/pgx/v5" + "github.com/jackc/pgx/v5/pgconn" + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/api/types" + dbmcp "github.com/gravitational/teleport/lib/client/db/mcp" + clientmcp "github.com/gravitational/teleport/lib/client/mcp" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/utils/listener" +) + +func TestFormatResult(t *testing.T) { + for name, tc := range map[string]struct { + rows pgx.Rows + expectedResult string + }{ + "query results": { + rows: newMockRows("SELECT 2", []string{"name", "age"}, [][]any{{"Alice", 30}, {"Bob", 31}}), + expectedResult: `{"data":[{"age":30,"name":"Alice"},{"age":31,"name":"Bob"}],"rowsCount":2}`, + }, + "empty query results": { + rows: newMockRows("SELECT 0", []string{}, [][]any{}), + expectedResult: `{"data":[],"rowsCount":0}`, + }, + "non-data results": { + rows: newMockRows("INSERT 1", []string{}, [][]any{}), + expectedResult: `{"data":null,"rowsCount":1}`, + }, + } { + t.Run(name, func(t *testing.T) { + res, err := buildQueryResult(tc.rows) + require.NoError(t, err) + require.Equal(t, tc.expectedResult, res) + }) + } +} + +func TestFormatErrors(t *testing.T) { + // Dummy listener that always drop connections. + listener := listener.NewInMemoryListener() + t.Cleanup(func() { listener.Close() }) + + go func() { + for { + conn, err := listener.Accept() + if err != nil { + return + } + _ = conn.Close() + } + }() + + dbName := "local" + db, err := types.NewDatabaseV3(types.Metadata{ + Name: dbName, + Labels: map[string]string{"env": "test"}, + }, types.DatabaseSpecV3{ + Protocol: defaults.ProtocolPostgres, + URI: "localhost:5432", + }) + require.NoError(t, err) + dbURI := clientmcp.NewDatabaseResourceURI("root", dbName).WithoutParams().String() + + for name, tc := range map[string]struct { + databaseURI string + databases []*dbmcp.Database + expectErrorMessage require.ValueAssertionFunc + }{ + "database not found": { + databaseURI: "teleport://clusters/root/databases/not-found", + expectErrorMessage: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + require.Equal(t, dbmcp.DatabaseNotFoundError.Error(), i1) + }, + }, + "malformed database uri": { + databaseURI: "not-found", + expectErrorMessage: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + require.Equal(t, dbmcp.WrongDatabaseURIFormatError.Error(), i1) + }, + }, + "local proxy rejects connection": { + databaseURI: dbURI, + databases: []*dbmcp.Database{ + &dbmcp.Database{ + DB: db, + ClusterName: "root", + DatabaseUser: "postgres", + DatabaseName: "postgres", + LookupFunc: func(_ context.Context, _ string) (addrs []string, err error) { + return []string{"memory"}, nil + }, + DialContextFunc: listener.DialContext, + }, + }, + expectErrorMessage: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + require.Equal(t, dbmcp.LocalProxyConnectionErrorMessage, i1) + }, + }, + "relogin error": { + databaseURI: dbURI, + databases: []*dbmcp.Database{ + &dbmcp.Database{ + DB: db, + ClusterName: "root", + DatabaseUser: "postgres", + DatabaseName: "postgres", + LookupFunc: func(_ context.Context, _ string) (addrs []string, err error) { + return []string{"memory"}, nil + }, + DialContextFunc: func(ctx context.Context, network, addr string) (net.Conn, error) { + return nil, client.ErrClientCredentialsHaveExpired + }, + }, + }, + expectErrorMessage: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { + require.Equal(t, dbmcp.ReloginRequiredErrorMessage, i1) + }, + }, + } { + t.Run(name, func(t *testing.T) { + logger := slog.New(slog.DiscardHandler) + rootServer := dbmcp.NewRootServer(logger) + srv, err := NewServer(t.Context(), &dbmcp.NewServerConfig{ + Logger: logger, + RootServer: rootServer, + Databases: tc.databases, + }) + require.NoError(t, err) + t.Cleanup(func() { srv.Close(t.Context()) }) + + pgSrv := srv.(*Server) + req := mcp.CallToolRequest{} + req.Params.Arguments = map[string]any{ + queryToolDatabaseParam: tc.databaseURI, + queryToolQueryParam: "SELECT 1", + } + runResult, err := pgSrv.RunQuery(t.Context(), req) + require.NoError(t, err) + + require.True(t, runResult.IsError) + require.Len(t, runResult.Content, 1) + require.IsType(t, mcp.TextContent{}, runResult.Content[0]) + + content := runResult.Content[0].(mcp.TextContent) + var res RunQueryResult + require.NoError(t, json.Unmarshal([]byte(content.Text), &res), "expected result to be in JSON format") + require.Empty(t, res.Data) + tc.expectErrorMessage(t, res.ErrorMessage) + }) + } +} + +func newMockRows(commandTag string, fields []string, rows [][]any) pgx.Rows { + var fds []pgconn.FieldDescription + for _, fieldName := range fields { + fds = append(fds, pgconn.FieldDescription{Name: fieldName}) + } + return &mockRows{ + commandTag: commandTag, + descriptions: fds, + rows: rows, + } +} + +type mockRows struct { + pgx.Rows + + started bool + cursor int + + commandTag string + descriptions []pgconn.FieldDescription + rows [][]any +} + +func (mr *mockRows) FieldDescriptions() []pgconn.FieldDescription { + return mr.descriptions +} + +func (mr *mockRows) Next() bool { + if !mr.started { + mr.started = true + return len(mr.rows) > 0 + } + + mr.cursor += 1 + return len(mr.rows) > mr.cursor +} + +func (mr *mockRows) Values() ([]any, error) { + return mr.rows[mr.cursor], nil +} + +func (mr *mockRows) CommandTag() pgconn.CommandTag { + return pgconn.NewCommandTag(mr.commandTag) +} + +func (mr *mockRows) Close() {} diff --git a/lib/client/local_proxy_middleware.go b/lib/client/local_proxy_middleware.go index 1f6f7bf9622c1..82341b50cf49c 100644 --- a/lib/client/local_proxy_middleware.go +++ b/lib/client/local_proxy_middleware.go @@ -142,7 +142,7 @@ func (c *CertChecker) SetCert(cert tls.Certificate) { // GetOrIssueCert gets the CertChecker's certificate, or issues a new // certificate if the it is invalid (e.g. expired) or missing. -func (c *CertChecker) GetOrIssueCert(ctx context.Context) (tls.Certificate, error) { +func (c *CertChecker) GetOrIssueCert(ctx context.Context) (cert tls.Certificate, err error) { c.certMu.Lock() defer c.certMu.Unlock() @@ -150,7 +150,7 @@ func (c *CertChecker) GetOrIssueCert(ctx context.Context) (tls.Certificate, erro return c.cert, nil } - cert, err := c.certIssuer.IssueCert(ctx) + cert, err = c.certIssuer.IssueCert(ctx) if err != nil { return tls.Certificate{}, trace.Wrap(err) } diff --git a/lib/client/local_proxy_middleware_test.go b/lib/client/local_proxy_middleware_test.go index cfb79e335601e..2a629609f7040 100644 --- a/lib/client/local_proxy_middleware_test.go +++ b/lib/client/local_proxy_middleware_test.go @@ -70,6 +70,11 @@ func TestCertChecker(t *testing.T) { certIssuer.issueErr = trace.BadParameter("failed to issue cert") _, err = certChecker.GetOrIssueCert(ctx) require.ErrorIs(t, err, certIssuer.issueErr, "expected error %v but got %v", certIssuer.issueErr, err) + + // If the problem is solved, the error is clean up. + certIssuer.issueErr = nil + _, err = certChecker.GetOrIssueCert(ctx) + require.NoError(t, err) } func TestLocalCertGenerator(t *testing.T) { diff --git a/lib/client/mcp/claude/config.go b/lib/client/mcp/claude/config.go new file mode 100644 index 0000000000000..6932cdfc0a322 --- /dev/null +++ b/lib/client/mcp/claude/config.go @@ -0,0 +1,328 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package claude + +import ( + "bytes" + "encoding/json" + "io" + "maps" + "os" + "path/filepath" + "runtime" + + "github.com/gravitational/trace" + "github.com/tidwall/pretty" + "github.com/tidwall/sjson" +) + +// DefaultConfigPath returns the default path for the Claude Desktop config. +// +// https://modelcontextprotocol.io/quickstart/user +// +// macOS: ~/Library/Application Support/Claude/claude_desktop_config.json +// Windows: %APPDATA%\Claude\claude_desktop_config.json +func DefaultConfigPath() (string, error) { + switch runtime.GOOS { + case "darwin", "windows": + // os.UserConfigDir: + // On Darwin, it returns $HOME/Library/Application Support. + // On Windows, it returns %AppData%. + configDir, err := os.UserConfigDir() + if err != nil { + return "", trace.ConvertSystemError(err) + } + return filepath.Join(configDir, "Claude", "claude_desktop_config.json"), nil + + default: + // TODO(greedy52) there is no official Claude Desktop for linux yet. The + // unofficial one uses the same path as above. + return "", trace.NotImplemented("Claude Desktop is not supported on OS %s", runtime.GOOS) + } +} + +// GlobalCursorPath returns the default path for Cursor global MCP configuration. +// +// https://docs.cursor.com/context/mcp#configuration-locations +func GlobalCursorPath() (string, error) { + homeDir, err := os.UserHomeDir() + if err != nil { + return "", trace.Wrap(err) + } + + return filepath.Join(homeDir, ".cursor", "mcp.json"), nil +} + +// MCPServer contains details to launch an MCP server. +// +// https://modelcontextprotocol.io/quickstart/user +type MCPServer struct { + // Command specifies the command to execute. + Command string `json:"command"` + // Args specifies the arguments for the command. + Args []string `json:"args,omitempty"` + // Envs specifies extra environment variable. + Envs map[string]string `json:"env,omitempty"` +} + +// AddEnv adds an environment variable. +func (s *MCPServer) AddEnv(name, value string) { + if s.Envs == nil { + s.Envs = map[string]string{} + } + s.Envs[name] = value +} + +// GetEnv gets the value of an environment variable. +func (s *MCPServer) GetEnv(key string) (string, bool) { + if s.Envs == nil { + return "", false + } + value, ok := s.Envs[key] + return value, ok +} + +// Config represents a Claude Desktop config. +// +// Config preserves unknown fields and ordering from the original JSON when +// saving, by using the sjson lib. +// +// Config functions are not thread-safe. +type Config struct { + mcpServers map[string]MCPServer + configData []byte + isOriginalJSONCompact bool +} + +// NewConfig creates an empty config. +func NewConfig() *Config { + return &Config{ + mcpServers: make(map[string]MCPServer), + configData: []byte("{}"), + isOriginalJSONCompact: false, + } +} + +// NewConfigFromJSON creates a config from JSON. +func NewConfigFromJSON(data []byte) (*Config, error) { + config := struct { + MCPServers map[string]MCPServer `json:"mcpServers"` + }{} + if err := json.Unmarshal(data, &config); err != nil { + return nil, trace.Wrap(err, "parsing Claude Desktop config") + } + + if config.MCPServers == nil { + config.MCPServers = map[string]MCPServer{} + } + isOriginalJSONCompact, err := isJSONCompact(data) + if err != nil { + return nil, trace.Wrap(err, "parsing Claude Desktop config") + } + + return &Config{ + mcpServers: config.MCPServers, + configData: data, + isOriginalJSONCompact: isOriginalJSONCompact, + }, nil +} + +// GetMCPServers returns a shallow copy of the MCP servers. +func (c *Config) GetMCPServers() map[string]MCPServer { + return maps.Clone(c.mcpServers) +} + +// PutMCPServer adds a new MCP server or replaces an existing one. +func (c *Config) PutMCPServer(serverName string, server MCPServer) (err error) { + c.mcpServers[serverName] = server + + // We require a custom marshal to improve MCP Resources URI readability when + // it includes query params. By default the encoding/json escapes some + // characters like `&` causing the final URI to be harder to read. + var b bytes.Buffer + enc := json.NewEncoder(&b) + enc.SetEscapeHTML(false) + if err := enc.Encode(server); err != nil { + return trace.Wrap(err) + } + c.configData, err = sjson.SetRawBytes(c.configData, c.mcpServerJSONPath(serverName), b.Bytes()) + return trace.Wrap(err) +} + +// RemoveMCPServer removes an MCP server by name. +func (c *Config) RemoveMCPServer(serverName string) (err error) { + if _, ok := c.mcpServers[serverName]; !ok { + return trace.NotFound("mcp server %v not found", serverName) + } + + delete(c.mcpServers, serverName) + c.configData, err = sjson.DeleteBytes(c.configData, c.mcpServerJSONPath(serverName)) + return trace.Wrap(err) +} + +// FormatJSONOption specifies the option on how to format the JSON output. +type FormatJSONOption string + +const ( + // FormatJSONPretty prettifies the JSON output. + FormatJSONPretty FormatJSONOption = "pretty" + // FormatJSONCompact minifies the JSON output. + FormatJSONCompact FormatJSONOption = "compact" + // FormatJSONNone skips formatting. + FormatJSONNone FormatJSONOption = "none" + // FormatJSONAuto minifies the JSON output if the original JSON is already + // minified. Otherwise, the JSON output is prettified. If the original JSON + // is "{}", the JSON output is also prettified. + FormatJSONAuto FormatJSONOption = "auto" +) + +// Write writes the config to provided writer. +func (c *Config) Write(w io.Writer, format FormatJSONOption) error { + data, err := c.formatConfigData(format) + if err != nil { + return trace.Wrap(err) + } + _, err = w.Write(data) + return trace.Wrap(err) +} + +// FileConfig represents a Config read from a file. +// +// Note that outside changes to the config file after LoadConfigFromFile will be +// ignored when saving. +type FileConfig struct { + *Config + configPath string + configExists bool +} + +// LoadConfigFromFile loads the Claude Desktop's config from the provided path. +func LoadConfigFromFile(configPath string) (*FileConfig, error) { + data, err := os.ReadFile(configPath) + switch { + case os.IsNotExist(err): + return &FileConfig{ + Config: NewConfig(), + configPath: configPath, + configExists: false, + }, nil + + case err != nil: + return nil, trace.Wrap(trace.ConvertSystemError(err), "reading Claude Desktop config") + + default: + config, err := NewConfigFromJSON(data) + if err != nil { + return nil, trace.Wrap(err) + } + + return &FileConfig{ + Config: config, + configPath: configPath, + configExists: true, + }, nil + } +} + +// LoadConfigFromDefaultPath loads the Claude Desktop's config from the default +// path. +func LoadConfigFromDefaultPath() (*FileConfig, error) { + configPath, err := DefaultConfigPath() + if err != nil { + return nil, trace.Wrap(err, "finding Claude Desktop config path") + } + config, err := LoadConfigFromFile(configPath) + return config, trace.Wrap(err) +} + +// LoadConfigFromGlobalCursor loads the Cursor global MCP server configuration. +func LoadConfigFromGlobalCursor() (*FileConfig, error) { + configPath, err := GlobalCursorPath() + if err != nil { + return nil, trace.Wrap(err) + } + + config, err := LoadConfigFromFile(configPath) + return config, trace.Wrap(err) +} + +// Exists returns true if config file exists. +func (c *FileConfig) Exists() bool { + return c.configExists +} + +// Path returns the config file path. +func (c *FileConfig) Path() string { + return c.configPath +} + +// Save saves the updated config to the config path. Format defaults to "auto" +// if empty. +func (c *FileConfig) Save(format FormatJSONOption) error { + // Claude Desktop creates the config with 0644. + file, err := os.OpenFile(c.configPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return trace.ConvertSystemError(err) + } + defer file.Close() + return trace.Wrap(c.Write(file, format)) +} + +func (c *Config) mcpServerJSONPath(serverName string) string { + return "mcpServers." + serverName +} + +func (c *Config) formatConfigData(format FormatJSONOption) ([]byte, error) { + return formatJSON(c.configData, format, c.isOriginalJSONCompact) +} + +func formatJSON(data []byte, format FormatJSONOption, isOriginalCompact bool) ([]byte, error) { + switch format { + case FormatJSONPretty: + // pretty.Pretty is more human-readable than json.Indent. + return pretty.Pretty(data), nil + case FormatJSONCompact: + return pretty.Ugly(data), nil + case FormatJSONNone: + return data, nil + case FormatJSONAuto, "": + if isOriginalCompact { + return pretty.Ugly(data), nil + } + return pretty.Pretty(data), nil + default: + return nil, trace.BadParameter("invalid JSON format option %q", format) + } +} + +func isJSONCompact(data []byte) (bool, error) { + data = bytes.TrimSpace(data) + + // Do not treat empty object as compact. + if bytes.Equal(data, []byte("{}")) { + return false, nil + } + + var buf bytes.Buffer + err := json.Compact(&buf, data) + if err != nil { + return false, trace.Wrap(err) + } + return bytes.Equal(buf.Bytes(), data), nil +} diff --git a/lib/client/mcp/claude/config_test.go b/lib/client/mcp/claude/config_test.go new file mode 100644 index 0000000000000..51f4587fd631d --- /dev/null +++ b/lib/client/mcp/claude/config_test.go @@ -0,0 +1,279 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package claude + +import ( + "bytes" + "os" + "path/filepath" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" +) + +func TestFileConfig_fileNotExists(t *testing.T) { + dir := t.TempDir() + configPath := filepath.Join(dir, "config.json") + + config, err := LoadConfigFromFile(configPath) + require.NoError(t, err) + require.NotNil(t, config) + require.False(t, config.Exists()) + + require.NoError(t, config.PutMCPServer("test", MCPServer{ + Command: "command", + })) + require.NoError(t, config.Save(FormatJSONCompact)) + requireFileWithData(t, configPath, `{"mcpServers":{"test":{"command":"command"}}}`) +} + +func TestFileConfig_sampleFile(t *testing.T) { + const sampleConfigJSON = `{ + "someUnknownField": "someUnknownValue", + "mcpServers": { + "Puppeteer": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-puppeteer"], + "someUnknownField": "someUnknownValue" + }, + "teleport-my-mcp": { + "command": "tsh", + "args": ["mcp", "connect", "my-mcp"], + "env": { + "TELEPORT_HOME": "/tsh-home/" + } + } + } +} +` + var sampleMCPServers = map[string]MCPServer{ + "Puppeteer": { + Command: "npx", + Args: []string{"-y", "@modelcontextprotocol/server-puppeteer"}, + }, + "teleport-my-mcp": { + Command: "tsh", + Args: []string{"mcp", "connect", "my-mcp"}, + Envs: map[string]string{ + "TELEPORT_HOME": "/tsh-home/", + }, + }, + } + + dir := t.TempDir() + configPath := filepath.Join(dir, "config.json") + require.NoError(t, os.WriteFile(configPath, []byte(sampleConfigJSON), 0600)) + + // load + config, err := LoadConfigFromFile(configPath) + require.NoError(t, err) + require.NotNil(t, config) + require.True(t, config.Exists()) + require.Equal(t, configPath, config.Path()) + require.Equal(t, sampleMCPServers, config.GetMCPServers()) + + // remove + require.True(t, trace.IsNotFound(config.RemoveMCPServer("not-found"))) + require.NoError(t, config.RemoveMCPServer("teleport-my-mcp")) + require.NoError(t, config.Save(FormatJSONPretty)) + requireFileWithData(t, configPath, `{ + "someUnknownField": "someUnknownValue", + "mcpServers": { + "Puppeteer": { + "command": "npx", + "args": ["-y", "@modelcontextprotocol/server-puppeteer"], + "someUnknownField": "someUnknownValue" + } + } +} +`) + + // add it back + require.NoError(t, config.PutMCPServer("teleport-my-mcp", sampleMCPServers["teleport-my-mcp"])) + require.NoError(t, config.Save(FormatJSONAuto)) + requireFileWithData(t, configPath, sampleConfigJSON) + + // replace + require.NoError(t, config.PutMCPServer("Puppeteer", MCPServer{ + Command: "custom-script", + })) + require.NoError(t, config.Save("")) + requireFileWithData(t, configPath, `{ + "someUnknownField": "someUnknownValue", + "mcpServers": { + "Puppeteer": { + "command": "custom-script" + }, + "teleport-my-mcp": { + "command": "tsh", + "args": ["mcp", "connect", "my-mcp"], + "env": { + "TELEPORT_HOME": "/tsh-home/" + } + } + } +} +`) +} + +func TestConfig_Write(t *testing.T) { + config := NewConfig() + + mcpServer := MCPServer{ + Command: "command", + } + mcpServer.AddEnv("foo", "bar") + require.NoError(t, config.PutMCPServer("test", mcpServer)) + var buf bytes.Buffer + + require.NoError(t, config.Write(&buf, FormatJSONCompact)) + require.Equal(t, `{"mcpServers":{"test":{"command":"command","env":{"foo":"bar"}}}}`, buf.String()) +} + +func Test_isJSONCompact(t *testing.T) { + tests := []struct { + name string + in string + checkError require.ErrorAssertionFunc + checkIsCompact require.BoolAssertionFunc + }{ + { + name: "bad JSON", + in: "{", + checkError: require.Error, + checkIsCompact: require.False, + }, + { + name: "empty object", + in: "{}", + checkError: require.NoError, + checkIsCompact: require.False, + }, + { + name: "compact", + in: `{"a":"b"}`, + checkError: require.NoError, + checkIsCompact: require.True, + }, + { + name: "not compact", + in: `{ + "a": "b" +}`, + checkError: require.NoError, + checkIsCompact: require.False, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + isCompact, err := isJSONCompact([]byte(tt.in)) + tt.checkError(t, err) + tt.checkIsCompact(t, isCompact) + }) + } +} + +func Test_formatJSON(t *testing.T) { + notFormatted := `{"a": "b"}` + compact := `{"a":"b"}` + pretty := `{ + "a": "b" +} +` + tests := []struct { + name string + in string + format FormatJSONOption + isOriginalCompact bool + out string + }{ + { + name: "to compact", + in: notFormatted, + format: FormatJSONCompact, + out: compact, + }, + { + name: "to pretty", + in: notFormatted, + format: FormatJSONPretty, + out: pretty, + }, + { + name: "none", + in: notFormatted, + format: FormatJSONNone, + out: notFormatted, + }, + { + name: "auto compact", + in: notFormatted, + format: FormatJSONAuto, + isOriginalCompact: true, + out: compact, + }, + { + name: "auto pretty", + in: notFormatted, + format: FormatJSONAuto, + isOriginalCompact: false, + out: pretty, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + formatted, err := formatJSON([]byte(tt.in), tt.format, tt.isOriginalCompact) + require.NoError(t, err) + require.Equal(t, tt.out, string(formatted)) + }) + } +} + +// TestPrettyResourceURIs given a MCP server that includes a Resource URI as +// arguments it must encode and output those URIs in a readable format. +func TestReadableResourceURIs(t *testing.T) { + for name, uri := range map[string]string{ + "uri with query params": "teleport://clusters/root/databases/pg", + "uri without query params": "teleport://clusters/root/databases/pg?dbName=postgres&dbUser=readonly", + "random uri with params": "teleport://random?hello=world&random=resource", + } { + t.Run(name, func(t *testing.T) { + config := NewConfig() + mcpServer := MCPServer{ + Command: "command", + Args: []string{uri}, + } + require.NoError(t, config.PutMCPServer("test", mcpServer)) + + var buf bytes.Buffer + require.NoError(t, config.Write(&buf, FormatJSONCompact)) + require.Contains(t, buf.String(), uri) + }) + } +} + +func requireFileWithData(t *testing.T, path string, want string) { + t.Helper() + read, err := os.ReadFile(path) + require.NoError(t, err) + require.Equal(t, want, string(read)) +} diff --git a/lib/client/mcp/uri.go b/lib/client/mcp/uri.go new file mode 100644 index 0000000000000..c9337096d73a2 --- /dev/null +++ b/lib/client/mcp/uri.go @@ -0,0 +1,202 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "net/url" + "strings" + + "github.com/gravitational/trace" + "github.com/ucarion/urlpath" +) + +var ( + // clusterURITemplate is the base cluster template. + clusterURITemplate = urlpath.New("/clusters/:cluster/*") + // databaseURITemplate template used to parse database resource URIs. + databaseURITemplate = urlpath.New("/clusters/:cluster/databases/:dbName") +) + +const ( + // resourceScheme scheme used by Teleport MCP resources. + resourceScheme = "teleport" + + // databaseNameQueryParamName is the query param name used for database + // name. + databaseNameQueryParamName = "dbName" + // databaseUserQueryParamName is the query param name used for database + // user. + databaseUserQueryParamName = "dbUser" +) + +// ResourceURI is a Teleport MCP resource URI. +// +// Query parameters are not covered on the MCP spec but we use them to provide +// additional information about the resource connection. For example, if the +// resource requires a "username" value, this value is provided using the query +// params. +// +// https://modelcontextprotocol.io/docs/concepts/resources#resource-uris +type ResourceURI struct { + url url.URL +} + +// ParseResourceURI parses a raw resource URI into a Teleport URI. +func ParseResourceURI(uri string) (*ResourceURI, error) { + parsedURL, err := url.Parse(uri) + if err != nil { + return nil, trace.BadParameter("invalid resource URI format: %s", err) + } + + if parsedURL.Scheme != resourceScheme { + return nil, trace.BadParameter("invalid URI scheme, must be %q", resourceScheme) + } + + return &ResourceURI{url: *parsedURL}, nil +} + +// databaseParams represents the connect params for the database resource. +type databaseParams struct { + // user is the user to log in as. + user string + // name is the name to log in to. + name string +} + +// databaseParam is a param function used for setting database connect params. +type databaseParam func(*databaseParams) + +// WithDatabaseUser configures database params with database user. +func WithDatabaseUser(user string) databaseParam { + return func(dp *databaseParams) { + dp.user = user + } +} + +// WithDatabaseUser configures database params with database name. +func WithDatabaseName(name string) databaseParam { + return func(dp *databaseParams) { + dp.name = name + } +} + +// NewDatabaseResourceURI creates a new database resource URI with connect +// params. +func NewDatabaseResourceURI(cluster string, databaseName string, opts ...databaseParam) ResourceURI { + params := &databaseParams{} + for _, opt := range opts { + opt(params) + } + + pathWithHost, _ := databaseURITemplate.Build(urlpath.Match{ + Params: map[string]string{ + "cluster": cluster, + "dbName": databaseName, + }, + }) + + values := url.Values{} + if params.user != "" { + values.Add(databaseUserQueryParamName, params.user) + } + if params.name != "" { + values.Add(databaseNameQueryParamName, params.name) + } + + return ResourceURI{ + url: url.URL{ + Scheme: resourceScheme, + Path: strings.TrimPrefix(pathWithHost, "/"), + RawQuery: values.Encode(), + }, + } +} + +// GetDatabaseServiceName returns the Teleport cluster name. +func (u ResourceURI) GetClusterName() string { + if match, ok := clusterURITemplate.Match(u.path()); ok { + return match.Params["cluster"] + } + + return "" +} + +// GetDatabaseServiceName returns the database service name of the resource. +// Returns empty if the resource is not a database. +func (u ResourceURI) GetDatabaseServiceName() string { + if match, ok := databaseURITemplate.Match(u.path()); ok { + return match.Params["dbName"] + } + + return "" +} + +// GetDatabaseUser returns the database username param of the resource. +// Returns empty if the resource is not a database. +func (u ResourceURI) GetDatabaseUser() string { + return u.url.Query().Get(databaseUserQueryParamName) +} + +// GetDatabaseName returns the database name param of the resource. +// Returns empty if the resource is not a database. +func (u ResourceURI) GetDatabaseName() string { + return u.url.Query().Get(databaseNameQueryParamName) +} + +// IsDatabase returns true if the resource is a database. +func (u ResourceURI) IsDatabase() bool { + return u.GetDatabaseServiceName() != "" +} + +// String returns the string representation of the resource URI. +func (u ResourceURI) String() string { + return u.url.String() +} + +// WithoutParams returns a copy of the resource without additional parameters. +func (u ResourceURI) WithoutParams() ResourceURI { + copyURL := u.url + copyURL.RawQuery = "" + return ResourceURI{url: copyURL} +} + +// Equal returns true if both resources represent the same Teleport resource. +func (u ResourceURI) Equal(b ResourceURI) bool { + return u.String() == b.String() +} + +// path returns the resource URI full path. We must include the hostname as the +// templates will also include them on the matching. +func (u ResourceURI) path() string { + return "/" + u.url.Hostname() + u.url.Path +} + +// IsDatabase returns true if the URI is a database resource. +func IsDatabaseResourceURI(uri string) bool { + parsed, err := ParseResourceURI(uri) + if err != nil { + return false + } + + return parsed.IsDatabase() +} + +var ( + // SampleDatabaseResource contains a sample full resource URI. This can be + // used on descriptions to show how a database resource URI looks like. + SampleDatabaseResource = NewDatabaseResourceURI("example-cluster", "myDatabase") +) diff --git a/lib/client/mcp/uri_test.go b/lib/client/mcp/uri_test.go new file mode 100644 index 0000000000000..cf8c3df4f5d72 --- /dev/null +++ b/lib/client/mcp/uri_test.go @@ -0,0 +1,144 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package mcp + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestDatabaseResourceURI(t *testing.T) { + for name, tc := range map[string]struct { + uri string + expectError bool + expectedDatabase bool + expectedServiceName string + expectedDatabaseName string + expectedDatabaseUser string + expectedClusterName string + }{ + "valid database": { + uri: "teleport://clusters/default/databases/pg?dbName=database&dbUser=user", + expectedDatabase: true, + expectedServiceName: "pg", + expectedDatabaseName: "database", + expectedDatabaseUser: "user", + expectedClusterName: "default", + }, + "valid database without params": { + uri: "teleport://clusters/default/databases/pg", + expectedDatabase: true, + expectedServiceName: "pg", + expectedDatabaseName: "", + expectedDatabaseUser: "", + expectedClusterName: "default", + }, + "random resource": { + uri: "teleport://clusters/default/random/random-resource", + expectedDatabase: false, + expectedServiceName: "", + expectedDatabaseName: "", + expectedDatabaseUser: "", + expectedClusterName: "default", + }, + "generated uri with params": { + uri: NewDatabaseResourceURI("default", "db", WithDatabaseUser("user"), WithDatabaseName("name")).String(), + expectedDatabase: true, + expectedServiceName: "db", + expectedDatabaseName: "name", + expectedDatabaseUser: "user", + expectedClusterName: "default", + }, + "generated uri without params": { + uri: NewDatabaseResourceURI("default", "db", WithDatabaseUser("user"), WithDatabaseName("name")).WithoutParams().String(), + expectedDatabase: true, + expectedServiceName: "db", + expectedDatabaseName: "", + expectedDatabaseUser: "", + expectedClusterName: "default", + }, + "invalid schema": { + uri: "http://databases/database", + expectError: true, + }, + "invalid uri": { + uri: "random-value", + expectError: true, + }, + } { + t.Run(name, func(t *testing.T) { + uri, err := ParseResourceURI(tc.uri) + if tc.expectError { + require.Error(t, err) + return + } + + require.NotNil(t, uri) + fmt.Println(tc.uri) + require.Equal(t, tc.expectedDatabase, IsDatabaseResourceURI(tc.uri)) + require.Equal(t, tc.expectedDatabase, uri.IsDatabase()) + require.Equal(t, tc.expectedServiceName, uri.GetDatabaseServiceName()) + require.Equal(t, tc.expectedDatabaseName, uri.GetDatabaseName()) + require.Equal(t, tc.expectedDatabaseUser, uri.GetDatabaseUser()) + require.Equal(t, tc.expectedClusterName, uri.GetClusterName()) + }) + } +} + +func TestEqualResourceURI(t *testing.T) { + randomType, err := ParseResourceURI("teleport://random/name") + require.NoError(t, err) + + for name, tc := range map[string]struct { + a ResourceURI + b ResourceURI + expectedResult bool + }{ + "same resources": { + a: NewDatabaseResourceURI("cluster", "pg"), + b: NewDatabaseResourceURI("cluster", "pg"), + expectedResult: true, + }, + "same resources, different params": { + a: NewDatabaseResourceURI("cluster", "pg", WithDatabaseUser("readonly"), WithDatabaseName("postgres")).WithoutParams(), + b: NewDatabaseResourceURI("cluster", "pg", WithDatabaseUser("rw"), WithDatabaseName("random")).WithoutParams(), + expectedResult: true, + }, + "same resource type, different resources": { + a: NewDatabaseResourceURI("cluster", "pg"), + b: NewDatabaseResourceURI("cluster", "random"), + expectedResult: false, + }, + "different resource type, same name": { + a: *randomType, + b: NewDatabaseResourceURI("cluster", "pg"), + expectedResult: false, + }, + "same resources compare params": { + a: NewDatabaseResourceURI("cluster", "pg", WithDatabaseUser("rw"), WithDatabaseName("postgres")), + b: NewDatabaseResourceURI("cluster", "pg", WithDatabaseUser("rw"), WithDatabaseName("postgres")), + expectedResult: true, + }, + } { + t.Run(name, func(t *testing.T) { + require.Equal(t, tc.expectedResult, tc.a.Equal(tc.b)) + require.Equal(t, tc.expectedResult, tc.b.Equal(tc.a)) + }) + } +} diff --git a/lib/config/configuration.go b/lib/config/configuration.go index f84e23e5f56d4..0533852101abf 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -143,6 +143,9 @@ type CommandLineFlags struct { // AppPublicAddr is the public address of the application to proxy. AppPublicAddr string + // MCPDemoServer enables the "Teleport Demo" MCP server. + MCPDemoServer bool + // DatabaseName is the name of the database to proxy. DatabaseName string // DatabaseDescription is a free-form database description. @@ -1911,6 +1914,9 @@ func applyAppsConfig(fc *FileConfig, cfg *servicecfg.Config) error { // Enable debugging application if requested. cfg.Apps.DebugApp = fc.Apps.DebugApp + // Enable the "Teleport Demo" MCP server if requested. + cfg.Apps.MCPDemoServer = fc.Apps.MCPDemoServer + // Configure resource watcher selectors if present. for _, matcher := range fc.Apps.ResourceMatchers { if matcher.AWS.AssumeRoleARN != "" { @@ -1995,6 +2001,14 @@ func applyAppsConfig(fc *FileConfig, cfg *servicecfg.Config) error { } } + if application.MCP != nil { + app.MCP = &types.MCP{ + Command: application.MCP.Command, + Args: application.MCP.Args, + RunAsHostUser: application.MCP.RunAsHostUser, + } + } + if err := app.CheckAndSetDefaults(); err != nil { return trace.Wrap(err) } @@ -2379,7 +2393,7 @@ func Configure(clf *CommandLineFlags, cfg *servicecfg.Config, legacyAppFlags boo // If this process is trying to join a cluster as an application service, // make sure application name and URI are provided. if slices.Contains(splitRoles(clf.Roles), defaults.RoleApp) { - if (clf.AppName == "") && (clf.AppURI == "" && clf.AppCloud == "") { + if (clf.AppName == "") && (clf.AppURI == "" && clf.AppCloud == "" && !clf.MCPDemoServer) { // TODO: remove legacyAppFlags once `teleport start --app-name` is removed. if legacyAppFlags { return trace.BadParameter("application name (--app-name) and URI (--app-uri) flags are both required to join application proxy to the cluster") @@ -2387,14 +2401,14 @@ func Configure(clf *CommandLineFlags, cfg *servicecfg.Config, legacyAppFlags boo return trace.BadParameter("to join application proxy to the cluster provide application name (--name) and either URI (--uri) or Cloud type (--cloud)") } - if clf.AppName == "" { + if clf.AppName == "" && !clf.MCPDemoServer { if legacyAppFlags { return trace.BadParameter("application name (--app-name) is required to join application proxy to the cluster") } return trace.BadParameter("to join application proxy to the cluster provide application name (--name)") } - if clf.AppURI == "" && clf.AppCloud == "" { + if clf.AppName != "" && clf.AppURI == "" && clf.AppCloud == "" { if legacyAppFlags { return trace.BadParameter("URI (--app-uri) flag is required to join application proxy to the cluster") } @@ -2402,6 +2416,13 @@ func Configure(clf *CommandLineFlags, cfg *servicecfg.Config, legacyAppFlags boo } } + // Enable the "Teleport Demo" MCP server if requested. Make sure application + // service is enabled for proxying MCP servers. + if clf.MCPDemoServer { + cfg.Apps.MCPDemoServer = true + cfg.Apps.Enabled = true + } + // If application name was specified on command line, add to file // configuration where it will be validated. if clf.AppName != "" { diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index 0731e145f9f5e..98205108daf3e 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -448,6 +448,15 @@ func TestConfigReading(t *testing.T) { StaticLabels: Labels, DynamicLabels: CommandLabels, }, + { + Name: "mcp-everything", + StaticLabels: Labels, + MCP: &MCP{ + Command: "docker", + RunAsHostUser: "docker", + Args: []string{"run", "-i", "--rm", "mcp/everything"}, + }, + }, }, ResourceMatchers: []ResourceMatcher{ { @@ -1645,6 +1654,15 @@ func makeConfigFixture() string { StaticLabels: Labels, DynamicLabels: CommandLabels, }, + { + Name: "mcp-everything", + StaticLabels: Labels, + MCP: &MCP{ + Command: "docker", + Args: []string{"run", "-i", "--rm", "mcp/everything"}, + RunAsHostUser: "docker", + }, + }, } conf.Apps.ResourceMatchers = []ResourceMatcher{ { @@ -2556,7 +2574,10 @@ func TestAppsCLF(t *testing.T) { inAppURI string inAppCloud string inLegacyAppFlags bool + inMCPDemoServer bool + outApps []servicecfg.App + outMCPDemoServer bool requireError require.ErrorAssertionFunc }{ { @@ -2691,20 +2712,32 @@ func TestAppsCLF(t *testing.T) { require.ErrorContains(t, err, "missing application \"foo\" URI") }, }, + { + desc: "mcp demo server", + inRoles: defaults.RoleApp, + inAppName: "", + inAppURI: "", + inMCPDemoServer: true, + outApps: nil, + outMCPDemoServer: true, + requireError: require.NoError, + }, } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { clf := CommandLineFlags{ - Roles: tt.inRoles, - AppName: tt.inAppName, - AppURI: tt.inAppURI, - AppCloud: tt.inAppCloud, + Roles: tt.inRoles, + AppName: tt.inAppName, + AppURI: tt.inAppURI, + AppCloud: tt.inAppCloud, + MCPDemoServer: tt.inMCPDemoServer, } cfg := servicecfg.MakeDefaultConfig() err := Configure(&clf, cfg, tt.inLegacyAppFlags) tt.requireError(t, err) require.Equal(t, tt.outApps, cfg.Apps.Apps) + require.Equal(t, tt.outMCPDemoServer, cfg.Apps.MCPDemoServer) }) } } diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index a3af570d7b200..51e789624bb2d 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -183,6 +183,8 @@ type SampleFlags struct { AppName string // AppURI is the internal address of the application to proxy AppURI string + // MCPDemoServer enables the "Teleport Demo" MCP server. + MCPDemoServer bool // NodeLabels is list of labels in the format `foo=bar,baz=bax` to add to newly created nodes. NodeLabels string // CAPin is the SKPI hash of the CA used to verify the Auth Server. Can be @@ -409,17 +411,24 @@ func makeSampleProxyConfig(conf *servicecfg.Config, flags SampleFlags, enabled b func makeSampleAppsConfig(conf *servicecfg.Config, flags SampleFlags, enabled bool) (Apps, error) { var apps Apps // assume users want app role if they added app name and/or uri but didn't add app role - if enabled || flags.AppURI != "" || flags.AppName != "" { - if flags.AppURI == "" || flags.AppName == "" { - return Apps{}, trace.BadParameter("please provide both --app-name and --app-uri") - } - + if enabled || flags.AppURI != "" || flags.AppName != "" || flags.MCPDemoServer { apps.EnabledFlag = "yes" - apps.Apps = []*App{ - { - Name: flags.AppName, - URI: flags.AppURI, - }, + apps.MCPDemoServer = flags.MCPDemoServer + + switch { + case flags.AppURI != "" && flags.AppName != "": + apps.Apps = []*App{ + { + Name: flags.AppName, + URI: flags.AppURI, + }, + } + + case flags.MCPDemoServer && flags.AppURI == "" && flags.AppName == "": + // This is ok if only MCPDemoServer is set. + + default: + return Apps{}, trace.BadParameter("please provide both --app-name and --app-uri") } } @@ -2082,6 +2091,9 @@ type Apps struct { // DebugApp turns on a header debugging application. DebugApp bool `yaml:"debug_app"` + // MCPDemoServer enables the "Teleport Demo" MCP server. + MCPDemoServer bool `yaml:"mcp_demo_server"` + // Apps is a list of applications that will be run by this service. Apps []*App `yaml:"apps"` @@ -2143,6 +2155,9 @@ type App struct { // If this field is not empty, URI is expected to contain no port number and start with the tcp // protocol. TCPPorts []PortRange `yaml:"tcp_ports,omitempty"` + + // MCP contains MCP server-related configurations. + MCP *MCP `yaml:"mcp,omitempty"` } // CORS represents the configuration for Cross-Origin Resource Sharing (CORS) @@ -2201,6 +2216,17 @@ type PortRange struct { EndPort int `yaml:"end_port,omitempty"` } +// MCP contains MCP server-related configurations. +type MCP struct { + // Command to launch stdio-based MCP servers. + Command string `yaml:"command,omitempty"` + // Args to execute with the command. + Args []string `yaml:"args,omitempty"` + // RunAsHostUser is the host user account under which the command will be + // executed. Required for stdio-based MCP servers. + RunAsHostUser string `yaml:"run_as_host_user,omitempty"` +} + // Proxy is a `proxy_service` section of the config file: type Proxy struct { // Service is a generic service configuration section diff --git a/lib/config/fileconf_test.go b/lib/config/fileconf_test.go index 4e49e04aef47d..2e8822bdb6775 100644 --- a/lib/config/fileconf_test.go +++ b/lib/config/fileconf_test.go @@ -1287,6 +1287,49 @@ func TestMakeSampleFileConfig(t *testing.T) { require.Equal(t, "yes", fc.Apps.EnabledFlag) }) + t.Run("App role with MCP Demo server", func(t *testing.T) { + fc, err := MakeSampleFileConfig(SampleFlags{ + Roles: "app", + MCPDemoServer: true, + }) + require.NoError(t, err) + require.Equal(t, "no", fc.SSH.EnabledFlag) + require.Equal(t, "no", fc.Proxy.EnabledFlag) + require.Equal(t, "no", fc.Auth.EnabledFlag) + require.Equal(t, "yes", fc.Apps.EnabledFlag) + require.True(t, fc.Apps.MCPDemoServer) + }) + + t.Run("App name and MCP Demo Server", func(t *testing.T) { + _, err := MakeSampleFileConfig(SampleFlags{ + Roles: "app", + AppURI: "localhost:8080", + MCPDemoServer: true, + }) + require.Error(t, err) + + _, err = MakeSampleFileConfig(SampleFlags{ + Roles: "app", + AppName: "nginx", + MCPDemoServer: true, + }) + require.Error(t, err) + + fc, err := MakeSampleFileConfig(SampleFlags{ + Roles: "app", + AppURI: "localhost:8080", + AppName: "nginx", + MCPDemoServer: true, + }) + require.NoError(t, err) + + require.Equal(t, "no", fc.SSH.EnabledFlag) + require.Equal(t, "no", fc.Proxy.EnabledFlag) + require.Equal(t, "no", fc.Auth.EnabledFlag) + require.Equal(t, "yes", fc.Apps.EnabledFlag) + require.True(t, fc.Apps.MCPDemoServer) + }) + t.Run("Proxy role", func(t *testing.T) { fc, err := MakeSampleFileConfig(SampleFlags{ Roles: "proxy", diff --git a/lib/events/api.go b/lib/events/api.go index 6910af01d87ae..8d69ca79da49d 100644 --- a/lib/events/api.go +++ b/lib/events/api.go @@ -913,6 +913,17 @@ const ( // HealthCheckConfigDeleteEvent is emitted when a health check config // resource is deleted. HealthCheckConfigDeleteEvent = "health_check_config.delete" + + // MCPSessionStartEvent is emitted when a user starts a MCP session. + MCPSessionStartEvent = "mcp.session.start" + // MCPSessionEndEvent is emitted when an MCP session ends. + MCPSessionEndEvent = "mcp.session.end" + // MCPSessionRequestEvent is emitted when a request is sent by client during + // a MCP session. + MCPSessionRequestEvent = "mcp.session.request" + // MCPSessionNotificationEvent is emitted when a notification is sent by + // client during a MCP session. + MCPSessionNotificationEvent = "mcp.session.notification" ) // Add an entry to eventsMap in lib/events/events_test.go when you add diff --git a/lib/events/codes.go b/lib/events/codes.go index c4478c437de43..5e77b4758c017 100644 --- a/lib/events/codes.go +++ b/lib/events/codes.go @@ -739,6 +739,19 @@ const ( // sync attempt failure code. AWSICResourceSyncFailureCode = "TAIC001E" + // MCPSessionStartCode is the event code for mcp.session.start. + MCPSessionStartCode = "TMCP001I" + // MCPSessionEndCode is the event code for mcp.session.end. + MCPSessionEndCode = "TMCP002I" + // MCPSessionRequestCode is the event code for mcp.session.request. + MCPSessionRequestCode = "TMCP003I" + // MCPSessionRequestFailureCode is the event code for mcp.session.request + // when the request is denied by Teleport. + MCPSessionRequestFailureCode = "TMCP003E" + // MCPSessionNotificationCode is the event code for + // mcp.session.notification. + MCPSessionNotificationCode = "TMCP004I" + // UnknownCode is used when an event of unknown type is encountered. UnknownCode = apievents.UnknownCode ) diff --git a/lib/events/dynamic.go b/lib/events/dynamic.go index cbf0f1382d977..73b2c24c3ff4a 100644 --- a/lib/events/dynamic.go +++ b/lib/events/dynamic.go @@ -520,6 +520,15 @@ func FromEventFields(fields EventFields) (events.AuditEvent, error) { case SigstorePolicyDeleteEvent: e = &events.SigstorePolicyDelete{} + case MCPSessionStartEvent: + e = &events.MCPSessionStart{} + case MCPSessionEndEvent: + e = &events.MCPSessionEnd{} + case MCPSessionRequestEvent: + e = &events.MCPSessionRequest{} + case MCPSessionNotificationEvent: + e = &events.MCPSessionNotification{} + default: slog.ErrorContext(context.Background(), "Attempted to convert dynamic event of unknown type into protobuf event.", "event_type", eventType) unknown := &events.Unknown{} diff --git a/lib/service/service.go b/lib/service/service.go index fa61f46dac4ed..37174a9ca891e 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -162,6 +162,7 @@ import ( "github.com/gravitational/teleport/lib/srv/db" "github.com/gravitational/teleport/lib/srv/desktop" "github.com/gravitational/teleport/lib/srv/ingress" + "github.com/gravitational/teleport/lib/srv/mcp" "github.com/gravitational/teleport/lib/srv/regular" "github.com/gravitational/teleport/lib/srv/transport/transportv1" "github.com/gravitational/teleport/lib/sshutils" @@ -5121,11 +5122,16 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { // Register ALPN handler that will be accepting connections for plain // TCP applications. + // Use the same handler for MCP protocols, for now. if alpnRouter != nil { alpnRouter.Add(alpnproxy.HandlerDecs{ MatchFunc: alpnproxy.MatchByProtocol(alpncommon.ProtocolTCP), Handler: webServer.HandleConnection, }) + alpnRouter.Add(alpnproxy.HandlerDecs{ + MatchFunc: alpnproxy.MatchByProtocol(alpncommon.ProtocolMCP), + Handler: webServer.HandleConnection, + }) } var peerAddrString string @@ -6122,6 +6128,7 @@ func (process *TeleportProcess) initApps() { // "app_service" section, that is considered enabling "app_service". if len(process.Config.Apps.Apps) == 0 && !process.Config.Apps.DebugApp && + !process.Config.Apps.MCPDemoServer && len(process.Config.Apps.ResourceMatchers) == 0 { return } @@ -6250,6 +6257,7 @@ func (process *TeleportProcess) initApps() { UseAnyProxyPublicAddr: app.UseAnyProxyPublicAddr, CORS: makeApplicationCORS(app.CORS), TCPPorts: makeApplicationTCPPorts(app.TCPPorts), + MCP: app.MCP, }) if err != nil { return trace.Wrap(err) @@ -6258,6 +6266,14 @@ func (process *TeleportProcess) initApps() { applications = append(applications, a) } + if process.Config.Apps.MCPDemoServer { + if mcpDemoServer, err := mcp.NewDemoServerApp(); err != nil { + logger.ErrorContext(process.ExitContext(), "Failed to create MCP demo server app") + } else { + applications = append(applications, mcpDemoServer) + } + } + lockWatcher, err := services.NewLockWatcher(process.ExitContext(), services.LockWatcherConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentApp, @@ -6327,6 +6343,7 @@ func (process *TeleportProcess) initApps() { ConnectionMonitor: connMonitor, ServiceComponent: teleport.ComponentApp, Logger: logger, + MCPDemoServer: process.Config.Apps.MCPDemoServer, }) if err != nil { return trace.Wrap(err) diff --git a/lib/service/service_test.go b/lib/service/service_test.go index e3ecc8f09a77c..13b0e617cf159 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -833,6 +833,7 @@ func TestSetupProxyTLSConfig(t *testing.T) { "h2", "acme-tls/1", "teleport-tcp-ping", + "teleport-mcp-ping", "teleport-postgres-ping", "teleport-mysql-ping", "teleport-mongodb-ping", @@ -853,6 +854,7 @@ func TestSetupProxyTLSConfig(t *testing.T) { "teleport-proxy-ssh-grpc", "teleport-proxy-grpc", "teleport-proxy-grpc-mtls", + "teleport-mcp", "teleport-postgres", "teleport-mysql", "teleport-mongodb", @@ -873,6 +875,7 @@ func TestSetupProxyTLSConfig(t *testing.T) { acmeEnabled: false, wantNextProtos: []string{ "teleport-tcp-ping", + "teleport-mcp-ping", "teleport-postgres-ping", "teleport-mysql-ping", "teleport-mongodb-ping", @@ -896,6 +899,7 @@ func TestSetupProxyTLSConfig(t *testing.T) { "teleport-proxy-ssh-grpc", "teleport-proxy-grpc", "teleport-proxy-grpc-mtls", + "teleport-mcp", "teleport-postgres", "teleport-mysql", "teleport-mongodb", diff --git a/lib/service/servicecfg/app.go b/lib/service/servicecfg/app.go index 28f843ed7b0c1..e065181c5abdc 100644 --- a/lib/service/servicecfg/app.go +++ b/lib/service/servicecfg/app.go @@ -43,6 +43,9 @@ type AppsConfig struct { // DebugApp enabled a header dumping debugging application. DebugApp bool + // MCPDemoServer enables the "Teleport Demo" MCP server. + MCPDemoServer bool + // Apps is the list of applications that are being proxied. Apps []App @@ -108,6 +111,9 @@ type App struct { // If this field is not empty, URI is expected to contain no port number and start with the tcp // protocol. TCPPorts []PortRange + + // MCP contains MCP server-related configurations. + MCP *types.MCP } // CORS represents the configuration for Cross-Origin Resource Sharing (CORS) @@ -156,9 +162,12 @@ func (a *App) CheckAndSetDefaults() error { return trace.BadParameter("missing application name") } if a.URI == "" { - if a.Cloud != "" { + switch { + case a.Cloud != "": a.URI = fmt.Sprintf("cloud://%v", a.Cloud) - } else { + case a.MCP != nil && a.MCP.Command != "": + a.URI = types.SchemaMCPStdio + default: return trace.BadParameter("missing application %q URI", a.Name) } } diff --git a/lib/services/access_checker.go b/lib/services/access_checker.go index f60aef7860f61..ad4f6e809a2b8 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -274,6 +274,10 @@ type AccessChecker interface { // EnumerateDatabaseNames specializes EnumerateEntities to enumerate db_names. EnumerateDatabaseNames(database types.Database, extraNames ...string) EnumerationResult + // EnumerateMCPTools specializes EnumerateEntities to enumerate mcp.tools. + // mcp.tools support regexes and blobs so those expressions are returned. + EnumerateMCPTools(app types.Application) EnumerationResult + // GetAllowedLoginsForResource returns all of the allowed logins for the passed resource. // // Supports the following resource types: @@ -826,6 +830,26 @@ func (a *accessChecker) EnumerateDatabaseNames(database types.Database, extraNam return a.EnumerateEntities(database, listFn, newMatcher, extraNames...) } +// EnumerateMCPTools specializes EnumerateEntities to enumerate mcp.tools. +func (a *accessChecker) EnumerateMCPTools(app types.Application) EnumerationResult { + listFn := func(role types.Role, condition types.RoleConditionType) []string { + if mcpSpec := role.GetMCPPermissions(condition); mcpSpec != nil { + return mcpSpec.Tools + } + return nil + } + // Do not use MCPToolMatcher. We are enumerating the expressions. + newMatcher := func(toolRegex string) RoleMatcher { + return RoleMatcherFunc(func(role types.Role, condition types.RoleConditionType) (bool, error) { + if mcpSpec := role.GetMCPPermissions(condition); mcpSpec != nil { + return slices.Contains(mcpSpec.Tools, toolRegex), nil + } + return false, nil + }) + } + return a.EnumerateEntities(app, listFn, newMatcher) +} + // roleEntitiesListFn is used for listing a role's allowed/denied entities. type roleEntitiesListFn func(types.Role, types.RoleConditionType) []string @@ -1345,6 +1369,9 @@ func AccessInfoFromLocalTLSIdentity(identity tlsca.Identity, access UserGetter) // empty traits are a valid use case in standard certs, // so we only check for whether roles are empty. if len(identity.Groups) == 0 { + if access == nil { + return nil, trace.BadParameter("UserGetter not provided") + } u, err := access.GetUser(context.TODO(), identity.Username, false) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/services/access_checker_test.go b/lib/services/access_checker_test.go index 17e7de5211b1c..e8fbb4e30f354 100644 --- a/lib/services/access_checker_test.go +++ b/lib/services/access_checker_test.go @@ -990,3 +990,78 @@ func TestIdentityCenterAccountAccessRequestMatcher(t *testing.T) { }) } } + +func TestAccessChecker_EnumerateMCPTools(t *testing.T) { + roleEmptyTools := newRole(func(rv *types.RoleV6) { + rv.SetName("empty") + rv.SetAppLabels(types.Allow, types.Labels{types.Wildcard: []string{types.Wildcard}}) + }) + roleNoLabelsMatch := newRole(func(rv *types.RoleV6) { + rv.SetName("not-match") + rv.SetAppLabels(types.Allow, types.Labels{"env": []string{"prod"}}) + rv.SetMCPPermissions(types.Allow, &types.MCPPermissions{ + Tools: []string{"bar"}, + }) + }) + roleAllowWildcard := newRole(func(rv *types.RoleV6) { + rv.SetName("dev") + rv.SetAppLabels(types.Allow, types.Labels{"env": []string{"dev"}}) + rv.SetMCPPermissions(types.Allow, &types.MCPPermissions{ + Tools: []string{"*"}, + }) + }) + roleExplicitDeny := newRole(func(rv *types.RoleV6) { + rv.SetName("deny-bar") + rv.SetAppLabels(types.Allow, types.Labels{types.Wildcard: []string{types.Wildcard}}) + rv.SetMCPPermissions(types.Deny, &types.MCPPermissions{ + Tools: []string{"foo"}, + }) + }) + + mcpServer := &types.AppV3{ + Kind: types.KindApp, + Metadata: types.Metadata{ + Name: "mcp-everything", + Labels: map[string]string{ + "env": "dev", + }, + }, + } + + testCases := []struct { + name string + roles RoleSet + mcpServer types.Application + result EnumerationResult + }{ + { + name: "no tools permission", + roles: NewRoleSet(roleEmptyTools, roleNoLabelsMatch), + mcpServer: mcpServer, + result: EnumerationResult{ + allowedDeniedMap: map[string]bool{}, + }, + }, + { + name: "allow wildcard, deny specific value", + roles: NewRoleSet(roleAllowWildcard, roleExplicitDeny), + mcpServer: mcpServer, + result: EnumerationResult{ + wildcardAllowed: true, + allowedDeniedMap: map[string]bool{ + "foo": false, + }, + }, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + t.Run(tt.name, func(t *testing.T) { + accessChecker := makeAccessCheckerWithRoleSet(tt.roles) + enumResult := accessChecker.EnumerateMCPTools(tt.mcpServer) + require.Equal(t, tt.result, enumResult) + }) + }) + } +} diff --git a/lib/services/presets.go b/lib/services/presets.go index 902dc29714301..8eb1e4b32d611 100644 --- a/lib/services/presets.go +++ b/lib/services/presets.go @@ -300,6 +300,9 @@ func NewPresetAccessRole() types.Role { types.NewRule(types.KindInstance, RO()), types.NewRule(types.KindClusterMaintenanceConfig, RO()), }, + MCP: &types.MCPPermissions{ + Tools: []string{teleport.TraitInternalMCPTools}, + }, }, }, } @@ -1044,6 +1047,15 @@ func AddRoleDefaults(ctx context.Context, role types.Role) (types.Role, error) { } } + if role.GetMCPPermissions(types.Allow) == nil { + if mcpTools := defaultMCPTools()[role.GetName()]; len(mcpTools) > 0 { + role.SetMCPPermissions(types.Allow, &types.MCPPermissions{ + Tools: mcpTools, + }) + changed = true + } + } + if !changed { return nil, trace.AlreadyExists("no change") } @@ -1161,3 +1173,9 @@ func defaultGitHubOrgs() map[string][]string { teleport.PresetAccessRoleName: []string{teleport.TraitInternalGitHubOrgs}, } } + +func defaultMCPTools() map[string][]string { + return map[string][]string{ + teleport.PresetAccessRoleName: []string{teleport.TraitInternalMCPTools}, + } +} diff --git a/lib/services/presets_test.go b/lib/services/presets_test.go index da3150278ec14..cba3c38812907 100644 --- a/lib/services/presets_test.go +++ b/lib/services/presets_test.go @@ -145,6 +145,9 @@ func TestAddRoleDefaults(t *testing.T) { GitHubPermissions: []types.GitHubPermission{{ Organizations: defaultGitHubOrgs()[teleport.PresetAccessRoleName], }}, + MCP: &types.MCPPermissions{ + Tools: defaultMCPTools()[teleport.PresetAccessRoleName], + }, }, }, }, @@ -180,6 +183,9 @@ func TestAddRoleDefaults(t *testing.T) { GitHubPermissions: []types.GitHubPermission{{ Organizations: defaultGitHubOrgs()[teleport.PresetAccessRoleName], }}, + MCP: &types.MCPPermissions{ + Tools: defaultMCPTools()[teleport.PresetAccessRoleName], + }, }, }, }, @@ -198,6 +204,9 @@ func TestAddRoleDefaults(t *testing.T) { GitHubPermissions: []types.GitHubPermission{{ Organizations: defaultGitHubOrgs()[teleport.PresetAccessRoleName], }}, + MCP: &types.MCPPermissions{ + Tools: defaultMCPTools()[teleport.PresetAccessRoleName], + }, }, }, }, @@ -217,6 +226,9 @@ func TestAddRoleDefaults(t *testing.T) { GitHubPermissions: []types.GitHubPermission{{ Organizations: defaultGitHubOrgs()[teleport.PresetAccessRoleName], }}, + MCP: &types.MCPPermissions{ + Tools: defaultMCPTools()[teleport.PresetAccessRoleName], + }, }, }, }, diff --git a/lib/services/role.go b/lib/services/role.go index 4aeebaae210c1..cf5e6447fc0cb 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -174,6 +174,9 @@ func RoleWithVersionForUser(u types.User, v string) types.Role { KubernetesLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, DatabaseServiceLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, DatabaseLabels: types.Labels{types.Wildcard: []string{types.Wildcard}}, + MCP: &types.MCPPermissions{ + Tools: []string{types.Wildcard}, + }, Rules: []types.Rule{ types.NewRule(types.KindRole, RW()), types.NewRule(types.KindAuthConnector, RW()), @@ -613,6 +616,11 @@ func ApplyTraits(r types.Role, traits map[string][]string) (types.Role, error) { outCond.Roles = apiutils.Deduplicate(outCond.Roles) outCond.Where = inCond.Where r.SetImpersonateConditions(condition, outCond) + + if mcp := r.GetMCPPermissions(condition); mcp != nil { + mcp.Tools = applyValueTraitsSlice(mcp.Tools, traits, "mcp.tools") + r.SetMCPPermissions(condition, mcp) + } } return r, nil @@ -696,7 +704,7 @@ func ApplyValueTraits(val string, traits map[string][]string) ([]string, error) constants.TraitDBNames, constants.TraitDBUsers, constants.TraitDBRoles, constants.TraitAWSRoleARNs, constants.TraitAzureIdentities, constants.TraitGCPServiceAccounts, constants.TraitJWT, - constants.TraitGitHubOrgs: + constants.TraitGitHubOrgs, constants.TraitMCPTools: default: return trace.BadParameter("unsupported variable %q", name) } @@ -1030,6 +1038,22 @@ func (result *EnumerationResult) WildcardDenied() bool { return result.wildcardDenied } +// ToEntities converts result back to allowed and denied entity slices. +// +// If wildcard is denied, only "*" is returned for the denied slice. +// If wildcard is allowed, allowed entities will be appended to the allowed +// slice after the "*" as a hint for users to select. +// Denied entities is only included if the wildcard is allowed. +func (result *EnumerationResult) ToEntities() (allowed, denied []string) { + if result.wildcardDenied { + return nil, []string{types.Wildcard} + } + if result.wildcardAllowed { + return append([]string{types.Wildcard}, result.Allowed()...), result.Denied() + } + return result.Allowed(), nil +} + // NewEnumerationResult returns new EnumerationResult. func NewEnumerationResult() EnumerationResult { return EnumerationResult{ @@ -1039,6 +1063,34 @@ func NewEnumerationResult() EnumerationResult { } } +// NewEnumerationResultFromEntities creates a new EnumerationResult and +// populates the result with provided allowed and denied entries. +func NewEnumerationResultFromEntities(allowed, denied []string) EnumerationResult { + var wildcardAllowed bool + var wildcardDenied bool + allowedDeniedMap := make(map[string]bool) + for _, allow := range allowed { + if allow == types.Wildcard { + wildcardAllowed = true + } else { + allowedDeniedMap[allow] = true + } + } + for _, deny := range denied { + if deny == types.Wildcard { + wildcardDenied = true + wildcardAllowed = false + break + } + allowedDeniedMap[deny] = false + } + return EnumerationResult{ + allowedDeniedMap: allowedDeniedMap, + wildcardAllowed: wildcardAllowed, + wildcardDenied: wildcardDenied, + } +} + // MatchNamespace returns true if given list of namespace matches // target namespace, wildcard matches everything. func MatchNamespace(selectors []string, namespace string) (bool, string) { @@ -3676,3 +3728,23 @@ func AccessStateFromSSHIdentity(ctx context.Context, ident *sshca.Identity, chec state.DeviceVerified = dtauthz.IsSSHDeviceVerified(ident) return state, nil } + +// MCPToolMatcher matches a role against MCP tool. +type MCPToolMatcher struct { + Name string +} + +// Match matches MCP tool name against provided role and condition. +func (m *MCPToolMatcher) Match(role types.Role, condition types.RoleConditionType) (bool, error) { + mcpSpec := role.GetMCPPermissions(condition) + if mcpSpec == nil { + return false, nil + } + match, err := utils.SliceMatchesRegex(m.Name, mcpSpec.Tools) + return match, trace.Wrap(err) +} + +// String returns the matcher's string representation. +func (m *MCPToolMatcher) String() string { + return fmt.Sprintf("MCPToolMatcher(Name=%v)", m.Name) +} diff --git a/lib/services/role_test.go b/lib/services/role_test.go index d30a881079bed..aad7393ed7783 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -2965,6 +2965,8 @@ func TestApplyTraits(t *testing.T) { outKubeResources []types.KubernetesResource inGitHubPermissions []types.GitHubPermission outGitHubPermissions []types.GitHubPermission + inMCPPermissions *types.MCPPermissions + outMCPPermissions *types.MCPPermissions } tests := []struct { comment string @@ -3761,6 +3763,34 @@ func TestApplyTraits(t *testing.T) { }}, }, }, + { + comment: "MCP permissions in allow rule", + inTraits: map[string][]string{ + "mcp_tools": {"get_*", "search_files"}, + }, + allow: rule{ + inMCPPermissions: &types.MCPPermissions{ + Tools: []string{"{{internal.mcp_tools}}"}, + }, + outMCPPermissions: &types.MCPPermissions{ + Tools: []string{"get_*", "search_files"}, + }, + }, + }, + { + comment: "MCP permissions in deny rule", + inTraits: map[string][]string{ + "mcp_tools": {"get_*", "search_files"}, + }, + deny: rule{ + inMCPPermissions: &types.MCPPermissions{ + Tools: []string{"{{internal.mcp_tools}}"}, + }, + outMCPPermissions: &types.MCPPermissions{ + Tools: []string{"get_*", "search_files"}, + }, + }, + }, } for _, tt := range tests { t.Run(tt.comment, func(t *testing.T) { @@ -3793,6 +3823,7 @@ func TestApplyTraits(t *testing.T) { HostSudoers: tt.allow.inSudoers, KubernetesResources: tt.allow.inKubeResources, GitHubPermissions: tt.allow.inGitHubPermissions, + MCP: tt.allow.inMCPPermissions, }, Deny: types.RoleConditions{ Logins: tt.deny.inLogins, @@ -3815,6 +3846,7 @@ func TestApplyTraits(t *testing.T) { HostSudoers: tt.deny.outSudoers, KubernetesResources: tt.deny.inKubeResources, GitHubPermissions: tt.deny.inGitHubPermissions, + MCP: tt.deny.inMCPPermissions, }, }, } @@ -4562,9 +4594,10 @@ func TestRoleSetEnumerateDatabaseUsersAndNames(t *testing.T) { Metadata: types.Metadata{Name: "allow_deny_same", Namespace: apidefaults.Namespace}, Spec: types.RoleSpecV6{ Allow: types.RoleConditions{ - Namespaces: []string{apidefaults.Namespace}, - DatabaseUsers: []string{"root"}, - DatabaseNames: []string{"root"}, + DatabaseLabels: types.Labels{"env": []string{"stage"}}, + Namespaces: []string{apidefaults.Namespace}, + DatabaseUsers: []string{"root"}, + DatabaseNames: []string{"root"}, }, Deny: types.RoleConditions{ Namespaces: []string{apidefaults.Namespace}, @@ -10125,3 +10158,144 @@ func TestMatchRequestKubernetesResource(t *testing.T) { } } + +func TestMCPToolMatcher(t *testing.T) { + roleWithSpecificAllow := &types.RoleV6{ + Kind: types.KindRole, + Version: types.V8, + Metadata: types.Metadata{ + Name: "ai_user", + Namespace: apidefaults.Namespace, + }, + Spec: types.RoleSpecV6{ + Allow: types.RoleConditions{ + MCP: &types.MCPPermissions{ + Tools: []string{ + "allow_literal", + "^allow(_regex)+$", + "allow_glob*", + }, + }, + }, + }, + } + + roleWithWildcardAllow := &types.RoleV6{ + Kind: types.KindRole, + Version: types.V8, + Metadata: types.Metadata{ + Name: "ai_user", + Namespace: apidefaults.Namespace, + }, + Spec: types.RoleSpecV6{ + Allow: types.RoleConditions{ + MCP: &types.MCPPermissions{ + Tools: []string{"*"}, + }, + }, + Deny: types.RoleConditions{ + MCP: &types.MCPPermissions{ + Tools: []string{"deny_literal"}, + }, + }, + }, + } + + tests := []struct { + testToolName string + testRole types.Role + testCondition types.RoleConditionType + requireMatch require.BoolAssertionFunc + }{ + { + testToolName: "deny_empty", + testRole: roleWithSpecificAllow, + testCondition: types.Deny, + requireMatch: require.False, + }, + { + testToolName: "allow_literal", + testRole: roleWithSpecificAllow, + testCondition: types.Allow, + requireMatch: require.True, + }, + { + testToolName: "allow_regex_regex", + testRole: roleWithSpecificAllow, + testCondition: types.Allow, + requireMatch: require.True, + }, + { + testToolName: "allow_globbb", + testRole: roleWithSpecificAllow, + testCondition: types.Allow, + requireMatch: require.True, + }, + { + testToolName: "allow_wildcard", + testRole: roleWithWildcardAllow, + testCondition: types.Allow, + requireMatch: require.True, + }, + { + testToolName: "deny_literal", + testRole: roleWithWildcardAllow, + testCondition: types.Deny, + requireMatch: require.True, + }, + } + + for _, tt := range tests { + t.Run(tt.testToolName, func(t *testing.T) { + matcher := MCPToolMatcher{ + Name: tt.testToolName, + } + match, err := matcher.Match(tt.testRole, tt.testCondition) + require.NoError(t, err) + tt.requireMatch(t, match) + }) + } +} + +func TestNewEnumerationResultFromEntities(t *testing.T) { + tests := []struct { + name string + inputAllowed []string + inputDenied []string + wantAllowed []string + wantDenied []string + }{ + { + name: "empty", + }, + { + name: "wildcard denied", + inputAllowed: []string{"allow_entry"}, + inputDenied: []string{"deny_entry", "*"}, + wantDenied: []string{"*"}, + }, + { + name: "wildcard allowed", + inputAllowed: []string{"allow_entry", "*", "deny_overwrite"}, + inputDenied: []string{"deny_overwrite"}, + wantAllowed: []string{"*", "allow_entry"}, + wantDenied: []string{"deny_overwrite"}, + }, + { + name: "no wildcard", + inputAllowed: []string{"allow_entry_1", "deny_overwrite", "allow_entry_2"}, + inputDenied: []string{"deny_overwrite", "deny_entry"}, + wantAllowed: []string{"allow_entry_1", "allow_entry_2"}, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + result := NewEnumerationResultFromEntities(test.inputAllowed, test.inputDenied) + + actualAllowed, actualDenied := result.ToEntities() + require.Equal(t, test.wantAllowed, actualAllowed) + require.Equal(t, test.wantDenied, actualDenied) + }) + } +} diff --git a/lib/srv/alpnproxy/common/protocols.go b/lib/srv/alpnproxy/common/protocols.go index d4cbbcfa4c190..054391d13f3ff 100644 --- a/lib/srv/alpnproxy/common/protocols.go +++ b/lib/srv/alpnproxy/common/protocols.go @@ -118,6 +118,9 @@ const ( // ProtocolPingSuffix is TLS ALPN suffix used to wrap connections with // Ping. ProtocolPingSuffix Protocol = "-ping" + + // ProtocolMCP is TLS ALPN protocol value used to indicate MCP connections. + ProtocolMCP Protocol = "teleport-mcp" ) // SupportedProtocols is the list of supported ALPN protocols. @@ -138,6 +141,7 @@ var SupportedProtocols = WithPingProtocols( ProtocolProxySSHGRPC, ProtocolProxyGRPCInsecure, ProtocolProxyGRPCSecure, + ProtocolMCP, }, DatabaseProtocols...), ) @@ -150,6 +154,18 @@ func ProtocolsToString(protocols []Protocol) []string { return out } +// ProtocolToStringsWithPing converts Protocol to a list of strings, adding the +// ping version if the protocol supports it. +func ProtocolToStringsWithPing(protocol Protocol) []string { + if HasPingSupport(protocol) { + return []string{ + string(ProtocolWithPing(protocol)), + string(protocol), + } + } + return []string{string(protocol)} +} + // ToALPNProtocol maps provided database protocol to ALPN protocol. func ToALPNProtocol(dbProtocol string) (Protocol, error) { switch dbProtocol { @@ -231,6 +247,7 @@ var DatabaseProtocols = []Protocol{ var ProtocolsWithPingSupport = append( DatabaseProtocols, ProtocolTCP, + ProtocolMCP, ) // WithPingProtocols adds Ping protocols to the list for each protocol that diff --git a/lib/srv/alpnproxy/common/protocols_test.go b/lib/srv/alpnproxy/common/protocols_test.go index f7d24c56d4a20..79a2a81183e1e 100644 --- a/lib/srv/alpnproxy/common/protocols_test.go +++ b/lib/srv/alpnproxy/common/protocols_test.go @@ -50,3 +50,8 @@ func TestIsDBTLSProtocol(t *testing.T) { require.False(t, IsDBTLSProtocol("teleport-tcp")) require.False(t, IsDBTLSProtocol("")) } + +func TestProtocolToStringsWithPing(t *testing.T) { + require.Equal(t, []string{"teleport-proxy-grpc-mtls"}, ProtocolToStringsWithPing(ProtocolProxyGRPCSecure)) + require.Equal(t, []string{"teleport-mcp-ping", "teleport-mcp"}, ProtocolToStringsWithPing(ProtocolMCP)) +} diff --git a/lib/srv/app/connections_handler.go b/lib/srv/app/connections_handler.go index 9ba0fda096a1a..950019b40582d 100644 --- a/lib/srv/app/connections_handler.go +++ b/lib/srv/app/connections_handler.go @@ -54,6 +54,7 @@ import ( appazure "github.com/gravitational/teleport/lib/srv/app/azure" "github.com/gravitational/teleport/lib/srv/app/common" appgcp "github.com/gravitational/teleport/lib/srv/app/gcp" + "github.com/gravitational/teleport/lib/srv/mcp" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" awsutils "github.com/gravitational/teleport/lib/utils/aws" @@ -113,6 +114,9 @@ type ConnectionsHandlerConfig struct { // Logger is the slog.Logger. Logger *slog.Logger + + // MCPDemoServer enables the "Teleport Demo" MCP server. + MCPDemoServer bool } // CheckAndSetDefaults validates the config values and sets defaults. @@ -175,6 +179,7 @@ type ConnectionsHandler struct { httpServer *http.Server tlsConfig *tls.Config tcpServer *tcpServer + mcpServer *mcp.Server // cache holds sessionChunk objects for in-flight app sessions. cache *utils.FnCache @@ -273,6 +278,18 @@ func NewConnectionsHandler(closeContext context.Context, cfg *ConnectionsHandler } c.tcpServer = tcpServer + // Handle MCP servers. + c.mcpServer, err = mcp.NewServer(mcp.ServerConfig{ + Emitter: c.cfg.Emitter, + ParentContext: c.closeContext, + HostID: c.cfg.HostID, + AccessPoint: c.cfg.AccessPoint, + EnableDemoServer: c.cfg.MCPDemoServer, + }) + if err != nil { + return nil, trace.Wrap(err) + } + // Make copy of server's TLS configuration and update it with the specific // functionality this server needs, like requiring client certificates. c.tlsConfig = CopyAndConfigureTLS(c.log, c.cfg.AccessPoint, c.cfg.TLSConfig) @@ -585,14 +602,19 @@ func (c *ConnectionsHandler) handleConnection(conn net.Conn) (func(), error) { // The behavior here is a little hard to track. To be clear here, if authorization fails // the following will occur: // 1. If the application is a TCP application, error out immediately as expected. - // 2. If the application is an HTTP application, store the error and let the HTTP handler + // 2. If the application is an MCP application, let the MCP server handler + // returns the error on first request. + // 3. If the application is an HTTP application, store the error and let the HTTP handler // serve the error directly so that it's properly converted to an HTTP status code. // This will ensure users will get a 403 when authorization fails. if err != nil { - if !app.IsTCP() { - c.setConnAuth(tlsConn, err) - } else { + switch { + case app.IsTCP(): return nil, trace.Wrap(err) + case app.IsMCP(): + return nil, trace.Wrap(c.mcpServer.HandleUnauthorizedConnection(ctx, conn, err)) + default: + c.setConnAuth(tlsConn, err) } } else { // Monitor the connection an update the context. @@ -608,17 +630,28 @@ func (c *ConnectionsHandler) handleConnection(conn net.Conn) (func(), error) { // Application access supports plain TCP connections which are handled // differently than HTTP requests from web apps. - if app.IsTCP() { + switch { + case app.IsTCP(): identity := authCtx.Identity.GetIdentity() defer cancel(nil) return nil, trace.Wrap(c.handleTCPApp(ctx, tlsConn, &identity, app)) - } - cleanup := func() { - cancel(nil) - c.deleteConnAuth(tlsConn) + case app.IsMCP(): + defer cancel(nil) + sessionCtx := mcp.SessionCtx{ + ClientConn: tlsConn, + AuthCtx: authCtx, + App: app, + } + return nil, trace.Wrap(c.mcpServer.HandleSession(ctx, sessionCtx)) + + default: + cleanup := func() { + cancel(nil) + c.deleteConnAuth(tlsConn) + } + return cleanup, trace.Wrap(c.handleHTTPApp(ctx, tlsConn)) } - return cleanup, trace.Wrap(c.handleHTTPApp(ctx, tlsConn)) } // handleHTTPApp handles connection for an HTTP application. diff --git a/lib/srv/mcp/audit.go b/lib/srv/mcp/audit.go new file mode 100644 index 0000000000000..4e241300706fb --- /dev/null +++ b/lib/srv/mcp/audit.go @@ -0,0 +1,228 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + + "github.com/gravitational/teleport" + apidefaults "github.com/gravitational/teleport/api/defaults" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/utils/mcputils" +) + +type sessionAuditorConfig struct { + emitter apievents.Emitter + logger *slog.Logger + hostID string + sessionCtx *SessionCtx + // TODO(greedy52) add recording support. + preparer events.SessionEventPreparer +} + +func (c *sessionAuditorConfig) checkAndSetDefaults() error { + if c.emitter == nil { + return trace.BadParameter("missing emitter") + } + if c.hostID == "" { + return trace.BadParameter("missing hostID") + } + if c.sessionCtx == nil { + return trace.BadParameter("missing sessionCtx") + } + if c.preparer == nil { + return trace.BadParameter("missing preparer") + } + if c.logger == nil { + c.logger = slog.Default() + } + return nil +} + +// sessionAuditor handles audit events for a session. +type sessionAuditor struct { + sessionAuditorConfig +} + +func newSessionAuditor(cfg sessionAuditorConfig) (*sessionAuditor, error) { + if err := cfg.checkAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return &sessionAuditor{ + sessionAuditorConfig: cfg, + }, nil +} + +func (a *sessionAuditor) shouldEmitEvent(method mcp.MCPMethod) bool { + // Do not record discovery, ping calls. + switch method { + case mcp.MethodPing, + mcp.MethodResourcesList, + mcp.MethodResourcesTemplatesList, + mcp.MethodPromptsList, + mcp.MethodToolsList: + return false + default: + return true + } +} + +func (a *sessionAuditor) emitStartEvent(ctx context.Context) { + a.emitEvent(ctx, &apievents.MCPSessionStart{ + Metadata: a.makeEventMetadata( + events.MCPSessionStartEvent, + events.MCPSessionStartCode, + ), + ServerMetadata: a.makeServerMetadata(), + SessionMetadata: a.makeSessionMetadata(), + UserMetadata: a.makeUserMetadata(), + ConnectionMetadata: a.makeConnectionMetadata(), + AppMetadata: a.makeAppMetadata(), + }) +} + +func (a *sessionAuditor) emitEndEvent(ctx context.Context) { + a.emitEvent(ctx, &apievents.MCPSessionEnd{ + Metadata: a.makeEventMetadata( + events.MCPSessionEndEvent, + events.MCPSessionEndCode, + ), + ServerMetadata: a.makeServerMetadata(), + SessionMetadata: a.makeSessionMetadata(), + UserMetadata: a.makeUserMetadata(), + ConnectionMetadata: a.makeConnectionMetadata(), + AppMetadata: a.makeAppMetadata(), + }) +} + +func (a *sessionAuditor) emitNotificationEvent(ctx context.Context, msg *mcputils.JSONRPCNotification) { + if !a.shouldEmitEvent(msg.Method) { + return + } + a.emitEvent(ctx, &apievents.MCPSessionNotification{ + Metadata: a.makeEventMetadata( + events.MCPSessionNotificationEvent, + events.MCPSessionNotificationCode, + ), + SessionMetadata: a.makeSessionMetadata(), + UserMetadata: a.makeUserMetadata(), + AppMetadata: a.makeAppMetadata(), + Message: apievents.MCPJSONRPCMessage{ + JSONRPC: msg.JSONRPC, + Method: string(msg.Method), + Params: msg.Params.GetEventParams(), + }, + }) +} + +func (a *sessionAuditor) emitRequestEvent(ctx context.Context, msg *mcputils.JSONRPCRequest, err error) { + if err == nil && !a.shouldEmitEvent(msg.Method) { + return + } + event := &apievents.MCPSessionRequest{ + Metadata: a.makeEventMetadata( + events.MCPSessionRequestEvent, + events.MCPSessionRequestCode, + ), + SessionMetadata: a.makeSessionMetadata(), + UserMetadata: a.makeUserMetadata(), + AppMetadata: a.makeAppMetadata(), + Status: apievents.Status{ + Success: true, + }, + Message: apievents.MCPJSONRPCMessage{ + JSONRPC: msg.JSONRPC, + Method: string(msg.Method), + ID: msg.ID.String(), + Params: msg.Params.GetEventParams(), + }, + } + + if err != nil { + event.Metadata.Code = events.MCPSessionRequestFailureCode + event.Status.Success = false + event.Status.Error = err.Error() + } + a.emitEvent(ctx, event) +} + +func (a *sessionAuditor) emitEvent(ctx context.Context, event apievents.AuditEvent) { + preparedEvent, err := a.preparer.PrepareSessionEvent(event) + if err != nil { + a.logger.ErrorContext(ctx, "Failed to prepare event", + "error", err, + "event_type", event.GetType(), + "event_id", event.GetID(), + ) + return + } + if err := a.emitter.EmitAuditEvent(ctx, preparedEvent.GetAuditEvent()); err != nil { + a.logger.ErrorContext(ctx, "Failed to emit audit event", + "error", err, + "event_type", event.GetType(), + "event_id", event.GetID(), + ) + } +} + +func (a *sessionAuditor) makeEventMetadata(eventType, eventCode string) apievents.Metadata { + return apievents.Metadata{ + Type: eventType, + Code: eventCode, + ClusterName: a.sessionCtx.Identity.RouteToApp.ClusterName, + } +} + +func (a *sessionAuditor) makeServerMetadata() apievents.ServerMetadata { + return apievents.ServerMetadata{ + ServerVersion: teleport.Version, + ServerID: a.hostID, + ServerNamespace: apidefaults.Namespace, + } +} + +func (a *sessionAuditor) makeConnectionMetadata() apievents.ConnectionMetadata { + return apievents.ConnectionMetadata{ + RemoteAddr: a.sessionCtx.Identity.LoginIP, + } +} + +func (a *sessionAuditor) makeAppMetadata() apievents.AppMetadata { + return apievents.AppMetadata{ + AppURI: a.sessionCtx.App.GetURI(), + AppName: a.sessionCtx.App.GetName(), + } +} + +func (a *sessionAuditor) makeSessionMetadata() apievents.SessionMetadata { + return apievents.SessionMetadata{ + SessionID: a.sessionCtx.sessionID.String(), + WithMFA: a.sessionCtx.Identity.MFAVerified, + PrivateKeyPolicy: string(a.sessionCtx.Identity.PrivateKeyPolicy), + } +} + +func (a *sessionAuditor) makeUserMetadata() apievents.UserMetadata { + return a.sessionCtx.Identity.GetUserMetadata() +} diff --git a/lib/srv/mcp/demo.go b/lib/srv/mcp/demo.go new file mode 100644 index 0000000000000..cd8f359a50935 --- /dev/null +++ b/lib/srv/mcp/demo.go @@ -0,0 +1,219 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "context" + "encoding/json" + "io" + "log/slog" + + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + mcpserver "github.com/mark3labs/mcp-go/server" + + "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/utils/mcputils" +) + +const ( + // DemoServerName is the name of the "Teleport Demo" MCP server. + DemoServerName = "teleport-mcp-demo" +) + +// NewDemoServerApp returns the app definition for the "Teleport Demo" MCP +// server. +// +// The purpose of the "Teleport Demo" MCP server is to provide a quick demo on +// MCP access without the need for external environment setup on MCP +// servers. This MCP server is in-memory only and uses stdio transport. Access +// to this MCP server is the same as any other MCP server (`tsh`, RBAC, audit +// events, etc.). +func NewDemoServerApp() (types.Application, error) { + app, err := types.NewAppV3(types.Metadata{ + Name: DemoServerName, + Labels: map[string]string{types.TeleportInternalResourceType: types.DemoResource}, + Description: "A demo MCP server that shows current user and session information", + }, types.AppSpecV3{ + URI: types.SchemaMCPStdio + DemoServerName, + }) + return app, trace.Wrap(err) +} + +func isDemoServerApp(app types.Application) bool { + labelValue, labelFound := app.GetLabel(types.TeleportInternalResourceType) + return labelFound && labelValue == types.DemoResource && app.GetName() == DemoServerName +} + +func makeDemoServerRunner(ctx context.Context, session *sessionHandler) (stdioServerRunner, error) { + return makeInMemoryServerRunner(newDemoServer(ctx, session), session.logger) +} + +func newDemoServer(_ context.Context, session *sessionHandler) *mcpserver.MCPServer { + demoServer := mcpserver.NewMCPServer( + "teleport-demo", + teleport.Version, + ) + + tools := []mcpserver.ServerTool{ + { + Tool: mcp.NewTool( + "teleport_user_info", + mcp.WithDescription("Shows basic information about your Teleport user."), + ), + Handler: makeUserInfoToolHandler(session), + }, + { + Tool: mcp.NewTool( + "teleport_session_info", + mcp.WithDescription("Shows information about this MCP session."), + ), + Handler: makeSessionInfoToolHandler(session), + }, + { + Tool: mcp.NewTool( + "teleport_demo_info", + mcp.WithDescription("Shows information about this Teleport Demo MCP server."), + ), + Handler: makeDemoInfoToolHandler(), + }, + } + + demoServer.AddTools(tools...) + return demoServer +} + +func makeUserInfoToolHandler(session *sessionHandler) mcpserver.ToolHandlerFunc { + return func(_ context.Context, _ mcp.CallToolRequest) (*mcp.CallToolResult, error) { + data, err := json.Marshal(map[string]any{ + "name": session.AuthCtx.User.GetName(), + "user_kind": session.makeUserMetadata().UserKind.String(), + "roles": session.AuthCtx.User.GetRoles(), + }) + if err != nil { + return nil, trace.Wrap(err) + } + return mcp.NewToolResultText(string(data)), nil + } +} + +func makeSessionInfoToolHandler(session *sessionHandler) mcpserver.ToolHandlerFunc { + return func(_ context.Context, _ mcp.CallToolRequest) (*mcp.CallToolResult, error) { + data, err := json.Marshal(map[string]any{ + "teleport_cluster": session.Identity.RouteToApp.ClusterName, + "teleport_app_name": session.App.GetName(), + "teleport_app_description": session.App.GetDescription(), + "mcp_transport_type": types.GetMCPServerTransportType(session.App.GetURI()), + }) + if err != nil { + return nil, trace.Wrap(err) + } + return mcp.NewToolResultText(string(data)), nil + } +} + +func makeDemoInfoToolHandler() mcpserver.ToolHandlerFunc { + text := `Teleport can provide secure connections to your MCP servers while +improving both access control and visibility. + +This 'teleport-demo' MCP server is a demonstration that showcases how Teleport +MCP access works. + +You can find this 'teleport-demo' server in the Teleport Web UI or by running +'tsh mcp ls'. + +To connect to the demo server with stdio transport from your AI tool, use 'tsh +mcp connect teleport-demo'. Or run 'tsh mcp config teleport-demo' for more +configuration details. + +If you are an auditor, you can also find this MCP session and corresponding +requests in the audit events. + +Available Tools from the demo server: +- 'teleport_user_info': Shows basic information about your Teleport user. +- 'teleport_session_info': Shows information about this MCP session. +- 'teleport_demo_info' (this tool): Shows information about this Teleport Demo MCP server. + +You can restrict what tools a user can access by listing allowed MCP tools in +the role spec 'role.allow.mcp.tools'. + +To learn more about enrolling MCP servers and additional reference materials, please visit: +https://goteleport.com/docs/enroll-resources/mcp-access +` + return func(_ context.Context, _ mcp.CallToolRequest) (*mcp.CallToolResult, error) { + return mcp.NewToolResultText(text), nil + } +} + +type inMemoryServerRunner struct { + serverStdin io.ReadCloser + serverStdout io.WriteCloser + writeToServer io.WriteCloser + readFromServer io.ReadCloser + mcpServer *mcpserver.MCPServer + log *slog.Logger +} + +func makeInMemoryServerRunner(mcpServer *mcpserver.MCPServer, log *slog.Logger) (stdioServerRunner, error) { + if mcpServer == nil { + return nil, trace.BadParameter("mcpServer must not be nil") + } + if log == nil { + log = slog.Default() + } + + serverStdin, writeToServer := io.Pipe() + readFromServer, serverStdout := io.Pipe() + return &inMemoryServerRunner{ + serverStdin: serverStdin, + serverStdout: serverStdout, + writeToServer: writeToServer, + readFromServer: readFromServer, + mcpServer: mcpServer, + log: log, + }, nil +} + +func (s *inMemoryServerRunner) getStdinPipe() (io.WriteCloser, error) { + return s.writeToServer, nil +} + +func (s *inMemoryServerRunner) getStdoutPipe() (io.ReadCloser, error) { + return s.readFromServer, nil +} + +func (s *inMemoryServerRunner) run(ctx context.Context) error { + s.log.DebugContext(ctx, "Running in-memory MCP server") + defer s.log.DebugContext(ctx, "Finished running in-memory MCP server") + err := mcpserver.NewStdioServer(s.mcpServer).Listen(ctx, s.serverStdin, s.serverStdout) + if err != nil && !mcputils.IsOKCloseError(err) { + return trace.Wrap(err) + } + return nil +} + +func (s *inMemoryServerRunner) close() { + if err := s.writeToServer.Close(); err != nil { + s.log.DebugContext(context.Background(), "Failed to close pipe", "error", err) + } + if err := s.serverStdout.Close(); err != nil { + s.log.DebugContext(context.Background(), "Failed to close pipe", "error", err) + } +} diff --git a/lib/srv/mcp/helpers_test.go b/lib/srv/mcp/helpers_test.go new file mode 100644 index 0000000000000..4511a2c91a060 --- /dev/null +++ b/lib/srv/mcp/helpers_test.go @@ -0,0 +1,337 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "context" + "encoding/json" + "net" + "os" + "slices" + "sync/atomic" + "testing" + "time" + + "github.com/docker/docker/api/types/container" + docker "github.com/docker/docker/client" + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" + apiutils "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/mcputils" +) + +func TestMain(m *testing.M) { + utils.InitLoggerForTests() + os.Exit(m.Run()) +} + +type setupTestContextOptions struct { + roleSet services.RoleSet + app types.Application +} + +type setupTestContextOptionFunc func(*setupTestContextOptions) + +func withApp(app types.Application) setupTestContextOptionFunc { + return func(o *setupTestContextOptions) { + o.app = app + } +} + +func withRole(role types.Role) setupTestContextOptionFunc { + return func(opts *setupTestContextOptions) { + opts.roleSet = append(opts.roleSet, role) + } +} + +// withAdminRole assigns to ai_user a role that allows all MCP servers and their +// tools. +func withAdminRole(t *testing.T) setupTestContextOptionFunc { + t.Helper() + role, err := types.NewRole("admin", types.RoleSpecV6{ + Allow: types.RoleConditions{ + AppLabels: map[string]apiutils.Strings{ + types.Wildcard: {types.Wildcard}, + }, + MCP: &types.MCPPermissions{ + Tools: []string{types.Wildcard}, + }, + }, + }) + require.NoError(t, err) + return withRole(role) +} + +// withProdReadOnlyRole assigns to the ai_user a role that allows MCP servers +// with label env=prod and allows read-only tools. +func withProdReadOnlyRole(t *testing.T) setupTestContextOptionFunc { + t.Helper() + role, err := types.NewRole("prod-read-only", types.RoleSpecV6{ + Allow: types.RoleConditions{ + AppLabels: map[string]apiutils.Strings{ + "env": {"prod"}, + }, + MCP: &types.MCPPermissions{ + Tools: []string{"^(get|read|list|search).*$"}, + }, + }, + }) + require.NoError(t, err) + return withRole(role) +} + +// withDenyToolsRole assigns to the ai_user a role that denies all MCP tools. +func withDenyToolsRole(t *testing.T) setupTestContextOptionFunc { + t.Helper() + role, err := types.NewRole("deny-access", types.RoleSpecV6{ + Deny: types.RoleConditions{ + MCP: &types.MCPPermissions{ + Tools: []string{types.Wildcard}, + }, + }, + }) + require.NoError(t, err) + return withRole(role) +} + +func makeDualPipeNetConn(t *testing.T) (net.Conn, net.Conn) { + t.Helper() + clientSourceConn, clientDestConn, err := utils.DualPipeNetConn( + utils.MustParseAddr("127.0.0.1:1111"), + utils.MustParseAddr("127.0.0.1:2222"), + ) + require.NoError(t, err) + t.Cleanup(func() { + clientSourceConn.Close() + clientDestConn.Close() + }) + return clientSourceConn, clientDestConn +} + +type testContext struct { + *SessionCtx + + // clientSourceConn connects to SessionCtx.ClientConn. + clientSourceConn net.Conn +} + +func setupTestContext(t *testing.T, applyOpts ...setupTestContextOptionFunc) testContext { + t.Helper() + + var opts setupTestContextOptions + for _, applyOpt := range applyOpts { + applyOpt(&opts) + } + + // Fake connection. + clientSourceConn, clientDestConn := makeDualPipeNetConn(t) + + // App. + if opts.app == nil { + app, err := types.NewAppV3(types.Metadata{ + Name: "my-mcp-server", + Labels: map[string]string{ + "env": "prod", + }, + }, types.AppSpecV3{ + MCP: &types.MCP{ + Command: "npx", + Args: []string{"my-mcp-server"}, + RunAsHostUser: "my-user", + }, + }) + require.NoError(t, err) + opts.app = app + } + + // SessionCtx. + sessionCtx := &SessionCtx{ + ClientConn: clientDestConn, + App: opts.app, + AuthCtx: makeTestAuthContext(t, opts.roleSet), + } + require.NoError(t, sessionCtx.checkAndSetDefaults()) + + return testContext{ + clientSourceConn: clientSourceConn, + SessionCtx: sessionCtx, + } +} + +func makeTestAuthContext(t *testing.T, roleSet services.RoleSet) *authz.Context { + t.Helper() + + user, err := types.NewUser("ai") + require.NoError(t, err) + user.SetRoles(slices.Collect(types.ResourceNames(roleSet))) + + identity := authz.LocalUser{ + Username: user.GetName(), + Identity: tlsca.Identity{ + Username: user.GetName(), + Groups: user.GetRoles(), + Principals: user.GetLogins(), + }, + } + accessInfo, err := services.AccessInfoFromLocalTLSIdentity(identity.Identity, nil) + require.NoError(t, err) + checker := services.NewAccessCheckerWithRoleSet(accessInfo, "my-cluster", roleSet) + return &authz.Context{ + User: user, + Identity: identity, + Checker: checker, + } +} + +type requestBuilder struct { + idCounter int64 +} + +func (c *requestBuilder) makeRequestID() mcp.RequestId { + return mcp.NewRequestId(atomic.AddInt64(&c.idCounter, 1)) +} + +func (c *requestBuilder) makeToolsCallRequest(toolName string) *mcputils.JSONRPCRequest { + return &mcputils.JSONRPCRequest{ + JSONRPC: mcp.JSONRPC_VERSION, + ID: c.makeRequestID(), + Method: mcp.MethodToolsCall, + Params: mcputils.JSONRPCParams{ + "name": toolName, + }, + } +} + +func (c *requestBuilder) makeToolsListRequest() *mcputils.JSONRPCRequest { + return &mcputils.JSONRPCRequest{ + JSONRPC: mcp.JSONRPC_VERSION, + ID: c.makeRequestID(), + Method: mcp.MethodToolsList, + } +} + +func makeToolsCallResponse(t *testing.T, requestID mcp.RequestId, toolNames ...string) *mcputils.JSONRPCResponse { + t.Helper() + result := mcp.ListToolsResult{} + for _, toolName := range toolNames { + result.Tools = append(result.Tools, mcp.NewTool(toolName, mcp.WithDescription("description"))) + } + resultJSON, err := json.Marshal(&result) + require.NoError(t, err) + return &mcputils.JSONRPCResponse{ + JSONRPC: mcp.JSONRPC_VERSION, + ID: requestID, + Result: resultJSON, + } +} + +type fakeAccessPoint struct { +} + +func (f fakeAccessPoint) GetAuthPreference(context.Context) (types.AuthPreference, error) { + return types.DefaultAuthPreference(), nil +} +func (f fakeAccessPoint) GetClusterName(context.Context) (types.ClusterName, error) { + clusterName, err := types.NewClusterName(types.ClusterNameSpecV2{ + ClusterName: "my-cluster", + ClusterID: "my_cluster_id", + }) + return clusterName, trace.Wrap(err) +} + +func checkParamsHaveNameField(t *testing.T, params *apievents.Struct, wantName string) { + t.Helper() + require.NotNil(t, params) + require.NotNil(t, params.Fields) + value, ok := params.Fields["name"] + require.True(t, ok) + require.Equal(t, wantName, value.GetStringValue()) +} + +func checkToolsListResponse(t *testing.T, response mcp.JSONRPCMessage, wantID mcp.RequestId, wantTools []string) { + t.Helper() + // assume we don't know the internal type of response. + data, err := json.Marshal(response) + require.NoError(t, err) + + var mcpResponse mcputils.JSONRPCResponse + require.NoError(t, json.Unmarshal(data, &mcpResponse)) + require.Equal(t, wantID.String(), mcpResponse.ID.String()) + + var result mcp.ListToolsResult + require.NoError(t, json.Unmarshal(mcpResponse.Result, &result)) + checkToolsListResult(t, &result, wantTools) +} + +func checkToolsListResult(t *testing.T, result *mcp.ListToolsResult, wantTools []string) { + t.Helper() + require.NotNil(t, result) + var actualNames []string + for _, tool := range result.Tools { + actualNames = append(actualNames, tool.Name) + } + require.ElementsMatch(t, wantTools, actualNames) +} + +func newDockerClient(t *testing.T) *docker.Client { + t.Helper() + dockerClient, err := docker.NewClientWithOpts( + docker.FromEnv, + docker.WithAPIVersionNegotiation(), + docker.WithTimeout(10*time.Second), + ) + require.NoError(t, err) + t.Cleanup(func() { + dockerClient.Close() + }) + return dockerClient +} + +func findDockerContainer(ctx context.Context, dockerClient *docker.Client, containerName string) container.Summary { + containers, err := dockerClient.ContainerList(ctx, container.ListOptions{All: true}) + if err != nil { + return container.Summary{} + } + for _, container := range containers { + if slices.Contains(container.Names, "/"+containerName) { + return container + } + } + return container.Summary{} +} + +func findDockerContainerID(ctx context.Context, dockerClient *docker.Client, containerName string) string { + return findDockerContainer(ctx, dockerClient, containerName).ID +} + +func forceRemoveContainer(t *testing.T, dockerClient *docker.Client, containerName string) { + if containerID := findDockerContainerID(context.Background(), dockerClient, containerName); containerID != "" { + if err := dockerClient.ContainerRemove(context.Background(), containerID, container.RemoveOptions{Force: true}); err != nil { + t.Log("Failed to remove container", err) + } + } +} diff --git a/lib/srv/mcp/server.go b/lib/srv/mcp/server.go new file mode 100644 index 0000000000000..d43ff21113065 --- /dev/null +++ b/lib/srv/mcp/server.go @@ -0,0 +1,172 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "context" + "log/slog" + "net" + "time" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + + "github.com/gravitational/teleport" + apidefaults "github.com/gravitational/teleport/api/defaults" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/services" +) + +// AccessPoint defines functions that the MCP server requires from the caching +// client to the Auth Server. +type AccessPoint interface { + services.AuthPreferenceGetter + services.ClusterNameGetter +} + +// ServerConfig is the config for the MCP forward server. +type ServerConfig struct { + // Emitter is used for emitting audit events. + Emitter apievents.Emitter + // Log is the slog logger. + Log *slog.Logger + // ParentContext is parent's context for logging. + ParentContext context.Context + // HostID is the host ID of the teleport service. + HostID string + // AccessPoint is a caching client connected to the Auth Server. + AccessPoint AccessPoint + // EnableDemoServer enables the "Teleport Demo" MCP server. + EnableDemoServer bool + + clock clockwork.Clock +} + +// CheckAndSetDefaults checks values and sets defaults +func (c *ServerConfig) CheckAndSetDefaults() error { + if c.Emitter == nil { + return trace.BadParameter("missing Emitter") + } + if c.ParentContext == nil { + return trace.BadParameter("missing ParentContext") + } + if c.HostID == "" { + return trace.BadParameter("missing HostID") + } + if c.AccessPoint == nil { + return trace.BadParameter("missing AccessPoint") + } + if c.Log == nil { + c.Log = slog.With(teleport.ComponentKey, teleport.ComponentMCP) + } + if c.clock == nil { + c.clock = clockwork.NewRealClock() + } + return nil +} + +// Server handles forwarding client connections to MCP servers. +// TODO(greedy52) add server metrics. +type Server struct { + cfg ServerConfig +} + +// NewServer creates a new Server. +func NewServer(cfg ServerConfig) (*Server, error) { + if err := cfg.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return &Server{ + cfg: cfg, + }, nil +} + +// HandleSession handles an authorized client connection. +func (s *Server) HandleSession(ctx context.Context, sessionCtx SessionCtx) error { + if err := sessionCtx.checkAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + if s.cfg.EnableDemoServer && isDemoServerApp(sessionCtx.App) { + return trace.Wrap(s.handleStdio(ctx, sessionCtx, makeDemoServerRunner)) + } + return trace.Wrap(s.handleStdio(ctx, sessionCtx, makeExecServerRunner)) +} + +// HandleUnauthorizedConnection handles an unauthorized client connection. +// This function has a hardcoded 30 seconds timeout in case the proper error +// message cannot be delivered to the client. +func (s *Server) HandleUnauthorizedConnection(ctx context.Context, clientConn net.Conn, authErr error) error { + ctx, cancel := context.WithTimeout(ctx, time.Second*30) + defer cancel() + return trace.Wrap(s.handleAuthErrStdio(ctx, clientConn, authErr)) +} + +func (s *Server) makeSessionAuditor(ctx context.Context, sessionCtx SessionCtx, logger *slog.Logger) (*sessionAuditor, error) { + clusterName, err := s.cfg.AccessPoint.GetClusterName(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + name := clusterName.GetClusterName() + + preparer, err := events.NewPreparer(events.PreparerConfig{ + SessionID: sessionCtx.sessionID, + ServerID: s.cfg.HostID, + Namespace: apidefaults.Namespace, + Clock: s.cfg.clock, + ClusterName: name, + StartTime: s.cfg.clock.Now(), + }) + if err != nil { + return nil, trace.Wrap(err) + } + + return newSessionAuditor(sessionAuditorConfig{ + emitter: s.cfg.Emitter, + logger: logger, + hostID: s.cfg.HostID, + preparer: preparer, + sessionCtx: &sessionCtx, + }) +} + +func (s *Server) makeSessionHandler(ctx context.Context, sessionCtx SessionCtx) (*sessionHandler, error) { + // Some extra info for debugging purpose. + logger := s.cfg.Log.With( + "client_ip", sessionCtx.ClientConn.RemoteAddr(), + "app", sessionCtx.App.GetName(), + "user", sessionCtx.AuthCtx.User.GetName(), + "session_id", sessionCtx.sessionID, + ) + + sessionAuditor, err := s.makeSessionAuditor(ctx, sessionCtx, logger) + if err != nil { + return nil, trace.Wrap(err) + } + + return newSessionHandler(sessionHandlerConfig{ + SessionCtx: &sessionCtx, + sessionAuditor: sessionAuditor, + accessPoint: s.cfg.AccessPoint, + logger: logger, + parentCtx: s.cfg.ParentContext, + clock: s.cfg.clock, + }) +} diff --git a/lib/srv/mcp/session.go b/lib/srv/mcp/session.go new file mode 100644 index 0000000000000..f136056fb2a87 --- /dev/null +++ b/lib/srv/mcp/session.go @@ -0,0 +1,272 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "context" + "encoding/json" + "log/slog" + "net" + "time" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/mark3labs/mcp-go/mcp" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + dtauthz "github.com/gravitational/teleport/lib/devicetrust/authz" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/session" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/mcputils" +) + +// SessionCtx contains basic information of an MCP session. +type SessionCtx struct { + // ClientConn is the incoming client connection. + ClientConn net.Conn + // AuthCtx is the authorization context. + AuthCtx *authz.Context + // App is the MCP server application being accessed. + App types.Application + // Identity is the user identity. + Identity tlsca.Identity + + // sessionID is the Teleport session ID. + // + // Note that for stdio-based MCP server, a new session ID is generated per + // connection instead of using the web session ID from the app route. + sessionID session.ID +} + +func (c *SessionCtx) checkAndSetDefaults() error { + if c.ClientConn == nil { + return trace.BadParameter("missing ClientConn") + } + if c.AuthCtx == nil { + return trace.BadParameter("missing AuthCtx") + } + if c.App == nil { + return trace.BadParameter("missing App") + } + if c.Identity.Username == "" { + c.Identity = c.AuthCtx.Identity.GetIdentity() + } + if c.sessionID == "" { + c.sessionID = session.NewID() + } + return nil +} + +func (c *SessionCtx) getAccessState(authPref types.AuthPreference) services.AccessState { + state := c.AuthCtx.Checker.GetAccessState(authPref) + state.MFAVerified = c.Identity.IsMFAVerified() + state.EnableDeviceVerification = true + state.DeviceVerified = dtauthz.IsTLSDeviceVerified(&c.Identity.DeviceExtensions) + return state +} + +type sessionHandlerConfig struct { + *SessionCtx + *sessionAuditor + accessPoint AccessPoint + logger *slog.Logger + clock clockwork.Clock + parentCtx context.Context +} + +func (c *sessionHandlerConfig) checkAndSetDefaults() error { + if c.SessionCtx == nil { + return trace.BadParameter("missing session") + } + if c.sessionAuditor == nil { + return trace.BadParameter("missing auditor") + } + if c.accessPoint == nil { + return trace.BadParameter("missing accessPoint") + } + if c.logger == nil { + c.logger = slog.Default() + } + if c.clock == nil { + c.clock = clockwork.NewRealClock() + } + if c.parentCtx == nil { + c.parentCtx = context.Background() + } + return nil +} + +// sessionHandler provides common functions for handling an MCP session, +// irrespective the transport type. +type sessionHandler struct { + sessionHandlerConfig + + idTracker *mcputils.IDTracker + accessCache *utils.FnCache +} + +func newSessionHandler(cfg sessionHandlerConfig) (*sessionHandler, error) { + if err := cfg.checkAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + // Usually we won't have more than a couple in flight messages but let's do + // 50 just in case. Also, it's ok to lose the ID. The tracked ID is + // currently used for tools/list filtering. In worst case we couldn't apply + // this filtering, tools/call will still be blocked. + idTracker, err := mcputils.NewIDTracker(50) + if err != nil { + return nil, trace.Wrap(err) + } + + // Cache access check like tool name for a small period of time. + accessCache, err := utils.NewFnCache(utils.FnCacheConfig{ + TTL: time.Minute * 10, + Clock: cfg.clock, + }) + if err != nil { + return nil, trace.Wrap(err) + } + + return &sessionHandler{ + sessionHandlerConfig: cfg, + idTracker: idTracker, + accessCache: accessCache, + }, nil +} + +func (s *sessionHandler) checkAccessToTool(ctx context.Context, toolName string) error { + authErr, err := utils.FnCacheGet(ctx, s.accessCache, toolName, func(ctx context.Context) (error, error) { + authPref, err := s.accessPoint.GetAuthPreference(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + matcher := &services.MCPToolMatcher{ + Name: toolName, + } + authErr := s.AuthCtx.Checker.CheckAccess(s.App, s.getAccessState(authPref), matcher) + return trace.Wrap(authErr), nil + }) + // Fails the check on either authErr or internal error. + return trace.NewAggregate(authErr, err) +} + +func (s *sessionHandler) processClientNotification(ctx context.Context, notification *mcputils.JSONRPCNotification) { + s.emitNotificationEvent(ctx, notification) +} + +func (s *sessionHandler) onClientNotification(serverRequestWriter mcputils.MessageWriter) mcputils.HandleNotificationFunc { + return func(ctx context.Context, notification *mcputils.JSONRPCNotification) error { + s.processClientNotification(ctx, notification) + return trace.Wrap(serverRequestWriter.WriteMessage(ctx, notification)) + } +} + +func (s *sessionHandler) onClientRequest(clientResponseWriter, serverRequestWriter mcputils.MessageWriter) mcputils.HandleRequestFunc { + return func(ctx context.Context, request *mcputils.JSONRPCRequest) error { + msg, replyDirection := s.processClientRequest(ctx, request) + if replyDirection == replyToClient { + return trace.Wrap(clientResponseWriter.WriteMessage(ctx, msg)) + } + return trace.Wrap(serverRequestWriter.WriteMessage(ctx, msg)) + } +} + +func (s *sessionHandler) onServerNotification(clientResponseWriter mcputils.MessageWriter) mcputils.HandleNotificationFunc { + return func(ctx context.Context, notification *mcputils.JSONRPCNotification) error { + return trace.Wrap(clientResponseWriter.WriteMessage(ctx, notification)) + } +} + +func (s *sessionHandler) onServerResponse(clientResponseWriter mcputils.MessageWriter) mcputils.HandleResponseFunc { + return func(ctx context.Context, response *mcputils.JSONRPCResponse) error { + msgToClient := s.processServerResponse(ctx, response) + return trace.Wrap(clientResponseWriter.WriteMessage(ctx, msgToClient)) + } +} + +type replyDirection bool + +const ( + replyToClient replyDirection = true + replyToServer replyDirection = false +) + +func (s *sessionHandler) processClientRequest(ctx context.Context, req *mcputils.JSONRPCRequest) (mcp.JSONRPCMessage, replyDirection) { + s.idTracker.PushRequest(req) + switch req.Method { + case mcp.MethodToolsCall: + methodName, _ := req.Params.GetName() + if authErr := s.checkAccessToTool(ctx, methodName); authErr != nil { + s.emitRequestEvent(ctx, req, authErr) + return makeToolAccessDeniedResponse(req, authErr), replyToClient + } + } + s.emitRequestEvent(ctx, req, nil) + return req, replyToServer +} + +func (s *sessionHandler) processServerResponse(ctx context.Context, response *mcputils.JSONRPCResponse) mcp.JSONRPCMessage { + method, _ := s.idTracker.PopByID(response.ID) + switch method { + case mcp.MethodToolsList: + return s.makeToolsCallResponse(ctx, response) + } + return response +} + +func (s *sessionHandler) makeToolsCallResponse(ctx context.Context, resp *mcputils.JSONRPCResponse) mcp.JSONRPCMessage { + // Nothing to do, likely an error response. + if resp.Result == nil { + return resp + } + + var listResult mcp.ListToolsResult + if err := json.Unmarshal(resp.Result, &listResult); err != nil { + return mcp.NewJSONRPCError(resp.ID, mcp.INTERNAL_ERROR, "failed to unmarshal tools/list response", err) + } + + var allowed []mcp.Tool + for _, tool := range listResult.Tools { + if s.checkAccessToTool(ctx, tool.Name) == nil { + allowed = append(allowed, tool) + } + } + + s.logger.DebugContext(ctx, "Received tools/list result", "received", len(listResult.Tools), "allowed", len(allowed)) + listResult.Tools = allowed + + return mcp.JSONRPCResponse{ + JSONRPC: resp.JSONRPC, + ID: resp.ID, + Result: listResult, + } +} + +func makeToolAccessDeniedResponse(msg *mcputils.JSONRPCRequest, authErr error) mcp.JSONRPCMessage { + return mcp.NewJSONRPCError( + msg.ID, + mcp.INVALID_PARAMS, + "RBAC is enforced by your Teleport roles. Contact your Teleport Admin for more details.", + authErr, + ) +} diff --git a/lib/srv/mcp/session_test.go b/lib/srv/mcp/session_test.go new file mode 100644 index 0000000000000..d18b600258620 --- /dev/null +++ b/lib/srv/mcp/session_test.go @@ -0,0 +1,153 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "testing" + + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/require" + + apievents "github.com/gravitational/teleport/api/types/events" + libevents "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/events/eventstest" + "github.com/gravitational/teleport/lib/utils/mcputils" +) + +func Test_sessionHandler(t *testing.T) { + tests := []struct { + name string + setupOptions []setupTestContextOptionFunc + allowedTools []string + deniedTools []string + }{ + { + name: "admin", + setupOptions: []setupTestContextOptionFunc{withAdminRole(t)}, + allowedTools: []string{"search_files", "read_file", "write_file"}, + }, + { + name: "readonly", + setupOptions: []setupTestContextOptionFunc{withProdReadOnlyRole(t)}, + allowedTools: []string{"search_files", "read_file"}, + deniedTools: []string{"write_file"}, + }, + { + name: "no-access", + setupOptions: []setupTestContextOptionFunc{ + withAdminRole(t), + withDenyToolsRole(t), + }, + allowedTools: nil, + deniedTools: []string{"search_files", "read_file", "write_file"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx := t.Context() + testCtx := setupTestContext(t, tt.setupOptions...) + mockEmitter := &eventstest.MockRecorderEmitter{} + requestBuilder := &requestBuilder{} + auditor, err := newSessionAuditor(sessionAuditorConfig{ + emitter: mockEmitter, + hostID: "test-host-id", + sessionCtx: testCtx.SessionCtx, + preparer: &libevents.NoOpPreparer{}, + }) + require.NoError(t, err) + + handler, err := newSessionHandler(sessionHandlerConfig{ + SessionCtx: testCtx.SessionCtx, + sessionAuditor: auditor, + accessPoint: fakeAccessPoint{}, + parentCtx: ctx, + }) + require.NoError(t, err) + + t.Run("notification", func(t *testing.T) { + handler.processClientNotification(ctx, &mcputils.JSONRPCNotification{ + JSONRPC: mcp.JSONRPC_VERSION, + Method: "notifications/initialized", + }) + event := mockEmitter.LastEvent() + require.NotNil(t, event) + requestEvent, ok := event.(*apievents.MCPSessionNotification) + require.True(t, ok) + require.Equal(t, "notifications/initialized", requestEvent.Message.Method) + }) + + for _, allowedTool := range tt.allowedTools { + t.Run("allow tools call "+allowedTool, func(t *testing.T) { + clientReq := requestBuilder.makeToolsCallRequest(allowedTool) + msg, dir := handler.processClientRequest(ctx, clientReq) + require.Equal(t, replyToServer, dir) + require.Equal(t, clientReq, msg) + + event := mockEmitter.LastEvent() + require.NotNil(t, event) + requestEvent, ok := event.(*apievents.MCPSessionRequest) + require.True(t, ok) + require.True(t, requestEvent.Success) + require.Equal(t, string(mcp.MethodToolsCall), requestEvent.Message.Method) + checkParamsHaveNameField(t, requestEvent.Message.Params, allowedTool) + }) + } + + for _, deniedTool := range tt.deniedTools { + t.Run("deny tools call "+deniedTool, func(t *testing.T) { + clientReq := requestBuilder.makeToolsCallRequest(deniedTool) + msg, dir := handler.processClientRequest(ctx, clientReq) + require.Equal(t, replyToClient, dir) + errMsg, ok := msg.(mcp.JSONRPCError) + require.True(t, ok) + require.Equal(t, clientReq.ID, errMsg.ID) + + event := mockEmitter.LastEvent() + require.NotNil(t, event) + requestEvent, ok := event.(*apievents.MCPSessionRequest) + require.True(t, ok) + require.False(t, requestEvent.Success) + require.Equal(t, string(mcp.MethodToolsCall), requestEvent.Message.Method) + checkParamsHaveNameField(t, requestEvent.Message.Params, deniedTool) + }) + } + + t.Run("tools list", func(t *testing.T) { + mockEmitter.Reset() + + // First make a request so the handler can track the method by ID. + clientReq := requestBuilder.makeToolsListRequest() + _, dir := handler.processClientRequest(ctx, clientReq) + require.Equal(t, replyToServer, dir) + + // tools/list does not trigger audit event. + require.Nil(t, mockEmitter.LastEvent()) + + // make response from server to contain both allowed and denied + // tools then check only the allowed tools are present after the + // filtering. + allTools := append(tt.allowedTools, tt.deniedTools...) + serverResponse := makeToolsCallResponse(t, clientReq.ID, allTools...) + processedResponse := handler.processServerResponse(ctx, serverResponse) + checkToolsListResponse(t, processedResponse, clientReq.ID, tt.allowedTools) + }) + }) + } +} diff --git a/lib/srv/mcp/stdio.go b/lib/srv/mcp/stdio.go new file mode 100644 index 0000000000000..368e3aab2d2ff --- /dev/null +++ b/lib/srv/mcp/stdio.go @@ -0,0 +1,268 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "context" + "errors" + "io" + "net" + "os" + "os/exec" + "os/user" + "sync" + "syscall" + "time" + + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + + hostutils "github.com/gravitational/teleport/lib/utils/host" + "github.com/gravitational/teleport/lib/utils/mcputils" +) + +// handleAuthErrStdio starts a stdio message reader and replies with the auth +// error regardless what message the reader receives (though the first message +// is most likely client's initialize request). The reader handler quits right +// after the auth error is delivered to client, by always returning an error to +// the handler callbacks. +func (s *Server) handleAuthErrStdio(ctx context.Context, clientConn net.Conn, authErr error) error { + logger := s.cfg.Log.With("client_ip", clientConn.RemoteAddr()) + errMsg := mcp.NewJSONRPCError(mcp.NewRequestId(nil), mcp.INTERNAL_ERROR, authErr.Error(), nil) + writer := mcputils.NewStdioMessageWriter(clientConn) + reader, err := mcputils.NewMessageReader(mcputils.MessageReaderConfig{ + Transport: mcputils.NewStdioReader(clientConn), + Logger: logger, + ParentContext: s.cfg.ParentContext, + OnRequest: func(ctx context.Context, req *mcputils.JSONRPCRequest) error { + // Use request ID when available. Return auth error after writing + // back to client to stop the reader. + errMsg.ID = req.ID + return trace.NewAggregate(writer.WriteMessage(ctx, errMsg), authErr) + }, + OnParseError: func(ctx context.Context, _ *mcp.JSONRPCError) error { + return trace.NewAggregate(writer.WriteMessage(ctx, errMsg), authErr) + }, + OnNotification: func(ctx context.Context, _ *mcputils.JSONRPCNotification) error { + return trace.NewAggregate(writer.WriteMessage(ctx, errMsg), authErr) + }, + }) + if err != nil { + return trace.NewAggregate(authErr, err) + } + reader.Run(ctx) + + // Returns the original auth error for caller to log the error and close the + // connection just to be safe. + return trace.Wrap(authErr) +} + +// handleStdio handles a stdio connection. +// makeMCPServer defaults to makeExecServerRunner to launch a command but can be +// mocked for testing. +func (s *Server) handleStdio(ctx context.Context, sessionCtx SessionCtx, makeServerRunner makeStdioServerRunnerFunc) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + session, err := s.makeSessionHandler(ctx, sessionCtx) + if err != nil { + return trace.Wrap(err) + } + + session.logger.DebugContext(s.cfg.ParentContext, "Started handling stdio session") + defer session.logger.DebugContext(s.cfg.ParentContext, "Completed handling stdio session") + + serverRunner, err := makeServerRunner(ctx, session) + if err != nil { + return trace.Wrap(err) + } + defer serverRunner.close() + + readFromServer, err := serverRunner.getStdoutPipe() + if err != nil { + return trace.Wrap(err) + } + writeToServer, err := serverRunner.getStdinPipe() + if err != nil { + return trace.Wrap(err) + } + + clientResponseWriter := mcputils.NewSyncStdioMessageWriter(sessionCtx.ClientConn) + serverRequestWriter := mcputils.NewSyncStdioMessageWriter(writeToServer) + + clientRequestReader, err := mcputils.NewMessageReader(mcputils.MessageReaderConfig{ + Transport: mcputils.NewStdioReader(sessionCtx.ClientConn), + Logger: session.logger.With("stdio", "stdin"), + ParentContext: s.cfg.ParentContext, + // make sure launched process is getting shut down when client is closed. + OnClose: serverRunner.close, + OnParseError: mcputils.ReplyParseError(clientResponseWriter), + OnRequest: session.onClientRequest(clientResponseWriter, serverRequestWriter), + OnNotification: session.onClientNotification(serverRequestWriter), + }) + if err != nil { + return trace.Wrap(err) + } + + stdoutLogger := session.logger.With("stdio", "stdout") + serverResponseReader, err := mcputils.NewMessageReader(mcputils.MessageReaderConfig{ + Transport: mcputils.NewStdioReader(readFromServer), + Logger: stdoutLogger, + ParentContext: s.cfg.ParentContext, + OnClose: serverRunner.close, + OnParseError: mcputils.LogAndIgnoreParseError(stdoutLogger), + OnNotification: session.onServerNotification(clientResponseWriter), + OnResponse: session.onServerResponse(clientResponseWriter), + }) + if err != nil { + return trace.Wrap(err) + } + + // TODO(greedy52) capture client info then emit start event with client + // information. + session.emitStartEvent(s.cfg.ParentContext) + defer session.emitEndEvent(s.cfg.ParentContext) + + go clientRequestReader.Run(ctx) + go serverResponseReader.Run(ctx) + return trace.Wrap(serverRunner.run(ctx)) +} + +// stdioServerRunner is an interface that represents a stdio-based MCP server to +// be launched. Can be mocked for testing. +type stdioServerRunner interface { + // getStdoutPipe returns an io.ReadCloser for reading responses from + // server's stdout. + getStdoutPipe() (io.ReadCloser, error) + // getStdinPipe returns an io.Writer for writing messages to server's + // stdin. + getStdinPipe() (io.WriteCloser, error) + // run starts the MCP server and blocks until it is shut down. + run(context.Context) error + // close shuts down the MCP server. + close() +} + +type makeStdioServerRunnerFunc func(context.Context, *sessionHandler) (stdioServerRunner, error) + +// execServer is the real implementation for stdioServerRunner that launches an +// exec.Command. +type execServer struct { + cmd *exec.Cmd + session *sessionHandler +} + +func (s *execServer) getStdoutPipe() (io.ReadCloser, error) { + return s.cmd.StdoutPipe() +} + +func (s *execServer) getStdinPipe() (io.WriteCloser, error) { + return s.cmd.StdinPipe() +} + +func (s *execServer) run(context.Context) error { + if err := s.cmd.Start(); err != nil { + return trace.Wrap(err) + } + + err := s.cmd.Wait() + s.session.logger.DebugContext(s.session.parentCtx, "Command exited", + "error", err, + "exit", s.cmd.ProcessState.ExitCode(), + ) + if err != nil && !isOKExitError(err) { + return trace.Wrap(err) + } + return nil +} + +func (s *execServer) close() { + if err := s.cmd.Cancel(); err != nil && !isOKExitError(err) { + s.session.logger.WarnContext(s.session.parentCtx, "Failed to cancel command", "error", err) + } +} + +func makeExecServerRunner(ctx context.Context, session *sessionHandler) (stdioServerRunner, error) { + mcpSpec := session.App.GetMCP() + if mcpSpec == nil { + return nil, trace.BadParameter("missing MCP spec") + } + + logger := session.logger + logger.DebugContext(ctx, "Preparing command to execute", + "cmd", mcpSpec.Command, + "args", mcpSpec.Args, + ) + + cmdCtx, cmdCancel := context.WithCancel(ctx) + cmd := exec.CommandContext(cmdCtx, mcpSpec.Command, mcpSpec.Args...) + cmd.Stderr = mcputils.NewStderrTraceLogWriter(ctx, logger) + // WaitDelay forces a SIGKILL if the process fails to exit 10 seconds after + // cmd.Cancel is called. See the WaitDelay doc for details. + cmd.WaitDelay = 10 * time.Second + // We put all shutdown procedures in cmd.Cancel because we are too lazy to + // make a separate function. Since cmd.Cancel can be called outside here by + // the server handler, we make sure 'cmdCancel' is called to cancel the + // command in that case. + cmd.Cancel = sync.OnceValue(func() error { + cmdCancel() + + if cmd.Process != nil { + // Use SIGINT for graceful shutdown since stdio servers are + // "interactive". + logger.DebugContext(ctx, "Sending SIGINT to command") + return trace.Wrap(cmd.Process.Signal(syscall.SIGINT)) + } + return nil + }) + + // Set host user. + hostUser, err := user.Lookup(mcpSpec.RunAsHostUser) + if err != nil { + return nil, trace.Wrap(err) + } + if err := hostutils.MaybeSetCommandCredentialAsUser(ctx, cmd, hostUser, logger); err != nil { + return nil, trace.Wrap(err) + } + + mcpServer := &execServer{ + cmd: cmd, + session: session, + } + return mcpServer, nil +} + +func isExitErrorSignal(exitErr error, signal syscall.Signal) bool { + var execExitError *exec.ExitError + if !errors.As(exitErr, &execExitError) { + return false + } + waitStatus, ok := execExitError.Sys().(syscall.WaitStatus) + if !ok { + return false + } + return waitStatus.Signaled() && waitStatus.Signal() == signal +} + +func isOKExitError(exitError error) bool { + return errors.Is(exitError, context.Canceled) || + errors.Is(exitError, os.ErrProcessDone) || + // it's fine if the command is gracefully stopped by us. + isExitErrorSignal(exitError, syscall.SIGINT) +} diff --git a/lib/srv/mcp/stdio_test.go b/lib/srv/mcp/stdio_test.go new file mode 100644 index 0000000000000..19a9078fdf7e7 --- /dev/null +++ b/lib/srv/mcp/stdio_test.go @@ -0,0 +1,303 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcp + +import ( + "context" + "os" + "path" + "testing" + "time" + + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/events/eventstest" + "github.com/gravitational/teleport/lib/utils/mcptest" +) + +func Test_handleAuthErrStdio(t *testing.T) { + ctx := t.Context() + s, err := NewServer(ServerConfig{ + Emitter: &events.DiscardEmitter{}, + ParentContext: ctx, + HostID: "my-host-id", + AccessPoint: fakeAccessPoint{}, + }) + require.NoError(t, err) + + clientSourceConn, clientDestConn := makeDualPipeNetConn(t) + + originalAuthErr := trace.AccessDenied("test access denied") + handlerDoneCh := make(chan struct{}, 1) + go func() { + handlerErr := s.HandleUnauthorizedConnection(ctx, clientDestConn, originalAuthErr) + handlerDoneCh <- struct{}{} + require.ErrorIs(t, handlerErr, originalAuthErr) + }() + + stdioClient := mcptest.NewStdioClientFromConn(t, clientSourceConn) + _, err = mcptest.InitializeClient(ctx, stdioClient) + require.EqualError(t, err, originalAuthErr.Error()) + + select { + case <-time.After(time.Second * 10): + require.Fail(t, "timed out waiting for handler") + case <-handlerDoneCh: + } +} + +func Test_handleStdio(t *testing.T) { + ctx := t.Context() + testCtx := setupTestContext(t, withAdminRole(t)) + emitter := eventstest.MockRecorderEmitter{} + s, err := NewServer(ServerConfig{ + Emitter: &emitter, + ParentContext: ctx, + HostID: "my-host-id", + AccessPoint: fakeAccessPoint{}, + }) + require.NoError(t, err) + + handlerDoneCh := make(chan struct{}, 1) + defer close(handlerDoneCh) + go func() { + // Use the demo server. + handlerErr := s.handleStdio(ctx, *testCtx.SessionCtx, makeDemoServerRunner) + handlerDoneCh <- struct{}{} + require.NoError(t, handlerErr) + }() + + // Use a real client. Verify session start and end events. + stdioClient := mcptest.NewStdioClientFromConn(t, testCtx.clientSourceConn) + require.EventuallyWithT(t, func(collect *assert.CollectT) { + event := emitter.LastEvent() + _, ok := event.(*apievents.MCPSessionStart) + assert.True(collect, ok) + }, time.Second*5, time.Millisecond*100, "expect session start") + + // Some basic tests on the demo server. + resp, err := mcptest.InitializeClient(ctx, stdioClient) + require.NoError(t, err) + require.Equal(t, "teleport-demo", resp.ServerInfo.Name) + + listToolsResult, err := stdioClient.ListTools(ctx, mcp.ListToolsRequest{}) + require.NoError(t, err) + checkToolsListResult(t, listToolsResult, []string{ + "teleport_user_info", + "teleport_session_info", + "teleport_demo_info", + }) + + callToolResult, err := stdioClient.CallTool(ctx, mcp.CallToolRequest{ + Params: mcp.CallToolParams{ + Name: "teleport_user_info", + }, + }) + require.NoError(t, err) + require.Len(t, callToolResult.Content, 1) + + // Now close the client. + stdioClient.Close() + select { + case <-time.After(time.Second * 5): + require.Fail(t, "timed out waiting for handler") + case <-handlerDoneCh: + } + event := emitter.LastEvent() + _, ok := event.(*apievents.MCPSessionEnd) + require.True(t, ok) +} + +// TestHandleSession_execMCPServer tests real server handler for stdio-based MCP +// server but requires docker installed locally. It will run the "everything" +// MCP server and "alpine". +// +// TELEPORT_MCP_TEST_DOCKER_WITH_HOST_USER needs to be set with a username to +// run as for the docker command. To test running with ambient credential vs a +// different user, run the test once with your current user as host user then +// run one more time with sudo. +func TestHandleSession_execMCPServer(t *testing.T) { + runAsHostUser := os.Getenv("TELEPORT_MCP_TEST_DOCKER_WITH_HOST_USER") + if runAsHostUser == "" { + t.Skip("This test requires docker and set TELEPORT_MCP_TEST_DOCKER_WITH_HOST_USER= in your environment") + } + + dockerClient := newDockerClient(t) + s, err := NewServer(ServerConfig{ + Emitter: &events.DiscardEmitter{}, + ParentContext: t.Context(), + HostID: "my-host-id", + AccessPoint: fakeAccessPoint{}, + }) + require.NoError(t, err) + + containerShouldBeRemoved := func(t *testing.T, _ *testContext, containerName string) { + t.Helper() + require.Empty(t, findDockerContainerID(t.Context(), dockerClient, containerName)) + } + + connectAfterHandlerStart := func(t *testing.T, testCtx *testContext, containerName string) { + t.Helper() + + stdioClient := mcptest.NewStdioClientFromConn(t, testCtx.clientSourceConn) + defer stdioClient.Close() + + reqCtx, reqCancel := context.WithTimeout(t.Context(), time.Second*5) + defer reqCancel() + resp, err := mcptest.InitializeClient(reqCtx, stdioClient) + require.NoError(t, err) + require.Equal(t, "example-servers/everything", resp.ServerInfo.Name) + + // Check container is running. + require.NotEmpty(t, findDockerContainerID(t.Context(), dockerClient, containerName)) + } + + tests := []struct { + name string + cmd string + checkHandlerError require.ErrorAssertionFunc + dockerRunArgs []string + cancelHandlerCtx bool + afterHandlerStart func(t *testing.T, testCtx *testContext, containerName string) + waitForHandlerExit time.Duration + afterHandlerStop func(t *testing.T, testCtx *testContext, containerName string) + }{ + { + // Verify initialize response from real everything server. Then + // close the transport to trigger shutdown + name: "everything success", + cmd: "docker", + dockerRunArgs: []string{"mcp/everything"}, + checkHandlerError: require.NoError, + afterHandlerStart: connectAfterHandlerStart, + waitForHandlerExit: time.Second * 5, + afterHandlerStop: containerShouldBeRemoved, + }, + { + // Make sure handler exits when handler context is canceled. + name: "cancel handler context", + cmd: "docker", + dockerRunArgs: []string{"mcp/everything"}, + checkHandlerError: require.NoError, + cancelHandlerCtx: true, + waitForHandlerExit: time.Second * 5, + afterHandlerStart: connectAfterHandlerStart, + afterHandlerStop: containerShouldBeRemoved, + }, + { + // Make sure handler is not blocked when command fails to start. + name: "fail to start", + cmd: "fail-to-start", + checkHandlerError: require.Error, + waitForHandlerExit: time.Second * 5, + }, + { + // Make sure handler is not blocked when command starts then fails + // right away. + name: "error exit", + cmd: "docker", + dockerRunArgs: []string{"--some-unknown-flag"}, + checkHandlerError: require.Error, + waitForHandlerExit: time.Second * 5, + afterHandlerStop: containerShouldBeRemoved, + }, + { + // Make sure SIGKILL is sent when the MCP server traps SIGINT. This + // test will last more than 10 seconds to trigger the WaitDelay. + // + // Unfortunately, SIGKILL won't remove the docker container. So + // do not check containerShouldBeRemoved and just let the test do + // the cleanup. In the future, Teleport should either implement + // proper docker runtime (like how this test is using docker API) or + // introduce a proper shut down sequence (like systemctl stop). + name: "wait for SIGKILL", + cmd: "docker", + dockerRunArgs: []string{ + "alpine", "sh", "-c", + `trap "" INT; while :; do sleep 1; done`, + }, + checkHandlerError: require.Error, + afterHandlerStart: func(t *testing.T, testCtx *testContext, _ string) { + // Trigger shutdown. + testCtx.clientSourceConn.Close() + t.Log("waiting 10 seconds for SIGKILL") + }, + waitForHandlerExit: time.Second * 15, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + containerName := "teleport-test-mcp-" + path.Base(t.Name()) + t.Cleanup(func() { + forceRemoveContainer(t, dockerClient, containerName) + }) + + args := tt.dockerRunArgs + if tt.cmd == "docker" { + args = append([]string{"run", "--name", containerName, "-i", "--rm"}, tt.dockerRunArgs...) + } + + app, err := types.NewAppV3(types.Metadata{ + Name: t.Name(), + }, types.AppSpecV3{ + MCP: &types.MCP{ + Command: tt.cmd, + Args: args, + RunAsHostUser: runAsHostUser, + }, + }) + require.NoError(t, err) + + testCtx := setupTestContext(t, withAdminRole(t), withApp(app)) + handlerCtx, handlerCtxCancel := context.WithCancel(t.Context()) + defer handlerCtxCancel() + handlerDoneCh := make(chan struct{}, 1) + defer close(handlerDoneCh) + go func() { + handlerErr := s.HandleSession(handlerCtx, *testCtx.SessionCtx) + handlerDoneCh <- struct{}{} + tt.checkHandlerError(t, handlerErr) + }() + + if tt.afterHandlerStart != nil { + tt.afterHandlerStart(t, &testCtx, containerName) + } + if tt.cancelHandlerCtx { + handlerCtxCancel() + } + + select { + case <-time.After(tt.waitForHandlerExit): + require.Fail(t, "timed out waiting for handler") + case <-handlerDoneCh: + } + + if tt.afterHandlerStop != nil { + tt.afterHandlerStop(t, &testCtx, containerName) + } + }) + } +} diff --git a/lib/srv/reexec.go b/lib/srv/reexec.go index f8698829931a0..11cc655f0ec91 100644 --- a/lib/srv/reexec.go +++ b/lib/srv/reexec.go @@ -55,6 +55,7 @@ import ( "github.com/gravitational/teleport/lib/sshutils/x11" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/utils/envutils" + "github.com/gravitational/teleport/lib/utils/host" "github.com/gravitational/teleport/lib/utils/uds" ) @@ -630,7 +631,7 @@ func RunNetworking() (errw io.Writer, code int, err error) { return errorWriter, teleport.RemoteCommandFailure, trace.NotFound("%s", err) } - cred, err := getCmdCredential(localUser) + cred, err := host.GetHostUserCredential(localUser) if err != nil { return errorWriter, teleport.RemoteCommandFailure, trace.Wrap(err) } @@ -1180,26 +1181,10 @@ func buildCommand(c *ExecCommand, localUser *user.User, tty *os.File, pamEnviron // workaround this, the credentials struct is only set if the credentials // are different from the process itself. If the credentials are not, simply // pick up the ambient credentials of the process. - credential, err := getCmdCredential(localUser) - if err != nil { + if err := host.MaybeSetCommandCredentialAsUser(context.Background(), &cmd, localUser, slog.Default()); err != nil { return nil, trace.Wrap(err) } - if os.Getuid() != int(credential.Uid) || os.Getgid() != int(credential.Gid) { - cmd.SysProcAttr.Credential = credential - slog.DebugContext(context.Background(), "Creating process", - "uid", credential.Uid, - "gid", credential.Gid, - "groups", credential.Groups, - ) - } else { - slog.DebugContext(context.Background(), "Creating process with ambient credentials", - "uid", credential.Uid, - "gid", credential.Gid, - "groups", credential.Groups, - ) - } - // Perform OS-specific tweaks to the command. if isReexec { reexecCommandOSTweaks(&cmd) @@ -1378,7 +1363,7 @@ func CheckHomeDir(localUser *user.User) (bool, error) { return false, trace.Wrap(err) } - credential, err := getCmdCredential(localUser) + credential, err := host.GetHostUserCredential(localUser) if err != nil { return false, trace.Wrap(err) } @@ -1434,51 +1419,3 @@ func (o *osWrapper) newParker(ctx context.Context, credential syscall.Credential return nil } - -// getCmdCredentials parses the uid, gid, and groups of the -// given user into a credential object for a command to use. -func getCmdCredential(localUser *user.User) (*syscall.Credential, error) { - uid, err := strconv.ParseUint(localUser.Uid, 10, 32) - if err != nil { - return nil, trace.Wrap(err) - } - gid, err := strconv.ParseUint(localUser.Gid, 10, 32) - if err != nil { - return nil, trace.Wrap(err) - } - - if runtime.GOOS == "darwin" { - // on macOS we should rely on the list of groups managed by the system - // (the use of setgroups is "highly discouraged", as per the setgroups - // man page in macOS 13.5) - return &syscall.Credential{ - Uid: uint32(uid), - Gid: uint32(gid), - NoSetGroups: true, - }, nil - } - - // Lookup supplementary groups for the user. - userGroups, err := localUser.GroupIds() - if err != nil { - return nil, trace.Wrap(err) - } - groups := make([]uint32, 0) - for _, sgid := range userGroups { - igid, err := strconv.ParseUint(sgid, 10, 32) - if err != nil { - slog.WarnContext(context.Background(), "Cannot interpret user group", "user_group", sgid) - } else { - groups = append(groups, uint32(igid)) - } - } - if len(groups) == 0 { - groups = append(groups, uint32(gid)) - } - - return &syscall.Credential{ - Uid: uint32(uid), - Gid: uint32(gid), - Groups: groups, - }, nil -} diff --git a/lib/srv/reexec_test.go b/lib/srv/reexec_test.go index c73b577f0f620..8a33840007a02 100644 --- a/lib/srv/reexec_test.go +++ b/lib/srv/reexec_test.go @@ -350,7 +350,7 @@ func testX11Forward(ctx context.Context, t *testing.T, proc *networking.Process, } require.NoError(t, err) - cred, err := getCmdCredential(localUser) + cred, err := host.GetHostUserCredential(localUser) require.NoError(t, err) // Create a temporary xauth file path belonging to the user. diff --git a/lib/usagereporter/teleport/aggregating/reporter.go b/lib/usagereporter/teleport/aggregating/reporter.go index 8ede6fb75bccd..b77364453364b 100644 --- a/lib/usagereporter/teleport/aggregating/reporter.go +++ b/lib/usagereporter/teleport/aggregating/reporter.go @@ -425,6 +425,9 @@ Ingest: userRecord(te.UserName, te.UserKind).AppTcpSessions++ case usagereporter.SAMLIdPSessionType: userRecord(te.UserName, prehogv1alpha.UserKind_USER_KIND_HUMAN).SamlIdpSessions++ + case usagereporter.MCPAppSessionType: + // TODO(greedy52) switch to MCPSessions when it's available. + userRecord(te.UserName, te.UserKind).AppSessions++ } case *usagereporter.KubeRequestEvent: userRecord(te.UserName, te.UserKind).KubeRequests++ diff --git a/lib/usagereporter/teleport/audit.go b/lib/usagereporter/teleport/audit.go index bba48bb583020..ce1203c1a0d0c 100644 --- a/lib/usagereporter/teleport/audit.go +++ b/lib/usagereporter/teleport/audit.go @@ -31,6 +31,9 @@ const ( // TCPSessionType is the session_type in tp.session.start for TCP // Application Access. TCPSessionType = "app_tcp" + // MCPAppSessionType is the session_type in tp.session.start for MCP + // Access via App access. + MCPAppSessionType = "app_mcp" // PortSessionType is the session_type in tp.session.start for SSH or Kube // port forwarding. // @@ -371,6 +374,12 @@ func ConvertAuditEvent(event apievents.AuditEvent) Anonymizable { UserName: e.User, SessionType: string(SAMLIdPSessionType), } + case *apievents.MCPSessionStart: + return &SessionStartEvent{ + UserName: e.User, + SessionType: MCPAppSessionType, + UserKind: prehogUserKindFromEventKind(e.UserKind), + } } return nil diff --git a/lib/usagereporter/teleport/audit_test.go b/lib/usagereporter/teleport/audit_test.go index 4a63f10b13615..00e4dc8fa4cba 100644 --- a/lib/usagereporter/teleport/audit_test.go +++ b/lib/usagereporter/teleport/audit_test.go @@ -277,6 +277,27 @@ func TestConvertAuditEvent(t *testing.T) { }, }, }, + { + desc: "MCPSessionStart", + event: &apievents.MCPSessionStart{ + UserMetadata: apievents.UserMetadata{User: "alice"}, + AppMetadata: apievents.AppMetadata{ + AppName: "mcp-everything", + }, + }, + expected: &SessionStartEvent{ + SessionType: MCPAppSessionType, + UserName: "alice", + }, + expectedAnonymized: &prehogv1a.SubmitEventRequest{ + Event: &prehogv1a.SubmitEventRequest_SessionStartV2{ + SessionStartV2: &prehogv1a.SessionStartEvent{ + SessionType: MCPAppSessionType, + UserName: anonymizer.AnonymizeString("alice"), + }, + }, + }, + }, } for _, tt := range cases { diff --git a/lib/utils/cli.go b/lib/utils/cli.go index 9d47a75849f9f..5d6a35acae537 100644 --- a/lib/utils/cli.go +++ b/lib/utils/cli.go @@ -54,6 +54,8 @@ const ( LoggingForDaemon LoggingPurpose = iota // LoggingForCLI configures logging for user face utilities (tctl, tsh). LoggingForCLI + // LoggingForMCP configures logging for MCP servers. + LoggingForMCP ) // LoggingFormat defines the possible logging output formats. @@ -100,7 +102,7 @@ func IsTerminal(w io.Writer) bool { } // InitLogger configures the global logger for a given purpose / verbosity level -func InitLogger(purpose LoggingPurpose, level slog.Level, opts ...LoggerOption) error { +func InitLogger(purpose LoggingPurpose, level slog.Level, opts ...LoggerOption) (*slog.Logger, error) { var o logOpts for _, opt := range opts { @@ -110,23 +112,28 @@ func InitLogger(purpose LoggingPurpose, level slog.Level, opts ...LoggerOption) // If debug or trace logging is not enabled for CLIs, // then discard all log output. if purpose == LoggingForCLI && level > slog.LevelDebug { - slog.SetDefault(slog.New(slog.DiscardHandler)) - return nil + logger := slog.New(slog.DiscardHandler) + slog.SetDefault(logger) + return logger, nil } var output string - if o.osLogSubsystem != "" { + switch { + case o.osLogSubsystem != "": output = logutils.LogOutputOSLog + case purpose == LoggingForMCP: + output = logutils.LogOutputMCP + o.format = LogFormatJSON } - _, _, err := logutils.Initialize(logutils.Config{ + logger, _, err := logutils.Initialize(logutils.Config{ Severity: level.String(), Format: o.format, EnableColors: IsTerminal(os.Stderr), Output: output, OSLogSubsystem: o.osLogSubsystem, }) - return trace.Wrap(err) + return logger, trace.Wrap(err) } var initTestLoggerOnce = sync.Once{} diff --git a/lib/utils/host/hostusers.go b/lib/utils/host/hostusers.go index f8cbbd9dbdade..6a1b18d6b3ee8 100644 --- a/lib/utils/host/hostusers.go +++ b/lib/utils/host/hostusers.go @@ -27,8 +27,11 @@ import ( "os" "os/exec" "os/user" + "runtime" "slices" + "strconv" "strings" + "syscall" "github.com/gravitational/trace" ) @@ -340,3 +343,80 @@ func UserShell(username string) (string, error) { return string(entry), nil } + +// GetHostUserCredential parses the uid, gid, and groups of the given user intoAdd commentMore actions +// a credential object for a command to use. +func GetHostUserCredential(localUser *user.User) (*syscall.Credential, error) { + uid, err := strconv.ParseUint(localUser.Uid, 10, 32) + if err != nil { + return nil, trace.Wrap(err) + } + gid, err := strconv.ParseUint(localUser.Gid, 10, 32) + if err != nil { + return nil, trace.Wrap(err) + } + + if runtime.GOOS == "darwin" { + // on macOS we should rely on the list of groups managed by the system + // (the use of setgroups is "highly discouraged", as per the setgroups + // man page in macOS 13.5) + return &syscall.Credential{ + Uid: uint32(uid), + Gid: uint32(gid), + NoSetGroups: true, + }, nil + } + + // Lookup supplementary groups for the user. + userGroups, err := localUser.GroupIds() + if err != nil { + return nil, trace.Wrap(err) + } + groups := make([]uint32, 0) + for _, sgid := range userGroups { + igid, err := strconv.ParseUint(sgid, 10, 32) + if err != nil { + slog.WarnContext(context.Background(), "Cannot interpret user group", "user_group", sgid) + } else { + groups = append(groups, uint32(igid)) + } + } + if len(groups) == 0 { + groups = append(groups, uint32(gid)) + } + + return &syscall.Credential{ + Uid: uint32(uid), + Gid: uint32(gid), + Groups: groups, + }, nil +} + +// MaybeSetCommandCredentialAsUser sets process credentials if the UID/GID of the +// requesting user are different from the process (Teleport). +func MaybeSetCommandCredentialAsUser(ctx context.Context, cmd *exec.Cmd, requestUser *user.User, logger *slog.Logger) error { + credential, err := GetHostUserCredential(requestUser) + if err != nil { + return trace.Wrap(err) + } + + if os.Getuid() == int(credential.Uid) && os.Getgid() == int(credential.Gid) { + logger.DebugContext(ctx, "Creating process with ambient credentials", + "uid", credential.Uid, + "gid", credential.Gid, + "groups", credential.Groups, + ) + return nil + } + + if cmd.SysProcAttr == nil { + cmd.SysProcAttr = &syscall.SysProcAttr{} + } + cmd.SysProcAttr.Credential = credential + logger.DebugContext(ctx, "Creating process", + "uid", credential.Uid, + "gid", credential.Gid, + "groups", credential.Groups, + ) + return nil +} diff --git a/lib/utils/listener/memory.go b/lib/utils/listener/memory.go new file mode 100644 index 0000000000000..5f7795a69952d --- /dev/null +++ b/lib/utils/listener/memory.go @@ -0,0 +1,109 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package listener + +import ( + "context" + "errors" + "io" + "net" + "sync" +) + +// InMemoryListener is a in-memory implementation of a net.Listener. +type InMemoryListener struct { + connCh chan net.Conn + closeCh chan struct{} + closeOnce sync.Once +} + +// Accept implements net.Listener. +func (m *InMemoryListener) Accept() (net.Conn, error) { + select { + case <-m.closeCh: + return nil, io.EOF + default: + } + + for { + select { + case conn := <-m.connCh: + return conn, nil + case <-m.closeCh: + return nil, io.EOF + } + } +} + +// Addr implements net.Listener. +func (m *InMemoryListener) Addr() net.Addr { + return defaultMemoryAddr +} + +// Close implements net.Listener. +func (m *InMemoryListener) Close() error { + m.closeOnce.Do(func() { close(m.closeCh) }) + return nil +} + +// DialContext dials the memory listener, creating a new net.Conn. +// +// This function satisfies net.Dialer.DialContext signature. +func (m *InMemoryListener) DialContext(ctx context.Context, _ string, _ string) (net.Conn, error) { + select { + case <-m.closeCh: + return nil, ErrListenerClosed + case <-ctx.Done(): + return nil, ctx.Err() + default: + } + + serverConn, clientConn := net.Pipe() + + select { + case m.connCh <- serverConn: + case <-ctx.Done(): + // In this case the connection was not accepted in time by the server + // and the dial context is done. To avoid having the server using an + // orphned connection we should close it. + _ = serverConn.Close() + return nil, ctx.Err() + } + return clientConn, nil +} + +// ErrListenerClosed is the error returned by dial when the listener is closed. +var ErrListenerClosed = errors.New("in-memory listener closed") + +// NewInMemoryListener initializes a new in-memory listener. +func NewInMemoryListener() *InMemoryListener { + return &InMemoryListener{ + connCh: make(chan net.Conn), + closeCh: make(chan struct{}), + } +} + +var _ net.Listener = (*InMemoryListener)(nil) + +type memoryAddr string + +func (m memoryAddr) Network() string { return string(m) } +func (m memoryAddr) String() string { return string(m) } + +var defaultMemoryAddr = memoryAddr("memory") + +var _ net.Addr = (*memoryAddr)(nil) diff --git a/lib/utils/listener/memory_test.go b/lib/utils/listener/memory_test.go new file mode 100644 index 0000000000000..024a96031de16 --- /dev/null +++ b/lib/utils/listener/memory_test.go @@ -0,0 +1,132 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package listener + +import ( + "context" + "io" + "sync" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestMemoryListenerClient(t *testing.T) { + var wg sync.WaitGroup + expectedMessage := "hello from server" + + listener := NewInMemoryListener() + t.Cleanup(func() { listener.Close() }) + + wg.Add(1) + go func() { + defer wg.Done() + + conn, err := listener.Accept() + if err != nil { + return + } + t.Cleanup(func() { conn.Close() }) + + _, _ = conn.Write([]byte(expectedMessage)) + }() + + // To avoid blocking in case the server is not working correctly, wrap + // the client connection into a eventually loop. + require.EventuallyWithT(t, func(collect *assert.CollectT) { + conn, err := listener.DialContext(t.Context(), "", "") + require.NoError(collect, err) + + buf := make([]byte, len(expectedMessage)) + n, err := conn.Read(buf[0:]) + require.NoError(collect, err) + require.Equal(collect, len(expectedMessage), n) + require.Equal(collect, expectedMessage, string(buf[:n])) + }, 50*time.Millisecond, 10*time.Millisecond) + + require.Eventually(t, func() bool { + wg.Wait() + return true + }, 50*time.Millisecond, 10*time.Millisecond) +} + +func TestMemoryListenerServer(t *testing.T) { + var wg sync.WaitGroup + expectedMessage := "hello from client" + + listener := NewInMemoryListener() + t.Cleanup(func() { listener.Close() }) + + wg.Add(1) + go func() { + defer wg.Done() + + conn, err := listener.DialContext(t.Context(), "", "") + if err != nil { + return + } + + _, _ = conn.Write([]byte(expectedMessage)) + }() + + // To avoid blocking in case the client is not working correctly, wrap + // the server accept connection into a eventually loop. + require.EventuallyWithT(t, func(collect *assert.CollectT) { + conn, err := listener.Accept() + require.NoError(collect, err) + + buf := make([]byte, len(expectedMessage)) + n, err := conn.Read(buf[0:]) + require.NoError(collect, err) + require.Equal(collect, len(expectedMessage), n) + require.Equal(collect, expectedMessage, string(buf[:n])) + }, 50*time.Millisecond, 10*time.Millisecond) + + // Close the listener and expect subsequent accept calls to return error. + listener.Close() + require.EventuallyWithT(t, func(collect *assert.CollectT) { + _, err := listener.Accept() + require.Error(collect, err) + require.ErrorIs(collect, err, io.EOF) + }, 50*time.Millisecond, 10*time.Millisecond) + + require.Eventually(t, func() bool { + wg.Wait() + return true + }, 50*time.Millisecond, 10*time.Millisecond) +} + +func TestMemoryListenerDialTimeout(t *testing.T) { + listener := NewInMemoryListener() + t.Cleanup(func() { listener.Close() }) + + ctx, cancel := context.WithTimeout(t.Context(), 50*time.Millisecond) + defer cancel() + + require.EventuallyWithT(t, func(collect *assert.CollectT) { + _, err := listener.DialContext(ctx, "", "") + require.Error(collect, err) + require.ErrorIs(collect, err, context.DeadlineExceeded) + }, 100*time.Millisecond, 10*time.Millisecond) + + require.Never(t, func() bool { + _, _ = listener.Accept() + return true + }, 50*time.Millisecond, 10*time.Millisecond, "expected server to not have received connections") +} diff --git a/lib/utils/log/log.go b/lib/utils/log/log.go index 3e68086500e29..48f945c12162c 100644 --- a/lib/utils/log/log.go +++ b/lib/utils/log/log.go @@ -57,6 +57,10 @@ const ( LogOutputSyslog = "syslog" // LogOutputOSLog represents os_log, the unified logging system on macOS, as the destination for logs. LogOutputOSLog = "os_log" + // LogOutputMCP defines to where the MCP command logs will be directed to. + // The stdout is exclusively used as the MCP server transport, leaving only + // stderr available. + LogOutputMCP = "stderr" ) // Initialize configures the default global logger based on the diff --git a/lib/utils/mcptest/test.go b/lib/utils/mcptest/test.go new file mode 100644 index 0000000000000..cf671cfd124f4 --- /dev/null +++ b/lib/utils/mcptest/test.go @@ -0,0 +1,97 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcptest + +import ( + "bytes" + "context" + "io" + "testing" + + "github.com/gravitational/trace" + mcpclient "github.com/mark3labs/mcp-go/client" + mcpclienttransport "github.com/mark3labs/mcp-go/client/transport" + "github.com/mark3labs/mcp-go/mcp" + mcpserver "github.com/mark3labs/mcp-go/server" + "github.com/stretchr/testify/require" +) + +// NewServer creates an MCP test server that provides a "hello-server" tool that +// always returns "hello-client". +func NewServer() *mcpserver.MCPServer { + return NewServerWithVersion("1.0.0") +} + +// NewServerWithVersion creates an MCP test server with the specified version +// and provides a "hello-server" tool that always returns "hello-client". +func NewServerWithVersion(version string) *mcpserver.MCPServer { + server := mcpserver.NewMCPServer("test-server", version) + server.AddTool(mcp.Tool{ + Name: "hello-server", + }, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + return &mcp.CallToolResult{ + Content: []mcp.Content{mcp.NewTextContent("hello client")}, + }, nil + }) + return server +} + +// NewStdioClient creates a new stdio client and ensures the client is closed +// when testing is done. +func NewStdioClient(t *testing.T, input io.Reader, output io.WriteCloser) *mcpclient.Client { + t.Helper() + stdioClientTransport := mcpclienttransport.NewIO(input, output, io.NopCloser(bytes.NewReader(nil))) + stdioClient := mcpclient.NewClient(stdioClientTransport) + t.Cleanup(func() { + stdioClient.Close() + }) + require.NoError(t, stdioClient.Start(t.Context())) + return stdioClient +} + +func NewStdioClientFromConn(t *testing.T, conn io.ReadWriteCloser) *mcpclient.Client { + t.Helper() + return NewStdioClient(t, conn, conn) +} + +// InitializeClient starts initialize sequence and returns the initialize result +// from the server. +func InitializeClient(ctx context.Context, client *mcpclient.Client) (*mcp.InitializeResult, error) { + initReq := mcp.InitializeRequest{} + initReq.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION + initReq.Params.ClientInfo = mcp.Implementation{ + Name: "test-client", + Version: "1.0.0", + } + resp, err := client.Initialize(ctx, initReq) + return resp, trace.Wrap(err) +} + +// MustCallServerTool calls the "hello-server" tool and verifies the result. +func MustCallServerTool(t *testing.T, ctx context.Context, client *mcpclient.Client) { + t.Helper() + callToolRequest := mcp.CallToolRequest{} + callToolRequest.Params.Name = "hello-server" + callToolResult, err := client.CallTool(ctx, callToolRequest) + require.NoError(t, err) + require.NotNil(t, callToolResult) + require.Equal(t, []mcp.Content{ + mcp.NewTextContent("hello client"), + }, callToolResult.Content) +} diff --git a/lib/utils/mcputils/errors.go b/lib/utils/mcputils/errors.go new file mode 100644 index 0000000000000..6aee38c735821 --- /dev/null +++ b/lib/utils/mcputils/errors.go @@ -0,0 +1,45 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "errors" + "io" + "io/fs" + + "github.com/gravitational/teleport/lib/utils" +) + +// IsOKCloseError checks if provided error is a common close error that +// indicates the connection is ended. +func IsOKCloseError(err error) bool { + return errors.Is(err, io.ErrClosedPipe) || + isFileClosedError(err) || + utils.IsOKNetworkError(err) +} + +// isFileClosedError check if the error is a common error when exec.Command +// pipes are closed. +func isFileClosedError(err error) bool { + var pathErr *fs.PathError + if !errors.As(err, &pathErr) { + return false + } + return errors.Is(pathErr.Err, fs.ErrClosed) +} diff --git a/lib/utils/mcputils/id_tracker.go b/lib/utils/mcputils/id_tracker.go new file mode 100644 index 0000000000000..1d528bec5acef --- /dev/null +++ b/lib/utils/mcputils/id_tracker.go @@ -0,0 +1,80 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "sync" + + "github.com/gravitational/trace" + "github.com/hashicorp/golang-lru/v2/simplelru" + "github.com/mark3labs/mcp-go/mcp" +) + +// IDTracker tracks message information like method based on ID. IDTracker +// internally uses an LRU cache to keep track the last X messages to avoid +// growing infinitely. IDTracker is safe for concurrent use. +type IDTracker struct { + mu sync.Mutex + lruCache *simplelru.LRU[mcp.RequestId, mcp.MCPMethod] +} + +// NewIDTracker creates a new IDTracker with provided maximum size. +func NewIDTracker(size int) (*IDTracker, error) { + lruCache, err := simplelru.NewLRU[mcp.RequestId, mcp.MCPMethod](size, nil) + if err != nil { + return nil, trace.Wrap(err) + } + return &IDTracker{ + lruCache: lruCache, + }, nil +} + +// PushRequest tracks a request. Returns true if the request has been added to +// cache. +func (t *IDTracker) PushRequest(msg *JSONRPCRequest) bool { + if msg == nil || msg.ID.IsNil() || msg.Method == "" { + return false + } + t.mu.Lock() + defer t.mu.Unlock() + t.lruCache.Add(msg.ID, msg.Method) + return true +} + +// PopByID retrieves the tracked information and remove it from the tracker. +func (t *IDTracker) PopByID(id mcp.RequestId) (mcp.MCPMethod, bool) { + if id.IsNil() { + return "", false + } + + t.mu.Lock() + defer t.mu.Unlock() + + retrieved, ok := t.lruCache.Get(id) + if !ok { + return "", false + } + t.lruCache.Remove(id) + return retrieved, true +} + +// Len returns the size of the tracker cache. +func (t *IDTracker) Len() int { + return t.lruCache.Len() +} diff --git a/lib/utils/mcputils/id_tracker_test.go b/lib/utils/mcputils/id_tracker_test.go new file mode 100644 index 0000000000000..94743e31b0824 --- /dev/null +++ b/lib/utils/mcputils/id_tracker_test.go @@ -0,0 +1,109 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "fmt" + "slices" + "testing" + + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/require" +) + +func TestIDTracker(t *testing.T) { + tracker, err := NewIDTracker(5) + require.NoError(t, err) + require.Empty(t, tracker.Len()) + + t.Run("request missing ID not tracked", func(t *testing.T) { + require.False(t, tracker.PushRequest(&JSONRPCRequest{ + Method: "bad", + })) + require.Empty(t, tracker.Len()) + }) + + t.Run("request tracked", func(t *testing.T) { + require.True(t, tracker.PushRequest(&JSONRPCRequest{ + ID: mcp.NewRequestId(0), + Method: mcp.MethodToolsList, + })) + require.Equal(t, 1, tracker.Len()) + }) + + t.Run("pop unknown id", func(t *testing.T) { + unknownIDs := []mcp.RequestId{ + mcp.NewRequestId(5), + mcp.NewRequestId("0"), + mcp.NewRequestId(nil), + } + for id := range slices.Values(unknownIDs) { + t.Run(fmt.Sprintf("%T", id), func(t *testing.T) { + _, ok := tracker.PopByID(id) + require.False(t, ok) + require.Equal(t, 1, tracker.Len()) + }) + } + }) + + t.Run("pop tracked id", func(t *testing.T) { + method, ok := tracker.PopByID(mcp.NewRequestId(0)) + require.True(t, ok) + require.Equal(t, mcp.MethodToolsList, method) + require.Empty(t, tracker.Len()) + }) + + t.Run("track last 5", func(t *testing.T) { + for i := range 20 { + tracker.PushRequest(&JSONRPCRequest{ + ID: mcp.NewRequestId(i + 1), + Method: mcp.MethodToolsCall, + }) + require.LessOrEqual(t, tracker.Len(), 10) + } + for i := range 5 { + method, ok := tracker.PopByID(mcp.NewRequestId(20 - i)) + require.True(t, ok) + require.Equal(t, mcp.MethodToolsCall, method) + } + require.Empty(t, tracker.Len()) + }) +} + +func BenchmarkIDTracker(b *testing.B) { + idTracker, err := NewIDTracker(100) + require.NoError(b, err) + + for i := 0; i < 100; i++ { + idTracker.PushRequest(&JSONRPCRequest{ + ID: mcp.NewRequestId(i), + Method: mcp.MethodToolsList, + }) + } + + // cpu: Apple M3 Pro + // BenchmarkIDTracker-12 12267649 81.85 ns/op + for b.Loop() { + idTracker.PushRequest(&JSONRPCRequest{ + ID: mcp.NewRequestId(2000), + Method: mcp.MethodToolsList, + }) + idTracker.PopByID(mcp.NewRequestId(2000)) + } +} diff --git a/lib/utils/mcputils/protocol.go b/lib/utils/mcputils/protocol.go new file mode 100644 index 0000000000000..fadbcb75c1ce3 --- /dev/null +++ b/lib/utils/mcputils/protocol.go @@ -0,0 +1,155 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "encoding/json" + + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + + apievents "github.com/gravitational/teleport/api/types/events" +) + +// Type definitions from both mcp-go/client/transport or mcp-go are not suitable +// for our reverse proxy use, thus this file redefines them. +// +// TODO(greedy52) switch to official golang lib or official go SDK if they offer +// the level of handling we need. Same goes for other helpers like StdioXXX. + +// JSONRPCParams defines params for request or notification. +// TODO(greedy52) handle metadata +type JSONRPCParams map[string]any + +// GetEventParams returns the apievents.Struct for auditing. +func (p JSONRPCParams) GetEventParams() *apievents.Struct { + if p == nil { + return nil + } + + eventParams, _ := apievents.EncodeMap(p) + return eventParams +} + +// GetName returns the "name" param. +func (p JSONRPCParams) GetName() (string, bool) { + if p == nil { + return "", false + } + name, ok := p["name"].(string) + return name, ok +} + +// baseJSONRPCMessage is a base message that includes all fields for MCP +// protocol. +// +// Note that json.RawMessage is used to keep the original content when +// marshaling it again. json.RawMessage can also be easily unmarshalled to user +// defined types when needed. Same applies to other types in this file. +type baseJSONRPCMessage struct { + // JSONRPC specifies the version of JSONRPC. + JSONRPC string `json:"jsonrpc"` + // ID is the ID for request and response. ID is nil for notification. + ID mcp.RequestId `json:"id,omitempty"` + // Method is the request or notification method. Method is empty for response. + Method mcp.MCPMethod `json:"method,omitempty"` + // Params is the params for request and notification. + Params JSONRPCParams `json:"params,omitempty"` + // Result is the response result. + Result json.RawMessage `json:"result,omitempty"` + // Error is the response error. + Error json.RawMessage `json:"error,omitempty"` +} + +func (m *baseJSONRPCMessage) isNotification() bool { + return m.ID.IsNil() +} +func (m *baseJSONRPCMessage) isRequest() bool { + return !m.ID.IsNil() && m.Method != "" +} +func (m *baseJSONRPCMessage) isResponse() bool { + return !m.ID.IsNil() && (m.Result != nil || m.Error != nil) +} + +func (m *baseJSONRPCMessage) makeNotification() *JSONRPCNotification { + return &JSONRPCNotification{ + JSONRPC: m.JSONRPC, + Method: m.Method, + Params: m.Params, + } +} +func (m *baseJSONRPCMessage) makeRequest() *JSONRPCRequest { + return &JSONRPCRequest{ + JSONRPC: m.JSONRPC, + ID: m.ID, + Method: m.Method, + Params: m.Params, + } +} +func (m *baseJSONRPCMessage) makeResponse() *JSONRPCResponse { + return &JSONRPCResponse{ + JSONRPC: m.JSONRPC, + ID: m.ID, + Result: m.Result, + Error: m.Error, + } +} + +// JSONRPCNotification defines a MCP notification. +// +// https://modelcontextprotocol.io/specification/2025-03-26/basic#notifications +type JSONRPCNotification struct { + JSONRPC string `json:"jsonrpc"` + Method mcp.MCPMethod `json:"method"` + Params JSONRPCParams `json:"params,omitempty"` +} + +// JSONRPCRequest defines a MCP request. +// +// https://modelcontextprotocol.io/specification/2025-03-26/basic#requests +type JSONRPCRequest struct { + JSONRPC string `json:"jsonrpc"` + Method mcp.MCPMethod `json:"method"` + ID mcp.RequestId `json:"id,omitempty"` + Params JSONRPCParams `json:"params,omitempty"` +} + +// JSONRPCResponse defines an MCP response. +// +// By protocol spec, responses are further sub-categorized as either successful +// results or errors. Either a result or an error MUST be set. A response MUST +// NOT set both. +// +// https://modelcontextprotocol.io/specification/2025-03-26/basic#responses +type JSONRPCResponse struct { + JSONRPC string `json:"jsonrpc"` + ID mcp.RequestId `json:"id"` + Result json.RawMessage `json:"result,omitempty"` + Error json.RawMessage `json:"error,omitempty"` +} + +// GetListToolResult assumes the result is for mcp.MethodToolsList and returns +// the corresponding go object. +func (r *JSONRPCResponse) GetListToolResult() (*mcp.ListToolsResult, error) { + var listResult mcp.ListToolsResult + if err := json.Unmarshal([]byte(r.Result), &listResult); err != nil { + return nil, trace.Wrap(err) + } + return &listResult, nil +} diff --git a/lib/utils/mcputils/protocol_test.go b/lib/utils/mcputils/protocol_test.go new file mode 100644 index 0000000000000..cf7a61045ae58 --- /dev/null +++ b/lib/utils/mcputils/protocol_test.go @@ -0,0 +1,153 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "encoding/json" + "testing" + + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestJSONRPCNotification(t *testing.T) { + inputJSON := []byte(`{ + "jsonrpc": "2.0", + "method": "notifications/message", + "params": { + "level": "error", + "logger": "database", + "data": { + "error": "Connection failed", + "details": { + "host": "localhost", + "port": 5432 + } + } + } +}`) + + var base baseJSONRPCMessage + require.NoError(t, json.Unmarshal(inputJSON, &base)) + assert.True(t, base.isNotification()) + assert.False(t, base.isRequest()) + assert.False(t, base.isResponse()) + + m := base.makeNotification() + require.NotNil(t, m) + assert.Equal(t, mcp.MCPMethod("notifications/message"), m.Method) + assert.Len(t, base.Params, 3) + + outputJSON, err := json.MarshalIndent(m, "", " ") + require.NoError(t, err) + assert.JSONEq(t, string(inputJSON), string(outputJSON)) +} + +func TestJSONRPCRequest(t *testing.T) { + inputJSON := []byte(`{ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/call", + "params": { + "name": "get_weather", + "arguments": { + "location": "New York" + } + } +}`) + var base baseJSONRPCMessage + require.NoError(t, json.Unmarshal(inputJSON, &base)) + assert.False(t, base.isNotification()) + assert.True(t, base.isRequest()) + assert.False(t, base.isResponse()) + + m := base.makeRequest() + require.NotNil(t, m) + assert.Equal(t, mcp.MethodToolsCall, m.Method) + assert.Equal(t, "int64:2", m.ID.String()) + name, ok := m.Params.GetName() + assert.True(t, ok) + assert.Equal(t, "get_weather", name) + + outputJSON, err := json.MarshalIndent(m, "", " ") + require.NoError(t, err) + assert.JSONEq(t, string(inputJSON), string(outputJSON)) +} + +func TestJSONRPCResponse(t *testing.T) { + inputJSON := []byte(`{ + "jsonrpc": "2.0", + "id": 2, + "result": { + "tools": [ + { + "name": "get_weather", + "description": "Get current weather information for a location", + "inputSchema": { + "type": "object", + "properties": { + "location": { + "type": "string", + "description": "City name or zip code" + } + }, + "required": ["location"] + } + } + ], + "nextCursor": "next-page-cursor" + } +}`) + var base baseJSONRPCMessage + require.NoError(t, json.Unmarshal(inputJSON, &base)) + assert.False(t, base.isNotification()) + assert.False(t, base.isRequest()) + assert.True(t, base.isResponse()) + + m := base.makeResponse() + require.NotNil(t, m) + assert.Equal(t, "int64:2", m.ID.String()) + + outputJSON, err := json.MarshalIndent(m, "", " ") + require.NoError(t, err) + assert.JSONEq(t, string(inputJSON), string(outputJSON)) + + toolList, err := m.GetListToolResult() + require.NoError(t, err) + require.Equal(t, &mcp.ListToolsResult{ + PaginatedResult: mcp.PaginatedResult{ + NextCursor: "next-page-cursor", + }, + Tools: []mcp.Tool{{ + Name: "get_weather", + Description: "Get current weather information for a location", + InputSchema: mcp.ToolInputSchema{ + Type: "object", + Properties: map[string]interface{}{ + "location": map[string]interface{}{ + "type": "string", + "description": "City name or zip code", + }, + }, + Required: []string{"location"}, + }, + }}, + }, toolList) +} diff --git a/lib/utils/mcputils/reader.go b/lib/utils/mcputils/reader.go new file mode 100644 index 0000000000000..f51596739d85a --- /dev/null +++ b/lib/utils/mcputils/reader.go @@ -0,0 +1,219 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "context" + "encoding/json" + "log/slog" + + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + + "github.com/gravitational/teleport" + logutils "github.com/gravitational/teleport/lib/utils/log" +) + +// HandleParseErrorFunc handles parse errors. +type HandleParseErrorFunc func(context.Context, *mcp.JSONRPCError) error + +// HandleRequestFunc handles a request. +type HandleRequestFunc func(context.Context, *JSONRPCRequest) error + +// HandleResponseFunc handles a response. +type HandleResponseFunc func(context.Context, *JSONRPCResponse) error + +// HandleNotificationFunc handles a notification. +type HandleNotificationFunc func(context.Context, *JSONRPCNotification) error + +// ReplyParseError returns a HandleParseErrorFunc that forwards the error to +// provided writer. +func ReplyParseError(w MessageWriter) HandleParseErrorFunc { + return func(ctx context.Context, parseError *mcp.JSONRPCError) error { + return trace.Wrap(w.WriteMessage(ctx, parseError)) + } +} + +// LogAndIgnoreParseError returns a HandleParseErrorFunc that logs the parse +// error. +func LogAndIgnoreParseError(log *slog.Logger) HandleParseErrorFunc { + return func(ctx context.Context, parseError *mcp.JSONRPCError) error { + log.DebugContext(ctx, "Ignore parse error", "error", parseError) + return nil + } +} + +// TransportReader defines an interface for reading next raw/unmarshalled +// message from the MCP transport. +type TransportReader interface { + // Type is the transport type for logging purpose. + Type() string + // ReadMessage reads the next raw message. + ReadMessage(context.Context) (string, error) + // Close closes the transport. + Close() error +} + +// MessageReaderConfig is the config for MessageReader. +type MessageReaderConfig struct { + // Transport is the input to the read the raw/unmarshalled messages from. + // Transport will be closed when reader finishes. + Transport TransportReader + // Logger is the slog.Logger. + Logger *slog.Logger + // ParentContext is the parent's context. Used for logging during tear down. + ParentContext context.Context + + // OnClose is an optional callback when reader finishes. + OnClose func() + // OnParseError specifies the handler for handling parse error. Any error + // returned by the handler stops this message reader. + OnParseError HandleParseErrorFunc + // OnRequest specifies the handler for handling request. Any error by the + // handler stops this message reader. + OnRequest HandleRequestFunc + // OnResponse specifies the handler for handling response. Any error by the + // handler stops this message reader. + OnResponse HandleResponseFunc + // OnNotification specifies the handler for handling notification. Any error + // returned by the handler stops this message reader. + OnNotification HandleNotificationFunc +} + +// CheckAndSetDefaults checks values and sets defaults. +func (c *MessageReaderConfig) CheckAndSetDefaults() error { + if c.Transport == nil { + return trace.BadParameter("missing parameter Transport") + } + if c.OnParseError == nil { + return trace.BadParameter("missing parameter OnParseError") + } + if c.OnNotification == nil { + return trace.BadParameter("missing parameter OnNotification") + } + if c.OnRequest == nil && c.OnResponse == nil { + return trace.BadParameter("one of OnRequest or OnResponse must be set") + } + if c.ParentContext == nil { + return trace.BadParameter("missing parameter ParentContext") + } + if c.Logger == nil { + c.Logger = slog.With(teleport.ComponentKey, "mcp") + } + return nil +} + +// MessageReader reads requests from provided reader. +type MessageReader struct { + cfg MessageReaderConfig +} + +// NewMessageReader creates a new MessageReader. Must call "Start" to +// start the processing. +func NewMessageReader(cfg MessageReaderConfig) (*MessageReader, error) { + if err := cfg.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return &MessageReader{ + cfg: cfg, + }, nil +} + +// Run starts reading requests from provided reader. Run blocks until an +// error happens from the provided reader or any of the handler. +func (r *MessageReader) Run(ctx context.Context) { + r.cfg.Logger.InfoContext(ctx, "Start processing messages", "transport", r.cfg.Transport.Type()) + + finished := make(chan struct{}) + go func() { + r.startProcess(ctx) + close(finished) + }() + + select { + case <-finished: + case <-ctx.Done(): + } + + r.cfg.Logger.InfoContext(r.cfg.ParentContext, "Finished processing messages", "transport", r.cfg.Transport.Type()) + if err := r.cfg.Transport.Close(); err != nil && !IsOKCloseError(err) { + r.cfg.Logger.ErrorContext(r.cfg.ParentContext, "Failed to close reader", "error", err) + } + if r.cfg.OnClose != nil { + r.cfg.OnClose() + } +} + +func (r *MessageReader) startProcess(ctx context.Context) { + for { + if ctx.Err() != nil { + return + } + + if err := r.processNextLine(ctx); err != nil { + if !IsOKCloseError(err) { + r.cfg.Logger.ErrorContext(ctx, "Failed to process line", "error", err) + } + return + } + } +} + +func (r *MessageReader) processNextLine(ctx context.Context) error { + rawMessage, err := r.cfg.Transport.ReadMessage(ctx) + if err != nil { + // TODO(greedy52) handle ParseError from Transport.ReadMessage. + return trace.Wrap(err, "reading line") + } + + r.cfg.Logger.Log(ctx, logutils.TraceLevel, "Trace read", "raw", rawMessage) + + var base baseJSONRPCMessage + if parseError := json.Unmarshal([]byte(rawMessage), &base); parseError != nil { + rpcError := mcp.NewJSONRPCError(mcp.NewRequestId(nil), mcp.PARSE_ERROR, parseError.Error(), nil) + if err := r.cfg.OnParseError(ctx, &rpcError); err != nil { + return trace.Wrap(err, "handling JSON unmarshal error") + } + } + + switch { + case base.isNotification(): + return trace.Wrap(r.cfg.OnNotification(ctx, base.makeNotification()), "handling notification") + case base.isRequest(): + if r.cfg.OnRequest != nil { + return trace.Wrap(r.cfg.OnRequest(ctx, base.makeRequest()), "handling request") + } + // Should not happen. Log something just in case. + r.cfg.Logger.DebugContext(ctx, "Skipping request", "id", base.ID) + return nil + case base.isResponse(): + if r.cfg.OnResponse != nil { + return trace.Wrap(r.cfg.OnResponse(ctx, base.makeResponse()), "handling response") + } + // Should not happen. Log something just in case. + r.cfg.Logger.DebugContext(ctx, "Skipping response", "id", base.ID) + return nil + default: + rpcError := mcp.NewJSONRPCError(base.ID, mcp.PARSE_ERROR, "unknown message type", rawMessage) + return trace.Wrap( + r.cfg.OnParseError(ctx, &rpcError), + "handling unknown message type error", + ) + } +} diff --git a/lib/utils/mcputils/stdio.go b/lib/utils/mcputils/stdio.go new file mode 100644 index 0000000000000..6a27f598a2b31 --- /dev/null +++ b/lib/utils/mcputils/stdio.go @@ -0,0 +1,114 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "bufio" + "cmp" + "context" + "encoding/json" + "fmt" + "io" + "log/slog" + + "github.com/gravitational/trace" + "github.com/mark3labs/mcp-go/mcp" + + logutils "github.com/gravitational/teleport/lib/utils/log" +) + +// StderrTraceLogWriter implements io.Writer and logs the content at TRACE +// level. Used for tracing stderr. +type StderrTraceLogWriter struct { + ctx context.Context + log *slog.Logger +} + +// NewStderrTraceLogWriter returns a new StderrTraceLogWriter. +func NewStderrTraceLogWriter(ctx context.Context, log *slog.Logger) *StderrTraceLogWriter { + return &StderrTraceLogWriter{ + ctx: ctx, + log: cmp.Or(log, slog.Default()), + } +} + +// Write implements io.Writer and logs the given input p at trace level. +// Note that the input p may contain arbitrary-length data, which can span +// multiple lines or include partial lines. +func (l *StderrTraceLogWriter) Write(p []byte) (int, error) { + l.log.Log(l.ctx, logutils.TraceLevel, "Trace stderr", "data", p) + return len(p), nil +} + +// StdioMessageWriter writes a JSONRPC message in stdio transport. +type StdioMessageWriter struct { + w io.Writer +} + +// NewStdioMessageWriter returns a MessageWriter using stdio transport. +func NewStdioMessageWriter(w io.Writer) *StdioMessageWriter { + return &StdioMessageWriter{ + w: w, + } +} + +// WriteMessage writes a JSONRPC message in stdio transport. +func (w *StdioMessageWriter) WriteMessage(_ context.Context, resp mcp.JSONRPCMessage) error { + bytes, err := json.Marshal(resp) + if err != nil { + return trace.Wrap(err) + } + _, err = fmt.Fprintf(w.w, "%s\n", string(bytes)) + return trace.Wrap(err) +} + +// NewSyncStdioMessageWriter returns a MessageWriter using stdio transport, the +// "sync" version. +func NewSyncStdioMessageWriter(w io.Writer) MessageWriter { + return NewSyncMessageWriter(NewStdioMessageWriter(w)) +} + +// StdioReader implements TransportReader for stdio transport +type StdioReader struct { + io.Closer + br *bufio.Reader +} + +// NewStdioReader creates a new StdioReader. Input reader can be either stdin or +// stdout. +func NewStdioReader(readCloser io.ReadCloser) *StdioReader { + return &StdioReader{ + Closer: readCloser, + br: bufio.NewReader(readCloser), + } +} + +// ReadMessage reads the next line. +func (r *StdioReader) ReadMessage(context.Context) (string, error) { + line, err := r.br.ReadString('\n') + if err != nil { + return "", trace.Wrap(err) + } + return line, nil +} + +// Type returns "stdio". +func (r *StdioReader) Type() string { + return "stdio" +} diff --git a/lib/utils/mcputils/stdio_test.go b/lib/utils/mcputils/stdio_test.go new file mode 100644 index 0000000000000..a7546c296bde7 --- /dev/null +++ b/lib/utils/mcputils/stdio_test.go @@ -0,0 +1,160 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "context" + "io" + "log" + "log/slog" + "sync/atomic" + "testing" + "time" + + "github.com/gravitational/trace" + mcpserver "github.com/mark3labs/mcp-go/server" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/utils/mcptest" +) + +// TestStdioHelpers tests MessageReader and StdioMessageWriter by +// implementing a passthrough reverse proxy. +// +// The flow looks something like this: +// request: MCP client --> client message reader --> server message writer --> MCP server +// response: MCP client <-- client message writer <-- server message reader <-- MCP server +func TestStdioHelpers(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + // Set up some counters for verification. + var readClientNotifications int32 + var readClientRequests int32 + var readServerNotifications int32 + var readServerResponses int32 + + // Pipes for hooking things up. + clientStdin, writeToClient := io.Pipe() + readFromClient, clientStdout := io.Pipe() + serverStdin, writeToServer := io.Pipe() + readFromServer, serverStdout := io.Pipe() + t.Cleanup(func() { + assert.NoError(t, trace.NewAggregate( + clientStdin.Close(), writeToClient.Close(), + readFromClient.Close(), clientStdout.Close(), + serverStdin.Close(), writeToServer.Close(), + readFromServer.Close(), serverStdout.Close(), + )) + }) + + // Make "low-level" message readers and writers for MITM proxy. + clientMessageWriter := NewStdioMessageWriter(writeToClient) + serverMessageWriter := NewStdioMessageWriter(writeToServer) + + clientMessageReader, err := NewMessageReader(MessageReaderConfig{ + ParentContext: context.Background(), + Transport: NewStdioReader(readFromClient), + OnNotification: func(ctx context.Context, notification *JSONRPCNotification) error { + atomic.AddInt32(&readClientNotifications, 1) + return trace.Wrap(serverMessageWriter.WriteMessage(ctx, notification)) + }, + OnRequest: func(ctx context.Context, request *JSONRPCRequest) error { + atomic.AddInt32(&readClientRequests, 1) + return trace.Wrap(serverMessageWriter.WriteMessage(ctx, request)) + }, + OnParseError: ReplyParseError(clientMessageWriter), + }) + require.NoError(t, err) + clientMessageReaderClosed := make(chan struct{}) + go func() { + clientMessageReader.Run(ctx) + close(clientMessageReaderClosed) + }() + + serverMessageReader, err := NewMessageReader(MessageReaderConfig{ + ParentContext: context.Background(), + Transport: NewStdioReader(readFromServer), + OnNotification: func(ctx context.Context, notification *JSONRPCNotification) error { + atomic.AddInt32(&readServerNotifications, 1) + return trace.Wrap(clientMessageWriter.WriteMessage(ctx, notification)) + }, + OnResponse: func(ctx context.Context, response *JSONRPCResponse) error { + atomic.AddInt32(&readServerResponses, 1) + return trace.Wrap(clientMessageWriter.WriteMessage(ctx, response)) + }, + OnParseError: LogAndIgnoreParseError(slog.Default()), + }) + require.NoError(t, err) + serverMessageReaderClosed := make(chan struct{}) + serverMessageReaderCtx, serverMessageReaderCtxCancel := context.WithCancel(ctx) + go func() { + serverMessageReader.Run(serverMessageReaderCtx) + close(serverMessageReaderClosed) + }() + + // Make "high-level" MCP client and server with stdio transport as the two + // ends. + stdioClient := mcptest.NewStdioClient(t, clientStdin, clientStdout) + + stdioServer := mcpserver.NewStdioServer(mcptest.NewServer()) + stdioServer.SetErrorLogger(log.New(io.Discard, "", log.LstdFlags)) + go stdioServer.Listen(ctx, serverStdin, serverStdout) + + // Test things out. + t.Run("client initialize", func(t *testing.T) { + _, err := mcptest.InitializeClient(ctx, stdioClient) + require.NoError(t, err) + }) + + t.Run("client call tool", func(t *testing.T) { + mcptest.MustCallServerTool(t, ctx, stdioClient) + }) + + t.Run("reader closed by closing stdin", func(t *testing.T) { + readFromClient.Close() + select { + case <-clientMessageReaderClosed: + case <-time.After(time.Second * 2): + require.Fail(t, "timeout waiting for reader closed by closing stdin") + } + }) + + t.Run("reader closed by canceling context", func(t *testing.T) { + serverMessageReaderCtxCancel() + select { + case <-serverMessageReaderClosed: + case <-time.After(time.Second * 2): + require.Fail(t, "timeout waiting for reader closed by canceling context") + } + }) + + t.Run("verify counters", func(t *testing.T) { + // client -> server: initialize request + // server -> client: initialize response + // client -> server: notifications/initialized + // client -> server: tools\call request + // server -> client: tools\call response + assert.Equal(t, int32(1), atomic.LoadInt32(&readClientNotifications)) + assert.Equal(t, int32(2), atomic.LoadInt32(&readClientRequests)) + assert.Equal(t, int32(0), atomic.LoadInt32(&readServerNotifications)) + assert.Equal(t, int32(2), atomic.LoadInt32(&readServerResponses)) + }) +} diff --git a/lib/utils/mcputils/writer.go b/lib/utils/mcputils/writer.go new file mode 100644 index 0000000000000..b62a1d35ff56d --- /dev/null +++ b/lib/utils/mcputils/writer.go @@ -0,0 +1,52 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package mcputils + +import ( + "context" + "sync" + + "github.com/mark3labs/mcp-go/mcp" +) + +// MessageWriter defines an interface for writing JSON RPC messages. +type MessageWriter interface { + // WriteMessage writes an JSON RPC message. + WriteMessage(context.Context, mcp.JSONRPCMessage) error +} + +// SyncMessageWriter process goroutine safety for MessageWriter +type SyncMessageWriter struct { + w MessageWriter + mu sync.Mutex +} + +// NewSyncMessageWriter returns a SyncMessageWriter. +func NewSyncMessageWriter(w MessageWriter) *SyncMessageWriter { + return &SyncMessageWriter{ + w: w, + } +} + +// WriteMessage acquires a lock then writes the message. +func (s *SyncMessageWriter) WriteMessage(ctx context.Context, msg mcp.JSONRPCMessage) error { + s.mu.Lock() + defer s.mu.Unlock() + return s.w.WriteMessage(ctx, msg) +} diff --git a/lib/web/ui/app.go b/lib/web/ui/app.go index 7f18cf6dce3a5..7b30c652a9eca 100644 --- a/lib/web/ui/app.go +++ b/lib/web/ui/app.go @@ -78,6 +78,9 @@ type App struct { // SAMLAppLaunchURLs contains service provider specific authentication // endpoints where user should be launched to start SAML authentication. SAMLAppLaunchURLs []SAMLAppLaunchURL `json:"samlAppLaunchUrls,omitempty"` + + // MCP includes MCP specific configuration. + MCP *MCP `json:"mcp,omitempty"` } // UserGroupAndDescription is a user group name and its description. @@ -101,6 +104,17 @@ type IdentityCenterPermissionSet struct { RequiresRequest bool `json:"requiresRequest,omitempty"` } +// MCP includes MCP specific configuration. +type MCP struct { + // Command to launch stdio-based MCP servers. + Command string `json:"command,omitempty"` + // Args to execute with the command. + Args []string `json:"args,omitempty"` + // RunAsHostUser is the host user account under which the command will be + // executed. Required for stdio-based MCP servers. + RunAsHostUser string `json:"runAsHostUser,omitempty"` +} + // MakeAppsConfig contains parameters for converting apps to UI representation. type MakeAppsConfig struct { // LocalClusterName is the name of the local cluster. @@ -181,6 +195,14 @@ func MakeApp(app types.Application, c MakeAppsConfig) App { app.GetAWSAccountID()) } + if mcpSpec := app.GetMCP(); mcpSpec != nil { + resultApp.MCP = &MCP{ + Command: mcpSpec.Command, + Args: mcpSpec.Args, + RunAsHostUser: mcpSpec.RunAsHostUser, + } + } + return resultApp } diff --git a/tool/common/common.go b/tool/common/common.go index d0f9ef2ae9664..da3ec73dd83f2 100644 --- a/tool/common/common.go +++ b/tool/common/common.go @@ -27,6 +27,7 @@ import ( "sort" "strings" + "github.com/ghodss/yaml" "github.com/gravitational/trace" "github.com/gravitational/teleport" @@ -238,3 +239,35 @@ func FormatDefault[T comparable](val, defaultVal T) string { } return fmt.Sprintf("%v", val) } + +// FormatAllowedEntities returns a human-readable string describing the allowed +// entities, optionally including a list of denied entities as exceptions. +func FormatAllowedEntities(allowed []string, denied []string) string { + if len(allowed) == 0 { + return "(none)" + } + if len(denied) == 0 { + return fmt.Sprintf("%v", allowed) + } + return fmt.Sprintf("%v, except: %v", allowed, denied) +} + +// PrintJSONIndent prints provided value in JSON with default indentation. +func PrintJSONIndent(w io.Writer, v any) error { + out, err := utils.FastMarshalIndent(v, "", " ") + if err != nil { + return trace.Wrap(err) + } + _, err = fmt.Fprintln(w, string(out)) + return trace.Wrap(err) +} + +// PrintYAML prints provided value in YAML. +func PrintYAML(w io.Writer, v any) error { + out, err := yaml.Marshal(v) + if err != nil { + return trace.Wrap(err) + } + _, err = fmt.Fprintln(w, string(out)) + return trace.Wrap(err) +} diff --git a/tool/tctl/common/user_command.go b/tool/tctl/common/user_command.go index 9325335b9b4aa..877995988bd68 100644 --- a/tool/tctl/common/user_command.go +++ b/tool/tctl/common/user_command.go @@ -64,6 +64,7 @@ type UserCommand struct { allowedAzureIdentities []string allowedGCPServiceAccounts []string allowedRoles []string + allowedMCPTools []string hostUserUID string hostUserUIDProvided bool hostUserGID string @@ -103,6 +104,7 @@ func (u *UserCommand) Initialize(app *kingpin.Application, _ *tctlcfg.GlobalCLIF u.userAdd.Flag("gcp-service-accounts", "List of allowed GCP service accounts for the new user").StringsVar(&u.allowedGCPServiceAccounts) u.userAdd.Flag("host-user-uid", "UID for auto provisioned host users to use").IsSetByUser(&u.hostUserUIDProvided).StringVar(&u.hostUserUID) u.userAdd.Flag("host-user-gid", "GID for auto provisioned host users to use").IsSetByUser(&u.hostUserGIDProvided).StringVar(&u.hostUserGID) + u.userAdd.Flag("mcp-tools", "List of allowed MCP tools for the new user").StringsVar(&u.allowedMCPTools) u.userAdd.Flag("roles", "List of roles for the new user to assume").Required().StringsVar(&u.allowedRoles) @@ -138,6 +140,7 @@ func (u *UserCommand) Initialize(app *kingpin.Application, _ *tctlcfg.GlobalCLIF StringsVar(&u.allowedGCPServiceAccounts) u.userUpdate.Flag("set-host-user-uid", "UID for auto provisioned host users to use. Value can be reset by providing an empty string").IsSetByUser(&u.hostUserUIDProvided).StringVar(&u.hostUserUID) u.userUpdate.Flag("set-host-user-gid", "GID for auto provisioned host users to use. Value can be reset by providing an empty string").IsSetByUser(&u.hostUserGIDProvided).StringVar(&u.hostUserGID) + u.userUpdate.Flag("set-mcp-tools", "List of allowed MCP tools for the user, replaces current allowed MCP tools.").StringsVar(&u.allowedMCPTools) u.userList = users.Command("ls", "Lists all user accounts.") u.userList.Flag("format", "Output format, 'text' or 'json'").Hidden().Default(teleport.Text).StringVar(&u.format) @@ -297,6 +300,7 @@ func (u *UserCommand) Add(ctx context.Context, client *authclient.Client) error constants.TraitGCPServiceAccounts: gcpServiceAccounts, constants.TraitHostUserUID: {u.hostUserUID}, constants.TraitHostUserGID: {u.hostUserGID}, + constants.TraitMCPTools: flattenSlice(u.allowedMCPTools), } user, err := types.NewUser(u.login) @@ -476,6 +480,12 @@ func (u *UserCommand) Update(ctx context.Context, client *authclient.Client) err updateMessages["Host user GID"] = []string{u.hostUserGID} } + if len(u.allowedMCPTools) > 0 { + mcpTools := flattenSlice(u.allowedMCPTools) + user.SetMCPTools(mcpTools) + updateMessages["MCP tools"] = mcpTools + } + if len(updateMessages) == 0 { return trace.BadParameter("Nothing to update. Please provide at least one --set flag.") } diff --git a/tool/tctl/common/user_command_test.go b/tool/tctl/common/user_command_test.go index c486a6cc6a24d..1285c872a4500 100644 --- a/tool/tctl/common/user_command_test.go +++ b/tool/tctl/common/user_command_test.go @@ -189,6 +189,13 @@ func TestUserAdd(t *testing.T) { require.ErrorContains(t, err, "GCP service account \"foobar\" is invalid") }, }, + { + name: "mcp tools", + args: []string{"--mcp-tools", "aa,bb", "--mcp-tools", "get_*"}, + wantTraits: map[string][]string{ + constants.TraitMCPTools: {"aa", "bb", "get_*"}, + }, + }, } for ix, tc := range tests { @@ -352,6 +359,13 @@ func TestUserUpdate(t *testing.T) { require.ErrorContains(t, err, "GCP service account \"foobar\" is invalid") }, }, + { + name: "mcp tools", + args: []string{"--set-mcp-tools", "aa,bb", "--set-mcp-tools", "get_*"}, + wantTraits: map[string][]string{ + constants.TraitMCPTools: {"aa", "bb", "get_*"}, + }, + }, } for _, tc := range tests { diff --git a/tool/teleport/common/teleport.go b/tool/teleport/common/teleport.go index 39fa2dae03168..aab958e2e1da9 100644 --- a/tool/teleport/common/teleport.go +++ b/tool/teleport/common/teleport.go @@ -230,6 +230,7 @@ func Run(options Options) (app *kingpin.Application, executedCommand string, con appStartCmd.Flag("insecure", "Insecure mode disables certificate validation").BoolVar(&ccf.InsecureMode) appStartCmd.Flag("skip-version-check", "Skip version checking between server and client.").Default("false").BoolVar(&ccf.SkipVersionCheck) appStartCmd.Flag("no-debug-service", "Disables debug service.").BoolVar(&ccf.DisableDebugService) + appStartCmd.Flag("mcp-demo-server", "Enables the Teleport demo MCP server that shows current user and session information.").BoolVar(&ccf.MCPDemoServer) appStartCmd.Alias(appUsageExamples) // We're using "alias" section to display usage examples. // "teleport db" command and its subcommands @@ -434,6 +435,7 @@ func Run(options Options) (app *kingpin.Application, executedCommand string, con dump.Flag("proxy", "Address of the proxy.").StringVar(&dumpFlags.ProxyAddress) dump.Flag("app-name", "Name of the application to start when using app role.").StringVar(&dumpFlags.AppName) dump.Flag("app-uri", "Internal address of the application to proxy.").StringVar(&dumpFlags.AppURI) + dump.Flag("mcp-demo-server", "Enables the Teleport demo MCP server that shows current user and session information.").BoolVar(&dumpFlags.MCPDemoServer) dump.Flag("node-name", "Name for the Teleport node.").StringVar(&dumpFlags.NodeName) dump.Flag("node-labels", "Comma-separated list of labels to add to newly created nodes, for example env=staging,cloud=aws.").StringVar(&dumpFlags.NodeLabels) diff --git a/tool/teleport/common/usage.go b/tool/teleport/common/usage.go index bc9ce79d18f0f..9ee7c634ac8e3 100644 --- a/tool/teleport/common/usage.go +++ b/tool/teleport/common/usage.go @@ -47,7 +47,13 @@ const ( --uri="http://localhost:8080" \ --labels=group=dev Same as the above, but the app server runs with "group=dev" label which only - allows access to users with the application label "group: dev" in an assigned role.` + allows access to users with the application label "group: dev" in an assigned role. + +> teleport app start --token=xyz --auth-server=proxy.example.com:3080 \ + --mcp-demo-server + Runs a Teleport demo MCP server that shows current user and session + information. +` dbUsageExamples = ` > teleport db start --token=xyz --auth-server=proxy.example.com:3080 \ diff --git a/tool/tsh/common/app.go b/tool/tsh/common/app.go index 3251605485b4b..469866cdf7b21 100644 --- a/tool/tsh/common/app.go +++ b/tool/tsh/common/app.go @@ -79,6 +79,10 @@ func onAppLogin(cf *CLIConf) error { } defer clusterClient.Close() + if app.IsMCP() { + return trace.BadParameter("MCP applications are not supported. Please see 'tsh mcp login --help' for more details.") + } + if err := validateTargetPort(app, int(cf.TargetPort)); err != nil { return trace.Wrap(err) } diff --git a/tool/tsh/common/db.go b/tool/tsh/common/db.go index 6dbf2fbf5bf91..8cc96273ab3ba 100644 --- a/tool/tsh/common/db.go +++ b/tool/tsh/common/db.go @@ -1005,12 +1005,16 @@ func (d *databaseInfo) getChecker(ctx context.Context, tc *client.TeleportClient } defer clusterClient.Close() + return makeAccessChecker(ctx, tc, clusterClient.AuthClient) +} + +func makeAccessChecker(ctx context.Context, tc *client.TeleportClient, auth services.CurrentUserRoleGetter) (services.AccessChecker, error) { profile, err := tc.ProfileStatus() if err != nil { return nil, trace.Wrap(err) } - checker, err := services.NewAccessCheckerForRemoteCluster(ctx, profile.AccessInfo(), tc.SiteName, clusterClient.AuthClient) + checker, err := services.NewAccessCheckerForRemoteCluster(ctx, profile.AccessInfo(), tc.SiteName, auth) return checker, trace.Wrap(err) } diff --git a/tool/tsh/common/db_exec_test.go b/tool/tsh/common/db_exec_test.go index dc99644fd1b04..27b9850364fad 100644 --- a/tool/tsh/common/db_exec_test.go +++ b/tool/tsh/common/db_exec_test.go @@ -326,6 +326,14 @@ func (c *fakeDatabaseExecClient) issueCert(context.Context, *databaseInfo) (tls. return c.cert, nil } func (c *fakeDatabaseExecClient) listDatabasesWithFilter(ctx context.Context, req *proto.ListResourcesRequest) ([]types.Database, error) { + filtered, err := matchResources(req, c.allDatabaseServers) + if err != nil { + return nil, trace.Wrap(err) + } + return types.DatabaseServers(filtered).ToDatabases(), nil +} + +func matchResources[R types.ResourceWithLabels](req *proto.ListResourcesRequest, s []R) ([]R, error) { filter := services.MatchResourceFilter{ ResourceKind: req.ResourceType, Labels: req.Labels, @@ -339,13 +347,13 @@ func (c *fakeDatabaseExecClient) listDatabasesWithFilter(ctx context.Context, re filter.PredicateExpression = expression } - var filtered []types.Database - for _, dbServer := range c.allDatabaseServers { - match, err := services.MatchResourceByFilters(dbServer, filter, nil) + var filtered []R + for _, r := range s { + match, err := services.MatchResourceByFilters(r, filter, nil) if err != nil { return nil, trace.Wrap(err) } else if match { - filtered = append(filtered, dbServer.GetDatabase()) + filtered = append(filtered, r) } } return filtered, nil diff --git a/tool/tsh/common/help.go b/tool/tsh/common/help.go index 71ac21769b1db..c7551e3570c81 100644 --- a/tool/tsh/common/help.go +++ b/tool/tsh/common/help.go @@ -76,4 +76,33 @@ Examples: Run commands in parallel, and save outputs to files: $ tsh db exec "select 1" --db-user mysql --labels env=dev --parallel=5 --output-dir=exec-outputs` + + mcpConfigHelp = ` +Examples: + Print sample configuration for a MCP server app + $ tsh mcp config my-mcp-server-app + + Add all MCP servers to Claude Desktop + $ tsh mcp config --all --client-config=claude + + Add all MCP servers to Cursor + $ tsh mcp config --all --client-config=cursor + + Search MCP servers with labels and add to the specified JSON file + $ tsh mcp config --labels env=dev --client-config=my-config.json` + + mcpDBConfigHelp = ` +Examples: + Print sample configuration for exposing database as MCP server + $ tsh mcp db config --db-user=mydbuser --db-name=mydbname my-db-resource + + Add the database configuration to Claude Desktop + $ tsh mcp db config --db-user=mydbuser --db-name=mydbname --client-config=claude my-db-resource + + Add the database configuration to Cursor + $ tsh mcp db config --db-user=mydbuser --db-name=mydbname --client-config=cursor my-db-resource + + Add the database configuration to the specified JSON file + $ tsh mcp db config --db-user=mydbuser --db-name=mydbname --client-config=my-config.json my-db-resource +` ) diff --git a/tool/tsh/common/logger.go b/tool/tsh/common/logger.go index df3e97595d259..06a60d8f6cd79 100644 --- a/tool/tsh/common/logger.go +++ b/tool/tsh/common/logger.go @@ -38,7 +38,7 @@ const ( // It is called twice, first soon after launching tsh before argv is parsed and then again after // kingpin parses argv. This makes it possible to debug early startup functionality, particularly // command aliases. -func initLogger(cf *CLIConf, opts loggingOpts) error { +func initLogger(cf *CLIConf, purpose utils.LoggingPurpose, opts loggingOpts) (*slog.Logger, error) { cf.OSLog = opts.osLog cf.Debug = opts.debug || opts.osLog @@ -49,7 +49,8 @@ func initLogger(cf *CLIConf, opts loggingOpts) error { level = slog.LevelDebug } - return trace.Wrap(utils.InitLogger(utils.LoggingForCLI, level, initLoggerOpts...)) + logger, err := utils.InitLogger(purpose, level, initLoggerOpts...) + return logger, trace.Wrap(err) } type loggingOpts struct { @@ -59,19 +60,36 @@ type loggingOpts struct { // parseLoggingOptsFromEnv calculates logging opts taking into account only env vars. func parseLoggingOptsFromEnv() loggingOpts { - var opts loggingOpts - opts.debug, _ = strconv.ParseBool(os.Getenv(debugEnvVar)) - opts.osLog, _ = strconv.ParseBool(os.Getenv(osLogEnvVar)) + return parseLoggingOptsFromEnvWithDefault(loggingOpts{}) +} + +// parseLoggingOptsFromEnvWithDefault calculates logging opts from env vars and +// only updates opts if the env vars are set with valid values. +func parseLoggingOptsFromEnvWithDefault(opts loggingOpts) loggingOpts { + if debugValue, ok := os.LookupEnv(debugEnvVar); ok { + if debug, err := strconv.ParseBool(debugValue); err == nil { + opts.debug = debug + } + } + if osLogValue, ok := os.LookupEnv(osLogEnvVar); ok { + if osLog, err := strconv.ParseBool(osLogValue); err == nil { + opts.osLog = osLog + } + } return opts } -// parseLoggingOptsFromEnvAndArgv calculates logging opts taking into account env vars and argv. +func parseLoggingOptsFromEnvAndArgv(cf *CLIConf) loggingOpts { + return getLoggingOptsWithDefault(cf, loggingOpts{}) +} + +// getLoggingOptsWithDefault calculates logging opts taking into account env vars and argv. // Before calling this function, make sure that argv has been processed by kingpin (by calling // kingpin.Application.Parse) so that cf fields set from argv are up-to-date. // // CLI flags take precedence over env vars. -func parseLoggingOptsFromEnvAndArgv(cf *CLIConf) loggingOpts { - opts := parseLoggingOptsFromEnv() +func getLoggingOptsWithDefault(cf *CLIConf, defaults loggingOpts) loggingOpts { + opts := parseLoggingOptsFromEnvWithDefault(defaults) if cf.DebugSetByUser { opts.debug = cf.Debug diff --git a/tool/tsh/common/mcp.go b/tool/tsh/common/mcp.go new file mode 100644 index 0000000000000..54b7cb99aa619 --- /dev/null +++ b/tool/tsh/common/mcp.go @@ -0,0 +1,161 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package common + +import ( + "fmt" + "io" + "os" + "strings" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client/mcp/claude" +) + +type mcpCommands struct { + dbStart *mcpDBStartCommand + dbConfig *mcpDBConfigCommand + + config *mcpConfigCommand + list *mcpListCommand + connect *mcpConnectCommand +} + +func newMCPCommands(app *kingpin.Application, cf *CLIConf) *mcpCommands { + mcp := app.Command("mcp", "View and control proxied MCP servers.") + db := mcp.Command("db", "Database access for MCP servers.") + return &mcpCommands{ + dbStart: newMCPDBCommand(db, cf), + dbConfig: newMCPDBconfigCommand(db, cf), + + list: newMCPListCommand(mcp, cf), + config: newMCPConfigCommand(mcp, cf), + connect: newMCPConnectCommand(mcp, cf), + } +} + +type mcpClientConfigFlags struct { + clientConfig string + jsonFormat string +} + +const ( + mcpClientConfigClaude = "claude" + mcpClientConfigCursor = "cursor" +) + +func (m *mcpClientConfigFlags) addToCmd(cmd *kingpin.CmdClause) { + cmd.Flag( + "client-config", + fmt.Sprintf( + "If specified, update the specified client config. %q for default Claude Desktop config, %q for global Cursor MCP servers config, or specify a JSON file path. Can also be set with environment variable %s.", + mcpClientConfigClaude, + mcpClientConfigCursor, + mcpClientConfigEnvVar, + )). + Envar(mcpClientConfigEnvVar). + StringVar(&m.clientConfig) + + cmd.Flag( + "json-format", + fmt.Sprintf( + "Format the JSON file (%s). auto saves in compact if the file is already compact, otherwise pretty. Can also be set with environment variable %s. Default is %s.", + strings.Join(m.jsonFormatOptions(), ", "), + mcpConfigJSONFormatEnvVar, + claude.FormatJSONAuto, + )). + Envar(mcpConfigJSONFormatEnvVar). + Default(string(claude.FormatJSONAuto)). + EnumVar(&m.jsonFormat, m.jsonFormatOptions()...) +} + +func (m *mcpClientConfigFlags) isSet() bool { + return m.clientConfig != "" +} + +func (m *mcpClientConfigFlags) loadConfig() (*claude.FileConfig, error) { + switch m.clientConfig { + case mcpClientConfigClaude: + return claude.LoadConfigFromDefaultPath() + case mcpClientConfigCursor: + return claude.LoadConfigFromGlobalCursor() + default: + return claude.LoadConfigFromFile(m.clientConfig) + } +} + +func (m *mcpClientConfigFlags) jsonFormatOptions() []string { + return []string{ + string(claude.FormatJSONPretty), + string(claude.FormatJSONCompact), + string(claude.FormatJSONAuto), + string(claude.FormatJSONNone), + } +} + +func (m *mcpClientConfigFlags) printHint(w io.Writer) error { + _, err := fmt.Fprintln(w, mcpConfigHint) + return trace.Wrap(err) +} + +// claudeConfig defines a subset of functions from claude.Config. +type claudeConfig interface { + PutMCPServer(string, claude.MCPServer) error + GetMCPServers() map[string]claude.MCPServer +} + +func makeLocalMCPServer(cf *CLIConf, args []string) claude.MCPServer { + s := claude.MCPServer{ + Command: cf.executablePath, + Args: args, + } + + // Use the same TELEPORT_HOME the current tsh uses. + if homeDir := os.Getenv(types.HomeEnvVar); homeDir != "" { + s.AddEnv(types.HomeEnvVar, homeDir) + } + + // Disable debug through env var. MCP server commands should enable debug by + // default. + opts := getLoggingOptsForMCPServer(cf) + if !opts.debug { + s.AddEnv(debugEnvVar, "false") + } + if opts.osLog { + s.AddEnv(osLogEnvVar, "true") + } + + // TODO(greedy52) anything else? maybe cluster, login-related, etc? + return s +} + +func getLoggingOptsForMCPServer(cf *CLIConf) loggingOpts { + return getLoggingOptsWithDefault(cf, loggingOpts{ + debug: true, + }) +} + +// mcpConfigHint is the hint message displayed when the configuration is shown +// to users. +const mcpConfigHint = `Tip: You can use this command to update your MCP servers configuration file automatically. +- For Claude Desktop, use --client-config=claude to update the default configuration. +- For Cursor, use --client-config=cursor to update the global MCP servers configuration. +In addition, you can use --client-config= to specify a config file location that is compatible with the "mcpServers" mapping. +For example, you can update a Cursor project using --client-config=/.cursor/mcp.json` diff --git a/tool/tsh/common/mcp_app.go b/tool/tsh/common/mcp_app.go new file mode 100644 index 0000000000000..5a67648e4c36b --- /dev/null +++ b/tool/tsh/common/mcp_app.go @@ -0,0 +1,437 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "cmp" + "context" + "fmt" + "io" + "iter" + "slices" + "strings" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + oteltrace "go.opentelemetry.io/otel/trace" + + "github.com/gravitational/teleport" + apiclient "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/iterutils" + "github.com/gravitational/teleport/lib/asciitable" + "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/client/mcp/claude" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/tool/common" +) + +func newMCPConnectCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpConnectCommand { + cmd := &mcpConnectCommand{ + CmdClause: parent.Command("connect", "Connect to an MCP server.").Hidden(), + cf: cf, + } + + cmd.Arg("name", "Name of the MCP server.").Required().StringVar(&cf.AppName) + return cmd +} + +func newMCPListCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpListCommand { + cmd := &mcpListCommand{ + CmdClause: parent.Command("ls", "List available MCP server applications."), + cf: cf, + } + + cmd.Flag("verbose", "Show extra MCP server fields.").Short('v').BoolVar(&cf.Verbose) + cmd.Flag("search", searchHelp).StringVar(&cf.SearchKeywords) + cmd.Flag("query", queryHelp).StringVar(&cf.PredicateExpression) + cmd.Arg("labels", labelHelp).StringVar(&cf.Labels) + cmd.Flag("format", defaults.FormatFlagDescription(defaults.DefaultFormats...)).Short('f').Default(teleport.Text).EnumVar(&cf.Format, defaults.DefaultFormats...) + return cmd +} + +func newMCPConfigCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpConfigCommand { + cmd := &mcpConfigCommand{ + CmdClause: parent.Command("config", "Print client configuration details."), + cf: cf, + } + + cmd.Flag("all", "Select all MCP servers. Mutually exclusive with --labels or --query.").Short('R').BoolVar(&cf.ListAll) + cmd.Flag("labels", labelHelp).StringVar(&cf.Labels) + cmd.Flag("query", queryHelp).StringVar(&cf.PredicateExpression) + cmd.Arg("name", "Name of the MCP server.").StringVar(&cf.AppName) + cmd.clientConfig.addToCmd(cmd.CmdClause) + cmd.Alias(mcpConfigHelp) + return cmd +} + +// mcpListCommand implements `tsh mcp ls` command. +type mcpListCommand struct { + *kingpin.CmdClause + cf *CLIConf + accessChecker services.AccessChecker + mcpServers []types.Application +} + +func (c *mcpListCommand) run() error { + if err := c.fetch(); err != nil { + return trace.Wrap(err) + } + return trace.Wrap(c.print()) +} + +func (c *mcpListCommand) fetch() error { + ctx := c.cf.Context + tc, err := makeClient(c.cf) + if err != nil { + return trace.Wrap(err) + } + + var clusterClient *client.ClusterClient + err = client.RetryWithRelogin(ctx, tc, func() error { + clusterClient, err = tc.ConnectToCluster(ctx) + return trace.Wrap(err) + }) + if err != nil { + return trace.Wrap(err) + } + defer clusterClient.Close() + + c.accessChecker, err = makeAccessChecker(ctx, tc, clusterClient.AuthClient) + if err != nil { + return trace.Wrap(err) + } + + c.mcpServers, err = fetchMCPServers(ctx, tc, clusterClient.AuthClient) + if err != nil { + return trace.Wrap(err) + } + return nil +} + +func (c *mcpListCommand) print() error { + mcpServers := iterutils.Map(func(app types.Application) mcpServerWithDetails { + return newMCPServerWithDetails(app, c.accessChecker) + }, slices.Values(c.mcpServers)) + + switch c.cf.Format { + case "", teleport.Text: + if c.cf.Verbose { + return trace.Wrap(printMCPServersInVerboseText(c.cf.Stdout(), mcpServers)) + } + return trace.Wrap(printMCPServersInText(c.cf.Stdout(), mcpServers)) + + case teleport.JSON: + return trace.Wrap(common.PrintJSONIndent(c.cf.Stdout(), slices.Collect(mcpServers))) + case teleport.YAML: + return trace.Wrap(common.PrintYAML(c.cf.Stdout(), slices.Collect(mcpServers))) + + default: + return trace.BadParameter("unsupported format %q", c.cf.Format) + } +} + +func fetchMCPServers(ctx context.Context, tc *client.TeleportClient, auth apiclient.GetResourcesClient) ([]types.Application, error) { + if auth == nil { + var clusterClient *client.ClusterClient + var err error + err = client.RetryWithRelogin(ctx, tc, func() error { + clusterClient, err = tc.ConnectToCluster(ctx) + return trace.Wrap(err) + }) + if err != nil { + return nil, trace.Wrap(err) + } + defer clusterClient.Close() + auth = clusterClient.AuthClient + } + + ctx, span := tc.Tracer.Start( + ctx, + "fetchMCPServers", + oteltrace.WithSpanKind(oteltrace.SpanKindClient), + ) + defer span.End() + + filter := tc.ResourceFilter(types.KindAppServer) + filter.PredicateExpression = withMCPServerAppFilter(filter.PredicateExpression) + + appServers, err := apiclient.GetAllResources[types.AppServer](ctx, auth, filter) + if err != nil { + return nil, trace.Wrap(err) + } + + return slices.SortedFunc( + types.DeduplicatedApps(types.AppServers(appServers).Applications()), + types.CompareResourceByNames, + ), nil +} + +func withMCPServerAppFilter(predicateExpression string) string { + return makePredicateConjunction( + predicateExpression, + `resource.sub_kind == "mcp"`, + ) +} + +// mcpServerWithDetails defines an MCP server application with permission +// details, for printing purpose. +type mcpServerWithDetails struct { + // Use a real type for inline. + *types.AppV3 + + Permissions struct { + MCP struct { + Tools struct { + Allowed []string `json:"allowed"` + Denied []string `json:"denied,omitempty"` + } `json:"tools"` + } `json:"mcp"` + } `json:"permissions"` +} + +func (a *mcpServerWithDetails) updateToolsPermissions(accessChecker services.AccessChecker) { + if accessChecker == nil { + return + } + + mcpTools := accessChecker.EnumerateMCPTools(a.AppV3) + a.Permissions.MCP.Tools.Allowed, a.Permissions.MCP.Tools.Denied = mcpTools.ToEntities() +} + +func newMCPServerWithDetails(app types.Application, accessChecker services.AccessChecker) mcpServerWithDetails { + a := mcpServerWithDetails{ + AppV3: app.Copy(), + } + a.updateToolsPermissions(accessChecker) + return a +} + +func printMCPServersInText(w io.Writer, mcpServers iter.Seq[mcpServerWithDetails]) error { + var rows [][]string + for mcpServer := range mcpServers { + rows = append(rows, []string{ + mcpServer.GetName(), + mcpServer.GetDescription(), + types.GetMCPServerTransportType(mcpServer.GetURI()), + common.FormatLabels(mcpServer.GetAllLabels(), false), + }) + } + t := asciitable.MakeTableWithTruncatedColumn([]string{"Name", "Description", "Type", "Labels"}, rows, "Labels") + _, err := fmt.Fprintln(w, t.AsBuffer().String()) + return trace.Wrap(err) +} + +func printMCPServersInVerboseText(w io.Writer, mcpServers iter.Seq[mcpServerWithDetails]) error { + t := asciitable.MakeTable([]string{"Name", "Description", "Type", "Labels", "Command", "Args", "Allowed Tools"}) + for mcpServer := range mcpServers { + mcpSpec := cmp.Or(mcpServer.GetMCP(), &types.MCP{}) + t.AddRow([]string{ + mcpServer.GetName(), + mcpServer.GetDescription(), + types.GetMCPServerTransportType(mcpServer.GetURI()), + common.FormatLabels(mcpServer.GetAllLabels(), true), + mcpSpec.Command, + strings.Join(mcpSpec.Args, " "), + common.FormatAllowedEntities(mcpServer.Permissions.MCP.Tools.Allowed, mcpServer.Permissions.MCP.Tools.Denied), + }) + } + _, err := fmt.Fprintln(w, t.AsBuffer().String()) + return trace.Wrap(err) +} + +type mcpConfigCommand struct { + *kingpin.CmdClause + clientConfig mcpClientConfigFlags + cf *CLIConf + + mcpServerApps []types.Application + + // fetchFunc is for fetching MCP servers, defaults to fetchMCPServers. Can + // be mocked in tests. + fetchFunc func(context.Context, *client.TeleportClient, apiclient.GetResourcesClient) ([]types.Application, error) +} + +func (c *mcpConfigCommand) run() error { + if err := c.checkSelectorFlags(); err != nil { + return trace.Wrap(err) + } + switch { + case c.clientConfig.isSet(): + return trace.Wrap(c.updateClientConfig()) + default: + return trace.Wrap(c.printJSONWithHint()) + } +} + +func (c *mcpConfigCommand) checkSelectorFlags() error { + // Some of them can technically be used together but make them mutually + // exclusively for simplicity. + var mutuallyExclusiveSelectors int + for _, selectorEnabled := range []bool{ + c.cf.ListAll, + c.cf.AppName != "", + c.cf.PredicateExpression != "", + c.cf.Labels != "", + } { + if selectorEnabled { + mutuallyExclusiveSelectors++ + } + } + + switch mutuallyExclusiveSelectors { + case 0: + return trace.BadParameter("no selector specified. Please provide the MCP server name or use one of the following flags: --all, --labels, or --query.") + case 1: + return nil + default: + return trace.BadParameter("only one selector is allowed. Specify either the MCP server name or one of --all, --labels, or --query flags.") + } +} + +func (c *mcpConfigCommand) fetchAndPrintResult() error { + if err := c.fetch(); err != nil { + return trace.Wrap(err) + } + + printList := fmt.Sprintf(`Found MCP servers: +%v + +`, strings.Join(slices.Collect(types.ResourceNames(c.mcpServerApps)), "\n")) + _, err := fmt.Fprint(c.cf.Stdout(), printList) + return trace.Wrap(err) +} + +func (c *mcpConfigCommand) fetch() error { + if c.cf.AppName != "" { + c.cf.PredicateExpression = makeNamePredicate(c.cf.AppName) + } + if c.fetchFunc == nil { + c.fetchFunc = fetchMCPServers + } + + tc, err := makeClient(c.cf) + if err != nil { + return trace.Wrap(err) + } + + c.mcpServerApps, err = c.fetchFunc(c.cf.Context, tc, nil) + if err != nil { + return trace.Wrap(err) + } + + if len(c.mcpServerApps) == 0 { + return trace.NotFound("no MCP servers found") + } + return nil +} + +func (c *mcpConfigCommand) addMCPServersToConfig(config claudeConfig) error { + for _, app := range c.mcpServerApps { + localName := mcpServerAppConfigPrefix + app.GetName() + err := config.PutMCPServer(localName, makeLocalMCPServer(c.cf, []string{"mcp", "connect", app.GetName()})) + if err != nil { + return trace.Wrap(err) + } + } + return nil +} + +func (c *mcpConfigCommand) printJSONWithHint() error { + if err := c.fetchAndPrintResult(); err != nil { + return trace.Wrap(err) + } + + config := claude.NewConfig() + if err := c.addMCPServersToConfig(config); err != nil { + return trace.Wrap(err) + } + + w := c.cf.Stdout() + if _, err := fmt.Fprintln(w, "Here is a sample JSON configuration for launching Teleport MCP servers:"); err != nil { + return trace.Wrap(err) + } + if err := config.Write(w, claude.FormatJSONOption(c.clientConfig.jsonFormat)); err != nil { + return trace.Wrap(err) + } + if _, err := fmt.Fprintln(w, ""); err != nil { + return trace.Wrap(err) + } + return trace.Wrap(c.clientConfig.printHint(w)) +} + +func (c *mcpConfigCommand) updateClientConfig() error { + if err := c.fetchAndPrintResult(); err != nil { + return trace.Wrap(err) + } + + config, err := c.clientConfig.loadConfig() + if err != nil { + return trace.Wrap(err) + } + if err := c.addMCPServersToConfig(config); err != nil { + return trace.Wrap(err) + } + + if err := config.Save(claude.FormatJSONOption(c.clientConfig.jsonFormat)); err != nil { + return trace.Wrap(err) + } + + // TODO(greedy52) update hint once auto-reconnection is handled. + _, err = fmt.Fprintf(c.cf.Stdout(), `Updated client configuration at: +%s + +Teleport MCP servers will be prefixed with "teleport-mcp-" in this +configuration. + +You may need to restart your client to reload these new configurations. If you +encounter a "disconnected" error when tsh session expires, you may also need to +restart your client after logging in a new tsh session. +`, config.Path()) + return trace.Wrap(err) +} + +const mcpServerAppConfigPrefix = "teleport-mcp-" + +// mcpConnectCommand implements `tsh mcp connect` command. +type mcpConnectCommand struct { + *kingpin.CmdClause + cf *CLIConf +} + +func (c *mcpConnectCommand) run() error { + _, err := initLogger(c.cf, utils.LoggingForMCP, getLoggingOptsForMCPServer(c.cf)) + if err != nil { + return trace.Wrap(err) + } + + tc, err := makeClient(c.cf) + if err != nil { + return trace.Wrap(err) + } + tc.NonInteractive = true + + serverConn, err := tc.DialMCPServer(c.cf.Context, c.cf.AppName) + if err != nil { + return trace.Wrap(err) + } + return trace.Wrap(utils.ProxyConn(c.cf.Context, utils.CombinedStdio{}, serverConn)) +} diff --git a/tool/tsh/common/mcp_app_test.go b/tool/tsh/common/mcp_app_test.go new file mode 100644 index 0000000000000..263d65370c4b5 --- /dev/null +++ b/tool/tsh/common/mcp_app_test.go @@ -0,0 +1,509 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "bytes" + "context" + "maps" + "path/filepath" + "slices" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport" + apiclient "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/client/mcp/claude" + "github.com/gravitational/teleport/lib/observability/tracing" + "github.com/gravitational/teleport/lib/services" +) + +func Test_fetchMCPServers(t *testing.T) { + devLabels := map[string]string{"env": "dev"} + prodLabels := map[string]string{"env": "prod"} + + nonMCPAppServer := mustMakeNewAppServer(t, mustMakeNewAppV3(t, + types.Metadata{ + Name: "non-mcp-app", + Labels: devLabels, + }, + types.AppSpecV3{ + URI: "https://example.com", + }, + ), "host1") + + devMCPAppHost1 := mustMakeNewAppServer(t, mustMakeMCPAppWithNameAndLabels(t, "dev", devLabels), "host1") + devMCPAppHost2 := mustMakeNewAppServer(t, mustMakeMCPAppWithNameAndLabels(t, "dev", devLabels), "host2") + proMCPApp1 := mustMakeNewAppServer(t, mustMakeMCPAppWithNameAndLabels(t, "prod-1", prodLabels), "host1") + proMCPApp2 := mustMakeNewAppServer(t, mustMakeMCPAppWithNameAndLabels(t, "prod-2", prodLabels), "host1") + + fakeClient := &fakeResourcesClient{ + resources: []types.ResourceWithLabels{ + proMCPApp1, nonMCPAppServer, devMCPAppHost1, devMCPAppHost2, proMCPApp2, + }, + } + + tests := []struct { + name string + searchConfig client.Config + wantNames []string + }{ + { + name: "no match", + searchConfig: client.Config{ + Labels: map[string]string{"env": "not-found"}, + }, + wantNames: nil, + }, + { + name: "all", + searchConfig: client.Config{}, + wantNames: []string{"dev", "prod-1", "prod-2"}, + }, + { + name: "by label", + searchConfig: client.Config{ + Labels: map[string]string{"env": "prod"}, + }, + wantNames: []string{"prod-1", "prod-2"}, + }, + { + name: "by keywords", + searchConfig: client.Config{ + SearchKeywords: []string{"prod"}, + }, + wantNames: []string{"prod-1", "prod-2"}, + }, + { + name: "by predicate", + searchConfig: client.Config{ + PredicateExpression: "name==\"dev\"", + }, + wantNames: []string{"dev"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tc := &client.TeleportClient{ + Config: tt.searchConfig, + } + tc.Tracer = tracing.NoopTracer(teleport.ComponentTSH) + + mcpServers, err := fetchMCPServers(context.Background(), tc, fakeClient) + require.NoError(t, err) + require.Equal(t, tt.wantNames, slices.Collect(types.ResourceNames(mcpServers))) + }) + } +} + +// Test_mcpListCommand tests "tsh mcp ls". +// Note that mcpListCommand.fetch is not interesting to test and some of its +// logic is tested separately (see Test_fetchMCPServers above). Thus, this test +// mocks fetch results and tests mcpListCommand.print. +func Test_mcpListCommand(t *testing.T) { + devLabels := map[string]string{"env": "dev"} + mcpServers := []types.Application{ + mustMakeMCPAppWithNameAndLabels(t, "allow-read", devLabels), + mustMakeMCPAppWithNameAndLabels(t, "deny-write", devLabels), + } + accessChecker := fakeMCPServerAccessChecker{} + + tests := []struct { + name string + cf *CLIConf + wantOutput string + }{ + { + name: "text format", + cf: &CLIConf{}, + wantOutput: `Name Description Type Labels +---------- ----------- ----- ------- +allow-read description stdio env=dev +deny-write description stdio env=dev + +`, + }, + { + name: "text format in verbose", + cf: &CLIConf{ + Verbose: true, + }, + wantOutput: `Name Description Type Labels Command Args Allowed Tools +---------- ----------- ----- ------- ------- ---- ---------------------- +allow-read description stdio env=dev test arg [read_*] +deny-write description stdio env=dev test arg [*], except: [write_*] + +`, + }, + { + name: "JSON format", + cf: &CLIConf{ + Format: "json", + }, + wantOutput: `[ + { + "kind": "app", + "sub_kind": "mcp", + "version": "v3", + "metadata": { + "name": "allow-read", + "description": "description", + "labels": { + "env": "dev" + } + }, + "spec": { + "uri": "mcp+stdio://", + "insecure_skip_verify": false, + "mcp": { + "command": "test", + "args": [ + "arg" + ], + "run_as_host_user": "test" + } + }, + "permissions": { + "mcp": { + "tools": { + "allowed": [ + "read_*" + ] + } + } + } + }, + { + "kind": "app", + "sub_kind": "mcp", + "version": "v3", + "metadata": { + "name": "deny-write", + "description": "description", + "labels": { + "env": "dev" + } + }, + "spec": { + "uri": "mcp+stdio://", + "insecure_skip_verify": false, + "mcp": { + "command": "test", + "args": [ + "arg" + ], + "run_as_host_user": "test" + } + }, + "permissions": { + "mcp": { + "tools": { + "allowed": [ + "*" + ], + "denied": [ + "write_*" + ] + } + } + } + } +] +`, + }, + { + name: "YAML format", + cf: &CLIConf{ + Format: "yaml", + }, + wantOutput: `- kind: app + metadata: + description: description + labels: + env: dev + name: allow-read + permissions: + mcp: + tools: + allowed: + - read_* + spec: + insecure_skip_verify: false + mcp: + args: + - arg + command: test + run_as_host_user: test + uri: mcp+stdio:// + sub_kind: mcp + version: v3 +- kind: app + metadata: + description: description + labels: + env: dev + name: deny-write + permissions: + mcp: + tools: + allowed: + - '*' + denied: + - write_* + spec: + insecure_skip_verify: false + mcp: + args: + - arg + command: test + run_as_host_user: test + uri: mcp+stdio:// + sub_kind: mcp + version: v3 + +`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var buf bytes.Buffer + cf := tt.cf + cf.OverrideStdout = &buf + cf.Context = context.Background() + + cmd := &mcpListCommand{ + cf: tt.cf, + mcpServers: mcpServers, + accessChecker: accessChecker, + } + + err := cmd.print() + require.NoError(t, err) + require.Equal(t, tt.wantOutput, buf.String()) + }) + } +} + +func Test_mcpConfigCommand(t *testing.T) { + devLabels := map[string]string{"env": "dev"} + prodLabels := map[string]string{"env": "prod"} + devMCPApp1 := mustMakeNewAppServer(t, mustMakeMCPAppWithNameAndLabels(t, "dev1", devLabels), "host") + devMCPApp2 := mustMakeNewAppServer(t, mustMakeMCPAppWithNameAndLabels(t, "dev2", devLabels), "host") + prodMCPApp := mustMakeNewAppServer(t, mustMakeMCPAppWithNameAndLabels(t, "prod", prodLabels), "host") + fakeClient := &fakeResourcesClient{ + resources: []types.ResourceWithLabels{ + devMCPApp1, devMCPApp2, prodMCPApp, + }, + } + + tests := []struct { + name string + cf *CLIConf + checkError require.ErrorAssertionFunc + disableConfigFile bool + wantNamesInConfig []string + wantOutputContains string + }{ + { + name: "not found", + cf: &CLIConf{ + AppName: "not found", + }, + checkError: require.Error, + // "local-everything" was already in the config. Double-check we + // didn't screw it up. + wantNamesInConfig: []string{"local-everything"}, + }, + { + name: "single", + cf: &CLIConf{ + AppName: "dev2", + }, + checkError: require.NoError, + wantNamesInConfig: []string{"teleport-mcp-dev2", "local-everything"}, + wantOutputContains: "Updated client configuration", + }, + { + name: "all", + cf: &CLIConf{ + ListAll: true, + }, + checkError: require.NoError, + wantNamesInConfig: []string{"teleport-mcp-dev1", "teleport-mcp-dev2", "teleport-mcp-prod", "local-everything"}, + wantOutputContains: "Updated client configuration", + }, + { + name: "labels", + cf: &CLIConf{ + Labels: "env=dev", + }, + checkError: require.NoError, + wantNamesInConfig: []string{"teleport-mcp-dev1", "teleport-mcp-dev2", "local-everything"}, + wantOutputContains: "Updated client configuration", + }, + { + name: "no selector", + cf: &CLIConf{}, + checkError: require.Error, + wantNamesInConfig: []string{"local-everything"}, + }, + { + name: "too many selectors", + cf: &CLIConf{ + ListAll: true, + AppName: "dev2", + }, + checkError: require.Error, + wantNamesInConfig: []string{"local-everything"}, + }, + { + name: "print json", + cf: &CLIConf{ + AppName: "dev2", + }, + disableConfigFile: true, + checkError: require.NoError, + // Hints for config file flags. + wantOutputContains: "Tip:", + wantNamesInConfig: []string{"local-everything"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + configPath := setupMockMCPConfig(t) + var buf bytes.Buffer + tt.cf.Context = context.Background() + tt.cf.Proxy = "proxy:3080" + tt.cf.HomePath = t.TempDir() + tt.cf.OverrideStdout = &buf + mustCreateEmptyProfile(t, tt.cf) + + cmd := mcpConfigCommand{ + clientConfig: mcpClientConfigFlags{ + clientConfig: configPath, + jsonFormat: "pretty", + }, + cf: tt.cf, + fetchFunc: func(ctx context.Context, tc *client.TeleportClient, _ apiclient.GetResourcesClient) ([]types.Application, error) { + return fetchMCPServers(ctx, tc, fakeClient) + }, + } + + if tt.disableConfigFile { + cmd.clientConfig.clientConfig = "" + } + + err := cmd.run() + tt.checkError(t, err) + mustHaveMCPServerNamesInConfig(t, configPath, tt.wantNamesInConfig) + require.Contains(t, buf.String(), tt.wantOutputContains) + }) + } +} + +type fakeResourcesClient struct { + resources []types.ResourceWithLabels +} + +func (f *fakeResourcesClient) GetResources(ctx context.Context, req *proto.ListResourcesRequest) (*proto.ListResourcesResponse, error) { + filtered, err := matchResources(req, f.resources) + if err != nil { + return nil, trace.Wrap(err) + } + + paginatedResources, err := services.MakePaginatedResources(req.ResourceType, filtered, nil) + if err != nil { + return nil, trace.Wrap(err) + } + return &proto.ListResourcesResponse{ + Resources: paginatedResources, + TotalCount: int32(len(filtered)), + }, nil +} + +func mustMakeNewAppServer(t *testing.T, app *types.AppV3, host string) types.AppServer { + t.Helper() + appServer, err := types.NewAppServerV3FromApp(app, host, host) + require.NoError(t, err) + return appServer +} + +func mustMakeMCPAppWithNameAndLabels(t *testing.T, name string, labels map[string]string) *types.AppV3 { + t.Helper() + return mustMakeNewAppV3(t, + types.Metadata{ + Name: name, + Description: "description", + Labels: labels, + }, + types.AppSpecV3{ + MCP: &types.MCP{ + Command: "test", + Args: []string{"arg"}, + RunAsHostUser: "test", + }, + }, + ) +} + +type fakeMCPServerAccessChecker struct { + services.AccessChecker +} + +func (f fakeMCPServerAccessChecker) EnumerateMCPTools(app types.Application) services.EnumerationResult { + switch app.GetName() { + case "allow-read": + return services.NewEnumerationResultFromEntities([]string{"read_*"}, nil) + case "deny-write": + return services.NewEnumerationResultFromEntities([]string{"*"}, []string{"write_*"}) + default: + return services.NewEnumerationResult() + } +} + +func setupMockMCPConfig(t *testing.T) string { + t.Helper() + dir := t.TempDir() + configPath := filepath.Join(dir, "config.json") + config, err := claude.LoadConfigFromFile(configPath) + require.NoError(t, err) + require.NoError(t, config.PutMCPServer("local-everything", claude.MCPServer{ + Command: "npx", + Args: []string{"-y", "@modelcontextprotocol/server-everything"}, + })) + require.NoError(t, config.Save(claude.FormatJSONPretty)) + return config.Path() +} + +func mustHaveMCPServerNamesInConfig(t *testing.T, configPath string, wantNames []string) { + jsonConfig, err := claude.LoadConfigFromFile(configPath) + require.NoError(t, err) + require.ElementsMatch(t, + wantNames, + slices.Collect(maps.Keys(jsonConfig.GetMCPServers())), + ) +} diff --git a/tool/tsh/common/mcp_db.go b/tool/tsh/common/mcp_db.go new file mode 100644 index 0000000000000..541fd0ddbbeaa --- /dev/null +++ b/tool/tsh/common/mcp_db.go @@ -0,0 +1,418 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package common + +import ( + "context" + "fmt" + "log/slog" + "maps" + "net" + "text/template" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/client/proto" + apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client" + dbmcp "github.com/gravitational/teleport/lib/client/db/mcp" + pgmcp "github.com/gravitational/teleport/lib/client/db/postgres/mcp" + "github.com/gravitational/teleport/lib/client/mcp" + "github.com/gravitational/teleport/lib/client/mcp/claude" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" +) + +// mcpDBStartCommand implements `tsh mcp db start` command. +type mcpDBStartCommand struct { + *kingpin.CmdClause + + cf *CLIConf + databaseURIs []string +} + +func newMCPDBCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpDBStartCommand { + cmd := &mcpDBStartCommand{ + CmdClause: parent.Command("start", "Start a local MCP server for database access.").Hidden(), + cf: cf, + } + + cmd.Arg("uris", "List of database MCP resource URIs that will be served by the server").Required().StringsVar(&cmd.databaseURIs) + return cmd +} + +func (c *mcpDBStartCommand) run() error { + logger, err := initLogger(c.cf, utils.LoggingForMCP, getLoggingOptsForMCPServer(c.cf)) + if err != nil { + return trace.Wrap(err) + } + + registry := defaultDBMCPRegistry + if c.cf.databaseMCPRegistryOverride != nil { + registry = c.cf.databaseMCPRegistryOverride + } + + tc, err := makeClient(c.cf) + if err != nil { + return trace.Wrap(err) + } + + // Avoid any input request on the command execution. This is required, + // otherwise the MCP clients will be stuck waiting for a response. + tc.NonInteractive = false + + configuredDatabases := map[string]struct{}{} + uris := make([]*mcp.ResourceURI, len(c.databaseURIs)) + for i, rawURI := range c.databaseURIs { + uri, err := mcp.ParseResourceURI(rawURI) + if err != nil { + return trace.Wrap(err) + } + + if !uri.IsDatabase() { + return trace.BadParameter("%q resource must be a database", rawURI) + } + + // TODO(gabrielcorado): support databases from different clusters. + if uri.GetClusterName() != tc.SiteName { + return trace.BadParameter("Databases must be from the same cluster (%q). %q is from a different cluster.", tc.SiteName, rawURI) + } + + if _, ok := configuredDatabases[uri.WithoutParams().String()]; ok { + return trace.BadParameter("Database %q was configured twice. MCP servers only support serving a database service only once.", uri.GetDatabaseName()) + } + + configuredDatabases[uri.WithoutParams().String()] = struct{}{} + uris[i] = uri + } + + server := dbmcp.NewRootServer(logger) + allDatabases, err := c.prepareDatabases(c.cf, tc, registry, uris, logger, server) + if err != nil { + return trace.Wrap(err) + } + + for protocol, newServerFunc := range registry { + databases := allDatabases[protocol] + if len(databases) == 0 { + continue + } + + srv, err := newServerFunc(c.cf.Context, &dbmcp.NewServerConfig{ + Logger: logger, + RootServer: server, + Databases: databases, + }) + if err != nil { + return trace.Wrap(err) + } + defer srv.Close(c.cf.Context) + } + + return trace.Wrap(server.ServeStdio(c.cf.Context, c.cf.Stdin(), c.cf.Stdout())) +} + +// prepareDatabases based on the available MCP servers, initialize the database +// local proxy and generate the MCP database. +func (c *mcpDBStartCommand) prepareDatabases( + cf *CLIConf, + tc *client.TeleportClient, + registry dbmcp.Registry, + uris []*mcp.ResourceURI, + logger *slog.Logger, + server *dbmcp.RootServer, +) (map[string][]*dbmcp.Database, error) { + var ( + ctx = cf.Context + dbsPerProtocol = make(map[string][]*dbmcp.Database) + ) + + for _, uri := range uris { + serviceName := uri.GetDatabaseServiceName() + dbUser := uri.GetDatabaseUser() + dbName := uri.GetDatabaseName() + + route := tlsca.RouteToDatabase{ + ServiceName: serviceName, + Username: dbUser, + Database: dbName, + } + + info, err := getDatabaseInfo(cf, tc, []tlsca.RouteToDatabase{route}) + if err != nil { + logger.InfoContext(ctx, "failed to retrieve database information", "database", serviceName, "error", err) + continue + } + + db, err := info.GetDatabase(ctx, tc) + if err != nil { + logger.InfoContext(ctx, "failed to load database information", "database", serviceName, "error", err) + continue + } + + if !registry.IsSupported(db.GetProtocol()) { + logger.InfoContext(ctx, "database protocol unsupported, skipping it", "database", serviceName, "protocol", db.GetProtocol()) + continue + } + + mcpDB := &dbmcp.Database{ + DB: db, + ClusterName: uri.GetClusterName(), + DatabaseUser: dbUser, + DatabaseName: dbName, + // Connections are always handled by the TeleportClient, so here we + // just need to return a placeholder. + LookupFunc: func(ctx context.Context, host string) (addrs []string, err error) { + return []string{host}, nil + }, + DialContextFunc: func(ctx context.Context, network, addr string) (net.Conn, error) { + conn, err := tc.DialDatabase(ctx, proto.RouteToDatabase{ + ServiceName: db.GetName(), + Protocol: db.GetProtocol(), + Username: dbUser, + Database: dbName, + }) + return conn, trace.Wrap(err) + }, + } + dbsPerProtocol[db.GetProtocol()] = append(dbsPerProtocol[db.GetProtocol()], mcpDB) + server.RegisterDatabase(mcpDB) + } + + return dbsPerProtocol, nil +} + +// databasesGetter is the interface used to retrieve available +// databases using filters. +type databasesGetter interface { + // ListDatabases returns all registered databases. + ListDatabases(ctx context.Context, customFilter *proto.ListResourcesRequest) ([]types.Database, error) +} + +// mcpDBConfigCommand implements `tsh mcp db config` command. +type mcpDBConfigCommand struct { + *kingpin.CmdClause + + clientConfig mcpClientConfigFlags + ctx context.Context + cf *CLIConf + siteName string + overwriteEnv bool + + // databasesGetter used to retrieve databases information. Can be mocked in + // tests. + databasesGetter databasesGetter +} + +func newMCPDBconfigCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpDBConfigCommand { + cmd := &mcpDBConfigCommand{ + CmdClause: parent.Command("config", "Print client configuration details."), + ctx: cf.Context, + cf: cf, + } + + cmd.Flag("db-user", "Database user to log in as.").Short('u').StringVar(&cf.DatabaseUser) + cmd.Flag("db-name", "Database name to log in to.").Short('n').StringVar(&cf.DatabaseName) + cmd.Flag("overwrite", "Overwrites command and environment variable from the config file.").BoolVar(&cmd.overwriteEnv) + cmd.Arg("name", "Database service name.").StringVar(&cf.DatabaseService) + cmd.clientConfig.addToCmd(cmd.CmdClause) + cmd.Alias(mcpDBConfigHelp) + return cmd +} + +// TODO(gabrielcorado): support generating config for multiple databases at once. +func (m *mcpDBConfigCommand) run() error { + if m.databasesGetter == nil { + tc, err := makeClient(m.cf) + if err != nil { + return trace.Wrap(err) + } + + m.databasesGetter = tc + m.siteName = tc.SiteName + } + + databases, err := m.databasesGetter.ListDatabases(m.ctx, &proto.ListResourcesRequest{ + Namespace: apidefaults.Namespace, + ResourceType: types.KindDatabaseServer, + PredicateExpression: makeDiscoveredNameOrNamePredicate(m.cf.DatabaseService), + // TODO(gabrielcorado): support requesting access. + UseSearchAsRoles: false, + }) + if err != nil { + return trace.Wrap(err) + } + + db, err := chooseOneDatabase(m.cf, databases) + if err != nil { + return trace.Wrap(err) + } + + // TODO(gabrielcorado): support having the flags empty and assume the values + // based on the role and database. + if m.cf.DatabaseUser == "" || m.cf.DatabaseName == "" { + return trace.BadParameter("You must specify --db-user and --db-name flags used to connect to the database") + } + + dbURI := mcp.NewDatabaseResourceURI(m.siteName, db.GetName(), mcp.WithDatabaseUser(m.cf.DatabaseUser), mcp.WithDatabaseName(m.cf.DatabaseName)) + switch { + case m.clientConfig.isSet(): + return trace.Wrap(m.updateClientConfig(dbURI)) + default: + return trace.Wrap(m.printJSONWithHint(dbURI)) + } +} + +func (m *mcpDBConfigCommand) printJSONWithHint(dbURI mcp.ResourceURI) error { + config := claude.NewConfig() + // Since the database is being added to a "fresh" config file the database + // will always be new and we can ignore the additional message as well. + if _, _, err := m.addDatabaseToConfig(config, dbURI); err != nil { + return trace.Wrap(err) + } + + w := m.cf.Stdout() + if _, err := fmt.Fprintln(w, "Here is a sample JSON configuration for launching Teleport MCP servers:"); err != nil { + return trace.Wrap(err) + } + if err := config.Write(w, claude.FormatJSONOption(m.clientConfig.jsonFormat)); err != nil { + return trace.Wrap(err) + } + if _, err := fmt.Fprintf(w, ` +If you already have an entry for %q server, add the following database resource URI to the command arguments list: +%s + +`, mcpDBConfigName, dbURI.String()); err != nil { + return trace.Wrap(err) + } + return trace.Wrap(m.clientConfig.printHint(w)) +} + +// TODO(gabrielcorado): support updating multiple databases at once. +func (m *mcpDBConfigCommand) updateClientConfig(dbURI mcp.ResourceURI) error { + config, err := m.clientConfig.loadConfig() + if err != nil { + return trace.Wrap(err) + } + preexistentDB, commandChanged, err := m.addDatabaseToConfig(config, dbURI) + if err != nil { + return trace.Wrap(err) + } + + if err := config.Save(claude.FormatJSONOption(m.clientConfig.jsonFormat)); err != nil { + return trace.Wrap(err) + } + + templateData := struct { + Name string + ConfigPath string + ConfigName string + PreexistentDB bool + EnvChanged bool + OverwriteEnv bool + }{ + Name: dbURI.GetDatabaseServiceName(), + ConfigPath: config.Path(), + ConfigName: mcpDBConfigName, + PreexistentDB: preexistentDB, + EnvChanged: commandChanged, + OverwriteEnv: m.overwriteEnv, + } + + return trace.Wrap(mcpDBConfigMessageTemplate.Execute(m.cf.Stdout(), templateData)) +} + +// addDatabaseToConfig adds the provided database, merging with existent +// databases configured. This function returns a additional message to be +// displayed to users. +func (m *mcpDBConfigCommand) addDatabaseToConfig(config claudeConfig, dbURI mcp.ResourceURI) (bool, bool, error) { + var ( + dbs []string + updated bool + envChanged bool + server = makeLocalMCPServer(m.cf, nil /* args */) + ) + if existentServer, ok := config.GetMCPServers()[mcpDBConfigName]; ok { + // For most common cases we want to keep the environment variables + // unchanged. However, in case users want a "fresh start" they can + // provide a flag so we overwrite them with default values. + if !maps.Equal(server.Envs, existentServer.Envs) { + envChanged = true + if !m.overwriteEnv { + server.Envs = existentServer.Envs + } + } + + for _, arg := range existentServer.Args { + // We're only interested in resources, any flags or other command + // parts will be discarded. + uri, err := mcp.ParseResourceURI(arg) + if err != nil { + continue + } + + if !uri.IsDatabase() { + return false, false, trace.BadParameter("resource %q on config is not a database", uri.String()) + } + + if uri.WithoutParams().Equal(dbURI.WithoutParams()) { + dbs = append(dbs, dbURI.String()) + updated = true + } else { + dbs = append(dbs, uri.String()) + } + } + } + + if !updated { + dbs = append(dbs, dbURI.String()) + } + + server.Args = append([]string{"mcp", "db", "start"}, dbs...) + return updated, envChanged, trace.Wrap(config.PutMCPServer(mcpDBConfigName, server)) +} + +var ( + // defaultDBMCPRegistry is the default database access MCP servers registry. + defaultDBMCPRegistry = map[string]dbmcp.NewServerFunc{ + defaults.ProtocolPostgres: pgmcp.NewServer, + } +) + +// mcpDBConfigName is the configuration name that is managed by the config +// command. +const mcpDBConfigName = "teleport-databases" + +// mcpDBConfigMessageTemplate is the MCP db config message template. +var mcpDBConfigMessageTemplate = template.Must(template.New("").Funcs(template.FuncMap{ + "quote": func(s string) string { return fmt.Sprintf("%q", s) }, +}).Parse(`{{ if .PreexistentDB -}}Updated{{ else }}Added{{ end }} database {{ .Name | quote }} on the client configuration at: +{{ .ConfigPath }} + +Teleport database access MCP server is named {{ .ConfigName | quote }} in this configuration. + +You may need to restart your client to reload these new configurations. + +{{- if (and (.EnvChanged) (not .OverwriteEnv)) }} + +Environment variables have changed, but existing values will be preserved. +To overwrite them, rerun this command with the --overwrite flag. +{{- end }} +`)) diff --git a/tool/tsh/common/mcp_db_test.go b/tool/tsh/common/mcp_db_test.go new file mode 100644 index 0000000000000..5faf7c61ad479 --- /dev/null +++ b/tool/tsh/common/mcp_db_test.go @@ -0,0 +1,423 @@ +// Teleport +// Copyright (C) 2025 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package common + +import ( + "bytes" + "context" + "io" + "path/filepath" + "testing" + "time" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/gravitational/trace" + mcpclient "github.com/mark3labs/mcp-go/client" + mcptransport "github.com/mark3labs/mcp-go/client/transport" + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + dbmcp "github.com/gravitational/teleport/lib/client/db/mcp" + clientmcp "github.com/gravitational/teleport/lib/client/mcp" + "github.com/gravitational/teleport/lib/client/mcp/claude" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/service/servicecfg" + testserver "github.com/gravitational/teleport/tool/teleport/testenv" +) + +func TestMCPDBCommand(t *testing.T) { + tmpHomePath := t.TempDir() + connector := mockConnector(t) + alice, err := types.NewUser("alice@example.com") + require.NoError(t, err) + alice.SetDatabaseUsers([]string{"postgres"}) + alice.SetDatabaseNames([]string{"postgres"}) + alice.SetRoles([]string{"access"}) + + authProcess := testserver.MakeTestServer( + t, + testserver.WithClusterName(t, "root"), + testserver.WithBootstrap(connector, alice), + testserver.WithConfig(func(cfg *servicecfg.Config) { + cfg.Auth.NetworkingConfig.SetProxyListenerMode(types.ProxyListenerMode_Multiplex) + cfg.Databases.Enabled = true + cfg.Databases.Databases = []servicecfg.Database{ + { + Name: "postgres1", + Protocol: defaults.ProtocolPostgres, + URI: "external-pg:5432", + }, + { + Name: "postgres2", + Protocol: defaults.ProtocolPostgres, + URI: "external-pg:5432", + }, + { + Name: "mysql-local", + Protocol: defaults.ProtocolMySQL, + URI: "external-mysql:3306", + }, + } + }), + ) + + authServer := authProcess.GetAuthServer() + require.NotNil(t, authServer) + + proxyAddr, err := authProcess.ProxyWebAddr() + require.NoError(t, err) + + err = Run(t.Context(), []string{ + "login", "--insecure", "--debug", "--proxy", proxyAddr.String(), + }, setHomePath(tmpHomePath), setMockSSOLogin(authServer, alice, connector.GetName())) + require.NoError(t, err) + + stdin, writer := io.Pipe() + reader, stdout := io.Pipe() + + ctx, cancel := context.WithCancel(t.Context()) + defer cancel() + + executionCh := make(chan error) + go func() { + executionCh <- Run(ctx, []string{ + "mcp", + "db", + "start", + "teleport://clusters/root/databases/postgres1?dbUser=postgres&dbName=postgres", + "teleport://clusters/root/databases/postgres2?dbUser=postgres&dbName=postgres", + }, setHomePath(tmpHomePath), func(c *CLIConf) error { + c.overrideStdin = stdin + c.OverrideStdout = stdout + // MCP server logs are going to be discarded. + c.overrideStderr = io.Discard + c.databaseMCPRegistryOverride = map[string]dbmcp.NewServerFunc{ + defaults.ProtocolPostgres: func(ctx context.Context, nsc *dbmcp.NewServerConfig) (dbmcp.Server, error) { + return &testDatabaseMCP{}, nil + }, + } + return nil + }) + }() + + clt := mcpclient.NewClient(mcptransport.NewIO(reader, writer, nil /* logging */)) + require.NoError(t, clt.Start(t.Context())) + + req := mcp.InitializeRequest{} + req.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION + req.Params.ClientInfo = mcp.Implementation{ + Name: "test-client", + Version: "1.0.0", + } + + require.EventuallyWithT(t, func(collect *assert.CollectT) { + _, err = clt.Initialize(t.Context(), req) + require.NoError(collect, err) + require.NoError(collect, clt.Ping(t.Context())) + }, time.Second, 100*time.Millisecond) + + // Stop the MCP server command and wait until it is finshed. + cancel() + select { + case err := <-executionCh: + require.Error(t, err) + require.ErrorIs(t, err, context.Canceled) + case <-time.After(10 * time.Second): + require.Fail(t, "expected the execution to be completed") + } +} + +func TestMCPDBCommandFailures(t *testing.T) { + tmpHomePath := t.TempDir() + connector := mockConnector(t) + alice, err := types.NewUser("alice@example.com") + require.NoError(t, err) + alice.SetDatabaseUsers([]string{"postgres"}) + alice.SetDatabaseNames([]string{"postgres"}) + alice.SetRoles([]string{"access"}) + clusterName := "root" + + authProcess := testserver.MakeTestServer( + t, + testserver.WithClusterName(t, clusterName), + testserver.WithBootstrap(connector, alice), + testserver.WithConfig(func(cfg *servicecfg.Config) { + cfg.Auth.NetworkingConfig.SetProxyListenerMode(types.ProxyListenerMode_Multiplex) + cfg.Databases.Enabled = true + cfg.Databases.Databases = []servicecfg.Database{ + { + Name: "postgres1", + Protocol: defaults.ProtocolPostgres, + URI: "external-pg:5432", + }, + { + Name: "postgres2", + Protocol: defaults.ProtocolPostgres, + URI: "external-pg:5432", + }, + { + Name: "mysql-local", + Protocol: defaults.ProtocolMySQL, + URI: "external-mysql:3306", + }, + } + }), + ) + + authServer := authProcess.GetAuthServer() + require.NotNil(t, authServer) + + proxyAddr, err := authProcess.ProxyWebAddr() + require.NoError(t, err) + + withMockedMCPServers := func(c *CLIConf) error { + c.databaseMCPRegistryOverride = map[string]dbmcp.NewServerFunc{ + defaults.ProtocolPostgres: func(ctx context.Context, nsc *dbmcp.NewServerConfig) (dbmcp.Server, error) { + return &testDatabaseMCP{}, nil + }, + } + return nil + } + + err = Run(t.Context(), []string{ + "login", "--insecure", "--debug", "--proxy", proxyAddr.String(), + }, setHomePath(tmpHomePath), setMockSSOLogin(authServer, alice, connector.GetName())) + require.NoError(t, err) + + t.Run("different clusters", func(t *testing.T) { + err := Run(t.Context(), []string{ + "mcp", + "db", + "start", + "teleport://clusters/root/databases/postgres1?dbUser=postgres&dbName=postgres", + "teleport://clusters/other/databases/postgres2?dbUser=postgres&dbName=postgres", + }, setHomePath(tmpHomePath), withMockedMCPServers) + require.Error(t, err) + }) + + t.Run("duplicated databases", func(t *testing.T) { + err := Run(t.Context(), []string{ + "mcp", + "db", + "start", + "teleport://clusters/root/databases/postgres1?dbUser=postgres&dbName=postgres", + "teleport://clusters/root/databases/postgres1?dbUser=readonly&dbName=postgres", + }, setHomePath(tmpHomePath), withMockedMCPServers) + require.Error(t, err) + }) +} + +func TestMCPDBConfigCommand(t *testing.T) { + clusterName := "root" + db0, err := types.NewDatabaseV3(types.Metadata{ + Name: "pg", + }, types.DatabaseSpecV3{ + Protocol: "protocol", + URI: "uri", + }) + require.NoError(t, err) + db1, err := types.NewDatabaseV3(types.Metadata{ + Name: "another", + }, types.DatabaseSpecV3{ + Protocol: "protocol", + URI: "uri", + }) + require.NoError(t, err) + + dbURI0 := clientmcp.NewDatabaseResourceURI(clusterName, db0.GetName(), clientmcp.WithDatabaseUser("readonly"), clientmcp.WithDatabaseName("dbname")) + dbURI0Updated := clientmcp.NewDatabaseResourceURI(clusterName, db0.GetName(), clientmcp.WithDatabaseUser("rw"), clientmcp.WithDatabaseName("anotherdb")) + dbURI1 := clientmcp.NewDatabaseResourceURI(clusterName, db1.GetName(), clientmcp.WithDatabaseUser("rw"), clientmcp.WithDatabaseName("dbname")) + + for name, tc := range map[string]struct { + cf *CLIConf + overwriteEnv bool + databasesGetter databasesGetter + assertError require.ErrorAssertionFunc + initialDatabases []string + expectedDatabases []string + initialEnv map[string]string + expectedEnv map[string]string + }{ + "add database to empty config": { + cf: &CLIConf{ + DatabaseService: dbURI0.GetDatabaseServiceName(), + DatabaseUser: dbURI0.GetDatabaseUser(), + DatabaseName: dbURI0.GetDatabaseName(), + }, + databasesGetter: &mockDatabasesGetter{dbs: []types.Database{db0, db1}}, + assertError: require.NoError, + expectedDatabases: []string{dbURI0.String()}, + expectedEnv: map[string]string{}, + }, + "append database to config": { + cf: &CLIConf{ + DatabaseService: dbURI1.GetDatabaseServiceName(), + DatabaseUser: dbURI1.GetDatabaseUser(), + DatabaseName: dbURI1.GetDatabaseName(), + }, + databasesGetter: &mockDatabasesGetter{dbs: []types.Database{db0, db1}}, + assertError: require.NoError, + initialDatabases: []string{dbURI0.String()}, + expectedDatabases: []string{dbURI0.String(), dbURI1.String()}, + expectedEnv: map[string]string{}, + }, + "update existent database": { + cf: &CLIConf{ + DatabaseService: dbURI0Updated.GetDatabaseServiceName(), + DatabaseUser: dbURI0Updated.GetDatabaseUser(), + DatabaseName: dbURI0Updated.GetDatabaseName(), + }, + databasesGetter: &mockDatabasesGetter{dbs: []types.Database{db0, db1}}, + assertError: require.NoError, + initialDatabases: []string{dbURI0.String(), dbURI1.String()}, + expectedDatabases: []string{dbURI0Updated.String(), dbURI1.String()}, + expectedEnv: map[string]string{}, + }, + "database not found": { + cf: &CLIConf{ + DatabaseService: dbURI0.GetDatabaseServiceName(), + DatabaseUser: dbURI0.GetDatabaseUser(), + DatabaseName: dbURI0.GetDatabaseName(), + }, + databasesGetter: &mockDatabasesGetter{err: trace.NotFound("database not found")}, + assertError: require.Error, + }, + "missing connection params": { + cf: &CLIConf{ + DatabaseService: dbURI0Updated.GetDatabaseServiceName(), + }, + databasesGetter: &mockDatabasesGetter{dbs: []types.Database{db0}}, + assertError: require.Error, + }, + "keep current environment setting": { + cf: &CLIConf{ + DatabaseService: dbURI0.GetDatabaseServiceName(), + DatabaseUser: dbURI0.GetDatabaseUser(), + DatabaseName: dbURI0.GetDatabaseName(), + DebugSetByUser: true, + Debug: true, + }, + databasesGetter: &mockDatabasesGetter{dbs: []types.Database{db0, db1}}, + assertError: require.NoError, + initialDatabases: []string{dbURI0.String()}, + expectedDatabases: []string{dbURI0.String()}, + initialEnv: map[string]string{"test": "hello"}, + expectedEnv: map[string]string{"test": "hello"}, + }, + "reset environment setting": { + cf: &CLIConf{ + DatabaseService: dbURI0.GetDatabaseServiceName(), + DatabaseUser: dbURI0.GetDatabaseUser(), + DatabaseName: dbURI0.GetDatabaseName(), + }, + overwriteEnv: true, + databasesGetter: &mockDatabasesGetter{dbs: []types.Database{db0, db1}}, + assertError: require.NoError, + initialDatabases: []string{dbURI0.String()}, + expectedDatabases: []string{dbURI0.String()}, + initialEnv: map[string]string{"test": "hello"}, + expectedEnv: map[string]string{}, + }, + } { + t.Run(name, func(t *testing.T) { + configPath := setupMockDBMCPConfig(t, tc.cf, tc.initialDatabases, tc.initialEnv) + var buf bytes.Buffer + tc.cf.Context = context.Background() + tc.cf.Proxy = "proxy:3080" + tc.cf.HomePath = t.TempDir() + tc.cf.OverrideStdout = &buf + mustCreateEmptyProfile(t, tc.cf) + + cmd := &mcpDBConfigCommand{ + clientConfig: mcpClientConfigFlags{ + clientConfig: configPath, + jsonFormat: string(claude.FormatJSONPretty), + }, + cf: tc.cf, + ctx: t.Context(), + siteName: clusterName, + databasesGetter: tc.databasesGetter, + overwriteEnv: tc.overwriteEnv, + } + + err := cmd.run() + tc.assertError(t, err) + if err != nil { + return + } + + jsonConfig, err := claude.LoadConfigFromFile(configPath) + require.NoError(t, err) + mcpCmd, ok := jsonConfig.GetMCPServers()[mcpDBConfigName] + require.True(t, ok, "expected configuration to include database access server definition, but got nothing") + require.Empty(t, cmp.Diff(mcpCmd.Args, tc.expectedDatabases, cmpopts.EquateEmpty(), cmpopts.IgnoreSliceElements(func(arg string) bool { + // Only assert database resources on the args. + _, err := clientmcp.ParseResourceURI(arg) + return err != nil + }))) + require.Empty(t, cmp.Diff(mcpCmd.Envs, tc.expectedEnv, cmpopts.EquateEmpty(), cmpopts.IgnoreMapEntries(func(key string, _ string) bool { + // Ignore default fields, only look for additional ones. + switch key { + case types.HomeEnvVar, debugEnvVar, osLogEnvVar: + return true + default: + return false + } + }))) + }) + } +} + +func setupMockDBMCPConfig(t *testing.T, cf *CLIConf, databasesURIs []string, additionalEnv map[string]string) string { + t.Helper() + dir := t.TempDir() + configPath := filepath.Join(dir, "config.json") + config, err := claude.LoadConfigFromFile(configPath) + require.NoError(t, err) + require.NoError(t, config.PutMCPServer("local-everything", claude.MCPServer{ + Command: "npx", + Args: []string{"-y", "@modelcontextprotocol/server-everything"}, + })) + if len(databasesURIs) > 0 { + srv := makeLocalMCPServer(cf, append([]string{"mcp", "db", "start"}, databasesURIs...)) + for name, value := range additionalEnv { + srv.AddEnv(name, value) + } + require.NoError(t, config.PutMCPServer(mcpDBConfigName, srv)) + } + require.NoError(t, config.Save(claude.FormatJSONPretty)) + return config.Path() +} + +// testDatabaseMCP is a noop database MCP server. +type testDatabaseMCP struct{} + +func (s *testDatabaseMCP) Close(_ context.Context) error { return nil } + +// mockDatabaseGetter is a fetch databases mock. +type mockDatabasesGetter struct { + dbs []types.Database + err error +} + +func (m *mockDatabasesGetter) ListDatabases(_ context.Context, _ *proto.ListResourcesRequest) ([]types.Database, error) { + return m.dbs, m.err +} diff --git a/tool/tsh/common/mcp_test.go b/tool/tsh/common/mcp_test.go new file mode 100644 index 0000000000000..81bc1472590ee --- /dev/null +++ b/tool/tsh/common/mcp_test.go @@ -0,0 +1,96 @@ +/* + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_getLoggingOptsWithDefault(t *testing.T) { + tests := []struct { + name string + cf *CLIConf + debugEnvValue string + osLogEnvValue string + checkDebug require.BoolAssertionFunc + checkOSLog require.BoolAssertionFunc + }{ + { + name: "debug enabled by default", + cf: &CLIConf{}, + checkDebug: require.True, + checkOSLog: require.False, + }, + { + name: "enabled by flag", + cf: &CLIConf{ + DebugSetByUser: true, + Debug: true, + OSLogSetByUser: true, + OSLog: true, + }, + checkDebug: require.True, + checkOSLog: require.True, + }, + { + name: "disabled by flag", + cf: &CLIConf{ + DebugSetByUser: true, + }, + checkDebug: require.False, + checkOSLog: require.False, + }, + { + name: "disabled by env", + cf: &CLIConf{}, + debugEnvValue: "false", + osLogEnvValue: "false", + checkDebug: require.False, + checkOSLog: require.False, + }, + { + name: "enabled by env", + cf: &CLIConf{}, + debugEnvValue: "true", + osLogEnvValue: "true", + checkDebug: require.True, + checkOSLog: require.True, + }, + { + name: "bad env", + cf: &CLIConf{}, + debugEnvValue: "what", + osLogEnvValue: "what", + checkDebug: require.True, + checkOSLog: require.False, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Setenv(debugEnvVar, tt.debugEnvValue) + t.Setenv(osLogEnvVar, tt.osLogEnvValue) + opts := getLoggingOptsForMCPServer(tt.cf) + tt.checkDebug(t, opts.debug) + tt.checkOSLog(t, opts.osLog) + }) + } +} diff --git a/tool/tsh/common/proxy.go b/tool/tsh/common/proxy.go index f64429a5350c6..36824a8b25a99 100644 --- a/tool/tsh/common/proxy.go +++ b/tool/tsh/common/proxy.go @@ -501,6 +501,10 @@ func onProxyCommandApp(cf *CLIConf) error { return trace.Wrap(err) } + if app.IsMCP() { + return trace.BadParameter("MCP applications are not supported. Please see 'tsh mcp login --help' for more details.") + } + proxyApp, err := newLocalProxyAppWithPortMapping(cf.Context, tc, profile, appInfo.RouteToApp, app, portMapping, cf.InsecureSkipVerify) if err != nil { return trace.Wrap(err) diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index a0648680bdfd0..7644a6d048326 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -80,6 +80,7 @@ import ( benchmarkdb "github.com/gravitational/teleport/lib/benchmark/db" "github.com/gravitational/teleport/lib/client" dbprofile "github.com/gravitational/teleport/lib/client/db" + dbmcp "github.com/gravitational/teleport/lib/client/db/mcp" "github.com/gravitational/teleport/lib/client/identityfile" "github.com/gravitational/teleport/lib/client/reexec" "github.com/gravitational/teleport/lib/defaults" @@ -643,6 +644,10 @@ type CLIConf struct { // checkManagedUpdates initiates check of managed update after client connects to cluster. checkManagedUpdates bool + + // databaseMCPRegistryOverride overrides database access MCP servers + // registry. used in tests. + databaseMCPRegistryOverride dbmcp.Registry } func (c *CLIConf) isForkAuthChild() bool { @@ -752,24 +757,26 @@ const ( headlessSkipConfirmEnvVar = "TELEPORT_HEADLESS_SKIP_CONFIRM" // TELEPORT_SITE uses the older deprecated "site" terminology to refer to a // cluster. All new code should use TELEPORT_CLUSTER instead. - siteEnvVar = "TELEPORT_SITE" - userEnvVar = "TELEPORT_USER" - addKeysToAgentEnvVar = "TELEPORT_ADD_KEYS_TO_AGENT" - useLocalSSHAgentEnvVar = "TELEPORT_USE_LOCAL_SSH_AGENT" - globalTshConfigEnvVar = "TELEPORT_GLOBAL_TSH_CONFIG" - mfaModeEnvVar = "TELEPORT_MFA_MODE" - mlockModeEnvVar = "TELEPORT_MLOCK_MODE" - identityFileEnvVar = "TELEPORT_IDENTITY_FILE" - gcloudSecretEnvVar = "TELEPORT_GCLOUD_SECRET" - awsAccessKeyIDEnvVar = "TELEPORT_AWS_ACCESS_KEY_ID" - awsSecretAccessKeyEnvVar = "TELEPORT_AWS_SECRET_ACCESS_KEY" - awsRegionEnvVar = "TELEPORT_AWS_REGION" - awsKeystoreEnvVar = "TELEPORT_AWS_KEYSTORE" - awsWorkgroupEnvVar = "TELEPORT_AWS_WORKGROUP" - proxyKubeConfigEnvVar = "TELEPORT_KUBECONFIG" - noResumeEnvVar = "TELEPORT_NO_RESUME" - requestModeEnvVar = "TELEPORT_REQUEST_MODE" - toolsCheckUpdateEnvVar = "TELEPORT_TOOLS_CHECK_UPDATE" + siteEnvVar = "TELEPORT_SITE" + userEnvVar = "TELEPORT_USER" + addKeysToAgentEnvVar = "TELEPORT_ADD_KEYS_TO_AGENT" + useLocalSSHAgentEnvVar = "TELEPORT_USE_LOCAL_SSH_AGENT" + globalTshConfigEnvVar = "TELEPORT_GLOBAL_TSH_CONFIG" + mfaModeEnvVar = "TELEPORT_MFA_MODE" + mlockModeEnvVar = "TELEPORT_MLOCK_MODE" + identityFileEnvVar = "TELEPORT_IDENTITY_FILE" + gcloudSecretEnvVar = "TELEPORT_GCLOUD_SECRET" + awsAccessKeyIDEnvVar = "TELEPORT_AWS_ACCESS_KEY_ID" + awsSecretAccessKeyEnvVar = "TELEPORT_AWS_SECRET_ACCESS_KEY" + awsRegionEnvVar = "TELEPORT_AWS_REGION" + awsKeystoreEnvVar = "TELEPORT_AWS_KEYSTORE" + awsWorkgroupEnvVar = "TELEPORT_AWS_WORKGROUP" + proxyKubeConfigEnvVar = "TELEPORT_KUBECONFIG" + noResumeEnvVar = "TELEPORT_NO_RESUME" + requestModeEnvVar = "TELEPORT_REQUEST_MODE" + mcpClientConfigEnvVar = "TELEPORT_MCP_CLIENT_CONFIG" + mcpConfigJSONFormatEnvVar = "TELEPORT_MCP_CONFIG_JSON_FORMAT" + toolsCheckUpdateEnvVar = "TELEPORT_TOOLS_CHECK_UPDATE" clusterHelp = "Specify the Teleport cluster to connect" browserHelp = "Set to 'none' to suppress browser opening on login" @@ -829,7 +836,7 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { // run early to enable debug logging if env var is set. // this makes it possible to debug early startup functionality, particularly command aliases. - if err := initLogger(&cf, parseLoggingOptsFromEnv()); err != nil { + if _, err := initLogger(&cf, utils.LoggingForCLI, parseLoggingOptsFromEnv()); err != nil { printInitLoggerError(err) } @@ -1428,6 +1435,7 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { gitCmd := newGitCommands(app) pivCmd := newPIVCommands(app) + mcpCmd := newMCPCommands(app, &cf) if runtime.GOOS == constants.WindowsOS { bench.Hidden() @@ -1546,7 +1554,7 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { // Enable debug logging if requested by --debug. // If TELEPORT_DEBUG was set and --debug/--no-debug was not passed, debug logs were already // enabled by a prior call to initLogger. - if err := initLogger(&cf, parseLoggingOptsFromEnvAndArgv(&cf)); err != nil { + if _, err := initLogger(&cf, utils.LoggingForCLI, parseLoggingOptsFromEnvAndArgv(&cf)); err != nil { printInitLoggerError(err) } @@ -1863,6 +1871,16 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = pivCmd.agent.run(&cf) case updateCommand.update.FullCommand(): err = updateCommand.update.run(&cf) + case mcpCmd.dbStart.FullCommand(): + err = mcpCmd.dbStart.run() + case mcpCmd.dbConfig.FullCommand(): + err = mcpCmd.dbConfig.run() + case mcpCmd.connect.FullCommand(): + err = mcpCmd.connect.run() + case mcpCmd.list.FullCommand(): + err = mcpCmd.list.run() + case mcpCmd.config.FullCommand(): + err = mcpCmd.config.run() default: // Handle commands that might not be available. switch { @@ -3320,14 +3338,7 @@ func getDBUsers(db types.Database, accessChecker services.AccessChecker) *dbUser ) return &dbUsers{} } - var denied []string - allowed := users.Allowed() - if users.WildcardAllowed() { - // start the list with *. - allowed = append([]string{types.Wildcard}, allowed...) - // only include denied users if the wildcard is allowed. - denied = append(denied, users.Denied()...) - } + allowed, denied := users.ToEntities() return &dbUsers{ Allowed: allowed, Denied: denied, @@ -3392,9 +3403,6 @@ func formatUsersForDB(database types.Database, accessChecker services.AccessChec } dbUsers := getDBUsers(database, accessChecker) - if len(dbUsers.Allowed) == 0 { - return "(none)" - } // Add a note for auto-provisioned user. if database.IsAutoUsersEnabled() { @@ -3411,10 +3419,7 @@ func formatUsersForDB(database types.Database, accessChecker services.AccessChec } } - if len(dbUsers.Denied) == 0 { - return fmt.Sprintf("%v", dbUsers.Allowed) - } - return fmt.Sprintf("%v, except: %v", dbUsers.Allowed, dbUsers.Denied) + return common.FormatAllowedEntities(dbUsers.Allowed, dbUsers.Denied) } // TODO(greedy52) more refactoring on db printing and move them to db_print.go. diff --git a/tool/tsh/common/vnet_daemon_darwin.go b/tool/tsh/common/vnet_daemon_darwin.go index 69efccc050624..41d2668a43de6 100644 --- a/tool/tsh/common/vnet_daemon_darwin.go +++ b/tool/tsh/common/vnet_daemon_darwin.go @@ -61,7 +61,7 @@ func (c *vnetDaemonCommand) run(cf *CLIConf) error { level = slog.LevelDebug } - if err := utils.InitLogger(utils.LoggingForDaemon, level, utils.WithOSLog(subsystem)); err != nil { + if _, err := utils.InitLogger(utils.LoggingForDaemon, level, utils.WithOSLog(subsystem)); err != nil { return trace.Wrap(err, "initializing logger") } diff --git a/web/packages/design/src/Icon/Icons.story.tsx b/web/packages/design/src/Icon/Icons.story.tsx index 56c9ab502a61c..a710f3ea09197 100644 --- a/web/packages/design/src/Icon/Icons.story.tsx +++ b/web/packages/design/src/Icon/Icons.story.tsx @@ -164,6 +164,7 @@ export const Icons = () => ( + diff --git a/web/packages/design/src/Icon/Icons/ModelContextProtocol.tsx b/web/packages/design/src/Icon/Icons/ModelContextProtocol.tsx new file mode 100644 index 0000000000000..22f68193dd154 --- /dev/null +++ b/web/packages/design/src/Icon/Icons/ModelContextProtocol.tsx @@ -0,0 +1,66 @@ +/** + * Teleport + * Copyright (C) 2023 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 . + */ + +/* MIT License + +Copyright (c) 2020 Phosphor Icons + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +import { forwardRef } from 'react'; + +import { Icon, IconProps } from '../Icon'; + +/* + +THIS FILE IS GENERATED. DO NOT EDIT. + +*/ + +export const ModelContextProtocol = forwardRef( + ({ size = 24, color, ...otherProps }, ref) => ( + + + + + ) +); diff --git a/web/packages/design/src/Icon/assets/ModelContextProtocol.svg b/web/packages/design/src/Icon/assets/ModelContextProtocol.svg new file mode 100644 index 0000000000000..8d57babbe406e --- /dev/null +++ b/web/packages/design/src/Icon/assets/ModelContextProtocol.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/web/packages/design/src/Icon/index.ts b/web/packages/design/src/Icon/index.ts index 1c7b8abe9d6e4..bd92ea445d632 100644 --- a/web/packages/design/src/Icon/index.ts +++ b/web/packages/design/src/Icon/index.ts @@ -153,6 +153,7 @@ export { MagnifyingPlus } from './Icons/MagnifyingPlus'; export { Memory } from './Icons/Memory'; export { Minus } from './Icons/Minus'; export { MinusCircle } from './Icons/MinusCircle'; +export { ModelContextProtocol } from './Icons/ModelContextProtocol'; export { Moon } from './Icons/Moon'; export { MoreHoriz } from './Icons/MoreHoriz'; export { MoreVert } from './Icons/MoreVert'; diff --git a/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts index 1ddbde63d9950..9537b150b951b 100644 --- a/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts +++ b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts @@ -21,9 +21,7 @@ import { ResourceIconName, resourceIconSpecs, } from 'design/ResourceIcon'; - -// eslint-disable-next-line no-restricted-imports -- FIXME -import { AppSubKind } from 'teleport/services/apps'; +import { AppSubKind } from 'shared/services'; import { UnifiedResourceApp } from '../types'; diff --git a/web/packages/shared/components/UnifiedResources/shared/viewItemsFactory.ts b/web/packages/shared/components/UnifiedResources/shared/viewItemsFactory.ts index 831f3adffdb52..e1c3eac8af2e2 100644 --- a/web/packages/shared/components/UnifiedResources/shared/viewItemsFactory.ts +++ b/web/packages/shared/components/UnifiedResources/shared/viewItemsFactory.ts @@ -22,10 +22,11 @@ import { Desktop as DesktopIcon, GitHub as GitHubIcon, Kubernetes as KubernetesIcon, + ModelContextProtocol as MCPIcon, Server as ServerIcon, } from 'design/Icon'; import { ResourceIconName } from 'design/ResourceIcon'; -import { NodeSubKind } from 'shared/services'; +import { AppSubKind, NodeSubKind } from 'shared/services'; import { DbProtocol } from 'shared/services/databases'; import { @@ -114,6 +115,24 @@ export function makeUnifiedResourceViewItemApp( resource: UnifiedResourceApp, ui: UnifiedResourceUi ): UnifiedResourceViewItem { + if (resource.subKind === AppSubKind.MCP) { + // TODO(greedy52) add address for non-stdio based MCP servers. + return { + name: resource.friendlyName || resource.name, + SecondaryIcon: MCPIcon, + primaryIconName: guessAppIcon(resource), + ActionButton: ui.ActionButton, + labels: resource.labels, + cardViewProps: { + primaryDesc: resource.description || 'MCP server', + }, + listViewProps: { + resourceType: 'MCP Server', + description: resource.description || 'MCP server', + }, + requiresRequest: resource.requiresRequest, + }; + } return { name: resource.friendlyName || resource.name, SecondaryIcon: ApplicationIcon, diff --git a/web/packages/shared/components/UnifiedResources/types.ts b/web/packages/shared/components/UnifiedResources/types.ts index e56d1c23f52ab..e2bcc8a9b4030 100644 --- a/web/packages/shared/components/UnifiedResources/types.ts +++ b/web/packages/shared/components/UnifiedResources/types.ts @@ -20,13 +20,13 @@ import React from 'react'; import { Icon } from 'design/Icon'; import { ResourceIconName } from 'design/ResourceIcon'; -import { NodeSubKind } from 'shared/services'; +import { AppSubKind, NodeSubKind } from 'shared/services'; import { DbProtocol } from 'shared/services/databases'; // eslint-disable-next-line no-restricted-imports -- FIXME import { ResourceLabel } from 'teleport/services/agents'; // eslint-disable-next-line no-restricted-imports -- FIXME -import { AppSubKind, PermissionSet } from 'teleport/services/apps'; +import { AppMCP, PermissionSet } from 'teleport/services/apps'; // "mixed" indicates the resource has a mix of health // statuses. This can happen when multiple agents proxy the same resource. @@ -56,6 +56,7 @@ export type UnifiedResourceApp = { requiresRequest?: boolean; subKind?: AppSubKind; permissionSets?: PermissionSet[]; + mcp?: AppMCP; }; export interface UnifiedResourceDatabase { diff --git a/web/packages/shared/services/types.ts b/web/packages/shared/services/types.ts index a9989ffa30dd2..04c608140be79 100644 --- a/web/packages/shared/services/types.ts +++ b/web/packages/shared/services/types.ts @@ -56,3 +56,9 @@ export type AuthProvider = { /** Values are taken from https://github.com/gravitational/teleport/blob/0460786b4c3afced1350dd9362ce761806e1c99d/api/types/constants.go#L140-L154 */ export type NodeSubKind = 'teleport' | 'openssh' | 'openssh-ec2-ice'; + +/** AppSubKind defines names of SubKind for App resource. */ +export enum AppSubKind { + AwsIcAccount = 'aws_ic_account', + MCP = 'mcp', +} diff --git a/web/packages/teleport/src/Apps/MCPAppConnectDialog.story.tsx b/web/packages/teleport/src/Apps/MCPAppConnectDialog.story.tsx new file mode 100644 index 0000000000000..a4ced15dc303c --- /dev/null +++ b/web/packages/teleport/src/Apps/MCPAppConnectDialog.story.tsx @@ -0,0 +1,39 @@ +/** + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { MemoryRouter } from 'react-router'; + +import { ContextProvider } from 'teleport'; +import { mcpApp } from 'teleport/Apps/fixtures'; +import { MCPAppConnectDialog as Component } from 'teleport/Apps/MCPAppConnectDialog'; +import { createTeleportContext } from 'teleport/mocks/contexts'; + +export default { + title: 'Teleport/Apps/MCPAppConnectDialog', +}; + +export function MCPAppConnectDialog() { + const ctx = createTeleportContext(); + return ( + + + {}} /> + + + ); +} diff --git a/web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx b/web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx new file mode 100644 index 0000000000000..30e7c58fed842 --- /dev/null +++ b/web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx @@ -0,0 +1,97 @@ +/** + * Teleport + * Copyright (C) 2025 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { Box, ButtonSecondary, Stack, Text } from 'design'; +import Dialog, { + DialogContent, + DialogFooter, + DialogHeader, + DialogTitle, +} from 'design/Dialog'; +import { TextSelectCopy } from 'shared/components/TextSelectCopy'; + +import { generateTshLoginCommand } from 'teleport/lib/util'; +import { App } from 'teleport/services/apps'; +import useStickyClusterId from 'teleport/useStickyClusterId'; +import useTeleport from 'teleport/useTeleport'; + +/** + * MCPAppConnectDialog shows tsh instructions for connecting to an MCP app. + */ +export function MCPAppConnectDialog(props: { app: App; onClose: () => void }) { + const { app, onClose } = props; + const ctx = useTeleport(); + const { clusterId } = useStickyClusterId(); + const { username, authType } = ctx.storeUser.state; + const accessRequestId = ctx.storeUser.getAccessRequestId(); + + return ( + ({ + maxWidth: '600px', + width: '100%', + })} + disableEscapeKeyDown={false} + onClose={onClose} + open={true} + > + + Connect to: {app.name} + + + + + + + + Step 1 + + {' - Log in to Teleport'} + + + + + + + + Step 2 + + {' - Print configuration for the MCP server'} + + + + + Restart your AI client to load the updated configuration if + necessary. + + + + + + Close + + + ); +} diff --git a/web/packages/teleport/src/Apps/fixtures/index.ts b/web/packages/teleport/src/Apps/fixtures/index.ts index 1bf4709101c24..c4f3ee27ec89e 100644 --- a/web/packages/teleport/src/Apps/fixtures/index.ts +++ b/web/packages/teleport/src/Apps/fixtures/index.ts @@ -94,6 +94,24 @@ export const tcpApp = makeApp({ clusterId: 'one', }); +export const mcpApp = makeApp({ + name: 'mcp-everything', + subKind: 'mcp', + description: 'Some MCP server', + uri: 'mcp+stdio://', + publicAddr: 'mcp-everything.teleport.example.com', + fqdn: 'mcp-everything.teleport.example.com', + labels: [ + { name: 'env', value: 'dev' }, + { name: 'cluster', value: 'one' }, + ], + mcp: { + command: 'npx', + args: ['-y', '@modelcontextprotocol/server-everything'], + runAsHostUser: 'hostuser', + }, +}); + export const apps = [ { name: 'Jenkins', @@ -259,7 +277,7 @@ export const apps = [ fqdn: 'https://console.aws.amazon.com', }, ].map(makeApp); -apps.push(awsConsoleApp, awsIamIcAccountApp, tcpApp); +apps.push(awsConsoleApp, awsIamIcAccountApp, tcpApp, mcpApp); export const gcpCloudApp = makeApp({ name: 'cloud-app', diff --git a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx index 601c1d4e29a91..4118cac3c8efe 100644 --- a/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx +++ b/web/packages/teleport/src/Audit/EventList/EventTypeCell.tsx @@ -314,6 +314,11 @@ const EventIconMap: Record = { [eventCodes.AUTOUPDATE_AGENT_ROLLOUT_TRIGGER]: Icons.RocketLaunch, [eventCodes.AUTOUPDATE_AGENT_ROLLOUT_FORCE_DONE]: Icons.Checks, [eventCodes.AUTOUPDATE_AGENT_ROLLOUT_ROLLBACK]: Icons.Restore, + [eventCodes.MCP_SESSION_START]: Icons.ModelContextProtocol, + [eventCodes.MCP_SESSION_END]: Icons.ModelContextProtocol, + [eventCodes.MCP_SESSION_REQUEST]: Icons.ModelContextProtocol, + [eventCodes.MCP_SESSION_REQUEST_FAILURE]: Icons.Warning, + [eventCodes.MCP_SESSION_NOTIFICATION]: Icons.ModelContextProtocol, }; export default function renderTypeCell(event: Event) { diff --git a/web/packages/teleport/src/Audit/fixtures/index.ts b/web/packages/teleport/src/Audit/fixtures/index.ts index 57ce19fba3e44..6034845c271b7 100644 --- a/web/packages/teleport/src/Audit/fixtures/index.ts +++ b/web/packages/teleport/src/Audit/fixtures/index.ts @@ -4032,6 +4032,121 @@ export const events = [ groups: ['prod'], success: true, }, + { + code: 'TMCP001I', + ei: 0, + event: 'mcp.session.start', + namespace: 'default', + server_id: 'a0518380-0d53-4188-ac8b-8ddd8103e45b', + sid: '6593cf87-9839-4f18-abf8-c54873aaeb4e', + time: '2025-05-23T11:11:11.111Z', + uid: '80400ed9-644e-4a6e-ab99-b264b34d0f55', + user: 'ai-user', + app_name: 'mcp-everything', + }, + { + code: 'TMCP003I', + ei: 0, + event: 'mcp.session.request', + namespace: 'default', + server_id: 'a0518380-0d53-4188-ac8b-8ddd8103e45b', + sid: '6593cf87-9839-4f18-abf8-c54873aaeb4e', + time: '2025-05-23T11:11:11.222Z', + uid: '80400ed9-644e-4a6e-ab99-b264b34d0f55', + user: 'ai-user', + app_name: 'mcp-everything', + success: true, + message: { + id: 0, + method: 'initialize', + params: { + clientInfo: { + name: 'claude-ai', + version: '0.1.0', + }, + protocolVersion: '2024-11-05', + }, + jsonrpc: '2.0', + }, + }, + { + code: 'TMCP004I', + ei: 0, + event: 'mcp.session.notification', + namespace: 'default', + server_id: 'a0518380-0d53-4188-ac8b-8ddd8103e45b', + sid: '6593cf87-9839-4f18-abf8-c54873aaeb4e', + time: '2025-05-23T11:11:11.333Z', + uid: '80400ed9-644e-4a6e-ab99-b264b34d0f55', + user: 'ai-user', + app_name: 'mcp-everything', + success: true, + message: { + method: 'notifications/initialized', + jsonrpc: '2.0', + }, + }, + { + code: 'TMCP003I', + ei: 0, + event: 'mcp.session.request', + namespace: 'default', + server_id: 'a0518380-0d53-4188-ac8b-8ddd8103e45b', + sid: '6593cf87-9839-4f18-abf8-c54873aaeb4e', + time: '2025-05-23T11:11:11.444Z', + uid: '80400ed9-644e-4a6e-ab99-b264b34d0f55', + user: 'ai-user', + app_name: 'mcp-everything', + success: true, + message: { + id: 2, + method: 'tools/call', + params: { + name: 'get_weather', + arguments: { + location: 'New York', + }, + }, + jsonrpc: '2.0', + }, + }, + { + code: 'TMCP003E', + ei: 0, + event: 'mcp.session.request', + namespace: 'default', + server_id: 'a0518380-0d53-4188-ac8b-8ddd8103e45b', + sid: '6593cf87-9839-4f18-abf8-c54873aaeb4e', + time: '2025-05-23T11:11:11.555Z', + uid: '80400ed9-644e-4a6e-ab99-b264b34d0f55', + user: 'ai-user', + app_name: 'mcp-everything', + success: false, + error: 'access denied', + message: { + id: 2, + method: 'tools/call', + params: { + name: 'write_file', + arguments: { + path: '/etc/passwd', + }, + }, + jsonrpc: '2.0', + }, + }, + { + code: 'TMCP002I', + ei: 0, + event: 'mcp.session.end', + namespace: 'default', + server_id: 'a0518380-0d53-4188-ac8b-8ddd8103e45b', + sid: '6593cf87-9839-4f18-abf8-c54873aaeb4e', + time: '2025-05-23T12:22:22.222Z', + uid: '80400ed9-644e-4a6e-ab99-b264b34d0f55', + user: 'ai-user', + app_name: 'mcp-everything', + }, ].map(makeEvent); // Do not add new events to this array, add it to `events` list. diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.test.tsx b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.test.tsx index 9c4dfdc5c927a..e4872d9da2097 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.test.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.test.tsx @@ -324,6 +324,8 @@ describe('AppAccessSection', () => { screen.getByRole('group', { name: 'GCP Service Accounts' }); const gcpServiceAccountTextBoxes = () => within(gcpServiceAccounts()).getAllByRole('textbox'); + const mcpTools = () => screen.getByRole('group', { name: 'MCP Tools' }); + const mcpToolsTextBoxes = () => within(mcpTools()).getAllByRole('textbox'); test('editing', async () => { const { user, onChange } = setup(); @@ -350,6 +352,11 @@ describe('AppAccessSection', () => { ); await user.click(gcpServiceAccountTextBoxes()[1]); await user.paste('admin@some-project.iam.gserviceaccount.com'); + await user.click( + within(mcpTools()).getByRole('button', { name: 'Add More' }) + ); + await user.click(mcpToolsTextBoxes()[1]); + await user.paste('allow_tools_with_prefix_*'); expect(onChange).toHaveBeenLastCalledWith({ kind: 'app', @@ -366,6 +373,7 @@ describe('AppAccessSection', () => { '{{internal.gcp_service_accounts}}', 'admin@some-project.iam.gserviceaccount.com', ], + mcpTools: ['{{internal.mcp_tools}}', 'allow_tools_with_prefix_*'], hideValidationErrors: true, } as AppAccess); }); diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.tsx b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.tsx index 2b8049c4e73c5..31735c1469701 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/Resources.tsx @@ -575,6 +575,13 @@ export function AppAccessSection({ onChange={accts => onChange?.({ ...value, gcpServiceAccounts: accts })} rule={precomputed(validation.fields.gcpServiceAccounts)} /> + onChange?.({ ...value, mcpTools: mcpTools })} + rule={precomputed(validation.fields.mcpTools)} + /> ); } diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.test.ts b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.test.ts index e0fb2bc520dc6..840c6c5d99c7a 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.test.ts +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.test.ts @@ -23,6 +23,7 @@ import { GitHubPermission, KubernetesResource, Labels, + MCPPermissions, RequireMFAType, ResourceKind, Role, @@ -51,6 +52,7 @@ import { kubernetesVerbOptionsMap, labelsModelToLabels, labelsToModel, + mcpToolsToModel, portForwardingOptionsToModel, requireMFATypeOptionsMap, resourceKindOptionsMap, @@ -226,6 +228,7 @@ describe.each<{ name: string; role: Role; model: RoleEditorModel }>([ 'account1@some-project.iam.gserviceaccount.com', 'account2@some-project.iam.gserviceaccount.com', ], + mcpTools: [], hideValidationErrors: false, }, ], @@ -616,6 +619,44 @@ test.each<{ ).toEqual(expected); }); +test.each<{ + name: string; + permissions: MCPPermissions; + expected: ReturnType; +}>([ + { + name: 'empty permissions', + permissions: {}, + expected: { model: [], conversionErrors: [] }, + }, + { + name: 'empty tools', + permissions: { tools: [] }, + expected: { model: [], conversionErrors: [] }, + }, + { + name: 'some tools', + permissions: { tools: ['foo1', 'foo2'] }, + expected: { + model: ['foo1', 'foo2'], + conversionErrors: [], + }, + }, + { + name: 'invalid fields', + permissions: { tools: ['foo'], unknownField: 123 } as MCPPermissions, + expected: { + model: ['foo'], + conversionErrors: simpleConversionErrors( + ConversionErrorType.UnsupportedField, + ['spec.allow.mcp.unknownField'] + ), + }, + }, +])('mcpToolsToModel(): $name', ({ permissions, expected }) => { + expect(mcpToolsToModel(permissions, 'spec.allow.mcp')).toEqual(expected); +}); + describe('roleToRoleEditorModel', () => { const minRole = minimalRole(); const minRoleModel = minimalRoleModel(); @@ -1082,6 +1123,7 @@ describe('roleToRoleEditorModel', () => { awsRoleARNs: [], azureIdentities: [], gcpServiceAccounts: [], + mcpTools: [], hideValidationErrors: false, }, ], diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.ts b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.ts index 8910508ba23d2..254f8d4929b3c 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.ts +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/standardmodel.ts @@ -23,6 +23,7 @@ import { Label as UILabel } from 'teleport/components/LabelsInput/LabelsInput'; import { KubernetesResource, Labels, + MCPPermissions, Role, RoleConditions, } from 'teleport/services/resources'; @@ -399,6 +400,7 @@ export type AppAccess = ResourceAccessBase<'app'> & { awsRoleARNs: string[]; azureIdentities: string[]; gcpServiceAccounts: string[]; + mcpTools: string[]; }; export type DatabaseAccess = ResourceAccessBase<'db'> & { @@ -632,6 +634,7 @@ export function newResourceAccess( awsRoleARNs: ['{{internal.aws_role_arns}}'], azureIdentities: ['{{internal.azure_identities}}'], gcpServiceAccounts: ['{{internal.gcp_service_accounts}}'], + mcpTools: ['{{internal.mcp_tools}}'], hideValidationErrors: true, }; case 'db': @@ -816,6 +819,9 @@ function roleConditionsToModel( // Admin rules rules, + // MCP permissions + mcp, + ...unsupported } = conditions; conversionErrors.push( @@ -871,12 +877,16 @@ function roleConditionsToModel( const awsRoleARNsModel = aws_role_arns ?? []; const azureIdentitiesModel = azure_identities ?? []; const gcpServiceAccountsModel = gcp_service_accounts ?? []; + const { model: mcpToolsModel, conversionErrors: mcpToolsConversionErrors } = + mcpToolsToModel(mcp || {}, `${pathPrefix}.mcp`); + conversionErrors.push(...mcpToolsConversionErrors); if ( someNonEmpty( appLabelsModel, awsRoleARNsModel, azureIdentitiesModel, - gcpServiceAccountsModel + gcpServiceAccountsModel, + mcpToolsModel ) ) { resources.push({ @@ -885,6 +895,7 @@ function roleConditionsToModel( awsRoleARNs: awsRoleARNsModel, azureIdentities: azureIdentitiesModel, gcpServiceAccounts: gcpServiceAccountsModel, + mcpTools: mcpToolsModel, hideValidationErrors: false, }); } @@ -1076,6 +1087,20 @@ function kubernetesResourceToModel( }; } +export function mcpToolsToModel( + mcpPermissions: MCPPermissions, + pathPrefix: string +): { + model: string[]; + conversionErrors: ConversionError[]; +} { + const { tools, ...unsupported } = mcpPermissions; + return { + model: tools || [], + conversionErrors: unsupportedFieldErrorsFromObject(pathPrefix, unsupported), + }; +} + /** * Converts a {@link GitHubPermission} array to a list of organizations. * Technically, there can be more than one `GitHubPermission` object, but we @@ -1526,6 +1551,12 @@ export function roleEditorModelToRole(roleModel: RoleEditorModel): Role { role.spec.allow.aws_role_arns = res.awsRoleARNs; role.spec.allow.azure_identities = res.azureIdentities; role.spec.allow.gcp_service_accounts = res.gcpServiceAccounts; + if (res.mcpTools.length > 0) { + if (role.spec.allow.mcp === undefined) { + role.spec.allow.mcp = {}; + } + role.spec.allow.mcp.tools = res.mcpTools; + } break; case 'db': diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.test.ts b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.test.ts index 0a759e588e1c9..43ddc6cb85010 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.test.ts +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.test.ts @@ -93,6 +93,7 @@ describe('validateRoleEditorModel', () => { awsRoleARNs: ['some-arn'], azureIdentities: ['some-azure-id'], gcpServiceAccounts: ['some-gcp-acct'], + mcpTools: ['some-mcp-tools'], hideValidationErrors: false, }, { @@ -205,6 +206,7 @@ describe('validateRoleEditorModel', () => { awsRoleARNs: [], azureIdentities: [], gcpServiceAccounts: [], + mcpTools: [], hideValidationErrors: false, }, { diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.ts b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.ts index 1e4c20f718a52..e93fb1085755e 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.ts +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor/validation.ts @@ -466,15 +466,17 @@ const validateAppAccess = (a: AppAccess): AppAccessValidationResult => { a.labels.length === 0 && a.awsRoleARNs.length === 0 && a.azureIdentities.length === 0 && - a.gcpServiceAccounts.length === 0 + a.gcpServiceAccounts.length === 0 && + a.mcpTools.length === 0 ) { result.valid = false; result.message = - 'At least one label, AWS role ARN, Azure identity, or GCP service account required'; + 'At least one label, AWS role ARN, Azure identity, GCP service account, or MCP tools required'; result.fields.labels.valid = false; result.fields.awsRoleARNs.valid = false; result.fields.azureIdentities.valid = false; result.fields.gcpServiceAccounts.valid = false; + result.fields.mcpTools.valid = false; } return result; }; @@ -488,6 +490,7 @@ const appAccessValidationRules = { gcpServiceAccounts: arrayOf( noWildcard('Wildcard is not allowed in GCP service accounts') ), + mcpTools: alwaysValid, }; export type AppAccessValidationResult = RuleSetValidationResult< typeof appAccessValidationRules diff --git a/web/packages/teleport/src/UnifiedResources/ResourceActionButton.story.tsx b/web/packages/teleport/src/UnifiedResources/ResourceActionButton.story.tsx index 69060b1ed6e58..56727be5cd706 100644 --- a/web/packages/teleport/src/UnifiedResources/ResourceActionButton.story.tsx +++ b/web/packages/teleport/src/UnifiedResources/ResourceActionButton.story.tsx @@ -26,6 +26,7 @@ import { awsConsoleApp, awsIamIcAccountApp, gcpCloudApp, + mcpApp, } from 'teleport/Apps/fixtures'; import { databases } from 'teleport/Databases/fixtures'; import { desktops } from 'teleport/Desktops/fixtures'; @@ -124,6 +125,11 @@ export function ResourceActionButton() { })} /> + + + MCP app + + diff --git a/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx b/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx index 6898c43c6501e..514bb28f5c6db 100644 --- a/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx +++ b/web/packages/teleport/src/UnifiedResources/ResourceActionButton.tsx @@ -27,8 +27,10 @@ import { MenuLogin, } from 'shared/components/MenuLogin'; import { MenuLoginWithActionMenu } from 'shared/components/MenuLoginWithActionMenu'; +import { AppSubKind } from 'shared/services'; import { AwsRole } from 'shared/services/apps'; +import { MCPAppConnectDialog } from 'teleport/Apps/MCPAppConnectDialog'; import { TcpAppConnectDialog } from 'teleport/Apps/TcpAppConnectDialog'; import cfg from 'teleport/config'; import DbConnectDialog from 'teleport/Databases/ConnectDialog'; @@ -39,7 +41,7 @@ import KubeConnectDialog from 'teleport/Kubes/ConnectDialog'; import { openNewTab } from 'teleport/lib/util'; import { useSamlAppAction } from 'teleport/SamlApplications/useSamlAppActions'; import { UnifiedResource } from 'teleport/services/agents'; -import { App, AppSubKind, SamlAppLaunchUrl } from 'teleport/services/apps'; +import { App, SamlAppLaunchUrl } from 'teleport/services/apps'; import { Database } from 'teleport/services/databases'; import { Desktop } from 'teleport/services/desktops'; import { Kube } from 'teleport/services/kube'; @@ -226,6 +228,9 @@ const AppLaunch = ({ app }: AppLaunchProps) => { ); } + if (subKind === AppSubKind.MCP) { + return ; + } if (isTcp) { return ; } @@ -410,6 +415,28 @@ function TcpAppConnect({ app }: { app: App }) { ); } +/** + * MCPAppConnect is the button on an MCP app resource that opens the MCP connect + * dialog. + */ +function MCPAppConnect({ app }: { app: App }) { + const [open, setOpen] = useState(false); + + return ( + <> + setOpen(true)} + > + Connect + + {open && setOpen(false)} />} + + ); +} + const makeNodeOptions = (clusterId: string, node: Node | undefined) => { const nodeLogins = node?.sshLogins || []; const logins = sortNodeLogins(nodeLogins); diff --git a/web/packages/teleport/src/services/apps/apps.test.ts b/web/packages/teleport/src/services/apps/apps.test.ts index 47f97c05bf5d0..8bd0362f54c9d 100644 --- a/web/packages/teleport/src/services/apps/apps.test.ts +++ b/web/packages/teleport/src/services/apps/apps.test.ts @@ -151,6 +151,35 @@ test('correct formatting of apps fetch response', async () => { integration: '', permissionSets: [], }, + { + kind: 'app', + id: 'cluster-id-mcp-app-mcp-app.example.com', + name: 'mcp-app', + useAnyProxyPublicAddr: false, + description: 'Some MCP app', + uri: 'mcp+stdio://', + publicAddr: 'mcp-app.example.com', + labels: [], + clusterId: 'cluster-id', + fqdn: '', + friendlyName: '', + launchUrl: '', + awsRoles: [], + awsConsole: false, + isCloud: false, + isTcp: false, + addrWithProtocol: 'mcp+stdio://mcp-app.example.com', + userGroups: [], + samlApp: false, + samlAppSsoUrl: '', + integration: '', + permissionSets: [], + mcp: { + command: 'npx', + args: ['-y', '@modelcontextprotocol/server-everything'], + runAsHostUser: 'hostuser', + }, + }, ], startKey: mockResponse.startKey, totalCount: mockResponse.totalCount, @@ -244,6 +273,18 @@ const mockResponse = { useAnyProxyPublicAddr: true, uri: 'http://localhost:3001', }, + { + clusterId: 'cluster-id', + name: 'mcp-app', + publicAddr: 'mcp-app.example.com', + description: 'Some MCP app', + uri: 'mcp+stdio://', + mcp: { + command: 'npx', + args: ['-y', '@modelcontextprotocol/server-everything'], + runAsHostUser: 'hostuser', + }, + }, ], startKey: 'mockKey', totalCount: 100, diff --git a/web/packages/teleport/src/services/apps/makeApps.ts b/web/packages/teleport/src/services/apps/makeApps.ts index c6d1b0bb2b3b4..1baa4fd13de0f 100644 --- a/web/packages/teleport/src/services/apps/makeApps.ts +++ b/web/packages/teleport/src/services/apps/makeApps.ts @@ -16,11 +16,12 @@ * along with this program. If not, see . */ +import { AppSubKind } from 'shared/services'; import { AwsRole } from 'shared/services/apps'; import cfg from 'teleport/config'; -import { App, AppSubKind, PermissionSet } from './types'; +import { App, PermissionSet } from './types'; function getLaunchUrl({ fqdn, @@ -64,6 +65,7 @@ export default function makeApp(json: any): App { samlAppPreset, subKind, samlAppLaunchUrls, + mcp, } = json; const launchUrl = getLaunchUrl({ @@ -80,6 +82,7 @@ export default function makeApp(json: any): App { const isTcp = !!uri && uri.startsWith('tcp://'); const isCloud = !!uri && uri.startsWith('cloud://'); + const isMCPStdio = !!uri && uri.startsWith('mcp+stdio://'); let addrWithProtocol = uri; if (publicAddr) { @@ -87,6 +90,8 @@ export default function makeApp(json: any): App { addrWithProtocol = `cloud://${publicAddr}`; } else if (isTcp) { addrWithProtocol = `tcp://${publicAddr}`; + } else if (isMCPStdio) { + addrWithProtocol = `mcp+stdio://${publicAddr}`; } else if (subKind === AppSubKind.AwsIcAccount) { /** publicAddr for Identity Center account app is a URL with scheme. */ addrWithProtocol = publicAddr; @@ -129,5 +134,6 @@ export default function makeApp(json: any): App { integration, permissionSets, samlAppLaunchUrls, + mcp, }; } diff --git a/web/packages/teleport/src/services/apps/types.ts b/web/packages/teleport/src/services/apps/types.ts index 65c7bf09e6f9d..c97eccee9ff4a 100644 --- a/web/packages/teleport/src/services/apps/types.ts +++ b/web/packages/teleport/src/services/apps/types.ts @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +import { AppSubKind } from 'shared/services'; import { AwsRole } from 'shared/services/apps'; import { ResourceLabel } from 'teleport/services/agents'; @@ -61,10 +62,14 @@ export interface App { */ permissionSets?: PermissionSet[]; /** - * SamlAppLaunchUrl contains service provider specific authentication + * samlAppLaunchUrl contains service provider specific authentication * endpoints where user should be launched to start SAML authentication. */ samlAppLaunchUrls?: SamlAppLaunchUrl[]; + /** + * mcp contains MCP server specific configurations. + */ + mcp?: AppMCP; } export type UserGroupAndDescription = { @@ -73,9 +78,12 @@ export type UserGroupAndDescription = { }; /** AppSubKind defines names of SubKind for App resource. */ -export enum AppSubKind { - AwsIcAccount = 'aws_ic_account', -} +export { + /* + * @deprecated Import AppSubKind from 'shared/services' instead. + */ + AppSubKind, +} from 'shared/services'; /** * PermissionSet defines an AWS IAM Identity Center permission set that @@ -100,3 +108,18 @@ export type SamlAppLaunchUrl = { /* friendly name of the URL. */ friendlyName?: string; }; + +/** + * AppMCP contains MCP server specific configurations. + */ +export type AppMCP = { + /** Command to launch stdio-based MCP servers. */ + command: string; + /** Args to execute with the command. */ + args?: string[]; + /** + * The host user account under which the command will be + * executed. Required for stdio-based MCP servers. + */ + runAsHostUser: string; +}; diff --git a/web/packages/teleport/src/services/audit/makeEvent.ts b/web/packages/teleport/src/services/audit/makeEvent.ts index 90989ed5e4e16..4154c506dc7c9 100644 --- a/web/packages/teleport/src/services/audit/makeEvent.ts +++ b/web/packages/teleport/src/services/audit/makeEvent.ts @@ -2190,6 +2190,49 @@ export const formatters: Formatters = { return `User ${user} rolled back the autoupdate rollout groups ${groups}`; }, }, + [eventCodes.MCP_SESSION_START]: { + type: 'mcp.session.start', + desc: 'MCP Session Started', + format: event => { + const { user, app_name } = event; + return `User [${user}] has connected to MCP server [${app_name}]`; + }, + }, + [eventCodes.MCP_SESSION_END]: { + type: 'mcp.session.end', + desc: 'MCP Session Ended', + format: event => { + const { user, app_name } = event; + return `User [${user}] has disconnected from MCP server [${app_name}]`; + }, + }, + [eventCodes.MCP_SESSION_REQUEST]: { + type: 'mcp.session.request', + desc: 'MCP Session Request', + format: ({ user, app_name, message }) => { + if (message.params?.name) { + return `User [${user}] sent an MCP request [${message.method}] for [${message.params.name}] to MCP server [${app_name}]`; + } + return `User [${user}] sent an MCP request [${message.method}] to MCP server [${app_name}]`; + }, + }, + [eventCodes.MCP_SESSION_REQUEST_FAILURE]: { + type: 'mcp.session.request', + desc: 'MCP Session Request Failure', + format: ({ user, app_name, message }) => { + if (message.params?.name) { + return `User [${user}] was denied access to an MCP request [${message.method}] for [${message.params.name}] to MCP server [${app_name}]`; + } + return `User [${user}] was denied access to an MCP request [${message.method}] to MCP server [${app_name}]`; + }, + }, + [eventCodes.MCP_SESSION_NOTIFICATION]: { + type: 'mcp.session.notification', + desc: 'MCP Session Notification', + format: ({ user, app_name, message }) => { + return `User [${user}] sent an MCP notification [${message.method}] to MCP server [${app_name}]`; + }, + }, }; const unknownFormatter = { diff --git a/web/packages/teleport/src/services/audit/types.ts b/web/packages/teleport/src/services/audit/types.ts index 996238a0680c5..661ab6d4802e0 100644 --- a/web/packages/teleport/src/services/audit/types.ts +++ b/web/packages/teleport/src/services/audit/types.ts @@ -333,6 +333,11 @@ export const eventCodes = { AUTOUPDATE_AGENT_ROLLOUT_TRIGGER: 'AUAR001I', AUTOUPDATE_AGENT_ROLLOUT_FORCE_DONE: 'AUAR002I', AUTOUPDATE_AGENT_ROLLOUT_ROLLBACK: 'AUAR003I', + MCP_SESSION_START: 'TMCP001I', + MCP_SESSION_END: 'TMCP002I', + MCP_SESSION_REQUEST: 'TMCP003I', + MCP_SESSION_REQUEST_FAILURE: 'TMCP003E', + MCP_SESSION_NOTIFICATION: 'TMCP004I', } as const; /** @@ -1926,6 +1931,53 @@ export type RawEvents = { groups: string[]; } >; + [eventCodes.MCP_SESSION_START]: RawEvent< + typeof eventCodes.MCP_SESSION_START, + { + sid: string; + app_name: string; + } + >; + [eventCodes.MCP_SESSION_END]: RawEvent< + typeof eventCodes.MCP_SESSION_END, + { + sid: string; + app_name: string; + } + >; + [eventCodes.MCP_SESSION_REQUEST]: RawEvent< + typeof eventCodes.MCP_SESSION_REQUEST, + { + app_name: string; + message: { + method: string; + params?: { + name?: string; + }; + }; + } + >; + [eventCodes.MCP_SESSION_REQUEST_FAILURE]: RawEvent< + typeof eventCodes.MCP_SESSION_REQUEST_FAILURE, + { + app_name: string; + message: { + method: string; + params?: { + name?: string; + }; + }; + } + >; + [eventCodes.MCP_SESSION_NOTIFICATION]: RawEvent< + typeof eventCodes.MCP_SESSION_NOTIFICATION, + { + app_name: string; + message: { + method: string; + }; + } + >; }; /** diff --git a/web/packages/teleport/src/services/resources/types.ts b/web/packages/teleport/src/services/resources/types.ts index 0546ee0f4ea11..3f639893d4ae2 100644 --- a/web/packages/teleport/src/services/resources/types.ts +++ b/web/packages/teleport/src/services/resources/types.ts @@ -115,6 +115,7 @@ export type RoleConditions = { windows_desktop_logins?: string[]; github_permissions?: GitHubPermission[]; + mcp?: MCPPermissions; rules?: Rule[]; }; @@ -343,6 +344,10 @@ export type GitHubPermission = { orgs?: string[]; }; +export type MCPPermissions = { + tools?: string[]; +}; + /** * Teleport role options in full format, as returned from Teleport API. Note * that its fields follow the snake case convention to match the wire format. diff --git a/web/packages/teleterm/src/services/tshd/app.ts b/web/packages/teleterm/src/services/tshd/app.ts index 18b7690a6acc5..fdd2f65e4a68e 100644 --- a/web/packages/teleterm/src/services/tshd/app.ts +++ b/web/packages/teleterm/src/services/tshd/app.ts @@ -100,12 +100,15 @@ export function getAppAddrWithProtocol(source: App): string { const isTcp = endpointUri && endpointUri.startsWith('tcp://'); const isCloud = endpointUri && endpointUri.startsWith('cloud://'); + const isMCPStdio = endpointUri && endpointUri.startsWith('mcp+stdio://'); let addrWithProtocol = endpointUri; if (publicAddr) { if (isCloud) { addrWithProtocol = `cloud://${publicAddr}`; } else if (isTcp) { addrWithProtocol = `tcp://${publicAddr}`; + } else if (isMCPStdio) { + addrWithProtocol = `mcp+stdio://${publicAddr}`; } else { addrWithProtocol = `https://${publicAddr}`; } diff --git a/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx b/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx index c960b67740985..01bdff77da872 100644 --- a/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx +++ b/web/packages/teleterm/src/ui/DocumentCluster/UnifiedResources.tsx @@ -50,7 +50,7 @@ import { openStatusInfoPanel, } from 'shared/components/UnifiedResources/shared/StatusInfo'; import { Attempt } from 'shared/hooks/useAsync'; -import { NodeSubKind } from 'shared/services'; +import { AppSubKind, NodeSubKind } from 'shared/services'; import { DbProtocol, DbType, @@ -566,6 +566,8 @@ const mapToSharedResource = ( } case 'app': { const { resource: app } = resource; + const addrWithProtocol = getAppAddrWithProtocol(app); + const isMCP = addrWithProtocol.startsWith('mcp+'); return { resource: { @@ -573,15 +575,19 @@ const mapToSharedResource = ( labels: app.labels, name: app.name, id: app.name, - addrWithProtocol: getAppAddrWithProtocol(app), + addrWithProtocol: addrWithProtocol, awsConsole: app.awsConsole, description: app.desc, friendlyName: app.friendlyName, samlApp: app.samlApp, requiresRequest: resource.requiresRequest, + subKind: isMCP ? AppSubKind.MCP : undefined, }, ui: { - ActionButton: , + // TODO(greedy52) decide what to do with MCP servers. + ActionButton: isMCP ? undefined : ( + + ), }, }; }