From a6164a0d9f5c346f602ba9f95220f3c0d5e024dd Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Wed, 4 Jun 2025 18:17:22 -0300 Subject: [PATCH 01/21] Initial PostgreSQL MCP support (#54431) * feat(mcp): initial postgres mcp * test(postgres): fix missing mock function * fix(gomod): go mod tidy all * refactor: code review suggestions * fix(tsh): mcp init missing logger * chore(tsh): missing other route to database field * refactor: use in-memory net listener * test(tsh): add mcp db command test * chore: fix license * refactor(tsh): move logger init * test(mcp): sort slices to avoid flakiness * chore: fix lint * test(mcp): sort the resources before assertion * fix(mcp): update error handler for better message * refactor: code review suggestions * feat: add external error retriever for more accurate error messages * refactor: use the same logger init for mcp purposes * refactor: code review suggestions * refactor(tsh): rename command to `tsh mcp db start` * refactor(mcp): protect database resources with rw mutex * chore: update server godocs * chore: go mod tidy * refactor: update command to take list of databases * chore(mcp): license * chore(tsh): remove unused function * refactor: code review suggestions * refactor(tsh): validate duplicated databases in MCP configuration * refactor(tsh): rename files to mcp_db * feat(mcp): add cluster name to the database resource --- lib/client/db/mcp/errors.go | 87 ++++++++ lib/client/db/mcp/mcp.go | 107 +++++++++ lib/client/db/mcp/server.go | 154 +++++++++++++ lib/client/db/mcp/server_test.go | 176 +++++++++++++++ lib/client/db/postgres/mcp/mcp.go | 259 ++++++++++++++++++++++ lib/client/db/postgres/mcp/mcp_test.go | 234 +++++++++++++++++++ lib/client/local_proxy_middleware.go | 24 +- lib/client/local_proxy_middleware_test.go | 11 + lib/client/mcp/uri.go | 153 +++++++++++++ lib/client/mcp/uri_test.go | 94 ++++++++ lib/utils/cli.go | 19 +- lib/utils/listener/memory.go | 109 +++++++++ lib/utils/listener/memory_test.go | 132 +++++++++++ lib/utils/log/log.go | 4 + tool/tsh/common/logger.go | 5 +- tool/tsh/common/mcp.go | 31 +++ tool/tsh/common/mcp_db.go | 234 +++++++++++++++++++ tool/tsh/common/mcp_db_test.go | 223 +++++++++++++++++++ tool/tsh/common/tsh.go | 13 +- 19 files changed, 2057 insertions(+), 12 deletions(-) create mode 100644 lib/client/db/mcp/errors.go create mode 100644 lib/client/db/mcp/mcp.go create mode 100644 lib/client/db/mcp/server.go create mode 100644 lib/client/db/mcp/server_test.go create mode 100644 lib/client/db/postgres/mcp/mcp.go create mode 100644 lib/client/db/postgres/mcp/mcp_test.go create mode 100644 lib/client/mcp/uri.go create mode 100644 lib/client/mcp/uri_test.go create mode 100644 lib/utils/listener/memory.go create mode 100644 lib/utils/listener/memory_test.go create mode 100644 tool/tsh/common/mcp.go create mode 100644 tool/tsh/common/mcp_db.go create mode 100644 tool/tsh/common/mcp_db_test.go diff --git a/lib/client/db/mcp/errors.go b/lib/client/db/mcp/errors.go new file mode 100644 index 0000000000000..8ab0112e9332a --- /dev/null +++ b/lib/client/db/mcp/errors.go @@ -0,0 +1,87 @@ +// 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" +) + +// ExtenralErrorRetriever returns an external error that might have happened. +// +// MCP servers don't have knowledge of other processes that might fail during +// their execution, such as authentication failures. This provider can be used +// to give them the necessary context to provide more accurate user messages. +type ExternalErrorRetriever interface { + // RetrieveError retrieves the error if any. + RetrieveError() error +} + +// FormatErrorMessage formats the database MCP error messages. +// format. +func FormatErrorMessage(retreiver ExternalErrorRetriever, err error) error { + if retreiver != nil { + err = trace.NewAggregate(retreiver.RetrieveError(), err) + } + + switch { + case errors.Is(err, apiclient.ErrClientCredentialsHaveExpired): + 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..43baf36144747 --- /dev/null +++ b/lib/client/db/mcp/mcp.go @@ -0,0 +1,107 @@ +// 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 + // Addr is the address the MCP server used to create a new database + // connection. + Addr string + // DatabaseUser is the database username used on the connections. + DatabaseUser string + // DatabaseName is the database name used on the connections. + DatabaseName string + // ExternalErrorRetriever used to retrieve any external error that might + // have happened while connecting/communicating with the database. + ExternalErrorRetriever ExternalErrorRetriever + // 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..b26e8bd0eaabe --- /dev/null +++ b/lib/client/db/mcp/server.go @@ -0,0 +1,154 @@ +// 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. +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(nil, err).Error()), nil + } + res = append(res, mcp.EmbeddedResource{Type: "resource", Resource: 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{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().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().String(), + Protocol: db.DB.GetProtocol(), + ClusterName: db.ClusterName, + } +} + +func encodeDatabaseResource(db *Database) (mcp.ResourceContents, error) { + resource := buildDatabaseResource(db) + out, err := yaml.Marshal(resource) + if err != nil { + return nil, trace.Wrap(err) + } + + return mcp.TextResourceContents{ + URI: resource.URI, + MIMEType: databaseResourceMIMEType, + Text: 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..007067d3507ea --- /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().String(), b.ResourceURI().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.EmbeddedResource{}, c) + require.IsType(t, mcp.TextResourceContents{}, c.(mcp.EmbeddedResource).Resource) + } + + // 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.EmbeddedResource).Resource.(mcp.TextResourceContents) + resourceB := b.(mcp.EmbeddedResource).Resource.(mcp.TextResourceContents) + return strings.Compare(resourceA.Text, resourceB.Text) + }) + + for i, c := range res.Content { + content := c.(mcp.EmbeddedResource) + assertDatabaseResource(t, databases[i], content.Resource) + } + }) +} + +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", + Addr: "localhost:5555", + } +} + +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..6a6b8a19dc10b --- /dev/null +++ b/lib/client/db/postgres/mcp/mcp.go @@ -0,0 +1,259 @@ +// 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().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, nil, trace.Wrap(err)) + } + + sql, err := request.RequireString(queryToolQueryParam) + if err != nil { + return s.wrapErrorResult(ctx, nil, trace.Wrap(err)) + } + + db, err := s.getDatabase(uri) + if err != nil { + return s.wrapErrorResult(ctx, nil, 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, db.ExternalErrorRetriever, err) + } + + // Returned rows are being closed by this function. + result, err := buildQueryResult(rows) + if err != nil { + return s.wrapErrorResult(ctx, db.ExternalErrorRetriever, err) + } + + return mcp.NewToolResultText(result), nil +} + +func (s *Server) wrapErrorResult(ctx context.Context, externalRetriever dbmcp.ExternalErrorRetriever, toolErr error) (*mcp.CallToolResult, error) { + s.logger.ErrorContext(ctx, "error while querying database", "error", toolErr) + out, err := json.Marshal(RunQueryResult{ErrorMessage: dbmcp.FormatErrorMessage(externalRetriever, 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) { + config, err := pgxpool.ParseConfig("postgres://" + db.Addr) + 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..efdf69f5804e6 --- /dev/null +++ b/lib/client/db/postgres/mcp/mcp_test.go @@ -0,0 +1,234 @@ +// 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" + "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).String() + + for name, tc := range map[string]struct { + databaseURI string + databases []*dbmcp.Database + externalErrorRetriever dbmcp.ExternalErrorRetriever + 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", + Addr: listener.Addr().String(), + 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", + Addr: listener.Addr().String(), + ExternalErrorRetriever: &mockErrorRetriever{err: client.ErrClientCredentialsHaveExpired}, + 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.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() {} + +type mockErrorRetriever struct { + err error +} + +func (mr *mockErrorRetriever) RetrieveError() error { + return mr.err +} diff --git a/lib/client/local_proxy_middleware.go b/lib/client/local_proxy_middleware.go index 1f6f7bf9622c1..9f4fd19670d67 100644 --- a/lib/client/local_proxy_middleware.go +++ b/lib/client/local_proxy_middleware.go @@ -52,6 +52,9 @@ type CertChecker struct { cert tls.Certificate certMu sync.Mutex + + err error + errMu sync.Mutex } var _ alpnproxy.LocalProxyMiddleware = (*CertChecker)(nil) @@ -142,15 +145,19 @@ 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() + defer func() { + c.setError(err) + }() + if err := c.checkCert(); err == nil { 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) } @@ -170,6 +177,13 @@ func (c *CertChecker) GetOrIssueCert(ctx context.Context) (tls.Certificate, erro return c.cert, nil } +// RetrieveError retrieves the happened on while retrieving certificates. +func (c *CertChecker) RetrieveError() error { + c.errMu.Lock() + defer c.errMu.Unlock() + return c.err +} + func (c *CertChecker) checkCert() error { leaf, err := utils.TLSCertLeaf(c.cert) if err != nil { @@ -184,6 +198,12 @@ func (c *CertChecker) checkCert() error { return trace.Wrap(c.certIssuer.CheckCert(leaf)) } +func (c *CertChecker) setError(err error) { + c.errMu.Lock() + defer c.errMu.Unlock() + c.err = err +} + // CertIssuer checks and issues certs. type CertIssuer interface { // CheckCert checks that an existing certificate is valid. diff --git a/lib/client/local_proxy_middleware_test.go b/lib/client/local_proxy_middleware_test.go index cfb79e335601e..48d99c859c39d 100644 --- a/lib/client/local_proxy_middleware_test.go +++ b/lib/client/local_proxy_middleware_test.go @@ -44,10 +44,12 @@ func TestCertChecker(t *testing.T) { // certChecker should issue a new cert on first request. cert, err := certChecker.GetOrIssueCert(ctx) require.NoError(t, err) + require.NoError(t, certChecker.RetrieveError()) // subsequent calls should return the same cert. sameCert, err := certChecker.GetOrIssueCert(ctx) require.NoError(t, err) + require.NoError(t, certChecker.RetrieveError()) require.Equal(t, cert, sameCert) // If the current cert expires it should be reissued. @@ -56,6 +58,7 @@ func TestCertChecker(t *testing.T) { cert, err = certChecker.GetOrIssueCert(ctx) require.NoError(t, err) + require.NoError(t, certChecker.RetrieveError()) require.NotEqual(t, cert, expiredCert) // If the current cert fails certIssuer checks, a new one should be issued. @@ -64,12 +67,20 @@ func TestCertChecker(t *testing.T) { cert, err = certChecker.GetOrIssueCert(ctx) require.NoError(t, err) + require.NoError(t, certChecker.RetrieveError()) require.NotEqual(t, cert, badCert) // If issuing a new cert fails, an error is returned. 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) + require.ErrorIs(t, certChecker.RetrieveError(), err, "expected retrieve error to be the same get error but got: %v", certChecker.RetrieveError()) + + // If the problem is solved, the error is clean up. + certIssuer.issueErr = nil + _, err = certChecker.GetOrIssueCert(ctx) + require.NoError(t, err) + require.NoError(t, certChecker.RetrieveError()) } func TestLocalCertGenerator(t *testing.T) { diff --git a/lib/client/mcp/uri.go b/lib/client/mcp/uri.go new file mode 100644 index 0000000000000..a932a67c776ec --- /dev/null +++ b/lib/client/mcp/uri.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 ( + "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 +} + +// NewDatabaseResourceURI creates a new database resource URI. +func NewDatabaseResourceURI(cluster, databaseName string) ResourceURI { + pathWithHost, _ := databaseURITemplate.Build(urlpath.Match{ + Params: map[string]string{ + "cluster": cluster, + "dbName": databaseName, + }, + }) + + return ResourceURI{ + url: url.URL{ + Scheme: resourceScheme, + Path: strings.TrimPrefix(pathWithHost, "/"), + }, + } +} + +// 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 (excluding the +// query params). +func (u ResourceURI) String() string { + c := u.url + c.RawQuery = "" + return c.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..30cdc64a2a357 --- /dev/null +++ b/lib/client/mcp/uri_test.go @@ -0,0 +1,94 @@ +// 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": { + uri: NewDatabaseResourceURI("default", "db").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()) + }) + } +} diff --git a/lib/utils/cli.go b/lib/utils/cli.go index a025a301a350b..6a8ca6067ead6 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/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/tool/tsh/common/logger.go b/tool/tsh/common/logger.go index df3e97595d259..c3450a5acc51f 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 { diff --git a/tool/tsh/common/mcp.go b/tool/tsh/common/mcp.go new file mode 100644 index 0000000000000..60f08d445233d --- /dev/null +++ b/tool/tsh/common/mcp.go @@ -0,0 +1,31 @@ +// 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 "github.com/alecthomas/kingpin/v2" + +type mcpCommands struct { + dbStart *mcpDBStartCommand +} + +func newMCPCommands(app *kingpin.Application) *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), + } +} diff --git a/tool/tsh/common/mcp_db.go b/tool/tsh/common/mcp_db.go new file mode 100644 index 0000000000000..699ae979c3ca5 --- /dev/null +++ b/tool/tsh/common/mcp_db.go @@ -0,0 +1,234 @@ +// 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" + "log/slog" + + "github.com/alecthomas/kingpin/v2" + "github.com/gravitational/trace" + + "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/defaults" + "github.com/gravitational/teleport/lib/srv/alpnproxy" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/listener" +) + +// mcpDBStartCommand implements `tsh mcp db start` command. +type mcpDBStartCommand struct { + *kingpin.CmdClause + + databaseURIs []string +} + +func newMCPDBCommand(parent *kingpin.CmdClause) *mcpDBStartCommand { + cmd := &mcpDBStartCommand{ + CmdClause: parent.Command("start", "Start a local MCP server for database access").Hidden(), + } + + 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(cf *CLIConf) error { + logger, err := initLogger(cf, utils.LoggingForMCP, parseLoggingOptsFromEnvAndArgv(cf)) + if err != nil { + return trace.Wrap(err) + } + + registry := defaultDBMCPRegistry + if cf.databaseMCPRegistryOverride != nil { + registry = cf.databaseMCPRegistryOverride + } + + tc, err := makeClient(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.String()]; ok { + return trace.BadParameter("Database %q was configured twice. MCP servers only support serving a database service only once.", uri.String()) + } + + configuredDatabases[uri.String()] = struct{}{} + uris[i] = uri + } + + server := dbmcp.NewRootServer(logger) + allDatabases, closeLocalProxies, err := c.prepareDatabases(cf, tc, registry, uris, logger, server) + if err != nil { + return trace.Wrap(err) + } + defer closeLocalProxies() + + for protocol, newServerFunc := range registry { + databases := allDatabases[protocol] + if len(databases) == 0 { + continue + } + + srv, err := newServerFunc(cf.Context, &dbmcp.NewServerConfig{ + Logger: logger, + RootServer: server, + Databases: databases, + }) + if err != nil { + return trace.Wrap(err) + } + defer srv.Close(cf.Context) + } + + return trace.Wrap(server.ServeStdio(cf.Context, cf.Stdin(), cf.Stdout())) +} + +// closeLocalProxyFunc function used to close local proxy listeners. +type closeLocalProxyFunc func() error + +// 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, closeLocalProxyFunc, error) { + var ( + ctx = cf.Context + dbsPerProtocol = make(map[string][]*dbmcp.Database) + closeFuncs []closeLocalProxyFunc + ) + + 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 + } + + route.Protocol = db.GetProtocol() + cc := client.NewDBCertChecker(tc, route, nil, client.WithTTL(tc.KeyTTL)) + // This avoids having the middleware to refresh the certificate if there + // is a certificate available on disk. + cert, err := loadDBCertificate(tc, route.ServiceName) + if err == nil { + cc.SetCert(cert) + } + + listener := listener.NewInMemoryListener() + lp, err := alpnproxy.NewLocalProxy( + makeBasicLocalProxyConfig(ctx, tc, listener, tc.InsecureSkipVerify), + alpnproxy.WithDatabaseProtocol(route.Protocol), + alpnproxy.WithMiddleware(cc), + alpnproxy.WithClusterCAsIfConnUpgrade(ctx, tc.RootClusterCACertPool), + ) + if err != nil { + _ = listener.Close() + logger.ErrorContext(ctx, "failed to start local proxy for database, skipping it", "database", db.GetName(), "error", err) + continue + } + go func() { + defer lp.Close() + if err = lp.Start(ctx); err != nil { + logger.WarnContext(ctx, "failed to start local ALPN proxy", "error", err) + } + }() + + mcpDB := &dbmcp.Database{ + DB: db, + ClusterName: uri.GetClusterName(), + DatabaseUser: dbUser, + DatabaseName: dbName, + Addr: listener.Addr().String(), + ExternalErrorRetriever: cc, + // Since we're using in-memory listener we don't need to resolve the + // address. + LookupFunc: func(ctx context.Context, host string) (addrs []string, err error) { + return []string{listener.Addr().String()}, nil + }, + DialContextFunc: listener.DialContext, + } + dbsPerProtocol[db.GetProtocol()] = append(dbsPerProtocol[db.GetProtocol()], mcpDB) + server.RegisterDatabase(mcpDB) + closeFuncs = append(closeFuncs, listener.Close) + } + + return dbsPerProtocol, func() error { + var errs []error + for _, closeFunc := range closeFuncs { + errs = append(errs, closeFunc()) + } + + return trace.NewAggregate(errs...) + }, nil +} + +var ( + // defaultDBMCPRegistry is the default database access MCP servers registry. + defaultDBMCPRegistry = map[string]dbmcp.NewServerFunc{ + defaults.ProtocolPostgres: pgmcp.NewServer, + } +) diff --git a/tool/tsh/common/mcp_db_test.go b/tool/tsh/common/mcp_db_test.go new file mode 100644 index 0000000000000..123657d212841 --- /dev/null +++ b/tool/tsh/common/mcp_db_test.go @@ -0,0 +1,223 @@ +// 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" + "io" + "testing" + "time" + + 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/types" + dbmcp "github.com/gravitational/teleport/lib/client/db/mcp" + "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) + }) +} + +// testDatabaseMCP is a noop database MCP server. +type testDatabaseMCP struct{} + +func (s *testDatabaseMCP) Close(_ context.Context) error { return nil } diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index 56d680920562c..050714b8a884f 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -79,6 +79,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" @@ -629,6 +630,10 @@ type CLIConf struct { // forkKillFd is the file descriptor for the child process to check the // parent's state when re-execing. forkKillFd uint64 + + // databaseMCPRegistryOverride overrides database access MCP servers + // registry. used in tests. + databaseMCPRegistryOverride dbmcp.Registry } func (c *CLIConf) isForkAuthChild() bool { @@ -800,7 +805,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) } @@ -1360,6 +1365,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { gitCmd := newGitCommands(app) pivCmd := newPIVCommands(app) + mcpCmd := newMCPCommands(app) + if runtime.GOOS == constants.WindowsOS { bench.Hidden() } @@ -1477,7 +1484,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) } @@ -1792,6 +1799,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = gitCmd.clone.run(&cf) case pivCmd.agent.FullCommand(): err = pivCmd.agent.run(&cf) + case mcpCmd.dbStart.FullCommand(): + err = mcpCmd.dbStart.run(&cf) default: // Handle commands that might not be available. switch { From 85926101a74158aa0bbc1a6a73c8a49bc0bcb872 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 5 Jun 2025 22:25:19 -0300 Subject: [PATCH 02/21] fix(tsh): update InitLogger return type (#55479) --- tool/tsh/common/vnet_daemon_darwin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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") } From b837ad7e2fdd4144f9cabd3a3818e4b5d568aeaa Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 29 May 2025 12:17:06 -0400 Subject: [PATCH 03/21] MCP access part 1: update app definition and config (#54706) * MCP access part 1: update app definition and config * address feedback * make -C integrations/operator crd --- api/proto/teleport/legacy/types/types.proto | 13 + api/types/app.go | 68 +- api/types/app_test.go | 78 + api/types/constants.go | 13 + api/types/derived.gen.go | 120 +- api/types/types.pb.go | 5784 +++++++++-------- .../resources-teleport-dev-appsv3.mdx | 129 + .../terraform-provider/data-sources/app.mdx | 10 + .../terraform-provider/resources/app.mdx | 10 + .../resources.teleport.dev_appsv3.yaml | 353 + .../bases/resources.teleport.dev_appsv3.yaml | 353 + .../terraform/tfschema/types_terraform.go | 229 + lib/config/configuration.go | 8 + lib/config/configuration_test.go | 18 + lib/config/fileconf.go | 14 + lib/service/service.go | 1 + lib/service/servicecfg/app.go | 10 +- 17 files changed, 4425 insertions(+), 2786 deletions(-) create mode 100644 docs/pages/reference/operator-resources/resources-teleport-dev-appsv3.mdx create mode 100644 examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_appsv3.yaml create mode 100644 integrations/operator/config/crd/bases/resources.teleport.dev_appsv3.yaml diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 7d9653d9f07ef..1f5f9a628c11c 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. diff --git a/api/types/app.go b/api/types/app.go index 790c43c4a4691..146f9de88b756 100644 --- a/api/types/app.go +++ b/api/types/app.go @@ -70,6 +70,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 +103,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,10 +290,20 @@ 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() { @@ -400,10 +414,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 +471,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 +511,28 @@ 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 { + 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,6 +558,11 @@ 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) { @@ -596,3 +648,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..c9d5e3da25d20 100644 --- a/api/types/app_test.go +++ b/api/types/app_test.go @@ -603,6 +603,60 @@ 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, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -658,3 +712,27 @@ 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)) + }) + } +} diff --git a/api/types/constants.go b/api/types/constants.go index 4b71576ea6806..d3c469b68dce8 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" @@ -896,6 +904,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. 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/types.pb.go b/api/types/types.pb.go index 0c25b0e2509cb..fc983d7f96464 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{273, 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{273, 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{362, 0} + return fileDescriptor_9198ee693835762e, []int{363, 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{363, 0} + return fileDescriptor_9198ee693835762e, []int{364, 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) @@ -5414,7 +5463,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) @@ -5465,7 +5514,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) @@ -5517,7 +5566,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) @@ -5564,7 +5613,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) @@ -5608,7 +5657,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) @@ -5652,7 +5701,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) @@ -5698,7 +5747,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) @@ -5742,7 +5791,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) @@ -5791,7 +5840,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) @@ -5848,7 +5897,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) @@ -5913,7 +5962,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) @@ -5965,7 +6014,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) @@ -6023,7 +6072,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) @@ -6067,7 +6116,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) @@ -6118,7 +6167,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) @@ -6170,7 +6219,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) @@ -6236,7 +6285,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) @@ -6304,7 +6353,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) @@ -6348,7 +6397,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) @@ -6423,7 +6472,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) @@ -6472,7 +6521,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) @@ -6515,7 +6564,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) @@ -6564,7 +6613,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) @@ -6610,7 +6659,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) @@ -6660,7 +6709,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) @@ -6730,7 +6779,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) @@ -6781,7 +6830,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) @@ -6860,7 +6909,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) @@ -6904,7 +6953,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) @@ -6989,7 +7038,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) @@ -7030,7 +7079,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) @@ -7081,7 +7130,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) @@ -7127,7 +7176,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) @@ -7177,7 +7226,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) @@ -7276,7 +7325,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) @@ -7327,7 +7376,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) @@ -7378,7 +7427,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) @@ -7446,7 +7495,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) @@ -7517,7 +7566,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) @@ -7567,7 +7616,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) @@ -7614,7 +7663,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) @@ -7664,7 +7713,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) @@ -7704,7 +7753,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) @@ -7752,7 +7801,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) @@ -7799,7 +7848,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) @@ -7847,7 +7896,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) @@ -7892,7 +7941,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) @@ -7941,7 +7990,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) @@ -7993,7 +8042,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) @@ -8038,7 +8087,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) @@ -8083,7 +8132,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) @@ -8144,7 +8193,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) @@ -8189,7 +8238,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) @@ -8232,7 +8281,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) @@ -8275,7 +8324,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) @@ -8382,7 +8431,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) @@ -8439,7 +8488,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) @@ -8495,7 +8544,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) @@ -8553,7 +8602,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) @@ -8599,7 +8648,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) @@ -8652,7 +8701,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) @@ -8701,7 +8750,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) @@ -8744,7 +8793,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) @@ -8786,7 +8835,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) @@ -8833,7 +8882,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) @@ -8884,7 +8933,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) @@ -8928,7 +8977,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) @@ -8978,7 +9027,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) @@ -9025,7 +9074,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) @@ -9066,7 +9115,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) @@ -9107,7 +9156,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) @@ -9151,7 +9200,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) @@ -9283,7 +9332,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) @@ -9329,7 +9378,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) @@ -9381,7 +9430,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) @@ -9526,7 +9575,7 @@ func (m *RoleConditions) Reset() { *m = RoleConditions{} } func (m *RoleConditions) String() string { return proto.CompactTextString(m) } func (*RoleConditions) ProtoMessage() {} func (*RoleConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{138} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *RoleConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9569,7 +9618,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) @@ -9610,7 +9659,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) @@ -9686,7 +9735,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{142} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9730,7 +9779,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{143} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9783,7 +9832,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{144} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9836,7 +9885,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{145} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9884,7 +9933,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{146} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9960,7 +10009,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{147} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10006,7 +10055,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{148} } func (m *AccessRequestConditionsReason) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10059,7 +10108,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{149} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10101,7 +10150,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{150} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10144,7 +10193,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{151} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10190,7 +10239,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{152} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10236,7 +10285,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{153} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10285,7 +10334,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{154} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10333,7 +10382,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{155} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10375,7 +10424,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{156} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10417,7 +10466,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{157} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10468,7 +10517,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{158} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10517,7 +10566,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{159} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10591,7 +10640,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{160} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10641,7 +10690,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{161} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10689,7 +10738,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{162} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10734,7 +10783,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{163} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10783,7 +10832,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{164} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10840,7 +10889,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{165} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10950,7 +10999,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{166} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10996,7 +11045,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{167} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11078,7 +11127,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{168} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11124,7 +11173,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{169} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11167,7 +11216,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{170} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11213,7 +11262,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{171} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11255,7 +11304,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{172} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11305,7 +11354,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{173} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11352,7 +11401,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{174} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11401,7 +11450,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{175} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11449,7 +11498,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{176} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11497,7 +11546,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{177} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11548,7 +11597,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{178} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11596,7 +11645,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{179} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11642,7 +11691,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{180} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11691,7 +11740,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{181} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11733,7 +11782,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{182} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11782,7 +11831,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{183} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11867,7 +11916,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{184} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11912,7 +11961,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{185} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11954,7 +12003,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{186} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12025,7 +12074,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{187} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12074,7 +12123,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{188} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12121,7 +12170,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{189} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12172,7 +12221,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{190} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12221,7 +12270,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{191} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12265,7 +12314,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{192} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12315,7 +12364,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{193} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12364,7 +12413,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{194} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12415,7 +12464,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{195} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12463,7 +12512,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{196} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12509,7 +12558,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{197} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12555,7 +12604,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{198} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12597,7 +12646,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{199} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12646,7 +12695,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{200} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12698,7 +12747,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{201} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12750,7 +12799,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{202} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12794,7 +12843,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{203} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12838,7 +12887,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{204} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12882,7 +12931,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{205} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12926,7 +12975,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{206} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12970,7 +13019,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{207} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13012,7 +13061,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{208} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13061,7 +13110,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{209} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13108,7 +13157,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{210} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13152,7 +13201,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{211} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13194,7 +13243,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{212} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13245,7 +13294,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{213} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13287,7 +13336,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{214} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13377,7 +13426,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{215} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13419,7 +13468,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{216} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13464,7 +13513,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{217} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13521,7 +13570,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{218} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13616,7 +13665,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{219} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13667,7 +13716,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{220} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13709,7 +13758,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{221} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13799,7 +13848,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{222} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13858,7 +13907,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{223} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13951,7 +14000,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{224} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13997,7 +14046,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{225} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14042,7 +14091,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{226} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14093,7 +14142,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{227} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14135,7 +14184,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{228} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14198,7 +14247,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{229} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14287,7 +14336,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{230} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14331,7 +14380,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{231} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14387,7 +14436,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{232} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14472,7 +14521,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{233} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14516,7 +14565,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{234} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14567,7 +14616,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{235} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14619,7 +14668,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{236} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14665,7 +14714,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{237} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14715,7 +14764,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{238} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14757,7 +14806,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{239} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14813,7 +14862,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{240} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14867,7 +14916,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{241} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14917,7 +14966,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{242} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14974,7 +15023,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{243} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15018,7 +15067,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{244} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15061,7 +15110,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{245} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15114,7 +15163,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{246} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15158,7 +15207,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{247} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15206,7 +15255,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{248} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15250,7 +15299,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{249} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15294,7 +15343,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{250} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15347,7 +15396,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{251} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15391,7 +15440,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{252} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15442,7 +15491,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{253} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15483,7 +15532,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{254} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15570,7 +15619,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{255} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15624,7 +15673,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{256} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15669,7 +15718,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{257} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15713,7 +15762,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{258} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15753,7 +15802,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{259} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15799,7 +15848,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{260} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15843,7 +15892,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{261} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15941,7 +15990,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{262} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15988,7 +16037,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{263} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16036,7 +16085,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{264} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16080,7 +16129,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{265} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16126,7 +16175,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{266} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16177,7 +16226,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{267} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16219,7 +16268,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{268} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16261,7 +16310,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{269} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16305,7 +16354,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{270} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16351,7 +16400,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{271} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16401,7 +16450,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{272} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16447,7 +16496,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{273} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16490,7 +16539,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{274} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16534,7 +16583,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{275} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16576,7 +16625,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{276} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16620,7 +16669,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{277} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16662,7 +16711,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{278} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16708,7 +16757,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{279} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16761,7 +16810,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{280} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16811,7 +16860,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{281} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16863,7 +16912,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{282} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16921,7 +16970,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{283} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16974,7 +17023,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{284} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17043,7 +17092,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{285} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17347,7 +17396,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{286} } func (m *PluginGithubSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17387,7 +17436,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{287} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17428,7 +17477,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{288} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17475,7 +17524,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{289} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17523,7 +17572,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{290} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17569,7 +17618,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{291} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17615,7 +17664,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{292} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17655,7 +17704,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{293} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17706,7 +17755,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{294} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17748,7 +17797,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{295} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17800,7 +17849,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{296} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17847,7 +17896,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{297} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17948,7 +17997,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{298} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17989,7 +18038,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{299} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18033,7 +18082,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{300} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18078,7 +18127,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{301} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18132,7 +18181,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{302} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18177,7 +18226,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{303} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18223,7 +18272,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{304} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18269,7 +18318,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{305} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18313,7 +18362,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{306} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18401,7 +18450,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{307} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18446,7 +18495,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{308} } func (m *AWSICCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18536,7 +18585,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{309} } func (m *AWSICCredentialSourceSystem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18580,7 +18629,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{310} } func (m *AWSICCredentialSourceOIDC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18636,7 +18685,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{311} } func (m *AWSICResourceFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18759,7 +18808,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{312} } func (m *AWSICUserSyncFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18806,7 +18855,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{313} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18848,7 +18897,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{314} } func (m *PluginAWSICStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18893,7 +18942,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{315} } func (m *AWSICGroupImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18944,7 +18993,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{316} } func (m *PluginEmailSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19032,7 +19081,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{317} } func (m *MailgunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19079,7 +19128,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{318} } func (m *SMTPSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19129,7 +19178,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{319} } func (m *PluginMSTeamsSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19176,7 +19225,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{320} } func (m *PluginNetIQSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19221,7 +19270,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{321} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19321,7 +19370,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{322} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19364,7 +19413,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{323} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19424,7 +19473,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{324} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19553,7 +19602,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{325} } func (m *PluginNetIQStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19599,7 +19648,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{326} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19643,7 +19692,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{327} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19697,7 +19746,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{328} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19750,7 +19799,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{329} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19807,7 +19856,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{330} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19861,7 +19910,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{331} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19904,7 +19953,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{332} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19966,7 +20015,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{333} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20014,7 +20063,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{333} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20125,7 +20174,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{334} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20166,7 +20215,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{335} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20208,7 +20257,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{336} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20250,7 +20299,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{337} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20293,7 +20342,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{338} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20341,7 +20390,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{339} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20468,7 +20517,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{340} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20514,7 +20563,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{341} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20562,7 +20611,7 @@ func (m *PluginStaticCredentialsSSHCertAuthorities) String() string { } func (*PluginStaticCredentialsSSHCertAuthorities) ProtoMessage() {} func (*PluginStaticCredentialsSSHCertAuthorities) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{342} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20605,7 +20654,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{343} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20676,7 +20725,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{344} + return fileDescriptor_9198ee693835762e, []int{345} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20723,7 +20772,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{345} + return fileDescriptor_9198ee693835762e, []int{346} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20765,7 +20814,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{346} + return fileDescriptor_9198ee693835762e, []int{347} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20807,7 +20856,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{347} + return fileDescriptor_9198ee693835762e, []int{348} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20857,7 +20906,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{348} + return fileDescriptor_9198ee693835762e, []int{349} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20899,7 +20948,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{349} + return fileDescriptor_9198ee693835762e, []int{350} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20945,7 +20994,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{350} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20987,7 +21036,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{351} + return fileDescriptor_9198ee693835762e, []int{352} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21033,7 +21082,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{352} + return fileDescriptor_9198ee693835762e, []int{353} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21080,7 +21129,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{353} + return fileDescriptor_9198ee693835762e, []int{354} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21123,7 +21172,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{354} + return fileDescriptor_9198ee693835762e, []int{355} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21166,7 +21215,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{355} + return fileDescriptor_9198ee693835762e, []int{356} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21208,7 +21257,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{356} + return fileDescriptor_9198ee693835762e, []int{357} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21252,7 +21301,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{357} + return fileDescriptor_9198ee693835762e, []int{358} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21296,7 +21345,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{358} + return fileDescriptor_9198ee693835762e, []int{359} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21339,7 +21388,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{359} + return fileDescriptor_9198ee693835762e, []int{360} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21387,7 +21436,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{360} + return fileDescriptor_9198ee693835762e, []int{361} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21430,7 +21479,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{361} + return fileDescriptor_9198ee693835762e, []int{362} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21484,7 +21533,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{362} + return fileDescriptor_9198ee693835762e, []int{363} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21528,7 +21577,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{363} + return fileDescriptor_9198ee693835762e, []int{364} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21573,7 +21622,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{364} + return fileDescriptor_9198ee693835762e, []int{365} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21622,7 +21671,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{365} + return fileDescriptor_9198ee693835762e, []int{366} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21753,7 +21802,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{366} + return fileDescriptor_9198ee693835762e, []int{367} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21799,7 +21848,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{367} + return fileDescriptor_9198ee693835762e, []int{368} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21841,7 +21890,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{368} + return fileDescriptor_9198ee693835762e, []int{369} } func (m *GitHubIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21886,7 +21935,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{369} + return fileDescriptor_9198ee693835762e, []int{370} } func (m *AWSRAIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21935,7 +21984,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{370} + return fileDescriptor_9198ee693835762e, []int{371} } func (m *AWSRolesAnywhereProfileSyncConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21992,7 +22041,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{371} + return fileDescriptor_9198ee693835762e, []int{372} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22049,7 +22098,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{372} + return fileDescriptor_9198ee693835762e, []int{373} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22099,7 +22148,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{373} + return fileDescriptor_9198ee693835762e, []int{374} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22140,7 +22189,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{374} + return fileDescriptor_9198ee693835762e, []int{375} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22190,7 +22239,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{375} + return fileDescriptor_9198ee693835762e, []int{376} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22232,7 +22281,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{376} + return fileDescriptor_9198ee693835762e, []int{377} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22289,7 +22338,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{377} + return fileDescriptor_9198ee693835762e, []int{378} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22354,7 +22403,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{378} + return fileDescriptor_9198ee693835762e, []int{379} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22411,7 +22460,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{379} + return fileDescriptor_9198ee693835762e, []int{380} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22475,7 +22524,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{380} + return fileDescriptor_9198ee693835762e, []int{381} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22520,7 +22569,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{381} + return fileDescriptor_9198ee693835762e, []int{382} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22582,7 +22631,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{382} + return fileDescriptor_9198ee693835762e, []int{383} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22625,7 +22674,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{383} + return fileDescriptor_9198ee693835762e, []int{384} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22668,7 +22717,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{384} + return fileDescriptor_9198ee693835762e, []int{385} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22722,7 +22771,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{385} + return fileDescriptor_9198ee693835762e, []int{386} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22777,7 +22826,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{386} + return fileDescriptor_9198ee693835762e, []int{387} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22823,7 +22872,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{387} + return fileDescriptor_9198ee693835762e, []int{388} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22865,7 +22914,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{388} + return fileDescriptor_9198ee693835762e, []int{389} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22911,7 +22960,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{389} + return fileDescriptor_9198ee693835762e, []int{390} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22956,7 +23005,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{390} + return fileDescriptor_9198ee693835762e, []int{391} } func (m *AccessGraphAWSSyncCloudTrailLogs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23004,7 +23053,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{391} + return fileDescriptor_9198ee693835762e, []int{392} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23048,7 +23097,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{392} + return fileDescriptor_9198ee693835762e, []int{393} } func (m *AccessGraphAzureSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23104,7 +23153,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{393} + return fileDescriptor_9198ee693835762e, []int{394} } func (m *TargetHealth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23225,6 +23274,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") @@ -23604,2065 +23654,2070 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 32922 bytes of a gzipped FileDescriptorProto + // 32993 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, 0xc3, 0x69, 0x4e, 0xcd, 0x0c, 0x87, 0x9c, 0x19, 0x92, 0x4b, 0x70, 0x87, 0xbb, 0xb3, 0xf3, 0xb5, 0x0d, - 0x34, 0x48, 0x34, 0x09, 0x82, 0x3d, 0xd5, 0x00, 0xb9, 0xa3, 0xdd, 0xd9, 0xda, 0x42, 0x77, 0x02, - 0xa8, 0x41, 0x77, 0x57, 0x6f, 0x55, 0x35, 0x49, 0x68, 0xad, 0x9f, 0x25, 0x4b, 0xfb, 0x93, 0x15, - 0x3a, 0x49, 0x96, 0x2c, 0x59, 0xeb, 0x0b, 0x5b, 0xe1, 0x90, 0xed, 0x3b, 0x9f, 0x1d, 0x52, 0xd8, - 0x92, 0x7d, 0xe7, 0x0b, 0x85, 0xe4, 0xd5, 0x9d, 0x2d, 0xeb, 0x1c, 0x17, 0x27, 0x85, 0xcf, 0xf7, - 0xb5, 0xa1, 0x80, 0xc2, 0xa7, 0x8b, 0xfb, 0x03, 0x11, 0x17, 0x27, 0xdd, 0x45, 0x5c, 0xc4, 0xad, - 0x42, 0xf6, 0x45, 0xbe, 0xcc, 0xac, 0xca, 0xac, 0xaa, 0x6e, 0x34, 0x66, 0x38, 0xb2, 0xb8, 0xa1, - 0x7f, 0x48, 0xf4, 0xcb, 0xf7, 0x5e, 0x56, 0x7e, 0xbf, 0x7c, 0xf9, 0x3e, 0xe0, 0x85, 0x80, 0xb6, - 0x68, 0xd7, 0xf5, 0x82, 0xab, 0x2d, 0xba, 0x6b, 0x37, 0x0e, 0xae, 0x06, 0x07, 0x5d, 0xea, 0xf3, - 0x7f, 0xaf, 0x74, 0x3d, 0x37, 0x70, 0xc9, 0x28, 0xfe, 0x58, 0x9c, 0xdf, 0x75, 0x77, 0x5d, 0x84, - 0x5c, 0x65, 0x7f, 0xf1, 0xc2, 0xc5, 0xe7, 0x77, 0x5d, 0x77, 0xb7, 0x45, 0xaf, 0xe2, 0xaf, 0xed, - 0xde, 0xce, 0xd5, 0x66, 0xcf, 0xb3, 0x03, 0xc7, 0xed, 0x88, 0xf2, 0x52, 0xbc, 0x3c, 0x70, 0xda, - 0xd4, 0x0f, 0xec, 0x76, 0xb7, 0x1f, 0x83, 0x47, 0x9e, 0xdd, 0xed, 0x52, 0x4f, 0xd4, 0xbe, 0x78, - 0x29, 0xfc, 0x40, 0x3b, 0x08, 0x18, 0x25, 0x63, 0x7e, 0xf5, 0xe1, 0x35, 0xf5, 0xa7, 0x40, 0xbd, - 0xd1, 0xa7, 0x2d, 0x5e, 0xcf, 0x0f, 0x68, 0xd3, 0x6a, 0xd2, 0x87, 0x4e, 0x83, 0x5a, 0x1e, 0xfd, - 0x7a, 0xcf, 0xf1, 0x68, 0x9b, 0x76, 0x02, 0x41, 0x77, 0x39, 0x9d, 0x4e, 0x7e, 0x48, 0xec, 0x8b, - 0x8c, 0x5f, 0xc8, 0xc1, 0xc4, 0x1d, 0x4a, 0xbb, 0xe5, 0x96, 0xf3, 0x90, 0x92, 0x17, 0x61, 0x64, - 0xc3, 0x6e, 0xd3, 0x85, 0xcc, 0xf9, 0xcc, 0xc5, 0x89, 0xe5, 0x99, 0xa3, 0xc3, 0xd2, 0xa4, 0x4f, - 0xbd, 0x87, 0xd4, 0xb3, 0x3a, 0x76, 0x9b, 0x9a, 0x58, 0x48, 0x5e, 0x83, 0x09, 0xf6, 0xbf, 0xdf, - 0xb5, 0x1b, 0x74, 0x21, 0x8b, 0x98, 0x53, 0x47, 0x87, 0xa5, 0x89, 0x8e, 0x04, 0x9a, 0x51, 0x39, - 0xa9, 0xc2, 0xf8, 0xea, 0xe3, 0xae, 0xe3, 0x51, 0x7f, 0x61, 0xe4, 0x7c, 0xe6, 0xe2, 0xe4, 0xd2, - 0xe2, 0x15, 0xde, 0x47, 0x57, 0x64, 0x1f, 0x5d, 0xd9, 0x94, 0x9d, 0xb8, 0x3c, 0xf7, 0xdb, 0x87, - 0xa5, 0x67, 0x8e, 0x0e, 0x4b, 0xe3, 0x94, 0x93, 0xfc, 0x95, 0xdf, 0x2f, 0x65, 0x4c, 0x49, 0x4f, - 0xde, 0x86, 0x91, 0xcd, 0x83, 0x2e, 0x5d, 0x98, 0x38, 0x9f, 0xb9, 0x38, 0xbd, 0xf4, 0xfc, 0x15, - 0x3e, 0xac, 0xe1, 0xc7, 0x47, 0x7f, 0x31, 0xac, 0xe5, 0xfc, 0xd1, 0x61, 0x69, 0x84, 0xa1, 0x98, - 0x48, 0x45, 0x2e, 0xc3, 0xd8, 0x9a, 0xeb, 0x07, 0xd5, 0xca, 0x02, 0xe0, 0x27, 0x9f, 0x3a, 0x3a, - 0x2c, 0xcd, 0xee, 0xb9, 0x7e, 0x60, 0x39, 0xcd, 0xd7, 0xdd, 0xb6, 0x13, 0xd0, 0x76, 0x37, 0x38, - 0x30, 0x05, 0x92, 0xf1, 0x18, 0xa6, 0x34, 0x7e, 0x64, 0x12, 0xc6, 0xb7, 0x36, 0xee, 0x6c, 0xdc, - 0x7b, 0xb0, 0x51, 0x7c, 0x86, 0xe4, 0x61, 0x64, 0xe3, 0x5e, 0x65, 0xb5, 0x98, 0x21, 0xe3, 0x90, - 0x2b, 0xd7, 0x6a, 0xc5, 0x2c, 0x29, 0x40, 0xbe, 0x52, 0xde, 0x2c, 0x2f, 0x97, 0xeb, 0xab, 0xc5, - 0x1c, 0x99, 0x83, 0x99, 0x07, 0xd5, 0x8d, 0xca, 0xbd, 0x07, 0x75, 0xab, 0xb2, 0x5a, 0xbf, 0xb3, - 0x79, 0xaf, 0x56, 0x1c, 0x21, 0xd3, 0x00, 0x77, 0xb6, 0x96, 0x57, 0xcd, 0x8d, 0xd5, 0xcd, 0xd5, - 0x7a, 0x71, 0x94, 0xcc, 0x43, 0x51, 0x92, 0x58, 0xf5, 0x55, 0xf3, 0x7e, 0x75, 0x65, 0xb5, 0x38, - 0x76, 0x7b, 0x24, 0x9f, 0x2b, 0x8e, 0x98, 0xe3, 0xeb, 0xd4, 0xf6, 0x69, 0xb5, 0x62, 0xfc, 0xed, - 0x1c, 0xe4, 0xef, 0xd2, 0xc0, 0x6e, 0xda, 0x81, 0x4d, 0x9e, 0xd3, 0xc6, 0x07, 0x9b, 0xa8, 0x0c, - 0xcc, 0x8b, 0xc9, 0x81, 0x19, 0x3d, 0x3a, 0x2c, 0x65, 0x2e, 0xab, 0x03, 0xf2, 0x16, 0x4c, 0x56, - 0xa8, 0xdf, 0xf0, 0x9c, 0x2e, 0x9b, 0x6c, 0x0b, 0x39, 0x44, 0x3b, 0x7b, 0x74, 0x58, 0x3a, 0xd5, - 0x8c, 0xc0, 0x4a, 0x87, 0xa8, 0xd8, 0xa4, 0x0a, 0x63, 0xeb, 0xf6, 0x36, 0x6d, 0xf9, 0x0b, 0xa3, - 0xe7, 0x73, 0x17, 0x27, 0x97, 0x9e, 0x15, 0x83, 0x20, 0x3f, 0xf0, 0x0a, 0x2f, 0x5d, 0xed, 0x04, - 0xde, 0xc1, 0xf2, 0xfc, 0xd1, 0x61, 0xa9, 0xd8, 0x42, 0x80, 0xda, 0xc1, 0x1c, 0x85, 0xd4, 0xa3, - 0x89, 0x31, 0x76, 0xec, 0xc4, 0x38, 0xf7, 0xdb, 0x87, 0xa5, 0x0c, 0x1b, 0x30, 0x31, 0x31, 0x22, - 0x7e, 0xfa, 0x14, 0x59, 0x82, 0xbc, 0x49, 0x1f, 0x3a, 0x3e, 0x6b, 0x59, 0x1e, 0x5b, 0x76, 0xfa, - 0xe8, 0xb0, 0x44, 0x3c, 0x01, 0x53, 0x3e, 0x23, 0xc4, 0x5b, 0x7c, 0x13, 0x26, 0x95, 0xaf, 0x26, - 0x45, 0xc8, 0xed, 0xd3, 0x03, 0xde, 0xc3, 0x26, 0xfb, 0x93, 0xcc, 0xc3, 0xe8, 0x43, 0xbb, 0xd5, - 0x13, 0x5d, 0x6a, 0xf2, 0x1f, 0x5f, 0xc8, 0x7e, 0x3e, 0x73, 0x7b, 0x24, 0x3f, 0x5e, 0xcc, 0x9b, - 0xd9, 0x6a, 0xc5, 0xf8, 0x99, 0x11, 0xc8, 0x9b, 0x2e, 0x5f, 0xc0, 0xe4, 0x12, 0x8c, 0xd6, 0x03, - 0x3b, 0x90, 0xc3, 0x34, 0x77, 0x74, 0x58, 0x9a, 0x61, 0x8b, 0x9b, 0x2a, 0xf5, 0x73, 0x0c, 0x86, - 0x5a, 0xdb, 0xb3, 0x7d, 0x39, 0x5c, 0x88, 0xda, 0x65, 0x00, 0x15, 0x15, 0x31, 0xc8, 0x05, 0x18, - 0xb9, 0xeb, 0x36, 0xa9, 0x18, 0x31, 0x72, 0x74, 0x58, 0x9a, 0x6e, 0xbb, 0x4d, 0x15, 0x11, 0xcb, - 0xc9, 0xeb, 0x30, 0xb1, 0xd2, 0xf3, 0x3c, 0xda, 0x61, 0x73, 0x7d, 0x04, 0x91, 0xa7, 0x8f, 0x0e, - 0x4b, 0xd0, 0xe0, 0x40, 0xcb, 0x69, 0x9a, 0x11, 0x02, 0x1b, 0x86, 0x7a, 0x60, 0x7b, 0x01, 0x6d, - 0x2e, 0x8c, 0x0e, 0x35, 0x0c, 0x6c, 0x7d, 0xce, 0xfa, 0x9c, 0x24, 0x3e, 0x0c, 0x82, 0x13, 0x59, - 0x83, 0xc9, 0x5b, 0x9e, 0xdd, 0xa0, 0x35, 0xea, 0x39, 0x6e, 0x13, 0xc7, 0x37, 0xb7, 0x7c, 0xe1, - 0xe8, 0xb0, 0x74, 0x7a, 0x97, 0x81, 0xad, 0x2e, 0xc2, 0x23, 0xea, 0xef, 0x1e, 0x96, 0xf2, 0x15, - 0xb1, 0xd5, 0x9a, 0x2a, 0x29, 0xf9, 0x1a, 0x1b, 0x1c, 0x3f, 0xc0, 0xae, 0xa5, 0xcd, 0x85, 0xf1, - 0x63, 0x3f, 0xd1, 0x10, 0x9f, 0x78, 0xba, 0x65, 0xfb, 0x81, 0xe5, 0x71, 0xba, 0xd8, 0x77, 0xaa, - 0x2c, 0xc9, 0x3d, 0xc8, 0xd7, 0x1b, 0x7b, 0xb4, 0xd9, 0x6b, 0x51, 0x9c, 0x32, 0x93, 0x4b, 0x67, - 0xc4, 0xa4, 0x96, 0xe3, 0x29, 0x8b, 0x97, 0x17, 0x05, 0x6f, 0xe2, 0x0b, 0x88, 0x3a, 0x9f, 0x24, - 0xd6, 0x17, 0xf2, 0xdf, 0xfa, 0x5b, 0xa5, 0x67, 0x7e, 0xf0, 0xf7, 0xce, 0x3f, 0x63, 0xfc, 0x17, - 0x59, 0x28, 0xc6, 0x99, 0x90, 0x1d, 0x98, 0xda, 0xea, 0x36, 0xed, 0x80, 0xae, 0xb4, 0x1c, 0xda, - 0x09, 0x7c, 0x9c, 0x24, 0x83, 0xdb, 0xf4, 0x92, 0xa8, 0x77, 0xa1, 0x87, 0x84, 0x56, 0x83, 0x53, - 0xc6, 0x5a, 0xa5, 0xb3, 0x8d, 0xea, 0xa9, 0xe3, 0x06, 0xee, 0xe3, 0x0c, 0x3b, 0x59, 0x3d, 0x7c, - 0xeb, 0xef, 0x53, 0x8f, 0x60, 0x2b, 0x26, 0x50, 0xa7, 0xb9, 0x7d, 0x80, 0x33, 0x73, 0xf8, 0x09, - 0xc4, 0x48, 0x52, 0x26, 0x10, 0x03, 0x1b, 0xff, 0x5b, 0x06, 0xa6, 0x4d, 0xea, 0xbb, 0x3d, 0xaf, - 0x41, 0xd7, 0xa8, 0xdd, 0xa4, 0x1e, 0x9b, 0xfe, 0x77, 0x9c, 0x4e, 0x53, 0xac, 0x29, 0x9c, 0xfe, - 0xfb, 0x4e, 0x47, 0xdd, 0xba, 0xb1, 0x9c, 0x7c, 0x06, 0xc6, 0xeb, 0xbd, 0x6d, 0x44, 0xcd, 0x46, - 0x3b, 0x80, 0xdf, 0xdb, 0xb6, 0x62, 0xe8, 0x12, 0x8d, 0x5c, 0x85, 0xf1, 0xfb, 0xd4, 0xf3, 0xa3, - 0xdd, 0x10, 0x8f, 0x86, 0x87, 0x1c, 0xa4, 0x12, 0x08, 0x2c, 0x72, 0x2b, 0xda, 0x91, 0xc5, 0xa1, - 0x36, 0x13, 0xdb, 0x07, 0xa3, 0xa9, 0xd2, 0x16, 0x10, 0x75, 0xaa, 0x48, 0x2c, 0xe3, 0x7f, 0xce, - 0x42, 0xb1, 0x62, 0x07, 0xf6, 0xb6, 0xed, 0x8b, 0xfe, 0xbc, 0x7f, 0x9d, 0xed, 0xf1, 0x4a, 0x43, - 0x71, 0x8f, 0x67, 0x5f, 0xfe, 0xb1, 0x9b, 0xf7, 0x72, 0xbc, 0x79, 0x93, 0xec, 0x84, 0x15, 0xcd, - 0x8b, 0x1a, 0xf5, 0xce, 0xf1, 0x8d, 0x2a, 0x8a, 0x46, 0xe5, 0x65, 0xa3, 0xa2, 0xa6, 0x90, 0x77, - 0x60, 0xa4, 0xde, 0xa5, 0x0d, 0xb1, 0x89, 0xc8, 0x73, 0x41, 0x6f, 0x1c, 0x43, 0xb8, 0x7f, 0x7d, - 0xb9, 0x20, 0xd8, 0x8c, 0xf8, 0x5d, 0xda, 0x30, 0x91, 0x8c, 0xac, 0xc2, 0x18, 0xdb, 0x10, 0x7b, - 0xf2, 0x30, 0x38, 0x97, 0xce, 0x00, 0x51, 0xee, 0x5f, 0x5f, 0x9e, 0x16, 0x2c, 0xc6, 0x7c, 0x84, - 0x98, 0x82, 0x58, 0x59, 0x7b, 0xff, 0x34, 0x07, 0xf3, 0x69, 0xb5, 0xab, 0xdd, 0x31, 0x36, 0xa0, - 0x3b, 0x2e, 0x42, 0x9e, 0x49, 0x02, 0xec, 0x74, 0xc5, 0x5d, 0x67, 0x62, 0xb9, 0xc0, 0x5a, 0xbe, - 0x27, 0x60, 0x66, 0x58, 0x4a, 0x5e, 0x0c, 0x05, 0x8b, 0x7c, 0xc4, 0x4f, 0x08, 0x16, 0x52, 0x9c, - 0x60, 0x53, 0x46, 0xee, 0x04, 0x28, 0x7f, 0x44, 0xbd, 0x2b, 0xc1, 0xd1, 0x94, 0xf1, 0x04, 0x44, - 0x3b, 0xad, 0xe4, 0xd9, 0xb2, 0x0a, 0x79, 0xd9, 0xac, 0x85, 0x02, 0x32, 0x9a, 0x8d, 0x75, 0xd5, - 0xfd, 0xeb, 0x7c, 0x4e, 0x34, 0xc5, 0x6f, 0x95, 0x8d, 0xc4, 0x21, 0xd7, 0x21, 0x5f, 0xf3, 0xdc, - 0xc7, 0x07, 0xd5, 0x8a, 0xbf, 0x30, 0x75, 0x3e, 0x77, 0x71, 0x62, 0xf9, 0xcc, 0xd1, 0x61, 0x69, - 0xae, 0xcb, 0x60, 0x96, 0xd3, 0x54, 0x0f, 0xec, 0x10, 0xf1, 0xf6, 0x48, 0x3e, 0x53, 0xcc, 0xde, - 0x1e, 0xc9, 0x67, 0x8b, 0x39, 0x2e, 0xa5, 0xdc, 0x1e, 0xc9, 0x8f, 0x14, 0x47, 0x6f, 0x8f, 0xe4, - 0x47, 0x51, 0x6e, 0x99, 0x28, 0xc2, 0xed, 0x91, 0xfc, 0x64, 0xb1, 0xa0, 0x09, 0x0d, 0xc8, 0x20, - 0x70, 0x1b, 0x6e, 0xcb, 0xcc, 0x6d, 0x99, 0x55, 0x73, 0x6c, 0xa5, 0xbc, 0x42, 0xbd, 0xc0, 0xcc, - 0x95, 0x1f, 0xd4, 0xcd, 0xa9, 0xca, 0x41, 0xc7, 0x6e, 0x3b, 0x0d, 0x7e, 0x02, 0x9b, 0xb9, 0x5b, - 0x2b, 0x35, 0xa3, 0x03, 0xa7, 0xd3, 0x87, 0x9d, 0x6c, 0x42, 0x61, 0xd3, 0xf6, 0x76, 0x69, 0xb0, - 0x46, 0xed, 0x56, 0xb0, 0xb7, 0x30, 0x8d, 0x1d, 0x30, 0x27, 0x3a, 0x40, 0x2d, 0x5a, 0x7e, 0xf6, - 0xe8, 0xb0, 0x74, 0x26, 0x40, 0x88, 0xb5, 0x87, 0x20, 0xa5, 0x49, 0x1a, 0x17, 0xa3, 0x0c, 0xd3, - 0x51, 0xdf, 0xad, 0x3b, 0x7e, 0x40, 0xae, 0xc2, 0x84, 0x84, 0xb0, 0xfd, 0x39, 0x97, 0xda, 0xcb, - 0x66, 0x84, 0x63, 0xfc, 0x56, 0x16, 0x20, 0x2a, 0x79, 0x4a, 0x97, 0xf0, 0xe7, 0xb4, 0x25, 0x7c, - 0x2a, 0xbe, 0x02, 0xfb, 0x2f, 0xde, 0xf7, 0x62, 0x8b, 0xf7, 0x4c, 0x9c, 0x74, 0xf8, 0x65, 0xfb, - 0x0b, 0xe3, 0xd1, 0x60, 0x88, 0x05, 0x7b, 0x11, 0xc2, 0x09, 0x24, 0x3a, 0x14, 0x57, 0x62, 0x57, - 0x4e, 0xaa, 0xb0, 0x94, 0x9c, 0x05, 0x36, 0xc1, 0x44, 0xa7, 0x8e, 0x1f, 0x1d, 0x96, 0x72, 0x3d, - 0xcf, 0xc1, 0x49, 0x47, 0xae, 0x82, 0x98, 0x76, 0xa2, 0x03, 0xd9, 0x6c, 0x9f, 0x6d, 0xd8, 0x56, - 0x83, 0x7a, 0x41, 0xd4, 0xe3, 0x0b, 0x19, 0x39, 0x3b, 0x49, 0x17, 0xf4, 0xa9, 0xb9, 0x30, 0x82, - 0xd3, 0xe0, 0x62, 0x6a, 0xaf, 0x5c, 0xd1, 0x50, 0xb9, 0xf4, 0x7b, 0x5e, 0x1e, 0xa6, 0x4d, 0x5e, - 0x66, 0x25, 0x24, 0x61, 0xbd, 0x02, 0x72, 0x1d, 0xd8, 0x8a, 0x10, 0xbd, 0x0f, 0xa2, 0x9e, 0xf2, - 0x83, 0xfa, 0xf2, 0x29, 0xc1, 0x69, 0xca, 0x7e, 0xa4, 0x92, 0x33, 0x6c, 0xf2, 0x16, 0xb0, 0x25, - 0x23, 0xfa, 0x9d, 0x08, 0xa2, 0x5b, 0x2b, 0xb5, 0x95, 0x96, 0xdb, 0x6b, 0xd6, 0xdf, 0x5f, 0x8f, - 0x88, 0x77, 0x1b, 0x5d, 0x95, 0xf8, 0xd6, 0x4a, 0x8d, 0xbc, 0x05, 0xa3, 0xe5, 0xef, 0xef, 0x79, - 0x54, 0x88, 0x55, 0x05, 0x59, 0x27, 0x83, 0x2d, 0x9f, 0x11, 0x84, 0x33, 0x36, 0xfb, 0xa9, 0x8a, - 0xa3, 0x58, 0xce, 0x6a, 0xde, 0x5c, 0xaf, 0x0b, 0x91, 0x89, 0xc4, 0xba, 0x65, 0x73, 0x5d, 0xf9, - 0xec, 0x40, 0x6b, 0x35, 0xa3, 0x22, 0x57, 0x21, 0x5b, 0xae, 0xe0, 0x45, 0x6e, 0x72, 0x69, 0x42, - 0x56, 0x5b, 0x59, 0x9e, 0x17, 0x24, 0x05, 0x5b, 0x5d, 0x06, 0xd9, 0x72, 0x85, 0x2c, 0xc3, 0xe8, - 0xdd, 0x83, 0xfa, 0xfb, 0xeb, 0x62, 0xf3, 0x94, 0x4b, 0x1e, 0x61, 0xf7, 0x70, 0x9b, 0xf1, 0xa3, - 0x2f, 0x6e, 0x1f, 0xf8, 0x5f, 0x6f, 0xa9, 0x5f, 0x8c, 0x68, 0xa4, 0x06, 0x13, 0xe5, 0x66, 0xdb, - 0xe9, 0x6c, 0xf9, 0xd4, 0x5b, 0x98, 0x44, 0x3e, 0x0b, 0xb1, 0xef, 0x0e, 0xcb, 0x97, 0x17, 0x8e, - 0x0e, 0x4b, 0xf3, 0x36, 0xfb, 0x69, 0xf5, 0x7c, 0xea, 0x29, 0xdc, 0x22, 0x26, 0xa4, 0x06, 0x70, - 0xd7, 0xed, 0xec, 0xba, 0xe5, 0xa0, 0x65, 0xfb, 0xb1, 0xed, 0x38, 0x2a, 0x08, 0xa5, 0x9e, 0x53, - 0x6d, 0x06, 0xb3, 0x6c, 0x06, 0x54, 0x18, 0x2a, 0x3c, 0xc8, 0x4d, 0x18, 0xbb, 0xe7, 0xd9, 0x8d, - 0x16, 0x5d, 0x98, 0x42, 0x6e, 0xf3, 0x82, 0x1b, 0x07, 0xca, 0x96, 0x2e, 0x08, 0x86, 0x45, 0x17, - 0xc1, 0xea, 0xed, 0x8a, 0x23, 0x2e, 0x3e, 0x00, 0x92, 0x9c, 0x93, 0x29, 0x77, 0x9b, 0xd7, 0xd4, - 0xbb, 0x4d, 0xb4, 0xe8, 0x57, 0xdc, 0x76, 0xdb, 0xee, 0x34, 0x91, 0xf6, 0xfe, 0x92, 0x72, 0xe5, - 0x31, 0xbe, 0x0e, 0xb3, 0x89, 0xce, 0x3a, 0xe6, 0x5a, 0xfa, 0x2e, 0xcc, 0x54, 0xe8, 0x8e, 0xdd, - 0x6b, 0x05, 0xe1, 0xc9, 0xc5, 0x97, 0x28, 0x5e, 0x10, 0x9b, 0xbc, 0xc8, 0x92, 0xc7, 0x95, 0x19, - 0x47, 0x36, 0xde, 0x81, 0x29, 0xad, 0xf9, 0xec, 0x86, 0x53, 0xee, 0x35, 0x9d, 0x00, 0x07, 0x32, - 0x13, 0xdd, 0x70, 0x6c, 0x06, 0xc4, 0xe1, 0x32, 0x23, 0x04, 0xe3, 0xef, 0xa8, 0x42, 0x96, 0x3c, - 0x49, 0x2e, 0x87, 0xfb, 0x41, 0x26, 0x12, 0xf9, 0x12, 0xfb, 0x41, 0xb8, 0x1b, 0x5c, 0xe2, 0x6b, - 0x33, 0x9b, 0x58, 0x9b, 0x93, 0x62, 0x24, 0x72, 0xf6, 0x23, 0x9f, 0xaf, 0xc8, 0x70, 0xa6, 0xe6, - 0x3e, 0xfe, 0x4c, 0x7d, 0x0f, 0x0a, 0x77, 0xed, 0x8e, 0xbd, 0x4b, 0x9b, 0xac, 0x05, 0x7c, 0xef, - 0x99, 0xe0, 0x47, 0x5a, 0x9b, 0xc3, 0xb1, 0x95, 0xea, 0x24, 0xd2, 0x08, 0xc8, 0x35, 0xb9, 0xb2, - 0x47, 0x53, 0x56, 0xf6, 0x94, 0xa8, 0x7d, 0x14, 0x57, 0xb6, 0x58, 0xcf, 0xc6, 0xb7, 0x27, 0xb0, - 0x8d, 0xe4, 0x75, 0x18, 0x33, 0xe9, 0x2e, 0x3b, 0x6a, 0x32, 0xd1, 0x20, 0x79, 0x08, 0x51, 0x3b, - 0x86, 0xe3, 0xa0, 0x5c, 0x43, 0x9b, 0xfe, 0x9e, 0xb3, 0x13, 0x88, 0xde, 0x09, 0xe5, 0x1a, 0x01, - 0x56, 0xe4, 0x1a, 0x01, 0xd1, 0x6f, 0xe1, 0x1c, 0xc6, 0x76, 0x3f, 0xb3, 0x52, 0x17, 0x9d, 0x26, - 0x7b, 0xd8, 0xac, 0x28, 0xdb, 0x88, 0xa7, 0x49, 0x25, 0x0c, 0x9b, 0xdc, 0x80, 0x89, 0x72, 0xa3, - 0xe1, 0xf6, 0x94, 0xab, 0x2e, 0x5f, 0xb7, 0x1c, 0xa8, 0x6b, 0x76, 0x22, 0x54, 0x52, 0x87, 0xc9, - 0x55, 0x76, 0x3f, 0x74, 0x56, 0xec, 0xc6, 0x9e, 0xec, 0x24, 0xb9, 0x87, 0x29, 0x25, 0xd1, 0xca, - 0xa5, 0x08, 0x6c, 0x30, 0xa0, 0xaa, 0x1b, 0x51, 0x70, 0xc9, 0x26, 0x4c, 0xd6, 0x69, 0xc3, 0xa3, - 0x41, 0x3d, 0x70, 0x3d, 0x1a, 0xdb, 0x92, 0x95, 0x92, 0xe5, 0xe7, 0xe5, 0x15, 0xd5, 0x47, 0xa0, - 0xe5, 0x33, 0xa8, 0xca, 0x55, 0x41, 0xe6, 0x77, 0x8d, 0xb6, 0xeb, 0x1d, 0x54, 0x96, 0xc5, 0x36, - 0x1d, 0x9d, 0xe9, 0x1c, 0xac, 0xde, 0x35, 0x18, 0xa4, 0xb9, 0xad, 0xdf, 0x35, 0x38, 0x16, 0x8e, - 0x54, 0xa5, 0x8e, 0xb2, 0x9c, 0xd8, 0xb4, 0x67, 0xa2, 0x5e, 0x46, 0xb0, 0x32, 0x52, 0x4d, 0x1f, - 0x25, 0x41, 0x6d, 0xa4, 0x04, 0x16, 0xe9, 0x02, 0x91, 0xa3, 0xc6, 0xc5, 0xb3, 0x16, 0xf5, 0x7d, - 0xb1, 0x97, 0x9f, 0x8d, 0x0d, 0x7e, 0x84, 0xb0, 0xfc, 0xb2, 0x60, 0x7e, 0x4e, 0x4e, 0x03, 0x71, - 0xbd, 0x64, 0x85, 0x4a, 0x3d, 0x29, 0xbc, 0xc9, 0x9b, 0x00, 0xab, 0x8f, 0x03, 0xea, 0x75, 0xec, - 0x56, 0xa8, 0xbe, 0x43, 0x8d, 0x15, 0x15, 0x50, 0x7d, 0xa0, 0x15, 0x64, 0xb2, 0x02, 0x53, 0x65, - 0xdf, 0xef, 0xb5, 0xa9, 0xe9, 0xb6, 0x68, 0xd9, 0xdc, 0xc0, 0x7d, 0x7f, 0x62, 0xf9, 0xdc, 0xd1, - 0x61, 0xe9, 0xac, 0x8d, 0x05, 0x96, 0xe7, 0xb6, 0xa8, 0x65, 0x7b, 0xea, 0xec, 0xd6, 0x69, 0xc8, - 0x3d, 0x80, 0x7b, 0x5d, 0xda, 0xa9, 0x53, 0xdb, 0x6b, 0xec, 0xc5, 0xb6, 0xf9, 0xa8, 0x60, 0xf9, - 0x39, 0xd1, 0xc2, 0x79, 0xb7, 0x4b, 0x3b, 0x3e, 0xc2, 0xd4, 0xaf, 0x8a, 0x30, 0xc9, 0x03, 0x98, - 0xa9, 0x96, 0xef, 0xd6, 0xdc, 0x96, 0xd3, 0x38, 0x10, 0x92, 0xd3, 0x34, 0x2a, 0x35, 0x4f, 0x0b, - 0xae, 0xb1, 0x52, 0xbe, 0x3d, 0x39, 0x76, 0xdb, 0xea, 0x22, 0xd4, 0x12, 0xf2, 0x53, 0x9c, 0x0b, - 0xf9, 0x80, 0xcd, 0x41, 0x9f, 0x09, 0x83, 0x9b, 0xf6, 0xae, 0xbf, 0x30, 0xa3, 0x29, 0xe9, 0xca, - 0x0f, 0xea, 0x57, 0x94, 0x52, 0x2e, 0xa6, 0x2c, 0xf2, 0x89, 0x88, 0x50, 0x2b, 0xb0, 0x77, 0x7d, - 0x7d, 0x22, 0x86, 0xd8, 0xe4, 0x36, 0x40, 0xc5, 0x6d, 0xf4, 0xda, 0xb4, 0x13, 0x54, 0x96, 0x17, - 0x8a, 0xfa, 0xd5, 0x23, 0x2c, 0x88, 0xb6, 0xb6, 0xa6, 0xdb, 0xd0, 0x66, 0xa2, 0x42, 0xbd, 0xf8, - 0x2e, 0x14, 0xe3, 0x1f, 0x72, 0x42, 0xbd, 0xdb, 0x54, 0x71, 0x5a, 0x69, 0xfd, 0xea, 0x63, 0xc7, - 0x0f, 0x7c, 0xe3, 0x1b, 0xda, 0x0a, 0x64, 0xbb, 0xc3, 0x1d, 0x7a, 0x50, 0xf3, 0xe8, 0x8e, 0xf3, - 0x58, 0x6c, 0x66, 0xb8, 0x3b, 0xec, 0xd3, 0x03, 0xab, 0x8b, 0x50, 0x75, 0x77, 0x08, 0x51, 0xc9, - 0x67, 0x21, 0x7f, 0xe7, 0x6e, 0xfd, 0x0e, 0x3d, 0xa8, 0x56, 0xc4, 0x41, 0xc5, 0xc9, 0xda, 0xbe, - 0xc5, 0x48, 0xb5, 0xb9, 0x16, 0x62, 0x1a, 0xcb, 0xd1, 0x4e, 0xc8, 0x6a, 0x5e, 0x69, 0xf5, 0xfc, - 0x80, 0x7a, 0xd5, 0x8a, 0x5a, 0x73, 0x83, 0x03, 0x63, 0xfb, 0x52, 0x88, 0x6a, 0xfc, 0xfb, 0x2c, - 0xee, 0x82, 0x6c, 0xc2, 0x57, 0x3b, 0x7e, 0x60, 0x77, 0x1a, 0x34, 0x64, 0x80, 0x13, 0xde, 0x11, - 0xd0, 0xd8, 0x84, 0x8f, 0x90, 0xf5, 0xaa, 0xb3, 0x43, 0x57, 0xcd, 0xaa, 0x94, 0x0a, 0x97, 0x6a, - 0x45, 0xd5, 0x0a, 0x7b, 0x02, 0x1a, 0xab, 0x32, 0x42, 0x26, 0x17, 0x60, 0xbc, 0x5a, 0xbe, 0x5b, - 0xee, 0x05, 0x7b, 0xb8, 0x07, 0xe7, 0xb9, 0x7c, 0xce, 0x66, 0xab, 0xdd, 0x0b, 0xf6, 0x4c, 0x59, - 0x48, 0xae, 0xe2, 0xbd, 0xa7, 0x43, 0x03, 0xae, 0x3d, 0x16, 0x87, 0xae, 0xcf, 0x41, 0xb1, 0x6b, - 0x0f, 0x03, 0x91, 0x57, 0x61, 0xf4, 0x7e, 0x6d, 0xa5, 0x5a, 0x11, 0x17, 0x75, 0x3c, 0x89, 0x1e, - 0x76, 0x1b, 0xfa, 0x97, 0x70, 0x14, 0xb2, 0x0a, 0xd3, 0x75, 0xda, 0xe8, 0x79, 0x4e, 0x70, 0x70, - 0xcb, 0x73, 0x7b, 0x5d, 0x7f, 0x61, 0x1c, 0xeb, 0xc0, 0x95, 0xee, 0x8b, 0x12, 0x6b, 0x17, 0x8b, - 0x14, 0xea, 0x18, 0x91, 0xf1, 0x9b, 0x99, 0x68, 0x9b, 0x24, 0x17, 0x34, 0xb1, 0x06, 0x55, 0x4e, - 0x4c, 0xac, 0x51, 0x55, 0x4e, 0x28, 0xe0, 0x98, 0x40, 0x56, 0x7a, 0x7e, 0xe0, 0xb6, 0x57, 0x3b, - 0xcd, 0xae, 0xeb, 0x74, 0x02, 0xa4, 0xe2, 0x9d, 0x6f, 0x1c, 0x1d, 0x96, 0x9e, 0x6f, 0x60, 0xa9, - 0x45, 0x45, 0xb1, 0x15, 0xe3, 0x92, 0x42, 0xfd, 0x09, 0xc6, 0xc3, 0xf8, 0x57, 0x59, 0xed, 0x78, - 0x63, 0x9f, 0x67, 0xd2, 0x6e, 0xcb, 0x69, 0xa0, 0x06, 0x01, 0x1b, 0x1a, 0xce, 0x2a, 0xfc, 0x3c, - 0x2f, 0x2a, 0xe5, 0x3d, 0xa4, 0xf3, 0x4e, 0xa1, 0x26, 0x5f, 0x84, 0x02, 0x93, 0x34, 0xc4, 0x4f, - 0x7f, 0x21, 0x8b, 0x9d, 0xfd, 0x1c, 0x2a, 0x0f, 0x7d, 0xea, 0x85, 0x6c, 0x34, 0x11, 0x45, 0xa5, - 0x20, 0x4d, 0x58, 0xd8, 0xf4, 0xec, 0x8e, 0xef, 0x04, 0xab, 0x9d, 0x86, 0x77, 0x80, 0x92, 0xd1, - 0x6a, 0xc7, 0xde, 0x6e, 0xd1, 0x26, 0x36, 0x37, 0xbf, 0x7c, 0xf1, 0xe8, 0xb0, 0xf4, 0x52, 0xc0, - 0x71, 0x2c, 0x1a, 0x22, 0x59, 0x94, 0x63, 0x29, 0x9c, 0xfb, 0x72, 0x62, 0x92, 0x94, 0xec, 0x56, - 0x7c, 0x3b, 0xe2, 0x42, 0x02, 0x4a, 0x52, 0xe1, 0x68, 0xb0, 0x3d, 0x4c, 0xfd, 0x4c, 0x95, 0xc0, - 0xf8, 0x7f, 0x32, 0xd1, 0x01, 0x4c, 0xde, 0x86, 0x49, 0xb1, 0x62, 0x94, 0x79, 0x81, 0x3b, 0xa8, - 0x5c, 0x5e, 0xb1, 0x91, 0x55, 0xd1, 0xd9, 0xbd, 0xbf, 0xbc, 0xb2, 0xae, 0xcc, 0x0d, 0xbc, 0xf7, - 0xdb, 0x8d, 0x56, 0x9c, 0x4a, 0xa2, 0xb1, 0x49, 0xb0, 0xb9, 0x5e, 0xd7, 0x7b, 0x05, 0x27, 0x41, - 0xd0, 0xf2, 0x53, 0xba, 0x41, 0x41, 0xfe, 0xe4, 0x0d, 0xff, 0x9f, 0x32, 0x69, 0xe7, 0x3c, 0x59, - 0x86, 0xa9, 0x07, 0xae, 0xb7, 0x8f, 0xe3, 0xab, 0x74, 0x02, 0x8e, 0xfc, 0x23, 0x59, 0x10, 0x6f, - 0x90, 0x4e, 0xa2, 0x7e, 0x9b, 0xd2, 0x1b, 0xfa, 0xb7, 0xc5, 0x38, 0x68, 0x04, 0x6c, 0x1c, 0x42, - 0x8e, 0xe1, 0xea, 0xc0, 0x71, 0x88, 0x3e, 0x41, 0x9b, 0xc2, 0x2a, 0xba, 0xf1, 0xeb, 0x19, 0xf5, - 0x3c, 0x67, 0x9d, 0x5c, 0x71, 0xdb, 0xb6, 0xd3, 0x51, 0x9a, 0xc3, 0xdf, 0xc3, 0x10, 0x1a, 0xff, - 0x12, 0x05, 0x99, 0x5c, 0x87, 0x3c, 0xff, 0x15, 0xee, 0xb5, 0xa8, 0x45, 0x13, 0x84, 0xfa, 0x41, - 0x21, 0x11, 0x13, 0x23, 0x93, 0x3b, 0xe9, 0xc8, 0x7c, 0x3b, 0xa3, 0x1e, 0xc5, 0x1f, 0xf7, 0xb0, - 0x89, 0x1d, 0x32, 0xd9, 0x93, 0x1c, 0x32, 0x9f, 0xb8, 0x09, 0x3f, 0x98, 0x81, 0x49, 0x45, 0x4b, - 0xc1, 0xda, 0x50, 0xf3, 0xdc, 0x8f, 0x68, 0x23, 0xd0, 0xdb, 0xd0, 0xe5, 0xc0, 0x58, 0x1b, 0x42, - 0xd4, 0x4f, 0xd0, 0x06, 0xe3, 0x8f, 0x32, 0xe2, 0x8e, 0x34, 0xf4, 0x36, 0xaf, 0x6f, 0xc9, 0xd9, - 0x93, 0x1c, 0x91, 0x5f, 0x84, 0x51, 0x93, 0x36, 0x1d, 0x5f, 0xdc, 0x6f, 0x66, 0xd5, 0xfb, 0x18, - 0x16, 0x44, 0x72, 0x93, 0xc7, 0x7e, 0xaa, 0xe7, 0x1b, 0x96, 0x33, 0x41, 0xb6, 0xea, 0xdf, 0x6c, - 0xd1, 0xc7, 0x0e, 0x5f, 0x8c, 0xe2, 0xa8, 0xc5, 0xe3, 0xcd, 0xf1, 0xad, 0x1d, 0x56, 0x22, 0x24, - 0x6a, 0x75, 0xe1, 0x69, 0x34, 0xc6, 0x07, 0x00, 0x51, 0x95, 0xe4, 0x0e, 0x14, 0xc5, 0x6c, 0x70, - 0x3a, 0xbb, 0x5c, 0x90, 0x12, 0x7d, 0x50, 0x3a, 0x3a, 0x2c, 0x3d, 0xdb, 0x08, 0xcb, 0x84, 0xd4, - 0xa9, 0xf0, 0x4d, 0x10, 0x1a, 0xff, 0x7b, 0x0e, 0xb2, 0x65, 0x1c, 0x90, 0x3b, 0xf4, 0x20, 0xb0, - 0xb7, 0x6f, 0x3a, 0x2d, 0x6d, 0x31, 0xed, 0x23, 0xd4, 0xda, 0x71, 0x34, 0x75, 0x85, 0x82, 0xcc, - 0x16, 0xd3, 0x1d, 0x6f, 0xfb, 0x0d, 0x24, 0x54, 0x16, 0xd3, 0xbe, 0xb7, 0xfd, 0x46, 0x9c, 0x2c, - 0x44, 0x24, 0x06, 0x8c, 0xf1, 0x85, 0x25, 0xe6, 0x20, 0x1c, 0x1d, 0x96, 0xc6, 0xf8, 0xfa, 0x33, - 0x45, 0x09, 0x39, 0x0b, 0xb9, 0x7a, 0x6d, 0x43, 0xec, 0x80, 0xa8, 0x16, 0xf4, 0xbb, 0x1d, 0x93, - 0xc1, 0x58, 0x9d, 0xeb, 0x95, 0x72, 0x0d, 0x15, 0x01, 0xa3, 0x51, 0x9d, 0xad, 0xa6, 0xdd, 0x8d, - 0xab, 0x02, 0x42, 0x44, 0xf2, 0x0e, 0x4c, 0xde, 0xa9, 0xac, 0xac, 0xb9, 0x3e, 0xdf, 0xbd, 0xc6, - 0xa2, 0xc9, 0xbf, 0xdf, 0x6c, 0x58, 0xa8, 0xf9, 0x8f, 0x1f, 0x03, 0x0a, 0x3e, 0xb1, 0xe0, 0x34, - 0x63, 0xc5, 0x86, 0xc4, 0x69, 0x50, 0x71, 0x29, 0xdd, 0x88, 0xde, 0x19, 0x5e, 0x39, 0x3a, 0x2c, - 0xbd, 0x88, 0x5f, 0xe0, 0x73, 0x14, 0x4b, 0x5e, 0x67, 0x63, 0x5c, 0xfb, 0xb0, 0x21, 0x5f, 0x81, - 0x53, 0xc9, 0x92, 0x7a, 0xf8, 0x3e, 0x71, 0xe1, 0xe8, 0xb0, 0x64, 0xa4, 0xf2, 0xf7, 0xb5, 0xf9, - 0x9b, 0xce, 0xc4, 0xf8, 0x66, 0x16, 0x26, 0x15, 0x35, 0x1f, 0xf9, 0xac, 0x78, 0x96, 0xce, 0x68, - 0x17, 0x18, 0x05, 0x83, 0x95, 0x72, 0x9d, 0x50, 0xdb, 0x6d, 0x52, 0xf1, 0x48, 0x1d, 0xe9, 0x5f, - 0xb2, 0xc3, 0xe8, 0x5f, 0xde, 0x04, 0xe0, 0x53, 0x18, 0xfb, 0x49, 0x91, 0x86, 0x14, 0xeb, 0x14, - 0x75, 0x5a, 0x45, 0xc8, 0xe4, 0x3e, 0xcc, 0x6d, 0x7a, 0x3d, 0x3f, 0xa8, 0x1f, 0xf8, 0x01, 0x6d, - 0x33, 0x6e, 0x35, 0xd7, 0x6d, 0x89, 0xe5, 0xf3, 0xd2, 0xd1, 0x61, 0xe9, 0x3c, 0x9a, 0xd4, 0x58, - 0x3e, 0x96, 0xe3, 0x07, 0x58, 0x5d, 0xd7, 0x55, 0xb5, 0x32, 0x69, 0x0c, 0x0c, 0x13, 0x0a, 0xaa, - 0x4e, 0x87, 0x1d, 0x8c, 0xe2, 0x09, 0x4f, 0x68, 0xea, 0x95, 0x83, 0x51, 0x7c, 0x65, 0xf2, 0x49, - 0x51, 0x27, 0x31, 0x3e, 0xab, 0xea, 0x13, 0x87, 0xdd, 0x97, 0x8c, 0xbf, 0x94, 0x89, 0x76, 0xc1, - 0xfb, 0xd7, 0xc8, 0x5b, 0x30, 0xc6, 0x9f, 0x4c, 0xc5, 0xcb, 0xf2, 0xa9, 0xf0, 0x4e, 0xae, 0xbe, - 0xa7, 0x72, 0x45, 0xfe, 0xef, 0x72, 0xb3, 0x8a, 0x67, 0x4c, 0x41, 0x12, 0xbe, 0x01, 0xe8, 0xea, - 0x40, 0xc9, 0x1d, 0xb5, 0xdd, 0xd7, 0xd2, 0xde, 0x00, 0x8c, 0x7f, 0x31, 0x0a, 0xd3, 0x3a, 0x9a, - 0xfa, 0xae, 0x9a, 0x19, 0xea, 0x5d, 0xf5, 0x8b, 0x90, 0x17, 0xf3, 0x4d, 0x0a, 0x94, 0x2f, 0xe1, - 0xcb, 0x88, 0x80, 0x69, 0xf6, 0x02, 0xc0, 0x87, 0x83, 0x5d, 0xd1, 0xcd, 0x90, 0x8a, 0x2c, 0x29, - 0xaf, 0x76, 0xb9, 0x48, 0xc6, 0x92, 0xaf, 0x76, 0xea, 0x72, 0x0e, 0xdf, 0xef, 0x2e, 0xc3, 0x18, - 0xbb, 0x9e, 0x84, 0x1a, 0x24, 0xfc, 0x4a, 0x76, 0x73, 0x89, 0x19, 0x06, 0x71, 0x24, 0xf2, 0x00, - 0xf2, 0xeb, 0xb6, 0x1f, 0xd4, 0x29, 0xed, 0x0c, 0x61, 0x31, 0x51, 0x12, 0x5d, 0x35, 0x87, 0xe6, - 0x08, 0x3e, 0xa5, 0x9d, 0xd8, 0x93, 0x77, 0xc8, 0x8c, 0x7c, 0x08, 0xb0, 0xe2, 0x76, 0x02, 0xcf, - 0x6d, 0xad, 0xbb, 0xbb, 0x0b, 0x63, 0x78, 0x75, 0x7f, 0x3e, 0x36, 0x00, 0x11, 0x02, 0xbf, 0xbd, - 0x87, 0xfa, 0xa9, 0x06, 0x2f, 0xb0, 0x5a, 0xee, 0xae, 0xba, 0x0e, 0x22, 0x7c, 0x72, 0x13, 0x8a, - 0x52, 0x2f, 0xb2, 0xd5, 0xdd, 0xf5, 0x70, 0x82, 0x8c, 0x47, 0x82, 0x13, 0x7d, 0x1c, 0x58, 0x3d, - 0x01, 0x57, 0x37, 0xfa, 0x38, 0x0d, 0xf9, 0x0a, 0x9c, 0x89, 0xc3, 0xe4, 0x28, 0xe7, 0xa3, 0x2b, - 0x85, 0xca, 0x2e, 0x65, 0xde, 0xf7, 0x63, 0x41, 0x6e, 0xc1, 0x0c, 0xeb, 0x90, 0xbb, 0xd4, 0xf6, - 0x7b, 0xdc, 0xac, 0x4d, 0x68, 0x96, 0xe4, 0x83, 0xb0, 0x58, 0x85, 0x2d, 0xb7, 0xb1, 0xaf, 0x20, - 0x99, 0x71, 0x2a, 0x72, 0x03, 0x26, 0xb9, 0x9d, 0x82, 0x57, 0xed, 0xec, 0xb8, 0xe2, 0xd9, 0x40, - 0x6a, 0xd3, 0x45, 0xc9, 0xfd, 0x25, 0x56, 0x66, 0xaa, 0x88, 0xc6, 0x61, 0x16, 0x4e, 0xa7, 0xd7, - 0x41, 0xfe, 0x22, 0x9c, 0x12, 0xfd, 0xd9, 0xa2, 0x9e, 0x82, 0x33, 0x84, 0x05, 0xc7, 0x65, 0x31, - 0x4e, 0x2f, 0x34, 0x42, 0x06, 0xe1, 0x86, 0xc3, 0x58, 0xc4, 0x26, 0x45, 0x7a, 0x3d, 0xe4, 0x6b, - 0x30, 0xa9, 0x56, 0x9b, 0x1d, 0xde, 0x18, 0x66, 0x40, 0x5d, 0x2a, 0x4b, 0x62, 0xc3, 0x8c, 0x49, - 0xbf, 0xde, 0xa3, 0x7e, 0x20, 0xcd, 0x71, 0x84, 0xc4, 0x72, 0x36, 0x51, 0x8b, 0x44, 0x08, 0xd5, - 0x5e, 0x45, 0x8f, 0x53, 0x5a, 0xd2, 0x68, 0xf2, 0x5b, 0x8c, 0x7d, 0x9c, 0x9f, 0xf1, 0xdd, 0x2c, - 0x9c, 0xe9, 0x33, 0x9d, 0xd9, 0x8e, 0x87, 0xf2, 0xa4, 0xb2, 0xe3, 0xc5, 0xc4, 0x48, 0x6e, 0xcb, - 0x77, 0x1e, 0xb2, 0x42, 0x02, 0x1b, 0x59, 0x2e, 0x1e, 0x1d, 0x96, 0x0a, 0xda, 0x4a, 0xcd, 0x56, - 0x2b, 0xe4, 0x36, 0x8c, 0xb0, 0x6e, 0x18, 0xc2, 0x24, 0x45, 0x2a, 0x3d, 0xa7, 0x03, 0x47, 0xdd, - 0x20, 0xb0, 0x6f, 0x90, 0x07, 0xf9, 0x2c, 0xe4, 0x36, 0x37, 0xd7, 0x71, 0x77, 0xc8, 0xe1, 0xec, - 0x9e, 0x0a, 0x82, 0x96, 0xb6, 0x19, 0x4d, 0x31, 0xda, 0xb0, 0x47, 0x4c, 0x86, 0x4e, 0xbe, 0x14, - 0x33, 0x95, 0x7b, 0x75, 0xf0, 0x52, 0x1e, 0xde, 0x72, 0xee, 0x13, 0x18, 0xac, 0x19, 0x3f, 0x91, - 0x91, 0x56, 0x41, 0x62, 0xf2, 0x93, 0xf3, 0x72, 0x9d, 0xe0, 0xc5, 0x5c, 0x70, 0x51, 0x41, 0xe4, - 0x79, 0x00, 0xfe, 0x73, 0x6b, 0x4b, 0x74, 0x7a, 0xc1, 0x54, 0x20, 0xe4, 0x0b, 0x21, 0x4b, 0xa1, - 0xca, 0xcc, 0xa1, 0x24, 0x10, 0x5b, 0x6b, 0xbc, 0xcc, 0xd4, 0x51, 0x8d, 0xdf, 0xc8, 0x46, 0xa7, - 0xc6, 0x4d, 0xa7, 0x15, 0x50, 0x8f, 0x2c, 0xf2, 0x43, 0x20, 0xba, 0xcd, 0x98, 0xe1, 0x6f, 0xb2, - 0x10, 0x9d, 0x28, 0xbc, 0x69, 0xe1, 0xd1, 0xf1, 0xaa, 0x72, 0x74, 0xe4, 0xf0, 0xe8, 0x98, 0xee, - 0x7b, 0x48, 0xbc, 0x9a, 0xb2, 0x13, 0xe2, 0xd6, 0x9f, 0xb2, 0xdb, 0xbd, 0x04, 0x53, 0x1b, 0xee, - 0xea, 0xe3, 0x20, 0x44, 0x64, 0x5b, 0x7e, 0xde, 0xd4, 0x81, 0x8c, 0xe3, 0xbd, 0x56, 0x93, 0x7a, - 0x9b, 0x7b, 0x76, 0x47, 0x33, 0x2e, 0x31, 0x13, 0x70, 0x86, 0xbb, 0x41, 0x1f, 0xe9, 0xb8, 0xe3, - 0x1c, 0x37, 0x0e, 0x8f, 0x0f, 0x4e, 0x3e, 0x31, 0x38, 0xc6, 0x0f, 0x65, 0x65, 0x77, 0xdd, 0x5f, - 0x7a, 0x4a, 0xcd, 0x0e, 0xde, 0xd0, 0xcc, 0x0e, 0xe6, 0xc2, 0x07, 0x93, 0xd0, 0x66, 0x67, 0x29, - 0x4d, 0xe0, 0x50, 0x6c, 0x06, 0xfe, 0xce, 0x18, 0x14, 0x54, 0x74, 0xd6, 0x0f, 0xe5, 0x66, 0xd3, - 0x53, 0xfb, 0xc1, 0x6e, 0x36, 0x3d, 0x13, 0xa1, 0x9a, 0x65, 0x4f, 0x6e, 0xa0, 0x65, 0xcf, 0x57, - 0x61, 0x62, 0xa5, 0xdd, 0xd4, 0xde, 0xff, 0x8d, 0x94, 0xcf, 0xbb, 0x12, 0x22, 0xf1, 0xd5, 0x1b, - 0xbe, 0x03, 0x34, 0xda, 0xcd, 0xe4, 0xab, 0x7f, 0xc4, 0x52, 0x33, 0x0a, 0x1a, 0xfd, 0x24, 0x46, - 0x41, 0x37, 0x60, 0x62, 0xcb, 0xa7, 0x9b, 0xbd, 0x4e, 0x87, 0xb6, 0x70, 0xe2, 0xe5, 0xf9, 0xf5, - 0xb9, 0xe7, 0x53, 0x2b, 0x40, 0xa8, 0xfa, 0x01, 0x21, 0xaa, 0x3a, 0xc0, 0xe3, 0x03, 0x06, 0xf8, - 0x3a, 0xe4, 0x6b, 0x94, 0x7a, 0xd8, 0xa7, 0x93, 0xd1, 0x2d, 0xa9, 0x4b, 0xa9, 0x67, 0xb1, 0x8e, - 0xd5, 0x8c, 0x85, 0x04, 0xa2, 0x66, 0x61, 0x54, 0x18, 0xd2, 0xc2, 0x88, 0xbc, 0x00, 0x85, 0x6e, - 0x6f, 0xbb, 0xe5, 0x34, 0x90, 0xaf, 0x30, 0x4d, 0x32, 0x27, 0x39, 0x8c, 0xb1, 0xf5, 0xc9, 0x97, - 0x60, 0x0a, 0xd5, 0x06, 0xe1, 0x94, 0x9b, 0xd6, 0x8e, 0x76, 0xad, 0x8c, 0x4b, 0xdf, 0x0d, 0x06, - 0xb2, 0x52, 0x0c, 0xf1, 0x74, 0x46, 0xe4, 0x36, 0x8c, 0xef, 0x3a, 0x81, 0xb5, 0xd7, 0xdb, 0x5e, - 0x98, 0xd1, 0xac, 0xd8, 0x6e, 0x39, 0xc1, 0x5a, 0x6f, 0x9b, 0x0f, 0x79, 0xc8, 0x1a, 0xf7, 0xe8, - 0x5d, 0x27, 0xd8, 0xeb, 0xa9, 0xaf, 0x1c, 0x63, 0xbb, 0x88, 0xbb, 0x58, 0x87, 0x69, 0x7d, 0x56, - 0x3c, 0x81, 0xb7, 0xf7, 0xd0, 0xf2, 0x2a, 0x5f, 0x9c, 0xb8, 0x3d, 0x92, 0x87, 0xe2, 0x24, 0xb7, - 0xb9, 0x32, 0xa1, 0x16, 0xf6, 0x8f, 0x49, 0xee, 0xf4, 0xb6, 0xa9, 0xd7, 0xa1, 0x01, 0xf5, 0xc5, - 0x1d, 0xdd, 0x37, 0x47, 0xca, 0xdd, 0xae, 0x6f, 0xfc, 0xe3, 0x2c, 0x8c, 0x97, 0x1f, 0xd4, 0x71, - 0xd7, 0x7f, 0x5d, 0x7d, 0x38, 0x55, 0x5f, 0xd0, 0xc3, 0x87, 0x53, 0xf5, 0xb9, 0xf4, 0x6a, 0x8a, - 0x96, 0x05, 0x7d, 0x03, 0x14, 0x2d, 0x8b, 0xa6, 0x1f, 0x8a, 0xde, 0x90, 0x73, 0x43, 0xbc, 0x21, - 0x87, 0x6a, 0xfe, 0x91, 0xe3, 0xd5, 0xfc, 0x6f, 0xc1, 0x64, 0xb5, 0x13, 0xd0, 0x5d, 0x2f, 0x5a, - 0x35, 0xa1, 0xc6, 0x27, 0x04, 0xab, 0x37, 0x6f, 0x05, 0x9b, 0x4d, 0x49, 0xfe, 0xb4, 0x10, 0x3e, - 0x29, 0xe0, 0x94, 0xe4, 0x2f, 0x10, 0x31, 0x75, 0x9d, 0x44, 0x34, 0x2a, 0xb1, 0xf9, 0x26, 0xed, - 0x74, 0xb8, 0xd0, 0x37, 0x1d, 0xbd, 0xad, 0xb1, 0x8e, 0x5d, 0x9e, 0x4d, 0xb7, 0xd3, 0x31, 0xfe, - 0x6a, 0x06, 0xe6, 0xd3, 0xa6, 0x11, 0x79, 0x17, 0x0a, 0xae, 0xb7, 0x6b, 0x77, 0x9c, 0xef, 0xe7, - 0x2d, 0x52, 0x74, 0xca, 0x2a, 0x5c, 0xd5, 0xa4, 0xa9, 0x70, 0xd6, 0x21, 0x4a, 0xcb, 0x75, 0x15, - 0x58, 0x6a, 0x87, 0x28, 0x60, 0xe3, 0x47, 0xb3, 0x30, 0x59, 0xee, 0x76, 0x9f, 0x72, 0xd3, 0xd3, - 0xcf, 0x6b, 0x07, 0x88, 0xd4, 0x40, 0x84, 0xed, 0xea, 0x6f, 0xb8, 0xa6, 0x9c, 0x21, 0xbf, 0x9c, - 0x85, 0x99, 0x18, 0x85, 0xfa, 0xf5, 0x99, 0x21, 0x2d, 0x45, 0xb3, 0x43, 0x5a, 0x8a, 0xe6, 0x86, - 0xb3, 0x14, 0x1d, 0xf9, 0x24, 0x87, 0xc2, 0x2b, 0x90, 0x2b, 0x77, 0xbb, 0x71, 0x0b, 0x90, 0x6e, - 0xf7, 0xfe, 0x75, 0xae, 0x04, 0xb3, 0xbb, 0x5d, 0x93, 0x61, 0x68, 0x3b, 0xf5, 0xd8, 0x90, 0x3b, - 0xb5, 0x71, 0x19, 0x26, 0x90, 0x17, 0xda, 0x4b, 0x9e, 0x07, 0xdc, 0x62, 0x84, 0xa9, 0xa4, 0x56, - 0x97, 0xd8, 0x7c, 0xfe, 0x38, 0x03, 0xa3, 0xf8, 0xfb, 0x29, 0x9d, 0x63, 0x4b, 0xda, 0x1c, 0x2b, - 0x2a, 0x73, 0x6c, 0x98, 0xd9, 0xf5, 0xf7, 0x73, 0x00, 0x2b, 0xf7, 0xcc, 0x3a, 0xd7, 0x95, 0x92, - 0x9b, 0x30, 0x63, 0xb7, 0x5a, 0xee, 0x23, 0xda, 0xb4, 0x5c, 0xcf, 0xd9, 0x75, 0x3a, 0xbc, 0xe7, - 0xa4, 0x59, 0x82, 0x5e, 0xa4, 0x3e, 0x56, 0x8a, 0xa2, 0x7b, 0xbc, 0x44, 0xe5, 0xd3, 0xa6, 0xc1, - 0x9e, 0xdb, 0x94, 0x6a, 0x13, 0x8d, 0x8f, 0x28, 0x4a, 0xe1, 0x73, 0x97, 0x97, 0xa8, 0x7c, 0xf6, - 0x50, 0x0d, 0x24, 0x65, 0x68, 0x8d, 0x8f, 0x28, 0x4a, 0xe1, 0xc3, 0x75, 0x47, 0x3e, 0x59, 0x87, - 0x59, 0x84, 0x58, 0x0d, 0x8f, 0x36, 0x69, 0x27, 0x70, 0xec, 0x96, 0x2f, 0x14, 0x6d, 0xa8, 0x51, - 0x4e, 0x14, 0xaa, 0x8a, 0x06, 0x2c, 0x5c, 0x89, 0xca, 0xc8, 0x15, 0x18, 0x6f, 0xdb, 0x8f, 0x2d, - 0x7b, 0x97, 0x1b, 0xe8, 0x4c, 0x71, 0xc5, 0x8c, 0x00, 0xa9, 0xc7, 0x48, 0xdb, 0x7e, 0x5c, 0xde, - 0xa5, 0xac, 0x15, 0xf4, 0x71, 0xd7, 0xf5, 0x95, 0x56, 0x8c, 0x45, 0xad, 0x88, 0x15, 0xa9, 0xad, - 0x10, 0x45, 0xa2, 0x15, 0xc6, 0x2f, 0x65, 0xe0, 0xd9, 0x2a, 0x7e, 0x45, 0x70, 0xb0, 0x42, 0x3b, - 0x01, 0xf5, 0x6a, 0xd4, 0x6b, 0x3b, 0x68, 0xae, 0x50, 0xa7, 0x01, 0x79, 0x11, 0x72, 0x65, 0x73, - 0x43, 0xcc, 0x5f, 0xbe, 0xdf, 0x6b, 0xc6, 0x23, 0xac, 0x34, 0xd4, 0xdd, 0x65, 0x8f, 0x79, 0x53, - 0x28, 0x43, 0xa1, 0xec, 0xfb, 0xce, 0x6e, 0xa7, 0xcd, 0xfd, 0x75, 0x72, 0x9a, 0x79, 0x8a, 0x80, - 0x27, 0x1e, 0xc3, 0x54, 0x12, 0xe3, 0x3f, 0xcf, 0xc0, 0x6c, 0xb9, 0xdb, 0xd5, 0x3f, 0x59, 0x37, - 0x8d, 0xca, 0x0c, 0x6f, 0x1a, 0xe5, 0xc0, 0xb4, 0xd6, 0x5c, 0x3e, 0xa5, 0x22, 0xc1, 0x77, 0x40, - 0xcf, 0xf0, 0xcf, 0xee, 0x86, 0x20, 0xcb, 0xd7, 0xdf, 0xf5, 0x63, 0x8c, 0x8d, 0x7f, 0x37, 0x8e, - 0x7b, 0x88, 0xd8, 0x6d, 0x85, 0xf1, 0x6e, 0x26, 0xc5, 0x78, 0xf7, 0x4d, 0x50, 0x24, 0x1c, 0xf5, - 0x88, 0x53, 0x64, 0x45, 0x55, 0xeb, 0x15, 0x21, 0x93, 0xfd, 0xb8, 0x19, 0x6f, 0x0e, 0x5b, 0xf3, - 0x62, 0x7c, 0x01, 0x3f, 0x11, 0x0b, 0xde, 0x35, 0x20, 0xd5, 0x0e, 0xda, 0x1a, 0xd0, 0xfa, 0xbe, - 0xd3, 0xbd, 0x4f, 0x3d, 0x67, 0xe7, 0x40, 0x2c, 0x00, 0xec, 0x7c, 0x47, 0x94, 0x5a, 0xfe, 0xbe, - 0xd3, 0xb5, 0x1e, 0x62, 0xb9, 0x99, 0x42, 0x43, 0xde, 0x83, 0x71, 0x93, 0x3e, 0xf2, 0x9c, 0x40, - 0x1a, 0xa7, 0x4d, 0x87, 0x4a, 0x5c, 0x84, 0xf2, 0xb5, 0xe0, 0xf1, 0x1f, 0xea, 0xae, 0x28, 0xca, - 0xc9, 0x12, 0x17, 0x52, 0xb8, 0x11, 0xda, 0x54, 0xd4, 0xda, 0xf2, 0x83, 0x7a, 0x3f, 0x19, 0x85, - 0x5c, 0x82, 0x51, 0x94, 0x74, 0xc4, 0x5d, 0x00, 0x7d, 0xd1, 0x50, 0x76, 0x56, 0xc5, 0x30, 0xc4, - 0x40, 0x9d, 0x80, 0x7c, 0xcc, 0xf7, 0x17, 0xf2, 0x28, 0xa5, 0x2b, 0x90, 0xb8, 0x98, 0x36, 0x71, - 0x22, 0x31, 0x6d, 0x1d, 0x8a, 0x26, 0x77, 0x6b, 0x6d, 0x96, 0xbb, 0xf8, 0x62, 0xec, 0x2f, 0x00, - 0xae, 0xe4, 0xf3, 0x47, 0x87, 0xa5, 0xe7, 0x84, 0xcb, 0x6b, 0xd3, 0xb2, 0xbb, 0xfc, 0xa1, 0x59, - 0xdb, 0x46, 0xe2, 0x94, 0xe4, 0x4d, 0x18, 0x61, 0x5b, 0xaf, 0x30, 0xf8, 0x95, 0x2f, 0x6f, 0xd1, - 0x6e, 0xcc, 0x17, 0x67, 0xc3, 0xd5, 0xf6, 0x04, 0x24, 0x21, 0x16, 0x4c, 0xeb, 0xd3, 0x5d, 0xd8, - 0x7e, 0x2d, 0x44, 0xfd, 0xa9, 0x97, 0x8b, 0xe7, 0x38, 0x01, 0xb3, 0x1a, 0x08, 0x54, 0x57, 0x40, - 0x6c, 0x91, 0xae, 0x42, 0x7e, 0x73, 0xa5, 0x56, 0x73, 0xbd, 0x80, 0x5f, 0x75, 0xa2, 0x93, 0x85, - 0xc1, 0x4c, 0xbb, 0xb3, 0x4b, 0xf9, 0x59, 0x1c, 0x34, 0xba, 0x56, 0x97, 0xa1, 0xa9, 0x67, 0xb1, - 0x24, 0x25, 0x1f, 0xc2, 0xa9, 0x2d, 0x9f, 0x96, 0x3b, 0x07, 0x78, 0x3a, 0x2b, 0x4b, 0x65, 0x1a, - 0xa7, 0x1e, 0x3e, 0x28, 0xb1, 0xab, 0xa0, 0xdd, 0x39, 0xb0, 0xf8, 0xa9, 0x9e, 0xbe, 0x70, 0xd2, - 0xb9, 0x7c, 0x7a, 0xb6, 0xc4, 0xff, 0x24, 0x03, 0xca, 0x84, 0xcd, 0x9b, 0xb4, 0xe9, 0x78, 0xb4, - 0x11, 0x88, 0xc3, 0x50, 0x78, 0x6e, 0x72, 0x58, 0xcc, 0x66, 0x14, 0x61, 0xe4, 0x5d, 0x18, 0x17, - 0x9b, 0xb6, 0xd8, 0xa4, 0xe4, 0x44, 0x17, 0x4f, 0x1c, 0xdc, 0xc5, 0x37, 0xb1, 0xe1, 0x4b, 0x22, - 0xb6, 0x47, 0xde, 0x7e, 0xb0, 0xb9, 0xd2, 0xb2, 0x9d, 0xb6, 0x2f, 0x76, 0x5e, 0x5c, 0xa6, 0x1f, - 0x3d, 0x0a, 0xac, 0x06, 0x42, 0xd5, 0x3d, 0x32, 0x44, 0x35, 0x6e, 0xc9, 0x17, 0x96, 0x63, 0x0c, - 0x9f, 0x4b, 0x30, 0x7a, 0x3f, 0xd2, 0xc3, 0x2d, 0x4f, 0x1c, 0x1d, 0x96, 0x78, 0xeb, 0x4d, 0x0e, - 0x37, 0x28, 0x4c, 0x84, 0x03, 0xcd, 0x78, 0xb1, 0x1f, 0xc8, 0x6b, 0x8a, 0xf3, 0x62, 0x43, 0x6e, - 0x22, 0x94, 0x09, 0x46, 0xab, 0x9d, 0x26, 0x22, 0x64, 0x11, 0x01, 0xbb, 0x87, 0x76, 0x9a, 0x38, - 0x2f, 0xd4, 0xd6, 0x09, 0x34, 0x45, 0xfc, 0xf8, 0xf1, 0x0c, 0x4c, 0xeb, 0xa3, 0x40, 0xae, 0xc0, - 0x98, 0x70, 0xce, 0xcc, 0xa0, 0x5a, 0x93, 0x71, 0x1b, 0xe3, 0x6e, 0x99, 0x9a, 0x33, 0xa6, 0xc0, - 0x62, 0x52, 0x96, 0xe0, 0x20, 0x44, 0x0c, 0x94, 0xb2, 0x1a, 0x1c, 0x64, 0xca, 0x32, 0x62, 0xb0, - 0x8b, 0x9f, 0xdf, 0x6b, 0x05, 0xea, 0x73, 0xac, 0x87, 0x10, 0x53, 0x94, 0x18, 0xdf, 0xce, 0xc0, - 0x18, 0xdf, 0x89, 0x62, 0x86, 0x9d, 0x99, 0x93, 0x18, 0x76, 0x7e, 0x03, 0xe6, 0x4d, 0xb7, 0x45, - 0xfd, 0x72, 0xe7, 0xe0, 0xd1, 0x1e, 0xf5, 0x68, 0xcd, 0x73, 0x77, 0xe4, 0xcb, 0xf1, 0xe4, 0xd2, - 0x0b, 0xda, 0x8e, 0x97, 0x86, 0xc8, 0x9f, 0xfe, 0x3c, 0x56, 0xc2, 0xd6, 0x05, 0x16, 0xb1, 0xc5, - 0x11, 0x7b, 0x69, 0x4e, 0xad, 0xc4, 0xf8, 0x07, 0x19, 0x58, 0xec, 0xcf, 0x1a, 0xcf, 0x2b, 0xfe, - 0x67, 0x24, 0x28, 0xf0, 0xf3, 0x8a, 0x43, 0x63, 0xd6, 0xa6, 0x0a, 0x32, 0x31, 0xe1, 0x54, 0xb9, - 0xd1, 0xa0, 0xdd, 0x80, 0x31, 0x16, 0x36, 0x92, 0xa1, 0x20, 0x91, 0xe7, 0xfa, 0x0c, 0x1b, 0x11, - 0xb8, 0xdd, 0xaa, 0xb4, 0xdc, 0xc4, 0x59, 0x97, 0x4e, 0x6a, 0x1c, 0x66, 0x00, 0xea, 0xf5, 0xb5, - 0x3b, 0xf4, 0xa0, 0x66, 0x3b, 0x28, 0x19, 0xf0, 0xc5, 0x7d, 0x47, 0x2c, 0xdf, 0x82, 0xb0, 0xb5, - 0xe0, 0x7b, 0xc2, 0x3e, 0x3d, 0xd0, 0x6c, 0x2d, 0x24, 0x2a, 0x6f, 0x95, 0xf3, 0xd0, 0x0e, 0x28, - 0x23, 0x44, 0x3d, 0xb0, 0x6c, 0x15, 0x42, 0x63, 0x94, 0x0a, 0x32, 0xf9, 0x10, 0xa6, 0xa3, 0x5f, - 0xa1, 0xc5, 0xc8, 0x74, 0xb8, 0x45, 0xe8, 0x85, 0xcb, 0xcf, 0x1f, 0x1d, 0x96, 0x16, 0x15, 0xae, - 0x71, 0x5b, 0x92, 0x18, 0x33, 0xe3, 0x17, 0x33, 0x68, 0x27, 0x25, 0x1b, 0x78, 0x01, 0x46, 0x42, - 0xcb, 0xfe, 0x82, 0xd8, 0xde, 0xf5, 0x67, 0x65, 0x2c, 0x67, 0x82, 0x5c, 0xd4, 0x12, 0x3c, 0x14, - 0xf5, 0x16, 0xb0, 0x52, 0x72, 0x0b, 0xc6, 0x87, 0xfa, 0x66, 0x5c, 0x8e, 0x29, 0xdf, 0x2a, 0xa9, - 0x71, 0x14, 0x6e, 0x3f, 0xd8, 0xfc, 0xde, 0x1d, 0x85, 0x9f, 0xca, 0xc2, 0x0c, 0xeb, 0xd7, 0x72, - 0x2f, 0xd8, 0x73, 0x3d, 0x27, 0x38, 0x78, 0x6a, 0x35, 0xd2, 0x6f, 0x6b, 0x97, 0xbd, 0x45, 0x79, - 0x8e, 0xa9, 0x6d, 0x1b, 0x4a, 0x31, 0xfd, 0xdf, 0x8e, 0xc2, 0x5c, 0x0a, 0x15, 0x79, 0x5d, 0x7b, - 0xe6, 0x5a, 0x90, 0x81, 0x2a, 0xbe, 0x7b, 0x58, 0x2a, 0x48, 0xf4, 0xcd, 0x28, 0x70, 0xc5, 0x92, - 0x6e, 0x74, 0xc8, 0x7b, 0x0a, 0x5f, 0xbd, 0x54, 0xa3, 0x43, 0xdd, 0xd4, 0xf0, 0x12, 0x8c, 0xe2, - 0xce, 0x24, 0x0c, 0x6d, 0x51, 0x94, 0xc3, 0xbd, 0x4e, 0x33, 0x2c, 0x62, 0x00, 0xb2, 0x06, 0xe3, - 0xec, 0x8f, 0xbb, 0x76, 0x57, 0xbc, 0x39, 0x93, 0x50, 0xdd, 0x80, 0xd0, 0xae, 0xd3, 0xd9, 0x55, - 0x35, 0x0e, 0x2d, 0x6a, 0xb5, 0xed, 0xae, 0x26, 0x73, 0x72, 0x44, 0x4d, 0x73, 0x91, 0xef, 0xaf, - 0xb9, 0xc8, 0x1c, 0xab, 0xb9, 0xd8, 0x01, 0xa8, 0x3b, 0xbb, 0x1d, 0xa7, 0xb3, 0x5b, 0x6e, 0xed, - 0x8a, 0x70, 0x1f, 0x97, 0xfa, 0x8f, 0xc2, 0x95, 0x08, 0x19, 0x27, 0xee, 0xb3, 0x68, 0x18, 0xc2, - 0x61, 0x96, 0xdd, 0xda, 0xd5, 0xfc, 0xfb, 0x14, 0xce, 0x64, 0x03, 0xa0, 0xdc, 0x08, 0x9c, 0x87, - 0x6c, 0x0a, 0xfb, 0x42, 0x40, 0x94, 0x9f, 0xbc, 0x52, 0xbe, 0x43, 0x0f, 0xf0, 0x52, 0x23, 0x9f, - 0xd8, 0x6d, 0x44, 0x65, 0x2b, 0x41, 0x73, 0xde, 0x8a, 0x38, 0x90, 0x2e, 0x9c, 0x2a, 0x37, 0x9b, - 0x0e, 0x6b, 0x83, 0xdd, 0xda, 0xe4, 0x81, 0x5a, 0x90, 0x75, 0x21, 0x9d, 0xf5, 0x25, 0xf9, 0x2a, - 0x6c, 0x87, 0x54, 0x96, 0x8c, 0xef, 0x12, 0xab, 0x26, 0x9d, 0xb1, 0x51, 0x87, 0x69, 0xbd, 0xf1, - 0x7a, 0x98, 0x92, 0x02, 0xe4, 0xcd, 0x7a, 0xd9, 0xaa, 0xaf, 0x95, 0xaf, 0x15, 0x33, 0xa4, 0x08, - 0x05, 0xf1, 0x6b, 0xc9, 0x5a, 0x7a, 0xe3, 0x46, 0x31, 0xab, 0x41, 0xde, 0xb8, 0xb6, 0x54, 0xcc, - 0x2d, 0x66, 0x17, 0x32, 0x31, 0xd7, 0xde, 0xf1, 0x62, 0x9e, 0x2b, 0x9b, 0x8d, 0x5f, 0xc9, 0x40, - 0x5e, 0x7e, 0x3b, 0xb9, 0x01, 0xb9, 0x7a, 0x7d, 0x2d, 0xe6, 0x1c, 0x1b, 0x9d, 0x32, 0x7c, 0x3f, - 0xf5, 0x7d, 0xd5, 0x03, 0x82, 0x11, 0x30, 0xba, 0xcd, 0xf5, 0xba, 0x90, 0xd7, 0x24, 0x5d, 0xb4, - 0x79, 0x73, 0xba, 0x14, 0x8f, 0xc1, 0x1b, 0x90, 0xbb, 0xfd, 0x60, 0x53, 0x5c, 0xdf, 0x24, 0x5d, - 0xb4, 0x9f, 0x72, 0xba, 0x8f, 0x1e, 0xa9, 0xbb, 0x3c, 0x23, 0x30, 0x4c, 0x98, 0x54, 0x26, 0x32, - 0x17, 0x50, 0xda, 0x6e, 0x18, 0x9b, 0x43, 0x08, 0x28, 0x0c, 0x62, 0x8a, 0x12, 0x26, 0xb6, 0xad, - 0xbb, 0x0d, 0xbb, 0x25, 0x24, 0x1d, 0x14, 0xdb, 0x5a, 0x0c, 0x60, 0x72, 0xb8, 0xf1, 0x9b, 0x19, - 0x28, 0xd6, 0x3c, 0x97, 0xc7, 0x0f, 0xd9, 0x74, 0xf7, 0x69, 0xe7, 0xfe, 0x35, 0x72, 0x59, 0x2e, - 0xb9, 0x4c, 0xa8, 0x42, 0x1b, 0xc5, 0x25, 0x17, 0x7b, 0x87, 0x14, 0xcb, 0x4e, 0x09, 0x7f, 0x92, - 0x1d, 0x3e, 0x6c, 0xc2, 0x31, 0xe1, 0x4f, 0x4a, 0x30, 0x8a, 0x9f, 0x23, 0x36, 0x47, 0xfc, 0xf2, - 0x80, 0x01, 0x4c, 0x0e, 0x57, 0xf6, 0xa6, 0xc3, 0x6c, 0xa2, 0x0d, 0x4b, 0xdf, 0x53, 0xa1, 0x07, - 0xf4, 0xc6, 0xf5, 0xdf, 0xaf, 0xc9, 0x9d, 0x3e, 0xa1, 0x07, 0x62, 0x0c, 0xb8, 0xe7, 0xe0, 0x12, - 0x7f, 0x9e, 0xe0, 0xfe, 0x37, 0xaa, 0x12, 0x2a, 0xe1, 0xc9, 0xfc, 0x01, 0xcc, 0xc7, 0xfb, 0x17, - 0x75, 0xa5, 0x65, 0x98, 0xd1, 0xe1, 0x52, 0x6d, 0x7a, 0x26, 0xb5, 0xde, 0xfb, 0x4b, 0x66, 0x1c, - 0xdf, 0xf8, 0x5f, 0x33, 0x30, 0x81, 0x7f, 0x9a, 0x3d, 0x2e, 0x6d, 0x96, 0x1f, 0xd4, 0x85, 0x06, - 0x47, 0x95, 0x36, 0xed, 0x47, 0xbe, 0x34, 0xed, 0xd3, 0x36, 0xac, 0x10, 0x59, 0x90, 0xf2, 0x67, - 0x18, 0xa9, 0x3b, 0x0c, 0x49, 0xf9, 0x7b, 0x8d, 0x1f, 0x23, 0x15, 0xc8, 0x68, 0xcc, 0xce, 0xc5, - 0x5f, 0xd5, 0xd0, 0x0a, 0xe9, 0xdc, 0x96, 0x6e, 0xcc, 0xce, 0xd1, 0xd0, 0xce, 0xea, 0x41, 0x9d, - 0x49, 0xc4, 0xaa, 0x9d, 0x15, 0xfb, 0x46, 0x4d, 0x1a, 0x16, 0x48, 0xc6, 0xaf, 0x4f, 0xc5, 0x3b, - 0x50, 0x9c, 0x9e, 0x27, 0x5c, 0x68, 0x6f, 0xc1, 0x68, 0xb9, 0xd5, 0x72, 0x1f, 0x89, 0x2d, 0x47, - 0x5e, 0xb0, 0xc3, 0xfe, 0xe3, 0x87, 0x23, 0x6a, 0x1f, 0x35, 0x27, 0x67, 0x06, 0x20, 0x2b, 0x30, - 0x51, 0x7e, 0x50, 0xaf, 0x56, 0x2b, 0x9b, 0x9b, 0xdc, 0xa1, 0x33, 0xb7, 0xfc, 0xb2, 0xec, 0x1f, - 0xc7, 0x69, 0x5a, 0x71, 0x43, 0x90, 0xe8, 0xe2, 0x14, 0xd1, 0x91, 0x77, 0x00, 0x6e, 0xbb, 0x4e, - 0x87, 0x6b, 0x5b, 0x45, 0xe3, 0xcf, 0x1d, 0x1d, 0x96, 0x26, 0x3f, 0x72, 0x9d, 0x8e, 0x50, 0xcf, - 0xb2, 0x6f, 0x8f, 0x90, 0x4c, 0xe5, 0x6f, 0xd6, 0xd3, 0xcb, 0x2e, 0x37, 0x10, 0x1d, 0x8d, 0x7a, - 0x7a, 0xdb, 0x4d, 0xa8, 0x05, 0x25, 0x1a, 0x69, 0xc3, 0x4c, 0xbd, 0xb7, 0xbb, 0x4b, 0xd9, 0x31, - 0x21, 0xd4, 0x5e, 0x63, 0xe2, 0x4a, 0x1e, 0x46, 0xff, 0xe2, 0x17, 0x41, 0x76, 0x0b, 0xf5, 0x97, - 0x5f, 0x67, 0xab, 0xe2, 0x3b, 0x87, 0x25, 0x61, 0x60, 0xc2, 0xe4, 0x3e, 0x5f, 0xd2, 0x27, 0x95, - 0x5e, 0x71, 0xde, 0xe4, 0x1e, 0x8c, 0xf1, 0xa7, 0x2d, 0xe1, 0xa0, 0xf8, 0xc2, 0x80, 0x15, 0xc8, - 0x11, 0xfb, 0x3d, 0x9e, 0xf2, 0x52, 0xf2, 0x00, 0xf2, 0x2b, 0x8e, 0xd7, 0x68, 0xd1, 0x95, 0xaa, - 0x10, 0x24, 0x5e, 0x1c, 0xc0, 0x52, 0xa2, 0xf2, 0x7e, 0x69, 0xe0, 0xaf, 0x86, 0xa3, 0x0a, 0x16, - 0x12, 0x83, 0xfc, 0xd5, 0x0c, 0x3c, 0x1b, 0x7e, 0x7d, 0x79, 0x97, 0x76, 0x82, 0xbb, 0x76, 0xd0, - 0xd8, 0xa3, 0x9e, 0xe8, 0xa5, 0x89, 0x41, 0xbd, 0xf4, 0x85, 0x44, 0x2f, 0x5d, 0x8c, 0x7a, 0xc9, - 0x66, 0xcc, 0xac, 0x36, 0xe7, 0x96, 0xec, 0xb3, 0x41, 0xb5, 0x12, 0x0b, 0x20, 0x7a, 0xb4, 0x15, - 0x96, 0x6a, 0x2f, 0x0f, 0x68, 0x70, 0x84, 0x2c, 0x1c, 0xd3, 0xc2, 0xdf, 0x9a, 0x65, 0x75, 0x08, - 0x25, 0x77, 0xa4, 0x37, 0x30, 0x17, 0x71, 0xce, 0x0f, 0xe0, 0xcd, 0x3d, 0x84, 0xe7, 0x06, 0xf8, - 0xfd, 0xf3, 0xd1, 0x5e, 0xb7, 0xb7, 0x85, 0x54, 0x73, 0xcc, 0x68, 0xaf, 0xdb, 0xd1, 0x68, 0xb7, - 0xec, 0xf8, 0x68, 0xaf, 0xdb, 0xdb, 0x64, 0x85, 0x87, 0x30, 0xe0, 0xfe, 0xee, 0xcf, 0x0f, 0xe2, - 0xb6, 0x52, 0xe3, 0xc7, 0x7c, 0x4a, 0x28, 0x83, 0x2f, 0xc3, 0x44, 0xbd, 0x6b, 0x37, 0x68, 0xcb, - 0xd9, 0x09, 0x84, 0x45, 0xc0, 0x4b, 0x03, 0x58, 0x85, 0xb8, 0xe2, 0x05, 0x58, 0xfe, 0x54, 0xef, - 0x5c, 0x21, 0x0e, 0xfb, 0xc2, 0xcd, 0xda, 0x5d, 0x61, 0x14, 0x30, 0xe8, 0x0b, 0x37, 0x6b, 0x77, - 0x85, 0x00, 0xd3, 0x6d, 0x6b, 0x02, 0x4c, 0xed, 0x2e, 0xe9, 0xc2, 0xf4, 0x26, 0xf5, 0x3c, 0x7b, - 0xc7, 0xf5, 0xda, 0x5c, 0xcd, 0xca, 0x7d, 0x28, 0x2f, 0x0d, 0xe2, 0xa7, 0x11, 0x70, 0xed, 0x62, - 0x20, 0x61, 0x56, 0x5c, 0x37, 0x1b, 0xe3, 0xcf, 0xfa, 0x64, 0xd9, 0x09, 0xb6, 0x7b, 0x8d, 0x7d, - 0x1a, 0x2c, 0xcc, 0x1e, 0xdb, 0x27, 0x21, 0x2e, 0xef, 0x93, 0x6d, 0xf9, 0x53, 0xed, 0x93, 0x10, - 0x87, 0x4d, 0x03, 0x11, 0xa8, 0x80, 0x1c, 0x3b, 0x0d, 0x38, 0x22, 0x9f, 0x06, 0xfd, 0x22, 0x16, - 0x90, 0x3d, 0x28, 0x2c, 0xbb, 0xbd, 0x0e, 0x93, 0x6b, 0xbb, 0xb6, 0xe3, 0x2d, 0xcc, 0x21, 0xdb, - 0x57, 0x06, 0x7d, 0xb0, 0x82, 0xce, 0xed, 0xef, 0xb7, 0x19, 0x84, 0x89, 0xce, 0x0c, 0xa4, 0x3e, - 0x98, 0xa8, 0xa8, 0xa4, 0x09, 0x93, 0x38, 0x95, 0x2b, 0xf4, 0xa1, 0xdb, 0xf5, 0x17, 0xe6, 0xb1, - 0xa2, 0x0b, 0xc7, 0x2d, 0x0a, 0x8e, 0xcd, 0x5f, 0xe6, 0x71, 0x69, 0x58, 0x4d, 0x84, 0xa8, 0x5a, - 0x6c, 0x05, 0xd1, 0xf8, 0xc7, 0xa3, 0x50, 0x3a, 0x86, 0x19, 0xb9, 0x2f, 0xcf, 0x26, 0x2e, 0x01, - 0xbc, 0x36, 0xdc, 0x37, 0x5c, 0x39, 0xf6, 0xd8, 0x7a, 0x0b, 0xa6, 0xef, 0x29, 0x46, 0x02, 0xa1, - 0xd1, 0x06, 0xd2, 0xa8, 0xe6, 0x03, 0x96, 0xd3, 0x34, 0x63, 0xa8, 0x8b, 0x7f, 0x9c, 0x83, 0x11, - 0x14, 0x2c, 0x5e, 0x84, 0x5c, 0xbd, 0xb7, 0xad, 0x3e, 0x74, 0xf9, 0xda, 0x76, 0xcd, 0x4a, 0xc9, - 0xdb, 0x30, 0x29, 0xdc, 0x71, 0x94, 0xdb, 0x29, 0x76, 0x92, 0xf4, 0xdd, 0x89, 0xfb, 0x42, 0x28, - 0xe8, 0xe4, 0x3d, 0x28, 0xd4, 0x9c, 0x2e, 0x6d, 0x39, 0x1d, 0xaa, 0x58, 0xf6, 0xe3, 0x58, 0x76, - 0x05, 0x3c, 0xf1, 0xf8, 0xa5, 0x12, 0xe8, 0x8e, 0x43, 0x23, 0xc3, 0x3b, 0x0e, 0xbd, 0x07, 0x85, - 0x0a, 0xdd, 0x71, 0x3a, 0x8e, 0xe8, 0x9f, 0xd1, 0xa8, 0xe2, 0x66, 0x08, 0xd7, 0xa9, 0x35, 0x02, - 0xb2, 0x0c, 0x53, 0x26, 0xed, 0xba, 0xbe, 0x13, 0xb8, 0xde, 0xc1, 0x96, 0x59, 0x15, 0x06, 0x25, - 0xa8, 0xa0, 0xf3, 0xc2, 0x02, 0xab, 0xe7, 0xa9, 0x27, 0x91, 0x4e, 0x42, 0x36, 0x60, 0x36, 0x02, - 0xe8, 0x86, 0x58, 0xe2, 0xa5, 0x23, 0xe4, 0x93, 0x34, 0xa1, 0x4e, 0x92, 0xea, 0xdf, 0x64, 0xd2, - 0x1d, 0x61, 0x90, 0x1d, 0xff, 0x26, 0x8f, 0xee, 0xa4, 0x7f, 0x93, 0x49, 0x77, 0x8c, 0x5f, 0xcb, - 0xc1, 0x99, 0x3e, 0x5b, 0x1b, 0xd9, 0xd0, 0xa7, 0xeb, 0x8b, 0x83, 0x77, 0xc2, 0xe3, 0xa7, 0xe9, - 0x3a, 0x14, 0x57, 0xef, 0xe0, 0x85, 0x9e, 0xbf, 0x23, 0xaf, 0x94, 0xa5, 0x10, 0x8a, 0xcd, 0xa7, - 0xfb, 0xe8, 0x8c, 0x21, 0xdf, 0x9f, 0x1b, 0x5a, 0xd0, 0x94, 0x04, 0xe5, 0xe2, 0x0f, 0x65, 0xc5, - 0xbc, 0x8d, 0x45, 0xb8, 0xcc, 0x9c, 0x28, 0xc2, 0xe5, 0x17, 0xa1, 0xb0, 0x7a, 0x87, 0xab, 0xdb, - 0xd6, 0x6c, 0x7f, 0x4f, 0xcc, 0x29, 0xec, 0x42, 0xba, 0x2f, 0xdf, 0x4d, 0xf6, 0x6c, 0xed, 0x62, - 0xab, 0x51, 0x90, 0x2d, 0x98, 0xe3, 0xdf, 0xe6, 0xec, 0x38, 0x0d, 0x1e, 0x28, 0xcf, 0xb1, 0x5b, - 0x62, 0x86, 0xbd, 0x78, 0x74, 0x58, 0x2a, 0xd1, 0x7d, 0x74, 0x33, 0x11, 0xe5, 0x96, 0x8f, 0x08, - 0xaa, 0xbf, 0x49, 0x0a, 0xbd, 0x1a, 0x76, 0xcb, 0x9c, 0xc0, 0x0a, 0x59, 0x6d, 0xac, 0x6e, 0x86, - 0xcb, 0x91, 0x8c, 0x3f, 0x1c, 0x85, 0xc5, 0xfe, 0x62, 0x17, 0x79, 0x5f, 0x1f, 0xc0, 0x0b, 0xc7, - 0x0a, 0x6a, 0xc7, 0x8f, 0xe1, 0x97, 0x60, 0x7e, 0xb5, 0x13, 0x50, 0xaf, 0xeb, 0x39, 0x32, 0x5c, - 0xd7, 0x9a, 0xeb, 0x4b, 0xb7, 0x1e, 0x54, 0xb2, 0xd3, 0xb0, 0x5c, 0x38, 0xa8, 0xa1, 0x8f, 0x94, - 0xaa, 0x64, 0x4f, 0xe3, 0x40, 0x56, 0x61, 0x5a, 0x81, 0xb7, 0x7a, 0xbb, 0xea, 0xe3, 0xb8, 0xca, - 0xb3, 0xd5, 0x53, 0x7d, 0x1e, 0x62, 0x44, 0xe8, 0x3a, 0x14, 0xd8, 0x81, 0xd3, 0xb8, 0xfd, 0xe0, - 0x4e, 0x5d, 0x0c, 0x27, 0x77, 0x1d, 0x42, 0xa8, 0xf5, 0xd1, 0xa3, 0x7d, 0x4d, 0x6e, 0x8a, 0x90, - 0x17, 0x7f, 0xf1, 0x44, 0x3b, 0xe1, 0xe7, 0x01, 0xa2, 0xa5, 0xa4, 0xba, 0xde, 0x47, 0x4b, 0x4f, - 0xf7, 0x0e, 0x94, 0x50, 0xb2, 0x06, 0x33, 0xd1, 0xaf, 0x7b, 0x8f, 0x3a, 0xd4, 0x13, 0x4d, 0x45, - 0x15, 0xac, 0xb2, 0x72, 0x5d, 0x56, 0xa6, 0x8a, 0xe2, 0x31, 0x32, 0xb2, 0x04, 0xf9, 0x07, 0xae, - 0xb7, 0xbf, 0xc3, 0xc6, 0x78, 0x24, 0xba, 0x2c, 0x3c, 0x12, 0x30, 0x55, 0x28, 0x96, 0x78, 0x6c, - 0xb9, 0xac, 0x76, 0x1e, 0x3a, 0x9e, 0x8b, 0x06, 0x05, 0xaa, 0x49, 0x1d, 0x8d, 0xc0, 0x5a, 0xd0, - 0x93, 0x08, 0x4c, 0x2e, 0xc1, 0x68, 0xb9, 0x11, 0xb8, 0x9e, 0xd8, 0xfe, 0xf8, 0x4c, 0x61, 0x00, - 0x6d, 0xa6, 0x30, 0x00, 0xeb, 0x44, 0xb6, 0x27, 0x8d, 0x47, 0x9d, 0xa8, 0x6f, 0x44, 0xac, 0x94, - 0x5d, 0x76, 0x4c, 0xba, 0x83, 0xda, 0x51, 0x2d, 0x7e, 0xeb, 0x4e, 0x42, 0xaf, 0x2e, 0xd0, 0x8c, - 0x1f, 0x86, 0xbe, 0x53, 0x9e, 0x49, 0x97, 0x27, 0x9b, 0xf2, 0xeb, 0xf6, 0x10, 0x53, 0xfe, 0xf5, - 0xd0, 0xe7, 0x50, 0x0d, 0x63, 0x84, 0x10, 0x55, 0xae, 0x11, 0xde, 0x87, 0xfa, 0xfc, 0xcb, 0x9d, - 0x64, 0xfe, 0xfd, 0xbd, 0xfc, 0x49, 0xe6, 0x9f, 0xe8, 0xdf, 0xec, 0xb0, 0xfd, 0x9b, 0x1b, 0xaa, - 0x7f, 0xd9, 0xa1, 0x12, 0x06, 0x0f, 0xae, 0xd9, 0x81, 0xb6, 0x23, 0x86, 0x11, 0x9f, 0xad, 0xae, - 0xad, 0x05, 0xd8, 0xd3, 0x49, 0x14, 0x21, 0x01, 0x39, 0x8c, 0x26, 0x85, 0x84, 0x18, 0xbd, 0x8a, - 0xce, 0x36, 0x02, 0x79, 0xe6, 0xd7, 0xd1, 0x83, 0x4d, 0x4c, 0x36, 0x6e, 0x6e, 0x22, 0xc5, 0x04, - 0xee, 0xdc, 0xa6, 0xbd, 0x4f, 0x68, 0x44, 0xf1, 0x79, 0x3e, 0x7e, 0xa2, 0x79, 0xce, 0x2d, 0xac, - 0xbd, 0x75, 0x77, 0xd7, 0x91, 0x7e, 0x4e, 0xd2, 0xc2, 0xda, 0xb3, 0x5a, 0x0c, 0x1a, 0xb3, 0xb0, - 0xe6, 0xa8, 0xe4, 0x32, 0x8c, 0xb1, 0x1f, 0xd5, 0x8a, 0xb0, 0x81, 0x40, 0xa5, 0x07, 0x12, 0xe9, - 0xce, 0x65, 0x1c, 0x49, 0x56, 0xb3, 0xda, 0xb6, 0x9d, 0x96, 0x08, 0x74, 0x13, 0x55, 0x43, 0x19, - 0x34, 0x5e, 0x0d, 0xa2, 0x92, 0x06, 0x14, 0x4c, 0xba, 0x53, 0xf3, 0xdc, 0x80, 0x36, 0x02, 0xda, - 0x14, 0x17, 0x3d, 0xa9, 0xeb, 0x58, 0x76, 0x5d, 0x7e, 0x89, 0x45, 0x3f, 0xa4, 0xcc, 0x77, 0x0e, - 0x4b, 0xc0, 0x40, 0xdc, 0x73, 0x91, 0x89, 0x3c, 0x6c, 0xfc, 0xbb, 0x92, 0x58, 0x3d, 0xd8, 0x54, - 0xa6, 0xe4, 0x1b, 0x6c, 0xab, 0x0f, 0xbb, 0x24, 0xaa, 0xac, 0xd0, 0xa7, 0xb2, 0x37, 0x52, 0x2b, - 0x2b, 0x29, 0xbd, 0x9d, 0x5a, 0x69, 0x6a, 0x25, 0xe4, 0x1d, 0x98, 0x5c, 0xa9, 0xae, 0xb8, 0x9d, - 0x1d, 0x67, 0xb7, 0xbe, 0x56, 0xc6, 0xdb, 0xa2, 0x90, 0xd7, 0x1a, 0x8e, 0xd5, 0x40, 0xb8, 0xe5, - 0xef, 0xd9, 0x5a, 0xec, 0x85, 0x08, 0x9f, 0xdc, 0x82, 0x69, 0xf9, 0xd3, 0xa4, 0x3b, 0x4c, 0x5e, - 0x9b, 0x56, 0x3c, 0x9d, 0x43, 0x0e, 0xac, 0x23, 0x74, 0x91, 0x2d, 0x46, 0xc6, 0x26, 0x63, 0x85, - 0x76, 0x5b, 0xee, 0x01, 0xfb, 0xbc, 0x4d, 0x87, 0x7a, 0x78, 0x2d, 0x14, 0x93, 0xb1, 0x19, 0x96, - 0x58, 0x81, 0xa3, 0x5b, 0x7e, 0xe8, 0x44, 0x4c, 0xf4, 0x13, 0x53, 0xfc, 0xbe, 0xe3, 0x3b, 0xdb, - 0x4e, 0xcb, 0x09, 0x0e, 0xf0, 0x42, 0x28, 0x64, 0x1f, 0xb9, 0x2e, 0x1e, 0x86, 0xa5, 0xaa, 0xe8, - 0x97, 0x20, 0x35, 0x7e, 0x25, 0x0b, 0xcf, 0x0d, 0x52, 0x8e, 0x90, 0xba, 0xbe, 0x0f, 0x5e, 0x1c, - 0x42, 0xa1, 0x72, 0xfc, 0x4e, 0xb8, 0xda, 0xe7, 0x9e, 0x81, 0x9d, 0x11, 0xbb, 0x67, 0xa8, 0x9d, - 0x11, 0xbb, 0x71, 0x3c, 0x14, 0xdb, 0xdc, 0xc7, 0x8d, 0x02, 0x70, 0x03, 0x26, 0x56, 0xdc, 0x4e, - 0x40, 0x1f, 0x07, 0xb1, 0x98, 0x37, 0x1c, 0x18, 0x8f, 0x80, 0x20, 0x51, 0x8d, 0x7f, 0x9f, 0x85, - 0x73, 0x03, 0xb5, 0x03, 0x64, 0x53, 0xef, 0xb5, 0x4b, 0xc3, 0xa8, 0x14, 0x8e, 0xef, 0xb6, 0xa5, - 0x84, 0xc5, 0xf0, 0xb1, 0x5e, 0xaa, 0x8b, 0xff, 0x7d, 0x46, 0x74, 0xd2, 0x67, 0x60, 0x1c, 0xab, - 0x0a, 0xbb, 0x88, 0x6b, 0xe1, 0x71, 0x17, 0x76, 0x74, 0x2d, 0x3c, 0x47, 0x23, 0xd7, 0x21, 0xbf, - 0x62, 0xb7, 0x5a, 0x4a, 0x44, 0x20, 0xbc, 0xe0, 0x37, 0x10, 0x16, 0x33, 0x7b, 0x97, 0x88, 0xec, - 0xd8, 0xe2, 0x7f, 0x2b, 0x67, 0x05, 0x6e, 0x96, 0x82, 0x2c, 0x76, 0x5c, 0x28, 0xc8, 0x18, 0xfe, - 0xbc, 0xe1, 0x86, 0x31, 0x47, 0x78, 0xf8, 0x73, 0x06, 0xd0, 0xc2, 0x9f, 0x33, 0x80, 0xf1, 0xab, - 0x39, 0x78, 0x7e, 0xb0, 0x8a, 0x8b, 0x6c, 0xe9, 0x43, 0xf0, 0xea, 0x50, 0x8a, 0xb1, 0xe3, 0xc7, - 0x40, 0x26, 0x13, 0xe0, 0x1d, 0x72, 0x31, 0xe9, 0x6a, 0xf8, 0xdd, 0xc3, 0x92, 0xe2, 0x4b, 0x71, - 0xdb, 0x75, 0x3a, 0xca, 0x9b, 0xec, 0xd7, 0x13, 0x87, 0xfa, 0xe4, 0xd2, 0x8d, 0xe1, 0xbe, 0x2c, - 0xa2, 0xe3, 0xfb, 0xca, 0xb0, 0xc2, 0xc0, 0x17, 0xa0, 0x18, 0x27, 0x25, 0x17, 0x60, 0x04, 0x3f, - 0x40, 0xf1, 0x97, 0x8c, 0x71, 0xc0, 0xf2, 0xc5, 0xbb, 0x62, 0xee, 0x60, 0x90, 0x24, 0xd5, 0xa1, - 0x5f, 0x50, 0x8a, 0x20, 0x49, 0x5a, 0x34, 0x00, 0x3d, 0x48, 0x92, 0x4a, 0x64, 0xfc, 0x49, 0x06, - 0xce, 0xf6, 0xd5, 0x51, 0x90, 0x9a, 0x3e, 0x60, 0x2f, 0x1f, 0xa7, 0xd4, 0x38, 0x76, 0xac, 0x16, - 0x7f, 0x42, 0xce, 0xfd, 0x77, 0xa1, 0x50, 0xef, 0x6d, 0xc7, 0xaf, 0x76, 0x3c, 0x84, 0x99, 0x02, - 0x57, 0x4f, 0x30, 0x15, 0x9f, 0xb5, 0x5f, 0x7a, 0xc1, 0x0b, 0xd3, 0x45, 0xc5, 0x5e, 0x3a, 0x8c, - 0xe2, 0x91, 0x0c, 0x12, 0xa5, 0x13, 0x19, 0xbf, 0x9c, 0x4d, 0xbf, 0x23, 0xdf, 0x5a, 0xa9, 0x9d, - 0xe4, 0x8e, 0x7c, 0x6b, 0xa5, 0x76, 0x7c, 0xdb, 0xff, 0x2b, 0xd9, 0x76, 0x6e, 0x54, 0xc4, 0x77, - 0x3c, 0xf9, 0xf6, 0x21, 0x8d, 0x8a, 0xc4, 0xee, 0xe8, 0xc7, 0x8c, 0x8a, 0x04, 0x32, 0x79, 0x03, - 0x26, 0xd6, 0x5d, 0x1e, 0xbf, 0x49, 0xb6, 0x98, 0x87, 0xb9, 0x90, 0x40, 0x75, 0x7b, 0x0c, 0x31, - 0xd9, 0xb5, 0x44, 0x1f, 0x78, 0x69, 0x16, 0x8e, 0xd7, 0x92, 0xd8, 0x74, 0xd1, 0x5f, 0x08, 0x74, - 0x32, 0xe3, 0x1f, 0x8d, 0x82, 0x71, 0xbc, 0x7e, 0x93, 0x7c, 0xa0, 0xf7, 0xdd, 0x95, 0xa1, 0x35, - 0xa3, 0x43, 0x6d, 0xb9, 0xe5, 0x5e, 0xd3, 0xa1, 0x9d, 0x86, 0x1e, 0x7c, 0x49, 0xc0, 0xd4, 0x2d, - 0x50, 0xe2, 0x7d, 0x9c, 0x60, 0x02, 0x8b, 0xff, 0x32, 0x17, 0x2d, 0xb5, 0xd8, 0xd1, 0x98, 0xf9, - 0x18, 0x47, 0x23, 0xb9, 0x03, 0x45, 0x15, 0xa2, 0xe8, 0xd8, 0x50, 0x72, 0xd1, 0x18, 0xc5, 0x3e, - 0x2a, 0x41, 0xa8, 0x9f, 0xaf, 0xb9, 0xe1, 0xcf, 0xd7, 0x98, 0x8e, 0x6f, 0xe4, 0x64, 0x3a, 0x3e, - 0x11, 0xac, 0xc9, 0x17, 0x87, 0xd6, 0xa8, 0x1e, 0xac, 0x29, 0xe5, 0xe0, 0x52, 0xd1, 0x65, 0xbc, - 0x29, 0xfc, 0xa9, 0x84, 0x5b, 0x09, 0xe3, 0x4d, 0x71, 0xfa, 0xb4, 0x78, 0x53, 0x21, 0x09, 0x3b, - 0x00, 0xcd, 0x5e, 0x87, 0xe7, 0xd9, 0x18, 0x8f, 0x0e, 0x40, 0xaf, 0xd7, 0xb1, 0xe2, 0xb9, 0x36, - 0x42, 0x44, 0xe3, 0x9f, 0x8e, 0xa4, 0x0b, 0x07, 0x91, 0x0a, 0xfc, 0x04, 0xc2, 0x41, 0x48, 0xf4, - 0xe9, 0xcc, 0xd4, 0x2d, 0x98, 0x93, 0x96, 0xc5, 0x58, 0x7b, 0x93, 0x7a, 0x5b, 0xe6, 0xba, 0x18, - 0x62, 0x54, 0x39, 0x85, 0x36, 0xc9, 0x5d, 0x51, 0x6e, 0xf5, 0x3c, 0x4d, 0xe5, 0x94, 0x42, 0xbf, - 0xf8, 0x4f, 0xa4, 0x46, 0x4d, 0x1d, 0x04, 0xf4, 0x02, 0xcf, 0xa4, 0x0d, 0x42, 0xaf, 0xa7, 0x0d, - 0xa3, 0x4e, 0xc2, 0xf7, 0xde, 0x50, 0xfb, 0xb9, 0xa5, 0xcb, 0x8a, 0xaa, 0xc6, 0x54, 0xe7, 0x12, - 0x23, 0x22, 0xbb, 0x70, 0x36, 0x12, 0xa5, 0x95, 0x9b, 0x02, 0x72, 0xe4, 0x0d, 0xbe, 0x74, 0x74, - 0x58, 0x7a, 0x59, 0x11, 0xc5, 0xd5, 0x0b, 0x47, 0x8c, 0x7b, 0x7f, 0x5e, 0x6c, 0xbf, 0x5d, 0xf6, - 0xec, 0x4e, 0x63, 0x4f, 0x99, 0xf3, 0xb8, 0xdf, 0x6e, 0x23, 0x34, 0x11, 0x72, 0x26, 0x42, 0x36, - 0xfe, 0x76, 0x36, 0x5d, 0x25, 0x21, 0x5e, 0x3a, 0x4e, 0xa0, 0x92, 0xe0, 0x14, 0xc7, 0x9f, 0x12, - 0xff, 0x48, 0x9e, 0x12, 0x2f, 0xc3, 0xf8, 0x26, 0xed, 0xd8, 0x9d, 0x30, 0x94, 0x13, 0x5a, 0x5c, - 0x04, 0x1c, 0x64, 0xca, 0x32, 0xf2, 0x3e, 0x90, 0x9a, 0xed, 0xd1, 0x4e, 0xb0, 0xe2, 0xb6, 0xbb, - 0xb6, 0x17, 0xb4, 0x31, 0x13, 0x09, 0x3f, 0x1a, 0x5e, 0x38, 0x3a, 0x2c, 0x9d, 0xeb, 0x62, 0xa9, - 0xd5, 0x50, 0x8a, 0xd5, 0x88, 0x80, 0x49, 0x62, 0x72, 0x15, 0xc6, 0xa5, 0x21, 0x41, 0x2e, 0x8a, - 0xee, 0x98, 0x34, 0x22, 0x90, 0x58, 0xc6, 0xbf, 0x1c, 0x85, 0xf3, 0xc7, 0x3d, 0xeb, 0x90, 0x1d, - 0x80, 0x7b, 0x9d, 0x6d, 0xd7, 0xf6, 0x9a, 0x4e, 0x67, 0x57, 0xf8, 0x5c, 0xde, 0x18, 0xf2, 0x4d, - 0xe8, 0x4a, 0x44, 0xc9, 0x0a, 0xb9, 0x87, 0xab, 0x1b, 0xc2, 0x4c, 0x85, 0x33, 0xf9, 0x2a, 0xe4, - 0x4d, 0xda, 0x70, 0x1f, 0x52, 0xa1, 0xba, 0x9b, 0x5c, 0xfa, 0xec, 0xb0, 0xb5, 0x48, 0x3a, 0xac, - 0x03, 0x5d, 0xff, 0x3c, 0x01, 0x31, 0x43, 0x9e, 0xe4, 0x6b, 0x30, 0xc9, 0x13, 0xce, 0x94, 0x77, - 0x02, 0xa1, 0xde, 0x3b, 0x3e, 0x74, 0x47, 0x86, 0x6d, 0x92, 0x3c, 0x85, 0x8d, 0x65, 0xef, 0x68, - 0xae, 0x04, 0x3c, 0x74, 0x87, 0xc2, 0x72, 0xf1, 0x3f, 0xcb, 0xc2, 0xb4, 0xde, 0x60, 0xb2, 0x0e, - 0xc5, 0x6a, 0xc7, 0x09, 0x1c, 0xbb, 0xa5, 0x9b, 0x9a, 0x8a, 0x3b, 0xa6, 0xc3, 0xcb, 0xac, 0x54, - 0x93, 0xd3, 0x04, 0x25, 0x9b, 0x33, 0x6c, 0xe8, 0xfc, 0x80, 0x5b, 0x38, 0xf0, 0x48, 0xab, 0x62, - 0x11, 0xbf, 0xc0, 0x03, 0xfb, 0x46, 0xa5, 0x16, 0x8f, 0x6d, 0xac, 0x47, 0x91, 0x8c, 0x13, 0x93, - 0x87, 0x40, 0xee, 0xf6, 0xfc, 0x80, 0x97, 0x50, 0x6f, 0x99, 0xee, 0xb8, 0xde, 0x30, 0x31, 0x3b, - 0x5e, 0x15, 0x9d, 0xf3, 0x7c, 0xbb, 0xe7, 0x07, 0x96, 0x27, 0xc8, 0xad, 0x6d, 0xa4, 0x8f, 0x75, - 0x52, 0x4a, 0x0d, 0x8b, 0x77, 0xa1, 0xa0, 0x8e, 0x1a, 0x5a, 0x7c, 0x39, 0x6d, 0x47, 0xda, 0xde, - 0x73, 0x8b, 0x2f, 0x06, 0x30, 0x39, 0x9c, 0x3c, 0x27, 0x82, 0x5c, 0x65, 0x23, 0xc3, 0xa8, 0x28, - 0x98, 0x95, 0xf1, 0x23, 0x19, 0x38, 0x9d, 0x6e, 0x2d, 0x44, 0x3e, 0x8a, 0xbd, 0x6a, 0x66, 0x06, - 0xbd, 0xf9, 0x4a, 0x13, 0xa3, 0x8f, 0xf7, 0xae, 0x69, 0xfc, 0xe5, 0x91, 0x84, 0x94, 0x95, 0xc2, - 0x91, 0xdc, 0x4a, 0x1d, 0xc7, 0x8c, 0x72, 0x2e, 0x26, 0xc7, 0x31, 0x75, 0xf4, 0xde, 0x86, 0x69, - 0x64, 0x1c, 0x4d, 0x2e, 0x45, 0x1f, 0xca, 0x3f, 0x39, 0x9a, 0x5a, 0x66, 0x0c, 0x97, 0x54, 0x81, - 0x20, 0x64, 0xd9, 0x0d, 0x14, 0xe7, 0x72, 0xe5, 0xa2, 0xc9, 0x39, 0x6c, 0xbb, 0x81, 0xa5, 0xba, - 0x99, 0xa7, 0x10, 0x91, 0xcf, 0xc3, 0x94, 0x1c, 0xce, 0x15, 0xbc, 0xd5, 0x8c, 0xe0, 0x30, 0xe2, - 0x7d, 0x48, 0xae, 0x45, 0x0b, 0x45, 0x51, 0x53, 0x47, 0x24, 0x6d, 0x1e, 0x6e, 0x48, 0x00, 0x69, - 0xb3, 0x1c, 0x0c, 0x11, 0xd3, 0xe9, 0x15, 0x31, 0xfb, 0x9e, 0xe5, 0x29, 0xa6, 0x24, 0xad, 0x65, - 0x07, 0xb1, 0xa9, 0x17, 0xe7, 0x4d, 0x76, 0x61, 0x4a, 0x49, 0x3d, 0x55, 0x0e, 0x86, 0xc8, 0x7c, - 0xf6, 0xb2, 0xa8, 0xec, 0xac, 0x9a, 0xcf, 0x2a, 0x59, 0x95, 0xce, 0xd7, 0xf8, 0x89, 0x2c, 0x4c, - 0xf3, 0xdb, 0x22, 0x37, 0x19, 0x7b, 0x6a, 0x6d, 0xfb, 0xde, 0xd2, 0x6c, 0xfb, 0x64, 0x78, 0x71, - 0xb5, 0x69, 0x43, 0x59, 0x62, 0xef, 0x01, 0x49, 0xd2, 0x10, 0x13, 0x0a, 0x2a, 0x74, 0xb0, 0x1d, - 0xde, 0xb5, 0x28, 0x12, 0xbd, 0xb8, 0xac, 0xa3, 0x65, 0xa5, 0x6f, 0x6a, 0x3c, 0x8c, 0x1f, 0xcf, - 0xc2, 0x94, 0x62, 0x89, 0xfd, 0xd4, 0x76, 0xfc, 0x17, 0xb4, 0x8e, 0x5f, 0x08, 0xa3, 0x6b, 0x84, - 0x2d, 0x1b, 0xaa, 0xdf, 0x7b, 0x30, 0x9b, 0x20, 0x89, 0x1b, 0xb4, 0x67, 0x86, 0x31, 0x68, 0x7f, - 0x3d, 0x19, 0xd6, 0x9a, 0x27, 0xb5, 0x0b, 0x83, 0x9c, 0xaa, 0x71, 0xb4, 0x7f, 0x2a, 0x0b, 0xf3, - 0xe2, 0x17, 0xe6, 0x81, 0xe0, 0xea, 0x92, 0xa7, 0x76, 0x2c, 0xca, 0xda, 0x58, 0x94, 0xf4, 0xb1, - 0x50, 0x1a, 0xd8, 0x7f, 0x48, 0x8c, 0x1f, 0x01, 0x58, 0xe8, 0x47, 0x30, 0x74, 0xd8, 0xad, 0x28, - 0xac, 0x47, 0x76, 0x88, 0xb0, 0x1e, 0xeb, 0x50, 0xc4, 0xaa, 0x84, 0x2b, 0x92, 0xbf, 0x65, 0x56, - 0x45, 0x27, 0xa1, 0xf4, 0xc1, 0x93, 0x75, 0x08, 0xff, 0x25, 0x3f, 0xa6, 0x75, 0x4f, 0x50, 0x92, - 0x5f, 0xcc, 0xc0, 0x34, 0x02, 0x57, 0x1f, 0x32, 0x71, 0x93, 0x31, 0x1b, 0x11, 0xf1, 0x1e, 0x42, - 0x6b, 0xbd, 0x7a, 0xe0, 0x39, 0x9d, 0x5d, 0x61, 0xae, 0xb7, 0x2d, 0xcc, 0xf5, 0xde, 0xe6, 0x66, - 0x86, 0x57, 0x1a, 0x6e, 0xfb, 0xea, 0xae, 0x67, 0x3f, 0x74, 0xb8, 0x93, 0x81, 0xdd, 0xba, 0x1a, - 0xe5, 0x62, 0xed, 0x3a, 0xb1, 0x2c, 0xa9, 0x82, 0x15, 0x9a, 0x42, 0xf2, 0x0f, 0xa5, 0x58, 0x6d, - 0xfc, 0x71, 0x40, 0xff, 0x22, 0xf2, 0x7d, 0x70, 0x86, 0xc7, 0x5f, 0x5e, 0x71, 0x3b, 0x81, 0xd3, - 0xe9, 0xb9, 0x3d, 0x7f, 0xd9, 0x6e, 0xec, 0xf7, 0xba, 0xbe, 0x88, 0xca, 0x83, 0x2d, 0x6f, 0x84, - 0x85, 0xd6, 0x36, 0x2f, 0xd5, 0x22, 0xe3, 0xa5, 0x33, 0x20, 0x6b, 0x30, 0xcb, 0x8b, 0xca, 0xbd, - 0xc0, 0xad, 0x37, 0xec, 0x16, 0x13, 0x88, 0xc7, 0x91, 0x2b, 0xb7, 0x49, 0xea, 0x05, 0xae, 0xe5, - 0x73, 0xb8, 0xfa, 0x56, 0x90, 0x20, 0x22, 0x55, 0x98, 0x31, 0xa9, 0xdd, 0xbc, 0x6b, 0x3f, 0x5e, - 0xb1, 0xbb, 0x76, 0xc3, 0x09, 0x78, 0x42, 0x88, 0x1c, 0x57, 0x29, 0x78, 0xd4, 0x6e, 0x5a, 0x6d, - 0xfb, 0xb1, 0xd5, 0x10, 0x85, 0xfa, 0x7b, 0xb3, 0x46, 0x17, 0xb2, 0x72, 0x3a, 0x21, 0xab, 0x89, - 0x38, 0x2b, 0xa7, 0xd3, 0x9f, 0x55, 0x44, 0x27, 0x59, 0xf1, 0xcc, 0x5c, 0xdc, 0x6d, 0x12, 0xce, - 0x67, 0x2e, 0x66, 0x14, 0x56, 0x22, 0x9d, 0x17, 0xba, 0x50, 0xc6, 0x59, 0x29, 0x74, 0x6c, 0xe6, - 0x3d, 0xf0, 0x9c, 0x80, 0xaa, 0x2d, 0x9c, 0xc4, 0xcf, 0xc2, 0xfe, 0x47, 0x87, 0xd3, 0x7e, 0x4d, - 0x4c, 0x50, 0x46, 0xdc, 0x94, 0x46, 0x16, 0x12, 0xdc, 0xd2, 0x5b, 0x99, 0xa0, 0x0c, 0xb9, 0xa9, - 0xed, 0x9c, 0xc2, 0x76, 0x2a, 0xdc, 0xfa, 0x34, 0x34, 0x41, 0x49, 0x36, 0x58, 0xa7, 0x05, 0xec, - 0xe6, 0xee, 0x76, 0x84, 0x3f, 0xe7, 0x34, 0x7e, 0xda, 0x4b, 0x42, 0x6c, 0x28, 0x7a, 0xb2, 0xd8, - 0x4a, 0xf1, 0xee, 0x8c, 0x13, 0x93, 0xbf, 0x00, 0x33, 0x5b, 0x3e, 0xbd, 0x59, 0xad, 0xd5, 0x65, - 0xb8, 0x66, 0x7c, 0xde, 0x9a, 0x5e, 0xba, 0x76, 0xcc, 0xa6, 0x73, 0x45, 0xa5, 0xc1, 0xd4, 0xa6, - 0x7c, 0xdc, 0x7a, 0x3e, 0xb5, 0x76, 0x9c, 0xae, 0x1f, 0xc6, 0xbe, 0x57, 0xc7, 0x2d, 0x56, 0x95, - 0xb1, 0x06, 0xb3, 0x09, 0x36, 0x64, 0x1a, 0x80, 0x01, 0xad, 0xad, 0x8d, 0xfa, 0xea, 0x66, 0xf1, - 0x19, 0x52, 0x84, 0x02, 0xfe, 0x5e, 0xdd, 0x28, 0x2f, 0xaf, 0xaf, 0x56, 0x8a, 0x19, 0x32, 0x0b, - 0x53, 0x08, 0xa9, 0x54, 0xeb, 0x1c, 0x94, 0xe5, 0x19, 0xe9, 0xcc, 0x22, 0x5f, 0xba, 0x01, 0x5b, - 0x00, 0x78, 0xa6, 0x18, 0x7f, 0x3d, 0x0b, 0x67, 0xe5, 0xb1, 0x42, 0x83, 0x47, 0xae, 0xb7, 0xef, - 0x74, 0x76, 0x9f, 0xf2, 0xd3, 0xe1, 0xa6, 0x76, 0x3a, 0xbc, 0x14, 0x3b, 0xa9, 0x63, 0xad, 0x1c, - 0x70, 0x44, 0x7c, 0x7b, 0x02, 0xce, 0x0d, 0xa4, 0x22, 0xef, 0xb3, 0xd3, 0xdc, 0xa1, 0x9d, 0xa0, - 0xda, 0x6c, 0x51, 0x26, 0xa2, 0xba, 0xbd, 0x40, 0xf8, 0x0f, 0xbf, 0x88, 0x2f, 0x4a, 0x58, 0x68, - 0x39, 0xcd, 0x16, 0xb5, 0x02, 0x5e, 0xac, 0x4d, 0xb7, 0x24, 0x35, 0x63, 0x19, 0xa6, 0x59, 0xae, - 0x76, 0x02, 0xea, 0x3d, 0x44, 0xbf, 0x9b, 0x90, 0xe5, 0x3e, 0xa5, 0x5d, 0xcb, 0x66, 0xa5, 0x96, - 0x23, 0x8a, 0x75, 0x96, 0x09, 0x6a, 0x72, 0x53, 0x61, 0x89, 0x52, 0xfe, 0x5d, 0xfb, 0xb1, 0xb0, - 0xdd, 0x17, 0xe9, 0x3f, 0x42, 0x96, 0x3c, 0x14, 0x46, 0xdb, 0x7e, 0x6c, 0x26, 0x49, 0xc8, 0x87, - 0x70, 0x4a, 0x1c, 0x40, 0x22, 0x54, 0xa3, 0x6c, 0x31, 0x0f, 0x04, 0xf9, 0x0a, 0xbb, 0x98, 0x49, - 0xf7, 0x5b, 0x19, 0x7e, 0x35, 0xad, 0xd5, 0xe9, 0x5c, 0xc8, 0x26, 0x3b, 0x90, 0x63, 0xdd, 0x71, - 0x97, 0xfa, 0xbe, 0x8c, 0x77, 0x22, 0x74, 0xb3, 0x6a, 0x67, 0x5a, 0x6d, 0x5e, 0x6e, 0xf6, 0xa5, - 0x24, 0x6b, 0x30, 0xfd, 0x80, 0x6e, 0xab, 0xe3, 0x33, 0x16, 0x6e, 0x55, 0xc5, 0x47, 0x74, 0xbb, - 0xff, 0xe0, 0xc4, 0xe8, 0x88, 0x83, 0x2f, 0xd4, 0x8f, 0x0f, 0xd6, 0xd9, 0xc5, 0xb9, 0x43, 0x3d, - 0xbc, 0xff, 0x8e, 0xe3, 0x66, 0xb0, 0x10, 0x49, 0xc8, 0x7a, 0xb9, 0xd0, 0x1d, 0x61, 0x88, 0x81, - 0x96, 0x80, 0x5b, 0xb1, 0x24, 0xc5, 0x49, 0xae, 0xe4, 0x6b, 0x30, 0x63, 0xba, 0xbd, 0xc0, 0xe9, - 0xec, 0xd6, 0xd9, 0x0d, 0x93, 0xee, 0xf2, 0x03, 0x29, 0x8a, 0x26, 0x1d, 0x2b, 0x15, 0x76, 0x51, - 0x1c, 0x68, 0xf9, 0x02, 0xaa, 0x9d, 0x08, 0x3a, 0x01, 0xf9, 0x2a, 0x4c, 0xf3, 0x90, 0x77, 0x61, - 0x05, 0x13, 0x5a, 0xa6, 0x42, 0xbd, 0xf0, 0xfe, 0x35, 0x61, 0x6a, 0x8d, 0xd0, 0xb4, 0x0a, 0x62, - 0xdc, 0xc8, 0x97, 0x45, 0x67, 0xd5, 0x9c, 0xce, 0x6e, 0x38, 0x8d, 0x01, 0x7b, 0xfe, 0x72, 0xd4, - 0x25, 0x5d, 0xf6, 0xb9, 0x72, 0x1a, 0xf7, 0xf1, 0x1b, 0x49, 0xf2, 0x21, 0x01, 0x9c, 0x2b, 0xfb, - 0xbe, 0xe3, 0x07, 0xc2, 0xcb, 0x7e, 0xf5, 0x31, 0x6d, 0xf4, 0x18, 0xf2, 0x03, 0xd7, 0xdb, 0xa7, - 0x1e, 0xf7, 0x5c, 0x1c, 0x5d, 0xbe, 0x72, 0x74, 0x58, 0x7a, 0xd5, 0x46, 0x44, 0x4b, 0x38, 0xe6, - 0x5b, 0x54, 0xa2, 0x5a, 0x8f, 0x38, 0xae, 0xd2, 0x86, 0xc1, 0x4c, 0xc9, 0x57, 0xe1, 0xf4, 0x8a, - 0xed, 0xd3, 0x6a, 0xc7, 0xa7, 0x1d, 0xdf, 0x09, 0x9c, 0x87, 0x54, 0x74, 0x2a, 0x1e, 0x7e, 0x79, - 0x1e, 0x46, 0xbc, 0x61, 0xfb, 0x6c, 0x61, 0x86, 0x28, 0x96, 0x18, 0x14, 0x35, 0x4a, 0x79, 0x3a, - 0x17, 0x62, 0xc2, 0x74, 0xbd, 0xbe, 0x56, 0x71, 0xec, 0x70, 0x5d, 0x4d, 0x61, 0x7f, 0xbd, 0x8a, - 0x8f, 0x4b, 0xfe, 0x9e, 0xd5, 0x74, 0xec, 0x70, 0x41, 0xf5, 0xe9, 0xac, 0x18, 0x07, 0xe3, 0x30, - 0x03, 0xc5, 0xf8, 0x50, 0x92, 0x2f, 0xc1, 0x04, 0x77, 0xba, 0xa0, 0xfe, 0x9e, 0xd0, 0xbf, 0x48, - 0x1b, 0xfe, 0x10, 0xae, 0x13, 0x89, 0x48, 0x39, 0xdc, 0xa5, 0x83, 0xaa, 0xa6, 0x9e, 0x6b, 0xcf, - 0x98, 0x11, 0x33, 0xd2, 0x84, 0x02, 0x1f, 0x2d, 0x8a, 0x91, 0xf0, 0x63, 0xb1, 0x07, 0xd4, 0xa2, - 0x18, 0x7f, 0x6e, 0xe0, 0xcc, 0xe7, 0x04, 0x47, 0xd0, 0xaa, 0xd0, 0xb8, 0x2e, 0x03, 0xe4, 0x25, - 0xa1, 0x71, 0x16, 0xce, 0xf4, 0xf9, 0x66, 0xe3, 0x21, 0xea, 0x9c, 0xfb, 0xd4, 0x48, 0xbe, 0x04, - 0xf3, 0x48, 0xb8, 0xe2, 0x76, 0x3a, 0xb4, 0x11, 0xe0, 0x76, 0x24, 0xdf, 0x7f, 0x73, 0xdc, 0x4c, - 0x93, 0xb7, 0xb7, 0x11, 0x22, 0x58, 0xf1, 0x67, 0xe0, 0x54, 0x0e, 0xc6, 0xcf, 0x67, 0x61, 0x41, - 0xec, 0x70, 0x26, 0x6d, 0xb8, 0xa8, 0x7d, 0x7c, 0xca, 0x4f, 0xd4, 0x55, 0xed, 0x44, 0x7d, 0x31, - 0x0c, 0xf9, 0x99, 0xd6, 0xc8, 0x01, 0x07, 0xea, 0x2f, 0x67, 0xe0, 0xb9, 0x41, 0x44, 0xa1, 0x56, - 0x31, 0x93, 0xa6, 0x55, 0x24, 0x5d, 0x98, 0xc3, 0x01, 0x5d, 0xd9, 0xa3, 0x8d, 0x7d, 0x7f, 0xcd, - 0xf5, 0x03, 0xf4, 0x25, 0xce, 0xf6, 0xb1, 0xb6, 0x7a, 0x3d, 0xd5, 0xda, 0xea, 0x34, 0x9f, 0x65, - 0x0d, 0xe4, 0xc1, 0x73, 0x13, 0xec, 0xd3, 0x03, 0xdf, 0x4c, 0x63, 0x6d, 0xfc, 0x74, 0x96, 0x5d, - 0xd9, 0x82, 0xbd, 0x9a, 0x47, 0x77, 0xa8, 0x47, 0x3b, 0x0d, 0xfa, 0x3d, 0xe6, 0x13, 0xaa, 0x37, - 0x6e, 0x28, 0x0d, 0xc6, 0xb7, 0xa6, 0x61, 0x3e, 0x8d, 0x8c, 0xf5, 0x8b, 0x72, 0x69, 0xce, 0x4b, - 0x27, 0x7e, 0x71, 0x55, 0xfe, 0x66, 0x06, 0x0a, 0x75, 0xda, 0x70, 0x3b, 0xcd, 0x9b, 0x68, 0x0e, - 0x2b, 0x7a, 0xc7, 0xe6, 0x42, 0x03, 0x83, 0x5b, 0x3b, 0x31, 0x3b, 0xd9, 0xef, 0x1e, 0x96, 0xbe, - 0x38, 0xdc, 0x5d, 0xb5, 0xe1, 0xa2, 0xee, 0x33, 0xc0, 0xb4, 0x82, 0x61, 0x15, 0xfc, 0x6b, 0x4c, - 0xad, 0x5a, 0xb2, 0x0c, 0x53, 0x62, 0xc1, 0xba, 0x6a, 0xee, 0x04, 0x1e, 0x17, 0x55, 0x16, 0x24, - 0x9e, 0x4f, 0x35, 0x12, 0x72, 0x1d, 0x72, 0x5b, 0x4b, 0x37, 0xc5, 0x28, 0xc8, 0xd4, 0x8c, 0x5b, - 0x4b, 0x37, 0x51, 0x21, 0xc6, 0x2e, 0x19, 0x53, 0xbd, 0x25, 0xcd, 0xd0, 0x74, 0x6b, 0xe9, 0x26, - 0xf9, 0x8b, 0x70, 0xaa, 0xe2, 0xf8, 0xa2, 0x0a, 0xee, 0x9f, 0xdc, 0xc4, 0xa8, 0x1c, 0x63, 0x7d, - 0xe6, 0xef, 0xe7, 0x52, 0xe7, 0xef, 0x0b, 0xcd, 0x90, 0x89, 0xc5, 0x9d, 0x9f, 0x9b, 0xf1, 0x1c, - 0x11, 0xe9, 0xf5, 0x90, 0x8f, 0x60, 0x1a, 0xdf, 0xc6, 0xd0, 0x65, 0x1b, 0x93, 0x93, 0x8d, 0xf7, - 0xa9, 0xf9, 0x33, 0xa9, 0x35, 0x2f, 0xf2, 0x68, 0x75, 0xe8, 0xf8, 0x8d, 0x89, 0xcc, 0xb4, 0x7b, - 0xbf, 0xc6, 0x99, 0xdc, 0x86, 0x19, 0x21, 0x80, 0xdd, 0xdb, 0xd9, 0xdc, 0xa3, 0x15, 0xfb, 0x40, - 0xd8, 0x88, 0xe2, 0x9d, 0x4e, 0x48, 0x6d, 0x96, 0xbb, 0x63, 0x05, 0x7b, 0xd4, 0x6a, 0xda, 0x9a, - 0xa8, 0x12, 0x23, 0x24, 0xdf, 0x80, 0xc9, 0x75, 0xb7, 0xc1, 0x64, 0x6f, 0xdc, 0x1b, 0xb8, 0xd9, - 0xe8, 0x07, 0x6c, 0x29, 0xb7, 0x38, 0x38, 0x26, 0x50, 0x7d, 0xf7, 0xb0, 0xf4, 0xd6, 0x49, 0xa7, - 0x8d, 0x52, 0x81, 0xa9, 0xd6, 0x46, 0x56, 0x20, 0xff, 0x80, 0x6e, 0xb3, 0xd6, 0xc6, 0xd3, 0x94, - 0x4b, 0xb0, 0x30, 0x28, 0x17, 0xbf, 0x34, 0x83, 0x72, 0x01, 0x23, 0x1e, 0xcc, 0x62, 0xff, 0xd4, - 0x6c, 0xdf, 0x7f, 0xe4, 0x7a, 0x4d, 0xcc, 0x0f, 0xd9, 0xcf, 0x22, 0x75, 0x29, 0xb5, 0xf3, 0x9f, - 0xe3, 0x9d, 0xdf, 0x55, 0x38, 0xa8, 0x22, 0x64, 0x82, 0x3d, 0xf9, 0x1a, 0x4c, 0x8b, 0xc8, 0x5f, - 0x77, 0x6f, 0x96, 0x71, 0x25, 0x14, 0xb4, 0xd8, 0x26, 0x7a, 0xa1, 0x7c, 0xaf, 0x42, 0x58, 0x18, - 0x43, 0xa7, 0xbd, 0x63, 0xeb, 0x0f, 0xcf, 0x2a, 0x09, 0xa9, 0xc1, 0x64, 0x85, 0x3e, 0x74, 0x1a, - 0x14, 0xe3, 0x2f, 0x08, 0x77, 0xc5, 0x30, 0xef, 0x71, 0x54, 0xc2, 0xb5, 0x31, 0x4d, 0x04, 0xf0, - 0x68, 0x0e, 0xba, 0xab, 0x49, 0x88, 0x48, 0x6e, 0x40, 0xae, 0x5a, 0xa9, 0x09, 0x6f, 0xc5, 0xd9, - 0x30, 0xbe, 0x5e, 0x4d, 0x66, 0x89, 0x45, 0x1b, 0x6e, 0xa7, 0xa9, 0xf9, 0x3a, 0x56, 0x2b, 0x35, - 0xb2, 0x03, 0x53, 0xd8, 0x01, 0x6b, 0xd4, 0xe6, 0x7d, 0x3b, 0xd3, 0xa7, 0x6f, 0xaf, 0xa4, 0xf6, - 0xed, 0x02, 0xef, 0xdb, 0x3d, 0x41, 0xad, 0xa5, 0xbd, 0x54, 0xd9, 0x32, 0xa1, 0x56, 0xa4, 0xe2, - 0x95, 0xc9, 0x1a, 0x37, 0xd7, 0xd1, 0x46, 0x55, 0x08, 0xb5, 0x32, 0x73, 0x6f, 0x98, 0x3d, 0xb2, - 0xaf, 0x33, 0x74, 0x92, 0x0f, 0xf9, 0x02, 0x8c, 0xdc, 0xdb, 0x0f, 0x6c, 0xe1, 0x97, 0x28, 0xfb, - 0x91, 0x81, 0x64, 0xf3, 0x51, 0x0f, 0xe9, 0xee, 0x6b, 0x11, 0x9b, 0x91, 0x86, 0x0d, 0xc5, 0x9a, - 0xed, 0x35, 0x1f, 0xd9, 0x1e, 0x06, 0xc1, 0x99, 0xd3, 0x58, 0x28, 0x25, 0x7c, 0x28, 0xf6, 0x04, - 0x20, 0xf6, 0xc0, 0xa9, 0xb2, 0x20, 0xdf, 0x07, 0x67, 0x7d, 0x67, 0xb7, 0x63, 0x07, 0x3d, 0x8f, - 0x5a, 0x76, 0x6b, 0xd7, 0xf5, 0x9c, 0x60, 0xaf, 0x6d, 0xf9, 0x3d, 0x27, 0xa0, 0xe8, 0x20, 0x38, - 0x1d, 0xca, 0x8c, 0x75, 0x89, 0x57, 0x96, 0x68, 0x75, 0x86, 0x65, 0x9e, 0xf1, 0xd3, 0x0b, 0xc8, - 0x97, 0x61, 0x4a, 0xdd, 0x92, 0xfd, 0x85, 0x53, 0xe7, 0x73, 0x17, 0xa7, 0xc3, 0xab, 0x47, 0x7c, - 0x0b, 0x97, 0x19, 0x63, 0x94, 0x33, 0xc2, 0xd7, 0x33, 0xc6, 0x28, 0xbc, 0x88, 0x09, 0x67, 0x7c, - 0xae, 0xdf, 0xe8, 0x75, 0x9c, 0xc7, 0x98, 0x15, 0x58, 0xd8, 0x32, 0x2f, 0x9c, 0xd6, 0x8e, 0xbe, - 0x3a, 0x62, 0x6d, 0x6d, 0x54, 0xbf, 0xb4, 0xe5, 0x53, 0x4f, 0x98, 0x34, 0xcf, 0x73, 0xda, 0xad, - 0x8e, 0xf3, 0x38, 0x82, 0x86, 0xe9, 0xfc, 0x49, 0x71, 0xce, 0x9c, 0x15, 0xab, 0x40, 0x8c, 0xdc, - 0xdd, 0x9b, 0x65, 0x73, 0xbc, 0x56, 0xbd, 0x5f, 0x6f, 0xb9, 0x81, 0xb1, 0x07, 0xf3, 0x69, 0x5c, - 0xc9, 0x02, 0x8c, 0x8b, 0xdc, 0x74, 0x78, 0x38, 0xe6, 0x4d, 0xf9, 0x93, 0x3c, 0x0b, 0x13, 0x3b, - 0x8e, 0xe7, 0x07, 0x56, 0xcf, 0xe1, 0xf2, 0xc2, 0xa8, 0x99, 0x47, 0xc0, 0x96, 0xd3, 0x24, 0x67, - 0x21, 0x8f, 0x6f, 0x5c, 0xac, 0x2c, 0x87, 0x65, 0xe3, 0xec, 0xf7, 0x96, 0xd3, 0x34, 0xfe, 0xcb, - 0x0c, 0x1e, 0x41, 0xe4, 0x55, 0x0c, 0x22, 0x1b, 0xda, 0x9f, 0xa0, 0xfe, 0xd9, 0xee, 0xc6, 0x72, - 0xbd, 0x71, 0x14, 0xf2, 0x3a, 0x8c, 0xdd, 0xb4, 0x1b, 0x34, 0x34, 0x6b, 0x40, 0xe4, 0x1d, 0x84, - 0xa8, 0xca, 0x6a, 0x8e, 0xc3, 0xe4, 0x63, 0xbe, 0x34, 0xcb, 0x41, 0x40, 0x7d, 0xbe, 0x7f, 0xae, - 0x94, 0xa5, 0x29, 0x03, 0xca, 0xc7, 0x62, 0x49, 0xdb, 0x11, 0x42, 0xcc, 0x25, 0x2d, 0x95, 0x83, - 0xf1, 0x87, 0x99, 0x68, 0x4f, 0x25, 0xaf, 0xc0, 0x88, 0x59, 0x0b, 0xbf, 0x9f, 0x87, 0xe5, 0x89, - 0x7d, 0x3e, 0x22, 0x90, 0x2f, 0xc3, 0x29, 0x85, 0x4f, 0xc2, 0x3f, 0xee, 0x65, 0x8c, 0x1a, 0xa3, - 0x7c, 0x49, 0xba, 0x93, 0x5c, 0x3a, 0x0f, 0xbc, 0x0c, 0x44, 0x05, 0x15, 0xda, 0x71, 0x38, 0x6f, - 0xa5, 0xb1, 0x2a, 0xef, 0x26, 0x22, 0xc4, 0x1b, 0x9b, 0xc6, 0x81, 0x07, 0x8d, 0x31, 0x7e, 0x23, - 0xa3, 0xed, 0x95, 0xe4, 0x82, 0x26, 0xe7, 0xe2, 0xba, 0x8e, 0x29, 0x05, 0xb8, 0xc4, 0xfb, 0x26, - 0x40, 0xb9, 0x17, 0xb8, 0xab, 0x1d, 0xcf, 0x6d, 0xb5, 0x44, 0xc4, 0x33, 0x1e, 0x8e, 0xa2, 0x17, - 0xb8, 0x16, 0x45, 0xb0, 0x16, 0x8e, 0x22, 0x44, 0x4e, 0x75, 0x25, 0xcc, 0x7d, 0x5c, 0x57, 0x42, - 0xe3, 0xe7, 0xb2, 0xda, 0x0e, 0xc3, 0xa4, 0x5c, 0x31, 0xe9, 0x55, 0x9b, 0xeb, 0xae, 0xf3, 0xd0, - 0xf2, 0x5b, 0xae, 0x16, 0x7c, 0x4f, 0xa0, 0x91, 0xbf, 0x9c, 0x81, 0xd3, 0xdc, 0x27, 0x6f, 0xa3, - 0xd7, 0xde, 0xa6, 0xde, 0x7d, 0xbb, 0xe5, 0x34, 0xa3, 0x10, 0xdd, 0x91, 0x01, 0xbe, 0x52, 0x4d, - 0x3a, 0x3e, 0xbf, 0x68, 0x73, 0x1f, 0x41, 0xab, 0x83, 0x85, 0xd6, 0xc3, 0xb0, 0x54, 0xbd, 0x68, - 0xa7, 0xd3, 0x93, 0x2a, 0x4c, 0xd6, 0x9c, 0x0e, 0xa6, 0x02, 0x8d, 0xa2, 0x58, 0xbc, 0xc2, 0x5d, - 0x6c, 0xd9, 0x14, 0x6e, 0xec, 0xd1, 0x01, 0x5b, 0xb7, 0x4a, 0x6b, 0xfc, 0x4a, 0x06, 0x5e, 0x38, - 0xf6, 0x83, 0xc9, 0x55, 0x18, 0x5f, 0x55, 0xd7, 0x3f, 0xb7, 0x04, 0x4a, 0xa6, 0xab, 0x94, 0x58, - 0xe4, 0x2b, 0x70, 0x4a, 0x65, 0xb5, 0xe9, 0xd9, 0x8e, 0xea, 0x4d, 0x9c, 0xd2, 0x01, 0x01, 0x43, - 0x89, 0x8b, 0xad, 0xe9, 0x4c, 0x8c, 0xff, 0x37, 0x03, 0x13, 0xa1, 0x3b, 0xd2, 0x53, 0x7a, 0x9d, - 0xb9, 0xa1, 0x5d, 0x67, 0x64, 0xae, 0x83, 0xb0, 0x55, 0xdc, 0xf4, 0x28, 0xe5, 0x0a, 0x3a, 0xa3, - 0x38, 0x6f, 0x21, 0xe0, 0x47, 0xb3, 0x30, 0xc9, 0xb6, 0x6a, 0xfe, 0xa6, 0xfd, 0xbd, 0x15, 0xf1, - 0x3d, 0x6c, 0xd7, 0x50, 0x31, 0xb9, 0xff, 0x6d, 0x06, 0xdf, 0x3a, 0x54, 0x0a, 0xd6, 0x1b, 0x0c, - 0xa4, 0xf6, 0x06, 0x3b, 0x51, 0x4d, 0x84, 0xf2, 0x08, 0xc5, 0xeb, 0xa2, 0x27, 0x44, 0x84, 0xe2, - 0x96, 0xc9, 0x60, 0xe4, 0x8b, 0x30, 0xba, 0x85, 0x9a, 0x5b, 0x3d, 0xa2, 0x5e, 0xc8, 0x1f, 0x0b, - 0xf9, 0x7e, 0xdf, 0xf3, 0xf5, 0xf0, 0xd5, 0x9c, 0x90, 0xd4, 0x61, 0x7c, 0xc5, 0xa3, 0x76, 0x40, - 0x9b, 0xa2, 0x43, 0x86, 0x8a, 0x07, 0xd5, 0xe0, 0x24, 0xf1, 0x78, 0x50, 0x82, 0x13, 0xdb, 0xc7, - 0x48, 0xd4, 0x46, 0xb4, 0xda, 0xf1, 0x9f, 0xda, 0x41, 0x7f, 0x4f, 0x1b, 0xf4, 0x73, 0x89, 0x41, - 0xe7, 0xcd, 0x1b, 0x6a, 0xec, 0x7f, 0x33, 0x03, 0xa7, 0xd3, 0x09, 0xc9, 0x8b, 0x30, 0x76, 0x6f, - 0xb3, 0x16, 0x59, 0xca, 0x61, 0x53, 0xdc, 0x2e, 0xaa, 0x4d, 0x4c, 0x51, 0x44, 0x2e, 0xc3, 0xd8, - 0xfb, 0xe6, 0x4a, 0x64, 0x10, 0x86, 0x1b, 0xdc, 0xd7, 0x99, 0xe4, 0xa5, 0x9d, 0x6a, 0x02, 0x49, - 0x1d, 0xdb, 0xdc, 0x13, 0x1b, 0xdb, 0x9f, 0xca, 0xc2, 0x4c, 0xb9, 0xd1, 0xa0, 0xbe, 0x2f, 0x32, - 0x6c, 0x3d, 0xb5, 0x03, 0x9b, 0x1e, 0x6e, 0x51, 0x6b, 0xdb, 0x50, 0xa3, 0xfa, 0x5b, 0x19, 0x1e, - 0x3c, 0x95, 0x51, 0x3d, 0x74, 0xe8, 0xa3, 0xcd, 0x3d, 0x8f, 0xfa, 0x7b, 0x6e, 0xab, 0x39, 0x74, - 0x86, 0x57, 0x26, 0x33, 0x62, 0x16, 0x2a, 0xd5, 0xc0, 0x61, 0x07, 0x21, 0x9a, 0xcc, 0xc8, 0x33, - 0x55, 0x5d, 0x85, 0xf1, 0x72, 0xb7, 0xeb, 0xb9, 0x0f, 0xf9, 0xb2, 0x17, 0x01, 0xea, 0x6d, 0x0e, - 0xd2, 0x22, 0x60, 0x71, 0x10, 0xfb, 0x8c, 0x0a, 0xed, 0x1c, 0xa8, 0xe6, 0x69, 0x4d, 0xda, 0x51, - 0x2f, 0x25, 0x58, 0x6e, 0xd4, 0x81, 0xd4, 0x3c, 0xb7, 0xed, 0x06, 0xb4, 0xc9, 0xdb, 0x83, 0x81, - 0xc3, 0x8e, 0x8d, 0x35, 0xbc, 0xe9, 0x04, 0x2d, 0x2d, 0xd6, 0x70, 0xc0, 0x00, 0x26, 0x87, 0xb3, - 0xb3, 0xfb, 0x9c, 0xd6, 0xa7, 0x15, 0xef, 0xc0, 0xec, 0x75, 0x56, 0x3b, 0x9e, 0xd3, 0xd8, 0x43, - 0x1f, 0xd7, 0x0d, 0x00, 0x93, 0xda, 0xbe, 0xdb, 0x51, 0x84, 0xb5, 0x2b, 0x3c, 0xbf, 0x2d, 0x83, - 0x26, 0xf5, 0x0e, 0xb3, 0x82, 0x53, 0x44, 0x65, 0x2a, 0x1c, 0x48, 0x19, 0xa6, 0xf8, 0x2f, 0xd6, - 0x98, 0x6e, 0x28, 0x88, 0x3f, 0xcb, 0x3d, 0x4e, 0x91, 0x65, 0x17, 0x4b, 0xf4, 0x68, 0x14, 0x0a, - 0x85, 0xf1, 0x7f, 0x8d, 0x42, 0x41, 0x1d, 0x52, 0x62, 0xf0, 0x64, 0x8d, 0xae, 0xa7, 0xc6, 0xef, - 0xb3, 0x11, 0x62, 0x8a, 0x92, 0x28, 0xf8, 0x65, 0xf6, 0xd8, 0xe0, 0x97, 0x0f, 0x60, 0xaa, 0xe6, - 0xb9, 0x18, 0xfe, 0x1f, 0x5f, 0x9b, 0xc5, 0xfe, 0x3d, 0xa7, 0x68, 0x0d, 0xd8, 0xec, 0xc3, 0xf7, - 0x6c, 0xbc, 0x97, 0x75, 0x05, 0xb6, 0xc5, 0x44, 0x5f, 0x4d, 0x67, 0xa6, 0xf1, 0xe1, 0xa6, 0x32, - 0xac, 0x25, 0x6a, 0x52, 0x1b, 0xde, 0x68, 0xdd, 0x54, 0x86, 0x41, 0xd4, 0x0d, 0x62, 0xf4, 0x49, - 0x6d, 0x10, 0xe4, 0xe7, 0x32, 0x30, 0x59, 0xee, 0x74, 0x44, 0x50, 0xcd, 0x63, 0x42, 0x80, 0x7d, - 0x45, 0x58, 0xcb, 0xbc, 0xf5, 0xb1, 0xac, 0x65, 0x50, 0xd8, 0xf2, 0x51, 0x52, 0x8f, 0x2a, 0xd4, - 0x02, 0xe3, 0x44, 0x60, 0xf2, 0x16, 0x14, 0xc3, 0x95, 0x59, 0xed, 0x34, 0xe9, 0x63, 0xca, 0x73, - 0xf5, 0x4f, 0x89, 0x9c, 0x42, 0xaa, 0x64, 0x1e, 0x47, 0x24, 0x9b, 0x00, 0x76, 0xb8, 0x24, 0xc4, - 0x23, 0xde, 0xd9, 0xe8, 0xc1, 0x25, 0xb6, 0x66, 0xc4, 0xed, 0x01, 0x7f, 0xe3, 0x83, 0xa4, 0x7a, - 0x7b, 0x88, 0xf8, 0x90, 0x36, 0xcc, 0x94, 0x7d, 0xbf, 0xd7, 0xa6, 0xf5, 0xc0, 0xf6, 0x02, 0x4c, - 0x1c, 0x08, 0xc3, 0x9b, 0x81, 0xda, 0x48, 0xca, 0x66, 0x84, 0x17, 0x58, 0x29, 0x59, 0x04, 0xe3, - 0xbc, 0x79, 0x06, 0x27, 0xf3, 0x4c, 0xf2, 0x7b, 0xf9, 0x4a, 0xfd, 0xa9, 0x0c, 0x9c, 0x56, 0x27, - 0x7d, 0xbd, 0xb7, 0x2d, 0xd2, 0x26, 0x90, 0x2b, 0x30, 0x21, 0xe6, 0x64, 0x78, 0x89, 0x4c, 0xe6, - 0x3f, 0x8c, 0x50, 0xc8, 0x2a, 0x9b, 0x86, 0x8c, 0x87, 0xb8, 0x75, 0xcc, 0xc5, 0x36, 0x57, 0x56, - 0xb4, 0xbc, 0x10, 0x25, 0x70, 0x64, 0xbf, 0xf5, 0xf9, 0xc9, 0x20, 0xc6, 0xbb, 0x30, 0xab, 0x8f, - 0x44, 0x9d, 0x06, 0xe4, 0x12, 0x8c, 0xcb, 0xe1, 0xcb, 0xa4, 0x0f, 0x9f, 0x2c, 0x37, 0x1e, 0x00, - 0x49, 0xd0, 0xfb, 0x68, 0xd6, 0xc6, 0xee, 0xe7, 0xdc, 0xec, 0x52, 0x3e, 0x2a, 0x27, 0x10, 0x97, - 0xe7, 0xc4, 0xf7, 0x4d, 0x6a, 0x8e, 0x8d, 0x98, 0x42, 0xe2, 0xb7, 0x8a, 0x30, 0x97, 0x72, 0x50, - 0x1c, 0x23, 0xc8, 0x95, 0xf4, 0x0d, 0x62, 0x22, 0x8c, 0x20, 0x28, 0xb7, 0x85, 0x77, 0x61, 0xf4, - 0xd8, 0xed, 0x80, 0xbb, 0xb5, 0xc6, 0x76, 0x01, 0x4e, 0xf6, 0xa9, 0x08, 0x73, 0x6a, 0xc4, 0xd0, - 0xd1, 0x27, 0x16, 0x31, 0x14, 0x43, 0x06, 0x29, 0x9b, 0xb8, 0x1e, 0xc6, 0x88, 0xe7, 0xf3, 0x4c, - 0x6c, 0x5b, 0x3a, 0x09, 0xe7, 0xe1, 0xbb, 0xad, 0x87, 0x54, 0xf0, 0x18, 0x57, 0x79, 0x60, 0x41, - 0x2a, 0x0f, 0x85, 0x84, 0xfc, 0x83, 0x0c, 0x10, 0x01, 0x51, 0xf7, 0xac, 0xfc, 0xa0, 0x3d, 0xab, - 0xf9, 0x64, 0xf6, 0xac, 0x73, 0xf2, 0x1b, 0xd3, 0xf7, 0xae, 0x94, 0xcf, 0x22, 0x7f, 0x2f, 0x03, - 0xb3, 0x3c, 0xd2, 0xa4, 0xfa, 0xb1, 0x03, 0xa3, 0x07, 0x36, 0x9e, 0xcc, 0xc7, 0x3e, 0x27, 0x32, - 0xb9, 0xa6, 0x7f, 0x6b, 0xf2, 0xa3, 0xc8, 0xf7, 0x01, 0x84, 0x2b, 0x8a, 0xa7, 0xd1, 0x98, 0x5c, - 0x7a, 0x2e, 0x65, 0x17, 0x08, 0x91, 0xa2, 0xf4, 0x85, 0x41, 0x48, 0xa7, 0x6e, 0x9b, 0x11, 0x37, - 0xf2, 0x17, 0x79, 0x0c, 0xfe, 0x10, 0x22, 0x82, 0xec, 0x2e, 0x4c, 0x62, 0x2d, 0x9f, 0xed, 0x2f, - 0xc8, 0x5d, 0x49, 0x23, 0xe3, 0x49, 0x57, 0x42, 0x23, 0x6b, 0x2f, 0x68, 0xc7, 0xe3, 0xf0, 0xc7, - 0x29, 0x30, 0x76, 0x35, 0x7e, 0x3d, 0x4f, 0x31, 0xd8, 0x67, 0x7f, 0x3b, 0x2b, 0xd7, 0x02, 0xdf, - 0xdf, 0x62, 0xce, 0x48, 0x08, 0x22, 0xef, 0x03, 0x09, 0x43, 0x34, 0x72, 0x18, 0x95, 0xe9, 0x07, - 0xf9, 0x63, 0x41, 0x14, 0xea, 0xd1, 0x93, 0xc5, 0xea, 0x24, 0x49, 0x12, 0x13, 0x0a, 0xf3, 0xa2, - 0xd1, 0x0c, 0xca, 0x1d, 0x88, 0xab, 0x15, 0x7f, 0x61, 0x5a, 0x0b, 0x61, 0x1c, 0x95, 0x2c, 0x3f, - 0x2f, 0xb3, 0xf5, 0x86, 0x9e, 0xc8, 0xba, 0x4b, 0x6f, 0x2a, 0x3b, 0x72, 0x03, 0x26, 0x30, 0xd4, - 0xc8, 0x9a, 0x34, 0xd6, 0x13, 0x86, 0x43, 0x18, 0x94, 0xc4, 0xda, 0xd3, 0x4d, 0xee, 0x22, 0x54, - 0x76, 0x87, 0xe1, 0x12, 0x20, 0xaa, 0xf4, 0x85, 0x92, 0xa6, 0xe9, 0x1d, 0x58, 0x5e, 0x4f, 0x0f, - 0x63, 0x83, 0x48, 0xe4, 0x6b, 0x30, 0x79, 0xd7, 0x7e, 0x1c, 0x66, 0x05, 0x9e, 0x1d, 0x3e, 0xf7, - 0x70, 0xdb, 0x7e, 0x1c, 0xa6, 0x04, 0x8e, 0x3b, 0x30, 0x29, 0x2c, 0xc9, 0x87, 0x00, 0xca, 0x3b, - 0x03, 0x39, 0xb6, 0x82, 0x17, 0x64, 0x60, 0xee, 0xd4, 0xf7, 0x07, 0xe4, 0xaf, 0x30, 0x8c, 0x49, - 0x0e, 0xf3, 0x9f, 0x9e, 0xe4, 0x70, 0xea, 0xd3, 0x93, 0x1c, 0xf8, 0x33, 0x17, 0x1f, 0x7b, 0xdc, - 0xc1, 0x0f, 0x84, 0x96, 0x7f, 0x50, 0x6d, 0xcf, 0x49, 0x53, 0x50, 0x3c, 0x0a, 0x0e, 0x62, 0x55, - 0xc4, 0xf8, 0x11, 0x0f, 0x8a, 0xf1, 0x8b, 0xc1, 0xc2, 0x19, 0xcd, 0xb2, 0x70, 0xe0, 0x25, 0x82, - 0xab, 0x5b, 0xc5, 0x34, 0xb2, 0x68, 0x08, 0x57, 0x85, 0xba, 0x38, 0xcd, 0xe2, 0x36, 0x9c, 0xed, - 0xbb, 0x21, 0xa4, 0xe4, 0x99, 0xb9, 0xaa, 0xe7, 0x99, 0x39, 0xdb, 0x4f, 0x70, 0xf0, 0xf5, 0xdc, - 0x99, 0x73, 0xc5, 0xf9, 0xfe, 0x32, 0xd7, 0x77, 0xb2, 0x31, 0x41, 0x42, 0xdc, 0xf1, 0x78, 0xa6, - 0xe9, 0x7e, 0x92, 0x56, 0xb6, 0x5a, 0x61, 0x97, 0x3a, 0x14, 0x35, 0x94, 0x4c, 0x5f, 0x4c, 0xd4, - 0x50, 0x45, 0x15, 0x14, 0x3a, 0x3e, 0xa9, 0x4c, 0xf1, 0x36, 0x4c, 0xd7, 0xa9, 0xed, 0x35, 0xf6, - 0xee, 0xd0, 0x83, 0x47, 0xae, 0xd7, 0xe4, 0x19, 0x69, 0xc5, 0xcd, 0xc2, 0xc7, 0x12, 0x3d, 0x64, - 0x83, 0x8a, 0x4b, 0x2a, 0x32, 0x26, 0xc7, 0x28, 0xd6, 0x7e, 0x36, 0x75, 0x6f, 0x66, 0x08, 0x83, - 0xc2, 0x75, 0x90, 0x37, 0x42, 0xf1, 0x93, 0x7a, 0x6a, 0x06, 0x4d, 0x4f, 0x02, 0x53, 0xa4, 0x50, - 0xea, 0x19, 0xbf, 0x97, 0x03, 0xc2, 0x6b, 0x5a, 0xb1, 0xbb, 0x36, 0x46, 0xac, 0x71, 0x30, 0x2c, - 0x6d, 0x51, 0xe0, 0xd8, 0xdb, 0x2d, 0xaa, 0xc6, 0x74, 0x16, 0x26, 0xdf, 0x61, 0x99, 0x15, 0xbf, - 0xbe, 0x25, 0x08, 0xfb, 0x6c, 0xe0, 0xd9, 0x4f, 0xb2, 0x81, 0x7f, 0x0d, 0x9e, 0x2d, 0x77, 0xbb, - 0x2d, 0xa7, 0x11, 0xd6, 0x72, 0xd3, 0xf5, 0xe4, 0x72, 0xd1, 0x62, 0x21, 0xd8, 0x21, 0x5a, 0xe2, - 0x4b, 0x07, 0xb1, 0x50, 0xa4, 0x2f, 0x7e, 0xe1, 0x55, 0x63, 0x6b, 0x49, 0xe9, 0x2b, 0xed, 0x8a, - 0xac, 0x90, 0x48, 0x1e, 0x8e, 0x27, 0xa5, 0xaf, 0xd1, 0x28, 0x53, 0x8c, 0x7c, 0xe1, 0x4e, 0x97, - 0xe0, 0x42, 0x12, 0xf2, 0x36, 0x4c, 0x96, 0x7b, 0x81, 0x2b, 0x18, 0x0b, 0x5f, 0x85, 0xc8, 0xab, - 0x40, 0x7c, 0x8a, 0x76, 0xa1, 0x8b, 0xd0, 0x8d, 0x3f, 0xc8, 0xc1, 0xd9, 0xe4, 0xf0, 0x8a, 0xd2, - 0x70, 0x7d, 0x64, 0x8e, 0x59, 0x1f, 0x69, 0xb3, 0x21, 0x1b, 0xe5, 0x0e, 0x7c, 0x12, 0xb3, 0x21, - 0x87, 0xec, 0x3e, 0xe6, 0x6c, 0xa8, 0xc3, 0xa4, 0x7a, 0x8a, 0x8f, 0x7c, 0xdc, 0x53, 0x5c, 0xe5, - 0x42, 0x2e, 0xc1, 0x28, 0x0f, 0x29, 0x36, 0x1a, 0x3d, 0x08, 0xc6, 0xa3, 0x89, 0x71, 0x0c, 0xf2, - 0xff, 0x83, 0xf3, 0x7c, 0x4f, 0x8a, 0x37, 0x76, 0xf9, 0x40, 0x72, 0x14, 0x03, 0xb7, 0x74, 0x74, - 0x58, 0xba, 0xc2, 0xb5, 0x56, 0x56, 0xa2, 0xdb, 0xac, 0xed, 0x03, 0x4b, 0x7e, 0x99, 0x52, 0xc9, - 0xb1, 0xbc, 0x8d, 0xc7, 0x70, 0x56, 0x94, 0x46, 0xc1, 0x6c, 0x64, 0x21, 0x1b, 0xe4, 0xfd, 0x48, - 0xf1, 0x88, 0x83, 0x1c, 0xd3, 0x29, 0x62, 0x39, 0xb9, 0x0e, 0xf9, 0x72, 0xad, 0xca, 0xb3, 0x99, - 0x2b, 0xa1, 0x88, 0xec, 0xae, 0xc3, 0xa3, 0xae, 0x68, 0xd1, 0x0d, 0x04, 0xa2, 0xf1, 0xeb, 0x19, - 0x80, 0xa8, 0xd3, 0xc8, 0xe5, 0x34, 0xf7, 0x31, 0x9e, 0x8e, 0x8a, 0x83, 0x75, 0xcf, 0x31, 0xa9, - 0x13, 0xcd, 0xa6, 0xea, 0x44, 0xa5, 0x52, 0x2d, 0x97, 0xaa, 0x54, 0xab, 0xc0, 0x4c, 0xbd, 0xb7, - 0x2d, 0xeb, 0x8e, 0x07, 0xbf, 0xf0, 0x7b, 0xdb, 0x69, 0x5d, 0x19, 0x27, 0x31, 0x7e, 0x2c, 0x0b, - 0x85, 0x5a, 0xab, 0xb7, 0xeb, 0x74, 0x2a, 0x76, 0x60, 0x3f, 0xb5, 0x6a, 0xda, 0x37, 0x35, 0x35, - 0x6d, 0xe8, 0x25, 0x19, 0x36, 0x6c, 0x28, 0x1d, 0xed, 0xcf, 0x66, 0x60, 0x26, 0x22, 0xe1, 0x27, - 0xfc, 0x1a, 0x8c, 0xb0, 0x1f, 0x42, 0x0f, 0x70, 0x3e, 0xc1, 0x18, 0xb1, 0xae, 0x84, 0x7f, 0x09, - 0xc5, 0xa9, 0x9e, 0xca, 0x1b, 0x39, 0x2c, 0x7e, 0x0e, 0x26, 0x22, 0xb6, 0x49, 0xc1, 0x61, 0x5e, - 0x15, 0x1c, 0x26, 0xd4, 0x4c, 0x74, 0xbf, 0x9a, 0x81, 0x62, 0xbc, 0x25, 0xe4, 0x0e, 0x8c, 0x33, - 0x4e, 0x0e, 0x95, 0x2a, 0x8a, 0x97, 0xfa, 0xb4, 0xf9, 0x8a, 0x40, 0xe3, 0x9f, 0x87, 0x9d, 0x4f, - 0x39, 0xc4, 0x94, 0x1c, 0x16, 0x4d, 0x28, 0xa8, 0x58, 0x29, 0x5f, 0xf7, 0xba, 0x2e, 0xd6, 0x9c, - 0x4e, 0xef, 0x07, 0xf5, 0xab, 0xff, 0x86, 0xf6, 0xd5, 0x42, 0x62, 0xb9, 0xa0, 0x4d, 0xae, 0xd4, - 0xa5, 0x88, 0x93, 0x06, 0x13, 0xee, 0x89, 0x7d, 0x23, 0xab, 0x86, 0x82, 0x4c, 0x4c, 0xe8, 0x10, - 0x8f, 0xbc, 0x0e, 0x63, 0xbc, 0x3e, 0x35, 0xaf, 0x77, 0x17, 0x21, 0xea, 0x95, 0x81, 0xe3, 0x18, - 0x7f, 0x33, 0x07, 0xa7, 0xa3, 0xcf, 0xdb, 0xea, 0x36, 0xed, 0x80, 0xd6, 0x6c, 0xcf, 0x6e, 0xfb, - 0xc7, 0xac, 0x80, 0x8b, 0x89, 0x4f, 0x13, 0x61, 0x15, 0x38, 0x4c, 0xf9, 0x20, 0x23, 0xf6, 0x41, - 0xa8, 0x0e, 0xe6, 0x1f, 0x24, 0x3f, 0x83, 0xdc, 0x81, 0x5c, 0x9d, 0x06, 0x62, 0xc3, 0xbe, 0x90, - 0xe8, 0x55, 0xf5, 0xbb, 0xae, 0xd4, 0x69, 0xc0, 0x07, 0x91, 0x07, 0xd9, 0xd4, 0x02, 0x18, 0x30, - 0x2e, 0xe4, 0x01, 0x8c, 0xad, 0x3e, 0xee, 0xd2, 0x46, 0x80, 0x99, 0x95, 0x14, 0x4f, 0xfe, 0x74, - 0x7e, 0x1c, 0x97, 0xb3, 0x9c, 0x17, 0x32, 0xb8, 0x9e, 0xcd, 0x50, 0xb0, 0x5b, 0xbc, 0x01, 0x79, - 0x59, 0xf9, 0x49, 0x66, 0xee, 0xe2, 0x9b, 0x30, 0xa9, 0x54, 0x72, 0xa2, 0x49, 0xff, 0x0b, 0x6c, - 0x5f, 0x75, 0x5b, 0x54, 0x4c, 0x9c, 0xd5, 0x84, 0x80, 0xa9, 0x24, 0x25, 0xe6, 0x02, 0xa6, 0xb5, - 0x2f, 0x8a, 0x06, 0x48, 0x9a, 0x55, 0x98, 0xa9, 0xef, 0x3b, 0xdd, 0x28, 0x11, 0x87, 0x76, 0x8c, - 0x63, 0xe2, 0x53, 0xa1, 0xc3, 0x88, 0x1f, 0xe3, 0x71, 0x3a, 0xe3, 0x4f, 0x32, 0x30, 0xc6, 0xfe, - 0xba, 0x7f, 0xe3, 0x29, 0xdd, 0x32, 0xaf, 0x6b, 0x5b, 0xe6, 0xac, 0x92, 0x58, 0x0b, 0x37, 0x8e, - 0x1b, 0xc7, 0x6c, 0x96, 0x87, 0x62, 0x80, 0x38, 0x32, 0xb9, 0x05, 0xe3, 0xc2, 0x36, 0x4e, 0xb8, - 0x31, 0xa8, 0x99, 0xba, 0xa4, 0xd5, 0x5c, 0xa8, 0xec, 0x70, 0xbb, 0x71, 0xed, 0x90, 0xa4, 0x66, - 0x97, 0x01, 0x99, 0x12, 0x45, 0x4d, 0xd4, 0xc9, 0xd8, 0xac, 0xb8, 0x1d, 0x9e, 0x67, 0xca, 0x5f, - 0x3e, 0x23, 0x38, 0xf5, 0x0b, 0x54, 0x54, 0x16, 0xaf, 0x59, 0xb9, 0x41, 0x4c, 0x4e, 0x0b, 0x26, - 0xe9, 0x0f, 0x5d, 0x6d, 0x38, 0x5d, 0xaf, 0xaf, 0xa1, 0x1d, 0x6d, 0xcd, 0xf5, 0x82, 0x9b, 0xae, - 0xf7, 0x48, 0xc4, 0x63, 0xa9, 0xeb, 0x36, 0x24, 0x69, 0xd6, 0x8d, 0xaf, 0xa4, 0x5a, 0x37, 0x0e, - 0xb0, 0x33, 0x31, 0x3a, 0x70, 0xa6, 0x5e, 0x5f, 0xe3, 0x59, 0x9e, 0xfe, 0x34, 0xea, 0xfb, 0xd5, - 0x0c, 0xcc, 0xd6, 0xeb, 0x6b, 0xb1, 0xaa, 0xd6, 0x65, 0x7a, 0xa9, 0x8c, 0xf6, 0x90, 0x9d, 0xde, - 0x11, 0x38, 0x0a, 0x19, 0x2e, 0x16, 0x36, 0xb4, 0x20, 0xe1, 0x9c, 0x09, 0xa9, 0x85, 0x09, 0xad, - 0xb2, 0x9a, 0x6b, 0x4b, 0x9f, 0x86, 0xa2, 0xb2, 0x5f, 0x38, 0x86, 0xb2, 0x52, 0x5d, 0xd9, 0xcf, - 0x20, 0xc6, 0xbf, 0x38, 0xcd, 0x53, 0x66, 0xc9, 0xd9, 0xf2, 0x0e, 0x14, 0x04, 0x3d, 0xfa, 0x7f, - 0x08, 0x9b, 0x9e, 0xb3, 0x6c, 0x83, 0xdc, 0xe1, 0x70, 0x9e, 0xfd, 0xe4, 0xbb, 0x87, 0xa5, 0x11, - 0xd6, 0x35, 0xa6, 0x86, 0x4e, 0xee, 0xc1, 0xd4, 0x5d, 0xfb, 0xb1, 0xa2, 0xd9, 0xe1, 0xde, 0x7d, - 0x97, 0xd8, 0xae, 0xd2, 0xb6, 0x1f, 0x0f, 0x61, 0x3d, 0xaa, 0xd3, 0x93, 0x7d, 0x98, 0xd6, 0xdb, - 0x24, 0x66, 0x60, 0x72, 0xc4, 0xae, 0xa5, 0x8e, 0xd8, 0xd9, 0xae, 0xeb, 0x05, 0xd6, 0x4e, 0x48, - 0xae, 0xa5, 0x87, 0x8b, 0xb1, 0x26, 0xef, 0xc0, 0xac, 0x12, 0x8a, 0xfd, 0xa6, 0xeb, 0xb5, 0x6d, - 0x79, 0x4b, 0xc3, 0xe7, 0x0e, 0x34, 0x2b, 0xdb, 0x41, 0xb0, 0x99, 0xc4, 0x24, 0x5f, 0x4e, 0xf3, - 0x98, 0x1c, 0x8d, 0x4c, 0x68, 0x53, 0x3c, 0x26, 0xfb, 0x99, 0xd0, 0x26, 0x7d, 0x27, 0x77, 0x07, - 0x99, 0xd8, 0xe7, 0x79, 0xeb, 0x87, 0x32, 0xa1, 0x0f, 0x47, 0xae, 0x8f, 0x29, 0xfd, 0x12, 0xe4, - 0x96, 0x6b, 0x37, 0xf1, 0x91, 0x4e, 0xda, 0xd3, 0x75, 0xf6, 0xec, 0x4e, 0x03, 0x6f, 0x4f, 0xc2, - 0xb1, 0x45, 0x3d, 0x28, 0x97, 0x6b, 0x37, 0x89, 0x0d, 0x73, 0x98, 0xee, 0x3b, 0xf8, 0xd2, 0xb5, - 0x6b, 0xca, 0x50, 0xe5, 0xf1, 0xd3, 0xae, 0x8a, 0x4f, 0x2b, 0x61, 0xb2, 0xf0, 0xc0, 0x7a, 0x7c, - 0xed, 0x5a, 0xea, 0x80, 0x84, 0x1f, 0x96, 0xc6, 0x8b, 0x1d, 0x58, 0x77, 0xed, 0xc7, 0x91, 0x3f, - 0x92, 0x2f, 0x7c, 0xcf, 0xcf, 0xc9, 0xa9, 0x15, 0xf9, 0x32, 0x69, 0x07, 0x96, 0x4e, 0xc4, 0x2e, - 0xbf, 0xd1, 0x04, 0xf3, 0x85, 0xd7, 0xde, 0xa2, 0xd4, 0x5c, 0xca, 0x00, 0x05, 0xea, 0x0d, 0x4e, - 0x41, 0x27, 0x5b, 0xe1, 0x15, 0x9e, 0x5f, 0x81, 0xd1, 0xd0, 0x7d, 0x62, 0xf9, 0xaa, 0x7a, 0x85, - 0xe7, 0xfa, 0x42, 0xad, 0x59, 0x33, 0xa1, 0xde, 0x87, 0x3b, 0x68, 0x99, 0x3a, 0x97, 0xa4, 0x66, - 0xa0, 0x70, 0x72, 0xcd, 0x00, 0x85, 0x91, 0x75, 0xb7, 0xb1, 0x2f, 0x22, 0x1d, 0xbf, 0xcf, 0x76, - 0xe1, 0x96, 0xdb, 0xd8, 0x7f, 0x72, 0xae, 0x03, 0xc8, 0x9e, 0x6c, 0xf0, 0xe8, 0x3b, 0x5e, 0x53, - 0xf4, 0x89, 0x30, 0x47, 0x9f, 0x0f, 0xaf, 0xc6, 0x4a, 0x59, 0x14, 0x93, 0xc7, 0x6b, 0xca, 0xae, - 0x35, 0x75, 0x72, 0x42, 0xa1, 0x58, 0xa1, 0xfe, 0x7e, 0xe0, 0x76, 0x57, 0x5a, 0x4e, 0x17, 0x03, - 0x5a, 0x89, 0x54, 0x39, 0x43, 0xef, 0xc9, 0x4d, 0x4e, 0x6f, 0x35, 0x24, 0x03, 0x33, 0xc1, 0x92, - 0x7c, 0x19, 0xa6, 0xd9, 0xe4, 0x5e, 0x7d, 0x1c, 0xd0, 0x0e, 0x1f, 0xf9, 0x59, 0x94, 0xe8, 0xe6, - 0x95, 0x44, 0x93, 0x61, 0x21, 0x9f, 0x53, 0xb8, 0xd8, 0x69, 0x48, 0xa0, 0x45, 0x89, 0xd6, 0x58, - 0x91, 0x26, 0x2c, 0xdc, 0xb5, 0x1f, 0x47, 0x17, 0x65, 0x75, 0x92, 0x12, 0x9c, 0x60, 0x17, 0x8f, - 0x0e, 0x4b, 0x2f, 0xb1, 0x09, 0x16, 0x65, 0x6f, 0xea, 0x33, 0x5f, 0xfb, 0x72, 0x22, 0xdf, 0x80, - 0x33, 0xa2, 0x59, 0x15, 0x4c, 0x88, 0xed, 0x7a, 0x07, 0xf5, 0x3d, 0x1b, 0x5d, 0x11, 0xe7, 0xfa, - 0x74, 0xd8, 0xd5, 0xf4, 0x2d, 0x51, 0x76, 0x58, 0x53, 0xf2, 0xb1, 0x7c, 0xce, 0xc8, 0xec, 0x57, - 0x03, 0xf9, 0x08, 0xa6, 0xf9, 0xcb, 0xe4, 0x9a, 0xeb, 0x07, 0xa8, 0xe1, 0x99, 0x3f, 0x99, 0x7f, - 0x0d, 0x7f, 0xee, 0xe4, 0x3e, 0x69, 0x31, 0x8d, 0x50, 0x8c, 0x33, 0x79, 0x0b, 0x4d, 0x58, 0x79, - 0x1c, 0xf7, 0x6a, 0x0d, 0x35, 0xec, 0xe2, 0x04, 0xea, 0x3a, 0x1d, 0x4b, 0xaa, 0x59, 0xba, 0xe1, - 0x76, 0xa1, 0x62, 0x93, 0x07, 0x30, 0x59, 0xaf, 0xaf, 0xdd, 0x74, 0x98, 0x5c, 0xd2, 0x95, 0x0a, - 0xf3, 0xe4, 0x57, 0xbe, 0x98, 0xfa, 0x95, 0x53, 0xbe, 0xbf, 0x67, 0x61, 0xce, 0xe6, 0x86, 0xdb, - 0x3d, 0x30, 0x55, 0x4e, 0x29, 0x3e, 0x27, 0x67, 0x9e, 0xb0, 0xcf, 0x49, 0x15, 0x66, 0x14, 0x3b, - 0x6a, 0x34, 0xcb, 0x59, 0x88, 0x82, 0x7f, 0xaa, 0x3e, 0x26, 0x71, 0x2f, 0xeb, 0x38, 0x9d, 0x74, - 0x36, 0x39, 0x7b, 0x52, 0x67, 0x13, 0x07, 0x66, 0xf9, 0x60, 0x88, 0x79, 0x80, 0x23, 0xbd, 0xd8, - 0xa7, 0x0f, 0x2f, 0xa5, 0xf6, 0xe1, 0x9c, 0x18, 0x69, 0x39, 0xc9, 0xf0, 0x25, 0x3e, 0xc9, 0x95, - 0xec, 0x00, 0x11, 0x40, 0x3b, 0xb0, 0xb7, 0x6d, 0x9f, 0x62, 0x5d, 0xcf, 0xf6, 0xa9, 0xeb, 0xa5, - 0xd4, 0xba, 0xa6, 0x65, 0x5d, 0xdb, 0xbc, 0x9a, 0x14, 0x8e, 0xa4, 0x23, 0xeb, 0x91, 0xf3, 0x0b, - 0x3b, 0xf6, 0x39, 0x4d, 0x31, 0x9e, 0x44, 0xe0, 0x71, 0x34, 0xe3, 0x93, 0x36, 0xde, 0xef, 0x29, - 0x9c, 0xc9, 0x63, 0x38, 0x9d, 0xfc, 0x0a, 0xac, 0xf3, 0x1c, 0xd6, 0x79, 0x4e, 0xab, 0x33, 0x8e, - 0xc4, 0xe7, 0x8d, 0xde, 0xac, 0x78, 0xad, 0x7d, 0xf8, 0x93, 0x1f, 0xc9, 0xc0, 0x99, 0xbb, 0x37, - 0xcb, 0xf7, 0xa9, 0xc7, 0xc5, 0x12, 0xc7, 0xed, 0x84, 0xde, 0xe9, 0xcf, 0x8b, 0xc7, 0x93, 0xf8, - 0xc3, 0x91, 0x94, 0x38, 0x70, 0xab, 0x60, 0xa2, 0xfb, 0x8b, 0xed, 0x1d, 0xdb, 0x7a, 0xa8, 0xb0, - 0x48, 0x71, 0x61, 0xff, 0xd6, 0xef, 0x97, 0x32, 0x66, 0xbf, 0xaa, 0x48, 0x0b, 0x16, 0xf5, 0x6e, - 0x91, 0xee, 0x40, 0x7b, 0xb4, 0xd5, 0x5a, 0x28, 0xe1, 0x8c, 0x7e, 0xfd, 0xe8, 0xb0, 0x74, 0x31, - 0xd1, 0xbb, 0xa1, 0x8b, 0x11, 0xc3, 0x54, 0x1a, 0x3c, 0x80, 0x1f, 0x69, 0xa7, 0x08, 0xdd, 0x0b, - 0xe7, 0xb5, 0x30, 0x56, 0x89, 0xf2, 0x30, 0xcc, 0xda, 0x39, 0xb6, 0xde, 0xfb, 0x0a, 0x88, 0x66, - 0x92, 0xf3, 0xed, 0x91, 0xfc, 0x54, 0x71, 0x3a, 0xc5, 0x4f, 0xc6, 0xf8, 0x76, 0x36, 0x76, 0x30, - 0x92, 0x2a, 0x8c, 0x8b, 0xf9, 0xde, 0xf7, 0x92, 0x71, 0x2e, 0x75, 0x56, 0x8f, 0x8b, 0xa5, 0x63, - 0x4a, 0x7a, 0xf2, 0x88, 0xb1, 0xc2, 0x46, 0x8b, 0x1b, 0xef, 0x87, 0xfc, 0xdc, 0x43, 0x90, 0x76, - 0xc2, 0x57, 0x4e, 0xee, 0x53, 0xaa, 0xbb, 0x2c, 0xe3, 0x51, 0x2f, 0x6b, 0x23, 0xfb, 0x3c, 0xef, - 0x6f, 0x2e, 0x74, 0x4b, 0xd4, 0x93, 0xfc, 0x3e, 0xb1, 0x0a, 0x59, 0x2d, 0xc6, 0x6f, 0x64, 0x60, - 0x4a, 0x3b, 0x59, 0xc9, 0x0d, 0xc5, 0xeb, 0x36, 0x0a, 0x44, 0xa1, 0xe1, 0xe0, 0x66, 0x1b, 0xf7, - 0xc7, 0xbd, 0xa1, 0x04, 0x70, 0xec, 0x43, 0x87, 0x8b, 0x2d, 0xee, 0x84, 0x3d, 0x58, 0x3f, 0x5c, - 0x82, 0x51, 0x1e, 0xc1, 0x67, 0x24, 0x32, 0xba, 0x44, 0xfd, 0x8a, 0xc9, 0xe1, 0xc6, 0x7f, 0x5a, - 0x82, 0x69, 0xfd, 0x46, 0x4c, 0x5e, 0x87, 0x31, 0x54, 0xe8, 0x4b, 0xf5, 0x0a, 0xaa, 0x85, 0x50, - 0xe7, 0xaf, 0xf9, 0x25, 0x71, 0x1c, 0xf2, 0x32, 0x40, 0x68, 0xc0, 0x2f, 0x9f, 0xb3, 0x46, 0x8f, - 0x0e, 0x4b, 0x99, 0xcb, 0xa6, 0x52, 0x40, 0xbe, 0x0a, 0xb0, 0xe1, 0x36, 0xa9, 0x48, 0x63, 0x99, - 0x1b, 0x64, 0x88, 0xf2, 0x4a, 0x22, 0x8d, 0xe5, 0xa9, 0x8e, 0xdb, 0xa4, 0xc9, 0x9c, 0x95, 0x0a, - 0x47, 0xf2, 0x05, 0x18, 0x35, 0x7b, 0x2d, 0x2a, 0x9f, 0x3d, 0x26, 0xe5, 0x09, 0xd7, 0x6b, 0xd1, - 0x48, 0x4f, 0xe0, 0xf5, 0xe2, 0x36, 0x96, 0x0c, 0x40, 0xde, 0xe3, 0xe9, 0x2d, 0x45, 0xc0, 0xf5, - 0xd1, 0xe8, 0x81, 0x4f, 0x91, 0x7c, 0x12, 0x21, 0xd7, 0x15, 0x12, 0x72, 0x0f, 0xc6, 0xd5, 0x97, - 0x29, 0x25, 0x7c, 0x83, 0xfa, 0x7a, 0xa9, 0x28, 0x1d, 0x44, 0xe4, 0xd9, 0xf8, 0xa3, 0x95, 0xe4, - 0x42, 0xde, 0x86, 0x09, 0xc6, 0x9e, 0xed, 0x1c, 0xbe, 0xb8, 0xd5, 0xe0, 0x33, 0x9e, 0xf2, 0x41, - 0x6c, 0xf7, 0xd1, 0xc2, 0xa2, 0x87, 0x04, 0xe4, 0xcb, 0x30, 0x51, 0xee, 0x76, 0x45, 0x57, 0x0f, - 0x34, 0x50, 0xba, 0x90, 0xe8, 0xea, 0x79, 0xbb, 0xdb, 0x4d, 0xf6, 0x74, 0xc4, 0x8f, 0xec, 0x86, - 0xd1, 0x03, 0x87, 0x49, 0x49, 0xfa, 0x6a, 0xa2, 0x82, 0x05, 0x19, 0x10, 0x2f, 0x51, 0x89, 0xce, - 0x97, 0x74, 0xa1, 0x18, 0x09, 0x95, 0xa2, 0x2e, 0x18, 0x54, 0xd7, 0xe5, 0x44, 0x5d, 0xea, 0x00, - 0x26, 0xaa, 0x4b, 0x70, 0x27, 0x4d, 0x98, 0x96, 0x07, 0x94, 0xa8, 0x6f, 0x72, 0x50, 0x7d, 0x2f, - 0x27, 0xea, 0x9b, 0x6b, 0x6e, 0x27, 0xeb, 0x89, 0xf1, 0x24, 0x6f, 0xc3, 0x94, 0x84, 0xe0, 0xfa, - 0x40, 0xc3, 0x20, 0xa1, 0x10, 0x6c, 0x6e, 0xa3, 0xcb, 0x90, 0xd6, 0x2b, 0x1a, 0xb2, 0x4a, 0xcd, - 0x67, 0xc7, 0x94, 0x46, 0x1d, 0x9f, 0x15, 0x3a, 0x32, 0xf9, 0x00, 0x26, 0xab, 0x6d, 0xd6, 0x10, - 0xb7, 0x63, 0x07, 0x54, 0x38, 0xf6, 0x4a, 0x63, 0x2b, 0xa5, 0x44, 0x99, 0xaa, 0x68, 0x66, 0xe2, - 0x44, 0x45, 0xea, 0x35, 0x53, 0xa1, 0x60, 0x9d, 0xc7, 0x9f, 0x22, 0xc5, 0x1c, 0x96, 0x4e, 0xbf, - 0xe7, 0x52, 0x0c, 0x9e, 0x14, 0xf6, 0x22, 0xb8, 0x36, 0x83, 0xca, 0xa7, 0xc0, 0x58, 0x62, 0x03, - 0x95, 0x27, 0x79, 0x07, 0x26, 0x45, 0xb6, 0xe6, 0xb2, 0xb9, 0xe1, 0x2f, 0x14, 0x23, 0x7b, 0x6d, - 0x99, 0xd8, 0xd9, 0xb2, 0xbd, 0x98, 0x65, 0x6f, 0x84, 0x4f, 0xbe, 0x04, 0xf3, 0x0f, 0x9c, 0x4e, - 0xd3, 0x7d, 0xe4, 0x8b, 0x63, 0x4a, 0x6c, 0x74, 0xb3, 0x91, 0x5f, 0xe1, 0x23, 0x5e, 0x1e, 0xca, - 0x82, 0x89, 0x8d, 0x2f, 0x95, 0x03, 0xf9, 0x81, 0x04, 0x67, 0x3e, 0x83, 0xc8, 0xa0, 0x19, 0xb4, - 0x94, 0x98, 0x41, 0xc9, 0xea, 0xe3, 0xd3, 0x29, 0xb5, 0x1a, 0xe2, 0x02, 0xd1, 0xcf, 0xf7, 0xdb, - 0xae, 0xd3, 0x59, 0x98, 0xc3, 0xbd, 0xf0, 0xd9, 0x78, 0x78, 0x10, 0xc4, 0xab, 0xb9, 0x2d, 0xa7, - 0x71, 0xb0, 0x6c, 0x1c, 0x1d, 0x96, 0x9e, 0x8f, 0xcb, 0xfc, 0x1f, 0xb9, 0xda, 0x73, 0x49, 0x0a, - 0x6b, 0xf2, 0x01, 0x14, 0xd8, 0xff, 0xa1, 0x52, 0x62, 0x5e, 0x33, 0x91, 0x55, 0x30, 0x45, 0x3d, - 0x38, 0x46, 0x98, 0x4e, 0x3a, 0x45, 0x5f, 0xa1, 0xb1, 0x22, 0x6f, 0x02, 0x30, 0xb1, 0x49, 0x6c, - 0xc7, 0xa7, 0xa2, 0x3c, 0x12, 0x28, 0x75, 0x25, 0x37, 0xe2, 0x08, 0x99, 0xbc, 0x0d, 0x93, 0xec, - 0x57, 0xbd, 0xd7, 0x74, 0xd9, 0xda, 0x38, 0x8d, 0xb4, 0xdc, 0xc7, 0x9a, 0xd1, 0xfa, 0x1c, 0xae, - 0xf9, 0x58, 0x47, 0xe8, 0x64, 0x0d, 0x66, 0x30, 0xdf, 0x87, 0x88, 0x34, 0xef, 0x50, 0x7f, 0xe1, - 0x8c, 0x62, 0x42, 0x81, 0x29, 0x55, 0x9d, 0xb0, 0x4c, 0xbd, 0xcb, 0xc4, 0xc8, 0x88, 0x0f, 0x73, - 0xc9, 0x37, 0x68, 0x7f, 0x61, 0x01, 0x3b, 0x49, 0x4a, 0xf0, 0x49, 0x0c, 0xbe, 0x1f, 0xb3, 0x11, - 0x51, 0x36, 0x2e, 0xf9, 0xa8, 0xa4, 0x56, 0x98, 0xc6, 0x9d, 0x98, 0x40, 0x6e, 0xad, 0xd4, 0xe2, - 0x09, 0x31, 0xce, 0x62, 0x0b, 0x70, 0x98, 0x77, 0x1b, 0x5d, 0x6b, 0x40, 0x52, 0x8c, 0x14, 0x6a, - 0xf2, 0xfd, 0x70, 0x4a, 0xee, 0x20, 0xa2, 0x48, 0xcc, 0xeb, 0xc5, 0x13, 0xee, 0xc4, 0xcd, 0xed, - 0xb0, 0xea, 0xc4, 0x94, 0x4e, 0xaf, 0x82, 0xd8, 0x30, 0x89, 0xc3, 0x2a, 0x6a, 0x7c, 0x76, 0x50, - 0x8d, 0x17, 0x13, 0x35, 0x9e, 0xc6, 0x89, 0x92, 0xac, 0x4c, 0xe5, 0x49, 0x96, 0x61, 0x4a, 0xac, - 0x23, 0x31, 0xdb, 0x9e, 0xc3, 0xde, 0x42, 0x25, 0x96, 0x5c, 0x81, 0x89, 0x09, 0xa7, 0x93, 0xa8, - 0x3b, 0x32, 0x7f, 0x4c, 0x3a, 0xa7, 0xed, 0xc8, 0xf1, 0x37, 0x24, 0x1d, 0x99, 0xed, 0x48, 0x91, - 0x14, 0xb3, 0xfa, 0xb8, 0xeb, 0x09, 0x15, 0xd5, 0xf3, 0x51, 0x76, 0x4a, 0x45, 0xf8, 0xb1, 0x68, - 0x88, 0xa1, 0x6e, 0x09, 0x69, 0x1c, 0xc8, 0x16, 0xcc, 0x85, 0xa7, 0xb6, 0xc2, 0xb8, 0x14, 0xa5, - 0x5c, 0x88, 0x8e, 0xfa, 0x74, 0xbe, 0x69, 0xf4, 0xc4, 0x86, 0x33, 0xda, 0x39, 0xad, 0xb0, 0x3e, - 0x8f, 0xac, 0x5f, 0x61, 0x37, 0x32, 0xfd, 0x90, 0x4f, 0x67, 0xdf, 0x8f, 0x0f, 0xf9, 0x08, 0x16, - 0xe3, 0x67, 0xb3, 0x52, 0xcb, 0x0b, 0x58, 0xcb, 0xab, 0x47, 0x87, 0xa5, 0x0b, 0x89, 0xe3, 0x3d, - 0xbd, 0xa2, 0x01, 0xdc, 0xc8, 0x57, 0x61, 0x41, 0x3f, 0x9f, 0x95, 0x9a, 0x0c, 0xac, 0x09, 0x97, - 0x4e, 0x78, 0xb0, 0xa7, 0xd7, 0xd0, 0x97, 0x07, 0x09, 0xa0, 0x94, 0x3a, 0xbb, 0x95, 0x6a, 0x5e, - 0x8c, 0x1a, 0x94, 0x58, 0x25, 0xe9, 0xd5, 0x1d, 0xc7, 0x92, 0x3c, 0x82, 0xe7, 0xd3, 0x8e, 0x09, - 0xa5, 0xd2, 0x97, 0x42, 0x25, 0xf0, 0x6b, 0xe9, 0x47, 0x4e, 0x7a, 0xcd, 0xc7, 0xb0, 0x25, 0x5f, - 0x86, 0x53, 0xca, 0xfa, 0x52, 0xea, 0x7b, 0x19, 0xeb, 0xc3, 0xa8, 0x00, 0xea, 0xc2, 0x4c, 0xaf, - 0x25, 0x9d, 0x07, 0x69, 0xc3, 0x9c, 0x6c, 0x38, 0x6a, 0xdb, 0xc5, 0xd1, 0x73, 0x41, 0xdb, 0x55, - 0x93, 0x18, 0xcb, 0xe7, 0xc5, 0xae, 0xba, 0xd0, 0xdc, 0xb6, 0xba, 0x11, 0xa1, 0x3a, 0xd3, 0x53, - 0xf8, 0x92, 0x35, 0x18, 0xab, 0xd7, 0xaa, 0x37, 0x6f, 0xae, 0x2e, 0xbc, 0x82, 0x35, 0x48, 0xbf, - 0x3f, 0x0e, 0xd4, 0x2e, 0x4d, 0xc2, 0xc6, 0xb1, 0xeb, 0xec, 0xec, 0x68, 0x0f, 0x56, 0x1c, 0x95, - 0xfc, 0x00, 0x5a, 0x17, 0xb2, 0x1d, 0xb5, 0xec, 0xfb, 0xce, 0x6e, 0x87, 0x27, 0xb3, 0x78, 0x55, - 0x7b, 0xef, 0x97, 0xe9, 0x4d, 0x56, 0x30, 0x71, 0x6c, 0x02, 0x9d, 0x4b, 0x9b, 0xec, 0xfe, 0x2f, - 0x76, 0x6e, 0xcb, 0x8e, 0x58, 0xa9, 0x9b, 0x78, 0xb2, 0x22, 0xd6, 0x6f, 0xbb, 0x4e, 0x60, 0xed, - 0xf5, 0xb4, 0xe6, 0x2f, 0xbc, 0xa6, 0x05, 0x13, 0xe7, 0xe9, 0x74, 0x95, 0x5e, 0x7b, 0x49, 0x54, - 0xf8, 0x1c, 0xbf, 0x2d, 0xf7, 0xe9, 0xb9, 0xd9, 0xdd, 0x18, 0x9d, 0x4f, 0x7e, 0x38, 0x03, 0xa7, - 0x1f, 0xb8, 0xde, 0x7e, 0xcb, 0xb5, 0x9b, 0xb2, 0x55, 0x62, 0x0f, 0x7f, 0x7d, 0xd0, 0x1e, 0xfe, - 0xd9, 0xc4, 0x1e, 0x6e, 0x3c, 0x12, 0x6c, 0xac, 0x30, 0x3b, 0x4c, 0x62, 0x3f, 0xef, 0x53, 0x15, - 0xf9, 0x01, 0x38, 0x9f, 0x5e, 0xa2, 0x4c, 0xca, 0xcb, 0x38, 0x29, 0xaf, 0x1d, 0x1d, 0x96, 0x2e, - 0xf7, 0xab, 0x29, 0x7d, 0x82, 0x1e, 0xcb, 0xfa, 0xf6, 0x48, 0xfe, 0x62, 0xf1, 0xd2, 0xed, 0x91, - 0xfc, 0xa5, 0xe2, 0xab, 0xe6, 0x73, 0xf5, 0xf2, 0xdd, 0xf5, 0x6a, 0x53, 0x1e, 0xae, 0x32, 0x81, - 0x0d, 0xa7, 0x31, 0x2f, 0x0c, 0x2a, 0x8d, 0x38, 0x1a, 0x7f, 0x2d, 0x03, 0xa5, 0x63, 0x26, 0x09, - 0x3b, 0xcf, 0xa2, 0x91, 0xa8, 0x87, 0x49, 0x13, 0xb8, 0x63, 0x60, 0x58, 0x60, 0xe9, 0x66, 0x23, - 0x3a, 0x09, 0x3a, 0x8d, 0x8a, 0xdc, 0x6b, 0x8a, 0xef, 0x70, 0x32, 0xe7, 0x9a, 0xc4, 0x32, 0xd6, - 0xa1, 0x18, 0x9f, 0x3c, 0xe4, 0xf3, 0x30, 0xa5, 0x66, 0x7e, 0x92, 0xaa, 0x04, 0x1e, 0x31, 0xc7, - 0xdb, 0xd5, 0x0e, 0x44, 0x0d, 0xd1, 0xf8, 0x85, 0x0c, 0xcc, 0xa5, 0xac, 0x30, 0x72, 0x01, 0x46, - 0x30, 0x35, 0xab, 0x62, 0x35, 0x14, 0x4b, 0xc9, 0x8a, 0xe5, 0xe4, 0x33, 0x30, 0x5e, 0xd9, 0xa8, - 0xd7, 0xcb, 0x1b, 0x52, 0x19, 0xc1, 0x0f, 0xe2, 0x8e, 0x6f, 0xf9, 0xb6, 0x6e, 0x6c, 0x20, 0xd0, - 0xc8, 0x65, 0x18, 0xab, 0xd6, 0x90, 0x40, 0x49, 0x0b, 0xe3, 0x74, 0xe3, 0xf8, 0x02, 0xc9, 0xf8, - 0x89, 0x0c, 0x90, 0xe4, 0x76, 0x41, 0xae, 0xc1, 0xa4, 0xba, 0x29, 0xf1, 0xf6, 0xe2, 0x0b, 0xac, - 0xb2, 0x70, 0x4c, 0x15, 0x87, 0x54, 0x60, 0xf4, 0xae, 0x1d, 0x34, 0xf6, 0x42, 0x2b, 0x87, 0xd4, - 0x65, 0x71, 0x26, 0xb1, 0x2c, 0x46, 0xdb, 0x8c, 0xca, 0xe4, 0xc4, 0xc6, 0x1f, 0x67, 0x80, 0xa4, - 0x1b, 0x3c, 0x0e, 0x65, 0x65, 0xf5, 0x86, 0x12, 0x7b, 0x42, 0xb5, 0x78, 0x0c, 0x33, 0xe7, 0xaa, - 0x6a, 0x80, 0x28, 0x4a, 0xc5, 0x05, 0x4d, 0xed, 0xd4, 0xdf, 0x61, 0xf9, 0x12, 0x8c, 0xde, 0xa7, - 0xde, 0xb6, 0xb4, 0x05, 0x47, 0xfb, 0xd1, 0x87, 0x0c, 0xa0, 0xaa, 0x61, 0x10, 0x43, 0x33, 0xbd, - 0x1c, 0x1d, 0xd6, 0xf4, 0xf2, 0x0f, 0x32, 0x30, 0x9f, 0x76, 0xb1, 0x39, 0xc6, 0x19, 0xd9, 0x88, - 0xf9, 0x51, 0xa3, 0x59, 0x16, 0xb7, 0x48, 0x0d, 0xbd, 0xa7, 0x4b, 0x30, 0xca, 0x7a, 0x48, 0x4e, - 0x0b, 0xd4, 0x9d, 0xb1, 0x2e, 0xf4, 0x4d, 0x0e, 0x67, 0x08, 0x51, 0x36, 0x8f, 0x51, 0x8e, 0xc0, - 0x93, 0x78, 0x70, 0x38, 0x43, 0xb8, 0xeb, 0x36, 0xa9, 0xd4, 0x29, 0x21, 0x42, 0x9b, 0x01, 0x4c, - 0x0e, 0x27, 0x17, 0x60, 0xfc, 0x5e, 0x67, 0x9d, 0xda, 0x0f, 0x65, 0xd6, 0x30, 0x34, 0x23, 0x73, - 0x3b, 0x56, 0x8b, 0xc1, 0x4c, 0x59, 0x68, 0xfc, 0x6c, 0x06, 0x66, 0x13, 0x77, 0xaa, 0xe3, 0xfd, - 0xad, 0x07, 0xfb, 0x10, 0x0e, 0xd3, 0x3e, 0xfe, 0xf9, 0x23, 0xe9, 0x9f, 0x6f, 0xfc, 0x37, 0x63, - 0x70, 0xa6, 0x8f, 0x8a, 0x2b, 0xf2, 0x71, 0xce, 0x1c, 0xeb, 0xe3, 0xfc, 0x15, 0x98, 0x5a, 0x69, - 0xd9, 0x4e, 0xdb, 0xdf, 0x74, 0xa3, 0x2f, 0x8e, 0x5c, 0xa5, 0xb0, 0x4c, 0x78, 0x5c, 0x84, 0x3e, - 0x35, 0x67, 0x1b, 0x48, 0x61, 0x05, 0x6e, 0x52, 0xc2, 0xd6, 0x98, 0x25, 0xbc, 0x8c, 0x73, 0x7f, - 0x46, 0xbc, 0x8c, 0x75, 0xbf, 0xb7, 0x91, 0x27, 0xea, 0xf7, 0x96, 0x6e, 0x5d, 0x3e, 0xfa, 0x49, - 0x7c, 0x0d, 0x56, 0x60, 0x8a, 0xdb, 0xd1, 0x95, 0x7d, 0x3e, 0x48, 0x63, 0x09, 0xdb, 0x3b, 0xdb, - 0x4f, 0x8e, 0x85, 0x46, 0x43, 0xd6, 0x74, 0x1f, 0xad, 0x71, 0x7c, 0x68, 0xbe, 0xd0, 0xdf, 0x07, - 0x4b, 0x0f, 0xf4, 0xa3, 0xfa, 0x62, 0x7d, 0x03, 0xe6, 0xd3, 0xee, 0xc8, 0x0b, 0x79, 0xcd, 0x44, - 0xb7, 0xaf, 0x3d, 0xf8, 0xf0, 0x37, 0xed, 0xfd, 0xd4, 0x9b, 0xb6, 0xf4, 0x9d, 0x9f, 0xe8, 0xef, - 0x78, 0x14, 0xad, 0x05, 0x8e, 0x3b, 0xd8, 0xc3, 0xde, 0xf8, 0x4a, 0x2c, 0xf8, 0x41, 0x9c, 0x9c, - 0xbc, 0xa5, 0xc5, 0xa8, 0x7a, 0x25, 0x19, 0xa3, 0x2a, 0x3d, 0xde, 0x01, 0x4f, 0x00, 0xf5, 0xb3, - 0x59, 0xdd, 0x63, 0xfb, 0xcf, 0xe2, 0x42, 0xbd, 0x04, 0xa3, 0x0f, 0xf6, 0xa8, 0x27, 0xcf, 0x14, - 0xfc, 0x90, 0x47, 0x0c, 0xa0, 0x7e, 0x08, 0x62, 0x90, 0x9b, 0x30, 0x5d, 0xe3, 0x13, 0x57, 0xce, - 0xc6, 0x91, 0x48, 0x51, 0xd3, 0x15, 0xea, 0xc4, 0x94, 0xe9, 0x18, 0xa3, 0x32, 0x6e, 0xc5, 0x3a, - 0x5d, 0x44, 0xd8, 0xe2, 0x3e, 0x58, 0x5c, 0xea, 0x98, 0x8e, 0x7c, 0xe9, 0xa2, 0xcd, 0xd6, 0x8c, - 0x41, 0x8d, 0x1d, 0x78, 0x7e, 0x20, 0x23, 0x76, 0xd8, 0x43, 0x37, 0xfc, 0x15, 0x33, 0xd7, 0x1e, - 0x48, 0x6a, 0x2a, 0x74, 0xc6, 0x37, 0xa0, 0xa0, 0xf6, 0x32, 0x1e, 0x41, 0xec, 0xb7, 0x98, 0x15, - 0xfc, 0x08, 0x62, 0x00, 0x93, 0xc3, 0xa3, 0x07, 0xa0, 0x6c, 0xfa, 0x03, 0x50, 0x34, 0xfc, 0xb9, - 0xe3, 0x86, 0x9f, 0x55, 0x8e, 0x3b, 0x9c, 0x52, 0x39, 0xfe, 0x56, 0x2b, 0xc7, 0xb8, 0x57, 0x26, - 0x87, 0x3f, 0xd1, 0xca, 0xff, 0xb9, 0x4c, 0x20, 0x88, 0x2e, 0x5e, 0x72, 0xb9, 0x67, 0xa2, 0x5c, - 0xb1, 0x69, 0xab, 0x37, 0xc2, 0x8c, 0x04, 0x91, 0xec, 0xb1, 0x82, 0xc8, 0x09, 0x26, 0x22, 0x0a, - 0xcb, 0x7c, 0x48, 0x47, 0x22, 0xe1, 0xd1, 0x4e, 0x98, 0xc8, 0x48, 0x2c, 0xe3, 0x5b, 0x19, 0x38, - 0x95, 0xaa, 0x68, 0x67, 0xb5, 0x72, 0x8d, 0xbe, 0xb2, 0x0e, 0xe3, 0xea, 0x7c, 0x8e, 0x71, 0x92, - 0xf8, 0x21, 0xc3, 0xb7, 0xc5, 0x78, 0x01, 0x26, 0xc2, 0x67, 0x5e, 0x32, 0x2f, 0x87, 0x8e, 0x07, - 0x48, 0x14, 0xaf, 0x85, 0x75, 0x00, 0xf6, 0x05, 0x4f, 0xd4, 0x1e, 0xdb, 0xf8, 0xe7, 0x59, 0x18, - 0x63, 0x5c, 0x9f, 0xda, 0x50, 0xce, 0xe9, 0x46, 0xd4, 0xac, 0x49, 0xfd, 0x03, 0x38, 0x93, 0x55, - 0x18, 0xe3, 0xc9, 0xef, 0xc4, 0x93, 0xe1, 0x9c, 0x4a, 0x26, 0xb3, 0xe2, 0x85, 0x81, 0x2f, 0x7c, - 0x84, 0x68, 0xaa, 0x05, 0x84, 0x28, 0xb6, 0xd8, 0xbf, 0x93, 0x81, 0x82, 0x4a, 0x4c, 0x3e, 0x80, - 0x69, 0x19, 0x9e, 0x96, 0x07, 0x83, 0x11, 0x6f, 0xd2, 0xd2, 0x7e, 0x4c, 0x86, 0xa7, 0x55, 0x83, - 0xc7, 0x68, 0xf8, 0xea, 0x56, 0xdd, 0x55, 0x91, 0x49, 0x13, 0x48, 0x7b, 0xc7, 0xb6, 0x1e, 0x51, - 0x7b, 0x9f, 0xfa, 0x81, 0xc5, 0xed, 0x7c, 0xc4, 0xd3, 0xb5, 0x64, 0x7f, 0xf7, 0x66, 0x99, 0x9b, - 0xf8, 0xb0, 0x91, 0x10, 0x71, 0x86, 0x13, 0x34, 0xea, 0x7b, 0x5c, 0x7b, 0xc7, 0x7e, 0xc0, 0x0b, - 0x39, 0x9d, 0xf1, 0x87, 0x63, 0x7c, 0xba, 0x89, 0x78, 0xd6, 0xdb, 0x30, 0x7d, 0xaf, 0x5a, 0x59, - 0x51, 0xb4, 0xf3, 0x7a, 0x3a, 0xb4, 0xd5, 0xc7, 0x01, 0xf5, 0x3a, 0x76, 0x4b, 0x5e, 0x92, 0xa3, - 0x23, 0xc8, 0x75, 0x9a, 0x8d, 0x74, 0xcd, 0x7d, 0x8c, 0x23, 0xab, 0x83, 0x5f, 0xc7, 0xc3, 0x3a, - 0xb2, 0x43, 0xd6, 0xe1, 0xdb, 0xed, 0x56, 0x9f, 0x3a, 0x74, 0x8e, 0x64, 0x0f, 0xef, 0xcb, 0x7b, - 0xbd, 0x6d, 0xa5, 0x96, 0xdc, 0xe0, 0x5a, 0x5e, 0x14, 0xb5, 0x3c, 0x2b, 0x74, 0x31, 0xa9, 0xf5, - 0x24, 0xb8, 0x46, 0xfb, 0xc4, 0xc8, 0xb1, 0xfb, 0xc4, 0xff, 0x3f, 0x03, 0x63, 0x5c, 0x7c, 0x15, - 0xd3, 0xb8, 0x8f, 0x80, 0xfc, 0xe0, 0xc9, 0x08, 0xc8, 0x45, 0x3c, 0x27, 0xb4, 0x09, 0xcd, 0xcb, - 0x48, 0x25, 0xb6, 0x2e, 0xa4, 0x0b, 0x01, 0xbe, 0xb3, 0xf1, 0x92, 0xe3, 0x97, 0x05, 0xa9, 0x46, - 0xa1, 0x48, 0xc6, 0x8f, 0xf5, 0x3f, 0x97, 0xe1, 0x5b, 0xc6, 0x45, 0x28, 0x12, 0x3d, 0x00, 0xc9, - 0x3a, 0x4c, 0x88, 0x00, 0x27, 0xcb, 0x07, 0xe2, 0x35, 0xbd, 0xa8, 0xd9, 0x43, 0x35, 0x97, 0x0f, - 0x22, 0xd1, 0x5c, 0x84, 0x48, 0xb1, 0xb6, 0x55, 0x5f, 0x82, 0x88, 0x01, 0xb9, 0xc7, 0x33, 0x9d, - 0xf3, 0x78, 0xdf, 0x7a, 0x8a, 0x8f, 0x10, 0x2e, 0xe2, 0xbd, 0xc9, 0x28, 0x09, 0x29, 0xe1, 0xbd, - 0x23, 0x1e, 0x64, 0x1d, 0x8a, 0x68, 0x43, 0x47, 0x9b, 0x7c, 0xd5, 0x54, 0x2b, 0x3c, 0x88, 0x86, - 0xb0, 0x83, 0x0e, 0x78, 0x99, 0x58, 0x6e, 0x31, 0x4f, 0xcf, 0x04, 0xa5, 0xf1, 0x33, 0x59, 0x28, - 0xc6, 0x67, 0x1f, 0x79, 0x1b, 0x26, 0xc3, 0x78, 0xeb, 0xa1, 0xaf, 0x39, 0xbe, 0xaa, 0x45, 0x01, - 0xda, 0xf5, 0xfc, 0xd8, 0x0a, 0x3a, 0x59, 0x82, 0x3c, 0x5b, 0xc4, 0x9d, 0x28, 0x5c, 0x26, 0x6e, - 0xdb, 0x3d, 0x01, 0x53, 0x6f, 0xf5, 0x12, 0x8f, 0xd4, 0x61, 0x8e, 0x2d, 0x9a, 0xba, 0xd3, 0xd9, - 0x6d, 0xd1, 0x75, 0x77, 0xd7, 0xed, 0x05, 0x51, 0xba, 0x68, 0x7e, 0x81, 0xb1, 0xdb, 0x2d, 0xad, - 0x58, 0x4f, 0x16, 0x9d, 0x42, 0x4d, 0x2e, 0xf3, 0x63, 0xa6, 0x5a, 0x11, 0xc6, 0x30, 0x78, 0x54, - 0xa3, 0x11, 0x97, 0xf6, 0xf1, 0x02, 0x49, 0xd9, 0x59, 0x7f, 0x3f, 0x0b, 0x93, 0xca, 0xf4, 0x23, - 0x97, 0x20, 0x5f, 0xf5, 0xd7, 0xdd, 0xc6, 0x7e, 0x18, 0x3f, 0x74, 0xea, 0xe8, 0xb0, 0x34, 0xe1, - 0xf8, 0x56, 0x0b, 0x81, 0x66, 0x58, 0x4c, 0x96, 0x61, 0x8a, 0xff, 0x25, 0x13, 0xe7, 0x64, 0x23, - 0x85, 0x1c, 0x47, 0x96, 0x29, 0x73, 0xd4, 0xcd, 0x56, 0x23, 0x21, 0x1f, 0x02, 0x70, 0x00, 0x06, - 0x6f, 0xc8, 0x0d, 0x1f, 0x76, 0x42, 0x54, 0x90, 0x12, 0xb6, 0x41, 0x61, 0x48, 0xbe, 0xc6, 0xc3, - 0xb9, 0xcb, 0xe5, 0x32, 0x32, 0x7c, 0xdc, 0x0c, 0xc6, 0xdf, 0x4a, 0x0f, 0xdf, 0xa3, 0xb2, 0x14, - 0xb9, 0xae, 0x16, 0x65, 0x62, 0xd3, 0x72, 0x80, 0x88, 0x0a, 0x86, 0xf1, 0xbf, 0x64, 0x94, 0x45, - 0x46, 0x36, 0x60, 0x22, 0x9c, 0x40, 0xc2, 0x0e, 0x2d, 0xbc, 0x62, 0x48, 0xb8, 0x49, 0x77, 0x96, - 0x9f, 0x15, 0x26, 0x71, 0x73, 0xe1, 0x34, 0xd4, 0xd6, 0x9c, 0x04, 0x92, 0x2f, 0xc2, 0x08, 0x76, - 0x5d, 0xf6, 0xd8, 0xa6, 0xc9, 0x53, 0x7e, 0x84, 0xf5, 0x19, 0x36, 0x04, 0x29, 0xc9, 0x67, 0x84, - 0x8b, 0x38, 0xef, 0xfc, 0x69, 0xe5, 0xa8, 0x66, 0xdf, 0x11, 0x1e, 0xef, 0x51, 0x04, 0x27, 0x65, - 0xf6, 0xfc, 0xb5, 0x2c, 0x14, 0xe3, 0x4b, 0x9b, 0xbc, 0x07, 0x05, 0x79, 0xfc, 0xae, 0xd9, 0x22, - 0xeb, 0x4b, 0x41, 0x64, 0x5d, 0x91, 0x67, 0xf0, 0x9e, 0xad, 0xda, 0xad, 0x99, 0x1a, 0x01, 0x93, - 0x85, 0x36, 0x45, 0x18, 0x48, 0x65, 0x51, 0x05, 0x6e, 0xd0, 0x8d, 0x45, 0x11, 0x97, 0x68, 0xe4, - 0x0d, 0xc8, 0xdd, 0xbd, 0x59, 0x16, 0x5e, 0x81, 0xc5, 0xf8, 0x21, 0xcd, 0xcd, 0x6b, 0x75, 0x63, - 0x5f, 0x86, 0x4f, 0xd6, 0x95, 0x80, 0xfb, 0x63, 0x9a, 0x8d, 0xa2, 0x04, 0x87, 0x8d, 0x3b, 0x3e, - 0xf2, 0xfe, 0xed, 0x91, 0x7c, 0xae, 0x38, 0x22, 0x82, 0x30, 0xff, 0xeb, 0x1c, 0x4c, 0x84, 0xf5, - 0x13, 0xa2, 0x3a, 0x68, 0x0b, 0x67, 0xec, 0xb3, 0x90, 0x97, 0xd2, 0x9d, 0x70, 0x0e, 0x1c, 0xf7, - 0x85, 0x64, 0xb7, 0x00, 0x52, 0x8c, 0xe3, 0xbb, 0x82, 0x29, 0x7f, 0x92, 0x6b, 0x10, 0xca, 0x68, - 0xfd, 0x84, 0xb9, 0x11, 0x36, 0x60, 0x66, 0x88, 0x46, 0xa6, 0x21, 0xeb, 0xf0, 0xc0, 0x76, 0x13, - 0x66, 0xd6, 0x69, 0x92, 0xf7, 0x20, 0x6f, 0x37, 0x9b, 0x98, 0xc5, 0x76, 0x88, 0x04, 0xb8, 0x79, - 0xc6, 0x8d, 0x9f, 0x19, 0x48, 0x55, 0x0e, 0x48, 0x19, 0x26, 0x78, 0xa4, 0x70, 0x9f, 0x36, 0x87, - 0x38, 0x80, 0x22, 0x0e, 0x18, 0x60, 0x7c, 0xcb, 0xa7, 0x4d, 0xf2, 0x0a, 0x8c, 0xb0, 0xd1, 0x14, - 0x27, 0x8e, 0x14, 0x2a, 0xd9, 0x60, 0xf2, 0x0e, 0x5b, 0x7b, 0xc6, 0x44, 0x04, 0xf2, 0x12, 0xe4, - 0x7a, 0x4b, 0x3b, 0xe2, 0x2c, 0x29, 0x46, 0xc9, 0x2f, 0x42, 0x34, 0x56, 0x4c, 0xae, 0x43, 0xfe, - 0x91, 0x9e, 0x37, 0xe1, 0x54, 0x6c, 0x18, 0x43, 0xfc, 0x10, 0x91, 0xbc, 0x02, 0x39, 0xdf, 0x77, - 0x85, 0x15, 0xd4, 0x5c, 0x68, 0x9a, 0x7a, 0x2f, 0x1c, 0x35, 0xc6, 0xdd, 0xf7, 0xdd, 0xe5, 0x3c, - 0x8c, 0xf1, 0x03, 0xc6, 0x78, 0x1e, 0x20, 0xfa, 0xc6, 0xa4, 0xb3, 0xa7, 0xf1, 0x21, 0x4c, 0x84, - 0xdf, 0x46, 0xce, 0x01, 0xec, 0xd3, 0x03, 0x6b, 0xcf, 0xee, 0x34, 0x5b, 0x5c, 0x3a, 0x2d, 0x98, - 0x13, 0xfb, 0xf4, 0x60, 0x0d, 0x01, 0xe4, 0x0c, 0x8c, 0x77, 0xd9, 0xf0, 0x8b, 0x39, 0x5e, 0x30, - 0xc7, 0xba, 0xbd, 0x6d, 0x36, 0x95, 0x17, 0x60, 0x1c, 0xf5, 0xac, 0x62, 0x45, 0x4e, 0x99, 0xf2, - 0xa7, 0xf1, 0x47, 0x39, 0x4c, 0x2f, 0xa6, 0x34, 0x88, 0xbc, 0x08, 0x53, 0x0d, 0x8f, 0xe2, 0x59, - 0x66, 0x33, 0x09, 0x4d, 0xd4, 0x53, 0x88, 0x80, 0xd5, 0x26, 0xb9, 0x00, 0x33, 0x51, 0x26, 0x68, - 0xab, 0xb1, 0x2d, 0xf2, 0xa1, 0x14, 0xcc, 0xa9, 0xae, 0xcc, 0x07, 0xbd, 0xb2, 0x8d, 0x91, 0x1b, - 0x8b, 0x6a, 0xe0, 0x71, 0xd6, 0x23, 0x62, 0xfe, 0xcd, 0x28, 0x70, 0x34, 0xe8, 0x3c, 0x0d, 0x63, - 0xb6, 0xbd, 0xdb, 0x73, 0x78, 0x84, 0xb5, 0x82, 0x29, 0x7e, 0x91, 0xd7, 0x60, 0x36, 0x8a, 0xe4, - 0x2f, 0x9b, 0x31, 0x8a, 0xcd, 0x28, 0x86, 0x05, 0x2b, 0x1c, 0x4e, 0x2e, 0x03, 0x51, 0xeb, 0x73, - 0xb7, 0x3f, 0xa2, 0x0d, 0x3e, 0x27, 0x0b, 0xe6, 0xac, 0x52, 0x72, 0x0f, 0x0b, 0xc8, 0x0b, 0x50, - 0xf0, 0xa8, 0x8f, 0xd2, 0x21, 0x76, 0x1b, 0x66, 0xdf, 0x34, 0x27, 0x25, 0x8c, 0xf5, 0xdd, 0x45, - 0x28, 0x2a, 0xdd, 0x81, 0xb1, 0xdd, 0x79, 0x2a, 0x10, 0x73, 0x3a, 0x82, 0x9b, 0xdd, 0x6a, 0x93, - 0x7c, 0x09, 0x16, 0x15, 0x4c, 0x9e, 0x08, 0xd4, 0xa2, 0x2d, 0x67, 0xd7, 0xd9, 0x6e, 0x51, 0x31, - 0xdf, 0x92, 0xb3, 0x3a, 0xbc, 0x42, 0x9a, 0x0b, 0x11, 0x35, 0x4f, 0x11, 0xba, 0x2a, 0x68, 0xc9, - 0x3a, 0xcc, 0xc7, 0x38, 0xd3, 0xa6, 0xd5, 0xeb, 0xf6, 0x0d, 0x69, 0x18, 0xf1, 0x24, 0x3a, 0x4f, - 0xda, 0xdc, 0xea, 0x1a, 0xdf, 0x80, 0x82, 0x3a, 0x27, 0x59, 0x27, 0xa8, 0x72, 0x89, 0x98, 0x7d, - 0x93, 0x21, 0xac, 0xca, 0xee, 0x85, 0xd3, 0x11, 0x0a, 0x0e, 0x22, 0xdf, 0x5e, 0xa6, 0x42, 0x28, - 0x0e, 0xe1, 0x0b, 0x50, 0x68, 0x3a, 0x7e, 0xb7, 0x65, 0x1f, 0xa0, 0x59, 0x9e, 0x18, 0xe9, 0x49, - 0x01, 0x43, 0xc5, 0xcf, 0x32, 0xcc, 0x26, 0xf6, 0x41, 0x45, 0xd2, 0xe0, 0xfb, 0xfa, 0x60, 0x49, - 0xc3, 0xe8, 0x40, 0x41, 0x3d, 0xd7, 0x8e, 0x49, 0xdc, 0x73, 0x1a, 0x03, 0xfe, 0xf0, 0x4d, 0x7f, - 0xec, 0xe8, 0xb0, 0x94, 0x75, 0x9a, 0x18, 0xe6, 0xe7, 0x22, 0xe4, 0xa5, 0xc4, 0x26, 0x04, 0x25, - 0x7c, 0x4c, 0x90, 0xef, 0x99, 0x66, 0x58, 0x6a, 0xbc, 0x02, 0xe3, 0xe2, 0xe8, 0x1a, 0xfc, 0x84, - 0x60, 0x7c, 0x33, 0x0b, 0x33, 0x26, 0x65, 0x1b, 0x2b, 0xe5, 0xd9, 0xba, 0x9e, 0xda, 0x2b, 0x7a, - 0x7a, 0x04, 0x5f, 0xad, 0x6d, 0x03, 0xf2, 0x64, 0xfd, 0x52, 0x06, 0xe6, 0x52, 0x70, 0x3f, 0x56, - 0x9e, 0xe8, 0x1b, 0x30, 0x51, 0x71, 0xec, 0x56, 0xb9, 0xd9, 0x0c, 0xa3, 0xff, 0xa0, 0x9c, 0x8f, - 0xc9, 0xe4, 0x6c, 0x06, 0x55, 0x85, 0x98, 0x10, 0x95, 0xbc, 0x2a, 0x26, 0x45, 0x2e, 0xec, 0x56, - 0x9c, 0x14, 0xdf, 0x3d, 0x2c, 0x01, 0xff, 0xa6, 0xcd, 0x70, 0x8a, 0x60, 0x54, 0x6d, 0x0e, 0x8c, - 0x9c, 0xb1, 0x9e, 0xda, 0xa1, 0x4b, 0x8f, 0xaa, 0x1d, 0x6f, 0xde, 0x50, 0xa9, 0xb2, 0x7e, 0x32, - 0x0b, 0xa7, 0xd3, 0x09, 0x3f, 0x6e, 0xca, 0x6f, 0x4c, 0x52, 0xa6, 0x64, 0x02, 0xc0, 0x94, 0xdf, - 0x3c, 0xa3, 0x19, 0xe2, 0x47, 0x08, 0x64, 0x87, 0xa7, 0xd6, 0x5f, 0xa3, 0xb6, 0x17, 0x6c, 0x53, - 0x3b, 0x18, 0x42, 0x92, 0x97, 0x26, 0x18, 0x0b, 0x28, 0x4c, 0xec, 0x49, 0xca, 0xb4, 0xcc, 0xfa, - 0x21, 0xdb, 0x70, 0xa2, 0x8c, 0x0c, 0x31, 0x51, 0xbe, 0x0e, 0x33, 0x75, 0xda, 0xb6, 0xbb, 0x7b, - 0xae, 0x27, 0x83, 0x2c, 0x5c, 0x81, 0xa9, 0x10, 0x94, 0x3a, 0x5b, 0xf4, 0x62, 0x0d, 0x5f, 0xe9, - 0x88, 0x68, 0x2b, 0xd1, 0x8b, 0x8d, 0xbf, 0x9e, 0x85, 0x33, 0xe5, 0x86, 0xb0, 0x27, 0x15, 0x05, - 0xd2, 0xec, 0xfd, 0x53, 0xae, 0x9b, 0x5c, 0x85, 0x89, 0xbb, 0xf6, 0xe3, 0x75, 0x6a, 0xfb, 0xd4, - 0x17, 0x69, 0x26, 0xb8, 0xd8, 0x6b, 0x3f, 0x8e, 0x1e, 0x7f, 0xcc, 0x08, 0x47, 0x55, 0x23, 0x8c, - 0x7c, 0x42, 0x35, 0x82, 0x01, 0x63, 0x6b, 0x6e, 0xab, 0x29, 0xce, 0x7a, 0xf1, 0xe2, 0xbc, 0x87, - 0x10, 0x53, 0x94, 0x18, 0x7f, 0x90, 0x81, 0xe9, 0xf0, 0x8b, 0xf1, 0x13, 0x3e, 0xf5, 0x2e, 0xb9, - 0x00, 0xe3, 0x58, 0x51, 0xb5, 0xa2, 0x1e, 0x1a, 0x2d, 0x8a, 0x69, 0x33, 0x9b, 0xa6, 0x2c, 0x54, - 0x7b, 0x62, 0xf4, 0x93, 0xf5, 0x84, 0xf1, 0xf7, 0xf1, 0x31, 0x5b, 0x6d, 0x25, 0x3b, 0x89, 0x94, - 0x0f, 0xc9, 0x0c, 0xf9, 0x21, 0xd9, 0x27, 0x36, 0x24, 0xb9, 0xbe, 0x43, 0xf2, 0xa3, 0x59, 0x98, - 0x0c, 0x3f, 0xf6, 0x7b, 0x2c, 0x1d, 0x45, 0xd8, 0xae, 0xa1, 0x02, 0x23, 0xd5, 0x95, 0xbd, 0x42, - 0xc4, 0x1f, 0xfa, 0x22, 0x8c, 0x89, 0xc5, 0x94, 0x89, 0x99, 0x7f, 0xc7, 0x46, 0x77, 0x79, 0x5a, - 0xb0, 0x1e, 0xc3, 0x01, 0xf5, 0x4d, 0x41, 0x87, 0x91, 0xa7, 0x1e, 0xd0, 0x6d, 0x61, 0xdb, 0xf0, - 0xd4, 0x9e, 0x51, 0xe9, 0x91, 0xa7, 0xa2, 0x86, 0x0d, 0x75, 0x3a, 0xfd, 0x77, 0x79, 0x28, 0xc6, - 0x49, 0x8e, 0x4f, 0xf8, 0x51, 0xeb, 0x6d, 0xf3, 0xab, 0x0a, 0x4f, 0xf8, 0xd1, 0xed, 0x6d, 0x9b, - 0x0c, 0x86, 0xf6, 0x52, 0x9e, 0xf3, 0x10, 0x5b, 0x5d, 0x10, 0xf6, 0x52, 0x9e, 0xf3, 0x50, 0xb3, - 0x97, 0xf2, 0x9c, 0x87, 0xa8, 0x48, 0x58, 0xaf, 0x63, 0x54, 0x06, 0xbc, 0xa7, 0x08, 0x45, 0x42, - 0xcb, 0x8f, 0x67, 0x31, 0x94, 0x68, 0xec, 0xa8, 0x5c, 0xa6, 0xb6, 0x27, 0x92, 0x53, 0x88, 0xed, - 0x0c, 0x8f, 0xca, 0x6d, 0x04, 0x5b, 0x01, 0x83, 0x9b, 0x2a, 0x12, 0x69, 0x01, 0x51, 0x7e, 0xca, - 0x05, 0x7c, 0xfc, 0xdd, 0x5a, 0x9a, 0x6e, 0xce, 0xab, 0xac, 0x2d, 0x75, 0x35, 0xa7, 0xf0, 0x7d, - 0x92, 0xda, 0xdf, 0x9a, 0x08, 0x5e, 0x8b, 0x0a, 0xa4, 0xfc, 0xb1, 0xcc, 0x64, 0x34, 0x19, 0xe0, - 0xc1, 0x6d, 0x43, 0x35, 0x52, 0xc4, 0x84, 0xbc, 0x0b, 0x93, 0x6a, 0xac, 0x0d, 0x1e, 0x11, 0xe2, - 0x39, 0x1e, 0xb9, 0xb3, 0x4f, 0xe6, 0x6b, 0x95, 0x80, 0x6c, 0xc3, 0x99, 0x15, 0xb7, 0xe3, 0xf7, - 0xda, 0x32, 0x46, 0x68, 0x14, 0x6f, 0x1d, 0x70, 0x28, 0xd0, 0x71, 0xbf, 0x21, 0x50, 0x44, 0x68, - 0x07, 0xe9, 0x5b, 0xa3, 0x5f, 0x40, 0xfa, 0x31, 0x22, 0x9b, 0x30, 0x89, 0x1a, 0x54, 0x61, 0x27, - 0x39, 0xa9, 0x6f, 0x1b, 0x51, 0x49, 0x85, 0x2d, 0x0c, 0x1e, 0x6a, 0xce, 0x6e, 0xb7, 0xa4, 0x6b, - 0x87, 0xaa, 0x09, 0x56, 0x90, 0xc9, 0x87, 0x30, 0xcd, 0xaf, 0x68, 0x0f, 0xe8, 0x36, 0x9f, 0x3b, - 0x05, 0x4d, 0x13, 0xa1, 0x17, 0xf2, 0xc7, 0x7c, 0xa1, 0xb7, 0x7e, 0x44, 0xb7, 0xf9, 0xd8, 0x6b, - 0x8e, 0x55, 0x1a, 0x3e, 0xd9, 0x82, 0xb9, 0x35, 0xdb, 0xe7, 0x40, 0x25, 0x68, 0xc2, 0x14, 0x6a, - 0x68, 0xd1, 0xe0, 0x7d, 0xcf, 0xf6, 0xa5, 0x22, 0x3c, 0x35, 0x48, 0x42, 0x1a, 0x3d, 0xf9, 0x66, - 0x06, 0x16, 0x34, 0x3d, 0xb9, 0xb0, 0x33, 0xc3, 0xc0, 0xb3, 0xd3, 0xf8, 0xe4, 0x55, 0x92, 0x42, - 0x69, 0x1f, 0x34, 0x3e, 0x24, 0x31, 0x55, 0xbc, 0x17, 0x95, 0xab, 0x96, 0xe4, 0xfd, 0x78, 0x88, - 0x85, 0x8a, 0x6b, 0x7a, 0x46, 0x5f, 0xa8, 0xb1, 0x75, 0x2d, 0xd1, 0x8c, 0x1b, 0xf1, 0xfe, 0x16, - 0x8a, 0xae, 0x4c, 0xa8, 0xe8, 0x9a, 0x87, 0x51, 0xec, 0x55, 0x19, 0x7a, 0x0b, 0x7f, 0x18, 0x9f, - 0x51, 0xf7, 0x21, 0x21, 0x16, 0x0e, 0xdc, 0x87, 0x8c, 0xff, 0x61, 0x0c, 0x66, 0x62, 0xd3, 0x42, - 0xdc, 0x53, 0x33, 0x89, 0x7b, 0x6a, 0x1d, 0x80, 0xab, 0x7a, 0x87, 0xd4, 0xc9, 0x4a, 0xef, 0xcd, - 0x49, 0xe1, 0x7b, 0x1d, 0xae, 0x29, 0x85, 0x0d, 0x63, 0xca, 0x57, 0xec, 0x90, 0x3a, 0xf2, 0x90, - 0x29, 0x5f, 0xf4, 0x0a, 0xd3, 0x88, 0x0d, 0x29, 0xc1, 0x28, 0x46, 0xea, 0x55, 0x9d, 0x67, 0x1d, - 0x06, 0x30, 0x39, 0x9c, 0xbc, 0x08, 0x63, 0x4c, 0x88, 0xaa, 0x56, 0xc4, 0x26, 0x88, 0x67, 0x0b, - 0x93, 0xb2, 0x98, 0xc4, 0x22, 0x8a, 0xc8, 0x0d, 0x28, 0xf0, 0xbf, 0x44, 0x6c, 0x9e, 0x31, 0xdd, - 0x62, 0xd2, 0x72, 0x9a, 0x32, 0x3c, 0x8f, 0x86, 0xc7, 0x6e, 0x17, 0xf5, 0x1e, 0xaa, 0x75, 0xaa, - 0x15, 0x11, 0xb0, 0x1e, 0x6f, 0x17, 0x3e, 0x07, 0xb2, 0x2a, 0x22, 0x04, 0x26, 0xcb, 0x08, 0x17, - 0x96, 0x3c, 0xde, 0x29, 0x51, 0x96, 0xe1, 0xae, 0x2b, 0xa6, 0x28, 0x21, 0x97, 0xf8, 0x4b, 0x0c, - 0x8a, 0x85, 0x3c, 0x6b, 0x2b, 0xbe, 0x5b, 0xa0, 0x62, 0x02, 0x65, 0xc3, 0xb0, 0x98, 0x55, 0xce, - 0xfe, 0x5e, 0x6d, 0xdb, 0x4e, 0x4b, 0x6c, 0x2b, 0x58, 0x39, 0xe2, 0x52, 0x06, 0x35, 0x23, 0x04, - 0xf2, 0x36, 0x4c, 0xf3, 0xec, 0x8a, 0xed, 0xb6, 0xdb, 0x41, 0xf6, 0x93, 0x51, 0xf4, 0x3d, 0x91, - 0xf1, 0x91, 0x15, 0xf1, 0x5a, 0x62, 0xb8, 0xec, 0x3c, 0xc1, 0x57, 0xde, 0x1e, 0x7f, 0x23, 0x2a, - 0x44, 0xe7, 0x09, 0x92, 0xfa, 0x1c, 0x6e, 0xaa, 0x48, 0xe4, 0x4d, 0x98, 0x62, 0x3f, 0x6f, 0x39, - 0x0f, 0x29, 0xaf, 0x70, 0x2a, 0x32, 0x6f, 0x40, 0xaa, 0x5d, 0x56, 0xc2, 0xeb, 0xd3, 0x31, 0xc9, - 0xfb, 0x70, 0x0a, 0x39, 0x35, 0xdc, 0x2e, 0x6d, 0x96, 0x77, 0x76, 0x9c, 0x96, 0xc3, 0xad, 0xd1, - 0x78, 0x14, 0x1a, 0xd4, 0xc1, 0xf3, 0x8a, 0x11, 0xc3, 0xb2, 0x23, 0x14, 0x33, 0x9d, 0x92, 0x3c, - 0x80, 0xe2, 0x4a, 0xcf, 0x0f, 0xdc, 0x76, 0x39, 0x08, 0x3c, 0x67, 0xbb, 0x17, 0x50, 0x7f, 0x61, - 0x46, 0x8b, 0xd5, 0xc2, 0x16, 0x47, 0x58, 0xc8, 0xf5, 0x41, 0x0d, 0xa4, 0xb0, 0xec, 0x90, 0xc4, - 0x4c, 0x30, 0x31, 0xfe, 0x4d, 0x06, 0xa6, 0x34, 0x52, 0xf2, 0x06, 0x14, 0x6e, 0x7a, 0x0e, 0xed, - 0x34, 0x5b, 0x07, 0xca, 0x45, 0x15, 0x6f, 0x31, 0x3b, 0x02, 0xce, 0x5b, 0xad, 0xa1, 0x85, 0x7a, - 0x9e, 0x6c, 0xaa, 0xa9, 0xe8, 0x55, 0xee, 0xc3, 0x2d, 0x26, 0x68, 0x2e, 0x0a, 0x1e, 0x85, 0x13, - 0x54, 0xcc, 0x4e, 0x05, 0x85, 0xbc, 0x03, 0x63, 0xfc, 0x3d, 0x58, 0xd8, 0x2d, 0x9e, 0x4d, 0x6b, - 0x26, 0x8f, 0x17, 0x80, 0x13, 0x11, 0x8d, 0x7e, 0x7c, 0x53, 0x10, 0x19, 0x3f, 0x97, 0x01, 0x92, - 0x44, 0x3d, 0x46, 0xef, 0x75, 0xac, 0x31, 0xd1, 0x17, 0xc3, 0xd5, 0x98, 0xd3, 0x74, 0xe6, 0xac, - 0x26, 0x5e, 0xc0, 0x3b, 0x5e, 0xac, 0x3a, 0x55, 0x11, 0xc7, 0x8b, 0x8d, 0x1f, 0xc9, 0x02, 0x44, - 0xd8, 0xe4, 0xf3, 0x3c, 0x37, 0xdd, 0xfb, 0x3d, 0xbb, 0xe5, 0xec, 0x38, 0x7a, 0x84, 0x60, 0x64, - 0xf2, 0x75, 0x59, 0x62, 0xea, 0x88, 0xe4, 0x3d, 0x98, 0xa9, 0xd7, 0x74, 0x5a, 0xc5, 0x96, 0xde, - 0xef, 0x5a, 0x31, 0xf2, 0x38, 0x36, 0xda, 0x27, 0xab, 0xa3, 0xc1, 0xed, 0x93, 0xf9, 0x40, 0x88, - 0x12, 0xb6, 0xb1, 0xd4, 0x6b, 0xc2, 0x5d, 0xa0, 0x19, 0xbe, 0x6a, 0xe2, 0xd7, 0xf9, 0x5d, 0xab, - 0x2b, 0xfc, 0x08, 0xd8, 0x3e, 0xa1, 0xe1, 0x45, 0x1d, 0x39, 0xda, 0x27, 0x26, 0xc0, 0xcf, 0xa3, - 0xda, 0xaf, 0xed, 0x06, 0x54, 0x68, 0x3b, 0x9e, 0xda, 0x7b, 0x4f, 0x64, 0x4c, 0x30, 0xaa, 0xb9, - 0x3a, 0x6b, 0xad, 0x13, 0x06, 0x33, 0xd7, 0xa3, 0x4b, 0x0a, 0x37, 0x2b, 0x48, 0xb1, 0xb1, 0xf9, - 0xbb, 0x19, 0x38, 0x95, 0x4a, 0x4b, 0xae, 0x00, 0x44, 0x3a, 0x25, 0xd1, 0x4b, 0xb8, 0x63, 0x46, - 0x21, 0x93, 0x4c, 0x05, 0x83, 0x7c, 0x25, 0xae, 0x0d, 0x3a, 0xfe, 0x20, 0x5c, 0x94, 0x91, 0x0a, - 0x75, 0x6d, 0x50, 0x8a, 0x0e, 0xc8, 0xf8, 0xa5, 0x1c, 0xcc, 0x2a, 0x11, 0x99, 0xf8, 0xb7, 0x1e, - 0x63, 0x2f, 0xbe, 0x0f, 0x05, 0xd6, 0x1a, 0xa7, 0x21, 0x7c, 0x75, 0xb8, 0xe1, 0xcb, 0xab, 0x09, - 0x67, 0x55, 0xc1, 0xed, 0x8a, 0x8a, 0xcc, 0xe3, 0x87, 0xe2, 0xd6, 0x89, 0x0f, 0x12, 0x8d, 0xa4, - 0x9f, 0x8e, 0xc6, 0x9c, 0xf8, 0x30, 0x55, 0x39, 0xe8, 0xd8, 0xed, 0xb0, 0x36, 0x6e, 0x00, 0xf3, - 0x5a, 0xdf, 0xda, 0x34, 0x6c, 0x5e, 0x5d, 0xe4, 0xd6, 0xc5, 0xcb, 0x52, 0x22, 0x0a, 0x68, 0x54, - 0x8b, 0xef, 0xc1, 0x6c, 0xe2, 0xa3, 0x4f, 0x14, 0xca, 0xf4, 0x01, 0x90, 0xe4, 0x77, 0xa4, 0x70, - 0x78, 0x4d, 0x0f, 0x94, 0x7b, 0x2a, 0x7c, 0xbc, 0x6e, 0xb7, 0xed, 0x4e, 0x93, 0x9b, 0xd3, 0x2c, - 0xa9, 0x81, 0x4e, 0x7f, 0x3e, 0xab, 0x3a, 0x0c, 0x3f, 0xed, 0xab, 0xee, 0x8b, 0xda, 0x6d, 0xf8, - 0xf9, 0x7e, 0x63, 0x3a, 0x94, 0xd6, 0xe1, 0x3b, 0x39, 0x38, 0xd3, 0x87, 0x92, 0x1c, 0xc4, 0x27, - 0x11, 0xd7, 0x42, 0x5c, 0x1b, 0x5c, 0xe1, 0x93, 0x98, 0x4a, 0xe4, 0xf3, 0x3c, 0x64, 0x88, 0x48, - 0x64, 0xcd, 0xef, 0xdf, 0xa8, 0xc6, 0xdf, 0x0f, 0xa1, 0xf1, 0x58, 0x21, 0x1c, 0x4a, 0xde, 0x83, - 0x51, 0xf4, 0x16, 0x8f, 0xc5, 0x84, 0x64, 0x18, 0x08, 0x57, 0xa2, 0x9a, 0xb2, 0x9f, 0x5a, 0x54, - 0x53, 0x06, 0x20, 0x9f, 0x83, 0x5c, 0xf9, 0x41, 0x5d, 0x8c, 0xcb, 0xb4, 0x4a, 0xfe, 0xa0, 0x1e, - 0x25, 0xa7, 0xb1, 0xb5, 0x2c, 0x32, 0x8c, 0x82, 0x11, 0xde, 0x5a, 0xa9, 0x89, 0x51, 0x51, 0x09, - 0x6f, 0xad, 0xd4, 0x22, 0xc2, 0xdd, 0x86, 0x16, 0x61, 0xeb, 0xd6, 0x4a, 0xed, 0xd3, 0x9b, 0xf6, - 0xff, 0x51, 0x96, 0xc7, 0x39, 0xe1, 0x0d, 0x7b, 0x0f, 0x0a, 0x5a, 0x20, 0xf3, 0x4c, 0x24, 0x8f, - 0x85, 0x91, 0xea, 0x63, 0x16, 0x43, 0x1a, 0x81, 0x4c, 0xf3, 0xc4, 0x7e, 0xab, 0x01, 0xdc, 0xc3, - 0x34, 0x4f, 0xc8, 0x21, 0xee, 0x4a, 0xa4, 0x93, 0x90, 0xeb, 0x90, 0xdf, 0xa4, 0x1d, 0xbb, 0x13, - 0x84, 0x0a, 0x51, 0x34, 0x2e, 0x0e, 0x10, 0xa6, 0x4b, 0x0d, 0x21, 0x22, 0x1a, 0xc2, 0xf6, 0xb6, - 0xfd, 0x86, 0xe7, 0x60, 0x3c, 0xa4, 0xf0, 0x2c, 0xe6, 0x86, 0xb0, 0x4a, 0x89, 0xce, 0x20, 0x46, - 0x64, 0xfc, 0x7c, 0x06, 0xc6, 0xc5, 0x40, 0xf2, 0xf4, 0x7c, 0xbb, 0xd1, 0x59, 0x22, 0x9c, 0x07, - 0x76, 0x9d, 0xb8, 0xf3, 0xc0, 0x2e, 0x0f, 0x3a, 0x34, 0x21, 0xbc, 0xf1, 0xc2, 0xa7, 0x41, 0x9c, - 0x8d, 0xd2, 0x57, 0x54, 0xcf, 0xbe, 0x16, 0xa2, 0x0e, 0xeb, 0xc5, 0x65, 0xfc, 0x4d, 0xf1, 0x65, - 0xb7, 0x56, 0x6a, 0x64, 0x09, 0xf2, 0xeb, 0x2e, 0x8f, 0x9f, 0xa5, 0xe6, 0x9a, 0x6e, 0x09, 0x98, - 0xda, 0x41, 0x12, 0x8f, 0x7d, 0x5f, 0xcd, 0x73, 0xc5, 0x5d, 0x46, 0xf9, 0xbe, 0x2e, 0x07, 0xc6, - 0xbe, 0x2f, 0x44, 0x1d, 0xfa, 0xfb, 0x68, 0xca, 0x26, 0x71, 0xff, 0x3a, 0xe6, 0xbf, 0xb9, 0xad, - 0x7a, 0xc7, 0x89, 0x22, 0xb9, 0x53, 0x2c, 0xf6, 0xdb, 0x29, 0xee, 0x5f, 0x37, 0x53, 0xa8, 0xf0, - 0x5d, 0x2d, 0x02, 0xd7, 0xa9, 0xf7, 0xf0, 0x29, 0xde, 0xa5, 0xd3, 0xdf, 0xd5, 0xe2, 0xcd, 0x1b, - 0x6a, 0x93, 0xfe, 0x9d, 0x2c, 0x9c, 0x4e, 0x27, 0x54, 0xdb, 0x92, 0x19, 0xd0, 0x96, 0x8b, 0x90, - 0x5f, 0x73, 0xfd, 0x40, 0x31, 0x12, 0x44, 0xf5, 0xff, 0x9e, 0x80, 0x99, 0x61, 0x29, 0xbb, 0x73, - 0xb3, 0xbf, 0xc3, 0xe5, 0x89, 0xfc, 0x30, 0xba, 0x07, 0xbb, 0x73, 0xf3, 0x22, 0x72, 0x0b, 0xf2, - 0xa6, 0x70, 0xb4, 0x8a, 0x75, 0x8d, 0x04, 0x87, 0xd2, 0x14, 0xf1, 0x04, 0x44, 0x8b, 0x27, 0x2f, - 0x60, 0xa4, 0x0c, 0xe3, 0x62, 0xf4, 0x63, 0x4f, 0xc7, 0x29, 0x53, 0x46, 0x4f, 0xf1, 0x20, 0xe9, - 0xd8, 0x8e, 0x82, 0x8f, 0x80, 0xd5, 0x8a, 0xf4, 0x99, 0xc2, 0x1d, 0x85, 0x3f, 0x12, 0xea, 0xf6, - 0x98, 0x21, 0xa2, 0xf1, 0xcd, 0x2c, 0x80, 0xd4, 0xda, 0x3c, 0xb5, 0x33, 0xec, 0x73, 0xda, 0x0c, - 0x53, 0xec, 0x8d, 0x86, 0xcf, 0x81, 0x7d, 0x0f, 0xcd, 0x79, 0x86, 0xcf, 0x80, 0x5d, 0x82, 0xd1, - 0xcd, 0x48, 0xa1, 0x25, 0x5c, 0x52, 0x50, 0x1d, 0xcd, 0xe1, 0xc6, 0x36, 0xcc, 0xdf, 0xa2, 0x41, - 0xa4, 0xde, 0x92, 0x4f, 0x8f, 0x83, 0xd9, 0xbe, 0x0e, 0x13, 0x02, 0x3f, 0xdc, 0xbf, 0xb8, 0x2e, - 0x46, 0x04, 0xcc, 0x41, 0x5d, 0x8c, 0x44, 0x60, 0xbb, 0x51, 0x85, 0xb6, 0x68, 0x40, 0x3f, 0xdd, - 0x6a, 0xea, 0x40, 0x78, 0x53, 0xb0, 0x65, 0xc3, 0xd5, 0x70, 0x6c, 0xff, 0xdc, 0x87, 0x53, 0xe1, - 0xb7, 0x3f, 0x49, 0xbe, 0x57, 0xd9, 0x95, 0x52, 0x64, 0x47, 0x88, 0x38, 0x0e, 0xb0, 0x3d, 0xf9, - 0xbd, 0x0c, 0x2c, 0x4a, 0x8a, 0x07, 0x4e, 0x68, 0x39, 0x39, 0x14, 0x31, 0x79, 0x1b, 0x26, 0x15, - 0x1a, 0x11, 0xde, 0x1f, 0xf5, 0xd4, 0x8f, 0x9c, 0x60, 0xcf, 0xf2, 0x39, 0x5c, 0xd5, 0x53, 0x2b, - 0xe8, 0x64, 0x1b, 0x16, 0xeb, 0xe5, 0xbb, 0xeb, 0xf7, 0xed, 0x96, 0xd3, 0xc4, 0x6d, 0x60, 0xc3, - 0xbd, 0xe9, 0xb6, 0x5a, 0xee, 0xa3, 0x2d, 0x73, 0x5d, 0xe6, 0xe8, 0xc1, 0xa8, 0x20, 0xa8, 0xf4, - 0x7e, 0x18, 0xa2, 0x59, 0x1d, 0xd7, 0xda, 0x41, 0x44, 0xab, 0xe7, 0xb5, 0x7c, 0x73, 0x00, 0x17, - 0xe3, 0x9f, 0x65, 0xe0, 0xd9, 0xd0, 0x39, 0x29, 0xa5, 0x7d, 0xb1, 0x16, 0x64, 0x9e, 0x64, 0x0b, - 0xb2, 0x4f, 0xa4, 0x05, 0x1b, 0xd1, 0xf8, 0x54, 0x3b, 0xa1, 0x63, 0xb8, 0xfc, 0x7e, 0xa2, 0x8e, - 0x8f, 0x18, 0x95, 0xe7, 0x12, 0xae, 0xe6, 0x8a, 0x47, 0xb9, 0xf1, 0x96, 0xd2, 0x21, 0x29, 0x0c, - 0x35, 0xe2, 0x4c, 0x9c, 0xf8, 0x9b, 0x59, 0x98, 0xb9, 0x57, 0xad, 0xac, 0x84, 0x76, 0x54, 0xdf, - 0x63, 0xb9, 0xc6, 0xb5, 0xb6, 0xf5, 0xdf, 0x39, 0x8d, 0x2d, 0x98, 0x8b, 0x75, 0x03, 0x0a, 0x41, - 0xef, 0x72, 0xd7, 0x99, 0x10, 0x2c, 0x05, 0xa0, 0xd3, 0x69, 0xec, 0xef, 0x5f, 0x37, 0x63, 0xd8, - 0xc6, 0xff, 0x09, 0x31, 0xbe, 0x62, 0x33, 0x7e, 0x1d, 0x26, 0xaa, 0xbe, 0xdf, 0xa3, 0xde, 0x96, - 0xb9, 0xae, 0x2a, 0x3d, 0x1c, 0x04, 0xb2, 0x39, 0x64, 0x46, 0x08, 0xe4, 0x12, 0xe4, 0x45, 0x8c, - 0x78, 0xb9, 0xbb, 0xa1, 0xfe, 0x39, 0x0c, 0x31, 0x6f, 0x86, 0xc5, 0xe4, 0x0d, 0x28, 0xf0, 0xbf, - 0xf9, 0x8c, 0x16, 0x1d, 0x8e, 0x6a, 0x4e, 0x81, 0xce, 0x57, 0x80, 0xa9, 0xa1, 0x91, 0x57, 0x21, - 0x57, 0x5e, 0x31, 0x85, 0x62, 0x4b, 0x48, 0xc0, 0x9e, 0xc5, 0xb5, 0x8f, 0xda, 0x75, 0x68, 0xc5, - 0x64, 0x72, 0xac, 0x8c, 0xb5, 0x21, 0x74, 0xf2, 0x38, 0x03, 0xa4, 0xde, 0x2c, 0x76, 0x2c, 0x23, - 0x8c, 0x5c, 0x85, 0xf1, 0x0a, 0x37, 0xfe, 0x13, 0x1a, 0x79, 0x9e, 0x93, 0x92, 0x83, 0xb4, 0xd8, - 0x12, 0x1c, 0x44, 0x2e, 0xc9, 0xac, 0x76, 0xf9, 0xc8, 0x03, 0xa7, 0x4f, 0xea, 0xba, 0xd7, 0x61, - 0x4c, 0x44, 0x52, 0x9f, 0x50, 0x52, 0xd7, 0xc4, 0x23, 0xa8, 0x0b, 0x9c, 0xa4, 0x2b, 0x2e, 0x3c, - 0x49, 0x57, 0xdc, 0x6d, 0x38, 0x73, 0x0b, 0xf5, 0x50, 0x7a, 0x3c, 0xb0, 0x2d, 0xb3, 0x2a, 0x34, - 0xfb, 0xf8, 0xa0, 0xc5, 0x55, 0x55, 0xf1, 0x90, 0x62, 0x56, 0xcf, 0x53, 0x53, 0x2c, 0xf7, 0x63, - 0x44, 0xbe, 0x04, 0xf3, 0x69, 0x45, 0x42, 0xff, 0x8f, 0x91, 0xaf, 0xd2, 0x2b, 0x50, 0x23, 0x5f, - 0xa5, 0x71, 0x20, 0xeb, 0x50, 0xe4, 0xf0, 0x72, 0xb3, 0xed, 0x74, 0xf8, 0x1b, 0x06, 0x7f, 0x1f, - 0x40, 0x97, 0x18, 0xc1, 0xd5, 0x66, 0x85, 0xfc, 0x2d, 0x43, 0x73, 0xa2, 0x8a, 0x51, 0x92, 0xbf, - 0x92, 0x61, 0xf7, 0x52, 0x1e, 0x77, 0x1c, 0xb7, 0xcf, 0x69, 0xf1, 0x1a, 0x1a, 0x7a, 0x35, 0xd5, - 0x03, 0xcf, 0xe9, 0xec, 0x0a, 0x07, 0xa9, 0x4d, 0xe1, 0x20, 0xf5, 0xf6, 0xc7, 0x72, 0x90, 0xe2, - 0xac, 0xfc, 0xa3, 0xc3, 0x52, 0xc1, 0x13, 0x75, 0xe2, 0x2a, 0xd2, 0xbe, 0x80, 0x75, 0x1d, 0x7a, - 0x09, 0x6f, 0x75, 0x78, 0xd4, 0x63, 0xda, 0xe4, 0x8d, 0x9c, 0xc1, 0x8d, 0x1d, 0xbb, 0xce, 0xe6, - 0x9b, 0x78, 0x88, 0x90, 0x68, 0x68, 0x2a, 0x07, 0x76, 0x85, 0x96, 0x4e, 0x38, 0xdc, 0xaf, 0xb8, - 0x18, 0x5d, 0xa1, 0xa5, 0xc7, 0x8e, 0x85, 0xd3, 0x48, 0x9d, 0x3c, 0x1a, 0x09, 0xb9, 0x0a, 0x63, - 0x77, 0xed, 0xc7, 0xe5, 0x5d, 0x2a, 0x72, 0xb0, 0x4e, 0xc9, 0xed, 0x0f, 0x81, 0xcb, 0xf9, 0xdf, - 0xe5, 0x5e, 0x1b, 0xcf, 0x98, 0x02, 0x8d, 0xfc, 0x60, 0x06, 0x4e, 0xf3, 0x65, 0x2c, 0x5b, 0x59, - 0xa7, 0x41, 0xc0, 0xfa, 0x41, 0x84, 0x4f, 0x3c, 0x1f, 0x99, 0x9e, 0xa7, 0xe3, 0x61, 0x0c, 0x01, - 0x43, 0xec, 0x0c, 0x61, 0xc7, 0xf9, 0xa2, 0x54, 0x8b, 0x43, 0x9d, 0x4a, 0x4f, 0x36, 0x61, 0xf2, - 0xee, 0xcd, 0x72, 0x58, 0x2d, 0x0f, 0x4e, 0x5f, 0x4a, 0xdb, 0x1d, 0x15, 0xb4, 0x34, 0x9f, 0x09, - 0x95, 0x0d, 0x8a, 0xfe, 0x77, 0x56, 0x56, 0xd1, 0x6d, 0x7f, 0x3e, 0x52, 0x26, 0x74, 0xf7, 0x1b, - 0x34, 0x1e, 0x20, 0x3b, 0x44, 0x14, 0xce, 0x11, 0x9f, 0x93, 0x9d, 0x48, 0x2e, 0xab, 0x9e, 0xb8, - 0x39, 0xe4, 0x30, 0xde, 0xb6, 0x1f, 0x5b, 0xf6, 0x2e, 0xd5, 0x8c, 0x04, 0x84, 0xf2, 0xfe, 0x67, - 0x33, 0x70, 0xb6, 0x6f, 0x3f, 0x91, 0x1b, 0x70, 0xc6, 0xe6, 0xfe, 0xe5, 0xd6, 0x5e, 0x10, 0x74, - 0x7d, 0x4b, 0xde, 0xb0, 0x84, 0xef, 0xae, 0x79, 0x4a, 0x14, 0xaf, 0xb1, 0x52, 0x79, 0xe9, 0xf2, - 0xc9, 0x7b, 0xf0, 0x9c, 0xd3, 0xf1, 0x69, 0xa3, 0xe7, 0x51, 0x4b, 0x32, 0x68, 0x38, 0x4d, 0xcf, - 0xf2, 0xec, 0xce, 0xae, 0x74, 0x44, 0x36, 0xcf, 0x4a, 0x1c, 0xe1, 0xc3, 0xbe, 0xe2, 0x34, 0x3d, - 0x13, 0x11, 0x8c, 0x7f, 0x93, 0x81, 0x85, 0x7e, 0xfd, 0x48, 0x16, 0x60, 0x9c, 0x2a, 0xb9, 0x6d, - 0xf2, 0xa6, 0xfc, 0x49, 0x9e, 0x85, 0xe8, 0x78, 0x10, 0x22, 0x43, 0xbe, 0x21, 0xf2, 0x8c, 0xa0, - 0x65, 0xbf, 0x7a, 0x18, 0x08, 0xfb, 0xec, 0x42, 0x43, 0x3d, 0x12, 0xce, 0x01, 0x44, 0x67, 0x00, - 0xd7, 0xcb, 0x98, 0x13, 0x76, 0xc3, 0xe3, 0xcb, 0x95, 0x9c, 0x86, 0x31, 0xbe, 0xc7, 0x0a, 0xf7, - 0x0f, 0xf1, 0x8b, 0x1d, 0xf6, 0xa2, 0x93, 0xf1, 0x70, 0xc8, 0x2d, 0x17, 0xb4, 0xce, 0x1e, 0x6b, - 0xe3, 0xe0, 0x18, 0xbf, 0x56, 0xe0, 0x72, 0x47, 0xb9, 0x17, 0xec, 0x49, 0x49, 0x65, 0x29, 0xcd, - 0x5d, 0x8e, 0x9b, 0x92, 0x2a, 0x66, 0xe9, 0xba, 0x93, 0x9c, 0x7c, 0xfa, 0xca, 0xa6, 0x3e, 0x7d, - 0xbd, 0x0e, 0x13, 0x2b, 0x7b, 0xb4, 0xb1, 0x1f, 0xfa, 0x20, 0xe5, 0xc5, 0xdb, 0x02, 0x03, 0xf2, - 0x30, 0xf2, 0x11, 0x02, 0xb9, 0x0a, 0x80, 0x5e, 0xba, 0x5c, 0x20, 0x57, 0x52, 0xc1, 0xa0, 0x53, - 0xaf, 0xb0, 0xce, 0x51, 0x50, 0x90, 0x7d, 0xdd, 0xbc, 0xa9, 0x9a, 0xf3, 0x70, 0xf6, 0xbe, 0xb7, - 0x23, 0xd0, 0x23, 0x04, 0xd6, 0x3c, 0x65, 0x33, 0x12, 0x47, 0x67, 0x31, 0xb1, 0x63, 0xa9, 0x48, - 0xe4, 0x73, 0x30, 0xbe, 0x42, 0xbd, 0x60, 0x73, 0x73, 0x1d, 0x6d, 0x68, 0x78, 0x06, 0x94, 0x3c, - 0x66, 0xab, 0x08, 0x82, 0xd6, 0x77, 0x0f, 0x4b, 0x53, 0x81, 0xd3, 0xa6, 0x61, 0x64, 0x77, 0x53, - 0x62, 0x93, 0x65, 0x28, 0xf2, 0x57, 0xfe, 0xe8, 0x2a, 0x85, 0xc7, 0x63, 0x9e, 0x1f, 0xd6, 0xc2, - 0x24, 0xe0, 0x11, 0xdd, 0x0e, 0x73, 0x75, 0x24, 0xf0, 0xc9, 0xaa, 0x4c, 0x71, 0xa3, 0x7e, 0x36, - 0x44, 0xcb, 0x31, 0xbe, 0x6d, 0xb0, 0xaf, 0x4f, 0x52, 0x90, 0x32, 0x4c, 0xad, 0xb8, 0xed, 0xae, - 0x1d, 0x38, 0x98, 0x40, 0xf4, 0x40, 0x9c, 0x84, 0xa8, 0x9f, 0x6c, 0xa8, 0x05, 0xda, 0xb1, 0xaa, - 0x16, 0x90, 0x9b, 0x30, 0x6d, 0xba, 0x3d, 0xd6, 0xed, 0x52, 0xa9, 0xc0, 0x0f, 0x3b, 0xb4, 0x74, - 0xf1, 0x58, 0x09, 0x3b, 0x9b, 0x85, 0x06, 0x41, 0x8b, 0x82, 0xab, 0x51, 0x91, 0x8d, 0x94, 0xd7, - 0x1d, 0xf5, 0x84, 0x53, 0x33, 0x76, 0x24, 0x98, 0xa5, 0x3c, 0x0c, 0x5d, 0x87, 0xc9, 0x7a, 0xfd, - 0xde, 0x26, 0xf5, 0x83, 0x9b, 0x2d, 0xf7, 0x11, 0x1e, 0x70, 0x79, 0x91, 0x60, 0xce, 0x77, 0xad, - 0x80, 0xfa, 0x81, 0xb5, 0xd3, 0x72, 0x1f, 0x99, 0x2a, 0x16, 0xf9, 0x2a, 0xeb, 0x0f, 0x45, 0x1c, - 0x14, 0xf1, 0x7e, 0x07, 0x49, 0xac, 0x78, 0x8c, 0x44, 0x8b, 0x80, 0xc9, 0xad, 0x7a, 0x67, 0x29, - 0xe8, 0xe8, 0x22, 0xe7, 0xb9, 0x8f, 0x0f, 0xca, 0xcd, 0xa6, 0x47, 0x7d, 0x5f, 0x9c, 0x44, 0xdc, - 0x45, 0x0e, 0x75, 0x27, 0x36, 0x2f, 0xd0, 0x5c, 0xe4, 0x14, 0x02, 0xb2, 0xc2, 0x44, 0x24, 0x36, - 0x8a, 0x68, 0x7b, 0x55, 0xad, 0xe1, 0x61, 0x22, 0x94, 0xb2, 0x62, 0xcc, 0xb9, 0x95, 0x96, 0xd3, - 0xd5, 0x25, 0x21, 0x85, 0x86, 0x54, 0x61, 0x86, 0x03, 0xd8, 0xd2, 0xe2, 0xe9, 0xa5, 0xe6, 0xa2, - 0x04, 0x17, 0x82, 0x0d, 0x9a, 0x0b, 0x60, 0x8a, 0x29, 0x35, 0x28, 0x6c, 0x8c, 0x8e, 0xbc, 0x07, - 0xd3, 0x18, 0xbb, 0x3f, 0xf4, 0x33, 0xc2, 0x33, 0xa1, 0xc0, 0x63, 0xdb, 0x8a, 0x92, 0x98, 0xf3, - 0x5e, 0xc1, 0xf7, 0xf7, 0x6a, 0xd2, 0x01, 0x89, 0x31, 0x40, 0x73, 0x9f, 0x88, 0xc1, 0xa9, 0x88, - 0x81, 0x28, 0x89, 0x33, 0x08, 0x5a, 0x7e, 0xc4, 0xe0, 0x67, 0x32, 0x70, 0x96, 0x55, 0xa4, 0xba, - 0x14, 0xe1, 0xa6, 0x80, 0xb6, 0x4c, 0x3c, 0xef, 0xc8, 0xe5, 0x2b, 0x52, 0x3e, 0xb9, 0xa2, 0xa0, - 0x5d, 0x79, 0x78, 0xed, 0x4a, 0x39, 0xfa, 0x59, 0x97, 0x44, 0x3c, 0xda, 0x67, 0x5f, 0x9e, 0xaa, - 0x1c, 0xe8, 0xfb, 0x7b, 0x69, 0x1c, 0xf0, 0xa3, 0xd8, 0xc7, 0xa7, 0x7f, 0xd4, 0x99, 0x8f, 0xfd, - 0x51, 0x7d, 0x79, 0xaa, 0x1f, 0x15, 0xb4, 0xfc, 0xd4, 0x8f, 0xba, 0x01, 0x53, 0x78, 0x4a, 0x0b, - 0xe9, 0xc8, 0x13, 0x59, 0x4d, 0x70, 0x4d, 0x68, 0x05, 0x66, 0x81, 0xfd, 0xbc, 0x2f, 0x7e, 0xdd, - 0x1e, 0xc9, 0x8f, 0x17, 0xf3, 0xb7, 0x47, 0xf2, 0xb3, 0x45, 0x62, 0x4e, 0x84, 0x1d, 0x6f, 0x9e, - 0x4a, 0xfd, 0x10, 0xbc, 0xb5, 0xb2, 0x1b, 0x76, 0x74, 0xf5, 0xfa, 0xde, 0xf2, 0xaf, 0xd1, 0xda, - 0x36, 0xc0, 0xbf, 0x66, 0x8b, 0xbb, 0x7b, 0x2b, 0xdd, 0x20, 0x6f, 0xad, 0x1a, 0x38, 0x7e, 0x6b, - 0x8d, 0xd1, 0x98, 0x31, 0x6c, 0xe3, 0x9b, 0x93, 0x31, 0xbe, 0xc2, 0xa6, 0xd6, 0x80, 0x31, 0x7e, - 0x29, 0x15, 0x9d, 0x8c, 0xc6, 0x15, 0xfc, 0xca, 0x6a, 0x8a, 0x12, 0x72, 0x16, 0x72, 0xf5, 0xfa, - 0x3d, 0xd1, 0xc9, 0x68, 0x59, 0xeb, 0xfb, 0xae, 0xc9, 0x60, 0x6c, 0x84, 0xd0, 0x5c, 0x56, 0xc9, - 0xb8, 0xc0, 0x4e, 0x32, 0x13, 0xa1, 0xac, 0xbf, 0xe5, 0x15, 0x71, 0x24, 0xea, 0x6f, 0x71, 0x45, - 0x8c, 0x2e, 0x86, 0x2b, 0xb0, 0x50, 0xf6, 0x7d, 0xea, 0xb1, 0x19, 0x21, 0xac, 0x30, 0x3d, 0x71, - 0x8d, 0x11, 0x47, 0x30, 0x56, 0x6a, 0x37, 0x7c, 0xb3, 0x2f, 0x22, 0xb9, 0x08, 0xf9, 0x72, 0xaf, - 0xe9, 0xd0, 0x4e, 0x43, 0x8b, 0x1f, 0x67, 0x0b, 0x98, 0x19, 0x96, 0x92, 0xf7, 0xe1, 0x54, 0x2c, - 0xbe, 0xa4, 0xe8, 0x81, 0xf1, 0x68, 0x57, 0x95, 0xd7, 0xac, 0xc8, 0x72, 0x84, 0x77, 0x49, 0x3a, - 0x25, 0x29, 0x43, 0x71, 0x15, 0xfd, 0xc9, 0x2a, 0x94, 0x3f, 0x62, 0xb9, 0x1e, 0x77, 0x24, 0xe4, - 0x97, 0x62, 0x11, 0x45, 0xb3, 0x19, 0x16, 0x9a, 0x09, 0x74, 0x72, 0x07, 0xe6, 0xe2, 0x30, 0x76, - 0x36, 0xf3, 0xfb, 0x2f, 0xee, 0x6a, 0x09, 0x2e, 0x78, 0x3a, 0xa7, 0x51, 0x91, 0x6d, 0x98, 0x8d, - 0x2c, 0xa7, 0xf4, 0x5b, 0xb1, 0x34, 0xc8, 0x0e, 0xcb, 0xe5, 0xcd, 0xf8, 0x59, 0x31, 0x19, 0xe7, - 0x22, 0x2b, 0xac, 0xf0, 0x76, 0x6c, 0x26, 0xd9, 0x91, 0x26, 0x4c, 0xd7, 0x9d, 0xdd, 0x8e, 0xd3, - 0xd9, 0xbd, 0x43, 0x0f, 0x6a, 0xb6, 0xe3, 0x09, 0xd3, 0x58, 0x69, 0xf8, 0x5e, 0xf6, 0x0f, 0xda, - 0x6d, 0x1a, 0x78, 0xb8, 0xea, 0x59, 0x39, 0x3a, 0xcb, 0xb3, 0xdb, 0xce, 0xa2, 0xcf, 0xe9, 0xd0, - 0xbf, 0xb4, 0x6b, 0x3b, 0xda, 0xf1, 0xae, 0xf3, 0xd4, 0x34, 0x13, 0x85, 0x21, 0x35, 0x13, 0x2d, - 0x98, 0x5d, 0xed, 0x34, 0xbc, 0x03, 0x7c, 0x4b, 0x94, 0x1f, 0x37, 0x75, 0xcc, 0xc7, 0xbd, 0x24, - 0x3e, 0xee, 0x39, 0x5b, 0xce, 0xb0, 0xb4, 0xcf, 0x4b, 0x32, 0x26, 0x75, 0x98, 0x45, 0x11, 0xbf, - 0x5a, 0xa9, 0x55, 0x3b, 0x4e, 0xe0, 0xd8, 0x01, 0x6d, 0x0a, 0xb1, 0x21, 0xcc, 0x53, 0xc3, 0x6f, - 0xa0, 0x4e, 0xb3, 0x6b, 0x39, 0x12, 0x45, 0x65, 0x9a, 0xa0, 0x1f, 0x74, 0x0d, 0x9c, 0xf9, 0x53, - 0xba, 0x06, 0x56, 0x61, 0x26, 0x1e, 0x73, 0xa2, 0x18, 0x9d, 0xf6, 0x3e, 0x16, 0x31, 0xa1, 0xc1, - 0xed, 0xa1, 0x98, 0xa8, 0xa5, 0x86, 0x8d, 0x45, 0x9b, 0x88, 0xdd, 0x28, 0x67, 0xb5, 0x1b, 0xa5, - 0xb6, 0x2b, 0x9d, 0xe4, 0x46, 0x59, 0x03, 0xb8, 0xe9, 0x7a, 0x0d, 0x5a, 0x46, 0x47, 0x6e, 0xa2, - 0x65, 0xf3, 0x62, 0x4c, 0xa3, 0x42, 0xbe, 0x7e, 0x76, 0xd8, 0x6f, 0x2b, 0xee, 0x8f, 0xaf, 0xf0, - 0x20, 0x36, 0x9c, 0xa9, 0x79, 0x74, 0x87, 0x7a, 0x1e, 0x6d, 0x8a, 0x1b, 0xcc, 0xb2, 0xd3, 0x69, - 0xca, 0x14, 0x6d, 0x22, 0x9e, 0x77, 0x57, 0xa2, 0x84, 0x86, 0xe4, 0xdb, 0x1c, 0x49, 0x3d, 0x4c, - 0xfb, 0xf0, 0x31, 0x7e, 0x3c, 0x0b, 0x0b, 0xfd, 0x5a, 0x3c, 0xe0, 0xee, 0xf7, 0x1a, 0x24, 0x37, - 0x11, 0x71, 0x07, 0x2c, 0xd2, 0xf8, 0x56, 0xb2, 0x04, 0xe9, 0x7b, 0x85, 0xb8, 0x13, 0xce, 0xc5, - 0x09, 0xb6, 0xbc, 0x16, 0xb9, 0x01, 0x93, 0x4a, 0xff, 0xe0, 0x76, 0xdd, 0xaf, 0x37, 0x4d, 0xd8, - 0x89, 0xba, 0xec, 0x34, 0x88, 0xd3, 0x42, 0xde, 0x19, 0xf9, 0x2f, 0x52, 0xe4, 0xee, 0xf2, 0x63, - 0xdc, 0x22, 0xc2, 0xf7, 0x5d, 0x42, 0x00, 0x8f, 0x06, 0xbe, 0xcb, 0x9a, 0xf8, 0xb7, 0xf1, 0x8b, - 0x05, 0x7e, 0xe8, 0xab, 0x57, 0xc6, 0x7e, 0xb6, 0xd2, 0xb1, 0xab, 0x64, 0xf6, 0x24, 0x57, 0xc9, - 0xdc, 0xf1, 0x57, 0xc9, 0x91, 0xe3, 0xae, 0x92, 0xb1, 0xbb, 0xde, 0xe8, 0x09, 0xef, 0x7a, 0xe3, - 0x27, 0xba, 0xeb, 0x69, 0xd7, 0xd0, 0xfc, 0x71, 0xd7, 0xd0, 0x3f, 0xbf, 0x19, 0x3e, 0xad, 0x37, - 0xc3, 0x34, 0xa9, 0xf0, 0x44, 0x37, 0xc3, 0xc4, 0xc5, 0x6e, 0xf6, 0xc9, 0x5c, 0xec, 0xc8, 0x13, - 0xbb, 0xd8, 0xcd, 0x7d, 0xd2, 0x8b, 0xdd, 0xfc, 0x93, 0xbc, 0xd8, 0x9d, 0xfa, 0xb3, 0x78, 0xb1, - 0x3b, 0xfd, 0x1f, 0xe6, 0x62, 0x77, 0x1d, 0xf2, 0x35, 0xd7, 0x0f, 0x6e, 0xba, 0x5e, 0x1b, 0xef, - 0x96, 0x05, 0xa1, 0x92, 0x75, 0x7d, 0x9e, 0x25, 0x59, 0x13, 0xae, 0x04, 0x22, 0x59, 0x96, 0x13, - 0x4e, 0xde, 0xa4, 0x16, 0x22, 0xad, 0xb8, 0x98, 0x29, 0xe2, 0x42, 0x95, 0x9c, 0x6f, 0x82, 0xe4, - 0xf6, 0x48, 0x7e, 0xac, 0x38, 0x7e, 0x7b, 0x24, 0x5f, 0x2c, 0xce, 0x0e, 0x71, 0x33, 0xfc, 0x0b, - 0x50, 0x8c, 0x0b, 0xab, 0xc7, 0x87, 0x7b, 0x7e, 0x62, 0xb1, 0x36, 0x99, 0x28, 0x1d, 0x17, 0x16, - 0xc9, 0x55, 0x80, 0x9a, 0xe7, 0x3c, 0xb4, 0x03, 0x7a, 0x47, 0x9a, 0xfd, 0x89, 0xf8, 0xe6, 0x1c, - 0xca, 0x26, 0xa8, 0xa9, 0xa0, 0x84, 0xf7, 0xa4, 0x6c, 0xda, 0x3d, 0xc9, 0xf8, 0xb1, 0x2c, 0xcc, - 0xf2, 0x80, 0x75, 0x4f, 0xff, 0x9b, 0xed, 0xbb, 0xda, 0xed, 0xf7, 0xb9, 0x28, 0xa3, 0x82, 0xda, - 0xba, 0x01, 0xaf, 0xb6, 0x1f, 0xc2, 0xa9, 0x44, 0x57, 0xe0, 0x0d, 0xb8, 0x22, 0x43, 0x05, 0x26, - 0xee, 0xc0, 0x0b, 0xe9, 0x95, 0xdc, 0xbf, 0x6e, 0x26, 0x28, 0x8c, 0x3f, 0x1a, 0x49, 0xf0, 0x17, - 0xef, 0xb7, 0xea, 0x8b, 0x6c, 0xe6, 0x64, 0x2f, 0xb2, 0xd9, 0xe1, 0x5e, 0x64, 0x63, 0x12, 0x44, - 0x6e, 0x18, 0x09, 0xe2, 0x7d, 0x98, 0xda, 0xa4, 0x76, 0xdb, 0xdf, 0x74, 0x45, 0x7a, 0x2e, 0xee, - 0x64, 0x22, 0x23, 0x01, 0xb2, 0x32, 0x79, 0x81, 0x0b, 0x8d, 0x65, 0x03, 0x46, 0xc0, 0xce, 0x48, - 0x9e, 0xaf, 0xcb, 0xd4, 0x39, 0xa8, 0xb7, 0xf2, 0xd1, 0x01, 0xb7, 0xf2, 0x3a, 0x14, 0x04, 0x5d, - 0x14, 0xe3, 0x3a, 0xba, 0x3e, 0xb2, 0x22, 0x84, 0xcb, 0xda, 0xa5, 0xb7, 0xe7, 0x74, 0x58, 0x3b, - 0xbf, 0x39, 0x6a, 0x4c, 0x58, 0x17, 0xac, 0x76, 0x9a, 0x5d, 0xd7, 0xe9, 0x60, 0x17, 0x8c, 0x47, - 0x5d, 0x40, 0x05, 0x98, 0x77, 0x81, 0x82, 0x44, 0xde, 0x86, 0xe9, 0x72, 0xad, 0xaa, 0x92, 0xe5, - 0xa3, 0x47, 0x61, 0xbb, 0xeb, 0x58, 0x1a, 0x69, 0x0c, 0x77, 0xd0, 0x4d, 0x6a, 0xe2, 0x4f, 0xe7, - 0x26, 0x65, 0xfc, 0x46, 0x41, 0x2e, 0xef, 0x4f, 0xf7, 0x69, 0x44, 0x7f, 0xec, 0xc8, 0x9d, 0xf0, - 0xb1, 0x63, 0xe4, 0x38, 0x29, 0x53, 0x11, 0x66, 0xc7, 0x3e, 0xf1, 0xc3, 0xc5, 0xf8, 0x09, 0xc5, - 0xd3, 0xd8, 0xda, 0xc9, 0x0f, 0xb3, 0x76, 0x52, 0x45, 0xda, 0x89, 0x4f, 0x2e, 0xd2, 0xc2, 0x89, - 0x45, 0xda, 0x7a, 0xe4, 0x84, 0x3d, 0x79, 0xac, 0x6f, 0xcb, 0x39, 0xa1, 0x35, 0x98, 0x4d, 0x0f, - 0x27, 0x18, 0xba, 0x63, 0x7f, 0x4f, 0xc9, 0xc9, 0x5f, 0x4b, 0x97, 0x93, 0x07, 0x9f, 0x1f, 0x7f, - 0x2e, 0x29, 0xff, 0xb9, 0xa4, 0xfc, 0xa7, 0x22, 0x29, 0xdf, 0x03, 0x62, 0xf7, 0x82, 0x3d, 0xda, - 0x09, 0x9c, 0x06, 0x86, 0xb4, 0x65, 0x43, 0x8c, 0x32, 0xb3, 0x58, 0x23, 0xc9, 0x52, 0x75, 0x8d, - 0x68, 0xa5, 0x6c, 0x06, 0xf0, 0x30, 0xa0, 0x43, 0x4b, 0xc0, 0x1e, 0xae, 0xa8, 0x07, 0xb6, 0xd7, - 0x41, 0x35, 0xd1, 0x55, 0x18, 0x97, 0x21, 0x54, 0x33, 0x91, 0x92, 0x39, 0x19, 0x3b, 0x55, 0x62, - 0x91, 0x25, 0xc8, 0x4b, 0x62, 0x35, 0x11, 0xd0, 0x23, 0x01, 0xd3, 0xa2, 0x53, 0x0a, 0x98, 0xf1, - 0x9f, 0x8c, 0xc8, 0x5d, 0x9b, 0x7d, 0x70, 0xcd, 0xf6, 0xec, 0x36, 0xe6, 0x08, 0x0c, 0x17, 0x95, - 0x22, 0x7f, 0xc7, 0xd6, 0x61, 0xcc, 0x2d, 0x41, 0x27, 0xf9, 0x58, 0x31, 0x70, 0xa3, 0x34, 0xcc, - 0xb9, 0x21, 0xd2, 0x30, 0xbf, 0xa9, 0xe5, 0x30, 0x1e, 0x89, 0x92, 0x66, 0xb2, 0x9d, 0x6c, 0x70, - 0xf6, 0xe2, 0x1b, 0x6a, 0xb2, 0xe1, 0xd1, 0x28, 0x22, 0x19, 0x52, 0x0e, 0x48, 0x33, 0x1c, 0x5e, - 0x28, 0xc6, 0x4e, 0x12, 0x5d, 0x7a, 0xfc, 0x3f, 0x68, 0x74, 0xe9, 0x55, 0x00, 0x71, 0xba, 0x46, - 0xb6, 0x08, 0x2f, 0xe3, 0xe6, 0x23, 0x4c, 0xac, 0x83, 0xa0, 0xd5, 0x27, 0xfd, 0x88, 0x42, 0x68, - 0xfc, 0x2b, 0x02, 0xb3, 0xf5, 0xfa, 0xbd, 0x8a, 0x63, 0xef, 0x76, 0x5c, 0x3f, 0x70, 0x1a, 0xd5, - 0xce, 0x8e, 0xcb, 0xa4, 0xe9, 0xf0, 0x04, 0x50, 0xe2, 0x02, 0x47, 0xbb, 0x7f, 0x58, 0xcc, 0x6e, - 0x6b, 0xab, 0x9e, 0x27, 0xf5, 0x99, 0xfc, 0xb6, 0x46, 0x19, 0xc0, 0xe4, 0x70, 0x26, 0xb0, 0xd6, - 0x7b, 0x18, 0x95, 0x43, 0x18, 0x7c, 0xa0, 0xc0, 0xea, 0x73, 0x90, 0x29, 0xcb, 0x08, 0x4d, 0x4e, - 0x58, 0x71, 0x81, 0x39, 0xa3, 0xc5, 0xa8, 0x8e, 0x8a, 0xf9, 0xda, 0x15, 0xf2, 0x07, 0xee, 0xda, - 0x5d, 0x84, 0xab, 0x36, 0x70, 0x89, 0x35, 0x70, 0x00, 0xa7, 0x34, 0x7f, 0xed, 0x61, 0xdf, 0x57, - 0x5e, 0x15, 0x02, 0xb2, 0x81, 0x76, 0xc6, 0x29, 0x8f, 0x2c, 0x6a, 0xd2, 0xbf, 0xd4, 0x1a, 0xc8, - 0x8f, 0x65, 0xe0, 0x5c, 0x6a, 0x49, 0xb8, 0xba, 0x27, 0xb5, 0x38, 0xe1, 0xca, 0xa6, 0xc1, 0xd3, - 0x1b, 0xf6, 0xab, 0xda, 0x4a, 0xd9, 0x0a, 0x06, 0xd7, 0x44, 0x7e, 0x2d, 0x03, 0x67, 0x34, 0x8c, - 0x70, 0xb7, 0xf4, 0xc3, 0x50, 0x26, 0xa9, 0xf3, 0xfa, 0xa3, 0x27, 0x33, 0xaf, 0x5f, 0xd4, 0xdb, - 0x12, 0xed, 0x96, 0x6a, 0x1b, 0xfa, 0x7d, 0x21, 0x79, 0x08, 0xb3, 0x58, 0x24, 0xdf, 0x7a, 0xd8, - 0x9c, 0x15, 0x4f, 0x44, 0xf3, 0xd1, 0x67, 0xf3, 0x18, 0x04, 0x98, 0xa2, 0x7e, 0xe9, 0x3b, 0x87, - 0xa5, 0x29, 0x0d, 0x5d, 0x46, 0xde, 0xb6, 0xa2, 0x07, 0x23, 0xa7, 0xb3, 0xe3, 0xaa, 0xfb, 0x7e, - 0xa2, 0x0a, 0xf2, 0xcf, 0x32, 0x5c, 0xfd, 0xcf, 0x9b, 0x71, 0xd3, 0x73, 0xdb, 0x61, 0xb9, 0x34, - 0xa6, 0xec, 0xd3, 0x6d, 0xad, 0x27, 0xd3, 0x6d, 0x2f, 0xe3, 0x27, 0xf3, 0x3d, 0xc1, 0xda, 0xf1, - 0xdc, 0x76, 0xf4, 0xf9, 0x6a, 0xc7, 0xf5, 0xfd, 0x48, 0xf2, 0x43, 0x19, 0x38, 0xab, 0x69, 0x2d, - 0xd5, 0x34, 0x28, 0x22, 0xd2, 0xc3, 0x5c, 0x18, 0x03, 0x26, 0x2a, 0x5a, 0xbe, 0x22, 0xe6, 0xff, - 0x05, 0xfc, 0x02, 0x25, 0xe4, 0x28, 0x43, 0xb2, 0xda, 0x1c, 0x4b, 0xf9, 0x84, 0xfe, 0xb5, 0x10, - 0x07, 0x66, 0xd1, 0xa4, 0x46, 0x33, 0xfa, 0x9d, 0xef, 0x6f, 0xf4, 0x1b, 0x26, 0x38, 0xc2, 0xe4, - 0x07, 0xfd, 0x2d, 0x7f, 0x93, 0x5c, 0xc9, 0x0f, 0xc0, 0xd9, 0x04, 0x30, 0x5c, 0x6d, 0xa7, 0xfa, - 0xae, 0xb6, 0xd7, 0x8e, 0x0e, 0x4b, 0xaf, 0xa4, 0xd5, 0x96, 0xb6, 0xd2, 0xfa, 0xd7, 0x40, 0x6c, - 0x80, 0xa8, 0x50, 0x48, 0x3f, 0xe9, 0x13, 0xf4, 0x35, 0x31, 0x3f, 0x14, 0x7c, 0xb6, 0x97, 0x2b, - 0xdf, 0xa0, 0x1e, 0x79, 0x11, 0x12, 0xa1, 0x50, 0x50, 0x12, 0x3f, 0x1c, 0x08, 0x2b, 0x93, 0x3e, - 0x95, 0x7c, 0xe7, 0xb0, 0xa4, 0x61, 0xb3, 0x3b, 0x90, 0x9a, 0x51, 0x42, 0x13, 0x36, 0x55, 0x44, - 0xf2, 0xab, 0x19, 0x98, 0x67, 0x80, 0x68, 0x52, 0x89, 0x46, 0x2d, 0x0c, 0x9a, 0xf5, 0x7b, 0x4f, - 0x66, 0xd6, 0xbf, 0x80, 0xdf, 0xa8, 0xce, 0xfa, 0x44, 0x97, 0xa4, 0x7e, 0x1c, 0xce, 0x76, 0xcd, - 0x7a, 0x4b, 0x9b, 0xed, 0x67, 0x87, 0x98, 0xed, 0x7c, 0x00, 0x8e, 0x9f, 0xed, 0x7d, 0x6b, 0x21, - 0x9b, 0x50, 0x10, 0xd7, 0x1f, 0xde, 0x61, 0xcf, 0x6b, 0x21, 0xa8, 0xd5, 0x22, 0x7e, 0x27, 0x15, - 0x79, 0x31, 0x12, 0x2d, 0xd4, 0xb8, 0x90, 0x0e, 0xcc, 0xf1, 0xdf, 0xba, 0x7a, 0xa9, 0xd4, 0x57, - 0xbd, 0x74, 0x51, 0xb4, 0xe8, 0xbc, 0xe0, 0x1f, 0xd3, 0x32, 0xa9, 0xa1, 0xa3, 0x52, 0x18, 0x93, - 0x2e, 0x10, 0x0d, 0xcc, 0x17, 0xed, 0xf9, 0xc1, 0x4a, 0xa5, 0x57, 0x44, 0x9d, 0xa5, 0x78, 0x9d, - 0xf1, 0x95, 0x9b, 0xc2, 0x9b, 0xd8, 0x30, 0x23, 0xa0, 0xee, 0x3e, 0xe5, 0x3b, 0xfc, 0x0b, 0x5a, - 0xf0, 0xae, 0x58, 0x29, 0xbf, 0xc3, 0xc9, 0x9a, 0x30, 0xb8, 0x5a, 0x6c, 0x43, 0x8f, 0xf3, 0x23, - 0xf7, 0x60, 0xb6, 0xdc, 0xed, 0xb6, 0x1c, 0xda, 0xc4, 0x56, 0x9a, 0x3d, 0xd6, 0x26, 0x23, 0x4a, - 0x2d, 0x67, 0xf3, 0x42, 0x71, 0xb1, 0xf4, 0x7a, 0xb1, 0xed, 0x26, 0x41, 0x6b, 0xfc, 0x68, 0x26, - 0xf1, 0xd1, 0xe4, 0x75, 0x98, 0xc0, 0x1f, 0x4a, 0x3c, 0x18, 0xd4, 0xd2, 0xf0, 0x4f, 0x44, 0xfd, - 0x4f, 0x84, 0xc0, 0x84, 0x25, 0x35, 0x26, 0x64, 0x8e, 0x0b, 0x4b, 0x42, 0x95, 0x10, 0x29, 0x0f, - 0x4a, 0xd2, 0x19, 0x23, 0x17, 0x09, 0x5d, 0xe8, 0x8c, 0x21, 0x5c, 0x30, 0x8c, 0x7f, 0x98, 0xd5, - 0xa7, 0x1d, 0xb9, 0xa8, 0xc8, 0xed, 0x4a, 0x54, 0x4a, 0x29, 0xb7, 0x2b, 0xd2, 0xfa, 0xdf, 0xcd, - 0xc0, 0xdc, 0x3d, 0x25, 0x91, 0xe9, 0xa6, 0x8b, 0xe3, 0x32, 0x38, 0xb5, 0xe7, 0x93, 0xca, 0x36, - 0xa8, 0x66, 0x50, 0x65, 0x33, 0x05, 0xa7, 0x8c, 0x99, 0xf6, 0x3d, 0xe8, 0xa8, 0x87, 0x1f, 0xa6, - 0x24, 0x7d, 0xe4, 0xe8, 0x1c, 0x7e, 0xc2, 0x2c, 0x19, 0xc6, 0x4f, 0x66, 0x61, 0x52, 0x59, 0x31, - 0xe4, 0xb3, 0x50, 0x50, 0xab, 0x55, 0x55, 0x7c, 0xea, 0x57, 0x9a, 0x1a, 0x16, 0xea, 0xf8, 0xa8, - 0xdd, 0xd6, 0x74, 0x7c, 0x6c, 0x5d, 0x20, 0xf4, 0x84, 0x37, 0xa1, 0xf7, 0x52, 0x6e, 0x42, 0x38, - 0xcb, 0x15, 0x9d, 0xce, 0xc0, 0xfb, 0xd0, 0xdb, 0xc9, 0xfb, 0x10, 0xaa, 0x97, 0x14, 0xfa, 0xfe, - 0xb7, 0x22, 0xe3, 0xa7, 0x33, 0x50, 0x8c, 0xaf, 0xe9, 0x4f, 0xa5, 0x57, 0x4e, 0xf0, 0x9e, 0xf3, - 0x13, 0xd9, 0x30, 0x49, 0x8c, 0xf4, 0x56, 0x7e, 0x5a, 0x0d, 0x0d, 0xdf, 0xd1, 0x9e, 0x5a, 0x9e, - 0xd5, 0x03, 0xef, 0xa9, 0x71, 0x3e, 0xd2, 0xa3, 0x6d, 0x8e, 0x7c, 0xeb, 0x6f, 0x95, 0x9e, 0x31, - 0x3e, 0x80, 0xf9, 0x78, 0x77, 0xe0, 0x73, 0x4b, 0x19, 0x66, 0x74, 0x78, 0x3c, 0xc5, 0x54, 0x9c, - 0xca, 0x8c, 0xe3, 0x1b, 0xbf, 0x9b, 0x8d, 0xf3, 0x16, 0x46, 0x87, 0x6c, 0x8f, 0x52, 0xed, 0x5c, - 0xc4, 0x1e, 0xc5, 0x41, 0xa6, 0x2c, 0x3b, 0x49, 0x6a, 0xb7, 0xd0, 0xe7, 0x36, 0x97, 0xee, 0x73, - 0x4b, 0x6e, 0xc4, 0x2c, 0xa8, 0x95, 0x00, 0x51, 0x8f, 0xe8, 0xb6, 0x15, 0x59, 0x51, 0x27, 0x0c, - 0xa7, 0xe7, 0xb5, 0x68, 0xe7, 0x92, 0x7e, 0x34, 0xd2, 0xae, 0x07, 0x58, 0xc0, 0x89, 0x53, 0x91, - 0xc9, 0x1a, 0x8c, 0xb3, 0xcf, 0xbc, 0x6b, 0x77, 0xc5, 0x2b, 0x0a, 0x09, 0x3d, 0xf0, 0x5b, 0xe1, - 0xfd, 0x50, 0x71, 0xc2, 0x6f, 0x51, 0x26, 0x21, 0xa8, 0x13, 0x4b, 0x20, 0x1a, 0xff, 0x77, 0x86, - 0xad, 0xff, 0xc6, 0xfe, 0xf7, 0x58, 0x7e, 0x38, 0xd6, 0xa4, 0x01, 0x36, 0xb1, 0xff, 0x36, 0xcb, - 0xd3, 0xfe, 0x88, 0xe9, 0xf3, 0x26, 0x8c, 0x6d, 0xda, 0xde, 0xae, 0x48, 0xe9, 0xad, 0x73, 0xe1, - 0x05, 0x51, 0xf8, 0xaa, 0x00, 0x7f, 0x9b, 0x82, 0x40, 0x55, 0x9d, 0x65, 0x87, 0x52, 0x9d, 0x29, - 0x9a, 0xfb, 0xdc, 0x13, 0xd3, 0xdc, 0x7f, 0x5f, 0x98, 0xe1, 0xa7, 0x1c, 0x0c, 0x11, 0x4c, 0xfb, - 0x7c, 0x3c, 0xa1, 0x56, 0x22, 0xec, 0x79, 0xc4, 0x8e, 0xdc, 0x50, 0x53, 0x74, 0x29, 0xce, 0x9f, - 0xc7, 0x24, 0xe3, 0x32, 0xfe, 0xeb, 0x1c, 0xef, 0x63, 0xd1, 0x51, 0x17, 0x34, 0x17, 0x77, 0x5c, - 0x27, 0x31, 0xad, 0x26, 0x77, 0x76, 0xbf, 0x00, 0x23, 0x6c, 0x6e, 0x8a, 0xde, 0x44, 0x3c, 0x36, - 0x7f, 0x55, 0x3c, 0x56, 0xce, 0xd6, 0x32, 0x9e, 0x49, 0x6a, 0xee, 0x45, 0x3c, 0xb6, 0xd4, 0xb5, - 0x8c, 0x18, 0xac, 0x05, 0x61, 0x02, 0x0b, 0xb5, 0x05, 0xed, 0x1d, 0x3b, 0x99, 0x29, 0x4f, 0xc9, - 0x9a, 0xb3, 0x0a, 0xd3, 0x0f, 0x9c, 0x4e, 0xd3, 0x7d, 0xe4, 0x57, 0xa8, 0xbf, 0x1f, 0xb8, 0x5d, - 0x61, 0x07, 0x8c, 0x1a, 0xfe, 0x47, 0xbc, 0xc4, 0x6a, 0xf2, 0x22, 0xf5, 0x39, 0x44, 0x27, 0x22, - 0xcb, 0x30, 0xa5, 0x85, 0x80, 0x15, 0x8f, 0x94, 0xa8, 0xe3, 0xd4, 0x03, 0xc8, 0xaa, 0x3a, 0x4e, - 0x8d, 0x84, 0x9d, 0xd2, 0xe2, 0xfb, 0x95, 0xa7, 0xca, 0xc4, 0xb7, 0x0b, 0x1c, 0x72, 0x1d, 0xf2, - 0x3c, 0x4e, 0x48, 0xb5, 0xa2, 0x3e, 0x4f, 0xf9, 0x08, 0x8b, 0xc5, 0xd9, 0x91, 0x88, 0x51, 0x5c, - 0x08, 0xee, 0x24, 0x67, 0x8e, 0x6c, 0xb8, 0x4d, 0x6a, 0x7c, 0x06, 0x8a, 0x62, 0xd3, 0x89, 0xb2, - 0xc5, 0x3f, 0x07, 0x23, 0x2b, 0xd5, 0x8a, 0xa9, 0x6e, 0x14, 0x0d, 0xa7, 0xe9, 0x99, 0x08, 0x45, - 0x1f, 0xb9, 0x0d, 0x1a, 0x3c, 0x72, 0xbd, 0x7d, 0x93, 0xfa, 0x81, 0xe7, 0xf0, 0xe4, 0x9c, 0xb8, - 0xd4, 0x3e, 0x4b, 0xde, 0x86, 0x51, 0x34, 0x4e, 0x8d, 0xed, 0xfd, 0xf1, 0x3a, 0x96, 0xa7, 0xc4, - 0x14, 0x1d, 0x45, 0x4b, 0x57, 0x93, 0x13, 0x91, 0x37, 0x61, 0xa4, 0x42, 0x3b, 0x07, 0xb1, 0xbc, - 0x81, 0x09, 0xe2, 0x70, 0xc9, 0x37, 0x69, 0xe7, 0xc0, 0x44, 0x12, 0xe3, 0xa7, 0xb3, 0x70, 0x2a, - 0xe5, 0xb3, 0xee, 0x7f, 0xf6, 0x29, 0xdd, 0xf7, 0x96, 0xb5, 0x7d, 0x4f, 0xbe, 0x39, 0xf7, 0xed, - 0xf8, 0xd4, 0x6d, 0xf0, 0x6f, 0x64, 0xe0, 0x8c, 0x3e, 0x59, 0x85, 0x35, 0xfa, 0xfd, 0xeb, 0xe4, - 0x2d, 0x18, 0x5b, 0xa3, 0x76, 0x93, 0xca, 0x24, 0x61, 0xa7, 0xc2, 0xe8, 0x7e, 0x3c, 0x8c, 0x00, - 0x2f, 0xe4, 0x6c, 0x23, 0xa7, 0x53, 0x0e, 0x25, 0x15, 0xf1, 0x71, 0x5c, 0x40, 0x37, 0x64, 0x70, - 0x92, 0xb4, 0xaa, 0x06, 0x58, 0x6e, 0x7c, 0x27, 0x03, 0xcf, 0x0e, 0xa0, 0x61, 0x03, 0xc7, 0x86, - 0x5e, 0x1d, 0x38, 0x3c, 0x33, 0x11, 0x4a, 0xde, 0x85, 0x99, 0x4d, 0x21, 0xe0, 0xcb, 0xe1, 0xc8, - 0x46, 0x6b, 0x47, 0xca, 0xfe, 0xd2, 0xb6, 0xc8, 0x8c, 0x23, 0x6b, 0x51, 0x73, 0x72, 0x03, 0xa3, - 0xe6, 0xa8, 0x41, 0x68, 0x46, 0x86, 0x0d, 0x42, 0xf3, 0x01, 0xcc, 0xeb, 0x6d, 0x13, 0xb1, 0x80, - 0xa3, 0x10, 0x3c, 0x99, 0xfe, 0x21, 0x78, 0x06, 0x46, 0x1c, 0x35, 0x7e, 0x32, 0x03, 0x45, 0x9d, - 0xf7, 0x27, 0x1d, 0xcf, 0x77, 0xb4, 0xf1, 0x7c, 0x36, 0x7d, 0x3c, 0xfb, 0x0f, 0xe4, 0xff, 0x91, - 0x89, 0x37, 0x76, 0xa8, 0x11, 0x34, 0x60, 0xac, 0xe2, 0xb6, 0x6d, 0x47, 0x0e, 0x1c, 0xba, 0x92, - 0x34, 0x11, 0x62, 0x8a, 0x92, 0xe1, 0x22, 0x16, 0x9d, 0x87, 0xd1, 0x0d, 0xb7, 0x53, 0xae, 0x08, - 0x9b, 0x5c, 0xe4, 0xd3, 0x71, 0x3b, 0x96, 0xdd, 0x34, 0x79, 0x01, 0x59, 0x07, 0xa8, 0x37, 0x3c, - 0x4a, 0x3b, 0x75, 0xe7, 0xfb, 0x69, 0x4c, 0x96, 0x60, 0x3d, 0xd4, 0xea, 0xe1, 0xc6, 0xc2, 0x9f, - 0x52, 0x11, 0xd1, 0xf2, 0x9d, 0xef, 0x57, 0xf7, 0x5e, 0x85, 0x1e, 0xd7, 0x95, 0x08, 0xea, 0x16, - 0x1b, 0x87, 0x6b, 0x9f, 0xc6, 0xba, 0x4a, 0xad, 0x0a, 0x7b, 0xf8, 0x5a, 0xea, 0x70, 0xfc, 0x4e, - 0x06, 0x9e, 0x1d, 0x40, 0xf3, 0x04, 0x46, 0xe5, 0x4f, 0xbb, 0xc3, 0x29, 0x40, 0x44, 0x84, 0x69, - 0x99, 0x9d, 0x66, 0xc0, 0x13, 0xff, 0x4d, 0x89, 0xb4, 0xcc, 0x0c, 0xa0, 0xa5, 0x65, 0x66, 0x00, - 0x76, 0xae, 0xae, 0x51, 0x67, 0x77, 0x8f, 0x9b, 0x5c, 0x4d, 0xf1, 0xbd, 0x61, 0x0f, 0x21, 0xea, - 0xb9, 0xca, 0x71, 0x8c, 0x7f, 0x3d, 0x06, 0x67, 0x4d, 0xba, 0xeb, 0xb0, 0x9b, 0xc7, 0x96, 0xef, - 0x74, 0x76, 0xb5, 0x20, 0x3e, 0x46, 0x6c, 0xe5, 0x8a, 0x8c, 0x17, 0x0c, 0x12, 0xce, 0xc4, 0x4b, - 0x90, 0x67, 0xc7, 0xaa, 0xb2, 0x78, 0xf1, 0x15, 0xab, 0xe3, 0x36, 0xa9, 0x88, 0x12, 0x2d, 0x8b, - 0xc9, 0xab, 0x42, 0x10, 0x52, 0x72, 0x12, 0x31, 0x41, 0xe8, 0xbb, 0x87, 0x25, 0xa8, 0x1f, 0xf8, - 0x01, 0xc5, 0x4b, 0xb0, 0x10, 0x86, 0xc2, 0xdb, 0xca, 0x48, 0x9f, 0xdb, 0xca, 0x5d, 0x98, 0x2f, - 0x37, 0xf9, 0xe9, 0x68, 0xb7, 0x6a, 0x9e, 0xd3, 0x69, 0x38, 0x5d, 0xbb, 0x25, 0x6f, 0xe0, 0xd8, - 0xcb, 0x76, 0x58, 0x6e, 0x75, 0x43, 0x04, 0x33, 0x95, 0x8c, 0x35, 0xa3, 0xb2, 0x51, 0xc7, 0x08, - 0x31, 0xe2, 0x81, 0x12, 0x9b, 0xd1, 0xec, 0xf8, 0xd8, 0x0a, 0xdf, 0x0c, 0x8b, 0xf1, 0x9e, 0x84, - 0xcf, 0xd1, 0x9b, 0xeb, 0xf5, 0x3b, 0x22, 0x6b, 0x9a, 0x4c, 0x99, 0xc0, 0x0d, 0x0d, 0x82, 0x96, - 0x8f, 0xe6, 0x8d, 0x1a, 0x5e, 0x44, 0x57, 0xaf, 0xaf, 0x31, 0xba, 0x7c, 0x82, 0xce, 0xf7, 0xf7, - 0x54, 0x3a, 0x8e, 0x47, 0xae, 0xb2, 0xa9, 0xd0, 0x76, 0x03, 0x8a, 0x53, 0x78, 0x22, 0xba, 0x55, - 0x79, 0x08, 0xe5, 0xb7, 0x2a, 0x05, 0x85, 0xbc, 0x0d, 0x73, 0xab, 0x2b, 0x4b, 0x52, 0xad, 0x5c, - 0x71, 0x1b, 0x3d, 0x34, 0x0c, 0x00, 0xac, 0x0f, 0xc7, 0x90, 0x36, 0x96, 0xd8, 0x6e, 0x92, 0x86, - 0x46, 0x2e, 0xc0, 0x78, 0xb5, 0xc2, 0xfb, 0x7e, 0x52, 0xcd, 0x0b, 0x26, 0xac, 0x9d, 0x64, 0x21, - 0xb9, 0x17, 0x89, 0xfd, 0x85, 0x63, 0xe5, 0xf3, 0xb3, 0x43, 0x88, 0xfc, 0x6f, 0xc2, 0xd4, 0xb2, - 0x1b, 0x54, 0x3b, 0x7e, 0x60, 0x77, 0x1a, 0xb4, 0x5a, 0x51, 0x83, 0x74, 0x6f, 0xbb, 0x81, 0xe5, - 0x88, 0x12, 0xf6, 0xe5, 0x3a, 0x26, 0xf9, 0x3c, 0x92, 0xde, 0xa2, 0x1d, 0xea, 0x45, 0xc1, 0xb9, - 0x47, 0x79, 0xdf, 0x32, 0xd2, 0xdd, 0xb0, 0xc4, 0xd4, 0x11, 0x89, 0x09, 0xa7, 0x30, 0xc9, 0xbf, - 0xdb, 0xf3, 0xf5, 0xca, 0x67, 0x22, 0x91, 0xb6, 0x2b, 0x10, 0xac, 0xf8, 0x57, 0xa4, 0x93, 0x8a, - 0x3c, 0x68, 0x3c, 0x7b, 0xe9, 0x8a, 0xdb, 0xa4, 0x3e, 0xdf, 0x81, 0xbe, 0x87, 0xf2, 0xa0, 0x29, - 0x6d, 0x1b, 0xb0, 0x2b, 0xff, 0xc7, 0x98, 0x07, 0x2d, 0x81, 0x4b, 0x3e, 0x0f, 0xa3, 0xf8, 0x53, - 0x48, 0xcc, 0x73, 0x29, 0x6c, 0x23, 0x69, 0xb9, 0xc1, 0x30, 0x4d, 0x4e, 0x40, 0xaa, 0x30, 0x2e, - 0xae, 0x63, 0x27, 0xc9, 0xe6, 0x23, 0xee, 0x75, 0x7c, 0xb6, 0x09, 0x7a, 0xa3, 0x09, 0x05, 0xb5, - 0x42, 0xb6, 0xca, 0xd6, 0x6c, 0x7f, 0x8f, 0x36, 0xd9, 0x2f, 0x91, 0x88, 0x0f, 0x57, 0xd9, 0x1e, - 0x42, 0x2d, 0xf6, 0x1d, 0xa6, 0x82, 0xc2, 0xce, 0xe9, 0xaa, 0xbf, 0xe5, 0x8b, 0x4f, 0x11, 0x0a, - 0x1a, 0x07, 0x95, 0x7d, 0x4d, 0x53, 0x14, 0x19, 0xdf, 0x07, 0xf3, 0x1b, 0xbd, 0x56, 0xcb, 0xde, - 0x6e, 0x51, 0x99, 0xa8, 0x05, 0x33, 0xa2, 0x2f, 0xc3, 0x68, 0x5d, 0xc9, 0xb1, 0x1e, 0x26, 0xcb, - 0x54, 0x70, 0xd0, 0x58, 0x35, 0x83, 0x11, 0x80, 0x62, 0xd9, 0xd5, 0x39, 0xa9, 0xf1, 0xdb, 0x19, - 0x98, 0x97, 0x46, 0x06, 0x9e, 0xdd, 0xd8, 0x0f, 0x13, 0xed, 0x5f, 0xd0, 0xe6, 0x1a, 0x2e, 0x82, - 0xd8, 0x34, 0xe2, 0xb3, 0xee, 0xb6, 0xfc, 0x08, 0x5d, 0x08, 0x4a, 0xfb, 0xe0, 0xe3, 0x3e, 0x86, - 0xbc, 0x0d, 0x93, 0xe2, 0xc8, 0x55, 0x22, 0x70, 0x62, 0x00, 0x32, 0x71, 0x9d, 0x8c, 0x9b, 0xbc, - 0xa8, 0xe8, 0x28, 0xdf, 0xe9, 0x4d, 0xf9, 0xa4, 0x72, 0x45, 0xba, 0x7c, 0xa7, 0xd7, 0x31, 0x60, - 0xea, 0x7e, 0x7b, 0x32, 0xde, 0xb7, 0x62, 0xee, 0xde, 0x50, 0x63, 0xee, 0x65, 0xa2, 0x9b, 0x77, - 0x14, 0x73, 0x4f, 0xbd, 0x79, 0x87, 0xa8, 0xe1, 0x98, 0x64, 0x8f, 0x19, 0x93, 0x77, 0xe5, 0x98, - 0xe4, 0xfa, 0x4f, 0x8c, 0xb9, 0x01, 0xe3, 0x50, 0x8f, 0x56, 0xc8, 0xc8, 0x50, 0xca, 0x98, 0x67, - 0x30, 0xb9, 0x00, 0x27, 0x89, 0xef, 0xcc, 0x82, 0x93, 0xaa, 0xe1, 0x19, 0x1d, 0x9e, 0xe9, 0x31, - 0xdb, 0xfd, 0x17, 0xa0, 0x50, 0x0e, 0x02, 0xbb, 0xb1, 0x47, 0x9b, 0x15, 0xb6, 0x3d, 0x29, 0x41, - 0xb5, 0x6c, 0x01, 0x57, 0x5f, 0xe6, 0x54, 0x5c, 0x1e, 0xee, 0xd6, 0xf6, 0x85, 0x91, 0x6c, 0x18, - 0xee, 0x96, 0x41, 0xf4, 0x70, 0xb7, 0x0c, 0x42, 0xae, 0xc2, 0x78, 0xb5, 0xf3, 0xd0, 0x61, 0x7d, - 0xc2, 0xe3, 0x6a, 0xa1, 0x46, 0xcb, 0xe1, 0x20, 0x75, 0x73, 0x15, 0x58, 0xe4, 0x4d, 0xe5, 0xa2, - 0x34, 0x11, 0x29, 0x48, 0xb8, 0xa2, 0x2c, 0x8c, 0x81, 0xa3, 0x5e, 0x82, 0xc2, 0x9b, 0xd3, 0x0d, - 0x18, 0x97, 0xfa, 0x4f, 0x88, 0x4e, 0x10, 0x41, 0x99, 0x0c, 0x41, 0x21, 0x91, 0x31, 0x69, 0xba, - 0x92, 0x50, 0x70, 0x52, 0x49, 0x9a, 0xae, 0x24, 0x14, 0xd4, 0x92, 0xa6, 0x2b, 0xa9, 0x05, 0x43, - 0xd5, 0x51, 0xe1, 0x58, 0xd5, 0xd1, 0x7d, 0x28, 0xd4, 0x6c, 0x2f, 0x70, 0x98, 0xdc, 0xd3, 0x09, - 0xfc, 0x85, 0x29, 0x4d, 0xdb, 0xaa, 0x14, 0x2d, 0x3f, 0x2f, 0x13, 0x77, 0x77, 0x15, 0x7c, 0x3d, - 0xc3, 0x74, 0x04, 0x4f, 0x37, 0x91, 0x9d, 0xfe, 0x24, 0x26, 0xb2, 0xd8, 0xa9, 0xa8, 0x61, 0x9b, - 0x89, 0x34, 0x3e, 0x78, 0x11, 0x8a, 0xa9, 0xd9, 0x42, 0x44, 0xf2, 0x15, 0x28, 0xb0, 0xbf, 0x6b, - 0x6e, 0xcb, 0x69, 0x38, 0xd4, 0x5f, 0x28, 0x62, 0xe3, 0x9e, 0x4f, 0x5d, 0xfd, 0x88, 0x74, 0x50, - 0xa7, 0x01, 0x5f, 0xc0, 0xc8, 0x38, 0xae, 0x3a, 0xd7, 0xb8, 0x91, 0xf7, 0xa0, 0xc0, 0x66, 0xdf, - 0xb6, 0xed, 0x73, 0x71, 0x77, 0x36, 0x32, 0x72, 0x6e, 0x0a, 0x78, 0x22, 0xe2, 0xb4, 0x4a, 0xc0, - 0x8e, 0xf9, 0x72, 0x97, 0x6f, 0x90, 0x44, 0x99, 0xed, 0xdd, 0xc4, 0xe6, 0x28, 0xd1, 0xc8, 0x17, - 0xa1, 0x50, 0xee, 0x76, 0xa3, 0x1d, 0x67, 0x4e, 0x51, 0xb4, 0x75, 0xbb, 0x56, 0xea, 0xae, 0xa3, - 0x51, 0xc4, 0x37, 0xe6, 0xf9, 0x13, 0x6d, 0xcc, 0xe4, 0x72, 0x78, 0x03, 0x38, 0x15, 0xe9, 0x82, - 0xc5, 0x65, 0x54, 0xbb, 0x4e, 0xf0, 0xcb, 0xc0, 0x0a, 0x4c, 0x71, 0xe5, 0xa8, 0x94, 0x66, 0x4e, - 0x27, 0x56, 0x4f, 0x8a, 0x50, 0xa3, 0xd3, 0x90, 0x55, 0x98, 0xe6, 0x5e, 0xde, 0x2d, 0x11, 0x0a, - 0x7c, 0xe1, 0x0c, 0xae, 0x5a, 0xe4, 0xc2, 0x9d, 0xc3, 0x5b, 0x98, 0x21, 0xc6, 0xd6, 0xb8, 0xc4, - 0x88, 0x8c, 0x3f, 0xc8, 0xc0, 0x99, 0x3e, 0x23, 0x1e, 0x06, 0x8a, 0xce, 0x0c, 0x0e, 0x14, 0xcd, - 0x76, 0x0e, 0x5d, 0xd3, 0x82, 0xed, 0x4f, 0x3a, 0x6f, 0x85, 0xf2, 0x96, 0x0b, 0x44, 0x24, 0x61, - 0x12, 0x55, 0xdf, 0x76, 0x51, 0xa1, 0x9b, 0x4b, 0x1e, 0x42, 0x02, 0x8f, 0x7f, 0x14, 0x0f, 0xaf, - 0x29, 0x72, 0x3c, 0x85, 0xc3, 0xfa, 0x91, 0xab, 0xad, 0xe0, 0x14, 0xd6, 0xc6, 0x61, 0x06, 0x26, - 0x95, 0x75, 0x48, 0xce, 0x2b, 0xae, 0xc1, 0x45, 0x9e, 0x25, 0x4c, 0xe1, 0x90, 0xe5, 0x27, 0x11, - 0x2e, 0xaa, 0xec, 0xf1, 0x6a, 0x6b, 0x8c, 0x44, 0xa6, 0x04, 0xd3, 0x8e, 0x05, 0x21, 0xc3, 0x72, - 0xf2, 0x21, 0xc0, 0xba, 0xed, 0x07, 0xe5, 0x46, 0xe0, 0x3c, 0xa4, 0x43, 0x1c, 0x3a, 0x32, 0xbc, - 0xe0, 0x29, 0xcc, 0x4b, 0x61, 0x23, 0x59, 0xec, 0x8c, 0x50, 0x18, 0x1a, 0x7f, 0x29, 0x03, 0xb0, - 0x55, 0x5d, 0xc1, 0x68, 0xf8, 0x9f, 0x54, 0x28, 0x48, 0x8f, 0x30, 0x2c, 0xb9, 0x0f, 0x10, 0x07, - 0xfe, 0xc7, 0x0c, 0x4c, 0xeb, 0x68, 0xe4, 0x5d, 0x98, 0xa9, 0x37, 0x3c, 0xb7, 0xd5, 0xda, 0xb6, - 0x1b, 0xfb, 0xeb, 0x4e, 0x87, 0xf2, 0xa8, 0xab, 0xa3, 0xfc, 0x2c, 0xf2, 0xc3, 0x22, 0xab, 0xc5, - 0xca, 0xcc, 0x38, 0x32, 0xf9, 0xe1, 0x0c, 0x4c, 0xd5, 0xf7, 0xdc, 0x47, 0x61, 0x10, 0x53, 0x31, - 0x20, 0x1f, 0xb2, 0xb5, 0xed, 0xef, 0xb9, 0x8f, 0xa2, 0x14, 0xa3, 0x9a, 0x85, 0xe9, 0x3b, 0xc3, - 0x3d, 0xfe, 0x37, 0x5c, 0xbc, 0x8f, 0x04, 0xfe, 0x15, 0xad, 0x12, 0x53, 0xaf, 0xd3, 0xf8, 0x93, - 0x0c, 0x4c, 0xe2, 0xcd, 0xa5, 0xd5, 0x42, 0x99, 0xeb, 0x7b, 0x29, 0x5f, 0x65, 0xd8, 0xae, 0x01, - 0x03, 0xfb, 0x06, 0xcc, 0xc4, 0xd0, 0x88, 0x01, 0x63, 0x75, 0xf4, 0xfa, 0x57, 0x95, 0x1e, 0x3c, - 0x0e, 0x80, 0x29, 0x4a, 0x8c, 0x55, 0x85, 0xec, 0xfe, 0x35, 0x7c, 0x0c, 0x5e, 0x02, 0x70, 0x24, - 0x48, 0xde, 0x6c, 0x48, 0xfc, 0x4b, 0xee, 0x5f, 0x33, 0x15, 0x2c, 0x63, 0x03, 0xc6, 0xea, 0xae, - 0x17, 0x2c, 0x1f, 0xf0, 0xcb, 0x44, 0x85, 0xfa, 0x0d, 0xf5, 0xb5, 0xd7, 0xc1, 0xb7, 0x98, 0x86, - 0x29, 0x8a, 0x48, 0x09, 0x46, 0x6f, 0x3a, 0xb4, 0xd5, 0x54, 0xad, 0x80, 0x77, 0x18, 0xc0, 0xe4, - 0x70, 0x76, 0xe1, 0x3a, 0x1d, 0x25, 0x8d, 0x89, 0xcc, 0x8d, 0x3f, 0xe9, 0xba, 0x59, 0xd1, 0xfa, - 0xf7, 0x85, 0x30, 0x51, 0x43, 0xb2, 0xa6, 0x01, 0x5d, 0xfd, 0x0f, 0x33, 0xb0, 0xd8, 0x9f, 0x44, - 0xb5, 0x60, 0xce, 0x0c, 0xb0, 0x60, 0x7e, 0x39, 0xfe, 0x3a, 0x89, 0x68, 0xe2, 0x75, 0x32, 0x7a, - 0x93, 0xac, 0xa0, 0x01, 0x79, 0x83, 0xca, 0x4c, 0x31, 0xe7, 0x07, 0x7c, 0x33, 0x22, 0xf2, 0x61, - 0x0e, 0x90, 0xc6, 0x14, 0xb4, 0xc6, 0x6f, 0x8c, 0xc0, 0xd9, 0xbe, 0x14, 0x64, 0x4d, 0xc9, 0x3f, - 0x35, 0x1d, 0x66, 0xbe, 0xe9, 0x8b, 0x7f, 0x05, 0xff, 0x45, 0x1b, 0xc1, 0xb8, 0x57, 0xda, 0xbd, - 0x30, 0xef, 0x50, 0x16, 0x79, 0xbd, 0x76, 0x2c, 0x2f, 0x8e, 0x8e, 0xcc, 0x20, 0x99, 0x82, 0x08, - 0xfd, 0x17, 0x69, 0x60, 0x3b, 0x2d, 0x5f, 0x5d, 0x76, 0x4d, 0x0e, 0x32, 0x65, 0x59, 0x64, 0x56, - 0x3e, 0x92, 0x6e, 0x56, 0x6e, 0xfc, 0xbb, 0x0c, 0x4c, 0x84, 0x9f, 0x4d, 0x16, 0xe1, 0xf4, 0xa6, - 0x59, 0x5e, 0x59, 0xb5, 0x36, 0x3f, 0xa8, 0xad, 0x5a, 0x5b, 0x1b, 0xf5, 0xda, 0xea, 0x4a, 0xf5, - 0x66, 0x75, 0xb5, 0x52, 0x7c, 0x86, 0xcc, 0xc2, 0xd4, 0xd6, 0xc6, 0x9d, 0x8d, 0x7b, 0x0f, 0x36, - 0xac, 0x55, 0xd3, 0xbc, 0x67, 0x16, 0x33, 0x64, 0x0a, 0x26, 0xcc, 0xe5, 0xf2, 0x8a, 0xb5, 0x71, - 0xaf, 0xb2, 0x5a, 0xcc, 0x92, 0x22, 0x14, 0x56, 0xee, 0x6d, 0x6c, 0xac, 0xae, 0x6c, 0x56, 0xef, - 0x57, 0x37, 0x3f, 0x28, 0xe6, 0x08, 0x81, 0x69, 0x44, 0xa8, 0x99, 0xd5, 0x8d, 0x95, 0x6a, 0xad, - 0xbc, 0x5e, 0x1c, 0x61, 0x30, 0x86, 0xaf, 0xc0, 0x46, 0x43, 0x46, 0x77, 0xb6, 0x96, 0x57, 0x8b, - 0x63, 0x0c, 0x85, 0xfd, 0xa5, 0xa0, 0x8c, 0xb3, 0xea, 0x11, 0xa5, 0x52, 0xde, 0x2c, 0x2f, 0x97, - 0xeb, 0xab, 0xff, 0x1f, 0x7b, 0xdf, 0x16, 0x23, 0xc9, 0x91, 0x1c, 0xb6, 0xd5, 0xdd, 0x33, 0xd3, - 0x13, 0xf3, 0xaa, 0xc9, 0x9d, 0xdd, 0x9d, 0x7d, 0xef, 0x16, 0xc9, 0x15, 0x39, 0x3c, 0xf2, 0xb8, - 0x4b, 0xf3, 0xc8, 0x3d, 0xf1, 0xa1, 0x9a, 0xee, 0x9a, 0x99, 0xde, 0xed, 0x17, 0xab, 0x7a, 0x76, - 0xb5, 0x47, 0x49, 0xa5, 0xda, 0xee, 0x9a, 0x99, 0xe2, 0xf6, 0x74, 0x35, 0xab, 0xaa, 0xb9, 0x9c, - 0x83, 0x01, 0x9f, 0x20, 0xf8, 0x04, 0x58, 0x96, 0x75, 0x96, 0xcf, 0x30, 0x21, 0xd8, 0x90, 0x01, - 0x1f, 0x0c, 0x7d, 0x08, 0xf0, 0xaf, 0xe1, 0xfb, 0x3a, 0xf8, 0x47, 0xc0, 0x41, 0x86, 0x0d, 0xff, - 0x9d, 0x0c, 0x42, 0x3a, 0xc3, 0x86, 0x21, 0xf8, 0x4f, 0xb0, 0x3f, 0x04, 0x08, 0x30, 0x32, 0x32, - 0xb3, 0x2a, 0xeb, 0xd1, 0xbd, 0xb3, 0x47, 0x9e, 0x6d, 0x01, 0xfa, 0x9a, 0xe9, 0xc8, 0x88, 0xa8, - 0x7c, 0x67, 0x64, 0x44, 0x64, 0x84, 0x5a, 0x25, 0x17, 0xe0, 0x6c, 0x0a, 0x64, 0x37, 0x3b, 0xbb, - 0x8d, 0xb6, 0xba, 0x48, 0x36, 0x40, 0x8d, 0x61, 0xf5, 0x6d, 0x7b, 0xdf, 0x32, 0x4c, 0x15, 0xb2, - 0xd0, 0xb6, 0xde, 0x32, 0xd4, 0x25, 0xed, 0x3d, 0xf6, 0x5e, 0x90, 0x75, 0x35, 0x39, 0x0f, 0xc4, - 0xea, 0xe9, 0xbd, 0x7d, 0x2b, 0xd3, 0xf8, 0x25, 0x58, 0xb0, 0xf6, 0x6b, 0x35, 0xc3, 0xb2, 0x54, - 0x85, 0x00, 0xcc, 0xef, 0xe8, 0x8d, 0xa6, 0x51, 0x57, 0x4b, 0xda, 0xf7, 0x14, 0x58, 0x17, 0x12, - 0xa0, 0x30, 0x44, 0x7d, 0xc9, 0xb5, 0xf8, 0x7e, 0xea, 0x62, 0x2b, 0x1e, 0x7f, 0x65, 0x3e, 0x32, - 0x63, 0x19, 0xfe, 0x73, 0x05, 0xce, 0x15, 0x62, 0x93, 0x47, 0xa0, 0x8a, 0x1a, 0xb4, 0x9c, 0xa8, - 0x7f, 0x94, 0xec, 0x63, 0xd7, 0x32, 0x5f, 0xc9, 0xa0, 0x31, 0x55, 0x69, 0x92, 0x11, 0x3b, 0xc7, - 0xe6, 0xf4, 0xf9, 0x1a, 0xb4, 0xcf, 0x15, 0xb8, 0x30, 0xe5, 0x33, 0xa4, 0x06, 0xf3, 0x71, 0xe6, - 0x9e, 0x19, 0x6e, 0x72, 0x1b, 0x3f, 0xf9, 0xe2, 0x3a, 0x47, 0xc4, 0x14, 0xc2, 0xf8, 0x9f, 0x39, - 0x1f, 0xa7, 0xe2, 0xc1, 0x7c, 0x38, 0xac, 0xfb, 0x2e, 0x66, 0x7a, 0x9e, 0x7f, 0x49, 0x7f, 0x68, - 0x6d, 0x2f, 0xf1, 0xbe, 0x2b, 0x3b, 0x4f, 0x43, 0x4c, 0x88, 0xa3, 0x7d, 0x5f, 0xa1, 0xc2, 0x5d, - 0x16, 0x91, 0xca, 0xbc, 0x7a, 0x18, 0x4e, 0x8e, 0x5d, 0xd3, 0x1f, 0xba, 0xba, 0xd9, 0xe6, 0xc7, - 0x06, 0x4a, 0xab, 0x0e, 0x16, 0xe0, 0xb5, 0xc2, 0x76, 0x82, 0xd4, 0x73, 0xff, 0x14, 0x0d, 0xb9, - 0x0b, 0x60, 0x7c, 0x16, 0xb9, 0xc1, 0xc8, 0x19, 0xc6, 0x81, 0x5b, 0x58, 0x44, 0x2b, 0x0e, 0x4d, - 0xcb, 0xdb, 0x12, 0xb2, 0xf6, 0x5d, 0x05, 0x96, 0xf9, 0xa5, 0x49, 0x1f, 0xba, 0x41, 0xf4, 0xe5, - 0xa6, 0xd7, 0xdd, 0xd4, 0xf4, 0x8a, 0x5f, 0x85, 0x48, 0xfc, 0x69, 0x71, 0xe1, 0xcc, 0xfa, 0x0f, - 0x0a, 0xa8, 0x59, 0x44, 0xf2, 0x3e, 0x54, 0x2d, 0xf7, 0x53, 0x37, 0xf0, 0xa2, 0x13, 0xbe, 0x51, - 0x8a, 0x1c, 0x87, 0x0c, 0x87, 0x97, 0xb1, 0xf9, 0x10, 0xf2, 0x5f, 0x66, 0x4c, 0x73, 0xda, 0xfd, - 0x5e, 0x52, 0x7b, 0x94, 0xbf, 0x2a, 0xb5, 0x87, 0xf6, 0x67, 0x25, 0xb8, 0xb0, 0xeb, 0x46, 0x72, - 0x9b, 0x62, 0xf7, 0x85, 0x37, 0x4e, 0xd7, 0x2e, 0xa9, 0x25, 0x9b, 0xb0, 0x80, 0x45, 0x62, 0x7c, - 0x4d, 0xf1, 0x93, 0x6c, 0xc7, 0xf3, 0xba, 0x9c, 0x4a, 0xa2, 0x36, 0xe5, 0xdb, 0xaf, 0x4b, 0x69, - 0x95, 0xe2, 0x69, 0x7d, 0x0b, 0x56, 0x31, 0xa2, 0xff, 0x84, 0x2e, 0x07, 0x77, 0xc0, 0xd5, 0x3f, - 0x55, 0x33, 0x03, 0x25, 0x5b, 0xa0, 0x52, 0x88, 0xde, 0x7f, 0x32, 0xf2, 0x9f, 0x0e, 0xdd, 0xc1, - 0xa1, 0x3b, 0xc0, 0x63, 0xbd, 0x6a, 0xe6, 0xe0, 0x82, 0xe7, 0xfe, 0x88, 0x5d, 0xdd, 0xdc, 0x01, - 0xea, 0x68, 0x38, 0xcf, 0x04, 0x7a, 0xe9, 0x2e, 0x2c, 0xfd, 0x8c, 0x29, 0xd2, 0xb4, 0x3f, 0x55, - 0x60, 0x03, 0x1b, 0x27, 0x7d, 0x58, 0xa4, 0xaf, 0x15, 0xbd, 0x25, 0x65, 0x0d, 0x72, 0x28, 0x28, - 0xbd, 0x14, 0xe2, 0x5e, 0x4c, 0x74, 0x42, 0xa5, 0x53, 0xe8, 0x84, 0xac, 0xe7, 0x49, 0xd5, 0x7f, - 0x4a, 0x95, 0xd6, 0xbd, 0x4a, 0xb5, 0xac, 0x56, 0x92, 0x21, 0xd7, 0x7e, 0xb3, 0x04, 0x0b, 0xa6, - 0x8b, 0x39, 0xcc, 0xc9, 0x2d, 0x58, 0x68, 0xfb, 0x91, 0x1b, 0xb6, 0x52, 0x09, 0xeb, 0x47, 0x14, - 0x64, 0x1f, 0x0f, 0x4c, 0x51, 0x48, 0x27, 0x7c, 0x37, 0xf0, 0x07, 0x93, 0x7e, 0x24, 0x4f, 0xf8, - 0x31, 0x03, 0x99, 0xa2, 0x8c, 0x7c, 0x0d, 0x16, 0x39, 0xe7, 0xd8, 0x50, 0x8c, 0x1e, 0xcf, 0x81, - 0x1b, 0xe7, 0xc0, 0x4f, 0x10, 0x50, 0xa6, 0x65, 0x02, 0x46, 0x45, 0x92, 0x69, 0x73, 0x32, 0x83, - 0x10, 0xd5, 0xe7, 0x66, 0x88, 0xea, 0x6f, 0xc0, 0xbc, 0x1e, 0x86, 0x6e, 0x24, 0xa2, 0x1d, 0x2c, - 0xc7, 0xe1, 0xe2, 0x42, 0x37, 0x62, 0x8c, 0x1d, 0x2c, 0x37, 0x39, 0x9e, 0xf6, 0x97, 0x25, 0x98, - 0xc3, 0x7f, 0xd1, 0x0c, 0x1b, 0xf4, 0x8f, 0x52, 0x66, 0xd8, 0xa0, 0x7f, 0x64, 0x22, 0x94, 0xdc, - 0x46, 0x4d, 0x85, 0x48, 0x70, 0xc5, 0x5b, 0x8f, 0x2a, 0xf8, 0x41, 0x02, 0x36, 0x65, 0x9c, 0xd8, - 0x6b, 0xa0, 0x5c, 0x18, 0xe3, 0xe4, 0x3c, 0x94, 0x3a, 0x16, 0x6f, 0x31, 0x86, 0xc9, 0xf2, 0x43, - 0xb3, 0xd4, 0xb1, 0xb0, 0x37, 0xf6, 0xf4, 0x3b, 0x6f, 0x7d, 0x83, 0x37, 0x94, 0xf5, 0xc6, 0x91, - 0x73, 0xe7, 0xad, 0x6f, 0x98, 0xbc, 0x84, 0xf6, 0x2f, 0xd6, 0x19, 0x8d, 0xb9, 0xec, 0x2d, 0x3f, - 0xf6, 0x2f, 0xb6, 0x0d, 0x0d, 0xb7, 0x66, 0x82, 0x40, 0xee, 0xc0, 0x12, 0x8f, 0x09, 0x81, 0xf8, - 0x52, 0xcc, 0x06, 0x1e, 0x33, 0x82, 0x51, 0xc8, 0x48, 0xcc, 0xac, 0xc7, 0x07, 0x48, 0xa4, 0xe1, - 0xe5, 0x66, 0x3d, 0x31, 0x84, 0xa1, 0x29, 0xa1, 0xd0, 0x2a, 0x31, 0xbb, 0x60, 0xf2, 0x46, 0x1f, - 0xab, 0xc4, 0x8d, 0x87, 0x98, 0x3d, 0x21, 0x46, 0xd0, 0xfe, 0xb0, 0x04, 0xd5, 0xee, 0x70, 0x72, - 0xe8, 0x8d, 0x1e, 0xdc, 0x26, 0x04, 0xf0, 0x1a, 0x27, 0xd2, 0x6b, 0xd0, 0xff, 0xc9, 0x45, 0xa8, - 0x8a, 0x9b, 0x9b, 0xd8, 0x90, 0x42, 0x7e, 0x6b, 0xdb, 0x04, 0x31, 0xee, 0x3c, 0x1e, 0x9a, 0xf8, - 0x49, 0x6e, 0x43, 0x7c, 0xff, 0x9a, 0x76, 0x51, 0xab, 0xd0, 0xc5, 0x62, 0xc6, 0x68, 0xe4, 0x35, - 0xc0, 0x43, 0x82, 0x5f, 0x1e, 0x84, 0x42, 0x9b, 0x55, 0x8d, 0xcb, 0x29, 0x8c, 0x04, 0xd1, 0xc8, - 0x9b, 0xc0, 0x27, 0x26, 0x4f, 0xf7, 0x7e, 0x2e, 0x4d, 0xc0, 0x12, 0x68, 0x0a, 0x12, 0x8e, 0x4a, - 0xde, 0x85, 0xa5, 0x7e, 0xe0, 0xa2, 0x25, 0xd3, 0x19, 0x26, 0x59, 0xdc, 0x65, 0xca, 0x5a, 0x52, - 0xfe, 0xe0, 0xb6, 0x29, 0xa3, 0x6b, 0xdf, 0x5f, 0x84, 0x65, 0xb9, 0x3e, 0xc4, 0x84, 0xb3, 0xe1, - 0x90, 0xde, 0xdd, 0xb9, 0x33, 0xdb, 0x18, 0x0b, 0xf9, 0x71, 0x7a, 0x23, 0x5d, 0x21, 0x8a, 0xc7, - 0x3c, 0xdb, 0x44, 0x30, 0x8b, 0xbd, 0x33, 0xe6, 0x7a, 0x98, 0x80, 0x19, 0x1e, 0xd1, 0xa1, 0xea, - 0x8f, 0xc3, 0x43, 0x77, 0xe4, 0x09, 0x7b, 0xcb, 0x0b, 0x29, 0x46, 0x1d, 0x5e, 0x98, 0xe3, 0x15, - 0x93, 0x91, 0xb7, 0x60, 0xde, 0x1f, 0xbb, 0x23, 0xc7, 0xe3, 0x67, 0xdc, 0xe5, 0x0c, 0x03, 0x77, - 0xa4, 0x37, 0x24, 0x42, 0x8e, 0x4c, 0xbe, 0x0e, 0x15, 0xff, 0x49, 0x3c, 0x5e, 0x17, 0xd3, 0x44, - 0x4f, 0x22, 0x47, 0x22, 0x41, 0x44, 0x4a, 0xf0, 0xb1, 0x73, 0x7c, 0xc0, 0x47, 0x2c, 0x4d, 0x70, - 0xcf, 0x39, 0x3e, 0x90, 0x09, 0x28, 0x22, 0xf9, 0x00, 0x60, 0xec, 0x1c, 0xba, 0x81, 0x3d, 0x98, - 0x44, 0x27, 0x7c, 0xdc, 0xae, 0xa5, 0xc8, 0xba, 0xb4, 0xb8, 0x3e, 0x89, 0x4e, 0x24, 0xda, 0xc5, - 0xb1, 0x00, 0x12, 0x1d, 0xe0, 0xd8, 0x89, 0x22, 0x37, 0x38, 0xf6, 0xb9, 0x37, 0x61, 0x12, 0xfc, - 0x90, 0x31, 0x68, 0xc5, 0xc5, 0x12, 0x07, 0x89, 0x08, 0x2b, 0xed, 0x05, 0x0e, 0x4f, 0xba, 0x9f, - 0xa9, 0xb4, 0x17, 0xa4, 0x5a, 0x49, 0x11, 0xc9, 0x3b, 0xb0, 0x30, 0xf0, 0xc2, 0xbe, 0x1f, 0x0c, - 0x78, 0x94, 0x93, 0x2b, 0x29, 0x9a, 0x3a, 0x2b, 0x93, 0xc8, 0x04, 0x3a, 0xad, 0x2d, 0x0f, 0x7e, - 0xda, 0xf6, 0x9f, 0xa2, 0x9a, 0x3f, 0x5b, 0x5b, 0x2b, 0x2e, 0x96, 0x6b, 0x9b, 0x10, 0xd1, 0xa1, - 0x3c, 0xf4, 0xa2, 0xa1, 0xf3, 0x98, 0xdb, 0xce, 0xd3, 0x43, 0xb9, 0x8b, 0x45, 0xf2, 0x50, 0x32, - 0x64, 0x72, 0x17, 0xaa, 0xee, 0x28, 0x0a, 0x1c, 0xdb, 0x1b, 0xf0, 0xa7, 0x98, 0xe9, 0x4a, 0xd3, - 0x03, 0xd8, 0x69, 0xd4, 0xe5, 0x4a, 0x23, 0x7e, 0x63, 0x40, 0xfb, 0x27, 0xec, 0x7b, 0xc7, 0xfc, - 0x05, 0x65, 0xba, 0x7f, 0xac, 0x5a, 0xa3, 0x25, 0xf7, 0x0f, 0x45, 0x24, 0xef, 0xc3, 0x02, 0x5d, - 0xbf, 0x03, 0xff, 0x90, 0x07, 0x9a, 0xd0, 0xd2, 0xfd, 0xc3, 0xca, 0x72, 0xd3, 0x55, 0x10, 0xd1, - 0x85, 0xec, 0x3c, 0x0d, 0x6d, 0xaf, 0x8f, 0x31, 0x31, 0xb3, 0xcb, 0x51, 0x7f, 0x68, 0x35, 0x6a, - 0x12, 0xd9, 0x9c, 0xf3, 0x34, 0x6c, 0xf4, 0xc9, 0x1d, 0x98, 0xc3, 0xcc, 0x13, 0x3c, 0x00, 0x66, - 0x9a, 0x06, 0x73, 0x4e, 0xc8, 0x34, 0x88, 0x4a, 0x07, 0xf2, 0x38, 0xc4, 0x47, 0x29, 0x3c, 0xff, - 0x43, 0xba, 0x4f, 0x5a, 0x16, 0xbe, 0x54, 0x91, 0xab, 0xc8, 0xd1, 0x69, 0x15, 0x47, 0x6e, 0x64, - 0x7b, 0x9f, 0xf0, 0x0c, 0x0e, 0xe9, 0xcf, 0xb5, 0xdd, 0xa8, 0xf1, 0xa1, 0xfc, 0xb9, 0x91, 0x1b, - 0x35, 0x3e, 0xe1, 0x43, 0x77, 0x34, 0x79, 0x8c, 0xba, 0xf4, 0x82, 0xa1, 0x3b, 0x9a, 0x64, 0x87, - 0xee, 0x68, 0xf2, 0x98, 0x5c, 0x03, 0x48, 0xbc, 0x10, 0x98, 0x7d, 0xc7, 0x94, 0x20, 0xdf, 0xac, - 0xfc, 0x8f, 0x7f, 0x79, 0x5d, 0xd9, 0x06, 0xa8, 0x8a, 0xa8, 0x39, 0x54, 0x9e, 0xde, 0x28, 0x62, - 0x4a, 0x6e, 0xc2, 0xb2, 0x1c, 0xd3, 0x87, 0xef, 0xea, 0x4b, 0xce, 0xd8, 0x13, 0x51, 0x7d, 0x66, - 0x27, 0x42, 0x78, 0x15, 0xd6, 0x53, 0x4f, 0x80, 0x12, 0x87, 0x40, 0x53, 0x95, 0x0b, 0xf0, 0x10, - 0xad, 0x01, 0x84, 0x91, 0x13, 0x44, 0xf6, 0xc0, 0x89, 0x4e, 0xa3, 0xde, 0xad, 0xd2, 0x8d, 0x99, - 0x79, 0x5c, 0x23, 0x5d, 0xdd, 0x89, 0x5c, 0xd6, 0x38, 0xad, 0x09, 0x17, 0xa7, 0x6e, 0x9a, 0xe4, - 0x15, 0x50, 0x0f, 0x1c, 0xae, 0x32, 0xed, 0x1f, 0x39, 0xa3, 0x91, 0x3b, 0xe4, 0x0d, 0x5b, 0x13, - 0xf0, 0x1a, 0x03, 0x73, 0x6e, 0x1f, 0x48, 0xbd, 0x23, 0xad, 0x96, 0x53, 0xf4, 0x0e, 0x67, 0xf0, - 0x43, 0x05, 0xae, 0xcc, 0xda, 0x7b, 0xc9, 0x25, 0xa8, 0x8e, 0x03, 0xcf, 0x47, 0x19, 0x9f, 0xf7, - 0xa1, 0xf8, 0x8d, 0x79, 0x22, 0x50, 0x18, 0x8d, 0x9c, 0x43, 0xfe, 0xa6, 0xc6, 0x5c, 0x44, 0x48, - 0xcf, 0x39, 0x0c, 0x69, 0x17, 0x0f, 0xdc, 0x03, 0x67, 0x32, 0x8c, 0xec, 0xb0, 0x7f, 0xe4, 0x0e, - 0xf0, 0xd5, 0x1b, 0x7a, 0x52, 0x9a, 0x2a, 0x2f, 0xb0, 0x04, 0x3c, 0x57, 0xe3, 0xb9, 0x29, 0x35, - 0xbe, 0x57, 0xa9, 0x2a, 0x6a, 0xc9, 0x44, 0xd7, 0x35, 0xed, 0x3b, 0x25, 0xd8, 0x9c, 0xb6, 0xd9, - 0x90, 0xf7, 0x8a, 0xfa, 0x80, 0x59, 0x7d, 0x64, 0xb8, 0x6c, 0xf5, 0x91, 0x67, 0xcf, 0x1d, 0x88, - 0xdf, 0xac, 0x3d, 0x2b, 0xfe, 0x84, 0x80, 0x51, 0x9a, 0xb1, 0x13, 0x86, 0x4f, 0xe9, 0x7e, 0x5a, - 0x96, 0xa2, 0x10, 0x73, 0x98, 0x4c, 0x23, 0x60, 0xe4, 0x6d, 0x80, 0xfe, 0xd0, 0x0f, 0x5d, 0x74, - 0xae, 0xe0, 0x82, 0x1a, 0xf3, 0xc4, 0x8f, 0xa1, 0xb2, 0x35, 0x1d, 0xa1, 0x35, 0x7f, 0x20, 0xe6, - 0x93, 0x03, 0x17, 0xa6, 0x9c, 0x2e, 0x74, 0x78, 0xf0, 0x11, 0x1a, 0xdb, 0x4c, 0x78, 0xfe, 0x2f, - 0x0a, 0x61, 0x79, 0x6b, 0xb2, 0x3d, 0x5e, 0x9a, 0x36, 0x47, 0x4e, 0x80, 0xe4, 0x8f, 0x10, 0xca, - 0x9d, 0x7b, 0x9e, 0x4f, 0x82, 0x98, 0x3b, 0x83, 0xec, 0x07, 0x43, 0x72, 0x1d, 0x96, 0x44, 0xa6, - 0x52, 0x7a, 0x11, 0x62, 0xcc, 0x81, 0x83, 0xee, 0xbb, 0x38, 0x79, 0x30, 0x06, 0x2c, 0xbe, 0x4c, - 0xe4, 0x2b, 0x6f, 0x11, 0x21, 0xbd, 0x93, 0xb1, 0x68, 0xdd, 0x15, 0x31, 0xbf, 0xd3, 0x07, 0x3b, - 0x2f, 0xfd, 0xa7, 0x8a, 0x18, 0xfe, 0xfc, 0xc9, 0xf8, 0xac, 0xfa, 0x11, 0xc0, 0x87, 0x61, 0xbc, - 0x62, 0xf8, 0x3f, 0x15, 0xf9, 0xc4, 0xaa, 0xe3, 0x22, 0x1f, 0xff, 0x49, 0x6e, 0xc1, 0x5a, 0xc0, - 0x1c, 0x8b, 0x23, 0x9f, 0xf7, 0x27, 0x4b, 0x8b, 0xb2, 0xc2, 0xc0, 0x3d, 0x1f, 0xfb, 0x94, 0xd7, - 0xeb, 0x5e, 0xdc, 0x61, 0x92, 0xa0, 0x40, 0x5e, 0x87, 0x45, 0x2a, 0x28, 0x60, 0xf8, 0xa1, 0xcc, - 0x8b, 0x14, 0xc4, 0x43, 0xb1, 0xcb, 0xac, 0x7e, 0xcc, 0xff, 0xe7, 0xbc, 0xfe, 0x6d, 0x49, 0x30, - 0x93, 0xc5, 0x14, 0x72, 0x01, 0x16, 0xfc, 0xe0, 0x50, 0x6a, 0xda, 0xbc, 0x1f, 0x1c, 0xd2, 0x76, - 0xbd, 0x0c, 0x2a, 0x7b, 0x20, 0xc5, 0x02, 0x55, 0x84, 0x27, 0x23, 0xa6, 0xc7, 0xa8, 0x9a, 0xab, - 0x0c, 0xbe, 0x1f, 0xba, 0x81, 0x75, 0x32, 0xea, 0x53, 0xcc, 0x30, 0xf4, 0x6d, 0x39, 0x8a, 0x18, - 0x6f, 0xf6, 0x6a, 0x18, 0xfa, 0x49, 0x38, 0xb1, 0x01, 0xd9, 0x86, 0x15, 0xca, 0x27, 0x8e, 0x65, - 0xc6, 0x77, 0xc0, 0xab, 0x79, 0x29, 0xea, 0x64, 0xd4, 0x17, 0x55, 0x34, 0x97, 0x43, 0xe9, 0x17, - 0xb9, 0x0f, 0xaa, 0x24, 0x6e, 0xe2, 0x8b, 0xd9, 0x8c, 0x93, 0x7b, 0xc2, 0x46, 0x12, 0x53, 0x1b, - 0xa3, 0x03, 0xdf, 0x5c, 0xeb, 0xa7, 0x01, 0xf1, 0x4e, 0x30, 0xaf, 0x2e, 0x98, 0x9b, 0xbc, 0xb9, - 0x21, 0x7a, 0x4f, 0xda, 0x43, 0xff, 0xd0, 0x76, 0x3f, 0xa3, 0x63, 0xa2, 0xfd, 0x81, 0x22, 0xf6, - 0xda, 0x02, 0xa6, 0x44, 0x83, 0x95, 0x23, 0x27, 0xb4, 0xc3, 0xf0, 0x98, 0x39, 0xf5, 0xf1, 0x50, - 0xca, 0x4b, 0x47, 0x4e, 0x68, 0x85, 0xc7, 0x22, 0x6f, 0xcb, 0x39, 0x8a, 0xe3, 0x3b, 0x93, 0xe8, - 0xc8, 0x96, 0x85, 0x6b, 0xd6, 0xa3, 0x67, 0x8f, 0x9c, 0xb0, 0x43, 0xcb, 0x24, 0xde, 0xe4, 0x45, - 0x58, 0x45, 0xbe, 0x7d, 0x4f, 0x30, 0xc6, 0x60, 0x24, 0xe6, 0x32, 0x65, 0xdc, 0xf7, 0x18, 0x67, - 0x3e, 0xb8, 0x3f, 0xae, 0xc0, 0xf9, 0xe2, 0xde, 0xc3, 0xe9, 0x4b, 0xfb, 0x1c, 0x9f, 0x4d, 0xf2, - 0xba, 0x2d, 0x52, 0x08, 0x0b, 0x24, 0x53, 0x34, 0x78, 0xa5, 0xc2, 0xc1, 0xdb, 0x82, 0x75, 0x64, - 0xc4, 0xc5, 0xf8, 0xa1, 0x17, 0x46, 0x3c, 0x3e, 0x8a, 0xb9, 0x46, 0x0b, 0xd8, 0x7e, 0xdf, 0xa4, - 0x60, 0xf2, 0x12, 0xac, 0x8a, 0x1d, 0xdb, 0x7f, 0x3a, 0xa2, 0x1f, 0x66, 0xdb, 0xf5, 0x0a, 0x87, - 0x76, 0x10, 0x48, 0xce, 0xc1, 0xbc, 0x33, 0x1e, 0xd3, 0x4f, 0xb2, 0x5d, 0x7a, 0xce, 0x19, 0x8f, - 0x59, 0x6e, 0x21, 0x7c, 0x24, 0x6a, 0x1f, 0xa0, 0x0b, 0x16, 0xf7, 0x21, 0x35, 0x97, 0x11, 0xc8, - 0xdc, 0xb2, 0x42, 0xba, 0x2f, 0x50, 0x5a, 0x81, 0xb2, 0x80, 0x28, 0xe0, 0x8c, 0x63, 0x84, 0x8b, - 0x50, 0x15, 0xce, 0x00, 0xec, 0x55, 0x8c, 0xb9, 0xe0, 0x70, 0x47, 0x80, 0xb7, 0xe0, 0xc2, 0xc0, - 0x0b, 0xf9, 0x68, 0xd3, 0x26, 0x8d, 0xc7, 0xfc, 0x59, 0x2a, 0x0b, 0x63, 0x6c, 0x6e, 0xf0, 0x62, - 0xda, 0x93, 0xfa, 0x78, 0x1c, 0x3f, 0x4e, 0xbd, 0x24, 0xc8, 0x1e, 0x7b, 0x2c, 0x5e, 0x1b, 0x73, - 0x88, 0xc5, 0xc5, 0x01, 0x48, 0xb9, 0xc9, 0x31, 0xb6, 0x65, 0x04, 0xb1, 0x4c, 0xe2, 0x95, 0x64, - 0x33, 0xe5, 0x21, 0x97, 0x5c, 0xd0, 0x64, 0x8c, 0x83, 0x86, 0x50, 0xf2, 0x36, 0x4c, 0x9d, 0x8b, - 0x28, 0xe1, 0x56, 0xcd, 0x73, 0xac, 0x9c, 0x39, 0xfa, 0x36, 0xfd, 0x43, 0x03, 0x0b, 0xc9, 0x07, - 0x70, 0x45, 0x54, 0xd0, 0x09, 0x43, 0xef, 0x70, 0x64, 0x8b, 0x51, 0x40, 0x5f, 0x0c, 0x94, 0x72, - 0xab, 0xe6, 0x45, 0x8e, 0xa3, 0x23, 0x4a, 0x9d, 0x61, 0xe0, 0xb3, 0x46, 0x3e, 0x9b, 0xde, 0x81, - 0x35, 0x2e, 0xb0, 0x73, 0x21, 0x01, 0x7b, 0x9b, 0x6f, 0x61, 0xf4, 0x26, 0xcd, 0xf3, 0x55, 0x01, - 0x07, 0x35, 0x06, 0x82, 0xf2, 0xbf, 0x28, 0x70, 0xae, 0x50, 0xe2, 0x27, 0xbf, 0x0e, 0xec, 0x9d, - 0x61, 0xe4, 0xdb, 0x81, 0xdb, 0xf7, 0xc6, 0x1e, 0x06, 0x6e, 0x61, 0x1a, 0xf1, 0x3b, 0xb3, 0xee, - 0x0a, 0xf8, 0x66, 0xb1, 0xe7, 0x9b, 0x31, 0x11, 0x53, 0xd5, 0xa9, 0x41, 0x06, 0x7c, 0xe9, 0x23, - 0x38, 0x57, 0x88, 0x5a, 0xa0, 0x42, 0xfb, 0x5a, 0x3a, 0x59, 0xba, 0xb0, 0x71, 0x66, 0x1a, 0x2d, - 0xa9, 0xd6, 0x78, 0xf3, 0x7e, 0x14, 0x37, 0x2f, 0x73, 0x37, 0x20, 0x46, 0x76, 0x67, 0x2b, 0xba, - 0xde, 0x0a, 0xa2, 0xe9, 0x9b, 0xdb, 0x47, 0x70, 0x8e, 0x2f, 0xaf, 0xc3, 0xc0, 0x19, 0x1f, 0x25, - 0xec, 0x58, 0x45, 0x7f, 0xa1, 0x88, 0x1d, 0x5b, 0x77, 0xbb, 0x14, 0x3f, 0xe6, 0x7a, 0xd6, 0xc9, - 0x03, 0x79, 0x1b, 0x7e, 0xa3, 0x24, 0x36, 0xb3, 0x82, 0xea, 0x14, 0x2c, 0x5c, 0xa5, 0x68, 0xe1, - 0x9e, 0x7e, 0xd7, 0x68, 0x03, 0x91, 0xb7, 0x6b, 0x3e, 0xef, 0x99, 0x3f, 0x9e, 0xb8, 0xe6, 0xf1, - 0x8a, 0x48, 0x9b, 0x1f, 0x5b, 0x08, 0xe6, 0x7a, 0x3f, 0x0b, 0xa2, 0xb2, 0x78, 0x9c, 0x0f, 0x9e, - 0x1f, 0x9d, 0x55, 0x06, 0x68, 0x0c, 0xc8, 0x0d, 0x58, 0x66, 0x37, 0xba, 0xd4, 0xae, 0x02, 0x08, - 0xd3, 0xe9, 0xd6, 0x22, 0xfa, 0x40, 0x81, 0x1b, 0xcf, 0xea, 0x43, 0xf2, 0x10, 0xce, 0xa3, 0x57, - 0x50, 0xe8, 0xc7, 0xc3, 0x60, 0xf7, 0x9d, 0xfe, 0x91, 0xcb, 0x67, 0xad, 0x56, 0x38, 0x18, 0xe3, - 0xb1, 0x65, 0x75, 0xa4, 0x71, 0x18, 0x8f, 0xad, 0xd0, 0x17, 0xbf, 0x6b, 0x94, 0x9c, 0xd7, 0x61, - 0x00, 0x97, 0x67, 0x50, 0x4a, 0x5b, 0xa3, 0x22, 0x6f, 0x8d, 0x2f, 0x83, 0x7a, 0xe0, 0x0e, 0xe8, - 0x35, 0xc7, 0x1d, 0x60, 0xd5, 0x3e, 0xbd, 0x83, 0x1d, 0xbf, 0x6c, 0xae, 0xc6, 0x70, 0x2b, 0xf4, - 0x1f, 0xdc, 0xe1, 0x5f, 0x39, 0x16, 0x87, 0xbe, 0x7c, 0x2b, 0x25, 0xaf, 0xc3, 0xd9, 0x4c, 0x50, - 0x9c, 0x24, 0xca, 0x82, 0xb9, 0x4e, 0x8b, 0xd2, 0x21, 0xd4, 0x6e, 0xc2, 0xb2, 0xbc, 0x91, 0x08, - 0x09, 0x6f, 0x90, 0x6c, 0x1d, 0xfc, 0x73, 0x13, 0xd1, 0xa8, 0xc2, 0x0b, 0xed, 0x69, 0xee, 0x5a, - 0xaf, 0x01, 0x89, 0x6f, 0x2e, 0xf1, 0x46, 0xc1, 0x3f, 0xb8, 0x2e, 0x4a, 0xe2, 0x15, 0xce, 0x3f, - 0xfb, 0xdb, 0xf3, 0x70, 0xb6, 0xe0, 0x26, 0x4c, 0x5e, 0x03, 0xd5, 0x1b, 0x45, 0xee, 0x61, 0x20, - 0x5d, 0xcd, 0x98, 0xf4, 0x5e, 0xda, 0x54, 0xcc, 0x35, 0xa9, 0x8c, 0xab, 0x38, 0xe7, 0x59, 0x96, - 0x7f, 0xfe, 0x3d, 0xfe, 0x8b, 0x6e, 0x20, 0x4e, 0x20, 0xb4, 0x77, 0xf4, 0x5f, 0xd2, 0x80, 0x75, - 0xcc, 0x08, 0x12, 0x7a, 0x3e, 0x26, 0x16, 0x41, 0x51, 0xac, 0x92, 0xba, 0x2f, 0x63, 0x4d, 0xba, - 0x12, 0x12, 0x95, 0xc5, 0x4c, 0x75, 0x9c, 0x81, 0x90, 0x5f, 0x84, 0x4b, 0xd2, 0x89, 0x6a, 0x67, - 0x56, 0x1f, 0x3e, 0xc0, 0x30, 0x2f, 0x38, 0xf1, 0xd9, 0x5a, 0x4f, 0xad, 0xc3, 0x6d, 0x60, 0x59, - 0x84, 0xbd, 0xc1, 0xd8, 0xce, 0xa5, 0x90, 0xc1, 0xe6, 0xb2, 0x84, 0x08, 0x97, 0x28, 0x56, 0x63, - 0x30, 0xce, 0x64, 0x93, 0xc1, 0x56, 0x77, 0x0b, 0x57, 0xe8, 0x02, 0xae, 0xd0, 0xab, 0x72, 0x63, - 0x72, 0xeb, 0x13, 0x7b, 0xb1, 0x60, 0x8d, 0x1e, 0xc2, 0x7a, 0x72, 0xd2, 0x89, 0x03, 0xba, 0x9a, - 0xca, 0xfa, 0x8f, 0x0c, 0x85, 0x04, 0xc9, 0x4e, 0x6c, 0x16, 0x28, 0x22, 0x47, 0x28, 0x87, 0x43, - 0x99, 0xa4, 0x08, 0x42, 0xd2, 0x84, 0x0d, 0xe7, 0x69, 0x28, 0x72, 0x93, 0x86, 0xf1, 0xb7, 0x16, - 0xf3, 0xdf, 0x12, 0xf6, 0x3a, 0x46, 0x6a, 0x12, 0xe7, 0x69, 0xc8, 0x53, 0x96, 0x86, 0x82, 0xdb, - 0xc7, 0x40, 0x98, 0xd8, 0x91, 0xaa, 0x37, 0x3c, 0x8b, 0x17, 0x4f, 0x6c, 0x9a, 0xa3, 0x94, 0x83, - 0xba, 0x61, 0xa9, 0x5c, 0xf3, 0x5e, 0x5a, 0xc7, 0xba, 0x94, 0x32, 0x10, 0x66, 0x7b, 0x9b, 0x19, - 0x2f, 0x25, 0x7c, 0xf9, 0xaa, 0x29, 0x81, 0xf9, 0x6a, 0xf8, 0x5c, 0x01, 0x35, 0xcb, 0x82, 0xbc, - 0x0b, 0xf3, 0x4c, 0x98, 0xe0, 0x27, 0x93, 0x56, 0xfc, 0x2d, 0x36, 0x82, 0x4c, 0xae, 0xd8, 0x3b, - 0x63, 0x72, 0x1a, 0xf2, 0x0d, 0xa8, 0xf8, 0xde, 0x40, 0x18, 0x32, 0x6f, 0xcc, 0xa2, 0xed, 0x34, - 0xea, 0x35, 0x54, 0x7e, 0x7a, 0x03, 0x7e, 0xf5, 0xd8, 0xae, 0xc2, 0x3c, 0xeb, 0x30, 0xed, 0x63, - 0xb8, 0x3c, 0xe3, 0x83, 0xc4, 0x80, 0xb5, 0x8c, 0x91, 0xf7, 0x94, 0xf6, 0x5f, 0x27, 0xb1, 0xff, - 0x06, 0x42, 0x26, 0x1e, 0xc2, 0xc5, 0xa9, 0x15, 0x24, 0x8d, 0xa9, 0x3b, 0x03, 0x86, 0x1b, 0xc9, - 0x96, 0xc9, 0x93, 0x30, 0xb3, 0x6b, 0xf0, 0xaf, 0xfd, 0x4e, 0x09, 0xce, 0x16, 0x4c, 0x0e, 0xa2, - 0x41, 0x49, 0xec, 0xe1, 0x79, 0x17, 0xc2, 0xbd, 0x33, 0x66, 0xc9, 0x1b, 0x90, 0xbb, 0x00, 0x98, - 0xdb, 0x35, 0x70, 0x0f, 0xdd, 0xcf, 0xb8, 0x8e, 0x00, 0x6f, 0xee, 0x09, 0x34, 0x45, 0xb3, 0x88, - 0x66, 0x19, 0x0a, 0x26, 0xb7, 0x01, 0xdc, 0xcf, 0xfa, 0xc3, 0xc9, 0xc0, 0x8d, 0x6f, 0x5d, 0x05, - 0x9f, 0x51, 0xcc, 0x45, 0x8e, 0xd5, 0x18, 0x90, 0x3d, 0x20, 0x82, 0x44, 0xfa, 0x6a, 0xe5, 0x19, - 0x5f, 0x55, 0x4c, 0x95, 0x53, 0xb5, 0xc5, 0xc7, 0xf9, 0xe8, 0x2e, 0xc2, 0x82, 0x37, 0xc2, 0x12, - 0xfa, 0x2f, 0x47, 0xd2, 0xfe, 0x48, 0xe1, 0xfd, 0x91, 0x5e, 0xe4, 0xa4, 0x07, 0xdc, 0x87, 0x80, - 0x6f, 0x08, 0xb7, 0xa6, 0x6f, 0x08, 0xb2, 0x69, 0x96, 0xc7, 0x9d, 0x41, 0x80, 0x6c, 0x80, 0x64, - 0x90, 0x2f, 0x61, 0x34, 0xe5, 0xc3, 0xf7, 0x11, 0x9c, 0x2b, 0xdc, 0xb0, 0xe9, 0x2d, 0x02, 0x5d, - 0x91, 0x93, 0x0b, 0xf2, 0x02, 0xfd, 0x4d, 0x6f, 0xc8, 0x37, 0x61, 0xf9, 0xb1, 0xeb, 0x04, 0x6e, - 0xc0, 0xaf, 0x67, 0xfc, 0x54, 0x64, 0x30, 0xf9, 0x76, 0x36, 0x48, 0x9f, 0x4e, 0xdc, 0xea, 0x42, - 0x5a, 0x70, 0x96, 0xed, 0x1a, 0xde, 0x31, 0x6a, 0x04, 0xb8, 0xa5, 0x46, 0x49, 0xdd, 0x89, 0x91, - 0x04, 0xef, 0x1f, 0x0d, 0xc4, 0x62, 0xd4, 0xe6, 0xfa, 0x61, 0x16, 0x44, 0x85, 0x9a, 0xf3, 0xc5, - 0xd8, 0x64, 0x1b, 0x96, 0x18, 0x73, 0xa6, 0x1b, 0x62, 0x26, 0xf6, 0x9b, 0x33, 0xbf, 0x50, 0xc3, - 0x17, 0x3a, 0x61, 0xfc, 0x3f, 0xbd, 0x94, 0xa1, 0x37, 0x93, 0x7d, 0x2c, 0x7b, 0x10, 0x98, 0xcb, - 0x08, 0xe4, 0x9e, 0x03, 0xda, 0x7f, 0x56, 0x44, 0x53, 0x53, 0xea, 0x65, 0x7a, 0xb2, 0x86, 0xee, - 0x48, 0x78, 0x51, 0x2c, 0x9a, 0xfc, 0xd7, 0x73, 0x9e, 0xf6, 0xe4, 0x6d, 0x58, 0xa6, 0x6c, 0x0f, - 0x27, 0x23, 0x76, 0xe2, 0x96, 0x53, 0xf1, 0xf0, 0x5a, 0xac, 0x88, 0x0e, 0xdb, 0xde, 0x19, 0x73, - 0xe9, 0x38, 0xf9, 0x49, 0x5e, 0x87, 0xc5, 0xf0, 0x38, 0x1a, 0xcb, 0xe7, 0xb4, 0x30, 0xb5, 0x59, - 0xad, 0x5e, 0x97, 0x93, 0x54, 0x29, 0x4e, 0xa2, 0x32, 0xd9, 0x9e, 0x67, 0xc6, 0x36, 0xed, 0x55, - 0x58, 0x92, 0x78, 0xd3, 0xc6, 0xb0, 0xf7, 0xac, 0xa2, 0x31, 0xec, 0x17, 0x1f, 0xec, 0xc7, 0x50, - 0x15, 0x2c, 0x09, 0x81, 0xca, 0x91, 0x1f, 0x0a, 0x39, 0x07, 0xff, 0xa7, 0x30, 0xbc, 0xc8, 0xd1, - 0x46, 0xce, 0x99, 0xf8, 0x3f, 0x8a, 0xd3, 0xa8, 0x16, 0xc6, 0x28, 0xca, 0xe8, 0xc3, 0x1c, 0x6b, - 0x50, 0x28, 0xbc, 0x37, 0x0c, 0x99, 0x67, 0xb3, 0xd0, 0xe5, 0xc4, 0xf7, 0x90, 0x8c, 0x3e, 0x7e, - 0x9a, 0xd8, 0x98, 0x92, 0x9a, 0x4b, 0x79, 0xa9, 0x99, 0xc5, 0x39, 0xe3, 0x94, 0xec, 0xcb, 0x80, - 0x30, 0x94, 0x9a, 0x25, 0xc1, 0xa8, 0x92, 0x12, 0x8c, 0x24, 0xc5, 0x6c, 0x32, 0x7a, 0x4c, 0xe8, - 0x16, 0x8a, 0xd9, 0xac, 0xa8, 0xf6, 0x83, 0x78, 0x86, 0xa4, 0x2c, 0x02, 0xe4, 0x0e, 0x9c, 0x63, - 0xda, 0x11, 0x9e, 0xbe, 0x3e, 0x23, 0x23, 0x9e, 0xc5, 0x42, 0x96, 0xfd, 0x2e, 0x96, 0x15, 0x9f, - 0xad, 0x78, 0x24, 0x6f, 0xc0, 0x46, 0x9c, 0x3b, 0x39, 0x7c, 0xe2, 0x8d, 0x59, 0xee, 0xc8, 0x13, - 0xae, 0xb7, 0x20, 0xa2, 0xcc, 0x7a, 0xe2, 0x8d, 0x31, 0x8f, 0xa4, 0xe8, 0xe1, 0x7f, 0x5d, 0x12, - 0xea, 0xec, 0x6d, 0xdf, 0x8f, 0xc2, 0x28, 0x70, 0xc6, 0x29, 0x9b, 0x27, 0x39, 0x86, 0x8b, 0x58, - 0xa5, 0x3b, 0x98, 0xc0, 0xca, 0x0f, 0x84, 0xfa, 0x3f, 0x5e, 0x60, 0x4b, 0x77, 0xbe, 0x9e, 0xd6, - 0x47, 0xe9, 0x14, 0x5b, 0x97, 0x91, 0xe9, 0xba, 0x92, 0xb8, 0xee, 0x9d, 0x31, 0x2f, 0x30, 0x9e, - 0x39, 0x2c, 0xb2, 0x57, 0xb0, 0xd7, 0x64, 0x8d, 0x9e, 0xdb, 0xc9, 0xc6, 0x93, 0xe6, 0x2a, 0x6f, - 0x49, 0xe4, 0x7d, 0x58, 0xf4, 0x06, 0x72, 0xd2, 0xe6, 0xac, 0xb9, 0xad, 0x31, 0x60, 0xe9, 0x23, - 0x12, 0x1e, 0x74, 0x69, 0x78, 0x1c, 0xba, 0xbd, 0x92, 0x92, 0x5c, 0xb4, 0x6d, 0xa1, 0x39, 0xcd, - 0x93, 0x91, 0xd5, 0xe4, 0xec, 0xc3, 0x73, 0x0e, 0x77, 0x81, 0x24, 0x81, 0x85, 0xc9, 0x7f, 0x69, - 0x7f, 0x17, 0x5e, 0x3e, 0x6d, 0x1f, 0xd1, 0x1d, 0x63, 0x4a, 0x87, 0x2f, 0xb2, 0xb8, 0xd7, 0xe9, - 0x7e, 0xbb, 0x09, 0x72, 0xbc, 0x7e, 0x4f, 0x4c, 0x11, 0x01, 0xdb, 0x0f, 0x3c, 0xed, 0x7f, 0x96, - 0x61, 0x35, 0x6d, 0x0f, 0x27, 0xaf, 0x42, 0x45, 0xda, 0x28, 0x2f, 0x14, 0x18, 0xcd, 0x71, 0x7b, - 0x44, 0xa4, 0x53, 0x6d, 0x8c, 0xe4, 0x1e, 0xac, 0xa2, 0x87, 0x3e, 0x0a, 0x88, 0x91, 0xc7, 0x4d, - 0x44, 0xa7, 0x35, 0xfe, 0x2c, 0x53, 0x5a, 0x7a, 0x30, 0xd2, 0x42, 0xc9, 0xdc, 0x59, 0x99, 0x6e, - 0xee, 0xe4, 0x4d, 0x99, 0x62, 0xee, 0x9c, 0x9b, 0x61, 0xee, 0x4c, 0x28, 0x65, 0x73, 0x27, 0x1a, - 0xbd, 0x17, 0xa6, 0x19, 0xbd, 0x13, 0x1a, 0x66, 0xf4, 0x4e, 0xcc, 0x95, 0xd5, 0xa9, 0xe6, 0xca, - 0x84, 0x86, 0x9b, 0x2b, 0x13, 0x03, 0xe2, 0xe2, 0x54, 0x03, 0xa2, 0x44, 0xc4, 0x0c, 0x88, 0x2f, - 0xf2, 0x8e, 0x0d, 0x9c, 0xa7, 0x36, 0xf6, 0x38, 0xbf, 0xf1, 0x60, 0x97, 0x99, 0xce, 0x53, 0x74, - 0xbd, 0xa5, 0x82, 0x09, 0xf7, 0xd7, 0xd5, 0x7e, 0x98, 0xd9, 0x80, 0xc4, 0x98, 0xbf, 0x04, 0xab, - 0xec, 0x1c, 0xe6, 0xf1, 0xd4, 0xd9, 0x41, 0xbc, 0x62, 0xae, 0x08, 0x28, 0xd3, 0x97, 0xfe, 0x02, - 0xac, 0xc5, 0x68, 0x5c, 0x65, 0x88, 0xa1, 0x01, 0xcc, 0x98, 0x9a, 0x2b, 0x0b, 0x65, 0x7e, 0x01, - 0x8f, 0x15, 0x97, 0xe2, 0xc7, 0x02, 0x89, 0xbd, 0x06, 0x24, 0x41, 0x8b, 0x5f, 0x2f, 0x54, 0x10, - 0x75, 0x3d, 0x46, 0x8d, 0x9f, 0x18, 0xfc, 0x13, 0x25, 0x63, 0xa8, 0xfb, 0x79, 0x55, 0xff, 0x55, - 0x88, 0xbf, 0x6e, 0x73, 0x63, 0x8b, 0x68, 0x81, 0x2a, 0x0a, 0xba, 0x1c, 0xae, 0x1d, 0x66, 0xd5, - 0x62, 0x3f, 0xa7, 0x5a, 0x69, 0x3f, 0x2a, 0xa7, 0x8c, 0x18, 0xe2, 0x33, 0x54, 0xbe, 0x09, 0x7d, - 0x9b, 0x0f, 0x31, 0xdf, 0x7e, 0x6f, 0x4e, 0x99, 0xa6, 0xdc, 0x5f, 0xdb, 0xb2, 0x3a, 0x26, 0x84, - 0xa1, 0x2f, 0xdc, 0xb7, 0x6d, 0xa6, 0xee, 0x91, 0xee, 0x71, 0x82, 0x1d, 0xdb, 0x6b, 0xb7, 0x66, - 0xb3, 0x13, 0x5a, 0x62, 0xba, 0x4a, 0x51, 0xed, 0x13, 0xff, 0x12, 0x1f, 0xd8, 0x07, 0xb4, 0xf9, - 0x85, 0x69, 0xe6, 0xe5, 0x02, 0xc5, 0x5e, 0x8e, 0x39, 0xf6, 0x12, 0x72, 0x46, 0x15, 0x72, 0x28, - 0xb3, 0x35, 0x60, 0x19, 0x4d, 0x04, 0x82, 0x61, 0xa5, 0xc0, 0xbd, 0x20, 0xdf, 0xf8, 0x5a, 0xa3, - 0x65, 0x2e, 0x51, 0x3a, 0xc1, 0xe6, 0x08, 0x2e, 0xca, 0x8a, 0xfd, 0x74, 0x25, 0xe7, 0x44, 0x16, - 0x84, 0x99, 0x3d, 0x90, 0xe8, 0xff, 0xb1, 0xaa, 0xe7, 0x9d, 0x34, 0x80, 0xa3, 0xe1, 0xd3, 0x85, - 0xe9, 0x63, 0x32, 0x23, 0x27, 0x65, 0x22, 0xdb, 0x94, 0x64, 0xd9, 0x46, 0xd6, 0xf3, 0x97, 0xd3, - 0x7a, 0xfe, 0x1d, 0xb8, 0x41, 0xb7, 0x23, 0x3e, 0xa8, 0xee, 0xa7, 0x6e, 0x70, 0xe2, 0x8f, 0x30, - 0xd6, 0xdd, 0x38, 0x5e, 0x95, 0xcc, 0x30, 0x71, 0x85, 0xe2, 0xe1, 0x90, 0x19, 0x1c, 0xab, 0x85, - 0x48, 0x2c, 0x86, 0xe3, 0xbf, 0x2a, 0xc3, 0x0b, 0xa7, 0x18, 0xf7, 0x19, 0x75, 0xff, 0xa5, 0xb4, - 0x04, 0x5e, 0x4a, 0xe9, 0x3f, 0x29, 0x53, 0x7e, 0xb8, 0x9c, 0x8c, 0xfa, 0x53, 0xe4, 0xef, 0x5f, - 0x87, 0x35, 0x76, 0x82, 0xb0, 0xb7, 0x1b, 0x07, 0x93, 0xe1, 0x29, 0x8e, 0x90, 0xcb, 0xe2, 0xa1, - 0x79, 0x86, 0x14, 0x4f, 0x15, 0xdc, 0x38, 0xad, 0x18, 0x46, 0x7a, 0xb0, 0x84, 0x68, 0x07, 0x8e, - 0x37, 0x3c, 0xd5, 0x8b, 0x67, 0xf1, 0x8c, 0x5d, 0x26, 0x63, 0x4f, 0xce, 0x28, 0x60, 0x07, 0x7f, - 0x93, 0x5b, 0xb0, 0x36, 0x9a, 0x1c, 0x53, 0xd9, 0x92, 0x4d, 0x2a, 0xee, 0x22, 0x3b, 0x67, 0xae, - 0x8c, 0x26, 0xc7, 0xfa, 0x78, 0x8c, 0x73, 0x03, 0x7d, 0x69, 0xd7, 0x29, 0x1e, 0x5b, 0xfe, 0x02, - 0x73, 0x1e, 0x31, 0x29, 0x03, 0xb6, 0x01, 0x70, 0xdc, 0x0d, 0x60, 0x2f, 0x2b, 0x78, 0x6e, 0x4f, - 0xf6, 0x43, 0xfb, 0xdf, 0x25, 0xa1, 0xd5, 0x9d, 0xbe, 0x80, 0xfe, 0x76, 0x88, 0x0a, 0x86, 0xe8, - 0x65, 0x50, 0x69, 0xd7, 0x27, 0xbb, 0x53, 0x3c, 0x46, 0xab, 0xa3, 0xc9, 0x71, 0xdc, 0x77, 0x72, - 0xc7, 0xcf, 0xcb, 0x1d, 0xff, 0xb6, 0xd0, 0xfa, 0x16, 0xee, 0x33, 0xd3, 0xbb, 0x9c, 0x8a, 0x5e, - 0xb7, 0x4e, 0xb7, 0x9b, 0xfc, 0xed, 0xb8, 0x15, 0x8c, 0x5b, 0xc6, 0x04, 0x3a, 0x97, 0x33, 0x81, - 0x16, 0xac, 0xbd, 0xf9, 0xa2, 0xb5, 0x97, 0x33, 0xb8, 0x2e, 0x14, 0x18, 0x5c, 0x0b, 0x17, 0x68, - 0xf5, 0x19, 0x0b, 0x74, 0x51, 0x9e, 0x27, 0xff, 0xbd, 0x24, 0x44, 0xaf, 0xf4, 0x5d, 0xea, 0x23, - 0x38, 0x2b, 0xee, 0x52, 0xec, 0x08, 0x4a, 0xec, 0xe8, 0x4b, 0x77, 0x5e, 0x29, 0xba, 0x45, 0x21, - 0x5a, 0xc1, 0x4d, 0x67, 0x9d, 0xdf, 0x9f, 0x92, 0xf2, 0xff, 0x7f, 0x6e, 0x4e, 0xe4, 0x11, 0x9c, - 0xc7, 0x54, 0x3b, 0x7d, 0xd9, 0x03, 0xc0, 0x0e, 0xdc, 0x03, 0x3e, 0x1f, 0x6e, 0xe6, 0xee, 0x19, - 0x5e, 0x5f, 0xaa, 0x8e, 0xe9, 0x1e, 0xec, 0x9d, 0x31, 0x37, 0xc2, 0x02, 0x78, 0xf6, 0x52, 0xf6, - 0x47, 0x0a, 0x68, 0xcf, 0xee, 0x2f, 0xbc, 0x3f, 0x67, 0x3b, 0x9c, 0xde, 0x9f, 0xa5, 0xde, 0x7b, - 0x01, 0x56, 0x02, 0xf7, 0x20, 0x70, 0xc3, 0xa3, 0x94, 0x92, 0x6b, 0x99, 0x03, 0x45, 0xc7, 0x88, - 0x78, 0xdf, 0xcf, 0x75, 0xab, 0x11, 0x44, 0xda, 0x4e, 0x7c, 0xd7, 0x2e, 0x1c, 0x07, 0x3a, 0x9b, - 0xe4, 0x0a, 0xb2, 0x1f, 0xf7, 0x2a, 0xd5, 0x92, 0x5a, 0x36, 0x79, 0x54, 0xf2, 0x03, 0x6f, 0xe8, - 0x6a, 0xff, 0x2e, 0x96, 0x2c, 0x8a, 0x3a, 0x8f, 0x7c, 0x24, 0xbd, 0x78, 0x2a, 0xe7, 0xe4, 0x99, - 0x22, 0x92, 0xd3, 0x68, 0x20, 0x9b, 0x5f, 0x91, 0x06, 0xf2, 0xae, 0x70, 0x9b, 0xa6, 0x7b, 0xde, - 0x83, 0xdb, 0xe4, 0x15, 0x58, 0x60, 0x9e, 0xd2, 0xa2, 0xba, 0x6b, 0xa9, 0xea, 0x3e, 0xb8, 0x6d, - 0x8a, 0x72, 0xed, 0xf3, 0xd8, 0x3f, 0x25, 0xd7, 0x88, 0x07, 0xb7, 0xc9, 0xdb, 0xa7, 0x7b, 0xc1, - 0x54, 0x15, 0x2f, 0x98, 0xe2, 0xd7, 0x4b, 0xef, 0xa4, 0x5e, 0x2f, 0xbd, 0x38, 0xbb, 0xb7, 0xb8, - 0xd7, 0x11, 0x8b, 0xf4, 0x1c, 0xc7, 0x0a, 0xd5, 0xfe, 0xba, 0x04, 0x57, 0x67, 0x52, 0x90, 0x2b, - 0x50, 0xd5, 0xbb, 0x8d, 0x5e, 0x32, 0xbe, 0x74, 0xcd, 0x08, 0x08, 0xd9, 0x85, 0xc5, 0x6d, 0x27, - 0xf4, 0xfa, 0x74, 0x1a, 0x17, 0x1a, 0xc1, 0x73, 0x6c, 0x63, 0xf4, 0xbd, 0x33, 0x66, 0x42, 0x4b, - 0x6c, 0x58, 0xc7, 0xb5, 0x90, 0xca, 0xa3, 0x59, 0x2e, 0xd0, 0xd3, 0xe4, 0x18, 0xe6, 0xc8, 0xe8, - 0x3e, 0x93, 0x03, 0x92, 0xc7, 0x40, 0x2c, 0x6b, 0xaf, 0xe6, 0x06, 0x11, 0xd7, 0x5f, 0x44, 0x5e, - 0xfc, 0x1c, 0xe6, 0x8d, 0x67, 0xf4, 0x5d, 0x8e, 0x6e, 0xef, 0x8c, 0x59, 0xc0, 0x8d, 0xdc, 0x04, - 0x39, 0xe1, 0x2b, 0x9e, 0xd1, 0xcb, 0x7b, 0x67, 0x4c, 0x18, 0xc7, 0x89, 0x5f, 0xb3, 0x3b, 0xc1, - 0xa7, 0x42, 0x24, 0x9a, 0xde, 0x4f, 0xcf, 0x11, 0x68, 0xff, 0x65, 0xa8, 0x76, 0x85, 0x5b, 0xa2, - 0xf4, 0xf2, 0x50, 0xb8, 0x20, 0x9a, 0x71, 0xa9, 0xf6, 0x0f, 0x15, 0xa1, 0xd3, 0x79, 0x76, 0x7f, - 0x4a, 0x99, 0x50, 0x07, 0xb3, 0x33, 0xa1, 0x0e, 0x7e, 0xc6, 0x4c, 0xa8, 0x9a, 0x07, 0xaf, 0x9c, - 0xba, 0xef, 0xc9, 0xbb, 0xa0, 0x62, 0x92, 0x49, 0x47, 0x1a, 0x47, 0xb6, 0x04, 0xd7, 0xe3, 0xcc, - 0x2b, 0x7b, 0x3c, 0x33, 0xaf, 0xb9, 0xd6, 0x4f, 0x53, 0x6b, 0x7f, 0xc8, 0x33, 0xee, 0x34, 0x06, - 0xdd, 0x8c, 0xb5, 0xf5, 0xcb, 0x3e, 0x56, 0x35, 0x52, 0xeb, 0xf1, 0x05, 0x29, 0xa3, 0x77, 0xfe, - 0x5b, 0xd3, 0xdf, 0xac, 0x4a, 0x8b, 0xf3, 0x9f, 0x95, 0xe1, 0xca, 0x2c, 0x72, 0xa2, 0x83, 0x6a, - 0x64, 0x72, 0xf7, 0xcb, 0x19, 0xe0, 0x72, 0x49, 0xff, 0xcd, 0x1c, 0x3a, 0x1d, 0x5b, 0x06, 0x8b, - 0x5f, 0x62, 0xe2, 0xd8, 0x72, 0x52, 0x3a, 0xb6, 0xa2, 0x98, 0xbc, 0x00, 0xf3, 0x7a, 0xcd, 0x4a, - 0x32, 0xd5, 0xe2, 0x93, 0x29, 0xa7, 0x1f, 0xe2, 0x63, 0x1c, 0x5e, 0x44, 0x7e, 0x2d, 0x9f, 0x9c, - 0x99, 0xa7, 0xa8, 0xbd, 0x2c, 0x75, 0x48, 0x2e, 0x19, 0x16, 0xd6, 0x37, 0x49, 0xde, 0xc4, 0xf3, - 0xa1, 0x98, 0xf9, 0x44, 0xcf, 0x1a, 0xcc, 0x77, 0x03, 0x37, 0x74, 0x23, 0xf9, 0x39, 0xd3, 0x18, - 0x21, 0x26, 0x2f, 0xe1, 0x8f, 0x8d, 0x9c, 0x13, 0x16, 0x5b, 0x6a, 0x5e, 0x8e, 0x21, 0x88, 0xaf, - 0x93, 0x28, 0xd8, 0x94, 0x50, 0x28, 0x41, 0xd3, 0x99, 0x8c, 0xfa, 0x47, 0xfb, 0x66, 0x93, 0x0b, - 0x57, 0x8c, 0x60, 0x88, 0x50, 0xda, 0xc0, 0xd0, 0x94, 0x50, 0xb4, 0xdf, 0x52, 0x60, 0xa3, 0xa8, - 0x1d, 0xe4, 0x0a, 0x54, 0x46, 0x85, 0x79, 0xa8, 0x47, 0x2c, 0x24, 0xce, 0x12, 0x1a, 0xef, 0x0e, - 0xfc, 0xe0, 0xd8, 0x89, 0xe4, 0x47, 0x5f, 0x12, 0xd8, 0x44, 0x63, 0xe3, 0x0e, 0xfe, 0x4f, 0xae, - 0x8b, 0x53, 0xa9, 0x9c, 0xcb, 0x5c, 0x8d, 0x7f, 0x34, 0x1d, 0xa0, 0x31, 0xe8, 0x76, 0xc6, 0x2c, - 0x19, 0xd3, 0x9b, 0x50, 0xa1, 0xd5, 0xca, 0xcc, 0x5e, 0x3a, 0x7f, 0xf4, 0x56, 0x93, 0x23, 0xb1, - 0x5a, 0x85, 0xce, 0xf1, 0xd0, 0x44, 0x64, 0xed, 0x21, 0xac, 0xa6, 0x31, 0x88, 0x91, 0x8e, 0xc7, - 0xbf, 0x74, 0x47, 0xe5, 0x9c, 0xb6, 0x7d, 0x9f, 0x3d, 0x3c, 0xde, 0xbe, 0xf8, 0x93, 0x2f, 0xae, - 0x03, 0xfd, 0xc9, 0x68, 0x8a, 0xe2, 0xf5, 0x6b, 0xbf, 0x5b, 0x82, 0x8d, 0x24, 0xd6, 0x91, 0x58, - 0x43, 0x7f, 0x63, 0x03, 0x6f, 0xe8, 0xa9, 0xc0, 0x10, 0x42, 0xb4, 0xcc, 0x37, 0x70, 0xc6, 0x7b, - 0xf4, 0x5d, 0xd8, 0x9c, 0x86, 0x4f, 0x5e, 0x85, 0x45, 0x0c, 0xb9, 0x39, 0x76, 0xfa, 0xae, 0xbc, - 0xcd, 0x8e, 0x04, 0xd0, 0x4c, 0xca, 0xb5, 0x3f, 0x51, 0xe0, 0x12, 0x7f, 0x2e, 0xdb, 0x72, 0xbc, - 0x11, 0xda, 0x8a, 0xfa, 0xee, 0x57, 0x13, 0x38, 0x66, 0x37, 0xb5, 0x8f, 0xbd, 0x94, 0x7e, 0x15, - 0x9d, 0xfb, 0xda, 0xf4, 0xd6, 0x92, 0x57, 0x30, 0x8c, 0x2c, 0x77, 0x27, 0xab, 0xb0, 0x40, 0x5d, - 0x23, 0x0a, 0x90, 0x03, 0x75, 0x21, 0x86, 0xf6, 0xf7, 0xe0, 0xda, 0xec, 0x0f, 0x90, 0x5f, 0x85, - 0x15, 0xcc, 0x93, 0xba, 0x3f, 0x3e, 0x0c, 0x9c, 0x81, 0x2b, 0xb4, 0x88, 0x42, 0xd9, 0x2d, 0x97, - 0xb1, 0xa8, 0xb8, 0x3c, 0x70, 0xd4, 0x21, 0x66, 0x60, 0xe5, 0x44, 0xa9, 0x37, 0xe9, 0x32, 0x37, - 0xed, 0x3b, 0x0a, 0x90, 0x3c, 0x0f, 0xf2, 0x0d, 0x58, 0xde, 0xef, 0xd5, 0xac, 0xc8, 0x09, 0xa2, - 0x3d, 0x7f, 0x12, 0xf0, 0x90, 0xb4, 0x2c, 0x8e, 0x50, 0xd4, 0xb7, 0x99, 0x55, 0xf0, 0xc8, 0x9f, - 0x04, 0x66, 0x0a, 0x0f, 0x33, 0x6c, 0xba, 0xee, 0x93, 0x81, 0x73, 0x92, 0xce, 0xb0, 0xc9, 0x61, - 0xa9, 0x0c, 0x9b, 0x1c, 0xa6, 0xfd, 0x40, 0x81, 0xcb, 0xe2, 0x9d, 0xc4, 0xa0, 0xa0, 0x2e, 0x35, - 0x8c, 0x96, 0x17, 0x88, 0x2c, 0x07, 0xb3, 0x84, 0xf8, 0x75, 0x11, 0x50, 0x12, 0x2b, 0x88, 0xd2, - 0x3c, 0xa3, 0x25, 0xbf, 0x04, 0x15, 0x2b, 0xf2, 0xc7, 0xa7, 0x88, 0x28, 0xa9, 0xc6, 0x23, 0x1a, - 0xf9, 0x63, 0x64, 0x81, 0x94, 0x9a, 0x0b, 0x1b, 0x72, 0xe5, 0x44, 0x8d, 0x49, 0x0b, 0x16, 0x78, - 0x38, 0xe2, 0x8c, 0x03, 0xde, 0x8c, 0x36, 0x6d, 0xaf, 0x89, 0xb0, 0x95, 0x3c, 0x1e, 0xbf, 0x29, - 0x78, 0x68, 0xff, 0x48, 0x81, 0x25, 0x2a, 0xd8, 0xe0, 0xbd, 0xf5, 0xcb, 0x4e, 0xe9, 0xb4, 0xa8, - 0x2c, 0xfc, 0x49, 0x63, 0xf6, 0xa7, 0x3a, 0x8d, 0xdf, 0x82, 0xb5, 0x0c, 0x01, 0xd1, 0x30, 0x60, - 0xd9, 0xd0, 0xeb, 0x3b, 0x2c, 0x61, 0x1f, 0xf3, 0xc5, 0x4c, 0xc1, 0xb4, 0x7f, 0xa0, 0xc0, 0x46, - 0xe7, 0x49, 0xe4, 0x30, 0xe3, 0xbd, 0x39, 0x19, 0x8a, 0xf5, 0x4e, 0x85, 0x35, 0xf1, 0xe0, 0x86, - 0x05, 0x53, 0x62, 0xc2, 0x1a, 0x87, 0x99, 0x71, 0x29, 0xd9, 0x83, 0x2a, 0x3f, 0x5f, 0x42, 0x1e, - 0x3a, 0xff, 0x9a, 0xa4, 0x3e, 0x49, 0x18, 0x73, 0x24, 0xda, 0x12, 0xdc, 0xc2, 0x38, 0x8d, 0x19, - 0x53, 0x6b, 0x7f, 0xa9, 0xc0, 0x85, 0x29, 0x34, 0xe4, 0x3d, 0x98, 0xc3, 0x40, 0x0f, 0x7c, 0xf4, - 0xae, 0x4c, 0xf9, 0x44, 0xd4, 0x3f, 0x7a, 0x70, 0x9b, 0x1d, 0x44, 0xc7, 0xf4, 0x87, 0xc9, 0xa8, - 0xc8, 0x47, 0xb0, 0xa8, 0x0f, 0x06, 0xfc, 0x02, 0x57, 0x4a, 0x5d, 0xe0, 0xa6, 0x7c, 0xf1, 0xf5, - 0x18, 0x9f, 0x5d, 0xe0, 0xd8, 0x93, 0xe3, 0xc1, 0xc0, 0xe6, 0x41, 0x2c, 0x12, 0x7e, 0x97, 0xde, - 0x85, 0xd5, 0x34, 0xf2, 0x73, 0xbd, 0xbb, 0xff, 0x5c, 0x01, 0x35, 0x5d, 0x87, 0x9f, 0x4f, 0xc0, - 0xcd, 0xa2, 0x61, 0x7e, 0xc6, 0xa4, 0xfa, 0xc7, 0x25, 0x38, 0x57, 0xd8, 0xc3, 0xe4, 0x35, 0x98, - 0xd7, 0xc7, 0xe3, 0x46, 0x9d, 0xcf, 0x2a, 0x2e, 0x21, 0xa1, 0x7e, 0x3d, 0x75, 0xbf, 0x65, 0x48, - 0xe4, 0x4d, 0xa8, 0x32, 0x1f, 0x91, 0xba, 0xd8, 0x70, 0x30, 0x82, 0x20, 0x77, 0x60, 0x49, 0x07, - 0xb1, 0x17, 0x88, 0x64, 0x07, 0x56, 0x79, 0xec, 0x3d, 0x74, 0x18, 0x8a, 0xf3, 0x25, 0xa1, 0x8f, - 0x95, 0x50, 0xda, 0x33, 0x57, 0xa3, 0xd4, 0xde, 0x99, 0xa1, 0x22, 0x4d, 0x50, 0x91, 0xa7, 0xcc, - 0x89, 0x45, 0xd2, 0x97, 0x7c, 0xef, 0xa6, 0xf0, 0xca, 0x51, 0xc6, 0xc3, 0xc5, 0xfc, 0xdf, 0x8f, - 0xdd, 0x51, 0xf4, 0xf3, 0x1b, 0xae, 0xe4, 0x1b, 0xa7, 0x1a, 0xae, 0xef, 0x57, 0xd8, 0x62, 0xce, - 0x92, 0x51, 0x89, 0x46, 0x4a, 0x8f, 0x82, 0x12, 0x0d, 0xbd, 0x9f, 0xf1, 0xe8, 0x72, 0x75, 0x58, - 0x60, 0x51, 0xff, 0xc4, 0xca, 0xb8, 0x5a, 0x58, 0x05, 0x86, 0xf3, 0xe0, 0x36, 0x13, 0x5f, 0x58, - 0xc4, 0x89, 0xd0, 0x14, 0xa4, 0xe4, 0x01, 0x2c, 0xd5, 0x86, 0xae, 0x33, 0x9a, 0x8c, 0x7b, 0xa7, - 0x33, 0x50, 0x6f, 0xf2, 0xb6, 0x2c, 0xf7, 0x19, 0x19, 0x1a, 0xb6, 0x71, 0x27, 0x97, 0x19, 0x91, - 0x5e, 0xfc, 0x08, 0xbd, 0x82, 0xba, 0xd9, 0x37, 0x66, 0xf4, 0x4f, 0x16, 0x88, 0x74, 0xe9, 0x08, - 0x0b, 0xfc, 0x95, 0xba, 0x0d, 0xab, 0x4d, 0x27, 0x8c, 0x7a, 0x81, 0x33, 0x0a, 0x31, 0x02, 0xf9, - 0x29, 0xa2, 0xa9, 0x5e, 0xe6, 0x15, 0x66, 0x3a, 0xdb, 0x28, 0x26, 0x65, 0x3a, 0xdb, 0x34, 0x3b, - 0x2a, 0x2f, 0xed, 0x78, 0x23, 0x67, 0xe8, 0x7d, 0x5b, 0xc4, 0xea, 0x60, 0xf2, 0xd2, 0x81, 0x00, - 0x9a, 0x49, 0xb9, 0xf6, 0x2b, 0xb9, 0x71, 0x63, 0xb5, 0x5c, 0x82, 0x05, 0x1e, 0xc9, 0x89, 0x45, - 0x36, 0xea, 0x1a, 0xed, 0x7a, 0xa3, 0xbd, 0xab, 0x2a, 0x64, 0x15, 0xa0, 0x6b, 0x76, 0x6a, 0x86, - 0x65, 0xd1, 0xdf, 0x25, 0xfa, 0x9b, 0x87, 0x3d, 0xda, 0xd9, 0x6f, 0xaa, 0x65, 0x29, 0xf2, 0x51, - 0x45, 0xfb, 0xb1, 0x02, 0xe7, 0x8b, 0x87, 0x92, 0xf4, 0x00, 0x63, 0x5f, 0x71, 0x57, 0x85, 0x6f, - 0xcc, 0x1c, 0xf7, 0x42, 0x70, 0x36, 0x86, 0x56, 0xc4, 0x62, 0x33, 0x95, 0x84, 0x99, 0x8d, 0x05, - 0x7b, 0xf0, 0x06, 0x66, 0xc9, 0x1b, 0x68, 0x35, 0xd8, 0x9c, 0xc6, 0x23, 0xdd, 0xd4, 0x35, 0x58, - 0xd2, 0xbb, 0xdd, 0x66, 0xa3, 0xa6, 0xf7, 0x1a, 0x9d, 0xb6, 0xaa, 0x90, 0x45, 0x98, 0xdb, 0x35, - 0x3b, 0xfb, 0x5d, 0xb5, 0xa4, 0xfd, 0x9e, 0x02, 0x2b, 0x8d, 0xc4, 0x89, 0xf2, 0xcb, 0x2e, 0xbe, - 0x6f, 0xa6, 0x16, 0xdf, 0x66, 0x1c, 0x25, 0x2e, 0xfe, 0xc0, 0xa9, 0x56, 0xde, 0xbf, 0x29, 0xc3, - 0x7a, 0x8e, 0x86, 0x58, 0xb0, 0xa0, 0x3f, 0xb4, 0x3a, 0x8d, 0x7a, 0x8d, 0xd7, 0xec, 0x7a, 0xe2, - 0x34, 0x87, 0xd9, 0x46, 0x73, 0x5f, 0x61, 0x91, 0x55, 0x9e, 0x86, 0xb6, 0xef, 0x0d, 0xfa, 0x29, - 0xaf, 0x4d, 0xc1, 0x09, 0x4f, 0xb2, 0x6f, 0x4f, 0x02, 0x74, 0x44, 0xe5, 0xb5, 0x8e, 0x7d, 0xf1, - 0x04, 0x3c, 0xcf, 0x18, 0x5d, 0x33, 0x1d, 0x5a, 0x9e, 0x67, 0x9d, 0xf0, 0x23, 0x6d, 0x98, 0xdf, - 0xf5, 0xa2, 0xbd, 0xc9, 0x63, 0xbe, 0x7e, 0xaf, 0x25, 0xb9, 0x27, 0xf7, 0x26, 0x8f, 0xf3, 0x6c, - 0x51, 0xab, 0xc9, 0x5e, 0x55, 0xa7, 0x58, 0x72, 0x2e, 0xe4, 0x3e, 0xcc, 0xe9, 0x0f, 0x2d, 0x53, - 0xe7, 0xab, 0x4b, 0x72, 0x4b, 0x34, 0xf5, 0x29, 0xdc, 0x68, 0xeb, 0x03, 0x27, 0xc5, 0x8d, 0xf1, - 0xc8, 0x46, 0x96, 0xa8, 0x3c, 0x57, 0x64, 0x89, 0xed, 0x15, 0x58, 0xe2, 0x17, 0x32, 0xbc, 0xeb, - 0xfc, 0x48, 0x81, 0xcd, 0x69, 0xc3, 0x40, 0xef, 0x78, 0xe9, 0x08, 0x52, 0xe7, 0xe3, 0x4c, 0x67, - 0x69, 0xd7, 0x61, 0x81, 0x46, 0x3e, 0x80, 0x25, 0xe6, 0x5e, 0x66, 0xbd, 0xb9, 0x6f, 0x36, 0xf8, - 0xdc, 0xbf, 0xfa, 0x17, 0x5f, 0x5c, 0xbf, 0xc0, 0x3d, 0xd2, 0xc2, 0x37, 0xed, 0x49, 0xe0, 0x25, - 0xa4, 0x9b, 0x8a, 0x29, 0x53, 0x50, 0x91, 0xdc, 0x99, 0x0c, 0x3c, 0x57, 0x5c, 0x48, 0x44, 0x94, - 0x1d, 0x0e, 0x93, 0x0f, 0x48, 0x01, 0xd3, 0xbe, 0xab, 0xc0, 0xa5, 0xe9, 0x63, 0x4e, 0x0f, 0xdd, - 0x1e, 0xf3, 0xd2, 0x13, 0x71, 0x6e, 0xf0, 0xd0, 0x8d, 0x5d, 0xf9, 0x64, 0x9e, 0x02, 0x91, 0x12, - 0x71, 0x75, 0x99, 0xd0, 0xb8, 0x20, 0x51, 0xac, 0x4d, 0x93, 0x89, 0x04, 0xa2, 0xf6, 0x08, 0x2e, - 0x4c, 0x99, 0x21, 0xe4, 0xfd, 0xc2, 0xfc, 0x89, 0xf8, 0xfc, 0x59, 0x7e, 0xdf, 0x9e, 0x4a, 0xc4, - 0x2b, 0xc1, 0xb5, 0xff, 0xc4, 0xfc, 0x52, 0x0b, 0xa6, 0x0b, 0x95, 0x0f, 0x30, 0x5f, 0x9f, 0x3e, - 0xea, 0x1f, 0xf9, 0x41, 0x32, 0x58, 0x28, 0x1f, 0x44, 0xb4, 0xc4, 0x76, 0xb0, 0x28, 0x33, 0x68, - 0x19, 0x2a, 0xe2, 0xc3, 0x7a, 0x37, 0xf0, 0x0f, 0x3c, 0xf6, 0x60, 0x8f, 0x5d, 0xeb, 0xf8, 0xca, - 0x7a, 0x59, 0x9a, 0xb0, 0xfe, 0xd0, 0x0d, 0xf5, 0xd1, 0xc9, 0xd3, 0x23, 0x37, 0x70, 0x73, 0xf8, - 0x71, 0x52, 0x1e, 0x0a, 0x66, 0xee, 0x0f, 0x7d, 0x2c, 0x30, 0xf3, 0xbc, 0xb5, 0xef, 0x95, 0xe0, - 0xe6, 0x33, 0x39, 0x9e, 0x36, 0xed, 0xe0, 0xd7, 0x01, 0x38, 0x2d, 0xed, 0x01, 0x49, 0x69, 0x23, - 0x2a, 0xe3, 0x04, 0x23, 0x53, 0x42, 0x21, 0x4f, 0xe0, 0xaa, 0xf8, 0xd5, 0xef, 0xbb, 0xe3, 0x28, - 0xa4, 0xf5, 0xe0, 0x71, 0x6c, 0xe3, 0x08, 0x3e, 0x55, 0xcc, 0xad, 0x7f, 0x33, 0xe6, 0xc1, 0x30, - 0x99, 0xf7, 0xbc, 0x08, 0x89, 0x8b, 0xaa, 0xa3, 0xd9, 0xbc, 0xc8, 0xad, 0x64, 0x25, 0x55, 0x12, - 0x95, 0xaf, 0x58, 0x49, 0xf1, 0xfa, 0xd1, 0x7e, 0x52, 0x82, 0xf3, 0x74, 0x47, 0x1e, 0xba, 0x61, - 0xa8, 0x4f, 0xa2, 0x23, 0xba, 0x6a, 0xd9, 0x1d, 0x85, 0xbc, 0x0d, 0xf3, 0x47, 0xcf, 0x67, 0x81, - 0x60, 0xe8, 0x84, 0x00, 0x4a, 0x39, 0xe2, 0x6d, 0x35, 0xfd, 0x9f, 0xbc, 0x03, 0x73, 0xa8, 0x60, - 0xe3, 0xc2, 0x84, 0xb8, 0x04, 0x16, 0x7f, 0x1a, 0xd5, 0x6f, 0x26, 0x23, 0xa0, 0xfd, 0x9c, 0xa4, - 0x74, 0xe3, 0xfb, 0x99, 0x50, 0x3c, 0xc5, 0x59, 0xdd, 0xcc, 0xc5, 0xe3, 0x03, 0x87, 0xe7, 0x49, - 0xdb, 0x82, 0x75, 0xb1, 0x6a, 0xc6, 0x22, 0xdc, 0x38, 0xb7, 0x7c, 0xaf, 0xf1, 0xf8, 0x0f, 0x63, - 0x11, 0x72, 0xfc, 0x45, 0x58, 0x0d, 0xc3, 0x23, 0x9b, 0x87, 0x0f, 0x7a, 0x22, 0x32, 0x99, 0x98, - 0xcb, 0x61, 0x78, 0xc4, 0xe2, 0x08, 0xdd, 0x77, 0x4f, 0x28, 0x16, 0xba, 0xf8, 0x26, 0x58, 0x55, - 0x86, 0x15, 0x0d, 0xc3, 0x18, 0x8b, 0x47, 0xbe, 0x82, 0x04, 0x4b, 0xfb, 0x6f, 0x25, 0x58, 0x7c, - 0x48, 0x05, 0x77, 0x54, 0x47, 0xcd, 0x56, 0x6f, 0xdd, 0x81, 0xa5, 0xa6, 0xef, 0x70, 0xa3, 0x23, - 0x7f, 0x61, 0xcc, 0xde, 0x04, 0x0c, 0x7d, 0x47, 0xd8, 0x2f, 0x43, 0x53, 0x46, 0x7a, 0x46, 0xe8, - 0xa7, 0x7b, 0x30, 0xcf, 0x8c, 0xc0, 0x5c, 0xd3, 0x2a, 0xae, 0x6e, 0x71, 0x8d, 0x5e, 0x67, 0xc5, - 0x92, 0x9d, 0x8c, 0x19, 0x92, 0xe5, 0x7b, 0x04, 0xf7, 0xff, 0x97, 0x94, 0x6f, 0x73, 0xa7, 0x53, - 0xbe, 0x49, 0x61, 0xa3, 0xe7, 0x4f, 0x13, 0x36, 0xfa, 0xd2, 0x5d, 0x58, 0x92, 0xea, 0xf3, 0x5c, - 0x37, 0xb9, 0xdf, 0x28, 0xc1, 0x0a, 0xb6, 0x2a, 0x76, 0x2d, 0xfb, 0x9b, 0xa9, 0x4a, 0xfc, 0x66, - 0x4a, 0x95, 0xb8, 0x29, 0x8f, 0x17, 0x6b, 0xd9, 0x0c, 0x1d, 0xe2, 0x3d, 0x58, 0xcf, 0x21, 0x92, - 0xb7, 0x60, 0x8e, 0x56, 0x5f, 0xa8, 0x5e, 0xd4, 0xec, 0x0c, 0x48, 0x52, 0x8c, 0xd0, 0x86, 0x87, - 0x26, 0xc3, 0xd6, 0xfe, 0x97, 0x02, 0xcb, 0x3c, 0x83, 0xe0, 0xe8, 0xc0, 0x7f, 0x66, 0x77, 0xde, - 0xca, 0x76, 0x27, 0x0b, 0x64, 0xc8, 0xbb, 0xf3, 0xff, 0x76, 0x27, 0xde, 0x4d, 0x75, 0xe2, 0x85, - 0x38, 0xe0, 0xb8, 0x68, 0xce, 0x8c, 0x3e, 0xfc, 0x21, 0xa6, 0xe0, 0x48, 0x23, 0x92, 0x5f, 0x83, - 0xc5, 0xb6, 0xfb, 0x34, 0xa5, 0xc1, 0xb8, 0x35, 0x85, 0xe9, 0xeb, 0x31, 0x22, 0x5b, 0x53, 0xec, - 0x5d, 0x8e, 0xfb, 0xd4, 0xce, 0xd9, 0x9f, 0x13, 0x96, 0x97, 0xde, 0x85, 0xd5, 0x34, 0xd9, 0xf3, - 0x4c, 0x7d, 0x1e, 0x0e, 0x05, 0x63, 0x73, 0xfe, 0x56, 0x19, 0x20, 0x89, 0x24, 0x41, 0x17, 0x60, - 0xca, 0xf5, 0x46, 0x18, 0x7f, 0x10, 0x24, 0xcf, 0x71, 0xe1, 0x91, 0x73, 0x8b, 0x1b, 0x29, 0x4a, - 0xd3, 0x03, 0xc2, 0x8f, 0x44, 0x34, 0x1c, 0xe6, 0x66, 0x38, 0x74, 0x98, 0x4b, 0x7e, 0x79, 0xfb, - 0x45, 0xcc, 0xff, 0x11, 0x43, 0x53, 0xd1, 0xba, 0xab, 0xf5, 0x09, 0xcf, 0x3b, 0x84, 0x01, 0x0c, - 0xea, 0x14, 0x21, 0x17, 0x9d, 0xa5, 0xf2, 0x7c, 0xd1, 0x59, 0xba, 0xb0, 0xe8, 0x8d, 0x3e, 0x75, - 0x47, 0x91, 0x1f, 0x9c, 0xa0, 0x65, 0x26, 0x51, 0xf9, 0xd2, 0x2e, 0x68, 0x88, 0x32, 0x36, 0x0e, - 0x28, 0x23, 0xc4, 0xf8, 0xf2, 0x30, 0xc4, 0xc0, 0x38, 0xa6, 0xc4, 0x9c, 0x3a, 0xcf, 0x22, 0x4b, - 0xdc, 0xab, 0x54, 0xab, 0xea, 0xe2, 0xbd, 0x4a, 0x75, 0x51, 0x05, 0x53, 0x32, 0xab, 0xc6, 0x66, - 0x53, 0xc9, 0xd2, 0x99, 0xb6, 0x62, 0x6a, 0x7f, 0x55, 0x02, 0x92, 0xaf, 0x06, 0xf9, 0x26, 0x2c, - 0xb1, 0x0d, 0xd6, 0x0e, 0xc2, 0x4f, 0xf8, 0xbb, 0x24, 0xf6, 0x48, 0x50, 0x02, 0xcb, 0x11, 0x4e, - 0x19, 0xd8, 0x0c, 0x3f, 0x19, 0x92, 0x5f, 0x85, 0xb3, 0xd8, 0xbd, 0x63, 0x37, 0xf0, 0xfc, 0x81, - 0x8d, 0xe9, 0x28, 0x9c, 0x21, 0xcf, 0xdd, 0xfe, 0xda, 0x5f, 0x7c, 0x71, 0xfd, 0x6a, 0x41, 0xf1, - 0x94, 0x61, 0xc0, 0x80, 0x10, 0x5d, 0xc4, 0xec, 0x32, 0x44, 0xd2, 0x03, 0x55, 0xa6, 0x3f, 0x98, - 0x0c, 0x87, 0x7c, 0x64, 0xb7, 0xa8, 0x50, 0x97, 0x2d, 0x9b, 0xc2, 0x78, 0x35, 0x61, 0xbc, 0x33, - 0x19, 0x0e, 0xc9, 0xdb, 0x00, 0xfe, 0xc8, 0x3e, 0xf6, 0xc2, 0x90, 0xd9, 0xfb, 0xe2, 0xb7, 0x6a, - 0x09, 0x54, 0x1e, 0x0c, 0x7f, 0xd4, 0x62, 0x40, 0xf2, 0x77, 0x00, 0x03, 0xa3, 0x61, 0xc4, 0x40, - 0xe6, 0xd3, 0xc6, 0xe5, 0x3c, 0x01, 0x4c, 0x87, 0xd2, 0x39, 0x74, 0x2d, 0xef, 0xdb, 0xe2, 0x49, - 0xdf, 0xb7, 0x60, 0x9d, 0xbb, 0xef, 0x3f, 0xf4, 0xa2, 0x23, 0x7e, 0xdb, 0xfc, 0x32, 0x57, 0x55, - 0xe9, 0xba, 0xf9, 0xa7, 0x15, 0x00, 0xfd, 0xa1, 0x25, 0x82, 0xf1, 0xbe, 0x02, 0x73, 0xf4, 0x0e, - 0x2d, 0x74, 0x71, 0x68, 0xc9, 0x40, 0xbe, 0xb2, 0x25, 0x03, 0x31, 0xe8, 0x6a, 0x34, 0xf1, 0xf5, - 0x8d, 0xd0, 0xc3, 0xe1, 0x6a, 0x64, 0x0f, 0x72, 0x52, 0xc9, 0x50, 0x38, 0x16, 0x69, 0x02, 0x24, - 0xe1, 0x71, 0xf9, 0xad, 0x70, 0x3d, 0x89, 0x33, 0xc9, 0x0b, 0x78, 0x92, 0xb7, 0xe4, 0x89, 0xa5, - 0x3c, 0x7d, 0x12, 0x34, 0x72, 0x1f, 0x2a, 0x3d, 0x27, 0x8e, 0xdc, 0x32, 0x25, 0x68, 0xf0, 0x0d, - 0x9e, 0x5b, 0x3f, 0x09, 0x1c, 0xbc, 0x1a, 0x39, 0x87, 0x72, 0xed, 0x90, 0x09, 0x31, 0x60, 0xbe, - 0xeb, 0x04, 0xce, 0x71, 0x38, 0x2d, 0xd8, 0x3c, 0x2b, 0x15, 0x29, 0x66, 0x10, 0x28, 0xcb, 0x14, - 0xac, 0x98, 0xdc, 0x81, 0xb2, 0x65, 0xb5, 0x78, 0xa8, 0xbc, 0x95, 0x44, 0xe0, 0xb7, 0xac, 0x16, - 0x73, 0x0d, 0x08, 0xc3, 0x63, 0x89, 0x8c, 0x22, 0x93, 0x5f, 0x84, 0x25, 0xe9, 0x3e, 0xc2, 0x83, - 0x4c, 0x62, 0x1f, 0x48, 0xef, 0x3b, 0xe5, 0x4d, 0x43, 0xc2, 0x26, 0x4d, 0x50, 0xef, 0x4f, 0x1e, - 0xbb, 0xfa, 0x78, 0x8c, 0x21, 0x23, 0x3e, 0x75, 0x03, 0x26, 0xc8, 0x55, 0x93, 0xec, 0x2c, 0xf8, - 0x98, 0x6a, 0x20, 0x4a, 0x65, 0x7d, 0x64, 0x96, 0x92, 0x74, 0x61, 0xdd, 0x72, 0xa3, 0xc9, 0x98, - 0x79, 0x69, 0xed, 0xb0, 0x8b, 0x10, 0x0b, 0x49, 0x89, 0x89, 0x2c, 0x42, 0x5a, 0x28, 0x5c, 0xe3, - 0x0e, 0x72, 0x97, 0xa1, 0x3c, 0xb1, 0xe6, 0xca, 0x43, 0x2e, 0x4b, 0xf0, 0xca, 0x0c, 0x09, 0x9e, - 0xca, 0xc7, 0xb9, 0xb0, 0xc9, 0x78, 0x0f, 0x91, 0xc2, 0x26, 0xa7, 0x82, 0x25, 0xff, 0xa0, 0x22, - 0x45, 0xee, 0xe7, 0x63, 0xf1, 0x1e, 0xc0, 0x3d, 0xdf, 0x1b, 0xb5, 0xdc, 0xe8, 0xc8, 0x1f, 0x48, - 0xaf, 0x77, 0x97, 0x3e, 0xf6, 0xbd, 0x91, 0x7d, 0x8c, 0xe0, 0xbf, 0xfa, 0xe2, 0xba, 0x84, 0x64, - 0x4a, 0xff, 0x93, 0xaf, 0xc1, 0x22, 0xfd, 0xd5, 0x4b, 0x7c, 0xcd, 0x98, 0xda, 0x1e, 0xa9, 0x59, - 0xce, 0xbc, 0x04, 0x81, 0xdc, 0xc5, 0x2c, 0x91, 0xde, 0x38, 0x92, 0x84, 0x57, 0x91, 0x12, 0xd2, - 0x1b, 0x47, 0xd9, 0xa7, 0xbb, 0x12, 0x32, 0xd9, 0x8b, 0xab, 0x2e, 0x12, 0xbb, 0xf2, 0x64, 0x94, - 0xfc, 0xfd, 0x2f, 0x16, 0xd9, 0x22, 0x0b, 0x84, 0xfc, 0xfe, 0x37, 0x43, 0x86, 0x95, 0xb0, 0xf6, - 0xea, 0xfc, 0xd6, 0x39, 0x27, 0x55, 0x22, 0x3c, 0x1a, 0xf0, 0x3b, 0x64, 0xaa, 0x12, 0x31, 0x32, - 0xd9, 0x86, 0x35, 0x26, 0xf5, 0xc7, 0x29, 0xe0, 0xb9, 0x88, 0x8b, 0x7b, 0x5b, 0x92, 0x23, 0x5e, - 0xfe, 0x7c, 0x86, 0x80, 0xec, 0xc0, 0x1c, 0x6a, 0x10, 0xf8, 0xe3, 0x9c, 0xcb, 0xb2, 0x26, 0x29, - 0xbb, 0x8e, 0x70, 0x5f, 0x41, 0x1d, 0x92, 0xbc, 0xaf, 0x20, 0x2a, 0xf9, 0x65, 0x00, 0x63, 0x14, - 0xf8, 0xc3, 0x21, 0xe6, 0x29, 0xa9, 0xa6, 0x9e, 0xff, 0x73, 0x3e, 0xc8, 0x25, 0x41, 0xe2, 0x31, - 0xb5, 0xf1, 0xb7, 0x9d, 0xc9, 0x66, 0x22, 0xf1, 0xd2, 0x1a, 0x30, 0xcf, 0x16, 0x23, 0xe6, 0xfc, - 0xe1, 0x99, 0x11, 0xa5, 0x8c, 0x31, 0x2c, 0xe7, 0x0f, 0x87, 0xe7, 0x73, 0xfe, 0x48, 0x04, 0xda, - 0x7d, 0xd8, 0x28, 0x6a, 0x58, 0x4a, 0xe7, 0xa1, 0x9c, 0x56, 0xe7, 0xf1, 0x07, 0x65, 0x58, 0x46, - 0x6e, 0x62, 0x17, 0xd6, 0x61, 0xc5, 0x9a, 0x3c, 0x8e, 0x03, 0xe2, 0x8a, 0xdd, 0x18, 0xeb, 0x17, - 0xca, 0x05, 0xb2, 0x99, 0x37, 0x45, 0x41, 0x0c, 0x58, 0x15, 0x27, 0xc1, 0xae, 0x78, 0xc8, 0x12, - 0xa7, 0xdb, 0x11, 0xef, 0x7b, 0xb8, 0x0f, 0xad, 0xac, 0xd0, 0x48, 0x13, 0x25, 0xe7, 0x41, 0xf9, - 0x79, 0xce, 0x83, 0xca, 0xa9, 0xce, 0x83, 0x8f, 0x60, 0x59, 0x7c, 0x0d, 0x77, 0xf2, 0xb9, 0x2f, - 0xb7, 0x93, 0xa7, 0x98, 0x91, 0x66, 0xbc, 0xa3, 0xcf, 0xcf, 0xdc, 0xd1, 0xd1, 0x76, 0x2e, 0x56, - 0xd9, 0x18, 0x61, 0xf9, 0x8d, 0x5d, 0xfb, 0xf3, 0x32, 0xc0, 0x6e, 0xad, 0xfb, 0x33, 0x9c, 0x92, - 0x6f, 0xc1, 0x62, 0xd3, 0x17, 0x66, 0x53, 0xc9, 0x5e, 0x35, 0x14, 0x40, 0x59, 0x5c, 0x88, 0x31, - 0xe3, 0xd3, 0xad, 0xfc, 0x55, 0x9c, 0x6e, 0x77, 0x51, 0xaf, 0xf3, 0xb1, 0xdb, 0x8f, 0x92, 0xcc, - 0xcf, 0xb8, 0x64, 0x44, 0x3c, 0xbb, 0xb4, 0xd9, 0x4c, 0x42, 0xa6, 0xbb, 0x13, 0xf7, 0xc8, 0x12, - 0x41, 0x2a, 0x78, 0x2a, 0x56, 0xdc, 0x9d, 0x44, 0xa4, 0x0f, 0x11, 0xf7, 0x42, 0xde, 0x1e, 0x32, - 0x64, 0x5f, 0xed, 0x80, 0x90, 0x0f, 0x63, 0x17, 0xda, 0x85, 0x59, 0x3d, 0xa4, 0xe5, 0x7a, 0x68, - 0xaa, 0xe3, 0xac, 0xf6, 0x63, 0x45, 0xce, 0x75, 0xf6, 0x33, 0x0c, 0xf5, 0x3b, 0x00, 0xb1, 0xdf, - 0x8a, 0x18, 0xeb, 0x38, 0x8e, 0x01, 0x83, 0xca, 0xbd, 0x9c, 0xe0, 0x4a, 0xad, 0x29, 0x7f, 0x55, - 0xad, 0xe9, 0xc1, 0x52, 0xe7, 0x49, 0xe4, 0x24, 0x8e, 0x4e, 0x60, 0xc5, 0x92, 0x2c, 0xee, 0x4c, - 0x65, 0x54, 0xcb, 0x9d, 0x93, 0xe4, 0xe0, 0x29, 0x22, 0xb0, 0x44, 0xa8, 0xfd, 0xb5, 0x02, 0x6b, - 0x72, 0x88, 0xa2, 0x93, 0x51, 0x9f, 0xbc, 0xcf, 0x52, 0x2f, 0x28, 0xa9, 0x2b, 0x8b, 0x84, 0x44, - 0xb7, 0xdc, 0x93, 0x51, 0x9f, 0x09, 0x40, 0xce, 0x53, 0xb9, 0xb2, 0x94, 0x90, 0x3c, 0x86, 0xe5, - 0xae, 0x3f, 0x1c, 0x52, 0xb1, 0x26, 0xf8, 0x94, 0x5f, 0x00, 0x28, 0xa3, 0xac, 0xf5, 0x4c, 0x54, - 0x68, 0xfb, 0x05, 0x7e, 0xcf, 0xbd, 0x30, 0xa6, 0xfb, 0xbd, 0xc7, 0xe9, 0x12, 0xb6, 0x9f, 0xe3, - 0x4b, 0x55, 0x99, 0x67, 0x72, 0x36, 0xa5, 0x73, 0x76, 0xc9, 0xb5, 0xa4, 0xc5, 0x58, 0xcf, 0x19, - 0x67, 0x93, 0xf6, 0xf7, 0x15, 0xb8, 0x91, 0x6f, 0x5a, 0x6d, 0xe8, 0x4f, 0x06, 0xbd, 0xc0, 0xf1, - 0x86, 0x4d, 0xff, 0x30, 0x64, 0x21, 0xeb, 0x0f, 0x13, 0x0d, 0x35, 0x0f, 0x59, 0x7f, 0xe8, 0x65, - 0x43, 0xd6, 0xe3, 0xd3, 0xf5, 0x37, 0xa1, 0x6a, 0x7d, 0x68, 0x7d, 0x38, 0x71, 0xc5, 0x5d, 0x98, - 0xed, 0x0f, 0xe1, 0x27, 0xa1, 0xfd, 0x09, 0x05, 0xca, 0x27, 0x86, 0x40, 0xd4, 0xfe, 0x7d, 0x09, - 0x48, 0xbe, 0x1e, 0xf2, 0x16, 0xac, 0xfc, 0x3f, 0x10, 0xc9, 0x33, 0xa2, 0x6c, 0xe5, 0xb9, 0x44, - 0xd9, 0x4f, 0x40, 0xed, 0xd3, 0x7e, 0xb4, 0x23, 0xda, 0x91, 0xf6, 0xd0, 0x8f, 0x4f, 0x84, 0x5f, - 0x98, 0x3a, 0xa7, 0xd2, 0x1d, 0xcf, 0xf6, 0xa4, 0x2c, 0x13, 0xf9, 0x70, 0xeb, 0xa7, 0xf0, 0xb5, - 0xdf, 0x57, 0x60, 0xa3, 0x68, 0x0a, 0xd0, 0xc3, 0x53, 0x3e, 0x4d, 0xe3, 0xb3, 0x1c, 0x0f, 0x4f, - 0xf9, 0x00, 0x4e, 0x9f, 0xe8, 0x19, 0xa2, 0x6c, 0x7f, 0x94, 0x9e, 0xa7, 0x3f, 0xb4, 0xff, 0x5a, - 0x86, 0x65, 0x66, 0xd4, 0xdc, 0x73, 0x9d, 0x61, 0x74, 0x44, 0x07, 0x57, 0xe4, 0xa0, 0x94, 0x5c, - 0x5f, 0x67, 0x24, 0x9f, 0xbc, 0x83, 0xe9, 0xfe, 0x23, 0xbf, 0xef, 0x0f, 0x65, 0xa5, 0xe0, 0x98, - 0xc3, 0x32, 0xd9, 0xfe, 0x11, 0x46, 0xe7, 0x2e, 0x4f, 0x29, 0x50, 0x4e, 0xe6, 0x2e, 0x33, 0x74, - 0xcb, 0x73, 0x97, 0x1b, 0x95, 0x3f, 0x83, 0xb3, 0x89, 0x9d, 0x3a, 0xb6, 0x6e, 0x9f, 0xe2, 0x55, - 0xd1, 0x16, 0x7f, 0x55, 0x74, 0x2d, 0x31, 0x7d, 0xa3, 0xcd, 0x1e, 0x4b, 0x33, 0x79, 0x18, 0x8a, - 0x3e, 0x41, 0xee, 0x83, 0x9a, 0x80, 0x79, 0x82, 0x08, 0x26, 0xf1, 0x62, 0xf0, 0x26, 0x89, 0x6d, - 0x2e, 0x57, 0x44, 0x8e, 0x90, 0x1e, 0x72, 0x09, 0xcc, 0x48, 0x9e, 0x95, 0x09, 0xf3, 0x4f, 0xcc, - 0x0b, 0x5f, 0x0f, 0xc9, 0x87, 0x5c, 0x86, 0x8c, 0x8e, 0x91, 0xc8, 0x6b, 0xb2, 0x90, 0x8c, 0x11, - 0x7f, 0x8f, 0x2f, 0x8f, 0x11, 0xc7, 0xda, 0xfa, 0x9e, 0x02, 0x6b, 0x0d, 0xbd, 0xc5, 0x73, 0x18, - 0xb2, 0x5e, 0xbd, 0x09, 0x57, 0x1b, 0x7a, 0xcb, 0xee, 0x76, 0x9a, 0x8d, 0xda, 0x23, 0xbb, 0x30, - 0x35, 0xd1, 0x55, 0xb8, 0x98, 0x47, 0x49, 0x4c, 0xfa, 0x57, 0x60, 0x33, 0x5f, 0x2c, 0xd2, 0x17, - 0x15, 0x13, 0x8b, 0x4c, 0x47, 0xe5, 0xad, 0x0f, 0x60, 0x4d, 0xa4, 0xea, 0xe9, 0x35, 0x2d, 0x4c, - 0x06, 0xb8, 0x06, 0x4b, 0x0f, 0x0c, 0xb3, 0xb1, 0xf3, 0xc8, 0xde, 0xd9, 0x6f, 0x36, 0xd5, 0x33, - 0x64, 0x05, 0x16, 0x39, 0xa0, 0xa6, 0xab, 0x0a, 0x59, 0x86, 0x6a, 0xa3, 0x6d, 0x19, 0xb5, 0x7d, - 0xd3, 0x50, 0x4b, 0x5b, 0xff, 0x42, 0x81, 0x95, 0xfd, 0xf1, 0xc0, 0x89, 0xdc, 0x80, 0xb7, 0xe8, - 0x1a, 0x5c, 0xda, 0xef, 0xd6, 0xf5, 0x9e, 0x61, 0x16, 0x37, 0xe7, 0x1c, 0xac, 0x67, 0xca, 0x3b, - 0xf7, 0x55, 0x85, 0x5c, 0x86, 0x0b, 0x19, 0x70, 0xbd, 0x61, 0xe9, 0xdb, 0xac, 0x15, 0x17, 0xe1, - 0x5c, 0xa6, 0xb0, 0xdb, 0x68, 0xb7, 0x8d, 0xba, 0x5a, 0xa6, 0x0d, 0xcc, 0x7d, 0xce, 0x34, 0xf4, - 0x3a, 0x25, 0x55, 0x2b, 0x5b, 0x1f, 0xc0, 0x6a, 0x37, 0x7e, 0xa7, 0x80, 0x1e, 0x03, 0x0b, 0x50, - 0x36, 0xf5, 0x87, 0xea, 0x19, 0x02, 0x30, 0xdf, 0xbd, 0x5f, 0xb3, 0x6e, 0xdf, 0x56, 0x15, 0xb2, - 0x04, 0x0b, 0xbb, 0xb5, 0xae, 0x7d, 0xbf, 0x65, 0xa9, 0x25, 0xfa, 0x43, 0x7f, 0x68, 0xe1, 0x8f, - 0xf2, 0xd6, 0x1b, 0x68, 0xe5, 0xfb, 0xec, 0xa4, 0xe9, 0x85, 0x91, 0x3b, 0x72, 0x03, 0xec, 0xa3, - 0x65, 0xa8, 0x5a, 0x2e, 0x95, 0x57, 0x22, 0x97, 0x75, 0x50, 0x6b, 0x32, 0x8c, 0xbc, 0xf1, 0xd0, - 0xfd, 0x4c, 0x55, 0xb6, 0xee, 0xc2, 0x9a, 0xe9, 0x4f, 0x22, 0x6f, 0x74, 0x68, 0x45, 0x14, 0xe3, - 0xf0, 0x04, 0xdb, 0xdc, 0xd6, 0x5b, 0xdb, 0x8d, 0xdd, 0xfd, 0xce, 0xbe, 0x65, 0xb7, 0xf4, 0x5e, - 0x6d, 0x8f, 0xf9, 0x2b, 0xb4, 0x3a, 0x56, 0xcf, 0x36, 0x8d, 0x9a, 0xd1, 0xee, 0xa9, 0xca, 0xd6, - 0xef, 0xa2, 0x06, 0xb7, 0xef, 0x8f, 0x06, 0x3b, 0x4e, 0x3f, 0xf2, 0x03, 0xac, 0xb0, 0x06, 0xd7, - 0x2c, 0xa3, 0xd6, 0x69, 0xd7, 0xed, 0x1d, 0xbd, 0xd6, 0xeb, 0x98, 0x45, 0xb9, 0xbb, 0x2e, 0xc1, - 0xf9, 0x02, 0x9c, 0x4e, 0xaf, 0xab, 0x2a, 0xe4, 0x3a, 0x5c, 0x2e, 0x28, 0x7b, 0x68, 0x6c, 0xeb, - 0xfb, 0xbd, 0xbd, 0xb6, 0x5a, 0x9a, 0x42, 0x6c, 0x59, 0x1d, 0xb5, 0xbc, 0xf5, 0xdb, 0x0a, 0xac, - 0xee, 0x87, 0xfc, 0x79, 0xd4, 0x3e, 0x46, 0x95, 0xb8, 0x01, 0x57, 0xf6, 0x2d, 0xc3, 0xb4, 0x7b, - 0x9d, 0xfb, 0x46, 0xdb, 0xde, 0xb7, 0xf4, 0xdd, 0x6c, 0x6d, 0xae, 0xc3, 0x65, 0x09, 0xc3, 0x34, - 0x6a, 0x9d, 0x07, 0x86, 0x69, 0x77, 0x75, 0xcb, 0x7a, 0xd8, 0x31, 0xeb, 0xaa, 0x42, 0xbf, 0x58, - 0x80, 0xd0, 0xda, 0xd1, 0x59, 0x6d, 0x52, 0x65, 0x6d, 0xe3, 0xa1, 0xde, 0xb4, 0xb7, 0x3b, 0x3d, - 0xb5, 0xbc, 0xd5, 0xa2, 0xb7, 0x08, 0xcc, 0xa0, 0xc3, 0x5c, 0xdc, 0xab, 0x50, 0x69, 0x77, 0xda, - 0x46, 0xd6, 0xcb, 0x65, 0x19, 0xaa, 0x7a, 0xb7, 0x6b, 0x76, 0x1e, 0xe0, 0xe4, 0x01, 0x98, 0xaf, - 0x1b, 0xed, 0x06, 0xce, 0x96, 0x65, 0xa8, 0x76, 0xcd, 0x4e, 0xab, 0xd3, 0x33, 0xea, 0x6a, 0x65, - 0xcb, 0x14, 0x07, 0xab, 0x60, 0xda, 0xf7, 0x99, 0x4b, 0x49, 0xdd, 0xd8, 0xd1, 0xf7, 0x9b, 0x3d, - 0x3e, 0x44, 0x8f, 0x6c, 0xd3, 0xf8, 0x70, 0xdf, 0xb0, 0x7a, 0x96, 0xaa, 0x10, 0x15, 0x96, 0xdb, - 0x86, 0x51, 0xb7, 0x6c, 0xd3, 0x78, 0xd0, 0x30, 0x1e, 0xaa, 0x25, 0xca, 0x93, 0xfd, 0x4f, 0xbf, - 0xb0, 0xf5, 0x03, 0x05, 0x08, 0xcb, 0x3e, 0x24, 0x52, 0xda, 0xe2, 0x8c, 0xb9, 0x06, 0x97, 0xf6, - 0xe8, 0x50, 0x63, 0xd3, 0x5a, 0x9d, 0x7a, 0xb6, 0xcb, 0xce, 0x03, 0xc9, 0x94, 0x77, 0x76, 0x76, - 0x70, 0x59, 0x9c, 0xcd, 0xc0, 0xeb, 0x66, 0xa7, 0xab, 0x96, 0x2e, 0x95, 0xaa, 0x0a, 0xb9, 0x90, - 0x2b, 0xbc, 0x6f, 0x18, 0x5d, 0xb5, 0x4c, 0x87, 0x28, 0x53, 0x20, 0x96, 0x2c, 0x23, 0xaf, 0x6c, - 0x7d, 0x57, 0x81, 0xf3, 0xac, 0x9a, 0x62, 0xfd, 0xc7, 0x55, 0xbd, 0x02, 0x9b, 0x3c, 0xa7, 0x5a, - 0x51, 0x45, 0x37, 0x40, 0x4d, 0x95, 0xb2, 0x6a, 0x9e, 0x83, 0xf5, 0x14, 0x14, 0xeb, 0x51, 0xa2, - 0xbb, 0x5b, 0x0a, 0xbc, 0x6d, 0x58, 0x3d, 0xdb, 0xd8, 0xd9, 0xe9, 0x98, 0x3d, 0x56, 0x91, 0xf2, - 0x96, 0x06, 0xeb, 0x35, 0x37, 0x88, 0x8c, 0xcf, 0x22, 0x77, 0x14, 0x7a, 0xfe, 0x08, 0xab, 0xb0, - 0x02, 0x8b, 0xc6, 0x2f, 0xf7, 0x8c, 0xb6, 0xd5, 0xe8, 0xb4, 0xd5, 0x33, 0x5b, 0x57, 0x32, 0x38, - 0x62, 0x1d, 0x5b, 0xd6, 0x9e, 0x7a, 0x66, 0xcb, 0x81, 0x15, 0xf1, 0x02, 0x88, 0xcd, 0x8a, 0x6b, - 0x70, 0x49, 0xcc, 0x35, 0xdc, 0x13, 0xb2, 0x4d, 0xd8, 0x84, 0x8d, 0x7c, 0xb9, 0xd1, 0x53, 0x15, - 0x3a, 0x0a, 0x99, 0x12, 0x0a, 0x2f, 0x6d, 0xfd, 0xa6, 0x02, 0x2b, 0xb1, 0xb1, 0x16, 0x8d, 0x41, - 0xd7, 0xe1, 0x72, 0x6b, 0x47, 0xb7, 0xeb, 0xc6, 0x83, 0x46, 0xcd, 0xb0, 0xef, 0x37, 0xda, 0xf5, - 0xcc, 0x47, 0x2e, 0xc2, 0xb9, 0x02, 0x04, 0xfc, 0xca, 0x26, 0x6c, 0x64, 0x8b, 0x7a, 0x74, 0xa9, - 0x96, 0x68, 0xd7, 0x67, 0x4b, 0xe2, 0x75, 0x5a, 0xde, 0x7a, 0x00, 0xab, 0x96, 0xde, 0x6a, 0xee, - 0xf8, 0x41, 0xdf, 0xd5, 0x27, 0xd1, 0xd1, 0x88, 0x6e, 0x9a, 0x3b, 0x1d, 0xb3, 0x66, 0xd8, 0x88, - 0x92, 0xa9, 0xc1, 0x59, 0x58, 0x93, 0x0b, 0x1f, 0x19, 0x74, 0xfa, 0x12, 0x58, 0x95, 0x81, 0xed, - 0x8e, 0x5a, 0xda, 0xfa, 0x15, 0x58, 0x4e, 0x65, 0xb6, 0xbf, 0x00, 0x67, 0xe5, 0xdf, 0x5d, 0x77, - 0x34, 0xf0, 0x46, 0x87, 0xea, 0x99, 0x6c, 0x81, 0x39, 0x19, 0x8d, 0x68, 0x01, 0xae, 0x67, 0xb9, - 0xa0, 0xe7, 0x06, 0xc7, 0xde, 0xc8, 0x89, 0xdc, 0x81, 0x5a, 0xda, 0x7a, 0x1d, 0x56, 0x52, 0xf9, - 0xb4, 0xe8, 0xc0, 0x35, 0x3b, 0x7c, 0x03, 0x6e, 0x19, 0xf5, 0xc6, 0x7e, 0x4b, 0x9d, 0xa3, 0x2b, - 0x79, 0xaf, 0xb1, 0xbb, 0xa7, 0xc2, 0xd6, 0xef, 0x29, 0xb0, 0xca, 0xb3, 0xe4, 0xb6, 0x76, 0x74, - 0x31, 0xd4, 0x74, 0x9a, 0xb1, 0x2c, 0x7d, 0x86, 0x65, 0x31, 0xe7, 0xae, 0x2b, 0xb0, 0xc9, 0x7f, - 0xd8, 0x7a, 0xbb, 0x6e, 0xef, 0xe9, 0x66, 0xfd, 0xa1, 0x6e, 0xd2, 0xb9, 0xf7, 0x48, 0x2d, 0xe1, - 0x82, 0x92, 0x20, 0x76, 0xaf, 0xb3, 0x5f, 0xdb, 0x53, 0xcb, 0x74, 0xfe, 0xa6, 0xe0, 0xdd, 0x46, - 0x5b, 0xad, 0xe0, 0xf2, 0xcc, 0x61, 0x23, 0x5b, 0x5a, 0x3e, 0xb7, 0xf5, 0x53, 0x05, 0x2e, 0x58, - 0xde, 0xe1, 0xc8, 0x89, 0x26, 0x81, 0xab, 0x0f, 0x0f, 0xfd, 0xc0, 0x8b, 0x8e, 0x8e, 0xad, 0x89, - 0x17, 0xb9, 0xe4, 0x15, 0x78, 0xc9, 0x6a, 0xec, 0xb6, 0xf5, 0x1e, 0x5d, 0x5e, 0x7a, 0x73, 0xb7, - 0x63, 0x36, 0x7a, 0x7b, 0x2d, 0xdb, 0xda, 0x6f, 0xe4, 0x66, 0xde, 0x8b, 0x70, 0x63, 0x3a, 0x6a, - 0xd3, 0xd8, 0xd5, 0x6b, 0x8f, 0x54, 0x65, 0x36, 0xc3, 0x6d, 0xbd, 0xa9, 0xb7, 0x6b, 0x46, 0xdd, - 0x7e, 0x70, 0x5b, 0x2d, 0x91, 0x97, 0xe0, 0xe6, 0x74, 0xd4, 0x9d, 0x46, 0xd7, 0xa2, 0x68, 0xe5, - 0xd9, 0xdf, 0xdd, 0xb3, 0x5a, 0x14, 0xab, 0xb2, 0xf5, 0xfb, 0x0a, 0x6c, 0x4e, 0x8b, 0x8a, 0x4b, - 0x6e, 0x81, 0x66, 0xb4, 0x7b, 0xa6, 0xde, 0xa8, 0xdb, 0x35, 0xd3, 0xa8, 0x1b, 0xed, 0x5e, 0x43, - 0x6f, 0x5a, 0xb6, 0xd5, 0xd9, 0xa7, 0xb3, 0x29, 0xf1, 0xc1, 0x7b, 0x01, 0xae, 0xcf, 0xc0, 0xeb, - 0x34, 0xea, 0x35, 0x55, 0x21, 0xb7, 0xe1, 0xb5, 0x19, 0x48, 0xd6, 0x23, 0xab, 0x67, 0xb4, 0xe4, - 0x12, 0xb5, 0x84, 0x1b, 0x56, 0x71, 0x40, 0x50, 0xda, 0x3a, 0x2c, 0x99, 0x5d, 0xb1, 0x9b, 0x70, - 0x75, 0x2a, 0x16, 0xaf, 0xd6, 0x0b, 0x70, 0x7d, 0x2a, 0x0a, 0xab, 0x94, 0x5a, 0xda, 0xfa, 0x08, - 0x2e, 0x4d, 0x0f, 0x5e, 0x47, 0xcf, 0x8b, 0xf4, 0x90, 0x57, 0xa1, 0x52, 0xa7, 0x47, 0x54, 0x2a, - 0xab, 0x24, 0x9d, 0x9d, 0xa6, 0xd1, 0x68, 0x75, 0xe9, 0x46, 0xc8, 0x0f, 0x17, 0x3c, 0x3d, 0xbe, - 0xa3, 0x80, 0x9a, 0x8d, 0xf8, 0x94, 0x73, 0xe7, 0x34, 0xf7, 0xdb, 0x6d, 0x76, 0xd0, 0xad, 0xc1, - 0x52, 0xa7, 0xb7, 0x67, 0x98, 0x3c, 0x61, 0x27, 0x66, 0xe8, 0xdc, 0x6f, 0xd3, 0xa5, 0xdd, 0x31, - 0x1b, 0xdf, 0xc2, 0x13, 0x6f, 0x13, 0x36, 0xac, 0xa6, 0x5e, 0xbb, 0x6f, 0xb7, 0x3b, 0x3d, 0xbb, - 0xd1, 0xb6, 0x6b, 0x7b, 0x7a, 0xbb, 0x6d, 0x34, 0x55, 0xa0, 0x7b, 0x76, 0xe7, 0x7e, 0x4f, 0xb7, - 0x6b, 0x9d, 0xf6, 0x4e, 0x63, 0x97, 0xb3, 0xd8, 0xc0, 0x59, 0x30, 0x2d, 0x80, 0x01, 0xf9, 0x1a, - 0xbc, 0x8c, 0x34, 0xdd, 0xe6, 0xfe, 0x6e, 0xa3, 0x6d, 0x5b, 0x8f, 0xda, 0x35, 0x21, 0x76, 0xd5, - 0xf2, 0x67, 0xc5, 0xcb, 0xf0, 0xe2, 0x4c, 0xec, 0x24, 0xe3, 0xe6, 0x2d, 0xd0, 0x66, 0x62, 0xf2, - 0xf6, 0x6d, 0xfd, 0x89, 0x02, 0x97, 0x67, 0x38, 0xdd, 0x90, 0xd7, 0xe0, 0x95, 0x3d, 0x43, 0xaf, - 0x37, 0x0d, 0xcb, 0xc2, 0x1d, 0x8e, 0x0e, 0x22, 0xf3, 0x06, 0x2d, 0x3c, 0x09, 0x5e, 0x81, 0x97, - 0x66, 0xa3, 0x27, 0x32, 0xc5, 0xcb, 0xf0, 0xe2, 0x6c, 0x54, 0x2e, 0x63, 0x94, 0xc8, 0x16, 0xdc, - 0x9a, 0x8d, 0x19, 0xcb, 0x26, 0xe5, 0xad, 0xdf, 0x51, 0xe0, 0x7c, 0xb1, 0x9e, 0x9b, 0xd6, 0xad, - 0xd1, 0xb6, 0x7a, 0x7a, 0xb3, 0x69, 0x77, 0x75, 0x53, 0x6f, 0xd9, 0x46, 0xdb, 0xec, 0x34, 0x9b, - 0x45, 0x67, 0xf2, 0x8b, 0x70, 0x63, 0x3a, 0xaa, 0x55, 0x33, 0x1b, 0x5d, 0x7a, 0xec, 0x68, 0x70, - 0x6d, 0x3a, 0x96, 0xd1, 0xa8, 0x19, 0x6a, 0x69, 0xfb, 0xbd, 0x3f, 0xfe, 0xf3, 0x6b, 0x67, 0xfe, - 0xf8, 0xa7, 0xd7, 0x94, 0xff, 0xf8, 0xd3, 0x6b, 0xca, 0x9f, 0xfd, 0xf4, 0x9a, 0xf2, 0xad, 0x57, - 0x4f, 0x97, 0xac, 0x1a, 0x6f, 0xed, 0x8f, 0xe7, 0xf1, 0xfa, 0xf7, 0xe6, 0xff, 0x09, 0x00, 0x00, - 0xff, 0xff, 0x7e, 0x4e, 0x71, 0x5d, 0xf5, 0xe0, 0x01, 0x00, + 0x34, 0x48, 0x80, 0x04, 0xc9, 0x9e, 0x6a, 0x80, 0xdc, 0xd5, 0xee, 0x6c, 0x6d, 0xa1, 0x3b, 0x01, + 0xd4, 0xa0, 0xbb, 0xaa, 0xb7, 0xaa, 0x9a, 0x24, 0xb4, 0xd6, 0xcf, 0x92, 0xa5, 0xfd, 0xc9, 0x0a, + 0x9d, 0x24, 0x4b, 0x96, 0xac, 0xf5, 0x85, 0xad, 0x70, 0xc8, 0xf6, 0x9d, 0xcf, 0x0e, 0xe9, 0x6c, + 0xc9, 0xbe, 0xf3, 0x85, 0x42, 0xf2, 0xea, 0xce, 0x96, 0x75, 0x8e, 0x8b, 0x93, 0xc2, 0xe7, 0xfb, + 0xda, 0x50, 0x40, 0xe1, 0xd3, 0xc5, 0xfd, 0x81, 0x88, 0x8b, 0x93, 0xee, 0x22, 0x2e, 0xe2, 0x56, + 0xa1, 0xf3, 0x45, 0xbe, 0xcc, 0xac, 0xca, 0xac, 0xaa, 0x6e, 0x34, 0x67, 0x38, 0xb2, 0x38, 0xa1, + 0x7f, 0x48, 0x74, 0xe6, 0x7b, 0x2f, 0x2b, 0xbf, 0x5e, 0xbe, 0x7c, 0xf9, 0x3e, 0xe0, 0x85, 0x90, + 0xb6, 0x69, 0xd7, 0xf3, 0xc3, 0xcb, 0x6d, 0xba, 0x6b, 0x37, 0x0f, 0x2e, 0x87, 0x07, 0x5d, 0x1a, + 0xf0, 0x7f, 0x2f, 0x75, 0x7d, 0x2f, 0xf4, 0xc8, 0x28, 0xfe, 0x58, 0x9c, 0xdf, 0xf5, 0x76, 0x3d, + 0x2c, 0xb9, 0xcc, 0xfe, 0xe2, 0x95, 0x8b, 0xcf, 0xef, 0x7a, 0xde, 0x6e, 0x9b, 0x5e, 0xc6, 0x5f, + 0xdb, 0xbd, 0x9d, 0xcb, 0xad, 0x9e, 0x6f, 0x87, 0x8e, 0xe7, 0x8a, 0xfa, 0x4a, 0xb2, 0x3e, 0x74, + 0x3a, 0x34, 0x08, 0xed, 0x4e, 0xb7, 0x1f, 0x81, 0x87, 0xbe, 0xdd, 0xed, 0x52, 0x5f, 0xb4, 0xbe, + 0x78, 0x21, 0xfa, 0x40, 0x3b, 0x0c, 0x19, 0x26, 0x23, 0x7e, 0xf9, 0xc1, 0x15, 0xf5, 0xa7, 0x00, + 0xbd, 0xd6, 0xa7, 0x2f, 0x7e, 0x2f, 0x08, 0x69, 0xcb, 0x6a, 0xd1, 0x07, 0x4e, 0x93, 0x5a, 0x3e, + 0xfd, 0x46, 0xcf, 0xf1, 0x69, 0x87, 0xba, 0xa1, 0xc0, 0xbb, 0x98, 0x8d, 0x27, 0x3f, 0x24, 0xf1, + 0x45, 0xc6, 0x2f, 0x14, 0x60, 0xe2, 0x16, 0xa5, 0xdd, 0x6a, 0xdb, 0x79, 0x40, 0xc9, 0x8b, 0x30, + 0x72, 0xc7, 0xee, 0xd0, 0x85, 0xdc, 0xd9, 0xdc, 0xf9, 0x89, 0xe5, 0x99, 0xa3, 0xc3, 0xca, 0x64, + 0x40, 0xfd, 0x07, 0xd4, 0xb7, 0x5c, 0xbb, 0x43, 0x4d, 0xac, 0x24, 0xaf, 0xc1, 0x04, 0xfb, 0x3f, + 0xe8, 0xda, 0x4d, 0xba, 0x90, 0x47, 0xc8, 0xa9, 0xa3, 0xc3, 0xca, 0x84, 0x2b, 0x0b, 0xcd, 0xb8, + 0x9e, 0xac, 0xc3, 0xf8, 0xea, 0xa3, 0xae, 0xe3, 0xd3, 0x60, 0x61, 0xe4, 0x6c, 0xee, 0xfc, 0xe4, + 0xd2, 0xe2, 0x25, 0x3e, 0x46, 0x97, 0xe4, 0x18, 0x5d, 0xda, 0x94, 0x83, 0xb8, 0x3c, 0xf7, 0xdb, + 0x87, 0x95, 0x67, 0x8e, 0x0e, 0x2b, 0xe3, 0x94, 0xa3, 0xfc, 0x95, 0xdf, 0xaf, 0xe4, 0x4c, 0x89, + 0x4f, 0xde, 0x86, 0x91, 0xcd, 0x83, 0x2e, 0x5d, 0x98, 0x38, 0x9b, 0x3b, 0x3f, 0xbd, 0xf4, 0xfc, + 0x25, 0x3e, 0xad, 0xd1, 0xc7, 0xc7, 0x7f, 0x31, 0xa8, 0xe5, 0xe2, 0xd1, 0x61, 0x65, 0x84, 0x81, + 0x98, 0x88, 0x45, 0x2e, 0xc2, 0xd8, 0x9a, 0x17, 0x84, 0xeb, 0xb5, 0x05, 0xc0, 0x4f, 0x3e, 0x71, + 0x74, 0x58, 0x99, 0xdd, 0xf3, 0x82, 0xd0, 0x72, 0x5a, 0xaf, 0x7b, 0x1d, 0x27, 0xa4, 0x9d, 0x6e, + 0x78, 0x60, 0x0a, 0x20, 0xe3, 0x11, 0x4c, 0x69, 0xf4, 0xc8, 0x24, 0x8c, 0x6f, 0xdd, 0xb9, 0x75, + 0xe7, 0xee, 0xfd, 0x3b, 0xe5, 0x67, 0x48, 0x11, 0x46, 0xee, 0xdc, 0xad, 0xad, 0x96, 0x73, 0x64, + 0x1c, 0x0a, 0xd5, 0x7a, 0xbd, 0x9c, 0x27, 0x25, 0x28, 0xd6, 0xaa, 0x9b, 0xd5, 0xe5, 0x6a, 0x63, + 0xb5, 0x5c, 0x20, 0x73, 0x30, 0x73, 0x7f, 0xfd, 0x4e, 0xed, 0xee, 0xfd, 0x86, 0x55, 0x5b, 0x6d, + 0xdc, 0xda, 0xbc, 0x5b, 0x2f, 0x8f, 0x90, 0x69, 0x80, 0x5b, 0x5b, 0xcb, 0xab, 0xe6, 0x9d, 0xd5, + 0xcd, 0xd5, 0x46, 0x79, 0x94, 0xcc, 0x43, 0x59, 0xa2, 0x58, 0x8d, 0x55, 0xf3, 0xde, 0xfa, 0xca, + 0x6a, 0x79, 0xec, 0xe6, 0x48, 0xb1, 0x50, 0x1e, 0x31, 0xc7, 0x37, 0xa8, 0x1d, 0xd0, 0xf5, 0x9a, + 0xf1, 0xb7, 0x0b, 0x50, 0xbc, 0x4d, 0x43, 0xbb, 0x65, 0x87, 0x36, 0x79, 0x4e, 0x9b, 0x1f, 0xec, + 0xa2, 0x32, 0x31, 0x2f, 0xa6, 0x27, 0x66, 0xf4, 0xe8, 0xb0, 0x92, 0xbb, 0xa8, 0x4e, 0xc8, 0x5b, + 0x30, 0x59, 0xa3, 0x41, 0xd3, 0x77, 0xba, 0x6c, 0xb1, 0x2d, 0x14, 0x10, 0xec, 0xf4, 0xd1, 0x61, + 0xe5, 0x44, 0x2b, 0x2e, 0x56, 0x06, 0x44, 0x85, 0x26, 0xeb, 0x30, 0xb6, 0x61, 0x6f, 0xd3, 0x76, + 0xb0, 0x30, 0x7a, 0xb6, 0x70, 0x7e, 0x72, 0xe9, 0x59, 0x31, 0x09, 0xf2, 0x03, 0x2f, 0xf1, 0xda, + 0x55, 0x37, 0xf4, 0x0f, 0x96, 0xe7, 0x8f, 0x0e, 0x2b, 0xe5, 0x36, 0x16, 0xa8, 0x03, 0xcc, 0x41, + 0x48, 0x23, 0x5e, 0x18, 0x63, 0xc7, 0x2e, 0x8c, 0x33, 0xbf, 0x7d, 0x58, 0xc9, 0xb1, 0x09, 0x13, + 0x0b, 0x23, 0xa6, 0xa7, 0x2f, 0x91, 0x25, 0x28, 0x9a, 0xf4, 0x81, 0x13, 0xb0, 0x9e, 0x15, 0xb1, + 0x67, 0x27, 0x8f, 0x0e, 0x2b, 0xc4, 0x17, 0x65, 0xca, 0x67, 0x44, 0x70, 0x8b, 0x6f, 0xc2, 0xa4, + 0xf2, 0xd5, 0xa4, 0x0c, 0x85, 0x7d, 0x7a, 0xc0, 0x47, 0xd8, 0x64, 0x7f, 0x92, 0x79, 0x18, 0x7d, + 0x60, 0xb7, 0x7b, 0x62, 0x48, 0x4d, 0xfe, 0xe3, 0x0b, 0xf9, 0xcf, 0xe7, 0x6e, 0x8e, 0x14, 0xc7, + 0xcb, 0x45, 0x33, 0xbf, 0x5e, 0x33, 0x7e, 0x66, 0x04, 0x8a, 0xa6, 0xc7, 0x37, 0x30, 0xb9, 0x00, + 0xa3, 0x8d, 0xd0, 0x0e, 0xe5, 0x34, 0xcd, 0x1d, 0x1d, 0x56, 0x66, 0xd8, 0xe6, 0xa6, 0x4a, 0xfb, + 0x1c, 0x82, 0x81, 0xd6, 0xf7, 0xec, 0x40, 0x4e, 0x17, 0x82, 0x76, 0x59, 0x81, 0x0a, 0x8a, 0x10, + 0xe4, 0x1c, 0x8c, 0xdc, 0xf6, 0x5a, 0x54, 0xcc, 0x18, 0x39, 0x3a, 0xac, 0x4c, 0x77, 0xbc, 0x96, + 0x0a, 0x88, 0xf5, 0xe4, 0x75, 0x98, 0x58, 0xe9, 0xf9, 0x3e, 0x75, 0xd9, 0x5a, 0x1f, 0x41, 0xe0, + 0xe9, 0xa3, 0xc3, 0x0a, 0x34, 0x79, 0xa1, 0xe5, 0xb4, 0xcc, 0x18, 0x80, 0x4d, 0x43, 0x23, 0xb4, + 0xfd, 0x90, 0xb6, 0x16, 0x46, 0x87, 0x9a, 0x06, 0xb6, 0x3f, 0x67, 0x03, 0x8e, 0x92, 0x9c, 0x06, + 0x41, 0x89, 0xac, 0xc1, 0xe4, 0x0d, 0xdf, 0x6e, 0xd2, 0x3a, 0xf5, 0x1d, 0xaf, 0x85, 0xf3, 0x5b, + 0x58, 0x3e, 0x77, 0x74, 0x58, 0x39, 0xb9, 0xcb, 0x8a, 0xad, 0x2e, 0x96, 0xc7, 0xd8, 0xdf, 0x3b, + 0xac, 0x14, 0x6b, 0x82, 0xd5, 0x9a, 0x2a, 0x2a, 0xf9, 0x3a, 0x9b, 0x9c, 0x20, 0xc4, 0xa1, 0xa5, + 0xad, 0x85, 0xf1, 0x63, 0x3f, 0xd1, 0x10, 0x9f, 0x78, 0xb2, 0x6d, 0x07, 0xa1, 0xe5, 0x73, 0xbc, + 0xc4, 0x77, 0xaa, 0x24, 0xc9, 0x5d, 0x28, 0x36, 0x9a, 0x7b, 0xb4, 0xd5, 0x6b, 0x53, 0x5c, 0x32, + 0x93, 0x4b, 0xa7, 0xc4, 0xa2, 0x96, 0xf3, 0x29, 0xab, 0x97, 0x17, 0x05, 0x6d, 0x12, 0x88, 0x12, + 0x75, 0x3d, 0x49, 0xa8, 0x2f, 0x14, 0xbf, 0xfd, 0xb7, 0x2a, 0xcf, 0xfc, 0xe0, 0xef, 0x9d, 0x7d, + 0xc6, 0xf8, 0xcf, 0xf3, 0x50, 0x4e, 0x12, 0x21, 0x3b, 0x30, 0xb5, 0xd5, 0x6d, 0xd9, 0x21, 0x5d, + 0x69, 0x3b, 0xd4, 0x0d, 0x03, 0x5c, 0x24, 0x83, 0xfb, 0xf4, 0x92, 0x68, 0x77, 0xa1, 0x87, 0x88, + 0x56, 0x93, 0x63, 0x26, 0x7a, 0xa5, 0x93, 0x8d, 0xdb, 0x69, 0x20, 0x03, 0x0f, 0x70, 0x85, 0x3d, + 0x5e, 0x3b, 0x9c, 0xf5, 0xf7, 0x69, 0x47, 0x90, 0x15, 0x0b, 0xc8, 0x6d, 0x6d, 0x1f, 0xe0, 0xca, + 0x1c, 0x7e, 0x01, 0x31, 0x94, 0x8c, 0x05, 0xc4, 0x8a, 0x8d, 0xff, 0x35, 0x07, 0xd3, 0x26, 0x0d, + 0xbc, 0x9e, 0xdf, 0xa4, 0x6b, 0xd4, 0x6e, 0x51, 0x9f, 0x2d, 0xff, 0x5b, 0x8e, 0xdb, 0x12, 0x7b, + 0x0a, 0x97, 0xff, 0xbe, 0xe3, 0xaa, 0xac, 0x1b, 0xeb, 0xc9, 0x67, 0x60, 0xbc, 0xd1, 0xdb, 0x46, + 0xd0, 0x7c, 0xcc, 0x01, 0x82, 0xde, 0xb6, 0x95, 0x00, 0x97, 0x60, 0xe4, 0x32, 0x8c, 0xdf, 0xa3, + 0x7e, 0x10, 0x73, 0x43, 0x3c, 0x1a, 0x1e, 0xf0, 0x22, 0x15, 0x41, 0x40, 0x91, 0x1b, 0x31, 0x47, + 0x16, 0x87, 0xda, 0x4c, 0x82, 0x0f, 0xc6, 0x4b, 0xa5, 0x23, 0x4a, 0xd4, 0xa5, 0x22, 0xa1, 0x8c, + 0xff, 0x29, 0x0f, 0xe5, 0x9a, 0x1d, 0xda, 0xdb, 0x76, 0x20, 0xc6, 0xf3, 0xde, 0x55, 0xc6, 0xe3, + 0x95, 0x8e, 0x22, 0x8f, 0x67, 0x5f, 0xfe, 0x91, 0xbb, 0xf7, 0x72, 0xb2, 0x7b, 0x93, 0xec, 0x84, + 0x15, 0xdd, 0x8b, 0x3b, 0xf5, 0xce, 0xf1, 0x9d, 0x2a, 0x8b, 0x4e, 0x15, 0x65, 0xa7, 0xe2, 0xae, + 0x90, 0x77, 0x60, 0xa4, 0xd1, 0xa5, 0x4d, 0xc1, 0x44, 0xe4, 0xb9, 0xa0, 0x77, 0x8e, 0x01, 0xdc, + 0xbb, 0xba, 0x5c, 0x12, 0x64, 0x46, 0x82, 0x2e, 0x6d, 0x9a, 0x88, 0x46, 0x56, 0x61, 0x8c, 0x31, + 0xc4, 0x9e, 0x3c, 0x0c, 0xce, 0x64, 0x13, 0x40, 0x90, 0x7b, 0x57, 0x97, 0xa7, 0x05, 0x89, 0xb1, + 0x00, 0x4b, 0x4c, 0x81, 0xac, 0xec, 0xbd, 0x7f, 0x5a, 0x80, 0xf9, 0xac, 0xd6, 0xd5, 0xe1, 0x18, + 0x1b, 0x30, 0x1c, 0xe7, 0xa1, 0xc8, 0x24, 0x01, 0x76, 0xba, 0x22, 0xd7, 0x99, 0x58, 0x2e, 0xb1, + 0x9e, 0xef, 0x89, 0x32, 0x33, 0xaa, 0x25, 0x2f, 0x46, 0x82, 0x45, 0x31, 0xa6, 0x27, 0x04, 0x0b, + 0x29, 0x4e, 0xb0, 0x25, 0x23, 0x39, 0x01, 0xca, 0x1f, 0xf1, 0xe8, 0xca, 0xe2, 0x78, 0xc9, 0xf8, + 0xa2, 0x44, 0x3b, 0xad, 0xe4, 0xd9, 0xb2, 0x0a, 0x45, 0xd9, 0xad, 0x85, 0x12, 0x12, 0x9a, 0x4d, + 0x0c, 0xd5, 0xbd, 0xab, 0x7c, 0x4d, 0xb4, 0xc4, 0x6f, 0x95, 0x8c, 0x84, 0x21, 0x57, 0xa1, 0x58, + 0xf7, 0xbd, 0x47, 0x07, 0xeb, 0xb5, 0x60, 0x61, 0xea, 0x6c, 0xe1, 0xfc, 0xc4, 0xf2, 0xa9, 0xa3, + 0xc3, 0xca, 0x5c, 0x97, 0x95, 0x59, 0x4e, 0x4b, 0x3d, 0xb0, 0x23, 0xc0, 0x9b, 0x23, 0xc5, 0x5c, + 0x39, 0x7f, 0x73, 0xa4, 0x98, 0x2f, 0x17, 0xb8, 0x94, 0x72, 0x73, 0xa4, 0x38, 0x52, 0x1e, 0xbd, + 0x39, 0x52, 0x1c, 0x45, 0xb9, 0x65, 0xa2, 0x0c, 0x37, 0x47, 0x8a, 0x93, 0xe5, 0x92, 0x26, 0x34, + 0x20, 0x81, 0xd0, 0x6b, 0x7a, 0x6d, 0xb3, 0xb0, 0x65, 0xae, 0x9b, 0x63, 0x2b, 0xd5, 0x15, 0xea, + 0x87, 0x66, 0xa1, 0x7a, 0xbf, 0x61, 0x4e, 0xd5, 0x0e, 0x5c, 0xbb, 0xe3, 0x34, 0xf9, 0x09, 0x6c, + 0x16, 0x6e, 0xac, 0xd4, 0x0d, 0x17, 0x4e, 0x66, 0x4f, 0x3b, 0xd9, 0x84, 0xd2, 0xa6, 0xed, 0xef, + 0xd2, 0x70, 0x8d, 0xda, 0xed, 0x70, 0x6f, 0x61, 0x1a, 0x07, 0x60, 0x4e, 0x0c, 0x80, 0x5a, 0xb5, + 0xfc, 0xec, 0xd1, 0x61, 0xe5, 0x54, 0x88, 0x25, 0xd6, 0x1e, 0x16, 0x29, 0x5d, 0xd2, 0xa8, 0x18, + 0x55, 0x98, 0x8e, 0xc7, 0x6e, 0xc3, 0x09, 0x42, 0x72, 0x19, 0x26, 0x64, 0x09, 0xe3, 0xcf, 0x85, + 0xcc, 0x51, 0x36, 0x63, 0x18, 0xe3, 0xb7, 0xf2, 0x00, 0x71, 0xcd, 0x53, 0xba, 0x85, 0x3f, 0xa7, + 0x6d, 0xe1, 0x13, 0xc9, 0x1d, 0xd8, 0x7f, 0xf3, 0xbe, 0x97, 0xd8, 0xbc, 0xa7, 0x92, 0xa8, 0xc3, + 0x6f, 0xdb, 0x5f, 0x18, 0x8f, 0x27, 0x43, 0x6c, 0xd8, 0xf3, 0x10, 0x2d, 0x20, 0x31, 0xa0, 0xb8, + 0x13, 0xbb, 0x72, 0x51, 0x45, 0xb5, 0xe4, 0x34, 0xb0, 0x05, 0x26, 0x06, 0x75, 0xfc, 0xe8, 0xb0, + 0x52, 0xe8, 0xf9, 0x0e, 0x2e, 0x3a, 0x72, 0x19, 0xc4, 0xb2, 0x13, 0x03, 0xc8, 0x56, 0xfb, 0x6c, + 0xd3, 0xb6, 0x9a, 0xd4, 0x0f, 0xe3, 0x11, 0x5f, 0xc8, 0xc9, 0xd5, 0x49, 0xba, 0xa0, 0x2f, 0xcd, + 0x85, 0x11, 0x5c, 0x06, 0xe7, 0x33, 0x47, 0xe5, 0x92, 0x06, 0xca, 0xa5, 0xdf, 0xb3, 0xf2, 0x30, + 0x6d, 0xf1, 0x3a, 0x2b, 0x25, 0x09, 0xeb, 0x0d, 0x90, 0xab, 0xc0, 0x76, 0x84, 0x18, 0x7d, 0x10, + 0xed, 0x54, 0xef, 0x37, 0x96, 0x4f, 0x08, 0x4a, 0x53, 0xf6, 0x43, 0x15, 0x9d, 0x41, 0x93, 0xb7, + 0x80, 0x6d, 0x19, 0x31, 0xee, 0x44, 0x20, 0xdd, 0x58, 0xa9, 0xaf, 0xb4, 0xbd, 0x5e, 0xab, 0xf1, + 0xfe, 0x46, 0x8c, 0xbc, 0xdb, 0xec, 0xaa, 0xc8, 0x37, 0x56, 0xea, 0xe4, 0x2d, 0x18, 0xad, 0x7e, + 0x7f, 0xcf, 0xa7, 0x42, 0xac, 0x2a, 0xc9, 0x36, 0x59, 0xd9, 0xf2, 0x29, 0x81, 0x38, 0x63, 0xb3, + 0x9f, 0xaa, 0x38, 0x8a, 0xf5, 0xac, 0xe5, 0xcd, 0x8d, 0x86, 0x10, 0x99, 0x48, 0x62, 0x58, 0x36, + 0x37, 0x94, 0xcf, 0x0e, 0xb5, 0x5e, 0x33, 0x2c, 0x72, 0x19, 0xf2, 0xd5, 0x1a, 0x5e, 0xe4, 0x26, + 0x97, 0x26, 0x64, 0xb3, 0xb5, 0xe5, 0x79, 0x81, 0x52, 0xb2, 0xd5, 0x6d, 0x90, 0xaf, 0xd6, 0xc8, + 0x32, 0x8c, 0xde, 0x3e, 0x68, 0xbc, 0xbf, 0x21, 0x98, 0xa7, 0xdc, 0xf2, 0x58, 0x76, 0x17, 0xd9, + 0x4c, 0x10, 0x7f, 0x71, 0xe7, 0x20, 0xf8, 0x46, 0x5b, 0xfd, 0x62, 0x04, 0x23, 0x75, 0x98, 0xa8, + 0xb6, 0x3a, 0x8e, 0xbb, 0x15, 0x50, 0x7f, 0x61, 0x12, 0xe9, 0x2c, 0x24, 0xbe, 0x3b, 0xaa, 0x5f, + 0x5e, 0x38, 0x3a, 0xac, 0xcc, 0xdb, 0xec, 0xa7, 0xd5, 0x0b, 0xa8, 0xaf, 0x50, 0x8b, 0x89, 0x90, + 0x3a, 0xc0, 0x6d, 0xcf, 0xdd, 0xf5, 0xaa, 0x61, 0xdb, 0x0e, 0x12, 0xec, 0x38, 0xae, 0x88, 0xa4, + 0x9e, 0x13, 0x1d, 0x56, 0x66, 0xd9, 0xac, 0x50, 0x21, 0xa8, 0xd0, 0x20, 0xd7, 0x61, 0xec, 0xae, + 0x6f, 0x37, 0xdb, 0x74, 0x61, 0x0a, 0xa9, 0xcd, 0x0b, 0x6a, 0xbc, 0x50, 0xf6, 0x74, 0x41, 0x10, + 0x2c, 0x7b, 0x58, 0xac, 0xde, 0xae, 0x38, 0xe0, 0xe2, 0x7d, 0x20, 0xe9, 0x35, 0x99, 0x71, 0xb7, + 0x79, 0x4d, 0xbd, 0xdb, 0xc4, 0x9b, 0x7e, 0xc5, 0xeb, 0x74, 0x6c, 0xb7, 0x85, 0xb8, 0xf7, 0x96, + 0x94, 0x2b, 0x8f, 0xf1, 0x0d, 0x98, 0x4d, 0x0d, 0xd6, 0x31, 0xd7, 0xd2, 0x77, 0x61, 0xa6, 0x46, + 0x77, 0xec, 0x5e, 0x3b, 0x8c, 0x4e, 0x2e, 0xbe, 0x45, 0xf1, 0x82, 0xd8, 0xe2, 0x55, 0x96, 0x3c, + 0xae, 0xcc, 0x24, 0xb0, 0xf1, 0x0e, 0x4c, 0x69, 0xdd, 0x67, 0x37, 0x9c, 0x6a, 0xaf, 0xe5, 0x84, + 0x38, 0x91, 0xb9, 0xf8, 0x86, 0x63, 0xb3, 0x42, 0x9c, 0x2e, 0x33, 0x06, 0x30, 0xfe, 0x8e, 0x2a, + 0x64, 0xc9, 0x93, 0xe4, 0x62, 0xc4, 0x0f, 0x72, 0xb1, 0xc8, 0x97, 0xe2, 0x07, 0x11, 0x37, 0xb8, + 0xc0, 0xf7, 0x66, 0x3e, 0xb5, 0x37, 0x27, 0xc5, 0x4c, 0x14, 0xec, 0x87, 0x01, 0xdf, 0x91, 0xd1, + 0x4a, 0x2d, 0x7c, 0xf4, 0x95, 0xfa, 0x1e, 0x94, 0x6e, 0xdb, 0xae, 0xbd, 0x4b, 0x5b, 0xac, 0x07, + 0x9c, 0xf7, 0x4c, 0xf0, 0x23, 0xad, 0xc3, 0xcb, 0xb1, 0x97, 0xea, 0x22, 0xd2, 0x10, 0xc8, 0x15, + 0xb9, 0xb3, 0x47, 0x33, 0x76, 0xf6, 0x94, 0x68, 0x7d, 0x14, 0x77, 0xb6, 0xd8, 0xcf, 0xc6, 0x77, + 0x26, 0xb0, 0x8f, 0xe4, 0x75, 0x18, 0x33, 0xe9, 0x2e, 0x3b, 0x6a, 0x72, 0xf1, 0x24, 0xf9, 0x58, + 0xa2, 0x0e, 0x0c, 0x87, 0x41, 0xb9, 0x86, 0xb6, 0x82, 0x3d, 0x67, 0x27, 0x14, 0xa3, 0x13, 0xc9, + 0x35, 0xa2, 0x58, 0x91, 0x6b, 0x44, 0x89, 0x7e, 0x0b, 0xe7, 0x65, 0x8c, 0xfb, 0x99, 0xb5, 0x86, + 0x18, 0x34, 0x39, 0xc2, 0x66, 0x4d, 0x61, 0x23, 0xbe, 0x26, 0x95, 0x30, 0x68, 0x72, 0x0d, 0x26, + 0xaa, 0xcd, 0xa6, 0xd7, 0x53, 0xae, 0xba, 0x7c, 0xdf, 0xf2, 0x42, 0x5d, 0xb3, 0x13, 0x83, 0x92, + 0x06, 0x4c, 0xae, 0xb2, 0xfb, 0xa1, 0xb3, 0x62, 0x37, 0xf7, 0xe4, 0x20, 0x49, 0x1e, 0xa6, 0xd4, + 0xc4, 0x3b, 0x97, 0x62, 0x61, 0x93, 0x15, 0xaa, 0xba, 0x11, 0x05, 0x96, 0x6c, 0xc2, 0x64, 0x83, + 0x36, 0x7d, 0x1a, 0x36, 0x42, 0xcf, 0xa7, 0x09, 0x96, 0xac, 0xd4, 0x2c, 0x3f, 0x2f, 0xaf, 0xa8, + 0x01, 0x16, 0x5a, 0x01, 0x2b, 0x55, 0xa9, 0x2a, 0xc0, 0xfc, 0xae, 0xd1, 0xf1, 0xfc, 0x83, 0xda, + 0xb2, 0x60, 0xd3, 0xf1, 0x99, 0xce, 0x8b, 0xd5, 0xbb, 0x06, 0x2b, 0x69, 0x6d, 0xeb, 0x77, 0x0d, + 0x0e, 0x85, 0x33, 0x55, 0x6b, 0xa0, 0x2c, 0x27, 0x98, 0xf6, 0x4c, 0x3c, 0xca, 0x58, 0xac, 0xcc, + 0x54, 0x2b, 0x40, 0x49, 0x50, 0x9b, 0x29, 0x01, 0x45, 0xba, 0x40, 0xe4, 0xac, 0x71, 0xf1, 0xac, + 0x4d, 0x83, 0x40, 0xf0, 0xf2, 0xd3, 0x89, 0xc9, 0x8f, 0x01, 0x96, 0x5f, 0x16, 0xc4, 0xcf, 0xc8, + 0x65, 0x20, 0xae, 0x97, 0xac, 0x52, 0x69, 0x27, 0x83, 0x36, 0x79, 0x13, 0x60, 0xf5, 0x51, 0x48, + 0x7d, 0xd7, 0x6e, 0x47, 0xea, 0x3b, 0xd4, 0x58, 0x51, 0x51, 0xaa, 0x4f, 0xb4, 0x02, 0x4c, 0x56, + 0x60, 0xaa, 0x1a, 0x04, 0xbd, 0x0e, 0x35, 0xbd, 0x36, 0xad, 0x9a, 0x77, 0x90, 0xef, 0x4f, 0x2c, + 0x9f, 0x39, 0x3a, 0xac, 0x9c, 0xb6, 0xb1, 0xc2, 0xf2, 0xbd, 0x36, 0xb5, 0x6c, 0x5f, 0x5d, 0xdd, + 0x3a, 0x0e, 0xb9, 0x0b, 0x70, 0xb7, 0x4b, 0xdd, 0x06, 0xb5, 0xfd, 0xe6, 0x5e, 0x82, 0xcd, 0xc7, + 0x15, 0xcb, 0xcf, 0x89, 0x1e, 0xce, 0x7b, 0x5d, 0xea, 0x06, 0x58, 0xa6, 0x7e, 0x55, 0x0c, 0x49, + 0xee, 0xc3, 0xcc, 0x7a, 0xf5, 0x76, 0xdd, 0x6b, 0x3b, 0xcd, 0x03, 0x21, 0x39, 0x4d, 0xa3, 0x52, + 0xf3, 0xa4, 0xa0, 0x9a, 0xa8, 0xe5, 0xec, 0xc9, 0xb1, 0x3b, 0x56, 0x17, 0x4b, 0x2d, 0x21, 0x3f, + 0x25, 0xa9, 0x90, 0x2f, 0xb3, 0x35, 0x18, 0x30, 0x61, 0x70, 0xd3, 0xde, 0x0d, 0x16, 0x66, 0x34, + 0x25, 0x5d, 0xf5, 0x7e, 0xe3, 0x92, 0x52, 0xcb, 0xc5, 0x94, 0x45, 0xbe, 0x10, 0xb1, 0xd4, 0x0a, + 0xed, 0xdd, 0x40, 0x5f, 0x88, 0x11, 0x34, 0xb9, 0x09, 0x50, 0xf3, 0x9a, 0xbd, 0x0e, 0x75, 0xc3, + 0xda, 0xf2, 0x42, 0x59, 0xbf, 0x7a, 0x44, 0x15, 0x31, 0x6b, 0x6b, 0x79, 0x4d, 0x6d, 0x25, 0x2a, + 0xd8, 0x8b, 0xef, 0x42, 0x39, 0xf9, 0x21, 0x8f, 0xa9, 0x77, 0x9b, 0x2a, 0x4f, 0x2b, 0xbd, 0x5f, + 0x7d, 0xe4, 0x04, 0x61, 0x60, 0x7c, 0x53, 0xdb, 0x81, 0x8c, 0x3b, 0xdc, 0xa2, 0x07, 0x75, 0x9f, + 0xee, 0x38, 0x8f, 0x04, 0x33, 0x43, 0xee, 0xb0, 0x4f, 0x0f, 0xac, 0x2e, 0x96, 0xaa, 0xdc, 0x21, + 0x02, 0x25, 0x9f, 0x85, 0xe2, 0xad, 0xdb, 0x8d, 0x5b, 0xf4, 0x60, 0xbd, 0x26, 0x0e, 0x2a, 0x8e, + 0xd6, 0x09, 0x2c, 0x86, 0xaa, 0xad, 0xb5, 0x08, 0xd2, 0x58, 0x8e, 0x39, 0x21, 0x6b, 0x79, 0xa5, + 0xdd, 0x0b, 0x42, 0xea, 0xaf, 0xd7, 0xd4, 0x96, 0x9b, 0xbc, 0x30, 0xc1, 0x97, 0x22, 0x50, 0xe3, + 0xdf, 0xe5, 0x91, 0x0b, 0xb2, 0x05, 0xbf, 0xee, 0x06, 0xa1, 0xed, 0x36, 0x69, 0x44, 0x00, 0x17, + 0xbc, 0x23, 0x4a, 0x13, 0x0b, 0x3e, 0x06, 0xd6, 0x9b, 0xce, 0x0f, 0xdd, 0x34, 0x6b, 0x52, 0x2a, + 0x5c, 0xd6, 0x6b, 0xaa, 0x56, 0xd8, 0x17, 0xa5, 0x89, 0x26, 0x63, 0x60, 0x72, 0x0e, 0xc6, 0xd7, + 0xab, 0xb7, 0xab, 0xbd, 0x70, 0x0f, 0x79, 0x70, 0x91, 0xcb, 0xe7, 0x6c, 0xb5, 0xda, 0xbd, 0x70, + 0xcf, 0x94, 0x95, 0xe4, 0x32, 0xde, 0x7b, 0x5c, 0x1a, 0x72, 0xed, 0xb1, 0x38, 0x74, 0x03, 0x5e, + 0x94, 0xb8, 0xf6, 0xb0, 0x22, 0xf2, 0x2a, 0x8c, 0xde, 0xab, 0xaf, 0xac, 0xd7, 0xc4, 0x45, 0x1d, + 0x4f, 0xa2, 0x07, 0xdd, 0xa6, 0xfe, 0x25, 0x1c, 0x84, 0xac, 0xc2, 0x74, 0x83, 0x36, 0x7b, 0xbe, + 0x13, 0x1e, 0xdc, 0xf0, 0xbd, 0x5e, 0x37, 0x58, 0x18, 0xc7, 0x36, 0x70, 0xa7, 0x07, 0xa2, 0xc6, + 0xda, 0xc5, 0x2a, 0x05, 0x3b, 0x81, 0x64, 0xfc, 0x66, 0x2e, 0x66, 0x93, 0xe4, 0x9c, 0x26, 0xd6, + 0xa0, 0xca, 0x89, 0x89, 0x35, 0xaa, 0xca, 0x09, 0x05, 0x1c, 0x13, 0xc8, 0x4a, 0x2f, 0x08, 0xbd, + 0xce, 0xaa, 0xdb, 0xea, 0x7a, 0x8e, 0x1b, 0x22, 0x16, 0x1f, 0x7c, 0xe3, 0xe8, 0xb0, 0xf2, 0x7c, + 0x13, 0x6b, 0x2d, 0x2a, 0xaa, 0xad, 0x04, 0x95, 0x0c, 0xec, 0x8f, 0x31, 0x1f, 0xc6, 0xbf, 0xca, + 0x6b, 0xc7, 0x1b, 0xfb, 0x3c, 0x93, 0x76, 0xdb, 0x4e, 0x13, 0x35, 0x08, 0xd8, 0xd1, 0x68, 0x55, + 0xe1, 0xe7, 0xf9, 0x71, 0x2d, 0x1f, 0x21, 0x9d, 0x76, 0x06, 0x36, 0xf9, 0x22, 0x94, 0x98, 0xa4, + 0x21, 0x7e, 0x06, 0x0b, 0x79, 0x1c, 0xec, 0xe7, 0x50, 0x79, 0x18, 0x50, 0x3f, 0x22, 0xa3, 0x89, + 0x28, 0x2a, 0x06, 0x69, 0xc1, 0xc2, 0xa6, 0x6f, 0xbb, 0x81, 0x13, 0xae, 0xba, 0x4d, 0xff, 0x00, + 0x25, 0xa3, 0x55, 0xd7, 0xde, 0x6e, 0xd3, 0x16, 0x76, 0xb7, 0xb8, 0x7c, 0xfe, 0xe8, 0xb0, 0xf2, + 0x52, 0xc8, 0x61, 0x2c, 0x1a, 0x01, 0x59, 0x94, 0x43, 0x29, 0x94, 0xfb, 0x52, 0x62, 0x92, 0x94, + 0x1c, 0x56, 0x7c, 0x3b, 0xe2, 0x42, 0x02, 0x4a, 0x52, 0xd1, 0x6c, 0x30, 0x1e, 0xa6, 0x7e, 0xa6, + 0x8a, 0x60, 0xfc, 0xdf, 0xb9, 0xf8, 0x00, 0x26, 0x6f, 0xc3, 0xa4, 0xd8, 0x31, 0xca, 0xba, 0x40, + 0x0e, 0x2a, 0xb7, 0x57, 0x62, 0x66, 0x55, 0x70, 0x76, 0xef, 0xaf, 0xae, 0x6c, 0x28, 0x6b, 0x03, + 0xef, 0xfd, 0x76, 0xb3, 0x9d, 0xc4, 0x92, 0x60, 0x6c, 0x11, 0x6c, 0x6e, 0x34, 0xf4, 0x51, 0xc1, + 0x45, 0x10, 0xb6, 0x83, 0x8c, 0x61, 0x50, 0x80, 0x3f, 0x7e, 0xc7, 0xff, 0xc7, 0x5c, 0xd6, 0x39, + 0x4f, 0x96, 0x61, 0xea, 0xbe, 0xe7, 0xef, 0xe3, 0xfc, 0x2a, 0x83, 0x80, 0x33, 0xff, 0x50, 0x56, + 0x24, 0x3b, 0xa4, 0xa3, 0xa8, 0xdf, 0xa6, 0x8c, 0x86, 0xfe, 0x6d, 0x09, 0x0a, 0x1a, 0x02, 0x9b, + 0x87, 0x88, 0x62, 0xb4, 0x3b, 0x70, 0x1e, 0xe2, 0x4f, 0xd0, 0x96, 0xb0, 0x0a, 0x6e, 0xfc, 0x7a, + 0x4e, 0x3d, 0xcf, 0xd9, 0x20, 0xd7, 0xbc, 0x8e, 0xed, 0xb8, 0x4a, 0x77, 0xf8, 0x7b, 0x18, 0x96, + 0x26, 0xbf, 0x44, 0x01, 0x26, 0x57, 0xa1, 0xc8, 0x7f, 0x45, 0xbc, 0x16, 0xb5, 0x68, 0x02, 0x51, + 0x3f, 0x28, 0x24, 0x60, 0x6a, 0x66, 0x0a, 0x8f, 0x3b, 0x33, 0xdf, 0xc9, 0xa9, 0x47, 0xf1, 0x47, + 0x3d, 0x6c, 0x12, 0x87, 0x4c, 0xfe, 0x71, 0x0e, 0x99, 0x8f, 0xdd, 0x85, 0x1f, 0xcc, 0xc1, 0xa4, + 0xa2, 0xa5, 0x60, 0x7d, 0xa8, 0xfb, 0xde, 0x87, 0xb4, 0x19, 0xea, 0x7d, 0xe8, 0xf2, 0xc2, 0x44, + 0x1f, 0x22, 0xd0, 0x8f, 0xd1, 0x07, 0xe3, 0x8f, 0x72, 0xe2, 0x8e, 0x34, 0x34, 0x9b, 0xd7, 0x59, + 0x72, 0xfe, 0x71, 0x8e, 0xc8, 0x2f, 0xc2, 0xa8, 0x49, 0x5b, 0x4e, 0x20, 0xee, 0x37, 0xb3, 0xea, + 0x7d, 0x0c, 0x2b, 0x62, 0xb9, 0xc9, 0x67, 0x3f, 0xd5, 0xf3, 0x0d, 0xeb, 0x99, 0x20, 0xbb, 0x1e, + 0x5c, 0x6f, 0xd3, 0x47, 0x0e, 0xdf, 0x8c, 0xe2, 0xa8, 0xc5, 0xe3, 0xcd, 0x09, 0xac, 0x1d, 0x56, + 0x23, 0x24, 0x6a, 0x75, 0xe3, 0x69, 0x38, 0xc6, 0x97, 0x01, 0xe2, 0x26, 0xc9, 0x2d, 0x28, 0x8b, + 0xd5, 0xe0, 0xb8, 0xbb, 0x5c, 0x90, 0x12, 0x63, 0x50, 0x39, 0x3a, 0xac, 0x3c, 0xdb, 0x8c, 0xea, + 0x84, 0xd4, 0xa9, 0xd0, 0x4d, 0x21, 0x1a, 0xff, 0x5b, 0x01, 0xf2, 0x55, 0x9c, 0x90, 0x5b, 0xf4, + 0x20, 0xb4, 0xb7, 0xaf, 0x3b, 0x6d, 0x6d, 0x33, 0xed, 0x63, 0xa9, 0xb5, 0xe3, 0x68, 0xea, 0x0a, + 0x05, 0x98, 0x6d, 0xa6, 0x5b, 0xfe, 0xf6, 0x1b, 0x88, 0xa8, 0x6c, 0xa6, 0x7d, 0x7f, 0xfb, 0x8d, + 0x24, 0x5a, 0x04, 0x48, 0x0c, 0x18, 0xe3, 0x1b, 0x4b, 0xac, 0x41, 0x38, 0x3a, 0xac, 0x8c, 0xf1, + 0xfd, 0x67, 0x8a, 0x1a, 0x72, 0x1a, 0x0a, 0x8d, 0xfa, 0x1d, 0xc1, 0x01, 0x51, 0x2d, 0x18, 0x74, + 0x5d, 0x93, 0x95, 0xb1, 0x36, 0x37, 0x6a, 0xd5, 0x3a, 0x2a, 0x02, 0x46, 0xe3, 0x36, 0xdb, 0x2d, + 0xbb, 0x9b, 0x54, 0x05, 0x44, 0x80, 0xe4, 0x1d, 0x98, 0xbc, 0x55, 0x5b, 0x59, 0xf3, 0x02, 0xce, + 0xbd, 0xc6, 0xe2, 0xc5, 0xbf, 0xdf, 0x6a, 0x5a, 0xa8, 0xf9, 0x4f, 0x1e, 0x03, 0x0a, 0x3c, 0xb1, + 0xe0, 0x24, 0x23, 0xc5, 0xa6, 0xc4, 0x69, 0x52, 0x71, 0x29, 0xbd, 0x13, 0xbf, 0x33, 0xbc, 0x72, + 0x74, 0x58, 0x79, 0x11, 0xbf, 0x20, 0xe0, 0x20, 0x96, 0xbc, 0xce, 0x26, 0xa8, 0xf6, 0x21, 0x43, + 0xbe, 0x0a, 0x27, 0xd2, 0x35, 0x8d, 0xe8, 0x7d, 0xe2, 0xdc, 0xd1, 0x61, 0xc5, 0xc8, 0xa4, 0x1f, + 0x68, 0xeb, 0x37, 0x9b, 0x88, 0xf1, 0xad, 0x3c, 0x4c, 0x2a, 0x6a, 0x3e, 0xf2, 0x59, 0xf1, 0x2c, + 0x9d, 0xd3, 0x2e, 0x30, 0x0a, 0x04, 0xab, 0xe5, 0x3a, 0xa1, 0x8e, 0xd7, 0xa2, 0xe2, 0x91, 0x3a, + 0xd6, 0xbf, 0xe4, 0x87, 0xd1, 0xbf, 0xbc, 0x09, 0xc0, 0x97, 0x30, 0x8e, 0x93, 0x22, 0x0d, 0x29, + 0xd6, 0x29, 0xea, 0xb2, 0x8a, 0x81, 0xc9, 0x3d, 0x98, 0xdb, 0xf4, 0x7b, 0x41, 0xd8, 0x38, 0x08, + 0x42, 0xda, 0x61, 0xd4, 0xea, 0x9e, 0xd7, 0x16, 0xdb, 0xe7, 0xa5, 0xa3, 0xc3, 0xca, 0x59, 0x34, + 0xa9, 0xb1, 0x02, 0xac, 0xc7, 0x0f, 0xb0, 0xba, 0x9e, 0xa7, 0x6a, 0x65, 0xb2, 0x08, 0x18, 0x26, + 0x94, 0x54, 0x9d, 0x0e, 0x3b, 0x18, 0xc5, 0x13, 0x9e, 0xd0, 0xd4, 0x2b, 0x07, 0xa3, 0xf8, 0xca, + 0xf4, 0x93, 0xa2, 0x8e, 0x62, 0x7c, 0x56, 0xd5, 0x27, 0x0e, 0xcb, 0x97, 0x8c, 0xbf, 0x94, 0x8b, + 0xb9, 0xe0, 0xbd, 0x2b, 0xe4, 0x2d, 0x18, 0xe3, 0x4f, 0xa6, 0xe2, 0x65, 0xf9, 0x44, 0x74, 0x27, + 0x57, 0xdf, 0x53, 0xb9, 0x22, 0xff, 0x77, 0xb9, 0x59, 0xc5, 0x33, 0xa6, 0x40, 0x89, 0xde, 0x00, + 0x74, 0x75, 0xa0, 0xa4, 0x8e, 0xda, 0xee, 0x2b, 0x59, 0x6f, 0x00, 0xc6, 0xbf, 0x18, 0x85, 0x69, + 0x1d, 0x4c, 0x7d, 0x57, 0xcd, 0x0d, 0xf5, 0xae, 0xfa, 0x45, 0x28, 0x8a, 0xf5, 0x26, 0x05, 0xca, + 0x97, 0xf0, 0x65, 0x44, 0x94, 0x69, 0xf6, 0x02, 0xc0, 0xa7, 0x83, 0x5d, 0xd1, 0xcd, 0x08, 0x8b, + 0x2c, 0x29, 0xaf, 0x76, 0x85, 0x58, 0xc6, 0x92, 0xaf, 0x76, 0xea, 0x76, 0x8e, 0xde, 0xef, 0x2e, + 0xc2, 0x18, 0xbb, 0x9e, 0x44, 0x1a, 0x24, 0xfc, 0x4a, 0x76, 0x73, 0x49, 0x18, 0x06, 0x71, 0x20, + 0x72, 0x1f, 0x8a, 0x1b, 0x76, 0x10, 0x36, 0x28, 0x75, 0x87, 0xb0, 0x98, 0xa8, 0x88, 0xa1, 0x9a, + 0x43, 0x73, 0x84, 0x80, 0x52, 0x37, 0xf1, 0xe4, 0x1d, 0x11, 0x23, 0x1f, 0x00, 0xac, 0x78, 0x6e, + 0xe8, 0x7b, 0xed, 0x0d, 0x6f, 0x77, 0x61, 0x0c, 0xaf, 0xee, 0xcf, 0x27, 0x26, 0x20, 0x06, 0xe0, + 0xb7, 0xf7, 0x48, 0x3f, 0xd5, 0xe4, 0x15, 0x56, 0xdb, 0xdb, 0x55, 0xf7, 0x41, 0x0c, 0x4f, 0xae, + 0x43, 0x59, 0xea, 0x45, 0xb6, 0xba, 0xbb, 0x3e, 0x2e, 0x90, 0xf1, 0x58, 0x70, 0xa2, 0x8f, 0x42, + 0xab, 0x27, 0xca, 0x55, 0x46, 0x9f, 0xc4, 0x21, 0x5f, 0x85, 0x53, 0xc9, 0x32, 0x39, 0xcb, 0xc5, + 0xf8, 0x4a, 0xa1, 0x92, 0xcb, 0x58, 0xf7, 0xfd, 0x48, 0x90, 0x1b, 0x30, 0xc3, 0x06, 0xe4, 0x36, + 0xb5, 0x83, 0x1e, 0x37, 0x6b, 0x13, 0x9a, 0x25, 0xf9, 0x20, 0x2c, 0x76, 0x61, 0xdb, 0x6b, 0xee, + 0x2b, 0x40, 0x66, 0x12, 0x8b, 0x5c, 0x83, 0x49, 0x6e, 0xa7, 0xe0, 0xaf, 0xbb, 0x3b, 0x9e, 0x78, + 0x36, 0x90, 0xda, 0x74, 0x51, 0x73, 0x6f, 0x89, 0xd5, 0x99, 0x2a, 0xa0, 0x71, 0x98, 0x87, 0x93, + 0xd9, 0x6d, 0x90, 0xbf, 0x08, 0x27, 0xc4, 0x78, 0xb6, 0xa9, 0xaf, 0xc0, 0x0c, 0x61, 0xc1, 0x71, + 0x51, 0xcc, 0xd3, 0x0b, 0xcd, 0x88, 0x40, 0xc4, 0x70, 0x18, 0x89, 0xc4, 0xa2, 0xc8, 0x6e, 0x87, + 0x7c, 0x1d, 0x26, 0xd5, 0x66, 0xf3, 0xc3, 0x1b, 0xc3, 0x0c, 0x68, 0x4b, 0x25, 0x49, 0x6c, 0x98, + 0x31, 0xe9, 0x37, 0x7a, 0x34, 0x08, 0xa5, 0x39, 0x8e, 0x90, 0x58, 0x4e, 0xa7, 0x5a, 0x91, 0x00, + 0x91, 0xda, 0xab, 0xec, 0x73, 0x4c, 0x4b, 0x1a, 0x4d, 0x7e, 0x9b, 0x91, 0x4f, 0xd2, 0x33, 0xbe, + 0x97, 0x87, 0x53, 0x7d, 0x96, 0x33, 0xe3, 0x78, 0x28, 0x4f, 0x2a, 0x1c, 0x2f, 0x21, 0x46, 0x72, + 0x5b, 0xbe, 0xb3, 0x90, 0x17, 0x12, 0xd8, 0xc8, 0x72, 0xf9, 0xe8, 0xb0, 0x52, 0xd2, 0x76, 0x6a, + 0x7e, 0xbd, 0x46, 0x6e, 0xc2, 0x08, 0x1b, 0x86, 0x21, 0x4c, 0x52, 0xa4, 0xd2, 0x73, 0x3a, 0x74, + 0x54, 0x06, 0x81, 0x63, 0x83, 0x34, 0xc8, 0x67, 0xa1, 0xb0, 0xb9, 0xb9, 0x81, 0xdc, 0xa1, 0x80, + 0xab, 0x7b, 0x2a, 0x0c, 0xdb, 0x1a, 0x33, 0x9a, 0x62, 0xb8, 0xd1, 0x88, 0x98, 0x0c, 0x9c, 0x7c, + 0x29, 0x61, 0x2a, 0xf7, 0xea, 0xe0, 0xad, 0x3c, 0xbc, 0xe5, 0xdc, 0xc7, 0x30, 0x58, 0x33, 0x7e, + 0x22, 0x27, 0xad, 0x82, 0xc4, 0xe2, 0x27, 0x67, 0xe5, 0x3e, 0xc1, 0x8b, 0xb9, 0xa0, 0xa2, 0x16, + 0x91, 0xe7, 0x01, 0xf8, 0xcf, 0xad, 0x2d, 0x31, 0xe8, 0x25, 0x53, 0x29, 0x21, 0x5f, 0x88, 0x48, + 0x0a, 0x55, 0x66, 0x01, 0x25, 0x81, 0xc4, 0x5e, 0xe3, 0x75, 0xa6, 0x0e, 0x6a, 0xfc, 0x46, 0x3e, + 0x3e, 0x35, 0xae, 0x3b, 0xed, 0x90, 0xfa, 0x64, 0x91, 0x1f, 0x02, 0xf1, 0x6d, 0xc6, 0x8c, 0x7e, + 0x93, 0x85, 0xf8, 0x44, 0xe1, 0x5d, 0x8b, 0x8e, 0x8e, 0x57, 0x95, 0xa3, 0xa3, 0x80, 0x47, 0xc7, + 0x74, 0xdf, 0x43, 0xe2, 0xd5, 0x0c, 0x4e, 0x88, 0xac, 0x3f, 0x83, 0xdb, 0xbd, 0x04, 0x53, 0x77, + 0xbc, 0xd5, 0x47, 0x61, 0x04, 0xc8, 0x58, 0x7e, 0xd1, 0xd4, 0x0b, 0x19, 0xc5, 0xbb, 0xed, 0x16, + 0xf5, 0x37, 0xf7, 0x6c, 0x57, 0x33, 0x2e, 0x31, 0x53, 0xe5, 0x0c, 0xf6, 0x0e, 0x7d, 0xa8, 0xc3, + 0x8e, 0x73, 0xd8, 0x64, 0x79, 0x72, 0x72, 0x8a, 0xa9, 0xc9, 0x31, 0x7e, 0x28, 0x2f, 0x87, 0xeb, + 0xde, 0xd2, 0x53, 0x6a, 0x76, 0xf0, 0x86, 0x66, 0x76, 0x30, 0x17, 0x3d, 0x98, 0x44, 0x36, 0x3b, + 0x4b, 0x59, 0x02, 0x87, 0x62, 0x33, 0xf0, 0x77, 0xc6, 0xa0, 0xa4, 0x82, 0xb3, 0x71, 0xa8, 0xb6, + 0x5a, 0xbe, 0x3a, 0x0e, 0x76, 0xab, 0xe5, 0x9b, 0x58, 0xaa, 0x59, 0xf6, 0x14, 0x06, 0x5a, 0xf6, + 0x7c, 0x0d, 0x26, 0x56, 0x3a, 0x2d, 0xed, 0xfd, 0xdf, 0xc8, 0xf8, 0xbc, 0x4b, 0x11, 0x10, 0xdf, + 0xbd, 0xd1, 0x3b, 0x40, 0xb3, 0xd3, 0x4a, 0xbf, 0xfa, 0xc7, 0x24, 0x35, 0xa3, 0xa0, 0xd1, 0x8f, + 0x63, 0x14, 0x74, 0x0d, 0x26, 0xb6, 0x02, 0xba, 0xd9, 0x73, 0x5d, 0xda, 0xc6, 0x85, 0x57, 0xe4, + 0xd7, 0xe7, 0x5e, 0x40, 0xad, 0x10, 0x4b, 0xd5, 0x0f, 0x88, 0x40, 0xd5, 0x09, 0x1e, 0x1f, 0x30, + 0xc1, 0x57, 0xa1, 0x58, 0xa7, 0xd4, 0xc7, 0x31, 0x9d, 0x8c, 0x6f, 0x49, 0x5d, 0x4a, 0x7d, 0x8b, + 0x0d, 0xac, 0x66, 0x2c, 0x24, 0x00, 0x35, 0x0b, 0xa3, 0xd2, 0x90, 0x16, 0x46, 0xe4, 0x05, 0x28, + 0x75, 0x7b, 0xdb, 0x6d, 0xa7, 0x89, 0x74, 0x85, 0x69, 0x92, 0x39, 0xc9, 0xcb, 0x18, 0xd9, 0x80, + 0x7c, 0x09, 0xa6, 0x50, 0x6d, 0x10, 0x2d, 0xb9, 0x69, 0xed, 0x68, 0xd7, 0xea, 0xb8, 0xf4, 0xdd, + 0x64, 0x45, 0x56, 0x86, 0x21, 0x9e, 0x4e, 0x88, 0xdc, 0x84, 0xf1, 0x5d, 0x27, 0xb4, 0xf6, 0x7a, + 0xdb, 0x0b, 0x33, 0x9a, 0x15, 0xdb, 0x0d, 0x27, 0x5c, 0xeb, 0x6d, 0xf3, 0x29, 0x8f, 0x48, 0x23, + 0x8f, 0xde, 0x75, 0xc2, 0xbd, 0x9e, 0xfa, 0xca, 0x31, 0xb6, 0x8b, 0xb0, 0x8b, 0x0d, 0x98, 0xd6, + 0x57, 0xc5, 0x13, 0x78, 0x7b, 0x8f, 0x2c, 0xaf, 0x8a, 0xe5, 0x89, 0x9b, 0x23, 0x45, 0x28, 0x4f, + 0x72, 0x9b, 0x2b, 0x13, 0xea, 0xd1, 0xf8, 0x98, 0xe4, 0x56, 0x6f, 0x9b, 0xfa, 0x2e, 0x0d, 0x69, + 0x20, 0xee, 0xe8, 0x81, 0x39, 0x52, 0xed, 0x76, 0x03, 0xe3, 0x1f, 0xe7, 0x61, 0xbc, 0x7a, 0xbf, + 0x81, 0x5c, 0xff, 0x75, 0xf5, 0xe1, 0x54, 0x7d, 0x41, 0x8f, 0x1e, 0x4e, 0xd5, 0xe7, 0xd2, 0xcb, + 0x19, 0x5a, 0x16, 0xf4, 0x0d, 0x50, 0xb4, 0x2c, 0x9a, 0x7e, 0x28, 0x7e, 0x43, 0x2e, 0x0c, 0xf1, + 0x86, 0x1c, 0xa9, 0xf9, 0x47, 0x8e, 0x57, 0xf3, 0xbf, 0x05, 0x93, 0xeb, 0x6e, 0x48, 0x77, 0xfd, + 0x78, 0xd7, 0x44, 0x1a, 0x9f, 0xa8, 0x58, 0xbd, 0x79, 0x2b, 0xd0, 0x6c, 0x49, 0xf2, 0xa7, 0x85, + 0xe8, 0x49, 0x01, 0x97, 0x24, 0x7f, 0x81, 0x48, 0xa8, 0xeb, 0x24, 0xa0, 0x51, 0x4b, 0xac, 0x37, + 0x69, 0xa7, 0xc3, 0x85, 0xbe, 0xe9, 0xf8, 0x6d, 0x8d, 0x0d, 0xec, 0xf2, 0x6c, 0xb6, 0x9d, 0x8e, + 0xf1, 0x57, 0x73, 0x30, 0x9f, 0xb5, 0x8c, 0xc8, 0xbb, 0x50, 0xf2, 0xfc, 0x5d, 0xdb, 0x75, 0xbe, + 0x9f, 0xf7, 0x48, 0xd1, 0x29, 0xab, 0xe5, 0xaa, 0x26, 0x4d, 0x2d, 0x67, 0x03, 0xa2, 0xf4, 0x5c, + 0x57, 0x81, 0x65, 0x0e, 0x88, 0x52, 0x6c, 0xfc, 0x68, 0x1e, 0x26, 0xab, 0xdd, 0xee, 0x53, 0x6e, + 0x7a, 0xfa, 0x79, 0xed, 0x00, 0x91, 0x1a, 0x88, 0xa8, 0x5f, 0xfd, 0x0d, 0xd7, 0x94, 0x33, 0xe4, + 0x97, 0xf3, 0x30, 0x93, 0xc0, 0x50, 0xbf, 0x3e, 0x37, 0xa4, 0xa5, 0x68, 0x7e, 0x48, 0x4b, 0xd1, + 0xc2, 0x70, 0x96, 0xa2, 0x23, 0x1f, 0xe7, 0x50, 0x78, 0x05, 0x0a, 0xd5, 0x6e, 0x37, 0x69, 0x01, + 0xd2, 0xed, 0xde, 0xbb, 0xca, 0x95, 0x60, 0x76, 0xb7, 0x6b, 0x32, 0x08, 0x8d, 0x53, 0x8f, 0x0d, + 0xc9, 0xa9, 0x8d, 0x8b, 0x30, 0x81, 0xb4, 0xd0, 0x5e, 0xf2, 0x2c, 0x20, 0x8b, 0x11, 0xa6, 0x92, + 0x5a, 0x5b, 0x82, 0xf9, 0xfc, 0x71, 0x0e, 0x46, 0xf1, 0xf7, 0x53, 0xba, 0xc6, 0x96, 0xb4, 0x35, + 0x56, 0x56, 0xd6, 0xd8, 0x30, 0xab, 0xeb, 0xef, 0x17, 0x00, 0x56, 0xee, 0x9a, 0x0d, 0xae, 0x2b, + 0x25, 0xd7, 0x61, 0xc6, 0x6e, 0xb7, 0xbd, 0x87, 0xb4, 0x65, 0x79, 0xbe, 0xb3, 0xeb, 0xb8, 0x7c, + 0xe4, 0xa4, 0x59, 0x82, 0x5e, 0xa5, 0x3e, 0x56, 0x8a, 0xaa, 0xbb, 0xbc, 0x46, 0xa5, 0xd3, 0xa1, + 0xe1, 0x9e, 0xd7, 0x92, 0x6a, 0x13, 0x8d, 0x8e, 0xa8, 0xca, 0xa0, 0x73, 0x9b, 0xd7, 0xa8, 0x74, + 0xf6, 0x50, 0x0d, 0x24, 0x65, 0x68, 0x8d, 0x8e, 0xa8, 0xca, 0xa0, 0xc3, 0x75, 0x47, 0x01, 0xd9, + 0x80, 0x59, 0x2c, 0xb1, 0x9a, 0x3e, 0x6d, 0x51, 0x37, 0x74, 0xec, 0x76, 0x20, 0x14, 0x6d, 0xa8, + 0x51, 0x4e, 0x55, 0xaa, 0x8a, 0x06, 0xac, 0x5c, 0x89, 0xeb, 0xc8, 0x25, 0x18, 0xef, 0xd8, 0x8f, + 0x2c, 0x7b, 0x97, 0x1b, 0xe8, 0x4c, 0x71, 0xc5, 0x8c, 0x28, 0x52, 0x8f, 0x91, 0x8e, 0xfd, 0xa8, + 0xba, 0x4b, 0x59, 0x2f, 0xe8, 0xa3, 0xae, 0x17, 0x28, 0xbd, 0x18, 0x8b, 0x7b, 0x91, 0xa8, 0x52, + 0x7b, 0x21, 0xaa, 0x44, 0x2f, 0x8c, 0x5f, 0xca, 0xc1, 0xb3, 0xeb, 0xf8, 0x15, 0xe1, 0xc1, 0x0a, + 0x75, 0x43, 0xea, 0xd7, 0xa9, 0xdf, 0x71, 0xd0, 0x5c, 0xa1, 0x41, 0x43, 0xf2, 0x22, 0x14, 0xaa, + 0xe6, 0x1d, 0xb1, 0x7e, 0x39, 0xbf, 0xd7, 0x8c, 0x47, 0x58, 0x6d, 0xa4, 0xbb, 0xcb, 0x1f, 0xf3, + 0xa6, 0x50, 0x85, 0x52, 0x35, 0x08, 0x9c, 0x5d, 0xb7, 0xc3, 0xfd, 0x75, 0x0a, 0x9a, 0x79, 0x8a, + 0x28, 0x4f, 0x3d, 0x86, 0xa9, 0x28, 0xc6, 0x7f, 0x96, 0x83, 0xd9, 0x6a, 0xb7, 0xab, 0x7f, 0xb2, + 0x6e, 0x1a, 0x95, 0x1b, 0xde, 0x34, 0xca, 0x81, 0x69, 0xad, 0xbb, 0x7c, 0x49, 0xc5, 0x82, 0xef, + 0x80, 0x91, 0xe1, 0x9f, 0xdd, 0x8d, 0x8a, 0xac, 0x40, 0x7f, 0xd7, 0x4f, 0x10, 0x36, 0xfe, 0xd3, + 0x22, 0xf2, 0x10, 0xc1, 0x6d, 0x85, 0xf1, 0x6e, 0x2e, 0xc3, 0x78, 0xf7, 0x4d, 0x50, 0x24, 0x1c, + 0xf5, 0x88, 0x53, 0x64, 0x45, 0x55, 0xeb, 0x15, 0x03, 0x93, 0xfd, 0xa4, 0x19, 0x6f, 0x01, 0x7b, + 0xf3, 0x62, 0x72, 0x03, 0x3f, 0x11, 0x0b, 0xde, 0x35, 0x20, 0xeb, 0x2e, 0xda, 0x1a, 0xd0, 0xc6, + 0xbe, 0xd3, 0xbd, 0x47, 0x7d, 0x67, 0xe7, 0x40, 0x6c, 0x00, 0x1c, 0x7c, 0x47, 0xd4, 0x5a, 0xc1, + 0xbe, 0xd3, 0xb5, 0x1e, 0x60, 0xbd, 0x99, 0x81, 0x43, 0xde, 0x83, 0x71, 0x93, 0x3e, 0xf4, 0x9d, + 0x50, 0x1a, 0xa7, 0x4d, 0x47, 0x4a, 0x5c, 0x2c, 0xe5, 0x7b, 0xc1, 0xe7, 0x3f, 0x54, 0xae, 0x28, + 0xea, 0xc9, 0x12, 0x17, 0x52, 0xb8, 0x11, 0xda, 0x54, 0xdc, 0xdb, 0xea, 0xfd, 0x46, 0x3f, 0x19, + 0x85, 0x5c, 0x80, 0x51, 0x94, 0x74, 0xc4, 0x5d, 0x00, 0x7d, 0xd1, 0x50, 0x76, 0x56, 0xc5, 0x30, + 0x84, 0x40, 0x9d, 0x80, 0x7c, 0xcc, 0x0f, 0x16, 0x8a, 0x28, 0xa5, 0x2b, 0x25, 0x49, 0x31, 0x6d, + 0xe2, 0xb1, 0xc4, 0xb4, 0x0d, 0x28, 0x9b, 0xdc, 0xad, 0xb5, 0x55, 0xed, 0xe2, 0x8b, 0x71, 0xb0, + 0x00, 0xb8, 0x93, 0xcf, 0x1e, 0x1d, 0x56, 0x9e, 0x13, 0x2e, 0xaf, 0x2d, 0xcb, 0xee, 0xf2, 0x87, + 0x66, 0x8d, 0x8d, 0x24, 0x31, 0xc9, 0x9b, 0x30, 0xc2, 0x58, 0xaf, 0x30, 0xf8, 0x95, 0x2f, 0x6f, + 0x31, 0x37, 0xe6, 0x9b, 0xb3, 0xe9, 0x69, 0x3c, 0x01, 0x51, 0x88, 0x05, 0xd3, 0xfa, 0x72, 0x17, + 0xb6, 0x5f, 0x0b, 0xf1, 0x78, 0xea, 0xf5, 0xe2, 0x39, 0x4e, 0x94, 0x59, 0x4d, 0x2c, 0x54, 0x77, + 0x40, 0x62, 0x93, 0xae, 0x42, 0x71, 0x73, 0xa5, 0x5e, 0xf7, 0xfc, 0x90, 0x5f, 0x75, 0xe2, 0x93, + 0x85, 0x95, 0x99, 0xb6, 0xbb, 0x4b, 0xf9, 0x59, 0x1c, 0x36, 0xbb, 0x56, 0x97, 0x81, 0xa9, 0x67, + 0xb1, 0x44, 0x25, 0x1f, 0xc0, 0x89, 0xad, 0x80, 0x56, 0xdd, 0x03, 0x3c, 0x9d, 0x95, 0xad, 0x32, + 0x8d, 0x4b, 0x0f, 0x1f, 0x94, 0xd8, 0x55, 0xd0, 0x76, 0x0f, 0x2c, 0x7e, 0xaa, 0x67, 0x6f, 0x9c, + 0x6c, 0x2a, 0xe4, 0x32, 0x14, 0x6e, 0xaf, 0xd4, 0xc5, 0x9d, 0x48, 0x9a, 0x66, 0xde, 0x5e, 0xa9, + 0xf3, 0x85, 0xd4, 0xd1, 0xed, 0xca, 0x6f, 0xaf, 0xd4, 0x3f, 0x39, 0xe3, 0xe3, 0xaf, 0xe2, 0x97, + 0x90, 0x05, 0x18, 0x6f, 0x72, 0x18, 0x41, 0x4d, 0xfe, 0x24, 0x04, 0x46, 0x6c, 0x7f, 0x57, 0x1c, + 0x83, 0x26, 0xfe, 0x4d, 0x5e, 0x81, 0xb2, 0xdf, 0x73, 0x2d, 0x3b, 0xe0, 0x4f, 0x73, 0xbd, 0x80, + 0xfa, 0x9c, 0xcd, 0x9a, 0x53, 0x7e, 0xcf, 0xad, 0x06, 0x4c, 0xee, 0x42, 0x43, 0xe1, 0x7f, 0x92, + 0x03, 0x65, 0xff, 0x14, 0x4d, 0xda, 0x72, 0x7c, 0xda, 0x0c, 0xc5, 0xd9, 0x2c, 0x1c, 0x49, 0x79, + 0x59, 0xc2, 0x84, 0x15, 0xcb, 0xc8, 0xbb, 0x30, 0x2e, 0xce, 0x10, 0xc1, 0x33, 0xe5, 0xbe, 0x13, + 0x2f, 0x2e, 0xdc, 0xe3, 0x38, 0x75, 0xfe, 0x48, 0x24, 0xc6, 0xb2, 0x6f, 0xde, 0xdf, 0x5c, 0x69, + 0xdb, 0x4e, 0x27, 0x10, 0x07, 0x01, 0x72, 0x8d, 0x0f, 0x1f, 0x86, 0x56, 0x13, 0x4b, 0x55, 0x96, + 0x1d, 0x81, 0x1a, 0x37, 0xe4, 0x83, 0xcf, 0x31, 0x76, 0xd8, 0x15, 0x18, 0xbd, 0x17, 0xab, 0x05, + 0x97, 0x27, 0x8e, 0x0e, 0x2b, 0x7c, 0x6c, 0x4d, 0x5e, 0x6e, 0x50, 0x98, 0x88, 0xd6, 0x1d, 0xa3, + 0xc5, 0x7e, 0x20, 0xad, 0x29, 0x4e, 0x8b, 0xad, 0x40, 0x13, 0x4b, 0x99, 0x9c, 0xb6, 0xea, 0xb6, + 0x10, 0x20, 0x8f, 0x00, 0x38, 0x3c, 0xd4, 0x6d, 0xe1, 0x32, 0x55, 0x7b, 0x27, 0xc0, 0x14, 0x69, + 0xe8, 0xc7, 0x73, 0x30, 0xad, 0xcf, 0x31, 0xb9, 0x04, 0x63, 0xc2, 0x57, 0x34, 0x87, 0x5a, 0x56, + 0x46, 0x6d, 0x8c, 0x7b, 0x89, 0x6a, 0xbe, 0xa1, 0x02, 0x8a, 0x09, 0x7d, 0x82, 0x82, 0x90, 0x78, + 0x50, 0xe8, 0x13, 0xab, 0xc0, 0x94, 0x75, 0xc4, 0x60, 0xf7, 0xd0, 0xa0, 0xd7, 0x0e, 0xd5, 0xd7, + 0x61, 0x1f, 0x4b, 0x4c, 0x51, 0x63, 0x7c, 0x27, 0x07, 0x63, 0x9c, 0x31, 0x26, 0xec, 0x4c, 0x73, + 0x8f, 0x63, 0x67, 0xfa, 0x4d, 0x98, 0x37, 0xbd, 0x36, 0x0d, 0xaa, 0xee, 0xc1, 0xc3, 0x3d, 0xea, + 0xd3, 0xba, 0xef, 0xed, 0xc8, 0x87, 0xec, 0xc9, 0xa5, 0x17, 0x34, 0x06, 0x9c, 0x05, 0xc8, 0x5f, + 0x22, 0x7d, 0x56, 0xc3, 0xb6, 0x29, 0x56, 0xb1, 0xbd, 0x9a, 0x78, 0xf8, 0xce, 0x6c, 0xc4, 0xf8, + 0x07, 0x39, 0x58, 0xec, 0x4f, 0x1a, 0x8f, 0x4f, 0xfe, 0x67, 0x2c, 0xb7, 0xf0, 0xe3, 0x93, 0x97, + 0x26, 0x8c, 0x5f, 0x15, 0x60, 0x62, 0xc2, 0x89, 0x6a, 0xb3, 0x49, 0xbb, 0x21, 0x23, 0x2c, 0x4c, + 0x36, 0x23, 0xb9, 0xa6, 0xc8, 0xd5, 0x2b, 0x36, 0x02, 0x70, 0x33, 0x5a, 0x69, 0x48, 0x8a, 0xab, + 0x2e, 0x1b, 0xd5, 0x38, 0xcc, 0x01, 0x34, 0x1a, 0x6b, 0xb7, 0xe8, 0x41, 0xdd, 0x76, 0x50, 0x50, + 0xe1, 0xbc, 0xe6, 0x96, 0x60, 0x0e, 0x25, 0x61, 0xfa, 0xc1, 0x59, 0xd4, 0x3e, 0x3d, 0xd0, 0x4c, + 0x3f, 0x24, 0x28, 0xef, 0x95, 0xf3, 0xc0, 0x0e, 0x29, 0x43, 0x44, 0xb5, 0xb4, 0xec, 0x15, 0x96, + 0x26, 0x30, 0x15, 0x60, 0xf2, 0x01, 0x4c, 0xc7, 0xbf, 0x22, 0x03, 0x96, 0xe9, 0x88, 0x01, 0xe9, + 0x95, 0xcb, 0xcf, 0x1f, 0x1d, 0x56, 0x16, 0x15, 0xaa, 0x49, 0xd3, 0x96, 0x04, 0x31, 0xe3, 0x17, + 0x73, 0x68, 0xb6, 0x25, 0x3b, 0x78, 0x0e, 0x46, 0x22, 0x47, 0x83, 0x92, 0x38, 0x6d, 0xf4, 0x57, + 0x6e, 0xac, 0x67, 0x72, 0x65, 0xdc, 0x13, 0x64, 0xad, 0x7a, 0x0f, 0x58, 0x2d, 0xb9, 0x01, 0xe3, + 0x43, 0x7d, 0x33, 0x6e, 0xc7, 0x8c, 0x6f, 0x95, 0xd8, 0x38, 0x0b, 0x37, 0xef, 0x6f, 0x7e, 0x7a, + 0x67, 0xe1, 0xa7, 0xf2, 0x30, 0xc3, 0xc6, 0xb5, 0xda, 0x0b, 0xf7, 0x3c, 0xdf, 0x09, 0x0f, 0x9e, + 0x5a, 0x05, 0xf9, 0xdb, 0xda, 0xdd, 0x73, 0x51, 0x9e, 0x92, 0x6a, 0xdf, 0x86, 0xd2, 0x93, 0xff, + 0x37, 0xa3, 0x30, 0x97, 0x81, 0x45, 0x5e, 0xd7, 0x5e, 0xdd, 0x16, 0x64, 0xdc, 0x8c, 0xef, 0x1d, + 0x56, 0x4a, 0x12, 0x7c, 0x33, 0x8e, 0xa3, 0xb1, 0xa4, 0xdb, 0x40, 0xf2, 0x91, 0xc2, 0x47, 0x38, + 0xd5, 0x06, 0x52, 0xb7, 0x7c, 0xbc, 0x00, 0xa3, 0xc8, 0x99, 0x84, 0xdd, 0x2f, 0x4a, 0x96, 0xc8, + 0xeb, 0x34, 0x3b, 0x27, 0x56, 0x40, 0xd6, 0x60, 0x9c, 0xfd, 0x71, 0xdb, 0xee, 0x8a, 0x27, 0x70, + 0x12, 0x69, 0x3f, 0xb0, 0xb4, 0xeb, 0xb8, 0xbb, 0xaa, 0x02, 0xa4, 0x4d, 0xad, 0x8e, 0xdd, 0xd5, + 0x44, 0x60, 0x0e, 0xa8, 0x29, 0x52, 0x8a, 0xfd, 0x15, 0x29, 0xb9, 0x63, 0x15, 0x29, 0x3b, 0x00, + 0x0d, 0x67, 0xd7, 0x75, 0xdc, 0xdd, 0x6a, 0x7b, 0x57, 0x44, 0x1f, 0xb9, 0xd0, 0x7f, 0x16, 0x2e, + 0xc5, 0xc0, 0xb8, 0x70, 0x9f, 0x45, 0x3b, 0x15, 0x5e, 0x66, 0xd9, 0xed, 0x5d, 0xcd, 0xdd, 0x50, + 0xa1, 0x4c, 0xee, 0x00, 0x54, 0x9b, 0xa1, 0xf3, 0x80, 0x2d, 0xe1, 0x40, 0xc8, 0xab, 0xf2, 0x93, + 0x57, 0xaa, 0xb7, 0xe8, 0x01, 0xde, 0xb1, 0xe4, 0x8b, 0xbf, 0x8d, 0xa0, 0x6c, 0x27, 0x68, 0xbe, + 0x64, 0x31, 0x05, 0xd2, 0x85, 0x13, 0xd5, 0x56, 0xcb, 0x61, 0x7d, 0xb0, 0xdb, 0x9b, 0x3c, 0x6e, + 0x0c, 0x92, 0x2e, 0x65, 0x93, 0xbe, 0x20, 0x1f, 0xa9, 0xed, 0x08, 0xcb, 0x92, 0xe1, 0x66, 0x12, + 0xcd, 0x64, 0x13, 0x36, 0x1a, 0x30, 0xad, 0x77, 0x5e, 0x8f, 0x9a, 0x52, 0x82, 0xa2, 0xd9, 0xa8, + 0x5a, 0x8d, 0xb5, 0xea, 0x95, 0x72, 0x8e, 0x94, 0xa1, 0x24, 0x7e, 0x2d, 0x59, 0x4b, 0x6f, 0x5c, + 0x2b, 0xe7, 0xb5, 0x92, 0x37, 0xae, 0x2c, 0x95, 0x0b, 0x8b, 0xf9, 0x85, 0x5c, 0xc2, 0xd3, 0x78, + 0xbc, 0x5c, 0xe4, 0xba, 0x6f, 0xe3, 0x57, 0x72, 0x50, 0x94, 0xdf, 0x4e, 0xae, 0x41, 0xa1, 0xd1, + 0x58, 0x4b, 0xf8, 0xea, 0xc6, 0xa7, 0x0c, 0xe7, 0xa7, 0x41, 0xa0, 0x3a, 0x64, 0x30, 0x04, 0x86, + 0xb7, 0xb9, 0xd1, 0x10, 0xf2, 0x9a, 0xc4, 0x8b, 0x99, 0x37, 0xc7, 0xcb, 0x70, 0x60, 0xbc, 0x06, + 0x85, 0x9b, 0xf7, 0x37, 0xc5, 0x6d, 0x52, 0xe2, 0xc5, 0xfc, 0x94, 0xe3, 0x7d, 0xf8, 0x50, 0xe5, + 0xf2, 0x0c, 0xc1, 0x30, 0x61, 0x52, 0x59, 0xc8, 0x5c, 0x40, 0xe9, 0x78, 0x51, 0xa8, 0x10, 0x21, + 0xa0, 0xb0, 0x12, 0x53, 0xd4, 0x30, 0xb1, 0x6d, 0xc3, 0x6b, 0xda, 0x6d, 0x21, 0xe9, 0xa0, 0xd8, + 0xd6, 0x66, 0x05, 0x26, 0x2f, 0x37, 0x7e, 0x33, 0x07, 0xe5, 0xba, 0xef, 0xf1, 0x70, 0x26, 0x9b, + 0xde, 0x3e, 0x75, 0xef, 0x5d, 0x21, 0x17, 0xe5, 0x96, 0xcb, 0x45, 0x1a, 0xbd, 0x51, 0xdc, 0x72, + 0x89, 0x67, 0x51, 0xb1, 0xed, 0x94, 0x68, 0x2c, 0xf9, 0xe1, 0xa3, 0x38, 0x1c, 0x13, 0x8d, 0xa5, + 0x02, 0xa3, 0xf8, 0x39, 0x82, 0x39, 0xe2, 0x97, 0x87, 0xac, 0xc0, 0xe4, 0xe5, 0x0a, 0x6f, 0x3a, + 0xcc, 0xa7, 0xfa, 0xb0, 0xf4, 0xa9, 0x8a, 0x84, 0xa0, 0x77, 0xae, 0x3f, 0xbf, 0x26, 0xb7, 0xfa, + 0x44, 0x42, 0x48, 0x10, 0xe0, 0x8e, 0x8c, 0x4b, 0xfc, 0xb5, 0x84, 0xbb, 0x03, 0xa9, 0x3a, 0xb1, + 0x94, 0x63, 0xf5, 0x97, 0x61, 0x3e, 0x39, 0xbe, 0xa8, 0xba, 0xad, 0xc2, 0x8c, 0x5e, 0x2e, 0xb5, + 0xb8, 0xa7, 0x32, 0xdb, 0xbd, 0xb7, 0x64, 0x26, 0xe1, 0x8d, 0xff, 0x25, 0x07, 0x13, 0xf8, 0xa7, + 0xd9, 0xe3, 0xd2, 0x66, 0xf5, 0x7e, 0x43, 0x28, 0x94, 0x54, 0x69, 0xd3, 0x7e, 0x18, 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, 0xf7, 0x1b, 0x4c, 0x22, 0x56, 0xcd, 0xbe, 0xd8, 0x37, 0x6a, + 0xd2, 0xb0, 0x00, 0x32, 0x7e, 0x7d, 0x2a, 0x39, 0x80, 0xe2, 0xf4, 0x7c, 0xcc, 0x8d, 0xf6, 0x16, + 0x8c, 0x56, 0xdb, 0x6d, 0xef, 0xa1, 0x60, 0x39, 0xf2, 0xbe, 0x1f, 0x8d, 0x1f, 0x3f, 0x1c, 0x51, + 0x19, 0xaa, 0xf9, 0x5c, 0xb3, 0x02, 0xb2, 0x02, 0x13, 0xd5, 0xfb, 0x8d, 0xf5, 0xf5, 0xda, 0xe6, + 0x26, 0xf7, 0x2f, 0x2d, 0x2c, 0xbf, 0x2c, 0xc7, 0xc7, 0x71, 0x5a, 0x56, 0xd2, 0x2e, 0x25, 0xbe, + 0x38, 0xc5, 0x78, 0xe4, 0x1d, 0x80, 0x9b, 0x9e, 0xe3, 0x72, 0xe5, 0xaf, 0xe8, 0xfc, 0x99, 0xa3, + 0xc3, 0xca, 0xe4, 0x87, 0x9e, 0xe3, 0x0a, 0x6d, 0x31, 0xfb, 0xf6, 0x18, 0xc8, 0x54, 0xfe, 0x66, + 0x23, 0xbd, 0xec, 0x71, 0x7b, 0xd5, 0xd1, 0x78, 0xa4, 0xb7, 0xbd, 0x94, 0x96, 0x52, 0x82, 0x91, + 0x0e, 0xcc, 0x34, 0x7a, 0xbb, 0xbb, 0x94, 0x1d, 0x13, 0x42, 0x0b, 0x37, 0x26, 0x2e, 0xfc, 0x51, + 0x30, 0x32, 0x7e, 0x11, 0x64, 0xb7, 0xd0, 0x60, 0xf9, 0x75, 0xb6, 0x2b, 0xbe, 0x7b, 0x58, 0x11, + 0xf6, 0x2e, 0x4c, 0xee, 0x0b, 0x24, 0x7e, 0x5a, 0x07, 0x97, 0xa4, 0x4d, 0xee, 0xc2, 0x18, 0x7f, + 0x69, 0x13, 0xfe, 0x92, 0x2f, 0x0c, 0xd8, 0x81, 0x1c, 0xb0, 0xdf, 0x5b, 0x2e, 0xaf, 0x25, 0xf7, + 0xa1, 0xb8, 0xe2, 0xf8, 0xcd, 0x36, 0x5d, 0x59, 0x17, 0x82, 0xc4, 0x8b, 0x03, 0x48, 0x4a, 0x50, + 0x3e, 0x2e, 0x4d, 0xfc, 0xd5, 0x74, 0x54, 0xc1, 0x42, 0x42, 0x90, 0xbf, 0x9a, 0x83, 0x67, 0xa3, + 0xaf, 0xaf, 0xee, 0x52, 0x37, 0xbc, 0x6d, 0x87, 0xcd, 0x3d, 0xea, 0x8b, 0x51, 0x9a, 0x18, 0x34, + 0x4a, 0x5f, 0x48, 0x8d, 0xd2, 0xf9, 0x78, 0x94, 0x6c, 0x46, 0xcc, 0xea, 0x70, 0x6a, 0xe9, 0x31, + 0x1b, 0xd4, 0x2a, 0xb1, 0x00, 0xe2, 0x37, 0x64, 0x61, 0x38, 0xf7, 0xf2, 0x80, 0x0e, 0xc7, 0xc0, + 0xc2, 0x4f, 0x2e, 0xfa, 0xad, 0x19, 0x7a, 0x47, 0xa5, 0xe4, 0x96, 0x74, 0x4e, 0xe6, 0x22, 0xce, + 0xd9, 0x01, 0xb4, 0xb9, 0xc3, 0xf2, 0xdc, 0x80, 0x30, 0x04, 0x7c, 0xb6, 0x37, 0xec, 0x6d, 0x21, + 0xd5, 0x1c, 0x33, 0xdb, 0x1b, 0x76, 0x3c, 0xdb, 0x6d, 0x3b, 0x39, 0xdb, 0x1b, 0xf6, 0x36, 0x59, + 0xe1, 0x11, 0x15, 0xb8, 0xfb, 0xfd, 0xf3, 0x83, 0xa8, 0x49, 0x0d, 0x58, 0x46, 0x64, 0x85, 0xaf, + 0xc0, 0x44, 0xa3, 0x6b, 0x37, 0x69, 0xdb, 0xd9, 0x09, 0x85, 0x81, 0xc2, 0x4b, 0x03, 0x48, 0x45, + 0xb0, 0xe2, 0x41, 0x5a, 0xfe, 0x54, 0xef, 0x5c, 0x11, 0x0c, 0xfb, 0xc2, 0xcd, 0xfa, 0x6d, 0xa1, + 0x8f, 0x1b, 0xf4, 0x85, 0x9b, 0xf5, 0xdb, 0x42, 0x80, 0xe9, 0x76, 0x34, 0x01, 0xa6, 0x7e, 0x9b, + 0x74, 0x61, 0x7a, 0x93, 0xfa, 0xbe, 0xbd, 0xe3, 0xf9, 0x1d, 0xae, 0xf5, 0xe5, 0x2e, 0x9d, 0x17, + 0x06, 0xd1, 0xd3, 0x10, 0xb8, 0xb2, 0x33, 0x94, 0x65, 0x56, 0x52, 0x55, 0x9c, 0xa0, 0xcf, 0xc6, + 0x64, 0xd9, 0x09, 0xb7, 0x7b, 0xcd, 0x7d, 0x1a, 0x2e, 0xcc, 0x1e, 0x3b, 0x26, 0x11, 0x2c, 0x1f, + 0x93, 0x6d, 0xf9, 0x53, 0x1d, 0x93, 0x08, 0x86, 0x2d, 0x03, 0x11, 0x37, 0x81, 0x1c, 0xbb, 0x0c, + 0x38, 0x20, 0x5f, 0x06, 0xfd, 0x02, 0x28, 0x90, 0x3d, 0x28, 0x2d, 0x7b, 0x3d, 0x97, 0xc9, 0xb5, + 0x5d, 0xdb, 0xf1, 0x17, 0xe6, 0x90, 0xec, 0x2b, 0x83, 0x3e, 0x58, 0x01, 0xe7, 0xee, 0x00, 0xdb, + 0xac, 0x84, 0x89, 0xce, 0xac, 0x48, 0x7d, 0xbf, 0x51, 0x41, 0x49, 0x0b, 0x26, 0x71, 0x29, 0xd7, + 0xe8, 0x03, 0xaf, 0x1b, 0x2c, 0xcc, 0x63, 0x43, 0xe7, 0x8e, 0xdb, 0x14, 0x1c, 0x9a, 0x1b, 0x0a, + 0xe0, 0xd6, 0xb0, 0x5a, 0x58, 0xa2, 0x2a, 0xd5, 0x15, 0x40, 0xe3, 0x1f, 0x8f, 0x42, 0xe5, 0x18, + 0x62, 0xe4, 0x9e, 0x3c, 0x9b, 0xb8, 0x04, 0xf0, 0xda, 0x70, 0xdf, 0x70, 0xe9, 0xd8, 0x63, 0xeb, + 0x2d, 0x98, 0xbe, 0xab, 0xd8, 0x2c, 0x44, 0x36, 0x24, 0x88, 0xa3, 0x5a, 0x33, 0x58, 0x4e, 0xcb, + 0x4c, 0x80, 0x2e, 0xfe, 0x71, 0x01, 0x46, 0x50, 0xb0, 0x78, 0x11, 0x0a, 0x8d, 0xde, 0xb6, 0xfa, + 0xee, 0x16, 0x68, 0xec, 0x9a, 0xd5, 0x92, 0xb7, 0x61, 0x52, 0x78, 0x07, 0x29, 0xb7, 0x53, 0x1c, + 0x24, 0xe9, 0x4a, 0x94, 0x74, 0xcd, 0x50, 0xc0, 0xc9, 0x7b, 0x50, 0xaa, 0x3b, 0x5d, 0xda, 0x76, + 0x5c, 0xaa, 0x38, 0x1a, 0xe0, 0x5c, 0x76, 0x45, 0x79, 0xea, 0x2d, 0x4e, 0x45, 0xd0, 0xfd, 0x98, + 0x46, 0x86, 0xf7, 0x63, 0x7a, 0x0f, 0x4a, 0x35, 0xba, 0xe3, 0xb8, 0x8e, 0x18, 0x9f, 0xd1, 0xb8, + 0xe1, 0x56, 0x54, 0xae, 0x63, 0x6b, 0x08, 0x64, 0x19, 0xa6, 0x4c, 0xda, 0xf5, 0x02, 0x27, 0xf4, + 0xfc, 0x83, 0x2d, 0x73, 0x5d, 0xd8, 0xb7, 0xa0, 0x82, 0xce, 0x8f, 0x2a, 0xac, 0x9e, 0xaf, 0x9e, + 0x44, 0x3a, 0x0a, 0xb9, 0x03, 0xb3, 0x71, 0x81, 0x6e, 0x17, 0x26, 0x1e, 0x5e, 0x22, 0x3a, 0x69, + 0x8b, 0xee, 0x34, 0xaa, 0xfe, 0x4d, 0x26, 0xdd, 0x11, 0xf6, 0xe1, 0xc9, 0x6f, 0xf2, 0xe9, 0x4e, + 0xf6, 0x37, 0x99, 0x74, 0xc7, 0xf8, 0xb5, 0x02, 0x9c, 0xea, 0xc3, 0xda, 0xc8, 0x1d, 0x7d, 0xb9, + 0xbe, 0x38, 0x98, 0x13, 0x1e, 0xbf, 0x4c, 0x37, 0xa0, 0xbc, 0x7a, 0x0b, 0x2f, 0xf4, 0xfc, 0x59, + 0x7b, 0xa5, 0x2a, 0x85, 0x50, 0xec, 0x3e, 0xdd, 0x47, 0xdf, 0x10, 0xf9, 0x1c, 0xde, 0xd4, 0x62, + 0xb8, 0xa4, 0x30, 0x17, 0x7f, 0x28, 0x2f, 0xd6, 0x6d, 0x22, 0xe0, 0x66, 0xee, 0xb1, 0x02, 0x6e, + 0x7e, 0x11, 0x4a, 0xab, 0xb7, 0xb8, 0xba, 0x6d, 0xcd, 0x0e, 0xf6, 0xc4, 0x9a, 0xc2, 0x21, 0xa4, + 0xfb, 0xf2, 0x19, 0x67, 0xcf, 0xd6, 0x2e, 0xb6, 0x1a, 0x06, 0xd9, 0x82, 0x39, 0xfe, 0x6d, 0xce, + 0x8e, 0xd3, 0xe4, 0x71, 0xfb, 0x1c, 0xbb, 0x2d, 0x56, 0xd8, 0x8b, 0x47, 0x87, 0x95, 0x0a, 0xdd, + 0x47, 0xaf, 0x17, 0x51, 0x6f, 0x05, 0x08, 0xa0, 0xba, 0xbf, 0x64, 0xe0, 0xab, 0x51, 0xc0, 0xcc, + 0x09, 0x6c, 0x90, 0xb5, 0xc6, 0xda, 0x66, 0xb0, 0x1c, 0xc8, 0xf8, 0xc3, 0x51, 0x58, 0xec, 0x2f, + 0x76, 0x91, 0xf7, 0xf5, 0x09, 0x3c, 0x77, 0xac, 0xa0, 0x76, 0xfc, 0x1c, 0x7e, 0x09, 0xe6, 0x57, + 0xdd, 0x90, 0xfa, 0x5d, 0xdf, 0x91, 0xd1, 0xc3, 0xd6, 0xbc, 0x40, 0x7a, 0x19, 0xa1, 0x92, 0x9d, + 0x46, 0xf5, 0xc2, 0x5f, 0x0e, 0xdf, 0x85, 0x54, 0x25, 0x7b, 0x16, 0x05, 0xb2, 0x0a, 0xd3, 0x4a, + 0x79, 0xbb, 0xb7, 0xab, 0xbe, 0xd5, 0xab, 0x34, 0xdb, 0x3d, 0xd5, 0x05, 0x23, 0x81, 0x84, 0x9e, + 0x4c, 0xa1, 0x1d, 0x3a, 0xcd, 0x9b, 0xf7, 0x6f, 0x35, 0xc4, 0x74, 0x72, 0x4f, 0x26, 0x2c, 0xb5, + 0x3e, 0x7c, 0xb8, 0xaf, 0xc9, 0x4d, 0x31, 0xf0, 0xe2, 0x2f, 0x3e, 0x16, 0x27, 0xfc, 0x3c, 0x40, + 0xbc, 0x95, 0xd4, 0x48, 0x00, 0xf1, 0xd6, 0xd3, 0x9d, 0x15, 0x65, 0x29, 0x59, 0x83, 0x99, 0xf8, + 0xd7, 0xdd, 0x87, 0xae, 0x7c, 0x2f, 0xe3, 0x2a, 0x58, 0x65, 0xe7, 0x7a, 0xac, 0x4e, 0x15, 0xc5, + 0x13, 0x68, 0x64, 0x09, 0x8a, 0xf7, 0x3d, 0x7f, 0x7f, 0x87, 0xcd, 0xf1, 0x48, 0x7c, 0x59, 0x78, + 0x28, 0xca, 0x54, 0xa1, 0x58, 0xc2, 0xb1, 0xed, 0xb2, 0xea, 0x3e, 0x70, 0x7c, 0x0f, 0xed, 0x1b, + 0x54, 0x0b, 0x3f, 0x1a, 0x17, 0x6b, 0x31, 0x58, 0xe2, 0x62, 0x72, 0x01, 0x46, 0xab, 0xcd, 0xd0, + 0xf3, 0x05, 0xfb, 0xe3, 0x2b, 0x85, 0x15, 0x68, 0x2b, 0x85, 0x15, 0xb0, 0x41, 0x64, 0x3c, 0x69, + 0x3c, 0x1e, 0x44, 0x9d, 0x11, 0xb1, 0x5a, 0x76, 0xd9, 0x31, 0xe9, 0x0e, 0x6a, 0x47, 0xb5, 0x70, + 0xb2, 0x3b, 0x29, 0xbd, 0xba, 0x00, 0x33, 0x7e, 0x18, 0xfa, 0x2e, 0x79, 0x26, 0x5d, 0x3e, 0xde, + 0x92, 0xdf, 0xb0, 0x87, 0x58, 0xf2, 0xaf, 0x47, 0x2e, 0x90, 0x6a, 0x54, 0x25, 0x2c, 0x51, 0xe5, + 0x1a, 0xe1, 0x0c, 0xa9, 0xaf, 0xbf, 0xc2, 0xe3, 0xac, 0xbf, 0xbf, 0x57, 0x7c, 0x9c, 0xf5, 0x27, + 0xc6, 0x37, 0x3f, 0xec, 0xf8, 0x16, 0x86, 0x1a, 0x5f, 0x76, 0xa8, 0x44, 0xb1, 0x8c, 0xeb, 0x76, + 0xa8, 0x71, 0xc4, 0x28, 0x00, 0xb5, 0xd5, 0xb5, 0xb5, 0x78, 0x7f, 0x3a, 0x8a, 0x22, 0x24, 0x20, + 0x85, 0xd1, 0xb4, 0x90, 0x90, 0xc0, 0x57, 0xc1, 0x19, 0x23, 0x90, 0x67, 0x7e, 0x03, 0x1d, 0xea, + 0xc4, 0x62, 0xe3, 0xd6, 0x2f, 0x52, 0x4c, 0xe0, 0xbe, 0x76, 0xda, 0xfb, 0x84, 0x86, 0x94, 0x5c, + 0xe7, 0xe3, 0x8f, 0xb5, 0xce, 0xb9, 0xc1, 0xb7, 0xbf, 0xe1, 0xed, 0x3a, 0xd2, 0xed, 0x4a, 0x1a, + 0x7c, 0xfb, 0x56, 0x9b, 0x95, 0x26, 0x0c, 0xbe, 0x39, 0x28, 0xb9, 0x08, 0x63, 0xec, 0xc7, 0x7a, + 0x4d, 0x98, 0x64, 0xa0, 0xd2, 0x03, 0x91, 0x74, 0x5f, 0x37, 0x0e, 0x24, 0x9b, 0x59, 0xed, 0xd8, + 0x4e, 0x5b, 0xc4, 0xdd, 0x89, 0x9b, 0xa1, 0xac, 0x34, 0xd9, 0x0c, 0x82, 0x92, 0x26, 0x94, 0x4c, + 0xba, 0x53, 0xf7, 0xbd, 0x90, 0x36, 0x43, 0xda, 0x12, 0x17, 0x3d, 0xa9, 0xeb, 0x58, 0xf6, 0x3c, + 0x7e, 0x89, 0x45, 0xb7, 0xa8, 0xdc, 0x77, 0x0f, 0x2b, 0xc0, 0x8a, 0xb8, 0x23, 0x25, 0x13, 0x79, + 0xd8, 0xfc, 0x77, 0x25, 0xb2, 0x7a, 0xb0, 0xa9, 0x44, 0xc9, 0x37, 0x19, 0xab, 0x8f, 0x86, 0x24, + 0x6e, 0xac, 0xd4, 0xa7, 0xb1, 0x37, 0x32, 0x1b, 0xab, 0x28, 0xa3, 0x9d, 0xd9, 0x68, 0x66, 0x23, + 0xe4, 0x1d, 0x98, 0x5c, 0x59, 0x5f, 0xf1, 0xdc, 0x1d, 0x67, 0xb7, 0xb1, 0x56, 0xc5, 0xdb, 0xa2, + 0x90, 0xd7, 0x9a, 0x8e, 0xd5, 0xc4, 0x72, 0x2b, 0xd8, 0xb3, 0xb5, 0x50, 0x10, 0x31, 0x3c, 0xb9, + 0x01, 0xd3, 0xf2, 0xa7, 0x49, 0x77, 0x98, 0xbc, 0x36, 0xad, 0x38, 0x5e, 0x47, 0x14, 0xd8, 0x40, + 0xe8, 0x22, 0x5b, 0x02, 0x8d, 0x2d, 0xc6, 0x1a, 0xed, 0xb6, 0xbd, 0x03, 0xf6, 0x79, 0x9b, 0x0e, + 0xf5, 0xf1, 0x5a, 0x28, 0x16, 0x63, 0x2b, 0xaa, 0xb1, 0x42, 0x47, 0x37, 0x44, 0xd1, 0x91, 0x98, + 0xe8, 0x27, 0x96, 0xf8, 0x3d, 0x27, 0x70, 0xb6, 0x9d, 0xb6, 0x13, 0x1e, 0xe0, 0x85, 0x50, 0xc8, + 0x3e, 0x72, 0x5f, 0x3c, 0x88, 0x6a, 0x55, 0xd1, 0x2f, 0x85, 0x6a, 0xfc, 0x4a, 0x1e, 0x9e, 0x1b, + 0xa4, 0x1c, 0x21, 0x0d, 0x9d, 0x0f, 0x9e, 0x1f, 0x42, 0xa1, 0x72, 0x3c, 0x27, 0x5c, 0xed, 0x73, + 0xcf, 0xc0, 0xc1, 0x48, 0xdc, 0x33, 0xd4, 0xc1, 0x48, 0xdc, 0x38, 0x1e, 0x08, 0x36, 0xf7, 0x51, + 0x83, 0x12, 0x5c, 0x83, 0x89, 0x15, 0xcf, 0x0d, 0xe9, 0xa3, 0x30, 0x11, 0x82, 0x87, 0x17, 0x26, + 0x03, 0x32, 0x48, 0x50, 0xe3, 0xdf, 0xe5, 0xe1, 0xcc, 0x40, 0xed, 0x00, 0xd9, 0xd4, 0x47, 0xed, + 0xc2, 0x30, 0x2a, 0x85, 0xe3, 0x87, 0x6d, 0x29, 0x65, 0xc0, 0x7c, 0xac, 0xd3, 0xec, 0xe2, 0x7f, + 0x97, 0x13, 0x83, 0xf4, 0x19, 0x18, 0xc7, 0xa6, 0xa2, 0x21, 0xe2, 0x5a, 0x78, 0xe4, 0xc2, 0x8e, + 0xae, 0x85, 0xe7, 0x60, 0xe4, 0x2a, 0x14, 0x57, 0xec, 0x76, 0x5b, 0x09, 0x50, 0x84, 0x17, 0xfc, + 0x26, 0x96, 0x25, 0xac, 0xf0, 0x25, 0x20, 0x3b, 0xb6, 0xf8, 0xdf, 0xca, 0x59, 0x81, 0xcc, 0x52, + 0xa0, 0x25, 0x8e, 0x0b, 0x05, 0x18, 0xa3, 0xb1, 0x37, 0xbd, 0x28, 0x04, 0x0a, 0x8f, 0xc6, 0xce, + 0x0a, 0xb4, 0x68, 0xec, 0xac, 0xc0, 0xf8, 0xd5, 0x02, 0x3c, 0x3f, 0x58, 0xc5, 0x45, 0xb6, 0xf4, + 0x29, 0x78, 0x75, 0x28, 0xc5, 0xd8, 0xf1, 0x73, 0x20, 0x73, 0x1b, 0xf0, 0x01, 0x39, 0x9f, 0xf6, + 0x7c, 0xfc, 0xde, 0x61, 0x45, 0x71, 0xed, 0xb8, 0xe9, 0x39, 0xae, 0xf2, 0x26, 0xfb, 0x8d, 0xd4, + 0xa1, 0x3e, 0xb9, 0x74, 0x6d, 0xb8, 0x2f, 0x8b, 0xf1, 0x38, 0x5f, 0x19, 0x56, 0x18, 0xf8, 0x02, + 0x94, 0x93, 0xa8, 0xe4, 0x1c, 0x8c, 0xe0, 0x07, 0x28, 0xee, 0x9b, 0x09, 0x0a, 0x58, 0xbf, 0x78, + 0x5b, 0xac, 0x1d, 0x8c, 0xd9, 0xa4, 0xc6, 0x17, 0x10, 0x98, 0x22, 0x66, 0x93, 0x16, 0x9c, 0x40, + 0x8f, 0xd9, 0xa4, 0x22, 0x19, 0x7f, 0x92, 0x83, 0xd3, 0x7d, 0x75, 0x14, 0xa4, 0xae, 0x4f, 0xd8, + 0xcb, 0xc7, 0x29, 0x35, 0x8e, 0x9d, 0xab, 0xc5, 0x9f, 0x90, 0x6b, 0xff, 0x5d, 0x28, 0x35, 0x7a, + 0xdb, 0xc9, 0xab, 0x1d, 0x8f, 0xa8, 0xa6, 0x94, 0xab, 0x27, 0x98, 0x0a, 0xcf, 0xfa, 0x2f, 0x9d, + 0xf2, 0x85, 0x25, 0xa5, 0x62, 0xbe, 0x1d, 0x05, 0x15, 0x49, 0xc7, 0xac, 0xd2, 0x91, 0x8c, 0x5f, + 0xce, 0x67, 0xdf, 0x91, 0x6f, 0xac, 0xd4, 0x1f, 0xe7, 0x8e, 0x7c, 0x63, 0xa5, 0x7e, 0x7c, 0xdf, + 0xff, 0x4b, 0xd9, 0x77, 0x6e, 0x54, 0xc4, 0x39, 0x9e, 0x7c, 0xfb, 0x90, 0x46, 0x45, 0x82, 0x3b, + 0x06, 0x09, 0xa3, 0x22, 0x01, 0x4c, 0xde, 0x80, 0x89, 0x0d, 0x8f, 0x87, 0x93, 0x92, 0x3d, 0xe6, + 0x51, 0x37, 0x64, 0xa1, 0xca, 0x1e, 0x23, 0x48, 0x76, 0x2d, 0xd1, 0x27, 0x5e, 0x5a, 0xa9, 0xe3, + 0xb5, 0x24, 0xb1, 0x5c, 0xf4, 0x17, 0x02, 0x1d, 0xcd, 0xf8, 0x47, 0xa3, 0x60, 0x1c, 0xaf, 0xdf, + 0x24, 0x5f, 0xd6, 0xc7, 0xee, 0xd2, 0xd0, 0x9a, 0xd1, 0xa1, 0x58, 0x6e, 0xb5, 0xd7, 0x72, 0xa8, + 0xdb, 0xd4, 0x63, 0x41, 0x89, 0x32, 0x95, 0x05, 0x4a, 0xb8, 0x8f, 0x12, 0xdb, 0x60, 0xf1, 0x5f, + 0x16, 0xe2, 0xad, 0x96, 0x38, 0x1a, 0x73, 0x1f, 0xe1, 0x68, 0x24, 0xb7, 0xa0, 0xac, 0x96, 0x28, + 0x3a, 0x36, 0x94, 0x5c, 0x34, 0x42, 0x89, 0x8f, 0x4a, 0x21, 0xea, 0xe7, 0x6b, 0x61, 0xf8, 0xf3, + 0x35, 0xa1, 0xe3, 0x1b, 0x79, 0x3c, 0x1d, 0x9f, 0x88, 0x1d, 0x15, 0x88, 0x43, 0x6b, 0x54, 0x8f, + 0x1d, 0x95, 0x71, 0x70, 0xa9, 0xe0, 0x32, 0xfc, 0x15, 0xfe, 0x54, 0xa2, 0xbf, 0x44, 0xe1, 0xaf, + 0x38, 0x7e, 0x56, 0xf8, 0xab, 0x08, 0x85, 0x1d, 0x80, 0x66, 0xcf, 0xe5, 0x69, 0x3f, 0xc6, 0xe3, + 0x03, 0xd0, 0xef, 0xb9, 0x56, 0x32, 0xf5, 0x47, 0x04, 0x68, 0xfc, 0xd3, 0x91, 0x6c, 0xe1, 0x20, + 0x56, 0x81, 0x3f, 0x86, 0x70, 0x10, 0x21, 0x7d, 0x32, 0x2b, 0x75, 0x0b, 0xe6, 0xa4, 0xa1, 0x33, + 0xb6, 0xde, 0xa2, 0xfe, 0x96, 0xb9, 0x21, 0xa6, 0x18, 0x55, 0x4e, 0x91, 0x89, 0x74, 0x57, 0xd4, + 0x5b, 0x3d, 0x5f, 0x53, 0x39, 0x65, 0xe0, 0x2f, 0xfe, 0x13, 0xa9, 0x51, 0x53, 0x27, 0x01, 0x9d, + 0xd2, 0x73, 0x59, 0x93, 0xd0, 0xeb, 0x69, 0xd3, 0xa8, 0xa3, 0x70, 0xde, 0x1b, 0x69, 0x3f, 0xb7, + 0x74, 0x59, 0x51, 0xd5, 0x98, 0xea, 0x54, 0x12, 0x48, 0x64, 0x17, 0x4e, 0xc7, 0xa2, 0xb4, 0x72, + 0x53, 0x40, 0x8a, 0xbc, 0xc3, 0x17, 0x8e, 0x0e, 0x2b, 0x2f, 0x2b, 0xa2, 0xb8, 0x7a, 0xe1, 0x48, + 0x50, 0xef, 0x4f, 0x8b, 0xf1, 0xdb, 0x65, 0xdf, 0x76, 0x9b, 0x7b, 0xca, 0x9a, 0x47, 0x7e, 0xbb, + 0x8d, 0xa5, 0xa9, 0x08, 0x38, 0x31, 0xb0, 0xf1, 0xb7, 0xf3, 0xd9, 0x2a, 0x09, 0xf1, 0xd2, 0xf1, + 0x18, 0x2a, 0x09, 0x8e, 0x71, 0xfc, 0x29, 0xf1, 0x8f, 0xe4, 0x29, 0xf1, 0x32, 0x8c, 0x6f, 0x52, + 0xd7, 0x76, 0xa3, 0xc8, 0x52, 0x68, 0x71, 0x11, 0xf2, 0x22, 0x53, 0xd6, 0x91, 0xf7, 0x81, 0xd4, + 0x6d, 0x9f, 0xba, 0xe1, 0x8a, 0xd7, 0xe9, 0xda, 0x7e, 0xd8, 0xc1, 0xc4, 0x28, 0xfc, 0x68, 0x78, + 0xe1, 0xe8, 0xb0, 0x72, 0xa6, 0x8b, 0xb5, 0x56, 0x53, 0xa9, 0x56, 0x03, 0x14, 0xa6, 0x91, 0xc9, + 0x65, 0x18, 0x97, 0x86, 0x04, 0x85, 0x38, 0xd8, 0x64, 0xda, 0x88, 0x40, 0x42, 0x19, 0xff, 0x72, + 0x14, 0xce, 0x1e, 0xf7, 0xac, 0x43, 0x76, 0x00, 0xee, 0xba, 0xdb, 0x9e, 0xed, 0xb7, 0x1c, 0x77, + 0x57, 0xb8, 0x80, 0x5e, 0x1b, 0xf2, 0x4d, 0xe8, 0x52, 0x8c, 0xc9, 0x2a, 0xb9, 0xc3, 0xad, 0x17, + 0x95, 0x99, 0x0a, 0x65, 0xf2, 0x35, 0x28, 0x9a, 0xb4, 0xe9, 0x3d, 0xa0, 0x42, 0x75, 0x37, 0xb9, + 0xf4, 0xd9, 0x61, 0x5b, 0x91, 0x78, 0xd8, 0x06, 0x7a, 0x22, 0xfa, 0xa2, 0xc4, 0x8c, 0x68, 0x92, + 0xaf, 0xc3, 0x24, 0xcf, 0x7f, 0x53, 0xdd, 0x09, 0x85, 0x7a, 0xef, 0xf8, 0x48, 0x22, 0x39, 0xc6, + 0x24, 0x79, 0x46, 0x1d, 0xcb, 0xde, 0xd1, 0x3c, 0x1b, 0x78, 0x24, 0x11, 0x85, 0xe4, 0xe2, 0x7f, + 0x92, 0x87, 0x69, 0xbd, 0xc3, 0x64, 0x03, 0xca, 0xeb, 0xae, 0x13, 0x3a, 0x76, 0x5b, 0x37, 0x35, + 0x15, 0x77, 0x4c, 0x87, 0xd7, 0x59, 0x99, 0x26, 0xa7, 0x29, 0x4c, 0xb6, 0x66, 0xd8, 0xd4, 0x05, + 0x21, 0xb7, 0x70, 0xe0, 0x81, 0x5f, 0xc5, 0x26, 0x7e, 0x81, 0xc7, 0x19, 0x8e, 0x6b, 0x2d, 0x1e, + 0x6a, 0x59, 0x0f, 0x6a, 0x99, 0x44, 0x26, 0x0f, 0x80, 0xdc, 0xee, 0x05, 0x21, 0xaf, 0xa1, 0xfe, + 0x32, 0xdd, 0xf1, 0xfc, 0x61, 0x42, 0x88, 0xbc, 0x2a, 0x06, 0xe7, 0xf9, 0x4e, 0x2f, 0x08, 0x2d, + 0x5f, 0xa0, 0x5b, 0xdb, 0x88, 0x9f, 0x18, 0xa4, 0x8c, 0x16, 0x16, 0x6f, 0x43, 0x49, 0x9d, 0x35, + 0xb4, 0xf8, 0x72, 0x3a, 0x8e, 0xb4, 0xbd, 0xe7, 0x16, 0x5f, 0xac, 0xc0, 0xe4, 0xe5, 0xe4, 0x39, + 0x11, 0x73, 0x2b, 0x1f, 0x1b, 0x46, 0xc5, 0xb1, 0xb5, 0x8c, 0x1f, 0xc9, 0xc1, 0xc9, 0x6c, 0x6b, + 0x21, 0xf2, 0x61, 0xe2, 0x55, 0x33, 0x37, 0xe8, 0xcd, 0x57, 0x9a, 0x18, 0x7d, 0xb4, 0x77, 0x4d, + 0xe3, 0x2f, 0x8f, 0xa4, 0xa4, 0xac, 0x0c, 0x8a, 0xe4, 0x46, 0xe6, 0x3c, 0xe6, 0x94, 0x73, 0x31, + 0x3d, 0x8f, 0x99, 0xb3, 0xf7, 0x36, 0x4c, 0x23, 0xe1, 0x78, 0x71, 0x29, 0xfa, 0x50, 0xfe, 0xc9, + 0xf1, 0xd2, 0x32, 0x13, 0xb0, 0x64, 0x1d, 0x08, 0x96, 0x2c, 0x7b, 0xa1, 0xe2, 0xeb, 0xae, 0x5c, + 0x34, 0x39, 0x85, 0x6d, 0x2f, 0xb4, 0x54, 0xaf, 0xf7, 0x0c, 0x24, 0xf2, 0x79, 0x98, 0x92, 0xd3, + 0xb9, 0x82, 0xb7, 0x9a, 0x11, 0x9c, 0x46, 0xbc, 0x0f, 0xc9, 0xbd, 0x68, 0xa1, 0x28, 0x6a, 0xea, + 0x80, 0xa4, 0xc3, 0xa3, 0x1f, 0x89, 0x42, 0xda, 0xaa, 0x86, 0x43, 0x84, 0x98, 0x7a, 0x45, 0xac, + 0xbe, 0x67, 0x79, 0xc6, 0x2b, 0x89, 0x6b, 0xd9, 0x61, 0x62, 0xe9, 0x25, 0x69, 0x93, 0x5d, 0x98, + 0x52, 0x32, 0x61, 0x55, 0xc3, 0x21, 0x12, 0xb1, 0xbd, 0x2c, 0x1a, 0x3b, 0xad, 0xa6, 0xd7, 0x4a, + 0x37, 0xa5, 0xd3, 0x35, 0x7e, 0x22, 0x0f, 0xd3, 0xfc, 0xb6, 0xc8, 0x4d, 0xc6, 0x9e, 0x5a, 0xdb, + 0xbe, 0xb7, 0x34, 0xdb, 0x3e, 0x19, 0xed, 0x5c, 0xed, 0xda, 0x50, 0x96, 0xd8, 0x7b, 0x40, 0xd2, + 0x38, 0xc4, 0x84, 0x92, 0x5a, 0x3a, 0xd8, 0x0e, 0xef, 0x4a, 0x1c, 0x18, 0x5f, 0x5c, 0xd6, 0xd1, + 0xb2, 0x32, 0x30, 0x35, 0x1a, 0xc6, 0x8f, 0xe7, 0x61, 0x4a, 0xb1, 0xc4, 0x7e, 0x6a, 0x07, 0xfe, + 0x0b, 0xda, 0xc0, 0x2f, 0x44, 0xc1, 0x3e, 0xa2, 0x9e, 0x0d, 0x35, 0xee, 0x3d, 0x98, 0x4d, 0xa1, + 0x24, 0x0d, 0xda, 0x73, 0xc3, 0x18, 0xb4, 0xbf, 0x9e, 0x8e, 0xb2, 0xcd, 0x73, 0xec, 0x45, 0x31, + 0x57, 0xd5, 0xb0, 0xde, 0x3f, 0x95, 0x87, 0x79, 0xf1, 0x0b, 0xd3, 0x52, 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, 0x0a, 0x58, 0x1c, 0x65, 0x24, 0x3f, 0x44, 0x94, 0x91, 0x0d, 0x28, + 0x63, 0x53, 0xc2, 0x15, 0x29, 0xd8, 0x32, 0xd7, 0xc5, 0x20, 0xa1, 0xf4, 0xc1, 0x73, 0x87, 0x08, + 0xff, 0xa5, 0x20, 0xa1, 0x75, 0x4f, 0x61, 0x92, 0x5f, 0xcc, 0xc1, 0x34, 0x16, 0xae, 0x3e, 0x60, + 0xe2, 0x26, 0x23, 0x36, 0x22, 0xc2, 0x4f, 0x44, 0xd6, 0x7a, 0x8d, 0xd0, 0x77, 0xdc, 0x5d, 0x61, + 0xae, 0xb7, 0x2d, 0xcc, 0xf5, 0xde, 0xe6, 0x66, 0x86, 0x97, 0x9a, 0x5e, 0xe7, 0xf2, 0xae, 0x6f, + 0x3f, 0x70, 0xb8, 0x93, 0x81, 0xdd, 0xbe, 0x1c, 0xa7, 0x86, 0xed, 0x3a, 0x89, 0xa4, 0xad, 0x82, + 0x14, 0x9a, 0x42, 0xf2, 0x0f, 0xa5, 0xd8, 0x6c, 0xf2, 0x71, 0x40, 0xff, 0x22, 0xf2, 0x7d, 0x70, + 0x8a, 0x87, 0x83, 0x5e, 0xf1, 0xdc, 0xd0, 0x71, 0x7b, 0x5e, 0x2f, 0x58, 0xb6, 0x9b, 0xfb, 0xbd, + 0x6e, 0x20, 0x82, 0x04, 0x61, 0xcf, 0x9b, 0x51, 0xa5, 0xb5, 0xcd, 0x6b, 0xb5, 0x40, 0x7d, 0xd9, + 0x04, 0xc8, 0x1a, 0xcc, 0xf2, 0xaa, 0x6a, 0x2f, 0xf4, 0x1a, 0x4d, 0xbb, 0xcd, 0x04, 0xe2, 0x71, + 0xa4, 0xca, 0x6d, 0x92, 0x7a, 0xa1, 0x67, 0x05, 0xbc, 0x5c, 0x7d, 0x2b, 0x48, 0x21, 0x91, 0x75, + 0x98, 0x31, 0xa9, 0xdd, 0xba, 0x6d, 0x3f, 0x5a, 0xb1, 0xbb, 0x76, 0xd3, 0x09, 0x79, 0x7e, 0x8a, + 0x02, 0x57, 0x29, 0xf8, 0xd4, 0x6e, 0x59, 0x1d, 0xfb, 0x91, 0xd5, 0x14, 0x95, 0xfa, 0x7b, 0xb3, + 0x86, 0x17, 0x91, 0x72, 0xdc, 0x88, 0xd4, 0x44, 0x92, 0x94, 0xe3, 0xf6, 0x27, 0x15, 0xe3, 0x49, + 0x52, 0x3c, 0x51, 0x18, 0x77, 0x9b, 0x84, 0xb3, 0xb9, 0xf3, 0x39, 0x85, 0x94, 0xc8, 0x2e, 0x86, + 0x2e, 0x94, 0x49, 0x52, 0x0a, 0x1e, 0x5b, 0x79, 0xf7, 0x7d, 0x27, 0xa4, 0x6a, 0x0f, 0x27, 0xf1, + 0xb3, 0x70, 0xfc, 0xd1, 0xe1, 0xb4, 0x5f, 0x17, 0x53, 0x98, 0x31, 0x35, 0xa5, 0x93, 0xa5, 0x14, + 0xb5, 0xec, 0x5e, 0xa6, 0x30, 0x23, 0x6a, 0x6a, 0x3f, 0xa7, 0xb0, 0x9f, 0x0a, 0xb5, 0x3e, 0x1d, + 0x4d, 0x61, 0x92, 0x3b, 0x6c, 0xd0, 0x42, 0x76, 0x73, 0xf7, 0x5c, 0xe1, 0xcf, 0x39, 0x8d, 0x9f, + 0xf6, 0x92, 0x10, 0x1b, 0xca, 0xbe, 0xac, 0xb6, 0x32, 0xbc, 0x3b, 0x93, 0xc8, 0xe4, 0x2f, 0xc0, + 0xcc, 0x56, 0x40, 0xaf, 0xaf, 0xd7, 0x1b, 0x32, 0x7a, 0x34, 0x3e, 0x6f, 0x4d, 0x2f, 0x5d, 0x39, + 0x86, 0xe9, 0x5c, 0x52, 0x71, 0x30, 0xd3, 0x2a, 0x9f, 0xb7, 0x5e, 0x40, 0xad, 0x1d, 0xa7, 0x1b, + 0x44, 0xa1, 0xf8, 0xd5, 0x79, 0x4b, 0x34, 0x65, 0xac, 0xc1, 0x6c, 0x8a, 0x0c, 0x99, 0x06, 0x60, + 0x85, 0xd6, 0xd6, 0x9d, 0xc6, 0xea, 0x66, 0xf9, 0x19, 0x52, 0x86, 0x12, 0xfe, 0x5e, 0xbd, 0x53, + 0x5d, 0xde, 0x58, 0xad, 0x95, 0x73, 0x64, 0x16, 0xa6, 0xb0, 0xa4, 0xb6, 0xde, 0xe0, 0x45, 0x79, + 0x9e, 0x20, 0xcf, 0x2c, 0xf3, 0xad, 0x1b, 0xb2, 0x0d, 0x80, 0x67, 0x8a, 0xf1, 0xd7, 0xf3, 0x70, + 0x5a, 0x1e, 0x2b, 0x34, 0x7c, 0xe8, 0xf9, 0xfb, 0x8e, 0xbb, 0xfb, 0x94, 0x9f, 0x0e, 0xd7, 0xb5, + 0xd3, 0xe1, 0xa5, 0xc4, 0x49, 0x9d, 0xe8, 0xe5, 0x80, 0x23, 0xe2, 0x3b, 0x13, 0x70, 0x66, 0x20, + 0x16, 0x79, 0x9f, 0x9d, 0xe6, 0x0e, 0x75, 0xc3, 0xf5, 0x56, 0x9b, 0x32, 0x11, 0xd5, 0xeb, 0x85, + 0xc2, 0x7f, 0xf8, 0x45, 0x7c, 0x51, 0xc2, 0x4a, 0xcb, 0x69, 0xb5, 0xa9, 0x15, 0xf2, 0x6a, 0x6d, + 0xb9, 0xa5, 0xb1, 0x19, 0xc9, 0x28, 0xeb, 0xf3, 0xba, 0x1b, 0x52, 0xff, 0x01, 0xfa, 0xdd, 0x44, + 0x24, 0xf7, 0x29, 0xed, 0x5a, 0x36, 0xab, 0xb5, 0x1c, 0x51, 0xad, 0x93, 0x4c, 0x61, 0x93, 0xeb, + 0x0a, 0x49, 0x94, 0xf2, 0x6f, 0xdb, 0x8f, 0x84, 0xed, 0xbe, 0xc8, 0x46, 0x12, 0x91, 0xe4, 0x91, + 0x39, 0x3a, 0xf6, 0x23, 0x33, 0x8d, 0x42, 0x3e, 0x80, 0x13, 0xe2, 0x00, 0x12, 0x91, 0x23, 0x65, + 0x8f, 0x79, 0x5c, 0xca, 0x57, 0xd8, 0xc5, 0x4c, 0xba, 0xdf, 0xca, 0x68, 0xb0, 0x59, 0xbd, 0xce, + 0xa6, 0x42, 0x36, 0xd9, 0x81, 0x9c, 0x18, 0x8e, 0xdb, 0x34, 0x08, 0x64, 0xf8, 0x15, 0xa1, 0x9b, + 0x55, 0x07, 0xd3, 0xea, 0xf0, 0x7a, 0xb3, 0x2f, 0x26, 0x59, 0x83, 0xe9, 0xfb, 0x74, 0x5b, 0x9d, + 0x9f, 0xb1, 0x88, 0x55, 0x95, 0x1f, 0xd2, 0xed, 0xfe, 0x93, 0x93, 0xc0, 0x23, 0x0e, 0xbe, 0x50, + 0x3f, 0x3a, 0xd8, 0x60, 0x17, 0x67, 0x97, 0xfa, 0x78, 0xff, 0x1d, 0x47, 0x66, 0xb0, 0x10, 0x4b, + 0xc8, 0x7a, 0xbd, 0xd0, 0x1d, 0x61, 0xc4, 0x83, 0xb6, 0x28, 0xb7, 0x12, 0x39, 0x93, 0xd3, 0x54, + 0xc9, 0xd7, 0x61, 0xc6, 0xf4, 0x7a, 0xa1, 0xe3, 0xee, 0x36, 0xd8, 0x0d, 0x93, 0xee, 0xf2, 0x03, + 0x29, 0x0e, 0x6e, 0x9d, 0xa8, 0x15, 0x76, 0x51, 0xbc, 0xd0, 0x0a, 0x44, 0xa9, 0x76, 0x22, 0xe8, + 0x08, 0xe4, 0x6b, 0x30, 0xcd, 0x23, 0xf0, 0x45, 0x0d, 0x4c, 0x68, 0x89, 0x13, 0xf5, 0xca, 0x7b, + 0x57, 0x84, 0xa9, 0x35, 0x96, 0x66, 0x35, 0x90, 0xa0, 0x46, 0xbe, 0x22, 0x06, 0xab, 0xee, 0xb8, + 0xbb, 0xd1, 0x32, 0x06, 0x1c, 0xf9, 0x8b, 0xf1, 0x90, 0x74, 0xd9, 0xe7, 0xca, 0x65, 0xdc, 0xc7, + 0x6f, 0x24, 0x4d, 0x87, 0x84, 0x70, 0xa6, 0x1a, 0x04, 0x4e, 0x10, 0x0a, 0x2f, 0xfb, 0xd5, 0x47, + 0xb4, 0xd9, 0x63, 0xc0, 0xf7, 0x3d, 0x7f, 0x9f, 0xfa, 0xdc, 0x73, 0x71, 0x74, 0xf9, 0xd2, 0xd1, + 0x61, 0xe5, 0x55, 0x1b, 0x01, 0x2d, 0xe1, 0x98, 0x6f, 0x51, 0x09, 0x6a, 0x3d, 0xe4, 0xb0, 0x4a, + 0x1f, 0x06, 0x13, 0x25, 0x5f, 0x83, 0x93, 0x2b, 0x76, 0x40, 0xd7, 0xdd, 0x80, 0xba, 0x81, 0x13, + 0x3a, 0x0f, 0xa8, 0x18, 0x54, 0x3c, 0xfc, 0x8a, 0x3c, 0xaa, 0x79, 0xd3, 0x0e, 0xd8, 0xc6, 0x8c, + 0x40, 0x2c, 0x31, 0x29, 0x6a, 0xd0, 0xf4, 0x6c, 0x2a, 0xc4, 0x84, 0xe9, 0x46, 0x63, 0xad, 0xe6, + 0xd8, 0xd1, 0xbe, 0x9a, 0xc2, 0xf1, 0x7a, 0x15, 0x1f, 0x97, 0x82, 0x3d, 0xab, 0xe5, 0xd8, 0xd1, + 0x86, 0xea, 0x33, 0x58, 0x09, 0x0a, 0xc6, 0x61, 0x0e, 0xca, 0xc9, 0xa9, 0x24, 0x5f, 0x82, 0x09, + 0xee, 0x74, 0x41, 0x83, 0x3d, 0xa1, 0x7f, 0x91, 0x36, 0xfc, 0x51, 0xb9, 0x8e, 0x24, 0x02, 0xf7, + 0x70, 0x97, 0x0e, 0xaa, 0x9a, 0x7a, 0xae, 0x3d, 0x63, 0xc6, 0xc4, 0x48, 0x0b, 0x4a, 0x7c, 0xb6, + 0x28, 0x06, 0xe6, 0x4f, 0xc4, 0x1e, 0x50, 0xab, 0x12, 0xf4, 0xb9, 0x81, 0x33, 0x5f, 0x13, 0x1c, + 0x40, 0x6b, 0x42, 0xa3, 0xba, 0x0c, 0x50, 0x94, 0x88, 0xc6, 0x69, 0x38, 0xd5, 0xe7, 0x9b, 0x8d, + 0x07, 0xa8, 0x73, 0xee, 0xd3, 0x22, 0xf9, 0x12, 0xcc, 0x23, 0xe2, 0x8a, 0xe7, 0xba, 0xb4, 0x19, + 0x22, 0x3b, 0x92, 0xef, 0xbf, 0x05, 0x6e, 0xa6, 0xc9, 0xfb, 0xdb, 0x8c, 0x00, 0xac, 0xe4, 0x33, + 0x70, 0x26, 0x05, 0xe3, 0xe7, 0xf3, 0xb0, 0x20, 0x38, 0x9c, 0x49, 0x9b, 0x1e, 0x6a, 0x1f, 0x9f, + 0xf2, 0x13, 0x75, 0x55, 0x3b, 0x51, 0x5f, 0x8c, 0x22, 0x90, 0x66, 0x75, 0x72, 0xc0, 0x81, 0xfa, + 0xcb, 0x39, 0x78, 0x6e, 0x10, 0x52, 0xa4, 0x55, 0xcc, 0x65, 0x69, 0x15, 0x49, 0x17, 0xe6, 0x70, + 0x42, 0x57, 0xf6, 0x68, 0x73, 0x1f, 0x83, 0xa6, 0xa0, 0x2f, 0x71, 0xbe, 0x8f, 0xb5, 0xd5, 0xeb, + 0x99, 0xd6, 0x56, 0x27, 0xf9, 0x2a, 0x6b, 0x22, 0x0d, 0x1e, 0x8f, 0x65, 0x9f, 0x1e, 0x04, 0x66, + 0x16, 0x69, 0xe3, 0xa7, 0xf3, 0xec, 0xca, 0x16, 0xee, 0xd5, 0x7d, 0xba, 0x43, 0x7d, 0xea, 0x36, + 0xe9, 0xa7, 0xcc, 0x27, 0x54, 0xef, 0xdc, 0x50, 0x1a, 0x8c, 0x6f, 0x4f, 0xc3, 0x7c, 0x16, 0x1a, + 0x1b, 0x17, 0xe5, 0xd2, 0x5c, 0x94, 0x4e, 0xfc, 0xe2, 0xaa, 0xfc, 0xad, 0x1c, 0x94, 0x1a, 0xb4, + 0xe9, 0xb9, 0xad, 0xeb, 0x68, 0x0e, 0x2b, 0x46, 0xc7, 0xe6, 0x42, 0x03, 0x2b, 0xb7, 0x76, 0x12, + 0x76, 0xb2, 0xdf, 0x3b, 0xac, 0x7c, 0x71, 0xb8, 0xbb, 0x6a, 0xd3, 0x43, 0xdd, 0x67, 0x88, 0x59, + 0x0e, 0xa3, 0x26, 0xf8, 0xd7, 0x98, 0x5a, 0xb3, 0x64, 0x19, 0xa6, 0xc4, 0x86, 0xf5, 0xd4, 0x54, + 0x0e, 0x3c, 0x4c, 0xab, 0xac, 0x48, 0x3d, 0x9f, 0x6a, 0x28, 0xe4, 0x2a, 0x14, 0xb6, 0x96, 0xae, + 0x8b, 0x59, 0x90, 0xe1, 0x88, 0xb6, 0x96, 0xae, 0xa3, 0x42, 0x8c, 0x5d, 0x32, 0xa6, 0x7a, 0x4b, + 0x9a, 0xa1, 0xe9, 0xd6, 0xd2, 0x75, 0xf2, 0x17, 0xe1, 0x44, 0xcd, 0x09, 0x44, 0x13, 0xdc, 0x3f, + 0xb9, 0x85, 0x51, 0x39, 0xc6, 0xfa, 0xac, 0xdf, 0xcf, 0x65, 0xae, 0xdf, 0x17, 0x5a, 0x11, 0x11, + 0x8b, 0x3b, 0x3f, 0xb7, 0x92, 0x29, 0x2b, 0xb2, 0xdb, 0x21, 0x1f, 0xc2, 0x34, 0xbe, 0x8d, 0xa1, + 0xcb, 0x36, 0xe6, 0x4a, 0x1b, 0xef, 0xd3, 0xf2, 0x67, 0x32, 0x5b, 0x5e, 0xe4, 0xc1, 0xf3, 0xd0, + 0xf1, 0x1b, 0xf3, 0xaa, 0x69, 0xf7, 0x7e, 0x8d, 0x32, 0xb9, 0x09, 0x33, 0x42, 0x00, 0xbb, 0xbb, + 0xb3, 0xb9, 0x47, 0x6b, 0xf6, 0x81, 0xb0, 0x11, 0xc5, 0x3b, 0x9d, 0x90, 0xda, 0x2c, 0x6f, 0xc7, + 0x0a, 0xf7, 0xa8, 0xd5, 0xb2, 0x35, 0x51, 0x25, 0x81, 0x48, 0xbe, 0x09, 0x93, 0x1b, 0x5e, 0x93, + 0xc9, 0xde, 0xc8, 0x1b, 0xb8, 0xd9, 0xe8, 0x97, 0xd9, 0x56, 0x6e, 0xf3, 0xe2, 0x84, 0x40, 0xf5, + 0xbd, 0xc3, 0xca, 0x5b, 0x8f, 0xbb, 0x6c, 0x94, 0x06, 0x4c, 0xb5, 0x35, 0xb2, 0x02, 0xc5, 0xfb, + 0x74, 0x9b, 0xf5, 0x36, 0x99, 0x35, 0x5d, 0x16, 0x0b, 0x83, 0x72, 0xf1, 0x4b, 0x33, 0x28, 0x17, + 0x65, 0xc4, 0x87, 0x59, 0x1c, 0x9f, 0xba, 0x1d, 0x04, 0x0f, 0x3d, 0xbf, 0x85, 0xe9, 0x2a, 0xfb, + 0x59, 0xa4, 0x2e, 0x65, 0x0e, 0xfe, 0x73, 0x7c, 0xf0, 0xbb, 0x0a, 0x05, 0x55, 0x84, 0x4c, 0x91, + 0x27, 0x5f, 0x87, 0x69, 0x11, 0x88, 0xec, 0xf6, 0xf5, 0x2a, 0xee, 0x84, 0x92, 0x16, 0xdb, 0x44, + 0xaf, 0x94, 0xef, 0x55, 0x58, 0x16, 0xc5, 0xd0, 0xe9, 0xec, 0xd8, 0xfa, 0xc3, 0xb3, 0x8a, 0x42, + 0xea, 0x30, 0x59, 0xa3, 0x0f, 0x9c, 0x26, 0xc5, 0xf8, 0x0b, 0xc2, 0x5d, 0x31, 0x4a, 0xc3, 0x1c, + 0xd7, 0x70, 0x6d, 0x4c, 0x0b, 0x0b, 0x78, 0x34, 0x07, 0xdd, 0xd5, 0x24, 0x02, 0x24, 0xd7, 0xa0, + 0xb0, 0x5e, 0xab, 0x0b, 0x6f, 0xc5, 0xd9, 0x28, 0xdc, 0x5f, 0x5d, 0x26, 0xad, 0x45, 0x1b, 0x6e, + 0xa7, 0xa5, 0xf9, 0x3a, 0xae, 0xd7, 0xea, 0x64, 0x07, 0xa6, 0x70, 0x00, 0xd6, 0xa8, 0xcd, 0xc7, + 0x76, 0xa6, 0xcf, 0xd8, 0x5e, 0xca, 0x1c, 0xdb, 0x05, 0x3e, 0xb6, 0x7b, 0x02, 0x5b, 0xcb, 0xc2, + 0xa9, 0x92, 0x65, 0x42, 0xad, 0xc8, 0x0c, 0x2c, 0x73, 0x47, 0x6e, 0x6e, 0xa0, 0x8d, 0xaa, 0x10, + 0x6a, 0x65, 0x22, 0xe1, 0x28, 0x99, 0x65, 0x5f, 0x67, 0xe8, 0x34, 0x1d, 0xf2, 0x05, 0x18, 0xb9, + 0xbb, 0x1f, 0xda, 0xc2, 0x2f, 0x51, 0x8e, 0x23, 0x2b, 0x92, 0xdd, 0x47, 0x3d, 0xa4, 0xb7, 0xaf, + 0x05, 0x90, 0x46, 0x1c, 0x36, 0x15, 0x6b, 0xb6, 0xdf, 0x7a, 0x68, 0xfb, 0x18, 0x04, 0x67, 0x4e, + 0x23, 0xa1, 0xd4, 0xf0, 0xa9, 0xd8, 0x13, 0x05, 0x89, 0x07, 0x4e, 0x95, 0x04, 0xf9, 0x3e, 0x38, + 0x1d, 0x38, 0xbb, 0xae, 0x1d, 0xf6, 0x7c, 0x6a, 0xd9, 0xed, 0x5d, 0xcf, 0x77, 0xc2, 0xbd, 0x8e, + 0x15, 0xf4, 0x9c, 0x90, 0xa2, 0x83, 0xe0, 0x74, 0x24, 0x33, 0x36, 0x24, 0x5c, 0x55, 0x82, 0x35, + 0x18, 0x94, 0x79, 0x2a, 0xc8, 0xae, 0x20, 0x5f, 0x81, 0x29, 0x95, 0x25, 0x07, 0x0b, 0x27, 0xce, + 0x16, 0xce, 0x4f, 0x47, 0x57, 0x8f, 0x24, 0x0b, 0x97, 0x09, 0x6c, 0x94, 0x33, 0x22, 0xd0, 0x13, + 0xd8, 0x28, 0xb4, 0x88, 0x09, 0xa7, 0x02, 0xae, 0xdf, 0xe8, 0xb9, 0xce, 0x23, 0x8c, 0xb5, 0x26, + 0x6c, 0x99, 0x17, 0x4e, 0x6a, 0x47, 0x5f, 0x03, 0xa1, 0xb6, 0xee, 0xac, 0x7f, 0x69, 0x2b, 0xa0, + 0xbe, 0x30, 0x69, 0x9e, 0xe7, 0xb8, 0x5b, 0xae, 0xf3, 0x28, 0x2e, 0xe5, 0xca, 0x93, 0x9b, 0x23, + 0x45, 0x52, 0x9e, 0x33, 0x67, 0xc5, 0x2e, 0x10, 0x33, 0x77, 0xfb, 0x7a, 0xd5, 0x1c, 0xaf, 0xaf, + 0xdf, 0x6b, 0xb4, 0xbd, 0xd0, 0xd8, 0x83, 0xf9, 0x2c, 0xaa, 0x64, 0x01, 0xc6, 0x45, 0xaa, 0x3c, + 0x3c, 0x1c, 0x8b, 0xa6, 0xfc, 0x49, 0x9e, 0x85, 0x89, 0x1d, 0xc7, 0x0f, 0x42, 0xab, 0xe7, 0x70, + 0x79, 0x61, 0xd4, 0x2c, 0x62, 0xc1, 0x96, 0xd3, 0x22, 0xa7, 0xa1, 0x88, 0x6f, 0x5c, 0xac, 0xae, + 0x80, 0x75, 0xe3, 0xec, 0xf7, 0x96, 0xd3, 0x32, 0xfe, 0x8b, 0x1c, 0x1e, 0x41, 0xe4, 0x55, 0x8c, + 0x69, 0x1b, 0xd9, 0x9f, 0xa0, 0xfe, 0xd9, 0xee, 0x26, 0x52, 0xcf, 0x71, 0x10, 0xf2, 0x3a, 0x8c, + 0x5d, 0xb7, 0x9b, 0x34, 0x32, 0x6b, 0x40, 0xe0, 0x1d, 0x2c, 0x51, 0x95, 0xd5, 0x1c, 0x86, 0xc9, + 0xc7, 0x7c, 0x6b, 0x56, 0xc3, 0x90, 0x06, 0x9c, 0x7f, 0xae, 0x54, 0xa5, 0x29, 0x03, 0xca, 0xc7, + 0x62, 0x4b, 0xdb, 0x31, 0x40, 0xc2, 0x25, 0x2d, 0x93, 0x82, 0xf1, 0x87, 0xb9, 0x98, 0xa7, 0x92, + 0x57, 0x60, 0xc4, 0xac, 0x47, 0xdf, 0xcf, 0xc3, 0xf2, 0x24, 0x3e, 0x1f, 0x01, 0xc8, 0x57, 0xe0, + 0x84, 0x42, 0x27, 0xe5, 0x1f, 0xf7, 0x32, 0x46, 0x8d, 0x51, 0xbe, 0x24, 0xdb, 0x49, 0x2e, 0x9b, + 0x06, 0x5e, 0x06, 0xe2, 0x8a, 0x1a, 0x75, 0x1d, 0x4e, 0x5b, 0xe9, 0xac, 0x4a, 0xbb, 0x85, 0x00, + 0xc9, 0xce, 0x66, 0x51, 0xe0, 0x41, 0x63, 0x8c, 0xdf, 0xc8, 0x69, 0xbc, 0x92, 0x9c, 0xd3, 0xe4, + 0x5c, 0xdc, 0xd7, 0x09, 0xa5, 0x00, 0x97, 0x78, 0xdf, 0x04, 0xa8, 0xf6, 0x42, 0x6f, 0xd5, 0xf5, + 0xbd, 0x76, 0x5b, 0x44, 0x3c, 0xe3, 0xe1, 0x28, 0x7a, 0xa1, 0x67, 0x51, 0x2c, 0xd6, 0xc2, 0x51, + 0x44, 0xc0, 0x99, 0xae, 0x84, 0x85, 0x8f, 0xea, 0x4a, 0x68, 0xfc, 0x5c, 0x5e, 0xe3, 0x30, 0x4c, + 0xca, 0x15, 0x8b, 0x5e, 0xb5, 0xb9, 0xee, 0x3a, 0x0f, 0xac, 0xa0, 0xed, 0x69, 0xc1, 0xf7, 0x04, + 0x18, 0xf9, 0xcb, 0x39, 0x38, 0xc9, 0x7d, 0xf2, 0xee, 0xf4, 0x3a, 0xdb, 0xd4, 0xbf, 0x67, 0xb7, + 0x9d, 0x56, 0x1c, 0x31, 0x3c, 0x36, 0xc0, 0x57, 0x9a, 0xc9, 0x86, 0xe7, 0x17, 0x6d, 0xee, 0x23, + 0x68, 0xb9, 0x58, 0x69, 0x3d, 0x88, 0x6a, 0xd5, 0x8b, 0x76, 0x36, 0x3e, 0x59, 0x87, 0xc9, 0xba, + 0xe3, 0x62, 0x66, 0xd2, 0x38, 0x8a, 0xc5, 0x2b, 0xdc, 0xc5, 0x96, 0x2d, 0xe1, 0xe6, 0x1e, 0x1d, + 0xc0, 0xba, 0x55, 0x5c, 0xe3, 0x57, 0x72, 0xf0, 0xc2, 0xb1, 0x1f, 0x4c, 0x2e, 0xc3, 0xf8, 0xaa, + 0xba, 0xff, 0xb9, 0x25, 0x50, 0x3a, 0x7b, 0xa6, 0x84, 0x22, 0x5f, 0x85, 0x13, 0x2a, 0xa9, 0x4d, + 0xdf, 0x76, 0x54, 0x6f, 0xe2, 0x8c, 0x01, 0x08, 0x19, 0x48, 0x52, 0x6c, 0xcd, 0x26, 0x62, 0xfc, + 0x3f, 0x39, 0x98, 0x88, 0xdc, 0x91, 0x9e, 0xd2, 0xeb, 0xcc, 0x35, 0xed, 0x3a, 0x23, 0x53, 0x2f, + 0x44, 0xbd, 0xe2, 0xa6, 0x47, 0x19, 0x57, 0xd0, 0x19, 0xc5, 0x79, 0x0b, 0x0b, 0x7e, 0x34, 0x0f, + 0x93, 0x8c, 0x55, 0xf3, 0x37, 0xed, 0x4f, 0x57, 0x00, 0xfa, 0xa8, 0x5f, 0x43, 0x85, 0x08, 0xff, + 0xb7, 0x39, 0x7c, 0xeb, 0x50, 0x31, 0xd8, 0x68, 0xb0, 0x22, 0x75, 0x34, 0xd8, 0x89, 0x6a, 0x62, + 0x29, 0x0f, 0x98, 0xbc, 0x21, 0x46, 0x42, 0x04, 0x4c, 0x6e, 0x9b, 0xac, 0x8c, 0x7c, 0x11, 0x46, + 0xb7, 0x50, 0x73, 0xab, 0x47, 0xd4, 0x8b, 0xe8, 0x63, 0x25, 0xe7, 0xf7, 0xbd, 0x40, 0x8f, 0xa6, + 0xcd, 0x11, 0x49, 0x03, 0xc6, 0x57, 0x7c, 0x6a, 0x87, 0xb4, 0x25, 0x06, 0x64, 0xa8, 0x78, 0x50, + 0x4d, 0x8e, 0x92, 0x8c, 0x07, 0x25, 0x28, 0x31, 0x3e, 0x46, 0xe2, 0x3e, 0xa2, 0xd5, 0x4e, 0xf0, + 0xd4, 0x4e, 0xfa, 0x7b, 0xda, 0xa4, 0x9f, 0x49, 0x4d, 0x3a, 0xef, 0xde, 0x50, 0x73, 0xff, 0x9b, + 0x39, 0x38, 0x99, 0x8d, 0x48, 0x5e, 0x84, 0xb1, 0xbb, 0x9b, 0xf5, 0xd8, 0x52, 0x0e, 0xbb, 0xe2, + 0x75, 0x51, 0x6d, 0x62, 0x8a, 0x2a, 0x72, 0x11, 0xc6, 0xde, 0x37, 0x57, 0x62, 0x83, 0x30, 0x64, + 0x70, 0xdf, 0x60, 0x92, 0x97, 0x76, 0xaa, 0x09, 0x20, 0x75, 0x6e, 0x0b, 0x4f, 0x6c, 0x6e, 0x7f, + 0x2a, 0x0f, 0x33, 0xd5, 0x66, 0x93, 0x06, 0x81, 0x48, 0xf8, 0xf5, 0xd4, 0x4e, 0x6c, 0x76, 0xb8, + 0x45, 0xad, 0x6f, 0x43, 0xcd, 0xea, 0x6f, 0xe5, 0x78, 0xf0, 0x54, 0x86, 0xf5, 0xc0, 0xa1, 0x0f, + 0x37, 0xf7, 0x7c, 0x1a, 0xec, 0x79, 0xed, 0xd6, 0xd0, 0x09, 0x67, 0x99, 0xcc, 0x88, 0x49, 0xb1, + 0x54, 0x03, 0x87, 0x1d, 0x2c, 0xd1, 0x64, 0x46, 0x9e, 0x38, 0xeb, 0x32, 0x8c, 0x57, 0xbb, 0x5d, + 0xdf, 0x7b, 0xc0, 0xb7, 0xbd, 0x88, 0x97, 0x6f, 0xf3, 0x22, 0x2d, 0x02, 0x16, 0x2f, 0x62, 0x9f, + 0x51, 0xa3, 0xee, 0x81, 0x6a, 0x9e, 0xd6, 0xa2, 0xae, 0x7a, 0x29, 0xc1, 0x7a, 0xa3, 0x01, 0xa4, + 0xee, 0x7b, 0x1d, 0x2f, 0xa4, 0x2d, 0xde, 0x1f, 0x0c, 0x1c, 0x76, 0x6c, 0xac, 0xe1, 0x4d, 0x27, + 0x6c, 0x6b, 0xb1, 0x86, 0x43, 0x56, 0x60, 0xf2, 0x72, 0x76, 0x76, 0x9f, 0xd1, 0xc6, 0xb4, 0xe6, + 0x1f, 0x98, 0x3d, 0x77, 0xd5, 0xf5, 0x9d, 0xe6, 0x1e, 0xfa, 0xb8, 0xde, 0x01, 0x30, 0xa9, 0x1d, + 0x78, 0xae, 0x22, 0xac, 0x5d, 0xe2, 0xe9, 0x76, 0x59, 0x69, 0x5a, 0xef, 0x30, 0x2b, 0x28, 0xc5, + 0x58, 0xa6, 0x42, 0x81, 0x54, 0x61, 0x8a, 0xff, 0x62, 0x9d, 0xe9, 0x46, 0x82, 0xf8, 0xb3, 0xdc, + 0xe3, 0x14, 0x49, 0x76, 0xb1, 0x46, 0x8f, 0x46, 0xa1, 0x60, 0x18, 0xff, 0xe7, 0x28, 0x94, 0xd4, + 0x29, 0x25, 0x06, 0xcf, 0x1d, 0xe9, 0xf9, 0x6a, 0xfc, 0x3e, 0x1b, 0x4b, 0x4c, 0x51, 0x13, 0x07, + 0xbf, 0xcc, 0x1f, 0x1b, 0xfc, 0xf2, 0x3e, 0x4c, 0xd5, 0x7d, 0x0f, 0xb3, 0x11, 0xe0, 0x6b, 0xb3, + 0xe0, 0xdf, 0x73, 0x8a, 0xd6, 0x80, 0xad, 0x3e, 0x7c, 0xcf, 0xc6, 0x7b, 0x59, 0x57, 0x40, 0x5b, + 0x4c, 0xf4, 0xd5, 0x74, 0x66, 0x1a, 0x1d, 0x6e, 0x2a, 0xc3, 0x7a, 0xa2, 0xe6, 0xd8, 0xe1, 0x9d, + 0xd6, 0x4d, 0x65, 0x58, 0x89, 0xca, 0x20, 0x46, 0x9f, 0x14, 0x83, 0x20, 0x3f, 0x97, 0x83, 0xc9, + 0xaa, 0xeb, 0x8a, 0xa0, 0x9a, 0xc7, 0x84, 0x00, 0xfb, 0xaa, 0xb0, 0x96, 0x79, 0xeb, 0x23, 0x59, + 0xcb, 0xa0, 0xb0, 0x15, 0xa0, 0xa4, 0x1e, 0x37, 0xa8, 0x05, 0xc6, 0x89, 0x8b, 0xc9, 0x5b, 0x50, + 0x8e, 0x76, 0xe6, 0xba, 0xdb, 0xa2, 0x8f, 0x68, 0xb0, 0x30, 0x7e, 0xb6, 0x70, 0x7e, 0x4a, 0xa4, + 0x38, 0x52, 0x25, 0xf3, 0x24, 0x20, 0xd9, 0x04, 0xb0, 0xa3, 0x2d, 0x21, 0x1e, 0xf1, 0x4e, 0xc7, + 0x0f, 0x2e, 0x89, 0x3d, 0x23, 0x6e, 0x0f, 0xf8, 0x1b, 0x1f, 0x24, 0xd5, 0xdb, 0x43, 0x4c, 0x87, + 0x74, 0x60, 0xa6, 0x1a, 0x04, 0xbd, 0x0e, 0x6d, 0x84, 0xb6, 0x1f, 0x62, 0x1e, 0x43, 0x18, 0xde, + 0x0c, 0xd4, 0x46, 0x54, 0xb6, 0x22, 0xfc, 0xd0, 0xca, 0x48, 0x6a, 0x98, 0xa4, 0xcd, 0x13, 0x4a, + 0x99, 0xa7, 0xd2, 0xdf, 0xcb, 0x77, 0xea, 0x4f, 0xe5, 0xe0, 0xa4, 0xba, 0xe8, 0x1b, 0xbd, 0x6d, + 0x91, 0xc5, 0x81, 0x5c, 0x82, 0x09, 0xb1, 0x26, 0xa3, 0x4b, 0x64, 0x3a, 0x1d, 0x63, 0x0c, 0x42, + 0x56, 0xd9, 0x32, 0x64, 0x34, 0xc4, 0xad, 0x63, 0x2e, 0xc1, 0x5c, 0x59, 0xd5, 0xf2, 0x42, 0x9c, + 0x4f, 0x92, 0xfd, 0xd6, 0xd7, 0x27, 0x2b, 0x31, 0xde, 0x85, 0x59, 0x7d, 0x26, 0x1a, 0x34, 0x24, + 0x17, 0x60, 0x5c, 0x4e, 0x5f, 0x2e, 0x7b, 0xfa, 0x64, 0xbd, 0x71, 0x1f, 0x48, 0x0a, 0x3f, 0x40, + 0xb3, 0x36, 0x76, 0x3f, 0xe7, 0x66, 0x97, 0xf2, 0x51, 0x39, 0x05, 0xb8, 0x3c, 0x27, 0xbe, 0x6f, + 0x52, 0x73, 0x6c, 0xc4, 0x8c, 0x16, 0xbf, 0x55, 0x86, 0xb9, 0x8c, 0x83, 0xe2, 0x18, 0x41, 0xae, + 0xa2, 0x33, 0x88, 0x89, 0x28, 0x82, 0xa0, 0x64, 0x0b, 0xef, 0xc2, 0xe8, 0xb1, 0xec, 0x80, 0xbb, + 0xb5, 0x26, 0xb8, 0x00, 0x47, 0xfb, 0x44, 0x84, 0x39, 0x35, 0x62, 0xe8, 0xe8, 0x13, 0x8b, 0x18, + 0x8a, 0x21, 0x83, 0x14, 0x26, 0xae, 0x87, 0x31, 0xe2, 0xe9, 0x45, 0x53, 0x6c, 0x4b, 0x47, 0xe1, + 0x34, 0x02, 0xaf, 0xfd, 0x80, 0x0a, 0x1a, 0xe3, 0x2a, 0x0d, 0xac, 0xc8, 0xa4, 0xa1, 0xa0, 0x90, + 0x7f, 0x90, 0x03, 0x22, 0x4a, 0x54, 0x9e, 0x55, 0x1c, 0xc4, 0xb3, 0x5a, 0x4f, 0x86, 0x67, 0x9d, + 0x91, 0xdf, 0x98, 0xcd, 0xbb, 0x32, 0x3e, 0x8b, 0xfc, 0xbd, 0x1c, 0xcc, 0xf2, 0x48, 0x93, 0xea, + 0xc7, 0x0e, 0x8c, 0x1e, 0xd8, 0x7c, 0x32, 0x1f, 0xfb, 0x9c, 0x48, 0x2c, 0x9b, 0xfd, 0xad, 0xe9, + 0x8f, 0x22, 0xdf, 0x07, 0x10, 0xed, 0x28, 0x9e, 0xd5, 0x63, 0x72, 0xe9, 0xb9, 0x0c, 0x2e, 0x10, + 0x01, 0xc5, 0xd9, 0x14, 0xc3, 0x08, 0x4f, 0x65, 0x9b, 0x31, 0x35, 0xf2, 0x17, 0x79, 0x0c, 0xfe, + 0xa8, 0x44, 0x04, 0xd9, 0x5d, 0x98, 0xc4, 0x56, 0x3e, 0xdb, 0x5f, 0x90, 0xbb, 0x94, 0x85, 0xc6, + 0x73, 0xc0, 0x44, 0x46, 0xd6, 0x7e, 0xd8, 0x49, 0xc6, 0xe1, 0x4f, 0x62, 0x60, 0xec, 0x6a, 0xfc, + 0x7a, 0x9e, 0xf1, 0xb0, 0x0f, 0x7f, 0x3b, 0x2d, 0xf7, 0x02, 0xe7, 0x6f, 0x09, 0x67, 0x24, 0x2c, + 0x22, 0xef, 0x03, 0x89, 0x42, 0x34, 0xf2, 0x32, 0x2a, 0xb3, 0x21, 0xf2, 0xc7, 0x82, 0x38, 0xd4, + 0xa3, 0x2f, 0xab, 0xd5, 0x45, 0x92, 0x46, 0x26, 0x14, 0xe6, 0x45, 0xa7, 0x59, 0x29, 0x77, 0x20, + 0x5e, 0xaf, 0x05, 0x0b, 0xd3, 0x5a, 0x08, 0xe3, 0xb8, 0x66, 0xf9, 0x79, 0x99, 0x3c, 0x38, 0xf2, + 0x44, 0xd6, 0x5d, 0x7a, 0x33, 0xc9, 0x91, 0x6b, 0x30, 0x81, 0xa1, 0x46, 0xd6, 0xa4, 0xb1, 0x9e, + 0x30, 0x1c, 0xc2, 0xa0, 0x24, 0xd6, 0x9e, 0x6e, 0x72, 0x17, 0x83, 0xb2, 0x3b, 0x0c, 0x97, 0x00, + 0x51, 0xa5, 0x2f, 0x94, 0x34, 0x2d, 0xff, 0xc0, 0xf2, 0x7b, 0x7a, 0x18, 0x1b, 0x04, 0x22, 0x5f, + 0x87, 0xc9, 0xdb, 0xf6, 0xa3, 0x28, 0x49, 0xf1, 0xec, 0xf0, 0xa9, 0x90, 0x3b, 0xf6, 0xa3, 0x28, + 0x43, 0x71, 0xd2, 0x81, 0x49, 0x21, 0x49, 0x3e, 0x00, 0x50, 0xde, 0x19, 0xc8, 0xb1, 0x0d, 0xbc, + 0x20, 0x03, 0x73, 0x67, 0xbe, 0x3f, 0x20, 0x7d, 0x85, 0x60, 0x42, 0x72, 0x98, 0xff, 0xe4, 0x24, + 0x87, 0x13, 0x9f, 0x9c, 0xe4, 0xc0, 0x9f, 0xb9, 0xf8, 0xdc, 0x23, 0x07, 0x3f, 0x10, 0x5a, 0xfe, + 0x41, 0xad, 0x3d, 0x27, 0x4d, 0x41, 0xf1, 0x28, 0x38, 0x48, 0x34, 0x91, 0xa0, 0x47, 0x7c, 0x28, + 0x27, 0x2f, 0x06, 0x0b, 0xa7, 0x34, 0xcb, 0xc2, 0x81, 0x97, 0x08, 0xae, 0x6e, 0x15, 0xcb, 0xc8, + 0xa2, 0x51, 0xb9, 0x2a, 0xd4, 0x25, 0x71, 0x16, 0xb7, 0xe1, 0x74, 0x5f, 0x86, 0x90, 0x91, 0xc5, + 0xe6, 0xb2, 0x9e, 0xc5, 0xe6, 0x74, 0x3f, 0xc1, 0x21, 0xd0, 0x53, 0x79, 0xce, 0x95, 0xe7, 0xfb, + 0xcb, 0x5c, 0xdf, 0xcd, 0x27, 0x04, 0x09, 0x71, 0xc7, 0xe3, 0x89, 0xaf, 0xfb, 0x49, 0x5a, 0xf9, + 0xf5, 0x1a, 0xbb, 0xd4, 0xa1, 0xa8, 0xa1, 0x24, 0x1e, 0x63, 0xa2, 0x86, 0x2a, 0xaa, 0xa0, 0xd0, + 0xf1, 0x71, 0x65, 0x8a, 0xb7, 0x61, 0xba, 0x41, 0x6d, 0xbf, 0xb9, 0x77, 0x8b, 0x1e, 0x3c, 0xf4, + 0xfc, 0x16, 0x4f, 0x90, 0x2b, 0x6e, 0x16, 0x01, 0xd6, 0xe8, 0x21, 0x1b, 0x54, 0x58, 0x52, 0x93, + 0x31, 0x39, 0x46, 0xb1, 0xf5, 0xd3, 0x99, 0xbc, 0x99, 0x01, 0x0c, 0x0a, 0xd7, 0x41, 0xde, 0x88, + 0xc4, 0x4f, 0xea, 0xab, 0x09, 0x3d, 0x7d, 0x59, 0x98, 0x21, 0x85, 0x52, 0xdf, 0xf8, 0xbd, 0x02, + 0x10, 0xde, 0xd2, 0x8a, 0xdd, 0xb5, 0x31, 0x62, 0x8d, 0x83, 0x61, 0x69, 0xcb, 0x02, 0xc6, 0xde, + 0x6e, 0x53, 0x35, 0xa6, 0xb3, 0x30, 0xf9, 0x8e, 0xea, 0xac, 0xe4, 0xf5, 0x2d, 0x85, 0xd8, 0x87, + 0x81, 0xe7, 0x3f, 0x0e, 0x03, 0xff, 0x3a, 0x3c, 0x5b, 0xed, 0x76, 0xdb, 0x4e, 0x33, 0x6a, 0xe5, + 0xba, 0xe7, 0xcb, 0xed, 0xa2, 0xc5, 0x42, 0xb0, 0x23, 0xb0, 0xd4, 0x97, 0x0e, 0x22, 0xa1, 0x48, + 0x5f, 0xfc, 0xc2, 0xab, 0xc6, 0xd6, 0x92, 0xd2, 0x57, 0xd6, 0x15, 0x59, 0x41, 0x91, 0x34, 0x1c, + 0x5f, 0x4a, 0x5f, 0xa3, 0x71, 0xa6, 0x18, 0xf9, 0xc2, 0x9d, 0x2d, 0xc1, 0x45, 0x28, 0xe4, 0x6d, + 0x98, 0xac, 0xf6, 0x42, 0x4f, 0x10, 0x16, 0xbe, 0x0a, 0xb1, 0x57, 0x81, 0xf8, 0x14, 0xed, 0x42, + 0x17, 0x83, 0x1b, 0x7f, 0x50, 0x80, 0xd3, 0xe9, 0xe9, 0x15, 0xb5, 0xd1, 0xfe, 0xc8, 0x1d, 0xb3, + 0x3f, 0xb2, 0x56, 0x43, 0x3e, 0x4e, 0x65, 0xf8, 0x24, 0x56, 0x43, 0x01, 0xc9, 0x7d, 0xc4, 0xd5, + 0xd0, 0x80, 0x49, 0xf5, 0x14, 0x1f, 0xf9, 0xa8, 0xa7, 0xb8, 0x4a, 0x85, 0x5c, 0x80, 0x51, 0x1e, + 0x52, 0x6c, 0x34, 0x7e, 0x10, 0x4c, 0x46, 0x13, 0xe3, 0x10, 0xe4, 0xff, 0x07, 0x67, 0x39, 0x4f, + 0x4a, 0x76, 0x76, 0xf9, 0x40, 0x52, 0x14, 0x13, 0xb7, 0x74, 0x74, 0x58, 0xb9, 0xc4, 0xb5, 0x56, + 0x56, 0x6a, 0xd8, 0xac, 0xed, 0x03, 0x4b, 0x7e, 0x99, 0xd2, 0xc8, 0xb1, 0xb4, 0x8d, 0x47, 0x70, + 0x5a, 0xd4, 0xc6, 0xc1, 0x6c, 0x64, 0x25, 0x9b, 0xe4, 0xfd, 0x58, 0xf1, 0x88, 0x93, 0x9c, 0xd0, + 0x29, 0x62, 0x3d, 0xb9, 0x0a, 0xc5, 0x6a, 0x7d, 0x9d, 0x27, 0x57, 0x57, 0x42, 0x11, 0xd9, 0x5d, + 0x87, 0x47, 0x5d, 0xd1, 0xa2, 0x1b, 0x08, 0x40, 0xe3, 0xd7, 0x73, 0x00, 0xf1, 0xa0, 0x91, 0x8b, + 0x59, 0xee, 0x63, 0x3c, 0x1d, 0x15, 0x2f, 0xd6, 0x3d, 0xc7, 0xa4, 0x4e, 0x34, 0x9f, 0xa9, 0x13, + 0x95, 0x4a, 0xb5, 0x42, 0xa6, 0x52, 0xad, 0x06, 0x33, 0x8d, 0xde, 0xb6, 0x6c, 0x3b, 0x19, 0xfc, + 0x22, 0xe8, 0x6d, 0x67, 0x0d, 0x65, 0x12, 0xc5, 0xf8, 0xb1, 0x3c, 0x94, 0xea, 0xed, 0xde, 0xae, + 0xe3, 0xd6, 0xec, 0xd0, 0x7e, 0x6a, 0xd5, 0xb4, 0x6f, 0x6a, 0x6a, 0xda, 0xc8, 0x4b, 0x32, 0xea, + 0xd8, 0x50, 0x3a, 0xda, 0x9f, 0xcd, 0xc1, 0x4c, 0x8c, 0xc2, 0x4f, 0xf8, 0x35, 0x18, 0x61, 0x3f, + 0x84, 0x1e, 0xe0, 0x6c, 0x8a, 0x30, 0x42, 0x5d, 0x8a, 0xfe, 0x12, 0x8a, 0x53, 0x3d, 0xb3, 0x38, + 0x52, 0x58, 0xfc, 0x1c, 0x4c, 0xc4, 0x64, 0xd3, 0x82, 0xc3, 0xbc, 0x2a, 0x38, 0x4c, 0xa8, 0x79, + 0xee, 0x7e, 0x35, 0x07, 0xe5, 0x64, 0x4f, 0xc8, 0x2d, 0x18, 0x67, 0x94, 0x1c, 0x2a, 0x55, 0x14, + 0x2f, 0xf5, 0xe9, 0xf3, 0x25, 0x01, 0xc6, 0x3f, 0x0f, 0x07, 0x9f, 0xf2, 0x12, 0x53, 0x52, 0x58, + 0x34, 0xa1, 0xa4, 0x42, 0x65, 0x7c, 0xdd, 0xeb, 0xba, 0x58, 0x73, 0x32, 0x7b, 0x1c, 0xd4, 0xaf, + 0xfe, 0x1b, 0xda, 0x57, 0x0b, 0x89, 0xe5, 0x9c, 0xb6, 0xb8, 0x32, 0xb7, 0x22, 0x2e, 0x1a, 0x4c, + 0xb8, 0x27, 0xf8, 0x46, 0x5e, 0x0d, 0x05, 0x99, 0x5a, 0xd0, 0x11, 0x1c, 0x79, 0x1d, 0xc6, 0x78, + 0x7b, 0x6a, 0x9a, 0xf1, 0x2e, 0x96, 0xa8, 0x57, 0x06, 0x0e, 0x63, 0xfc, 0xcd, 0x02, 0x9c, 0x8c, + 0x3f, 0x6f, 0xab, 0xdb, 0xb2, 0x43, 0x5a, 0xb7, 0x7d, 0xbb, 0x13, 0x1c, 0xb3, 0x03, 0xce, 0xa7, + 0x3e, 0x4d, 0x84, 0x55, 0xe0, 0x65, 0xca, 0x07, 0x19, 0x89, 0x0f, 0x42, 0x75, 0x30, 0xff, 0x20, + 0xf9, 0x19, 0xe4, 0x16, 0x14, 0x1a, 0x34, 0x14, 0x0c, 0xfb, 0x5c, 0x6a, 0x54, 0xd5, 0xef, 0xba, + 0xd4, 0xa0, 0x21, 0x9f, 0x44, 0x1e, 0x64, 0x53, 0x0b, 0x60, 0xc0, 0xa8, 0x90, 0xfb, 0x30, 0xb6, + 0xfa, 0xa8, 0x4b, 0x9b, 0x21, 0x66, 0x56, 0x52, 0x3c, 0xf9, 0xb3, 0xe9, 0x71, 0x58, 0x4e, 0x72, + 0x5e, 0xc8, 0xe0, 0x7a, 0x36, 0x43, 0x41, 0x6e, 0xf1, 0x1a, 0x14, 0x65, 0xe3, 0x8f, 0xb3, 0x72, + 0x17, 0xdf, 0x84, 0x49, 0xa5, 0x91, 0xc7, 0x5a, 0xf4, 0xbf, 0xc0, 0xf8, 0xaa, 0xd7, 0xa6, 0x62, + 0xe1, 0xac, 0xa6, 0x04, 0x4c, 0x25, 0x47, 0x32, 0x17, 0x30, 0xad, 0x7d, 0x51, 0x35, 0x40, 0xd2, + 0x5c, 0x87, 0x99, 0xc6, 0xbe, 0xd3, 0x8d, 0x13, 0x71, 0x68, 0xc7, 0x38, 0xe6, 0x61, 0x15, 0x3a, + 0x8c, 0xe4, 0x31, 0x9e, 0xc4, 0x33, 0xfe, 0x24, 0x07, 0x63, 0xec, 0xaf, 0x7b, 0xd7, 0x9e, 0x52, + 0x96, 0x79, 0x55, 0x63, 0x99, 0xb3, 0x4a, 0x62, 0x2d, 0x64, 0x1c, 0xd7, 0x8e, 0x61, 0x96, 0x87, + 0x62, 0x82, 0x38, 0x30, 0xb9, 0x01, 0xe3, 0xc2, 0x36, 0x4e, 0xb8, 0x31, 0xa8, 0x99, 0xba, 0xa4, + 0xd5, 0x5c, 0xa4, 0xec, 0xf0, 0xba, 0x49, 0xed, 0x90, 0xc4, 0x66, 0x97, 0x01, 0x99, 0x12, 0x45, + 0x4d, 0x03, 0xca, 0xc8, 0xac, 0x78, 0x2e, 0xcf, 0x33, 0x15, 0x2c, 0x9f, 0x12, 0x94, 0xfa, 0x05, + 0x2a, 0xaa, 0x8a, 0xd7, 0xac, 0xc2, 0x20, 0x22, 0x27, 0x05, 0x91, 0xec, 0x87, 0xae, 0x0e, 0x9c, + 0x6c, 0x34, 0xd6, 0xd0, 0x8e, 0xb6, 0xee, 0xf9, 0xe1, 0x75, 0xcf, 0x7f, 0x28, 0xe2, 0xb1, 0x34, + 0x74, 0x1b, 0x92, 0x2c, 0xeb, 0xc6, 0x57, 0x32, 0xad, 0x1b, 0x07, 0xd8, 0x99, 0x18, 0x2e, 0x9c, + 0x6a, 0x34, 0xd6, 0x78, 0x96, 0xa7, 0x3f, 0x8d, 0xf6, 0x7e, 0x35, 0x07, 0xb3, 0x8d, 0xc6, 0x5a, + 0xa2, 0xa9, 0x0d, 0x99, 0x5e, 0x2a, 0xa7, 0x3d, 0x64, 0x67, 0x0f, 0x04, 0xce, 0x42, 0x8e, 0x8b, + 0x85, 0x4d, 0x2d, 0x48, 0x38, 0x27, 0x42, 0xea, 0x51, 0x42, 0xab, 0xbc, 0xe6, 0xda, 0xd2, 0xa7, + 0xa3, 0xa8, 0xec, 0x17, 0x8e, 0xa1, 0xac, 0x56, 0x57, 0xf6, 0xb3, 0x12, 0xe3, 0x5f, 0x9c, 0xe4, + 0x29, 0xb3, 0xe4, 0x6a, 0x79, 0x07, 0x4a, 0x02, 0x1f, 0xfd, 0x3f, 0x84, 0x4d, 0xcf, 0x69, 0xc6, + 0x20, 0x77, 0x78, 0x39, 0xcf, 0x7e, 0xf2, 0xbd, 0xc3, 0xca, 0x08, 0x1b, 0x1a, 0x53, 0x03, 0x27, + 0x77, 0x61, 0xea, 0xb6, 0xfd, 0x48, 0xd1, 0xec, 0x70, 0xef, 0xbe, 0x0b, 0x8c, 0xab, 0x74, 0xec, + 0x47, 0x43, 0x58, 0x8f, 0xea, 0xf8, 0x64, 0x1f, 0xa6, 0xf5, 0x3e, 0x89, 0x15, 0x98, 0x9e, 0xb1, + 0x2b, 0x99, 0x33, 0x76, 0xba, 0xeb, 0xf9, 0xa1, 0xb5, 0x13, 0xa1, 0x6b, 0xe9, 0xe1, 0x12, 0xa4, + 0xc9, 0x3b, 0x30, 0xab, 0x84, 0x62, 0xbf, 0xee, 0xf9, 0x1d, 0x5b, 0xde, 0xd2, 0xf0, 0xb9, 0x03, + 0xcd, 0xca, 0x76, 0xb0, 0xd8, 0x4c, 0x43, 0x92, 0xaf, 0x64, 0x79, 0x4c, 0x8e, 0xc6, 0x26, 0xb4, + 0x19, 0x1e, 0x93, 0xfd, 0x4c, 0x68, 0xd3, 0xbe, 0x93, 0xbb, 0x83, 0x4c, 0xec, 0x8b, 0xbc, 0xf7, + 0x43, 0x99, 0xd0, 0x47, 0x33, 0xd7, 0xc7, 0x94, 0x7e, 0x09, 0x0a, 0xcb, 0xf5, 0xeb, 0xf8, 0x48, + 0x27, 0xed, 0xe9, 0xdc, 0x3d, 0xdb, 0x6d, 0xe2, 0xed, 0x49, 0x38, 0xb6, 0xa8, 0x07, 0xe5, 0x72, + 0xfd, 0x3a, 0xb1, 0x61, 0x0e, 0xb3, 0x8f, 0x87, 0x5f, 0xba, 0x72, 0x45, 0x99, 0xaa, 0x22, 0x7e, + 0xda, 0x65, 0xf1, 0x69, 0x15, 0xcc, 0x5d, 0x1e, 0x5a, 0x8f, 0xae, 0x5c, 0xc9, 0x9c, 0x90, 0xe8, + 0xc3, 0xb2, 0x68, 0xb1, 0x03, 0xeb, 0xb6, 0xfd, 0x28, 0xf6, 0x47, 0x0a, 0x84, 0xef, 0xf9, 0x19, + 0xb9, 0xb4, 0x62, 0x5f, 0x26, 0xed, 0xc0, 0xd2, 0x91, 0xd8, 0xe5, 0x37, 0x5e, 0x60, 0x81, 0xf0, + 0xda, 0x5b, 0x94, 0x9a, 0x4b, 0x19, 0xa0, 0x40, 0xbd, 0xc1, 0x29, 0xe0, 0x64, 0x2b, 0xba, 0xc2, + 0xf3, 0x2b, 0x30, 0x1a, 0xba, 0x4f, 0x2c, 0x5f, 0x56, 0xaf, 0xf0, 0x5c, 0x5f, 0xa8, 0x75, 0x6b, + 0x26, 0xd2, 0xfb, 0x70, 0x07, 0x2d, 0x53, 0xa7, 0x92, 0xd6, 0x0c, 0x94, 0x1e, 0x5f, 0x33, 0x40, + 0x61, 0x64, 0xc3, 0x6b, 0xee, 0x8b, 0x48, 0xc7, 0xef, 0x33, 0x2e, 0xdc, 0xf6, 0x9a, 0xfb, 0x4f, + 0xce, 0x75, 0x00, 0xc9, 0x93, 0x3b, 0x3c, 0xfa, 0x8e, 0xdf, 0x12, 0x63, 0x22, 0xcc, 0xd1, 0xe7, + 0xa3, 0xab, 0xb1, 0x52, 0x17, 0xc7, 0xe4, 0xf1, 0x5b, 0x72, 0x68, 0x4d, 0x1d, 0x9d, 0x50, 0x28, + 0xd7, 0x68, 0xb0, 0x1f, 0x7a, 0xdd, 0x95, 0xb6, 0xd3, 0xc5, 0x80, 0x56, 0x22, 0x55, 0xce, 0xd0, + 0x3c, 0xb9, 0xc5, 0xf1, 0xad, 0xa6, 0x24, 0x60, 0xa6, 0x48, 0x92, 0xaf, 0xc0, 0x34, 0x5b, 0xdc, + 0xab, 0x8f, 0x42, 0xea, 0xf2, 0x99, 0x9f, 0x45, 0x89, 0x6e, 0x5e, 0x49, 0x34, 0x19, 0x55, 0xf2, + 0x35, 0x85, 0x9b, 0x9d, 0x46, 0x08, 0x5a, 0x94, 0x68, 0x8d, 0x14, 0x69, 0xc1, 0xc2, 0x6d, 0xfb, + 0x51, 0x7c, 0x51, 0x56, 0x17, 0x29, 0xc1, 0x05, 0x76, 0xfe, 0xe8, 0xb0, 0xf2, 0x12, 0x5b, 0x60, + 0x71, 0xf6, 0xa6, 0x3e, 0xeb, 0xb5, 0x2f, 0x25, 0xf2, 0x4d, 0x38, 0x25, 0xba, 0x55, 0xc3, 0x84, + 0xd8, 0x9e, 0x7f, 0xd0, 0xd8, 0xb3, 0xd1, 0x15, 0x71, 0xae, 0xcf, 0x80, 0x5d, 0xce, 0x66, 0x89, + 0x72, 0xc0, 0x5a, 0x92, 0x8e, 0x15, 0x70, 0x42, 0x66, 0xbf, 0x16, 0xc8, 0x87, 0x30, 0xcd, 0x5f, + 0x26, 0x65, 0x3a, 0x6f, 0xa1, 0x53, 0x1f, 0xda, 0xbf, 0x86, 0x3f, 0x77, 0xc6, 0x39, 0xc2, 0xb5, + 0xe1, 0xd4, 0x28, 0x93, 0xb7, 0xd0, 0x84, 0x95, 0xc7, 0x71, 0x5f, 0xaf, 0xa3, 0x86, 0x5d, 0x9c, + 0x40, 0x5d, 0xc7, 0xb5, 0xa4, 0x9a, 0xa5, 0x1b, 0xb1, 0x0b, 0x15, 0x9a, 0xdc, 0x87, 0xc9, 0x46, + 0x63, 0xed, 0xba, 0xc3, 0xe4, 0x92, 0xae, 0x54, 0x98, 0xa7, 0xbf, 0xf2, 0xc5, 0xcc, 0xaf, 0x9c, + 0x0a, 0x82, 0x3d, 0x0b, 0x73, 0x36, 0x37, 0xbd, 0xee, 0x81, 0xa9, 0x52, 0xca, 0xf0, 0x39, 0x39, + 0xf5, 0x84, 0x7d, 0x4e, 0xd6, 0x61, 0x46, 0xb1, 0xa3, 0x46, 0xb3, 0x9c, 0x85, 0x38, 0xf8, 0xa7, + 0xea, 0x63, 0x92, 0xf4, 0xb2, 0x4e, 0xe2, 0x49, 0x67, 0x93, 0xd3, 0x8f, 0xeb, 0x6c, 0xe2, 0xc0, + 0x2c, 0x9f, 0x0c, 0xb1, 0x0e, 0x70, 0xa6, 0x17, 0xfb, 0x8c, 0xe1, 0x85, 0xcc, 0x31, 0x9c, 0x13, + 0x33, 0x2d, 0x17, 0x19, 0xbe, 0xc4, 0xa7, 0xa9, 0x92, 0x1d, 0x20, 0xa2, 0xd0, 0x0e, 0xed, 0x6d, + 0x3b, 0xa0, 0xd8, 0xd6, 0xb3, 0x7d, 0xda, 0x7a, 0x29, 0xb3, 0xad, 0x69, 0xd9, 0xd6, 0x36, 0x6f, + 0x26, 0x83, 0x22, 0x71, 0x65, 0x3b, 0x72, 0x7d, 0xe1, 0xc0, 0x3e, 0xa7, 0x29, 0xc6, 0xd3, 0x00, + 0x3c, 0x8e, 0x66, 0x72, 0xd1, 0x26, 0xc7, 0x3d, 0x83, 0x32, 0x79, 0x04, 0x27, 0xd3, 0x5f, 0x81, + 0x6d, 0x9e, 0xc1, 0x36, 0xcf, 0x68, 0x6d, 0x26, 0x81, 0xf8, 0xba, 0xd1, 0xbb, 0x95, 0x6c, 0xb5, + 0x0f, 0x7d, 0xf2, 0x23, 0x39, 0x38, 0x75, 0xfb, 0x7a, 0xf5, 0x1e, 0xf5, 0xb9, 0x58, 0xe2, 0x78, + 0x6e, 0xe4, 0x9d, 0xfe, 0xbc, 0x78, 0x3c, 0x49, 0x3e, 0x1c, 0x49, 0x89, 0x03, 0x59, 0x05, 0x13, + 0xdd, 0x5f, 0xec, 0xec, 0xd8, 0xd6, 0x03, 0x85, 0x44, 0x86, 0x0b, 0xfb, 0xb7, 0x7f, 0xbf, 0x92, + 0x33, 0xfb, 0x35, 0x45, 0xda, 0xb0, 0xa8, 0x0f, 0x8b, 0x74, 0x07, 0xda, 0xa3, 0xed, 0xf6, 0x42, + 0x05, 0x57, 0xf4, 0xeb, 0x47, 0x87, 0x95, 0xf3, 0xa9, 0xd1, 0x8d, 0x5c, 0x8c, 0x18, 0xa4, 0xd2, + 0xe1, 0x01, 0xf4, 0x48, 0x27, 0x43, 0xe8, 0x5e, 0x38, 0xab, 0x85, 0xb1, 0x4a, 0xd5, 0x47, 0x61, + 0xd6, 0xce, 0xb0, 0xfd, 0xde, 0x57, 0x40, 0x34, 0xd3, 0x94, 0x6f, 0x8e, 0x14, 0xa7, 0xca, 0xd3, + 0x19, 0x7e, 0x32, 0xc6, 0x77, 0xf2, 0x89, 0x83, 0x91, 0xac, 0xc3, 0xb8, 0x58, 0xef, 0x7d, 0x2f, + 0x19, 0x67, 0x32, 0x57, 0xf5, 0xb8, 0xd8, 0x3a, 0xa6, 0xc4, 0x27, 0x0f, 0x19, 0x29, 0xec, 0xb4, + 0xb8, 0xf1, 0x7e, 0xc0, 0xcf, 0x3d, 0x2c, 0xd2, 0x4e, 0xf8, 0xda, 0xe3, 0xfb, 0x94, 0xea, 0x2e, + 0xcb, 0x78, 0xd4, 0xcb, 0xd6, 0xc8, 0x3e, 0xcf, 0xfb, 0x5b, 0x88, 0xdc, 0x12, 0xf5, 0x24, 0xbf, + 0x4f, 0xac, 0x41, 0xd6, 0x8a, 0xf1, 0x1b, 0x39, 0x98, 0xd2, 0x4e, 0x56, 0x72, 0x4d, 0xf1, 0xba, + 0x8d, 0x03, 0x51, 0x68, 0x30, 0xc8, 0x6c, 0x93, 0xfe, 0xb8, 0xd7, 0x94, 0x00, 0x8e, 0x7d, 0xf0, + 0x70, 0xb3, 0x25, 0x9d, 0xb0, 0x07, 0xeb, 0x87, 0x2b, 0x30, 0xca, 0x23, 0xf8, 0x8c, 0xc4, 0x46, + 0x97, 0xa8, 0x5f, 0x31, 0x79, 0xb9, 0xf1, 0x1f, 0x57, 0x60, 0x5a, 0xbf, 0x11, 0x93, 0xd7, 0x61, + 0x0c, 0x15, 0xfa, 0x52, 0xbd, 0x82, 0x6a, 0x21, 0xd4, 0xf9, 0x6b, 0x7e, 0x49, 0x1c, 0x86, 0xbc, + 0x0c, 0x10, 0x19, 0xf0, 0xcb, 0xe7, 0xac, 0xd1, 0xa3, 0xc3, 0x4a, 0xee, 0xa2, 0xa9, 0x54, 0x90, + 0xaf, 0x01, 0xdc, 0xf1, 0x5a, 0x54, 0xa4, 0xb1, 0x2c, 0x0c, 0x32, 0x44, 0x79, 0x25, 0x95, 0xc6, + 0xf2, 0x84, 0xeb, 0xb5, 0x68, 0x3a, 0x67, 0xa5, 0x42, 0x91, 0x7c, 0x01, 0x46, 0xcd, 0x5e, 0x9b, + 0xca, 0x67, 0x8f, 0x49, 0x79, 0xc2, 0xf5, 0xda, 0x34, 0xd6, 0x13, 0xf8, 0xbd, 0xa4, 0x8d, 0x25, + 0x2b, 0x20, 0xef, 0xf1, 0xf4, 0x96, 0x22, 0xe0, 0xfa, 0x68, 0xfc, 0xc0, 0xa7, 0x48, 0x3e, 0xa9, + 0x90, 0xeb, 0x0a, 0x0a, 0xb9, 0x0b, 0xe3, 0xea, 0xcb, 0x94, 0x12, 0xbe, 0x41, 0x7d, 0xbd, 0x54, + 0x94, 0x0e, 0x22, 0xf2, 0x6c, 0xf2, 0xd1, 0x4a, 0x52, 0x21, 0x6f, 0xc3, 0x04, 0x23, 0xcf, 0x38, + 0x47, 0x20, 0x6e, 0x35, 0xf8, 0x8c, 0xa7, 0x7c, 0x10, 0xe3, 0x3e, 0x5a, 0x58, 0xf4, 0x08, 0x81, + 0x7c, 0x05, 0x26, 0xaa, 0xdd, 0xae, 0x18, 0xea, 0x81, 0x06, 0x4a, 0xe7, 0x52, 0x43, 0x3d, 0x6f, + 0x77, 0xbb, 0xe9, 0x91, 0x8e, 0xe9, 0x91, 0xdd, 0x28, 0x7a, 0xe0, 0x30, 0x29, 0x49, 0x5f, 0x4d, + 0x35, 0xb0, 0x20, 0x03, 0xe2, 0xa5, 0x1a, 0xd1, 0xe9, 0x92, 0x2e, 0x94, 0x63, 0xa1, 0x52, 0xb4, + 0x05, 0x83, 0xda, 0xba, 0x98, 0x6a, 0x4b, 0x9d, 0xc0, 0x54, 0x73, 0x29, 0xea, 0xa4, 0x05, 0xd3, + 0xf2, 0x80, 0x12, 0xed, 0x4d, 0x0e, 0x6a, 0xef, 0xe5, 0x54, 0x7b, 0x73, 0xad, 0xed, 0x74, 0x3b, + 0x09, 0x9a, 0xe4, 0x6d, 0x98, 0x92, 0x25, 0xb8, 0x3f, 0xd0, 0x30, 0x48, 0x28, 0x04, 0x5b, 0xdb, + 0xe8, 0x32, 0xa4, 0x8d, 0x8a, 0x06, 0xac, 0x62, 0xf3, 0xd5, 0x31, 0xa5, 0x61, 0x27, 0x57, 0x85, + 0x0e, 0x4c, 0xbe, 0x0c, 0x93, 0xeb, 0x1d, 0xd6, 0x11, 0xcf, 0xb5, 0x43, 0x2a, 0x1c, 0x7b, 0xa5, + 0xb1, 0x95, 0x52, 0xa3, 0x2c, 0x55, 0x34, 0x33, 0x71, 0xe2, 0x2a, 0xf5, 0x9a, 0xa9, 0x60, 0xb0, + 0xc1, 0xe3, 0x4f, 0x91, 0x62, 0x0d, 0x4b, 0xa7, 0xdf, 0x33, 0x19, 0x06, 0x4f, 0x0a, 0x79, 0x11, + 0x5c, 0x9b, 0x95, 0xca, 0xa7, 0xc0, 0x44, 0x62, 0x03, 0x95, 0x26, 0x79, 0x07, 0x26, 0x45, 0xb6, + 0xe6, 0xaa, 0x79, 0x27, 0x58, 0x28, 0xc7, 0xf6, 0xda, 0x32, 0xb1, 0xb3, 0x65, 0xfb, 0x09, 0xcb, + 0xde, 0x18, 0x9e, 0x7c, 0x09, 0xe6, 0xef, 0x3b, 0x6e, 0xcb, 0x7b, 0x18, 0x88, 0x63, 0x4a, 0x30, + 0xba, 0xd9, 0xd8, 0xaf, 0xf0, 0x21, 0xaf, 0x8f, 0x64, 0xc1, 0x14, 0xe3, 0xcb, 0xa4, 0x40, 0x7e, + 0x20, 0x45, 0x99, 0xaf, 0x20, 0x32, 0x68, 0x05, 0x2d, 0xa5, 0x56, 0x50, 0xba, 0xf9, 0xe4, 0x72, + 0xca, 0x6c, 0x86, 0x78, 0x40, 0xf4, 0xf3, 0xfd, 0xa6, 0xe7, 0xb8, 0x0b, 0x73, 0xc8, 0x0b, 0x9f, + 0x4d, 0x86, 0x07, 0x41, 0xb8, 0xba, 0xd7, 0x76, 0x9a, 0x07, 0xcb, 0xc6, 0xd1, 0x61, 0xe5, 0xf9, + 0xa4, 0xcc, 0xff, 0xa1, 0xa7, 0x3d, 0x97, 0x64, 0x90, 0x26, 0x5f, 0x86, 0x12, 0xfb, 0x3f, 0x52, + 0x4a, 0xcc, 0x6b, 0x26, 0xb2, 0x0a, 0xa4, 0x68, 0x07, 0xe7, 0x08, 0xd3, 0x49, 0x67, 0xe8, 0x2b, + 0x34, 0x52, 0xe4, 0x4d, 0x00, 0x26, 0x36, 0x09, 0x76, 0x7c, 0x22, 0xce, 0x23, 0x81, 0x52, 0x57, + 0x9a, 0x11, 0xc7, 0xc0, 0xe4, 0x6d, 0x98, 0x64, 0xbf, 0x1a, 0xbd, 0x96, 0xc7, 0xf6, 0xc6, 0x49, + 0xc4, 0xe5, 0x3e, 0xd6, 0x0c, 0x37, 0xe0, 0xe5, 0x9a, 0x8f, 0x75, 0x0c, 0x4e, 0xd6, 0x60, 0x06, + 0xf3, 0x7d, 0x88, 0x48, 0xf3, 0x0e, 0x0d, 0x16, 0x4e, 0x29, 0x26, 0x14, 0x98, 0x52, 0xd5, 0x89, + 0xea, 0xd4, 0xbb, 0x4c, 0x02, 0x8d, 0x04, 0x30, 0x97, 0x7e, 0x83, 0x0e, 0x16, 0x16, 0x70, 0x90, + 0xa4, 0x04, 0x9f, 0x86, 0xe0, 0xfc, 0x98, 0xcd, 0x88, 0xc2, 0xb8, 0xe4, 0xa3, 0x92, 0xda, 0x60, + 0x16, 0x75, 0x62, 0x02, 0xb9, 0xb1, 0x52, 0x4f, 0x26, 0xc4, 0x38, 0x8d, 0x3d, 0xc0, 0x69, 0xde, + 0x6d, 0x76, 0xad, 0x01, 0x49, 0x31, 0x32, 0xb0, 0xc9, 0xf7, 0xc3, 0x09, 0xc9, 0x41, 0x44, 0x95, + 0x58, 0xd7, 0x8b, 0x8f, 0xc9, 0x89, 0x5b, 0xdb, 0x51, 0xd3, 0xa9, 0x25, 0x9d, 0xdd, 0x04, 0xb1, + 0x61, 0x12, 0xa7, 0x55, 0xb4, 0xf8, 0xec, 0xa0, 0x16, 0xcf, 0xa7, 0x5a, 0x3c, 0x89, 0x0b, 0x25, + 0xdd, 0x98, 0x4a, 0x93, 0x2c, 0xc3, 0x94, 0xd8, 0x47, 0x62, 0xb5, 0x3d, 0x87, 0xa3, 0x85, 0x4a, + 0x2c, 0xb9, 0x03, 0x53, 0x0b, 0x4e, 0x47, 0x51, 0x39, 0x32, 0x7f, 0x4c, 0x3a, 0xa3, 0x71, 0xe4, + 0xe4, 0x1b, 0x92, 0x0e, 0xcc, 0x38, 0x52, 0x2c, 0xc5, 0xac, 0x3e, 0xea, 0xfa, 0x42, 0x45, 0xf5, + 0x7c, 0x9c, 0x9d, 0x52, 0x11, 0x7e, 0x2c, 0x1a, 0x41, 0xa8, 0x2c, 0x21, 0x8b, 0x02, 0xd9, 0x82, + 0xb9, 0xe8, 0xd4, 0x56, 0x08, 0x57, 0xe2, 0x94, 0x0b, 0xf1, 0x51, 0x9f, 0x4d, 0x37, 0x0b, 0x9f, + 0xd8, 0x70, 0x4a, 0x3b, 0xa7, 0x15, 0xd2, 0x67, 0x91, 0xf4, 0x2b, 0xec, 0x46, 0xa6, 0x1f, 0xf2, + 0xd9, 0xe4, 0xfb, 0xd1, 0x21, 0x1f, 0xc2, 0x62, 0xf2, 0x6c, 0x56, 0x5a, 0x79, 0x01, 0x5b, 0x79, + 0xf5, 0xe8, 0xb0, 0x72, 0x2e, 0x75, 0xbc, 0x67, 0x37, 0x34, 0x80, 0x1a, 0xf9, 0x1a, 0x2c, 0xe8, + 0xe7, 0xb3, 0xd2, 0x92, 0x81, 0x2d, 0xe1, 0xd6, 0x89, 0x0e, 0xf6, 0xec, 0x16, 0xfa, 0xd2, 0x20, + 0x21, 0x54, 0x32, 0x57, 0xb7, 0xd2, 0xcc, 0x8b, 0x71, 0x87, 0x52, 0xbb, 0x24, 0xbb, 0xb9, 0xe3, + 0x48, 0x92, 0x87, 0xf0, 0x7c, 0xd6, 0x31, 0xa1, 0x34, 0xfa, 0x52, 0xa4, 0x04, 0x7e, 0x2d, 0xfb, + 0xc8, 0xc9, 0x6e, 0xf9, 0x18, 0xb2, 0xe4, 0x2b, 0x70, 0x42, 0xd9, 0x5f, 0x4a, 0x7b, 0x2f, 0x63, + 0x7b, 0x18, 0x15, 0x40, 0xdd, 0x98, 0xd9, 0xad, 0x64, 0xd3, 0x20, 0x1d, 0x98, 0x93, 0x1d, 0x47, + 0x6d, 0xbb, 0x38, 0x7a, 0xce, 0x69, 0x5c, 0x35, 0x0d, 0xb1, 0x7c, 0x56, 0x70, 0xd5, 0x85, 0xd6, + 0xb6, 0xd5, 0x8d, 0x11, 0xd5, 0x95, 0x9e, 0x41, 0x97, 0xac, 0xc1, 0x58, 0xa3, 0xbe, 0x7e, 0xfd, + 0xfa, 0xea, 0xc2, 0x2b, 0xd8, 0x82, 0xf4, 0xfb, 0xe3, 0x85, 0xda, 0xa5, 0x49, 0xd8, 0x38, 0x76, + 0x9d, 0x9d, 0x1d, 0xed, 0xc1, 0x8a, 0x83, 0x92, 0x1f, 0x40, 0xeb, 0x42, 0xc6, 0x51, 0xab, 0x41, + 0xe0, 0xec, 0xba, 0x3c, 0x99, 0xc5, 0xab, 0xda, 0x7b, 0xbf, 0x4c, 0x6f, 0xb2, 0x82, 0x89, 0x63, + 0x53, 0xe0, 0x5c, 0xda, 0x64, 0xf7, 0x7f, 0xc1, 0xb9, 0x2d, 0x3b, 0x26, 0xa5, 0x32, 0xf1, 0x74, + 0x43, 0x6c, 0xdc, 0x76, 0x9d, 0xd0, 0xda, 0xeb, 0x69, 0xdd, 0x5f, 0x78, 0x4d, 0x0b, 0x26, 0xce, + 0xd3, 0xe9, 0x2a, 0xa3, 0xf6, 0x92, 0x68, 0xf0, 0x39, 0x7e, 0x5b, 0xee, 0x33, 0x72, 0xb3, 0xbb, + 0x09, 0xbc, 0x80, 0xfc, 0x70, 0x0e, 0x4e, 0xde, 0xf7, 0xfc, 0xfd, 0xb6, 0x67, 0xb7, 0x64, 0xaf, + 0x04, 0x0f, 0x7f, 0x7d, 0x10, 0x0f, 0xff, 0x6c, 0x8a, 0x87, 0x1b, 0x0f, 0x05, 0x19, 0x2b, 0xca, + 0x0e, 0x93, 0xe2, 0xe7, 0x7d, 0x9a, 0x22, 0x3f, 0x00, 0x67, 0xb3, 0x6b, 0x94, 0x45, 0x79, 0x11, + 0x17, 0xe5, 0x95, 0xa3, 0xc3, 0xca, 0xc5, 0x7e, 0x2d, 0x65, 0x2f, 0xd0, 0x63, 0x49, 0xdf, 0x1c, + 0x29, 0x9e, 0x2f, 0x5f, 0xb8, 0x39, 0x52, 0xbc, 0x50, 0x7e, 0xd5, 0x7c, 0xae, 0x51, 0xbd, 0xbd, + 0xb1, 0xde, 0x92, 0x87, 0xab, 0x4c, 0x60, 0xc3, 0x71, 0xcc, 0x73, 0x83, 0x6a, 0x63, 0x8a, 0xc6, + 0x5f, 0xcb, 0x41, 0xe5, 0x98, 0x45, 0xc2, 0xce, 0xb3, 0x78, 0x26, 0x1a, 0x51, 0xd2, 0x04, 0xee, + 0x18, 0x18, 0x55, 0x58, 0xba, 0xd9, 0x88, 0x8e, 0x82, 0x4e, 0xa3, 0x22, 0xf7, 0x9a, 0xe2, 0x3b, + 0x9c, 0xce, 0xb9, 0x26, 0xa1, 0x8c, 0x0d, 0x28, 0x27, 0x17, 0x0f, 0xf9, 0x3c, 0x4c, 0xa9, 0x99, + 0x9f, 0xa4, 0x2a, 0x81, 0x47, 0xcc, 0xf1, 0x77, 0xb5, 0x03, 0x51, 0x03, 0x34, 0x7e, 0x21, 0x07, + 0x73, 0x19, 0x3b, 0x8c, 0x9c, 0x83, 0x11, 0x4c, 0xcd, 0xaa, 0x58, 0x0d, 0x25, 0x52, 0xb2, 0x62, + 0x3d, 0xf9, 0x0c, 0x8c, 0xd7, 0xee, 0x34, 0x1a, 0xd5, 0x3b, 0x52, 0x19, 0xc1, 0x0f, 0x62, 0x37, + 0xb0, 0x02, 0x5b, 0x37, 0x36, 0x10, 0x60, 0xe4, 0x22, 0x8c, 0xad, 0xd7, 0x11, 0x41, 0x49, 0x0b, + 0xe3, 0x74, 0x93, 0xf0, 0x02, 0xc8, 0xf8, 0x89, 0x1c, 0x90, 0x34, 0xbb, 0x20, 0x57, 0x60, 0x52, + 0x65, 0x4a, 0xbc, 0xbf, 0xf8, 0x02, 0xab, 0x6c, 0x1c, 0x53, 0x85, 0x21, 0x35, 0x18, 0xbd, 0x6d, + 0x87, 0xcd, 0xbd, 0xc8, 0xca, 0x21, 0x73, 0x5b, 0x9c, 0x4a, 0x6d, 0x8b, 0xd1, 0x0e, 0xc3, 0x32, + 0x39, 0xb2, 0xf1, 0xc7, 0x39, 0x20, 0xd9, 0x06, 0x8f, 0x43, 0x59, 0x59, 0xbd, 0xa1, 0xc4, 0x9e, + 0x50, 0x2d, 0x1e, 0xa3, 0xcc, 0xb9, 0xaa, 0x1a, 0x20, 0x8e, 0x52, 0x71, 0x4e, 0x53, 0x3b, 0xf5, + 0x77, 0x58, 0xbe, 0x00, 0xa3, 0xf7, 0xa8, 0xbf, 0x2d, 0x6d, 0xc1, 0xd1, 0x7e, 0xf4, 0x01, 0x2b, + 0x50, 0xd5, 0x30, 0x08, 0xa1, 0x99, 0x5e, 0x8e, 0x0e, 0x6b, 0x7a, 0xf9, 0x07, 0x39, 0x98, 0xcf, + 0xba, 0xd8, 0x1c, 0xe3, 0x8c, 0x6c, 0x24, 0xfc, 0xa8, 0xd1, 0x2c, 0x8b, 0x5b, 0xa4, 0x46, 0xde, + 0xd3, 0x15, 0x18, 0x65, 0x23, 0x24, 0x97, 0x05, 0xea, 0xce, 0xd8, 0x10, 0x06, 0x26, 0x2f, 0x67, + 0x00, 0x71, 0x36, 0x8f, 0x51, 0x0e, 0xc0, 0x93, 0x78, 0xf0, 0x72, 0x06, 0x70, 0xdb, 0x6b, 0x51, + 0xa9, 0x53, 0x42, 0x80, 0x0e, 0x2b, 0x30, 0x79, 0x39, 0x39, 0x07, 0xe3, 0x77, 0xdd, 0x0d, 0x6a, + 0x3f, 0x90, 0x59, 0xc3, 0xd0, 0x8c, 0xcc, 0x73, 0xad, 0x36, 0x2b, 0x33, 0x65, 0xa5, 0xf1, 0xb3, + 0x39, 0x98, 0x4d, 0xdd, 0xa9, 0x8e, 0xf7, 0xb7, 0x1e, 0xec, 0x43, 0x38, 0x4c, 0xff, 0xf8, 0xe7, + 0x8f, 0x64, 0x7f, 0xbe, 0xf1, 0x5f, 0x8f, 0xc1, 0xa9, 0x3e, 0x2a, 0xae, 0xd8, 0xc7, 0x39, 0x77, + 0xac, 0x8f, 0xf3, 0x57, 0x61, 0x6a, 0xa5, 0x6d, 0x3b, 0x9d, 0x60, 0xd3, 0x8b, 0xbf, 0x38, 0x76, + 0x95, 0xc2, 0x3a, 0xe1, 0x71, 0x11, 0xf9, 0xd4, 0x9c, 0x6e, 0x22, 0x86, 0x15, 0x7a, 0x69, 0x09, + 0x5b, 0x23, 0x96, 0xf2, 0x32, 0x2e, 0xfc, 0x19, 0xf1, 0x32, 0xd6, 0xfd, 0xde, 0x46, 0x9e, 0xa8, + 0xdf, 0x5b, 0xb6, 0x75, 0xf9, 0xe8, 0xc7, 0xf1, 0x35, 0x58, 0x81, 0x29, 0x6e, 0x47, 0x57, 0x0d, + 0xf8, 0x24, 0x8d, 0xa5, 0x6c, 0xef, 0xec, 0x20, 0x3d, 0x17, 0x1a, 0x0e, 0x59, 0xd3, 0x7d, 0xb4, + 0xc6, 0xf1, 0xa1, 0xf9, 0x5c, 0x7f, 0x1f, 0x2c, 0x3d, 0xd0, 0x8f, 0xea, 0x8b, 0xf5, 0x4d, 0x98, + 0xcf, 0xba, 0x23, 0x2f, 0x14, 0x35, 0x13, 0xdd, 0xbe, 0xf6, 0xe0, 0xc3, 0xdf, 0xb4, 0xf7, 0x33, + 0x6f, 0xda, 0xd2, 0x77, 0x7e, 0xa2, 0xbf, 0xe3, 0x51, 0xbc, 0x17, 0x38, 0xec, 0x60, 0x0f, 0x7b, + 0xe3, 0xab, 0x89, 0xe0, 0x07, 0x49, 0x74, 0xf2, 0x96, 0x16, 0xa3, 0xea, 0x95, 0x74, 0x8c, 0xaa, + 0xec, 0x78, 0x07, 0x3c, 0x01, 0xd4, 0xcf, 0xe6, 0x75, 0x8f, 0xed, 0x3f, 0x8b, 0x1b, 0xf5, 0x02, + 0x8c, 0xde, 0xdf, 0xa3, 0xbe, 0x3c, 0x53, 0xf0, 0x43, 0x1e, 0xb2, 0x02, 0xf5, 0x43, 0x10, 0x82, + 0x5c, 0x87, 0xe9, 0x3a, 0x5f, 0xb8, 0x72, 0x35, 0x8e, 0xc4, 0x8a, 0x9a, 0xae, 0x50, 0x27, 0x66, + 0x2c, 0xc7, 0x04, 0x96, 0x71, 0x23, 0x31, 0xe8, 0x22, 0xc2, 0x16, 0xf7, 0xc1, 0xe2, 0x52, 0xc7, + 0x74, 0xec, 0x4b, 0x17, 0x33, 0x5b, 0x33, 0x51, 0x6a, 0xec, 0xc0, 0xf3, 0x03, 0x09, 0xb1, 0xc3, + 0x1e, 0xba, 0xd1, 0xaf, 0x84, 0xb9, 0xf6, 0x40, 0x54, 0x53, 0xc1, 0x33, 0xbe, 0x09, 0x25, 0x75, + 0x94, 0xf1, 0x08, 0x62, 0xbf, 0xc5, 0xaa, 0xe0, 0x47, 0x10, 0x2b, 0x30, 0x79, 0x79, 0xfc, 0x00, + 0x94, 0xcf, 0x7e, 0x00, 0x8a, 0xa7, 0xbf, 0x70, 0xdc, 0xf4, 0xb3, 0xc6, 0x91, 0xc3, 0x29, 0x8d, + 0xe3, 0x6f, 0xb5, 0x71, 0x8c, 0x7b, 0x65, 0xf2, 0xf2, 0x27, 0xda, 0xf8, 0x3f, 0x97, 0x09, 0x04, + 0xd1, 0xc5, 0x4b, 0x6e, 0xf7, 0x5c, 0x9c, 0x2b, 0x36, 0x6b, 0xf7, 0xc6, 0x90, 0xb1, 0x20, 0x92, + 0x3f, 0x56, 0x10, 0x79, 0x8c, 0x85, 0x88, 0xc2, 0x32, 0x9f, 0xd2, 0x91, 0x58, 0x78, 0xb4, 0x53, + 0x26, 0x32, 0x12, 0xca, 0xf8, 0x76, 0x0e, 0x4e, 0x64, 0x2a, 0xda, 0x59, 0xab, 0x5c, 0xa3, 0xaf, + 0xec, 0xc3, 0xa4, 0x3a, 0x9f, 0x43, 0x3c, 0x4e, 0xfc, 0x90, 0xe1, 0xfb, 0x62, 0xbc, 0x00, 0x13, + 0xd1, 0x33, 0x2f, 0x99, 0x97, 0x53, 0xc7, 0x03, 0x24, 0x8a, 0xd7, 0xc2, 0x06, 0x00, 0xfb, 0x82, + 0x27, 0x6a, 0x8f, 0x6d, 0xfc, 0xf3, 0x3c, 0x8c, 0x31, 0xaa, 0x4f, 0x6d, 0x28, 0xe7, 0x6c, 0x23, + 0x6a, 0xd6, 0xa5, 0xfe, 0x01, 0x9c, 0xc9, 0x2a, 0x8c, 0xf1, 0xe4, 0x77, 0xe2, 0xc9, 0x70, 0x4e, + 0x45, 0x93, 0x59, 0xf1, 0xa2, 0xc0, 0x17, 0x01, 0x96, 0x68, 0xaa, 0x05, 0x2c, 0x51, 0x6c, 0xb1, + 0x7f, 0x27, 0x07, 0x25, 0x15, 0x99, 0x7c, 0x19, 0xa6, 0x65, 0x78, 0x5a, 0x1e, 0x0c, 0x46, 0xbc, + 0x49, 0x4b, 0xfb, 0x31, 0x19, 0x9e, 0x56, 0x0d, 0x1e, 0xa3, 0xc1, 0xab, 0xac, 0xba, 0xab, 0x02, + 0x93, 0x16, 0x90, 0xce, 0x8e, 0x6d, 0x3d, 0xa4, 0xf6, 0x3e, 0x0d, 0x42, 0x8b, 0xdb, 0xf9, 0x88, + 0xa7, 0x6b, 0x49, 0xfe, 0xf6, 0xf5, 0x2a, 0x37, 0xf1, 0x61, 0x33, 0x21, 0xe2, 0x0c, 0xa7, 0x70, + 0xd4, 0xf7, 0xb8, 0xce, 0x8e, 0x7d, 0x9f, 0x57, 0x72, 0x3c, 0xe3, 0x0f, 0xc7, 0xf8, 0x72, 0x13, + 0xf1, 0xac, 0xb7, 0x61, 0xfa, 0xee, 0x7a, 0x6d, 0x45, 0xd1, 0xce, 0xeb, 0xe9, 0xd0, 0x56, 0x1f, + 0x85, 0xd4, 0x77, 0xed, 0xb6, 0xbc, 0x24, 0xc7, 0x47, 0x90, 0xe7, 0xb4, 0x9a, 0xd9, 0x9a, 0xfb, + 0x04, 0x45, 0xd6, 0x06, 0xbf, 0x8e, 0x47, 0x6d, 0xe4, 0x87, 0x6c, 0x23, 0xb0, 0x3b, 0xed, 0x3e, + 0x6d, 0xe8, 0x14, 0xc9, 0x1e, 0xde, 0x97, 0xf7, 0x7a, 0xdb, 0x4a, 0x2b, 0x85, 0xc1, 0xad, 0xbc, + 0x28, 0x5a, 0x79, 0x56, 0xe8, 0x62, 0x32, 0xdb, 0x49, 0x51, 0x8d, 0xf9, 0xc4, 0xc8, 0xb1, 0x7c, + 0xe2, 0xff, 0x9f, 0x83, 0x31, 0x2e, 0xbe, 0x8a, 0x65, 0xdc, 0x47, 0x40, 0xbe, 0xff, 0x64, 0x04, + 0xe4, 0x32, 0x9e, 0x13, 0xda, 0x82, 0xe6, 0x75, 0xa4, 0x96, 0xd8, 0x17, 0xd2, 0x85, 0x00, 0xdf, + 0xd9, 0x78, 0xcd, 0xf1, 0xdb, 0x82, 0xac, 0xc7, 0xa1, 0x48, 0xc6, 0x8f, 0xf5, 0x3f, 0x97, 0xe1, + 0x5b, 0xc6, 0x45, 0x28, 0x12, 0x3d, 0x00, 0xc9, 0x06, 0x4c, 0x88, 0x00, 0x27, 0xcb, 0x07, 0xe2, + 0x35, 0xbd, 0xac, 0xd9, 0x43, 0xb5, 0x96, 0x0f, 0x62, 0xd1, 0x5c, 0x84, 0x48, 0xb1, 0xb6, 0x55, + 0x5f, 0x82, 0x98, 0x00, 0xb9, 0xcb, 0x33, 0x9d, 0xf3, 0x78, 0xdf, 0x7a, 0x8a, 0x8f, 0xa8, 0x5c, + 0xc4, 0x7b, 0x93, 0x51, 0x12, 0x32, 0xc2, 0x7b, 0xc7, 0x34, 0xc8, 0x06, 0x94, 0xd1, 0x86, 0x8e, + 0xb6, 0xf8, 0xae, 0x59, 0xaf, 0xf1, 0x20, 0x1a, 0xc2, 0x0e, 0x3a, 0xe4, 0x75, 0x62, 0xbb, 0x25, + 0x3c, 0x3d, 0x53, 0x98, 0xc6, 0xcf, 0xe4, 0xa1, 0x9c, 0x5c, 0x7d, 0xe4, 0x6d, 0x98, 0x8c, 0xe2, + 0xad, 0x47, 0xbe, 0xe6, 0xf8, 0xaa, 0x16, 0x07, 0x68, 0xd7, 0xf3, 0x63, 0x2b, 0xe0, 0x64, 0x09, + 0x8a, 0x6c, 0x13, 0xbb, 0x71, 0xb8, 0x4c, 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, + 0xba, 0x68, 0x7e, 0x81, 0xb1, 0x3b, 0x6d, 0xad, 0x5a, 0x4f, 0x16, 0x9d, 0x81, 0x4d, 0x2e, 0xf2, + 0x63, 0x66, 0xbd, 0x26, 0x8c, 0x61, 0xf0, 0xa8, 0x46, 0x23, 0x2e, 0xed, 0xe3, 0x05, 0x90, 0xc2, + 0x59, 0x7f, 0x3f, 0x0f, 0x93, 0xca, 0xf2, 0x23, 0x17, 0xa0, 0xb8, 0x1e, 0x6c, 0x78, 0xcd, 0xfd, + 0x28, 0x7e, 0xe8, 0xd4, 0xd1, 0x61, 0x65, 0xc2, 0x09, 0xac, 0x36, 0x16, 0x9a, 0x51, 0x35, 0x59, + 0x86, 0x29, 0xfe, 0x97, 0x4c, 0x9c, 0x93, 0x8f, 0x15, 0x72, 0x1c, 0x58, 0xa6, 0xcc, 0x51, 0x99, + 0xad, 0x86, 0x42, 0x3e, 0x00, 0xe0, 0x05, 0x18, 0xbc, 0xa1, 0x30, 0x7c, 0xd8, 0x09, 0xd1, 0x40, + 0x46, 0xd8, 0x06, 0x85, 0x20, 0xf9, 0x3a, 0x0f, 0xe7, 0x2e, 0xb7, 0xcb, 0xc8, 0xf0, 0x71, 0x33, + 0x18, 0x7d, 0x2b, 0x3b, 0x7c, 0x8f, 0x4a, 0x52, 0xe4, 0xba, 0x5a, 0x94, 0x89, 0x4d, 0xab, 0x21, + 0x02, 0x2a, 0x10, 0xc6, 0xff, 0x9c, 0x53, 0x36, 0x19, 0xb9, 0x03, 0x13, 0xd1, 0x02, 0x12, 0x76, + 0x68, 0xd1, 0x15, 0x43, 0x96, 0x9b, 0x74, 0x67, 0xf9, 0x59, 0x61, 0x12, 0x37, 0x17, 0x2d, 0x43, + 0x6d, 0xcf, 0xc9, 0x42, 0xf2, 0x45, 0x18, 0xc1, 0xa1, 0xcb, 0x1f, 0xdb, 0x35, 0x79, 0xca, 0x8f, + 0xb0, 0x31, 0xc3, 0x8e, 0x20, 0x26, 0xf9, 0x8c, 0x70, 0x11, 0xe7, 0x83, 0x3f, 0xad, 0x1c, 0xd5, + 0xec, 0x3b, 0xa2, 0xe3, 0x3d, 0x8e, 0xe0, 0xa4, 0xac, 0x9e, 0xbf, 0x96, 0x87, 0x72, 0x72, 0x6b, + 0x93, 0xf7, 0xa0, 0x24, 0x8f, 0xdf, 0x35, 0x5b, 0x64, 0x7d, 0x29, 0x89, 0xac, 0x2b, 0xf2, 0x0c, + 0xde, 0xb3, 0x55, 0xbb, 0x35, 0x53, 0x43, 0x60, 0xb2, 0xd0, 0xa6, 0x08, 0x03, 0xa9, 0x6c, 0xaa, + 0xd0, 0x0b, 0xbb, 0x89, 0x28, 0xe2, 0x12, 0x8c, 0xbc, 0x01, 0x85, 0xdb, 0xd7, 0xab, 0xc2, 0x2b, + 0xb0, 0x9c, 0x3c, 0xa4, 0xb9, 0x79, 0xad, 0x6e, 0xec, 0xcb, 0xe0, 0xc9, 0x86, 0x12, 0x70, 0x7f, + 0x4c, 0xb3, 0x51, 0x94, 0xc5, 0x51, 0xe7, 0x8e, 0x8f, 0xbc, 0x7f, 0x73, 0xa4, 0x58, 0x28, 0x8f, + 0x88, 0x20, 0xcc, 0xff, 0xba, 0x00, 0x13, 0x51, 0xfb, 0x84, 0xa8, 0x0e, 0xda, 0xc2, 0x19, 0xfb, + 0x34, 0x14, 0xa5, 0x74, 0x27, 0x9c, 0x03, 0xc7, 0x03, 0x21, 0xd9, 0x2d, 0x80, 0x14, 0xe3, 0x38, + 0x57, 0x30, 0xe5, 0x4f, 0x72, 0x05, 0x22, 0x19, 0xad, 0x9f, 0x30, 0x37, 0xc2, 0x26, 0xcc, 0x8c, + 0xc0, 0xc8, 0x34, 0xe4, 0x1d, 0x1e, 0xd8, 0x6e, 0xc2, 0xcc, 0x3b, 0x2d, 0xf2, 0x1e, 0x14, 0xed, + 0x56, 0x0b, 0xb3, 0xd8, 0x0e, 0x91, 0x00, 0xb7, 0xc8, 0xa8, 0xf1, 0x33, 0x03, 0xb1, 0xaa, 0x21, + 0xa9, 0xc2, 0x04, 0x8f, 0x14, 0x1e, 0xd0, 0xd6, 0x10, 0x07, 0x50, 0x4c, 0x01, 0x03, 0x8c, 0x6f, + 0x05, 0xb4, 0x45, 0x5e, 0x81, 0x11, 0x36, 0x9b, 0xe2, 0xc4, 0x91, 0x42, 0x25, 0x9b, 0x4c, 0x3e, + 0x60, 0x6b, 0xcf, 0x98, 0x08, 0x40, 0x5e, 0x82, 0x42, 0x6f, 0x69, 0x47, 0x9c, 0x25, 0xe5, 0x38, + 0xf9, 0x45, 0x04, 0xc6, 0xaa, 0xc9, 0x55, 0x28, 0x3e, 0xd4, 0xf3, 0x26, 0x9c, 0x48, 0x4c, 0x63, + 0x04, 0x1f, 0x01, 0x92, 0x57, 0xa0, 0x10, 0x04, 0x9e, 0xb0, 0x82, 0x9a, 0x8b, 0x4c, 0x53, 0xef, + 0x46, 0xb3, 0xc6, 0xa8, 0x07, 0x81, 0xb7, 0x5c, 0x84, 0x31, 0x7e, 0xc0, 0x18, 0xcf, 0x03, 0xc4, + 0xdf, 0x98, 0x76, 0xf6, 0x34, 0x3e, 0x80, 0x89, 0xe8, 0xdb, 0xc8, 0x19, 0x80, 0x7d, 0x7a, 0x60, + 0xed, 0xd9, 0x6e, 0xab, 0xcd, 0xa5, 0xd3, 0x92, 0x39, 0xb1, 0x4f, 0x0f, 0xd6, 0xb0, 0x80, 0x9c, + 0x82, 0xf1, 0x2e, 0x9b, 0x7e, 0xb1, 0xc6, 0x4b, 0xe6, 0x58, 0xb7, 0xb7, 0xcd, 0x96, 0xf2, 0x02, + 0x8c, 0xa3, 0x9e, 0x55, 0xec, 0xc8, 0x29, 0x53, 0xfe, 0x34, 0xfe, 0xa8, 0x80, 0xe9, 0xc5, 0x94, + 0x0e, 0x91, 0x17, 0x61, 0xaa, 0xe9, 0x53, 0x3c, 0xcb, 0x6c, 0x26, 0xa1, 0x89, 0x76, 0x4a, 0x71, + 0xe1, 0x7a, 0x8b, 0x9c, 0x83, 0x99, 0x38, 0x13, 0xb4, 0xd5, 0xdc, 0x16, 0xf9, 0x50, 0x4a, 0xe6, + 0x54, 0x57, 0xe6, 0x83, 0x5e, 0xd9, 0xc6, 0xc8, 0x8d, 0x65, 0x35, 0xf0, 0x38, 0x1b, 0x11, 0xb1, + 0xfe, 0x66, 0x94, 0x72, 0x34, 0xe8, 0x3c, 0x09, 0x63, 0xb6, 0xbd, 0xdb, 0x73, 0x78, 0x84, 0xb5, + 0x92, 0x29, 0x7e, 0x91, 0xd7, 0x60, 0x36, 0x8e, 0xe4, 0x2f, 0xbb, 0x31, 0x8a, 0xdd, 0x28, 0x47, + 0x15, 0x2b, 0xbc, 0x9c, 0x5c, 0x04, 0xa2, 0xb6, 0xe7, 0x6d, 0x7f, 0x48, 0x9b, 0x7c, 0x4d, 0x96, + 0xcc, 0x59, 0xa5, 0xe6, 0x2e, 0x56, 0x90, 0x17, 0xa0, 0xe4, 0xd3, 0x00, 0xa5, 0x43, 0x1c, 0x36, + 0xcc, 0xbe, 0x69, 0x4e, 0xca, 0x32, 0x36, 0x76, 0xe7, 0xa1, 0xac, 0x0c, 0x07, 0xc6, 0x76, 0xe7, + 0xa9, 0x40, 0xcc, 0xe9, 0xb8, 0xdc, 0xec, 0xae, 0xb7, 0xc8, 0x97, 0x60, 0x51, 0x81, 0xe4, 0x89, + 0x40, 0x2d, 0xda, 0x76, 0x76, 0x9d, 0xed, 0x36, 0x15, 0xeb, 0x2d, 0xbd, 0xaa, 0xa3, 0x2b, 0xa4, + 0xb9, 0x10, 0x63, 0xf3, 0x14, 0xa1, 0xab, 0x02, 0x97, 0x6c, 0xc0, 0x7c, 0x82, 0x32, 0x6d, 0x59, + 0xbd, 0x6e, 0xdf, 0x90, 0x86, 0x31, 0x4d, 0xa2, 0xd3, 0xa4, 0xad, 0xad, 0xae, 0xf1, 0x4d, 0x28, + 0xa9, 0x6b, 0x92, 0x0d, 0x82, 0x2a, 0x97, 0x88, 0xd5, 0x37, 0x19, 0x95, 0xad, 0xb3, 0x7b, 0xe1, + 0x74, 0x0c, 0x82, 0x93, 0xc8, 0xd9, 0xcb, 0x54, 0x54, 0x8a, 0x53, 0xf8, 0x02, 0x94, 0x5a, 0x4e, + 0xd0, 0x6d, 0xdb, 0x07, 0x68, 0x96, 0x27, 0x66, 0x7a, 0x52, 0x94, 0xa1, 0xe2, 0x67, 0x19, 0x66, + 0x53, 0x7c, 0x50, 0x91, 0x34, 0x38, 0x5f, 0x1f, 0x2c, 0x69, 0x18, 0x2e, 0x94, 0xd4, 0x73, 0xed, + 0x98, 0xc4, 0x3d, 0x27, 0x31, 0xe0, 0x0f, 0x67, 0xfa, 0x63, 0x47, 0x87, 0x95, 0xbc, 0xd3, 0xc2, + 0x30, 0x3f, 0xe7, 0xa1, 0x28, 0x25, 0x36, 0x21, 0x28, 0xe1, 0x63, 0x82, 0x7c, 0xcf, 0x34, 0xa3, + 0x5a, 0xe3, 0x15, 0x18, 0x17, 0x47, 0xd7, 0xe0, 0x27, 0x04, 0xe3, 0x5b, 0x79, 0x98, 0x31, 0x29, + 0x63, 0xac, 0x94, 0x67, 0xeb, 0x7a, 0x6a, 0xaf, 0xe8, 0xd9, 0x11, 0x7c, 0xb5, 0xbe, 0x0d, 0xc8, + 0x93, 0xf5, 0x4b, 0x39, 0x98, 0xcb, 0x80, 0xfd, 0x48, 0x79, 0xa2, 0xaf, 0xc1, 0x44, 0xcd, 0xb1, + 0xdb, 0xd5, 0x56, 0x2b, 0x8a, 0xfe, 0x83, 0x72, 0x3e, 0x26, 0x93, 0xb3, 0x59, 0xa9, 0x2a, 0xc4, + 0x44, 0xa0, 0xe4, 0x55, 0xb1, 0x28, 0x0a, 0xd1, 0xb0, 0xe2, 0xa2, 0xf8, 0xde, 0x61, 0x05, 0xf8, + 0x37, 0x6d, 0x46, 0x4b, 0x04, 0xa3, 0x6a, 0xf3, 0xc2, 0xd8, 0x19, 0xeb, 0xa9, 0x9d, 0xba, 0xec, + 0xa8, 0xda, 0xc9, 0xee, 0x0d, 0x95, 0x2a, 0xeb, 0x27, 0xf3, 0x70, 0x32, 0x1b, 0xf1, 0xa3, 0xa6, + 0xfc, 0xc6, 0x24, 0x65, 0x4a, 0x26, 0x00, 0x4c, 0xf9, 0xcd, 0x33, 0x9a, 0x21, 0x7c, 0x0c, 0x40, + 0x76, 0x78, 0x6a, 0xfd, 0x35, 0x6a, 0xfb, 0xe1, 0x36, 0xb5, 0xc3, 0x21, 0x24, 0x79, 0x69, 0x82, + 0xb1, 0x80, 0xc2, 0xc4, 0x9e, 0xc4, 0xcc, 0xca, 0xac, 0x1f, 0x91, 0x8d, 0x16, 0xca, 0xc8, 0x10, + 0x0b, 0xe5, 0x1b, 0x30, 0xd3, 0xa0, 0x1d, 0xbb, 0xbb, 0xe7, 0xf9, 0x32, 0xc8, 0xc2, 0x25, 0x98, + 0x8a, 0x8a, 0x32, 0x57, 0x8b, 0x5e, 0xad, 0xc1, 0x2b, 0x03, 0x11, 0xb3, 0x12, 0xbd, 0xda, 0xf8, + 0xeb, 0x79, 0x38, 0x55, 0x6d, 0x0a, 0x7b, 0x52, 0x51, 0x21, 0xcd, 0xde, 0x3f, 0xe1, 0xb6, 0xc9, + 0x65, 0x98, 0xb8, 0x6d, 0x3f, 0xda, 0xa0, 0x76, 0x40, 0x03, 0x91, 0x66, 0x82, 0x8b, 0xbd, 0xf6, + 0xa3, 0xf8, 0xf1, 0xc7, 0x8c, 0x61, 0x54, 0x35, 0xc2, 0xc8, 0xc7, 0x54, 0x23, 0x18, 0x30, 0xb6, + 0xe6, 0xb5, 0x5b, 0xe2, 0xac, 0x17, 0x2f, 0xce, 0x7b, 0x58, 0x62, 0x8a, 0x1a, 0xe3, 0x0f, 0x72, + 0x30, 0x1d, 0x7d, 0x31, 0x7e, 0xc2, 0x27, 0x3e, 0x24, 0xe7, 0x60, 0x1c, 0x1b, 0x5a, 0xaf, 0xa9, + 0x87, 0x46, 0x9b, 0x62, 0xda, 0xcc, 0x96, 0x29, 0x2b, 0xd5, 0x91, 0x18, 0xfd, 0x78, 0x23, 0x61, + 0xfc, 0x7d, 0x7c, 0xcc, 0x56, 0x7b, 0xc9, 0x4e, 0x22, 0xe5, 0x43, 0x72, 0x43, 0x7e, 0x48, 0xfe, + 0x89, 0x4d, 0x49, 0xa1, 0xef, 0x94, 0xfc, 0x68, 0x1e, 0x26, 0xa3, 0x8f, 0xfd, 0x94, 0xa5, 0xa3, + 0x88, 0xfa, 0x35, 0x54, 0x60, 0xa4, 0x86, 0xc2, 0x2b, 0x44, 0xfc, 0xa1, 0x2f, 0xc2, 0x98, 0xd8, + 0x4c, 0xb9, 0x84, 0xf9, 0x77, 0x62, 0x76, 0x97, 0xa7, 0x05, 0xe9, 0x31, 0x9c, 0xd0, 0xc0, 0x14, + 0x78, 0x18, 0x79, 0xea, 0x3e, 0xdd, 0x16, 0xb6, 0x0d, 0x4f, 0xed, 0x19, 0x95, 0x1d, 0x79, 0x2a, + 0xee, 0xd8, 0x50, 0xa7, 0xd3, 0x7f, 0x5b, 0x84, 0x72, 0x12, 0xe5, 0xf8, 0x84, 0x1f, 0xf5, 0xde, + 0x36, 0xbf, 0xaa, 0xf0, 0x84, 0x1f, 0xdd, 0xde, 0xb6, 0xc9, 0xca, 0xd0, 0x5e, 0xca, 0x77, 0x1e, + 0x60, 0xaf, 0x4b, 0xc2, 0x5e, 0xca, 0x77, 0x1e, 0x68, 0xf6, 0x52, 0xbe, 0xf3, 0x00, 0x15, 0x09, + 0x1b, 0x0d, 0x8c, 0xca, 0x80, 0xf7, 0x14, 0xa1, 0x48, 0x68, 0x07, 0xc9, 0x2c, 0x86, 0x12, 0x8c, + 0x1d, 0x95, 0xcb, 0xd4, 0xf6, 0x45, 0x72, 0x0a, 0xc1, 0xce, 0xf0, 0xa8, 0xdc, 0xc6, 0x62, 0x2b, + 0x64, 0xe5, 0xa6, 0x0a, 0x44, 0xda, 0x40, 0x94, 0x9f, 0x72, 0x03, 0x1f, 0x7f, 0xb7, 0x96, 0xa6, + 0x9b, 0xf3, 0x2a, 0x69, 0x4b, 0xdd, 0xcd, 0x19, 0x74, 0x9f, 0xa4, 0xf6, 0xb7, 0x2e, 0x82, 0xd7, + 0xa2, 0x02, 0xa9, 0x78, 0x2c, 0x31, 0x19, 0x4d, 0x06, 0x78, 0x70, 0xdb, 0x48, 0x8d, 0x14, 0x13, + 0x21, 0xef, 0xc2, 0xa4, 0x1a, 0x6b, 0x83, 0x47, 0x84, 0x78, 0x8e, 0x47, 0xee, 0xec, 0x93, 0xf9, + 0x5a, 0x45, 0x20, 0xdb, 0x70, 0x6a, 0xc5, 0x73, 0x83, 0x5e, 0x47, 0xc6, 0x08, 0x8d, 0xe3, 0xad, + 0x03, 0x4e, 0x05, 0x3a, 0xee, 0x37, 0x05, 0x88, 0x08, 0xed, 0x20, 0x7d, 0x6b, 0xf4, 0x0b, 0x48, + 0x3f, 0x42, 0x64, 0x13, 0x26, 0x51, 0x83, 0x2a, 0xec, 0x24, 0x27, 0x75, 0xb6, 0x11, 0xd7, 0xd4, + 0xd8, 0xc6, 0xe0, 0xa1, 0xe6, 0xec, 0x4e, 0x5b, 0xba, 0x76, 0xa8, 0x9a, 0x60, 0x05, 0x98, 0x7c, + 0x00, 0xd3, 0xfc, 0x8a, 0x76, 0x9f, 0x6e, 0xf3, 0xb5, 0x53, 0xd2, 0x34, 0x11, 0x7a, 0x25, 0x7f, + 0xcc, 0x17, 0x7a, 0xeb, 0x87, 0x74, 0x9b, 0xcf, 0xbd, 0xe6, 0x58, 0xa5, 0xc1, 0x93, 0x2d, 0x98, + 0x5b, 0xb3, 0x03, 0x5e, 0xa8, 0x04, 0x4d, 0x98, 0x42, 0x0d, 0x2d, 0x1a, 0xbc, 0xef, 0xd9, 0x81, + 0x54, 0x84, 0x67, 0x06, 0x49, 0xc8, 0xc2, 0x27, 0xdf, 0xca, 0xc1, 0x82, 0xa6, 0x27, 0x17, 0x76, + 0x66, 0x18, 0x78, 0x76, 0x1a, 0x9f, 0xbc, 0x2a, 0x52, 0x28, 0xed, 0x03, 0xc6, 0xa7, 0x24, 0xa1, + 0x8a, 0xf7, 0xe3, 0x7a, 0xd5, 0x92, 0xbc, 0x1f, 0x0d, 0xb1, 0x51, 0x71, 0x4f, 0xcf, 0xe8, 0x1b, + 0x35, 0xb1, 0xaf, 0x25, 0x98, 0x71, 0x2d, 0x39, 0xde, 0x42, 0xd1, 0x95, 0x8b, 0x14, 0x5d, 0xf3, + 0x30, 0x8a, 0xa3, 0x2a, 0x43, 0x6f, 0xe1, 0x0f, 0xe3, 0x33, 0x2a, 0x1f, 0x12, 0x62, 0xe1, 0x40, + 0x3e, 0x64, 0xfc, 0xf7, 0x63, 0x30, 0x93, 0x58, 0x16, 0xe2, 0x9e, 0x9a, 0x4b, 0xdd, 0x53, 0x1b, + 0x00, 0x5c, 0xd5, 0x3b, 0xa4, 0x4e, 0x56, 0x7a, 0x6f, 0x4e, 0x0a, 0xdf, 0xeb, 0x68, 0x4f, 0x29, + 0x64, 0x18, 0x51, 0xbe, 0x63, 0x87, 0xd4, 0x91, 0x47, 0x44, 0xf9, 0xa6, 0x57, 0x88, 0xc6, 0x64, + 0x48, 0x05, 0x46, 0x31, 0x52, 0xaf, 0xea, 0x3c, 0xeb, 0xb0, 0x02, 0x93, 0x97, 0x93, 0x17, 0x61, + 0x8c, 0x09, 0x51, 0xeb, 0x35, 0xc1, 0x04, 0xf1, 0x6c, 0x61, 0x52, 0x16, 0x93, 0x58, 0x44, 0x15, + 0xb9, 0x06, 0x25, 0xfe, 0x97, 0x88, 0xcd, 0x33, 0xa6, 0x5b, 0x4c, 0x5a, 0x4e, 0x4b, 0x86, 0xe7, + 0xd1, 0xe0, 0xd8, 0xed, 0xa2, 0xd1, 0x43, 0xb5, 0xce, 0x7a, 0x4d, 0x04, 0xac, 0xc7, 0xdb, 0x45, + 0xc0, 0x0b, 0x59, 0x13, 0x31, 0x00, 0x93, 0x65, 0x84, 0x0b, 0x4b, 0x11, 0xef, 0x94, 0x28, 0xcb, + 0x70, 0xd7, 0x15, 0x53, 0xd4, 0x90, 0x0b, 0xfc, 0x25, 0x06, 0xc5, 0x42, 0x9e, 0xb5, 0x15, 0xdf, + 0x2d, 0x50, 0x31, 0x81, 0xb2, 0x61, 0x54, 0xcd, 0x1a, 0x67, 0x7f, 0xaf, 0x76, 0x6c, 0xa7, 0x2d, + 0xd8, 0x0a, 0x36, 0x8e, 0xb0, 0x94, 0x95, 0x9a, 0x31, 0x00, 0x79, 0x1b, 0xa6, 0x79, 0x76, 0xc5, + 0x4e, 0xc7, 0x73, 0x91, 0xfc, 0x64, 0x1c, 0x7d, 0x4f, 0x64, 0x7c, 0x64, 0x55, 0xbc, 0x95, 0x04, + 0x2c, 0x3b, 0x4f, 0xf0, 0x95, 0xb7, 0xc7, 0xdf, 0x88, 0x4a, 0xf1, 0x79, 0x82, 0xa8, 0x01, 0x2f, + 0x37, 0x55, 0x20, 0xf2, 0x26, 0x4c, 0xb1, 0x9f, 0x37, 0x9c, 0x07, 0x94, 0x37, 0x38, 0x15, 0x9b, + 0x37, 0x20, 0xd6, 0x2e, 0xab, 0xe1, 0xed, 0xe9, 0x90, 0xe4, 0x7d, 0x38, 0x81, 0x94, 0x9a, 0x5e, + 0x97, 0xb6, 0xaa, 0x3b, 0x3b, 0x4e, 0xdb, 0xe1, 0xd6, 0x68, 0x3c, 0x0a, 0x0d, 0xea, 0xe0, 0x79, + 0xc3, 0x08, 0x61, 0xd9, 0x31, 0x88, 0x99, 0x8d, 0x49, 0xee, 0x43, 0x79, 0xa5, 0x17, 0x84, 0x5e, + 0xa7, 0x1a, 0x86, 0xbe, 0xb3, 0xdd, 0x0b, 0x69, 0xb0, 0x30, 0xa3, 0xc5, 0x6a, 0x61, 0x9b, 0x23, + 0xaa, 0xe4, 0xfa, 0xa0, 0x26, 0x62, 0x58, 0x76, 0x84, 0x62, 0xa6, 0x88, 0x18, 0xff, 0x26, 0x07, + 0x53, 0x1a, 0x2a, 0x79, 0x03, 0x4a, 0xd7, 0x7d, 0x87, 0xba, 0xad, 0xf6, 0x81, 0x72, 0x51, 0xc5, + 0x5b, 0xcc, 0x8e, 0x28, 0xe7, 0xbd, 0xd6, 0xc0, 0x22, 0x3d, 0x4f, 0x3e, 0xd3, 0x54, 0xf4, 0x32, + 0xf7, 0xe1, 0x16, 0x0b, 0xb4, 0x10, 0x07, 0x8f, 0xc2, 0x05, 0x2a, 0x56, 0xa7, 0x02, 0x42, 0xde, + 0x81, 0x31, 0xfe, 0x1e, 0x2c, 0xec, 0x16, 0x4f, 0x67, 0x75, 0x93, 0xc7, 0x0b, 0xc0, 0x85, 0x88, + 0x46, 0x3f, 0x81, 0x29, 0x90, 0x8c, 0x9f, 0xcb, 0x01, 0x49, 0x83, 0x1e, 0xa3, 0xf7, 0x3a, 0xd6, + 0x98, 0xe8, 0x8b, 0xd1, 0x6e, 0x2c, 0x68, 0x3a, 0x73, 0xd6, 0x12, 0xaf, 0xe0, 0x03, 0x2f, 0x76, + 0x9d, 0xaa, 0x88, 0xe3, 0xd5, 0xc6, 0x8f, 0xe4, 0x01, 0x62, 0x68, 0xf2, 0x79, 0x9e, 0x9b, 0xee, + 0xfd, 0x9e, 0xdd, 0x76, 0x76, 0x1c, 0x3d, 0x42, 0x30, 0x12, 0xf9, 0x86, 0xac, 0x31, 0x75, 0x40, + 0xf2, 0x1e, 0xcc, 0x34, 0xea, 0x3a, 0xae, 0x62, 0x4b, 0x1f, 0x74, 0xad, 0x04, 0x7a, 0x12, 0x1a, + 0xed, 0x93, 0xd5, 0xd9, 0xe0, 0xf6, 0xc9, 0x7c, 0x22, 0x44, 0x0d, 0x63, 0x2c, 0x8d, 0xba, 0x70, + 0x17, 0x68, 0x45, 0xaf, 0x9a, 0xf8, 0x75, 0x41, 0xd7, 0xea, 0x0a, 0x3f, 0x02, 0xc6, 0x27, 0x34, + 0xb8, 0x78, 0x20, 0x47, 0xfb, 0xc4, 0x04, 0xf8, 0x79, 0x54, 0xfb, 0x75, 0xbc, 0x90, 0x0a, 0x6d, + 0xc7, 0x53, 0x7b, 0xef, 0x89, 0x8d, 0x09, 0x46, 0x35, 0x57, 0x67, 0xad, 0x77, 0xc2, 0x60, 0xe6, + 0x6a, 0x7c, 0x49, 0xe1, 0x66, 0x05, 0x19, 0x36, 0x36, 0x7f, 0x37, 0x07, 0x27, 0x32, 0x71, 0xc9, + 0x25, 0x80, 0x58, 0xa7, 0x24, 0x46, 0x09, 0x39, 0x66, 0x1c, 0x32, 0xc9, 0x54, 0x20, 0xc8, 0x57, + 0x93, 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, 0xfb, 0x50, 0x62, 0xbd, + 0x71, 0x9a, 0xc2, 0x57, 0x87, 0x1b, 0xbe, 0xbc, 0x9a, 0x72, 0x56, 0x15, 0xd4, 0x2e, 0xa9, 0xc0, + 0x3c, 0x7e, 0x28, 0xb2, 0x4e, 0x7c, 0x90, 0x68, 0xa6, 0xfd, 0x74, 0x34, 0xe2, 0x24, 0x80, 0xa9, + 0xda, 0x81, 0x6b, 0x77, 0xa2, 0xd6, 0xb8, 0x01, 0xcc, 0x6b, 0x7d, 0x5b, 0xd3, 0xa0, 0x79, 0x73, + 0xb1, 0x5b, 0x17, 0xaf, 0xcb, 0x88, 0x28, 0xa0, 0x61, 0x2d, 0xbe, 0x07, 0xb3, 0xa9, 0x8f, 0x7e, + 0xac, 0x50, 0xa6, 0xf7, 0x81, 0xa4, 0xbf, 0x23, 0x83, 0xc2, 0x6b, 0x7a, 0xa0, 0xdc, 0x13, 0xd1, + 0xe3, 0x75, 0xa7, 0x63, 0xbb, 0x2d, 0x6e, 0x4e, 0xb3, 0xa4, 0x06, 0x3a, 0xfd, 0xf9, 0xbc, 0xea, + 0x30, 0xfc, 0xb4, 0xef, 0xba, 0x2f, 0x6a, 0xb7, 0xe1, 0xe7, 0xfb, 0xcd, 0xe9, 0x50, 0x5a, 0x87, + 0xef, 0x16, 0xe0, 0x54, 0x1f, 0x4c, 0x72, 0x90, 0x5c, 0x44, 0x5c, 0x0b, 0x71, 0x65, 0x70, 0x83, + 0x4f, 0x62, 0x29, 0x91, 0xcf, 0xf3, 0x90, 0x21, 0x22, 0x91, 0x35, 0xbf, 0x7f, 0xa3, 0x1a, 0x7f, + 0x3f, 0x2a, 0x4d, 0xc6, 0x0a, 0xe1, 0xa5, 0xe4, 0x3d, 0x18, 0x45, 0x6f, 0xf1, 0x44, 0x4c, 0x48, + 0x06, 0x81, 0xe5, 0x4a, 0x54, 0x53, 0xf6, 0x53, 0x8b, 0x6a, 0xca, 0x0a, 0xc8, 0xe7, 0xa0, 0x50, + 0xbd, 0xdf, 0x10, 0xf3, 0x32, 0xad, 0xa2, 0xdf, 0x6f, 0xc4, 0xc9, 0x69, 0x6c, 0x2d, 0x8b, 0x0c, + 0xc3, 0x60, 0x88, 0x37, 0x56, 0xea, 0x62, 0x56, 0x54, 0xc4, 0x1b, 0x2b, 0xf5, 0x18, 0x71, 0xb7, + 0xa9, 0x45, 0xd8, 0xba, 0xb1, 0x52, 0xff, 0xe4, 0x96, 0xfd, 0x7f, 0x90, 0xe7, 0x71, 0x4e, 0x78, + 0xc7, 0xde, 0x83, 0x92, 0x16, 0xc8, 0x3c, 0x17, 0xcb, 0x63, 0x51, 0xa4, 0xfa, 0x84, 0xc5, 0x90, + 0x86, 0x20, 0xd3, 0x3c, 0xb1, 0xdf, 0x6a, 0x00, 0xf7, 0x28, 0xcd, 0x13, 0x52, 0x48, 0xba, 0x12, + 0xe9, 0x28, 0xe4, 0x2a, 0x14, 0x37, 0xa9, 0x6b, 0xbb, 0x61, 0xa4, 0x10, 0x45, 0xe3, 0xe2, 0x10, + 0xcb, 0x74, 0xa9, 0x21, 0x02, 0x44, 0x43, 0xd8, 0xde, 0x76, 0xd0, 0xf4, 0x1d, 0x8c, 0x87, 0x14, + 0x9d, 0xc5, 0xdc, 0x10, 0x56, 0xa9, 0xd1, 0x09, 0x24, 0x90, 0x8c, 0x9f, 0xcf, 0xc1, 0xb8, 0x98, + 0x48, 0x9e, 0x9e, 0x6f, 0x37, 0x3e, 0x4b, 0x84, 0xf3, 0xc0, 0xae, 0x93, 0x74, 0x1e, 0xd8, 0xe5, + 0x41, 0x87, 0x26, 0x84, 0x37, 0x5e, 0xf4, 0x34, 0x88, 0xab, 0x51, 0xfa, 0x8a, 0xea, 0xd9, 0xd7, + 0x22, 0xd0, 0x61, 0xbd, 0xb8, 0x8c, 0xbf, 0x29, 0xbe, 0xec, 0xc6, 0x4a, 0x9d, 0x2c, 0x41, 0x71, + 0xc3, 0xe3, 0xf1, 0xb3, 0xd4, 0x5c, 0xd3, 0x6d, 0x51, 0xa6, 0x0e, 0x90, 0x84, 0x63, 0xdf, 0x57, + 0xf7, 0x3d, 0x71, 0x97, 0x51, 0xbe, 0xaf, 0xcb, 0x0b, 0x13, 0xdf, 0x17, 0x81, 0x0e, 0xfd, 0x7d, + 0x34, 0x83, 0x49, 0xdc, 0xbb, 0x8a, 0xf9, 0x6f, 0x6e, 0xaa, 0xde, 0x71, 0xa2, 0x4a, 0x72, 0x8a, + 0xc5, 0x7e, 0x9c, 0xe2, 0xde, 0x55, 0x33, 0x03, 0x0b, 0xdf, 0xd5, 0xe2, 0xe2, 0x06, 0xf5, 0x1f, + 0x3c, 0xc5, 0x5c, 0x3a, 0xfb, 0x5d, 0x2d, 0xd9, 0xbd, 0xa1, 0x98, 0xf4, 0xef, 0xe4, 0xe1, 0x64, + 0x36, 0xa2, 0xda, 0x97, 0xdc, 0x80, 0xbe, 0x9c, 0x87, 0xe2, 0x9a, 0x17, 0x84, 0x8a, 0x91, 0x20, + 0xaa, 0xff, 0xf7, 0x44, 0x99, 0x19, 0xd5, 0xb2, 0x3b, 0x37, 0xfb, 0x3b, 0xda, 0x9e, 0x48, 0x0f, + 0xa3, 0x7b, 0xb0, 0x3b, 0x37, 0xaf, 0x22, 0x37, 0xa0, 0x68, 0x0a, 0x47, 0xab, 0xc4, 0xd0, 0xc8, + 0xe2, 0x48, 0x9a, 0x22, 0xbe, 0x28, 0xd1, 0xe2, 0xc9, 0x8b, 0x32, 0x52, 0x85, 0x71, 0x31, 0xfb, + 0x89, 0xa7, 0xe3, 0x8c, 0x25, 0xa3, 0xa7, 0x78, 0x90, 0x78, 0x8c, 0xa3, 0xe0, 0x23, 0xe0, 0x7a, + 0x4d, 0xfa, 0x4c, 0x21, 0x47, 0xe1, 0x8f, 0x84, 0xba, 0x3d, 0x66, 0x04, 0x68, 0x7c, 0x2b, 0x0f, + 0x20, 0xb5, 0x36, 0x4f, 0xed, 0x0a, 0xfb, 0x9c, 0xb6, 0xc2, 0x14, 0x7b, 0xa3, 0xe1, 0x73, 0x60, + 0xdf, 0x45, 0x73, 0x9e, 0xe1, 0x33, 0x60, 0x57, 0x60, 0x74, 0x33, 0x56, 0x68, 0x09, 0x97, 0x14, + 0x54, 0x47, 0xf3, 0x72, 0x63, 0x1b, 0xe6, 0x6f, 0xd0, 0x30, 0x56, 0x6f, 0xc9, 0xa7, 0xc7, 0xc1, + 0x64, 0x5f, 0x87, 0x09, 0x01, 0x1f, 0xf1, 0x2f, 0xae, 0x8b, 0x11, 0x01, 0x73, 0x50, 0x17, 0x23, + 0x01, 0x18, 0x37, 0xaa, 0xd1, 0x36, 0x0d, 0xe9, 0x27, 0xdb, 0x4c, 0x03, 0x08, 0xef, 0x0a, 0xf6, + 0x6c, 0xb8, 0x16, 0x8e, 0x1d, 0x9f, 0x7b, 0x70, 0x22, 0xfa, 0xf6, 0x27, 0x49, 0xf7, 0x32, 0xbb, + 0x52, 0x8a, 0xec, 0x08, 0x31, 0xc5, 0x01, 0xb6, 0x27, 0xbf, 0x97, 0x83, 0x45, 0x89, 0x71, 0xdf, + 0x89, 0x2c, 0x27, 0x87, 0x42, 0x26, 0x6f, 0xc3, 0xa4, 0x82, 0x23, 0xc2, 0xfb, 0xa3, 0x9e, 0xfa, + 0xa1, 0x13, 0xee, 0x59, 0x01, 0x2f, 0x57, 0xf5, 0xd4, 0x0a, 0x38, 0xd9, 0x86, 0xc5, 0x46, 0xf5, + 0xf6, 0xc6, 0x3d, 0xbb, 0xed, 0xb4, 0x90, 0x0d, 0xdc, 0xf1, 0xae, 0x7b, 0xed, 0xb6, 0xf7, 0x70, + 0xcb, 0xdc, 0x90, 0x39, 0x7a, 0x30, 0x2a, 0x08, 0x2a, 0xbd, 0x1f, 0x44, 0x60, 0x96, 0xeb, 0x59, + 0x3b, 0x08, 0x68, 0xf5, 0xfc, 0x76, 0x60, 0x0e, 0xa0, 0x62, 0xfc, 0xb3, 0x1c, 0x3c, 0x1b, 0x39, + 0x27, 0x65, 0xf4, 0x2f, 0xd1, 0x83, 0xdc, 0x93, 0xec, 0x41, 0xfe, 0x89, 0xf4, 0xe0, 0x4e, 0x3c, + 0x3f, 0xeb, 0x6e, 0xe4, 0x18, 0x2e, 0xbf, 0x9f, 0xa8, 0xf3, 0x23, 0x66, 0xe5, 0xb9, 0x94, 0xab, + 0xb9, 0xe2, 0x51, 0x6e, 0xbc, 0xa5, 0x0c, 0x48, 0x06, 0x41, 0x0d, 0x39, 0x97, 0x44, 0xfe, 0x56, + 0x1e, 0x66, 0xee, 0xae, 0xd7, 0x56, 0x22, 0x3b, 0xaa, 0x4f, 0x59, 0xae, 0x71, 0xad, 0x6f, 0xfd, + 0x39, 0xa7, 0xb1, 0x05, 0x73, 0x89, 0x61, 0x40, 0x21, 0xe8, 0x5d, 0xee, 0x3a, 0x13, 0x15, 0x4b, + 0x01, 0xe8, 0x64, 0x16, 0xf9, 0x7b, 0x57, 0xcd, 0x04, 0xb4, 0xf1, 0x7f, 0x40, 0x82, 0xae, 0x60, + 0xc6, 0xaf, 0xc3, 0xc4, 0x7a, 0x10, 0xf4, 0xa8, 0xbf, 0x65, 0x6e, 0xa8, 0x4a, 0x0f, 0x07, 0x0b, + 0xd9, 0x1a, 0x32, 0x63, 0x00, 0x72, 0x01, 0x8a, 0x22, 0x46, 0xbc, 0xe4, 0x6e, 0xa8, 0x7f, 0x8e, + 0x42, 0xcc, 0x9b, 0x51, 0x35, 0x79, 0x03, 0x4a, 0xfc, 0x6f, 0xbe, 0xa2, 0xc5, 0x80, 0xa3, 0x9a, + 0x53, 0x80, 0xf3, 0x1d, 0x60, 0x6a, 0x60, 0xe4, 0x55, 0x28, 0x54, 0x57, 0x4c, 0xa1, 0xd8, 0x12, + 0x12, 0xb0, 0x6f, 0x71, 0xed, 0xa3, 0x76, 0x1d, 0x5a, 0x31, 0x99, 0x1c, 0x2b, 0x63, 0x6d, 0x08, + 0x9d, 0x3c, 0xae, 0x00, 0xa9, 0x37, 0x4b, 0x1c, 0xcb, 0x58, 0x46, 0x2e, 0xc3, 0x78, 0x8d, 0x1b, + 0xff, 0x09, 0x8d, 0x3c, 0xcf, 0x49, 0xc9, 0x8b, 0xb4, 0xd8, 0x12, 0xbc, 0x88, 0x5c, 0x90, 0x59, + 0xed, 0x8a, 0xb1, 0x07, 0x4e, 0x9f, 0xd4, 0x75, 0xaf, 0xc3, 0x98, 0x88, 0xa4, 0x3e, 0xa1, 0xa4, + 0xae, 0x49, 0x46, 0x50, 0x17, 0x30, 0x69, 0x57, 0x5c, 0x78, 0x92, 0xae, 0xb8, 0xdb, 0x70, 0xea, + 0x06, 0xea, 0xa1, 0xf4, 0x78, 0x60, 0x5b, 0xe6, 0xba, 0xd0, 0xec, 0xe3, 0x83, 0x16, 0x57, 0x55, + 0x25, 0x43, 0x8a, 0x59, 0x3d, 0x5f, 0x4d, 0xb1, 0xdc, 0x8f, 0x10, 0xf9, 0x12, 0xcc, 0x67, 0x55, + 0x09, 0xfd, 0x3f, 0x46, 0xbe, 0xca, 0x6e, 0x40, 0x8d, 0x7c, 0x95, 0x45, 0x81, 0x6c, 0x40, 0x99, + 0x97, 0x57, 0x5b, 0x1d, 0xc7, 0xe5, 0x6f, 0x18, 0xfc, 0x7d, 0x00, 0x5d, 0x62, 0x04, 0x55, 0x9b, + 0x55, 0xf2, 0xb7, 0x0c, 0xcd, 0x89, 0x2a, 0x81, 0x49, 0xfe, 0x4a, 0x8e, 0xdd, 0x4b, 0x79, 0xdc, + 0x71, 0x64, 0x9f, 0xd3, 0xe2, 0x35, 0x34, 0xf2, 0x6a, 0x6a, 0x84, 0xbe, 0xe3, 0xee, 0x0a, 0x07, + 0xa9, 0x4d, 0xe1, 0x20, 0xf5, 0xf6, 0x47, 0x72, 0x90, 0xe2, 0xa4, 0x82, 0xa3, 0xc3, 0x4a, 0xc9, + 0x17, 0x6d, 0xe2, 0x2e, 0xd2, 0xbe, 0x80, 0x0d, 0x1d, 0x7a, 0x09, 0x6f, 0xb9, 0x3c, 0xea, 0x31, + 0x6d, 0xf1, 0x4e, 0xce, 0x20, 0x63, 0xc7, 0xa1, 0xb3, 0x39, 0x13, 0x8f, 0x00, 0x52, 0x1d, 0xcd, + 0xa4, 0xc0, 0xae, 0xd0, 0xd2, 0x09, 0x87, 0xfb, 0x15, 0x97, 0xe3, 0x2b, 0xb4, 0xf4, 0xd8, 0xb1, + 0x70, 0x19, 0xa9, 0x8b, 0x47, 0x43, 0x21, 0x97, 0x61, 0xec, 0xb6, 0xfd, 0xa8, 0xba, 0x4b, 0x45, + 0x0e, 0xd6, 0x29, 0xc9, 0xfe, 0xb0, 0x70, 0xb9, 0xf8, 0xbb, 0xdc, 0x6b, 0xe3, 0x19, 0x53, 0x80, + 0x91, 0x1f, 0xcc, 0xc1, 0x49, 0xbe, 0x8d, 0x65, 0x2f, 0x1b, 0x34, 0x0c, 0xd9, 0x38, 0x88, 0xf0, + 0x89, 0x67, 0x63, 0xd3, 0xf3, 0x6c, 0x38, 0x8c, 0x21, 0x60, 0x08, 0xce, 0x10, 0x0d, 0x5c, 0x20, + 0x6a, 0xb5, 0x38, 0xd4, 0x99, 0xf8, 0x64, 0x13, 0x26, 0x6f, 0x5f, 0xaf, 0x46, 0xcd, 0xf2, 0xe0, + 0xf4, 0x95, 0x2c, 0xee, 0xa8, 0x80, 0x65, 0xf9, 0x4c, 0xa8, 0x64, 0x50, 0xf4, 0xbf, 0xb5, 0xb2, + 0x8a, 0x6e, 0xfb, 0xf3, 0xb1, 0x32, 0xa1, 0xbb, 0xdf, 0xa4, 0xc9, 0x00, 0xd9, 0x11, 0xa0, 0x70, + 0x8e, 0xf8, 0x9c, 0x1c, 0x44, 0x72, 0x51, 0xf5, 0xc4, 0x2d, 0x20, 0x85, 0xf1, 0x8e, 0xfd, 0xc8, + 0xb2, 0x77, 0xa9, 0x66, 0x24, 0x20, 0x94, 0xf7, 0x3f, 0x9b, 0x83, 0xd3, 0x7d, 0xc7, 0x89, 0x5c, + 0x83, 0x53, 0x36, 0xf7, 0x2f, 0xb7, 0xf6, 0xc2, 0xb0, 0x1b, 0x58, 0xf2, 0x86, 0x25, 0x7c, 0x77, + 0xcd, 0x13, 0xa2, 0x7a, 0x8d, 0xd5, 0xca, 0x4b, 0x57, 0x40, 0xde, 0x83, 0xe7, 0x1c, 0x37, 0xa0, + 0xcd, 0x9e, 0x4f, 0x2d, 0x49, 0xa0, 0xe9, 0xb4, 0x7c, 0xcb, 0xb7, 0xdd, 0x5d, 0xe9, 0x88, 0x6c, + 0x9e, 0x96, 0x30, 0xc2, 0x87, 0x7d, 0xc5, 0x69, 0xf9, 0x26, 0x02, 0x18, 0xff, 0x26, 0x07, 0x0b, + 0xfd, 0xc6, 0x91, 0x2c, 0xc0, 0x38, 0x55, 0x72, 0xdb, 0x14, 0x4d, 0xf9, 0x93, 0x3c, 0x0b, 0xf1, + 0xf1, 0x20, 0x44, 0x86, 0x62, 0x53, 0xe4, 0x19, 0x41, 0xcb, 0x7e, 0xf5, 0x30, 0x10, 0xf6, 0xd9, + 0xa5, 0xa6, 0x7a, 0x24, 0x9c, 0x01, 0x88, 0xcf, 0x00, 0xae, 0x97, 0x31, 0x27, 0xec, 0xa6, 0xcf, + 0xb7, 0x2b, 0x39, 0x09, 0x63, 0x9c, 0xc7, 0x0a, 0xf7, 0x0f, 0xf1, 0x8b, 0x1d, 0xf6, 0x62, 0x90, + 0xf1, 0x70, 0x28, 0x2c, 0x97, 0xb4, 0xc1, 0x1e, 0xeb, 0xe0, 0xe4, 0x18, 0xbf, 0x56, 0xe2, 0x72, + 0x47, 0xb5, 0x17, 0xee, 0x49, 0x49, 0x65, 0x29, 0xcb, 0x5d, 0x8e, 0x9b, 0x92, 0x2a, 0x66, 0xe9, + 0xba, 0x93, 0x9c, 0x7c, 0xfa, 0xca, 0x67, 0x3e, 0x7d, 0xbd, 0x0e, 0x13, 0x2b, 0x7b, 0xb4, 0xb9, + 0x1f, 0xf9, 0x20, 0x15, 0xc5, 0xdb, 0x02, 0x2b, 0xe4, 0x61, 0xe4, 0x63, 0x00, 0x72, 0x19, 0x00, + 0xbd, 0x74, 0xb9, 0x40, 0xae, 0xa4, 0x82, 0x41, 0xa7, 0x5e, 0x61, 0x9d, 0xa3, 0x80, 0x20, 0xf9, + 0x86, 0x79, 0x5d, 0x35, 0xe7, 0xe1, 0xe4, 0x03, 0x7f, 0x47, 0x80, 0xc7, 0x00, 0xac, 0x7b, 0x0a, + 0x33, 0x12, 0x47, 0x67, 0x39, 0xc5, 0xb1, 0x54, 0x20, 0xf2, 0x39, 0x18, 0x5f, 0xa1, 0x7e, 0xb8, + 0xb9, 0xb9, 0x81, 0x36, 0x34, 0x3c, 0x03, 0x4a, 0x11, 0xb3, 0x55, 0x84, 0x61, 0xfb, 0x7b, 0x87, + 0x95, 0xa9, 0xd0, 0xe9, 0xd0, 0x28, 0xb2, 0xbb, 0x29, 0xa1, 0xc9, 0x32, 0x94, 0xf9, 0x2b, 0x7f, + 0x7c, 0x95, 0xc2, 0xe3, 0xb1, 0xc8, 0x0f, 0x6b, 0x61, 0x12, 0xf0, 0x90, 0x6e, 0x47, 0xb9, 0x3a, + 0x52, 0xf0, 0x64, 0x55, 0xa6, 0xb8, 0x51, 0x3f, 0x1b, 0xe2, 0xed, 0x98, 0x64, 0x1b, 0xec, 0xeb, + 0xd3, 0x18, 0xa4, 0x0a, 0x53, 0x2b, 0x5e, 0xa7, 0x6b, 0x87, 0x0e, 0x26, 0x10, 0x3d, 0x10, 0x27, + 0x21, 0xea, 0x27, 0x9b, 0x6a, 0x85, 0x76, 0xac, 0xaa, 0x15, 0xe4, 0x3a, 0x4c, 0x9b, 0x5e, 0x8f, + 0x0d, 0xbb, 0x54, 0x2a, 0xf0, 0xc3, 0x0e, 0x2d, 0x5d, 0x7c, 0x56, 0xc3, 0xce, 0x66, 0xa1, 0x41, + 0xd0, 0xa2, 0xe0, 0x6a, 0x58, 0xe4, 0x4e, 0xc6, 0xeb, 0x8e, 0x7a, 0xc2, 0xa9, 0x19, 0x3b, 0x52, + 0xc4, 0x32, 0x1e, 0x86, 0xae, 0xc2, 0x64, 0xa3, 0x71, 0x77, 0x93, 0x06, 0xe1, 0xf5, 0xb6, 0xf7, + 0x10, 0x0f, 0xb8, 0xa2, 0x48, 0x30, 0x17, 0x78, 0x56, 0x48, 0x83, 0xd0, 0xda, 0x69, 0x7b, 0x0f, + 0x4d, 0x15, 0x8a, 0x7c, 0x8d, 0x8d, 0x87, 0x22, 0x0e, 0x8a, 0x78, 0xbf, 0x83, 0x24, 0x56, 0x3c, + 0x46, 0xe2, 0x4d, 0xc0, 0xe4, 0x56, 0x7d, 0xb0, 0x14, 0x70, 0x74, 0x91, 0xf3, 0xbd, 0x47, 0x07, + 0xd5, 0x56, 0xcb, 0xa7, 0x41, 0x20, 0x4e, 0x22, 0xee, 0x22, 0x87, 0xba, 0x13, 0x9b, 0x57, 0x68, + 0x2e, 0x72, 0x0a, 0x02, 0x59, 0x61, 0x22, 0x12, 0x9b, 0x45, 0xb4, 0xbd, 0x5a, 0xaf, 0xe3, 0x61, + 0x22, 0x94, 0xb2, 0x62, 0xce, 0xb9, 0x95, 0x96, 0xd3, 0xd5, 0x25, 0x21, 0x05, 0x87, 0xac, 0xc3, + 0x0c, 0x2f, 0x60, 0x5b, 0x8b, 0xa7, 0x97, 0x9a, 0x8b, 0x13, 0x5c, 0x08, 0x32, 0x68, 0x2e, 0x80, + 0x29, 0xa6, 0xd4, 0xa0, 0xb0, 0x09, 0x3c, 0xf2, 0x1e, 0x4c, 0x63, 0xec, 0xfe, 0xc8, 0xcf, 0x08, + 0xcf, 0x84, 0x12, 0x8f, 0x6d, 0x2b, 0x6a, 0x12, 0xce, 0x7b, 0xa5, 0x20, 0xd8, 0xab, 0x4b, 0x07, + 0x24, 0x46, 0x00, 0xcd, 0x7d, 0x62, 0x02, 0x27, 0x62, 0x02, 0xa2, 0x26, 0x49, 0x20, 0x6c, 0x07, + 0x31, 0x81, 0x9f, 0xc9, 0xc1, 0x69, 0xd6, 0x90, 0xea, 0x52, 0x84, 0x4c, 0x01, 0x6d, 0x99, 0x78, + 0xde, 0x91, 0x8b, 0x97, 0xa4, 0x7c, 0x72, 0x49, 0x01, 0xbb, 0xf4, 0xe0, 0xca, 0xa5, 0x6a, 0xfc, + 0xb3, 0x21, 0x91, 0x78, 0xb4, 0xcf, 0xbe, 0x34, 0x55, 0x39, 0x30, 0x08, 0xf6, 0xb2, 0x28, 0xe0, + 0x47, 0xb1, 0x8f, 0xcf, 0xfe, 0xa8, 0x53, 0x1f, 0xf9, 0xa3, 0xfa, 0xd2, 0x54, 0x3f, 0x2a, 0x6c, + 0x07, 0x99, 0x1f, 0x75, 0x0d, 0xa6, 0xf0, 0x94, 0x16, 0xd2, 0x91, 0x2f, 0xb2, 0x9a, 0xe0, 0x9e, + 0xd0, 0x2a, 0xcc, 0x12, 0xfb, 0x79, 0x4f, 0xfc, 0xba, 0x39, 0x52, 0x1c, 0x2f, 0x17, 0x6f, 0x8e, + 0x14, 0x67, 0xcb, 0xc4, 0x9c, 0x88, 0x06, 0xde, 0x3c, 0x91, 0xf9, 0x21, 0x78, 0x6b, 0x65, 0x37, + 0xec, 0xf8, 0xea, 0xf5, 0xe9, 0xf2, 0xaf, 0xd1, 0xfa, 0x36, 0xc0, 0xbf, 0x66, 0x8b, 0xbb, 0x7b, + 0x2b, 0xc3, 0x20, 0x6f, 0xad, 0x5a, 0x71, 0xf2, 0xd6, 0x9a, 0xc0, 0x31, 0x13, 0xd0, 0xc6, 0xb7, + 0x26, 0x13, 0x74, 0x85, 0x4d, 0xad, 0x01, 0x63, 0xfc, 0x52, 0x2a, 0x06, 0x19, 0x8d, 0x2b, 0xf8, + 0x95, 0xd5, 0x14, 0x35, 0xe4, 0x34, 0x14, 0x1a, 0x8d, 0xbb, 0x62, 0x90, 0xd1, 0xb2, 0x36, 0x08, + 0x3c, 0x93, 0x95, 0xb1, 0x19, 0x42, 0x73, 0x59, 0x25, 0xe3, 0x02, 0x3b, 0xc9, 0x4c, 0x2c, 0x65, + 0xe3, 0x2d, 0xaf, 0x88, 0x23, 0xf1, 0x78, 0x8b, 0x2b, 0x62, 0x7c, 0x31, 0x5c, 0x81, 0x85, 0x6a, + 0x10, 0x50, 0x9f, 0xad, 0x08, 0x61, 0x85, 0xe9, 0x8b, 0x6b, 0x8c, 0x38, 0x82, 0xb1, 0x51, 0xbb, + 0x19, 0x98, 0x7d, 0x01, 0xc9, 0x79, 0x28, 0x56, 0x7b, 0x2d, 0x87, 0xba, 0x4d, 0x2d, 0x7e, 0x9c, + 0x2d, 0xca, 0xcc, 0xa8, 0x96, 0xbc, 0x0f, 0x27, 0x12, 0xf1, 0x25, 0xc5, 0x08, 0x8c, 0xc7, 0x5c, + 0x55, 0x5e, 0xb3, 0x62, 0xcb, 0x11, 0x3e, 0x24, 0xd9, 0x98, 0xa4, 0x0a, 0xe5, 0x55, 0xf4, 0x27, + 0xab, 0x51, 0xfe, 0x88, 0xe5, 0xf9, 0xdc, 0x91, 0x90, 0x5f, 0x8a, 0x45, 0x14, 0xcd, 0x56, 0x54, + 0x69, 0xa6, 0xc0, 0xc9, 0x2d, 0x98, 0x4b, 0x96, 0xb1, 0xb3, 0x99, 0xdf, 0x7f, 0x91, 0xab, 0xa5, + 0xa8, 0xe0, 0xe9, 0x9c, 0x85, 0x45, 0xb6, 0x61, 0x36, 0xb6, 0x9c, 0xd2, 0x6f, 0xc5, 0xd2, 0x20, + 0x3b, 0xaa, 0x97, 0x37, 0xe3, 0x67, 0xc5, 0x62, 0x9c, 0x8b, 0xad, 0xb0, 0xa2, 0xdb, 0xb1, 0x99, + 0x26, 0x47, 0x5a, 0x30, 0xdd, 0x70, 0x76, 0x5d, 0xc7, 0xdd, 0xbd, 0x45, 0x0f, 0xea, 0xb6, 0xe3, + 0x0b, 0xd3, 0x58, 0x69, 0xf8, 0x5e, 0x0d, 0x0e, 0x3a, 0x1d, 0x1a, 0xfa, 0xb8, 0xeb, 0x59, 0x3d, + 0x3a, 0xcb, 0xb3, 0xdb, 0xce, 0x62, 0xc0, 0xf1, 0xd0, 0xbf, 0xb4, 0x6b, 0x3b, 0xda, 0xf1, 0xae, + 0xd3, 0xd4, 0x34, 0x13, 0xa5, 0x21, 0x35, 0x13, 0x6d, 0x98, 0x5d, 0x75, 0x9b, 0xfe, 0x01, 0xbe, + 0x25, 0xca, 0x8f, 0x9b, 0x3a, 0xe6, 0xe3, 0x5e, 0x12, 0x1f, 0xf7, 0x9c, 0x2d, 0x57, 0x58, 0xd6, + 0xe7, 0xa5, 0x09, 0x93, 0x06, 0xcc, 0xa2, 0x88, 0xbf, 0x5e, 0xab, 0xaf, 0xbb, 0x4e, 0xe8, 0xd8, + 0x21, 0x6d, 0x09, 0xb1, 0x21, 0xca, 0x53, 0xc3, 0x6f, 0xa0, 0x4e, 0xab, 0x6b, 0x39, 0x12, 0x44, + 0x25, 0x9a, 0xc2, 0x1f, 0x74, 0x0d, 0x9c, 0xf9, 0x53, 0xba, 0x06, 0xae, 0xc3, 0x4c, 0x32, 0xe6, + 0x44, 0x39, 0x3e, 0xed, 0x03, 0xac, 0x62, 0x42, 0x83, 0xd7, 0x43, 0x31, 0x51, 0x4b, 0x0d, 0x9b, + 0x88, 0x36, 0x91, 0xb8, 0x51, 0xce, 0x6a, 0x37, 0x4a, 0x8d, 0x2b, 0x3d, 0xce, 0x8d, 0xb2, 0x0e, + 0x70, 0xdd, 0xf3, 0x9b, 0xb4, 0x8a, 0x8e, 0xdc, 0x44, 0xcb, 0xe6, 0xc5, 0x88, 0xc6, 0x95, 0x7c, + 0xff, 0xec, 0xb0, 0xdf, 0x56, 0xd2, 0x1f, 0x5f, 0xa1, 0x41, 0x6c, 0x38, 0x55, 0xf7, 0xe9, 0x0e, + 0xf5, 0x7d, 0xda, 0x12, 0x37, 0x98, 0x65, 0xc7, 0x6d, 0xc9, 0x14, 0x6d, 0x22, 0x9e, 0x77, 0x57, + 0x82, 0x44, 0x86, 0xe4, 0xdb, 0x1c, 0x48, 0x3d, 0x4c, 0xfb, 0xd0, 0x31, 0x7e, 0x3c, 0x0f, 0x0b, + 0xfd, 0x7a, 0x3c, 0xe0, 0xee, 0xf7, 0x1a, 0xa4, 0x99, 0x88, 0xb8, 0x03, 0x96, 0x69, 0x92, 0x95, + 0x2c, 0x41, 0x36, 0xaf, 0x10, 0x77, 0xc2, 0xb9, 0x24, 0xc2, 0x96, 0xdf, 0x26, 0xd7, 0x60, 0x52, + 0x19, 0x1f, 0x64, 0xd7, 0xfd, 0x46, 0xd3, 0x84, 0x9d, 0x78, 0xc8, 0x4e, 0x82, 0x38, 0x2d, 0xe4, + 0x9d, 0x91, 0xff, 0x22, 0x65, 0xee, 0x2e, 0x3f, 0xc6, 0x2d, 0x22, 0x82, 0xc0, 0x23, 0x04, 0xf0, + 0x68, 0xe0, 0x5c, 0xd6, 0xc4, 0xbf, 0x8d, 0x5f, 0x2c, 0xf1, 0x43, 0x5f, 0xbd, 0x32, 0xf6, 0xb3, + 0x95, 0x4e, 0x5c, 0x25, 0xf3, 0x8f, 0x73, 0x95, 0x2c, 0x1c, 0x7f, 0x95, 0x1c, 0x39, 0xee, 0x2a, + 0x99, 0xb8, 0xeb, 0x8d, 0x3e, 0xe6, 0x5d, 0x6f, 0xfc, 0xb1, 0xee, 0x7a, 0xda, 0x35, 0xb4, 0x78, + 0xdc, 0x35, 0xf4, 0xcf, 0x6f, 0x86, 0x4f, 0xeb, 0xcd, 0x30, 0x4b, 0x2a, 0x7c, 0xac, 0x9b, 0x61, + 0xea, 0x62, 0x37, 0xfb, 0x64, 0x2e, 0x76, 0xe4, 0x89, 0x5d, 0xec, 0xe6, 0x3e, 0xee, 0xc5, 0x6e, + 0xfe, 0x49, 0x5e, 0xec, 0x4e, 0xfc, 0x59, 0xbc, 0xd8, 0x9d, 0xfc, 0xf7, 0x73, 0xb1, 0xbb, 0x0a, + 0xc5, 0xba, 0x17, 0x84, 0xd7, 0x3d, 0xbf, 0x83, 0x77, 0xcb, 0x92, 0x50, 0xc9, 0x7a, 0x01, 0xcf, + 0x92, 0xac, 0x09, 0x57, 0x02, 0x90, 0x2c, 0xcb, 0x05, 0x27, 0x6f, 0x52, 0x0b, 0xb1, 0x56, 0x5c, + 0xac, 0x14, 0x71, 0xa1, 0x4a, 0xaf, 0x37, 0x81, 0x72, 0x73, 0xa4, 0x38, 0x56, 0x1e, 0xbf, 0x39, + 0x52, 0x2c, 0x97, 0x67, 0x87, 0xb8, 0x19, 0xfe, 0x05, 0x28, 0x27, 0x85, 0xd5, 0xe3, 0xc3, 0x3d, + 0x3f, 0xb1, 0x58, 0x9b, 0x4c, 0x94, 0x4e, 0x0a, 0x8b, 0xe4, 0x32, 0x40, 0xdd, 0x77, 0x1e, 0xd8, + 0x21, 0xbd, 0x25, 0xcd, 0xfe, 0x44, 0x7c, 0x73, 0x5e, 0xca, 0x16, 0xa8, 0xa9, 0x80, 0x44, 0xf7, + 0xa4, 0x7c, 0xd6, 0x3d, 0xc9, 0xf8, 0xb1, 0x3c, 0xcc, 0xf2, 0x80, 0x75, 0x4f, 0xff, 0x9b, 0xed, + 0xbb, 0xda, 0xed, 0xf7, 0xb9, 0x38, 0xa3, 0x82, 0xda, 0xbb, 0x01, 0xaf, 0xb6, 0x1f, 0xc0, 0x89, + 0xd4, 0x50, 0xe0, 0x0d, 0xb8, 0x26, 0x43, 0x05, 0xa6, 0xee, 0xc0, 0x0b, 0xd9, 0x8d, 0xdc, 0xbb, + 0x6a, 0xa6, 0x30, 0x8c, 0x3f, 0x1a, 0x49, 0xd1, 0x17, 0xef, 0xb7, 0xea, 0x8b, 0x6c, 0xee, 0xf1, + 0x5e, 0x64, 0xf3, 0xc3, 0xbd, 0xc8, 0x26, 0x24, 0x88, 0xc2, 0x30, 0x12, 0xc4, 0xfb, 0x30, 0xb5, + 0x49, 0xed, 0x4e, 0xb0, 0xe9, 0x89, 0xf4, 0x5c, 0xdc, 0xc9, 0x44, 0x46, 0x02, 0x64, 0x75, 0xf2, + 0x02, 0x17, 0x19, 0xcb, 0x86, 0x0c, 0x81, 0x9d, 0x91, 0x3c, 0x5f, 0x97, 0xa9, 0x53, 0x50, 0x6f, + 0xe5, 0xa3, 0x03, 0x6e, 0xe5, 0x0d, 0x28, 0x09, 0xbc, 0x38, 0xc6, 0x75, 0x7c, 0x7d, 0x64, 0x55, + 0x58, 0x2e, 0x5b, 0x97, 0xde, 0x9e, 0xd3, 0x51, 0xeb, 0xfc, 0xe6, 0xa8, 0x11, 0x61, 0x43, 0xb0, + 0xea, 0xb6, 0xba, 0x9e, 0xe3, 0xe2, 0x10, 0x8c, 0xc7, 0x43, 0x40, 0x45, 0x31, 0x1f, 0x02, 0x05, + 0x88, 0xbc, 0x0d, 0xd3, 0xd5, 0xfa, 0xba, 0x8a, 0x56, 0x8c, 0x1f, 0x85, 0xed, 0xae, 0x63, 0x69, + 0xa8, 0x09, 0xd8, 0x41, 0x37, 0xa9, 0x89, 0x3f, 0x9d, 0x9b, 0x94, 0xf1, 0x1b, 0x25, 0xb9, 0xbd, + 0x3f, 0xd9, 0xa7, 0x11, 0xfd, 0xb1, 0xa3, 0xf0, 0x98, 0x8f, 0x1d, 0x23, 0xc7, 0x49, 0x99, 0x8a, + 0x30, 0x3b, 0xf6, 0xb1, 0x1f, 0x2e, 0xc6, 0x1f, 0x53, 0x3c, 0x4d, 0xec, 0x9d, 0xe2, 0x30, 0x7b, + 0x27, 0x53, 0xa4, 0x9d, 0xf8, 0xf8, 0x22, 0x2d, 0x3c, 0xb6, 0x48, 0xdb, 0x88, 0x9d, 0xb0, 0x27, + 0x8f, 0xf5, 0x6d, 0x39, 0x23, 0xb4, 0x06, 0xb3, 0xd9, 0xe1, 0x04, 0x23, 0x77, 0xec, 0x4f, 0x95, + 0x9c, 0xfc, 0xf5, 0x6c, 0x39, 0x79, 0xf0, 0xf9, 0xf1, 0xe7, 0x92, 0xf2, 0x9f, 0x4b, 0xca, 0x7f, + 0x2a, 0x92, 0xf2, 0x5d, 0x20, 0x76, 0x2f, 0xdc, 0xa3, 0x6e, 0xe8, 0x34, 0x31, 0xa4, 0x2d, 0x9b, + 0x62, 0x94, 0x99, 0xc5, 0x1e, 0x49, 0xd7, 0xaa, 0x7b, 0x44, 0xab, 0x65, 0x2b, 0x80, 0x87, 0x01, + 0x1d, 0x5a, 0x02, 0xf6, 0x71, 0x47, 0xdd, 0xb7, 0x7d, 0x17, 0xd5, 0x44, 0x97, 0x61, 0x5c, 0x86, + 0x50, 0xcd, 0xc5, 0x4a, 0xe6, 0x74, 0xec, 0x54, 0x09, 0x45, 0x96, 0xa0, 0x28, 0x91, 0xd5, 0x44, + 0x40, 0x0f, 0x45, 0x99, 0x16, 0x9d, 0x52, 0x94, 0x19, 0xff, 0xd1, 0x88, 0xe4, 0xda, 0xec, 0x83, + 0xeb, 0xb6, 0x6f, 0x77, 0x30, 0x47, 0x60, 0xb4, 0xa9, 0x14, 0xf9, 0x3b, 0xb1, 0x0f, 0x13, 0x6e, + 0x09, 0x3a, 0xca, 0x47, 0x8a, 0x81, 0x1b, 0xa7, 0x61, 0x2e, 0x0c, 0x91, 0x86, 0xf9, 0x4d, 0x2d, + 0x87, 0xf1, 0x48, 0x9c, 0x34, 0x93, 0x71, 0xb2, 0xc1, 0xd9, 0x8b, 0xaf, 0xa9, 0xc9, 0x86, 0x47, + 0xe3, 0x88, 0x64, 0x88, 0x39, 0x20, 0xcd, 0x70, 0x74, 0xa1, 0x18, 0x7b, 0x9c, 0xe8, 0xd2, 0xe3, + 0xff, 0x5e, 0xa3, 0x4b, 0xaf, 0x02, 0x88, 0xd3, 0x35, 0xb6, 0x45, 0x78, 0x19, 0x99, 0x8f, 0x30, + 0xb1, 0x0e, 0xc3, 0x76, 0x9f, 0xf4, 0x23, 0x0a, 0xa2, 0xf1, 0xaf, 0x08, 0xcc, 0x36, 0x1a, 0x77, + 0x6b, 0x8e, 0xbd, 0xeb, 0x7a, 0x41, 0xe8, 0x34, 0xd7, 0xdd, 0x1d, 0x8f, 0x49, 0xd3, 0xd1, 0x09, + 0xa0, 0xc4, 0x05, 0x8e, 0xb9, 0x7f, 0x54, 0xcd, 0x6e, 0x6b, 0xab, 0xbe, 0x2f, 0xf5, 0x99, 0xfc, + 0xb6, 0x46, 0x59, 0x81, 0xc9, 0xcb, 0x99, 0xc0, 0xda, 0xe8, 0x61, 0x54, 0x0e, 0x61, 0xf0, 0x81, + 0x02, 0x6b, 0xc0, 0x8b, 0x4c, 0x59, 0x47, 0x68, 0x7a, 0xc1, 0x8a, 0x0b, 0xcc, 0x29, 0x2d, 0x46, + 0x75, 0x5c, 0xcd, 0xf7, 0xae, 0x90, 0x3f, 0x90, 0x6b, 0x77, 0xb1, 0x5c, 0xb5, 0x81, 0x4b, 0xed, + 0x81, 0x03, 0x38, 0xa1, 0xf9, 0x6b, 0x0f, 0xfb, 0xbe, 0xf2, 0xaa, 0x10, 0x90, 0x0d, 0xb4, 0x33, + 0xce, 0x78, 0x64, 0x51, 0x93, 0xfe, 0x65, 0xb6, 0x40, 0x7e, 0x2c, 0x07, 0x67, 0x32, 0x6b, 0xa2, + 0xdd, 0x3d, 0xa9, 0xc5, 0x09, 0x57, 0x98, 0x06, 0x4f, 0x6f, 0xd8, 0xaf, 0x69, 0x2b, 0x83, 0x15, + 0x0c, 0x6e, 0x89, 0xfc, 0x5a, 0x0e, 0x4e, 0x69, 0x10, 0x11, 0xb7, 0x0c, 0xa2, 0x50, 0x26, 0x99, + 0xeb, 0xfa, 0xc3, 0x27, 0xb3, 0xae, 0x5f, 0xd4, 0xfb, 0x12, 0x73, 0x4b, 0xb5, 0x0f, 0xfd, 0xbe, + 0x90, 0x3c, 0x80, 0x59, 0xac, 0x92, 0x6f, 0x3d, 0x6c, 0xcd, 0x8a, 0x27, 0xa2, 0xf9, 0xf8, 0xb3, + 0x79, 0x0c, 0x02, 0x4c, 0x51, 0xbf, 0xf4, 0xdd, 0xc3, 0xca, 0x94, 0x06, 0x2e, 0x23, 0x6f, 0x5b, + 0xf1, 0x83, 0x91, 0xe3, 0xee, 0x78, 0x2a, 0xdf, 0x4f, 0x35, 0x41, 0xfe, 0x59, 0x8e, 0xab, 0xff, + 0x79, 0x37, 0xae, 0xfb, 0x5e, 0x27, 0xaa, 0x97, 0xc6, 0x94, 0x7d, 0x86, 0xad, 0xfd, 0x64, 0x86, + 0xed, 0x65, 0xfc, 0x64, 0xce, 0x13, 0xac, 0x1d, 0xdf, 0xeb, 0xc4, 0x9f, 0xaf, 0x0e, 0x5c, 0xdf, + 0x8f, 0x24, 0x3f, 0x94, 0x83, 0xd3, 0x9a, 0xd6, 0x52, 0x4d, 0x83, 0x22, 0x22, 0x3d, 0xcc, 0x45, + 0x31, 0x60, 0xe2, 0xaa, 0xe5, 0x4b, 0x62, 0xfd, 0x9f, 0xc3, 0x2f, 0x50, 0x42, 0x8e, 0x32, 0x20, + 0xab, 0xc3, 0xa1, 0x94, 0x4f, 0xe8, 0xdf, 0x0a, 0x71, 0x60, 0x16, 0x4d, 0x6a, 0x34, 0xa3, 0xdf, + 0xf9, 0xfe, 0x46, 0xbf, 0x51, 0x82, 0x23, 0x4c, 0x7e, 0xd0, 0xdf, 0xf2, 0x37, 0x4d, 0x95, 0xfc, + 0x00, 0x9c, 0x4e, 0x15, 0x46, 0xbb, 0xed, 0x44, 0xdf, 0xdd, 0xf6, 0xda, 0xd1, 0x61, 0xe5, 0x95, + 0xac, 0xd6, 0xb2, 0x76, 0x5a, 0xff, 0x16, 0x88, 0x0d, 0x10, 0x57, 0x0a, 0xe9, 0x27, 0x7b, 0x81, + 0xbe, 0x26, 0xd6, 0x87, 0x02, 0xcf, 0x78, 0xb9, 0xf2, 0x0d, 0xea, 0x91, 0x17, 0x03, 0x11, 0x0a, + 0x25, 0x25, 0xf1, 0xc3, 0x81, 0xb0, 0x32, 0xe9, 0xd3, 0xc8, 0x77, 0x0f, 0x2b, 0x1a, 0x34, 0xbb, + 0x03, 0xa9, 0x19, 0x25, 0x34, 0x61, 0x53, 0x05, 0x24, 0xbf, 0x9a, 0x83, 0x79, 0x56, 0x10, 0x2f, + 0x2a, 0xd1, 0xa9, 0x85, 0x41, 0xab, 0x7e, 0xef, 0xc9, 0xac, 0xfa, 0x17, 0xf0, 0x1b, 0xd5, 0x55, + 0x9f, 0x1a, 0x92, 0xcc, 0x8f, 0xc3, 0xd5, 0xae, 0x59, 0x6f, 0x69, 0xab, 0xfd, 0xf4, 0x10, 0xab, + 0x9d, 0x4f, 0xc0, 0xf1, 0xab, 0xbd, 0x6f, 0x2b, 0x64, 0x13, 0x4a, 0xe2, 0xfa, 0xc3, 0x07, 0xec, + 0x79, 0x2d, 0x04, 0xb5, 0x5a, 0xc5, 0xef, 0xa4, 0x22, 0x2f, 0x46, 0xaa, 0x87, 0x1a, 0x15, 0xe2, + 0xc2, 0x1c, 0xff, 0xad, 0xab, 0x97, 0x2a, 0x7d, 0xd5, 0x4b, 0xe7, 0x45, 0x8f, 0xce, 0x0a, 0xfa, + 0x09, 0x2d, 0x93, 0x1a, 0x3a, 0x2a, 0x83, 0x30, 0xe9, 0x02, 0xd1, 0x8a, 0xf9, 0xa6, 0x3d, 0x3b, + 0x58, 0xa9, 0xf4, 0x8a, 0x68, 0xb3, 0x92, 0x6c, 0x33, 0xb9, 0x73, 0x33, 0x68, 0x13, 0x1b, 0x66, + 0x44, 0xa9, 0xb7, 0x4f, 0x39, 0x87, 0x7f, 0x41, 0x0b, 0xde, 0x95, 0xa8, 0xe5, 0x77, 0x38, 0xd9, + 0x12, 0x06, 0x57, 0x4b, 0x30, 0xf4, 0x24, 0x3d, 0x72, 0x17, 0x66, 0xab, 0xdd, 0x6e, 0xdb, 0xa1, + 0x2d, 0xec, 0xa5, 0xd9, 0x63, 0x7d, 0x32, 0xe2, 0xd4, 0x72, 0x36, 0xaf, 0x14, 0x17, 0x4b, 0xbf, + 0x97, 0x60, 0x37, 0x29, 0x5c, 0xe3, 0x47, 0x73, 0xa9, 0x8f, 0x26, 0xaf, 0xc3, 0x04, 0xfe, 0x50, + 0xe2, 0xc1, 0xa0, 0x96, 0x86, 0x7f, 0x22, 0xea, 0x7f, 0x62, 0x00, 0x26, 0x2c, 0xa9, 0x31, 0x21, + 0x0b, 0x5c, 0x58, 0x12, 0xaa, 0x84, 0x58, 0x79, 0x50, 0x91, 0xce, 0x18, 0x85, 0x58, 0xe8, 0x42, + 0x67, 0x0c, 0xe1, 0x82, 0x61, 0xfc, 0xc3, 0xbc, 0xbe, 0xec, 0xc8, 0x79, 0x45, 0x6e, 0x57, 0xa2, + 0x52, 0x4a, 0xb9, 0x5d, 0x91, 0xd6, 0xff, 0x6e, 0x0e, 0xe6, 0xee, 0x2a, 0x89, 0x4c, 0x37, 0x3d, + 0x9c, 0x97, 0xc1, 0xa9, 0x3d, 0x9f, 0x54, 0xb6, 0x41, 0x35, 0x83, 0x2a, 0x5b, 0x29, 0xb8, 0x64, + 0xcc, 0xac, 0xef, 0x41, 0x47, 0x3d, 0xfc, 0x30, 0x25, 0xe9, 0x23, 0x07, 0xe7, 0xe5, 0x8f, 0x99, + 0x25, 0xc3, 0xf8, 0xc9, 0x3c, 0x4c, 0x2a, 0x3b, 0x86, 0x7c, 0x16, 0x4a, 0x6a, 0xb3, 0xaa, 0x8a, + 0x4f, 0xfd, 0x4a, 0x53, 0x83, 0x42, 0x1d, 0x1f, 0xb5, 0x3b, 0x9a, 0x8e, 0x8f, 0xed, 0x0b, 0x2c, + 0x7d, 0xcc, 0x9b, 0xd0, 0x7b, 0x19, 0x37, 0x21, 0x5c, 0xe5, 0x8a, 0x4e, 0x67, 0xe0, 0x7d, 0xe8, + 0xed, 0xf4, 0x7d, 0x08, 0xd5, 0x4b, 0x0a, 0x7e, 0xff, 0x5b, 0x91, 0xf1, 0xd3, 0x39, 0x28, 0x27, + 0xf7, 0xf4, 0x27, 0x32, 0x2a, 0x8f, 0xf1, 0x9e, 0xf3, 0x13, 0xf9, 0x28, 0x49, 0x8c, 0xf4, 0x56, + 0x7e, 0x5a, 0x0d, 0x0d, 0xdf, 0xd1, 0x9e, 0x5a, 0x9e, 0xd5, 0x03, 0xef, 0xa9, 0x71, 0x3e, 0xb2, + 0xa3, 0x6d, 0x8e, 0x7c, 0xfb, 0x6f, 0x55, 0x9e, 0x31, 0xbe, 0x0c, 0xf3, 0xc9, 0xe1, 0xc0, 0xe7, + 0x96, 0x2a, 0xcc, 0xe8, 0xe5, 0xc9, 0x14, 0x53, 0x49, 0x2c, 0x33, 0x09, 0x6f, 0xfc, 0x6e, 0x3e, + 0x49, 0x5b, 0x18, 0x1d, 0x32, 0x1e, 0xa5, 0xda, 0xb9, 0x08, 0x1e, 0xc5, 0x8b, 0x4c, 0x59, 0xf7, + 0x38, 0xa9, 0xdd, 0x22, 0x9f, 0xdb, 0x42, 0xb6, 0xcf, 0x2d, 0xb9, 0x96, 0xb0, 0xa0, 0x56, 0x02, + 0x44, 0x3d, 0xa4, 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, 0xb6, + 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, 0x9f, 0xb2, 0xfc, + 0x70, 0xac, 0x4b, 0x03, 0x6c, 0x62, 0xff, 0x6d, 0x9e, 0xa7, 0xfd, 0x11, 0xcb, 0xe7, 0x4d, 0x18, + 0xdb, 0xb4, 0xfd, 0x5d, 0x91, 0xd2, 0x5b, 0xa7, 0xc2, 0x2b, 0xe2, 0xf0, 0x55, 0x21, 0xfe, 0x36, + 0x05, 0x82, 0xaa, 0x3a, 0xcb, 0x0f, 0xa5, 0x3a, 0x53, 0x34, 0xf7, 0x85, 0x27, 0xa6, 0xb9, 0xff, + 0xbe, 0x28, 0xc3, 0x4f, 0x35, 0x1c, 0x22, 0x98, 0xf6, 0xd9, 0x64, 0x42, 0xad, 0x54, 0xd8, 0xf3, + 0x98, 0x1c, 0xb9, 0xa6, 0xa6, 0xe8, 0x52, 0x9c, 0x3f, 0x8f, 0x49, 0xc6, 0x65, 0xfc, 0x57, 0x05, + 0x3e, 0xc6, 0x62, 0xa0, 0xce, 0x69, 0x2e, 0xee, 0xb8, 0x4f, 0x12, 0x5a, 0x4d, 0xee, 0xec, 0x7e, + 0x0e, 0x46, 0xd8, 0xda, 0x14, 0xa3, 0x89, 0x70, 0x6c, 0xfd, 0xaa, 0x70, 0xac, 0x9e, 0xed, 0x65, + 0x3c, 0x93, 0xd4, 0xdc, 0x8b, 0x78, 0x6c, 0xa9, 0x7b, 0x19, 0x21, 0x58, 0x0f, 0xa2, 0x04, 0x16, + 0x6a, 0x0f, 0x3a, 0x3b, 0x76, 0x3a, 0x53, 0x9e, 0x92, 0x35, 0x67, 0x15, 0xa6, 0xef, 0x3b, 0x6e, + 0xcb, 0x7b, 0x18, 0xd4, 0x68, 0xb0, 0x1f, 0x7a, 0x5d, 0x61, 0x07, 0x8c, 0x1a, 0xfe, 0x87, 0xbc, + 0xc6, 0x6a, 0xf1, 0x2a, 0xf5, 0x39, 0x44, 0x47, 0x22, 0xcb, 0x30, 0xa5, 0x85, 0x80, 0x15, 0x8f, + 0x94, 0xa8, 0xe3, 0xd4, 0x03, 0xc8, 0xaa, 0x3a, 0x4e, 0x0d, 0x85, 0x9d, 0xd2, 0xe2, 0xfb, 0x95, + 0xa7, 0xca, 0xd4, 0xb7, 0x0b, 0x18, 0x72, 0x15, 0x8a, 0x3c, 0x4e, 0xc8, 0x7a, 0x4d, 0x7d, 0x9e, + 0x0a, 0xb0, 0x2c, 0x11, 0x67, 0x47, 0x02, 0xc6, 0x71, 0x21, 0xb8, 0x93, 0x9c, 0x39, 0x72, 0xc7, + 0x6b, 0x51, 0xe3, 0x33, 0x50, 0x16, 0x4c, 0x27, 0xce, 0x16, 0xff, 0x1c, 0x8c, 0xac, 0xac, 0xd7, + 0x4c, 0x95, 0x51, 0x34, 0x9d, 0x96, 0x6f, 0x62, 0x29, 0xfa, 0xc8, 0xdd, 0xa1, 0xe1, 0x43, 0xcf, + 0xdf, 0x37, 0x69, 0x10, 0xfa, 0x0e, 0x4f, 0xce, 0x89, 0x5b, 0xed, 0xb3, 0xe4, 0x6d, 0x18, 0x45, + 0xe3, 0xd4, 0x04, 0xef, 0x4f, 0xb6, 0xb1, 0x3c, 0x25, 0x96, 0xe8, 0x28, 0x5a, 0xba, 0x9a, 0x1c, + 0x89, 0xbc, 0x09, 0x23, 0x35, 0xea, 0x1e, 0x24, 0xf2, 0x06, 0xa6, 0x90, 0xa3, 0x2d, 0xdf, 0xa2, + 0xee, 0x81, 0x89, 0x28, 0xc6, 0x4f, 0xe7, 0xe1, 0x44, 0xc6, 0x67, 0xdd, 0xfb, 0xec, 0x53, 0xca, + 0xf7, 0x96, 0x35, 0xbe, 0x27, 0xdf, 0x9c, 0xfb, 0x0e, 0x7c, 0x26, 0x1b, 0xfc, 0x1b, 0x39, 0x38, + 0xa5, 0x2f, 0x56, 0x61, 0x8d, 0x7e, 0xef, 0x2a, 0x79, 0x0b, 0xc6, 0xd6, 0xa8, 0xdd, 0xa2, 0x32, + 0x49, 0xd8, 0x89, 0x28, 0xba, 0x1f, 0x0f, 0x23, 0xc0, 0x2b, 0x39, 0xd9, 0xd8, 0xe9, 0x94, 0x97, + 0x92, 0x9a, 0xf8, 0x38, 0x2e, 0xa0, 0x1b, 0x32, 0x38, 0x49, 0x56, 0x53, 0x03, 0x2c, 0x37, 0xbe, + 0x9b, 0x83, 0x67, 0x07, 0xe0, 0xb0, 0x89, 0x63, 0x53, 0xaf, 0x4e, 0x1c, 0x9e, 0x99, 0x58, 0x4a, + 0xde, 0x85, 0x99, 0x4d, 0x21, 0xe0, 0xcb, 0xe9, 0xc8, 0xc7, 0x7b, 0x47, 0xca, 0xfe, 0xd2, 0xb6, + 0xc8, 0x4c, 0x02, 0x6b, 0x51, 0x73, 0x0a, 0x03, 0xa3, 0xe6, 0xa8, 0x41, 0x68, 0x46, 0x86, 0x0d, + 0x42, 0xf3, 0x65, 0x98, 0xd7, 0xfb, 0x26, 0x62, 0x01, 0xc7, 0x21, 0x78, 0x72, 0xfd, 0x43, 0xf0, + 0x0c, 0x8c, 0x38, 0x6a, 0xfc, 0x64, 0x0e, 0xca, 0x3a, 0xed, 0x8f, 0x3b, 0x9f, 0xef, 0x68, 0xf3, + 0xf9, 0x6c, 0xf6, 0x7c, 0xf6, 0x9f, 0xc8, 0xff, 0x3d, 0x97, 0xec, 0xec, 0x50, 0x33, 0x68, 0xc0, + 0x58, 0xcd, 0xeb, 0xd8, 0x8e, 0x9c, 0x38, 0x74, 0x25, 0x69, 0x61, 0x89, 0x29, 0x6a, 0x86, 0x8b, + 0x58, 0x74, 0x16, 0x46, 0xef, 0x78, 0x6e, 0xb5, 0x26, 0x6c, 0x72, 0x91, 0x8e, 0xeb, 0xb9, 0x96, + 0xdd, 0x32, 0x79, 0x05, 0xd9, 0x00, 0x68, 0x34, 0x7d, 0x4a, 0xdd, 0x86, 0xf3, 0xfd, 0x34, 0x21, + 0x4b, 0xb0, 0x11, 0x6a, 0xf7, 0x90, 0xb1, 0xf0, 0xa7, 0x54, 0x04, 0xb4, 0x02, 0xe7, 0xfb, 0x55, + 0xde, 0xab, 0xe0, 0xe3, 0xbe, 0x12, 0x41, 0xdd, 0x12, 0xf3, 0x70, 0xe5, 0x93, 0xd8, 0x57, 0x99, + 0x4d, 0xe1, 0x08, 0x5f, 0xc9, 0x9c, 0x8e, 0xdf, 0xc9, 0xc1, 0xb3, 0x03, 0x70, 0x9e, 0xc0, 0xac, + 0xfc, 0x69, 0x0f, 0x38, 0x05, 0x88, 0x91, 0x30, 0x2d, 0xb3, 0xd3, 0x0a, 0x79, 0xe2, 0xbf, 0x29, + 0x91, 0x96, 0x99, 0x15, 0x68, 0x69, 0x99, 0x59, 0x01, 0x3b, 0x57, 0xd7, 0xa8, 0xb3, 0xbb, 0xc7, + 0x4d, 0xae, 0xa6, 0x38, 0x6f, 0xd8, 0xc3, 0x12, 0xf5, 0x5c, 0xe5, 0x30, 0xc6, 0xbf, 0x1e, 0x83, + 0xd3, 0x26, 0xdd, 0x75, 0xd8, 0xcd, 0x63, 0x2b, 0x70, 0xdc, 0x5d, 0x2d, 0x88, 0x8f, 0x91, 0xd8, + 0xb9, 0x22, 0xe3, 0x05, 0x2b, 0x89, 0x56, 0xe2, 0x05, 0x28, 0xb2, 0x63, 0x55, 0xd9, 0xbc, 0xf8, + 0x8a, 0xe5, 0x7a, 0x2d, 0x2a, 0xa2, 0x44, 0xcb, 0x6a, 0xf2, 0xaa, 0x10, 0x84, 0x94, 0x9c, 0x44, + 0x4c, 0x10, 0xfa, 0xde, 0x61, 0x05, 0x1a, 0x07, 0x41, 0x48, 0xf1, 0x12, 0x2c, 0x84, 0xa1, 0xe8, + 0xb6, 0x32, 0xd2, 0xe7, 0xb6, 0x72, 0x1b, 0xe6, 0xab, 0x2d, 0x7e, 0x3a, 0xda, 0xed, 0xba, 0xef, + 0xb8, 0x4d, 0xa7, 0x6b, 0xb7, 0xe5, 0x0d, 0x1c, 0x47, 0xd9, 0x8e, 0xea, 0xad, 0x6e, 0x04, 0x60, + 0x66, 0xa2, 0xb1, 0x6e, 0xd4, 0xee, 0x34, 0x30, 0x42, 0x8c, 0x78, 0xa0, 0xc4, 0x6e, 0xb4, 0xdc, + 0x00, 0x7b, 0x11, 0x98, 0x51, 0x35, 0xde, 0x93, 0xf0, 0x39, 0x7a, 0x73, 0xa3, 0x71, 0x4b, 0x64, + 0x4d, 0x93, 0x29, 0x13, 0xb8, 0xa1, 0x41, 0xd8, 0x0e, 0xd0, 0xbc, 0x51, 0x83, 0x8b, 0xf1, 0x1a, + 0x8d, 0x35, 0x86, 0x57, 0x4c, 0xe1, 0x05, 0xc1, 0x9e, 0x8a, 0xc7, 0xe1, 0xc8, 0x65, 0xb6, 0x14, + 0x3a, 0x5e, 0x48, 0x71, 0x09, 0x4f, 0xc4, 0xb7, 0x2a, 0x1f, 0x4b, 0xf9, 0xad, 0x4a, 0x01, 0x21, + 0x6f, 0xc3, 0xdc, 0xea, 0xca, 0x92, 0x54, 0x2b, 0xd7, 0xbc, 0x66, 0x0f, 0x0d, 0x03, 0x00, 0xdb, + 0xc3, 0x39, 0xa4, 0xcd, 0x25, 0xc6, 0x4d, 0xb2, 0xc0, 0xc8, 0x39, 0x18, 0x5f, 0xaf, 0xf1, 0xb1, + 0x9f, 0x54, 0xf3, 0x82, 0x09, 0x6b, 0x27, 0x59, 0x49, 0xee, 0xc6, 0x62, 0x7f, 0xe9, 0x58, 0xf9, + 0xfc, 0xf4, 0x10, 0x22, 0xff, 0x9b, 0x30, 0xb5, 0xec, 0x85, 0xeb, 0x6e, 0x10, 0xda, 0x6e, 0x93, + 0xae, 0xd7, 0xd4, 0x20, 0xdd, 0xdb, 0x5e, 0x68, 0x39, 0xa2, 0x86, 0x7d, 0xb9, 0x0e, 0x49, 0x3e, + 0x8f, 0xa8, 0x37, 0xa8, 0x4b, 0xfd, 0x38, 0x38, 0xf7, 0x28, 0x1f, 0x5b, 0x86, 0xba, 0x1b, 0xd5, + 0x98, 0x3a, 0x20, 0x31, 0xe1, 0x04, 0x26, 0xf9, 0xf7, 0x7a, 0x81, 0xde, 0xf8, 0x4c, 0x2c, 0xd2, + 0x76, 0x05, 0x80, 0x95, 0xfc, 0x8a, 0x6c, 0x54, 0x91, 0x07, 0x8d, 0x67, 0x2f, 0x5d, 0xf1, 0x5a, + 0x34, 0xe0, 0x1c, 0xe8, 0x53, 0x94, 0x07, 0x4d, 0xe9, 0xdb, 0x00, 0xae, 0xfc, 0x1f, 0x62, 0x1e, + 0xb4, 0x14, 0x2c, 0xf9, 0x3c, 0x8c, 0xe2, 0x4f, 0x21, 0x31, 0xcf, 0x65, 0x90, 0x8d, 0xa5, 0xe5, + 0x26, 0x83, 0x34, 0x39, 0x02, 0x59, 0x87, 0x71, 0x71, 0x1d, 0x7b, 0x9c, 0x6c, 0x3e, 0xe2, 0x5e, + 0xc7, 0x57, 0x9b, 0xc0, 0x37, 0x5a, 0x50, 0x52, 0x1b, 0x64, 0xbb, 0x6c, 0xcd, 0x0e, 0xf6, 0x68, + 0x8b, 0xfd, 0x12, 0x89, 0xf8, 0x70, 0x97, 0xed, 0x61, 0xa9, 0xc5, 0xbe, 0xc3, 0x54, 0x40, 0xd8, + 0x39, 0xbd, 0x1e, 0x6c, 0x05, 0xe2, 0x53, 0x84, 0x82, 0xc6, 0x41, 0x65, 0x5f, 0xcb, 0x14, 0x55, + 0xc6, 0xf7, 0xc1, 0xfc, 0x9d, 0x5e, 0xbb, 0x6d, 0x6f, 0xb7, 0xa9, 0x4c, 0xd4, 0x82, 0x19, 0xd1, + 0x97, 0x61, 0xb4, 0xa1, 0xe4, 0x58, 0x8f, 0x92, 0x65, 0x2a, 0x30, 0x68, 0xac, 0x9a, 0xc3, 0x08, + 0x40, 0x89, 0xec, 0xea, 0x1c, 0xd5, 0xf8, 0xed, 0x1c, 0xcc, 0x4b, 0x23, 0x03, 0xdf, 0x6e, 0xee, + 0x47, 0x89, 0xf6, 0xcf, 0x69, 0x6b, 0x0d, 0x37, 0x41, 0x62, 0x19, 0xf1, 0x55, 0x77, 0x53, 0x7e, + 0x84, 0x2e, 0x04, 0x65, 0x7d, 0xf0, 0x71, 0x1f, 0x43, 0xde, 0x86, 0x49, 0x71, 0xe4, 0x2a, 0x11, + 0x38, 0x31, 0x00, 0x99, 0xb8, 0x4e, 0x26, 0x4d, 0x5e, 0x54, 0x70, 0x94, 0xef, 0xf4, 0xae, 0x7c, + 0x5c, 0xb9, 0x22, 0x5b, 0xbe, 0xd3, 0xdb, 0x18, 0xb0, 0x74, 0xbf, 0x33, 0x99, 0x1c, 0x5b, 0xb1, + 0x76, 0xaf, 0xa9, 0x31, 0xf7, 0x72, 0xf1, 0xcd, 0x3b, 0x8e, 0xb9, 0xa7, 0xde, 0xbc, 0x23, 0xd0, + 0x68, 0x4e, 0xf2, 0xc7, 0xcc, 0xc9, 0xbb, 0x72, 0x4e, 0x0a, 0xfd, 0x17, 0xc6, 0xdc, 0x80, 0x79, + 0x68, 0xc4, 0x3b, 0x64, 0x64, 0x28, 0x65, 0xcc, 0x33, 0x98, 0x5c, 0x80, 0xa3, 0x24, 0x39, 0xb3, + 0xa0, 0xa4, 0x6a, 0x78, 0x46, 0x87, 0x27, 0x7a, 0x0c, 0xbb, 0xff, 0x02, 0x94, 0xaa, 0x61, 0x68, + 0x37, 0xf7, 0x68, 0xab, 0xc6, 0xd8, 0x93, 0x12, 0x54, 0xcb, 0x16, 0xe5, 0xea, 0xcb, 0x9c, 0x0a, + 0xcb, 0xc3, 0xdd, 0xda, 0x81, 0x30, 0x92, 0x8d, 0xc2, 0xdd, 0xb2, 0x12, 0x3d, 0xdc, 0x2d, 0x2b, + 0x21, 0x97, 0x61, 0x7c, 0xdd, 0x7d, 0xe0, 0xb0, 0x31, 0xe1, 0x71, 0xb5, 0x50, 0xa3, 0xe5, 0xf0, + 0x22, 0x95, 0xb9, 0x0a, 0x28, 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, + 0xc0, 0x4c, 0x87, 0xa0, 0x90, 0xc0, 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, 0x1e, + 0x94, 0xea, 0xb6, 0x1f, 0x3a, 0x4c, 0xee, 0x71, 0xc3, 0x60, 0x61, 0x4a, 0xd3, 0xb6, 0x2a, 0x55, + 0xcb, 0xcf, 0xcb, 0xc4, 0xdd, 0x5d, 0x05, 0x5e, 0xcf, 0x30, 0x1d, 0x97, 0x67, 0x9b, 0xc8, 0x4e, + 0x7f, 0x1c, 0x13, 0x59, 0x1c, 0x54, 0xd4, 0xb0, 0xcd, 0xc4, 0x1a, 0x1f, 0xbc, 0x08, 0x25, 0xd4, + 0x6c, 0x11, 0x20, 0xf9, 0x2a, 0x94, 0xd8, 0xdf, 0x75, 0xaf, 0xed, 0x34, 0x1d, 0x1a, 0x2c, 0x94, + 0xb1, 0x73, 0xcf, 0x67, 0xee, 0x7e, 0x04, 0x3a, 0x68, 0xd0, 0x90, 0x6f, 0x60, 0x24, 0x9c, 0x54, + 0x9d, 0x6b, 0xd4, 0xc8, 0x7b, 0x50, 0x62, 0xab, 0x6f, 0xdb, 0x0e, 0xb8, 0xb8, 0x3b, 0x1b, 0x1b, + 0x39, 0xb7, 0x44, 0x79, 0x2a, 0xe2, 0xb4, 0x8a, 0xc0, 0x8e, 0xf9, 0x6a, 0x97, 0x33, 0x48, 0xa2, + 0xac, 0xf6, 0x6e, 0x8a, 0x39, 0x4a, 0x30, 0xf2, 0x45, 0x28, 0x55, 0xbb, 0xdd, 0x98, 0xe3, 0xcc, + 0x29, 0x8a, 0xb6, 0x6e, 0xd7, 0xca, 0xe4, 0x3a, 0x1a, 0x46, 0x92, 0x31, 0xcf, 0x3f, 0x16, 0x63, + 0x26, 0x17, 0xa3, 0x1b, 0xc0, 0x89, 0x58, 0x17, 0x2c, 0x2e, 0xa3, 0xda, 0x75, 0x82, 0x5f, 0x06, + 0x56, 0x60, 0x8a, 0x2b, 0x47, 0xa5, 0x34, 0x73, 0x32, 0xb5, 0x7b, 0x32, 0x84, 0x1a, 0x1d, 0x87, + 0xac, 0xc2, 0x34, 0xf7, 0xf2, 0x6e, 0x8b, 0x50, 0xe0, 0x0b, 0xa7, 0x70, 0xd7, 0x22, 0x15, 0xee, + 0x1c, 0xde, 0xc6, 0x0c, 0x31, 0xb6, 0x46, 0x25, 0x81, 0x64, 0xfc, 0x41, 0x0e, 0x4e, 0xf5, 0x99, + 0xf1, 0x28, 0x50, 0x74, 0x6e, 0x70, 0xa0, 0x68, 0xc6, 0x39, 0x74, 0x4d, 0x0b, 0xf6, 0x3f, 0xed, + 0xbc, 0x15, 0xc9, 0x5b, 0x1e, 0x10, 0x91, 0x84, 0x49, 0x34, 0x7d, 0xd3, 0x43, 0x85, 0x6e, 0x21, + 0x7d, 0x08, 0x09, 0x38, 0xfe, 0x51, 0x3c, 0xbc, 0xa6, 0xc8, 0xf1, 0x14, 0x4d, 0xeb, 0x87, 0x9e, + 0xb6, 0x83, 0x33, 0x48, 0x1b, 0x87, 0x39, 0x98, 0x54, 0xf6, 0x21, 0x39, 0xab, 0xb8, 0x06, 0x97, + 0x79, 0x96, 0x30, 0x85, 0x42, 0x9e, 0x9f, 0x44, 0xb8, 0xa9, 0xf2, 0xc7, 0xab, 0xad, 0x31, 0x12, + 0x99, 0x12, 0x4c, 0x3b, 0x11, 0x84, 0x0c, 0xeb, 0xc9, 0x07, 0x00, 0x1b, 0x76, 0x10, 0x56, 0x9b, + 0xa1, 0xf3, 0x80, 0x0e, 0x71, 0xe8, 0xc8, 0xf0, 0x82, 0x27, 0x30, 0x2f, 0x85, 0x8d, 0x68, 0x89, + 0x33, 0x42, 0x21, 0x68, 0xfc, 0xa5, 0x1c, 0xc0, 0xd6, 0xfa, 0x0a, 0x46, 0xc3, 0xff, 0xb8, 0x42, + 0x41, 0x76, 0x84, 0x61, 0x49, 0x7d, 0x80, 0x38, 0xf0, 0x3f, 0xe4, 0x60, 0x5a, 0x07, 0x23, 0xef, + 0xc2, 0x4c, 0xa3, 0xe9, 0x7b, 0xed, 0xf6, 0xb6, 0xdd, 0xdc, 0xdf, 0x70, 0x5c, 0xca, 0xa3, 0xae, + 0x8e, 0xf2, 0xb3, 0x28, 0x88, 0xaa, 0xac, 0x36, 0xab, 0x33, 0x93, 0xc0, 0xe4, 0x87, 0x73, 0x30, + 0xd5, 0xd8, 0xf3, 0x1e, 0x46, 0x41, 0x4c, 0xc5, 0x84, 0x7c, 0xc0, 0xf6, 0x76, 0xb0, 0xe7, 0x3d, + 0x8c, 0x53, 0x8c, 0x6a, 0x16, 0xa6, 0xef, 0x0c, 0xf7, 0xf8, 0xdf, 0xf4, 0xf0, 0x3e, 0x12, 0x06, + 0x97, 0xb4, 0x46, 0x4c, 0xbd, 0x4d, 0xe3, 0x4f, 0x72, 0x30, 0x89, 0x37, 0x97, 0x76, 0x1b, 0x65, + 0xae, 0x4f, 0x53, 0xbe, 0xca, 0xa8, 0x5f, 0x03, 0x26, 0xf6, 0x0d, 0x98, 0x49, 0x80, 0x11, 0x03, + 0xc6, 0x1a, 0xe8, 0xf5, 0xaf, 0x2a, 0x3d, 0x78, 0x1c, 0x00, 0x53, 0xd4, 0x18, 0xab, 0x0a, 0xda, + 0xbd, 0x2b, 0xf8, 0x18, 0xbc, 0x04, 0xe0, 0xc8, 0x22, 0x79, 0xb3, 0x21, 0xc9, 0x2f, 0xb9, 0x77, + 0xc5, 0x54, 0xa0, 0x8c, 0x3b, 0x30, 0xd6, 0xf0, 0xfc, 0x70, 0xf9, 0x80, 0x5f, 0x26, 0x6a, 0x34, + 0x68, 0xaa, 0xaf, 0xbd, 0x0e, 0xbe, 0xc5, 0x34, 0x4d, 0x51, 0x45, 0x2a, 0x30, 0x7a, 0xdd, 0xa1, + 0xed, 0x96, 0x6a, 0x05, 0xbc, 0xc3, 0x0a, 0x4c, 0x5e, 0xce, 0x2e, 0x5c, 0x27, 0xe3, 0xa4, 0x31, + 0xb1, 0xb9, 0xf1, 0xc7, 0xdd, 0x37, 0x2b, 0xda, 0xf8, 0xbe, 0x10, 0x25, 0x6a, 0x48, 0xb7, 0x34, + 0x60, 0xa8, 0xff, 0x61, 0x0e, 0x16, 0xfb, 0xa3, 0xa8, 0x16, 0xcc, 0xb9, 0x01, 0x16, 0xcc, 0x2f, + 0x27, 0x5f, 0x27, 0x11, 0x4c, 0xbc, 0x4e, 0xc6, 0x6f, 0x92, 0x35, 0x34, 0x20, 0x6f, 0x52, 0x99, + 0x29, 0xe6, 0xec, 0x80, 0x6f, 0x46, 0x40, 0x3e, 0xcd, 0x21, 0xe2, 0x98, 0x02, 0xd7, 0xf8, 0x8d, + 0x11, 0x38, 0xdd, 0x17, 0x83, 0xac, 0x29, 0xf9, 0xa7, 0xa6, 0xa3, 0xcc, 0x37, 0x7d, 0xe1, 0x2f, + 0xe1, 0xbf, 0x68, 0x23, 0x98, 0xf4, 0x4a, 0xbb, 0x1b, 0xe5, 0x1d, 0xca, 0x23, 0xad, 0xd7, 0x8e, + 0xa5, 0xc5, 0xc1, 0x91, 0x18, 0xa4, 0x53, 0x10, 0xa1, 0xff, 0x22, 0x0d, 0x6d, 0xa7, 0x1d, 0xa8, + 0xdb, 0xae, 0xc5, 0x8b, 0x4c, 0x59, 0x17, 0x9b, 0x95, 0x8f, 0x64, 0x9b, 0x95, 0x1b, 0xff, 0x6f, + 0x0e, 0x26, 0xa2, 0xcf, 0x26, 0x8b, 0x70, 0x72, 0xd3, 0xac, 0xae, 0xac, 0x5a, 0x9b, 0x5f, 0xae, + 0xaf, 0x5a, 0x5b, 0x77, 0x1a, 0xf5, 0xd5, 0x95, 0xf5, 0xeb, 0xeb, 0xab, 0xb5, 0xf2, 0x33, 0x64, + 0x16, 0xa6, 0xb6, 0xee, 0xdc, 0xba, 0x73, 0xf7, 0xfe, 0x1d, 0x6b, 0xd5, 0x34, 0xef, 0x9a, 0xe5, + 0x1c, 0x99, 0x82, 0x09, 0x73, 0xb9, 0xba, 0x62, 0xdd, 0xb9, 0x5b, 0x5b, 0x2d, 0xe7, 0xc9, 0xff, + 0xc7, 0xde, 0xb7, 0xc5, 0x48, 0x72, 0x24, 0x87, 0x6d, 0x75, 0xf7, 0xcc, 0xf4, 0xc4, 0xbc, 0x6a, + 0x72, 0x67, 0x77, 0x67, 0xdf, 0xbb, 0x45, 0x72, 0x45, 0x0e, 0x8f, 0x3c, 0xee, 0xd2, 0x3c, 0x72, + 0x4f, 0x7c, 0xa8, 0xa6, 0xbb, 0x66, 0xa6, 0x77, 0xfb, 0xc5, 0xaa, 0x9e, 0x5d, 0xed, 0x51, 0x52, + 0xa9, 0xb6, 0xbb, 0x66, 0xa6, 0xb8, 0x3d, 0x5d, 0xcd, 0xaa, 0x6a, 0x2e, 0xe7, 0x60, 0xc0, 0x27, + 0x08, 0x3e, 0x01, 0x96, 0x65, 0x9d, 0xe5, 0x33, 0x4c, 0x08, 0x36, 0x64, 0xc0, 0x07, 0x43, 0x1f, + 0x02, 0xfc, 0x6b, 0xf8, 0xbe, 0x0e, 0xfe, 0x11, 0x70, 0x90, 0x61, 0xc3, 0x7f, 0x27, 0x83, 0x90, + 0xce, 0xb0, 0x61, 0x08, 0xfe, 0x13, 0xec, 0x0f, 0x01, 0x02, 0x8c, 0x8c, 0xcc, 0xac, 0xca, 0x7a, + 0x74, 0xef, 0xec, 0x91, 0x67, 0x5b, 0x80, 0xbe, 0x66, 0x3a, 0x32, 0x22, 0x2a, 0xdf, 0x19, 0x19, + 0x11, 0x19, 0xa1, 0xc2, 0x72, 0xad, 0xd3, 0x6e, 0x1b, 0xb5, 0x5e, 0xe3, 0x41, 0xa3, 0xf7, 0x48, + 0x2d, 0x13, 0x02, 0xab, 0x88, 0xd0, 0x35, 0x1b, 0xed, 0x5a, 0xa3, 0xab, 0x37, 0xd5, 0x0a, 0x85, + 0x51, 0x7c, 0x09, 0x36, 0x17, 0x33, 0xba, 0xbf, 0xbf, 0x6d, 0xa8, 0xf3, 0x14, 0x85, 0xfe, 0x27, + 0xa1, 0x2c, 0xd0, 0xcf, 0x23, 0x4a, 0x5d, 0xef, 0xe9, 0xdb, 0xba, 0x65, 0xa8, 0x55, 0x72, 0x01, + 0xce, 0xa6, 0x40, 0x76, 0xb3, 0xb3, 0xdb, 0x68, 0xab, 0x8b, 0x64, 0x03, 0xd4, 0x18, 0x56, 0xdf, + 0xb6, 0xf7, 0x2d, 0xc3, 0x54, 0x21, 0x0b, 0x6d, 0xeb, 0x2d, 0x43, 0x5d, 0xd2, 0xde, 0x63, 0xef, + 0x05, 0x59, 0x57, 0x93, 0xf3, 0x40, 0xac, 0x9e, 0xde, 0xdb, 0xb7, 0x32, 0x8d, 0x5f, 0x82, 0x05, + 0x6b, 0xbf, 0x56, 0x33, 0x2c, 0x4b, 0x55, 0x08, 0xc0, 0xfc, 0x8e, 0xde, 0x68, 0x1a, 0x75, 0xb5, + 0xa4, 0x7d, 0x4f, 0x81, 0x75, 0x21, 0x01, 0x0a, 0x43, 0xd4, 0x97, 0x5c, 0x8b, 0xef, 0xa7, 0x2e, + 0xb6, 0xe2, 0xf1, 0x57, 0xe6, 0x23, 0x33, 0x96, 0xe1, 0x3f, 0x57, 0xe0, 0x5c, 0x21, 0x36, 0x79, + 0x04, 0xaa, 0xa8, 0x41, 0xcb, 0x89, 0xfa, 0x47, 0xc9, 0x3e, 0x76, 0x2d, 0xf3, 0x95, 0x0c, 0x1a, + 0x53, 0x95, 0x26, 0x19, 0xb1, 0x73, 0x6c, 0x4e, 0x9f, 0xaf, 0x41, 0xfb, 0x5c, 0x81, 0x0b, 0x53, + 0x3e, 0x43, 0x6a, 0x30, 0x1f, 0x67, 0xee, 0x99, 0xe1, 0x26, 0xb7, 0xf1, 0x93, 0x2f, 0xae, 0x73, + 0x44, 0x4c, 0x21, 0x8c, 0xff, 0x99, 0xf3, 0x71, 0x2a, 0x1e, 0xcc, 0x87, 0xc3, 0xba, 0xef, 0x62, + 0xa6, 0xe7, 0xf9, 0x97, 0xf4, 0x87, 0xd6, 0xf6, 0x12, 0xef, 0xbb, 0xb2, 0xf3, 0x34, 0xc4, 0x84, + 0x38, 0xda, 0xf7, 0x15, 0x2a, 0xdc, 0x65, 0x11, 0xa9, 0xcc, 0xab, 0x87, 0xe1, 0xe4, 0xd8, 0x35, + 0xfd, 0xa1, 0xab, 0x9b, 0x6d, 0x7e, 0x6c, 0xa0, 0xb4, 0xea, 0x60, 0x01, 0x5e, 0x2b, 0x6c, 0x27, + 0x48, 0x3d, 0xf7, 0x4f, 0xd1, 0x90, 0xbb, 0x00, 0xc6, 0x67, 0x91, 0x1b, 0x8c, 0x9c, 0x61, 0x1c, + 0xb8, 0x85, 0x45, 0xb4, 0xe2, 0xd0, 0xb4, 0xbc, 0x2d, 0x21, 0x6b, 0xdf, 0x55, 0x60, 0x99, 0x5f, + 0x9a, 0xf4, 0xa1, 0x1b, 0x44, 0x5f, 0x6e, 0x7a, 0xdd, 0x4d, 0x4d, 0xaf, 0xf8, 0x55, 0x88, 0xc4, + 0x9f, 0x16, 0x17, 0xce, 0xac, 0xff, 0xa0, 0x80, 0x9a, 0x45, 0x24, 0xef, 0x43, 0xd5, 0x72, 0x3f, + 0x75, 0x03, 0x2f, 0x3a, 0xe1, 0x1b, 0xa5, 0xc8, 0x71, 0xc8, 0x70, 0x78, 0x19, 0x9b, 0x0f, 0x21, + 0xff, 0x65, 0xc6, 0x34, 0xa7, 0xdd, 0xef, 0x25, 0xb5, 0x47, 0xf9, 0xab, 0x52, 0x7b, 0x68, 0x7f, + 0x56, 0x82, 0x0b, 0xbb, 0x6e, 0x24, 0xb7, 0x29, 0x76, 0x5f, 0x78, 0xe3, 0x74, 0xed, 0x92, 0x5a, + 0xb2, 0x09, 0x0b, 0x58, 0x24, 0xc6, 0xd7, 0x14, 0x3f, 0xc9, 0x76, 0x3c, 0xaf, 0xcb, 0xa9, 0x24, + 0x6a, 0x53, 0xbe, 0xfd, 0xba, 0x94, 0x56, 0x29, 0x9e, 0xd6, 0xb7, 0x60, 0x15, 0x23, 0xfa, 0x4f, + 0xe8, 0x72, 0x70, 0x07, 0x5c, 0xfd, 0x53, 0x35, 0x33, 0x50, 0xb2, 0x05, 0x2a, 0x85, 0xe8, 0xfd, + 0x27, 0x23, 0xff, 0xe9, 0xd0, 0x1d, 0x1c, 0xba, 0x03, 0x3c, 0xd6, 0xab, 0x66, 0x0e, 0x2e, 0x78, + 0xee, 0x8f, 0xd8, 0xd5, 0xcd, 0x1d, 0xa0, 0x8e, 0x86, 0xf3, 0x4c, 0xa0, 0x97, 0xee, 0xc2, 0xd2, + 0xcf, 0x98, 0x22, 0x4d, 0xfb, 0x53, 0x05, 0x36, 0xb0, 0x71, 0xd2, 0x87, 0x45, 0xfa, 0x5a, 0xd1, + 0x5b, 0x52, 0xd6, 0x20, 0x87, 0x82, 0xd2, 0x4b, 0x21, 0xee, 0xc5, 0x44, 0x27, 0x54, 0x3a, 0x85, + 0x4e, 0xc8, 0x7a, 0x9e, 0x54, 0xfd, 0xa7, 0x54, 0x69, 0xdd, 0xab, 0x54, 0xcb, 0x6a, 0x25, 0x19, + 0x72, 0xed, 0x37, 0x4b, 0xb0, 0x60, 0xba, 0x98, 0xc3, 0x9c, 0xdc, 0x82, 0x85, 0xb6, 0x1f, 0xb9, + 0x61, 0x2b, 0x95, 0xb0, 0x7e, 0x44, 0x41, 0xf6, 0xf1, 0xc0, 0x14, 0x85, 0x74, 0xc2, 0x77, 0x03, + 0x7f, 0x30, 0xe9, 0x47, 0xf2, 0x84, 0x1f, 0x33, 0x90, 0x29, 0xca, 0xc8, 0xd7, 0x60, 0x91, 0x73, + 0x8e, 0x0d, 0xc5, 0xe8, 0xf1, 0x1c, 0xb8, 0x71, 0x0e, 0xfc, 0x04, 0x01, 0x65, 0x5a, 0x26, 0x60, + 0x54, 0x24, 0x99, 0x36, 0x27, 0x33, 0x08, 0x51, 0x7d, 0x6e, 0x86, 0xa8, 0xfe, 0x06, 0xcc, 0xeb, + 0x61, 0xe8, 0x46, 0x22, 0xda, 0xc1, 0x72, 0x1c, 0x2e, 0x2e, 0x74, 0x23, 0xc6, 0xd8, 0xc1, 0x72, + 0x93, 0xe3, 0x69, 0x7f, 0x59, 0x82, 0x39, 0xfc, 0x17, 0xcd, 0xb0, 0x41, 0xff, 0x28, 0x65, 0x86, + 0x0d, 0xfa, 0x47, 0x26, 0x42, 0xc9, 0x6d, 0xd4, 0x54, 0x88, 0x04, 0x57, 0xbc, 0xf5, 0xa8, 0x82, + 0x1f, 0x24, 0x60, 0x53, 0xc6, 0x89, 0xbd, 0x06, 0xca, 0x85, 0x31, 0x4e, 0xce, 0x43, 0xa9, 0x63, + 0xf1, 0x16, 0x63, 0x98, 0x2c, 0x3f, 0x34, 0x4b, 0x1d, 0x0b, 0x7b, 0x63, 0x4f, 0xbf, 0xf3, 0xd6, + 0x37, 0x78, 0x43, 0x59, 0x6f, 0x1c, 0x39, 0x77, 0xde, 0xfa, 0x86, 0xc9, 0x4b, 0x68, 0xff, 0x62, + 0x9d, 0xd1, 0x98, 0xcb, 0xde, 0xf2, 0x63, 0xff, 0x62, 0xdb, 0xd0, 0x70, 0x6b, 0x26, 0x08, 0xe4, + 0x0e, 0x2c, 0xf1, 0x98, 0x10, 0x88, 0x2f, 0xc5, 0x6c, 0xe0, 0x31, 0x23, 0x18, 0x85, 0x8c, 0xc4, + 0xcc, 0x7a, 0x7c, 0x80, 0x44, 0x1a, 0x5e, 0x6e, 0xd6, 0x13, 0x43, 0x18, 0x9a, 0x12, 0x0a, 0xad, + 0x12, 0xb3, 0x0b, 0x26, 0x6f, 0xf4, 0xb1, 0x4a, 0xdc, 0x78, 0x88, 0xd9, 0x13, 0x62, 0x04, 0xed, + 0x0f, 0x4b, 0x50, 0xed, 0x0e, 0x27, 0x87, 0xde, 0xe8, 0xc1, 0x6d, 0x42, 0x00, 0xaf, 0x71, 0x22, + 0xbd, 0x06, 0xfd, 0x9f, 0x5c, 0x84, 0xaa, 0xb8, 0xb9, 0x89, 0x0d, 0x29, 0xe4, 0xb7, 0xb6, 0x4d, + 0x10, 0xe3, 0xce, 0xe3, 0xa1, 0x89, 0x9f, 0xe4, 0x36, 0xc4, 0xf7, 0xaf, 0x69, 0x17, 0xb5, 0x0a, + 0x5d, 0x2c, 0x66, 0x8c, 0x46, 0x5e, 0x03, 0x3c, 0x24, 0xf8, 0xe5, 0x41, 0x28, 0xb4, 0x59, 0xd5, + 0xb8, 0x9c, 0xc2, 0x48, 0x10, 0x8d, 0xbc, 0x09, 0x7c, 0x62, 0xf2, 0x74, 0xef, 0xe7, 0xd2, 0x04, + 0x2c, 0x81, 0xa6, 0x20, 0xe1, 0xa8, 0xe4, 0x5d, 0x58, 0xea, 0x07, 0x2e, 0x5a, 0x32, 0x9d, 0x61, + 0x92, 0xc5, 0x5d, 0xa6, 0xac, 0x25, 0xe5, 0x0f, 0x6e, 0x9b, 0x32, 0xba, 0xf6, 0xfd, 0x45, 0x58, + 0x96, 0xeb, 0x43, 0x4c, 0x38, 0x1b, 0x0e, 0xe9, 0xdd, 0x9d, 0x3b, 0xb3, 0x8d, 0xb1, 0x90, 0x1f, + 0xa7, 0x37, 0xd2, 0x15, 0xa2, 0x78, 0xcc, 0xb3, 0x4d, 0x04, 0xb3, 0xd8, 0x3b, 0x63, 0xae, 0x87, + 0x09, 0x98, 0xe1, 0x11, 0x1d, 0xaa, 0xfe, 0x38, 0x3c, 0x74, 0x47, 0x9e, 0xb0, 0xb7, 0xbc, 0x90, + 0x62, 0xd4, 0xe1, 0x85, 0x39, 0x5e, 0x31, 0x19, 0x79, 0x0b, 0xe6, 0xfd, 0xb1, 0x3b, 0x72, 0x3c, + 0x7e, 0xc6, 0x5d, 0xce, 0x30, 0x70, 0x47, 0x7a, 0x43, 0x22, 0xe4, 0xc8, 0xe4, 0xeb, 0x50, 0xf1, + 0x9f, 0xc4, 0xe3, 0x75, 0x31, 0x4d, 0xf4, 0x24, 0x72, 0x24, 0x12, 0x44, 0xa4, 0x04, 0x1f, 0x3b, + 0xc7, 0x07, 0x7c, 0xc4, 0xd2, 0x04, 0xf7, 0x9c, 0xe3, 0x03, 0x99, 0x80, 0x22, 0x92, 0x0f, 0x00, + 0xc6, 0xce, 0xa1, 0x1b, 0xd8, 0x83, 0x49, 0x74, 0xc2, 0xc7, 0xed, 0x5a, 0x8a, 0xac, 0x4b, 0x8b, + 0xeb, 0x93, 0xe8, 0x44, 0xa2, 0x5d, 0x1c, 0x0b, 0x20, 0xd1, 0x01, 0x8e, 0x9d, 0x28, 0x72, 0x83, + 0x63, 0x9f, 0x7b, 0x13, 0x26, 0xc1, 0x0f, 0x19, 0x83, 0x56, 0x5c, 0x2c, 0x71, 0x90, 0x88, 0xb0, + 0xd2, 0x5e, 0xe0, 0xf0, 0xa4, 0xfb, 0x99, 0x4a, 0x7b, 0x41, 0xaa, 0x95, 0x14, 0x91, 0xbc, 0x03, + 0x0b, 0x03, 0x2f, 0xec, 0xfb, 0xc1, 0x80, 0x47, 0x39, 0xb9, 0x92, 0xa2, 0xa9, 0xb3, 0x32, 0x89, + 0x4c, 0xa0, 0xd3, 0xda, 0xf2, 0xe0, 0xa7, 0x6d, 0xff, 0x29, 0xaa, 0xf9, 0xb3, 0xb5, 0xb5, 0xe2, + 0x62, 0xb9, 0xb6, 0x09, 0x11, 0x1d, 0xca, 0x43, 0x2f, 0x1a, 0x3a, 0x8f, 0xb9, 0xed, 0x3c, 0x3d, + 0x94, 0xbb, 0x58, 0x24, 0x0f, 0x25, 0x43, 0x26, 0x77, 0xa1, 0xea, 0x8e, 0xa2, 0xc0, 0xb1, 0xbd, + 0x01, 0x7f, 0x8a, 0x99, 0xae, 0x34, 0x3d, 0x80, 0x9d, 0x46, 0x5d, 0xae, 0x34, 0xe2, 0x37, 0x06, + 0xb4, 0x7f, 0xc2, 0xbe, 0x77, 0xcc, 0x5f, 0x50, 0xa6, 0xfb, 0xc7, 0xaa, 0x35, 0x5a, 0x72, 0xff, + 0x50, 0x44, 0xf2, 0x3e, 0x2c, 0xd0, 0xf5, 0x3b, 0xf0, 0x0f, 0x79, 0xa0, 0x09, 0x2d, 0xdd, 0x3f, + 0xac, 0x2c, 0x37, 0x5d, 0x05, 0x11, 0x5d, 0xc8, 0xce, 0xd3, 0xd0, 0xf6, 0xfa, 0x18, 0x13, 0x33, + 0xbb, 0x1c, 0xf5, 0x87, 0x56, 0xa3, 0x26, 0x91, 0xcd, 0x39, 0x4f, 0xc3, 0x46, 0x9f, 0xdc, 0x81, + 0x39, 0xcc, 0x3c, 0xc1, 0x03, 0x60, 0xa6, 0x69, 0x30, 0xe7, 0x84, 0x4c, 0x83, 0xa8, 0x74, 0x20, + 0x8f, 0x43, 0x7c, 0x94, 0xc2, 0xf3, 0x3f, 0xa4, 0xfb, 0xa4, 0x65, 0xe1, 0x4b, 0x15, 0xb9, 0x8a, + 0x1c, 0x9d, 0x56, 0x71, 0xe4, 0x46, 0xb6, 0xf7, 0x09, 0xcf, 0xe0, 0x90, 0xfe, 0x5c, 0xdb, 0x8d, + 0x1a, 0x1f, 0xca, 0x9f, 0x1b, 0xb9, 0x51, 0xe3, 0x13, 0x3e, 0x74, 0x47, 0x93, 0xc7, 0xa8, 0x4b, + 0x2f, 0x18, 0xba, 0xa3, 0x49, 0x76, 0xe8, 0x8e, 0x26, 0x8f, 0xc9, 0x35, 0x80, 0xc4, 0x0b, 0x81, + 0xd9, 0x77, 0x4c, 0x09, 0xf2, 0xcd, 0xca, 0xff, 0xf8, 0x97, 0xd7, 0x95, 0x6d, 0x80, 0xaa, 0x88, + 0x9a, 0x43, 0xe5, 0xe9, 0x8d, 0x22, 0xa6, 0xe4, 0x26, 0x2c, 0xcb, 0x31, 0x7d, 0xf8, 0xae, 0xbe, + 0xe4, 0x8c, 0x3d, 0x11, 0xd5, 0x67, 0x76, 0x22, 0x84, 0x57, 0x61, 0x3d, 0xf5, 0x04, 0x28, 0x71, + 0x08, 0x34, 0x55, 0xb9, 0x00, 0x0f, 0xd1, 0x1a, 0x40, 0x18, 0x39, 0x41, 0x64, 0x0f, 0x9c, 0xe8, + 0x34, 0xea, 0xdd, 0x2a, 0xdd, 0x98, 0x99, 0xc7, 0x35, 0xd2, 0xd5, 0x9d, 0xc8, 0x65, 0x8d, 0xd3, + 0x9a, 0x70, 0x71, 0xea, 0xa6, 0x49, 0x5e, 0x01, 0xf5, 0xc0, 0xe1, 0x2a, 0xd3, 0xfe, 0x91, 0x33, + 0x1a, 0xb9, 0x43, 0xde, 0xb0, 0x35, 0x01, 0xaf, 0x31, 0x30, 0xe7, 0xf6, 0x81, 0xd4, 0x3b, 0xd2, + 0x6a, 0x39, 0x45, 0xef, 0x70, 0x06, 0x3f, 0x54, 0xe0, 0xca, 0xac, 0xbd, 0x97, 0x5c, 0x82, 0xea, + 0x38, 0xf0, 0x7c, 0x94, 0xf1, 0x79, 0x1f, 0x8a, 0xdf, 0x98, 0x27, 0x02, 0x85, 0xd1, 0xc8, 0x39, + 0xe4, 0x6f, 0x6a, 0xcc, 0x45, 0x84, 0xf4, 0x9c, 0xc3, 0x90, 0x76, 0xf1, 0xc0, 0x3d, 0x70, 0x26, + 0xc3, 0xc8, 0x0e, 0xfb, 0x47, 0xee, 0x00, 0x5f, 0xbd, 0xa1, 0x27, 0xa5, 0xa9, 0xf2, 0x02, 0x4b, + 0xc0, 0x73, 0x35, 0x9e, 0x9b, 0x52, 0xe3, 0x7b, 0x95, 0xaa, 0xa2, 0x96, 0x4c, 0x74, 0x5d, 0xd3, + 0xbe, 0x53, 0x82, 0xcd, 0x69, 0x9b, 0x0d, 0x79, 0xaf, 0xa8, 0x0f, 0x98, 0xd5, 0x47, 0x86, 0xcb, + 0x56, 0x1f, 0x79, 0xf6, 0xdc, 0x81, 0xf8, 0xcd, 0xda, 0xb3, 0xe2, 0x4f, 0x08, 0x18, 0xa5, 0x19, + 0x3b, 0x61, 0xf8, 0x94, 0xee, 0xa7, 0x65, 0x29, 0x0a, 0x31, 0x87, 0xc9, 0x34, 0x02, 0x46, 0xde, + 0x06, 0xe8, 0x0f, 0xfd, 0xd0, 0x45, 0xe7, 0x0a, 0x2e, 0xa8, 0x31, 0x4f, 0xfc, 0x18, 0x2a, 0x5b, + 0xd3, 0x11, 0x5a, 0xf3, 0x07, 0x62, 0x3e, 0x39, 0x70, 0x61, 0xca, 0xe9, 0x42, 0x87, 0x07, 0x1f, + 0xa1, 0xb1, 0xcd, 0x84, 0xe7, 0xff, 0xa2, 0x10, 0x96, 0xb7, 0x26, 0xdb, 0xe3, 0xa5, 0x69, 0x73, + 0xe4, 0x04, 0x48, 0xfe, 0x08, 0xa1, 0xdc, 0xb9, 0xe7, 0xf9, 0x24, 0x88, 0xb9, 0x33, 0xc8, 0x7e, + 0x30, 0x24, 0xd7, 0x61, 0x49, 0x64, 0x2a, 0xa5, 0x17, 0x21, 0xc6, 0x1c, 0x38, 0xe8, 0xbe, 0x8b, + 0x93, 0x07, 0x63, 0xc0, 0xe2, 0xcb, 0x44, 0xbe, 0xf2, 0x16, 0x11, 0xd2, 0x3b, 0x19, 0x8b, 0xd6, + 0x5d, 0x11, 0xf3, 0x3b, 0x7d, 0xb0, 0xf3, 0xd2, 0x7f, 0xaa, 0x88, 0xe1, 0xcf, 0x9f, 0x8c, 0xcf, + 0xaa, 0x1f, 0x01, 0x7c, 0x18, 0xc6, 0x2b, 0x86, 0xff, 0x53, 0x91, 0x4f, 0xac, 0x3a, 0x2e, 0xf2, + 0xf1, 0x9f, 0xe4, 0x16, 0xac, 0x05, 0xcc, 0xb1, 0x38, 0xf2, 0x79, 0x7f, 0xb2, 0xb4, 0x28, 0x2b, + 0x0c, 0xdc, 0xf3, 0xb1, 0x4f, 0x79, 0xbd, 0xee, 0xc5, 0x1d, 0x26, 0x09, 0x0a, 0xe4, 0x75, 0x58, + 0xa4, 0x82, 0x02, 0x86, 0x1f, 0xca, 0xbc, 0x48, 0x41, 0x3c, 0x14, 0xbb, 0xcc, 0xea, 0xc7, 0xfc, + 0x7f, 0xce, 0xeb, 0xdf, 0x96, 0x04, 0x33, 0x59, 0x4c, 0x21, 0x17, 0x60, 0xc1, 0x0f, 0x0e, 0xa5, + 0xa6, 0xcd, 0xfb, 0xc1, 0x21, 0x6d, 0xd7, 0xcb, 0xa0, 0xb2, 0x07, 0x52, 0x2c, 0x50, 0x45, 0x78, + 0x32, 0x62, 0x7a, 0x8c, 0xaa, 0xb9, 0xca, 0xe0, 0xfb, 0xa1, 0x1b, 0x58, 0x27, 0xa3, 0x3e, 0xc5, + 0x0c, 0x43, 0xdf, 0x96, 0xa3, 0x88, 0xf1, 0x66, 0xaf, 0x86, 0xa1, 0x9f, 0x84, 0x13, 0x1b, 0x90, + 0x6d, 0x58, 0xa1, 0x7c, 0xe2, 0x58, 0x66, 0x7c, 0x07, 0xbc, 0x9a, 0x97, 0xa2, 0x4e, 0x46, 0x7d, + 0x51, 0x45, 0x73, 0x39, 0x94, 0x7e, 0x91, 0xfb, 0xa0, 0x4a, 0xe2, 0x26, 0xbe, 0x98, 0xcd, 0x38, + 0xb9, 0x27, 0x6c, 0x24, 0x31, 0xb5, 0x31, 0x3a, 0xf0, 0xcd, 0xb5, 0x7e, 0x1a, 0x10, 0xef, 0x04, + 0xf3, 0xea, 0x82, 0xb9, 0xc9, 0x9b, 0x1b, 0xa2, 0xf7, 0xa4, 0x3d, 0xf4, 0x0f, 0x6d, 0xf7, 0x33, + 0x3a, 0x26, 0xda, 0x1f, 0x28, 0x62, 0xaf, 0x2d, 0x60, 0x4a, 0x34, 0x58, 0x39, 0x72, 0x42, 0x3b, + 0x0c, 0x8f, 0x99, 0x53, 0x1f, 0x0f, 0xa5, 0xbc, 0x74, 0xe4, 0x84, 0x56, 0x78, 0x2c, 0xf2, 0xb6, + 0x9c, 0xa3, 0x38, 0xbe, 0x33, 0x89, 0x8e, 0x6c, 0x59, 0xb8, 0x66, 0x3d, 0x7a, 0xf6, 0xc8, 0x09, + 0x3b, 0xb4, 0x4c, 0xe2, 0x4d, 0x5e, 0x84, 0x55, 0xe4, 0xdb, 0xf7, 0x04, 0x63, 0x0c, 0x46, 0x62, + 0x2e, 0x53, 0xc6, 0x7d, 0x8f, 0x71, 0xe6, 0x83, 0xfb, 0xe3, 0x0a, 0x9c, 0x2f, 0xee, 0x3d, 0x9c, + 0xbe, 0xb4, 0xcf, 0xf1, 0xd9, 0x24, 0xaf, 0xdb, 0x22, 0x85, 0xb0, 0x40, 0x32, 0x45, 0x83, 0x57, + 0x2a, 0x1c, 0xbc, 0x2d, 0x58, 0x47, 0x46, 0x5c, 0x8c, 0x1f, 0x7a, 0x61, 0xc4, 0xe3, 0xa3, 0x98, + 0x6b, 0xb4, 0x80, 0xed, 0xf7, 0x4d, 0x0a, 0x26, 0x2f, 0xc1, 0xaa, 0xd8, 0xb1, 0xfd, 0xa7, 0x23, + 0xfa, 0x61, 0xb6, 0x5d, 0xaf, 0x70, 0x68, 0x07, 0x81, 0xe4, 0x1c, 0xcc, 0x3b, 0xe3, 0x31, 0xfd, + 0x24, 0xdb, 0xa5, 0xe7, 0x9c, 0xf1, 0x98, 0xe5, 0x16, 0xc2, 0x47, 0xa2, 0xf6, 0x01, 0xba, 0x60, + 0x71, 0x1f, 0x52, 0x73, 0x19, 0x81, 0xcc, 0x2d, 0x2b, 0xa4, 0xfb, 0x02, 0xa5, 0x15, 0x28, 0x0b, + 0x88, 0x02, 0xce, 0x38, 0x46, 0xb8, 0x08, 0x55, 0xe1, 0x0c, 0xc0, 0x5e, 0xc5, 0x98, 0x0b, 0x0e, + 0x77, 0x04, 0x78, 0x0b, 0x2e, 0x0c, 0xbc, 0x90, 0x8f, 0x36, 0x6d, 0xd2, 0x78, 0xcc, 0x9f, 0xa5, + 0xb2, 0x30, 0xc6, 0xe6, 0x06, 0x2f, 0xa6, 0x3d, 0xa9, 0x8f, 0xc7, 0xf1, 0xe3, 0xd4, 0x4b, 0x82, + 0xec, 0xb1, 0xc7, 0xe2, 0xb5, 0x31, 0x87, 0x58, 0x5c, 0x1c, 0x80, 0x94, 0x9b, 0x1c, 0x63, 0x5b, + 0x46, 0x10, 0xcb, 0x24, 0x5e, 0x49, 0x36, 0x53, 0x1e, 0x72, 0xc9, 0x05, 0x4d, 0xc6, 0x38, 0x68, + 0x08, 0x25, 0x6f, 0xc3, 0xd4, 0xb9, 0x88, 0x12, 0x6e, 0xd5, 0x3c, 0xc7, 0xca, 0x99, 0xa3, 0x6f, + 0xd3, 0x3f, 0x34, 0xb0, 0x90, 0x7c, 0x00, 0x57, 0x44, 0x05, 0x9d, 0x30, 0xf4, 0x0e, 0x47, 0xb6, + 0x18, 0x05, 0xf4, 0xc5, 0x40, 0x29, 0xb7, 0x6a, 0x5e, 0xe4, 0x38, 0x3a, 0xa2, 0xd4, 0x19, 0x06, + 0x3e, 0x6b, 0xe4, 0xb3, 0xe9, 0x1d, 0x58, 0xe3, 0x02, 0x3b, 0x17, 0x12, 0xb0, 0xb7, 0xf9, 0x16, + 0x46, 0x6f, 0xd2, 0x3c, 0x5f, 0x15, 0x70, 0x50, 0x63, 0x20, 0x28, 0xff, 0x8b, 0x02, 0xe7, 0x0a, + 0x25, 0x7e, 0xf2, 0xeb, 0xc0, 0xde, 0x19, 0x46, 0xbe, 0x1d, 0xb8, 0x7d, 0x6f, 0xec, 0x61, 0xe0, + 0x16, 0xa6, 0x11, 0xbf, 0x33, 0xeb, 0xae, 0x80, 0x6f, 0x16, 0x7b, 0xbe, 0x19, 0x13, 0x31, 0x55, + 0x9d, 0x1a, 0x64, 0xc0, 0x97, 0x3e, 0x82, 0x73, 0x85, 0xa8, 0x05, 0x2a, 0xb4, 0xaf, 0xa5, 0x93, + 0xa5, 0x0b, 0x1b, 0x67, 0xa6, 0xd1, 0x92, 0x6a, 0x8d, 0x37, 0xef, 0x47, 0x71, 0xf3, 0x32, 0x77, + 0x03, 0x62, 0x64, 0x77, 0xb6, 0xa2, 0xeb, 0xad, 0x20, 0x9a, 0xbe, 0xb9, 0x7d, 0x04, 0xe7, 0xf8, + 0xf2, 0x3a, 0x0c, 0x9c, 0xf1, 0x51, 0xc2, 0x8e, 0x55, 0xf4, 0x17, 0x8a, 0xd8, 0xb1, 0x75, 0xb7, + 0x4b, 0xf1, 0x63, 0xae, 0x67, 0x9d, 0x3c, 0x90, 0xb7, 0xe1, 0x37, 0x4a, 0x62, 0x33, 0x2b, 0xa8, + 0x4e, 0xc1, 0xc2, 0x55, 0x8a, 0x16, 0xee, 0xe9, 0x77, 0x8d, 0x36, 0x10, 0x79, 0xbb, 0xe6, 0xf3, + 0x9e, 0xf9, 0xe3, 0x89, 0x6b, 0x1e, 0xaf, 0x88, 0xb4, 0xf9, 0xb1, 0x85, 0x60, 0xae, 0xf7, 0xb3, + 0x20, 0x2a, 0x8b, 0xc7, 0xf9, 0xe0, 0xf9, 0xd1, 0x59, 0x65, 0x80, 0xc6, 0x80, 0xdc, 0x80, 0x65, + 0x76, 0xa3, 0x4b, 0xed, 0x2a, 0x80, 0x30, 0x9d, 0x6e, 0x2d, 0xa2, 0x0f, 0x14, 0xb8, 0xf1, 0xac, + 0x3e, 0x24, 0x0f, 0xe1, 0x3c, 0x7a, 0x05, 0x85, 0x7e, 0x3c, 0x0c, 0x76, 0xdf, 0xe9, 0x1f, 0xb9, + 0x7c, 0xd6, 0x6a, 0x85, 0x83, 0x31, 0x1e, 0x5b, 0x56, 0x47, 0x1a, 0x87, 0xf1, 0xd8, 0x0a, 0x7d, + 0xf1, 0xbb, 0x46, 0xc9, 0x79, 0x1d, 0x06, 0x70, 0x79, 0x06, 0xa5, 0xb4, 0x35, 0x2a, 0xf2, 0xd6, + 0xf8, 0x32, 0xa8, 0x07, 0xee, 0x80, 0x5e, 0x73, 0xdc, 0x01, 0x56, 0xed, 0xd3, 0x3b, 0xd8, 0xf1, + 0xcb, 0xe6, 0x6a, 0x0c, 0xb7, 0x42, 0xff, 0xc1, 0x1d, 0xfe, 0x95, 0x63, 0x71, 0xe8, 0xcb, 0xb7, + 0x52, 0xf2, 0x3a, 0x9c, 0xcd, 0x04, 0xc5, 0x49, 0xa2, 0x2c, 0x98, 0xeb, 0xb4, 0x28, 0x1d, 0x42, + 0xed, 0x26, 0x2c, 0xcb, 0x1b, 0x89, 0x90, 0xf0, 0x06, 0xc9, 0xd6, 0xc1, 0x3f, 0x37, 0x11, 0x8d, + 0x2a, 0xbc, 0xd0, 0x9e, 0xe6, 0xae, 0xf5, 0x1a, 0x90, 0xf8, 0xe6, 0x12, 0x6f, 0x14, 0xfc, 0x83, + 0xeb, 0xa2, 0x24, 0x5e, 0xe1, 0xfc, 0xb3, 0xbf, 0x3d, 0x0f, 0x67, 0x0b, 0x6e, 0xc2, 0xe4, 0x35, + 0x50, 0xbd, 0x51, 0xe4, 0x1e, 0x06, 0xd2, 0xd5, 0x8c, 0x49, 0xef, 0xa5, 0x4d, 0xc5, 0x5c, 0x93, + 0xca, 0xb8, 0x8a, 0x73, 0x9e, 0x65, 0xf9, 0xe7, 0xdf, 0xe3, 0xbf, 0xe8, 0x06, 0xe2, 0x04, 0x42, + 0x7b, 0x47, 0xff, 0x25, 0x0d, 0x58, 0xc7, 0x8c, 0x20, 0xa1, 0xe7, 0x63, 0x62, 0x11, 0x14, 0xc5, + 0x2a, 0xa9, 0xfb, 0x32, 0xd6, 0xa4, 0x2b, 0x21, 0x51, 0x59, 0xcc, 0x54, 0xc7, 0x19, 0x08, 0xf9, + 0x45, 0xb8, 0x24, 0x9d, 0xa8, 0x76, 0x66, 0xf5, 0xe1, 0x03, 0x0c, 0xf3, 0x82, 0x13, 0x9f, 0xad, + 0xf5, 0xd4, 0x3a, 0xdc, 0x06, 0x96, 0x45, 0xd8, 0x1b, 0x8c, 0xed, 0x5c, 0x0a, 0x19, 0x6c, 0x2e, + 0x4b, 0x88, 0x70, 0x89, 0x62, 0x35, 0x06, 0xe3, 0x4c, 0x36, 0x19, 0x6c, 0x75, 0xb7, 0x70, 0x85, + 0x2e, 0xe0, 0x0a, 0xbd, 0x2a, 0x37, 0x26, 0xb7, 0x3e, 0xb1, 0x17, 0x0b, 0xd6, 0xe8, 0x21, 0xac, + 0x27, 0x27, 0x9d, 0x38, 0xa0, 0xab, 0xa9, 0xac, 0xff, 0xc8, 0x50, 0x48, 0x90, 0xec, 0xc4, 0x66, + 0x81, 0x22, 0x72, 0x84, 0x72, 0x38, 0x94, 0x49, 0x8a, 0x20, 0x24, 0x4d, 0xd8, 0x70, 0x9e, 0x86, + 0x22, 0x37, 0x69, 0x18, 0x7f, 0x6b, 0x31, 0xff, 0x2d, 0x61, 0xaf, 0x63, 0xa4, 0x26, 0x71, 0x9e, + 0x86, 0x3c, 0x65, 0x69, 0x28, 0xb8, 0x7d, 0x0c, 0x84, 0x89, 0x1d, 0xa9, 0x7a, 0xc3, 0xb3, 0x78, + 0xf1, 0xc4, 0xa6, 0x39, 0x4a, 0x39, 0xa8, 0x1b, 0x96, 0xca, 0x35, 0xef, 0xa5, 0x75, 0xac, 0x4b, + 0x29, 0x03, 0x61, 0xb6, 0xb7, 0x99, 0xf1, 0x52, 0xc2, 0x97, 0xaf, 0x9a, 0x12, 0x98, 0xaf, 0x86, + 0xcf, 0x15, 0x50, 0xb3, 0x2c, 0xc8, 0xbb, 0x30, 0xcf, 0x84, 0x09, 0x7e, 0x32, 0x69, 0xc5, 0xdf, + 0x62, 0x23, 0xc8, 0xe4, 0x8a, 0xbd, 0x33, 0x26, 0xa7, 0x21, 0xdf, 0x80, 0x8a, 0xef, 0x0d, 0x84, + 0x21, 0xf3, 0xc6, 0x2c, 0xda, 0x4e, 0xa3, 0x5e, 0x43, 0xe5, 0xa7, 0x37, 0xe0, 0x57, 0x8f, 0xed, + 0x2a, 0xcc, 0xb3, 0x0e, 0xd3, 0x3e, 0x86, 0xcb, 0x33, 0x3e, 0x48, 0x0c, 0x58, 0xcb, 0x18, 0x79, + 0x4f, 0x69, 0xff, 0x75, 0x12, 0xfb, 0x6f, 0x20, 0x64, 0xe2, 0x21, 0x5c, 0x9c, 0x5a, 0x41, 0xd2, + 0x98, 0xba, 0x33, 0x60, 0xb8, 0x91, 0x6c, 0x99, 0x3c, 0x09, 0x33, 0xbb, 0x06, 0xff, 0xda, 0xef, + 0x94, 0xe0, 0x6c, 0xc1, 0xe4, 0x20, 0x1a, 0x94, 0xc4, 0x1e, 0x9e, 0x77, 0x21, 0xdc, 0x3b, 0x63, + 0x96, 0xbc, 0x01, 0xb9, 0x0b, 0x80, 0xb9, 0x5d, 0x03, 0xf7, 0xd0, 0xfd, 0x8c, 0xeb, 0x08, 0xf0, + 0xe6, 0x9e, 0x40, 0x53, 0x34, 0x8b, 0x68, 0x96, 0xa1, 0x60, 0x72, 0x1b, 0xc0, 0xfd, 0xac, 0x3f, + 0x9c, 0x0c, 0xdc, 0xf8, 0xd6, 0x55, 0xf0, 0x19, 0xc5, 0x5c, 0xe4, 0x58, 0x8d, 0x01, 0xd9, 0x03, + 0x22, 0x48, 0xa4, 0xaf, 0x56, 0x9e, 0xf1, 0x55, 0xc5, 0x54, 0x39, 0x55, 0x5b, 0x7c, 0x9c, 0x8f, + 0xee, 0x22, 0x2c, 0x78, 0x23, 0x2c, 0xa1, 0xff, 0x72, 0x24, 0xed, 0x8f, 0x14, 0xde, 0x1f, 0xe9, + 0x45, 0x4e, 0x7a, 0xc0, 0x7d, 0x08, 0xf8, 0x86, 0x70, 0x6b, 0xfa, 0x86, 0x20, 0x9b, 0x66, 0x79, + 0xdc, 0x19, 0x04, 0xc8, 0x06, 0x48, 0x06, 0xf9, 0x12, 0x46, 0x53, 0x3e, 0x7c, 0x1f, 0xc1, 0xb9, + 0xc2, 0x0d, 0x9b, 0xde, 0x22, 0xd0, 0x15, 0x39, 0xb9, 0x20, 0x2f, 0xd0, 0xdf, 0xf4, 0x86, 0x7c, + 0x13, 0x96, 0x1f, 0xbb, 0x4e, 0xe0, 0x06, 0xfc, 0x7a, 0xc6, 0x4f, 0x45, 0x06, 0x93, 0x6f, 0x67, + 0x83, 0xf4, 0xe9, 0xc4, 0xad, 0x2e, 0xa4, 0x05, 0x67, 0xd9, 0xae, 0xe1, 0x1d, 0xa3, 0x46, 0x80, + 0x5b, 0x6a, 0x94, 0xd4, 0x9d, 0x18, 0x49, 0xf0, 0xfe, 0xd1, 0x40, 0x2c, 0x46, 0x6d, 0xae, 0x1f, + 0x66, 0x41, 0x54, 0xa8, 0x39, 0x5f, 0x8c, 0x4d, 0xb6, 0x61, 0x89, 0x31, 0x67, 0xba, 0x21, 0x66, + 0x62, 0xbf, 0x39, 0xf3, 0x0b, 0x35, 0x7c, 0xa1, 0x13, 0xc6, 0xff, 0xd3, 0x4b, 0x19, 0x7a, 0x33, + 0xd9, 0xc7, 0xb2, 0x07, 0x81, 0xb9, 0x8c, 0x40, 0xee, 0x39, 0xa0, 0xfd, 0x67, 0x45, 0x34, 0x35, + 0xa5, 0x5e, 0xa6, 0x27, 0x6b, 0xe8, 0x8e, 0x84, 0x17, 0xc5, 0xa2, 0xc9, 0x7f, 0x3d, 0xe7, 0x69, + 0x4f, 0xde, 0x86, 0x65, 0xca, 0xf6, 0x70, 0x32, 0x62, 0x27, 0x6e, 0x39, 0x15, 0x0f, 0xaf, 0xc5, + 0x8a, 0xe8, 0xb0, 0xed, 0x9d, 0x31, 0x97, 0x8e, 0x93, 0x9f, 0xe4, 0x75, 0x58, 0x0c, 0x8f, 0xa3, + 0xb1, 0x7c, 0x4e, 0x0b, 0x53, 0x9b, 0xd5, 0xea, 0x75, 0x39, 0x49, 0x95, 0xe2, 0x24, 0x2a, 0x93, + 0xed, 0x79, 0x66, 0x6c, 0xd3, 0x5e, 0x85, 0x25, 0x89, 0x37, 0x6d, 0x0c, 0x7b, 0xcf, 0x2a, 0x1a, + 0xc3, 0x7e, 0xf1, 0xc1, 0x7e, 0x0c, 0x55, 0xc1, 0x92, 0x10, 0xa8, 0x1c, 0xf9, 0xa1, 0x90, 0x73, + 0xf0, 0x7f, 0x0a, 0xc3, 0x8b, 0x1c, 0x6d, 0xe4, 0x9c, 0x89, 0xff, 0xa3, 0x38, 0x8d, 0x6a, 0x61, + 0x8c, 0xa2, 0x8c, 0x3e, 0xcc, 0xb1, 0x06, 0x85, 0xc2, 0x7b, 0xc3, 0x90, 0x79, 0x36, 0x0b, 0x5d, + 0x4e, 0x7c, 0x0f, 0xc9, 0xe8, 0xe3, 0xa7, 0x89, 0x8d, 0x29, 0xa9, 0xb9, 0x94, 0x97, 0x9a, 0x59, + 0x9c, 0x33, 0x4e, 0xc9, 0xbe, 0x0c, 0x08, 0x43, 0xa9, 0x59, 0x12, 0x8c, 0x2a, 0x29, 0xc1, 0x48, + 0x52, 0xcc, 0x26, 0xa3, 0xc7, 0x84, 0x6e, 0xa1, 0x98, 0xcd, 0x8a, 0x6a, 0x3f, 0x88, 0x67, 0x48, + 0xca, 0x22, 0x40, 0xee, 0xc0, 0x39, 0xa6, 0x1d, 0xe1, 0xe9, 0xeb, 0x33, 0x32, 0xe2, 0x59, 0x2c, + 0x64, 0xd9, 0xef, 0x62, 0x59, 0xf1, 0xd9, 0x8a, 0x47, 0xf2, 0x06, 0x6c, 0xc4, 0xb9, 0x93, 0xc3, + 0x27, 0xde, 0x98, 0xe5, 0x8e, 0x3c, 0xe1, 0x7a, 0x0b, 0x22, 0xca, 0xac, 0x27, 0xde, 0x18, 0xf3, + 0x48, 0x8a, 0x1e, 0xfe, 0xd7, 0x25, 0xa1, 0xce, 0xde, 0xf6, 0xfd, 0x28, 0x8c, 0x02, 0x67, 0x9c, + 0xb2, 0x79, 0x92, 0x63, 0xb8, 0x88, 0x55, 0xba, 0x83, 0x09, 0xac, 0xfc, 0x40, 0xa8, 0xff, 0xe3, + 0x05, 0xb6, 0x74, 0xe7, 0xeb, 0x69, 0x7d, 0x94, 0x4e, 0xb1, 0x75, 0x19, 0x99, 0xae, 0x2b, 0x89, + 0xeb, 0xde, 0x19, 0xf3, 0x02, 0xe3, 0x99, 0xc3, 0x22, 0x7b, 0x05, 0x7b, 0x4d, 0xd6, 0xe8, 0xb9, + 0x9d, 0x6c, 0x3c, 0x69, 0xae, 0xf2, 0x96, 0x44, 0xde, 0x87, 0x45, 0x6f, 0x20, 0x27, 0x6d, 0xce, + 0x9a, 0xdb, 0x1a, 0x03, 0x96, 0x3e, 0x22, 0xe1, 0x41, 0x97, 0x86, 0xc7, 0xa1, 0xdb, 0x2b, 0x29, + 0xc9, 0x45, 0xdb, 0x16, 0x9a, 0xd3, 0x3c, 0x19, 0x59, 0x4d, 0xce, 0x3e, 0x3c, 0xe7, 0x70, 0x17, + 0x48, 0x12, 0x58, 0x98, 0xfc, 0x97, 0xf6, 0x77, 0xe1, 0xe5, 0xd3, 0xf6, 0x11, 0xdd, 0x31, 0xa6, + 0x74, 0xf8, 0x22, 0x8b, 0x7b, 0x9d, 0xee, 0xb7, 0x9b, 0x20, 0xc7, 0xeb, 0xf7, 0xc4, 0x14, 0x11, + 0xb0, 0xfd, 0xc0, 0xd3, 0xfe, 0x67, 0x19, 0x56, 0xd3, 0xf6, 0x70, 0xf2, 0x2a, 0x54, 0xa4, 0x8d, + 0xf2, 0x42, 0x81, 0xd1, 0x1c, 0xb7, 0x47, 0x44, 0x3a, 0xd5, 0xc6, 0x48, 0xee, 0xc1, 0x2a, 0x7a, + 0xe8, 0xa3, 0x80, 0x18, 0x79, 0xdc, 0x44, 0x74, 0x5a, 0xe3, 0xcf, 0x32, 0xa5, 0xa5, 0x07, 0x23, + 0x2d, 0x94, 0xcc, 0x9d, 0x95, 0xe9, 0xe6, 0x4e, 0xde, 0x94, 0x29, 0xe6, 0xce, 0xb9, 0x19, 0xe6, + 0xce, 0x84, 0x52, 0x36, 0x77, 0xa2, 0xd1, 0x7b, 0x61, 0x9a, 0xd1, 0x3b, 0xa1, 0x61, 0x46, 0xef, + 0xc4, 0x5c, 0x59, 0x9d, 0x6a, 0xae, 0x4c, 0x68, 0xb8, 0xb9, 0x32, 0x31, 0x20, 0x2e, 0x4e, 0x35, + 0x20, 0x4a, 0x44, 0xcc, 0x80, 0xf8, 0x22, 0xef, 0xd8, 0xc0, 0x79, 0x6a, 0x63, 0x8f, 0xf3, 0x1b, + 0x0f, 0x76, 0x99, 0xe9, 0x3c, 0x45, 0xd7, 0x5b, 0x2a, 0x98, 0x70, 0x7f, 0x5d, 0xed, 0x87, 0x99, + 0x0d, 0x48, 0x8c, 0xf9, 0x4b, 0xb0, 0xca, 0xce, 0x61, 0x1e, 0x4f, 0x9d, 0x1d, 0xc4, 0x2b, 0xe6, + 0x8a, 0x80, 0x32, 0x7d, 0xe9, 0x2f, 0xc0, 0x5a, 0x8c, 0xc6, 0x55, 0x86, 0x18, 0x1a, 0xc0, 0x8c, + 0xa9, 0xb9, 0xb2, 0x50, 0xe6, 0x17, 0xf0, 0x58, 0x71, 0x29, 0x7e, 0x2c, 0x90, 0xd8, 0x6b, 0x40, + 0x12, 0xb4, 0xf8, 0xf5, 0x42, 0x05, 0x51, 0xd7, 0x63, 0xd4, 0xf8, 0x89, 0xc1, 0x3f, 0x51, 0x32, + 0x86, 0xba, 0x9f, 0x57, 0xf5, 0x5f, 0x85, 0xf8, 0xeb, 0x36, 0x37, 0xb6, 0x88, 0x16, 0xa8, 0xa2, + 0xa0, 0xcb, 0xe1, 0xda, 0x61, 0x56, 0x2d, 0xf6, 0x73, 0xaa, 0x95, 0xf6, 0xa3, 0x72, 0xca, 0x88, + 0x21, 0x3e, 0x43, 0xe5, 0x9b, 0xd0, 0xb7, 0xf9, 0x10, 0xf3, 0xed, 0xf7, 0xe6, 0x94, 0x69, 0xca, + 0xfd, 0xb5, 0x2d, 0xab, 0x63, 0x42, 0x18, 0xfa, 0xc2, 0x7d, 0xdb, 0x66, 0xea, 0x1e, 0xe9, 0x1e, + 0x27, 0xd8, 0xb1, 0xbd, 0x76, 0x6b, 0x36, 0x3b, 0xa1, 0x25, 0xa6, 0xab, 0x14, 0xd5, 0x3e, 0xf1, + 0x2f, 0xf1, 0x81, 0x7d, 0x40, 0x9b, 0x5f, 0x98, 0x66, 0x5e, 0x2e, 0x50, 0xec, 0xe5, 0x98, 0x63, + 0x2f, 0x21, 0x67, 0x54, 0x21, 0x87, 0x32, 0x5b, 0x03, 0x96, 0xd1, 0x44, 0x20, 0x18, 0x56, 0x0a, + 0xdc, 0x0b, 0xf2, 0x8d, 0xaf, 0x35, 0x5a, 0xe6, 0x12, 0xa5, 0x13, 0x6c, 0x8e, 0xe0, 0xa2, 0xac, + 0xd8, 0x4f, 0x57, 0x72, 0x4e, 0x64, 0x41, 0x98, 0xd9, 0x03, 0x89, 0xfe, 0x1f, 0xab, 0x7a, 0xde, + 0x49, 0x03, 0x38, 0x1a, 0x3e, 0x5d, 0x98, 0x3e, 0x26, 0x33, 0x72, 0x52, 0x26, 0xb2, 0x4d, 0x49, + 0x96, 0x6d, 0x64, 0x3d, 0x7f, 0x39, 0xad, 0xe7, 0xdf, 0x81, 0x1b, 0x74, 0x3b, 0xe2, 0x83, 0xea, + 0x7e, 0xea, 0x06, 0x27, 0xfe, 0x08, 0x63, 0xdd, 0x8d, 0xe3, 0x55, 0xc9, 0x0c, 0x13, 0x57, 0x28, + 0x1e, 0x0e, 0x99, 0xc1, 0xb1, 0x5a, 0x88, 0xc4, 0x62, 0x38, 0xfe, 0xab, 0x32, 0xbc, 0x70, 0x8a, + 0x71, 0x9f, 0x51, 0xf7, 0x5f, 0x4a, 0x4b, 0xe0, 0xa5, 0x94, 0xfe, 0x93, 0x32, 0xe5, 0x87, 0xcb, + 0xc9, 0xa8, 0x3f, 0x45, 0xfe, 0xfe, 0x75, 0x58, 0x63, 0x27, 0x08, 0x7b, 0xbb, 0x71, 0x30, 0x19, + 0x9e, 0xe2, 0x08, 0xb9, 0x2c, 0x1e, 0x9a, 0x67, 0x48, 0xf1, 0x54, 0xc1, 0x8d, 0xd3, 0x8a, 0x61, + 0xa4, 0x07, 0x4b, 0x88, 0x76, 0xe0, 0x78, 0xc3, 0x53, 0xbd, 0x78, 0x16, 0xcf, 0xd8, 0x65, 0x32, + 0xf6, 0xe4, 0x8c, 0x02, 0x76, 0xf0, 0x37, 0xb9, 0x05, 0x6b, 0xa3, 0xc9, 0x31, 0x95, 0x2d, 0xd9, + 0xa4, 0xe2, 0x2e, 0xb2, 0x73, 0xe6, 0xca, 0x68, 0x72, 0xac, 0x8f, 0xc7, 0x38, 0x37, 0xd0, 0x97, + 0x76, 0x9d, 0xe2, 0xb1, 0xe5, 0x2f, 0x30, 0xe7, 0x11, 0x93, 0x32, 0x60, 0x1b, 0x00, 0xc7, 0xdd, + 0x00, 0xf6, 0xb2, 0x82, 0xe7, 0xf6, 0x64, 0x3f, 0xb4, 0xff, 0x5d, 0x12, 0x5a, 0xdd, 0xe9, 0x0b, + 0xe8, 0x6f, 0x87, 0xa8, 0x60, 0x88, 0x5e, 0x06, 0x95, 0x76, 0x7d, 0xb2, 0x3b, 0xc5, 0x63, 0xb4, + 0x3a, 0x9a, 0x1c, 0xc7, 0x7d, 0x27, 0x77, 0xfc, 0xbc, 0xdc, 0xf1, 0x6f, 0x0b, 0xad, 0x6f, 0xe1, + 0x3e, 0x33, 0xbd, 0xcb, 0xa9, 0xe8, 0x75, 0xeb, 0x74, 0xbb, 0xc9, 0xdf, 0x8e, 0x5b, 0xc1, 0xb8, + 0x65, 0x4c, 0xa0, 0x73, 0x39, 0x13, 0x68, 0xc1, 0xda, 0x9b, 0x2f, 0x5a, 0x7b, 0x39, 0x83, 0xeb, + 0x42, 0x81, 0xc1, 0xb5, 0x70, 0x81, 0x56, 0x9f, 0xb1, 0x40, 0x17, 0xe5, 0x79, 0xf2, 0xdf, 0x4b, + 0x42, 0xf4, 0x4a, 0xdf, 0xa5, 0x3e, 0x82, 0xb3, 0xe2, 0x2e, 0xc5, 0x8e, 0xa0, 0xc4, 0x8e, 0xbe, + 0x74, 0xe7, 0x95, 0xa2, 0x5b, 0x14, 0xa2, 0x15, 0xdc, 0x74, 0xd6, 0xf9, 0xfd, 0x29, 0x29, 0xff, + 0xff, 0xe7, 0xe6, 0x44, 0x1e, 0xc1, 0x79, 0x4c, 0xb5, 0xd3, 0x97, 0x3d, 0x00, 0xec, 0xc0, 0x3d, + 0xe0, 0xf3, 0xe1, 0x66, 0xee, 0x9e, 0xe1, 0xf5, 0xa5, 0xea, 0x98, 0xee, 0xc1, 0xde, 0x19, 0x73, + 0x23, 0x2c, 0x80, 0x67, 0x2f, 0x65, 0x7f, 0xa4, 0x80, 0xf6, 0xec, 0xfe, 0xc2, 0xfb, 0x73, 0xb6, + 0xc3, 0xe9, 0xfd, 0x59, 0xea, 0xbd, 0x17, 0x60, 0x25, 0x70, 0x0f, 0x02, 0x37, 0x3c, 0x4a, 0x29, + 0xb9, 0x96, 0x39, 0x50, 0x74, 0x8c, 0x88, 0xf7, 0xfd, 0x5c, 0xb7, 0x1a, 0x41, 0xa4, 0xed, 0xc4, + 0x77, 0xed, 0xc2, 0x71, 0xa0, 0xb3, 0x49, 0xae, 0x20, 0xfb, 0x71, 0xaf, 0x52, 0x2d, 0xa9, 0x65, + 0x93, 0x47, 0x25, 0x3f, 0xf0, 0x86, 0xae, 0xf6, 0xef, 0x62, 0xc9, 0xa2, 0xa8, 0xf3, 0xc8, 0x47, + 0xd2, 0x8b, 0xa7, 0x72, 0x4e, 0x9e, 0x29, 0x22, 0x39, 0x8d, 0x06, 0xb2, 0xf9, 0x15, 0x69, 0x20, + 0xef, 0x0a, 0xb7, 0x69, 0xba, 0xe7, 0x3d, 0xb8, 0x4d, 0x5e, 0x81, 0x05, 0xe6, 0x29, 0x2d, 0xaa, + 0xbb, 0x96, 0xaa, 0xee, 0x83, 0xdb, 0xa6, 0x28, 0xd7, 0x3e, 0x8f, 0xfd, 0x53, 0x72, 0x8d, 0x78, + 0x70, 0x9b, 0xbc, 0x7d, 0xba, 0x17, 0x4c, 0x55, 0xf1, 0x82, 0x29, 0x7e, 0xbd, 0xf4, 0x4e, 0xea, + 0xf5, 0xd2, 0x8b, 0xb3, 0x7b, 0x8b, 0x7b, 0x1d, 0xb1, 0x48, 0xcf, 0x71, 0xac, 0x50, 0xed, 0xaf, + 0x4b, 0x70, 0x75, 0x26, 0x05, 0xb9, 0x02, 0x55, 0xbd, 0xdb, 0xe8, 0x25, 0xe3, 0x4b, 0xd7, 0x8c, + 0x80, 0x90, 0x5d, 0x58, 0xdc, 0x76, 0x42, 0xaf, 0x4f, 0xa7, 0x71, 0xa1, 0x11, 0x3c, 0xc7, 0x36, + 0x46, 0xdf, 0x3b, 0x63, 0x26, 0xb4, 0xc4, 0x86, 0x75, 0x5c, 0x0b, 0xa9, 0x3c, 0x9a, 0xe5, 0x02, + 0x3d, 0x4d, 0x8e, 0x61, 0x8e, 0x8c, 0xee, 0x33, 0x39, 0x20, 0x79, 0x0c, 0xc4, 0xb2, 0xf6, 0x6a, + 0x6e, 0x10, 0x71, 0xfd, 0x45, 0xe4, 0xc5, 0xcf, 0x61, 0xde, 0x78, 0x46, 0xdf, 0xe5, 0xe8, 0xf6, + 0xce, 0x98, 0x05, 0xdc, 0xc8, 0x4d, 0x90, 0x13, 0xbe, 0xe2, 0x19, 0xbd, 0xbc, 0x77, 0xc6, 0x84, + 0x71, 0x9c, 0xf8, 0x35, 0xbb, 0x13, 0x7c, 0x2a, 0x44, 0xa2, 0xe9, 0xfd, 0xf4, 0x1c, 0x81, 0xf6, + 0x5f, 0x86, 0x6a, 0x57, 0xb8, 0x25, 0x4a, 0x2f, 0x0f, 0x85, 0x0b, 0xa2, 0x19, 0x97, 0x6a, 0xff, + 0x50, 0x11, 0x3a, 0x9d, 0x67, 0xf7, 0xa7, 0x94, 0x09, 0x75, 0x30, 0x3b, 0x13, 0xea, 0xe0, 0x67, + 0xcc, 0x84, 0xaa, 0x79, 0xf0, 0xca, 0xa9, 0xfb, 0x9e, 0xbc, 0x0b, 0x2a, 0x26, 0x99, 0x74, 0xa4, + 0x71, 0x64, 0x4b, 0x70, 0x3d, 0xce, 0xbc, 0xb2, 0xc7, 0x33, 0xf3, 0x9a, 0x6b, 0xfd, 0x34, 0xb5, + 0xf6, 0x87, 0x3c, 0xe3, 0x4e, 0x63, 0xd0, 0xcd, 0x58, 0x5b, 0xbf, 0xec, 0x63, 0x55, 0x23, 0xb5, + 0x1e, 0x5f, 0x90, 0x32, 0x7a, 0xe7, 0xbf, 0x35, 0xfd, 0xcd, 0xaa, 0xb4, 0x38, 0xff, 0x59, 0x19, + 0xae, 0xcc, 0x22, 0x27, 0x3a, 0xa8, 0x46, 0x26, 0x77, 0xbf, 0x9c, 0x01, 0x2e, 0x97, 0xf4, 0xdf, + 0xcc, 0xa1, 0xd3, 0xb1, 0x65, 0xb0, 0xf8, 0x25, 0x26, 0x8e, 0x2d, 0x27, 0xa5, 0x63, 0x2b, 0x8a, + 0xc9, 0x0b, 0x30, 0xaf, 0xd7, 0xac, 0x24, 0x53, 0x2d, 0x3e, 0x99, 0x72, 0xfa, 0x21, 0x3e, 0xc6, + 0xe1, 0x45, 0xe4, 0xd7, 0xf2, 0xc9, 0x99, 0x79, 0x8a, 0xda, 0xcb, 0x52, 0x87, 0xe4, 0x92, 0x61, + 0x61, 0x7d, 0x93, 0xe4, 0x4d, 0x3c, 0x1f, 0x8a, 0x99, 0x4f, 0xf4, 0xac, 0xc1, 0x7c, 0x37, 0x70, + 0x43, 0x37, 0x92, 0x9f, 0x33, 0x8d, 0x11, 0x62, 0xf2, 0x12, 0xfe, 0xd8, 0xc8, 0x39, 0x61, 0xb1, + 0xa5, 0xe6, 0xe5, 0x18, 0x82, 0xf8, 0x3a, 0x89, 0x82, 0x4d, 0x09, 0x85, 0x12, 0x34, 0x9d, 0xc9, + 0xa8, 0x7f, 0xb4, 0x6f, 0x36, 0xb9, 0x70, 0xc5, 0x08, 0x86, 0x08, 0xa5, 0x0d, 0x0c, 0x4d, 0x09, + 0x45, 0xfb, 0x2d, 0x05, 0x36, 0x8a, 0xda, 0x41, 0xae, 0x40, 0x65, 0x54, 0x98, 0x87, 0x7a, 0xc4, + 0x42, 0xe2, 0x2c, 0xa1, 0xf1, 0xee, 0xc0, 0x0f, 0x8e, 0x9d, 0x48, 0x7e, 0xf4, 0x25, 0x81, 0x4d, + 0x34, 0x36, 0xee, 0xe0, 0xff, 0xe4, 0xba, 0x38, 0x95, 0xca, 0xb9, 0xcc, 0xd5, 0xf8, 0x47, 0xd3, + 0x01, 0x1a, 0x83, 0x6e, 0x67, 0xcc, 0x92, 0x31, 0xbd, 0x09, 0x15, 0x5a, 0xad, 0xcc, 0xec, 0xa5, + 0xf3, 0x47, 0x6f, 0x35, 0x39, 0x12, 0xab, 0x55, 0xe8, 0x1c, 0x0f, 0x4d, 0x44, 0xd6, 0x1e, 0xc2, + 0x6a, 0x1a, 0x83, 0x18, 0xe9, 0x78, 0xfc, 0x4b, 0x77, 0x54, 0xce, 0x69, 0xdb, 0xf7, 0xd9, 0xc3, + 0xe3, 0xed, 0x8b, 0x3f, 0xf9, 0xe2, 0x3a, 0xd0, 0x9f, 0x8c, 0xa6, 0x28, 0x5e, 0xbf, 0xf6, 0xbb, + 0x25, 0xd8, 0x48, 0x62, 0x1d, 0x89, 0x35, 0xf4, 0x37, 0x36, 0xf0, 0x86, 0x9e, 0x0a, 0x0c, 0x21, + 0x44, 0xcb, 0x7c, 0x03, 0x67, 0xbc, 0x47, 0xdf, 0x85, 0xcd, 0x69, 0xf8, 0xe4, 0x55, 0x58, 0xc4, + 0x90, 0x9b, 0x63, 0xa7, 0xef, 0xca, 0xdb, 0xec, 0x48, 0x00, 0xcd, 0xa4, 0x5c, 0xfb, 0x13, 0x05, + 0x2e, 0xf1, 0xe7, 0xb2, 0x2d, 0xc7, 0x1b, 0xa1, 0xad, 0xa8, 0xef, 0x7e, 0x35, 0x81, 0x63, 0x76, + 0x53, 0xfb, 0xd8, 0x4b, 0xe9, 0x57, 0xd1, 0xb9, 0xaf, 0x4d, 0x6f, 0x2d, 0x79, 0x05, 0xc3, 0xc8, + 0x72, 0x77, 0xb2, 0x0a, 0x0b, 0xd4, 0x35, 0xa2, 0x00, 0x39, 0x50, 0x17, 0x62, 0x68, 0x7f, 0x0f, + 0xae, 0xcd, 0xfe, 0x00, 0xf9, 0x55, 0x58, 0xc1, 0x3c, 0xa9, 0xfb, 0xe3, 0xc3, 0xc0, 0x19, 0xb8, + 0x42, 0x8b, 0x28, 0x94, 0xdd, 0x72, 0x19, 0x8b, 0x8a, 0xcb, 0x03, 0x47, 0x1d, 0x62, 0x06, 0x56, + 0x4e, 0x94, 0x7a, 0x93, 0x2e, 0x73, 0xd3, 0xbe, 0xa3, 0x00, 0xc9, 0xf3, 0x20, 0xdf, 0x80, 0xe5, + 0xfd, 0x5e, 0xcd, 0x8a, 0x9c, 0x20, 0xda, 0xf3, 0x27, 0x01, 0x0f, 0x49, 0xcb, 0xe2, 0x08, 0x45, + 0x7d, 0x9b, 0x59, 0x05, 0x8f, 0xfc, 0x49, 0x60, 0xa6, 0xf0, 0x30, 0xc3, 0xa6, 0xeb, 0x3e, 0x19, + 0x38, 0x27, 0xe9, 0x0c, 0x9b, 0x1c, 0x96, 0xca, 0xb0, 0xc9, 0x61, 0xda, 0x0f, 0x14, 0xb8, 0x2c, + 0xde, 0x49, 0x0c, 0x0a, 0xea, 0x52, 0xc3, 0x68, 0x79, 0x81, 0xc8, 0x72, 0x30, 0x4b, 0x88, 0x5f, + 0x17, 0x01, 0x25, 0xb1, 0x82, 0x28, 0xcd, 0x33, 0x5a, 0xf2, 0x4b, 0x50, 0xb1, 0x22, 0x7f, 0x7c, + 0x8a, 0x88, 0x92, 0x6a, 0x3c, 0xa2, 0x91, 0x3f, 0x46, 0x16, 0x48, 0xa9, 0xb9, 0xb0, 0x21, 0x57, + 0x4e, 0xd4, 0x98, 0xb4, 0x60, 0x81, 0x87, 0x23, 0xce, 0x38, 0xe0, 0xcd, 0x68, 0xd3, 0xf6, 0x9a, + 0x08, 0x5b, 0xc9, 0xe3, 0xf1, 0x9b, 0x82, 0x87, 0xf6, 0x8f, 0x14, 0x58, 0xa2, 0x82, 0x0d, 0xde, + 0x5b, 0xbf, 0xec, 0x94, 0x4e, 0x8b, 0xca, 0xc2, 0x9f, 0x34, 0x66, 0x7f, 0xaa, 0xd3, 0xf8, 0x2d, + 0x58, 0xcb, 0x10, 0x10, 0x0d, 0x03, 0x96, 0x0d, 0xbd, 0xbe, 0xc3, 0x12, 0xf6, 0x31, 0x5f, 0xcc, + 0x14, 0x4c, 0xfb, 0x07, 0x0a, 0x6c, 0x74, 0x9e, 0x44, 0x0e, 0x33, 0xde, 0x9b, 0x93, 0xa1, 0x58, + 0xef, 0x54, 0x58, 0x13, 0x0f, 0x6e, 0x58, 0x30, 0x25, 0x26, 0xac, 0x71, 0x98, 0x19, 0x97, 0x92, + 0x3d, 0xa8, 0xf2, 0xf3, 0x25, 0xe4, 0xa1, 0xf3, 0xaf, 0x49, 0xea, 0x93, 0x84, 0x31, 0x47, 0xa2, + 0x2d, 0xc1, 0x2d, 0x8c, 0xd3, 0x98, 0x31, 0xb5, 0xf6, 0x97, 0x0a, 0x5c, 0x98, 0x42, 0x43, 0xde, + 0x83, 0x39, 0x0c, 0xf4, 0xc0, 0x47, 0xef, 0xca, 0x94, 0x4f, 0x44, 0xfd, 0xa3, 0x07, 0xb7, 0xd9, + 0x41, 0x74, 0x4c, 0x7f, 0x98, 0x8c, 0x8a, 0x7c, 0x04, 0x8b, 0xfa, 0x60, 0xc0, 0x2f, 0x70, 0xa5, + 0xd4, 0x05, 0x6e, 0xca, 0x17, 0x5f, 0x8f, 0xf1, 0xd9, 0x05, 0x8e, 0x3d, 0x39, 0x1e, 0x0c, 0x6c, + 0x1e, 0xc4, 0x22, 0xe1, 0x77, 0xe9, 0x5d, 0x58, 0x4d, 0x23, 0x3f, 0xd7, 0xbb, 0xfb, 0xcf, 0x15, + 0x50, 0xd3, 0x75, 0xf8, 0xf9, 0x04, 0xdc, 0x2c, 0x1a, 0xe6, 0x67, 0x4c, 0xaa, 0x7f, 0x5c, 0x82, + 0x73, 0x85, 0x3d, 0x4c, 0x5e, 0x83, 0x79, 0x7d, 0x3c, 0x6e, 0xd4, 0xf9, 0xac, 0xe2, 0x12, 0x12, + 0xea, 0xd7, 0x53, 0xf7, 0x5b, 0x86, 0x44, 0xde, 0x84, 0x2a, 0xf3, 0x11, 0xa9, 0x8b, 0x0d, 0x07, + 0x23, 0x08, 0x72, 0x07, 0x96, 0x74, 0x10, 0x7b, 0x81, 0x48, 0x76, 0x60, 0x95, 0xc7, 0xde, 0x43, + 0x87, 0xa1, 0x38, 0x5f, 0x12, 0xfa, 0x58, 0x09, 0xa5, 0x3d, 0x73, 0x35, 0x4a, 0xed, 0x9d, 0x19, + 0x2a, 0xd2, 0x04, 0x15, 0x79, 0xca, 0x9c, 0x58, 0x24, 0x7d, 0xc9, 0xf7, 0x6e, 0x0a, 0xaf, 0x1c, + 0x65, 0x3c, 0x5c, 0xcc, 0xff, 0xfd, 0xd8, 0x1d, 0x45, 0x3f, 0xbf, 0xe1, 0x4a, 0xbe, 0x71, 0xaa, + 0xe1, 0xfa, 0x7e, 0x85, 0x2d, 0xe6, 0x2c, 0x19, 0x95, 0x68, 0xa4, 0xf4, 0x28, 0x28, 0xd1, 0xd0, + 0xfb, 0x19, 0x8f, 0x2e, 0x57, 0x87, 0x05, 0x16, 0xf5, 0x4f, 0xac, 0x8c, 0xab, 0x85, 0x55, 0x60, + 0x38, 0x0f, 0x6e, 0x33, 0xf1, 0x85, 0x45, 0x9c, 0x08, 0x4d, 0x41, 0x4a, 0x1e, 0xc0, 0x52, 0x6d, + 0xe8, 0x3a, 0xa3, 0xc9, 0xb8, 0x77, 0x3a, 0x03, 0xf5, 0x26, 0x6f, 0xcb, 0x72, 0x9f, 0x91, 0xa1, + 0x61, 0x1b, 0x77, 0x72, 0x99, 0x11, 0xe9, 0xc5, 0x8f, 0xd0, 0x2b, 0xa8, 0x9b, 0x7d, 0x63, 0x46, + 0xff, 0x64, 0x81, 0x48, 0x97, 0x8e, 0xb0, 0xc0, 0x5f, 0xa9, 0xdb, 0xb0, 0xda, 0x74, 0xc2, 0xa8, + 0x17, 0x38, 0xa3, 0x10, 0x23, 0x90, 0x9f, 0x22, 0x9a, 0xea, 0x65, 0x5e, 0x61, 0xa6, 0xb3, 0x8d, + 0x62, 0x52, 0xa6, 0xb3, 0x4d, 0xb3, 0xa3, 0xf2, 0xd2, 0x8e, 0x37, 0x72, 0x86, 0xde, 0xb7, 0x45, + 0xac, 0x0e, 0x26, 0x2f, 0x1d, 0x08, 0xa0, 0x99, 0x94, 0x6b, 0xbf, 0x92, 0x1b, 0x37, 0x56, 0xcb, + 0x25, 0x58, 0xe0, 0x91, 0x9c, 0x58, 0x64, 0xa3, 0xae, 0xd1, 0xae, 0x37, 0xda, 0xbb, 0xaa, 0x42, + 0x56, 0x01, 0xba, 0x66, 0xa7, 0x66, 0x58, 0x16, 0xfd, 0x5d, 0xa2, 0xbf, 0x79, 0xd8, 0xa3, 0x9d, + 0xfd, 0xa6, 0x5a, 0x96, 0x22, 0x1f, 0x55, 0xb4, 0x1f, 0x2b, 0x70, 0xbe, 0x78, 0x28, 0x49, 0x0f, + 0x30, 0xf6, 0x15, 0x77, 0x55, 0xf8, 0xc6, 0xcc, 0x71, 0x2f, 0x04, 0x67, 0x63, 0x68, 0x45, 0x2c, + 0x36, 0x53, 0x49, 0x98, 0xd9, 0x58, 0xb0, 0x07, 0x6f, 0x60, 0x96, 0xbc, 0x81, 0x56, 0x83, 0xcd, + 0x69, 0x3c, 0xd2, 0x4d, 0x5d, 0x83, 0x25, 0xbd, 0xdb, 0x6d, 0x36, 0x6a, 0x7a, 0xaf, 0xd1, 0x69, + 0xab, 0x0a, 0x59, 0x84, 0xb9, 0x5d, 0xb3, 0xb3, 0xdf, 0x55, 0x4b, 0xda, 0xef, 0x29, 0xb0, 0xd2, + 0x48, 0x9c, 0x28, 0xbf, 0xec, 0xe2, 0xfb, 0x66, 0x6a, 0xf1, 0x6d, 0xc6, 0x51, 0xe2, 0xe2, 0x0f, + 0x9c, 0x6a, 0xe5, 0xfd, 0x9b, 0x32, 0xac, 0xe7, 0x68, 0x88, 0x05, 0x0b, 0xfa, 0x43, 0xab, 0xd3, + 0xa8, 0xd7, 0x78, 0xcd, 0xae, 0x27, 0x4e, 0x73, 0x98, 0x6d, 0x34, 0xf7, 0x15, 0x16, 0x59, 0xe5, + 0x69, 0x68, 0xfb, 0xde, 0xa0, 0x9f, 0xf2, 0xda, 0x14, 0x9c, 0xf0, 0x24, 0xfb, 0xf6, 0x24, 0x40, + 0x47, 0x54, 0x5e, 0xeb, 0xd8, 0x17, 0x4f, 0xc0, 0xf3, 0x8c, 0xd1, 0x35, 0xd3, 0xa1, 0xe5, 0x79, + 0xd6, 0x09, 0x3f, 0xd2, 0x86, 0xf9, 0x5d, 0x2f, 0xda, 0x9b, 0x3c, 0xe6, 0xeb, 0xf7, 0x5a, 0x92, + 0x7b, 0x72, 0x6f, 0xf2, 0x38, 0xcf, 0x16, 0xb5, 0x9a, 0xec, 0x55, 0x75, 0x8a, 0x25, 0xe7, 0x42, + 0xee, 0xc3, 0x9c, 0xfe, 0xd0, 0x32, 0x75, 0xbe, 0xba, 0x24, 0xb7, 0x44, 0x53, 0x9f, 0xc2, 0x8d, + 0xb6, 0x3e, 0x70, 0x52, 0xdc, 0x18, 0x8f, 0x6c, 0x64, 0x89, 0xca, 0x73, 0x45, 0x96, 0xd8, 0x5e, + 0x81, 0x25, 0x7e, 0x21, 0xc3, 0xbb, 0xce, 0x8f, 0x14, 0xd8, 0x9c, 0x36, 0x0c, 0xf4, 0x8e, 0x97, + 0x8e, 0x20, 0x75, 0x3e, 0xce, 0x74, 0x96, 0x76, 0x1d, 0x16, 0x68, 0xe4, 0x03, 0x58, 0x62, 0xee, + 0x65, 0xd6, 0x9b, 0xfb, 0x66, 0x83, 0xcf, 0xfd, 0xab, 0x7f, 0xf1, 0xc5, 0xf5, 0x0b, 0xdc, 0x23, + 0x2d, 0x7c, 0xd3, 0x9e, 0x04, 0x5e, 0x42, 0xba, 0xa9, 0x98, 0x32, 0x05, 0x15, 0xc9, 0x9d, 0xc9, + 0xc0, 0x73, 0xc5, 0x85, 0x44, 0x44, 0xd9, 0xe1, 0x30, 0xf9, 0x80, 0x14, 0x30, 0xed, 0xbb, 0x0a, + 0x5c, 0x9a, 0x3e, 0xe6, 0xf4, 0xd0, 0xed, 0x31, 0x2f, 0x3d, 0x11, 0xe7, 0x06, 0x0f, 0xdd, 0xd8, + 0x95, 0x4f, 0xe6, 0x29, 0x10, 0x29, 0x11, 0x57, 0x97, 0x09, 0x8d, 0x0b, 0x12, 0xc5, 0xda, 0x34, + 0x99, 0x48, 0x20, 0x6a, 0x8f, 0xe0, 0xc2, 0x94, 0x19, 0x42, 0xde, 0x2f, 0xcc, 0x9f, 0x88, 0xcf, + 0x9f, 0xe5, 0xf7, 0xed, 0xa9, 0x44, 0xbc, 0x12, 0x5c, 0xfb, 0x4f, 0xcc, 0x2f, 0xb5, 0x60, 0xba, + 0x50, 0xf9, 0x00, 0xf3, 0xf5, 0xe9, 0xa3, 0xfe, 0x91, 0x1f, 0x24, 0x83, 0x85, 0xf2, 0x41, 0x44, + 0x4b, 0x6c, 0x07, 0x8b, 0x32, 0x83, 0x96, 0xa1, 0x22, 0x3e, 0xac, 0x77, 0x03, 0xff, 0xc0, 0x63, + 0x0f, 0xf6, 0xd8, 0xb5, 0x8e, 0xaf, 0xac, 0x97, 0xa5, 0x09, 0xeb, 0x0f, 0xdd, 0x50, 0x1f, 0x9d, + 0x3c, 0x3d, 0x72, 0x03, 0x37, 0x87, 0x1f, 0x27, 0xe5, 0xa1, 0x60, 0xe6, 0xfe, 0xd0, 0xc7, 0x02, + 0x33, 0xcf, 0x5b, 0xfb, 0x5e, 0x09, 0x6e, 0x3e, 0x93, 0xe3, 0x69, 0xd3, 0x0e, 0x7e, 0x1d, 0x80, + 0xd3, 0xd2, 0x1e, 0x90, 0x94, 0x36, 0xa2, 0x32, 0x4e, 0x30, 0x32, 0x25, 0x14, 0xf2, 0x04, 0xae, + 0x8a, 0x5f, 0xfd, 0xbe, 0x3b, 0x8e, 0x42, 0x5a, 0x0f, 0x1e, 0xc7, 0x36, 0x8e, 0xe0, 0x53, 0xc5, + 0xdc, 0xfa, 0x37, 0x63, 0x1e, 0x0c, 0x93, 0x79, 0xcf, 0x8b, 0x90, 0xb8, 0xa8, 0x3a, 0x9a, 0xcd, + 0x8b, 0xdc, 0x4a, 0x56, 0x52, 0x25, 0x51, 0xf9, 0x8a, 0x95, 0x14, 0xaf, 0x1f, 0xed, 0x27, 0x25, + 0x38, 0x4f, 0x77, 0xe4, 0xa1, 0x1b, 0x86, 0xfa, 0x24, 0x3a, 0xa2, 0xab, 0x96, 0xdd, 0x51, 0xc8, + 0xdb, 0x30, 0x7f, 0xf4, 0x7c, 0x16, 0x08, 0x86, 0x4e, 0x08, 0xa0, 0x94, 0x23, 0xde, 0x56, 0xd3, + 0xff, 0xc9, 0x3b, 0x30, 0x87, 0x0a, 0x36, 0x2e, 0x4c, 0x88, 0x4b, 0x60, 0xf1, 0xa7, 0x51, 0xfd, + 0x66, 0x32, 0x02, 0xda, 0xcf, 0x49, 0x4a, 0x37, 0xbe, 0x9f, 0x09, 0xc5, 0x53, 0x9c, 0xd5, 0xcd, + 0x5c, 0x3c, 0x3e, 0x70, 0x78, 0x9e, 0xb4, 0x2d, 0x58, 0x17, 0xab, 0x66, 0x2c, 0xc2, 0x8d, 0x73, + 0xcb, 0xf7, 0x1a, 0x8f, 0xff, 0x30, 0x16, 0x21, 0xc7, 0x5f, 0x84, 0xd5, 0x30, 0x3c, 0xb2, 0x79, + 0xf8, 0xa0, 0x27, 0x22, 0x93, 0x89, 0xb9, 0x1c, 0x86, 0x47, 0x2c, 0x8e, 0xd0, 0x7d, 0xf7, 0x84, + 0x62, 0xa1, 0x8b, 0x6f, 0x82, 0x55, 0x65, 0x58, 0xd1, 0x30, 0x8c, 0xb1, 0x78, 0xe4, 0x2b, 0x48, + 0xb0, 0xb4, 0xff, 0x56, 0x82, 0xc5, 0x87, 0x54, 0x70, 0x47, 0x75, 0xd4, 0x6c, 0xf5, 0xd6, 0x1d, + 0x58, 0x6a, 0xfa, 0x0e, 0x37, 0x3a, 0xf2, 0x17, 0xc6, 0xec, 0x4d, 0xc0, 0xd0, 0x77, 0x84, 0xfd, + 0x32, 0x34, 0x65, 0xa4, 0x67, 0x84, 0x7e, 0xba, 0x07, 0xf3, 0xcc, 0x08, 0xcc, 0x35, 0xad, 0xe2, + 0xea, 0x16, 0xd7, 0xe8, 0x75, 0x56, 0x2c, 0xd9, 0xc9, 0x98, 0x21, 0x59, 0xbe, 0x47, 0x70, 0xff, + 0x7f, 0x49, 0xf9, 0x36, 0x77, 0x3a, 0xe5, 0x9b, 0x14, 0x36, 0x7a, 0xfe, 0x34, 0x61, 0xa3, 0x2f, + 0xdd, 0x85, 0x25, 0xa9, 0x3e, 0xcf, 0x75, 0x93, 0xfb, 0x8d, 0x12, 0xac, 0x60, 0xab, 0x62, 0xd7, + 0xb2, 0xbf, 0x99, 0xaa, 0xc4, 0x6f, 0xa6, 0x54, 0x89, 0x9b, 0xf2, 0x78, 0xb1, 0x96, 0xcd, 0xd0, + 0x21, 0xde, 0x83, 0xf5, 0x1c, 0x22, 0x79, 0x0b, 0xe6, 0x68, 0xf5, 0x85, 0xea, 0x45, 0xcd, 0xce, + 0x80, 0x24, 0xc5, 0x08, 0x6d, 0x78, 0x68, 0x32, 0x6c, 0xed, 0x7f, 0x29, 0xb0, 0xcc, 0x33, 0x08, + 0x8e, 0x0e, 0xfc, 0x67, 0x76, 0xe7, 0xad, 0x6c, 0x77, 0xb2, 0x40, 0x86, 0xbc, 0x3b, 0xff, 0x6f, + 0x77, 0xe2, 0xdd, 0x54, 0x27, 0x5e, 0x88, 0x03, 0x8e, 0x8b, 0xe6, 0xcc, 0xe8, 0xc3, 0x1f, 0x62, + 0x0a, 0x8e, 0x34, 0x22, 0xf9, 0x35, 0x58, 0x6c, 0xbb, 0x4f, 0x53, 0x1a, 0x8c, 0x5b, 0x53, 0x98, + 0xbe, 0x1e, 0x23, 0xb2, 0x35, 0xc5, 0xde, 0xe5, 0xb8, 0x4f, 0xed, 0x9c, 0xfd, 0x39, 0x61, 0x79, + 0xe9, 0x5d, 0x58, 0x4d, 0x93, 0x3d, 0xcf, 0xd4, 0xe7, 0xe1, 0x50, 0x30, 0x36, 0xe7, 0x6f, 0x95, + 0x01, 0x92, 0x48, 0x12, 0x74, 0x01, 0xa6, 0x5c, 0x6f, 0x84, 0xf1, 0x07, 0x41, 0xf2, 0x1c, 0x17, + 0x1e, 0x39, 0xb7, 0xb8, 0x91, 0xa2, 0x34, 0x3d, 0x20, 0xfc, 0x48, 0x44, 0xc3, 0x61, 0x6e, 0x86, + 0x43, 0x87, 0xb9, 0xe4, 0x97, 0xb7, 0x5f, 0xc4, 0xfc, 0x1f, 0x31, 0x34, 0x15, 0xad, 0xbb, 0x5a, + 0x9f, 0xf0, 0xbc, 0x43, 0x18, 0xc0, 0xa0, 0x4e, 0x11, 0x72, 0xd1, 0x59, 0x2a, 0xcf, 0x17, 0x9d, + 0xa5, 0x0b, 0x8b, 0xde, 0xe8, 0x53, 0x77, 0x14, 0xf9, 0xc1, 0x09, 0x5a, 0x66, 0x12, 0x95, 0x2f, + 0xed, 0x82, 0x86, 0x28, 0x63, 0xe3, 0x80, 0x32, 0x42, 0x8c, 0x2f, 0x0f, 0x43, 0x0c, 0x8c, 0x63, + 0x4a, 0xcc, 0xa9, 0xf3, 0x2c, 0xb2, 0xc4, 0xbd, 0x4a, 0xb5, 0xaa, 0x2e, 0xde, 0xab, 0x54, 0x17, + 0x55, 0x30, 0x25, 0xb3, 0x6a, 0x6c, 0x36, 0x95, 0x2c, 0x9d, 0x69, 0x2b, 0xa6, 0xf6, 0x57, 0x25, + 0x20, 0xf9, 0x6a, 0x90, 0x6f, 0xc2, 0x12, 0xdb, 0x60, 0xed, 0x20, 0xfc, 0x84, 0xbf, 0x4b, 0x62, + 0x8f, 0x04, 0x25, 0xb0, 0x1c, 0xe1, 0x94, 0x81, 0xcd, 0xf0, 0x93, 0x21, 0xf9, 0x55, 0x38, 0x8b, + 0xdd, 0x3b, 0x76, 0x03, 0xcf, 0x1f, 0xd8, 0x98, 0x8e, 0xc2, 0x19, 0xf2, 0xdc, 0xed, 0xaf, 0xfd, + 0xc5, 0x17, 0xd7, 0xaf, 0x16, 0x14, 0x4f, 0x19, 0x06, 0x0c, 0x08, 0xd1, 0x45, 0xcc, 0x2e, 0x43, + 0x24, 0x3d, 0x50, 0x65, 0xfa, 0x83, 0xc9, 0x70, 0xc8, 0x47, 0x76, 0x8b, 0x0a, 0x75, 0xd9, 0xb2, + 0x29, 0x8c, 0x57, 0x13, 0xc6, 0x3b, 0x93, 0xe1, 0x90, 0xbc, 0x0d, 0xe0, 0x8f, 0xec, 0x63, 0x2f, + 0x0c, 0x99, 0xbd, 0x2f, 0x7e, 0xab, 0x96, 0x40, 0xe5, 0xc1, 0xf0, 0x47, 0x2d, 0x06, 0x24, 0x7f, + 0x07, 0x30, 0x30, 0x1a, 0x46, 0x0c, 0x64, 0x3e, 0x6d, 0x5c, 0xce, 0x13, 0xc0, 0x74, 0x28, 0x9d, + 0x43, 0xd7, 0xf2, 0xbe, 0x2d, 0x9e, 0xf4, 0x7d, 0x0b, 0xd6, 0xb9, 0xfb, 0xfe, 0x43, 0x2f, 0x3a, + 0xe2, 0xb7, 0xcd, 0x2f, 0x73, 0x55, 0x95, 0xae, 0x9b, 0x7f, 0x5a, 0x01, 0xd0, 0x1f, 0x5a, 0x22, + 0x18, 0xef, 0x2b, 0x30, 0x47, 0xef, 0xd0, 0x42, 0x17, 0x87, 0x96, 0x0c, 0xe4, 0x2b, 0x5b, 0x32, + 0x10, 0x83, 0xae, 0x46, 0x13, 0x5f, 0xdf, 0x08, 0x3d, 0x1c, 0xae, 0x46, 0xf6, 0x20, 0x27, 0x95, + 0x0c, 0x85, 0x63, 0x91, 0x26, 0x40, 0x12, 0x1e, 0x97, 0xdf, 0x0a, 0xd7, 0x93, 0x38, 0x93, 0xbc, + 0x80, 0x27, 0x79, 0x4b, 0x9e, 0x58, 0xca, 0xd3, 0x27, 0x41, 0x23, 0xf7, 0xa1, 0xd2, 0x73, 0xe2, + 0xc8, 0x2d, 0x53, 0x82, 0x06, 0xdf, 0xe0, 0xb9, 0xf5, 0x93, 0xc0, 0xc1, 0xab, 0x91, 0x73, 0x28, + 0xd7, 0x0e, 0x99, 0x10, 0x03, 0xe6, 0xbb, 0x4e, 0xe0, 0x1c, 0x87, 0xd3, 0x82, 0xcd, 0xb3, 0x52, + 0x91, 0x62, 0x06, 0x81, 0xb2, 0x4c, 0xc1, 0x8a, 0xc9, 0x1d, 0x28, 0x5b, 0x56, 0x8b, 0x87, 0xca, + 0x5b, 0x49, 0x04, 0x7e, 0xcb, 0x6a, 0x31, 0xd7, 0x80, 0x30, 0x3c, 0x96, 0xc8, 0x28, 0x32, 0xf9, + 0x45, 0x58, 0x92, 0xee, 0x23, 0x3c, 0xc8, 0x24, 0xf6, 0x81, 0xf4, 0xbe, 0x53, 0xde, 0x34, 0x24, + 0x6c, 0xd2, 0x04, 0xf5, 0xfe, 0xe4, 0xb1, 0xab, 0x8f, 0xc7, 0x18, 0x32, 0xe2, 0x53, 0x37, 0x60, + 0x82, 0x5c, 0x35, 0xc9, 0xce, 0x82, 0x8f, 0xa9, 0x06, 0xa2, 0x54, 0xd6, 0x47, 0x66, 0x29, 0x49, + 0x17, 0xd6, 0x2d, 0x37, 0x9a, 0x8c, 0x99, 0x97, 0xd6, 0x0e, 0xbb, 0x08, 0xb1, 0x90, 0x94, 0x98, + 0xc8, 0x22, 0xa4, 0x85, 0xc2, 0x35, 0xee, 0x20, 0x77, 0x19, 0xca, 0x13, 0x6b, 0xae, 0x3c, 0xe4, + 0xb2, 0x04, 0xaf, 0xcc, 0x90, 0xe0, 0xa9, 0x7c, 0x9c, 0x0b, 0x9b, 0x8c, 0xf7, 0x10, 0x29, 0x6c, + 0x72, 0x2a, 0x58, 0xf2, 0x0f, 0x2a, 0x52, 0xe4, 0x7e, 0x3e, 0x16, 0xef, 0x01, 0xdc, 0xf3, 0xbd, + 0x51, 0xcb, 0x8d, 0x8e, 0xfc, 0x81, 0xf4, 0x7a, 0x77, 0xe9, 0x63, 0xdf, 0x1b, 0xd9, 0xc7, 0x08, + 0xfe, 0xab, 0x2f, 0xae, 0x4b, 0x48, 0xa6, 0xf4, 0x3f, 0xf9, 0x1a, 0x2c, 0xd2, 0x5f, 0xbd, 0xc4, + 0xd7, 0x8c, 0xa9, 0xed, 0x91, 0x9a, 0xe5, 0xcc, 0x4b, 0x10, 0xc8, 0x5d, 0xcc, 0x12, 0xe9, 0x8d, + 0x23, 0x49, 0x78, 0x15, 0x29, 0x21, 0xbd, 0x71, 0x94, 0x7d, 0xba, 0x2b, 0x21, 0x93, 0xbd, 0xb8, + 0xea, 0x22, 0xb1, 0x2b, 0x4f, 0x46, 0xc9, 0xdf, 0xff, 0x62, 0x91, 0x2d, 0xb2, 0x40, 0xc8, 0xef, + 0x7f, 0x33, 0x64, 0x58, 0x09, 0x6b, 0xaf, 0xce, 0x6f, 0x9d, 0x73, 0x52, 0x25, 0xc2, 0xa3, 0x01, + 0xbf, 0x43, 0xa6, 0x2a, 0x11, 0x23, 0x93, 0x6d, 0x58, 0x63, 0x52, 0x7f, 0x9c, 0x02, 0x9e, 0x8b, + 0xb8, 0xb8, 0xb7, 0x25, 0x39, 0xe2, 0xe5, 0xcf, 0x67, 0x08, 0xc8, 0x0e, 0xcc, 0xa1, 0x06, 0x81, + 0x3f, 0xce, 0xb9, 0x2c, 0x6b, 0x92, 0xb2, 0xeb, 0x08, 0xf7, 0x15, 0xd4, 0x21, 0xc9, 0xfb, 0x0a, + 0xa2, 0x92, 0x5f, 0x06, 0x30, 0x46, 0x81, 0x3f, 0x1c, 0x62, 0x9e, 0x92, 0x6a, 0xea, 0xf9, 0x3f, + 0xe7, 0x83, 0x5c, 0x12, 0x24, 0x1e, 0x53, 0x1b, 0x7f, 0xdb, 0x99, 0x6c, 0x26, 0x12, 0x2f, 0xad, + 0x01, 0xf3, 0x6c, 0x31, 0x62, 0xce, 0x1f, 0x9e, 0x19, 0x51, 0xca, 0x18, 0xc3, 0x72, 0xfe, 0x70, + 0x78, 0x3e, 0xe7, 0x8f, 0x44, 0xa0, 0xdd, 0x87, 0x8d, 0xa2, 0x86, 0xa5, 0x74, 0x1e, 0xca, 0x69, + 0x75, 0x1e, 0x7f, 0x50, 0x86, 0x65, 0xe4, 0x26, 0x76, 0x61, 0x1d, 0x56, 0xac, 0xc9, 0xe3, 0x38, + 0x20, 0xae, 0xd8, 0x8d, 0xb1, 0x7e, 0xa1, 0x5c, 0x20, 0x9b, 0x79, 0x53, 0x14, 0xc4, 0x80, 0x55, + 0x71, 0x12, 0xec, 0x8a, 0x87, 0x2c, 0x71, 0xba, 0x1d, 0xf1, 0xbe, 0x87, 0xfb, 0xd0, 0xca, 0x0a, + 0x8d, 0x34, 0x51, 0x72, 0x1e, 0x94, 0x9f, 0xe7, 0x3c, 0xa8, 0x9c, 0xea, 0x3c, 0xf8, 0x08, 0x96, + 0xc5, 0xd7, 0x70, 0x27, 0x9f, 0xfb, 0x72, 0x3b, 0x79, 0x8a, 0x19, 0x69, 0xc6, 0x3b, 0xfa, 0xfc, + 0xcc, 0x1d, 0x1d, 0x6d, 0xe7, 0x62, 0x95, 0x8d, 0x11, 0x96, 0xdf, 0xd8, 0xb5, 0x3f, 0x2f, 0x03, + 0xec, 0xd6, 0xba, 0x3f, 0xc3, 0x29, 0xf9, 0x16, 0x2c, 0x36, 0x7d, 0x61, 0x36, 0x95, 0xec, 0x55, + 0x43, 0x01, 0x94, 0xc5, 0x85, 0x18, 0x33, 0x3e, 0xdd, 0xca, 0x5f, 0xc5, 0xe9, 0x76, 0x17, 0xf5, + 0x3a, 0x1f, 0xbb, 0xfd, 0x28, 0xc9, 0xfc, 0x8c, 0x4b, 0x46, 0xc4, 0xb3, 0x4b, 0x9b, 0xcd, 0x24, + 0x64, 0xba, 0x3b, 0x71, 0x8f, 0x2c, 0x11, 0xa4, 0x82, 0xa7, 0x62, 0xc5, 0xdd, 0x49, 0x44, 0xfa, + 0x10, 0x71, 0x2f, 0xe4, 0xed, 0x21, 0x43, 0xf6, 0xd5, 0x0e, 0x08, 0xf9, 0x30, 0x76, 0xa1, 0x5d, + 0x98, 0xd5, 0x43, 0x5a, 0xae, 0x87, 0xa6, 0x3a, 0xce, 0x6a, 0x3f, 0x56, 0xe4, 0x5c, 0x67, 0x3f, + 0xc3, 0x50, 0xbf, 0x03, 0x10, 0xfb, 0xad, 0x88, 0xb1, 0x8e, 0xe3, 0x18, 0x30, 0xa8, 0xdc, 0xcb, + 0x09, 0xae, 0xd4, 0x9a, 0xf2, 0x57, 0xd5, 0x9a, 0x1e, 0x2c, 0x75, 0x9e, 0x44, 0x4e, 0xe2, 0xe8, + 0x04, 0x56, 0x2c, 0xc9, 0xe2, 0xce, 0x54, 0x46, 0xb5, 0xdc, 0x39, 0x49, 0x0e, 0x9e, 0x22, 0x02, + 0x4b, 0x84, 0xda, 0x5f, 0x2b, 0xb0, 0x26, 0x87, 0x28, 0x3a, 0x19, 0xf5, 0xc9, 0xfb, 0x2c, 0xf5, + 0x82, 0x92, 0xba, 0xb2, 0x48, 0x48, 0x74, 0xcb, 0x3d, 0x19, 0xf5, 0x99, 0x00, 0xe4, 0x3c, 0x95, + 0x2b, 0x4b, 0x09, 0xc9, 0x63, 0x58, 0xee, 0xfa, 0xc3, 0x21, 0x15, 0x6b, 0x82, 0x4f, 0xf9, 0x05, + 0x80, 0x32, 0xca, 0x5a, 0xcf, 0x44, 0x85, 0xb6, 0x5f, 0xe0, 0xf7, 0xdc, 0x0b, 0x63, 0xba, 0xdf, + 0x7b, 0x9c, 0x2e, 0x61, 0xfb, 0x39, 0xbe, 0x54, 0x95, 0x79, 0x26, 0x67, 0x53, 0x3a, 0x67, 0x97, + 0x5c, 0x4b, 0x5a, 0x8c, 0xf5, 0x9c, 0x71, 0x36, 0x69, 0x7f, 0x5f, 0x81, 0x1b, 0xf9, 0xa6, 0xd5, + 0x86, 0xfe, 0x64, 0xd0, 0x0b, 0x1c, 0x6f, 0xd8, 0xf4, 0x0f, 0x43, 0x16, 0xb2, 0xfe, 0x30, 0xd1, + 0x50, 0xf3, 0x90, 0xf5, 0x87, 0x5e, 0x36, 0x64, 0x3d, 0x3e, 0x5d, 0x7f, 0x13, 0xaa, 0xd6, 0x87, + 0xd6, 0x87, 0x13, 0x57, 0xdc, 0x85, 0xd9, 0xfe, 0x10, 0x7e, 0x12, 0xda, 0x9f, 0x50, 0xa0, 0x7c, + 0x62, 0x08, 0x44, 0xed, 0xdf, 0x97, 0x80, 0xe4, 0xeb, 0x21, 0x6f, 0xc1, 0xca, 0xff, 0x03, 0x91, + 0x3c, 0x23, 0xca, 0x56, 0x9e, 0x4b, 0x94, 0xfd, 0x04, 0xd4, 0x3e, 0xed, 0x47, 0x3b, 0xa2, 0x1d, + 0x69, 0x0f, 0xfd, 0xf8, 0x44, 0xf8, 0x85, 0xa9, 0x73, 0x2a, 0xdd, 0xf1, 0x6c, 0x4f, 0xca, 0x32, + 0x91, 0x0f, 0xb7, 0x7e, 0x0a, 0x5f, 0xfb, 0x7d, 0x05, 0x36, 0x8a, 0xa6, 0x00, 0x3d, 0x3c, 0xe5, + 0xd3, 0x34, 0x3e, 0xcb, 0xf1, 0xf0, 0x94, 0x0f, 0xe0, 0xf4, 0x89, 0x9e, 0x21, 0xca, 0xf6, 0x47, + 0xe9, 0x79, 0xfa, 0x43, 0xfb, 0xaf, 0x65, 0x58, 0x66, 0x46, 0xcd, 0x3d, 0xd7, 0x19, 0x46, 0x47, + 0x74, 0x70, 0x45, 0x0e, 0x4a, 0xc9, 0xf5, 0x75, 0x46, 0xf2, 0xc9, 0x3b, 0x98, 0xee, 0x3f, 0xf2, + 0xfb, 0xfe, 0x50, 0x56, 0x0a, 0x8e, 0x39, 0x2c, 0x93, 0xed, 0x1f, 0x61, 0x74, 0xee, 0xf2, 0x94, + 0x02, 0xe5, 0x64, 0xee, 0x32, 0x43, 0xb7, 0x3c, 0x77, 0xb9, 0x51, 0xf9, 0x33, 0x38, 0x9b, 0xd8, + 0xa9, 0x63, 0xeb, 0xf6, 0x29, 0x5e, 0x15, 0x6d, 0xf1, 0x57, 0x45, 0xd7, 0x12, 0xd3, 0x37, 0xda, + 0xec, 0xb1, 0x34, 0x93, 0x87, 0xa1, 0xe8, 0x13, 0xe4, 0x3e, 0xa8, 0x09, 0x98, 0x27, 0x88, 0x60, + 0x12, 0x2f, 0x06, 0x6f, 0x92, 0xd8, 0xe6, 0x72, 0x45, 0xe4, 0x08, 0xe9, 0x21, 0x97, 0xc0, 0x8c, + 0xe4, 0x59, 0x99, 0x30, 0xff, 0xc4, 0xbc, 0xf0, 0xf5, 0x90, 0x7c, 0xc8, 0x65, 0xc8, 0xe8, 0x18, + 0x89, 0xbc, 0x26, 0x0b, 0xc9, 0x18, 0xf1, 0xf7, 0xf8, 0xf2, 0x18, 0x71, 0xac, 0xad, 0xef, 0x29, + 0xb0, 0xd6, 0xd0, 0x5b, 0x3c, 0x87, 0x21, 0xeb, 0xd5, 0x9b, 0x70, 0xb5, 0xa1, 0xb7, 0xec, 0x6e, + 0xa7, 0xd9, 0xa8, 0x3d, 0xb2, 0x0b, 0x53, 0x13, 0x5d, 0x85, 0x8b, 0x79, 0x94, 0xc4, 0xa4, 0x7f, + 0x05, 0x36, 0xf3, 0xc5, 0x22, 0x7d, 0x51, 0x31, 0xb1, 0xc8, 0x74, 0x54, 0xde, 0xfa, 0x00, 0xd6, + 0x44, 0xaa, 0x9e, 0x5e, 0xd3, 0xc2, 0x64, 0x80, 0x6b, 0xb0, 0xf4, 0xc0, 0x30, 0x1b, 0x3b, 0x8f, + 0xec, 0x9d, 0xfd, 0x66, 0x53, 0x3d, 0x43, 0x56, 0x60, 0x91, 0x03, 0x6a, 0xba, 0xaa, 0x90, 0x65, + 0xa8, 0x36, 0xda, 0x96, 0x51, 0xdb, 0x37, 0x0d, 0xb5, 0xb4, 0xf5, 0x2f, 0x14, 0x58, 0xd9, 0x1f, + 0x0f, 0x9c, 0xc8, 0x0d, 0x78, 0x8b, 0xae, 0xc1, 0xa5, 0xfd, 0x6e, 0x5d, 0xef, 0x19, 0x66, 0x71, + 0x73, 0xce, 0xc1, 0x7a, 0xa6, 0xbc, 0x73, 0x5f, 0x55, 0xc8, 0x65, 0xb8, 0x90, 0x01, 0xd7, 0x1b, + 0x96, 0xbe, 0xcd, 0x5a, 0x71, 0x11, 0xce, 0x65, 0x0a, 0xbb, 0x8d, 0x76, 0xdb, 0xa8, 0xab, 0x65, + 0xda, 0xc0, 0xdc, 0xe7, 0x4c, 0x43, 0xaf, 0x53, 0x52, 0xb5, 0xb2, 0xf5, 0x01, 0xac, 0x76, 0xe3, + 0x77, 0x0a, 0xe8, 0x31, 0xb0, 0x00, 0x65, 0x53, 0x7f, 0xa8, 0x9e, 0x21, 0x00, 0xf3, 0xdd, 0xfb, + 0x35, 0xeb, 0xf6, 0x6d, 0x55, 0x21, 0x4b, 0xb0, 0xb0, 0x5b, 0xeb, 0xda, 0xf7, 0x5b, 0x96, 0x5a, + 0xa2, 0x3f, 0xf4, 0x87, 0x16, 0xfe, 0x28, 0x6f, 0xbd, 0x81, 0x56, 0xbe, 0xcf, 0x4e, 0x9a, 0x5e, + 0x18, 0xb9, 0x23, 0x37, 0xc0, 0x3e, 0x5a, 0x86, 0xaa, 0xe5, 0x52, 0x79, 0x25, 0x72, 0x59, 0x07, + 0xb5, 0x26, 0xc3, 0xc8, 0x1b, 0x0f, 0xdd, 0xcf, 0x54, 0x65, 0xeb, 0x2e, 0xac, 0x99, 0xfe, 0x24, + 0xf2, 0x46, 0x87, 0x56, 0x44, 0x31, 0x0e, 0x4f, 0xb0, 0xcd, 0x6d, 0xbd, 0xb5, 0xdd, 0xd8, 0xdd, + 0xef, 0xec, 0x5b, 0x76, 0x4b, 0xef, 0xd5, 0xf6, 0x98, 0xbf, 0x42, 0xab, 0x63, 0xf5, 0x6c, 0xd3, + 0xa8, 0x19, 0xed, 0x9e, 0xaa, 0x6c, 0xfd, 0x2e, 0x6a, 0x70, 0xfb, 0xfe, 0x68, 0xb0, 0xe3, 0xf4, + 0x23, 0x3f, 0xc0, 0x0a, 0x6b, 0x70, 0xcd, 0x32, 0x6a, 0x9d, 0x76, 0xdd, 0xde, 0xd1, 0x6b, 0xbd, + 0x8e, 0x59, 0x94, 0xbb, 0xeb, 0x12, 0x9c, 0x2f, 0xc0, 0xe9, 0xf4, 0xba, 0xaa, 0x42, 0xae, 0xc3, + 0xe5, 0x82, 0xb2, 0x87, 0xc6, 0xb6, 0xbe, 0xdf, 0xdb, 0x6b, 0xab, 0xa5, 0x29, 0xc4, 0x96, 0xd5, + 0x51, 0xcb, 0x5b, 0xbf, 0xad, 0xc0, 0xea, 0x7e, 0xc8, 0x9f, 0x47, 0xed, 0x63, 0x54, 0x89, 0x1b, + 0x70, 0x65, 0xdf, 0x32, 0x4c, 0xbb, 0xd7, 0xb9, 0x6f, 0xb4, 0xed, 0x7d, 0x4b, 0xdf, 0xcd, 0xd6, + 0xe6, 0x3a, 0x5c, 0x96, 0x30, 0x4c, 0xa3, 0xd6, 0x79, 0x60, 0x98, 0x76, 0x57, 0xb7, 0xac, 0x87, + 0x1d, 0xb3, 0xae, 0x2a, 0xf4, 0x8b, 0x05, 0x08, 0xad, 0x1d, 0x9d, 0xd5, 0x26, 0x55, 0xd6, 0x36, + 0x1e, 0xea, 0x4d, 0x7b, 0xbb, 0xd3, 0x53, 0xcb, 0x5b, 0x2d, 0x7a, 0x8b, 0xc0, 0x0c, 0x3a, 0xcc, + 0xc5, 0xbd, 0x0a, 0x95, 0x76, 0xa7, 0x6d, 0x64, 0xbd, 0x5c, 0x96, 0xa1, 0xaa, 0x77, 0xbb, 0x66, + 0xe7, 0x01, 0x4e, 0x1e, 0x80, 0xf9, 0xba, 0xd1, 0x6e, 0xe0, 0x6c, 0x59, 0x86, 0x6a, 0xd7, 0xec, + 0xb4, 0x3a, 0x3d, 0xa3, 0xae, 0x56, 0xb6, 0x4c, 0x71, 0xb0, 0x0a, 0xa6, 0x7d, 0x9f, 0xb9, 0x94, + 0xd4, 0x8d, 0x1d, 0x7d, 0xbf, 0xd9, 0xe3, 0x43, 0xf4, 0xc8, 0x36, 0x8d, 0x0f, 0xf7, 0x0d, 0xab, + 0x67, 0xa9, 0x0a, 0x51, 0x61, 0xb9, 0x6d, 0x18, 0x75, 0xcb, 0x36, 0x8d, 0x07, 0x0d, 0xe3, 0xa1, + 0x5a, 0xa2, 0x3c, 0xd9, 0xff, 0xf4, 0x0b, 0x5b, 0x3f, 0x50, 0x80, 0xb0, 0xec, 0x43, 0x22, 0xa5, + 0x2d, 0xce, 0x98, 0x6b, 0x70, 0x69, 0x8f, 0x0e, 0x35, 0x36, 0xad, 0xd5, 0xa9, 0x67, 0xbb, 0xec, + 0x3c, 0x90, 0x4c, 0x79, 0x67, 0x67, 0x07, 0x97, 0xc5, 0xd9, 0x0c, 0xbc, 0x6e, 0x76, 0xba, 0x6a, + 0xe9, 0x52, 0xa9, 0xaa, 0x90, 0x0b, 0xb9, 0xc2, 0xfb, 0x86, 0xd1, 0x55, 0xcb, 0x74, 0x88, 0x32, + 0x05, 0x62, 0xc9, 0x32, 0xf2, 0xca, 0xd6, 0x77, 0x15, 0x38, 0xcf, 0xaa, 0x29, 0xd6, 0x7f, 0x5c, + 0xd5, 0x2b, 0xb0, 0xc9, 0x73, 0xaa, 0x15, 0x55, 0x74, 0x03, 0xd4, 0x54, 0x29, 0xab, 0xe6, 0x39, + 0x58, 0x4f, 0x41, 0xb1, 0x1e, 0x25, 0xba, 0xbb, 0xa5, 0xc0, 0xdb, 0x86, 0xd5, 0xb3, 0x8d, 0x9d, + 0x9d, 0x8e, 0xd9, 0x63, 0x15, 0x29, 0x6f, 0x69, 0xb0, 0x5e, 0x73, 0x83, 0xc8, 0xf8, 0x2c, 0x72, + 0x47, 0xa1, 0xe7, 0x8f, 0xb0, 0x0a, 0x2b, 0xb0, 0x68, 0xfc, 0x72, 0xcf, 0x68, 0x5b, 0x8d, 0x4e, + 0x5b, 0x3d, 0xb3, 0x75, 0x25, 0x83, 0x23, 0xd6, 0xb1, 0x65, 0xed, 0xa9, 0x67, 0xb6, 0x1c, 0x58, + 0x11, 0x2f, 0x80, 0xd8, 0xac, 0xb8, 0x06, 0x97, 0xc4, 0x5c, 0xc3, 0x3d, 0x21, 0xdb, 0x84, 0x4d, + 0xd8, 0xc8, 0x97, 0x1b, 0x3d, 0x55, 0xa1, 0xa3, 0x90, 0x29, 0xa1, 0xf0, 0xd2, 0xd6, 0x6f, 0x2a, + 0xb0, 0x12, 0x1b, 0x6b, 0xd1, 0x18, 0x74, 0x1d, 0x2e, 0xb7, 0x76, 0x74, 0xbb, 0x6e, 0x3c, 0x68, + 0xd4, 0x0c, 0xfb, 0x7e, 0xa3, 0x5d, 0xcf, 0x7c, 0xe4, 0x22, 0x9c, 0x2b, 0x40, 0xc0, 0xaf, 0x6c, + 0xc2, 0x46, 0xb6, 0xa8, 0x47, 0x97, 0x6a, 0x89, 0x76, 0x7d, 0xb6, 0x24, 0x5e, 0xa7, 0xe5, 0xad, + 0x07, 0xb0, 0x6a, 0xe9, 0xad, 0xe6, 0x8e, 0x1f, 0xf4, 0x5d, 0x7d, 0x12, 0x1d, 0x8d, 0xe8, 0xa6, + 0xb9, 0xd3, 0x31, 0x6b, 0x86, 0x8d, 0x28, 0x99, 0x1a, 0x9c, 0x85, 0x35, 0xb9, 0xf0, 0x91, 0x41, + 0xa7, 0x2f, 0x81, 0x55, 0x19, 0xd8, 0xee, 0xa8, 0xa5, 0xad, 0x5f, 0x81, 0xe5, 0x54, 0x66, 0xfb, + 0x0b, 0x70, 0x56, 0xfe, 0xdd, 0x75, 0x47, 0x03, 0x6f, 0x74, 0xa8, 0x9e, 0xc9, 0x16, 0x98, 0x93, + 0xd1, 0x88, 0x16, 0xe0, 0x7a, 0x96, 0x0b, 0x7a, 0x6e, 0x70, 0xec, 0x8d, 0x9c, 0xc8, 0x1d, 0xa8, + 0xa5, 0xad, 0xd7, 0x61, 0x25, 0x95, 0x4f, 0x8b, 0x0e, 0x5c, 0xb3, 0xc3, 0x37, 0xe0, 0x96, 0x51, + 0x6f, 0xec, 0xb7, 0xd4, 0x39, 0xba, 0x92, 0xf7, 0x1a, 0xbb, 0x7b, 0x2a, 0x6c, 0xfd, 0x9e, 0x02, + 0xab, 0x3c, 0x4b, 0x6e, 0x6b, 0x47, 0x17, 0x43, 0x4d, 0xa7, 0x19, 0xcb, 0xd2, 0x67, 0x58, 0x16, + 0x73, 0xee, 0xba, 0x02, 0x9b, 0xfc, 0x87, 0xad, 0xb7, 0xeb, 0xf6, 0x9e, 0x6e, 0xd6, 0x1f, 0xea, + 0x26, 0x9d, 0x7b, 0x8f, 0xd4, 0x12, 0x2e, 0x28, 0x09, 0x62, 0xf7, 0x3a, 0xfb, 0xb5, 0x3d, 0xb5, + 0x4c, 0xe7, 0x6f, 0x0a, 0xde, 0x6d, 0xb4, 0xd5, 0x0a, 0x2e, 0xcf, 0x1c, 0x36, 0xb2, 0xa5, 0xe5, + 0x73, 0x5b, 0x3f, 0x55, 0xe0, 0x82, 0xe5, 0x1d, 0x8e, 0x9c, 0x68, 0x12, 0xb8, 0xfa, 0xf0, 0xd0, + 0x0f, 0xbc, 0xe8, 0xe8, 0xd8, 0x9a, 0x78, 0x91, 0x4b, 0x5e, 0x81, 0x97, 0xac, 0xc6, 0x6e, 0x5b, + 0xef, 0xd1, 0xe5, 0xa5, 0x37, 0x77, 0x3b, 0x66, 0xa3, 0xb7, 0xd7, 0xb2, 0xad, 0xfd, 0x46, 0x6e, + 0xe6, 0xbd, 0x08, 0x37, 0xa6, 0xa3, 0x36, 0x8d, 0x5d, 0xbd, 0xf6, 0x48, 0x55, 0x66, 0x33, 0xdc, + 0xd6, 0x9b, 0x7a, 0xbb, 0x66, 0xd4, 0xed, 0x07, 0xb7, 0xd5, 0x12, 0x79, 0x09, 0x6e, 0x4e, 0x47, + 0xdd, 0x69, 0x74, 0x2d, 0x8a, 0x56, 0x9e, 0xfd, 0xdd, 0x3d, 0xab, 0x45, 0xb1, 0x2a, 0x5b, 0xbf, + 0xaf, 0xc0, 0xe6, 0xb4, 0xa8, 0xb8, 0xe4, 0x16, 0x68, 0x46, 0xbb, 0x67, 0xea, 0x8d, 0xba, 0x5d, + 0x33, 0x8d, 0xba, 0xd1, 0xee, 0x35, 0xf4, 0xa6, 0x65, 0x5b, 0x9d, 0x7d, 0x3a, 0x9b, 0x12, 0x1f, + 0xbc, 0x17, 0xe0, 0xfa, 0x0c, 0xbc, 0x4e, 0xa3, 0x5e, 0x53, 0x15, 0x72, 0x1b, 0x5e, 0x9b, 0x81, + 0x64, 0x3d, 0xb2, 0x7a, 0x46, 0x4b, 0x2e, 0x51, 0x4b, 0xb8, 0x61, 0x15, 0x07, 0x04, 0xa5, 0xad, + 0xc3, 0x92, 0xd9, 0x15, 0xbb, 0x09, 0x57, 0xa7, 0x62, 0xf1, 0x6a, 0xbd, 0x00, 0xd7, 0xa7, 0xa2, + 0xb0, 0x4a, 0xa9, 0xa5, 0xad, 0x8f, 0xe0, 0xd2, 0xf4, 0xe0, 0x75, 0xf4, 0xbc, 0x48, 0x0f, 0x79, + 0x15, 0x2a, 0x75, 0x7a, 0x44, 0xa5, 0xb2, 0x4a, 0xd2, 0xd9, 0x69, 0x1a, 0x8d, 0x56, 0x97, 0x6e, + 0x84, 0xfc, 0x70, 0xc1, 0xd3, 0xe3, 0x3b, 0x0a, 0xa8, 0xd9, 0x88, 0x4f, 0x39, 0x77, 0x4e, 0x73, + 0xbf, 0xdd, 0x66, 0x07, 0xdd, 0x1a, 0x2c, 0x75, 0x7a, 0x7b, 0x86, 0xc9, 0x13, 0x76, 0x62, 0x86, + 0xce, 0xfd, 0x36, 0x5d, 0xda, 0x1d, 0xb3, 0xf1, 0x2d, 0x3c, 0xf1, 0x36, 0x61, 0xc3, 0x6a, 0xea, + 0xb5, 0xfb, 0x76, 0xbb, 0xd3, 0xb3, 0x1b, 0x6d, 0xbb, 0xb6, 0xa7, 0xb7, 0xdb, 0x46, 0x53, 0x05, + 0xba, 0x67, 0x77, 0xee, 0xf7, 0x74, 0xbb, 0xd6, 0x69, 0xef, 0x34, 0x76, 0x39, 0x8b, 0x0d, 0x9c, + 0x05, 0xd3, 0x02, 0x18, 0x90, 0xaf, 0xc1, 0xcb, 0x48, 0xd3, 0x6d, 0xee, 0xef, 0x36, 0xda, 0xb6, + 0xf5, 0xa8, 0x5d, 0x13, 0x62, 0x57, 0x2d, 0x7f, 0x56, 0xbc, 0x0c, 0x2f, 0xce, 0xc4, 0x4e, 0x32, + 0x6e, 0xde, 0x02, 0x6d, 0x26, 0x26, 0x6f, 0xdf, 0xd6, 0x9f, 0x28, 0x70, 0x79, 0x86, 0xd3, 0x0d, + 0x79, 0x0d, 0x5e, 0xd9, 0x33, 0xf4, 0x7a, 0xd3, 0xb0, 0x2c, 0xdc, 0xe1, 0xe8, 0x20, 0x32, 0x6f, + 0xd0, 0xc2, 0x93, 0xe0, 0x15, 0x78, 0x69, 0x36, 0x7a, 0x22, 0x53, 0xbc, 0x0c, 0x2f, 0xce, 0x46, + 0xe5, 0x32, 0x46, 0x89, 0x6c, 0xc1, 0xad, 0xd9, 0x98, 0xb1, 0x6c, 0x52, 0xde, 0xfa, 0x1d, 0x05, + 0xce, 0x17, 0xeb, 0xb9, 0x69, 0xdd, 0x1a, 0x6d, 0xab, 0xa7, 0x37, 0x9b, 0x76, 0x57, 0x37, 0xf5, + 0x96, 0x6d, 0xb4, 0xcd, 0x4e, 0xb3, 0x59, 0x74, 0x26, 0xbf, 0x08, 0x37, 0xa6, 0xa3, 0x5a, 0x35, + 0xb3, 0xd1, 0xa5, 0xc7, 0x8e, 0x06, 0xd7, 0xa6, 0x63, 0x19, 0x8d, 0x9a, 0xa1, 0x96, 0xb6, 0xdf, + 0xfb, 0xe3, 0x3f, 0xbf, 0x76, 0xe6, 0x8f, 0x7f, 0x7a, 0x4d, 0xf9, 0x8f, 0x3f, 0xbd, 0xa6, 0xfc, + 0xd9, 0x4f, 0xaf, 0x29, 0xdf, 0x7a, 0xf5, 0x74, 0xc9, 0xaa, 0xf1, 0xd6, 0xfe, 0x78, 0x1e, 0xaf, + 0x7f, 0x6f, 0xfe, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x80, 0x83, 0x1c, 0x84, 0xe1, 0x01, + 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -30816,6 +30871,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 { @@ -30971,6 +31038,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) @@ -31694,12 +31811,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 { @@ -33585,12 +33702,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 } @@ -33646,12 +33763,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 } @@ -33775,22 +33892,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 } @@ -34761,20 +34878,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-- @@ -35447,12 +35564,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 { @@ -35569,12 +35686,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 { @@ -35822,12 +35939,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 } @@ -35844,20 +35961,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 } @@ -35871,12 +35988,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 { @@ -35979,20 +36096,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 } @@ -36079,24 +36196,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-- @@ -36116,22 +36233,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-- @@ -36264,21 +36381,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)) @@ -37281,12 +37398,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-- @@ -39307,12 +39424,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 + n210, err210 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err210 != nil { + return 0, err210 } - i -= n209 - i = encodeVarintTypes(dAtA, i, uint64(n209)) + i -= n210 + i = encodeVarintTypes(dAtA, i, uint64(n210)) i-- dAtA[i] = 0x3a { @@ -39468,21 +39585,21 @@ 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 - } - i -= n212 - i = encodeVarintTypes(dAtA, i, uint64(n212)) - i-- - dAtA[i] = 0x22 - n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) if err213 != nil { return 0, err213 } i -= n213 i = encodeVarintTypes(dAtA, i, uint64(n213)) i-- + dAtA[i] = 0x22 + n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + if err214 != nil { + return 0, err214 + } + i -= n214 + i = encodeVarintTypes(dAtA, i, uint64(n214)) + i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { i -= len(m.LockedMessage) @@ -39538,12 +39655,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 + n216, err216 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) + if err216 != nil { + return 0, err216 } - i -= n215 - i = encodeVarintTypes(dAtA, i, uint64(n215)) + i -= n216 + i = encodeVarintTypes(dAtA, i, uint64(n216)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -39661,21 +39778,21 @@ 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 - } - i -= n218 - i = encodeVarintTypes(dAtA, i, uint64(n218)) - i-- - dAtA[i] = 0x3a - n219, err219 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + n219, err219 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) if err219 != nil { return 0, err219 } i -= n219 i = encodeVarintTypes(dAtA, i, uint64(n219)) i-- + dAtA[i] = 0x3a + n220, err220 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + if err220 != nil { + return 0, err220 + } + i -= n220 + i = encodeVarintTypes(dAtA, i, uint64(n220)) + i-- dAtA[i] = 0x32 if len(m.Id) > 0 { i -= len(m.Id) @@ -40371,12 +40488,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 + n232, err232 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err232 != nil { + return 0, err232 } - i -= n231 - i = encodeVarintTypes(dAtA, i, uint64(n231)) + i -= n232 + i = encodeVarintTypes(dAtA, i, uint64(n232)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -40468,12 +40585,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 + 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 } - i -= n232 - i = encodeVarintTypes(dAtA, i, uint64(n232)) + i -= n233 + i = encodeVarintTypes(dAtA, i, uint64(n233)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -40522,12 +40639,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 + 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 -= n233 - i = encodeVarintTypes(dAtA, i, uint64(n233)) + i -= n234 + i = encodeVarintTypes(dAtA, i, uint64(n234)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -40585,12 +40702,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 + 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 -= n234 - i = encodeVarintTypes(dAtA, i, uint64(n234)) + i -= n235 + i = encodeVarintTypes(dAtA, i, uint64(n235)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -40862,29 +40979,29 @@ 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 - } - i -= n241 - i = encodeVarintTypes(dAtA, i, uint64(n241)) - i-- - dAtA[i] = 0x42 - n242, err242 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + n242, err242 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) if err242 != nil { return 0, err242 } i -= n242 i = encodeVarintTypes(dAtA, i, uint64(n242)) i-- - dAtA[i] = 0x3a - n243, err243 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + dAtA[i] = 0x42 + n243, err243 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err243 != nil { return 0, err243 } i -= n243 i = encodeVarintTypes(dAtA, i, uint64(n243)) i-- + dAtA[i] = 0x3a + n244, err244 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + if err244 != nil { + return 0, err244 + } + i -= n244 + i = encodeVarintTypes(dAtA, i, uint64(n244)) + i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { i -= len(m.BearerToken) @@ -41116,21 +41233,21 @@ 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 - } - i -= n244 - i = encodeVarintTypes(dAtA, i, uint64(n244)) - i-- - dAtA[i] = 0x1a - n245, err245 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + n245, err245 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) if err245 != nil { return 0, err245 } i -= n245 i = encodeVarintTypes(dAtA, i, uint64(n245)) i-- + dAtA[i] = 0x1a + n246, err246 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + if err246 != nil { + return 0, err246 + } + i -= n246 + i = encodeVarintTypes(dAtA, i, uint64(n246)) + i-- dAtA[i] = 0x12 if len(m.ID) > 0 { i -= len(m.ID) @@ -41411,12 +41528,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 + n250, err250 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) + if err250 != nil { + return 0, err250 } - i -= n249 - i = encodeVarintTypes(dAtA, i, uint64(n249)) + i -= n250 + i = encodeVarintTypes(dAtA, i, uint64(n250)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -44203,12 +44320,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 + n288, err288 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err288 != nil { + return 0, err288 } - i -= n287 - i = encodeVarintTypes(dAtA, i, uint64(n287)) + i -= n288 + i = encodeVarintTypes(dAtA, i, uint64(n288)) i-- dAtA[i] = 0x5a } @@ -45220,21 +45337,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 + n306, err306 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) + if err306 != nil { + return 0, err306 } - i -= n305 - i = encodeVarintTypes(dAtA, i, uint64(n305)) + i -= n306 + i = encodeVarintTypes(dAtA, i, uint64(n306)) 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 + n307, err307 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err307 != nil { + return 0, err307 } - i -= n306 - i = encodeVarintTypes(dAtA, i, uint64(n306)) + i -= n307 + i = encodeVarintTypes(dAtA, i, uint64(n307)) i-- dAtA[i] = 0x1a } @@ -45951,12 +46068,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 + n319, err319 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err319 != nil { + return 0, err319 } - i -= n318 - i = encodeVarintTypes(dAtA, i, uint64(n318)) + i -= n319 + i = encodeVarintTypes(dAtA, i, uint64(n319)) i-- dAtA[i] = 0x62 } @@ -46136,12 +46253,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 + n322, err322 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err322 != nil { + return 0, err322 } - i -= n321 - i = encodeVarintTypes(dAtA, i, uint64(n321)) + i -= n322 + i = encodeVarintTypes(dAtA, i, uint64(n322)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -46521,21 +46638,21 @@ 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 - } - i -= n325 - i = encodeVarintTypes(dAtA, i, uint64(n325)) - i-- - dAtA[i] = 0x2a - n326, err326 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + n326, err326 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) if err326 != nil { return 0, err326 } i -= n326 i = encodeVarintTypes(dAtA, i, uint64(n326)) i-- + dAtA[i] = 0x2a + n327, err327 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err327 != nil { + return 0, err327 + } + i -= n327 + i = encodeVarintTypes(dAtA, i, uint64(n327)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -46638,12 +46755,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 + n328, err328 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) + if err328 != nil { + return 0, err328 } - i -= n327 - i = encodeVarintTypes(dAtA, i, uint64(n327)) + i -= n328 + i = encodeVarintTypes(dAtA, i, uint64(n328)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -47355,12 +47472,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 + n341, err341 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err341 != nil { + return 0, err341 } - i -= n340 - i = encodeVarintTypes(dAtA, i, uint64(n340)) + i -= n341 + i = encodeVarintTypes(dAtA, i, uint64(n341)) i-- dAtA[i] = 0x1a if len(m.Message) > 0 { @@ -47490,12 +47607,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 + n342, err342 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err342 != nil { + return 0, err342 } - i -= n341 - i = encodeVarintTypes(dAtA, i, uint64(n341)) + i -= n342 + i = encodeVarintTypes(dAtA, i, uint64(n342)) i-- dAtA[i] = 0x22 if len(m.Reason) > 0 { @@ -48247,12 +48364,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 + n366, err366 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + if err366 != nil { + return 0, err366 } - i -= n365 - i = encodeVarintTypes(dAtA, i, uint64(n365)) + i -= n366 + i = encodeVarintTypes(dAtA, i, uint64(n366)) i-- dAtA[i] = 0x22 if len(m.OrganizationName) > 0 { @@ -50364,12 +50481,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 + n383, err383 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) + if err383 != nil { + return 0, err383 } - i -= n382 - i = encodeVarintTypes(dAtA, i, uint64(n382)) + i -= n383 + i = encodeVarintTypes(dAtA, i, uint64(n383)) i-- dAtA[i] = 0x1a if len(m.ErrorMessage) > 0 { @@ -50807,22 +50924,22 @@ func (m *PluginOktaStatusDetailsAppGroupSync) MarshalToSizedBuffer(dAtA []byte) dAtA[i] = 0x28 } if m.LastFailed != nil { - n393, err393 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err393 != nil { - return 0, err393 + 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 } - i -= n393 - i = encodeVarintTypes(dAtA, i, uint64(n393)) + i -= n394 + i = encodeVarintTypes(dAtA, i, uint64(n394)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n394, err394 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err394 != nil { - return 0, err394 + 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 } - i -= n394 - i = encodeVarintTypes(dAtA, i, uint64(n394)) + i -= n395 + i = encodeVarintTypes(dAtA, i, uint64(n395)) i-- dAtA[i] = 0x1a } @@ -50881,22 +50998,22 @@ func (m *PluginOktaStatusDetailsUsersSync) MarshalToSizedBuffer(dAtA []byte) (in dAtA[i] = 0x28 } if m.LastFailed != nil { - n395, err395 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err395 != nil { - return 0, err395 + 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 -= n395 - i = encodeVarintTypes(dAtA, i, uint64(n395)) + i -= n396 + i = encodeVarintTypes(dAtA, i, uint64(n396)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n396, err396 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err396 != nil { - return 0, err396 + 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 -= n396 - i = encodeVarintTypes(dAtA, i, uint64(n396)) + i -= n397 + i = encodeVarintTypes(dAtA, i, uint64(n397)) i-- dAtA[i] = 0x1a } @@ -51015,22 +51132,22 @@ func (m *PluginOktaStatusDetailsAccessListsSync) MarshalToSizedBuffer(dAtA []byt } } if m.LastFailed != nil { - n397, err397 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) - if err397 != nil { - return 0, err397 + 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 -= n397 - i = encodeVarintTypes(dAtA, i, uint64(n397)) + i -= n398 + i = encodeVarintTypes(dAtA, i, uint64(n398)) i-- dAtA[i] = 0x22 } if m.LastSuccessful != nil { - n398, err398 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) - if err398 != nil { - return 0, err398 + 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 -= n398 - i = encodeVarintTypes(dAtA, i, uint64(n398)) + i -= n399 + i = encodeVarintTypes(dAtA, i, uint64(n399)) i-- dAtA[i] = 0x1a } @@ -51196,12 +51313,12 @@ func (m *PluginOAuth2AccessTokenCredentials) MarshalToSizedBuffer(dAtA []byte) ( i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n403, err403 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err403 != nil { - return 0, err403 + n404, err404 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err404 != nil { + return 0, err404 } - i -= n403 - i = encodeVarintTypes(dAtA, i, uint64(n403)) + i -= n404 + i = encodeVarintTypes(dAtA, i, uint64(n404)) i-- dAtA[i] = 0x1a if len(m.RefreshToken) > 0 { @@ -52159,21 +52276,21 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n418, err418 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err418 != nil { - return 0, err418 - } - i -= n418 - i = encodeVarintTypes(dAtA, i, uint64(n418)) - i-- - dAtA[i] = 0x12 - n419, err419 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + n419, err419 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) if err419 != nil { return 0, err419 } i -= n419 i = encodeVarintTypes(dAtA, i, uint64(n419)) i-- + dAtA[i] = 0x12 + n420, err420 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err420 != nil { + return 0, err420 + } + i -= n420 + i = encodeVarintTypes(dAtA, i, uint64(n420)) + i-- dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -52599,12 +52716,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n426, err426 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err426 != nil { - return 0, err426 + n427, err427 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err427 != nil { + return 0, err427 } - i -= n426 - i = encodeVarintTypes(dAtA, i, uint64(n426)) + i -= n427 + i = encodeVarintTypes(dAtA, i, uint64(n427)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -52612,12 +52729,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n427, err427 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err427 != nil { - return 0, err427 + n428, err428 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err428 != nil { + return 0, err428 } - i -= n427 - i = encodeVarintTypes(dAtA, i, uint64(n427)) + i -= n428 + i = encodeVarintTypes(dAtA, i, uint64(n428)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -54262,12 +54379,12 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - n454, err454 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) - if err454 != nil { - return 0, err454 + n455, err455 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err455 != nil { + return 0, err455 } - i -= n454 - i = encodeVarintTypes(dAtA, i, uint64(n454)) + i -= n455 + i = encodeVarintTypes(dAtA, i, uint64(n455)) i-- dAtA[i] = 0x12 if len(m.AWS) > 0 { @@ -54482,12 +54599,12 @@ func (m *TargetHealth) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2a } if m.TransitionTimestamp != nil { - n457, err457 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) - if err457 != nil { - return 0, err457 + n458, err458 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) + if err458 != nil { + return 0, err458 } - i -= n457 - i = encodeVarintTypes(dAtA, i, uint64(n457)) + i -= n458 + i = encodeVarintTypes(dAtA, i, uint64(n458)) i-- dAtA[i] = 0x22 } @@ -55993,6 +56110,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) } @@ -77125,6 +77272,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:]) 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/terraform-provider/data-sources/app.mdx b/docs/pages/reference/terraform-provider/data-sources/app.mdx index ae1ecc738108d..827a25a7c81f0 100644 --- a/docs/pages/reference/terraform-provider/data-sources/app.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/app.mdx @@ -48,6 +48,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)) @@ -110,6 +111,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/app.mdx b/docs/pages/reference/terraform-provider/resources/app.mdx index 7d7e7cadc9bba..cec7314b479ba 100644 --- a/docs/pages/reference/terraform-provider/resources/app.mdx +++ b/docs/pages/reference/terraform-provider/resources/app.mdx @@ -70,6 +70,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)) @@ -132,6 +133,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/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/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/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index c7e83fe403d6a..f6ca94127416a 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, @@ -12061,6 +12082,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 + } + } + } + } + } + } + } } } } @@ -13656,6 +13756,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 diff --git a/lib/config/configuration.go b/lib/config/configuration.go index 1659964dbe0f1..d32a00463fa00 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -1991,6 +1991,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) } diff --git a/lib/config/configuration_test.go b/lib/config/configuration_test.go index 8fe75d02d0e7e..3ea7cab3b1682 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -446,6 +446,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{ { @@ -1643,6 +1652,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{ { diff --git a/lib/config/fileconf.go b/lib/config/fileconf.go index a3af570d7b200..94539f466ab8c 100644 --- a/lib/config/fileconf.go +++ b/lib/config/fileconf.go @@ -2143,6 +2143,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 +2204,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/service/service.go b/lib/service/service.go index 671259ab0ab0a..25e35a997395e 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -6169,6 +6169,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) diff --git a/lib/service/servicecfg/app.go b/lib/service/servicecfg/app.go index 28f843ed7b0c1..7688d16a35fcf 100644 --- a/lib/service/servicecfg/app.go +++ b/lib/service/servicecfg/app.go @@ -108,6 +108,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 +159,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) } } From f14f324edb26c83c3cb96d418adf382fda7ae85b Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 29 May 2025 14:22:09 -0400 Subject: [PATCH 04/21] MCP access part 2: new role options, access checker, role editor (#54734) * MCP access part 2: new role options, access checker, role editor * catch unsupported mcp fields * simplify mcpToolsToModel --- api/constants/constants.go | 3 + api/proto/teleport/legacy/types/types.proto | 12 + api/types/role.go | 23 + api/types/types.pb.go | 5283 +++++++++-------- constants.go | 4 + .../resources-teleport-dev-roles.mdx | 28 + .../resources-teleport-dev-rolesv6.mdx | 14 + .../resources-teleport-dev-rolesv7.mdx | 14 + .../resources-teleport-dev-rolesv8.mdx | 14 + .../terraform-provider/data-sources/role.mdx | 16 + .../terraform-provider/resources/role.mdx | 16 + .../resources.teleport.dev_roles.yaml | 60 + .../resources.teleport.dev_rolesv6.yaml | 30 + .../resources.teleport.dev_rolesv7.yaml | 30 + .../resources.teleport.dev_rolesv8.yaml | 30 + gen/preset-roles.json | 7 +- .../bases/resources.teleport.dev_roles.yaml | 60 + .../bases/resources.teleport.dev_rolesv6.yaml | 30 + .../bases/resources.teleport.dev_rolesv7.yaml | 30 + .../bases/resources.teleport.dev_rolesv8.yaml | 30 + .../terraform/tfschema/types_terraform.go | 278 + lib/services/access_checker.go | 24 + lib/services/access_checker_test.go | 75 + lib/services/presets.go | 18 + lib/services/presets_test.go | 12 + lib/services/role.go | 22 +- lib/services/role_test.go | 105 +- .../StandardEditor/Resources.test.tsx | 8 + .../RoleEditor/StandardEditor/Resources.tsx | 7 + .../StandardEditor/standardmodel.test.ts | 42 + .../StandardEditor/standardmodel.ts | 33 +- .../StandardEditor/validation.test.ts | 2 + .../RoleEditor/StandardEditor/validation.ts | 7 +- .../teleport/src/services/resources/types.ts | 5 + 34 files changed, 3843 insertions(+), 2529 deletions(-) diff --git a/api/constants/constants.go b/api/constants/constants.go index 918af99028fd2..490852904f664 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/types.proto b/api/proto/teleport/legacy/types/types.proto index 1f5f9a628c11c..502d049bd9b9a 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -3802,6 +3802,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 @@ -3816,6 +3819,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/role.go b/api/types/role.go index c9e3cd5e1168f..e2be003d184af 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -298,6 +298,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 } @@ -2280,6 +2286,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 fc983d7f96464..c5cb43ff15952 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1246,7 +1246,7 @@ func (x ConnectionDiagnosticTrace_TraceType) String() string { } func (ConnectionDiagnosticTrace_TraceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{273, 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{273, 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{364, 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{365, 0} } type KeepAlive struct { @@ -9565,10 +9565,12 @@ 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{} } @@ -9688,6 +9690,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. @@ -9735,7 +9782,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{142} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9779,7 +9826,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{143} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9832,7 +9879,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{144} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9885,7 +9932,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{145} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9933,7 +9980,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{146} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10009,7 +10056,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{147} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10055,7 +10102,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{148} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *AccessRequestConditionsReason) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10108,7 +10155,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{149} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10150,7 +10197,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{150} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10193,7 +10240,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{151} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10239,7 +10286,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{152} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10285,7 +10332,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{153} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10334,7 +10381,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{154} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10382,7 +10429,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{155} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10424,7 +10471,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{156} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10466,7 +10513,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{157} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10517,7 +10564,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{158} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10566,7 +10613,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{159} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10640,7 +10687,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{160} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10690,7 +10737,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{161} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10738,7 +10785,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{162} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10783,7 +10830,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10832,7 +10879,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{164} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10889,7 +10936,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{165} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10999,7 +11046,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{166} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11045,7 +11092,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{167} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11127,7 +11174,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{168} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11173,7 +11220,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{169} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11216,7 +11263,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{170} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11262,7 +11309,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{171} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11304,7 +11351,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{172} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11354,7 +11401,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{173} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11401,7 +11448,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{174} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11450,7 +11497,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{175} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11498,7 +11545,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{176} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11546,7 +11593,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{177} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11597,7 +11644,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{178} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11645,7 +11692,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{179} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11691,7 +11738,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{180} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11740,7 +11787,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{181} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11782,7 +11829,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{182} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11831,7 +11878,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{183} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11916,7 +11963,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{184} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11961,7 +12008,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{185} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12003,7 +12050,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{186} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12074,7 +12121,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{187} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12123,7 +12170,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{188} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12170,7 +12217,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{189} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12221,7 +12268,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{190} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12270,7 +12317,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{191} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12314,7 +12361,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{192} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12364,7 +12411,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{193} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12413,7 +12460,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{194} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12464,7 +12511,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{195} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12512,7 +12559,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{196} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12558,7 +12605,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{197} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12604,7 +12651,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{198} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12646,7 +12693,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{199} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12695,7 +12742,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{200} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12747,7 +12794,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{201} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12799,7 +12846,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{202} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12843,7 +12890,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{203} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12887,7 +12934,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{204} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12931,7 +12978,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{205} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12975,7 +13022,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{206} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13019,7 +13066,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{207} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13061,7 +13108,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{208} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13110,7 +13157,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{209} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13157,7 +13204,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{210} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13201,7 +13248,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{211} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13243,7 +13290,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{212} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13294,7 +13341,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{213} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13336,7 +13383,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{214} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13426,7 +13473,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{215} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13468,7 +13515,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{216} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13513,7 +13560,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{217} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13570,7 +13617,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{218} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13665,7 +13712,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{219} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13716,7 +13763,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{220} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13758,7 +13805,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{221} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13848,7 +13895,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{222} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13907,7 +13954,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{223} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14000,7 +14047,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{224} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14046,7 +14093,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{225} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14091,7 +14138,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{226} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14142,7 +14189,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{227} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14184,7 +14231,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{228} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14247,7 +14294,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{229} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14336,7 +14383,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{230} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14380,7 +14427,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{231} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14436,7 +14483,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{232} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14521,7 +14568,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{233} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14565,7 +14612,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{234} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14616,7 +14663,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{235} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14668,7 +14715,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{236} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14714,7 +14761,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{237} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14764,7 +14811,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{238} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14806,7 +14853,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{239} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14862,7 +14909,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{240} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14916,7 +14963,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{241} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14966,7 +15013,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{242} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15023,7 +15070,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{243} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15067,7 +15114,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{244} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15110,7 +15157,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{245} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15163,7 +15210,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{246} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15207,7 +15254,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{247} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15255,7 +15302,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{248} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15299,7 +15346,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{249} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15343,7 +15390,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{250} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15396,7 +15443,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{251} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15440,7 +15487,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{252} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15491,7 +15538,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{253} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15532,7 +15579,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{254} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15619,7 +15666,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{255} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15673,7 +15720,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{256} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15718,7 +15765,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{257} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15762,7 +15809,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{258} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15802,7 +15849,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{259} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15848,7 +15895,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{260} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15892,7 +15939,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{261} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15990,7 +16037,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{262} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16037,7 +16084,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{263} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16085,7 +16132,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{264} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16129,7 +16176,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{265} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16175,7 +16222,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{266} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16226,7 +16273,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{267} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16268,7 +16315,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{268} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16310,7 +16357,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{269} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16354,7 +16401,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{270} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16400,7 +16447,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{271} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16450,7 +16497,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{272} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16496,7 +16543,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{273} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16539,7 +16586,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{274} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16583,7 +16630,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{275} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16625,7 +16672,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{276} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16669,7 +16716,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{277} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16711,7 +16758,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{278} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16757,7 +16804,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{279} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16810,7 +16857,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{280} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16860,7 +16907,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{281} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16912,7 +16959,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{282} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16970,7 +17017,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{283} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17023,7 +17070,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{284} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17092,7 +17139,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{285} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17396,7 +17443,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{286} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *PluginGithubSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17436,7 +17483,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{287} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17477,7 +17524,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{288} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17524,7 +17571,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{289} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17572,7 +17619,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{290} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17618,7 +17665,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{291} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17664,7 +17711,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{292} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17704,7 +17751,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{293} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17755,7 +17802,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{294} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17797,7 +17844,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{295} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17849,7 +17896,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{296} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17896,7 +17943,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{297} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17997,7 +18044,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{298} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18038,7 +18085,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{299} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18082,7 +18129,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{300} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18127,7 +18174,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{301} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18181,7 +18228,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{302} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18226,7 +18273,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{303} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18272,7 +18319,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{304} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18318,7 +18365,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{305} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18362,7 +18409,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{306} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18450,7 +18497,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{307} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18495,7 +18542,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{308} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *AWSICCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18585,7 +18632,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{309} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *AWSICCredentialSourceSystem) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18629,7 +18676,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{310} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *AWSICCredentialSourceOIDC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18685,7 +18732,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{311} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *AWSICResourceFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18808,7 +18855,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{312} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *AWSICUserSyncFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18855,7 +18902,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{313} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18897,7 +18944,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{314} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *PluginAWSICStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18942,7 +18989,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{315} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *AWSICGroupImportStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18993,7 +19040,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{316} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *PluginEmailSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19081,7 +19128,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{317} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *MailgunSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19128,7 +19175,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{318} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *SMTPSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19178,7 +19225,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{319} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *PluginMSTeamsSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19225,7 +19272,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{320} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *PluginNetIQSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19270,7 +19317,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{321} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19370,7 +19417,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{322} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19413,7 +19460,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{323} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19473,7 +19520,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{324} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19602,7 +19649,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{325} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *PluginNetIQStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19648,7 +19695,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{326} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19692,7 +19739,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{327} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19746,7 +19793,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{328} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19799,7 +19846,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{329} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19856,7 +19903,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{330} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19910,7 +19957,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{331} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19953,7 +20000,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{332} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20015,7 +20062,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{333} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20063,7 +20110,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{335} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20174,7 +20221,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{336} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20215,7 +20262,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{337} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20257,7 +20304,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{338} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20299,7 +20346,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{339} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20342,7 +20389,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{340} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20390,7 +20437,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{341} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20517,7 +20564,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{342} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20563,7 +20610,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{343} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20611,7 +20658,7 @@ func (m *PluginStaticCredentialsSSHCertAuthorities) String() string { } func (*PluginStaticCredentialsSSHCertAuthorities) ProtoMessage() {} func (*PluginStaticCredentialsSSHCertAuthorities) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{343} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *PluginStaticCredentialsSSHCertAuthorities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20654,7 +20701,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{345} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20725,7 +20772,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{346} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20772,7 +20819,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{347} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20814,7 +20861,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{348} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20856,7 +20903,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{349} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20906,7 +20953,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{350} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20948,7 +20995,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{351} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20994,7 +21041,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{352} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21036,7 +21083,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{353} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21082,7 +21129,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{354} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21129,7 +21176,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{355} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21172,7 +21219,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{356} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21215,7 +21262,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{357} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21257,7 +21304,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{358} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21301,7 +21348,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{359} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21345,7 +21392,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{360} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21388,7 +21435,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{361} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21436,7 +21483,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{362} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21479,7 +21526,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{363} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21533,7 +21580,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{364} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21577,7 +21624,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{365} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21622,7 +21669,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{366} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21671,7 +21718,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{367} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21802,7 +21849,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{367} + return fileDescriptor_9198ee693835762e, []int{368} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21848,7 +21895,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{368} + return fileDescriptor_9198ee693835762e, []int{369} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21890,7 +21937,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{369} + return fileDescriptor_9198ee693835762e, []int{370} } func (m *GitHubIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21935,7 +21982,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{370} + return fileDescriptor_9198ee693835762e, []int{371} } func (m *AWSRAIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21984,7 +22031,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{371} + return fileDescriptor_9198ee693835762e, []int{372} } func (m *AWSRolesAnywhereProfileSyncConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22041,7 +22088,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{372} + return fileDescriptor_9198ee693835762e, []int{373} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22098,7 +22145,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{373} + return fileDescriptor_9198ee693835762e, []int{374} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22148,7 +22195,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{374} + return fileDescriptor_9198ee693835762e, []int{375} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22189,7 +22236,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{375} + return fileDescriptor_9198ee693835762e, []int{376} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22239,7 +22286,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{376} + return fileDescriptor_9198ee693835762e, []int{377} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22281,7 +22328,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{377} + return fileDescriptor_9198ee693835762e, []int{378} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22338,7 +22385,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{378} + return fileDescriptor_9198ee693835762e, []int{379} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22403,7 +22450,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{379} + return fileDescriptor_9198ee693835762e, []int{380} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22460,7 +22507,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{380} + return fileDescriptor_9198ee693835762e, []int{381} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22524,7 +22571,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{381} + return fileDescriptor_9198ee693835762e, []int{382} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22569,7 +22616,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{382} + return fileDescriptor_9198ee693835762e, []int{383} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22631,7 +22678,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{383} + return fileDescriptor_9198ee693835762e, []int{384} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22674,7 +22721,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{384} + return fileDescriptor_9198ee693835762e, []int{385} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22717,7 +22764,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{385} + return fileDescriptor_9198ee693835762e, []int{386} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22771,7 +22818,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{386} + return fileDescriptor_9198ee693835762e, []int{387} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22826,7 +22873,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{387} + return fileDescriptor_9198ee693835762e, []int{388} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22872,7 +22919,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{388} + return fileDescriptor_9198ee693835762e, []int{389} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22914,7 +22961,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{389} + return fileDescriptor_9198ee693835762e, []int{390} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22960,7 +23007,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{390} + return fileDescriptor_9198ee693835762e, []int{391} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23005,7 +23052,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{391} + return fileDescriptor_9198ee693835762e, []int{392} } func (m *AccessGraphAWSSyncCloudTrailLogs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23053,7 +23100,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{392} + return fileDescriptor_9198ee693835762e, []int{393} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23097,7 +23144,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{393} + return fileDescriptor_9198ee693835762e, []int{394} } func (m *AccessGraphAzureSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23153,7 +23200,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{394} + return fileDescriptor_9198ee693835762e, []int{395} } func (m *TargetHealth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -23386,6 +23433,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") @@ -23654,2070 +23702,2072 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 32993 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, 0xc3, - 0x69, 0x4e, 0xcd, 0x0c, 0x87, 0x9c, 0x19, 0x92, 0x4b, 0x70, 0x87, 0xbb, 0xb3, 0xf3, 0xb5, 0x0d, - 0x34, 0x48, 0x80, 0x04, 0xc9, 0x9e, 0x6a, 0x80, 0xdc, 0xd5, 0xee, 0x6c, 0x6d, 0xa1, 0x3b, 0x01, - 0xd4, 0xa0, 0xbb, 0xaa, 0xb7, 0xaa, 0x9a, 0x24, 0xb4, 0xd6, 0xcf, 0x92, 0xa5, 0xfd, 0xc9, 0x0a, - 0x9d, 0x24, 0x4b, 0x96, 0xac, 0xf5, 0x85, 0xad, 0x70, 0xc8, 0xf6, 0x9d, 0xcf, 0x0e, 0xe9, 0x6c, - 0xc9, 0xbe, 0xf3, 0x85, 0x42, 0xf2, 0xea, 0xce, 0x96, 0x75, 0x8e, 0x8b, 0x93, 0xc2, 0xe7, 0xfb, - 0xda, 0x50, 0x40, 0xe1, 0xd3, 0xc5, 0xfd, 0x81, 0x88, 0x8b, 0x93, 0xee, 0x22, 0x2e, 0xe2, 0x56, - 0xa1, 0xf3, 0x45, 0xbe, 0xcc, 0xac, 0xca, 0xac, 0xaa, 0x6e, 0x34, 0x67, 0x38, 0xb2, 0x38, 0xa1, - 0x7f, 0x48, 0x74, 0xe6, 0x7b, 0x2f, 0x2b, 0xbf, 0x5e, 0xbe, 0x7c, 0xf9, 0x3e, 0xe0, 0x85, 0x90, - 0xb6, 0x69, 0xd7, 0xf3, 0xc3, 0xcb, 0x6d, 0xba, 0x6b, 0x37, 0x0f, 0x2e, 0x87, 0x07, 0x5d, 0x1a, - 0xf0, 0x7f, 0x2f, 0x75, 0x7d, 0x2f, 0xf4, 0xc8, 0x28, 0xfe, 0x58, 0x9c, 0xdf, 0xf5, 0x76, 0x3d, - 0x2c, 0xb9, 0xcc, 0xfe, 0xe2, 0x95, 0x8b, 0xcf, 0xef, 0x7a, 0xde, 0x6e, 0x9b, 0x5e, 0xc6, 0x5f, - 0xdb, 0xbd, 0x9d, 0xcb, 0xad, 0x9e, 0x6f, 0x87, 0x8e, 0xe7, 0x8a, 0xfa, 0x4a, 0xb2, 0x3e, 0x74, - 0x3a, 0x34, 0x08, 0xed, 0x4e, 0xb7, 0x1f, 0x81, 0x87, 0xbe, 0xdd, 0xed, 0x52, 0x5f, 0xb4, 0xbe, - 0x78, 0x21, 0xfa, 0x40, 0x3b, 0x0c, 0x19, 0x26, 0x23, 0x7e, 0xf9, 0xc1, 0x15, 0xf5, 0xa7, 0x00, - 0xbd, 0xd6, 0xa7, 0x2f, 0x7e, 0x2f, 0x08, 0x69, 0xcb, 0x6a, 0xd1, 0x07, 0x4e, 0x93, 0x5a, 0x3e, - 0xfd, 0x46, 0xcf, 0xf1, 0x69, 0x87, 0xba, 0xa1, 0xc0, 0xbb, 0x98, 0x8d, 0x27, 0x3f, 0x24, 0xf1, - 0x45, 0xc6, 0x2f, 0x14, 0x60, 0xe2, 0x16, 0xa5, 0xdd, 0x6a, 0xdb, 0x79, 0x40, 0xc9, 0x8b, 0x30, - 0x72, 0xc7, 0xee, 0xd0, 0x85, 0xdc, 0xd9, 0xdc, 0xf9, 0x89, 0xe5, 0x99, 0xa3, 0xc3, 0xca, 0x64, - 0x40, 0xfd, 0x07, 0xd4, 0xb7, 0x5c, 0xbb, 0x43, 0x4d, 0xac, 0x24, 0xaf, 0xc1, 0x04, 0xfb, 0x3f, - 0xe8, 0xda, 0x4d, 0xba, 0x90, 0x47, 0xc8, 0xa9, 0xa3, 0xc3, 0xca, 0x84, 0x2b, 0x0b, 0xcd, 0xb8, - 0x9e, 0xac, 0xc3, 0xf8, 0xea, 0xa3, 0xae, 0xe3, 0xd3, 0x60, 0x61, 0xe4, 0x6c, 0xee, 0xfc, 0xe4, - 0xd2, 0xe2, 0x25, 0x3e, 0x46, 0x97, 0xe4, 0x18, 0x5d, 0xda, 0x94, 0x83, 0xb8, 0x3c, 0xf7, 0xdb, - 0x87, 0x95, 0x67, 0x8e, 0x0e, 0x2b, 0xe3, 0x94, 0xa3, 0xfc, 0x95, 0xdf, 0xaf, 0xe4, 0x4c, 0x89, - 0x4f, 0xde, 0x86, 0x91, 0xcd, 0x83, 0x2e, 0x5d, 0x98, 0x38, 0x9b, 0x3b, 0x3f, 0xbd, 0xf4, 0xfc, - 0x25, 0x3e, 0xad, 0xd1, 0xc7, 0xc7, 0x7f, 0x31, 0xa8, 0xe5, 0xe2, 0xd1, 0x61, 0x65, 0x84, 0x81, - 0x98, 0x88, 0x45, 0x2e, 0xc2, 0xd8, 0x9a, 0x17, 0x84, 0xeb, 0xb5, 0x05, 0xc0, 0x4f, 0x3e, 0x71, - 0x74, 0x58, 0x99, 0xdd, 0xf3, 0x82, 0xd0, 0x72, 0x5a, 0xaf, 0x7b, 0x1d, 0x27, 0xa4, 0x9d, 0x6e, - 0x78, 0x60, 0x0a, 0x20, 0xe3, 0x11, 0x4c, 0x69, 0xf4, 0xc8, 0x24, 0x8c, 0x6f, 0xdd, 0xb9, 0x75, - 0xe7, 0xee, 0xfd, 0x3b, 0xe5, 0x67, 0x48, 0x11, 0x46, 0xee, 0xdc, 0xad, 0xad, 0x96, 0x73, 0x64, - 0x1c, 0x0a, 0xd5, 0x7a, 0xbd, 0x9c, 0x27, 0x25, 0x28, 0xd6, 0xaa, 0x9b, 0xd5, 0xe5, 0x6a, 0x63, - 0xb5, 0x5c, 0x20, 0x73, 0x30, 0x73, 0x7f, 0xfd, 0x4e, 0xed, 0xee, 0xfd, 0x86, 0x55, 0x5b, 0x6d, - 0xdc, 0xda, 0xbc, 0x5b, 0x2f, 0x8f, 0x90, 0x69, 0x80, 0x5b, 0x5b, 0xcb, 0xab, 0xe6, 0x9d, 0xd5, - 0xcd, 0xd5, 0x46, 0x79, 0x94, 0xcc, 0x43, 0x59, 0xa2, 0x58, 0x8d, 0x55, 0xf3, 0xde, 0xfa, 0xca, - 0x6a, 0x79, 0xec, 0xe6, 0x48, 0xb1, 0x50, 0x1e, 0x31, 0xc7, 0x37, 0xa8, 0x1d, 0xd0, 0xf5, 0x9a, - 0xf1, 0xb7, 0x0b, 0x50, 0xbc, 0x4d, 0x43, 0xbb, 0x65, 0x87, 0x36, 0x79, 0x4e, 0x9b, 0x1f, 0xec, - 0xa2, 0x32, 0x31, 0x2f, 0xa6, 0x27, 0x66, 0xf4, 0xe8, 0xb0, 0x92, 0xbb, 0xa8, 0x4e, 0xc8, 0x5b, - 0x30, 0x59, 0xa3, 0x41, 0xd3, 0x77, 0xba, 0x6c, 0xb1, 0x2d, 0x14, 0x10, 0xec, 0xf4, 0xd1, 0x61, - 0xe5, 0x44, 0x2b, 0x2e, 0x56, 0x06, 0x44, 0x85, 0x26, 0xeb, 0x30, 0xb6, 0x61, 0x6f, 0xd3, 0x76, - 0xb0, 0x30, 0x7a, 0xb6, 0x70, 0x7e, 0x72, 0xe9, 0x59, 0x31, 0x09, 0xf2, 0x03, 0x2f, 0xf1, 0xda, - 0x55, 0x37, 0xf4, 0x0f, 0x96, 0xe7, 0x8f, 0x0e, 0x2b, 0xe5, 0x36, 0x16, 0xa8, 0x03, 0xcc, 0x41, - 0x48, 0x23, 0x5e, 0x18, 0x63, 0xc7, 0x2e, 0x8c, 0x33, 0xbf, 0x7d, 0x58, 0xc9, 0xb1, 0x09, 0x13, - 0x0b, 0x23, 0xa6, 0xa7, 0x2f, 0x91, 0x25, 0x28, 0x9a, 0xf4, 0x81, 0x13, 0xb0, 0x9e, 0x15, 0xb1, - 0x67, 0x27, 0x8f, 0x0e, 0x2b, 0xc4, 0x17, 0x65, 0xca, 0x67, 0x44, 0x70, 0x8b, 0x6f, 0xc2, 0xa4, - 0xf2, 0xd5, 0xa4, 0x0c, 0x85, 0x7d, 0x7a, 0xc0, 0x47, 0xd8, 0x64, 0x7f, 0x92, 0x79, 0x18, 0x7d, - 0x60, 0xb7, 0x7b, 0x62, 0x48, 0x4d, 0xfe, 0xe3, 0x0b, 0xf9, 0xcf, 0xe7, 0x6e, 0x8e, 0x14, 0xc7, - 0xcb, 0x45, 0x33, 0xbf, 0x5e, 0x33, 0x7e, 0x66, 0x04, 0x8a, 0xa6, 0xc7, 0x37, 0x30, 0xb9, 0x00, - 0xa3, 0x8d, 0xd0, 0x0e, 0xe5, 0x34, 0xcd, 0x1d, 0x1d, 0x56, 0x66, 0xd8, 0xe6, 0xa6, 0x4a, 0xfb, - 0x1c, 0x82, 0x81, 0xd6, 0xf7, 0xec, 0x40, 0x4e, 0x17, 0x82, 0x76, 0x59, 0x81, 0x0a, 0x8a, 0x10, - 0xe4, 0x1c, 0x8c, 0xdc, 0xf6, 0x5a, 0x54, 0xcc, 0x18, 0x39, 0x3a, 0xac, 0x4c, 0x77, 0xbc, 0x96, - 0x0a, 0x88, 0xf5, 0xe4, 0x75, 0x98, 0x58, 0xe9, 0xf9, 0x3e, 0x75, 0xd9, 0x5a, 0x1f, 0x41, 0xe0, - 0xe9, 0xa3, 0xc3, 0x0a, 0x34, 0x79, 0xa1, 0xe5, 0xb4, 0xcc, 0x18, 0x80, 0x4d, 0x43, 0x23, 0xb4, - 0xfd, 0x90, 0xb6, 0x16, 0x46, 0x87, 0x9a, 0x06, 0xb6, 0x3f, 0x67, 0x03, 0x8e, 0x92, 0x9c, 0x06, - 0x41, 0x89, 0xac, 0xc1, 0xe4, 0x0d, 0xdf, 0x6e, 0xd2, 0x3a, 0xf5, 0x1d, 0xaf, 0x85, 0xf3, 0x5b, - 0x58, 0x3e, 0x77, 0x74, 0x58, 0x39, 0xb9, 0xcb, 0x8a, 0xad, 0x2e, 0x96, 0xc7, 0xd8, 0xdf, 0x3b, - 0xac, 0x14, 0x6b, 0x82, 0xd5, 0x9a, 0x2a, 0x2a, 0xf9, 0x3a, 0x9b, 0x9c, 0x20, 0xc4, 0xa1, 0xa5, - 0xad, 0x85, 0xf1, 0x63, 0x3f, 0xd1, 0x10, 0x9f, 0x78, 0xb2, 0x6d, 0x07, 0xa1, 0xe5, 0x73, 0xbc, - 0xc4, 0x77, 0xaa, 0x24, 0xc9, 0x5d, 0x28, 0x36, 0x9a, 0x7b, 0xb4, 0xd5, 0x6b, 0x53, 0x5c, 0x32, - 0x93, 0x4b, 0xa7, 0xc4, 0xa2, 0x96, 0xf3, 0x29, 0xab, 0x97, 0x17, 0x05, 0x6d, 0x12, 0x88, 0x12, - 0x75, 0x3d, 0x49, 0xa8, 0x2f, 0x14, 0xbf, 0xfd, 0xb7, 0x2a, 0xcf, 0xfc, 0xe0, 0xef, 0x9d, 0x7d, - 0xc6, 0xf8, 0xcf, 0xf3, 0x50, 0x4e, 0x12, 0x21, 0x3b, 0x30, 0xb5, 0xd5, 0x6d, 0xd9, 0x21, 0x5d, - 0x69, 0x3b, 0xd4, 0x0d, 0x03, 0x5c, 0x24, 0x83, 0xfb, 0xf4, 0x92, 0x68, 0x77, 0xa1, 0x87, 0x88, - 0x56, 0x93, 0x63, 0x26, 0x7a, 0xa5, 0x93, 0x8d, 0xdb, 0x69, 0x20, 0x03, 0x0f, 0x70, 0x85, 0x3d, - 0x5e, 0x3b, 0x9c, 0xf5, 0xf7, 0x69, 0x47, 0x90, 0x15, 0x0b, 0xc8, 0x6d, 0x6d, 0x1f, 0xe0, 0xca, - 0x1c, 0x7e, 0x01, 0x31, 0x94, 0x8c, 0x05, 0xc4, 0x8a, 0x8d, 0xff, 0x35, 0x07, 0xd3, 0x26, 0x0d, - 0xbc, 0x9e, 0xdf, 0xa4, 0x6b, 0xd4, 0x6e, 0x51, 0x9f, 0x2d, 0xff, 0x5b, 0x8e, 0xdb, 0x12, 0x7b, - 0x0a, 0x97, 0xff, 0xbe, 0xe3, 0xaa, 0xac, 0x1b, 0xeb, 0xc9, 0x67, 0x60, 0xbc, 0xd1, 0xdb, 0x46, - 0xd0, 0x7c, 0xcc, 0x01, 0x82, 0xde, 0xb6, 0x95, 0x00, 0x97, 0x60, 0xe4, 0x32, 0x8c, 0xdf, 0xa3, - 0x7e, 0x10, 0x73, 0x43, 0x3c, 0x1a, 0x1e, 0xf0, 0x22, 0x15, 0x41, 0x40, 0x91, 0x1b, 0x31, 0x47, - 0x16, 0x87, 0xda, 0x4c, 0x82, 0x0f, 0xc6, 0x4b, 0xa5, 0x23, 0x4a, 0xd4, 0xa5, 0x22, 0xa1, 0x8c, - 0xff, 0x29, 0x0f, 0xe5, 0x9a, 0x1d, 0xda, 0xdb, 0x76, 0x20, 0xc6, 0xf3, 0xde, 0x55, 0xc6, 0xe3, - 0x95, 0x8e, 0x22, 0x8f, 0x67, 0x5f, 0xfe, 0x91, 0xbb, 0xf7, 0x72, 0xb2, 0x7b, 0x93, 0xec, 0x84, - 0x15, 0xdd, 0x8b, 0x3b, 0xf5, 0xce, 0xf1, 0x9d, 0x2a, 0x8b, 0x4e, 0x15, 0x65, 0xa7, 0xe2, 0xae, - 0x90, 0x77, 0x60, 0xa4, 0xd1, 0xa5, 0x4d, 0xc1, 0x44, 0xe4, 0xb9, 0xa0, 0x77, 0x8e, 0x01, 0xdc, - 0xbb, 0xba, 0x5c, 0x12, 0x64, 0x46, 0x82, 0x2e, 0x6d, 0x9a, 0x88, 0x46, 0x56, 0x61, 0x8c, 0x31, - 0xc4, 0x9e, 0x3c, 0x0c, 0xce, 0x64, 0x13, 0x40, 0x90, 0x7b, 0x57, 0x97, 0xa7, 0x05, 0x89, 0xb1, - 0x00, 0x4b, 0x4c, 0x81, 0xac, 0xec, 0xbd, 0x7f, 0x5a, 0x80, 0xf9, 0xac, 0xd6, 0xd5, 0xe1, 0x18, - 0x1b, 0x30, 0x1c, 0xe7, 0xa1, 0xc8, 0x24, 0x01, 0x76, 0xba, 0x22, 0xd7, 0x99, 0x58, 0x2e, 0xb1, - 0x9e, 0xef, 0x89, 0x32, 0x33, 0xaa, 0x25, 0x2f, 0x46, 0x82, 0x45, 0x31, 0xa6, 0x27, 0x04, 0x0b, - 0x29, 0x4e, 0xb0, 0x25, 0x23, 0x39, 0x01, 0xca, 0x1f, 0xf1, 0xe8, 0xca, 0xe2, 0x78, 0xc9, 0xf8, - 0xa2, 0x44, 0x3b, 0xad, 0xe4, 0xd9, 0xb2, 0x0a, 0x45, 0xd9, 0xad, 0x85, 0x12, 0x12, 0x9a, 0x4d, - 0x0c, 0xd5, 0xbd, 0xab, 0x7c, 0x4d, 0xb4, 0xc4, 0x6f, 0x95, 0x8c, 0x84, 0x21, 0x57, 0xa1, 0x58, - 0xf7, 0xbd, 0x47, 0x07, 0xeb, 0xb5, 0x60, 0x61, 0xea, 0x6c, 0xe1, 0xfc, 0xc4, 0xf2, 0xa9, 0xa3, - 0xc3, 0xca, 0x5c, 0x97, 0x95, 0x59, 0x4e, 0x4b, 0x3d, 0xb0, 0x23, 0xc0, 0x9b, 0x23, 0xc5, 0x5c, - 0x39, 0x7f, 0x73, 0xa4, 0x98, 0x2f, 0x17, 0xb8, 0x94, 0x72, 0x73, 0xa4, 0x38, 0x52, 0x1e, 0xbd, - 0x39, 0x52, 0x1c, 0x45, 0xb9, 0x65, 0xa2, 0x0c, 0x37, 0x47, 0x8a, 0x93, 0xe5, 0x92, 0x26, 0x34, - 0x20, 0x81, 0xd0, 0x6b, 0x7a, 0x6d, 0xb3, 0xb0, 0x65, 0xae, 0x9b, 0x63, 0x2b, 0xd5, 0x15, 0xea, - 0x87, 0x66, 0xa1, 0x7a, 0xbf, 0x61, 0x4e, 0xd5, 0x0e, 0x5c, 0xbb, 0xe3, 0x34, 0xf9, 0x09, 0x6c, - 0x16, 0x6e, 0xac, 0xd4, 0x0d, 0x17, 0x4e, 0x66, 0x4f, 0x3b, 0xd9, 0x84, 0xd2, 0xa6, 0xed, 0xef, - 0xd2, 0x70, 0x8d, 0xda, 0xed, 0x70, 0x6f, 0x61, 0x1a, 0x07, 0x60, 0x4e, 0x0c, 0x80, 0x5a, 0xb5, - 0xfc, 0xec, 0xd1, 0x61, 0xe5, 0x54, 0x88, 0x25, 0xd6, 0x1e, 0x16, 0x29, 0x5d, 0xd2, 0xa8, 0x18, - 0x55, 0x98, 0x8e, 0xc7, 0x6e, 0xc3, 0x09, 0x42, 0x72, 0x19, 0x26, 0x64, 0x09, 0xe3, 0xcf, 0x85, - 0xcc, 0x51, 0x36, 0x63, 0x18, 0xe3, 0xb7, 0xf2, 0x00, 0x71, 0xcd, 0x53, 0xba, 0x85, 0x3f, 0xa7, - 0x6d, 0xe1, 0x13, 0xc9, 0x1d, 0xd8, 0x7f, 0xf3, 0xbe, 0x97, 0xd8, 0xbc, 0xa7, 0x92, 0xa8, 0xc3, - 0x6f, 0xdb, 0x5f, 0x18, 0x8f, 0x27, 0x43, 0x6c, 0xd8, 0xf3, 0x10, 0x2d, 0x20, 0x31, 0xa0, 0xb8, - 0x13, 0xbb, 0x72, 0x51, 0x45, 0xb5, 0xe4, 0x34, 0xb0, 0x05, 0x26, 0x06, 0x75, 0xfc, 0xe8, 0xb0, - 0x52, 0xe8, 0xf9, 0x0e, 0x2e, 0x3a, 0x72, 0x19, 0xc4, 0xb2, 0x13, 0x03, 0xc8, 0x56, 0xfb, 0x6c, - 0xd3, 0xb6, 0x9a, 0xd4, 0x0f, 0xe3, 0x11, 0x5f, 0xc8, 0xc9, 0xd5, 0x49, 0xba, 0xa0, 0x2f, 0xcd, - 0x85, 0x11, 0x5c, 0x06, 0xe7, 0x33, 0x47, 0xe5, 0x92, 0x06, 0xca, 0xa5, 0xdf, 0xb3, 0xf2, 0x30, - 0x6d, 0xf1, 0x3a, 0x2b, 0x25, 0x09, 0xeb, 0x0d, 0x90, 0xab, 0xc0, 0x76, 0x84, 0x18, 0x7d, 0x10, - 0xed, 0x54, 0xef, 0x37, 0x96, 0x4f, 0x08, 0x4a, 0x53, 0xf6, 0x43, 0x15, 0x9d, 0x41, 0x93, 0xb7, - 0x80, 0x6d, 0x19, 0x31, 0xee, 0x44, 0x20, 0xdd, 0x58, 0xa9, 0xaf, 0xb4, 0xbd, 0x5e, 0xab, 0xf1, - 0xfe, 0x46, 0x8c, 0xbc, 0xdb, 0xec, 0xaa, 0xc8, 0x37, 0x56, 0xea, 0xe4, 0x2d, 0x18, 0xad, 0x7e, - 0x7f, 0xcf, 0xa7, 0x42, 0xac, 0x2a, 0xc9, 0x36, 0x59, 0xd9, 0xf2, 0x29, 0x81, 0x38, 0x63, 0xb3, - 0x9f, 0xaa, 0x38, 0x8a, 0xf5, 0xac, 0xe5, 0xcd, 0x8d, 0x86, 0x10, 0x99, 0x48, 0x62, 0x58, 0x36, - 0x37, 0x94, 0xcf, 0x0e, 0xb5, 0x5e, 0x33, 0x2c, 0x72, 0x19, 0xf2, 0xd5, 0x1a, 0x5e, 0xe4, 0x26, - 0x97, 0x26, 0x64, 0xb3, 0xb5, 0xe5, 0x79, 0x81, 0x52, 0xb2, 0xd5, 0x6d, 0x90, 0xaf, 0xd6, 0xc8, - 0x32, 0x8c, 0xde, 0x3e, 0x68, 0xbc, 0xbf, 0x21, 0x98, 0xa7, 0xdc, 0xf2, 0x58, 0x76, 0x17, 0xd9, - 0x4c, 0x10, 0x7f, 0x71, 0xe7, 0x20, 0xf8, 0x46, 0x5b, 0xfd, 0x62, 0x04, 0x23, 0x75, 0x98, 0xa8, - 0xb6, 0x3a, 0x8e, 0xbb, 0x15, 0x50, 0x7f, 0x61, 0x12, 0xe9, 0x2c, 0x24, 0xbe, 0x3b, 0xaa, 0x5f, - 0x5e, 0x38, 0x3a, 0xac, 0xcc, 0xdb, 0xec, 0xa7, 0xd5, 0x0b, 0xa8, 0xaf, 0x50, 0x8b, 0x89, 0x90, - 0x3a, 0xc0, 0x6d, 0xcf, 0xdd, 0xf5, 0xaa, 0x61, 0xdb, 0x0e, 0x12, 0xec, 0x38, 0xae, 0x88, 0xa4, - 0x9e, 0x13, 0x1d, 0x56, 0x66, 0xd9, 0xac, 0x50, 0x21, 0xa8, 0xd0, 0x20, 0xd7, 0x61, 0xec, 0xae, - 0x6f, 0x37, 0xdb, 0x74, 0x61, 0x0a, 0xa9, 0xcd, 0x0b, 0x6a, 0xbc, 0x50, 0xf6, 0x74, 0x41, 0x10, - 0x2c, 0x7b, 0x58, 0xac, 0xde, 0xae, 0x38, 0xe0, 0xe2, 0x7d, 0x20, 0xe9, 0x35, 0x99, 0x71, 0xb7, - 0x79, 0x4d, 0xbd, 0xdb, 0xc4, 0x9b, 0x7e, 0xc5, 0xeb, 0x74, 0x6c, 0xb7, 0x85, 0xb8, 0xf7, 0x96, - 0x94, 0x2b, 0x8f, 0xf1, 0x0d, 0x98, 0x4d, 0x0d, 0xd6, 0x31, 0xd7, 0xd2, 0x77, 0x61, 0xa6, 0x46, - 0x77, 0xec, 0x5e, 0x3b, 0x8c, 0x4e, 0x2e, 0xbe, 0x45, 0xf1, 0x82, 0xd8, 0xe2, 0x55, 0x96, 0x3c, - 0xae, 0xcc, 0x24, 0xb0, 0xf1, 0x0e, 0x4c, 0x69, 0xdd, 0x67, 0x37, 0x9c, 0x6a, 0xaf, 0xe5, 0x84, - 0x38, 0x91, 0xb9, 0xf8, 0x86, 0x63, 0xb3, 0x42, 0x9c, 0x2e, 0x33, 0x06, 0x30, 0xfe, 0x8e, 0x2a, - 0x64, 0xc9, 0x93, 0xe4, 0x62, 0xc4, 0x0f, 0x72, 0xb1, 0xc8, 0x97, 0xe2, 0x07, 0x11, 0x37, 0xb8, - 0xc0, 0xf7, 0x66, 0x3e, 0xb5, 0x37, 0x27, 0xc5, 0x4c, 0x14, 0xec, 0x87, 0x01, 0xdf, 0x91, 0xd1, - 0x4a, 0x2d, 0x7c, 0xf4, 0x95, 0xfa, 0x1e, 0x94, 0x6e, 0xdb, 0xae, 0xbd, 0x4b, 0x5b, 0xac, 0x07, - 0x9c, 0xf7, 0x4c, 0xf0, 0x23, 0xad, 0xc3, 0xcb, 0xb1, 0x97, 0xea, 0x22, 0xd2, 0x10, 0xc8, 0x15, - 0xb9, 0xb3, 0x47, 0x33, 0x76, 0xf6, 0x94, 0x68, 0x7d, 0x14, 0x77, 0xb6, 0xd8, 0xcf, 0xc6, 0x77, - 0x26, 0xb0, 0x8f, 0xe4, 0x75, 0x18, 0x33, 0xe9, 0x2e, 0x3b, 0x6a, 0x72, 0xf1, 0x24, 0xf9, 0x58, - 0xa2, 0x0e, 0x0c, 0x87, 0x41, 0xb9, 0x86, 0xb6, 0x82, 0x3d, 0x67, 0x27, 0x14, 0xa3, 0x13, 0xc9, - 0x35, 0xa2, 0x58, 0x91, 0x6b, 0x44, 0x89, 0x7e, 0x0b, 0xe7, 0x65, 0x8c, 0xfb, 0x99, 0xb5, 0x86, - 0x18, 0x34, 0x39, 0xc2, 0x66, 0x4d, 0x61, 0x23, 0xbe, 0x26, 0x95, 0x30, 0x68, 0x72, 0x0d, 0x26, - 0xaa, 0xcd, 0xa6, 0xd7, 0x53, 0xae, 0xba, 0x7c, 0xdf, 0xf2, 0x42, 0x5d, 0xb3, 0x13, 0x83, 0x92, - 0x06, 0x4c, 0xae, 0xb2, 0xfb, 0xa1, 0xb3, 0x62, 0x37, 0xf7, 0xe4, 0x20, 0x49, 0x1e, 0xa6, 0xd4, - 0xc4, 0x3b, 0x97, 0x62, 0x61, 0x93, 0x15, 0xaa, 0xba, 0x11, 0x05, 0x96, 0x6c, 0xc2, 0x64, 0x83, - 0x36, 0x7d, 0x1a, 0x36, 0x42, 0xcf, 0xa7, 0x09, 0x96, 0xac, 0xd4, 0x2c, 0x3f, 0x2f, 0xaf, 0xa8, - 0x01, 0x16, 0x5a, 0x01, 0x2b, 0x55, 0xa9, 0x2a, 0xc0, 0xfc, 0xae, 0xd1, 0xf1, 0xfc, 0x83, 0xda, - 0xb2, 0x60, 0xd3, 0xf1, 0x99, 0xce, 0x8b, 0xd5, 0xbb, 0x06, 0x2b, 0x69, 0x6d, 0xeb, 0x77, 0x0d, - 0x0e, 0x85, 0x33, 0x55, 0x6b, 0xa0, 0x2c, 0x27, 0x98, 0xf6, 0x4c, 0x3c, 0xca, 0x58, 0xac, 0xcc, - 0x54, 0x2b, 0x40, 0x49, 0x50, 0x9b, 0x29, 0x01, 0x45, 0xba, 0x40, 0xe4, 0xac, 0x71, 0xf1, 0xac, - 0x4d, 0x83, 0x40, 0xf0, 0xf2, 0xd3, 0x89, 0xc9, 0x8f, 0x01, 0x96, 0x5f, 0x16, 0xc4, 0xcf, 0xc8, - 0x65, 0x20, 0xae, 0x97, 0xac, 0x52, 0x69, 0x27, 0x83, 0x36, 0x79, 0x13, 0x60, 0xf5, 0x51, 0x48, - 0x7d, 0xd7, 0x6e, 0x47, 0xea, 0x3b, 0xd4, 0x58, 0x51, 0x51, 0xaa, 0x4f, 0xb4, 0x02, 0x4c, 0x56, - 0x60, 0xaa, 0x1a, 0x04, 0xbd, 0x0e, 0x35, 0xbd, 0x36, 0xad, 0x9a, 0x77, 0x90, 0xef, 0x4f, 0x2c, - 0x9f, 0x39, 0x3a, 0xac, 0x9c, 0xb6, 0xb1, 0xc2, 0xf2, 0xbd, 0x36, 0xb5, 0x6c, 0x5f, 0x5d, 0xdd, - 0x3a, 0x0e, 0xb9, 0x0b, 0x70, 0xb7, 0x4b, 0xdd, 0x06, 0xb5, 0xfd, 0xe6, 0x5e, 0x82, 0xcd, 0xc7, - 0x15, 0xcb, 0xcf, 0x89, 0x1e, 0xce, 0x7b, 0x5d, 0xea, 0x06, 0x58, 0xa6, 0x7e, 0x55, 0x0c, 0x49, - 0xee, 0xc3, 0xcc, 0x7a, 0xf5, 0x76, 0xdd, 0x6b, 0x3b, 0xcd, 0x03, 0x21, 0x39, 0x4d, 0xa3, 0x52, - 0xf3, 0xa4, 0xa0, 0x9a, 0xa8, 0xe5, 0xec, 0xc9, 0xb1, 0x3b, 0x56, 0x17, 0x4b, 0x2d, 0x21, 0x3f, - 0x25, 0xa9, 0x90, 0x2f, 0xb3, 0x35, 0x18, 0x30, 0x61, 0x70, 0xd3, 0xde, 0x0d, 0x16, 0x66, 0x34, - 0x25, 0x5d, 0xf5, 0x7e, 0xe3, 0x92, 0x52, 0xcb, 0xc5, 0x94, 0x45, 0xbe, 0x10, 0xb1, 0xd4, 0x0a, - 0xed, 0xdd, 0x40, 0x5f, 0x88, 0x11, 0x34, 0xb9, 0x09, 0x50, 0xf3, 0x9a, 0xbd, 0x0e, 0x75, 0xc3, - 0xda, 0xf2, 0x42, 0x59, 0xbf, 0x7a, 0x44, 0x15, 0x31, 0x6b, 0x6b, 0x79, 0x4d, 0x6d, 0x25, 0x2a, - 0xd8, 0x8b, 0xef, 0x42, 0x39, 0xf9, 0x21, 0x8f, 0xa9, 0x77, 0x9b, 0x2a, 0x4f, 0x2b, 0xbd, 0x5f, - 0x7d, 0xe4, 0x04, 0x61, 0x60, 0x7c, 0x53, 0xdb, 0x81, 0x8c, 0x3b, 0xdc, 0xa2, 0x07, 0x75, 0x9f, - 0xee, 0x38, 0x8f, 0x04, 0x33, 0x43, 0xee, 0xb0, 0x4f, 0x0f, 0xac, 0x2e, 0x96, 0xaa, 0xdc, 0x21, - 0x02, 0x25, 0x9f, 0x85, 0xe2, 0xad, 0xdb, 0x8d, 0x5b, 0xf4, 0x60, 0xbd, 0x26, 0x0e, 0x2a, 0x8e, - 0xd6, 0x09, 0x2c, 0x86, 0xaa, 0xad, 0xb5, 0x08, 0xd2, 0x58, 0x8e, 0x39, 0x21, 0x6b, 0x79, 0xa5, - 0xdd, 0x0b, 0x42, 0xea, 0xaf, 0xd7, 0xd4, 0x96, 0x9b, 0xbc, 0x30, 0xc1, 0x97, 0x22, 0x50, 0xe3, - 0xdf, 0xe5, 0x91, 0x0b, 0xb2, 0x05, 0xbf, 0xee, 0x06, 0xa1, 0xed, 0x36, 0x69, 0x44, 0x00, 0x17, - 0xbc, 0x23, 0x4a, 0x13, 0x0b, 0x3e, 0x06, 0xd6, 0x9b, 0xce, 0x0f, 0xdd, 0x34, 0x6b, 0x52, 0x2a, - 0x5c, 0xd6, 0x6b, 0xaa, 0x56, 0xd8, 0x17, 0xa5, 0x89, 0x26, 0x63, 0x60, 0x72, 0x0e, 0xc6, 0xd7, - 0xab, 0xb7, 0xab, 0xbd, 0x70, 0x0f, 0x79, 0x70, 0x91, 0xcb, 0xe7, 0x6c, 0xb5, 0xda, 0xbd, 0x70, - 0xcf, 0x94, 0x95, 0xe4, 0x32, 0xde, 0x7b, 0x5c, 0x1a, 0x72, 0xed, 0xb1, 0x38, 0x74, 0x03, 0x5e, - 0x94, 0xb8, 0xf6, 0xb0, 0x22, 0xf2, 0x2a, 0x8c, 0xde, 0xab, 0xaf, 0xac, 0xd7, 0xc4, 0x45, 0x1d, - 0x4f, 0xa2, 0x07, 0xdd, 0xa6, 0xfe, 0x25, 0x1c, 0x84, 0xac, 0xc2, 0x74, 0x83, 0x36, 0x7b, 0xbe, - 0x13, 0x1e, 0xdc, 0xf0, 0xbd, 0x5e, 0x37, 0x58, 0x18, 0xc7, 0x36, 0x70, 0xa7, 0x07, 0xa2, 0xc6, - 0xda, 0xc5, 0x2a, 0x05, 0x3b, 0x81, 0x64, 0xfc, 0x66, 0x2e, 0x66, 0x93, 0xe4, 0x9c, 0x26, 0xd6, - 0xa0, 0xca, 0x89, 0x89, 0x35, 0xaa, 0xca, 0x09, 0x05, 0x1c, 0x13, 0xc8, 0x4a, 0x2f, 0x08, 0xbd, - 0xce, 0xaa, 0xdb, 0xea, 0x7a, 0x8e, 0x1b, 0x22, 0x16, 0x1f, 0x7c, 0xe3, 0xe8, 0xb0, 0xf2, 0x7c, - 0x13, 0x6b, 0x2d, 0x2a, 0xaa, 0xad, 0x04, 0x95, 0x0c, 0xec, 0x8f, 0x31, 0x1f, 0xc6, 0xbf, 0xca, - 0x6b, 0xc7, 0x1b, 0xfb, 0x3c, 0x93, 0x76, 0xdb, 0x4e, 0x13, 0x35, 0x08, 0xd8, 0xd1, 0x68, 0x55, - 0xe1, 0xe7, 0xf9, 0x71, 0x2d, 0x1f, 0x21, 0x9d, 0x76, 0x06, 0x36, 0xf9, 0x22, 0x94, 0x98, 0xa4, - 0x21, 0x7e, 0x06, 0x0b, 0x79, 0x1c, 0xec, 0xe7, 0x50, 0x79, 0x18, 0x50, 0x3f, 0x22, 0xa3, 0x89, - 0x28, 0x2a, 0x06, 0x69, 0xc1, 0xc2, 0xa6, 0x6f, 0xbb, 0x81, 0x13, 0xae, 0xba, 0x4d, 0xff, 0x00, - 0x25, 0xa3, 0x55, 0xd7, 0xde, 0x6e, 0xd3, 0x16, 0x76, 0xb7, 0xb8, 0x7c, 0xfe, 0xe8, 0xb0, 0xf2, - 0x52, 0xc8, 0x61, 0x2c, 0x1a, 0x01, 0x59, 0x94, 0x43, 0x29, 0x94, 0xfb, 0x52, 0x62, 0x92, 0x94, - 0x1c, 0x56, 0x7c, 0x3b, 0xe2, 0x42, 0x02, 0x4a, 0x52, 0xd1, 0x6c, 0x30, 0x1e, 0xa6, 0x7e, 0xa6, - 0x8a, 0x60, 0xfc, 0xdf, 0xb9, 0xf8, 0x00, 0x26, 0x6f, 0xc3, 0xa4, 0xd8, 0x31, 0xca, 0xba, 0x40, - 0x0e, 0x2a, 0xb7, 0x57, 0x62, 0x66, 0x55, 0x70, 0x76, 0xef, 0xaf, 0xae, 0x6c, 0x28, 0x6b, 0x03, - 0xef, 0xfd, 0x76, 0xb3, 0x9d, 0xc4, 0x92, 0x60, 0x6c, 0x11, 0x6c, 0x6e, 0x34, 0xf4, 0x51, 0xc1, - 0x45, 0x10, 0xb6, 0x83, 0x8c, 0x61, 0x50, 0x80, 0x3f, 0x7e, 0xc7, 0xff, 0xc7, 0x5c, 0xd6, 0x39, - 0x4f, 0x96, 0x61, 0xea, 0xbe, 0xe7, 0xef, 0xe3, 0xfc, 0x2a, 0x83, 0x80, 0x33, 0xff, 0x50, 0x56, - 0x24, 0x3b, 0xa4, 0xa3, 0xa8, 0xdf, 0xa6, 0x8c, 0x86, 0xfe, 0x6d, 0x09, 0x0a, 0x1a, 0x02, 0x9b, - 0x87, 0x88, 0x62, 0xb4, 0x3b, 0x70, 0x1e, 0xe2, 0x4f, 0xd0, 0x96, 0xb0, 0x0a, 0x6e, 0xfc, 0x7a, - 0x4e, 0x3d, 0xcf, 0xd9, 0x20, 0xd7, 0xbc, 0x8e, 0xed, 0xb8, 0x4a, 0x77, 0xf8, 0x7b, 0x18, 0x96, - 0x26, 0xbf, 0x44, 0x01, 0x26, 0x57, 0xa1, 0xc8, 0x7f, 0x45, 0xbc, 0x16, 0xb5, 0x68, 0x02, 0x51, - 0x3f, 0x28, 0x24, 0x60, 0x6a, 0x66, 0x0a, 0x8f, 0x3b, 0x33, 0xdf, 0xc9, 0xa9, 0x47, 0xf1, 0x47, - 0x3d, 0x6c, 0x12, 0x87, 0x4c, 0xfe, 0x71, 0x0e, 0x99, 0x8f, 0xdd, 0x85, 0x1f, 0xcc, 0xc1, 0xa4, - 0xa2, 0xa5, 0x60, 0x7d, 0xa8, 0xfb, 0xde, 0x87, 0xb4, 0x19, 0xea, 0x7d, 0xe8, 0xf2, 0xc2, 0x44, - 0x1f, 0x22, 0xd0, 0x8f, 0xd1, 0x07, 0xe3, 0x8f, 0x72, 0xe2, 0x8e, 0x34, 0x34, 0x9b, 0xd7, 0x59, - 0x72, 0xfe, 0x71, 0x8e, 0xc8, 0x2f, 0xc2, 0xa8, 0x49, 0x5b, 0x4e, 0x20, 0xee, 0x37, 0xb3, 0xea, - 0x7d, 0x0c, 0x2b, 0x62, 0xb9, 0xc9, 0x67, 0x3f, 0xd5, 0xf3, 0x0d, 0xeb, 0x99, 0x20, 0xbb, 0x1e, - 0x5c, 0x6f, 0xd3, 0x47, 0x0e, 0xdf, 0x8c, 0xe2, 0xa8, 0xc5, 0xe3, 0xcd, 0x09, 0xac, 0x1d, 0x56, - 0x23, 0x24, 0x6a, 0x75, 0xe3, 0x69, 0x38, 0xc6, 0x97, 0x01, 0xe2, 0x26, 0xc9, 0x2d, 0x28, 0x8b, - 0xd5, 0xe0, 0xb8, 0xbb, 0x5c, 0x90, 0x12, 0x63, 0x50, 0x39, 0x3a, 0xac, 0x3c, 0xdb, 0x8c, 0xea, - 0x84, 0xd4, 0xa9, 0xd0, 0x4d, 0x21, 0x1a, 0xff, 0x5b, 0x01, 0xf2, 0x55, 0x9c, 0x90, 0x5b, 0xf4, - 0x20, 0xb4, 0xb7, 0xaf, 0x3b, 0x6d, 0x6d, 0x33, 0xed, 0x63, 0xa9, 0xb5, 0xe3, 0x68, 0xea, 0x0a, - 0x05, 0x98, 0x6d, 0xa6, 0x5b, 0xfe, 0xf6, 0x1b, 0x88, 0xa8, 0x6c, 0xa6, 0x7d, 0x7f, 0xfb, 0x8d, - 0x24, 0x5a, 0x04, 0x48, 0x0c, 0x18, 0xe3, 0x1b, 0x4b, 0xac, 0x41, 0x38, 0x3a, 0xac, 0x8c, 0xf1, - 0xfd, 0x67, 0x8a, 0x1a, 0x72, 0x1a, 0x0a, 0x8d, 0xfa, 0x1d, 0xc1, 0x01, 0x51, 0x2d, 0x18, 0x74, - 0x5d, 0x93, 0x95, 0xb1, 0x36, 0x37, 0x6a, 0xd5, 0x3a, 0x2a, 0x02, 0x46, 0xe3, 0x36, 0xdb, 0x2d, - 0xbb, 0x9b, 0x54, 0x05, 0x44, 0x80, 0xe4, 0x1d, 0x98, 0xbc, 0x55, 0x5b, 0x59, 0xf3, 0x02, 0xce, - 0xbd, 0xc6, 0xe2, 0xc5, 0xbf, 0xdf, 0x6a, 0x5a, 0xa8, 0xf9, 0x4f, 0x1e, 0x03, 0x0a, 0x3c, 0xb1, - 0xe0, 0x24, 0x23, 0xc5, 0xa6, 0xc4, 0x69, 0x52, 0x71, 0x29, 0xbd, 0x13, 0xbf, 0x33, 0xbc, 0x72, - 0x74, 0x58, 0x79, 0x11, 0xbf, 0x20, 0xe0, 0x20, 0x96, 0xbc, 0xce, 0x26, 0xa8, 0xf6, 0x21, 0x43, - 0xbe, 0x0a, 0x27, 0xd2, 0x35, 0x8d, 0xe8, 0x7d, 0xe2, 0xdc, 0xd1, 0x61, 0xc5, 0xc8, 0xa4, 0x1f, - 0x68, 0xeb, 0x37, 0x9b, 0x88, 0xf1, 0xad, 0x3c, 0x4c, 0x2a, 0x6a, 0x3e, 0xf2, 0x59, 0xf1, 0x2c, - 0x9d, 0xd3, 0x2e, 0x30, 0x0a, 0x04, 0xab, 0xe5, 0x3a, 0xa1, 0x8e, 0xd7, 0xa2, 0xe2, 0x91, 0x3a, - 0xd6, 0xbf, 0xe4, 0x87, 0xd1, 0xbf, 0xbc, 0x09, 0xc0, 0x97, 0x30, 0x8e, 0x93, 0x22, 0x0d, 0x29, - 0xd6, 0x29, 0xea, 0xb2, 0x8a, 0x81, 0xc9, 0x3d, 0x98, 0xdb, 0xf4, 0x7b, 0x41, 0xd8, 0x38, 0x08, - 0x42, 0xda, 0x61, 0xd4, 0xea, 0x9e, 0xd7, 0x16, 0xdb, 0xe7, 0xa5, 0xa3, 0xc3, 0xca, 0x59, 0x34, - 0xa9, 0xb1, 0x02, 0xac, 0xc7, 0x0f, 0xb0, 0xba, 0x9e, 0xa7, 0x6a, 0x65, 0xb2, 0x08, 0x18, 0x26, - 0x94, 0x54, 0x9d, 0x0e, 0x3b, 0x18, 0xc5, 0x13, 0x9e, 0xd0, 0xd4, 0x2b, 0x07, 0xa3, 0xf8, 0xca, - 0xf4, 0x93, 0xa2, 0x8e, 0x62, 0x7c, 0x56, 0xd5, 0x27, 0x0e, 0xcb, 0x97, 0x8c, 0xbf, 0x94, 0x8b, - 0xb9, 0xe0, 0xbd, 0x2b, 0xe4, 0x2d, 0x18, 0xe3, 0x4f, 0xa6, 0xe2, 0x65, 0xf9, 0x44, 0x74, 0x27, - 0x57, 0xdf, 0x53, 0xb9, 0x22, 0xff, 0x77, 0xb9, 0x59, 0xc5, 0x33, 0xa6, 0x40, 0x89, 0xde, 0x00, - 0x74, 0x75, 0xa0, 0xa4, 0x8e, 0xda, 0xee, 0x2b, 0x59, 0x6f, 0x00, 0xc6, 0xbf, 0x18, 0x85, 0x69, - 0x1d, 0x4c, 0x7d, 0x57, 0xcd, 0x0d, 0xf5, 0xae, 0xfa, 0x45, 0x28, 0x8a, 0xf5, 0x26, 0x05, 0xca, - 0x97, 0xf0, 0x65, 0x44, 0x94, 0x69, 0xf6, 0x02, 0xc0, 0xa7, 0x83, 0x5d, 0xd1, 0xcd, 0x08, 0x8b, - 0x2c, 0x29, 0xaf, 0x76, 0x85, 0x58, 0xc6, 0x92, 0xaf, 0x76, 0xea, 0x76, 0x8e, 0xde, 0xef, 0x2e, - 0xc2, 0x18, 0xbb, 0x9e, 0x44, 0x1a, 0x24, 0xfc, 0x4a, 0x76, 0x73, 0x49, 0x18, 0x06, 0x71, 0x20, - 0x72, 0x1f, 0x8a, 0x1b, 0x76, 0x10, 0x36, 0x28, 0x75, 0x87, 0xb0, 0x98, 0xa8, 0x88, 0xa1, 0x9a, - 0x43, 0x73, 0x84, 0x80, 0x52, 0x37, 0xf1, 0xe4, 0x1d, 0x11, 0x23, 0x1f, 0x00, 0xac, 0x78, 0x6e, - 0xe8, 0x7b, 0xed, 0x0d, 0x6f, 0x77, 0x61, 0x0c, 0xaf, 0xee, 0xcf, 0x27, 0x26, 0x20, 0x06, 0xe0, - 0xb7, 0xf7, 0x48, 0x3f, 0xd5, 0xe4, 0x15, 0x56, 0xdb, 0xdb, 0x55, 0xf7, 0x41, 0x0c, 0x4f, 0xae, - 0x43, 0x59, 0xea, 0x45, 0xb6, 0xba, 0xbb, 0x3e, 0x2e, 0x90, 0xf1, 0x58, 0x70, 0xa2, 0x8f, 0x42, - 0xab, 0x27, 0xca, 0x55, 0x46, 0x9f, 0xc4, 0x21, 0x5f, 0x85, 0x53, 0xc9, 0x32, 0x39, 0xcb, 0xc5, - 0xf8, 0x4a, 0xa1, 0x92, 0xcb, 0x58, 0xf7, 0xfd, 0x48, 0x90, 0x1b, 0x30, 0xc3, 0x06, 0xe4, 0x36, - 0xb5, 0x83, 0x1e, 0x37, 0x6b, 0x13, 0x9a, 0x25, 0xf9, 0x20, 0x2c, 0x76, 0x61, 0xdb, 0x6b, 0xee, - 0x2b, 0x40, 0x66, 0x12, 0x8b, 0x5c, 0x83, 0x49, 0x6e, 0xa7, 0xe0, 0xaf, 0xbb, 0x3b, 0x9e, 0x78, - 0x36, 0x90, 0xda, 0x74, 0x51, 0x73, 0x6f, 0x89, 0xd5, 0x99, 0x2a, 0xa0, 0x71, 0x98, 0x87, 0x93, - 0xd9, 0x6d, 0x90, 0xbf, 0x08, 0x27, 0xc4, 0x78, 0xb6, 0xa9, 0xaf, 0xc0, 0x0c, 0x61, 0xc1, 0x71, - 0x51, 0xcc, 0xd3, 0x0b, 0xcd, 0x88, 0x40, 0xc4, 0x70, 0x18, 0x89, 0xc4, 0xa2, 0xc8, 0x6e, 0x87, - 0x7c, 0x1d, 0x26, 0xd5, 0x66, 0xf3, 0xc3, 0x1b, 0xc3, 0x0c, 0x68, 0x4b, 0x25, 0x49, 0x6c, 0x98, - 0x31, 0xe9, 0x37, 0x7a, 0x34, 0x08, 0xa5, 0x39, 0x8e, 0x90, 0x58, 0x4e, 0xa7, 0x5a, 0x91, 0x00, - 0x91, 0xda, 0xab, 0xec, 0x73, 0x4c, 0x4b, 0x1a, 0x4d, 0x7e, 0x9b, 0x91, 0x4f, 0xd2, 0x33, 0xbe, - 0x97, 0x87, 0x53, 0x7d, 0x96, 0x33, 0xe3, 0x78, 0x28, 0x4f, 0x2a, 0x1c, 0x2f, 0x21, 0x46, 0x72, - 0x5b, 0xbe, 0xb3, 0x90, 0x17, 0x12, 0xd8, 0xc8, 0x72, 0xf9, 0xe8, 0xb0, 0x52, 0xd2, 0x76, 0x6a, - 0x7e, 0xbd, 0x46, 0x6e, 0xc2, 0x08, 0x1b, 0x86, 0x21, 0x4c, 0x52, 0xa4, 0xd2, 0x73, 0x3a, 0x74, - 0x54, 0x06, 0x81, 0x63, 0x83, 0x34, 0xc8, 0x67, 0xa1, 0xb0, 0xb9, 0xb9, 0x81, 0xdc, 0xa1, 0x80, - 0xab, 0x7b, 0x2a, 0x0c, 0xdb, 0x1a, 0x33, 0x9a, 0x62, 0xb8, 0xd1, 0x88, 0x98, 0x0c, 0x9c, 0x7c, - 0x29, 0x61, 0x2a, 0xf7, 0xea, 0xe0, 0xad, 0x3c, 0xbc, 0xe5, 0xdc, 0xc7, 0x30, 0x58, 0x33, 0x7e, - 0x22, 0x27, 0xad, 0x82, 0xc4, 0xe2, 0x27, 0x67, 0xe5, 0x3e, 0xc1, 0x8b, 0xb9, 0xa0, 0xa2, 0x16, - 0x91, 0xe7, 0x01, 0xf8, 0xcf, 0xad, 0x2d, 0x31, 0xe8, 0x25, 0x53, 0x29, 0x21, 0x5f, 0x88, 0x48, - 0x0a, 0x55, 0x66, 0x01, 0x25, 0x81, 0xc4, 0x5e, 0xe3, 0x75, 0xa6, 0x0e, 0x6a, 0xfc, 0x46, 0x3e, - 0x3e, 0x35, 0xae, 0x3b, 0xed, 0x90, 0xfa, 0x64, 0x91, 0x1f, 0x02, 0xf1, 0x6d, 0xc6, 0x8c, 0x7e, - 0x93, 0x85, 0xf8, 0x44, 0xe1, 0x5d, 0x8b, 0x8e, 0x8e, 0x57, 0x95, 0xa3, 0xa3, 0x80, 0x47, 0xc7, - 0x74, 0xdf, 0x43, 0xe2, 0xd5, 0x0c, 0x4e, 0x88, 0xac, 0x3f, 0x83, 0xdb, 0xbd, 0x04, 0x53, 0x77, - 0xbc, 0xd5, 0x47, 0x61, 0x04, 0xc8, 0x58, 0x7e, 0xd1, 0xd4, 0x0b, 0x19, 0xc5, 0xbb, 0xed, 0x16, - 0xf5, 0x37, 0xf7, 0x6c, 0x57, 0x33, 0x2e, 0x31, 0x53, 0xe5, 0x0c, 0xf6, 0x0e, 0x7d, 0xa8, 0xc3, - 0x8e, 0x73, 0xd8, 0x64, 0x79, 0x72, 0x72, 0x8a, 0xa9, 0xc9, 0x31, 0x7e, 0x28, 0x2f, 0x87, 0xeb, - 0xde, 0xd2, 0x53, 0x6a, 0x76, 0xf0, 0x86, 0x66, 0x76, 0x30, 0x17, 0x3d, 0x98, 0x44, 0x36, 0x3b, - 0x4b, 0x59, 0x02, 0x87, 0x62, 0x33, 0xf0, 0x77, 0xc6, 0xa0, 0xa4, 0x82, 0xb3, 0x71, 0xa8, 0xb6, - 0x5a, 0xbe, 0x3a, 0x0e, 0x76, 0xab, 0xe5, 0x9b, 0x58, 0xaa, 0x59, 0xf6, 0x14, 0x06, 0x5a, 0xf6, - 0x7c, 0x0d, 0x26, 0x56, 0x3a, 0x2d, 0xed, 0xfd, 0xdf, 0xc8, 0xf8, 0xbc, 0x4b, 0x11, 0x10, 0xdf, - 0xbd, 0xd1, 0x3b, 0x40, 0xb3, 0xd3, 0x4a, 0xbf, 0xfa, 0xc7, 0x24, 0x35, 0xa3, 0xa0, 0xd1, 0x8f, - 0x63, 0x14, 0x74, 0x0d, 0x26, 0xb6, 0x02, 0xba, 0xd9, 0x73, 0x5d, 0xda, 0xc6, 0x85, 0x57, 0xe4, - 0xd7, 0xe7, 0x5e, 0x40, 0xad, 0x10, 0x4b, 0xd5, 0x0f, 0x88, 0x40, 0xd5, 0x09, 0x1e, 0x1f, 0x30, - 0xc1, 0x57, 0xa1, 0x58, 0xa7, 0xd4, 0xc7, 0x31, 0x9d, 0x8c, 0x6f, 0x49, 0x5d, 0x4a, 0x7d, 0x8b, - 0x0d, 0xac, 0x66, 0x2c, 0x24, 0x00, 0x35, 0x0b, 0xa3, 0xd2, 0x90, 0x16, 0x46, 0xe4, 0x05, 0x28, - 0x75, 0x7b, 0xdb, 0x6d, 0xa7, 0x89, 0x74, 0x85, 0x69, 0x92, 0x39, 0xc9, 0xcb, 0x18, 0xd9, 0x80, - 0x7c, 0x09, 0xa6, 0x50, 0x6d, 0x10, 0x2d, 0xb9, 0x69, 0xed, 0x68, 0xd7, 0xea, 0xb8, 0xf4, 0xdd, - 0x64, 0x45, 0x56, 0x86, 0x21, 0x9e, 0x4e, 0x88, 0xdc, 0x84, 0xf1, 0x5d, 0x27, 0xb4, 0xf6, 0x7a, - 0xdb, 0x0b, 0x33, 0x9a, 0x15, 0xdb, 0x0d, 0x27, 0x5c, 0xeb, 0x6d, 0xf3, 0x29, 0x8f, 0x48, 0x23, - 0x8f, 0xde, 0x75, 0xc2, 0xbd, 0x9e, 0xfa, 0xca, 0x31, 0xb6, 0x8b, 0xb0, 0x8b, 0x0d, 0x98, 0xd6, - 0x57, 0xc5, 0x13, 0x78, 0x7b, 0x8f, 0x2c, 0xaf, 0x8a, 0xe5, 0x89, 0x9b, 0x23, 0x45, 0x28, 0x4f, - 0x72, 0x9b, 0x2b, 0x13, 0xea, 0xd1, 0xf8, 0x98, 0xe4, 0x56, 0x6f, 0x9b, 0xfa, 0x2e, 0x0d, 0x69, - 0x20, 0xee, 0xe8, 0x81, 0x39, 0x52, 0xed, 0x76, 0x03, 0xe3, 0x1f, 0xe7, 0x61, 0xbc, 0x7a, 0xbf, - 0x81, 0x5c, 0xff, 0x75, 0xf5, 0xe1, 0x54, 0x7d, 0x41, 0x8f, 0x1e, 0x4e, 0xd5, 0xe7, 0xd2, 0xcb, - 0x19, 0x5a, 0x16, 0xf4, 0x0d, 0x50, 0xb4, 0x2c, 0x9a, 0x7e, 0x28, 0x7e, 0x43, 0x2e, 0x0c, 0xf1, - 0x86, 0x1c, 0xa9, 0xf9, 0x47, 0x8e, 0x57, 0xf3, 0xbf, 0x05, 0x93, 0xeb, 0x6e, 0x48, 0x77, 0xfd, - 0x78, 0xd7, 0x44, 0x1a, 0x9f, 0xa8, 0x58, 0xbd, 0x79, 0x2b, 0xd0, 0x6c, 0x49, 0xf2, 0xa7, 0x85, - 0xe8, 0x49, 0x01, 0x97, 0x24, 0x7f, 0x81, 0x48, 0xa8, 0xeb, 0x24, 0xa0, 0x51, 0x4b, 0xac, 0x37, - 0x69, 0xa7, 0xc3, 0x85, 0xbe, 0xe9, 0xf8, 0x6d, 0x8d, 0x0d, 0xec, 0xf2, 0x6c, 0xb6, 0x9d, 0x8e, - 0xf1, 0x57, 0x73, 0x30, 0x9f, 0xb5, 0x8c, 0xc8, 0xbb, 0x50, 0xf2, 0xfc, 0x5d, 0xdb, 0x75, 0xbe, - 0x9f, 0xf7, 0x48, 0xd1, 0x29, 0xab, 0xe5, 0xaa, 0x26, 0x4d, 0x2d, 0x67, 0x03, 0xa2, 0xf4, 0x5c, - 0x57, 0x81, 0x65, 0x0e, 0x88, 0x52, 0x6c, 0xfc, 0x68, 0x1e, 0x26, 0xab, 0xdd, 0xee, 0x53, 0x6e, - 0x7a, 0xfa, 0x79, 0xed, 0x00, 0x91, 0x1a, 0x88, 0xa8, 0x5f, 0xfd, 0x0d, 0xd7, 0x94, 0x33, 0xe4, - 0x97, 0xf3, 0x30, 0x93, 0xc0, 0x50, 0xbf, 0x3e, 0x37, 0xa4, 0xa5, 0x68, 0x7e, 0x48, 0x4b, 0xd1, - 0xc2, 0x70, 0x96, 0xa2, 0x23, 0x1f, 0xe7, 0x50, 0x78, 0x05, 0x0a, 0xd5, 0x6e, 0x37, 0x69, 0x01, - 0xd2, 0xed, 0xde, 0xbb, 0xca, 0x95, 0x60, 0x76, 0xb7, 0x6b, 0x32, 0x08, 0x8d, 0x53, 0x8f, 0x0d, - 0xc9, 0xa9, 0x8d, 0x8b, 0x30, 0x81, 0xb4, 0xd0, 0x5e, 0xf2, 0x2c, 0x20, 0x8b, 0x11, 0xa6, 0x92, - 0x5a, 0x5b, 0x82, 0xf9, 0xfc, 0x71, 0x0e, 0x46, 0xf1, 0xf7, 0x53, 0xba, 0xc6, 0x96, 0xb4, 0x35, - 0x56, 0x56, 0xd6, 0xd8, 0x30, 0xab, 0xeb, 0xef, 0x17, 0x00, 0x56, 0xee, 0x9a, 0x0d, 0xae, 0x2b, - 0x25, 0xd7, 0x61, 0xc6, 0x6e, 0xb7, 0xbd, 0x87, 0xb4, 0x65, 0x79, 0xbe, 0xb3, 0xeb, 0xb8, 0x7c, - 0xe4, 0xa4, 0x59, 0x82, 0x5e, 0xa5, 0x3e, 0x56, 0x8a, 0xaa, 0xbb, 0xbc, 0x46, 0xa5, 0xd3, 0xa1, - 0xe1, 0x9e, 0xd7, 0x92, 0x6a, 0x13, 0x8d, 0x8e, 0xa8, 0xca, 0xa0, 0x73, 0x9b, 0xd7, 0xa8, 0x74, - 0xf6, 0x50, 0x0d, 0x24, 0x65, 0x68, 0x8d, 0x8e, 0xa8, 0xca, 0xa0, 0xc3, 0x75, 0x47, 0x01, 0xd9, - 0x80, 0x59, 0x2c, 0xb1, 0x9a, 0x3e, 0x6d, 0x51, 0x37, 0x74, 0xec, 0x76, 0x20, 0x14, 0x6d, 0xa8, - 0x51, 0x4e, 0x55, 0xaa, 0x8a, 0x06, 0xac, 0x5c, 0x89, 0xeb, 0xc8, 0x25, 0x18, 0xef, 0xd8, 0x8f, - 0x2c, 0x7b, 0x97, 0x1b, 0xe8, 0x4c, 0x71, 0xc5, 0x8c, 0x28, 0x52, 0x8f, 0x91, 0x8e, 0xfd, 0xa8, - 0xba, 0x4b, 0x59, 0x2f, 0xe8, 0xa3, 0xae, 0x17, 0x28, 0xbd, 0x18, 0x8b, 0x7b, 0x91, 0xa8, 0x52, - 0x7b, 0x21, 0xaa, 0x44, 0x2f, 0x8c, 0x5f, 0xca, 0xc1, 0xb3, 0xeb, 0xf8, 0x15, 0xe1, 0xc1, 0x0a, - 0x75, 0x43, 0xea, 0xd7, 0xa9, 0xdf, 0x71, 0xd0, 0x5c, 0xa1, 0x41, 0x43, 0xf2, 0x22, 0x14, 0xaa, - 0xe6, 0x1d, 0xb1, 0x7e, 0x39, 0xbf, 0xd7, 0x8c, 0x47, 0x58, 0x6d, 0xa4, 0xbb, 0xcb, 0x1f, 0xf3, - 0xa6, 0x50, 0x85, 0x52, 0x35, 0x08, 0x9c, 0x5d, 0xb7, 0xc3, 0xfd, 0x75, 0x0a, 0x9a, 0x79, 0x8a, - 0x28, 0x4f, 0x3d, 0x86, 0xa9, 0x28, 0xc6, 0x7f, 0x96, 0x83, 0xd9, 0x6a, 0xb7, 0xab, 0x7f, 0xb2, - 0x6e, 0x1a, 0x95, 0x1b, 0xde, 0x34, 0xca, 0x81, 0x69, 0xad, 0xbb, 0x7c, 0x49, 0xc5, 0x82, 0xef, - 0x80, 0x91, 0xe1, 0x9f, 0xdd, 0x8d, 0x8a, 0xac, 0x40, 0x7f, 0xd7, 0x4f, 0x10, 0x36, 0xfe, 0xd3, - 0x22, 0xf2, 0x10, 0xc1, 0x6d, 0x85, 0xf1, 0x6e, 0x2e, 0xc3, 0x78, 0xf7, 0x4d, 0x50, 0x24, 0x1c, - 0xf5, 0x88, 0x53, 0x64, 0x45, 0x55, 0xeb, 0x15, 0x03, 0x93, 0xfd, 0xa4, 0x19, 0x6f, 0x01, 0x7b, - 0xf3, 0x62, 0x72, 0x03, 0x3f, 0x11, 0x0b, 0xde, 0x35, 0x20, 0xeb, 0x2e, 0xda, 0x1a, 0xd0, 0xc6, - 0xbe, 0xd3, 0xbd, 0x47, 0x7d, 0x67, 0xe7, 0x40, 0x6c, 0x00, 0x1c, 0x7c, 0x47, 0xd4, 0x5a, 0xc1, - 0xbe, 0xd3, 0xb5, 0x1e, 0x60, 0xbd, 0x99, 0x81, 0x43, 0xde, 0x83, 0x71, 0x93, 0x3e, 0xf4, 0x9d, - 0x50, 0x1a, 0xa7, 0x4d, 0x47, 0x4a, 0x5c, 0x2c, 0xe5, 0x7b, 0xc1, 0xe7, 0x3f, 0x54, 0xae, 0x28, - 0xea, 0xc9, 0x12, 0x17, 0x52, 0xb8, 0x11, 0xda, 0x54, 0xdc, 0xdb, 0xea, 0xfd, 0x46, 0x3f, 0x19, - 0x85, 0x5c, 0x80, 0x51, 0x94, 0x74, 0xc4, 0x5d, 0x00, 0x7d, 0xd1, 0x50, 0x76, 0x56, 0xc5, 0x30, - 0x84, 0x40, 0x9d, 0x80, 0x7c, 0xcc, 0x0f, 0x16, 0x8a, 0x28, 0xa5, 0x2b, 0x25, 0x49, 0x31, 0x6d, - 0xe2, 0xb1, 0xc4, 0xb4, 0x0d, 0x28, 0x9b, 0xdc, 0xad, 0xb5, 0x55, 0xed, 0xe2, 0x8b, 0x71, 0xb0, - 0x00, 0xb8, 0x93, 0xcf, 0x1e, 0x1d, 0x56, 0x9e, 0x13, 0x2e, 0xaf, 0x2d, 0xcb, 0xee, 0xf2, 0x87, - 0x66, 0x8d, 0x8d, 0x24, 0x31, 0xc9, 0x9b, 0x30, 0xc2, 0x58, 0xaf, 0x30, 0xf8, 0x95, 0x2f, 0x6f, - 0x31, 0x37, 0xe6, 0x9b, 0xb3, 0xe9, 0x69, 0x3c, 0x01, 0x51, 0x88, 0x05, 0xd3, 0xfa, 0x72, 0x17, - 0xb6, 0x5f, 0x0b, 0xf1, 0x78, 0xea, 0xf5, 0xe2, 0x39, 0x4e, 0x94, 0x59, 0x4d, 0x2c, 0x54, 0x77, - 0x40, 0x62, 0x93, 0xae, 0x42, 0x71, 0x73, 0xa5, 0x5e, 0xf7, 0xfc, 0x90, 0x5f, 0x75, 0xe2, 0x93, - 0x85, 0x95, 0x99, 0xb6, 0xbb, 0x4b, 0xf9, 0x59, 0x1c, 0x36, 0xbb, 0x56, 0x97, 0x81, 0xa9, 0x67, - 0xb1, 0x44, 0x25, 0x1f, 0xc0, 0x89, 0xad, 0x80, 0x56, 0xdd, 0x03, 0x3c, 0x9d, 0x95, 0xad, 0x32, - 0x8d, 0x4b, 0x0f, 0x1f, 0x94, 0xd8, 0x55, 0xd0, 0x76, 0x0f, 0x2c, 0x7e, 0xaa, 0x67, 0x6f, 0x9c, - 0x6c, 0x2a, 0xe4, 0x32, 0x14, 0x6e, 0xaf, 0xd4, 0xc5, 0x9d, 0x48, 0x9a, 0x66, 0xde, 0x5e, 0xa9, - 0xf3, 0x85, 0xd4, 0xd1, 0xed, 0xca, 0x6f, 0xaf, 0xd4, 0x3f, 0x39, 0xe3, 0xe3, 0xaf, 0xe2, 0x97, - 0x90, 0x05, 0x18, 0x6f, 0x72, 0x18, 0x41, 0x4d, 0xfe, 0x24, 0x04, 0x46, 0x6c, 0x7f, 0x57, 0x1c, - 0x83, 0x26, 0xfe, 0x4d, 0x5e, 0x81, 0xb2, 0xdf, 0x73, 0x2d, 0x3b, 0xe0, 0x4f, 0x73, 0xbd, 0x80, - 0xfa, 0x9c, 0xcd, 0x9a, 0x53, 0x7e, 0xcf, 0xad, 0x06, 0x4c, 0xee, 0x42, 0x43, 0xe1, 0x7f, 0x92, - 0x03, 0x65, 0xff, 0x14, 0x4d, 0xda, 0x72, 0x7c, 0xda, 0x0c, 0xc5, 0xd9, 0x2c, 0x1c, 0x49, 0x79, - 0x59, 0xc2, 0x84, 0x15, 0xcb, 0xc8, 0xbb, 0x30, 0x2e, 0xce, 0x10, 0xc1, 0x33, 0xe5, 0xbe, 0x13, - 0x2f, 0x2e, 0xdc, 0xe3, 0x38, 0x75, 0xfe, 0x48, 0x24, 0xc6, 0xb2, 0x6f, 0xde, 0xdf, 0x5c, 0x69, - 0xdb, 0x4e, 0x27, 0x10, 0x07, 0x01, 0x72, 0x8d, 0x0f, 0x1f, 0x86, 0x56, 0x13, 0x4b, 0x55, 0x96, - 0x1d, 0x81, 0x1a, 0x37, 0xe4, 0x83, 0xcf, 0x31, 0x76, 0xd8, 0x15, 0x18, 0xbd, 0x17, 0xab, 0x05, - 0x97, 0x27, 0x8e, 0x0e, 0x2b, 0x7c, 0x6c, 0x4d, 0x5e, 0x6e, 0x50, 0x98, 0x88, 0xd6, 0x1d, 0xa3, - 0xc5, 0x7e, 0x20, 0xad, 0x29, 0x4e, 0x8b, 0xad, 0x40, 0x13, 0x4b, 0x99, 0x9c, 0xb6, 0xea, 0xb6, - 0x10, 0x20, 0x8f, 0x00, 0x38, 0x3c, 0xd4, 0x6d, 0xe1, 0x32, 0x55, 0x7b, 0x27, 0xc0, 0x14, 0x69, - 0xe8, 0xc7, 0x73, 0x30, 0xad, 0xcf, 0x31, 0xb9, 0x04, 0x63, 0xc2, 0x57, 0x34, 0x87, 0x5a, 0x56, - 0x46, 0x6d, 0x8c, 0x7b, 0x89, 0x6a, 0xbe, 0xa1, 0x02, 0x8a, 0x09, 0x7d, 0x82, 0x82, 0x90, 0x78, - 0x50, 0xe8, 0x13, 0xab, 0xc0, 0x94, 0x75, 0xc4, 0x60, 0xf7, 0xd0, 0xa0, 0xd7, 0x0e, 0xd5, 0xd7, - 0x61, 0x1f, 0x4b, 0x4c, 0x51, 0x63, 0x7c, 0x27, 0x07, 0x63, 0x9c, 0x31, 0x26, 0xec, 0x4c, 0x73, - 0x8f, 0x63, 0x67, 0xfa, 0x4d, 0x98, 0x37, 0xbd, 0x36, 0x0d, 0xaa, 0xee, 0xc1, 0xc3, 0x3d, 0xea, - 0xd3, 0xba, 0xef, 0xed, 0xc8, 0x87, 0xec, 0xc9, 0xa5, 0x17, 0x34, 0x06, 0x9c, 0x05, 0xc8, 0x5f, - 0x22, 0x7d, 0x56, 0xc3, 0xb6, 0x29, 0x56, 0xb1, 0xbd, 0x9a, 0x78, 0xf8, 0xce, 0x6c, 0xc4, 0xf8, - 0x07, 0x39, 0x58, 0xec, 0x4f, 0x1a, 0x8f, 0x4f, 0xfe, 0x67, 0x2c, 0xb7, 0xf0, 0xe3, 0x93, 0x97, - 0x26, 0x8c, 0x5f, 0x15, 0x60, 0x62, 0xc2, 0x89, 0x6a, 0xb3, 0x49, 0xbb, 0x21, 0x23, 0x2c, 0x4c, - 0x36, 0x23, 0xb9, 0xa6, 0xc8, 0xd5, 0x2b, 0x36, 0x02, 0x70, 0x33, 0x5a, 0x69, 0x48, 0x8a, 0xab, - 0x2e, 0x1b, 0xd5, 0x38, 0xcc, 0x01, 0x34, 0x1a, 0x6b, 0xb7, 0xe8, 0x41, 0xdd, 0x76, 0x50, 0x50, - 0xe1, 0xbc, 0xe6, 0x96, 0x60, 0x0e, 0x25, 0x61, 0xfa, 0xc1, 0x59, 0xd4, 0x3e, 0x3d, 0xd0, 0x4c, - 0x3f, 0x24, 0x28, 0xef, 0x95, 0xf3, 0xc0, 0x0e, 0x29, 0x43, 0x44, 0xb5, 0xb4, 0xec, 0x15, 0x96, - 0x26, 0x30, 0x15, 0x60, 0xf2, 0x01, 0x4c, 0xc7, 0xbf, 0x22, 0x03, 0x96, 0xe9, 0x88, 0x01, 0xe9, - 0x95, 0xcb, 0xcf, 0x1f, 0x1d, 0x56, 0x16, 0x15, 0xaa, 0x49, 0xd3, 0x96, 0x04, 0x31, 0xe3, 0x17, - 0x73, 0x68, 0xb6, 0x25, 0x3b, 0x78, 0x0e, 0x46, 0x22, 0x47, 0x83, 0x92, 0x38, 0x6d, 0xf4, 0x57, - 0x6e, 0xac, 0x67, 0x72, 0x65, 0xdc, 0x13, 0x64, 0xad, 0x7a, 0x0f, 0x58, 0x2d, 0xb9, 0x01, 0xe3, - 0x43, 0x7d, 0x33, 0x6e, 0xc7, 0x8c, 0x6f, 0x95, 0xd8, 0x38, 0x0b, 0x37, 0xef, 0x6f, 0x7e, 0x7a, - 0x67, 0xe1, 0xa7, 0xf2, 0x30, 0xc3, 0xc6, 0xb5, 0xda, 0x0b, 0xf7, 0x3c, 0xdf, 0x09, 0x0f, 0x9e, - 0x5a, 0x05, 0xf9, 0xdb, 0xda, 0xdd, 0x73, 0x51, 0x9e, 0x92, 0x6a, 0xdf, 0x86, 0xd2, 0x93, 0xff, - 0x37, 0xa3, 0x30, 0x97, 0x81, 0x45, 0x5e, 0xd7, 0x5e, 0xdd, 0x16, 0x64, 0xdc, 0x8c, 0xef, 0x1d, - 0x56, 0x4a, 0x12, 0x7c, 0x33, 0x8e, 0xa3, 0xb1, 0xa4, 0xdb, 0x40, 0xf2, 0x91, 0xc2, 0x47, 0x38, - 0xd5, 0x06, 0x52, 0xb7, 0x7c, 0xbc, 0x00, 0xa3, 0xc8, 0x99, 0x84, 0xdd, 0x2f, 0x4a, 0x96, 0xc8, - 0xeb, 0x34, 0x3b, 0x27, 0x56, 0x40, 0xd6, 0x60, 0x9c, 0xfd, 0x71, 0xdb, 0xee, 0x8a, 0x27, 0x70, - 0x12, 0x69, 0x3f, 0xb0, 0xb4, 0xeb, 0xb8, 0xbb, 0xaa, 0x02, 0xa4, 0x4d, 0xad, 0x8e, 0xdd, 0xd5, - 0x44, 0x60, 0x0e, 0xa8, 0x29, 0x52, 0x8a, 0xfd, 0x15, 0x29, 0xb9, 0x63, 0x15, 0x29, 0x3b, 0x00, - 0x0d, 0x67, 0xd7, 0x75, 0xdc, 0xdd, 0x6a, 0x7b, 0x57, 0x44, 0x1f, 0xb9, 0xd0, 0x7f, 0x16, 0x2e, - 0xc5, 0xc0, 0xb8, 0x70, 0x9f, 0x45, 0x3b, 0x15, 0x5e, 0x66, 0xd9, 0xed, 0x5d, 0xcd, 0xdd, 0x50, - 0xa1, 0x4c, 0xee, 0x00, 0x54, 0x9b, 0xa1, 0xf3, 0x80, 0x2d, 0xe1, 0x40, 0xc8, 0xab, 0xf2, 0x93, - 0x57, 0xaa, 0xb7, 0xe8, 0x01, 0xde, 0xb1, 0xe4, 0x8b, 0xbf, 0x8d, 0xa0, 0x6c, 0x27, 0x68, 0xbe, - 0x64, 0x31, 0x05, 0xd2, 0x85, 0x13, 0xd5, 0x56, 0xcb, 0x61, 0x7d, 0xb0, 0xdb, 0x9b, 0x3c, 0x6e, - 0x0c, 0x92, 0x2e, 0x65, 0x93, 0xbe, 0x20, 0x1f, 0xa9, 0xed, 0x08, 0xcb, 0x92, 0xe1, 0x66, 0x12, - 0xcd, 0x64, 0x13, 0x36, 0x1a, 0x30, 0xad, 0x77, 0x5e, 0x8f, 0x9a, 0x52, 0x82, 0xa2, 0xd9, 0xa8, - 0x5a, 0x8d, 0xb5, 0xea, 0x95, 0x72, 0x8e, 0x94, 0xa1, 0x24, 0x7e, 0x2d, 0x59, 0x4b, 0x6f, 0x5c, - 0x2b, 0xe7, 0xb5, 0x92, 0x37, 0xae, 0x2c, 0x95, 0x0b, 0x8b, 0xf9, 0x85, 0x5c, 0xc2, 0xd3, 0x78, - 0xbc, 0x5c, 0xe4, 0xba, 0x6f, 0xe3, 0x57, 0x72, 0x50, 0x94, 0xdf, 0x4e, 0xae, 0x41, 0xa1, 0xd1, - 0x58, 0x4b, 0xf8, 0xea, 0xc6, 0xa7, 0x0c, 0xe7, 0xa7, 0x41, 0xa0, 0x3a, 0x64, 0x30, 0x04, 0x86, - 0xb7, 0xb9, 0xd1, 0x10, 0xf2, 0x9a, 0xc4, 0x8b, 0x99, 0x37, 0xc7, 0xcb, 0x70, 0x60, 0xbc, 0x06, - 0x85, 0x9b, 0xf7, 0x37, 0xc5, 0x6d, 0x52, 0xe2, 0xc5, 0xfc, 0x94, 0xe3, 0x7d, 0xf8, 0x50, 0xe5, - 0xf2, 0x0c, 0xc1, 0x30, 0x61, 0x52, 0x59, 0xc8, 0x5c, 0x40, 0xe9, 0x78, 0x51, 0xa8, 0x10, 0x21, - 0xa0, 0xb0, 0x12, 0x53, 0xd4, 0x30, 0xb1, 0x6d, 0xc3, 0x6b, 0xda, 0x6d, 0x21, 0xe9, 0xa0, 0xd8, - 0xd6, 0x66, 0x05, 0x26, 0x2f, 0x37, 0x7e, 0x33, 0x07, 0xe5, 0xba, 0xef, 0xf1, 0x70, 0x26, 0x9b, - 0xde, 0x3e, 0x75, 0xef, 0x5d, 0x21, 0x17, 0xe5, 0x96, 0xcb, 0x45, 0x1a, 0xbd, 0x51, 0xdc, 0x72, - 0x89, 0x67, 0x51, 0xb1, 0xed, 0x94, 0x68, 0x2c, 0xf9, 0xe1, 0xa3, 0x38, 0x1c, 0x13, 0x8d, 0xa5, - 0x02, 0xa3, 0xf8, 0x39, 0x82, 0x39, 0xe2, 0x97, 0x87, 0xac, 0xc0, 0xe4, 0xe5, 0x0a, 0x6f, 0x3a, - 0xcc, 0xa7, 0xfa, 0xb0, 0xf4, 0xa9, 0x8a, 0x84, 0xa0, 0x77, 0xae, 0x3f, 0xbf, 0x26, 0xb7, 0xfa, - 0x44, 0x42, 0x48, 0x10, 0xe0, 0x8e, 0x8c, 0x4b, 0xfc, 0xb5, 0x84, 0xbb, 0x03, 0xa9, 0x3a, 0xb1, - 0x94, 0x63, 0xf5, 0x97, 0x61, 0x3e, 0x39, 0xbe, 0xa8, 0xba, 0xad, 0xc2, 0x8c, 0x5e, 0x2e, 0xb5, - 0xb8, 0xa7, 0x32, 0xdb, 0xbd, 0xb7, 0x64, 0x26, 0xe1, 0x8d, 0xff, 0x25, 0x07, 0x13, 0xf8, 0xa7, - 0xd9, 0xe3, 0xd2, 0x66, 0xf5, 0x7e, 0x43, 0x28, 0x94, 0x54, 0x69, 0xd3, 0x7e, 0x18, 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, 0xf7, 0x1b, 0x4c, 0x22, 0x56, 0xcd, 0xbe, 0xd8, 0x37, 0x6a, - 0xd2, 0xb0, 0x00, 0x32, 0x7e, 0x7d, 0x2a, 0x39, 0x80, 0xe2, 0xf4, 0x7c, 0xcc, 0x8d, 0xf6, 0x16, - 0x8c, 0x56, 0xdb, 0x6d, 0xef, 0xa1, 0x60, 0x39, 0xf2, 0xbe, 0x1f, 0x8d, 0x1f, 0x3f, 0x1c, 0x51, - 0x19, 0xaa, 0xf9, 0x5c, 0xb3, 0x02, 0xb2, 0x02, 0x13, 0xd5, 0xfb, 0x8d, 0xf5, 0xf5, 0xda, 0xe6, - 0x26, 0xf7, 0x2f, 0x2d, 0x2c, 0xbf, 0x2c, 0xc7, 0xc7, 0x71, 0x5a, 0x56, 0xd2, 0x2e, 0x25, 0xbe, - 0x38, 0xc5, 0x78, 0xe4, 0x1d, 0x80, 0x9b, 0x9e, 0xe3, 0x72, 0xe5, 0xaf, 0xe8, 0xfc, 0x99, 0xa3, - 0xc3, 0xca, 0xe4, 0x87, 0x9e, 0xe3, 0x0a, 0x6d, 0x31, 0xfb, 0xf6, 0x18, 0xc8, 0x54, 0xfe, 0x66, - 0x23, 0xbd, 0xec, 0x71, 0x7b, 0xd5, 0xd1, 0x78, 0xa4, 0xb7, 0xbd, 0x94, 0x96, 0x52, 0x82, 0x91, - 0x0e, 0xcc, 0x34, 0x7a, 0xbb, 0xbb, 0x94, 0x1d, 0x13, 0x42, 0x0b, 0x37, 0x26, 0x2e, 0xfc, 0x51, - 0x30, 0x32, 0x7e, 0x11, 0x64, 0xb7, 0xd0, 0x60, 0xf9, 0x75, 0xb6, 0x2b, 0xbe, 0x7b, 0x58, 0x11, - 0xf6, 0x2e, 0x4c, 0xee, 0x0b, 0x24, 0x7e, 0x5a, 0x07, 0x97, 0xa4, 0x4d, 0xee, 0xc2, 0x18, 0x7f, - 0x69, 0x13, 0xfe, 0x92, 0x2f, 0x0c, 0xd8, 0x81, 0x1c, 0xb0, 0xdf, 0x5b, 0x2e, 0xaf, 0x25, 0xf7, - 0xa1, 0xb8, 0xe2, 0xf8, 0xcd, 0x36, 0x5d, 0x59, 0x17, 0x82, 0xc4, 0x8b, 0x03, 0x48, 0x4a, 0x50, - 0x3e, 0x2e, 0x4d, 0xfc, 0xd5, 0x74, 0x54, 0xc1, 0x42, 0x42, 0x90, 0xbf, 0x9a, 0x83, 0x67, 0xa3, - 0xaf, 0xaf, 0xee, 0x52, 0x37, 0xbc, 0x6d, 0x87, 0xcd, 0x3d, 0xea, 0x8b, 0x51, 0x9a, 0x18, 0x34, - 0x4a, 0x5f, 0x48, 0x8d, 0xd2, 0xf9, 0x78, 0x94, 0x6c, 0x46, 0xcc, 0xea, 0x70, 0x6a, 0xe9, 0x31, - 0x1b, 0xd4, 0x2a, 0xb1, 0x00, 0xe2, 0x37, 0x64, 0x61, 0x38, 0xf7, 0xf2, 0x80, 0x0e, 0xc7, 0xc0, - 0xc2, 0x4f, 0x2e, 0xfa, 0xad, 0x19, 0x7a, 0x47, 0xa5, 0xe4, 0x96, 0x74, 0x4e, 0xe6, 0x22, 0xce, - 0xd9, 0x01, 0xb4, 0xb9, 0xc3, 0xf2, 0xdc, 0x80, 0x30, 0x04, 0x7c, 0xb6, 0x37, 0xec, 0x6d, 0x21, - 0xd5, 0x1c, 0x33, 0xdb, 0x1b, 0x76, 0x3c, 0xdb, 0x6d, 0x3b, 0x39, 0xdb, 0x1b, 0xf6, 0x36, 0x59, - 0xe1, 0x11, 0x15, 0xb8, 0xfb, 0xfd, 0xf3, 0x83, 0xa8, 0x49, 0x0d, 0x58, 0x46, 0x64, 0x85, 0xaf, - 0xc0, 0x44, 0xa3, 0x6b, 0x37, 0x69, 0xdb, 0xd9, 0x09, 0x85, 0x81, 0xc2, 0x4b, 0x03, 0x48, 0x45, - 0xb0, 0xe2, 0x41, 0x5a, 0xfe, 0x54, 0xef, 0x5c, 0x11, 0x0c, 0xfb, 0xc2, 0xcd, 0xfa, 0x6d, 0xa1, - 0x8f, 0x1b, 0xf4, 0x85, 0x9b, 0xf5, 0xdb, 0x42, 0x80, 0xe9, 0x76, 0x34, 0x01, 0xa6, 0x7e, 0x9b, - 0x74, 0x61, 0x7a, 0x93, 0xfa, 0xbe, 0xbd, 0xe3, 0xf9, 0x1d, 0xae, 0xf5, 0xe5, 0x2e, 0x9d, 0x17, - 0x06, 0xd1, 0xd3, 0x10, 0xb8, 0xb2, 0x33, 0x94, 0x65, 0x56, 0x52, 0x55, 0x9c, 0xa0, 0xcf, 0xc6, - 0x64, 0xd9, 0x09, 0xb7, 0x7b, 0xcd, 0x7d, 0x1a, 0x2e, 0xcc, 0x1e, 0x3b, 0x26, 0x11, 0x2c, 0x1f, - 0x93, 0x6d, 0xf9, 0x53, 0x1d, 0x93, 0x08, 0x86, 0x2d, 0x03, 0x11, 0x37, 0x81, 0x1c, 0xbb, 0x0c, - 0x38, 0x20, 0x5f, 0x06, 0xfd, 0x02, 0x28, 0x90, 0x3d, 0x28, 0x2d, 0x7b, 0x3d, 0x97, 0xc9, 0xb5, - 0x5d, 0xdb, 0xf1, 0x17, 0xe6, 0x90, 0xec, 0x2b, 0x83, 0x3e, 0x58, 0x01, 0xe7, 0xee, 0x00, 0xdb, - 0xac, 0x84, 0x89, 0xce, 0xac, 0x48, 0x7d, 0xbf, 0x51, 0x41, 0x49, 0x0b, 0x26, 0x71, 0x29, 0xd7, - 0xe8, 0x03, 0xaf, 0x1b, 0x2c, 0xcc, 0x63, 0x43, 0xe7, 0x8e, 0xdb, 0x14, 0x1c, 0x9a, 0x1b, 0x0a, - 0xe0, 0xd6, 0xb0, 0x5a, 0x58, 0xa2, 0x2a, 0xd5, 0x15, 0x40, 0xe3, 0x1f, 0x8f, 0x42, 0xe5, 0x18, - 0x62, 0xe4, 0x9e, 0x3c, 0x9b, 0xb8, 0x04, 0xf0, 0xda, 0x70, 0xdf, 0x70, 0xe9, 0xd8, 0x63, 0xeb, - 0x2d, 0x98, 0xbe, 0xab, 0xd8, 0x2c, 0x44, 0x36, 0x24, 0x88, 0xa3, 0x5a, 0x33, 0x58, 0x4e, 0xcb, - 0x4c, 0x80, 0x2e, 0xfe, 0x71, 0x01, 0x46, 0x50, 0xb0, 0x78, 0x11, 0x0a, 0x8d, 0xde, 0xb6, 0xfa, - 0xee, 0x16, 0x68, 0xec, 0x9a, 0xd5, 0x92, 0xb7, 0x61, 0x52, 0x78, 0x07, 0x29, 0xb7, 0x53, 0x1c, - 0x24, 0xe9, 0x4a, 0x94, 0x74, 0xcd, 0x50, 0xc0, 0xc9, 0x7b, 0x50, 0xaa, 0x3b, 0x5d, 0xda, 0x76, - 0x5c, 0xaa, 0x38, 0x1a, 0xe0, 0x5c, 0x76, 0x45, 0x79, 0xea, 0x2d, 0x4e, 0x45, 0xd0, 0xfd, 0x98, - 0x46, 0x86, 0xf7, 0x63, 0x7a, 0x0f, 0x4a, 0x35, 0xba, 0xe3, 0xb8, 0x8e, 0x18, 0x9f, 0xd1, 0xb8, - 0xe1, 0x56, 0x54, 0xae, 0x63, 0x6b, 0x08, 0x64, 0x19, 0xa6, 0x4c, 0xda, 0xf5, 0x02, 0x27, 0xf4, - 0xfc, 0x83, 0x2d, 0x73, 0x5d, 0xd8, 0xb7, 0xa0, 0x82, 0xce, 0x8f, 0x2a, 0xac, 0x9e, 0xaf, 0x9e, - 0x44, 0x3a, 0x0a, 0xb9, 0x03, 0xb3, 0x71, 0x81, 0x6e, 0x17, 0x26, 0x1e, 0x5e, 0x22, 0x3a, 0x69, - 0x8b, 0xee, 0x34, 0xaa, 0xfe, 0x4d, 0x26, 0xdd, 0x11, 0xf6, 0xe1, 0xc9, 0x6f, 0xf2, 0xe9, 0x4e, - 0xf6, 0x37, 0x99, 0x74, 0xc7, 0xf8, 0xb5, 0x02, 0x9c, 0xea, 0xc3, 0xda, 0xc8, 0x1d, 0x7d, 0xb9, - 0xbe, 0x38, 0x98, 0x13, 0x1e, 0xbf, 0x4c, 0x37, 0xa0, 0xbc, 0x7a, 0x0b, 0x2f, 0xf4, 0xfc, 0x59, - 0x7b, 0xa5, 0x2a, 0x85, 0x50, 0xec, 0x3e, 0xdd, 0x47, 0xdf, 0x10, 0xf9, 0x1c, 0xde, 0xd4, 0x62, - 0xb8, 0xa4, 0x30, 0x17, 0x7f, 0x28, 0x2f, 0xd6, 0x6d, 0x22, 0xe0, 0x66, 0xee, 0xb1, 0x02, 0x6e, - 0x7e, 0x11, 0x4a, 0xab, 0xb7, 0xb8, 0xba, 0x6d, 0xcd, 0x0e, 0xf6, 0xc4, 0x9a, 0xc2, 0x21, 0xa4, - 0xfb, 0xf2, 0x19, 0x67, 0xcf, 0xd6, 0x2e, 0xb6, 0x1a, 0x06, 0xd9, 0x82, 0x39, 0xfe, 0x6d, 0xce, - 0x8e, 0xd3, 0xe4, 0x71, 0xfb, 0x1c, 0xbb, 0x2d, 0x56, 0xd8, 0x8b, 0x47, 0x87, 0x95, 0x0a, 0xdd, - 0x47, 0xaf, 0x17, 0x51, 0x6f, 0x05, 0x08, 0xa0, 0xba, 0xbf, 0x64, 0xe0, 0xab, 0x51, 0xc0, 0xcc, - 0x09, 0x6c, 0x90, 0xb5, 0xc6, 0xda, 0x66, 0xb0, 0x1c, 0xc8, 0xf8, 0xc3, 0x51, 0x58, 0xec, 0x2f, - 0x76, 0x91, 0xf7, 0xf5, 0x09, 0x3c, 0x77, 0xac, 0xa0, 0x76, 0xfc, 0x1c, 0x7e, 0x09, 0xe6, 0x57, - 0xdd, 0x90, 0xfa, 0x5d, 0xdf, 0x91, 0xd1, 0xc3, 0xd6, 0xbc, 0x40, 0x7a, 0x19, 0xa1, 0x92, 0x9d, - 0x46, 0xf5, 0xc2, 0x5f, 0x0e, 0xdf, 0x85, 0x54, 0x25, 0x7b, 0x16, 0x05, 0xb2, 0x0a, 0xd3, 0x4a, - 0x79, 0xbb, 0xb7, 0xab, 0xbe, 0xd5, 0xab, 0x34, 0xdb, 0x3d, 0xd5, 0x05, 0x23, 0x81, 0x84, 0x9e, - 0x4c, 0xa1, 0x1d, 0x3a, 0xcd, 0x9b, 0xf7, 0x6f, 0x35, 0xc4, 0x74, 0x72, 0x4f, 0x26, 0x2c, 0xb5, - 0x3e, 0x7c, 0xb8, 0xaf, 0xc9, 0x4d, 0x31, 0xf0, 0xe2, 0x2f, 0x3e, 0x16, 0x27, 0xfc, 0x3c, 0x40, - 0xbc, 0x95, 0xd4, 0x48, 0x00, 0xf1, 0xd6, 0xd3, 0x9d, 0x15, 0x65, 0x29, 0x59, 0x83, 0x99, 0xf8, - 0xd7, 0xdd, 0x87, 0xae, 0x7c, 0x2f, 0xe3, 0x2a, 0x58, 0x65, 0xe7, 0x7a, 0xac, 0x4e, 0x15, 0xc5, - 0x13, 0x68, 0x64, 0x09, 0x8a, 0xf7, 0x3d, 0x7f, 0x7f, 0x87, 0xcd, 0xf1, 0x48, 0x7c, 0x59, 0x78, - 0x28, 0xca, 0x54, 0xa1, 0x58, 0xc2, 0xb1, 0xed, 0xb2, 0xea, 0x3e, 0x70, 0x7c, 0x0f, 0xed, 0x1b, - 0x54, 0x0b, 0x3f, 0x1a, 0x17, 0x6b, 0x31, 0x58, 0xe2, 0x62, 0x72, 0x01, 0x46, 0xab, 0xcd, 0xd0, - 0xf3, 0x05, 0xfb, 0xe3, 0x2b, 0x85, 0x15, 0x68, 0x2b, 0x85, 0x15, 0xb0, 0x41, 0x64, 0x3c, 0x69, - 0x3c, 0x1e, 0x44, 0x9d, 0x11, 0xb1, 0x5a, 0x76, 0xd9, 0x31, 0xe9, 0x0e, 0x6a, 0x47, 0xb5, 0x70, - 0xb2, 0x3b, 0x29, 0xbd, 0xba, 0x00, 0x33, 0x7e, 0x18, 0xfa, 0x2e, 0x79, 0x26, 0x5d, 0x3e, 0xde, - 0x92, 0xdf, 0xb0, 0x87, 0x58, 0xf2, 0xaf, 0x47, 0x2e, 0x90, 0x6a, 0x54, 0x25, 0x2c, 0x51, 0xe5, - 0x1a, 0xe1, 0x0c, 0xa9, 0xaf, 0xbf, 0xc2, 0xe3, 0xac, 0xbf, 0xbf, 0x57, 0x7c, 0x9c, 0xf5, 0x27, - 0xc6, 0x37, 0x3f, 0xec, 0xf8, 0x16, 0x86, 0x1a, 0x5f, 0x76, 0xa8, 0x44, 0xb1, 0x8c, 0xeb, 0x76, - 0xa8, 0x71, 0xc4, 0x28, 0x00, 0xb5, 0xd5, 0xb5, 0xb5, 0x78, 0x7f, 0x3a, 0x8a, 0x22, 0x24, 0x20, - 0x85, 0xd1, 0xb4, 0x90, 0x90, 0xc0, 0x57, 0xc1, 0x19, 0x23, 0x90, 0x67, 0x7e, 0x03, 0x1d, 0xea, - 0xc4, 0x62, 0xe3, 0xd6, 0x2f, 0x52, 0x4c, 0xe0, 0xbe, 0x76, 0xda, 0xfb, 0x84, 0x86, 0x94, 0x5c, - 0xe7, 0xe3, 0x8f, 0xb5, 0xce, 0xb9, 0xc1, 0xb7, 0xbf, 0xe1, 0xed, 0x3a, 0xd2, 0xed, 0x4a, 0x1a, - 0x7c, 0xfb, 0x56, 0x9b, 0x95, 0x26, 0x0c, 0xbe, 0x39, 0x28, 0xb9, 0x08, 0x63, 0xec, 0xc7, 0x7a, - 0x4d, 0x98, 0x64, 0xa0, 0xd2, 0x03, 0x91, 0x74, 0x5f, 0x37, 0x0e, 0x24, 0x9b, 0x59, 0xed, 0xd8, - 0x4e, 0x5b, 0xc4, 0xdd, 0x89, 0x9b, 0xa1, 0xac, 0x34, 0xd9, 0x0c, 0x82, 0x92, 0x26, 0x94, 0x4c, - 0xba, 0x53, 0xf7, 0xbd, 0x90, 0x36, 0x43, 0xda, 0x12, 0x17, 0x3d, 0xa9, 0xeb, 0x58, 0xf6, 0x3c, - 0x7e, 0x89, 0x45, 0xb7, 0xa8, 0xdc, 0x77, 0x0f, 0x2b, 0xc0, 0x8a, 0xb8, 0x23, 0x25, 0x13, 0x79, - 0xd8, 0xfc, 0x77, 0x25, 0xb2, 0x7a, 0xb0, 0xa9, 0x44, 0xc9, 0x37, 0x19, 0xab, 0x8f, 0x86, 0x24, - 0x6e, 0xac, 0xd4, 0xa7, 0xb1, 0x37, 0x32, 0x1b, 0xab, 0x28, 0xa3, 0x9d, 0xd9, 0x68, 0x66, 0x23, - 0xe4, 0x1d, 0x98, 0x5c, 0x59, 0x5f, 0xf1, 0xdc, 0x1d, 0x67, 0xb7, 0xb1, 0x56, 0xc5, 0xdb, 0xa2, - 0x90, 0xd7, 0x9a, 0x8e, 0xd5, 0xc4, 0x72, 0x2b, 0xd8, 0xb3, 0xb5, 0x50, 0x10, 0x31, 0x3c, 0xb9, - 0x01, 0xd3, 0xf2, 0xa7, 0x49, 0x77, 0x98, 0xbc, 0x36, 0xad, 0x38, 0x5e, 0x47, 0x14, 0xd8, 0x40, - 0xe8, 0x22, 0x5b, 0x02, 0x8d, 0x2d, 0xc6, 0x1a, 0xed, 0xb6, 0xbd, 0x03, 0xf6, 0x79, 0x9b, 0x0e, - 0xf5, 0xf1, 0x5a, 0x28, 0x16, 0x63, 0x2b, 0xaa, 0xb1, 0x42, 0x47, 0x37, 0x44, 0xd1, 0x91, 0x98, - 0xe8, 0x27, 0x96, 0xf8, 0x3d, 0x27, 0x70, 0xb6, 0x9d, 0xb6, 0x13, 0x1e, 0xe0, 0x85, 0x50, 0xc8, - 0x3e, 0x72, 0x5f, 0x3c, 0x88, 0x6a, 0x55, 0xd1, 0x2f, 0x85, 0x6a, 0xfc, 0x4a, 0x1e, 0x9e, 0x1b, - 0xa4, 0x1c, 0x21, 0x0d, 0x9d, 0x0f, 0x9e, 0x1f, 0x42, 0xa1, 0x72, 0x3c, 0x27, 0x5c, 0xed, 0x73, - 0xcf, 0xc0, 0xc1, 0x48, 0xdc, 0x33, 0xd4, 0xc1, 0x48, 0xdc, 0x38, 0x1e, 0x08, 0x36, 0xf7, 0x51, - 0x83, 0x12, 0x5c, 0x83, 0x89, 0x15, 0xcf, 0x0d, 0xe9, 0xa3, 0x30, 0x11, 0x82, 0x87, 0x17, 0x26, - 0x03, 0x32, 0x48, 0x50, 0xe3, 0xdf, 0xe5, 0xe1, 0xcc, 0x40, 0xed, 0x00, 0xd9, 0xd4, 0x47, 0xed, - 0xc2, 0x30, 0x2a, 0x85, 0xe3, 0x87, 0x6d, 0x29, 0x65, 0xc0, 0x7c, 0xac, 0xd3, 0xec, 0xe2, 0x7f, - 0x97, 0x13, 0x83, 0xf4, 0x19, 0x18, 0xc7, 0xa6, 0xa2, 0x21, 0xe2, 0x5a, 0x78, 0xe4, 0xc2, 0x8e, - 0xae, 0x85, 0xe7, 0x60, 0xe4, 0x2a, 0x14, 0x57, 0xec, 0x76, 0x5b, 0x09, 0x50, 0x84, 0x17, 0xfc, - 0x26, 0x96, 0x25, 0xac, 0xf0, 0x25, 0x20, 0x3b, 0xb6, 0xf8, 0xdf, 0xca, 0x59, 0x81, 0xcc, 0x52, - 0xa0, 0x25, 0x8e, 0x0b, 0x05, 0x18, 0xa3, 0xb1, 0x37, 0xbd, 0x28, 0x04, 0x0a, 0x8f, 0xc6, 0xce, - 0x0a, 0xb4, 0x68, 0xec, 0xac, 0xc0, 0xf8, 0xd5, 0x02, 0x3c, 0x3f, 0x58, 0xc5, 0x45, 0xb6, 0xf4, - 0x29, 0x78, 0x75, 0x28, 0xc5, 0xd8, 0xf1, 0x73, 0x20, 0x73, 0x1b, 0xf0, 0x01, 0x39, 0x9f, 0xf6, - 0x7c, 0xfc, 0xde, 0x61, 0x45, 0x71, 0xed, 0xb8, 0xe9, 0x39, 0xae, 0xf2, 0x26, 0xfb, 0x8d, 0xd4, - 0xa1, 0x3e, 0xb9, 0x74, 0x6d, 0xb8, 0x2f, 0x8b, 0xf1, 0x38, 0x5f, 0x19, 0x56, 0x18, 0xf8, 0x02, - 0x94, 0x93, 0xa8, 0xe4, 0x1c, 0x8c, 0xe0, 0x07, 0x28, 0xee, 0x9b, 0x09, 0x0a, 0x58, 0xbf, 0x78, - 0x5b, 0xac, 0x1d, 0x8c, 0xd9, 0xa4, 0xc6, 0x17, 0x10, 0x98, 0x22, 0x66, 0x93, 0x16, 0x9c, 0x40, - 0x8f, 0xd9, 0xa4, 0x22, 0x19, 0x7f, 0x92, 0x83, 0xd3, 0x7d, 0x75, 0x14, 0xa4, 0xae, 0x4f, 0xd8, - 0xcb, 0xc7, 0x29, 0x35, 0x8e, 0x9d, 0xab, 0xc5, 0x9f, 0x90, 0x6b, 0xff, 0x5d, 0x28, 0x35, 0x7a, - 0xdb, 0xc9, 0xab, 0x1d, 0x8f, 0xa8, 0xa6, 0x94, 0xab, 0x27, 0x98, 0x0a, 0xcf, 0xfa, 0x2f, 0x9d, - 0xf2, 0x85, 0x25, 0xa5, 0x62, 0xbe, 0x1d, 0x05, 0x15, 0x49, 0xc7, 0xac, 0xd2, 0x91, 0x8c, 0x5f, - 0xce, 0x67, 0xdf, 0x91, 0x6f, 0xac, 0xd4, 0x1f, 0xe7, 0x8e, 0x7c, 0x63, 0xa5, 0x7e, 0x7c, 0xdf, - 0xff, 0x4b, 0xd9, 0x77, 0x6e, 0x54, 0xc4, 0x39, 0x9e, 0x7c, 0xfb, 0x90, 0x46, 0x45, 0x82, 0x3b, - 0x06, 0x09, 0xa3, 0x22, 0x01, 0x4c, 0xde, 0x80, 0x89, 0x0d, 0x8f, 0x87, 0x93, 0x92, 0x3d, 0xe6, - 0x51, 0x37, 0x64, 0xa1, 0xca, 0x1e, 0x23, 0x48, 0x76, 0x2d, 0xd1, 0x27, 0x5e, 0x5a, 0xa9, 0xe3, - 0xb5, 0x24, 0xb1, 0x5c, 0xf4, 0x17, 0x02, 0x1d, 0xcd, 0xf8, 0x47, 0xa3, 0x60, 0x1c, 0xaf, 0xdf, - 0x24, 0x5f, 0xd6, 0xc7, 0xee, 0xd2, 0xd0, 0x9a, 0xd1, 0xa1, 0x58, 0x6e, 0xb5, 0xd7, 0x72, 0xa8, - 0xdb, 0xd4, 0x63, 0x41, 0x89, 0x32, 0x95, 0x05, 0x4a, 0xb8, 0x8f, 0x12, 0xdb, 0x60, 0xf1, 0x5f, - 0x16, 0xe2, 0xad, 0x96, 0x38, 0x1a, 0x73, 0x1f, 0xe1, 0x68, 0x24, 0xb7, 0xa0, 0xac, 0x96, 0x28, - 0x3a, 0x36, 0x94, 0x5c, 0x34, 0x42, 0x89, 0x8f, 0x4a, 0x21, 0xea, 0xe7, 0x6b, 0x61, 0xf8, 0xf3, - 0x35, 0xa1, 0xe3, 0x1b, 0x79, 0x3c, 0x1d, 0x9f, 0x88, 0x1d, 0x15, 0x88, 0x43, 0x6b, 0x54, 0x8f, - 0x1d, 0x95, 0x71, 0x70, 0xa9, 0xe0, 0x32, 0xfc, 0x15, 0xfe, 0x54, 0xa2, 0xbf, 0x44, 0xe1, 0xaf, - 0x38, 0x7e, 0x56, 0xf8, 0xab, 0x08, 0x85, 0x1d, 0x80, 0x66, 0xcf, 0xe5, 0x69, 0x3f, 0xc6, 0xe3, - 0x03, 0xd0, 0xef, 0xb9, 0x56, 0x32, 0xf5, 0x47, 0x04, 0x68, 0xfc, 0xd3, 0x91, 0x6c, 0xe1, 0x20, - 0x56, 0x81, 0x3f, 0x86, 0x70, 0x10, 0x21, 0x7d, 0x32, 0x2b, 0x75, 0x0b, 0xe6, 0xa4, 0xa1, 0x33, - 0xb6, 0xde, 0xa2, 0xfe, 0x96, 0xb9, 0x21, 0xa6, 0x18, 0x55, 0x4e, 0x91, 0x89, 0x74, 0x57, 0xd4, - 0x5b, 0x3d, 0x5f, 0x53, 0x39, 0x65, 0xe0, 0x2f, 0xfe, 0x13, 0xa9, 0x51, 0x53, 0x27, 0x01, 0x9d, - 0xd2, 0x73, 0x59, 0x93, 0xd0, 0xeb, 0x69, 0xd3, 0xa8, 0xa3, 0x70, 0xde, 0x1b, 0x69, 0x3f, 0xb7, - 0x74, 0x59, 0x51, 0xd5, 0x98, 0xea, 0x54, 0x12, 0x48, 0x64, 0x17, 0x4e, 0xc7, 0xa2, 0xb4, 0x72, - 0x53, 0x40, 0x8a, 0xbc, 0xc3, 0x17, 0x8e, 0x0e, 0x2b, 0x2f, 0x2b, 0xa2, 0xb8, 0x7a, 0xe1, 0x48, - 0x50, 0xef, 0x4f, 0x8b, 0xf1, 0xdb, 0x65, 0xdf, 0x76, 0x9b, 0x7b, 0xca, 0x9a, 0x47, 0x7e, 0xbb, - 0x8d, 0xa5, 0xa9, 0x08, 0x38, 0x31, 0xb0, 0xf1, 0xb7, 0xf3, 0xd9, 0x2a, 0x09, 0xf1, 0xd2, 0xf1, - 0x18, 0x2a, 0x09, 0x8e, 0x71, 0xfc, 0x29, 0xf1, 0x8f, 0xe4, 0x29, 0xf1, 0x32, 0x8c, 0x6f, 0x52, - 0xd7, 0x76, 0xa3, 0xc8, 0x52, 0x68, 0x71, 0x11, 0xf2, 0x22, 0x53, 0xd6, 0x91, 0xf7, 0x81, 0xd4, - 0x6d, 0x9f, 0xba, 0xe1, 0x8a, 0xd7, 0xe9, 0xda, 0x7e, 0xd8, 0xc1, 0xc4, 0x28, 0xfc, 0x68, 0x78, - 0xe1, 0xe8, 0xb0, 0x72, 0xa6, 0x8b, 0xb5, 0x56, 0x53, 0xa9, 0x56, 0x03, 0x14, 0xa6, 0x91, 0xc9, - 0x65, 0x18, 0x97, 0x86, 0x04, 0x85, 0x38, 0xd8, 0x64, 0xda, 0x88, 0x40, 0x42, 0x19, 0xff, 0x72, - 0x14, 0xce, 0x1e, 0xf7, 0xac, 0x43, 0x76, 0x00, 0xee, 0xba, 0xdb, 0x9e, 0xed, 0xb7, 0x1c, 0x77, - 0x57, 0xb8, 0x80, 0x5e, 0x1b, 0xf2, 0x4d, 0xe8, 0x52, 0x8c, 0xc9, 0x2a, 0xb9, 0xc3, 0xad, 0x17, - 0x95, 0x99, 0x0a, 0x65, 0xf2, 0x35, 0x28, 0x9a, 0xb4, 0xe9, 0x3d, 0xa0, 0x42, 0x75, 0x37, 0xb9, - 0xf4, 0xd9, 0x61, 0x5b, 0x91, 0x78, 0xd8, 0x06, 0x7a, 0x22, 0xfa, 0xa2, 0xc4, 0x8c, 0x68, 0x92, - 0xaf, 0xc3, 0x24, 0xcf, 0x7f, 0x53, 0xdd, 0x09, 0x85, 0x7a, 0xef, 0xf8, 0x48, 0x22, 0x39, 0xc6, - 0x24, 0x79, 0x46, 0x1d, 0xcb, 0xde, 0xd1, 0x3c, 0x1b, 0x78, 0x24, 0x11, 0x85, 0xe4, 0xe2, 0x7f, - 0x92, 0x87, 0x69, 0xbd, 0xc3, 0x64, 0x03, 0xca, 0xeb, 0xae, 0x13, 0x3a, 0x76, 0x5b, 0x37, 0x35, - 0x15, 0x77, 0x4c, 0x87, 0xd7, 0x59, 0x99, 0x26, 0xa7, 0x29, 0x4c, 0xb6, 0x66, 0xd8, 0xd4, 0x05, - 0x21, 0xb7, 0x70, 0xe0, 0x81, 0x5f, 0xc5, 0x26, 0x7e, 0x81, 0xc7, 0x19, 0x8e, 0x6b, 0x2d, 0x1e, - 0x6a, 0x59, 0x0f, 0x6a, 0x99, 0x44, 0x26, 0x0f, 0x80, 0xdc, 0xee, 0x05, 0x21, 0xaf, 0xa1, 0xfe, - 0x32, 0xdd, 0xf1, 0xfc, 0x61, 0x42, 0x88, 0xbc, 0x2a, 0x06, 0xe7, 0xf9, 0x4e, 0x2f, 0x08, 0x2d, - 0x5f, 0xa0, 0x5b, 0xdb, 0x88, 0x9f, 0x18, 0xa4, 0x8c, 0x16, 0x16, 0x6f, 0x43, 0x49, 0x9d, 0x35, - 0xb4, 0xf8, 0x72, 0x3a, 0x8e, 0xb4, 0xbd, 0xe7, 0x16, 0x5f, 0xac, 0xc0, 0xe4, 0xe5, 0xe4, 0x39, - 0x11, 0x73, 0x2b, 0x1f, 0x1b, 0x46, 0xc5, 0xb1, 0xb5, 0x8c, 0x1f, 0xc9, 0xc1, 0xc9, 0x6c, 0x6b, - 0x21, 0xf2, 0x61, 0xe2, 0x55, 0x33, 0x37, 0xe8, 0xcd, 0x57, 0x9a, 0x18, 0x7d, 0xb4, 0x77, 0x4d, - 0xe3, 0x2f, 0x8f, 0xa4, 0xa4, 0xac, 0x0c, 0x8a, 0xe4, 0x46, 0xe6, 0x3c, 0xe6, 0x94, 0x73, 0x31, - 0x3d, 0x8f, 0x99, 0xb3, 0xf7, 0x36, 0x4c, 0x23, 0xe1, 0x78, 0x71, 0x29, 0xfa, 0x50, 0xfe, 0xc9, - 0xf1, 0xd2, 0x32, 0x13, 0xb0, 0x64, 0x1d, 0x08, 0x96, 0x2c, 0x7b, 0xa1, 0xe2, 0xeb, 0xae, 0x5c, - 0x34, 0x39, 0x85, 0x6d, 0x2f, 0xb4, 0x54, 0xaf, 0xf7, 0x0c, 0x24, 0xf2, 0x79, 0x98, 0x92, 0xd3, - 0xb9, 0x82, 0xb7, 0x9a, 0x11, 0x9c, 0x46, 0xbc, 0x0f, 0xc9, 0xbd, 0x68, 0xa1, 0x28, 0x6a, 0xea, - 0x80, 0xa4, 0xc3, 0xa3, 0x1f, 0x89, 0x42, 0xda, 0xaa, 0x86, 0x43, 0x84, 0x98, 0x7a, 0x45, 0xac, - 0xbe, 0x67, 0x79, 0xc6, 0x2b, 0x89, 0x6b, 0xd9, 0x61, 0x62, 0xe9, 0x25, 0x69, 0x93, 0x5d, 0x98, - 0x52, 0x32, 0x61, 0x55, 0xc3, 0x21, 0x12, 0xb1, 0xbd, 0x2c, 0x1a, 0x3b, 0xad, 0xa6, 0xd7, 0x4a, - 0x37, 0xa5, 0xd3, 0x35, 0x7e, 0x22, 0x0f, 0xd3, 0xfc, 0xb6, 0xc8, 0x4d, 0xc6, 0x9e, 0x5a, 0xdb, - 0xbe, 0xb7, 0x34, 0xdb, 0x3e, 0x19, 0xed, 0x5c, 0xed, 0xda, 0x50, 0x96, 0xd8, 0x7b, 0x40, 0xd2, - 0x38, 0xc4, 0x84, 0x92, 0x5a, 0x3a, 0xd8, 0x0e, 0xef, 0x4a, 0x1c, 0x18, 0x5f, 0x5c, 0xd6, 0xd1, - 0xb2, 0x32, 0x30, 0x35, 0x1a, 0xc6, 0x8f, 0xe7, 0x61, 0x4a, 0xb1, 0xc4, 0x7e, 0x6a, 0x07, 0xfe, - 0x0b, 0xda, 0xc0, 0x2f, 0x44, 0xc1, 0x3e, 0xa2, 0x9e, 0x0d, 0x35, 0xee, 0x3d, 0x98, 0x4d, 0xa1, - 0x24, 0x0d, 0xda, 0x73, 0xc3, 0x18, 0xb4, 0xbf, 0x9e, 0x8e, 0xb2, 0xcd, 0x73, 0xec, 0x45, 0x31, - 0x57, 0xd5, 0xb0, 0xde, 0x3f, 0x95, 0x87, 0x79, 0xf1, 0x0b, 0xd3, 0x52, 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, 0x0a, 0x58, 0x1c, 0x65, 0x24, 0x3f, 0x44, 0x94, 0x91, 0x0d, 0x28, - 0x63, 0x53, 0xc2, 0x15, 0x29, 0xd8, 0x32, 0xd7, 0xc5, 0x20, 0xa1, 0xf4, 0xc1, 0x73, 0x87, 0x08, - 0xff, 0xa5, 0x20, 0xa1, 0x75, 0x4f, 0x61, 0x92, 0x5f, 0xcc, 0xc1, 0x34, 0x16, 0xae, 0x3e, 0x60, - 0xe2, 0x26, 0x23, 0x36, 0x22, 0xc2, 0x4f, 0x44, 0xd6, 0x7a, 0x8d, 0xd0, 0x77, 0xdc, 0x5d, 0x61, - 0xae, 0xb7, 0x2d, 0xcc, 0xf5, 0xde, 0xe6, 0x66, 0x86, 0x97, 0x9a, 0x5e, 0xe7, 0xf2, 0xae, 0x6f, - 0x3f, 0x70, 0xb8, 0x93, 0x81, 0xdd, 0xbe, 0x1c, 0xa7, 0x86, 0xed, 0x3a, 0x89, 0xa4, 0xad, 0x82, - 0x14, 0x9a, 0x42, 0xf2, 0x0f, 0xa5, 0xd8, 0x6c, 0xf2, 0x71, 0x40, 0xff, 0x22, 0xf2, 0x7d, 0x70, - 0x8a, 0x87, 0x83, 0x5e, 0xf1, 0xdc, 0xd0, 0x71, 0x7b, 0x5e, 0x2f, 0x58, 0xb6, 0x9b, 0xfb, 0xbd, - 0x6e, 0x20, 0x82, 0x04, 0x61, 0xcf, 0x9b, 0x51, 0xa5, 0xb5, 0xcd, 0x6b, 0xb5, 0x40, 0x7d, 0xd9, - 0x04, 0xc8, 0x1a, 0xcc, 0xf2, 0xaa, 0x6a, 0x2f, 0xf4, 0x1a, 0x4d, 0xbb, 0xcd, 0x04, 0xe2, 0x71, - 0xa4, 0xca, 0x6d, 0x92, 0x7a, 0xa1, 0x67, 0x05, 0xbc, 0x5c, 0x7d, 0x2b, 0x48, 0x21, 0x91, 0x75, - 0x98, 0x31, 0xa9, 0xdd, 0xba, 0x6d, 0x3f, 0x5a, 0xb1, 0xbb, 0x76, 0xd3, 0x09, 0x79, 0x7e, 0x8a, - 0x02, 0x57, 0x29, 0xf8, 0xd4, 0x6e, 0x59, 0x1d, 0xfb, 0x91, 0xd5, 0x14, 0x95, 0xfa, 0x7b, 0xb3, - 0x86, 0x17, 0x91, 0x72, 0xdc, 0x88, 0xd4, 0x44, 0x92, 0x94, 0xe3, 0xf6, 0x27, 0x15, 0xe3, 0x49, - 0x52, 0x3c, 0x51, 0x18, 0x77, 0x9b, 0x84, 0xb3, 0xb9, 0xf3, 0x39, 0x85, 0x94, 0xc8, 0x2e, 0x86, - 0x2e, 0x94, 0x49, 0x52, 0x0a, 0x1e, 0x5b, 0x79, 0xf7, 0x7d, 0x27, 0xa4, 0x6a, 0x0f, 0x27, 0xf1, - 0xb3, 0x70, 0xfc, 0xd1, 0xe1, 0xb4, 0x5f, 0x17, 0x53, 0x98, 0x31, 0x35, 0xa5, 0x93, 0xa5, 0x14, - 0xb5, 0xec, 0x5e, 0xa6, 0x30, 0x23, 0x6a, 0x6a, 0x3f, 0xa7, 0xb0, 0x9f, 0x0a, 0xb5, 0x3e, 0x1d, - 0x4d, 0x61, 0x92, 0x3b, 0x6c, 0xd0, 0x42, 0x76, 0x73, 0xf7, 0x5c, 0xe1, 0xcf, 0x39, 0x8d, 0x9f, - 0xf6, 0x92, 0x10, 0x1b, 0xca, 0xbe, 0xac, 0xb6, 0x32, 0xbc, 0x3b, 0x93, 0xc8, 0xe4, 0x2f, 0xc0, - 0xcc, 0x56, 0x40, 0xaf, 0xaf, 0xd7, 0x1b, 0x32, 0x7a, 0x34, 0x3e, 0x6f, 0x4d, 0x2f, 0x5d, 0x39, - 0x86, 0xe9, 0x5c, 0x52, 0x71, 0x30, 0xd3, 0x2a, 0x9f, 0xb7, 0x5e, 0x40, 0xad, 0x1d, 0xa7, 0x1b, - 0x44, 0xa1, 0xf8, 0xd5, 0x79, 0x4b, 0x34, 0x65, 0xac, 0xc1, 0x6c, 0x8a, 0x0c, 0x99, 0x06, 0x60, - 0x85, 0xd6, 0xd6, 0x9d, 0xc6, 0xea, 0x66, 0xf9, 0x19, 0x52, 0x86, 0x12, 0xfe, 0x5e, 0xbd, 0x53, - 0x5d, 0xde, 0x58, 0xad, 0x95, 0x73, 0x64, 0x16, 0xa6, 0xb0, 0xa4, 0xb6, 0xde, 0xe0, 0x45, 0x79, - 0x9e, 0x20, 0xcf, 0x2c, 0xf3, 0xad, 0x1b, 0xb2, 0x0d, 0x80, 0x67, 0x8a, 0xf1, 0xd7, 0xf3, 0x70, - 0x5a, 0x1e, 0x2b, 0x34, 0x7c, 0xe8, 0xf9, 0xfb, 0x8e, 0xbb, 0xfb, 0x94, 0x9f, 0x0e, 0xd7, 0xb5, - 0xd3, 0xe1, 0xa5, 0xc4, 0x49, 0x9d, 0xe8, 0xe5, 0x80, 0x23, 0xe2, 0x3b, 0x13, 0x70, 0x66, 0x20, - 0x16, 0x79, 0x9f, 0x9d, 0xe6, 0x0e, 0x75, 0xc3, 0xf5, 0x56, 0x9b, 0x32, 0x11, 0xd5, 0xeb, 0x85, - 0xc2, 0x7f, 0xf8, 0x45, 0x7c, 0x51, 0xc2, 0x4a, 0xcb, 0x69, 0xb5, 0xa9, 0x15, 0xf2, 0x6a, 0x6d, - 0xb9, 0xa5, 0xb1, 0x19, 0xc9, 0x28, 0xeb, 0xf3, 0xba, 0x1b, 0x52, 0xff, 0x01, 0xfa, 0xdd, 0x44, - 0x24, 0xf7, 0x29, 0xed, 0x5a, 0x36, 0xab, 0xb5, 0x1c, 0x51, 0xad, 0x93, 0x4c, 0x61, 0x93, 0xeb, - 0x0a, 0x49, 0x94, 0xf2, 0x6f, 0xdb, 0x8f, 0x84, 0xed, 0xbe, 0xc8, 0x46, 0x12, 0x91, 0xe4, 0x91, - 0x39, 0x3a, 0xf6, 0x23, 0x33, 0x8d, 0x42, 0x3e, 0x80, 0x13, 0xe2, 0x00, 0x12, 0x91, 0x23, 0x65, - 0x8f, 0x79, 0x5c, 0xca, 0x57, 0xd8, 0xc5, 0x4c, 0xba, 0xdf, 0xca, 0x68, 0xb0, 0x59, 0xbd, 0xce, - 0xa6, 0x42, 0x36, 0xd9, 0x81, 0x9c, 0x18, 0x8e, 0xdb, 0x34, 0x08, 0x64, 0xf8, 0x15, 0xa1, 0x9b, - 0x55, 0x07, 0xd3, 0xea, 0xf0, 0x7a, 0xb3, 0x2f, 0x26, 0x59, 0x83, 0xe9, 0xfb, 0x74, 0x5b, 0x9d, - 0x9f, 0xb1, 0x88, 0x55, 0x95, 0x1f, 0xd2, 0xed, 0xfe, 0x93, 0x93, 0xc0, 0x23, 0x0e, 0xbe, 0x50, - 0x3f, 0x3a, 0xd8, 0x60, 0x17, 0x67, 0x97, 0xfa, 0x78, 0xff, 0x1d, 0x47, 0x66, 0xb0, 0x10, 0x4b, - 0xc8, 0x7a, 0xbd, 0xd0, 0x1d, 0x61, 0xc4, 0x83, 0xb6, 0x28, 0xb7, 0x12, 0x39, 0x93, 0xd3, 0x54, - 0xc9, 0xd7, 0x61, 0xc6, 0xf4, 0x7a, 0xa1, 0xe3, 0xee, 0x36, 0xd8, 0x0d, 0x93, 0xee, 0xf2, 0x03, - 0x29, 0x0e, 0x6e, 0x9d, 0xa8, 0x15, 0x76, 0x51, 0xbc, 0xd0, 0x0a, 0x44, 0xa9, 0x76, 0x22, 0xe8, - 0x08, 0xe4, 0x6b, 0x30, 0xcd, 0x23, 0xf0, 0x45, 0x0d, 0x4c, 0x68, 0x89, 0x13, 0xf5, 0xca, 0x7b, - 0x57, 0x84, 0xa9, 0x35, 0x96, 0x66, 0x35, 0x90, 0xa0, 0x46, 0xbe, 0x22, 0x06, 0xab, 0xee, 0xb8, - 0xbb, 0xd1, 0x32, 0x06, 0x1c, 0xf9, 0x8b, 0xf1, 0x90, 0x74, 0xd9, 0xe7, 0xca, 0x65, 0xdc, 0xc7, - 0x6f, 0x24, 0x4d, 0x87, 0x84, 0x70, 0xa6, 0x1a, 0x04, 0x4e, 0x10, 0x0a, 0x2f, 0xfb, 0xd5, 0x47, - 0xb4, 0xd9, 0x63, 0xc0, 0xf7, 0x3d, 0x7f, 0x9f, 0xfa, 0xdc, 0x73, 0x71, 0x74, 0xf9, 0xd2, 0xd1, - 0x61, 0xe5, 0x55, 0x1b, 0x01, 0x2d, 0xe1, 0x98, 0x6f, 0x51, 0x09, 0x6a, 0x3d, 0xe4, 0xb0, 0x4a, - 0x1f, 0x06, 0x13, 0x25, 0x5f, 0x83, 0x93, 0x2b, 0x76, 0x40, 0xd7, 0xdd, 0x80, 0xba, 0x81, 0x13, - 0x3a, 0x0f, 0xa8, 0x18, 0x54, 0x3c, 0xfc, 0x8a, 0x3c, 0xaa, 0x79, 0xd3, 0x0e, 0xd8, 0xc6, 0x8c, - 0x40, 0x2c, 0x31, 0x29, 0x6a, 0xd0, 0xf4, 0x6c, 0x2a, 0xc4, 0x84, 0xe9, 0x46, 0x63, 0xad, 0xe6, - 0xd8, 0xd1, 0xbe, 0x9a, 0xc2, 0xf1, 0x7a, 0x15, 0x1f, 0x97, 0x82, 0x3d, 0xab, 0xe5, 0xd8, 0xd1, - 0x86, 0xea, 0x33, 0x58, 0x09, 0x0a, 0xc6, 0x61, 0x0e, 0xca, 0xc9, 0xa9, 0x24, 0x5f, 0x82, 0x09, - 0xee, 0x74, 0x41, 0x83, 0x3d, 0xa1, 0x7f, 0x91, 0x36, 0xfc, 0x51, 0xb9, 0x8e, 0x24, 0x02, 0xf7, - 0x70, 0x97, 0x0e, 0xaa, 0x9a, 0x7a, 0xae, 0x3d, 0x63, 0xc6, 0xc4, 0x48, 0x0b, 0x4a, 0x7c, 0xb6, - 0x28, 0x06, 0xe6, 0x4f, 0xc4, 0x1e, 0x50, 0xab, 0x12, 0xf4, 0xb9, 0x81, 0x33, 0x5f, 0x13, 0x1c, - 0x40, 0x6b, 0x42, 0xa3, 0xba, 0x0c, 0x50, 0x94, 0x88, 0xc6, 0x69, 0x38, 0xd5, 0xe7, 0x9b, 0x8d, - 0x07, 0xa8, 0x73, 0xee, 0xd3, 0x22, 0xf9, 0x12, 0xcc, 0x23, 0xe2, 0x8a, 0xe7, 0xba, 0xb4, 0x19, - 0x22, 0x3b, 0x92, 0xef, 0xbf, 0x05, 0x6e, 0xa6, 0xc9, 0xfb, 0xdb, 0x8c, 0x00, 0xac, 0xe4, 0x33, - 0x70, 0x26, 0x05, 0xe3, 0xe7, 0xf3, 0xb0, 0x20, 0x38, 0x9c, 0x49, 0x9b, 0x1e, 0x6a, 0x1f, 0x9f, - 0xf2, 0x13, 0x75, 0x55, 0x3b, 0x51, 0x5f, 0x8c, 0x22, 0x90, 0x66, 0x75, 0x72, 0xc0, 0x81, 0xfa, - 0xcb, 0x39, 0x78, 0x6e, 0x10, 0x52, 0xa4, 0x55, 0xcc, 0x65, 0x69, 0x15, 0x49, 0x17, 0xe6, 0x70, - 0x42, 0x57, 0xf6, 0x68, 0x73, 0x1f, 0x83, 0xa6, 0xa0, 0x2f, 0x71, 0xbe, 0x8f, 0xb5, 0xd5, 0xeb, - 0x99, 0xd6, 0x56, 0x27, 0xf9, 0x2a, 0x6b, 0x22, 0x0d, 0x1e, 0x8f, 0x65, 0x9f, 0x1e, 0x04, 0x66, - 0x16, 0x69, 0xe3, 0xa7, 0xf3, 0xec, 0xca, 0x16, 0xee, 0xd5, 0x7d, 0xba, 0x43, 0x7d, 0xea, 0x36, - 0xe9, 0xa7, 0xcc, 0x27, 0x54, 0xef, 0xdc, 0x50, 0x1a, 0x8c, 0x6f, 0x4f, 0xc3, 0x7c, 0x16, 0x1a, - 0x1b, 0x17, 0xe5, 0xd2, 0x5c, 0x94, 0x4e, 0xfc, 0xe2, 0xaa, 0xfc, 0xad, 0x1c, 0x94, 0x1a, 0xb4, - 0xe9, 0xb9, 0xad, 0xeb, 0x68, 0x0e, 0x2b, 0x46, 0xc7, 0xe6, 0x42, 0x03, 0x2b, 0xb7, 0x76, 0x12, - 0x76, 0xb2, 0xdf, 0x3b, 0xac, 0x7c, 0x71, 0xb8, 0xbb, 0x6a, 0xd3, 0x43, 0xdd, 0x67, 0x88, 0x59, - 0x0e, 0xa3, 0x26, 0xf8, 0xd7, 0x98, 0x5a, 0xb3, 0x64, 0x19, 0xa6, 0xc4, 0x86, 0xf5, 0xd4, 0x54, - 0x0e, 0x3c, 0x4c, 0xab, 0xac, 0x48, 0x3d, 0x9f, 0x6a, 0x28, 0xe4, 0x2a, 0x14, 0xb6, 0x96, 0xae, - 0x8b, 0x59, 0x90, 0xe1, 0x88, 0xb6, 0x96, 0xae, 0xa3, 0x42, 0x8c, 0x5d, 0x32, 0xa6, 0x7a, 0x4b, - 0x9a, 0xa1, 0xe9, 0xd6, 0xd2, 0x75, 0xf2, 0x17, 0xe1, 0x44, 0xcd, 0x09, 0x44, 0x13, 0xdc, 0x3f, - 0xb9, 0x85, 0x51, 0x39, 0xc6, 0xfa, 0xac, 0xdf, 0xcf, 0x65, 0xae, 0xdf, 0x17, 0x5a, 0x11, 0x11, - 0x8b, 0x3b, 0x3f, 0xb7, 0x92, 0x29, 0x2b, 0xb2, 0xdb, 0x21, 0x1f, 0xc2, 0x34, 0xbe, 0x8d, 0xa1, - 0xcb, 0x36, 0xe6, 0x4a, 0x1b, 0xef, 0xd3, 0xf2, 0x67, 0x32, 0x5b, 0x5e, 0xe4, 0xc1, 0xf3, 0xd0, - 0xf1, 0x1b, 0xf3, 0xaa, 0x69, 0xf7, 0x7e, 0x8d, 0x32, 0xb9, 0x09, 0x33, 0x42, 0x00, 0xbb, 0xbb, - 0xb3, 0xb9, 0x47, 0x6b, 0xf6, 0x81, 0xb0, 0x11, 0xc5, 0x3b, 0x9d, 0x90, 0xda, 0x2c, 0x6f, 0xc7, - 0x0a, 0xf7, 0xa8, 0xd5, 0xb2, 0x35, 0x51, 0x25, 0x81, 0x48, 0xbe, 0x09, 0x93, 0x1b, 0x5e, 0x93, - 0xc9, 0xde, 0xc8, 0x1b, 0xb8, 0xd9, 0xe8, 0x97, 0xd9, 0x56, 0x6e, 0xf3, 0xe2, 0x84, 0x40, 0xf5, - 0xbd, 0xc3, 0xca, 0x5b, 0x8f, 0xbb, 0x6c, 0x94, 0x06, 0x4c, 0xb5, 0x35, 0xb2, 0x02, 0xc5, 0xfb, - 0x74, 0x9b, 0xf5, 0x36, 0x99, 0x35, 0x5d, 0x16, 0x0b, 0x83, 0x72, 0xf1, 0x4b, 0x33, 0x28, 0x17, - 0x65, 0xc4, 0x87, 0x59, 0x1c, 0x9f, 0xba, 0x1d, 0x04, 0x0f, 0x3d, 0xbf, 0x85, 0xe9, 0x2a, 0xfb, - 0x59, 0xa4, 0x2e, 0x65, 0x0e, 0xfe, 0x73, 0x7c, 0xf0, 0xbb, 0x0a, 0x05, 0x55, 0x84, 0x4c, 0x91, - 0x27, 0x5f, 0x87, 0x69, 0x11, 0x88, 0xec, 0xf6, 0xf5, 0x2a, 0xee, 0x84, 0x92, 0x16, 0xdb, 0x44, - 0xaf, 0x94, 0xef, 0x55, 0x58, 0x16, 0xc5, 0xd0, 0xe9, 0xec, 0xd8, 0xfa, 0xc3, 0xb3, 0x8a, 0x42, - 0xea, 0x30, 0x59, 0xa3, 0x0f, 0x9c, 0x26, 0xc5, 0xf8, 0x0b, 0xc2, 0x5d, 0x31, 0x4a, 0xc3, 0x1c, - 0xd7, 0x70, 0x6d, 0x4c, 0x0b, 0x0b, 0x78, 0x34, 0x07, 0xdd, 0xd5, 0x24, 0x02, 0x24, 0xd7, 0xa0, - 0xb0, 0x5e, 0xab, 0x0b, 0x6f, 0xc5, 0xd9, 0x28, 0xdc, 0x5f, 0x5d, 0x26, 0xad, 0x45, 0x1b, 0x6e, - 0xa7, 0xa5, 0xf9, 0x3a, 0xae, 0xd7, 0xea, 0x64, 0x07, 0xa6, 0x70, 0x00, 0xd6, 0xa8, 0xcd, 0xc7, - 0x76, 0xa6, 0xcf, 0xd8, 0x5e, 0xca, 0x1c, 0xdb, 0x05, 0x3e, 0xb6, 0x7b, 0x02, 0x5b, 0xcb, 0xc2, - 0xa9, 0x92, 0x65, 0x42, 0xad, 0xc8, 0x0c, 0x2c, 0x73, 0x47, 0x6e, 0x6e, 0xa0, 0x8d, 0xaa, 0x10, - 0x6a, 0x65, 0x22, 0xe1, 0x28, 0x99, 0x65, 0x5f, 0x67, 0xe8, 0x34, 0x1d, 0xf2, 0x05, 0x18, 0xb9, - 0xbb, 0x1f, 0xda, 0xc2, 0x2f, 0x51, 0x8e, 0x23, 0x2b, 0x92, 0xdd, 0x47, 0x3d, 0xa4, 0xb7, 0xaf, - 0x05, 0x90, 0x46, 0x1c, 0x36, 0x15, 0x6b, 0xb6, 0xdf, 0x7a, 0x68, 0xfb, 0x18, 0x04, 0x67, 0x4e, - 0x23, 0xa1, 0xd4, 0xf0, 0xa9, 0xd8, 0x13, 0x05, 0x89, 0x07, 0x4e, 0x95, 0x04, 0xf9, 0x3e, 0x38, - 0x1d, 0x38, 0xbb, 0xae, 0x1d, 0xf6, 0x7c, 0x6a, 0xd9, 0xed, 0x5d, 0xcf, 0x77, 0xc2, 0xbd, 0x8e, - 0x15, 0xf4, 0x9c, 0x90, 0xa2, 0x83, 0xe0, 0x74, 0x24, 0x33, 0x36, 0x24, 0x5c, 0x55, 0x82, 0x35, - 0x18, 0x94, 0x79, 0x2a, 0xc8, 0xae, 0x20, 0x5f, 0x81, 0x29, 0x95, 0x25, 0x07, 0x0b, 0x27, 0xce, - 0x16, 0xce, 0x4f, 0x47, 0x57, 0x8f, 0x24, 0x0b, 0x97, 0x09, 0x6c, 0x94, 0x33, 0x22, 0xd0, 0x13, - 0xd8, 0x28, 0xb4, 0x88, 0x09, 0xa7, 0x02, 0xae, 0xdf, 0xe8, 0xb9, 0xce, 0x23, 0x8c, 0xb5, 0x26, - 0x6c, 0x99, 0x17, 0x4e, 0x6a, 0x47, 0x5f, 0x03, 0xa1, 0xb6, 0xee, 0xac, 0x7f, 0x69, 0x2b, 0xa0, - 0xbe, 0x30, 0x69, 0x9e, 0xe7, 0xb8, 0x5b, 0xae, 0xf3, 0x28, 0x2e, 0xe5, 0xca, 0x93, 0x9b, 0x23, - 0x45, 0x52, 0x9e, 0x33, 0x67, 0xc5, 0x2e, 0x10, 0x33, 0x77, 0xfb, 0x7a, 0xd5, 0x1c, 0xaf, 0xaf, - 0xdf, 0x6b, 0xb4, 0xbd, 0xd0, 0xd8, 0x83, 0xf9, 0x2c, 0xaa, 0x64, 0x01, 0xc6, 0x45, 0xaa, 0x3c, - 0x3c, 0x1c, 0x8b, 0xa6, 0xfc, 0x49, 0x9e, 0x85, 0x89, 0x1d, 0xc7, 0x0f, 0x42, 0xab, 0xe7, 0x70, - 0x79, 0x61, 0xd4, 0x2c, 0x62, 0xc1, 0x96, 0xd3, 0x22, 0xa7, 0xa1, 0x88, 0x6f, 0x5c, 0xac, 0xae, - 0x80, 0x75, 0xe3, 0xec, 0xf7, 0x96, 0xd3, 0x32, 0xfe, 0x8b, 0x1c, 0x1e, 0x41, 0xe4, 0x55, 0x8c, - 0x69, 0x1b, 0xd9, 0x9f, 0xa0, 0xfe, 0xd9, 0xee, 0x26, 0x52, 0xcf, 0x71, 0x10, 0xf2, 0x3a, 0x8c, - 0x5d, 0xb7, 0x9b, 0x34, 0x32, 0x6b, 0x40, 0xe0, 0x1d, 0x2c, 0x51, 0x95, 0xd5, 0x1c, 0x86, 0xc9, - 0xc7, 0x7c, 0x6b, 0x56, 0xc3, 0x90, 0x06, 0x9c, 0x7f, 0xae, 0x54, 0xa5, 0x29, 0x03, 0xca, 0xc7, - 0x62, 0x4b, 0xdb, 0x31, 0x40, 0xc2, 0x25, 0x2d, 0x93, 0x82, 0xf1, 0x87, 0xb9, 0x98, 0xa7, 0x92, - 0x57, 0x60, 0xc4, 0xac, 0x47, 0xdf, 0xcf, 0xc3, 0xf2, 0x24, 0x3e, 0x1f, 0x01, 0xc8, 0x57, 0xe0, - 0x84, 0x42, 0x27, 0xe5, 0x1f, 0xf7, 0x32, 0x46, 0x8d, 0x51, 0xbe, 0x24, 0xdb, 0x49, 0x2e, 0x9b, - 0x06, 0x5e, 0x06, 0xe2, 0x8a, 0x1a, 0x75, 0x1d, 0x4e, 0x5b, 0xe9, 0xac, 0x4a, 0xbb, 0x85, 0x00, - 0xc9, 0xce, 0x66, 0x51, 0xe0, 0x41, 0x63, 0x8c, 0xdf, 0xc8, 0x69, 0xbc, 0x92, 0x9c, 0xd3, 0xe4, - 0x5c, 0xdc, 0xd7, 0x09, 0xa5, 0x00, 0x97, 0x78, 0xdf, 0x04, 0xa8, 0xf6, 0x42, 0x6f, 0xd5, 0xf5, - 0xbd, 0x76, 0x5b, 0x44, 0x3c, 0xe3, 0xe1, 0x28, 0x7a, 0xa1, 0x67, 0x51, 0x2c, 0xd6, 0xc2, 0x51, - 0x44, 0xc0, 0x99, 0xae, 0x84, 0x85, 0x8f, 0xea, 0x4a, 0x68, 0xfc, 0x5c, 0x5e, 0xe3, 0x30, 0x4c, - 0xca, 0x15, 0x8b, 0x5e, 0xb5, 0xb9, 0xee, 0x3a, 0x0f, 0xac, 0xa0, 0xed, 0x69, 0xc1, 0xf7, 0x04, - 0x18, 0xf9, 0xcb, 0x39, 0x38, 0xc9, 0x7d, 0xf2, 0xee, 0xf4, 0x3a, 0xdb, 0xd4, 0xbf, 0x67, 0xb7, - 0x9d, 0x56, 0x1c, 0x31, 0x3c, 0x36, 0xc0, 0x57, 0x9a, 0xc9, 0x86, 0xe7, 0x17, 0x6d, 0xee, 0x23, - 0x68, 0xb9, 0x58, 0x69, 0x3d, 0x88, 0x6a, 0xd5, 0x8b, 0x76, 0x36, 0x3e, 0x59, 0x87, 0xc9, 0xba, - 0xe3, 0x62, 0x66, 0xd2, 0x38, 0x8a, 0xc5, 0x2b, 0xdc, 0xc5, 0x96, 0x2d, 0xe1, 0xe6, 0x1e, 0x1d, - 0xc0, 0xba, 0x55, 0x5c, 0xe3, 0x57, 0x72, 0xf0, 0xc2, 0xb1, 0x1f, 0x4c, 0x2e, 0xc3, 0xf8, 0xaa, - 0xba, 0xff, 0xb9, 0x25, 0x50, 0x3a, 0x7b, 0xa6, 0x84, 0x22, 0x5f, 0x85, 0x13, 0x2a, 0xa9, 0x4d, - 0xdf, 0x76, 0x54, 0x6f, 0xe2, 0x8c, 0x01, 0x08, 0x19, 0x48, 0x52, 0x6c, 0xcd, 0x26, 0x62, 0xfc, - 0x3f, 0x39, 0x98, 0x88, 0xdc, 0x91, 0x9e, 0xd2, 0xeb, 0xcc, 0x35, 0xed, 0x3a, 0x23, 0x53, 0x2f, - 0x44, 0xbd, 0xe2, 0xa6, 0x47, 0x19, 0x57, 0xd0, 0x19, 0xc5, 0x79, 0x0b, 0x0b, 0x7e, 0x34, 0x0f, - 0x93, 0x8c, 0x55, 0xf3, 0x37, 0xed, 0x4f, 0x57, 0x00, 0xfa, 0xa8, 0x5f, 0x43, 0x85, 0x08, 0xff, - 0xb7, 0x39, 0x7c, 0xeb, 0x50, 0x31, 0xd8, 0x68, 0xb0, 0x22, 0x75, 0x34, 0xd8, 0x89, 0x6a, 0x62, - 0x29, 0x0f, 0x98, 0xbc, 0x21, 0x46, 0x42, 0x04, 0x4c, 0x6e, 0x9b, 0xac, 0x8c, 0x7c, 0x11, 0x46, - 0xb7, 0x50, 0x73, 0xab, 0x47, 0xd4, 0x8b, 0xe8, 0x63, 0x25, 0xe7, 0xf7, 0xbd, 0x40, 0x8f, 0xa6, - 0xcd, 0x11, 0x49, 0x03, 0xc6, 0x57, 0x7c, 0x6a, 0x87, 0xb4, 0x25, 0x06, 0x64, 0xa8, 0x78, 0x50, - 0x4d, 0x8e, 0x92, 0x8c, 0x07, 0x25, 0x28, 0x31, 0x3e, 0x46, 0xe2, 0x3e, 0xa2, 0xd5, 0x4e, 0xf0, - 0xd4, 0x4e, 0xfa, 0x7b, 0xda, 0xa4, 0x9f, 0x49, 0x4d, 0x3a, 0xef, 0xde, 0x50, 0x73, 0xff, 0x9b, - 0x39, 0x38, 0x99, 0x8d, 0x48, 0x5e, 0x84, 0xb1, 0xbb, 0x9b, 0xf5, 0xd8, 0x52, 0x0e, 0xbb, 0xe2, - 0x75, 0x51, 0x6d, 0x62, 0x8a, 0x2a, 0x72, 0x11, 0xc6, 0xde, 0x37, 0x57, 0x62, 0x83, 0x30, 0x64, - 0x70, 0xdf, 0x60, 0x92, 0x97, 0x76, 0xaa, 0x09, 0x20, 0x75, 0x6e, 0x0b, 0x4f, 0x6c, 0x6e, 0x7f, - 0x2a, 0x0f, 0x33, 0xd5, 0x66, 0x93, 0x06, 0x81, 0x48, 0xf8, 0xf5, 0xd4, 0x4e, 0x6c, 0x76, 0xb8, - 0x45, 0xad, 0x6f, 0x43, 0xcd, 0xea, 0x6f, 0xe5, 0x78, 0xf0, 0x54, 0x86, 0xf5, 0xc0, 0xa1, 0x0f, - 0x37, 0xf7, 0x7c, 0x1a, 0xec, 0x79, 0xed, 0xd6, 0xd0, 0x09, 0x67, 0x99, 0xcc, 0x88, 0x49, 0xb1, - 0x54, 0x03, 0x87, 0x1d, 0x2c, 0xd1, 0x64, 0x46, 0x9e, 0x38, 0xeb, 0x32, 0x8c, 0x57, 0xbb, 0x5d, - 0xdf, 0x7b, 0xc0, 0xb7, 0xbd, 0x88, 0x97, 0x6f, 0xf3, 0x22, 0x2d, 0x02, 0x16, 0x2f, 0x62, 0x9f, - 0x51, 0xa3, 0xee, 0x81, 0x6a, 0x9e, 0xd6, 0xa2, 0xae, 0x7a, 0x29, 0xc1, 0x7a, 0xa3, 0x01, 0xa4, - 0xee, 0x7b, 0x1d, 0x2f, 0xa4, 0x2d, 0xde, 0x1f, 0x0c, 0x1c, 0x76, 0x6c, 0xac, 0xe1, 0x4d, 0x27, - 0x6c, 0x6b, 0xb1, 0x86, 0x43, 0x56, 0x60, 0xf2, 0x72, 0x76, 0x76, 0x9f, 0xd1, 0xc6, 0xb4, 0xe6, - 0x1f, 0x98, 0x3d, 0x77, 0xd5, 0xf5, 0x9d, 0xe6, 0x1e, 0xfa, 0xb8, 0xde, 0x01, 0x30, 0xa9, 0x1d, - 0x78, 0xae, 0x22, 0xac, 0x5d, 0xe2, 0xe9, 0x76, 0x59, 0x69, 0x5a, 0xef, 0x30, 0x2b, 0x28, 0xc5, - 0x58, 0xa6, 0x42, 0x81, 0x54, 0x61, 0x8a, 0xff, 0x62, 0x9d, 0xe9, 0x46, 0x82, 0xf8, 0xb3, 0xdc, - 0xe3, 0x14, 0x49, 0x76, 0xb1, 0x46, 0x8f, 0x46, 0xa1, 0x60, 0x18, 0xff, 0xe7, 0x28, 0x94, 0xd4, - 0x29, 0x25, 0x06, 0xcf, 0x1d, 0xe9, 0xf9, 0x6a, 0xfc, 0x3e, 0x1b, 0x4b, 0x4c, 0x51, 0x13, 0x07, - 0xbf, 0xcc, 0x1f, 0x1b, 0xfc, 0xf2, 0x3e, 0x4c, 0xd5, 0x7d, 0x0f, 0xb3, 0x11, 0xe0, 0x6b, 0xb3, - 0xe0, 0xdf, 0x73, 0x8a, 0xd6, 0x80, 0xad, 0x3e, 0x7c, 0xcf, 0xc6, 0x7b, 0x59, 0x57, 0x40, 0x5b, - 0x4c, 0xf4, 0xd5, 0x74, 0x66, 0x1a, 0x1d, 0x6e, 0x2a, 0xc3, 0x7a, 0xa2, 0xe6, 0xd8, 0xe1, 0x9d, - 0xd6, 0x4d, 0x65, 0x58, 0x89, 0xca, 0x20, 0x46, 0x9f, 0x14, 0x83, 0x20, 0x3f, 0x97, 0x83, 0xc9, - 0xaa, 0xeb, 0x8a, 0xa0, 0x9a, 0xc7, 0x84, 0x00, 0xfb, 0xaa, 0xb0, 0x96, 0x79, 0xeb, 0x23, 0x59, - 0xcb, 0xa0, 0xb0, 0x15, 0xa0, 0xa4, 0x1e, 0x37, 0xa8, 0x05, 0xc6, 0x89, 0x8b, 0xc9, 0x5b, 0x50, - 0x8e, 0x76, 0xe6, 0xba, 0xdb, 0xa2, 0x8f, 0x68, 0xb0, 0x30, 0x7e, 0xb6, 0x70, 0x7e, 0x4a, 0xa4, - 0x38, 0x52, 0x25, 0xf3, 0x24, 0x20, 0xd9, 0x04, 0xb0, 0xa3, 0x2d, 0x21, 0x1e, 0xf1, 0x4e, 0xc7, - 0x0f, 0x2e, 0x89, 0x3d, 0x23, 0x6e, 0x0f, 0xf8, 0x1b, 0x1f, 0x24, 0xd5, 0xdb, 0x43, 0x4c, 0x87, - 0x74, 0x60, 0xa6, 0x1a, 0x04, 0xbd, 0x0e, 0x6d, 0x84, 0xb6, 0x1f, 0x62, 0x1e, 0x43, 0x18, 0xde, - 0x0c, 0xd4, 0x46, 0x54, 0xb6, 0x22, 0xfc, 0xd0, 0xca, 0x48, 0x6a, 0x98, 0xa4, 0xcd, 0x13, 0x4a, - 0x99, 0xa7, 0xd2, 0xdf, 0xcb, 0x77, 0xea, 0x4f, 0xe5, 0xe0, 0xa4, 0xba, 0xe8, 0x1b, 0xbd, 0x6d, - 0x91, 0xc5, 0x81, 0x5c, 0x82, 0x09, 0xb1, 0x26, 0xa3, 0x4b, 0x64, 0x3a, 0x1d, 0x63, 0x0c, 0x42, - 0x56, 0xd9, 0x32, 0x64, 0x34, 0xc4, 0xad, 0x63, 0x2e, 0xc1, 0x5c, 0x59, 0xd5, 0xf2, 0x42, 0x9c, - 0x4f, 0x92, 0xfd, 0xd6, 0xd7, 0x27, 0x2b, 0x31, 0xde, 0x85, 0x59, 0x7d, 0x26, 0x1a, 0x34, 0x24, - 0x17, 0x60, 0x5c, 0x4e, 0x5f, 0x2e, 0x7b, 0xfa, 0x64, 0xbd, 0x71, 0x1f, 0x48, 0x0a, 0x3f, 0x40, - 0xb3, 0x36, 0x76, 0x3f, 0xe7, 0x66, 0x97, 0xf2, 0x51, 0x39, 0x05, 0xb8, 0x3c, 0x27, 0xbe, 0x6f, - 0x52, 0x73, 0x6c, 0xc4, 0x8c, 0x16, 0xbf, 0x55, 0x86, 0xb9, 0x8c, 0x83, 0xe2, 0x18, 0x41, 0xae, - 0xa2, 0x33, 0x88, 0x89, 0x28, 0x82, 0xa0, 0x64, 0x0b, 0xef, 0xc2, 0xe8, 0xb1, 0xec, 0x80, 0xbb, - 0xb5, 0x26, 0xb8, 0x00, 0x47, 0xfb, 0x44, 0x84, 0x39, 0x35, 0x62, 0xe8, 0xe8, 0x13, 0x8b, 0x18, - 0x8a, 0x21, 0x83, 0x14, 0x26, 0xae, 0x87, 0x31, 0xe2, 0xe9, 0x45, 0x53, 0x6c, 0x4b, 0x47, 0xe1, - 0x34, 0x02, 0xaf, 0xfd, 0x80, 0x0a, 0x1a, 0xe3, 0x2a, 0x0d, 0xac, 0xc8, 0xa4, 0xa1, 0xa0, 0x90, - 0x7f, 0x90, 0x03, 0x22, 0x4a, 0x54, 0x9e, 0x55, 0x1c, 0xc4, 0xb3, 0x5a, 0x4f, 0x86, 0x67, 0x9d, - 0x91, 0xdf, 0x98, 0xcd, 0xbb, 0x32, 0x3e, 0x8b, 0xfc, 0xbd, 0x1c, 0xcc, 0xf2, 0x48, 0x93, 0xea, - 0xc7, 0x0e, 0x8c, 0x1e, 0xd8, 0x7c, 0x32, 0x1f, 0xfb, 0x9c, 0x48, 0x2c, 0x9b, 0xfd, 0xad, 0xe9, - 0x8f, 0x22, 0xdf, 0x07, 0x10, 0xed, 0x28, 0x9e, 0xd5, 0x63, 0x72, 0xe9, 0xb9, 0x0c, 0x2e, 0x10, - 0x01, 0xc5, 0xd9, 0x14, 0xc3, 0x08, 0x4f, 0x65, 0x9b, 0x31, 0x35, 0xf2, 0x17, 0x79, 0x0c, 0xfe, - 0xa8, 0x44, 0x04, 0xd9, 0x5d, 0x98, 0xc4, 0x56, 0x3e, 0xdb, 0x5f, 0x90, 0xbb, 0x94, 0x85, 0xc6, - 0x73, 0xc0, 0x44, 0x46, 0xd6, 0x7e, 0xd8, 0x49, 0xc6, 0xe1, 0x4f, 0x62, 0x60, 0xec, 0x6a, 0xfc, - 0x7a, 0x9e, 0xf1, 0xb0, 0x0f, 0x7f, 0x3b, 0x2d, 0xf7, 0x02, 0xe7, 0x6f, 0x09, 0x67, 0x24, 0x2c, - 0x22, 0xef, 0x03, 0x89, 0x42, 0x34, 0xf2, 0x32, 0x2a, 0xb3, 0x21, 0xf2, 0xc7, 0x82, 0x38, 0xd4, - 0xa3, 0x2f, 0xab, 0xd5, 0x45, 0x92, 0x46, 0x26, 0x14, 0xe6, 0x45, 0xa7, 0x59, 0x29, 0x77, 0x20, - 0x5e, 0xaf, 0x05, 0x0b, 0xd3, 0x5a, 0x08, 0xe3, 0xb8, 0x66, 0xf9, 0x79, 0x99, 0x3c, 0x38, 0xf2, - 0x44, 0xd6, 0x5d, 0x7a, 0x33, 0xc9, 0x91, 0x6b, 0x30, 0x81, 0xa1, 0x46, 0xd6, 0xa4, 0xb1, 0x9e, - 0x30, 0x1c, 0xc2, 0xa0, 0x24, 0xd6, 0x9e, 0x6e, 0x72, 0x17, 0x83, 0xb2, 0x3b, 0x0c, 0x97, 0x00, - 0x51, 0xa5, 0x2f, 0x94, 0x34, 0x2d, 0xff, 0xc0, 0xf2, 0x7b, 0x7a, 0x18, 0x1b, 0x04, 0x22, 0x5f, - 0x87, 0xc9, 0xdb, 0xf6, 0xa3, 0x28, 0x49, 0xf1, 0xec, 0xf0, 0xa9, 0x90, 0x3b, 0xf6, 0xa3, 0x28, - 0x43, 0x71, 0xd2, 0x81, 0x49, 0x21, 0x49, 0x3e, 0x00, 0x50, 0xde, 0x19, 0xc8, 0xb1, 0x0d, 0xbc, - 0x20, 0x03, 0x73, 0x67, 0xbe, 0x3f, 0x20, 0x7d, 0x85, 0x60, 0x42, 0x72, 0x98, 0xff, 0xe4, 0x24, - 0x87, 0x13, 0x9f, 0x9c, 0xe4, 0xc0, 0x9f, 0xb9, 0xf8, 0xdc, 0x23, 0x07, 0x3f, 0x10, 0x5a, 0xfe, - 0x41, 0xad, 0x3d, 0x27, 0x4d, 0x41, 0xf1, 0x28, 0x38, 0x48, 0x34, 0x91, 0xa0, 0x47, 0x7c, 0x28, - 0x27, 0x2f, 0x06, 0x0b, 0xa7, 0x34, 0xcb, 0xc2, 0x81, 0x97, 0x08, 0xae, 0x6e, 0x15, 0xcb, 0xc8, - 0xa2, 0x51, 0xb9, 0x2a, 0xd4, 0x25, 0x71, 0x16, 0xb7, 0xe1, 0x74, 0x5f, 0x86, 0x90, 0x91, 0xc5, - 0xe6, 0xb2, 0x9e, 0xc5, 0xe6, 0x74, 0x3f, 0xc1, 0x21, 0xd0, 0x53, 0x79, 0xce, 0x95, 0xe7, 0xfb, - 0xcb, 0x5c, 0xdf, 0xcd, 0x27, 0x04, 0x09, 0x71, 0xc7, 0xe3, 0x89, 0xaf, 0xfb, 0x49, 0x5a, 0xf9, - 0xf5, 0x1a, 0xbb, 0xd4, 0xa1, 0xa8, 0xa1, 0x24, 0x1e, 0x63, 0xa2, 0x86, 0x2a, 0xaa, 0xa0, 0xd0, - 0xf1, 0x71, 0x65, 0x8a, 0xb7, 0x61, 0xba, 0x41, 0x6d, 0xbf, 0xb9, 0x77, 0x8b, 0x1e, 0x3c, 0xf4, - 0xfc, 0x16, 0x4f, 0x90, 0x2b, 0x6e, 0x16, 0x01, 0xd6, 0xe8, 0x21, 0x1b, 0x54, 0x58, 0x52, 0x93, - 0x31, 0x39, 0x46, 0xb1, 0xf5, 0xd3, 0x99, 0xbc, 0x99, 0x01, 0x0c, 0x0a, 0xd7, 0x41, 0xde, 0x88, - 0xc4, 0x4f, 0xea, 0xab, 0x09, 0x3d, 0x7d, 0x59, 0x98, 0x21, 0x85, 0x52, 0xdf, 0xf8, 0xbd, 0x02, - 0x10, 0xde, 0xd2, 0x8a, 0xdd, 0xb5, 0x31, 0x62, 0x8d, 0x83, 0x61, 0x69, 0xcb, 0x02, 0xc6, 0xde, - 0x6e, 0x53, 0x35, 0xa6, 0xb3, 0x30, 0xf9, 0x8e, 0xea, 0xac, 0xe4, 0xf5, 0x2d, 0x85, 0xd8, 0x87, - 0x81, 0xe7, 0x3f, 0x0e, 0x03, 0xff, 0x3a, 0x3c, 0x5b, 0xed, 0x76, 0xdb, 0x4e, 0x33, 0x6a, 0xe5, - 0xba, 0xe7, 0xcb, 0xed, 0xa2, 0xc5, 0x42, 0xb0, 0x23, 0xb0, 0xd4, 0x97, 0x0e, 0x22, 0xa1, 0x48, - 0x5f, 0xfc, 0xc2, 0xab, 0xc6, 0xd6, 0x92, 0xd2, 0x57, 0xd6, 0x15, 0x59, 0x41, 0x91, 0x34, 0x1c, - 0x5f, 0x4a, 0x5f, 0xa3, 0x71, 0xa6, 0x18, 0xf9, 0xc2, 0x9d, 0x2d, 0xc1, 0x45, 0x28, 0xe4, 0x6d, - 0x98, 0xac, 0xf6, 0x42, 0x4f, 0x10, 0x16, 0xbe, 0x0a, 0xb1, 0x57, 0x81, 0xf8, 0x14, 0xed, 0x42, - 0x17, 0x83, 0x1b, 0x7f, 0x50, 0x80, 0xd3, 0xe9, 0xe9, 0x15, 0xb5, 0xd1, 0xfe, 0xc8, 0x1d, 0xb3, - 0x3f, 0xb2, 0x56, 0x43, 0x3e, 0x4e, 0x65, 0xf8, 0x24, 0x56, 0x43, 0x01, 0xc9, 0x7d, 0xc4, 0xd5, - 0xd0, 0x80, 0x49, 0xf5, 0x14, 0x1f, 0xf9, 0xa8, 0xa7, 0xb8, 0x4a, 0x85, 0x5c, 0x80, 0x51, 0x1e, - 0x52, 0x6c, 0x34, 0x7e, 0x10, 0x4c, 0x46, 0x13, 0xe3, 0x10, 0xe4, 0xff, 0x07, 0x67, 0x39, 0x4f, - 0x4a, 0x76, 0x76, 0xf9, 0x40, 0x52, 0x14, 0x13, 0xb7, 0x74, 0x74, 0x58, 0xb9, 0xc4, 0xb5, 0x56, - 0x56, 0x6a, 0xd8, 0xac, 0xed, 0x03, 0x4b, 0x7e, 0x99, 0xd2, 0xc8, 0xb1, 0xb4, 0x8d, 0x47, 0x70, - 0x5a, 0xd4, 0xc6, 0xc1, 0x6c, 0x64, 0x25, 0x9b, 0xe4, 0xfd, 0x58, 0xf1, 0x88, 0x93, 0x9c, 0xd0, - 0x29, 0x62, 0x3d, 0xb9, 0x0a, 0xc5, 0x6a, 0x7d, 0x9d, 0x27, 0x57, 0x57, 0x42, 0x11, 0xd9, 0x5d, - 0x87, 0x47, 0x5d, 0xd1, 0xa2, 0x1b, 0x08, 0x40, 0xe3, 0xd7, 0x73, 0x00, 0xf1, 0xa0, 0x91, 0x8b, - 0x59, 0xee, 0x63, 0x3c, 0x1d, 0x15, 0x2f, 0xd6, 0x3d, 0xc7, 0xa4, 0x4e, 0x34, 0x9f, 0xa9, 0x13, - 0x95, 0x4a, 0xb5, 0x42, 0xa6, 0x52, 0xad, 0x06, 0x33, 0x8d, 0xde, 0xb6, 0x6c, 0x3b, 0x19, 0xfc, - 0x22, 0xe8, 0x6d, 0x67, 0x0d, 0x65, 0x12, 0xc5, 0xf8, 0xb1, 0x3c, 0x94, 0xea, 0xed, 0xde, 0xae, - 0xe3, 0xd6, 0xec, 0xd0, 0x7e, 0x6a, 0xd5, 0xb4, 0x6f, 0x6a, 0x6a, 0xda, 0xc8, 0x4b, 0x32, 0xea, - 0xd8, 0x50, 0x3a, 0xda, 0x9f, 0xcd, 0xc1, 0x4c, 0x8c, 0xc2, 0x4f, 0xf8, 0x35, 0x18, 0x61, 0x3f, - 0x84, 0x1e, 0xe0, 0x6c, 0x8a, 0x30, 0x42, 0x5d, 0x8a, 0xfe, 0x12, 0x8a, 0x53, 0x3d, 0xb3, 0x38, - 0x52, 0x58, 0xfc, 0x1c, 0x4c, 0xc4, 0x64, 0xd3, 0x82, 0xc3, 0xbc, 0x2a, 0x38, 0x4c, 0xa8, 0x79, - 0xee, 0x7e, 0x35, 0x07, 0xe5, 0x64, 0x4f, 0xc8, 0x2d, 0x18, 0x67, 0x94, 0x1c, 0x2a, 0x55, 0x14, - 0x2f, 0xf5, 0xe9, 0xf3, 0x25, 0x01, 0xc6, 0x3f, 0x0f, 0x07, 0x9f, 0xf2, 0x12, 0x53, 0x52, 0x58, - 0x34, 0xa1, 0xa4, 0x42, 0x65, 0x7c, 0xdd, 0xeb, 0xba, 0x58, 0x73, 0x32, 0x7b, 0x1c, 0xd4, 0xaf, - 0xfe, 0x1b, 0xda, 0x57, 0x0b, 0x89, 0xe5, 0x9c, 0xb6, 0xb8, 0x32, 0xb7, 0x22, 0x2e, 0x1a, 0x4c, - 0xb8, 0x27, 0xf8, 0x46, 0x5e, 0x0d, 0x05, 0x99, 0x5a, 0xd0, 0x11, 0x1c, 0x79, 0x1d, 0xc6, 0x78, - 0x7b, 0x6a, 0x9a, 0xf1, 0x2e, 0x96, 0xa8, 0x57, 0x06, 0x0e, 0x63, 0xfc, 0xcd, 0x02, 0x9c, 0x8c, - 0x3f, 0x6f, 0xab, 0xdb, 0xb2, 0x43, 0x5a, 0xb7, 0x7d, 0xbb, 0x13, 0x1c, 0xb3, 0x03, 0xce, 0xa7, - 0x3e, 0x4d, 0x84, 0x55, 0xe0, 0x65, 0xca, 0x07, 0x19, 0x89, 0x0f, 0x42, 0x75, 0x30, 0xff, 0x20, - 0xf9, 0x19, 0xe4, 0x16, 0x14, 0x1a, 0x34, 0x14, 0x0c, 0xfb, 0x5c, 0x6a, 0x54, 0xd5, 0xef, 0xba, - 0xd4, 0xa0, 0x21, 0x9f, 0x44, 0x1e, 0x64, 0x53, 0x0b, 0x60, 0xc0, 0xa8, 0x90, 0xfb, 0x30, 0xb6, - 0xfa, 0xa8, 0x4b, 0x9b, 0x21, 0x66, 0x56, 0x52, 0x3c, 0xf9, 0xb3, 0xe9, 0x71, 0x58, 0x4e, 0x72, - 0x5e, 0xc8, 0xe0, 0x7a, 0x36, 0x43, 0x41, 0x6e, 0xf1, 0x1a, 0x14, 0x65, 0xe3, 0x8f, 0xb3, 0x72, - 0x17, 0xdf, 0x84, 0x49, 0xa5, 0x91, 0xc7, 0x5a, 0xf4, 0xbf, 0xc0, 0xf8, 0xaa, 0xd7, 0xa6, 0x62, - 0xe1, 0xac, 0xa6, 0x04, 0x4c, 0x25, 0x47, 0x32, 0x17, 0x30, 0xad, 0x7d, 0x51, 0x35, 0x40, 0xd2, - 0x5c, 0x87, 0x99, 0xc6, 0xbe, 0xd3, 0x8d, 0x13, 0x71, 0x68, 0xc7, 0x38, 0xe6, 0x61, 0x15, 0x3a, - 0x8c, 0xe4, 0x31, 0x9e, 0xc4, 0x33, 0xfe, 0x24, 0x07, 0x63, 0xec, 0xaf, 0x7b, 0xd7, 0x9e, 0x52, - 0x96, 0x79, 0x55, 0x63, 0x99, 0xb3, 0x4a, 0x62, 0x2d, 0x64, 0x1c, 0xd7, 0x8e, 0x61, 0x96, 0x87, - 0x62, 0x82, 0x38, 0x30, 0xb9, 0x01, 0xe3, 0xc2, 0x36, 0x4e, 0xb8, 0x31, 0xa8, 0x99, 0xba, 0xa4, - 0xd5, 0x5c, 0xa4, 0xec, 0xf0, 0xba, 0x49, 0xed, 0x90, 0xc4, 0x66, 0x97, 0x01, 0x99, 0x12, 0x45, - 0x4d, 0x03, 0xca, 0xc8, 0xac, 0x78, 0x2e, 0xcf, 0x33, 0x15, 0x2c, 0x9f, 0x12, 0x94, 0xfa, 0x05, - 0x2a, 0xaa, 0x8a, 0xd7, 0xac, 0xc2, 0x20, 0x22, 0x27, 0x05, 0x91, 0xec, 0x87, 0xae, 0x0e, 0x9c, - 0x6c, 0x34, 0xd6, 0xd0, 0x8e, 0xb6, 0xee, 0xf9, 0xe1, 0x75, 0xcf, 0x7f, 0x28, 0xe2, 0xb1, 0x34, - 0x74, 0x1b, 0x92, 0x2c, 0xeb, 0xc6, 0x57, 0x32, 0xad, 0x1b, 0x07, 0xd8, 0x99, 0x18, 0x2e, 0x9c, - 0x6a, 0x34, 0xd6, 0x78, 0x96, 0xa7, 0x3f, 0x8d, 0xf6, 0x7e, 0x35, 0x07, 0xb3, 0x8d, 0xc6, 0x5a, - 0xa2, 0xa9, 0x0d, 0x99, 0x5e, 0x2a, 0xa7, 0x3d, 0x64, 0x67, 0x0f, 0x04, 0xce, 0x42, 0x8e, 0x8b, - 0x85, 0x4d, 0x2d, 0x48, 0x38, 0x27, 0x42, 0xea, 0x51, 0x42, 0xab, 0xbc, 0xe6, 0xda, 0xd2, 0xa7, - 0xa3, 0xa8, 0xec, 0x17, 0x8e, 0xa1, 0xac, 0x56, 0x57, 0xf6, 0xb3, 0x12, 0xe3, 0x5f, 0x9c, 0xe4, - 0x29, 0xb3, 0xe4, 0x6a, 0x79, 0x07, 0x4a, 0x02, 0x1f, 0xfd, 0x3f, 0x84, 0x4d, 0xcf, 0x69, 0xc6, - 0x20, 0x77, 0x78, 0x39, 0xcf, 0x7e, 0xf2, 0xbd, 0xc3, 0xca, 0x08, 0x1b, 0x1a, 0x53, 0x03, 0x27, - 0x77, 0x61, 0xea, 0xb6, 0xfd, 0x48, 0xd1, 0xec, 0x70, 0xef, 0xbe, 0x0b, 0x8c, 0xab, 0x74, 0xec, - 0x47, 0x43, 0x58, 0x8f, 0xea, 0xf8, 0x64, 0x1f, 0xa6, 0xf5, 0x3e, 0x89, 0x15, 0x98, 0x9e, 0xb1, - 0x2b, 0x99, 0x33, 0x76, 0xba, 0xeb, 0xf9, 0xa1, 0xb5, 0x13, 0xa1, 0x6b, 0xe9, 0xe1, 0x12, 0xa4, - 0xc9, 0x3b, 0x30, 0xab, 0x84, 0x62, 0xbf, 0xee, 0xf9, 0x1d, 0x5b, 0xde, 0xd2, 0xf0, 0xb9, 0x03, - 0xcd, 0xca, 0x76, 0xb0, 0xd8, 0x4c, 0x43, 0x92, 0xaf, 0x64, 0x79, 0x4c, 0x8e, 0xc6, 0x26, 0xb4, - 0x19, 0x1e, 0x93, 0xfd, 0x4c, 0x68, 0xd3, 0xbe, 0x93, 0xbb, 0x83, 0x4c, 0xec, 0x8b, 0xbc, 0xf7, - 0x43, 0x99, 0xd0, 0x47, 0x33, 0xd7, 0xc7, 0x94, 0x7e, 0x09, 0x0a, 0xcb, 0xf5, 0xeb, 0xf8, 0x48, - 0x27, 0xed, 0xe9, 0xdc, 0x3d, 0xdb, 0x6d, 0xe2, 0xed, 0x49, 0x38, 0xb6, 0xa8, 0x07, 0xe5, 0x72, - 0xfd, 0x3a, 0xb1, 0x61, 0x0e, 0xb3, 0x8f, 0x87, 0x5f, 0xba, 0x72, 0x45, 0x99, 0xaa, 0x22, 0x7e, - 0xda, 0x65, 0xf1, 0x69, 0x15, 0xcc, 0x5d, 0x1e, 0x5a, 0x8f, 0xae, 0x5c, 0xc9, 0x9c, 0x90, 0xe8, - 0xc3, 0xb2, 0x68, 0xb1, 0x03, 0xeb, 0xb6, 0xfd, 0x28, 0xf6, 0x47, 0x0a, 0x84, 0xef, 0xf9, 0x19, - 0xb9, 0xb4, 0x62, 0x5f, 0x26, 0xed, 0xc0, 0xd2, 0x91, 0xd8, 0xe5, 0x37, 0x5e, 0x60, 0x81, 0xf0, - 0xda, 0x5b, 0x94, 0x9a, 0x4b, 0x19, 0xa0, 0x40, 0xbd, 0xc1, 0x29, 0xe0, 0x64, 0x2b, 0xba, 0xc2, - 0xf3, 0x2b, 0x30, 0x1a, 0xba, 0x4f, 0x2c, 0x5f, 0x56, 0xaf, 0xf0, 0x5c, 0x5f, 0xa8, 0x75, 0x6b, - 0x26, 0xd2, 0xfb, 0x70, 0x07, 0x2d, 0x53, 0xa7, 0x92, 0xd6, 0x0c, 0x94, 0x1e, 0x5f, 0x33, 0x40, - 0x61, 0x64, 0xc3, 0x6b, 0xee, 0x8b, 0x48, 0xc7, 0xef, 0x33, 0x2e, 0xdc, 0xf6, 0x9a, 0xfb, 0x4f, - 0xce, 0x75, 0x00, 0xc9, 0x93, 0x3b, 0x3c, 0xfa, 0x8e, 0xdf, 0x12, 0x63, 0x22, 0xcc, 0xd1, 0xe7, - 0xa3, 0xab, 0xb1, 0x52, 0x17, 0xc7, 0xe4, 0xf1, 0x5b, 0x72, 0x68, 0x4d, 0x1d, 0x9d, 0x50, 0x28, - 0xd7, 0x68, 0xb0, 0x1f, 0x7a, 0xdd, 0x95, 0xb6, 0xd3, 0xc5, 0x80, 0x56, 0x22, 0x55, 0xce, 0xd0, - 0x3c, 0xb9, 0xc5, 0xf1, 0xad, 0xa6, 0x24, 0x60, 0xa6, 0x48, 0x92, 0xaf, 0xc0, 0x34, 0x5b, 0xdc, - 0xab, 0x8f, 0x42, 0xea, 0xf2, 0x99, 0x9f, 0x45, 0x89, 0x6e, 0x5e, 0x49, 0x34, 0x19, 0x55, 0xf2, - 0x35, 0x85, 0x9b, 0x9d, 0x46, 0x08, 0x5a, 0x94, 0x68, 0x8d, 0x14, 0x69, 0xc1, 0xc2, 0x6d, 0xfb, - 0x51, 0x7c, 0x51, 0x56, 0x17, 0x29, 0xc1, 0x05, 0x76, 0xfe, 0xe8, 0xb0, 0xf2, 0x12, 0x5b, 0x60, - 0x71, 0xf6, 0xa6, 0x3e, 0xeb, 0xb5, 0x2f, 0x25, 0xf2, 0x4d, 0x38, 0x25, 0xba, 0x55, 0xc3, 0x84, - 0xd8, 0x9e, 0x7f, 0xd0, 0xd8, 0xb3, 0xd1, 0x15, 0x71, 0xae, 0xcf, 0x80, 0x5d, 0xce, 0x66, 0x89, - 0x72, 0xc0, 0x5a, 0x92, 0x8e, 0x15, 0x70, 0x42, 0x66, 0xbf, 0x16, 0xc8, 0x87, 0x30, 0xcd, 0x5f, - 0x26, 0x65, 0x3a, 0x6f, 0xa1, 0x53, 0x1f, 0xda, 0xbf, 0x86, 0x3f, 0x77, 0xc6, 0x39, 0xc2, 0xb5, - 0xe1, 0xd4, 0x28, 0x93, 0xb7, 0xd0, 0x84, 0x95, 0xc7, 0x71, 0x5f, 0xaf, 0xa3, 0x86, 0x5d, 0x9c, - 0x40, 0x5d, 0xc7, 0xb5, 0xa4, 0x9a, 0xa5, 0x1b, 0xb1, 0x0b, 0x15, 0x9a, 0xdc, 0x87, 0xc9, 0x46, - 0x63, 0xed, 0xba, 0xc3, 0xe4, 0x92, 0xae, 0x54, 0x98, 0xa7, 0xbf, 0xf2, 0xc5, 0xcc, 0xaf, 0x9c, - 0x0a, 0x82, 0x3d, 0x0b, 0x73, 0x36, 0x37, 0xbd, 0xee, 0x81, 0xa9, 0x52, 0xca, 0xf0, 0x39, 0x39, - 0xf5, 0x84, 0x7d, 0x4e, 0xd6, 0x61, 0x46, 0xb1, 0xa3, 0x46, 0xb3, 0x9c, 0x85, 0x38, 0xf8, 0xa7, - 0xea, 0x63, 0x92, 0xf4, 0xb2, 0x4e, 0xe2, 0x49, 0x67, 0x93, 0xd3, 0x8f, 0xeb, 0x6c, 0xe2, 0xc0, - 0x2c, 0x9f, 0x0c, 0xb1, 0x0e, 0x70, 0xa6, 0x17, 0xfb, 0x8c, 0xe1, 0x85, 0xcc, 0x31, 0x9c, 0x13, - 0x33, 0x2d, 0x17, 0x19, 0xbe, 0xc4, 0xa7, 0xa9, 0x92, 0x1d, 0x20, 0xa2, 0xd0, 0x0e, 0xed, 0x6d, - 0x3b, 0xa0, 0xd8, 0xd6, 0xb3, 0x7d, 0xda, 0x7a, 0x29, 0xb3, 0xad, 0x69, 0xd9, 0xd6, 0x36, 0x6f, - 0x26, 0x83, 0x22, 0x71, 0x65, 0x3b, 0x72, 0x7d, 0xe1, 0xc0, 0x3e, 0xa7, 0x29, 0xc6, 0xd3, 0x00, - 0x3c, 0x8e, 0x66, 0x72, 0xd1, 0x26, 0xc7, 0x3d, 0x83, 0x32, 0x79, 0x04, 0x27, 0xd3, 0x5f, 0x81, - 0x6d, 0x9e, 0xc1, 0x36, 0xcf, 0x68, 0x6d, 0x26, 0x81, 0xf8, 0xba, 0xd1, 0xbb, 0x95, 0x6c, 0xb5, - 0x0f, 0x7d, 0xf2, 0x23, 0x39, 0x38, 0x75, 0xfb, 0x7a, 0xf5, 0x1e, 0xf5, 0xb9, 0x58, 0xe2, 0x78, - 0x6e, 0xe4, 0x9d, 0xfe, 0xbc, 0x78, 0x3c, 0x49, 0x3e, 0x1c, 0x49, 0x89, 0x03, 0x59, 0x05, 0x13, - 0xdd, 0x5f, 0xec, 0xec, 0xd8, 0xd6, 0x03, 0x85, 0x44, 0x86, 0x0b, 0xfb, 0xb7, 0x7f, 0xbf, 0x92, - 0x33, 0xfb, 0x35, 0x45, 0xda, 0xb0, 0xa8, 0x0f, 0x8b, 0x74, 0x07, 0xda, 0xa3, 0xed, 0xf6, 0x42, - 0x05, 0x57, 0xf4, 0xeb, 0x47, 0x87, 0x95, 0xf3, 0xa9, 0xd1, 0x8d, 0x5c, 0x8c, 0x18, 0xa4, 0xd2, - 0xe1, 0x01, 0xf4, 0x48, 0x27, 0x43, 0xe8, 0x5e, 0x38, 0xab, 0x85, 0xb1, 0x4a, 0xd5, 0x47, 0x61, - 0xd6, 0xce, 0xb0, 0xfd, 0xde, 0x57, 0x40, 0x34, 0xd3, 0x94, 0x6f, 0x8e, 0x14, 0xa7, 0xca, 0xd3, - 0x19, 0x7e, 0x32, 0xc6, 0x77, 0xf2, 0x89, 0x83, 0x91, 0xac, 0xc3, 0xb8, 0x58, 0xef, 0x7d, 0x2f, - 0x19, 0x67, 0x32, 0x57, 0xf5, 0xb8, 0xd8, 0x3a, 0xa6, 0xc4, 0x27, 0x0f, 0x19, 0x29, 0xec, 0xb4, - 0xb8, 0xf1, 0x7e, 0xc0, 0xcf, 0x3d, 0x2c, 0xd2, 0x4e, 0xf8, 0xda, 0xe3, 0xfb, 0x94, 0xea, 0x2e, - 0xcb, 0x78, 0xd4, 0xcb, 0xd6, 0xc8, 0x3e, 0xcf, 0xfb, 0x5b, 0x88, 0xdc, 0x12, 0xf5, 0x24, 0xbf, - 0x4f, 0xac, 0x41, 0xd6, 0x8a, 0xf1, 0x1b, 0x39, 0x98, 0xd2, 0x4e, 0x56, 0x72, 0x4d, 0xf1, 0xba, - 0x8d, 0x03, 0x51, 0x68, 0x30, 0xc8, 0x6c, 0x93, 0xfe, 0xb8, 0xd7, 0x94, 0x00, 0x8e, 0x7d, 0xf0, - 0x70, 0xb3, 0x25, 0x9d, 0xb0, 0x07, 0xeb, 0x87, 0x2b, 0x30, 0xca, 0x23, 0xf8, 0x8c, 0xc4, 0x46, - 0x97, 0xa8, 0x5f, 0x31, 0x79, 0xb9, 0xf1, 0x1f, 0x57, 0x60, 0x5a, 0xbf, 0x11, 0x93, 0xd7, 0x61, - 0x0c, 0x15, 0xfa, 0x52, 0xbd, 0x82, 0x6a, 0x21, 0xd4, 0xf9, 0x6b, 0x7e, 0x49, 0x1c, 0x86, 0xbc, - 0x0c, 0x10, 0x19, 0xf0, 0xcb, 0xe7, 0xac, 0xd1, 0xa3, 0xc3, 0x4a, 0xee, 0xa2, 0xa9, 0x54, 0x90, - 0xaf, 0x01, 0xdc, 0xf1, 0x5a, 0x54, 0xa4, 0xb1, 0x2c, 0x0c, 0x32, 0x44, 0x79, 0x25, 0x95, 0xc6, - 0xf2, 0x84, 0xeb, 0xb5, 0x68, 0x3a, 0x67, 0xa5, 0x42, 0x91, 0x7c, 0x01, 0x46, 0xcd, 0x5e, 0x9b, - 0xca, 0x67, 0x8f, 0x49, 0x79, 0xc2, 0xf5, 0xda, 0x34, 0xd6, 0x13, 0xf8, 0xbd, 0xa4, 0x8d, 0x25, - 0x2b, 0x20, 0xef, 0xf1, 0xf4, 0x96, 0x22, 0xe0, 0xfa, 0x68, 0xfc, 0xc0, 0xa7, 0x48, 0x3e, 0xa9, - 0x90, 0xeb, 0x0a, 0x0a, 0xb9, 0x0b, 0xe3, 0xea, 0xcb, 0x94, 0x12, 0xbe, 0x41, 0x7d, 0xbd, 0x54, - 0x94, 0x0e, 0x22, 0xf2, 0x6c, 0xf2, 0xd1, 0x4a, 0x52, 0x21, 0x6f, 0xc3, 0x04, 0x23, 0xcf, 0x38, - 0x47, 0x20, 0x6e, 0x35, 0xf8, 0x8c, 0xa7, 0x7c, 0x10, 0xe3, 0x3e, 0x5a, 0x58, 0xf4, 0x08, 0x81, - 0x7c, 0x05, 0x26, 0xaa, 0xdd, 0xae, 0x18, 0xea, 0x81, 0x06, 0x4a, 0xe7, 0x52, 0x43, 0x3d, 0x6f, - 0x77, 0xbb, 0xe9, 0x91, 0x8e, 0xe9, 0x91, 0xdd, 0x28, 0x7a, 0xe0, 0x30, 0x29, 0x49, 0x5f, 0x4d, - 0x35, 0xb0, 0x20, 0x03, 0xe2, 0xa5, 0x1a, 0xd1, 0xe9, 0x92, 0x2e, 0x94, 0x63, 0xa1, 0x52, 0xb4, - 0x05, 0x83, 0xda, 0xba, 0x98, 0x6a, 0x4b, 0x9d, 0xc0, 0x54, 0x73, 0x29, 0xea, 0xa4, 0x05, 0xd3, - 0xf2, 0x80, 0x12, 0xed, 0x4d, 0x0e, 0x6a, 0xef, 0xe5, 0x54, 0x7b, 0x73, 0xad, 0xed, 0x74, 0x3b, - 0x09, 0x9a, 0xe4, 0x6d, 0x98, 0x92, 0x25, 0xb8, 0x3f, 0xd0, 0x30, 0x48, 0x28, 0x04, 0x5b, 0xdb, - 0xe8, 0x32, 0xa4, 0x8d, 0x8a, 0x06, 0xac, 0x62, 0xf3, 0xd5, 0x31, 0xa5, 0x61, 0x27, 0x57, 0x85, - 0x0e, 0x4c, 0xbe, 0x0c, 0x93, 0xeb, 0x1d, 0xd6, 0x11, 0xcf, 0xb5, 0x43, 0x2a, 0x1c, 0x7b, 0xa5, - 0xb1, 0x95, 0x52, 0xa3, 0x2c, 0x55, 0x34, 0x33, 0x71, 0xe2, 0x2a, 0xf5, 0x9a, 0xa9, 0x60, 0xb0, - 0xc1, 0xe3, 0x4f, 0x91, 0x62, 0x0d, 0x4b, 0xa7, 0xdf, 0x33, 0x19, 0x06, 0x4f, 0x0a, 0x79, 0x11, - 0x5c, 0x9b, 0x95, 0xca, 0xa7, 0xc0, 0x44, 0x62, 0x03, 0x95, 0x26, 0x79, 0x07, 0x26, 0x45, 0xb6, - 0xe6, 0xaa, 0x79, 0x27, 0x58, 0x28, 0xc7, 0xf6, 0xda, 0x32, 0xb1, 0xb3, 0x65, 0xfb, 0x09, 0xcb, - 0xde, 0x18, 0x9e, 0x7c, 0x09, 0xe6, 0xef, 0x3b, 0x6e, 0xcb, 0x7b, 0x18, 0x88, 0x63, 0x4a, 0x30, - 0xba, 0xd9, 0xd8, 0xaf, 0xf0, 0x21, 0xaf, 0x8f, 0x64, 0xc1, 0x14, 0xe3, 0xcb, 0xa4, 0x40, 0x7e, - 0x20, 0x45, 0x99, 0xaf, 0x20, 0x32, 0x68, 0x05, 0x2d, 0xa5, 0x56, 0x50, 0xba, 0xf9, 0xe4, 0x72, - 0xca, 0x6c, 0x86, 0x78, 0x40, 0xf4, 0xf3, 0xfd, 0xa6, 0xe7, 0xb8, 0x0b, 0x73, 0xc8, 0x0b, 0x9f, - 0x4d, 0x86, 0x07, 0x41, 0xb8, 0xba, 0xd7, 0x76, 0x9a, 0x07, 0xcb, 0xc6, 0xd1, 0x61, 0xe5, 0xf9, - 0xa4, 0xcc, 0xff, 0xa1, 0xa7, 0x3d, 0x97, 0x64, 0x90, 0x26, 0x5f, 0x86, 0x12, 0xfb, 0x3f, 0x52, - 0x4a, 0xcc, 0x6b, 0x26, 0xb2, 0x0a, 0xa4, 0x68, 0x07, 0xe7, 0x08, 0xd3, 0x49, 0x67, 0xe8, 0x2b, - 0x34, 0x52, 0xe4, 0x4d, 0x00, 0x26, 0x36, 0x09, 0x76, 0x7c, 0x22, 0xce, 0x23, 0x81, 0x52, 0x57, - 0x9a, 0x11, 0xc7, 0xc0, 0xe4, 0x6d, 0x98, 0x64, 0xbf, 0x1a, 0xbd, 0x96, 0xc7, 0xf6, 0xc6, 0x49, - 0xc4, 0xe5, 0x3e, 0xd6, 0x0c, 0x37, 0xe0, 0xe5, 0x9a, 0x8f, 0x75, 0x0c, 0x4e, 0xd6, 0x60, 0x06, - 0xf3, 0x7d, 0x88, 0x48, 0xf3, 0x0e, 0x0d, 0x16, 0x4e, 0x29, 0x26, 0x14, 0x98, 0x52, 0xd5, 0x89, - 0xea, 0xd4, 0xbb, 0x4c, 0x02, 0x8d, 0x04, 0x30, 0x97, 0x7e, 0x83, 0x0e, 0x16, 0x16, 0x70, 0x90, - 0xa4, 0x04, 0x9f, 0x86, 0xe0, 0xfc, 0x98, 0xcd, 0x88, 0xc2, 0xb8, 0xe4, 0xa3, 0x92, 0xda, 0x60, - 0x16, 0x75, 0x62, 0x02, 0xb9, 0xb1, 0x52, 0x4f, 0x26, 0xc4, 0x38, 0x8d, 0x3d, 0xc0, 0x69, 0xde, - 0x6d, 0x76, 0xad, 0x01, 0x49, 0x31, 0x32, 0xb0, 0xc9, 0xf7, 0xc3, 0x09, 0xc9, 0x41, 0x44, 0x95, - 0x58, 0xd7, 0x8b, 0x8f, 0xc9, 0x89, 0x5b, 0xdb, 0x51, 0xd3, 0xa9, 0x25, 0x9d, 0xdd, 0x04, 0xb1, - 0x61, 0x12, 0xa7, 0x55, 0xb4, 0xf8, 0xec, 0xa0, 0x16, 0xcf, 0xa7, 0x5a, 0x3c, 0x89, 0x0b, 0x25, - 0xdd, 0x98, 0x4a, 0x93, 0x2c, 0xc3, 0x94, 0xd8, 0x47, 0x62, 0xb5, 0x3d, 0x87, 0xa3, 0x85, 0x4a, - 0x2c, 0xb9, 0x03, 0x53, 0x0b, 0x4e, 0x47, 0x51, 0x39, 0x32, 0x7f, 0x4c, 0x3a, 0xa3, 0x71, 0xe4, - 0xe4, 0x1b, 0x92, 0x0e, 0xcc, 0x38, 0x52, 0x2c, 0xc5, 0xac, 0x3e, 0xea, 0xfa, 0x42, 0x45, 0xf5, - 0x7c, 0x9c, 0x9d, 0x52, 0x11, 0x7e, 0x2c, 0x1a, 0x41, 0xa8, 0x2c, 0x21, 0x8b, 0x02, 0xd9, 0x82, - 0xb9, 0xe8, 0xd4, 0x56, 0x08, 0x57, 0xe2, 0x94, 0x0b, 0xf1, 0x51, 0x9f, 0x4d, 0x37, 0x0b, 0x9f, - 0xd8, 0x70, 0x4a, 0x3b, 0xa7, 0x15, 0xd2, 0x67, 0x91, 0xf4, 0x2b, 0xec, 0x46, 0xa6, 0x1f, 0xf2, - 0xd9, 0xe4, 0xfb, 0xd1, 0x21, 0x1f, 0xc2, 0x62, 0xf2, 0x6c, 0x56, 0x5a, 0x79, 0x01, 0x5b, 0x79, - 0xf5, 0xe8, 0xb0, 0x72, 0x2e, 0x75, 0xbc, 0x67, 0x37, 0x34, 0x80, 0x1a, 0xf9, 0x1a, 0x2c, 0xe8, - 0xe7, 0xb3, 0xd2, 0x92, 0x81, 0x2d, 0xe1, 0xd6, 0x89, 0x0e, 0xf6, 0xec, 0x16, 0xfa, 0xd2, 0x20, - 0x21, 0x54, 0x32, 0x57, 0xb7, 0xd2, 0xcc, 0x8b, 0x71, 0x87, 0x52, 0xbb, 0x24, 0xbb, 0xb9, 0xe3, - 0x48, 0x92, 0x87, 0xf0, 0x7c, 0xd6, 0x31, 0xa1, 0x34, 0xfa, 0x52, 0xa4, 0x04, 0x7e, 0x2d, 0xfb, - 0xc8, 0xc9, 0x6e, 0xf9, 0x18, 0xb2, 0xe4, 0x2b, 0x70, 0x42, 0xd9, 0x5f, 0x4a, 0x7b, 0x2f, 0x63, - 0x7b, 0x18, 0x15, 0x40, 0xdd, 0x98, 0xd9, 0xad, 0x64, 0xd3, 0x20, 0x1d, 0x98, 0x93, 0x1d, 0x47, - 0x6d, 0xbb, 0x38, 0x7a, 0xce, 0x69, 0x5c, 0x35, 0x0d, 0xb1, 0x7c, 0x56, 0x70, 0xd5, 0x85, 0xd6, - 0xb6, 0xd5, 0x8d, 0x11, 0xd5, 0x95, 0x9e, 0x41, 0x97, 0xac, 0xc1, 0x58, 0xa3, 0xbe, 0x7e, 0xfd, - 0xfa, 0xea, 0xc2, 0x2b, 0xd8, 0x82, 0xf4, 0xfb, 0xe3, 0x85, 0xda, 0xa5, 0x49, 0xd8, 0x38, 0x76, - 0x9d, 0x9d, 0x1d, 0xed, 0xc1, 0x8a, 0x83, 0x92, 0x1f, 0x40, 0xeb, 0x42, 0xc6, 0x51, 0xab, 0x41, - 0xe0, 0xec, 0xba, 0x3c, 0x99, 0xc5, 0xab, 0xda, 0x7b, 0xbf, 0x4c, 0x6f, 0xb2, 0x82, 0x89, 0x63, - 0x53, 0xe0, 0x5c, 0xda, 0x64, 0xf7, 0x7f, 0xc1, 0xb9, 0x2d, 0x3b, 0x26, 0xa5, 0x32, 0xf1, 0x74, - 0x43, 0x6c, 0xdc, 0x76, 0x9d, 0xd0, 0xda, 0xeb, 0x69, 0xdd, 0x5f, 0x78, 0x4d, 0x0b, 0x26, 0xce, - 0xd3, 0xe9, 0x2a, 0xa3, 0xf6, 0x92, 0x68, 0xf0, 0x39, 0x7e, 0x5b, 0xee, 0x33, 0x72, 0xb3, 0xbb, - 0x09, 0xbc, 0x80, 0xfc, 0x70, 0x0e, 0x4e, 0xde, 0xf7, 0xfc, 0xfd, 0xb6, 0x67, 0xb7, 0x64, 0xaf, - 0x04, 0x0f, 0x7f, 0x7d, 0x10, 0x0f, 0xff, 0x6c, 0x8a, 0x87, 0x1b, 0x0f, 0x05, 0x19, 0x2b, 0xca, - 0x0e, 0x93, 0xe2, 0xe7, 0x7d, 0x9a, 0x22, 0x3f, 0x00, 0x67, 0xb3, 0x6b, 0x94, 0x45, 0x79, 0x11, - 0x17, 0xe5, 0x95, 0xa3, 0xc3, 0xca, 0xc5, 0x7e, 0x2d, 0x65, 0x2f, 0xd0, 0x63, 0x49, 0xdf, 0x1c, - 0x29, 0x9e, 0x2f, 0x5f, 0xb8, 0x39, 0x52, 0xbc, 0x50, 0x7e, 0xd5, 0x7c, 0xae, 0x51, 0xbd, 0xbd, - 0xb1, 0xde, 0x92, 0x87, 0xab, 0x4c, 0x60, 0xc3, 0x71, 0xcc, 0x73, 0x83, 0x6a, 0x63, 0x8a, 0xc6, - 0x5f, 0xcb, 0x41, 0xe5, 0x98, 0x45, 0xc2, 0xce, 0xb3, 0x78, 0x26, 0x1a, 0x51, 0xd2, 0x04, 0xee, - 0x18, 0x18, 0x55, 0x58, 0xba, 0xd9, 0x88, 0x8e, 0x82, 0x4e, 0xa3, 0x22, 0xf7, 0x9a, 0xe2, 0x3b, - 0x9c, 0xce, 0xb9, 0x26, 0xa1, 0x8c, 0x0d, 0x28, 0x27, 0x17, 0x0f, 0xf9, 0x3c, 0x4c, 0xa9, 0x99, - 0x9f, 0xa4, 0x2a, 0x81, 0x47, 0xcc, 0xf1, 0x77, 0xb5, 0x03, 0x51, 0x03, 0x34, 0x7e, 0x21, 0x07, - 0x73, 0x19, 0x3b, 0x8c, 0x9c, 0x83, 0x11, 0x4c, 0xcd, 0xaa, 0x58, 0x0d, 0x25, 0x52, 0xb2, 0x62, - 0x3d, 0xf9, 0x0c, 0x8c, 0xd7, 0xee, 0x34, 0x1a, 0xd5, 0x3b, 0x52, 0x19, 0xc1, 0x0f, 0x62, 0x37, - 0xb0, 0x02, 0x5b, 0x37, 0x36, 0x10, 0x60, 0xe4, 0x22, 0x8c, 0xad, 0xd7, 0x11, 0x41, 0x49, 0x0b, - 0xe3, 0x74, 0x93, 0xf0, 0x02, 0xc8, 0xf8, 0x89, 0x1c, 0x90, 0x34, 0xbb, 0x20, 0x57, 0x60, 0x52, - 0x65, 0x4a, 0xbc, 0xbf, 0xf8, 0x02, 0xab, 0x6c, 0x1c, 0x53, 0x85, 0x21, 0x35, 0x18, 0xbd, 0x6d, - 0x87, 0xcd, 0xbd, 0xc8, 0xca, 0x21, 0x73, 0x5b, 0x9c, 0x4a, 0x6d, 0x8b, 0xd1, 0x0e, 0xc3, 0x32, - 0x39, 0xb2, 0xf1, 0xc7, 0x39, 0x20, 0xd9, 0x06, 0x8f, 0x43, 0x59, 0x59, 0xbd, 0xa1, 0xc4, 0x9e, - 0x50, 0x2d, 0x1e, 0xa3, 0xcc, 0xb9, 0xaa, 0x1a, 0x20, 0x8e, 0x52, 0x71, 0x4e, 0x53, 0x3b, 0xf5, - 0x77, 0x58, 0xbe, 0x00, 0xa3, 0xf7, 0xa8, 0xbf, 0x2d, 0x6d, 0xc1, 0xd1, 0x7e, 0xf4, 0x01, 0x2b, - 0x50, 0xd5, 0x30, 0x08, 0xa1, 0x99, 0x5e, 0x8e, 0x0e, 0x6b, 0x7a, 0xf9, 0x07, 0x39, 0x98, 0xcf, - 0xba, 0xd8, 0x1c, 0xe3, 0x8c, 0x6c, 0x24, 0xfc, 0xa8, 0xd1, 0x2c, 0x8b, 0x5b, 0xa4, 0x46, 0xde, - 0xd3, 0x15, 0x18, 0x65, 0x23, 0x24, 0x97, 0x05, 0xea, 0xce, 0xd8, 0x10, 0x06, 0x26, 0x2f, 0x67, - 0x00, 0x71, 0x36, 0x8f, 0x51, 0x0e, 0xc0, 0x93, 0x78, 0xf0, 0x72, 0x06, 0x70, 0xdb, 0x6b, 0x51, - 0xa9, 0x53, 0x42, 0x80, 0x0e, 0x2b, 0x30, 0x79, 0x39, 0x39, 0x07, 0xe3, 0x77, 0xdd, 0x0d, 0x6a, - 0x3f, 0x90, 0x59, 0xc3, 0xd0, 0x8c, 0xcc, 0x73, 0xad, 0x36, 0x2b, 0x33, 0x65, 0xa5, 0xf1, 0xb3, - 0x39, 0x98, 0x4d, 0xdd, 0xa9, 0x8e, 0xf7, 0xb7, 0x1e, 0xec, 0x43, 0x38, 0x4c, 0xff, 0xf8, 0xe7, - 0x8f, 0x64, 0x7f, 0xbe, 0xf1, 0x5f, 0x8f, 0xc1, 0xa9, 0x3e, 0x2a, 0xae, 0xd8, 0xc7, 0x39, 0x77, - 0xac, 0x8f, 0xf3, 0x57, 0x61, 0x6a, 0xa5, 0x6d, 0x3b, 0x9d, 0x60, 0xd3, 0x8b, 0xbf, 0x38, 0x76, - 0x95, 0xc2, 0x3a, 0xe1, 0x71, 0x11, 0xf9, 0xd4, 0x9c, 0x6e, 0x22, 0x86, 0x15, 0x7a, 0x69, 0x09, - 0x5b, 0x23, 0x96, 0xf2, 0x32, 0x2e, 0xfc, 0x19, 0xf1, 0x32, 0xd6, 0xfd, 0xde, 0x46, 0x9e, 0xa8, - 0xdf, 0x5b, 0xb6, 0x75, 0xf9, 0xe8, 0xc7, 0xf1, 0x35, 0x58, 0x81, 0x29, 0x6e, 0x47, 0x57, 0x0d, - 0xf8, 0x24, 0x8d, 0xa5, 0x6c, 0xef, 0xec, 0x20, 0x3d, 0x17, 0x1a, 0x0e, 0x59, 0xd3, 0x7d, 0xb4, - 0xc6, 0xf1, 0xa1, 0xf9, 0x5c, 0x7f, 0x1f, 0x2c, 0x3d, 0xd0, 0x8f, 0xea, 0x8b, 0xf5, 0x4d, 0x98, - 0xcf, 0xba, 0x23, 0x2f, 0x14, 0x35, 0x13, 0xdd, 0xbe, 0xf6, 0xe0, 0xc3, 0xdf, 0xb4, 0xf7, 0x33, - 0x6f, 0xda, 0xd2, 0x77, 0x7e, 0xa2, 0xbf, 0xe3, 0x51, 0xbc, 0x17, 0x38, 0xec, 0x60, 0x0f, 0x7b, - 0xe3, 0xab, 0x89, 0xe0, 0x07, 0x49, 0x74, 0xf2, 0x96, 0x16, 0xa3, 0xea, 0x95, 0x74, 0x8c, 0xaa, - 0xec, 0x78, 0x07, 0x3c, 0x01, 0xd4, 0xcf, 0xe6, 0x75, 0x8f, 0xed, 0x3f, 0x8b, 0x1b, 0xf5, 0x02, - 0x8c, 0xde, 0xdf, 0xa3, 0xbe, 0x3c, 0x53, 0xf0, 0x43, 0x1e, 0xb2, 0x02, 0xf5, 0x43, 0x10, 0x82, - 0x5c, 0x87, 0xe9, 0x3a, 0x5f, 0xb8, 0x72, 0x35, 0x8e, 0xc4, 0x8a, 0x9a, 0xae, 0x50, 0x27, 0x66, - 0x2c, 0xc7, 0x04, 0x96, 0x71, 0x23, 0x31, 0xe8, 0x22, 0xc2, 0x16, 0xf7, 0xc1, 0xe2, 0x52, 0xc7, - 0x74, 0xec, 0x4b, 0x17, 0x33, 0x5b, 0x33, 0x51, 0x6a, 0xec, 0xc0, 0xf3, 0x03, 0x09, 0xb1, 0xc3, - 0x1e, 0xba, 0xd1, 0xaf, 0x84, 0xb9, 0xf6, 0x40, 0x54, 0x53, 0xc1, 0x33, 0xbe, 0x09, 0x25, 0x75, - 0x94, 0xf1, 0x08, 0x62, 0xbf, 0xc5, 0xaa, 0xe0, 0x47, 0x10, 0x2b, 0x30, 0x79, 0x79, 0xfc, 0x00, - 0x94, 0xcf, 0x7e, 0x00, 0x8a, 0xa7, 0xbf, 0x70, 0xdc, 0xf4, 0xb3, 0xc6, 0x91, 0xc3, 0x29, 0x8d, - 0xe3, 0x6f, 0xb5, 0x71, 0x8c, 0x7b, 0x65, 0xf2, 0xf2, 0x27, 0xda, 0xf8, 0x3f, 0x97, 0x09, 0x04, - 0xd1, 0xc5, 0x4b, 0x6e, 0xf7, 0x5c, 0x9c, 0x2b, 0x36, 0x6b, 0xf7, 0xc6, 0x90, 0xb1, 0x20, 0x92, - 0x3f, 0x56, 0x10, 0x79, 0x8c, 0x85, 0x88, 0xc2, 0x32, 0x9f, 0xd2, 0x91, 0x58, 0x78, 0xb4, 0x53, - 0x26, 0x32, 0x12, 0xca, 0xf8, 0x76, 0x0e, 0x4e, 0x64, 0x2a, 0xda, 0x59, 0xab, 0x5c, 0xa3, 0xaf, - 0xec, 0xc3, 0xa4, 0x3a, 0x9f, 0x43, 0x3c, 0x4e, 0xfc, 0x90, 0xe1, 0xfb, 0x62, 0xbc, 0x00, 0x13, - 0xd1, 0x33, 0x2f, 0x99, 0x97, 0x53, 0xc7, 0x03, 0x24, 0x8a, 0xd7, 0xc2, 0x06, 0x00, 0xfb, 0x82, - 0x27, 0x6a, 0x8f, 0x6d, 0xfc, 0xf3, 0x3c, 0x8c, 0x31, 0xaa, 0x4f, 0x6d, 0x28, 0xe7, 0x6c, 0x23, - 0x6a, 0xd6, 0xa5, 0xfe, 0x01, 0x9c, 0xc9, 0x2a, 0x8c, 0xf1, 0xe4, 0x77, 0xe2, 0xc9, 0x70, 0x4e, - 0x45, 0x93, 0x59, 0xf1, 0xa2, 0xc0, 0x17, 0x01, 0x96, 0x68, 0xaa, 0x05, 0x2c, 0x51, 0x6c, 0xb1, - 0x7f, 0x27, 0x07, 0x25, 0x15, 0x99, 0x7c, 0x19, 0xa6, 0x65, 0x78, 0x5a, 0x1e, 0x0c, 0x46, 0xbc, - 0x49, 0x4b, 0xfb, 0x31, 0x19, 0x9e, 0x56, 0x0d, 0x1e, 0xa3, 0xc1, 0xab, 0xac, 0xba, 0xab, 0x02, - 0x93, 0x16, 0x90, 0xce, 0x8e, 0x6d, 0x3d, 0xa4, 0xf6, 0x3e, 0x0d, 0x42, 0x8b, 0xdb, 0xf9, 0x88, - 0xa7, 0x6b, 0x49, 0xfe, 0xf6, 0xf5, 0x2a, 0x37, 0xf1, 0x61, 0x33, 0x21, 0xe2, 0x0c, 0xa7, 0x70, - 0xd4, 0xf7, 0xb8, 0xce, 0x8e, 0x7d, 0x9f, 0x57, 0x72, 0x3c, 0xe3, 0x0f, 0xc7, 0xf8, 0x72, 0x13, - 0xf1, 0xac, 0xb7, 0x61, 0xfa, 0xee, 0x7a, 0x6d, 0x45, 0xd1, 0xce, 0xeb, 0xe9, 0xd0, 0x56, 0x1f, - 0x85, 0xd4, 0x77, 0xed, 0xb6, 0xbc, 0x24, 0xc7, 0x47, 0x90, 0xe7, 0xb4, 0x9a, 0xd9, 0x9a, 0xfb, - 0x04, 0x45, 0xd6, 0x06, 0xbf, 0x8e, 0x47, 0x6d, 0xe4, 0x87, 0x6c, 0x23, 0xb0, 0x3b, 0xed, 0x3e, - 0x6d, 0xe8, 0x14, 0xc9, 0x1e, 0xde, 0x97, 0xf7, 0x7a, 0xdb, 0x4a, 0x2b, 0x85, 0xc1, 0xad, 0xbc, - 0x28, 0x5a, 0x79, 0x56, 0xe8, 0x62, 0x32, 0xdb, 0x49, 0x51, 0x8d, 0xf9, 0xc4, 0xc8, 0xb1, 0x7c, - 0xe2, 0xff, 0x9f, 0x83, 0x31, 0x2e, 0xbe, 0x8a, 0x65, 0xdc, 0x47, 0x40, 0xbe, 0xff, 0x64, 0x04, - 0xe4, 0x32, 0x9e, 0x13, 0xda, 0x82, 0xe6, 0x75, 0xa4, 0x96, 0xd8, 0x17, 0xd2, 0x85, 0x00, 0xdf, - 0xd9, 0x78, 0xcd, 0xf1, 0xdb, 0x82, 0xac, 0xc7, 0xa1, 0x48, 0xc6, 0x8f, 0xf5, 0x3f, 0x97, 0xe1, - 0x5b, 0xc6, 0x45, 0x28, 0x12, 0x3d, 0x00, 0xc9, 0x06, 0x4c, 0x88, 0x00, 0x27, 0xcb, 0x07, 0xe2, - 0x35, 0xbd, 0xac, 0xd9, 0x43, 0xb5, 0x96, 0x0f, 0x62, 0xd1, 0x5c, 0x84, 0x48, 0xb1, 0xb6, 0x55, - 0x5f, 0x82, 0x98, 0x00, 0xb9, 0xcb, 0x33, 0x9d, 0xf3, 0x78, 0xdf, 0x7a, 0x8a, 0x8f, 0xa8, 0x5c, - 0xc4, 0x7b, 0x93, 0x51, 0x12, 0x32, 0xc2, 0x7b, 0xc7, 0x34, 0xc8, 0x06, 0x94, 0xd1, 0x86, 0x8e, - 0xb6, 0xf8, 0xae, 0x59, 0xaf, 0xf1, 0x20, 0x1a, 0xc2, 0x0e, 0x3a, 0xe4, 0x75, 0x62, 0xbb, 0x25, - 0x3c, 0x3d, 0x53, 0x98, 0xc6, 0xcf, 0xe4, 0xa1, 0x9c, 0x5c, 0x7d, 0xe4, 0x6d, 0x98, 0x8c, 0xe2, - 0xad, 0x47, 0xbe, 0xe6, 0xf8, 0xaa, 0x16, 0x07, 0x68, 0xd7, 0xf3, 0x63, 0x2b, 0xe0, 0x64, 0x09, - 0x8a, 0x6c, 0x13, 0xbb, 0x71, 0xb8, 0x4c, 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, - 0xba, 0x68, 0x7e, 0x81, 0xb1, 0x3b, 0x6d, 0xad, 0x5a, 0x4f, 0x16, 0x9d, 0x81, 0x4d, 0x2e, 0xf2, - 0x63, 0x66, 0xbd, 0x26, 0x8c, 0x61, 0xf0, 0xa8, 0x46, 0x23, 0x2e, 0xed, 0xe3, 0x05, 0x90, 0xc2, - 0x59, 0x7f, 0x3f, 0x0f, 0x93, 0xca, 0xf2, 0x23, 0x17, 0xa0, 0xb8, 0x1e, 0x6c, 0x78, 0xcd, 0xfd, - 0x28, 0x7e, 0xe8, 0xd4, 0xd1, 0x61, 0x65, 0xc2, 0x09, 0xac, 0x36, 0x16, 0x9a, 0x51, 0x35, 0x59, - 0x86, 0x29, 0xfe, 0x97, 0x4c, 0x9c, 0x93, 0x8f, 0x15, 0x72, 0x1c, 0x58, 0xa6, 0xcc, 0x51, 0x99, - 0xad, 0x86, 0x42, 0x3e, 0x00, 0xe0, 0x05, 0x18, 0xbc, 0xa1, 0x30, 0x7c, 0xd8, 0x09, 0xd1, 0x40, - 0x46, 0xd8, 0x06, 0x85, 0x20, 0xf9, 0x3a, 0x0f, 0xe7, 0x2e, 0xb7, 0xcb, 0xc8, 0xf0, 0x71, 0x33, - 0x18, 0x7d, 0x2b, 0x3b, 0x7c, 0x8f, 0x4a, 0x52, 0xe4, 0xba, 0x5a, 0x94, 0x89, 0x4d, 0xab, 0x21, - 0x02, 0x2a, 0x10, 0xc6, 0xff, 0x9c, 0x53, 0x36, 0x19, 0xb9, 0x03, 0x13, 0xd1, 0x02, 0x12, 0x76, - 0x68, 0xd1, 0x15, 0x43, 0x96, 0x9b, 0x74, 0x67, 0xf9, 0x59, 0x61, 0x12, 0x37, 0x17, 0x2d, 0x43, - 0x6d, 0xcf, 0xc9, 0x42, 0xf2, 0x45, 0x18, 0xc1, 0xa1, 0xcb, 0x1f, 0xdb, 0x35, 0x79, 0xca, 0x8f, - 0xb0, 0x31, 0xc3, 0x8e, 0x20, 0x26, 0xf9, 0x8c, 0x70, 0x11, 0xe7, 0x83, 0x3f, 0xad, 0x1c, 0xd5, - 0xec, 0x3b, 0xa2, 0xe3, 0x3d, 0x8e, 0xe0, 0xa4, 0xac, 0x9e, 0xbf, 0x96, 0x87, 0x72, 0x72, 0x6b, - 0x93, 0xf7, 0xa0, 0x24, 0x8f, 0xdf, 0x35, 0x5b, 0x64, 0x7d, 0x29, 0x89, 0xac, 0x2b, 0xf2, 0x0c, - 0xde, 0xb3, 0x55, 0xbb, 0x35, 0x53, 0x43, 0x60, 0xb2, 0xd0, 0xa6, 0x08, 0x03, 0xa9, 0x6c, 0xaa, - 0xd0, 0x0b, 0xbb, 0x89, 0x28, 0xe2, 0x12, 0x8c, 0xbc, 0x01, 0x85, 0xdb, 0xd7, 0xab, 0xc2, 0x2b, - 0xb0, 0x9c, 0x3c, 0xa4, 0xb9, 0x79, 0xad, 0x6e, 0xec, 0xcb, 0xe0, 0xc9, 0x86, 0x12, 0x70, 0x7f, - 0x4c, 0xb3, 0x51, 0x94, 0xc5, 0x51, 0xe7, 0x8e, 0x8f, 0xbc, 0x7f, 0x73, 0xa4, 0x58, 0x28, 0x8f, - 0x88, 0x20, 0xcc, 0xff, 0xba, 0x00, 0x13, 0x51, 0xfb, 0x84, 0xa8, 0x0e, 0xda, 0xc2, 0x19, 0xfb, - 0x34, 0x14, 0xa5, 0x74, 0x27, 0x9c, 0x03, 0xc7, 0x03, 0x21, 0xd9, 0x2d, 0x80, 0x14, 0xe3, 0x38, - 0x57, 0x30, 0xe5, 0x4f, 0x72, 0x05, 0x22, 0x19, 0xad, 0x9f, 0x30, 0x37, 0xc2, 0x26, 0xcc, 0x8c, - 0xc0, 0xc8, 0x34, 0xe4, 0x1d, 0x1e, 0xd8, 0x6e, 0xc2, 0xcc, 0x3b, 0x2d, 0xf2, 0x1e, 0x14, 0xed, - 0x56, 0x0b, 0xb3, 0xd8, 0x0e, 0x91, 0x00, 0xb7, 0xc8, 0xa8, 0xf1, 0x33, 0x03, 0xb1, 0xaa, 0x21, - 0xa9, 0xc2, 0x04, 0x8f, 0x14, 0x1e, 0xd0, 0xd6, 0x10, 0x07, 0x50, 0x4c, 0x01, 0x03, 0x8c, 0x6f, - 0x05, 0xb4, 0x45, 0x5e, 0x81, 0x11, 0x36, 0x9b, 0xe2, 0xc4, 0x91, 0x42, 0x25, 0x9b, 0x4c, 0x3e, - 0x60, 0x6b, 0xcf, 0x98, 0x08, 0x40, 0x5e, 0x82, 0x42, 0x6f, 0x69, 0x47, 0x9c, 0x25, 0xe5, 0x38, - 0xf9, 0x45, 0x04, 0xc6, 0xaa, 0xc9, 0x55, 0x28, 0x3e, 0xd4, 0xf3, 0x26, 0x9c, 0x48, 0x4c, 0x63, - 0x04, 0x1f, 0x01, 0x92, 0x57, 0xa0, 0x10, 0x04, 0x9e, 0xb0, 0x82, 0x9a, 0x8b, 0x4c, 0x53, 0xef, - 0x46, 0xb3, 0xc6, 0xa8, 0x07, 0x81, 0xb7, 0x5c, 0x84, 0x31, 0x7e, 0xc0, 0x18, 0xcf, 0x03, 0xc4, - 0xdf, 0x98, 0x76, 0xf6, 0x34, 0x3e, 0x80, 0x89, 0xe8, 0xdb, 0xc8, 0x19, 0x80, 0x7d, 0x7a, 0x60, - 0xed, 0xd9, 0x6e, 0xab, 0xcd, 0xa5, 0xd3, 0x92, 0x39, 0xb1, 0x4f, 0x0f, 0xd6, 0xb0, 0x80, 0x9c, - 0x82, 0xf1, 0x2e, 0x9b, 0x7e, 0xb1, 0xc6, 0x4b, 0xe6, 0x58, 0xb7, 0xb7, 0xcd, 0x96, 0xf2, 0x02, - 0x8c, 0xa3, 0x9e, 0x55, 0xec, 0xc8, 0x29, 0x53, 0xfe, 0x34, 0xfe, 0xa8, 0x80, 0xe9, 0xc5, 0x94, - 0x0e, 0x91, 0x17, 0x61, 0xaa, 0xe9, 0x53, 0x3c, 0xcb, 0x6c, 0x26, 0xa1, 0x89, 0x76, 0x4a, 0x71, - 0xe1, 0x7a, 0x8b, 0x9c, 0x83, 0x99, 0x38, 0x13, 0xb4, 0xd5, 0xdc, 0x16, 0xf9, 0x50, 0x4a, 0xe6, - 0x54, 0x57, 0xe6, 0x83, 0x5e, 0xd9, 0xc6, 0xc8, 0x8d, 0x65, 0x35, 0xf0, 0x38, 0x1b, 0x11, 0xb1, - 0xfe, 0x66, 0x94, 0x72, 0x34, 0xe8, 0x3c, 0x09, 0x63, 0xb6, 0xbd, 0xdb, 0x73, 0x78, 0x84, 0xb5, - 0x92, 0x29, 0x7e, 0x91, 0xd7, 0x60, 0x36, 0x8e, 0xe4, 0x2f, 0xbb, 0x31, 0x8a, 0xdd, 0x28, 0x47, - 0x15, 0x2b, 0xbc, 0x9c, 0x5c, 0x04, 0xa2, 0xb6, 0xe7, 0x6d, 0x7f, 0x48, 0x9b, 0x7c, 0x4d, 0x96, - 0xcc, 0x59, 0xa5, 0xe6, 0x2e, 0x56, 0x90, 0x17, 0xa0, 0xe4, 0xd3, 0x00, 0xa5, 0x43, 0x1c, 0x36, - 0xcc, 0xbe, 0x69, 0x4e, 0xca, 0x32, 0x36, 0x76, 0xe7, 0xa1, 0xac, 0x0c, 0x07, 0xc6, 0x76, 0xe7, - 0xa9, 0x40, 0xcc, 0xe9, 0xb8, 0xdc, 0xec, 0xae, 0xb7, 0xc8, 0x97, 0x60, 0x51, 0x81, 0xe4, 0x89, - 0x40, 0x2d, 0xda, 0x76, 0x76, 0x9d, 0xed, 0x36, 0x15, 0xeb, 0x2d, 0xbd, 0xaa, 0xa3, 0x2b, 0xa4, - 0xb9, 0x10, 0x63, 0xf3, 0x14, 0xa1, 0xab, 0x02, 0x97, 0x6c, 0xc0, 0x7c, 0x82, 0x32, 0x6d, 0x59, - 0xbd, 0x6e, 0xdf, 0x90, 0x86, 0x31, 0x4d, 0xa2, 0xd3, 0xa4, 0xad, 0xad, 0xae, 0xf1, 0x4d, 0x28, - 0xa9, 0x6b, 0x92, 0x0d, 0x82, 0x2a, 0x97, 0x88, 0xd5, 0x37, 0x19, 0x95, 0xad, 0xb3, 0x7b, 0xe1, - 0x74, 0x0c, 0x82, 0x93, 0xc8, 0xd9, 0xcb, 0x54, 0x54, 0x8a, 0x53, 0xf8, 0x02, 0x94, 0x5a, 0x4e, - 0xd0, 0x6d, 0xdb, 0x07, 0x68, 0x96, 0x27, 0x66, 0x7a, 0x52, 0x94, 0xa1, 0xe2, 0x67, 0x19, 0x66, - 0x53, 0x7c, 0x50, 0x91, 0x34, 0x38, 0x5f, 0x1f, 0x2c, 0x69, 0x18, 0x2e, 0x94, 0xd4, 0x73, 0xed, - 0x98, 0xc4, 0x3d, 0x27, 0x31, 0xe0, 0x0f, 0x67, 0xfa, 0x63, 0x47, 0x87, 0x95, 0xbc, 0xd3, 0xc2, - 0x30, 0x3f, 0xe7, 0xa1, 0x28, 0x25, 0x36, 0x21, 0x28, 0xe1, 0x63, 0x82, 0x7c, 0xcf, 0x34, 0xa3, - 0x5a, 0xe3, 0x15, 0x18, 0x17, 0x47, 0xd7, 0xe0, 0x27, 0x04, 0xe3, 0x5b, 0x79, 0x98, 0x31, 0x29, - 0x63, 0xac, 0x94, 0x67, 0xeb, 0x7a, 0x6a, 0xaf, 0xe8, 0xd9, 0x11, 0x7c, 0xb5, 0xbe, 0x0d, 0xc8, - 0x93, 0xf5, 0x4b, 0x39, 0x98, 0xcb, 0x80, 0xfd, 0x48, 0x79, 0xa2, 0xaf, 0xc1, 0x44, 0xcd, 0xb1, - 0xdb, 0xd5, 0x56, 0x2b, 0x8a, 0xfe, 0x83, 0x72, 0x3e, 0x26, 0x93, 0xb3, 0x59, 0xa9, 0x2a, 0xc4, - 0x44, 0xa0, 0xe4, 0x55, 0xb1, 0x28, 0x0a, 0xd1, 0xb0, 0xe2, 0xa2, 0xf8, 0xde, 0x61, 0x05, 0xf8, - 0x37, 0x6d, 0x46, 0x4b, 0x04, 0xa3, 0x6a, 0xf3, 0xc2, 0xd8, 0x19, 0xeb, 0xa9, 0x9d, 0xba, 0xec, - 0xa8, 0xda, 0xc9, 0xee, 0x0d, 0x95, 0x2a, 0xeb, 0x27, 0xf3, 0x70, 0x32, 0x1b, 0xf1, 0xa3, 0xa6, - 0xfc, 0xc6, 0x24, 0x65, 0x4a, 0x26, 0x00, 0x4c, 0xf9, 0xcd, 0x33, 0x9a, 0x21, 0x7c, 0x0c, 0x40, - 0x76, 0x78, 0x6a, 0xfd, 0x35, 0x6a, 0xfb, 0xe1, 0x36, 0xb5, 0xc3, 0x21, 0x24, 0x79, 0x69, 0x82, - 0xb1, 0x80, 0xc2, 0xc4, 0x9e, 0xc4, 0xcc, 0xca, 0xac, 0x1f, 0x91, 0x8d, 0x16, 0xca, 0xc8, 0x10, - 0x0b, 0xe5, 0x1b, 0x30, 0xd3, 0xa0, 0x1d, 0xbb, 0xbb, 0xe7, 0xf9, 0x32, 0xc8, 0xc2, 0x25, 0x98, - 0x8a, 0x8a, 0x32, 0x57, 0x8b, 0x5e, 0xad, 0xc1, 0x2b, 0x03, 0x11, 0xb3, 0x12, 0xbd, 0xda, 0xf8, - 0xeb, 0x79, 0x38, 0x55, 0x6d, 0x0a, 0x7b, 0x52, 0x51, 0x21, 0xcd, 0xde, 0x3f, 0xe1, 0xb6, 0xc9, - 0x65, 0x98, 0xb8, 0x6d, 0x3f, 0xda, 0xa0, 0x76, 0x40, 0x03, 0x91, 0x66, 0x82, 0x8b, 0xbd, 0xf6, - 0xa3, 0xf8, 0xf1, 0xc7, 0x8c, 0x61, 0x54, 0x35, 0xc2, 0xc8, 0xc7, 0x54, 0x23, 0x18, 0x30, 0xb6, - 0xe6, 0xb5, 0x5b, 0xe2, 0xac, 0x17, 0x2f, 0xce, 0x7b, 0x58, 0x62, 0x8a, 0x1a, 0xe3, 0x0f, 0x72, - 0x30, 0x1d, 0x7d, 0x31, 0x7e, 0xc2, 0x27, 0x3e, 0x24, 0xe7, 0x60, 0x1c, 0x1b, 0x5a, 0xaf, 0xa9, - 0x87, 0x46, 0x9b, 0x62, 0xda, 0xcc, 0x96, 0x29, 0x2b, 0xd5, 0x91, 0x18, 0xfd, 0x78, 0x23, 0x61, - 0xfc, 0x7d, 0x7c, 0xcc, 0x56, 0x7b, 0xc9, 0x4e, 0x22, 0xe5, 0x43, 0x72, 0x43, 0x7e, 0x48, 0xfe, - 0x89, 0x4d, 0x49, 0xa1, 0xef, 0x94, 0xfc, 0x68, 0x1e, 0x26, 0xa3, 0x8f, 0xfd, 0x94, 0xa5, 0xa3, - 0x88, 0xfa, 0x35, 0x54, 0x60, 0xa4, 0x86, 0xc2, 0x2b, 0x44, 0xfc, 0xa1, 0x2f, 0xc2, 0x98, 0xd8, - 0x4c, 0xb9, 0x84, 0xf9, 0x77, 0x62, 0x76, 0x97, 0xa7, 0x05, 0xe9, 0x31, 0x9c, 0xd0, 0xc0, 0x14, - 0x78, 0x18, 0x79, 0xea, 0x3e, 0xdd, 0x16, 0xb6, 0x0d, 0x4f, 0xed, 0x19, 0x95, 0x1d, 0x79, 0x2a, - 0xee, 0xd8, 0x50, 0xa7, 0xd3, 0x7f, 0x5b, 0x84, 0x72, 0x12, 0xe5, 0xf8, 0x84, 0x1f, 0xf5, 0xde, - 0x36, 0xbf, 0xaa, 0xf0, 0x84, 0x1f, 0xdd, 0xde, 0xb6, 0xc9, 0xca, 0xd0, 0x5e, 0xca, 0x77, 0x1e, - 0x60, 0xaf, 0x4b, 0xc2, 0x5e, 0xca, 0x77, 0x1e, 0x68, 0xf6, 0x52, 0xbe, 0xf3, 0x00, 0x15, 0x09, - 0x1b, 0x0d, 0x8c, 0xca, 0x80, 0xf7, 0x14, 0xa1, 0x48, 0x68, 0x07, 0xc9, 0x2c, 0x86, 0x12, 0x8c, - 0x1d, 0x95, 0xcb, 0xd4, 0xf6, 0x45, 0x72, 0x0a, 0xc1, 0xce, 0xf0, 0xa8, 0xdc, 0xc6, 0x62, 0x2b, - 0x64, 0xe5, 0xa6, 0x0a, 0x44, 0xda, 0x40, 0x94, 0x9f, 0x72, 0x03, 0x1f, 0x7f, 0xb7, 0x96, 0xa6, - 0x9b, 0xf3, 0x2a, 0x69, 0x4b, 0xdd, 0xcd, 0x19, 0x74, 0x9f, 0xa4, 0xf6, 0xb7, 0x2e, 0x82, 0xd7, - 0xa2, 0x02, 0xa9, 0x78, 0x2c, 0x31, 0x19, 0x4d, 0x06, 0x78, 0x70, 0xdb, 0x48, 0x8d, 0x14, 0x13, - 0x21, 0xef, 0xc2, 0xa4, 0x1a, 0x6b, 0x83, 0x47, 0x84, 0x78, 0x8e, 0x47, 0xee, 0xec, 0x93, 0xf9, - 0x5a, 0x45, 0x20, 0xdb, 0x70, 0x6a, 0xc5, 0x73, 0x83, 0x5e, 0x47, 0xc6, 0x08, 0x8d, 0xe3, 0xad, - 0x03, 0x4e, 0x05, 0x3a, 0xee, 0x37, 0x05, 0x88, 0x08, 0xed, 0x20, 0x7d, 0x6b, 0xf4, 0x0b, 0x48, - 0x3f, 0x42, 0x64, 0x13, 0x26, 0x51, 0x83, 0x2a, 0xec, 0x24, 0x27, 0x75, 0xb6, 0x11, 0xd7, 0xd4, - 0xd8, 0xc6, 0xe0, 0xa1, 0xe6, 0xec, 0x4e, 0x5b, 0xba, 0x76, 0xa8, 0x9a, 0x60, 0x05, 0x98, 0x7c, - 0x00, 0xd3, 0xfc, 0x8a, 0x76, 0x9f, 0x6e, 0xf3, 0xb5, 0x53, 0xd2, 0x34, 0x11, 0x7a, 0x25, 0x7f, - 0xcc, 0x17, 0x7a, 0xeb, 0x87, 0x74, 0x9b, 0xcf, 0xbd, 0xe6, 0x58, 0xa5, 0xc1, 0x93, 0x2d, 0x98, - 0x5b, 0xb3, 0x03, 0x5e, 0xa8, 0x04, 0x4d, 0x98, 0x42, 0x0d, 0x2d, 0x1a, 0xbc, 0xef, 0xd9, 0x81, - 0x54, 0x84, 0x67, 0x06, 0x49, 0xc8, 0xc2, 0x27, 0xdf, 0xca, 0xc1, 0x82, 0xa6, 0x27, 0x17, 0x76, - 0x66, 0x18, 0x78, 0x76, 0x1a, 0x9f, 0xbc, 0x2a, 0x52, 0x28, 0xed, 0x03, 0xc6, 0xa7, 0x24, 0xa1, - 0x8a, 0xf7, 0xe3, 0x7a, 0xd5, 0x92, 0xbc, 0x1f, 0x0d, 0xb1, 0x51, 0x71, 0x4f, 0xcf, 0xe8, 0x1b, - 0x35, 0xb1, 0xaf, 0x25, 0x98, 0x71, 0x2d, 0x39, 0xde, 0x42, 0xd1, 0x95, 0x8b, 0x14, 0x5d, 0xf3, - 0x30, 0x8a, 0xa3, 0x2a, 0x43, 0x6f, 0xe1, 0x0f, 0xe3, 0x33, 0x2a, 0x1f, 0x12, 0x62, 0xe1, 0x40, - 0x3e, 0x64, 0xfc, 0xf7, 0x63, 0x30, 0x93, 0x58, 0x16, 0xe2, 0x9e, 0x9a, 0x4b, 0xdd, 0x53, 0x1b, - 0x00, 0x5c, 0xd5, 0x3b, 0xa4, 0x4e, 0x56, 0x7a, 0x6f, 0x4e, 0x0a, 0xdf, 0xeb, 0x68, 0x4f, 0x29, - 0x64, 0x18, 0x51, 0xbe, 0x63, 0x87, 0xd4, 0x91, 0x47, 0x44, 0xf9, 0xa6, 0x57, 0x88, 0xc6, 0x64, - 0x48, 0x05, 0x46, 0x31, 0x52, 0xaf, 0xea, 0x3c, 0xeb, 0xb0, 0x02, 0x93, 0x97, 0x93, 0x17, 0x61, - 0x8c, 0x09, 0x51, 0xeb, 0x35, 0xc1, 0x04, 0xf1, 0x6c, 0x61, 0x52, 0x16, 0x93, 0x58, 0x44, 0x15, - 0xb9, 0x06, 0x25, 0xfe, 0x97, 0x88, 0xcd, 0x33, 0xa6, 0x5b, 0x4c, 0x5a, 0x4e, 0x4b, 0x86, 0xe7, - 0xd1, 0xe0, 0xd8, 0xed, 0xa2, 0xd1, 0x43, 0xb5, 0xce, 0x7a, 0x4d, 0x04, 0xac, 0xc7, 0xdb, 0x45, - 0xc0, 0x0b, 0x59, 0x13, 0x31, 0x00, 0x93, 0x65, 0x84, 0x0b, 0x4b, 0x11, 0xef, 0x94, 0x28, 0xcb, - 0x70, 0xd7, 0x15, 0x53, 0xd4, 0x90, 0x0b, 0xfc, 0x25, 0x06, 0xc5, 0x42, 0x9e, 0xb5, 0x15, 0xdf, - 0x2d, 0x50, 0x31, 0x81, 0xb2, 0x61, 0x54, 0xcd, 0x1a, 0x67, 0x7f, 0xaf, 0x76, 0x6c, 0xa7, 0x2d, - 0xd8, 0x0a, 0x36, 0x8e, 0xb0, 0x94, 0x95, 0x9a, 0x31, 0x00, 0x79, 0x1b, 0xa6, 0x79, 0x76, 0xc5, - 0x4e, 0xc7, 0x73, 0x91, 0xfc, 0x64, 0x1c, 0x7d, 0x4f, 0x64, 0x7c, 0x64, 0x55, 0xbc, 0x95, 0x04, - 0x2c, 0x3b, 0x4f, 0xf0, 0x95, 0xb7, 0xc7, 0xdf, 0x88, 0x4a, 0xf1, 0x79, 0x82, 0xa8, 0x01, 0x2f, - 0x37, 0x55, 0x20, 0xf2, 0x26, 0x4c, 0xb1, 0x9f, 0x37, 0x9c, 0x07, 0x94, 0x37, 0x38, 0x15, 0x9b, - 0x37, 0x20, 0xd6, 0x2e, 0xab, 0xe1, 0xed, 0xe9, 0x90, 0xe4, 0x7d, 0x38, 0x81, 0x94, 0x9a, 0x5e, - 0x97, 0xb6, 0xaa, 0x3b, 0x3b, 0x4e, 0xdb, 0xe1, 0xd6, 0x68, 0x3c, 0x0a, 0x0d, 0xea, 0xe0, 0x79, - 0xc3, 0x08, 0x61, 0xd9, 0x31, 0x88, 0x99, 0x8d, 0x49, 0xee, 0x43, 0x79, 0xa5, 0x17, 0x84, 0x5e, - 0xa7, 0x1a, 0x86, 0xbe, 0xb3, 0xdd, 0x0b, 0x69, 0xb0, 0x30, 0xa3, 0xc5, 0x6a, 0x61, 0x9b, 0x23, - 0xaa, 0xe4, 0xfa, 0xa0, 0x26, 0x62, 0x58, 0x76, 0x84, 0x62, 0xa6, 0x88, 0x18, 0xff, 0x26, 0x07, - 0x53, 0x1a, 0x2a, 0x79, 0x03, 0x4a, 0xd7, 0x7d, 0x87, 0xba, 0xad, 0xf6, 0x81, 0x72, 0x51, 0xc5, - 0x5b, 0xcc, 0x8e, 0x28, 0xe7, 0xbd, 0xd6, 0xc0, 0x22, 0x3d, 0x4f, 0x3e, 0xd3, 0x54, 0xf4, 0x32, - 0xf7, 0xe1, 0x16, 0x0b, 0xb4, 0x10, 0x07, 0x8f, 0xc2, 0x05, 0x2a, 0x56, 0xa7, 0x02, 0x42, 0xde, - 0x81, 0x31, 0xfe, 0x1e, 0x2c, 0xec, 0x16, 0x4f, 0x67, 0x75, 0x93, 0xc7, 0x0b, 0xc0, 0x85, 0x88, - 0x46, 0x3f, 0x81, 0x29, 0x90, 0x8c, 0x9f, 0xcb, 0x01, 0x49, 0x83, 0x1e, 0xa3, 0xf7, 0x3a, 0xd6, - 0x98, 0xe8, 0x8b, 0xd1, 0x6e, 0x2c, 0x68, 0x3a, 0x73, 0xd6, 0x12, 0xaf, 0xe0, 0x03, 0x2f, 0x76, - 0x9d, 0xaa, 0x88, 0xe3, 0xd5, 0xc6, 0x8f, 0xe4, 0x01, 0x62, 0x68, 0xf2, 0x79, 0x9e, 0x9b, 0xee, - 0xfd, 0x9e, 0xdd, 0x76, 0x76, 0x1c, 0x3d, 0x42, 0x30, 0x12, 0xf9, 0x86, 0xac, 0x31, 0x75, 0x40, - 0xf2, 0x1e, 0xcc, 0x34, 0xea, 0x3a, 0xae, 0x62, 0x4b, 0x1f, 0x74, 0xad, 0x04, 0x7a, 0x12, 0x1a, - 0xed, 0x93, 0xd5, 0xd9, 0xe0, 0xf6, 0xc9, 0x7c, 0x22, 0x44, 0x0d, 0x63, 0x2c, 0x8d, 0xba, 0x70, - 0x17, 0x68, 0x45, 0xaf, 0x9a, 0xf8, 0x75, 0x41, 0xd7, 0xea, 0x0a, 0x3f, 0x02, 0xc6, 0x27, 0x34, - 0xb8, 0x78, 0x20, 0x47, 0xfb, 0xc4, 0x04, 0xf8, 0x79, 0x54, 0xfb, 0x75, 0xbc, 0x90, 0x0a, 0x6d, - 0xc7, 0x53, 0x7b, 0xef, 0x89, 0x8d, 0x09, 0x46, 0x35, 0x57, 0x67, 0xad, 0x77, 0xc2, 0x60, 0xe6, - 0x6a, 0x7c, 0x49, 0xe1, 0x66, 0x05, 0x19, 0x36, 0x36, 0x7f, 0x37, 0x07, 0x27, 0x32, 0x71, 0xc9, - 0x25, 0x80, 0x58, 0xa7, 0x24, 0x46, 0x09, 0x39, 0x66, 0x1c, 0x32, 0xc9, 0x54, 0x20, 0xc8, 0x57, - 0x93, 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, 0xfb, 0x50, 0x62, 0xbd, - 0x71, 0x9a, 0xc2, 0x57, 0x87, 0x1b, 0xbe, 0xbc, 0x9a, 0x72, 0x56, 0x15, 0xd4, 0x2e, 0xa9, 0xc0, - 0x3c, 0x7e, 0x28, 0xb2, 0x4e, 0x7c, 0x90, 0x68, 0xa6, 0xfd, 0x74, 0x34, 0xe2, 0x24, 0x80, 0xa9, - 0xda, 0x81, 0x6b, 0x77, 0xa2, 0xd6, 0xb8, 0x01, 0xcc, 0x6b, 0x7d, 0x5b, 0xd3, 0xa0, 0x79, 0x73, - 0xb1, 0x5b, 0x17, 0xaf, 0xcb, 0x88, 0x28, 0xa0, 0x61, 0x2d, 0xbe, 0x07, 0xb3, 0xa9, 0x8f, 0x7e, - 0xac, 0x50, 0xa6, 0xf7, 0x81, 0xa4, 0xbf, 0x23, 0x83, 0xc2, 0x6b, 0x7a, 0xa0, 0xdc, 0x13, 0xd1, - 0xe3, 0x75, 0xa7, 0x63, 0xbb, 0x2d, 0x6e, 0x4e, 0xb3, 0xa4, 0x06, 0x3a, 0xfd, 0xf9, 0xbc, 0xea, - 0x30, 0xfc, 0xb4, 0xef, 0xba, 0x2f, 0x6a, 0xb7, 0xe1, 0xe7, 0xfb, 0xcd, 0xe9, 0x50, 0x5a, 0x87, - 0xef, 0x16, 0xe0, 0x54, 0x1f, 0x4c, 0x72, 0x90, 0x5c, 0x44, 0x5c, 0x0b, 0x71, 0x65, 0x70, 0x83, - 0x4f, 0x62, 0x29, 0x91, 0xcf, 0xf3, 0x90, 0x21, 0x22, 0x91, 0x35, 0xbf, 0x7f, 0xa3, 0x1a, 0x7f, - 0x3f, 0x2a, 0x4d, 0xc6, 0x0a, 0xe1, 0xa5, 0xe4, 0x3d, 0x18, 0x45, 0x6f, 0xf1, 0x44, 0x4c, 0x48, - 0x06, 0x81, 0xe5, 0x4a, 0x54, 0x53, 0xf6, 0x53, 0x8b, 0x6a, 0xca, 0x0a, 0xc8, 0xe7, 0xa0, 0x50, - 0xbd, 0xdf, 0x10, 0xf3, 0x32, 0xad, 0xa2, 0xdf, 0x6f, 0xc4, 0xc9, 0x69, 0x6c, 0x2d, 0x8b, 0x0c, - 0xc3, 0x60, 0x88, 0x37, 0x56, 0xea, 0x62, 0x56, 0x54, 0xc4, 0x1b, 0x2b, 0xf5, 0x18, 0x71, 0xb7, - 0xa9, 0x45, 0xd8, 0xba, 0xb1, 0x52, 0xff, 0xe4, 0x96, 0xfd, 0x7f, 0x90, 0xe7, 0x71, 0x4e, 0x78, - 0xc7, 0xde, 0x83, 0x92, 0x16, 0xc8, 0x3c, 0x17, 0xcb, 0x63, 0x51, 0xa4, 0xfa, 0x84, 0xc5, 0x90, - 0x86, 0x20, 0xd3, 0x3c, 0xb1, 0xdf, 0x6a, 0x00, 0xf7, 0x28, 0xcd, 0x13, 0x52, 0x48, 0xba, 0x12, - 0xe9, 0x28, 0xe4, 0x2a, 0x14, 0x37, 0xa9, 0x6b, 0xbb, 0x61, 0xa4, 0x10, 0x45, 0xe3, 0xe2, 0x10, - 0xcb, 0x74, 0xa9, 0x21, 0x02, 0x44, 0x43, 0xd8, 0xde, 0x76, 0xd0, 0xf4, 0x1d, 0x8c, 0x87, 0x14, - 0x9d, 0xc5, 0xdc, 0x10, 0x56, 0xa9, 0xd1, 0x09, 0x24, 0x90, 0x8c, 0x9f, 0xcf, 0xc1, 0xb8, 0x98, - 0x48, 0x9e, 0x9e, 0x6f, 0x37, 0x3e, 0x4b, 0x84, 0xf3, 0xc0, 0xae, 0x93, 0x74, 0x1e, 0xd8, 0xe5, - 0x41, 0x87, 0x26, 0x84, 0x37, 0x5e, 0xf4, 0x34, 0x88, 0xab, 0x51, 0xfa, 0x8a, 0xea, 0xd9, 0xd7, - 0x22, 0xd0, 0x61, 0xbd, 0xb8, 0x8c, 0xbf, 0x29, 0xbe, 0xec, 0xc6, 0x4a, 0x9d, 0x2c, 0x41, 0x71, - 0xc3, 0xe3, 0xf1, 0xb3, 0xd4, 0x5c, 0xd3, 0x6d, 0x51, 0xa6, 0x0e, 0x90, 0x84, 0x63, 0xdf, 0x57, - 0xf7, 0x3d, 0x71, 0x97, 0x51, 0xbe, 0xaf, 0xcb, 0x0b, 0x13, 0xdf, 0x17, 0x81, 0x0e, 0xfd, 0x7d, - 0x34, 0x83, 0x49, 0xdc, 0xbb, 0x8a, 0xf9, 0x6f, 0x6e, 0xaa, 0xde, 0x71, 0xa2, 0x4a, 0x72, 0x8a, - 0xc5, 0x7e, 0x9c, 0xe2, 0xde, 0x55, 0x33, 0x03, 0x0b, 0xdf, 0xd5, 0xe2, 0xe2, 0x06, 0xf5, 0x1f, - 0x3c, 0xc5, 0x5c, 0x3a, 0xfb, 0x5d, 0x2d, 0xd9, 0xbd, 0xa1, 0x98, 0xf4, 0xef, 0xe4, 0xe1, 0x64, - 0x36, 0xa2, 0xda, 0x97, 0xdc, 0x80, 0xbe, 0x9c, 0x87, 0xe2, 0x9a, 0x17, 0x84, 0x8a, 0x91, 0x20, - 0xaa, 0xff, 0xf7, 0x44, 0x99, 0x19, 0xd5, 0xb2, 0x3b, 0x37, 0xfb, 0x3b, 0xda, 0x9e, 0x48, 0x0f, - 0xa3, 0x7b, 0xb0, 0x3b, 0x37, 0xaf, 0x22, 0x37, 0xa0, 0x68, 0x0a, 0x47, 0xab, 0xc4, 0xd0, 0xc8, - 0xe2, 0x48, 0x9a, 0x22, 0xbe, 0x28, 0xd1, 0xe2, 0xc9, 0x8b, 0x32, 0x52, 0x85, 0x71, 0x31, 0xfb, - 0x89, 0xa7, 0xe3, 0x8c, 0x25, 0xa3, 0xa7, 0x78, 0x90, 0x78, 0x8c, 0xa3, 0xe0, 0x23, 0xe0, 0x7a, - 0x4d, 0xfa, 0x4c, 0x21, 0x47, 0xe1, 0x8f, 0x84, 0xba, 0x3d, 0x66, 0x04, 0x68, 0x7c, 0x2b, 0x0f, - 0x20, 0xb5, 0x36, 0x4f, 0xed, 0x0a, 0xfb, 0x9c, 0xb6, 0xc2, 0x14, 0x7b, 0xa3, 0xe1, 0x73, 0x60, - 0xdf, 0x45, 0x73, 0x9e, 0xe1, 0x33, 0x60, 0x57, 0x60, 0x74, 0x33, 0x56, 0x68, 0x09, 0x97, 0x14, - 0x54, 0x47, 0xf3, 0x72, 0x63, 0x1b, 0xe6, 0x6f, 0xd0, 0x30, 0x56, 0x6f, 0xc9, 0xa7, 0xc7, 0xc1, - 0x64, 0x5f, 0x87, 0x09, 0x01, 0x1f, 0xf1, 0x2f, 0xae, 0x8b, 0x11, 0x01, 0x73, 0x50, 0x17, 0x23, - 0x01, 0x18, 0x37, 0xaa, 0xd1, 0x36, 0x0d, 0xe9, 0x27, 0xdb, 0x4c, 0x03, 0x08, 0xef, 0x0a, 0xf6, - 0x6c, 0xb8, 0x16, 0x8e, 0x1d, 0x9f, 0x7b, 0x70, 0x22, 0xfa, 0xf6, 0x27, 0x49, 0xf7, 0x32, 0xbb, - 0x52, 0x8a, 0xec, 0x08, 0x31, 0xc5, 0x01, 0xb6, 0x27, 0xbf, 0x97, 0x83, 0x45, 0x89, 0x71, 0xdf, - 0x89, 0x2c, 0x27, 0x87, 0x42, 0x26, 0x6f, 0xc3, 0xa4, 0x82, 0x23, 0xc2, 0xfb, 0xa3, 0x9e, 0xfa, - 0xa1, 0x13, 0xee, 0x59, 0x01, 0x2f, 0x57, 0xf5, 0xd4, 0x0a, 0x38, 0xd9, 0x86, 0xc5, 0x46, 0xf5, - 0xf6, 0xc6, 0x3d, 0xbb, 0xed, 0xb4, 0x90, 0x0d, 0xdc, 0xf1, 0xae, 0x7b, 0xed, 0xb6, 0xf7, 0x70, - 0xcb, 0xdc, 0x90, 0x39, 0x7a, 0x30, 0x2a, 0x08, 0x2a, 0xbd, 0x1f, 0x44, 0x60, 0x96, 0xeb, 0x59, - 0x3b, 0x08, 0x68, 0xf5, 0xfc, 0x76, 0x60, 0x0e, 0xa0, 0x62, 0xfc, 0xb3, 0x1c, 0x3c, 0x1b, 0x39, - 0x27, 0x65, 0xf4, 0x2f, 0xd1, 0x83, 0xdc, 0x93, 0xec, 0x41, 0xfe, 0x89, 0xf4, 0xe0, 0x4e, 0x3c, - 0x3f, 0xeb, 0x6e, 0xe4, 0x18, 0x2e, 0xbf, 0x9f, 0xa8, 0xf3, 0x23, 0x66, 0xe5, 0xb9, 0x94, 0xab, - 0xb9, 0xe2, 0x51, 0x6e, 0xbc, 0xa5, 0x0c, 0x48, 0x06, 0x41, 0x0d, 0x39, 0x97, 0x44, 0xfe, 0x56, - 0x1e, 0x66, 0xee, 0xae, 0xd7, 0x56, 0x22, 0x3b, 0xaa, 0x4f, 0x59, 0xae, 0x71, 0xad, 0x6f, 0xfd, - 0x39, 0xa7, 0xb1, 0x05, 0x73, 0x89, 0x61, 0x40, 0x21, 0xe8, 0x5d, 0xee, 0x3a, 0x13, 0x15, 0x4b, - 0x01, 0xe8, 0x64, 0x16, 0xf9, 0x7b, 0x57, 0xcd, 0x04, 0xb4, 0xf1, 0x7f, 0x40, 0x82, 0xae, 0x60, - 0xc6, 0xaf, 0xc3, 0xc4, 0x7a, 0x10, 0xf4, 0xa8, 0xbf, 0x65, 0x6e, 0xa8, 0x4a, 0x0f, 0x07, 0x0b, - 0xd9, 0x1a, 0x32, 0x63, 0x00, 0x72, 0x01, 0x8a, 0x22, 0x46, 0xbc, 0xe4, 0x6e, 0xa8, 0x7f, 0x8e, - 0x42, 0xcc, 0x9b, 0x51, 0x35, 0x79, 0x03, 0x4a, 0xfc, 0x6f, 0xbe, 0xa2, 0xc5, 0x80, 0xa3, 0x9a, - 0x53, 0x80, 0xf3, 0x1d, 0x60, 0x6a, 0x60, 0xe4, 0x55, 0x28, 0x54, 0x57, 0x4c, 0xa1, 0xd8, 0x12, - 0x12, 0xb0, 0x6f, 0x71, 0xed, 0xa3, 0x76, 0x1d, 0x5a, 0x31, 0x99, 0x1c, 0x2b, 0x63, 0x6d, 0x08, - 0x9d, 0x3c, 0xae, 0x00, 0xa9, 0x37, 0x4b, 0x1c, 0xcb, 0x58, 0x46, 0x2e, 0xc3, 0x78, 0x8d, 0x1b, - 0xff, 0x09, 0x8d, 0x3c, 0xcf, 0x49, 0xc9, 0x8b, 0xb4, 0xd8, 0x12, 0xbc, 0x88, 0x5c, 0x90, 0x59, - 0xed, 0x8a, 0xb1, 0x07, 0x4e, 0x9f, 0xd4, 0x75, 0xaf, 0xc3, 0x98, 0x88, 0xa4, 0x3e, 0xa1, 0xa4, - 0xae, 0x49, 0x46, 0x50, 0x17, 0x30, 0x69, 0x57, 0x5c, 0x78, 0x92, 0xae, 0xb8, 0xdb, 0x70, 0xea, - 0x06, 0xea, 0xa1, 0xf4, 0x78, 0x60, 0x5b, 0xe6, 0xba, 0xd0, 0xec, 0xe3, 0x83, 0x16, 0x57, 0x55, - 0x25, 0x43, 0x8a, 0x59, 0x3d, 0x5f, 0x4d, 0xb1, 0xdc, 0x8f, 0x10, 0xf9, 0x12, 0xcc, 0x67, 0x55, - 0x09, 0xfd, 0x3f, 0x46, 0xbe, 0xca, 0x6e, 0x40, 0x8d, 0x7c, 0x95, 0x45, 0x81, 0x6c, 0x40, 0x99, - 0x97, 0x57, 0x5b, 0x1d, 0xc7, 0xe5, 0x6f, 0x18, 0xfc, 0x7d, 0x00, 0x5d, 0x62, 0x04, 0x55, 0x9b, - 0x55, 0xf2, 0xb7, 0x0c, 0xcd, 0x89, 0x2a, 0x81, 0x49, 0xfe, 0x4a, 0x8e, 0xdd, 0x4b, 0x79, 0xdc, - 0x71, 0x64, 0x9f, 0xd3, 0xe2, 0x35, 0x34, 0xf2, 0x6a, 0x6a, 0x84, 0xbe, 0xe3, 0xee, 0x0a, 0x07, - 0xa9, 0x4d, 0xe1, 0x20, 0xf5, 0xf6, 0x47, 0x72, 0x90, 0xe2, 0xa4, 0x82, 0xa3, 0xc3, 0x4a, 0xc9, - 0x17, 0x6d, 0xe2, 0x2e, 0xd2, 0xbe, 0x80, 0x0d, 0x1d, 0x7a, 0x09, 0x6f, 0xb9, 0x3c, 0xea, 0x31, - 0x6d, 0xf1, 0x4e, 0xce, 0x20, 0x63, 0xc7, 0xa1, 0xb3, 0x39, 0x13, 0x8f, 0x00, 0x52, 0x1d, 0xcd, - 0xa4, 0xc0, 0xae, 0xd0, 0xd2, 0x09, 0x87, 0xfb, 0x15, 0x97, 0xe3, 0x2b, 0xb4, 0xf4, 0xd8, 0xb1, - 0x70, 0x19, 0xa9, 0x8b, 0x47, 0x43, 0x21, 0x97, 0x61, 0xec, 0xb6, 0xfd, 0xa8, 0xba, 0x4b, 0x45, - 0x0e, 0xd6, 0x29, 0xc9, 0xfe, 0xb0, 0x70, 0xb9, 0xf8, 0xbb, 0xdc, 0x6b, 0xe3, 0x19, 0x53, 0x80, - 0x91, 0x1f, 0xcc, 0xc1, 0x49, 0xbe, 0x8d, 0x65, 0x2f, 0x1b, 0x34, 0x0c, 0xd9, 0x38, 0x88, 0xf0, - 0x89, 0x67, 0x63, 0xd3, 0xf3, 0x6c, 0x38, 0x8c, 0x21, 0x60, 0x08, 0xce, 0x10, 0x0d, 0x5c, 0x20, - 0x6a, 0xb5, 0x38, 0xd4, 0x99, 0xf8, 0x64, 0x13, 0x26, 0x6f, 0x5f, 0xaf, 0x46, 0xcd, 0xf2, 0xe0, - 0xf4, 0x95, 0x2c, 0xee, 0xa8, 0x80, 0x65, 0xf9, 0x4c, 0xa8, 0x64, 0x50, 0xf4, 0xbf, 0xb5, 0xb2, - 0x8a, 0x6e, 0xfb, 0xf3, 0xb1, 0x32, 0xa1, 0xbb, 0xdf, 0xa4, 0xc9, 0x00, 0xd9, 0x11, 0xa0, 0x70, - 0x8e, 0xf8, 0x9c, 0x1c, 0x44, 0x72, 0x51, 0xf5, 0xc4, 0x2d, 0x20, 0x85, 0xf1, 0x8e, 0xfd, 0xc8, - 0xb2, 0x77, 0xa9, 0x66, 0x24, 0x20, 0x94, 0xf7, 0x3f, 0x9b, 0x83, 0xd3, 0x7d, 0xc7, 0x89, 0x5c, - 0x83, 0x53, 0x36, 0xf7, 0x2f, 0xb7, 0xf6, 0xc2, 0xb0, 0x1b, 0x58, 0xf2, 0x86, 0x25, 0x7c, 0x77, - 0xcd, 0x13, 0xa2, 0x7a, 0x8d, 0xd5, 0xca, 0x4b, 0x57, 0x40, 0xde, 0x83, 0xe7, 0x1c, 0x37, 0xa0, - 0xcd, 0x9e, 0x4f, 0x2d, 0x49, 0xa0, 0xe9, 0xb4, 0x7c, 0xcb, 0xb7, 0xdd, 0x5d, 0xe9, 0x88, 0x6c, - 0x9e, 0x96, 0x30, 0xc2, 0x87, 0x7d, 0xc5, 0x69, 0xf9, 0x26, 0x02, 0x18, 0xff, 0x26, 0x07, 0x0b, - 0xfd, 0xc6, 0x91, 0x2c, 0xc0, 0x38, 0x55, 0x72, 0xdb, 0x14, 0x4d, 0xf9, 0x93, 0x3c, 0x0b, 0xf1, - 0xf1, 0x20, 0x44, 0x86, 0x62, 0x53, 0xe4, 0x19, 0x41, 0xcb, 0x7e, 0xf5, 0x30, 0x10, 0xf6, 0xd9, - 0xa5, 0xa6, 0x7a, 0x24, 0x9c, 0x01, 0x88, 0xcf, 0x00, 0xae, 0x97, 0x31, 0x27, 0xec, 0xa6, 0xcf, - 0xb7, 0x2b, 0x39, 0x09, 0x63, 0x9c, 0xc7, 0x0a, 0xf7, 0x0f, 0xf1, 0x8b, 0x1d, 0xf6, 0x62, 0x90, - 0xf1, 0x70, 0x28, 0x2c, 0x97, 0xb4, 0xc1, 0x1e, 0xeb, 0xe0, 0xe4, 0x18, 0xbf, 0x56, 0xe2, 0x72, - 0x47, 0xb5, 0x17, 0xee, 0x49, 0x49, 0x65, 0x29, 0xcb, 0x5d, 0x8e, 0x9b, 0x92, 0x2a, 0x66, 0xe9, - 0xba, 0x93, 0x9c, 0x7c, 0xfa, 0xca, 0x67, 0x3e, 0x7d, 0xbd, 0x0e, 0x13, 0x2b, 0x7b, 0xb4, 0xb9, - 0x1f, 0xf9, 0x20, 0x15, 0xc5, 0xdb, 0x02, 0x2b, 0xe4, 0x61, 0xe4, 0x63, 0x00, 0x72, 0x19, 0x00, - 0xbd, 0x74, 0xb9, 0x40, 0xae, 0xa4, 0x82, 0x41, 0xa7, 0x5e, 0x61, 0x9d, 0xa3, 0x80, 0x20, 0xf9, - 0x86, 0x79, 0x5d, 0x35, 0xe7, 0xe1, 0xe4, 0x03, 0x7f, 0x47, 0x80, 0xc7, 0x00, 0xac, 0x7b, 0x0a, - 0x33, 0x12, 0x47, 0x67, 0x39, 0xc5, 0xb1, 0x54, 0x20, 0xf2, 0x39, 0x18, 0x5f, 0xa1, 0x7e, 0xb8, - 0xb9, 0xb9, 0x81, 0x36, 0x34, 0x3c, 0x03, 0x4a, 0x11, 0xb3, 0x55, 0x84, 0x61, 0xfb, 0x7b, 0x87, - 0x95, 0xa9, 0xd0, 0xe9, 0xd0, 0x28, 0xb2, 0xbb, 0x29, 0xa1, 0xc9, 0x32, 0x94, 0xf9, 0x2b, 0x7f, - 0x7c, 0x95, 0xc2, 0xe3, 0xb1, 0xc8, 0x0f, 0x6b, 0x61, 0x12, 0xf0, 0x90, 0x6e, 0x47, 0xb9, 0x3a, - 0x52, 0xf0, 0x64, 0x55, 0xa6, 0xb8, 0x51, 0x3f, 0x1b, 0xe2, 0xed, 0x98, 0x64, 0x1b, 0xec, 0xeb, - 0xd3, 0x18, 0xa4, 0x0a, 0x53, 0x2b, 0x5e, 0xa7, 0x6b, 0x87, 0x0e, 0x26, 0x10, 0x3d, 0x10, 0x27, - 0x21, 0xea, 0x27, 0x9b, 0x6a, 0x85, 0x76, 0xac, 0xaa, 0x15, 0xe4, 0x3a, 0x4c, 0x9b, 0x5e, 0x8f, - 0x0d, 0xbb, 0x54, 0x2a, 0xf0, 0xc3, 0x0e, 0x2d, 0x5d, 0x7c, 0x56, 0xc3, 0xce, 0x66, 0xa1, 0x41, - 0xd0, 0xa2, 0xe0, 0x6a, 0x58, 0xe4, 0x4e, 0xc6, 0xeb, 0x8e, 0x7a, 0xc2, 0xa9, 0x19, 0x3b, 0x52, - 0xc4, 0x32, 0x1e, 0x86, 0xae, 0xc2, 0x64, 0xa3, 0x71, 0x77, 0x93, 0x06, 0xe1, 0xf5, 0xb6, 0xf7, - 0x10, 0x0f, 0xb8, 0xa2, 0x48, 0x30, 0x17, 0x78, 0x56, 0x48, 0x83, 0xd0, 0xda, 0x69, 0x7b, 0x0f, - 0x4d, 0x15, 0x8a, 0x7c, 0x8d, 0x8d, 0x87, 0x22, 0x0e, 0x8a, 0x78, 0xbf, 0x83, 0x24, 0x56, 0x3c, - 0x46, 0xe2, 0x4d, 0xc0, 0xe4, 0x56, 0x7d, 0xb0, 0x14, 0x70, 0x74, 0x91, 0xf3, 0xbd, 0x47, 0x07, - 0xd5, 0x56, 0xcb, 0xa7, 0x41, 0x20, 0x4e, 0x22, 0xee, 0x22, 0x87, 0xba, 0x13, 0x9b, 0x57, 0x68, - 0x2e, 0x72, 0x0a, 0x02, 0x59, 0x61, 0x22, 0x12, 0x9b, 0x45, 0xb4, 0xbd, 0x5a, 0xaf, 0xe3, 0x61, - 0x22, 0x94, 0xb2, 0x62, 0xce, 0xb9, 0x95, 0x96, 0xd3, 0xd5, 0x25, 0x21, 0x05, 0x87, 0xac, 0xc3, - 0x0c, 0x2f, 0x60, 0x5b, 0x8b, 0xa7, 0x97, 0x9a, 0x8b, 0x13, 0x5c, 0x08, 0x32, 0x68, 0x2e, 0x80, - 0x29, 0xa6, 0xd4, 0xa0, 0xb0, 0x09, 0x3c, 0xf2, 0x1e, 0x4c, 0x63, 0xec, 0xfe, 0xc8, 0xcf, 0x08, - 0xcf, 0x84, 0x12, 0x8f, 0x6d, 0x2b, 0x6a, 0x12, 0xce, 0x7b, 0xa5, 0x20, 0xd8, 0xab, 0x4b, 0x07, - 0x24, 0x46, 0x00, 0xcd, 0x7d, 0x62, 0x02, 0x27, 0x62, 0x02, 0xa2, 0x26, 0x49, 0x20, 0x6c, 0x07, - 0x31, 0x81, 0x9f, 0xc9, 0xc1, 0x69, 0xd6, 0x90, 0xea, 0x52, 0x84, 0x4c, 0x01, 0x6d, 0x99, 0x78, - 0xde, 0x91, 0x8b, 0x97, 0xa4, 0x7c, 0x72, 0x49, 0x01, 0xbb, 0xf4, 0xe0, 0xca, 0xa5, 0x6a, 0xfc, - 0xb3, 0x21, 0x91, 0x78, 0xb4, 0xcf, 0xbe, 0x34, 0x55, 0x39, 0x30, 0x08, 0xf6, 0xb2, 0x28, 0xe0, - 0x47, 0xb1, 0x8f, 0xcf, 0xfe, 0xa8, 0x53, 0x1f, 0xf9, 0xa3, 0xfa, 0xd2, 0x54, 0x3f, 0x2a, 0x6c, - 0x07, 0x99, 0x1f, 0x75, 0x0d, 0xa6, 0xf0, 0x94, 0x16, 0xd2, 0x91, 0x2f, 0xb2, 0x9a, 0xe0, 0x9e, - 0xd0, 0x2a, 0xcc, 0x12, 0xfb, 0x79, 0x4f, 0xfc, 0xba, 0x39, 0x52, 0x1c, 0x2f, 0x17, 0x6f, 0x8e, - 0x14, 0x67, 0xcb, 0xc4, 0x9c, 0x88, 0x06, 0xde, 0x3c, 0x91, 0xf9, 0x21, 0x78, 0x6b, 0x65, 0x37, - 0xec, 0xf8, 0xea, 0xf5, 0xe9, 0xf2, 0xaf, 0xd1, 0xfa, 0x36, 0xc0, 0xbf, 0x66, 0x8b, 0xbb, 0x7b, - 0x2b, 0xc3, 0x20, 0x6f, 0xad, 0x5a, 0x71, 0xf2, 0xd6, 0x9a, 0xc0, 0x31, 0x13, 0xd0, 0xc6, 0xb7, - 0x26, 0x13, 0x74, 0x85, 0x4d, 0xad, 0x01, 0x63, 0xfc, 0x52, 0x2a, 0x06, 0x19, 0x8d, 0x2b, 0xf8, - 0x95, 0xd5, 0x14, 0x35, 0xe4, 0x34, 0x14, 0x1a, 0x8d, 0xbb, 0x62, 0x90, 0xd1, 0xb2, 0x36, 0x08, - 0x3c, 0x93, 0x95, 0xb1, 0x19, 0x42, 0x73, 0x59, 0x25, 0xe3, 0x02, 0x3b, 0xc9, 0x4c, 0x2c, 0x65, - 0xe3, 0x2d, 0xaf, 0x88, 0x23, 0xf1, 0x78, 0x8b, 0x2b, 0x62, 0x7c, 0x31, 0x5c, 0x81, 0x85, 0x6a, - 0x10, 0x50, 0x9f, 0xad, 0x08, 0x61, 0x85, 0xe9, 0x8b, 0x6b, 0x8c, 0x38, 0x82, 0xb1, 0x51, 0xbb, - 0x19, 0x98, 0x7d, 0x01, 0xc9, 0x79, 0x28, 0x56, 0x7b, 0x2d, 0x87, 0xba, 0x4d, 0x2d, 0x7e, 0x9c, - 0x2d, 0xca, 0xcc, 0xa8, 0x96, 0xbc, 0x0f, 0x27, 0x12, 0xf1, 0x25, 0xc5, 0x08, 0x8c, 0xc7, 0x5c, - 0x55, 0x5e, 0xb3, 0x62, 0xcb, 0x11, 0x3e, 0x24, 0xd9, 0x98, 0xa4, 0x0a, 0xe5, 0x55, 0xf4, 0x27, - 0xab, 0x51, 0xfe, 0x88, 0xe5, 0xf9, 0xdc, 0x91, 0x90, 0x5f, 0x8a, 0x45, 0x14, 0xcd, 0x56, 0x54, - 0x69, 0xa6, 0xc0, 0xc9, 0x2d, 0x98, 0x4b, 0x96, 0xb1, 0xb3, 0x99, 0xdf, 0x7f, 0x91, 0xab, 0xa5, - 0xa8, 0xe0, 0xe9, 0x9c, 0x85, 0x45, 0xb6, 0x61, 0x36, 0xb6, 0x9c, 0xd2, 0x6f, 0xc5, 0xd2, 0x20, - 0x3b, 0xaa, 0x97, 0x37, 0xe3, 0x67, 0xc5, 0x62, 0x9c, 0x8b, 0xad, 0xb0, 0xa2, 0xdb, 0xb1, 0x99, - 0x26, 0x47, 0x5a, 0x30, 0xdd, 0x70, 0x76, 0x5d, 0xc7, 0xdd, 0xbd, 0x45, 0x0f, 0xea, 0xb6, 0xe3, - 0x0b, 0xd3, 0x58, 0x69, 0xf8, 0x5e, 0x0d, 0x0e, 0x3a, 0x1d, 0x1a, 0xfa, 0xb8, 0xeb, 0x59, 0x3d, - 0x3a, 0xcb, 0xb3, 0xdb, 0xce, 0x62, 0xc0, 0xf1, 0xd0, 0xbf, 0xb4, 0x6b, 0x3b, 0xda, 0xf1, 0xae, - 0xd3, 0xd4, 0x34, 0x13, 0xa5, 0x21, 0x35, 0x13, 0x6d, 0x98, 0x5d, 0x75, 0x9b, 0xfe, 0x01, 0xbe, - 0x25, 0xca, 0x8f, 0x9b, 0x3a, 0xe6, 0xe3, 0x5e, 0x12, 0x1f, 0xf7, 0x9c, 0x2d, 0x57, 0x58, 0xd6, - 0xe7, 0xa5, 0x09, 0x93, 0x06, 0xcc, 0xa2, 0x88, 0xbf, 0x5e, 0xab, 0xaf, 0xbb, 0x4e, 0xe8, 0xd8, - 0x21, 0x6d, 0x09, 0xb1, 0x21, 0xca, 0x53, 0xc3, 0x6f, 0xa0, 0x4e, 0xab, 0x6b, 0x39, 0x12, 0x44, - 0x25, 0x9a, 0xc2, 0x1f, 0x74, 0x0d, 0x9c, 0xf9, 0x53, 0xba, 0x06, 0xae, 0xc3, 0x4c, 0x32, 0xe6, - 0x44, 0x39, 0x3e, 0xed, 0x03, 0xac, 0x62, 0x42, 0x83, 0xd7, 0x43, 0x31, 0x51, 0x4b, 0x0d, 0x9b, - 0x88, 0x36, 0x91, 0xb8, 0x51, 0xce, 0x6a, 0x37, 0x4a, 0x8d, 0x2b, 0x3d, 0xce, 0x8d, 0xb2, 0x0e, - 0x70, 0xdd, 0xf3, 0x9b, 0xb4, 0x8a, 0x8e, 0xdc, 0x44, 0xcb, 0xe6, 0xc5, 0x88, 0xc6, 0x95, 0x7c, - 0xff, 0xec, 0xb0, 0xdf, 0x56, 0xd2, 0x1f, 0x5f, 0xa1, 0x41, 0x6c, 0x38, 0x55, 0xf7, 0xe9, 0x0e, - 0xf5, 0x7d, 0xda, 0x12, 0x37, 0x98, 0x65, 0xc7, 0x6d, 0xc9, 0x14, 0x6d, 0x22, 0x9e, 0x77, 0x57, - 0x82, 0x44, 0x86, 0xe4, 0xdb, 0x1c, 0x48, 0x3d, 0x4c, 0xfb, 0xd0, 0x31, 0x7e, 0x3c, 0x0f, 0x0b, - 0xfd, 0x7a, 0x3c, 0xe0, 0xee, 0xf7, 0x1a, 0xa4, 0x99, 0x88, 0xb8, 0x03, 0x96, 0x69, 0x92, 0x95, - 0x2c, 0x41, 0x36, 0xaf, 0x10, 0x77, 0xc2, 0xb9, 0x24, 0xc2, 0x96, 0xdf, 0x26, 0xd7, 0x60, 0x52, - 0x19, 0x1f, 0x64, 0xd7, 0xfd, 0x46, 0xd3, 0x84, 0x9d, 0x78, 0xc8, 0x4e, 0x82, 0x38, 0x2d, 0xe4, - 0x9d, 0x91, 0xff, 0x22, 0x65, 0xee, 0x2e, 0x3f, 0xc6, 0x2d, 0x22, 0x82, 0xc0, 0x23, 0x04, 0xf0, - 0x68, 0xe0, 0x5c, 0xd6, 0xc4, 0xbf, 0x8d, 0x5f, 0x2c, 0xf1, 0x43, 0x5f, 0xbd, 0x32, 0xf6, 0xb3, - 0x95, 0x4e, 0x5c, 0x25, 0xf3, 0x8f, 0x73, 0x95, 0x2c, 0x1c, 0x7f, 0x95, 0x1c, 0x39, 0xee, 0x2a, - 0x99, 0xb8, 0xeb, 0x8d, 0x3e, 0xe6, 0x5d, 0x6f, 0xfc, 0xb1, 0xee, 0x7a, 0xda, 0x35, 0xb4, 0x78, - 0xdc, 0x35, 0xf4, 0xcf, 0x6f, 0x86, 0x4f, 0xeb, 0xcd, 0x30, 0x4b, 0x2a, 0x7c, 0xac, 0x9b, 0x61, - 0xea, 0x62, 0x37, 0xfb, 0x64, 0x2e, 0x76, 0xe4, 0x89, 0x5d, 0xec, 0xe6, 0x3e, 0xee, 0xc5, 0x6e, - 0xfe, 0x49, 0x5e, 0xec, 0x4e, 0xfc, 0x59, 0xbc, 0xd8, 0x9d, 0xfc, 0xf7, 0x73, 0xb1, 0xbb, 0x0a, - 0xc5, 0xba, 0x17, 0x84, 0xd7, 0x3d, 0xbf, 0x83, 0x77, 0xcb, 0x92, 0x50, 0xc9, 0x7a, 0x01, 0xcf, - 0x92, 0xac, 0x09, 0x57, 0x02, 0x90, 0x2c, 0xcb, 0x05, 0x27, 0x6f, 0x52, 0x0b, 0xb1, 0x56, 0x5c, - 0xac, 0x14, 0x71, 0xa1, 0x4a, 0xaf, 0x37, 0x81, 0x72, 0x73, 0xa4, 0x38, 0x56, 0x1e, 0xbf, 0x39, - 0x52, 0x2c, 0x97, 0x67, 0x87, 0xb8, 0x19, 0xfe, 0x05, 0x28, 0x27, 0x85, 0xd5, 0xe3, 0xc3, 0x3d, - 0x3f, 0xb1, 0x58, 0x9b, 0x4c, 0x94, 0x4e, 0x0a, 0x8b, 0xe4, 0x32, 0x40, 0xdd, 0x77, 0x1e, 0xd8, - 0x21, 0xbd, 0x25, 0xcd, 0xfe, 0x44, 0x7c, 0x73, 0x5e, 0xca, 0x16, 0xa8, 0xa9, 0x80, 0x44, 0xf7, - 0xa4, 0x7c, 0xd6, 0x3d, 0xc9, 0xf8, 0xb1, 0x3c, 0xcc, 0xf2, 0x80, 0x75, 0x4f, 0xff, 0x9b, 0xed, - 0xbb, 0xda, 0xed, 0xf7, 0xb9, 0x38, 0xa3, 0x82, 0xda, 0xbb, 0x01, 0xaf, 0xb6, 0x1f, 0xc0, 0x89, - 0xd4, 0x50, 0xe0, 0x0d, 0xb8, 0x26, 0x43, 0x05, 0xa6, 0xee, 0xc0, 0x0b, 0xd9, 0x8d, 0xdc, 0xbb, - 0x6a, 0xa6, 0x30, 0x8c, 0x3f, 0x1a, 0x49, 0xd1, 0x17, 0xef, 0xb7, 0xea, 0x8b, 0x6c, 0xee, 0xf1, - 0x5e, 0x64, 0xf3, 0xc3, 0xbd, 0xc8, 0x26, 0x24, 0x88, 0xc2, 0x30, 0x12, 0xc4, 0xfb, 0x30, 0xb5, - 0x49, 0xed, 0x4e, 0xb0, 0xe9, 0x89, 0xf4, 0x5c, 0xdc, 0xc9, 0x44, 0x46, 0x02, 0x64, 0x75, 0xf2, - 0x02, 0x17, 0x19, 0xcb, 0x86, 0x0c, 0x81, 0x9d, 0x91, 0x3c, 0x5f, 0x97, 0xa9, 0x53, 0x50, 0x6f, - 0xe5, 0xa3, 0x03, 0x6e, 0xe5, 0x0d, 0x28, 0x09, 0xbc, 0x38, 0xc6, 0x75, 0x7c, 0x7d, 0x64, 0x55, - 0x58, 0x2e, 0x5b, 0x97, 0xde, 0x9e, 0xd3, 0x51, 0xeb, 0xfc, 0xe6, 0xa8, 0x11, 0x61, 0x43, 0xb0, - 0xea, 0xb6, 0xba, 0x9e, 0xe3, 0xe2, 0x10, 0x8c, 0xc7, 0x43, 0x40, 0x45, 0x31, 0x1f, 0x02, 0x05, - 0x88, 0xbc, 0x0d, 0xd3, 0xd5, 0xfa, 0xba, 0x8a, 0x56, 0x8c, 0x1f, 0x85, 0xed, 0xae, 0x63, 0x69, - 0xa8, 0x09, 0xd8, 0x41, 0x37, 0xa9, 0x89, 0x3f, 0x9d, 0x9b, 0x94, 0xf1, 0x1b, 0x25, 0xb9, 0xbd, - 0x3f, 0xd9, 0xa7, 0x11, 0xfd, 0xb1, 0xa3, 0xf0, 0x98, 0x8f, 0x1d, 0x23, 0xc7, 0x49, 0x99, 0x8a, - 0x30, 0x3b, 0xf6, 0xb1, 0x1f, 0x2e, 0xc6, 0x1f, 0x53, 0x3c, 0x4d, 0xec, 0x9d, 0xe2, 0x30, 0x7b, - 0x27, 0x53, 0xa4, 0x9d, 0xf8, 0xf8, 0x22, 0x2d, 0x3c, 0xb6, 0x48, 0xdb, 0x88, 0x9d, 0xb0, 0x27, - 0x8f, 0xf5, 0x6d, 0x39, 0x23, 0xb4, 0x06, 0xb3, 0xd9, 0xe1, 0x04, 0x23, 0x77, 0xec, 0x4f, 0x95, - 0x9c, 0xfc, 0xf5, 0x6c, 0x39, 0x79, 0xf0, 0xf9, 0xf1, 0xe7, 0x92, 0xf2, 0x9f, 0x4b, 0xca, 0x7f, - 0x2a, 0x92, 0xf2, 0x5d, 0x20, 0x76, 0x2f, 0xdc, 0xa3, 0x6e, 0xe8, 0x34, 0x31, 0xa4, 0x2d, 0x9b, - 0x62, 0x94, 0x99, 0xc5, 0x1e, 0x49, 0xd7, 0xaa, 0x7b, 0x44, 0xab, 0x65, 0x2b, 0x80, 0x87, 0x01, - 0x1d, 0x5a, 0x02, 0xf6, 0x71, 0x47, 0xdd, 0xb7, 0x7d, 0x17, 0xd5, 0x44, 0x97, 0x61, 0x5c, 0x86, - 0x50, 0xcd, 0xc5, 0x4a, 0xe6, 0x74, 0xec, 0x54, 0x09, 0x45, 0x96, 0xa0, 0x28, 0x91, 0xd5, 0x44, - 0x40, 0x0f, 0x45, 0x99, 0x16, 0x9d, 0x52, 0x94, 0x19, 0xff, 0xd1, 0x88, 0xe4, 0xda, 0xec, 0x83, - 0xeb, 0xb6, 0x6f, 0x77, 0x30, 0x47, 0x60, 0xb4, 0xa9, 0x14, 0xf9, 0x3b, 0xb1, 0x0f, 0x13, 0x6e, - 0x09, 0x3a, 0xca, 0x47, 0x8a, 0x81, 0x1b, 0xa7, 0x61, 0x2e, 0x0c, 0x91, 0x86, 0xf9, 0x4d, 0x2d, - 0x87, 0xf1, 0x48, 0x9c, 0x34, 0x93, 0x71, 0xb2, 0xc1, 0xd9, 0x8b, 0xaf, 0xa9, 0xc9, 0x86, 0x47, - 0xe3, 0x88, 0x64, 0x88, 0x39, 0x20, 0xcd, 0x70, 0x74, 0xa1, 0x18, 0x7b, 0x9c, 0xe8, 0xd2, 0xe3, - 0xff, 0x5e, 0xa3, 0x4b, 0xaf, 0x02, 0x88, 0xd3, 0x35, 0xb6, 0x45, 0x78, 0x19, 0x99, 0x8f, 0x30, - 0xb1, 0x0e, 0xc3, 0x76, 0x9f, 0xf4, 0x23, 0x0a, 0xa2, 0xf1, 0xaf, 0x08, 0xcc, 0x36, 0x1a, 0x77, - 0x6b, 0x8e, 0xbd, 0xeb, 0x7a, 0x41, 0xe8, 0x34, 0xd7, 0xdd, 0x1d, 0x8f, 0x49, 0xd3, 0xd1, 0x09, - 0xa0, 0xc4, 0x05, 0x8e, 0xb9, 0x7f, 0x54, 0xcd, 0x6e, 0x6b, 0xab, 0xbe, 0x2f, 0xf5, 0x99, 0xfc, - 0xb6, 0x46, 0x59, 0x81, 0xc9, 0xcb, 0x99, 0xc0, 0xda, 0xe8, 0x61, 0x54, 0x0e, 0x61, 0xf0, 0x81, - 0x02, 0x6b, 0xc0, 0x8b, 0x4c, 0x59, 0x47, 0x68, 0x7a, 0xc1, 0x8a, 0x0b, 0xcc, 0x29, 0x2d, 0x46, - 0x75, 0x5c, 0xcd, 0xf7, 0xae, 0x90, 0x3f, 0x90, 0x6b, 0x77, 0xb1, 0x5c, 0xb5, 0x81, 0x4b, 0xed, - 0x81, 0x03, 0x38, 0xa1, 0xf9, 0x6b, 0x0f, 0xfb, 0xbe, 0xf2, 0xaa, 0x10, 0x90, 0x0d, 0xb4, 0x33, - 0xce, 0x78, 0x64, 0x51, 0x93, 0xfe, 0x65, 0xb6, 0x40, 0x7e, 0x2c, 0x07, 0x67, 0x32, 0x6b, 0xa2, - 0xdd, 0x3d, 0xa9, 0xc5, 0x09, 0x57, 0x98, 0x06, 0x4f, 0x6f, 0xd8, 0xaf, 0x69, 0x2b, 0x83, 0x15, - 0x0c, 0x6e, 0x89, 0xfc, 0x5a, 0x0e, 0x4e, 0x69, 0x10, 0x11, 0xb7, 0x0c, 0xa2, 0x50, 0x26, 0x99, - 0xeb, 0xfa, 0xc3, 0x27, 0xb3, 0xae, 0x5f, 0xd4, 0xfb, 0x12, 0x73, 0x4b, 0xb5, 0x0f, 0xfd, 0xbe, - 0x90, 0x3c, 0x80, 0x59, 0xac, 0x92, 0x6f, 0x3d, 0x6c, 0xcd, 0x8a, 0x27, 0xa2, 0xf9, 0xf8, 0xb3, - 0x79, 0x0c, 0x02, 0x4c, 0x51, 0xbf, 0xf4, 0xdd, 0xc3, 0xca, 0x94, 0x06, 0x2e, 0x23, 0x6f, 0x5b, - 0xf1, 0x83, 0x91, 0xe3, 0xee, 0x78, 0x2a, 0xdf, 0x4f, 0x35, 0x41, 0xfe, 0x59, 0x8e, 0xab, 0xff, - 0x79, 0x37, 0xae, 0xfb, 0x5e, 0x27, 0xaa, 0x97, 0xc6, 0x94, 0x7d, 0x86, 0xad, 0xfd, 0x64, 0x86, - 0xed, 0x65, 0xfc, 0x64, 0xce, 0x13, 0xac, 0x1d, 0xdf, 0xeb, 0xc4, 0x9f, 0xaf, 0x0e, 0x5c, 0xdf, - 0x8f, 0x24, 0x3f, 0x94, 0x83, 0xd3, 0x9a, 0xd6, 0x52, 0x4d, 0x83, 0x22, 0x22, 0x3d, 0xcc, 0x45, - 0x31, 0x60, 0xe2, 0xaa, 0xe5, 0x4b, 0x62, 0xfd, 0x9f, 0xc3, 0x2f, 0x50, 0x42, 0x8e, 0x32, 0x20, - 0xab, 0xc3, 0xa1, 0x94, 0x4f, 0xe8, 0xdf, 0x0a, 0x71, 0x60, 0x16, 0x4d, 0x6a, 0x34, 0xa3, 0xdf, - 0xf9, 0xfe, 0x46, 0xbf, 0x51, 0x82, 0x23, 0x4c, 0x7e, 0xd0, 0xdf, 0xf2, 0x37, 0x4d, 0x95, 0xfc, - 0x00, 0x9c, 0x4e, 0x15, 0x46, 0xbb, 0xed, 0x44, 0xdf, 0xdd, 0xf6, 0xda, 0xd1, 0x61, 0xe5, 0x95, - 0xac, 0xd6, 0xb2, 0x76, 0x5a, 0xff, 0x16, 0x88, 0x0d, 0x10, 0x57, 0x0a, 0xe9, 0x27, 0x7b, 0x81, - 0xbe, 0x26, 0xd6, 0x87, 0x02, 0xcf, 0x78, 0xb9, 0xf2, 0x0d, 0xea, 0x91, 0x17, 0x03, 0x11, 0x0a, - 0x25, 0x25, 0xf1, 0xc3, 0x81, 0xb0, 0x32, 0xe9, 0xd3, 0xc8, 0x77, 0x0f, 0x2b, 0x1a, 0x34, 0xbb, - 0x03, 0xa9, 0x19, 0x25, 0x34, 0x61, 0x53, 0x05, 0x24, 0xbf, 0x9a, 0x83, 0x79, 0x56, 0x10, 0x2f, - 0x2a, 0xd1, 0xa9, 0x85, 0x41, 0xab, 0x7e, 0xef, 0xc9, 0xac, 0xfa, 0x17, 0xf0, 0x1b, 0xd5, 0x55, - 0x9f, 0x1a, 0x92, 0xcc, 0x8f, 0xc3, 0xd5, 0xae, 0x59, 0x6f, 0x69, 0xab, 0xfd, 0xf4, 0x10, 0xab, - 0x9d, 0x4f, 0xc0, 0xf1, 0xab, 0xbd, 0x6f, 0x2b, 0x64, 0x13, 0x4a, 0xe2, 0xfa, 0xc3, 0x07, 0xec, - 0x79, 0x2d, 0x04, 0xb5, 0x5a, 0xc5, 0xef, 0xa4, 0x22, 0x2f, 0x46, 0xaa, 0x87, 0x1a, 0x15, 0xe2, - 0xc2, 0x1c, 0xff, 0xad, 0xab, 0x97, 0x2a, 0x7d, 0xd5, 0x4b, 0xe7, 0x45, 0x8f, 0xce, 0x0a, 0xfa, - 0x09, 0x2d, 0x93, 0x1a, 0x3a, 0x2a, 0x83, 0x30, 0xe9, 0x02, 0xd1, 0x8a, 0xf9, 0xa6, 0x3d, 0x3b, - 0x58, 0xa9, 0xf4, 0x8a, 0x68, 0xb3, 0x92, 0x6c, 0x33, 0xb9, 0x73, 0x33, 0x68, 0x13, 0x1b, 0x66, - 0x44, 0xa9, 0xb7, 0x4f, 0x39, 0x87, 0x7f, 0x41, 0x0b, 0xde, 0x95, 0xa8, 0xe5, 0x77, 0x38, 0xd9, - 0x12, 0x06, 0x57, 0x4b, 0x30, 0xf4, 0x24, 0x3d, 0x72, 0x17, 0x66, 0xab, 0xdd, 0x6e, 0xdb, 0xa1, - 0x2d, 0xec, 0xa5, 0xd9, 0x63, 0x7d, 0x32, 0xe2, 0xd4, 0x72, 0x36, 0xaf, 0x14, 0x17, 0x4b, 0xbf, - 0x97, 0x60, 0x37, 0x29, 0x5c, 0xe3, 0x47, 0x73, 0xa9, 0x8f, 0x26, 0xaf, 0xc3, 0x04, 0xfe, 0x50, - 0xe2, 0xc1, 0xa0, 0x96, 0x86, 0x7f, 0x22, 0xea, 0x7f, 0x62, 0x00, 0x26, 0x2c, 0xa9, 0x31, 0x21, - 0x0b, 0x5c, 0x58, 0x12, 0xaa, 0x84, 0x58, 0x79, 0x50, 0x91, 0xce, 0x18, 0x85, 0x58, 0xe8, 0x42, - 0x67, 0x0c, 0xe1, 0x82, 0x61, 0xfc, 0xc3, 0xbc, 0xbe, 0xec, 0xc8, 0x79, 0x45, 0x6e, 0x57, 0xa2, - 0x52, 0x4a, 0xb9, 0x5d, 0x91, 0xd6, 0xff, 0x6e, 0x0e, 0xe6, 0xee, 0x2a, 0x89, 0x4c, 0x37, 0x3d, - 0x9c, 0x97, 0xc1, 0xa9, 0x3d, 0x9f, 0x54, 0xb6, 0x41, 0x35, 0x83, 0x2a, 0x5b, 0x29, 0xb8, 0x64, - 0xcc, 0xac, 0xef, 0x41, 0x47, 0x3d, 0xfc, 0x30, 0x25, 0xe9, 0x23, 0x07, 0xe7, 0xe5, 0x8f, 0x99, - 0x25, 0xc3, 0xf8, 0xc9, 0x3c, 0x4c, 0x2a, 0x3b, 0x86, 0x7c, 0x16, 0x4a, 0x6a, 0xb3, 0xaa, 0x8a, - 0x4f, 0xfd, 0x4a, 0x53, 0x83, 0x42, 0x1d, 0x1f, 0xb5, 0x3b, 0x9a, 0x8e, 0x8f, 0xed, 0x0b, 0x2c, - 0x7d, 0xcc, 0x9b, 0xd0, 0x7b, 0x19, 0x37, 0x21, 0x5c, 0xe5, 0x8a, 0x4e, 0x67, 0xe0, 0x7d, 0xe8, - 0xed, 0xf4, 0x7d, 0x08, 0xd5, 0x4b, 0x0a, 0x7e, 0xff, 0x5b, 0x91, 0xf1, 0xd3, 0x39, 0x28, 0x27, - 0xf7, 0xf4, 0x27, 0x32, 0x2a, 0x8f, 0xf1, 0x9e, 0xf3, 0x13, 0xf9, 0x28, 0x49, 0x8c, 0xf4, 0x56, - 0x7e, 0x5a, 0x0d, 0x0d, 0xdf, 0xd1, 0x9e, 0x5a, 0x9e, 0xd5, 0x03, 0xef, 0xa9, 0x71, 0x3e, 0xb2, - 0xa3, 0x6d, 0x8e, 0x7c, 0xfb, 0x6f, 0x55, 0x9e, 0x31, 0xbe, 0x0c, 0xf3, 0xc9, 0xe1, 0xc0, 0xe7, - 0x96, 0x2a, 0xcc, 0xe8, 0xe5, 0xc9, 0x14, 0x53, 0x49, 0x2c, 0x33, 0x09, 0x6f, 0xfc, 0x6e, 0x3e, - 0x49, 0x5b, 0x18, 0x1d, 0x32, 0x1e, 0xa5, 0xda, 0xb9, 0x08, 0x1e, 0xc5, 0x8b, 0x4c, 0x59, 0xf7, - 0x38, 0xa9, 0xdd, 0x22, 0x9f, 0xdb, 0x42, 0xb6, 0xcf, 0x2d, 0xb9, 0x96, 0xb0, 0xa0, 0x56, 0x02, - 0x44, 0x3d, 0xa4, 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, 0xb6, - 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, 0x9f, 0xb2, 0xfc, - 0x70, 0xac, 0x4b, 0x03, 0x6c, 0x62, 0xff, 0x6d, 0x9e, 0xa7, 0xfd, 0x11, 0xcb, 0xe7, 0x4d, 0x18, - 0xdb, 0xb4, 0xfd, 0x5d, 0x91, 0xd2, 0x5b, 0xa7, 0xc2, 0x2b, 0xe2, 0xf0, 0x55, 0x21, 0xfe, 0x36, - 0x05, 0x82, 0xaa, 0x3a, 0xcb, 0x0f, 0xa5, 0x3a, 0x53, 0x34, 0xf7, 0x85, 0x27, 0xa6, 0xb9, 0xff, - 0xbe, 0x28, 0xc3, 0x4f, 0x35, 0x1c, 0x22, 0x98, 0xf6, 0xd9, 0x64, 0x42, 0xad, 0x54, 0xd8, 0xf3, - 0x98, 0x1c, 0xb9, 0xa6, 0xa6, 0xe8, 0x52, 0x9c, 0x3f, 0x8f, 0x49, 0xc6, 0x65, 0xfc, 0x57, 0x05, - 0x3e, 0xc6, 0x62, 0xa0, 0xce, 0x69, 0x2e, 0xee, 0xb8, 0x4f, 0x12, 0x5a, 0x4d, 0xee, 0xec, 0x7e, - 0x0e, 0x46, 0xd8, 0xda, 0x14, 0xa3, 0x89, 0x70, 0x6c, 0xfd, 0xaa, 0x70, 0xac, 0x9e, 0xed, 0x65, - 0x3c, 0x93, 0xd4, 0xdc, 0x8b, 0x78, 0x6c, 0xa9, 0x7b, 0x19, 0x21, 0x58, 0x0f, 0xa2, 0x04, 0x16, - 0x6a, 0x0f, 0x3a, 0x3b, 0x76, 0x3a, 0x53, 0x9e, 0x92, 0x35, 0x67, 0x15, 0xa6, 0xef, 0x3b, 0x6e, - 0xcb, 0x7b, 0x18, 0xd4, 0x68, 0xb0, 0x1f, 0x7a, 0x5d, 0x61, 0x07, 0x8c, 0x1a, 0xfe, 0x87, 0xbc, - 0xc6, 0x6a, 0xf1, 0x2a, 0xf5, 0x39, 0x44, 0x47, 0x22, 0xcb, 0x30, 0xa5, 0x85, 0x80, 0x15, 0x8f, - 0x94, 0xa8, 0xe3, 0xd4, 0x03, 0xc8, 0xaa, 0x3a, 0x4e, 0x0d, 0x85, 0x9d, 0xd2, 0xe2, 0xfb, 0x95, - 0xa7, 0xca, 0xd4, 0xb7, 0x0b, 0x18, 0x72, 0x15, 0x8a, 0x3c, 0x4e, 0xc8, 0x7a, 0x4d, 0x7d, 0x9e, - 0x0a, 0xb0, 0x2c, 0x11, 0x67, 0x47, 0x02, 0xc6, 0x71, 0x21, 0xb8, 0x93, 0x9c, 0x39, 0x72, 0xc7, - 0x6b, 0x51, 0xe3, 0x33, 0x50, 0x16, 0x4c, 0x27, 0xce, 0x16, 0xff, 0x1c, 0x8c, 0xac, 0xac, 0xd7, - 0x4c, 0x95, 0x51, 0x34, 0x9d, 0x96, 0x6f, 0x62, 0x29, 0xfa, 0xc8, 0xdd, 0xa1, 0xe1, 0x43, 0xcf, - 0xdf, 0x37, 0x69, 0x10, 0xfa, 0x0e, 0x4f, 0xce, 0x89, 0x5b, 0xed, 0xb3, 0xe4, 0x6d, 0x18, 0x45, - 0xe3, 0xd4, 0x04, 0xef, 0x4f, 0xb6, 0xb1, 0x3c, 0x25, 0x96, 0xe8, 0x28, 0x5a, 0xba, 0x9a, 0x1c, - 0x89, 0xbc, 0x09, 0x23, 0x35, 0xea, 0x1e, 0x24, 0xf2, 0x06, 0xa6, 0x90, 0xa3, 0x2d, 0xdf, 0xa2, - 0xee, 0x81, 0x89, 0x28, 0xc6, 0x4f, 0xe7, 0xe1, 0x44, 0xc6, 0x67, 0xdd, 0xfb, 0xec, 0x53, 0xca, - 0xf7, 0x96, 0x35, 0xbe, 0x27, 0xdf, 0x9c, 0xfb, 0x0e, 0x7c, 0x26, 0x1b, 0xfc, 0x1b, 0x39, 0x38, - 0xa5, 0x2f, 0x56, 0x61, 0x8d, 0x7e, 0xef, 0x2a, 0x79, 0x0b, 0xc6, 0xd6, 0xa8, 0xdd, 0xa2, 0x32, - 0x49, 0xd8, 0x89, 0x28, 0xba, 0x1f, 0x0f, 0x23, 0xc0, 0x2b, 0x39, 0xd9, 0xd8, 0xe9, 0x94, 0x97, - 0x92, 0x9a, 0xf8, 0x38, 0x2e, 0xa0, 0x1b, 0x32, 0x38, 0x49, 0x56, 0x53, 0x03, 0x2c, 0x37, 0xbe, - 0x9b, 0x83, 0x67, 0x07, 0xe0, 0xb0, 0x89, 0x63, 0x53, 0xaf, 0x4e, 0x1c, 0x9e, 0x99, 0x58, 0x4a, - 0xde, 0x85, 0x99, 0x4d, 0x21, 0xe0, 0xcb, 0xe9, 0xc8, 0xc7, 0x7b, 0x47, 0xca, 0xfe, 0xd2, 0xb6, - 0xc8, 0x4c, 0x02, 0x6b, 0x51, 0x73, 0x0a, 0x03, 0xa3, 0xe6, 0xa8, 0x41, 0x68, 0x46, 0x86, 0x0d, - 0x42, 0xf3, 0x65, 0x98, 0xd7, 0xfb, 0x26, 0x62, 0x01, 0xc7, 0x21, 0x78, 0x72, 0xfd, 0x43, 0xf0, - 0x0c, 0x8c, 0x38, 0x6a, 0xfc, 0x64, 0x0e, 0xca, 0x3a, 0xed, 0x8f, 0x3b, 0x9f, 0xef, 0x68, 0xf3, - 0xf9, 0x6c, 0xf6, 0x7c, 0xf6, 0x9f, 0xc8, 0xff, 0x3d, 0x97, 0xec, 0xec, 0x50, 0x33, 0x68, 0xc0, - 0x58, 0xcd, 0xeb, 0xd8, 0x8e, 0x9c, 0x38, 0x74, 0x25, 0x69, 0x61, 0x89, 0x29, 0x6a, 0x86, 0x8b, - 0x58, 0x74, 0x16, 0x46, 0xef, 0x78, 0x6e, 0xb5, 0x26, 0x6c, 0x72, 0x91, 0x8e, 0xeb, 0xb9, 0x96, - 0xdd, 0x32, 0x79, 0x05, 0xd9, 0x00, 0x68, 0x34, 0x7d, 0x4a, 0xdd, 0x86, 0xf3, 0xfd, 0x34, 0x21, - 0x4b, 0xb0, 0x11, 0x6a, 0xf7, 0x90, 0xb1, 0xf0, 0xa7, 0x54, 0x04, 0xb4, 0x02, 0xe7, 0xfb, 0x55, - 0xde, 0xab, 0xe0, 0xe3, 0xbe, 0x12, 0x41, 0xdd, 0x12, 0xf3, 0x70, 0xe5, 0x93, 0xd8, 0x57, 0x99, - 0x4d, 0xe1, 0x08, 0x5f, 0xc9, 0x9c, 0x8e, 0xdf, 0xc9, 0xc1, 0xb3, 0x03, 0x70, 0x9e, 0xc0, 0xac, - 0xfc, 0x69, 0x0f, 0x38, 0x05, 0x88, 0x91, 0x30, 0x2d, 0xb3, 0xd3, 0x0a, 0x79, 0xe2, 0xbf, 0x29, - 0x91, 0x96, 0x99, 0x15, 0x68, 0x69, 0x99, 0x59, 0x01, 0x3b, 0x57, 0xd7, 0xa8, 0xb3, 0xbb, 0xc7, - 0x4d, 0xae, 0xa6, 0x38, 0x6f, 0xd8, 0xc3, 0x12, 0xf5, 0x5c, 0xe5, 0x30, 0xc6, 0xbf, 0x1e, 0x83, - 0xd3, 0x26, 0xdd, 0x75, 0xd8, 0xcd, 0x63, 0x2b, 0x70, 0xdc, 0x5d, 0x2d, 0x88, 0x8f, 0x91, 0xd8, - 0xb9, 0x22, 0xe3, 0x05, 0x2b, 0x89, 0x56, 0xe2, 0x05, 0x28, 0xb2, 0x63, 0x55, 0xd9, 0xbc, 0xf8, - 0x8a, 0xe5, 0x7a, 0x2d, 0x2a, 0xa2, 0x44, 0xcb, 0x6a, 0xf2, 0xaa, 0x10, 0x84, 0x94, 0x9c, 0x44, - 0x4c, 0x10, 0xfa, 0xde, 0x61, 0x05, 0x1a, 0x07, 0x41, 0x48, 0xf1, 0x12, 0x2c, 0x84, 0xa1, 0xe8, - 0xb6, 0x32, 0xd2, 0xe7, 0xb6, 0x72, 0x1b, 0xe6, 0xab, 0x2d, 0x7e, 0x3a, 0xda, 0xed, 0xba, 0xef, - 0xb8, 0x4d, 0xa7, 0x6b, 0xb7, 0xe5, 0x0d, 0x1c, 0x47, 0xd9, 0x8e, 0xea, 0xad, 0x6e, 0x04, 0x60, - 0x66, 0xa2, 0xb1, 0x6e, 0xd4, 0xee, 0x34, 0x30, 0x42, 0x8c, 0x78, 0xa0, 0xc4, 0x6e, 0xb4, 0xdc, - 0x00, 0x7b, 0x11, 0x98, 0x51, 0x35, 0xde, 0x93, 0xf0, 0x39, 0x7a, 0x73, 0xa3, 0x71, 0x4b, 0x64, - 0x4d, 0x93, 0x29, 0x13, 0xb8, 0xa1, 0x41, 0xd8, 0x0e, 0xd0, 0xbc, 0x51, 0x83, 0x8b, 0xf1, 0x1a, - 0x8d, 0x35, 0x86, 0x57, 0x4c, 0xe1, 0x05, 0xc1, 0x9e, 0x8a, 0xc7, 0xe1, 0xc8, 0x65, 0xb6, 0x14, - 0x3a, 0x5e, 0x48, 0x71, 0x09, 0x4f, 0xc4, 0xb7, 0x2a, 0x1f, 0x4b, 0xf9, 0xad, 0x4a, 0x01, 0x21, - 0x6f, 0xc3, 0xdc, 0xea, 0xca, 0x92, 0x54, 0x2b, 0xd7, 0xbc, 0x66, 0x0f, 0x0d, 0x03, 0x00, 0xdb, - 0xc3, 0x39, 0xa4, 0xcd, 0x25, 0xc6, 0x4d, 0xb2, 0xc0, 0xc8, 0x39, 0x18, 0x5f, 0xaf, 0xf1, 0xb1, - 0x9f, 0x54, 0xf3, 0x82, 0x09, 0x6b, 0x27, 0x59, 0x49, 0xee, 0xc6, 0x62, 0x7f, 0xe9, 0x58, 0xf9, - 0xfc, 0xf4, 0x10, 0x22, 0xff, 0x9b, 0x30, 0xb5, 0xec, 0x85, 0xeb, 0x6e, 0x10, 0xda, 0x6e, 0x93, - 0xae, 0xd7, 0xd4, 0x20, 0xdd, 0xdb, 0x5e, 0x68, 0x39, 0xa2, 0x86, 0x7d, 0xb9, 0x0e, 0x49, 0x3e, - 0x8f, 0xa8, 0x37, 0xa8, 0x4b, 0xfd, 0x38, 0x38, 0xf7, 0x28, 0x1f, 0x5b, 0x86, 0xba, 0x1b, 0xd5, - 0x98, 0x3a, 0x20, 0x31, 0xe1, 0x04, 0x26, 0xf9, 0xf7, 0x7a, 0x81, 0xde, 0xf8, 0x4c, 0x2c, 0xd2, - 0x76, 0x05, 0x80, 0x95, 0xfc, 0x8a, 0x6c, 0x54, 0x91, 0x07, 0x8d, 0x67, 0x2f, 0x5d, 0xf1, 0x5a, - 0x34, 0xe0, 0x1c, 0xe8, 0x53, 0x94, 0x07, 0x4d, 0xe9, 0xdb, 0x00, 0xae, 0xfc, 0x1f, 0x62, 0x1e, - 0xb4, 0x14, 0x2c, 0xf9, 0x3c, 0x8c, 0xe2, 0x4f, 0x21, 0x31, 0xcf, 0x65, 0x90, 0x8d, 0xa5, 0xe5, - 0x26, 0x83, 0x34, 0x39, 0x02, 0x59, 0x87, 0x71, 0x71, 0x1d, 0x7b, 0x9c, 0x6c, 0x3e, 0xe2, 0x5e, - 0xc7, 0x57, 0x9b, 0xc0, 0x37, 0x5a, 0x50, 0x52, 0x1b, 0x64, 0xbb, 0x6c, 0xcd, 0x0e, 0xf6, 0x68, - 0x8b, 0xfd, 0x12, 0x89, 0xf8, 0x70, 0x97, 0xed, 0x61, 0xa9, 0xc5, 0xbe, 0xc3, 0x54, 0x40, 0xd8, - 0x39, 0xbd, 0x1e, 0x6c, 0x05, 0xe2, 0x53, 0x84, 0x82, 0xc6, 0x41, 0x65, 0x5f, 0xcb, 0x14, 0x55, - 0xc6, 0xf7, 0xc1, 0xfc, 0x9d, 0x5e, 0xbb, 0x6d, 0x6f, 0xb7, 0xa9, 0x4c, 0xd4, 0x82, 0x19, 0xd1, - 0x97, 0x61, 0xb4, 0xa1, 0xe4, 0x58, 0x8f, 0x92, 0x65, 0x2a, 0x30, 0x68, 0xac, 0x9a, 0xc3, 0x08, - 0x40, 0x89, 0xec, 0xea, 0x1c, 0xd5, 0xf8, 0xed, 0x1c, 0xcc, 0x4b, 0x23, 0x03, 0xdf, 0x6e, 0xee, - 0x47, 0x89, 0xf6, 0xcf, 0x69, 0x6b, 0x0d, 0x37, 0x41, 0x62, 0x19, 0xf1, 0x55, 0x77, 0x53, 0x7e, - 0x84, 0x2e, 0x04, 0x65, 0x7d, 0xf0, 0x71, 0x1f, 0x43, 0xde, 0x86, 0x49, 0x71, 0xe4, 0x2a, 0x11, - 0x38, 0x31, 0x00, 0x99, 0xb8, 0x4e, 0x26, 0x4d, 0x5e, 0x54, 0x70, 0x94, 0xef, 0xf4, 0xae, 0x7c, - 0x5c, 0xb9, 0x22, 0x5b, 0xbe, 0xd3, 0xdb, 0x18, 0xb0, 0x74, 0xbf, 0x33, 0x99, 0x1c, 0x5b, 0xb1, - 0x76, 0xaf, 0xa9, 0x31, 0xf7, 0x72, 0xf1, 0xcd, 0x3b, 0x8e, 0xb9, 0xa7, 0xde, 0xbc, 0x23, 0xd0, - 0x68, 0x4e, 0xf2, 0xc7, 0xcc, 0xc9, 0xbb, 0x72, 0x4e, 0x0a, 0xfd, 0x17, 0xc6, 0xdc, 0x80, 0x79, - 0x68, 0xc4, 0x3b, 0x64, 0x64, 0x28, 0x65, 0xcc, 0x33, 0x98, 0x5c, 0x80, 0xa3, 0x24, 0x39, 0xb3, - 0xa0, 0xa4, 0x6a, 0x78, 0x46, 0x87, 0x27, 0x7a, 0x0c, 0xbb, 0xff, 0x02, 0x94, 0xaa, 0x61, 0x68, - 0x37, 0xf7, 0x68, 0xab, 0xc6, 0xd8, 0x93, 0x12, 0x54, 0xcb, 0x16, 0xe5, 0xea, 0xcb, 0x9c, 0x0a, - 0xcb, 0xc3, 0xdd, 0xda, 0x81, 0x30, 0x92, 0x8d, 0xc2, 0xdd, 0xb2, 0x12, 0x3d, 0xdc, 0x2d, 0x2b, - 0x21, 0x97, 0x61, 0x7c, 0xdd, 0x7d, 0xe0, 0xb0, 0x31, 0xe1, 0x71, 0xb5, 0x50, 0xa3, 0xe5, 0xf0, - 0x22, 0x95, 0xb9, 0x0a, 0x28, 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, - 0xc0, 0x4c, 0x87, 0xa0, 0x90, 0xc0, 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, 0x1e, - 0x94, 0xea, 0xb6, 0x1f, 0x3a, 0x4c, 0xee, 0x71, 0xc3, 0x60, 0x61, 0x4a, 0xd3, 0xb6, 0x2a, 0x55, - 0xcb, 0xcf, 0xcb, 0xc4, 0xdd, 0x5d, 0x05, 0x5e, 0xcf, 0x30, 0x1d, 0x97, 0x67, 0x9b, 0xc8, 0x4e, - 0x7f, 0x1c, 0x13, 0x59, 0x1c, 0x54, 0xd4, 0xb0, 0xcd, 0xc4, 0x1a, 0x1f, 0xbc, 0x08, 0x25, 0xd4, - 0x6c, 0x11, 0x20, 0xf9, 0x2a, 0x94, 0xd8, 0xdf, 0x75, 0xaf, 0xed, 0x34, 0x1d, 0x1a, 0x2c, 0x94, - 0xb1, 0x73, 0xcf, 0x67, 0xee, 0x7e, 0x04, 0x3a, 0x68, 0xd0, 0x90, 0x6f, 0x60, 0x24, 0x9c, 0x54, - 0x9d, 0x6b, 0xd4, 0xc8, 0x7b, 0x50, 0x62, 0xab, 0x6f, 0xdb, 0x0e, 0xb8, 0xb8, 0x3b, 0x1b, 0x1b, - 0x39, 0xb7, 0x44, 0x79, 0x2a, 0xe2, 0xb4, 0x8a, 0xc0, 0x8e, 0xf9, 0x6a, 0x97, 0x33, 0x48, 0xa2, - 0xac, 0xf6, 0x6e, 0x8a, 0x39, 0x4a, 0x30, 0xf2, 0x45, 0x28, 0x55, 0xbb, 0xdd, 0x98, 0xe3, 0xcc, - 0x29, 0x8a, 0xb6, 0x6e, 0xd7, 0xca, 0xe4, 0x3a, 0x1a, 0x46, 0x92, 0x31, 0xcf, 0x3f, 0x16, 0x63, - 0x26, 0x17, 0xa3, 0x1b, 0xc0, 0x89, 0x58, 0x17, 0x2c, 0x2e, 0xa3, 0xda, 0x75, 0x82, 0x5f, 0x06, - 0x56, 0x60, 0x8a, 0x2b, 0x47, 0xa5, 0x34, 0x73, 0x32, 0xb5, 0x7b, 0x32, 0x84, 0x1a, 0x1d, 0x87, - 0xac, 0xc2, 0x34, 0xf7, 0xf2, 0x6e, 0x8b, 0x50, 0xe0, 0x0b, 0xa7, 0x70, 0xd7, 0x22, 0x15, 0xee, - 0x1c, 0xde, 0xc6, 0x0c, 0x31, 0xb6, 0x46, 0x25, 0x81, 0x64, 0xfc, 0x41, 0x0e, 0x4e, 0xf5, 0x99, - 0xf1, 0x28, 0x50, 0x74, 0x6e, 0x70, 0xa0, 0x68, 0xc6, 0x39, 0x74, 0x4d, 0x0b, 0xf6, 0x3f, 0xed, - 0xbc, 0x15, 0xc9, 0x5b, 0x1e, 0x10, 0x91, 0x84, 0x49, 0x34, 0x7d, 0xd3, 0x43, 0x85, 0x6e, 0x21, - 0x7d, 0x08, 0x09, 0x38, 0xfe, 0x51, 0x3c, 0xbc, 0xa6, 0xc8, 0xf1, 0x14, 0x4d, 0xeb, 0x87, 0x9e, - 0xb6, 0x83, 0x33, 0x48, 0x1b, 0x87, 0x39, 0x98, 0x54, 0xf6, 0x21, 0x39, 0xab, 0xb8, 0x06, 0x97, - 0x79, 0x96, 0x30, 0x85, 0x42, 0x9e, 0x9f, 0x44, 0xb8, 0xa9, 0xf2, 0xc7, 0xab, 0xad, 0x31, 0x12, - 0x99, 0x12, 0x4c, 0x3b, 0x11, 0x84, 0x0c, 0xeb, 0xc9, 0x07, 0x00, 0x1b, 0x76, 0x10, 0x56, 0x9b, - 0xa1, 0xf3, 0x80, 0x0e, 0x71, 0xe8, 0xc8, 0xf0, 0x82, 0x27, 0x30, 0x2f, 0x85, 0x8d, 0x68, 0x89, - 0x33, 0x42, 0x21, 0x68, 0xfc, 0xa5, 0x1c, 0xc0, 0xd6, 0xfa, 0x0a, 0x46, 0xc3, 0xff, 0xb8, 0x42, - 0x41, 0x76, 0x84, 0x61, 0x49, 0x7d, 0x80, 0x38, 0xf0, 0x3f, 0xe4, 0x60, 0x5a, 0x07, 0x23, 0xef, - 0xc2, 0x4c, 0xa3, 0xe9, 0x7b, 0xed, 0xf6, 0xb6, 0xdd, 0xdc, 0xdf, 0x70, 0x5c, 0xca, 0xa3, 0xae, - 0x8e, 0xf2, 0xb3, 0x28, 0x88, 0xaa, 0xac, 0x36, 0xab, 0x33, 0x93, 0xc0, 0xe4, 0x87, 0x73, 0x30, - 0xd5, 0xd8, 0xf3, 0x1e, 0x46, 0x41, 0x4c, 0xc5, 0x84, 0x7c, 0xc0, 0xf6, 0x76, 0xb0, 0xe7, 0x3d, - 0x8c, 0x53, 0x8c, 0x6a, 0x16, 0xa6, 0xef, 0x0c, 0xf7, 0xf8, 0xdf, 0xf4, 0xf0, 0x3e, 0x12, 0x06, - 0x97, 0xb4, 0x46, 0x4c, 0xbd, 0x4d, 0xe3, 0x4f, 0x72, 0x30, 0x89, 0x37, 0x97, 0x76, 0x1b, 0x65, - 0xae, 0x4f, 0x53, 0xbe, 0xca, 0xa8, 0x5f, 0x03, 0x26, 0xf6, 0x0d, 0x98, 0x49, 0x80, 0x11, 0x03, - 0xc6, 0x1a, 0xe8, 0xf5, 0xaf, 0x2a, 0x3d, 0x78, 0x1c, 0x00, 0x53, 0xd4, 0x18, 0xab, 0x0a, 0xda, - 0xbd, 0x2b, 0xf8, 0x18, 0xbc, 0x04, 0xe0, 0xc8, 0x22, 0x79, 0xb3, 0x21, 0xc9, 0x2f, 0xb9, 0x77, - 0xc5, 0x54, 0xa0, 0x8c, 0x3b, 0x30, 0xd6, 0xf0, 0xfc, 0x70, 0xf9, 0x80, 0x5f, 0x26, 0x6a, 0x34, - 0x68, 0xaa, 0xaf, 0xbd, 0x0e, 0xbe, 0xc5, 0x34, 0x4d, 0x51, 0x45, 0x2a, 0x30, 0x7a, 0xdd, 0xa1, - 0xed, 0x96, 0x6a, 0x05, 0xbc, 0xc3, 0x0a, 0x4c, 0x5e, 0xce, 0x2e, 0x5c, 0x27, 0xe3, 0xa4, 0x31, - 0xb1, 0xb9, 0xf1, 0xc7, 0xdd, 0x37, 0x2b, 0xda, 0xf8, 0xbe, 0x10, 0x25, 0x6a, 0x48, 0xb7, 0x34, - 0x60, 0xa8, 0xff, 0x61, 0x0e, 0x16, 0xfb, 0xa3, 0xa8, 0x16, 0xcc, 0xb9, 0x01, 0x16, 0xcc, 0x2f, - 0x27, 0x5f, 0x27, 0x11, 0x4c, 0xbc, 0x4e, 0xc6, 0x6f, 0x92, 0x35, 0x34, 0x20, 0x6f, 0x52, 0x99, - 0x29, 0xe6, 0xec, 0x80, 0x6f, 0x46, 0x40, 0x3e, 0xcd, 0x21, 0xe2, 0x98, 0x02, 0xd7, 0xf8, 0x8d, - 0x11, 0x38, 0xdd, 0x17, 0x83, 0xac, 0x29, 0xf9, 0xa7, 0xa6, 0xa3, 0xcc, 0x37, 0x7d, 0xe1, 0x2f, - 0xe1, 0xbf, 0x68, 0x23, 0x98, 0xf4, 0x4a, 0xbb, 0x1b, 0xe5, 0x1d, 0xca, 0x23, 0xad, 0xd7, 0x8e, - 0xa5, 0xc5, 0xc1, 0x91, 0x18, 0xa4, 0x53, 0x10, 0xa1, 0xff, 0x22, 0x0d, 0x6d, 0xa7, 0x1d, 0xa8, - 0xdb, 0xae, 0xc5, 0x8b, 0x4c, 0x59, 0x17, 0x9b, 0x95, 0x8f, 0x64, 0x9b, 0x95, 0x1b, 0xff, 0x6f, - 0x0e, 0x26, 0xa2, 0xcf, 0x26, 0x8b, 0x70, 0x72, 0xd3, 0xac, 0xae, 0xac, 0x5a, 0x9b, 0x5f, 0xae, - 0xaf, 0x5a, 0x5b, 0x77, 0x1a, 0xf5, 0xd5, 0x95, 0xf5, 0xeb, 0xeb, 0xab, 0xb5, 0xf2, 0x33, 0x64, - 0x16, 0xa6, 0xb6, 0xee, 0xdc, 0xba, 0x73, 0xf7, 0xfe, 0x1d, 0x6b, 0xd5, 0x34, 0xef, 0x9a, 0xe5, - 0x1c, 0x99, 0x82, 0x09, 0x73, 0xb9, 0xba, 0x62, 0xdd, 0xb9, 0x5b, 0x5b, 0x2d, 0xe7, 0xc9, 0xff, - 0xc7, 0xde, 0xb7, 0xc5, 0x48, 0x72, 0x24, 0x87, 0x6d, 0x75, 0xf7, 0xcc, 0xf4, 0xc4, 0xbc, 0x6a, - 0x72, 0x67, 0x77, 0x67, 0xdf, 0xbb, 0x45, 0x72, 0x45, 0x0e, 0x8f, 0x3c, 0xee, 0xd2, 0x3c, 0x72, - 0x4f, 0x7c, 0xa8, 0xa6, 0xbb, 0x66, 0xa6, 0x77, 0xfb, 0xc5, 0xaa, 0x9e, 0x5d, 0xed, 0x51, 0x52, - 0xa9, 0xb6, 0xbb, 0x66, 0xa6, 0xb8, 0x3d, 0x5d, 0xcd, 0xaa, 0x6a, 0x2e, 0xe7, 0x60, 0xc0, 0x27, - 0x08, 0x3e, 0x01, 0x96, 0x65, 0x9d, 0xe5, 0x33, 0x4c, 0x08, 0x36, 0x64, 0xc0, 0x07, 0x43, 0x1f, - 0x02, 0xfc, 0x6b, 0xf8, 0xbe, 0x0e, 0xfe, 0x11, 0x70, 0x90, 0x61, 0xc3, 0x7f, 0x27, 0x83, 0x90, - 0xce, 0xb0, 0x61, 0x08, 0xfe, 0x13, 0xec, 0x0f, 0x01, 0x02, 0x8c, 0x8c, 0xcc, 0xac, 0xca, 0x7a, - 0x74, 0xef, 0xec, 0x91, 0x67, 0x5b, 0x80, 0xbe, 0x66, 0x3a, 0x32, 0x22, 0x2a, 0xdf, 0x19, 0x19, - 0x11, 0x19, 0xa1, 0xc2, 0x72, 0xad, 0xd3, 0x6e, 0x1b, 0xb5, 0x5e, 0xe3, 0x41, 0xa3, 0xf7, 0x48, - 0x2d, 0x13, 0x02, 0xab, 0x88, 0xd0, 0x35, 0x1b, 0xed, 0x5a, 0xa3, 0xab, 0x37, 0xd5, 0x0a, 0x85, - 0x51, 0x7c, 0x09, 0x36, 0x17, 0x33, 0xba, 0xbf, 0xbf, 0x6d, 0xa8, 0xf3, 0x14, 0x85, 0xfe, 0x27, - 0xa1, 0x2c, 0xd0, 0xcf, 0x23, 0x4a, 0x5d, 0xef, 0xe9, 0xdb, 0xba, 0x65, 0xa8, 0x55, 0x72, 0x01, - 0xce, 0xa6, 0x40, 0x76, 0xb3, 0xb3, 0xdb, 0x68, 0xab, 0x8b, 0x64, 0x03, 0xd4, 0x18, 0x56, 0xdf, - 0xb6, 0xf7, 0x2d, 0xc3, 0x54, 0x21, 0x0b, 0x6d, 0xeb, 0x2d, 0x43, 0x5d, 0xd2, 0xde, 0x63, 0xef, - 0x05, 0x59, 0x57, 0x93, 0xf3, 0x40, 0xac, 0x9e, 0xde, 0xdb, 0xb7, 0x32, 0x8d, 0x5f, 0x82, 0x05, - 0x6b, 0xbf, 0x56, 0x33, 0x2c, 0x4b, 0x55, 0x08, 0xc0, 0xfc, 0x8e, 0xde, 0x68, 0x1a, 0x75, 0xb5, - 0xa4, 0x7d, 0x4f, 0x81, 0x75, 0x21, 0x01, 0x0a, 0x43, 0xd4, 0x97, 0x5c, 0x8b, 0xef, 0xa7, 0x2e, - 0xb6, 0xe2, 0xf1, 0x57, 0xe6, 0x23, 0x33, 0x96, 0xe1, 0x3f, 0x57, 0xe0, 0x5c, 0x21, 0x36, 0x79, - 0x04, 0xaa, 0xa8, 0x41, 0xcb, 0x89, 0xfa, 0x47, 0xc9, 0x3e, 0x76, 0x2d, 0xf3, 0x95, 0x0c, 0x1a, - 0x53, 0x95, 0x26, 0x19, 0xb1, 0x73, 0x6c, 0x4e, 0x9f, 0xaf, 0x41, 0xfb, 0x5c, 0x81, 0x0b, 0x53, - 0x3e, 0x43, 0x6a, 0x30, 0x1f, 0x67, 0xee, 0x99, 0xe1, 0x26, 0xb7, 0xf1, 0x93, 0x2f, 0xae, 0x73, - 0x44, 0x4c, 0x21, 0x8c, 0xff, 0x99, 0xf3, 0x71, 0x2a, 0x1e, 0xcc, 0x87, 0xc3, 0xba, 0xef, 0x62, - 0xa6, 0xe7, 0xf9, 0x97, 0xf4, 0x87, 0xd6, 0xf6, 0x12, 0xef, 0xbb, 0xb2, 0xf3, 0x34, 0xc4, 0x84, - 0x38, 0xda, 0xf7, 0x15, 0x2a, 0xdc, 0x65, 0x11, 0xa9, 0xcc, 0xab, 0x87, 0xe1, 0xe4, 0xd8, 0x35, - 0xfd, 0xa1, 0xab, 0x9b, 0x6d, 0x7e, 0x6c, 0xa0, 0xb4, 0xea, 0x60, 0x01, 0x5e, 0x2b, 0x6c, 0x27, - 0x48, 0x3d, 0xf7, 0x4f, 0xd1, 0x90, 0xbb, 0x00, 0xc6, 0x67, 0x91, 0x1b, 0x8c, 0x9c, 0x61, 0x1c, - 0xb8, 0x85, 0x45, 0xb4, 0xe2, 0xd0, 0xb4, 0xbc, 0x2d, 0x21, 0x6b, 0xdf, 0x55, 0x60, 0x99, 0x5f, - 0x9a, 0xf4, 0xa1, 0x1b, 0x44, 0x5f, 0x6e, 0x7a, 0xdd, 0x4d, 0x4d, 0xaf, 0xf8, 0x55, 0x88, 0xc4, - 0x9f, 0x16, 0x17, 0xce, 0xac, 0xff, 0xa0, 0x80, 0x9a, 0x45, 0x24, 0xef, 0x43, 0xd5, 0x72, 0x3f, - 0x75, 0x03, 0x2f, 0x3a, 0xe1, 0x1b, 0xa5, 0xc8, 0x71, 0xc8, 0x70, 0x78, 0x19, 0x9b, 0x0f, 0x21, - 0xff, 0x65, 0xc6, 0x34, 0xa7, 0xdd, 0xef, 0x25, 0xb5, 0x47, 0xf9, 0xab, 0x52, 0x7b, 0x68, 0x7f, - 0x56, 0x82, 0x0b, 0xbb, 0x6e, 0x24, 0xb7, 0x29, 0x76, 0x5f, 0x78, 0xe3, 0x74, 0xed, 0x92, 0x5a, - 0xb2, 0x09, 0x0b, 0x58, 0x24, 0xc6, 0xd7, 0x14, 0x3f, 0xc9, 0x76, 0x3c, 0xaf, 0xcb, 0xa9, 0x24, - 0x6a, 0x53, 0xbe, 0xfd, 0xba, 0x94, 0x56, 0x29, 0x9e, 0xd6, 0xb7, 0x60, 0x15, 0x23, 0xfa, 0x4f, - 0xe8, 0x72, 0x70, 0x07, 0x5c, 0xfd, 0x53, 0x35, 0x33, 0x50, 0xb2, 0x05, 0x2a, 0x85, 0xe8, 0xfd, - 0x27, 0x23, 0xff, 0xe9, 0xd0, 0x1d, 0x1c, 0xba, 0x03, 0x3c, 0xd6, 0xab, 0x66, 0x0e, 0x2e, 0x78, - 0xee, 0x8f, 0xd8, 0xd5, 0xcd, 0x1d, 0xa0, 0x8e, 0x86, 0xf3, 0x4c, 0xa0, 0x97, 0xee, 0xc2, 0xd2, - 0xcf, 0x98, 0x22, 0x4d, 0xfb, 0x53, 0x05, 0x36, 0xb0, 0x71, 0xd2, 0x87, 0x45, 0xfa, 0x5a, 0xd1, - 0x5b, 0x52, 0xd6, 0x20, 0x87, 0x82, 0xd2, 0x4b, 0x21, 0xee, 0xc5, 0x44, 0x27, 0x54, 0x3a, 0x85, - 0x4e, 0xc8, 0x7a, 0x9e, 0x54, 0xfd, 0xa7, 0x54, 0x69, 0xdd, 0xab, 0x54, 0xcb, 0x6a, 0x25, 0x19, - 0x72, 0xed, 0x37, 0x4b, 0xb0, 0x60, 0xba, 0x98, 0xc3, 0x9c, 0xdc, 0x82, 0x85, 0xb6, 0x1f, 0xb9, - 0x61, 0x2b, 0x95, 0xb0, 0x7e, 0x44, 0x41, 0xf6, 0xf1, 0xc0, 0x14, 0x85, 0x74, 0xc2, 0x77, 0x03, - 0x7f, 0x30, 0xe9, 0x47, 0xf2, 0x84, 0x1f, 0x33, 0x90, 0x29, 0xca, 0xc8, 0xd7, 0x60, 0x91, 0x73, - 0x8e, 0x0d, 0xc5, 0xe8, 0xf1, 0x1c, 0xb8, 0x71, 0x0e, 0xfc, 0x04, 0x01, 0x65, 0x5a, 0x26, 0x60, - 0x54, 0x24, 0x99, 0x36, 0x27, 0x33, 0x08, 0x51, 0x7d, 0x6e, 0x86, 0xa8, 0xfe, 0x06, 0xcc, 0xeb, - 0x61, 0xe8, 0x46, 0x22, 0xda, 0xc1, 0x72, 0x1c, 0x2e, 0x2e, 0x74, 0x23, 0xc6, 0xd8, 0xc1, 0x72, - 0x93, 0xe3, 0x69, 0x7f, 0x59, 0x82, 0x39, 0xfc, 0x17, 0xcd, 0xb0, 0x41, 0xff, 0x28, 0x65, 0x86, - 0x0d, 0xfa, 0x47, 0x26, 0x42, 0xc9, 0x6d, 0xd4, 0x54, 0x88, 0x04, 0x57, 0xbc, 0xf5, 0xa8, 0x82, - 0x1f, 0x24, 0x60, 0x53, 0xc6, 0x89, 0xbd, 0x06, 0xca, 0x85, 0x31, 0x4e, 0xce, 0x43, 0xa9, 0x63, - 0xf1, 0x16, 0x63, 0x98, 0x2c, 0x3f, 0x34, 0x4b, 0x1d, 0x0b, 0x7b, 0x63, 0x4f, 0xbf, 0xf3, 0xd6, - 0x37, 0x78, 0x43, 0x59, 0x6f, 0x1c, 0x39, 0x77, 0xde, 0xfa, 0x86, 0xc9, 0x4b, 0x68, 0xff, 0x62, - 0x9d, 0xd1, 0x98, 0xcb, 0xde, 0xf2, 0x63, 0xff, 0x62, 0xdb, 0xd0, 0x70, 0x6b, 0x26, 0x08, 0xe4, - 0x0e, 0x2c, 0xf1, 0x98, 0x10, 0x88, 0x2f, 0xc5, 0x6c, 0xe0, 0x31, 0x23, 0x18, 0x85, 0x8c, 0xc4, - 0xcc, 0x7a, 0x7c, 0x80, 0x44, 0x1a, 0x5e, 0x6e, 0xd6, 0x13, 0x43, 0x18, 0x9a, 0x12, 0x0a, 0xad, - 0x12, 0xb3, 0x0b, 0x26, 0x6f, 0xf4, 0xb1, 0x4a, 0xdc, 0x78, 0x88, 0xd9, 0x13, 0x62, 0x04, 0xed, - 0x0f, 0x4b, 0x50, 0xed, 0x0e, 0x27, 0x87, 0xde, 0xe8, 0xc1, 0x6d, 0x42, 0x00, 0xaf, 0x71, 0x22, - 0xbd, 0x06, 0xfd, 0x9f, 0x5c, 0x84, 0xaa, 0xb8, 0xb9, 0x89, 0x0d, 0x29, 0xe4, 0xb7, 0xb6, 0x4d, - 0x10, 0xe3, 0xce, 0xe3, 0xa1, 0x89, 0x9f, 0xe4, 0x36, 0xc4, 0xf7, 0xaf, 0x69, 0x17, 0xb5, 0x0a, - 0x5d, 0x2c, 0x66, 0x8c, 0x46, 0x5e, 0x03, 0x3c, 0x24, 0xf8, 0xe5, 0x41, 0x28, 0xb4, 0x59, 0xd5, - 0xb8, 0x9c, 0xc2, 0x48, 0x10, 0x8d, 0xbc, 0x09, 0x7c, 0x62, 0xf2, 0x74, 0xef, 0xe7, 0xd2, 0x04, - 0x2c, 0x81, 0xa6, 0x20, 0xe1, 0xa8, 0xe4, 0x5d, 0x58, 0xea, 0x07, 0x2e, 0x5a, 0x32, 0x9d, 0x61, - 0x92, 0xc5, 0x5d, 0xa6, 0xac, 0x25, 0xe5, 0x0f, 0x6e, 0x9b, 0x32, 0xba, 0xf6, 0xfd, 0x45, 0x58, - 0x96, 0xeb, 0x43, 0x4c, 0x38, 0x1b, 0x0e, 0xe9, 0xdd, 0x9d, 0x3b, 0xb3, 0x8d, 0xb1, 0x90, 0x1f, - 0xa7, 0x37, 0xd2, 0x15, 0xa2, 0x78, 0xcc, 0xb3, 0x4d, 0x04, 0xb3, 0xd8, 0x3b, 0x63, 0xae, 0x87, - 0x09, 0x98, 0xe1, 0x11, 0x1d, 0xaa, 0xfe, 0x38, 0x3c, 0x74, 0x47, 0x9e, 0xb0, 0xb7, 0xbc, 0x90, - 0x62, 0xd4, 0xe1, 0x85, 0x39, 0x5e, 0x31, 0x19, 0x79, 0x0b, 0xe6, 0xfd, 0xb1, 0x3b, 0x72, 0x3c, - 0x7e, 0xc6, 0x5d, 0xce, 0x30, 0x70, 0x47, 0x7a, 0x43, 0x22, 0xe4, 0xc8, 0xe4, 0xeb, 0x50, 0xf1, - 0x9f, 0xc4, 0xe3, 0x75, 0x31, 0x4d, 0xf4, 0x24, 0x72, 0x24, 0x12, 0x44, 0xa4, 0x04, 0x1f, 0x3b, - 0xc7, 0x07, 0x7c, 0xc4, 0xd2, 0x04, 0xf7, 0x9c, 0xe3, 0x03, 0x99, 0x80, 0x22, 0x92, 0x0f, 0x00, - 0xc6, 0xce, 0xa1, 0x1b, 0xd8, 0x83, 0x49, 0x74, 0xc2, 0xc7, 0xed, 0x5a, 0x8a, 0xac, 0x4b, 0x8b, - 0xeb, 0x93, 0xe8, 0x44, 0xa2, 0x5d, 0x1c, 0x0b, 0x20, 0xd1, 0x01, 0x8e, 0x9d, 0x28, 0x72, 0x83, - 0x63, 0x9f, 0x7b, 0x13, 0x26, 0xc1, 0x0f, 0x19, 0x83, 0x56, 0x5c, 0x2c, 0x71, 0x90, 0x88, 0xb0, - 0xd2, 0x5e, 0xe0, 0xf0, 0xa4, 0xfb, 0x99, 0x4a, 0x7b, 0x41, 0xaa, 0x95, 0x14, 0x91, 0xbc, 0x03, - 0x0b, 0x03, 0x2f, 0xec, 0xfb, 0xc1, 0x80, 0x47, 0x39, 0xb9, 0x92, 0xa2, 0xa9, 0xb3, 0x32, 0x89, - 0x4c, 0xa0, 0xd3, 0xda, 0xf2, 0xe0, 0xa7, 0x6d, 0xff, 0x29, 0xaa, 0xf9, 0xb3, 0xb5, 0xb5, 0xe2, - 0x62, 0xb9, 0xb6, 0x09, 0x11, 0x1d, 0xca, 0x43, 0x2f, 0x1a, 0x3a, 0x8f, 0xb9, 0xed, 0x3c, 0x3d, - 0x94, 0xbb, 0x58, 0x24, 0x0f, 0x25, 0x43, 0x26, 0x77, 0xa1, 0xea, 0x8e, 0xa2, 0xc0, 0xb1, 0xbd, - 0x01, 0x7f, 0x8a, 0x99, 0xae, 0x34, 0x3d, 0x80, 0x9d, 0x46, 0x5d, 0xae, 0x34, 0xe2, 0x37, 0x06, - 0xb4, 0x7f, 0xc2, 0xbe, 0x77, 0xcc, 0x5f, 0x50, 0xa6, 0xfb, 0xc7, 0xaa, 0x35, 0x5a, 0x72, 0xff, - 0x50, 0x44, 0xf2, 0x3e, 0x2c, 0xd0, 0xf5, 0x3b, 0xf0, 0x0f, 0x79, 0xa0, 0x09, 0x2d, 0xdd, 0x3f, - 0xac, 0x2c, 0x37, 0x5d, 0x05, 0x11, 0x5d, 0xc8, 0xce, 0xd3, 0xd0, 0xf6, 0xfa, 0x18, 0x13, 0x33, - 0xbb, 0x1c, 0xf5, 0x87, 0x56, 0xa3, 0x26, 0x91, 0xcd, 0x39, 0x4f, 0xc3, 0x46, 0x9f, 0xdc, 0x81, - 0x39, 0xcc, 0x3c, 0xc1, 0x03, 0x60, 0xa6, 0x69, 0x30, 0xe7, 0x84, 0x4c, 0x83, 0xa8, 0x74, 0x20, - 0x8f, 0x43, 0x7c, 0x94, 0xc2, 0xf3, 0x3f, 0xa4, 0xfb, 0xa4, 0x65, 0xe1, 0x4b, 0x15, 0xb9, 0x8a, - 0x1c, 0x9d, 0x56, 0x71, 0xe4, 0x46, 0xb6, 0xf7, 0x09, 0xcf, 0xe0, 0x90, 0xfe, 0x5c, 0xdb, 0x8d, - 0x1a, 0x1f, 0xca, 0x9f, 0x1b, 0xb9, 0x51, 0xe3, 0x13, 0x3e, 0x74, 0x47, 0x93, 0xc7, 0xa8, 0x4b, - 0x2f, 0x18, 0xba, 0xa3, 0x49, 0x76, 0xe8, 0x8e, 0x26, 0x8f, 0xc9, 0x35, 0x80, 0xc4, 0x0b, 0x81, - 0xd9, 0x77, 0x4c, 0x09, 0xf2, 0xcd, 0xca, 0xff, 0xf8, 0x97, 0xd7, 0x95, 0x6d, 0x80, 0xaa, 0x88, - 0x9a, 0x43, 0xe5, 0xe9, 0x8d, 0x22, 0xa6, 0xe4, 0x26, 0x2c, 0xcb, 0x31, 0x7d, 0xf8, 0xae, 0xbe, - 0xe4, 0x8c, 0x3d, 0x11, 0xd5, 0x67, 0x76, 0x22, 0x84, 0x57, 0x61, 0x3d, 0xf5, 0x04, 0x28, 0x71, - 0x08, 0x34, 0x55, 0xb9, 0x00, 0x0f, 0xd1, 0x1a, 0x40, 0x18, 0x39, 0x41, 0x64, 0x0f, 0x9c, 0xe8, - 0x34, 0xea, 0xdd, 0x2a, 0xdd, 0x98, 0x99, 0xc7, 0x35, 0xd2, 0xd5, 0x9d, 0xc8, 0x65, 0x8d, 0xd3, - 0x9a, 0x70, 0x71, 0xea, 0xa6, 0x49, 0x5e, 0x01, 0xf5, 0xc0, 0xe1, 0x2a, 0xd3, 0xfe, 0x91, 0x33, - 0x1a, 0xb9, 0x43, 0xde, 0xb0, 0x35, 0x01, 0xaf, 0x31, 0x30, 0xe7, 0xf6, 0x81, 0xd4, 0x3b, 0xd2, - 0x6a, 0x39, 0x45, 0xef, 0x70, 0x06, 0x3f, 0x54, 0xe0, 0xca, 0xac, 0xbd, 0x97, 0x5c, 0x82, 0xea, - 0x38, 0xf0, 0x7c, 0x94, 0xf1, 0x79, 0x1f, 0x8a, 0xdf, 0x98, 0x27, 0x02, 0x85, 0xd1, 0xc8, 0x39, - 0xe4, 0x6f, 0x6a, 0xcc, 0x45, 0x84, 0xf4, 0x9c, 0xc3, 0x90, 0x76, 0xf1, 0xc0, 0x3d, 0x70, 0x26, - 0xc3, 0xc8, 0x0e, 0xfb, 0x47, 0xee, 0x00, 0x5f, 0xbd, 0xa1, 0x27, 0xa5, 0xa9, 0xf2, 0x02, 0x4b, - 0xc0, 0x73, 0x35, 0x9e, 0x9b, 0x52, 0xe3, 0x7b, 0x95, 0xaa, 0xa2, 0x96, 0x4c, 0x74, 0x5d, 0xd3, - 0xbe, 0x53, 0x82, 0xcd, 0x69, 0x9b, 0x0d, 0x79, 0xaf, 0xa8, 0x0f, 0x98, 0xd5, 0x47, 0x86, 0xcb, - 0x56, 0x1f, 0x79, 0xf6, 0xdc, 0x81, 0xf8, 0xcd, 0xda, 0xb3, 0xe2, 0x4f, 0x08, 0x18, 0xa5, 0x19, - 0x3b, 0x61, 0xf8, 0x94, 0xee, 0xa7, 0x65, 0x29, 0x0a, 0x31, 0x87, 0xc9, 0x34, 0x02, 0x46, 0xde, - 0x06, 0xe8, 0x0f, 0xfd, 0xd0, 0x45, 0xe7, 0x0a, 0x2e, 0xa8, 0x31, 0x4f, 0xfc, 0x18, 0x2a, 0x5b, - 0xd3, 0x11, 0x5a, 0xf3, 0x07, 0x62, 0x3e, 0x39, 0x70, 0x61, 0xca, 0xe9, 0x42, 0x87, 0x07, 0x1f, - 0xa1, 0xb1, 0xcd, 0x84, 0xe7, 0xff, 0xa2, 0x10, 0x96, 0xb7, 0x26, 0xdb, 0xe3, 0xa5, 0x69, 0x73, - 0xe4, 0x04, 0x48, 0xfe, 0x08, 0xa1, 0xdc, 0xb9, 0xe7, 0xf9, 0x24, 0x88, 0xb9, 0x33, 0xc8, 0x7e, - 0x30, 0x24, 0xd7, 0x61, 0x49, 0x64, 0x2a, 0xa5, 0x17, 0x21, 0xc6, 0x1c, 0x38, 0xe8, 0xbe, 0x8b, - 0x93, 0x07, 0x63, 0xc0, 0xe2, 0xcb, 0x44, 0xbe, 0xf2, 0x16, 0x11, 0xd2, 0x3b, 0x19, 0x8b, 0xd6, - 0x5d, 0x11, 0xf3, 0x3b, 0x7d, 0xb0, 0xf3, 0xd2, 0x7f, 0xaa, 0x88, 0xe1, 0xcf, 0x9f, 0x8c, 0xcf, - 0xaa, 0x1f, 0x01, 0x7c, 0x18, 0xc6, 0x2b, 0x86, 0xff, 0x53, 0x91, 0x4f, 0xac, 0x3a, 0x2e, 0xf2, - 0xf1, 0x9f, 0xe4, 0x16, 0xac, 0x05, 0xcc, 0xb1, 0x38, 0xf2, 0x79, 0x7f, 0xb2, 0xb4, 0x28, 0x2b, - 0x0c, 0xdc, 0xf3, 0xb1, 0x4f, 0x79, 0xbd, 0xee, 0xc5, 0x1d, 0x26, 0x09, 0x0a, 0xe4, 0x75, 0x58, - 0xa4, 0x82, 0x02, 0x86, 0x1f, 0xca, 0xbc, 0x48, 0x41, 0x3c, 0x14, 0xbb, 0xcc, 0xea, 0xc7, 0xfc, - 0x7f, 0xce, 0xeb, 0xdf, 0x96, 0x04, 0x33, 0x59, 0x4c, 0x21, 0x17, 0x60, 0xc1, 0x0f, 0x0e, 0xa5, - 0xa6, 0xcd, 0xfb, 0xc1, 0x21, 0x6d, 0xd7, 0xcb, 0xa0, 0xb2, 0x07, 0x52, 0x2c, 0x50, 0x45, 0x78, - 0x32, 0x62, 0x7a, 0x8c, 0xaa, 0xb9, 0xca, 0xe0, 0xfb, 0xa1, 0x1b, 0x58, 0x27, 0xa3, 0x3e, 0xc5, - 0x0c, 0x43, 0xdf, 0x96, 0xa3, 0x88, 0xf1, 0x66, 0xaf, 0x86, 0xa1, 0x9f, 0x84, 0x13, 0x1b, 0x90, - 0x6d, 0x58, 0xa1, 0x7c, 0xe2, 0x58, 0x66, 0x7c, 0x07, 0xbc, 0x9a, 0x97, 0xa2, 0x4e, 0x46, 0x7d, - 0x51, 0x45, 0x73, 0x39, 0x94, 0x7e, 0x91, 0xfb, 0xa0, 0x4a, 0xe2, 0x26, 0xbe, 0x98, 0xcd, 0x38, - 0xb9, 0x27, 0x6c, 0x24, 0x31, 0xb5, 0x31, 0x3a, 0xf0, 0xcd, 0xb5, 0x7e, 0x1a, 0x10, 0xef, 0x04, - 0xf3, 0xea, 0x82, 0xb9, 0xc9, 0x9b, 0x1b, 0xa2, 0xf7, 0xa4, 0x3d, 0xf4, 0x0f, 0x6d, 0xf7, 0x33, - 0x3a, 0x26, 0xda, 0x1f, 0x28, 0x62, 0xaf, 0x2d, 0x60, 0x4a, 0x34, 0x58, 0x39, 0x72, 0x42, 0x3b, - 0x0c, 0x8f, 0x99, 0x53, 0x1f, 0x0f, 0xa5, 0xbc, 0x74, 0xe4, 0x84, 0x56, 0x78, 0x2c, 0xf2, 0xb6, - 0x9c, 0xa3, 0x38, 0xbe, 0x33, 0x89, 0x8e, 0x6c, 0x59, 0xb8, 0x66, 0x3d, 0x7a, 0xf6, 0xc8, 0x09, - 0x3b, 0xb4, 0x4c, 0xe2, 0x4d, 0x5e, 0x84, 0x55, 0xe4, 0xdb, 0xf7, 0x04, 0x63, 0x0c, 0x46, 0x62, - 0x2e, 0x53, 0xc6, 0x7d, 0x8f, 0x71, 0xe6, 0x83, 0xfb, 0xe3, 0x0a, 0x9c, 0x2f, 0xee, 0x3d, 0x9c, - 0xbe, 0xb4, 0xcf, 0xf1, 0xd9, 0x24, 0xaf, 0xdb, 0x22, 0x85, 0xb0, 0x40, 0x32, 0x45, 0x83, 0x57, - 0x2a, 0x1c, 0xbc, 0x2d, 0x58, 0x47, 0x46, 0x5c, 0x8c, 0x1f, 0x7a, 0x61, 0xc4, 0xe3, 0xa3, 0x98, - 0x6b, 0xb4, 0x80, 0xed, 0xf7, 0x4d, 0x0a, 0x26, 0x2f, 0xc1, 0xaa, 0xd8, 0xb1, 0xfd, 0xa7, 0x23, - 0xfa, 0x61, 0xb6, 0x5d, 0xaf, 0x70, 0x68, 0x07, 0x81, 0xe4, 0x1c, 0xcc, 0x3b, 0xe3, 0x31, 0xfd, - 0x24, 0xdb, 0xa5, 0xe7, 0x9c, 0xf1, 0x98, 0xe5, 0x16, 0xc2, 0x47, 0xa2, 0xf6, 0x01, 0xba, 0x60, - 0x71, 0x1f, 0x52, 0x73, 0x19, 0x81, 0xcc, 0x2d, 0x2b, 0xa4, 0xfb, 0x02, 0xa5, 0x15, 0x28, 0x0b, - 0x88, 0x02, 0xce, 0x38, 0x46, 0xb8, 0x08, 0x55, 0xe1, 0x0c, 0xc0, 0x5e, 0xc5, 0x98, 0x0b, 0x0e, - 0x77, 0x04, 0x78, 0x0b, 0x2e, 0x0c, 0xbc, 0x90, 0x8f, 0x36, 0x6d, 0xd2, 0x78, 0xcc, 0x9f, 0xa5, - 0xb2, 0x30, 0xc6, 0xe6, 0x06, 0x2f, 0xa6, 0x3d, 0xa9, 0x8f, 0xc7, 0xf1, 0xe3, 0xd4, 0x4b, 0x82, - 0xec, 0xb1, 0xc7, 0xe2, 0xb5, 0x31, 0x87, 0x58, 0x5c, 0x1c, 0x80, 0x94, 0x9b, 0x1c, 0x63, 0x5b, - 0x46, 0x10, 0xcb, 0x24, 0x5e, 0x49, 0x36, 0x53, 0x1e, 0x72, 0xc9, 0x05, 0x4d, 0xc6, 0x38, 0x68, - 0x08, 0x25, 0x6f, 0xc3, 0xd4, 0xb9, 0x88, 0x12, 0x6e, 0xd5, 0x3c, 0xc7, 0xca, 0x99, 0xa3, 0x6f, - 0xd3, 0x3f, 0x34, 0xb0, 0x90, 0x7c, 0x00, 0x57, 0x44, 0x05, 0x9d, 0x30, 0xf4, 0x0e, 0x47, 0xb6, - 0x18, 0x05, 0xf4, 0xc5, 0x40, 0x29, 0xb7, 0x6a, 0x5e, 0xe4, 0x38, 0x3a, 0xa2, 0xd4, 0x19, 0x06, - 0x3e, 0x6b, 0xe4, 0xb3, 0xe9, 0x1d, 0x58, 0xe3, 0x02, 0x3b, 0x17, 0x12, 0xb0, 0xb7, 0xf9, 0x16, - 0x46, 0x6f, 0xd2, 0x3c, 0x5f, 0x15, 0x70, 0x50, 0x63, 0x20, 0x28, 0xff, 0x8b, 0x02, 0xe7, 0x0a, - 0x25, 0x7e, 0xf2, 0xeb, 0xc0, 0xde, 0x19, 0x46, 0xbe, 0x1d, 0xb8, 0x7d, 0x6f, 0xec, 0x61, 0xe0, - 0x16, 0xa6, 0x11, 0xbf, 0x33, 0xeb, 0xae, 0x80, 0x6f, 0x16, 0x7b, 0xbe, 0x19, 0x13, 0x31, 0x55, - 0x9d, 0x1a, 0x64, 0xc0, 0x97, 0x3e, 0x82, 0x73, 0x85, 0xa8, 0x05, 0x2a, 0xb4, 0xaf, 0xa5, 0x93, - 0xa5, 0x0b, 0x1b, 0x67, 0xa6, 0xd1, 0x92, 0x6a, 0x8d, 0x37, 0xef, 0x47, 0x71, 0xf3, 0x32, 0x77, - 0x03, 0x62, 0x64, 0x77, 0xb6, 0xa2, 0xeb, 0xad, 0x20, 0x9a, 0xbe, 0xb9, 0x7d, 0x04, 0xe7, 0xf8, - 0xf2, 0x3a, 0x0c, 0x9c, 0xf1, 0x51, 0xc2, 0x8e, 0x55, 0xf4, 0x17, 0x8a, 0xd8, 0xb1, 0x75, 0xb7, - 0x4b, 0xf1, 0x63, 0xae, 0x67, 0x9d, 0x3c, 0x90, 0xb7, 0xe1, 0x37, 0x4a, 0x62, 0x33, 0x2b, 0xa8, - 0x4e, 0xc1, 0xc2, 0x55, 0x8a, 0x16, 0xee, 0xe9, 0x77, 0x8d, 0x36, 0x10, 0x79, 0xbb, 0xe6, 0xf3, - 0x9e, 0xf9, 0xe3, 0x89, 0x6b, 0x1e, 0xaf, 0x88, 0xb4, 0xf9, 0xb1, 0x85, 0x60, 0xae, 0xf7, 0xb3, - 0x20, 0x2a, 0x8b, 0xc7, 0xf9, 0xe0, 0xf9, 0xd1, 0x59, 0x65, 0x80, 0xc6, 0x80, 0xdc, 0x80, 0x65, - 0x76, 0xa3, 0x4b, 0xed, 0x2a, 0x80, 0x30, 0x9d, 0x6e, 0x2d, 0xa2, 0x0f, 0x14, 0xb8, 0xf1, 0xac, - 0x3e, 0x24, 0x0f, 0xe1, 0x3c, 0x7a, 0x05, 0x85, 0x7e, 0x3c, 0x0c, 0x76, 0xdf, 0xe9, 0x1f, 0xb9, - 0x7c, 0xd6, 0x6a, 0x85, 0x83, 0x31, 0x1e, 0x5b, 0x56, 0x47, 0x1a, 0x87, 0xf1, 0xd8, 0x0a, 0x7d, - 0xf1, 0xbb, 0x46, 0xc9, 0x79, 0x1d, 0x06, 0x70, 0x79, 0x06, 0xa5, 0xb4, 0x35, 0x2a, 0xf2, 0xd6, - 0xf8, 0x32, 0xa8, 0x07, 0xee, 0x80, 0x5e, 0x73, 0xdc, 0x01, 0x56, 0xed, 0xd3, 0x3b, 0xd8, 0xf1, - 0xcb, 0xe6, 0x6a, 0x0c, 0xb7, 0x42, 0xff, 0xc1, 0x1d, 0xfe, 0x95, 0x63, 0x71, 0xe8, 0xcb, 0xb7, - 0x52, 0xf2, 0x3a, 0x9c, 0xcd, 0x04, 0xc5, 0x49, 0xa2, 0x2c, 0x98, 0xeb, 0xb4, 0x28, 0x1d, 0x42, - 0xed, 0x26, 0x2c, 0xcb, 0x1b, 0x89, 0x90, 0xf0, 0x06, 0xc9, 0xd6, 0xc1, 0x3f, 0x37, 0x11, 0x8d, - 0x2a, 0xbc, 0xd0, 0x9e, 0xe6, 0xae, 0xf5, 0x1a, 0x90, 0xf8, 0xe6, 0x12, 0x6f, 0x14, 0xfc, 0x83, - 0xeb, 0xa2, 0x24, 0x5e, 0xe1, 0xfc, 0xb3, 0xbf, 0x3d, 0x0f, 0x67, 0x0b, 0x6e, 0xc2, 0xe4, 0x35, - 0x50, 0xbd, 0x51, 0xe4, 0x1e, 0x06, 0xd2, 0xd5, 0x8c, 0x49, 0xef, 0xa5, 0x4d, 0xc5, 0x5c, 0x93, - 0xca, 0xb8, 0x8a, 0x73, 0x9e, 0x65, 0xf9, 0xe7, 0xdf, 0xe3, 0xbf, 0xe8, 0x06, 0xe2, 0x04, 0x42, - 0x7b, 0x47, 0xff, 0x25, 0x0d, 0x58, 0xc7, 0x8c, 0x20, 0xa1, 0xe7, 0x63, 0x62, 0x11, 0x14, 0xc5, - 0x2a, 0xa9, 0xfb, 0x32, 0xd6, 0xa4, 0x2b, 0x21, 0x51, 0x59, 0xcc, 0x54, 0xc7, 0x19, 0x08, 0xf9, - 0x45, 0xb8, 0x24, 0x9d, 0xa8, 0x76, 0x66, 0xf5, 0xe1, 0x03, 0x0c, 0xf3, 0x82, 0x13, 0x9f, 0xad, - 0xf5, 0xd4, 0x3a, 0xdc, 0x06, 0x96, 0x45, 0xd8, 0x1b, 0x8c, 0xed, 0x5c, 0x0a, 0x19, 0x6c, 0x2e, - 0x4b, 0x88, 0x70, 0x89, 0x62, 0x35, 0x06, 0xe3, 0x4c, 0x36, 0x19, 0x6c, 0x75, 0xb7, 0x70, 0x85, - 0x2e, 0xe0, 0x0a, 0xbd, 0x2a, 0x37, 0x26, 0xb7, 0x3e, 0xb1, 0x17, 0x0b, 0xd6, 0xe8, 0x21, 0xac, - 0x27, 0x27, 0x9d, 0x38, 0xa0, 0xab, 0xa9, 0xac, 0xff, 0xc8, 0x50, 0x48, 0x90, 0xec, 0xc4, 0x66, - 0x81, 0x22, 0x72, 0x84, 0x72, 0x38, 0x94, 0x49, 0x8a, 0x20, 0x24, 0x4d, 0xd8, 0x70, 0x9e, 0x86, - 0x22, 0x37, 0x69, 0x18, 0x7f, 0x6b, 0x31, 0xff, 0x2d, 0x61, 0xaf, 0x63, 0xa4, 0x26, 0x71, 0x9e, - 0x86, 0x3c, 0x65, 0x69, 0x28, 0xb8, 0x7d, 0x0c, 0x84, 0x89, 0x1d, 0xa9, 0x7a, 0xc3, 0xb3, 0x78, - 0xf1, 0xc4, 0xa6, 0x39, 0x4a, 0x39, 0xa8, 0x1b, 0x96, 0xca, 0x35, 0xef, 0xa5, 0x75, 0xac, 0x4b, - 0x29, 0x03, 0x61, 0xb6, 0xb7, 0x99, 0xf1, 0x52, 0xc2, 0x97, 0xaf, 0x9a, 0x12, 0x98, 0xaf, 0x86, - 0xcf, 0x15, 0x50, 0xb3, 0x2c, 0xc8, 0xbb, 0x30, 0xcf, 0x84, 0x09, 0x7e, 0x32, 0x69, 0xc5, 0xdf, - 0x62, 0x23, 0xc8, 0xe4, 0x8a, 0xbd, 0x33, 0x26, 0xa7, 0x21, 0xdf, 0x80, 0x8a, 0xef, 0x0d, 0x84, - 0x21, 0xf3, 0xc6, 0x2c, 0xda, 0x4e, 0xa3, 0x5e, 0x43, 0xe5, 0xa7, 0x37, 0xe0, 0x57, 0x8f, 0xed, - 0x2a, 0xcc, 0xb3, 0x0e, 0xd3, 0x3e, 0x86, 0xcb, 0x33, 0x3e, 0x48, 0x0c, 0x58, 0xcb, 0x18, 0x79, - 0x4f, 0x69, 0xff, 0x75, 0x12, 0xfb, 0x6f, 0x20, 0x64, 0xe2, 0x21, 0x5c, 0x9c, 0x5a, 0x41, 0xd2, - 0x98, 0xba, 0x33, 0x60, 0xb8, 0x91, 0x6c, 0x99, 0x3c, 0x09, 0x33, 0xbb, 0x06, 0xff, 0xda, 0xef, - 0x94, 0xe0, 0x6c, 0xc1, 0xe4, 0x20, 0x1a, 0x94, 0xc4, 0x1e, 0x9e, 0x77, 0x21, 0xdc, 0x3b, 0x63, - 0x96, 0xbc, 0x01, 0xb9, 0x0b, 0x80, 0xb9, 0x5d, 0x03, 0xf7, 0xd0, 0xfd, 0x8c, 0xeb, 0x08, 0xf0, - 0xe6, 0x9e, 0x40, 0x53, 0x34, 0x8b, 0x68, 0x96, 0xa1, 0x60, 0x72, 0x1b, 0xc0, 0xfd, 0xac, 0x3f, - 0x9c, 0x0c, 0xdc, 0xf8, 0xd6, 0x55, 0xf0, 0x19, 0xc5, 0x5c, 0xe4, 0x58, 0x8d, 0x01, 0xd9, 0x03, - 0x22, 0x48, 0xa4, 0xaf, 0x56, 0x9e, 0xf1, 0x55, 0xc5, 0x54, 0x39, 0x55, 0x5b, 0x7c, 0x9c, 0x8f, - 0xee, 0x22, 0x2c, 0x78, 0x23, 0x2c, 0xa1, 0xff, 0x72, 0x24, 0xed, 0x8f, 0x14, 0xde, 0x1f, 0xe9, - 0x45, 0x4e, 0x7a, 0xc0, 0x7d, 0x08, 0xf8, 0x86, 0x70, 0x6b, 0xfa, 0x86, 0x20, 0x9b, 0x66, 0x79, - 0xdc, 0x19, 0x04, 0xc8, 0x06, 0x48, 0x06, 0xf9, 0x12, 0x46, 0x53, 0x3e, 0x7c, 0x1f, 0xc1, 0xb9, - 0xc2, 0x0d, 0x9b, 0xde, 0x22, 0xd0, 0x15, 0x39, 0xb9, 0x20, 0x2f, 0xd0, 0xdf, 0xf4, 0x86, 0x7c, - 0x13, 0x96, 0x1f, 0xbb, 0x4e, 0xe0, 0x06, 0xfc, 0x7a, 0xc6, 0x4f, 0x45, 0x06, 0x93, 0x6f, 0x67, - 0x83, 0xf4, 0xe9, 0xc4, 0xad, 0x2e, 0xa4, 0x05, 0x67, 0xd9, 0xae, 0xe1, 0x1d, 0xa3, 0x46, 0x80, - 0x5b, 0x6a, 0x94, 0xd4, 0x9d, 0x18, 0x49, 0xf0, 0xfe, 0xd1, 0x40, 0x2c, 0x46, 0x6d, 0xae, 0x1f, - 0x66, 0x41, 0x54, 0xa8, 0x39, 0x5f, 0x8c, 0x4d, 0xb6, 0x61, 0x89, 0x31, 0x67, 0xba, 0x21, 0x66, - 0x62, 0xbf, 0x39, 0xf3, 0x0b, 0x35, 0x7c, 0xa1, 0x13, 0xc6, 0xff, 0xd3, 0x4b, 0x19, 0x7a, 0x33, - 0xd9, 0xc7, 0xb2, 0x07, 0x81, 0xb9, 0x8c, 0x40, 0xee, 0x39, 0xa0, 0xfd, 0x67, 0x45, 0x34, 0x35, - 0xa5, 0x5e, 0xa6, 0x27, 0x6b, 0xe8, 0x8e, 0x84, 0x17, 0xc5, 0xa2, 0xc9, 0x7f, 0x3d, 0xe7, 0x69, - 0x4f, 0xde, 0x86, 0x65, 0xca, 0xf6, 0x70, 0x32, 0x62, 0x27, 0x6e, 0x39, 0x15, 0x0f, 0xaf, 0xc5, - 0x8a, 0xe8, 0xb0, 0xed, 0x9d, 0x31, 0x97, 0x8e, 0x93, 0x9f, 0xe4, 0x75, 0x58, 0x0c, 0x8f, 0xa3, - 0xb1, 0x7c, 0x4e, 0x0b, 0x53, 0x9b, 0xd5, 0xea, 0x75, 0x39, 0x49, 0x95, 0xe2, 0x24, 0x2a, 0x93, - 0xed, 0x79, 0x66, 0x6c, 0xd3, 0x5e, 0x85, 0x25, 0x89, 0x37, 0x6d, 0x0c, 0x7b, 0xcf, 0x2a, 0x1a, - 0xc3, 0x7e, 0xf1, 0xc1, 0x7e, 0x0c, 0x55, 0xc1, 0x92, 0x10, 0xa8, 0x1c, 0xf9, 0xa1, 0x90, 0x73, - 0xf0, 0x7f, 0x0a, 0xc3, 0x8b, 0x1c, 0x6d, 0xe4, 0x9c, 0x89, 0xff, 0xa3, 0x38, 0x8d, 0x6a, 0x61, - 0x8c, 0xa2, 0x8c, 0x3e, 0xcc, 0xb1, 0x06, 0x85, 0xc2, 0x7b, 0xc3, 0x90, 0x79, 0x36, 0x0b, 0x5d, - 0x4e, 0x7c, 0x0f, 0xc9, 0xe8, 0xe3, 0xa7, 0x89, 0x8d, 0x29, 0xa9, 0xb9, 0x94, 0x97, 0x9a, 0x59, - 0x9c, 0x33, 0x4e, 0xc9, 0xbe, 0x0c, 0x08, 0x43, 0xa9, 0x59, 0x12, 0x8c, 0x2a, 0x29, 0xc1, 0x48, - 0x52, 0xcc, 0x26, 0xa3, 0xc7, 0x84, 0x6e, 0xa1, 0x98, 0xcd, 0x8a, 0x6a, 0x3f, 0x88, 0x67, 0x48, - 0xca, 0x22, 0x40, 0xee, 0xc0, 0x39, 0xa6, 0x1d, 0xe1, 0xe9, 0xeb, 0x33, 0x32, 0xe2, 0x59, 0x2c, - 0x64, 0xd9, 0xef, 0x62, 0x59, 0xf1, 0xd9, 0x8a, 0x47, 0xf2, 0x06, 0x6c, 0xc4, 0xb9, 0x93, 0xc3, - 0x27, 0xde, 0x98, 0xe5, 0x8e, 0x3c, 0xe1, 0x7a, 0x0b, 0x22, 0xca, 0xac, 0x27, 0xde, 0x18, 0xf3, - 0x48, 0x8a, 0x1e, 0xfe, 0xd7, 0x25, 0xa1, 0xce, 0xde, 0xf6, 0xfd, 0x28, 0x8c, 0x02, 0x67, 0x9c, - 0xb2, 0x79, 0x92, 0x63, 0xb8, 0x88, 0x55, 0xba, 0x83, 0x09, 0xac, 0xfc, 0x40, 0xa8, 0xff, 0xe3, - 0x05, 0xb6, 0x74, 0xe7, 0xeb, 0x69, 0x7d, 0x94, 0x4e, 0xb1, 0x75, 0x19, 0x99, 0xae, 0x2b, 0x89, - 0xeb, 0xde, 0x19, 0xf3, 0x02, 0xe3, 0x99, 0xc3, 0x22, 0x7b, 0x05, 0x7b, 0x4d, 0xd6, 0xe8, 0xb9, - 0x9d, 0x6c, 0x3c, 0x69, 0xae, 0xf2, 0x96, 0x44, 0xde, 0x87, 0x45, 0x6f, 0x20, 0x27, 0x6d, 0xce, - 0x9a, 0xdb, 0x1a, 0x03, 0x96, 0x3e, 0x22, 0xe1, 0x41, 0x97, 0x86, 0xc7, 0xa1, 0xdb, 0x2b, 0x29, - 0xc9, 0x45, 0xdb, 0x16, 0x9a, 0xd3, 0x3c, 0x19, 0x59, 0x4d, 0xce, 0x3e, 0x3c, 0xe7, 0x70, 0x17, - 0x48, 0x12, 0x58, 0x98, 0xfc, 0x97, 0xf6, 0x77, 0xe1, 0xe5, 0xd3, 0xf6, 0x11, 0xdd, 0x31, 0xa6, - 0x74, 0xf8, 0x22, 0x8b, 0x7b, 0x9d, 0xee, 0xb7, 0x9b, 0x20, 0xc7, 0xeb, 0xf7, 0xc4, 0x14, 0x11, - 0xb0, 0xfd, 0xc0, 0xd3, 0xfe, 0x67, 0x19, 0x56, 0xd3, 0xf6, 0x70, 0xf2, 0x2a, 0x54, 0xa4, 0x8d, - 0xf2, 0x42, 0x81, 0xd1, 0x1c, 0xb7, 0x47, 0x44, 0x3a, 0xd5, 0xc6, 0x48, 0xee, 0xc1, 0x2a, 0x7a, - 0xe8, 0xa3, 0x80, 0x18, 0x79, 0xdc, 0x44, 0x74, 0x5a, 0xe3, 0xcf, 0x32, 0xa5, 0xa5, 0x07, 0x23, - 0x2d, 0x94, 0xcc, 0x9d, 0x95, 0xe9, 0xe6, 0x4e, 0xde, 0x94, 0x29, 0xe6, 0xce, 0xb9, 0x19, 0xe6, - 0xce, 0x84, 0x52, 0x36, 0x77, 0xa2, 0xd1, 0x7b, 0x61, 0x9a, 0xd1, 0x3b, 0xa1, 0x61, 0x46, 0xef, - 0xc4, 0x5c, 0x59, 0x9d, 0x6a, 0xae, 0x4c, 0x68, 0xb8, 0xb9, 0x32, 0x31, 0x20, 0x2e, 0x4e, 0x35, - 0x20, 0x4a, 0x44, 0xcc, 0x80, 0xf8, 0x22, 0xef, 0xd8, 0xc0, 0x79, 0x6a, 0x63, 0x8f, 0xf3, 0x1b, - 0x0f, 0x76, 0x99, 0xe9, 0x3c, 0x45, 0xd7, 0x5b, 0x2a, 0x98, 0x70, 0x7f, 0x5d, 0xed, 0x87, 0x99, - 0x0d, 0x48, 0x8c, 0xf9, 0x4b, 0xb0, 0xca, 0xce, 0x61, 0x1e, 0x4f, 0x9d, 0x1d, 0xc4, 0x2b, 0xe6, - 0x8a, 0x80, 0x32, 0x7d, 0xe9, 0x2f, 0xc0, 0x5a, 0x8c, 0xc6, 0x55, 0x86, 0x18, 0x1a, 0xc0, 0x8c, - 0xa9, 0xb9, 0xb2, 0x50, 0xe6, 0x17, 0xf0, 0x58, 0x71, 0x29, 0x7e, 0x2c, 0x90, 0xd8, 0x6b, 0x40, - 0x12, 0xb4, 0xf8, 0xf5, 0x42, 0x05, 0x51, 0xd7, 0x63, 0xd4, 0xf8, 0x89, 0xc1, 0x3f, 0x51, 0x32, - 0x86, 0xba, 0x9f, 0x57, 0xf5, 0x5f, 0x85, 0xf8, 0xeb, 0x36, 0x37, 0xb6, 0x88, 0x16, 0xa8, 0xa2, - 0xa0, 0xcb, 0xe1, 0xda, 0x61, 0x56, 0x2d, 0xf6, 0x73, 0xaa, 0x95, 0xf6, 0xa3, 0x72, 0xca, 0x88, - 0x21, 0x3e, 0x43, 0xe5, 0x9b, 0xd0, 0xb7, 0xf9, 0x10, 0xf3, 0xed, 0xf7, 0xe6, 0x94, 0x69, 0xca, - 0xfd, 0xb5, 0x2d, 0xab, 0x63, 0x42, 0x18, 0xfa, 0xc2, 0x7d, 0xdb, 0x66, 0xea, 0x1e, 0xe9, 0x1e, - 0x27, 0xd8, 0xb1, 0xbd, 0x76, 0x6b, 0x36, 0x3b, 0xa1, 0x25, 0xa6, 0xab, 0x14, 0xd5, 0x3e, 0xf1, - 0x2f, 0xf1, 0x81, 0x7d, 0x40, 0x9b, 0x5f, 0x98, 0x66, 0x5e, 0x2e, 0x50, 0xec, 0xe5, 0x98, 0x63, - 0x2f, 0x21, 0x67, 0x54, 0x21, 0x87, 0x32, 0x5b, 0x03, 0x96, 0xd1, 0x44, 0x20, 0x18, 0x56, 0x0a, - 0xdc, 0x0b, 0xf2, 0x8d, 0xaf, 0x35, 0x5a, 0xe6, 0x12, 0xa5, 0x13, 0x6c, 0x8e, 0xe0, 0xa2, 0xac, - 0xd8, 0x4f, 0x57, 0x72, 0x4e, 0x64, 0x41, 0x98, 0xd9, 0x03, 0x89, 0xfe, 0x1f, 0xab, 0x7a, 0xde, - 0x49, 0x03, 0x38, 0x1a, 0x3e, 0x5d, 0x98, 0x3e, 0x26, 0x33, 0x72, 0x52, 0x26, 0xb2, 0x4d, 0x49, - 0x96, 0x6d, 0x64, 0x3d, 0x7f, 0x39, 0xad, 0xe7, 0xdf, 0x81, 0x1b, 0x74, 0x3b, 0xe2, 0x83, 0xea, - 0x7e, 0xea, 0x06, 0x27, 0xfe, 0x08, 0x63, 0xdd, 0x8d, 0xe3, 0x55, 0xc9, 0x0c, 0x13, 0x57, 0x28, - 0x1e, 0x0e, 0x99, 0xc1, 0xb1, 0x5a, 0x88, 0xc4, 0x62, 0x38, 0xfe, 0xab, 0x32, 0xbc, 0x70, 0x8a, - 0x71, 0x9f, 0x51, 0xf7, 0x5f, 0x4a, 0x4b, 0xe0, 0xa5, 0x94, 0xfe, 0x93, 0x32, 0xe5, 0x87, 0xcb, - 0xc9, 0xa8, 0x3f, 0x45, 0xfe, 0xfe, 0x75, 0x58, 0x63, 0x27, 0x08, 0x7b, 0xbb, 0x71, 0x30, 0x19, - 0x9e, 0xe2, 0x08, 0xb9, 0x2c, 0x1e, 0x9a, 0x67, 0x48, 0xf1, 0x54, 0xc1, 0x8d, 0xd3, 0x8a, 0x61, - 0xa4, 0x07, 0x4b, 0x88, 0x76, 0xe0, 0x78, 0xc3, 0x53, 0xbd, 0x78, 0x16, 0xcf, 0xd8, 0x65, 0x32, - 0xf6, 0xe4, 0x8c, 0x02, 0x76, 0xf0, 0x37, 0xb9, 0x05, 0x6b, 0xa3, 0xc9, 0x31, 0x95, 0x2d, 0xd9, - 0xa4, 0xe2, 0x2e, 0xb2, 0x73, 0xe6, 0xca, 0x68, 0x72, 0xac, 0x8f, 0xc7, 0x38, 0x37, 0xd0, 0x97, - 0x76, 0x9d, 0xe2, 0xb1, 0xe5, 0x2f, 0x30, 0xe7, 0x11, 0x93, 0x32, 0x60, 0x1b, 0x00, 0xc7, 0xdd, - 0x00, 0xf6, 0xb2, 0x82, 0xe7, 0xf6, 0x64, 0x3f, 0xb4, 0xff, 0x5d, 0x12, 0x5a, 0xdd, 0xe9, 0x0b, - 0xe8, 0x6f, 0x87, 0xa8, 0x60, 0x88, 0x5e, 0x06, 0x95, 0x76, 0x7d, 0xb2, 0x3b, 0xc5, 0x63, 0xb4, - 0x3a, 0x9a, 0x1c, 0xc7, 0x7d, 0x27, 0x77, 0xfc, 0xbc, 0xdc, 0xf1, 0x6f, 0x0b, 0xad, 0x6f, 0xe1, - 0x3e, 0x33, 0xbd, 0xcb, 0xa9, 0xe8, 0x75, 0xeb, 0x74, 0xbb, 0xc9, 0xdf, 0x8e, 0x5b, 0xc1, 0xb8, - 0x65, 0x4c, 0xa0, 0x73, 0x39, 0x13, 0x68, 0xc1, 0xda, 0x9b, 0x2f, 0x5a, 0x7b, 0x39, 0x83, 0xeb, - 0x42, 0x81, 0xc1, 0xb5, 0x70, 0x81, 0x56, 0x9f, 0xb1, 0x40, 0x17, 0xe5, 0x79, 0xf2, 0xdf, 0x4b, - 0x42, 0xf4, 0x4a, 0xdf, 0xa5, 0x3e, 0x82, 0xb3, 0xe2, 0x2e, 0xc5, 0x8e, 0xa0, 0xc4, 0x8e, 0xbe, - 0x74, 0xe7, 0x95, 0xa2, 0x5b, 0x14, 0xa2, 0x15, 0xdc, 0x74, 0xd6, 0xf9, 0xfd, 0x29, 0x29, 0xff, - 0xff, 0xe7, 0xe6, 0x44, 0x1e, 0xc1, 0x79, 0x4c, 0xb5, 0xd3, 0x97, 0x3d, 0x00, 0xec, 0xc0, 0x3d, - 0xe0, 0xf3, 0xe1, 0x66, 0xee, 0x9e, 0xe1, 0xf5, 0xa5, 0xea, 0x98, 0xee, 0xc1, 0xde, 0x19, 0x73, - 0x23, 0x2c, 0x80, 0x67, 0x2f, 0x65, 0x7f, 0xa4, 0x80, 0xf6, 0xec, 0xfe, 0xc2, 0xfb, 0x73, 0xb6, - 0xc3, 0xe9, 0xfd, 0x59, 0xea, 0xbd, 0x17, 0x60, 0x25, 0x70, 0x0f, 0x02, 0x37, 0x3c, 0x4a, 0x29, - 0xb9, 0x96, 0x39, 0x50, 0x74, 0x8c, 0x88, 0xf7, 0xfd, 0x5c, 0xb7, 0x1a, 0x41, 0xa4, 0xed, 0xc4, - 0x77, 0xed, 0xc2, 0x71, 0xa0, 0xb3, 0x49, 0xae, 0x20, 0xfb, 0x71, 0xaf, 0x52, 0x2d, 0xa9, 0x65, - 0x93, 0x47, 0x25, 0x3f, 0xf0, 0x86, 0xae, 0xf6, 0xef, 0x62, 0xc9, 0xa2, 0xa8, 0xf3, 0xc8, 0x47, - 0xd2, 0x8b, 0xa7, 0x72, 0x4e, 0x9e, 0x29, 0x22, 0x39, 0x8d, 0x06, 0xb2, 0xf9, 0x15, 0x69, 0x20, - 0xef, 0x0a, 0xb7, 0x69, 0xba, 0xe7, 0x3d, 0xb8, 0x4d, 0x5e, 0x81, 0x05, 0xe6, 0x29, 0x2d, 0xaa, - 0xbb, 0x96, 0xaa, 0xee, 0x83, 0xdb, 0xa6, 0x28, 0xd7, 0x3e, 0x8f, 0xfd, 0x53, 0x72, 0x8d, 0x78, - 0x70, 0x9b, 0xbc, 0x7d, 0xba, 0x17, 0x4c, 0x55, 0xf1, 0x82, 0x29, 0x7e, 0xbd, 0xf4, 0x4e, 0xea, - 0xf5, 0xd2, 0x8b, 0xb3, 0x7b, 0x8b, 0x7b, 0x1d, 0xb1, 0x48, 0xcf, 0x71, 0xac, 0x50, 0xed, 0xaf, - 0x4b, 0x70, 0x75, 0x26, 0x05, 0xb9, 0x02, 0x55, 0xbd, 0xdb, 0xe8, 0x25, 0xe3, 0x4b, 0xd7, 0x8c, - 0x80, 0x90, 0x5d, 0x58, 0xdc, 0x76, 0x42, 0xaf, 0x4f, 0xa7, 0x71, 0xa1, 0x11, 0x3c, 0xc7, 0x36, - 0x46, 0xdf, 0x3b, 0x63, 0x26, 0xb4, 0xc4, 0x86, 0x75, 0x5c, 0x0b, 0xa9, 0x3c, 0x9a, 0xe5, 0x02, - 0x3d, 0x4d, 0x8e, 0x61, 0x8e, 0x8c, 0xee, 0x33, 0x39, 0x20, 0x79, 0x0c, 0xc4, 0xb2, 0xf6, 0x6a, - 0x6e, 0x10, 0x71, 0xfd, 0x45, 0xe4, 0xc5, 0xcf, 0x61, 0xde, 0x78, 0x46, 0xdf, 0xe5, 0xe8, 0xf6, - 0xce, 0x98, 0x05, 0xdc, 0xc8, 0x4d, 0x90, 0x13, 0xbe, 0xe2, 0x19, 0xbd, 0xbc, 0x77, 0xc6, 0x84, - 0x71, 0x9c, 0xf8, 0x35, 0xbb, 0x13, 0x7c, 0x2a, 0x44, 0xa2, 0xe9, 0xfd, 0xf4, 0x1c, 0x81, 0xf6, - 0x5f, 0x86, 0x6a, 0x57, 0xb8, 0x25, 0x4a, 0x2f, 0x0f, 0x85, 0x0b, 0xa2, 0x19, 0x97, 0x6a, 0xff, - 0x50, 0x11, 0x3a, 0x9d, 0x67, 0xf7, 0xa7, 0x94, 0x09, 0x75, 0x30, 0x3b, 0x13, 0xea, 0xe0, 0x67, - 0xcc, 0x84, 0xaa, 0x79, 0xf0, 0xca, 0xa9, 0xfb, 0x9e, 0xbc, 0x0b, 0x2a, 0x26, 0x99, 0x74, 0xa4, - 0x71, 0x64, 0x4b, 0x70, 0x3d, 0xce, 0xbc, 0xb2, 0xc7, 0x33, 0xf3, 0x9a, 0x6b, 0xfd, 0x34, 0xb5, - 0xf6, 0x87, 0x3c, 0xe3, 0x4e, 0x63, 0xd0, 0xcd, 0x58, 0x5b, 0xbf, 0xec, 0x63, 0x55, 0x23, 0xb5, - 0x1e, 0x5f, 0x90, 0x32, 0x7a, 0xe7, 0xbf, 0x35, 0xfd, 0xcd, 0xaa, 0xb4, 0x38, 0xff, 0x59, 0x19, - 0xae, 0xcc, 0x22, 0x27, 0x3a, 0xa8, 0x46, 0x26, 0x77, 0xbf, 0x9c, 0x01, 0x2e, 0x97, 0xf4, 0xdf, - 0xcc, 0xa1, 0xd3, 0xb1, 0x65, 0xb0, 0xf8, 0x25, 0x26, 0x8e, 0x2d, 0x27, 0xa5, 0x63, 0x2b, 0x8a, - 0xc9, 0x0b, 0x30, 0xaf, 0xd7, 0xac, 0x24, 0x53, 0x2d, 0x3e, 0x99, 0x72, 0xfa, 0x21, 0x3e, 0xc6, - 0xe1, 0x45, 0xe4, 0xd7, 0xf2, 0xc9, 0x99, 0x79, 0x8a, 0xda, 0xcb, 0x52, 0x87, 0xe4, 0x92, 0x61, - 0x61, 0x7d, 0x93, 0xe4, 0x4d, 0x3c, 0x1f, 0x8a, 0x99, 0x4f, 0xf4, 0xac, 0xc1, 0x7c, 0x37, 0x70, - 0x43, 0x37, 0x92, 0x9f, 0x33, 0x8d, 0x11, 0x62, 0xf2, 0x12, 0xfe, 0xd8, 0xc8, 0x39, 0x61, 0xb1, - 0xa5, 0xe6, 0xe5, 0x18, 0x82, 0xf8, 0x3a, 0x89, 0x82, 0x4d, 0x09, 0x85, 0x12, 0x34, 0x9d, 0xc9, - 0xa8, 0x7f, 0xb4, 0x6f, 0x36, 0xb9, 0x70, 0xc5, 0x08, 0x86, 0x08, 0xa5, 0x0d, 0x0c, 0x4d, 0x09, - 0x45, 0xfb, 0x2d, 0x05, 0x36, 0x8a, 0xda, 0x41, 0xae, 0x40, 0x65, 0x54, 0x98, 0x87, 0x7a, 0xc4, - 0x42, 0xe2, 0x2c, 0xa1, 0xf1, 0xee, 0xc0, 0x0f, 0x8e, 0x9d, 0x48, 0x7e, 0xf4, 0x25, 0x81, 0x4d, - 0x34, 0x36, 0xee, 0xe0, 0xff, 0xe4, 0xba, 0x38, 0x95, 0xca, 0xb9, 0xcc, 0xd5, 0xf8, 0x47, 0xd3, - 0x01, 0x1a, 0x83, 0x6e, 0x67, 0xcc, 0x92, 0x31, 0xbd, 0x09, 0x15, 0x5a, 0xad, 0xcc, 0xec, 0xa5, - 0xf3, 0x47, 0x6f, 0x35, 0x39, 0x12, 0xab, 0x55, 0xe8, 0x1c, 0x0f, 0x4d, 0x44, 0xd6, 0x1e, 0xc2, - 0x6a, 0x1a, 0x83, 0x18, 0xe9, 0x78, 0xfc, 0x4b, 0x77, 0x54, 0xce, 0x69, 0xdb, 0xf7, 0xd9, 0xc3, - 0xe3, 0xed, 0x8b, 0x3f, 0xf9, 0xe2, 0x3a, 0xd0, 0x9f, 0x8c, 0xa6, 0x28, 0x5e, 0xbf, 0xf6, 0xbb, - 0x25, 0xd8, 0x48, 0x62, 0x1d, 0x89, 0x35, 0xf4, 0x37, 0x36, 0xf0, 0x86, 0x9e, 0x0a, 0x0c, 0x21, - 0x44, 0xcb, 0x7c, 0x03, 0x67, 0xbc, 0x47, 0xdf, 0x85, 0xcd, 0x69, 0xf8, 0xe4, 0x55, 0x58, 0xc4, - 0x90, 0x9b, 0x63, 0xa7, 0xef, 0xca, 0xdb, 0xec, 0x48, 0x00, 0xcd, 0xa4, 0x5c, 0xfb, 0x13, 0x05, - 0x2e, 0xf1, 0xe7, 0xb2, 0x2d, 0xc7, 0x1b, 0xa1, 0xad, 0xa8, 0xef, 0x7e, 0x35, 0x81, 0x63, 0x76, - 0x53, 0xfb, 0xd8, 0x4b, 0xe9, 0x57, 0xd1, 0xb9, 0xaf, 0x4d, 0x6f, 0x2d, 0x79, 0x05, 0xc3, 0xc8, - 0x72, 0x77, 0xb2, 0x0a, 0x0b, 0xd4, 0x35, 0xa2, 0x00, 0x39, 0x50, 0x17, 0x62, 0x68, 0x7f, 0x0f, - 0xae, 0xcd, 0xfe, 0x00, 0xf9, 0x55, 0x58, 0xc1, 0x3c, 0xa9, 0xfb, 0xe3, 0xc3, 0xc0, 0x19, 0xb8, - 0x42, 0x8b, 0x28, 0x94, 0xdd, 0x72, 0x19, 0x8b, 0x8a, 0xcb, 0x03, 0x47, 0x1d, 0x62, 0x06, 0x56, - 0x4e, 0x94, 0x7a, 0x93, 0x2e, 0x73, 0xd3, 0xbe, 0xa3, 0x00, 0xc9, 0xf3, 0x20, 0xdf, 0x80, 0xe5, - 0xfd, 0x5e, 0xcd, 0x8a, 0x9c, 0x20, 0xda, 0xf3, 0x27, 0x01, 0x0f, 0x49, 0xcb, 0xe2, 0x08, 0x45, - 0x7d, 0x9b, 0x59, 0x05, 0x8f, 0xfc, 0x49, 0x60, 0xa6, 0xf0, 0x30, 0xc3, 0xa6, 0xeb, 0x3e, 0x19, - 0x38, 0x27, 0xe9, 0x0c, 0x9b, 0x1c, 0x96, 0xca, 0xb0, 0xc9, 0x61, 0xda, 0x0f, 0x14, 0xb8, 0x2c, - 0xde, 0x49, 0x0c, 0x0a, 0xea, 0x52, 0xc3, 0x68, 0x79, 0x81, 0xc8, 0x72, 0x30, 0x4b, 0x88, 0x5f, - 0x17, 0x01, 0x25, 0xb1, 0x82, 0x28, 0xcd, 0x33, 0x5a, 0xf2, 0x4b, 0x50, 0xb1, 0x22, 0x7f, 0x7c, - 0x8a, 0x88, 0x92, 0x6a, 0x3c, 0xa2, 0x91, 0x3f, 0x46, 0x16, 0x48, 0xa9, 0xb9, 0xb0, 0x21, 0x57, - 0x4e, 0xd4, 0x98, 0xb4, 0x60, 0x81, 0x87, 0x23, 0xce, 0x38, 0xe0, 0xcd, 0x68, 0xd3, 0xf6, 0x9a, - 0x08, 0x5b, 0xc9, 0xe3, 0xf1, 0x9b, 0x82, 0x87, 0xf6, 0x8f, 0x14, 0x58, 0xa2, 0x82, 0x0d, 0xde, - 0x5b, 0xbf, 0xec, 0x94, 0x4e, 0x8b, 0xca, 0xc2, 0x9f, 0x34, 0x66, 0x7f, 0xaa, 0xd3, 0xf8, 0x2d, - 0x58, 0xcb, 0x10, 0x10, 0x0d, 0x03, 0x96, 0x0d, 0xbd, 0xbe, 0xc3, 0x12, 0xf6, 0x31, 0x5f, 0xcc, - 0x14, 0x4c, 0xfb, 0x07, 0x0a, 0x6c, 0x74, 0x9e, 0x44, 0x0e, 0x33, 0xde, 0x9b, 0x93, 0xa1, 0x58, - 0xef, 0x54, 0x58, 0x13, 0x0f, 0x6e, 0x58, 0x30, 0x25, 0x26, 0xac, 0x71, 0x98, 0x19, 0x97, 0x92, - 0x3d, 0xa8, 0xf2, 0xf3, 0x25, 0xe4, 0xa1, 0xf3, 0xaf, 0x49, 0xea, 0x93, 0x84, 0x31, 0x47, 0xa2, - 0x2d, 0xc1, 0x2d, 0x8c, 0xd3, 0x98, 0x31, 0xb5, 0xf6, 0x97, 0x0a, 0x5c, 0x98, 0x42, 0x43, 0xde, - 0x83, 0x39, 0x0c, 0xf4, 0xc0, 0x47, 0xef, 0xca, 0x94, 0x4f, 0x44, 0xfd, 0xa3, 0x07, 0xb7, 0xd9, - 0x41, 0x74, 0x4c, 0x7f, 0x98, 0x8c, 0x8a, 0x7c, 0x04, 0x8b, 0xfa, 0x60, 0xc0, 0x2f, 0x70, 0xa5, - 0xd4, 0x05, 0x6e, 0xca, 0x17, 0x5f, 0x8f, 0xf1, 0xd9, 0x05, 0x8e, 0x3d, 0x39, 0x1e, 0x0c, 0x6c, - 0x1e, 0xc4, 0x22, 0xe1, 0x77, 0xe9, 0x5d, 0x58, 0x4d, 0x23, 0x3f, 0xd7, 0xbb, 0xfb, 0xcf, 0x15, - 0x50, 0xd3, 0x75, 0xf8, 0xf9, 0x04, 0xdc, 0x2c, 0x1a, 0xe6, 0x67, 0x4c, 0xaa, 0x7f, 0x5c, 0x82, - 0x73, 0x85, 0x3d, 0x4c, 0x5e, 0x83, 0x79, 0x7d, 0x3c, 0x6e, 0xd4, 0xf9, 0xac, 0xe2, 0x12, 0x12, - 0xea, 0xd7, 0x53, 0xf7, 0x5b, 0x86, 0x44, 0xde, 0x84, 0x2a, 0xf3, 0x11, 0xa9, 0x8b, 0x0d, 0x07, - 0x23, 0x08, 0x72, 0x07, 0x96, 0x74, 0x10, 0x7b, 0x81, 0x48, 0x76, 0x60, 0x95, 0xc7, 0xde, 0x43, - 0x87, 0xa1, 0x38, 0x5f, 0x12, 0xfa, 0x58, 0x09, 0xa5, 0x3d, 0x73, 0x35, 0x4a, 0xed, 0x9d, 0x19, - 0x2a, 0xd2, 0x04, 0x15, 0x79, 0xca, 0x9c, 0x58, 0x24, 0x7d, 0xc9, 0xf7, 0x6e, 0x0a, 0xaf, 0x1c, - 0x65, 0x3c, 0x5c, 0xcc, 0xff, 0xfd, 0xd8, 0x1d, 0x45, 0x3f, 0xbf, 0xe1, 0x4a, 0xbe, 0x71, 0xaa, - 0xe1, 0xfa, 0x7e, 0x85, 0x2d, 0xe6, 0x2c, 0x19, 0x95, 0x68, 0xa4, 0xf4, 0x28, 0x28, 0xd1, 0xd0, - 0xfb, 0x19, 0x8f, 0x2e, 0x57, 0x87, 0x05, 0x16, 0xf5, 0x4f, 0xac, 0x8c, 0xab, 0x85, 0x55, 0x60, - 0x38, 0x0f, 0x6e, 0x33, 0xf1, 0x85, 0x45, 0x9c, 0x08, 0x4d, 0x41, 0x4a, 0x1e, 0xc0, 0x52, 0x6d, - 0xe8, 0x3a, 0xa3, 0xc9, 0xb8, 0x77, 0x3a, 0x03, 0xf5, 0x26, 0x6f, 0xcb, 0x72, 0x9f, 0x91, 0xa1, - 0x61, 0x1b, 0x77, 0x72, 0x99, 0x11, 0xe9, 0xc5, 0x8f, 0xd0, 0x2b, 0xa8, 0x9b, 0x7d, 0x63, 0x46, - 0xff, 0x64, 0x81, 0x48, 0x97, 0x8e, 0xb0, 0xc0, 0x5f, 0xa9, 0xdb, 0xb0, 0xda, 0x74, 0xc2, 0xa8, - 0x17, 0x38, 0xa3, 0x10, 0x23, 0x90, 0x9f, 0x22, 0x9a, 0xea, 0x65, 0x5e, 0x61, 0xa6, 0xb3, 0x8d, - 0x62, 0x52, 0xa6, 0xb3, 0x4d, 0xb3, 0xa3, 0xf2, 0xd2, 0x8e, 0x37, 0x72, 0x86, 0xde, 0xb7, 0x45, - 0xac, 0x0e, 0x26, 0x2f, 0x1d, 0x08, 0xa0, 0x99, 0x94, 0x6b, 0xbf, 0x92, 0x1b, 0x37, 0x56, 0xcb, - 0x25, 0x58, 0xe0, 0x91, 0x9c, 0x58, 0x64, 0xa3, 0xae, 0xd1, 0xae, 0x37, 0xda, 0xbb, 0xaa, 0x42, - 0x56, 0x01, 0xba, 0x66, 0xa7, 0x66, 0x58, 0x16, 0xfd, 0x5d, 0xa2, 0xbf, 0x79, 0xd8, 0xa3, 0x9d, - 0xfd, 0xa6, 0x5a, 0x96, 0x22, 0x1f, 0x55, 0xb4, 0x1f, 0x2b, 0x70, 0xbe, 0x78, 0x28, 0x49, 0x0f, - 0x30, 0xf6, 0x15, 0x77, 0x55, 0xf8, 0xc6, 0xcc, 0x71, 0x2f, 0x04, 0x67, 0x63, 0x68, 0x45, 0x2c, - 0x36, 0x53, 0x49, 0x98, 0xd9, 0x58, 0xb0, 0x07, 0x6f, 0x60, 0x96, 0xbc, 0x81, 0x56, 0x83, 0xcd, - 0x69, 0x3c, 0xd2, 0x4d, 0x5d, 0x83, 0x25, 0xbd, 0xdb, 0x6d, 0x36, 0x6a, 0x7a, 0xaf, 0xd1, 0x69, - 0xab, 0x0a, 0x59, 0x84, 0xb9, 0x5d, 0xb3, 0xb3, 0xdf, 0x55, 0x4b, 0xda, 0xef, 0x29, 0xb0, 0xd2, - 0x48, 0x9c, 0x28, 0xbf, 0xec, 0xe2, 0xfb, 0x66, 0x6a, 0xf1, 0x6d, 0xc6, 0x51, 0xe2, 0xe2, 0x0f, - 0x9c, 0x6a, 0xe5, 0xfd, 0x9b, 0x32, 0xac, 0xe7, 0x68, 0x88, 0x05, 0x0b, 0xfa, 0x43, 0xab, 0xd3, - 0xa8, 0xd7, 0x78, 0xcd, 0xae, 0x27, 0x4e, 0x73, 0x98, 0x6d, 0x34, 0xf7, 0x15, 0x16, 0x59, 0xe5, - 0x69, 0x68, 0xfb, 0xde, 0xa0, 0x9f, 0xf2, 0xda, 0x14, 0x9c, 0xf0, 0x24, 0xfb, 0xf6, 0x24, 0x40, - 0x47, 0x54, 0x5e, 0xeb, 0xd8, 0x17, 0x4f, 0xc0, 0xf3, 0x8c, 0xd1, 0x35, 0xd3, 0xa1, 0xe5, 0x79, - 0xd6, 0x09, 0x3f, 0xd2, 0x86, 0xf9, 0x5d, 0x2f, 0xda, 0x9b, 0x3c, 0xe6, 0xeb, 0xf7, 0x5a, 0x92, - 0x7b, 0x72, 0x6f, 0xf2, 0x38, 0xcf, 0x16, 0xb5, 0x9a, 0xec, 0x55, 0x75, 0x8a, 0x25, 0xe7, 0x42, - 0xee, 0xc3, 0x9c, 0xfe, 0xd0, 0x32, 0x75, 0xbe, 0xba, 0x24, 0xb7, 0x44, 0x53, 0x9f, 0xc2, 0x8d, - 0xb6, 0x3e, 0x70, 0x52, 0xdc, 0x18, 0x8f, 0x6c, 0x64, 0x89, 0xca, 0x73, 0x45, 0x96, 0xd8, 0x5e, - 0x81, 0x25, 0x7e, 0x21, 0xc3, 0xbb, 0xce, 0x8f, 0x14, 0xd8, 0x9c, 0x36, 0x0c, 0xf4, 0x8e, 0x97, - 0x8e, 0x20, 0x75, 0x3e, 0xce, 0x74, 0x96, 0x76, 0x1d, 0x16, 0x68, 0xe4, 0x03, 0x58, 0x62, 0xee, - 0x65, 0xd6, 0x9b, 0xfb, 0x66, 0x83, 0xcf, 0xfd, 0xab, 0x7f, 0xf1, 0xc5, 0xf5, 0x0b, 0xdc, 0x23, - 0x2d, 0x7c, 0xd3, 0x9e, 0x04, 0x5e, 0x42, 0xba, 0xa9, 0x98, 0x32, 0x05, 0x15, 0xc9, 0x9d, 0xc9, - 0xc0, 0x73, 0xc5, 0x85, 0x44, 0x44, 0xd9, 0xe1, 0x30, 0xf9, 0x80, 0x14, 0x30, 0xed, 0xbb, 0x0a, - 0x5c, 0x9a, 0x3e, 0xe6, 0xf4, 0xd0, 0xed, 0x31, 0x2f, 0x3d, 0x11, 0xe7, 0x06, 0x0f, 0xdd, 0xd8, - 0x95, 0x4f, 0xe6, 0x29, 0x10, 0x29, 0x11, 0x57, 0x97, 0x09, 0x8d, 0x0b, 0x12, 0xc5, 0xda, 0x34, - 0x99, 0x48, 0x20, 0x6a, 0x8f, 0xe0, 0xc2, 0x94, 0x19, 0x42, 0xde, 0x2f, 0xcc, 0x9f, 0x88, 0xcf, - 0x9f, 0xe5, 0xf7, 0xed, 0xa9, 0x44, 0xbc, 0x12, 0x5c, 0xfb, 0x4f, 0xcc, 0x2f, 0xb5, 0x60, 0xba, - 0x50, 0xf9, 0x00, 0xf3, 0xf5, 0xe9, 0xa3, 0xfe, 0x91, 0x1f, 0x24, 0x83, 0x85, 0xf2, 0x41, 0x44, - 0x4b, 0x6c, 0x07, 0x8b, 0x32, 0x83, 0x96, 0xa1, 0x22, 0x3e, 0xac, 0x77, 0x03, 0xff, 0xc0, 0x63, - 0x0f, 0xf6, 0xd8, 0xb5, 0x8e, 0xaf, 0xac, 0x97, 0xa5, 0x09, 0xeb, 0x0f, 0xdd, 0x50, 0x1f, 0x9d, - 0x3c, 0x3d, 0x72, 0x03, 0x37, 0x87, 0x1f, 0x27, 0xe5, 0xa1, 0x60, 0xe6, 0xfe, 0xd0, 0xc7, 0x02, - 0x33, 0xcf, 0x5b, 0xfb, 0x5e, 0x09, 0x6e, 0x3e, 0x93, 0xe3, 0x69, 0xd3, 0x0e, 0x7e, 0x1d, 0x80, - 0xd3, 0xd2, 0x1e, 0x90, 0x94, 0x36, 0xa2, 0x32, 0x4e, 0x30, 0x32, 0x25, 0x14, 0xf2, 0x04, 0xae, - 0x8a, 0x5f, 0xfd, 0xbe, 0x3b, 0x8e, 0x42, 0x5a, 0x0f, 0x1e, 0xc7, 0x36, 0x8e, 0xe0, 0x53, 0xc5, - 0xdc, 0xfa, 0x37, 0x63, 0x1e, 0x0c, 0x93, 0x79, 0xcf, 0x8b, 0x90, 0xb8, 0xa8, 0x3a, 0x9a, 0xcd, - 0x8b, 0xdc, 0x4a, 0x56, 0x52, 0x25, 0x51, 0xf9, 0x8a, 0x95, 0x14, 0xaf, 0x1f, 0xed, 0x27, 0x25, - 0x38, 0x4f, 0x77, 0xe4, 0xa1, 0x1b, 0x86, 0xfa, 0x24, 0x3a, 0xa2, 0xab, 0x96, 0xdd, 0x51, 0xc8, - 0xdb, 0x30, 0x7f, 0xf4, 0x7c, 0x16, 0x08, 0x86, 0x4e, 0x08, 0xa0, 0x94, 0x23, 0xde, 0x56, 0xd3, - 0xff, 0xc9, 0x3b, 0x30, 0x87, 0x0a, 0x36, 0x2e, 0x4c, 0x88, 0x4b, 0x60, 0xf1, 0xa7, 0x51, 0xfd, - 0x66, 0x32, 0x02, 0xda, 0xcf, 0x49, 0x4a, 0x37, 0xbe, 0x9f, 0x09, 0xc5, 0x53, 0x9c, 0xd5, 0xcd, - 0x5c, 0x3c, 0x3e, 0x70, 0x78, 0x9e, 0xb4, 0x2d, 0x58, 0x17, 0xab, 0x66, 0x2c, 0xc2, 0x8d, 0x73, - 0xcb, 0xf7, 0x1a, 0x8f, 0xff, 0x30, 0x16, 0x21, 0xc7, 0x5f, 0x84, 0xd5, 0x30, 0x3c, 0xb2, 0x79, - 0xf8, 0xa0, 0x27, 0x22, 0x93, 0x89, 0xb9, 0x1c, 0x86, 0x47, 0x2c, 0x8e, 0xd0, 0x7d, 0xf7, 0x84, - 0x62, 0xa1, 0x8b, 0x6f, 0x82, 0x55, 0x65, 0x58, 0xd1, 0x30, 0x8c, 0xb1, 0x78, 0xe4, 0x2b, 0x48, - 0xb0, 0xb4, 0xff, 0x56, 0x82, 0xc5, 0x87, 0x54, 0x70, 0x47, 0x75, 0xd4, 0x6c, 0xf5, 0xd6, 0x1d, - 0x58, 0x6a, 0xfa, 0x0e, 0x37, 0x3a, 0xf2, 0x17, 0xc6, 0xec, 0x4d, 0xc0, 0xd0, 0x77, 0x84, 0xfd, - 0x32, 0x34, 0x65, 0xa4, 0x67, 0x84, 0x7e, 0xba, 0x07, 0xf3, 0xcc, 0x08, 0xcc, 0x35, 0xad, 0xe2, - 0xea, 0x16, 0xd7, 0xe8, 0x75, 0x56, 0x2c, 0xd9, 0xc9, 0x98, 0x21, 0x59, 0xbe, 0x47, 0x70, 0xff, - 0x7f, 0x49, 0xf9, 0x36, 0x77, 0x3a, 0xe5, 0x9b, 0x14, 0x36, 0x7a, 0xfe, 0x34, 0x61, 0xa3, 0x2f, - 0xdd, 0x85, 0x25, 0xa9, 0x3e, 0xcf, 0x75, 0x93, 0xfb, 0x8d, 0x12, 0xac, 0x60, 0xab, 0x62, 0xd7, - 0xb2, 0xbf, 0x99, 0xaa, 0xc4, 0x6f, 0xa6, 0x54, 0x89, 0x9b, 0xf2, 0x78, 0xb1, 0x96, 0xcd, 0xd0, - 0x21, 0xde, 0x83, 0xf5, 0x1c, 0x22, 0x79, 0x0b, 0xe6, 0x68, 0xf5, 0x85, 0xea, 0x45, 0xcd, 0xce, - 0x80, 0x24, 0xc5, 0x08, 0x6d, 0x78, 0x68, 0x32, 0x6c, 0xed, 0x7f, 0x29, 0xb0, 0xcc, 0x33, 0x08, - 0x8e, 0x0e, 0xfc, 0x67, 0x76, 0xe7, 0xad, 0x6c, 0x77, 0xb2, 0x40, 0x86, 0xbc, 0x3b, 0xff, 0x6f, - 0x77, 0xe2, 0xdd, 0x54, 0x27, 0x5e, 0x88, 0x03, 0x8e, 0x8b, 0xe6, 0xcc, 0xe8, 0xc3, 0x1f, 0x62, - 0x0a, 0x8e, 0x34, 0x22, 0xf9, 0x35, 0x58, 0x6c, 0xbb, 0x4f, 0x53, 0x1a, 0x8c, 0x5b, 0x53, 0x98, - 0xbe, 0x1e, 0x23, 0xb2, 0x35, 0xc5, 0xde, 0xe5, 0xb8, 0x4f, 0xed, 0x9c, 0xfd, 0x39, 0x61, 0x79, - 0xe9, 0x5d, 0x58, 0x4d, 0x93, 0x3d, 0xcf, 0xd4, 0xe7, 0xe1, 0x50, 0x30, 0x36, 0xe7, 0x6f, 0x95, - 0x01, 0x92, 0x48, 0x12, 0x74, 0x01, 0xa6, 0x5c, 0x6f, 0x84, 0xf1, 0x07, 0x41, 0xf2, 0x1c, 0x17, - 0x1e, 0x39, 0xb7, 0xb8, 0x91, 0xa2, 0x34, 0x3d, 0x20, 0xfc, 0x48, 0x44, 0xc3, 0x61, 0x6e, 0x86, - 0x43, 0x87, 0xb9, 0xe4, 0x97, 0xb7, 0x5f, 0xc4, 0xfc, 0x1f, 0x31, 0x34, 0x15, 0xad, 0xbb, 0x5a, - 0x9f, 0xf0, 0xbc, 0x43, 0x18, 0xc0, 0xa0, 0x4e, 0x11, 0x72, 0xd1, 0x59, 0x2a, 0xcf, 0x17, 0x9d, - 0xa5, 0x0b, 0x8b, 0xde, 0xe8, 0x53, 0x77, 0x14, 0xf9, 0xc1, 0x09, 0x5a, 0x66, 0x12, 0x95, 0x2f, - 0xed, 0x82, 0x86, 0x28, 0x63, 0xe3, 0x80, 0x32, 0x42, 0x8c, 0x2f, 0x0f, 0x43, 0x0c, 0x8c, 0x63, - 0x4a, 0xcc, 0xa9, 0xf3, 0x2c, 0xb2, 0xc4, 0xbd, 0x4a, 0xb5, 0xaa, 0x2e, 0xde, 0xab, 0x54, 0x17, - 0x55, 0x30, 0x25, 0xb3, 0x6a, 0x6c, 0x36, 0x95, 0x2c, 0x9d, 0x69, 0x2b, 0xa6, 0xf6, 0x57, 0x25, - 0x20, 0xf9, 0x6a, 0x90, 0x6f, 0xc2, 0x12, 0xdb, 0x60, 0xed, 0x20, 0xfc, 0x84, 0xbf, 0x4b, 0x62, - 0x8f, 0x04, 0x25, 0xb0, 0x1c, 0xe1, 0x94, 0x81, 0xcd, 0xf0, 0x93, 0x21, 0xf9, 0x55, 0x38, 0x8b, - 0xdd, 0x3b, 0x76, 0x03, 0xcf, 0x1f, 0xd8, 0x98, 0x8e, 0xc2, 0x19, 0xf2, 0xdc, 0xed, 0xaf, 0xfd, - 0xc5, 0x17, 0xd7, 0xaf, 0x16, 0x14, 0x4f, 0x19, 0x06, 0x0c, 0x08, 0xd1, 0x45, 0xcc, 0x2e, 0x43, - 0x24, 0x3d, 0x50, 0x65, 0xfa, 0x83, 0xc9, 0x70, 0xc8, 0x47, 0x76, 0x8b, 0x0a, 0x75, 0xd9, 0xb2, - 0x29, 0x8c, 0x57, 0x13, 0xc6, 0x3b, 0x93, 0xe1, 0x90, 0xbc, 0x0d, 0xe0, 0x8f, 0xec, 0x63, 0x2f, - 0x0c, 0x99, 0xbd, 0x2f, 0x7e, 0xab, 0x96, 0x40, 0xe5, 0xc1, 0xf0, 0x47, 0x2d, 0x06, 0x24, 0x7f, - 0x07, 0x30, 0x30, 0x1a, 0x46, 0x0c, 0x64, 0x3e, 0x6d, 0x5c, 0xce, 0x13, 0xc0, 0x74, 0x28, 0x9d, - 0x43, 0xd7, 0xf2, 0xbe, 0x2d, 0x9e, 0xf4, 0x7d, 0x0b, 0xd6, 0xb9, 0xfb, 0xfe, 0x43, 0x2f, 0x3a, - 0xe2, 0xb7, 0xcd, 0x2f, 0x73, 0x55, 0x95, 0xae, 0x9b, 0x7f, 0x5a, 0x01, 0xd0, 0x1f, 0x5a, 0x22, - 0x18, 0xef, 0x2b, 0x30, 0x47, 0xef, 0xd0, 0x42, 0x17, 0x87, 0x96, 0x0c, 0xe4, 0x2b, 0x5b, 0x32, - 0x10, 0x83, 0xae, 0x46, 0x13, 0x5f, 0xdf, 0x08, 0x3d, 0x1c, 0xae, 0x46, 0xf6, 0x20, 0x27, 0x95, - 0x0c, 0x85, 0x63, 0x91, 0x26, 0x40, 0x12, 0x1e, 0x97, 0xdf, 0x0a, 0xd7, 0x93, 0x38, 0x93, 0xbc, - 0x80, 0x27, 0x79, 0x4b, 0x9e, 0x58, 0xca, 0xd3, 0x27, 0x41, 0x23, 0xf7, 0xa1, 0xd2, 0x73, 0xe2, - 0xc8, 0x2d, 0x53, 0x82, 0x06, 0xdf, 0xe0, 0xb9, 0xf5, 0x93, 0xc0, 0xc1, 0xab, 0x91, 0x73, 0x28, - 0xd7, 0x0e, 0x99, 0x10, 0x03, 0xe6, 0xbb, 0x4e, 0xe0, 0x1c, 0x87, 0xd3, 0x82, 0xcd, 0xb3, 0x52, - 0x91, 0x62, 0x06, 0x81, 0xb2, 0x4c, 0xc1, 0x8a, 0xc9, 0x1d, 0x28, 0x5b, 0x56, 0x8b, 0x87, 0xca, - 0x5b, 0x49, 0x04, 0x7e, 0xcb, 0x6a, 0x31, 0xd7, 0x80, 0x30, 0x3c, 0x96, 0xc8, 0x28, 0x32, 0xf9, - 0x45, 0x58, 0x92, 0xee, 0x23, 0x3c, 0xc8, 0x24, 0xf6, 0x81, 0xf4, 0xbe, 0x53, 0xde, 0x34, 0x24, - 0x6c, 0xd2, 0x04, 0xf5, 0xfe, 0xe4, 0xb1, 0xab, 0x8f, 0xc7, 0x18, 0x32, 0xe2, 0x53, 0x37, 0x60, - 0x82, 0x5c, 0x35, 0xc9, 0xce, 0x82, 0x8f, 0xa9, 0x06, 0xa2, 0x54, 0xd6, 0x47, 0x66, 0x29, 0x49, - 0x17, 0xd6, 0x2d, 0x37, 0x9a, 0x8c, 0x99, 0x97, 0xd6, 0x0e, 0xbb, 0x08, 0xb1, 0x90, 0x94, 0x98, - 0xc8, 0x22, 0xa4, 0x85, 0xc2, 0x35, 0xee, 0x20, 0x77, 0x19, 0xca, 0x13, 0x6b, 0xae, 0x3c, 0xe4, - 0xb2, 0x04, 0xaf, 0xcc, 0x90, 0xe0, 0xa9, 0x7c, 0x9c, 0x0b, 0x9b, 0x8c, 0xf7, 0x10, 0x29, 0x6c, - 0x72, 0x2a, 0x58, 0xf2, 0x0f, 0x2a, 0x52, 0xe4, 0x7e, 0x3e, 0x16, 0xef, 0x01, 0xdc, 0xf3, 0xbd, - 0x51, 0xcb, 0x8d, 0x8e, 0xfc, 0x81, 0xf4, 0x7a, 0x77, 0xe9, 0x63, 0xdf, 0x1b, 0xd9, 0xc7, 0x08, - 0xfe, 0xab, 0x2f, 0xae, 0x4b, 0x48, 0xa6, 0xf4, 0x3f, 0xf9, 0x1a, 0x2c, 0xd2, 0x5f, 0xbd, 0xc4, - 0xd7, 0x8c, 0xa9, 0xed, 0x91, 0x9a, 0xe5, 0xcc, 0x4b, 0x10, 0xc8, 0x5d, 0xcc, 0x12, 0xe9, 0x8d, - 0x23, 0x49, 0x78, 0x15, 0x29, 0x21, 0xbd, 0x71, 0x94, 0x7d, 0xba, 0x2b, 0x21, 0x93, 0xbd, 0xb8, - 0xea, 0x22, 0xb1, 0x2b, 0x4f, 0x46, 0xc9, 0xdf, 0xff, 0x62, 0x91, 0x2d, 0xb2, 0x40, 0xc8, 0xef, - 0x7f, 0x33, 0x64, 0x58, 0x09, 0x6b, 0xaf, 0xce, 0x6f, 0x9d, 0x73, 0x52, 0x25, 0xc2, 0xa3, 0x01, - 0xbf, 0x43, 0xa6, 0x2a, 0x11, 0x23, 0x93, 0x6d, 0x58, 0x63, 0x52, 0x7f, 0x9c, 0x02, 0x9e, 0x8b, - 0xb8, 0xb8, 0xb7, 0x25, 0x39, 0xe2, 0xe5, 0xcf, 0x67, 0x08, 0xc8, 0x0e, 0xcc, 0xa1, 0x06, 0x81, - 0x3f, 0xce, 0xb9, 0x2c, 0x6b, 0x92, 0xb2, 0xeb, 0x08, 0xf7, 0x15, 0xd4, 0x21, 0xc9, 0xfb, 0x0a, - 0xa2, 0x92, 0x5f, 0x06, 0x30, 0x46, 0x81, 0x3f, 0x1c, 0x62, 0x9e, 0x92, 0x6a, 0xea, 0xf9, 0x3f, - 0xe7, 0x83, 0x5c, 0x12, 0x24, 0x1e, 0x53, 0x1b, 0x7f, 0xdb, 0x99, 0x6c, 0x26, 0x12, 0x2f, 0xad, - 0x01, 0xf3, 0x6c, 0x31, 0x62, 0xce, 0x1f, 0x9e, 0x19, 0x51, 0xca, 0x18, 0xc3, 0x72, 0xfe, 0x70, - 0x78, 0x3e, 0xe7, 0x8f, 0x44, 0xa0, 0xdd, 0x87, 0x8d, 0xa2, 0x86, 0xa5, 0x74, 0x1e, 0xca, 0x69, - 0x75, 0x1e, 0x7f, 0x50, 0x86, 0x65, 0xe4, 0x26, 0x76, 0x61, 0x1d, 0x56, 0xac, 0xc9, 0xe3, 0x38, - 0x20, 0xae, 0xd8, 0x8d, 0xb1, 0x7e, 0xa1, 0x5c, 0x20, 0x9b, 0x79, 0x53, 0x14, 0xc4, 0x80, 0x55, - 0x71, 0x12, 0xec, 0x8a, 0x87, 0x2c, 0x71, 0xba, 0x1d, 0xf1, 0xbe, 0x87, 0xfb, 0xd0, 0xca, 0x0a, - 0x8d, 0x34, 0x51, 0x72, 0x1e, 0x94, 0x9f, 0xe7, 0x3c, 0xa8, 0x9c, 0xea, 0x3c, 0xf8, 0x08, 0x96, - 0xc5, 0xd7, 0x70, 0x27, 0x9f, 0xfb, 0x72, 0x3b, 0x79, 0x8a, 0x19, 0x69, 0xc6, 0x3b, 0xfa, 0xfc, - 0xcc, 0x1d, 0x1d, 0x6d, 0xe7, 0x62, 0x95, 0x8d, 0x11, 0x96, 0xdf, 0xd8, 0xb5, 0x3f, 0x2f, 0x03, - 0xec, 0xd6, 0xba, 0x3f, 0xc3, 0x29, 0xf9, 0x16, 0x2c, 0x36, 0x7d, 0x61, 0x36, 0x95, 0xec, 0x55, - 0x43, 0x01, 0x94, 0xc5, 0x85, 0x18, 0x33, 0x3e, 0xdd, 0xca, 0x5f, 0xc5, 0xe9, 0x76, 0x17, 0xf5, - 0x3a, 0x1f, 0xbb, 0xfd, 0x28, 0xc9, 0xfc, 0x8c, 0x4b, 0x46, 0xc4, 0xb3, 0x4b, 0x9b, 0xcd, 0x24, - 0x64, 0xba, 0x3b, 0x71, 0x8f, 0x2c, 0x11, 0xa4, 0x82, 0xa7, 0x62, 0xc5, 0xdd, 0x49, 0x44, 0xfa, - 0x10, 0x71, 0x2f, 0xe4, 0xed, 0x21, 0x43, 0xf6, 0xd5, 0x0e, 0x08, 0xf9, 0x30, 0x76, 0xa1, 0x5d, - 0x98, 0xd5, 0x43, 0x5a, 0xae, 0x87, 0xa6, 0x3a, 0xce, 0x6a, 0x3f, 0x56, 0xe4, 0x5c, 0x67, 0x3f, - 0xc3, 0x50, 0xbf, 0x03, 0x10, 0xfb, 0xad, 0x88, 0xb1, 0x8e, 0xe3, 0x18, 0x30, 0xa8, 0xdc, 0xcb, - 0x09, 0xae, 0xd4, 0x9a, 0xf2, 0x57, 0xd5, 0x9a, 0x1e, 0x2c, 0x75, 0x9e, 0x44, 0x4e, 0xe2, 0xe8, - 0x04, 0x56, 0x2c, 0xc9, 0xe2, 0xce, 0x54, 0x46, 0xb5, 0xdc, 0x39, 0x49, 0x0e, 0x9e, 0x22, 0x02, - 0x4b, 0x84, 0xda, 0x5f, 0x2b, 0xb0, 0x26, 0x87, 0x28, 0x3a, 0x19, 0xf5, 0xc9, 0xfb, 0x2c, 0xf5, - 0x82, 0x92, 0xba, 0xb2, 0x48, 0x48, 0x74, 0xcb, 0x3d, 0x19, 0xf5, 0x99, 0x00, 0xe4, 0x3c, 0x95, - 0x2b, 0x4b, 0x09, 0xc9, 0x63, 0x58, 0xee, 0xfa, 0xc3, 0x21, 0x15, 0x6b, 0x82, 0x4f, 0xf9, 0x05, - 0x80, 0x32, 0xca, 0x5a, 0xcf, 0x44, 0x85, 0xb6, 0x5f, 0xe0, 0xf7, 0xdc, 0x0b, 0x63, 0xba, 0xdf, - 0x7b, 0x9c, 0x2e, 0x61, 0xfb, 0x39, 0xbe, 0x54, 0x95, 0x79, 0x26, 0x67, 0x53, 0x3a, 0x67, 0x97, - 0x5c, 0x4b, 0x5a, 0x8c, 0xf5, 0x9c, 0x71, 0x36, 0x69, 0x7f, 0x5f, 0x81, 0x1b, 0xf9, 0xa6, 0xd5, - 0x86, 0xfe, 0x64, 0xd0, 0x0b, 0x1c, 0x6f, 0xd8, 0xf4, 0x0f, 0x43, 0x16, 0xb2, 0xfe, 0x30, 0xd1, - 0x50, 0xf3, 0x90, 0xf5, 0x87, 0x5e, 0x36, 0x64, 0x3d, 0x3e, 0x5d, 0x7f, 0x13, 0xaa, 0xd6, 0x87, - 0xd6, 0x87, 0x13, 0x57, 0xdc, 0x85, 0xd9, 0xfe, 0x10, 0x7e, 0x12, 0xda, 0x9f, 0x50, 0xa0, 0x7c, - 0x62, 0x08, 0x44, 0xed, 0xdf, 0x97, 0x80, 0xe4, 0xeb, 0x21, 0x6f, 0xc1, 0xca, 0xff, 0x03, 0x91, - 0x3c, 0x23, 0xca, 0x56, 0x9e, 0x4b, 0x94, 0xfd, 0x04, 0xd4, 0x3e, 0xed, 0x47, 0x3b, 0xa2, 0x1d, - 0x69, 0x0f, 0xfd, 0xf8, 0x44, 0xf8, 0x85, 0xa9, 0x73, 0x2a, 0xdd, 0xf1, 0x6c, 0x4f, 0xca, 0x32, - 0x91, 0x0f, 0xb7, 0x7e, 0x0a, 0x5f, 0xfb, 0x7d, 0x05, 0x36, 0x8a, 0xa6, 0x00, 0x3d, 0x3c, 0xe5, - 0xd3, 0x34, 0x3e, 0xcb, 0xf1, 0xf0, 0x94, 0x0f, 0xe0, 0xf4, 0x89, 0x9e, 0x21, 0xca, 0xf6, 0x47, - 0xe9, 0x79, 0xfa, 0x43, 0xfb, 0xaf, 0x65, 0x58, 0x66, 0x46, 0xcd, 0x3d, 0xd7, 0x19, 0x46, 0x47, - 0x74, 0x70, 0x45, 0x0e, 0x4a, 0xc9, 0xf5, 0x75, 0x46, 0xf2, 0xc9, 0x3b, 0x98, 0xee, 0x3f, 0xf2, - 0xfb, 0xfe, 0x50, 0x56, 0x0a, 0x8e, 0x39, 0x2c, 0x93, 0xed, 0x1f, 0x61, 0x74, 0xee, 0xf2, 0x94, - 0x02, 0xe5, 0x64, 0xee, 0x32, 0x43, 0xb7, 0x3c, 0x77, 0xb9, 0x51, 0xf9, 0x33, 0x38, 0x9b, 0xd8, - 0xa9, 0x63, 0xeb, 0xf6, 0x29, 0x5e, 0x15, 0x6d, 0xf1, 0x57, 0x45, 0xd7, 0x12, 0xd3, 0x37, 0xda, - 0xec, 0xb1, 0x34, 0x93, 0x87, 0xa1, 0xe8, 0x13, 0xe4, 0x3e, 0xa8, 0x09, 0x98, 0x27, 0x88, 0x60, - 0x12, 0x2f, 0x06, 0x6f, 0x92, 0xd8, 0xe6, 0x72, 0x45, 0xe4, 0x08, 0xe9, 0x21, 0x97, 0xc0, 0x8c, - 0xe4, 0x59, 0x99, 0x30, 0xff, 0xc4, 0xbc, 0xf0, 0xf5, 0x90, 0x7c, 0xc8, 0x65, 0xc8, 0xe8, 0x18, - 0x89, 0xbc, 0x26, 0x0b, 0xc9, 0x18, 0xf1, 0xf7, 0xf8, 0xf2, 0x18, 0x71, 0xac, 0xad, 0xef, 0x29, - 0xb0, 0xd6, 0xd0, 0x5b, 0x3c, 0x87, 0x21, 0xeb, 0xd5, 0x9b, 0x70, 0xb5, 0xa1, 0xb7, 0xec, 0x6e, - 0xa7, 0xd9, 0xa8, 0x3d, 0xb2, 0x0b, 0x53, 0x13, 0x5d, 0x85, 0x8b, 0x79, 0x94, 0xc4, 0xa4, 0x7f, - 0x05, 0x36, 0xf3, 0xc5, 0x22, 0x7d, 0x51, 0x31, 0xb1, 0xc8, 0x74, 0x54, 0xde, 0xfa, 0x00, 0xd6, - 0x44, 0xaa, 0x9e, 0x5e, 0xd3, 0xc2, 0x64, 0x80, 0x6b, 0xb0, 0xf4, 0xc0, 0x30, 0x1b, 0x3b, 0x8f, - 0xec, 0x9d, 0xfd, 0x66, 0x53, 0x3d, 0x43, 0x56, 0x60, 0x91, 0x03, 0x6a, 0xba, 0xaa, 0x90, 0x65, - 0xa8, 0x36, 0xda, 0x96, 0x51, 0xdb, 0x37, 0x0d, 0xb5, 0xb4, 0xf5, 0x2f, 0x14, 0x58, 0xd9, 0x1f, - 0x0f, 0x9c, 0xc8, 0x0d, 0x78, 0x8b, 0xae, 0xc1, 0xa5, 0xfd, 0x6e, 0x5d, 0xef, 0x19, 0x66, 0x71, - 0x73, 0xce, 0xc1, 0x7a, 0xa6, 0xbc, 0x73, 0x5f, 0x55, 0xc8, 0x65, 0xb8, 0x90, 0x01, 0xd7, 0x1b, - 0x96, 0xbe, 0xcd, 0x5a, 0x71, 0x11, 0xce, 0x65, 0x0a, 0xbb, 0x8d, 0x76, 0xdb, 0xa8, 0xab, 0x65, - 0xda, 0xc0, 0xdc, 0xe7, 0x4c, 0x43, 0xaf, 0x53, 0x52, 0xb5, 0xb2, 0xf5, 0x01, 0xac, 0x76, 0xe3, - 0x77, 0x0a, 0xe8, 0x31, 0xb0, 0x00, 0x65, 0x53, 0x7f, 0xa8, 0x9e, 0x21, 0x00, 0xf3, 0xdd, 0xfb, - 0x35, 0xeb, 0xf6, 0x6d, 0x55, 0x21, 0x4b, 0xb0, 0xb0, 0x5b, 0xeb, 0xda, 0xf7, 0x5b, 0x96, 0x5a, - 0xa2, 0x3f, 0xf4, 0x87, 0x16, 0xfe, 0x28, 0x6f, 0xbd, 0x81, 0x56, 0xbe, 0xcf, 0x4e, 0x9a, 0x5e, - 0x18, 0xb9, 0x23, 0x37, 0xc0, 0x3e, 0x5a, 0x86, 0xaa, 0xe5, 0x52, 0x79, 0x25, 0x72, 0x59, 0x07, - 0xb5, 0x26, 0xc3, 0xc8, 0x1b, 0x0f, 0xdd, 0xcf, 0x54, 0x65, 0xeb, 0x2e, 0xac, 0x99, 0xfe, 0x24, - 0xf2, 0x46, 0x87, 0x56, 0x44, 0x31, 0x0e, 0x4f, 0xb0, 0xcd, 0x6d, 0xbd, 0xb5, 0xdd, 0xd8, 0xdd, - 0xef, 0xec, 0x5b, 0x76, 0x4b, 0xef, 0xd5, 0xf6, 0x98, 0xbf, 0x42, 0xab, 0x63, 0xf5, 0x6c, 0xd3, - 0xa8, 0x19, 0xed, 0x9e, 0xaa, 0x6c, 0xfd, 0x2e, 0x6a, 0x70, 0xfb, 0xfe, 0x68, 0xb0, 0xe3, 0xf4, - 0x23, 0x3f, 0xc0, 0x0a, 0x6b, 0x70, 0xcd, 0x32, 0x6a, 0x9d, 0x76, 0xdd, 0xde, 0xd1, 0x6b, 0xbd, - 0x8e, 0x59, 0x94, 0xbb, 0xeb, 0x12, 0x9c, 0x2f, 0xc0, 0xe9, 0xf4, 0xba, 0xaa, 0x42, 0xae, 0xc3, - 0xe5, 0x82, 0xb2, 0x87, 0xc6, 0xb6, 0xbe, 0xdf, 0xdb, 0x6b, 0xab, 0xa5, 0x29, 0xc4, 0x96, 0xd5, - 0x51, 0xcb, 0x5b, 0xbf, 0xad, 0xc0, 0xea, 0x7e, 0xc8, 0x9f, 0x47, 0xed, 0x63, 0x54, 0x89, 0x1b, - 0x70, 0x65, 0xdf, 0x32, 0x4c, 0xbb, 0xd7, 0xb9, 0x6f, 0xb4, 0xed, 0x7d, 0x4b, 0xdf, 0xcd, 0xd6, - 0xe6, 0x3a, 0x5c, 0x96, 0x30, 0x4c, 0xa3, 0xd6, 0x79, 0x60, 0x98, 0x76, 0x57, 0xb7, 0xac, 0x87, - 0x1d, 0xb3, 0xae, 0x2a, 0xf4, 0x8b, 0x05, 0x08, 0xad, 0x1d, 0x9d, 0xd5, 0x26, 0x55, 0xd6, 0x36, - 0x1e, 0xea, 0x4d, 0x7b, 0xbb, 0xd3, 0x53, 0xcb, 0x5b, 0x2d, 0x7a, 0x8b, 0xc0, 0x0c, 0x3a, 0xcc, - 0xc5, 0xbd, 0x0a, 0x95, 0x76, 0xa7, 0x6d, 0x64, 0xbd, 0x5c, 0x96, 0xa1, 0xaa, 0x77, 0xbb, 0x66, - 0xe7, 0x01, 0x4e, 0x1e, 0x80, 0xf9, 0xba, 0xd1, 0x6e, 0xe0, 0x6c, 0x59, 0x86, 0x6a, 0xd7, 0xec, - 0xb4, 0x3a, 0x3d, 0xa3, 0xae, 0x56, 0xb6, 0x4c, 0x71, 0xb0, 0x0a, 0xa6, 0x7d, 0x9f, 0xb9, 0x94, - 0xd4, 0x8d, 0x1d, 0x7d, 0xbf, 0xd9, 0xe3, 0x43, 0xf4, 0xc8, 0x36, 0x8d, 0x0f, 0xf7, 0x0d, 0xab, - 0x67, 0xa9, 0x0a, 0x51, 0x61, 0xb9, 0x6d, 0x18, 0x75, 0xcb, 0x36, 0x8d, 0x07, 0x0d, 0xe3, 0xa1, - 0x5a, 0xa2, 0x3c, 0xd9, 0xff, 0xf4, 0x0b, 0x5b, 0x3f, 0x50, 0x80, 0xb0, 0xec, 0x43, 0x22, 0xa5, - 0x2d, 0xce, 0x98, 0x6b, 0x70, 0x69, 0x8f, 0x0e, 0x35, 0x36, 0xad, 0xd5, 0xa9, 0x67, 0xbb, 0xec, - 0x3c, 0x90, 0x4c, 0x79, 0x67, 0x67, 0x07, 0x97, 0xc5, 0xd9, 0x0c, 0xbc, 0x6e, 0x76, 0xba, 0x6a, - 0xe9, 0x52, 0xa9, 0xaa, 0x90, 0x0b, 0xb9, 0xc2, 0xfb, 0x86, 0xd1, 0x55, 0xcb, 0x74, 0x88, 0x32, - 0x05, 0x62, 0xc9, 0x32, 0xf2, 0xca, 0xd6, 0x77, 0x15, 0x38, 0xcf, 0xaa, 0x29, 0xd6, 0x7f, 0x5c, - 0xd5, 0x2b, 0xb0, 0xc9, 0x73, 0xaa, 0x15, 0x55, 0x74, 0x03, 0xd4, 0x54, 0x29, 0xab, 0xe6, 0x39, - 0x58, 0x4f, 0x41, 0xb1, 0x1e, 0x25, 0xba, 0xbb, 0xa5, 0xc0, 0xdb, 0x86, 0xd5, 0xb3, 0x8d, 0x9d, - 0x9d, 0x8e, 0xd9, 0x63, 0x15, 0x29, 0x6f, 0x69, 0xb0, 0x5e, 0x73, 0x83, 0xc8, 0xf8, 0x2c, 0x72, - 0x47, 0xa1, 0xe7, 0x8f, 0xb0, 0x0a, 0x2b, 0xb0, 0x68, 0xfc, 0x72, 0xcf, 0x68, 0x5b, 0x8d, 0x4e, - 0x5b, 0x3d, 0xb3, 0x75, 0x25, 0x83, 0x23, 0xd6, 0xb1, 0x65, 0xed, 0xa9, 0x67, 0xb6, 0x1c, 0x58, - 0x11, 0x2f, 0x80, 0xd8, 0xac, 0xb8, 0x06, 0x97, 0xc4, 0x5c, 0xc3, 0x3d, 0x21, 0xdb, 0x84, 0x4d, - 0xd8, 0xc8, 0x97, 0x1b, 0x3d, 0x55, 0xa1, 0xa3, 0x90, 0x29, 0xa1, 0xf0, 0xd2, 0xd6, 0x6f, 0x2a, - 0xb0, 0x12, 0x1b, 0x6b, 0xd1, 0x18, 0x74, 0x1d, 0x2e, 0xb7, 0x76, 0x74, 0xbb, 0x6e, 0x3c, 0x68, - 0xd4, 0x0c, 0xfb, 0x7e, 0xa3, 0x5d, 0xcf, 0x7c, 0xe4, 0x22, 0x9c, 0x2b, 0x40, 0xc0, 0xaf, 0x6c, - 0xc2, 0x46, 0xb6, 0xa8, 0x47, 0x97, 0x6a, 0x89, 0x76, 0x7d, 0xb6, 0x24, 0x5e, 0xa7, 0xe5, 0xad, - 0x07, 0xb0, 0x6a, 0xe9, 0xad, 0xe6, 0x8e, 0x1f, 0xf4, 0x5d, 0x7d, 0x12, 0x1d, 0x8d, 0xe8, 0xa6, - 0xb9, 0xd3, 0x31, 0x6b, 0x86, 0x8d, 0x28, 0x99, 0x1a, 0x9c, 0x85, 0x35, 0xb9, 0xf0, 0x91, 0x41, - 0xa7, 0x2f, 0x81, 0x55, 0x19, 0xd8, 0xee, 0xa8, 0xa5, 0xad, 0x5f, 0x81, 0xe5, 0x54, 0x66, 0xfb, - 0x0b, 0x70, 0x56, 0xfe, 0xdd, 0x75, 0x47, 0x03, 0x6f, 0x74, 0xa8, 0x9e, 0xc9, 0x16, 0x98, 0x93, - 0xd1, 0x88, 0x16, 0xe0, 0x7a, 0x96, 0x0b, 0x7a, 0x6e, 0x70, 0xec, 0x8d, 0x9c, 0xc8, 0x1d, 0xa8, - 0xa5, 0xad, 0xd7, 0x61, 0x25, 0x95, 0x4f, 0x8b, 0x0e, 0x5c, 0xb3, 0xc3, 0x37, 0xe0, 0x96, 0x51, - 0x6f, 0xec, 0xb7, 0xd4, 0x39, 0xba, 0x92, 0xf7, 0x1a, 0xbb, 0x7b, 0x2a, 0x6c, 0xfd, 0x9e, 0x02, - 0xab, 0x3c, 0x4b, 0x6e, 0x6b, 0x47, 0x17, 0x43, 0x4d, 0xa7, 0x19, 0xcb, 0xd2, 0x67, 0x58, 0x16, - 0x73, 0xee, 0xba, 0x02, 0x9b, 0xfc, 0x87, 0xad, 0xb7, 0xeb, 0xf6, 0x9e, 0x6e, 0xd6, 0x1f, 0xea, - 0x26, 0x9d, 0x7b, 0x8f, 0xd4, 0x12, 0x2e, 0x28, 0x09, 0x62, 0xf7, 0x3a, 0xfb, 0xb5, 0x3d, 0xb5, - 0x4c, 0xe7, 0x6f, 0x0a, 0xde, 0x6d, 0xb4, 0xd5, 0x0a, 0x2e, 0xcf, 0x1c, 0x36, 0xb2, 0xa5, 0xe5, - 0x73, 0x5b, 0x3f, 0x55, 0xe0, 0x82, 0xe5, 0x1d, 0x8e, 0x9c, 0x68, 0x12, 0xb8, 0xfa, 0xf0, 0xd0, - 0x0f, 0xbc, 0xe8, 0xe8, 0xd8, 0x9a, 0x78, 0x91, 0x4b, 0x5e, 0x81, 0x97, 0xac, 0xc6, 0x6e, 0x5b, - 0xef, 0xd1, 0xe5, 0xa5, 0x37, 0x77, 0x3b, 0x66, 0xa3, 0xb7, 0xd7, 0xb2, 0xad, 0xfd, 0x46, 0x6e, - 0xe6, 0xbd, 0x08, 0x37, 0xa6, 0xa3, 0x36, 0x8d, 0x5d, 0xbd, 0xf6, 0x48, 0x55, 0x66, 0x33, 0xdc, - 0xd6, 0x9b, 0x7a, 0xbb, 0x66, 0xd4, 0xed, 0x07, 0xb7, 0xd5, 0x12, 0x79, 0x09, 0x6e, 0x4e, 0x47, - 0xdd, 0x69, 0x74, 0x2d, 0x8a, 0x56, 0x9e, 0xfd, 0xdd, 0x3d, 0xab, 0x45, 0xb1, 0x2a, 0x5b, 0xbf, - 0xaf, 0xc0, 0xe6, 0xb4, 0xa8, 0xb8, 0xe4, 0x16, 0x68, 0x46, 0xbb, 0x67, 0xea, 0x8d, 0xba, 0x5d, - 0x33, 0x8d, 0xba, 0xd1, 0xee, 0x35, 0xf4, 0xa6, 0x65, 0x5b, 0x9d, 0x7d, 0x3a, 0x9b, 0x12, 0x1f, - 0xbc, 0x17, 0xe0, 0xfa, 0x0c, 0xbc, 0x4e, 0xa3, 0x5e, 0x53, 0x15, 0x72, 0x1b, 0x5e, 0x9b, 0x81, - 0x64, 0x3d, 0xb2, 0x7a, 0x46, 0x4b, 0x2e, 0x51, 0x4b, 0xb8, 0x61, 0x15, 0x07, 0x04, 0xa5, 0xad, - 0xc3, 0x92, 0xd9, 0x15, 0xbb, 0x09, 0x57, 0xa7, 0x62, 0xf1, 0x6a, 0xbd, 0x00, 0xd7, 0xa7, 0xa2, - 0xb0, 0x4a, 0xa9, 0xa5, 0xad, 0x8f, 0xe0, 0xd2, 0xf4, 0xe0, 0x75, 0xf4, 0xbc, 0x48, 0x0f, 0x79, - 0x15, 0x2a, 0x75, 0x7a, 0x44, 0xa5, 0xb2, 0x4a, 0xd2, 0xd9, 0x69, 0x1a, 0x8d, 0x56, 0x97, 0x6e, - 0x84, 0xfc, 0x70, 0xc1, 0xd3, 0xe3, 0x3b, 0x0a, 0xa8, 0xd9, 0x88, 0x4f, 0x39, 0x77, 0x4e, 0x73, - 0xbf, 0xdd, 0x66, 0x07, 0xdd, 0x1a, 0x2c, 0x75, 0x7a, 0x7b, 0x86, 0xc9, 0x13, 0x76, 0x62, 0x86, - 0xce, 0xfd, 0x36, 0x5d, 0xda, 0x1d, 0xb3, 0xf1, 0x2d, 0x3c, 0xf1, 0x36, 0x61, 0xc3, 0x6a, 0xea, - 0xb5, 0xfb, 0x76, 0xbb, 0xd3, 0xb3, 0x1b, 0x6d, 0xbb, 0xb6, 0xa7, 0xb7, 0xdb, 0x46, 0x53, 0x05, - 0xba, 0x67, 0x77, 0xee, 0xf7, 0x74, 0xbb, 0xd6, 0x69, 0xef, 0x34, 0x76, 0x39, 0x8b, 0x0d, 0x9c, - 0x05, 0xd3, 0x02, 0x18, 0x90, 0xaf, 0xc1, 0xcb, 0x48, 0xd3, 0x6d, 0xee, 0xef, 0x36, 0xda, 0xb6, - 0xf5, 0xa8, 0x5d, 0x13, 0x62, 0x57, 0x2d, 0x7f, 0x56, 0xbc, 0x0c, 0x2f, 0xce, 0xc4, 0x4e, 0x32, - 0x6e, 0xde, 0x02, 0x6d, 0x26, 0x26, 0x6f, 0xdf, 0xd6, 0x9f, 0x28, 0x70, 0x79, 0x86, 0xd3, 0x0d, - 0x79, 0x0d, 0x5e, 0xd9, 0x33, 0xf4, 0x7a, 0xd3, 0xb0, 0x2c, 0xdc, 0xe1, 0xe8, 0x20, 0x32, 0x6f, - 0xd0, 0xc2, 0x93, 0xe0, 0x15, 0x78, 0x69, 0x36, 0x7a, 0x22, 0x53, 0xbc, 0x0c, 0x2f, 0xce, 0x46, - 0xe5, 0x32, 0x46, 0x89, 0x6c, 0xc1, 0xad, 0xd9, 0x98, 0xb1, 0x6c, 0x52, 0xde, 0xfa, 0x1d, 0x05, - 0xce, 0x17, 0xeb, 0xb9, 0x69, 0xdd, 0x1a, 0x6d, 0xab, 0xa7, 0x37, 0x9b, 0x76, 0x57, 0x37, 0xf5, - 0x96, 0x6d, 0xb4, 0xcd, 0x4e, 0xb3, 0x59, 0x74, 0x26, 0xbf, 0x08, 0x37, 0xa6, 0xa3, 0x5a, 0x35, - 0xb3, 0xd1, 0xa5, 0xc7, 0x8e, 0x06, 0xd7, 0xa6, 0x63, 0x19, 0x8d, 0x9a, 0xa1, 0x96, 0xb6, 0xdf, - 0xfb, 0xe3, 0x3f, 0xbf, 0x76, 0xe6, 0x8f, 0x7f, 0x7a, 0x4d, 0xf9, 0x8f, 0x3f, 0xbd, 0xa6, 0xfc, - 0xd9, 0x4f, 0xaf, 0x29, 0xdf, 0x7a, 0xf5, 0x74, 0xc9, 0xaa, 0xf1, 0xd6, 0xfe, 0x78, 0x1e, 0xaf, - 0x7f, 0x6f, 0xfe, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1d, 0x80, 0x83, 0x1c, 0x84, 0xe1, 0x01, - 0x00, + // 33030 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6d, 0x70, 0x1c, 0x49, + 0x76, 0x18, 0x38, 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, 0x02, 0x64, 0x4f, 0x35, 0x40, 0xee, 0x6a, 0x77, 0xb6, 0xb6, 0xd0, 0x9d, 0x00, 0x6a, + 0xd0, 0x5d, 0xd5, 0x5b, 0x55, 0x4d, 0x12, 0x5a, 0xeb, 0xfc, 0xa5, 0x3d, 0xd9, 0xa1, 0x93, 0x64, + 0xc9, 0x92, 0xb5, 0xbe, 0xb0, 0x15, 0x0e, 0xd9, 0xbe, 0xf0, 0xd9, 0x21, 0x9d, 0x2d, 0xd9, 0x77, + 0xbe, 0x50, 0x48, 0x5e, 0xdd, 0xd9, 0xb2, 0xce, 0x71, 0x71, 0x52, 0xf8, 0x7c, 0x5f, 0x1b, 0x0a, + 0x28, 0x7c, 0xba, 0xb8, 0x1f, 0x88, 0xb8, 0x38, 0xe9, 0x2e, 0xe2, 0x22, 0x6e, 0x15, 0x3a, 0x5f, + 0xe4, 0xcb, 0xcc, 0xaa, 0xcc, 0xaa, 0xea, 0x46, 0x73, 0x86, 0x23, 0x8b, 0x1b, 0xfa, 0x43, 0xa2, + 0x33, 0xdf, 0x7b, 0x59, 0xf9, 0xf5, 0xf2, 0xe5, 0xcb, 0xf7, 0x01, 0x2f, 0x84, 0xb4, 0x4d, 0xbb, + 0x9e, 0x1f, 0x5e, 0x69, 0xd3, 0x3d, 0xbb, 0x79, 0x78, 0x25, 0x3c, 0xec, 0xd2, 0x80, 0xff, 0x7b, + 0xb9, 0xeb, 0x7b, 0xa1, 0x47, 0x46, 0xf1, 0xc7, 0xe2, 0xfc, 0x9e, 0xb7, 0xe7, 0x61, 0xc9, 0x15, + 0xf6, 0x17, 0xaf, 0x5c, 0x7c, 0x7e, 0xcf, 0xf3, 0xf6, 0xda, 0xf4, 0x0a, 0xfe, 0xda, 0xe9, 0xed, + 0x5e, 0x69, 0xf5, 0x7c, 0x3b, 0x74, 0x3c, 0x57, 0xd4, 0x57, 0x92, 0xf5, 0xa1, 0xd3, 0xa1, 0x41, + 0x68, 0x77, 0xba, 0xfd, 0x08, 0x3c, 0xf4, 0xed, 0x6e, 0x97, 0xfa, 0xa2, 0xf5, 0xc5, 0x4b, 0xd1, + 0x07, 0xda, 0x61, 0xc8, 0x30, 0x19, 0xf1, 0x2b, 0x0f, 0xae, 0xaa, 0x3f, 0x05, 0xe8, 0xf5, 0x3e, + 0x7d, 0xf1, 0x7b, 0x41, 0x48, 0x5b, 0x56, 0x8b, 0x3e, 0x70, 0x9a, 0xd4, 0xf2, 0xe9, 0x37, 0x7a, + 0x8e, 0x4f, 0x3b, 0xd4, 0x0d, 0x05, 0xde, 0x1b, 0xd9, 0x78, 0xf2, 0x43, 0x12, 0x5f, 0x64, 0xfc, + 0x5c, 0x01, 0x26, 0x6e, 0x53, 0xda, 0xad, 0xb6, 0x9d, 0x07, 0x94, 0xbc, 0x08, 0x23, 0x77, 0xec, + 0x0e, 0x5d, 0xc8, 0x9d, 0xcf, 0x5d, 0x9c, 0x58, 0x9e, 0x39, 0x3e, 0xaa, 0x4c, 0x06, 0xd4, 0x7f, + 0x40, 0x7d, 0xcb, 0xb5, 0x3b, 0xd4, 0xc4, 0x4a, 0xf2, 0x1a, 0x4c, 0xb0, 0xff, 0x83, 0xae, 0xdd, + 0xa4, 0x0b, 0x79, 0x84, 0x9c, 0x3a, 0x3e, 0xaa, 0x4c, 0xb8, 0xb2, 0xd0, 0x8c, 0xeb, 0xc9, 0x3a, + 0x8c, 0xaf, 0x3e, 0xea, 0x3a, 0x3e, 0x0d, 0x16, 0x46, 0xce, 0xe7, 0x2e, 0x4e, 0x2e, 0x2d, 0x5e, + 0xe6, 0x63, 0x74, 0x59, 0x8e, 0xd1, 0xe5, 0x2d, 0x39, 0x88, 0xcb, 0x73, 0xbf, 0x79, 0x54, 0x79, + 0xe6, 0xf8, 0xa8, 0x32, 0x4e, 0x39, 0xca, 0x5f, 0xf9, 0xdd, 0x4a, 0xce, 0x94, 0xf8, 0xe4, 0x1d, + 0x18, 0xd9, 0x3a, 0xec, 0xd2, 0x85, 0x89, 0xf3, 0xb9, 0x8b, 0xd3, 0x4b, 0xcf, 0x5f, 0xe6, 0xd3, + 0x1a, 0x7d, 0x7c, 0xfc, 0x17, 0x83, 0x5a, 0x2e, 0x1e, 0x1f, 0x55, 0x46, 0x18, 0x88, 0x89, 0x58, + 0xe4, 0x0d, 0x18, 0x5b, 0xf3, 0x82, 0x70, 0xbd, 0xb6, 0x00, 0xf8, 0xc9, 0xa7, 0x8e, 0x8f, 0x2a, + 0xb3, 0xfb, 0x5e, 0x10, 0x5a, 0x4e, 0xeb, 0x75, 0xaf, 0xe3, 0x84, 0xb4, 0xd3, 0x0d, 0x0f, 0x4d, + 0x01, 0x64, 0x3c, 0x82, 0x29, 0x8d, 0x1e, 0x99, 0x84, 0xf1, 0xed, 0x3b, 0xb7, 0xef, 0xdc, 0xbd, + 0x7f, 0xa7, 0xfc, 0x0c, 0x29, 0xc2, 0xc8, 0x9d, 0xbb, 0xb5, 0xd5, 0x72, 0x8e, 0x8c, 0x43, 0xa1, + 0x5a, 0xaf, 0x97, 0xf3, 0xa4, 0x04, 0xc5, 0x5a, 0x75, 0xab, 0xba, 0x5c, 0x6d, 0xac, 0x96, 0x0b, + 0x64, 0x0e, 0x66, 0xee, 0xaf, 0xdf, 0xa9, 0xdd, 0xbd, 0xdf, 0xb0, 0x6a, 0xab, 0x8d, 0xdb, 0x5b, + 0x77, 0xeb, 0xe5, 0x11, 0x32, 0x0d, 0x70, 0x7b, 0x7b, 0x79, 0xd5, 0xbc, 0xb3, 0xba, 0xb5, 0xda, + 0x28, 0x8f, 0x92, 0x79, 0x28, 0x4b, 0x14, 0xab, 0xb1, 0x6a, 0xde, 0x5b, 0x5f, 0x59, 0x2d, 0x8f, + 0xdd, 0x1a, 0x29, 0x16, 0xca, 0x23, 0xe6, 0xf8, 0x06, 0xb5, 0x03, 0xba, 0x5e, 0x33, 0xfe, 0x76, + 0x01, 0x8a, 0x9b, 0x34, 0xb4, 0x5b, 0x76, 0x68, 0x93, 0xe7, 0xb4, 0xf9, 0xc1, 0x2e, 0x2a, 0x13, + 0xf3, 0x62, 0x7a, 0x62, 0x46, 0x8f, 0x8f, 0x2a, 0xb9, 0x37, 0xd4, 0x09, 0x79, 0x1b, 0x26, 0x6b, + 0x34, 0x68, 0xfa, 0x4e, 0x97, 0x2d, 0xb6, 0x85, 0x02, 0x82, 0x9d, 0x3d, 0x3e, 0xaa, 0x9c, 0x6a, + 0xc5, 0xc5, 0xca, 0x80, 0xa8, 0xd0, 0x64, 0x1d, 0xc6, 0x36, 0xec, 0x1d, 0xda, 0x0e, 0x16, 0x46, + 0xcf, 0x17, 0x2e, 0x4e, 0x2e, 0x3d, 0x2b, 0x26, 0x41, 0x7e, 0xe0, 0x65, 0x5e, 0xbb, 0xea, 0x86, + 0xfe, 0xe1, 0xf2, 0xfc, 0xf1, 0x51, 0xa5, 0xdc, 0xc6, 0x02, 0x75, 0x80, 0x39, 0x08, 0x69, 0xc4, + 0x0b, 0x63, 0xec, 0xc4, 0x85, 0x71, 0xee, 0x37, 0x8f, 0x2a, 0x39, 0x36, 0x61, 0x62, 0x61, 0xc4, + 0xf4, 0xf4, 0x25, 0xb2, 0x04, 0x45, 0x93, 0x3e, 0x70, 0x02, 0xd6, 0xb3, 0x22, 0xf6, 0xec, 0xf4, + 0xf1, 0x51, 0x85, 0xf8, 0xa2, 0x4c, 0xf9, 0x8c, 0x08, 0x6e, 0xf1, 0x2d, 0x98, 0x54, 0xbe, 0x9a, + 0x94, 0xa1, 0x70, 0x40, 0x0f, 0xf9, 0x08, 0x9b, 0xec, 0x4f, 0x32, 0x0f, 0xa3, 0x0f, 0xec, 0x76, + 0x4f, 0x0c, 0xa9, 0xc9, 0x7f, 0x7c, 0x21, 0xff, 0xf9, 0xdc, 0xad, 0x91, 0xe2, 0x78, 0xb9, 0x68, + 0xe6, 0xd7, 0x6b, 0xc6, 0x4f, 0x8d, 0x40, 0xd1, 0xf4, 0xf8, 0x06, 0x26, 0x97, 0x60, 0xb4, 0x11, + 0xda, 0xa1, 0x9c, 0xa6, 0xb9, 0xe3, 0xa3, 0xca, 0x0c, 0xdb, 0xdc, 0x54, 0x69, 0x9f, 0x43, 0x30, + 0xd0, 0xfa, 0xbe, 0x1d, 0xc8, 0xe9, 0x42, 0xd0, 0x2e, 0x2b, 0x50, 0x41, 0x11, 0x82, 0x5c, 0x80, + 0x91, 0x4d, 0xaf, 0x45, 0xc5, 0x8c, 0x91, 0xe3, 0xa3, 0xca, 0x74, 0xc7, 0x6b, 0xa9, 0x80, 0x58, + 0x4f, 0x5e, 0x87, 0x89, 0x95, 0x9e, 0xef, 0x53, 0x97, 0xad, 0xf5, 0x11, 0x04, 0x9e, 0x3e, 0x3e, + 0xaa, 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, + 0xc7, 0x47, 0x95, 0xd3, 0x7b, 0xac, 0xd8, 0xea, 0x62, 0x79, 0x8c, 0xfd, 0xbd, 0xa3, 0x4a, 0xb1, + 0x26, 0x58, 0xad, 0xa9, 0xa2, 0x92, 0xaf, 0xb3, 0xc9, 0x09, 0x42, 0x1c, 0x5a, 0xda, 0x5a, 0x18, + 0x3f, 0xf1, 0x13, 0x0d, 0xf1, 0x89, 0xa7, 0xdb, 0x76, 0x10, 0x5a, 0x3e, 0xc7, 0x4b, 0x7c, 0xa7, + 0x4a, 0x92, 0xdc, 0x85, 0x62, 0xa3, 0xb9, 0x4f, 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, 0x42, 0xf1, 0xdb, 0x7f, 0xab, 0xf2, 0xcc, 0x9f, 0xfb, 0x9d, 0xf3, 0xcf, 0x18, 0xff, + 0x45, 0x1e, 0xca, 0x49, 0x22, 0x64, 0x17, 0xa6, 0xb6, 0xbb, 0x2d, 0x3b, 0xa4, 0x2b, 0x6d, 0x87, + 0xba, 0x61, 0x80, 0x8b, 0x64, 0x70, 0x9f, 0x5e, 0x12, 0xed, 0x2e, 0xf4, 0x10, 0xd1, 0x6a, 0x72, + 0xcc, 0x44, 0xaf, 0x74, 0xb2, 0x71, 0x3b, 0x0d, 0x64, 0xe0, 0x01, 0xae, 0xb0, 0xc7, 0x6b, 0x87, + 0xb3, 0xfe, 0x3e, 0xed, 0x08, 0xb2, 0x62, 0x01, 0xb9, 0xad, 0x9d, 0x43, 0x5c, 0x99, 0xc3, 0x2f, + 0x20, 0x86, 0x92, 0xb1, 0x80, 0x58, 0xb1, 0xf1, 0xbf, 0xe5, 0x60, 0xda, 0xa4, 0x81, 0xd7, 0xf3, + 0x9b, 0x74, 0x8d, 0xda, 0x2d, 0xea, 0xb3, 0xe5, 0x7f, 0xdb, 0x71, 0x5b, 0x62, 0x4f, 0xe1, 0xf2, + 0x3f, 0x70, 0x5c, 0x95, 0x75, 0x63, 0x3d, 0xf9, 0x0c, 0x8c, 0x37, 0x7a, 0x3b, 0x08, 0x9a, 0x8f, + 0x39, 0x40, 0xd0, 0xdb, 0xb1, 0x12, 0xe0, 0x12, 0x8c, 0x5c, 0x81, 0xf1, 0x7b, 0xd4, 0x0f, 0x62, + 0x6e, 0x88, 0x47, 0xc3, 0x03, 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, 0xe7, + 0xa1, 0x5c, 0xb3, 0x43, 0x7b, 0xc7, 0x0e, 0xc4, 0x78, 0xde, 0xbb, 0xc6, 0x78, 0xbc, 0xd2, 0x51, + 0xe4, 0xf1, 0xec, 0xcb, 0x3f, 0x76, 0xf7, 0x5e, 0x4e, 0x76, 0x6f, 0x92, 0x9d, 0xb0, 0xa2, 0x7b, + 0x71, 0xa7, 0xde, 0x3d, 0xb9, 0x53, 0x65, 0xd1, 0xa9, 0xa2, 0xec, 0x54, 0xdc, 0x15, 0xf2, 0x2e, + 0x8c, 0x34, 0xba, 0xb4, 0x29, 0x98, 0x88, 0x3c, 0x17, 0xf4, 0xce, 0x31, 0x80, 0x7b, 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, 0xef, 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, 0x7d, + 0x51, 0x66, 0x46, 0xb5, 0xe4, 0xc5, 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, + 0x77, 0x8d, 0xaf, 0x89, 0x96, 0xf8, 0xad, 0x92, 0x91, 0x30, 0xe4, 0x1a, 0x14, 0xeb, 0xbe, 0xf7, + 0xe8, 0x70, 0xbd, 0x16, 0x2c, 0x4c, 0x9d, 0x2f, 0x5c, 0x9c, 0x58, 0x3e, 0x73, 0x7c, 0x54, 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, 0xcd, 0x75, 0x73, 0x6c, 0xa5, 0xba, 0x42, 0xfd, 0xd0, 0x2c, + 0x54, 0xef, 0x37, 0xcc, 0xa9, 0xda, 0xa1, 0x6b, 0x77, 0x9c, 0x26, 0x3f, 0x81, 0xcd, 0xc2, 0xcd, + 0x95, 0xba, 0xe1, 0xc2, 0xe9, 0xec, 0x69, 0x27, 0x5b, 0x50, 0xda, 0xb2, 0xfd, 0x3d, 0x1a, 0xae, + 0x51, 0xbb, 0x1d, 0xee, 0x2f, 0x4c, 0xe3, 0x00, 0xcc, 0x89, 0x01, 0x50, 0xab, 0x96, 0x9f, 0x3d, + 0x3e, 0xaa, 0x9c, 0x09, 0xb1, 0xc4, 0xda, 0xc7, 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, 0x46, 0x1e, 0x20, 0xae, 0x79, 0x4a, 0xb7, 0xf0, 0xe7, 0xb4, 0x2d, 0x7c, + 0x2a, 0xb9, 0x03, 0xfb, 0x6f, 0xde, 0xf7, 0x13, 0x9b, 0xf7, 0x4c, 0x12, 0x75, 0xf8, 0x6d, 0xfb, + 0x73, 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, 0x1f, 0x55, 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, + 0xfd, 0xc6, 0xf2, 0x29, 0x41, 0x69, 0xca, 0x7e, 0xa8, 0xa2, 0x33, 0x68, 0xf2, 0x36, 0xb0, 0x2d, + 0x23, 0xc6, 0x9d, 0x08, 0xa4, 0x9b, 0x2b, 0xf5, 0x95, 0xb6, 0xd7, 0x6b, 0x35, 0x3e, 0xd8, 0x88, + 0x91, 0xf7, 0x9a, 0x5d, 0x15, 0xf9, 0xe6, 0x4a, 0x9d, 0xbc, 0x0d, 0xa3, 0xd5, 0x1f, 0xec, 0xf9, + 0x54, 0x88, 0x55, 0x25, 0xd9, 0x26, 0x2b, 0x5b, 0x3e, 0x23, 0x10, 0x67, 0x6c, 0xf6, 0x53, 0x15, + 0x47, 0xb1, 0x9e, 0xb5, 0xbc, 0xb5, 0xd1, 0x10, 0x22, 0x13, 0x49, 0x0c, 0xcb, 0xd6, 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, + 0xcd, 0xc3, 0xc6, 0x07, 0x1b, 0x82, 0x79, 0xca, 0x2d, 0x8f, 0x65, 0x77, 0x91, 0xcd, 0x04, 0xf1, + 0x17, 0x77, 0x0e, 0x83, 0x6f, 0xb4, 0xd5, 0x2f, 0x46, 0x30, 0x52, 0x87, 0x89, 0x6a, 0xab, 0xe3, + 0xb8, 0xdb, 0x01, 0xf5, 0x17, 0x26, 0x91, 0xce, 0x42, 0xe2, 0xbb, 0xa3, 0xfa, 0xe5, 0x85, 0xe3, + 0xa3, 0xca, 0xbc, 0xcd, 0x7e, 0x5a, 0xbd, 0x80, 0xfa, 0x0a, 0xb5, 0x98, 0x08, 0xa9, 0x03, 0x6c, + 0x7a, 0xee, 0x9e, 0x57, 0x0d, 0xdb, 0x76, 0x90, 0x60, 0xc7, 0x71, 0x45, 0x24, 0xf5, 0x9c, 0xea, + 0xb0, 0x32, 0xcb, 0x66, 0x85, 0x0a, 0x41, 0x85, 0x06, 0xb9, 0x01, 0x63, 0x77, 0x7d, 0xbb, 0xd9, + 0xa6, 0x0b, 0x53, 0x48, 0x6d, 0x5e, 0x50, 0xe3, 0x85, 0xb2, 0xa7, 0x0b, 0x82, 0x60, 0xd9, 0xc3, + 0x62, 0xf5, 0x76, 0xc5, 0x01, 0x17, 0xef, 0x03, 0x49, 0xaf, 0xc9, 0x8c, 0xbb, 0xcd, 0x6b, 0xea, + 0xdd, 0x26, 0xde, 0xf4, 0x2b, 0x5e, 0xa7, 0x63, 0xbb, 0x2d, 0xc4, 0xbd, 0xb7, 0xa4, 0x5c, 0x79, + 0x8c, 0x6f, 0xc0, 0x6c, 0x6a, 0xb0, 0x4e, 0xb8, 0x96, 0xbe, 0x07, 0x33, 0x35, 0xba, 0x6b, 0xf7, + 0xda, 0x61, 0x74, 0x72, 0xf1, 0x2d, 0x8a, 0x17, 0xc4, 0x16, 0xaf, 0xb2, 0xe4, 0x71, 0x65, 0x26, + 0x81, 0x8d, 0x77, 0x61, 0x4a, 0xeb, 0x3e, 0xbb, 0xe1, 0x54, 0x7b, 0x2d, 0x27, 0xc4, 0x89, 0xcc, + 0xc5, 0x37, 0x1c, 0x9b, 0x15, 0xe2, 0x74, 0x99, 0x31, 0x80, 0xf1, 0x77, 0x54, 0x21, 0x4b, 0x9e, + 0x24, 0x6f, 0x44, 0xfc, 0x20, 0x17, 0x8b, 0x7c, 0x29, 0x7e, 0x10, 0x71, 0x83, 0x4b, 0x7c, 0x6f, + 0xe6, 0x53, 0x7b, 0x73, 0x52, 0xcc, 0x44, 0xc1, 0x7e, 0x18, 0xf0, 0x1d, 0x19, 0xad, 0xd4, 0xc2, + 0xc7, 0x5f, 0xa9, 0xef, 0x43, 0x69, 0xd3, 0x76, 0xed, 0x3d, 0xda, 0x62, 0x3d, 0xe0, 0xbc, 0x67, + 0x82, 0x1f, 0x69, 0x1d, 0x5e, 0x8e, 0xbd, 0x54, 0x17, 0x91, 0x86, 0x40, 0xae, 0xca, 0x9d, 0x3d, + 0x9a, 0xb1, 0xb3, 0xa7, 0x44, 0xeb, 0xa3, 0xb8, 0xb3, 0xc5, 0x7e, 0x36, 0xbe, 0x33, 0x81, 0x7d, + 0x24, 0xaf, 0xc3, 0x98, 0x49, 0xf7, 0xd8, 0x51, 0x93, 0x8b, 0x27, 0xc9, 0xc7, 0x12, 0x75, 0x60, + 0x38, 0x0c, 0xca, 0x35, 0xb4, 0x15, 0xec, 0x3b, 0xbb, 0xa1, 0x18, 0x9d, 0x48, 0xae, 0x11, 0xc5, + 0x8a, 0x5c, 0x23, 0x4a, 0xf4, 0x5b, 0x38, 0x2f, 0x63, 0xdc, 0xcf, 0xac, 0x35, 0xc4, 0xa0, 0xc9, + 0x11, 0x36, 0x6b, 0x0a, 0x1b, 0xf1, 0x35, 0xa9, 0x84, 0x41, 0x93, 0xeb, 0x30, 0x51, 0x6d, 0x36, + 0xbd, 0x9e, 0x72, 0xd5, 0xe5, 0xfb, 0x96, 0x17, 0xea, 0x9a, 0x9d, 0x18, 0x94, 0x34, 0x60, 0x72, + 0x95, 0xdd, 0x0f, 0x9d, 0x15, 0xbb, 0xb9, 0x2f, 0x07, 0x49, 0xf2, 0x30, 0xa5, 0x26, 0xde, 0xb9, + 0x14, 0x0b, 0x9b, 0xac, 0x50, 0xd5, 0x8d, 0x28, 0xb0, 0x64, 0x0b, 0x26, 0x1b, 0xb4, 0xe9, 0xd3, + 0xb0, 0x11, 0x7a, 0x3e, 0x4d, 0xb0, 0x64, 0xa5, 0x66, 0xf9, 0x79, 0x79, 0x45, 0x0d, 0xb0, 0xd0, + 0x0a, 0x58, 0xa9, 0x4a, 0x55, 0x01, 0xe6, 0x77, 0x8d, 0x8e, 0xe7, 0x1f, 0xd6, 0x96, 0x05, 0x9b, + 0x8e, 0xcf, 0x74, 0x5e, 0xac, 0xde, 0x35, 0x58, 0x49, 0x6b, 0x47, 0xbf, 0x6b, 0x70, 0x28, 0x9c, + 0xa9, 0x5a, 0x03, 0x65, 0x39, 0xc1, 0xb4, 0x67, 0xe2, 0x51, 0xc6, 0x62, 0x65, 0xa6, 0x5a, 0x01, + 0x4a, 0x82, 0xda, 0x4c, 0x09, 0x28, 0xd2, 0x05, 0x22, 0x67, 0x8d, 0x8b, 0x67, 0x6d, 0x1a, 0x04, + 0x82, 0x97, 0x9f, 0x4d, 0x4c, 0x7e, 0x0c, 0xb0, 0xfc, 0xb2, 0x20, 0x7e, 0x4e, 0x2e, 0x03, 0x71, + 0xbd, 0x64, 0x95, 0x4a, 0x3b, 0x19, 0xb4, 0xc9, 0x5b, 0x00, 0xab, 0x8f, 0x42, 0xea, 0xbb, 0x76, + 0x3b, 0x52, 0xdf, 0xa1, 0xc6, 0x8a, 0x8a, 0x52, 0x7d, 0xa2, 0x15, 0x60, 0xb2, 0x02, 0x53, 0xd5, + 0x20, 0xe8, 0x75, 0xa8, 0xe9, 0xb5, 0x69, 0xd5, 0xbc, 0x83, 0x7c, 0x7f, 0x62, 0xf9, 0xdc, 0xf1, + 0x51, 0xe5, 0xac, 0x8d, 0x15, 0x96, 0xef, 0xb5, 0xa9, 0x65, 0xfb, 0xea, 0xea, 0xd6, 0x71, 0xc8, + 0x5d, 0x80, 0xbb, 0x5d, 0xea, 0x36, 0xa8, 0xed, 0x37, 0xf7, 0x13, 0x6c, 0x3e, 0xae, 0x58, 0x7e, + 0x4e, 0xf4, 0x70, 0xde, 0xeb, 0x52, 0x37, 0xc0, 0x32, 0xf5, 0xab, 0x62, 0x48, 0x72, 0x1f, 0x66, + 0xd6, 0xab, 0x9b, 0x75, 0xaf, 0xed, 0x34, 0x0f, 0x85, 0xe4, 0x34, 0x8d, 0x4a, 0xcd, 0xd3, 0x82, + 0x6a, 0xa2, 0x96, 0xb3, 0x27, 0xc7, 0xee, 0x58, 0x5d, 0x2c, 0xb5, 0x84, 0xfc, 0x94, 0xa4, 0x42, + 0xbe, 0xcc, 0xd6, 0x60, 0xc0, 0x84, 0xc1, 0x2d, 0x7b, 0x2f, 0x58, 0x98, 0xd1, 0x94, 0x74, 0xd5, + 0xfb, 0x8d, 0xcb, 0x4a, 0x2d, 0x17, 0x53, 0x16, 0xf9, 0x42, 0xc4, 0x52, 0x2b, 0xb4, 0xf7, 0x02, + 0x7d, 0x21, 0x46, 0xd0, 0xe4, 0x16, 0x40, 0xcd, 0x6b, 0xf6, 0x3a, 0xd4, 0x0d, 0x6b, 0xcb, 0x0b, + 0x65, 0xfd, 0xea, 0x11, 0x55, 0xc4, 0xac, 0xad, 0xe5, 0x35, 0xb5, 0x95, 0xa8, 0x60, 0x2f, 0xbe, + 0x07, 0xe5, 0xe4, 0x87, 0x3c, 0xa6, 0xde, 0x6d, 0xaa, 0x3c, 0xad, 0xf4, 0x7e, 0xf5, 0x91, 0x13, + 0x84, 0x81, 0xf1, 0x4d, 0x6d, 0x07, 0x32, 0xee, 0x70, 0x9b, 0x1e, 0xd6, 0x7d, 0xba, 0xeb, 0x3c, + 0x12, 0xcc, 0x0c, 0xb9, 0xc3, 0x01, 0x3d, 0xb4, 0xba, 0x58, 0xaa, 0x72, 0x87, 0x08, 0x94, 0x7c, + 0x16, 0x8a, 0xb7, 0x37, 0x1b, 0xb7, 0xe9, 0xe1, 0x7a, 0x4d, 0x1c, 0x54, 0x1c, 0xad, 0x13, 0x58, + 0x0c, 0x55, 0x5b, 0x6b, 0x11, 0xa4, 0xb1, 0x1c, 0x73, 0x42, 0xd6, 0xf2, 0x4a, 0xbb, 0x17, 0x84, + 0xd4, 0x5f, 0xaf, 0xa9, 0x2d, 0x37, 0x79, 0x61, 0x82, 0x2f, 0x45, 0xa0, 0xc6, 0xbf, 0xcb, 0x23, + 0x17, 0x64, 0x0b, 0x7e, 0xdd, 0x0d, 0x42, 0xdb, 0x6d, 0xd2, 0x88, 0x00, 0x2e, 0x78, 0x47, 0x94, + 0x26, 0x16, 0x7c, 0x0c, 0xac, 0x37, 0x9d, 0x1f, 0xba, 0x69, 0xd6, 0xa4, 0x54, 0xb8, 0xac, 0xd7, + 0x54, 0xad, 0xb0, 0x2f, 0x4a, 0x13, 0x4d, 0xc6, 0xc0, 0xe4, 0x02, 0x8c, 0xaf, 0x57, 0x37, 0xab, + 0xbd, 0x70, 0x1f, 0x79, 0x70, 0x91, 0xcb, 0xe7, 0x6c, 0xb5, 0xda, 0xbd, 0x70, 0xdf, 0x94, 0x95, + 0xe4, 0x0a, 0xde, 0x7b, 0x5c, 0x1a, 0x72, 0xed, 0xb1, 0x38, 0x74, 0x03, 0x5e, 0x94, 0xb8, 0xf6, + 0xb0, 0x22, 0xf2, 0x2a, 0x8c, 0xde, 0xab, 0xaf, 0xac, 0xd7, 0xc4, 0x45, 0x1d, 0x4f, 0xa2, 0x07, + 0xdd, 0xa6, 0xfe, 0x25, 0x1c, 0x84, 0xac, 0xc2, 0x74, 0x83, 0x36, 0x7b, 0xbe, 0x13, 0x1e, 0xde, + 0xf4, 0xbd, 0x5e, 0x37, 0x58, 0x18, 0xc7, 0x36, 0x70, 0xa7, 0x07, 0xa2, 0xc6, 0xda, 0xc3, 0x2a, + 0x05, 0x3b, 0x81, 0x64, 0xfc, 0x7a, 0x2e, 0x66, 0x93, 0xe4, 0x82, 0x26, 0xd6, 0xa0, 0xca, 0x89, + 0x89, 0x35, 0xaa, 0xca, 0x09, 0x05, 0x1c, 0x13, 0xc8, 0x4a, 0x2f, 0x08, 0xbd, 0xce, 0xaa, 0xdb, + 0xea, 0x7a, 0x8e, 0x1b, 0x22, 0x16, 0x1f, 0x7c, 0xe3, 0xf8, 0xa8, 0xf2, 0x7c, 0x13, 0x6b, 0x2d, + 0x2a, 0xaa, 0xad, 0x04, 0x95, 0x0c, 0xec, 0x4f, 0x30, 0x1f, 0xc6, 0xbf, 0xca, 0x6b, 0xc7, 0x1b, + 0xfb, 0x3c, 0x93, 0x76, 0xdb, 0x4e, 0x13, 0x35, 0x08, 0xd8, 0xd1, 0x68, 0x55, 0xe1, 0xe7, 0xf9, + 0x71, 0x2d, 0x1f, 0x21, 0x9d, 0x76, 0x06, 0x36, 0xf9, 0x22, 0x94, 0x98, 0xa4, 0x21, 0x7e, 0x06, + 0x0b, 0x79, 0x1c, 0xec, 0xe7, 0x50, 0x79, 0x18, 0x50, 0x3f, 0x22, 0xa3, 0x89, 0x28, 0x2a, 0x06, + 0x69, 0xc1, 0xc2, 0x96, 0x6f, 0xbb, 0x81, 0x13, 0xae, 0xba, 0x4d, 0xff, 0x10, 0x25, 0xa3, 0x55, + 0xd7, 0xde, 0x69, 0xd3, 0x16, 0x76, 0xb7, 0xb8, 0x7c, 0xf1, 0xf8, 0xa8, 0xf2, 0x52, 0xc8, 0x61, + 0x2c, 0x1a, 0x01, 0x59, 0x94, 0x43, 0x29, 0x94, 0xfb, 0x52, 0x62, 0x92, 0x94, 0x1c, 0x56, 0x7c, + 0x3b, 0xe2, 0x42, 0x02, 0x4a, 0x52, 0xd1, 0x6c, 0x30, 0x1e, 0xa6, 0x7e, 0xa6, 0x8a, 0x60, 0xfc, + 0x3f, 0xb9, 0xf8, 0x00, 0x26, 0xef, 0xc0, 0xa4, 0xd8, 0x31, 0xca, 0xba, 0x40, 0x0e, 0x2a, 0xb7, + 0x57, 0x62, 0x66, 0x55, 0x70, 0x76, 0xef, 0xaf, 0xae, 0x6c, 0x28, 0x6b, 0x03, 0xef, 0xfd, 0x76, + 0xb3, 0x9d, 0xc4, 0x92, 0x60, 0x6c, 0x11, 0x6c, 0x6d, 0x34, 0xf4, 0x51, 0xc1, 0x45, 0x10, 0xb6, + 0x83, 0x8c, 0x61, 0x50, 0x80, 0x3f, 0x79, 0xc7, 0xff, 0xa7, 0x5c, 0xd6, 0x39, 0x4f, 0x96, 0x61, + 0xea, 0xbe, 0xe7, 0x1f, 0xe0, 0xfc, 0x2a, 0x83, 0x80, 0x33, 0xff, 0x50, 0x56, 0x24, 0x3b, 0xa4, + 0xa3, 0xa8, 0xdf, 0xa6, 0x8c, 0x86, 0xfe, 0x6d, 0x09, 0x0a, 0x1a, 0x02, 0x9b, 0x87, 0x88, 0x62, + 0xb4, 0x3b, 0x70, 0x1e, 0xe2, 0x4f, 0xd0, 0x96, 0xb0, 0x0a, 0x6e, 0xfc, 0x6a, 0x4e, 0x3d, 0xcf, + 0xd9, 0x20, 0xd7, 0xbc, 0x8e, 0xed, 0xb8, 0x4a, 0x77, 0xf8, 0x7b, 0x18, 0x96, 0x26, 0xbf, 0x44, + 0x01, 0x26, 0xd7, 0xa0, 0xc8, 0x7f, 0x45, 0xbc, 0x16, 0xb5, 0x68, 0x02, 0x51, 0x3f, 0x28, 0x24, + 0x60, 0x6a, 0x66, 0x0a, 0x8f, 0x3b, 0x33, 0xdf, 0xc9, 0xa9, 0x47, 0xf1, 0xc7, 0x3d, 0x6c, 0x12, + 0x87, 0x4c, 0xfe, 0x71, 0x0e, 0x99, 0x4f, 0xdc, 0x85, 0x3f, 0x97, 0x83, 0x49, 0x45, 0x4b, 0xc1, + 0xfa, 0x50, 0xf7, 0xbd, 0x8f, 0x68, 0x33, 0xd4, 0xfb, 0xd0, 0xe5, 0x85, 0x89, 0x3e, 0x44, 0xa0, + 0x9f, 0xa0, 0x0f, 0xc6, 0x1f, 0xe4, 0xc4, 0x1d, 0x69, 0x68, 0x36, 0xaf, 0xb3, 0xe4, 0xfc, 0xe3, + 0x1c, 0x91, 0x5f, 0x84, 0x51, 0x93, 0xb6, 0x9c, 0x40, 0xdc, 0x6f, 0x66, 0xd5, 0xfb, 0x18, 0x56, + 0xc4, 0x72, 0x93, 0xcf, 0x7e, 0xaa, 0xe7, 0x1b, 0xd6, 0x33, 0x41, 0x76, 0x3d, 0xb8, 0xd1, 0xa6, + 0x8f, 0x1c, 0xbe, 0x19, 0xc5, 0x51, 0x8b, 0xc7, 0x9b, 0x13, 0x58, 0xbb, 0xac, 0x46, 0x48, 0xd4, + 0xea, 0xc6, 0xd3, 0x70, 0x8c, 0x2f, 0x03, 0xc4, 0x4d, 0x92, 0xdb, 0x50, 0x16, 0xab, 0xc1, 0x71, + 0xf7, 0xb8, 0x20, 0x25, 0xc6, 0xa0, 0x72, 0x7c, 0x54, 0x79, 0xb6, 0x19, 0xd5, 0x09, 0xa9, 0x53, + 0xa1, 0x9b, 0x42, 0x34, 0xfe, 0xf7, 0x02, 0xe4, 0xab, 0x38, 0x21, 0xb7, 0xe9, 0x61, 0x68, 0xef, + 0xdc, 0x70, 0xda, 0xda, 0x66, 0x3a, 0xc0, 0x52, 0x6b, 0xd7, 0xd1, 0xd4, 0x15, 0x0a, 0x30, 0xdb, + 0x4c, 0xb7, 0xfd, 0x9d, 0x37, 0x11, 0x51, 0xd9, 0x4c, 0x07, 0xfe, 0xce, 0x9b, 0x49, 0xb4, 0x08, + 0x90, 0x18, 0x30, 0xc6, 0x37, 0x96, 0x58, 0x83, 0x70, 0x7c, 0x54, 0x19, 0xe3, 0xfb, 0xcf, 0x14, + 0x35, 0xe4, 0x2c, 0x14, 0x1a, 0xf5, 0x3b, 0x82, 0x03, 0xa2, 0x5a, 0x30, 0xe8, 0xba, 0x26, 0x2b, + 0x63, 0x6d, 0x6e, 0xd4, 0xaa, 0x75, 0x54, 0x04, 0x8c, 0xc6, 0x6d, 0xb6, 0x5b, 0x76, 0x37, 0xa9, + 0x0a, 0x88, 0x00, 0xc9, 0xbb, 0x30, 0x79, 0xbb, 0xb6, 0xb2, 0xe6, 0x05, 0x9c, 0x7b, 0x8d, 0xc5, + 0x8b, 0xff, 0xa0, 0xd5, 0xb4, 0x50, 0xf3, 0x9f, 0x3c, 0x06, 0x14, 0x78, 0x62, 0xc1, 0x69, 0x46, + 0x8a, 0x4d, 0x89, 0xd3, 0xa4, 0xe2, 0x52, 0x7a, 0x27, 0x7e, 0x67, 0x78, 0xe5, 0xf8, 0xa8, 0xf2, + 0x22, 0x7e, 0x41, 0xc0, 0x41, 0x2c, 0x79, 0x9d, 0x4d, 0x50, 0xed, 0x43, 0x86, 0x7c, 0x15, 0x4e, + 0xa5, 0x6b, 0x1a, 0xd1, 0xfb, 0xc4, 0x85, 0xe3, 0xa3, 0x8a, 0x91, 0x49, 0x3f, 0xd0, 0xd6, 0x6f, + 0x36, 0x11, 0xe3, 0x5b, 0x79, 0x98, 0x54, 0xd4, 0x7c, 0xe4, 0xb3, 0xe2, 0x59, 0x3a, 0xa7, 0x5d, + 0x60, 0x14, 0x08, 0x56, 0xcb, 0x75, 0x42, 0x1d, 0xaf, 0x45, 0xc5, 0x23, 0x75, 0xac, 0x7f, 0xc9, + 0x0f, 0xa3, 0x7f, 0x79, 0x0b, 0x80, 0x2f, 0x61, 0x1c, 0x27, 0x45, 0x1a, 0x52, 0xac, 0x53, 0xd4, + 0x65, 0x15, 0x03, 0x93, 0x7b, 0x30, 0xb7, 0xe5, 0xf7, 0x82, 0xb0, 0x71, 0x18, 0x84, 0xb4, 0xc3, + 0xa8, 0xd5, 0x3d, 0xaf, 0x2d, 0xb6, 0xcf, 0x4b, 0xc7, 0x47, 0x95, 0xf3, 0x68, 0x52, 0x63, 0x05, + 0x58, 0x8f, 0x1f, 0x60, 0x75, 0x3d, 0x4f, 0xd5, 0xca, 0x64, 0x11, 0x30, 0x4c, 0x28, 0xa9, 0x3a, + 0x1d, 0x76, 0x30, 0x8a, 0x27, 0x3c, 0xa1, 0xa9, 0x57, 0x0e, 0x46, 0xf1, 0x95, 0xe9, 0x27, 0x45, + 0x1d, 0xc5, 0xf8, 0xac, 0xaa, 0x4f, 0x1c, 0x96, 0x2f, 0x19, 0x7f, 0x21, 0x17, 0x73, 0xc1, 0x7b, + 0x57, 0xc9, 0xdb, 0x30, 0xc6, 0x9f, 0x4c, 0xc5, 0xcb, 0xf2, 0xa9, 0xe8, 0x4e, 0xae, 0xbe, 0xa7, + 0x72, 0x45, 0xfe, 0x6f, 0x73, 0xb3, 0x8a, 0x67, 0x4c, 0x81, 0x12, 0xbd, 0x01, 0xe8, 0xea, 0x40, + 0x49, 0x1d, 0xb5, 0xdd, 0x57, 0xb3, 0xde, 0x00, 0x8c, 0x7f, 0x31, 0x0a, 0xd3, 0x3a, 0x98, 0xfa, + 0xae, 0x9a, 0x1b, 0xea, 0x5d, 0xf5, 0x8b, 0x50, 0x14, 0xeb, 0x4d, 0x0a, 0x94, 0x2f, 0xe1, 0xcb, + 0x88, 0x28, 0xd3, 0xec, 0x05, 0x80, 0x4f, 0x07, 0xbb, 0xa2, 0x9b, 0x11, 0x16, 0x59, 0x52, 0x5e, + 0xed, 0x0a, 0xb1, 0x8c, 0x25, 0x5f, 0xed, 0xd4, 0xed, 0x1c, 0xbd, 0xdf, 0xbd, 0x01, 0x63, 0xec, + 0x7a, 0x12, 0x69, 0x90, 0xf0, 0x2b, 0xd9, 0xcd, 0x25, 0x61, 0x18, 0xc4, 0x81, 0xc8, 0x7d, 0x28, + 0x6e, 0xd8, 0x41, 0xd8, 0xa0, 0xd4, 0x1d, 0xc2, 0x62, 0xa2, 0x22, 0x86, 0x6a, 0x0e, 0xcd, 0x11, + 0x02, 0x4a, 0xdd, 0xc4, 0x93, 0x77, 0x44, 0x8c, 0x7c, 0x08, 0xb0, 0xe2, 0xb9, 0xa1, 0xef, 0xb5, + 0x37, 0xbc, 0xbd, 0x85, 0x31, 0xbc, 0xba, 0x3f, 0x9f, 0x98, 0x80, 0x18, 0x80, 0xdf, 0xde, 0x23, + 0xfd, 0x54, 0x93, 0x57, 0x58, 0x6d, 0x6f, 0x4f, 0xdd, 0x07, 0x31, 0x3c, 0xb9, 0x01, 0x65, 0xa9, + 0x17, 0xd9, 0xee, 0xee, 0xf9, 0xb8, 0x40, 0xc6, 0x63, 0xc1, 0x89, 0x3e, 0x0a, 0xad, 0x9e, 0x28, + 0x57, 0x19, 0x7d, 0x12, 0x87, 0x7c, 0x15, 0xce, 0x24, 0xcb, 0xe4, 0x2c, 0x17, 0xe3, 0x2b, 0x85, + 0x4a, 0x2e, 0x63, 0xdd, 0xf7, 0x23, 0x41, 0x6e, 0xc2, 0x0c, 0x1b, 0x90, 0x4d, 0x6a, 0x07, 0x3d, + 0x6e, 0xd6, 0x26, 0x34, 0x4b, 0xf2, 0x41, 0x58, 0xec, 0xc2, 0xb6, 0xd7, 0x3c, 0x50, 0x80, 0xcc, + 0x24, 0x16, 0xb9, 0x0e, 0x93, 0xdc, 0x4e, 0xc1, 0x5f, 0x77, 0x77, 0x3d, 0xf1, 0x6c, 0x20, 0xb5, + 0xe9, 0xa2, 0xe6, 0xde, 0x12, 0xab, 0x33, 0x55, 0x40, 0xe3, 0x28, 0x0f, 0xa7, 0xb3, 0xdb, 0x20, + 0x7f, 0x16, 0x4e, 0x89, 0xf1, 0x6c, 0x53, 0x5f, 0x81, 0x19, 0xc2, 0x82, 0xe3, 0x0d, 0x31, 0x4f, + 0x2f, 0x34, 0x23, 0x02, 0x11, 0xc3, 0x61, 0x24, 0x12, 0x8b, 0x22, 0xbb, 0x1d, 0xf2, 0x75, 0x98, + 0x54, 0x9b, 0xcd, 0x0f, 0x6f, 0x0c, 0x33, 0xa0, 0x2d, 0x95, 0x24, 0xb1, 0x61, 0xc6, 0xa4, 0xdf, + 0xe8, 0xd1, 0x20, 0x94, 0xe6, 0x38, 0x42, 0x62, 0x39, 0x9b, 0x6a, 0x45, 0x02, 0x44, 0x6a, 0xaf, + 0xb2, 0xcf, 0x31, 0x2d, 0x69, 0x34, 0xf9, 0x6d, 0x46, 0x3e, 0x49, 0xcf, 0xf8, 0x5e, 0x1e, 0xce, + 0xf4, 0x59, 0xce, 0x8c, 0xe3, 0xa1, 0x3c, 0xa9, 0x70, 0xbc, 0x84, 0x18, 0xc9, 0x6d, 0xf9, 0xce, + 0x43, 0x5e, 0x48, 0x60, 0x23, 0xcb, 0xe5, 0xe3, 0xa3, 0x4a, 0x49, 0xdb, 0xa9, 0xf9, 0xf5, 0x1a, + 0xb9, 0x05, 0x23, 0x6c, 0x18, 0x86, 0x30, 0x49, 0x91, 0x4a, 0xcf, 0xe9, 0xd0, 0x51, 0x19, 0x04, + 0x8e, 0x0d, 0xd2, 0x20, 0x9f, 0x85, 0xc2, 0xd6, 0xd6, 0x06, 0x72, 0x87, 0x02, 0xae, 0xee, 0xa9, + 0x30, 0x6c, 0x6b, 0xcc, 0x68, 0x8a, 0xe1, 0x46, 0x23, 0x62, 0x32, 0x70, 0xf2, 0xa5, 0x84, 0xa9, + 0xdc, 0xab, 0x83, 0xb7, 0xf2, 0xf0, 0x96, 0x73, 0x9f, 0xc0, 0x60, 0xcd, 0xf8, 0xb1, 0x9c, 0xb4, + 0x0a, 0x12, 0x8b, 0x9f, 0x9c, 0x97, 0xfb, 0x04, 0x2f, 0xe6, 0x82, 0x8a, 0x5a, 0x44, 0x9e, 0x07, + 0xe0, 0x3f, 0xb7, 0xb7, 0xc5, 0xa0, 0x97, 0x4c, 0xa5, 0x84, 0x7c, 0x21, 0x22, 0x29, 0x54, 0x99, + 0x05, 0x94, 0x04, 0x12, 0x7b, 0x8d, 0xd7, 0x99, 0x3a, 0xa8, 0xf1, 0x6b, 0xf9, 0xf8, 0xd4, 0xb8, + 0xe1, 0xb4, 0x43, 0xea, 0x93, 0x45, 0x7e, 0x08, 0xc4, 0xb7, 0x19, 0x33, 0xfa, 0x4d, 0x16, 0xe2, + 0x13, 0x85, 0x77, 0x2d, 0x3a, 0x3a, 0x5e, 0x55, 0x8e, 0x8e, 0x02, 0x1e, 0x1d, 0xd3, 0x7d, 0x0f, + 0x89, 0x57, 0x33, 0x38, 0x21, 0xb2, 0xfe, 0x0c, 0x6e, 0xf7, 0x12, 0x4c, 0xdd, 0xf1, 0x56, 0x1f, + 0x85, 0x11, 0x20, 0x63, 0xf9, 0x45, 0x53, 0x2f, 0x64, 0x14, 0xef, 0xb6, 0x5b, 0xd4, 0xdf, 0xda, + 0xb7, 0x5d, 0xcd, 0xb8, 0xc4, 0x4c, 0x95, 0x33, 0xd8, 0x3b, 0xf4, 0xa1, 0x0e, 0x3b, 0xce, 0x61, + 0x93, 0xe5, 0xc9, 0xc9, 0x29, 0xa6, 0x26, 0xc7, 0xf8, 0xf3, 0x79, 0x39, 0x5c, 0xf7, 0x96, 0x9e, + 0x52, 0xb3, 0x83, 0x37, 0x35, 0xb3, 0x83, 0xb9, 0xe8, 0xc1, 0x24, 0xb2, 0xd9, 0x59, 0xca, 0x12, + 0x38, 0x14, 0x9b, 0x81, 0xbf, 0x33, 0x06, 0x25, 0x15, 0x9c, 0x8d, 0x43, 0xb5, 0xd5, 0xf2, 0xd5, + 0x71, 0xb0, 0x5b, 0x2d, 0xdf, 0xc4, 0x52, 0xcd, 0xb2, 0xa7, 0x30, 0xd0, 0xb2, 0xe7, 0x6b, 0x30, + 0xb1, 0xd2, 0x69, 0x69, 0xef, 0xff, 0x46, 0xc6, 0xe7, 0x5d, 0x8e, 0x80, 0xf8, 0xee, 0x8d, 0xde, + 0x01, 0x9a, 0x9d, 0x56, 0xfa, 0xd5, 0x3f, 0x26, 0xa9, 0x19, 0x05, 0x8d, 0x7e, 0x12, 0xa3, 0xa0, + 0xeb, 0x30, 0xb1, 0x1d, 0xd0, 0xad, 0x9e, 0xeb, 0xd2, 0x36, 0x2e, 0xbc, 0x22, 0xbf, 0x3e, 0xf7, + 0x02, 0x6a, 0x85, 0x58, 0xaa, 0x7e, 0x40, 0x04, 0xaa, 0x4e, 0xf0, 0xf8, 0x80, 0x09, 0xbe, 0x06, + 0xc5, 0x3a, 0xa5, 0x3e, 0x8e, 0xe9, 0x64, 0x7c, 0x4b, 0xea, 0x52, 0xea, 0x5b, 0x6c, 0x60, 0x35, + 0x63, 0x21, 0x01, 0xa8, 0x59, 0x18, 0x95, 0x86, 0xb4, 0x30, 0x22, 0x2f, 0x40, 0xa9, 0xdb, 0xdb, + 0x69, 0x3b, 0x4d, 0xa4, 0x2b, 0x4c, 0x93, 0xcc, 0x49, 0x5e, 0xc6, 0xc8, 0x06, 0xe4, 0x4b, 0x30, + 0x85, 0x6a, 0x83, 0x68, 0xc9, 0x4d, 0x6b, 0x47, 0xbb, 0x56, 0xc7, 0xa5, 0xef, 0x26, 0x2b, 0xb2, + 0x32, 0x0c, 0xf1, 0x74, 0x42, 0xe4, 0x16, 0x8c, 0xef, 0x39, 0xa1, 0xb5, 0xdf, 0xdb, 0x59, 0x98, + 0xd1, 0xac, 0xd8, 0x6e, 0x3a, 0xe1, 0x5a, 0x6f, 0x87, 0x4f, 0x79, 0x44, 0x1a, 0x79, 0xf4, 0x9e, + 0x13, 0xee, 0xf7, 0xd4, 0x57, 0x8e, 0xb1, 0x3d, 0x84, 0x5d, 0x6c, 0xc0, 0xb4, 0xbe, 0x2a, 0x9e, + 0xc0, 0xdb, 0x7b, 0x64, 0x79, 0x55, 0x2c, 0x4f, 0xdc, 0x1a, 0x29, 0x42, 0x79, 0x92, 0xdb, 0x5c, + 0x99, 0x50, 0x8f, 0xc6, 0xc7, 0x24, 0xb7, 0x7b, 0x3b, 0xd4, 0x77, 0x69, 0x48, 0x03, 0x71, 0x47, + 0x0f, 0xcc, 0x91, 0x6a, 0xb7, 0x1b, 0x18, 0xff, 0x38, 0x0f, 0xe3, 0xd5, 0xfb, 0x0d, 0xe4, 0xfa, + 0xaf, 0xab, 0x0f, 0xa7, 0xea, 0x0b, 0x7a, 0xf4, 0x70, 0xaa, 0x3e, 0x97, 0x5e, 0xc9, 0xd0, 0xb2, + 0xa0, 0x6f, 0x80, 0xa2, 0x65, 0xd1, 0xf4, 0x43, 0xf1, 0x1b, 0x72, 0x61, 0x88, 0x37, 0xe4, 0x48, + 0xcd, 0x3f, 0x72, 0xb2, 0x9a, 0xff, 0x6d, 0x98, 0x5c, 0x77, 0x43, 0xba, 0xe7, 0xc7, 0xbb, 0x26, + 0xd2, 0xf8, 0x44, 0xc5, 0xea, 0xcd, 0x5b, 0x81, 0x66, 0x4b, 0x92, 0x3f, 0x2d, 0x44, 0x4f, 0x0a, + 0xb8, 0x24, 0xf9, 0x0b, 0x44, 0x42, 0x5d, 0x27, 0x01, 0x8d, 0x5a, 0x62, 0xbd, 0x49, 0x3b, 0x1d, + 0x2e, 0xf4, 0x4d, 0xc7, 0x6f, 0x6b, 0x6c, 0x60, 0x97, 0x67, 0xb3, 0xed, 0x74, 0x8c, 0xbf, 0x9a, + 0x83, 0xf9, 0xac, 0x65, 0x44, 0xde, 0x83, 0x92, 0xe7, 0xef, 0xd9, 0xae, 0xf3, 0x83, 0xbc, 0x47, + 0x8a, 0x4e, 0x59, 0x2d, 0x57, 0x35, 0x69, 0x6a, 0x39, 0x1b, 0x10, 0xa5, 0xe7, 0xba, 0x0a, 0x2c, + 0x73, 0x40, 0x94, 0x62, 0xe3, 0x47, 0xf2, 0x30, 0x59, 0xed, 0x76, 0x9f, 0x72, 0xd3, 0xd3, 0xcf, + 0x6b, 0x07, 0x88, 0xd4, 0x40, 0x44, 0xfd, 0xea, 0x6f, 0xb8, 0xa6, 0x9c, 0x21, 0xbf, 0x98, 0x87, + 0x99, 0x04, 0x86, 0xfa, 0xf5, 0xb9, 0x21, 0x2d, 0x45, 0xf3, 0x43, 0x5a, 0x8a, 0x16, 0x86, 0xb3, + 0x14, 0x1d, 0xf9, 0x24, 0x87, 0xc2, 0x2b, 0x50, 0xa8, 0x76, 0xbb, 0x49, 0x0b, 0x90, 0x6e, 0xf7, + 0xde, 0x35, 0xae, 0x04, 0xb3, 0xbb, 0x5d, 0x93, 0x41, 0x68, 0x9c, 0x7a, 0x6c, 0x48, 0x4e, 0x6d, + 0xbc, 0x01, 0x13, 0x48, 0x0b, 0xed, 0x25, 0xcf, 0x03, 0xb2, 0x18, 0x61, 0x2a, 0xa9, 0xb5, 0x25, + 0x98, 0xcf, 0x1f, 0xe6, 0x60, 0x14, 0x7f, 0x3f, 0xa5, 0x6b, 0x6c, 0x49, 0x5b, 0x63, 0x65, 0x65, + 0x8d, 0x0d, 0xb3, 0xba, 0xfe, 0x7e, 0x01, 0x60, 0xe5, 0xae, 0xd9, 0xe0, 0xba, 0x52, 0x72, 0x03, + 0x66, 0xec, 0x76, 0xdb, 0x7b, 0x48, 0x5b, 0x96, 0xe7, 0x3b, 0x7b, 0x8e, 0xcb, 0x47, 0x4e, 0x9a, + 0x25, 0xe8, 0x55, 0xea, 0x63, 0xa5, 0xa8, 0xba, 0xcb, 0x6b, 0x54, 0x3a, 0x1d, 0x1a, 0xee, 0x7b, + 0x2d, 0xa9, 0x36, 0xd1, 0xe8, 0x88, 0xaa, 0x0c, 0x3a, 0x9b, 0xbc, 0x46, 0xa5, 0xb3, 0x8f, 0x6a, + 0x20, 0x29, 0x43, 0x6b, 0x74, 0x44, 0x55, 0x06, 0x1d, 0xae, 0x3b, 0x0a, 0xc8, 0x06, 0xcc, 0x62, + 0x89, 0xd5, 0xf4, 0x69, 0x8b, 0xba, 0xa1, 0x63, 0xb7, 0x03, 0xa1, 0x68, 0x43, 0x8d, 0x72, 0xaa, + 0x52, 0x55, 0x34, 0x60, 0xe5, 0x4a, 0x5c, 0x47, 0x2e, 0xc3, 0x78, 0xc7, 0x7e, 0x64, 0xd9, 0x7b, + 0xdc, 0x40, 0x67, 0x8a, 0x2b, 0x66, 0x44, 0x91, 0x7a, 0x8c, 0x74, 0xec, 0x47, 0xd5, 0x3d, 0xca, + 0x7a, 0x41, 0x1f, 0x75, 0xbd, 0x40, 0xe9, 0xc5, 0x58, 0xdc, 0x8b, 0x44, 0x95, 0xda, 0x0b, 0x51, + 0x25, 0x7a, 0x61, 0xfc, 0x42, 0x0e, 0x9e, 0x5d, 0xc7, 0xaf, 0x08, 0x0f, 0x57, 0xa8, 0x1b, 0x52, + 0xbf, 0x4e, 0xfd, 0x8e, 0x83, 0xe6, 0x0a, 0x0d, 0x1a, 0x92, 0x17, 0xa1, 0x50, 0x35, 0xef, 0x88, + 0xf5, 0xcb, 0xf9, 0xbd, 0x66, 0x3c, 0xc2, 0x6a, 0x23, 0xdd, 0x5d, 0xfe, 0x84, 0x37, 0x85, 0x2a, + 0x94, 0xaa, 0x41, 0xe0, 0xec, 0xb9, 0x1d, 0xee, 0xaf, 0x53, 0xd0, 0xcc, 0x53, 0x44, 0x79, 0xea, + 0x31, 0x4c, 0x45, 0x31, 0xfe, 0xf3, 0x1c, 0xcc, 0x56, 0xbb, 0x5d, 0xfd, 0x93, 0x75, 0xd3, 0xa8, + 0xdc, 0xf0, 0xa6, 0x51, 0x0e, 0x4c, 0x6b, 0xdd, 0xe5, 0x4b, 0x2a, 0x16, 0x7c, 0x07, 0x8c, 0x0c, + 0xff, 0xec, 0x6e, 0x54, 0x64, 0x05, 0xfa, 0xbb, 0x7e, 0x82, 0xb0, 0xf1, 0x9f, 0x15, 0x91, 0x87, + 0x08, 0x6e, 0x2b, 0x8c, 0x77, 0x73, 0x19, 0xc6, 0xbb, 0x6f, 0x81, 0x22, 0xe1, 0xa8, 0x47, 0x9c, + 0x22, 0x2b, 0xaa, 0x5a, 0xaf, 0x18, 0x98, 0x1c, 0x24, 0xcd, 0x78, 0x0b, 0xd8, 0x9b, 0x17, 0x93, + 0x1b, 0xf8, 0x89, 0x58, 0xf0, 0xae, 0x01, 0x59, 0x77, 0xd1, 0xd6, 0x80, 0x36, 0x0e, 0x9c, 0xee, + 0x3d, 0xea, 0x3b, 0xbb, 0x87, 0x62, 0x03, 0xe0, 0xe0, 0x3b, 0xa2, 0xd6, 0x0a, 0x0e, 0x9c, 0xae, + 0xf5, 0x00, 0xeb, 0xcd, 0x0c, 0x1c, 0xf2, 0x3e, 0x8c, 0x9b, 0xf4, 0xa1, 0xef, 0x84, 0xd2, 0x38, + 0x6d, 0x3a, 0x52, 0xe2, 0x62, 0x29, 0xdf, 0x0b, 0x3e, 0xff, 0xa1, 0x72, 0x45, 0x51, 0x4f, 0x96, + 0xb8, 0x90, 0xc2, 0x8d, 0xd0, 0xa6, 0xe2, 0xde, 0x56, 0xef, 0x37, 0xfa, 0xc9, 0x28, 0xe4, 0x12, + 0x8c, 0xa2, 0xa4, 0x23, 0xee, 0x02, 0xe8, 0x8b, 0x86, 0xb2, 0xb3, 0x2a, 0x86, 0x21, 0x04, 0xea, + 0x04, 0xe4, 0x63, 0x7e, 0xb0, 0x50, 0x44, 0x29, 0x5d, 0x29, 0x49, 0x8a, 0x69, 0x13, 0x8f, 0x25, + 0xa6, 0x6d, 0x40, 0xd9, 0xe4, 0x6e, 0xad, 0xad, 0x6a, 0x17, 0x5f, 0x8c, 0x83, 0x05, 0xc0, 0x9d, + 0x7c, 0xfe, 0xf8, 0xa8, 0xf2, 0x9c, 0x70, 0x79, 0x6d, 0x59, 0x76, 0x97, 0x3f, 0x34, 0x6b, 0x6c, + 0x24, 0x89, 0x49, 0xde, 0x82, 0x11, 0xc6, 0x7a, 0x85, 0xc1, 0xaf, 0x7c, 0x79, 0x8b, 0xb9, 0x31, + 0xdf, 0x9c, 0x4d, 0x4f, 0xe3, 0x09, 0x88, 0x42, 0x2c, 0x98, 0xd6, 0x97, 0xbb, 0xb0, 0xfd, 0x5a, + 0x88, 0xc7, 0x53, 0xaf, 0x17, 0xcf, 0x71, 0xa2, 0xcc, 0x6a, 0x62, 0xa1, 0xba, 0x03, 0x12, 0x9b, + 0x74, 0x15, 0x8a, 0x5b, 0x2b, 0xf5, 0xba, 0xe7, 0x87, 0xfc, 0xaa, 0x13, 0x9f, 0x2c, 0xac, 0xcc, + 0xb4, 0xdd, 0x3d, 0xca, 0xcf, 0xe2, 0xb0, 0xd9, 0xb5, 0xba, 0x0c, 0x4c, 0x3d, 0x8b, 0x25, 0x2a, + 0xf9, 0x10, 0x4e, 0x6d, 0x07, 0xb4, 0xea, 0x1e, 0xe2, 0xe9, 0xac, 0x6c, 0x95, 0x69, 0x5c, 0x7a, + 0xf8, 0xa0, 0xc4, 0xae, 0x82, 0xb6, 0x7b, 0x68, 0xf1, 0x53, 0x3d, 0x7b, 0xe3, 0x64, 0x53, 0x21, + 0x57, 0xa0, 0xb0, 0xb9, 0x52, 0x17, 0x77, 0x22, 0x69, 0x9a, 0xb9, 0xb9, 0x52, 0xe7, 0x0b, 0xa9, + 0xa3, 0xdb, 0x95, 0x6f, 0xae, 0xd4, 0x3f, 0x3d, 0xe3, 0xe3, 0xaf, 0xe2, 0x97, 0x90, 0x05, 0x18, + 0x6f, 0x72, 0x18, 0x41, 0x4d, 0xfe, 0x24, 0x04, 0x46, 0x6c, 0x7f, 0x4f, 0x1c, 0x83, 0x26, 0xfe, + 0x4d, 0x5e, 0x81, 0xb2, 0xdf, 0x73, 0x2d, 0x3b, 0xe0, 0x4f, 0x73, 0xbd, 0x80, 0xfa, 0x9c, 0xcd, + 0x9a, 0x53, 0x7e, 0xcf, 0xad, 0x06, 0x4c, 0xee, 0x42, 0x43, 0xe1, 0x7f, 0x92, 0x03, 0x65, 0xff, + 0x14, 0x4d, 0xda, 0x72, 0x7c, 0xda, 0x0c, 0xc5, 0xd9, 0x2c, 0x1c, 0x49, 0x79, 0x59, 0xc2, 0x84, + 0x15, 0xcb, 0xc8, 0x7b, 0x30, 0x2e, 0xce, 0x10, 0xc1, 0x33, 0xe5, 0xbe, 0x13, 0x2f, 0x2e, 0xdc, + 0xe3, 0x38, 0x75, 0xfe, 0x48, 0x24, 0xc6, 0xb2, 0x6f, 0xdd, 0xdf, 0x5a, 0x69, 0xdb, 0x4e, 0x27, + 0x10, 0x07, 0x01, 0x72, 0x8d, 0x8f, 0x1e, 0x86, 0x56, 0x13, 0x4b, 0x55, 0x96, 0x1d, 0x81, 0x1a, + 0x37, 0xe5, 0x83, 0xcf, 0x09, 0x76, 0xd8, 0x15, 0x18, 0xbd, 0x17, 0xab, 0x05, 0x97, 0x27, 0x8e, + 0x8f, 0x2a, 0x7c, 0x6c, 0x4d, 0x5e, 0x6e, 0x50, 0x98, 0x88, 0xd6, 0x1d, 0xa3, 0xc5, 0x7e, 0x20, + 0xad, 0x29, 0x4e, 0x8b, 0xad, 0x40, 0x13, 0x4b, 0x99, 0x9c, 0xb6, 0xea, 0xb6, 0x10, 0x20, 0x8f, + 0x00, 0x38, 0x3c, 0xd4, 0x6d, 0xe1, 0x32, 0x55, 0x7b, 0x27, 0xc0, 0x14, 0x69, 0xe8, 0x47, 0x73, + 0x30, 0xad, 0xcf, 0x31, 0xb9, 0x0c, 0x63, 0xc2, 0x57, 0x34, 0x87, 0x5a, 0x56, 0x46, 0x6d, 0x8c, + 0x7b, 0x89, 0x6a, 0xbe, 0xa1, 0x02, 0x8a, 0x09, 0x7d, 0x82, 0x82, 0x90, 0x78, 0x50, 0xe8, 0x13, + 0xab, 0xc0, 0x94, 0x75, 0xc4, 0x60, 0xf7, 0xd0, 0xa0, 0xd7, 0x0e, 0xd5, 0xd7, 0x61, 0x1f, 0x4b, + 0x4c, 0x51, 0x63, 0x7c, 0x27, 0x07, 0x63, 0x9c, 0x31, 0x26, 0xec, 0x4c, 0x73, 0x8f, 0x63, 0x67, + 0xfa, 0x4d, 0x98, 0x37, 0xbd, 0x36, 0x0d, 0xaa, 0xee, 0xe1, 0xc3, 0x7d, 0xea, 0xd3, 0xba, 0xef, + 0xed, 0xca, 0x87, 0xec, 0xc9, 0xa5, 0x17, 0x34, 0x06, 0x9c, 0x05, 0xc8, 0x5f, 0x22, 0x7d, 0x56, + 0xc3, 0xb6, 0x29, 0x56, 0xb1, 0xbd, 0x9a, 0x78, 0xf8, 0xce, 0x6c, 0xc4, 0xf8, 0x07, 0x39, 0x58, + 0xec, 0x4f, 0x1a, 0x8f, 0x4f, 0xfe, 0x67, 0x2c, 0xb7, 0xf0, 0xe3, 0x93, 0x97, 0x26, 0x8c, 0x5f, + 0x15, 0x60, 0x62, 0xc2, 0xa9, 0x6a, 0xb3, 0x49, 0xbb, 0x21, 0x23, 0x2c, 0x4c, 0x36, 0x23, 0xb9, + 0xa6, 0xc8, 0xd5, 0x2b, 0x36, 0x02, 0x70, 0x33, 0x5a, 0x69, 0x48, 0x8a, 0xab, 0x2e, 0x1b, 0xd5, + 0x38, 0xca, 0x01, 0x34, 0x1a, 0x6b, 0xb7, 0xe9, 0x61, 0xdd, 0x76, 0x50, 0x50, 0xe1, 0xbc, 0xe6, + 0xb6, 0x60, 0x0e, 0x25, 0x61, 0xfa, 0xc1, 0x59, 0xd4, 0x01, 0x3d, 0xd4, 0x4c, 0x3f, 0x24, 0x28, + 0xef, 0x95, 0xf3, 0xc0, 0x0e, 0x29, 0x43, 0x44, 0xb5, 0xb4, 0xec, 0x15, 0x96, 0x26, 0x30, 0x15, + 0x60, 0xf2, 0x21, 0x4c, 0xc7, 0xbf, 0x22, 0x03, 0x96, 0xe9, 0x88, 0x01, 0xe9, 0x95, 0xcb, 0xcf, + 0x1f, 0x1f, 0x55, 0x16, 0x15, 0xaa, 0x49, 0xd3, 0x96, 0x04, 0x31, 0xe3, 0xe7, 0x73, 0x68, 0xb6, + 0x25, 0x3b, 0x78, 0x01, 0x46, 0x22, 0x47, 0x83, 0x92, 0x38, 0x6d, 0xf4, 0x57, 0x6e, 0xac, 0x67, + 0x72, 0x65, 0xdc, 0x13, 0x64, 0xad, 0x7a, 0x0f, 0x58, 0x2d, 0xb9, 0x09, 0xe3, 0x43, 0x7d, 0x33, + 0x6e, 0xc7, 0x8c, 0x6f, 0x95, 0xd8, 0x38, 0x0b, 0xb7, 0xee, 0x6f, 0x7d, 0xff, 0xce, 0xc2, 0x4f, + 0xe4, 0x61, 0x86, 0x8d, 0x6b, 0xb5, 0x17, 0xee, 0x7b, 0xbe, 0x13, 0x1e, 0x3e, 0xb5, 0x0a, 0xf2, + 0x77, 0xb4, 0xbb, 0xe7, 0xa2, 0x3c, 0x25, 0xd5, 0xbe, 0x0d, 0xa5, 0x27, 0xff, 0x6f, 0x47, 0x61, + 0x2e, 0x03, 0x8b, 0xbc, 0xae, 0xbd, 0xba, 0x2d, 0xc8, 0xb8, 0x19, 0xdf, 0x3b, 0xaa, 0x94, 0x24, + 0xf8, 0x56, 0x1c, 0x47, 0x63, 0x49, 0xb7, 0x81, 0xe4, 0x23, 0x85, 0x8f, 0x70, 0xaa, 0x0d, 0xa4, + 0x6e, 0xf9, 0x78, 0x09, 0x46, 0x91, 0x33, 0x09, 0xbb, 0x5f, 0x94, 0x2c, 0x91, 0xd7, 0x69, 0x76, + 0x4e, 0xac, 0x80, 0xac, 0xc1, 0x38, 0xfb, 0x63, 0xd3, 0xee, 0x8a, 0x27, 0x70, 0x12, 0x69, 0x3f, + 0xb0, 0xb4, 0xeb, 0xb8, 0x7b, 0xaa, 0x02, 0xa4, 0x4d, 0xad, 0x8e, 0xdd, 0xd5, 0x44, 0x60, 0x0e, + 0xa8, 0x29, 0x52, 0x8a, 0xfd, 0x15, 0x29, 0xb9, 0x13, 0x15, 0x29, 0xbb, 0x00, 0x0d, 0x67, 0xcf, + 0x75, 0xdc, 0xbd, 0x6a, 0x7b, 0x4f, 0x44, 0x1f, 0xb9, 0xd4, 0x7f, 0x16, 0x2e, 0xc7, 0xc0, 0xb8, + 0x70, 0x9f, 0x45, 0x3b, 0x15, 0x5e, 0x66, 0xd9, 0xed, 0x3d, 0xcd, 0xdd, 0x50, 0xa1, 0x4c, 0xee, + 0x00, 0x54, 0x9b, 0xa1, 0xf3, 0x80, 0x2d, 0xe1, 0x40, 0xc8, 0xab, 0xf2, 0x93, 0x57, 0xaa, 0xb7, + 0xe9, 0x21, 0xde, 0xb1, 0xe4, 0x8b, 0xbf, 0x8d, 0xa0, 0x6c, 0x27, 0x68, 0xbe, 0x64, 0x31, 0x05, + 0xd2, 0x85, 0x53, 0xd5, 0x56, 0xcb, 0x61, 0x7d, 0xb0, 0xdb, 0x5b, 0x3c, 0x6e, 0x0c, 0x92, 0x2e, + 0x65, 0x93, 0xbe, 0x24, 0x1f, 0xa9, 0xed, 0x08, 0xcb, 0x92, 0xe1, 0x66, 0x12, 0xcd, 0x64, 0x13, + 0x36, 0x1a, 0x30, 0xad, 0x77, 0x5e, 0x8f, 0x9a, 0x52, 0x82, 0xa2, 0xd9, 0xa8, 0x5a, 0x8d, 0xb5, + 0xea, 0xd5, 0x72, 0x8e, 0x94, 0xa1, 0x24, 0x7e, 0x2d, 0x59, 0x4b, 0x6f, 0x5e, 0x2f, 0xe7, 0xb5, + 0x92, 0x37, 0xaf, 0x2e, 0x95, 0x0b, 0x8b, 0xf9, 0x85, 0x5c, 0xc2, 0xd3, 0x78, 0xbc, 0x5c, 0xe4, + 0xba, 0x6f, 0xe3, 0x97, 0x72, 0x50, 0x94, 0xdf, 0x4e, 0xae, 0x43, 0xa1, 0xd1, 0x58, 0x4b, 0xf8, + 0xea, 0xc6, 0xa7, 0x0c, 0xe7, 0xa7, 0x41, 0xa0, 0x3a, 0x64, 0x30, 0x04, 0x86, 0xb7, 0xb5, 0xd1, + 0x10, 0xf2, 0x9a, 0xc4, 0x8b, 0x99, 0x37, 0xc7, 0xcb, 0x70, 0x60, 0xbc, 0x0e, 0x85, 0x5b, 0xf7, + 0xb7, 0xc4, 0x6d, 0x52, 0xe2, 0xc5, 0xfc, 0x94, 0xe3, 0x7d, 0xf4, 0x50, 0xe5, 0xf2, 0x0c, 0xc1, + 0x30, 0x61, 0x52, 0x59, 0xc8, 0x5c, 0x40, 0xe9, 0x78, 0x51, 0xa8, 0x10, 0x21, 0xa0, 0xb0, 0x12, + 0x53, 0xd4, 0x30, 0xb1, 0x6d, 0xc3, 0x6b, 0xda, 0x6d, 0x21, 0xe9, 0xa0, 0xd8, 0xd6, 0x66, 0x05, + 0x26, 0x2f, 0x37, 0x7e, 0x3d, 0x07, 0xe5, 0xba, 0xef, 0xf1, 0x70, 0x26, 0x5b, 0xde, 0x01, 0x75, + 0xef, 0x5d, 0x25, 0x6f, 0xc8, 0x2d, 0x97, 0x8b, 0x34, 0x7a, 0xa3, 0xb8, 0xe5, 0x12, 0xcf, 0xa2, + 0x62, 0xdb, 0x29, 0xd1, 0x58, 0xf2, 0xc3, 0x47, 0x71, 0x38, 0x21, 0x1a, 0x4b, 0x05, 0x46, 0xf1, + 0x73, 0x04, 0x73, 0xc4, 0x2f, 0x0f, 0x59, 0x81, 0xc9, 0xcb, 0x15, 0xde, 0x74, 0x94, 0x4f, 0xf5, + 0x61, 0xe9, 0xfb, 0x2a, 0x12, 0x82, 0xde, 0xb9, 0xfe, 0xfc, 0x9a, 0xdc, 0xee, 0x13, 0x09, 0x21, + 0x41, 0x80, 0x3b, 0x32, 0x2e, 0xf1, 0xd7, 0x12, 0xee, 0x0e, 0xa4, 0xea, 0xc4, 0x52, 0x8e, 0xd5, + 0x5f, 0x86, 0xf9, 0xe4, 0xf8, 0xa2, 0xea, 0xb6, 0x0a, 0x33, 0x7a, 0xb9, 0xd4, 0xe2, 0x9e, 0xc9, + 0x6c, 0xf7, 0xde, 0x92, 0x99, 0x84, 0x37, 0xfe, 0xd7, 0x1c, 0x4c, 0xe0, 0x9f, 0x66, 0x8f, 0x4b, + 0x9b, 0xd5, 0xfb, 0x0d, 0xa1, 0x50, 0x52, 0xa5, 0x4d, 0xfb, 0x61, 0x20, 0x2d, 0x0d, 0x35, 0x86, + 0x15, 0x01, 0x0b, 0x54, 0xfe, 0x2a, 0x24, 0x55, 0x99, 0x11, 0x2a, 0x7f, 0x3e, 0x0a, 0x12, 0xa8, + 0x02, 0x18, 0x6d, 0xeb, 0xb9, 0xf8, 0xab, 0xda, 0x7d, 0x21, 0x9e, 0xd7, 0xd6, 0x6d, 0xeb, 0x39, + 0x18, 0x9a, 0x7d, 0xdd, 0x6f, 0x30, 0x89, 0x58, 0x35, 0xfb, 0x62, 0xdf, 0xa8, 0x49, 0xc3, 0x02, + 0xc8, 0xf8, 0xd5, 0xa9, 0xe4, 0x00, 0x8a, 0xd3, 0xf3, 0x31, 0x37, 0xda, 0xdb, 0x30, 0x5a, 0x6d, + 0xb7, 0xbd, 0x87, 0x82, 0xe5, 0xc8, 0xfb, 0x7e, 0x34, 0x7e, 0xfc, 0x70, 0x44, 0x65, 0xa8, 0xe6, + 0x73, 0xcd, 0x0a, 0xc8, 0x0a, 0x4c, 0x54, 0xef, 0x37, 0xd6, 0xd7, 0x6b, 0x5b, 0x5b, 0xdc, 0xbf, + 0xb4, 0xb0, 0xfc, 0xb2, 0x1c, 0x1f, 0xc7, 0x69, 0x59, 0x49, 0xbb, 0x94, 0xf8, 0xe2, 0x14, 0xe3, + 0x91, 0x77, 0x01, 0x6e, 0x79, 0x8e, 0xcb, 0x95, 0xbf, 0xa2, 0xf3, 0xe7, 0x8e, 0x8f, 0x2a, 0x93, + 0x1f, 0x79, 0x8e, 0x2b, 0xb4, 0xc5, 0xec, 0xdb, 0x63, 0x20, 0x53, 0xf9, 0x9b, 0x8d, 0xf4, 0xb2, + 0xc7, 0xed, 0x55, 0x47, 0xe3, 0x91, 0xde, 0xf1, 0x52, 0x5a, 0x4a, 0x09, 0x46, 0x3a, 0x30, 0xd3, + 0xe8, 0xed, 0xed, 0x51, 0x76, 0x4c, 0x08, 0x2d, 0xdc, 0x98, 0xb8, 0xf0, 0x47, 0xc1, 0xc8, 0xf8, + 0x45, 0x90, 0xdd, 0x42, 0x83, 0xe5, 0xd7, 0xd9, 0xae, 0xf8, 0xee, 0x51, 0x45, 0xd8, 0xbb, 0x30, + 0xb9, 0x2f, 0x90, 0xf8, 0x69, 0x1d, 0x5c, 0x92, 0x36, 0xb9, 0x0b, 0x63, 0xfc, 0xa5, 0x4d, 0xf8, + 0x4b, 0xbe, 0x30, 0x60, 0x07, 0x72, 0xc0, 0x7e, 0x6f, 0xb9, 0xbc, 0x96, 0xdc, 0x87, 0xe2, 0x8a, + 0xe3, 0x37, 0xdb, 0x74, 0x65, 0x5d, 0x08, 0x12, 0x2f, 0x0e, 0x20, 0x29, 0x41, 0xf9, 0xb8, 0x34, + 0xf1, 0x57, 0xd3, 0x51, 0x05, 0x0b, 0x09, 0x41, 0xfe, 0x6a, 0x0e, 0x9e, 0x8d, 0xbe, 0xbe, 0xba, + 0x47, 0xdd, 0x70, 0xd3, 0x0e, 0x9b, 0xfb, 0xd4, 0x17, 0xa3, 0x34, 0x31, 0x68, 0x94, 0xbe, 0x90, + 0x1a, 0xa5, 0x8b, 0xf1, 0x28, 0xd9, 0x8c, 0x98, 0xd5, 0xe1, 0xd4, 0xd2, 0x63, 0x36, 0xa8, 0x55, + 0x62, 0x01, 0xc4, 0x6f, 0xc8, 0xc2, 0x70, 0xee, 0xe5, 0x01, 0x1d, 0x8e, 0x81, 0x85, 0x9f, 0x5c, + 0xf4, 0x5b, 0x33, 0xf4, 0x8e, 0x4a, 0xc9, 0x6d, 0xe9, 0x9c, 0xcc, 0x45, 0x9c, 0xf3, 0x03, 0x68, + 0x73, 0x87, 0xe5, 0xb9, 0x01, 0x61, 0x08, 0xf8, 0x6c, 0x6f, 0xd8, 0x3b, 0x42, 0xaa, 0x39, 0x61, + 0xb6, 0x37, 0xec, 0x78, 0xb6, 0xdb, 0x76, 0x72, 0xb6, 0x37, 0xec, 0x1d, 0xb2, 0xc2, 0x23, 0x2a, + 0x70, 0xf7, 0xfb, 0xe7, 0x07, 0x51, 0x93, 0x1a, 0xb0, 0x8c, 0xc8, 0x0a, 0x5f, 0x81, 0x89, 0x46, + 0xd7, 0x6e, 0xd2, 0xb6, 0xb3, 0x1b, 0x0a, 0x03, 0x85, 0x97, 0x06, 0x90, 0x8a, 0x60, 0xc5, 0x83, + 0xb4, 0xfc, 0xa9, 0xde, 0xb9, 0x22, 0x18, 0xf6, 0x85, 0x5b, 0xf5, 0x4d, 0xa1, 0x8f, 0x1b, 0xf4, + 0x85, 0x5b, 0xf5, 0x4d, 0x21, 0xc0, 0x74, 0x3b, 0x9a, 0x00, 0x53, 0xdf, 0x24, 0x5d, 0x98, 0xde, + 0xa2, 0xbe, 0x6f, 0xef, 0x7a, 0x7e, 0x87, 0x6b, 0x7d, 0xb9, 0x4b, 0xe7, 0xa5, 0x41, 0xf4, 0x34, + 0x04, 0xae, 0xec, 0x0c, 0x65, 0x99, 0x95, 0x54, 0x15, 0x27, 0xe8, 0xb3, 0x31, 0x59, 0x76, 0xc2, + 0x9d, 0x5e, 0xf3, 0x80, 0x86, 0x0b, 0xb3, 0x27, 0x8e, 0x49, 0x04, 0xcb, 0xc7, 0x64, 0x47, 0xfe, + 0x54, 0xc7, 0x24, 0x82, 0x61, 0xcb, 0x40, 0xc4, 0x4d, 0x20, 0x27, 0x2e, 0x03, 0x0e, 0xc8, 0x97, + 0x41, 0xbf, 0x00, 0x0a, 0x64, 0x1f, 0x4a, 0xcb, 0x5e, 0xcf, 0x65, 0x72, 0x6d, 0xd7, 0x76, 0xfc, + 0x85, 0x39, 0x24, 0xfb, 0xca, 0xa0, 0x0f, 0x56, 0xc0, 0xb9, 0x3b, 0xc0, 0x0e, 0x2b, 0x61, 0xa2, + 0x33, 0x2b, 0x52, 0xdf, 0x6f, 0x54, 0x50, 0xd2, 0x82, 0x49, 0x5c, 0xca, 0x35, 0xfa, 0xc0, 0xeb, + 0x06, 0x0b, 0xf3, 0xd8, 0xd0, 0x85, 0x93, 0x36, 0x05, 0x87, 0xe6, 0x86, 0x02, 0xb8, 0x35, 0xac, + 0x16, 0x96, 0xa8, 0x4a, 0x75, 0x05, 0xd0, 0xf8, 0xc7, 0xa3, 0x50, 0x39, 0x81, 0x18, 0xb9, 0x27, + 0xcf, 0x26, 0x2e, 0x01, 0xbc, 0x36, 0xdc, 0x37, 0x5c, 0x3e, 0xf1, 0xd8, 0x7a, 0x1b, 0xa6, 0xef, + 0x2a, 0x36, 0x0b, 0x91, 0x0d, 0x09, 0xe2, 0xa8, 0xd6, 0x0c, 0x96, 0xd3, 0x32, 0x13, 0xa0, 0x8b, + 0x7f, 0x58, 0x80, 0x11, 0x14, 0x2c, 0x5e, 0x84, 0x42, 0xa3, 0xb7, 0xa3, 0xbe, 0xbb, 0x05, 0x1a, + 0xbb, 0x66, 0xb5, 0xe4, 0x1d, 0x98, 0x14, 0xde, 0x41, 0xca, 0xed, 0x14, 0x07, 0x49, 0xba, 0x12, + 0x25, 0x5d, 0x33, 0x14, 0x70, 0xf2, 0x3e, 0x94, 0xea, 0x4e, 0x97, 0xb6, 0x1d, 0x97, 0x2a, 0x8e, + 0x06, 0x38, 0x97, 0x5d, 0x51, 0x9e, 0x7a, 0x8b, 0x53, 0x11, 0x74, 0x3f, 0xa6, 0x91, 0xe1, 0xfd, + 0x98, 0xde, 0x87, 0x52, 0x8d, 0xee, 0x3a, 0xae, 0x23, 0xc6, 0x67, 0x34, 0x6e, 0xb8, 0x15, 0x95, + 0xeb, 0xd8, 0x1a, 0x02, 0x59, 0x86, 0x29, 0x93, 0x76, 0xbd, 0xc0, 0x09, 0x3d, 0xff, 0x70, 0xdb, + 0x5c, 0x17, 0xf6, 0x2d, 0xa8, 0xa0, 0xf3, 0xa3, 0x0a, 0xab, 0xe7, 0xab, 0x27, 0x91, 0x8e, 0x42, + 0xee, 0xc0, 0x6c, 0x5c, 0xa0, 0xdb, 0x85, 0x89, 0x87, 0x97, 0x88, 0x4e, 0xda, 0xa2, 0x3b, 0x8d, + 0xaa, 0x7f, 0x93, 0x49, 0x77, 0x85, 0x7d, 0x78, 0xf2, 0x9b, 0x7c, 0xba, 0x9b, 0xfd, 0x4d, 0x26, + 0xdd, 0x35, 0x7e, 0xa5, 0x00, 0x67, 0xfa, 0xb0, 0x36, 0x72, 0x47, 0x5f, 0xae, 0x2f, 0x0e, 0xe6, + 0x84, 0x27, 0x2f, 0xd3, 0x0d, 0x28, 0xaf, 0xde, 0xc6, 0x0b, 0x3d, 0x7f, 0xd6, 0x5e, 0xa9, 0x4a, + 0x21, 0x14, 0xbb, 0x4f, 0x0f, 0xd0, 0x37, 0x44, 0x3e, 0x87, 0x37, 0xb5, 0x18, 0x2e, 0x29, 0xcc, + 0xc5, 0x3f, 0x9f, 0x17, 0xeb, 0x36, 0x11, 0x70, 0x33, 0xf7, 0x58, 0x01, 0x37, 0xbf, 0x08, 0xa5, + 0xd5, 0xdb, 0x5c, 0xdd, 0xb6, 0x66, 0x07, 0xfb, 0x62, 0x4d, 0xe1, 0x10, 0xd2, 0x03, 0xf9, 0x8c, + 0xb3, 0x6f, 0x6b, 0x17, 0x5b, 0x0d, 0x83, 0x6c, 0xc3, 0x1c, 0xff, 0x36, 0x67, 0xd7, 0x69, 0xf2, + 0xb8, 0x7d, 0x8e, 0xdd, 0x16, 0x2b, 0xec, 0xc5, 0xe3, 0xa3, 0x4a, 0x85, 0x1e, 0xa0, 0xd7, 0x8b, + 0xa8, 0xb7, 0x02, 0x04, 0x50, 0xdd, 0x5f, 0x32, 0xf0, 0xd5, 0x28, 0x60, 0xe6, 0x04, 0x36, 0xc8, + 0x5a, 0x63, 0x6d, 0x33, 0x58, 0x0e, 0x64, 0xfc, 0xfe, 0x28, 0x2c, 0xf6, 0x17, 0xbb, 0xc8, 0x07, + 0xfa, 0x04, 0x5e, 0x38, 0x51, 0x50, 0x3b, 0x79, 0x0e, 0xbf, 0x04, 0xf3, 0xab, 0x6e, 0x48, 0xfd, + 0xae, 0xef, 0xc8, 0xe8, 0x61, 0x6b, 0x5e, 0x20, 0xbd, 0x8c, 0x50, 0xc9, 0x4e, 0xa3, 0x7a, 0xe1, + 0x2f, 0x87, 0xef, 0x42, 0xaa, 0x92, 0x3d, 0x8b, 0x02, 0x59, 0x85, 0x69, 0xa5, 0xbc, 0xdd, 0xdb, + 0x53, 0xdf, 0xea, 0x55, 0x9a, 0xed, 0x9e, 0xea, 0x82, 0x91, 0x40, 0x42, 0x4f, 0xa6, 0xd0, 0x0e, + 0x9d, 0xe6, 0xad, 0xfb, 0xb7, 0x1b, 0x62, 0x3a, 0xb9, 0x27, 0x13, 0x96, 0x5a, 0x1f, 0x3d, 0x3c, + 0xd0, 0xe4, 0xa6, 0x18, 0x78, 0xf1, 0xe7, 0x1f, 0x8b, 0x13, 0x7e, 0x1e, 0x20, 0xde, 0x4a, 0x6a, + 0x24, 0x80, 0x78, 0xeb, 0xe9, 0xce, 0x8a, 0xb2, 0x94, 0xac, 0xc1, 0x4c, 0xfc, 0xeb, 0xee, 0x43, + 0x57, 0xbe, 0x97, 0x71, 0x15, 0xac, 0xb2, 0x73, 0x3d, 0x56, 0xa7, 0x8a, 0xe2, 0x09, 0x34, 0xb2, + 0x04, 0xc5, 0xfb, 0x9e, 0x7f, 0xb0, 0xcb, 0xe6, 0x78, 0x24, 0xbe, 0x2c, 0x3c, 0x14, 0x65, 0xaa, + 0x50, 0x2c, 0xe1, 0xd8, 0x76, 0x59, 0x75, 0x1f, 0x38, 0xbe, 0x87, 0xf6, 0x0d, 0xaa, 0x85, 0x1f, + 0x8d, 0x8b, 0xb5, 0x18, 0x2c, 0x71, 0x31, 0xb9, 0x04, 0xa3, 0xd5, 0x66, 0xe8, 0xf9, 0x82, 0xfd, + 0xf1, 0x95, 0xc2, 0x0a, 0xb4, 0x95, 0xc2, 0x0a, 0xd8, 0x20, 0x32, 0x9e, 0x34, 0x1e, 0x0f, 0xa2, + 0xce, 0x88, 0x58, 0x2d, 0xbb, 0xec, 0x98, 0x74, 0x17, 0xb5, 0xa3, 0x5a, 0x38, 0xd9, 0xdd, 0x94, + 0x5e, 0x5d, 0x80, 0x19, 0x7f, 0x11, 0xfa, 0x2e, 0x79, 0x26, 0x5d, 0x3e, 0xde, 0x92, 0xdf, 0xb0, + 0x87, 0x58, 0xf2, 0xaf, 0x47, 0x2e, 0x90, 0x6a, 0x54, 0x25, 0x2c, 0x51, 0xe5, 0x1a, 0xe1, 0x0c, + 0xa9, 0xaf, 0xbf, 0xc2, 0xe3, 0xac, 0xbf, 0xbf, 0x57, 0x7c, 0x9c, 0xf5, 0x27, 0xc6, 0x37, 0x3f, + 0xec, 0xf8, 0x16, 0x86, 0x1a, 0x5f, 0x76, 0xa8, 0x44, 0xb1, 0x8c, 0xeb, 0x76, 0xa8, 0x71, 0xc4, + 0x28, 0x00, 0xb5, 0xd5, 0xb5, 0xb5, 0x78, 0x7f, 0x3a, 0x8a, 0x22, 0x24, 0x20, 0x85, 0xd1, 0xb4, + 0x90, 0x90, 0xc0, 0x57, 0xc1, 0x19, 0x23, 0x90, 0x67, 0x7e, 0x03, 0x1d, 0xea, 0xc4, 0x62, 0xe3, + 0xd6, 0x2f, 0x52, 0x4c, 0xe0, 0xbe, 0x76, 0xda, 0xfb, 0x84, 0x86, 0x94, 0x5c, 0xe7, 0xe3, 0x8f, + 0xb5, 0xce, 0xb9, 0xc1, 0xb7, 0xbf, 0xe1, 0xed, 0x39, 0xd2, 0xed, 0x4a, 0x1a, 0x7c, 0xfb, 0x56, + 0x9b, 0x95, 0x26, 0x0c, 0xbe, 0x39, 0x28, 0x79, 0x03, 0xc6, 0xd8, 0x8f, 0xf5, 0x9a, 0x30, 0xc9, + 0x40, 0xa5, 0x07, 0x22, 0xe9, 0xbe, 0x6e, 0x1c, 0x48, 0x36, 0xb3, 0xda, 0xb1, 0x9d, 0xb6, 0x88, + 0xbb, 0x13, 0x37, 0x43, 0x59, 0x69, 0xb2, 0x19, 0x04, 0x25, 0x4d, 0x28, 0x99, 0x74, 0xb7, 0xee, + 0x7b, 0x21, 0x6d, 0x86, 0xb4, 0x25, 0x2e, 0x7a, 0x52, 0xd7, 0xb1, 0xec, 0x79, 0xfc, 0x12, 0x8b, + 0x6e, 0x51, 0xb9, 0xef, 0x1e, 0x55, 0x80, 0x15, 0x71, 0x47, 0x4a, 0x26, 0xf2, 0xb0, 0xf9, 0xef, + 0x4a, 0x64, 0xf5, 0x60, 0x53, 0x89, 0x92, 0x6f, 0x32, 0x56, 0x1f, 0x0d, 0x49, 0xdc, 0x58, 0xa9, + 0x4f, 0x63, 0x6f, 0x66, 0x36, 0x56, 0x51, 0x46, 0x3b, 0xb3, 0xd1, 0xcc, 0x46, 0xc8, 0xbb, 0x30, + 0xb9, 0xb2, 0xbe, 0xe2, 0xb9, 0xbb, 0xce, 0x5e, 0x63, 0xad, 0x8a, 0xb7, 0x45, 0x21, 0xaf, 0x35, + 0x1d, 0xab, 0x89, 0xe5, 0x56, 0xb0, 0x6f, 0x6b, 0xa1, 0x20, 0x62, 0x78, 0x72, 0x13, 0xa6, 0xe5, + 0x4f, 0x93, 0xee, 0x32, 0x79, 0x6d, 0x5a, 0x71, 0xbc, 0x8e, 0x28, 0xb0, 0x81, 0xd0, 0x45, 0xb6, + 0x04, 0x1a, 0x5b, 0x8c, 0x35, 0xda, 0x6d, 0x7b, 0x87, 0xec, 0xf3, 0xb6, 0x1c, 0xea, 0xe3, 0xb5, + 0x50, 0x2c, 0xc6, 0x56, 0x54, 0x63, 0x85, 0x8e, 0x6e, 0x88, 0xa2, 0x23, 0x31, 0xd1, 0x4f, 0x2c, + 0xf1, 0x7b, 0x4e, 0xe0, 0xec, 0x38, 0x6d, 0x27, 0x3c, 0xc4, 0x0b, 0xa1, 0x90, 0x7d, 0xe4, 0xbe, + 0x78, 0x10, 0xd5, 0xaa, 0xa2, 0x5f, 0x0a, 0xd5, 0xf8, 0xa5, 0x3c, 0x3c, 0x37, 0x48, 0x39, 0x42, + 0x1a, 0x3a, 0x1f, 0xbc, 0x38, 0x84, 0x42, 0xe5, 0x64, 0x4e, 0xb8, 0xda, 0xe7, 0x9e, 0x81, 0x83, + 0x91, 0xb8, 0x67, 0xa8, 0x83, 0x91, 0xb8, 0x71, 0x3c, 0x10, 0x6c, 0xee, 0xe3, 0x06, 0x25, 0xb8, + 0x0e, 0x13, 0x2b, 0x9e, 0x1b, 0xd2, 0x47, 0x61, 0x22, 0x04, 0x0f, 0x2f, 0x4c, 0x06, 0x64, 0x90, + 0xa0, 0xc6, 0xbf, 0xcb, 0xc3, 0xb9, 0x81, 0xda, 0x01, 0xb2, 0xa5, 0x8f, 0xda, 0xa5, 0x61, 0x54, + 0x0a, 0x27, 0x0f, 0xdb, 0x52, 0xca, 0x80, 0xf9, 0x44, 0xa7, 0xd9, 0xc5, 0xff, 0x3e, 0x27, 0x06, + 0xe9, 0x33, 0x30, 0x8e, 0x4d, 0x45, 0x43, 0xc4, 0xb5, 0xf0, 0xc8, 0x85, 0x1d, 0x5d, 0x0b, 0xcf, + 0xc1, 0xc8, 0x35, 0x28, 0xae, 0xd8, 0xed, 0xb6, 0x12, 0xa0, 0x08, 0x2f, 0xf8, 0x4d, 0x2c, 0x4b, + 0x58, 0xe1, 0x4b, 0x40, 0x76, 0x6c, 0xf1, 0xbf, 0x95, 0xb3, 0x02, 0x99, 0xa5, 0x40, 0x4b, 0x1c, + 0x17, 0x0a, 0x30, 0x46, 0x63, 0x6f, 0x7a, 0x51, 0x08, 0x14, 0x1e, 0x8d, 0x9d, 0x15, 0x68, 0xd1, + 0xd8, 0x59, 0x81, 0xf1, 0xcb, 0x05, 0x78, 0x7e, 0xb0, 0x8a, 0x8b, 0x6c, 0xeb, 0x53, 0xf0, 0xea, + 0x50, 0x8a, 0xb1, 0x93, 0xe7, 0x40, 0xe6, 0x36, 0xe0, 0x03, 0x72, 0x31, 0xed, 0xf9, 0xf8, 0xbd, + 0xa3, 0x8a, 0xe2, 0xda, 0x71, 0xcb, 0x73, 0x5c, 0xe5, 0x4d, 0xf6, 0x1b, 0xa9, 0x43, 0x7d, 0x72, + 0xe9, 0xfa, 0x70, 0x5f, 0x16, 0xe3, 0x71, 0xbe, 0x32, 0xac, 0x30, 0xf0, 0x05, 0x28, 0x27, 0x51, + 0xc9, 0x05, 0x18, 0xc1, 0x0f, 0x50, 0xdc, 0x37, 0x13, 0x14, 0xb0, 0x7e, 0x71, 0x53, 0xac, 0x1d, + 0x8c, 0xd9, 0xa4, 0xc6, 0x17, 0x10, 0x98, 0x22, 0x66, 0x93, 0x16, 0x9c, 0x40, 0x8f, 0xd9, 0xa4, + 0x22, 0x19, 0x7f, 0x94, 0x83, 0xb3, 0x7d, 0x75, 0x14, 0xa4, 0xae, 0x4f, 0xd8, 0xcb, 0x27, 0x29, + 0x35, 0x4e, 0x9c, 0xab, 0xc5, 0x1f, 0x93, 0x6b, 0xff, 0x3d, 0x28, 0x35, 0x7a, 0x3b, 0xc9, 0xab, + 0x1d, 0x8f, 0xa8, 0xa6, 0x94, 0xab, 0x27, 0x98, 0x0a, 0xcf, 0xfa, 0x2f, 0x9d, 0xf2, 0x85, 0x25, + 0xa5, 0x62, 0xbe, 0x1d, 0x05, 0x15, 0x49, 0xc7, 0xac, 0xd2, 0x91, 0x8c, 0x5f, 0xcc, 0x67, 0xdf, + 0x91, 0x6f, 0xae, 0xd4, 0x1f, 0xe7, 0x8e, 0x7c, 0x73, 0xa5, 0x7e, 0x72, 0xdf, 0xff, 0x2b, 0xd9, + 0x77, 0x6e, 0x54, 0xc4, 0x39, 0x9e, 0x7c, 0xfb, 0x90, 0x46, 0x45, 0x82, 0x3b, 0x06, 0x09, 0xa3, + 0x22, 0x01, 0x4c, 0xde, 0x84, 0x89, 0x0d, 0x8f, 0x87, 0x93, 0x92, 0x3d, 0xe6, 0x51, 0x37, 0x64, + 0xa1, 0xca, 0x1e, 0x23, 0x48, 0x76, 0x2d, 0xd1, 0x27, 0x5e, 0x5a, 0xa9, 0xe3, 0xb5, 0x24, 0xb1, + 0x5c, 0xf4, 0x17, 0x02, 0x1d, 0xcd, 0xf8, 0x47, 0xa3, 0x60, 0x9c, 0xac, 0xdf, 0x24, 0x5f, 0xd6, + 0xc7, 0xee, 0xf2, 0xd0, 0x9a, 0xd1, 0xa1, 0x58, 0x6e, 0xb5, 0xd7, 0x72, 0xa8, 0xdb, 0xd4, 0x63, + 0x41, 0x89, 0x32, 0x95, 0x05, 0x4a, 0xb8, 0x8f, 0x13, 0xdb, 0x60, 0xf1, 0x5f, 0x16, 0xe2, 0xad, + 0x96, 0x38, 0x1a, 0x73, 0x1f, 0xe3, 0x68, 0x24, 0xb7, 0xa1, 0xac, 0x96, 0x28, 0x3a, 0x36, 0x94, + 0x5c, 0x34, 0x42, 0x89, 0x8f, 0x4a, 0x21, 0xea, 0xe7, 0x6b, 0x61, 0xf8, 0xf3, 0x35, 0xa1, 0xe3, + 0x1b, 0x79, 0x3c, 0x1d, 0x9f, 0x88, 0x1d, 0x15, 0x88, 0x43, 0x6b, 0x54, 0x8f, 0x1d, 0x95, 0x71, + 0x70, 0xa9, 0xe0, 0x32, 0xfc, 0x15, 0xfe, 0x54, 0xa2, 0xbf, 0x44, 0xe1, 0xaf, 0x38, 0x7e, 0x56, + 0xf8, 0xab, 0x08, 0x85, 0x1d, 0x80, 0x66, 0xcf, 0xe5, 0x69, 0x3f, 0xc6, 0xe3, 0x03, 0xd0, 0xef, + 0xb9, 0x56, 0x32, 0xf5, 0x47, 0x04, 0x68, 0xfc, 0xd3, 0x91, 0x6c, 0xe1, 0x20, 0x56, 0x81, 0x3f, + 0x86, 0x70, 0x10, 0x21, 0x7d, 0x3a, 0x2b, 0x75, 0x1b, 0xe6, 0xa4, 0xa1, 0x33, 0xb6, 0xde, 0xa2, + 0xfe, 0xb6, 0xb9, 0x21, 0xa6, 0x18, 0x55, 0x4e, 0x91, 0x89, 0x74, 0x57, 0xd4, 0x5b, 0x3d, 0x5f, + 0x53, 0x39, 0x65, 0xe0, 0x2f, 0xfe, 0x13, 0xa9, 0x51, 0x53, 0x27, 0x01, 0x9d, 0xd2, 0x73, 0x59, + 0x93, 0xd0, 0xeb, 0x69, 0xd3, 0xa8, 0xa3, 0x70, 0xde, 0x1b, 0x69, 0x3f, 0xb7, 0x75, 0x59, 0x51, + 0xd5, 0x98, 0xea, 0x54, 0x12, 0x48, 0x64, 0x0f, 0xce, 0xc6, 0xa2, 0xb4, 0x72, 0x53, 0x40, 0x8a, + 0xbc, 0xc3, 0x97, 0x8e, 0x8f, 0x2a, 0x2f, 0x2b, 0xa2, 0xb8, 0x7a, 0xe1, 0x48, 0x50, 0xef, 0x4f, + 0x8b, 0xf1, 0xdb, 0x65, 0xdf, 0x76, 0x9b, 0xfb, 0xca, 0x9a, 0x47, 0x7e, 0xbb, 0x83, 0xa5, 0xa9, + 0x08, 0x38, 0x31, 0xb0, 0xf1, 0xb7, 0xf3, 0xd9, 0x2a, 0x09, 0xf1, 0xd2, 0xf1, 0x18, 0x2a, 0x09, + 0x8e, 0x71, 0xf2, 0x29, 0xf1, 0x8f, 0xe4, 0x29, 0xf1, 0x32, 0x8c, 0x6f, 0x51, 0xd7, 0x76, 0xa3, + 0xc8, 0x52, 0x68, 0x71, 0x11, 0xf2, 0x22, 0x53, 0xd6, 0x91, 0x0f, 0x80, 0xd4, 0x6d, 0x9f, 0xba, + 0xe1, 0x8a, 0xd7, 0xe9, 0xda, 0x7e, 0xd8, 0xc1, 0xc4, 0x28, 0xfc, 0x68, 0x78, 0xe1, 0xf8, 0xa8, + 0x72, 0xae, 0x8b, 0xb5, 0x56, 0x53, 0xa9, 0x56, 0x03, 0x14, 0xa6, 0x91, 0xc9, 0x15, 0x18, 0x97, + 0x86, 0x04, 0x85, 0x38, 0xd8, 0x64, 0xda, 0x88, 0x40, 0x42, 0x19, 0xff, 0x72, 0x14, 0xce, 0x9f, + 0xf4, 0xac, 0x43, 0x76, 0x01, 0xee, 0xba, 0x3b, 0x9e, 0xed, 0xb7, 0x1c, 0x77, 0x4f, 0xb8, 0x80, + 0x5e, 0x1f, 0xf2, 0x4d, 0xe8, 0x72, 0x8c, 0xc9, 0x2a, 0xb9, 0xc3, 0xad, 0x17, 0x95, 0x99, 0x0a, + 0x65, 0xf2, 0x35, 0x28, 0x9a, 0xb4, 0xe9, 0x3d, 0xa0, 0x42, 0x75, 0x37, 0xb9, 0xf4, 0xd9, 0x61, + 0x5b, 0x91, 0x78, 0xd8, 0x06, 0x7a, 0x22, 0xfa, 0xa2, 0xc4, 0x8c, 0x68, 0x92, 0xaf, 0xc3, 0x24, + 0xcf, 0x7f, 0x53, 0xdd, 0x0d, 0x85, 0x7a, 0xef, 0xe4, 0x48, 0x22, 0x39, 0xc6, 0x24, 0x79, 0x46, + 0x1d, 0xcb, 0xde, 0xd5, 0x3c, 0x1b, 0x78, 0x24, 0x11, 0x85, 0xe4, 0xe2, 0x7f, 0x9a, 0x87, 0x69, + 0xbd, 0xc3, 0x64, 0x03, 0xca, 0xeb, 0xae, 0x13, 0x3a, 0x76, 0x5b, 0x37, 0x35, 0x15, 0x77, 0x4c, + 0x87, 0xd7, 0x59, 0x99, 0x26, 0xa7, 0x29, 0x4c, 0xb6, 0x66, 0xd8, 0xd4, 0x05, 0x21, 0xb7, 0x70, + 0xe0, 0x81, 0x5f, 0xc5, 0x26, 0x7e, 0x81, 0xc7, 0x19, 0x8e, 0x6b, 0x2d, 0x1e, 0x6a, 0x59, 0x0f, + 0x6a, 0x99, 0x44, 0x26, 0x0f, 0x80, 0x6c, 0xf6, 0x82, 0x90, 0xd7, 0x50, 0x7f, 0x99, 0xee, 0x7a, + 0xfe, 0x30, 0x21, 0x44, 0x5e, 0x15, 0x83, 0xf3, 0x7c, 0xa7, 0x17, 0x84, 0x96, 0x2f, 0xd0, 0xad, + 0x1d, 0xc4, 0x4f, 0x0c, 0x52, 0x46, 0x0b, 0x8b, 0x9b, 0x50, 0x52, 0x67, 0x0d, 0x2d, 0xbe, 0x9c, + 0x8e, 0x23, 0x6d, 0xef, 0xb9, 0xc5, 0x17, 0x2b, 0x30, 0x79, 0x39, 0x79, 0x4e, 0xc4, 0xdc, 0xca, + 0xc7, 0x86, 0x51, 0x71, 0x6c, 0x2d, 0xe3, 0x87, 0x73, 0x70, 0x3a, 0xdb, 0x5a, 0x88, 0x7c, 0x94, + 0x78, 0xd5, 0xcc, 0x0d, 0x7a, 0xf3, 0x95, 0x26, 0x46, 0x1f, 0xef, 0x5d, 0xd3, 0xf8, 0x4b, 0x23, + 0x29, 0x29, 0x2b, 0x83, 0x22, 0xb9, 0x99, 0x39, 0x8f, 0x39, 0xe5, 0x5c, 0x4c, 0xcf, 0x63, 0xe6, + 0xec, 0xbd, 0x03, 0xd3, 0x48, 0x38, 0x5e, 0x5c, 0x8a, 0x3e, 0x94, 0x7f, 0x72, 0xbc, 0xb4, 0xcc, + 0x04, 0x2c, 0x59, 0x07, 0x82, 0x25, 0xcb, 0x5e, 0xa8, 0xf8, 0xba, 0x2b, 0x17, 0x4d, 0x4e, 0x61, + 0xc7, 0x0b, 0x2d, 0xd5, 0xeb, 0x3d, 0x03, 0x89, 0x7c, 0x1e, 0xa6, 0xe4, 0x74, 0xae, 0xe0, 0xad, + 0x66, 0x04, 0xa7, 0x11, 0xef, 0x43, 0x72, 0x2f, 0x5a, 0x28, 0x8a, 0x9a, 0x3a, 0x20, 0xe9, 0xf0, + 0xe8, 0x47, 0xa2, 0x90, 0xb6, 0xaa, 0xe1, 0x10, 0x21, 0xa6, 0x5e, 0x11, 0xab, 0xef, 0x59, 0x9e, + 0xf1, 0x4a, 0xe2, 0x5a, 0x76, 0x98, 0x58, 0x7a, 0x49, 0xda, 0x64, 0x0f, 0xa6, 0x94, 0x4c, 0x58, + 0xd5, 0x70, 0x88, 0x44, 0x6c, 0x2f, 0x8b, 0xc6, 0xce, 0xaa, 0xe9, 0xb5, 0xd2, 0x4d, 0xe9, 0x74, + 0x8d, 0x1f, 0xcb, 0xc3, 0x34, 0xbf, 0x2d, 0x72, 0x93, 0xb1, 0xa7, 0xd6, 0xb6, 0xef, 0x6d, 0xcd, + 0xb6, 0x4f, 0x46, 0x3b, 0x57, 0xbb, 0x36, 0x94, 0x25, 0xf6, 0x3e, 0x90, 0x34, 0x0e, 0x31, 0xa1, + 0xa4, 0x96, 0x0e, 0xb6, 0xc3, 0xbb, 0x1a, 0x07, 0xc6, 0x17, 0x97, 0x75, 0xb4, 0xac, 0x0c, 0x4c, + 0x8d, 0x86, 0xf1, 0xa3, 0x79, 0x98, 0x52, 0x2c, 0xb1, 0x9f, 0xda, 0x81, 0xff, 0x82, 0x36, 0xf0, + 0x0b, 0x51, 0xb0, 0x8f, 0xa8, 0x67, 0x43, 0x8d, 0x7b, 0x0f, 0x66, 0x53, 0x28, 0x49, 0x83, 0xf6, + 0xdc, 0x30, 0x06, 0xed, 0xaf, 0xa7, 0xa3, 0x6c, 0xf3, 0x1c, 0x7b, 0x51, 0xcc, 0x55, 0x35, 0xac, + 0xf7, 0x4f, 0xe4, 0x61, 0x5e, 0xfc, 0xc2, 0xb4, 0x14, 0x5c, 0x5d, 0xf2, 0xd4, 0xce, 0x45, 0x55, + 0x9b, 0x8b, 0x8a, 0x3e, 0x17, 0x4a, 0x07, 0xfb, 0x4f, 0x89, 0xf1, 0xc3, 0x00, 0x0b, 0xfd, 0x10, + 0x86, 0x8e, 0x02, 0x16, 0x47, 0x19, 0xc9, 0x0f, 0x11, 0x65, 0x64, 0x03, 0xca, 0xd8, 0x94, 0x70, + 0x45, 0x0a, 0xb6, 0xcd, 0x75, 0x31, 0x48, 0x28, 0x7d, 0xf0, 0xdc, 0x21, 0xc2, 0x7f, 0x29, 0x48, + 0x68, 0xdd, 0x53, 0x98, 0xe4, 0xe7, 0x73, 0x30, 0x8d, 0x85, 0xab, 0x0f, 0x98, 0xb8, 0xc9, 0x88, + 0x8d, 0x88, 0xf0, 0x13, 0x91, 0xb5, 0x5e, 0x23, 0xf4, 0x1d, 0x77, 0x4f, 0x98, 0xeb, 0xed, 0x08, + 0x73, 0xbd, 0x77, 0xb8, 0x99, 0xe1, 0xe5, 0xa6, 0xd7, 0xb9, 0xb2, 0xe7, 0xdb, 0x0f, 0x1c, 0xee, + 0x64, 0x60, 0xb7, 0xaf, 0xc4, 0xa9, 0x61, 0xbb, 0x4e, 0x22, 0x69, 0xab, 0x20, 0x85, 0xa6, 0x90, + 0xfc, 0x43, 0x29, 0x36, 0x9b, 0x7c, 0x1c, 0xd0, 0xbf, 0x88, 0xfc, 0x00, 0x9c, 0xe1, 0xe1, 0xa0, + 0x57, 0x3c, 0x37, 0x74, 0xdc, 0x9e, 0xd7, 0x0b, 0x96, 0xed, 0xe6, 0x41, 0xaf, 0x1b, 0x88, 0x20, + 0x41, 0xd8, 0xf3, 0x66, 0x54, 0x69, 0xed, 0xf0, 0x5a, 0x2d, 0x50, 0x5f, 0x36, 0x01, 0xb2, 0x06, + 0xb3, 0xbc, 0xaa, 0xda, 0x0b, 0xbd, 0x46, 0xd3, 0x6e, 0x33, 0x81, 0x78, 0x1c, 0xa9, 0x72, 0x9b, + 0xa4, 0x5e, 0xe8, 0x59, 0x01, 0x2f, 0x57, 0xdf, 0x0a, 0x52, 0x48, 0x64, 0x1d, 0x66, 0x4c, 0x6a, + 0xb7, 0x36, 0xed, 0x47, 0x2b, 0x76, 0xd7, 0x6e, 0x3a, 0x21, 0xcf, 0x4f, 0x51, 0xe0, 0x2a, 0x05, + 0x9f, 0xda, 0x2d, 0xab, 0x63, 0x3f, 0xb2, 0x9a, 0xa2, 0x52, 0x7f, 0x6f, 0xd6, 0xf0, 0x22, 0x52, + 0x8e, 0x1b, 0x91, 0x9a, 0x48, 0x92, 0x72, 0xdc, 0xfe, 0xa4, 0x62, 0x3c, 0x49, 0x8a, 0x27, 0x0a, + 0xe3, 0x6e, 0x93, 0x70, 0x3e, 0x77, 0x31, 0xa7, 0x90, 0x12, 0xd9, 0xc5, 0xd0, 0x85, 0x32, 0x49, + 0x4a, 0xc1, 0x63, 0x2b, 0xef, 0xbe, 0xef, 0x84, 0x54, 0xed, 0xe1, 0x24, 0x7e, 0x16, 0x8e, 0x3f, + 0x3a, 0x9c, 0xf6, 0xeb, 0x62, 0x0a, 0x33, 0xa6, 0xa6, 0x74, 0xb2, 0x94, 0xa2, 0x96, 0xdd, 0xcb, + 0x14, 0x66, 0x44, 0x4d, 0xed, 0xe7, 0x14, 0xf6, 0x53, 0xa1, 0xd6, 0xa7, 0xa3, 0x29, 0x4c, 0x72, + 0x87, 0x0d, 0x5a, 0xc8, 0x6e, 0xee, 0x9e, 0x2b, 0xfc, 0x39, 0xa7, 0xf1, 0xd3, 0x5e, 0x12, 0x62, + 0x43, 0xd9, 0x97, 0xd5, 0x56, 0x86, 0x77, 0x67, 0x12, 0x99, 0xfc, 0x19, 0x98, 0xd9, 0x0e, 0xe8, + 0x8d, 0xf5, 0x7a, 0x43, 0x46, 0x8f, 0xc6, 0xe7, 0xad, 0xe9, 0xa5, 0xab, 0x27, 0x30, 0x9d, 0xcb, + 0x2a, 0x0e, 0x66, 0x5a, 0xe5, 0xf3, 0xd6, 0x0b, 0xa8, 0xb5, 0xeb, 0x74, 0x83, 0x28, 0x14, 0xbf, + 0x3a, 0x6f, 0x89, 0xa6, 0x8c, 0x35, 0x98, 0x4d, 0x91, 0x21, 0xd3, 0x00, 0xac, 0xd0, 0xda, 0xbe, + 0xd3, 0x58, 0xdd, 0x2a, 0x3f, 0x43, 0xca, 0x50, 0xc2, 0xdf, 0xab, 0x77, 0xaa, 0xcb, 0x1b, 0xab, + 0xb5, 0x72, 0x8e, 0xcc, 0xc2, 0x14, 0x96, 0xd4, 0xd6, 0x1b, 0xbc, 0x28, 0xcf, 0x13, 0xe4, 0x99, + 0x65, 0xbe, 0x75, 0x43, 0xb6, 0x01, 0xf0, 0x4c, 0x31, 0xfe, 0x7a, 0x1e, 0xce, 0xca, 0x63, 0x85, + 0x86, 0x0f, 0x3d, 0xff, 0xc0, 0x71, 0xf7, 0x9e, 0xf2, 0xd3, 0xe1, 0x86, 0x76, 0x3a, 0xbc, 0x94, + 0x38, 0xa9, 0x13, 0xbd, 0x1c, 0x70, 0x44, 0x7c, 0x67, 0x02, 0xce, 0x0d, 0xc4, 0x22, 0x1f, 0xb0, + 0xd3, 0xdc, 0xa1, 0x6e, 0xb8, 0xde, 0x6a, 0x53, 0x26, 0xa2, 0x7a, 0xbd, 0x50, 0xf8, 0x0f, 0xbf, + 0x88, 0x2f, 0x4a, 0x58, 0x69, 0x39, 0xad, 0x36, 0xb5, 0x42, 0x5e, 0xad, 0x2d, 0xb7, 0x34, 0x36, + 0x23, 0x19, 0x65, 0x7d, 0x5e, 0x77, 0x43, 0xea, 0x3f, 0x40, 0xbf, 0x9b, 0x88, 0xe4, 0x01, 0xa5, + 0x5d, 0xcb, 0x66, 0xb5, 0x96, 0x23, 0xaa, 0x75, 0x92, 0x29, 0x6c, 0x72, 0x43, 0x21, 0x89, 0x52, + 0xfe, 0xa6, 0xfd, 0x48, 0xd8, 0xee, 0x8b, 0x6c, 0x24, 0x11, 0x49, 0x1e, 0x99, 0xa3, 0x63, 0x3f, + 0x32, 0xd3, 0x28, 0xe4, 0x43, 0x38, 0x25, 0x0e, 0x20, 0x11, 0x39, 0x52, 0xf6, 0x98, 0xc7, 0xa5, + 0x7c, 0x85, 0x5d, 0xcc, 0xa4, 0xfb, 0xad, 0x8c, 0x06, 0x9b, 0xd5, 0xeb, 0x6c, 0x2a, 0x64, 0x8b, + 0x1d, 0xc8, 0x89, 0xe1, 0xd8, 0xa4, 0x41, 0x20, 0xc3, 0xaf, 0x08, 0xdd, 0xac, 0x3a, 0x98, 0x56, + 0x87, 0xd7, 0x9b, 0x7d, 0x31, 0xc9, 0x1a, 0x4c, 0xdf, 0xa7, 0x3b, 0xea, 0xfc, 0x8c, 0x45, 0xac, + 0xaa, 0xfc, 0x90, 0xee, 0xf4, 0x9f, 0x9c, 0x04, 0x1e, 0x71, 0xf0, 0x85, 0xfa, 0xd1, 0xe1, 0x06, + 0xbb, 0x38, 0xbb, 0xd4, 0xc7, 0xfb, 0xef, 0x38, 0x32, 0x83, 0x85, 0x58, 0x42, 0xd6, 0xeb, 0x85, + 0xee, 0x08, 0x23, 0x1e, 0xb4, 0x45, 0xb9, 0x95, 0xc8, 0x99, 0x9c, 0xa6, 0x4a, 0xbe, 0x0e, 0x33, + 0xa6, 0xd7, 0x0b, 0x1d, 0x77, 0xaf, 0xc1, 0x6e, 0x98, 0x74, 0x8f, 0x1f, 0x48, 0x71, 0x70, 0xeb, + 0x44, 0xad, 0xb0, 0x8b, 0xe2, 0x85, 0x56, 0x20, 0x4a, 0xb5, 0x13, 0x41, 0x47, 0x20, 0x5f, 0x83, + 0x69, 0x1e, 0x81, 0x2f, 0x6a, 0x60, 0x42, 0x4b, 0x9c, 0xa8, 0x57, 0xde, 0xbb, 0x2a, 0x4c, 0xad, + 0xb1, 0x34, 0xab, 0x81, 0x04, 0x35, 0xf2, 0x15, 0x31, 0x58, 0x75, 0xc7, 0xdd, 0x8b, 0x96, 0x31, + 0xe0, 0xc8, 0xbf, 0x11, 0x0f, 0x49, 0x97, 0x7d, 0xae, 0x5c, 0xc6, 0x7d, 0xfc, 0x46, 0xd2, 0x74, + 0x48, 0x08, 0xe7, 0xaa, 0x41, 0xe0, 0x04, 0xa1, 0xf0, 0xb2, 0x5f, 0x7d, 0x44, 0x9b, 0x3d, 0x06, + 0x7c, 0xdf, 0xf3, 0x0f, 0xa8, 0xcf, 0x3d, 0x17, 0x47, 0x97, 0x2f, 0x1f, 0x1f, 0x55, 0x5e, 0xb5, + 0x11, 0xd0, 0x12, 0x8e, 0xf9, 0x16, 0x95, 0xa0, 0xd6, 0x43, 0x0e, 0xab, 0xf4, 0x61, 0x30, 0x51, + 0xf2, 0x35, 0x38, 0xbd, 0x62, 0x07, 0x74, 0xdd, 0x0d, 0xa8, 0x1b, 0x38, 0xa1, 0xf3, 0x80, 0x8a, + 0x41, 0xc5, 0xc3, 0xaf, 0xc8, 0xa3, 0x9a, 0x37, 0xed, 0x80, 0x6d, 0xcc, 0x08, 0xc4, 0x12, 0x93, + 0xa2, 0x06, 0x4d, 0xcf, 0xa6, 0x42, 0x4c, 0x98, 0x6e, 0x34, 0xd6, 0x6a, 0x8e, 0x1d, 0xed, 0xab, + 0x29, 0x1c, 0xaf, 0x57, 0xf1, 0x71, 0x29, 0xd8, 0xb7, 0x5a, 0x8e, 0x1d, 0x6d, 0xa8, 0x3e, 0x83, + 0x95, 0xa0, 0x60, 0x1c, 0xe5, 0xa0, 0x9c, 0x9c, 0x4a, 0xf2, 0x25, 0x98, 0xe0, 0x4e, 0x17, 0x34, + 0xd8, 0x17, 0xfa, 0x17, 0x69, 0xc3, 0x1f, 0x95, 0xeb, 0x48, 0x22, 0x70, 0x0f, 0x77, 0xe9, 0xa0, + 0xaa, 0xa9, 0xe7, 0xda, 0x33, 0x66, 0x4c, 0x8c, 0xb4, 0xa0, 0xc4, 0x67, 0x8b, 0x62, 0x60, 0xfe, + 0x44, 0xec, 0x01, 0xb5, 0x2a, 0x41, 0x9f, 0x1b, 0x38, 0xf3, 0x35, 0xc1, 0x01, 0xb4, 0x26, 0x34, + 0xaa, 0xcb, 0x00, 0x45, 0x89, 0x68, 0x9c, 0x85, 0x33, 0x7d, 0xbe, 0xd9, 0x78, 0x80, 0x3a, 0xe7, + 0x3e, 0x2d, 0x92, 0x2f, 0xc1, 0x3c, 0x22, 0xae, 0x78, 0xae, 0x4b, 0x9b, 0x21, 0xb2, 0x23, 0xf9, + 0xfe, 0x5b, 0xe0, 0x66, 0x9a, 0xbc, 0xbf, 0xcd, 0x08, 0xc0, 0x4a, 0x3e, 0x03, 0x67, 0x52, 0x30, + 0x7e, 0x36, 0x0f, 0x0b, 0x82, 0xc3, 0x99, 0xb4, 0xe9, 0xa1, 0xf6, 0xf1, 0x29, 0x3f, 0x51, 0x57, + 0xb5, 0x13, 0xf5, 0xc5, 0x28, 0x02, 0x69, 0x56, 0x27, 0x07, 0x1c, 0xa8, 0xbf, 0x98, 0x83, 0xe7, + 0x06, 0x21, 0x45, 0x5a, 0xc5, 0x5c, 0x96, 0x56, 0x91, 0x74, 0x61, 0x0e, 0x27, 0x74, 0x65, 0x9f, + 0x36, 0x0f, 0x30, 0x68, 0x0a, 0xfa, 0x12, 0xe7, 0xfb, 0x58, 0x5b, 0xbd, 0x9e, 0x69, 0x6d, 0x75, + 0x9a, 0xaf, 0xb2, 0x26, 0xd2, 0xe0, 0xf1, 0x58, 0x0e, 0xe8, 0x61, 0x60, 0x66, 0x91, 0x36, 0x7e, + 0x32, 0xcf, 0xae, 0x6c, 0xe1, 0x7e, 0xdd, 0xa7, 0xbb, 0xd4, 0xa7, 0x6e, 0x93, 0x7e, 0x9f, 0xf9, + 0x84, 0xea, 0x9d, 0x1b, 0x4a, 0x83, 0xf1, 0xed, 0x69, 0x98, 0xcf, 0x42, 0x63, 0xe3, 0xa2, 0x5c, + 0x9a, 0x8b, 0xd2, 0x89, 0x5f, 0x5c, 0x95, 0xbf, 0x95, 0x83, 0x52, 0x83, 0x36, 0x3d, 0xb7, 0x75, + 0x03, 0xcd, 0x61, 0xc5, 0xe8, 0xd8, 0x5c, 0x68, 0x60, 0xe5, 0xd6, 0x6e, 0xc2, 0x4e, 0xf6, 0x7b, + 0x47, 0x95, 0x2f, 0x0e, 0x77, 0x57, 0x6d, 0x7a, 0xa8, 0xfb, 0x0c, 0x31, 0xcb, 0x61, 0xd4, 0x04, + 0xff, 0x1a, 0x53, 0x6b, 0x96, 0x2c, 0xc3, 0x94, 0xd8, 0xb0, 0x9e, 0x9a, 0xca, 0x81, 0x87, 0x69, + 0x95, 0x15, 0xa9, 0xe7, 0x53, 0x0d, 0x85, 0x5c, 0x83, 0xc2, 0xf6, 0xd2, 0x0d, 0x31, 0x0b, 0x32, + 0x1c, 0xd1, 0xf6, 0xd2, 0x0d, 0x54, 0x88, 0xb1, 0x4b, 0xc6, 0x54, 0x6f, 0x49, 0x33, 0x34, 0xdd, + 0x5e, 0xba, 0x41, 0xfe, 0x2c, 0x9c, 0xaa, 0x39, 0x81, 0x68, 0x82, 0xfb, 0x27, 0xb7, 0x30, 0x2a, + 0xc7, 0x58, 0x9f, 0xf5, 0xfb, 0xb9, 0xcc, 0xf5, 0xfb, 0x42, 0x2b, 0x22, 0x62, 0x71, 0xe7, 0xe7, + 0x56, 0x32, 0x65, 0x45, 0x76, 0x3b, 0xe4, 0x23, 0x98, 0xc6, 0xb7, 0x31, 0x74, 0xd9, 0xc6, 0x5c, + 0x69, 0xe3, 0x7d, 0x5a, 0xfe, 0x4c, 0x66, 0xcb, 0x8b, 0x3c, 0x78, 0x1e, 0x3a, 0x7e, 0x63, 0x5e, + 0x35, 0xed, 0xde, 0xaf, 0x51, 0x26, 0xb7, 0x60, 0x46, 0x08, 0x60, 0x77, 0x77, 0xb7, 0xf6, 0x69, + 0xcd, 0x3e, 0x14, 0x36, 0xa2, 0x78, 0xa7, 0x13, 0x52, 0x9b, 0xe5, 0xed, 0x5a, 0xe1, 0x3e, 0xb5, + 0x5a, 0xb6, 0x26, 0xaa, 0x24, 0x10, 0xc9, 0x37, 0x61, 0x72, 0xc3, 0x6b, 0x32, 0xd9, 0x1b, 0x79, + 0x03, 0x37, 0x1b, 0xfd, 0x32, 0xdb, 0xca, 0x6d, 0x5e, 0x9c, 0x10, 0xa8, 0xbe, 0x77, 0x54, 0x79, + 0xfb, 0x71, 0x97, 0x8d, 0xd2, 0x80, 0xa9, 0xb6, 0x46, 0x56, 0xa0, 0x78, 0x9f, 0xee, 0xb0, 0xde, + 0x26, 0xb3, 0xa6, 0xcb, 0x62, 0x61, 0x50, 0x2e, 0x7e, 0x69, 0x06, 0xe5, 0xa2, 0x8c, 0xf8, 0x30, + 0x8b, 0xe3, 0x53, 0xb7, 0x83, 0xe0, 0xa1, 0xe7, 0xb7, 0x30, 0x5d, 0x65, 0x3f, 0x8b, 0xd4, 0xa5, + 0xcc, 0xc1, 0x7f, 0x8e, 0x0f, 0x7e, 0x57, 0xa1, 0xa0, 0x8a, 0x90, 0x29, 0xf2, 0xe4, 0xeb, 0x30, + 0x2d, 0x02, 0x91, 0x6d, 0xde, 0xa8, 0xe2, 0x4e, 0x28, 0x69, 0xb1, 0x4d, 0xf4, 0x4a, 0xf9, 0x5e, + 0x85, 0x65, 0x51, 0x0c, 0x9d, 0xce, 0xae, 0xad, 0x3f, 0x3c, 0xab, 0x28, 0xa4, 0x0e, 0x93, 0x35, + 0xfa, 0xc0, 0x69, 0x52, 0x8c, 0xbf, 0x20, 0xdc, 0x15, 0xa3, 0x34, 0xcc, 0x71, 0x0d, 0xd7, 0xc6, + 0xb4, 0xb0, 0x80, 0x47, 0x73, 0xd0, 0x5d, 0x4d, 0x22, 0x40, 0x72, 0x1d, 0x0a, 0xeb, 0xb5, 0xba, + 0xf0, 0x56, 0x9c, 0x8d, 0xc2, 0xfd, 0xd5, 0x65, 0xd2, 0x5a, 0xb4, 0xe1, 0x76, 0x5a, 0x9a, 0xaf, + 0xe3, 0x7a, 0xad, 0x4e, 0x76, 0x61, 0x0a, 0x07, 0x60, 0x8d, 0xda, 0x7c, 0x6c, 0x67, 0xfa, 0x8c, + 0xed, 0xe5, 0xcc, 0xb1, 0x5d, 0xe0, 0x63, 0xbb, 0x2f, 0xb0, 0xb5, 0x2c, 0x9c, 0x2a, 0x59, 0x26, + 0xd4, 0x8a, 0xcc, 0xc0, 0x32, 0x77, 0xe4, 0xd6, 0x06, 0xda, 0xa8, 0x0a, 0xa1, 0x56, 0x26, 0x12, + 0x8e, 0x92, 0x59, 0xf6, 0x75, 0x86, 0x4e, 0xd3, 0x21, 0x5f, 0x80, 0x91, 0xbb, 0x07, 0xa1, 0x2d, + 0xfc, 0x12, 0xe5, 0x38, 0xb2, 0x22, 0xd9, 0x7d, 0xd4, 0x43, 0x7a, 0x07, 0x5a, 0x00, 0x69, 0xc4, + 0x61, 0x53, 0xb1, 0x66, 0xfb, 0xad, 0x87, 0xb6, 0x8f, 0x41, 0x70, 0xe6, 0x34, 0x12, 0x4a, 0x0d, + 0x9f, 0x8a, 0x7d, 0x51, 0x90, 0x78, 0xe0, 0x54, 0x49, 0x90, 0x1f, 0x80, 0xb3, 0x81, 0xb3, 0xe7, + 0xda, 0x61, 0xcf, 0xa7, 0x96, 0xdd, 0xde, 0xf3, 0x7c, 0x27, 0xdc, 0xef, 0x58, 0x41, 0xcf, 0x09, + 0x29, 0x3a, 0x08, 0x4e, 0x47, 0x32, 0x63, 0x43, 0xc2, 0x55, 0x25, 0x58, 0x83, 0x41, 0x99, 0x67, + 0x82, 0xec, 0x0a, 0xf2, 0x15, 0x98, 0x52, 0x59, 0x72, 0xb0, 0x70, 0xea, 0x7c, 0xe1, 0xe2, 0x74, + 0x74, 0xf5, 0x48, 0xb2, 0x70, 0x99, 0xc0, 0x46, 0x39, 0x23, 0x02, 0x3d, 0x81, 0x8d, 0x42, 0x8b, + 0x98, 0x70, 0x26, 0xe0, 0xfa, 0x8d, 0x9e, 0xeb, 0x3c, 0xc2, 0x58, 0x6b, 0xc2, 0x96, 0x79, 0xe1, + 0xb4, 0x76, 0xf4, 0x35, 0x10, 0x6a, 0xfb, 0xce, 0xfa, 0x97, 0xb6, 0x03, 0xea, 0x0b, 0x93, 0xe6, + 0x79, 0x8e, 0xbb, 0xed, 0x3a, 0x8f, 0xe2, 0x52, 0xae, 0x3c, 0xb9, 0x35, 0x52, 0x24, 0xe5, 0x39, + 0x73, 0x56, 0xec, 0x02, 0x31, 0x73, 0x9b, 0x37, 0xaa, 0xe6, 0x78, 0x7d, 0xfd, 0x5e, 0xa3, 0xed, + 0x85, 0xc6, 0x3e, 0xcc, 0x67, 0x51, 0x25, 0x0b, 0x30, 0x2e, 0x52, 0xe5, 0xe1, 0xe1, 0x58, 0x34, + 0xe5, 0x4f, 0xf2, 0x2c, 0x4c, 0xec, 0x3a, 0x7e, 0x10, 0x5a, 0x3d, 0x87, 0xcb, 0x0b, 0xa3, 0x66, + 0x11, 0x0b, 0xb6, 0x9d, 0x16, 0x39, 0x0b, 0x45, 0x7c, 0xe3, 0x62, 0x75, 0x05, 0xac, 0x1b, 0x67, + 0xbf, 0xb7, 0x9d, 0x96, 0xf1, 0x5f, 0xe6, 0xf0, 0x08, 0x22, 0xaf, 0x62, 0x4c, 0xdb, 0xc8, 0xfe, + 0x04, 0xf5, 0xcf, 0x76, 0x37, 0x91, 0x7a, 0x8e, 0x83, 0x90, 0xd7, 0x61, 0xec, 0x86, 0xdd, 0xa4, + 0x91, 0x59, 0x03, 0x02, 0xef, 0x62, 0x89, 0xaa, 0xac, 0xe6, 0x30, 0x4c, 0x3e, 0xe6, 0x5b, 0xb3, + 0x1a, 0x86, 0x34, 0xe0, 0xfc, 0x73, 0xa5, 0x2a, 0x4d, 0x19, 0x50, 0x3e, 0x16, 0x5b, 0xda, 0x8e, + 0x01, 0x12, 0x2e, 0x69, 0x99, 0x14, 0x8c, 0xdf, 0xcf, 0xc5, 0x3c, 0x95, 0xbc, 0x02, 0x23, 0x66, + 0x3d, 0xfa, 0x7e, 0x1e, 0x96, 0x27, 0xf1, 0xf9, 0x08, 0x40, 0xbe, 0x02, 0xa7, 0x14, 0x3a, 0x29, + 0xff, 0xb8, 0x97, 0x31, 0x6a, 0x8c, 0xf2, 0x25, 0xd9, 0x4e, 0x72, 0xd9, 0x34, 0xf0, 0x32, 0x10, + 0x57, 0xd4, 0xa8, 0xeb, 0x70, 0xda, 0x4a, 0x67, 0x55, 0xda, 0x2d, 0x04, 0x48, 0x76, 0x36, 0x8b, + 0x02, 0x0f, 0x1a, 0x63, 0xfc, 0x5a, 0x4e, 0xe3, 0x95, 0xe4, 0x82, 0x26, 0xe7, 0xe2, 0xbe, 0x4e, + 0x28, 0x05, 0xb8, 0xc4, 0xfb, 0x16, 0x40, 0xb5, 0x17, 0x7a, 0xab, 0xae, 0xef, 0xb5, 0xdb, 0x22, + 0xe2, 0x19, 0x0f, 0x47, 0xd1, 0x0b, 0x3d, 0x8b, 0x62, 0xb1, 0x16, 0x8e, 0x22, 0x02, 0xce, 0x74, + 0x25, 0x2c, 0x7c, 0x5c, 0x57, 0x42, 0xe3, 0x67, 0xf2, 0x1a, 0x87, 0x61, 0x52, 0xae, 0x58, 0xf4, + 0xaa, 0xcd, 0x75, 0xd7, 0x79, 0x60, 0x05, 0x6d, 0x4f, 0x0b, 0xbe, 0x27, 0xc0, 0xc8, 0x5f, 0xca, + 0xc1, 0x69, 0xee, 0x93, 0x77, 0xa7, 0xd7, 0xd9, 0xa1, 0xfe, 0x3d, 0xbb, 0xed, 0xb4, 0xe2, 0x88, + 0xe1, 0xb1, 0x01, 0xbe, 0xd2, 0x4c, 0x36, 0x3c, 0xbf, 0x68, 0x73, 0x1f, 0x41, 0xcb, 0xc5, 0x4a, + 0xeb, 0x41, 0x54, 0xab, 0x5e, 0xb4, 0xb3, 0xf1, 0xc9, 0x3a, 0x4c, 0xd6, 0x1d, 0x17, 0x33, 0x93, + 0xc6, 0x51, 0x2c, 0x5e, 0xe1, 0x2e, 0xb6, 0x6c, 0x09, 0x37, 0xf7, 0xe9, 0x00, 0xd6, 0xad, 0xe2, + 0x1a, 0xbf, 0x94, 0x83, 0x17, 0x4e, 0xfc, 0x60, 0x72, 0x05, 0xc6, 0x57, 0xd5, 0xfd, 0xcf, 0x2d, + 0x81, 0xd2, 0xd9, 0x33, 0x25, 0x14, 0xf9, 0x2a, 0x9c, 0x52, 0x49, 0x6d, 0xf9, 0xb6, 0xa3, 0x7a, + 0x13, 0x67, 0x0c, 0x40, 0xc8, 0x40, 0x92, 0x62, 0x6b, 0x36, 0x11, 0xe3, 0xff, 0xcd, 0xc1, 0x44, + 0xe4, 0x8e, 0xf4, 0x94, 0x5e, 0x67, 0xae, 0x6b, 0xd7, 0x19, 0x99, 0x7a, 0x21, 0xea, 0x15, 0x37, + 0x3d, 0xca, 0xb8, 0x82, 0xce, 0x28, 0xce, 0x5b, 0x58, 0xf0, 0x23, 0x79, 0x98, 0x64, 0xac, 0x9a, + 0xbf, 0x69, 0x7f, 0x7f, 0x05, 0xa0, 0x8f, 0xfa, 0x35, 0x54, 0x88, 0xf0, 0x7f, 0x9b, 0xc3, 0xb7, + 0x0e, 0x15, 0x83, 0x8d, 0x06, 0x2b, 0x52, 0x47, 0x83, 0x9d, 0xa8, 0x26, 0x96, 0xf2, 0x80, 0xc9, + 0x1b, 0x62, 0x24, 0x44, 0xc0, 0xe4, 0xb6, 0xc9, 0xca, 0xc8, 0x17, 0x61, 0x74, 0x1b, 0x35, 0xb7, + 0x7a, 0x44, 0xbd, 0x88, 0x3e, 0x56, 0x72, 0x7e, 0xdf, 0x0b, 0xf4, 0x68, 0xda, 0x1c, 0x91, 0x34, + 0x60, 0x7c, 0xc5, 0xa7, 0x76, 0x48, 0x5b, 0x62, 0x40, 0x86, 0x8a, 0x07, 0xd5, 0xe4, 0x28, 0xc9, + 0x78, 0x50, 0x82, 0x12, 0xe3, 0x63, 0x24, 0xee, 0x23, 0x5a, 0xed, 0x04, 0x4f, 0xed, 0xa4, 0xbf, + 0xaf, 0x4d, 0xfa, 0xb9, 0xd4, 0xa4, 0xf3, 0xee, 0x0d, 0x35, 0xf7, 0xbf, 0x9e, 0x83, 0xd3, 0xd9, + 0x88, 0xe4, 0x45, 0x18, 0xbb, 0xbb, 0x55, 0x8f, 0x2d, 0xe5, 0xb0, 0x2b, 0x5e, 0x17, 0xd5, 0x26, + 0xa6, 0xa8, 0x22, 0x6f, 0xc0, 0xd8, 0x07, 0xe6, 0x4a, 0x6c, 0x10, 0x86, 0x0c, 0xee, 0x1b, 0x4c, + 0xf2, 0xd2, 0x4e, 0x35, 0x01, 0xa4, 0xce, 0x6d, 0xe1, 0x89, 0xcd, 0xed, 0x4f, 0xe4, 0x61, 0xa6, + 0xda, 0x6c, 0xd2, 0x20, 0x10, 0x09, 0xbf, 0x9e, 0xda, 0x89, 0xcd, 0x0e, 0xb7, 0xa8, 0xf5, 0x6d, + 0xa8, 0x59, 0xfd, 0x8d, 0x1c, 0x0f, 0x9e, 0xca, 0xb0, 0x1e, 0x38, 0xf4, 0xe1, 0xd6, 0xbe, 0x4f, + 0x83, 0x7d, 0xaf, 0xdd, 0x1a, 0x3a, 0xe1, 0x2c, 0x93, 0x19, 0x31, 0x29, 0x96, 0x6a, 0xe0, 0xb0, + 0x8b, 0x25, 0x9a, 0xcc, 0xc8, 0x13, 0x67, 0x5d, 0x81, 0xf1, 0x6a, 0xb7, 0xeb, 0x7b, 0x0f, 0xf8, + 0xb6, 0x17, 0xf1, 0xf2, 0x6d, 0x5e, 0xa4, 0x45, 0xc0, 0xe2, 0x45, 0xec, 0x33, 0x6a, 0xd4, 0x3d, + 0x54, 0xcd, 0xd3, 0x5a, 0xd4, 0x55, 0x2f, 0x25, 0x58, 0x6f, 0x34, 0x80, 0xd4, 0x7d, 0xaf, 0xe3, + 0x85, 0xb4, 0xc5, 0xfb, 0x83, 0x81, 0xc3, 0x4e, 0x8c, 0x35, 0xbc, 0xe5, 0x84, 0x6d, 0x2d, 0xd6, + 0x70, 0xc8, 0x0a, 0x4c, 0x5e, 0xce, 0xce, 0xee, 0x73, 0xda, 0x98, 0xd6, 0xfc, 0x43, 0xb3, 0xe7, + 0xae, 0xba, 0xbe, 0xd3, 0xdc, 0x47, 0x1f, 0xd7, 0x3b, 0x00, 0x26, 0xb5, 0x03, 0xcf, 0x55, 0x84, + 0xb5, 0xcb, 0x3c, 0xdd, 0x2e, 0x2b, 0x4d, 0xeb, 0x1d, 0x66, 0x05, 0xa5, 0x18, 0xcb, 0x54, 0x28, + 0x90, 0x2a, 0x4c, 0xf1, 0x5f, 0xac, 0x33, 0xdd, 0x48, 0x10, 0x7f, 0x96, 0x7b, 0x9c, 0x22, 0xc9, + 0x2e, 0xd6, 0xe8, 0xd1, 0x28, 0x14, 0x0c, 0xe3, 0xff, 0x1a, 0x85, 0x92, 0x3a, 0xa5, 0xc4, 0xe0, + 0xb9, 0x23, 0x3d, 0x5f, 0x8d, 0xdf, 0x67, 0x63, 0x89, 0x29, 0x6a, 0xe2, 0xe0, 0x97, 0xf9, 0x13, + 0x83, 0x5f, 0xde, 0x87, 0xa9, 0xba, 0xef, 0x61, 0x36, 0x02, 0x7c, 0x6d, 0x16, 0xfc, 0x7b, 0x4e, + 0xd1, 0x1a, 0xb0, 0xd5, 0x87, 0xef, 0xd9, 0x78, 0x2f, 0xeb, 0x0a, 0x68, 0x8b, 0x89, 0xbe, 0x9a, + 0xce, 0x4c, 0xa3, 0xc3, 0x4d, 0x65, 0x58, 0x4f, 0xd4, 0x1c, 0x3b, 0xbc, 0xd3, 0xba, 0xa9, 0x0c, + 0x2b, 0x51, 0x19, 0xc4, 0xe8, 0x93, 0x62, 0x10, 0xe4, 0x67, 0x72, 0x30, 0x59, 0x75, 0x5d, 0x11, + 0x54, 0xf3, 0x84, 0x10, 0x60, 0x5f, 0x15, 0xd6, 0x32, 0x6f, 0x7f, 0x2c, 0x6b, 0x19, 0x14, 0xb6, + 0x02, 0x94, 0xd4, 0xe3, 0x06, 0xb5, 0xc0, 0x38, 0x71, 0x31, 0x79, 0x1b, 0xca, 0xd1, 0xce, 0x5c, + 0x77, 0x5b, 0xf4, 0x11, 0x0d, 0x16, 0xc6, 0xcf, 0x17, 0x2e, 0x4e, 0x89, 0x14, 0x47, 0xaa, 0x64, + 0x9e, 0x04, 0x24, 0x5b, 0x00, 0x76, 0xb4, 0x25, 0xc4, 0x23, 0xde, 0xd9, 0xf8, 0xc1, 0x25, 0xb1, + 0x67, 0xc4, 0xed, 0x01, 0x7f, 0xe3, 0x83, 0xa4, 0x7a, 0x7b, 0x88, 0xe9, 0x90, 0x0e, 0xcc, 0x54, + 0x83, 0xa0, 0xd7, 0xa1, 0x8d, 0xd0, 0xf6, 0x43, 0xcc, 0x63, 0x08, 0xc3, 0x9b, 0x81, 0xda, 0x88, + 0xca, 0x56, 0x84, 0x1f, 0x5a, 0x19, 0x49, 0x0d, 0x93, 0xb4, 0x79, 0x42, 0x29, 0xf3, 0x4c, 0xfa, + 0x7b, 0xf9, 0x4e, 0xfd, 0x89, 0x1c, 0x9c, 0x56, 0x17, 0x7d, 0xa3, 0xb7, 0x23, 0xb2, 0x38, 0x90, + 0xcb, 0x30, 0x21, 0xd6, 0x64, 0x74, 0x89, 0x4c, 0xa7, 0x63, 0x8c, 0x41, 0xc8, 0x2a, 0x5b, 0x86, + 0x8c, 0x86, 0xb8, 0x75, 0xcc, 0x25, 0x98, 0x2b, 0xab, 0x5a, 0x5e, 0x88, 0xf3, 0x49, 0xb2, 0xdf, + 0xfa, 0xfa, 0x64, 0x25, 0xc6, 0x7b, 0x30, 0xab, 0xcf, 0x44, 0x83, 0x86, 0xe4, 0x12, 0x8c, 0xcb, + 0xe9, 0xcb, 0x65, 0x4f, 0x9f, 0xac, 0x37, 0xee, 0x03, 0x49, 0xe1, 0x07, 0x68, 0xd6, 0xc6, 0xee, + 0xe7, 0xdc, 0xec, 0x52, 0x3e, 0x2a, 0xa7, 0x00, 0x97, 0xe7, 0xc4, 0xf7, 0x4d, 0x6a, 0x8e, 0x8d, + 0x98, 0xd1, 0xe2, 0x37, 0xca, 0x30, 0x97, 0x71, 0x50, 0x9c, 0x20, 0xc8, 0x55, 0x74, 0x06, 0x31, + 0x11, 0x45, 0x10, 0x94, 0x6c, 0xe1, 0x3d, 0x18, 0x3d, 0x91, 0x1d, 0x70, 0xb7, 0xd6, 0x04, 0x17, + 0xe0, 0x68, 0x9f, 0x8a, 0x30, 0xa7, 0x46, 0x0c, 0x1d, 0x7d, 0x62, 0x11, 0x43, 0x31, 0x64, 0x90, + 0xc2, 0xc4, 0xf5, 0x30, 0x46, 0x3c, 0xbd, 0x68, 0x8a, 0x6d, 0xe9, 0x28, 0x9c, 0x46, 0xe0, 0xb5, + 0x1f, 0x50, 0x41, 0x63, 0x5c, 0xa5, 0x81, 0x15, 0x99, 0x34, 0x14, 0x14, 0xf2, 0x0f, 0x72, 0x40, + 0x44, 0x89, 0xca, 0xb3, 0x8a, 0x83, 0x78, 0x56, 0xeb, 0xc9, 0xf0, 0xac, 0x73, 0xf2, 0x1b, 0xb3, + 0x79, 0x57, 0xc6, 0x67, 0x91, 0xbf, 0x97, 0x83, 0x59, 0x1e, 0x69, 0x52, 0xfd, 0xd8, 0x81, 0xd1, + 0x03, 0x9b, 0x4f, 0xe6, 0x63, 0x9f, 0x13, 0x89, 0x65, 0xb3, 0xbf, 0x35, 0xfd, 0x51, 0xe4, 0x07, + 0x00, 0xa2, 0x1d, 0xc5, 0xb3, 0x7a, 0x4c, 0x2e, 0x3d, 0x97, 0xc1, 0x05, 0x22, 0xa0, 0x38, 0x9b, + 0x62, 0x18, 0xe1, 0xa9, 0x6c, 0x33, 0xa6, 0x46, 0xfe, 0x2c, 0x8f, 0xc1, 0x1f, 0x95, 0x88, 0x20, + 0xbb, 0x0b, 0x93, 0xd8, 0xca, 0x67, 0xfb, 0x0b, 0x72, 0x97, 0xb3, 0xd0, 0x78, 0x0e, 0x98, 0xc8, + 0xc8, 0xda, 0x0f, 0x3b, 0xc9, 0x38, 0xfc, 0x49, 0x0c, 0x8c, 0x5d, 0x8d, 0x5f, 0xcf, 0x33, 0x1e, + 0xf6, 0xe1, 0x6f, 0x67, 0xe5, 0x5e, 0xe0, 0xfc, 0x2d, 0xe1, 0x8c, 0x84, 0x45, 0xe4, 0x03, 0x20, + 0x51, 0x88, 0x46, 0x5e, 0x46, 0x65, 0x36, 0x44, 0xfe, 0x58, 0x10, 0x87, 0x7a, 0xf4, 0x65, 0xb5, + 0xba, 0x48, 0xd2, 0xc8, 0x84, 0xc2, 0xbc, 0xe8, 0x34, 0x2b, 0xe5, 0x0e, 0xc4, 0xeb, 0xb5, 0x60, + 0x61, 0x5a, 0x0b, 0x61, 0x1c, 0xd7, 0x2c, 0x3f, 0x2f, 0x93, 0x07, 0x47, 0x9e, 0xc8, 0xba, 0x4b, + 0x6f, 0x26, 0x39, 0x72, 0x1d, 0x26, 0x30, 0xd4, 0xc8, 0x9a, 0x34, 0xd6, 0x13, 0x86, 0x43, 0x18, + 0x94, 0xc4, 0xda, 0xd7, 0x4d, 0xee, 0x62, 0x50, 0x76, 0x87, 0xe1, 0x12, 0x20, 0xaa, 0xf4, 0x85, + 0x92, 0xa6, 0xe5, 0x1f, 0x5a, 0x7e, 0x4f, 0x0f, 0x63, 0x83, 0x40, 0xe4, 0xeb, 0x30, 0xb9, 0x69, + 0x3f, 0x8a, 0x92, 0x14, 0xcf, 0x0e, 0x9f, 0x0a, 0xb9, 0x63, 0x3f, 0x8a, 0x32, 0x14, 0x27, 0x1d, + 0x98, 0x14, 0x92, 0xe4, 0x43, 0x00, 0xe5, 0x9d, 0x81, 0x9c, 0xd8, 0xc0, 0x0b, 0x32, 0x30, 0x77, + 0xe6, 0xfb, 0x03, 0xd2, 0x57, 0x08, 0x26, 0x24, 0x87, 0xf9, 0x4f, 0x4f, 0x72, 0x38, 0xf5, 0xe9, + 0x49, 0x0e, 0xfc, 0x99, 0x8b, 0xcf, 0x3d, 0x72, 0xf0, 0x43, 0xa1, 0xe5, 0x1f, 0xd4, 0xda, 0x73, + 0xd2, 0x14, 0x14, 0x8f, 0x82, 0xc3, 0x44, 0x13, 0x09, 0x7a, 0xc4, 0x87, 0x72, 0xf2, 0x62, 0xb0, + 0x70, 0x46, 0xb3, 0x2c, 0x1c, 0x78, 0x89, 0xe0, 0xea, 0x56, 0xb1, 0x8c, 0x2c, 0x1a, 0x95, 0xab, + 0x42, 0x5d, 0x12, 0x67, 0x71, 0x07, 0xce, 0xf6, 0x65, 0x08, 0x19, 0x59, 0x6c, 0xae, 0xe8, 0x59, + 0x6c, 0xce, 0xf6, 0x13, 0x1c, 0x02, 0x3d, 0x95, 0xe7, 0x5c, 0x79, 0xbe, 0xbf, 0xcc, 0xf5, 0xdd, + 0x7c, 0x42, 0x90, 0x10, 0x77, 0x3c, 0x9e, 0xf8, 0xba, 0x9f, 0xa4, 0x95, 0x5f, 0xaf, 0xb1, 0x4b, + 0x1d, 0x8a, 0x1a, 0x4a, 0xe2, 0x31, 0x26, 0x6a, 0xa8, 0xa2, 0x0a, 0x0a, 0x1d, 0x9f, 0x54, 0xa6, + 0x78, 0x07, 0xa6, 0x1b, 0xd4, 0xf6, 0x9b, 0xfb, 0xb7, 0xe9, 0xe1, 0x43, 0xcf, 0x6f, 0xf1, 0x04, + 0xb9, 0xe2, 0x66, 0x11, 0x60, 0x8d, 0x1e, 0xb2, 0x41, 0x85, 0x25, 0x35, 0x19, 0x93, 0x63, 0x14, + 0x5b, 0x3f, 0x9b, 0xc9, 0x9b, 0x19, 0xc0, 0xa0, 0x70, 0x1d, 0xe4, 0xcd, 0x48, 0xfc, 0xa4, 0xbe, + 0x9a, 0xd0, 0xd3, 0x97, 0x85, 0x19, 0x52, 0x28, 0xf5, 0x8d, 0xdf, 0x29, 0x00, 0xe1, 0x2d, 0xad, + 0xd8, 0x5d, 0x1b, 0x23, 0xd6, 0x38, 0x18, 0x96, 0xb6, 0x2c, 0x60, 0xec, 0x9d, 0x36, 0x55, 0x63, + 0x3a, 0x0b, 0x93, 0xef, 0xa8, 0xce, 0x4a, 0x5e, 0xdf, 0x52, 0x88, 0x7d, 0x18, 0x78, 0xfe, 0x93, + 0x30, 0xf0, 0xaf, 0xc3, 0xb3, 0xd5, 0x6e, 0xb7, 0xed, 0x34, 0xa3, 0x56, 0x6e, 0x78, 0xbe, 0xdc, + 0x2e, 0x5a, 0x2c, 0x04, 0x3b, 0x02, 0x4b, 0x7d, 0xe9, 0x20, 0x12, 0x8a, 0xf4, 0xc5, 0x2f, 0xbc, + 0x6a, 0x6c, 0x2d, 0x29, 0x7d, 0x65, 0x5d, 0x91, 0x15, 0x14, 0x49, 0xc3, 0xf1, 0xa5, 0xf4, 0x35, + 0x1a, 0x67, 0x8a, 0x91, 0x2f, 0xdc, 0xd9, 0x12, 0x5c, 0x84, 0x42, 0xde, 0x81, 0xc9, 0x6a, 0x2f, + 0xf4, 0x04, 0x61, 0xe1, 0xab, 0x10, 0x7b, 0x15, 0x88, 0x4f, 0xd1, 0x2e, 0x74, 0x31, 0xb8, 0xf1, + 0x7b, 0x05, 0x38, 0x9b, 0x9e, 0x5e, 0x51, 0x1b, 0xed, 0x8f, 0xdc, 0x09, 0xfb, 0x23, 0x6b, 0x35, + 0xe4, 0xe3, 0x54, 0x86, 0x4f, 0x62, 0x35, 0x14, 0x90, 0xdc, 0xc7, 0x5c, 0x0d, 0x0d, 0x98, 0x54, + 0x4f, 0xf1, 0x91, 0x8f, 0x7b, 0x8a, 0xab, 0x54, 0xc8, 0x25, 0x18, 0xe5, 0x21, 0xc5, 0x46, 0xe3, + 0x07, 0xc1, 0x64, 0x34, 0x31, 0x0e, 0x41, 0xfe, 0x03, 0x38, 0xcf, 0x79, 0x52, 0xb2, 0xb3, 0xcb, + 0x87, 0x92, 0xa2, 0x98, 0xb8, 0xa5, 0xe3, 0xa3, 0xca, 0x65, 0xae, 0xb5, 0xb2, 0x52, 0xc3, 0x66, + 0xed, 0x1c, 0x5a, 0xf2, 0xcb, 0x94, 0x46, 0x4e, 0xa4, 0x6d, 0x3c, 0x82, 0xb3, 0xa2, 0x36, 0x0e, + 0x66, 0x23, 0x2b, 0xd9, 0x24, 0x1f, 0xc4, 0x8a, 0x47, 0x9c, 0xe4, 0x84, 0x4e, 0x11, 0xeb, 0xc9, + 0x35, 0x28, 0x56, 0xeb, 0xeb, 0x3c, 0xb9, 0xba, 0x12, 0x8a, 0xc8, 0xee, 0x3a, 0x3c, 0xea, 0x8a, + 0x16, 0xdd, 0x40, 0x00, 0x1a, 0xbf, 0x9a, 0x03, 0x88, 0x07, 0x8d, 0xbc, 0x91, 0xe5, 0x3e, 0xc6, + 0xd3, 0x51, 0xf1, 0x62, 0xdd, 0x73, 0x4c, 0xea, 0x44, 0xf3, 0x99, 0x3a, 0x51, 0xa9, 0x54, 0x2b, + 0x64, 0x2a, 0xd5, 0x6a, 0x30, 0xd3, 0xe8, 0xed, 0xc8, 0xb6, 0x93, 0xc1, 0x2f, 0x82, 0xde, 0x4e, + 0xd6, 0x50, 0x26, 0x51, 0x8c, 0xbf, 0x9c, 0x87, 0x52, 0xbd, 0xdd, 0xdb, 0x73, 0xdc, 0x9a, 0x1d, + 0xda, 0x4f, 0xad, 0x9a, 0xf6, 0x2d, 0x4d, 0x4d, 0x1b, 0x79, 0x49, 0x46, 0x1d, 0x1b, 0x4a, 0x47, + 0xfb, 0xd3, 0x39, 0x98, 0x89, 0x51, 0xf8, 0x09, 0xbf, 0x06, 0x23, 0xec, 0x87, 0xd0, 0x03, 0x9c, + 0x4f, 0x11, 0x46, 0xa8, 0xcb, 0xd1, 0x5f, 0x42, 0x71, 0xaa, 0x67, 0x16, 0x47, 0x0a, 0x8b, 0x9f, + 0x83, 0x89, 0x98, 0x6c, 0x5a, 0x70, 0x98, 0x57, 0x05, 0x87, 0x09, 0x35, 0xcf, 0xdd, 0x2f, 0xe7, + 0xa0, 0x9c, 0xec, 0x09, 0xb9, 0x0d, 0xe3, 0x8c, 0x92, 0x43, 0xa5, 0x8a, 0xe2, 0xa5, 0x3e, 0x7d, + 0xbe, 0x2c, 0xc0, 0xf8, 0xe7, 0xe1, 0xe0, 0x53, 0x5e, 0x62, 0x4a, 0x0a, 0x8b, 0x26, 0x94, 0x54, + 0xa8, 0x8c, 0xaf, 0x7b, 0x5d, 0x17, 0x6b, 0x4e, 0x67, 0x8f, 0x83, 0xfa, 0xd5, 0x7f, 0x43, 0xfb, + 0x6a, 0x21, 0xb1, 0x5c, 0xd0, 0x16, 0x57, 0xe6, 0x56, 0xc4, 0x45, 0x83, 0x09, 0xf7, 0x04, 0xdf, + 0xc8, 0xab, 0xa1, 0x20, 0x53, 0x0b, 0x3a, 0x82, 0x23, 0xaf, 0xc3, 0x18, 0x6f, 0x4f, 0x4d, 0x33, + 0xde, 0xc5, 0x12, 0xf5, 0xca, 0xc0, 0x61, 0x8c, 0xbf, 0x59, 0x80, 0xd3, 0xf1, 0xe7, 0x6d, 0x77, + 0x5b, 0x76, 0x48, 0xeb, 0xb6, 0x6f, 0x77, 0x82, 0x13, 0x76, 0xc0, 0xc5, 0xd4, 0xa7, 0x89, 0xb0, + 0x0a, 0xbc, 0x4c, 0xf9, 0x20, 0x23, 0xf1, 0x41, 0xa8, 0x0e, 0xe6, 0x1f, 0x24, 0x3f, 0x83, 0xdc, + 0x86, 0x42, 0x83, 0x86, 0x82, 0x61, 0x5f, 0x48, 0x8d, 0xaa, 0xfa, 0x5d, 0x97, 0x1b, 0x34, 0xe4, + 0x93, 0xc8, 0x83, 0x6c, 0x6a, 0x01, 0x0c, 0x18, 0x15, 0x72, 0x1f, 0xc6, 0x56, 0x1f, 0x75, 0x69, + 0x33, 0xc4, 0xcc, 0x4a, 0x8a, 0x27, 0x7f, 0x36, 0x3d, 0x0e, 0xcb, 0x49, 0xce, 0x0b, 0x19, 0x5c, + 0xcf, 0x66, 0x28, 0xc8, 0x2d, 0x5e, 0x87, 0xa2, 0x6c, 0xfc, 0x71, 0x56, 0xee, 0xe2, 0x5b, 0x30, + 0xa9, 0x34, 0xf2, 0x58, 0x8b, 0xfe, 0xe7, 0x18, 0x5f, 0xf5, 0xda, 0x54, 0x2c, 0x9c, 0xd5, 0x94, + 0x80, 0xa9, 0xe4, 0x48, 0xe6, 0x02, 0xa6, 0x75, 0x20, 0xaa, 0x06, 0x48, 0x9a, 0xeb, 0x30, 0xd3, + 0x38, 0x70, 0xba, 0x71, 0x22, 0x0e, 0xed, 0x18, 0xc7, 0x3c, 0xac, 0x42, 0x87, 0x91, 0x3c, 0xc6, + 0x93, 0x78, 0xc6, 0x1f, 0xe5, 0x60, 0x8c, 0xfd, 0x75, 0xef, 0xfa, 0x53, 0xca, 0x32, 0xaf, 0x69, + 0x2c, 0x73, 0x56, 0x49, 0xac, 0x85, 0x8c, 0xe3, 0xfa, 0x09, 0xcc, 0xf2, 0x48, 0x4c, 0x10, 0x07, + 0x26, 0x37, 0x61, 0x5c, 0xd8, 0xc6, 0x09, 0x37, 0x06, 0x35, 0x53, 0x97, 0xb4, 0x9a, 0x8b, 0x94, + 0x1d, 0x5e, 0x37, 0xa9, 0x1d, 0x92, 0xd8, 0xec, 0x32, 0x20, 0x53, 0xa2, 0xa8, 0x69, 0x40, 0x19, + 0x99, 0x15, 0xcf, 0xe5, 0x79, 0xa6, 0x82, 0xe5, 0x33, 0x82, 0x52, 0xbf, 0x40, 0x45, 0x55, 0xf1, + 0x9a, 0x55, 0x18, 0x44, 0xe4, 0xb4, 0x20, 0x92, 0xfd, 0xd0, 0xd5, 0x81, 0xd3, 0x8d, 0xc6, 0x1a, + 0xda, 0xd1, 0xd6, 0x3d, 0x3f, 0xbc, 0xe1, 0xf9, 0x0f, 0x45, 0x3c, 0x96, 0x86, 0x6e, 0x43, 0x92, + 0x65, 0xdd, 0xf8, 0x4a, 0xa6, 0x75, 0xe3, 0x00, 0x3b, 0x13, 0xc3, 0x85, 0x33, 0x8d, 0xc6, 0x1a, + 0xcf, 0xf2, 0xf4, 0xc7, 0xd1, 0xde, 0x2f, 0xe7, 0x60, 0xb6, 0xd1, 0x58, 0x4b, 0x34, 0xb5, 0x21, + 0xd3, 0x4b, 0xe5, 0xb4, 0x87, 0xec, 0xec, 0x81, 0xc0, 0x59, 0xc8, 0x71, 0xb1, 0xb0, 0xa9, 0x05, + 0x09, 0xe7, 0x44, 0x48, 0x3d, 0x4a, 0x68, 0x95, 0xd7, 0x5c, 0x5b, 0xfa, 0x74, 0x14, 0x95, 0xfd, + 0xc2, 0x31, 0x94, 0xd5, 0xea, 0xca, 0x7e, 0x56, 0x62, 0xfc, 0x8b, 0xd3, 0x3c, 0x65, 0x96, 0x5c, + 0x2d, 0xef, 0x42, 0x49, 0xe0, 0xa3, 0xff, 0x87, 0xb0, 0xe9, 0x39, 0xcb, 0x18, 0xe4, 0x2e, 0x2f, + 0xe7, 0xd9, 0x4f, 0xbe, 0x77, 0x54, 0x19, 0x61, 0x43, 0x63, 0x6a, 0xe0, 0xe4, 0x2e, 0x4c, 0x6d, + 0xda, 0x8f, 0x14, 0xcd, 0x0e, 0xf7, 0xee, 0xbb, 0xc4, 0xb8, 0x4a, 0xc7, 0x7e, 0x34, 0x84, 0xf5, + 0xa8, 0x8e, 0x4f, 0x0e, 0x60, 0x5a, 0xef, 0x93, 0x58, 0x81, 0xe9, 0x19, 0xbb, 0x9a, 0x39, 0x63, + 0x67, 0xbb, 0x9e, 0x1f, 0x5a, 0xbb, 0x11, 0xba, 0x96, 0x1e, 0x2e, 0x41, 0x9a, 0xbc, 0x0b, 0xb3, + 0x4a, 0x28, 0xf6, 0x1b, 0x9e, 0xdf, 0xb1, 0xe5, 0x2d, 0x0d, 0x9f, 0x3b, 0xd0, 0xac, 0x6c, 0x17, + 0x8b, 0xcd, 0x34, 0x24, 0xf9, 0x4a, 0x96, 0xc7, 0xe4, 0x68, 0x6c, 0x42, 0x9b, 0xe1, 0x31, 0xd9, + 0xcf, 0x84, 0x36, 0xed, 0x3b, 0xb9, 0x37, 0xc8, 0xc4, 0xbe, 0xc8, 0x7b, 0x3f, 0x94, 0x09, 0x7d, + 0x34, 0x73, 0x7d, 0x4c, 0xe9, 0x97, 0xa0, 0xb0, 0x5c, 0xbf, 0x81, 0x8f, 0x74, 0xd2, 0x9e, 0xce, + 0xdd, 0xb7, 0xdd, 0x26, 0xde, 0x9e, 0x84, 0x63, 0x8b, 0x7a, 0x50, 0x2e, 0xd7, 0x6f, 0x10, 0x1b, + 0xe6, 0x30, 0xfb, 0x78, 0xf8, 0xa5, 0xab, 0x57, 0x95, 0xa9, 0x2a, 0xe2, 0xa7, 0x5d, 0x11, 0x9f, + 0x56, 0xc1, 0xdc, 0xe5, 0xa1, 0xf5, 0xe8, 0xea, 0xd5, 0xcc, 0x09, 0x89, 0x3e, 0x2c, 0x8b, 0x16, + 0x3b, 0xb0, 0x36, 0xed, 0x47, 0xb1, 0x3f, 0x52, 0x20, 0x7c, 0xcf, 0xcf, 0xc9, 0xa5, 0x15, 0xfb, + 0x32, 0x69, 0x07, 0x96, 0x8e, 0xc4, 0x2e, 0xbf, 0xf1, 0x02, 0x0b, 0x84, 0xd7, 0xde, 0xa2, 0xd4, + 0x5c, 0xca, 0x00, 0x05, 0xea, 0x0d, 0x4e, 0x01, 0x27, 0xdb, 0xd1, 0x15, 0x9e, 0x5f, 0x81, 0xd1, + 0xd0, 0x7d, 0x62, 0xf9, 0x8a, 0x7a, 0x85, 0xe7, 0xfa, 0x42, 0xad, 0x5b, 0x33, 0x91, 0xde, 0x87, + 0x3b, 0x68, 0x99, 0x3a, 0x95, 0xb4, 0x66, 0xa0, 0xf4, 0xf8, 0x9a, 0x01, 0x0a, 0x23, 0x1b, 0x5e, + 0xf3, 0x40, 0x44, 0x3a, 0xfe, 0x80, 0x71, 0xe1, 0xb6, 0xd7, 0x3c, 0x78, 0x72, 0xae, 0x03, 0x48, + 0x9e, 0xdc, 0xe1, 0xd1, 0x77, 0xfc, 0x96, 0x18, 0x13, 0x61, 0x8e, 0x3e, 0x1f, 0x5d, 0x8d, 0x95, + 0xba, 0x38, 0x26, 0x8f, 0xdf, 0x92, 0x43, 0x6b, 0xea, 0xe8, 0x84, 0x42, 0xb9, 0x46, 0x83, 0x83, + 0xd0, 0xeb, 0xae, 0xb4, 0x9d, 0x2e, 0x06, 0xb4, 0x12, 0xa9, 0x72, 0x86, 0xe6, 0xc9, 0x2d, 0x8e, + 0x6f, 0x35, 0x25, 0x01, 0x33, 0x45, 0x92, 0x7c, 0x05, 0xa6, 0xd9, 0xe2, 0x5e, 0x7d, 0x14, 0x52, + 0x97, 0xcf, 0xfc, 0x2c, 0x4a, 0x74, 0xf3, 0x4a, 0xa2, 0xc9, 0xa8, 0x92, 0xaf, 0x29, 0xdc, 0xec, + 0x34, 0x42, 0xd0, 0xa2, 0x44, 0x6b, 0xa4, 0x48, 0x0b, 0x16, 0x36, 0xed, 0x47, 0xf1, 0x45, 0x59, + 0x5d, 0xa4, 0x04, 0x17, 0xd8, 0xc5, 0xe3, 0xa3, 0xca, 0x4b, 0x6c, 0x81, 0xc5, 0xd9, 0x9b, 0xfa, + 0xac, 0xd7, 0xbe, 0x94, 0xc8, 0x37, 0xe1, 0x8c, 0xe8, 0x56, 0x0d, 0x13, 0x62, 0x7b, 0xfe, 0x61, + 0x63, 0xdf, 0x46, 0x57, 0xc4, 0xb9, 0x3e, 0x03, 0x76, 0x25, 0x9b, 0x25, 0xca, 0x01, 0x6b, 0x49, + 0x3a, 0x56, 0xc0, 0x09, 0x99, 0xfd, 0x5a, 0x20, 0x1f, 0xc1, 0x34, 0x7f, 0x99, 0x94, 0xe9, 0xbc, + 0x85, 0x4e, 0x7d, 0x68, 0xff, 0x1a, 0xfe, 0xdc, 0x19, 0xe7, 0x08, 0xd7, 0x86, 0x53, 0xa3, 0x4c, + 0xde, 0x46, 0x13, 0x56, 0x1e, 0xc7, 0x7d, 0xbd, 0x8e, 0x1a, 0x76, 0x71, 0x02, 0x75, 0x1d, 0xd7, + 0x92, 0x6a, 0x96, 0x6e, 0xc4, 0x2e, 0x54, 0x68, 0x72, 0x1f, 0x26, 0x1b, 0x8d, 0xb5, 0x1b, 0x0e, + 0x93, 0x4b, 0xba, 0x52, 0x61, 0x9e, 0xfe, 0xca, 0x17, 0x33, 0xbf, 0x72, 0x2a, 0x08, 0xf6, 0x2d, + 0xcc, 0xd9, 0xdc, 0xf4, 0xba, 0x87, 0xa6, 0x4a, 0x29, 0xc3, 0xe7, 0xe4, 0xcc, 0x13, 0xf6, 0x39, + 0x59, 0x87, 0x19, 0xc5, 0x8e, 0x1a, 0xcd, 0x72, 0x16, 0xe2, 0xe0, 0x9f, 0xaa, 0x8f, 0x49, 0xd2, + 0xcb, 0x3a, 0x89, 0x27, 0x9d, 0x4d, 0xce, 0x3e, 0xae, 0xb3, 0x89, 0x03, 0xb3, 0x7c, 0x32, 0xc4, + 0x3a, 0xc0, 0x99, 0x5e, 0xec, 0x33, 0x86, 0x97, 0x32, 0xc7, 0x70, 0x4e, 0xcc, 0xb4, 0x5c, 0x64, + 0xf8, 0x12, 0x9f, 0xa6, 0x4a, 0x76, 0x81, 0x88, 0x42, 0x3b, 0xb4, 0x77, 0xec, 0x80, 0x62, 0x5b, + 0xcf, 0xf6, 0x69, 0xeb, 0xa5, 0xcc, 0xb6, 0xa6, 0x65, 0x5b, 0x3b, 0xbc, 0x99, 0x0c, 0x8a, 0xc4, + 0x95, 0xed, 0xc8, 0xf5, 0x85, 0x03, 0xfb, 0x9c, 0xa6, 0x18, 0x4f, 0x03, 0xf0, 0x38, 0x9a, 0xc9, + 0x45, 0x9b, 0x1c, 0xf7, 0x0c, 0xca, 0xe4, 0x11, 0x9c, 0x4e, 0x7f, 0x05, 0xb6, 0x79, 0x0e, 0xdb, + 0x3c, 0xa7, 0xb5, 0x99, 0x04, 0xe2, 0xeb, 0x46, 0xef, 0x56, 0xb2, 0xd5, 0x3e, 0xf4, 0xc9, 0x0f, + 0xe7, 0xe0, 0xcc, 0xe6, 0x8d, 0xea, 0x3d, 0xea, 0x73, 0xb1, 0xc4, 0xf1, 0xdc, 0xc8, 0x3b, 0xfd, + 0x79, 0xf1, 0x78, 0x92, 0x7c, 0x38, 0x92, 0x12, 0x07, 0xb2, 0x0a, 0x26, 0xba, 0xbf, 0xd8, 0xd9, + 0xb5, 0xad, 0x07, 0x0a, 0x89, 0x0c, 0x17, 0xf6, 0x6f, 0xff, 0x6e, 0x25, 0x67, 0xf6, 0x6b, 0x8a, + 0xb4, 0x61, 0x51, 0x1f, 0x16, 0xe9, 0x0e, 0xb4, 0x4f, 0xdb, 0xed, 0x85, 0x0a, 0xae, 0xe8, 0xd7, + 0x8f, 0x8f, 0x2a, 0x17, 0x53, 0xa3, 0x1b, 0xb9, 0x18, 0x31, 0x48, 0xa5, 0xc3, 0x03, 0xe8, 0x91, + 0x4e, 0x86, 0xd0, 0xbd, 0x70, 0x5e, 0x0b, 0x63, 0x95, 0xaa, 0x8f, 0xc2, 0xac, 0x9d, 0x63, 0xfb, + 0xbd, 0xaf, 0x80, 0x68, 0xa6, 0x29, 0xdf, 0x1a, 0x29, 0x4e, 0x95, 0xa7, 0x33, 0xfc, 0x64, 0x8c, + 0xef, 0xe4, 0x13, 0x07, 0x23, 0x59, 0x87, 0x71, 0xb1, 0xde, 0xfb, 0x5e, 0x32, 0xce, 0x65, 0xae, + 0xea, 0x71, 0xb1, 0x75, 0x4c, 0x89, 0x4f, 0x1e, 0x32, 0x52, 0xd8, 0x69, 0x71, 0xe3, 0xfd, 0x90, + 0x9f, 0x7b, 0x58, 0xa4, 0x9d, 0xf0, 0xb5, 0xc7, 0xf7, 0x29, 0xd5, 0x5d, 0x96, 0xf1, 0xa8, 0x97, + 0xad, 0x91, 0x03, 0x9e, 0xf7, 0xb7, 0x10, 0xb9, 0x25, 0xea, 0x49, 0x7e, 0x9f, 0x58, 0x83, 0xac, + 0x15, 0xe3, 0xd7, 0x72, 0x30, 0xa5, 0x9d, 0xac, 0xe4, 0xba, 0xe2, 0x75, 0x1b, 0x07, 0xa2, 0xd0, + 0x60, 0x90, 0xd9, 0x26, 0xfd, 0x71, 0xaf, 0x2b, 0x01, 0x1c, 0xfb, 0xe0, 0xe1, 0x66, 0x4b, 0x3a, + 0x61, 0x0f, 0xd6, 0x0f, 0x57, 0x60, 0x94, 0x47, 0xf0, 0x19, 0x89, 0x8d, 0x2e, 0x51, 0xbf, 0x62, + 0xf2, 0x72, 0xe3, 0xf7, 0x2a, 0x30, 0xad, 0xdf, 0x88, 0xc9, 0xeb, 0x30, 0x86, 0x0a, 0x7d, 0xa9, + 0x5e, 0x41, 0xb5, 0x10, 0xea, 0xfc, 0x35, 0xbf, 0x24, 0x0e, 0x43, 0x5e, 0x06, 0x88, 0x0c, 0xf8, + 0xe5, 0x73, 0xd6, 0xe8, 0xf1, 0x51, 0x25, 0xf7, 0x86, 0xa9, 0x54, 0x90, 0xaf, 0x01, 0xdc, 0xf1, + 0x5a, 0x54, 0xa4, 0xb1, 0x2c, 0x0c, 0x32, 0x44, 0x79, 0x25, 0x95, 0xc6, 0xf2, 0x94, 0xeb, 0xb5, + 0x68, 0x3a, 0x67, 0xa5, 0x42, 0x91, 0x7c, 0x01, 0x46, 0xcd, 0x5e, 0x9b, 0xca, 0x67, 0x8f, 0x49, + 0x79, 0xc2, 0xf5, 0xda, 0x34, 0xd6, 0x13, 0xf8, 0xbd, 0xa4, 0x8d, 0x25, 0x2b, 0x20, 0xef, 0xf3, + 0xf4, 0x96, 0x22, 0xe0, 0xfa, 0x68, 0xfc, 0xc0, 0xa7, 0x48, 0x3e, 0xa9, 0x90, 0xeb, 0x0a, 0x0a, + 0xb9, 0x0b, 0xe3, 0xea, 0xcb, 0x94, 0x12, 0xbe, 0x41, 0x7d, 0xbd, 0x54, 0x94, 0x0e, 0x22, 0xf2, + 0x6c, 0xf2, 0xd1, 0x4a, 0x52, 0x21, 0xef, 0xc0, 0x04, 0x23, 0xcf, 0x38, 0x47, 0x20, 0x6e, 0x35, + 0xf8, 0x8c, 0xa7, 0x7c, 0x10, 0xe3, 0x3e, 0x5a, 0x58, 0xf4, 0x08, 0x81, 0x7c, 0x05, 0x26, 0xaa, + 0xdd, 0xae, 0x18, 0xea, 0x81, 0x06, 0x4a, 0x17, 0x52, 0x43, 0x3d, 0x6f, 0x77, 0xbb, 0xe9, 0x91, + 0x8e, 0xe9, 0x91, 0xbd, 0x28, 0x7a, 0xe0, 0x30, 0x29, 0x49, 0x5f, 0x4d, 0x35, 0xb0, 0x20, 0x03, + 0xe2, 0xa5, 0x1a, 0xd1, 0xe9, 0x92, 0x2e, 0x94, 0x63, 0xa1, 0x52, 0xb4, 0x05, 0x83, 0xda, 0x7a, + 0x23, 0xd5, 0x96, 0x3a, 0x81, 0xa9, 0xe6, 0x52, 0xd4, 0x49, 0x0b, 0xa6, 0xe5, 0x01, 0x25, 0xda, + 0x9b, 0x1c, 0xd4, 0xde, 0xcb, 0xa9, 0xf6, 0xe6, 0x5a, 0x3b, 0xe9, 0x76, 0x12, 0x34, 0xc9, 0x3b, + 0x30, 0x25, 0x4b, 0x70, 0x7f, 0xa0, 0x61, 0x90, 0x50, 0x08, 0xb6, 0x76, 0xd0, 0x65, 0x48, 0x1b, + 0x15, 0x0d, 0x58, 0xc5, 0xe6, 0xab, 0x63, 0x4a, 0xc3, 0x4e, 0xae, 0x0a, 0x1d, 0x98, 0x7c, 0x19, + 0x26, 0xd7, 0x3b, 0xac, 0x23, 0x9e, 0x6b, 0x87, 0x54, 0x38, 0xf6, 0x4a, 0x63, 0x2b, 0xa5, 0x46, + 0x59, 0xaa, 0x68, 0x66, 0xe2, 0xc4, 0x55, 0xea, 0x35, 0x53, 0xc1, 0x60, 0x83, 0xc7, 0x9f, 0x22, + 0xc5, 0x1a, 0x96, 0x4e, 0xbf, 0xe7, 0x32, 0x0c, 0x9e, 0x14, 0xf2, 0x22, 0xb8, 0x36, 0x2b, 0x95, + 0x4f, 0x81, 0x89, 0xc4, 0x06, 0x2a, 0x4d, 0xf2, 0x2e, 0x4c, 0x8a, 0x6c, 0xcd, 0x55, 0xf3, 0x4e, + 0xb0, 0x50, 0x8e, 0xed, 0xb5, 0x65, 0x62, 0x67, 0xcb, 0xf6, 0x13, 0x96, 0xbd, 0x31, 0x3c, 0xf9, + 0x12, 0xcc, 0xdf, 0x77, 0xdc, 0x96, 0xf7, 0x30, 0x10, 0xc7, 0x94, 0x60, 0x74, 0xb3, 0xb1, 0x5f, + 0xe1, 0x43, 0x5e, 0x1f, 0xc9, 0x82, 0x29, 0xc6, 0x97, 0x49, 0x81, 0xfc, 0x50, 0x8a, 0x32, 0x5f, + 0x41, 0x64, 0xd0, 0x0a, 0x5a, 0x4a, 0xad, 0xa0, 0x74, 0xf3, 0xc9, 0xe5, 0x94, 0xd9, 0x0c, 0xf1, + 0x80, 0xe8, 0xe7, 0xfb, 0x2d, 0xcf, 0x71, 0x17, 0xe6, 0x90, 0x17, 0x3e, 0x9b, 0x0c, 0x0f, 0x82, + 0x70, 0x75, 0xaf, 0xed, 0x34, 0x0f, 0x97, 0x8d, 0xe3, 0xa3, 0xca, 0xf3, 0x49, 0x99, 0xff, 0x23, + 0x4f, 0x7b, 0x2e, 0xc9, 0x20, 0x4d, 0xbe, 0x0c, 0x25, 0xf6, 0x7f, 0xa4, 0x94, 0x98, 0xd7, 0x4c, + 0x64, 0x15, 0x48, 0xd1, 0x0e, 0xce, 0x11, 0xa6, 0x93, 0xce, 0xd0, 0x57, 0x68, 0xa4, 0xc8, 0x5b, + 0x00, 0x4c, 0x6c, 0x12, 0xec, 0xf8, 0x54, 0x9c, 0x47, 0x02, 0xa5, 0xae, 0x34, 0x23, 0x8e, 0x81, + 0xc9, 0x3b, 0x30, 0xc9, 0x7e, 0x35, 0x7a, 0x2d, 0x8f, 0xed, 0x8d, 0xd3, 0x88, 0xcb, 0x7d, 0xac, + 0x19, 0x6e, 0xc0, 0xcb, 0x35, 0x1f, 0xeb, 0x18, 0x9c, 0xac, 0xc1, 0x0c, 0xe6, 0xfb, 0x10, 0x91, + 0xe6, 0x1d, 0x1a, 0x2c, 0x9c, 0x51, 0x4c, 0x28, 0x30, 0xa5, 0xaa, 0x13, 0xd5, 0xa9, 0x77, 0x99, + 0x04, 0x1a, 0x09, 0x60, 0x2e, 0xfd, 0x06, 0x1d, 0x2c, 0x2c, 0xe0, 0x20, 0x49, 0x09, 0x3e, 0x0d, + 0xc1, 0xf9, 0x31, 0x9b, 0x11, 0x85, 0x71, 0xc9, 0x47, 0x25, 0xb5, 0xc1, 0x2c, 0xea, 0xc4, 0x04, + 0x72, 0x73, 0xa5, 0x9e, 0x4c, 0x88, 0x71, 0x16, 0x7b, 0x80, 0xd3, 0xbc, 0xd7, 0xec, 0x5a, 0x03, + 0x92, 0x62, 0x64, 0x60, 0x93, 0x1f, 0x84, 0x53, 0x92, 0x83, 0x88, 0x2a, 0xb1, 0xae, 0x17, 0x1f, + 0x93, 0x13, 0xb7, 0x76, 0xa2, 0xa6, 0x53, 0x4b, 0x3a, 0xbb, 0x09, 0x62, 0xc3, 0x24, 0x4e, 0xab, + 0x68, 0xf1, 0xd9, 0x41, 0x2d, 0x5e, 0x4c, 0xb5, 0x78, 0x1a, 0x17, 0x4a, 0xba, 0x31, 0x95, 0x26, + 0x59, 0x86, 0x29, 0xb1, 0x8f, 0xc4, 0x6a, 0x7b, 0x0e, 0x47, 0x0b, 0x95, 0x58, 0x72, 0x07, 0xa6, + 0x16, 0x9c, 0x8e, 0xa2, 0x72, 0x64, 0xfe, 0x98, 0x74, 0x4e, 0xe3, 0xc8, 0xc9, 0x37, 0x24, 0x1d, + 0x98, 0x71, 0xa4, 0x58, 0x8a, 0x59, 0x7d, 0xd4, 0xf5, 0x85, 0x8a, 0xea, 0xf9, 0x38, 0x3b, 0xa5, + 0x22, 0xfc, 0x58, 0x34, 0x82, 0x50, 0x59, 0x42, 0x16, 0x05, 0xb2, 0x0d, 0x73, 0xd1, 0xa9, 0xad, + 0x10, 0xae, 0xc4, 0x29, 0x17, 0xe2, 0xa3, 0x3e, 0x9b, 0x6e, 0x16, 0x3e, 0xb1, 0xe1, 0x8c, 0x76, + 0x4e, 0x2b, 0xa4, 0xcf, 0x23, 0xe9, 0x57, 0xd8, 0x8d, 0x4c, 0x3f, 0xe4, 0xb3, 0xc9, 0xf7, 0xa3, + 0x43, 0x3e, 0x82, 0xc5, 0xe4, 0xd9, 0xac, 0xb4, 0xf2, 0x02, 0xb6, 0xf2, 0xea, 0xf1, 0x51, 0xe5, + 0x42, 0xea, 0x78, 0xcf, 0x6e, 0x68, 0x00, 0x35, 0xf2, 0x35, 0x58, 0xd0, 0xcf, 0x67, 0xa5, 0x25, + 0x03, 0x5b, 0xc2, 0xad, 0x13, 0x1d, 0xec, 0xd9, 0x2d, 0xf4, 0xa5, 0x41, 0x42, 0xa8, 0x64, 0xae, + 0x6e, 0xa5, 0x99, 0x17, 0xe3, 0x0e, 0xa5, 0x76, 0x49, 0x76, 0x73, 0x27, 0x91, 0x24, 0x0f, 0xe1, + 0xf9, 0xac, 0x63, 0x42, 0x69, 0xf4, 0xa5, 0x48, 0x09, 0xfc, 0x5a, 0xf6, 0x91, 0x93, 0xdd, 0xf2, + 0x09, 0x64, 0xc9, 0x57, 0xe0, 0x94, 0xb2, 0xbf, 0x94, 0xf6, 0x5e, 0xc6, 0xf6, 0x30, 0x2a, 0x80, + 0xba, 0x31, 0xb3, 0x5b, 0xc9, 0xa6, 0x41, 0x3a, 0x30, 0x27, 0x3b, 0x8e, 0xda, 0x76, 0x71, 0xf4, + 0x5c, 0xd0, 0xb8, 0x6a, 0x1a, 0x62, 0xf9, 0xbc, 0xe0, 0xaa, 0x0b, 0xad, 0x1d, 0xab, 0x1b, 0x23, + 0xaa, 0x2b, 0x3d, 0x83, 0x2e, 0x59, 0x83, 0xb1, 0x46, 0x7d, 0xfd, 0xc6, 0x8d, 0xd5, 0x85, 0x57, + 0xb0, 0x05, 0xe9, 0xf7, 0xc7, 0x0b, 0xb5, 0x4b, 0x93, 0xb0, 0x71, 0xec, 0x3a, 0xbb, 0xbb, 0xda, + 0x83, 0x15, 0x07, 0x25, 0x3f, 0x84, 0xd6, 0x85, 0x8c, 0xa3, 0x56, 0x83, 0xc0, 0xd9, 0x73, 0x79, + 0x32, 0x8b, 0x57, 0xb5, 0xf7, 0x7e, 0x99, 0xde, 0x64, 0x05, 0x13, 0xc7, 0xa6, 0xc0, 0xb9, 0xb4, + 0xc9, 0xee, 0xff, 0x82, 0x73, 0x5b, 0x76, 0x4c, 0x4a, 0x65, 0xe2, 0xe9, 0x86, 0xd8, 0xb8, 0xed, + 0x39, 0xa1, 0xb5, 0xdf, 0xd3, 0xba, 0xbf, 0xf0, 0x9a, 0x16, 0x4c, 0x9c, 0xa7, 0xd3, 0x55, 0x46, + 0xed, 0x25, 0xd1, 0xe0, 0x73, 0xfc, 0xb6, 0xdc, 0x67, 0xe4, 0x66, 0xf7, 0x12, 0x78, 0x01, 0xf9, + 0x8b, 0x39, 0x38, 0x7d, 0xdf, 0xf3, 0x0f, 0xda, 0x9e, 0xdd, 0x92, 0xbd, 0x12, 0x3c, 0xfc, 0xf5, + 0x41, 0x3c, 0xfc, 0xb3, 0x29, 0x1e, 0x6e, 0x3c, 0x14, 0x64, 0xac, 0x28, 0x3b, 0x4c, 0x8a, 0x9f, + 0xf7, 0x69, 0x8a, 0xfc, 0x10, 0x9c, 0xcf, 0xae, 0x51, 0x16, 0xe5, 0x1b, 0xb8, 0x28, 0xaf, 0x1e, + 0x1f, 0x55, 0xde, 0xe8, 0xd7, 0x52, 0xf6, 0x02, 0x3d, 0x91, 0x34, 0xf9, 0x02, 0x14, 0x36, 0x57, + 0xea, 0x0b, 0x97, 0xb5, 0xa7, 0xe7, 0xcd, 0x95, 0xba, 0x32, 0x50, 0x5c, 0xa3, 0xd9, 0x69, 0x6a, + 0x1a, 0xcd, 0xcd, 0x95, 0xfa, 0xad, 0x91, 0xe2, 0xc5, 0xf2, 0xa5, 0x5b, 0x23, 0xc5, 0x4b, 0xe5, + 0x57, 0xcd, 0xe7, 0x1a, 0xd5, 0xcd, 0x8d, 0xf5, 0x96, 0x3c, 0x98, 0x65, 0xf2, 0x1b, 0xde, 0x9e, + 0x79, 0x61, 0x50, 0x6d, 0xfc, 0x35, 0xc6, 0x5f, 0xcb, 0x41, 0xe5, 0x84, 0x05, 0xc6, 0xce, 0xc2, + 0xf8, 0xe3, 0x1a, 0x51, 0xc2, 0x05, 0xee, 0x54, 0x18, 0x55, 0x58, 0xba, 0xc9, 0x89, 0x8e, 0x82, + 0x0e, 0xa7, 0x22, 0x6f, 0x9b, 0xe2, 0x77, 0x9c, 0xce, 0xd7, 0x26, 0xa1, 0x8c, 0x0d, 0x28, 0x27, + 0x17, 0x1e, 0xf9, 0x3c, 0x4c, 0xa9, 0x59, 0xa3, 0xa4, 0x1a, 0x82, 0x47, 0xdb, 0xf1, 0xf7, 0xb4, + 0xc3, 0x54, 0x03, 0x34, 0x2e, 0xc0, 0xb4, 0x3e, 0xc4, 0x64, 0x1e, 0x46, 0x43, 0xcf, 0x6b, 0x0b, + 0x1a, 0x26, 0xff, 0x61, 0xfc, 0x5c, 0x0e, 0xe6, 0x32, 0x76, 0x31, 0xb9, 0x00, 0x23, 0x98, 0xfe, + 0x55, 0xb1, 0x4c, 0x4a, 0xa4, 0x7d, 0xc5, 0x7a, 0xf2, 0x19, 0x18, 0xaf, 0xdd, 0x69, 0x34, 0xaa, + 0x77, 0xa4, 0xc2, 0x83, 0x1f, 0xf6, 0x6e, 0x60, 0x05, 0xb6, 0x6e, 0xd0, 0x20, 0xc0, 0xc8, 0x1b, + 0x30, 0xb6, 0x5e, 0x47, 0x04, 0x25, 0xf5, 0x8c, 0xd3, 0x4d, 0xc2, 0x0b, 0x20, 0xe3, 0xc7, 0x72, + 0x40, 0xd2, 0x2c, 0x89, 0x5c, 0x85, 0x49, 0x95, 0xf1, 0xf1, 0x71, 0xc1, 0x57, 0x5e, 0x65, 0x73, + 0x9a, 0x2a, 0x0c, 0xa9, 0xc1, 0xe8, 0xa6, 0x1d, 0x36, 0xf7, 0x23, 0x4b, 0x8a, 0xcc, 0xad, 0x77, + 0x26, 0xb5, 0xf5, 0x46, 0x3b, 0x0c, 0xcb, 0xe4, 0xc8, 0xc6, 0x1f, 0xe6, 0x80, 0x64, 0x1b, 0x55, + 0x0e, 0x65, 0xc9, 0xf5, 0xa6, 0x12, 0xdf, 0x42, 0xb5, 0xaa, 0x8c, 0xb2, 0xf3, 0xaa, 0xaa, 0x86, + 0x38, 0x12, 0xc6, 0x05, 0x4d, 0xb5, 0xd5, 0xdf, 0x29, 0xfa, 0x12, 0x8c, 0xde, 0xa3, 0xfe, 0x8e, + 0xb4, 0x37, 0x47, 0x1b, 0xd5, 0x07, 0xac, 0x40, 0x55, 0xf5, 0x20, 0x84, 0x66, 0xde, 0x39, 0x3a, + 0xac, 0x79, 0xe7, 0xef, 0xe5, 0x60, 0x3e, 0xeb, 0xf2, 0x74, 0x82, 0xc3, 0xb3, 0x91, 0xf0, 0xd5, + 0x46, 0xd3, 0x2f, 0x6e, 0xf5, 0x1a, 0x79, 0x68, 0x57, 0x60, 0x94, 0x8d, 0x90, 0x5c, 0x16, 0xa8, + 0x9f, 0x63, 0x43, 0x18, 0x98, 0xbc, 0x9c, 0x01, 0xc4, 0x19, 0x43, 0x46, 0x39, 0x00, 0x4f, 0x14, + 0xc2, 0xcb, 0x19, 0xc0, 0xa6, 0xd7, 0xa2, 0x52, 0x6f, 0x85, 0x00, 0x1d, 0x56, 0x60, 0xf2, 0x72, + 0x72, 0x01, 0xc6, 0xef, 0xba, 0x1b, 0xd4, 0x7e, 0x20, 0x33, 0x93, 0xa1, 0xa9, 0x9a, 0xe7, 0x5a, + 0x6d, 0x56, 0x66, 0xca, 0x4a, 0xe3, 0xa7, 0x73, 0x30, 0x9b, 0xba, 0xb7, 0x9d, 0xec, 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, 0x44, 0x3f, 0xea, 0xaf, 0xc2, 0xd4, 0x4a, 0xdb, 0x76, + 0x3a, 0xc1, 0x96, 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, 0x13, 0xe2, + 0xc9, 0xac, 0xfb, 0xd6, 0x8d, 0x3c, 0x51, 0xdf, 0xba, 0x6c, 0x0b, 0xf6, 0xd1, 0x4f, 0xe2, 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, 0x9b, 0x30, 0x9f, 0x75, 0x0f, 0x5f, 0x28, 0x6a, 0x66, 0xc0, 0x7d, + 0x6d, 0xce, 0x87, 0xbf, 0xcd, 0x1f, 0x64, 0xde, 0xe6, 0xa5, 0x7f, 0xfe, 0x44, 0x7f, 0xe7, 0xa6, + 0x78, 0x2f, 0x70, 0xd8, 0xc1, 0x5e, 0xfc, 0xc6, 0x57, 0x13, 0x01, 0x16, 0x92, 0xe8, 0xe4, 0x6d, + 0x2d, 0x0e, 0xd6, 0x2b, 0xe9, 0x38, 0x58, 0xd9, 0x31, 0x15, 0x78, 0x92, 0xa9, 0x9f, 0xce, 0xeb, + 0x5e, 0xe1, 0x7f, 0x12, 0x37, 0xea, 0x25, 0x18, 0xbd, 0xbf, 0x4f, 0x7d, 0x79, 0xa6, 0xe0, 0x87, + 0x3c, 0x64, 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, 0x85, 0xe7, 0x07, 0x12, 0x62, 0x87, 0x3d, 0x74, 0xa3, 0x5f, 0x09, 0x93, 0xf0, 0x81, 0xa8, + 0xa6, 0x82, 0x67, 0x7c, 0x13, 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, 0xa4, + 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, 0xa2, 0x20, 0xf2, 0x18, 0x0b, 0x11, 0x85, 0x6a, + 0x3e, 0xa5, 0x23, 0xb1, 0xf0, 0x68, 0xa7, 0xcc, 0x70, 0x24, 0x94, 0xf1, 0xed, 0x1c, 0x9c, 0xca, + 0x54, 0xe6, 0xb3, 0x56, 0xf9, 0xab, 0x81, 0xb2, 0x0f, 0x93, 0x4f, 0x06, 0x1c, 0xe2, 0x71, 0x62, + 0x94, 0x0c, 0xdf, 0x17, 0xe3, 0x05, 0x98, 0x88, 0x9e, 0x92, 0x99, 0x70, 0xce, 0xa7, 0x8e, 0x07, + 0x61, 0x14, 0x2f, 0x92, 0x0d, 0x00, 0xf6, 0x05, 0x4f, 0xd4, 0xe6, 0xdb, 0xf8, 0xe7, 0x79, 0x18, + 0x63, 0x54, 0x9f, 0xda, 0x70, 0xd1, 0xd9, 0x86, 0xda, 0xac, 0x4b, 0xfd, 0x83, 0x44, 0x93, 0x55, + 0x18, 0xe3, 0x09, 0xf6, 0xc4, 0xb3, 0xe4, 0x9c, 0x8a, 0x26, 0x33, 0xef, 0x45, 0xc1, 0x35, 0x02, + 0x2c, 0xd1, 0xd4, 0x17, 0x58, 0xa2, 0xd8, 0x7b, 0xff, 0x56, 0x0e, 0x4a, 0x2a, 0x32, 0xf9, 0x32, + 0x4c, 0xcb, 0x10, 0xb8, 0x3c, 0xe0, 0x8c, 0x78, 0xf7, 0x96, 0x36, 0x6a, 0x32, 0x04, 0xae, 0x1a, + 0xa0, 0x46, 0x83, 0x57, 0x59, 0x75, 0x57, 0x05, 0x26, 0x2d, 0x20, 0x9d, 0x5d, 0xdb, 0x7a, 0x48, + 0xed, 0x03, 0x1a, 0x84, 0x16, 0xb7, 0x25, 0x12, 0xcf, 0xe3, 0x92, 0xfc, 0xe6, 0x8d, 0x2a, 0x37, + 0x23, 0x62, 0x33, 0x21, 0x62, 0x19, 0xa7, 0x70, 0xd4, 0x37, 0xbf, 0xce, 0xae, 0x7d, 0x9f, 0x57, + 0x72, 0x3c, 0xe3, 0xf7, 0xc7, 0xf8, 0x72, 0x13, 0x31, 0xb3, 0x77, 0x60, 0xfa, 0xee, 0x7a, 0x6d, + 0x45, 0x79, 0x01, 0xd0, 0x53, 0xae, 0xad, 0x3e, 0x0a, 0xa9, 0xef, 0xda, 0x6d, 0x79, 0x99, 0x8e, + 0x8f, 0x20, 0xcf, 0x69, 0x35, 0xb3, 0x5f, 0x07, 0x12, 0x14, 0x59, 0x1b, 0xfc, 0xda, 0x1e, 0xb5, + 0x91, 0x1f, 0xb2, 0x8d, 0xc0, 0xee, 0xb4, 0xfb, 0xb4, 0xa1, 0x53, 0x24, 0xfb, 0x78, 0xaf, 0xde, + 0xef, 0xed, 0x28, 0xad, 0x14, 0x06, 0xb7, 0xf2, 0xa2, 0x68, 0xe5, 0x59, 0xa1, 0xef, 0xc9, 0x6c, + 0x27, 0x45, 0x35, 0xe6, 0x13, 0x23, 0x27, 0xf2, 0x89, 0xff, 0x30, 0x07, 0x63, 0x5c, 0x7c, 0x15, + 0xcb, 0xb8, 0x8f, 0x80, 0x7c, 0xff, 0xc9, 0x08, 0xc8, 0x65, 0x3c, 0x27, 0xb4, 0x05, 0xcd, 0xeb, + 0x48, 0x2d, 0xb1, 0x2f, 0xa4, 0x9b, 0x02, 0xbe, 0xe5, 0xf1, 0x9a, 0x93, 0xb7, 0x05, 0x59, 0x8f, + 0xc3, 0x9d, 0x8c, 0x9f, 0xe8, 0xe3, 0x2e, 0x43, 0xc4, 0x8c, 0x8b, 0x70, 0x27, 0x7a, 0x90, 0x93, + 0x0d, 0x98, 0x10, 0x41, 0x54, 0x96, 0x0f, 0xc5, 0x8b, 0x7d, 0x59, 0xb3, 0xb9, 0x6a, 0x2d, 0x1f, + 0xc6, 0xa2, 0xb9, 0x08, 0xc3, 0x62, 0xed, 0xa8, 0xfe, 0x0a, 0x31, 0x01, 0x72, 0x97, 0x67, 0x53, + 0xe7, 0x31, 0xc5, 0xf5, 0x34, 0x22, 0x51, 0xb9, 0x88, 0x29, 0x27, 0x23, 0x31, 0x64, 0x84, 0x10, + 0x8f, 0x69, 0x90, 0x0d, 0x28, 0xa3, 0x9d, 0x1e, 0x6d, 0xf1, 0x5d, 0xb3, 0x5e, 0xe3, 0x81, 0x3a, + 0x84, 0xad, 0x75, 0xc8, 0xeb, 0xc4, 0x76, 0x4b, 0x78, 0x93, 0xa6, 0x30, 0x8d, 0x9f, 0xca, 0x43, + 0x39, 0xb9, 0xfa, 0xc8, 0x3b, 0x30, 0x19, 0xc5, 0x74, 0x8f, 0xfc, 0xd9, 0xf1, 0xe5, 0x2e, 0x0e, + 0x02, 0xaf, 0xe7, 0xe0, 0x56, 0xc0, 0xc9, 0x12, 0x14, 0xd9, 0x26, 0x76, 0xe3, 0x90, 0x9c, 0xc8, + 0xb6, 0x7b, 0xa2, 0x4c, 0xbd, 0xd5, 0x4b, 0x38, 0xd2, 0x80, 0x39, 0xb6, 0x69, 0x1a, 0x8e, 0xbb, + 0xd7, 0xa6, 0x1b, 0xde, 0x9e, 0xd7, 0x0b, 0xe3, 0x94, 0xd4, 0xfc, 0x02, 0x63, 0x77, 0xda, 0x5a, + 0xb5, 0x9e, 0x90, 0x3a, 0x03, 0x9b, 0xbc, 0xc1, 0x8f, 0x99, 0xf5, 0x9a, 0x30, 0xb8, 0xc1, 0xa3, + 0x1a, 0x0d, 0xc5, 0xb4, 0x8f, 0x17, 0x40, 0x0a, 0x67, 0xfd, 0xdd, 0x3c, 0x4c, 0x2a, 0xcb, 0x8f, + 0x5c, 0x82, 0xe2, 0x7a, 0xb0, 0xe1, 0x35, 0x0f, 0xa2, 0x18, 0xa5, 0x53, 0xc7, 0x47, 0x95, 0x09, + 0x27, 0xb0, 0xda, 0x58, 0x68, 0x46, 0xd5, 0x64, 0x19, 0xa6, 0xf8, 0x5f, 0x32, 0x39, 0x4f, 0x3e, + 0x56, 0xdc, 0x71, 0x60, 0x99, 0x96, 0x47, 0x65, 0xb6, 0x1a, 0x0a, 0xf9, 0x10, 0x80, 0x17, 0x60, + 0x80, 0x88, 0xc2, 0xf0, 0xa1, 0x2d, 0x44, 0x03, 0x19, 0xa1, 0x21, 0x14, 0x82, 0xe4, 0xeb, 0x3c, + 0x64, 0xbc, 0xdc, 0x2e, 0x23, 0xc3, 0xc7, 0xe6, 0x60, 0xf4, 0xad, 0xec, 0x10, 0x41, 0x2a, 0x49, + 0x91, 0x4f, 0x6b, 0x51, 0x26, 0x4f, 0xad, 0x86, 0x08, 0xa8, 0x40, 0x18, 0xff, 0x4b, 0x4e, 0xd9, + 0x64, 0xe4, 0x0e, 0x4c, 0x44, 0x0b, 0x48, 0xd8, 0xba, 0x45, 0x57, 0x0c, 0x59, 0x6e, 0xd2, 0xdd, + 0xe5, 0x67, 0x85, 0xd9, 0xdd, 0x5c, 0xb4, 0x0c, 0xb5, 0x3d, 0x27, 0x0b, 0xc9, 0x17, 0x61, 0x04, + 0x87, 0x2e, 0x7f, 0x62, 0xd7, 0xe4, 0x29, 0x3f, 0xc2, 0xc6, 0x0c, 0x3b, 0x82, 0x98, 0xe4, 0x33, + 0xc2, 0x0d, 0x9d, 0x0f, 0xfe, 0xb4, 0x72, 0x54, 0xb3, 0xef, 0x88, 0x8e, 0xf7, 0x38, 0x4a, 0x94, + 0xb2, 0x7a, 0xfe, 0x5a, 0x1e, 0xca, 0xc9, 0xad, 0x4d, 0xde, 0x87, 0x92, 0x3c, 0x7e, 0xd7, 0x6c, + 0x91, 0x59, 0xa6, 0x24, 0x32, 0xbb, 0xc8, 0x33, 0x78, 0xdf, 0x56, 0x6d, 0xe3, 0x4c, 0x0d, 0x81, + 0xc9, 0x42, 0x5b, 0x22, 0xd4, 0xa4, 0xb2, 0xa9, 0x42, 0x2f, 0xec, 0x26, 0x22, 0x95, 0x4b, 0x30, + 0xf2, 0x26, 0x14, 0x36, 0x6f, 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, 0x4e, + 0x8e, 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, 0x3e, 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, 0x07, 0xb4, 0x45, 0x5e, 0x81, 0x11, 0x36, 0x9b, + 0xe2, 0xc4, 0x91, 0x42, 0x25, 0x9b, 0x4c, 0x3e, 0x60, 0x6b, 0xcf, 0x98, 0x08, 0x40, 0x5e, 0x82, + 0x42, 0x6f, 0x69, 0x57, 0x9c, 0x25, 0xe5, 0x38, 0xc1, 0x46, 0x04, 0xc6, 0xaa, 0xc9, 0x35, 0x28, + 0x3e, 0xd4, 0x73, 0x33, 0x9c, 0x4a, 0x4c, 0x63, 0x04, 0x1f, 0x01, 0x92, 0x57, 0xa0, 0x10, 0x04, + 0x9e, 0xb0, 0xb4, 0x9a, 0x8b, 0xcc, 0x5f, 0xef, 0x46, 0xb3, 0xc6, 0xa8, 0x07, 0x81, 0xb7, 0x5c, + 0x84, 0x31, 0x7e, 0xc0, 0x18, 0xcf, 0x03, 0xc4, 0xdf, 0x98, 0x76, 0x28, 0x35, 0x3e, 0x84, 0x89, + 0xe8, 0xdb, 0xc8, 0x39, 0x80, 0x03, 0x7a, 0x68, 0xed, 0xdb, 0x6e, 0xab, 0xcd, 0xa5, 0xd3, 0x92, + 0x39, 0x71, 0x40, 0x0f, 0xd7, 0xb0, 0x80, 0x9c, 0x81, 0xf1, 0x2e, 0x9b, 0x7e, 0xb1, 0xc6, 0x4b, + 0xe6, 0x58, 0xb7, 0xb7, 0xc3, 0x96, 0xf2, 0x02, 0x8c, 0xa3, 0x9e, 0x55, 0xec, 0xc8, 0x29, 0x53, + 0xfe, 0x34, 0xfe, 0xa0, 0x80, 0x29, 0xcc, 0x94, 0x0e, 0x91, 0x17, 0x61, 0xaa, 0xe9, 0x53, 0x3c, + 0xcb, 0x6c, 0x26, 0xa1, 0x89, 0x76, 0x4a, 0x71, 0xe1, 0x7a, 0x8b, 0x5c, 0x80, 0x99, 0x38, 0xdb, + 0xb4, 0xd5, 0xdc, 0x11, 0x39, 0x57, 0x4a, 0xe6, 0x54, 0x57, 0xe6, 0x9c, 0x5e, 0xd9, 0xc1, 0xe8, + 0x90, 0x65, 0x35, 0xb8, 0x39, 0x1b, 0x11, 0xb1, 0xfe, 0x66, 0x94, 0x72, 0x34, 0x1a, 0x3d, 0x0d, + 0x63, 0xb6, 0xbd, 0xd7, 0x73, 0x78, 0x14, 0xb7, 0x92, 0x29, 0x7e, 0x91, 0xd7, 0x60, 0x36, 0xce, + 0x16, 0x20, 0xbb, 0x31, 0x8a, 0xdd, 0x28, 0x47, 0x15, 0x2b, 0xbc, 0x9c, 0xbc, 0x01, 0x44, 0x6d, + 0xcf, 0xdb, 0xf9, 0x88, 0x36, 0xf9, 0x9a, 0x2c, 0x99, 0xb3, 0x4a, 0xcd, 0x5d, 0xac, 0x20, 0x2f, + 0x40, 0xc9, 0xa7, 0x01, 0x4a, 0x87, 0x38, 0x6c, 0x98, 0xe1, 0xd3, 0x9c, 0x94, 0x65, 0x6c, 0xec, + 0x2e, 0x42, 0x59, 0x19, 0x0e, 0x8c, 0x1f, 0xcf, 0xd3, 0x8d, 0x98, 0xd3, 0x71, 0xb9, 0xd9, 0x5d, + 0x6f, 0x91, 0x2f, 0xc1, 0xa2, 0x02, 0xc9, 0x93, 0x8d, 0x5a, 0xb4, 0xed, 0xec, 0x39, 0x3b, 0x6d, + 0x2a, 0xd6, 0x5b, 0x7a, 0x55, 0x47, 0x57, 0x48, 0x73, 0x21, 0xc6, 0xe6, 0x69, 0x48, 0x57, 0x05, + 0x2e, 0xd9, 0x80, 0xf9, 0x04, 0x65, 0xda, 0xb2, 0x7a, 0xdd, 0xbe, 0x61, 0x13, 0x63, 0x9a, 0x44, + 0xa7, 0x49, 0x5b, 0xdb, 0x5d, 0xe3, 0x9b, 0x50, 0x52, 0xd7, 0x24, 0x1b, 0x04, 0x55, 0x2e, 0x11, + 0xab, 0x6f, 0x32, 0x2a, 0x5b, 0x67, 0xf7, 0xc2, 0xe9, 0x18, 0x04, 0x27, 0x91, 0xb3, 0x97, 0xa9, + 0xa8, 0x14, 0xa7, 0xf0, 0x05, 0x28, 0xb5, 0x9c, 0xa0, 0xdb, 0xb6, 0x0f, 0xd1, 0xf4, 0x4f, 0xcc, + 0xf4, 0xa4, 0x28, 0x43, 0xc5, 0xcf, 0x32, 0xcc, 0xa6, 0xf8, 0xa0, 0x22, 0x69, 0x70, 0xbe, 0x3e, + 0x58, 0xd2, 0x30, 0x5c, 0x28, 0xa9, 0xe7, 0xda, 0x09, 0xc9, 0x81, 0x4e, 0x63, 0x50, 0x21, 0xce, + 0xf4, 0xc7, 0x8e, 0x8f, 0x2a, 0x79, 0xa7, 0x85, 0xa1, 0x84, 0x2e, 0x42, 0x51, 0x4a, 0x6c, 0x42, + 0x50, 0xc2, 0xc7, 0x04, 0xf9, 0x66, 0x6a, 0x46, 0xb5, 0xc6, 0x2b, 0x30, 0x2e, 0x8e, 0xae, 0xc1, + 0x4f, 0x08, 0xc6, 0xb7, 0xf2, 0x30, 0x63, 0x52, 0xc6, 0x58, 0x29, 0xcf, 0x08, 0xf6, 0xd4, 0x5e, + 0xd1, 0xb3, 0xa3, 0x04, 0x6b, 0x7d, 0x1b, 0x90, 0x8b, 0xeb, 0x17, 0x72, 0x30, 0x97, 0x01, 0xfb, + 0xb1, 0x72, 0x51, 0x5f, 0x87, 0x89, 0x9a, 0x63, 0xb7, 0xab, 0xad, 0x56, 0x14, 0x61, 0x08, 0xe5, + 0x7c, 0x4c, 0x58, 0x67, 0xb3, 0x52, 0x55, 0x88, 0x89, 0x40, 0xc9, 0xab, 0x62, 0x51, 0x14, 0xa2, + 0x61, 0xc5, 0x45, 0xf1, 0xbd, 0xa3, 0x0a, 0xf0, 0x6f, 0xda, 0x8a, 0x96, 0x08, 0x46, 0xee, 0xe6, + 0x85, 0xb1, 0xc3, 0xd7, 0x53, 0x3b, 0x75, 0xd9, 0x91, 0xbb, 0x93, 0xdd, 0x1b, 0x2a, 0x1d, 0xd7, + 0x8f, 0xe7, 0xe1, 0x74, 0x36, 0xe2, 0xc7, 0x4d, 0x2b, 0x8e, 0x89, 0xd0, 0x94, 0x6c, 0x03, 0x98, + 0x56, 0x9c, 0x67, 0x4d, 0x43, 0xf8, 0x18, 0x80, 0xec, 0xf2, 0xf4, 0xfd, 0x6b, 0xd4, 0xf6, 0xc3, + 0x1d, 0x6a, 0x87, 0x43, 0x48, 0xf2, 0xd2, 0xcc, 0x63, 0x01, 0x85, 0x89, 0x7d, 0x89, 0x99, 0x95, + 0xbd, 0x3f, 0x22, 0x1b, 0x2d, 0x94, 0x91, 0x21, 0x16, 0xca, 0x37, 0x60, 0xa6, 0x41, 0x3b, 0x76, + 0x77, 0xdf, 0xf3, 0x65, 0x20, 0x87, 0xcb, 0x30, 0x15, 0x15, 0x65, 0xae, 0x16, 0xbd, 0x5a, 0x83, + 0x57, 0x06, 0x22, 0x66, 0x25, 0x7a, 0xb5, 0xf1, 0xd7, 0xf3, 0x70, 0xa6, 0xda, 0x14, 0x36, 0xab, + 0xa2, 0x42, 0x9a, 0xd6, 0x7f, 0xca, 0x6d, 0x93, 0x2b, 0x30, 0xb1, 0x69, 0x3f, 0xda, 0xa0, 0x76, + 0x40, 0x03, 0x91, 0xca, 0x82, 0x8b, 0xbd, 0xf6, 0xa3, 0xf8, 0xf1, 0xc7, 0x8c, 0x61, 0x54, 0x35, + 0xc2, 0xc8, 0x27, 0x54, 0x23, 0x18, 0x30, 0xb6, 0xe6, 0xb5, 0x5b, 0xe2, 0xac, 0x17, 0x2f, 0xce, + 0xfb, 0x58, 0x62, 0x8a, 0x1a, 0xe3, 0xf7, 0x72, 0x30, 0x1d, 0x7d, 0x31, 0x7e, 0xc2, 0xa7, 0x3e, + 0x24, 0x17, 0x60, 0x1c, 0x1b, 0x5a, 0xaf, 0xa9, 0x87, 0x46, 0x9b, 0x62, 0x6a, 0xce, 0x96, 0x29, + 0x2b, 0xd5, 0x91, 0x18, 0xfd, 0x64, 0x23, 0x61, 0xfc, 0x7d, 0x7c, 0xcc, 0x56, 0x7b, 0xc9, 0x4e, + 0x22, 0xe5, 0x43, 0x72, 0x43, 0x7e, 0x48, 0xfe, 0x89, 0x4d, 0x49, 0xa1, 0xef, 0x94, 0xfc, 0x48, + 0x1e, 0x26, 0xa3, 0x8f, 0xfd, 0x3e, 0x4b, 0x79, 0x11, 0xf5, 0x6b, 0xa8, 0xe0, 0x4b, 0x0d, 0x85, + 0x57, 0x88, 0x18, 0x47, 0x5f, 0x84, 0x31, 0xb1, 0x99, 0x72, 0x09, 0x13, 0xf3, 0xc4, 0xec, 0x2e, + 0x4f, 0x0b, 0xd2, 0x63, 0x38, 0xa1, 0x81, 0x29, 0xf0, 0x30, 0xba, 0xd5, 0x7d, 0xba, 0x23, 0x6c, + 0x1b, 0x9e, 0xda, 0x33, 0x2a, 0x3b, 0xba, 0x55, 0xdc, 0xb1, 0xa1, 0x4e, 0xa7, 0xff, 0xae, 0x08, + 0xe5, 0x24, 0xca, 0xc9, 0x49, 0x45, 0xea, 0xbd, 0x1d, 0x7e, 0x55, 0xe1, 0x49, 0x45, 0xba, 0xbd, + 0x1d, 0x93, 0x95, 0xa1, 0xbd, 0x94, 0xef, 0x3c, 0xc0, 0x5e, 0x97, 0x84, 0xbd, 0x94, 0xef, 0x3c, + 0xd0, 0xec, 0xa5, 0x7c, 0xe7, 0x01, 0x2a, 0x12, 0x36, 0x1a, 0x18, 0xf9, 0x01, 0xef, 0x29, 0x42, + 0x91, 0xd0, 0x0e, 0x92, 0x99, 0x12, 0x25, 0x18, 0x3b, 0x2a, 0x97, 0xa9, 0xed, 0x8b, 0x04, 0x18, + 0x82, 0x9d, 0xe1, 0x51, 0xb9, 0x83, 0xc5, 0x56, 0xc8, 0xca, 0x4d, 0x15, 0x88, 0xb4, 0x81, 0x28, + 0x3f, 0xe5, 0x06, 0x3e, 0xf9, 0x6e, 0x2d, 0xcd, 0x43, 0xe7, 0x55, 0xd2, 0x96, 0xba, 0x9b, 0x33, + 0xe8, 0x3e, 0x49, 0xed, 0x6f, 0x5d, 0x04, 0xc8, 0x45, 0x05, 0x52, 0xf1, 0x44, 0x62, 0x32, 0x62, + 0x0d, 0xf0, 0x00, 0xba, 0x91, 0x1a, 0x29, 0x26, 0x42, 0xde, 0x83, 0x49, 0x35, 0x9e, 0x07, 0x8f, + 0x3a, 0xf1, 0x1c, 0x8f, 0x0e, 0xda, 0x27, 0xbb, 0xb6, 0x8a, 0x40, 0x76, 0xe0, 0xcc, 0x8a, 0xe7, + 0x06, 0xbd, 0x8e, 0x8c, 0x43, 0x1a, 0xc7, 0x74, 0x07, 0x9c, 0x0a, 0x0c, 0x0e, 0xd0, 0x14, 0x20, + 0x22, 0x7c, 0x84, 0xf4, 0xdf, 0xd1, 0x2f, 0x20, 0xfd, 0x08, 0x91, 0x2d, 0x98, 0x44, 0x0d, 0xaa, + 0xb0, 0xc5, 0x9c, 0xd4, 0xd9, 0x46, 0x5c, 0x53, 0x63, 0x1b, 0x83, 0x87, 0xb3, 0xb3, 0x3b, 0x6d, + 0xe9, 0x3e, 0xa2, 0x6a, 0x82, 0x15, 0x60, 0xf2, 0x21, 0x4c, 0xf3, 0x2b, 0xda, 0x7d, 0xba, 0xc3, + 0xd7, 0x4e, 0x49, 0xd3, 0x44, 0xe8, 0x95, 0xfc, 0x31, 0x5f, 0xe8, 0xad, 0x1f, 0xd2, 0x1d, 0x3e, + 0xf7, 0x9a, 0xf3, 0x96, 0x06, 0x4f, 0xb6, 0x61, 0x6e, 0xcd, 0x0e, 0x78, 0xa1, 0x12, 0x98, 0x61, + 0x0a, 0x35, 0xb4, 0x68, 0x54, 0xbf, 0x6f, 0x07, 0x52, 0x11, 0x9e, 0x19, 0x88, 0x21, 0x0b, 0x9f, + 0x7c, 0x2b, 0x07, 0x0b, 0x9a, 0x9e, 0x5c, 0xd8, 0x99, 0x61, 0x70, 0xdb, 0x69, 0x7c, 0xf2, 0xaa, + 0x48, 0xa1, 0xb4, 0x0f, 0x18, 0x9f, 0x92, 0x84, 0x2a, 0xde, 0x8f, 0xeb, 0x55, 0x6b, 0xf5, 0x7e, + 0x34, 0xc4, 0x46, 0xc5, 0x3d, 0x3d, 0xa3, 0x6f, 0xd4, 0xc4, 0xbe, 0x96, 0x60, 0xc6, 0xf5, 0xe4, + 0x78, 0x0b, 0x45, 0x57, 0x2e, 0x52, 0x74, 0xa1, 0x09, 0x26, 0x9b, 0x08, 0x11, 0xde, 0x0b, 0x7f, + 0x18, 0x9f, 0x51, 0xf9, 0x90, 0x10, 0x0b, 0x07, 0xf2, 0x21, 0xe3, 0x7f, 0x18, 0x83, 0x99, 0xc4, + 0xb2, 0x10, 0xf7, 0xd4, 0x5c, 0xea, 0x9e, 0xda, 0x00, 0xe0, 0xaa, 0xde, 0x21, 0x75, 0xb2, 0xd2, + 0x43, 0x74, 0x52, 0xf8, 0x77, 0x47, 0x7b, 0x4a, 0x21, 0xc3, 0x88, 0xf2, 0x1d, 0x3b, 0xa4, 0x8e, + 0x3c, 0x22, 0xca, 0x37, 0xbd, 0x42, 0x34, 0x26, 0x43, 0x2a, 0x30, 0x8a, 0xd1, 0x80, 0x55, 0x07, + 0x5d, 0x87, 0x15, 0x98, 0xbc, 0x9c, 0xbc, 0x08, 0x63, 0x4c, 0x88, 0x5a, 0xaf, 0x09, 0x26, 0x88, + 0x67, 0x0b, 0x93, 0xb2, 0x98, 0xc4, 0x22, 0xaa, 0xc8, 0x75, 0x28, 0xf1, 0xbf, 0x44, 0xfc, 0x9f, + 0x31, 0xdd, 0x62, 0xd2, 0x72, 0x5a, 0x32, 0x04, 0x90, 0x06, 0xc7, 0x6e, 0x17, 0x8d, 0x1e, 0xaa, + 0x75, 0xd6, 0x6b, 0x22, 0x28, 0x3e, 0xde, 0x2e, 0x02, 0x5e, 0xc8, 0x9a, 0x88, 0x01, 0x98, 0x2c, + 0x23, 0xdc, 0x64, 0x8a, 0x78, 0xa7, 0x44, 0x59, 0x86, 0xbb, 0xc7, 0x98, 0xa2, 0x86, 0x5c, 0xe2, + 0x2f, 0x31, 0x28, 0x16, 0xf2, 0xcc, 0xb0, 0xf8, 0x6e, 0x81, 0x8a, 0x09, 0x94, 0x0d, 0xa3, 0x6a, + 0xd6, 0x38, 0xfb, 0x7b, 0xb5, 0x63, 0x3b, 0x6d, 0xc1, 0x56, 0xb0, 0x71, 0x84, 0xa5, 0xac, 0xd4, + 0x8c, 0x01, 0xc8, 0x3b, 0x30, 0xcd, 0x33, 0x38, 0x76, 0x3a, 0x9e, 0x8b, 0xe4, 0x27, 0xe3, 0x08, + 0x7f, 0x22, 0xab, 0x24, 0xab, 0xe2, 0xad, 0x24, 0x60, 0xd9, 0x79, 0x82, 0xaf, 0xbc, 0x3d, 0xfe, + 0x46, 0x54, 0x8a, 0xcf, 0x13, 0x44, 0x0d, 0x78, 0xb9, 0xa9, 0x02, 0x91, 0xb7, 0x60, 0x8a, 0xfd, + 0xbc, 0xe9, 0x3c, 0xa0, 0xbc, 0xc1, 0xa9, 0xd8, 0xbc, 0x01, 0xb1, 0xf6, 0x58, 0x0d, 0x6f, 0x4f, + 0x87, 0x24, 0x1f, 0xc0, 0x29, 0xa4, 0xd4, 0xf4, 0xba, 0xb4, 0x55, 0xdd, 0xdd, 0x75, 0xda, 0x0e, + 0xb7, 0x46, 0xe3, 0x91, 0x6e, 0x50, 0x07, 0xcf, 0x1b, 0x46, 0x08, 0xcb, 0x8e, 0x41, 0xcc, 0x6c, + 0x4c, 0x72, 0x1f, 0xca, 0x2b, 0xbd, 0x20, 0xf4, 0x3a, 0xd5, 0x30, 0xf4, 0x9d, 0x9d, 0x5e, 0x48, + 0x83, 0x85, 0x19, 0x2d, 0x1e, 0x0c, 0xdb, 0x1c, 0x51, 0x25, 0xd7, 0x07, 0x35, 0x11, 0xc3, 0xb2, + 0x23, 0x14, 0x33, 0x45, 0xc4, 0xf8, 0x37, 0x39, 0x98, 0xd2, 0x50, 0xc9, 0x9b, 0x50, 0xba, 0xe1, + 0x3b, 0xd4, 0x6d, 0xb5, 0x0f, 0x95, 0x8b, 0x2a, 0xde, 0x62, 0x76, 0x45, 0x39, 0xef, 0xb5, 0x06, + 0x16, 0xe9, 0x79, 0xf2, 0x99, 0xa6, 0xa2, 0x57, 0xb8, 0x9f, 0xb8, 0x58, 0xa0, 0x85, 0x38, 0x40, + 0x15, 0x2e, 0x50, 0xb1, 0x3a, 0x15, 0x10, 0xf2, 0x2e, 0x8c, 0xf1, 0xf7, 0x60, 0x61, 0xb7, 0x78, + 0x36, 0xab, 0x9b, 0x3c, 0x26, 0x01, 0x2e, 0x44, 0x34, 0xfa, 0x09, 0x4c, 0x81, 0x64, 0xfc, 0x4c, + 0x0e, 0x48, 0x1a, 0xf4, 0x04, 0xbd, 0xd7, 0x89, 0xc6, 0x44, 0x5f, 0x8c, 0x76, 0x63, 0x41, 0xd3, + 0x99, 0xb3, 0x96, 0x78, 0x05, 0x1f, 0x78, 0xb1, 0xeb, 0x54, 0x45, 0x1c, 0xaf, 0x36, 0x7e, 0x38, + 0x0f, 0x10, 0x43, 0x93, 0xcf, 0xf3, 0xfc, 0x77, 0x1f, 0xf4, 0xec, 0xb6, 0xb3, 0xeb, 0xe8, 0x51, + 0x88, 0x91, 0xc8, 0x37, 0x64, 0x8d, 0xa9, 0x03, 0x92, 0xf7, 0x61, 0xa6, 0x51, 0xd7, 0x71, 0x15, + 0x9b, 0xfb, 0xa0, 0x6b, 0x25, 0xd0, 0x93, 0xd0, 0x68, 0x9f, 0xac, 0xce, 0x06, 0xb7, 0x4f, 0xe6, + 0x13, 0x21, 0x6a, 0x18, 0x63, 0x69, 0xd4, 0x85, 0x5b, 0x41, 0x2b, 0x7a, 0xd5, 0xc4, 0xaf, 0x0b, + 0xba, 0x56, 0x57, 0xf8, 0x1b, 0x30, 0x3e, 0xa1, 0xc1, 0xc5, 0x03, 0x39, 0xda, 0x27, 0xee, 0xc0, + 0xcf, 0xa2, 0xda, 0xaf, 0xe3, 0x85, 0x54, 0x68, 0x3b, 0x9e, 0xda, 0x7b, 0x4f, 0x6c, 0x4c, 0x30, + 0xaa, 0xb9, 0x53, 0x6b, 0xbd, 0x13, 0x06, 0x33, 0xd7, 0xe2, 0x4b, 0x0a, 0x37, 0x2b, 0xc8, 0xb0, + 0xb1, 0xf9, 0xbb, 0x39, 0x38, 0x95, 0x89, 0x4b, 0x2e, 0x03, 0xc4, 0x3a, 0x25, 0x31, 0x4a, 0xc8, + 0x31, 0xe3, 0xb0, 0x4c, 0xa6, 0x02, 0x41, 0xbe, 0x9a, 0xd4, 0x06, 0x9d, 0x7c, 0x10, 0x2e, 0xca, + 0x68, 0x88, 0xba, 0x36, 0x28, 0x43, 0x07, 0x64, 0xfc, 0x42, 0x01, 0x66, 0x95, 0xa8, 0x4f, 0xfc, + 0x5b, 0x4f, 0xb0, 0x17, 0x3f, 0x80, 0x12, 0xeb, 0x8d, 0xd3, 0x14, 0xfe, 0x40, 0xdc, 0xf0, 0xe5, + 0xd5, 0x94, 0x43, 0xac, 0xa0, 0x76, 0x59, 0x05, 0xe6, 0x31, 0x4a, 0x91, 0x75, 0xe2, 0x83, 0x44, + 0x33, 0xed, 0x0b, 0xa4, 0x11, 0x27, 0x01, 0x4c, 0xd5, 0x0e, 0x5d, 0xbb, 0x13, 0xb5, 0xc6, 0x0d, + 0x60, 0x5e, 0xeb, 0xdb, 0x9a, 0x06, 0xcd, 0x9b, 0x8b, 0x5d, 0xc7, 0x78, 0x5d, 0x46, 0xd4, 0x02, + 0x0d, 0x6b, 0xf1, 0x7d, 0x98, 0x4d, 0x7d, 0xf4, 0x63, 0x85, 0x4b, 0xbd, 0x0f, 0x24, 0xfd, 0x1d, + 0x19, 0x14, 0x5e, 0xd3, 0x83, 0xf1, 0x9e, 0x8a, 0x1e, 0xaf, 0x3b, 0x1d, 0xdb, 0x6d, 0x71, 0x73, + 0x9a, 0x25, 0x35, 0x98, 0xea, 0xcf, 0xe6, 0x55, 0xa7, 0xe4, 0xa7, 0x7d, 0xd7, 0x7d, 0x51, 0xbb, + 0x0d, 0x3f, 0xdf, 0x6f, 0x4e, 0x87, 0xd2, 0x3a, 0x7c, 0xb7, 0x00, 0x67, 0xfa, 0x60, 0x92, 0xc3, + 0xe4, 0x22, 0xe2, 0x5a, 0x88, 0xab, 0x83, 0x1b, 0x7c, 0x12, 0x4b, 0x89, 0x7c, 0x9e, 0x87, 0x25, + 0x11, 0xc9, 0xb2, 0xf9, 0xfd, 0x1b, 0xd5, 0xf8, 0x07, 0x51, 0x69, 0x32, 0x1e, 0x09, 0x2f, 0x25, + 0xef, 0xc3, 0x28, 0x7a, 0xa4, 0x27, 0xe2, 0x4e, 0x32, 0x08, 0x2c, 0x57, 0x22, 0xa7, 0xb2, 0x9f, + 0x5a, 0xe4, 0x54, 0x56, 0x40, 0x3e, 0x07, 0x85, 0xea, 0xfd, 0x86, 0x98, 0x97, 0x69, 0x15, 0xfd, + 0x7e, 0x23, 0x4e, 0x80, 0x63, 0x6b, 0x99, 0x6a, 0x18, 0x06, 0x43, 0xbc, 0xb9, 0x52, 0x17, 0xb3, + 0xa2, 0x22, 0xde, 0x5c, 0xa9, 0xc7, 0x88, 0x7b, 0xba, 0xcf, 0xdb, 0xcd, 0x95, 0xfa, 0xa7, 0xb7, + 0xec, 0xff, 0xa3, 0x3c, 0x8f, 0xa5, 0xc2, 0x3b, 0xf6, 0x3e, 0x94, 0xb4, 0x60, 0xe9, 0xb9, 0x58, + 0x1e, 0x8b, 0xa2, 0xe1, 0x27, 0x2c, 0x86, 0x34, 0x04, 0x99, 0x4a, 0x8a, 0xfd, 0x56, 0x83, 0xc4, + 0x47, 0xa9, 0xa4, 0x90, 0x42, 0xd2, 0x95, 0x48, 0x47, 0x21, 0xd7, 0xa0, 0xb8, 0x45, 0x5d, 0xdb, + 0x0d, 0x23, 0x85, 0x28, 0x1a, 0x17, 0x87, 0x58, 0xa6, 0x4b, 0x0d, 0x11, 0x20, 0x1a, 0xc2, 0xf6, + 0x76, 0x82, 0xa6, 0xef, 0x60, 0xcc, 0xa5, 0xe8, 0x2c, 0xe6, 0x86, 0xb0, 0x4a, 0x8d, 0x4e, 0x20, + 0x81, 0x64, 0xfc, 0x6c, 0x0e, 0xc6, 0xc5, 0x44, 0xf2, 0x14, 0x80, 0x7b, 0xf1, 0x59, 0x22, 0x9c, + 0x07, 0xf6, 0x9c, 0xa4, 0xf3, 0xc0, 0x1e, 0x0f, 0x6c, 0x34, 0x21, 0xbc, 0xf6, 0xa2, 0xa7, 0x41, + 0x5c, 0x8d, 0xd2, 0x1f, 0x55, 0xcf, 0xf0, 0x16, 0x81, 0x0e, 0xeb, 0xc5, 0x65, 0xfc, 0x4d, 0xf1, + 0x65, 0x37, 0x57, 0xea, 0x64, 0x09, 0x8a, 0x1b, 0x1e, 0x8f, 0xd1, 0xa5, 0xe6, 0xb3, 0x6e, 0x8b, + 0x32, 0x75, 0x80, 0x24, 0x1c, 0xfb, 0xbe, 0xba, 0xef, 0x89, 0xbb, 0x8c, 0xf2, 0x7d, 0x5d, 0x5e, + 0x98, 0xf8, 0xbe, 0x08, 0x74, 0xe8, 0xef, 0xa3, 0x19, 0x4c, 0xe2, 0xde, 0x35, 0xcc, 0xb1, 0x73, + 0x4b, 0xf5, 0x8e, 0x13, 0x55, 0x92, 0x53, 0x2c, 0xf6, 0xe3, 0x14, 0xf7, 0xae, 0x99, 0x19, 0x58, + 0xf8, 0xae, 0x16, 0x17, 0x37, 0xa8, 0xff, 0xe0, 0x29, 0xe6, 0xd2, 0xd9, 0xef, 0x6a, 0xc9, 0xee, + 0x0d, 0xc5, 0xa4, 0x7f, 0x2b, 0x0f, 0xa7, 0xb3, 0x11, 0xd5, 0xbe, 0xe4, 0x06, 0xf4, 0xe5, 0x22, + 0x14, 0xd7, 0xbc, 0x20, 0x54, 0x8c, 0x04, 0x51, 0xfd, 0xbf, 0x2f, 0xca, 0xcc, 0xa8, 0x96, 0xdd, + 0xb9, 0xd9, 0xdf, 0xd1, 0xf6, 0x44, 0x7a, 0x18, 0x41, 0x84, 0xdd, 0xb9, 0x79, 0x15, 0xb9, 0x09, + 0x45, 0x53, 0x38, 0x5a, 0x25, 0x86, 0x46, 0x16, 0x47, 0xd2, 0x14, 0xf1, 0x45, 0x89, 0x16, 0xb3, + 0x5e, 0x94, 0x91, 0x2a, 0x8c, 0x8b, 0xd9, 0x4f, 0x3c, 0x1d, 0x67, 0x2c, 0x19, 0x3d, 0x8d, 0x84, + 0xc4, 0x63, 0x1c, 0x05, 0x1f, 0x01, 0xd7, 0x6b, 0xd2, 0x67, 0x0a, 0x39, 0x0a, 0x7f, 0x24, 0xd4, + 0xed, 0x31, 0x23, 0x40, 0xe3, 0x5b, 0x79, 0x00, 0xa9, 0xb5, 0x79, 0x6a, 0x57, 0xd8, 0xe7, 0xb4, + 0x15, 0xa6, 0xd8, 0x1b, 0x0d, 0x9f, 0x67, 0xfb, 0x2e, 0x9a, 0xf3, 0x0c, 0x9f, 0x65, 0xbb, 0x02, + 0xa3, 0x5b, 0xb1, 0x42, 0x4b, 0xb8, 0xa4, 0xa0, 0x3a, 0x9a, 0x97, 0x1b, 0x3b, 0x30, 0x7f, 0x93, + 0x86, 0xb1, 0x7a, 0x4b, 0x3e, 0x3d, 0x0e, 0x26, 0xfb, 0x3a, 0x4c, 0x08, 0xf8, 0x88, 0x7f, 0x71, + 0x5d, 0x8c, 0x08, 0xca, 0x83, 0xba, 0x18, 0x09, 0xc0, 0xb8, 0x51, 0x8d, 0xb6, 0x69, 0x48, 0x3f, + 0xdd, 0x66, 0x1a, 0x40, 0x78, 0x57, 0xb0, 0x67, 0xc3, 0xb5, 0x70, 0xe2, 0xf8, 0xdc, 0x83, 0x53, + 0xd1, 0xb7, 0x3f, 0x49, 0xba, 0x57, 0xd8, 0x95, 0x52, 0x64, 0x60, 0x88, 0x29, 0x0e, 0xb0, 0x3d, + 0xf9, 0x9d, 0x1c, 0x2c, 0x4a, 0x8c, 0xfb, 0x4e, 0x64, 0x39, 0x39, 0x14, 0x32, 0x79, 0x07, 0x26, + 0x15, 0x1c, 0x91, 0x42, 0x00, 0xf5, 0xd4, 0x0f, 0x9d, 0x70, 0xdf, 0x0a, 0x78, 0xb9, 0xaa, 0xa7, + 0x56, 0xc0, 0xc9, 0x0e, 0x2c, 0x36, 0xaa, 0x9b, 0x1b, 0xf7, 0xec, 0xb6, 0xd3, 0x42, 0x36, 0x70, + 0xc7, 0xbb, 0xe1, 0xb5, 0xdb, 0xde, 0xc3, 0x6d, 0x73, 0x43, 0xe6, 0x01, 0xc2, 0xc8, 0x23, 0xa8, + 0xf4, 0x7e, 0x10, 0x81, 0x59, 0xae, 0x67, 0xed, 0x22, 0xa0, 0xd5, 0xf3, 0xdb, 0x81, 0x39, 0x80, + 0x8a, 0xf1, 0xcf, 0x72, 0xf0, 0x6c, 0xe4, 0x9c, 0x94, 0xd1, 0xbf, 0x44, 0x0f, 0x72, 0x4f, 0xb2, + 0x07, 0xf9, 0x27, 0xd2, 0x83, 0x3b, 0xf1, 0xfc, 0xac, 0xbb, 0x91, 0x63, 0xb8, 0xfc, 0x7e, 0xa2, + 0xce, 0x8f, 0x98, 0x95, 0xe7, 0x52, 0xae, 0xe6, 0x8a, 0x47, 0xb9, 0xf1, 0xb6, 0x32, 0x20, 0x19, + 0x04, 0x35, 0xe4, 0x5c, 0x12, 0xf9, 0x5b, 0x79, 0x98, 0xb9, 0xbb, 0x5e, 0x5b, 0x89, 0xec, 0xa8, + 0xbe, 0xcf, 0xf2, 0x99, 0x6b, 0x7d, 0xeb, 0xcf, 0x39, 0x8d, 0x6d, 0x98, 0x4b, 0x0c, 0x03, 0x0a, + 0x41, 0xef, 0x71, 0xd7, 0x99, 0xa8, 0x58, 0x0a, 0x40, 0xa7, 0xb3, 0xc8, 0xdf, 0xbb, 0x66, 0x26, + 0xa0, 0x8d, 0xff, 0x13, 0x12, 0x74, 0x05, 0x33, 0x7e, 0x1d, 0x26, 0xd6, 0x83, 0xa0, 0x47, 0xfd, + 0x6d, 0x73, 0x43, 0x55, 0x7a, 0x38, 0x58, 0xc8, 0xd6, 0x90, 0x19, 0x03, 0x90, 0x4b, 0x50, 0x14, + 0x71, 0xe8, 0x25, 0x77, 0x43, 0xfd, 0x73, 0x14, 0xc6, 0xde, 0x8c, 0xaa, 0xc9, 0x9b, 0x50, 0xe2, + 0x7f, 0xf3, 0x15, 0x2d, 0x06, 0x1c, 0xd5, 0x9c, 0x02, 0x9c, 0xef, 0x00, 0x53, 0x03, 0x23, 0xaf, + 0x42, 0xa1, 0xba, 0x62, 0x0a, 0xc5, 0x96, 0x90, 0x80, 0x7d, 0x8b, 0x6b, 0x1f, 0xb5, 0xeb, 0xd0, + 0x8a, 0xc9, 0xe4, 0x58, 0x19, 0x93, 0x43, 0xe8, 0xe4, 0x71, 0x05, 0x48, 0xbd, 0x59, 0xe2, 0x58, + 0xc6, 0x32, 0x72, 0x05, 0xc6, 0x6b, 0xdc, 0xf8, 0x4f, 0x68, 0xe4, 0x79, 0xde, 0x4b, 0x5e, 0xa4, + 0xc5, 0x96, 0xe0, 0x45, 0xe4, 0x92, 0xcc, 0x9c, 0x57, 0x8c, 0x3d, 0x70, 0xfa, 0xa4, 0xc7, 0x7b, + 0x1d, 0xc6, 0x44, 0xb4, 0xf6, 0x09, 0x25, 0x3d, 0x4e, 0x32, 0x4a, 0xbb, 0x80, 0x49, 0xbb, 0xe2, + 0xc2, 0x93, 0x74, 0xc5, 0xdd, 0x81, 0x33, 0x37, 0x51, 0x0f, 0xa5, 0xc7, 0x1c, 0xdb, 0x36, 0xd7, + 0x85, 0x66, 0x1f, 0x1f, 0xb4, 0xb8, 0xaa, 0x2a, 0x19, 0xb6, 0xcc, 0xea, 0xf9, 0x6a, 0x1a, 0xe7, + 0x7e, 0x84, 0xc8, 0x97, 0x60, 0x3e, 0xab, 0x4a, 0xe8, 0xff, 0x31, 0xba, 0x56, 0x76, 0x03, 0x6a, + 0x74, 0xad, 0x2c, 0x0a, 0x64, 0x03, 0xca, 0xbc, 0xbc, 0xda, 0xea, 0x38, 0x2e, 0x7f, 0xc3, 0xe0, + 0xef, 0x03, 0xe8, 0x12, 0x23, 0xa8, 0xda, 0xac, 0x92, 0xbf, 0x65, 0x68, 0x4e, 0x54, 0x09, 0x4c, + 0xf2, 0x57, 0x72, 0xec, 0x5e, 0xca, 0x63, 0x9b, 0x23, 0xfb, 0x9c, 0x16, 0xaf, 0xa1, 0x91, 0x57, + 0x53, 0x23, 0xf4, 0x1d, 0x77, 0x4f, 0x38, 0x48, 0x6d, 0x09, 0x07, 0xa9, 0x77, 0x3e, 0x96, 0x83, + 0x14, 0x27, 0x15, 0x1c, 0x1f, 0x55, 0x4a, 0xbe, 0x68, 0x13, 0x77, 0x91, 0xf6, 0x05, 0x6c, 0xe8, + 0xd0, 0x4b, 0x78, 0xdb, 0xe5, 0x91, 0x95, 0x69, 0x8b, 0x77, 0x72, 0x06, 0x19, 0x3b, 0x0e, 0x9d, + 0xcd, 0x99, 0x78, 0x04, 0x90, 0xea, 0x68, 0x26, 0x05, 0x76, 0x85, 0x96, 0x4e, 0x38, 0xdc, 0xaf, + 0xb8, 0x1c, 0x5f, 0xa1, 0xa5, 0xc7, 0x8e, 0x85, 0xcb, 0x48, 0x5d, 0x3c, 0x1a, 0x0a, 0xb9, 0x02, + 0x63, 0x9b, 0xf6, 0xa3, 0xea, 0x1e, 0x15, 0x79, 0x5e, 0xa7, 0x24, 0xfb, 0xc3, 0xc2, 0xe5, 0xe2, + 0x6f, 0x73, 0xaf, 0x8d, 0x67, 0x4c, 0x01, 0x46, 0xfe, 0x5c, 0x0e, 0x4e, 0xf3, 0x6d, 0x2c, 0x7b, + 0xd9, 0xa0, 0x61, 0xc8, 0xc6, 0x41, 0x84, 0x68, 0x3c, 0x1f, 0x9b, 0x9e, 0x67, 0xc3, 0x61, 0x0c, + 0x01, 0x43, 0x70, 0x86, 0x68, 0xe0, 0x02, 0x51, 0xab, 0xc5, 0xba, 0xce, 0xc4, 0x27, 0x5b, 0x30, + 0xb9, 0x79, 0xa3, 0x1a, 0x35, 0xcb, 0x03, 0xe0, 0x57, 0xb2, 0xb8, 0xa3, 0x02, 0x96, 0xe5, 0x33, + 0xa1, 0x92, 0x41, 0xd1, 0xff, 0xf6, 0xca, 0x2a, 0xba, 0xed, 0xcf, 0xc7, 0xca, 0x84, 0xee, 0x41, + 0x93, 0x26, 0x83, 0x70, 0x47, 0x80, 0xc2, 0x39, 0xe2, 0x73, 0x72, 0x10, 0xc9, 0x1b, 0xaa, 0x27, + 0x6e, 0x01, 0x29, 0x8c, 0x77, 0xec, 0x47, 0x96, 0xbd, 0x47, 0x35, 0x23, 0x01, 0xa1, 0xbc, 0xff, + 0xe9, 0x1c, 0x9c, 0xed, 0x3b, 0x4e, 0xe4, 0x3a, 0x9c, 0xb1, 0xb9, 0x7f, 0xb9, 0xb5, 0x1f, 0x86, + 0xdd, 0xc0, 0x92, 0x37, 0x2c, 0x19, 0x85, 0xe7, 0x94, 0xa8, 0x5e, 0x63, 0xb5, 0xf2, 0xd2, 0x15, + 0x90, 0xf7, 0xe1, 0x39, 0xc7, 0x0d, 0x68, 0xb3, 0xe7, 0x53, 0x4b, 0x12, 0x68, 0x3a, 0x2d, 0xdf, + 0xf2, 0x6d, 0x77, 0x4f, 0x3a, 0x22, 0x9b, 0x67, 0x25, 0x8c, 0xf0, 0x61, 0x5f, 0x71, 0x5a, 0xbe, + 0x89, 0x00, 0xc6, 0xbf, 0xc9, 0xc1, 0x42, 0xbf, 0x71, 0x24, 0x0b, 0x30, 0x4e, 0x95, 0xfc, 0x39, + 0x45, 0x53, 0xfe, 0x24, 0xcf, 0x42, 0x7c, 0x3c, 0x08, 0x91, 0xa1, 0xd8, 0x14, 0xb9, 0x4c, 0xd0, + 0xb2, 0x5f, 0x3d, 0x0c, 0x84, 0x7d, 0x76, 0xa9, 0xa9, 0x1e, 0x09, 0xe7, 0x00, 0xe2, 0x33, 0x80, + 0xeb, 0x65, 0xcc, 0x09, 0xbb, 0xe9, 0xf3, 0xed, 0x4a, 0x4e, 0xc3, 0x18, 0xe7, 0xb1, 0xc2, 0xfd, + 0x43, 0xfc, 0x62, 0x87, 0xbd, 0x18, 0x64, 0x3c, 0x1c, 0x0a, 0xcb, 0x25, 0x6d, 0xb0, 0xc7, 0x3a, + 0x38, 0x39, 0xc6, 0xaf, 0x94, 0xb8, 0xdc, 0x51, 0xed, 0x85, 0xfb, 0x52, 0x52, 0x59, 0xca, 0x72, + 0x97, 0xe3, 0xa6, 0xa4, 0x8a, 0x59, 0xba, 0xee, 0x24, 0x27, 0x9f, 0xbe, 0xf2, 0x99, 0x4f, 0x5f, + 0xaf, 0xc3, 0xc4, 0xca, 0x3e, 0x6d, 0x1e, 0x44, 0x3e, 0x48, 0x45, 0xf1, 0xb6, 0xc0, 0x0a, 0x79, + 0xa8, 0xfa, 0x18, 0x80, 0x5c, 0x01, 0x40, 0x2f, 0x5d, 0x2e, 0x90, 0x2b, 0xe9, 0x66, 0xd0, 0xa9, + 0x57, 0x58, 0xe7, 0x28, 0x20, 0x48, 0xbe, 0x61, 0xde, 0x50, 0xcd, 0x79, 0x38, 0xf9, 0xc0, 0xdf, + 0x15, 0xe0, 0x31, 0x00, 0xeb, 0x9e, 0xc2, 0x8c, 0xc4, 0xd1, 0x59, 0x4e, 0x71, 0x2c, 0x15, 0x88, + 0x7c, 0x0e, 0xc6, 0x57, 0xa8, 0x1f, 0x6e, 0x6d, 0x6d, 0xa0, 0x0d, 0x0d, 0xcf, 0xb2, 0x52, 0xc4, + 0x8c, 0x18, 0x61, 0xd8, 0xfe, 0xde, 0x51, 0x65, 0x2a, 0x74, 0x3a, 0x34, 0x8a, 0x1e, 0x6f, 0x4a, + 0x68, 0xb2, 0x0c, 0x65, 0xfe, 0xca, 0x1f, 0x5f, 0xa5, 0xf0, 0x78, 0x2c, 0xf2, 0xc3, 0x5a, 0x98, + 0x04, 0x3c, 0xa4, 0x3b, 0x51, 0x3e, 0x90, 0x14, 0x3c, 0x59, 0x95, 0x69, 0x74, 0xd4, 0xcf, 0x86, + 0x78, 0x3b, 0x26, 0xd9, 0x06, 0xfb, 0xfa, 0x34, 0x06, 0xa9, 0xc2, 0xd4, 0x8a, 0xd7, 0xe9, 0xda, + 0xa1, 0x83, 0x49, 0x4a, 0x0f, 0xc5, 0x49, 0x88, 0xfa, 0xc9, 0xa6, 0x5a, 0xa1, 0x1d, 0xab, 0x6a, + 0x05, 0xb9, 0x01, 0xd3, 0xa6, 0xd7, 0x63, 0xc3, 0x2e, 0x95, 0x0a, 0xfc, 0xb0, 0x43, 0x4b, 0x17, + 0x9f, 0xd5, 0xb0, 0xb3, 0x59, 0x68, 0x10, 0xb4, 0x48, 0xbb, 0x1a, 0x16, 0xb9, 0x93, 0xf1, 0xba, + 0xa3, 0x9e, 0x70, 0x6a, 0x56, 0x90, 0x14, 0xb1, 0x8c, 0x87, 0xa1, 0x6b, 0x30, 0xd9, 0x68, 0xdc, + 0xdd, 0xa2, 0x41, 0x78, 0xa3, 0xed, 0x3d, 0xc4, 0x03, 0xae, 0x28, 0x92, 0xd8, 0x05, 0x9e, 0x15, + 0xd2, 0x20, 0xb4, 0x76, 0xdb, 0xde, 0x43, 0x53, 0x85, 0x22, 0x5f, 0x63, 0xe3, 0xa1, 0x88, 0x83, + 0x22, 0xa6, 0xf0, 0x20, 0x89, 0x15, 0x8f, 0x91, 0x78, 0x13, 0x30, 0xb9, 0x55, 0x1f, 0x2c, 0x05, + 0x1c, 0x5d, 0xe4, 0x7c, 0xef, 0xd1, 0x61, 0xb5, 0xd5, 0xf2, 0x69, 0x10, 0x88, 0x93, 0x88, 0xbb, + 0xc8, 0xa1, 0xee, 0xc4, 0xe6, 0x15, 0x9a, 0x8b, 0x9c, 0x82, 0x40, 0x56, 0x98, 0x88, 0xc4, 0x66, + 0x11, 0x6d, 0xaf, 0xd6, 0xeb, 0x78, 0x98, 0x08, 0xa5, 0xac, 0x98, 0x73, 0x6e, 0xa5, 0xe5, 0x74, + 0x75, 0x49, 0x48, 0xc1, 0x21, 0xeb, 0x30, 0xc3, 0x0b, 0xd8, 0xd6, 0xe2, 0x29, 0xac, 0xe6, 0xe2, + 0x24, 0x1a, 0x82, 0x0c, 0x9a, 0x0b, 0x60, 0x1a, 0x2b, 0x35, 0xf0, 0x6c, 0x02, 0x8f, 0xbc, 0x0f, + 0xd3, 0x98, 0x1f, 0x20, 0xf2, 0x33, 0xc2, 0x33, 0xa1, 0xc4, 0xe3, 0xe7, 0x8a, 0x9a, 0x84, 0xf3, + 0x5e, 0x29, 0x08, 0xf6, 0xeb, 0xd2, 0x01, 0x89, 0x11, 0x40, 0x73, 0x9f, 0x98, 0xc0, 0xa9, 0x98, + 0x80, 0xa8, 0x49, 0x12, 0x08, 0xdb, 0x41, 0x4c, 0xe0, 0xa7, 0x72, 0x70, 0x96, 0x35, 0xa4, 0xba, + 0x14, 0x21, 0x53, 0x40, 0x5b, 0x26, 0x9e, 0xdb, 0xe4, 0x8d, 0xcb, 0x52, 0x3e, 0xb9, 0xac, 0x80, + 0x5d, 0x7e, 0x70, 0xf5, 0x72, 0x35, 0xfe, 0xd9, 0x90, 0x48, 0x3c, 0xa2, 0x68, 0x5f, 0x9a, 0xaa, + 0x1c, 0x18, 0x04, 0xfb, 0x59, 0x14, 0xf0, 0xa3, 0xd8, 0xc7, 0x67, 0x7f, 0xd4, 0x99, 0x8f, 0xfd, + 0x51, 0x7d, 0x69, 0xaa, 0x1f, 0x15, 0xb6, 0x83, 0xcc, 0x8f, 0xba, 0x0e, 0x53, 0x78, 0x4a, 0x0b, + 0xe9, 0xc8, 0x17, 0x99, 0x53, 0x70, 0x4f, 0x68, 0x15, 0x66, 0x89, 0xfd, 0xbc, 0x27, 0x7e, 0xdd, + 0x1a, 0x29, 0x8e, 0x97, 0x8b, 0xb7, 0x46, 0x8a, 0xb3, 0x65, 0x62, 0x4e, 0x44, 0x03, 0x6f, 0x9e, + 0xca, 0xfc, 0x10, 0xbc, 0xb5, 0xb2, 0x1b, 0x76, 0x7c, 0xf5, 0xfa, 0xfe, 0xf2, 0xaf, 0xd1, 0xfa, + 0x36, 0xc0, 0xbf, 0x66, 0x9b, 0xbb, 0x7b, 0x2b, 0xc3, 0x20, 0x6f, 0xad, 0x5a, 0x71, 0xf2, 0xd6, + 0x9a, 0xc0, 0x31, 0x13, 0xd0, 0xc6, 0xb7, 0x26, 0x13, 0x74, 0x85, 0x4d, 0xad, 0x01, 0x63, 0xfc, + 0x52, 0x2a, 0x06, 0x19, 0x8d, 0x2b, 0xf8, 0x95, 0xd5, 0x14, 0x35, 0xe4, 0x2c, 0x14, 0x1a, 0x8d, + 0xbb, 0x62, 0x90, 0xd1, 0xb2, 0x36, 0x08, 0x3c, 0x93, 0x95, 0xb1, 0x19, 0x42, 0x73, 0x59, 0x25, + 0xab, 0x03, 0x3b, 0xc9, 0x4c, 0x2c, 0x65, 0xe3, 0x2d, 0xaf, 0x88, 0x23, 0xf1, 0x78, 0x8b, 0x2b, + 0x62, 0x7c, 0x31, 0x5c, 0x81, 0x85, 0x6a, 0x10, 0x50, 0x9f, 0xad, 0x08, 0x61, 0x85, 0xe9, 0x8b, + 0x6b, 0x8c, 0x38, 0x82, 0xb1, 0x51, 0xbb, 0x19, 0x98, 0x7d, 0x01, 0xc9, 0x45, 0x28, 0x56, 0x7b, + 0x2d, 0x87, 0xba, 0x4d, 0x2d, 0x7e, 0x9c, 0x2d, 0xca, 0xcc, 0xa8, 0x96, 0x7c, 0x00, 0xa7, 0x12, + 0x71, 0x28, 0xc5, 0x08, 0x8c, 0xc7, 0x5c, 0x55, 0x5e, 0xb3, 0x62, 0xcb, 0x11, 0x3e, 0x24, 0xd9, + 0x98, 0xa4, 0x0a, 0xe5, 0x55, 0xf4, 0x27, 0xab, 0x51, 0xfe, 0x88, 0xe5, 0xf9, 0xdc, 0x91, 0x90, + 0x5f, 0x8a, 0x45, 0xa4, 0xce, 0x56, 0x54, 0x69, 0xa6, 0xc0, 0xc9, 0x6d, 0x98, 0x4b, 0x96, 0xb1, + 0xb3, 0x99, 0xdf, 0x7f, 0x91, 0xab, 0xa5, 0xa8, 0xe0, 0xe9, 0x9c, 0x85, 0x45, 0x76, 0x60, 0x36, + 0xb6, 0x9c, 0xd2, 0x6f, 0xc5, 0xd2, 0x20, 0x3b, 0xaa, 0x97, 0x37, 0xe3, 0x67, 0xc5, 0x62, 0x9c, + 0x8b, 0xad, 0xb0, 0xa2, 0xdb, 0xb1, 0x99, 0x26, 0x47, 0x5a, 0x30, 0xdd, 0x70, 0xf6, 0x5c, 0xc7, + 0xdd, 0xbb, 0x4d, 0x0f, 0xeb, 0xb6, 0xe3, 0x0b, 0xd3, 0x58, 0x69, 0xf8, 0x5e, 0x0d, 0x0e, 0x3b, + 0x1d, 0x1a, 0xfa, 0xb8, 0xeb, 0x59, 0x3d, 0x3a, 0xcb, 0xb3, 0xdb, 0xce, 0x62, 0xc0, 0xf1, 0xd0, + 0xbf, 0xb4, 0x6b, 0x3b, 0xda, 0xf1, 0xae, 0xd3, 0xd4, 0x34, 0x13, 0xa5, 0x21, 0x35, 0x13, 0x6d, + 0x98, 0x5d, 0x75, 0x9b, 0xfe, 0x21, 0xbe, 0x25, 0xca, 0x8f, 0x9b, 0x3a, 0xe1, 0xe3, 0x5e, 0x12, + 0x1f, 0xf7, 0x9c, 0x2d, 0x57, 0x58, 0xd6, 0xe7, 0xa5, 0x09, 0x93, 0x06, 0xcc, 0xa2, 0x88, 0xbf, + 0x5e, 0xab, 0xaf, 0xbb, 0x4e, 0xe8, 0xd8, 0x21, 0x6d, 0x09, 0xb1, 0x21, 0xca, 0x85, 0xc3, 0x6f, + 0xa0, 0x4e, 0xab, 0x6b, 0x39, 0x12, 0x44, 0x25, 0x9a, 0xc2, 0x1f, 0x74, 0x0d, 0x9c, 0xf9, 0x63, + 0xba, 0x06, 0xae, 0xc3, 0x4c, 0x32, 0xe6, 0x44, 0x39, 0x3e, 0xed, 0x03, 0xac, 0x62, 0x42, 0x83, + 0xd7, 0x43, 0x31, 0x51, 0x4b, 0x3f, 0x9b, 0x88, 0x36, 0x91, 0xb8, 0x51, 0xce, 0x6a, 0x37, 0x4a, + 0x8d, 0x2b, 0x3d, 0xce, 0x8d, 0xb2, 0x0e, 0x70, 0xc3, 0xf3, 0x9b, 0xb4, 0x8a, 0x8e, 0xdc, 0x44, + 0xcb, 0x18, 0xc6, 0x88, 0xc6, 0x95, 0x7c, 0xff, 0xec, 0xb2, 0xdf, 0x56, 0xd2, 0x1f, 0x5f, 0xa1, + 0x41, 0x6c, 0x38, 0x53, 0xf7, 0xe9, 0x2e, 0xf5, 0x7d, 0xda, 0x12, 0x37, 0x98, 0x65, 0xc7, 0x6d, + 0xc9, 0x34, 0x70, 0x22, 0x66, 0x78, 0x57, 0x82, 0x44, 0x86, 0xe4, 0x3b, 0x1c, 0x48, 0x3d, 0x4c, + 0xfb, 0xd0, 0x31, 0x7e, 0x34, 0x0f, 0x0b, 0xfd, 0x7a, 0x3c, 0xe0, 0xee, 0xf7, 0x1a, 0xa4, 0x99, + 0x88, 0xb8, 0x03, 0x96, 0x69, 0x92, 0x95, 0x2c, 0x41, 0x36, 0xaf, 0x10, 0x77, 0xc2, 0xb9, 0x24, + 0xc2, 0xb6, 0xdf, 0x26, 0xd7, 0x61, 0x52, 0x19, 0x1f, 0x64, 0xd7, 0xfd, 0x46, 0xd3, 0x84, 0xdd, + 0x78, 0xc8, 0x4e, 0x83, 0x38, 0x2d, 0xe4, 0x9d, 0x91, 0xff, 0x22, 0x65, 0xee, 0x2e, 0x3f, 0xc6, + 0x2d, 0x22, 0x82, 0xc0, 0x23, 0x04, 0xf0, 0x68, 0xe0, 0x5c, 0xd6, 0xc4, 0xbf, 0x8d, 0x9f, 0x2f, + 0xf1, 0x43, 0x5f, 0xbd, 0x32, 0xf6, 0xb3, 0x95, 0x4e, 0x5c, 0x25, 0xf3, 0x8f, 0x73, 0x95, 0x2c, + 0x9c, 0x7c, 0x95, 0x1c, 0x39, 0xe9, 0x2a, 0x99, 0xb8, 0xeb, 0x8d, 0x3e, 0xe6, 0x5d, 0x6f, 0xfc, + 0xb1, 0xee, 0x7a, 0xda, 0x35, 0xb4, 0x78, 0xd2, 0x35, 0xf4, 0x4f, 0x6f, 0x86, 0x4f, 0xeb, 0xcd, + 0x30, 0x4b, 0x2a, 0x7c, 0xac, 0x9b, 0x61, 0xea, 0x62, 0x37, 0xfb, 0x64, 0x2e, 0x76, 0xe4, 0x89, + 0x5d, 0xec, 0xe6, 0x3e, 0xe9, 0xc5, 0x6e, 0xfe, 0x49, 0x5e, 0xec, 0x4e, 0xfd, 0x49, 0xbc, 0xd8, + 0x9d, 0xfe, 0xf7, 0x73, 0xb1, 0xbb, 0x06, 0xc5, 0xba, 0x17, 0x84, 0x37, 0x3c, 0xbf, 0x83, 0x77, + 0xcb, 0x92, 0x50, 0xc9, 0x7a, 0x01, 0xcf, 0xc4, 0xac, 0x09, 0x57, 0x02, 0x90, 0x2c, 0xcb, 0x05, + 0x27, 0x6f, 0x52, 0x0b, 0xb1, 0x56, 0x5c, 0xac, 0x14, 0x71, 0xa1, 0x4a, 0xaf, 0x37, 0x81, 0x72, + 0x6b, 0xa4, 0x38, 0x56, 0x1e, 0xbf, 0x35, 0x52, 0x2c, 0x97, 0x67, 0x87, 0xb8, 0x19, 0xfe, 0x19, + 0x28, 0x27, 0x85, 0xd5, 0x93, 0xc3, 0x3d, 0x3f, 0xb1, 0x58, 0x9b, 0x4c, 0x94, 0x4e, 0x0a, 0x8b, + 0xe4, 0x0a, 0x40, 0xdd, 0x77, 0x1e, 0xd8, 0x21, 0xbd, 0x2d, 0xcd, 0xfe, 0x44, 0x7c, 0x73, 0x5e, + 0xca, 0x16, 0xa8, 0xa9, 0x80, 0x44, 0xf7, 0xa4, 0x7c, 0xd6, 0x3d, 0xc9, 0xf8, 0xcb, 0x79, 0x98, + 0xe5, 0x01, 0xeb, 0x9e, 0xfe, 0x37, 0xdb, 0xf7, 0xb4, 0xdb, 0xef, 0x73, 0x71, 0xd6, 0x06, 0xb5, + 0x77, 0x03, 0x5e, 0x6d, 0x3f, 0x84, 0x53, 0xa9, 0xa1, 0xc0, 0x1b, 0x70, 0x4d, 0x86, 0x0a, 0x4c, + 0xdd, 0x81, 0x17, 0xb2, 0x1b, 0xb9, 0x77, 0xcd, 0x4c, 0x61, 0x18, 0x7f, 0x30, 0x92, 0xa2, 0x2f, + 0xde, 0x6f, 0xd5, 0x17, 0xd9, 0xdc, 0xe3, 0xbd, 0xc8, 0xe6, 0x87, 0x7b, 0x91, 0x4d, 0x48, 0x10, + 0x85, 0x61, 0x24, 0x88, 0x0f, 0x60, 0x6a, 0x8b, 0xda, 0x9d, 0x60, 0xcb, 0x13, 0x29, 0xc0, 0xb8, + 0x93, 0x89, 0x8c, 0x04, 0xc8, 0xea, 0xe4, 0x05, 0x2e, 0x32, 0x96, 0x0d, 0x19, 0x02, 0x3b, 0x23, + 0x79, 0x4e, 0x30, 0x53, 0xa7, 0xa0, 0xde, 0xca, 0x47, 0x07, 0xdc, 0xca, 0x1b, 0x50, 0x12, 0x78, + 0x71, 0x8c, 0xeb, 0xf8, 0xfa, 0xc8, 0xaa, 0xb0, 0x5c, 0xb6, 0x2e, 0xbd, 0x3d, 0xa7, 0xa3, 0xd6, + 0xf9, 0xcd, 0x51, 0x23, 0xc2, 0x86, 0x60, 0xd5, 0x6d, 0x75, 0x3d, 0xc7, 0xc5, 0x21, 0x18, 0x8f, + 0x87, 0x80, 0x8a, 0x62, 0x3e, 0x04, 0x0a, 0x10, 0x79, 0x07, 0xa6, 0xab, 0xf5, 0x75, 0x15, 0xad, + 0x18, 0x3f, 0x0a, 0xdb, 0x5d, 0xc7, 0xd2, 0x50, 0x13, 0xb0, 0x83, 0x6e, 0x52, 0x13, 0x7f, 0x3c, + 0x37, 0x29, 0xe3, 0xd7, 0x4a, 0x72, 0x7b, 0x7f, 0xba, 0x4f, 0x23, 0xfa, 0x63, 0x47, 0xe1, 0x31, + 0x1f, 0x3b, 0x46, 0x4e, 0x92, 0x32, 0x15, 0x61, 0x76, 0xec, 0x13, 0x3f, 0x5c, 0x8c, 0x3f, 0xa6, + 0x78, 0x9a, 0xd8, 0x3b, 0xc5, 0x61, 0xf6, 0x4e, 0xa6, 0x48, 0x3b, 0xf1, 0xc9, 0x45, 0x5a, 0x78, + 0x6c, 0x91, 0xb6, 0x11, 0x3b, 0x61, 0x4f, 0x9e, 0xe8, 0xdb, 0x72, 0x4e, 0x68, 0x0d, 0x66, 0xb3, + 0xc3, 0x09, 0x46, 0xee, 0xd8, 0xdf, 0x57, 0x72, 0xf2, 0xd7, 0xb3, 0xe5, 0xe4, 0xc1, 0xe7, 0xc7, + 0x9f, 0x4a, 0xca, 0x7f, 0x2a, 0x29, 0xff, 0xb1, 0x48, 0xca, 0x77, 0x81, 0xd8, 0xbd, 0x70, 0x9f, + 0xba, 0xa1, 0xd3, 0xc4, 0x90, 0xb6, 0x6c, 0x8a, 0x51, 0x66, 0x16, 0x7b, 0x24, 0x5d, 0xab, 0xee, + 0x11, 0xad, 0x96, 0xad, 0x00, 0x1e, 0x06, 0x74, 0x68, 0x09, 0xd8, 0xc7, 0x1d, 0x75, 0xdf, 0xf6, + 0x5d, 0x54, 0x13, 0x5d, 0x81, 0x71, 0x19, 0x42, 0x35, 0x17, 0x2b, 0x99, 0xd3, 0xb1, 0x53, 0x25, + 0x14, 0x59, 0x82, 0xa2, 0x44, 0x56, 0x13, 0x01, 0x3d, 0x14, 0x65, 0x5a, 0x74, 0x4a, 0x51, 0x66, + 0xfc, 0x27, 0x23, 0x92, 0x6b, 0xb3, 0x0f, 0xae, 0xdb, 0xbe, 0xdd, 0xc1, 0x3c, 0x84, 0xd1, 0xa6, + 0x52, 0xe4, 0xef, 0xc4, 0x3e, 0x4c, 0xb8, 0x25, 0xe8, 0x28, 0x1f, 0x2b, 0x06, 0x6e, 0x9c, 0xea, + 0xb9, 0x30, 0x44, 0xaa, 0xe7, 0xb7, 0xb4, 0x3c, 0xc9, 0x23, 0x71, 0x62, 0x4e, 0xc6, 0xc9, 0x06, + 0x67, 0x48, 0xbe, 0xae, 0x26, 0x34, 0x1e, 0x8d, 0x23, 0x92, 0x21, 0xe6, 0x80, 0x54, 0xc6, 0xd1, + 0x85, 0x62, 0xec, 0x71, 0xa2, 0x4b, 0x8f, 0xff, 0x7b, 0x8d, 0x2e, 0xbd, 0x0a, 0x20, 0x4e, 0xd7, + 0xd8, 0x16, 0xe1, 0x65, 0x64, 0x3e, 0xc2, 0xc4, 0x3a, 0x0c, 0xdb, 0x7d, 0xd2, 0x8f, 0x28, 0x88, + 0xc6, 0xbf, 0x22, 0x30, 0xdb, 0x68, 0xdc, 0xad, 0x39, 0xf6, 0x9e, 0xeb, 0x05, 0xa1, 0xd3, 0x5c, + 0x77, 0x77, 0x3d, 0x26, 0x4d, 0x47, 0x27, 0x80, 0x12, 0x17, 0x38, 0xe6, 0xfe, 0x51, 0x35, 0xbb, + 0xad, 0xad, 0xfa, 0xbe, 0xd4, 0x67, 0xf2, 0xdb, 0x1a, 0x65, 0x05, 0x26, 0x2f, 0x67, 0x02, 0x6b, + 0xa3, 0x87, 0x51, 0x39, 0x84, 0xc1, 0x07, 0x0a, 0xac, 0x01, 0x2f, 0x32, 0x65, 0x1d, 0xa1, 0xe9, + 0x05, 0x2b, 0x2e, 0x30, 0x67, 0xb4, 0x18, 0xd5, 0x71, 0x35, 0xdf, 0xbb, 0x42, 0xfe, 0x40, 0xae, + 0xdd, 0xc5, 0x72, 0xd5, 0x06, 0x2e, 0xb5, 0x07, 0x0e, 0xe1, 0x94, 0xe6, 0xaf, 0x3d, 0xec, 0xfb, + 0xca, 0xab, 0x42, 0x40, 0x36, 0xd0, 0xce, 0x38, 0xe3, 0x91, 0x45, 0x4d, 0x2c, 0x98, 0xd9, 0x02, + 0xf9, 0xcb, 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, 0x57, 0x72, 0x70, 0x46, 0x83, + 0x88, 0xb8, 0x65, 0x10, 0x85, 0x32, 0xc9, 0x5c, 0xd7, 0x1f, 0x3d, 0x99, 0x75, 0xfd, 0xa2, 0xde, + 0x97, 0x98, 0x5b, 0xaa, 0x7d, 0xe8, 0xf7, 0x85, 0xe4, 0x01, 0xcc, 0x62, 0x95, 0x7c, 0xeb, 0x61, + 0x6b, 0x56, 0x3c, 0x11, 0xcd, 0xc7, 0x9f, 0xcd, 0x63, 0x10, 0x60, 0x1a, 0xfc, 0xa5, 0xef, 0x1e, + 0x55, 0xa6, 0x34, 0x70, 0x19, 0x79, 0xdb, 0x8a, 0x1f, 0x8c, 0x1c, 0x77, 0xd7, 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, 0xe3, 0x27, 0x73, 0x9e, 0x60, 0xed, 0xfa, + 0x5e, 0x27, 0xfe, 0x7c, 0x75, 0xe0, 0xfa, 0x7e, 0x24, 0xf9, 0xf3, 0x39, 0x38, 0xab, 0x69, 0x2d, + 0xd5, 0x34, 0x28, 0x22, 0xd2, 0xc3, 0x5c, 0x14, 0x03, 0x26, 0xae, 0x5a, 0xbe, 0x2c, 0xd6, 0xff, + 0x05, 0xfc, 0x02, 0x25, 0xe4, 0x28, 0x03, 0xb2, 0x3a, 0x1c, 0x4a, 0xf9, 0x84, 0xfe, 0xad, 0x10, + 0x07, 0x66, 0xd1, 0xa4, 0x46, 0x33, 0xfa, 0x9d, 0xef, 0x6f, 0xf4, 0x1b, 0x25, 0x38, 0xc2, 0xe4, + 0x07, 0xfd, 0x2d, 0x7f, 0xd3, 0x54, 0xc9, 0x0f, 0xc1, 0xd9, 0x54, 0x61, 0xb4, 0xdb, 0x4e, 0xf5, + 0xdd, 0x6d, 0xaf, 0x1d, 0x1f, 0x55, 0x5e, 0xc9, 0x6a, 0x2d, 0x6b, 0xa7, 0xf5, 0x6f, 0x81, 0xd8, + 0x00, 0x71, 0xa5, 0x90, 0x7e, 0xb2, 0x17, 0xe8, 0x6b, 0x62, 0x7d, 0x28, 0xf0, 0x8c, 0x97, 0x2b, + 0xdf, 0xa0, 0x1e, 0x79, 0x31, 0x10, 0xa1, 0x50, 0x52, 0x12, 0x3f, 0x1c, 0x0a, 0x2b, 0x93, 0x3e, + 0x8d, 0x7c, 0xf7, 0xa8, 0xa2, 0x41, 0xb3, 0x3b, 0x90, 0x9a, 0x51, 0x42, 0x13, 0x36, 0x55, 0x40, + 0xf2, 0xcb, 0x39, 0x98, 0x67, 0x05, 0xf1, 0xa2, 0x12, 0x9d, 0x5a, 0x18, 0xb4, 0xea, 0xf7, 0x9f, + 0xcc, 0xaa, 0x7f, 0x01, 0xbf, 0x51, 0x5d, 0xf5, 0xa9, 0x21, 0xc9, 0xfc, 0x38, 0x5c, 0xed, 0x9a, + 0xf5, 0x96, 0xb6, 0xda, 0xcf, 0x0e, 0xb1, 0xda, 0xf9, 0x04, 0x9c, 0xbc, 0xda, 0xfb, 0xb6, 0x42, + 0xb6, 0xa0, 0x24, 0xae, 0x3f, 0x7c, 0xc0, 0x9e, 0xd7, 0x42, 0x50, 0xab, 0x55, 0xfc, 0x4e, 0x2a, + 0xf2, 0x62, 0xa4, 0x7a, 0xa8, 0x51, 0x21, 0x2e, 0xcc, 0xf1, 0xdf, 0xba, 0x7a, 0xa9, 0xd2, 0x57, + 0xbd, 0x74, 0x51, 0xf4, 0xe8, 0xbc, 0xa0, 0x9f, 0xd0, 0x32, 0xa9, 0xa1, 0xa3, 0x32, 0x08, 0x93, + 0x2e, 0x10, 0xad, 0x98, 0x6f, 0xda, 0xf3, 0x83, 0x95, 0x4a, 0xaf, 0x88, 0x36, 0x2b, 0xc9, 0x36, + 0x93, 0x3b, 0x37, 0x83, 0x36, 0xb1, 0x61, 0x46, 0x94, 0x7a, 0x07, 0x94, 0x73, 0xf8, 0x17, 0xb4, + 0xe0, 0x5d, 0x89, 0x5a, 0x7e, 0x87, 0x93, 0x2d, 0x61, 0x70, 0xb5, 0x04, 0x43, 0x4f, 0xd2, 0x23, + 0x77, 0x61, 0xb6, 0xda, 0xed, 0xb6, 0x1d, 0xda, 0xc2, 0x5e, 0x9a, 0x3d, 0xd6, 0x27, 0x23, 0x4e, + 0x2d, 0x67, 0xf3, 0x4a, 0x71, 0xb1, 0xf4, 0x7b, 0x09, 0x76, 0x93, 0xc2, 0x35, 0x7e, 0x24, 0x97, + 0xfa, 0x68, 0xf2, 0x3a, 0x4c, 0xe0, 0x0f, 0x25, 0x1e, 0x0c, 0x6a, 0x69, 0xf8, 0x27, 0xa2, 0xfe, + 0x27, 0x06, 0x60, 0xc2, 0x92, 0x1a, 0x13, 0xb2, 0xc0, 0x85, 0x25, 0xa1, 0x4a, 0x88, 0x95, 0x07, + 0x15, 0xe9, 0x8c, 0x51, 0x88, 0x85, 0x2e, 0x74, 0xc6, 0x10, 0x2e, 0x18, 0xc6, 0x3f, 0xcc, 0xeb, + 0xcb, 0x8e, 0x5c, 0x54, 0xe4, 0x76, 0x25, 0x2a, 0xa5, 0x94, 0xdb, 0x15, 0x69, 0xfd, 0xef, 0xe6, + 0x60, 0xee, 0xae, 0x92, 0xf0, 0x74, 0xcb, 0xc3, 0x79, 0x19, 0x9c, 0xda, 0xf3, 0x49, 0x65, 0x1b, + 0x54, 0x33, 0xad, 0xb2, 0x95, 0x82, 0x4b, 0xc6, 0xcc, 0xfa, 0x1e, 0x74, 0xd4, 0xc3, 0x0f, 0x53, + 0x92, 0x3e, 0x72, 0x70, 0x5e, 0xfe, 0x98, 0x59, 0x32, 0x8c, 0x1f, 0xcf, 0xc3, 0xa4, 0xb2, 0x63, + 0xc8, 0x67, 0xa1, 0xa4, 0x36, 0xab, 0xaa, 0xf8, 0xd4, 0xaf, 0x34, 0x35, 0x28, 0xd4, 0xf1, 0x51, + 0xbb, 0xa3, 0xe9, 0xf8, 0xd8, 0xbe, 0xc0, 0xd2, 0xc7, 0xbc, 0x09, 0xbd, 0x9f, 0x71, 0x13, 0xc2, + 0x55, 0xae, 0xe8, 0x74, 0x06, 0xde, 0x87, 0xde, 0x49, 0xdf, 0x87, 0x50, 0xbd, 0xa4, 0xe0, 0xf7, + 0xbf, 0x15, 0x19, 0x3f, 0x99, 0x83, 0x72, 0x72, 0x4f, 0x7f, 0x2a, 0xa3, 0xf2, 0x18, 0xef, 0x39, + 0x3f, 0x96, 0x8f, 0x92, 0xc4, 0x48, 0x6f, 0xe5, 0xa7, 0xd5, 0xd0, 0xf0, 0x5d, 0xed, 0xa9, 0xe5, + 0x59, 0x3d, 0xf0, 0x9e, 0x1a, 0xe7, 0x23, 0x3b, 0xda, 0xe6, 0xc8, 0xb7, 0xff, 0x56, 0xe5, 0x19, + 0xe3, 0xcb, 0x30, 0x9f, 0x1c, 0x0e, 0x7c, 0x6e, 0xa9, 0xc2, 0x8c, 0x5e, 0x9e, 0x4c, 0x31, 0x95, + 0xc4, 0x32, 0x93, 0xf0, 0xc6, 0x6f, 0xe7, 0x93, 0xb4, 0x85, 0xd1, 0x21, 0xe3, 0x51, 0xaa, 0x9d, + 0x8b, 0xe0, 0x51, 0xbc, 0xc8, 0x94, 0x75, 0x8f, 0x93, 0xda, 0x2d, 0xf2, 0xb9, 0x2d, 0x64, 0xfb, + 0xdc, 0x92, 0xeb, 0x09, 0x0b, 0x6a, 0x25, 0x40, 0xd4, 0x43, 0xba, 0x63, 0xc5, 0x56, 0xd4, 0x29, + 0xc3, 0xe9, 0x79, 0x2d, 0xda, 0xb9, 0xc4, 0x1f, 0x8d, 0xb5, 0xeb, 0x21, 0x56, 0x70, 0xe4, 0x4c, + 0x60, 0xb2, 0x06, 0xe3, 0xec, 0x33, 0x37, 0xed, 0xae, 0x78, 0x45, 0x21, 0x91, 0x07, 0x7e, 0x3b, + 0xba, 0x1f, 0x2a, 0x4e, 0xf8, 0x6d, 0xca, 0x24, 0x04, 0x75, 0x61, 0x09, 0x40, 0xe3, 0xff, 0xce, + 0xb1, 0xfd, 0xdf, 0x3c, 0xf8, 0x3e, 0xcb, 0x0f, 0xc7, 0xba, 0x34, 0xc0, 0x26, 0xf6, 0xdf, 0xe6, + 0x79, 0xda, 0x1f, 0xb1, 0x7c, 0xde, 0x82, 0xb1, 0x2d, 0xdb, 0xdf, 0x13, 0xa9, 0xbf, 0x75, 0x2a, + 0xbc, 0x22, 0x0e, 0x5f, 0x15, 0xe2, 0x6f, 0x53, 0x20, 0xa8, 0xaa, 0xb3, 0xfc, 0x50, 0xaa, 0x33, + 0x45, 0x73, 0x5f, 0x78, 0x62, 0x9a, 0xfb, 0x1f, 0x88, 0x32, 0xfc, 0x54, 0xc3, 0x21, 0x82, 0x69, + 0x9f, 0x4f, 0x26, 0xd4, 0x4a, 0x85, 0x3d, 0x8f, 0xc9, 0x91, 0xeb, 0x6a, 0x8a, 0x2e, 0xc5, 0xf9, + 0xf3, 0x84, 0x64, 0x5c, 0xc6, 0x7f, 0x5d, 0xe0, 0x63, 0x2c, 0x06, 0xea, 0x82, 0xe6, 0xe2, 0x8e, + 0xfb, 0x24, 0xa1, 0xd5, 0xe4, 0xce, 0xee, 0x17, 0x60, 0x84, 0xad, 0x4d, 0x31, 0x9a, 0x08, 0xc7, + 0xd6, 0xaf, 0x0a, 0xc7, 0xea, 0xd9, 0x5e, 0xc6, 0x33, 0x49, 0xcd, 0xbd, 0x88, 0xc7, 0x96, 0xba, + 0x97, 0x11, 0x82, 0xf5, 0x20, 0x4a, 0x60, 0xa1, 0xf6, 0xa0, 0xb3, 0x6b, 0xa7, 0x33, 0xe5, 0x29, + 0x59, 0x73, 0x56, 0x61, 0xfa, 0xbe, 0xe3, 0xb6, 0xbc, 0x87, 0x41, 0x8d, 0x06, 0x07, 0xa1, 0xd7, + 0x15, 0x76, 0xc0, 0xa8, 0xe1, 0x7f, 0xc8, 0x6b, 0xac, 0x16, 0xaf, 0x52, 0x9f, 0x43, 0x74, 0x24, + 0xb2, 0x0c, 0x53, 0x5a, 0x08, 0x58, 0xf1, 0x48, 0x89, 0x3a, 0x4e, 0x3d, 0x80, 0xac, 0xaa, 0xe3, + 0xd4, 0x50, 0xd8, 0x29, 0x2d, 0xbe, 0x5f, 0x79, 0xaa, 0x4c, 0x7d, 0xbb, 0x80, 0x21, 0xd7, 0xa0, + 0xc8, 0xe3, 0x84, 0xac, 0xd7, 0xd4, 0xe7, 0xa9, 0x00, 0xcb, 0x12, 0x71, 0x76, 0x24, 0x60, 0x1c, + 0x17, 0x82, 0x3b, 0xc9, 0x99, 0x23, 0x77, 0xbc, 0x16, 0x35, 0x3e, 0x03, 0x65, 0xc1, 0x74, 0xe2, + 0x6c, 0xf1, 0xcf, 0xc1, 0xc8, 0xca, 0x7a, 0xcd, 0x54, 0x19, 0x45, 0xd3, 0x69, 0xf9, 0x26, 0x96, + 0xa2, 0x8f, 0xdc, 0x1d, 0x1a, 0x3e, 0xf4, 0xfc, 0x03, 0x93, 0x06, 0xa1, 0xef, 0xf0, 0xe4, 0x9c, + 0xb8, 0xd5, 0x3e, 0x4b, 0xde, 0x81, 0x51, 0x34, 0x4e, 0x4d, 0xf0, 0xfe, 0x64, 0x1b, 0xcb, 0x53, + 0x62, 0x89, 0x8e, 0xa2, 0xa5, 0xab, 0xc9, 0x91, 0xc8, 0x5b, 0x30, 0x52, 0xa3, 0xee, 0x61, 0x22, + 0x6f, 0x60, 0x0a, 0x39, 0xda, 0xf2, 0x2d, 0xea, 0x1e, 0x9a, 0x88, 0x62, 0xfc, 0x64, 0x1e, 0x4e, + 0x65, 0x7c, 0xd6, 0xbd, 0xcf, 0x3e, 0xa5, 0x7c, 0x6f, 0x59, 0xe3, 0x7b, 0xf2, 0xcd, 0xb9, 0xef, + 0xc0, 0x67, 0xb2, 0xc1, 0xbf, 0x91, 0x83, 0x33, 0xfa, 0x62, 0x15, 0xd6, 0xe8, 0xf7, 0xae, 0x91, + 0xb7, 0x61, 0x6c, 0x8d, 0xda, 0x2d, 0x2a, 0x93, 0x84, 0x9d, 0x8a, 0xa2, 0xfb, 0xf1, 0x30, 0x02, + 0xbc, 0x92, 0x93, 0x8d, 0x9d, 0x4e, 0x79, 0x29, 0xa9, 0x89, 0x8f, 0xe3, 0x02, 0xba, 0x21, 0x83, + 0x93, 0x64, 0x35, 0x35, 0xc0, 0x72, 0xe3, 0xbb, 0x39, 0x78, 0x76, 0x00, 0x0e, 0x9b, 0x38, 0x36, + 0xf5, 0xea, 0xc4, 0xe1, 0x99, 0x89, 0xa5, 0xe4, 0x3d, 0x98, 0xd9, 0x12, 0x02, 0xbe, 0x9c, 0x8e, + 0x7c, 0xbc, 0x77, 0xa4, 0xec, 0x2f, 0x6d, 0x8b, 0xcc, 0x24, 0xb0, 0x16, 0x35, 0xa7, 0x30, 0x30, + 0x6a, 0x8e, 0x1a, 0x84, 0x66, 0x64, 0xd8, 0x20, 0x34, 0x5f, 0x86, 0x79, 0xbd, 0x6f, 0x22, 0x16, + 0x70, 0x1c, 0x82, 0x27, 0xd7, 0x3f, 0x04, 0xcf, 0xc0, 0x88, 0xa3, 0xc6, 0x8f, 0xe7, 0xa0, 0xac, + 0xd3, 0xfe, 0xa4, 0xf3, 0xf9, 0xae, 0x36, 0x9f, 0xcf, 0x66, 0xcf, 0x67, 0xff, 0x89, 0xfc, 0x3f, + 0x72, 0xc9, 0xce, 0x0e, 0x35, 0x83, 0x06, 0x8c, 0xd5, 0xbc, 0x8e, 0xed, 0xc8, 0x89, 0x43, 0x57, + 0x92, 0x16, 0x96, 0x98, 0xa2, 0x66, 0xb8, 0x88, 0x45, 0xe7, 0x61, 0xf4, 0x8e, 0xe7, 0x56, 0x6b, + 0xc2, 0x26, 0x17, 0xe9, 0xb8, 0x9e, 0x6b, 0xd9, 0x2d, 0x93, 0x57, 0x90, 0x0d, 0x80, 0x46, 0xd3, + 0xa7, 0xd4, 0x6d, 0x38, 0x3f, 0x48, 0x13, 0xb2, 0x04, 0x1b, 0xa1, 0x76, 0x0f, 0x19, 0x0b, 0x7f, + 0x4a, 0x45, 0x40, 0x2b, 0x70, 0x7e, 0x50, 0xe5, 0xbd, 0x0a, 0x3e, 0xee, 0x2b, 0x11, 0xd4, 0x2d, + 0x31, 0x0f, 0x57, 0x3f, 0x8d, 0x7d, 0x95, 0xd9, 0x14, 0x8e, 0xf0, 0xd5, 0xcc, 0xe9, 0xf8, 0xad, + 0x1c, 0x3c, 0x3b, 0x00, 0xe7, 0x09, 0xcc, 0xca, 0x1f, 0xf7, 0x80, 0x53, 0x80, 0x18, 0x09, 0xd3, + 0x32, 0x3b, 0xad, 0x90, 0x27, 0xfe, 0x9b, 0x12, 0x69, 0x99, 0x59, 0x81, 0x96, 0x96, 0x99, 0x15, + 0xb0, 0x73, 0x75, 0x8d, 0x3a, 0x7b, 0xfb, 0xdc, 0xe4, 0x6a, 0x8a, 0xf3, 0x86, 0x7d, 0x2c, 0x51, + 0xcf, 0x55, 0x0e, 0x63, 0xfc, 0xeb, 0x31, 0x38, 0x6b, 0xd2, 0x3d, 0x87, 0xdd, 0x3c, 0xb6, 0x03, + 0xc7, 0xdd, 0xd3, 0x82, 0xf8, 0x18, 0x89, 0x9d, 0x2b, 0x32, 0x5e, 0xb0, 0x92, 0x68, 0x25, 0x5e, + 0x82, 0x22, 0x3b, 0x56, 0x95, 0xcd, 0x8b, 0xaf, 0x58, 0xae, 0xd7, 0xa2, 0x22, 0x4a, 0xb4, 0xac, + 0x26, 0xaf, 0x0a, 0x41, 0x48, 0xc9, 0x49, 0xc4, 0x04, 0xa1, 0xef, 0x1d, 0x55, 0xa0, 0x71, 0x18, + 0x84, 0x14, 0x2f, 0xc1, 0x42, 0x18, 0x8a, 0x6e, 0x2b, 0x23, 0x7d, 0x6e, 0x2b, 0x9b, 0x30, 0x5f, + 0x6d, 0xf1, 0xd3, 0xd1, 0x6e, 0xd7, 0x7d, 0xc7, 0x6d, 0x3a, 0x5d, 0xbb, 0x2d, 0x6f, 0xe0, 0x38, + 0xca, 0x76, 0x54, 0x6f, 0x75, 0x23, 0x00, 0x33, 0x13, 0x8d, 0x75, 0xa3, 0x76, 0xa7, 0x81, 0x11, + 0x62, 0xc4, 0x03, 0x25, 0x76, 0xa3, 0xe5, 0x06, 0xd8, 0x8b, 0xc0, 0x8c, 0xaa, 0xf1, 0x9e, 0x84, + 0xcf, 0xd1, 0x5b, 0x1b, 0x8d, 0xdb, 0x22, 0x6b, 0x9a, 0x4c, 0x99, 0xc0, 0x0d, 0x0d, 0xc2, 0x76, + 0x80, 0xe6, 0x8d, 0x1a, 0x5c, 0x8c, 0xd7, 0x68, 0xac, 0x31, 0xbc, 0x62, 0x0a, 0x2f, 0x08, 0xf6, + 0x55, 0x3c, 0x0e, 0x47, 0xae, 0xb0, 0xa5, 0xd0, 0xf1, 0x42, 0x8a, 0x4b, 0x78, 0x22, 0xbe, 0x55, + 0xf9, 0x58, 0xca, 0x6f, 0x55, 0x0a, 0x08, 0x79, 0x07, 0xe6, 0x56, 0x57, 0x96, 0xa4, 0x5a, 0xb9, + 0xe6, 0x35, 0x7b, 0x68, 0x18, 0x00, 0xd8, 0x1e, 0xce, 0x21, 0x6d, 0x2e, 0x31, 0x6e, 0x92, 0x05, + 0x46, 0x2e, 0xc0, 0xf8, 0x7a, 0x8d, 0x8f, 0xfd, 0xa4, 0x9a, 0x17, 0x4c, 0x58, 0x3b, 0xc9, 0x4a, + 0x72, 0x37, 0x16, 0xfb, 0x4b, 0x27, 0xca, 0xe7, 0x67, 0x87, 0x10, 0xf9, 0xdf, 0x82, 0xa9, 0x65, + 0x2f, 0x5c, 0x77, 0x83, 0xd0, 0x76, 0x9b, 0x74, 0xbd, 0xa6, 0x06, 0xe9, 0xde, 0xf1, 0x42, 0xcb, + 0x11, 0x35, 0xec, 0xcb, 0x75, 0x48, 0xf2, 0x79, 0x44, 0xbd, 0x49, 0x5d, 0xea, 0xc7, 0xc1, 0xb9, + 0x47, 0xf9, 0xd8, 0x32, 0xd4, 0xbd, 0xa8, 0xc6, 0xd4, 0x01, 0x89, 0x09, 0xa7, 0x30, 0xc9, 0xbf, + 0xd7, 0x0b, 0xf4, 0xc6, 0x67, 0x62, 0x91, 0xb6, 0x2b, 0x00, 0xac, 0xe4, 0x57, 0x64, 0xa3, 0x8a, + 0x3c, 0x68, 0x3c, 0x7b, 0xe9, 0x8a, 0xd7, 0xa2, 0x01, 0xe7, 0x40, 0xdf, 0x47, 0x79, 0xd0, 0x94, + 0xbe, 0x0d, 0xe0, 0xca, 0xff, 0x31, 0xe6, 0x41, 0x4b, 0xc1, 0x92, 0xcf, 0xc3, 0x28, 0xfe, 0x14, + 0x12, 0xf3, 0x5c, 0x06, 0xd9, 0x58, 0x5a, 0x6e, 0x32, 0x48, 0x93, 0x23, 0x90, 0x75, 0x18, 0x17, + 0xd7, 0xb1, 0xc7, 0xc9, 0xe6, 0x23, 0xee, 0x75, 0x7c, 0xb5, 0x09, 0x7c, 0xa3, 0x05, 0x25, 0xb5, + 0x41, 0xb6, 0xcb, 0xd6, 0xec, 0x60, 0x9f, 0xb6, 0xd8, 0x2f, 0x91, 0x88, 0x0f, 0x77, 0xd9, 0x3e, + 0x96, 0x5a, 0xec, 0x3b, 0x4c, 0x05, 0x84, 0x9d, 0xd3, 0xeb, 0xc1, 0x76, 0x20, 0x3e, 0x45, 0x28, + 0x68, 0x1c, 0x54, 0xf6, 0xb5, 0x4c, 0x51, 0x65, 0xfc, 0x00, 0xcc, 0xdf, 0xe9, 0xb5, 0xdb, 0xf6, + 0x4e, 0x9b, 0xca, 0x44, 0x2d, 0x98, 0x11, 0x7d, 0x19, 0x46, 0x1b, 0x4a, 0x8e, 0xf5, 0x28, 0x59, + 0xa6, 0x02, 0x83, 0xc6, 0xaa, 0x39, 0x8c, 0x00, 0x94, 0xc8, 0xae, 0xce, 0x51, 0x8d, 0xdf, 0xcc, + 0xc1, 0xbc, 0x34, 0x32, 0xf0, 0xed, 0xe6, 0x41, 0x94, 0x68, 0xff, 0x82, 0xb6, 0xd6, 0x70, 0x13, + 0x24, 0x96, 0x11, 0x5f, 0x75, 0xb7, 0xe4, 0x47, 0xe8, 0x42, 0x50, 0xd6, 0x07, 0x9f, 0xf4, 0x31, + 0xe4, 0x1d, 0x98, 0x14, 0x47, 0xae, 0x12, 0x81, 0x13, 0x03, 0x90, 0x89, 0xeb, 0x64, 0xd2, 0xe4, + 0x45, 0x05, 0x47, 0xf9, 0x4e, 0xef, 0xca, 0x27, 0x95, 0x2b, 0xb2, 0xe5, 0x3b, 0xbd, 0x8d, 0x01, + 0x4b, 0xf7, 0x3b, 0x93, 0xc9, 0xb1, 0x15, 0x6b, 0xf7, 0xba, 0x1a, 0x73, 0x2f, 0x17, 0xdf, 0xbc, + 0xe3, 0x98, 0x7b, 0xea, 0xcd, 0x3b, 0x02, 0x8d, 0xe6, 0x24, 0x7f, 0xc2, 0x9c, 0xbc, 0x27, 0xe7, + 0xa4, 0xd0, 0x7f, 0x61, 0xcc, 0x0d, 0x98, 0x87, 0x46, 0xbc, 0x43, 0x46, 0x86, 0x52, 0xc6, 0x3c, + 0x83, 0xc9, 0x05, 0x38, 0x4a, 0x92, 0x33, 0x0b, 0x4a, 0xaa, 0x86, 0x67, 0x74, 0x78, 0xa2, 0x27, + 0xb0, 0xfb, 0x2f, 0x40, 0xa9, 0x1a, 0x86, 0x76, 0x73, 0x9f, 0xb6, 0x6a, 0x8c, 0x3d, 0x29, 0x41, + 0xb5, 0x6c, 0x51, 0xae, 0xbe, 0xcc, 0xa9, 0xb0, 0x3c, 0xdc, 0xad, 0x1d, 0x08, 0x23, 0xd9, 0x28, + 0xdc, 0x2d, 0x2b, 0xd1, 0xc3, 0xdd, 0xb2, 0x12, 0x72, 0x05, 0xc6, 0xd7, 0xdd, 0x07, 0x0e, 0x1b, + 0x13, 0x1e, 0x57, 0x0b, 0x35, 0x5a, 0x0e, 0x2f, 0x52, 0x99, 0xab, 0x80, 0x22, 0x6f, 0x29, 0x17, + 0xa5, 0x89, 0x58, 0x41, 0xc2, 0x15, 0x65, 0x51, 0x0c, 0x1c, 0xf5, 0x12, 0x14, 0xdd, 0x9c, 0xae, + 0xc3, 0xb8, 0xd4, 0x7f, 0x42, 0x7c, 0x82, 0x08, 0xcc, 0x74, 0x08, 0x0a, 0x09, 0x8c, 0x49, 0xd3, + 0x95, 0x84, 0x82, 0x93, 0x4a, 0xd2, 0x74, 0x25, 0xa1, 0xa0, 0x96, 0x34, 0x5d, 0x49, 0x2d, 0x18, + 0xa9, 0x8e, 0x4a, 0x27, 0xaa, 0x8e, 0xee, 0x41, 0xa9, 0x6e, 0xfb, 0xa1, 0xc3, 0xe4, 0x1e, 0x37, + 0x0c, 0x16, 0xa6, 0x34, 0x6d, 0xab, 0x52, 0xb5, 0xfc, 0xbc, 0x4c, 0xdc, 0xdd, 0x55, 0xe0, 0xf5, + 0x0c, 0xd3, 0x71, 0x79, 0xb6, 0x89, 0xec, 0xf4, 0x27, 0x31, 0x91, 0xc5, 0x41, 0x45, 0x0d, 0xdb, + 0x4c, 0xac, 0xf1, 0xc1, 0x8b, 0x50, 0x42, 0xcd, 0x16, 0x01, 0x92, 0xaf, 0x42, 0x89, 0xfd, 0x5d, + 0xf7, 0xda, 0x4e, 0xd3, 0xa1, 0xc1, 0x42, 0x19, 0x3b, 0xf7, 0x7c, 0xe6, 0xee, 0x47, 0xa0, 0xc3, + 0x06, 0x0d, 0xf9, 0x06, 0x46, 0xc2, 0x49, 0xd5, 0xb9, 0x46, 0x8d, 0xbc, 0x0f, 0x25, 0xb6, 0xfa, + 0x76, 0xec, 0x80, 0x8b, 0xbb, 0xb3, 0xb1, 0x91, 0x73, 0x4b, 0x94, 0xa7, 0x22, 0x4e, 0xab, 0x08, + 0xec, 0x98, 0xaf, 0x76, 0x39, 0x83, 0x24, 0xca, 0x6a, 0xef, 0xa6, 0x98, 0xa3, 0x04, 0x23, 0x5f, + 0x84, 0x52, 0xb5, 0xdb, 0x8d, 0x39, 0xce, 0x9c, 0xa2, 0x68, 0xeb, 0x76, 0xad, 0x4c, 0xae, 0xa3, + 0x61, 0x24, 0x19, 0xf3, 0xfc, 0x63, 0x31, 0x66, 0xf2, 0x46, 0x74, 0x03, 0x38, 0x15, 0xeb, 0x82, + 0xc5, 0x65, 0x54, 0xbb, 0x4e, 0xf0, 0xcb, 0xc0, 0x0a, 0x4c, 0x71, 0xe5, 0xa8, 0x94, 0x66, 0x4e, + 0xa7, 0x76, 0x4f, 0x86, 0x50, 0xa3, 0xe3, 0x90, 0x55, 0x98, 0xe6, 0x5e, 0xde, 0x6d, 0x11, 0x0a, + 0x7c, 0xe1, 0x0c, 0xee, 0x5a, 0xa4, 0xc2, 0x9d, 0xc3, 0xdb, 0x98, 0x21, 0xc6, 0xd6, 0xa8, 0x24, + 0x90, 0x8c, 0xdf, 0xcb, 0xc1, 0x99, 0x3e, 0x33, 0x1e, 0x05, 0x8a, 0xce, 0x0d, 0x0e, 0x14, 0xcd, + 0x38, 0x87, 0xae, 0x69, 0xc1, 0xfe, 0xa7, 0x9d, 0xb7, 0x22, 0x79, 0xcb, 0x03, 0x22, 0x92, 0x30, + 0x89, 0xa6, 0x6f, 0x79, 0xa8, 0xd0, 0x2d, 0xa4, 0x0f, 0x21, 0x01, 0xc7, 0x3f, 0x8a, 0x87, 0xd7, + 0x14, 0x39, 0x9e, 0xa2, 0x69, 0xfd, 0xc8, 0xd3, 0x76, 0x70, 0x06, 0x69, 0xe3, 0x28, 0x07, 0x93, + 0xca, 0x3e, 0x24, 0xe7, 0x15, 0xd7, 0xe0, 0x32, 0xcf, 0x12, 0xa6, 0x50, 0xc8, 0xf3, 0x93, 0x08, + 0x37, 0x55, 0xfe, 0x64, 0xb5, 0x35, 0x46, 0x22, 0x53, 0x82, 0x69, 0x27, 0x82, 0x90, 0x61, 0x3d, + 0xf9, 0x10, 0x60, 0xc3, 0x0e, 0xc2, 0x6a, 0x33, 0x74, 0x1e, 0xd0, 0x21, 0x0e, 0x1d, 0x19, 0x5e, + 0xf0, 0x14, 0xe6, 0xa5, 0xb0, 0x11, 0x2d, 0x71, 0x46, 0x28, 0x04, 0x8d, 0xbf, 0x90, 0x03, 0xd8, + 0x5e, 0x5f, 0xc1, 0x68, 0xf8, 0x9f, 0x54, 0x28, 0xc8, 0x8e, 0x30, 0x2c, 0xa9, 0x0f, 0x10, 0x07, + 0xfe, 0xc7, 0x1c, 0x4c, 0xeb, 0x60, 0xe4, 0x3d, 0x98, 0x69, 0x34, 0x7d, 0xaf, 0xdd, 0xde, 0xb1, + 0x9b, 0x07, 0x1b, 0x8e, 0x4b, 0x79, 0xd4, 0xd5, 0x51, 0x7e, 0x16, 0x05, 0x51, 0x95, 0xd5, 0x66, + 0x75, 0x66, 0x12, 0x98, 0xfc, 0xc5, 0x1c, 0x4c, 0x35, 0xf6, 0xbd, 0x87, 0x51, 0x10, 0x53, 0x31, + 0x21, 0x1f, 0xb2, 0xbd, 0x1d, 0xec, 0x7b, 0x0f, 0xe3, 0x14, 0xa3, 0x9a, 0x85, 0xe9, 0xbb, 0xc3, + 0x3d, 0xfe, 0x37, 0x3d, 0xbc, 0x8f, 0x84, 0xc1, 0x65, 0xad, 0x11, 0x53, 0x6f, 0xd3, 0xf8, 0xa3, + 0x1c, 0x4c, 0xe2, 0xcd, 0xa5, 0xdd, 0x46, 0x99, 0xeb, 0xfb, 0x29, 0x5f, 0x65, 0xd4, 0xaf, 0x01, + 0x13, 0xfb, 0x26, 0xcc, 0x24, 0xc0, 0x88, 0x01, 0x63, 0x0d, 0xf4, 0xfa, 0x57, 0x95, 0x1e, 0x3c, + 0x0e, 0x80, 0x29, 0x6a, 0x8c, 0x55, 0x05, 0xed, 0xde, 0x55, 0x7c, 0x0c, 0x5e, 0x02, 0x70, 0x64, + 0x91, 0xbc, 0xd9, 0x90, 0xe4, 0x97, 0xdc, 0xbb, 0x6a, 0x2a, 0x50, 0xc6, 0x1d, 0x18, 0x6b, 0x78, + 0x7e, 0xb8, 0x7c, 0xc8, 0x2f, 0x13, 0x35, 0x1a, 0x34, 0xd5, 0xd7, 0x5e, 0x07, 0xdf, 0x62, 0x9a, + 0xa6, 0xa8, 0x22, 0x15, 0x18, 0xbd, 0xe1, 0xd0, 0x76, 0x4b, 0xb5, 0x02, 0xde, 0x65, 0x05, 0x26, + 0x2f, 0x67, 0x17, 0xae, 0xd3, 0x71, 0xd2, 0x98, 0xd8, 0xdc, 0xf8, 0x93, 0xee, 0x9b, 0x15, 0x6d, + 0x7c, 0x5f, 0x88, 0x12, 0x35, 0xa4, 0x5b, 0x1a, 0x30, 0xd4, 0xff, 0x30, 0x07, 0x8b, 0xfd, 0x51, + 0x54, 0x0b, 0xe6, 0xdc, 0x00, 0x0b, 0xe6, 0x97, 0x93, 0xaf, 0x93, 0x08, 0x26, 0x5e, 0x27, 0xe3, + 0x37, 0xc9, 0x1a, 0x1a, 0x90, 0x37, 0xa9, 0xcc, 0x14, 0x73, 0x7e, 0xc0, 0x37, 0x23, 0x20, 0x9f, + 0xe6, 0x10, 0x71, 0x4c, 0x81, 0x6b, 0xfc, 0xda, 0x08, 0x9c, 0xed, 0x8b, 0x41, 0xd6, 0x94, 0xfc, + 0x53, 0xd3, 0x51, 0xe6, 0x9b, 0xbe, 0xf0, 0x97, 0xf1, 0x5f, 0xb4, 0x11, 0x4c, 0x7a, 0xa5, 0xdd, + 0x8d, 0xf2, 0x0e, 0xe5, 0x91, 0xd6, 0x6b, 0x27, 0xd2, 0xe2, 0xe0, 0x48, 0x0c, 0xd2, 0x29, 0x88, + 0xd0, 0x7f, 0x91, 0x86, 0xb6, 0xd3, 0x0e, 0xd4, 0x6d, 0xd7, 0xe2, 0x45, 0xa6, 0xac, 0x8b, 0xcd, + 0xca, 0x47, 0xb2, 0xcd, 0xca, 0x8d, 0xff, 0x2f, 0x07, 0x13, 0xd1, 0x67, 0x93, 0x45, 0x38, 0xbd, + 0x65, 0x56, 0x57, 0x56, 0xad, 0xad, 0x2f, 0xd7, 0x57, 0xad, 0xed, 0x3b, 0x8d, 0xfa, 0xea, 0xca, + 0xfa, 0x8d, 0xf5, 0xd5, 0x5a, 0xf9, 0x19, 0x32, 0x0b, 0xff, 0x3f, 0x7b, 0xdf, 0x16, 0x23, 0xc9, + 0x91, 0x1c, 0xb6, 0xd5, 0xdd, 0x33, 0xd3, 0x13, 0xf3, 0xaa, 0xc9, 0x9d, 0xdd, 0x9d, 0x7d, 0xef, + 0x16, 0xc9, 0x15, 0x39, 0x3c, 0xf2, 0xb8, 0x4b, 0xf3, 0xc8, 0x3d, 0xf1, 0xa1, 0x9a, 0xee, 0x9a, + 0x99, 0xde, 0xed, 0x17, 0xb3, 0x7a, 0x76, 0xb5, 0x47, 0x49, 0xa5, 0xda, 0xee, 0x9a, 0x99, 0xe2, + 0xf6, 0x74, 0x35, 0xbb, 0xaa, 0xb9, 0x9c, 0x83, 0x01, 0x9f, 0x20, 0xf8, 0x04, 0x58, 0x96, 0x75, + 0x96, 0xcf, 0x30, 0x21, 0xd8, 0x90, 0x01, 0x1f, 0x0c, 0x7d, 0x08, 0xf0, 0xaf, 0xe1, 0xfb, 0x3a, + 0xf8, 0x47, 0xc0, 0x41, 0x86, 0x0d, 0xff, 0x9d, 0x0c, 0x42, 0x3a, 0xc3, 0x86, 0x21, 0xf8, 0x4f, + 0xb0, 0x3f, 0x04, 0x08, 0x30, 0x32, 0x32, 0xb3, 0x2a, 0xab, 0xba, 0xba, 0x77, 0xf6, 0xc8, 0xb3, + 0x2d, 0x40, 0x5f, 0x33, 0x1d, 0x19, 0x11, 0x95, 0xef, 0x8c, 0x8c, 0x88, 0x8c, 0x58, 0xd9, 0x6f, + 0xde, 0x6f, 0xb6, 0x1e, 0x36, 0x1d, 0x8b, 0xd2, 0x16, 0xd5, 0x35, 0xb2, 0x02, 0x8b, 0x74, 0xdb, + 0xac, 0x38, 0xcd, 0x56, 0xd5, 0xd2, 0x0b, 0x44, 0x87, 0xe5, 0x4a, 0xab, 0xd9, 0xb4, 0x2a, 0x9d, + 0xda, 0x83, 0x5a, 0xe7, 0x91, 0x5e, 0x24, 0x04, 0x56, 0x11, 0xa1, 0x4d, 0x6b, 0xcd, 0x4a, 0xad, + 0x6d, 0xd6, 0xf5, 0x12, 0x83, 0x31, 0x7c, 0x05, 0x36, 0x17, 0x33, 0xba, 0xbf, 0xbf, 0x6d, 0xe9, + 0xf3, 0x0c, 0x85, 0xfd, 0xa7, 0xa0, 0x2c, 0xb0, 0xcf, 0x23, 0x4a, 0xd5, 0xec, 0x98, 0xdb, 0xa6, + 0x6d, 0xe9, 0x65, 0x72, 0x01, 0xce, 0xa6, 0x40, 0x4e, 0xbd, 0xb5, 0x5b, 0x6b, 0xea, 0x8b, 0x64, + 0x03, 0xf4, 0x18, 0x56, 0xdd, 0x76, 0xf6, 0x6d, 0x8b, 0xea, 0x90, 0x85, 0x36, 0xcd, 0x86, 0xa5, + 0x2f, 0x19, 0xef, 0xf1, 0xf7, 0x82, 0xbc, 0xab, 0xc9, 0x79, 0x20, 0x76, 0xc7, 0xec, 0xec, 0xdb, + 0x99, 0xc6, 0x2f, 0xc1, 0x82, 0xbd, 0x5f, 0xa9, 0x58, 0xb6, 0xad, 0x6b, 0x04, 0x60, 0x7e, 0xc7, + 0xac, 0xd5, 0xad, 0xaa, 0x5e, 0x30, 0xbe, 0xa7, 0xc1, 0xba, 0x94, 0x00, 0xa5, 0x21, 0xea, 0x4b, + 0xae, 0xc5, 0xf7, 0x53, 0x17, 0x5b, 0xf9, 0xf8, 0x2b, 0xf3, 0x91, 0x19, 0xcb, 0xf0, 0x9f, 0x6b, + 0x70, 0x2e, 0x17, 0x9b, 0x3c, 0x02, 0x5d, 0xd6, 0xa0, 0xe1, 0x46, 0xdd, 0xa3, 0x64, 0x1f, 0xbb, + 0x96, 0xf9, 0x4a, 0x06, 0x8d, 0xab, 0x4a, 0x93, 0x8c, 0xd8, 0x13, 0x6c, 0x4e, 0x9f, 0xaf, 0xc1, + 0xf8, 0x5c, 0x83, 0x0b, 0x53, 0x3e, 0x43, 0x2a, 0x30, 0x1f, 0x67, 0xee, 0x99, 0xe1, 0x26, 0xb7, + 0xf1, 0x93, 0x2f, 0xae, 0x0b, 0x44, 0x4c, 0x21, 0x8c, 0xff, 0xd1, 0xf9, 0x38, 0x15, 0x0f, 0xe6, + 0xc3, 0xe1, 0xdd, 0x77, 0x31, 0xd3, 0xf3, 0xe2, 0x4b, 0xe6, 0x43, 0x7b, 0x7b, 0x49, 0xf4, 0x5d, + 0xd1, 0x7d, 0x1a, 0x62, 0x42, 0x1c, 0xe3, 0xfb, 0x1a, 0x13, 0xee, 0xb2, 0x88, 0x4c, 0xe6, 0x35, + 0xc3, 0x70, 0x7c, 0xec, 0xd1, 0xa0, 0xef, 0x99, 0xb4, 0x29, 0x8e, 0x0d, 0x94, 0x56, 0x5d, 0x2c, + 0xc0, 0x6b, 0x85, 0xe3, 0x8e, 0x52, 0xcf, 0xfd, 0x53, 0x34, 0xe4, 0x2e, 0x80, 0xf5, 0x59, 0xe4, + 0x8d, 0x06, 0x6e, 0x3f, 0x0e, 0xdc, 0xc2, 0x23, 0x5a, 0x09, 0x68, 0x5a, 0xde, 0x56, 0x90, 0x8d, + 0xef, 0x6a, 0xb0, 0x2c, 0x2e, 0x4d, 0x66, 0xdf, 0x1b, 0x45, 0x5f, 0x6e, 0x7a, 0xdd, 0x4d, 0x4d, + 0xaf, 0xf8, 0x55, 0x88, 0xc2, 0x9f, 0x15, 0xe7, 0xce, 0xac, 0xff, 0xa0, 0x81, 0x9e, 0x45, 0x24, + 0xef, 0x43, 0xd9, 0xf6, 0x3e, 0xf5, 0x46, 0x7e, 0x74, 0x22, 0x36, 0x4a, 0x99, 0xe3, 0x90, 0xe3, + 0x88, 0x32, 0x3e, 0x1f, 0x42, 0xf1, 0x8b, 0xc6, 0x34, 0xa7, 0xdd, 0xef, 0x15, 0xb5, 0x47, 0xf1, + 0xab, 0x52, 0x7b, 0x18, 0x7f, 0x56, 0x80, 0x0b, 0xbb, 0x5e, 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, 0x5b, + 0xb0, 0x8a, 0x11, 0xfd, 0xc7, 0x6c, 0x39, 0x78, 0x3d, 0xa1, 0xfe, 0x29, 0xd3, 0x0c, 0x94, 0x6c, + 0x81, 0xce, 0x20, 0x66, 0xf7, 0xc9, 0x20, 0x78, 0xda, 0xf7, 0x7a, 0x87, 0x5e, 0x0f, 0x8f, 0xf5, + 0x32, 0x9d, 0x80, 0x4b, 0x9e, 0xfb, 0x03, 0x7e, 0x75, 0xf3, 0x7a, 0xa8, 0xa3, 0x11, 0x3c, 0x13, + 0xe8, 0xa5, 0xbb, 0xb0, 0xf4, 0x33, 0xa6, 0x48, 0x33, 0xfe, 0x54, 0x83, 0x0d, 0x6c, 0x9c, 0xf2, + 0x61, 0x99, 0xbe, 0x56, 0xf6, 0x96, 0x92, 0x35, 0xc8, 0x65, 0xa0, 0xf4, 0x52, 0x88, 0x7b, 0x31, + 0xd1, 0x09, 0x15, 0x4e, 0xa1, 0x13, 0xb2, 0x9f, 0x27, 0x55, 0xff, 0x29, 0x55, 0x5a, 0xf7, 0x4a, + 0xe5, 0xa2, 0x5e, 0x4a, 0x86, 0xdc, 0xf8, 0xcd, 0x02, 0x2c, 0x50, 0x0f, 0x73, 0x98, 0x93, 0x5b, + 0xb0, 0xd0, 0x0c, 0x22, 0x2f, 0x6c, 0xa4, 0x12, 0xd6, 0x0f, 0x18, 0xc8, 0x39, 0xee, 0x51, 0x59, + 0xc8, 0x26, 0x7c, 0x7b, 0x14, 0xf4, 0xc6, 0xdd, 0x48, 0x9d, 0xf0, 0x43, 0x0e, 0xa2, 0xb2, 0x8c, + 0x7c, 0x0d, 0x16, 0x05, 0xe7, 0xd8, 0x50, 0x8c, 0x1e, 0xcf, 0x23, 0x2f, 0xce, 0x81, 0x9f, 0x20, + 0xa0, 0x4c, 0xcb, 0x05, 0x8c, 0x92, 0x22, 0xd3, 0x4e, 0xc8, 0x0c, 0x52, 0x54, 0x9f, 0x9b, 0x21, + 0xaa, 0xbf, 0x01, 0xf3, 0x66, 0x18, 0x7a, 0x91, 0x8c, 0x76, 0xb0, 0x1c, 0x87, 0x8b, 0x0b, 0xbd, + 0x88, 0x33, 0x76, 0xb1, 0x9c, 0x0a, 0x3c, 0xe3, 0x2f, 0x0b, 0x30, 0x87, 0xff, 0xa2, 0x19, 0x76, + 0xd4, 0x3d, 0x4a, 0x99, 0x61, 0x47, 0xdd, 0x23, 0x8a, 0x50, 0x72, 0x1b, 0x35, 0x15, 0x32, 0xc1, + 0x95, 0x68, 0x3d, 0xaa, 0xe0, 0x7b, 0x09, 0x98, 0xaa, 0x38, 0xb1, 0xd7, 0x40, 0x31, 0x37, 0xc6, + 0xc9, 0x79, 0x28, 0xb4, 0x6c, 0xd1, 0x62, 0x0c, 0x93, 0x15, 0x84, 0xb4, 0xd0, 0xb2, 0xb1, 0x37, + 0xf6, 0xcc, 0x3b, 0x6f, 0x7d, 0x43, 0x34, 0x94, 0xf7, 0xc6, 0x91, 0x7b, 0xe7, 0xad, 0x6f, 0x50, + 0x51, 0xc2, 0xfa, 0x17, 0xeb, 0x8c, 0xc6, 0x5c, 0xfe, 0x96, 0x1f, 0xfb, 0x17, 0xdb, 0x86, 0x86, + 0x5b, 0x9a, 0x20, 0x90, 0x3b, 0xb0, 0x24, 0x62, 0x42, 0x20, 0xbe, 0x12, 0xb3, 0x41, 0xc4, 0x8c, + 0xe0, 0x14, 0x2a, 0x12, 0x37, 0xeb, 0x89, 0x01, 0x92, 0x69, 0x78, 0x85, 0x59, 0x4f, 0x0e, 0x61, + 0x48, 0x15, 0x14, 0x56, 0x25, 0x6e, 0x17, 0x4c, 0xde, 0xe8, 0x63, 0x95, 0x84, 0xf1, 0x10, 0xb3, + 0x27, 0xc4, 0x08, 0xc6, 0x1f, 0x16, 0xa0, 0xdc, 0xee, 0x8f, 0x0f, 0xfd, 0xc1, 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, 0x5d, 0x58, 0xea, 0x8e, 0x3c, + 0xb4, 0x64, 0xba, 0xfd, 0x24, 0x8b, 0xbb, 0x4a, 0x59, 0x49, 0xca, 0x1f, 0xdc, 0xa6, 0x2a, 0xba, + 0xf1, 0xfd, 0x45, 0x58, 0x56, 0xeb, 0x43, 0x28, 0x9c, 0x0d, 0xfb, 0xec, 0xee, 0x2e, 0x9c, 0xd9, + 0x86, 0x58, 0x28, 0x8e, 0xd3, 0x1b, 0xe9, 0x0a, 0x31, 0x3c, 0xee, 0xd9, 0x26, 0x83, 0x59, 0xec, + 0x9d, 0xa1, 0xeb, 0x61, 0x02, 0xe6, 0x78, 0xc4, 0x84, 0x72, 0x30, 0x0c, 0x0f, 0xbd, 0x81, 0x2f, + 0xed, 0x2d, 0x2f, 0xa4, 0x18, 0xb5, 0x44, 0xe1, 0x04, 0xaf, 0x98, 0x8c, 0xbc, 0x05, 0xf3, 0xc1, + 0xd0, 0x1b, 0xb8, 0xbe, 0x38, 0xe3, 0x2e, 0x67, 0x18, 0x78, 0x03, 0xb3, 0xa6, 0x10, 0x0a, 0x64, + 0xf2, 0x75, 0x28, 0x05, 0x4f, 0xe2, 0xf1, 0xba, 0x98, 0x26, 0x7a, 0x12, 0xb9, 0x0a, 0x09, 0x22, + 0x32, 0x82, 0x8f, 0xdd, 0xe3, 0x03, 0x31, 0x62, 0x69, 0x82, 0x7b, 0xee, 0xf1, 0x81, 0x4a, 0xc0, + 0x10, 0xc9, 0x07, 0x00, 0x43, 0xf7, 0xd0, 0x1b, 0x39, 0xbd, 0x71, 0x74, 0x22, 0xc6, 0xed, 0x5a, + 0x8a, 0xac, 0xcd, 0x8a, 0xab, 0xe3, 0xe8, 0x44, 0xa1, 0x5d, 0x1c, 0x4a, 0x20, 0x31, 0x01, 0x8e, + 0xdd, 0x28, 0xf2, 0x46, 0xc7, 0x81, 0xf0, 0x26, 0x4c, 0x82, 0x1f, 0x72, 0x06, 0x8d, 0xb8, 0x58, + 0xe1, 0xa0, 0x10, 0x61, 0xa5, 0xfd, 0x91, 0x2b, 0x92, 0xee, 0x67, 0x2a, 0xed, 0x8f, 0x52, 0xad, + 0x64, 0x88, 0xe4, 0x1d, 0x58, 0xe8, 0xf9, 0x61, 0x37, 0x18, 0xf5, 0x44, 0x94, 0x93, 0x2b, 0x29, + 0x9a, 0x2a, 0x2f, 0x53, 0xc8, 0x24, 0x3a, 0xab, 0xad, 0x08, 0x7e, 0xda, 0x0c, 0x9e, 0xa2, 0x9a, + 0x3f, 0x5b, 0x5b, 0x3b, 0x2e, 0x56, 0x6b, 0x9b, 0x10, 0xb1, 0xa1, 0x3c, 0xf4, 0xa3, 0xbe, 0xfb, + 0x58, 0xd8, 0xce, 0xd3, 0x43, 0xb9, 0x8b, 0x45, 0xea, 0x50, 0x72, 0x64, 0x72, 0x17, 0xca, 0xde, + 0x20, 0x1a, 0xb9, 0x8e, 0xdf, 0x13, 0x4f, 0x31, 0xd3, 0x95, 0x66, 0x07, 0xb0, 0x5b, 0xab, 0xaa, + 0x95, 0x46, 0xfc, 0x5a, 0x8f, 0xf5, 0x4f, 0xd8, 0xf5, 0x8f, 0xc5, 0x0b, 0xca, 0x74, 0xff, 0xd8, + 0x95, 0x5a, 0x43, 0xed, 0x1f, 0x86, 0x48, 0xde, 0x87, 0x05, 0xb6, 0x7e, 0x7b, 0xc1, 0xa1, 0x08, + 0x34, 0x61, 0xa4, 0xfb, 0x87, 0x97, 0x4d, 0x4c, 0x57, 0x49, 0xc4, 0x16, 0xb2, 0xfb, 0x34, 0x74, + 0xfc, 0x2e, 0xc6, 0xc4, 0xcc, 0x2e, 0x47, 0xf3, 0xa1, 0x5d, 0xab, 0x28, 0x64, 0x73, 0xee, 0xd3, + 0xb0, 0xd6, 0x25, 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, 0xd8, + 0xf8, 0x52, 0x45, 0xad, 0xa2, 0x40, 0x67, 0x55, 0x1c, 0x78, 0x91, 0xe3, 0x7f, 0x22, 0x32, 0x38, + 0xa4, 0x3f, 0xd7, 0xf4, 0xa2, 0xda, 0x87, 0xea, 0xe7, 0x06, 0x5e, 0x54, 0xfb, 0x44, 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, 0x59, 0xfa, 0x1f, 0xff, 0xf2, 0xba, + 0xb6, 0x0d, 0x50, 0x96, 0x51, 0x73, 0x98, 0x3c, 0xbd, 0x91, 0xc7, 0x94, 0xdc, 0x84, 0x65, 0x35, + 0xa6, 0x8f, 0xd8, 0xd5, 0x97, 0xdc, 0xa1, 0x2f, 0xa3, 0xfa, 0xcc, 0x4e, 0x84, 0xf0, 0x2a, 0xac, + 0xa7, 0x9e, 0x00, 0x25, 0x0e, 0x81, 0x54, 0x57, 0x0b, 0xf0, 0x10, 0xad, 0x00, 0x84, 0x91, 0x3b, + 0x8a, 0x9c, 0x9e, 0x1b, 0x9d, 0x46, 0xbd, 0x5b, 0x66, 0x1b, 0x33, 0xf7, 0xb8, 0x46, 0xba, 0xaa, + 0x1b, 0x79, 0xbc, 0x71, 0x46, 0x1d, 0x2e, 0x4e, 0xdd, 0x34, 0xc9, 0x2b, 0xa0, 0x1f, 0xb8, 0x42, + 0x65, 0xda, 0x3d, 0x72, 0x07, 0x03, 0xaf, 0x2f, 0x1a, 0xb6, 0x26, 0xe1, 0x15, 0x0e, 0x16, 0xdc, + 0x3e, 0x50, 0x7a, 0x47, 0x59, 0x2d, 0xa7, 0xe8, 0x1d, 0xc1, 0xe0, 0x87, 0x1a, 0x5c, 0x99, 0xb5, + 0xf7, 0x92, 0x4b, 0x50, 0x1e, 0x8e, 0xfc, 0x00, 0x65, 0x7c, 0xd1, 0x87, 0xf2, 0x37, 0xe6, 0x89, + 0x40, 0x61, 0x34, 0x72, 0x0f, 0xc5, 0x9b, 0x1a, 0xba, 0x88, 0x90, 0x8e, 0x7b, 0x18, 0xb2, 0x2e, + 0xee, 0x79, 0x07, 0xee, 0xb8, 0x1f, 0x39, 0x61, 0xf7, 0xc8, 0xeb, 0xe1, 0xab, 0x37, 0xf4, 0xa4, + 0xa4, 0xba, 0x28, 0xb0, 0x25, 0x7c, 0xa2, 0xc6, 0x73, 0x53, 0x6a, 0x7c, 0xaf, 0x54, 0xd6, 0xf4, + 0x02, 0x45, 0xd7, 0x35, 0xe3, 0x3b, 0x05, 0xd8, 0x9c, 0xb6, 0xd9, 0x90, 0xf7, 0xf2, 0xfa, 0x80, + 0x5b, 0x7d, 0x54, 0xb8, 0x6a, 0xf5, 0x51, 0x67, 0xcf, 0x1d, 0x88, 0xdf, 0xac, 0x3d, 0x2b, 0xfe, + 0x84, 0x84, 0x31, 0x9a, 0xa1, 0x1b, 0x86, 0x4f, 0xd9, 0x7e, 0x5a, 0x54, 0xa2, 0x10, 0x0b, 0x98, + 0x4a, 0x23, 0x61, 0xe4, 0x6d, 0x80, 0x6e, 0x3f, 0x08, 0x3d, 0x74, 0xae, 0x10, 0x82, 0x1a, 0xf7, + 0xc4, 0x8f, 0xa1, 0xaa, 0x35, 0x1d, 0xa1, 0x95, 0xa0, 0x27, 0xe7, 0x93, 0x0b, 0x17, 0xa6, 0x9c, + 0x2e, 0x6c, 0x78, 0xf0, 0x11, 0x1a, 0xdf, 0x4c, 0x44, 0xfe, 0x2f, 0x06, 0xe1, 0x79, 0x6b, 0xb2, + 0x3d, 0x5e, 0x98, 0x36, 0x47, 0x4e, 0x80, 0x4c, 0x1e, 0x21, 0x8c, 0xbb, 0xf0, 0x3c, 0x1f, 0x8f, + 0x62, 0xee, 0x1c, 0xb2, 0x3f, 0xea, 0x93, 0xeb, 0xb0, 0x24, 0x33, 0x95, 0xb2, 0x8b, 0x10, 0x67, + 0x0e, 0x02, 0x74, 0xdf, 0xc3, 0xc9, 0x83, 0x31, 0x60, 0xf1, 0x65, 0xa2, 0x58, 0x79, 0x8b, 0x08, + 0xe9, 0x9c, 0x0c, 0x65, 0xeb, 0xae, 0xc8, 0xf9, 0x9d, 0x3e, 0xd8, 0x45, 0xe9, 0x3f, 0xd5, 0xe4, + 0xf0, 0x4f, 0x9e, 0x8c, 0xcf, 0xaa, 0x1f, 0x01, 0x7c, 0x18, 0x26, 0x2a, 0x86, 0xff, 0x33, 0x91, + 0x4f, 0xae, 0x3a, 0x21, 0xf2, 0x89, 0x9f, 0xe4, 0x16, 0xac, 0x8d, 0xb8, 0x63, 0x71, 0x14, 0x88, + 0xfe, 0xe4, 0x69, 0x51, 0x56, 0x38, 0xb8, 0x13, 0x60, 0x9f, 0x8a, 0x7a, 0xdd, 0x8b, 0x3b, 0x4c, + 0x11, 0x14, 0xc8, 0xeb, 0xb0, 0xc8, 0x04, 0x05, 0x0c, 0x3f, 0x94, 0x79, 0x91, 0x82, 0x78, 0x28, + 0x76, 0xd1, 0xf2, 0xc7, 0xe2, 0x7f, 0xc1, 0xeb, 0xdf, 0x16, 0x24, 0x33, 0x55, 0x4c, 0x21, 0x17, + 0x60, 0x21, 0x18, 0x1d, 0x2a, 0x4d, 0x9b, 0x0f, 0x46, 0x87, 0xac, 0x5d, 0x2f, 0x83, 0xce, 0x1f, + 0x48, 0xf1, 0x40, 0x15, 0xe1, 0xc9, 0x80, 0xeb, 0x31, 0xca, 0x74, 0x95, 0xc3, 0xf7, 0x43, 0x6f, + 0x64, 0x9f, 0x0c, 0xba, 0x0c, 0x33, 0x0c, 0x03, 0x47, 0x8d, 0x22, 0x26, 0x9a, 0xbd, 0x1a, 0x86, + 0x41, 0x12, 0x4e, 0xac, 0x47, 0xb6, 0x61, 0x85, 0xf1, 0x89, 0x63, 0x99, 0x89, 0x1d, 0xf0, 0xea, + 0xa4, 0x14, 0x75, 0x32, 0xe8, 0xca, 0x2a, 0xd2, 0xe5, 0x50, 0xf9, 0x45, 0xee, 0x83, 0xae, 0x88, + 0x9b, 0xf8, 0x62, 0x36, 0xe3, 0xe4, 0x9e, 0xb0, 0x51, 0xc4, 0xd4, 0xda, 0xe0, 0x20, 0xa0, 0x6b, + 0xdd, 0x34, 0x20, 0xde, 0x09, 0xe6, 0xf5, 0x05, 0xba, 0x29, 0x9a, 0x1b, 0xa2, 0xf7, 0xa4, 0xd3, + 0x0f, 0x0e, 0x1d, 0xef, 0x33, 0x36, 0x26, 0xc6, 0x1f, 0x68, 0x72, 0xaf, 0xcd, 0x61, 0x4a, 0x0c, + 0x58, 0x39, 0x72, 0x43, 0x27, 0x0c, 0x8f, 0xb9, 0x53, 0x9f, 0x08, 0xa5, 0xbc, 0x74, 0xe4, 0x86, + 0x76, 0x78, 0x2c, 0xf3, 0xb6, 0x9c, 0x63, 0x38, 0x81, 0x3b, 0x8e, 0x8e, 0x1c, 0x55, 0xb8, 0xe6, + 0x3d, 0x7a, 0xf6, 0xc8, 0x0d, 0x5b, 0xac, 0x4c, 0xe1, 0x4d, 0x5e, 0x84, 0x55, 0xe4, 0xdb, 0xf5, + 0x25, 0x63, 0x0c, 0x46, 0x42, 0x97, 0x19, 0xe3, 0xae, 0xcf, 0x39, 0x8b, 0xc1, 0xfd, 0x71, 0x09, + 0xce, 0xe7, 0xf7, 0x1e, 0x4e, 0x5f, 0xd6, 0xe7, 0xf8, 0x6c, 0x52, 0xd4, 0x6d, 0x91, 0x41, 0x78, + 0x20, 0x99, 0xbc, 0xc1, 0x2b, 0xe4, 0x0e, 0xde, 0x16, 0xac, 0x23, 0x23, 0x21, 0xc6, 0xf7, 0xfd, + 0x30, 0x12, 0xf1, 0x51, 0xe8, 0x1a, 0x2b, 0xe0, 0xfb, 0x7d, 0x9d, 0x81, 0xc9, 0x4b, 0xb0, 0x2a, + 0x77, 0xec, 0xe0, 0xe9, 0x80, 0x7d, 0x98, 0x6f, 0xd7, 0x2b, 0x02, 0xda, 0x42, 0x20, 0x39, 0x07, + 0xf3, 0xee, 0x70, 0xc8, 0x3e, 0xc9, 0x77, 0xe9, 0x39, 0x77, 0x38, 0xe4, 0xb9, 0x85, 0xf0, 0x91, + 0xa8, 0x73, 0x80, 0x2e, 0x58, 0xc2, 0x87, 0x94, 0x2e, 0x23, 0x90, 0xbb, 0x65, 0x85, 0x6c, 0x5f, + 0x60, 0xb4, 0x12, 0x65, 0x01, 0x51, 0xc0, 0x1d, 0xc6, 0x08, 0x17, 0xa1, 0x2c, 0x9d, 0x01, 0xf8, + 0xab, 0x18, 0xba, 0xe0, 0x0a, 0x47, 0x80, 0xb7, 0xe0, 0x42, 0xcf, 0x0f, 0xc5, 0x68, 0xb3, 0x26, + 0x0d, 0x87, 0xe2, 0x59, 0x2a, 0x0f, 0x63, 0x4c, 0x37, 0x44, 0x31, 0xeb, 0x49, 0x73, 0x38, 0x8c, + 0x1f, 0xa7, 0x5e, 0x92, 0x64, 0x8f, 0x7d, 0x1e, 0xaf, 0x8d, 0x3b, 0xc4, 0xe2, 0xe2, 0x00, 0xa4, + 0xdc, 0x14, 0x18, 0xdb, 0x2a, 0x82, 0x5c, 0x26, 0xf1, 0x4a, 0x72, 0xb8, 0xf2, 0x50, 0x48, 0x2e, + 0x68, 0x32, 0xc6, 0x41, 0x43, 0x28, 0x79, 0x1b, 0xa6, 0xce, 0x45, 0x94, 0x70, 0xcb, 0xf4, 0x1c, + 0x2f, 0xe7, 0x8e, 0xbe, 0xf5, 0xe0, 0xd0, 0xc2, 0x42, 0xf2, 0x01, 0x5c, 0x91, 0x15, 0x74, 0xc3, + 0xd0, 0x3f, 0x1c, 0x38, 0x72, 0x14, 0xd0, 0x17, 0x03, 0xa5, 0xdc, 0x32, 0xbd, 0x28, 0x70, 0x4c, + 0x44, 0xa9, 0x72, 0x0c, 0x7c, 0xd6, 0x28, 0x66, 0xd3, 0x3b, 0xb0, 0x26, 0x04, 0x76, 0x21, 0x24, + 0x60, 0x6f, 0x8b, 0x2d, 0x8c, 0xdd, 0xa4, 0x45, 0xbe, 0x2a, 0x10, 0xa0, 0x5a, 0x4f, 0x52, 0xfe, + 0x17, 0x0d, 0xce, 0xe5, 0x4a, 0xfc, 0xe4, 0xd7, 0x81, 0xbf, 0x33, 0x8c, 0x02, 0x67, 0xe4, 0x75, + 0xfd, 0xa1, 0x8f, 0x81, 0x5b, 0xb8, 0x46, 0xfc, 0xce, 0xac, 0xbb, 0x02, 0xbe, 0x59, 0xec, 0x04, + 0x34, 0x26, 0xe2, 0xaa, 0x3a, 0x7d, 0x94, 0x01, 0x5f, 0xfa, 0x08, 0xce, 0xe5, 0xa2, 0xe6, 0xa8, + 0xd0, 0xbe, 0x96, 0x4e, 0x96, 0x2e, 0x6d, 0x9c, 0x99, 0x46, 0x2b, 0xaa, 0x35, 0xd1, 0xbc, 0x1f, + 0xc5, 0xcd, 0xcb, 0xdc, 0x0d, 0x88, 0x95, 0xdd, 0xd9, 0xf2, 0xae, 0xb7, 0x92, 0x68, 0xfa, 0xe6, + 0xf6, 0x11, 0x9c, 0x13, 0xcb, 0xeb, 0x70, 0xe4, 0x0e, 0x8f, 0x12, 0x76, 0xbc, 0xa2, 0xbf, 0x90, + 0xc7, 0x8e, 0xaf, 0xbb, 0x5d, 0x86, 0x1f, 0x73, 0x3d, 0xeb, 0x4e, 0x02, 0x45, 0x1b, 0x7e, 0xa3, + 0x20, 0x37, 0xb3, 0x9c, 0xea, 0xe4, 0x2c, 0x5c, 0x2d, 0x6f, 0xe1, 0x9e, 0x7e, 0xd7, 0x68, 0x02, + 0x51, 0xb7, 0x6b, 0x31, 0xef, 0xb9, 0x3f, 0x9e, 0xbc, 0xe6, 0x89, 0x8a, 0x28, 0x9b, 0x1f, 0x5f, + 0x08, 0x74, 0xbd, 0x9b, 0x05, 0x31, 0x59, 0x3c, 0xce, 0x07, 0x2f, 0x8e, 0xce, 0x32, 0x07, 0xd4, + 0x7a, 0xe4, 0x06, 0x2c, 0xf3, 0x1b, 0x5d, 0x6a, 0x57, 0x01, 0x84, 0x99, 0x6c, 0x6b, 0x91, 0x7d, + 0xa0, 0xc1, 0x8d, 0x67, 0xf5, 0x21, 0x79, 0x08, 0xe7, 0xd1, 0x2b, 0x28, 0x0c, 0xe2, 0x61, 0x70, + 0xba, 0x6e, 0xf7, 0xc8, 0x13, 0xb3, 0xd6, 0xc8, 0x1d, 0x8c, 0xe1, 0xd0, 0xb6, 0x5b, 0xca, 0x38, + 0x0c, 0x87, 0x76, 0x18, 0xc8, 0xdf, 0x15, 0x46, 0x2e, 0xea, 0xd0, 0x83, 0xcb, 0x33, 0x28, 0x95, + 0xad, 0x51, 0x53, 0xb7, 0xc6, 0x97, 0x41, 0x3f, 0xf0, 0x7a, 0xec, 0x9a, 0xe3, 0xf5, 0xb0, 0x6a, + 0x9f, 0xde, 0xc1, 0x8e, 0x5f, 0xa6, 0xab, 0x31, 0xdc, 0x0e, 0x83, 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, 0x4d, 0x58, 0x56, 0x37, 0x12, 0x29, 0xe1, 0xf5, 0x92, 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, 0x7f, 0x7b, 0x1e, 0xce, 0xe6, + 0xdc, 0x84, 0xc9, 0x6b, 0xa0, 0xfb, 0x83, 0xc8, 0x3b, 0x1c, 0x29, 0x57, 0x33, 0x2e, 0xbd, 0x17, + 0x36, 0x35, 0xba, 0xa6, 0x94, 0x09, 0x15, 0xe7, 0x3c, 0xcf, 0xf2, 0x2f, 0xbe, 0x27, 0x7e, 0xb1, + 0x0d, 0xc4, 0x1d, 0x49, 0xed, 0x1d, 0xfb, 0x97, 0xd4, 0x60, 0x1d, 0x33, 0x82, 0x84, 0x7e, 0x80, + 0x89, 0x45, 0x50, 0x14, 0x2b, 0xa5, 0xee, 0xcb, 0x58, 0x93, 0xb6, 0x82, 0xc4, 0x64, 0x31, 0xaa, + 0x0f, 0x33, 0x10, 0xf2, 0x8b, 0x70, 0x49, 0x39, 0x51, 0x9d, 0xcc, 0xea, 0xc3, 0x07, 0x18, 0xf4, + 0x82, 0x1b, 0x9f, 0xad, 0xd5, 0xd4, 0x3a, 0xdc, 0x06, 0x9e, 0x45, 0xd8, 0xef, 0x0d, 0x9d, 0x89, + 0x14, 0x32, 0xd8, 0x5c, 0x9e, 0x10, 0xe1, 0x12, 0xc3, 0xaa, 0xf5, 0x86, 0x99, 0x6c, 0x32, 0xd8, + 0xea, 0x76, 0xee, 0x0a, 0x5d, 0xc0, 0x15, 0x7a, 0x55, 0x6d, 0xcc, 0xc4, 0xfa, 0xc4, 0x5e, 0xcc, + 0x59, 0xa3, 0x87, 0xb0, 0x9e, 0x9c, 0x74, 0xf2, 0x80, 0x2e, 0xa7, 0xb2, 0xfe, 0x23, 0x43, 0x29, + 0x41, 0xf2, 0x13, 0x9b, 0x07, 0x8a, 0x98, 0x20, 0x54, 0xc3, 0xa1, 0x8c, 0x53, 0x04, 0x21, 0xa9, + 0xc3, 0x86, 0xfb, 0x34, 0x94, 0xb9, 0x49, 0xc3, 0xf8, 0x5b, 0x8b, 0x93, 0xdf, 0x92, 0xf6, 0x3a, + 0x4e, 0x4a, 0x89, 0xfb, 0x34, 0x14, 0x29, 0x4b, 0x43, 0xc9, 0xed, 0x63, 0x20, 0x5c, 0xec, 0x48, + 0xd5, 0x1b, 0x9e, 0xc5, 0x4b, 0x24, 0x36, 0x9d, 0xa0, 0x54, 0x83, 0xba, 0x61, 0xa9, 0x5a, 0xf3, + 0x4e, 0x5a, 0xc7, 0xba, 0x94, 0x32, 0x10, 0x66, 0x7b, 0x9b, 0x1b, 0x2f, 0x15, 0x7c, 0xf5, 0xaa, + 0xa9, 0x80, 0xc5, 0x6a, 0xf8, 0x5c, 0x03, 0x3d, 0xcb, 0x82, 0xbc, 0x0b, 0xf3, 0x5c, 0x98, 0x10, + 0x27, 0x93, 0x91, 0xff, 0x2d, 0x3e, 0x82, 0x5c, 0xae, 0xd8, 0x3b, 0x43, 0x05, 0x0d, 0xf9, 0x06, + 0x94, 0x02, 0xbf, 0x27, 0x0d, 0x99, 0x37, 0x66, 0xd1, 0xb6, 0x6a, 0xd5, 0x0a, 0x2a, 0x3f, 0xfd, + 0x9e, 0xb8, 0x7a, 0x6c, 0x97, 0x61, 0x9e, 0x77, 0x98, 0xf1, 0x31, 0x5c, 0x9e, 0xf1, 0x41, 0x62, + 0xc1, 0x5a, 0xc6, 0xc8, 0x7b, 0x4a, 0xfb, 0xaf, 0x9b, 0xd8, 0x7f, 0x47, 0x52, 0x26, 0xee, 0xc3, + 0xc5, 0xa9, 0x15, 0x24, 0xb5, 0xa9, 0x3b, 0x03, 0x86, 0x1b, 0xc9, 0x96, 0xa9, 0x93, 0x30, 0xb3, + 0x6b, 0x88, 0xaf, 0xfd, 0x4e, 0x01, 0xce, 0xe6, 0x4c, 0x0e, 0x62, 0x40, 0x41, 0xee, 0xe1, 0x93, + 0x2e, 0x84, 0x7b, 0x67, 0x68, 0xc1, 0xef, 0x91, 0xbb, 0x00, 0x98, 0xdb, 0x75, 0xe4, 0x1d, 0x7a, + 0x9f, 0x09, 0x1d, 0x01, 0xde, 0xdc, 0x13, 0x68, 0x8a, 0x66, 0x11, 0xcd, 0x32, 0x0c, 0x4c, 0x6e, + 0x03, 0x78, 0x9f, 0x75, 0xfb, 0xe3, 0x9e, 0x17, 0xdf, 0xba, 0x72, 0x3e, 0xa3, 0xd1, 0x45, 0x81, + 0x55, 0xeb, 0x91, 0x3d, 0x20, 0x92, 0x44, 0xf9, 0x6a, 0xe9, 0x19, 0x5f, 0xd5, 0xa8, 0x2e, 0xa8, + 0x9a, 0xf2, 0xe3, 0x62, 0x74, 0x17, 0x61, 0xc1, 0x1f, 0x60, 0x09, 0xfb, 0x57, 0x20, 0x19, 0x7f, + 0xa4, 0x89, 0xfe, 0x48, 0x2f, 0x72, 0xd2, 0x01, 0xe1, 0x43, 0x20, 0x36, 0x84, 0x5b, 0xd3, 0x37, + 0x04, 0xd5, 0x34, 0x2b, 0xe2, 0xce, 0x20, 0x40, 0x35, 0x40, 0x72, 0xc8, 0x97, 0x30, 0x9a, 0x8a, + 0xe1, 0xfb, 0x08, 0xce, 0xe5, 0x6e, 0xd8, 0xec, 0x16, 0x81, 0xae, 0xc8, 0xc9, 0x05, 0x79, 0x81, + 0xfd, 0x66, 0x37, 0xe4, 0x9b, 0xb0, 0xfc, 0xd8, 0x73, 0x47, 0xde, 0x48, 0x5c, 0xcf, 0xc4, 0xa9, + 0xc8, 0x61, 0xea, 0xed, 0xac, 0x97, 0x3e, 0x9d, 0x84, 0xd5, 0x85, 0x34, 0xe0, 0x2c, 0xdf, 0x35, + 0xfc, 0x63, 0xd4, 0x08, 0x08, 0x4b, 0x8d, 0x96, 0xba, 0x13, 0x23, 0x09, 0xde, 0x3f, 0x6a, 0x88, + 0xc5, 0xa9, 0xe9, 0xfa, 0x61, 0x16, 0xc4, 0x84, 0x9a, 0xf3, 0xf9, 0xd8, 0x64, 0x1b, 0x96, 0x38, + 0x73, 0xae, 0x1b, 0xe2, 0x26, 0xf6, 0x9b, 0x33, 0xbf, 0x50, 0xc1, 0x17, 0x3a, 0x61, 0xfc, 0x3f, + 0xbb, 0x94, 0xa1, 0x37, 0x93, 0x73, 0xac, 0x7a, 0x10, 0xd0, 0x65, 0x04, 0x0a, 0xcf, 0x01, 0xe3, + 0x3f, 0x6b, 0xb2, 0xa9, 0x29, 0xf5, 0x32, 0x3b, 0x59, 0x43, 0x6f, 0x20, 0xbd, 0x28, 0x16, 0xa9, + 0xf8, 0xf5, 0x9c, 0xa7, 0x3d, 0x79, 0x1b, 0x96, 0x19, 0xdb, 0xc3, 0xf1, 0x80, 0x9f, 0xb8, 0xc5, + 0x54, 0x3c, 0xbc, 0x06, 0x2f, 0x62, 0xc3, 0xb6, 0x77, 0x86, 0x2e, 0x1d, 0x27, 0x3f, 0xc9, 0xeb, + 0xb0, 0x18, 0x1e, 0x47, 0x43, 0xf5, 0x9c, 0x96, 0xa6, 0x36, 0xbb, 0xd1, 0x69, 0x0b, 0x92, 0x32, + 0xc3, 0x49, 0x54, 0x26, 0xdb, 0xf3, 0xdc, 0xd8, 0x66, 0xbc, 0x0a, 0x4b, 0x0a, 0x6f, 0xd6, 0x18, + 0xfe, 0x9e, 0x55, 0x36, 0x86, 0xff, 0x12, 0x83, 0xfd, 0x18, 0xca, 0x92, 0x25, 0x21, 0x50, 0x3a, + 0x0a, 0x42, 0x29, 0xe7, 0xe0, 0xff, 0x0c, 0x86, 0x17, 0x39, 0xd6, 0xc8, 0x39, 0x8a, 0xff, 0xa3, + 0x38, 0x8d, 0x6a, 0x61, 0x8c, 0xa2, 0x8c, 0x3e, 0xcc, 0xb1, 0x06, 0x85, 0xc1, 0x3b, 0xfd, 0x90, + 0x7b, 0x36, 0x4b, 0x5d, 0x4e, 0x7c, 0x0f, 0xc9, 0xe8, 0xe3, 0xa7, 0x89, 0x8d, 0x29, 0xa9, 0xb9, + 0x30, 0x29, 0x35, 0xf3, 0x38, 0x67, 0x82, 0x92, 0x7f, 0x19, 0x10, 0x86, 0x52, 0xb3, 0x22, 0x18, + 0x95, 0x52, 0x82, 0x91, 0xa2, 0x98, 0x4d, 0x46, 0x8f, 0x0b, 0xdd, 0x52, 0x31, 0x9b, 0x15, 0xd5, + 0x7e, 0x10, 0xcf, 0x90, 0x94, 0x45, 0x80, 0xdc, 0x81, 0x73, 0x5c, 0x3b, 0x22, 0xd2, 0xd7, 0x67, + 0x64, 0xc4, 0xb3, 0x58, 0xc8, 0xb3, 0xdf, 0xc5, 0xb2, 0xe2, 0xb3, 0x15, 0x8f, 0xe4, 0x0d, 0xd8, + 0x88, 0x73, 0x27, 0x87, 0x4f, 0xfc, 0x21, 0xcf, 0x1d, 0x79, 0x22, 0xf4, 0x16, 0x44, 0x96, 0xd9, + 0x4f, 0xfc, 0x21, 0xe6, 0x91, 0x94, 0x3d, 0xfc, 0xaf, 0x0b, 0x52, 0x9d, 0xbd, 0x1d, 0x04, 0x51, + 0x18, 0x8d, 0xdc, 0x61, 0xca, 0xe6, 0x49, 0x8e, 0xe1, 0x22, 0x56, 0xe9, 0x0e, 0x26, 0xb0, 0x0a, + 0x46, 0x52, 0xfd, 0x1f, 0x2f, 0xb0, 0xa5, 0x3b, 0x5f, 0x4f, 0xeb, 0xa3, 0x4c, 0x86, 0x6d, 0xaa, + 0xc8, 0x6c, 0x5d, 0x29, 0x5c, 0xf7, 0xce, 0xd0, 0x0b, 0x9c, 0xe7, 0x04, 0x16, 0xd9, 0xcb, 0xd9, + 0x6b, 0xb2, 0x46, 0xcf, 0xed, 0x64, 0xe3, 0x49, 0x73, 0x55, 0xb7, 0x24, 0xf2, 0x3e, 0x2c, 0xfa, + 0x3d, 0x35, 0x69, 0x73, 0xd6, 0xdc, 0x56, 0xeb, 0xf1, 0xf4, 0x11, 0x09, 0x0f, 0xb6, 0x34, 0x7c, + 0x01, 0xdd, 0x5e, 0x49, 0x49, 0x2e, 0xc6, 0xb6, 0xd4, 0x9c, 0x4e, 0x92, 0x91, 0xd5, 0xe4, 0xec, + 0xc3, 0x73, 0x0e, 0x77, 0x81, 0x24, 0x81, 0x05, 0x15, 0xbf, 0x8c, 0xbf, 0x0b, 0x2f, 0x9f, 0xb6, + 0x8f, 0xd8, 0x8e, 0x31, 0xa5, 0xc3, 0x17, 0x79, 0xdc, 0xeb, 0x74, 0xbf, 0xdd, 0x04, 0x35, 0x5e, + 0xbf, 0x2f, 0xa7, 0x88, 0x84, 0xed, 0x8f, 0x7c, 0xe3, 0x7f, 0x16, 0x61, 0x35, 0x6d, 0x0f, 0x27, + 0xaf, 0x42, 0x49, 0xd9, 0x28, 0x2f, 0xe4, 0x18, 0xcd, 0x71, 0x7b, 0x44, 0xa4, 0x53, 0x6d, 0x8c, + 0xe4, 0x1e, 0xac, 0xa2, 0x87, 0x3e, 0x0a, 0x88, 0x91, 0x2f, 0x4c, 0x44, 0xa7, 0x35, 0xfe, 0x2c, + 0x33, 0x5a, 0x76, 0x30, 0xb2, 0x42, 0xc5, 0xdc, 0x59, 0x9a, 0x6e, 0xee, 0x14, 0x4d, 0x99, 0x62, + 0xee, 0x9c, 0x9b, 0x61, 0xee, 0x4c, 0x28, 0x55, 0x73, 0x27, 0x1a, 0xbd, 0x17, 0xa6, 0x19, 0xbd, + 0x13, 0x1a, 0x6e, 0xf4, 0x4e, 0xcc, 0x95, 0xe5, 0xa9, 0xe6, 0xca, 0x84, 0x46, 0x98, 0x2b, 0x13, + 0x03, 0xe2, 0xe2, 0x54, 0x03, 0xa2, 0x42, 0xc4, 0x0d, 0x88, 0x2f, 0x8a, 0x8e, 0x1d, 0xb9, 0x4f, + 0x1d, 0xec, 0x71, 0x71, 0xe3, 0xc1, 0x2e, 0xa3, 0xee, 0x53, 0x74, 0xbd, 0x65, 0x82, 0x89, 0xf0, + 0xd7, 0x35, 0x7e, 0x98, 0xd9, 0x80, 0xe4, 0x98, 0xbf, 0x04, 0xab, 0xfc, 0x1c, 0x16, 0xf1, 0xd4, + 0xf9, 0x41, 0xbc, 0x42, 0x57, 0x24, 0x94, 0xeb, 0x4b, 0x7f, 0x01, 0xd6, 0x62, 0x34, 0xa1, 0x32, + 0xc4, 0xd0, 0x00, 0x34, 0xa6, 0x16, 0xca, 0x42, 0x95, 0xdf, 0x48, 0xc4, 0x8a, 0x4b, 0xf1, 0xe3, + 0x81, 0xc4, 0x5e, 0x03, 0x92, 0xa0, 0xc5, 0xaf, 0x17, 0x4a, 0x88, 0xba, 0x1e, 0xa3, 0xc6, 0x4f, + 0x0c, 0xfe, 0x89, 0x96, 0x31, 0xd4, 0xfd, 0xbc, 0xaa, 0xff, 0x2a, 0xc4, 0x5f, 0x77, 0x84, 0xb1, + 0x45, 0xb6, 0x40, 0x97, 0x05, 0x6d, 0x01, 0x37, 0x0e, 0xb3, 0x6a, 0xb1, 0x9f, 0x53, 0xad, 0x8c, + 0x1f, 0x15, 0x53, 0x46, 0x0c, 0xf9, 0x19, 0x26, 0xdf, 0x84, 0x81, 0x23, 0x86, 0x58, 0x6c, 0xbf, + 0x37, 0xa7, 0x4c, 0x53, 0xe1, 0xaf, 0x6d, 0xdb, 0x2d, 0x0a, 0x61, 0x18, 0x48, 0xf7, 0x6d, 0x87, + 0xab, 0x7b, 0x94, 0x7b, 0x9c, 0x64, 0xc7, 0xf7, 0xda, 0xad, 0xd9, 0xec, 0xa4, 0x96, 0x98, 0xad, + 0x52, 0x54, 0xfb, 0xc4, 0xbf, 0xe4, 0x07, 0xf6, 0x01, 0x6d, 0x7e, 0x61, 0x9a, 0x79, 0x31, 0x47, + 0xb1, 0x37, 0xc1, 0x1c, 0x7b, 0x09, 0x39, 0xa3, 0x0a, 0x39, 0x54, 0xd9, 0x5a, 0xb0, 0x8c, 0x26, + 0x02, 0xc9, 0xb0, 0x94, 0xe3, 0x5e, 0x30, 0xd9, 0xf8, 0x4a, 0xad, 0x41, 0x97, 0x18, 0x9d, 0x64, + 0x73, 0x04, 0x17, 0x55, 0xc5, 0x7e, 0xba, 0x92, 0x73, 0x32, 0x0b, 0xc2, 0xcc, 0x1e, 0x48, 0xf4, + 0xff, 0x58, 0xd5, 0xf3, 0x6e, 0x1a, 0x20, 0xd0, 0xf0, 0xe9, 0xc2, 0xf4, 0x31, 0x99, 0x91, 0x93, + 0x32, 0x91, 0x6d, 0x0a, 0xaa, 0x6c, 0xa3, 0xea, 0xf9, 0x8b, 0x69, 0x3d, 0xff, 0x0e, 0xdc, 0x60, + 0xdb, 0x91, 0x18, 0x54, 0xef, 0x53, 0x6f, 0x74, 0x12, 0x0c, 0x30, 0xd6, 0xdd, 0x30, 0x5e, 0x95, + 0xdc, 0x30, 0x71, 0x85, 0xe1, 0xe1, 0x90, 0x59, 0x02, 0xab, 0x81, 0x48, 0x3c, 0x86, 0xe3, 0xbf, + 0x2a, 0xc2, 0x0b, 0xa7, 0x18, 0xf7, 0x19, 0x75, 0xff, 0xa5, 0xb4, 0x04, 0x5e, 0x48, 0xe9, 0x3f, + 0x19, 0x53, 0x71, 0xb8, 0x9c, 0x0c, 0xba, 0x53, 0xe4, 0xef, 0x5f, 0x87, 0x35, 0x7e, 0x82, 0xf0, + 0xb7, 0x1b, 0x07, 0xe3, 0xfe, 0x29, 0x8e, 0x90, 0xcb, 0xf2, 0xa1, 0x79, 0x86, 0x14, 0x4f, 0x15, + 0xdc, 0x38, 0xed, 0x18, 0x46, 0x3a, 0xb0, 0x84, 0x68, 0x07, 0xae, 0xdf, 0x3f, 0xd5, 0x8b, 0x67, + 0xf9, 0x8c, 0x5d, 0x25, 0xe3, 0x4f, 0xce, 0x18, 0x60, 0x07, 0x7f, 0x93, 0x5b, 0xb0, 0x36, 0x18, + 0x1f, 0x33, 0xd9, 0x92, 0x4f, 0x2a, 0xe1, 0x22, 0x3b, 0x47, 0x57, 0x06, 0xe3, 0x63, 0x73, 0x38, + 0xc4, 0xb9, 0x81, 0xbe, 0xb4, 0xeb, 0x0c, 0x8f, 0x2f, 0x7f, 0x89, 0x39, 0x8f, 0x98, 0x8c, 0x01, + 0xdf, 0x00, 0x04, 0xee, 0x06, 0xf0, 0x97, 0x15, 0x22, 0xb7, 0x27, 0xff, 0x61, 0xfc, 0xef, 0x82, + 0xd4, 0xea, 0x4e, 0x5f, 0x40, 0x7f, 0x3b, 0x44, 0x39, 0x43, 0xf4, 0x32, 0xe8, 0xac, 0xeb, 0x93, + 0xdd, 0x29, 0x1e, 0xa3, 0xd5, 0xc1, 0xf8, 0x38, 0xee, 0x3b, 0xb5, 0xe3, 0xe7, 0xd5, 0x8e, 0x7f, + 0x5b, 0x6a, 0x7d, 0x73, 0xf7, 0x99, 0xe9, 0x5d, 0xce, 0x44, 0xaf, 0x5b, 0xa7, 0xdb, 0x4d, 0xfe, + 0x76, 0xdc, 0x72, 0xc6, 0x2d, 0x63, 0x02, 0x9d, 0x9b, 0x30, 0x81, 0xe6, 0xac, 0xbd, 0xf9, 0xbc, + 0xb5, 0x37, 0x61, 0x70, 0x5d, 0xc8, 0x31, 0xb8, 0xe6, 0x2e, 0xd0, 0xf2, 0x33, 0x16, 0xe8, 0xa2, + 0x3a, 0x4f, 0xfe, 0x7b, 0x41, 0x8a, 0x5e, 0xe9, 0xbb, 0xd4, 0x47, 0x70, 0x56, 0xde, 0xa5, 0xf8, + 0x11, 0x94, 0xd8, 0xd1, 0x97, 0xee, 0xbc, 0x92, 0x77, 0x8b, 0x42, 0xb4, 0x9c, 0x9b, 0xce, 0xba, + 0xb8, 0x3f, 0x25, 0xe5, 0xff, 0xff, 0xdc, 0x9c, 0xc8, 0x23, 0x38, 0x8f, 0xa9, 0x76, 0xba, 0xaa, + 0x07, 0x80, 0x33, 0xf2, 0x0e, 0xc4, 0x7c, 0xb8, 0x39, 0x71, 0xcf, 0xf0, 0xbb, 0x4a, 0x75, 0xa8, + 0x77, 0xb0, 0x77, 0x86, 0x6e, 0x84, 0x39, 0xf0, 0xec, 0xa5, 0xec, 0x8f, 0x34, 0x30, 0x9e, 0xdd, + 0x5f, 0x78, 0x7f, 0xce, 0x76, 0x38, 0xbb, 0x3f, 0x2b, 0xbd, 0xf7, 0x02, 0xac, 0x8c, 0xbc, 0x83, + 0x91, 0x17, 0x1e, 0xa5, 0x94, 0x5c, 0xcb, 0x02, 0x28, 0x3b, 0x46, 0xc6, 0xfb, 0x7e, 0xae, 0x5b, + 0x8d, 0x24, 0x32, 0x76, 0xe2, 0xbb, 0x76, 0xee, 0x38, 0xb0, 0xd9, 0xa4, 0x56, 0x90, 0xff, 0xb8, + 0x57, 0x2a, 0x17, 0xf4, 0x22, 0x15, 0x51, 0xc9, 0x0f, 0xfc, 0xbe, 0x67, 0xfc, 0xbb, 0x58, 0xb2, + 0xc8, 0xeb, 0x3c, 0xf2, 0x91, 0xf2, 0xe2, 0xa9, 0x38, 0x21, 0xcf, 0xe4, 0x91, 0x9c, 0x46, 0x03, + 0x59, 0xff, 0x8a, 0x34, 0x90, 0x77, 0xa5, 0xdb, 0x34, 0xdb, 0xf3, 0x1e, 0xdc, 0x26, 0xaf, 0xc0, + 0x02, 0xf7, 0x94, 0x96, 0xd5, 0x5d, 0x4b, 0x55, 0xf7, 0xc1, 0x6d, 0x2a, 0xcb, 0x8d, 0xcf, 0x63, + 0xff, 0x94, 0x89, 0x46, 0x3c, 0xb8, 0x4d, 0xde, 0x3e, 0xdd, 0x0b, 0xa6, 0xb2, 0x7c, 0xc1, 0x14, + 0xbf, 0x5e, 0x7a, 0x27, 0xf5, 0x7a, 0xe9, 0xc5, 0xd9, 0xbd, 0x25, 0xbc, 0x8e, 0x78, 0xa4, 0xe7, + 0x38, 0x56, 0xa8, 0xf1, 0xd7, 0x05, 0xb8, 0x3a, 0x93, 0x82, 0x5c, 0x81, 0xb2, 0xd9, 0xae, 0x75, + 0x92, 0xf1, 0x65, 0x6b, 0x46, 0x42, 0xc8, 0x2e, 0x2c, 0x6e, 0xbb, 0xa1, 0xdf, 0x65, 0xd3, 0x38, + 0xd7, 0x08, 0x3e, 0xc1, 0x36, 0x46, 0xdf, 0x3b, 0x43, 0x13, 0x5a, 0xe2, 0xc0, 0x3a, 0xae, 0x85, + 0x54, 0x1e, 0xcd, 0x62, 0x8e, 0x9e, 0x66, 0x82, 0xe1, 0x04, 0x19, 0xdb, 0x67, 0x26, 0x80, 0xe4, + 0x31, 0x10, 0xdb, 0xde, 0xab, 0x78, 0xa3, 0x48, 0xe8, 0x2f, 0x22, 0x3f, 0x7e, 0x0e, 0xf3, 0xc6, + 0x33, 0xfa, 0x6e, 0x82, 0x6e, 0xef, 0x0c, 0xcd, 0xe1, 0x46, 0x6e, 0x82, 0x9a, 0xf0, 0x15, 0xcf, + 0xe8, 0xe5, 0xbd, 0x33, 0x14, 0x86, 0x71, 0xe2, 0xd7, 0xec, 0x4e, 0xf0, 0xa9, 0x14, 0x89, 0xa6, + 0xf7, 0xd3, 0x73, 0x04, 0xda, 0x7f, 0x19, 0xca, 0x6d, 0xe9, 0x96, 0xa8, 0xbc, 0x3c, 0x94, 0x2e, + 0x88, 0x34, 0x2e, 0x35, 0xfe, 0xa1, 0x26, 0x75, 0x3a, 0xcf, 0xee, 0x4f, 0x25, 0x13, 0x6a, 0x6f, + 0x76, 0x26, 0xd4, 0xde, 0xcf, 0x98, 0x09, 0xd5, 0xf0, 0xe1, 0x95, 0x53, 0xf7, 0x3d, 0x79, 0x17, + 0x74, 0x4c, 0x32, 0xe9, 0x2a, 0xe3, 0xc8, 0x97, 0xe0, 0x7a, 0x9c, 0x79, 0x65, 0x4f, 0x64, 0xe6, + 0xa5, 0x6b, 0xdd, 0x34, 0xb5, 0xf1, 0x87, 0x22, 0xe3, 0x4e, 0xad, 0xd7, 0xce, 0x58, 0x5b, 0xbf, + 0xec, 0x63, 0x55, 0x2b, 0xb5, 0x1e, 0x5f, 0x50, 0x32, 0x7a, 0x4f, 0x7e, 0x6b, 0xfa, 0x9b, 0x55, + 0x65, 0x71, 0xfe, 0xb3, 0x22, 0x5c, 0x99, 0x45, 0x4e, 0x4c, 0xd0, 0xad, 0x4c, 0xee, 0x7e, 0x35, + 0x03, 0xdc, 0x44, 0xd2, 0x7f, 0x3a, 0x81, 0xce, 0xc6, 0x96, 0xc3, 0xe2, 0x97, 0x98, 0x38, 0xb6, + 0x82, 0x94, 0x8d, 0xad, 0x2c, 0x26, 0x2f, 0xc0, 0xbc, 0x59, 0xb1, 0x93, 0x4c, 0xb5, 0xf8, 0x64, + 0xca, 0xed, 0x86, 0xf8, 0x18, 0x47, 0x14, 0x91, 0x5f, 0x9b, 0x4c, 0xce, 0x2c, 0x52, 0xd4, 0x5e, + 0x56, 0x3a, 0x64, 0x22, 0x19, 0x16, 0xd6, 0x37, 0x49, 0xde, 0x24, 0xf2, 0xa1, 0xd0, 0xc9, 0x44, + 0xcf, 0x06, 0xcc, 0xb7, 0x47, 0x5e, 0xe8, 0x45, 0xea, 0x73, 0xa6, 0x21, 0x42, 0xa8, 0x28, 0x11, + 0x8f, 0x8d, 0xdc, 0x13, 0x1e, 0x5b, 0x6a, 0x5e, 0x8d, 0x21, 0x88, 0xaf, 0x93, 0x18, 0x98, 0x2a, + 0x28, 0x8c, 0xa0, 0xee, 0x8e, 0x07, 0xdd, 0xa3, 0x7d, 0x5a, 0x17, 0xc2, 0x15, 0x27, 0xe8, 0x23, + 0x94, 0x35, 0x30, 0xa4, 0x0a, 0x8a, 0xf1, 0x5b, 0x1a, 0x6c, 0xe4, 0xb5, 0x83, 0x5c, 0x81, 0xd2, + 0x20, 0x37, 0x0f, 0xf5, 0x80, 0x87, 0xc4, 0x59, 0x42, 0xe3, 0xdd, 0x41, 0x30, 0x3a, 0x76, 0x23, + 0xf5, 0xd1, 0x97, 0x02, 0xa6, 0x68, 0x6c, 0xdc, 0xc1, 0xff, 0xc9, 0x75, 0x79, 0x2a, 0x15, 0x27, + 0x32, 0x57, 0xe3, 0x1f, 0xc3, 0x04, 0xa8, 0xf5, 0xda, 0xad, 0x21, 0x4f, 0xc6, 0xf4, 0x26, 0x94, + 0x58, 0xb5, 0x32, 0xb3, 0x97, 0xcd, 0x1f, 0xb3, 0x51, 0x17, 0x48, 0xbc, 0x56, 0xa1, 0x7b, 0xdc, + 0xa7, 0x88, 0x6c, 0x3c, 0x84, 0xd5, 0x34, 0x06, 0xb1, 0xd2, 0xf1, 0xf8, 0x97, 0xee, 0xe8, 0x82, + 0xd3, 0x76, 0x10, 0xf0, 0x87, 0xc7, 0xdb, 0x17, 0x7f, 0xf2, 0xc5, 0x75, 0x60, 0x3f, 0x39, 0x4d, + 0x5e, 0xbc, 0x7e, 0xe3, 0x77, 0x0b, 0xb0, 0x91, 0xc4, 0x3a, 0x92, 0x6b, 0xe8, 0x6f, 0x6c, 0xe0, + 0x0d, 0x33, 0x15, 0x18, 0x42, 0x8a, 0x96, 0x93, 0x0d, 0x9c, 0xf1, 0x1e, 0x7d, 0x17, 0x36, 0xa7, + 0xe1, 0x93, 0x57, 0x61, 0x11, 0x43, 0x6e, 0x0e, 0xdd, 0xae, 0xa7, 0x6e, 0xb3, 0x03, 0x09, 0xa4, + 0x49, 0xb9, 0xf1, 0x27, 0x1a, 0x5c, 0x12, 0xcf, 0x65, 0x1b, 0xae, 0x3f, 0x40, 0x5b, 0x51, 0xd7, + 0xfb, 0x6a, 0x02, 0xc7, 0xec, 0xa6, 0xf6, 0xb1, 0x97, 0xd2, 0xaf, 0xa2, 0x27, 0xbe, 0x36, 0xbd, + 0xb5, 0xe4, 0x15, 0x0c, 0x23, 0x2b, 0xdc, 0xc9, 0x4a, 0x3c, 0x50, 0xd7, 0x80, 0x01, 0xd4, 0x40, + 0x5d, 0x88, 0x61, 0xfc, 0x3d, 0xb8, 0x36, 0xfb, 0x03, 0xe4, 0x57, 0x61, 0x05, 0xf3, 0xa4, 0xee, + 0x0f, 0x0f, 0x47, 0x6e, 0xcf, 0x93, 0x5a, 0x44, 0xa9, 0xec, 0x56, 0xcb, 0x78, 0x54, 0x5c, 0x11, + 0x38, 0xea, 0x10, 0x33, 0xb0, 0x0a, 0xa2, 0xd4, 0x9b, 0x74, 0x95, 0x9b, 0xf1, 0x1d, 0x0d, 0xc8, + 0x24, 0x0f, 0xf2, 0x0d, 0x58, 0xde, 0xef, 0x54, 0xec, 0xc8, 0x1d, 0x45, 0x7b, 0xc1, 0x78, 0x24, + 0x42, 0xd2, 0xf2, 0x38, 0x42, 0x51, 0xd7, 0xe1, 0x56, 0xc1, 0xa3, 0x60, 0x3c, 0xa2, 0x29, 0x3c, + 0xcc, 0xb0, 0xe9, 0x79, 0x4f, 0x7a, 0xee, 0x49, 0x3a, 0xc3, 0xa6, 0x80, 0xa5, 0x32, 0x6c, 0x0a, + 0x98, 0xf1, 0x03, 0x0d, 0x2e, 0xcb, 0x77, 0x12, 0xbd, 0x9c, 0xba, 0x54, 0x30, 0x5a, 0xde, 0x48, + 0x66, 0x39, 0x98, 0x25, 0xc4, 0xaf, 0xcb, 0x80, 0x92, 0x58, 0x41, 0x94, 0xe6, 0x39, 0x2d, 0xf9, + 0x25, 0x28, 0xd9, 0x51, 0x30, 0x3c, 0x45, 0x44, 0x49, 0x3d, 0x1e, 0xd1, 0x28, 0x18, 0x22, 0x0b, + 0xa4, 0x34, 0x3c, 0xd8, 0x50, 0x2b, 0x27, 0x6b, 0x4c, 0x1a, 0xb0, 0x20, 0xc2, 0x11, 0x67, 0x1c, + 0xf0, 0x66, 0xb4, 0x69, 0x7b, 0x4d, 0x86, 0xad, 0x14, 0xf1, 0xf8, 0xa9, 0xe4, 0x61, 0xfc, 0x23, + 0x0d, 0x96, 0x98, 0x60, 0x83, 0xf7, 0xd6, 0x2f, 0x3b, 0xa5, 0xd3, 0xa2, 0xb2, 0xf4, 0x27, 0x8d, + 0xd9, 0x9f, 0xea, 0x34, 0x7e, 0x0b, 0xd6, 0x32, 0x04, 0xc4, 0xc0, 0x80, 0x65, 0x7d, 0xbf, 0xeb, + 0xf2, 0x84, 0x7d, 0xdc, 0x17, 0x33, 0x05, 0x33, 0xfe, 0x81, 0x06, 0x1b, 0xad, 0x27, 0x91, 0xcb, + 0x8d, 0xf7, 0x74, 0xdc, 0x97, 0xeb, 0x9d, 0x09, 0x6b, 0xf2, 0xc1, 0x0d, 0x0f, 0xa6, 0xc4, 0x85, + 0x35, 0x01, 0xa3, 0x71, 0x29, 0xd9, 0x83, 0xb2, 0x38, 0x5f, 0x42, 0x11, 0x3a, 0xff, 0x9a, 0xa2, + 0x3e, 0x49, 0x18, 0x0b, 0x24, 0xd6, 0x12, 0xdc, 0xc2, 0x04, 0x0d, 0x8d, 0xa9, 0x8d, 0xbf, 0xd4, + 0xe0, 0xc2, 0x14, 0x1a, 0xf2, 0x1e, 0xcc, 0x61, 0xa0, 0x07, 0x31, 0x7a, 0x57, 0xa6, 0x7c, 0x22, + 0xea, 0x1e, 0x3d, 0xb8, 0xcd, 0x0f, 0xa2, 0x63, 0xf6, 0x83, 0x72, 0x2a, 0xf2, 0x11, 0x2c, 0x9a, + 0xbd, 0x9e, 0xb8, 0xc0, 0x15, 0x52, 0x17, 0xb8, 0x29, 0x5f, 0x7c, 0x3d, 0xc6, 0xe7, 0x17, 0x38, + 0xfe, 0xe4, 0xb8, 0xd7, 0x73, 0x44, 0x10, 0x8b, 0x84, 0xdf, 0xa5, 0x77, 0x61, 0x35, 0x8d, 0xfc, + 0x5c, 0xef, 0xee, 0x3f, 0xd7, 0x40, 0x4f, 0xd7, 0xe1, 0xe7, 0x13, 0x70, 0x33, 0x6f, 0x98, 0x9f, + 0x31, 0xa9, 0xfe, 0x71, 0x01, 0xce, 0xe5, 0xf6, 0x30, 0x79, 0x0d, 0xe6, 0xcd, 0xe1, 0xb0, 0x56, + 0x15, 0xb3, 0x4a, 0x48, 0x48, 0xa8, 0x5f, 0x4f, 0xdd, 0x6f, 0x39, 0x12, 0x79, 0x13, 0xca, 0xdc, + 0x47, 0xa4, 0x2a, 0x37, 0x1c, 0x8c, 0x20, 0x28, 0x1c, 0x58, 0xd2, 0x41, 0xec, 0x25, 0x22, 0xd9, + 0x81, 0x55, 0x11, 0x7b, 0x0f, 0x1d, 0x86, 0xe2, 0x7c, 0x49, 0xe8, 0x63, 0x25, 0x95, 0xf6, 0xdc, + 0xd5, 0x28, 0xb5, 0x77, 0x66, 0xa8, 0x48, 0x1d, 0x74, 0xe4, 0xa9, 0x72, 0xe2, 0x91, 0xf4, 0x15, + 0xdf, 0xbb, 0x29, 0xbc, 0x26, 0x28, 0xe3, 0xe1, 0xe2, 0xfe, 0xef, 0xc7, 0xde, 0x20, 0xfa, 0xf9, + 0x0d, 0x57, 0xf2, 0x8d, 0x53, 0x0d, 0xd7, 0xf7, 0x4b, 0x7c, 0x31, 0x67, 0xc9, 0x98, 0x44, 0xa3, + 0xa4, 0x47, 0x41, 0x89, 0x86, 0xdd, 0xcf, 0x44, 0x74, 0xb9, 0x2a, 0x2c, 0xf0, 0xa8, 0x7f, 0x72, + 0x65, 0x5c, 0xcd, 0xad, 0x02, 0xc7, 0x79, 0x70, 0x9b, 0x8b, 0x2f, 0x3c, 0xe2, 0x44, 0x48, 0x25, + 0x29, 0x79, 0x00, 0x4b, 0x95, 0xbe, 0xe7, 0x0e, 0xc6, 0xc3, 0xce, 0xe9, 0x0c, 0xd4, 0x9b, 0xa2, + 0x2d, 0xcb, 0x5d, 0x4e, 0x86, 0x86, 0x6d, 0xdc, 0xc9, 0x55, 0x46, 0xa4, 0x13, 0x3f, 0x42, 0x2f, + 0xa1, 0x6e, 0xf6, 0x8d, 0x19, 0xfd, 0x93, 0x05, 0x22, 0x5d, 0x3a, 0xc2, 0x82, 0x78, 0xa5, 0xee, + 0xc0, 0x6a, 0xdd, 0x0d, 0xa3, 0xce, 0xc8, 0x1d, 0x84, 0x18, 0x81, 0xfc, 0x14, 0xd1, 0x54, 0x2f, + 0x8b, 0x0a, 0x73, 0x9d, 0x6d, 0x14, 0x93, 0x72, 0x9d, 0x6d, 0x9a, 0x1d, 0x93, 0x97, 0x76, 0xfc, + 0x81, 0xdb, 0xf7, 0xbf, 0x2d, 0x63, 0x75, 0x70, 0x79, 0xe9, 0x40, 0x02, 0x69, 0x52, 0x6e, 0xfc, + 0xca, 0xc4, 0xb8, 0xf1, 0x5a, 0x2e, 0xc1, 0x82, 0x88, 0xe4, 0xc4, 0x23, 0x1b, 0xb5, 0xad, 0x66, + 0xb5, 0xd6, 0xdc, 0xd5, 0x35, 0xb2, 0x0a, 0xd0, 0xa6, 0xad, 0x8a, 0x65, 0xdb, 0xec, 0x77, 0x81, + 0xfd, 0x16, 0x61, 0x8f, 0x76, 0xf6, 0xeb, 0x7a, 0x51, 0x89, 0x7c, 0x54, 0x32, 0x7e, 0xac, 0xc1, + 0xf9, 0xfc, 0xa1, 0x24, 0x1d, 0xc0, 0xd8, 0x57, 0xc2, 0x55, 0xe1, 0x1b, 0x33, 0xc7, 0x3d, 0x17, + 0x9c, 0x8d, 0xa1, 0x15, 0xf1, 0xd8, 0x4c, 0x05, 0x69, 0x66, 0xe3, 0xc1, 0x1e, 0xfc, 0x1e, 0x2d, + 0xf8, 0x3d, 0xa3, 0x02, 0x9b, 0xd3, 0x78, 0xa4, 0x9b, 0xba, 0x06, 0x4b, 0x66, 0xbb, 0x5d, 0xaf, + 0x55, 0xcc, 0x4e, 0xad, 0xd5, 0xd4, 0x35, 0xb2, 0x08, 0x73, 0xbb, 0xb4, 0xb5, 0xdf, 0xd6, 0x0b, + 0xc6, 0xef, 0x69, 0xb0, 0x52, 0x4b, 0x9c, 0x28, 0xbf, 0xec, 0xe2, 0xfb, 0x66, 0x6a, 0xf1, 0x6d, + 0xc6, 0x51, 0xe2, 0xe2, 0x0f, 0x9c, 0x6a, 0xe5, 0xfd, 0x9b, 0x22, 0xac, 0x4f, 0xd0, 0x10, 0x1b, + 0x16, 0xcc, 0x87, 0x76, 0xab, 0x56, 0xad, 0x88, 0x9a, 0x5d, 0x4f, 0x9c, 0xe6, 0x30, 0xdb, 0xe8, + 0xc4, 0x57, 0x78, 0x64, 0x95, 0xa7, 0xa1, 0x13, 0xf8, 0xbd, 0x6e, 0xca, 0x6b, 0x53, 0x72, 0xc2, + 0x93, 0xec, 0xdb, 0xe3, 0x11, 0x3a, 0xa2, 0x8a, 0x5a, 0xc7, 0xbe, 0x78, 0x12, 0x3e, 0xc9, 0x18, + 0x5d, 0x33, 0x5d, 0x56, 0x3e, 0xc9, 0x3a, 0xe1, 0x47, 0x9a, 0x30, 0xbf, 0xeb, 0x47, 0x7b, 0xe3, + 0xc7, 0x62, 0xfd, 0x5e, 0x4b, 0x72, 0x4f, 0xee, 0x8d, 0x1f, 0x4f, 0xb2, 0x45, 0xad, 0x26, 0x7f, + 0x55, 0x9d, 0x62, 0x29, 0xb8, 0x90, 0xfb, 0x30, 0x67, 0x3e, 0xb4, 0xa9, 0x29, 0x56, 0x97, 0xe2, + 0x96, 0x48, 0xcd, 0x29, 0xdc, 0x58, 0xeb, 0x47, 0x6e, 0x8a, 0x1b, 0xe7, 0x91, 0x8d, 0x2c, 0x51, + 0x7a, 0xae, 0xc8, 0x12, 0xdb, 0x2b, 0xb0, 0x24, 0x2e, 0x64, 0x78, 0xd7, 0xf9, 0x91, 0x06, 0x9b, + 0xd3, 0x86, 0x81, 0xdd, 0xf1, 0xd2, 0x11, 0xa4, 0xce, 0xc7, 0x99, 0xce, 0xd2, 0xae, 0xc3, 0x12, + 0x8d, 0x7c, 0x00, 0x4b, 0xdc, 0xbd, 0xcc, 0x7e, 0x73, 0x9f, 0xd6, 0xc4, 0xdc, 0xbf, 0xfa, 0x17, + 0x5f, 0x5c, 0xbf, 0x20, 0x3c, 0xd2, 0xc2, 0x37, 0x9d, 0xf1, 0xc8, 0x4f, 0x48, 0x37, 0x35, 0xaa, + 0x52, 0x30, 0x91, 0xdc, 0x1d, 0xf7, 0x7c, 0x4f, 0x5e, 0x48, 0x64, 0x94, 0x1d, 0x01, 0x53, 0x0f, + 0x48, 0x09, 0x33, 0xbe, 0xab, 0xc1, 0xa5, 0xe9, 0x63, 0xce, 0x0e, 0xdd, 0x0e, 0xf7, 0xd2, 0x93, + 0x71, 0x6e, 0xf0, 0xd0, 0x8d, 0x5d, 0xf9, 0x54, 0x9e, 0x12, 0x91, 0x11, 0x09, 0x75, 0x99, 0xd4, + 0xb8, 0x20, 0x51, 0xac, 0x4d, 0x53, 0x89, 0x24, 0xa2, 0xf1, 0x08, 0x2e, 0x4c, 0x99, 0x21, 0xe4, + 0xfd, 0xdc, 0xfc, 0x89, 0xf8, 0xfc, 0x59, 0x7d, 0xdf, 0x9e, 0x4a, 0xc4, 0xab, 0xc0, 0x8d, 0xff, + 0xc4, 0xfd, 0x52, 0x73, 0xa6, 0x0b, 0x93, 0x0f, 0x30, 0x5f, 0x9f, 0x39, 0xe8, 0x1e, 0x05, 0xa3, + 0x64, 0xb0, 0x50, 0x3e, 0x88, 0x58, 0x89, 0xe3, 0x62, 0x51, 0x66, 0xd0, 0x32, 0x54, 0x24, 0x80, + 0xf5, 0xf6, 0x28, 0x38, 0xf0, 0xf9, 0x83, 0x3d, 0x7e, 0xad, 0x13, 0x2b, 0xeb, 0x65, 0x65, 0xc2, + 0x06, 0x7d, 0x2f, 0x34, 0x07, 0x27, 0x4f, 0x8f, 0xbc, 0x91, 0x37, 0x81, 0x1f, 0x27, 0xe5, 0x61, + 0x60, 0xee, 0xfe, 0xd0, 0xc5, 0x02, 0x3a, 0xc9, 0xdb, 0xf8, 0x5e, 0x01, 0x6e, 0x3e, 0x93, 0xe3, + 0x69, 0xd3, 0x0e, 0x7e, 0x1d, 0x40, 0xd0, 0xb2, 0x1e, 0x50, 0x94, 0x36, 0xb2, 0x32, 0xee, 0x68, + 0x40, 0x15, 0x14, 0xf2, 0x04, 0xae, 0xca, 0x5f, 0xdd, 0xae, 0x37, 0x8c, 0x42, 0x56, 0x0f, 0x11, + 0xc7, 0x36, 0x8e, 0xe0, 0x53, 0xc6, 0xdc, 0xfa, 0x37, 0x63, 0x1e, 0x1c, 0x93, 0x7b, 0xcf, 0xcb, + 0x90, 0xb8, 0xa8, 0x3a, 0x9a, 0xcd, 0x8b, 0xdc, 0x4a, 0x56, 0x52, 0x29, 0x51, 0xf9, 0xca, 0x95, + 0x14, 0xaf, 0x1f, 0xe3, 0x27, 0x05, 0x38, 0xcf, 0x76, 0xe4, 0xbe, 0x17, 0x86, 0xe6, 0x38, 0x3a, + 0x62, 0xab, 0x96, 0xdf, 0x51, 0xc8, 0xdb, 0x30, 0x7f, 0xf4, 0x7c, 0x16, 0x08, 0x8e, 0x4e, 0x08, + 0xa0, 0x94, 0x23, 0xdf, 0x56, 0xb3, 0xff, 0xc9, 0x3b, 0x30, 0x87, 0x0a, 0x36, 0x21, 0x4c, 0xc8, + 0x4b, 0x60, 0xfe, 0xa7, 0x51, 0xfd, 0x46, 0x39, 0x01, 0xeb, 0xe7, 0x24, 0xa5, 0x9b, 0xd8, 0xcf, + 0xa4, 0xe2, 0x29, 0xce, 0xea, 0x46, 0x17, 0x8f, 0x0f, 0x5c, 0x91, 0x27, 0x6d, 0x0b, 0xd6, 0xe5, + 0xaa, 0x19, 0xca, 0x70, 0xe3, 0xc2, 0xf2, 0xbd, 0x26, 0xe2, 0x3f, 0x0c, 0x65, 0xc8, 0xf1, 0x17, + 0x61, 0x35, 0x0c, 0x8f, 0x1c, 0x11, 0x3e, 0xe8, 0x89, 0xcc, 0x64, 0x42, 0x97, 0xc3, 0xf0, 0x88, + 0xc7, 0x11, 0xba, 0xef, 0x9d, 0x30, 0x2c, 0x74, 0xf1, 0x4d, 0xb0, 0xca, 0x1c, 0x2b, 0xea, 0x87, + 0x31, 0x96, 0x88, 0x7c, 0x05, 0x09, 0x96, 0xf1, 0xdf, 0x0a, 0xb0, 0xf8, 0x90, 0x09, 0xee, 0xa8, + 0x8e, 0x9a, 0xad, 0xde, 0xba, 0x03, 0x4b, 0xf5, 0xc0, 0x15, 0x46, 0x47, 0xf1, 0xc2, 0x98, 0xbf, + 0x09, 0xe8, 0x07, 0xae, 0xb4, 0x5f, 0x86, 0x54, 0x45, 0x7a, 0x46, 0xe8, 0xa7, 0x7b, 0x30, 0xcf, + 0x8d, 0xc0, 0x42, 0xd3, 0x2a, 0xaf, 0x6e, 0x71, 0x8d, 0x5e, 0xe7, 0xc5, 0x8a, 0x9d, 0x8c, 0x1b, + 0x92, 0xd5, 0x7b, 0x84, 0xf0, 0xff, 0x57, 0x94, 0x6f, 0x73, 0xa7, 0x53, 0xbe, 0x29, 0x61, 0xa3, + 0xe7, 0x4f, 0x13, 0x36, 0xfa, 0xd2, 0x5d, 0x58, 0x52, 0xea, 0xf3, 0x5c, 0x37, 0xb9, 0xdf, 0x28, + 0xc0, 0x0a, 0xb6, 0x2a, 0x76, 0x2d, 0xfb, 0x9b, 0xa9, 0x4a, 0xfc, 0x66, 0x4a, 0x95, 0xb8, 0xa9, + 0x8e, 0x17, 0x6f, 0xd9, 0x0c, 0x1d, 0xe2, 0x3d, 0x58, 0x9f, 0x40, 0x24, 0x6f, 0xc1, 0x1c, 0xab, + 0xbe, 0x54, 0xbd, 0xe8, 0xd9, 0x19, 0x90, 0xa4, 0x18, 0x61, 0x0d, 0x0f, 0x29, 0xc7, 0x36, 0xfe, + 0x97, 0x06, 0xcb, 0x22, 0x83, 0xe0, 0xe0, 0x20, 0x78, 0x66, 0x77, 0xde, 0xca, 0x76, 0x27, 0x0f, + 0x64, 0x28, 0xba, 0xf3, 0xff, 0x76, 0x27, 0xde, 0x4d, 0x75, 0xe2, 0x85, 0x38, 0xe0, 0xb8, 0x6c, + 0xce, 0x8c, 0x3e, 0xfc, 0x21, 0xa6, 0xe0, 0x48, 0x23, 0x92, 0x5f, 0x83, 0xc5, 0xa6, 0xf7, 0x34, + 0xa5, 0xc1, 0xb8, 0x35, 0x85, 0xe9, 0xeb, 0x31, 0x22, 0x5f, 0x53, 0xfc, 0x5d, 0x8e, 0xf7, 0xd4, + 0x99, 0xb0, 0x3f, 0x27, 0x2c, 0x2f, 0xbd, 0x0b, 0xab, 0x69, 0xb2, 0xe7, 0x99, 0xfa, 0x22, 0x1c, + 0x0a, 0xc6, 0xe6, 0xfc, 0xad, 0x22, 0x40, 0x12, 0x49, 0x82, 0x2d, 0xc0, 0x94, 0xeb, 0x8d, 0x34, + 0xfe, 0x20, 0x48, 0x9d, 0xe3, 0xd2, 0x23, 0xe7, 0x96, 0x30, 0x52, 0x14, 0xa6, 0x07, 0x84, 0x1f, + 0xc8, 0x68, 0x38, 0xdc, 0xcd, 0xb0, 0xef, 0x72, 0x97, 0xfc, 0xe2, 0xf6, 0x8b, 0x98, 0xff, 0x23, + 0x86, 0xa6, 0xa2, 0x75, 0x97, 0xab, 0x63, 0x91, 0x77, 0x08, 0x03, 0x18, 0x54, 0x19, 0xc2, 0x44, + 0x74, 0x96, 0xd2, 0xf3, 0x45, 0x67, 0x69, 0xc3, 0xa2, 0x3f, 0xf8, 0xd4, 0x1b, 0x44, 0xc1, 0xe8, + 0x04, 0x2d, 0x33, 0x89, 0xca, 0x97, 0x75, 0x41, 0x4d, 0x96, 0xf1, 0x71, 0x40, 0x19, 0x21, 0xc6, + 0x57, 0x87, 0x21, 0x06, 0xc6, 0x31, 0x25, 0xe6, 0xf4, 0x79, 0x1e, 0x59, 0xe2, 0x5e, 0xa9, 0x5c, + 0xd6, 0x17, 0xef, 0x95, 0xca, 0x8b, 0x3a, 0x50, 0xc5, 0xac, 0x1a, 0x9b, 0x4d, 0x15, 0x4b, 0x67, + 0xda, 0x8a, 0x69, 0xfc, 0x55, 0x01, 0xc8, 0x64, 0x35, 0xc8, 0x37, 0x61, 0x89, 0x6f, 0xb0, 0xce, + 0x28, 0xfc, 0x44, 0xbc, 0x4b, 0xe2, 0x8f, 0x04, 0x15, 0xb0, 0x1a, 0xe1, 0x94, 0x83, 0x69, 0xf8, + 0x49, 0x9f, 0xfc, 0x2a, 0x9c, 0xc5, 0xee, 0x1d, 0x7a, 0x23, 0x3f, 0xe8, 0x39, 0x98, 0x8e, 0xc2, + 0xed, 0x8b, 0xdc, 0xed, 0xaf, 0xfd, 0xc5, 0x17, 0xd7, 0xaf, 0xe6, 0x14, 0x4f, 0x19, 0x06, 0x0c, + 0x08, 0xd1, 0x46, 0xcc, 0x36, 0x47, 0x24, 0x1d, 0xd0, 0x55, 0xfa, 0x83, 0x71, 0xbf, 0x2f, 0x46, + 0x76, 0x8b, 0x09, 0x75, 0xd9, 0xb2, 0x29, 0x8c, 0x57, 0x13, 0xc6, 0x3b, 0xe3, 0x7e, 0x9f, 0xbc, + 0x0d, 0x10, 0x0c, 0x9c, 0x63, 0x3f, 0x0c, 0xb9, 0xbd, 0x2f, 0x7e, 0xab, 0x96, 0x40, 0xd5, 0xc1, + 0x08, 0x06, 0x0d, 0x0e, 0x24, 0x7f, 0x07, 0x30, 0x30, 0x1a, 0x46, 0x0c, 0xe4, 0x3e, 0x6d, 0x42, + 0xce, 0x93, 0xc0, 0x74, 0x28, 0x9d, 0x43, 0xcf, 0xf6, 0xbf, 0x2d, 0x9f, 0xf4, 0x7d, 0x0b, 0xd6, + 0x85, 0xfb, 0xfe, 0x43, 0x3f, 0x3a, 0x12, 0xb7, 0xcd, 0x2f, 0x73, 0x55, 0x55, 0xae, 0x9b, 0x7f, + 0x5a, 0x02, 0x30, 0x1f, 0xda, 0x32, 0x18, 0xef, 0x2b, 0x30, 0xc7, 0xee, 0xd0, 0x52, 0x17, 0x87, + 0x96, 0x0c, 0xe4, 0xab, 0x5a, 0x32, 0x10, 0x83, 0xad, 0x46, 0x8a, 0xaf, 0x6f, 0xa4, 0x1e, 0x0e, + 0x57, 0x23, 0x7f, 0x90, 0x93, 0x4a, 0x86, 0x22, 0xb0, 0x48, 0x1d, 0x20, 0x09, 0x8f, 0x2b, 0x6e, + 0x85, 0xeb, 0x49, 0x9c, 0x49, 0x51, 0x20, 0x92, 0xbc, 0x25, 0x4f, 0x2c, 0xd5, 0xe9, 0x93, 0xa0, + 0x91, 0xfb, 0x50, 0xea, 0xb8, 0x71, 0xe4, 0x96, 0x29, 0x41, 0x83, 0x6f, 0x88, 0xdc, 0xfa, 0x49, + 0xe0, 0xe0, 0xd5, 0xc8, 0x3d, 0x54, 0x6b, 0x87, 0x4c, 0x88, 0x05, 0xf3, 0x6d, 0x77, 0xe4, 0x1e, + 0x87, 0xd3, 0x82, 0xcd, 0xf3, 0x52, 0x99, 0x62, 0x06, 0x81, 0xaa, 0x4c, 0xc1, 0x8b, 0xc9, 0x1d, + 0x28, 0xda, 0x76, 0x43, 0x84, 0xca, 0x5b, 0x49, 0x04, 0x7e, 0xdb, 0x6e, 0x70, 0xd7, 0x80, 0x30, + 0x3c, 0x56, 0xc8, 0x18, 0x32, 0xf9, 0x45, 0x58, 0x52, 0xee, 0x23, 0x22, 0xc8, 0x24, 0xf6, 0x81, + 0xf2, 0xbe, 0x53, 0xdd, 0x34, 0x14, 0x6c, 0x52, 0x07, 0xfd, 0xfe, 0xf8, 0xb1, 0x67, 0x0e, 0x87, + 0x18, 0x32, 0xe2, 0x53, 0x6f, 0xc4, 0x05, 0xb9, 0x72, 0x92, 0x9d, 0x05, 0x1f, 0x53, 0xf5, 0x64, + 0xa9, 0xaa, 0x8f, 0xcc, 0x52, 0x92, 0x36, 0xac, 0xdb, 0x5e, 0x34, 0x1e, 0x72, 0x2f, 0xad, 0x1d, + 0x7e, 0x11, 0xe2, 0x21, 0x29, 0x31, 0x91, 0x45, 0xc8, 0x0a, 0xa5, 0x6b, 0xdc, 0xc1, 0xc4, 0x65, + 0x68, 0x92, 0xd8, 0xf0, 0xd4, 0x21, 0x57, 0x25, 0x78, 0x6d, 0x86, 0x04, 0xcf, 0xe4, 0xe3, 0x89, + 0xb0, 0xc9, 0x78, 0x0f, 0x51, 0xc2, 0x26, 0xa7, 0x82, 0x25, 0xff, 0xa0, 0xa4, 0x44, 0xee, 0x17, + 0x63, 0xf1, 0x1e, 0xc0, 0xbd, 0xc0, 0x1f, 0x34, 0xbc, 0xe8, 0x28, 0xe8, 0x29, 0xaf, 0x77, 0x97, + 0x3e, 0x0e, 0xfc, 0x81, 0x73, 0x8c, 0xe0, 0xbf, 0xfa, 0xe2, 0xba, 0x82, 0x44, 0x95, 0xff, 0xc9, + 0xd7, 0x60, 0x91, 0xfd, 0xea, 0x24, 0xbe, 0x66, 0x5c, 0x6d, 0x8f, 0xd4, 0x3c, 0x67, 0x5e, 0x82, + 0x40, 0xee, 0x62, 0x96, 0x48, 0x7f, 0x18, 0x29, 0xc2, 0xab, 0x4c, 0x09, 0xe9, 0x0f, 0xa3, 0xec, + 0xd3, 0x5d, 0x05, 0x99, 0xec, 0xc5, 0x55, 0x97, 0x89, 0x5d, 0x45, 0x32, 0x4a, 0xf1, 0xfe, 0x17, + 0x8b, 0x1c, 0x99, 0x05, 0x42, 0x7d, 0xff, 0x9b, 0x21, 0xc3, 0x4a, 0xd8, 0x7b, 0x55, 0x71, 0xeb, + 0x9c, 0x53, 0x2a, 0x11, 0x1e, 0xf5, 0xc4, 0x1d, 0x32, 0x55, 0x89, 0x18, 0x99, 0x6c, 0xc3, 0x1a, + 0x97, 0xfa, 0xe3, 0x14, 0xf0, 0x42, 0xc4, 0xc5, 0xbd, 0x2d, 0xc9, 0x11, 0xaf, 0x7e, 0x3e, 0x43, + 0x40, 0x76, 0x60, 0x0e, 0x35, 0x08, 0xe2, 0x71, 0xce, 0x65, 0x55, 0x93, 0x94, 0x5d, 0x47, 0xb8, + 0xaf, 0xa0, 0x0e, 0x49, 0xdd, 0x57, 0x10, 0x95, 0xfc, 0x32, 0x80, 0x35, 0x18, 0x05, 0xfd, 0x3e, + 0xe6, 0x29, 0x29, 0xa7, 0x9e, 0xff, 0x0b, 0x3e, 0xc8, 0x25, 0x41, 0x12, 0x31, 0xb5, 0xf1, 0xb7, + 0x93, 0xc9, 0x66, 0xa2, 0xf0, 0x32, 0x6a, 0x30, 0xcf, 0x17, 0x23, 0xe6, 0xfc, 0x11, 0x99, 0x11, + 0x95, 0x8c, 0x31, 0x3c, 0xe7, 0x8f, 0x80, 0x4f, 0xe6, 0xfc, 0x51, 0x08, 0x8c, 0xfb, 0xb0, 0x91, + 0xd7, 0xb0, 0x94, 0xce, 0x43, 0x3b, 0xad, 0xce, 0xe3, 0x0f, 0x8a, 0xb0, 0x8c, 0xdc, 0xe4, 0x2e, + 0x6c, 0xc2, 0x8a, 0x3d, 0x7e, 0x1c, 0x07, 0xc4, 0x95, 0xbb, 0x31, 0xd6, 0x2f, 0x54, 0x0b, 0x54, + 0x33, 0x6f, 0x8a, 0x82, 0x58, 0xb0, 0x2a, 0x4f, 0x82, 0x5d, 0xf9, 0x90, 0x25, 0x4e, 0xb7, 0x23, + 0xdf, 0xf7, 0x08, 0x1f, 0x5a, 0x55, 0xa1, 0x91, 0x26, 0x4a, 0xce, 0x83, 0xe2, 0xf3, 0x9c, 0x07, + 0xa5, 0x53, 0x9d, 0x07, 0x1f, 0xc1, 0xb2, 0xfc, 0x1a, 0xee, 0xe4, 0x73, 0x5f, 0x6e, 0x27, 0x4f, + 0x31, 0x23, 0xf5, 0x78, 0x47, 0x9f, 0x9f, 0xb9, 0xa3, 0xa3, 0xed, 0x5c, 0xae, 0xb2, 0x21, 0xc2, + 0x26, 0x37, 0x76, 0xe3, 0xcf, 0x8b, 0x00, 0xbb, 0x95, 0xf6, 0xcf, 0x70, 0x4a, 0xbe, 0x05, 0x8b, + 0xf5, 0x40, 0x9a, 0x4d, 0x15, 0x7b, 0x55, 0x5f, 0x02, 0x55, 0x71, 0x21, 0xc6, 0x8c, 0x4f, 0xb7, + 0xe2, 0x57, 0x71, 0xba, 0xdd, 0x45, 0xbd, 0xce, 0xc7, 0x5e, 0x37, 0x4a, 0x32, 0x3f, 0xe3, 0x92, + 0x91, 0xf1, 0xec, 0xd2, 0x66, 0x33, 0x05, 0x99, 0xed, 0x4e, 0xc2, 0x23, 0x4b, 0x06, 0xa9, 0x10, + 0xa9, 0x58, 0x71, 0x77, 0x92, 0x91, 0x3e, 0x64, 0xdc, 0x0b, 0x75, 0x7b, 0xc8, 0x90, 0x7d, 0xb5, + 0x03, 0x42, 0x3e, 0x8c, 0x5d, 0x68, 0x17, 0x66, 0xf5, 0x90, 0x31, 0xd1, 0x43, 0x53, 0x1d, 0x67, + 0x8d, 0x1f, 0x6b, 0x6a, 0xae, 0xb3, 0x9f, 0x61, 0xa8, 0xdf, 0x01, 0x88, 0xfd, 0x56, 0xe4, 0x58, + 0xc7, 0x71, 0x0c, 0x38, 0x54, 0xed, 0xe5, 0x04, 0x57, 0x69, 0x4d, 0xf1, 0xab, 0x6a, 0x4d, 0x07, + 0x96, 0x5a, 0x4f, 0x22, 0x37, 0x71, 0x74, 0x02, 0x3b, 0x96, 0x64, 0x71, 0x67, 0x2a, 0xa2, 0x5a, + 0xee, 0x9c, 0x22, 0x07, 0x4f, 0x11, 0x81, 0x15, 0x42, 0xe3, 0xaf, 0x35, 0x58, 0x53, 0x43, 0x14, + 0x9d, 0x0c, 0xba, 0xe4, 0x7d, 0x9e, 0x7a, 0x41, 0x4b, 0x5d, 0x59, 0x14, 0x24, 0xb6, 0xe5, 0x9e, + 0x0c, 0xba, 0x5c, 0x00, 0x72, 0x9f, 0xaa, 0x95, 0x65, 0x84, 0xe4, 0x31, 0x2c, 0xb7, 0x83, 0x7e, + 0x9f, 0x89, 0x35, 0xa3, 0x4f, 0xc5, 0x05, 0x80, 0x31, 0xca, 0x5a, 0xcf, 0x64, 0x85, 0xb6, 0x5f, + 0x10, 0xf7, 0xdc, 0x0b, 0x43, 0xb6, 0xdf, 0xfb, 0x82, 0x2e, 0x61, 0xfb, 0x39, 0xbe, 0x54, 0x55, + 0x79, 0x26, 0x67, 0x53, 0x3a, 0x67, 0x97, 0x5a, 0x4b, 0x56, 0x8c, 0xf5, 0x9c, 0x71, 0x36, 0x19, + 0x7f, 0x5f, 0x83, 0x1b, 0x93, 0x4d, 0xab, 0xf4, 0x83, 0x71, 0xaf, 0x33, 0x72, 0xfd, 0x7e, 0x3d, + 0x38, 0x0c, 0x79, 0xc8, 0xfa, 0xc3, 0x44, 0x43, 0x2d, 0x42, 0xd6, 0x1f, 0xfa, 0xd9, 0x90, 0xf5, + 0xf8, 0x74, 0xfd, 0x4d, 0x28, 0xdb, 0x1f, 0xda, 0x1f, 0x8e, 0x3d, 0x79, 0x17, 0xe6, 0xfb, 0x43, + 0xf8, 0x49, 0xe8, 0x7c, 0xc2, 0x80, 0xea, 0x89, 0x21, 0x11, 0x8d, 0x7f, 0x5f, 0x00, 0x32, 0x59, + 0x0f, 0x75, 0x0b, 0xd6, 0xfe, 0x1f, 0x88, 0xe4, 0x19, 0x51, 0xb6, 0xf4, 0x5c, 0xa2, 0xec, 0x27, + 0xa0, 0x77, 0x59, 0x3f, 0x3a, 0x11, 0xeb, 0x48, 0xa7, 0x1f, 0xc4, 0x27, 0xc2, 0x2f, 0x4c, 0x9d, + 0x53, 0xe9, 0x8e, 0xe7, 0x7b, 0x52, 0x96, 0x89, 0x7a, 0xb8, 0x75, 0x53, 0xf8, 0xc6, 0xef, 0x6b, + 0xb0, 0x91, 0x37, 0x05, 0xd8, 0xe1, 0xa9, 0x9e, 0xa6, 0xf1, 0x59, 0x8e, 0x87, 0xa7, 0x7a, 0x00, + 0xa7, 0x4f, 0xf4, 0x0c, 0x51, 0xb6, 0x3f, 0x0a, 0xcf, 0xd3, 0x1f, 0xc6, 0x7f, 0x2d, 0xc2, 0x32, + 0x37, 0x6a, 0xee, 0x79, 0x6e, 0x3f, 0x3a, 0x62, 0x83, 0x2b, 0x73, 0x50, 0x2a, 0xae, 0xaf, 0x33, + 0x92, 0x4f, 0xde, 0xc1, 0x74, 0xff, 0x51, 0xd0, 0x0d, 0xfa, 0xaa, 0x52, 0x70, 0x28, 0x60, 0x99, + 0x6c, 0xff, 0x08, 0x63, 0x73, 0x57, 0xa4, 0x14, 0x28, 0x26, 0x73, 0x97, 0x1b, 0xba, 0xd5, 0xb9, + 0x2b, 0x8c, 0xca, 0x9f, 0xc1, 0xd9, 0xc4, 0x4e, 0x1d, 0x5b, 0xb7, 0x4f, 0xf1, 0xaa, 0x68, 0x4b, + 0xbc, 0x2a, 0xba, 0x96, 0x98, 0xbe, 0xd1, 0x66, 0x8f, 0xa5, 0x99, 0x3c, 0x0c, 0x79, 0x9f, 0x20, + 0xf7, 0x41, 0x4f, 0xc0, 0x22, 0x41, 0x04, 0x97, 0x78, 0x31, 0x78, 0x93, 0xc2, 0x76, 0x22, 0x57, + 0xc4, 0x04, 0x21, 0x3b, 0xe4, 0x12, 0x98, 0x95, 0x3c, 0x2b, 0x93, 0xe6, 0x9f, 0x98, 0x17, 0xbe, + 0x1e, 0x52, 0x0f, 0xb9, 0x0c, 0x19, 0x1b, 0x23, 0x99, 0xd7, 0x64, 0x21, 0x19, 0x23, 0xf1, 0x1e, + 0x5f, 0x1d, 0x23, 0x81, 0xb5, 0xf5, 0x3d, 0x0d, 0xd6, 0x6a, 0x66, 0x43, 0xe4, 0x30, 0xe4, 0xbd, + 0x7a, 0x13, 0xae, 0xd6, 0xcc, 0x86, 0xd3, 0x6e, 0xd5, 0x6b, 0x95, 0x47, 0x4e, 0x6e, 0x6a, 0xa2, + 0xab, 0x70, 0x71, 0x12, 0x25, 0x31, 0xe9, 0x5f, 0x81, 0xcd, 0xc9, 0x62, 0x99, 0xbe, 0x28, 0x9f, + 0x58, 0x66, 0x3a, 0x2a, 0x6e, 0x7d, 0x00, 0x6b, 0x32, 0x55, 0x4f, 0xa7, 0x6e, 0x63, 0x32, 0xc0, + 0x35, 0x58, 0x7a, 0x60, 0xd1, 0xda, 0xce, 0x23, 0x67, 0x67, 0xbf, 0x5e, 0xd7, 0xcf, 0x90, 0x15, + 0x58, 0x14, 0x80, 0x8a, 0xa9, 0x6b, 0x64, 0x19, 0xca, 0xb5, 0xa6, 0x6d, 0x55, 0xf6, 0xa9, 0xa5, + 0x17, 0xb6, 0xfe, 0x85, 0x06, 0x2b, 0xfb, 0xc3, 0x9e, 0x1b, 0x79, 0x23, 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, 0x3e, 0x80, 0xd5, 0x76, 0xfc, 0x4e, 0x01, 0x3d, 0x06, 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, 0xe5, 0xfb, 0xec, 0xa4, 0xee, 0x87, 0x91, 0x37, 0xf0, 0x46, 0xd8, 0x47, 0xcb, 0x50, + 0xb6, 0x3d, 0x26, 0xaf, 0x44, 0x1e, 0xef, 0xa0, 0xc6, 0xb8, 0x1f, 0xf9, 0xc3, 0xbe, 0xf7, 0x99, + 0xae, 0x6d, 0xdd, 0x85, 0x35, 0x1a, 0x8c, 0x23, 0x7f, 0x70, 0x68, 0x47, 0x0c, 0xe3, 0xf0, 0x04, + 0xdb, 0xdc, 0x34, 0x1b, 0xdb, 0xb5, 0xdd, 0xfd, 0xd6, 0xbe, 0xed, 0x34, 0xcc, 0x4e, 0x65, 0x8f, + 0xfb, 0x2b, 0x34, 0x5a, 0x76, 0xc7, 0xa1, 0x56, 0xc5, 0x6a, 0x76, 0x74, 0x6d, 0xeb, 0x77, 0x51, + 0x83, 0xdb, 0x0d, 0x06, 0xbd, 0x1d, 0xb7, 0x1b, 0x05, 0x23, 0xac, 0xb0, 0x01, 0xd7, 0x6c, 0xab, + 0xd2, 0x6a, 0x56, 0x9d, 0x1d, 0xb3, 0xd2, 0x69, 0xd1, 0xbc, 0xdc, 0x5d, 0x97, 0xe0, 0x7c, 0x0e, + 0x4e, 0xab, 0xd3, 0xd6, 0x35, 0x72, 0x1d, 0x2e, 0xe7, 0x94, 0x3d, 0xb4, 0xb6, 0xcd, 0xfd, 0xce, + 0x5e, 0x53, 0x2f, 0x4c, 0x21, 0xb6, 0xed, 0x96, 0x5e, 0xdc, 0xfa, 0x6d, 0x0d, 0x56, 0xf7, 0x43, + 0xf1, 0x3c, 0x6a, 0x1f, 0xa3, 0x4a, 0xdc, 0x80, 0x2b, 0xfb, 0xb6, 0x45, 0x9d, 0x4e, 0xeb, 0xbe, + 0xd5, 0x74, 0xf6, 0x6d, 0x73, 0x37, 0x5b, 0x9b, 0xeb, 0x70, 0x59, 0xc1, 0xa0, 0x56, 0xa5, 0xf5, + 0xc0, 0xa2, 0x4e, 0xdb, 0xb4, 0xed, 0x87, 0x2d, 0x5a, 0xd5, 0x35, 0xf6, 0xc5, 0x1c, 0x84, 0xc6, + 0x8e, 0xc9, 0x6b, 0x93, 0x2a, 0x6b, 0x5a, 0x0f, 0xcd, 0xba, 0xb3, 0xdd, 0xea, 0xe8, 0xc5, 0xad, + 0x06, 0xbb, 0x45, 0x60, 0x06, 0x1d, 0xee, 0xe2, 0x5e, 0x86, 0x52, 0xb3, 0xd5, 0xb4, 0xb2, 0x5e, + 0x2e, 0xcb, 0x50, 0x36, 0xdb, 0x6d, 0xda, 0x7a, 0x80, 0x93, 0x07, 0x60, 0xbe, 0x6a, 0x35, 0x6b, + 0x38, 0x5b, 0x96, 0xa1, 0xdc, 0xa6, 0xad, 0x46, 0xab, 0x63, 0x55, 0xf5, 0xd2, 0x16, 0x95, 0x07, + 0xab, 0x64, 0xda, 0x0d, 0xb8, 0x4b, 0x49, 0xd5, 0xda, 0x31, 0xf7, 0xeb, 0x1d, 0x31, 0x44, 0x8f, + 0x1c, 0x6a, 0x7d, 0xb8, 0x6f, 0xd9, 0x1d, 0x5b, 0xd7, 0x88, 0x0e, 0xcb, 0x4d, 0xcb, 0xaa, 0xda, + 0x0e, 0xb5, 0x1e, 0xd4, 0xac, 0x87, 0x7a, 0x81, 0xf1, 0xe4, 0xff, 0xb3, 0x2f, 0x6c, 0xfd, 0x40, + 0x03, 0xc2, 0xb3, 0x0f, 0xc9, 0x94, 0xb6, 0x38, 0x63, 0xae, 0xc1, 0xa5, 0x3d, 0x36, 0xd4, 0xd8, + 0xb4, 0x46, 0xab, 0x9a, 0xed, 0xb2, 0xf3, 0x40, 0x32, 0xe5, 0xad, 0x9d, 0x1d, 0x5c, 0x16, 0x67, + 0x33, 0xf0, 0x2a, 0x6d, 0xb5, 0xf5, 0xc2, 0xa5, 0x42, 0x59, 0x23, 0x17, 0x26, 0x0a, 0xef, 0x5b, + 0x56, 0x5b, 0x2f, 0xb2, 0x21, 0xca, 0x14, 0xc8, 0x25, 0xcb, 0xc9, 0x4b, 0x5b, 0xdf, 0xd5, 0xe0, + 0x3c, 0xaf, 0xa6, 0x5c, 0xff, 0x71, 0x55, 0xaf, 0xc0, 0xa6, 0xc8, 0xa9, 0x96, 0x57, 0xd1, 0x0d, + 0xd0, 0x53, 0xa5, 0xbc, 0x9a, 0xe7, 0x60, 0x3d, 0x05, 0xc5, 0x7a, 0x14, 0xd8, 0xee, 0x96, 0x02, + 0x6f, 0x5b, 0x76, 0xc7, 0xb1, 0x76, 0x76, 0x5a, 0xb4, 0xc3, 0x2b, 0x52, 0xdc, 0x32, 0x60, 0xbd, + 0xe2, 0x8d, 0x22, 0xeb, 0xb3, 0xc8, 0x1b, 0x84, 0x7e, 0x30, 0xc0, 0x2a, 0xac, 0xc0, 0xa2, 0xf5, + 0xcb, 0x1d, 0xab, 0x69, 0xd7, 0x5a, 0x4d, 0xfd, 0xcc, 0xd6, 0x95, 0x0c, 0x8e, 0x5c, 0xc7, 0xb6, + 0xbd, 0xa7, 0x9f, 0xd9, 0x72, 0x61, 0x45, 0xbe, 0x00, 0xe2, 0xb3, 0xe2, 0x1a, 0x5c, 0x92, 0x73, + 0x0d, 0xf7, 0x84, 0x6c, 0x13, 0x36, 0x61, 0x63, 0xb2, 0xdc, 0xea, 0xe8, 0x1a, 0x1b, 0x85, 0x4c, + 0x09, 0x83, 0x17, 0xb6, 0x7e, 0x53, 0x83, 0x95, 0xd8, 0x58, 0x8b, 0xc6, 0xa0, 0xeb, 0x70, 0xb9, + 0xb1, 0x63, 0x3a, 0x55, 0xeb, 0x41, 0xad, 0x62, 0x39, 0xf7, 0x6b, 0xcd, 0x6a, 0xe6, 0x23, 0x17, + 0xe1, 0x5c, 0x0e, 0x02, 0x7e, 0x65, 0x13, 0x36, 0xb2, 0x45, 0x1d, 0xb6, 0x54, 0x0b, 0xac, 0xeb, + 0xb3, 0x25, 0xf1, 0x3a, 0x2d, 0x6e, 0x3d, 0x80, 0x55, 0xdb, 0x6c, 0xd4, 0x77, 0x82, 0x51, 0xd7, + 0x33, 0xc7, 0xd1, 0xd1, 0x80, 0x6d, 0x9a, 0x3b, 0x2d, 0x5a, 0xb1, 0x1c, 0x44, 0xc9, 0xd4, 0xe0, + 0x2c, 0xac, 0xa9, 0x85, 0x8f, 0x2c, 0x36, 0x7d, 0x09, 0xac, 0xaa, 0xc0, 0x66, 0x4b, 0x2f, 0x6c, + 0xfd, 0x0a, 0x2c, 0xa7, 0x32, 0xdb, 0x5f, 0x80, 0xb3, 0xea, 0xef, 0xb6, 0x37, 0xe8, 0xf9, 0x83, + 0x43, 0xfd, 0x4c, 0xb6, 0x80, 0x8e, 0x07, 0x03, 0x56, 0x80, 0xeb, 0x59, 0x2d, 0xe8, 0x78, 0xa3, + 0x63, 0x7f, 0xe0, 0x46, 0x5e, 0x4f, 0x2f, 0x6c, 0xbd, 0x0e, 0x2b, 0xa9, 0x7c, 0x5a, 0x6c, 0xe0, + 0xea, 0x2d, 0xb1, 0x01, 0x37, 0xac, 0x6a, 0x6d, 0xbf, 0xa1, 0xcf, 0xb1, 0x95, 0xbc, 0x57, 0xdb, + 0xdd, 0xd3, 0x61, 0xeb, 0xf7, 0x34, 0x58, 0x15, 0x59, 0x72, 0x1b, 0x3b, 0xa6, 0x1c, 0x6a, 0x36, + 0xcd, 0x78, 0x96, 0x3e, 0xcb, 0xb6, 0xb9, 0x73, 0xd7, 0x15, 0xd8, 0x14, 0x3f, 0x1c, 0xb3, 0x59, + 0x75, 0xf6, 0x4c, 0x5a, 0x7d, 0x68, 0x52, 0x36, 0xf7, 0x1e, 0xe9, 0x05, 0x5c, 0x50, 0x0a, 0xc4, + 0xe9, 0xb4, 0xf6, 0x2b, 0x7b, 0x7a, 0x91, 0xcd, 0xdf, 0x14, 0xbc, 0x5d, 0x6b, 0xea, 0x25, 0x5c, + 0x9e, 0x13, 0xd8, 0xc8, 0x96, 0x95, 0xcf, 0x6d, 0xfd, 0x54, 0x83, 0x0b, 0xb6, 0x7f, 0x38, 0x70, + 0xa3, 0xf1, 0xc8, 0x33, 0xfb, 0x87, 0xc1, 0xc8, 0x8f, 0x8e, 0x8e, 0xed, 0xb1, 0x1f, 0x79, 0xe4, + 0x15, 0x78, 0xc9, 0xae, 0xed, 0x36, 0xcd, 0x0e, 0x5b, 0x5e, 0x66, 0x7d, 0xb7, 0x45, 0x6b, 0x9d, + 0xbd, 0x86, 0x63, 0xef, 0xd7, 0x26, 0x66, 0xde, 0x8b, 0x70, 0x63, 0x3a, 0x6a, 0xdd, 0xda, 0x35, + 0x2b, 0x8f, 0x74, 0x6d, 0x36, 0xc3, 0x6d, 0xb3, 0x6e, 0x36, 0x2b, 0x56, 0xd5, 0x79, 0x70, 0x5b, + 0x2f, 0x90, 0x97, 0xe0, 0xe6, 0x74, 0xd4, 0x9d, 0x5a, 0xdb, 0x66, 0x68, 0xc5, 0xd9, 0xdf, 0xdd, + 0xb3, 0x1b, 0x0c, 0xab, 0xb4, 0xf5, 0xfb, 0x1a, 0x6c, 0x4e, 0x8b, 0x8a, 0x4b, 0x6e, 0x81, 0x61, + 0x35, 0x3b, 0xd4, 0xac, 0x55, 0x9d, 0x0a, 0xb5, 0xaa, 0x56, 0xb3, 0x53, 0x33, 0xeb, 0xb6, 0x63, + 0xb7, 0xf6, 0xd9, 0x6c, 0x4a, 0x7c, 0xf0, 0x5e, 0x80, 0xeb, 0x33, 0xf0, 0x5a, 0xb5, 0x6a, 0x45, + 0xd7, 0xc8, 0x6d, 0x78, 0x6d, 0x06, 0x92, 0xfd, 0xc8, 0xee, 0x58, 0x0d, 0xb5, 0x44, 0x2f, 0xe0, + 0x86, 0x95, 0x1f, 0x10, 0x94, 0xb5, 0x0e, 0x4b, 0x66, 0x57, 0xec, 0x26, 0x5c, 0x9d, 0x8a, 0x25, + 0xaa, 0xf5, 0x02, 0x5c, 0x9f, 0x8a, 0xc2, 0x2b, 0xa5, 0x17, 0xb6, 0x3e, 0x82, 0x4b, 0xd3, 0x83, + 0xd7, 0xb1, 0xf3, 0x22, 0x3d, 0xe4, 0x65, 0x28, 0x55, 0xd9, 0x11, 0x95, 0xca, 0x2a, 0xc9, 0x66, + 0x27, 0xb5, 0x6a, 0x8d, 0x36, 0xdb, 0x08, 0xc5, 0xe1, 0x82, 0xa7, 0xc7, 0x77, 0x34, 0xd0, 0xb3, + 0x11, 0x9f, 0x26, 0xdc, 0x39, 0xe9, 0x7e, 0xb3, 0xc9, 0x0f, 0xba, 0x35, 0x58, 0x6a, 0x75, 0xf6, + 0x2c, 0x2a, 0x12, 0x76, 0x62, 0x86, 0xce, 0xfd, 0x26, 0x5b, 0xda, 0x2d, 0x5a, 0xfb, 0x16, 0x9e, + 0x78, 0x9b, 0xb0, 0x61, 0xd7, 0xcd, 0xca, 0x7d, 0xa7, 0xd9, 0xea, 0x38, 0xb5, 0xa6, 0x53, 0xd9, + 0x33, 0x9b, 0x4d, 0xab, 0xae, 0x03, 0xdb, 0xb3, 0x5b, 0xf7, 0x3b, 0xa6, 0x53, 0x69, 0x35, 0x77, + 0x6a, 0xbb, 0x82, 0xc5, 0x06, 0xce, 0x82, 0x69, 0x01, 0x0c, 0xc8, 0xd7, 0xe0, 0x65, 0xa4, 0x69, + 0xd7, 0xf7, 0x77, 0x6b, 0x4d, 0xc7, 0x7e, 0xd4, 0xac, 0x48, 0xb1, 0xab, 0x32, 0x79, 0x56, 0xbc, + 0x0c, 0x2f, 0xce, 0xc4, 0x4e, 0x32, 0x6e, 0xde, 0x02, 0x63, 0x26, 0xa6, 0x68, 0xdf, 0xd6, 0x9f, + 0x68, 0x70, 0x79, 0x86, 0xd3, 0x0d, 0x79, 0x0d, 0x5e, 0xd9, 0xb3, 0xcc, 0x6a, 0xdd, 0xb2, 0x6d, + 0xdc, 0xe1, 0xd8, 0x20, 0x72, 0x6f, 0xd0, 0xdc, 0x93, 0xe0, 0x15, 0x78, 0x69, 0x36, 0x7a, 0x22, + 0x53, 0xbc, 0x0c, 0x2f, 0xce, 0x46, 0x15, 0x32, 0x46, 0x81, 0x6c, 0xc1, 0xad, 0xd9, 0x98, 0xb1, + 0x6c, 0x52, 0xdc, 0xfa, 0x1d, 0x0d, 0xce, 0xe7, 0xeb, 0xb9, 0x59, 0xdd, 0x6a, 0x4d, 0xbb, 0x63, + 0xd6, 0xeb, 0x4e, 0xdb, 0xa4, 0x66, 0xc3, 0xb1, 0x9a, 0xb4, 0x55, 0xaf, 0xe7, 0x9d, 0xc9, 0x2f, + 0xc2, 0x8d, 0xe9, 0xa8, 0x76, 0x85, 0xd6, 0xda, 0xec, 0xd8, 0x31, 0xe0, 0xda, 0x74, 0x2c, 0xab, + 0x56, 0xb1, 0xf4, 0xc2, 0xf6, 0x7b, 0x7f, 0xfc, 0xe7, 0xd7, 0xce, 0xfc, 0xf1, 0x4f, 0xaf, 0x69, + 0xff, 0xf1, 0xa7, 0xd7, 0xb4, 0x3f, 0xfb, 0xe9, 0x35, 0xed, 0x5b, 0xaf, 0x9e, 0x2e, 0x59, 0x35, + 0xde, 0xda, 0x1f, 0xcf, 0xe3, 0xf5, 0xef, 0xcd, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x64, 0x5c, + 0x5d, 0xca, 0xe8, 0xe1, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -37813,6 +37863,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) @@ -38376,6 +38440,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) @@ -39424,12 +39524,12 @@ func (m *UserSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x42 - n210, err210 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err210 != nil { - return 0, err210 + 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 -= n210 - i = encodeVarintTypes(dAtA, i, uint64(n210)) + i -= n211 + i = encodeVarintTypes(dAtA, i, uint64(n211)) i-- dAtA[i] = 0x3a { @@ -39585,21 +39685,21 @@ func (m *LoginStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n213, err213 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockExpires):]) - if err213 != nil { - return 0, err213 - } - i -= n213 - i = encodeVarintTypes(dAtA, i, uint64(n213)) - i-- - dAtA[i] = 0x22 - n214, err214 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LockedTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LockedTime):]) + 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 -= n214 i = encodeVarintTypes(dAtA, i, uint64(n214)) i-- + dAtA[i] = 0x22 + 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 -= n215 + i = encodeVarintTypes(dAtA, i, uint64(n215)) + i-- dAtA[i] = 0x1a if len(m.LockedMessage) > 0 { i -= len(m.LockedMessage) @@ -39655,12 +39755,12 @@ func (m *CreatedBy) MarshalToSizedBuffer(dAtA []byte) (int, error) { } i-- dAtA[i] = 0x1a - n216, err216 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Time, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Time):]) - if err216 != nil { - return 0, err216 + 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 -= n216 - i = encodeVarintTypes(dAtA, i, uint64(n216)) + i -= n217 + i = encodeVarintTypes(dAtA, i, uint64(n217)) i-- dAtA[i] = 0x12 if m.Connector != nil { @@ -39778,21 +39878,21 @@ func (m *MFADevice) MarshalToSizedBuffer(dAtA []byte) (int, error) { } } } - n219, err219 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUsed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUsed):]) - if err219 != nil { - return 0, err219 - } - i -= n219 - i = encodeVarintTypes(dAtA, i, uint64(n219)) - i-- - dAtA[i] = 0x3a - n220, err220 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.AddedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.AddedAt):]) + 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 -= n220 i = encodeVarintTypes(dAtA, i, uint64(n220)) i-- + dAtA[i] = 0x3a + 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 -= n221 + i = encodeVarintTypes(dAtA, i, uint64(n221)) + i-- dAtA[i] = 0x32 if len(m.Id) > 0 { i -= len(m.Id) @@ -40488,12 +40588,12 @@ func (m *TunnelConnectionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x22 } - n232, err232 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err232 != nil { - return 0, err232 + 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 -= n232 - i = encodeVarintTypes(dAtA, i, uint64(n232)) + i -= n233 + i = encodeVarintTypes(dAtA, i, uint64(n233)) i-- dAtA[i] = 0x1a if len(m.ProxyName) > 0 { @@ -40585,12 +40685,12 @@ func (m *AcquireSemaphoreRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x2a } - 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 + 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 -= n233 - i = encodeVarintTypes(dAtA, i, uint64(n233)) + i -= n234 + i = encodeVarintTypes(dAtA, i, uint64(n234)) i-- dAtA[i] = 0x22 if m.MaxLeases != 0 { @@ -40639,12 +40739,12 @@ func (m *SemaphoreLease) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - 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 + 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 -= n234 - i = encodeVarintTypes(dAtA, i, uint64(n234)) + i -= n235 + i = encodeVarintTypes(dAtA, i, uint64(n235)) i-- dAtA[i] = 0x2a if len(m.LeaseID) > 0 { @@ -40702,12 +40802,12 @@ func (m *SemaphoreLeaseRef) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - 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 + 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 -= n235 - i = encodeVarintTypes(dAtA, i, uint64(n235)) + i -= n236 + i = encodeVarintTypes(dAtA, i, uint64(n236)) i-- dAtA[i] = 0x12 if len(m.LeaseID) > 0 { @@ -40979,29 +41079,29 @@ func (m *WebSessionSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x48 } - n242, err242 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LoginTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LoginTime):]) - if err242 != nil { - return 0, err242 - } - i -= n242 - i = encodeVarintTypes(dAtA, i, uint64(n242)) - i-- - dAtA[i] = 0x42 - n243, err243 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + 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 -= n243 i = encodeVarintTypes(dAtA, i, uint64(n243)) i-- - dAtA[i] = 0x3a - n244, err244 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.BearerTokenExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.BearerTokenExpires):]) + dAtA[i] = 0x42 + 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 -= n244 i = encodeVarintTypes(dAtA, i, uint64(n244)) i-- + dAtA[i] = 0x3a + 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 -= n245 + i = encodeVarintTypes(dAtA, i, uint64(n245)) + i-- dAtA[i] = 0x32 if len(m.BearerToken) > 0 { i -= len(m.BearerToken) @@ -41233,21 +41333,21 @@ func (m *SAMLSessionData) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 } - n245, err245 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpireTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpireTime):]) - if err245 != nil { - return 0, err245 - } - i -= n245 - i = encodeVarintTypes(dAtA, i, uint64(n245)) - i-- - dAtA[i] = 0x1a - n246, err246 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreateTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreateTime):]) + 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 -= n246 i = encodeVarintTypes(dAtA, i, uint64(n246)) i-- + dAtA[i] = 0x1a + 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 -= n247 + i = encodeVarintTypes(dAtA, i, uint64(n247)) + i-- dAtA[i] = 0x12 if len(m.ID) > 0 { i -= len(m.ID) @@ -41528,12 +41628,12 @@ func (m *RemoteClusterStatusV3) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n250, err250 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastHeartbeat, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastHeartbeat):]) - if err250 != nil { - return 0, err250 + 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 -= n250 - i = encodeVarintTypes(dAtA, i, uint64(n250)) + i -= n251 + i = encodeVarintTypes(dAtA, i, uint64(n251)) i-- dAtA[i] = 0x12 if len(m.Connection) > 0 { @@ -44320,12 +44420,12 @@ func (m *GithubAuthRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x62 } if m.Expires != nil { - n288, err288 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err288 != nil { - return 0, err288 + 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 -= n288 - i = encodeVarintTypes(dAtA, i, uint64(n288)) + i -= n289 + i = encodeVarintTypes(dAtA, i, uint64(n289)) i-- dAtA[i] = 0x5a } @@ -45337,21 +45437,21 @@ func (m *LockSpecV2) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a } - n306, err306 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CreatedAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CreatedAt):]) - if err306 != nil { - return 0, err306 + 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 -= n306 - i = encodeVarintTypes(dAtA, i, uint64(n306)) + i -= n307 + i = encodeVarintTypes(dAtA, i, uint64(n307)) i-- dAtA[i] = 0x22 if m.Expires != nil { - n307, err307 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err307 != nil { - return 0, err307 + 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 -= n307 - i = encodeVarintTypes(dAtA, i, uint64(n307)) + i -= n308 + i = encodeVarintTypes(dAtA, i, uint64(n308)) i-- dAtA[i] = 0x1a } @@ -46068,12 +46168,12 @@ func (m *RegisterUsingTokenRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro dAtA[i] = 0x6a } if m.Expires != nil { - n319, err319 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err319 != nil { - return 0, err319 + 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 -= n319 - i = encodeVarintTypes(dAtA, i, uint64(n319)) + i -= n320 + i = encodeVarintTypes(dAtA, i, uint64(n320)) i-- dAtA[i] = 0x62 } @@ -46253,12 +46353,12 @@ func (m *RecoveryCodesSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n322, err322 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err322 != nil { - return 0, err322 + 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 -= n322 - i = encodeVarintTypes(dAtA, i, uint64(n322)) + i -= n323 + i = encodeVarintTypes(dAtA, i, uint64(n323)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -46638,21 +46738,21 @@ func (m *SessionTrackerSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n326, err326 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err326 != nil { - return 0, err326 - } - i -= n326 - i = encodeVarintTypes(dAtA, i, uint64(n326)) - i-- - dAtA[i] = 0x2a - n327, err327 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + 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 -= n327 i = encodeVarintTypes(dAtA, i, uint64(n327)) i-- + dAtA[i] = 0x2a + 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 -= n328 + i = encodeVarintTypes(dAtA, i, uint64(n328)) + i-- dAtA[i] = 0x22 if m.State != 0 { i = encodeVarintTypes(dAtA, i, uint64(m.State)) @@ -46755,12 +46855,12 @@ func (m *Participant) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n328, err328 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastActive, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastActive):]) - if err328 != nil { - return 0, err328 + 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 -= n328 - i = encodeVarintTypes(dAtA, i, uint64(n328)) + i -= n329 + i = encodeVarintTypes(dAtA, i, uint64(n329)) i-- dAtA[i] = 0x22 if len(m.Mode) > 0 { @@ -47472,12 +47572,12 @@ func (m *ClusterAlertSpec) 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.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err341 != nil { - return 0, err341 + 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 -= n341 - i = encodeVarintTypes(dAtA, i, uint64(n341)) + i -= n342 + i = encodeVarintTypes(dAtA, i, uint64(n342)) i-- dAtA[i] = 0x1a if len(m.Message) > 0 { @@ -47607,12 +47707,12 @@ func (m *AlertAcknowledgement) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n342, err342 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err342 != nil { - return 0, err342 + 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 -= n342 - i = encodeVarintTypes(dAtA, i, uint64(n342)) + i -= n343 + i = encodeVarintTypes(dAtA, i, uint64(n343)) i-- dAtA[i] = 0x22 if len(m.Reason) > 0 { @@ -48364,12 +48464,12 @@ func (m *PluginGithubSettings) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n366, err366 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) - if err366 != nil { - return 0, err366 + 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 -= n366 - i = encodeVarintTypes(dAtA, i, uint64(n366)) + i -= n367 + i = encodeVarintTypes(dAtA, i, uint64(n367)) i-- dAtA[i] = 0x22 if len(m.OrganizationName) > 0 { @@ -50481,12 +50581,12 @@ func (m *PluginStatusV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - n383, err383 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastSyncTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastSyncTime):]) - if err383 != nil { - return 0, err383 + 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 -= n383 - i = encodeVarintTypes(dAtA, i, uint64(n383)) + i -= n384 + i = encodeVarintTypes(dAtA, i, uint64(n384)) i-- dAtA[i] = 0x1a if len(m.ErrorMessage) > 0 { @@ -50924,22 +51024,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 + n395, err395 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err395 != nil { + return 0, err395 } - i -= n394 - i = encodeVarintTypes(dAtA, i, uint64(n394)) + i -= n395 + i = encodeVarintTypes(dAtA, i, uint64(n395)) 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 + n396, err396 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err396 != nil { + return 0, err396 } - i -= n395 - i = encodeVarintTypes(dAtA, i, uint64(n395)) + i -= n396 + i = encodeVarintTypes(dAtA, i, uint64(n396)) i-- dAtA[i] = 0x1a } @@ -50998,22 +51098,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 + n397, err397 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err397 != nil { + return 0, err397 } - i -= n396 - i = encodeVarintTypes(dAtA, i, uint64(n396)) + i -= n397 + i = encodeVarintTypes(dAtA, i, uint64(n397)) 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 + n398, err398 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err398 != nil { + return 0, err398 } - i -= n397 - i = encodeVarintTypes(dAtA, i, uint64(n397)) + i -= n398 + i = encodeVarintTypes(dAtA, i, uint64(n398)) i-- dAtA[i] = 0x1a } @@ -51132,22 +51232,22 @@ func (m *PluginOktaStatusDetailsAccessListsSync) MarshalToSizedBuffer(dAtA []byt } } 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 + n399, err399 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastFailed, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastFailed):]) + if err399 != nil { + return 0, err399 } - i -= n398 - i = encodeVarintTypes(dAtA, i, uint64(n398)) + i -= n399 + i = encodeVarintTypes(dAtA, i, uint64(n399)) 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 + n400, err400 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.LastSuccessful, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.LastSuccessful):]) + if err400 != nil { + return 0, err400 } - i -= n399 - i = encodeVarintTypes(dAtA, i, uint64(n399)) + i -= n400 + i = encodeVarintTypes(dAtA, i, uint64(n400)) i-- dAtA[i] = 0x1a } @@ -51313,12 +51413,12 @@ func (m *PluginOAuth2AccessTokenCredentials) MarshalToSizedBuffer(dAtA []byte) ( i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n404, err404 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err404 != nil { - return 0, err404 + n405, err405 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err405 != nil { + return 0, err405 } - i -= n404 - i = encodeVarintTypes(dAtA, i, uint64(n404)) + i -= n405 + i = encodeVarintTypes(dAtA, i, uint64(n405)) i-- dAtA[i] = 0x1a if len(m.RefreshToken) > 0 { @@ -52276,21 +52376,21 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n419, err419 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err419 != nil { - return 0, err419 - } - i -= n419 - i = encodeVarintTypes(dAtA, i, uint64(n419)) - i-- - dAtA[i] = 0x12 - n420, err420 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + n420, err420 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) if err420 != nil { return 0, err420 } i -= n420 i = encodeVarintTypes(dAtA, i, uint64(n420)) i-- + dAtA[i] = 0x12 + n421, err421 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err421 != nil { + return 0, err421 + } + i -= n421 + i = encodeVarintTypes(dAtA, i, uint64(n421)) + i-- dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -52716,12 +52816,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n427, err427 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err427 != nil { - return 0, err427 + n428, err428 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err428 != nil { + return 0, err428 } - i -= n427 - i = encodeVarintTypes(dAtA, i, uint64(n427)) + i -= n428 + i = encodeVarintTypes(dAtA, i, uint64(n428)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -52729,12 +52829,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n428, err428 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err428 != nil { - return 0, err428 + n429, err429 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err429 != nil { + return 0, err429 } - i -= n428 - i = encodeVarintTypes(dAtA, i, uint64(n428)) + i -= n429 + i = encodeVarintTypes(dAtA, i, uint64(n429)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -54379,12 +54479,12 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - n455, err455 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) - if err455 != nil { - return 0, err455 + n456, err456 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err456 != nil { + return 0, err456 } - i -= n455 - i = encodeVarintTypes(dAtA, i, uint64(n455)) + i -= n456 + i = encodeVarintTypes(dAtA, i, uint64(n456)) i-- dAtA[i] = 0x12 if len(m.AWS) > 0 { @@ -54599,12 +54699,12 @@ func (m *TargetHealth) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x2a } if m.TransitionTimestamp != nil { - n458, err458 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) - if err458 != nil { - return 0, err458 + n459, err459 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.TransitionTimestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.TransitionTimestamp):]) + if err459 != nil { + return 0, err459 } - i -= n458 - i = encodeVarintTypes(dAtA, i, uint64(n458)) + i -= n459 + i = encodeVarintTypes(dAtA, i, uint64(n459)) i-- dAtA[i] = 0x22 } @@ -59350,6 +59450,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) } @@ -59394,6 +59498,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 @@ -98375,6 +98497,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:]) @@ -98595,6 +98753,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/constants.go b/constants.go index 4ddbea83d3002..cb729e15c9e35 100644 --- a/constants.go +++ b/constants.go @@ -654,6 +654,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-roles.mdx b/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx index 128657fc8d12e..3aac370bfc1b9 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-roles.mdx @@ -64,6 +64,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)|| @@ -124,6 +125,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| @@ -247,6 +254,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)|| @@ -307,6 +315,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| @@ -533,6 +547,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)|| @@ -593,6 +608,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| @@ -716,6 +737,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)|| @@ -776,6 +798,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 06cff4ba93001..c2cf95881526a 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv6.mdx @@ -64,6 +64,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)|| @@ -124,6 +125,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| @@ -247,6 +254,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)|| @@ -307,6 +315,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 140930e3b82b2..e284d8e49b783 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv7.mdx @@ -64,6 +64,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)|| @@ -124,6 +125,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| @@ -247,6 +254,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)|| @@ -307,6 +315,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 fc64854b6e677..39a68812abfd9 100644 --- a/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv8.mdx +++ b/docs/pages/reference/operator-resources/resources-teleport-dev-rolesv8.mdx @@ -64,6 +64,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)|| @@ -124,6 +125,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| @@ -247,6 +254,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)|| @@ -307,6 +315,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/role.mdx b/docs/pages/reference/terraform-provider/data-sources/role.mdx index 594ce5ccb8d6c..e46923aa8dda1 100644 --- a/docs/pages/reference/terraform-provider/data-sources/role.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/role.mdx @@ -79,6 +79,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)) @@ -145,6 +146,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: @@ -279,6 +287,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)) @@ -345,6 +354,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/role.mdx b/docs/pages/reference/terraform-provider/resources/role.mdx index 35721e10a9745..44f00299b1eb5 100644 --- a/docs/pages/reference/terraform-provider/resources/role.mdx +++ b/docs/pages/reference/terraform-provider/resources/role.mdx @@ -144,6 +144,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)) @@ -210,6 +211,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: @@ -344,6 +352,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)) @@ -410,6 +419,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_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/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/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index f6ca94127416a..b83b752bca544 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -2666,6 +2666,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, @@ -3163,6 +3172,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, @@ -27422,6 +27440,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 + } + } + } + } + } + } + } + } + } + } } } } @@ -29484,6 +29547,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 + } + } + } + } + } + } + } + } + } + } } } } @@ -34346,6 +34454,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 @@ -37928,6 +38121,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/services/access_checker.go b/lib/services/access_checker.go index 812a569395c27..fd7526d10211a 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -273,6 +273,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: @@ -810,6 +814,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 diff --git a/lib/services/access_checker_test.go b/lib/services/access_checker_test.go index 02465a12d3485..0f28904263f84 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 a646ee72516c5..f7324cf0db8eb 100644 --- a/lib/services/presets_test.go +++ b/lib/services/presets_test.go @@ -144,6 +144,9 @@ func TestAddRoleDefaults(t *testing.T) { GitHubPermissions: []types.GitHubPermission{{ Organizations: defaultGitHubOrgs()[teleport.PresetAccessRoleName], }}, + MCP: &types.MCPPermissions{ + Tools: defaultMCPTools()[teleport.PresetAccessRoleName], + }, }, }, }, @@ -179,6 +182,9 @@ func TestAddRoleDefaults(t *testing.T) { GitHubPermissions: []types.GitHubPermission{{ Organizations: defaultGitHubOrgs()[teleport.PresetAccessRoleName], }}, + MCP: &types.MCPPermissions{ + Tools: defaultMCPTools()[teleport.PresetAccessRoleName], + }, }, }, }, @@ -197,6 +203,9 @@ func TestAddRoleDefaults(t *testing.T) { GitHubPermissions: []types.GitHubPermission{{ Organizations: defaultGitHubOrgs()[teleport.PresetAccessRoleName], }}, + MCP: &types.MCPPermissions{ + Tools: defaultMCPTools()[teleport.PresetAccessRoleName], + }, }, }, }, @@ -216,6 +225,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 130cedc5a7a7e..f5c709110abf2 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -695,7 +695,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) } @@ -3587,3 +3587,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 bb742f4fbf865..88ed5ed3927ef 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -4562,9 +4562,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}, @@ -9968,3 +9969,101 @@ func TestCheckAccessToGitServer(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) + }) + } +} 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/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. From b3f09c4b23186911d6f584fd70d995895ea65e5f Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 29 May 2025 16:51:50 -0400 Subject: [PATCH 05/21] MCP access part 3: audit events and reporting (#54779) * MCP access part 3: audit events and reporting * add new icon, storybook, format --- .../teleport/legacy/types/events/events.proto | 173 + api/types/events/events.go | 72 +- api/types/events/events.pb.go | 5437 ++++++++++++----- api/types/events/events_test.go | 50 +- api/types/events/oneof.go | 16 + lib/events/api.go | 11 + lib/events/codes.go | 13 + lib/events/dynamic.go | 9 + .../teleport/aggregating/reporter.go | 3 + lib/usagereporter/teleport/audit.go | 9 + lib/usagereporter/teleport/audit_test.go | 21 + web/packages/design/src/Icon/Icons.story.tsx | 1 + .../src/Icon/Icons/ModelContextProtocol.tsx | 66 + web/packages/design/src/Icon/README.md | 4 + .../src/Icon/assets/ModelContextProtocol.svg | 11 + web/packages/design/src/Icon/index.ts | 1 + .../src/Audit/EventList/EventTypeCell.tsx | 5 + .../teleport/src/Audit/fixtures/index.ts | 115 + .../teleport/src/services/audit/makeEvent.ts | 43 + .../teleport/src/services/audit/types.ts | 52 + 20 files changed, 4521 insertions(+), 1591 deletions(-) create mode 100644 web/packages/design/src/Icon/Icons/ModelContextProtocol.tsx create mode 100644 web/packages/design/src/Icon/assets/ModelContextProtocol.svg diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 3e2c952973dbb..7a3d9b5f87fab 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4806,6 +4806,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; } } @@ -8515,3 +8519,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/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 b5bc65bfa5626..f310948940933 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -8093,6 +8093,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:"-"` @@ -8771,6 +8775,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() {} @@ -8983,6 +8999,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 { @@ -10468,6 +10488,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{}{ @@ -10682,6 +10730,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), } } @@ -16717,6 +16769,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) @@ -17005,6 +17313,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() { @@ -17012,1182 +17325,1202 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 18789 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, 0xf4, 0x2c, 0xbf, 0x0d, 0xbf, 0x65, 0x5a, 0x06, - 0x39, 0x0f, 0x67, 0x6e, 0x37, 0x26, 0xb5, 0xe6, 0xad, 0xfa, 0x5c, 0xad, 0x79, 0x7b, 0xae, 0xb1, - 0x30, 0x39, 0x51, 0x9f, 0xaa, 0x4f, 0xd6, 0xca, 0x7d, 0xe4, 0x14, 0x9c, 0x08, 0x51, 0xd3, 0xb7, - 0x67, 0xab, 0x73, 0xe5, 0x1c, 0x39, 0x09, 0xa3, 0x21, 0x70, 0x7c, 0x7e, 0xb1, 0x9c, 0x7f, 0xfa, - 0x27, 0x72, 0x00, 0x8c, 0xdf, 0xbc, 0x63, 0x2e, 0x9b, 0x16, 0x79, 0x04, 0xce, 0x21, 0xc5, 0xbc, - 0x56, 0xbf, 0x51, 0x9f, 0x8b, 0xf1, 0x3c, 0x03, 0x27, 0x65, 0xe4, 0xcc, 0xfc, 0x44, 0x75, 0xa6, - 0x9c, 0x0b, 0xaa, 0x12, 0xe0, 0x46, 0x63, 0xbe, 0x9c, 0x27, 0xa7, 0xa1, 0x2c, 0x03, 0xe7, 0x6f, - 0x2d, 0x56, 0xcb, 0x85, 0x38, 0xb4, 0x31, 0x51, 0x9f, 0x2d, 0x17, 0xc9, 0x39, 0x38, 0x25, 0x43, - 0x27, 0xe7, 0x16, 0xb5, 0x6a, 0xbd, 0x56, 0xee, 0x7f, 0xfa, 0x83, 0x30, 0x8c, 0xb1, 0x83, 0xc4, - 0xde, 0x79, 0x04, 0x06, 0xe7, 0xc7, 0x1b, 0x93, 0xda, 0x1d, 0x6c, 0x0d, 0x40, 0xa9, 0x36, 0x39, - 0xc7, 0x5a, 0x96, 0x7b, 0xfa, 0xff, 0xca, 0x01, 0x34, 0xa6, 0x16, 0x17, 0x04, 0xe1, 0x30, 0x0c, - 0xd4, 0xe7, 0xee, 0x54, 0x67, 0xea, 0x8c, 0x6e, 0x10, 0x8a, 0xf3, 0x0b, 0x93, 0xec, 0xf3, 0x87, - 0xa0, 0x7f, 0x62, 0x66, 0xbe, 0x31, 0x59, 0xce, 0x33, 0xa0, 0x36, 0x59, 0xad, 0x95, 0x0b, 0x0c, - 0x78, 0x57, 0xab, 0x2f, 0x4e, 0x96, 0x8b, 0xec, 0xcf, 0x99, 0xc6, 0x62, 0x75, 0xb1, 0xdc, 0xcf, - 0xfe, 0x9c, 0xc2, 0x3f, 0x4b, 0x8c, 0x59, 0x63, 0x72, 0x11, 0x7f, 0x0c, 0xb0, 0x26, 0x4c, 0xf9, - 0xbf, 0x06, 0x19, 0x8a, 0xb1, 0xae, 0xd5, 0xb5, 0xf2, 0x10, 0xfb, 0xc1, 0x58, 0xb2, 0x1f, 0xc0, - 0x1a, 0xa7, 0x4d, 0xce, 0xce, 0xdf, 0x99, 0x2c, 0x0f, 0x33, 0x5e, 0xb3, 0xb7, 0x18, 0x78, 0x84, - 0xfd, 0xa9, 0xcd, 0xb2, 0x3f, 0x47, 0x19, 0x27, 0x6d, 0xb2, 0x3a, 0xb3, 0x50, 0x5d, 0x9c, 0x2e, - 0x8f, 0xb1, 0xf6, 0x20, 0xcf, 0x13, 0xbc, 0xe4, 0x5c, 0x75, 0x76, 0xb2, 0x5c, 0x16, 0x34, 0xb5, - 0x99, 0xfa, 0xdc, 0xad, 0xf2, 0x49, 0x6c, 0xc8, 0x5b, 0xb3, 0xf8, 0x83, 0xb0, 0x02, 0xf8, 0xd7, - 0xa9, 0xa7, 0xbf, 0x0b, 0x4a, 0xf3, 0x0d, 0xbc, 0xc5, 0x3f, 0x07, 0xa7, 0xe6, 0x1b, 0xcd, 0xc5, - 0xb7, 0x16, 0x26, 0x63, 0x1d, 0x77, 0x12, 0x46, 0x7d, 0xc4, 0x4c, 0x7d, 0xee, 0xf6, 0x9b, 0x5c, - 0x15, 0x7c, 0xd0, 0x6c, 0x75, 0x62, 0xbe, 0x51, 0xce, 0xb3, 0x7e, 0xf4, 0x41, 0x77, 0xeb, 0x73, - 0xb5, 0xf9, 0xbb, 0x8d, 0x72, 0xe1, 0xe9, 0xfb, 0x30, 0x52, 0xa3, 0xf7, 0xcd, 0x16, 0x15, 0x0a, - 0xf2, 0x28, 0x9c, 0xaf, 0x4d, 0xde, 0xa9, 0x4f, 0x4c, 0x66, 0xaa, 0x48, 0x14, 0x5d, 0x5d, 0xa8, - 0x97, 0x73, 0xe4, 0x2c, 0x90, 0x28, 0xf8, 0x66, 0x75, 0x76, 0xaa, 0x9c, 0x27, 0x0a, 0x9c, 0x8e, - 0xc2, 0xeb, 0x73, 0x8b, 0xb7, 0xe7, 0x26, 0xcb, 0x85, 0xa7, 0xff, 0x76, 0x0e, 0xce, 0xa4, 0x66, - 0x02, 0x27, 0x2a, 0x3c, 0x36, 0x39, 0x53, 0x6d, 0x2c, 0xd6, 0x27, 0x1a, 0x93, 0x55, 0x6d, 0x62, - 0xba, 0x39, 0x51, 0x5d, 0x9c, 0xbc, 0x31, 0xaf, 0xbd, 0xd5, 0xbc, 0x31, 0x39, 0x37, 0xa9, 0x55, - 0x67, 0xca, 0x7d, 0xe4, 0x49, 0xa8, 0x64, 0xd0, 0x34, 0x26, 0x27, 0x6e, 0x6b, 0xf5, 0xc5, 0xb7, - 0xca, 0x39, 0xf2, 0x04, 0x3c, 0x9a, 0x49, 0xc4, 0x7e, 0x97, 0xf3, 0xe4, 0x31, 0xb8, 0x90, 0x45, - 0xf2, 0x89, 0x99, 0x72, 0xe1, 0xe9, 0x1f, 0xcf, 0x01, 0x49, 0xa6, 0x72, 0x26, 0x8f, 0xc3, 0x45, - 0xa6, 0x17, 0xcd, 0xec, 0x06, 0x3e, 0x01, 0x8f, 0xa6, 0x52, 0x48, 0xcd, 0xab, 0xc0, 0x23, 0x19, - 0x24, 0xa2, 0x71, 0x17, 0x41, 0x49, 0x27, 0xc0, 0xa6, 0xfd, 0x42, 0x0e, 0xce, 0xa4, 0x86, 0xd3, - 0x20, 0x97, 0xe1, 0xa9, 0x6a, 0x6d, 0x96, 0xf5, 0xcd, 0xc4, 0x62, 0x7d, 0x7e, 0xae, 0xd1, 0x9c, - 0x9d, 0xaa, 0x36, 0x99, 0xf6, 0xdd, 0x6e, 0xc4, 0x7a, 0xf3, 0x12, 0xa8, 0x3d, 0x28, 0x27, 0xa6, - 0xab, 0x73, 0x37, 0xd8, 0xf0, 0x23, 0x4f, 0xc1, 0xe3, 0x99, 0x74, 0x93, 0x73, 0xd5, 0xf1, 0x99, - 0xc9, 0x5a, 0x39, 0x4f, 0x3e, 0x00, 0x4f, 0x64, 0x52, 0xd5, 0xea, 0x0d, 0x4e, 0x56, 0x78, 0x5a, - 0x8f, 0x5c, 0xf2, 0xb2, 0xaf, 0x9c, 0x98, 0x9f, 0x5b, 0xac, 0x4e, 0x2c, 0xa6, 0x69, 0xf6, 0x79, - 0x38, 0x13, 0xc1, 0x8e, 0xdf, 0x6e, 0xd4, 0xe7, 0x26, 0x1b, 0x8d, 0x72, 0x2e, 0x81, 0x0a, 0x44, - 0x9b, 0x1f, 0xaf, 0x7d, 0xeb, 0x7f, 0x7c, 0xac, 0xef, 0x5b, 0x7f, 0xfa, 0x58, 0xee, 0xf7, 0xff, - 0xf4, 0xb1, 0xdc, 0xbf, 0xfe, 0xd3, 0xc7, 0x72, 0x9f, 0xbc, 0xbe, 0x9b, 0x2c, 0xe0, 0x7c, 0xca, - 0x5e, 0x2a, 0xe1, 0x3d, 0xdb, 0x0b, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb3, 0xfc, 0xdb, - 0x68, 0xce, 0xb2, 0x01, 0x00, + // 19119 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, 0x33, 0xcf, 0xdd, + 0xb8, 0x6e, 0x18, 0xa6, 0x4e, 0xce, 0xc2, 0xa9, 0x9b, 0x8d, 0x69, 0xb5, 0x79, 0xa3, 0xb6, 0x30, + 0xd5, 0xbc, 0xb9, 0xd0, 0xa8, 0x4f, 0x57, 0x6b, 0x33, 0xb5, 0xe9, 0xa9, 0x62, 0x1f, 0x39, 0x01, + 0xe3, 0x01, 0x6a, 0xf6, 0xe6, 0x7c, 0x65, 0xa1, 0x98, 0x21, 0x13, 0x30, 0x1a, 0x00, 0x27, 0x17, + 0x97, 0x8a, 0xd9, 0x67, 0x7e, 0x3c, 0x03, 0xc0, 0xf8, 0x2d, 0xda, 0xc6, 0x8a, 0x61, 0x92, 0x47, + 0xe0, 0x0c, 0x52, 0x2c, 0xaa, 0xb5, 0x6b, 0xb5, 0x85, 0x08, 0xcf, 0x53, 0x30, 0x21, 0x23, 0xe7, + 0x16, 0xab, 0x95, 0xb9, 0x62, 0xc6, 0xaf, 0x4a, 0x80, 0x1b, 0x8d, 0xc5, 0x62, 0x96, 0x9c, 0x84, + 0xa2, 0x0c, 0x5c, 0xbc, 0xb1, 0x54, 0x29, 0xe6, 0xa2, 0xd0, 0x46, 0xb5, 0x36, 0x5f, 0xcc, 0x93, + 0x33, 0x70, 0x42, 0x86, 0x4e, 0x2f, 0x2c, 0xa9, 0x95, 0xda, 0x54, 0xb1, 0xff, 0x99, 0xf7, 0xc1, + 0x30, 0x06, 0xbd, 0x13, 0x87, 0xbe, 0x23, 0x30, 0xb8, 0x38, 0xd9, 0x98, 0x56, 0x6f, 0x61, 0x6b, + 0x00, 0x0a, 0x53, 0xd3, 0x0b, 0xac, 0x65, 0x99, 0x67, 0xfe, 0x6d, 0x06, 0xa0, 0x31, 0xb3, 0x54, + 0x17, 0x84, 0xc3, 0x30, 0x50, 0x5b, 0xb8, 0x55, 0x99, 0xab, 0x31, 0xba, 0x41, 0xc8, 0x2f, 0xd6, + 0xa7, 0xd9, 0xe7, 0x0f, 0x41, 0x7f, 0x75, 0x6e, 0xb1, 0x31, 0x5d, 0xcc, 0x32, 0xa0, 0x3a, 0x5d, + 0x99, 0x2a, 0xe6, 0x18, 0xf0, 0xb6, 0x5a, 0x5b, 0x9a, 0x2e, 0xe6, 0xd9, 0x9f, 0x73, 0x8d, 0xa5, + 0xca, 0x52, 0xb1, 0x9f, 0xfd, 0x39, 0x83, 0x7f, 0x16, 0x18, 0xb3, 0xc6, 0xf4, 0x12, 0xfe, 0x18, + 0x60, 0x4d, 0x98, 0xf1, 0x7e, 0x0d, 0x32, 0x14, 0x63, 0x3d, 0x55, 0x53, 0x8b, 0x43, 0xec, 0x07, + 0x63, 0xc9, 0x7e, 0x00, 0x6b, 0x9c, 0x3a, 0x3d, 0xbf, 0x78, 0x6b, 0xba, 0x38, 0xcc, 0x78, 0xcd, + 0xdf, 0x60, 0xe0, 0x11, 0xf6, 0xa7, 0x3a, 0xcf, 0xfe, 0x1c, 0x65, 0x9c, 0xd4, 0xe9, 0xca, 0x5c, + 0xbd, 0xb2, 0x34, 0x5b, 0x1c, 0x63, 0xed, 0x41, 0x9e, 0xe3, 0xbc, 0xe4, 0x42, 0x65, 0x7e, 0xba, + 0x58, 0x14, 0x34, 0x53, 0x73, 0xb5, 0x85, 0x1b, 0xc5, 0x09, 0x6c, 0xc8, 0xdb, 0xf3, 0xf8, 0x83, + 0xb0, 0x02, 0xf8, 0xd7, 0x89, 0x67, 0xbe, 0x0b, 0x0a, 0x8b, 0x0d, 0x74, 0x3f, 0x3b, 0x03, 0x27, + 0x16, 0x1b, 0xcd, 0xa5, 0xb7, 0xeb, 0xd3, 0x91, 0x8e, 0x9b, 0x80, 0x51, 0x0f, 0x31, 0x57, 0x5b, + 0xb8, 0xf9, 0x16, 0x57, 0x05, 0x0f, 0x34, 0x5f, 0xa9, 0x2e, 0x36, 0x8a, 0x59, 0xd6, 0x8f, 0x1e, + 0xe8, 0x76, 0x6d, 0x61, 0x6a, 0xf1, 0x76, 0xa3, 0x98, 0x7b, 0xe6, 0x1e, 0x8c, 0x4c, 0xd1, 0x7b, + 0x46, 0x8b, 0x0a, 0x05, 0x79, 0x14, 0xce, 0x4e, 0x4d, 0xdf, 0xaa, 0x55, 0xa7, 0x53, 0x55, 0x24, + 0x8c, 0xae, 0xd4, 0x6b, 0xc5, 0x0c, 0x39, 0x0d, 0x24, 0x0c, 0xbe, 0x5e, 0x99, 0x9f, 0x29, 0x66, + 0x89, 0x02, 0x27, 0xc3, 0xf0, 0xda, 0xc2, 0xd2, 0xcd, 0x85, 0xe9, 0x62, 0xee, 0x99, 0xbf, 0x99, + 0x81, 0x53, 0xd3, 0x6d, 0xcd, 0x71, 0x8d, 0x96, 0x13, 0x4a, 0xf0, 0x4f, 0xca, 0xf0, 0xd8, 0xf4, + 0x5c, 0xa5, 0xb1, 0x54, 0xab, 0x36, 0xa6, 0x2b, 0x6a, 0x75, 0xb6, 0x59, 0xad, 0x2c, 0x4d, 0x5f, + 0x5b, 0x54, 0xdf, 0x6e, 0x5e, 0x9b, 0x5e, 0x98, 0x56, 0x2b, 0x73, 0xc5, 0x3e, 0xf2, 0x24, 0x94, + 0x52, 0x68, 0x1a, 0xd3, 0xd5, 0x9b, 0x6a, 0x6d, 0xe9, 0xed, 0x62, 0x86, 0x3c, 0x01, 0x8f, 0xa6, + 0x12, 0xb1, 0xdf, 0xc5, 0x2c, 0x79, 0x0c, 0xce, 0xa5, 0x91, 0x7c, 0x74, 0xae, 0x98, 0x7b, 0xe6, + 0xc7, 0x32, 0x40, 0x16, 0x3b, 0xd4, 0x6c, 0x84, 0x9b, 0xf8, 0x38, 0x9c, 0x67, 0x7a, 0xd1, 0x4c, + 0x6f, 0xe0, 0x13, 0xf0, 0x68, 0x22, 0x85, 0xd4, 0xbc, 0x12, 0x3c, 0x92, 0x42, 0x22, 0x1a, 0x77, + 0x1e, 0x94, 0x64, 0x02, 0x6c, 0xda, 0xcf, 0x67, 0xe0, 0x54, 0x62, 0x1c, 0x28, 0x72, 0x11, 0x9e, + 0xaa, 0x4c, 0xcd, 0xb3, 0xbe, 0xa9, 0x2e, 0xd5, 0x16, 0x17, 0x1a, 0xcd, 0xf9, 0x99, 0x4a, 0x93, + 0x69, 0xdf, 0xcd, 0x46, 0xa4, 0x37, 0x2f, 0x40, 0xb9, 0x07, 0x65, 0x75, 0xb6, 0xb2, 0x70, 0x8d, + 0x0d, 0x3f, 0xf2, 0x14, 0x3c, 0x9e, 0x4a, 0x37, 0xbd, 0x50, 0x99, 0x9c, 0x9b, 0x9e, 0x2a, 0x66, + 0xc9, 0xd3, 0xf0, 0x44, 0x2a, 0xd5, 0x54, 0xad, 0xc1, 0xc9, 0x72, 0xcf, 0x68, 0x21, 0xef, 0x24, + 0xf6, 0x95, 0xd5, 0xc5, 0x85, 0xa5, 0x4a, 0x75, 0x29, 0x49, 0xb3, 0xcf, 0xc2, 0xa9, 0x10, 0x76, + 0xf2, 0x66, 0xa3, 0xb6, 0x30, 0xdd, 0x68, 0x14, 0x33, 0x31, 0x94, 0x2f, 0xda, 0xec, 0xe4, 0xd4, + 0x37, 0xfe, 0x97, 0xc7, 0xfa, 0xbe, 0xf1, 0x27, 0x8f, 0x65, 0x7e, 0xef, 0x4f, 0x1e, 0xcb, 0xfc, + 0xab, 0x3f, 0x79, 0x2c, 0xf3, 0xb1, 0xab, 0x2b, 0x86, 0xbb, 0xda, 0x5d, 0xbe, 0xdc, 0xb2, 0xd6, + 0xae, 0xac, 0xd8, 0xda, 0x3d, 0xc3, 0xc5, 0x75, 0x4a, 0x6b, 0x5f, 0x71, 0x69, 0x1b, 0x03, 0x10, + 0x5f, 0xd1, 0x3a, 0xc6, 0x15, 0xcc, 0xd7, 0x76, 0x85, 0xcf, 0xdf, 0xcb, 0x05, 0xb4, 0x4e, 0x5e, + 0xfc, 0x0f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x9a, 0xb1, 0xcf, 0x37, 0xb4, 0xba, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -33952,6 +34285,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) @@ -33976,12 +34401,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 { @@ -34140,12 +34565,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-- @@ -34293,12 +34718,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 { @@ -42797,6 +43222,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 @@ -49320,6 +50143,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 @@ -52439,6 +53310,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 } @@ -92610,62 +93603,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 @@ -92675,46 +93617,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 { @@ -92741,9 +93667,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 @@ -92767,7 +93765,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 { @@ -92790,17 +93788,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 @@ -92810,30 +93808,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 @@ -92843,30 +93840,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 @@ -92876,23 +93859,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 @@ -92916,7 +93900,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 { @@ -92939,17 +93923,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 @@ -92959,29 +93943,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 @@ -92991,27 +93976,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 { @@ -93039,11 +94025,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 { @@ -93071,11 +94108,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 { @@ -93103,11 +94140,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 { @@ -93135,11 +94172,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 { @@ -93167,13 +94204,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 @@ -93183,28 +94220,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 { @@ -93232,11 +94268,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 { @@ -93264,11 +94300,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 { @@ -116410,17 +117543,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 @@ -116430,29 +118308,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 @@ -116462,29 +118341,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 @@ -116494,23 +118374,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 @@ -116534,7 +118448,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 { @@ -116557,10 +118471,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: @@ -116598,7 +118512,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 { @@ -116625,13 +118539,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 { @@ -116658,7 +118572,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 @@ -116684,7 +118631,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 { @@ -116707,10 +118654,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: @@ -116748,7 +118695,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 { @@ -116775,13 +118722,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 { @@ -116808,10 +118755,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 @@ -116837,7 +118814,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 { @@ -116860,17 +118837,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 @@ -116880,29 +118857,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 @@ -116912,65 +118890,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 { @@ -116997,34 +118971,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 @@ -117034,16 +119040,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 @@ -117053,16 +119073,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 @@ -117072,14 +119106,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 { @@ -117106,7 +119154,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 @@ -117132,7 +119180,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 { @@ -117155,10 +119203,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: @@ -117196,7 +119244,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 { @@ -117223,13 +119271,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 { @@ -117256,13 +119304,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 { @@ -117289,7 +119337,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 @@ -117315,7 +119363,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 { @@ -117338,10 +119386,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: @@ -117379,7 +119427,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 { @@ -117406,13 +119454,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 { @@ -117439,13 +119487,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 { @@ -117472,7 +119520,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 @@ -117498,7 +119546,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 { @@ -117521,10 +119569,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: @@ -117562,7 +119610,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 { @@ -117589,13 +119637,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 { @@ -117622,13 +119670,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 { @@ -117655,7 +119703,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 @@ -117681,7 +119729,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 { @@ -117704,10 +119752,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: @@ -117739,13 +119787,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 { @@ -117772,11 +119886,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) } @@ -117809,9 +119923,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 { @@ -117838,7 +119952,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 @@ -117864,7 +119978,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 { @@ -117887,10 +120001,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: @@ -117960,6 +120074,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) } @@ -117992,9 +120172,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 { @@ -118021,7 +120201,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 @@ -118047,7 +120227,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 { @@ -118070,17 +120250,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 @@ -118090,30 +120270,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 @@ -118123,30 +120302,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 @@ -118156,28 +120334,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 { @@ -118204,7 +120381,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 @@ -118230,7 +120410,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 { @@ -118253,10 +120433,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: @@ -118327,7 +120507,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 { @@ -118354,13 +120534,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 { @@ -118387,7 +120567,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 @@ -118413,7 +120659,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 { @@ -118436,10 +120682,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: @@ -118510,7 +120756,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 { @@ -118537,13 +120783,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 { @@ -118570,7 +120816,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/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/usagereporter/teleport/aggregating/reporter.go b/lib/usagereporter/teleport/aggregating/reporter.go index 4f7ed64cebce7..6fcac27bf1dc2 100644 --- a/lib/usagereporter/teleport/aggregating/reporter.go +++ b/lib/usagereporter/teleport/aggregating/reporter.go @@ -423,6 +423,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 4ddf98dff7ac6..d75ec2847308d 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. // @@ -369,6 +372,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/web/packages/design/src/Icon/Icons.story.tsx b/web/packages/design/src/Icon/Icons.story.tsx index 3d4ca62fd1825..a87c963947a49 100644 --- a/web/packages/design/src/Icon/Icons.story.tsx +++ b/web/packages/design/src/Icon/Icons.story.tsx @@ -163,6 +163,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/README.md b/web/packages/design/src/Icon/README.md index d6b61dda44adc..be59fabc97fbc 100644 --- a/web/packages/design/src/Icon/README.md +++ b/web/packages/design/src/Icon/README.md @@ -12,3 +12,7 @@ 3. Run `pnpm process-icons`. A full collection of exported icons ready for download can be found in [Google Drive](https://drive.google.com/drive/folders/19068OCcyob6iqjpY3JB4t2NGiRmnuw2D?usp=drive_link). The same icons and others that require preparation before exporting can be found [in Figma](https://www.figma.com/file/Gpjs9vjhzUKF1GDbeG9JGE/Application-Design-System?type=design&node-id=7371-35911&mode=design&t=ior9gA5q20atPjr9-0). + +If the collection does not include the icon you need, please contact the Design +team or follow the instructions in the "Icon Consistency" section of the above +Figma link to prepare a new icon. 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 1f9e1993dfe39..f2f91ab9c9352 100644 --- a/web/packages/design/src/Icon/index.ts +++ b/web/packages/design/src/Icon/index.ts @@ -152,6 +152,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/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/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; + }; + } + >; }; /** From cf1143e06b5f482154dfeaf7c3804c546dd3b9e1 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 29 May 2025 17:32:19 -0400 Subject: [PATCH 06/21] MCP access part 4: mcputils (#54880) * MCP access part 4: mcp helpers * address feedback * address comment, minor edits * update mcp-go --- go.mod | 2 + go.sum | 4 + lib/utils/mcputils/errors.go | 33 ++++ lib/utils/mcputils/id_tracker.go | 80 +++++++++ lib/utils/mcputils/id_tracker_test.go | 109 +++++++++++ lib/utils/mcputils/protocol.go | 155 ++++++++++++++++ lib/utils/mcputils/protocol_test.go | 153 ++++++++++++++++ lib/utils/mcputils/stdio.go | 248 ++++++++++++++++++++++++++ lib/utils/mcputils/stdio_test.go | 190 ++++++++++++++++++++ 9 files changed, 974 insertions(+) create mode 100644 lib/utils/mcputils/errors.go create mode 100644 lib/utils/mcputils/id_tracker.go create mode 100644 lib/utils/mcputils/id_tracker_test.go create mode 100644 lib/utils/mcputils/protocol.go create mode 100644 lib/utils/mcputils/protocol_test.go create mode 100644 lib/utils/mcputils/stdio.go create mode 100644 lib/utils/mcputils/stdio_test.go diff --git a/go.mod b/go.mod index 6d2d30d9b6190..d336e9faa4fa7 100644 --- a/go.mod +++ b/go.mod @@ -164,6 +164,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.30.1 github.com/mattn/go-shellwords v1.0.12 github.com/mattn/go-sqlite3 v1.14.28 github.com/mdlayher/netlink v1.7.2 @@ -544,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 fc451ce7a37bd..b082a3bd15640 100644 --- a/go.sum +++ b/go.sum @@ -1830,6 +1830,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.30.1 h1:3R1BPvNT/rC1iPpLx+EMXFy+gvux/Mz/Nio3c6XEU9E= +github.com/mark3labs/mcp-go v0.30.1/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= @@ -2272,6 +2274,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/lib/utils/mcputils/errors.go b/lib/utils/mcputils/errors.go new file mode 100644 index 0000000000000..ea819e9c88b30 --- /dev/null +++ b/lib/utils/mcputils/errors.go @@ -0,0 +1,33 @@ +/* + * 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" + + "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) || + utils.IsOKNetworkError(err) +} 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/stdio.go b/lib/utils/mcputils/stdio.go new file mode 100644 index 0000000000000..81972650eb2d8 --- /dev/null +++ b/lib/utils/mcputils/stdio.go @@ -0,0 +1,248 @@ +/* + * 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" + + "github.com/gravitational/teleport" + 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) +} + +// HandleParseErrorFunc handles parse errors. +type HandleParseErrorFunc func(context.Context, *mcp.JSONRPCError) error + +// ReplyParseError returns a HandleParseErrorFunc that forwards the error to +// provided writer. +func ReplyParseError(w *StdioMessageWriter) 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 + } +} + +// StdioMessageReaderConfig is the config for StdioMessageReader. +type StdioMessageReaderConfig struct { + // SourceReadCloser is the input to the read the message from. + // SourceReadCloser will be closed when reader finishes. + SourceReadCloser io.ReadCloser + // 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 func(context.Context, *JSONRPCRequest) error + // OnResponse specifies the handler for handling response. Any error by the + // handler stops this message reader. + OnResponse func(context.Context, *JSONRPCResponse) error + // OnNotification specifies the handler for handling notification. Any error + // returned by the handler stops this message reader. + OnNotification func(context.Context, *JSONRPCNotification) error +} + +// CheckAndSetDefaults checks values and sets defaults. +func (c *StdioMessageReaderConfig) CheckAndSetDefaults() error { + if c.SourceReadCloser == nil { + return trace.BadParameter("missing parameter SourceReadCloser") + } + 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 +} + +// StdioMessageReader reads requests from provided reader. +type StdioMessageReader struct { + cfg StdioMessageReaderConfig +} + +// NewStdioMessageReader creates a new StdioMessageReader. Must call "Start" to +// start the processing. +func NewStdioMessageReader(cfg StdioMessageReaderConfig) (*StdioMessageReader, error) { + if err := cfg.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return &StdioMessageReader{ + 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 *StdioMessageReader) Run(ctx context.Context) { + r.cfg.Logger.InfoContext(ctx, "Start processing stdio messages") + + 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 stdio messages") + if err := r.cfg.SourceReadCloser.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 *StdioMessageReader) startProcess(ctx context.Context) { + lineReader := bufio.NewReader(r.cfg.SourceReadCloser) + for { + if ctx.Err() != nil { + return + } + + if err := r.processNextLine(ctx, lineReader); err != nil { + if !IsOKCloseError(err) { + r.cfg.Logger.ErrorContext(ctx, "Failed to process line", "error", err) + } + return + } + } +} + +func (r *StdioMessageReader) processNextLine(ctx context.Context, lineReader *bufio.Reader) error { + line, err := lineReader.ReadString('\n') + if err != nil { + return trace.Wrap(err, "reading line") + } + + r.cfg.Logger.Log(ctx, logutils.TraceLevel, "Trace stdio", "line", line) + + var base baseJSONRPCMessage + if parseError := json.Unmarshal([]byte(line), &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", line) + return trace.Wrap( + r.cfg.OnParseError(ctx, &rpcError), + "handling unknown message type error", + ) + } +} diff --git a/lib/utils/mcputils/stdio_test.go b/lib/utils/mcputils/stdio_test.go new file mode 100644 index 0000000000000..ec63799353ed5 --- /dev/null +++ b/lib/utils/mcputils/stdio_test.go @@ -0,0 +1,190 @@ +/* + * 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 ( + "bytes" + "context" + "io" + "log" + "log/slog" + "sync/atomic" + "testing" + "time" + + "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/assert" + "github.com/stretchr/testify/require" +) + +// TestStdioHelpers tests StdioMessageReader 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() + serverStdio, writeToServer := io.Pipe() + readFromServer, serverStdout := io.Pipe() + t.Cleanup(func() { + assert.NoError(t, trace.NewAggregate( + clientStdin.Close(), writeToClient.Close(), + readFromClient.Close(), clientStdout.Close(), + serverStdio.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 := NewStdioMessageReader(StdioMessageReaderConfig{ + ParentContext: context.Background(), + SourceReadCloser: 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 := NewStdioMessageReader(StdioMessageReaderConfig{ + ParentContext: context.Background(), + SourceReadCloser: 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. + stdioClientTransport := mcpclienttransport.NewIO(clientStdin, clientStdout, io.NopCloser(bytes.NewReader(nil))) + stdioClient := mcpclient.NewClient(stdioClientTransport) + defer stdioClient.Close() + require.NoError(t, stdioClient.Start(ctx)) + + stdioServer := mcpserver.NewStdioServer(makeTestMCPServer()) + stdioServer.SetErrorLogger(log.New(io.Discard, "", log.LstdFlags)) + go stdioServer.Listen(ctx, serverStdio, serverStdout) + + // Test things out. + t.Run("client initialize", func(t *testing.T) { + initReq := mcp.InitializeRequest{} + initReq.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION + initReq.Params.ClientInfo = mcp.Implementation{ + Name: "test-client", + Version: "1.0.0", + } + _, err = stdioClient.Initialize(ctx, initReq) + require.NoError(t, err) + }) + + t.Run("client call tool", func(t *testing.T) { + callToolRequest := mcp.CallToolRequest{} + callToolRequest.Params.Name = "hello-server" + callToolResult, err := stdioClient.CallTool(ctx, callToolRequest) + require.NoError(t, err) + require.NotNil(t, callToolResult) + require.Equal(t, []mcp.Content{ + mcp.NewTextContent("hello client"), + }, callToolResult.Content) + }) + + 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)) + }) +} + +func makeTestMCPServer() *mcpserver.MCPServer { + server := mcpserver.NewMCPServer("test-server", "1.0.0") + 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 +} From 0449df48baab47adabeee3cd4a8f6a44164ff650 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 29 May 2025 17:42:59 -0400 Subject: [PATCH 07/21] MCP access part 5: Claude desktop config parser (#55179) * claude desktop config * rework * split Config to Config and FileConfig * add a comment on unofficial linux --- go.mod | 4 + go.sum | 8 + lib/client/mcp/claude/config.go | 273 +++++++++++++++++++++++++++ lib/client/mcp/claude/config_test.go | 253 +++++++++++++++++++++++++ 4 files changed, 538 insertions(+) create mode 100644 lib/client/mcp/claude/config.go create mode 100644 lib/client/mcp/claude/config_test.go diff --git a/go.mod b/go.mod index d336e9faa4fa7..9a8f4632565e5 100644 --- a/go.mod +++ b/go.mod @@ -203,6 +203,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 @@ -530,6 +532,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 diff --git a/go.sum b/go.sum index b082a3bd15640..5e9c1f482a105 100644 --- a/go.sum +++ b/go.sum @@ -2226,7 +2226,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= diff --git a/lib/client/mcp/claude/config.go b/lib/client/mcp/claude/config.go new file mode 100644 index 0000000000000..4e546deb13e0c --- /dev/null +++ b/lib/client/mcp/claude/config.go @@ -0,0 +1,273 @@ +/* + * 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) + } +} + +// 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"` +} + +// 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 replace an existing one. +func (c *Config) PutMCPServer(serverName string, server MCPServer) (err error) { + c.mcpServers[serverName] = server + c.configData, err = sjson.SetBytes(c.configData, c.mcpServerJSONPath(serverName), server) + 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) +} + +// Exists returns true if config file exists. +func (c *FileConfig) Exists() bool { + return c.configExists +} + +// 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..c6647d46d7713 --- /dev/null +++ b/lib/client/mcp/claude/config_test.go @@ -0,0 +1,253 @@ +/* + * 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, 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() + + require.NoError(t, config.PutMCPServer("test", MCPServer{ + Command: "command", + })) + var buf bytes.Buffer + + require.NoError(t, config.Write(&buf, FormatJSONCompact)) + require.Equal(t, `{"mcpServers":{"test":{"command":"command"}}}`, 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)) + }) + } +} + +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)) +} From 49f64c4f20e0d640e0eb9ce2b2ade415bdddc1ba Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 5 Jun 2025 11:17:34 -0400 Subject: [PATCH 08/21] MCP access part 6: "tsh mcp ls" (#55292) * MCP access part 6: "tsh mcp ls" * address feedback --- api/types/app.go | 29 ++- api/types/app_test.go | 17 ++ api/types/appserver.go | 10 + api/types/resource.go | 5 + lib/services/role.go | 44 ++++ lib/services/role_test.go | 43 ++++ tool/common/common.go | 33 +++ tool/tsh/common/app.go | 4 + tool/tsh/common/db.go | 6 +- tool/tsh/common/db_exec_test.go | 16 +- tool/tsh/common/mcp.go | 8 +- tool/tsh/common/mcp_app.go | 218 +++++++++++++++++++ tool/tsh/common/mcp_app_test.go | 364 ++++++++++++++++++++++++++++++++ tool/tsh/common/proxy.go | 4 + tool/tsh/common/tsh.go | 22 +- 15 files changed, 791 insertions(+), 32 deletions(-) create mode 100644 tool/tsh/common/mcp_app.go create mode 100644 tool/tsh/common/mcp_app_test.go diff --git a/api/types/app.go b/api/types/app.go index 146f9de88b756..ae87481431006 100644 --- a/api/types/app.go +++ b/api/types/app.go @@ -18,6 +18,7 @@ package types import ( "fmt" + "iter" "net/url" "slices" "strconv" @@ -309,6 +310,9 @@ func (a *AppV3) GetProtocol() string { if a.IsTCP() { return "TCP" } + if a.IsMCP() { + return "MCP" + } return "HTTP" } @@ -565,18 +569,27 @@ func (a *AppV3) GetMCP() *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. diff --git a/api/types/app_test.go b/api/types/app_test.go index c9d5e3da25d20..afb494f376082 100644 --- a/api/types/app_test.go +++ b/api/types/app_test.go @@ -18,6 +18,7 @@ package types import ( "fmt" + "slices" "strconv" "testing" @@ -736,3 +737,19 @@ func TestGetMCPServerTransportType(t *testing.T) { }) } } + +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/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/lib/services/role.go b/lib/services/role.go index f5c709110abf2..151d81800ec42 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -1029,6 +1029,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{ @@ -1038,6 +1054,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) { diff --git a/lib/services/role_test.go b/lib/services/role_test.go index 88ed5ed3927ef..c268061f2543e 100644 --- a/lib/services/role_test.go +++ b/lib/services/role_test.go @@ -10067,3 +10067,46 @@ func TestMCPToolMatcher(t *testing.T) { }) } } + +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/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/tsh/common/app.go b/tool/tsh/common/app.go index 8f5c38cd38743..408632b4e0af5 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/mcp.go b/tool/tsh/common/mcp.go index 60f08d445233d..93d716d061ef3 100644 --- a/tool/tsh/common/mcp.go +++ b/tool/tsh/common/mcp.go @@ -16,16 +16,20 @@ package common -import "github.com/alecthomas/kingpin/v2" +import ( + "github.com/alecthomas/kingpin/v2" +) type mcpCommands struct { dbStart *mcpDBStartCommand + list *mcpListCommand } -func newMCPCommands(app *kingpin.Application) *mcpCommands { +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), + list: newMCPListCommand(mcp, cf), } } diff --git a/tool/tsh/common/mcp_app.go b/tool/tsh/common/mcp_app.go new file mode 100644 index 0000000000000..9a1958473f9cb --- /dev/null +++ b/tool/tsh/common/mcp_app.go @@ -0,0 +1,218 @@ +/* + * 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/defaults" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/tool/common" +) + +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 +} + +// 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) { + 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) +} diff --git a/tool/tsh/common/mcp_app_test.go b/tool/tsh/common/mcp_app_test.go new file mode 100644 index 0000000000000..dec2d83efe005 --- /dev/null +++ b/tool/tsh/common/mcp_app_test.go @@ -0,0 +1,364 @@ +/* + * 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" + "slices" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/client" + "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()) + }) + } +} + +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() + } +} diff --git a/tool/tsh/common/proxy.go b/tool/tsh/common/proxy.go index a8cc0b832a472..484507550af34 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 050714b8a884f..6776e99fb48d3 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -1364,8 +1364,7 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { gitCmd := newGitCommands(app) pivCmd := newPIVCommands(app) - - mcpCmd := newMCPCommands(app) + mcpCmd := newMCPCommands(app, &cf) if runtime.GOOS == constants.WindowsOS { bench.Hidden() @@ -1801,6 +1800,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = pivCmd.agent.run(&cf) case mcpCmd.dbStart.FullCommand(): err = mcpCmd.dbStart.run(&cf) + case mcpCmd.list.FullCommand(): + err = mcpCmd.list.run() default: // Handle commands that might not be available. switch { @@ -3258,14 +3259,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, @@ -3330,9 +3324,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() { @@ -3349,10 +3340,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. From 032215413b77b2094c7548b06884ae9556067eef Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 5 Jun 2025 20:38:58 -0400 Subject: [PATCH 09/21] MCP access part 7: MCP app in Web UI (#55306) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MCP access part 7: MCP app in Web UI * Make spacing in modal closer to what's in database modal * add mcp app to ResourceActionButton.story.tsx * move AppSubKind to shared/services/types. * remove --format claude (not needed see part 8) * add jsdoc --------- Co-authored-by: Rafał Cieślak --- lib/web/ui/app.go | 22 +++++ .../UnifiedResources/shared/guessAppIcon.ts | 3 +- .../shared/viewItemsFactory.ts | 21 +++- .../components/UnifiedResources/types.ts | 5 +- web/packages/shared/services/types.ts | 6 ++ .../src/Apps/MCPAppConnectDialog.story.tsx | 39 ++++++++ .../teleport/src/Apps/MCPAppConnectDialog.tsx | 97 +++++++++++++++++++ .../teleport/src/Apps/fixtures/index.ts | 20 +++- .../ResourceActionButton.story.tsx | 6 ++ .../UnifiedResources/ResourceActionButton.tsx | 29 +++++- .../teleport/src/services/apps/apps.test.ts | 41 ++++++++ .../teleport/src/services/apps/makeApps.ts | 8 +- .../teleport/src/services/apps/types.ts | 31 +++++- .../teleterm/src/services/tshd/app.ts | 3 + .../ui/DocumentCluster/UnifiedResources.tsx | 12 ++- 15 files changed, 328 insertions(+), 15 deletions(-) create mode 100644 web/packages/teleport/src/Apps/MCPAppConnectDialog.story.tsx create mode 100644 web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx 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/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts index cfe8ba95f4d96..9537b150b951b 100644 --- a/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts +++ b/web/packages/shared/components/UnifiedResources/shared/guessAppIcon.ts @@ -21,8 +21,7 @@ import { ResourceIconName, resourceIconSpecs, } from 'design/ResourceIcon'; - -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 34619c9716042..723212a417a6d 100644 --- a/web/packages/shared/components/UnifiedResources/types.ts +++ b/web/packages/shared/components/UnifiedResources/types.ts @@ -20,11 +20,11 @@ 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'; import { ResourceLabel } from 'teleport/services/agents'; -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. @@ -54,6 +54,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..d549820cb7a05 --- /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 + + {' - Log in 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/UnifiedResources/ResourceActionButton.story.tsx b/web/packages/teleport/src/UnifiedResources/ResourceActionButton.story.tsx index a91f5b6621664..c4d62219d346c 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/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 : ( + + ), }, }; } From 1af182ee0a17ba91103cbab19617c4e5fb33c209 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 12 Jun 2025 16:16:41 -0400 Subject: [PATCH 10/21] MCP access part 8: tsh mcp config (#55370) * MCP access part 8: tsh mcp login/logout * change to --format and --config-file * switch to config and drop logout * enable debug by default * remove unused ut functions --- lib/client/mcp/claude/config.go | 22 ++++ lib/client/mcp/claude/config_test.go | 9 +- tool/tsh/common/help.go | 11 ++ tool/tsh/common/logger.go | 29 ++++- tool/tsh/common/mcp.go | 115 ++++++++++++++++- tool/tsh/common/mcp_app.go | 185 ++++++++++++++++++++++++++- tool/tsh/common/mcp_app_test.go | 145 +++++++++++++++++++++ tool/tsh/common/mcp_db.go | 2 +- tool/tsh/common/mcp_test.go | 96 ++++++++++++++ tool/tsh/common/tsh.go | 38 +++--- 10 files changed, 622 insertions(+), 30 deletions(-) create mode 100644 tool/tsh/common/mcp_test.go diff --git a/lib/client/mcp/claude/config.go b/lib/client/mcp/claude/config.go index 4e546deb13e0c..90578db684838 100644 --- a/lib/client/mcp/claude/config.go +++ b/lib/client/mcp/claude/config.go @@ -69,6 +69,23 @@ type MCPServer struct { 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 @@ -217,6 +234,11 @@ 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 { diff --git a/lib/client/mcp/claude/config_test.go b/lib/client/mcp/claude/config_test.go index c6647d46d7713..0ced8a55a5942 100644 --- a/lib/client/mcp/claude/config_test.go +++ b/lib/client/mcp/claude/config_test.go @@ -86,6 +86,7 @@ func TestFileConfig_sampleFile(t *testing.T) { 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 @@ -135,13 +136,15 @@ func TestFileConfig_sampleFile(t *testing.T) { func TestConfig_Write(t *testing.T) { config := NewConfig() - require.NoError(t, config.PutMCPServer("test", MCPServer{ + 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"}}}`, buf.String()) + require.Equal(t, `{"mcpServers":{"test":{"command":"command","env":{"foo":"bar"}}}}`, buf.String()) } func Test_isJSONCompact(t *testing.T) { diff --git a/tool/tsh/common/help.go b/tool/tsh/common/help.go index 71ac21769b1db..6ae4a5e8411e5 100644 --- a/tool/tsh/common/help.go +++ b/tool/tsh/common/help.go @@ -76,4 +76,15 @@ 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 + + Search MCP servers with labels and add to the specified JSON file + $ tsh mcp config --labels env=dev --client-config=my-config.json` ) diff --git a/tool/tsh/common/logger.go b/tool/tsh/common/logger.go index c3450a5acc51f..06a60d8f6cd79 100644 --- a/tool/tsh/common/logger.go +++ b/tool/tsh/common/logger.go @@ -60,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 index 93d716d061ef3..bbe574d7a802f 100644 --- a/tool/tsh/common/mcp.go +++ b/tool/tsh/common/mcp.go @@ -17,12 +17,23 @@ 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 - list *mcpListCommand + + config *mcpConfigCommand + list *mcpListCommand } func newMCPCommands(app *kingpin.Application, cf *CLIConf) *mcpCommands { @@ -30,6 +41,106 @@ func newMCPCommands(app *kingpin.Application, cf *CLIConf) *mcpCommands { db := mcp.Command("db", "Database access for MCP servers.") return &mcpCommands{ dbStart: newMCPDBCommand(db), - list: newMCPListCommand(mcp, cf), + + list: newMCPListCommand(mcp, cf), + config: newMCPConfigCommand(mcp, cf), + } +} + +type mcpClientConfigFlags struct { + clientConfig string + jsonFormat string +} + +const ( + mcpClientConfigClaude = "claude" +) + +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, or specify a JSON file path. Can also be set with environment variable %s.", + mcpClientConfigClaude, + 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() + 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, `Tip: use --client-config=claude to update your Claude Desktop configuration. +You can also specify a custom config path with --client-config= to update +a config file compatible with the "mcpServer" mapping.`) + return trace.Wrap(err) +} + +// claudeConfig defines a subset of functions from claude.Config. +type claudeConfig interface { + PutMCPServer(string, claude.MCPServer) error +} + +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, + }) } diff --git a/tool/tsh/common/mcp_app.go b/tool/tsh/common/mcp_app.go index 9a1958473f9cb..5397d73a26b71 100644 --- a/tool/tsh/common/mcp_app.go +++ b/tool/tsh/common/mcp_app.go @@ -37,6 +37,7 @@ import ( "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/tool/common" @@ -44,7 +45,7 @@ import ( func newMCPListCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpListCommand { cmd := &mcpListCommand{ - CmdClause: parent.Command("ls", "List available MCP server applications"), + CmdClause: parent.Command("ls", "List available MCP server applications."), cf: cf, } @@ -56,6 +57,21 @@ func newMCPListCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpListCommand { 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 @@ -123,6 +139,20 @@ func (c *mcpListCommand) print() error { } 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", @@ -216,3 +246,156 @@ func printMCPServersInVerboseText(w io.Writer, mcpServers iter.Seq[mcpServerWith _, 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-" diff --git a/tool/tsh/common/mcp_app_test.go b/tool/tsh/common/mcp_app_test.go index dec2d83efe005..263d65370c4b5 100644 --- a/tool/tsh/common/mcp_app_test.go +++ b/tool/tsh/common/mcp_app_test.go @@ -21,6 +21,8 @@ package common import ( "bytes" "context" + "maps" + "path/filepath" "slices" "testing" @@ -28,9 +30,11 @@ import ( "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" ) @@ -303,6 +307,124 @@ deny-write description stdio env=dev test arg [*], except: [write_*] } } +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 } @@ -362,3 +484,26 @@ func (f fakeMCPServerAccessChecker) EnumerateMCPTools(app types.Application) ser 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 index 699ae979c3ca5..bfef15ec6726e 100644 --- a/tool/tsh/common/mcp_db.go +++ b/tool/tsh/common/mcp_db.go @@ -51,7 +51,7 @@ func newMCPDBCommand(parent *kingpin.CmdClause) *mcpDBStartCommand { } func (c *mcpDBStartCommand) run(cf *CLIConf) error { - logger, err := initLogger(cf, utils.LoggingForMCP, parseLoggingOptsFromEnvAndArgv(cf)) + logger, err := initLogger(cf, utils.LoggingForMCP, getLoggingOptsForMCPServer(cf)) if err != nil { return trace.Wrap(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/tsh.go b/tool/tsh/common/tsh.go index 6776e99fb48d3..47e1125ec55be 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -743,23 +743,25 @@ 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" + 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" clusterHelp = "Specify the Teleport cluster to connect" browserHelp = "Set to 'none' to suppress browser opening on login" @@ -1802,6 +1804,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = mcpCmd.dbStart.run(&cf) 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 { From b47d3f771f6bfb8c9643555e9ddd66085eec6041 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Fri, 13 Jun 2025 09:18:54 -0400 Subject: [PATCH 11/21] MCP access part 9: tsh mcp connect, stub server, integration test (#55547) * MCP access part 9: tsh mcp connect, stub server, integration test * fix tests and lint --- constants.go | 3 + integration/appaccess/appaccess_test.go | 5 + integration/appaccess/mcp_test.go | 76 ++++++++++++++ integration/appaccess/pack.go | 8 ++ integrations/terraform/go.sum | 4 + lib/client/api.go | 99 ++++++++++++++++++ lib/service/service.go | 14 +++ lib/service/service_test.go | 4 + lib/services/role.go | 8 ++ lib/services/role_test.go | 32 ++++++ lib/srv/alpnproxy/common/protocols.go | 17 +++ lib/srv/alpnproxy/common/protocols_test.go | 5 + lib/srv/app/connections_handler.go | 49 +++++++-- lib/srv/mcp/memory.go | 111 ++++++++++++++++++++ lib/srv/mcp/server.go | 115 +++++++++++++++++++++ lib/srv/mcp/session.go | 65 ++++++++++++ tool/tsh/common/mcp.go | 10 +- tool/tsh/common/mcp_app.go | 36 +++++++ tool/tsh/common/tsh.go | 2 + 19 files changed, 649 insertions(+), 14 deletions(-) create mode 100644 integration/appaccess/mcp_test.go create mode 100644 lib/srv/mcp/memory.go create mode 100644 lib/srv/mcp/server.go create mode 100644 lib/srv/mcp/session.go diff --git a/constants.go b/constants.go index cb729e15c9e35..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" diff --git a/integration/appaccess/appaccess_test.go b/integration/appaccess/appaccess_test.go index 8bb73e091754b..7f1cf582e7df9 100644 --- a/integration/appaccess/appaccess_test.go +++ b/integration/appaccess/appaccess_test.go @@ -48,6 +48,7 @@ import ( "github.com/gravitational/teleport/lib/service" "github.com/gravitational/teleport/lib/service/servicecfg" "github.com/gravitational/teleport/lib/srv/app/common" + libmcp "github.com/gravitational/teleport/lib/srv/mcp" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/web/app" ) @@ -57,6 +58,8 @@ import ( // It allows to make the entire cluster set up once, instead of per test, // which speeds things up significantly. func TestAppAccess(t *testing.T) { + t.Setenv(libmcp.InMemoryServerEnvVar, "true") + pack := Setup(t) t.Run("Forward", bind(pack, testForward)) @@ -71,6 +74,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..f1e45479d8114 --- /dev/null +++ b/integration/appaccess/mcp_test.go @@ -0,0 +1,76 @@ +/* + * 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 ( + "bytes" + "context" + "io" + "testing" + + mcpclient "github.com/mark3labs/mcp-go/client" + "github.com/mark3labs/mcp-go/client/transport" + "github.com/mark3labs/mcp-go/mcp" + "github.com/stretchr/testify/require" + + libmcp "github.com/gravitational/teleport/lib/srv/mcp" +) + +func testMCP(pack *Pack, t *testing.T) { + t.Run("DialMCPServer stdio no server found", func(t *testing.T) { + testMCPDialStdioNoServerFound(t, pack) + }) + + t.Run("DialMCPSererver 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.InMemoryServerName) + require.NoError(t, err) + + ctx := context.Background() + clientTransport := transport.NewIO(serverConn, serverConn, io.NopCloser(bytes.NewReader(nil))) + stdioClient := mcpclient.NewClient(clientTransport) + defer stdioClient.Close() + require.NoError(t, stdioClient.Start(ctx)) + + initReq := mcp.InitializeRequest{} + initReq.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION + initReq.Params.ClientInfo = mcp.Implementation{ + Name: "test-client", + Version: "1.0.0", + } + _, err = stdioClient.Initialize(ctx, initReq) + require.NoError(t, err) + + listTools, err := stdioClient.ListTools(ctx, mcp.ListToolsRequest{}) + require.NoError(t, err) + require.Len(t, listTools.Tools, 2) +} diff --git a/integration/appaccess/pack.go b/integration/appaccess/pack.go index b7eaf2f1f4e48..5a223695f5d13 100644 --- a/integration/appaccess/pack.go +++ b/integration/appaccess/pack.go @@ -29,6 +29,7 @@ import ( "net" "net/http" "net/url" + "os" "testing" "time" @@ -57,6 +58,7 @@ import ( "github.com/gravitational/teleport/lib/srv/alpnproxy" alpncommon "github.com/gravitational/teleport/lib/srv/alpnproxy/common" "github.com/gravitational/teleport/lib/srv/app/common" + libmcp "github.com/gravitational/teleport/lib/srv/mcp" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/web" "github.com/gravitational/teleport/lib/web/app" @@ -1062,6 +1064,12 @@ func (p *Pack) startLeafAppServers(t *testing.T, count int, opts AppTestOptions) } func waitForAppRegInRemoteSiteCache(t *testing.T, tunnel reversetunnelclient.Server, clusterName string, cfgApps []servicecfg.App, hostUUID string) { + if os.Getenv(libmcp.InMemoryServerEnvVar) == "true" { + cfgApps = append(cfgApps, servicecfg.App{ + Name: libmcp.InMemoryServerName, + }) + } + require.EventuallyWithT(t, func(t *assert.CollectT) { site, err := tunnel.GetSite(clusterName) assert.NoError(t, err) diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 7a479236305a1..9b6ee6e45bdc0 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -981,6 +981,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.31.0 h1:4UxSV8aM770OPmTvaVe/b1rA2oZAjBMhGBfUgOGut+4= +github.com/mark3labs/mcp-go v0.31.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= @@ -1347,6 +1349,8 @@ github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8 github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +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-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= diff --git a/lib/client/api.go b/lib/client/api.go index 9e8bd3b0cb794..7ab359d5e01d0 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,101 @@ 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) +} diff --git a/lib/service/service.go b/lib/service/service.go index 25e35a997395e..9f1e7cade53d0 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -160,6 +160,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" @@ -5044,11 +5045,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 @@ -6178,6 +6184,14 @@ func (process *TeleportProcess) initApps() { applications = append(applications, a) } + if os.Getenv(mcp.InMemoryServerEnvVar) == "true" { + if mcpInMemoryServer, err := mcp.NewInMemoryServerApp(); err != nil { + logger.ErrorContext(process.ExitContext(), "Failed to create in-memory MCP server app") + } else { + applications = append(applications, mcpInMemoryServer) + } + } + lockWatcher, err := services.NewLockWatcher(process.ExitContext(), services.LockWatcherConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentApp, diff --git a/lib/service/service_test.go b/lib/service/service_test.go index b7bd9663856ea..872a14165c7ca 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -831,6 +831,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", @@ -851,6 +852,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", @@ -871,6 +873,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", @@ -894,6 +897,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/services/role.go b/lib/services/role.go index 151d81800ec42..b2aa02fcb4063 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()), @@ -612,6 +615,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 diff --git a/lib/services/role_test.go b/lib/services/role_test.go index c268061f2543e..73ce3bd3ac2be 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, }, }, } 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 3cd60725c5797..73d986b59e536 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" @@ -175,6 +176,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 +275,17 @@ 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, + }) + 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) @@ -579,14 +592,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. @@ -602,17 +620,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/memory.go b/lib/srv/mcp/memory.go new file mode 100644 index 0000000000000..49126399f2a79 --- /dev/null +++ b/lib/srv/mcp/memory.go @@ -0,0 +1,111 @@ +/* + * 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" + mcpserver "github.com/mark3labs/mcp-go/server" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/services" +) + +const ( + // InMemoryServerEnvVar enables an in-memory MCP server for testing + // purposes. The test app enables a stdio MCP server that has a + // "teleport-hello-test" tool and a "teleport-echo-test" tool. + InMemoryServerEnvVar = "TELEPORT_UNSTABLE_MCP_IN_MEMORY_SERVER" + + // InMemoryServerName is the name of the in-memory MCP server. + InMemoryServerName = "teleport-mcp-test-server" +) + +// NewInMemoryServerApp returns the app definition for the in-memory test server. +func NewInMemoryServerApp() (types.Application, error) { + app, err := types.NewAppV3(types.Metadata{ + Name: InMemoryServerName, + Labels: map[string]string{ + types.TeleportInternalLabelPrefix + "mcp-in-memory-server": "true", + }, + }, types.AppSpecV3{ + MCP: &types.MCP{ + Command: "in-memory-server", + RunAsHostUser: "in-memory-server", + }, + }) + return app, trace.Wrap(err) +} + +func isInMemoryServerApp(app types.Application) bool { + value, ok := app.GetLabel(types.TeleportInternalLabelPrefix + "mcp-in-memory-server") + return ok && value == "true" +} + +func (s *Server) handleInMemoryServerSession(ctx context.Context, sessionCtx SessionCtx) error { + s.cfg.Log.DebugContext(ctx, "Started in-memory server session") + defer s.cfg.Log.DebugContext(ctx, "Completed in-memory server session") + + server := mcpserver.NewMCPServer("hello-test-server", "1.0.0") + stdioServer := mcpserver.NewStdioServer(server) + stdioServer.SetErrorLogger(slog.NewLogLogger(s.cfg.Log.Handler(), slog.LevelDebug)) + + checkAccess := func(toolName string) bool { + return sessionCtx.AuthCtx.Checker.CheckAccess( + sessionCtx.App, + services.AccessState{ + MFAVerified: true, + }, + &services.MCPToolMatcher{ + Name: toolName, + }, + ) == nil + } + + helloTool := mcp.NewTool("teleport-hello-test", + mcp.WithDescription("this is simple hello test and it always return \"hello client\""), + ) + if checkAccess(helloTool.GetName()) { + server.AddTool(helloTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + return &mcp.CallToolResult{ + Content: []mcp.Content{mcp.NewTextContent("hello client")}, + }, nil + }) + } + + echoTool := mcp.NewTool("teleport-echo-test", + mcp.WithDescription("this is simple echo and it always return the input back"), + mcp.WithString("input", mcp.Required(), mcp.Description("input for echo")), + ) + if checkAccess(echoTool.GetName()) { + server.AddTool(echoTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + input, err := request.RequireString("input") + if err != nil { + return nil, trace.Wrap(err) + } + return &mcp.CallToolResult{ + Content: []mcp.Content{mcp.NewTextContent(input)}, + }, nil + }) + } + return stdioServer.Listen(ctx, sessionCtx.ClientConn, sessionCtx.ClientConn) +} diff --git a/lib/srv/mcp/server.go b/lib/srv/mcp/server.go new file mode 100644 index 0000000000000..67b7470620266 --- /dev/null +++ b/lib/srv/mcp/server.go @@ -0,0 +1,115 @@ +/* + * 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" + "os" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + + "github.com/gravitational/teleport" + apievents "github.com/gravitational/teleport/api/types/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 + + clock clockwork.Clock + inMemoryServer bool +} + +// 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() + } + c.inMemoryServer = os.Getenv(InMemoryServerEnvVar) == "true" + 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.inMemoryServer && isInMemoryServerApp(sessionCtx.App) { + return trace.Wrap(s.handleInMemoryServerSession(ctx, sessionCtx)) + } + // TODO(greedy52) handle stdio + return trace.NotImplemented("not implemented") +} + +// HandleUnauthorizedConnection handles an unauthorized client connection. +func (s *Server) HandleUnauthorizedConnection(ctx context.Context, clientConn net.Conn, authErr error) error { + // TODO(greedy52) handle stdio + return trace.NotImplemented("not implemented") +} diff --git a/lib/srv/mcp/session.go b/lib/srv/mcp/session.go new file mode 100644 index 0000000000000..1c1261d2d86ce --- /dev/null +++ b/lib/srv/mcp/session.go @@ -0,0 +1,65 @@ +/* + * 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" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/session" + "github.com/gravitational/teleport/lib/tlsca" +) + +// 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 session ID. + 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 == "" { + // Do not use web session ID from the app route. + c.sessionID = session.NewID() + } + return nil +} diff --git a/tool/tsh/common/mcp.go b/tool/tsh/common/mcp.go index bbe574d7a802f..e9675ee9a2a1e 100644 --- a/tool/tsh/common/mcp.go +++ b/tool/tsh/common/mcp.go @@ -32,8 +32,9 @@ import ( type mcpCommands struct { dbStart *mcpDBStartCommand - config *mcpConfigCommand - list *mcpListCommand + config *mcpConfigCommand + list *mcpListCommand + connect *mcpConnectCommand } func newMCPCommands(app *kingpin.Application, cf *CLIConf) *mcpCommands { @@ -42,8 +43,9 @@ func newMCPCommands(app *kingpin.Application, cf *CLIConf) *mcpCommands { return &mcpCommands{ dbStart: newMCPDBCommand(db), - list: newMCPListCommand(mcp, cf), - config: newMCPConfigCommand(mcp, cf), + list: newMCPListCommand(mcp, cf), + config: newMCPConfigCommand(mcp, cf), + connect: newMCPConnectCommand(mcp, cf), } } diff --git a/tool/tsh/common/mcp_app.go b/tool/tsh/common/mcp_app.go index 5397d73a26b71..56b645b6c8e56 100644 --- a/tool/tsh/common/mcp_app.go +++ b/tool/tsh/common/mcp_app.go @@ -40,9 +40,20 @@ import ( "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."), @@ -399,3 +410,28 @@ restart your client after logging in a new tsh session. } 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/tsh.go b/tool/tsh/common/tsh.go index 47e1125ec55be..0b26082059d86 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -1802,6 +1802,8 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = pivCmd.agent.run(&cf) case mcpCmd.dbStart.FullCommand(): err = mcpCmd.dbStart.run(&cf) + case mcpCmd.connect.FullCommand(): + err = mcpCmd.connect.run() case mcpCmd.list.FullCommand(): err = mcpCmd.list.run() case mcpCmd.config.FullCommand(): From 121a5c38774d798d9746a13b0be7777bb72e53fe Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Mon, 23 Jun 2025 12:01:29 -0400 Subject: [PATCH 12/21] MCP access part 10: server handler (#55644) * MCP access part 10: server handler * address feedback and fix docker tests * add more comments * minor lint fix * move set logger default after other checks --- lib/auth/sessions.go | 6 + lib/services/access_checker.go | 3 + lib/srv/mcp/audit.go | 228 +++++++++++++++++++ lib/srv/mcp/helpers_test.go | 331 +++++++++++++++++++++++++++ lib/srv/mcp/memory.go | 29 +-- lib/srv/mcp/server.go | 66 +++++- lib/srv/mcp/session.go | 181 ++++++++++++++- lib/srv/mcp/session_test.go | 153 +++++++++++++ lib/srv/mcp/stdio.go | 283 +++++++++++++++++++++++ lib/srv/mcp/stdio_test.go | 377 +++++++++++++++++++++++++++++++ lib/srv/reexec.go | 71 +----- lib/srv/reexec_test.go | 2 +- lib/utils/host/hostusers.go | 80 +++++++ lib/utils/mcputils/errors.go | 12 + lib/utils/mcputils/stdio_test.go | 6 +- 15 files changed, 1734 insertions(+), 94 deletions(-) create mode 100644 lib/srv/mcp/audit.go create mode 100644 lib/srv/mcp/helpers_test.go create mode 100644 lib/srv/mcp/session_test.go create mode 100644 lib/srv/mcp/stdio.go create mode 100644 lib/srv/mcp/stdio_test.go 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/services/access_checker.go b/lib/services/access_checker.go index fd7526d10211a..d5702ef1760f0 100644 --- a/lib/services/access_checker.go +++ b/lib/services/access_checker.go @@ -1353,6 +1353,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/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/helpers_test.go b/lib/srv/mcp/helpers_test.go new file mode 100644 index 0000000000000..95e4b4e91688e --- /dev/null +++ b/lib/srv/mcp/helpers_test.go @@ -0,0 +1,331 @@ +/* + * 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)) + 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/memory.go b/lib/srv/mcp/memory.go index 49126399f2a79..288190ff20c4f 100644 --- a/lib/srv/mcp/memory.go +++ b/lib/srv/mcp/memory.go @@ -27,7 +27,6 @@ import ( mcpserver "github.com/mark3labs/mcp-go/server" "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/lib/services" ) const ( @@ -65,27 +64,23 @@ func (s *Server) handleInMemoryServerSession(ctx context.Context, sessionCtx Ses s.cfg.Log.DebugContext(ctx, "Started in-memory server session") defer s.cfg.Log.DebugContext(ctx, "Completed in-memory server session") + session, err := s.makeSessionHandler(ctx, sessionCtx) + if err != nil { + return trace.Wrap(err) + } + session.emitStartEvent(s.cfg.ParentContext) + defer session.emitEndEvent(s.cfg.ParentContext) + + // TODO(greedy52) audit log notification and requests. server := mcpserver.NewMCPServer("hello-test-server", "1.0.0") stdioServer := mcpserver.NewStdioServer(server) stdioServer.SetErrorLogger(slog.NewLogLogger(s.cfg.Log.Handler(), slog.LevelDebug)) - checkAccess := func(toolName string) bool { - return sessionCtx.AuthCtx.Checker.CheckAccess( - sessionCtx.App, - services.AccessState{ - MFAVerified: true, - }, - &services.MCPToolMatcher{ - Name: toolName, - }, - ) == nil - } - helloTool := mcp.NewTool("teleport-hello-test", mcp.WithDescription("this is simple hello test and it always return \"hello client\""), ) - if checkAccess(helloTool.GetName()) { - server.AddTool(helloTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + if session.checkAccessToTool(ctx, helloTool.GetName()) == nil { + server.AddTool(helloTool, func(context.Context, mcp.CallToolRequest) (*mcp.CallToolResult, error) { return &mcp.CallToolResult{ Content: []mcp.Content{mcp.NewTextContent("hello client")}, }, nil @@ -96,8 +91,8 @@ func (s *Server) handleInMemoryServerSession(ctx context.Context, sessionCtx Ses mcp.WithDescription("this is simple echo and it always return the input back"), mcp.WithString("input", mcp.Required(), mcp.Description("input for echo")), ) - if checkAccess(echoTool.GetName()) { - server.AddTool(echoTool, func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { + if session.checkAccessToTool(ctx, echoTool.GetName()) == nil { + server.AddTool(echoTool, func(_ context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { input, err := request.RequireString("input") if err != nil { return nil, trace.Wrap(err) diff --git a/lib/srv/mcp/server.go b/lib/srv/mcp/server.go index 67b7470620266..ea9fe2b3ac086 100644 --- a/lib/srv/mcp/server.go +++ b/lib/srv/mcp/server.go @@ -23,12 +23,15 @@ import ( "log/slog" "net" "os" + "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" ) @@ -104,12 +107,67 @@ func (s *Server) HandleSession(ctx context.Context, sessionCtx SessionCtx) error if s.cfg.inMemoryServer && isInMemoryServerApp(sessionCtx.App) { return trace.Wrap(s.handleInMemoryServerSession(ctx, sessionCtx)) } - // TODO(greedy52) handle stdio - return trace.NotImplemented("not implemented") + 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 { - // TODO(greedy52) handle stdio - return trace.NotImplemented("not implemented") + 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 index 1c1261d2d86ce..58cd199fc2a31 100644 --- a/lib/srv/mcp/session.go +++ b/lib/srv/mcp/session.go @@ -19,14 +19,24 @@ 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. @@ -40,7 +50,10 @@ type SessionCtx struct { // Identity is the user identity. Identity tlsca.Identity - // sessionID is the session ID. + // 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 } @@ -58,8 +71,172 @@ func (c *SessionCtx) checkAndSetDefaults() error { c.Identity = c.AuthCtx.Identity.GetIdentity() } if c.sessionID == "" { - // Do not use web session ID from the app route. 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) +} + +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..e6e48fab7c514 --- /dev/null +++ b/lib/srv/mcp/stdio.go @@ -0,0 +1,283 @@ +/* + * 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" + + "github.com/gravitational/teleport/lib/utils" + 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.NewStdioMessageReader(mcputils.StdioMessageReaderConfig{ + SourceReadCloser: 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.NewStdioMessageWriter(utils.NewSyncWriter(sessionCtx.ClientConn)) + serverRequestWriter := mcputils.NewStdioMessageWriter(utils.NewSyncWriter(writeToServer)) + + clientRequestReader, err := mcputils.NewStdioMessageReader(mcputils.StdioMessageReaderConfig{ + SourceReadCloser: 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: func(ctx context.Context, req *mcputils.JSONRPCRequest) error { + msg, replyDirection := session.processClientRequest(ctx, req) + if replyDirection == replyToClient { + return trace.Wrap(clientResponseWriter.WriteMessage(ctx, msg)) + } + return trace.Wrap(serverRequestWriter.WriteMessage(ctx, msg)) + }, + OnNotification: func(ctx context.Context, notification *mcputils.JSONRPCNotification) error { + session.processClientNotification(ctx, notification) + return trace.Wrap(serverRequestWriter.WriteMessage(ctx, notification)) + }, + }) + if err != nil { + return trace.Wrap(err) + } + + stdoutLogger := session.logger.With("stdio", "stdout") + serverResponseReader, err := mcputils.NewStdioMessageReader(mcputils.StdioMessageReaderConfig{ + SourceReadCloser: readFromServer, + Logger: stdoutLogger, + ParentContext: s.cfg.ParentContext, + OnClose: serverRunner.close, + OnParseError: mcputils.LogAndIgnoreParseError(stdoutLogger), + OnNotification: func(ctx context.Context, notification *mcputils.JSONRPCNotification) error { + return trace.Wrap(clientResponseWriter.WriteMessage(ctx, notification)) + }, + OnResponse: func(ctx context.Context, response *mcputils.JSONRPCResponse) error { + msgToClient := session.processServerResponse(ctx, response) + return trace.Wrap(clientResponseWriter.WriteMessage(ctx, msgToClient)) + }, + }) + 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..730856323afcd --- /dev/null +++ b/lib/srv/mcp/stdio_test.go @@ -0,0 +1,377 @@ +/* + * 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 ( + "bytes" + "context" + "io" + "log/slog" + "net" + "os" + "path" + "testing" + "time" + + "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/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/mcputils" +) + +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 := makeStdioClient(t, clientSourceConn) + _, err = initializeStdioClient(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 mock server. + handlerErr := s.handleStdio(ctx, *testCtx.SessionCtx, makeMockMCPServerRunner) + handlerDoneCh <- struct{}{} + require.NoError(t, handlerErr) + }() + + // Use a real client. Verify session start and end events. + stdioClient := makeStdioClient(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") + resp, err := initializeStdioClient(ctx, stdioClient) + require.NoError(t, err) + require.Equal(t, "test-server", resp.ServerInfo.Name) + + callToolRequest := mcp.CallToolRequest{} + callToolRequest.Params.Name = "hello-server" + callToolResult, err := stdioClient.CallTool(ctx, callToolRequest) + require.NoError(t, err) + require.NotNil(t, callToolResult) + require.Equal(t, []mcp.Content{ + mcp.NewTextContent("hello client"), + }, callToolResult.Content) + + // 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) +} + +func makeMockMCPServerRunner(context.Context, *sessionHandler) (stdioServerRunner, error) { + serverStdin, writeToServer := io.Pipe() + readFromServer, serverStdout := io.Pipe() + return &mockStdioServerRunner{ + serverStdin: serverStdin, + serverStdout: serverStdout, + writeToServer: writeToServer, + readFromServer: readFromServer, + pipeClosers: []io.Closer{ + serverStdin, writeToServer, + readFromServer, serverStdout, + }, + }, nil +} + +type mockStdioServerRunner struct { + serverStdin io.ReadCloser + serverStdout io.WriteCloser + writeToServer io.WriteCloser + readFromServer io.ReadCloser + pipeClosers []io.Closer +} + +func (s *mockStdioServerRunner) getStdinPipe() (io.WriteCloser, error) { + return s.writeToServer, nil +} + +func (s *mockStdioServerRunner) getStdoutPipe() (io.ReadCloser, error) { + return s.readFromServer, nil +} + +func (s *mockStdioServerRunner) run(ctx context.Context) error { + slog.DebugContext(ctx, "running mock stdio server") + server := mcpserver.NewMCPServer("test-server", "1.0.0") + server.AddTool(mcp.Tool{ + Name: "hello-server", + }, func(context.Context, mcp.CallToolRequest) (*mcp.CallToolResult, error) { + return &mcp.CallToolResult{ + Content: []mcp.Content{mcp.NewTextContent("hello client")}, + }, nil + }) + err := mcpserver.NewStdioServer(server).Listen(ctx, s.serverStdin, s.serverStdout) + if err != nil && !mcputils.IsOKCloseError(err) { + return trace.Wrap(err) + } + return nil +} + +func (s *mockStdioServerRunner) close() { + for _, pipeCloser := range s.pipeClosers { + pipeCloser.Close() + } +} + +func makeStdioClient(t *testing.T, clientSourceConn net.Conn) *mcpclient.Client { + t.Helper() + stdioClientTransport := mcpclienttransport.NewIO(clientSourceConn, clientSourceConn, io.NopCloser(bytes.NewReader(nil))) + stdioClient := mcpclient.NewClient(stdioClientTransport) + t.Cleanup(func() { + stdioClient.Close() + }) + require.NoError(t, stdioClient.Start(t.Context())) + return stdioClient +} + +func initializeStdioClient(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) +} + +// 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 := makeStdioClient(t, testCtx.clientSourceConn) + defer stdioClient.Close() + + reqCtx, reqCancel := context.WithTimeout(t.Context(), time.Second*5) + defer reqCancel() + resp, err := initializeStdioClient(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 87bb2d3f81359..71a8fe617895c 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/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/mcputils/errors.go b/lib/utils/mcputils/errors.go index ea819e9c88b30..6aee38c735821 100644 --- a/lib/utils/mcputils/errors.go +++ b/lib/utils/mcputils/errors.go @@ -21,6 +21,7 @@ package mcputils import ( "errors" "io" + "io/fs" "github.com/gravitational/teleport/lib/utils" ) @@ -29,5 +30,16 @@ import ( // 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/stdio_test.go b/lib/utils/mcputils/stdio_test.go index ec63799353ed5..491f8298a7da2 100644 --- a/lib/utils/mcputils/stdio_test.go +++ b/lib/utils/mcputils/stdio_test.go @@ -56,13 +56,13 @@ func TestStdioHelpers(t *testing.T) { // Pipes for hooking things up. clientStdin, writeToClient := io.Pipe() readFromClient, clientStdout := io.Pipe() - serverStdio, writeToServer := 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(), - serverStdio.Close(), writeToServer.Close(), + serverStdin.Close(), writeToServer.Close(), readFromServer.Close(), serverStdout.Close(), )) }) @@ -121,7 +121,7 @@ func TestStdioHelpers(t *testing.T) { stdioServer := mcpserver.NewStdioServer(makeTestMCPServer()) stdioServer.SetErrorLogger(log.New(io.Discard, "", log.LstdFlags)) - go stdioServer.Listen(ctx, serverStdio, serverStdout) + go stdioServer.Listen(ctx, serverStdin, serverStdout) // Test things out. t.Run("client initialize", func(t *testing.T) { From e06776b3d2c08409ea74946592e7ee56f6273b92 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Wed, 25 Jun 2025 17:16:54 -0300 Subject: [PATCH 13/21] Implement `tsh mcp db config` (#55781) * feat(tsh): add `tsh mcp db config` subcommand * chore(claude): fix lint * refactor: code review suggestions * refactor: code review suggestions * test(tsh): add missing option on test case * chore(tsh): add message on manually adding database URI --- lib/client/db/mcp/server.go | 4 +- lib/client/db/mcp/server_test.go | 2 +- lib/client/db/postgres/mcp/mcp.go | 2 +- lib/client/db/postgres/mcp/mcp_test.go | 2 +- lib/client/mcp/claude/config.go | 14 +- lib/client/mcp/claude/config_test.go | 23 +++ lib/client/mcp/uri.go | 67 ++++++- lib/client/mcp/uri_test.go | 54 +++++- tool/tsh/common/help.go | 12 ++ tool/tsh/common/mcp.go | 7 +- tool/tsh/common/mcp_db.go | 248 +++++++++++++++++++++++-- tool/tsh/common/mcp_db_test.go | 200 ++++++++++++++++++++ tool/tsh/common/tsh.go | 4 +- 13 files changed, 604 insertions(+), 35 deletions(-) diff --git a/lib/client/db/mcp/server.go b/lib/client/db/mcp/server.go index b26e8bd0eaabe..aea9f023031af 100644 --- a/lib/client/db/mcp/server.go +++ b/lib/client/db/mcp/server.go @@ -111,7 +111,7 @@ func (s *RootServer) RegisterDatabase(db *Database) { s.mu.Lock() defer s.mu.Unlock() - uri := db.ResourceURI().String() + 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) } @@ -124,7 +124,7 @@ func (s *RootServer) ServeStdio(ctx context.Context, in io.Reader, out io.Writer func buildDatabaseResource(db *Database) DatabaseResource { return DatabaseResource{ Metadata: db.DB.GetMetadata(), - URI: db.ResourceURI().String(), + URI: db.ResourceURI().WithoutParams().String(), Protocol: db.DB.GetProtocol(), ClusterName: db.ClusterName, } diff --git a/lib/client/db/mcp/server_test.go b/lib/client/db/mcp/server_test.go index 007067d3507ea..f581f7462b1d1 100644 --- a/lib/client/db/mcp/server_test.go +++ b/lib/client/db/mcp/server_test.go @@ -42,7 +42,7 @@ func TestRegisterDatabase(t *testing.T) { } // sort databases by name to ensure the same order every test. slices.SortFunc(databases, func(a, b *Database) int { - return strings.Compare(a.ResourceURI().String(), b.ResourceURI().String()) + return strings.Compare(a.ResourceURI().WithoutParams().String(), b.ResourceURI().WithoutParams().String()) }) for _, db := range databases { diff --git a/lib/client/db/postgres/mcp/mcp.go b/lib/client/db/postgres/mcp/mcp.go index 6a6b8a19dc10b..1624d11ba4a76 100644 --- a/lib/client/db/postgres/mcp/mcp.go +++ b/lib/client/db/postgres/mcp/mcp.go @@ -77,7 +77,7 @@ func NewServer(ctx context.Context, cfg *dbmcp.NewServerConfig) (dbmcp.Server, e return nil, trace.BadParameter("failed to parse database %q connection config: %s", db.DB.GetName(), err) } - s.databases[db.ResourceURI().String()] = &database{ + s.databases[db.ResourceURI().WithoutParams().String()] = &database{ Database: db, pool: pool, } diff --git a/lib/client/db/postgres/mcp/mcp_test.go b/lib/client/db/postgres/mcp/mcp_test.go index efdf69f5804e6..c00dc8214f975 100644 --- a/lib/client/db/postgres/mcp/mcp_test.go +++ b/lib/client/db/postgres/mcp/mcp_test.go @@ -85,7 +85,7 @@ func TestFormatErrors(t *testing.T) { URI: "localhost:5432", }) require.NoError(t, err) - dbURI := clientmcp.NewDatabaseResourceURI("root", dbName).String() + dbURI := clientmcp.NewDatabaseResourceURI("root", dbName).WithoutParams().String() for name, tc := range map[string]struct { databaseURI string diff --git a/lib/client/mcp/claude/config.go b/lib/client/mcp/claude/config.go index 90578db684838..e462621d3b2d1 100644 --- a/lib/client/mcp/claude/config.go +++ b/lib/client/mcp/claude/config.go @@ -136,10 +136,20 @@ func (c *Config) GetMCPServers() map[string]MCPServer { return maps.Clone(c.mcpServers) } -// PutMCPServer adds a new MCP server or replace an existing one. +// 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 - c.configData, err = sjson.SetBytes(c.configData, c.mcpServerJSONPath(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) } diff --git a/lib/client/mcp/claude/config_test.go b/lib/client/mcp/claude/config_test.go index 0ced8a55a5942..51f4587fd631d 100644 --- a/lib/client/mcp/claude/config_test.go +++ b/lib/client/mcp/claude/config_test.go @@ -248,6 +248,29 @@ func Test_formatJSON(t *testing.T) { } } +// 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) diff --git a/lib/client/mcp/uri.go b/lib/client/mcp/uri.go index a932a67c776ec..c9337096d73a2 100644 --- a/lib/client/mcp/uri.go +++ b/lib/client/mcp/uri.go @@ -69,8 +69,39 @@ func ParseResourceURI(uri string) (*ResourceURI, error) { return &ResourceURI{url: *parsedURL}, nil } -// NewDatabaseResourceURI creates a new database resource URI. -func NewDatabaseResourceURI(cluster, databaseName string) ResourceURI { +// 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, @@ -78,10 +109,19 @@ func NewDatabaseResourceURI(cluster, databaseName string) ResourceURI { }, }) + 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, "/"), + Scheme: resourceScheme, + Path: strings.TrimPrefix(pathWithHost, "/"), + RawQuery: values.Encode(), }, } } @@ -122,12 +162,21 @@ func (u ResourceURI) IsDatabase() bool { return u.GetDatabaseServiceName() != "" } -// String returns the string representation of the resource URI (excluding the -// query params). +// String returns the string representation of the resource URI. func (u ResourceURI) String() string { - c := u.url - c.RawQuery = "" - return c.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 diff --git a/lib/client/mcp/uri_test.go b/lib/client/mcp/uri_test.go index 30cdc64a2a357..cf8c3df4f5d72 100644 --- a/lib/client/mcp/uri_test.go +++ b/lib/client/mcp/uri_test.go @@ -57,8 +57,16 @@ func TestDatabaseResourceURI(t *testing.T) { expectedDatabaseUser: "", expectedClusterName: "default", }, - "generated uri": { - uri: NewDatabaseResourceURI("default", "db").String(), + "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: "", @@ -92,3 +100,45 @@ func TestDatabaseResourceURI(t *testing.T) { }) } } + +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/tool/tsh/common/help.go b/tool/tsh/common/help.go index 6ae4a5e8411e5..092b78279f238 100644 --- a/tool/tsh/common/help.go +++ b/tool/tsh/common/help.go @@ -87,4 +87,16 @@ Examples: 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 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/mcp.go b/tool/tsh/common/mcp.go index e9675ee9a2a1e..a24c0b2cb2bc0 100644 --- a/tool/tsh/common/mcp.go +++ b/tool/tsh/common/mcp.go @@ -30,7 +30,8 @@ import ( ) type mcpCommands struct { - dbStart *mcpDBStartCommand + dbStart *mcpDBStartCommand + dbConfig *mcpDBConfigCommand config *mcpConfigCommand list *mcpListCommand @@ -41,7 +42,8 @@ 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), + dbStart: newMCPDBCommand(db, cf), + dbConfig: newMCPDBconfigCommand(db, cf), list: newMCPListCommand(mcp, cf), config: newMCPConfigCommand(mcp, cf), @@ -114,6 +116,7 @@ a config file compatible with the "mcpServer" mapping.`) // 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 { diff --git a/tool/tsh/common/mcp_db.go b/tool/tsh/common/mcp_db.go index bfef15ec6726e..40d28fdcfa98b 100644 --- a/tool/tsh/common/mcp_db.go +++ b/tool/tsh/common/mcp_db.go @@ -18,15 +18,22 @@ package common import ( "context" + "fmt" "log/slog" + "maps" + "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/srv/alpnproxy" "github.com/gravitational/teleport/lib/tlsca" @@ -38,30 +45,32 @@ import ( type mcpDBStartCommand struct { *kingpin.CmdClause + cf *CLIConf databaseURIs []string } -func newMCPDBCommand(parent *kingpin.CmdClause) *mcpDBStartCommand { +func newMCPDBCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpDBStartCommand { cmd := &mcpDBStartCommand{ - CmdClause: parent.Command("start", "Start a local MCP server for database access").Hidden(), + 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(cf *CLIConf) error { - logger, err := initLogger(cf, utils.LoggingForMCP, getLoggingOptsForMCPServer(cf)) +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 cf.databaseMCPRegistryOverride != nil { - registry = cf.databaseMCPRegistryOverride + if c.cf.databaseMCPRegistryOverride != nil { + registry = c.cf.databaseMCPRegistryOverride } - tc, err := makeClient(cf) + tc, err := makeClient(c.cf) if err != nil { return trace.Wrap(err) } @@ -87,16 +96,16 @@ func (c *mcpDBStartCommand) run(cf *CLIConf) error { return trace.BadParameter("Databases must be from the same cluster (%q). %q is from a different cluster.", tc.SiteName, rawURI) } - if _, ok := configuredDatabases[uri.String()]; ok { - return trace.BadParameter("Database %q was configured twice. MCP servers only support serving a database service only once.", uri.String()) + 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.String()] = struct{}{} + configuredDatabases[uri.WithoutParams().String()] = struct{}{} uris[i] = uri } server := dbmcp.NewRootServer(logger) - allDatabases, closeLocalProxies, err := c.prepareDatabases(cf, tc, registry, uris, logger, server) + allDatabases, closeLocalProxies, err := c.prepareDatabases(c.cf, tc, registry, uris, logger, server) if err != nil { return trace.Wrap(err) } @@ -108,7 +117,7 @@ func (c *mcpDBStartCommand) run(cf *CLIConf) error { continue } - srv, err := newServerFunc(cf.Context, &dbmcp.NewServerConfig{ + srv, err := newServerFunc(c.cf.Context, &dbmcp.NewServerConfig{ Logger: logger, RootServer: server, Databases: databases, @@ -116,10 +125,10 @@ func (c *mcpDBStartCommand) run(cf *CLIConf) error { if err != nil { return trace.Wrap(err) } - defer srv.Close(cf.Context) + defer srv.Close(c.cf.Context) } - return trace.Wrap(server.ServeStdio(cf.Context, cf.Stdin(), cf.Stdout())) + return trace.Wrap(server.ServeStdio(c.cf.Context, c.cf.Stdin(), c.cf.Stdout())) } // closeLocalProxyFunc function used to close local proxy listeners. @@ -226,9 +235,220 @@ func (c *mcpDBStartCommand) prepareDatabases( }, 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 index 123657d212841..5faf7c61ad479 100644 --- a/tool/tsh/common/mcp_db_test.go +++ b/tool/tsh/common/mcp_db_test.go @@ -17,19 +17,27 @@ 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" @@ -217,7 +225,199 @@ func TestMCPDBCommandFailures(t *testing.T) { }) } +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/tsh.go b/tool/tsh/common/tsh.go index 0b26082059d86..dc11b1cd0a74c 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -1801,7 +1801,9 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { case pivCmd.agent.FullCommand(): err = pivCmd.agent.run(&cf) case mcpCmd.dbStart.FullCommand(): - err = mcpCmd.dbStart.run(&cf) + err = mcpCmd.dbStart.run() + case mcpCmd.dbConfig.FullCommand(): + err = mcpCmd.dbConfig.run() case mcpCmd.connect.FullCommand(): err = mcpCmd.connect.run() case mcpCmd.list.FullCommand(): From 1d1b7ca13bda6831a7b28d467b6812ca98f4baf6 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Thu, 26 Jun 2025 11:21:28 -0300 Subject: [PATCH 14/21] Refactor MCP database access to dial ALPN proxy directly (#55836) * refactor: dial database instead of using local proxy for MCP servers * refactor: review suggestions --- lib/client/api.go | 39 ++++++++++++ lib/client/db/mcp/errors.go | 19 +----- lib/client/db/mcp/mcp.go | 6 -- lib/client/db/mcp/server.go | 2 +- lib/client/db/mcp/server_test.go | 1 - lib/client/db/postgres/mcp/mcp.go | 18 +++--- lib/client/db/postgres/mcp/mcp_test.go | 31 ++++----- lib/client/local_proxy_middleware.go | 20 ------ lib/client/local_proxy_middleware_test.go | 6 -- tool/tsh/common/mcp_db.go | 76 ++++++----------------- 10 files changed, 84 insertions(+), 134 deletions(-) diff --git a/lib/client/api.go b/lib/client/api.go index 7ab359d5e01d0..f89b7666a61be 100644 --- a/lib/client/api.go +++ b/lib/client/api.go @@ -5589,3 +5589,42 @@ func (tc *TeleportClient) issueMCPCertWithMFA(ctx context.Context, mcpServer typ 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 index 8ab0112e9332a..19fdc90dbb2ac 100644 --- a/lib/client/db/mcp/errors.go +++ b/lib/client/db/mcp/errors.go @@ -25,27 +25,14 @@ import ( apiclient "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/lib/client/mcp" + "github.com/gravitational/teleport/lib/utils" ) -// ExtenralErrorRetriever returns an external error that might have happened. -// -// MCP servers don't have knowledge of other processes that might fail during -// their execution, such as authentication failures. This provider can be used -// to give them the necessary context to provide more accurate user messages. -type ExternalErrorRetriever interface { - // RetrieveError retrieves the error if any. - RetrieveError() error -} - // FormatErrorMessage formats the database MCP error messages. // format. -func FormatErrorMessage(retreiver ExternalErrorRetriever, err error) error { - if retreiver != nil { - err = trace.NewAggregate(retreiver.RetrieveError(), err) - } - +func FormatErrorMessage(err error) error { switch { - case errors.Is(err, apiclient.ErrClientCredentialsHaveExpired): + 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) diff --git a/lib/client/db/mcp/mcp.go b/lib/client/db/mcp/mcp.go index 43baf36144747..fdb514860bf5a 100644 --- a/lib/client/db/mcp/mcp.go +++ b/lib/client/db/mcp/mcp.go @@ -66,16 +66,10 @@ type Database struct { DB types.Database // ClusterName is the cluster name where the database is located. ClusterName string - // Addr is the address the MCP server used to create a new database - // connection. - Addr string // DatabaseUser is the database username used on the connections. DatabaseUser string // DatabaseName is the database name used on the connections. DatabaseName string - // ExternalErrorRetriever used to retrieve any external error that might - // have happened while connecting/communicating with the database. - ExternalErrorRetriever ExternalErrorRetriever // LookupFunc is the lookup function to resolve database address. LookupFunc LookupFunc // DialContextFunc is the dial function used to connect to the database. diff --git a/lib/client/db/mcp/server.go b/lib/client/db/mcp/server.go index aea9f023031af..5953f100f89bb 100644 --- a/lib/client/db/mcp/server.go +++ b/lib/client/db/mcp/server.go @@ -74,7 +74,7 @@ func (s *RootServer) ListDatabases(ctx context.Context, request mcp.CallToolRequ contents, err := encodeDatabaseResource(db) if err != nil { s.logger.ErrorContext(ctx, "error while list databases", "error", err) - return mcp.NewToolResultError(FormatErrorMessage(nil, err).Error()), nil + return mcp.NewToolResultError(FormatErrorMessage(err).Error()), nil } res = append(res, mcp.EmbeddedResource{Type: "resource", Resource: contents}) } diff --git a/lib/client/db/mcp/server_test.go b/lib/client/db/mcp/server_test.go index f581f7462b1d1..0a207bf24037f 100644 --- a/lib/client/db/mcp/server_test.go +++ b/lib/client/db/mcp/server_test.go @@ -150,7 +150,6 @@ func buildDatabase(t *testing.T, name string) *Database { return &Database{ DB: db, ClusterName: "root", - Addr: "localhost:5555", } } diff --git a/lib/client/db/postgres/mcp/mcp.go b/lib/client/db/postgres/mcp/mcp.go index 1624d11ba4a76..4e2004df9eb7f 100644 --- a/lib/client/db/postgres/mcp/mcp.go +++ b/lib/client/db/postgres/mcp/mcp.go @@ -112,17 +112,17 @@ type RunQueryResult struct { 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, nil, trace.Wrap(err)) + return s.wrapErrorResult(ctx, trace.Wrap(err)) } sql, err := request.RequireString(queryToolQueryParam) if err != nil { - return s.wrapErrorResult(ctx, nil, trace.Wrap(err)) + return s.wrapErrorResult(ctx, trace.Wrap(err)) } db, err := s.getDatabase(uri) if err != nil { - return s.wrapErrorResult(ctx, nil, err) + return s.wrapErrorResult(ctx, err) } // TODO(gabrielcorado): ensure the connection used is consistent for the @@ -130,21 +130,21 @@ func (s *Server) RunQuery(ctx context.Context, request mcp.CallToolRequest) (*mc // session/recording. rows, err := db.pool.Query(ctx, sql) if err != nil { - return s.wrapErrorResult(ctx, db.ExternalErrorRetriever, err) + return s.wrapErrorResult(ctx, err) } // Returned rows are being closed by this function. result, err := buildQueryResult(rows) if err != nil { - return s.wrapErrorResult(ctx, db.ExternalErrorRetriever, err) + return s.wrapErrorResult(ctx, err) } return mcp.NewToolResultText(result), nil } -func (s *Server) wrapErrorResult(ctx context.Context, externalRetriever dbmcp.ExternalErrorRetriever, toolErr error) (*mcp.CallToolResult, error) { +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(externalRetriever, toolErr).Error()}) + out, err := json.Marshal(RunQueryResult{ErrorMessage: dbmcp.FormatErrorMessage(toolErr).Error()}) return mcp.NewToolResultError(string(out)), trace.Wrap(err) } @@ -204,7 +204,9 @@ func (s *Server) getDatabase(uri string) (*database, error) { } func buildConnConfig(db *dbmcp.Database) (*pgxpool.Config, error) { - config, err := pgxpool.ParseConfig("postgres://" + db.Addr) + // 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) } diff --git a/lib/client/db/postgres/mcp/mcp_test.go b/lib/client/db/postgres/mcp/mcp_test.go index c00dc8214f975..9e3936b5a253e 100644 --- a/lib/client/db/postgres/mcp/mcp_test.go +++ b/lib/client/db/postgres/mcp/mcp_test.go @@ -20,6 +20,7 @@ import ( "context" "encoding/json" "log/slog" + "net" "testing" "github.com/jackc/pgx/v5" @@ -88,10 +89,9 @@ func TestFormatErrors(t *testing.T) { dbURI := clientmcp.NewDatabaseResourceURI("root", dbName).WithoutParams().String() for name, tc := range map[string]struct { - databaseURI string - databases []*dbmcp.Database - externalErrorRetriever dbmcp.ExternalErrorRetriever - expectErrorMessage require.ValueAssertionFunc + databaseURI string + databases []*dbmcp.Database + expectErrorMessage require.ValueAssertionFunc }{ "database not found": { databaseURI: "teleport://clusters/root/databases/not-found", @@ -113,7 +113,6 @@ func TestFormatErrors(t *testing.T) { ClusterName: "root", DatabaseUser: "postgres", DatabaseName: "postgres", - Addr: listener.Addr().String(), LookupFunc: func(_ context.Context, _ string) (addrs []string, err error) { return []string{"memory"}, nil }, @@ -128,16 +127,16 @@ func TestFormatErrors(t *testing.T) { databaseURI: dbURI, databases: []*dbmcp.Database{ &dbmcp.Database{ - DB: db, - ClusterName: "root", - DatabaseUser: "postgres", - DatabaseName: "postgres", - Addr: listener.Addr().String(), - ExternalErrorRetriever: &mockErrorRetriever{err: client.ErrClientCredentialsHaveExpired}, + DB: db, + ClusterName: "root", + DatabaseUser: "postgres", + DatabaseName: "postgres", LookupFunc: func(_ context.Context, _ string) (addrs []string, err error) { return []string{"memory"}, nil }, - DialContextFunc: listener.DialContext, + DialContextFunc: func(ctx context.Context, network, addr string) (net.Conn, error) { + return nil, client.ErrClientCredentialsHaveExpired + }, }, }, expectErrorMessage: func(tt require.TestingT, i1 interface{}, i2 ...interface{}) { @@ -224,11 +223,3 @@ func (mr *mockRows) CommandTag() pgconn.CommandTag { } func (mr *mockRows) Close() {} - -type mockErrorRetriever struct { - err error -} - -func (mr *mockErrorRetriever) RetrieveError() error { - return mr.err -} diff --git a/lib/client/local_proxy_middleware.go b/lib/client/local_proxy_middleware.go index 9f4fd19670d67..82341b50cf49c 100644 --- a/lib/client/local_proxy_middleware.go +++ b/lib/client/local_proxy_middleware.go @@ -52,9 +52,6 @@ type CertChecker struct { cert tls.Certificate certMu sync.Mutex - - err error - errMu sync.Mutex } var _ alpnproxy.LocalProxyMiddleware = (*CertChecker)(nil) @@ -149,10 +146,6 @@ func (c *CertChecker) GetOrIssueCert(ctx context.Context) (cert tls.Certificate, c.certMu.Lock() defer c.certMu.Unlock() - defer func() { - c.setError(err) - }() - if err := c.checkCert(); err == nil { return c.cert, nil } @@ -177,13 +170,6 @@ func (c *CertChecker) GetOrIssueCert(ctx context.Context) (cert tls.Certificate, return c.cert, nil } -// RetrieveError retrieves the happened on while retrieving certificates. -func (c *CertChecker) RetrieveError() error { - c.errMu.Lock() - defer c.errMu.Unlock() - return c.err -} - func (c *CertChecker) checkCert() error { leaf, err := utils.TLSCertLeaf(c.cert) if err != nil { @@ -198,12 +184,6 @@ func (c *CertChecker) checkCert() error { return trace.Wrap(c.certIssuer.CheckCert(leaf)) } -func (c *CertChecker) setError(err error) { - c.errMu.Lock() - defer c.errMu.Unlock() - c.err = err -} - // CertIssuer checks and issues certs. type CertIssuer interface { // CheckCert checks that an existing certificate is valid. diff --git a/lib/client/local_proxy_middleware_test.go b/lib/client/local_proxy_middleware_test.go index 48d99c859c39d..2a629609f7040 100644 --- a/lib/client/local_proxy_middleware_test.go +++ b/lib/client/local_proxy_middleware_test.go @@ -44,12 +44,10 @@ func TestCertChecker(t *testing.T) { // certChecker should issue a new cert on first request. cert, err := certChecker.GetOrIssueCert(ctx) require.NoError(t, err) - require.NoError(t, certChecker.RetrieveError()) // subsequent calls should return the same cert. sameCert, err := certChecker.GetOrIssueCert(ctx) require.NoError(t, err) - require.NoError(t, certChecker.RetrieveError()) require.Equal(t, cert, sameCert) // If the current cert expires it should be reissued. @@ -58,7 +56,6 @@ func TestCertChecker(t *testing.T) { cert, err = certChecker.GetOrIssueCert(ctx) require.NoError(t, err) - require.NoError(t, certChecker.RetrieveError()) require.NotEqual(t, cert, expiredCert) // If the current cert fails certIssuer checks, a new one should be issued. @@ -67,20 +64,17 @@ func TestCertChecker(t *testing.T) { cert, err = certChecker.GetOrIssueCert(ctx) require.NoError(t, err) - require.NoError(t, certChecker.RetrieveError()) require.NotEqual(t, cert, badCert) // If issuing a new cert fails, an error is returned. 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) - require.ErrorIs(t, certChecker.RetrieveError(), err, "expected retrieve error to be the same get error but got: %v", certChecker.RetrieveError()) // If the problem is solved, the error is clean up. certIssuer.issueErr = nil _, err = certChecker.GetOrIssueCert(ctx) require.NoError(t, err) - require.NoError(t, certChecker.RetrieveError()) } func TestLocalCertGenerator(t *testing.T) { diff --git a/tool/tsh/common/mcp_db.go b/tool/tsh/common/mcp_db.go index 40d28fdcfa98b..541fd0ddbbeaa 100644 --- a/tool/tsh/common/mcp_db.go +++ b/tool/tsh/common/mcp_db.go @@ -21,6 +21,7 @@ import ( "fmt" "log/slog" "maps" + "net" "text/template" "github.com/alecthomas/kingpin/v2" @@ -35,10 +36,8 @@ import ( "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/srv/alpnproxy" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" - "github.com/gravitational/teleport/lib/utils/listener" ) // mcpDBStartCommand implements `tsh mcp db start` command. @@ -105,11 +104,10 @@ func (c *mcpDBStartCommand) run() error { } server := dbmcp.NewRootServer(logger) - allDatabases, closeLocalProxies, err := c.prepareDatabases(c.cf, tc, registry, uris, logger, server) + allDatabases, err := c.prepareDatabases(c.cf, tc, registry, uris, logger, server) if err != nil { return trace.Wrap(err) } - defer closeLocalProxies() for protocol, newServerFunc := range registry { databases := allDatabases[protocol] @@ -131,9 +129,6 @@ func (c *mcpDBStartCommand) run() error { return trace.Wrap(server.ServeStdio(c.cf.Context, c.cf.Stdin(), c.cf.Stdout())) } -// closeLocalProxyFunc function used to close local proxy listeners. -type closeLocalProxyFunc func() error - // prepareDatabases based on the available MCP servers, initialize the database // local proxy and generate the MCP database. func (c *mcpDBStartCommand) prepareDatabases( @@ -143,11 +138,10 @@ func (c *mcpDBStartCommand) prepareDatabases( uris []*mcp.ResourceURI, logger *slog.Logger, server *dbmcp.RootServer, -) (map[string][]*dbmcp.Database, closeLocalProxyFunc, error) { +) (map[string][]*dbmcp.Database, error) { var ( ctx = cf.Context dbsPerProtocol = make(map[string][]*dbmcp.Database) - closeFuncs []closeLocalProxyFunc ) for _, uri := range uris { @@ -178,61 +172,31 @@ func (c *mcpDBStartCommand) prepareDatabases( continue } - route.Protocol = db.GetProtocol() - cc := client.NewDBCertChecker(tc, route, nil, client.WithTTL(tc.KeyTTL)) - // This avoids having the middleware to refresh the certificate if there - // is a certificate available on disk. - cert, err := loadDBCertificate(tc, route.ServiceName) - if err == nil { - cc.SetCert(cert) - } - - listener := listener.NewInMemoryListener() - lp, err := alpnproxy.NewLocalProxy( - makeBasicLocalProxyConfig(ctx, tc, listener, tc.InsecureSkipVerify), - alpnproxy.WithDatabaseProtocol(route.Protocol), - alpnproxy.WithMiddleware(cc), - alpnproxy.WithClusterCAsIfConnUpgrade(ctx, tc.RootClusterCACertPool), - ) - if err != nil { - _ = listener.Close() - logger.ErrorContext(ctx, "failed to start local proxy for database, skipping it", "database", db.GetName(), "error", err) - continue - } - go func() { - defer lp.Close() - if err = lp.Start(ctx); err != nil { - logger.WarnContext(ctx, "failed to start local ALPN proxy", "error", err) - } - }() - mcpDB := &dbmcp.Database{ - DB: db, - ClusterName: uri.GetClusterName(), - DatabaseUser: dbUser, - DatabaseName: dbName, - Addr: listener.Addr().String(), - ExternalErrorRetriever: cc, - // Since we're using in-memory listener we don't need to resolve the - // address. + 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{listener.Addr().String()}, nil + 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) }, - DialContextFunc: listener.DialContext, } dbsPerProtocol[db.GetProtocol()] = append(dbsPerProtocol[db.GetProtocol()], mcpDB) server.RegisterDatabase(mcpDB) - closeFuncs = append(closeFuncs, listener.Close) } - return dbsPerProtocol, func() error { - var errs []error - for _, closeFunc := range closeFuncs { - errs = append(errs, closeFunc()) - } - - return trace.NewAggregate(errs...) - }, nil + return dbsPerProtocol, nil } // databasesGetter is the interface used to retrieve available From bf1ee99a76462089646351c193485672fc2f56e3 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Thu, 26 Jun 2025 15:35:31 -0400 Subject: [PATCH 15/21] manual fixes --- tool/tsh/common/mcp_app.go | 4 ++-- web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tool/tsh/common/mcp_app.go b/tool/tsh/common/mcp_app.go index 56b645b6c8e56..5a67648e4c36b 100644 --- a/tool/tsh/common/mcp_app.go +++ b/tool/tsh/common/mcp_app.go @@ -50,7 +50,7 @@ func newMCPConnectCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpConnectCom cf: cf, } - cmd.Arg("name", "Name of the MCP server").Required().StringVar(&cf.AppName) + cmd.Arg("name", "Name of the MCP server.").Required().StringVar(&cf.AppName) return cmd } @@ -77,7 +77,7 @@ func newMCPConfigCommand(parent *kingpin.CmdClause, cf *CLIConf) *mcpConfigComma 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.Arg("name", "Name of the MCP server.").StringVar(&cf.AppName) cmd.clientConfig.addToCmd(cmd.CmdClause) cmd.Alias(mcpConfigHelp) return cmd diff --git a/web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx b/web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx index d549820cb7a05..30e7c58fed842 100644 --- a/web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx +++ b/web/packages/teleport/src/Apps/MCPAppConnectDialog.tsx @@ -78,9 +78,9 @@ export function MCPAppConnectDialog(props: { app: App; onClose: () => void }) { Step 2 - {' - Log in the MCP server'} + {' - Print configuration for the MCP server'} - + Restart your AI client to load the updated configuration if From 0141c46124fa7b5003098a4300ed4f1604ffb20e Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Tue, 15 Jul 2025 11:48:59 -0400 Subject: [PATCH 16/21] tctl users add/update to support mcp tools trait (#56771) * tctl users add/update to support mcp tools trait * revert empty slice capability --- api/types/user.go | 7 +++++++ tool/tctl/common/user_command.go | 10 ++++++++++ tool/tctl/common/user_command_test.go | 14 ++++++++++++++ 3 files changed, 31 insertions(+) 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/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 { From 4465e71b0896c5e0f0e42817ed41ae22cd018cb0 Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Wed, 9 Jul 2025 14:08:24 -0300 Subject: [PATCH 17/21] Enhances MCP servers usage with Cursor (#56474) * feat(mcp): enhances MCP servers usage with Cursor * refactor: code review suggestions --- lib/client/db/mcp/server.go | 22 +++++++++++++--------- lib/client/db/mcp/server_test.go | 15 ++++++++------- lib/client/mcp/claude/config.go | 23 +++++++++++++++++++++++ tool/tsh/common/help.go | 6 ++++++ tool/tsh/common/mcp.go | 18 ++++++++++++++---- 5 files changed, 64 insertions(+), 20 deletions(-) diff --git a/lib/client/db/mcp/server.go b/lib/client/db/mcp/server.go index 5953f100f89bb..eb693032e78e6 100644 --- a/lib/client/db/mcp/server.go +++ b/lib/client/db/mcp/server.go @@ -61,6 +61,10 @@ func NewRootServer(logger *slog.Logger) *RootServer { } // 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() @@ -76,7 +80,7 @@ func (s *RootServer) ListDatabases(ctx context.Context, request mcp.CallToolRequ s.logger.ErrorContext(ctx, "error while list databases", "error", err) return mcp.NewToolResultError(FormatErrorMessage(err).Error()), nil } - res = append(res, mcp.EmbeddedResource{Type: "resource", Resource: contents}) + res = append(res, mcp.NewTextContent(contents)) } return &mcp.CallToolResult{ @@ -99,7 +103,11 @@ func (s *RootServer) GetDatabaseResource(ctx context.Context, request mcp.ReadRe return nil, trace.Wrap(err) } - return []mcp.ResourceContents{encodedDb}, nil + 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 @@ -130,18 +138,14 @@ func buildDatabaseResource(db *Database) DatabaseResource { } } -func encodeDatabaseResource(db *Database) (mcp.ResourceContents, error) { +func encodeDatabaseResource(db *Database) (string, error) { resource := buildDatabaseResource(db) out, err := yaml.Marshal(resource) if err != nil { - return nil, trace.Wrap(err) + return "", trace.Wrap(err) } - return mcp.TextResourceContents{ - URI: resource.URI, - MIMEType: databaseResourceMIMEType, - Text: string(out), - }, nil + return string(out), nil } const ( diff --git a/lib/client/db/mcp/server_test.go b/lib/client/db/mcp/server_test.go index 0a207bf24037f..997c90c7d9e8c 100644 --- a/lib/client/db/mcp/server_test.go +++ b/lib/client/db/mcp/server_test.go @@ -80,8 +80,7 @@ func TestRegisterDatabase(t *testing.T) { require.Len(t, res.Content, len(databases)) for _, c := range res.Content { - require.IsType(t, mcp.EmbeddedResource{}, c) - require.IsType(t, mcp.TextResourceContents{}, c.(mcp.EmbeddedResource).Resource) + require.IsType(t, mcp.TextContent{}, c) } // Although we're not sorting by the URI directly, the only field that @@ -89,14 +88,16 @@ func TestRegisterDatabase(t *testing.T) { // 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.EmbeddedResource).Resource.(mcp.TextResourceContents) - resourceB := b.(mcp.EmbeddedResource).Resource.(mcp.TextResourceContents) - return strings.Compare(resourceA.Text, resourceB.Text) + resourceA := a.(mcp.TextContent).Text + resourceB := b.(mcp.TextContent).Text + return strings.Compare(resourceA, resourceB) }) for i, c := range res.Content { - content := c.(mcp.EmbeddedResource) - assertDatabaseResource(t, databases[i], content.Resource) + 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"))) } }) } diff --git a/lib/client/mcp/claude/config.go b/lib/client/mcp/claude/config.go index e462621d3b2d1..6932cdfc0a322 100644 --- a/lib/client/mcp/claude/config.go +++ b/lib/client/mcp/claude/config.go @@ -57,6 +57,18 @@ func DefaultConfigPath() (string, error) { } } +// 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 @@ -239,6 +251,17 @@ func LoadConfigFromDefaultPath() (*FileConfig, error) { 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 diff --git a/tool/tsh/common/help.go b/tool/tsh/common/help.go index 092b78279f238..c7551e3570c81 100644 --- a/tool/tsh/common/help.go +++ b/tool/tsh/common/help.go @@ -85,6 +85,9 @@ Examples: 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` @@ -96,6 +99,9 @@ Examples: 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/mcp.go b/tool/tsh/common/mcp.go index a24c0b2cb2bc0..54b7cb99aa619 100644 --- a/tool/tsh/common/mcp.go +++ b/tool/tsh/common/mcp.go @@ -58,14 +58,16 @@ type mcpClientConfigFlags struct { 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, or specify a JSON file path. Can also be set with environment variable %s.", + "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). @@ -92,6 +94,8 @@ 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) } @@ -107,9 +111,7 @@ func (m *mcpClientConfigFlags) jsonFormatOptions() []string { } func (m *mcpClientConfigFlags) printHint(w io.Writer) error { - _, err := fmt.Fprintln(w, `Tip: use --client-config=claude to update your Claude Desktop configuration. -You can also specify a custom config path with --client-config= to update -a config file compatible with the "mcpServer" mapping.`) + _, err := fmt.Fprintln(w, mcpConfigHint) return trace.Wrap(err) } @@ -149,3 +151,11 @@ func getLoggingOptsForMCPServer(cf *CLIConf) 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` From a0b3af284a25bcbfb07040824131dfdde92522b7 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Wed, 25 Jun 2025 12:59:45 -0400 Subject: [PATCH 18/21] mcputils refactor and new mcptest package (#56010) * mcp server and mcputils refactor * mcptest package * allow testing in mcptest --- .golangci.yml | 4 + integration/appaccess/mcp_test.go | 18 +-- lib/srv/mcp/session.go | 30 ++++ lib/srv/mcp/stdio.go | 59 +++----- lib/srv/mcp/stdio_test.go | 59 ++------ lib/utils/mcptest/test.go | 97 +++++++++++++ lib/utils/mcputils/reader.go | 219 ++++++++++++++++++++++++++++++ lib/utils/mcputils/stdio.go | 180 ++++-------------------- lib/utils/mcputils/stdio_test.go | 56 ++------ lib/utils/mcputils/writer.go | 52 +++++++ 10 files changed, 472 insertions(+), 302 deletions(-) create mode 100644 lib/utils/mcptest/test.go create mode 100644 lib/utils/mcputils/reader.go create mode 100644 lib/utils/mcputils/writer.go diff --git a/.golangci.yml b/.golangci.yml index c0c1e0c7ccaac..76d2fe3ddc305 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 @@ -207,6 +209,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' @@ -267,6 +270,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/integration/appaccess/mcp_test.go b/integration/appaccess/mcp_test.go index f1e45479d8114..edf1efc6b3438 100644 --- a/integration/appaccess/mcp_test.go +++ b/integration/appaccess/mcp_test.go @@ -19,17 +19,14 @@ package appaccess import ( - "bytes" "context" - "io" "testing" - mcpclient "github.com/mark3labs/mcp-go/client" - "github.com/mark3labs/mcp-go/client/transport" "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) { @@ -56,18 +53,9 @@ func testMCPDialStdio(t *testing.T, pack *Pack) { require.NoError(t, err) ctx := context.Background() - clientTransport := transport.NewIO(serverConn, serverConn, io.NopCloser(bytes.NewReader(nil))) - stdioClient := mcpclient.NewClient(clientTransport) - defer stdioClient.Close() - require.NoError(t, stdioClient.Start(ctx)) + stdioClient := mcptest.NewStdioClientFromConn(t, serverConn) - initReq := mcp.InitializeRequest{} - initReq.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION - initReq.Params.ClientInfo = mcp.Implementation{ - Name: "test-client", - Version: "1.0.0", - } - _, err = stdioClient.Initialize(ctx, initReq) + _, err = mcptest.InitializeClient(ctx, stdioClient) require.NoError(t, err) listTools, err := stdioClient.ListTools(ctx, mcp.ListToolsRequest{}) diff --git a/lib/srv/mcp/session.go b/lib/srv/mcp/session.go index 58cd199fc2a31..f136056fb2a87 100644 --- a/lib/srv/mcp/session.go +++ b/lib/srv/mcp/session.go @@ -174,6 +174,36 @@ func (s *sessionHandler) processClientNotification(ctx context.Context, notifica 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 ( diff --git a/lib/srv/mcp/stdio.go b/lib/srv/mcp/stdio.go index e6e48fab7c514..368e3aab2d2ff 100644 --- a/lib/srv/mcp/stdio.go +++ b/lib/srv/mcp/stdio.go @@ -33,7 +33,6 @@ import ( "github.com/gravitational/trace" "github.com/mark3labs/mcp-go/mcp" - "github.com/gravitational/teleport/lib/utils" hostutils "github.com/gravitational/teleport/lib/utils/host" "github.com/gravitational/teleport/lib/utils/mcputils" ) @@ -47,10 +46,10 @@ func (s *Server) handleAuthErrStdio(ctx context.Context, clientConn net.Conn, au 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.NewStdioMessageReader(mcputils.StdioMessageReaderConfig{ - SourceReadCloser: clientConn, - Logger: logger, - ParentContext: s.cfg.ParentContext, + 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. @@ -104,46 +103,32 @@ func (s *Server) handleStdio(ctx context.Context, sessionCtx SessionCtx, makeSer return trace.Wrap(err) } - clientResponseWriter := mcputils.NewStdioMessageWriter(utils.NewSyncWriter(sessionCtx.ClientConn)) - serverRequestWriter := mcputils.NewStdioMessageWriter(utils.NewSyncWriter(writeToServer)) + clientResponseWriter := mcputils.NewSyncStdioMessageWriter(sessionCtx.ClientConn) + serverRequestWriter := mcputils.NewSyncStdioMessageWriter(writeToServer) - clientRequestReader, err := mcputils.NewStdioMessageReader(mcputils.StdioMessageReaderConfig{ - SourceReadCloser: sessionCtx.ClientConn, - Logger: session.logger.With("stdio", "stdin"), - ParentContext: s.cfg.ParentContext, + 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: func(ctx context.Context, req *mcputils.JSONRPCRequest) error { - msg, replyDirection := session.processClientRequest(ctx, req) - if replyDirection == replyToClient { - return trace.Wrap(clientResponseWriter.WriteMessage(ctx, msg)) - } - return trace.Wrap(serverRequestWriter.WriteMessage(ctx, msg)) - }, - OnNotification: func(ctx context.Context, notification *mcputils.JSONRPCNotification) error { - session.processClientNotification(ctx, notification) - return trace.Wrap(serverRequestWriter.WriteMessage(ctx, notification)) - }, + 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.NewStdioMessageReader(mcputils.StdioMessageReaderConfig{ - SourceReadCloser: readFromServer, - Logger: stdoutLogger, - ParentContext: s.cfg.ParentContext, - OnClose: serverRunner.close, - OnParseError: mcputils.LogAndIgnoreParseError(stdoutLogger), - OnNotification: func(ctx context.Context, notification *mcputils.JSONRPCNotification) error { - return trace.Wrap(clientResponseWriter.WriteMessage(ctx, notification)) - }, - OnResponse: func(ctx context.Context, response *mcputils.JSONRPCResponse) error { - msgToClient := session.processServerResponse(ctx, response) - return trace.Wrap(clientResponseWriter.WriteMessage(ctx, msgToClient)) - }, + 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) diff --git a/lib/srv/mcp/stdio_test.go b/lib/srv/mcp/stdio_test.go index 730856323afcd..302f0b0b393df 100644 --- a/lib/srv/mcp/stdio_test.go +++ b/lib/srv/mcp/stdio_test.go @@ -19,20 +19,15 @@ package mcp import ( - "bytes" "context" "io" "log/slog" - "net" "os" "path" "testing" "time" "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/assert" "github.com/stretchr/testify/require" @@ -41,6 +36,7 @@ import ( 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" "github.com/gravitational/teleport/lib/utils/mcputils" ) @@ -64,8 +60,8 @@ func Test_handleAuthErrStdio(t *testing.T) { require.ErrorIs(t, handlerErr, originalAuthErr) }() - stdioClient := makeStdioClient(t, clientSourceConn) - _, err = initializeStdioClient(ctx, stdioClient) + stdioClient := mcptest.NewStdioClientFromConn(t, clientSourceConn) + _, err = mcptest.InitializeClient(ctx, stdioClient) require.EqualError(t, err, originalAuthErr.Error()) select { @@ -97,24 +93,17 @@ func Test_handleStdio(t *testing.T) { }() // Use a real client. Verify session start and end events. - stdioClient := makeStdioClient(t, testCtx.clientSourceConn) + 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") - resp, err := initializeStdioClient(ctx, stdioClient) + resp, err := mcptest.InitializeClient(ctx, stdioClient) require.NoError(t, err) require.Equal(t, "test-server", resp.ServerInfo.Name) - callToolRequest := mcp.CallToolRequest{} - callToolRequest.Params.Name = "hello-server" - callToolResult, err := stdioClient.CallTool(ctx, callToolRequest) - require.NoError(t, err) - require.NotNil(t, callToolResult) - require.Equal(t, []mcp.Content{ - mcp.NewTextContent("hello client"), - }, callToolResult.Content) + mcptest.MustCallServerTool(t, ctx, stdioClient) // Now close the client. stdioClient.Close() @@ -161,15 +150,7 @@ func (s *mockStdioServerRunner) getStdoutPipe() (io.ReadCloser, error) { func (s *mockStdioServerRunner) run(ctx context.Context) error { slog.DebugContext(ctx, "running mock stdio server") - server := mcpserver.NewMCPServer("test-server", "1.0.0") - server.AddTool(mcp.Tool{ - Name: "hello-server", - }, func(context.Context, mcp.CallToolRequest) (*mcp.CallToolResult, error) { - return &mcp.CallToolResult{ - Content: []mcp.Content{mcp.NewTextContent("hello client")}, - }, nil - }) - err := mcpserver.NewStdioServer(server).Listen(ctx, s.serverStdin, s.serverStdout) + err := mcpserver.NewStdioServer(mcptest.NewServer()).Listen(ctx, s.serverStdin, s.serverStdout) if err != nil && !mcputils.IsOKCloseError(err) { return trace.Wrap(err) } @@ -182,28 +163,6 @@ func (s *mockStdioServerRunner) close() { } } -func makeStdioClient(t *testing.T, clientSourceConn net.Conn) *mcpclient.Client { - t.Helper() - stdioClientTransport := mcpclienttransport.NewIO(clientSourceConn, clientSourceConn, io.NopCloser(bytes.NewReader(nil))) - stdioClient := mcpclient.NewClient(stdioClientTransport) - t.Cleanup(func() { - stdioClient.Close() - }) - require.NoError(t, stdioClient.Start(t.Context())) - return stdioClient -} - -func initializeStdioClient(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) -} - // 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". @@ -235,12 +194,12 @@ func TestHandleSession_execMCPServer(t *testing.T) { connectAfterHandlerStart := func(t *testing.T, testCtx *testContext, containerName string) { t.Helper() - stdioClient := makeStdioClient(t, testCtx.clientSourceConn) + stdioClient := mcptest.NewStdioClientFromConn(t, testCtx.clientSourceConn) defer stdioClient.Close() reqCtx, reqCancel := context.WithTimeout(t.Context(), time.Second*5) defer reqCancel() - resp, err := initializeStdioClient(reqCtx, stdioClient) + resp, err := mcptest.InitializeClient(reqCtx, stdioClient) require.NoError(t, err) require.Equal(t, "example-servers/everything", resp.ServerInfo.Name) 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/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 index 81972650eb2d8..6a27f598a2b31 100644 --- a/lib/utils/mcputils/stdio.go +++ b/lib/utils/mcputils/stdio.go @@ -30,7 +30,6 @@ import ( "github.com/gravitational/trace" "github.com/mark3labs/mcp-go/mcp" - "github.com/gravitational/teleport" logutils "github.com/gravitational/teleport/lib/utils/log" ) @@ -79,170 +78,37 @@ func (w *StdioMessageWriter) WriteMessage(_ context.Context, resp mcp.JSONRPCMes return trace.Wrap(err) } -// HandleParseErrorFunc handles parse errors. -type HandleParseErrorFunc func(context.Context, *mcp.JSONRPCError) error - -// ReplyParseError returns a HandleParseErrorFunc that forwards the error to -// provided writer. -func ReplyParseError(w *StdioMessageWriter) HandleParseErrorFunc { - return func(ctx context.Context, parseError *mcp.JSONRPCError) error { - return trace.Wrap(w.WriteMessage(ctx, parseError)) - } +// NewSyncStdioMessageWriter returns a MessageWriter using stdio transport, the +// "sync" version. +func NewSyncStdioMessageWriter(w io.Writer) MessageWriter { + return NewSyncMessageWriter(NewStdioMessageWriter(w)) } -// 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 - } +// StdioReader implements TransportReader for stdio transport +type StdioReader struct { + io.Closer + br *bufio.Reader } -// StdioMessageReaderConfig is the config for StdioMessageReader. -type StdioMessageReaderConfig struct { - // SourceReadCloser is the input to the read the message from. - // SourceReadCloser will be closed when reader finishes. - SourceReadCloser io.ReadCloser - // 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 func(context.Context, *JSONRPCRequest) error - // OnResponse specifies the handler for handling response. Any error by the - // handler stops this message reader. - OnResponse func(context.Context, *JSONRPCResponse) error - // OnNotification specifies the handler for handling notification. Any error - // returned by the handler stops this message reader. - OnNotification func(context.Context, *JSONRPCNotification) error -} - -// CheckAndSetDefaults checks values and sets defaults. -func (c *StdioMessageReaderConfig) CheckAndSetDefaults() error { - if c.SourceReadCloser == nil { - return trace.BadParameter("missing parameter SourceReadCloser") - } - 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") +// 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), } - if c.ParentContext == nil { - return trace.BadParameter("missing parameter ParentContext") - } - if c.Logger == nil { - c.Logger = slog.With(teleport.ComponentKey, "mcp") - } - return nil -} - -// StdioMessageReader reads requests from provided reader. -type StdioMessageReader struct { - cfg StdioMessageReaderConfig } -// NewStdioMessageReader creates a new StdioMessageReader. Must call "Start" to -// start the processing. -func NewStdioMessageReader(cfg StdioMessageReaderConfig) (*StdioMessageReader, error) { - if err := cfg.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } - return &StdioMessageReader{ - 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 *StdioMessageReader) Run(ctx context.Context) { - r.cfg.Logger.InfoContext(ctx, "Start processing stdio messages") - - 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 stdio messages") - if err := r.cfg.SourceReadCloser.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 *StdioMessageReader) startProcess(ctx context.Context) { - lineReader := bufio.NewReader(r.cfg.SourceReadCloser) - for { - if ctx.Err() != nil { - return - } - - if err := r.processNextLine(ctx, lineReader); err != nil { - if !IsOKCloseError(err) { - r.cfg.Logger.ErrorContext(ctx, "Failed to process line", "error", err) - } - return - } - } -} - -func (r *StdioMessageReader) processNextLine(ctx context.Context, lineReader *bufio.Reader) error { - line, err := lineReader.ReadString('\n') +// 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, "reading line") - } - - r.cfg.Logger.Log(ctx, logutils.TraceLevel, "Trace stdio", "line", line) - - var base baseJSONRPCMessage - if parseError := json.Unmarshal([]byte(line), &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") - } + return "", trace.Wrap(err) } + return line, nil +} - 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", line) - return trace.Wrap( - r.cfg.OnParseError(ctx, &rpcError), - "handling unknown message type error", - ) - } +// 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 index 491f8298a7da2..a7546c296bde7 100644 --- a/lib/utils/mcputils/stdio_test.go +++ b/lib/utils/mcputils/stdio_test.go @@ -19,7 +19,6 @@ package mcputils import ( - "bytes" "context" "io" "log" @@ -29,15 +28,14 @@ import ( "time" "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/assert" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/utils/mcptest" ) -// TestStdioHelpers tests StdioMessageReader and StdioMessageWriter by +// TestStdioHelpers tests MessageReader and StdioMessageWriter by // implementing a passthrough reverse proxy. // // The flow looks something like this: @@ -71,9 +69,9 @@ func TestStdioHelpers(t *testing.T) { clientMessageWriter := NewStdioMessageWriter(writeToClient) serverMessageWriter := NewStdioMessageWriter(writeToServer) - clientMessageReader, err := NewStdioMessageReader(StdioMessageReaderConfig{ - ParentContext: context.Background(), - SourceReadCloser: readFromClient, + 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)) @@ -91,9 +89,9 @@ func TestStdioHelpers(t *testing.T) { close(clientMessageReaderClosed) }() - serverMessageReader, err := NewStdioMessageReader(StdioMessageReaderConfig{ - ParentContext: context.Background(), - SourceReadCloser: readFromServer, + 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)) @@ -114,36 +112,20 @@ func TestStdioHelpers(t *testing.T) { // Make "high-level" MCP client and server with stdio transport as the two // ends. - stdioClientTransport := mcpclienttransport.NewIO(clientStdin, clientStdout, io.NopCloser(bytes.NewReader(nil))) - stdioClient := mcpclient.NewClient(stdioClientTransport) - defer stdioClient.Close() - require.NoError(t, stdioClient.Start(ctx)) + stdioClient := mcptest.NewStdioClient(t, clientStdin, clientStdout) - stdioServer := mcpserver.NewStdioServer(makeTestMCPServer()) + 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) { - initReq := mcp.InitializeRequest{} - initReq.Params.ProtocolVersion = mcp.LATEST_PROTOCOL_VERSION - initReq.Params.ClientInfo = mcp.Implementation{ - Name: "test-client", - Version: "1.0.0", - } - _, err = stdioClient.Initialize(ctx, initReq) + _, err := mcptest.InitializeClient(ctx, stdioClient) require.NoError(t, err) }) t.Run("client call tool", func(t *testing.T) { - callToolRequest := mcp.CallToolRequest{} - callToolRequest.Params.Name = "hello-server" - callToolResult, err := stdioClient.CallTool(ctx, callToolRequest) - require.NoError(t, err) - require.NotNil(t, callToolResult) - require.Equal(t, []mcp.Content{ - mcp.NewTextContent("hello client"), - }, callToolResult.Content) + mcptest.MustCallServerTool(t, ctx, stdioClient) }) t.Run("reader closed by closing stdin", func(t *testing.T) { @@ -176,15 +158,3 @@ func TestStdioHelpers(t *testing.T) { assert.Equal(t, int32(2), atomic.LoadInt32(&readServerResponses)) }) } - -func makeTestMCPServer() *mcpserver.MCPServer { - server := mcpserver.NewMCPServer("test-server", "1.0.0") - 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 -} 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) +} From d001231388ec39df352b7d25f3764dc011ff9957 Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Tue, 15 Jul 2025 09:16:43 -0400 Subject: [PATCH 19/21] Teleport MCP demo server (#56637) * Teleport MCP demo server * replace guide tool with session tool, and switch to resource label * add new flag to teleport configure * replace teleport_session_id with mcp_transport_type --- api/types/app.go | 4 + api/types/app_test.go | 28 +++ api/types/constants.go | 7 +- integration/appaccess/appaccess_test.go | 3 - integration/appaccess/mcp_test.go | 6 +- integration/appaccess/pack.go | 25 ++- lib/config/configuration.go | 19 +- lib/config/configuration_test.go | 23 ++- lib/config/fileconf.go | 32 ++-- lib/config/fileconf_test.go | 43 +++++ lib/service/service.go | 10 +- lib/service/servicecfg/app.go | 3 + lib/srv/app/connections_handler.go | 12 +- lib/srv/mcp/demo.go | 219 ++++++++++++++++++++++++ lib/srv/mcp/helpers_test.go | 6 + lib/srv/mcp/memory.go | 106 ------------ lib/srv/mcp/server.go | 11 +- lib/srv/mcp/stdio_test.go | 75 +++----- tool/teleport/common/teleport.go | 2 + tool/teleport/common/usage.go | 8 +- 20 files changed, 428 insertions(+), 214 deletions(-) create mode 100644 lib/srv/mcp/demo.go delete mode 100644 lib/srv/mcp/memory.go diff --git a/api/types/app.go b/api/types/app.go index ae87481431006..0ddf8512f988f 100644 --- a/api/types/app.go +++ b/api/types/app.go @@ -525,6 +525,10 @@ func (a *AppV3) checkMCP() error { } 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()) } diff --git a/api/types/app_test.go b/api/types/app_test.go index afb494f376082..3d47af4ad11b4 100644 --- a/api/types/app_test.go +++ b/api/types/app_test.go @@ -658,6 +658,34 @@ func TestNewAppV3(t *testing.T) { }, 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) { diff --git a/api/types/constants.go b/api/types/constants.go index d3c469b68dce8..b935d5a563db9 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -1134,10 +1134,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/integration/appaccess/appaccess_test.go b/integration/appaccess/appaccess_test.go index 7f1cf582e7df9..748aa91a2b05b 100644 --- a/integration/appaccess/appaccess_test.go +++ b/integration/appaccess/appaccess_test.go @@ -48,7 +48,6 @@ import ( "github.com/gravitational/teleport/lib/service" "github.com/gravitational/teleport/lib/service/servicecfg" "github.com/gravitational/teleport/lib/srv/app/common" - libmcp "github.com/gravitational/teleport/lib/srv/mcp" "github.com/gravitational/teleport/lib/utils" "github.com/gravitational/teleport/lib/web/app" ) @@ -58,8 +57,6 @@ import ( // It allows to make the entire cluster set up once, instead of per test, // which speeds things up significantly. func TestAppAccess(t *testing.T) { - t.Setenv(libmcp.InMemoryServerEnvVar, "true") - pack := Setup(t) t.Run("Forward", bind(pack, testForward)) diff --git a/integration/appaccess/mcp_test.go b/integration/appaccess/mcp_test.go index edf1efc6b3438..782927e207bd8 100644 --- a/integration/appaccess/mcp_test.go +++ b/integration/appaccess/mcp_test.go @@ -34,7 +34,7 @@ func testMCP(pack *Pack, t *testing.T) { testMCPDialStdioNoServerFound(t, pack) }) - t.Run("DialMCPSererver stdio success", func(t *testing.T) { + t.Run("DialMCPServer stdio success", func(t *testing.T) { testMCPDialStdio(t, pack) }) } @@ -49,7 +49,7 @@ func testMCPDialStdioNoServerFound(t *testing.T, pack *Pack) { func testMCPDialStdio(t *testing.T, pack *Pack) { require.NoError(t, pack.tc.SaveProfile(false)) - serverConn, err := pack.tc.DialMCPServer(context.Background(), libmcp.InMemoryServerName) + serverConn, err := pack.tc.DialMCPServer(context.Background(), libmcp.DemoServerName) require.NoError(t, err) ctx := context.Background() @@ -60,5 +60,5 @@ func testMCPDialStdio(t *testing.T, pack *Pack) { listTools, err := stdioClient.ListTools(ctx, mcp.ListToolsRequest{}) require.NoError(t, err) - require.Len(t, listTools.Tools, 2) + require.Len(t, listTools.Tools, 3) } diff --git a/integration/appaccess/pack.go b/integration/appaccess/pack.go index 5a223695f5d13..941c43fb1bed9 100644 --- a/integration/appaccess/pack.go +++ b/integration/appaccess/pack.go @@ -29,7 +29,7 @@ import ( "net" "net/http" "net/url" - "os" + "slices" "testing" "time" @@ -58,8 +58,8 @@ import ( "github.com/gravitational/teleport/lib/srv/alpnproxy" alpncommon "github.com/gravitational/teleport/lib/srv/alpnproxy/common" "github.com/gravitational/teleport/lib/srv/app/common" - libmcp "github.com/gravitational/teleport/lib/srv/mcp" "github.com/gravitational/teleport/lib/utils" + 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" @@ -772,6 +772,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{ @@ -1064,12 +1065,6 @@ func (p *Pack) startLeafAppServers(t *testing.T, count int, opts AppTestOptions) } func waitForAppRegInRemoteSiteCache(t *testing.T, tunnel reversetunnelclient.Server, clusterName string, cfgApps []servicecfg.App, hostUUID string) { - if os.Getenv(libmcp.InMemoryServerEnvVar) == "true" { - cfgApps = append(cfgApps, servicecfg.App{ - Name: libmcp.InMemoryServerName, - }) - } - require.EventuallyWithT(t, func(t *assert.CollectT) { site, err := tunnel.GetSite(clusterName) assert.NoError(t, err) @@ -1080,12 +1075,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/lib/config/configuration.go b/lib/config/configuration.go index d32a00463fa00..8f34c5931ba90 100644 --- a/lib/config/configuration.go +++ b/lib/config/configuration.go @@ -144,6 +144,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. @@ -1907,6 +1910,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 != "" { @@ -2383,7 +2389,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") @@ -2391,14 +2397,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") } @@ -2406,6 +2412,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 3ea7cab3b1682..be6d58f389253 100644 --- a/lib/config/configuration_test.go +++ b/lib/config/configuration_test.go @@ -2572,7 +2572,10 @@ func TestAppsCLF(t *testing.T) { inAppURI string inAppCloud string inLegacyAppFlags bool + inMCPDemoServer bool + outApps []servicecfg.App + outMCPDemoServer bool requireError require.ErrorAssertionFunc }{ { @@ -2707,20 +2710,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 94539f466ab8c..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"` diff --git a/lib/config/fileconf_test.go b/lib/config/fileconf_test.go index b6cc274be0aa4..16d5f3073affe 100644 --- a/lib/config/fileconf_test.go +++ b/lib/config/fileconf_test.go @@ -1286,6 +1286,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/service/service.go b/lib/service/service.go index 9f1e7cade53d0..05c5c3c80c59c 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -6047,6 +6047,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 } @@ -6184,11 +6185,11 @@ func (process *TeleportProcess) initApps() { applications = append(applications, a) } - if os.Getenv(mcp.InMemoryServerEnvVar) == "true" { - if mcpInMemoryServer, err := mcp.NewInMemoryServerApp(); err != nil { - logger.ErrorContext(process.ExitContext(), "Failed to create in-memory MCP server app") + 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, mcpInMemoryServer) + applications = append(applications, mcpDemoServer) } } @@ -6261,6 +6262,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/servicecfg/app.go b/lib/service/servicecfg/app.go index 7688d16a35fcf..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 diff --git a/lib/srv/app/connections_handler.go b/lib/srv/app/connections_handler.go index 73d986b59e536..db08a3df40015 100644 --- a/lib/srv/app/connections_handler.go +++ b/lib/srv/app/connections_handler.go @@ -114,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. @@ -277,10 +280,11 @@ func NewConnectionsHandler(closeContext context.Context, cfg *ConnectionsHandler // 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, + 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) 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 index 95e4b4e91688e..4511a2c91a060 100644 --- a/lib/srv/mcp/helpers_test.go +++ b/lib/srv/mcp/helpers_test.go @@ -284,6 +284,12 @@ func checkToolsListResponse(t *testing.T, response mcp.JSONRPCMessage, wantID mc 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) diff --git a/lib/srv/mcp/memory.go b/lib/srv/mcp/memory.go deleted file mode 100644 index 288190ff20c4f..0000000000000 --- a/lib/srv/mcp/memory.go +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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" - mcpserver "github.com/mark3labs/mcp-go/server" - - "github.com/gravitational/teleport/api/types" -) - -const ( - // InMemoryServerEnvVar enables an in-memory MCP server for testing - // purposes. The test app enables a stdio MCP server that has a - // "teleport-hello-test" tool and a "teleport-echo-test" tool. - InMemoryServerEnvVar = "TELEPORT_UNSTABLE_MCP_IN_MEMORY_SERVER" - - // InMemoryServerName is the name of the in-memory MCP server. - InMemoryServerName = "teleport-mcp-test-server" -) - -// NewInMemoryServerApp returns the app definition for the in-memory test server. -func NewInMemoryServerApp() (types.Application, error) { - app, err := types.NewAppV3(types.Metadata{ - Name: InMemoryServerName, - Labels: map[string]string{ - types.TeleportInternalLabelPrefix + "mcp-in-memory-server": "true", - }, - }, types.AppSpecV3{ - MCP: &types.MCP{ - Command: "in-memory-server", - RunAsHostUser: "in-memory-server", - }, - }) - return app, trace.Wrap(err) -} - -func isInMemoryServerApp(app types.Application) bool { - value, ok := app.GetLabel(types.TeleportInternalLabelPrefix + "mcp-in-memory-server") - return ok && value == "true" -} - -func (s *Server) handleInMemoryServerSession(ctx context.Context, sessionCtx SessionCtx) error { - s.cfg.Log.DebugContext(ctx, "Started in-memory server session") - defer s.cfg.Log.DebugContext(ctx, "Completed in-memory server session") - - session, err := s.makeSessionHandler(ctx, sessionCtx) - if err != nil { - return trace.Wrap(err) - } - session.emitStartEvent(s.cfg.ParentContext) - defer session.emitEndEvent(s.cfg.ParentContext) - - // TODO(greedy52) audit log notification and requests. - server := mcpserver.NewMCPServer("hello-test-server", "1.0.0") - stdioServer := mcpserver.NewStdioServer(server) - stdioServer.SetErrorLogger(slog.NewLogLogger(s.cfg.Log.Handler(), slog.LevelDebug)) - - helloTool := mcp.NewTool("teleport-hello-test", - mcp.WithDescription("this is simple hello test and it always return \"hello client\""), - ) - if session.checkAccessToTool(ctx, helloTool.GetName()) == nil { - server.AddTool(helloTool, func(context.Context, mcp.CallToolRequest) (*mcp.CallToolResult, error) { - return &mcp.CallToolResult{ - Content: []mcp.Content{mcp.NewTextContent("hello client")}, - }, nil - }) - } - - echoTool := mcp.NewTool("teleport-echo-test", - mcp.WithDescription("this is simple echo and it always return the input back"), - mcp.WithString("input", mcp.Required(), mcp.Description("input for echo")), - ) - if session.checkAccessToTool(ctx, echoTool.GetName()) == nil { - server.AddTool(echoTool, func(_ context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { - input, err := request.RequireString("input") - if err != nil { - return nil, trace.Wrap(err) - } - return &mcp.CallToolResult{ - Content: []mcp.Content{mcp.NewTextContent(input)}, - }, nil - }) - } - return stdioServer.Listen(ctx, sessionCtx.ClientConn, sessionCtx.ClientConn) -} diff --git a/lib/srv/mcp/server.go b/lib/srv/mcp/server.go index ea9fe2b3ac086..d43ff21113065 100644 --- a/lib/srv/mcp/server.go +++ b/lib/srv/mcp/server.go @@ -22,7 +22,6 @@ import ( "context" "log/slog" "net" - "os" "time" "github.com/gravitational/trace" @@ -54,9 +53,10 @@ type ServerConfig struct { 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 - inMemoryServer bool + clock clockwork.Clock } // CheckAndSetDefaults checks values and sets defaults @@ -79,7 +79,6 @@ func (c *ServerConfig) CheckAndSetDefaults() error { if c.clock == nil { c.clock = clockwork.NewRealClock() } - c.inMemoryServer = os.Getenv(InMemoryServerEnvVar) == "true" return nil } @@ -104,8 +103,8 @@ func (s *Server) HandleSession(ctx context.Context, sessionCtx SessionCtx) error if err := sessionCtx.checkAndSetDefaults(); err != nil { return trace.Wrap(err) } - if s.cfg.inMemoryServer && isInMemoryServerApp(sessionCtx.App) { - return trace.Wrap(s.handleInMemoryServerSession(ctx, sessionCtx)) + if s.cfg.EnableDemoServer && isDemoServerApp(sessionCtx.App) { + return trace.Wrap(s.handleStdio(ctx, sessionCtx, makeDemoServerRunner)) } return trace.Wrap(s.handleStdio(ctx, sessionCtx, makeExecServerRunner)) } diff --git a/lib/srv/mcp/stdio_test.go b/lib/srv/mcp/stdio_test.go index 302f0b0b393df..19a9078fdf7e7 100644 --- a/lib/srv/mcp/stdio_test.go +++ b/lib/srv/mcp/stdio_test.go @@ -20,15 +20,13 @@ package mcp import ( "context" - "io" - "log/slog" "os" "path" "testing" "time" "github.com/gravitational/trace" - mcpserver "github.com/mark3labs/mcp-go/server" + "github.com/mark3labs/mcp-go/mcp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -37,7 +35,6 @@ import ( "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/events/eventstest" "github.com/gravitational/teleport/lib/utils/mcptest" - "github.com/gravitational/teleport/lib/utils/mcputils" ) func Test_handleAuthErrStdio(t *testing.T) { @@ -86,8 +83,8 @@ func Test_handleStdio(t *testing.T) { handlerDoneCh := make(chan struct{}, 1) defer close(handlerDoneCh) go func() { - // Use mock server. - handlerErr := s.handleStdio(ctx, *testCtx.SessionCtx, makeMockMCPServerRunner) + // Use the demo server. + handlerErr := s.handleStdio(ctx, *testCtx.SessionCtx, makeDemoServerRunner) handlerDoneCh <- struct{}{} require.NoError(t, handlerErr) }() @@ -99,11 +96,27 @@ func Test_handleStdio(t *testing.T) { _, 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, "test-server", resp.ServerInfo.Name) + require.Equal(t, "teleport-demo", resp.ServerInfo.Name) - mcptest.MustCallServerTool(t, ctx, stdioClient) + 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() @@ -117,52 +130,6 @@ func Test_handleStdio(t *testing.T) { require.True(t, ok) } -func makeMockMCPServerRunner(context.Context, *sessionHandler) (stdioServerRunner, error) { - serverStdin, writeToServer := io.Pipe() - readFromServer, serverStdout := io.Pipe() - return &mockStdioServerRunner{ - serverStdin: serverStdin, - serverStdout: serverStdout, - writeToServer: writeToServer, - readFromServer: readFromServer, - pipeClosers: []io.Closer{ - serverStdin, writeToServer, - readFromServer, serverStdout, - }, - }, nil -} - -type mockStdioServerRunner struct { - serverStdin io.ReadCloser - serverStdout io.WriteCloser - writeToServer io.WriteCloser - readFromServer io.ReadCloser - pipeClosers []io.Closer -} - -func (s *mockStdioServerRunner) getStdinPipe() (io.WriteCloser, error) { - return s.writeToServer, nil -} - -func (s *mockStdioServerRunner) getStdoutPipe() (io.ReadCloser, error) { - return s.readFromServer, nil -} - -func (s *mockStdioServerRunner) run(ctx context.Context) error { - slog.DebugContext(ctx, "running mock stdio server") - err := mcpserver.NewStdioServer(mcptest.NewServer()).Listen(ctx, s.serverStdin, s.serverStdout) - if err != nil && !mcputils.IsOKCloseError(err) { - return trace.Wrap(err) - } - return nil -} - -func (s *mockStdioServerRunner) close() { - for _, pipeCloser := range s.pipeClosers { - pipeCloser.Close() - } -} - // 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". diff --git a/tool/teleport/common/teleport.go b/tool/teleport/common/teleport.go index f9ea531ae929e..1f0cc0bca7f60 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 @@ -432,6 +433,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 \ From 02b010f12cdedab2475859d471ee582a998b775f Mon Sep 17 00:00:00 2001 From: Gabriel Corado Date: Mon, 21 Jul 2025 12:43:11 -0300 Subject: [PATCH 20/21] feat(gomod): update mcp-go to v0.32.0 --- go.mod | 2 +- go.sum | 4 ++-- integrations/terraform-mwi/go.mod | 2 +- integrations/terraform-mwi/go.sum | 4 ++-- integrations/terraform/go.mod | 2 +- integrations/terraform/go.sum | 4 ++-- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 2cac63bc63af8..f749d5ace83fa 100644 --- a/go.mod +++ b/go.mod @@ -163,7 +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.30.1 + 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 diff --git a/go.sum b/go.sum index 96b86cda9e8b3..2c571bc70f61e 100644 --- a/go.sum +++ b/go.sum @@ -1801,8 +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.30.1 h1:3R1BPvNT/rC1iPpLx+EMXFy+gvux/Mz/Nio3c6XEU9E= -github.com/mark3labs/mcp-go v0.30.1/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= +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= diff --git a/integrations/terraform-mwi/go.mod b/integrations/terraform-mwi/go.mod index c163ced5c3cc1..784237951728e 100644 --- a/integrations/terraform-mwi/go.mod +++ b/integrations/terraform-mwi/go.mod @@ -337,7 +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.30.1 // 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 diff --git a/integrations/terraform-mwi/go.sum b/integrations/terraform-mwi/go.sum index 196f3984e2294..b1f2c966bc487 100644 --- a/integrations/terraform-mwi/go.sum +++ b/integrations/terraform-mwi/go.sum @@ -970,8 +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.30.1 h1:3R1BPvNT/rC1iPpLx+EMXFy+gvux/Mz/Nio3c6XEU9E= -github.com/mark3labs/mcp-go v0.30.1/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= +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= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index fe91d9ed2b238..94ddd2f7cdd90 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -335,7 +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.30.1 // 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 diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 806461c0ead75..58126dc6b2448 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -1093,8 +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.30.1 h1:3R1BPvNT/rC1iPpLx+EMXFy+gvux/Mz/Nio3c6XEU9E= -github.com/mark3labs/mcp-go v0.30.1/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= +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= From 7b76cc54ad4ed0f3d49ac68327fc99337060e63b Mon Sep 17 00:00:00 2001 From: "STeve (Xin) Huang" Date: Mon, 21 Jul 2025 16:22:03 -0400 Subject: [PATCH 21/21] eslint-disable-next-line (same in master) --- web/packages/shared/components/UnifiedResources/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/web/packages/shared/components/UnifiedResources/types.ts b/web/packages/shared/components/UnifiedResources/types.ts index 24ad1abbe351c..e2bcc8a9b4030 100644 --- a/web/packages/shared/components/UnifiedResources/types.ts +++ b/web/packages/shared/components/UnifiedResources/types.ts @@ -25,6 +25,7 @@ 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 { AppMCP, PermissionSet } from 'teleport/services/apps'; // "mixed" indicates the resource has a mix of health