From a3dd69d87ce845b073c7bb3c6884463f11be01ff Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Tue, 20 Aug 2024 00:50:35 -0400 Subject: [PATCH 01/15] Add cluster autoupdate resources with enabled cache and --- api/client/client.go | 18 + api/client/proto/authservice.pb.go | 1926 ++++++------- api/client/webclient/webclient.go | 4 + .../legacy/client/proto/authservice.proto | 6 + api/proto/teleport/legacy/types/types.proto | 46 + api/types/autoupdate_config.go | 134 + api/types/autoupdate_version.go | 138 + api/types/constants.go | 12 + api/types/types.pb.go | 2459 +++++++++++------ lib/auth/accesspoint/accesspoint.go | 2 + lib/auth/auth.go | 5 + lib/auth/authclient/api.go | 6 + lib/auth/authclient/clt.go | 39 + lib/auth/grpcserver.go | 31 +- lib/auth/init.go | 3 + lib/authz/permissions.go | 2 + lib/cache/cache.go | 54 + lib/cache/collections.go | 88 +- lib/service/service.go | 3 + lib/service/servicecfg/config.go | 3 + lib/services/autoupdates.go | 153 + lib/services/local/autoupdate.go | 138 + lib/services/local/configuration.go | 3 + lib/services/local/events.go | 70 + lib/web/apiserver.go | 22 +- 25 files changed, 3636 insertions(+), 1729 deletions(-) create mode 100644 api/types/autoupdate_config.go create mode 100644 api/types/autoupdate_version.go create mode 100644 lib/services/autoupdates.go create mode 100644 lib/services/local/autoupdate.go diff --git a/api/client/client.go b/api/client/client.go index 0036f57058b6e..2a35c0a261426 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -2844,6 +2844,24 @@ func (c *Client) GetClusterAuditConfig(ctx context.Context) (types.ClusterAuditC return resp, nil } +// GetClusterAutoUpdateConfig gets cluster autoupdate configuration. +func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context) (types.ClusterAutoUpdateConfig, error) { + resp, err := c.grpc.GetClusterAutoUpdateConfig(ctx, &emptypb.Empty{}) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// GetAutoUpdateVersion gets cluster autoupdate version. +func (c *Client) GetAutoUpdateVersion(ctx context.Context) (types.AutoUpdateVersion, error) { + resp, err := c.grpc.GetAutoUpdateVersion(ctx, &emptypb.Empty{}) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + // GetClusterAccessGraphConfig retrieves the Cluster Access Graph configuration from Auth server. func (c *Client) GetClusterAccessGraphConfig(ctx context.Context) (*clusterconfigpb.AccessGraphConfig, error) { rsp, err := c.ClusterConfigClient().GetClusterAccessGraphConfig(ctx, &clusterconfigpb.GetClusterAccessGraphConfigRequest{}) diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 7a22ab12f0961..641119c5ebace 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -15611,935 +15611,937 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 14844 bytes of a gzipped FileDescriptorProto + // 14879 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x8c, 0x1c, 0x49, 0x76, 0x18, 0xda, 0x55, 0xfd, 0x3e, 0xfd, 0x60, 0x31, 0xba, 0x9b, 0x5d, 0x6c, 0x3e, 0x8a, 0x4c, 0xce, 0x83, 0xc3, 0x9d, 0xe5, 0xa3, 0x39, 0x33, 0x3b, 0xaf, 0x9d, 0x99, 0xea, 0x07, 0xd9, 0x4d, 0xf6, 0x6b, 0xb2, 0xba, 0x9b, 0x33, 0xb3, 0xa3, 0xad, 0xcd, 0xae, 0x0a, 0x76, 0xa7, 0x58, 0x9d, 0x59, 0x9b, 0x99, 0x45, 0x0e, 0x57, 0x57, 0xba, 0xd0, 0xea, 0x5e, 0x5c, 0xfd, 0xdc, 0x7b, 0x25, - 0xc0, 0x32, 0x64, 0xe8, 0x43, 0x36, 0x60, 0x01, 0x86, 0x01, 0x1b, 0xfa, 0x11, 0xf4, 0x63, 0x7f, - 0xf8, 0xcb, 0x6b, 0x01, 0x82, 0x6d, 0x48, 0xfa, 0xf1, 0x47, 0xcb, 0x5e, 0xc0, 0x3f, 0x0d, 0xfb, - 0x43, 0x30, 0x6c, 0xc0, 0x0b, 0x08, 0x30, 0xe2, 0xc4, 0x23, 0x23, 0xf2, 0x51, 0xd5, 0x4d, 0x72, - 0x56, 0xfe, 0x21, 0xbb, 0x4e, 0x9c, 0x73, 0x22, 0xe2, 0x44, 0x64, 0xc4, 0x89, 0x13, 0x27, 0xce, - 0x81, 0x9b, 0x11, 0x6d, 0xd1, 0xb6, 0x1f, 0x44, 0xb7, 0x5a, 0x74, 0xdf, 0x69, 0x3c, 0xbf, 0xd5, - 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0xb5, 0x03, 0x3f, 0xf2, 0x6f, 0x39, 0x9d, 0xe8, 0x20, 0xa4, 0xc1, - 0x53, 0xb7, 0x41, 0x6f, 0x22, 0x84, 0x0c, 0xe2, 0x7f, 0x73, 0xd3, 0xfb, 0xfe, 0xbe, 0xcf, 0x71, - 0xd8, 0x5f, 0xbc, 0x70, 0xee, 0xc2, 0xbe, 0xef, 0xef, 0xb7, 0x28, 0x27, 0xde, 0xeb, 0x3c, 0xbe, - 0x45, 0x0f, 0xdb, 0xd1, 0x73, 0x51, 0x58, 0x49, 0x16, 0x46, 0xee, 0x21, 0x0d, 0x23, 0xe7, 0xb0, - 0x2d, 0x10, 0xde, 0x52, 0x4d, 0x71, 0xa2, 0x88, 0x95, 0x44, 0xae, 0xef, 0xdd, 0x7a, 0x7a, 0x47, - 0xff, 0x29, 0x50, 0xaf, 0x77, 0x6d, 0x75, 0x83, 0x06, 0x51, 0x78, 0x22, 0x4c, 0xfa, 0x94, 0x7a, - 0x51, 0xaa, 0x7a, 0x81, 0x19, 0x3d, 0x6f, 0xd3, 0x90, 0xa3, 0xc8, 0xff, 0x04, 0xea, 0xd5, 0x6c, - 0x54, 0xfc, 0x57, 0xa0, 0x7c, 0x37, 0x1b, 0xe5, 0x19, 0xdd, 0x63, 0x32, 0xf5, 0xd4, 0x1f, 0x3d, - 0xd0, 0x03, 0xa7, 0xdd, 0xa6, 0x41, 0xfc, 0x87, 0x40, 0x3f, 0xaf, 0xd0, 0x0f, 0x1f, 0x3b, 0x4c, - 0x44, 0x87, 0x8f, 0x9d, 0x54, 0x37, 0x3a, 0xa1, 0xb3, 0x4f, 0x45, 0xf3, 0x9f, 0xde, 0xd1, 0x7f, - 0x72, 0x54, 0xeb, 0x0f, 0x0b, 0x30, 0xf8, 0xc8, 0x89, 0x1a, 0x07, 0xe4, 0x53, 0x18, 0x7c, 0xe8, - 0x7a, 0xcd, 0xb0, 0x5c, 0xb8, 0xd2, 0x7f, 0x7d, 0x6c, 0xbe, 0x74, 0x93, 0x77, 0x05, 0x0b, 0x59, - 0xc1, 0xc2, 0xec, 0xcf, 0x8e, 0x2a, 0x7d, 0xc7, 0x47, 0x95, 0x33, 0x4f, 0x18, 0xda, 0xdb, 0xfe, - 0xa1, 0x1b, 0xe1, 0xd8, 0xda, 0x9c, 0x8e, 0xec, 0xc0, 0x54, 0xb5, 0xd5, 0xf2, 0x9f, 0x6d, 0x39, - 0x41, 0xe4, 0x3a, 0xad, 0x5a, 0xa7, 0xd1, 0xa0, 0x61, 0x58, 0x2e, 0x5e, 0x29, 0x5c, 0x1f, 0x59, - 0xb8, 0x76, 0x7c, 0x54, 0xa9, 0x38, 0xac, 0xb8, 0xde, 0xe6, 0xe5, 0xf5, 0x90, 0x23, 0x68, 0x8c, - 0xb2, 0xe8, 0xad, 0x3f, 0x1b, 0x82, 0xd2, 0x8a, 0x1f, 0x46, 0x8b, 0x6c, 0x44, 0x6d, 0xfa, 0xe3, - 0x0e, 0x0d, 0x23, 0x72, 0x0d, 0x86, 0x18, 0x6c, 0x75, 0xa9, 0x5c, 0xb8, 0x52, 0xb8, 0x3e, 0xba, - 0x30, 0x76, 0x7c, 0x54, 0x19, 0x3e, 0xf0, 0xc3, 0xa8, 0xee, 0x36, 0x6d, 0x51, 0x44, 0xde, 0x82, - 0x91, 0x0d, 0xbf, 0x49, 0x37, 0x9c, 0x43, 0x8a, 0xad, 0x18, 0x5d, 0x98, 0x38, 0x3e, 0xaa, 0x8c, - 0x7a, 0x7e, 0x93, 0xd6, 0x3d, 0xe7, 0x90, 0xda, 0xaa, 0x98, 0xec, 0xc2, 0x80, 0xed, 0xb7, 0x68, - 0xb9, 0x1f, 0xd1, 0x16, 0x8e, 0x8f, 0x2a, 0x03, 0x81, 0xdf, 0xa2, 0xbf, 0x38, 0xaa, 0xbc, 0xb7, - 0xef, 0x46, 0x07, 0x9d, 0xbd, 0x9b, 0x0d, 0xff, 0xf0, 0xd6, 0x7e, 0xe0, 0x3c, 0x75, 0xf9, 0x24, - 0x74, 0x5a, 0xb7, 0xe2, 0xa9, 0xda, 0x76, 0xc5, 0xb8, 0xd7, 0x9e, 0x87, 0x11, 0x3d, 0x64, 0x9c, - 0x6c, 0xe4, 0x47, 0x1e, 0xc1, 0x74, 0xb5, 0xd9, 0x74, 0x39, 0xc5, 0x56, 0xe0, 0x7a, 0x0d, 0xb7, - 0xed, 0xb4, 0xc2, 0xf2, 0xc0, 0x95, 0xfe, 0xeb, 0xa3, 0x42, 0x28, 0xaa, 0xbc, 0xde, 0x56, 0x08, - 0x9a, 0x50, 0x32, 0x19, 0x90, 0xbb, 0x30, 0xb2, 0xb4, 0x51, 0x63, 0x6d, 0x0f, 0xcb, 0x83, 0xc8, - 0x6c, 0xf6, 0xf8, 0xa8, 0x32, 0xd5, 0xf4, 0x42, 0xec, 0x9a, 0xce, 0x40, 0x21, 0x92, 0xf7, 0x60, - 0x7c, 0xab, 0xb3, 0xd7, 0x72, 0x1b, 0xdb, 0x6b, 0xb5, 0x87, 0xf4, 0x79, 0x79, 0xe8, 0x4a, 0xe1, - 0xfa, 0xf8, 0x02, 0x39, 0x3e, 0xaa, 0x4c, 0xb6, 0x11, 0x5e, 0x8f, 0x5a, 0x61, 0xfd, 0x09, 0x7d, - 0x6e, 0x1b, 0x78, 0x31, 0x5d, 0xad, 0xb6, 0xc2, 0xe8, 0x86, 0x53, 0x74, 0x61, 0x78, 0xa0, 0xd3, - 0x71, 0x3c, 0x72, 0x0b, 0xc0, 0xa6, 0x87, 0x7e, 0x44, 0xab, 0xcd, 0x66, 0x50, 0x1e, 0x41, 0xd9, - 0x9e, 0x39, 0x3e, 0xaa, 0x8c, 0x05, 0x08, 0xad, 0x3b, 0xcd, 0x66, 0x60, 0x6b, 0x28, 0x64, 0x11, - 0x46, 0x6c, 0x9f, 0x0b, 0xb8, 0x3c, 0x7a, 0xa5, 0x70, 0x7d, 0x6c, 0xfe, 0x8c, 0x98, 0x86, 0x12, - 0xbc, 0x70, 0xee, 0xf8, 0xa8, 0x42, 0x02, 0xf1, 0x4b, 0xef, 0xa5, 0xc4, 0x20, 0x15, 0x18, 0xde, - 0xf0, 0x17, 0x9d, 0xc6, 0x01, 0x2d, 0x03, 0xce, 0xbd, 0xc1, 0xe3, 0xa3, 0x4a, 0xe1, 0xbb, 0xb6, - 0x84, 0x92, 0xa7, 0x30, 0x16, 0x0f, 0x54, 0x58, 0x1e, 0x43, 0xf1, 0x6d, 0x1f, 0x1f, 0x55, 0xce, - 0x85, 0x08, 0xae, 0xb3, 0xa1, 0xd7, 0x24, 0xf8, 0x12, 0xb3, 0x40, 0xaf, 0x88, 0x7c, 0x0d, 0x33, - 0xf1, 0xcf, 0x6a, 0x18, 0xd2, 0x80, 0xf1, 0x58, 0x5d, 0x2a, 0x4f, 0xa0, 0x64, 0xde, 0x38, 0x3e, - 0xaa, 0x58, 0x5a, 0x0b, 0xea, 0x8e, 0x44, 0xa9, 0xbb, 0x4d, 0xad, 0xa7, 0xd9, 0x4c, 0x1e, 0x0c, - 0x8c, 0x8c, 0x97, 0x26, 0xec, 0x4b, 0x3b, 0x5e, 0x18, 0x39, 0x7b, 0x2d, 0x9a, 0x89, 0x64, 0xfd, - 0x6d, 0x01, 0xc8, 0x66, 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0xfb, 0x9e, 0xe4, 0xe7, 0xf4, 0x36, 0x8c, - 0xf2, 0x81, 0x63, 0xa3, 0x5b, 0xc4, 0xd1, 0x9d, 0x3c, 0x3e, 0xaa, 0x80, 0x18, 0x5d, 0x36, 0xb2, - 0x31, 0x02, 0x79, 0x1d, 0xfa, 0xb7, 0xb7, 0xd7, 0xf0, 0x5b, 0xe9, 0x5f, 0x98, 0x3a, 0x3e, 0xaa, - 0xf4, 0x47, 0x51, 0xeb, 0x17, 0x47, 0x95, 0x91, 0xa5, 0x4e, 0x80, 0x62, 0xb1, 0x59, 0x39, 0x79, - 0x1d, 0x86, 0x17, 0x5b, 0x9d, 0x30, 0xa2, 0x41, 0x79, 0x20, 0xfe, 0x48, 0x1b, 0x1c, 0x64, 0xcb, - 0x32, 0xf2, 0x1d, 0x18, 0xd8, 0x09, 0x69, 0x50, 0x1e, 0xc4, 0xf1, 0x9e, 0x10, 0xe3, 0xcd, 0x40, - 0xbb, 0xf3, 0x0b, 0x23, 0xec, 0x4b, 0xec, 0x84, 0x34, 0xb0, 0x11, 0x89, 0xdc, 0x84, 0x41, 0x3e, - 0x68, 0x43, 0xb8, 0x48, 0x4d, 0xa8, 0xd9, 0xd1, 0xa2, 0xbb, 0xef, 0x2d, 0x8c, 0x1e, 0x1f, 0x55, - 0x06, 0x71, 0xf0, 0x6c, 0x8e, 0xf6, 0x60, 0x60, 0xa4, 0x50, 0x2a, 0xda, 0x23, 0x8c, 0x96, 0x7d, - 0x16, 0xd6, 0x77, 0x60, 0x4c, 0xeb, 0x3e, 0xb9, 0x08, 0x03, 0xec, 0x7f, 0x5c, 0x44, 0xc6, 0x79, - 0x65, 0x6c, 0xe3, 0xb0, 0x11, 0x6a, 0xfd, 0xc3, 0x29, 0x28, 0x31, 0x4a, 0x63, 0xe5, 0xb9, 0xa9, - 0x8b, 0x8a, 0xd3, 0x95, 0x4c, 0x51, 0x95, 0x0b, 0xba, 0xb0, 0xae, 0x83, 0xaa, 0x5d, 0x2c, 0x42, - 0xe3, 0xc7, 0x47, 0x95, 0x91, 0x8e, 0x80, 0xc5, 0x6d, 0x23, 0x35, 0x18, 0x5e, 0xfe, 0xa6, 0xed, - 0x06, 0x34, 0x44, 0xd1, 0x8e, 0xcd, 0xcf, 0xdd, 0xe4, 0xdb, 0xe5, 0x4d, 0xb9, 0x5d, 0xde, 0xdc, - 0x96, 0xdb, 0xe5, 0xc2, 0x25, 0xb1, 0x18, 0x9f, 0xa5, 0x9c, 0x24, 0x9e, 0x1f, 0xbf, 0xf3, 0xd7, - 0x95, 0x82, 0x2d, 0x39, 0x91, 0xb7, 0x61, 0xe8, 0x9e, 0x1f, 0x1c, 0x3a, 0x91, 0x18, 0x83, 0xe9, - 0xe3, 0xa3, 0x4a, 0xe9, 0x31, 0x42, 0xb4, 0x29, 0x25, 0x70, 0xc8, 0x3d, 0x98, 0xb4, 0xfd, 0x4e, - 0x44, 0xb7, 0x7d, 0x39, 0x72, 0x83, 0x48, 0x75, 0xf9, 0xf8, 0xa8, 0x32, 0x17, 0xb0, 0x92, 0x7a, - 0xe4, 0xd7, 0xc5, 0x10, 0x6a, 0xf4, 0x09, 0x2a, 0xb2, 0x0c, 0x93, 0x55, 0x5c, 0xbd, 0x85, 0xd4, - 0xf8, 0x78, 0x8d, 0x2e, 0x5c, 0x3a, 0x3e, 0xaa, 0x9c, 0x77, 0xb0, 0xa4, 0x1e, 0x88, 0x22, 0x9d, - 0x8d, 0x49, 0x44, 0x36, 0xe0, 0xec, 0xc3, 0xce, 0x1e, 0x0d, 0x3c, 0x1a, 0xd1, 0x50, 0xb6, 0x68, - 0x18, 0x5b, 0x74, 0xe5, 0xf8, 0xa8, 0x72, 0xf1, 0x89, 0x2a, 0xcc, 0x68, 0x53, 0x9a, 0x94, 0x50, - 0x38, 0x23, 0x1a, 0xba, 0xe4, 0x44, 0xce, 0x9e, 0x13, 0x52, 0x5c, 0x94, 0xc6, 0xe6, 0xcf, 0x71, - 0x11, 0xdf, 0x4c, 0x94, 0x2e, 0x5c, 0x13, 0x52, 0xbe, 0xa0, 0xfa, 0xde, 0x14, 0x45, 0x5a, 0x45, - 0x49, 0x9e, 0x6c, 0x6d, 0x56, 0xfb, 0xce, 0x28, 0xb6, 0x16, 0xd7, 0x66, 0xb5, 0xef, 0xe8, 0xab, - 0x96, 0xda, 0x81, 0xd6, 0x60, 0x70, 0x87, 0xed, 0xce, 0xb8, 0x66, 0x4d, 0xce, 0x5f, 0x15, 0x2d, - 0x4a, 0xce, 0xbf, 0x9b, 0xec, 0x07, 0x22, 0xe2, 0x97, 0x77, 0x06, 0x77, 0x74, 0x7d, 0x2f, 0xc6, - 0x32, 0xf2, 0x39, 0x80, 0x68, 0x55, 0xb5, 0xdd, 0x2e, 0x8f, 0x61, 0x27, 0xcf, 0x9a, 0x9d, 0xac, - 0xb6, 0xdb, 0x0b, 0x97, 0x45, 0xff, 0xce, 0xa9, 0xfe, 0x39, 0xed, 0xb6, 0xc6, 0x4d, 0x63, 0x42, - 0x3e, 0x85, 0x71, 0x5c, 0xd2, 0xe4, 0x88, 0x8e, 0xe3, 0x88, 0x5e, 0x38, 0x3e, 0xaa, 0xcc, 0xe2, - 0x6a, 0x95, 0x31, 0x9e, 0x06, 0x01, 0xf9, 0x0d, 0x98, 0x11, 0xec, 0x1e, 0xb9, 0x5e, 0xd3, 0x7f, - 0x16, 0x2e, 0xd1, 0xf0, 0x49, 0xe4, 0xb7, 0x71, 0xf9, 0x1b, 0x9b, 0xbf, 0x68, 0x36, 0xcf, 0xc4, - 0x59, 0xb8, 0x21, 0x5a, 0x6a, 0xa9, 0x96, 0x3e, 0xe3, 0x08, 0xf5, 0x26, 0xc7, 0xd0, 0x17, 0xc8, - 0x4c, 0x16, 0x64, 0x15, 0xce, 0xec, 0x84, 0xd4, 0xe8, 0xc3, 0x24, 0xee, 0x0f, 0x15, 0x36, 0xc2, - 0x9d, 0x90, 0xd6, 0xf3, 0xfa, 0x91, 0xa4, 0x23, 0x36, 0x90, 0xa5, 0xc0, 0x6f, 0x27, 0xe6, 0xf8, - 0x19, 0x94, 0x88, 0x75, 0x7c, 0x54, 0xb9, 0xdc, 0x0c, 0xfc, 0x76, 0x3d, 0x7f, 0xa2, 0x67, 0x50, - 0x93, 0x1f, 0xc2, 0xb9, 0x45, 0xdf, 0xf3, 0x68, 0x83, 0xad, 0xa0, 0x4b, 0xae, 0xb3, 0xef, 0xf9, - 0x61, 0xe4, 0x36, 0x56, 0x97, 0xca, 0xa5, 0x78, 0x7b, 0x68, 0x28, 0x8c, 0x7a, 0x53, 0xa1, 0x98, - 0xdb, 0x43, 0x0e, 0x17, 0xf2, 0x03, 0x98, 0x10, 0x75, 0xd1, 0x00, 0xa7, 0xe6, 0xd9, 0xee, 0x13, - 0x4d, 0x21, 0xf3, 0x8d, 0x3e, 0x90, 0x3f, 0xb9, 0xea, 0x64, 0xf2, 0x22, 0x5f, 0xc3, 0xd8, 0xfa, - 0xbd, 0xaa, 0x4d, 0xc3, 0xb6, 0xef, 0x85, 0xb4, 0x4c, 0x70, 0x44, 0x2f, 0x0b, 0xd6, 0xeb, 0xf7, - 0xaa, 0xd5, 0x4e, 0x74, 0x40, 0xbd, 0xc8, 0x6d, 0x38, 0x11, 0x95, 0x58, 0x0b, 0x73, 0x6c, 0xe6, - 0x1d, 0x3e, 0x76, 0xea, 0x81, 0x80, 0x68, 0xbd, 0xd0, 0xd9, 0x91, 0x39, 0x18, 0xa9, 0xd5, 0x56, - 0xd6, 0xfc, 0x7d, 0xd7, 0x2b, 0x4f, 0x31, 0x61, 0xd8, 0xea, 0x37, 0x79, 0x0c, 0x33, 0xda, 0xd9, - 0xa0, 0xce, 0xfe, 0xa7, 0x87, 0xd4, 0x8b, 0xca, 0xd3, 0xd8, 0x86, 0xef, 0xaa, 0xc3, 0xcd, 0x4d, - 0xfd, 0x08, 0xf1, 0xf4, 0xce, 0xcd, 0x6a, 0xfc, 0xb3, 0x26, 0x89, 0x16, 0x8a, 0xe5, 0x82, 0x3d, - 0xed, 0x64, 0x94, 0x90, 0x6d, 0x18, 0xde, 0xea, 0x04, 0x6d, 0x3f, 0xa4, 0xe5, 0x19, 0x14, 0xdc, - 0xb5, 0x6e, 0x5f, 0xa8, 0x40, 0x5d, 0x98, 0x61, 0x4b, 0x74, 0x9b, 0xff, 0xd0, 0x7a, 0x27, 0x59, - 0x91, 0xcf, 0x60, 0xbc, 0x56, 0x5b, 0x89, 0x37, 0x94, 0x73, 0xb8, 0xa1, 0x5c, 0x3c, 0x3e, 0xaa, - 0x94, 0x99, 0x4a, 0x15, 0x6f, 0x2a, 0xfa, 0x57, 0xa5, 0x53, 0x30, 0x0e, 0xdb, 0x6b, 0xb5, 0x98, - 0xc3, 0x6c, 0xcc, 0x81, 0x29, 0x73, 0xd9, 0x1c, 0x74, 0x0a, 0xf2, 0xcf, 0x0a, 0x70, 0x45, 0x67, - 0x99, 0x25, 0x98, 0xf2, 0xf9, 0x17, 0x91, 0xe6, 0xfc, 0xf1, 0x51, 0xe5, 0xa6, 0xd9, 0x8f, 0x7a, - 0xe6, 0x60, 0x69, 0x6d, 0xeb, 0xd9, 0x14, 0x6c, 0xaf, 0xde, 0x81, 0xcc, 0xf6, 0xce, 0xbd, 0x70, - 0x7b, 0x4d, 0xa9, 0xf5, 0x6e, 0x6f, 0xaf, 0xa6, 0x58, 0x5f, 0xc0, 0xa8, 0x5a, 0xb4, 0xc9, 0x30, - 0xf4, 0x57, 0x5b, 0xad, 0x52, 0x1f, 0xfb, 0xa3, 0x56, 0x5b, 0x29, 0x15, 0xc8, 0x24, 0x40, 0xbc, - 0x53, 0x95, 0x8a, 0x64, 0x1c, 0x46, 0xe4, 0x4e, 0x52, 0xea, 0x47, 0xfc, 0x76, 0xbb, 0x34, 0x40, - 0x08, 0x4c, 0x9a, 0xeb, 0x59, 0x69, 0xd0, 0xfa, 0xdd, 0x02, 0x8c, 0xaa, 0xef, 0x90, 0x9c, 0x81, - 0xb1, 0x9d, 0x8d, 0xda, 0xd6, 0xf2, 0xe2, 0xea, 0xbd, 0xd5, 0xe5, 0xa5, 0x52, 0x1f, 0xb9, 0x04, - 0xe7, 0xb7, 0x6b, 0x2b, 0xf5, 0xa5, 0x85, 0xfa, 0xda, 0xe6, 0x62, 0x75, 0xad, 0xbe, 0x65, 0x6f, - 0x7e, 0xf1, 0x65, 0x7d, 0x7b, 0x67, 0x63, 0x63, 0x79, 0xad, 0x54, 0x20, 0x65, 0x98, 0x66, 0xc5, - 0x0f, 0x77, 0x16, 0x96, 0x75, 0x84, 0x52, 0x91, 0x5c, 0x85, 0x4b, 0x59, 0x25, 0xf5, 0x95, 0xe5, - 0xea, 0xd2, 0xda, 0x72, 0xad, 0x56, 0xea, 0x27, 0xb3, 0x30, 0xc5, 0x50, 0xaa, 0x5b, 0x5b, 0x06, - 0xed, 0x80, 0xd5, 0x82, 0x31, 0xed, 0x03, 0x20, 0x17, 0xa1, 0xbc, 0xb8, 0x6c, 0x6f, 0xd7, 0xb7, - 0x76, 0xec, 0xad, 0xcd, 0xda, 0x72, 0xdd, 0x6c, 0x61, 0xb2, 0x74, 0x6d, 0xf3, 0xfe, 0xea, 0x46, - 0x9d, 0x81, 0x6a, 0xa5, 0x02, 0x6b, 0x86, 0x51, 0x5a, 0x5b, 0xdd, 0xb8, 0xbf, 0xb6, 0x5c, 0xdf, - 0xa9, 0x2d, 0x0b, 0x94, 0xa2, 0xf5, 0xd3, 0x62, 0x6a, 0x4b, 0x27, 0xf3, 0x30, 0x56, 0xe3, 0xf6, - 0x0a, 0x5c, 0xe6, 0xf8, 0x01, 0x91, 0xe9, 0x68, 0xe3, 0xc2, 0x8c, 0xc1, 0x57, 0x30, 0x1d, 0x89, - 0x69, 0x69, 0x5b, 0xec, 0x6b, 0x6e, 0xf8, 0x2d, 0x5d, 0x4b, 0x6b, 0x0b, 0x98, 0xad, 0x4a, 0xc9, - 0xbc, 0xa6, 0xcf, 0xf1, 0xd3, 0x22, 0x9e, 0x48, 0xa4, 0x3e, 0xa7, 0xef, 0xed, 0x4a, 0xb3, 0x9b, - 0x8f, 0x87, 0x54, 0xa8, 0x61, 0x48, 0x93, 0xa1, 0x4b, 0x28, 0x3c, 0xf2, 0x96, 0xd4, 0x74, 0xf9, - 0xe9, 0x0e, 0x37, 0xfb, 0xc4, 0xb9, 0x44, 0x28, 0xb9, 0x56, 0x27, 0x67, 0x63, 0x25, 0x1f, 0x25, - 0xe7, 0x8c, 0x10, 0x06, 0x32, 0x4b, 0xec, 0x9f, 0x76, 0x02, 0x95, 0x54, 0x60, 0x90, 0xaf, 0xb8, - 0x5c, 0x1e, 0xa8, 0x5b, 0xb7, 0x18, 0xc0, 0xe6, 0x70, 0xeb, 0x4f, 0xfa, 0x75, 0x25, 0x83, 0xe9, - 0xd2, 0x9a, 0xbc, 0x51, 0x97, 0x46, 0x39, 0x23, 0x94, 0xa9, 0xcd, 0x35, 0x1a, 0x86, 0xfc, 0xbc, - 0x53, 0x54, 0x43, 0x02, 0x21, 0x07, 0xd6, 0xdd, 0x26, 0x53, 0x9b, 0x15, 0x0a, 0x3b, 0x3a, 0xf2, - 0xaf, 0x0a, 0x8f, 0x8e, 0xfd, 0xf1, 0xd1, 0x51, 0x7c, 0x9a, 0xfc, 0xe8, 0x18, 0xa3, 0xb0, 0x51, - 0x17, 0x6a, 0x1e, 0xb6, 0x62, 0x20, 0x1e, 0x75, 0xa1, 0x1a, 0x8a, 0x51, 0xd7, 0x90, 0xc8, 0x87, - 0x00, 0xd5, 0x47, 0x35, 0x3c, 0x23, 0xd9, 0x1b, 0x42, 0xd5, 0xc5, 0x4d, 0xc9, 0x79, 0x16, 0x8a, - 0x23, 0x58, 0xa0, 0x9f, 0x31, 0x35, 0x6c, 0xb2, 0x00, 0x13, 0xd5, 0x9f, 0x74, 0x02, 0xba, 0xda, - 0x64, 0xfb, 0x5a, 0xc4, 0x0f, 0xd3, 0xa3, 0x7c, 0xe1, 0x75, 0x58, 0x41, 0xdd, 0x15, 0x25, 0x1a, - 0x03, 0x93, 0x84, 0x6c, 0xc2, 0xd9, 0xfb, 0x8b, 0x5b, 0x62, 0x1e, 0x56, 0x1b, 0x0d, 0xbf, 0xe3, - 0x45, 0x42, 0xbf, 0xbd, 0x7a, 0x7c, 0x54, 0xb9, 0xb4, 0xdf, 0x68, 0xd7, 0xe5, 0x9c, 0x75, 0x78, - 0xb1, 0xae, 0xe0, 0xa6, 0x68, 0xc9, 0x35, 0xe8, 0xdf, 0xb1, 0x57, 0xc5, 0x49, 0xfb, 0xec, 0xf1, - 0x51, 0x65, 0xa2, 0x13, 0xb8, 0x1a, 0x09, 0x2b, 0xb5, 0x5a, 0x30, 0x79, 0x9f, 0x46, 0x6c, 0x72, - 0xca, 0x33, 0x4d, 0xf7, 0xa1, 0xfb, 0x18, 0xc6, 0x1e, 0xb9, 0xd1, 0x41, 0x8d, 0x36, 0x02, 0x1a, - 0x49, 0x7b, 0x0e, 0x8a, 0xe9, 0x99, 0x1b, 0x1d, 0xd4, 0x43, 0x0e, 0xd7, 0xf7, 0x6e, 0x0d, 0xdd, - 0x5a, 0x86, 0x33, 0xa2, 0x36, 0x75, 0x84, 0x9a, 0x37, 0x19, 0x16, 0x90, 0x21, 0x0e, 0x95, 0xce, - 0xd0, 0x64, 0xf3, 0x27, 0x45, 0x98, 0x59, 0x3c, 0x70, 0xbc, 0x7d, 0xba, 0xe5, 0x84, 0xe1, 0x33, - 0x3f, 0x68, 0x6a, 0x8d, 0xc7, 0xf3, 0x63, 0xaa, 0xf1, 0x78, 0x60, 0x9c, 0x87, 0xb1, 0xcd, 0x56, - 0x53, 0xd2, 0x88, 0xb3, 0x2d, 0xd6, 0xe5, 0xb7, 0x9a, 0xf5, 0xb6, 0xe4, 0xa5, 0x23, 0x31, 0x9a, - 0x0d, 0xfa, 0x4c, 0xd1, 0xf4, 0xc7, 0x34, 0x1e, 0x7d, 0xa6, 0xd1, 0x68, 0x48, 0x64, 0x19, 0xce, - 0xd6, 0x68, 0xc3, 0xf7, 0x9a, 0xf7, 0x9c, 0x46, 0xe4, 0x07, 0xdb, 0xfe, 0x13, 0xea, 0x89, 0x49, - 0x88, 0xca, 0x7f, 0x88, 0x85, 0xf5, 0xc7, 0x58, 0x5a, 0x8f, 0x58, 0xb1, 0x9d, 0xa6, 0x20, 0x9b, - 0x30, 0xf2, 0x48, 0x58, 0x05, 0xc5, 0x81, 0xf8, 0xf5, 0x9b, 0xca, 0x4c, 0xb8, 0x18, 0x50, 0x9c, - 0x39, 0x4e, 0x4b, 0x1d, 0xe9, 0x95, 0x2e, 0x85, 0xcb, 0x95, 0xc4, 0xb4, 0x15, 0x13, 0x6b, 0x07, - 0x26, 0xb6, 0x5a, 0x9d, 0x7d, 0xd7, 0x63, 0x0b, 0x4b, 0x8d, 0xfe, 0x98, 0x2c, 0x01, 0xc4, 0x00, - 0x61, 0xeb, 0x9b, 0x12, 0xc7, 0xe8, 0xb8, 0x60, 0xf7, 0xae, 0xf8, 0xda, 0x10, 0x82, 0xa7, 0x1e, - 0x5b, 0xa3, 0xb3, 0xfe, 0x67, 0x3f, 0x10, 0x31, 0x00, 0xb8, 0xd1, 0xd5, 0x68, 0xc4, 0xb6, 0xa0, - 0x73, 0x50, 0x54, 0x26, 0xb9, 0xa1, 0xe3, 0xa3, 0x4a, 0xd1, 0x6d, 0xda, 0xc5, 0xd5, 0x25, 0xf2, - 0x0e, 0x0c, 0x22, 0x1a, 0xca, 0x7f, 0x52, 0xd5, 0xa7, 0x73, 0xe0, 0x0b, 0x0c, 0xee, 0xb0, 0x36, - 0x47, 0x26, 0xef, 0xc2, 0xe8, 0x12, 0x6d, 0xd1, 0x7d, 0x27, 0xf2, 0xe5, 0x12, 0xc0, 0x8d, 0x5c, - 0x12, 0xa8, 0xcd, 0xb9, 0x18, 0x93, 0x1d, 0x79, 0x6d, 0xea, 0x84, 0xbe, 0xa7, 0x1f, 0x79, 0x03, - 0x84, 0xe8, 0x47, 0x5e, 0x8e, 0x43, 0x7e, 0xaf, 0x00, 0x63, 0x55, 0xcf, 0x13, 0xc6, 0xa3, 0x50, - 0x48, 0x7d, 0xe6, 0xa6, 0xb2, 0xb6, 0xae, 0x39, 0x7b, 0xb4, 0xb5, 0xeb, 0xb4, 0x3a, 0x34, 0x5c, - 0xf8, 0x9a, 0x9d, 0x42, 0xfe, 0xc3, 0x51, 0xe5, 0xa3, 0x53, 0x98, 0x83, 0x62, 0xbb, 0xed, 0x76, - 0xe0, 0xb8, 0x51, 0x78, 0x7c, 0x54, 0x99, 0x71, 0xe2, 0x0a, 0xf5, 0xef, 0x46, 0x6b, 0x47, 0xbc, - 0xfe, 0x0f, 0xf5, 0x5a, 0xff, 0xc9, 0x21, 0x9c, 0xa9, 0x86, 0x61, 0xe7, 0x90, 0xd6, 0x22, 0x27, - 0x88, 0xb6, 0xdd, 0x43, 0x8a, 0x8b, 0x48, 0x77, 0x03, 0xc2, 0x9b, 0x3f, 0x3b, 0xaa, 0x14, 0xd8, - 0xc1, 0xc7, 0x41, 0x52, 0xa6, 0xdb, 0x04, 0x51, 0x3d, 0x72, 0xf5, 0x2d, 0x0c, 0x4d, 0x09, 0x49, - 0xde, 0xd6, 0x35, 0xa5, 0x74, 0xac, 0x2e, 0xe5, 0x8d, 0xb8, 0xb5, 0x08, 0x17, 0xef, 0xd3, 0xc8, - 0xa6, 0x21, 0x8d, 0xe4, 0x37, 0x82, 0x33, 0x3c, 0x36, 0xe0, 0x0e, 0xe3, 0x6f, 0x45, 0x8c, 0xc3, - 0xcf, 0xbf, 0x0b, 0x59, 0x62, 0xfd, 0x5f, 0x05, 0xa8, 0x2c, 0x06, 0x94, 0x9f, 0x19, 0x72, 0x18, - 0x75, 0x5f, 0xbb, 0x2e, 0xc2, 0xc0, 0xf6, 0xf3, 0xb6, 0xb4, 0xbc, 0x60, 0x29, 0x1b, 0x14, 0x1b, - 0xa1, 0x27, 0x34, 0x64, 0x59, 0x8f, 0x61, 0xc6, 0xa6, 0x1e, 0x7d, 0xe6, 0xec, 0xb5, 0xa8, 0x61, - 0x0b, 0xaa, 0xc0, 0x20, 0xff, 0xd0, 0x53, 0x5d, 0xe0, 0xf0, 0xd3, 0xd9, 0xd5, 0xac, 0x09, 0x18, - 0xdb, 0x72, 0xbd, 0x7d, 0xc1, 0xdd, 0xfa, 0xe3, 0x7e, 0x18, 0xe7, 0xbf, 0xc5, 0x31, 0x28, 0xb1, - 0xc5, 0x15, 0x4e, 0xb2, 0xc5, 0xbd, 0x0f, 0x13, 0x6c, 0x8f, 0xa0, 0xc1, 0x2e, 0x0d, 0xd8, 0xd6, - 0x2a, 0x24, 0x81, 0x47, 0xba, 0x10, 0x0b, 0xea, 0x4f, 0x79, 0x89, 0x6d, 0x22, 0x92, 0x35, 0x98, - 0xe4, 0x80, 0x7b, 0xd4, 0x89, 0x3a, 0xb1, 0x55, 0xea, 0x8c, 0x38, 0xf7, 0x48, 0x30, 0x9f, 0x9a, - 0x82, 0xd7, 0x63, 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x53, 0x38, 0xb3, 0x15, 0xf8, 0xdf, 0x3c, 0xd7, - 0x36, 0x75, 0xfe, 0x75, 0xf2, 0x13, 0x12, 0x2b, 0xaa, 0xeb, 0x5b, 0x7b, 0x12, 0x9b, 0xbc, 0x05, - 0x23, 0xab, 0xe1, 0x82, 0x1f, 0xb8, 0xde, 0x3e, 0x7e, 0xa3, 0x23, 0xdc, 0x98, 0xef, 0x86, 0xf5, - 0x3d, 0x04, 0xda, 0xaa, 0x38, 0x61, 0x76, 0x1e, 0xee, 0x6d, 0x76, 0xbe, 0x0d, 0xb0, 0xe6, 0x3b, - 0xcd, 0x6a, 0xab, 0xb5, 0x58, 0x0d, 0x71, 0xf7, 0x14, 0xfb, 0x51, 0xcb, 0x77, 0x9a, 0x75, 0xa7, - 0xd5, 0xaa, 0x37, 0x9c, 0xd0, 0xd6, 0x70, 0x1e, 0x0c, 0x8c, 0x0c, 0x95, 0x86, 0xed, 0x33, 0x6b, - 0x6e, 0x83, 0x7a, 0x21, 0x7d, 0xe4, 0x04, 0x9e, 0xeb, 0xed, 0x87, 0xd6, 0x3f, 0x3f, 0x0b, 0x23, - 0xaa, 0xcb, 0x37, 0x75, 0xc5, 0x5e, 0xec, 0x72, 0x38, 0xfa, 0xb1, 0xd9, 0xca, 0xd6, 0x30, 0xc8, - 0x79, 0x54, 0xf5, 0xc5, 0xfe, 0x3a, 0xcc, 0x66, 0xa3, 0xd3, 0x6e, 0xdb, 0x0c, 0xc6, 0xbe, 0xb2, - 0xa5, 0x05, 0x94, 0xff, 0x08, 0xff, 0xca, 0x9a, 0x7b, 0x76, 0x71, 0x69, 0x81, 0x4d, 0xef, 0xcd, - 0xd5, 0xa5, 0x45, 0x14, 0xe5, 0x08, 0x9f, 0xde, 0xbe, 0xdb, 0x6c, 0xd8, 0x08, 0x65, 0xa5, 0xb5, - 0xea, 0xfa, 0x9a, 0x10, 0x17, 0x96, 0x86, 0xce, 0x61, 0xcb, 0x46, 0x28, 0x53, 0x0e, 0xb9, 0x05, - 0x62, 0xd1, 0xf7, 0xa2, 0xc0, 0x6f, 0x85, 0xa8, 0xc1, 0x8c, 0xf0, 0xe1, 0x14, 0xa6, 0x8b, 0x86, - 0x28, 0xb2, 0x13, 0xa8, 0xe4, 0x11, 0xcc, 0x56, 0x9b, 0x4f, 0x1d, 0xaf, 0x41, 0x9b, 0xbc, 0xe4, - 0x91, 0x1f, 0x3c, 0x79, 0xdc, 0xf2, 0x9f, 0x85, 0x28, 0xef, 0x11, 0x61, 0xe9, 0x13, 0x28, 0xd2, - 0x12, 0xf2, 0x4c, 0x22, 0xd9, 0x79, 0xd4, 0xec, 0x93, 0x5a, 0x6c, 0xf9, 0x9d, 0xa6, 0x18, 0x05, - 0xfc, 0xa4, 0x1a, 0x0c, 0x60, 0x73, 0x38, 0x93, 0xd2, 0x4a, 0x6d, 0x1d, 0xed, 0x6a, 0x42, 0x4a, - 0x07, 0xe1, 0xa1, 0xcd, 0x60, 0xe4, 0x75, 0x18, 0x96, 0x7a, 0x2e, 0x37, 0xfc, 0xa3, 0xc1, 0x59, - 0xea, 0xb7, 0xb2, 0x8c, 0x7d, 0x12, 0x36, 0x6d, 0xf8, 0x4f, 0x69, 0xf0, 0x7c, 0xd1, 0x6f, 0x52, - 0x69, 0x05, 0x12, 0x56, 0x0e, 0x5e, 0x50, 0x6f, 0xb0, 0x12, 0xdb, 0x44, 0x64, 0x15, 0xf0, 0x3d, - 0x30, 0x2c, 0x9f, 0x89, 0x2b, 0xe0, 0x7b, 0x64, 0x68, 0xcb, 0x32, 0xb2, 0x04, 0x67, 0xab, 0x9d, - 0xc8, 0x3f, 0x74, 0x22, 0xb7, 0xb1, 0xd3, 0xde, 0x0f, 0x1c, 0x56, 0x49, 0x09, 0x09, 0x50, 0xef, - 0x77, 0x64, 0x61, 0xbd, 0x23, 0x4a, 0xed, 0x34, 0x01, 0x79, 0x0f, 0xc6, 0x57, 0x43, 0x6e, 0xe9, - 0x73, 0x42, 0xda, 0x44, 0x73, 0x8d, 0x68, 0xa5, 0x1b, 0xd6, 0xd1, 0xee, 0x57, 0x67, 0x27, 0x85, - 0xa6, 0x6d, 0xe0, 0x11, 0x0b, 0x86, 0xaa, 0x61, 0xe8, 0x86, 0x11, 0x5a, 0x61, 0x46, 0x16, 0xe0, - 0xf8, 0xa8, 0x32, 0xe4, 0x20, 0xc4, 0x16, 0x25, 0xe4, 0x11, 0x8c, 0x2d, 0x51, 0xa6, 0x38, 0x6e, - 0x07, 0x9d, 0x30, 0x42, 0x9b, 0xca, 0xd8, 0xfc, 0x79, 0xf1, 0x61, 0x6b, 0x25, 0x62, 0x2e, 0x73, - 0x6d, 0xaf, 0x89, 0xf0, 0x7a, 0xc4, 0x0a, 0xf4, 0x5d, 0x4b, 0xc3, 0x67, 0x5a, 0xb1, 0xa0, 0x59, - 0x71, 0x9b, 0xec, 0x53, 0x9d, 0xc6, 0x36, 0xa0, 0x56, 0x2c, 0xd6, 0x86, 0xfa, 0x01, 0x96, 0xe8, - 0x5a, 0xb1, 0x41, 0x42, 0x1a, 0x29, 0xe3, 0xf1, 0x8c, 0x61, 0x20, 0x34, 0x0b, 0x65, 0x13, 0x4f, - 0x69, 0x5a, 0xfe, 0x18, 0xc6, 0x16, 0x3b, 0x61, 0xe4, 0x1f, 0x6e, 0x1f, 0xd0, 0x43, 0x8a, 0x76, - 0x17, 0xa1, 0xfb, 0x37, 0x10, 0x5c, 0x8f, 0x18, 0x5c, 0xef, 0xa6, 0x86, 0x4e, 0x3e, 0x07, 0x22, - 0x95, 0xf8, 0xfb, 0x6c, 0x7e, 0x78, 0x6c, 0x2e, 0xa3, 0xe9, 0x65, 0x84, 0x6b, 0xee, 0x52, 0xf7, - 0xaf, 0xef, 0xab, 0x62, 0xdd, 0xfc, 0x97, 0x26, 0x66, 0x0d, 0xe2, 0x4d, 0xbc, 0x1f, 0x38, 0xed, - 0x83, 0x72, 0x39, 0xd6, 0xb2, 0x45, 0xa7, 0xf6, 0x19, 0xdc, 0xd0, 0x16, 0x62, 0x74, 0x52, 0x03, - 0xe0, 0x3f, 0xd7, 0xd8, 0xc0, 0x73, 0x63, 0x4d, 0xd9, 0x90, 0x17, 0x2b, 0x90, 0xb2, 0x3a, 0x8f, - 0x3a, 0x08, 0x67, 0xdb, 0x72, 0x8d, 0xd1, 0xd4, 0xd8, 0x90, 0x27, 0x50, 0xe2, 0xbf, 0xd6, 0x7d, - 0xcf, 0x8d, 0xf8, 0xd2, 0x3b, 0x67, 0x58, 0xf6, 0x92, 0xc5, 0xb2, 0x02, 0xb4, 0xa8, 0x8a, 0x0a, - 0x0e, 0x55, 0xa9, 0x56, 0x4d, 0x8a, 0x31, 0xd9, 0x82, 0xb1, 0xad, 0xc0, 0x6f, 0x76, 0x1a, 0x11, - 0x6e, 0xd8, 0x17, 0x50, 0x51, 0x24, 0xa2, 0x1e, 0xad, 0x84, 0xcb, 0xa4, 0xcd, 0x01, 0x75, 0xb6, - 0x99, 0xeb, 0x32, 0xd1, 0x10, 0xc9, 0x02, 0x0c, 0x6d, 0xf9, 0x2d, 0xb7, 0xf1, 0xbc, 0x7c, 0x11, - 0x1b, 0x3d, 0x2d, 0x99, 0x21, 0x50, 0x36, 0x15, 0xb5, 0xc3, 0x36, 0x82, 0x74, 0xed, 0x90, 0x23, - 0x91, 0x2a, 0x4c, 0x7c, 0xce, 0x26, 0x8c, 0xeb, 0x7b, 0x9e, 0xe3, 0x06, 0xb4, 0x7c, 0x09, 0xc7, - 0x05, 0xad, 0xde, 0x3f, 0xd6, 0x0b, 0xf4, 0xe9, 0x6c, 0x50, 0x90, 0x55, 0x38, 0xb3, 0x1a, 0xd6, - 0xa2, 0xc0, 0x6d, 0xd3, 0x75, 0xc7, 0x73, 0xf6, 0x69, 0xb3, 0x7c, 0x39, 0x36, 0x3b, 0xbb, 0x61, - 0x3d, 0xc4, 0xb2, 0xfa, 0x21, 0x2f, 0xd4, 0xcd, 0xce, 0x09, 0x3a, 0xf2, 0x05, 0x4c, 0x2f, 0x7f, - 0x13, 0xb1, 0x19, 0xd3, 0xaa, 0x76, 0x9a, 0x6e, 0x54, 0x8b, 0xfc, 0xc0, 0xd9, 0xa7, 0xe5, 0x0a, - 0xf2, 0x7b, 0xed, 0xf8, 0xa8, 0x72, 0x85, 0x8a, 0xf2, 0xba, 0xc3, 0x10, 0xea, 0x21, 0xc7, 0xd0, - 0xaf, 0x93, 0xb3, 0x38, 0x30, 0xe9, 0xd7, 0x3a, 0x6d, 0xa6, 0xb8, 0xa2, 0xf4, 0xaf, 0x18, 0xd2, - 0xd7, 0x4a, 0xb8, 0xf4, 0x43, 0x0e, 0x48, 0x49, 0x5f, 0x43, 0x24, 0x36, 0x90, 0x07, 0xbe, 0xeb, - 0x55, 0x1b, 0x91, 0xfb, 0x94, 0x8a, 0x73, 0x7d, 0x58, 0xbe, 0x8a, 0x2d, 0x45, 0x13, 0xf9, 0xaf, - 0xfa, 0xae, 0x57, 0x77, 0xb0, 0xb8, 0x2e, 0xac, 0x00, 0x86, 0x89, 0x3c, 0x4d, 0x4d, 0x7e, 0x08, - 0xe7, 0xd6, 0xfd, 0x3d, 0xb7, 0x45, 0xf9, 0x92, 0xc3, 0xc5, 0x82, 0xe6, 0x3e, 0x0b, 0xf9, 0xa2, - 0x89, 0xfc, 0x10, 0x31, 0xea, 0x62, 0xb5, 0x3a, 0x54, 0x38, 0xba, 0x89, 0x3c, 0x9b, 0x0b, 0x59, - 0x86, 0x71, 0xfc, 0x2e, 0x5b, 0xf8, 0x33, 0x2c, 0x5f, 0xc3, 0xd3, 0xd1, 0xd5, 0x84, 0xc2, 0x73, - 0x73, 0x59, 0xc3, 0x59, 0xf6, 0xa2, 0xe0, 0xb9, 0x6d, 0x90, 0x91, 0x4f, 0x60, 0x2e, 0x39, 0xbd, - 0x17, 0x7d, 0xef, 0xb1, 0xbb, 0xdf, 0x09, 0x68, 0xb3, 0xfc, 0x1a, 0x6b, 0xaa, 0xdd, 0x05, 0x63, - 0xee, 0x11, 0x9c, 0x4d, 0x55, 0x41, 0x4a, 0xd0, 0xff, 0x44, 0xdc, 0x38, 0x8e, 0xda, 0xec, 0x4f, - 0xf2, 0x36, 0x0c, 0x3e, 0x65, 0xc7, 0x12, 0xd4, 0x18, 0xe2, 0x3b, 0x2c, 0x8d, 0x74, 0xd5, 0x7b, - 0xec, 0xdb, 0x1c, 0xe9, 0xc3, 0xe2, 0xfb, 0x85, 0x07, 0x03, 0x23, 0x63, 0xa5, 0x71, 0x7e, 0x51, - 0xfc, 0x60, 0x60, 0x64, 0xa2, 0x34, 0x69, 0x55, 0xe1, 0x4c, 0x02, 0x9f, 0x94, 0x61, 0x98, 0x7a, - 0x4c, 0xd5, 0x6d, 0x72, 0x9d, 0xc5, 0x96, 0x3f, 0xc9, 0x34, 0x0c, 0xb6, 0xdc, 0x43, 0x37, 0xc2, - 0x0a, 0x07, 0x6d, 0xfe, 0xc3, 0xfa, 0xfd, 0x02, 0x90, 0xf4, 0x96, 0x41, 0x6e, 0x25, 0xd8, 0x70, - 0x45, 0x4f, 0x80, 0x74, 0x53, 0xb8, 0xe4, 0xfe, 0x39, 0x4c, 0xf1, 0x31, 0x93, 0x9b, 0x9b, 0x56, - 0x17, 0x5f, 0x54, 0x33, 0x8a, 0x75, 0x73, 0x88, 0x28, 0xc6, 0xad, 0x70, 0x0d, 0x9b, 0xd6, 0x81, - 0x99, 0xcc, 0xcd, 0x82, 0xac, 0xc3, 0xcc, 0xa1, 0xef, 0x45, 0x07, 0xad, 0xe7, 0x72, 0xaf, 0x10, - 0xb5, 0x15, 0xb0, 0x36, 0x5c, 0x1f, 0x33, 0x11, 0xec, 0x29, 0x01, 0x16, 0x1c, 0xb1, 0x9e, 0x07, - 0x03, 0x23, 0xc5, 0x52, 0xbf, 0xea, 0x89, 0x65, 0xc3, 0xd9, 0xd4, 0x9a, 0x4b, 0xbe, 0x0f, 0xe3, - 0x0d, 0x3c, 0xca, 0x18, 0x35, 0xf1, 0x1d, 0x47, 0x83, 0xeb, 0x9f, 0x13, 0x87, 0xf3, 0xae, 0xfc, - 0x51, 0x01, 0x66, 0x73, 0x56, 0xdb, 0xd3, 0x8b, 0xfa, 0x4b, 0x38, 0x77, 0xe8, 0x7c, 0x53, 0x0f, - 0xf0, 0xa4, 0x5a, 0x0f, 0x1c, 0x2f, 0x21, 0x6d, 0x5c, 0x49, 0xb2, 0x31, 0x74, 0x6f, 0x9d, 0x43, - 0xe7, 0x1b, 0x1b, 0x11, 0x6c, 0x56, 0xce, 0xdb, 0xf9, 0x19, 0x4c, 0x18, 0xeb, 0xeb, 0xa9, 0x1b, - 0x67, 0xdd, 0x81, 0xb3, 0xec, 0x2c, 0x1f, 0xd1, 0x13, 0x5b, 0xa8, 0xac, 0x2d, 0x80, 0x1a, 0x3d, - 0x74, 0xda, 0x07, 0x3e, 0xd3, 0xbb, 0x17, 0xf4, 0x5f, 0xc2, 0xc2, 0x41, 0x84, 0xc5, 0x41, 0x15, - 0xec, 0xde, 0xe5, 0xba, 0x78, 0xa8, 0x30, 0x6d, 0x8d, 0xca, 0xfa, 0xf3, 0x22, 0x10, 0xb1, 0x40, - 0x06, 0xd4, 0x39, 0x94, 0xcd, 0xf8, 0x00, 0xc6, 0xf9, 0x79, 0x94, 0x83, 0xb1, 0x39, 0x63, 0xf3, - 0x53, 0xe2, 0xcb, 0xd3, 0x8b, 0x56, 0xfa, 0x6c, 0x03, 0x95, 0x91, 0xda, 0x94, 0x1f, 0xa4, 0x91, - 0xb4, 0x68, 0x90, 0xea, 0x45, 0x8c, 0x54, 0xff, 0x4d, 0x3e, 0x85, 0xc9, 0x45, 0xff, 0xb0, 0xcd, - 0x64, 0x22, 0x88, 0xfb, 0x85, 0x91, 0x42, 0xd4, 0x6b, 0x14, 0xae, 0xf4, 0xd9, 0x09, 0x74, 0xb2, - 0x01, 0x53, 0xf7, 0x5a, 0x9d, 0xf0, 0xa0, 0xea, 0x35, 0x17, 0x5b, 0x7e, 0x28, 0xb9, 0x0c, 0x08, - 0x23, 0x81, 0x58, 0xde, 0xd2, 0x18, 0x2b, 0x7d, 0x76, 0x16, 0x21, 0x79, 0x1d, 0x06, 0x97, 0x9f, - 0xb2, 0x65, 0x57, 0xfa, 0x6c, 0x08, 0x97, 0xb2, 0x4d, 0x8f, 0x6e, 0x3e, 0x5e, 0xe9, 0xb3, 0x79, - 0xe9, 0xc2, 0x28, 0x0c, 0xcb, 0xb3, 0xec, 0x2d, 0xa6, 0x12, 0x2b, 0x71, 0xd6, 0x22, 0x27, 0xea, - 0x84, 0x64, 0x0e, 0x46, 0x76, 0xda, 0xec, 0x88, 0x25, 0x8d, 0x00, 0xb6, 0xfa, 0x6d, 0xbd, 0x6d, - 0x4a, 0x9a, 0x5c, 0xd4, 0xed, 0xc7, 0x1c, 0x39, 0x06, 0x58, 0x2b, 0xa6, 0x70, 0xbb, 0x63, 0x1b, - 0xf5, 0x16, 0x13, 0xf5, 0x96, 0x92, 0xb2, 0xb6, 0x66, 0x32, 0x85, 0x67, 0x7d, 0x01, 0x97, 0x77, - 0xda, 0x21, 0x0d, 0xa2, 0x6a, 0xbb, 0xdd, 0x72, 0x1b, 0xfc, 0xce, 0x07, 0xcf, 0xbc, 0x72, 0xb2, - 0xbc, 0x07, 0x43, 0x1c, 0x20, 0xa6, 0x89, 0x9c, 0x83, 0xd5, 0x76, 0x5b, 0x9c, 0xb4, 0xef, 0x72, - 0xe5, 0x9c, 0x9f, 0x9d, 0x6d, 0x81, 0x6d, 0xfd, 0x4e, 0x01, 0x2e, 0xf3, 0x2f, 0x20, 0x97, 0xf5, - 0x77, 0x60, 0x14, 0x3d, 0xba, 0xda, 0x4e, 0x43, 0x7e, 0x13, 0xdc, 0xb5, 0x4d, 0x02, 0xed, 0xb8, - 0x5c, 0xf3, 0x95, 0x2b, 0xe6, 0xfb, 0xca, 0xc9, 0x0f, 0xac, 0x3f, 0xf3, 0x03, 0xfb, 0x1c, 0x2c, - 0xd1, 0xa2, 0x56, 0x2b, 0xd5, 0xa8, 0xf0, 0x45, 0x5a, 0x65, 0xfd, 0xd7, 0x22, 0xcc, 0xde, 0xa7, - 0x1e, 0x0d, 0x1c, 0xec, 0xa7, 0x61, 0xd3, 0xd1, 0x7d, 0x66, 0x0a, 0x5d, 0x7d, 0x66, 0x2a, 0xd2, - 0x4a, 0x56, 0x44, 0x2b, 0x59, 0xca, 0x01, 0x88, 0x1d, 0x17, 0x77, 0xec, 0x55, 0xd1, 0x2d, 0x3c, - 0x2e, 0x76, 0x02, 0x17, 0xed, 0xe0, 0x64, 0x35, 0xf6, 0xb7, 0x19, 0xe8, 0x69, 0x2e, 0x9b, 0x12, - 0xfe, 0x07, 0xc3, 0xc2, 0xdf, 0xc6, 0xf4, 0xb2, 0xd9, 0x80, 0x21, 0x6e, 0xdc, 0xc3, 0xdb, 0x9a, - 0xb1, 0xf9, 0x1b, 0xe2, 0x9b, 0xca, 0xe9, 0xa0, 0xb0, 0x04, 0xe2, 0xc6, 0xce, 0xa7, 0x40, 0x84, - 0x00, 0x5b, 0x70, 0x99, 0xfb, 0x1c, 0xc6, 0x34, 0x94, 0x93, 0xec, 0xfd, 0xca, 0xc8, 0xc8, 0x34, - 0x46, 0x6f, 0x9f, 0xdb, 0x2b, 0xb5, 0xbd, 0xdf, 0xfa, 0x08, 0xca, 0xe9, 0xd6, 0x08, 0xc3, 0x52, - 0x2f, 0x3b, 0x96, 0xb5, 0x04, 0xd3, 0xf7, 0x69, 0x84, 0x13, 0x17, 0x3f, 0x22, 0xcd, 0x6f, 0x2c, - 0xf1, 0x9d, 0xc9, 0x55, 0x55, 0xde, 0xea, 0xe8, 0x5f, 0x69, 0x0d, 0x66, 0x12, 0x5c, 0x44, 0xfd, - 0x1f, 0xc2, 0xb0, 0x00, 0xa9, 0x15, 0x55, 0x38, 0x9f, 0xd2, 0x3d, 0x51, 0xb0, 0x3b, 0xcf, 0xe7, - 0xad, 0xe0, 0x6c, 0x4b, 0x02, 0xeb, 0x00, 0xce, 0xb1, 0x6d, 0x36, 0xe6, 0xaa, 0xa6, 0xe3, 0x05, - 0x18, 0x6d, 0x33, 0x45, 0x21, 0x74, 0x7f, 0xc2, 0xa7, 0xd1, 0xa0, 0x3d, 0xc2, 0x00, 0x35, 0xf7, - 0x27, 0x94, 0x5c, 0x02, 0xc0, 0x42, 0xec, 0xa6, 0x58, 0x05, 0x10, 0x9d, 0x1b, 0xee, 0x08, 0xa0, - 0xd7, 0x19, 0x9f, 0x37, 0x36, 0xfe, 0x6d, 0x05, 0x30, 0x9b, 0xaa, 0x49, 0x74, 0xe0, 0x16, 0x8c, - 0x48, 0x15, 0x36, 0x61, 0x52, 0xd7, 0x7b, 0x60, 0x2b, 0x24, 0xf2, 0x06, 0x9c, 0xf1, 0xe8, 0x37, - 0x51, 0x3d, 0xd5, 0x86, 0x09, 0x06, 0xde, 0x92, 0xed, 0xb0, 0x7e, 0x05, 0xcd, 0xa8, 0x35, 0xcf, - 0x7f, 0xf6, 0xb8, 0xe5, 0x3c, 0xa1, 0xa9, 0x8a, 0xbf, 0x0f, 0x23, 0xb5, 0xde, 0x15, 0xf3, 0xcf, - 0x47, 0x56, 0x6e, 0x2b, 0x12, 0xab, 0x05, 0x73, 0xac, 0x4b, 0xb5, 0xea, 0xfa, 0xda, 0x6a, 0x73, - 0xeb, 0xdb, 0x16, 0xe0, 0x53, 0xb8, 0x90, 0x59, 0xdb, 0xb7, 0x2d, 0xc4, 0x7f, 0x39, 0x00, 0xb3, - 0x7c, 0x33, 0x49, 0xcf, 0xe0, 0x93, 0x2f, 0x35, 0xbf, 0x94, 0x1b, 0xc9, 0xdb, 0x19, 0x37, 0x92, - 0x48, 0xa2, 0xdf, 0x48, 0x1a, 0xf7, 0x90, 0xef, 0x67, 0xdf, 0x43, 0xa2, 0x9d, 0xc8, 0xbc, 0x87, - 0x4c, 0xde, 0x3e, 0x2e, 0xe7, 0xdf, 0x3e, 0xe2, 0x35, 0x4b, 0xc6, 0xed, 0x63, 0xd6, 0x9d, 0x63, - 0xc2, 0xf5, 0x67, 0xe4, 0xd5, 0xba, 0xfe, 0xbc, 0x01, 0xc3, 0xd5, 0x76, 0x5b, 0x73, 0xa5, 0xc3, - 0xe1, 0x71, 0xda, 0x6d, 0x2e, 0x3c, 0x59, 0x28, 0xd7, 0x79, 0xc8, 0x58, 0xe7, 0x3f, 0x00, 0x58, - 0x44, 0x87, 0x7f, 0x1c, 0xb8, 0x31, 0xc4, 0x40, 0x0d, 0x9f, 0x3f, 0x03, 0xc0, 0x81, 0xd3, 0x2d, - 0x20, 0x31, 0x32, 0x57, 0xec, 0xad, 0x5d, 0x28, 0xa7, 0xa7, 0xcf, 0x2b, 0x58, 0xba, 0xfe, 0xb4, - 0x00, 0x97, 0x84, 0x92, 0x93, 0xf8, 0xc0, 0x4f, 0x3f, 0x3b, 0xdf, 0x85, 0x71, 0x41, 0xbb, 0x1d, - 0x7f, 0x08, 0xfc, 0x0a, 0x58, 0x2e, 0xc6, 0x7c, 0x45, 0x37, 0xd0, 0xc8, 0xbb, 0x30, 0x82, 0x7f, - 0xc4, 0xd7, 0x20, 0x4c, 0x32, 0xa3, 0x88, 0x5a, 0x4f, 0x5e, 0x86, 0x28, 0x54, 0xeb, 0x6b, 0xb8, - 0x9c, 0xd7, 0xf0, 0x57, 0x20, 0x97, 0x7f, 0x55, 0x80, 0x0b, 0x82, 0xbd, 0xb1, 0x54, 0xbc, 0xd0, - 0xae, 0x73, 0x0a, 0x07, 0xdc, 0x07, 0x30, 0xc6, 0x2a, 0x94, 0xed, 0xee, 0x17, 0x5b, 0xab, 0x38, - 0x39, 0xc4, 0x25, 0x4b, 0x4e, 0xe4, 0x08, 0x87, 0x12, 0xe7, 0xb0, 0x25, 0x8d, 0x17, 0xb6, 0x4e, - 0x6c, 0x7d, 0x05, 0x17, 0xb3, 0xbb, 0xf0, 0x0a, 0xe4, 0xf3, 0x00, 0xe6, 0x32, 0x36, 0x85, 0x17, - 0xdb, 0x93, 0xbf, 0x84, 0x0b, 0x99, 0xbc, 0x5e, 0x41, 0x33, 0x57, 0x98, 0xc6, 0x11, 0xbd, 0x82, - 0x21, 0xb4, 0x1e, 0xc1, 0xf9, 0x0c, 0x4e, 0xaf, 0xa0, 0x89, 0xf7, 0x61, 0x56, 0x69, 0xda, 0x2f, - 0xd5, 0xc2, 0x75, 0xb8, 0xc4, 0x19, 0xbd, 0x9a, 0x51, 0x79, 0x08, 0x17, 0x04, 0xbb, 0x57, 0x20, - 0xbd, 0x15, 0xb8, 0x18, 0x1f, 0xa8, 0x33, 0xf4, 0xa4, 0x13, 0x2f, 0x32, 0xd6, 0x1a, 0x5c, 0x89, - 0x39, 0xe5, 0x28, 0x0d, 0x27, 0xe7, 0xc6, 0xd5, 0xc1, 0x78, 0x94, 0x5e, 0xc9, 0x88, 0x3e, 0x82, - 0x73, 0x06, 0xd3, 0x57, 0xa6, 0x2a, 0xad, 0xc2, 0x14, 0x67, 0x6c, 0xaa, 0xce, 0xf3, 0xba, 0xea, - 0x3c, 0x36, 0x7f, 0x36, 0x66, 0x89, 0xe0, 0xdd, 0xbb, 0x19, 0xda, 0xf4, 0x3a, 0x6a, 0xd3, 0x12, - 0x25, 0x6e, 0xe1, 0xbb, 0x30, 0xc4, 0x21, 0xa2, 0x7d, 0x19, 0xcc, 0xf8, 0x61, 0x81, 0x93, 0x09, - 0x64, 0xeb, 0x87, 0x70, 0x89, 0x9f, 0x44, 0xe3, 0xbb, 0x44, 0xf3, 0xb4, 0xf8, 0xfd, 0xc4, 0x41, - 0xf4, 0xbc, 0xe0, 0x9b, 0xc4, 0xcf, 0x39, 0x8f, 0xee, 0xc9, 0xb9, 0x9d, 0xc7, 0xff, 0x44, 0x8f, - 0xb1, 0xe4, 0x01, 0xb3, 0x98, 0x79, 0xc0, 0xbc, 0x06, 0x57, 0xd5, 0x01, 0x33, 0x59, 0x8d, 0x9c, - 0x5a, 0xd6, 0x57, 0x70, 0x81, 0x77, 0x54, 0x3a, 0xc9, 0x99, 0xcd, 0xf8, 0x28, 0xd1, 0xcd, 0x59, - 0xd1, 0x4d, 0x13, 0x3b, 0xa7, 0x93, 0xff, 0x6f, 0x41, 0x7e, 0x72, 0xd9, 0xcc, 0x7f, 0xd9, 0x27, - 0xee, 0x0d, 0xa8, 0x28, 0x81, 0x98, 0x2d, 0x7a, 0xb1, 0xe3, 0xf6, 0x3a, 0xcc, 0xe8, 0x6c, 0xdc, - 0x06, 0xdd, 0xbd, 0x83, 0x97, 0x3c, 0xef, 0xb0, 0xcf, 0x02, 0x01, 0x72, 0xda, 0x95, 0x33, 0xe4, - 0x86, 0xf8, 0xb6, 0xc2, 0xb4, 0xea, 0x70, 0x31, 0x3d, 0x14, 0x6e, 0x43, 0x7a, 0xc8, 0x93, 0x4f, - 0xd9, 0x27, 0x8c, 0x10, 0x31, 0x18, 0xb9, 0x4c, 0xe5, 0x77, 0xcc, 0xc9, 0x25, 0x95, 0x65, 0xc9, - 0xa5, 0x26, 0xd1, 0x7f, 0x56, 0xbb, 0x9c, 0x0f, 0xbf, 0x0e, 0x44, 0x16, 0x2d, 0xd6, 0x6c, 0x59, - 0xf5, 0x79, 0xe8, 0x5f, 0xac, 0xd9, 0xe2, 0x69, 0x0e, 0x6a, 0x82, 0x8d, 0x30, 0xb0, 0x19, 0x2c, - 0xa9, 0x91, 0x17, 0x4f, 0xa0, 0x91, 0x3f, 0x18, 0x18, 0xe9, 0x2f, 0x0d, 0xd8, 0xa4, 0xe6, 0xee, - 0x7b, 0x8f, 0xdc, 0xe8, 0x40, 0x55, 0x58, 0xb5, 0x7e, 0x00, 0x53, 0x46, 0xf5, 0xe2, 0x2b, 0xee, - 0xfa, 0xa6, 0x88, 0xe9, 0xb3, 0x8b, 0x55, 0x74, 0x22, 0x41, 0x93, 0xc5, 0x38, 0x5f, 0x6f, 0x1a, - 0x4e, 0x1d, 0x1f, 0xac, 0xda, 0xb2, 0xd0, 0xfa, 0xc7, 0x03, 0x1a, 0x77, 0xed, 0xa5, 0x56, 0x97, - 0xde, 0xdd, 0x01, 0xe0, 0x33, 0x44, 0xeb, 0x1c, 0x53, 0x00, 0xc7, 0x84, 0x6f, 0x06, 0x5f, 0x92, - 0x6d, 0x0d, 0xe9, 0xa4, 0x2f, 0xb9, 0x84, 0x47, 0x2d, 0x27, 0x92, 0x8f, 0x17, 0x95, 0x47, 0xad, - 0x60, 0x1d, 0xda, 0x3a, 0x12, 0xf9, 0x61, 0xf2, 0xb9, 0xc1, 0x20, 0xde, 0x29, 0xbd, 0x26, 0x2f, - 0x99, 0xd3, 0x7d, 0x3b, 0xdd, 0x8b, 0x83, 0x67, 0x30, 0xc3, 0x68, 0xdd, 0xc7, 0x78, 0xb0, 0x58, - 0xfe, 0x26, 0xa2, 0x1e, 0x5f, 0xdb, 0x87, 0xb0, 0x9e, 0xd7, 0xbb, 0xd4, 0x13, 0x23, 0x0b, 0xfb, - 0x7b, 0xcc, 0xa7, 0x4e, 0x55, 0x99, 0x9d, 0xcd, 0x1f, 0x27, 0x91, 0xbd, 0xb6, 0xec, 0x35, 0xdb, - 0xbe, 0xab, 0x0e, 0x4c, 0x7c, 0x12, 0x05, 0xad, 0x3a, 0x15, 0x70, 0x5b, 0x47, 0xb2, 0xde, 0xe8, - 0xea, 0xa7, 0x3d, 0x02, 0x03, 0xdb, 0x8b, 0xdb, 0x6b, 0xa5, 0x82, 0x75, 0x0b, 0x40, 0xab, 0x09, - 0x60, 0x68, 0x63, 0xd3, 0x5e, 0xaf, 0xae, 0x95, 0xfa, 0xc8, 0x0c, 0x9c, 0x7d, 0xb4, 0xba, 0xb1, - 0xb4, 0xf9, 0xa8, 0x56, 0xaf, 0xad, 0x57, 0xed, 0xed, 0xc5, 0xaa, 0xbd, 0x54, 0x2a, 0x58, 0x5f, - 0xc3, 0xb4, 0xd9, 0xc3, 0x57, 0x3a, 0x09, 0x23, 0x98, 0x52, 0xfa, 0xcc, 0x83, 0x47, 0xdb, 0x9a, - 0xff, 0xa6, 0x38, 0xfc, 0x25, 0xfd, 0x90, 0xc4, 0x31, 0x51, 0x7c, 0x46, 0x1a, 0x12, 0x79, 0x8b, - 0xab, 0x05, 0xc9, 0xb7, 0xb8, 0x4c, 0x2d, 0xa8, 0xc7, 0x7a, 0x01, 0x2e, 0x7d, 0xdf, 0x83, 0x69, - 0xb3, 0xd6, 0x93, 0x5a, 0xa9, 0x5e, 0x43, 0xc7, 0x56, 0xed, 0xa1, 0x0e, 0x21, 0xfa, 0xb5, 0x81, - 0x58, 0x59, 0xbf, 0x07, 0x25, 0x81, 0x15, 0xef, 0xbc, 0xd7, 0xa4, 0x19, 0xb1, 0x90, 0xf1, 0xac, - 0x50, 0xba, 0x59, 0xfb, 0x50, 0x62, 0x2b, 0xa6, 0xa0, 0xe4, 0x15, 0x4c, 0xc3, 0xe0, 0x5a, 0x7c, - 0x9d, 0x63, 0xf3, 0x1f, 0xf8, 0x5e, 0x25, 0x72, 0x82, 0x48, 0x7a, 0x7d, 0x8d, 0xda, 0xea, 0x37, - 0x79, 0x0b, 0x86, 0xee, 0xb9, 0xad, 0x48, 0x98, 0x46, 0xe2, 0x4d, 0x9e, 0xb1, 0xe5, 0x05, 0xb6, - 0x40, 0xb0, 0x6c, 0x38, 0xab, 0x55, 0x78, 0x8a, 0xa6, 0x92, 0x32, 0x0c, 0x6f, 0xd0, 0x6f, 0xb4, - 0xfa, 0xe5, 0x4f, 0xeb, 0x3d, 0x38, 0x2b, 0x3c, 0xea, 0x34, 0x31, 0x5d, 0x15, 0xaf, 0x9f, 0x0b, - 0xc6, 0x13, 0x4c, 0xc1, 0x12, 0x8b, 0x18, 0xdd, 0x4e, 0xbb, 0xf9, 0x82, 0x74, 0x6c, 0xa3, 0x38, - 0x25, 0xdd, 0x9b, 0xf2, 0x16, 0xa8, 0xd7, 0x70, 0xfe, 0x79, 0x01, 0xca, 0x09, 0x2b, 0xc3, 0xe2, - 0x81, 0xd3, 0x6a, 0x51, 0x6f, 0x9f, 0x92, 0xeb, 0x30, 0xb0, 0xbd, 0xb9, 0xbd, 0x25, 0xac, 0xa4, - 0xd2, 0x01, 0x80, 0x81, 0x14, 0x8e, 0x8d, 0x18, 0xe4, 0x21, 0x9c, 0x95, 0x3e, 0xb3, 0xaa, 0x48, - 0x8c, 0xd0, 0xa5, 0xee, 0x1e, 0xb8, 0x69, 0x3a, 0xf2, 0x8e, 0x30, 0x89, 0xfc, 0xb8, 0xe3, 0x06, - 0xb4, 0x89, 0x96, 0x9f, 0xf8, 0x36, 0x5d, 0x2b, 0xb1, 0x75, 0x34, 0xfe, 0x56, 0xd5, 0xfa, 0xbd, - 0x02, 0xcc, 0xe6, 0x58, 0x4d, 0xc8, 0x5b, 0x46, 0x77, 0xa6, 0xb4, 0xee, 0x48, 0x94, 0x95, 0x3e, - 0xd1, 0x9f, 0x45, 0xcd, 0x91, 0xb8, 0xff, 0x14, 0x8e, 0xc4, 0x2b, 0x7d, 0xb1, 0xf3, 0xf0, 0x02, - 0xc0, 0x88, 0x84, 0x5b, 0x67, 0x60, 0xc2, 0x90, 0x9b, 0x65, 0xc1, 0xb8, 0x5e, 0x33, 0x1b, 0x9c, - 0x45, 0xbf, 0xa9, 0x06, 0x87, 0xfd, 0x6d, 0xfd, 0x6e, 0x01, 0xa6, 0xb1, 0x8b, 0xfb, 0x2e, 0x5b, - 0xfa, 0x62, 0x09, 0xcd, 0x1b, 0x3d, 0xb9, 0x68, 0xf4, 0x24, 0x81, 0xab, 0xba, 0xf4, 0x61, 0xaa, - 0x4b, 0x17, 0xb3, 0xba, 0x84, 0xd3, 0xdb, 0xf5, 0x3d, 0xa3, 0x27, 0xda, 0x55, 0xd4, 0xef, 0x17, - 0x60, 0x4a, 0x6b, 0x93, 0x6a, 0xff, 0x1d, 0xa3, 0x49, 0x17, 0x32, 0x9a, 0x94, 0x12, 0xf2, 0x42, - 0xaa, 0x45, 0xaf, 0x75, 0x6b, 0x51, 0x4f, 0x19, 0xff, 0xe7, 0x02, 0xcc, 0x64, 0xca, 0x80, 0x9c, - 0x63, 0xba, 0x6d, 0x23, 0xa0, 0x91, 0x10, 0xaf, 0xf8, 0xc5, 0xe0, 0xab, 0x61, 0xd8, 0xa1, 0x81, - 0xf8, 0xce, 0xc5, 0x2f, 0xf2, 0x1a, 0x4c, 0x6c, 0xd1, 0xc0, 0xf5, 0x9b, 0xdc, 0xc5, 0x9c, 0xfb, - 0x6e, 0x4e, 0xd8, 0x26, 0x90, 0x5c, 0x84, 0xd1, 0x6a, 0x6b, 0xdf, 0x0f, 0xdc, 0xe8, 0x80, 0xdf, - 0x06, 0x8e, 0xda, 0x31, 0x80, 0xf1, 0x5e, 0x72, 0xf7, 0xf9, 0xa5, 0x06, 0x23, 0x16, 0xbf, 0xd8, - 0xe2, 0x22, 0xad, 0x85, 0x43, 0x7c, 0x71, 0x91, 0xa6, 0xc0, 0x73, 0x30, 0xf4, 0xb9, 0x8d, 0x93, - 0x00, 0x23, 0x04, 0xd8, 0xe2, 0x17, 0x99, 0x44, 0x27, 0x61, 0x7c, 0x95, 0x80, 0xce, 0xc1, 0x1f, - 0xc2, 0x74, 0x96, 0x5c, 0xb3, 0xa6, 0x90, 0xa0, 0x2d, 0x2a, 0xda, 0xaf, 0x60, 0xaa, 0xda, 0x6c, - 0xae, 0xdf, 0xab, 0x72, 0x9f, 0x03, 0x31, 0xaa, 0xfc, 0xe3, 0xe1, 0xf6, 0x3a, 0xa1, 0xb2, 0x0d, - 0xac, 0x7a, 0x6e, 0x64, 0x4f, 0x2d, 0x7f, 0xe3, 0x86, 0x91, 0xeb, 0xed, 0x6b, 0x46, 0x45, 0xfb, - 0xdc, 0x06, 0x7d, 0x96, 0x31, 0x05, 0xd8, 0x6e, 0x6a, 0xf2, 0xe6, 0xf0, 0x0c, 0xe6, 0xd3, 0x1a, - 0xdb, 0x78, 0x29, 0x99, 0x35, 0xf9, 0xc6, 0x05, 0xfd, 0xd5, 0xc6, 0x13, 0xeb, 0x7b, 0x70, 0x8e, - 0x2f, 0x69, 0xdd, 0x1a, 0x2f, 0x9a, 0xad, 0xdb, 0x40, 0xad, 0xf7, 0xa5, 0x95, 0xa2, 0x6b, 0xcb, - 0xec, 0x71, 0xa3, 0x2d, 0x58, 0xe5, 0x7f, 0x29, 0xc0, 0x5c, 0x82, 0xb4, 0xf6, 0xdc, 0x6b, 0xc8, - 0xf5, 0xf4, 0x8d, 0xa4, 0x13, 0x36, 0xea, 0x01, 0xdc, 0xf8, 0xe7, 0x36, 0x95, 0x1f, 0x36, 0xb9, - 0x05, 0xc0, 0x89, 0xb5, 0xed, 0x1b, 0x4d, 0xdf, 0xc2, 0xc9, 0x06, 0x37, 0x70, 0x0d, 0x85, 0x74, - 0x20, 0x4b, 0xee, 0xe2, 0x1b, 0xe9, 0x65, 0x1b, 0xc6, 0xa8, 0x18, 0x54, 0x90, 0xd7, 0x73, 0x8c, - 0xc4, 0x59, 0xfc, 0xad, 0xff, 0xaf, 0x1f, 0x66, 0xf5, 0x01, 0x7c, 0x91, 0xbe, 0x6e, 0xc1, 0xd8, - 0xa2, 0xef, 0x45, 0xf4, 0x9b, 0x48, 0x8b, 0x4a, 0x40, 0xd4, 0x4d, 0xbb, 0x2a, 0x11, 0xaa, 0x23, - 0x07, 0xd4, 0x99, 0x1e, 0x63, 0x38, 0x0b, 0xc6, 0x88, 0x64, 0x11, 0x26, 0x36, 0xe8, 0xb3, 0x94, - 0x00, 0xd1, 0x61, 0xd1, 0xa3, 0xcf, 0xea, 0x9a, 0x10, 0x75, 0x2f, 0x32, 0x83, 0x86, 0xec, 0xc1, - 0xa4, 0x9c, 0x5c, 0x86, 0x30, 0xe7, 0xf4, 0x5d, 0xc5, 0x9c, 0xce, 0xfc, 0xd5, 0x3e, 0xab, 0x21, - 0x47, 0x86, 0x09, 0x8e, 0xac, 0xeb, 0xbc, 0x46, 0xfe, 0x10, 0xdd, 0xdc, 0xb6, 0xb4, 0x12, 0xc3, - 0x1d, 0x34, 0xf9, 0x00, 0x5d, 0x67, 0x61, 0x6d, 0x41, 0x39, 0x3d, 0x1e, 0xa2, 0xb6, 0x77, 0x60, - 0x88, 0x43, 0x85, 0x1a, 0x20, 0x03, 0xce, 0x28, 0x6c, 0x7e, 0x4e, 0xe7, 0xd5, 0xd8, 0x02, 0xd7, - 0x5a, 0x41, 0xdb, 0x89, 0xc2, 0x51, 0x8a, 0xd8, 0xed, 0xe4, 0xf0, 0xa2, 0xa7, 0xad, 0x1c, 0x5e, - 0xdd, 0xcf, 0x44, 0x3e, 0x2e, 0x58, 0x44, 0xf3, 0x93, 0xce, 0x49, 0x34, 0xec, 0x06, 0x0c, 0x0b, - 0x50, 0x22, 0x14, 0x4e, 0xfc, 0xf9, 0x49, 0x04, 0xeb, 0x43, 0x38, 0x8f, 0xb6, 0x30, 0xd7, 0xdb, - 0x6f, 0xd1, 0x9d, 0xd0, 0x78, 0x1e, 0xd0, 0xeb, 0xb3, 0xfe, 0x18, 0xe6, 0xb2, 0x68, 0x7b, 0x7e, - 0xd9, 0x3c, 0x38, 0xc5, 0x5f, 0x15, 0x61, 0x7a, 0x35, 0xd4, 0x95, 0x09, 0x15, 0xa0, 0x22, 0x23, - 0x68, 0x02, 0xca, 0x64, 0xa5, 0x2f, 0x2b, 0x28, 0xc2, 0x3b, 0xda, 0xe3, 0xc4, 0x62, 0xb7, 0x68, - 0x08, 0x6c, 0xdb, 0x52, 0xcf, 0x13, 0xdf, 0x80, 0x81, 0x0d, 0xb6, 0x54, 0xf7, 0x8b, 0xb1, 0xe3, - 0x14, 0x0c, 0x84, 0x8f, 0x03, 0xd9, 0x16, 0xc9, 0x7e, 0x90, 0x7b, 0xa9, 0x27, 0x88, 0x03, 0xbd, - 0x5f, 0xfb, 0xaf, 0xf4, 0xa5, 0x5e, 0x23, 0xbe, 0x07, 0x63, 0xd5, 0xe6, 0x21, 0xf7, 0x08, 0xf4, - 0xbd, 0xc4, 0x67, 0xa9, 0x95, 0xac, 0xf4, 0xd9, 0x3a, 0x22, 0x3b, 0xe1, 0x56, 0xdb, 0x6d, 0xdc, - 0xa8, 0xb2, 0x22, 0x20, 0xac, 0xf4, 0xa1, 0x83, 0xfd, 0xc2, 0x08, 0x0c, 0x6d, 0x3b, 0xc1, 0x3e, - 0x8d, 0xac, 0xaf, 0x60, 0x4e, 0x38, 0xa9, 0x70, 0xcb, 0x1f, 0xba, 0xb2, 0x84, 0xb1, 0x1f, 0x52, - 0x37, 0xc7, 0x92, 0xcb, 0x00, 0xa8, 0xe7, 0xaf, 0x7a, 0x4d, 0xfa, 0x8d, 0xf0, 0x92, 0xd3, 0x20, - 0xd6, 0xbb, 0x30, 0xaa, 0x24, 0x84, 0xca, 0xac, 0xb6, 0xd9, 0xa1, 0xb4, 0xa6, 0x8d, 0x37, 0x97, - 0xf2, 0xa1, 0xe5, 0x79, 0xa3, 0xef, 0x22, 0xa6, 0x09, 0xd7, 0x7e, 0x5d, 0x98, 0x49, 0x4c, 0x82, - 0xf8, 0xc9, 0xbc, 0xd2, 0x3f, 0xb9, 0x1b, 0x9f, 0xfa, 0x9d, 0x54, 0x4f, 0x8b, 0x27, 0x52, 0x4f, - 0xad, 0x7f, 0x5a, 0xc4, 0x83, 0x53, 0x4a, 0x1e, 0x09, 0x1b, 0x94, 0x6e, 0x07, 0x5b, 0x80, 0x51, - 0xec, 0xfd, 0x92, 0x7c, 0xfa, 0xd5, 0xdd, 0xc7, 0x62, 0xe4, 0x67, 0x47, 0x95, 0x3e, 0x74, 0xac, - 0x88, 0xc9, 0xc8, 0x27, 0x30, 0xbc, 0xec, 0x35, 0x91, 0x43, 0xff, 0x29, 0x38, 0x48, 0x22, 0x36, - 0x26, 0xd8, 0xe4, 0x6d, 0xf6, 0x09, 0x73, 0xd3, 0x85, 0xad, 0x41, 0xe2, 0x13, 0xdc, 0x60, 0xde, - 0x09, 0x6e, 0x28, 0x71, 0x82, 0xb3, 0x60, 0x70, 0x33, 0x68, 0x8a, 0x48, 0x24, 0x93, 0xf3, 0xe3, - 0x42, 0x70, 0x08, 0xb3, 0x79, 0x91, 0xf5, 0xdf, 0x0a, 0x30, 0x7b, 0x9f, 0x46, 0x99, 0x73, 0xc8, - 0x90, 0x4a, 0xe1, 0xa5, 0xa5, 0x52, 0x7c, 0x11, 0xa9, 0xa8, 0x5e, 0xf7, 0xe7, 0xf5, 0x7a, 0x20, - 0xaf, 0xd7, 0x83, 0xf9, 0xbd, 0xbe, 0x0f, 0x43, 0xbc, 0xab, 0xec, 0x94, 0xba, 0x1a, 0xd1, 0xc3, - 0xf8, 0x94, 0xaa, 0x7b, 0x88, 0xd9, 0xbc, 0x8c, 0x29, 0x92, 0x6b, 0x4e, 0xa8, 0x9f, 0x52, 0xc5, - 0x4f, 0xeb, 0x47, 0xf8, 0x68, 0x74, 0xcd, 0x6f, 0x3c, 0xd1, 0xac, 0x9d, 0xc3, 0xfc, 0x0b, 0x4d, - 0x5a, 0xc7, 0x19, 0x16, 0x2f, 0xb1, 0x25, 0x06, 0xb9, 0x02, 0x63, 0xab, 0xde, 0x3d, 0x3f, 0x68, - 0xd0, 0x4d, 0xaf, 0xc5, 0xb9, 0x8f, 0xd8, 0x3a, 0x48, 0x58, 0x01, 0x44, 0x0d, 0xf1, 0xd1, 0x1a, - 0x01, 0x89, 0xa3, 0x35, 0x83, 0xed, 0xce, 0xdb, 0xbc, 0x4c, 0x18, 0x19, 0xd8, 0xdf, 0xdd, 0x4e, - 0xa5, 0xea, 0xf8, 0xda, 0x0b, 0x71, 0x0f, 0xce, 0xdb, 0xb4, 0xdd, 0x72, 0x98, 0x4e, 0x77, 0xe8, - 0x73, 0x7c, 0xd5, 0xe7, 0x2b, 0x19, 0x0f, 0xbe, 0x4c, 0x7f, 0x01, 0xd5, 0xe4, 0x62, 0x97, 0x26, - 0x1f, 0xc2, 0xd5, 0xfb, 0x34, 0x32, 0x17, 0xd4, 0xd8, 0x96, 0x2a, 0x3a, 0xbf, 0x02, 0x23, 0xa1, - 0x69, 0x07, 0xbe, 0x2c, 0xaf, 0x1f, 0xb2, 0x08, 0x77, 0xef, 0xca, 0x9b, 0x12, 0xc1, 0x47, 0xfd, - 0x65, 0x7d, 0x0a, 0x95, 0xbc, 0xea, 0x4e, 0xe6, 0xce, 0xe9, 0xc2, 0x95, 0x7c, 0x06, 0xa2, 0xb9, - 0xcb, 0x20, 0x6d, 0xc6, 0xe2, 0x13, 0xea, 0xd5, 0x5a, 0xd3, 0xcc, 0x2c, 0xfe, 0xb0, 0x16, 0xa4, - 0x63, 0xdb, 0x4b, 0x34, 0xb7, 0x8e, 0xd7, 0xb1, 0x26, 0x83, 0x58, 0xae, 0x55, 0x18, 0x91, 0x30, - 0x21, 0xd7, 0xd9, 0xcc, 0x96, 0x4a, 0x81, 0x36, 0x25, 0x03, 0x45, 0x66, 0xfd, 0x48, 0x5e, 0x4d, - 0x98, 0x14, 0x27, 0x7b, 0x01, 0x79, 0x92, 0xbb, 0x08, 0xcb, 0x87, 0xf3, 0x26, 0x6f, 0xdd, 0xe4, - 0x5c, 0xd2, 0x4c, 0xce, 0xdc, 0xd2, 0x7c, 0xc5, 0x34, 0x81, 0x16, 0xc5, 0xbc, 0x8c, 0x41, 0xe4, - 0xb2, 0x6e, 0x58, 0x1e, 0x4f, 0x3f, 0xa9, 0xbc, 0x0d, 0x73, 0x59, 0x15, 0x6a, 0xe7, 0x40, 0x65, - 0xbd, 0x14, 0xfa, 0xce, 0x12, 0x5c, 0x96, 0xb1, 0x80, 0x7c, 0x3f, 0x0a, 0xa3, 0xc0, 0x69, 0xd7, - 0x1a, 0x81, 0xdb, 0x8e, 0xa9, 0x2c, 0x18, 0xe2, 0x10, 0x21, 0x09, 0x7e, 0xcd, 0xc3, 0x71, 0x44, - 0x89, 0xf5, 0x9b, 0x05, 0xb0, 0x0c, 0x1f, 0x24, 0x1c, 0xe7, 0xad, 0xc0, 0x7f, 0xea, 0x36, 0xb5, - 0xab, 0x95, 0xb7, 0x0c, 0xb3, 0x1e, 0x7f, 0x12, 0x97, 0x74, 0x7f, 0x16, 0x6b, 0xe6, 0xed, 0x84, - 0xa9, 0x8d, 0x2b, 0x9e, 0xe8, 0x97, 0x64, 0x06, 0x5d, 0x51, 0x26, 0xb8, 0xff, 0x51, 0x80, 0x6b, - 0x5d, 0xdb, 0x20, 0xfa, 0xb3, 0x07, 0xa5, 0x64, 0x99, 0x98, 0x41, 0x15, 0xcd, 0x27, 0x21, 0xcd, - 0x61, 0xf7, 0x0e, 0xf7, 0xb1, 0x96, 0xbe, 0x3b, 0x6d, 0xc5, 0x39, 0xc5, 0xef, 0xf4, 0xad, 0x27, - 0x1f, 0x00, 0x6c, 0xfb, 0x91, 0xd3, 0x5a, 0x44, 0x03, 0x40, 0x7f, 0xec, 0x2f, 0x1f, 0x31, 0x68, - 0x3d, 0x19, 0xa4, 0x40, 0x43, 0xb6, 0x3e, 0xc3, 0xef, 0x3a, 0xbb, 0xd1, 0x27, 0xfb, 0xd4, 0x16, - 0xe1, 0x5a, 0xe2, 0x5e, 0xfc, 0x05, 0x98, 0x44, 0x30, 0xc3, 0xc4, 0xcf, 0x74, 0xef, 0xfb, 0x81, - 0xdf, 0x69, 0xff, 0x72, 0x46, 0xfd, 0xcf, 0x0a, 0xdc, 0x51, 0x51, 0xaf, 0x56, 0x0c, 0xf4, 0x22, - 0x40, 0x0c, 0x4d, 0x38, 0xac, 0xab, 0x82, 0xdd, 0x3b, 0xfc, 0xc8, 0x8d, 0x16, 0xf3, 0x7d, 0xce, - 0x40, 0x23, 0xfb, 0xe5, 0x8e, 0xe4, 0x5d, 0xbc, 0x0c, 0x57, 0xb5, 0x9f, 0x4c, 0xee, 0xef, 0x49, - 0xfb, 0xc7, 0x29, 0xe9, 0x0e, 0x60, 0x9a, 0xad, 0x00, 0xd5, 0x4e, 0x74, 0xe0, 0x07, 0x6e, 0x24, - 0x9f, 0x5e, 0x90, 0x2d, 0xf1, 0xb6, 0x9b, 0x53, 0x7d, 0xfc, 0x8b, 0xa3, 0xca, 0xfb, 0xa7, 0x89, - 0xd2, 0x28, 0x79, 0x6e, 0xab, 0xf7, 0xe0, 0xd6, 0x2c, 0xf4, 0x2f, 0xda, 0x6b, 0xb8, 0xe0, 0xd9, - 0x6b, 0x6a, 0xc1, 0xb3, 0xd7, 0xac, 0xbf, 0x29, 0x42, 0x85, 0x47, 0x9f, 0x40, 0x1f, 0x8a, 0xd8, - 0x6a, 0xa1, 0x39, 0x65, 0x9c, 0xd4, 0xc0, 0x90, 0x88, 0x2e, 0x51, 0x3c, 0x49, 0x74, 0x89, 0x5f, - 0x83, 0x1c, 0x93, 0xd5, 0x09, 0xac, 0x00, 0x6f, 0x1e, 0x1f, 0x55, 0xae, 0xc5, 0x56, 0x00, 0x5e, - 0x9a, 0x65, 0x0e, 0xc8, 0xa9, 0x22, 0x6d, 0xbf, 0x18, 0x78, 0x01, 0xfb, 0xc5, 0x6d, 0x18, 0xc6, - 0xc3, 0xcc, 0xea, 0x96, 0xf0, 0x6a, 0xc4, 0xe9, 0x89, 0xf1, 0x64, 0xea, 0xae, 0x1e, 0xbc, 0x4d, - 0xa2, 0x59, 0x7f, 0xbf, 0x08, 0x57, 0xf2, 0x65, 0x2e, 0xda, 0xb6, 0x04, 0x10, 0x7b, 0x6f, 0x74, - 0xf3, 0x16, 0xc1, 0x6f, 0xe7, 0x19, 0xdd, 0x53, 0xde, 0x5a, 0x1a, 0x1d, 0xd3, 0x7d, 0xe4, 0x43, - 0xdf, 0xc4, 0x55, 0x81, 0xf1, 0xfe, 0x57, 0xc4, 0x1e, 0x15, 0x20, 0x23, 0xf6, 0xa8, 0x80, 0x91, - 0x3d, 0x98, 0xdd, 0x0a, 0xdc, 0xa7, 0x4e, 0x44, 0x1f, 0xd2, 0xe7, 0xfc, 0x21, 0xcc, 0xb2, 0x78, - 0xfd, 0xc2, 0x5f, 0x6f, 0x5f, 0x3f, 0x3e, 0xaa, 0xbc, 0xd6, 0xe6, 0x28, 0x18, 0x5f, 0x8a, 0x3f, - 0x3d, 0xac, 0xa7, 0x1f, 0xc4, 0xe4, 0x31, 0xb2, 0xfe, 0x4d, 0x01, 0x2e, 0xa0, 0x5a, 0x2e, 0xcc, - 0xae, 0xb2, 0xf2, 0x17, 0x72, 0x1a, 0xd4, 0x3b, 0x28, 0xe6, 0x22, 0x3a, 0x0d, 0x1a, 0x0f, 0xa1, - 0x6d, 0x03, 0x8d, 0xac, 0xc2, 0x98, 0xf8, 0x8d, 0xdf, 0x5f, 0x3f, 0x1e, 0x08, 0x66, 0xb4, 0x05, - 0x0b, 0xa7, 0x3a, 0x37, 0x15, 0xe1, 0xc4, 0x16, 0xcc, 0xf0, 0xbd, 0xa0, 0xad, 0xd3, 0x5a, 0x3f, - 0x2f, 0xc2, 0xc5, 0x5d, 0x1a, 0xb8, 0x8f, 0x9f, 0xe7, 0x74, 0x66, 0x13, 0xa6, 0x25, 0x88, 0x47, - 0xa0, 0x30, 0x3e, 0x31, 0x1e, 0x7d, 0x50, 0x36, 0x55, 0x84, 0xb0, 0x90, 0x5f, 0x5c, 0x26, 0xe1, - 0x29, 0xdc, 0x01, 0xdf, 0x81, 0x91, 0x44, 0x0c, 0x18, 0x1c, 0x7f, 0xf9, 0x85, 0xc6, 0x43, 0xb5, - 0xd2, 0x67, 0x2b, 0x4c, 0xf2, 0x5b, 0xf9, 0xf7, 0x37, 0xc2, 0xf4, 0xd1, 0xcb, 0xfe, 0x89, 0x1f, - 0x2c, 0xfb, 0x58, 0x1d, 0xad, 0x34, 0xe3, 0x83, 0x5d, 0xe9, 0xb3, 0xf3, 0x6a, 0x5a, 0x18, 0x83, - 0xd1, 0x2a, 0xde, 0x49, 0xb1, 0x93, 0xfb, 0x7f, 0x2f, 0xc2, 0x65, 0xf9, 0xa8, 0x25, 0x47, 0xcc, - 0x5f, 0xc0, 0xac, 0x04, 0x55, 0xdb, 0x4c, 0x61, 0xa0, 0x4d, 0x53, 0xd2, 0x3c, 0x02, 0xa8, 0x94, - 0xb4, 0x23, 0x70, 0x62, 0x61, 0xe7, 0x91, 0xbf, 0x1a, 0xeb, 0xe7, 0x27, 0x59, 0x11, 0x79, 0xd0, - 0x0a, 0xa9, 0xaf, 0x99, 0x86, 0x68, 0x8c, 0xf5, 0xb3, 0x99, 0xb2, 0x9e, 0x0e, 0xbc, 0xac, 0xf5, - 0x74, 0xa5, 0x2f, 0x69, 0x3f, 0x5d, 0x98, 0x84, 0xf1, 0x0d, 0xfa, 0x2c, 0x96, 0xfb, 0xff, 0x5d, - 0x48, 0x44, 0x1a, 0x60, 0x1a, 0x06, 0x0f, 0x39, 0x50, 0x88, 0x83, 0xba, 0x60, 0xa4, 0x01, 0x5d, - 0xc3, 0xe0, 0xa8, 0xab, 0x30, 0xcc, 0x2f, 0x6a, 0x9b, 0x27, 0x38, 0xe1, 0xab, 0xd7, 0x29, 0xfc, - 0xc9, 0x60, 0x93, 0x1f, 0xf6, 0x05, 0xbd, 0xf5, 0x10, 0xae, 0x0a, 0xff, 0x65, 0x73, 0xf0, 0xb1, - 0xa2, 0x53, 0x6e, 0x5f, 0x96, 0x03, 0x97, 0xef, 0xd3, 0xe4, 0xd2, 0x63, 0xbc, 0xde, 0xf9, 0x14, - 0xce, 0x18, 0x70, 0xc5, 0x11, 0xb5, 0x52, 0x35, 0x87, 0x14, 0xeb, 0x24, 0xb6, 0x75, 0x25, 0xab, - 0x0a, 0xbd, 0xb1, 0x16, 0xc5, 0x50, 0x9e, 0x41, 0x7c, 0xc5, 0x16, 0x9e, 0x62, 0xd5, 0xbb, 0xae, - 0x7d, 0xd7, 0x7c, 0xc5, 0xe3, 0xb1, 0xde, 0xe4, 0xce, 0xab, 0x4a, 0xad, 0x09, 0xe3, 0x2e, 0xc0, - 0x9a, 0x84, 0x71, 0x59, 0xd4, 0xa2, 0x61, 0x68, 0xfd, 0x74, 0x10, 0x2c, 0x21, 0xd8, 0xac, 0xdb, - 0x67, 0x29, 0x8f, 0xbd, 0x54, 0x63, 0xc5, 0x46, 0x75, 0x4e, 0x8f, 0x20, 0x19, 0x97, 0xf2, 0x99, - 0x87, 0x7a, 0x5e, 0x23, 0x86, 0x1a, 0x33, 0x2f, 0xd5, 0xfb, 0x1f, 0xe4, 0x2c, 0x93, 0xfc, 0x63, - 0x7b, 0xfd, 0xf8, 0xa8, 0x72, 0x35, 0x67, 0x99, 0x34, 0xf8, 0x66, 0x2f, 0x99, 0xb6, 0x79, 0x25, - 0xd2, 0xff, 0x22, 0x57, 0x22, 0xec, 0x8b, 0xd4, 0x2f, 0x45, 0x76, 0x4c, 0x59, 0x8a, 0xef, 0x51, - 0x5e, 0x69, 0xeb, 0x45, 0xe2, 0xc1, 0xbf, 0x06, 0x31, 0xb8, 0x1a, 0x6c, 0x88, 0x0b, 0x25, 0xcd, - 0x66, 0xb9, 0x78, 0x40, 0x1b, 0x4f, 0x84, 0xad, 0x58, 0x5e, 0xe8, 0x66, 0xd9, 0xcc, 0x79, 0x34, - 0x61, 0xfe, 0x9d, 0xf3, 0x82, 0x7a, 0x83, 0x91, 0xea, 0x01, 0x0b, 0x92, 0x6c, 0xc9, 0x4f, 0x60, - 0x4a, 0x0d, 0x75, 0xc2, 0xfd, 0x68, 0x6c, 0xfe, 0xb5, 0x38, 0xf0, 0xe4, 0xe1, 0x63, 0xe7, 0xe6, - 0xd3, 0x3b, 0x37, 0x33, 0x70, 0xf9, 0x3b, 0xf8, 0x86, 0x2c, 0xd0, 0x7c, 0x8f, 0xf4, 0x8b, 0xae, - 0x2c, 0x42, 0xed, 0x3a, 0xfb, 0xef, 0x29, 0x67, 0x79, 0xa6, 0x2f, 0xb8, 0x2d, 0x2a, 0x5e, 0xbd, - 0xc8, 0xd9, 0x97, 0x73, 0x15, 0x57, 0xf8, 0x96, 0xaf, 0xe2, 0xfe, 0xb8, 0x28, 0x9f, 0x08, 0xa4, - 0x6f, 0x43, 0x4f, 0x7d, 0x23, 0x97, 0xd9, 0x83, 0x13, 0x6d, 0xa6, 0x99, 0x8d, 0x23, 0x0b, 0xf2, - 0x3e, 0x53, 0xc5, 0x86, 0x9a, 0x54, 0x77, 0x03, 0x71, 0x81, 0x71, 0xc5, 0x89, 0xaa, 0x8b, 0x46, - 0x95, 0xbc, 0x2c, 0xeb, 0x7f, 0xf9, 0xcb, 0xb2, 0x7f, 0x31, 0x0a, 0x67, 0xb7, 0x9c, 0x7d, 0xd7, - 0x63, 0x8b, 0xb6, 0x4d, 0x43, 0xbf, 0x13, 0x34, 0x28, 0xa9, 0xc2, 0xa4, 0xe9, 0xff, 0xd9, 0xc3, - 0xbb, 0x95, 0xed, 0x4b, 0x26, 0x8c, 0xcc, 0xc3, 0xa8, 0x7a, 0x73, 0x2a, 0x36, 0x93, 0x8c, 0xb7, - 0xa8, 0x2b, 0x7d, 0x76, 0x8c, 0x46, 0x3e, 0x30, 0xee, 0x77, 0xce, 0xa8, 0xe7, 0xd3, 0x88, 0x3b, - 0xcf, 0x1d, 0xf4, 0x3c, 0xbf, 0x69, 0x6e, 0x88, 0xfc, 0x12, 0xe3, 0x47, 0xa9, 0x2b, 0x9f, 0x41, - 0xa3, 0xc5, 0x29, 0xbb, 0x17, 0xea, 0x02, 0xb9, 0xe1, 0x9c, 0x33, 0x2e, 0x83, 0xbe, 0x82, 0xb1, - 0x87, 0x9d, 0x3d, 0x2a, 0x2f, 0xb7, 0x86, 0xc4, 0xfe, 0x98, 0xf4, 0x6a, 0x16, 0xe5, 0xbb, 0x77, - 0xf9, 0x18, 0x3c, 0xe9, 0xec, 0xd1, 0x74, 0x9c, 0x70, 0xb6, 0x30, 0x69, 0xcc, 0xc8, 0x01, 0x94, - 0x92, 0x0e, 0xc8, 0x22, 0x9a, 0x5a, 0x17, 0xb7, 0x69, 0x0c, 0xe5, 0xa1, 0x45, 0x23, 0xe7, 0x6e, - 0x91, 0x46, 0x25, 0x29, 0xae, 0xe4, 0xd7, 0x61, 0x26, 0xd3, 0xea, 0xa8, 0x9e, 0x50, 0x75, 0x37, - 0x68, 0xe2, 0xa2, 0x9e, 0x90, 0x9a, 0x7c, 0xaf, 0x65, 0xd4, 0x9c, 0x5d, 0x0b, 0x69, 0xc2, 0x99, - 0x84, 0x63, 0xad, 0x48, 0xb9, 0x90, 0xef, 0xaa, 0x8b, 0x1b, 0x93, 0x8c, 0x5a, 0x9a, 0x59, 0x57, - 0x92, 0x25, 0x59, 0x83, 0x51, 0x75, 0xdc, 0xc7, 0xd7, 0x59, 0xd9, 0xa6, 0x8d, 0xf2, 0xf1, 0x51, - 0x65, 0x3a, 0x36, 0x6d, 0x18, 0x3c, 0x63, 0x06, 0xe4, 0x37, 0xe0, 0xaa, 0x9a, 0xa2, 0x9b, 0x41, - 0xb6, 0x11, 0x48, 0x44, 0x3b, 0xbf, 0x91, 0x9c, 0xe1, 0x79, 0xf8, 0xbb, 0x77, 0x16, 0x8a, 0xe5, - 0xc2, 0x4a, 0x9f, 0xdd, 0x9b, 0x35, 0xf9, 0x69, 0x01, 0xce, 0xe5, 0xd4, 0x3a, 0x8e, 0xb5, 0xf6, - 0xb4, 0xcc, 0xa1, 0x72, 0x8f, 0xcf, 0x86, 0xdc, 0x66, 0xfc, 0xbc, 0x4e, 0x9a, 0xe8, 0x8c, 0x7e, - 0xe7, 0xd4, 0x44, 0xde, 0x86, 0x21, 0x3c, 0x23, 0x87, 0xe5, 0x09, 0xd4, 0x22, 0x31, 0x82, 0x0d, - 0x9e, 0xa4, 0xf5, 0x7d, 0x43, 0xe0, 0x90, 0x15, 0xa6, 0x8d, 0xe1, 0xbe, 0x25, 0xb5, 0x27, 0x11, - 0xef, 0x4a, 0x68, 0xf4, 0xbc, 0x48, 0x46, 0xb9, 0x30, 0xc2, 0xda, 0x9b, 0x64, 0x0b, 0x00, 0x23, - 0x81, 0x58, 0x95, 0x1e, 0x0c, 0x8c, 0x0c, 0x94, 0x06, 0xf9, 0x87, 0x23, 0x3d, 0xb6, 0x7f, 0x7b, - 0x84, 0x3f, 0xef, 0xdc, 0xf1, 0xdc, 0xc7, 0x6e, 0xbc, 0x80, 0xe9, 0xd6, 0xb5, 0x38, 0xbf, 0x8c, - 0xd0, 0x7d, 0x73, 0x32, 0xc9, 0x28, 0x43, 0x5c, 0xb1, 0xa7, 0x21, 0xee, 0xae, 0x76, 0x65, 0xa5, - 0x85, 0x88, 0xe4, 0x3a, 0x8e, 0x69, 0xf8, 0x8a, 0xef, 0xb2, 0xbe, 0x86, 0x21, 0x8c, 0xea, 0xc8, - 0xef, 0x03, 0xc7, 0xe6, 0x6f, 0x8a, 0x65, 0xbb, 0x4b, 0xf3, 0x79, 0x18, 0x48, 0xf1, 0x64, 0x9b, - 0x4b, 0x1c, 0x01, 0x86, 0xc4, 0x11, 0x42, 0xb6, 0x61, 0x6a, 0x2b, 0xa0, 0x4d, 0xe1, 0x37, 0xdc, - 0x0e, 0x84, 0x71, 0x82, 0x9b, 0x3d, 0x70, 0xcb, 0x6f, 0xcb, 0xe2, 0x3a, 0x55, 0xe5, 0xfa, 0x86, - 0x9a, 0x41, 0x4e, 0x96, 0x61, 0xb2, 0x46, 0x9d, 0xa0, 0x71, 0xf0, 0x90, 0x3e, 0x67, 0xea, 0x8e, - 0x91, 0x52, 0x21, 0xc4, 0x12, 0xd6, 0x5f, 0x2c, 0xd2, 0x7d, 0x3c, 0x4c, 0x22, 0xf2, 0x19, 0x0c, - 0xd5, 0xfc, 0x20, 0x5a, 0x78, 0x2e, 0x16, 0x35, 0x79, 0x63, 0xc4, 0x81, 0x0b, 0xe7, 0x65, 0x5a, - 0x89, 0xd0, 0x0f, 0xa2, 0xfa, 0x9e, 0x11, 0x12, 0x89, 0xa3, 0x90, 0xe7, 0x30, 0x6d, 0x2e, 0x28, - 0xc2, 0x9d, 0x75, 0x44, 0xa8, 0x59, 0x59, 0xab, 0x16, 0x47, 0x59, 0xb8, 0x2e, 0xb8, 0x5f, 0x49, - 0x2e, 0x5b, 0x8f, 0xb1, 0x5c, 0x8f, 0x52, 0x94, 0x45, 0x4f, 0xd6, 0x31, 0x1f, 0x07, 0xef, 0x51, - 0x35, 0xe4, 0x6e, 0xb0, 0xa3, 0x71, 0xd0, 0xad, 0x0e, 0x2e, 0x4a, 0x28, 0x09, 0x27, 0x4c, 0x26, - 0x71, 0xb1, 0x53, 0xa4, 0x64, 0x0b, 0xce, 0xee, 0x84, 0x74, 0x2b, 0xa0, 0x4f, 0x5d, 0xfa, 0x4c, - 0xf2, 0x83, 0x38, 0x42, 0x11, 0xe3, 0xd7, 0xe6, 0xa5, 0x59, 0x0c, 0xd3, 0xc4, 0xe4, 0x03, 0x80, - 0x2d, 0xd7, 0xf3, 0x68, 0x13, 0xaf, 0x1d, 0xc7, 0x90, 0x15, 0x9a, 0x54, 0xdb, 0x08, 0xad, 0xfb, - 0x5e, 0x4b, 0x17, 0xa9, 0x86, 0x4c, 0x16, 0x60, 0x62, 0xd5, 0x6b, 0xb4, 0x3a, 0xc2, 0x3d, 0x20, - 0xc4, 0x05, 0x45, 0x44, 0x4e, 0x73, 0x79, 0x41, 0x3d, 0xf5, 0x91, 0x9b, 0x24, 0xe4, 0x21, 0x10, - 0x01, 0x10, 0xb3, 0xd6, 0xd9, 0x6b, 0x51, 0xf1, 0xb9, 0xa3, 0xa9, 0x44, 0x32, 0xc2, 0xe9, 0x6e, - 0x04, 0x24, 0x4b, 0x91, 0xcd, 0x7d, 0x00, 0x63, 0xda, 0x9c, 0xcf, 0x88, 0x41, 0x30, 0xad, 0xc7, - 0x20, 0x18, 0xd5, 0x63, 0x0d, 0xfc, 0xa3, 0x02, 0x5c, 0xcc, 0xfe, 0x96, 0x84, 0x02, 0xb6, 0x09, - 0xa3, 0x0a, 0xa8, 0x5e, 0x9d, 0x48, 0xd5, 0x3f, 0xa1, 0x01, 0xf1, 0x0f, 0x5a, 0xae, 0x3c, 0x7a, - 0xef, 0x63, 0x1e, 0x2f, 0x60, 0x8f, 0xff, 0x7f, 0x46, 0x60, 0x1a, 0xbd, 0xab, 0x93, 0xeb, 0xd4, - 0xa7, 0x18, 0x4b, 0x04, 0x61, 0x9a, 0x79, 0x59, 0x58, 0x9a, 0x38, 0x3c, 0x19, 0xf8, 0xca, 0x20, - 0x20, 0xef, 0xea, 0x3e, 0x11, 0x45, 0x2d, 0xff, 0x87, 0x04, 0xea, 0x5d, 0x88, 0x9d, 0x25, 0xde, - 0x32, 0xae, 0xe4, 0x4f, 0xbc, 0xe8, 0x0d, 0x9c, 0x74, 0xd1, 0xdb, 0x51, 0x8b, 0x1e, 0x8f, 0x51, - 0xf1, 0xa6, 0xb6, 0xe8, 0xbd, 0xfa, 0xd5, 0x6e, 0xe8, 0x55, 0xaf, 0x76, 0xc3, 0x2f, 0xb7, 0xda, - 0x8d, 0xbc, 0xe0, 0x6a, 0x77, 0x0f, 0x26, 0x37, 0x28, 0x6d, 0x6a, 0x17, 0x25, 0xa3, 0xf1, 0xee, - 0xe9, 0x51, 0x34, 0x81, 0x65, 0xdd, 0x96, 0x24, 0xa8, 0x72, 0x57, 0x4d, 0xf8, 0xbb, 0x59, 0x35, - 0xc7, 0x5e, 0xf1, 0xaa, 0x39, 0xfe, 0x32, 0xab, 0x66, 0x6a, 0xe9, 0x9b, 0x38, 0xf5, 0xd2, 0xf7, - 0x32, 0xab, 0xd5, 0x27, 0xe8, 0x52, 0x58, 0xab, 0xad, 0x08, 0xef, 0x11, 0xcd, 0x5d, 0x63, 0xc5, - 0x0f, 0xa5, 0xc7, 0x35, 0xfe, 0xcd, 0x60, 0x5b, 0x7e, 0x20, 0xaf, 0xbc, 0xf1, 0x6f, 0x6b, 0x01, - 0x1d, 0x09, 0x75, 0x7a, 0xe5, 0xae, 0x3f, 0x2c, 0x9e, 0xec, 0x89, 0x35, 0x2e, 0x79, 0x8c, 0xb2, - 0x65, 0xb9, 0xf5, 0x57, 0x05, 0x7e, 0x29, 0xf9, 0xbf, 0xe3, 0x52, 0xf9, 0x32, 0x17, 0x85, 0xbf, - 0x15, 0x3f, 0xe5, 0x17, 0x61, 0x07, 0x02, 0xa7, 0xf1, 0x24, 0xbe, 0xa9, 0xfd, 0x21, 0xfb, 0xce, - 0xf5, 0x02, 0x0c, 0xac, 0x1a, 0x9f, 0x15, 0xcd, 0xc2, 0xdd, 0x3b, 0x72, 0x01, 0x10, 0x11, 0x0d, - 0x38, 0xd8, 0x5c, 0x00, 0x74, 0x02, 0xf4, 0x95, 0x3b, 0x63, 0xd9, 0xfc, 0x25, 0x7a, 0x66, 0x0b, - 0xde, 0x4b, 0xbf, 0xa5, 0xc6, 0xc3, 0x48, 0xfc, 0x96, 0x5a, 0x17, 0x63, 0xfc, 0xaa, 0x7a, 0x07, - 0x2e, 0xd8, 0xf4, 0xd0, 0x7f, 0x4a, 0x5f, 0x2d, 0xdb, 0x1f, 0xc0, 0x79, 0x93, 0x21, 0x7f, 0x75, - 0xc3, 0x03, 0xa2, 0x7f, 0x92, 0x1d, 0x46, 0x5d, 0x10, 0xf0, 0x30, 0xea, 0x3c, 0x1a, 0x33, 0xfb, - 0x53, 0xdf, 0x37, 0xb0, 0xcc, 0xf2, 0xe1, 0xa2, 0xc9, 0xbc, 0xda, 0x6c, 0x62, 0xb6, 0xc5, 0x86, - 0xdb, 0x76, 0xbc, 0x88, 0x6c, 0xc2, 0x98, 0xf6, 0x33, 0x61, 0x2a, 0xd0, 0x4a, 0x84, 0x4e, 0x13, - 0x03, 0x8c, 0x10, 0x9c, 0x31, 0xd8, 0xa2, 0x50, 0x49, 0x8a, 0x87, 0x89, 0x4c, 0xaf, 0x73, 0x01, - 0x26, 0xb4, 0x9f, 0xca, 0x64, 0x89, 0x1f, 0xbf, 0x56, 0x83, 0x29, 0x30, 0x93, 0xc4, 0x6a, 0xc0, - 0x5c, 0x96, 0xd0, 0x30, 0x3a, 0xd3, 0x73, 0xb2, 0x1c, 0xc7, 0x79, 0xea, 0xed, 0x6d, 0x77, 0x26, - 0x2f, 0xc6, 0x93, 0xf5, 0xff, 0x0f, 0xc0, 0x05, 0x31, 0x18, 0xaf, 0x72, 0xc4, 0xc9, 0x8f, 0x60, - 0x4c, 0x1b, 0x63, 0x21, 0xf4, 0x2b, 0x32, 0xf4, 0x66, 0xde, 0x5c, 0xe0, 0x26, 0x8d, 0x0e, 0x02, - 0xea, 0x89, 0xe1, 0x5e, 0xe9, 0xb3, 0x75, 0x96, 0xa4, 0x05, 0x93, 0xe6, 0x40, 0x0b, 0xab, 0xce, - 0xb5, 0xcc, 0x4a, 0x4c, 0x54, 0x19, 0xc8, 0xb9, 0x59, 0xcf, 0x1c, 0xee, 0x95, 0x3e, 0x3b, 0xc1, - 0x9b, 0x7c, 0x03, 0x67, 0x53, 0xa3, 0x2c, 0x8c, 0x75, 0x6f, 0x64, 0x56, 0x98, 0xc2, 0xe6, 0xe6, - 0xd8, 0x00, 0xc1, 0xb9, 0xd5, 0xa6, 0x2b, 0x21, 0x4d, 0x18, 0xd7, 0x07, 0x5e, 0x98, 0x9d, 0xae, - 0x76, 0x11, 0x25, 0x47, 0xe4, 0xca, 0x9d, 0x90, 0x25, 0x8e, 0xfd, 0x73, 0xd3, 0xc4, 0x6c, 0x20, - 0x8f, 0xc0, 0x10, 0xff, 0xcd, 0x96, 0x80, 0xad, 0x80, 0x86, 0xd4, 0x6b, 0x50, 0xc3, 0x41, 0xfb, - 0x25, 0x97, 0x80, 0x7f, 0x5d, 0x80, 0x72, 0x16, 0xdf, 0x1a, 0xf5, 0x9a, 0x64, 0x0b, 0x4a, 0xc9, - 0x8a, 0xc4, 0xac, 0xb6, 0x54, 0xac, 0xdc, 0xdc, 0x26, 0xad, 0xf4, 0xd9, 0x29, 0x6a, 0xb2, 0x01, - 0x67, 0x35, 0x98, 0x30, 0xae, 0x16, 0x4f, 0x62, 0x5c, 0x65, 0xa3, 0x90, 0x22, 0xd5, 0x6d, 0xd3, - 0x2b, 0xb8, 0x33, 0x2e, 0xf9, 0x87, 0x8e, 0xeb, 0x31, 0x45, 0x57, 0x0b, 0xf5, 0x04, 0x31, 0x54, - 0xc8, 0x86, 0x5b, 0x5b, 0x11, 0x2a, 0x1f, 0x94, 0x28, 0x14, 0xeb, 0x63, 0x5c, 0xc1, 0x85, 0x8d, - 0x8e, 0x3f, 0x4f, 0x55, 0xcc, 0xae, 0xc0, 0xe0, 0xf6, 0x5a, 0x6d, 0xb1, 0x2a, 0x1e, 0xbb, 0xf2, - 0x10, 0x09, 0xad, 0xb0, 0xde, 0x70, 0x6c, 0x5e, 0x60, 0x7d, 0x04, 0xe4, 0x3e, 0x8d, 0x44, 0xb0, - 0x76, 0x45, 0xf7, 0x3a, 0x0c, 0x0b, 0x90, 0xa0, 0x44, 0xd7, 0xb8, 0x96, 0xc0, 0x92, 0x65, 0xd6, - 0x96, 0x3c, 0x27, 0xb4, 0xa8, 0x13, 0x6a, 0x1b, 0xf3, 0xfb, 0x30, 0x12, 0x08, 0x98, 0xd8, 0x97, - 0x27, 0x55, 0x5a, 0x0b, 0x04, 0x73, 0x7b, 0xb6, 0xc4, 0xb1, 0xd5, 0x5f, 0xd6, 0x1a, 0x86, 0x33, - 0xd9, 0x5c, 0x5d, 0x5a, 0x64, 0x52, 0x15, 0xc2, 0x92, 0xc3, 0x71, 0x0b, 0x7d, 0xc8, 0x23, 0xaa, - 0x3f, 0x75, 0x45, 0xd1, 0xe0, 0x47, 0x2e, 0x82, 0xf8, 0x68, 0x28, 0xd6, 0x5d, 0x15, 0x1c, 0x25, - 0x83, 0x5b, 0x5e, 0x7a, 0x86, 0x0d, 0x0c, 0xfb, 0x72, 0x1f, 0xdd, 0x65, 0x5e, 0x45, 0x23, 0x1c, - 0x98, 0xe3, 0xdb, 0x3c, 0xeb, 0x95, 0x48, 0x40, 0xe7, 0xab, 0xa5, 0x71, 0x11, 0x46, 0x15, 0x4c, - 0xdd, 0x7d, 0x71, 0x59, 0x19, 0xf8, 0xbb, 0x77, 0xf9, 0xab, 0xe0, 0x86, 0x62, 0x10, 0xd3, 0xb1, - 0x2a, 0xf8, 0x77, 0xf7, 0x2d, 0x57, 0x11, 0xd2, 0x20, 0xfa, 0x56, 0xab, 0x88, 0xe3, 0x02, 0x9d, - 0xa6, 0x0a, 0x03, 0x7f, 0x77, 0xfe, 0x24, 0x82, 0xfa, 0x96, 0xab, 0x60, 0x82, 0xfa, 0xf6, 0xaa, - 0xa0, 0x32, 0x80, 0x12, 0x9f, 0xa4, 0xa9, 0x4a, 0x96, 0xd3, 0x95, 0x48, 0xc3, 0x75, 0x82, 0xa2, - 0xeb, 0x78, 0x50, 0xb8, 0xc8, 0x85, 0xf5, 0x4b, 0xa8, 0x86, 0x09, 0xec, 0xdb, 0xad, 0xe6, 0x1f, - 0x14, 0x78, 0x38, 0xa7, 0xda, 0xa6, 0x96, 0xfa, 0xd1, 0x7b, 0xec, 0x6b, 0x57, 0xf3, 0xda, 0xd7, - 0xfe, 0xd0, 0xf5, 0x9a, 0xfa, 0xd5, 0xbc, 0xd3, 0x89, 0x0e, 0x54, 0xb8, 0xe3, 0x27, 0xae, 0xd7, - 0xb4, 0x93, 0xd8, 0xe4, 0x03, 0x98, 0xd0, 0x40, 0x4a, 0x5b, 0xe3, 0x39, 0x23, 0x74, 0x72, 0xb7, - 0x69, 0x9b, 0x98, 0xd6, 0xdf, 0x16, 0x60, 0x2a, 0x23, 0x29, 0x31, 0x1a, 0x33, 0xf0, 0x14, 0xa4, - 0x16, 0x2a, 0x91, 0x30, 0x09, 0x23, 0x4b, 0x18, 0x9b, 0xa4, 0x42, 0xc4, 0x68, 0xf9, 0x5a, 0x02, - 0xe5, 0xa2, 0x96, 0xba, 0x2b, 0x3b, 0x69, 0xb2, 0x8e, 0x4e, 0x42, 0x80, 0xb8, 0x25, 0xc2, 0x6c, - 0x5c, 0x63, 0x2a, 0xad, 0x96, 0x7d, 0xf9, 0x95, 0xa4, 0x7f, 0xd6, 0xaa, 0xb1, 0x7e, 0xab, 0x08, - 0xe7, 0x32, 0xfa, 0x5f, 0xa3, 0xd1, 0xdf, 0x85, 0x08, 0x12, 0x39, 0xb0, 0xfb, 0x7f, 0x49, 0x39, - 0xb0, 0xad, 0x7f, 0x5f, 0x84, 0x73, 0x3b, 0xed, 0x10, 0x5f, 0x58, 0xad, 0x7a, 0x4f, 0xa9, 0x17, - 0xf9, 0xc1, 0x73, 0x7c, 0x15, 0x42, 0xde, 0x85, 0xc1, 0x15, 0xda, 0x6a, 0xf9, 0x62, 0xfe, 0x5f, - 0x92, 0xde, 0x11, 0x49, 0x6c, 0x44, 0x5a, 0xe9, 0xb3, 0x39, 0x36, 0xf9, 0x00, 0x46, 0x57, 0xa8, - 0x13, 0x44, 0x7b, 0xd4, 0x91, 0x47, 0x16, 0x99, 0xc9, 0x42, 0x23, 0x11, 0x08, 0x2b, 0x7d, 0x76, - 0x8c, 0x4d, 0xe6, 0xd9, 0x69, 0xde, 0xdb, 0x57, 0xaf, 0xc9, 0x73, 0x2a, 0x64, 0x38, 0x2b, 0x7d, - 0x36, 0xe2, 0x92, 0x75, 0x98, 0xa8, 0xee, 0x53, 0x2f, 0x5a, 0xa7, 0x91, 0xd3, 0x74, 0x22, 0x47, - 0xa8, 0xb6, 0xaf, 0xe7, 0x11, 0x1b, 0xc8, 0x2b, 0x7d, 0xb6, 0x49, 0x4d, 0x3e, 0x82, 0xe1, 0xfb, - 0xbe, 0xdf, 0xdc, 0x7b, 0x4e, 0x85, 0xba, 0x5a, 0xc9, 0x63, 0x24, 0xd0, 0x56, 0xfa, 0x6c, 0x49, - 0xb1, 0x30, 0x08, 0xfd, 0xeb, 0xe1, 0xbe, 0x75, 0x54, 0x80, 0xf2, 0x92, 0xff, 0xcc, 0xcb, 0x94, - 0xea, 0xf7, 0x4c, 0xa9, 0x4a, 0xf6, 0x19, 0xf8, 0x09, 0xb9, 0xbe, 0x03, 0x03, 0x5b, 0xae, 0xb7, - 0x9f, 0x50, 0x05, 0x33, 0xe8, 0x18, 0x16, 0x8a, 0xc7, 0xf5, 0xf6, 0xc9, 0x9a, 0xd4, 0xc1, 0x85, - 0xad, 0xb1, 0xdf, 0x50, 0xfc, 0x33, 0xa8, 0x75, 0xec, 0x58, 0xd7, 0xe6, 0xbf, 0x65, 0x07, 0xdf, - 0x82, 0xd9, 0x9c, 0x7a, 0xc5, 0xf3, 0x70, 0xd6, 0xb7, 0x01, 0x54, 0x6c, 0xde, 0x84, 0x99, 0xcc, - 0xf1, 0x4b, 0x21, 0xfe, 0x93, 0xac, 0x89, 0xc8, 0x7b, 0x5e, 0x86, 0x61, 0x99, 0x2d, 0x89, 0xdb, - 0x7e, 0xe4, 0x4f, 0x7c, 0x20, 0x25, 0x3f, 0x54, 0x19, 0xd8, 0x43, 0x7e, 0x8f, 0xbb, 0x5a, 0x20, - 0x25, 0xfe, 0x39, 0x7d, 0xf8, 0x12, 0x1f, 0x8d, 0xe2, 0xc5, 0xea, 0x5c, 0xf1, 0xc3, 0xc8, 0x53, - 0x9e, 0xb7, 0xb6, 0xfa, 0x4d, 0x6e, 0x40, 0x49, 0xa6, 0x73, 0x10, 0x79, 0x63, 0x44, 0xc6, 0x6e, - 0x3b, 0x05, 0x27, 0xef, 0xc3, 0x6c, 0x12, 0x26, 0x7b, 0xc9, 0x5f, 0xb8, 0xe5, 0x15, 0x5b, 0x7f, - 0x59, 0xc4, 0x58, 0xd7, 0x5d, 0xe6, 0x35, 0x93, 0xee, 0x66, 0x4d, 0x48, 0xab, 0xb8, 0x59, 0x23, - 0x17, 0x61, 0x74, 0xb3, 0x66, 0xa4, 0x9c, 0xb2, 0x63, 0x00, 0x6b, 0x36, 0xeb, 0x42, 0x35, 0x68, - 0x1c, 0xb8, 0x11, 0x6d, 0x44, 0x9d, 0x40, 0xac, 0xc2, 0x76, 0x0a, 0x4e, 0x2c, 0x18, 0xbf, 0xdf, - 0x72, 0xf7, 0x1a, 0x92, 0x19, 0x17, 0x81, 0x01, 0x23, 0x6f, 0xc0, 0xe4, 0xaa, 0x17, 0x46, 0x4e, - 0xab, 0xb5, 0x4e, 0xa3, 0x03, 0xbf, 0x29, 0x92, 0x66, 0xda, 0x09, 0x28, 0xab, 0x77, 0xd1, 0xf7, - 0x22, 0xc7, 0xf5, 0x68, 0x60, 0x77, 0xbc, 0xc8, 0x3d, 0xa4, 0xa2, 0xef, 0x29, 0x38, 0x79, 0x07, - 0x66, 0x14, 0x6c, 0x33, 0x68, 0x1c, 0xd0, 0x30, 0x0a, 0x30, 0x11, 0x1d, 0x06, 0xfc, 0xb1, 0xb3, - 0x0b, 0xb1, 0x86, 0x96, 0xdf, 0x69, 0x2e, 0x7b, 0x4f, 0xdd, 0xc0, 0xf7, 0x30, 0x37, 0xc5, 0x88, - 0xa8, 0x21, 0x01, 0xb7, 0xfe, 0x70, 0x24, 0xf3, 0xb3, 0x7d, 0x99, 0x39, 0xf8, 0x25, 0x8c, 0x2f, - 0x3a, 0x6d, 0x67, 0xcf, 0x6d, 0xb9, 0x91, 0xab, 0x32, 0x76, 0xbd, 0xdb, 0xe3, 0x9b, 0x97, 0x09, - 0x3e, 0x68, 0x53, 0x27, 0xb6, 0x0d, 0x56, 0x73, 0x7f, 0x33, 0x04, 0x33, 0x99, 0x78, 0xe4, 0xba, - 0x48, 0xed, 0xa5, 0xd6, 0x55, 0x91, 0xec, 0xca, 0x4e, 0x82, 0xd9, 0x58, 0x22, 0x68, 0xb1, 0x45, - 0x1d, 0xaf, 0x23, 0x52, 0x5d, 0xd9, 0x06, 0x8c, 0x8d, 0x25, 0xd3, 0x1b, 0x34, 0x66, 0xe8, 0x38, - 0x6d, 0x27, 0xa0, 0xe4, 0x0a, 0x8c, 0x31, 0x88, 0x64, 0x35, 0xc0, 0x9f, 0xf8, 0x69, 0x20, 0xc6, - 0x69, 0xc3, 0x6f, 0x52, 0x8d, 0xd3, 0x20, 0xe7, 0x64, 0x42, 0x19, 0x27, 0x06, 0x91, 0x9c, 0x86, - 0x38, 0x27, 0x0d, 0x44, 0x5e, 0x83, 0x89, 0x6a, 0xbb, 0xad, 0x31, 0xc2, 0x1c, 0x57, 0xb6, 0x09, - 0x24, 0x97, 0x01, 0xaa, 0xed, 0xb6, 0x64, 0x83, 0xf9, 0xab, 0x6c, 0x0d, 0x42, 0x6e, 0xc6, 0xe1, - 0xca, 0x34, 0x56, 0x78, 0x9d, 0x60, 0x67, 0x94, 0x30, 0xb9, 0xaa, 0xd8, 0x4e, 0x82, 0x29, 0x70, - 0xb9, 0x26, 0xc0, 0xe4, 0x63, 0x38, 0x9f, 0xf0, 0xbb, 0xd0, 0x2a, 0x40, 0x53, 0xbf, 0x9d, 0x8f, - 0x40, 0xde, 0x83, 0x73, 0x89, 0x42, 0x59, 0x1d, 0x5a, 0xf5, 0xed, 0x9c, 0x52, 0xf2, 0x21, 0x94, - 0x13, 0xcf, 0xb6, 0xe3, 0x4a, 0xd1, 0x82, 0x6f, 0xe7, 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0xfe, 0x4b, - 0x54, 0x89, 0x97, 0x95, 0x76, 0x76, 0x21, 0x59, 0x81, 0x4a, 0xa6, 0x2f, 0x8b, 0x56, 0x31, 0xe6, - 0xe5, 0xb2, 0x7b, 0xa1, 0x91, 0x05, 0xb8, 0x98, 0x89, 0x22, 0x9b, 0x81, 0xd9, 0xba, 0xec, 0xae, - 0x38, 0x64, 0x1e, 0xa6, 0x63, 0x9f, 0x1e, 0xad, 0x09, 0x98, 0xa8, 0xcb, 0xce, 0x2c, 0x23, 0x6f, - 0x9b, 0x8f, 0xf3, 0x79, 0x65, 0x98, 0xa7, 0xcb, 0x4e, 0x17, 0x58, 0xc7, 0x05, 0xb8, 0x98, 0xb9, - 0x51, 0x4a, 0x7d, 0x7e, 0x2e, 0xa9, 0x38, 0x6a, 0x6b, 0xc1, 0x0d, 0x18, 0x40, 0x05, 0x9f, 0xdb, - 0x8a, 0xa5, 0xaf, 0x29, 0xd2, 0x73, 0x56, 0xac, 0xd4, 0x46, 0x1c, 0x72, 0x5f, 0xdd, 0x0d, 0xf6, - 0xa3, 0x25, 0xe3, 0x56, 0x52, 0x81, 0xca, 0xa8, 0x5c, 0xbf, 0x23, 0x94, 0xb7, 0x81, 0x2f, 0x73, - 0x0d, 0xf3, 0x97, 0x05, 0xa8, 0xf4, 0xd0, 0x0f, 0x54, 0x9f, 0x0a, 0x27, 0xe8, 0xd3, 0x03, 0xd5, - 0x27, 0xfe, 0x36, 0x76, 0xfe, 0x64, 0x3a, 0xc8, 0xab, 0xee, 0x56, 0x07, 0x48, 0x5a, 0x0d, 0x25, - 0xdf, 0x85, 0xd1, 0x5a, 0x6d, 0xc5, 0x70, 0xe8, 0x4b, 0x5d, 0x0e, 0xc5, 0x18, 0xe4, 0xf6, 0x89, - 0x3c, 0xf8, 0x34, 0xff, 0x3d, 0x6b, 0x09, 0xca, 0x79, 0x1a, 0x24, 0x2e, 0x2c, 0x3c, 0xb6, 0x96, - 0x76, 0xb1, 0xc4, 0x17, 0x16, 0x13, 0x6c, 0xbd, 0x07, 0xe7, 0x14, 0x35, 0x4f, 0xda, 0xa1, 0x3d, - 0xfc, 0x17, 0xc7, 0x4e, 0x15, 0x60, 0x20, 0x06, 0x58, 0x7f, 0x31, 0x90, 0x22, 0xac, 0x75, 0x0e, - 0x0f, 0x9d, 0xe0, 0x39, 0xa9, 0x9a, 0x84, 0xfd, 0x3d, 0x35, 0xfd, 0x85, 0x81, 0x9f, 0x1d, 0x55, - 0xfa, 0x34, 0xee, 0x6c, 0x39, 0xc6, 0x8d, 0xdd, 0x6b, 0x50, 0x7e, 0x25, 0x55, 0xe4, 0xc1, 0x8d, - 0x0c, 0x20, 0xd9, 0x85, 0x09, 0xb1, 0x65, 0xe2, 0x6f, 0x39, 0xb5, 0x6f, 0x27, 0xa7, 0xb6, 0xd1, - 0xbc, 0x9b, 0x06, 0x09, 0x9f, 0x04, 0x26, 0x1b, 0xf2, 0x25, 0x4c, 0x4a, 0x05, 0x49, 0x30, 0xe6, - 0x4e, 0x44, 0x77, 0xba, 0x33, 0x36, 0x69, 0x38, 0xe7, 0x04, 0x23, 0xd6, 0x64, 0xb9, 0xc6, 0x70, - 0xce, 0x83, 0x27, 0x69, 0xb2, 0x41, 0x22, 0x9a, 0x6c, 0xc0, 0xe6, 0x3e, 0x03, 0x92, 0xee, 0x57, - 0xaf, 0x59, 0x3c, 0xa1, 0xcd, 0xe2, 0xb9, 0x2a, 0x4c, 0x65, 0x74, 0xe0, 0x54, 0x2c, 0x3e, 0x03, - 0x92, 0x6e, 0xe9, 0x69, 0x38, 0x58, 0xd7, 0xe1, 0x0d, 0x25, 0x02, 0x35, 0x1b, 0x0c, 0x9e, 0xd2, - 0xf0, 0xfc, 0x9b, 0x45, 0xa8, 0xf4, 0x40, 0x25, 0x7f, 0x50, 0x48, 0x4a, 0x9b, 0xcf, 0xc6, 0x0f, - 0x92, 0xd2, 0xce, 0xa6, 0xcf, 0x10, 0xfb, 0xc2, 0x87, 0x3f, 0xfd, 0xeb, 0x17, 0x56, 0xf8, 0xd3, - 0x43, 0x76, 0x7a, 0x69, 0x0d, 0xe8, 0xd2, 0xb2, 0x61, 0xda, 0x38, 0x2a, 0x9d, 0x64, 0xcf, 0xb8, - 0x0c, 0x20, 0x52, 0x7c, 0xae, 0xf9, 0xfb, 0x42, 0x3d, 0xd3, 0x20, 0xd6, 0x3d, 0x98, 0x49, 0xf0, - 0x14, 0xc6, 0xf0, 0xef, 0x82, 0x7a, 0xe0, 0x8d, 0x4c, 0xfb, 0x17, 0xce, 0xfe, 0xe2, 0xa8, 0x32, - 0xc1, 0x34, 0xe9, 0x9b, 0x71, 0xfc, 0x78, 0xf9, 0x97, 0xb5, 0xae, 0x9b, 0xf3, 0xab, 0x2d, 0x3d, - 0xf0, 0x0d, 0xb9, 0x03, 0x43, 0x1c, 0x92, 0x88, 0xd2, 0xac, 0x63, 0x8b, 0x35, 0x41, 0x20, 0x5a, - 0x33, 0xf8, 0x1c, 0x15, 0x7f, 0x54, 0xe3, 0xf0, 0x09, 0xd6, 0x0e, 0xcf, 0x5a, 0x12, 0x83, 0x55, - 0x24, 0xe8, 0x81, 0x6a, 0x1c, 0xe6, 0x41, 0xfa, 0x5e, 0x48, 0x3c, 0xcf, 0x7f, 0xd6, 0xa2, 0x4d, - 0x9e, 0x11, 0x6e, 0x61, 0x5c, 0xf8, 0x5e, 0x0c, 0x38, 0x8c, 0x01, 0x92, 0x59, 0x9f, 0xc2, 0x0c, - 0xdb, 0xa0, 0x83, 0x64, 0x7d, 0x98, 0xab, 0x80, 0xc1, 0x4c, 0x87, 0x76, 0x87, 0x81, 0xd0, 0xa1, - 0x5d, 0x14, 0x5a, 0x6b, 0x70, 0x9e, 0x1b, 0x03, 0xf5, 0x2e, 0xc5, 0xa6, 0xf7, 0x41, 0xfc, 0x9d, - 0x78, 0xcc, 0x98, 0xd1, 0x7b, 0x8e, 0x67, 0x7d, 0x82, 0xaf, 0x65, 0xc4, 0x24, 0x75, 0x7d, 0x2f, - 0xb6, 0xfc, 0x9d, 0xec, 0x79, 0xed, 0xff, 0x09, 0x17, 0xab, 0xed, 0x36, 0xf5, 0x9a, 0x31, 0xe1, - 0x76, 0xe0, 0x9c, 0x30, 0xf8, 0x01, 0xa9, 0xc2, 0x20, 0x62, 0xab, 0x7b, 0x4b, 0xd1, 0xdc, 0x8c, - 0xe6, 0x20, 0x9e, 0x08, 0xdb, 0x89, 0x15, 0x70, 0x4a, 0xab, 0x09, 0xb3, 0xb5, 0xce, 0xde, 0xa1, - 0x1b, 0xa1, 0x1b, 0x3c, 0x06, 0x10, 0x91, 0x75, 0xaf, 0xca, 0x44, 0x53, 0x5c, 0x18, 0xd7, 0xe3, - 0x57, 0x15, 0xe8, 0x49, 0x2f, 0x82, 0x8a, 0x3c, 0xbd, 0x73, 0x33, 0x26, 0x45, 0xab, 0x07, 0xaf, - 0x05, 0x8b, 0x45, 0x32, 0x2a, 0x6b, 0x0a, 0xce, 0xea, 0x77, 0x40, 0x7c, 0x86, 0xcc, 0xc0, 0x94, - 0x79, 0xb7, 0xc3, 0xc1, 0x5f, 0xc3, 0x34, 0xb7, 0x3d, 0xf3, 0xb0, 0xdb, 0xf3, 0x71, 0x84, 0xe9, - 0xe2, 0xee, 0x7c, 0xc2, 0xff, 0x1e, 0xdd, 0x72, 0x55, 0x42, 0x85, 0xdd, 0x79, 0xfe, 0xe2, 0xf1, - 0xe9, 0xbc, 0x71, 0x83, 0x58, 0xdc, 0x9d, 0x5f, 0x18, 0x16, 0xe1, 0x4b, 0x19, 0x77, 0x3e, 0xfc, - 0xdf, 0x0a, 0xf7, 0x79, 0x7c, 0x64, 0xbf, 0x42, 0x1d, 0x7c, 0x10, 0x93, 0xfd, 0x54, 0x79, 0x12, - 0x8a, 0x6e, 0x53, 0x9e, 0xd6, 0xdd, 0xa6, 0xf5, 0xa7, 0x05, 0xb8, 0xce, 0x75, 0xa0, 0x6c, 0x3a, - 0xbc, 0xe8, 0xc9, 0x21, 0x26, 0xef, 0x03, 0xcf, 0xda, 0x2e, 0x14, 0x4d, 0x4b, 0xb4, 0xbc, 0x1b, - 0x27, 0x4e, 0x40, 0xaa, 0x30, 0xae, 0x3f, 0x29, 0x39, 0x59, 0x78, 0x38, 0x7b, 0xec, 0xf0, 0xb1, - 0xa3, 0x9e, 0x99, 0x3c, 0x81, 0x0b, 0xcb, 0xdf, 0xb0, 0x09, 0x21, 0x76, 0x27, 0xa1, 0xb0, 0xc7, - 0x4f, 0x61, 0xcf, 0x6c, 0x8b, 0x19, 0x63, 0x9e, 0xa6, 0x93, 0x60, 0x76, 0x34, 0x95, 0x1b, 0x9c, - 0xd2, 0x9a, 0x47, 0x6d, 0x03, 0x66, 0xfd, 0x45, 0x01, 0x2e, 0x66, 0xd7, 0x26, 0x16, 0x96, 0x55, - 0x38, 0xbb, 0xe8, 0x78, 0xbe, 0xe7, 0x36, 0x9c, 0x56, 0xad, 0x71, 0x40, 0x9b, 0x1d, 0x15, 0xe4, - 0x54, 0xad, 0x32, 0xfb, 0xd4, 0x93, 0xe4, 0x12, 0xc5, 0x4e, 0x53, 0xb1, 0x43, 0x19, 0xbe, 0x4a, - 0xe0, 0x6b, 0x6f, 0x8b, 0x06, 0x8a, 0x1f, 0x6f, 0x59, 0x4e, 0x29, 0xb9, 0x2d, 0x8d, 0xec, 0xcd, - 0x1d, 0xcf, 0x8d, 0x14, 0x11, 0xb7, 0xae, 0x64, 0x15, 0x59, 0xff, 0xb6, 0x00, 0xe7, 0x31, 0xaf, - 0x91, 0x91, 0x29, 0x31, 0x8e, 0xf5, 0x2b, 0xc3, 0xd5, 0x16, 0x8c, 0x57, 0x16, 0x06, 0xb6, 0x19, - 0xb7, 0x96, 0xbc, 0x0d, 0x03, 0x35, 0xe9, 0x24, 0x35, 0x99, 0x48, 0x43, 0x2b, 0x53, 0xfe, 0xfb, - 0x41, 0x64, 0x23, 0x16, 0xdb, 0x73, 0x96, 0x68, 0xd8, 0xa0, 0x1e, 0xe6, 0x0b, 0xe6, 0x87, 0x7d, - 0x0d, 0x12, 0x87, 0x2a, 0x1a, 0xc8, 0x0b, 0x55, 0x34, 0x68, 0x86, 0x2a, 0xb2, 0x9e, 0xf2, 0xac, - 0x46, 0xc9, 0x0e, 0x89, 0x41, 0xfa, 0x24, 0x95, 0x5e, 0x98, 0xef, 0x03, 0xe7, 0xb2, 0x7a, 0xb6, - 0x7b, 0x37, 0x95, 0x39, 0x38, 0x3f, 0xb6, 0xee, 0x16, 0xbc, 0x66, 0xe0, 0x56, 0x5b, 0x2d, 0xff, - 0x19, 0x6d, 0x6e, 0x05, 0xfe, 0xa1, 0x1f, 0x19, 0x59, 0x5d, 0x44, 0x7e, 0xed, 0xf8, 0x1a, 0x45, - 0xcc, 0xca, 0x04, 0xd8, 0xfa, 0x3f, 0xe0, 0xf5, 0x1e, 0x1c, 0x45, 0xa7, 0x6a, 0x70, 0xd6, 0x49, - 0x94, 0x49, 0x6f, 0x97, 0xd7, 0xb3, 0xfa, 0x95, 0x64, 0x14, 0xda, 0x69, 0xfa, 0x1b, 0xdb, 0x46, - 0x4a, 0x5e, 0x52, 0x86, 0xe9, 0x2d, 0x7b, 0x73, 0x69, 0x67, 0x71, 0xbb, 0xbe, 0xfd, 0xe5, 0xd6, - 0x72, 0x7d, 0x67, 0xe3, 0xe1, 0xc6, 0xe6, 0xa3, 0x0d, 0x1e, 0x9c, 0xda, 0x28, 0xd9, 0x5e, 0xae, - 0xae, 0x97, 0x0a, 0x64, 0x1a, 0x4a, 0x06, 0x78, 0x79, 0x67, 0xa1, 0x54, 0xbc, 0xf1, 0xb5, 0x91, - 0x6a, 0x96, 0x5c, 0x84, 0x72, 0x6d, 0x67, 0x6b, 0x6b, 0xd3, 0x56, 0x5c, 0xf5, 0xd0, 0xd8, 0x33, - 0x70, 0xd6, 0x28, 0xbd, 0x67, 0x2f, 0x2f, 0x97, 0x0a, 0xac, 0x29, 0x06, 0x78, 0xcb, 0x5e, 0x5e, - 0x5f, 0xdd, 0x59, 0x2f, 0x15, 0x6f, 0xd4, 0xf5, 0xa7, 0x5d, 0xe4, 0x02, 0xcc, 0x2e, 0x2d, 0xef, - 0xae, 0x2e, 0x2e, 0x67, 0xf1, 0x9e, 0x86, 0x92, 0x5e, 0xb8, 0xbd, 0xb9, 0xbd, 0xc5, 0x59, 0xeb, - 0xd0, 0x47, 0xcb, 0x0b, 0xd5, 0x9d, 0xed, 0x95, 0x8d, 0x52, 0xbf, 0x35, 0x30, 0x52, 0x2c, 0x15, - 0x6f, 0xfc, 0xc8, 0x78, 0xf7, 0xc5, 0x9a, 0x2f, 0xd0, 0x77, 0x6a, 0xd5, 0xfb, 0xf9, 0x55, 0xf0, - 0xd2, 0xf5, 0x7b, 0xd5, 0x52, 0x81, 0x5c, 0x82, 0xf3, 0x06, 0x74, 0xab, 0x5a, 0xab, 0x3d, 0xda, - 0xb4, 0x97, 0xd6, 0x96, 0x6b, 0xb5, 0x52, 0xf1, 0xc6, 0xae, 0x11, 0x9e, 0x8d, 0xd5, 0xb0, 0x7e, - 0xaf, 0x5a, 0xb7, 0x97, 0x3f, 0xdf, 0x59, 0xb5, 0x97, 0x97, 0xd2, 0x35, 0x18, 0xa5, 0x5f, 0x2e, - 0xd7, 0x4a, 0x05, 0x32, 0x05, 0x67, 0x0c, 0xe8, 0xc6, 0x66, 0xa9, 0x78, 0xe3, 0x0d, 0x11, 0xc1, - 0x8b, 0x4c, 0x02, 0x2c, 0x2d, 0xd7, 0x16, 0x97, 0x37, 0x96, 0x56, 0x37, 0xee, 0x97, 0xfa, 0xc8, - 0x04, 0x8c, 0x56, 0xd5, 0xcf, 0xc2, 0x8d, 0x0f, 0xe1, 0x4c, 0xe2, 0x44, 0xcd, 0x30, 0xd4, 0x61, - 0xb4, 0xd4, 0x87, 0xe2, 0x97, 0x3f, 0xd1, 0xac, 0xc9, 0x0f, 0xc7, 0xa5, 0xc2, 0x8d, 0x05, 0x99, - 0xfa, 0x54, 0xfb, 0xce, 0xc9, 0x18, 0x0c, 0x2f, 0x2d, 0xdf, 0xab, 0xee, 0xac, 0x6d, 0x97, 0xfa, - 0xd8, 0x8f, 0x45, 0x7b, 0xb9, 0xba, 0xbd, 0xbc, 0x54, 0x2a, 0x90, 0x51, 0x18, 0xac, 0x6d, 0x57, - 0xb7, 0x97, 0x4b, 0x45, 0x32, 0x02, 0x03, 0x3b, 0xb5, 0x65, 0xbb, 0xd4, 0x3f, 0xff, 0x47, 0x7f, - 0x50, 0xe0, 0xb6, 0x3d, 0xf9, 0x86, 0xe8, 0x6b, 0xed, 0x30, 0x29, 0x96, 0x3c, 0x91, 0xe7, 0x31, - 0xf7, 0xe4, 0x88, 0x5a, 0xc0, 0x5c, 0x97, 0xcb, 0x0e, 0x44, 0xb8, 0x5e, 0xb8, 0x5d, 0x20, 0x36, - 0x3a, 0x87, 0x24, 0xce, 0x56, 0x8a, 0x73, 0xf6, 0xf1, 0x77, 0xee, 0x52, 0xd7, 0x23, 0x19, 0xf9, - 0x35, 0xb0, 0x74, 0x9e, 0x39, 0x27, 0x90, 0xef, 0x9e, 0xec, 0xa4, 0x21, 0xeb, 0x7c, 0xe3, 0x64, - 0xe8, 0xe4, 0x01, 0x4c, 0x30, 0xdd, 0x5c, 0xa1, 0x91, 0x0b, 0x49, 0x42, 0xed, 0x38, 0x30, 0x77, - 0x31, 0xbb, 0x50, 0xa5, 0x62, 0x19, 0xc7, 0x8e, 0xf0, 0x83, 0x75, 0x48, 0x64, 0x94, 0x07, 0x09, - 0xe1, 0x2b, 0xfe, 0xdc, 0xd9, 0x04, 0x78, 0xf7, 0xce, 0xed, 0x02, 0xa9, 0x61, 0x88, 0x35, 0x43, - 0xc9, 0x27, 0xf2, 0x51, 0x5b, 0x5a, 0xfb, 0xe7, 0xad, 0xa9, 0xa8, 0xc4, 0x89, 0x39, 0xa7, 0x83, - 0x0d, 0x20, 0x69, 0xdd, 0x99, 0x5c, 0x89, 0xe7, 0x41, 0xb6, 0x5a, 0x3d, 0x77, 0x2e, 0xe5, 0xf3, - 0xb7, 0xcc, 0xb4, 0x27, 0xb2, 0x0c, 0x93, 0xe2, 0x09, 0xb7, 0xd0, 0xe6, 0x49, 0xb7, 0xf3, 0x40, - 0x2e, 0x9b, 0xfb, 0x28, 0x27, 0x75, 0x22, 0x20, 0x73, 0x71, 0x3f, 0x92, 0xc7, 0x84, 0xb9, 0x0b, - 0x99, 0x65, 0xa2, 0x7f, 0xf7, 0x60, 0xd2, 0x3c, 0x5c, 0x10, 0x39, 0x40, 0x99, 0x67, 0x8e, 0xdc, - 0x06, 0xd5, 0x61, 0x76, 0xdd, 0x71, 0xf1, 0x8a, 0x42, 0x78, 0x96, 0x49, 0xbf, 0x30, 0x52, 0xe9, - 0xe2, 0x28, 0x56, 0xa3, 0x5e, 0x53, 0x0d, 0x42, 0x5e, 0x58, 0x75, 0xfc, 0x6c, 0x6a, 0x52, 0x47, - 0x36, 0xfd, 0xea, 0x88, 0x65, 0x26, 0xc3, 0xcd, 0x72, 0x95, 0x9c, 0xcb, 0xf3, 0xee, 0x25, 0xeb, - 0xa8, 0xa4, 0x27, 0x38, 0x6a, 0x73, 0xe2, 0xd4, 0xec, 0xca, 0x18, 0x48, 0x40, 0x4b, 0x22, 0x2e, - 0x0a, 0x43, 0x92, 0x23, 0xb8, 0x5c, 0x66, 0xb7, 0x0b, 0xe4, 0x6b, 0xfc, 0xaa, 0x33, 0xd9, 0x3d, - 0x72, 0xa3, 0x03, 0xa1, 0xfd, 0x5c, 0xc8, 0x64, 0x20, 0x3e, 0x94, 0x2e, 0xdc, 0x6d, 0x98, 0xce, - 0x72, 0x28, 0x56, 0x02, 0xed, 0xe2, 0x6d, 0x9c, 0x3b, 0x0b, 0x6c, 0x76, 0xd4, 0x68, 0xe6, 0x0f, - 0x52, 0x17, 0x7f, 0xd6, 0x5c, 0x9e, 0x1f, 0xc3, 0x24, 0x9b, 0x25, 0x0f, 0x29, 0x6d, 0x57, 0x5b, - 0xee, 0x53, 0x1a, 0x12, 0x19, 0x1f, 0x57, 0x81, 0xf2, 0x68, 0xaf, 0x17, 0xc8, 0x77, 0x60, 0xec, - 0x91, 0x13, 0x35, 0x0e, 0x44, 0x9c, 0x48, 0x19, 0x46, 0x12, 0x61, 0x73, 0xf2, 0x17, 0x16, 0xde, - 0x2e, 0x90, 0xef, 0xc3, 0xf0, 0x7d, 0x1a, 0xe1, 0xa3, 0xe2, 0xab, 0xca, 0xb7, 0x8e, 0xdb, 0x26, - 0x57, 0x3d, 0xf5, 0x72, 0x46, 0x36, 0x38, 0x69, 0x40, 0x25, 0xb7, 0x00, 0xf8, 0x82, 0x80, 0x1c, - 0x92, 0xc5, 0x73, 0xa9, 0x66, 0x93, 0xfb, 0x4c, 0x79, 0x68, 0xd1, 0x88, 0x9e, 0xb4, 0xca, 0x3c, - 0x19, 0xad, 0xc1, 0xa4, 0xca, 0x5e, 0xb3, 0x81, 0xe1, 0x3c, 0xac, 0x04, 0xb3, 0xf0, 0x14, 0xdc, - 0x3e, 0x64, 0x5f, 0x05, 0x4f, 0xdd, 0x8a, 0x71, 0x1f, 0x70, 0x25, 0x9d, 0xd5, 0x83, 0x47, 0xe8, - 0x4b, 0xa8, 0x14, 0x22, 0x47, 0xd3, 0x68, 0x57, 0xfc, 0x30, 0x32, 0x69, 0x15, 0x24, 0x9b, 0xf6, - 0x57, 0x61, 0x4e, 0xaf, 0xd7, 0x0c, 0x54, 0x1c, 0xaf, 0xb9, 0x79, 0xf1, 0x8f, 0xe7, 0xae, 0x76, - 0xc1, 0x10, 0xe7, 0xb7, 0xfe, 0xdf, 0x2e, 0x16, 0x70, 0x39, 0x59, 0x82, 0x29, 0x59, 0xd7, 0x66, - 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0x66, 0x2a, 0x91, 0x9e, 0x1c, 0x1a, 0x4c, 0x72, 0x27, 0xe9, 0x22, - 0xb6, 0xf5, 0x19, 0xf1, 0x1d, 0x48, 0xb7, 0xa8, 0x0f, 0xf1, 0xd6, 0x97, 0x19, 0x41, 0xf7, 0x21, - 0x37, 0x2a, 0x19, 0xca, 0xff, 0xee, 0x3c, 0xe9, 0x72, 0x00, 0x9a, 0xcb, 0x39, 0x42, 0xdc, 0x2e, - 0x90, 0x2f, 0x81, 0xa4, 0x8f, 0x24, 0x4a, 0x84, 0xb9, 0xc7, 0x2f, 0x25, 0xc2, 0x2e, 0xe7, 0x99, - 0x65, 0x98, 0x52, 0xd1, 0x5d, 0xe2, 0x72, 0x92, 0xd3, 0x96, 0x2e, 0x3b, 0xd8, 0x4c, 0x06, 0x9b, - 0xdd, 0xf9, 0x2e, 0x8c, 0x32, 0xe1, 0xe4, 0x53, 0x98, 0x12, 0x73, 0xdf, 0x68, 0x4f, 0x49, 0x2d, - 0x63, 0xe2, 0x70, 0x93, 0xdb, 0x92, 0x07, 0x30, 0x53, 0x4b, 0x08, 0x9e, 0xfb, 0xb1, 0x9f, 0x37, - 0x59, 0x20, 0xb0, 0x46, 0x23, 0x2e, 0xf9, 0x6c, 0x5e, 0x0f, 0x81, 0x70, 0xdb, 0x92, 0x64, 0xf7, - 0xd4, 0xa5, 0xcf, 0xc8, 0xa5, 0x44, 0xd3, 0x19, 0x10, 0xd1, 0x70, 0x1d, 0xcc, 0xed, 0xd9, 0x36, - 0xcf, 0x5f, 0x8c, 0x50, 0xe3, 0x06, 0xfc, 0x8a, 0x41, 0x60, 0x5c, 0xa2, 0x8b, 0x71, 0x3c, 0x9f, - 0x8b, 0x41, 0x7e, 0x03, 0xa3, 0xb3, 0x76, 0x3f, 0x9d, 0x91, 0xef, 0x64, 0x1d, 0xa2, 0x73, 0xce, - 0x97, 0x73, 0x6f, 0x9f, 0x0c, 0x59, 0x9d, 0x87, 0x27, 0xee, 0xd3, 0x68, 0xab, 0xd5, 0xd9, 0x77, - 0x31, 0xb3, 0x25, 0x51, 0xb6, 0x27, 0x05, 0x12, 0xd3, 0x5b, 0x06, 0x45, 0x8b, 0x0b, 0x6a, 0xf4, - 0xc7, 0x64, 0x15, 0x4a, 0x7c, 0x1b, 0xd1, 0x58, 0x5c, 0x4a, 0xb1, 0x10, 0x28, 0x4e, 0xe0, 0x1c, - 0x86, 0xb9, 0xa3, 0x75, 0x8b, 0xbb, 0x1c, 0x11, 0xf9, 0x69, 0xeb, 0x7a, 0xea, 0x94, 0x01, 0x53, - 0x11, 0xeb, 0xd9, 0x88, 0xd8, 0x34, 0xa4, 0x91, 0x0c, 0x03, 0xc3, 0xf3, 0x9a, 0x5e, 0x8b, 0x75, - 0x86, 0x74, 0x69, 0xbc, 0x82, 0x24, 0x42, 0x96, 0xed, 0xde, 0x25, 0x2a, 0xd7, 0x6b, 0x06, 0xd3, - 0x37, 0x0c, 0xd5, 0xe6, 0x74, 0x7c, 0xdf, 0xc1, 0xad, 0x0c, 0x43, 0xdf, 0xcc, 0xc4, 0x6d, 0x63, - 0xbf, 0x25, 0xd5, 0x84, 0x46, 0xb5, 0x3b, 0x8f, 0x2b, 0x23, 0xdb, 0x6b, 0x99, 0x26, 0xdc, 0x09, - 0x02, 0xea, 0x71, 0xe2, 0x3c, 0xb5, 0x25, 0x8b, 0xfa, 0x13, 0x5c, 0xc1, 0x34, 0x6a, 0xfe, 0xdc, - 0xae, 0x17, 0x0b, 0x9e, 0x87, 0xe7, 0x76, 0x81, 0xbc, 0x0f, 0x23, 0xa2, 0x8d, 0x8c, 0xc8, 0x68, - 0x74, 0xd8, 0xa5, 0xd5, 0x48, 0x09, 0x5c, 0x48, 0xd8, 0x66, 0x13, 0x27, 0x6f, 0xf4, 0x79, 0x9b, - 0xdf, 0x67, 0x7b, 0x76, 0xf3, 0x45, 0x28, 0x17, 0xe5, 0xe6, 0x8d, 0x94, 0x65, 0x15, 0x89, 0x45, - 0x82, 0x7a, 0xec, 0xb2, 0x9c, 0x09, 0x53, 0xbf, 0x31, 0xe6, 0xa0, 0x0a, 0x1d, 0xa6, 0xd4, 0x6f, - 0x03, 0xdc, 0x6b, 0xcb, 0x5e, 0x85, 0x52, 0xb5, 0x81, 0x1b, 0x4a, 0x8d, 0x1e, 0x3a, 0xed, 0x03, - 0x3f, 0xa0, 0xea, 0xec, 0x93, 0x2c, 0x90, 0xbc, 0x66, 0x94, 0x82, 0x22, 0x0a, 0xd6, 0xa8, 0x83, - 0x81, 0x99, 0x67, 0x95, 0x86, 0x92, 0x28, 0xca, 0xa6, 0xe8, 0x72, 0xd6, 0x99, 0x5e, 0x64, 0xa7, - 0xb3, 0xd6, 0xcb, 0xb1, 0xf9, 0x10, 0x17, 0x0c, 0x85, 0x1c, 0xaa, 0x1d, 0x42, 0x81, 0xd4, 0xa9, - 0x50, 0xbe, 0xbc, 0x51, 0xa8, 0x55, 0x79, 0xf5, 0x1c, 0x8b, 0x25, 0x8f, 0x3a, 0xaf, 0xfa, 0xef, - 0xc1, 0xe4, 0x32, 0x5b, 0xd0, 0x3b, 0x4d, 0x97, 0x07, 0xa3, 0x27, 0x66, 0x74, 0xf1, 0x5c, 0xc2, - 0x15, 0x99, 0xfa, 0x0a, 0x49, 0x85, 0x05, 0x41, 0xee, 0x29, 0x1a, 0x4c, 0x8e, 0xc7, 0xb4, 0x64, - 0x2b, 0xf2, 0x01, 0xe0, 0x09, 0x5f, 0x98, 0x0c, 0x66, 0xb9, 0x62, 0x59, 0x6d, 0xb7, 0x5b, 0xd2, - 0xb2, 0xcd, 0x6f, 0xea, 0x5f, 0x37, 0x4e, 0xa2, 0xa9, 0x72, 0xc9, 0x3b, 0xad, 0x7b, 0x7e, 0xa1, - 0xa5, 0xa2, 0xcd, 0xe1, 0x99, 0x53, 0xde, 0x6b, 0x2e, 0xaa, 0xf0, 0xd1, 0xd5, 0x56, 0x2b, 0x45, - 0x1c, 0x92, 0xb7, 0x4c, 0xee, 0x59, 0x38, 0xbd, 0x6a, 0xc0, 0x93, 0x3e, 0x57, 0xde, 0xaa, 0xed, - 0x36, 0x5f, 0x2c, 0x2f, 0xab, 0x05, 0xc3, 0x2c, 0x48, 0x9f, 0xf4, 0x93, 0xe5, 0x62, 0x6d, 0x7f, - 0x80, 0xd3, 0x2c, 0xce, 0x57, 0x4b, 0xf4, 0x73, 0x73, 0x32, 0x5d, 0xaf, 0xd2, 0xe5, 0x12, 0x85, - 0x6a, 0x9f, 0x38, 0x93, 0x48, 0xdd, 0xaf, 0x0c, 0x3c, 0xa9, 0x94, 0xfe, 0x9c, 0xdf, 0xe5, 0xbc, - 0x62, 0x65, 0x70, 0x2d, 0x25, 0x73, 0x82, 0xab, 0x2e, 0xe7, 0xe4, 0x9a, 0x57, 0x5d, 0xce, 0x4d, - 0x26, 0xfe, 0x00, 0x4a, 0xc9, 0x74, 0xc4, 0x8a, 0x69, 0x4e, 0x9e, 0xe2, 0xdc, 0x31, 0xb9, 0x07, - 0xd3, 0xfa, 0x88, 0xaa, 0x7e, 0xe7, 0xad, 0xfe, 0x79, 0x7c, 0xb6, 0x61, 0x26, 0x33, 0x7b, 0xb0, - 0xda, 0x62, 0xbb, 0xe5, 0x16, 0xce, 0xe5, 0x4a, 0xe1, 0x5c, 0x76, 0x02, 0x71, 0xf2, 0x9a, 0x69, - 0x3f, 0xc8, 0x4e, 0xa7, 0x3c, 0xf7, 0x7a, 0x0f, 0x2c, 0x21, 0xd0, 0xaf, 0x71, 0x07, 0x4c, 0xd5, - 0x71, 0x55, 0xb3, 0x28, 0xe4, 0x54, 0x60, 0x75, 0x43, 0x51, 0x73, 0x60, 0x3a, 0xa3, 0x38, 0x5f, - 0xc4, 0xd7, 0xf2, 0x79, 0xc6, 0x13, 0x6b, 0x57, 0x46, 0x49, 0xce, 0x95, 0x4c, 0xd7, 0x44, 0xd3, - 0x5d, 0x8e, 0xa4, 0x73, 0x6a, 0x3e, 0x9c, 0xbc, 0xc9, 0xf9, 0xe6, 0xa5, 0xe9, 0xac, 0xf4, 0xe6, - 0x49, 0xeb, 0x4f, 0x56, 0xf6, 0x6a, 0x25, 0x86, 0xae, 0xf9, 0xd1, 0x77, 0xb9, 0x25, 0xc8, 0xe4, - 0xae, 0x5b, 0x82, 0x32, 0x59, 0x5f, 0xc9, 0x47, 0x88, 0x67, 0x84, 0x11, 0x7b, 0x5d, 0xf4, 0x5f, - 0x3f, 0x67, 0x65, 0x27, 0xb6, 0x56, 0x33, 0x22, 0x13, 0x45, 0x70, 0xb7, 0xe5, 0x47, 0x97, 0x23, - 0x96, 0x2e, 0x49, 0xbd, 0xbb, 0x1c, 0x87, 0xca, 0xf1, 0xc0, 0x25, 0x9a, 0x7d, 0xda, 0x61, 0xfb, - 0x1a, 0xce, 0xe7, 0x26, 0xf0, 0x26, 0x6f, 0xa6, 0x3e, 0xe8, 0x1c, 0x49, 0xe4, 0xb7, 0x74, 0xc2, - 0xc8, 0xbd, 0xad, 0x4c, 0x61, 0x89, 0x34, 0xdf, 0xa9, 0x15, 0x3b, 0x23, 0x07, 0xf8, 0x7d, 0xd4, - 0x7c, 0xb5, 0x3c, 0xde, 0xb9, 0x7d, 0xbd, 0x94, 0xc5, 0x27, 0x4c, 0xaf, 0xa9, 0x5a, 0xbb, 0xa4, - 0x26, 0x96, 0x2c, 0x38, 0xcd, 0x9a, 0x7a, 0x92, 0xa6, 0xe5, 0xf1, 0x59, 0x82, 0x31, 0x2d, 0x01, - 0x38, 0x39, 0x6f, 0x88, 0xc9, 0xd8, 0x25, 0xe7, 0x8c, 0xce, 0x99, 0x1b, 0xe4, 0x22, 0xda, 0x9c, - 0x55, 0x1a, 0xf1, 0xdc, 0x56, 0x5c, 0x48, 0xf3, 0x30, 0xec, 0xcd, 0x4a, 0x0a, 0xbc, 0x35, 0x17, - 0x93, 0xc2, 0x31, 0x1a, 0x94, 0xdf, 0x25, 0xa2, 0x8b, 0xa6, 0x47, 0x93, 0xf2, 0x35, 0xd4, 0x29, - 0x91, 0x65, 0x14, 0x93, 0xa1, 0xc8, 0x98, 0x7c, 0xe7, 0x94, 0xf1, 0x4c, 0x83, 0x76, 0xb1, 0x65, - 0x6c, 0xe1, 0xd3, 0x8e, 0x8c, 0x8c, 0xe8, 0x6a, 0x0d, 0xed, 0x9a, 0x30, 0x3d, 0x43, 0x3b, 0x53, - 0xab, 0x72, 0x2e, 0xc7, 0xae, 0x29, 0xd2, 0x73, 0x5b, 0xfa, 0x43, 0x6d, 0x55, 0x4e, 0xe5, 0x3d, - 0x27, 0xd7, 0x93, 0xaa, 0x59, 0x5e, 0x6a, 0xf4, 0x2e, 0xab, 0xfe, 0x74, 0x56, 0xca, 0x74, 0xcd, - 0x00, 0x9c, 0x9b, 0x4f, 0x3d, 0x43, 0x0a, 0x6a, 0x79, 0xcb, 0xe1, 0xd6, 0x25, 0x81, 0x7a, 0x6e, - 0x0b, 0xbf, 0xd2, 0x96, 0xb7, 0x44, 0xa2, 0x73, 0x75, 0xe0, 0xee, 0x91, 0x09, 0x3d, 0x97, 0xf7, - 0x06, 0x3e, 0x06, 0x4a, 0x67, 0x29, 0x57, 0xba, 0x4b, 0xb7, 0x1c, 0xe6, 0x99, 0xf6, 0xe1, 0x99, - 0x74, 0x17, 0x19, 0xbf, 0x73, 0x09, 0xeb, 0x6e, 0xaf, 0x86, 0xa9, 0x75, 0x38, 0x23, 0xbb, 0x79, - 0x62, 0x1d, 0xce, 0xcf, 0x7f, 0xde, 0xe5, 0xa0, 0x73, 0xa6, 0xe6, 0xee, 0x7b, 0x5a, 0x72, 0x72, - 0x75, 0xcc, 0x49, 0xe7, 0x4b, 0x57, 0x4b, 0x4c, 0x56, 0x2e, 0xf3, 0x4d, 0xa6, 0xe1, 0x70, 0xfd, - 0x5c, 0x4f, 0x33, 0x4d, 0xe6, 0xf2, 0xb3, 0x6b, 0xab, 0xe5, 0x26, 0x33, 0x2f, 0xb5, 0xc6, 0x50, - 0xcf, 0xf1, 0xac, 0x18, 0x66, 0xa4, 0x9b, 0x56, 0x0c, 0x33, 0x93, 0x42, 0xdf, 0x42, 0xbb, 0x8a, - 0xed, 0xb7, 0xa8, 0x6e, 0x57, 0xd1, 0x92, 0x06, 0x27, 0xcc, 0x1a, 0xe4, 0x23, 0x34, 0x6a, 0x74, - 0xb7, 0x84, 0xcc, 0x9a, 0x9c, 0x74, 0xdf, 0x91, 0x51, 0x95, 0x91, 0x59, 0x59, 0xd1, 0x93, 0x49, - 0xa1, 0xe7, 0xca, 0xe9, 0x02, 0x41, 0xff, 0xae, 0xb4, 0x8b, 0x60, 0x83, 0xcb, 0xa6, 0x3d, 0x29, - 0xbf, 0xcd, 0xef, 0x4a, 0xa3, 0x88, 0x41, 0x96, 0xca, 0xc7, 0x9c, 0x24, 0xfb, 0x1e, 0x8c, 0xc7, - 0xb9, 0x97, 0x77, 0xe7, 0x35, 0xc2, 0x44, 0x42, 0xe6, 0x24, 0xe1, 0xfb, 0xf2, 0xe2, 0x04, 0xeb, - 0x33, 0x0b, 0xbb, 0xdb, 0x4f, 0x3e, 0x91, 0x46, 0x18, 0xa3, 0xa5, 0xa9, 0x4c, 0xce, 0x5d, 0x56, - 0xee, 0x71, 0x3d, 0x61, 0xa4, 0x9a, 0x17, 0x19, 0x29, 0x5f, 0xd5, 0xbc, 0xc8, 0x4a, 0xd9, 0x1a, - 0x5f, 0x2c, 0x7c, 0x29, 0x2d, 0x0e, 0x31, 0xd3, 0x4b, 0x46, 0xb3, 0x52, 0x7c, 0x2f, 0xe7, 0x15, - 0x27, 0x59, 0xd7, 0xa0, 0x94, 0xcc, 0x6e, 0xa9, 0x8e, 0x6b, 0x39, 0x69, 0x48, 0xd5, 0x19, 0x30, - 0x37, 0x2d, 0xe6, 0x96, 0x34, 0x9f, 0x9b, 0x7c, 0xaf, 0x66, 0x37, 0x4a, 0x67, 0xdd, 0x5d, 0x2d, - 0x8b, 0x13, 0x5d, 0xea, 0x07, 0xe9, 0x54, 0x22, 0x4d, 0x5d, 0x2d, 0xcb, 0xc8, 0x8d, 0xe9, 0xca, - 0x70, 0x4e, 0xd9, 0xf9, 0xb6, 0xdf, 0x32, 0x4f, 0xb8, 0x5d, 0xa2, 0xa2, 0xf7, 0xbc, 0x64, 0x26, - 0xbf, 0x02, 0xb3, 0x39, 0x01, 0xa4, 0xc9, 0xeb, 0x09, 0x43, 0x6c, 0x76, 0x80, 0x69, 0x35, 0x41, - 0x32, 0x33, 0x50, 0xaf, 0xa3, 0x77, 0x82, 0x11, 0xb8, 0x21, 0x75, 0xe3, 0xf7, 0xc8, 0x8d, 0x0e, - 0x78, 0xa2, 0x65, 0x6d, 0xcd, 0xcd, 0x8c, 0xf8, 0x40, 0x6a, 0x78, 0x5e, 0x31, 0xa0, 0x19, 0x97, - 0x7e, 0x19, 0x0c, 0xe7, 0xb2, 0x19, 0xb2, 0xb5, 0x83, 0xcd, 0x85, 0x8c, 0xa8, 0x1a, 0x6a, 0x2e, - 0xe4, 0x47, 0xdc, 0xc8, 0x6d, 0xe6, 0x96, 0x54, 0xb0, 0xb2, 0x39, 0xe6, 0x07, 0xd8, 0xc8, 0xe5, - 0xf8, 0x80, 0x71, 0x4c, 0xc5, 0xcc, 0x20, 0x39, 0xe8, 0xdd, 0x57, 0x0f, 0x5b, 0xee, 0xd7, 0x26, - 0xd5, 0xbc, 0xd6, 0xbe, 0xbc, 0xe8, 0x1c, 0xb9, 0xed, 0x5b, 0x96, 0xdf, 0x53, 0x76, 0xfb, 0x4e, - 0xba, 0x63, 0xab, 0xeb, 0xb1, 0x44, 0xd8, 0x16, 0xa3, 0xa3, 0x1a, 0x7c, 0x2e, 0x07, 0x4e, 0x36, - 0xd0, 0xdd, 0x28, 0x09, 0xd5, 0x0e, 0xae, 0xd9, 0x71, 0x61, 0x72, 0xf9, 0xf1, 0x79, 0x6c, 0xc4, - 0xd5, 0x38, 0xcd, 0x3c, 0x4e, 0x04, 0xe4, 0x10, 0xf3, 0xd8, 0x80, 0x9e, 0x6e, 0x1e, 0x27, 0x18, - 0x9a, 0xf3, 0x38, 0xd9, 0xcc, 0xa4, 0x21, 0x20, 0x77, 0x54, 0x93, 0xcd, 0x54, 0xf3, 0x38, 0x9b, - 0x63, 0x7e, 0xfc, 0x93, 0x5c, 0x8e, 0x6a, 0x1e, 0x9b, 0x1c, 0x73, 0xd0, 0x4f, 0x38, 0x8f, 0x93, - 0x95, 0x98, 0xf3, 0xf8, 0x54, 0xed, 0x53, 0xf3, 0x38, 0xbb, 0x7d, 0xa7, 0x9e, 0xc7, 0x89, 0x80, - 0x41, 0x46, 0x47, 0xb3, 0xe6, 0x71, 0x12, 0x9f, 0xcf, 0xe3, 0x24, 0x34, 0x61, 0x80, 0xe9, 0x32, - 0x8f, 0x93, 0x94, 0x9f, 0x23, 0xbf, 0x44, 0xb0, 0x93, 0x93, 0xcc, 0xe4, 0xdc, 0x38, 0x29, 0xe4, - 0x11, 0x5a, 0xff, 0x12, 0xf0, 0x93, 0xcd, 0xe6, 0x8b, 0x79, 0x4c, 0x71, 0x3e, 0xef, 0x4a, 0x21, - 0x26, 0x9b, 0x6b, 0x9a, 0xb6, 0xb2, 0x63, 0xbd, 0x74, 0x69, 0xf0, 0x2e, 0x9b, 0x37, 0xcd, 0x2e, - 0x7c, 0xbb, 0x85, 0xaa, 0xe9, 0xc2, 0x57, 0x9d, 0x83, 0x92, 0x7c, 0x73, 0x49, 0xba, 0xcf, 0xef, - 0x2f, 0xe4, 0xfd, 0x47, 0x92, 0x6e, 0x3e, 0x71, 0xb2, 0x3a, 0x75, 0x4b, 0xd5, 0x09, 0x2b, 0xd9, - 0xd2, 0xd3, 0xce, 0xf3, 0x75, 0xa9, 0x3d, 0xa4, 0x62, 0x5c, 0x25, 0x3a, 0xad, 0xcf, 0xf5, 0xdc, - 0x12, 0xb2, 0x8d, 0xa6, 0xde, 0x34, 0x5c, 0x33, 0x13, 0xe7, 0x05, 0xd3, 0xea, 0xc9, 0x35, 0x15, - 0xad, 0x47, 0xe7, 0x9a, 0x17, 0xca, 0x47, 0x71, 0x4d, 0x53, 0x7f, 0x8a, 0xa6, 0x33, 0xf1, 0xa6, - 0xcb, 0x7b, 0xec, 0xe7, 0x9f, 0x73, 0xa6, 0x0c, 0x97, 0x28, 0x86, 0x8b, 0x9e, 0x68, 0x1f, 0x8b, - 0x0b, 0x3e, 0x09, 0xcc, 0x15, 0x7e, 0x16, 0x3d, 0xf9, 0x14, 0x4a, 0x62, 0x79, 0x8b, 0x19, 0x64, - 0x21, 0xe6, 0x0e, 0xdd, 0x82, 0xb4, 0xd8, 0x9d, 0xa0, 0x05, 0x27, 0xb1, 0xd4, 0x9d, 0x44, 0x12, - 0xf9, 0x66, 0x2d, 0xb6, 0x1d, 0x6e, 0x07, 0x9d, 0x30, 0xa2, 0xcd, 0xb4, 0x39, 0xca, 0x6c, 0x8c, - 0x74, 0x9c, 0x30, 0xd1, 0x77, 0xe7, 0xc9, 0x2a, 0xae, 0x6d, 0x26, 0xb8, 0x9b, 0xbd, 0x2e, 0x9b, - 0x0d, 0x2e, 0x3d, 0x2b, 0xea, 0xf1, 0x90, 0xd9, 0xa6, 0xbc, 0xba, 0xf3, 0x1b, 0xa5, 0x44, 0x74, - 0xc2, 0xde, 0xe5, 0x89, 0x88, 0x1f, 0xa8, 0xb9, 0xed, 0xb0, 0x97, 0x64, 0x92, 0xcf, 0x99, 0xc8, - 0x67, 0x30, 0x2a, 0x89, 0x7b, 0x0b, 0x24, 0x49, 0x8d, 0x02, 0x59, 0x82, 0x09, 0xe3, 0xad, 0x96, - 0x3a, 0xdd, 0x64, 0xbd, 0xe0, 0xea, 0x32, 0xce, 0x13, 0xc6, 0x9b, 0x2c, 0xc5, 0x25, 0xeb, 0xa5, - 0x56, 0x2e, 0x97, 0xef, 0xc3, 0x98, 0x10, 0x69, 0x57, 0x69, 0xe4, 0x1b, 0xeb, 0x66, 0x34, 0xbf, - 0xe7, 0x4e, 0xd3, 0x8d, 0x16, 0x7d, 0xef, 0xb1, 0xbb, 0xdf, 0x53, 0x30, 0x69, 0x92, 0xdd, 0x79, - 0xf2, 0x03, 0x4c, 0x4b, 0x2c, 0x93, 0x45, 0xd3, 0xe8, 0x99, 0x1f, 0x3c, 0x71, 0xbd, 0xfd, 0x1e, - 0x2c, 0xaf, 0x98, 0x2c, 0x93, 0x74, 0xd2, 0xb5, 0xe4, 0x07, 0x30, 0x57, 0xcb, 0x67, 0xde, 0x93, - 0x49, 0xf7, 0xed, 0xa5, 0x06, 0x17, 0xd1, 0xb9, 0xe6, 0xb4, 0x6d, 0xef, 0xca, 0xf4, 0x4b, 0x1e, - 0x26, 0x51, 0x1a, 0xfa, 0x1b, 0x7e, 0xd0, 0xec, 0xcd, 0xb1, 0x62, 0xba, 0xeb, 0x26, 0xc8, 0xa4, - 0x30, 0xbe, 0x84, 0xf3, 0xb5, 0x5c, 0xd6, 0xbd, 0x58, 0xf4, 0xd2, 0x24, 0x2f, 0xa0, 0x28, 0x4e, - 0xd9, 0xee, 0xae, 0x3c, 0x57, 0x71, 0x4d, 0x63, 0xfb, 0xd0, 0x56, 0x40, 0x1f, 0xd3, 0x00, 0x9d, - 0xc2, 0x7b, 0xb9, 0x43, 0x9b, 0xe8, 0xb2, 0xe7, 0xab, 0x70, 0xb6, 0x96, 0x62, 0x95, 0x47, 0xd2, - 0xbd, 0x55, 0x0f, 0x60, 0x0a, 0x7b, 0x7a, 0xc2, 0x76, 0xf5, 0x70, 0x22, 0x1a, 0xbb, 0x4f, 0xa3, - 0x9d, 0xd5, 0x1e, 0x52, 0x92, 0xaf, 0x16, 0x24, 0xe2, 0xee, 0x1d, 0x46, 0x59, 0xd3, 0x28, 0xd3, - 0x18, 0xb9, 0x1f, 0xef, 0x67, 0xf2, 0x22, 0xa5, 0x67, 0xb5, 0x79, 0x1c, 0xee, 0xe2, 0x5a, 0x28, - 0x1c, 0xa3, 0x35, 0x13, 0x24, 0x87, 0xc4, 0xa6, 0x3a, 0xcd, 0x47, 0x3a, 0x24, 0x55, 0x7e, 0xfc, - 0xe3, 0xd3, 0x43, 0xc0, 0x2e, 0xa7, 0x1c, 0xe6, 0xbb, 0xb2, 0xe0, 0x26, 0xd4, 0x35, 0xbf, 0xf1, - 0x44, 0x37, 0xa1, 0x6a, 0x89, 0xeb, 0xe7, 0xcc, 0xb4, 0xf2, 0x62, 0xc5, 0xc7, 0xdc, 0xf2, 0xba, - 0x5f, 0x98, 0x9e, 0xba, 0x5e, 0x37, 0xa1, 0x9a, 0x49, 0xf6, 0xef, 0x4a, 0xdb, 0x22, 0x56, 0x68, - 0x72, 0xce, 0x15, 0x8d, 0x32, 0x2b, 0x22, 0x91, 0x69, 0x56, 0xd4, 0x1b, 0x9a, 0x7f, 0x11, 0x40, - 0xd2, 0x59, 0xf6, 0xd5, 0x61, 0x25, 0x37, 0x01, 0x7f, 0x17, 0xf7, 0xae, 0x29, 0xe1, 0x14, 0x64, - 0x08, 0x5e, 0x85, 0x1a, 0x4e, 0x97, 0xc5, 0xa2, 0xd4, 0x7d, 0x95, 0x6e, 0x17, 0xc8, 0x06, 0x9c, - 0xbb, 0x4f, 0x23, 0xb1, 0xc6, 0xd9, 0x34, 0x8c, 0x02, 0xb7, 0x11, 0x75, 0xbd, 0x55, 0x94, 0x67, - 0x93, 0x0c, 0x9a, 0xdd, 0x77, 0x18, 0xbf, 0x5a, 0x36, 0xbf, 0xae, 0x74, 0x5d, 0x3c, 0x68, 0xc5, - 0x55, 0xc5, 0x69, 0x9a, 0x98, 0x3f, 0xc5, 0x87, 0xb9, 0x83, 0x4e, 0x3e, 0x69, 0x29, 0x8e, 0x6b, - 0x22, 0x4e, 0x5b, 0x37, 0x61, 0x88, 0x13, 0xe5, 0x6e, 0xa8, 0xe3, 0x3a, 0x0d, 0xb9, 0x03, 0xa3, - 0xca, 0xc3, 0x86, 0x18, 0x45, 0xb9, 0xed, 0xba, 0x03, 0xa3, 0xfc, 0x68, 0x75, 0x72, 0x92, 0x8f, - 0x60, 0x54, 0xb9, 0xe4, 0x9c, 0x7a, 0xa7, 0xff, 0x14, 0x26, 0x74, 0xe7, 0x9c, 0xd3, 0x0b, 0xf2, - 0xfb, 0x78, 0xf7, 0x2b, 0xaf, 0x58, 0xf2, 0xe9, 0x67, 0x12, 0xb9, 0xbc, 0x84, 0x48, 0xf9, 0x02, - 0x29, 0x81, 0xb9, 0xcd, 0x3f, 0x9b, 0xa2, 0x26, 0x1f, 0xc9, 0xf7, 0x52, 0x8a, 0x38, 0x8d, 0xd4, - 0x45, 0x66, 0x93, 0x5c, 0xcc, 0x2f, 0x42, 0xac, 0x16, 0xd8, 0x9e, 0xcd, 0x3e, 0xc9, 0x1d, 0x75, - 0x6f, 0xd1, 0xe5, 0x71, 0xd9, 0x44, 0x2d, 0x2d, 0x95, 0x65, 0x2e, 0x9f, 0xd1, 0xe5, 0xfc, 0xc4, - 0x74, 0x38, 0x18, 0x0f, 0xf0, 0x14, 0x98, 0x2a, 0xcd, 0xed, 0x5e, 0x97, 0x44, 0x77, 0xf1, 0xb1, - 0x37, 0xcd, 0xae, 0x0b, 0x59, 0xb7, 0x53, 0xb4, 0x78, 0x05, 0xfa, 0x4a, 0xd8, 0xad, 0x4a, 0x1f, - 0xc7, 0x93, 0x77, 0x36, 0xbf, 0x65, 0x17, 0x32, 0x6e, 0xc5, 0x7b, 0x8e, 0x45, 0x1e, 0xbb, 0x5f, - 0x41, 0xed, 0x30, 0x33, 0xdc, 0x57, 0x3e, 0xb3, 0xeb, 0x9a, 0x63, 0x45, 0x26, 0xa5, 0xda, 0xf4, - 0x9e, 0xe0, 0x43, 0xb4, 0xec, 0x3c, 0x7c, 0x6f, 0xf4, 0xe0, 0x22, 0x25, 0xf1, 0x66, 0x4f, 0x3c, - 0x75, 0xc7, 0x7a, 0x81, 0xef, 0xb0, 0xd9, 0xf5, 0xf5, 0xc8, 0x2b, 0x98, 0x71, 0xed, 0xad, 0x1c, - 0x48, 0xb3, 0x19, 0x9a, 0x0e, 0xa4, 0x5d, 0xfb, 0x90, 0x27, 0xfe, 0xcf, 0xa1, 0x12, 0x7b, 0x8f, - 0x9c, 0x6e, 0x10, 0xf2, 0xfd, 0x16, 0x49, 0x4a, 0x52, 0x21, 0xe9, 0x96, 0x68, 0x67, 0xee, 0x6a, - 0x9e, 0x84, 0x43, 0xcd, 0x2d, 0x49, 0xf8, 0xbd, 0x25, 0x32, 0x52, 0xe6, 0xe5, 0xb6, 0xec, 0x62, - 0x87, 0x15, 0x2f, 0xf3, 0x5e, 0x09, 0xa3, 0xf4, 0x68, 0x9f, 0x9e, 0x91, 0x72, 0xee, 0x48, 0x30, - 0xb2, 0xba, 0x0c, 0xef, 0x69, 0x7c, 0xd7, 0x92, 0x43, 0x71, 0xda, 0x01, 0x75, 0xe2, 0xd7, 0x68, - 0x89, 0xe8, 0x80, 0xfa, 0x0b, 0xe0, 0x74, 0x51, 0xf2, 0x29, 0x55, 0x16, 0x86, 0xf2, 0xa8, 0x2a, - 0xcb, 0x2a, 0x18, 0x9c, 0x1d, 0x45, 0xfc, 0xc0, 0x8d, 0x9e, 0x2f, 0xda, 0x6b, 0xb1, 0x59, 0x41, - 0x2f, 0x90, 0xbc, 0x41, 0x16, 0xda, 0x6b, 0xe4, 0x2b, 0x5c, 0x4a, 0x04, 0xfb, 0x05, 0xdf, 0x8f, - 0xc2, 0x28, 0x70, 0xda, 0xb5, 0x46, 0xe0, 0xb6, 0xa3, 0xdc, 0x4e, 0xc7, 0x2e, 0xde, 0x59, 0x64, - 0x9a, 0xc7, 0xa9, 0x88, 0x1e, 0x9f, 0x15, 0x5f, 0x47, 0xbd, 0xba, 0xc9, 0x2a, 0xec, 0x72, 0x72, - 0xa9, 0xc9, 0x78, 0xf1, 0xaf, 0x92, 0x69, 0x1d, 0x66, 0x73, 0xa2, 0x12, 0xa9, 0xdb, 0xdb, 0xee, - 0x51, 0x8b, 0xe6, 0xba, 0x57, 0x4c, 0x7e, 0x00, 0x33, 0x99, 0x61, 0x8b, 0x94, 0x05, 0xba, 0x5b, - 0x50, 0xa3, 0x5e, 0xcc, 0x9f, 0x40, 0x99, 0xbf, 0xf7, 0x40, 0xb7, 0x66, 0x23, 0x82, 0x4d, 0xfc, - 0x0a, 0x28, 0x07, 0x21, 0xb9, 0x5e, 0xe7, 0xe3, 0xa9, 0x27, 0xed, 0xd3, 0x18, 0xba, 0x24, 0x91, - 0xf0, 0x5c, 0x7d, 0x78, 0x59, 0x85, 0xdd, 0x9e, 0x1a, 0x6d, 0xc1, 0xcc, 0x2e, 0x0d, 0xdc, 0xc7, - 0xcf, 0x93, 0x0c, 0xa5, 0x64, 0x32, 0x4b, 0xbb, 0x71, 0xfc, 0x02, 0x66, 0x17, 0xfd, 0xc3, 0xb6, - 0x78, 0xd4, 0x67, 0xf0, 0x54, 0x57, 0xf1, 0xd9, 0xe5, 0xbd, 0x1d, 0xa1, 0xe6, 0xf2, 0x53, 0xd3, - 0x2b, 0xff, 0xb7, 0x9e, 0xd9, 0xeb, 0xd5, 0xd3, 0x34, 0x93, 0x7e, 0x1b, 0x27, 0x61, 0x56, 0xae, - 0x7a, 0x7d, 0x12, 0x76, 0xc9, 0x65, 0x9f, 0xf3, 0x44, 0x6c, 0x36, 0x27, 0x3d, 0x7d, 0x17, 0xae, - 0x27, 0x68, 0xed, 0x86, 0xdc, 0x5b, 0xcc, 0x44, 0xde, 0x09, 0x9f, 0xea, 0xcc, 0x2c, 0xdf, 0x99, - 0xed, 0xd4, 0x62, 0x37, 0xb4, 0x5a, 0x5d, 0x54, 0x2c, 0xa2, 0x07, 0x6f, 0x60, 0x98, 0x68, 0xc4, - 0x9f, 0xd0, 0x69, 0xbb, 0xad, 0xd6, 0x29, 0x62, 0x54, 0x6a, 0x3f, 0x84, 0xf1, 0x9a, 0x5e, 0x79, - 0x46, 0x25, 0xb9, 0x93, 0x42, 0x3d, 0x12, 0xea, 0xdd, 0xf6, 0x2e, 0x8e, 0xa4, 0x6a, 0xe3, 0x39, - 0x51, 0x2f, 0x72, 0x5d, 0x67, 0x8c, 0xac, 0x6c, 0x6a, 0x17, 0xc8, 0x4a, 0x9a, 0xa8, 0x5c, 0x67, - 0xb2, 0x13, 0xb9, 0xd5, 0x79, 0x1e, 0x99, 0x64, 0x4e, 0x4c, 0x62, 0xf5, 0x4e, 0x3e, 0xab, 0x5c, - 0xe6, 0xbb, 0x26, 0xd5, 0xe4, 0x7e, 0x3e, 0x71, 0x1e, 0x3a, 0xdd, 0xcf, 0x27, 0x95, 0xdd, 0x4e, - 0xf7, 0xf3, 0xc9, 0x48, 0x5d, 0xb7, 0x8c, 0xbc, 0xe2, 0x04, 0x3c, 0x5d, 0x8c, 0x11, 0x8a, 0x4d, - 0x46, 0x9e, 0x9f, 0x87, 0x7a, 0x08, 0x10, 0x9e, 0xb6, 0xa7, 0x8b, 0xad, 0x35, 0x19, 0xfa, 0x23, - 0x91, 0xe7, 0xe7, 0x1e, 0x94, 0x78, 0x06, 0x83, 0x38, 0x6a, 0x62, 0xec, 0x37, 0x98, 0x4e, 0xac, - 0xd0, 0x65, 0x50, 0x4b, 0xc9, 0x78, 0x73, 0xca, 0x64, 0x96, 0x13, 0x88, 0xae, 0xcb, 0x54, 0x85, - 0x38, 0xaa, 0x9c, 0x32, 0x4c, 0xa5, 0x02, 0xcd, 0xcd, 0x9d, 0xcf, 0x28, 0x51, 0x2a, 0xe5, 0xb8, - 0x1e, 0x83, 0x4e, 0x75, 0x29, 0x23, 0x30, 0xdd, 0xdc, 0x85, 0xcc, 0x32, 0xc1, 0x28, 0xe2, 0xf9, - 0x97, 0xb3, 0xb3, 0x46, 0xc7, 0xef, 0xbc, 0xba, 0xe0, 0xc8, 0x6a, 0x6e, 0x9c, 0x04, 0x55, 0xd4, - 0x4a, 0x55, 0xfa, 0xa1, 0x8c, 0x54, 0xd5, 0x6f, 0x66, 0xbc, 0xc7, 0x30, 0x30, 0x62, 0x6f, 0xb0, - 0xee, 0x79, 0xb3, 0xc9, 0x23, 0x99, 0x0e, 0x26, 0xa7, 0xa6, 0x5e, 0x0c, 0x72, 0x47, 0xf0, 0x91, - 0x4c, 0x00, 0xf3, 0xaa, 0x19, 0xef, 0xc1, 0xc5, 0xc4, 0x73, 0x0f, 0x93, 0xf1, 0x8d, 0xec, 0x37, - 0x21, 0x99, 0xe2, 0xc9, 0xd7, 0xd9, 0xaf, 0xa4, 0xdf, 0x86, 0x24, 0xc6, 0xfd, 0xb4, 0x6b, 0xde, - 0x3a, 0x4c, 0xe2, 0x32, 0x23, 0x93, 0xae, 0xc7, 0x11, 0x68, 0x4c, 0x70, 0x32, 0x14, 0x52, 0xb2, - 0x54, 0xb9, 0xcc, 0x8e, 0x8b, 0x37, 0xc3, 0x3c, 0x85, 0xfb, 0x9c, 0xf9, 0x90, 0x18, 0x81, 0x59, - 0xbb, 0x98, 0xc8, 0x0c, 0x4f, 0xbe, 0x0f, 0x67, 0xe2, 0xa7, 0xc4, 0x9c, 0x45, 0x06, 0x5a, 0x17, - 0x43, 0xd9, 0x99, 0xf8, 0x3d, 0xf1, 0xe9, 0xc9, 0x57, 0xe4, 0x56, 0x14, 0x93, 0x5f, 0x4a, 0x3d, - 0x93, 0x31, 0xfa, 0x70, 0x92, 0x1d, 0x49, 0x93, 0xed, 0x69, 0x47, 0xa7, 0x81, 0x9f, 0x5b, 0x76, - 0x70, 0x45, 0xfd, 0x73, 0xeb, 0x1a, 0x00, 0x52, 0xa9, 0xbf, 0x39, 0x7c, 0xd6, 0xe1, 0x1a, 0x06, - 0x64, 0xd9, 0xe2, 0x21, 0xf8, 0xb2, 0xb1, 0xf2, 0xdb, 0x9e, 0x0c, 0xe3, 0xd2, 0x82, 0xab, 0x3d, - 0xa3, 0x4b, 0x92, 0x5b, 0x86, 0x8b, 0x4b, 0xef, 0x38, 0x94, 0xdd, 0x9e, 0xa6, 0x65, 0x05, 0x69, - 0x54, 0xfb, 0x6c, 0x97, 0x78, 0x91, 0x6a, 0x9f, 0xed, 0x1a, 0xe5, 0xf1, 0x0b, 0xcc, 0xb1, 0x24, - 0xf6, 0x28, 0x0c, 0xb2, 0x44, 0x3d, 0x1e, 0x76, 0xba, 0xeb, 0xb5, 0xcf, 0x55, 0xf3, 0x52, 0x34, - 0x45, 0x88, 0x67, 0x9a, 0xcb, 0xe2, 0x24, 0x96, 0xc7, 0xbc, 0x37, 0x93, 0x2e, 0xae, 0xd5, 0x97, - 0xf9, 0x04, 0x3c, 0x75, 0xcb, 0x73, 0xe0, 0x0b, 0x4b, 0x3f, 0xfb, 0x4f, 0x97, 0x0b, 0x3f, 0xfb, - 0xf9, 0xe5, 0xc2, 0xbf, 0xfb, 0xf9, 0xe5, 0xc2, 0x7f, 0xfc, 0xf9, 0xe5, 0xc2, 0x57, 0xf3, 0x27, - 0x0b, 0x7e, 0xdc, 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0x71, 0x76, 0x43, 0xf8, 0xdf, 0xdd, 0xff, 0x15, - 0x00, 0x00, 0xff, 0xff, 0x3a, 0x0f, 0x03, 0x99, 0x86, 0xe8, 0x00, 0x00, + 0xc0, 0x32, 0x64, 0xd8, 0x80, 0x6c, 0xc0, 0x06, 0x0c, 0x03, 0x36, 0xf4, 0x23, 0xe8, 0xc7, 0xfe, + 0xf0, 0x97, 0x57, 0x02, 0x04, 0xdb, 0x90, 0xf4, 0xe3, 0x8f, 0x96, 0xbd, 0x80, 0x7f, 0x1a, 0xf6, + 0x87, 0x60, 0xd8, 0x80, 0x17, 0x10, 0x60, 0xc4, 0x89, 0x47, 0x46, 0xe4, 0xa3, 0xaa, 0x9b, 0xe4, + 0xac, 0xfc, 0x43, 0x76, 0x9d, 0x38, 0xe7, 0x44, 0xc4, 0x89, 0xc8, 0x88, 0x13, 0x27, 0x4e, 0x9c, + 0x03, 0x37, 0x23, 0xda, 0xa2, 0x6d, 0x3f, 0x88, 0x6e, 0xb5, 0xe8, 0xbe, 0xd3, 0x78, 0x7e, 0xab, + 0xd1, 0x72, 0xa9, 0x17, 0xdd, 0x6a, 0x07, 0x7e, 0xe4, 0xdf, 0x72, 0x3a, 0xd1, 0x41, 0x48, 0x83, + 0xa7, 0x6e, 0x83, 0xde, 0x44, 0x08, 0x19, 0xc4, 0xff, 0xe6, 0xa6, 0xf7, 0xfd, 0x7d, 0x9f, 0xe3, + 0xb0, 0xbf, 0x78, 0xe1, 0xdc, 0x85, 0x7d, 0xdf, 0xdf, 0x6f, 0x51, 0x4e, 0xbc, 0xd7, 0x79, 0x7c, + 0x8b, 0x1e, 0xb6, 0xa3, 0xe7, 0xa2, 0xb0, 0x92, 0x2c, 0x8c, 0xdc, 0x43, 0x1a, 0x46, 0xce, 0x61, + 0x5b, 0x20, 0xbc, 0xa5, 0x9a, 0xe2, 0x44, 0x11, 0x2b, 0x89, 0x5c, 0xdf, 0xbb, 0xf5, 0xf4, 0x8e, + 0xfe, 0x53, 0xa0, 0x5e, 0xef, 0xda, 0xea, 0x06, 0x0d, 0xa2, 0xf0, 0x44, 0x98, 0xf4, 0x29, 0xf5, + 0xa2, 0x54, 0xf5, 0x02, 0x33, 0x7a, 0xde, 0xa6, 0x21, 0x47, 0x91, 0xff, 0x09, 0xd4, 0xab, 0xd9, + 0xa8, 0xf8, 0xaf, 0x40, 0xf9, 0x6e, 0x36, 0xca, 0x33, 0xba, 0xc7, 0x64, 0xea, 0xa9, 0x3f, 0x7a, + 0xa0, 0x07, 0x4e, 0xbb, 0x4d, 0x83, 0xf8, 0x0f, 0x81, 0x7e, 0x5e, 0xa1, 0x1f, 0x3e, 0x76, 0x98, + 0x88, 0x0e, 0x1f, 0x3b, 0xa9, 0x6e, 0x74, 0x42, 0x67, 0x9f, 0x8a, 0xe6, 0x3f, 0xbd, 0xa3, 0xff, + 0xe4, 0xa8, 0xd6, 0x1f, 0x14, 0x60, 0xf0, 0x91, 0x13, 0x35, 0x0e, 0xc8, 0xa7, 0x30, 0xf8, 0xd0, + 0xf5, 0x9a, 0x61, 0xb9, 0x70, 0xa5, 0xff, 0xfa, 0xd8, 0x7c, 0xe9, 0x26, 0xef, 0x0a, 0x16, 0xb2, + 0x82, 0x85, 0xd9, 0x9f, 0x1d, 0x55, 0xfa, 0x8e, 0x8f, 0x2a, 0x67, 0x9e, 0x30, 0xb4, 0xb7, 0xfd, + 0x43, 0x37, 0xc2, 0xb1, 0xb5, 0x39, 0x1d, 0xd9, 0x81, 0xa9, 0x6a, 0xab, 0xe5, 0x3f, 0xdb, 0x72, + 0x82, 0xc8, 0x75, 0x5a, 0xb5, 0x4e, 0xa3, 0x41, 0xc3, 0xb0, 0x5c, 0xbc, 0x52, 0xb8, 0x3e, 0xb2, + 0x70, 0xed, 0xf8, 0xa8, 0x52, 0x71, 0x58, 0x71, 0xbd, 0xcd, 0xcb, 0xeb, 0x21, 0x47, 0xd0, 0x18, + 0x65, 0xd1, 0x5b, 0x7f, 0x3a, 0x04, 0xa5, 0x15, 0x3f, 0x8c, 0x16, 0xd9, 0x88, 0xda, 0xf4, 0xc7, + 0x1d, 0x1a, 0x46, 0xe4, 0x1a, 0x0c, 0x31, 0xd8, 0xea, 0x52, 0xb9, 0x70, 0xa5, 0x70, 0x7d, 0x74, + 0x61, 0xec, 0xf8, 0xa8, 0x32, 0x7c, 0xe0, 0x87, 0x51, 0xdd, 0x6d, 0xda, 0xa2, 0x88, 0xbc, 0x05, + 0x23, 0x1b, 0x7e, 0x93, 0x6e, 0x38, 0x87, 0x14, 0x5b, 0x31, 0xba, 0x30, 0x71, 0x7c, 0x54, 0x19, + 0xf5, 0xfc, 0x26, 0xad, 0x7b, 0xce, 0x21, 0xb5, 0x55, 0x31, 0xd9, 0x85, 0x01, 0xdb, 0x6f, 0xd1, + 0x72, 0x3f, 0xa2, 0x2d, 0x1c, 0x1f, 0x55, 0x06, 0x02, 0xbf, 0x45, 0x7f, 0x71, 0x54, 0x79, 0x6f, + 0xdf, 0x8d, 0x0e, 0x3a, 0x7b, 0x37, 0x1b, 0xfe, 0xe1, 0xad, 0xfd, 0xc0, 0x79, 0xea, 0xf2, 0x49, + 0xe8, 0xb4, 0x6e, 0xc5, 0x53, 0xb5, 0xed, 0x8a, 0x71, 0xaf, 0x3d, 0x0f, 0x23, 0x7a, 0xc8, 0x38, + 0xd9, 0xc8, 0x8f, 0x3c, 0x82, 0xe9, 0x6a, 0xb3, 0xe9, 0x72, 0x8a, 0xad, 0xc0, 0xf5, 0x1a, 0x6e, + 0xdb, 0x69, 0x85, 0xe5, 0x81, 0x2b, 0xfd, 0xd7, 0x47, 0x85, 0x50, 0x54, 0x79, 0xbd, 0xad, 0x10, + 0x34, 0xa1, 0x64, 0x32, 0x20, 0x77, 0x61, 0x64, 0x69, 0xa3, 0xc6, 0xda, 0x1e, 0x96, 0x07, 0x91, + 0xd9, 0xec, 0xf1, 0x51, 0x65, 0xaa, 0xe9, 0x85, 0xd8, 0x35, 0x9d, 0x81, 0x42, 0x24, 0xef, 0xc1, + 0xf8, 0x56, 0x67, 0xaf, 0xe5, 0x36, 0xb6, 0xd7, 0x6a, 0x0f, 0xe9, 0xf3, 0xf2, 0xd0, 0x95, 0xc2, + 0xf5, 0xf1, 0x05, 0x72, 0x7c, 0x54, 0x99, 0x6c, 0x23, 0xbc, 0x1e, 0xb5, 0xc2, 0xfa, 0x13, 0xfa, + 0xdc, 0x36, 0xf0, 0x62, 0xba, 0x5a, 0x6d, 0x85, 0xd1, 0x0d, 0xa7, 0xe8, 0xc2, 0xf0, 0x40, 0xa7, + 0xe3, 0x78, 0xe4, 0x16, 0x80, 0x4d, 0x0f, 0xfd, 0x88, 0x56, 0x9b, 0xcd, 0xa0, 0x3c, 0x82, 0xb2, + 0x3d, 0x73, 0x7c, 0x54, 0x19, 0x0b, 0x10, 0x5a, 0x77, 0x9a, 0xcd, 0xc0, 0xd6, 0x50, 0xc8, 0x22, + 0x8c, 0xd8, 0x3e, 0x17, 0x70, 0x79, 0xf4, 0x4a, 0xe1, 0xfa, 0xd8, 0xfc, 0x19, 0x31, 0x0d, 0x25, + 0x78, 0xe1, 0xdc, 0xf1, 0x51, 0x85, 0x04, 0xe2, 0x97, 0xde, 0x4b, 0x89, 0x41, 0x2a, 0x30, 0xbc, + 0xe1, 0x2f, 0x3a, 0x8d, 0x03, 0x5a, 0x06, 0x9c, 0x7b, 0x83, 0xc7, 0x47, 0x95, 0xc2, 0x77, 0x6d, + 0x09, 0x25, 0x4f, 0x61, 0x2c, 0x1e, 0xa8, 0xb0, 0x3c, 0x86, 0xe2, 0xdb, 0x3e, 0x3e, 0xaa, 0x9c, + 0x0b, 0x11, 0x5c, 0x67, 0x43, 0xaf, 0x49, 0xf0, 0x25, 0x66, 0x81, 0x5e, 0x11, 0xf9, 0x1a, 0x66, + 0xe2, 0x9f, 0xd5, 0x30, 0xa4, 0x01, 0xe3, 0xb1, 0xba, 0x54, 0x9e, 0x40, 0xc9, 0xbc, 0x71, 0x7c, + 0x54, 0xb1, 0xb4, 0x16, 0xd4, 0x1d, 0x89, 0x52, 0x77, 0x9b, 0x5a, 0x4f, 0xb3, 0x99, 0x3c, 0x18, + 0x18, 0x19, 0x2f, 0x4d, 0xd8, 0x97, 0x76, 0xbc, 0x30, 0x72, 0xf6, 0x5a, 0x34, 0x13, 0xc9, 0xfa, + 0x9b, 0x02, 0x90, 0xcd, 0x36, 0xf5, 0x6a, 0xb5, 0x15, 0xf6, 0x3d, 0xc9, 0xcf, 0xe9, 0x6d, 0x18, + 0xe5, 0x03, 0xc7, 0x46, 0xb7, 0x88, 0xa3, 0x3b, 0x79, 0x7c, 0x54, 0x01, 0x31, 0xba, 0x6c, 0x64, + 0x63, 0x04, 0xf2, 0x3a, 0xf4, 0x6f, 0x6f, 0xaf, 0xe1, 0xb7, 0xd2, 0xbf, 0x30, 0x75, 0x7c, 0x54, + 0xe9, 0x8f, 0xa2, 0xd6, 0x2f, 0x8e, 0x2a, 0x23, 0x4b, 0x9d, 0x00, 0xc5, 0x62, 0xb3, 0x72, 0xf2, + 0x3a, 0x0c, 0x2f, 0xb6, 0x3a, 0x61, 0x44, 0x83, 0xf2, 0x40, 0xfc, 0x91, 0x36, 0x38, 0xc8, 0x96, + 0x65, 0xe4, 0x3b, 0x30, 0xb0, 0x13, 0xd2, 0xa0, 0x3c, 0x88, 0xe3, 0x3d, 0x21, 0xc6, 0x9b, 0x81, + 0x76, 0xe7, 0x17, 0x46, 0xd8, 0x97, 0xd8, 0x09, 0x69, 0x60, 0x23, 0x12, 0xb9, 0x09, 0x83, 0x7c, + 0xd0, 0x86, 0x70, 0x91, 0x9a, 0x50, 0xb3, 0xa3, 0x45, 0x77, 0xdf, 0x5b, 0x18, 0x3d, 0x3e, 0xaa, + 0x0c, 0xe2, 0xe0, 0xd9, 0x1c, 0xed, 0xc1, 0xc0, 0x48, 0xa1, 0x54, 0xb4, 0x47, 0x18, 0x2d, 0xfb, + 0x2c, 0xac, 0xef, 0xc0, 0x98, 0xd6, 0x7d, 0x72, 0x11, 0x06, 0xd8, 0xff, 0xb8, 0x88, 0x8c, 0xf3, + 0xca, 0xd8, 0xc6, 0x61, 0x23, 0xd4, 0xfa, 0x87, 0x53, 0x50, 0x62, 0x94, 0xc6, 0xca, 0x73, 0x53, + 0x17, 0x15, 0xa7, 0x2b, 0x99, 0xa2, 0x2a, 0x17, 0x74, 0x61, 0x5d, 0x07, 0x55, 0xbb, 0x58, 0x84, + 0xc6, 0x8f, 0x8f, 0x2a, 0x23, 0x1d, 0x01, 0x8b, 0xdb, 0x46, 0x6a, 0x30, 0xbc, 0xfc, 0x4d, 0xdb, + 0x0d, 0x68, 0x88, 0xa2, 0x1d, 0x9b, 0x9f, 0xbb, 0xc9, 0xb7, 0xcb, 0x9b, 0x72, 0xbb, 0xbc, 0xb9, + 0x2d, 0xb7, 0xcb, 0x85, 0x4b, 0x62, 0x31, 0x3e, 0x4b, 0x39, 0x49, 0x3c, 0x3f, 0x7e, 0xe7, 0xaf, + 0x2a, 0x05, 0x5b, 0x72, 0x22, 0x6f, 0xc3, 0xd0, 0x3d, 0x3f, 0x38, 0x74, 0x22, 0x31, 0x06, 0xd3, + 0xc7, 0x47, 0x95, 0xd2, 0x63, 0x84, 0x68, 0x53, 0x4a, 0xe0, 0x90, 0x7b, 0x30, 0x69, 0xfb, 0x9d, + 0x88, 0x6e, 0xfb, 0x72, 0xe4, 0x06, 0x91, 0xea, 0xf2, 0xf1, 0x51, 0x65, 0x2e, 0x60, 0x25, 0xf5, + 0xc8, 0xaf, 0x8b, 0x21, 0xd4, 0xe8, 0x13, 0x54, 0x64, 0x19, 0x26, 0xab, 0xb8, 0x7a, 0x0b, 0xa9, + 0xf1, 0xf1, 0x1a, 0x5d, 0xb8, 0x74, 0x7c, 0x54, 0x39, 0xef, 0x60, 0x49, 0x3d, 0x10, 0x45, 0x3a, + 0x1b, 0x93, 0x88, 0x6c, 0xc0, 0xd9, 0x87, 0x9d, 0x3d, 0x1a, 0x78, 0x34, 0xa2, 0xa1, 0x6c, 0xd1, + 0x30, 0xb6, 0xe8, 0xca, 0xf1, 0x51, 0xe5, 0xe2, 0x13, 0x55, 0x98, 0xd1, 0xa6, 0x34, 0x29, 0xa1, + 0x70, 0x46, 0x34, 0x74, 0xc9, 0x89, 0x9c, 0x3d, 0x27, 0xa4, 0xb8, 0x28, 0x8d, 0xcd, 0x9f, 0xe3, + 0x22, 0xbe, 0x99, 0x28, 0x5d, 0xb8, 0x26, 0xa4, 0x7c, 0x41, 0xf5, 0xbd, 0x29, 0x8a, 0xb4, 0x8a, + 0x92, 0x3c, 0xd9, 0xda, 0xac, 0xf6, 0x9d, 0x51, 0x6c, 0x2d, 0xae, 0xcd, 0x6a, 0xdf, 0xd1, 0x57, + 0x2d, 0xb5, 0x03, 0xad, 0xc1, 0xe0, 0x0e, 0xdb, 0x9d, 0x71, 0xcd, 0x9a, 0x9c, 0xbf, 0x2a, 0x5a, + 0x94, 0x9c, 0x7f, 0x37, 0xd9, 0x0f, 0x44, 0xc4, 0x2f, 0xef, 0x0c, 0xee, 0xe8, 0xfa, 0x5e, 0x8c, + 0x65, 0xe4, 0x73, 0x00, 0xd1, 0xaa, 0x6a, 0xbb, 0x5d, 0x1e, 0xc3, 0x4e, 0x9e, 0x35, 0x3b, 0x59, + 0x6d, 0xb7, 0x17, 0x2e, 0x8b, 0xfe, 0x9d, 0x53, 0xfd, 0x73, 0xda, 0x6d, 0x8d, 0x9b, 0xc6, 0x84, + 0x7c, 0x0a, 0xe3, 0xb8, 0xa4, 0xc9, 0x11, 0x1d, 0xc7, 0x11, 0xbd, 0x70, 0x7c, 0x54, 0x99, 0xc5, + 0xd5, 0x2a, 0x63, 0x3c, 0x0d, 0x02, 0xf2, 0x1b, 0x30, 0x23, 0xd8, 0x3d, 0x72, 0xbd, 0xa6, 0xff, + 0x2c, 0x5c, 0xa2, 0xe1, 0x93, 0xc8, 0x6f, 0xe3, 0xf2, 0x37, 0x36, 0x7f, 0xd1, 0x6c, 0x9e, 0x89, + 0xb3, 0x70, 0x43, 0xb4, 0xd4, 0x52, 0x2d, 0x7d, 0xc6, 0x11, 0xea, 0x4d, 0x8e, 0xa1, 0x2f, 0x90, + 0x99, 0x2c, 0xc8, 0x2a, 0x9c, 0xd9, 0x09, 0xa9, 0xd1, 0x87, 0x49, 0xdc, 0x1f, 0x2a, 0x6c, 0x84, + 0x3b, 0x21, 0xad, 0xe7, 0xf5, 0x23, 0x49, 0x47, 0x6c, 0x20, 0x4b, 0x81, 0xdf, 0x4e, 0xcc, 0xf1, + 0x33, 0x28, 0x11, 0xeb, 0xf8, 0xa8, 0x72, 0xb9, 0x19, 0xf8, 0xed, 0x7a, 0xfe, 0x44, 0xcf, 0xa0, + 0x26, 0x3f, 0x84, 0x73, 0x8b, 0xbe, 0xe7, 0xd1, 0x06, 0x5b, 0x41, 0x97, 0x5c, 0x67, 0xdf, 0xf3, + 0xc3, 0xc8, 0x6d, 0xac, 0x2e, 0x95, 0x4b, 0xf1, 0xf6, 0xd0, 0x50, 0x18, 0xf5, 0xa6, 0x42, 0x31, + 0xb7, 0x87, 0x1c, 0x2e, 0xe4, 0x07, 0x30, 0x21, 0xea, 0xa2, 0x01, 0x4e, 0xcd, 0xb3, 0xdd, 0x27, + 0x9a, 0x42, 0xe6, 0x1b, 0x7d, 0x20, 0x7f, 0x72, 0xd5, 0xc9, 0xe4, 0x45, 0xbe, 0x86, 0xb1, 0xf5, + 0x7b, 0x55, 0x9b, 0x86, 0x6d, 0xdf, 0x0b, 0x69, 0x99, 0xe0, 0x88, 0x5e, 0x16, 0xac, 0xd7, 0xef, + 0x55, 0xab, 0x9d, 0xe8, 0x80, 0x7a, 0x91, 0xdb, 0x70, 0x22, 0x2a, 0xb1, 0x16, 0xe6, 0xd8, 0xcc, + 0x3b, 0x7c, 0xec, 0xd4, 0x03, 0x01, 0xd1, 0x7a, 0xa1, 0xb3, 0x23, 0x73, 0x30, 0x52, 0xab, 0xad, + 0xac, 0xf9, 0xfb, 0xae, 0x57, 0x9e, 0x62, 0xc2, 0xb0, 0xd5, 0x6f, 0xf2, 0x18, 0x66, 0xb4, 0xb3, + 0x41, 0x9d, 0xfd, 0x4f, 0x0f, 0xa9, 0x17, 0x95, 0xa7, 0xb1, 0x0d, 0xdf, 0x55, 0x87, 0x9b, 0x9b, + 0xfa, 0x11, 0xe2, 0xe9, 0x9d, 0x9b, 0xd5, 0xf8, 0x67, 0x4d, 0x12, 0x2d, 0x14, 0xcb, 0x05, 0x7b, + 0xda, 0xc9, 0x28, 0x21, 0xdb, 0x30, 0xbc, 0xd5, 0x09, 0xda, 0x7e, 0x48, 0xcb, 0x33, 0x28, 0xb8, + 0x6b, 0xdd, 0xbe, 0x50, 0x81, 0xba, 0x30, 0xc3, 0x96, 0xe8, 0x36, 0xff, 0xa1, 0xf5, 0x4e, 0xb2, + 0x22, 0x9f, 0xc1, 0x78, 0xad, 0xb6, 0x12, 0x6f, 0x28, 0xe7, 0x70, 0x43, 0xb9, 0x78, 0x7c, 0x54, + 0x29, 0x33, 0x95, 0x2a, 0xde, 0x54, 0xf4, 0xaf, 0x4a, 0xa7, 0x60, 0x1c, 0xb6, 0xd7, 0x6a, 0x31, + 0x87, 0xd9, 0x98, 0x03, 0x53, 0xe6, 0xb2, 0x39, 0xe8, 0x14, 0xe4, 0x9f, 0x17, 0xe0, 0x8a, 0xce, + 0x32, 0x4b, 0x30, 0xe5, 0xf3, 0x2f, 0x22, 0xcd, 0xf9, 0xe3, 0xa3, 0xca, 0x4d, 0xb3, 0x1f, 0xf5, + 0xcc, 0xc1, 0xd2, 0xda, 0xd6, 0xb3, 0x29, 0xd8, 0x5e, 0xbd, 0x03, 0x99, 0xed, 0x9d, 0x7b, 0xe1, + 0xf6, 0x9a, 0x52, 0xeb, 0xdd, 0xde, 0x5e, 0x4d, 0xb1, 0xbe, 0x80, 0x51, 0xb5, 0x68, 0x93, 0x61, + 0xe8, 0xaf, 0xb6, 0x5a, 0xa5, 0x3e, 0xf6, 0x47, 0xad, 0xb6, 0x52, 0x2a, 0x90, 0x49, 0x80, 0x78, + 0xa7, 0x2a, 0x15, 0xc9, 0x38, 0x8c, 0xc8, 0x9d, 0xa4, 0xd4, 0x8f, 0xf8, 0xed, 0x76, 0x69, 0x80, + 0x10, 0x98, 0x34, 0xd7, 0xb3, 0xd2, 0xa0, 0xf5, 0xbb, 0x05, 0x18, 0x55, 0xdf, 0x21, 0x39, 0x03, + 0x63, 0x3b, 0x1b, 0xb5, 0xad, 0xe5, 0xc5, 0xd5, 0x7b, 0xab, 0xcb, 0x4b, 0xa5, 0x3e, 0x72, 0x09, + 0xce, 0x6f, 0xd7, 0x56, 0xea, 0x4b, 0x0b, 0xf5, 0xb5, 0xcd, 0xc5, 0xea, 0x5a, 0x7d, 0xcb, 0xde, + 0xfc, 0xe2, 0xcb, 0xfa, 0xf6, 0xce, 0xc6, 0xc6, 0xf2, 0x5a, 0xa9, 0x40, 0xca, 0x30, 0xcd, 0x8a, + 0x1f, 0xee, 0x2c, 0x2c, 0xeb, 0x08, 0xa5, 0x22, 0xb9, 0x0a, 0x97, 0xb2, 0x4a, 0xea, 0x2b, 0xcb, + 0xd5, 0xa5, 0xb5, 0xe5, 0x5a, 0xad, 0xd4, 0x4f, 0x66, 0x61, 0x8a, 0xa1, 0x54, 0xb7, 0xb6, 0x0c, + 0xda, 0x01, 0xab, 0x05, 0x63, 0xda, 0x07, 0x40, 0x2e, 0x42, 0x79, 0x71, 0xd9, 0xde, 0xae, 0x6f, + 0xed, 0xd8, 0x5b, 0x9b, 0xb5, 0xe5, 0xba, 0xd9, 0xc2, 0x64, 0xe9, 0xda, 0xe6, 0xfd, 0xd5, 0x8d, + 0x3a, 0x03, 0xd5, 0x4a, 0x05, 0xd6, 0x0c, 0xa3, 0xb4, 0xb6, 0xba, 0x71, 0x7f, 0x6d, 0xb9, 0xbe, + 0x53, 0x5b, 0x16, 0x28, 0x45, 0xeb, 0xa7, 0xc5, 0xd4, 0x96, 0x4e, 0xe6, 0x61, 0xac, 0xc6, 0xed, + 0x15, 0xb8, 0xcc, 0xf1, 0x03, 0x22, 0xd3, 0xd1, 0xc6, 0x85, 0x19, 0x83, 0xaf, 0x60, 0x3a, 0x12, + 0xd3, 0xd2, 0xb6, 0xd8, 0xd7, 0xdc, 0xf0, 0x5b, 0xba, 0x96, 0xd6, 0x16, 0x30, 0x5b, 0x95, 0x92, + 0x79, 0x4d, 0x9f, 0xe3, 0xa7, 0x45, 0x3c, 0x91, 0x48, 0x7d, 0x4e, 0xdf, 0xdb, 0x95, 0x66, 0x37, + 0x1f, 0x0f, 0xa9, 0x50, 0xc3, 0x90, 0x26, 0x43, 0x97, 0x50, 0x78, 0xe4, 0x2d, 0xa9, 0xe9, 0xf2, + 0xd3, 0x1d, 0x6e, 0xf6, 0x89, 0x73, 0x89, 0x50, 0x72, 0xad, 0x4e, 0xce, 0xc6, 0x4a, 0x3e, 0x4a, + 0xce, 0x19, 0x21, 0x0c, 0x64, 0x96, 0xd8, 0x3f, 0xed, 0x04, 0x2a, 0xa9, 0xc0, 0x20, 0x5f, 0x71, + 0xb9, 0x3c, 0x50, 0xb7, 0x6e, 0x31, 0x80, 0xcd, 0xe1, 0xd6, 0x1f, 0xf5, 0xeb, 0x4a, 0x06, 0xd3, + 0xa5, 0x35, 0x79, 0xa3, 0x2e, 0x8d, 0x72, 0x46, 0x28, 0x53, 0x9b, 0x6b, 0x34, 0x0c, 0xf9, 0x79, + 0xa7, 0xa8, 0x86, 0x04, 0x42, 0x0e, 0xac, 0xbb, 0x4d, 0xa6, 0x36, 0x2b, 0x14, 0x76, 0x74, 0xe4, + 0x5f, 0x15, 0x1e, 0x1d, 0xfb, 0xe3, 0xa3, 0xa3, 0xf8, 0x34, 0xf9, 0xd1, 0x31, 0x46, 0x61, 0xa3, + 0x2e, 0xd4, 0x3c, 0x6c, 0xc5, 0x40, 0x3c, 0xea, 0x42, 0x35, 0x14, 0xa3, 0xae, 0x21, 0x91, 0x0f, + 0x01, 0xaa, 0x8f, 0x6a, 0x78, 0x46, 0xb2, 0x37, 0x84, 0xaa, 0x8b, 0x9b, 0x92, 0xf3, 0x2c, 0x14, + 0x47, 0xb0, 0x40, 0x3f, 0x63, 0x6a, 0xd8, 0x64, 0x01, 0x26, 0xaa, 0x3f, 0xe9, 0x04, 0x74, 0xb5, + 0xc9, 0xf6, 0xb5, 0x88, 0x1f, 0xa6, 0x47, 0xf9, 0xc2, 0xeb, 0xb0, 0x82, 0xba, 0x2b, 0x4a, 0x34, + 0x06, 0x26, 0x09, 0xd9, 0x84, 0xb3, 0xf7, 0x17, 0xb7, 0xc4, 0x3c, 0xac, 0x36, 0x1a, 0x7e, 0xc7, + 0x8b, 0x84, 0x7e, 0x7b, 0xf5, 0xf8, 0xa8, 0x72, 0x69, 0xbf, 0xd1, 0xae, 0xcb, 0x39, 0xeb, 0xf0, + 0x62, 0x5d, 0xc1, 0x4d, 0xd1, 0x92, 0x6b, 0xd0, 0xbf, 0x63, 0xaf, 0x8a, 0x93, 0xf6, 0xd9, 0xe3, + 0xa3, 0xca, 0x44, 0x27, 0x70, 0x35, 0x12, 0x56, 0x6a, 0xb5, 0x60, 0xf2, 0x3e, 0x8d, 0xd8, 0xe4, + 0x94, 0x67, 0x9a, 0xee, 0x43, 0xf7, 0x31, 0x8c, 0x3d, 0x72, 0xa3, 0x83, 0x1a, 0x6d, 0x04, 0x34, + 0x92, 0xf6, 0x1c, 0x14, 0xd3, 0x33, 0x37, 0x3a, 0xa8, 0x87, 0x1c, 0xae, 0xef, 0xdd, 0x1a, 0xba, + 0xb5, 0x0c, 0x67, 0x44, 0x6d, 0xea, 0x08, 0x35, 0x6f, 0x32, 0x2c, 0x20, 0x43, 0x1c, 0x2a, 0x9d, + 0xa1, 0xc9, 0xe6, 0x8f, 0x8a, 0x30, 0xb3, 0x78, 0xe0, 0x78, 0xfb, 0x74, 0xcb, 0x09, 0xc3, 0x67, + 0x7e, 0xd0, 0xd4, 0x1a, 0x8f, 0xe7, 0xc7, 0x54, 0xe3, 0xf1, 0xc0, 0x38, 0x0f, 0x63, 0x9b, 0xad, + 0xa6, 0xa4, 0x11, 0x67, 0x5b, 0xac, 0xcb, 0x6f, 0x35, 0xeb, 0x6d, 0xc9, 0x4b, 0x47, 0x62, 0x34, + 0x1b, 0xf4, 0x99, 0xa2, 0xe9, 0x8f, 0x69, 0x3c, 0xfa, 0x4c, 0xa3, 0xd1, 0x90, 0xc8, 0x32, 0x9c, + 0xad, 0xd1, 0x86, 0xef, 0x35, 0xef, 0x39, 0x8d, 0xc8, 0x0f, 0xb6, 0xfd, 0x27, 0xd4, 0x13, 0x93, + 0x10, 0x95, 0xff, 0x10, 0x0b, 0xeb, 0x8f, 0xb1, 0xb4, 0x1e, 0xb1, 0x62, 0x3b, 0x4d, 0x41, 0x36, + 0x61, 0xe4, 0x91, 0xb0, 0x0a, 0x8a, 0x03, 0xf1, 0xeb, 0x37, 0x95, 0x99, 0x70, 0x31, 0xa0, 0x38, + 0x73, 0x9c, 0x96, 0x3a, 0xd2, 0x2b, 0x5d, 0x0a, 0x97, 0x2b, 0x89, 0x69, 0x2b, 0x26, 0xd6, 0x0e, + 0x4c, 0x6c, 0xb5, 0x3a, 0xfb, 0xae, 0xc7, 0x16, 0x96, 0x1a, 0xfd, 0x31, 0x59, 0x02, 0x88, 0x01, + 0xc2, 0xd6, 0x37, 0x25, 0x8e, 0xd1, 0x71, 0xc1, 0xee, 0x5d, 0xf1, 0xb5, 0x21, 0x04, 0x4f, 0x3d, + 0xb6, 0x46, 0x67, 0xfd, 0xcf, 0x7e, 0x20, 0x62, 0x00, 0x70, 0xa3, 0xab, 0xd1, 0x88, 0x6d, 0x41, + 0xe7, 0xa0, 0xa8, 0x4c, 0x72, 0x43, 0xc7, 0x47, 0x95, 0xa2, 0xdb, 0xb4, 0x8b, 0xab, 0x4b, 0xe4, + 0x1d, 0x18, 0x44, 0x34, 0x94, 0xff, 0xa4, 0xaa, 0x4f, 0xe7, 0xc0, 0x17, 0x18, 0xdc, 0x61, 0x6d, + 0x8e, 0x4c, 0xde, 0x85, 0xd1, 0x25, 0xda, 0xa2, 0xfb, 0x4e, 0xe4, 0xcb, 0x25, 0x80, 0x1b, 0xb9, + 0x24, 0x50, 0x9b, 0x73, 0x31, 0x26, 0x3b, 0xf2, 0xda, 0xd4, 0x09, 0x7d, 0x4f, 0x3f, 0xf2, 0x06, + 0x08, 0xd1, 0x8f, 0xbc, 0x1c, 0x87, 0xfc, 0x5e, 0x01, 0xc6, 0xaa, 0x9e, 0x27, 0x8c, 0x47, 0xa1, + 0x90, 0xfa, 0xcc, 0x4d, 0x65, 0x6d, 0x5d, 0x73, 0xf6, 0x68, 0x6b, 0xd7, 0x69, 0x75, 0x68, 0xb8, + 0xf0, 0x35, 0x3b, 0x85, 0xfc, 0x87, 0xa3, 0xca, 0x47, 0xa7, 0x30, 0x07, 0xc5, 0x76, 0xdb, 0xed, + 0xc0, 0x71, 0xa3, 0xf0, 0xf8, 0xa8, 0x32, 0xe3, 0xc4, 0x15, 0xea, 0xdf, 0x8d, 0xd6, 0x8e, 0x78, + 0xfd, 0x1f, 0xea, 0xb5, 0xfe, 0x93, 0x43, 0x38, 0x53, 0x0d, 0xc3, 0xce, 0x21, 0xad, 0x45, 0x4e, + 0x10, 0x6d, 0xbb, 0x87, 0x14, 0x17, 0x91, 0xee, 0x06, 0x84, 0x37, 0x7f, 0x76, 0x54, 0x29, 0xb0, + 0x83, 0x8f, 0x83, 0xa4, 0x4c, 0xb7, 0x09, 0xa2, 0x7a, 0xe4, 0xea, 0x5b, 0x18, 0x9a, 0x12, 0x92, + 0xbc, 0xad, 0x6b, 0x4a, 0xe9, 0x58, 0x5d, 0xca, 0x1b, 0x71, 0x6b, 0x11, 0x2e, 0xde, 0xa7, 0x91, + 0x4d, 0x43, 0x1a, 0xc9, 0x6f, 0x04, 0x67, 0x78, 0x6c, 0xc0, 0x1d, 0xc6, 0xdf, 0x8a, 0x18, 0x87, + 0x9f, 0x7f, 0x17, 0xb2, 0xc4, 0xfa, 0xbf, 0x0a, 0x50, 0x59, 0x0c, 0x28, 0x3f, 0x33, 0xe4, 0x30, + 0xea, 0xbe, 0x76, 0x5d, 0x84, 0x81, 0xed, 0xe7, 0x6d, 0x69, 0x79, 0xc1, 0x52, 0x36, 0x28, 0x36, + 0x42, 0x4f, 0x68, 0xc8, 0xb2, 0x1e, 0xc3, 0x8c, 0x4d, 0x3d, 0xfa, 0xcc, 0xd9, 0x6b, 0x51, 0xc3, + 0x16, 0x54, 0x81, 0x41, 0xfe, 0xa1, 0xa7, 0xba, 0xc0, 0xe1, 0xa7, 0xb3, 0xab, 0x59, 0x13, 0x30, + 0xb6, 0xe5, 0x7a, 0xfb, 0x82, 0xbb, 0xf5, 0x87, 0xfd, 0x30, 0xce, 0x7f, 0x8b, 0x63, 0x50, 0x62, + 0x8b, 0x2b, 0x9c, 0x64, 0x8b, 0x7b, 0x1f, 0x26, 0xd8, 0x1e, 0x41, 0x83, 0x5d, 0x1a, 0xb0, 0xad, + 0x55, 0x48, 0x02, 0x8f, 0x74, 0x21, 0x16, 0xd4, 0x9f, 0xf2, 0x12, 0xdb, 0x44, 0x24, 0x6b, 0x30, + 0xc9, 0x01, 0xf7, 0xa8, 0x13, 0x75, 0x62, 0xab, 0xd4, 0x19, 0x71, 0xee, 0x91, 0x60, 0x3e, 0x35, + 0x05, 0xaf, 0xc7, 0x02, 0x68, 0x27, 0x68, 0xc9, 0xa7, 0x70, 0x66, 0x2b, 0xf0, 0xbf, 0x79, 0xae, + 0x6d, 0xea, 0xfc, 0xeb, 0xe4, 0x27, 0x24, 0x56, 0x54, 0xd7, 0xb7, 0xf6, 0x24, 0x36, 0x79, 0x0b, + 0x46, 0x56, 0xc3, 0x05, 0x3f, 0x70, 0xbd, 0x7d, 0xfc, 0x46, 0x47, 0xb8, 0x31, 0xdf, 0x0d, 0xeb, + 0x7b, 0x08, 0xb4, 0x55, 0x71, 0xc2, 0xec, 0x3c, 0xdc, 0xdb, 0xec, 0x7c, 0x1b, 0x60, 0xcd, 0x77, + 0x9a, 0xd5, 0x56, 0x6b, 0xb1, 0x1a, 0xe2, 0xee, 0x29, 0xf6, 0xa3, 0x96, 0xef, 0x34, 0xeb, 0x4e, + 0xab, 0x55, 0x6f, 0x38, 0xa1, 0xad, 0xe1, 0x3c, 0x18, 0x18, 0x19, 0x2a, 0x0d, 0xdb, 0x67, 0xd6, + 0xdc, 0x06, 0xf5, 0x42, 0xfa, 0xc8, 0x09, 0x3c, 0xd7, 0xdb, 0x0f, 0xad, 0x7f, 0x71, 0x16, 0x46, + 0x54, 0x97, 0x6f, 0xea, 0x8a, 0xbd, 0xd8, 0xe5, 0x70, 0xf4, 0x63, 0xb3, 0x95, 0xad, 0x61, 0x90, + 0xf3, 0xa8, 0xea, 0x8b, 0xfd, 0x75, 0x98, 0xcd, 0x46, 0xa7, 0xdd, 0xb6, 0x19, 0x8c, 0x7d, 0x65, + 0x4b, 0x0b, 0x28, 0xff, 0x11, 0xfe, 0x95, 0x35, 0xf7, 0xec, 0xe2, 0xd2, 0x02, 0x9b, 0xde, 0x9b, + 0xab, 0x4b, 0x8b, 0x28, 0xca, 0x11, 0x3e, 0xbd, 0x7d, 0xb7, 0xd9, 0xb0, 0x11, 0xca, 0x4a, 0x6b, + 0xd5, 0xf5, 0x35, 0x21, 0x2e, 0x2c, 0x0d, 0x9d, 0xc3, 0x96, 0x8d, 0x50, 0xa6, 0x1c, 0x72, 0x0b, + 0xc4, 0xa2, 0xef, 0x45, 0x81, 0xdf, 0x0a, 0x51, 0x83, 0x19, 0xe1, 0xc3, 0x29, 0x4c, 0x17, 0x0d, + 0x51, 0x64, 0x27, 0x50, 0xc9, 0x23, 0x98, 0xad, 0x36, 0x9f, 0x3a, 0x5e, 0x83, 0x36, 0x79, 0xc9, + 0x23, 0x3f, 0x78, 0xf2, 0xb8, 0xe5, 0x3f, 0x0b, 0x51, 0xde, 0x23, 0xc2, 0xd2, 0x27, 0x50, 0xa4, + 0x25, 0xe4, 0x99, 0x44, 0xb2, 0xf3, 0xa8, 0xd9, 0x27, 0xb5, 0xd8, 0xf2, 0x3b, 0x4d, 0x31, 0x0a, + 0xf8, 0x49, 0x35, 0x18, 0xc0, 0xe6, 0x70, 0x26, 0xa5, 0x95, 0xda, 0x3a, 0xda, 0xd5, 0x84, 0x94, + 0x0e, 0xc2, 0x43, 0x9b, 0xc1, 0xc8, 0xeb, 0x30, 0x2c, 0xf5, 0x5c, 0x6e, 0xf8, 0x47, 0x83, 0xb3, + 0xd4, 0x6f, 0x65, 0x19, 0xfb, 0x24, 0x6c, 0xda, 0xf0, 0x9f, 0xd2, 0xe0, 0xf9, 0xa2, 0xdf, 0xa4, + 0xd2, 0x0a, 0x24, 0xac, 0x1c, 0xbc, 0xa0, 0xde, 0x60, 0x25, 0xb6, 0x89, 0xc8, 0x2a, 0xe0, 0x7b, + 0x60, 0x58, 0x3e, 0x13, 0x57, 0xc0, 0xf7, 0xc8, 0xd0, 0x96, 0x65, 0x64, 0x09, 0xce, 0x56, 0x3b, + 0x91, 0x7f, 0xe8, 0x44, 0x6e, 0x63, 0xa7, 0xbd, 0x1f, 0x38, 0xac, 0x92, 0x12, 0x12, 0xa0, 0xde, + 0xef, 0xc8, 0xc2, 0x7a, 0x47, 0x94, 0xda, 0x69, 0x02, 0xf2, 0x1e, 0x8c, 0xaf, 0x86, 0xdc, 0xd2, + 0xe7, 0x84, 0xb4, 0x89, 0xe6, 0x1a, 0xd1, 0x4a, 0x37, 0xac, 0xa3, 0xdd, 0xaf, 0xce, 0x4e, 0x0a, + 0x4d, 0xdb, 0xc0, 0x23, 0x16, 0x0c, 0x55, 0xc3, 0xd0, 0x0d, 0x23, 0xb4, 0xc2, 0x8c, 0x2c, 0xc0, + 0xf1, 0x51, 0x65, 0xc8, 0x41, 0x88, 0x2d, 0x4a, 0xc8, 0x23, 0x18, 0x5b, 0xa2, 0x4c, 0x71, 0xdc, + 0x0e, 0x3a, 0x61, 0x84, 0x36, 0x95, 0xb1, 0xf9, 0xf3, 0xe2, 0xc3, 0xd6, 0x4a, 0xc4, 0x5c, 0xe6, + 0xda, 0x5e, 0x13, 0xe1, 0xf5, 0x88, 0x15, 0xe8, 0xbb, 0x96, 0x86, 0xcf, 0xb4, 0x62, 0x41, 0xb3, + 0xe2, 0x36, 0xd9, 0xa7, 0x3a, 0x8d, 0x6d, 0x40, 0xad, 0x58, 0xac, 0x0d, 0xf5, 0x03, 0x2c, 0xd1, + 0xb5, 0x62, 0x83, 0x84, 0x34, 0x52, 0xc6, 0xe3, 0x19, 0xc3, 0x40, 0x68, 0x16, 0xca, 0x26, 0x9e, + 0xd2, 0xb4, 0xfc, 0x31, 0x8c, 0x2d, 0x76, 0xc2, 0xc8, 0x3f, 0xdc, 0x3e, 0xa0, 0x87, 0x14, 0xed, + 0x2e, 0x42, 0xf7, 0x6f, 0x20, 0xb8, 0x1e, 0x31, 0xb8, 0xde, 0x4d, 0x0d, 0x9d, 0x7c, 0x0e, 0x44, + 0x2a, 0xf1, 0xf7, 0xd9, 0xfc, 0xf0, 0xd8, 0x5c, 0x46, 0xd3, 0xcb, 0x08, 0xd7, 0xdc, 0xa5, 0xee, + 0x5f, 0xdf, 0x57, 0xc5, 0xba, 0xf9, 0x2f, 0x4d, 0xcc, 0x1a, 0xc4, 0x9b, 0x78, 0x3f, 0x70, 0xda, + 0x07, 0xe5, 0x72, 0xac, 0x65, 0x8b, 0x4e, 0xed, 0x33, 0xb8, 0xa1, 0x2d, 0xc4, 0xe8, 0xa4, 0x06, + 0xc0, 0x7f, 0xae, 0xb1, 0x81, 0xe7, 0xc6, 0x9a, 0xb2, 0x21, 0x2f, 0x56, 0x20, 0x65, 0x75, 0x1e, + 0x75, 0x10, 0xce, 0xb6, 0xe5, 0x1a, 0xa3, 0xa9, 0xb1, 0x21, 0x4f, 0xa0, 0xc4, 0x7f, 0xad, 0xfb, + 0x9e, 0x1b, 0xf1, 0xa5, 0x77, 0xce, 0xb0, 0xec, 0x25, 0x8b, 0x65, 0x05, 0x68, 0x51, 0x15, 0x15, + 0x1c, 0xaa, 0x52, 0xad, 0x9a, 0x14, 0x63, 0xb2, 0x05, 0x63, 0x5b, 0x81, 0xdf, 0xec, 0x34, 0x22, + 0xdc, 0xb0, 0x2f, 0xa0, 0xa2, 0x48, 0x44, 0x3d, 0x5a, 0x09, 0x97, 0x49, 0x9b, 0x03, 0xea, 0x6c, + 0x33, 0xd7, 0x65, 0xa2, 0x21, 0x92, 0x05, 0x18, 0xda, 0xf2, 0x5b, 0x6e, 0xe3, 0x79, 0xf9, 0x22, + 0x36, 0x7a, 0x5a, 0x32, 0x43, 0xa0, 0x6c, 0x2a, 0x6a, 0x87, 0x6d, 0x04, 0xe9, 0xda, 0x21, 0x47, + 0x22, 0x55, 0x98, 0xf8, 0x9c, 0x4d, 0x18, 0xd7, 0xf7, 0x3c, 0xc7, 0x0d, 0x68, 0xf9, 0x12, 0x8e, + 0x0b, 0x5a, 0xbd, 0x7f, 0xac, 0x17, 0xe8, 0xd3, 0xd9, 0xa0, 0x20, 0xab, 0x70, 0x66, 0x35, 0xac, + 0x45, 0x81, 0xdb, 0xa6, 0xeb, 0x8e, 0xe7, 0xec, 0xd3, 0x66, 0xf9, 0x72, 0x6c, 0x76, 0x76, 0xc3, + 0x7a, 0x88, 0x65, 0xf5, 0x43, 0x5e, 0xa8, 0x9b, 0x9d, 0x13, 0x74, 0xe4, 0x0b, 0x98, 0x5e, 0xfe, + 0x26, 0x62, 0x33, 0xa6, 0x55, 0xed, 0x34, 0xdd, 0xa8, 0x16, 0xf9, 0x81, 0xb3, 0x4f, 0xcb, 0x15, + 0xe4, 0xf7, 0xda, 0xf1, 0x51, 0xe5, 0x0a, 0x15, 0xe5, 0x75, 0x87, 0x21, 0xd4, 0x43, 0x8e, 0xa1, + 0x5f, 0x27, 0x67, 0x71, 0x60, 0xd2, 0xaf, 0x75, 0xda, 0x4c, 0x71, 0x45, 0xe9, 0x5f, 0x31, 0xa4, + 0xaf, 0x95, 0x70, 0xe9, 0x87, 0x1c, 0x90, 0x92, 0xbe, 0x86, 0x48, 0x6c, 0x20, 0x0f, 0x7c, 0xd7, + 0xab, 0x36, 0x22, 0xf7, 0x29, 0x15, 0xe7, 0xfa, 0xb0, 0x7c, 0x15, 0x5b, 0x8a, 0x26, 0xf2, 0x5f, + 0xf5, 0x5d, 0xaf, 0xee, 0x60, 0x71, 0x5d, 0x58, 0x01, 0x0c, 0x13, 0x79, 0x9a, 0x9a, 0xfc, 0x10, + 0xce, 0xad, 0xfb, 0x7b, 0x6e, 0x8b, 0xf2, 0x25, 0x87, 0x8b, 0x05, 0xcd, 0x7d, 0x16, 0xf2, 0x45, + 0x13, 0xf9, 0x21, 0x62, 0xd4, 0xc5, 0x6a, 0x75, 0xa8, 0x70, 0x74, 0x13, 0x79, 0x36, 0x17, 0xb2, + 0x0c, 0xe3, 0xf8, 0x5d, 0xb6, 0xf0, 0x67, 0x58, 0xbe, 0x86, 0xa7, 0xa3, 0xab, 0x09, 0x85, 0xe7, + 0xe6, 0xb2, 0x86, 0xb3, 0xec, 0x45, 0xc1, 0x73, 0xdb, 0x20, 0x23, 0x9f, 0xc0, 0x5c, 0x72, 0x7a, + 0x2f, 0xfa, 0xde, 0x63, 0x77, 0xbf, 0x13, 0xd0, 0x66, 0xf9, 0x35, 0xd6, 0x54, 0xbb, 0x0b, 0xc6, + 0xdc, 0x23, 0x38, 0x9b, 0xaa, 0x82, 0x94, 0xa0, 0xff, 0x89, 0xb8, 0x71, 0x1c, 0xb5, 0xd9, 0x9f, + 0xe4, 0x6d, 0x18, 0x7c, 0xca, 0x8e, 0x25, 0xa8, 0x31, 0xc4, 0x77, 0x58, 0x1a, 0xe9, 0xaa, 0xf7, + 0xd8, 0xb7, 0x39, 0xd2, 0x87, 0xc5, 0xf7, 0x0b, 0x0f, 0x06, 0x46, 0xc6, 0x4a, 0xe3, 0xfc, 0xa2, + 0xf8, 0xc1, 0xc0, 0xc8, 0x44, 0x69, 0xd2, 0xaa, 0xc2, 0x99, 0x04, 0x3e, 0x29, 0xc3, 0x30, 0xf5, + 0x98, 0xaa, 0xdb, 0xe4, 0x3a, 0x8b, 0x2d, 0x7f, 0x92, 0x69, 0x18, 0x6c, 0xb9, 0x87, 0x6e, 0x84, + 0x15, 0x0e, 0xda, 0xfc, 0x87, 0xf5, 0xfb, 0x05, 0x20, 0xe9, 0x2d, 0x83, 0xdc, 0x4a, 0xb0, 0xe1, + 0x8a, 0x9e, 0x00, 0xe9, 0xa6, 0x70, 0xc9, 0xfd, 0x73, 0x98, 0xe2, 0x63, 0x26, 0x37, 0x37, 0xad, + 0x2e, 0xbe, 0xa8, 0x66, 0x14, 0xeb, 0xe6, 0x10, 0x51, 0x8c, 0x5b, 0xe1, 0x1a, 0x36, 0xad, 0x03, + 0x33, 0x99, 0x9b, 0x05, 0x59, 0x87, 0x99, 0x43, 0xdf, 0x8b, 0x0e, 0x5a, 0xcf, 0xe5, 0x5e, 0x21, + 0x6a, 0x2b, 0x60, 0x6d, 0xb8, 0x3e, 0x66, 0x22, 0xd8, 0x53, 0x02, 0x2c, 0x38, 0x62, 0x3d, 0x0f, + 0x06, 0x46, 0x8a, 0xa5, 0x7e, 0xd5, 0x13, 0xcb, 0x86, 0xb3, 0xa9, 0x35, 0x97, 0x7c, 0x1f, 0xc6, + 0x1b, 0x78, 0x94, 0x31, 0x6a, 0xe2, 0x3b, 0x8e, 0x06, 0xd7, 0x3f, 0x27, 0x0e, 0xe7, 0x5d, 0xf9, + 0x27, 0x05, 0x98, 0xcd, 0x59, 0x6d, 0x4f, 0x2f, 0xea, 0x2f, 0xe1, 0xdc, 0xa1, 0xf3, 0x4d, 0x3d, + 0xc0, 0x93, 0x6a, 0x3d, 0x70, 0xbc, 0x84, 0xb4, 0x71, 0x25, 0xc9, 0xc6, 0xd0, 0xbd, 0x75, 0x0e, + 0x9d, 0x6f, 0x6c, 0x44, 0xb0, 0x59, 0x39, 0x6f, 0xe7, 0x67, 0x30, 0x61, 0xac, 0xaf, 0xa7, 0x6e, + 0x9c, 0x75, 0x07, 0xce, 0xb2, 0xb3, 0x7c, 0x44, 0x4f, 0x6c, 0xa1, 0xb2, 0xb6, 0x00, 0x6a, 0xf4, + 0xd0, 0x69, 0x1f, 0xf8, 0x4c, 0xef, 0x5e, 0xd0, 0x7f, 0x09, 0x0b, 0x07, 0x11, 0x16, 0x07, 0x55, + 0xb0, 0x7b, 0x97, 0xeb, 0xe2, 0xa1, 0xc2, 0xb4, 0x35, 0x2a, 0xeb, 0xcf, 0x8a, 0x40, 0xc4, 0x02, + 0x19, 0x50, 0xe7, 0x50, 0x36, 0xe3, 0x03, 0x18, 0xe7, 0xe7, 0x51, 0x0e, 0xc6, 0xe6, 0x8c, 0xcd, + 0x4f, 0x89, 0x2f, 0x4f, 0x2f, 0x5a, 0xe9, 0xb3, 0x0d, 0x54, 0x46, 0x6a, 0x53, 0x7e, 0x90, 0x46, + 0xd2, 0xa2, 0x41, 0xaa, 0x17, 0x31, 0x52, 0xfd, 0x37, 0xf9, 0x14, 0x26, 0x17, 0xfd, 0xc3, 0x36, + 0x93, 0x89, 0x20, 0xee, 0x17, 0x46, 0x0a, 0x51, 0xaf, 0x51, 0xb8, 0xd2, 0x67, 0x27, 0xd0, 0xc9, + 0x06, 0x4c, 0xdd, 0x6b, 0x75, 0xc2, 0x83, 0xaa, 0xd7, 0x5c, 0x6c, 0xf9, 0xa1, 0xe4, 0x32, 0x20, + 0x8c, 0x04, 0x62, 0x79, 0x4b, 0x63, 0xac, 0xf4, 0xd9, 0x59, 0x84, 0xe4, 0x75, 0x18, 0x5c, 0x7e, + 0xca, 0x96, 0x5d, 0xe9, 0xb3, 0x21, 0x5c, 0xca, 0x36, 0x3d, 0xba, 0xf9, 0x78, 0xa5, 0xcf, 0xe6, + 0xa5, 0x0b, 0xa3, 0x30, 0x2c, 0xcf, 0xb2, 0xb7, 0x98, 0x4a, 0xac, 0xc4, 0x59, 0x8b, 0x9c, 0xa8, + 0x13, 0x92, 0x39, 0x18, 0xd9, 0x69, 0xb3, 0x23, 0x96, 0x34, 0x02, 0xd8, 0xea, 0xb7, 0xf5, 0xb6, + 0x29, 0x69, 0x72, 0x51, 0xb7, 0x1f, 0x73, 0xe4, 0x18, 0x60, 0xad, 0x98, 0xc2, 0xed, 0x8e, 0x6d, + 0xd4, 0x5b, 0x4c, 0xd4, 0x5b, 0x4a, 0xca, 0xda, 0x9a, 0xc9, 0x14, 0x9e, 0xf5, 0x05, 0x5c, 0xde, + 0x69, 0x87, 0x34, 0x88, 0xaa, 0xed, 0x76, 0xcb, 0x6d, 0xf0, 0x3b, 0x1f, 0x3c, 0xf3, 0xca, 0xc9, + 0xf2, 0x1e, 0x0c, 0x71, 0x80, 0x98, 0x26, 0x72, 0x0e, 0x56, 0xdb, 0x6d, 0x71, 0xd2, 0xbe, 0xcb, + 0x95, 0x73, 0x7e, 0x76, 0xb6, 0x05, 0xb6, 0xf5, 0x3b, 0x05, 0xb8, 0xcc, 0xbf, 0x80, 0x5c, 0xd6, + 0xdf, 0x81, 0x51, 0xf4, 0xe8, 0x6a, 0x3b, 0x0d, 0xf9, 0x4d, 0x70, 0xd7, 0x36, 0x09, 0xb4, 0xe3, + 0x72, 0xcd, 0x57, 0xae, 0x98, 0xef, 0x2b, 0x27, 0x3f, 0xb0, 0xfe, 0xcc, 0x0f, 0xec, 0x73, 0xb0, + 0x44, 0x8b, 0x5a, 0xad, 0x54, 0xa3, 0xc2, 0x17, 0x69, 0x95, 0xf5, 0x5f, 0x8b, 0x30, 0x7b, 0x9f, + 0x7a, 0x34, 0x70, 0xb0, 0x9f, 0x86, 0x4d, 0x47, 0xf7, 0x99, 0x29, 0x74, 0xf5, 0x99, 0xa9, 0x48, + 0x2b, 0x59, 0x11, 0xad, 0x64, 0x29, 0x07, 0x20, 0x76, 0x5c, 0xdc, 0xb1, 0x57, 0x45, 0xb7, 0xf0, + 0xb8, 0xd8, 0x09, 0x5c, 0xb4, 0x83, 0x93, 0xd5, 0xd8, 0xdf, 0x66, 0xa0, 0xa7, 0xb9, 0x6c, 0x4a, + 0xf8, 0x1f, 0x0c, 0x0b, 0x7f, 0x1b, 0xd3, 0xcb, 0x66, 0x03, 0x86, 0xb8, 0x71, 0x0f, 0x6f, 0x6b, + 0xc6, 0xe6, 0x6f, 0x88, 0x6f, 0x2a, 0xa7, 0x83, 0xc2, 0x12, 0x88, 0x1b, 0x3b, 0x9f, 0x02, 0x11, + 0x02, 0x6c, 0xc1, 0x65, 0xee, 0x73, 0x18, 0xd3, 0x50, 0x4e, 0xb2, 0xf7, 0x2b, 0x23, 0x23, 0xd3, + 0x18, 0xbd, 0x7d, 0x6e, 0xaf, 0xd4, 0xf6, 0x7e, 0xeb, 0x23, 0x28, 0xa7, 0x5b, 0x23, 0x0c, 0x4b, + 0xbd, 0xec, 0x58, 0xd6, 0x12, 0x4c, 0xdf, 0xa7, 0x11, 0x4e, 0x5c, 0xfc, 0x88, 0x34, 0xbf, 0xb1, + 0xc4, 0x77, 0x26, 0x57, 0x55, 0x79, 0xab, 0xa3, 0x7f, 0xa5, 0x35, 0x98, 0x49, 0x70, 0x11, 0xf5, + 0x7f, 0x08, 0xc3, 0x02, 0xa4, 0x56, 0x54, 0xe1, 0x7c, 0x4a, 0xf7, 0x44, 0xc1, 0xee, 0x3c, 0x9f, + 0xb7, 0x82, 0xb3, 0x2d, 0x09, 0xac, 0x03, 0x38, 0xc7, 0xb6, 0xd9, 0x98, 0xab, 0x9a, 0x8e, 0x17, + 0x60, 0xb4, 0xcd, 0x14, 0x85, 0xd0, 0xfd, 0x09, 0x9f, 0x46, 0x83, 0xf6, 0x08, 0x03, 0xd4, 0xdc, + 0x9f, 0x50, 0x72, 0x09, 0x00, 0x0b, 0xb1, 0x9b, 0x62, 0x15, 0x40, 0x74, 0x6e, 0xb8, 0x23, 0x80, + 0x5e, 0x67, 0x7c, 0xde, 0xd8, 0xf8, 0xb7, 0x15, 0xc0, 0x6c, 0xaa, 0x26, 0xd1, 0x81, 0x5b, 0x30, + 0x22, 0x55, 0xd8, 0x84, 0x49, 0x5d, 0xef, 0x81, 0xad, 0x90, 0xc8, 0x1b, 0x70, 0xc6, 0xa3, 0xdf, + 0x44, 0xf5, 0x54, 0x1b, 0x26, 0x18, 0x78, 0x4b, 0xb6, 0xc3, 0xfa, 0x15, 0x34, 0xa3, 0xd6, 0x3c, + 0xff, 0xd9, 0xe3, 0x96, 0xf3, 0x84, 0xa6, 0x2a, 0xfe, 0x3e, 0x8c, 0xd4, 0x7a, 0x57, 0xcc, 0x3f, + 0x1f, 0x59, 0xb9, 0xad, 0x48, 0xac, 0x16, 0xcc, 0xb1, 0x2e, 0xd5, 0xaa, 0xeb, 0x6b, 0xab, 0xcd, + 0xad, 0x6f, 0x5b, 0x80, 0x4f, 0xe1, 0x42, 0x66, 0x6d, 0xdf, 0xb6, 0x10, 0xff, 0xd5, 0x00, 0xcc, + 0xf2, 0xcd, 0x24, 0x3d, 0x83, 0x4f, 0xbe, 0xd4, 0xfc, 0x52, 0x6e, 0x24, 0x6f, 0x67, 0xdc, 0x48, + 0x22, 0x89, 0x7e, 0x23, 0x69, 0xdc, 0x43, 0xbe, 0x9f, 0x7d, 0x0f, 0x89, 0x76, 0x22, 0xf3, 0x1e, + 0x32, 0x79, 0xfb, 0xb8, 0x9c, 0x7f, 0xfb, 0x88, 0xd7, 0x2c, 0x19, 0xb7, 0x8f, 0x59, 0x77, 0x8e, + 0x09, 0xd7, 0x9f, 0x91, 0x57, 0xeb, 0xfa, 0xf3, 0x06, 0x0c, 0x57, 0xdb, 0x6d, 0xcd, 0x95, 0x0e, + 0x87, 0xc7, 0x69, 0xb7, 0xb9, 0xf0, 0x64, 0xa1, 0x5c, 0xe7, 0x21, 0x63, 0x9d, 0xff, 0x00, 0x60, + 0x11, 0x1d, 0xfe, 0x71, 0xe0, 0xc6, 0x10, 0x03, 0x35, 0x7c, 0xfe, 0x0c, 0x00, 0x07, 0x4e, 0xb7, + 0x80, 0xc4, 0xc8, 0x5c, 0xb1, 0xb7, 0x76, 0xa1, 0x9c, 0x9e, 0x3e, 0xaf, 0x60, 0xe9, 0xfa, 0xe3, + 0x02, 0x5c, 0x12, 0x4a, 0x4e, 0xe2, 0x03, 0x3f, 0xfd, 0xec, 0x7c, 0x17, 0xc6, 0x05, 0xed, 0x76, + 0xfc, 0x21, 0xf0, 0x2b, 0x60, 0xb9, 0x18, 0xf3, 0x15, 0xdd, 0x40, 0x23, 0xef, 0xc2, 0x08, 0xfe, + 0x11, 0x5f, 0x83, 0x30, 0xc9, 0x8c, 0x22, 0x6a, 0x3d, 0x79, 0x19, 0xa2, 0x50, 0xad, 0xaf, 0xe1, + 0x72, 0x5e, 0xc3, 0x5f, 0x81, 0x5c, 0xfe, 0x75, 0x01, 0x2e, 0x08, 0xf6, 0xc6, 0x52, 0xf1, 0x42, + 0xbb, 0xce, 0x29, 0x1c, 0x70, 0x1f, 0xc0, 0x18, 0xab, 0x50, 0xb6, 0xbb, 0x5f, 0x6c, 0xad, 0xe2, + 0xe4, 0x10, 0x97, 0x2c, 0x39, 0x91, 0x23, 0x1c, 0x4a, 0x9c, 0xc3, 0x96, 0x34, 0x5e, 0xd8, 0x3a, + 0xb1, 0xf5, 0x15, 0x5c, 0xcc, 0xee, 0xc2, 0x2b, 0x90, 0xcf, 0x03, 0x98, 0xcb, 0xd8, 0x14, 0x5e, + 0x6c, 0x4f, 0xfe, 0x12, 0x2e, 0x64, 0xf2, 0x7a, 0x05, 0xcd, 0x5c, 0x61, 0x1a, 0x47, 0xf4, 0x0a, + 0x86, 0xd0, 0x7a, 0x04, 0xe7, 0x33, 0x38, 0xbd, 0x82, 0x26, 0xde, 0x87, 0x59, 0xa5, 0x69, 0xbf, + 0x54, 0x0b, 0xd7, 0xe1, 0x12, 0x67, 0xf4, 0x6a, 0x46, 0xe5, 0x21, 0x5c, 0x10, 0xec, 0x5e, 0x81, + 0xf4, 0x56, 0xe0, 0x62, 0x7c, 0xa0, 0xce, 0xd0, 0x93, 0x4e, 0xbc, 0xc8, 0x58, 0x6b, 0x70, 0x25, + 0xe6, 0x94, 0xa3, 0x34, 0x9c, 0x9c, 0x1b, 0x57, 0x07, 0xe3, 0x51, 0x7a, 0x25, 0x23, 0xfa, 0x08, + 0xce, 0x19, 0x4c, 0x5f, 0x99, 0xaa, 0xb4, 0x0a, 0x53, 0x9c, 0xb1, 0xa9, 0x3a, 0xcf, 0xeb, 0xaa, + 0xf3, 0xd8, 0xfc, 0xd9, 0x98, 0x25, 0x82, 0x77, 0xef, 0x66, 0x68, 0xd3, 0xeb, 0xa8, 0x4d, 0x4b, + 0x94, 0xb8, 0x85, 0xef, 0xc2, 0x10, 0x87, 0x88, 0xf6, 0x65, 0x30, 0xe3, 0x87, 0x05, 0x4e, 0x26, + 0x90, 0xad, 0x1f, 0xc2, 0x25, 0x7e, 0x12, 0x8d, 0xef, 0x12, 0xcd, 0xd3, 0xe2, 0xf7, 0x13, 0x07, + 0xd1, 0xf3, 0x82, 0x6f, 0x12, 0x3f, 0xe7, 0x3c, 0xba, 0x27, 0xe7, 0x76, 0x1e, 0xff, 0x13, 0x3d, + 0xc6, 0x92, 0x07, 0xcc, 0x62, 0xe6, 0x01, 0xf3, 0x1a, 0x5c, 0x55, 0x07, 0xcc, 0x64, 0x35, 0x72, + 0x6a, 0x59, 0x5f, 0xc1, 0x05, 0xde, 0x51, 0xe9, 0x24, 0x67, 0x36, 0xe3, 0xa3, 0x44, 0x37, 0x67, + 0x45, 0x37, 0x4d, 0xec, 0x9c, 0x4e, 0xfe, 0xbf, 0x05, 0xf9, 0xc9, 0x65, 0x33, 0xff, 0x65, 0x9f, + 0xb8, 0x37, 0xa0, 0xa2, 0x04, 0x62, 0xb6, 0xe8, 0xc5, 0x8e, 0xdb, 0xeb, 0x30, 0xa3, 0xb3, 0x71, + 0x1b, 0x74, 0xf7, 0x0e, 0x5e, 0xf2, 0xbc, 0xc3, 0x3e, 0x0b, 0x04, 0xc8, 0x69, 0x57, 0xce, 0x90, + 0x1b, 0xe2, 0xdb, 0x0a, 0xd3, 0xaa, 0xc3, 0xc5, 0xf4, 0x50, 0xb8, 0x0d, 0xe9, 0x21, 0x4f, 0x3e, + 0x65, 0x9f, 0x30, 0x42, 0xc4, 0x60, 0xe4, 0x32, 0x95, 0xdf, 0x31, 0x27, 0x97, 0x54, 0x96, 0x25, + 0x97, 0x9a, 0x44, 0xff, 0x59, 0xed, 0x72, 0x3e, 0xfc, 0x3a, 0x10, 0x59, 0xb4, 0x58, 0xb3, 0x65, + 0xd5, 0xe7, 0xa1, 0x7f, 0xb1, 0x66, 0x8b, 0xa7, 0x39, 0xa8, 0x09, 0x36, 0xc2, 0xc0, 0x66, 0xb0, + 0xa4, 0x46, 0x5e, 0x3c, 0x81, 0x46, 0xfe, 0x60, 0x60, 0xa4, 0xbf, 0x34, 0x60, 0x93, 0x9a, 0xbb, + 0xef, 0x3d, 0x72, 0xa3, 0x03, 0x55, 0x61, 0xd5, 0xfa, 0x01, 0x4c, 0x19, 0xd5, 0x8b, 0xaf, 0xb8, + 0xeb, 0x9b, 0x22, 0xa6, 0xcf, 0x2e, 0x56, 0xd1, 0x89, 0x04, 0x4d, 0x16, 0xe3, 0x7c, 0xbd, 0x69, + 0x38, 0x75, 0x7c, 0xb0, 0x6a, 0xcb, 0x42, 0xeb, 0x1f, 0x0f, 0x68, 0xdc, 0xb5, 0x97, 0x5a, 0x5d, + 0x7a, 0x77, 0x07, 0x80, 0xcf, 0x10, 0xad, 0x73, 0x4c, 0x01, 0x1c, 0x13, 0xbe, 0x19, 0x7c, 0x49, + 0xb6, 0x35, 0xa4, 0x93, 0xbe, 0xe4, 0x12, 0x1e, 0xb5, 0x9c, 0x48, 0x3e, 0x5e, 0x54, 0x1e, 0xb5, + 0x82, 0x75, 0x68, 0xeb, 0x48, 0xe4, 0x87, 0xc9, 0xe7, 0x06, 0x83, 0x78, 0xa7, 0xf4, 0x9a, 0xbc, + 0x64, 0x4e, 0xf7, 0xed, 0x74, 0x2f, 0x0e, 0x9e, 0xc1, 0x0c, 0xa3, 0x75, 0x1f, 0xe3, 0xc1, 0x62, + 0xf9, 0x9b, 0x88, 0x7a, 0x7c, 0x6d, 0x1f, 0xc2, 0x7a, 0x5e, 0xef, 0x52, 0x4f, 0x8c, 0x2c, 0xec, + 0xef, 0x31, 0x9f, 0x3a, 0x55, 0x65, 0x76, 0x36, 0x7f, 0x9c, 0x44, 0xf6, 0xda, 0xb2, 0xd7, 0x6c, + 0xfb, 0xae, 0x3a, 0x30, 0xf1, 0x49, 0x14, 0xb4, 0xea, 0x54, 0xc0, 0x6d, 0x1d, 0xc9, 0x7a, 0xa3, + 0xab, 0x9f, 0xf6, 0x08, 0x0c, 0x6c, 0x2f, 0x6e, 0xaf, 0x95, 0x0a, 0xd6, 0x2d, 0x00, 0xad, 0x26, + 0x80, 0xa1, 0x8d, 0x4d, 0x7b, 0xbd, 0xba, 0x56, 0xea, 0x23, 0x33, 0x70, 0xf6, 0xd1, 0xea, 0xc6, + 0xd2, 0xe6, 0xa3, 0x5a, 0xbd, 0xb6, 0x5e, 0xb5, 0xb7, 0x17, 0xab, 0xf6, 0x52, 0xa9, 0x60, 0x7d, + 0x0d, 0xd3, 0x66, 0x0f, 0x5f, 0xe9, 0x24, 0x8c, 0x60, 0x4a, 0xe9, 0x33, 0x0f, 0x1e, 0x6d, 0x6b, + 0xfe, 0x9b, 0xe2, 0xf0, 0x97, 0xf4, 0x43, 0x12, 0xc7, 0x44, 0xf1, 0x19, 0x69, 0x48, 0xe4, 0x2d, + 0xae, 0x16, 0x24, 0xdf, 0xe2, 0x32, 0xb5, 0xa0, 0x1e, 0xeb, 0x05, 0xb8, 0xf4, 0x7d, 0x0f, 0xa6, + 0xcd, 0x5a, 0x4f, 0x6a, 0xa5, 0x7a, 0x0d, 0x1d, 0x5b, 0xb5, 0x87, 0x3a, 0x84, 0xe8, 0xd7, 0x06, + 0x62, 0x65, 0xfd, 0x1e, 0x94, 0x04, 0x56, 0xbc, 0xf3, 0x5e, 0x93, 0x66, 0xc4, 0x42, 0xc6, 0xb3, + 0x42, 0xe9, 0x66, 0xed, 0x43, 0x89, 0xad, 0x98, 0x82, 0x92, 0x57, 0x30, 0x0d, 0x83, 0x6b, 0xf1, + 0x75, 0x8e, 0xcd, 0x7f, 0xe0, 0x7b, 0x95, 0xc8, 0x09, 0x22, 0xe9, 0xf5, 0x35, 0x6a, 0xab, 0xdf, + 0xe4, 0x2d, 0x18, 0xba, 0xe7, 0xb6, 0x22, 0x61, 0x1a, 0x89, 0x37, 0x79, 0xc6, 0x96, 0x17, 0xd8, + 0x02, 0xc1, 0xb2, 0xe1, 0xac, 0x56, 0xe1, 0x29, 0x9a, 0x4a, 0xca, 0x30, 0xbc, 0x41, 0xbf, 0xd1, + 0xea, 0x97, 0x3f, 0xad, 0xf7, 0xe0, 0xac, 0xf0, 0xa8, 0xd3, 0xc4, 0x74, 0x55, 0xbc, 0x7e, 0x2e, + 0x18, 0x4f, 0x30, 0x05, 0x4b, 0x2c, 0x62, 0x74, 0x3b, 0xed, 0xe6, 0x0b, 0xd2, 0xb1, 0x8d, 0xe2, + 0x94, 0x74, 0x6f, 0xca, 0x5b, 0xa0, 0x5e, 0xc3, 0xf9, 0x67, 0x05, 0x28, 0x27, 0xac, 0x0c, 0x8b, + 0x07, 0x4e, 0xab, 0x45, 0xbd, 0x7d, 0x4a, 0xae, 0xc3, 0xc0, 0xf6, 0xe6, 0xf6, 0x96, 0xb0, 0x92, + 0x4a, 0x07, 0x00, 0x06, 0x52, 0x38, 0x36, 0x62, 0x90, 0x87, 0x70, 0x56, 0xfa, 0xcc, 0xaa, 0x22, + 0x31, 0x42, 0x97, 0xba, 0x7b, 0xe0, 0xa6, 0xe9, 0xc8, 0x3b, 0xc2, 0x24, 0xf2, 0xe3, 0x8e, 0x1b, + 0xd0, 0x26, 0x5a, 0x7e, 0xe2, 0xdb, 0x74, 0xad, 0xc4, 0xd6, 0xd1, 0xf8, 0x5b, 0x55, 0xeb, 0xf7, + 0x0a, 0x30, 0x9b, 0x63, 0x35, 0x21, 0x6f, 0x19, 0xdd, 0x99, 0xd2, 0xba, 0x23, 0x51, 0x56, 0xfa, + 0x44, 0x7f, 0x16, 0x35, 0x47, 0xe2, 0xfe, 0x53, 0x38, 0x12, 0xaf, 0xf4, 0xc5, 0xce, 0xc3, 0x0b, + 0x00, 0x23, 0x12, 0x6e, 0x9d, 0x81, 0x09, 0x43, 0x6e, 0x96, 0x05, 0xe3, 0x7a, 0xcd, 0x6c, 0x70, + 0x16, 0xfd, 0xa6, 0x1a, 0x1c, 0xf6, 0xb7, 0xf5, 0xbb, 0x05, 0x98, 0xc6, 0x2e, 0xee, 0xbb, 0x6c, + 0xe9, 0x8b, 0x25, 0x34, 0x6f, 0xf4, 0xe4, 0xa2, 0xd1, 0x93, 0x04, 0xae, 0xea, 0xd2, 0x87, 0xa9, + 0x2e, 0x5d, 0xcc, 0xea, 0x12, 0x4e, 0x6f, 0xd7, 0xf7, 0x8c, 0x9e, 0x68, 0x57, 0x51, 0xbf, 0x5f, + 0x80, 0x29, 0xad, 0x4d, 0xaa, 0xfd, 0x77, 0x8c, 0x26, 0x5d, 0xc8, 0x68, 0x52, 0x4a, 0xc8, 0x0b, + 0xa9, 0x16, 0xbd, 0xd6, 0xad, 0x45, 0x3d, 0x65, 0xfc, 0x9f, 0x0b, 0x30, 0x93, 0x29, 0x03, 0x72, + 0x8e, 0xe9, 0xb6, 0x8d, 0x80, 0x46, 0x42, 0xbc, 0xe2, 0x17, 0x83, 0xaf, 0x86, 0x61, 0x87, 0x06, + 0xe2, 0x3b, 0x17, 0xbf, 0xc8, 0x6b, 0x30, 0xb1, 0x45, 0x03, 0xd7, 0x6f, 0x72, 0x17, 0x73, 0xee, + 0xbb, 0x39, 0x61, 0x9b, 0x40, 0x72, 0x11, 0x46, 0xab, 0xad, 0x7d, 0x3f, 0x70, 0xa3, 0x03, 0x7e, + 0x1b, 0x38, 0x6a, 0xc7, 0x00, 0xc6, 0x7b, 0xc9, 0xdd, 0xe7, 0x97, 0x1a, 0x8c, 0x58, 0xfc, 0x62, + 0x8b, 0x8b, 0xb4, 0x16, 0x0e, 0xf1, 0xc5, 0x45, 0x9a, 0x02, 0xcf, 0xc1, 0xd0, 0xe7, 0x36, 0x4e, + 0x02, 0x8c, 0x10, 0x60, 0x8b, 0x5f, 0x64, 0x12, 0x9d, 0x84, 0xf1, 0x55, 0x02, 0x3a, 0x07, 0x7f, + 0x08, 0xd3, 0x59, 0x72, 0xcd, 0x9a, 0x42, 0x82, 0xb6, 0xa8, 0x68, 0xbf, 0x82, 0xa9, 0x6a, 0xb3, + 0xb9, 0x7e, 0xaf, 0xca, 0x7d, 0x0e, 0xc4, 0xa8, 0xf2, 0x8f, 0x87, 0xdb, 0xeb, 0x84, 0xca, 0x36, + 0xb0, 0xea, 0xb9, 0x91, 0x3d, 0xb5, 0xfc, 0x8d, 0x1b, 0x46, 0xae, 0xb7, 0xaf, 0x19, 0x15, 0xed, + 0x73, 0x1b, 0xf4, 0x59, 0xc6, 0x14, 0x60, 0xbb, 0xa9, 0xc9, 0x9b, 0xc3, 0x33, 0x98, 0x4f, 0x6b, + 0x6c, 0xe3, 0xa5, 0x64, 0xd6, 0xe4, 0x1b, 0x17, 0xf4, 0x57, 0x1b, 0x4f, 0xac, 0xef, 0xc1, 0x39, + 0xbe, 0xa4, 0x75, 0x6b, 0xbc, 0x68, 0xb6, 0x6e, 0x03, 0xb5, 0xde, 0x97, 0x56, 0x8a, 0xae, 0x2d, + 0xb3, 0xc7, 0x8d, 0xb6, 0x60, 0x95, 0xff, 0xa5, 0x00, 0x73, 0x09, 0xd2, 0xda, 0x73, 0xaf, 0x21, + 0xd7, 0xd3, 0x37, 0x92, 0x4e, 0xd8, 0xa8, 0x07, 0x70, 0xe3, 0x9f, 0xdb, 0x54, 0x7e, 0xd8, 0xe4, + 0x16, 0x00, 0x27, 0xd6, 0xb6, 0x6f, 0x34, 0x7d, 0x0b, 0x27, 0x1b, 0xdc, 0xc0, 0x35, 0x14, 0xd2, + 0x81, 0x2c, 0xb9, 0x8b, 0x6f, 0xa4, 0x97, 0x6d, 0x18, 0xa3, 0x62, 0x50, 0x41, 0x5e, 0xcf, 0x31, + 0x12, 0x67, 0xf1, 0xb7, 0xfe, 0xbf, 0x7e, 0x98, 0xd5, 0x07, 0xf0, 0x45, 0xfa, 0xba, 0x05, 0x63, + 0x8b, 0xbe, 0x17, 0xd1, 0x6f, 0x22, 0x2d, 0x2a, 0x01, 0x51, 0x37, 0xed, 0xaa, 0x44, 0xa8, 0x8e, + 0x1c, 0x50, 0x67, 0x7a, 0x8c, 0xe1, 0x2c, 0x18, 0x23, 0x92, 0x45, 0x98, 0xd8, 0xa0, 0xcf, 0x52, + 0x02, 0x44, 0x87, 0x45, 0x8f, 0x3e, 0xab, 0x6b, 0x42, 0xd4, 0xbd, 0xc8, 0x0c, 0x1a, 0xb2, 0x07, + 0x93, 0x72, 0x72, 0x19, 0xc2, 0x9c, 0xd3, 0x77, 0x15, 0x73, 0x3a, 0xf3, 0x57, 0xfb, 0xac, 0x86, + 0x1c, 0x19, 0x26, 0x38, 0xb2, 0xae, 0xf3, 0x1a, 0xf9, 0x43, 0x74, 0x73, 0xdb, 0xd2, 0x4a, 0x0c, + 0x77, 0xd0, 0xe4, 0x03, 0x74, 0x9d, 0x85, 0xb5, 0x05, 0xe5, 0xf4, 0x78, 0x88, 0xda, 0xde, 0x81, + 0x21, 0x0e, 0x15, 0x6a, 0x80, 0x0c, 0x38, 0xa3, 0xb0, 0xf9, 0x39, 0x9d, 0x57, 0x63, 0x0b, 0x5c, + 0x6b, 0x05, 0x6d, 0x27, 0x0a, 0x47, 0x29, 0x62, 0xb7, 0x93, 0xc3, 0x8b, 0x9e, 0xb6, 0x72, 0x78, + 0x75, 0x3f, 0x13, 0xf9, 0xb8, 0x60, 0x11, 0xcd, 0x4f, 0x3a, 0x27, 0xd1, 0xb0, 0x1b, 0x30, 0x2c, + 0x40, 0x89, 0x50, 0x38, 0xf1, 0xe7, 0x27, 0x11, 0xac, 0x0f, 0xe1, 0x3c, 0xda, 0xc2, 0x5c, 0x6f, + 0xbf, 0x45, 0x77, 0x42, 0xe3, 0x79, 0x40, 0xaf, 0xcf, 0xfa, 0x63, 0x98, 0xcb, 0xa2, 0xed, 0xf9, + 0x65, 0xf3, 0xe0, 0x14, 0x7f, 0x59, 0x84, 0xe9, 0xd5, 0x50, 0x57, 0x26, 0x54, 0x80, 0x8a, 0x8c, + 0xa0, 0x09, 0x28, 0x93, 0x95, 0xbe, 0xac, 0xa0, 0x08, 0xef, 0x68, 0x8f, 0x13, 0x8b, 0xdd, 0xa2, + 0x21, 0xb0, 0x6d, 0x4b, 0x3d, 0x4f, 0x7c, 0x03, 0x06, 0x36, 0xd8, 0x52, 0xdd, 0x2f, 0xc6, 0x8e, + 0x53, 0x30, 0x10, 0x3e, 0x0e, 0x64, 0x5b, 0x24, 0xfb, 0x41, 0xee, 0xa5, 0x9e, 0x20, 0x0e, 0xf4, + 0x7e, 0xed, 0xbf, 0xd2, 0x97, 0x7a, 0x8d, 0xf8, 0x1e, 0x8c, 0x55, 0x9b, 0x87, 0xdc, 0x23, 0xd0, + 0xf7, 0x12, 0x9f, 0xa5, 0x56, 0xb2, 0xd2, 0x67, 0xeb, 0x88, 0xec, 0x84, 0x5b, 0x6d, 0xb7, 0x71, + 0xa3, 0xca, 0x8a, 0x80, 0xb0, 0xd2, 0x87, 0x0e, 0xf6, 0x0b, 0x23, 0x30, 0xb4, 0xed, 0x04, 0xfb, + 0x34, 0xb2, 0xbe, 0x82, 0x39, 0xe1, 0xa4, 0xc2, 0x2d, 0x7f, 0xe8, 0xca, 0x12, 0xc6, 0x7e, 0x48, + 0xdd, 0x1c, 0x4b, 0x2e, 0x03, 0xa0, 0x9e, 0xbf, 0xea, 0x35, 0xe9, 0x37, 0xc2, 0x4b, 0x4e, 0x83, + 0x58, 0xef, 0xc2, 0xa8, 0x92, 0x10, 0x2a, 0xb3, 0xda, 0x66, 0x87, 0xd2, 0x9a, 0x36, 0xde, 0x5c, + 0xca, 0x87, 0x96, 0xe7, 0x8d, 0xbe, 0x8b, 0x98, 0x26, 0x5c, 0xfb, 0x75, 0x61, 0x26, 0x31, 0x09, + 0xe2, 0x27, 0xf3, 0x4a, 0xff, 0xe4, 0x6e, 0x7c, 0xea, 0x77, 0x52, 0x3d, 0x2d, 0x9e, 0x48, 0x3d, + 0xb5, 0xfe, 0x59, 0x11, 0x0f, 0x4e, 0x29, 0x79, 0x24, 0x6c, 0x50, 0xba, 0x1d, 0x6c, 0x01, 0x46, + 0xb1, 0xf7, 0x4b, 0xf2, 0xe9, 0x57, 0x77, 0x1f, 0x8b, 0x91, 0x9f, 0x1d, 0x55, 0xfa, 0xd0, 0xb1, + 0x22, 0x26, 0x23, 0x9f, 0xc0, 0xf0, 0xb2, 0xd7, 0x44, 0x0e, 0xfd, 0xa7, 0xe0, 0x20, 0x89, 0xd8, + 0x98, 0x60, 0x93, 0xb7, 0xd9, 0x27, 0xcc, 0x4d, 0x17, 0xb6, 0x06, 0x89, 0x4f, 0x70, 0x83, 0x79, + 0x27, 0xb8, 0xa1, 0xc4, 0x09, 0xce, 0x82, 0xc1, 0xcd, 0xa0, 0x29, 0x22, 0x91, 0x4c, 0xce, 0x8f, + 0x0b, 0xc1, 0x21, 0xcc, 0xe6, 0x45, 0xd6, 0x7f, 0x2b, 0xc0, 0xec, 0x7d, 0x1a, 0x65, 0xce, 0x21, + 0x43, 0x2a, 0x85, 0x97, 0x96, 0x4a, 0xf1, 0x45, 0xa4, 0xa2, 0x7a, 0xdd, 0x9f, 0xd7, 0xeb, 0x81, + 0xbc, 0x5e, 0x0f, 0xe6, 0xf7, 0xfa, 0x3e, 0x0c, 0xf1, 0xae, 0xb2, 0x53, 0xea, 0x6a, 0x44, 0x0f, + 0xe3, 0x53, 0xaa, 0xee, 0x21, 0x66, 0xf3, 0x32, 0xa6, 0x48, 0xae, 0x39, 0xa1, 0x7e, 0x4a, 0x15, + 0x3f, 0xad, 0x1f, 0xe1, 0xa3, 0xd1, 0x35, 0xbf, 0xf1, 0x44, 0xb3, 0x76, 0x0e, 0xf3, 0x2f, 0x34, + 0x69, 0x1d, 0x67, 0x58, 0xbc, 0xc4, 0x96, 0x18, 0xe4, 0x0a, 0x8c, 0xad, 0x7a, 0xf7, 0xfc, 0xa0, + 0x41, 0x37, 0xbd, 0x16, 0xe7, 0x3e, 0x62, 0xeb, 0x20, 0x61, 0x05, 0x10, 0x35, 0xc4, 0x47, 0x6b, + 0x04, 0x24, 0x8e, 0xd6, 0x0c, 0xb6, 0x3b, 0x6f, 0xf3, 0x32, 0x61, 0x64, 0x60, 0x7f, 0x77, 0x3b, + 0x95, 0xaa, 0xe3, 0x6b, 0x2f, 0xc4, 0x3d, 0x38, 0x6f, 0xd3, 0x76, 0xcb, 0x61, 0x3a, 0xdd, 0xa1, + 0xcf, 0xf1, 0x55, 0x9f, 0xaf, 0x64, 0x3c, 0xf8, 0x32, 0xfd, 0x05, 0x54, 0x93, 0x8b, 0x5d, 0x9a, + 0x7c, 0x08, 0x57, 0xef, 0xd3, 0xc8, 0x5c, 0x50, 0x63, 0x5b, 0xaa, 0xe8, 0xfc, 0x0a, 0x8c, 0x84, + 0xa6, 0x1d, 0xf8, 0xb2, 0xbc, 0x7e, 0xc8, 0x22, 0xdc, 0xbd, 0x2b, 0x6f, 0x4a, 0x04, 0x1f, 0xf5, + 0x97, 0xf5, 0x29, 0x54, 0xf2, 0xaa, 0x3b, 0x99, 0x3b, 0xa7, 0x0b, 0x57, 0xf2, 0x19, 0x88, 0xe6, + 0x2e, 0x83, 0xb4, 0x19, 0x8b, 0x4f, 0xa8, 0x57, 0x6b, 0x4d, 0x33, 0xb3, 0xf8, 0xc3, 0x5a, 0x90, + 0x8e, 0x6d, 0x2f, 0xd1, 0xdc, 0x3a, 0x5e, 0xc7, 0x9a, 0x0c, 0x62, 0xb9, 0x56, 0x61, 0x44, 0xc2, + 0x84, 0x5c, 0x67, 0x33, 0x5b, 0x2a, 0x05, 0xda, 0x94, 0x0c, 0x14, 0x99, 0xf5, 0x23, 0x79, 0x35, + 0x61, 0x52, 0x9c, 0xec, 0x05, 0xe4, 0x49, 0xee, 0x22, 0x2c, 0x1f, 0xce, 0x9b, 0xbc, 0x75, 0x93, + 0x73, 0x49, 0x33, 0x39, 0x73, 0x4b, 0xf3, 0x15, 0xd3, 0x04, 0x5a, 0x14, 0xf3, 0x32, 0x06, 0x91, + 0xcb, 0xba, 0x61, 0x79, 0x3c, 0xfd, 0xa4, 0xf2, 0x36, 0xcc, 0x65, 0x55, 0xa8, 0x9d, 0x03, 0x95, + 0xf5, 0x52, 0xe8, 0x3b, 0x4b, 0x70, 0x59, 0xc6, 0x02, 0xf2, 0xfd, 0x28, 0x8c, 0x02, 0xa7, 0x5d, + 0x6b, 0x04, 0x6e, 0x3b, 0xa6, 0xb2, 0x60, 0x88, 0x43, 0x84, 0x24, 0xf8, 0x35, 0x0f, 0xc7, 0x11, + 0x25, 0xd6, 0x6f, 0x16, 0xc0, 0x32, 0x7c, 0x90, 0x70, 0x9c, 0xb7, 0x02, 0xff, 0xa9, 0xdb, 0xd4, + 0xae, 0x56, 0xde, 0x32, 0xcc, 0x7a, 0xfc, 0x49, 0x5c, 0xd2, 0xfd, 0x59, 0xac, 0x99, 0xb7, 0x13, + 0xa6, 0x36, 0xae, 0x78, 0xa2, 0x5f, 0x92, 0x19, 0x74, 0x45, 0x99, 0xe0, 0xfe, 0x47, 0x01, 0xae, + 0x75, 0x6d, 0x83, 0xe8, 0xcf, 0x1e, 0x94, 0x92, 0x65, 0x62, 0x06, 0x55, 0x34, 0x9f, 0x84, 0x34, + 0x87, 0xdd, 0x3b, 0xdc, 0xc7, 0x5a, 0xfa, 0xee, 0xb4, 0x15, 0xe7, 0x14, 0xbf, 0xd3, 0xb7, 0x9e, + 0x7c, 0x00, 0xb0, 0xed, 0x47, 0x4e, 0x6b, 0x11, 0x0d, 0x00, 0xfd, 0xb1, 0xbf, 0x7c, 0xc4, 0xa0, + 0xf5, 0x64, 0x90, 0x02, 0x0d, 0xd9, 0xfa, 0x0c, 0xbf, 0xeb, 0xec, 0x46, 0x9f, 0xec, 0x53, 0x5b, + 0x84, 0x6b, 0x89, 0x7b, 0xf1, 0x17, 0x60, 0x12, 0xc1, 0x0c, 0x13, 0x3f, 0xd3, 0xbd, 0xef, 0x07, + 0x7e, 0xa7, 0xfd, 0xcb, 0x19, 0xf5, 0x3f, 0x2d, 0x70, 0x47, 0x45, 0xbd, 0x5a, 0x31, 0xd0, 0x8b, + 0x00, 0x31, 0x34, 0xe1, 0xb0, 0xae, 0x0a, 0x76, 0xef, 0xf0, 0x23, 0x37, 0x5a, 0xcc, 0xf7, 0x39, + 0x03, 0x8d, 0xec, 0x97, 0x3b, 0x92, 0x77, 0xf1, 0x32, 0x5c, 0xd5, 0x7e, 0x32, 0xb9, 0xbf, 0x27, + 0xed, 0x1f, 0xa7, 0xa4, 0x3b, 0x80, 0x69, 0xb6, 0x02, 0x54, 0x3b, 0xd1, 0x81, 0x1f, 0xb8, 0x91, + 0x7c, 0x7a, 0x41, 0xb6, 0xc4, 0xdb, 0x6e, 0x4e, 0xf5, 0xf1, 0x2f, 0x8e, 0x2a, 0xef, 0x9f, 0x26, + 0x4a, 0xa3, 0xe4, 0xb9, 0xad, 0xde, 0x83, 0x5b, 0xb3, 0xd0, 0xbf, 0x68, 0xaf, 0xe1, 0x82, 0x67, + 0xaf, 0xa9, 0x05, 0xcf, 0x5e, 0xb3, 0xfe, 0xba, 0x08, 0x15, 0x1e, 0x7d, 0x02, 0x7d, 0x28, 0x62, + 0xab, 0x85, 0xe6, 0x94, 0x71, 0x52, 0x03, 0x43, 0x22, 0xba, 0x44, 0xf1, 0x24, 0xd1, 0x25, 0x7e, + 0x0d, 0x72, 0x4c, 0x56, 0x27, 0xb0, 0x02, 0xbc, 0x79, 0x7c, 0x54, 0xb9, 0x16, 0x5b, 0x01, 0x78, + 0x69, 0x96, 0x39, 0x20, 0xa7, 0x8a, 0xb4, 0xfd, 0x62, 0xe0, 0x05, 0xec, 0x17, 0xb7, 0x61, 0x18, + 0x0f, 0x33, 0xab, 0x5b, 0xc2, 0xab, 0x11, 0xa7, 0x27, 0xc6, 0x93, 0xa9, 0xbb, 0x7a, 0xf0, 0x36, + 0x89, 0x66, 0xfd, 0xdd, 0x22, 0x5c, 0xc9, 0x97, 0xb9, 0x68, 0xdb, 0x12, 0x40, 0xec, 0xbd, 0xd1, + 0xcd, 0x5b, 0x04, 0xbf, 0x9d, 0x67, 0x74, 0x4f, 0x79, 0x6b, 0x69, 0x74, 0x4c, 0xf7, 0x91, 0x0f, + 0x7d, 0x13, 0x57, 0x05, 0xc6, 0xfb, 0x5f, 0x11, 0x7b, 0x54, 0x80, 0x8c, 0xd8, 0xa3, 0x02, 0x46, + 0xf6, 0x60, 0x76, 0x2b, 0x70, 0x9f, 0x3a, 0x11, 0x7d, 0x48, 0x9f, 0xf3, 0x87, 0x30, 0xcb, 0xe2, + 0xf5, 0x0b, 0x7f, 0xbd, 0x7d, 0xfd, 0xf8, 0xa8, 0xf2, 0x5a, 0x9b, 0xa3, 0x60, 0x7c, 0x29, 0xfe, + 0xf4, 0xb0, 0x9e, 0x7e, 0x10, 0x93, 0xc7, 0xc8, 0xfa, 0x93, 0x02, 0x5c, 0x40, 0xb5, 0x5c, 0x98, + 0x5d, 0x65, 0xe5, 0x2f, 0xe4, 0x34, 0xa8, 0x77, 0x50, 0xcc, 0x45, 0x74, 0x1a, 0x34, 0x1e, 0x42, + 0xdb, 0x06, 0x1a, 0x59, 0x85, 0x31, 0xf1, 0x1b, 0xbf, 0xbf, 0x7e, 0x3c, 0x10, 0xcc, 0x68, 0x0b, + 0x16, 0x4e, 0x75, 0x6e, 0x2a, 0xc2, 0x89, 0x2d, 0x98, 0xe1, 0x7b, 0x41, 0x5b, 0xa7, 0xb5, 0x7e, + 0x5e, 0x84, 0x8b, 0xbb, 0x34, 0x70, 0x1f, 0x3f, 0xcf, 0xe9, 0xcc, 0x26, 0x4c, 0x4b, 0x10, 0x8f, + 0x40, 0x61, 0x7c, 0x62, 0x3c, 0xfa, 0xa0, 0x6c, 0xaa, 0x08, 0x61, 0x21, 0xbf, 0xb8, 0x4c, 0xc2, + 0x53, 0xb8, 0x03, 0xbe, 0x03, 0x23, 0x89, 0x18, 0x30, 0x38, 0xfe, 0xf2, 0x0b, 0x8d, 0x87, 0x6a, + 0xa5, 0xcf, 0x56, 0x98, 0xe4, 0xb7, 0xf2, 0xef, 0x6f, 0x84, 0xe9, 0xa3, 0x97, 0xfd, 0x13, 0x3f, + 0x58, 0xf6, 0xb1, 0x3a, 0x5a, 0x69, 0xc6, 0x07, 0xbb, 0xd2, 0x67, 0xe7, 0xd5, 0xb4, 0x30, 0x06, + 0xa3, 0x55, 0xbc, 0x93, 0x62, 0x27, 0xf7, 0xff, 0x5e, 0x84, 0xcb, 0xf2, 0x51, 0x4b, 0x8e, 0x98, + 0xbf, 0x80, 0x59, 0x09, 0xaa, 0xb6, 0x99, 0xc2, 0x40, 0x9b, 0xa6, 0xa4, 0x79, 0x04, 0x50, 0x29, + 0x69, 0x47, 0xe0, 0xc4, 0xc2, 0xce, 0x23, 0x7f, 0x35, 0xd6, 0xcf, 0x4f, 0xb2, 0x22, 0xf2, 0xa0, + 0x15, 0x52, 0x5f, 0x33, 0x0d, 0xd1, 0x18, 0xeb, 0x67, 0x33, 0x65, 0x3d, 0x1d, 0x78, 0x59, 0xeb, + 0xe9, 0x4a, 0x5f, 0xd2, 0x7e, 0xba, 0x30, 0x09, 0xe3, 0x1b, 0xf4, 0x59, 0x2c, 0xf7, 0xff, 0xbb, + 0x90, 0x88, 0x34, 0xc0, 0x34, 0x0c, 0x1e, 0x72, 0xa0, 0x10, 0x07, 0x75, 0xc1, 0x48, 0x03, 0xba, + 0x86, 0xc1, 0x51, 0x57, 0x61, 0x98, 0x5f, 0xd4, 0x36, 0x4f, 0x70, 0xc2, 0x57, 0xaf, 0x53, 0xf8, + 0x93, 0xc1, 0x26, 0x3f, 0xec, 0x0b, 0x7a, 0xeb, 0x21, 0x5c, 0x15, 0xfe, 0xcb, 0xe6, 0xe0, 0x63, + 0x45, 0xa7, 0xdc, 0xbe, 0x2c, 0x07, 0x2e, 0xdf, 0xa7, 0xc9, 0xa5, 0xc7, 0x78, 0xbd, 0xf3, 0x29, + 0x9c, 0x31, 0xe0, 0x8a, 0x23, 0x6a, 0xa5, 0x6a, 0x0e, 0x29, 0xd6, 0x49, 0x6c, 0xeb, 0x4a, 0x56, + 0x15, 0x7a, 0x63, 0x2d, 0x8a, 0xa1, 0x3c, 0x83, 0xf8, 0x8a, 0x2d, 0x3c, 0xc5, 0xaa, 0x77, 0x5d, + 0xfb, 0xae, 0xf9, 0x8a, 0xc7, 0x63, 0xbd, 0xc9, 0x9d, 0x57, 0x95, 0x5a, 0x13, 0xc6, 0x5d, 0x80, + 0x35, 0x09, 0xe3, 0xb2, 0xa8, 0x45, 0xc3, 0xd0, 0xfa, 0xe9, 0x20, 0x58, 0x42, 0xb0, 0x59, 0xb7, + 0xcf, 0x52, 0x1e, 0x7b, 0xa9, 0xc6, 0x8a, 0x8d, 0xea, 0x9c, 0x1e, 0x41, 0x32, 0x2e, 0xe5, 0x33, + 0x0f, 0xf5, 0xbc, 0x46, 0x0c, 0x35, 0x66, 0x5e, 0xaa, 0xf7, 0x3f, 0xc8, 0x59, 0x26, 0xf9, 0xc7, + 0xf6, 0xfa, 0xf1, 0x51, 0xe5, 0x6a, 0xce, 0x32, 0x69, 0xf0, 0xcd, 0x5e, 0x32, 0x6d, 0xf3, 0x4a, + 0xa4, 0xff, 0x45, 0xae, 0x44, 0xd8, 0x17, 0xa9, 0x5f, 0x8a, 0xec, 0x98, 0xb2, 0x14, 0xdf, 0xa3, + 0xbc, 0xd2, 0xd6, 0x8b, 0xc4, 0x83, 0x7f, 0x0d, 0x62, 0x70, 0x35, 0xd8, 0x10, 0x17, 0x4a, 0x9a, + 0xcd, 0x72, 0xf1, 0x80, 0x36, 0x9e, 0x08, 0x5b, 0xb1, 0xbc, 0xd0, 0xcd, 0xb2, 0x99, 0xf3, 0x68, + 0xc2, 0xfc, 0x3b, 0xe7, 0x05, 0xf5, 0x06, 0x23, 0xd5, 0x03, 0x16, 0x24, 0xd9, 0x92, 0x9f, 0xc0, + 0x94, 0x1a, 0xea, 0x84, 0xfb, 0xd1, 0xd8, 0xfc, 0x6b, 0x71, 0xe0, 0xc9, 0xc3, 0xc7, 0xce, 0xcd, + 0xa7, 0x77, 0x6e, 0x66, 0xe0, 0xf2, 0x77, 0xf0, 0x0d, 0x59, 0xa0, 0xf9, 0x1e, 0xe9, 0x17, 0x5d, + 0x59, 0x84, 0xda, 0x75, 0xf6, 0xdf, 0x51, 0xce, 0xf2, 0x4c, 0x5f, 0x70, 0x5b, 0x54, 0xbc, 0x7a, + 0x91, 0xb3, 0x2f, 0xe7, 0x2a, 0xae, 0xf0, 0x2d, 0x5f, 0xc5, 0xfd, 0x61, 0x51, 0x3e, 0x11, 0x48, + 0xdf, 0x86, 0x9e, 0xfa, 0x46, 0x2e, 0xb3, 0x07, 0x27, 0xda, 0x4c, 0x33, 0x1b, 0x47, 0x16, 0xe4, + 0x7d, 0xa6, 0x8a, 0x0d, 0x35, 0xa9, 0xee, 0x06, 0xe2, 0x02, 0xe3, 0x8a, 0x13, 0x55, 0x17, 0x8d, + 0x2a, 0x79, 0x59, 0xd6, 0xff, 0xf2, 0x97, 0x65, 0xff, 0x72, 0x14, 0xce, 0x6e, 0x39, 0xfb, 0xae, + 0xc7, 0x16, 0x6d, 0x9b, 0x86, 0x7e, 0x27, 0x68, 0x50, 0x52, 0x85, 0x49, 0xd3, 0xff, 0xb3, 0x87, + 0x77, 0x2b, 0xdb, 0x97, 0x4c, 0x18, 0x99, 0x87, 0x51, 0xf5, 0xe6, 0x54, 0x6c, 0x26, 0x19, 0x6f, + 0x51, 0x57, 0xfa, 0xec, 0x18, 0x8d, 0x7c, 0x60, 0xdc, 0xef, 0x9c, 0x51, 0xcf, 0xa7, 0x11, 0x77, + 0x9e, 0x3b, 0xe8, 0x79, 0x7e, 0xd3, 0xdc, 0x10, 0xf9, 0x25, 0xc6, 0x8f, 0x52, 0x57, 0x3e, 0x83, + 0x46, 0x8b, 0x53, 0x76, 0x2f, 0xd4, 0x05, 0x72, 0xc3, 0x39, 0x67, 0x5c, 0x06, 0x7d, 0x05, 0x63, + 0x0f, 0x3b, 0x7b, 0x54, 0x5e, 0x6e, 0x0d, 0x89, 0xfd, 0x31, 0xe9, 0xd5, 0x2c, 0xca, 0x77, 0xef, + 0xf2, 0x31, 0x78, 0xd2, 0xd9, 0xa3, 0xe9, 0x38, 0xe1, 0x6c, 0x61, 0xd2, 0x98, 0x91, 0x03, 0x28, + 0x25, 0x1d, 0x90, 0x45, 0x34, 0xb5, 0x2e, 0x6e, 0xd3, 0x18, 0xca, 0x43, 0x8b, 0x46, 0xce, 0xdd, + 0x22, 0x8d, 0x4a, 0x52, 0x5c, 0xc9, 0xaf, 0xc3, 0x4c, 0xa6, 0xd5, 0x51, 0x3d, 0xa1, 0xea, 0x6e, + 0xd0, 0xc4, 0x45, 0x3d, 0x21, 0x35, 0xf9, 0x5e, 0xcb, 0xa8, 0x39, 0xbb, 0x16, 0xd2, 0x84, 0x33, + 0x09, 0xc7, 0x5a, 0x91, 0x72, 0x21, 0xdf, 0x55, 0x17, 0x37, 0x26, 0x19, 0xb5, 0x34, 0xb3, 0xae, + 0x24, 0x4b, 0xb2, 0x06, 0xa3, 0xea, 0xb8, 0x8f, 0xaf, 0xb3, 0xb2, 0x4d, 0x1b, 0xe5, 0xe3, 0xa3, + 0xca, 0x74, 0x6c, 0xda, 0x30, 0x78, 0xc6, 0x0c, 0xc8, 0x6f, 0xc0, 0x55, 0x35, 0x45, 0x37, 0x83, + 0x6c, 0x23, 0x90, 0x88, 0x76, 0x7e, 0x23, 0x39, 0xc3, 0xf3, 0xf0, 0x77, 0xef, 0x2c, 0x14, 0xcb, + 0x85, 0x95, 0x3e, 0xbb, 0x37, 0x6b, 0xf2, 0xd3, 0x02, 0x9c, 0xcb, 0xa9, 0x75, 0x1c, 0x6b, 0xed, + 0x69, 0x99, 0x43, 0xe5, 0x1e, 0x9f, 0x0d, 0xb9, 0xcd, 0xf8, 0x79, 0x9d, 0x34, 0xd1, 0x19, 0xfd, + 0xce, 0xa9, 0x89, 0xbc, 0x0d, 0x43, 0x78, 0x46, 0x0e, 0xcb, 0x13, 0xa8, 0x45, 0x62, 0x04, 0x1b, + 0x3c, 0x49, 0xeb, 0xfb, 0x86, 0xc0, 0x21, 0x2b, 0x4c, 0x1b, 0xc3, 0x7d, 0x4b, 0x6a, 0x4f, 0x22, + 0xde, 0x95, 0xd0, 0xe8, 0x79, 0x91, 0x8c, 0x72, 0x61, 0x84, 0xb5, 0x37, 0xc9, 0x16, 0x00, 0x46, + 0x02, 0xb1, 0x2a, 0x3d, 0x18, 0x18, 0x19, 0x28, 0x0d, 0xf2, 0x0f, 0x47, 0x7a, 0x6c, 0xff, 0xf6, + 0x08, 0x7f, 0xde, 0xb9, 0xe3, 0xb9, 0x8f, 0xdd, 0x78, 0x01, 0xd3, 0xad, 0x6b, 0x71, 0x7e, 0x19, + 0xa1, 0xfb, 0xe6, 0x64, 0x92, 0x51, 0x86, 0xb8, 0x62, 0x4f, 0x43, 0xdc, 0x5d, 0xed, 0xca, 0x4a, + 0x0b, 0x11, 0xc9, 0x75, 0x1c, 0xd3, 0xf0, 0x15, 0xdf, 0x65, 0x7d, 0x0d, 0x43, 0x18, 0xd5, 0x91, + 0xdf, 0x07, 0x8e, 0xcd, 0xdf, 0x14, 0xcb, 0x76, 0x97, 0xe6, 0xf3, 0x30, 0x90, 0xe2, 0xc9, 0x36, + 0x97, 0x38, 0x02, 0x0c, 0x89, 0x23, 0x84, 0x6c, 0xc3, 0xd4, 0x56, 0x40, 0x9b, 0xc2, 0x6f, 0xb8, + 0x1d, 0x08, 0xe3, 0x04, 0x37, 0x7b, 0xe0, 0x96, 0xdf, 0x96, 0xc5, 0x75, 0xaa, 0xca, 0xf5, 0x0d, + 0x35, 0x83, 0x9c, 0x2c, 0xc3, 0x64, 0x8d, 0x3a, 0x41, 0xe3, 0xe0, 0x21, 0x7d, 0xce, 0xd4, 0x1d, + 0x23, 0xa5, 0x42, 0x88, 0x25, 0xac, 0xbf, 0x58, 0xa4, 0xfb, 0x78, 0x98, 0x44, 0xe4, 0x33, 0x18, + 0xaa, 0xf9, 0x41, 0xb4, 0xf0, 0x5c, 0x2c, 0x6a, 0xf2, 0xc6, 0x88, 0x03, 0x17, 0xce, 0xcb, 0xb4, + 0x12, 0xa1, 0x1f, 0x44, 0xf5, 0x3d, 0x23, 0x24, 0x12, 0x47, 0x21, 0xcf, 0x61, 0xda, 0x5c, 0x50, + 0x84, 0x3b, 0xeb, 0x88, 0x50, 0xb3, 0xb2, 0x56, 0x2d, 0x8e, 0xb2, 0x70, 0x5d, 0x70, 0xbf, 0x92, + 0x5c, 0xb6, 0x1e, 0x63, 0xb9, 0x1e, 0xa5, 0x28, 0x8b, 0x9e, 0xac, 0x63, 0x3e, 0x0e, 0xde, 0xa3, + 0x6a, 0xc8, 0xdd, 0x60, 0x47, 0xe3, 0xa0, 0x5b, 0x1d, 0x5c, 0x94, 0x50, 0x12, 0x4e, 0x98, 0x4c, + 0xe2, 0x62, 0xa7, 0x48, 0xc9, 0x16, 0x9c, 0xdd, 0x09, 0xe9, 0x56, 0x40, 0x9f, 0xba, 0xf4, 0x99, + 0xe4, 0x07, 0x71, 0x84, 0x22, 0xc6, 0xaf, 0xcd, 0x4b, 0xb3, 0x18, 0xa6, 0x89, 0xc9, 0x07, 0x00, + 0x5b, 0xae, 0xe7, 0xd1, 0x26, 0x5e, 0x3b, 0x8e, 0x21, 0x2b, 0x34, 0xa9, 0xb6, 0x11, 0x5a, 0xf7, + 0xbd, 0x96, 0x2e, 0x52, 0x0d, 0x99, 0x2c, 0xc0, 0xc4, 0xaa, 0xd7, 0x68, 0x75, 0x84, 0x7b, 0x40, + 0x88, 0x0b, 0x8a, 0x88, 0x9c, 0xe6, 0xf2, 0x82, 0x7a, 0xea, 0x23, 0x37, 0x49, 0xc8, 0x43, 0x20, + 0x02, 0x20, 0x66, 0xad, 0xb3, 0xd7, 0xa2, 0xe2, 0x73, 0x47, 0x53, 0x89, 0x64, 0x84, 0xd3, 0xdd, + 0x08, 0x48, 0x96, 0x22, 0x9b, 0xfb, 0x00, 0xc6, 0xb4, 0x39, 0x9f, 0x11, 0x83, 0x60, 0x5a, 0x8f, + 0x41, 0x30, 0xaa, 0xc7, 0x1a, 0xf8, 0x47, 0x05, 0xb8, 0x98, 0xfd, 0x2d, 0x09, 0x05, 0x6c, 0x13, + 0x46, 0x15, 0x50, 0xbd, 0x3a, 0x91, 0xaa, 0x7f, 0x42, 0x03, 0xe2, 0x1f, 0xb4, 0x5c, 0x79, 0xf4, + 0xde, 0xc7, 0x3c, 0x5e, 0xc0, 0x1e, 0xff, 0xff, 0x8c, 0xc0, 0x34, 0x7a, 0x57, 0x27, 0xd7, 0xa9, + 0x4f, 0x31, 0x96, 0x08, 0xc2, 0x34, 0xf3, 0xb2, 0xb0, 0x34, 0x71, 0x78, 0x32, 0xf0, 0x95, 0x41, + 0x40, 0xde, 0xd5, 0x7d, 0x22, 0x8a, 0x5a, 0xfe, 0x0f, 0x09, 0xd4, 0xbb, 0x10, 0x3b, 0x4b, 0xbc, + 0x65, 0x5c, 0xc9, 0x9f, 0x78, 0xd1, 0x1b, 0x38, 0xe9, 0xa2, 0xb7, 0xa3, 0x16, 0x3d, 0x1e, 0xa3, + 0xe2, 0x4d, 0x6d, 0xd1, 0x7b, 0xf5, 0xab, 0xdd, 0xd0, 0xab, 0x5e, 0xed, 0x86, 0x5f, 0x6e, 0xb5, + 0x1b, 0x79, 0xc1, 0xd5, 0xee, 0x1e, 0x4c, 0x6e, 0x50, 0xda, 0xd4, 0x2e, 0x4a, 0x46, 0xe3, 0xdd, + 0xd3, 0xa3, 0x68, 0x02, 0xcb, 0xba, 0x2d, 0x49, 0x50, 0xe5, 0xae, 0x9a, 0xf0, 0xb7, 0xb3, 0x6a, + 0x8e, 0xbd, 0xe2, 0x55, 0x73, 0xfc, 0x65, 0x56, 0xcd, 0xd4, 0xd2, 0x37, 0x71, 0xea, 0xa5, 0xef, + 0x65, 0x56, 0xab, 0x4f, 0xd0, 0xa5, 0xb0, 0x56, 0x5b, 0x11, 0xde, 0x23, 0x9a, 0xbb, 0xc6, 0x8a, + 0x1f, 0x4a, 0x8f, 0x6b, 0xfc, 0x9b, 0xc1, 0xb6, 0xfc, 0x40, 0x5e, 0x79, 0xe3, 0xdf, 0xd6, 0x02, + 0x3a, 0x12, 0xea, 0xf4, 0xca, 0x5d, 0x7f, 0x58, 0x3c, 0xd9, 0x13, 0x6b, 0x5c, 0xf2, 0x18, 0x65, + 0xcb, 0x72, 0xeb, 0x2f, 0x0b, 0xfc, 0x52, 0xf2, 0x7f, 0xc7, 0xa5, 0xf2, 0x65, 0x2e, 0x0a, 0x7f, + 0x2b, 0x7e, 0xca, 0x2f, 0xc2, 0x0e, 0x04, 0x4e, 0xe3, 0x49, 0x7c, 0x53, 0xfb, 0x43, 0xf6, 0x9d, + 0xeb, 0x05, 0x18, 0x58, 0x35, 0x3e, 0x2b, 0x9a, 0x85, 0xbb, 0x77, 0xe4, 0x02, 0x20, 0x22, 0x1a, + 0x70, 0xb0, 0xb9, 0x00, 0xe8, 0x04, 0xe8, 0x2b, 0x77, 0xc6, 0xb2, 0xf9, 0x4b, 0xf4, 0xcc, 0x16, + 0xbc, 0x97, 0x7e, 0x4b, 0x8d, 0x87, 0x91, 0xf8, 0x2d, 0xb5, 0x2e, 0xc6, 0xf8, 0x55, 0xf5, 0x0e, + 0x5c, 0xb0, 0xe9, 0xa1, 0xff, 0x94, 0xbe, 0x5a, 0xb6, 0x3f, 0x80, 0xf3, 0x26, 0x43, 0xfe, 0xea, + 0x86, 0x07, 0x44, 0xff, 0x24, 0x3b, 0x8c, 0xba, 0x20, 0xe0, 0x61, 0xd4, 0x79, 0x34, 0x66, 0xf6, + 0xa7, 0xbe, 0x6f, 0x60, 0x99, 0xe5, 0xc3, 0x45, 0x93, 0x79, 0xb5, 0xd9, 0xc4, 0x6c, 0x8b, 0x0d, + 0xb7, 0xed, 0x78, 0x11, 0xd9, 0x84, 0x31, 0xed, 0x67, 0xc2, 0x54, 0xa0, 0x95, 0x08, 0x9d, 0x26, + 0x06, 0x18, 0x21, 0x38, 0x63, 0xb0, 0x45, 0xa1, 0x92, 0x14, 0x0f, 0x13, 0x99, 0x5e, 0xe7, 0x02, + 0x4c, 0x68, 0x3f, 0x95, 0xc9, 0x12, 0x3f, 0x7e, 0xad, 0x06, 0x53, 0x60, 0x26, 0x89, 0xd5, 0x80, + 0xb9, 0x2c, 0xa1, 0x61, 0x74, 0xa6, 0xe7, 0x64, 0x39, 0x8e, 0xf3, 0xd4, 0xdb, 0xdb, 0xee, 0x4c, + 0x5e, 0x8c, 0x27, 0xeb, 0xff, 0x1f, 0x80, 0x0b, 0x62, 0x30, 0x5e, 0xe5, 0x88, 0x93, 0x1f, 0xc1, + 0x98, 0x36, 0xc6, 0x42, 0xe8, 0x57, 0x64, 0xe8, 0xcd, 0xbc, 0xb9, 0xc0, 0x4d, 0x1a, 0x1d, 0x04, + 0xd4, 0x13, 0xc3, 0xbd, 0xd2, 0x67, 0xeb, 0x2c, 0x49, 0x0b, 0x26, 0xcd, 0x81, 0x16, 0x56, 0x9d, + 0x6b, 0x99, 0x95, 0x98, 0xa8, 0x32, 0x90, 0x73, 0xb3, 0x9e, 0x39, 0xdc, 0x2b, 0x7d, 0x76, 0x82, + 0x37, 0xf9, 0x06, 0xce, 0xa6, 0x46, 0x59, 0x18, 0xeb, 0xde, 0xc8, 0xac, 0x30, 0x85, 0xcd, 0xcd, + 0xb1, 0x01, 0x82, 0x73, 0xab, 0x4d, 0x57, 0x42, 0x9a, 0x30, 0xae, 0x0f, 0xbc, 0x30, 0x3b, 0x5d, + 0xed, 0x22, 0x4a, 0x8e, 0xc8, 0x95, 0x3b, 0x21, 0x4b, 0x1c, 0xfb, 0xe7, 0xa6, 0x89, 0xd9, 0x40, + 0x1e, 0x81, 0x21, 0xfe, 0x9b, 0x2d, 0x01, 0x5b, 0x01, 0x0d, 0xa9, 0xd7, 0xa0, 0x86, 0x83, 0xf6, + 0x4b, 0x2e, 0x01, 0xff, 0xa6, 0x00, 0xe5, 0x2c, 0xbe, 0x35, 0xea, 0x35, 0xc9, 0x16, 0x94, 0x92, + 0x15, 0x89, 0x59, 0x6d, 0xa9, 0x58, 0xb9, 0xb9, 0x4d, 0x5a, 0xe9, 0xb3, 0x53, 0xd4, 0x64, 0x03, + 0xce, 0x6a, 0x30, 0x61, 0x5c, 0x2d, 0x9e, 0xc4, 0xb8, 0xca, 0x46, 0x21, 0x45, 0xaa, 0xdb, 0xa6, + 0x57, 0x70, 0x67, 0x5c, 0xf2, 0x0f, 0x1d, 0xd7, 0x63, 0x8a, 0xae, 0x16, 0xea, 0x09, 0x62, 0xa8, + 0x90, 0x0d, 0xb7, 0xb6, 0x22, 0x54, 0x3e, 0x28, 0x51, 0x28, 0xd6, 0xc7, 0xb8, 0x82, 0x0b, 0x1b, + 0x1d, 0x7f, 0x9e, 0xaa, 0x98, 0x5d, 0x81, 0xc1, 0xed, 0xb5, 0xda, 0x62, 0x55, 0x3c, 0x76, 0xe5, + 0x21, 0x12, 0x5a, 0x61, 0xbd, 0xe1, 0xd8, 0xbc, 0xc0, 0xfa, 0x08, 0xc8, 0x7d, 0x1a, 0x89, 0x60, + 0xed, 0x8a, 0xee, 0x75, 0x18, 0x16, 0x20, 0x41, 0x89, 0xae, 0x71, 0x2d, 0x81, 0x25, 0xcb, 0xac, + 0x2d, 0x79, 0x4e, 0x68, 0x51, 0x27, 0xd4, 0x36, 0xe6, 0xf7, 0x61, 0x24, 0x10, 0x30, 0xb1, 0x2f, + 0x4f, 0xaa, 0xb4, 0x16, 0x08, 0xe6, 0xf6, 0x6c, 0x89, 0x63, 0xab, 0xbf, 0xac, 0x35, 0x0c, 0x67, + 0xb2, 0xb9, 0xba, 0xb4, 0xc8, 0xa4, 0x2a, 0x84, 0x25, 0x87, 0xe3, 0x16, 0xfa, 0x90, 0x47, 0x54, + 0x7f, 0xea, 0x8a, 0xa2, 0xc1, 0x8f, 0x5c, 0x04, 0xf1, 0xd1, 0x50, 0xac, 0xbb, 0x2a, 0x38, 0x4a, + 0x06, 0xb7, 0xbc, 0xf4, 0x0c, 0x1b, 0x18, 0xf6, 0xe5, 0x3e, 0xba, 0xcb, 0xbc, 0x8a, 0x46, 0x38, + 0x30, 0xc7, 0xb7, 0x79, 0xd6, 0x2b, 0x91, 0x80, 0xce, 0x57, 0x4b, 0xe3, 0x22, 0x8c, 0x2a, 0x98, + 0xba, 0xfb, 0xe2, 0xb2, 0x32, 0xf0, 0x77, 0xef, 0xf2, 0x57, 0xc1, 0x0d, 0xc5, 0x20, 0xa6, 0x63, + 0x55, 0xf0, 0xef, 0xee, 0x5b, 0xae, 0x22, 0xa4, 0x41, 0xf4, 0xad, 0x56, 0x11, 0xc7, 0x05, 0x3a, + 0x4d, 0x15, 0x06, 0xfe, 0xee, 0xfc, 0x49, 0x04, 0xf5, 0x2d, 0x57, 0xc1, 0x04, 0xf5, 0xed, 0x55, + 0x41, 0x65, 0x00, 0x25, 0x3e, 0x49, 0x53, 0x95, 0x2c, 0xa7, 0x2b, 0x91, 0x86, 0xeb, 0x04, 0x45, + 0xd7, 0xf1, 0xa0, 0x70, 0x91, 0x0b, 0xeb, 0x97, 0x50, 0x0d, 0x13, 0xd8, 0xb7, 0x5b, 0xcd, 0xdf, + 0x2b, 0xf0, 0x70, 0x4e, 0xb5, 0x4d, 0x2d, 0xf5, 0xa3, 0xf7, 0xd8, 0xd7, 0xae, 0xe6, 0xb5, 0xaf, + 0xfd, 0xa1, 0xeb, 0x35, 0xf5, 0xab, 0x79, 0xa7, 0x13, 0x1d, 0xa8, 0x70, 0xc7, 0x4f, 0x5c, 0xaf, + 0x69, 0x27, 0xb1, 0xc9, 0x07, 0x30, 0xa1, 0x81, 0x94, 0xb6, 0xc6, 0x73, 0x46, 0xe8, 0xe4, 0x6e, + 0xd3, 0x36, 0x31, 0xad, 0xbf, 0x29, 0xc0, 0x54, 0x46, 0x52, 0x62, 0x34, 0x66, 0xe0, 0x29, 0x48, + 0x2d, 0x54, 0x22, 0x61, 0x12, 0x46, 0x96, 0x30, 0x36, 0x49, 0x85, 0x88, 0xd1, 0xf2, 0xb5, 0x04, + 0xca, 0x45, 0x2d, 0x75, 0x57, 0x76, 0xd2, 0x64, 0x1d, 0x9d, 0x84, 0x00, 0x71, 0x4b, 0x84, 0xd9, + 0xb8, 0xc6, 0x54, 0x5a, 0x2d, 0xfb, 0xf2, 0x2b, 0x49, 0xff, 0xac, 0x55, 0x63, 0xfd, 0x56, 0x11, + 0xce, 0x65, 0xf4, 0xbf, 0x46, 0xa3, 0xbf, 0x0d, 0x11, 0x24, 0x72, 0x60, 0xf7, 0xff, 0x92, 0x72, + 0x60, 0x5b, 0xff, 0xbe, 0x08, 0xe7, 0x76, 0xda, 0x21, 0xbe, 0xb0, 0x5a, 0xf5, 0x9e, 0x52, 0x2f, + 0xf2, 0x83, 0xe7, 0xf8, 0x2a, 0x84, 0xbc, 0x0b, 0x83, 0x2b, 0xb4, 0xd5, 0xf2, 0xc5, 0xfc, 0xbf, + 0x24, 0xbd, 0x23, 0x92, 0xd8, 0x88, 0xb4, 0xd2, 0x67, 0x73, 0x6c, 0xf2, 0x01, 0x8c, 0xae, 0x50, + 0x27, 0x88, 0xf6, 0xa8, 0x23, 0x8f, 0x2c, 0x32, 0x93, 0x85, 0x46, 0x22, 0x10, 0x56, 0xfa, 0xec, + 0x18, 0x9b, 0xcc, 0xb3, 0xd3, 0xbc, 0xb7, 0xaf, 0x5e, 0x93, 0xe7, 0x54, 0xc8, 0x70, 0x56, 0xfa, + 0x6c, 0xc4, 0x25, 0xeb, 0x30, 0x51, 0xdd, 0xa7, 0x5e, 0xb4, 0x4e, 0x23, 0xa7, 0xe9, 0x44, 0x8e, + 0x50, 0x6d, 0x5f, 0xcf, 0x23, 0x36, 0x90, 0x57, 0xfa, 0x6c, 0x93, 0x9a, 0x7c, 0x04, 0xc3, 0xf7, + 0x7d, 0xbf, 0xb9, 0xf7, 0x9c, 0x0a, 0x75, 0xb5, 0x92, 0xc7, 0x48, 0xa0, 0xad, 0xf4, 0xd9, 0x92, + 0x62, 0x61, 0x10, 0xfa, 0xd7, 0xc3, 0x7d, 0xeb, 0xa8, 0x00, 0xe5, 0x25, 0xff, 0x99, 0x97, 0x29, + 0xd5, 0xef, 0x99, 0x52, 0x95, 0xec, 0x33, 0xf0, 0x13, 0x72, 0x7d, 0x07, 0x06, 0xb6, 0x5c, 0x6f, + 0x3f, 0xa1, 0x0a, 0x66, 0xd0, 0x31, 0x2c, 0x14, 0x8f, 0xeb, 0xed, 0x93, 0x35, 0xa9, 0x83, 0x0b, + 0x5b, 0x63, 0xbf, 0xa1, 0xf8, 0x67, 0x50, 0xeb, 0xd8, 0xb1, 0xae, 0xcd, 0x7f, 0xcb, 0x0e, 0xbe, + 0x05, 0xb3, 0x39, 0xf5, 0x8a, 0xe7, 0xe1, 0xac, 0x6f, 0x03, 0xa8, 0xd8, 0xbc, 0x09, 0x33, 0x99, + 0xe3, 0x97, 0x42, 0xfc, 0xa7, 0x59, 0x13, 0x91, 0xf7, 0xbc, 0x0c, 0xc3, 0x32, 0x5b, 0x12, 0xb7, + 0xfd, 0xc8, 0x9f, 0xf8, 0x40, 0x4a, 0x7e, 0xa8, 0x32, 0xb0, 0x87, 0xfc, 0x1e, 0x77, 0xb5, 0x40, + 0x4a, 0xfc, 0x73, 0xfa, 0xf0, 0x25, 0x3e, 0x1a, 0xc5, 0x8b, 0xd5, 0xb9, 0xe2, 0x87, 0x91, 0xa7, + 0x3c, 0x6f, 0x6d, 0xf5, 0x9b, 0xdc, 0x80, 0x92, 0x4c, 0xe7, 0x20, 0xf2, 0xc6, 0x88, 0x8c, 0xdd, + 0x76, 0x0a, 0x4e, 0xde, 0x87, 0xd9, 0x24, 0x4c, 0xf6, 0x92, 0xbf, 0x70, 0xcb, 0x2b, 0xb6, 0xfe, + 0xa2, 0x88, 0xb1, 0xae, 0xbb, 0xcc, 0x6b, 0x26, 0xdd, 0xcd, 0x9a, 0x90, 0x56, 0x71, 0xb3, 0x46, + 0x2e, 0xc2, 0xe8, 0x66, 0xcd, 0x48, 0x39, 0x65, 0xc7, 0x00, 0xd6, 0x6c, 0xd6, 0x85, 0x6a, 0xd0, + 0x38, 0x70, 0x23, 0xda, 0x88, 0x3a, 0x81, 0x58, 0x85, 0xed, 0x14, 0x9c, 0x58, 0x30, 0x7e, 0xbf, + 0xe5, 0xee, 0x35, 0x24, 0x33, 0x2e, 0x02, 0x03, 0x46, 0xde, 0x80, 0xc9, 0x55, 0x2f, 0x8c, 0x9c, + 0x56, 0x6b, 0x9d, 0x46, 0x07, 0x7e, 0x53, 0x24, 0xcd, 0xb4, 0x13, 0x50, 0x56, 0xef, 0xa2, 0xef, + 0x45, 0x8e, 0xeb, 0xd1, 0xc0, 0xee, 0x78, 0x91, 0x7b, 0x48, 0x45, 0xdf, 0x53, 0x70, 0xf2, 0x0e, + 0xcc, 0x28, 0xd8, 0x66, 0xd0, 0x38, 0xa0, 0x61, 0x14, 0x60, 0x22, 0x3a, 0x0c, 0xf8, 0x63, 0x67, + 0x17, 0x62, 0x0d, 0x2d, 0xbf, 0xd3, 0x5c, 0xf6, 0x9e, 0xba, 0x81, 0xef, 0x61, 0x6e, 0x8a, 0x11, + 0x51, 0x43, 0x02, 0x6e, 0xfd, 0xc1, 0x48, 0xe6, 0x67, 0xfb, 0x32, 0x73, 0xf0, 0x4b, 0x18, 0x5f, + 0x74, 0xda, 0xce, 0x9e, 0xdb, 0x72, 0x23, 0x57, 0x65, 0xec, 0x7a, 0xb7, 0xc7, 0x37, 0x2f, 0x13, + 0x7c, 0xd0, 0xa6, 0x4e, 0x6c, 0x1b, 0xac, 0xe6, 0xfe, 0x7a, 0x08, 0x66, 0x32, 0xf1, 0xc8, 0x75, + 0x91, 0xda, 0x4b, 0xad, 0xab, 0x22, 0xd9, 0x95, 0x9d, 0x04, 0xb3, 0xb1, 0x44, 0xd0, 0x62, 0x8b, + 0x3a, 0x5e, 0x47, 0xa4, 0xba, 0xb2, 0x0d, 0x18, 0x1b, 0x4b, 0xa6, 0x37, 0x68, 0xcc, 0xd0, 0x71, + 0xda, 0x4e, 0x40, 0xc9, 0x15, 0x18, 0x63, 0x10, 0xc9, 0x6a, 0x80, 0x3f, 0xf1, 0xd3, 0x40, 0x8c, + 0xd3, 0x86, 0xdf, 0xa4, 0x1a, 0xa7, 0x41, 0xce, 0xc9, 0x84, 0x32, 0x4e, 0x0c, 0x22, 0x39, 0x0d, + 0x71, 0x4e, 0x1a, 0x88, 0xbc, 0x06, 0x13, 0xd5, 0x76, 0x5b, 0x63, 0x84, 0x39, 0xae, 0x6c, 0x13, + 0x48, 0x2e, 0x03, 0x54, 0xdb, 0x6d, 0xc9, 0x06, 0xf3, 0x57, 0xd9, 0x1a, 0x84, 0xdc, 0x8c, 0xc3, + 0x95, 0x69, 0xac, 0xf0, 0x3a, 0xc1, 0xce, 0x28, 0x61, 0x72, 0x55, 0xb1, 0x9d, 0x04, 0x53, 0xe0, + 0x72, 0x4d, 0x80, 0xc9, 0xc7, 0x70, 0x3e, 0xe1, 0x77, 0xa1, 0x55, 0x80, 0xa6, 0x7e, 0x3b, 0x1f, + 0x81, 0xbc, 0x07, 0xe7, 0x12, 0x85, 0xb2, 0x3a, 0xb4, 0xea, 0xdb, 0x39, 0xa5, 0xe4, 0x43, 0x28, + 0x27, 0x9e, 0x6d, 0xc7, 0x95, 0xa2, 0x05, 0xdf, 0xce, 0x2d, 0x67, 0x5f, 0x57, 0xe2, 0xfd, 0x97, + 0xa8, 0x12, 0x2f, 0x2b, 0xed, 0xec, 0x42, 0xb2, 0x02, 0x95, 0x4c, 0x5f, 0x16, 0xad, 0x62, 0xcc, + 0xcb, 0x65, 0xf7, 0x42, 0x23, 0x0b, 0x70, 0x31, 0x13, 0x45, 0x36, 0x03, 0xb3, 0x75, 0xd9, 0x5d, + 0x71, 0xc8, 0x3c, 0x4c, 0xc7, 0x3e, 0x3d, 0x5a, 0x13, 0x30, 0x51, 0x97, 0x9d, 0x59, 0x46, 0xde, + 0x36, 0x1f, 0xe7, 0xf3, 0xca, 0x30, 0x4f, 0x97, 0x9d, 0x2e, 0xb0, 0x8e, 0x0b, 0x70, 0x31, 0x73, + 0xa3, 0x94, 0xfa, 0xfc, 0x5c, 0x52, 0x71, 0xd4, 0xd6, 0x82, 0x1b, 0x30, 0x80, 0x0a, 0x3e, 0xb7, + 0x15, 0x4b, 0x5f, 0x53, 0xa4, 0xe7, 0xac, 0x58, 0xa9, 0x8d, 0x38, 0xe4, 0xbe, 0xba, 0x1b, 0xec, + 0x47, 0x4b, 0xc6, 0xad, 0xa4, 0x02, 0x95, 0x51, 0xb9, 0x7e, 0x47, 0x28, 0x6f, 0x03, 0x5f, 0xe6, + 0x1a, 0xe6, 0x2f, 0x0a, 0x50, 0xe9, 0xa1, 0x1f, 0xa8, 0x3e, 0x15, 0x4e, 0xd0, 0xa7, 0x07, 0xaa, + 0x4f, 0xfc, 0x6d, 0xec, 0xfc, 0xc9, 0x74, 0x90, 0x57, 0xdd, 0xad, 0x0e, 0x90, 0xb4, 0x1a, 0x4a, + 0xbe, 0x0b, 0xa3, 0xb5, 0xda, 0x8a, 0xe1, 0xd0, 0x97, 0xba, 0x1c, 0x8a, 0x31, 0xc8, 0xed, 0x13, + 0x79, 0xf0, 0x69, 0xfe, 0x7b, 0xd6, 0x12, 0x94, 0xf3, 0x34, 0x48, 0x5c, 0x58, 0x78, 0x6c, 0x2d, + 0xed, 0x62, 0x89, 0x2f, 0x2c, 0x26, 0xd8, 0x7a, 0x0f, 0xce, 0x29, 0x6a, 0x9e, 0xb4, 0x43, 0x7b, + 0xf8, 0x2f, 0x8e, 0x9d, 0x2a, 0xc0, 0x40, 0x0c, 0xb0, 0xfe, 0x7c, 0x20, 0x45, 0x58, 0xeb, 0x1c, + 0x1e, 0x3a, 0xc1, 0x73, 0x52, 0x35, 0x09, 0xfb, 0x7b, 0x6a, 0xfa, 0x0b, 0x03, 0x3f, 0x3b, 0xaa, + 0xf4, 0x69, 0xdc, 0xd9, 0x72, 0x8c, 0x1b, 0xbb, 0xd7, 0xa0, 0xfc, 0x4a, 0xaa, 0xc8, 0x83, 0x1b, + 0x19, 0x40, 0xb2, 0x0b, 0x13, 0x62, 0xcb, 0xc4, 0xdf, 0x72, 0x6a, 0xdf, 0x4e, 0x4e, 0x6d, 0xa3, + 0x79, 0x37, 0x0d, 0x12, 0x3e, 0x09, 0x4c, 0x36, 0xe4, 0x4b, 0x98, 0x94, 0x0a, 0x92, 0x60, 0xcc, + 0x9d, 0x88, 0xee, 0x74, 0x67, 0x6c, 0xd2, 0x70, 0xce, 0x09, 0x46, 0xac, 0xc9, 0x72, 0x8d, 0xe1, + 0x9c, 0x07, 0x4f, 0xd2, 0x64, 0x83, 0x44, 0x34, 0xd9, 0x80, 0xcd, 0x7d, 0x06, 0x24, 0xdd, 0xaf, + 0x5e, 0xb3, 0x78, 0x42, 0x9b, 0xc5, 0x73, 0x55, 0x98, 0xca, 0xe8, 0xc0, 0xa9, 0x58, 0x7c, 0x06, + 0x24, 0xdd, 0xd2, 0xd3, 0x70, 0xb0, 0xae, 0xc3, 0x1b, 0x4a, 0x04, 0x6a, 0x36, 0x18, 0x3c, 0xa5, + 0xe1, 0xf9, 0x37, 0x8b, 0x50, 0xe9, 0x81, 0x4a, 0xfe, 0x7e, 0x21, 0x29, 0x6d, 0x3e, 0x1b, 0x3f, + 0x48, 0x4a, 0x3b, 0x9b, 0x3e, 0x43, 0xec, 0x0b, 0x1f, 0xfe, 0xf4, 0xaf, 0x5e, 0x58, 0xe1, 0x4f, + 0x0f, 0xd9, 0xe9, 0xa5, 0x35, 0xa0, 0x4b, 0xcb, 0x86, 0x69, 0xe3, 0xa8, 0x74, 0x92, 0x3d, 0xe3, + 0x32, 0x80, 0x48, 0xf1, 0xb9, 0xe6, 0xef, 0x0b, 0xf5, 0x4c, 0x83, 0x58, 0xf7, 0x60, 0x26, 0xc1, + 0x53, 0x18, 0xc3, 0xbf, 0x0b, 0xea, 0x81, 0x37, 0x32, 0xed, 0x5f, 0x38, 0xfb, 0x8b, 0xa3, 0xca, + 0x04, 0xd3, 0xa4, 0x6f, 0xc6, 0xf1, 0xe3, 0xe5, 0x5f, 0xd6, 0xba, 0x6e, 0xce, 0xaf, 0xb6, 0xf4, + 0xc0, 0x37, 0xe4, 0x0e, 0x0c, 0x71, 0x48, 0x22, 0x4a, 0xb3, 0x8e, 0x2d, 0xd6, 0x04, 0x81, 0x68, + 0xcd, 0xe0, 0x73, 0x54, 0xfc, 0x51, 0x8d, 0xc3, 0x27, 0x58, 0x3b, 0x3c, 0x6b, 0x49, 0x0c, 0x56, + 0x91, 0xa0, 0x07, 0xaa, 0x71, 0x98, 0x07, 0xe9, 0x7b, 0x21, 0xf1, 0x3c, 0xff, 0x59, 0x8b, 0x36, + 0x79, 0x46, 0xb8, 0x85, 0x71, 0xe1, 0x7b, 0x31, 0xe0, 0x30, 0x06, 0x48, 0x66, 0x7d, 0x0a, 0x33, + 0x6c, 0x83, 0x0e, 0x92, 0xf5, 0x61, 0xae, 0x02, 0x06, 0x33, 0x1d, 0xda, 0x1d, 0x06, 0x42, 0x87, + 0x76, 0x51, 0x68, 0xad, 0xc1, 0x79, 0x6e, 0x0c, 0xd4, 0xbb, 0x14, 0x9b, 0xde, 0x07, 0xf1, 0x77, + 0xe2, 0x31, 0x63, 0x46, 0xef, 0x39, 0x9e, 0xf5, 0x09, 0xbe, 0x96, 0x11, 0x93, 0xd4, 0xf5, 0xbd, + 0xd8, 0xf2, 0x77, 0xb2, 0xe7, 0xb5, 0xff, 0x27, 0x5c, 0xac, 0xb6, 0xdb, 0xd4, 0x6b, 0xc6, 0x84, + 0xdb, 0x81, 0x73, 0xc2, 0xe0, 0x07, 0xa4, 0x0a, 0x83, 0x88, 0xad, 0xee, 0x2d, 0x45, 0x73, 0x33, + 0x9a, 0x83, 0x78, 0x22, 0x6c, 0x27, 0x56, 0xc0, 0x29, 0xad, 0x26, 0xcc, 0xd6, 0x3a, 0x7b, 0x87, + 0x6e, 0x84, 0x6e, 0xf0, 0x18, 0x40, 0x44, 0xd6, 0xbd, 0x2a, 0x13, 0x4d, 0x71, 0x61, 0x5c, 0x8f, + 0x5f, 0x55, 0xa0, 0x27, 0xbd, 0x08, 0x2a, 0xf2, 0xf4, 0xce, 0xcd, 0x98, 0x14, 0xad, 0x1e, 0xbc, + 0x16, 0x2c, 0x16, 0xc9, 0xa8, 0xac, 0x29, 0x38, 0xab, 0xdf, 0x01, 0xf1, 0x19, 0x32, 0x03, 0x53, + 0xe6, 0xdd, 0x0e, 0x07, 0x7f, 0x0d, 0xd3, 0xdc, 0xf6, 0xcc, 0xc3, 0x6e, 0xcf, 0xc7, 0x11, 0xa6, + 0x8b, 0xbb, 0xf3, 0x09, 0xff, 0x7b, 0x74, 0xcb, 0x55, 0x09, 0x15, 0x76, 0xe7, 0xf9, 0x8b, 0xc7, + 0xa7, 0xf3, 0xc6, 0x0d, 0x62, 0x71, 0x77, 0x7e, 0x61, 0x58, 0x84, 0x2f, 0x65, 0xdc, 0xf9, 0xf0, + 0x7f, 0x2b, 0xdc, 0xe7, 0xf1, 0x91, 0xfd, 0x0a, 0x75, 0xf0, 0x41, 0x4c, 0xf6, 0x53, 0xe5, 0x49, + 0x28, 0xba, 0x4d, 0x79, 0x5a, 0x77, 0x9b, 0xd6, 0x1f, 0x17, 0xe0, 0x3a, 0xd7, 0x81, 0xb2, 0xe9, + 0xf0, 0xa2, 0x27, 0x87, 0x98, 0xbc, 0x0f, 0x3c, 0x6b, 0xbb, 0x50, 0x34, 0x2d, 0xd1, 0xf2, 0x6e, + 0x9c, 0x38, 0x01, 0xa9, 0xc2, 0xb8, 0xfe, 0xa4, 0xe4, 0x64, 0xe1, 0xe1, 0xec, 0xb1, 0xc3, 0xc7, + 0x8e, 0x7a, 0x66, 0xf2, 0x04, 0x2e, 0x2c, 0x7f, 0xc3, 0x26, 0x84, 0xd8, 0x9d, 0x84, 0xc2, 0x1e, + 0x3f, 0x85, 0x3d, 0xb3, 0x2d, 0x66, 0x8c, 0x79, 0x9a, 0x4e, 0x82, 0xd9, 0xd1, 0x54, 0x6e, 0x70, + 0x4a, 0x6b, 0x1e, 0xb5, 0x0d, 0x98, 0xf5, 0xe7, 0x05, 0xb8, 0x98, 0x5d, 0x9b, 0x58, 0x58, 0x56, + 0xe1, 0xec, 0xa2, 0xe3, 0xf9, 0x9e, 0xdb, 0x70, 0x5a, 0xb5, 0xc6, 0x01, 0x6d, 0x76, 0x54, 0x90, + 0x53, 0xb5, 0xca, 0xec, 0x53, 0x4f, 0x92, 0x4b, 0x14, 0x3b, 0x4d, 0xc5, 0x0e, 0x65, 0xf8, 0x2a, + 0x81, 0xaf, 0xbd, 0x2d, 0x1a, 0x28, 0x7e, 0xbc, 0x65, 0x39, 0xa5, 0xe4, 0xb6, 0x34, 0xb2, 0x37, + 0x77, 0x3c, 0x37, 0x52, 0x44, 0xdc, 0xba, 0x92, 0x55, 0x64, 0xfd, 0xdb, 0x02, 0x9c, 0xc7, 0xbc, + 0x46, 0x46, 0xa6, 0xc4, 0x38, 0xd6, 0xaf, 0x0c, 0x57, 0x5b, 0x30, 0x5e, 0x59, 0x18, 0xd8, 0x66, + 0xdc, 0x5a, 0xf2, 0x36, 0x0c, 0xd4, 0xa4, 0x93, 0xd4, 0x64, 0x22, 0x0d, 0xad, 0x4c, 0xf9, 0xef, + 0x07, 0x91, 0x8d, 0x58, 0x6c, 0xcf, 0x59, 0xa2, 0x61, 0x83, 0x7a, 0x98, 0x2f, 0x98, 0x1f, 0xf6, + 0x35, 0x48, 0x1c, 0xaa, 0x68, 0x20, 0x2f, 0x54, 0xd1, 0xa0, 0x19, 0xaa, 0xc8, 0x7a, 0xca, 0xb3, + 0x1a, 0x25, 0x3b, 0x24, 0x06, 0xe9, 0x93, 0x54, 0x7a, 0x61, 0xbe, 0x0f, 0x9c, 0xcb, 0xea, 0xd9, + 0xee, 0xdd, 0x54, 0xe6, 0xe0, 0xfc, 0xd8, 0xba, 0x5b, 0xf0, 0x9a, 0x81, 0x5b, 0x6d, 0xb5, 0xfc, + 0x67, 0xb4, 0xb9, 0x15, 0xf8, 0x87, 0x7e, 0x64, 0x64, 0x75, 0x11, 0xf9, 0xb5, 0xe3, 0x6b, 0x14, + 0x31, 0x2b, 0x13, 0x60, 0xeb, 0xff, 0x80, 0xd7, 0x7b, 0x70, 0x14, 0x9d, 0xaa, 0xc1, 0x59, 0x27, + 0x51, 0x26, 0xbd, 0x5d, 0x5e, 0xcf, 0xea, 0x57, 0x92, 0x51, 0x68, 0xa7, 0xe9, 0x6f, 0x6c, 0x1b, + 0x29, 0x79, 0x49, 0x19, 0xa6, 0xb7, 0xec, 0xcd, 0xa5, 0x9d, 0xc5, 0xed, 0xfa, 0xf6, 0x97, 0x5b, + 0xcb, 0xf5, 0x9d, 0x8d, 0x87, 0x1b, 0x9b, 0x8f, 0x36, 0x78, 0x70, 0x6a, 0xa3, 0x64, 0x7b, 0xb9, + 0xba, 0x5e, 0x2a, 0x90, 0x69, 0x28, 0x19, 0xe0, 0xe5, 0x9d, 0x85, 0x52, 0xf1, 0xc6, 0xd7, 0x46, + 0xaa, 0x59, 0x72, 0x11, 0xca, 0xb5, 0x9d, 0xad, 0xad, 0x4d, 0x5b, 0x71, 0xd5, 0x43, 0x63, 0xcf, + 0xc0, 0x59, 0xa3, 0xf4, 0x9e, 0xbd, 0xbc, 0x5c, 0x2a, 0xb0, 0xa6, 0x18, 0xe0, 0x2d, 0x7b, 0x79, + 0x7d, 0x75, 0x67, 0xbd, 0x54, 0xbc, 0x51, 0xd7, 0x9f, 0x76, 0x91, 0x0b, 0x30, 0xbb, 0xb4, 0xbc, + 0xbb, 0xba, 0xb8, 0x9c, 0xc5, 0x7b, 0x1a, 0x4a, 0x7a, 0xe1, 0xf6, 0xe6, 0xf6, 0x16, 0x67, 0xad, + 0x43, 0x1f, 0x2d, 0x2f, 0x54, 0x77, 0xb6, 0x57, 0x36, 0x4a, 0xfd, 0xd6, 0xc0, 0x48, 0xb1, 0x54, + 0xbc, 0xf1, 0x23, 0xe3, 0xdd, 0x17, 0x6b, 0xbe, 0x40, 0xdf, 0xa9, 0x55, 0xef, 0xe7, 0x57, 0xc1, + 0x4b, 0xd7, 0xef, 0x55, 0x4b, 0x05, 0x72, 0x09, 0xce, 0x1b, 0xd0, 0xad, 0x6a, 0xad, 0xf6, 0x68, + 0xd3, 0x5e, 0x5a, 0x5b, 0xae, 0xd5, 0x4a, 0xc5, 0x1b, 0xbb, 0x46, 0x78, 0x36, 0x56, 0xc3, 0xfa, + 0xbd, 0x6a, 0xdd, 0x5e, 0xfe, 0x7c, 0x67, 0xd5, 0x5e, 0x5e, 0x4a, 0xd7, 0x60, 0x94, 0x7e, 0xb9, + 0x5c, 0x2b, 0x15, 0xc8, 0x14, 0x9c, 0x31, 0xa0, 0x1b, 0x9b, 0xa5, 0xe2, 0x8d, 0x37, 0x44, 0x04, + 0x2f, 0x32, 0x09, 0xb0, 0xb4, 0x5c, 0x5b, 0x5c, 0xde, 0x58, 0x5a, 0xdd, 0xb8, 0x5f, 0xea, 0x23, + 0x13, 0x30, 0x5a, 0x55, 0x3f, 0x0b, 0x37, 0x3e, 0x84, 0x33, 0x89, 0x13, 0x35, 0xc3, 0x50, 0x87, + 0xd1, 0x52, 0x1f, 0x8a, 0x5f, 0xfe, 0x44, 0xb3, 0x26, 0x3f, 0x1c, 0x97, 0x0a, 0x37, 0x16, 0x64, + 0xea, 0x53, 0xed, 0x3b, 0x27, 0x63, 0x30, 0xbc, 0xb4, 0x7c, 0xaf, 0xba, 0xb3, 0xb6, 0x5d, 0xea, + 0x63, 0x3f, 0x16, 0xed, 0xe5, 0xea, 0xf6, 0xf2, 0x52, 0xa9, 0x40, 0x46, 0x61, 0xb0, 0xb6, 0x5d, + 0xdd, 0x5e, 0x2e, 0x15, 0xc9, 0x08, 0x0c, 0xec, 0xd4, 0x96, 0xed, 0x52, 0xff, 0xfc, 0x9f, 0xfc, + 0x83, 0x02, 0xb7, 0xed, 0xc9, 0x37, 0x44, 0x5f, 0x6b, 0x87, 0x49, 0xb1, 0xe4, 0x89, 0x3c, 0x8f, + 0xb9, 0x27, 0x47, 0xd4, 0x02, 0xe6, 0xba, 0x5c, 0x76, 0x20, 0xc2, 0xf5, 0xc2, 0xed, 0x02, 0xb1, + 0xd1, 0x39, 0x24, 0x71, 0xb6, 0x52, 0x9c, 0xb3, 0x8f, 0xbf, 0x73, 0x97, 0xba, 0x1e, 0xc9, 0xc8, + 0xaf, 0x81, 0xa5, 0xf3, 0xcc, 0x39, 0x81, 0x7c, 0xf7, 0x64, 0x27, 0x0d, 0x59, 0xe7, 0x1b, 0x27, + 0x43, 0x27, 0x0f, 0x60, 0x82, 0xe9, 0xe6, 0x0a, 0x8d, 0x5c, 0x48, 0x12, 0x6a, 0xc7, 0x81, 0xb9, + 0x8b, 0xd9, 0x85, 0x2a, 0x15, 0xcb, 0x38, 0x76, 0x84, 0x1f, 0xac, 0x43, 0x22, 0xa3, 0x3c, 0x48, + 0x08, 0x5f, 0xf1, 0xe7, 0xce, 0x26, 0xc0, 0xbb, 0x77, 0x6e, 0x17, 0x48, 0x0d, 0x43, 0xac, 0x19, + 0x4a, 0x3e, 0x91, 0x8f, 0xda, 0xd2, 0xda, 0x3f, 0x6f, 0x4d, 0x45, 0x25, 0x4e, 0xcc, 0x39, 0x1d, + 0x6c, 0x00, 0x49, 0xeb, 0xce, 0xe4, 0x4a, 0x3c, 0x0f, 0xb2, 0xd5, 0xea, 0xb9, 0x73, 0x29, 0x9f, + 0xbf, 0x65, 0xa6, 0x3d, 0x91, 0x65, 0x98, 0x14, 0x4f, 0xb8, 0x85, 0x36, 0x4f, 0xba, 0x9d, 0x07, + 0x72, 0xd9, 0xdc, 0x47, 0x39, 0xa9, 0x13, 0x01, 0x99, 0x8b, 0xfb, 0x91, 0x3c, 0x26, 0xcc, 0x5d, + 0xc8, 0x2c, 0x13, 0xfd, 0xbb, 0x07, 0x93, 0xe6, 0xe1, 0x82, 0xc8, 0x01, 0xca, 0x3c, 0x73, 0xe4, + 0x36, 0xa8, 0x0e, 0xb3, 0xeb, 0x8e, 0x8b, 0x57, 0x14, 0xc2, 0xb3, 0x4c, 0xfa, 0x85, 0x91, 0x4a, + 0x17, 0x47, 0xb1, 0x1a, 0xf5, 0x9a, 0x6a, 0x10, 0xf2, 0xc2, 0xaa, 0xe3, 0x67, 0x53, 0x93, 0x3a, + 0xb2, 0xe9, 0x57, 0x47, 0x2c, 0x33, 0x19, 0x6e, 0x96, 0xab, 0xe4, 0x5c, 0x9e, 0x77, 0x2f, 0x59, + 0x47, 0x25, 0x3d, 0xc1, 0x51, 0x9b, 0x13, 0xa7, 0x66, 0x57, 0xc6, 0x40, 0x02, 0x5a, 0x12, 0x71, + 0x51, 0x18, 0x92, 0x1c, 0xc1, 0xe5, 0x32, 0xbb, 0x5d, 0x20, 0x5f, 0xe3, 0x57, 0x9d, 0xc9, 0xee, + 0x91, 0x1b, 0x1d, 0x08, 0xed, 0xe7, 0x42, 0x26, 0x03, 0xf1, 0xa1, 0x74, 0xe1, 0x6e, 0xc3, 0x74, + 0x96, 0x43, 0xb1, 0x12, 0x68, 0x17, 0x6f, 0xe3, 0xdc, 0x59, 0x60, 0xb3, 0xa3, 0x46, 0x33, 0x7f, + 0x90, 0xba, 0xf8, 0xb3, 0xe6, 0xf2, 0xfc, 0x18, 0x26, 0xd9, 0x2c, 0x79, 0x48, 0x69, 0xbb, 0xda, + 0x72, 0x9f, 0xd2, 0x90, 0xc8, 0xf8, 0xb8, 0x0a, 0x94, 0x47, 0x7b, 0xbd, 0x40, 0xbe, 0x03, 0x63, + 0x8f, 0x9c, 0xa8, 0x71, 0x20, 0xe2, 0x44, 0xca, 0x30, 0x92, 0x08, 0x9b, 0x93, 0xbf, 0xb0, 0xf0, + 0x76, 0x81, 0x7c, 0x1f, 0x86, 0xef, 0xd3, 0x08, 0x1f, 0x15, 0x5f, 0x55, 0xbe, 0x75, 0xdc, 0x36, + 0xb9, 0xea, 0xa9, 0x97, 0x33, 0xb2, 0xc1, 0x49, 0x03, 0x2a, 0xb9, 0x05, 0xc0, 0x17, 0x04, 0xe4, + 0x90, 0x2c, 0x9e, 0x4b, 0x35, 0x9b, 0xdc, 0x67, 0xca, 0x43, 0x8b, 0x46, 0xf4, 0xa4, 0x55, 0xe6, + 0xc9, 0x68, 0x0d, 0x26, 0x55, 0xf6, 0x9a, 0x0d, 0x0c, 0xe7, 0x61, 0x25, 0x98, 0x85, 0xa7, 0xe0, + 0xf6, 0x21, 0xfb, 0x2a, 0x78, 0xea, 0x56, 0x8c, 0xfb, 0x80, 0x2b, 0xe9, 0xac, 0x1e, 0x3c, 0x42, + 0x5f, 0x42, 0xa5, 0x10, 0x39, 0x9a, 0x46, 0xbb, 0xe2, 0x87, 0x91, 0x49, 0xab, 0x20, 0xd9, 0xb4, + 0xbf, 0x0a, 0x73, 0x7a, 0xbd, 0x66, 0xa0, 0xe2, 0x78, 0xcd, 0xcd, 0x8b, 0x7f, 0x3c, 0x77, 0xb5, + 0x0b, 0x86, 0x38, 0xbf, 0xf5, 0xff, 0x76, 0xb1, 0x80, 0xcb, 0xc9, 0x12, 0x4c, 0xc9, 0xba, 0x36, + 0xdb, 0xd4, 0xab, 0xd5, 0x56, 0x30, 0x53, 0x89, 0xf4, 0xe4, 0xd0, 0x60, 0x92, 0x3b, 0x49, 0x17, + 0xb1, 0xad, 0xcf, 0x88, 0xef, 0x40, 0xba, 0x45, 0x7d, 0x88, 0xb7, 0xbe, 0xcc, 0x08, 0xba, 0x0f, + 0xb9, 0x51, 0xc9, 0x50, 0xfe, 0x77, 0xe7, 0x49, 0x97, 0x03, 0xd0, 0x5c, 0xce, 0x11, 0xe2, 0x76, + 0x81, 0x7c, 0x09, 0x24, 0x7d, 0x24, 0x51, 0x22, 0xcc, 0x3d, 0x7e, 0x29, 0x11, 0x76, 0x39, 0xcf, + 0x2c, 0xc3, 0x94, 0x8a, 0xee, 0x12, 0x97, 0x93, 0x9c, 0xb6, 0x74, 0xd9, 0xc1, 0x66, 0x32, 0xd8, + 0xec, 0xce, 0x77, 0x61, 0x94, 0x09, 0x27, 0x9f, 0xc2, 0x94, 0x98, 0xfb, 0x46, 0x7b, 0x4a, 0x6a, + 0x19, 0x13, 0x87, 0x9b, 0xdc, 0x96, 0x3c, 0x80, 0x99, 0x5a, 0x42, 0xf0, 0xdc, 0x8f, 0xfd, 0xbc, + 0xc9, 0x02, 0x81, 0x35, 0x1a, 0x71, 0xc9, 0x67, 0xf3, 0x7a, 0x08, 0x84, 0xdb, 0x96, 0x24, 0xbb, + 0xa7, 0x2e, 0x7d, 0x46, 0x2e, 0x25, 0x9a, 0xce, 0x80, 0x88, 0x86, 0xeb, 0x60, 0x6e, 0xcf, 0xb6, + 0x79, 0xfe, 0x62, 0x84, 0x1a, 0x37, 0xe0, 0x57, 0x0c, 0x02, 0xe3, 0x12, 0x5d, 0x8c, 0xe3, 0xf9, + 0x5c, 0x0c, 0xf2, 0x1b, 0x18, 0x9d, 0xb5, 0xfb, 0xe9, 0x8c, 0x7c, 0x27, 0xeb, 0x10, 0x9d, 0x73, + 0xbe, 0x9c, 0x7b, 0xfb, 0x64, 0xc8, 0xea, 0x3c, 0x3c, 0x71, 0x9f, 0x46, 0x5b, 0xad, 0xce, 0xbe, + 0x8b, 0x99, 0x2d, 0x89, 0xb2, 0x3d, 0x29, 0x90, 0x98, 0xde, 0x32, 0x28, 0x5a, 0x5c, 0x50, 0xa3, + 0x3f, 0x26, 0xab, 0x50, 0xe2, 0xdb, 0x88, 0xc6, 0xe2, 0x52, 0x8a, 0x85, 0x40, 0x71, 0x02, 0xe7, + 0x30, 0xcc, 0x1d, 0xad, 0x5b, 0xdc, 0xe5, 0x88, 0xc8, 0x4f, 0x5b, 0xd7, 0x53, 0xa7, 0x0c, 0x98, + 0x8a, 0x58, 0xcf, 0x46, 0xc4, 0xa6, 0x21, 0x8d, 0x64, 0x18, 0x18, 0x9e, 0xd7, 0xf4, 0x5a, 0xac, + 0x33, 0xa4, 0x4b, 0xe3, 0x15, 0x24, 0x11, 0xb2, 0x6c, 0xf7, 0x2e, 0x51, 0xb9, 0x5e, 0x33, 0x98, + 0xbe, 0x61, 0xa8, 0x36, 0xa7, 0xe3, 0xfb, 0x0e, 0x6e, 0x65, 0x18, 0xfa, 0x66, 0x26, 0x6e, 0x1b, + 0xfb, 0x2d, 0xa9, 0x26, 0x34, 0xaa, 0xdd, 0x79, 0x5c, 0x19, 0xd9, 0x5e, 0xcb, 0x34, 0xe1, 0x4e, + 0x10, 0x50, 0x8f, 0x13, 0xe7, 0xa9, 0x2d, 0x59, 0xd4, 0x9f, 0xe0, 0x0a, 0xa6, 0x51, 0xf3, 0xe7, + 0x76, 0xbd, 0x58, 0xf0, 0x3c, 0x3c, 0xb7, 0x0b, 0xe4, 0x7d, 0x18, 0x11, 0x6d, 0x64, 0x44, 0x46, + 0xa3, 0xc3, 0x2e, 0xad, 0x46, 0x4a, 0xe0, 0x42, 0xc2, 0x36, 0x9b, 0x38, 0x79, 0xa3, 0xcf, 0xdb, + 0xfc, 0x3e, 0xdb, 0xb3, 0x9b, 0x2f, 0x42, 0xb9, 0x28, 0x37, 0x6f, 0xa4, 0x2c, 0xab, 0x48, 0x2c, + 0x12, 0xd4, 0x63, 0x97, 0xe5, 0x4c, 0x98, 0xfa, 0x8d, 0x31, 0x07, 0x55, 0xe8, 0x30, 0xa5, 0x7e, + 0x1b, 0xe0, 0x5e, 0x5b, 0xf6, 0x2a, 0x94, 0xaa, 0x0d, 0xdc, 0x50, 0x6a, 0xf4, 0xd0, 0x69, 0x1f, + 0xf8, 0x01, 0x55, 0x67, 0x9f, 0x64, 0x81, 0xe4, 0x35, 0xa3, 0x14, 0x14, 0x51, 0xb0, 0x46, 0x1d, + 0x0c, 0xcc, 0x3c, 0xab, 0x34, 0x94, 0x44, 0x51, 0x36, 0x45, 0x97, 0xb3, 0xce, 0xf4, 0x22, 0x3b, + 0x9d, 0xb5, 0x5e, 0x8e, 0xcd, 0x87, 0xb8, 0x60, 0x28, 0xe4, 0x50, 0xed, 0x10, 0x0a, 0xa4, 0x4e, + 0x85, 0xf2, 0xe5, 0x8d, 0x42, 0xad, 0xca, 0xab, 0xe7, 0x58, 0x2c, 0x79, 0xd4, 0x79, 0xd5, 0x7f, + 0x0f, 0x26, 0x97, 0xd9, 0x82, 0xde, 0x69, 0xba, 0x3c, 0x18, 0x3d, 0x31, 0xa3, 0x8b, 0xe7, 0x12, + 0xae, 0xc8, 0xd4, 0x57, 0x48, 0x2a, 0x2c, 0x08, 0x72, 0x4f, 0xd1, 0x60, 0x72, 0x3c, 0xa6, 0x25, + 0x5b, 0x91, 0x0f, 0x00, 0x4f, 0xf8, 0xc2, 0x64, 0x30, 0xcb, 0x15, 0xcb, 0x6a, 0xbb, 0xdd, 0x92, + 0x96, 0x6d, 0x7e, 0x53, 0xff, 0xba, 0x71, 0x12, 0x4d, 0x95, 0x4b, 0xde, 0x69, 0xdd, 0xf3, 0x0b, + 0x2d, 0x15, 0x6d, 0x0e, 0xcf, 0x9c, 0xf2, 0x5e, 0x73, 0x51, 0x85, 0x8f, 0xae, 0xb6, 0x5a, 0x29, + 0xe2, 0x90, 0xbc, 0x65, 0x72, 0xcf, 0xc2, 0xe9, 0x55, 0x03, 0x9e, 0xf4, 0xb9, 0xf2, 0x56, 0x6d, + 0xb7, 0xf9, 0x62, 0x79, 0x59, 0x2d, 0x18, 0x66, 0x41, 0xfa, 0xa4, 0x9f, 0x2c, 0x17, 0x6b, 0xfb, + 0x03, 0x9c, 0x66, 0x71, 0xbe, 0x5a, 0xa2, 0x9f, 0x9b, 0x93, 0xe9, 0x7a, 0x95, 0x2e, 0x97, 0x28, + 0x54, 0xfb, 0xc4, 0x99, 0x44, 0xea, 0x7e, 0x65, 0xe0, 0x49, 0xa5, 0xf4, 0xe7, 0xfc, 0x2e, 0xe7, + 0x15, 0x2b, 0x83, 0x6b, 0x29, 0x99, 0x13, 0x5c, 0x75, 0x39, 0x27, 0xd7, 0xbc, 0xea, 0x72, 0x6e, + 0x32, 0xf1, 0x07, 0x50, 0x4a, 0xa6, 0x23, 0x56, 0x4c, 0x73, 0xf2, 0x14, 0xe7, 0x8e, 0xc9, 0x3d, + 0x98, 0xd6, 0x47, 0x54, 0xf5, 0x3b, 0x6f, 0xf5, 0xcf, 0xe3, 0xb3, 0x0d, 0x33, 0x99, 0xd9, 0x83, + 0xd5, 0x16, 0xdb, 0x2d, 0xb7, 0x70, 0x2e, 0x57, 0x0a, 0xe7, 0xb2, 0x13, 0x88, 0x93, 0xd7, 0x4c, + 0xfb, 0x41, 0x76, 0x3a, 0xe5, 0xb9, 0xd7, 0x7b, 0x60, 0x09, 0x81, 0x7e, 0x8d, 0x3b, 0x60, 0xaa, + 0x8e, 0xab, 0x9a, 0x45, 0x21, 0xa7, 0x02, 0xab, 0x1b, 0x8a, 0x9a, 0x03, 0xd3, 0x19, 0xc5, 0xf9, + 0x22, 0xbe, 0x96, 0xcf, 0x33, 0x9e, 0x58, 0xbb, 0x32, 0x4a, 0x72, 0xae, 0x64, 0xba, 0x26, 0x9a, + 0xee, 0x72, 0x24, 0x9d, 0x53, 0xf3, 0xe1, 0xe4, 0x4d, 0xce, 0x37, 0x2f, 0x4d, 0x67, 0xa5, 0x37, + 0x4f, 0x5a, 0x7f, 0xb2, 0xb2, 0x57, 0x2b, 0x31, 0x74, 0xcd, 0x8f, 0xbe, 0xcb, 0x2d, 0x41, 0x26, + 0x77, 0xdd, 0x12, 0x94, 0xc9, 0xfa, 0x4a, 0x3e, 0x42, 0x3c, 0x23, 0x8c, 0xd8, 0xeb, 0xa2, 0xff, + 0xfa, 0x39, 0x2b, 0x3b, 0xb1, 0xb5, 0x9a, 0x11, 0x99, 0x28, 0x82, 0xbb, 0x2d, 0x3f, 0xba, 0x1c, + 0xb1, 0x74, 0x49, 0xea, 0xdd, 0xe5, 0x38, 0x54, 0x8e, 0x07, 0x2e, 0xd1, 0xec, 0xd3, 0x0e, 0xdb, + 0xd7, 0x70, 0x3e, 0x37, 0x81, 0x37, 0x79, 0x33, 0xf5, 0x41, 0xe7, 0x48, 0x22, 0xbf, 0xa5, 0x13, + 0x46, 0xee, 0x6d, 0x65, 0x0a, 0x4b, 0xa4, 0xf9, 0x4e, 0xad, 0xd8, 0x19, 0x39, 0xc0, 0xef, 0xa3, + 0xe6, 0xab, 0xe5, 0xf1, 0xce, 0xed, 0xeb, 0xa5, 0x2c, 0x3e, 0x61, 0x7a, 0x4d, 0xd5, 0xda, 0x25, + 0x35, 0xb1, 0x64, 0xc1, 0x69, 0xd6, 0xd4, 0x93, 0x34, 0x2d, 0x8f, 0xcf, 0x12, 0x8c, 0x69, 0x09, + 0xc0, 0xc9, 0x79, 0x43, 0x4c, 0xc6, 0x2e, 0x39, 0x67, 0x74, 0xce, 0xdc, 0x20, 0x17, 0xd1, 0xe6, + 0xac, 0xd2, 0x88, 0xe7, 0xb6, 0xe2, 0x42, 0x9a, 0x87, 0x61, 0x6f, 0x56, 0x52, 0xe0, 0xad, 0xb9, + 0x98, 0x14, 0x8e, 0xd1, 0xa0, 0xfc, 0x2e, 0x11, 0x5d, 0x34, 0x3d, 0x9a, 0x94, 0xaf, 0xa1, 0x4e, + 0x89, 0x2c, 0xa3, 0x98, 0x0c, 0x45, 0xc6, 0xe4, 0x3b, 0xa7, 0x8c, 0x67, 0x1a, 0xb4, 0x8b, 0x2d, + 0x63, 0x0b, 0x9f, 0x76, 0x64, 0x64, 0x44, 0x57, 0x6b, 0x68, 0xd7, 0x84, 0xe9, 0x19, 0xda, 0x99, + 0x5a, 0x95, 0x73, 0x39, 0x76, 0x4d, 0x91, 0x9e, 0xdb, 0xd2, 0x1f, 0x6a, 0xab, 0x72, 0x2a, 0xef, + 0x39, 0xb9, 0x9e, 0x54, 0xcd, 0xf2, 0x52, 0xa3, 0x77, 0x59, 0xf5, 0xa7, 0xb3, 0x52, 0xa6, 0x6b, + 0x06, 0xe0, 0xdc, 0x7c, 0xea, 0x19, 0x52, 0x50, 0xcb, 0x5b, 0x0e, 0xb7, 0x2e, 0x09, 0xd4, 0x73, + 0x5b, 0xf8, 0x95, 0xb6, 0xbc, 0x25, 0x12, 0x9d, 0xab, 0x03, 0x77, 0x8f, 0x4c, 0xe8, 0xb9, 0xbc, + 0x37, 0xf0, 0x31, 0x50, 0x3a, 0x4b, 0xb9, 0xd2, 0x5d, 0xba, 0xe5, 0x30, 0xcf, 0xb4, 0x0f, 0xcf, + 0xa4, 0xbb, 0xc8, 0xf8, 0x9d, 0x4b, 0x58, 0x77, 0x7b, 0x35, 0x4c, 0xad, 0xc3, 0x19, 0xd9, 0xcd, + 0x13, 0xeb, 0x70, 0x7e, 0xfe, 0xf3, 0x2e, 0x07, 0x9d, 0x33, 0x35, 0x77, 0xdf, 0xd3, 0x92, 0x93, + 0xab, 0x63, 0x4e, 0x3a, 0x5f, 0xba, 0x5a, 0x62, 0xb2, 0x72, 0x99, 0x6f, 0x32, 0x0d, 0x87, 0xeb, + 0xe7, 0x7a, 0x9a, 0x69, 0x32, 0x97, 0x9f, 0x5d, 0x5b, 0x2d, 0x37, 0x99, 0x79, 0xa9, 0x35, 0x86, + 0x7a, 0x8e, 0x67, 0xc5, 0x30, 0x23, 0xdd, 0xb4, 0x62, 0x98, 0x99, 0x14, 0xfa, 0x16, 0xda, 0x55, + 0x6c, 0xbf, 0x45, 0x75, 0xbb, 0x8a, 0x96, 0x34, 0x38, 0x61, 0xd6, 0x20, 0x1f, 0xa1, 0x51, 0xa3, + 0xbb, 0x25, 0x64, 0xd6, 0xe4, 0xa4, 0xfb, 0x8e, 0x8c, 0xaa, 0x8c, 0xcc, 0xca, 0x8a, 0x9e, 0x4c, + 0x0a, 0x3d, 0x57, 0x4e, 0x17, 0x08, 0xfa, 0x77, 0xa5, 0x5d, 0x04, 0x1b, 0x5c, 0x36, 0xed, 0x49, + 0xf9, 0x6d, 0x7e, 0x57, 0x1a, 0x45, 0x0c, 0xb2, 0x54, 0x3e, 0xe6, 0x24, 0xd9, 0xf7, 0x60, 0x3c, + 0xce, 0xbd, 0xbc, 0x3b, 0xaf, 0x11, 0x26, 0x12, 0x32, 0x27, 0x09, 0xdf, 0x97, 0x17, 0x27, 0x58, + 0x9f, 0x59, 0xd8, 0xdd, 0x7e, 0xf2, 0x89, 0x34, 0xc2, 0x18, 0x2d, 0x4d, 0x65, 0x72, 0xee, 0xb2, + 0x72, 0x8f, 0xeb, 0x09, 0x23, 0xd5, 0xbc, 0xc8, 0x48, 0xf9, 0xaa, 0xe6, 0x45, 0x56, 0xca, 0xd6, + 0xf8, 0x62, 0xe1, 0x4b, 0x69, 0x71, 0x88, 0x99, 0x5e, 0x32, 0x9a, 0x95, 0xe2, 0x7b, 0x39, 0xaf, + 0x38, 0xc9, 0xba, 0x06, 0xa5, 0x64, 0x76, 0x4b, 0x75, 0x5c, 0xcb, 0x49, 0x43, 0xaa, 0xce, 0x80, + 0xb9, 0x69, 0x31, 0xb7, 0xa4, 0xf9, 0xdc, 0xe4, 0x7b, 0x35, 0xbb, 0x51, 0x3a, 0xeb, 0xee, 0x6a, + 0x59, 0x9c, 0xe8, 0x52, 0x3f, 0x48, 0xa7, 0x12, 0x69, 0xea, 0x6a, 0x59, 0x46, 0x6e, 0x4c, 0x57, + 0x86, 0x73, 0xca, 0xce, 0xb7, 0xfd, 0x96, 0x79, 0xc2, 0xed, 0x12, 0x15, 0xbd, 0xe7, 0x25, 0x33, + 0xf9, 0x15, 0x98, 0xcd, 0x09, 0x20, 0x4d, 0x5e, 0x4f, 0x18, 0x62, 0xb3, 0x03, 0x4c, 0xab, 0x09, + 0x92, 0x99, 0x81, 0x7a, 0x1d, 0xbd, 0x13, 0x8c, 0xc0, 0x0d, 0xa9, 0x1b, 0xbf, 0x47, 0x6e, 0x74, + 0xc0, 0x13, 0x2d, 0x6b, 0x6b, 0x6e, 0x66, 0xc4, 0x07, 0x52, 0xc3, 0xf3, 0x8a, 0x01, 0xcd, 0xb8, + 0xf4, 0xcb, 0x60, 0x38, 0x97, 0xcd, 0x90, 0xad, 0x1d, 0x6c, 0x2e, 0x64, 0x44, 0xd5, 0x50, 0x73, + 0x21, 0x3f, 0xe2, 0x46, 0x6e, 0x33, 0xb7, 0xa4, 0x82, 0x95, 0xcd, 0x31, 0x3f, 0xc0, 0x46, 0x2e, + 0xc7, 0x07, 0x8c, 0x63, 0x2a, 0x66, 0x06, 0xc9, 0x41, 0xef, 0xbe, 0x7a, 0xd8, 0x72, 0xbf, 0x36, + 0xa9, 0xe6, 0xb5, 0xf6, 0xe5, 0x45, 0xe7, 0xc8, 0x6d, 0xdf, 0xb2, 0xfc, 0x9e, 0xb2, 0xdb, 0x77, + 0xd2, 0x1d, 0x5b, 0x5d, 0x8f, 0x25, 0xc2, 0xb6, 0x18, 0x1d, 0xd5, 0xe0, 0x73, 0x39, 0x70, 0xb2, + 0x81, 0xee, 0x46, 0x49, 0xa8, 0x76, 0x70, 0xcd, 0x8e, 0x0b, 0x93, 0xcb, 0x8f, 0xcf, 0x63, 0x23, + 0xae, 0xc6, 0x69, 0xe6, 0x71, 0x22, 0x20, 0x87, 0x98, 0xc7, 0x06, 0xf4, 0x74, 0xf3, 0x38, 0xc1, + 0xd0, 0x9c, 0xc7, 0xc9, 0x66, 0x26, 0x0d, 0x01, 0xb9, 0xa3, 0x9a, 0x6c, 0xa6, 0x9a, 0xc7, 0xd9, + 0x1c, 0xf3, 0xe3, 0x9f, 0xe4, 0x72, 0x54, 0xf3, 0xd8, 0xe4, 0x98, 0x83, 0x7e, 0xc2, 0x79, 0x9c, + 0xac, 0xc4, 0x9c, 0xc7, 0xa7, 0x6a, 0x9f, 0x9a, 0xc7, 0xd9, 0xed, 0x3b, 0xf5, 0x3c, 0x4e, 0x04, + 0x0c, 0x32, 0x3a, 0x9a, 0x35, 0x8f, 0x93, 0xf8, 0x7c, 0x1e, 0x27, 0xa1, 0x09, 0x03, 0x4c, 0x97, + 0x79, 0x9c, 0xa4, 0xfc, 0x1c, 0xf9, 0x25, 0x82, 0x9d, 0x9c, 0x64, 0x26, 0xe7, 0xc6, 0x49, 0x21, + 0x8f, 0xd0, 0xfa, 0x97, 0x80, 0x9f, 0x6c, 0x36, 0x5f, 0xcc, 0x63, 0x8a, 0xf3, 0x79, 0x57, 0x0a, + 0x31, 0xd9, 0x5c, 0xd3, 0xb4, 0x95, 0x1d, 0xeb, 0xa5, 0x4b, 0x83, 0x77, 0xd9, 0xbc, 0x69, 0x76, + 0xe1, 0xdb, 0x2d, 0x54, 0x4d, 0x17, 0xbe, 0xea, 0x1c, 0x94, 0xe4, 0x9b, 0x4b, 0xd2, 0x7d, 0x7e, + 0x7f, 0x21, 0xef, 0x3f, 0x92, 0x74, 0xf3, 0x89, 0x93, 0xd5, 0xa9, 0x5b, 0xaa, 0x4e, 0x58, 0xc9, + 0x96, 0x9e, 0x76, 0x9e, 0xaf, 0x4b, 0xed, 0x21, 0x15, 0xe3, 0x2a, 0xd1, 0x69, 0x7d, 0xae, 0xe7, + 0x96, 0x90, 0x6d, 0x34, 0xf5, 0xa6, 0xe1, 0x9a, 0x99, 0x38, 0x2f, 0x98, 0x56, 0x4f, 0xae, 0xa9, + 0x68, 0x3d, 0x3a, 0xd7, 0xbc, 0x50, 0x3e, 0x8a, 0x6b, 0x9a, 0xfa, 0x53, 0x34, 0x9d, 0x89, 0x37, + 0x5d, 0xde, 0x63, 0x3f, 0xff, 0x9c, 0x33, 0x65, 0xb8, 0x44, 0x31, 0x5c, 0xf4, 0x44, 0xfb, 0x58, + 0x5c, 0xf0, 0x49, 0x60, 0xae, 0xf0, 0xb3, 0xe8, 0xc9, 0xa7, 0x50, 0x12, 0xcb, 0x5b, 0xcc, 0x20, + 0x0b, 0x31, 0x77, 0xe8, 0x16, 0xa4, 0xc5, 0xee, 0x04, 0x2d, 0x38, 0x89, 0xa5, 0xee, 0x24, 0x92, + 0xc8, 0x37, 0x6b, 0xb1, 0xed, 0x70, 0x3b, 0xe8, 0x84, 0x11, 0x6d, 0xa6, 0xcd, 0x51, 0x66, 0x63, + 0xa4, 0xe3, 0x84, 0x89, 0xbe, 0x3b, 0x4f, 0x56, 0x71, 0x6d, 0x33, 0xc1, 0xdd, 0xec, 0x75, 0xd9, + 0x6c, 0x70, 0xe9, 0x59, 0x51, 0x8f, 0x87, 0xcc, 0x36, 0xe5, 0xd5, 0x9d, 0xdf, 0x28, 0x25, 0xa2, + 0x13, 0xf6, 0x2e, 0x4f, 0x44, 0xfc, 0x40, 0xcd, 0x6d, 0x87, 0xbd, 0x24, 0x93, 0x7c, 0xce, 0x44, + 0x3e, 0x83, 0x51, 0x49, 0xdc, 0x5b, 0x20, 0x49, 0x6a, 0x14, 0xc8, 0x12, 0x4c, 0x18, 0x6f, 0xb5, + 0xd4, 0xe9, 0x26, 0xeb, 0x05, 0x57, 0x97, 0x71, 0x9e, 0x30, 0xde, 0x64, 0x29, 0x2e, 0x59, 0x2f, + 0xb5, 0x72, 0xb9, 0x7c, 0x1f, 0xc6, 0x84, 0x48, 0xbb, 0x4a, 0x23, 0xdf, 0x58, 0x37, 0xa3, 0xf9, + 0x3d, 0x77, 0x9a, 0x6e, 0xb4, 0xe8, 0x7b, 0x8f, 0xdd, 0xfd, 0x9e, 0x82, 0x49, 0x93, 0xec, 0xce, + 0x93, 0x1f, 0x60, 0x5a, 0x62, 0x99, 0x2c, 0x9a, 0x46, 0xcf, 0xfc, 0xe0, 0x89, 0xeb, 0xed, 0xf7, + 0x60, 0x79, 0xc5, 0x64, 0x99, 0xa4, 0x93, 0xae, 0x25, 0x3f, 0x80, 0xb9, 0x5a, 0x3e, 0xf3, 0x9e, + 0x4c, 0xba, 0x6f, 0x2f, 0x35, 0xb8, 0x88, 0xce, 0x35, 0xa7, 0x6d, 0x7b, 0x57, 0xa6, 0x5f, 0xf2, + 0x30, 0x89, 0xd2, 0xd0, 0xdf, 0xf0, 0x83, 0x66, 0x6f, 0x8e, 0x15, 0xd3, 0x5d, 0x37, 0x41, 0x26, + 0x85, 0xf1, 0x25, 0x9c, 0xaf, 0xe5, 0xb2, 0xee, 0xc5, 0xa2, 0x97, 0x26, 0x79, 0x01, 0x45, 0x71, + 0xca, 0x76, 0x77, 0xe5, 0xb9, 0x8a, 0x6b, 0x1a, 0xdb, 0x87, 0xb6, 0x02, 0xfa, 0x98, 0x06, 0xe8, + 0x14, 0xde, 0xcb, 0x1d, 0xda, 0x44, 0x97, 0x3d, 0x5f, 0x85, 0xb3, 0xb5, 0x14, 0xab, 0x3c, 0x92, + 0xee, 0xad, 0x7a, 0x00, 0x53, 0xd8, 0xd3, 0x13, 0xb6, 0xab, 0x87, 0x13, 0xd1, 0xd8, 0x7d, 0x1a, + 0xed, 0xac, 0xf6, 0x90, 0x92, 0x7c, 0xb5, 0x20, 0x11, 0x77, 0xef, 0x30, 0xca, 0x9a, 0x46, 0x99, + 0xc6, 0xc8, 0xfd, 0x78, 0x3f, 0x93, 0x17, 0x29, 0x3d, 0xab, 0xcd, 0xe3, 0x70, 0x17, 0xd7, 0x42, + 0xe1, 0x18, 0xad, 0x99, 0x20, 0x39, 0x24, 0x36, 0xd5, 0x69, 0x3e, 0xd2, 0x21, 0xa9, 0xf2, 0xe3, + 0x1f, 0x9f, 0x1e, 0x02, 0x76, 0x39, 0xe5, 0x30, 0xdf, 0x95, 0x05, 0x37, 0xa1, 0xae, 0xf9, 0x8d, + 0x27, 0xba, 0x09, 0x55, 0x4b, 0x5c, 0x3f, 0x67, 0xa6, 0x95, 0x17, 0x2b, 0x3e, 0xe6, 0x96, 0xd7, + 0xfd, 0xc2, 0xf4, 0xd4, 0xf5, 0xba, 0x09, 0xd5, 0x4c, 0xb2, 0x7f, 0x57, 0xda, 0x16, 0xb1, 0x42, + 0x93, 0x73, 0xae, 0x68, 0x94, 0x59, 0x11, 0x89, 0x4c, 0xb3, 0xa2, 0xde, 0xd0, 0xfc, 0x8b, 0x00, + 0x92, 0xce, 0xb2, 0xaf, 0x0e, 0x2b, 0xb9, 0x09, 0xf8, 0xbb, 0xb8, 0x77, 0x4d, 0x09, 0xa7, 0x20, + 0x43, 0xf0, 0x2a, 0xd4, 0x70, 0xba, 0x2c, 0x16, 0xa5, 0xee, 0xab, 0x74, 0xbb, 0x40, 0x36, 0xe0, + 0xdc, 0x7d, 0x1a, 0x89, 0x35, 0xce, 0xa6, 0x61, 0x14, 0xb8, 0x8d, 0xa8, 0xeb, 0xad, 0xa2, 0x3c, + 0x9b, 0x64, 0xd0, 0xec, 0xbe, 0xc3, 0xf8, 0xd5, 0xb2, 0xf9, 0x75, 0xa5, 0xeb, 0xe2, 0x41, 0x2b, + 0xae, 0x2a, 0x4e, 0xd3, 0xc4, 0xfc, 0x29, 0x3e, 0xcc, 0x1d, 0x74, 0xf2, 0x49, 0x4b, 0x71, 0x5c, + 0x13, 0x71, 0xda, 0xba, 0x09, 0x43, 0x9c, 0x28, 0x77, 0x43, 0x1d, 0xd7, 0x69, 0xc8, 0x1d, 0x18, + 0x55, 0x1e, 0x36, 0xc4, 0x28, 0xca, 0x6d, 0xd7, 0x1d, 0x18, 0xe5, 0x47, 0xab, 0x93, 0x93, 0x7c, + 0x04, 0xa3, 0xca, 0x25, 0xe7, 0xd4, 0x3b, 0xfd, 0xa7, 0x30, 0xa1, 0x3b, 0xe7, 0x9c, 0x5e, 0x90, + 0xdf, 0xc7, 0xbb, 0x5f, 0x79, 0xc5, 0x92, 0x4f, 0x3f, 0x93, 0xc8, 0xe5, 0x25, 0x44, 0xca, 0x17, + 0x48, 0x09, 0xcc, 0x6d, 0xfe, 0xd9, 0x14, 0x35, 0xf9, 0x48, 0xbe, 0x97, 0x52, 0xc4, 0x69, 0xa4, + 0x2e, 0x32, 0x9b, 0xe4, 0x62, 0x7e, 0x11, 0x62, 0xb5, 0xc0, 0xf6, 0x6c, 0xf6, 0x49, 0xee, 0xa8, + 0x7b, 0x8b, 0x2e, 0x8f, 0xcb, 0x26, 0x6a, 0x69, 0xa9, 0x2c, 0x73, 0xf9, 0x8c, 0x2e, 0xe7, 0x27, + 0xa6, 0xc3, 0xc1, 0x78, 0x80, 0xa7, 0xc0, 0x54, 0x69, 0x6e, 0xf7, 0xba, 0x24, 0xba, 0x8b, 0x8f, + 0xbd, 0x69, 0x76, 0x5d, 0xc8, 0xba, 0x9d, 0xa2, 0xc5, 0x2b, 0xd0, 0x57, 0xc2, 0x6e, 0x55, 0xfa, + 0x38, 0x9e, 0xbc, 0xb3, 0xf9, 0x2d, 0xbb, 0x90, 0x71, 0x2b, 0xde, 0x73, 0x2c, 0xf2, 0xd8, 0xfd, + 0x0a, 0x6a, 0x87, 0x99, 0xe1, 0xbe, 0xf2, 0x99, 0x5d, 0xd7, 0x1c, 0x2b, 0x32, 0x29, 0xd5, 0xa6, + 0xf7, 0x04, 0x1f, 0xa2, 0x65, 0xe7, 0xe1, 0x7b, 0xa3, 0x07, 0x17, 0x29, 0x89, 0x37, 0x7b, 0xe2, + 0xa9, 0x3b, 0xd6, 0x0b, 0x7c, 0x87, 0xcd, 0xae, 0xaf, 0x47, 0x5e, 0xc1, 0x8c, 0x6b, 0x6f, 0xe5, + 0x40, 0x9a, 0xcd, 0xd0, 0x74, 0x20, 0xed, 0xda, 0x87, 0x3c, 0xf1, 0x7f, 0x0e, 0x95, 0xd8, 0x7b, + 0xe4, 0x74, 0x83, 0x90, 0xef, 0xb7, 0x48, 0x52, 0x92, 0x0a, 0x49, 0xb7, 0x44, 0x3b, 0x73, 0x57, + 0xf3, 0x24, 0x1c, 0x6a, 0x6e, 0x49, 0xc2, 0xef, 0x2d, 0x91, 0x91, 0x32, 0x2f, 0xb7, 0x65, 0x17, + 0x3b, 0xac, 0x78, 0x99, 0xf7, 0x4a, 0x18, 0xa5, 0x47, 0xfb, 0xf4, 0x8c, 0x94, 0x73, 0x47, 0x82, + 0x91, 0xd5, 0x65, 0x78, 0x4f, 0xe3, 0xbb, 0x96, 0x1c, 0x8a, 0xd3, 0x0e, 0xa8, 0x13, 0xbf, 0x46, + 0x4b, 0x44, 0x07, 0xd4, 0x5f, 0x00, 0xa7, 0x8b, 0x92, 0x4f, 0xa9, 0xb2, 0x30, 0x94, 0x47, 0x55, + 0x59, 0x56, 0xc1, 0xe0, 0xec, 0x28, 0xe2, 0x07, 0x6e, 0xf4, 0x7c, 0xd1, 0x5e, 0x8b, 0xcd, 0x0a, + 0x7a, 0x81, 0xe4, 0x0d, 0xb2, 0xd0, 0x5e, 0x23, 0x5f, 0xe1, 0x52, 0x22, 0xd8, 0x2f, 0xf8, 0x7e, + 0x14, 0x46, 0x81, 0xd3, 0xae, 0x35, 0x02, 0xb7, 0x1d, 0xe5, 0x76, 0x3a, 0x76, 0xf1, 0xce, 0x22, + 0xd3, 0x3c, 0x4e, 0x45, 0xf4, 0xf8, 0xac, 0xf8, 0x3a, 0xea, 0xd5, 0x4d, 0x56, 0x61, 0x97, 0x93, + 0x4b, 0x4d, 0xc6, 0x8b, 0x7f, 0x95, 0x4c, 0xeb, 0x30, 0x9b, 0x13, 0x95, 0x48, 0xdd, 0xde, 0x76, + 0x8f, 0x5a, 0x34, 0xd7, 0xbd, 0x62, 0xf2, 0x03, 0x98, 0xc9, 0x0c, 0x5b, 0xa4, 0x2c, 0xd0, 0xdd, + 0x82, 0x1a, 0xf5, 0x62, 0xfe, 0x04, 0xca, 0xfc, 0xbd, 0x07, 0xba, 0x35, 0x1b, 0x11, 0x6c, 0xe2, + 0x57, 0x40, 0x39, 0x08, 0xc9, 0xf5, 0x3a, 0x1f, 0x4f, 0x3d, 0x69, 0x9f, 0xc6, 0xd0, 0x25, 0x89, + 0x84, 0xe7, 0xea, 0xc3, 0xcb, 0x2a, 0xec, 0xf6, 0xd4, 0x68, 0x0b, 0x66, 0x76, 0x69, 0xe0, 0x3e, + 0x7e, 0x9e, 0x64, 0x28, 0x25, 0x93, 0x59, 0xda, 0x8d, 0xe3, 0x17, 0x30, 0xbb, 0xe8, 0x1f, 0xb6, + 0xc5, 0xa3, 0x3e, 0x83, 0xa7, 0xba, 0x8a, 0xcf, 0x2e, 0xef, 0xed, 0x08, 0x35, 0x97, 0x9f, 0x9a, + 0x5e, 0xf9, 0xbf, 0xf5, 0xcc, 0x5e, 0xaf, 0x9e, 0xa6, 0x99, 0xf4, 0xdb, 0x38, 0x09, 0xb3, 0x72, + 0xd5, 0xeb, 0x93, 0xb0, 0x4b, 0x2e, 0xfb, 0x9c, 0x27, 0x62, 0xb3, 0x39, 0xe9, 0xe9, 0xbb, 0x70, + 0x3d, 0x41, 0x6b, 0x37, 0xe4, 0xde, 0x62, 0x26, 0xf2, 0x4e, 0xf8, 0x54, 0x67, 0x66, 0xf9, 0xce, + 0x6c, 0xa7, 0x16, 0xbb, 0xa1, 0xd5, 0xea, 0xa2, 0x62, 0x11, 0x3d, 0x78, 0x03, 0xc3, 0x44, 0x23, + 0xfe, 0x84, 0x4e, 0xdb, 0x6d, 0xb5, 0x4e, 0x11, 0xa3, 0x52, 0xfb, 0x21, 0x8c, 0xd7, 0xf4, 0xca, + 0x33, 0x2a, 0xc9, 0x9d, 0x14, 0xea, 0x91, 0x50, 0xef, 0xb6, 0x77, 0x71, 0x24, 0x55, 0x1b, 0xcf, + 0x89, 0x7a, 0x91, 0xeb, 0x3a, 0x63, 0x64, 0x65, 0x53, 0xbb, 0x40, 0x56, 0xd2, 0x44, 0xe5, 0x3a, + 0x93, 0x9d, 0xc8, 0xad, 0xce, 0xf3, 0xc8, 0x24, 0x73, 0x62, 0x12, 0xab, 0x77, 0xf2, 0x59, 0xe5, + 0x32, 0xdf, 0x35, 0xa9, 0x26, 0xf7, 0xf3, 0x89, 0xf3, 0xd0, 0xe9, 0x7e, 0x3e, 0xa9, 0xec, 0x76, + 0xba, 0x9f, 0x4f, 0x46, 0xea, 0xba, 0x65, 0xe4, 0x15, 0x27, 0xe0, 0xe9, 0x62, 0x8c, 0x50, 0x6c, + 0x32, 0xf2, 0xfc, 0x3c, 0xd4, 0x43, 0x80, 0xf0, 0xb4, 0x3d, 0x5d, 0x6c, 0xad, 0xc9, 0xd0, 0x1f, + 0x89, 0x3c, 0x3f, 0xf7, 0xa0, 0xc4, 0x33, 0x18, 0xc4, 0x51, 0x13, 0x63, 0xbf, 0xc1, 0x74, 0x62, + 0x85, 0x2e, 0x83, 0x5a, 0x4a, 0xc6, 0x9b, 0x53, 0x26, 0xb3, 0x9c, 0x40, 0x74, 0x5d, 0xa6, 0x2a, + 0xc4, 0x51, 0xe5, 0x94, 0x61, 0x2a, 0x15, 0x68, 0x6e, 0xee, 0x7c, 0x46, 0x89, 0x52, 0x29, 0xc7, + 0xf5, 0x18, 0x74, 0xaa, 0x4b, 0x19, 0x81, 0xe9, 0xe6, 0x2e, 0x64, 0x96, 0x09, 0x46, 0x11, 0xcf, + 0xbf, 0x9c, 0x9d, 0x35, 0x3a, 0x7e, 0xe7, 0xd5, 0x05, 0x47, 0x56, 0x73, 0xe3, 0x24, 0xa8, 0xa2, + 0x56, 0xaa, 0xd2, 0x0f, 0x65, 0xa4, 0xaa, 0x7e, 0x33, 0xe3, 0x3d, 0x86, 0x81, 0x11, 0x7b, 0x83, + 0x75, 0xcf, 0x9b, 0x4d, 0x1e, 0xc9, 0x74, 0x30, 0x39, 0x35, 0xf5, 0x62, 0x90, 0x3b, 0x82, 0x8f, + 0x64, 0x02, 0x98, 0x57, 0xcd, 0x78, 0x0f, 0x2e, 0x26, 0x9e, 0x7b, 0x98, 0x8c, 0x6f, 0x64, 0xbf, + 0x09, 0xc9, 0x14, 0x4f, 0xbe, 0xce, 0x7e, 0x25, 0xfd, 0x36, 0x24, 0x31, 0xee, 0xa7, 0x5d, 0xf3, + 0xd6, 0x61, 0x12, 0x97, 0x19, 0x99, 0x74, 0x3d, 0x8e, 0x40, 0x63, 0x82, 0x93, 0xa1, 0x90, 0x92, + 0xa5, 0xca, 0x65, 0x76, 0x5c, 0xbc, 0x19, 0xe6, 0x29, 0xdc, 0xe7, 0xcc, 0x87, 0xc4, 0x08, 0xcc, + 0xda, 0xc5, 0x44, 0x66, 0x78, 0xf2, 0x7d, 0x38, 0x13, 0x3f, 0x25, 0xe6, 0x2c, 0x32, 0xd0, 0xba, + 0x18, 0xca, 0xce, 0xc4, 0xef, 0x89, 0x4f, 0x4f, 0xbe, 0x22, 0xb7, 0xa2, 0x98, 0xfc, 0x52, 0xea, + 0x99, 0x8c, 0xd1, 0x87, 0x93, 0xec, 0x48, 0x9a, 0x6c, 0x4f, 0x3b, 0x3a, 0x0d, 0xfc, 0xdc, 0xb2, + 0x83, 0x2b, 0xea, 0x9f, 0x5b, 0xd7, 0x00, 0x90, 0x4a, 0xfd, 0xcd, 0xe1, 0xb3, 0x0e, 0xd7, 0x30, + 0x20, 0xcb, 0x16, 0x0f, 0xc1, 0x97, 0x8d, 0x95, 0xdf, 0xf6, 0x64, 0x18, 0x97, 0x16, 0x5c, 0xed, + 0x19, 0x5d, 0x92, 0xdc, 0x32, 0x5c, 0x5c, 0x7a, 0xc7, 0xa1, 0xec, 0xf6, 0x34, 0x2d, 0x2b, 0x48, + 0xa3, 0xda, 0x67, 0xbb, 0xc4, 0x8b, 0x54, 0xfb, 0x6c, 0xd7, 0x28, 0x8f, 0x5f, 0x60, 0x8e, 0x25, + 0xb1, 0x47, 0x61, 0x90, 0x25, 0xea, 0xf1, 0xb0, 0xd3, 0x5d, 0xaf, 0x7d, 0xae, 0x9a, 0x97, 0xa2, + 0x29, 0xc2, 0xdd, 0x3b, 0x64, 0x57, 0xbf, 0xb2, 0xad, 0x76, 0x22, 0x5f, 0x9d, 0xcb, 0x4e, 0x71, + 0x65, 0x9b, 0xa4, 0xdb, 0xbd, 0x23, 0x2c, 0x8c, 0x71, 0x81, 0x0c, 0x7a, 0x99, 0xc7, 0x71, 0x2e, + 0xbe, 0xc1, 0x33, 0x29, 0xf0, 0xdc, 0x75, 0x59, 0x70, 0xcf, 0x13, 0x40, 0xef, 0x8e, 0x76, 0x71, + 0xff, 0xbe, 0xcc, 0x3f, 0x92, 0x53, 0x4b, 0x37, 0x07, 0xbe, 0xb0, 0xf4, 0xb3, 0xff, 0x74, 0xb9, + 0xf0, 0xb3, 0x9f, 0x5f, 0x2e, 0xfc, 0xbb, 0x9f, 0x5f, 0x2e, 0xfc, 0xc7, 0x9f, 0x5f, 0x2e, 0x7c, + 0x35, 0x7f, 0xb2, 0x00, 0xcd, 0x8d, 0x96, 0x4b, 0xbd, 0xe8, 0x16, 0x67, 0x37, 0x84, 0xff, 0xdd, + 0xfd, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x76, 0x70, 0x29, 0x1d, 0x2a, 0xe9, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -17214,6 +17216,10 @@ type AuthServiceClient interface { ExportUpgradeWindows(ctx context.Context, in *ExportUpgradeWindowsRequest, opts ...grpc.CallOption) (*ExportUpgradeWindowsResponse, error) // GetClusterMaintenanceConfig gets the current maintenance window config singleton. GetClusterMaintenanceConfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.ClusterMaintenanceConfigV1, error) + // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. + GetClusterAutoUpdateConfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.ClusterAutoUpdateConfigV1, error) + // GetAutoUpdateVersion gets the current autoupdate version singleton. + GetAutoUpdateVersion(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.AutoUpdateVersionV1, error) // UpdateClusterMaintenanceConfig updates the current maintenance window config singleton. UpdateClusterMaintenanceConfig(ctx context.Context, in *types.ClusterMaintenanceConfigV1, opts ...grpc.CallOption) (*emptypb.Empty, error) // DeleteClusterMaintenanceConfig deletes the current maintenance window config singleton. @@ -19932,6 +19938,24 @@ func (c *authServiceClient) GetClusterMaintenanceConfig(ctx context.Context, in return out, nil } +func (c *authServiceClient) GetClusterAutoUpdateConfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.ClusterAutoUpdateConfigV1, error) { + out := new(types.ClusterAutoUpdateConfigV1) + err := c.cc.Invoke(ctx, "/proto.AuthService/GetClusterAutoUpdateConfig", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *authServiceClient) GetAutoUpdateVersion(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.AutoUpdateVersionV1, error) { + out := new(types.AutoUpdateVersionV1) + err := c.cc.Invoke(ctx, "/proto.AuthService/GetAutoUpdateVersion", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *authServiceClient) UpdateClusterMaintenanceConfig(ctx context.Context, in *types.ClusterMaintenanceConfigV1, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/proto.AuthService/UpdateClusterMaintenanceConfig", in, out, opts...) @@ -20612,6 +20636,10 @@ type AuthServiceServer interface { ExportUpgradeWindows(context.Context, *ExportUpgradeWindowsRequest) (*ExportUpgradeWindowsResponse, error) // GetClusterMaintenanceConfig gets the current maintenance window config singleton. GetClusterMaintenanceConfig(context.Context, *emptypb.Empty) (*types.ClusterMaintenanceConfigV1, error) + // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. + GetClusterAutoUpdateConfig(context.Context, *emptypb.Empty) (*types.ClusterAutoUpdateConfigV1, error) + // GetAutoUpdateVersion gets the current autoupdate version singleton. + GetAutoUpdateVersion(context.Context, *emptypb.Empty) (*types.AutoUpdateVersionV1, error) // UpdateClusterMaintenanceConfig updates the current maintenance window config singleton. UpdateClusterMaintenanceConfig(context.Context, *types.ClusterMaintenanceConfigV1) (*emptypb.Empty, error) // DeleteClusterMaintenanceConfig deletes the current maintenance window config singleton. @@ -21387,6 +21415,12 @@ func (*UnimplementedAuthServiceServer) ExportUpgradeWindows(ctx context.Context, func (*UnimplementedAuthServiceServer) GetClusterMaintenanceConfig(ctx context.Context, req *emptypb.Empty) (*types.ClusterMaintenanceConfigV1, error) { return nil, status.Errorf(codes.Unimplemented, "method GetClusterMaintenanceConfig not implemented") } +func (*UnimplementedAuthServiceServer) GetClusterAutoUpdateConfig(ctx context.Context, req *emptypb.Empty) (*types.ClusterAutoUpdateConfigV1, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetClusterAutoUpdateConfig not implemented") +} +func (*UnimplementedAuthServiceServer) GetAutoUpdateVersion(ctx context.Context, req *emptypb.Empty) (*types.AutoUpdateVersionV1, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAutoUpdateVersion not implemented") +} func (*UnimplementedAuthServiceServer) UpdateClusterMaintenanceConfig(ctx context.Context, req *types.ClusterMaintenanceConfigV1) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateClusterMaintenanceConfig not implemented") } @@ -26074,6 +26108,42 @@ func _AuthService_GetClusterMaintenanceConfig_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } +func _AuthService_GetClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).GetClusterAutoUpdateConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.AuthService/GetClusterAutoUpdateConfig", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).GetClusterAutoUpdateConfig(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _AuthService_GetAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AuthServiceServer).GetAutoUpdateVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.AuthService/GetAutoUpdateVersion", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AuthServiceServer).GetAutoUpdateVersion(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _AuthService_UpdateClusterMaintenanceConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(types.ClusterMaintenanceConfigV1) if err := dec(in); err != nil { @@ -27066,6 +27136,14 @@ var _AuthService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetClusterMaintenanceConfig", Handler: _AuthService_GetClusterMaintenanceConfig_Handler, }, + { + MethodName: "GetClusterAutoUpdateConfig", + Handler: _AuthService_GetClusterAutoUpdateConfig_Handler, + }, + { + MethodName: "GetAutoUpdateVersion", + Handler: _AuthService_GetAutoUpdateVersion_Handler, + }, { MethodName: "UpdateClusterMaintenanceConfig", Handler: _AuthService_UpdateClusterMaintenanceConfig_Handler, diff --git a/api/client/webclient/webclient.go b/api/client/webclient/webclient.go index 858ef4b347da3..5a48627edd234 100644 --- a/api/client/webclient/webclient.go +++ b/api/client/webclient/webclient.go @@ -297,6 +297,10 @@ type PingResponse struct { ServerVersion string `json:"server_version"` // MinClientVersion is the minimum client version required by the server. MinClientVersion string `json:"min_client_version"` + // ToolsVersion defines the version of {tsh, tctl} for client auto-upgrade. + ToolsVersion string `json:"tools_version"` + // ToolsAutoUpdate enables client autoupdate feature. + ToolsAutoUpdate bool `json:"tools_auto_update"` // ClusterName contains the name of the Teleport cluster. ClusterName string `json:"cluster_name"` diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 80333403685a0..018852304f76e 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -3514,6 +3514,12 @@ service AuthService { // GetClusterMaintenanceConfig gets the current maintenance window config singleton. rpc GetClusterMaintenanceConfig(google.protobuf.Empty) returns (types.ClusterMaintenanceConfigV1); + // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. + rpc GetClusterAutoUpdateConfig(google.protobuf.Empty) returns (types.ClusterAutoUpdateConfigV1); + + // GetAutoUpdateVersion gets the current autoupdate version singleton. + rpc GetAutoUpdateVersion(google.protobuf.Empty) returns (types.AutoUpdateVersionV1); + // UpdateClusterMaintenanceConfig updates the current maintenance window config singleton. rpc UpdateClusterMaintenanceConfig(types.ClusterMaintenanceConfigV1) returns (google.protobuf.Empty); diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 9f93a5bf9ce2e..05e7ecc842a35 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -6624,6 +6624,52 @@ message AgentUpgradeWindow { repeated string Weekdays = 2 [(gogoproto.jsontag) = "weekdays,omitempty"]; } +// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster +// autoupdate settings. +message ClusterAutoUpdateConfigV1 { + ResourceHeader Header = 1 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "", + (gogoproto.embed) = true + ]; + ClusterAutoUpdateConfigSpecV1 Spec = 2 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "spec" + ]; + // Nonce is used to protect against concurrent modification of the maintenance + // window. Clients should treat nonces as opaque. + uint64 Nonce = 3 [(gogoproto.jsontag) = "nonce,omitempty"]; +} + +// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. +message ClusterAutoUpdateConfigSpecV1 { + // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. + bool ToolsAutoUpdate = 1 [(gogoproto.jsontag) = "tools_auto_update,omitempty"]; +} + +// AutoupdateVersionV1 is a resource singleton with version required for +// tools autoupdate. +message AutoUpdateVersionV1 { + ResourceHeader Header = 1 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "", + (gogoproto.embed) = true + ]; + AutoupdateVersionSpecV1 Spec = 2 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "spec" + ]; + // Nonce is used to protect against concurrent modification of the maintenance + // window. Clients should treat nonces as opaque. + uint64 Nonce = 3 [(gogoproto.jsontag) = "nonce,omitempty"]; +} + +// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. +message AutoupdateVersionSpecV1 { + // ToolsVersion is the semantic version required for tools autoupdates. + string ToolsVersion = 1 [(gogoproto.jsontag) = "tools_version,omitempty"]; +} + // ScheduledAgentUpgradeWindow is a derived value representing a single // upgrade window. Upgraders deal with discrete start/end times, so we use the // agent upgrade window configuration object to generate a sequence of specific diff --git a/api/types/autoupdate_config.go b/api/types/autoupdate_config.go new file mode 100644 index 0000000000000..337df71b70e72 --- /dev/null +++ b/api/types/autoupdate_config.go @@ -0,0 +1,134 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package types + +import ( + "time" + + "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/trace" +) + +// ClusterAutoUpdateConfig defines configuration of auto updates for tools and agents +type ClusterAutoUpdateConfig interface { + // Resource provides common resource properties. + Resource + // SetToolsAutoUpdate enables/disables tools autoupdate in the cluster. + SetToolsAutoUpdate(bool) + // GetToolsAutoUpdate gets feature flag if autoupdate is enabled in the cluster. + GetToolsAutoUpdate() bool + // Clone performs a deep copy. + Clone() ClusterAutoUpdateConfig +} + +// NewClusterAutoUpdateConfig is a convenience wrapper to create a ClusterAutoupdateConfigV1 resource. +func NewClusterAutoUpdateConfig(spec ClusterAutoUpdateConfigSpecV1) (ClusterAutoUpdateConfig, error) { + resource := &ClusterAutoUpdateConfigV1{Spec: spec} + if err := resource.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return resource, nil +} + +// GetVersion returns resource version +func (c *ClusterAutoUpdateConfigV1) GetVersion() string { + return c.Version +} + +// GetKind returns resource kind +func (c *ClusterAutoUpdateConfigV1) GetKind() string { + return c.Kind +} + +// GetSubKind returns resource sub kind +func (c *ClusterAutoUpdateConfigV1) GetSubKind() string { + return c.SubKind +} + +// SetSubKind sets resource subkind +func (c *ClusterAutoUpdateConfigV1) SetSubKind(sk string) { + c.SubKind = sk +} + +// GetRevision returns the revision +func (c *ClusterAutoUpdateConfigV1) GetRevision() string { + return c.Metadata.GetRevision() +} + +// SetRevision sets the revision +func (c *ClusterAutoUpdateConfigV1) SetRevision(rev string) { + c.Metadata.SetRevision(rev) +} + +// GetName returns the name of the cluster autoupdate config. +func (c *ClusterAutoUpdateConfigV1) GetName() string { + return c.Metadata.Name +} + +// SetName sets the name of the cluster autoupdate config. +func (c *ClusterAutoUpdateConfigV1) SetName(e string) { + c.Metadata.Name = e +} + +// Expiry returns object expiry setting +func (c *ClusterAutoUpdateConfigV1) Expiry() time.Time { + return c.Metadata.Expiry() +} + +// SetExpiry sets expiry time for the object +func (c *ClusterAutoUpdateConfigV1) SetExpiry(expires time.Time) { + c.Metadata.SetExpiry(expires) +} + +// GetMetadata returns object metadata +func (c *ClusterAutoUpdateConfigV1) GetMetadata() Metadata { + return c.Metadata +} + +// SetToolsAutoUpdate enables/disables tools autoupdate in the cluster. +func (c *ClusterAutoUpdateConfigV1) SetToolsAutoUpdate(flag bool) { + c.Spec.ToolsAutoUpdate = flag +} + +// GetToolsAutoUpdate gets feature flag if autoupdate is enabled in the cluster. +func (c *ClusterAutoUpdateConfigV1) GetToolsAutoUpdate() bool { + return c.Spec.ToolsAutoUpdate +} + +// Clone performs a deep copy. +func (c *ClusterAutoUpdateConfigV1) Clone() ClusterAutoUpdateConfig { + return utils.CloneProtoMsg(c) +} + +// setStaticFields sets static resource header and metadata fields. +func (c *ClusterAutoUpdateConfigV1) setStaticFields() { + c.Kind = KindClusterAutoUpdateConfig + c.Version = V1 + c.Metadata.Name = MetaNameClusterAutoUpdateConfig +} + +// CheckAndSetDefaults checks validity of all parameters and sets defaults. +func (c *ClusterAutoUpdateConfigV1) CheckAndSetDefaults() error { + c.setStaticFields() + if err := c.Metadata.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + + return nil +} diff --git a/api/types/autoupdate_version.go b/api/types/autoupdate_version.go new file mode 100644 index 0000000000000..a47ba2300ba1a --- /dev/null +++ b/api/types/autoupdate_version.go @@ -0,0 +1,138 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package types + +import ( + "github.com/gravitational/teleport/api/utils" + "time" + + "github.com/gravitational/trace" +) + +// AutoUpdateVersion defines resource for storing semantic version of auto updates. +type AutoUpdateVersion interface { + // Resource provides common resource properties. + Resource + // SetToolsVersion defines required version for tools autoupdate. + SetToolsVersion(string) + // GetToolsVersion gets last known required version for autoupdate. + GetToolsVersion() string + // Clone performs a deep copy. + Clone() AutoUpdateVersion +} + +// NewAutoUpdateVersion is a convenience wrapper to create a AutoupdateVersionV1 resource. +func NewAutoUpdateVersion(spec AutoupdateVersionSpecV1) (AutoUpdateVersion, error) { + resource := &AutoUpdateVersionV1{Spec: spec} + if err := resource.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return resource, nil +} + +// GetVersion returns resource version +func (c *AutoUpdateVersionV1) GetVersion() string { + return c.Version +} + +// GetKind returns resource kind +func (c *AutoUpdateVersionV1) GetKind() string { + return c.Kind +} + +// GetSubKind returns resource sub kind +func (c *AutoUpdateVersionV1) GetSubKind() string { + return c.SubKind +} + +// SetSubKind sets resource subkind +func (c *AutoUpdateVersionV1) SetSubKind(sk string) { + c.SubKind = sk +} + +// GetRevision returns the revision +func (c *AutoUpdateVersionV1) GetRevision() string { + return c.Metadata.GetRevision() +} + +// SetRevision sets the revision +func (c *AutoUpdateVersionV1) SetRevision(rev string) { + c.Metadata.SetRevision(rev) +} + +// GetName returns the name of the autoupdate version. +func (c *AutoUpdateVersionV1) GetName() string { + return c.Metadata.Name +} + +// SetName sets the name of the autoupdate version. +func (c *AutoUpdateVersionV1) SetName(e string) { + c.Metadata.Name = e +} + +// Expiry returns object expiry setting +func (c *AutoUpdateVersionV1) Expiry() time.Time { + return c.Metadata.Expiry() +} + +// SetExpiry sets expiry time for the object +func (c *AutoUpdateVersionV1) SetExpiry(expires time.Time) { + c.Metadata.SetExpiry(expires) +} + +// GetMetadata returns object metadata +func (c *AutoUpdateVersionV1) GetMetadata() Metadata { + return c.Metadata +} + +// SetToolsVersion defines required version for tools autoupdate. +func (c *AutoUpdateVersionV1) SetToolsVersion(version string) { + c.Spec.ToolsVersion = version +} + +// GetToolsVersion gets last known required version for autoupdate. +func (c *AutoUpdateVersionV1) GetToolsVersion() string { + return c.Spec.ToolsVersion +} + +// Clone performs a deep copy. +func (c *AutoUpdateVersionV1) Clone() AutoUpdateVersion { + return utils.CloneProtoMsg(c) +} + +// setStaticFields sets static resource header and metadata fields. +func (c *AutoUpdateVersionV1) setStaticFields() { + c.Kind = KindAutoUpdateVersion + c.Version = V1 + c.Metadata.Name = MetaNameAutoUpdateVersion +} + +// CheckAndSetDefaults checks validity of all parameters and sets defaults. +func (c *AutoUpdateVersionV1) CheckAndSetDefaults() error { + c.setStaticFields() + if err := c.Metadata.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + + if c.Spec.ToolsVersion == "" { + return trace.BadParameter("missing ToolsVersion field") + } + + return nil +} diff --git a/api/types/constants.go b/api/types/constants.go index 3c5ed81f4ace3..9d23c5a84a5b2 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -320,6 +320,18 @@ const ( // alternative to their individual resource kinds. KindClusterConfig = "cluster_config" + // KindClusterAutoUpdateConfig is the resource with cluster autoupdate configuration. + KindClusterAutoUpdateConfig = "cluster_autoupdate_config" + + // KindAutoUpdateVersion is the resource with cluster autoupdate versions. + KindAutoUpdateVersion = "autoupdate_version" + + // MetaNameClusterAutoUpdateConfig is the name of a configuration resource for cluster autoupdate config. + MetaNameClusterAutoUpdateConfig = "cluster-autoupdate-config" + + // MetaNameAutoUpdateVersion is the name of a resource for autoupdate version. + MetaNameAutoUpdateVersion = "autoupdate-version" + // KindClusterAuditConfig is the resource that holds cluster audit configuration. KindClusterAuditConfig = "cluster_audit_config" diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 9699275681cbd..a5ea423ab9d23 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1090,7 +1090,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314, 0} + return fileDescriptor_9198ee693835762e, []int{318, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1122,7 +1122,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315, 0} + return fileDescriptor_9198ee693835762e, []int{319, 0} } type KeepAlive struct { @@ -17624,6 +17624,182 @@ func (m *AgentUpgradeWindow) XXX_DiscardUnknown() { var xxx_messageInfo_AgentUpgradeWindow proto.InternalMessageInfo +// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster +// autoupdate settings. +type ClusterAutoUpdateConfigV1 struct { + ResourceHeader `protobuf:"bytes,1,opt,name=Header,proto3,embedded=Header" json:""` + Spec ClusterAutoUpdateConfigSpecV1 `protobuf:"bytes,2,opt,name=Spec,proto3" json:"spec"` + // Nonce is used to protect against concurrent modification of the maintenance + // window. Clients should treat nonces as opaque. + Nonce uint64 `protobuf:"varint,3,opt,name=Nonce,proto3" json:"nonce,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ClusterAutoUpdateConfigV1) Reset() { *m = ClusterAutoUpdateConfigV1{} } +func (m *ClusterAutoUpdateConfigV1) String() string { return proto.CompactTextString(m) } +func (*ClusterAutoUpdateConfigV1) ProtoMessage() {} +func (*ClusterAutoUpdateConfigV1) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{305} +} +func (m *ClusterAutoUpdateConfigV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ClusterAutoUpdateConfigV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ClusterAutoUpdateConfigV1.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 *ClusterAutoUpdateConfigV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClusterAutoUpdateConfigV1.Merge(m, src) +} +func (m *ClusterAutoUpdateConfigV1) XXX_Size() int { + return m.Size() +} +func (m *ClusterAutoUpdateConfigV1) XXX_DiscardUnknown() { + xxx_messageInfo_ClusterAutoUpdateConfigV1.DiscardUnknown(m) +} + +var xxx_messageInfo_ClusterAutoUpdateConfigV1 proto.InternalMessageInfo + +// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. +type ClusterAutoUpdateConfigSpecV1 struct { + // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. + ToolsAutoUpdate bool `protobuf:"varint,1,opt,name=ToolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ClusterAutoUpdateConfigSpecV1) Reset() { *m = ClusterAutoUpdateConfigSpecV1{} } +func (m *ClusterAutoUpdateConfigSpecV1) String() string { return proto.CompactTextString(m) } +func (*ClusterAutoUpdateConfigSpecV1) ProtoMessage() {} +func (*ClusterAutoUpdateConfigSpecV1) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{306} +} +func (m *ClusterAutoUpdateConfigSpecV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ClusterAutoUpdateConfigSpecV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ClusterAutoUpdateConfigSpecV1.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 *ClusterAutoUpdateConfigSpecV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClusterAutoUpdateConfigSpecV1.Merge(m, src) +} +func (m *ClusterAutoUpdateConfigSpecV1) XXX_Size() int { + return m.Size() +} +func (m *ClusterAutoUpdateConfigSpecV1) XXX_DiscardUnknown() { + xxx_messageInfo_ClusterAutoUpdateConfigSpecV1.DiscardUnknown(m) +} + +var xxx_messageInfo_ClusterAutoUpdateConfigSpecV1 proto.InternalMessageInfo + +// AutoupdateVersionV1 is a resource singleton with version required for +// tools autoupdate. +type AutoUpdateVersionV1 struct { + ResourceHeader `protobuf:"bytes,1,opt,name=Header,proto3,embedded=Header" json:""` + Spec AutoupdateVersionSpecV1 `protobuf:"bytes,2,opt,name=Spec,proto3" json:"spec"` + // Nonce is used to protect against concurrent modification of the maintenance + // window. Clients should treat nonces as opaque. + Nonce uint64 `protobuf:"varint,3,opt,name=Nonce,proto3" json:"nonce,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AutoUpdateVersionV1) Reset() { *m = AutoUpdateVersionV1{} } +func (m *AutoUpdateVersionV1) String() string { return proto.CompactTextString(m) } +func (*AutoUpdateVersionV1) ProtoMessage() {} +func (*AutoUpdateVersionV1) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{307} +} +func (m *AutoUpdateVersionV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AutoUpdateVersionV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AutoUpdateVersionV1.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 *AutoUpdateVersionV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_AutoUpdateVersionV1.Merge(m, src) +} +func (m *AutoUpdateVersionV1) XXX_Size() int { + return m.Size() +} +func (m *AutoUpdateVersionV1) XXX_DiscardUnknown() { + xxx_messageInfo_AutoUpdateVersionV1.DiscardUnknown(m) +} + +var xxx_messageInfo_AutoUpdateVersionV1 proto.InternalMessageInfo + +// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. +type AutoupdateVersionSpecV1 struct { + // ToolsVersion is the semantic version required for tools autoupdates. + ToolsVersion string `protobuf:"bytes,1,opt,name=ToolsVersion,proto3" json:"tools_version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AutoupdateVersionSpecV1) Reset() { *m = AutoupdateVersionSpecV1{} } +func (m *AutoupdateVersionSpecV1) String() string { return proto.CompactTextString(m) } +func (*AutoupdateVersionSpecV1) ProtoMessage() {} +func (*AutoupdateVersionSpecV1) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{308} +} +func (m *AutoupdateVersionSpecV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AutoupdateVersionSpecV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AutoupdateVersionSpecV1.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 *AutoupdateVersionSpecV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_AutoupdateVersionSpecV1.Merge(m, src) +} +func (m *AutoupdateVersionSpecV1) XXX_Size() int { + return m.Size() +} +func (m *AutoupdateVersionSpecV1) XXX_DiscardUnknown() { + xxx_messageInfo_AutoupdateVersionSpecV1.DiscardUnknown(m) +} + +var xxx_messageInfo_AutoupdateVersionSpecV1 proto.InternalMessageInfo + // ScheduledAgentUpgradeWindow is a derived value representing a single // upgrade window. Upgraders deal with discrete start/end times, so we use the // agent upgrade window configuration object to generate a sequence of specific @@ -17642,7 +17818,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{305} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17685,7 +17861,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{306} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17728,7 +17904,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17770,7 +17946,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{308} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17814,7 +17990,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{309} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17858,7 +18034,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{310} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17901,7 +18077,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17949,7 +18125,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{312} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17992,7 +18168,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18046,7 +18222,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{314} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18090,7 +18266,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{315} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18135,7 +18311,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{316} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18180,7 +18356,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{317} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18280,7 +18456,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{318} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18326,7 +18502,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{319} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18378,7 +18554,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{320} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18435,7 +18611,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{321} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18485,7 +18661,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{322} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18526,7 +18702,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{323} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18576,7 +18752,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{324} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18618,7 +18794,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{325} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18695,7 +18871,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{326} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18760,7 +18936,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{327} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18817,7 +18993,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{328} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18881,7 +19057,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{329} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18926,7 +19102,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{330} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18988,7 +19164,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{331} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19031,7 +19207,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{332} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19074,7 +19250,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{333} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19128,7 +19304,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{334} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19183,7 +19359,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{335} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19229,7 +19405,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{336} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19271,7 +19447,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{337} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19313,7 +19489,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{338} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19359,7 +19535,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{339} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19749,6 +19925,10 @@ func init() { proto.RegisterType((*ClusterMaintenanceConfigV1)(nil), "types.ClusterMaintenanceConfigV1") proto.RegisterType((*ClusterMaintenanceConfigSpecV1)(nil), "types.ClusterMaintenanceConfigSpecV1") proto.RegisterType((*AgentUpgradeWindow)(nil), "types.AgentUpgradeWindow") + proto.RegisterType((*ClusterAutoUpdateConfigV1)(nil), "types.ClusterAutoUpdateConfigV1") + proto.RegisterType((*ClusterAutoUpdateConfigSpecV1)(nil), "types.ClusterAutoUpdateConfigSpecV1") + proto.RegisterType((*AutoUpdateVersionV1)(nil), "types.AutoUpdateVersionV1") + proto.RegisterType((*AutoupdateVersionSpecV1)(nil), "types.AutoupdateVersionSpecV1") proto.RegisterType((*ScheduledAgentUpgradeWindow)(nil), "types.ScheduledAgentUpgradeWindow") proto.RegisterType((*AgentUpgradeSchedule)(nil), "types.AgentUpgradeSchedule") proto.RegisterType((*UserGroupV1)(nil), "types.UserGroupV1") @@ -19792,7 +19972,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 27248 bytes of a gzipped FileDescriptorProto + // 27355 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6d, 0x70, 0x1c, 0x49, 0x76, 0x20, 0x36, 0xdd, 0x8d, 0x8f, 0xc6, 0xc3, 0x57, 0x23, 0x01, 0x92, 0x20, 0x66, 0x38, 0xe0, 0x14, 0x67, 0x38, 0xe4, 0x7c, 0x90, 0x4b, 0x70, 0x87, 0xbb, 0xb3, 0xf3, 0xd9, 0x40, 0x83, 0x44, @@ -21272,230 +21452,237 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x9e, 0xa3, 0x81, 0x6d, 0x60, 0x3f, 0xae, 0xe3, 0xdf, 0x64, 0x51, 0x0a, 0xdb, 0x42, 0xea, 0xbd, 0x13, 0xfc, 0xcf, 0x2a, 0x03, 0x54, 0x1b, 0x9b, 0x77, 0x3a, 0x3c, 0x6b, 0xea, 0x55, 0x18, 0x62, 0xcd, 0x4a, 0x4c, 0x46, 0x36, 0x1d, 0xca, 0xb7, 0xd7, 0x05, 0x12, 0x6f, 0x55, 0xe8, 0xb6, 0x9a, - 0x36, 0x22, 0xff, 0x4b, 0xea, 0xae, 0xee, 0xb7, 0x6d, 0xeb, 0x8a, 0x87, 0x94, 0xec, 0xd8, 0x47, - 0xfe, 0xa0, 0x6f, 0xd3, 0xc4, 0x75, 0x12, 0x27, 0xd5, 0x92, 0xb4, 0x51, 0xdb, 0xb4, 0x69, 0xd6, - 0x8f, 0x74, 0xeb, 0x5a, 0x5a, 0xa2, 0x2c, 0xd6, 0x12, 0xa9, 0x92, 0x94, 0xdd, 0xf4, 0x63, 0x84, - 0x6a, 0x31, 0x36, 0x57, 0x99, 0x52, 0x25, 0xaa, 0x69, 0xfa, 0xb2, 0xed, 0xa5, 0x0f, 0x1b, 0xba, - 0x8f, 0x62, 0x0f, 0xc3, 0x36, 0x60, 0x18, 0xd0, 0xff, 0x62, 0xff, 0x40, 0x81, 0xa2, 0x40, 0x1f, - 0xf6, 0xb4, 0x01, 0xc5, 0x16, 0x60, 0x2f, 0x7b, 0x1d, 0xf6, 0xd2, 0xa7, 0xe1, 0x7e, 0x91, 0x97, - 0xa4, 0xa4, 0xda, 0x49, 0xba, 0xa1, 0x6f, 0xd2, 0xbd, 0xe7, 0x5c, 0x5e, 0xf2, 0x7e, 0x9d, 0x73, - 0xcf, 0x39, 0xbf, 0x53, 0xdc, 0x81, 0xa5, 0x24, 0x05, 0xd2, 0x92, 0x38, 0x5b, 0x85, 0xa7, 0x15, - 0xd6, 0xd2, 0x46, 0xaf, 0x47, 0x5d, 0x44, 0x37, 0x1e, 0xfa, 0xeb, 0x97, 0xe7, 0x00, 0xff, 0xa5, - 0x3c, 0xe3, 0x70, 0xb8, 0x8a, 0xbf, 0x94, 0xe1, 0x44, 0x1c, 0x6a, 0xc6, 0x97, 0xc4, 0xb7, 0x36, - 0xee, 0x41, 0x4d, 0xf8, 0xe5, 0x73, 0x89, 0x29, 0xfb, 0x82, 0x53, 0xdc, 0x81, 0x37, 0x61, 0x75, - 0x12, 0x3d, 0x7a, 0x2c, 0x93, 0x8a, 0x9d, 0xe1, 0x30, 0x44, 0x39, 0xdb, 0x85, 0xcc, 0xec, 0x9f, - 0x4b, 0xb0, 0xc6, 0x1c, 0x1b, 0x1b, 0x6d, 0x3f, 0x08, 0xbd, 0xa0, 0x1d, 0xec, 0x7a, 0xf7, 0x27, - 0x6e, 0x67, 0x33, 0xb1, 0x2d, 0x5d, 0x4c, 0xfa, 0xaf, 0x66, 0x9e, 0x36, 0xf9, 0x6d, 0xd1, 0x65, - 0x82, 0xb8, 0xb1, 0x4b, 0x27, 0x6f, 0x9e, 0xc6, 0x49, 0x06, 0xb8, 0x40, 0x8c, 0x93, 0x24, 0x14, - 0xc5, 0x1f, 0xc3, 0xfa, 0xf4, 0x07, 0xa0, 0xb7, 0x60, 0x91, 0xa0, 0xd4, 0xb7, 0xfa, 0x7b, 0x83, - 0x76, 0xc7, 0xe3, 0x77, 0x5a, 0xfc, 0x4a, 0x51, 0xac, 0xa3, 0x28, 0x23, 0x2c, 0x6e, 0x6f, 0x8f, - 0xe0, 0xdf, 0x33, 0xa6, 0x84, 0xf7, 0xb0, 0xd8, 0x5a, 0xf1, 0x27, 0x12, 0xa0, 0x6c, 0x1b, 0xe8, - 0x59, 0x58, 0x68, 0x39, 0x65, 0x3b, 0x6c, 0x0f, 0xc2, 0x5a, 0x6f, 0x34, 0x60, 0xe8, 0x1d, 0x34, - 0x8c, 0x2b, 0xdc, 0xc5, 0x3b, 0xc3, 0x20, 0x74, 0xf7, 0x7b, 0xa3, 0x81, 0x95, 0xa0, 0x23, 0x50, - 0xf8, 0x9e, 0xf7, 0x4e, 0xa7, 0x7d, 0x3b, 0x09, 0x85, 0xcf, 0xca, 0x12, 0x50, 0xf8, 0xac, 0xac, - 0xf8, 0x89, 0x04, 0xa7, 0xb9, 0xc7, 0x43, 0x67, 0x4c, 0x5f, 0xca, 0x24, 0x58, 0x79, 0xc0, 0xd1, - 0xcb, 0xa6, 0xc9, 0xa6, 0x2b, 0x3c, 0x9e, 0x9f, 0x74, 0x90, 0x08, 0xa9, 0x94, 0x17, 0xbd, 0x0c, - 0x79, 0x3b, 0xec, 0xf5, 0x0f, 0x11, 0xd0, 0xaf, 0x44, 0x23, 0x1a, 0xf6, 0xfa, 0xa4, 0x09, 0xc2, - 0x59, 0xf4, 0xe0, 0x84, 0xd8, 0x39, 0xde, 0x63, 0xd4, 0x80, 0xe3, 0x0c, 0xde, 0x25, 0x65, 0x1d, - 0x9a, 0xf2, 0x4e, 0x1b, 0xcb, 0x1c, 0x35, 0x80, 0xa1, 0x67, 0x59, 0xbc, 0x8d, 0xe2, 0x2f, 0x24, - 0x28, 0x60, 0xe1, 0x81, 0xa8, 0x63, 0xf7, 0x3a, 0xa5, 0x93, 0x72, 0x20, 0x37, 0x2e, 0x46, 0xcd, - 0x1f, 0xea, 0x70, 0x7d, 0x06, 0x96, 0x53, 0x0c, 0xa8, 0x48, 0xe2, 0x45, 0xbb, 0xfe, 0x6e, 0x9b, - 0x22, 0x6b, 0x53, 0xcb, 0x5c, 0xa2, 0xac, 0xf8, 0x33, 0x09, 0x4e, 0x60, 0xe5, 0x5d, 0x27, 0xf7, - 0xb6, 0xd6, 0xa8, 0xcb, 0xd7, 0x3b, 0x16, 0x88, 0xb8, 0xeb, 0x0c, 0x8d, 0x65, 0xa3, 0x02, 0x11, - 0x2b, 0xb3, 0xa2, 0x5a, 0x54, 0x83, 0x39, 0x76, 0xbe, 0x0c, 0x19, 0xe8, 0xd5, 0xba, 0x70, 0x2b, - 0x10, 0x37, 0xcc, 0x88, 0xf0, 0x9b, 0x90, 0x2d, 0x8c, 0xf1, 0x58, 0x11, 0x77, 0xf1, 0xdf, 0x12, - 0x9c, 0x9a, 0xc0, 0x83, 0x5e, 0x84, 0x19, 0xe2, 0x92, 0xcf, 0x46, 0xef, 0xcc, 0x84, 0x47, 0x84, - 0xbb, 0xfb, 0xdb, 0x57, 0xe9, 0x41, 0x74, 0x80, 0xff, 0x58, 0x94, 0x0b, 0xbd, 0x01, 0xf3, 0x6a, - 0xa7, 0xc3, 0xf4, 0x12, 0x39, 0xa1, 0x97, 0x4c, 0x78, 0xe2, 0x95, 0x88, 0x9e, 0xea, 0x25, 0xd4, - 0x39, 0xb4, 0xd3, 0x71, 0x59, 0xb8, 0x41, 0xdc, 0xde, 0xda, 0xf7, 0x61, 0x29, 0x49, 0x7c, 0x24, - 0xbd, 0xe4, 0xb7, 0x12, 0x28, 0xc9, 0x3e, 0x7c, 0x33, 0x78, 0x07, 0xe3, 0x86, 0xf9, 0x6b, 0x26, - 0xd5, 0xaf, 0x65, 0x78, 0x70, 0xec, 0x17, 0x46, 0x4f, 0xc0, 0xac, 0xda, 0xef, 0xeb, 0x15, 0x36, - 0xab, 0x98, 0xc0, 0x43, 0xae, 0x7b, 0x13, 0x6a, 0x1b, 0x25, 0x42, 0xd7, 0x60, 0x8e, 0xcc, 0x4c, - 0xcc, 0x20, 0xc7, 0xf0, 0x53, 0xf4, 0x36, 0x24, 0x05, 0x3f, 0xc5, 0x09, 0x51, 0x15, 0x96, 0x58, - 0xe8, 0xb3, 0xe5, 0xed, 0x79, 0xef, 0x47, 0x38, 0xa8, 0x04, 0xaa, 0x95, 0xdf, 0x21, 0xbb, 0x03, - 0x5a, 0x27, 0x06, 0xff, 0x26, 0xb9, 0x50, 0x1d, 0x14, 0xd2, 0xa6, 0xd8, 0x12, 0xc5, 0xc0, 0x22, - 0xc1, 0xe8, 0xb4, 0x13, 0x13, 0xda, 0xca, 0x70, 0x46, 0xc3, 0xa5, 0x0e, 0x87, 0xfe, 0x5e, 0x70, - 0xe0, 0x05, 0xe1, 0x37, 0x37, 0x5c, 0xf1, 0x33, 0x0e, 0x35, 0x5c, 0xbf, 0xc9, 0xd3, 0xc5, 0x9c, - 0x66, 0xc3, 0x12, 0x8d, 0x00, 0x7b, 0x48, 0x24, 0x1a, 0x92, 0xca, 0x92, 0x06, 0xf7, 0x56, 0xe0, - 0x38, 0x0d, 0xba, 0xe6, 0x2b, 0xe3, 0xec, 0xd8, 0x2e, 0x50, 0x9a, 0xed, 0xab, 0x54, 0x7c, 0xa1, - 0xb1, 0x01, 0x43, 0x8b, 0xb3, 0xa2, 0x6d, 0x28, 0x94, 0xbb, 0x5e, 0x3b, 0x18, 0xf5, 0x9d, 0xc3, - 0x99, 0x01, 0x57, 0xd9, 0xbb, 0x2c, 0xec, 0x52, 0x36, 0x62, 0x3e, 0x24, 0x3b, 0xb9, 0xd8, 0x10, - 0x72, 0x22, 0x77, 0xe1, 0x3c, 0xb9, 0x72, 0x7c, 0x6a, 0xca, 0xf7, 0x49, 0x17, 0x12, 0xbe, 0xa4, - 0x2f, 0x3c, 0xf3, 0x27, 0x76, 0x61, 0xa9, 0xde, 0x1e, 0x86, 0xce, 0xa0, 0x1d, 0x0c, 0x09, 0x58, - 0xd3, 0x21, 0xc0, 0x2c, 0x78, 0xd2, 0x5b, 0x7a, 0x15, 0x19, 0x46, 0xac, 0xf4, 0x2a, 0x32, 0xd9, - 0x1c, 0x96, 0x97, 0xaa, 0x7e, 0xd0, 0xee, 0xfa, 0x1f, 0xf0, 0xa8, 0x0a, 0x2a, 0x2f, 0xdd, 0xe4, - 0x85, 0x56, 0x5c, 0x5f, 0x7c, 0x33, 0x33, 0x6e, 0xb4, 0x97, 0x05, 0x38, 0xce, 0x02, 0xe9, 0x68, - 0x60, 0x59, 0x53, 0x33, 0x2a, 0xba, 0xb1, 0xa9, 0x48, 0x68, 0x09, 0xa0, 0x69, 0x99, 0x65, 0xcd, - 0xb6, 0xf1, 0x7f, 0x19, 0xff, 0x67, 0x51, 0x67, 0xd5, 0x56, 0x5d, 0xc9, 0x09, 0x81, 0x67, 0xf9, - 0xe2, 0x67, 0x12, 0x9c, 0x1c, 0x3f, 0x94, 0xc8, 0x01, 0x12, 0x7a, 0xc8, 0x0c, 0xc2, 0xcf, 0x4e, - 0x1d, 0xf7, 0xb1, 0xc5, 0xe9, 0x10, 0xc6, 0x90, 0x86, 0xc6, 0xc9, 0xdc, 0xea, 0x13, 0xa7, 0x6b, - 0xf5, 0x3b, 0xc5, 0x32, 0xac, 0x4e, 0x6a, 0x23, 0xf9, 0xaa, 0xcb, 0x50, 0x50, 0x9b, 0xcd, 0xba, - 0x5e, 0x56, 0x1d, 0xdd, 0x34, 0x14, 0x09, 0xcd, 0xc3, 0xcc, 0xa6, 0x65, 0xb6, 0x9a, 0x8a, 0x5c, - 0xfc, 0x58, 0x82, 0x45, 0x3d, 0x08, 0xbd, 0x3d, 0xea, 0xa5, 0x7a, 0xaf, 0x8b, 0xef, 0x85, 0xc4, - 0xe2, 0x5b, 0x8d, 0x82, 0x74, 0xa3, 0x07, 0x1c, 0x6a, 0xe5, 0xfd, 0x45, 0x82, 0x95, 0x0c, 0x0f, - 0xb2, 0xe1, 0xb8, 0xba, 0x63, 0x9b, 0x7a, 0xa5, 0xcc, 0x7a, 0xc6, 0xa5, 0x72, 0x56, 0x9a, 0x7d, - 0x0a, 0x8d, 0x81, 0xb9, 0x35, 0x74, 0x7b, 0x7e, 0x47, 0x48, 0x12, 0x55, 0x3b, 0x66, 0xf1, 0x96, - 0xc8, 0x49, 0xf6, 0xc1, 0x68, 0xe0, 0x91, 0x66, 0xe5, 0xc4, 0x8d, 0x66, 0x54, 0x9e, 0x6d, 0x98, - 0x38, 0x65, 0xb6, 0x71, 0x7d, 0xb6, 0xe9, 0xb8, 0xbd, 0x8d, 0x45, 0x28, 0x30, 0xad, 0x85, 0x28, - 0x04, 0x1f, 0x49, 0xb0, 0x3a, 0xa9, 0xaf, 0x58, 0x11, 0x4a, 0x06, 0xc4, 0x9d, 0x8c, 0x60, 0x7e, - 0x93, 0x91, 0x70, 0x9c, 0x0c, 0xbd, 0x04, 0x05, 0x9a, 0x03, 0xdb, 0xbe, 0xd6, 0xb2, 0x74, 0x36, - 0x41, 0xce, 0xfe, 0xeb, 0xcb, 0x73, 0xa7, 0x68, 0xc6, 0x6c, 0x77, 0x78, 0xcd, 0x1d, 0x0d, 0xfc, - 0x04, 0x24, 0xaa, 0xc8, 0x51, 0xfc, 0x50, 0x82, 0xb5, 0xc9, 0x2f, 0x89, 0x4f, 0x19, 0x07, 0xcb, - 0xe6, 0x71, 0x4c, 0x11, 0x39, 0x65, 0x88, 0xbc, 0x9e, 0x0a, 0x2a, 0x8a, 0x08, 0x31, 0x53, 0x94, - 0x7e, 0x51, 0xce, 0x64, 0x5d, 0x4b, 0x32, 0x71, 0xc2, 0xe2, 0xef, 0x65, 0x38, 0x89, 0x27, 0x50, - 0xd7, 0x1b, 0x0e, 0xd5, 0x51, 0xb8, 0xef, 0x05, 0x21, 0x13, 0xa9, 0xd0, 0x73, 0x30, 0xbb, 0x7f, - 0xb4, 0xdb, 0x40, 0x4a, 0x8e, 0x10, 0x90, 0x4d, 0x99, 0x3b, 0x75, 0xe2, 0xdf, 0xe8, 0x2c, 0x08, - 0x59, 0xee, 0xc8, 0x9e, 0xba, 0x60, 0xcd, 0xf7, 0xa3, 0x5c, 0x77, 0xcf, 0xc3, 0x0c, 0xd1, 0xfe, - 0xd9, 0xd6, 0xc8, 0x45, 0xda, 0xf1, 0x3d, 0x23, 0x77, 0x03, 0x16, 0x65, 0x40, 0x4f, 0x02, 0xc4, - 0x70, 0xb2, 0x6c, 0xef, 0xe3, 0x6a, 0x74, 0x84, 0x28, 0x6b, 0xcd, 0x1f, 0xdc, 0x6c, 0x33, 0x8c, - 0xd6, 0x12, 0xac, 0xf0, 0x4f, 0xd2, 0xe7, 0xd8, 0x35, 0xcc, 0x3c, 0xb5, 0x4c, 0x2b, 0xf4, 0x3e, - 0xc3, 0xaf, 0x29, 0xfe, 0x53, 0x86, 0xf9, 0x1d, 0x2c, 0x28, 0x10, 0xf5, 0x77, 0xba, 0x3a, 0xfd, - 0x34, 0x14, 0xea, 0xbd, 0x36, 0xbb, 0xbb, 0x1f, 0x32, 0xf8, 0x2c, 0x12, 0x58, 0xd3, 0xed, 0xb5, - 0xb9, 0x19, 0x60, 0x68, 0x89, 0x44, 0x5f, 0x13, 0x14, 0xf4, 0x0a, 0xcc, 0x52, 0x5b, 0x0a, 0xbb, - 0xa8, 0xe1, 0xa2, 0x62, 0xd4, 0xa3, 0x2b, 0xb4, 0x5a, 0xb8, 0x6e, 0xa6, 0xf6, 0x18, 0x51, 0x6e, - 0x61, 0xe8, 0x59, 0x82, 0xb2, 0x3f, 0x73, 0x38, 0x65, 0x5f, 0x40, 0x09, 0x99, 0x3d, 0x0c, 0x4a, - 0xc8, 0xda, 0x75, 0x28, 0x08, 0xfd, 0x39, 0x92, 0xe4, 0xf8, 0x53, 0x19, 0x16, 0xc9, 0x5b, 0x45, - 0x8e, 0x15, 0xdf, 0xce, 0xab, 0x8b, 0x17, 0x12, 0x57, 0x17, 0xab, 0xe2, 0x78, 0xd1, 0x37, 0x9b, - 0x72, 0x67, 0xf1, 0x0a, 0xac, 0x64, 0x08, 0xd1, 0x33, 0x30, 0x83, 0xbb, 0xcf, 0x55, 0x3d, 0x25, - 0x3d, 0x03, 0x62, 0x44, 0x39, 0xfc, 0xe2, 0x43, 0x8b, 0x52, 0x17, 0xff, 0x23, 0xc1, 0x02, 0xc3, - 0x17, 0x0e, 0x6e, 0xf6, 0xbe, 0xf6, 0x73, 0x5e, 0x4a, 0x7f, 0x4e, 0x1a, 0xe2, 0xca, 0x3e, 0xe7, - 0xff, 0xfa, 0x23, 0x5e, 0x4f, 0x7c, 0xc4, 0x53, 0x11, 0xbe, 0x0c, 0x7f, 0x9d, 0x29, 0xdf, 0xf0, - 0xcf, 0x04, 0x71, 0x2d, 0x49, 0x88, 0x7e, 0x08, 0xf3, 0x86, 0x77, 0x2b, 0xa1, 0x31, 0x5d, 0x9a, - 0xd0, 0xe8, 0x95, 0x88, 0x90, 0xae, 0x29, 0x72, 0xd8, 0x04, 0xde, 0x2d, 0x37, 0x63, 0xc6, 0x89, - 0x9b, 0xc4, 0x4a, 0x53, 0x92, 0xed, 0x28, 0x53, 0x9f, 0x05, 0x52, 0x90, 0xa8, 0xed, 0x3f, 0xe5, - 0x01, 0x62, 0x1f, 0x74, 0xbc, 0x00, 0x13, 0x16, 0x6c, 0x7e, 0x77, 0x4c, 0x8a, 0xc4, 0x39, 0xce, - 0x0d, 0xdb, 0x97, 0xd8, 0xa5, 0xa8, 0x3c, 0x19, 0xff, 0x87, 0x5c, 0x8f, 0x96, 0x99, 0x8f, 0x77, - 0xc7, 0xeb, 0xb6, 0xe9, 0x5e, 0x9c, 0xdb, 0xb8, 0x40, 0xe0, 0xde, 0xa2, 0xd2, 0x09, 0x89, 0xe2, - 0x88, 0x27, 0x78, 0x05, 0x13, 0x64, 0xe2, 0x3a, 0xf2, 0x77, 0x1f, 0xd7, 0x31, 0x73, 0x17, 0x71, - 0x1d, 0xb3, 0x87, 0x8c, 0xeb, 0x68, 0xc2, 0xbc, 0x1f, 0xbc, 0xe7, 0x05, 0x61, 0x6f, 0x70, 0x9b, - 0x58, 0xa9, 0xe3, 0xab, 0x2c, 0xfc, 0xa9, 0x75, 0x5e, 0x47, 0xc7, 0x9b, 0x1c, 0x98, 0x11, 0xbd, - 0x38, 0xdc, 0x51, 0x21, 0xfa, 0x2e, 0xc4, 0x56, 0x0f, 0x06, 0x0a, 0x3e, 0xf9, 0x9c, 0xdd, 0xe5, - 0x46, 0x91, 0x97, 0x21, 0x69, 0xfc, 0x60, 0x51, 0x91, 0x34, 0xa9, 0xa9, 0x58, 0x21, 0x42, 0x5e, - 0xed, 0x0a, 0xf6, 0x11, 0xe6, 0xf6, 0xfa, 0x95, 0x0c, 0x28, 0xdb, 0x71, 0xf4, 0x02, 0x14, 0xe8, - 0xd6, 0xef, 0x0e, 0x86, 0xef, 0xb2, 0x60, 0x04, 0x1a, 0x95, 0x2f, 0x14, 0x8b, 0x51, 0xf9, 0xb4, - 0xd8, 0x1a, 0xbe, 0xdb, 0x45, 0x6f, 0xc1, 0x03, 0x64, 0xe0, 0xfb, 0xde, 0xc0, 0xef, 0x75, 0x5c, - 0x82, 0x8b, 0xd6, 0xee, 0xb2, 0x74, 0x33, 0x4f, 0x90, 0xbc, 0x68, 0xd9, 0xea, 0x09, 0x13, 0x84, - 0xf8, 0xfc, 0x37, 0x09, 0x65, 0x93, 0x12, 0x22, 0x07, 0x14, 0x91, 0xff, 0xe6, 0xa8, 0xdb, 0x65, - 0x73, 0xae, 0x84, 0xd5, 0xdf, 0x74, 0xdd, 0x84, 0x86, 0x97, 0xe2, 0x86, 0xab, 0xa3, 0x6e, 0x17, - 0x3d, 0x07, 0xd0, 0x0b, 0xdc, 0x03, 0x7f, 0x38, 0xa4, 0x86, 0x8c, 0x28, 0x5e, 0x27, 0x2e, 0x15, - 0x87, 0xaf, 0x17, 0x34, 0x68, 0x21, 0x1e, 0xbe, 0x7e, 0x7b, 0xcf, 0x23, 0x51, 0xae, 0xd4, 0x69, - 0x85, 0x01, 0x48, 0xf3, 0xc2, 0xe4, 0x34, 0xda, 0xf3, 0x6c, 0xff, 0x03, 0xee, 0x73, 0xfc, 0x3a, - 0xac, 0x30, 0x77, 0xd1, 0x1d, 0x3f, 0xdc, 0x67, 0x72, 0xf7, 0xbd, 0x08, 0xed, 0x82, 0xe0, 0xfd, - 0xb7, 0x3c, 0x80, 0xba, 0x63, 0x73, 0x00, 0x89, 0xcb, 0x30, 0x83, 0xb5, 0x09, 0x7e, 0x2b, 0x41, - 0xee, 0x74, 0x49, 0xbb, 0xe2, 0x9d, 0x2e, 0xa1, 0xc0, 0xfb, 0x84, 0xe5, 0xed, 0x91, 0x8b, 0x31, - 0x39, 0xbe, 0xc2, 0x18, 0xd0, 0xa2, 0x84, 0xf4, 0x4a, 0x8b, 0x50, 0x1d, 0x20, 0x86, 0x74, 0x60, - 0xfa, 0xed, 0x4a, 0x1c, 0x1b, 0xcd, 0x2a, 0x18, 0x32, 0x70, 0x0c, 0x0b, 0x21, 0x4e, 0x9f, 0x98, - 0x0c, 0x6d, 0x41, 0xde, 0x69, 0x47, 0xd1, 0x28, 0x13, 0x80, 0x2e, 0xce, 0xb3, 0x74, 0x40, 0x31, - 0xd8, 0xc5, 0x52, 0xd8, 0x4e, 0x64, 0x4d, 0x23, 0x8d, 0x20, 0x0d, 0x66, 0x59, 0xaa, 0xc7, 0x09, - 0xa8, 0x47, 0x2c, 0xd3, 0x23, 0xc3, 0x3a, 0x24, 0x85, 0xa2, 0xb4, 0xc3, 0x92, 0x3a, 0x3e, 0x0d, - 0x39, 0xdb, 0x6e, 0xb0, 0xf0, 0xce, 0xc5, 0x58, 0x57, 0xb1, 0xed, 0x06, 0xcf, 0x8c, 0x7b, 0x20, - 0xb0, 0x61, 0x62, 0xf4, 0x3d, 0x28, 0x08, 0x82, 0x38, 0x0b, 0x8c, 0x26, 0xdf, 0xc0, 0x8f, 0x8b, - 0xc5, 0xed, 0x4c, 0xa0, 0x46, 0x75, 0x50, 0xb6, 0x46, 0x6f, 0x7b, 0x6a, 0xbf, 0x4f, 0x22, 0x29, - 0xde, 0xf3, 0x06, 0x14, 0xb5, 0x78, 0x2e, 0x86, 0x09, 0x74, 0xdb, 0xfd, 0xbe, 0xdb, 0xe1, 0xb5, - 0xe2, 0xcd, 0x4c, 0x9a, 0x13, 0x35, 0x61, 0xc5, 0xf6, 0xc2, 0x51, 0x9f, 0xba, 0x61, 0x54, 0x7b, - 0x03, 0xac, 0x9a, 0xd0, 0x0d, 0x83, 0x20, 0xaa, 0x0d, 0x71, 0x25, 0xf7, 0x7d, 0xb9, 0xd9, 0x1b, - 0xa4, 0xd4, 0x94, 0x2c, 0x73, 0xd1, 0x13, 0x87, 0x1c, 0x9f, 0xf7, 0x49, 0x85, 0x87, 0x9c, 0xf7, - 0x5c, 0xe1, 0x89, 0xd5, 0x9c, 0x27, 0xc7, 0x40, 0x7d, 0x10, 0x33, 0x9a, 0x00, 0xf5, 0x91, 0x00, - 0xf8, 0xf8, 0x24, 0x2f, 0x40, 0x48, 0xb1, 0xb1, 0x78, 0x11, 0xe0, 0x95, 0x9e, 0x1f, 0x34, 0xbc, - 0x70, 0xbf, 0xd7, 0x11, 0x10, 0x47, 0x0a, 0x3f, 0xea, 0xf9, 0x81, 0x7b, 0x40, 0x8a, 0xbf, 0xfa, - 0xf2, 0x9c, 0x40, 0x64, 0x09, 0xbf, 0xd1, 0xe3, 0x30, 0x8f, 0xff, 0x39, 0xb1, 0x33, 0x09, 0xbd, - 0xc0, 0x24, 0xdc, 0x2c, 0xc3, 0x76, 0x44, 0x80, 0xae, 0x13, 0x68, 0x71, 0xbf, 0x1f, 0x0a, 0x62, - 0x35, 0xc7, 0x11, 0xf7, 0xfb, 0x61, 0x1a, 0x15, 0x50, 0x20, 0x46, 0xb5, 0xa8, 0xeb, 0x1c, 0x9c, - 0x9e, 0x21, 0x98, 0x93, 0x5b, 0x3a, 0x36, 0xd7, 0x5c, 0x0e, 0x47, 0x26, 0xa6, 0x11, 0x4b, 0xb1, - 0x91, 0x4e, 0xd8, 0xb5, 0x0a, 0x35, 0xab, 0xb0, 0xd3, 0x8d, 0x76, 0x62, 0xb8, 0xdf, 0x71, 0x77, - 0x49, 0x71, 0xa2, 0x13, 0x11, 0x31, 0xda, 0x80, 0x65, 0x1a, 0x17, 0x1f, 0x25, 0xb9, 0x61, 0x27, - 0x1d, 0xd9, 0xdb, 0xe2, 0x2c, 0x38, 0xe2, 0xe3, 0x53, 0x0c, 0xa8, 0x0a, 0x33, 0x44, 0xb5, 0x64, - 0xce, 0xe0, 0xa7, 0x45, 0x9d, 0x3a, 0xbd, 0x8e, 0xc8, 0xbe, 0x42, 0xb4, 0x69, 0x71, 0x5f, 0x21, - 0xa4, 0xe8, 0x35, 0x00, 0x2d, 0x18, 0xf4, 0xba, 0x5d, 0x02, 0x98, 0x37, 0x47, 0x14, 0xb3, 0xb3, - 0xc9, 0xf5, 0x48, 0x5a, 0x89, 0x89, 0x18, 0x0e, 0x0c, 0xf9, 0xef, 0xa6, 0x60, 0xf5, 0x84, 0xb6, - 0x8a, 0x3a, 0xcc, 0xd2, 0xc5, 0x48, 0xc0, 0x27, 0x19, 0x9c, 0xb6, 0x00, 0x5d, 0x48, 0xc1, 0x27, - 0x59, 0x79, 0x16, 0x7c, 0x52, 0x60, 0x28, 0x6e, 0xc1, 0x89, 0x71, 0x2f, 0x96, 0x50, 0x86, 0xa5, - 0xc3, 0x2a, 0xc3, 0x7f, 0xcc, 0xc1, 0x02, 0x69, 0x8d, 0xef, 0xc2, 0x2a, 0x2c, 0xda, 0xa3, 0xb7, - 0x23, 0x10, 0x07, 0xbe, 0x1b, 0x93, 0xfe, 0x0d, 0xc5, 0x0a, 0xd1, 0xe0, 0x95, 0xe0, 0x40, 0x1a, - 0x2c, 0xf1, 0x93, 0x60, 0x93, 0x3b, 0x98, 0x47, 0xb8, 0x8f, 0x1c, 0x5e, 0x28, 0x9b, 0xe4, 0x2b, - 0xc5, 0x14, 0x9f, 0x07, 0xb9, 0xa3, 0x9c, 0x07, 0xf9, 0x43, 0x9d, 0x07, 0x6f, 0xc0, 0x02, 0x7f, - 0x1a, 0xd9, 0xc9, 0x67, 0xee, 0x6d, 0x27, 0x4f, 0x34, 0x86, 0xea, 0xd1, 0x8e, 0x3e, 0x3b, 0x75, - 0x47, 0x27, 0x56, 0x44, 0xbe, 0xca, 0x32, 0x79, 0x7b, 0x59, 0x1b, 0x24, 0x0b, 0xce, 0x66, 0xb9, - 0x79, 0x17, 0xa7, 0xe4, 0x33, 0x30, 0x5f, 0xef, 0x71, 0x03, 0x92, 0x70, 0x73, 0xdf, 0xe5, 0x85, - 0xa2, 0xb8, 0x10, 0x51, 0x46, 0xa7, 0x5b, 0xee, 0x7e, 0x9c, 0x6e, 0xd7, 0x01, 0x58, 0xe4, 0x42, - 0x9c, 0xbd, 0x82, 0x2c, 0x19, 0x1e, 0xa3, 0x9b, 0x34, 0x20, 0x08, 0xc4, 0x78, 0x77, 0x62, 0xae, - 0x26, 0xea, 0xee, 0x6e, 0x6f, 0x14, 0x84, 0x89, 0x74, 0x6f, 0x2c, 0x5c, 0x1f, 0x1f, 0x09, 0xa4, - 0x4e, 0xdc, 0x1e, 0x52, 0x6c, 0xf7, 0x77, 0x40, 0xd0, 0xab, 0x91, 0x8f, 0xdc, 0xd4, 0xec, 0xd7, - 0xc5, 0xcc, 0x17, 0x9a, 0xe8, 0x19, 0x57, 0xfc, 0x4c, 0x12, 0x41, 0x77, 0xef, 0x62, 0xa8, 0x9f, - 0x07, 0x88, 0x2c, 0xf8, 0x7c, 0xac, 0xa9, 0x26, 0x17, 0x95, 0x8a, 0x5f, 0x39, 0xa6, 0x15, 0xde, - 0x26, 0x77, 0xbf, 0xde, 0xc6, 0x81, 0x82, 0xf9, 0x4e, 0xd8, 0x8e, 0x5d, 0x3e, 0xc0, 0x8e, 0x24, - 0x59, 0xb2, 0x33, 0xf1, 0x2c, 0xdd, 0xb1, 0x1c, 0x3c, 0x31, 0x4b, 0x77, 0xc4, 0x58, 0x7c, 0x15, - 0x96, 0xc5, 0x40, 0xc2, 0xdb, 0xc1, 0x2e, 0xfa, 0x01, 0x45, 0x0b, 0x93, 0x12, 0x3a, 0x8e, 0x40, - 0x84, 0x77, 0xdc, 0xdb, 0xc1, 0x2e, 0x95, 0x7f, 0xda, 0xb7, 0xc4, 0xbe, 0x12, 0xed, 0xf3, 0x0b, - 0x09, 0x50, 0x96, 0x5c, 0xdc, 0x4d, 0xa4, 0xff, 0x83, 0x74, 0x99, 0x92, 0xca, 0xf2, 0x47, 0x91, - 0xca, 0x4a, 0xbf, 0x92, 0x60, 0x59, 0x57, 0x1b, 0x0c, 0x21, 0x97, 0x5a, 0x22, 0x1e, 0x86, 0xb3, - 0xba, 0xda, 0x70, 0x9b, 0x66, 0x5d, 0x2f, 0xdf, 0x70, 0xc7, 0x02, 0xdf, 0x9d, 0x85, 0x87, 0xb2, - 0x24, 0xb1, 0xc5, 0xe2, 0x0c, 0xac, 0x66, 0xab, 0x39, 0x38, 0xde, 0x78, 0x66, 0x8e, 0xa3, 0x97, - 0x2b, 0xbd, 0x04, 0xcb, 0x1c, 0x33, 0xce, 0xa9, 0xdb, 0x04, 0x6a, 0x76, 0x19, 0x0a, 0xdb, 0x9a, - 0xa5, 0x57, 0x6f, 0xb8, 0xd5, 0x56, 0xbd, 0xae, 0x1c, 0x43, 0x8b, 0x30, 0xcf, 0x0a, 0xca, 0xaa, - 0x22, 0xa1, 0x05, 0x98, 0xd3, 0x0d, 0x5b, 0x2b, 0xb7, 0x2c, 0x4d, 0x91, 0x4b, 0x2f, 0xc1, 0x52, - 0x73, 0xe0, 0xbf, 0xd7, 0x0e, 0xbd, 0x2d, 0xef, 0x36, 0x31, 0x38, 0x1c, 0x87, 0x9c, 0xa5, 0xee, - 0x28, 0xc7, 0x10, 0xc0, 0x6c, 0x73, 0xab, 0x6c, 0x5f, 0xbd, 0xaa, 0x48, 0xa8, 0x00, 0xc7, 0x37, - 0xcb, 0x4d, 0x77, 0xab, 0x61, 0x2b, 0x32, 0xfe, 0xa3, 0xee, 0xd8, 0xe4, 0x4f, 0xae, 0xf4, 0x14, - 0xac, 0x10, 0x59, 0xa1, 0xee, 0x0f, 0x43, 0x2f, 0xf0, 0x06, 0xa4, 0x0f, 0x0b, 0x30, 0x67, 0x7b, - 0x78, 0x91, 0x87, 0x1e, 0xed, 0x40, 0x63, 0xd4, 0x0d, 0xfd, 0x7e, 0xd7, 0x7b, 0x5f, 0x91, 0x4a, - 0xd7, 0x61, 0xd9, 0xea, 0x8d, 0x42, 0x3f, 0xd8, 0xb3, 0x43, 0x4c, 0xb1, 0x77, 0x1b, 0x3d, 0x08, - 0x2b, 0x2d, 0x43, 0x6d, 0x6c, 0xe8, 0x9b, 0x2d, 0xb3, 0x65, 0xbb, 0x0d, 0xd5, 0x29, 0xd7, 0xa8, - 0xb9, 0xa3, 0x61, 0xda, 0x8e, 0x6b, 0x69, 0x65, 0xcd, 0x70, 0x14, 0xa9, 0xf4, 0x73, 0x09, 0x96, - 0x5a, 0x43, 0xe6, 0xa2, 0xdb, 0x22, 0x81, 0x76, 0xe7, 0xe1, 0x4c, 0xcb, 0xd6, 0x2c, 0xd7, 0x31, - 0xb7, 0x34, 0xc3, 0x6d, 0xd9, 0xea, 0x66, 0x1a, 0x75, 0xf1, 0x1c, 0x9c, 0x16, 0x28, 0x2c, 0xad, - 0x6c, 0x6e, 0x6b, 0x96, 0xdb, 0x54, 0x6d, 0x7b, 0xc7, 0xb4, 0x2a, 0x8a, 0x84, 0xd6, 0xe0, 0xe4, - 0x18, 0x82, 0x46, 0x55, 0x55, 0xe4, 0x4c, 0x9d, 0xa1, 0xed, 0xa8, 0x75, 0x77, 0xc3, 0x74, 0x94, - 0x5c, 0xa9, 0x81, 0x0f, 0x3a, 0x02, 0x4c, 0x46, 0x61, 0xe5, 0xe7, 0x20, 0x6f, 0x98, 0x86, 0x96, - 0x36, 0x49, 0x2d, 0xc0, 0x9c, 0xda, 0x6c, 0x5a, 0xe6, 0x36, 0x19, 0x50, 0x80, 0xd9, 0x8a, 0x66, - 0xe0, 0x9e, 0xe5, 0x70, 0x4d, 0xd3, 0x32, 0x1b, 0xa6, 0xa3, 0x55, 0x94, 0x7c, 0xc9, 0xe2, 0x0b, - 0x86, 0x37, 0xba, 0xdb, 0xa3, 0xf6, 0x9f, 0x8a, 0x56, 0x55, 0x5b, 0x75, 0x87, 0x7d, 0x90, 0x1b, - 0xae, 0xa5, 0xbd, 0xda, 0xd2, 0x6c, 0xc7, 0x56, 0x24, 0xa4, 0xc0, 0x82, 0xa1, 0x69, 0x15, 0xdb, - 0xb5, 0xb4, 0x6d, 0x5d, 0xdb, 0x51, 0x64, 0xdc, 0x26, 0xfd, 0x8d, 0x9f, 0x50, 0xfa, 0x44, 0x02, - 0x44, 0x41, 0xdd, 0x38, 0xfc, 0x37, 0x19, 0x9f, 0x75, 0x58, 0xab, 0xe1, 0x0f, 0x4b, 0x5e, 0xad, - 0x61, 0x56, 0xd2, 0x9f, 0xec, 0x24, 0xa0, 0x54, 0xbd, 0x59, 0xad, 0x2a, 0x12, 0x3a, 0x0d, 0x0f, - 0xa4, 0xca, 0x2b, 0x96, 0xd9, 0x54, 0xe4, 0x35, 0x79, 0x4e, 0x42, 0xa7, 0x32, 0x95, 0x5b, 0x9a, - 0xd6, 0x54, 0x72, 0x78, 0x88, 0x52, 0x15, 0x7c, 0x02, 0x52, 0xf6, 0x7c, 0xe9, 0x43, 0x09, 0x4e, - 0xd2, 0x6e, 0xf2, 0xd9, 0x1c, 0x75, 0xf5, 0x0c, 0xac, 0x32, 0xfc, 0xc9, 0x71, 0x1d, 0x3d, 0x01, - 0x4a, 0xa2, 0x96, 0x76, 0xf3, 0x41, 0x58, 0x49, 0x94, 0x92, 0x7e, 0xc8, 0x78, 0xad, 0x26, 0x8a, - 0x37, 0x34, 0xdb, 0x71, 0xb5, 0x6a, 0xd5, 0xb4, 0x1c, 0xda, 0x91, 0x5c, 0xa9, 0x08, 0x2b, 0x65, - 0x6f, 0x10, 0x62, 0x1d, 0x24, 0x18, 0xfa, 0xbd, 0x80, 0x74, 0x61, 0x11, 0xe6, 0xb5, 0xd7, 0x1c, - 0xcd, 0xb0, 0x75, 0xd3, 0x50, 0x8e, 0x95, 0xce, 0xa4, 0x68, 0xf8, 0xaa, 0xb1, 0xed, 0x9a, 0x72, - 0xac, 0xd4, 0x86, 0x45, 0xee, 0x12, 0x4b, 0x67, 0xc5, 0x3a, 0xac, 0xf1, 0xb9, 0x46, 0xd6, 0x6f, - 0xfa, 0x15, 0x56, 0xe1, 0x44, 0xb6, 0x5e, 0x73, 0x14, 0x09, 0x8f, 0x42, 0xaa, 0x06, 0x97, 0xcb, - 0xa5, 0x3f, 0x48, 0xb0, 0xca, 0x12, 0x6d, 0x32, 0x7b, 0x04, 0x85, 0xbc, 0x26, 0xf0, 0x71, 0x25, - 0xb8, 0xe4, 0x58, 0x2d, 0xdb, 0xd1, 0x2a, 0x6e, 0x45, 0xdb, 0xd6, 0xcb, 0x1a, 0x99, 0x2e, 0xba, - 0xa5, 0x35, 0x34, 0xc3, 0x49, 0x3d, 0xfa, 0x31, 0x78, 0x64, 0x0a, 0xad, 0x61, 0x3a, 0xfc, 0x3f, - 0x5e, 0x25, 0x8f, 0xc0, 0x77, 0xa6, 0x10, 0x47, 0x84, 0x72, 0xe9, 0x4d, 0x58, 0x48, 0xa4, 0xf1, - 0x38, 0x05, 0x0f, 0x88, 0xff, 0x9b, 0x5e, 0xd0, 0xf1, 0x83, 0x3d, 0xe5, 0x58, 0xba, 0xc2, 0x1a, - 0x05, 0x01, 0xae, 0x20, 0x0b, 0x52, 0xac, 0x70, 0xbc, 0xc1, 0x81, 0x1f, 0xb4, 0x43, 0xaf, 0xa3, - 0xc8, 0xa5, 0x2b, 0xb0, 0x98, 0xc0, 0x19, 0xc4, 0x5f, 0xbe, 0x6e, 0xb2, 0xfd, 0xaa, 0xa1, 0x55, - 0xf4, 0x56, 0x43, 0x99, 0xc1, 0x4b, 0xb1, 0xa6, 0x6f, 0xd6, 0x14, 0x28, 0x7d, 0x2c, 0x61, 0x89, - 0x99, 0x7c, 0x9f, 0x46, 0x55, 0xe5, 0x63, 0x85, 0xe7, 0x09, 0x85, 0x24, 0xd5, 0x6c, 0x9b, 0x9a, - 0x52, 0xcf, 0xc0, 0x2a, 0xfb, 0xe3, 0xaa, 0x46, 0xc5, 0xad, 0xa9, 0x56, 0x65, 0x47, 0xb5, 0xf0, - 0xe4, 0xb9, 0xa1, 0xc8, 0x64, 0x45, 0x08, 0x25, 0xae, 0x63, 0xb6, 0xca, 0x35, 0x25, 0x87, 0x27, - 0x60, 0xa2, 0xbc, 0xa9, 0x1b, 0x4a, 0x9e, 0xac, 0xaf, 0x0c, 0x35, 0x69, 0x16, 0xd7, 0xcf, 0x94, - 0xee, 0x48, 0x70, 0xca, 0xf6, 0xf7, 0x82, 0x76, 0x38, 0x1a, 0x78, 0x6a, 0x77, 0xaf, 0x37, 0xf0, - 0xc3, 0xfd, 0x03, 0x7b, 0xe4, 0x87, 0x1e, 0xba, 0x0c, 0x17, 0x6d, 0x7d, 0xd3, 0x50, 0x1d, 0xbc, - 0x3e, 0xd4, 0xfa, 0xa6, 0x69, 0xe9, 0x4e, 0xad, 0xe1, 0xda, 0x2d, 0x3d, 0x33, 0x75, 0x2e, 0xc0, - 0xf9, 0xc9, 0xa4, 0x75, 0x6d, 0x53, 0x2d, 0xdf, 0x50, 0xa4, 0xe9, 0x0d, 0x6e, 0xa8, 0x75, 0xd5, - 0x28, 0x6b, 0x15, 0x77, 0xfb, 0xaa, 0x22, 0xa3, 0x8b, 0xf0, 0xf0, 0x64, 0xd2, 0xaa, 0xde, 0xb4, - 0x31, 0x59, 0x6e, 0xfa, 0x73, 0x6b, 0x76, 0x03, 0x53, 0xe5, 0x4b, 0x3e, 0x28, 0xe9, 0x08, 0xea, - 0x8c, 0xe1, 0xde, 0x6a, 0x19, 0x06, 0xdd, 0x25, 0x97, 0xa1, 0x60, 0x3a, 0x35, 0xcd, 0x62, 0xc8, - 0xb8, 0x04, 0x0a, 0xb7, 0x65, 0xa8, 0x2d, 0xa7, 0x66, 0x5a, 0xfa, 0xeb, 0x64, 0xbb, 0x5c, 0x85, - 0x13, 0x76, 0x5d, 0x2d, 0x6f, 0x91, 0x99, 0xa9, 0x1b, 0x6e, 0xb9, 0xa6, 0x1a, 0x86, 0x56, 0x57, - 0xa0, 0xf4, 0x3b, 0x89, 0x5a, 0xd0, 0xc7, 0x85, 0x5a, 0xa1, 0xc7, 0xe1, 0x51, 0x73, 0xcb, 0x51, - 0xdd, 0x66, 0xbd, 0xb5, 0xa9, 0x1b, 0xae, 0x7d, 0xc3, 0x28, 0xf3, 0x83, 0xb4, 0x9c, 0xdd, 0x51, - 0x1e, 0x85, 0x0b, 0x53, 0xa9, 0x63, 0x0c, 0xdb, 0x4b, 0x50, 0x9c, 0x4a, 0xc9, 0x5e, 0xa4, 0xf4, - 0xb9, 0x04, 0xa7, 0xa7, 0x58, 0x1e, 0xd1, 0x13, 0x70, 0xb9, 0xa6, 0xa9, 0x95, 0xba, 0x66, 0xdb, - 0x2e, 0x7e, 0x5f, 0xcd, 0x70, 0x98, 0x81, 0x7f, 0xec, 0x7e, 0x71, 0x19, 0x2e, 0x4e, 0x27, 0x8f, - 0x4f, 0x9e, 0x47, 0xe1, 0xc2, 0x74, 0x52, 0x76, 0x12, 0xc9, 0x78, 0xd7, 0x98, 0x4e, 0x19, 0x9d, - 0x60, 0xb9, 0xd2, 0x47, 0x12, 0x9c, 0x1c, 0xaf, 0xb0, 0xe3, 0xbe, 0xe9, 0x86, 0xed, 0xa8, 0xf5, - 0xba, 0xdb, 0x54, 0x2d, 0xb5, 0xe1, 0x6a, 0x86, 0x65, 0xd6, 0xeb, 0xe3, 0x76, 0xee, 0x0b, 0x70, - 0x7e, 0x32, 0xa9, 0x5d, 0xb6, 0xf4, 0x26, 0xde, 0x02, 0x8b, 0xb0, 0x3e, 0x99, 0x4a, 0xd3, 0xcb, - 0x9a, 0x22, 0x6f, 0xbc, 0xf8, 0xe9, 0x3f, 0xd6, 0x8f, 0x7d, 0x7a, 0x67, 0x5d, 0xfa, 0xe2, 0xce, - 0xba, 0xf4, 0xf7, 0x3b, 0xeb, 0xd2, 0xeb, 0x8f, 0x1d, 0x21, 0x4b, 0xf8, 0xdb, 0xb3, 0xc4, 0xa3, - 0xe5, 0xda, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0x8e, 0x41, 0x6a, 0x45, 0x92, 0x01, 0x00, + 0x36, 0x22, 0xff, 0x4b, 0xea, 0xae, 0xa5, 0xc7, 0x6d, 0xeb, 0xfa, 0x9b, 0x92, 0x66, 0x3c, 0x73, + 0x34, 0x0f, 0xce, 0xb5, 0x63, 0x4f, 0xc6, 0xf6, 0xc4, 0xd1, 0xdf, 0x76, 0x62, 0x25, 0x71, 0xe2, + 0xf8, 0x9f, 0x87, 0xd3, 0xa6, 0x0e, 0x47, 0xa2, 0x46, 0xcc, 0x48, 0xa4, 0x42, 0x52, 0x33, 0xb1, + 0x93, 0x94, 0x50, 0x46, 0xf4, 0x0c, 0x13, 0x0d, 0xa9, 0x48, 0x54, 0x1c, 0x67, 0xd3, 0x76, 0x93, + 0x45, 0x8b, 0xf4, 0x11, 0x74, 0x51, 0xb4, 0x05, 0x8a, 0x02, 0xf9, 0x16, 0x5d, 0x74, 0x1b, 0x20, + 0x08, 0x90, 0x45, 0x57, 0x2d, 0x10, 0xb4, 0x06, 0xfa, 0x09, 0x8a, 0x6e, 0xb2, 0x2a, 0xee, 0x8b, + 0xbc, 0x24, 0x25, 0x65, 0xfc, 0x48, 0x8b, 0xec, 0xa4, 0x7b, 0xcf, 0xb9, 0xbc, 0xef, 0x7b, 0xce, + 0x3d, 0xf7, 0xfc, 0x4e, 0x69, 0x07, 0x96, 0x92, 0x14, 0x48, 0x4d, 0xe2, 0x6c, 0x15, 0x9f, 0x95, + 0x59, 0x49, 0x1b, 0x41, 0x40, 0x9f, 0x88, 0x6e, 0x3c, 0xfc, 0xd7, 0xaf, 0x1e, 0x01, 0xfc, 0x97, + 0xf2, 0x8c, 0xc3, 0xe1, 0x2a, 0xfd, 0x22, 0x07, 0xc7, 0x63, 0x57, 0x33, 0xbe, 0x24, 0xbe, 0xb3, + 0x7e, 0x0f, 0x4a, 0xe2, 0x5d, 0x3e, 0x97, 0x98, 0xb2, 0x0d, 0x9c, 0xf2, 0x1c, 0x78, 0x13, 0x56, + 0x27, 0xd1, 0xa3, 0x27, 0x32, 0xa1, 0xd8, 0x19, 0x0e, 0x43, 0x14, 0xb3, 0x5d, 0x88, 0xcc, 0xfe, + 0x85, 0x04, 0x6b, 0xec, 0x61, 0x63, 0xb3, 0xe3, 0xf9, 0xa1, 0xeb, 0x77, 0xfc, 0x5d, 0xf7, 0xc1, + 0xf8, 0xed, 0x6c, 0x26, 0xb6, 0xa5, 0xf3, 0xc9, 0xf7, 0xab, 0x99, 0xaf, 0x4d, 0x6e, 0x2d, 0xba, + 0x48, 0x10, 0x37, 0x76, 0xe9, 0xe4, 0x2d, 0x50, 0x3f, 0x49, 0x1f, 0x27, 0x88, 0x7e, 0x92, 0x84, + 0xa2, 0xf4, 0x23, 0x58, 0x9f, 0xfe, 0x01, 0xf4, 0x16, 0x2c, 0x12, 0x94, 0xfa, 0x76, 0x7f, 0x6f, + 0xd0, 0xe9, 0xba, 0xfc, 0x4e, 0x8b, 0x5f, 0x29, 0x8a, 0x79, 0x14, 0x65, 0x84, 0xf9, 0xed, 0xed, + 0x11, 0xfc, 0x7b, 0xc6, 0x94, 0x78, 0x3d, 0x2c, 0x96, 0x56, 0xfa, 0xb1, 0x04, 0x28, 0x5b, 0x06, + 0x7a, 0x1e, 0x16, 0xda, 0x76, 0xc5, 0x0a, 0x3b, 0x83, 0xb0, 0x1e, 0x8c, 0x06, 0x0c, 0xbd, 0x83, + 0xba, 0x71, 0x85, 0xbb, 0x78, 0x67, 0x18, 0x84, 0xce, 0x7e, 0x30, 0x1a, 0x98, 0x09, 0x3a, 0x02, + 0x85, 0xef, 0xba, 0xef, 0x76, 0x3b, 0xb7, 0x93, 0x50, 0xf8, 0x2c, 0x2d, 0x01, 0x85, 0xcf, 0xd2, + 0x4a, 0x9f, 0x4b, 0xf0, 0x30, 0x7f, 0xac, 0x3a, 0x0a, 0x83, 0x76, 0xbf, 0xdb, 0x09, 0x1f, 0xd0, + 0x90, 0xd6, 0xc6, 0xca, 0x41, 0x13, 0x3e, 0xf6, 0x60, 0x46, 0xf4, 0x1d, 0x38, 0x33, 0xb5, 0x7c, + 0xa4, 0xc1, 0xb2, 0x1d, 0x04, 0xbd, 0x61, 0x9c, 0xcd, 0x5c, 0x51, 0x08, 0xd0, 0x64, 0x88, 0xb3, + 0x9c, 0xce, 0x28, 0x0c, 0x9c, 0x11, 0xc9, 0x14, 0xf1, 0x51, 0x53, 0x7c, 0xa5, 0x3f, 0x4b, 0x70, + 0x2c, 0xfe, 0xcb, 0x96, 0xfb, 0xfd, 0xf6, 0xd9, 0x2b, 0x89, 0x3e, 0xe3, 0x6f, 0xb1, 0xf0, 0x67, + 0x46, 0xe2, 0x67, 0x1e, 0x4c, 0x6f, 0xdd, 0x80, 0x93, 0x13, 0x4a, 0x46, 0xd7, 0x60, 0x81, 0xb4, + 0x97, 0xef, 0x70, 0x52, 0xec, 0x07, 0x4b, 0x3b, 0x29, 0xeb, 0x20, 0x99, 0x60, 0x28, 0x7d, 0x2a, + 0xc1, 0x29, 0xfe, 0x92, 0xa6, 0x3b, 0x66, 0x8e, 0x57, 0x88, 0x13, 0xfc, 0x80, 0xa3, 0xe2, 0x4d, + 0xd3, 0x79, 0x56, 0x38, 0x4e, 0x04, 0x99, 0xf8, 0x44, 0xf9, 0xa1, 0xbc, 0xa4, 0xb7, 0xc2, 0xa0, + 0x7f, 0x08, 0xa0, 0x08, 0x39, 0xea, 0xa9, 0x30, 0xe8, 0x93, 0x22, 0x08, 0x67, 0xc9, 0x85, 0xe3, + 0x62, 0xe5, 0x78, 0x8d, 0x51, 0x13, 0x8e, 0x32, 0xd8, 0xa0, 0x94, 0xd5, 0x71, 0x4a, 0x9b, 0x36, + 0x96, 0x39, 0x1a, 0x05, 0x43, 0x65, 0x33, 0x79, 0x19, 0xa5, 0x9f, 0x4b, 0x50, 0xc4, 0x42, 0x29, + 0x51, 0xf3, 0xef, 0x77, 0x8e, 0x24, 0xf5, 0x0b, 0x6e, 0xb4, 0x8e, 0x8a, 0x3f, 0x94, 0xd0, 0xf6, + 0x1c, 0x2c, 0xa7, 0x18, 0x50, 0x89, 0xf8, 0x21, 0xf7, 0xbc, 0xdd, 0x0e, 0x45, 0x6c, 0xa7, 0x16, + 0xdf, 0x44, 0x5a, 0xe9, 0xa7, 0x12, 0x1c, 0x37, 0xde, 0x0d, 0x3b, 0x1a, 0xb1, 0x07, 0x98, 0xa3, + 0x1e, 0x3f, 0x47, 0xb0, 0xa0, 0xcd, 0x9f, 0x64, 0x51, 0x1f, 0x49, 0x2a, 0x68, 0xb3, 0x34, 0x33, + 0xca, 0x45, 0x75, 0x98, 0x63, 0x72, 0xcb, 0x90, 0x81, 0xa9, 0xad, 0x0b, 0xb7, 0x4d, 0x71, 0xc1, + 0x8c, 0x08, 0xb7, 0x84, 0x1c, 0x8d, 0x8c, 0xc7, 0x8c, 0xb8, 0x4b, 0xff, 0x92, 0xe0, 0xe4, 0x04, + 0x1e, 0xf4, 0x32, 0xcc, 0x10, 0x57, 0x0f, 0x36, 0x7a, 0xa7, 0x27, 0x7c, 0x22, 0xdc, 0xdd, 0xdf, + 0xbe, 0x4c, 0x05, 0x9c, 0x03, 0xfc, 0xc7, 0xa4, 0x5c, 0xe8, 0x0d, 0x98, 0x57, 0xba, 0x5d, 0xa6, + 0xef, 0xe6, 0x12, 0xfa, 0xee, 0x84, 0x2f, 0x5e, 0x8a, 0xe8, 0xa9, 0xbe, 0x4b, 0x1f, 0x1d, 0x77, + 0xbb, 0x0e, 0x73, 0x63, 0x89, 0xcb, 0x5b, 0xfb, 0x3e, 0x2c, 0x25, 0x89, 0xef, 0x4a, 0xdf, 0xfd, + 0x8d, 0x04, 0x72, 0xb2, 0x0e, 0xdf, 0x0e, 0x8e, 0xc6, 0xb8, 0x61, 0xfe, 0x86, 0x49, 0xf5, 0xab, + 0x1c, 0x3c, 0x34, 0xb6, 0x87, 0xd1, 0x53, 0x30, 0xab, 0xf4, 0xfb, 0x5a, 0x95, 0xcd, 0x2a, 0x26, + 0x48, 0x13, 0x33, 0x42, 0xe2, 0x3a, 0x80, 0x12, 0xa1, 0x2b, 0x30, 0x47, 0x66, 0x26, 0x66, 0xc8, + 0xc5, 0xb0, 0x66, 0xf4, 0x96, 0x2d, 0x05, 0x6b, 0xc6, 0x09, 0x51, 0x0d, 0x96, 0x98, 0x4b, 0xbd, + 0xe9, 0xee, 0xb9, 0x1f, 0x44, 0xf8, 0xba, 0x04, 0x02, 0x98, 0xdb, 0x26, 0x9c, 0x01, 0xcd, 0x13, + 0x9d, 0xca, 0x93, 0x5c, 0xa8, 0x01, 0x32, 0x29, 0x53, 0x2c, 0x89, 0x62, 0xab, 0x11, 0x90, 0x03, + 0x5a, 0x89, 0x09, 0x65, 0x65, 0x38, 0xa3, 0xe1, 0x52, 0x86, 0x43, 0x6f, 0xcf, 0x3f, 0x70, 0xfd, + 0xf0, 0xdb, 0x1b, 0xae, 0xf8, 0x1b, 0x87, 0x1a, 0xae, 0x5f, 0x17, 0xe8, 0x62, 0x4e, 0xb3, 0x61, + 0x49, 0x59, 0x80, 0xd3, 0x24, 0x92, 0x32, 0x09, 0x91, 0x4a, 0x9d, 0xc6, 0xab, 0x70, 0x94, 0x3a, + 0xf3, 0xf3, 0x95, 0x71, 0x66, 0x6c, 0x15, 0x28, 0xcd, 0xf6, 0x65, 0x2a, 0x16, 0x53, 0x9f, 0x93, + 0xa1, 0xc9, 0x59, 0xd1, 0x36, 0x14, 0x2b, 0x3d, 0xb7, 0xe3, 0x8f, 0xfa, 0xf6, 0xe1, 0xcc, 0xcb, + 0xab, 0xac, 0x2d, 0x0b, 0xbb, 0x94, 0x8d, 0x98, 0xa5, 0xc9, 0x4e, 0x2e, 0x16, 0x84, 0xec, 0xe8, + 0x19, 0x7a, 0x81, 0x5c, 0x65, 0x3f, 0x33, 0xa5, 0x7f, 0xd2, 0x89, 0x84, 0x2f, 0xe9, 0x63, 0xc1, + 0xde, 0xa9, 0x3b, 0xb0, 0xd4, 0xe8, 0x0c, 0x43, 0x7b, 0xd0, 0xf1, 0x87, 0x04, 0x04, 0xec, 0x10, + 0x20, 0x29, 0x3c, 0x98, 0x32, 0xbd, 0xe2, 0x0e, 0x23, 0x56, 0x7a, 0xc5, 0x9d, 0x2c, 0x0e, 0xcb, + 0xe1, 0x35, 0xcf, 0xef, 0xf4, 0xbc, 0x0f, 0xb9, 0xb7, 0x0e, 0x95, 0xc3, 0x6f, 0xf2, 0x44, 0x33, + 0xce, 0x2f, 0xbd, 0x99, 0x19, 0x37, 0x5a, 0xcb, 0x22, 0x1c, 0x65, 0x0e, 0x9a, 0xd4, 0x61, 0xb1, + 0xa5, 0xea, 0x55, 0x4d, 0xdf, 0x94, 0x25, 0xb4, 0x04, 0xd0, 0x32, 0x8d, 0x8a, 0x6a, 0x59, 0xf8, + 0x7f, 0x0e, 0xff, 0x67, 0xde, 0x8c, 0xb5, 0x76, 0x43, 0xce, 0x0b, 0x0e, 0x8d, 0x05, 0x2c, 0x11, + 0x9e, 0x18, 0x3f, 0x94, 0xc8, 0x06, 0xe2, 0xd2, 0xca, 0x1e, 0x1a, 0x3c, 0x3f, 0x75, 0xdc, 0xc7, + 0x26, 0xa7, 0x5d, 0x63, 0x43, 0xea, 0x72, 0x99, 0xe3, 0xd6, 0xc4, 0x38, 0x0c, 0xb0, 0xd7, 0x2d, + 0x55, 0x60, 0x75, 0x52, 0x19, 0xc9, 0xa6, 0x2e, 0x43, 0x51, 0x69, 0xb5, 0x1a, 0x5a, 0x45, 0xb1, + 0x35, 0x43, 0x97, 0x25, 0x34, 0x0f, 0x33, 0x9b, 0xa6, 0xd1, 0x6e, 0xc9, 0xb9, 0xd2, 0x27, 0x12, + 0x2c, 0x6a, 0x7e, 0xe8, 0xee, 0xd1, 0xd7, 0xcf, 0xf7, 0xbb, 0xf8, 0x5e, 0x4a, 0x2c, 0xbe, 0xd5, + 0xc8, 0xf9, 0x3b, 0xfa, 0xc0, 0xa1, 0x56, 0xde, 0x5f, 0x24, 0x58, 0xc9, 0xf0, 0x20, 0x0b, 0x8e, + 0x2a, 0x3b, 0x96, 0xa1, 0x55, 0x2b, 0xac, 0x66, 0x5c, 0xdb, 0x63, 0xa9, 0xd9, 0xaf, 0x50, 0xdf, + 0xaa, 0x5b, 0x43, 0x27, 0xf0, 0xba, 0x42, 0xf0, 0xb1, 0xfa, 0x11, 0x93, 0x97, 0x44, 0x4e, 0xb2, + 0x0f, 0x47, 0x03, 0x97, 0x14, 0x9b, 0x4b, 0xdc, 0x94, 0x47, 0xe9, 0xd9, 0x82, 0xc9, 0x63, 0xdf, + 0x0e, 0xce, 0xcf, 0x16, 0x1d, 0x97, 0xb7, 0xb1, 0x08, 0x45, 0xa6, 0x0d, 0x13, 0x45, 0xf3, 0x63, + 0x09, 0x56, 0x27, 0xd5, 0x15, 0x2b, 0xd8, 0x49, 0x47, 0xcb, 0x13, 0x11, 0x7c, 0x74, 0xd2, 0xc3, + 0x92, 0x93, 0xa1, 0x6b, 0x50, 0xa4, 0xb1, 0xd5, 0xad, 0x2b, 0x6d, 0x53, 0x63, 0x13, 0xe4, 0x0c, + 0x16, 0x41, 0x69, 0x24, 0x76, 0x67, 0x78, 0xc5, 0x19, 0x0d, 0xbc, 0x04, 0xd4, 0xae, 0xc8, 0x51, + 0xfa, 0x48, 0x82, 0xb5, 0xc9, 0x8d, 0xc4, 0xa7, 0x8c, 0x8d, 0x75, 0xbe, 0xd8, 0x57, 0x8d, 0x9c, + 0x32, 0x44, 0x0f, 0x4c, 0x39, 0xab, 0x45, 0x84, 0x98, 0x29, 0x0a, 0xeb, 0x99, 0xcb, 0x44, 0xf3, + 0x4b, 0x32, 0x71, 0xc2, 0xd2, 0xef, 0x72, 0x70, 0x02, 0x4f, 0xa0, 0x9e, 0x3b, 0xc4, 0x1a, 0xc4, + 0xbe, 0xeb, 0x87, 0x4c, 0xa4, 0x42, 0x2f, 0xc0, 0xec, 0xfe, 0xdd, 0xdd, 0x32, 0x53, 0x72, 0x84, + 0x80, 0x6c, 0xca, 0xfc, 0xb1, 0x30, 0xfe, 0x8d, 0xce, 0x80, 0x10, 0x3d, 0x91, 0xec, 0xa9, 0x0b, + 0xe6, 0x7c, 0x3f, 0x8a, 0xa1, 0xf8, 0x22, 0xcc, 0x90, 0x5b, 0x25, 0xb6, 0x35, 0x72, 0x91, 0x76, + 0x7c, 0xcd, 0xc8, 0x9d, 0x93, 0x49, 0x19, 0xd0, 0xd3, 0x00, 0x31, 0x4c, 0x31, 0xdb, 0xfb, 0xf8, + 0xf5, 0x4c, 0x84, 0x54, 0x6c, 0xce, 0x1f, 0xdc, 0xec, 0x30, 0xec, 0xdf, 0x32, 0xac, 0xf0, 0x2e, + 0xe9, 0x73, 0x4c, 0x24, 0x66, 0xf6, 0x5c, 0xa6, 0x19, 0x5a, 0x9f, 0xe1, 0x22, 0x95, 0xfe, 0x99, + 0x83, 0xf9, 0x1d, 0x2c, 0x28, 0x90, 0x6b, 0x95, 0xe9, 0xd7, 0x34, 0xcf, 0x42, 0xb1, 0x11, 0x74, + 0x98, 0x4d, 0x68, 0xc8, 0x60, 0xd9, 0x88, 0xc3, 0x56, 0x2f, 0xe8, 0x70, 0xf3, 0xd2, 0xd0, 0x14, + 0x89, 0xbe, 0xc1, 0xd9, 0xec, 0x55, 0x98, 0xa5, 0x36, 0x3a, 0x76, 0x01, 0xc8, 0x45, 0xc5, 0xa8, + 0x46, 0x97, 0x68, 0xb6, 0x60, 0xc6, 0xa0, 0x76, 0x3e, 0x51, 0x6e, 0x61, 0xa8, 0x6c, 0xc2, 0x25, + 0xd2, 0xcc, 0xe1, 0x2e, 0x91, 0x04, 0xf4, 0x99, 0xd9, 0xc3, 0xa0, 0xcf, 0xac, 0x5d, 0x85, 0xa2, + 0x50, 0x9f, 0xbb, 0x92, 0x1c, 0x7f, 0x92, 0x83, 0x45, 0xd2, 0xaa, 0xe8, 0xc1, 0xce, 0x77, 0xf3, + 0x4a, 0xec, 0xa5, 0xc4, 0x95, 0xd8, 0xaa, 0x38, 0x5e, 0xb4, 0x65, 0x53, 0xee, 0xc2, 0x5e, 0x85, + 0x95, 0x0c, 0x21, 0x7a, 0x0e, 0x66, 0x70, 0xf5, 0xb9, 0xaa, 0x27, 0xa7, 0x67, 0x40, 0x8c, 0x54, + 0x88, 0x1b, 0x3e, 0x34, 0x29, 0x75, 0xe9, 0xdf, 0x12, 0x2c, 0x30, 0xdc, 0x6a, 0xff, 0x66, 0xf0, + 0x8d, 0xdd, 0x79, 0x21, 0xdd, 0x9d, 0xd4, 0x75, 0x9a, 0x75, 0xe7, 0x7f, 0xbb, 0x13, 0xaf, 0x26, + 0x3a, 0xf1, 0x64, 0x84, 0x5b, 0xc4, 0x9b, 0x33, 0xa5, 0x0f, 0xff, 0x44, 0x90, 0xfc, 0x92, 0x84, + 0xe8, 0x87, 0x30, 0xaf, 0xbb, 0xb7, 0x12, 0x1a, 0xd3, 0x85, 0x09, 0x85, 0x5e, 0x8a, 0x08, 0xe9, + 0x9a, 0x22, 0x87, 0x8d, 0xef, 0xde, 0x72, 0x32, 0xe6, 0xc1, 0xb8, 0x48, 0xac, 0x34, 0x25, 0xd9, + 0xee, 0x66, 0xea, 0x33, 0x07, 0x1d, 0x82, 0x06, 0xf0, 0xc7, 0x02, 0x40, 0xec, 0xdb, 0x80, 0x17, + 0x60, 0xe2, 0x65, 0x04, 0xb7, 0x49, 0x90, 0x24, 0x71, 0x8e, 0xf3, 0x07, 0x13, 0x17, 0xd8, 0x65, + 0x7b, 0x6e, 0x32, 0xae, 0x14, 0xb9, 0x76, 0xaf, 0x30, 0xdf, 0x81, 0xae, 0xdb, 0xeb, 0xd0, 0xbd, + 0x38, 0xbf, 0x71, 0x8e, 0xc0, 0x08, 0x46, 0xa9, 0x13, 0x02, 0x10, 0x12, 0x0f, 0x83, 0x2a, 0x26, + 0xc8, 0xf8, 0x0b, 0x15, 0xee, 0xdd, 0x5f, 0x68, 0xe6, 0x1e, 0xfc, 0x85, 0x66, 0x0f, 0xe9, 0x2f, + 0xd4, 0x82, 0x79, 0xcf, 0x7f, 0xdf, 0xf5, 0xc3, 0x60, 0x70, 0x9b, 0xbc, 0x7e, 0x88, 0xaf, 0x48, + 0x71, 0x57, 0x6b, 0x3c, 0x8f, 0x8e, 0x37, 0x39, 0x30, 0x23, 0x7a, 0x71, 0xb8, 0xa3, 0x44, 0xf4, + 0xff, 0x10, 0x5b, 0xd3, 0x18, 0xd8, 0xfc, 0xe4, 0x73, 0x76, 0x97, 0x1b, 0xdb, 0x5e, 0x81, 0xa4, + 0x51, 0x8d, 0x79, 0xdb, 0xd2, 0x60, 0xb9, 0x62, 0x86, 0x78, 0x6d, 0xb5, 0x2b, 0xd8, 0xdd, 0xd8, + 0x73, 0xea, 0xaf, 0x73, 0x80, 0xb2, 0x15, 0x47, 0x2f, 0x41, 0x91, 0x6e, 0xfd, 0xce, 0x60, 0xf8, + 0x1e, 0x73, 0x72, 0xa1, 0x68, 0x0f, 0x42, 0xb2, 0x88, 0xf6, 0x40, 0x93, 0xcd, 0xe1, 0x7b, 0x3d, + 0xf4, 0x16, 0x1c, 0x23, 0x03, 0xdf, 0x77, 0x07, 0x5e, 0xd0, 0x75, 0x08, 0xde, 0x5e, 0xa7, 0xc7, + 0xc2, 0x18, 0x3d, 0x45, 0xe2, 0xed, 0x65, 0xb3, 0x27, 0x4c, 0x10, 0xe2, 0x4b, 0xd2, 0x22, 0x94, + 0x2d, 0x4a, 0x88, 0x6c, 0x90, 0x45, 0xfe, 0x9b, 0xa3, 0x5e, 0x8f, 0xcd, 0xb9, 0x32, 0x56, 0x7f, + 0xd3, 0x79, 0x13, 0x0a, 0x5e, 0x8a, 0x0b, 0xae, 0x8d, 0x7a, 0x3d, 0xf4, 0x02, 0x40, 0xe0, 0x3b, + 0x07, 0xde, 0x70, 0x48, 0x0d, 0x64, 0x91, 0x1f, 0x58, 0x9c, 0x2a, 0x0e, 0x5f, 0xe0, 0x37, 0x69, + 0x22, 0x1e, 0xbe, 0x7e, 0x67, 0xcf, 0x25, 0xde, 0xd3, 0xf4, 0x31, 0x14, 0x03, 0x26, 0xe7, 0x89, + 0xc9, 0x69, 0xb4, 0xe7, 0x5a, 0xde, 0x87, 0xfc, 0x2d, 0xfb, 0x0d, 0x58, 0x61, 0xcf, 0x90, 0x77, + 0xbc, 0x70, 0x9f, 0xc9, 0xdd, 0xf7, 0x23, 0xb4, 0x0b, 0x82, 0xf7, 0xdf, 0x0a, 0x00, 0xca, 0x8e, + 0xc5, 0x81, 0x49, 0x2e, 0xc2, 0x0c, 0xd6, 0x26, 0xf8, 0xad, 0x04, 0xb9, 0x2b, 0x25, 0xe5, 0x8a, + 0x77, 0xa5, 0x84, 0x02, 0xef, 0x13, 0xa6, 0xbb, 0x47, 0x2e, 0xc6, 0x72, 0xf1, 0x15, 0xc6, 0x80, + 0x26, 0x25, 0xa4, 0x57, 0x9a, 0x84, 0x1a, 0x00, 0x31, 0x54, 0x08, 0xd3, 0x6f, 0x57, 0x62, 0x9f, + 0x7b, 0x96, 0xc1, 0x10, 0xa7, 0x63, 0xb8, 0x11, 0x71, 0xfa, 0xc4, 0x64, 0x68, 0x0b, 0x0a, 0x76, + 0x27, 0xf2, 0x72, 0x9a, 0x00, 0xa0, 0x72, 0x96, 0x85, 0x99, 0x8a, 0x41, 0x54, 0x96, 0xc2, 0x4e, + 0x22, 0x1a, 0x1f, 0x29, 0x04, 0xa9, 0x30, 0xcb, 0x42, 0x88, 0x4e, 0x40, 0xd3, 0x62, 0x11, 0x44, + 0x19, 0x86, 0x26, 0x49, 0x14, 0xa5, 0x1d, 0x16, 0x2c, 0xf4, 0x59, 0xc8, 0x5b, 0x56, 0x93, 0xb9, + 0x0d, 0x2f, 0xc6, 0xba, 0x8a, 0x65, 0x35, 0x79, 0xc4, 0xe5, 0x03, 0x81, 0x0d, 0x13, 0xa3, 0xef, + 0x41, 0x51, 0x10, 0xc4, 0x99, 0xc3, 0x3d, 0xe9, 0x03, 0x2f, 0x4e, 0x16, 0xb7, 0x33, 0x81, 0x1a, + 0x35, 0x40, 0xde, 0x1a, 0xbd, 0xed, 0x2a, 0xfd, 0x3e, 0xf1, 0xd0, 0x79, 0xdf, 0x1d, 0x50, 0x34, + 0xec, 0xb9, 0x18, 0x7e, 0xd2, 0xe9, 0xf4, 0xfb, 0x4e, 0x97, 0xe7, 0x8a, 0x37, 0x33, 0x69, 0x4e, + 0xd4, 0x82, 0x15, 0xcb, 0x0d, 0x47, 0x7d, 0xfa, 0xbc, 0xa7, 0x16, 0x0c, 0xb0, 0x6a, 0x42, 0x37, + 0x0c, 0x82, 0xd4, 0x37, 0xc4, 0x99, 0xfc, 0x4d, 0xd5, 0xcd, 0x60, 0x90, 0x52, 0x53, 0xb2, 0xcc, + 0x25, 0x57, 0x1c, 0x72, 0x7c, 0xde, 0x27, 0x15, 0x1e, 0x72, 0xde, 0x73, 0x85, 0x27, 0x56, 0x73, + 0x9e, 0x1e, 0x03, 0x21, 0x43, 0xcc, 0xb3, 0x02, 0x84, 0x4c, 0x02, 0x38, 0xe6, 0xd3, 0x82, 0x00, + 0x4d, 0xc6, 0xc6, 0xe2, 0x65, 0x80, 0x57, 0x03, 0xcf, 0x6f, 0xba, 0xe1, 0x7e, 0xd0, 0x15, 0x90, + 0x6c, 0x8a, 0xef, 0x04, 0x9e, 0xef, 0x1c, 0x90, 0xe4, 0xaf, 0xbf, 0x7a, 0x44, 0x20, 0x32, 0x85, + 0xdf, 0xe8, 0x49, 0x98, 0xc7, 0xff, 0xec, 0xf8, 0x91, 0x12, 0xbd, 0xc0, 0x24, 0xdc, 0x2c, 0x72, + 0x7b, 0x44, 0x80, 0xae, 0x12, 0xc8, 0x7a, 0xaf, 0x1f, 0x0a, 0x62, 0x35, 0xc7, 0xa7, 0xf7, 0xfa, + 0x61, 0x1a, 0x6d, 0x52, 0x20, 0x46, 0xf5, 0xa8, 0xea, 0x3c, 0xe8, 0x01, 0x43, 0xc6, 0x27, 0xb7, + 0x74, 0x6c, 0xae, 0x39, 0x1c, 0xe6, 0x4e, 0x34, 0xbf, 0xa4, 0xd8, 0x48, 0x25, 0xac, 0x7a, 0x95, + 0x5a, 0x77, 0xd8, 0xe9, 0x46, 0x2b, 0x31, 0xdc, 0xef, 0x3a, 0xbb, 0x24, 0x39, 0x51, 0x89, 0x88, + 0x18, 0x6d, 0xc0, 0x32, 0xc5, 0x5b, 0x88, 0x82, 0x27, 0xb1, 0x93, 0x8e, 0xec, 0x6d, 0x71, 0x74, + 0x25, 0xf1, 0xf3, 0x29, 0x06, 0x54, 0x83, 0x19, 0xa2, 0x5a, 0x32, 0x27, 0x83, 0x53, 0xa2, 0x4e, + 0x9d, 0x5e, 0x47, 0x64, 0x5f, 0x21, 0xda, 0xb4, 0xb8, 0xaf, 0x10, 0x52, 0xf4, 0x3a, 0x80, 0xea, + 0x0f, 0x82, 0x5e, 0x8f, 0x00, 0x31, 0xce, 0x11, 0xc5, 0xec, 0x4c, 0x72, 0x3d, 0x92, 0x52, 0x62, + 0x22, 0x86, 0x2f, 0x44, 0xfe, 0x3b, 0x29, 0xb8, 0x46, 0xa1, 0xac, 0x92, 0x06, 0xb3, 0x74, 0x31, + 0x12, 0x50, 0x53, 0x06, 0xd3, 0x2e, 0x40, 0x62, 0x52, 0x50, 0x53, 0x96, 0x9e, 0x05, 0x35, 0x15, + 0x18, 0x4a, 0x5b, 0x70, 0x7c, 0x5c, 0xc3, 0x12, 0xca, 0xb0, 0x74, 0x58, 0x65, 0xf8, 0x0f, 0x79, + 0x58, 0x20, 0xa5, 0xf1, 0x5d, 0x58, 0x81, 0x45, 0x6b, 0xf4, 0x76, 0x04, 0x0e, 0xc2, 0x77, 0x63, + 0x52, 0xbf, 0xa1, 0x98, 0x21, 0x1a, 0x52, 0x13, 0x1c, 0x48, 0x85, 0x25, 0x7e, 0x12, 0x6c, 0x72, + 0xc7, 0x85, 0x08, 0x4f, 0x94, 0xc3, 0x56, 0x65, 0x83, 0xc7, 0xa5, 0x98, 0xe2, 0xf3, 0x20, 0x7f, + 0x37, 0xe7, 0x41, 0xe1, 0x50, 0xe7, 0xc1, 0x1b, 0xb0, 0xc0, 0xbf, 0x46, 0x76, 0xf2, 0x99, 0xfb, + 0xdb, 0xc9, 0x13, 0x85, 0xa1, 0x46, 0xb4, 0xa3, 0xcf, 0x4e, 0xdd, 0xd1, 0x89, 0x75, 0x9a, 0xaf, + 0xb2, 0x4c, 0x3c, 0x68, 0x56, 0x06, 0x89, 0xae, 0xb4, 0x59, 0x69, 0xdd, 0xc3, 0x29, 0xf9, 0x1c, + 0xcc, 0x37, 0x02, 0x6e, 0x40, 0x12, 0x6e, 0xee, 0x7b, 0x3c, 0x51, 0x14, 0x17, 0x22, 0xca, 0xe8, + 0x74, 0xcb, 0x3f, 0x88, 0xd3, 0xed, 0x2a, 0x00, 0xf3, 0x88, 0x89, 0xa3, 0xa2, 0x90, 0x25, 0xc3, + 0x7d, 0xbf, 0x93, 0x06, 0x04, 0x81, 0x18, 0xef, 0x4e, 0xec, 0x09, 0x93, 0xb2, 0xbb, 0x1b, 0x8c, + 0xfc, 0x30, 0x11, 0x46, 0x90, 0xc1, 0x40, 0xe0, 0x23, 0x81, 0xe4, 0x89, 0xdb, 0x43, 0x8a, 0xed, + 0xc1, 0x0e, 0x08, 0x7a, 0x2d, 0x7a, 0x7b, 0x39, 0x35, 0xaa, 0x7a, 0x29, 0xd3, 0x43, 0x13, 0x5f, + 0x5c, 0x96, 0x3e, 0x97, 0x44, 0x30, 0xe7, 0x7b, 0x18, 0xea, 0x17, 0x01, 0xa2, 0x97, 0x21, 0x7c, + 0xac, 0xa9, 0x26, 0x17, 0xa5, 0x8a, 0xbd, 0x1c, 0xd3, 0x0a, 0xad, 0xc9, 0x3f, 0xa8, 0xd6, 0xd8, + 0x50, 0x34, 0xde, 0x0d, 0x3b, 0xf1, 0x53, 0x22, 0xb0, 0x22, 0x49, 0x96, 0xec, 0x4c, 0x3c, 0xfa, + 0x7b, 0x2c, 0x07, 0x4f, 0x8c, 0xfe, 0x1e, 0x31, 0x96, 0x5e, 0x83, 0x65, 0xd1, 0x41, 0xf5, 0xb6, + 0xbf, 0x8b, 0x7e, 0x40, 0x51, 0xe8, 0xa4, 0x84, 0x8e, 0x23, 0x10, 0xe1, 0x1d, 0xf7, 0xb6, 0xbf, + 0x4b, 0xe5, 0x9f, 0xce, 0x2d, 0xb1, 0xae, 0x44, 0xfb, 0xfc, 0x52, 0x02, 0x94, 0x25, 0x17, 0x77, + 0x13, 0xe9, 0x7f, 0x20, 0x5d, 0xa6, 0xa4, 0xb2, 0xc2, 0xdd, 0x48, 0x65, 0xe5, 0x5f, 0x4a, 0xb0, + 0xac, 0x29, 0x4d, 0x86, 0xbc, 0x4c, 0x2d, 0x11, 0x8f, 0xc2, 0x19, 0x4d, 0x69, 0x3a, 0x2d, 0xa3, + 0xa1, 0x55, 0xae, 0x3b, 0x63, 0x01, 0x15, 0xcf, 0xc0, 0xc3, 0x59, 0x92, 0xd8, 0x62, 0x71, 0x1a, + 0x56, 0xb3, 0xd9, 0x1c, 0x74, 0x71, 0x3c, 0x33, 0xc7, 0x67, 0xcc, 0x97, 0xaf, 0xc1, 0x32, 0xc7, + 0x22, 0xb4, 0x1b, 0x16, 0x81, 0x30, 0x5e, 0x86, 0xe2, 0xb6, 0x6a, 0x6a, 0xb5, 0xeb, 0x4e, 0xad, + 0xdd, 0x68, 0xc8, 0x47, 0xd0, 0x22, 0xcc, 0xb3, 0x84, 0x8a, 0x22, 0x4b, 0x68, 0x01, 0xe6, 0x34, + 0xdd, 0x52, 0x2b, 0x6d, 0x53, 0x95, 0x73, 0xe5, 0x6b, 0xb0, 0xd4, 0x1a, 0x78, 0xef, 0x77, 0x42, + 0x77, 0xcb, 0xbd, 0x4d, 0x0c, 0x0e, 0x47, 0x21, 0x6f, 0x2a, 0x3b, 0xf2, 0x11, 0x04, 0x30, 0xdb, + 0xda, 0xaa, 0x58, 0x97, 0x2f, 0xcb, 0x12, 0x2a, 0xc2, 0xd1, 0xcd, 0x4a, 0xcb, 0xd9, 0x6a, 0x5a, + 0x72, 0x0e, 0xff, 0x51, 0x76, 0x2c, 0xf2, 0x27, 0x5f, 0x7e, 0x06, 0x56, 0x88, 0xac, 0xd0, 0xf0, + 0x86, 0xa1, 0xeb, 0xbb, 0x03, 0x52, 0x87, 0x05, 0x98, 0xb3, 0x5c, 0xbc, 0xc8, 0x43, 0x97, 0x56, + 0xa0, 0x39, 0xea, 0x85, 0x5e, 0xbf, 0xe7, 0x7e, 0x20, 0x4b, 0xe5, 0xab, 0xb0, 0x6c, 0x06, 0xa3, + 0xd0, 0xf3, 0xf7, 0xac, 0x10, 0x53, 0xec, 0xdd, 0x46, 0x0f, 0xc1, 0x4a, 0x5b, 0x57, 0x9a, 0x1b, + 0xda, 0x66, 0xdb, 0x68, 0x5b, 0x4e, 0x53, 0xb1, 0x2b, 0x75, 0x6a, 0xee, 0x68, 0x1a, 0x96, 0xed, + 0x98, 0x6a, 0x45, 0xd5, 0x6d, 0x59, 0x2a, 0xff, 0x4c, 0x82, 0xa5, 0xf6, 0x90, 0x3d, 0xfd, 0x6e, + 0x13, 0x07, 0xce, 0xb3, 0x70, 0xba, 0x6d, 0xa9, 0xa6, 0x63, 0x1b, 0x5b, 0xaa, 0xee, 0xb4, 0x2d, + 0x65, 0x33, 0x8d, 0xe6, 0xf9, 0x08, 0x9c, 0x12, 0x28, 0x4c, 0xb5, 0x62, 0x6c, 0xab, 0xa6, 0xd3, + 0x52, 0x2c, 0x6b, 0xc7, 0x30, 0xab, 0xb2, 0x84, 0xd6, 0xe0, 0xc4, 0x18, 0x82, 0x66, 0x4d, 0x91, + 0x73, 0x99, 0x3c, 0x5d, 0xdd, 0x51, 0x1a, 0xce, 0x86, 0x61, 0xcb, 0xf9, 0x72, 0x13, 0x1f, 0x74, + 0x04, 0xf0, 0x8e, 0x86, 0x2b, 0x98, 0x83, 0x82, 0x6e, 0xe8, 0x6a, 0xda, 0x24, 0xb5, 0x00, 0x73, + 0x4a, 0xab, 0x65, 0x1a, 0xdb, 0x64, 0x40, 0x01, 0x66, 0xab, 0xaa, 0x8e, 0x6b, 0x96, 0xc7, 0x39, + 0x2d, 0xd3, 0x68, 0x1a, 0xb6, 0x5a, 0x95, 0x0b, 0x65, 0x93, 0x2f, 0x18, 0x5e, 0xe8, 0x6e, 0x40, + 0xed, 0x3f, 0x55, 0xb5, 0xa6, 0xb4, 0x1b, 0x36, 0xeb, 0x90, 0xeb, 0x8e, 0xa9, 0xbe, 0xd6, 0x56, + 0x2d, 0xdb, 0x92, 0x25, 0x24, 0xc3, 0x82, 0xae, 0xaa, 0x55, 0xcb, 0x31, 0xd5, 0x6d, 0x4d, 0xdd, + 0x91, 0x73, 0xb8, 0x4c, 0xfa, 0x1b, 0x7f, 0xa1, 0xfc, 0xa9, 0x04, 0x88, 0x82, 0x05, 0x72, 0x58, + 0x79, 0x32, 0x3e, 0xeb, 0xb0, 0x56, 0xc7, 0x1d, 0x4b, 0x9a, 0xd6, 0x34, 0xaa, 0xe9, 0x2e, 0x3b, + 0x01, 0x28, 0x95, 0x6f, 0xd4, 0x6a, 0xb2, 0x84, 0x4e, 0xc1, 0xb1, 0x54, 0x7a, 0xd5, 0x34, 0x5a, + 0x72, 0x6e, 0x2d, 0x37, 0x27, 0xa1, 0x93, 0x99, 0xcc, 0x2d, 0x55, 0x6d, 0xc9, 0x79, 0x3c, 0x44, + 0xa9, 0x0c, 0x3e, 0x01, 0x29, 0x7b, 0xa1, 0xfc, 0x91, 0x04, 0x27, 0x68, 0x35, 0xf9, 0x6c, 0x8e, + 0xaa, 0x7a, 0x1a, 0x56, 0x19, 0xae, 0xe9, 0xb8, 0x8a, 0x1e, 0x07, 0x39, 0x91, 0x4b, 0xab, 0xf9, + 0x10, 0xac, 0x24, 0x52, 0x49, 0x3d, 0x72, 0x78, 0xad, 0x26, 0x92, 0x37, 0x54, 0xcb, 0x76, 0xd4, + 0x5a, 0xcd, 0x30, 0x6d, 0x5a, 0x91, 0x7c, 0xb9, 0x04, 0x2b, 0x15, 0x77, 0x10, 0x62, 0x1d, 0xc4, + 0x1f, 0x7a, 0x81, 0x4f, 0xaa, 0xb0, 0x08, 0xf3, 0xea, 0xeb, 0xb6, 0xaa, 0x5b, 0x9a, 0xa1, 0xcb, + 0x47, 0xca, 0xa7, 0x53, 0x34, 0x7c, 0xd5, 0x58, 0x56, 0x5d, 0x3e, 0x52, 0xee, 0xc0, 0x22, 0x7f, + 0x6a, 0x4d, 0x67, 0xc5, 0x3a, 0xac, 0xf1, 0xb9, 0x46, 0xd6, 0x6f, 0xba, 0x09, 0xab, 0x70, 0x3c, + 0x9b, 0xaf, 0xda, 0xb2, 0x84, 0x47, 0x21, 0x95, 0x83, 0xd3, 0x73, 0xe5, 0xdf, 0x4b, 0xb0, 0xca, + 0x02, 0xb8, 0x32, 0x7b, 0x04, 0x85, 0x52, 0x27, 0xb0, 0x84, 0x65, 0xb8, 0x60, 0x9b, 0x6d, 0xcb, + 0x56, 0xab, 0x4e, 0x55, 0xdd, 0xd6, 0x2a, 0x2a, 0x99, 0x2e, 0x9a, 0xa9, 0x36, 0x55, 0xdd, 0x4e, + 0x7d, 0xfa, 0x09, 0x78, 0x6c, 0x0a, 0xad, 0x6e, 0xd8, 0xfc, 0x3f, 0x5e, 0x25, 0x8f, 0xc1, 0xff, + 0x4d, 0x21, 0x8e, 0x08, 0x73, 0xe5, 0x37, 0x61, 0x21, 0x11, 0x1e, 0xe6, 0x24, 0x1c, 0x13, 0xff, + 0xb7, 0x5c, 0xbf, 0xeb, 0xf9, 0x7b, 0xf2, 0x91, 0x74, 0x86, 0x39, 0xf2, 0x7d, 0x9c, 0x41, 0x16, + 0xa4, 0x98, 0x61, 0xbb, 0x83, 0x03, 0xcf, 0xef, 0x84, 0x6e, 0x57, 0xce, 0x95, 0x2f, 0xc1, 0x62, + 0x02, 0xbf, 0x12, 0xf7, 0x7c, 0xc3, 0x60, 0xfb, 0x55, 0x53, 0xad, 0x6a, 0xed, 0xa6, 0x3c, 0x83, + 0x97, 0x62, 0x5d, 0xdb, 0xac, 0xcb, 0x50, 0xfe, 0x44, 0xc2, 0x12, 0x33, 0xe9, 0x9f, 0x66, 0x4d, + 0xe1, 0x63, 0x85, 0xe7, 0x09, 0x85, 0xba, 0x55, 0x2d, 0x8b, 0x9a, 0x52, 0x4f, 0xc3, 0x2a, 0xfb, + 0xe3, 0x28, 0x7a, 0xd5, 0xa9, 0x2b, 0x66, 0x75, 0x47, 0x31, 0xf1, 0xe4, 0xb9, 0x2e, 0xe7, 0xc8, + 0x8a, 0x10, 0x52, 0x1c, 0xdb, 0x68, 0x57, 0xea, 0x72, 0x1e, 0x4f, 0xc0, 0x44, 0x7a, 0x4b, 0xd3, + 0xe5, 0x02, 0x59, 0x5f, 0x19, 0x6a, 0x52, 0x2c, 0xce, 0x9f, 0x29, 0xdf, 0x91, 0xe0, 0xa4, 0xe5, + 0xed, 0xf9, 0x9d, 0x70, 0x34, 0x70, 0x95, 0xde, 0x5e, 0x30, 0xf0, 0xc2, 0xfd, 0x03, 0x6b, 0xe4, + 0x85, 0x2e, 0xba, 0x08, 0xe7, 0x2d, 0x6d, 0x53, 0x57, 0x6c, 0xbc, 0x3e, 0x94, 0xc6, 0xa6, 0x61, + 0x6a, 0x76, 0xbd, 0xe9, 0x58, 0x6d, 0x2d, 0x33, 0x75, 0xce, 0xc1, 0xd9, 0xc9, 0xa4, 0x0d, 0x75, + 0x53, 0xa9, 0x5c, 0x97, 0xa5, 0xe9, 0x05, 0x6e, 0x28, 0x0d, 0x45, 0xaf, 0xa8, 0x55, 0x67, 0xfb, + 0xb2, 0x9c, 0x43, 0xe7, 0xe1, 0xd1, 0xc9, 0xa4, 0x35, 0xad, 0x65, 0x61, 0xb2, 0xfc, 0xf4, 0xef, + 0xd6, 0xad, 0x26, 0xa6, 0x2a, 0x94, 0x3d, 0x90, 0xd3, 0x9e, 0xf9, 0x19, 0xc3, 0xbd, 0xd9, 0xd6, + 0x75, 0xba, 0x4b, 0x2e, 0x43, 0xd1, 0xb0, 0xeb, 0xaa, 0xc9, 0x10, 0x97, 0x09, 0xc4, 0x72, 0x5b, + 0x57, 0xda, 0x76, 0xdd, 0x30, 0xb5, 0x1b, 0x64, 0xbb, 0x5c, 0x85, 0xe3, 0x56, 0x43, 0xa9, 0x6c, + 0x91, 0x99, 0xa9, 0xe9, 0x4e, 0xa5, 0xae, 0xe8, 0xba, 0xda, 0x90, 0xa1, 0xfc, 0x5b, 0x89, 0x5a, + 0xd0, 0xc7, 0xb9, 0xf0, 0xa1, 0x27, 0xe1, 0x71, 0x63, 0xcb, 0x56, 0x9c, 0x56, 0xa3, 0xbd, 0xa9, + 0xe9, 0x8e, 0x75, 0x5d, 0xaf, 0xf0, 0x83, 0xb4, 0x92, 0xdd, 0x51, 0x1e, 0x87, 0x73, 0x53, 0xa9, + 0x63, 0x6c, 0xe4, 0x0b, 0x50, 0x9a, 0x4a, 0xc9, 0x1a, 0x52, 0xfe, 0x42, 0x82, 0x53, 0x53, 0x2c, + 0x8f, 0xe8, 0x29, 0xb8, 0x58, 0x57, 0x95, 0x6a, 0x43, 0xb5, 0x2c, 0x07, 0xb7, 0x57, 0xd5, 0x6d, + 0x66, 0xe0, 0x1f, 0xbb, 0x5f, 0x5c, 0x84, 0xf3, 0xd3, 0xc9, 0xe3, 0x93, 0xe7, 0x71, 0x38, 0x37, + 0x9d, 0x94, 0x9d, 0x44, 0x39, 0xbc, 0x6b, 0x4c, 0xa7, 0x8c, 0x4e, 0xb0, 0x7c, 0xf9, 0x63, 0x09, + 0x4e, 0x8c, 0x57, 0xd8, 0x71, 0xdd, 0x34, 0xdd, 0xb2, 0x95, 0x46, 0xc3, 0x69, 0x29, 0xa6, 0xd2, + 0x74, 0x54, 0xdd, 0x34, 0x1a, 0x8d, 0x71, 0x3b, 0xf7, 0x39, 0x38, 0x3b, 0x99, 0xd4, 0xaa, 0x98, + 0x5a, 0x0b, 0x6f, 0x81, 0x25, 0x58, 0x9f, 0x4c, 0xa5, 0x6a, 0x15, 0x55, 0xce, 0x6d, 0xbc, 0xfc, + 0xd9, 0x3f, 0xd6, 0x8f, 0x7c, 0x76, 0x67, 0x5d, 0xfa, 0xf2, 0xce, 0xba, 0xf4, 0xf7, 0x3b, 0xeb, + 0xd2, 0x8d, 0x27, 0xee, 0x22, 0xfa, 0xfc, 0xdb, 0xb3, 0xe4, 0x45, 0xcb, 0x95, 0xff, 0x04, 0x00, + 0x00, 0xff, 0xff, 0x83, 0x0f, 0x8e, 0x93, 0x9d, 0x94, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -43249,7 +43436,7 @@ func (m *AgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ScheduledAgentUpgradeWindow) Marshal() (dAtA []byte, err error) { +func (m *ClusterAutoUpdateConfigV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43259,12 +43446,12 @@ func (m *ScheduledAgentUpgradeWindow) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ScheduledAgentUpgradeWindow) MarshalTo(dAtA []byte) (int, error) { +func (m *ClusterAutoUpdateConfigV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ClusterAutoUpdateConfigV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43273,26 +43460,35 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n356, err356 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err356 != nil { - return 0, err356 + if m.Nonce != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Nonce)) + i-- + dAtA[i] = 0x18 + } + { + size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - i -= n356 - i = encodeVarintTypes(dAtA, i, uint64(n356)) i-- dAtA[i] = 0x12 - n357, err357 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) - if err357 != nil { - return 0, err357 + { + size, err := m.ResourceHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) } - i -= n357 - i = encodeVarintTypes(dAtA, i, uint64(n357)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *AgentUpgradeSchedule) Marshal() (dAtA []byte, err error) { +func (m *ClusterAutoUpdateConfigSpecV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43302,12 +43498,12 @@ func (m *AgentUpgradeSchedule) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AgentUpgradeSchedule) MarshalTo(dAtA []byte) (int, error) { +func (m *ClusterAutoUpdateConfigSpecV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AgentUpgradeSchedule) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ClusterAutoUpdateConfigSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43316,24 +43512,20 @@ func (m *AgentUpgradeSchedule) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Windows) > 0 { - for iNdEx := len(m.Windows) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Windows[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + if m.ToolsAutoUpdate { + i-- + if m.ToolsAutoUpdate { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *UserGroupV1) Marshal() (dAtA []byte, err error) { +func (m *AutoUpdateVersionV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43343,12 +43535,12 @@ func (m *UserGroupV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *UserGroupV1) MarshalTo(dAtA []byte) (int, error) { +func (m *AutoUpdateVersionV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *UserGroupV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *AutoUpdateVersionV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43357,6 +43549,11 @@ func (m *UserGroupV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Nonce != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Nonce)) + i-- + dAtA[i] = 0x18 + } { size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -43380,7 +43577,7 @@ func (m *UserGroupV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *UserGroupSpecV1) Marshal() (dAtA []byte, err error) { +func (m *AutoupdateVersionSpecV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43390,12 +43587,12 @@ func (m *UserGroupSpecV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *UserGroupSpecV1) MarshalTo(dAtA []byte) (int, error) { +func (m *AutoupdateVersionSpecV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *UserGroupSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *AutoupdateVersionSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43404,19 +43601,17 @@ func (m *UserGroupSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Applications) > 0 { - for iNdEx := len(m.Applications) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Applications[iNdEx]) - copy(dAtA[i:], m.Applications[iNdEx]) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Applications[iNdEx]))) - i-- - dAtA[i] = 0xa - } + if len(m.ToolsVersion) > 0 { + i -= len(m.ToolsVersion) + copy(dAtA[i:], m.ToolsVersion) + i = encodeVarintTypes(dAtA, i, uint64(len(m.ToolsVersion))) + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *OktaImportRuleSpecV1) Marshal() (dAtA []byte, err error) { +func (m *ScheduledAgentUpgradeWindow) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43426,12 +43621,12 @@ func (m *OktaImportRuleSpecV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *OktaImportRuleSpecV1) MarshalTo(dAtA []byte) (int, error) { +func (m *ScheduledAgentUpgradeWindow) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *OktaImportRuleSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43440,29 +43635,26 @@ func (m *OktaImportRuleSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Mappings) > 0 { - for iNdEx := len(m.Mappings) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Mappings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + n360, err360 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) + if err360 != nil { + return 0, err360 } - if m.Priority != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Priority)) - i-- - dAtA[i] = 0x8 + i -= n360 + i = encodeVarintTypes(dAtA, i, uint64(n360)) + i-- + dAtA[i] = 0x12 + n361, err361 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err361 != nil { + return 0, err361 } + i -= n361 + i = encodeVarintTypes(dAtA, i, uint64(n361)) + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *OktaImportRuleMappingV1) Marshal() (dAtA []byte, err error) { +func (m *AgentUpgradeSchedule) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43472,12 +43664,12 @@ func (m *OktaImportRuleMappingV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *OktaImportRuleMappingV1) MarshalTo(dAtA []byte) (int, error) { +func (m *AgentUpgradeSchedule) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *OktaImportRuleMappingV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *AgentUpgradeSchedule) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43486,29 +43678,10 @@ func (m *OktaImportRuleMappingV1) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.AddLabels) > 0 { - for k := range m.AddLabels { - v := m.AddLabels[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintTypes(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintTypes(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintTypes(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Match) > 0 { - for iNdEx := len(m.Match) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Windows) > 0 { + for iNdEx := len(m.Windows) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Match[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Windows[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -43522,7 +43695,7 @@ func (m *OktaImportRuleMappingV1) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } -func (m *OktaImportRuleV1) Marshal() (dAtA []byte, err error) { +func (m *UserGroupV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43532,12 +43705,201 @@ func (m *OktaImportRuleV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *OktaImportRuleV1) MarshalTo(dAtA []byte) (int, error) { +func (m *UserGroupV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *OktaImportRuleV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *UserGroupV1) 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.Spec.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ResourceHeader.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *UserGroupSpecV1) 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 *UserGroupSpecV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UserGroupSpecV1) 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.Applications) > 0 { + for iNdEx := len(m.Applications) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Applications[iNdEx]) + copy(dAtA[i:], m.Applications[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Applications[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *OktaImportRuleSpecV1) 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 *OktaImportRuleSpecV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OktaImportRuleSpecV1) 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.Mappings) > 0 { + for iNdEx := len(m.Mappings) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Mappings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Priority != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Priority)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *OktaImportRuleMappingV1) 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 *OktaImportRuleMappingV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OktaImportRuleMappingV1) 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.AddLabels) > 0 { + for k := range m.AddLabels { + v := m.AddLabels[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintTypes(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintTypes(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintTypes(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Match) > 0 { + for iNdEx := len(m.Match) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Match[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *OktaImportRuleV1) 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 *OktaImportRuleV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *OktaImportRuleV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43713,12 +44075,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n364, err364 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err364 != nil { - return 0, err364 + n368, err368 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err368 != nil { + return 0, err368 } - i -= n364 - i = encodeVarintTypes(dAtA, i, uint64(n364)) + i -= n368 + i = encodeVarintTypes(dAtA, i, uint64(n368)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -43726,12 +44088,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n365, err365 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err365 != nil { - return 0, err365 + n369, err369 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err369 != nil { + return 0, err369 } - i -= n365 - i = encodeVarintTypes(dAtA, i, uint64(n365)) + i -= n369 + i = encodeVarintTypes(dAtA, i, uint64(n369)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -54645,6 +55007,75 @@ func (m *AgentUpgradeWindow) Size() (n int) { return n } +func (m *ClusterAutoUpdateConfigV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ResourceHeader.Size() + n += 1 + l + sovTypes(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.Nonce != 0 { + n += 1 + sovTypes(uint64(m.Nonce)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ClusterAutoUpdateConfigSpecV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ToolsAutoUpdate { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AutoUpdateVersionV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ResourceHeader.Size() + n += 1 + l + sovTypes(uint64(l)) + l = m.Spec.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.Nonce != 0 { + n += 1 + sovTypes(uint64(m.Nonce)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AutoupdateVersionSpecV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.ToolsVersion) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ScheduledAgentUpgradeWindow) Size() (n int) { if m == nil { return 0 @@ -113932,7 +114363,480 @@ func (m *PluginStaticCredentialsRef) Unmarshal(dAtA []byte) error { } return nil } -func (m *PluginListV1) Unmarshal(dAtA []byte) error { +func (m *PluginListV1) 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: PluginListV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PluginListV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Plugins", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Plugins = append(m.Plugins, &PluginV1{}) + if err := m.Plugins[len(m.Plugins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PluginStaticCredentialsV1) 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: PluginStaticCredentialsV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PluginStaticCredentialsV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceHeader", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Spec == nil { + m.Spec = &PluginStaticCredentialsSpecV1{} + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *PluginStaticCredentialsSpecV1) 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: PluginStaticCredentialsSpecV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PluginStaticCredentialsSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field APIToken", 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.Credentials = &PluginStaticCredentialsSpecV1_APIToken{string(dAtA[iNdEx:postIndex])} + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BasicAuth", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &PluginStaticCredentialsBasicAuth{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Credentials = &PluginStaticCredentialsSpecV1_BasicAuth{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field OAuthClientSecret", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &PluginStaticCredentialsOAuthClientSecret{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Credentials = &PluginStaticCredentialsSpecV1_OAuthClientSecret{v} + 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 *PluginStaticCredentialsBasicAuth) 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: PluginStaticCredentialsBasicAuth: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PluginStaticCredentialsBasicAuth: 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 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.Username = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", 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.Password = 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 *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -113955,17 +114859,17 @@ func (m *PluginListV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PluginListV1: wiretype end group for non-group") + return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PluginListV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Plugins", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -113975,25 +114879,55 @@ func (m *PluginListV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Plugins = append(m.Plugins, &PluginV1{}) - if err := m.Plugins[len(m.Plugins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", 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.ClientSecret = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -114017,7 +114951,7 @@ func (m *PluginListV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *PluginStaticCredentialsV1) Unmarshal(dAtA []byte) error { +func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114040,10 +114974,10 @@ func (m *PluginStaticCredentialsV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PluginStaticCredentialsV1: wiretype end group for non-group") + return fmt.Errorf("proto: SAMLIdPServiceProviderV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SAMLIdPServiceProviderV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -114108,9 +115042,6 @@ func (m *PluginStaticCredentialsV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Spec == nil { - m.Spec = &PluginStaticCredentialsSpecV1{} - } if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -114137,7 +115068,7 @@ func (m *PluginStaticCredentialsV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { +func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114160,15 +115091,15 @@ func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PluginStaticCredentialsSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field APIToken", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptor", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -114196,13 +115127,13 @@ func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Credentials = &PluginStaticCredentialsSpecV1_APIToken{string(dAtA[iNdEx:postIndex])} + m.EntityDescriptor = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BasicAuth", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EntityID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -114212,30 +115143,59 @@ func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - v := &PluginStaticCredentialsBasicAuth{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Credentials = &PluginStaticCredentialsSpecV1_BasicAuth{v} + m.EntityID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OAuthClientSecret", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ACSURL", 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.ACSURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AttributeMapping", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -114262,11 +115222,74 @@ func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &PluginStaticCredentialsOAuthClientSecret{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.AttributeMapping = append(m.AttributeMapping, &SAMLAttributeMapping{}) + if err := m.AttributeMapping[len(m.AttributeMapping)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Credentials = &PluginStaticCredentialsSpecV1_OAuthClientSecret{v} + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Preset", 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.Preset = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RelayState", 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.RelayState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -114290,7 +115313,7 @@ func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *PluginStaticCredentialsBasicAuth) Unmarshal(dAtA []byte) error { +func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114313,15 +115336,15 @@ func (m *PluginStaticCredentialsBasicAuth) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PluginStaticCredentialsBasicAuth: wiretype end group for non-group") + return fmt.Errorf("proto: SAMLAttributeMapping: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsBasicAuth: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SAMLAttributeMapping: 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 Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -114349,11 +115372,11 @@ func (m *PluginStaticCredentialsBasicAuth) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Username = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NameFormat", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -114381,7 +115404,39 @@ func (m *PluginStaticCredentialsBasicAuth) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Password = string(dAtA[iNdEx:postIndex]) + m.NameFormat = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", 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.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -114405,7 +115460,7 @@ func (m *PluginStaticCredentialsBasicAuth) Unmarshal(dAtA []byte) error { } return nil } -func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error { +func (m *IdPOptions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114428,17 +115483,17 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: wiretype end group for non-group") + return fmt.Errorf("proto: IdPOptions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: IdPOptions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAML", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -114448,55 +115503,27 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", 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 m.SAML == nil { + m.SAML = &IdPSAMLOptions{} } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.SAML.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.ClientSecret = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -114520,7 +115547,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error } return nil } -func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { +func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114543,15 +115570,15 @@ func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLIdPServiceProviderV1: wiretype end group for non-group") + return fmt.Errorf("proto: IdPSAMLOptions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLIdPServiceProviderV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: IdPSAMLOptions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceHeader", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -114578,40 +115605,10 @@ func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF + if m.Enabled == nil { + m.Enabled = &BoolOption{} } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Enabled.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -114637,7 +115634,7 @@ func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { +func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114660,15 +115657,15 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: KubernetesResourceV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: KubernetesResourceV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptor", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -114696,11 +115693,11 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EntityDescriptor = string(dAtA[iNdEx:postIndex]) + m.Kind = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EntityID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -114728,11 +115725,11 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EntityID = string(dAtA[iNdEx:postIndex]) + m.SubKind = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ACSURL", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -114760,11 +115757,11 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ACSURL = string(dAtA[iNdEx:postIndex]) + m.Version = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AttributeMapping", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -114791,16 +115788,15 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AttributeMapping = append(m.AttributeMapping, &SAMLAttributeMapping{}) - if err := m.AttributeMapping[len(m.AttributeMapping)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Preset", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -114810,55 +115806,24 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Preset = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RelayState", 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 + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.RelayState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -114882,7 +115847,7 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { +func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114905,79 +115870,15 @@ func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLAttributeMapping: wiretype end group for non-group") + return fmt.Errorf("proto: KubernetesResourceSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLAttributeMapping: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: KubernetesResourceSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", 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.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NameFormat", 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.NameFormat = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115005,7 +115906,7 @@ func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + m.Namespace = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -115029,7 +115930,7 @@ func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { } return nil } -func (m *IdPOptions) Unmarshal(dAtA []byte) error { +func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115052,15 +115953,15 @@ func (m *IdPOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: IdPOptions: wiretype end group for non-group") + return fmt.Errorf("proto: ClusterMaintenanceConfigV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: IdPOptions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ClusterMaintenanceConfigV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SAML", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceHeader", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115087,13 +115988,62 @@ func (m *IdPOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.SAML == nil { - m.SAML = &IdPSAMLOptions{} + if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if err := m.SAML.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + m.Nonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -115116,7 +116066,7 @@ func (m *IdPOptions) Unmarshal(dAtA []byte) error { } return nil } -func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { +func (m *ClusterMaintenanceConfigSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115139,15 +116089,15 @@ func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: IdPSAMLOptions: wiretype end group for non-group") + return fmt.Errorf("proto: ClusterMaintenanceConfigSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: IdPSAMLOptions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ClusterMaintenanceConfigSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AgentUpgrades", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115174,10 +116124,10 @@ func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Enabled == nil { - m.Enabled = &BoolOption{} + if m.AgentUpgrades == nil { + m.AgentUpgrades = &AgentUpgradeWindow{} } - if err := m.Enabled.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.AgentUpgrades.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -115203,7 +116153,7 @@ func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { } return nil } -func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { +func (m *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115226,17 +116176,17 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: KubernetesResourceV1: wiretype end group for non-group") + return fmt.Errorf("proto: AgentUpgradeWindow: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: KubernetesResourceV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AgentUpgradeWindow: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UTCStartHour", wireType) } - var stringLen uint64 + m.UTCStartHour = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -115246,27 +116196,14 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.UTCStartHour |= uint32(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Kind = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Weekdays", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115294,43 +116231,62 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SubKind = string(dAtA[iNdEx:postIndex]) + m.Weekdays = append(m.Weekdays, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", 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 - } + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if (skippy < 0) || (iNdEx+skippy) < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthTypes + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF } - if postIndex > l { + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ClusterAutoUpdateConfigV1) 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 } - m.Version = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: + 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: ClusterAutoUpdateConfigV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterAutoUpdateConfigV1: 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 ResourceHeader", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115357,11 +116313,11 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } @@ -115394,6 +116350,25 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + } + m.Nonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Nonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -115416,7 +116391,7 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { +func (m *ClusterAutoUpdateConfigSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115439,17 +116414,17 @@ func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: KubernetesResourceSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: ClusterAutoUpdateConfigSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: KubernetesResourceSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ClusterAutoUpdateConfigSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ToolsAutoUpdate", wireType) } - var stringLen uint64 + var v int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -115459,24 +116434,12 @@ func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + v |= int(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.Namespace = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + m.ToolsAutoUpdate = bool(v != 0) default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -115499,7 +116462,7 @@ func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115522,10 +116485,10 @@ func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ClusterMaintenanceConfigV1: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterMaintenanceConfigV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -115635,94 +116598,7 @@ func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClusterMaintenanceConfigSpecV1) 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: ClusterMaintenanceConfigSpecV1: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterMaintenanceConfigSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AgentUpgrades", 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.AgentUpgrades == nil { - m.AgentUpgrades = &AgentUpgradeWindow{} - } - if err := m.AgentUpgrades.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 *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { +func (m *AutoupdateVersionSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115745,34 +116621,15 @@ func (m *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AgentUpgradeWindow: wiretype end group for non-group") + return fmt.Errorf("proto: AutoupdateVersionSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AgentUpgradeWindow: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoupdateVersionSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UTCStartHour", wireType) - } - m.UTCStartHour = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.UTCStartHour |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Weekdays", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ToolsVersion", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115800,7 +116657,7 @@ func (m *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Weekdays = append(m.Weekdays, string(dAtA[iNdEx:postIndex])) + m.ToolsVersion = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index a526a239802f4..fda8322e9b7eb 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -101,6 +101,7 @@ type Config struct { WebSession types.WebSessionInterface WebToken types.WebTokenInterface WindowsDesktops services.WindowsDesktops + ClusterAutoUpdate services.ClusterAutoUpdate } func (c *Config) CheckAndSetDefaults() error { @@ -165,6 +166,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { AppSession: cfg.AppSession, Apps: cfg.Apps, ClusterConfig: cfg.ClusterConfig, + ClusterAutoUpdate: cfg.ClusterAutoUpdate, CrownJewels: cfg.CrownJewels, DatabaseObjects: cfg.DatabaseObjects, DatabaseServices: cfg.DatabaseServices, diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 6c5d681d0cf5e..bc4611cea607d 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -199,6 +199,9 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { } cfg.ClusterConfiguration = clusterConfig } + if cfg.ClusterAutoUpdate == nil { + cfg.ClusterAutoUpdate = local.NewClusterAutoUpdateService(cfg.Backend) + } if cfg.Restrictions == nil { cfg.Restrictions = local.NewRestrictionsService(cfg.Backend) } @@ -398,6 +401,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { Access: cfg.Access, DynamicAccessExt: cfg.DynamicAccessExt, ClusterConfiguration: cfg.ClusterConfiguration, + ClusterAutoUpdate: cfg.ClusterAutoUpdate, Restrictions: cfg.Restrictions, Apps: cfg.Apps, Kubernetes: cfg.Kubernetes, @@ -623,6 +627,7 @@ type Services struct { services.BotInstance services.AccessGraphSecretsGetter services.DevicesGetter + services.ClusterAutoUpdate } // GetWebSession returns existing web session described by req. diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 7f0f89ab4e81b..3b5862a0cfc92 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -304,6 +304,12 @@ type ReadProxyAccessPoint interface { // GetUserGroup returns the specified user group resources. GetUserGroup(ctx context.Context, name string) (types.UserGroup, error) + + // GetClusterAutoUpdateConfig gets the cluster autoupdate config from the backend. + GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) + + // GetAutoUpdateVersion gets the autoupdate version from the backend. + GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) } // SnowflakeSessionWatcher is watcher interface used by Snowflake web session watcher. diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index f1c182fc9d054..214a3c502caf6 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -359,6 +359,44 @@ func (c *Client) SearchSessionEvents(ctx context.Context, req events.SearchSessi return events, lastKey, nil } +// UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. +func (c *Client) UpsertClusterAutoUpdateConfig(ctx context.Context, config types.ClusterAutoUpdateConfig) error { + return trace.NotImplemented(notImplementedMessage) +} + +// GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. +func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) { + config, err := c.APIClient.GetClusterAutoUpdateConfig(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + return config, nil +} + +// DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. +func (c *Client) DeleteAutoUpdateVersion(ctx context.Context) error { + return trace.NotImplemented(notImplementedMessage) +} + +// UpsertAutoUpdateVersion sets cluster autoupdate version. +func (c *Client) UpsertAutoUpdateVersion(ctx context.Context, config types.AutoUpdateVersion) error { + return trace.NotImplemented(notImplementedMessage) +} + +// GetAutoUpdateVersion gets the autoupdate version from the backend. +func (c *Client) GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) { + config, err := c.APIClient.GetAutoUpdateVersion(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + return config, nil +} + +// DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. +func (c *Client) DeleteClusterAutoUpdateConfig(ctx context.Context) error { + return trace.NotImplemented(notImplementedMessage) +} + // UpsertClusterName not implemented: can only be called locally. func (c *Client) UpsertClusterName(cn types.ClusterName) error { return trace.NotImplemented(notImplementedMessage) @@ -1466,6 +1504,7 @@ type ClientI interface { WebService services.Status services.ClusterConfiguration + services.ClusterAutoUpdate services.SessionTrackerService services.ConnectionsDiagnostic services.SAMLIdPSession diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 368bf60215f85..8329dfa4771b9 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -506,7 +506,6 @@ func WatchEvents(watch *authpb.Watch, stream WatchEvent, componentName string, a Kinds: watch.Kinds, AllowPartialSuccess: watch.AllowPartialSuccess, } - events, err := auth.NewStream(stream.Context(), servicesWatch) if err != nil { return trace.Wrap(err) @@ -5050,6 +5049,36 @@ func (g *GRPCServer) DeleteClusterMaintenanceConfig(ctx context.Context, _ *empt return &emptypb.Empty{}, nil } +// GetClusterAutoUpdateConfig gets the current autoupdate config singleton. +func (g *GRPCServer) GetClusterAutoUpdateConfig(ctx context.Context, _ *emptypb.Empty) (*types.ClusterAutoUpdateConfigV1, error) { + config, err := g.AuthServer.GetClusterAutoUpdateConfig(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + rsp, ok := config.(*types.ClusterAutoUpdateConfigV1) + if !ok { + return nil, trace.BadParameter("unexpected autoupdate config type %T", config) + } + + return rsp, nil +} + +// GetAutoUpdateVersion gets the current autoupdate version singleton. +func (g *GRPCServer) GetAutoUpdateVersion(ctx context.Context, _ *emptypb.Empty) (*types.AutoUpdateVersionV1, error) { + version, err := g.AuthServer.GetAutoUpdateVersion(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + rsp, ok := version.(*types.AutoUpdateVersionV1) + if !ok { + return nil, trace.BadParameter("unexpected autoupdate version type %T", version) + } + + return rsp, nil +} + // GetBackend returns the backend from the underlying auth server. func (g *GRPCServer) GetBackend() backend.Backend { return g.AuthServer.bk diff --git a/lib/auth/init.go b/lib/auth/init.go index 02e598816eb47..a92c07ac462a8 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -158,6 +158,9 @@ type InitConfig struct { // ClusterConfiguration is a services that holds cluster wide configuration. ClusterConfiguration services.ClusterConfiguration + // ClusterAutoUpdate is a services that holds cluster wide configuration. + ClusterAutoUpdate services.ClusterAutoUpdate + // Restrictions is a service to access network restrictions, etc Restrictions services.Restrictions diff --git a/lib/authz/permissions.go b/lib/authz/permissions.go index fc16841e602c5..38ae2b304126c 100644 --- a/lib/authz/permissions.go +++ b/lib/authz/permissions.go @@ -913,6 +913,8 @@ func roleSpecForProxy(clusterName string) types.RoleSpecV6 { types.NewRule(types.KindSAMLIdPServiceProvider, services.RO()), types.NewRule(types.KindUserGroup, services.RO()), types.NewRule(types.KindClusterMaintenanceConfig, services.RO()), + types.NewRule(types.KindClusterAutoUpdateConfig, services.RO()), + types.NewRule(types.KindAutoUpdateVersion, services.RO()), types.NewRule(types.KindIntegration, append(services.RO(), types.VerbUse)), types.NewRule(types.KindAuditQuery, services.RO()), types.NewRule(types.KindSecurityReport, services.RO()), diff --git a/lib/cache/cache.go b/lib/cache/cache.go index a744ea0df5f25..31921a54378c8 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -182,6 +182,8 @@ func ForAuth(cfg Config) Config { {Kind: types.KindAccessMonitoringRule}, {Kind: types.KindDatabaseObject}, {Kind: types.KindAccessGraphSettings}, + {Kind: types.KindAutoUpdateVersion}, + {Kind: types.KindClusterAutoUpdateConfig}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream @@ -234,6 +236,8 @@ func ForProxy(cfg Config) Config { {Kind: types.KindSecurityReport}, {Kind: types.KindSecurityReportState}, {Kind: types.KindKubeWaitingContainer}, + {Kind: types.KindClusterAutoUpdateConfig}, + {Kind: types.KindAutoUpdateVersion}, } cfg.QueueSize = defaults.ProxyQueueSize return cfg @@ -487,6 +491,7 @@ type Cache struct { trustCache services.Trust clusterConfigCache services.ClusterConfiguration + clusterAutoUpdateCache services.ClusterAutoUpdate provisionerCache services.Provisioner usersCache services.UsersService accessCache services.Access @@ -633,6 +638,8 @@ type Config struct { Trust services.Trust // ClusterConfig is a cluster configuration service ClusterConfig services.ClusterConfiguration + // ClusterAutoUpdate is a cluster autoupdate configuration service + ClusterAutoUpdate services.ClusterAutoUpdate // Provisioner is a provisioning service Provisioner services.Provisioner // Users is a users service @@ -934,6 +941,7 @@ func New(config Config) (*Cache, error) { fnCache: fnCache, trustCache: local.NewCAService(config.Backend), clusterConfigCache: clusterConfigCache, + clusterAutoUpdateCache: local.NewClusterAutoUpdateService(config.Backend), provisionerCache: local.NewProvisioningService(config.Backend), usersCache: local.NewIdentityService(config.Backend), accessCache: local.NewAccessService(config.Backend), @@ -1857,6 +1865,52 @@ func (c *Cache) GetClusterName(opts ...services.MarshalOption) (types.ClusterNam return rg.reader.GetClusterName(opts...) } +// GetClusterAutoUpdateConfig gets the cluster autoupdate config from the backend. +func (c *Cache) GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetClusterAutoUpdateConfig") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.clusterAutoUpdates) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + if !rg.IsCacheRead() { + cachedConfig, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (types.ClusterAutoUpdateConfig, error) { + cfg, err := rg.reader.GetClusterAutoUpdateConfig(ctx, opts...) + return cfg, err + }) + if err != nil { + return nil, trace.Wrap(err) + } + return cachedConfig.Clone(), nil + } + return rg.reader.GetClusterAutoUpdateConfig(ctx, opts...) +} + +// GetAutoUpdateVersion gets the autoupdate version from the backend. +func (c *Cache) GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetAutoUpdateVersion") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.autoUpdateVersions) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + if !rg.IsCacheRead() { + cachedVersion, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (types.AutoUpdateVersion, error) { + cfg, err := rg.reader.GetAutoUpdateVersion(ctx, opts...) + return cfg, err + }) + if err != nil { + return nil, trace.Wrap(err) + } + return cachedVersion.Clone(), nil + } + return rg.reader.GetAutoUpdateVersion(ctx, opts...) +} + func (c *Cache) GetUIConfig(ctx context.Context) (types.UIConfig, error) { ctx, span := c.Tracer.Start(ctx, "cache/GetUIConfig") defer span.End() diff --git a/lib/cache/collections.go b/lib/cache/collections.go index f4e8592c53d85..1ea2ab30bf2cf 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -250,6 +250,8 @@ type cacheCollections struct { accessGraphSettings collectionReader[accessGraphSettingsGetter] globalNotifications collectionReader[notificationGetter] accessMonitoringRules collectionReader[accessMonitoringRuleGetter] + clusterAutoUpdates collectionReader[clusterAutoupdateGetter] + autoUpdateVersions collectionReader[autoUpdateVersionGetter] } // setupCollections returns a registry of collections. @@ -742,6 +744,24 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e watch: watch, } collections.byKind[resourceKind] = collections.accessGraphSettings + case types.KindClusterAutoUpdateConfig: + if c.ClusterAutoUpdate == nil { + return nil, trace.BadParameter("missing parameter ClusterAutoUpdate") + } + collections.clusterAutoUpdates = &genericCollection[types.ClusterAutoUpdateConfig, clusterAutoupdateGetter, clusterAutoupdateExecutor]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.clusterAutoUpdates + case types.KindAutoUpdateVersion: + if c.ClusterAutoUpdate == nil { + return nil, trace.BadParameter("missing parameter ClusterAutoUpdate") + } + collections.autoUpdateVersions = &genericCollection[types.AutoUpdateVersion, autoUpdateVersionGetter, autoUpdateVersionExecutor]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.autoUpdateVersions default: return nil, trace.BadParameter("resource %q is not supported", watch.Kind) } @@ -1247,7 +1267,73 @@ type clusterNameGetter interface { GetClusterName(opts ...services.MarshalOption) (types.ClusterName, error) } -var _ executor[types.ClusterName, clusterNameGetter] = clusterNameExecutor{} +type clusterAutoupdateExecutor struct{} + +func (clusterAutoupdateExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.ClusterAutoUpdateConfig, error) { + config, err := cache.ClusterAutoUpdate.GetClusterAutoUpdateConfig(ctx) + return []types.ClusterAutoUpdateConfig{config}, trace.Wrap(err) +} + +func (clusterAutoupdateExecutor) upsert(ctx context.Context, cache *Cache, resource types.ClusterAutoUpdateConfig) error { + return cache.clusterAutoUpdateCache.UpsertClusterAutoUpdateConfig(ctx, resource) +} + +func (clusterAutoupdateExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.clusterAutoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) +} + +func (clusterAutoupdateExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.clusterAutoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) +} + +func (clusterAutoupdateExecutor) isSingleton() bool { return true } + +func (clusterAutoupdateExecutor) getReader(cache *Cache, cacheOK bool) clusterAutoupdateGetter { + if cacheOK { + return cache.clusterAutoUpdateCache + } + return cache.Config.ClusterAutoUpdate +} + +type clusterAutoupdateGetter interface { + GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) +} + +var _ executor[types.ClusterAutoUpdateConfig, clusterAutoupdateGetter] = clusterAutoupdateExecutor{} + +type autoUpdateVersionExecutor struct{} + +func (autoUpdateVersionExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.AutoUpdateVersion, error) { + version, err := cache.ClusterAutoUpdate.GetAutoUpdateVersion(ctx) + return []types.AutoUpdateVersion{version}, trace.Wrap(err) +} + +func (autoUpdateVersionExecutor) upsert(ctx context.Context, cache *Cache, resource types.AutoUpdateVersion) error { + return cache.clusterAutoUpdateCache.UpsertAutoUpdateVersion(ctx, resource) +} + +func (autoUpdateVersionExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.clusterAutoUpdateCache.DeleteAutoUpdateVersion(ctx) +} + +func (autoUpdateVersionExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.clusterAutoUpdateCache.DeleteAutoUpdateVersion(ctx) +} + +func (autoUpdateVersionExecutor) isSingleton() bool { return true } + +func (autoUpdateVersionExecutor) getReader(cache *Cache, cacheOK bool) autoUpdateVersionGetter { + if cacheOK { + return cache.clusterAutoUpdateCache + } + return cache.Config.ClusterAutoUpdate +} + +type autoUpdateVersionGetter interface { + GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) +} + +var _ executor[types.AutoUpdateVersion, autoUpdateVersionGetter] = autoUpdateVersionExecutor{} type userExecutor struct{} diff --git a/lib/service/service.go b/lib/service/service.go index 656b5a59056cc..88254c0e24686 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2138,6 +2138,7 @@ func (process *TeleportProcess) initAuthService() error { VersionStorage: process.storage, Authority: cfg.Keygen, ClusterConfiguration: cfg.ClusterConfiguration, + ClusterAutoUpdate: cfg.ClusterAutoUpdate, ClusterAuditConfig: cfg.Auth.AuditConfig, ClusterNetworkingConfig: cfg.Auth.NetworkingConfig, SessionRecordingConfig: cfg.Auth.SessionRecordingConfig, @@ -2604,6 +2605,7 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.WebSession = services.Identity.WebSessions() cfg.WebToken = services.Identity.WebTokens() cfg.WindowsDesktops = services.WindowsDesktops + cfg.ClusterAutoUpdate = services.ClusterAutoUpdate return accesspoint.NewCache(cfg) } @@ -2646,6 +2648,7 @@ func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, cfg.WebSession = client.WebSessions() cfg.WebToken = client.WebTokens() cfg.WindowsDesktops = client + cfg.ClusterAutoUpdate = client return accesspoint.NewCache(cfg) } diff --git a/lib/service/servicecfg/config.go b/lib/service/servicecfg/config.go index 6d14bce4e5b2c..08262b92da0d2 100644 --- a/lib/service/servicecfg/config.go +++ b/lib/service/servicecfg/config.go @@ -169,6 +169,9 @@ type Config struct { // ClusterConfiguration is a service that provides cluster configuration ClusterConfiguration services.ClusterConfiguration + // ClusterAutoUpdate is a service that provides cluster autoupdate configuration. + ClusterAutoUpdate services.ClusterAutoUpdate + // CipherSuites is a list of TLS ciphersuites that Teleport supports. If // omitted, a Teleport selected list of defaults will be used. CipherSuites []uint16 diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go new file mode 100644 index 0000000000000..49653661eb9d0 --- /dev/null +++ b/lib/services/autoupdates.go @@ -0,0 +1,153 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package services + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/utils" +) + +// ClusterAutoUpdate stores the cluster autoupdate configuration in the backend. +type ClusterAutoUpdate interface { + // UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. + UpsertClusterAutoUpdateConfig(ctx context.Context, c types.ClusterAutoUpdateConfig) error + // GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. + GetClusterAutoUpdateConfig(ctx context.Context, opts ...MarshalOption) (types.ClusterAutoUpdateConfig, error) + // DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. + DeleteClusterAutoUpdateConfig(ctx context.Context) error + + // UpsertAutoUpdateVersion sets autoupdate version. + UpsertAutoUpdateVersion(ctx context.Context, c types.AutoUpdateVersion) error + // GetAutoUpdateVersion gets the autoupdate version from the backend. + GetAutoUpdateVersion(ctx context.Context, opts ...MarshalOption) (types.AutoUpdateVersion, error) + // DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. + DeleteAutoUpdateVersion(ctx context.Context) error +} + +// NewClusterAutoUpdateConfig creates a ClusterAutoUpdateConfig with default values. +func NewClusterAutoUpdateConfig(spec types.ClusterAutoUpdateConfigSpecV1) (types.ClusterAutoUpdateConfig, error) { + return types.NewClusterAutoUpdateConfig(spec) +} + +// NewAutoUpdateVersion creates a AutoUpdateVersion with default values. +func NewAutoUpdateVersion(spec types.AutoupdateVersionSpecV1) (types.AutoUpdateVersion, error) { + return types.NewAutoUpdateVersion(spec) +} + +// UnmarshalClusterAutoUpdateConfig unmarshals the ClusterAutoUpdateConfig resource from JSON. +func UnmarshalClusterAutoUpdateConfig(bytes []byte, opts ...MarshalOption) (types.ClusterAutoUpdateConfig, error) { + if len(bytes) == 0 { + return nil, trace.BadParameter("missing resource data") + } + var clusterAutoUpdateConfig types.ClusterAutoUpdateConfigV1 + cfg, err := CollectOptions(opts) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := utils.FastUnmarshal(bytes, &clusterAutoUpdateConfig); err != nil { + return nil, trace.BadParameter(err.Error()) + } + + err = clusterAutoUpdateConfig.CheckAndSetDefaults() + if err != nil { + return nil, trace.Wrap(err) + } + + if cfg.Revision != "" { + clusterAutoUpdateConfig.SetRevision(cfg.Revision) + } + if !cfg.Expires.IsZero() { + clusterAutoUpdateConfig.SetExpiry(cfg.Expires) + } + + return &clusterAutoUpdateConfig, nil +} + +// UnmarshalAutoUpdateVersion unmarshals the AutoUpdateVersion resource from JSON. +func UnmarshalAutoUpdateVersion(bytes []byte, opts ...MarshalOption) (types.AutoUpdateVersion, error) { + if len(bytes) == 0 { + return nil, trace.BadParameter("missing resource data") + } + var autoUpdateVersion types.AutoUpdateVersionV1 + cfg, err := CollectOptions(opts) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := utils.FastUnmarshal(bytes, &autoUpdateVersion); err != nil { + return nil, trace.BadParameter(err.Error()) + } + + err = autoUpdateVersion.CheckAndSetDefaults() + if err != nil { + return nil, trace.Wrap(err) + } + + if cfg.Revision != "" { + autoUpdateVersion.SetRevision(cfg.Revision) + } + if !cfg.Expires.IsZero() { + autoUpdateVersion.SetExpiry(cfg.Expires) + } + + return &autoUpdateVersion, nil +} + +// MarshalClusterAutoUpdateConfig marshals the ClusterAutoUpdateConfig resource to JSON. +func MarshalClusterAutoUpdateConfig(config types.ClusterAutoUpdateConfig, opts ...MarshalOption) ([]byte, error) { + cfg, err := CollectOptions(opts) + if err != nil { + return nil, trace.Wrap(err) + } + + switch autoUpdateConfig := config.(type) { + case *types.ClusterAutoUpdateConfigV1: + if err := autoUpdateConfig.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + return utils.FastMarshal(maybeResetProtoRevision(cfg.PreserveRevision, autoUpdateConfig)) + default: + return nil, trace.BadParameter("unrecognized cluster autoupdate config version %T", autoUpdateConfig) + } +} + +// MarshalAutoUpdateVersion marshals the AutoUpdateVersion resource to JSON. +func MarshalAutoUpdateVersion(config types.AutoUpdateVersion, opts ...MarshalOption) ([]byte, error) { + cfg, err := CollectOptions(opts) + if err != nil { + return nil, trace.Wrap(err) + } + + switch autoUpdateVersion := config.(type) { + case *types.AutoUpdateVersionV1: + if err := autoUpdateVersion.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + return utils.FastMarshal(maybeResetProtoRevision(cfg.PreserveRevision, autoUpdateVersion)) + default: + return nil, trace.BadParameter("unrecognized autoupdate version %T", autoUpdateVersion) + } +} diff --git a/lib/services/local/autoupdate.go b/lib/services/local/autoupdate.go new file mode 100644 index 0000000000000..e8221b2702f3b --- /dev/null +++ b/lib/services/local/autoupdate.go @@ -0,0 +1,138 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package local + +import ( + "context" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/services" +) + +// ClusterAutoUpdateService is responsible for managing autoupdate configuration and version management. +type ClusterAutoUpdateService struct { + backend.Backend +} + +// NewClusterAutoUpdateService returns a new AutoUpdateService. +func NewClusterAutoUpdateService(backend backend.Backend) *ClusterAutoUpdateService { + return &ClusterAutoUpdateService{ + Backend: backend, + } +} + +// UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. +func (s *ClusterAutoUpdateService) UpsertClusterAutoUpdateConfig(ctx context.Context, c types.ClusterAutoUpdateConfig) error { + rev := c.GetRevision() + value, err := services.MarshalClusterAutoUpdateConfig(c) + if err != nil { + return trace.Wrap(err) + } + + _, err = s.Put(ctx, backend.Item{ + Key: backend.Key(clusterAutoupdatePrefix, clusterAutoupdateConfigPrefix), + Value: value, + Expires: c.Expiry(), + Revision: rev, + }) + if err != nil { + return trace.Wrap(err) + } + + return nil +} + +// GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. +func (s *ClusterAutoUpdateService) GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) { + item, err := s.Get(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateConfigPrefix)) + if err != nil { + if trace.IsNotFound(err) { + return nil, trace.NotFound("cluster autoupdate configuration not found") + } + return nil, trace.Wrap(err) + } + return services.UnmarshalClusterAutoUpdateConfig(item.Value, + services.AddOptions(opts, services.WithRevision(item.Revision))...) +} + +// DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. +func (s *ClusterAutoUpdateService) DeleteClusterAutoUpdateConfig(ctx context.Context) error { + err := s.Delete(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateConfigPrefix)) + if err != nil { + if trace.IsNotFound(err) { + return trace.NotFound("cluster autoupdate configuration not found") + } + return trace.Wrap(err) + } + return nil +} + +// UpsertAutoUpdateVersion sets cluster autoupdate version resource. +func (s *ClusterAutoUpdateService) UpsertAutoUpdateVersion(ctx context.Context, c types.AutoUpdateVersion) error { + rev := c.GetRevision() + value, err := services.MarshalAutoUpdateVersion(c) + if err != nil { + return trace.Wrap(err) + } + + _, err = s.Put(ctx, backend.Item{ + Key: backend.Key(clusterAutoupdatePrefix, clusterAutoupdateVersionPrefix), + Value: value, + Expires: c.Expiry(), + Revision: rev, + }) + if err != nil { + return trace.Wrap(err) + } + + return nil +} + +// GetAutoUpdateVersion gets the autoupdate version from the backend. +func (s *ClusterAutoUpdateService) GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) { + item, err := s.Get(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateVersionPrefix)) + if err != nil { + if trace.IsNotFound(err) { + return nil, trace.NotFound("autoupdate version not found") + } + return nil, trace.Wrap(err) + } + return services.UnmarshalAutoUpdateVersion(item.Value, + services.AddOptions(opts, services.WithRevision(item.Revision))...) +} + +// DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. +func (s *ClusterAutoUpdateService) DeleteAutoUpdateVersion(ctx context.Context) error { + err := s.Delete(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateVersionPrefix)) + if err != nil { + if trace.IsNotFound(err) { + return trace.NotFound("autoupdate version not found") + } + return trace.Wrap(err) + } + return nil +} + +const ( + clusterAutoupdatePrefix = "cluster_autoupdate" + clusterAutoupdateConfigPrefix = "config" + clusterAutoupdateVersionPrefix = "version" +) diff --git a/lib/services/local/configuration.go b/lib/services/local/configuration.go index 38865478326cc..20925721742d7 100644 --- a/lib/services/local/configuration.go +++ b/lib/services/local/configuration.go @@ -817,6 +817,7 @@ func (s *ClusterConfigurationService) DeleteAccessGraphSettings(ctx context.Cont const ( clusterConfigPrefix = "cluster_configuration" + clusterAutoUpdatePrefix = "cluster_autoupdate" namePrefix = "name" staticTokensPrefix = "static_tokens" authPrefix = "authentication" @@ -830,4 +831,6 @@ const ( installerPrefix = "installer" maintenancePrefix = "maintenance" accessGraphSettingsPrefix = "access_graph_settings" + autoUpdateConfigPrefix = "config" + autoUpdateVersionPrefix = "version" ) diff --git a/lib/services/local/events.go b/lib/services/local/events.go index 0cc0d9938a10c..33edbb0b04096 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -94,6 +94,10 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newUIConfigParser() case types.KindClusterName: parser = newClusterNameParser() + case types.KindClusterAutoUpdateConfig: + parser = newClusterAutoUpdateConfigParser() + case types.KindAutoUpdateVersion: + parser = newAutoUpdateVersionParser() case types.KindNamespace: parser = newNamespaceParser(kind.Name) case types.KindRole: @@ -698,6 +702,72 @@ func (p *clusterNameParser) parse(event backend.Event) (types.Resource, error) { } } +func newClusterAutoUpdateConfigParser() *clusterAutoUpdateConfigParser { + return &clusterAutoUpdateConfigParser{ + baseParser: newBaseParser(backend.Key(clusterAutoUpdatePrefix, autoUpdateConfigPrefix)), + } +} + +type clusterAutoUpdateConfigParser struct { + baseParser +} + +func (p *clusterAutoUpdateConfigParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + h, err := resourceHeader(event, types.KindClusterAutoUpdateConfig, types.V1, 0) + if err != nil { + return nil, trace.Wrap(err) + } + h.SetName(types.MetaNameClusterAutoUpdateConfig) + return h, nil + case types.OpPut: + autoUpdateConfig, err := services.UnmarshalClusterAutoUpdateConfig(event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + return autoUpdateConfig, nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} + +func newAutoUpdateVersionParser() *autoUpdateVersionParser { + return &autoUpdateVersionParser{ + baseParser: newBaseParser(backend.Key(clusterAutoUpdatePrefix, autoUpdateVersionPrefix)), + } +} + +type autoUpdateVersionParser struct { + baseParser +} + +func (p *autoUpdateVersionParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + h, err := resourceHeader(event, types.KindAutoUpdateVersion, types.V1, 0) + if err != nil { + return nil, trace.Wrap(err) + } + h.SetName(types.MetaNameAutoUpdateVersion) + return h, nil + case types.OpPut: + autoUpdateVersion, err := services.UnmarshalAutoUpdateVersion(event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + return autoUpdateVersion, nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} + func newNamespaceParser(name string) *namespaceParser { prefix := backend.Key(namespacesPrefix) if name != "" { diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 7dbefa54adfda..80d859799f1b6 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1447,12 +1447,29 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para if err != nil { return nil, trace.Wrap(err) } - return webclient.PingResponse{ + + response := webclient.PingResponse{ Proxy: *proxyConfig, ServerVersion: teleport.Version, MinClientVersion: teleport.MinClientVersion, ClusterName: h.auth.clusterName, - }, nil + } + + autoUpdateConfig, err := h.GetAccessPoint().GetClusterAutoUpdateConfig(r.Context()) + if !trace.IsNotFound(err) && err != nil { + return nil, trace.Wrap(err) + } else if !trace.IsNotFound(err) { + response.ToolsAutoUpdate = autoUpdateConfig.GetToolsAutoUpdate() + } + + autoUpdateVersion, err := h.GetAccessPoint().GetAutoUpdateVersion(r.Context()) + if !trace.IsNotFound(err) && err != nil { + return nil, trace.Wrap(err) + } else if !trace.IsNotFound(err) { + response.ToolsVersion = autoUpdateVersion.GetToolsVersion() + } + + return response, nil } func (h *Handler) pingWithConnector(w http.ResponseWriter, r *http.Request, p httprouter.Params) (interface{}, error) { @@ -1477,6 +1494,7 @@ func (h *Handler) pingWithConnector(w http.ResponseWriter, r *http.Request, p ht response := &webclient.PingResponse{ Proxy: *proxyConfig, ServerVersion: teleport.Version, + ToolsVersion: teleport.Version, ClusterName: h.auth.clusterName, } From 4287f85ad725f19504cc131f131d24fe470a4d81 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Tue, 20 Aug 2024 15:48:53 -0400 Subject: [PATCH 02/15] Refactor autoupdate service from legacy approach --- api/client/client.go | 14 +- api/client/proto/authservice.pb.go | 1926 +++++++------ .../teleport/autoupdate/v1/autoupdate.pb.go | 458 +++ .../autoupdate/v1/autoupdate_service.pb.go | 525 ++++ .../v1/autoupdate_service_grpc.pb.go | 342 +++ .../teleport/autoupdate/v1/autoupdate.proto | 55 + .../autoupdate/v1/autoupdate_service.proto | 65 + .../legacy/client/proto/authservice.proto | 6 - api/proto/teleport/legacy/types/types.proto | 46 - api/types/autoupdate_config.go | 134 - api/types/autoupdate_version.go | 138 - api/types/types.pb.go | 2459 ++++++----------- lib/auth/accesspoint/accesspoint.go | 4 +- lib/auth/auth.go | 11 +- lib/auth/authclient/api.go | 5 +- lib/auth/authclient/clt.go | 18 +- lib/auth/autoupdate/v1/service.go | 148 + lib/auth/grpcserver.go | 39 +- lib/auth/init.go | 4 +- lib/cache/cache.go | 39 +- lib/cache/collections.go | 63 +- lib/service/service.go | 4 +- lib/service/servicecfg/config.go | 4 +- lib/services/autoupdates.go | 134 +- lib/services/local/autoupdate.go | 158 +- lib/services/local/configuration.go | 3 - lib/services/local/events.go | 13 +- lib/web/apiserver.go | 5 +- 28 files changed, 3528 insertions(+), 3292 deletions(-) create mode 100644 api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go create mode 100644 api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go create mode 100644 api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go create mode 100644 api/proto/teleport/autoupdate/v1/autoupdate.proto create mode 100644 api/proto/teleport/autoupdate/v1/autoupdate_service.proto delete mode 100644 api/types/autoupdate_config.go delete mode 100644 api/types/autoupdate_version.go create mode 100644 lib/auth/autoupdate/v1/service.go diff --git a/api/client/client.go b/api/client/client.go index 2a35c0a261426..84ed03aa0317c 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -65,6 +65,7 @@ import ( accesslistv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accesslist/v1" accessmonitoringrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" auditlogpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/auditlog/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -884,6 +885,11 @@ func (c *Client) GetVnetConfig(ctx context.Context) (*vnet.VnetConfig, error) { return c.VnetConfigServiceClient().GetVnetConfig(ctx, &vnet.GetVnetConfigRequest{}) } +// AutoUpdateServiceClient returns an unadorned client for the AutoUpdate service. +func (c *Client) AutoUpdateServiceClient() autoupdate.AutoUpdateServiceClient { + return autoupdate.NewAutoUpdateServiceClient(c.conn) +} + // Ping gets basic info about the auth server. func (c *Client) Ping(ctx context.Context) (proto.PingResponse, error) { rsp, err := c.grpc.Ping(ctx, &proto.PingRequest{}) @@ -2845,8 +2851,8 @@ func (c *Client) GetClusterAuditConfig(ctx context.Context) (types.ClusterAuditC } // GetClusterAutoUpdateConfig gets cluster autoupdate configuration. -func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context) (types.ClusterAutoUpdateConfig, error) { - resp, err := c.grpc.GetClusterAutoUpdateConfig(ctx, &emptypb.Empty{}) +func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { + resp, err := c.AutoUpdateServiceClient().GetClusterAutoUpdateConfig(ctx, &autoupdate.GetClusterAutoUpdateConfigRequest{}) if err != nil { return nil, trace.Wrap(err) } @@ -2854,8 +2860,8 @@ func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context) (types.ClusterA } // GetAutoUpdateVersion gets cluster autoupdate version. -func (c *Client) GetAutoUpdateVersion(ctx context.Context) (types.AutoUpdateVersion, error) { - resp, err := c.grpc.GetAutoUpdateVersion(ctx, &emptypb.Empty{}) +func (c *Client) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { + resp, err := c.AutoUpdateServiceClient().GetAutoUpdateVersion(ctx, &autoupdate.GetAutoUpdateVersionRequest{}) if err != nil { return nil, trace.Wrap(err) } diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 641119c5ebace..7a22ab12f0961 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -15611,937 +15611,935 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 14879 bytes of a gzipped FileDescriptorProto + // 14844 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x5b, 0x8c, 0x1c, 0x49, 0x76, 0x18, 0xda, 0x55, 0xfd, 0x3e, 0xfd, 0x60, 0x31, 0xba, 0x9b, 0x5d, 0x6c, 0x3e, 0x8a, 0x4c, 0xce, 0x83, 0xc3, 0x9d, 0xe5, 0xa3, 0x39, 0x33, 0x3b, 0xaf, 0x9d, 0x99, 0xea, 0x07, 0xd9, 0x4d, 0xf6, 0x6b, 0xb2, 0xba, 0x9b, 0x33, 0xb3, 0xa3, 0xad, 0xcd, 0xae, 0x0a, 0x76, 0xa7, 0x58, 0x9d, 0x59, 0x9b, 0x99, 0x45, 0x0e, 0x57, 0x57, 0xba, 0xd0, 0xea, 0x5e, 0x5c, 0xfd, 0xdc, 0x7b, 0x25, - 0xc0, 0x32, 0x64, 0xd8, 0x80, 0x6c, 0xc0, 0x06, 0x0c, 0x03, 0x36, 0xf4, 0x23, 0xe8, 0xc7, 0xfe, - 0xf0, 0x97, 0x57, 0x02, 0x04, 0xdb, 0x90, 0xf4, 0xe3, 0x8f, 0x96, 0xbd, 0x80, 0x7f, 0x1a, 0xf6, - 0x87, 0x60, 0xd8, 0x80, 0x17, 0x10, 0x60, 0xc4, 0x89, 0x47, 0x46, 0xe4, 0xa3, 0xaa, 0x9b, 0xe4, - 0xac, 0xfc, 0x43, 0x76, 0x9d, 0x38, 0xe7, 0x44, 0xc4, 0x89, 0xc8, 0x88, 0x13, 0x27, 0x4e, 0x9c, - 0x03, 0x37, 0x23, 0xda, 0xa2, 0x6d, 0x3f, 0x88, 0x6e, 0xb5, 0xe8, 0xbe, 0xd3, 0x78, 0x7e, 0xab, - 0xd1, 0x72, 0xa9, 0x17, 0xdd, 0x6a, 0x07, 0x7e, 0xe4, 0xdf, 0x72, 0x3a, 0xd1, 0x41, 0x48, 0x83, - 0xa7, 0x6e, 0x83, 0xde, 0x44, 0x08, 0x19, 0xc4, 0xff, 0xe6, 0xa6, 0xf7, 0xfd, 0x7d, 0x9f, 0xe3, - 0xb0, 0xbf, 0x78, 0xe1, 0xdc, 0x85, 0x7d, 0xdf, 0xdf, 0x6f, 0x51, 0x4e, 0xbc, 0xd7, 0x79, 0x7c, - 0x8b, 0x1e, 0xb6, 0xa3, 0xe7, 0xa2, 0xb0, 0x92, 0x2c, 0x8c, 0xdc, 0x43, 0x1a, 0x46, 0xce, 0x61, - 0x5b, 0x20, 0xbc, 0xa5, 0x9a, 0xe2, 0x44, 0x11, 0x2b, 0x89, 0x5c, 0xdf, 0xbb, 0xf5, 0xf4, 0x8e, - 0xfe, 0x53, 0xa0, 0x5e, 0xef, 0xda, 0xea, 0x06, 0x0d, 0xa2, 0xf0, 0x44, 0x98, 0xf4, 0x29, 0xf5, - 0xa2, 0x54, 0xf5, 0x02, 0x33, 0x7a, 0xde, 0xa6, 0x21, 0x47, 0x91, 0xff, 0x09, 0xd4, 0xab, 0xd9, - 0xa8, 0xf8, 0xaf, 0x40, 0xf9, 0x6e, 0x36, 0xca, 0x33, 0xba, 0xc7, 0x64, 0xea, 0xa9, 0x3f, 0x7a, - 0xa0, 0x07, 0x4e, 0xbb, 0x4d, 0x83, 0xf8, 0x0f, 0x81, 0x7e, 0x5e, 0xa1, 0x1f, 0x3e, 0x76, 0x98, - 0x88, 0x0e, 0x1f, 0x3b, 0xa9, 0x6e, 0x74, 0x42, 0x67, 0x9f, 0x8a, 0xe6, 0x3f, 0xbd, 0xa3, 0xff, - 0xe4, 0xa8, 0xd6, 0x1f, 0x14, 0x60, 0xf0, 0x91, 0x13, 0x35, 0x0e, 0xc8, 0xa7, 0x30, 0xf8, 0xd0, - 0xf5, 0x9a, 0x61, 0xb9, 0x70, 0xa5, 0xff, 0xfa, 0xd8, 0x7c, 0xe9, 0x26, 0xef, 0x0a, 0x16, 0xb2, - 0x82, 0x85, 0xd9, 0x9f, 0x1d, 0x55, 0xfa, 0x8e, 0x8f, 0x2a, 0x67, 0x9e, 0x30, 0xb4, 0xb7, 0xfd, - 0x43, 0x37, 0xc2, 0xb1, 0xb5, 0x39, 0x1d, 0xd9, 0x81, 0xa9, 0x6a, 0xab, 0xe5, 0x3f, 0xdb, 0x72, - 0x82, 0xc8, 0x75, 0x5a, 0xb5, 0x4e, 0xa3, 0x41, 0xc3, 0xb0, 0x5c, 0xbc, 0x52, 0xb8, 0x3e, 0xb2, - 0x70, 0xed, 0xf8, 0xa8, 0x52, 0x71, 0x58, 0x71, 0xbd, 0xcd, 0xcb, 0xeb, 0x21, 0x47, 0xd0, 0x18, - 0x65, 0xd1, 0x5b, 0x7f, 0x3a, 0x04, 0xa5, 0x15, 0x3f, 0x8c, 0x16, 0xd9, 0x88, 0xda, 0xf4, 0xc7, - 0x1d, 0x1a, 0x46, 0xe4, 0x1a, 0x0c, 0x31, 0xd8, 0xea, 0x52, 0xb9, 0x70, 0xa5, 0x70, 0x7d, 0x74, - 0x61, 0xec, 0xf8, 0xa8, 0x32, 0x7c, 0xe0, 0x87, 0x51, 0xdd, 0x6d, 0xda, 0xa2, 0x88, 0xbc, 0x05, - 0x23, 0x1b, 0x7e, 0x93, 0x6e, 0x38, 0x87, 0x14, 0x5b, 0x31, 0xba, 0x30, 0x71, 0x7c, 0x54, 0x19, - 0xf5, 0xfc, 0x26, 0xad, 0x7b, 0xce, 0x21, 0xb5, 0x55, 0x31, 0xd9, 0x85, 0x01, 0xdb, 0x6f, 0xd1, - 0x72, 0x3f, 0xa2, 0x2d, 0x1c, 0x1f, 0x55, 0x06, 0x02, 0xbf, 0x45, 0x7f, 0x71, 0x54, 0x79, 0x6f, - 0xdf, 0x8d, 0x0e, 0x3a, 0x7b, 0x37, 0x1b, 0xfe, 0xe1, 0xad, 0xfd, 0xc0, 0x79, 0xea, 0xf2, 0x49, - 0xe8, 0xb4, 0x6e, 0xc5, 0x53, 0xb5, 0xed, 0x8a, 0x71, 0xaf, 0x3d, 0x0f, 0x23, 0x7a, 0xc8, 0x38, - 0xd9, 0xc8, 0x8f, 0x3c, 0x82, 0xe9, 0x6a, 0xb3, 0xe9, 0x72, 0x8a, 0xad, 0xc0, 0xf5, 0x1a, 0x6e, - 0xdb, 0x69, 0x85, 0xe5, 0x81, 0x2b, 0xfd, 0xd7, 0x47, 0x85, 0x50, 0x54, 0x79, 0xbd, 0xad, 0x10, - 0x34, 0xa1, 0x64, 0x32, 0x20, 0x77, 0x61, 0x64, 0x69, 0xa3, 0xc6, 0xda, 0x1e, 0x96, 0x07, 0x91, - 0xd9, 0xec, 0xf1, 0x51, 0x65, 0xaa, 0xe9, 0x85, 0xd8, 0x35, 0x9d, 0x81, 0x42, 0x24, 0xef, 0xc1, - 0xf8, 0x56, 0x67, 0xaf, 0xe5, 0x36, 0xb6, 0xd7, 0x6a, 0x0f, 0xe9, 0xf3, 0xf2, 0xd0, 0x95, 0xc2, - 0xf5, 0xf1, 0x05, 0x72, 0x7c, 0x54, 0x99, 0x6c, 0x23, 0xbc, 0x1e, 0xb5, 0xc2, 0xfa, 0x13, 0xfa, - 0xdc, 0x36, 0xf0, 0x62, 0xba, 0x5a, 0x6d, 0x85, 0xd1, 0x0d, 0xa7, 0xe8, 0xc2, 0xf0, 0x40, 0xa7, - 0xe3, 0x78, 0xe4, 0x16, 0x80, 0x4d, 0x0f, 0xfd, 0x88, 0x56, 0x9b, 0xcd, 0xa0, 0x3c, 0x82, 0xb2, - 0x3d, 0x73, 0x7c, 0x54, 0x19, 0x0b, 0x10, 0x5a, 0x77, 0x9a, 0xcd, 0xc0, 0xd6, 0x50, 0xc8, 0x22, - 0x8c, 0xd8, 0x3e, 0x17, 0x70, 0x79, 0xf4, 0x4a, 0xe1, 0xfa, 0xd8, 0xfc, 0x19, 0x31, 0x0d, 0x25, - 0x78, 0xe1, 0xdc, 0xf1, 0x51, 0x85, 0x04, 0xe2, 0x97, 0xde, 0x4b, 0x89, 0x41, 0x2a, 0x30, 0xbc, - 0xe1, 0x2f, 0x3a, 0x8d, 0x03, 0x5a, 0x06, 0x9c, 0x7b, 0x83, 0xc7, 0x47, 0x95, 0xc2, 0x77, 0x6d, - 0x09, 0x25, 0x4f, 0x61, 0x2c, 0x1e, 0xa8, 0xb0, 0x3c, 0x86, 0xe2, 0xdb, 0x3e, 0x3e, 0xaa, 0x9c, - 0x0b, 0x11, 0x5c, 0x67, 0x43, 0xaf, 0x49, 0xf0, 0x25, 0x66, 0x81, 0x5e, 0x11, 0xf9, 0x1a, 0x66, - 0xe2, 0x9f, 0xd5, 0x30, 0xa4, 0x01, 0xe3, 0xb1, 0xba, 0x54, 0x9e, 0x40, 0xc9, 0xbc, 0x71, 0x7c, - 0x54, 0xb1, 0xb4, 0x16, 0xd4, 0x1d, 0x89, 0x52, 0x77, 0x9b, 0x5a, 0x4f, 0xb3, 0x99, 0x3c, 0x18, - 0x18, 0x19, 0x2f, 0x4d, 0xd8, 0x97, 0x76, 0xbc, 0x30, 0x72, 0xf6, 0x5a, 0x34, 0x13, 0xc9, 0xfa, - 0x9b, 0x02, 0x90, 0xcd, 0x36, 0xf5, 0x6a, 0xb5, 0x15, 0xf6, 0x3d, 0xc9, 0xcf, 0xe9, 0x6d, 0x18, - 0xe5, 0x03, 0xc7, 0x46, 0xb7, 0x88, 0xa3, 0x3b, 0x79, 0x7c, 0x54, 0x01, 0x31, 0xba, 0x6c, 0x64, - 0x63, 0x04, 0xf2, 0x3a, 0xf4, 0x6f, 0x6f, 0xaf, 0xe1, 0xb7, 0xd2, 0xbf, 0x30, 0x75, 0x7c, 0x54, - 0xe9, 0x8f, 0xa2, 0xd6, 0x2f, 0x8e, 0x2a, 0x23, 0x4b, 0x9d, 0x00, 0xc5, 0x62, 0xb3, 0x72, 0xf2, - 0x3a, 0x0c, 0x2f, 0xb6, 0x3a, 0x61, 0x44, 0x83, 0xf2, 0x40, 0xfc, 0x91, 0x36, 0x38, 0xc8, 0x96, - 0x65, 0xe4, 0x3b, 0x30, 0xb0, 0x13, 0xd2, 0xa0, 0x3c, 0x88, 0xe3, 0x3d, 0x21, 0xc6, 0x9b, 0x81, - 0x76, 0xe7, 0x17, 0x46, 0xd8, 0x97, 0xd8, 0x09, 0x69, 0x60, 0x23, 0x12, 0xb9, 0x09, 0x83, 0x7c, - 0xd0, 0x86, 0x70, 0x91, 0x9a, 0x50, 0xb3, 0xa3, 0x45, 0x77, 0xdf, 0x5b, 0x18, 0x3d, 0x3e, 0xaa, - 0x0c, 0xe2, 0xe0, 0xd9, 0x1c, 0xed, 0xc1, 0xc0, 0x48, 0xa1, 0x54, 0xb4, 0x47, 0x18, 0x2d, 0xfb, - 0x2c, 0xac, 0xef, 0xc0, 0x98, 0xd6, 0x7d, 0x72, 0x11, 0x06, 0xd8, 0xff, 0xb8, 0x88, 0x8c, 0xf3, - 0xca, 0xd8, 0xc6, 0x61, 0x23, 0xd4, 0xfa, 0x87, 0x53, 0x50, 0x62, 0x94, 0xc6, 0xca, 0x73, 0x53, - 0x17, 0x15, 0xa7, 0x2b, 0x99, 0xa2, 0x2a, 0x17, 0x74, 0x61, 0x5d, 0x07, 0x55, 0xbb, 0x58, 0x84, - 0xc6, 0x8f, 0x8f, 0x2a, 0x23, 0x1d, 0x01, 0x8b, 0xdb, 0x46, 0x6a, 0x30, 0xbc, 0xfc, 0x4d, 0xdb, - 0x0d, 0x68, 0x88, 0xa2, 0x1d, 0x9b, 0x9f, 0xbb, 0xc9, 0xb7, 0xcb, 0x9b, 0x72, 0xbb, 0xbc, 0xb9, - 0x2d, 0xb7, 0xcb, 0x85, 0x4b, 0x62, 0x31, 0x3e, 0x4b, 0x39, 0x49, 0x3c, 0x3f, 0x7e, 0xe7, 0xaf, - 0x2a, 0x05, 0x5b, 0x72, 0x22, 0x6f, 0xc3, 0xd0, 0x3d, 0x3f, 0x38, 0x74, 0x22, 0x31, 0x06, 0xd3, - 0xc7, 0x47, 0x95, 0xd2, 0x63, 0x84, 0x68, 0x53, 0x4a, 0xe0, 0x90, 0x7b, 0x30, 0x69, 0xfb, 0x9d, - 0x88, 0x6e, 0xfb, 0x72, 0xe4, 0x06, 0x91, 0xea, 0xf2, 0xf1, 0x51, 0x65, 0x2e, 0x60, 0x25, 0xf5, - 0xc8, 0xaf, 0x8b, 0x21, 0xd4, 0xe8, 0x13, 0x54, 0x64, 0x19, 0x26, 0xab, 0xb8, 0x7a, 0x0b, 0xa9, - 0xf1, 0xf1, 0x1a, 0x5d, 0xb8, 0x74, 0x7c, 0x54, 0x39, 0xef, 0x60, 0x49, 0x3d, 0x10, 0x45, 0x3a, - 0x1b, 0x93, 0x88, 0x6c, 0xc0, 0xd9, 0x87, 0x9d, 0x3d, 0x1a, 0x78, 0x34, 0xa2, 0xa1, 0x6c, 0xd1, - 0x30, 0xb6, 0xe8, 0xca, 0xf1, 0x51, 0xe5, 0xe2, 0x13, 0x55, 0x98, 0xd1, 0xa6, 0x34, 0x29, 0xa1, - 0x70, 0x46, 0x34, 0x74, 0xc9, 0x89, 0x9c, 0x3d, 0x27, 0xa4, 0xb8, 0x28, 0x8d, 0xcd, 0x9f, 0xe3, - 0x22, 0xbe, 0x99, 0x28, 0x5d, 0xb8, 0x26, 0xa4, 0x7c, 0x41, 0xf5, 0xbd, 0x29, 0x8a, 0xb4, 0x8a, - 0x92, 0x3c, 0xd9, 0xda, 0xac, 0xf6, 0x9d, 0x51, 0x6c, 0x2d, 0xae, 0xcd, 0x6a, 0xdf, 0xd1, 0x57, - 0x2d, 0xb5, 0x03, 0xad, 0xc1, 0xe0, 0x0e, 0xdb, 0x9d, 0x71, 0xcd, 0x9a, 0x9c, 0xbf, 0x2a, 0x5a, - 0x94, 0x9c, 0x7f, 0x37, 0xd9, 0x0f, 0x44, 0xc4, 0x2f, 0xef, 0x0c, 0xee, 0xe8, 0xfa, 0x5e, 0x8c, - 0x65, 0xe4, 0x73, 0x00, 0xd1, 0xaa, 0x6a, 0xbb, 0x5d, 0x1e, 0xc3, 0x4e, 0x9e, 0x35, 0x3b, 0x59, - 0x6d, 0xb7, 0x17, 0x2e, 0x8b, 0xfe, 0x9d, 0x53, 0xfd, 0x73, 0xda, 0x6d, 0x8d, 0x9b, 0xc6, 0x84, - 0x7c, 0x0a, 0xe3, 0xb8, 0xa4, 0xc9, 0x11, 0x1d, 0xc7, 0x11, 0xbd, 0x70, 0x7c, 0x54, 0x99, 0xc5, - 0xd5, 0x2a, 0x63, 0x3c, 0x0d, 0x02, 0xf2, 0x1b, 0x30, 0x23, 0xd8, 0x3d, 0x72, 0xbd, 0xa6, 0xff, - 0x2c, 0x5c, 0xa2, 0xe1, 0x93, 0xc8, 0x6f, 0xe3, 0xf2, 0x37, 0x36, 0x7f, 0xd1, 0x6c, 0x9e, 0x89, - 0xb3, 0x70, 0x43, 0xb4, 0xd4, 0x52, 0x2d, 0x7d, 0xc6, 0x11, 0xea, 0x4d, 0x8e, 0xa1, 0x2f, 0x90, - 0x99, 0x2c, 0xc8, 0x2a, 0x9c, 0xd9, 0x09, 0xa9, 0xd1, 0x87, 0x49, 0xdc, 0x1f, 0x2a, 0x6c, 0x84, - 0x3b, 0x21, 0xad, 0xe7, 0xf5, 0x23, 0x49, 0x47, 0x6c, 0x20, 0x4b, 0x81, 0xdf, 0x4e, 0xcc, 0xf1, - 0x33, 0x28, 0x11, 0xeb, 0xf8, 0xa8, 0x72, 0xb9, 0x19, 0xf8, 0xed, 0x7a, 0xfe, 0x44, 0xcf, 0xa0, - 0x26, 0x3f, 0x84, 0x73, 0x8b, 0xbe, 0xe7, 0xd1, 0x06, 0x5b, 0x41, 0x97, 0x5c, 0x67, 0xdf, 0xf3, - 0xc3, 0xc8, 0x6d, 0xac, 0x2e, 0x95, 0x4b, 0xf1, 0xf6, 0xd0, 0x50, 0x18, 0xf5, 0xa6, 0x42, 0x31, - 0xb7, 0x87, 0x1c, 0x2e, 0xe4, 0x07, 0x30, 0x21, 0xea, 0xa2, 0x01, 0x4e, 0xcd, 0xb3, 0xdd, 0x27, - 0x9a, 0x42, 0xe6, 0x1b, 0x7d, 0x20, 0x7f, 0x72, 0xd5, 0xc9, 0xe4, 0x45, 0xbe, 0x86, 0xb1, 0xf5, - 0x7b, 0x55, 0x9b, 0x86, 0x6d, 0xdf, 0x0b, 0x69, 0x99, 0xe0, 0x88, 0x5e, 0x16, 0xac, 0xd7, 0xef, - 0x55, 0xab, 0x9d, 0xe8, 0x80, 0x7a, 0x91, 0xdb, 0x70, 0x22, 0x2a, 0xb1, 0x16, 0xe6, 0xd8, 0xcc, - 0x3b, 0x7c, 0xec, 0xd4, 0x03, 0x01, 0xd1, 0x7a, 0xa1, 0xb3, 0x23, 0x73, 0x30, 0x52, 0xab, 0xad, - 0xac, 0xf9, 0xfb, 0xae, 0x57, 0x9e, 0x62, 0xc2, 0xb0, 0xd5, 0x6f, 0xf2, 0x18, 0x66, 0xb4, 0xb3, - 0x41, 0x9d, 0xfd, 0x4f, 0x0f, 0xa9, 0x17, 0x95, 0xa7, 0xb1, 0x0d, 0xdf, 0x55, 0x87, 0x9b, 0x9b, - 0xfa, 0x11, 0xe2, 0xe9, 0x9d, 0x9b, 0xd5, 0xf8, 0x67, 0x4d, 0x12, 0x2d, 0x14, 0xcb, 0x05, 0x7b, - 0xda, 0xc9, 0x28, 0x21, 0xdb, 0x30, 0xbc, 0xd5, 0x09, 0xda, 0x7e, 0x48, 0xcb, 0x33, 0x28, 0xb8, - 0x6b, 0xdd, 0xbe, 0x50, 0x81, 0xba, 0x30, 0xc3, 0x96, 0xe8, 0x36, 0xff, 0xa1, 0xf5, 0x4e, 0xb2, - 0x22, 0x9f, 0xc1, 0x78, 0xad, 0xb6, 0x12, 0x6f, 0x28, 0xe7, 0x70, 0x43, 0xb9, 0x78, 0x7c, 0x54, - 0x29, 0x33, 0x95, 0x2a, 0xde, 0x54, 0xf4, 0xaf, 0x4a, 0xa7, 0x60, 0x1c, 0xb6, 0xd7, 0x6a, 0x31, - 0x87, 0xd9, 0x98, 0x03, 0x53, 0xe6, 0xb2, 0x39, 0xe8, 0x14, 0xe4, 0x9f, 0x17, 0xe0, 0x8a, 0xce, - 0x32, 0x4b, 0x30, 0xe5, 0xf3, 0x2f, 0x22, 0xcd, 0xf9, 0xe3, 0xa3, 0xca, 0x4d, 0xb3, 0x1f, 0xf5, - 0xcc, 0xc1, 0xd2, 0xda, 0xd6, 0xb3, 0x29, 0xd8, 0x5e, 0xbd, 0x03, 0x99, 0xed, 0x9d, 0x7b, 0xe1, - 0xf6, 0x9a, 0x52, 0xeb, 0xdd, 0xde, 0x5e, 0x4d, 0xb1, 0xbe, 0x80, 0x51, 0xb5, 0x68, 0x93, 0x61, - 0xe8, 0xaf, 0xb6, 0x5a, 0xa5, 0x3e, 0xf6, 0x47, 0xad, 0xb6, 0x52, 0x2a, 0x90, 0x49, 0x80, 0x78, - 0xa7, 0x2a, 0x15, 0xc9, 0x38, 0x8c, 0xc8, 0x9d, 0xa4, 0xd4, 0x8f, 0xf8, 0xed, 0x76, 0x69, 0x80, - 0x10, 0x98, 0x34, 0xd7, 0xb3, 0xd2, 0xa0, 0xf5, 0xbb, 0x05, 0x18, 0x55, 0xdf, 0x21, 0x39, 0x03, - 0x63, 0x3b, 0x1b, 0xb5, 0xad, 0xe5, 0xc5, 0xd5, 0x7b, 0xab, 0xcb, 0x4b, 0xa5, 0x3e, 0x72, 0x09, - 0xce, 0x6f, 0xd7, 0x56, 0xea, 0x4b, 0x0b, 0xf5, 0xb5, 0xcd, 0xc5, 0xea, 0x5a, 0x7d, 0xcb, 0xde, - 0xfc, 0xe2, 0xcb, 0xfa, 0xf6, 0xce, 0xc6, 0xc6, 0xf2, 0x5a, 0xa9, 0x40, 0xca, 0x30, 0xcd, 0x8a, - 0x1f, 0xee, 0x2c, 0x2c, 0xeb, 0x08, 0xa5, 0x22, 0xb9, 0x0a, 0x97, 0xb2, 0x4a, 0xea, 0x2b, 0xcb, - 0xd5, 0xa5, 0xb5, 0xe5, 0x5a, 0xad, 0xd4, 0x4f, 0x66, 0x61, 0x8a, 0xa1, 0x54, 0xb7, 0xb6, 0x0c, - 0xda, 0x01, 0xab, 0x05, 0x63, 0xda, 0x07, 0x40, 0x2e, 0x42, 0x79, 0x71, 0xd9, 0xde, 0xae, 0x6f, - 0xed, 0xd8, 0x5b, 0x9b, 0xb5, 0xe5, 0xba, 0xd9, 0xc2, 0x64, 0xe9, 0xda, 0xe6, 0xfd, 0xd5, 0x8d, - 0x3a, 0x03, 0xd5, 0x4a, 0x05, 0xd6, 0x0c, 0xa3, 0xb4, 0xb6, 0xba, 0x71, 0x7f, 0x6d, 0xb9, 0xbe, - 0x53, 0x5b, 0x16, 0x28, 0x45, 0xeb, 0xa7, 0xc5, 0xd4, 0x96, 0x4e, 0xe6, 0x61, 0xac, 0xc6, 0xed, - 0x15, 0xb8, 0xcc, 0xf1, 0x03, 0x22, 0xd3, 0xd1, 0xc6, 0x85, 0x19, 0x83, 0xaf, 0x60, 0x3a, 0x12, - 0xd3, 0xd2, 0xb6, 0xd8, 0xd7, 0xdc, 0xf0, 0x5b, 0xba, 0x96, 0xd6, 0x16, 0x30, 0x5b, 0x95, 0x92, - 0x79, 0x4d, 0x9f, 0xe3, 0xa7, 0x45, 0x3c, 0x91, 0x48, 0x7d, 0x4e, 0xdf, 0xdb, 0x95, 0x66, 0x37, - 0x1f, 0x0f, 0xa9, 0x50, 0xc3, 0x90, 0x26, 0x43, 0x97, 0x50, 0x78, 0xe4, 0x2d, 0xa9, 0xe9, 0xf2, - 0xd3, 0x1d, 0x6e, 0xf6, 0x89, 0x73, 0x89, 0x50, 0x72, 0xad, 0x4e, 0xce, 0xc6, 0x4a, 0x3e, 0x4a, - 0xce, 0x19, 0x21, 0x0c, 0x64, 0x96, 0xd8, 0x3f, 0xed, 0x04, 0x2a, 0xa9, 0xc0, 0x20, 0x5f, 0x71, - 0xb9, 0x3c, 0x50, 0xb7, 0x6e, 0x31, 0x80, 0xcd, 0xe1, 0xd6, 0x1f, 0xf5, 0xeb, 0x4a, 0x06, 0xd3, - 0xa5, 0x35, 0x79, 0xa3, 0x2e, 0x8d, 0x72, 0x46, 0x28, 0x53, 0x9b, 0x6b, 0x34, 0x0c, 0xf9, 0x79, - 0xa7, 0xa8, 0x86, 0x04, 0x42, 0x0e, 0xac, 0xbb, 0x4d, 0xa6, 0x36, 0x2b, 0x14, 0x76, 0x74, 0xe4, - 0x5f, 0x15, 0x1e, 0x1d, 0xfb, 0xe3, 0xa3, 0xa3, 0xf8, 0x34, 0xf9, 0xd1, 0x31, 0x46, 0x61, 0xa3, - 0x2e, 0xd4, 0x3c, 0x6c, 0xc5, 0x40, 0x3c, 0xea, 0x42, 0x35, 0x14, 0xa3, 0xae, 0x21, 0x91, 0x0f, - 0x01, 0xaa, 0x8f, 0x6a, 0x78, 0x46, 0xb2, 0x37, 0x84, 0xaa, 0x8b, 0x9b, 0x92, 0xf3, 0x2c, 0x14, - 0x47, 0xb0, 0x40, 0x3f, 0x63, 0x6a, 0xd8, 0x64, 0x01, 0x26, 0xaa, 0x3f, 0xe9, 0x04, 0x74, 0xb5, - 0xc9, 0xf6, 0xb5, 0x88, 0x1f, 0xa6, 0x47, 0xf9, 0xc2, 0xeb, 0xb0, 0x82, 0xba, 0x2b, 0x4a, 0x34, - 0x06, 0x26, 0x09, 0xd9, 0x84, 0xb3, 0xf7, 0x17, 0xb7, 0xc4, 0x3c, 0xac, 0x36, 0x1a, 0x7e, 0xc7, - 0x8b, 0x84, 0x7e, 0x7b, 0xf5, 0xf8, 0xa8, 0x72, 0x69, 0xbf, 0xd1, 0xae, 0xcb, 0x39, 0xeb, 0xf0, - 0x62, 0x5d, 0xc1, 0x4d, 0xd1, 0x92, 0x6b, 0xd0, 0xbf, 0x63, 0xaf, 0x8a, 0x93, 0xf6, 0xd9, 0xe3, - 0xa3, 0xca, 0x44, 0x27, 0x70, 0x35, 0x12, 0x56, 0x6a, 0xb5, 0x60, 0xf2, 0x3e, 0x8d, 0xd8, 0xe4, - 0x94, 0x67, 0x9a, 0xee, 0x43, 0xf7, 0x31, 0x8c, 0x3d, 0x72, 0xa3, 0x83, 0x1a, 0x6d, 0x04, 0x34, - 0x92, 0xf6, 0x1c, 0x14, 0xd3, 0x33, 0x37, 0x3a, 0xa8, 0x87, 0x1c, 0xae, 0xef, 0xdd, 0x1a, 0xba, - 0xb5, 0x0c, 0x67, 0x44, 0x6d, 0xea, 0x08, 0x35, 0x6f, 0x32, 0x2c, 0x20, 0x43, 0x1c, 0x2a, 0x9d, - 0xa1, 0xc9, 0xe6, 0x8f, 0x8a, 0x30, 0xb3, 0x78, 0xe0, 0x78, 0xfb, 0x74, 0xcb, 0x09, 0xc3, 0x67, - 0x7e, 0xd0, 0xd4, 0x1a, 0x8f, 0xe7, 0xc7, 0x54, 0xe3, 0xf1, 0xc0, 0x38, 0x0f, 0x63, 0x9b, 0xad, - 0xa6, 0xa4, 0x11, 0x67, 0x5b, 0xac, 0xcb, 0x6f, 0x35, 0xeb, 0x6d, 0xc9, 0x4b, 0x47, 0x62, 0x34, - 0x1b, 0xf4, 0x99, 0xa2, 0xe9, 0x8f, 0x69, 0x3c, 0xfa, 0x4c, 0xa3, 0xd1, 0x90, 0xc8, 0x32, 0x9c, - 0xad, 0xd1, 0x86, 0xef, 0x35, 0xef, 0x39, 0x8d, 0xc8, 0x0f, 0xb6, 0xfd, 0x27, 0xd4, 0x13, 0x93, - 0x10, 0x95, 0xff, 0x10, 0x0b, 0xeb, 0x8f, 0xb1, 0xb4, 0x1e, 0xb1, 0x62, 0x3b, 0x4d, 0x41, 0x36, - 0x61, 0xe4, 0x91, 0xb0, 0x0a, 0x8a, 0x03, 0xf1, 0xeb, 0x37, 0x95, 0x99, 0x70, 0x31, 0xa0, 0x38, - 0x73, 0x9c, 0x96, 0x3a, 0xd2, 0x2b, 0x5d, 0x0a, 0x97, 0x2b, 0x89, 0x69, 0x2b, 0x26, 0xd6, 0x0e, - 0x4c, 0x6c, 0xb5, 0x3a, 0xfb, 0xae, 0xc7, 0x16, 0x96, 0x1a, 0xfd, 0x31, 0x59, 0x02, 0x88, 0x01, - 0xc2, 0xd6, 0x37, 0x25, 0x8e, 0xd1, 0x71, 0xc1, 0xee, 0x5d, 0xf1, 0xb5, 0x21, 0x04, 0x4f, 0x3d, - 0xb6, 0x46, 0x67, 0xfd, 0xcf, 0x7e, 0x20, 0x62, 0x00, 0x70, 0xa3, 0xab, 0xd1, 0x88, 0x6d, 0x41, - 0xe7, 0xa0, 0xa8, 0x4c, 0x72, 0x43, 0xc7, 0x47, 0x95, 0xa2, 0xdb, 0xb4, 0x8b, 0xab, 0x4b, 0xe4, - 0x1d, 0x18, 0x44, 0x34, 0x94, 0xff, 0xa4, 0xaa, 0x4f, 0xe7, 0xc0, 0x17, 0x18, 0xdc, 0x61, 0x6d, - 0x8e, 0x4c, 0xde, 0x85, 0xd1, 0x25, 0xda, 0xa2, 0xfb, 0x4e, 0xe4, 0xcb, 0x25, 0x80, 0x1b, 0xb9, - 0x24, 0x50, 0x9b, 0x73, 0x31, 0x26, 0x3b, 0xf2, 0xda, 0xd4, 0x09, 0x7d, 0x4f, 0x3f, 0xf2, 0x06, - 0x08, 0xd1, 0x8f, 0xbc, 0x1c, 0x87, 0xfc, 0x5e, 0x01, 0xc6, 0xaa, 0x9e, 0x27, 0x8c, 0x47, 0xa1, - 0x90, 0xfa, 0xcc, 0x4d, 0x65, 0x6d, 0x5d, 0x73, 0xf6, 0x68, 0x6b, 0xd7, 0x69, 0x75, 0x68, 0xb8, - 0xf0, 0x35, 0x3b, 0x85, 0xfc, 0x87, 0xa3, 0xca, 0x47, 0xa7, 0x30, 0x07, 0xc5, 0x76, 0xdb, 0xed, - 0xc0, 0x71, 0xa3, 0xf0, 0xf8, 0xa8, 0x32, 0xe3, 0xc4, 0x15, 0xea, 0xdf, 0x8d, 0xd6, 0x8e, 0x78, - 0xfd, 0x1f, 0xea, 0xb5, 0xfe, 0x93, 0x43, 0x38, 0x53, 0x0d, 0xc3, 0xce, 0x21, 0xad, 0x45, 0x4e, - 0x10, 0x6d, 0xbb, 0x87, 0x14, 0x17, 0x91, 0xee, 0x06, 0x84, 0x37, 0x7f, 0x76, 0x54, 0x29, 0xb0, - 0x83, 0x8f, 0x83, 0xa4, 0x4c, 0xb7, 0x09, 0xa2, 0x7a, 0xe4, 0xea, 0x5b, 0x18, 0x9a, 0x12, 0x92, - 0xbc, 0xad, 0x6b, 0x4a, 0xe9, 0x58, 0x5d, 0xca, 0x1b, 0x71, 0x6b, 0x11, 0x2e, 0xde, 0xa7, 0x91, - 0x4d, 0x43, 0x1a, 0xc9, 0x6f, 0x04, 0x67, 0x78, 0x6c, 0xc0, 0x1d, 0xc6, 0xdf, 0x8a, 0x18, 0x87, - 0x9f, 0x7f, 0x17, 0xb2, 0xc4, 0xfa, 0xbf, 0x0a, 0x50, 0x59, 0x0c, 0x28, 0x3f, 0x33, 0xe4, 0x30, - 0xea, 0xbe, 0x76, 0x5d, 0x84, 0x81, 0xed, 0xe7, 0x6d, 0x69, 0x79, 0xc1, 0x52, 0x36, 0x28, 0x36, - 0x42, 0x4f, 0x68, 0xc8, 0xb2, 0x1e, 0xc3, 0x8c, 0x4d, 0x3d, 0xfa, 0xcc, 0xd9, 0x6b, 0x51, 0xc3, - 0x16, 0x54, 0x81, 0x41, 0xfe, 0xa1, 0xa7, 0xba, 0xc0, 0xe1, 0xa7, 0xb3, 0xab, 0x59, 0x13, 0x30, - 0xb6, 0xe5, 0x7a, 0xfb, 0x82, 0xbb, 0xf5, 0x87, 0xfd, 0x30, 0xce, 0x7f, 0x8b, 0x63, 0x50, 0x62, - 0x8b, 0x2b, 0x9c, 0x64, 0x8b, 0x7b, 0x1f, 0x26, 0xd8, 0x1e, 0x41, 0x83, 0x5d, 0x1a, 0xb0, 0xad, - 0x55, 0x48, 0x02, 0x8f, 0x74, 0x21, 0x16, 0xd4, 0x9f, 0xf2, 0x12, 0xdb, 0x44, 0x24, 0x6b, 0x30, - 0xc9, 0x01, 0xf7, 0xa8, 0x13, 0x75, 0x62, 0xab, 0xd4, 0x19, 0x71, 0xee, 0x91, 0x60, 0x3e, 0x35, - 0x05, 0xaf, 0xc7, 0x02, 0x68, 0x27, 0x68, 0xc9, 0xa7, 0x70, 0x66, 0x2b, 0xf0, 0xbf, 0x79, 0xae, - 0x6d, 0xea, 0xfc, 0xeb, 0xe4, 0x27, 0x24, 0x56, 0x54, 0xd7, 0xb7, 0xf6, 0x24, 0x36, 0x79, 0x0b, - 0x46, 0x56, 0xc3, 0x05, 0x3f, 0x70, 0xbd, 0x7d, 0xfc, 0x46, 0x47, 0xb8, 0x31, 0xdf, 0x0d, 0xeb, - 0x7b, 0x08, 0xb4, 0x55, 0x71, 0xc2, 0xec, 0x3c, 0xdc, 0xdb, 0xec, 0x7c, 0x1b, 0x60, 0xcd, 0x77, - 0x9a, 0xd5, 0x56, 0x6b, 0xb1, 0x1a, 0xe2, 0xee, 0x29, 0xf6, 0xa3, 0x96, 0xef, 0x34, 0xeb, 0x4e, - 0xab, 0x55, 0x6f, 0x38, 0xa1, 0xad, 0xe1, 0x3c, 0x18, 0x18, 0x19, 0x2a, 0x0d, 0xdb, 0x67, 0xd6, - 0xdc, 0x06, 0xf5, 0x42, 0xfa, 0xc8, 0x09, 0x3c, 0xd7, 0xdb, 0x0f, 0xad, 0x7f, 0x71, 0x16, 0x46, - 0x54, 0x97, 0x6f, 0xea, 0x8a, 0xbd, 0xd8, 0xe5, 0x70, 0xf4, 0x63, 0xb3, 0x95, 0xad, 0x61, 0x90, - 0xf3, 0xa8, 0xea, 0x8b, 0xfd, 0x75, 0x98, 0xcd, 0x46, 0xa7, 0xdd, 0xb6, 0x19, 0x8c, 0x7d, 0x65, - 0x4b, 0x0b, 0x28, 0xff, 0x11, 0xfe, 0x95, 0x35, 0xf7, 0xec, 0xe2, 0xd2, 0x02, 0x9b, 0xde, 0x9b, - 0xab, 0x4b, 0x8b, 0x28, 0xca, 0x11, 0x3e, 0xbd, 0x7d, 0xb7, 0xd9, 0xb0, 0x11, 0xca, 0x4a, 0x6b, - 0xd5, 0xf5, 0x35, 0x21, 0x2e, 0x2c, 0x0d, 0x9d, 0xc3, 0x96, 0x8d, 0x50, 0xa6, 0x1c, 0x72, 0x0b, - 0xc4, 0xa2, 0xef, 0x45, 0x81, 0xdf, 0x0a, 0x51, 0x83, 0x19, 0xe1, 0xc3, 0x29, 0x4c, 0x17, 0x0d, - 0x51, 0x64, 0x27, 0x50, 0xc9, 0x23, 0x98, 0xad, 0x36, 0x9f, 0x3a, 0x5e, 0x83, 0x36, 0x79, 0xc9, - 0x23, 0x3f, 0x78, 0xf2, 0xb8, 0xe5, 0x3f, 0x0b, 0x51, 0xde, 0x23, 0xc2, 0xd2, 0x27, 0x50, 0xa4, - 0x25, 0xe4, 0x99, 0x44, 0xb2, 0xf3, 0xa8, 0xd9, 0x27, 0xb5, 0xd8, 0xf2, 0x3b, 0x4d, 0x31, 0x0a, - 0xf8, 0x49, 0x35, 0x18, 0xc0, 0xe6, 0x70, 0x26, 0xa5, 0x95, 0xda, 0x3a, 0xda, 0xd5, 0x84, 0x94, - 0x0e, 0xc2, 0x43, 0x9b, 0xc1, 0xc8, 0xeb, 0x30, 0x2c, 0xf5, 0x5c, 0x6e, 0xf8, 0x47, 0x83, 0xb3, - 0xd4, 0x6f, 0x65, 0x19, 0xfb, 0x24, 0x6c, 0xda, 0xf0, 0x9f, 0xd2, 0xe0, 0xf9, 0xa2, 0xdf, 0xa4, - 0xd2, 0x0a, 0x24, 0xac, 0x1c, 0xbc, 0xa0, 0xde, 0x60, 0x25, 0xb6, 0x89, 0xc8, 0x2a, 0xe0, 0x7b, - 0x60, 0x58, 0x3e, 0x13, 0x57, 0xc0, 0xf7, 0xc8, 0xd0, 0x96, 0x65, 0x64, 0x09, 0xce, 0x56, 0x3b, - 0x91, 0x7f, 0xe8, 0x44, 0x6e, 0x63, 0xa7, 0xbd, 0x1f, 0x38, 0xac, 0x92, 0x12, 0x12, 0xa0, 0xde, - 0xef, 0xc8, 0xc2, 0x7a, 0x47, 0x94, 0xda, 0x69, 0x02, 0xf2, 0x1e, 0x8c, 0xaf, 0x86, 0xdc, 0xd2, - 0xe7, 0x84, 0xb4, 0x89, 0xe6, 0x1a, 0xd1, 0x4a, 0x37, 0xac, 0xa3, 0xdd, 0xaf, 0xce, 0x4e, 0x0a, - 0x4d, 0xdb, 0xc0, 0x23, 0x16, 0x0c, 0x55, 0xc3, 0xd0, 0x0d, 0x23, 0xb4, 0xc2, 0x8c, 0x2c, 0xc0, - 0xf1, 0x51, 0x65, 0xc8, 0x41, 0x88, 0x2d, 0x4a, 0xc8, 0x23, 0x18, 0x5b, 0xa2, 0x4c, 0x71, 0xdc, - 0x0e, 0x3a, 0x61, 0x84, 0x36, 0x95, 0xb1, 0xf9, 0xf3, 0xe2, 0xc3, 0xd6, 0x4a, 0xc4, 0x5c, 0xe6, - 0xda, 0x5e, 0x13, 0xe1, 0xf5, 0x88, 0x15, 0xe8, 0xbb, 0x96, 0x86, 0xcf, 0xb4, 0x62, 0x41, 0xb3, - 0xe2, 0x36, 0xd9, 0xa7, 0x3a, 0x8d, 0x6d, 0x40, 0xad, 0x58, 0xac, 0x0d, 0xf5, 0x03, 0x2c, 0xd1, - 0xb5, 0x62, 0x83, 0x84, 0x34, 0x52, 0xc6, 0xe3, 0x19, 0xc3, 0x40, 0x68, 0x16, 0xca, 0x26, 0x9e, - 0xd2, 0xb4, 0xfc, 0x31, 0x8c, 0x2d, 0x76, 0xc2, 0xc8, 0x3f, 0xdc, 0x3e, 0xa0, 0x87, 0x14, 0xed, - 0x2e, 0x42, 0xf7, 0x6f, 0x20, 0xb8, 0x1e, 0x31, 0xb8, 0xde, 0x4d, 0x0d, 0x9d, 0x7c, 0x0e, 0x44, - 0x2a, 0xf1, 0xf7, 0xd9, 0xfc, 0xf0, 0xd8, 0x5c, 0x46, 0xd3, 0xcb, 0x08, 0xd7, 0xdc, 0xa5, 0xee, - 0x5f, 0xdf, 0x57, 0xc5, 0xba, 0xf9, 0x2f, 0x4d, 0xcc, 0x1a, 0xc4, 0x9b, 0x78, 0x3f, 0x70, 0xda, - 0x07, 0xe5, 0x72, 0xac, 0x65, 0x8b, 0x4e, 0xed, 0x33, 0xb8, 0xa1, 0x2d, 0xc4, 0xe8, 0xa4, 0x06, - 0xc0, 0x7f, 0xae, 0xb1, 0x81, 0xe7, 0xc6, 0x9a, 0xb2, 0x21, 0x2f, 0x56, 0x20, 0x65, 0x75, 0x1e, - 0x75, 0x10, 0xce, 0xb6, 0xe5, 0x1a, 0xa3, 0xa9, 0xb1, 0x21, 0x4f, 0xa0, 0xc4, 0x7f, 0xad, 0xfb, - 0x9e, 0x1b, 0xf1, 0xa5, 0x77, 0xce, 0xb0, 0xec, 0x25, 0x8b, 0x65, 0x05, 0x68, 0x51, 0x15, 0x15, - 0x1c, 0xaa, 0x52, 0xad, 0x9a, 0x14, 0x63, 0xb2, 0x05, 0x63, 0x5b, 0x81, 0xdf, 0xec, 0x34, 0x22, - 0xdc, 0xb0, 0x2f, 0xa0, 0xa2, 0x48, 0x44, 0x3d, 0x5a, 0x09, 0x97, 0x49, 0x9b, 0x03, 0xea, 0x6c, - 0x33, 0xd7, 0x65, 0xa2, 0x21, 0x92, 0x05, 0x18, 0xda, 0xf2, 0x5b, 0x6e, 0xe3, 0x79, 0xf9, 0x22, - 0x36, 0x7a, 0x5a, 0x32, 0x43, 0xa0, 0x6c, 0x2a, 0x6a, 0x87, 0x6d, 0x04, 0xe9, 0xda, 0x21, 0x47, - 0x22, 0x55, 0x98, 0xf8, 0x9c, 0x4d, 0x18, 0xd7, 0xf7, 0x3c, 0xc7, 0x0d, 0x68, 0xf9, 0x12, 0x8e, - 0x0b, 0x5a, 0xbd, 0x7f, 0xac, 0x17, 0xe8, 0xd3, 0xd9, 0xa0, 0x20, 0xab, 0x70, 0x66, 0x35, 0xac, - 0x45, 0x81, 0xdb, 0xa6, 0xeb, 0x8e, 0xe7, 0xec, 0xd3, 0x66, 0xf9, 0x72, 0x6c, 0x76, 0x76, 0xc3, - 0x7a, 0x88, 0x65, 0xf5, 0x43, 0x5e, 0xa8, 0x9b, 0x9d, 0x13, 0x74, 0xe4, 0x0b, 0x98, 0x5e, 0xfe, - 0x26, 0x62, 0x33, 0xa6, 0x55, 0xed, 0x34, 0xdd, 0xa8, 0x16, 0xf9, 0x81, 0xb3, 0x4f, 0xcb, 0x15, - 0xe4, 0xf7, 0xda, 0xf1, 0x51, 0xe5, 0x0a, 0x15, 0xe5, 0x75, 0x87, 0x21, 0xd4, 0x43, 0x8e, 0xa1, - 0x5f, 0x27, 0x67, 0x71, 0x60, 0xd2, 0xaf, 0x75, 0xda, 0x4c, 0x71, 0x45, 0xe9, 0x5f, 0x31, 0xa4, - 0xaf, 0x95, 0x70, 0xe9, 0x87, 0x1c, 0x90, 0x92, 0xbe, 0x86, 0x48, 0x6c, 0x20, 0x0f, 0x7c, 0xd7, - 0xab, 0x36, 0x22, 0xf7, 0x29, 0x15, 0xe7, 0xfa, 0xb0, 0x7c, 0x15, 0x5b, 0x8a, 0x26, 0xf2, 0x5f, - 0xf5, 0x5d, 0xaf, 0xee, 0x60, 0x71, 0x5d, 0x58, 0x01, 0x0c, 0x13, 0x79, 0x9a, 0x9a, 0xfc, 0x10, - 0xce, 0xad, 0xfb, 0x7b, 0x6e, 0x8b, 0xf2, 0x25, 0x87, 0x8b, 0x05, 0xcd, 0x7d, 0x16, 0xf2, 0x45, - 0x13, 0xf9, 0x21, 0x62, 0xd4, 0xc5, 0x6a, 0x75, 0xa8, 0x70, 0x74, 0x13, 0x79, 0x36, 0x17, 0xb2, - 0x0c, 0xe3, 0xf8, 0x5d, 0xb6, 0xf0, 0x67, 0x58, 0xbe, 0x86, 0xa7, 0xa3, 0xab, 0x09, 0x85, 0xe7, - 0xe6, 0xb2, 0x86, 0xb3, 0xec, 0x45, 0xc1, 0x73, 0xdb, 0x20, 0x23, 0x9f, 0xc0, 0x5c, 0x72, 0x7a, - 0x2f, 0xfa, 0xde, 0x63, 0x77, 0xbf, 0x13, 0xd0, 0x66, 0xf9, 0x35, 0xd6, 0x54, 0xbb, 0x0b, 0xc6, - 0xdc, 0x23, 0x38, 0x9b, 0xaa, 0x82, 0x94, 0xa0, 0xff, 0x89, 0xb8, 0x71, 0x1c, 0xb5, 0xd9, 0x9f, - 0xe4, 0x6d, 0x18, 0x7c, 0xca, 0x8e, 0x25, 0xa8, 0x31, 0xc4, 0x77, 0x58, 0x1a, 0xe9, 0xaa, 0xf7, - 0xd8, 0xb7, 0x39, 0xd2, 0x87, 0xc5, 0xf7, 0x0b, 0x0f, 0x06, 0x46, 0xc6, 0x4a, 0xe3, 0xfc, 0xa2, - 0xf8, 0xc1, 0xc0, 0xc8, 0x44, 0x69, 0xd2, 0xaa, 0xc2, 0x99, 0x04, 0x3e, 0x29, 0xc3, 0x30, 0xf5, - 0x98, 0xaa, 0xdb, 0xe4, 0x3a, 0x8b, 0x2d, 0x7f, 0x92, 0x69, 0x18, 0x6c, 0xb9, 0x87, 0x6e, 0x84, - 0x15, 0x0e, 0xda, 0xfc, 0x87, 0xf5, 0xfb, 0x05, 0x20, 0xe9, 0x2d, 0x83, 0xdc, 0x4a, 0xb0, 0xe1, - 0x8a, 0x9e, 0x00, 0xe9, 0xa6, 0x70, 0xc9, 0xfd, 0x73, 0x98, 0xe2, 0x63, 0x26, 0x37, 0x37, 0xad, - 0x2e, 0xbe, 0xa8, 0x66, 0x14, 0xeb, 0xe6, 0x10, 0x51, 0x8c, 0x5b, 0xe1, 0x1a, 0x36, 0xad, 0x03, - 0x33, 0x99, 0x9b, 0x05, 0x59, 0x87, 0x99, 0x43, 0xdf, 0x8b, 0x0e, 0x5a, 0xcf, 0xe5, 0x5e, 0x21, - 0x6a, 0x2b, 0x60, 0x6d, 0xb8, 0x3e, 0x66, 0x22, 0xd8, 0x53, 0x02, 0x2c, 0x38, 0x62, 0x3d, 0x0f, - 0x06, 0x46, 0x8a, 0xa5, 0x7e, 0xd5, 0x13, 0xcb, 0x86, 0xb3, 0xa9, 0x35, 0x97, 0x7c, 0x1f, 0xc6, - 0x1b, 0x78, 0x94, 0x31, 0x6a, 0xe2, 0x3b, 0x8e, 0x06, 0xd7, 0x3f, 0x27, 0x0e, 0xe7, 0x5d, 0xf9, - 0x27, 0x05, 0x98, 0xcd, 0x59, 0x6d, 0x4f, 0x2f, 0xea, 0x2f, 0xe1, 0xdc, 0xa1, 0xf3, 0x4d, 0x3d, - 0xc0, 0x93, 0x6a, 0x3d, 0x70, 0xbc, 0x84, 0xb4, 0x71, 0x25, 0xc9, 0xc6, 0xd0, 0xbd, 0x75, 0x0e, - 0x9d, 0x6f, 0x6c, 0x44, 0xb0, 0x59, 0x39, 0x6f, 0xe7, 0x67, 0x30, 0x61, 0xac, 0xaf, 0xa7, 0x6e, - 0x9c, 0x75, 0x07, 0xce, 0xb2, 0xb3, 0x7c, 0x44, 0x4f, 0x6c, 0xa1, 0xb2, 0xb6, 0x00, 0x6a, 0xf4, - 0xd0, 0x69, 0x1f, 0xf8, 0x4c, 0xef, 0x5e, 0xd0, 0x7f, 0x09, 0x0b, 0x07, 0x11, 0x16, 0x07, 0x55, - 0xb0, 0x7b, 0x97, 0xeb, 0xe2, 0xa1, 0xc2, 0xb4, 0x35, 0x2a, 0xeb, 0xcf, 0x8a, 0x40, 0xc4, 0x02, - 0x19, 0x50, 0xe7, 0x50, 0x36, 0xe3, 0x03, 0x18, 0xe7, 0xe7, 0x51, 0x0e, 0xc6, 0xe6, 0x8c, 0xcd, - 0x4f, 0x89, 0x2f, 0x4f, 0x2f, 0x5a, 0xe9, 0xb3, 0x0d, 0x54, 0x46, 0x6a, 0x53, 0x7e, 0x90, 0x46, - 0xd2, 0xa2, 0x41, 0xaa, 0x17, 0x31, 0x52, 0xfd, 0x37, 0xf9, 0x14, 0x26, 0x17, 0xfd, 0xc3, 0x36, - 0x93, 0x89, 0x20, 0xee, 0x17, 0x46, 0x0a, 0x51, 0xaf, 0x51, 0xb8, 0xd2, 0x67, 0x27, 0xd0, 0xc9, - 0x06, 0x4c, 0xdd, 0x6b, 0x75, 0xc2, 0x83, 0xaa, 0xd7, 0x5c, 0x6c, 0xf9, 0xa1, 0xe4, 0x32, 0x20, - 0x8c, 0x04, 0x62, 0x79, 0x4b, 0x63, 0xac, 0xf4, 0xd9, 0x59, 0x84, 0xe4, 0x75, 0x18, 0x5c, 0x7e, - 0xca, 0x96, 0x5d, 0xe9, 0xb3, 0x21, 0x5c, 0xca, 0x36, 0x3d, 0xba, 0xf9, 0x78, 0xa5, 0xcf, 0xe6, - 0xa5, 0x0b, 0xa3, 0x30, 0x2c, 0xcf, 0xb2, 0xb7, 0x98, 0x4a, 0xac, 0xc4, 0x59, 0x8b, 0x9c, 0xa8, - 0x13, 0x92, 0x39, 0x18, 0xd9, 0x69, 0xb3, 0x23, 0x96, 0x34, 0x02, 0xd8, 0xea, 0xb7, 0xf5, 0xb6, - 0x29, 0x69, 0x72, 0x51, 0xb7, 0x1f, 0x73, 0xe4, 0x18, 0x60, 0xad, 0x98, 0xc2, 0xed, 0x8e, 0x6d, - 0xd4, 0x5b, 0x4c, 0xd4, 0x5b, 0x4a, 0xca, 0xda, 0x9a, 0xc9, 0x14, 0x9e, 0xf5, 0x05, 0x5c, 0xde, - 0x69, 0x87, 0x34, 0x88, 0xaa, 0xed, 0x76, 0xcb, 0x6d, 0xf0, 0x3b, 0x1f, 0x3c, 0xf3, 0xca, 0xc9, - 0xf2, 0x1e, 0x0c, 0x71, 0x80, 0x98, 0x26, 0x72, 0x0e, 0x56, 0xdb, 0x6d, 0x71, 0xd2, 0xbe, 0xcb, - 0x95, 0x73, 0x7e, 0x76, 0xb6, 0x05, 0xb6, 0xf5, 0x3b, 0x05, 0xb8, 0xcc, 0xbf, 0x80, 0x5c, 0xd6, - 0xdf, 0x81, 0x51, 0xf4, 0xe8, 0x6a, 0x3b, 0x0d, 0xf9, 0x4d, 0x70, 0xd7, 0x36, 0x09, 0xb4, 0xe3, - 0x72, 0xcd, 0x57, 0xae, 0x98, 0xef, 0x2b, 0x27, 0x3f, 0xb0, 0xfe, 0xcc, 0x0f, 0xec, 0x73, 0xb0, - 0x44, 0x8b, 0x5a, 0xad, 0x54, 0xa3, 0xc2, 0x17, 0x69, 0x95, 0xf5, 0x5f, 0x8b, 0x30, 0x7b, 0x9f, - 0x7a, 0x34, 0x70, 0xb0, 0x9f, 0x86, 0x4d, 0x47, 0xf7, 0x99, 0x29, 0x74, 0xf5, 0x99, 0xa9, 0x48, - 0x2b, 0x59, 0x11, 0xad, 0x64, 0x29, 0x07, 0x20, 0x76, 0x5c, 0xdc, 0xb1, 0x57, 0x45, 0xb7, 0xf0, - 0xb8, 0xd8, 0x09, 0x5c, 0xb4, 0x83, 0x93, 0xd5, 0xd8, 0xdf, 0x66, 0xa0, 0xa7, 0xb9, 0x6c, 0x4a, - 0xf8, 0x1f, 0x0c, 0x0b, 0x7f, 0x1b, 0xd3, 0xcb, 0x66, 0x03, 0x86, 0xb8, 0x71, 0x0f, 0x6f, 0x6b, - 0xc6, 0xe6, 0x6f, 0x88, 0x6f, 0x2a, 0xa7, 0x83, 0xc2, 0x12, 0x88, 0x1b, 0x3b, 0x9f, 0x02, 0x11, - 0x02, 0x6c, 0xc1, 0x65, 0xee, 0x73, 0x18, 0xd3, 0x50, 0x4e, 0xb2, 0xf7, 0x2b, 0x23, 0x23, 0xd3, - 0x18, 0xbd, 0x7d, 0x6e, 0xaf, 0xd4, 0xf6, 0x7e, 0xeb, 0x23, 0x28, 0xa7, 0x5b, 0x23, 0x0c, 0x4b, - 0xbd, 0xec, 0x58, 0xd6, 0x12, 0x4c, 0xdf, 0xa7, 0x11, 0x4e, 0x5c, 0xfc, 0x88, 0x34, 0xbf, 0xb1, - 0xc4, 0x77, 0x26, 0x57, 0x55, 0x79, 0xab, 0xa3, 0x7f, 0xa5, 0x35, 0x98, 0x49, 0x70, 0x11, 0xf5, - 0x7f, 0x08, 0xc3, 0x02, 0xa4, 0x56, 0x54, 0xe1, 0x7c, 0x4a, 0xf7, 0x44, 0xc1, 0xee, 0x3c, 0x9f, - 0xb7, 0x82, 0xb3, 0x2d, 0x09, 0xac, 0x03, 0x38, 0xc7, 0xb6, 0xd9, 0x98, 0xab, 0x9a, 0x8e, 0x17, - 0x60, 0xb4, 0xcd, 0x14, 0x85, 0xd0, 0xfd, 0x09, 0x9f, 0x46, 0x83, 0xf6, 0x08, 0x03, 0xd4, 0xdc, - 0x9f, 0x50, 0x72, 0x09, 0x00, 0x0b, 0xb1, 0x9b, 0x62, 0x15, 0x40, 0x74, 0x6e, 0xb8, 0x23, 0x80, - 0x5e, 0x67, 0x7c, 0xde, 0xd8, 0xf8, 0xb7, 0x15, 0xc0, 0x6c, 0xaa, 0x26, 0xd1, 0x81, 0x5b, 0x30, - 0x22, 0x55, 0xd8, 0x84, 0x49, 0x5d, 0xef, 0x81, 0xad, 0x90, 0xc8, 0x1b, 0x70, 0xc6, 0xa3, 0xdf, - 0x44, 0xf5, 0x54, 0x1b, 0x26, 0x18, 0x78, 0x4b, 0xb6, 0xc3, 0xfa, 0x15, 0x34, 0xa3, 0xd6, 0x3c, - 0xff, 0xd9, 0xe3, 0x96, 0xf3, 0x84, 0xa6, 0x2a, 0xfe, 0x3e, 0x8c, 0xd4, 0x7a, 0x57, 0xcc, 0x3f, - 0x1f, 0x59, 0xb9, 0xad, 0x48, 0xac, 0x16, 0xcc, 0xb1, 0x2e, 0xd5, 0xaa, 0xeb, 0x6b, 0xab, 0xcd, - 0xad, 0x6f, 0x5b, 0x80, 0x4f, 0xe1, 0x42, 0x66, 0x6d, 0xdf, 0xb6, 0x10, 0xff, 0xd5, 0x00, 0xcc, - 0xf2, 0xcd, 0x24, 0x3d, 0x83, 0x4f, 0xbe, 0xd4, 0xfc, 0x52, 0x6e, 0x24, 0x6f, 0x67, 0xdc, 0x48, - 0x22, 0x89, 0x7e, 0x23, 0x69, 0xdc, 0x43, 0xbe, 0x9f, 0x7d, 0x0f, 0x89, 0x76, 0x22, 0xf3, 0x1e, - 0x32, 0x79, 0xfb, 0xb8, 0x9c, 0x7f, 0xfb, 0x88, 0xd7, 0x2c, 0x19, 0xb7, 0x8f, 0x59, 0x77, 0x8e, - 0x09, 0xd7, 0x9f, 0x91, 0x57, 0xeb, 0xfa, 0xf3, 0x06, 0x0c, 0x57, 0xdb, 0x6d, 0xcd, 0x95, 0x0e, - 0x87, 0xc7, 0x69, 0xb7, 0xb9, 0xf0, 0x64, 0xa1, 0x5c, 0xe7, 0x21, 0x63, 0x9d, 0xff, 0x00, 0x60, - 0x11, 0x1d, 0xfe, 0x71, 0xe0, 0xc6, 0x10, 0x03, 0x35, 0x7c, 0xfe, 0x0c, 0x00, 0x07, 0x4e, 0xb7, - 0x80, 0xc4, 0xc8, 0x5c, 0xb1, 0xb7, 0x76, 0xa1, 0x9c, 0x9e, 0x3e, 0xaf, 0x60, 0xe9, 0xfa, 0xe3, - 0x02, 0x5c, 0x12, 0x4a, 0x4e, 0xe2, 0x03, 0x3f, 0xfd, 0xec, 0x7c, 0x17, 0xc6, 0x05, 0xed, 0x76, - 0xfc, 0x21, 0xf0, 0x2b, 0x60, 0xb9, 0x18, 0xf3, 0x15, 0xdd, 0x40, 0x23, 0xef, 0xc2, 0x08, 0xfe, - 0x11, 0x5f, 0x83, 0x30, 0xc9, 0x8c, 0x22, 0x6a, 0x3d, 0x79, 0x19, 0xa2, 0x50, 0xad, 0xaf, 0xe1, - 0x72, 0x5e, 0xc3, 0x5f, 0x81, 0x5c, 0xfe, 0x75, 0x01, 0x2e, 0x08, 0xf6, 0xc6, 0x52, 0xf1, 0x42, - 0xbb, 0xce, 0x29, 0x1c, 0x70, 0x1f, 0xc0, 0x18, 0xab, 0x50, 0xb6, 0xbb, 0x5f, 0x6c, 0xad, 0xe2, - 0xe4, 0x10, 0x97, 0x2c, 0x39, 0x91, 0x23, 0x1c, 0x4a, 0x9c, 0xc3, 0x96, 0x34, 0x5e, 0xd8, 0x3a, - 0xb1, 0xf5, 0x15, 0x5c, 0xcc, 0xee, 0xc2, 0x2b, 0x90, 0xcf, 0x03, 0x98, 0xcb, 0xd8, 0x14, 0x5e, - 0x6c, 0x4f, 0xfe, 0x12, 0x2e, 0x64, 0xf2, 0x7a, 0x05, 0xcd, 0x5c, 0x61, 0x1a, 0x47, 0xf4, 0x0a, - 0x86, 0xd0, 0x7a, 0x04, 0xe7, 0x33, 0x38, 0xbd, 0x82, 0x26, 0xde, 0x87, 0x59, 0xa5, 0x69, 0xbf, - 0x54, 0x0b, 0xd7, 0xe1, 0x12, 0x67, 0xf4, 0x6a, 0x46, 0xe5, 0x21, 0x5c, 0x10, 0xec, 0x5e, 0x81, - 0xf4, 0x56, 0xe0, 0x62, 0x7c, 0xa0, 0xce, 0xd0, 0x93, 0x4e, 0xbc, 0xc8, 0x58, 0x6b, 0x70, 0x25, - 0xe6, 0x94, 0xa3, 0x34, 0x9c, 0x9c, 0x1b, 0x57, 0x07, 0xe3, 0x51, 0x7a, 0x25, 0x23, 0xfa, 0x08, - 0xce, 0x19, 0x4c, 0x5f, 0x99, 0xaa, 0xb4, 0x0a, 0x53, 0x9c, 0xb1, 0xa9, 0x3a, 0xcf, 0xeb, 0xaa, - 0xf3, 0xd8, 0xfc, 0xd9, 0x98, 0x25, 0x82, 0x77, 0xef, 0x66, 0x68, 0xd3, 0xeb, 0xa8, 0x4d, 0x4b, - 0x94, 0xb8, 0x85, 0xef, 0xc2, 0x10, 0x87, 0x88, 0xf6, 0x65, 0x30, 0xe3, 0x87, 0x05, 0x4e, 0x26, - 0x90, 0xad, 0x1f, 0xc2, 0x25, 0x7e, 0x12, 0x8d, 0xef, 0x12, 0xcd, 0xd3, 0xe2, 0xf7, 0x13, 0x07, - 0xd1, 0xf3, 0x82, 0x6f, 0x12, 0x3f, 0xe7, 0x3c, 0xba, 0x27, 0xe7, 0x76, 0x1e, 0xff, 0x13, 0x3d, - 0xc6, 0x92, 0x07, 0xcc, 0x62, 0xe6, 0x01, 0xf3, 0x1a, 0x5c, 0x55, 0x07, 0xcc, 0x64, 0x35, 0x72, - 0x6a, 0x59, 0x5f, 0xc1, 0x05, 0xde, 0x51, 0xe9, 0x24, 0x67, 0x36, 0xe3, 0xa3, 0x44, 0x37, 0x67, - 0x45, 0x37, 0x4d, 0xec, 0x9c, 0x4e, 0xfe, 0xbf, 0x05, 0xf9, 0xc9, 0x65, 0x33, 0xff, 0x65, 0x9f, - 0xb8, 0x37, 0xa0, 0xa2, 0x04, 0x62, 0xb6, 0xe8, 0xc5, 0x8e, 0xdb, 0xeb, 0x30, 0xa3, 0xb3, 0x71, - 0x1b, 0x74, 0xf7, 0x0e, 0x5e, 0xf2, 0xbc, 0xc3, 0x3e, 0x0b, 0x04, 0xc8, 0x69, 0x57, 0xce, 0x90, - 0x1b, 0xe2, 0xdb, 0x0a, 0xd3, 0xaa, 0xc3, 0xc5, 0xf4, 0x50, 0xb8, 0x0d, 0xe9, 0x21, 0x4f, 0x3e, - 0x65, 0x9f, 0x30, 0x42, 0xc4, 0x60, 0xe4, 0x32, 0x95, 0xdf, 0x31, 0x27, 0x97, 0x54, 0x96, 0x25, - 0x97, 0x9a, 0x44, 0xff, 0x59, 0xed, 0x72, 0x3e, 0xfc, 0x3a, 0x10, 0x59, 0xb4, 0x58, 0xb3, 0x65, - 0xd5, 0xe7, 0xa1, 0x7f, 0xb1, 0x66, 0x8b, 0xa7, 0x39, 0xa8, 0x09, 0x36, 0xc2, 0xc0, 0x66, 0xb0, - 0xa4, 0x46, 0x5e, 0x3c, 0x81, 0x46, 0xfe, 0x60, 0x60, 0xa4, 0xbf, 0x34, 0x60, 0x93, 0x9a, 0xbb, - 0xef, 0x3d, 0x72, 0xa3, 0x03, 0x55, 0x61, 0xd5, 0xfa, 0x01, 0x4c, 0x19, 0xd5, 0x8b, 0xaf, 0xb8, - 0xeb, 0x9b, 0x22, 0xa6, 0xcf, 0x2e, 0x56, 0xd1, 0x89, 0x04, 0x4d, 0x16, 0xe3, 0x7c, 0xbd, 0x69, - 0x38, 0x75, 0x7c, 0xb0, 0x6a, 0xcb, 0x42, 0xeb, 0x1f, 0x0f, 0x68, 0xdc, 0xb5, 0x97, 0x5a, 0x5d, - 0x7a, 0x77, 0x07, 0x80, 0xcf, 0x10, 0xad, 0x73, 0x4c, 0x01, 0x1c, 0x13, 0xbe, 0x19, 0x7c, 0x49, - 0xb6, 0x35, 0xa4, 0x93, 0xbe, 0xe4, 0x12, 0x1e, 0xb5, 0x9c, 0x48, 0x3e, 0x5e, 0x54, 0x1e, 0xb5, - 0x82, 0x75, 0x68, 0xeb, 0x48, 0xe4, 0x87, 0xc9, 0xe7, 0x06, 0x83, 0x78, 0xa7, 0xf4, 0x9a, 0xbc, - 0x64, 0x4e, 0xf7, 0xed, 0x74, 0x2f, 0x0e, 0x9e, 0xc1, 0x0c, 0xa3, 0x75, 0x1f, 0xe3, 0xc1, 0x62, - 0xf9, 0x9b, 0x88, 0x7a, 0x7c, 0x6d, 0x1f, 0xc2, 0x7a, 0x5e, 0xef, 0x52, 0x4f, 0x8c, 0x2c, 0xec, - 0xef, 0x31, 0x9f, 0x3a, 0x55, 0x65, 0x76, 0x36, 0x7f, 0x9c, 0x44, 0xf6, 0xda, 0xb2, 0xd7, 0x6c, - 0xfb, 0xae, 0x3a, 0x30, 0xf1, 0x49, 0x14, 0xb4, 0xea, 0x54, 0xc0, 0x6d, 0x1d, 0xc9, 0x7a, 0xa3, - 0xab, 0x9f, 0xf6, 0x08, 0x0c, 0x6c, 0x2f, 0x6e, 0xaf, 0x95, 0x0a, 0xd6, 0x2d, 0x00, 0xad, 0x26, - 0x80, 0xa1, 0x8d, 0x4d, 0x7b, 0xbd, 0xba, 0x56, 0xea, 0x23, 0x33, 0x70, 0xf6, 0xd1, 0xea, 0xc6, - 0xd2, 0xe6, 0xa3, 0x5a, 0xbd, 0xb6, 0x5e, 0xb5, 0xb7, 0x17, 0xab, 0xf6, 0x52, 0xa9, 0x60, 0x7d, - 0x0d, 0xd3, 0x66, 0x0f, 0x5f, 0xe9, 0x24, 0x8c, 0x60, 0x4a, 0xe9, 0x33, 0x0f, 0x1e, 0x6d, 0x6b, - 0xfe, 0x9b, 0xe2, 0xf0, 0x97, 0xf4, 0x43, 0x12, 0xc7, 0x44, 0xf1, 0x19, 0x69, 0x48, 0xe4, 0x2d, - 0xae, 0x16, 0x24, 0xdf, 0xe2, 0x32, 0xb5, 0xa0, 0x1e, 0xeb, 0x05, 0xb8, 0xf4, 0x7d, 0x0f, 0xa6, - 0xcd, 0x5a, 0x4f, 0x6a, 0xa5, 0x7a, 0x0d, 0x1d, 0x5b, 0xb5, 0x87, 0x3a, 0x84, 0xe8, 0xd7, 0x06, - 0x62, 0x65, 0xfd, 0x1e, 0x94, 0x04, 0x56, 0xbc, 0xf3, 0x5e, 0x93, 0x66, 0xc4, 0x42, 0xc6, 0xb3, - 0x42, 0xe9, 0x66, 0xed, 0x43, 0x89, 0xad, 0x98, 0x82, 0x92, 0x57, 0x30, 0x0d, 0x83, 0x6b, 0xf1, - 0x75, 0x8e, 0xcd, 0x7f, 0xe0, 0x7b, 0x95, 0xc8, 0x09, 0x22, 0xe9, 0xf5, 0x35, 0x6a, 0xab, 0xdf, - 0xe4, 0x2d, 0x18, 0xba, 0xe7, 0xb6, 0x22, 0x61, 0x1a, 0x89, 0x37, 0x79, 0xc6, 0x96, 0x17, 0xd8, - 0x02, 0xc1, 0xb2, 0xe1, 0xac, 0x56, 0xe1, 0x29, 0x9a, 0x4a, 0xca, 0x30, 0xbc, 0x41, 0xbf, 0xd1, - 0xea, 0x97, 0x3f, 0xad, 0xf7, 0xe0, 0xac, 0xf0, 0xa8, 0xd3, 0xc4, 0x74, 0x55, 0xbc, 0x7e, 0x2e, - 0x18, 0x4f, 0x30, 0x05, 0x4b, 0x2c, 0x62, 0x74, 0x3b, 0xed, 0xe6, 0x0b, 0xd2, 0xb1, 0x8d, 0xe2, - 0x94, 0x74, 0x6f, 0xca, 0x5b, 0xa0, 0x5e, 0xc3, 0xf9, 0x67, 0x05, 0x28, 0x27, 0xac, 0x0c, 0x8b, - 0x07, 0x4e, 0xab, 0x45, 0xbd, 0x7d, 0x4a, 0xae, 0xc3, 0xc0, 0xf6, 0xe6, 0xf6, 0x96, 0xb0, 0x92, - 0x4a, 0x07, 0x00, 0x06, 0x52, 0x38, 0x36, 0x62, 0x90, 0x87, 0x70, 0x56, 0xfa, 0xcc, 0xaa, 0x22, - 0x31, 0x42, 0x97, 0xba, 0x7b, 0xe0, 0xa6, 0xe9, 0xc8, 0x3b, 0xc2, 0x24, 0xf2, 0xe3, 0x8e, 0x1b, - 0xd0, 0x26, 0x5a, 0x7e, 0xe2, 0xdb, 0x74, 0xad, 0xc4, 0xd6, 0xd1, 0xf8, 0x5b, 0x55, 0xeb, 0xf7, - 0x0a, 0x30, 0x9b, 0x63, 0x35, 0x21, 0x6f, 0x19, 0xdd, 0x99, 0xd2, 0xba, 0x23, 0x51, 0x56, 0xfa, - 0x44, 0x7f, 0x16, 0x35, 0x47, 0xe2, 0xfe, 0x53, 0x38, 0x12, 0xaf, 0xf4, 0xc5, 0xce, 0xc3, 0x0b, - 0x00, 0x23, 0x12, 0x6e, 0x9d, 0x81, 0x09, 0x43, 0x6e, 0x96, 0x05, 0xe3, 0x7a, 0xcd, 0x6c, 0x70, - 0x16, 0xfd, 0xa6, 0x1a, 0x1c, 0xf6, 0xb7, 0xf5, 0xbb, 0x05, 0x98, 0xc6, 0x2e, 0xee, 0xbb, 0x6c, - 0xe9, 0x8b, 0x25, 0x34, 0x6f, 0xf4, 0xe4, 0xa2, 0xd1, 0x93, 0x04, 0xae, 0xea, 0xd2, 0x87, 0xa9, - 0x2e, 0x5d, 0xcc, 0xea, 0x12, 0x4e, 0x6f, 0xd7, 0xf7, 0x8c, 0x9e, 0x68, 0x57, 0x51, 0xbf, 0x5f, - 0x80, 0x29, 0xad, 0x4d, 0xaa, 0xfd, 0x77, 0x8c, 0x26, 0x5d, 0xc8, 0x68, 0x52, 0x4a, 0xc8, 0x0b, - 0xa9, 0x16, 0xbd, 0xd6, 0xad, 0x45, 0x3d, 0x65, 0xfc, 0x9f, 0x0b, 0x30, 0x93, 0x29, 0x03, 0x72, - 0x8e, 0xe9, 0xb6, 0x8d, 0x80, 0x46, 0x42, 0xbc, 0xe2, 0x17, 0x83, 0xaf, 0x86, 0x61, 0x87, 0x06, - 0xe2, 0x3b, 0x17, 0xbf, 0xc8, 0x6b, 0x30, 0xb1, 0x45, 0x03, 0xd7, 0x6f, 0x72, 0x17, 0x73, 0xee, - 0xbb, 0x39, 0x61, 0x9b, 0x40, 0x72, 0x11, 0x46, 0xab, 0xad, 0x7d, 0x3f, 0x70, 0xa3, 0x03, 0x7e, - 0x1b, 0x38, 0x6a, 0xc7, 0x00, 0xc6, 0x7b, 0xc9, 0xdd, 0xe7, 0x97, 0x1a, 0x8c, 0x58, 0xfc, 0x62, - 0x8b, 0x8b, 0xb4, 0x16, 0x0e, 0xf1, 0xc5, 0x45, 0x9a, 0x02, 0xcf, 0xc1, 0xd0, 0xe7, 0x36, 0x4e, - 0x02, 0x8c, 0x10, 0x60, 0x8b, 0x5f, 0x64, 0x12, 0x9d, 0x84, 0xf1, 0x55, 0x02, 0x3a, 0x07, 0x7f, - 0x08, 0xd3, 0x59, 0x72, 0xcd, 0x9a, 0x42, 0x82, 0xb6, 0xa8, 0x68, 0xbf, 0x82, 0xa9, 0x6a, 0xb3, - 0xb9, 0x7e, 0xaf, 0xca, 0x7d, 0x0e, 0xc4, 0xa8, 0xf2, 0x8f, 0x87, 0xdb, 0xeb, 0x84, 0xca, 0x36, - 0xb0, 0xea, 0xb9, 0x91, 0x3d, 0xb5, 0xfc, 0x8d, 0x1b, 0x46, 0xae, 0xb7, 0xaf, 0x19, 0x15, 0xed, - 0x73, 0x1b, 0xf4, 0x59, 0xc6, 0x14, 0x60, 0xbb, 0xa9, 0xc9, 0x9b, 0xc3, 0x33, 0x98, 0x4f, 0x6b, - 0x6c, 0xe3, 0xa5, 0x64, 0xd6, 0xe4, 0x1b, 0x17, 0xf4, 0x57, 0x1b, 0x4f, 0xac, 0xef, 0xc1, 0x39, - 0xbe, 0xa4, 0x75, 0x6b, 0xbc, 0x68, 0xb6, 0x6e, 0x03, 0xb5, 0xde, 0x97, 0x56, 0x8a, 0xae, 0x2d, - 0xb3, 0xc7, 0x8d, 0xb6, 0x60, 0x95, 0xff, 0xa5, 0x00, 0x73, 0x09, 0xd2, 0xda, 0x73, 0xaf, 0x21, - 0xd7, 0xd3, 0x37, 0x92, 0x4e, 0xd8, 0xa8, 0x07, 0x70, 0xe3, 0x9f, 0xdb, 0x54, 0x7e, 0xd8, 0xe4, - 0x16, 0x00, 0x27, 0xd6, 0xb6, 0x6f, 0x34, 0x7d, 0x0b, 0x27, 0x1b, 0xdc, 0xc0, 0x35, 0x14, 0xd2, - 0x81, 0x2c, 0xb9, 0x8b, 0x6f, 0xa4, 0x97, 0x6d, 0x18, 0xa3, 0x62, 0x50, 0x41, 0x5e, 0xcf, 0x31, - 0x12, 0x67, 0xf1, 0xb7, 0xfe, 0xbf, 0x7e, 0x98, 0xd5, 0x07, 0xf0, 0x45, 0xfa, 0xba, 0x05, 0x63, - 0x8b, 0xbe, 0x17, 0xd1, 0x6f, 0x22, 0x2d, 0x2a, 0x01, 0x51, 0x37, 0xed, 0xaa, 0x44, 0xa8, 0x8e, - 0x1c, 0x50, 0x67, 0x7a, 0x8c, 0xe1, 0x2c, 0x18, 0x23, 0x92, 0x45, 0x98, 0xd8, 0xa0, 0xcf, 0x52, - 0x02, 0x44, 0x87, 0x45, 0x8f, 0x3e, 0xab, 0x6b, 0x42, 0xd4, 0xbd, 0xc8, 0x0c, 0x1a, 0xb2, 0x07, - 0x93, 0x72, 0x72, 0x19, 0xc2, 0x9c, 0xd3, 0x77, 0x15, 0x73, 0x3a, 0xf3, 0x57, 0xfb, 0xac, 0x86, - 0x1c, 0x19, 0x26, 0x38, 0xb2, 0xae, 0xf3, 0x1a, 0xf9, 0x43, 0x74, 0x73, 0xdb, 0xd2, 0x4a, 0x0c, - 0x77, 0xd0, 0xe4, 0x03, 0x74, 0x9d, 0x85, 0xb5, 0x05, 0xe5, 0xf4, 0x78, 0x88, 0xda, 0xde, 0x81, - 0x21, 0x0e, 0x15, 0x6a, 0x80, 0x0c, 0x38, 0xa3, 0xb0, 0xf9, 0x39, 0x9d, 0x57, 0x63, 0x0b, 0x5c, - 0x6b, 0x05, 0x6d, 0x27, 0x0a, 0x47, 0x29, 0x62, 0xb7, 0x93, 0xc3, 0x8b, 0x9e, 0xb6, 0x72, 0x78, - 0x75, 0x3f, 0x13, 0xf9, 0xb8, 0x60, 0x11, 0xcd, 0x4f, 0x3a, 0x27, 0xd1, 0xb0, 0x1b, 0x30, 0x2c, - 0x40, 0x89, 0x50, 0x38, 0xf1, 0xe7, 0x27, 0x11, 0xac, 0x0f, 0xe1, 0x3c, 0xda, 0xc2, 0x5c, 0x6f, - 0xbf, 0x45, 0x77, 0x42, 0xe3, 0x79, 0x40, 0xaf, 0xcf, 0xfa, 0x63, 0x98, 0xcb, 0xa2, 0xed, 0xf9, - 0x65, 0xf3, 0xe0, 0x14, 0x7f, 0x59, 0x84, 0xe9, 0xd5, 0x50, 0x57, 0x26, 0x54, 0x80, 0x8a, 0x8c, - 0xa0, 0x09, 0x28, 0x93, 0x95, 0xbe, 0xac, 0xa0, 0x08, 0xef, 0x68, 0x8f, 0x13, 0x8b, 0xdd, 0xa2, - 0x21, 0xb0, 0x6d, 0x4b, 0x3d, 0x4f, 0x7c, 0x03, 0x06, 0x36, 0xd8, 0x52, 0xdd, 0x2f, 0xc6, 0x8e, - 0x53, 0x30, 0x10, 0x3e, 0x0e, 0x64, 0x5b, 0x24, 0xfb, 0x41, 0xee, 0xa5, 0x9e, 0x20, 0x0e, 0xf4, - 0x7e, 0xed, 0xbf, 0xd2, 0x97, 0x7a, 0x8d, 0xf8, 0x1e, 0x8c, 0x55, 0x9b, 0x87, 0xdc, 0x23, 0xd0, - 0xf7, 0x12, 0x9f, 0xa5, 0x56, 0xb2, 0xd2, 0x67, 0xeb, 0x88, 0xec, 0x84, 0x5b, 0x6d, 0xb7, 0x71, - 0xa3, 0xca, 0x8a, 0x80, 0xb0, 0xd2, 0x87, 0x0e, 0xf6, 0x0b, 0x23, 0x30, 0xb4, 0xed, 0x04, 0xfb, - 0x34, 0xb2, 0xbe, 0x82, 0x39, 0xe1, 0xa4, 0xc2, 0x2d, 0x7f, 0xe8, 0xca, 0x12, 0xc6, 0x7e, 0x48, - 0xdd, 0x1c, 0x4b, 0x2e, 0x03, 0xa0, 0x9e, 0xbf, 0xea, 0x35, 0xe9, 0x37, 0xc2, 0x4b, 0x4e, 0x83, - 0x58, 0xef, 0xc2, 0xa8, 0x92, 0x10, 0x2a, 0xb3, 0xda, 0x66, 0x87, 0xd2, 0x9a, 0x36, 0xde, 0x5c, - 0xca, 0x87, 0x96, 0xe7, 0x8d, 0xbe, 0x8b, 0x98, 0x26, 0x5c, 0xfb, 0x75, 0x61, 0x26, 0x31, 0x09, - 0xe2, 0x27, 0xf3, 0x4a, 0xff, 0xe4, 0x6e, 0x7c, 0xea, 0x77, 0x52, 0x3d, 0x2d, 0x9e, 0x48, 0x3d, - 0xb5, 0xfe, 0x59, 0x11, 0x0f, 0x4e, 0x29, 0x79, 0x24, 0x6c, 0x50, 0xba, 0x1d, 0x6c, 0x01, 0x46, - 0xb1, 0xf7, 0x4b, 0xf2, 0xe9, 0x57, 0x77, 0x1f, 0x8b, 0x91, 0x9f, 0x1d, 0x55, 0xfa, 0xd0, 0xb1, - 0x22, 0x26, 0x23, 0x9f, 0xc0, 0xf0, 0xb2, 0xd7, 0x44, 0x0e, 0xfd, 0xa7, 0xe0, 0x20, 0x89, 0xd8, - 0x98, 0x60, 0x93, 0xb7, 0xd9, 0x27, 0xcc, 0x4d, 0x17, 0xb6, 0x06, 0x89, 0x4f, 0x70, 0x83, 0x79, - 0x27, 0xb8, 0xa1, 0xc4, 0x09, 0xce, 0x82, 0xc1, 0xcd, 0xa0, 0x29, 0x22, 0x91, 0x4c, 0xce, 0x8f, - 0x0b, 0xc1, 0x21, 0xcc, 0xe6, 0x45, 0xd6, 0x7f, 0x2b, 0xc0, 0xec, 0x7d, 0x1a, 0x65, 0xce, 0x21, - 0x43, 0x2a, 0x85, 0x97, 0x96, 0x4a, 0xf1, 0x45, 0xa4, 0xa2, 0x7a, 0xdd, 0x9f, 0xd7, 0xeb, 0x81, - 0xbc, 0x5e, 0x0f, 0xe6, 0xf7, 0xfa, 0x3e, 0x0c, 0xf1, 0xae, 0xb2, 0x53, 0xea, 0x6a, 0x44, 0x0f, - 0xe3, 0x53, 0xaa, 0xee, 0x21, 0x66, 0xf3, 0x32, 0xa6, 0x48, 0xae, 0x39, 0xa1, 0x7e, 0x4a, 0x15, - 0x3f, 0xad, 0x1f, 0xe1, 0xa3, 0xd1, 0x35, 0xbf, 0xf1, 0x44, 0xb3, 0x76, 0x0e, 0xf3, 0x2f, 0x34, - 0x69, 0x1d, 0x67, 0x58, 0xbc, 0xc4, 0x96, 0x18, 0xe4, 0x0a, 0x8c, 0xad, 0x7a, 0xf7, 0xfc, 0xa0, - 0x41, 0x37, 0xbd, 0x16, 0xe7, 0x3e, 0x62, 0xeb, 0x20, 0x61, 0x05, 0x10, 0x35, 0xc4, 0x47, 0x6b, - 0x04, 0x24, 0x8e, 0xd6, 0x0c, 0xb6, 0x3b, 0x6f, 0xf3, 0x32, 0x61, 0x64, 0x60, 0x7f, 0x77, 0x3b, - 0x95, 0xaa, 0xe3, 0x6b, 0x2f, 0xc4, 0x3d, 0x38, 0x6f, 0xd3, 0x76, 0xcb, 0x61, 0x3a, 0xdd, 0xa1, - 0xcf, 0xf1, 0x55, 0x9f, 0xaf, 0x64, 0x3c, 0xf8, 0x32, 0xfd, 0x05, 0x54, 0x93, 0x8b, 0x5d, 0x9a, - 0x7c, 0x08, 0x57, 0xef, 0xd3, 0xc8, 0x5c, 0x50, 0x63, 0x5b, 0xaa, 0xe8, 0xfc, 0x0a, 0x8c, 0x84, - 0xa6, 0x1d, 0xf8, 0xb2, 0xbc, 0x7e, 0xc8, 0x22, 0xdc, 0xbd, 0x2b, 0x6f, 0x4a, 0x04, 0x1f, 0xf5, - 0x97, 0xf5, 0x29, 0x54, 0xf2, 0xaa, 0x3b, 0x99, 0x3b, 0xa7, 0x0b, 0x57, 0xf2, 0x19, 0x88, 0xe6, - 0x2e, 0x83, 0xb4, 0x19, 0x8b, 0x4f, 0xa8, 0x57, 0x6b, 0x4d, 0x33, 0xb3, 0xf8, 0xc3, 0x5a, 0x90, - 0x8e, 0x6d, 0x2f, 0xd1, 0xdc, 0x3a, 0x5e, 0xc7, 0x9a, 0x0c, 0x62, 0xb9, 0x56, 0x61, 0x44, 0xc2, - 0x84, 0x5c, 0x67, 0x33, 0x5b, 0x2a, 0x05, 0xda, 0x94, 0x0c, 0x14, 0x99, 0xf5, 0x23, 0x79, 0x35, - 0x61, 0x52, 0x9c, 0xec, 0x05, 0xe4, 0x49, 0xee, 0x22, 0x2c, 0x1f, 0xce, 0x9b, 0xbc, 0x75, 0x93, - 0x73, 0x49, 0x33, 0x39, 0x73, 0x4b, 0xf3, 0x15, 0xd3, 0x04, 0x5a, 0x14, 0xf3, 0x32, 0x06, 0x91, - 0xcb, 0xba, 0x61, 0x79, 0x3c, 0xfd, 0xa4, 0xf2, 0x36, 0xcc, 0x65, 0x55, 0xa8, 0x9d, 0x03, 0x95, - 0xf5, 0x52, 0xe8, 0x3b, 0x4b, 0x70, 0x59, 0xc6, 0x02, 0xf2, 0xfd, 0x28, 0x8c, 0x02, 0xa7, 0x5d, - 0x6b, 0x04, 0x6e, 0x3b, 0xa6, 0xb2, 0x60, 0x88, 0x43, 0x84, 0x24, 0xf8, 0x35, 0x0f, 0xc7, 0x11, - 0x25, 0xd6, 0x6f, 0x16, 0xc0, 0x32, 0x7c, 0x90, 0x70, 0x9c, 0xb7, 0x02, 0xff, 0xa9, 0xdb, 0xd4, - 0xae, 0x56, 0xde, 0x32, 0xcc, 0x7a, 0xfc, 0x49, 0x5c, 0xd2, 0xfd, 0x59, 0xac, 0x99, 0xb7, 0x13, - 0xa6, 0x36, 0xae, 0x78, 0xa2, 0x5f, 0x92, 0x19, 0x74, 0x45, 0x99, 0xe0, 0xfe, 0x47, 0x01, 0xae, - 0x75, 0x6d, 0x83, 0xe8, 0xcf, 0x1e, 0x94, 0x92, 0x65, 0x62, 0x06, 0x55, 0x34, 0x9f, 0x84, 0x34, - 0x87, 0xdd, 0x3b, 0xdc, 0xc7, 0x5a, 0xfa, 0xee, 0xb4, 0x15, 0xe7, 0x14, 0xbf, 0xd3, 0xb7, 0x9e, - 0x7c, 0x00, 0xb0, 0xed, 0x47, 0x4e, 0x6b, 0x11, 0x0d, 0x00, 0xfd, 0xb1, 0xbf, 0x7c, 0xc4, 0xa0, - 0xf5, 0x64, 0x90, 0x02, 0x0d, 0xd9, 0xfa, 0x0c, 0xbf, 0xeb, 0xec, 0x46, 0x9f, 0xec, 0x53, 0x5b, - 0x84, 0x6b, 0x89, 0x7b, 0xf1, 0x17, 0x60, 0x12, 0xc1, 0x0c, 0x13, 0x3f, 0xd3, 0xbd, 0xef, 0x07, - 0x7e, 0xa7, 0xfd, 0xcb, 0x19, 0xf5, 0x3f, 0x2d, 0x70, 0x47, 0x45, 0xbd, 0x5a, 0x31, 0xd0, 0x8b, - 0x00, 0x31, 0x34, 0xe1, 0xb0, 0xae, 0x0a, 0x76, 0xef, 0xf0, 0x23, 0x37, 0x5a, 0xcc, 0xf7, 0x39, - 0x03, 0x8d, 0xec, 0x97, 0x3b, 0x92, 0x77, 0xf1, 0x32, 0x5c, 0xd5, 0x7e, 0x32, 0xb9, 0xbf, 0x27, - 0xed, 0x1f, 0xa7, 0xa4, 0x3b, 0x80, 0x69, 0xb6, 0x02, 0x54, 0x3b, 0xd1, 0x81, 0x1f, 0xb8, 0x91, - 0x7c, 0x7a, 0x41, 0xb6, 0xc4, 0xdb, 0x6e, 0x4e, 0xf5, 0xf1, 0x2f, 0x8e, 0x2a, 0xef, 0x9f, 0x26, - 0x4a, 0xa3, 0xe4, 0xb9, 0xad, 0xde, 0x83, 0x5b, 0xb3, 0xd0, 0xbf, 0x68, 0xaf, 0xe1, 0x82, 0x67, - 0xaf, 0xa9, 0x05, 0xcf, 0x5e, 0xb3, 0xfe, 0xba, 0x08, 0x15, 0x1e, 0x7d, 0x02, 0x7d, 0x28, 0x62, - 0xab, 0x85, 0xe6, 0x94, 0x71, 0x52, 0x03, 0x43, 0x22, 0xba, 0x44, 0xf1, 0x24, 0xd1, 0x25, 0x7e, - 0x0d, 0x72, 0x4c, 0x56, 0x27, 0xb0, 0x02, 0xbc, 0x79, 0x7c, 0x54, 0xb9, 0x16, 0x5b, 0x01, 0x78, - 0x69, 0x96, 0x39, 0x20, 0xa7, 0x8a, 0xb4, 0xfd, 0x62, 0xe0, 0x05, 0xec, 0x17, 0xb7, 0x61, 0x18, - 0x0f, 0x33, 0xab, 0x5b, 0xc2, 0xab, 0x11, 0xa7, 0x27, 0xc6, 0x93, 0xa9, 0xbb, 0x7a, 0xf0, 0x36, - 0x89, 0x66, 0xfd, 0xdd, 0x22, 0x5c, 0xc9, 0x97, 0xb9, 0x68, 0xdb, 0x12, 0x40, 0xec, 0xbd, 0xd1, - 0xcd, 0x5b, 0x04, 0xbf, 0x9d, 0x67, 0x74, 0x4f, 0x79, 0x6b, 0x69, 0x74, 0x4c, 0xf7, 0x91, 0x0f, - 0x7d, 0x13, 0x57, 0x05, 0xc6, 0xfb, 0x5f, 0x11, 0x7b, 0x54, 0x80, 0x8c, 0xd8, 0xa3, 0x02, 0x46, - 0xf6, 0x60, 0x76, 0x2b, 0x70, 0x9f, 0x3a, 0x11, 0x7d, 0x48, 0x9f, 0xf3, 0x87, 0x30, 0xcb, 0xe2, - 0xf5, 0x0b, 0x7f, 0xbd, 0x7d, 0xfd, 0xf8, 0xa8, 0xf2, 0x5a, 0x9b, 0xa3, 0x60, 0x7c, 0x29, 0xfe, - 0xf4, 0xb0, 0x9e, 0x7e, 0x10, 0x93, 0xc7, 0xc8, 0xfa, 0x93, 0x02, 0x5c, 0x40, 0xb5, 0x5c, 0x98, - 0x5d, 0x65, 0xe5, 0x2f, 0xe4, 0x34, 0xa8, 0x77, 0x50, 0xcc, 0x45, 0x74, 0x1a, 0x34, 0x1e, 0x42, - 0xdb, 0x06, 0x1a, 0x59, 0x85, 0x31, 0xf1, 0x1b, 0xbf, 0xbf, 0x7e, 0x3c, 0x10, 0xcc, 0x68, 0x0b, - 0x16, 0x4e, 0x75, 0x6e, 0x2a, 0xc2, 0x89, 0x2d, 0x98, 0xe1, 0x7b, 0x41, 0x5b, 0xa7, 0xb5, 0x7e, - 0x5e, 0x84, 0x8b, 0xbb, 0x34, 0x70, 0x1f, 0x3f, 0xcf, 0xe9, 0xcc, 0x26, 0x4c, 0x4b, 0x10, 0x8f, - 0x40, 0x61, 0x7c, 0x62, 0x3c, 0xfa, 0xa0, 0x6c, 0xaa, 0x08, 0x61, 0x21, 0xbf, 0xb8, 0x4c, 0xc2, - 0x53, 0xb8, 0x03, 0xbe, 0x03, 0x23, 0x89, 0x18, 0x30, 0x38, 0xfe, 0xf2, 0x0b, 0x8d, 0x87, 0x6a, - 0xa5, 0xcf, 0x56, 0x98, 0xe4, 0xb7, 0xf2, 0xef, 0x6f, 0x84, 0xe9, 0xa3, 0x97, 0xfd, 0x13, 0x3f, - 0x58, 0xf6, 0xb1, 0x3a, 0x5a, 0x69, 0xc6, 0x07, 0xbb, 0xd2, 0x67, 0xe7, 0xd5, 0xb4, 0x30, 0x06, - 0xa3, 0x55, 0xbc, 0x93, 0x62, 0x27, 0xf7, 0xff, 0x5e, 0x84, 0xcb, 0xf2, 0x51, 0x4b, 0x8e, 0x98, - 0xbf, 0x80, 0x59, 0x09, 0xaa, 0xb6, 0x99, 0xc2, 0x40, 0x9b, 0xa6, 0xa4, 0x79, 0x04, 0x50, 0x29, - 0x69, 0x47, 0xe0, 0xc4, 0xc2, 0xce, 0x23, 0x7f, 0x35, 0xd6, 0xcf, 0x4f, 0xb2, 0x22, 0xf2, 0xa0, - 0x15, 0x52, 0x5f, 0x33, 0x0d, 0xd1, 0x18, 0xeb, 0x67, 0x33, 0x65, 0x3d, 0x1d, 0x78, 0x59, 0xeb, - 0xe9, 0x4a, 0x5f, 0xd2, 0x7e, 0xba, 0x30, 0x09, 0xe3, 0x1b, 0xf4, 0x59, 0x2c, 0xf7, 0xff, 0xbb, - 0x90, 0x88, 0x34, 0xc0, 0x34, 0x0c, 0x1e, 0x72, 0xa0, 0x10, 0x07, 0x75, 0xc1, 0x48, 0x03, 0xba, - 0x86, 0xc1, 0x51, 0x57, 0x61, 0x98, 0x5f, 0xd4, 0x36, 0x4f, 0x70, 0xc2, 0x57, 0xaf, 0x53, 0xf8, - 0x93, 0xc1, 0x26, 0x3f, 0xec, 0x0b, 0x7a, 0xeb, 0x21, 0x5c, 0x15, 0xfe, 0xcb, 0xe6, 0xe0, 0x63, - 0x45, 0xa7, 0xdc, 0xbe, 0x2c, 0x07, 0x2e, 0xdf, 0xa7, 0xc9, 0xa5, 0xc7, 0x78, 0xbd, 0xf3, 0x29, - 0x9c, 0x31, 0xe0, 0x8a, 0x23, 0x6a, 0xa5, 0x6a, 0x0e, 0x29, 0xd6, 0x49, 0x6c, 0xeb, 0x4a, 0x56, - 0x15, 0x7a, 0x63, 0x2d, 0x8a, 0xa1, 0x3c, 0x83, 0xf8, 0x8a, 0x2d, 0x3c, 0xc5, 0xaa, 0x77, 0x5d, - 0xfb, 0xae, 0xf9, 0x8a, 0xc7, 0x63, 0xbd, 0xc9, 0x9d, 0x57, 0x95, 0x5a, 0x13, 0xc6, 0x5d, 0x80, - 0x35, 0x09, 0xe3, 0xb2, 0xa8, 0x45, 0xc3, 0xd0, 0xfa, 0xe9, 0x20, 0x58, 0x42, 0xb0, 0x59, 0xb7, - 0xcf, 0x52, 0x1e, 0x7b, 0xa9, 0xc6, 0x8a, 0x8d, 0xea, 0x9c, 0x1e, 0x41, 0x32, 0x2e, 0xe5, 0x33, - 0x0f, 0xf5, 0xbc, 0x46, 0x0c, 0x35, 0x66, 0x5e, 0xaa, 0xf7, 0x3f, 0xc8, 0x59, 0x26, 0xf9, 0xc7, - 0xf6, 0xfa, 0xf1, 0x51, 0xe5, 0x6a, 0xce, 0x32, 0x69, 0xf0, 0xcd, 0x5e, 0x32, 0x6d, 0xf3, 0x4a, - 0xa4, 0xff, 0x45, 0xae, 0x44, 0xd8, 0x17, 0xa9, 0x5f, 0x8a, 0xec, 0x98, 0xb2, 0x14, 0xdf, 0xa3, - 0xbc, 0xd2, 0xd6, 0x8b, 0xc4, 0x83, 0x7f, 0x0d, 0x62, 0x70, 0x35, 0xd8, 0x10, 0x17, 0x4a, 0x9a, - 0xcd, 0x72, 0xf1, 0x80, 0x36, 0x9e, 0x08, 0x5b, 0xb1, 0xbc, 0xd0, 0xcd, 0xb2, 0x99, 0xf3, 0x68, - 0xc2, 0xfc, 0x3b, 0xe7, 0x05, 0xf5, 0x06, 0x23, 0xd5, 0x03, 0x16, 0x24, 0xd9, 0x92, 0x9f, 0xc0, - 0x94, 0x1a, 0xea, 0x84, 0xfb, 0xd1, 0xd8, 0xfc, 0x6b, 0x71, 0xe0, 0xc9, 0xc3, 0xc7, 0xce, 0xcd, - 0xa7, 0x77, 0x6e, 0x66, 0xe0, 0xf2, 0x77, 0xf0, 0x0d, 0x59, 0xa0, 0xf9, 0x1e, 0xe9, 0x17, 0x5d, - 0x59, 0x84, 0xda, 0x75, 0xf6, 0xdf, 0x51, 0xce, 0xf2, 0x4c, 0x5f, 0x70, 0x5b, 0x54, 0xbc, 0x7a, - 0x91, 0xb3, 0x2f, 0xe7, 0x2a, 0xae, 0xf0, 0x2d, 0x5f, 0xc5, 0xfd, 0x61, 0x51, 0x3e, 0x11, 0x48, - 0xdf, 0x86, 0x9e, 0xfa, 0x46, 0x2e, 0xb3, 0x07, 0x27, 0xda, 0x4c, 0x33, 0x1b, 0x47, 0x16, 0xe4, - 0x7d, 0xa6, 0x8a, 0x0d, 0x35, 0xa9, 0xee, 0x06, 0xe2, 0x02, 0xe3, 0x8a, 0x13, 0x55, 0x17, 0x8d, - 0x2a, 0x79, 0x59, 0xd6, 0xff, 0xf2, 0x97, 0x65, 0xff, 0x72, 0x14, 0xce, 0x6e, 0x39, 0xfb, 0xae, - 0xc7, 0x16, 0x6d, 0x9b, 0x86, 0x7e, 0x27, 0x68, 0x50, 0x52, 0x85, 0x49, 0xd3, 0xff, 0xb3, 0x87, - 0x77, 0x2b, 0xdb, 0x97, 0x4c, 0x18, 0x99, 0x87, 0x51, 0xf5, 0xe6, 0x54, 0x6c, 0x26, 0x19, 0x6f, - 0x51, 0x57, 0xfa, 0xec, 0x18, 0x8d, 0x7c, 0x60, 0xdc, 0xef, 0x9c, 0x51, 0xcf, 0xa7, 0x11, 0x77, - 0x9e, 0x3b, 0xe8, 0x79, 0x7e, 0xd3, 0xdc, 0x10, 0xf9, 0x25, 0xc6, 0x8f, 0x52, 0x57, 0x3e, 0x83, - 0x46, 0x8b, 0x53, 0x76, 0x2f, 0xd4, 0x05, 0x72, 0xc3, 0x39, 0x67, 0x5c, 0x06, 0x7d, 0x05, 0x63, - 0x0f, 0x3b, 0x7b, 0x54, 0x5e, 0x6e, 0x0d, 0x89, 0xfd, 0x31, 0xe9, 0xd5, 0x2c, 0xca, 0x77, 0xef, - 0xf2, 0x31, 0x78, 0xd2, 0xd9, 0xa3, 0xe9, 0x38, 0xe1, 0x6c, 0x61, 0xd2, 0x98, 0x91, 0x03, 0x28, - 0x25, 0x1d, 0x90, 0x45, 0x34, 0xb5, 0x2e, 0x6e, 0xd3, 0x18, 0xca, 0x43, 0x8b, 0x46, 0xce, 0xdd, - 0x22, 0x8d, 0x4a, 0x52, 0x5c, 0xc9, 0xaf, 0xc3, 0x4c, 0xa6, 0xd5, 0x51, 0x3d, 0xa1, 0xea, 0x6e, - 0xd0, 0xc4, 0x45, 0x3d, 0x21, 0x35, 0xf9, 0x5e, 0xcb, 0xa8, 0x39, 0xbb, 0x16, 0xd2, 0x84, 0x33, - 0x09, 0xc7, 0x5a, 0x91, 0x72, 0x21, 0xdf, 0x55, 0x17, 0x37, 0x26, 0x19, 0xb5, 0x34, 0xb3, 0xae, - 0x24, 0x4b, 0xb2, 0x06, 0xa3, 0xea, 0xb8, 0x8f, 0xaf, 0xb3, 0xb2, 0x4d, 0x1b, 0xe5, 0xe3, 0xa3, - 0xca, 0x74, 0x6c, 0xda, 0x30, 0x78, 0xc6, 0x0c, 0xc8, 0x6f, 0xc0, 0x55, 0x35, 0x45, 0x37, 0x83, - 0x6c, 0x23, 0x90, 0x88, 0x76, 0x7e, 0x23, 0x39, 0xc3, 0xf3, 0xf0, 0x77, 0xef, 0x2c, 0x14, 0xcb, - 0x85, 0x95, 0x3e, 0xbb, 0x37, 0x6b, 0xf2, 0xd3, 0x02, 0x9c, 0xcb, 0xa9, 0x75, 0x1c, 0x6b, 0xed, - 0x69, 0x99, 0x43, 0xe5, 0x1e, 0x9f, 0x0d, 0xb9, 0xcd, 0xf8, 0x79, 0x9d, 0x34, 0xd1, 0x19, 0xfd, - 0xce, 0xa9, 0x89, 0xbc, 0x0d, 0x43, 0x78, 0x46, 0x0e, 0xcb, 0x13, 0xa8, 0x45, 0x62, 0x04, 0x1b, - 0x3c, 0x49, 0xeb, 0xfb, 0x86, 0xc0, 0x21, 0x2b, 0x4c, 0x1b, 0xc3, 0x7d, 0x4b, 0x6a, 0x4f, 0x22, - 0xde, 0x95, 0xd0, 0xe8, 0x79, 0x91, 0x8c, 0x72, 0x61, 0x84, 0xb5, 0x37, 0xc9, 0x16, 0x00, 0x46, - 0x02, 0xb1, 0x2a, 0x3d, 0x18, 0x18, 0x19, 0x28, 0x0d, 0xf2, 0x0f, 0x47, 0x7a, 0x6c, 0xff, 0xf6, - 0x08, 0x7f, 0xde, 0xb9, 0xe3, 0xb9, 0x8f, 0xdd, 0x78, 0x01, 0xd3, 0xad, 0x6b, 0x71, 0x7e, 0x19, - 0xa1, 0xfb, 0xe6, 0x64, 0x92, 0x51, 0x86, 0xb8, 0x62, 0x4f, 0x43, 0xdc, 0x5d, 0xed, 0xca, 0x4a, - 0x0b, 0x11, 0xc9, 0x75, 0x1c, 0xd3, 0xf0, 0x15, 0xdf, 0x65, 0x7d, 0x0d, 0x43, 0x18, 0xd5, 0x91, - 0xdf, 0x07, 0x8e, 0xcd, 0xdf, 0x14, 0xcb, 0x76, 0x97, 0xe6, 0xf3, 0x30, 0x90, 0xe2, 0xc9, 0x36, - 0x97, 0x38, 0x02, 0x0c, 0x89, 0x23, 0x84, 0x6c, 0xc3, 0xd4, 0x56, 0x40, 0x9b, 0xc2, 0x6f, 0xb8, - 0x1d, 0x08, 0xe3, 0x04, 0x37, 0x7b, 0xe0, 0x96, 0xdf, 0x96, 0xc5, 0x75, 0xaa, 0xca, 0xf5, 0x0d, - 0x35, 0x83, 0x9c, 0x2c, 0xc3, 0x64, 0x8d, 0x3a, 0x41, 0xe3, 0xe0, 0x21, 0x7d, 0xce, 0xd4, 0x1d, - 0x23, 0xa5, 0x42, 0x88, 0x25, 0xac, 0xbf, 0x58, 0xa4, 0xfb, 0x78, 0x98, 0x44, 0xe4, 0x33, 0x18, - 0xaa, 0xf9, 0x41, 0xb4, 0xf0, 0x5c, 0x2c, 0x6a, 0xf2, 0xc6, 0x88, 0x03, 0x17, 0xce, 0xcb, 0xb4, - 0x12, 0xa1, 0x1f, 0x44, 0xf5, 0x3d, 0x23, 0x24, 0x12, 0x47, 0x21, 0xcf, 0x61, 0xda, 0x5c, 0x50, - 0x84, 0x3b, 0xeb, 0x88, 0x50, 0xb3, 0xb2, 0x56, 0x2d, 0x8e, 0xb2, 0x70, 0x5d, 0x70, 0xbf, 0x92, - 0x5c, 0xb6, 0x1e, 0x63, 0xb9, 0x1e, 0xa5, 0x28, 0x8b, 0x9e, 0xac, 0x63, 0x3e, 0x0e, 0xde, 0xa3, - 0x6a, 0xc8, 0xdd, 0x60, 0x47, 0xe3, 0xa0, 0x5b, 0x1d, 0x5c, 0x94, 0x50, 0x12, 0x4e, 0x98, 0x4c, - 0xe2, 0x62, 0xa7, 0x48, 0xc9, 0x16, 0x9c, 0xdd, 0x09, 0xe9, 0x56, 0x40, 0x9f, 0xba, 0xf4, 0x99, - 0xe4, 0x07, 0x71, 0x84, 0x22, 0xc6, 0xaf, 0xcd, 0x4b, 0xb3, 0x18, 0xa6, 0x89, 0xc9, 0x07, 0x00, - 0x5b, 0xae, 0xe7, 0xd1, 0x26, 0x5e, 0x3b, 0x8e, 0x21, 0x2b, 0x34, 0xa9, 0xb6, 0x11, 0x5a, 0xf7, - 0xbd, 0x96, 0x2e, 0x52, 0x0d, 0x99, 0x2c, 0xc0, 0xc4, 0xaa, 0xd7, 0x68, 0x75, 0x84, 0x7b, 0x40, - 0x88, 0x0b, 0x8a, 0x88, 0x9c, 0xe6, 0xf2, 0x82, 0x7a, 0xea, 0x23, 0x37, 0x49, 0xc8, 0x43, 0x20, - 0x02, 0x20, 0x66, 0xad, 0xb3, 0xd7, 0xa2, 0xe2, 0x73, 0x47, 0x53, 0x89, 0x64, 0x84, 0xd3, 0xdd, - 0x08, 0x48, 0x96, 0x22, 0x9b, 0xfb, 0x00, 0xc6, 0xb4, 0x39, 0x9f, 0x11, 0x83, 0x60, 0x5a, 0x8f, - 0x41, 0x30, 0xaa, 0xc7, 0x1a, 0xf8, 0x47, 0x05, 0xb8, 0x98, 0xfd, 0x2d, 0x09, 0x05, 0x6c, 0x13, - 0x46, 0x15, 0x50, 0xbd, 0x3a, 0x91, 0xaa, 0x7f, 0x42, 0x03, 0xe2, 0x1f, 0xb4, 0x5c, 0x79, 0xf4, - 0xde, 0xc7, 0x3c, 0x5e, 0xc0, 0x1e, 0xff, 0xff, 0x8c, 0xc0, 0x34, 0x7a, 0x57, 0x27, 0xd7, 0xa9, - 0x4f, 0x31, 0x96, 0x08, 0xc2, 0x34, 0xf3, 0xb2, 0xb0, 0x34, 0x71, 0x78, 0x32, 0xf0, 0x95, 0x41, - 0x40, 0xde, 0xd5, 0x7d, 0x22, 0x8a, 0x5a, 0xfe, 0x0f, 0x09, 0xd4, 0xbb, 0x10, 0x3b, 0x4b, 0xbc, - 0x65, 0x5c, 0xc9, 0x9f, 0x78, 0xd1, 0x1b, 0x38, 0xe9, 0xa2, 0xb7, 0xa3, 0x16, 0x3d, 0x1e, 0xa3, - 0xe2, 0x4d, 0x6d, 0xd1, 0x7b, 0xf5, 0xab, 0xdd, 0xd0, 0xab, 0x5e, 0xed, 0x86, 0x5f, 0x6e, 0xb5, - 0x1b, 0x79, 0xc1, 0xd5, 0xee, 0x1e, 0x4c, 0x6e, 0x50, 0xda, 0xd4, 0x2e, 0x4a, 0x46, 0xe3, 0xdd, - 0xd3, 0xa3, 0x68, 0x02, 0xcb, 0xba, 0x2d, 0x49, 0x50, 0xe5, 0xae, 0x9a, 0xf0, 0xb7, 0xb3, 0x6a, - 0x8e, 0xbd, 0xe2, 0x55, 0x73, 0xfc, 0x65, 0x56, 0xcd, 0xd4, 0xd2, 0x37, 0x71, 0xea, 0xa5, 0xef, - 0x65, 0x56, 0xab, 0x4f, 0xd0, 0xa5, 0xb0, 0x56, 0x5b, 0x11, 0xde, 0x23, 0x9a, 0xbb, 0xc6, 0x8a, - 0x1f, 0x4a, 0x8f, 0x6b, 0xfc, 0x9b, 0xc1, 0xb6, 0xfc, 0x40, 0x5e, 0x79, 0xe3, 0xdf, 0xd6, 0x02, - 0x3a, 0x12, 0xea, 0xf4, 0xca, 0x5d, 0x7f, 0x58, 0x3c, 0xd9, 0x13, 0x6b, 0x5c, 0xf2, 0x18, 0x65, - 0xcb, 0x72, 0xeb, 0x2f, 0x0b, 0xfc, 0x52, 0xf2, 0x7f, 0xc7, 0xa5, 0xf2, 0x65, 0x2e, 0x0a, 0x7f, - 0x2b, 0x7e, 0xca, 0x2f, 0xc2, 0x0e, 0x04, 0x4e, 0xe3, 0x49, 0x7c, 0x53, 0xfb, 0x43, 0xf6, 0x9d, - 0xeb, 0x05, 0x18, 0x58, 0x35, 0x3e, 0x2b, 0x9a, 0x85, 0xbb, 0x77, 0xe4, 0x02, 0x20, 0x22, 0x1a, - 0x70, 0xb0, 0xb9, 0x00, 0xe8, 0x04, 0xe8, 0x2b, 0x77, 0xc6, 0xb2, 0xf9, 0x4b, 0xf4, 0xcc, 0x16, - 0xbc, 0x97, 0x7e, 0x4b, 0x8d, 0x87, 0x91, 0xf8, 0x2d, 0xb5, 0x2e, 0xc6, 0xf8, 0x55, 0xf5, 0x0e, - 0x5c, 0xb0, 0xe9, 0xa1, 0xff, 0x94, 0xbe, 0x5a, 0xb6, 0x3f, 0x80, 0xf3, 0x26, 0x43, 0xfe, 0xea, - 0x86, 0x07, 0x44, 0xff, 0x24, 0x3b, 0x8c, 0xba, 0x20, 0xe0, 0x61, 0xd4, 0x79, 0x34, 0x66, 0xf6, - 0xa7, 0xbe, 0x6f, 0x60, 0x99, 0xe5, 0xc3, 0x45, 0x93, 0x79, 0xb5, 0xd9, 0xc4, 0x6c, 0x8b, 0x0d, - 0xb7, 0xed, 0x78, 0x11, 0xd9, 0x84, 0x31, 0xed, 0x67, 0xc2, 0x54, 0xa0, 0x95, 0x08, 0x9d, 0x26, - 0x06, 0x18, 0x21, 0x38, 0x63, 0xb0, 0x45, 0xa1, 0x92, 0x14, 0x0f, 0x13, 0x99, 0x5e, 0xe7, 0x02, - 0x4c, 0x68, 0x3f, 0x95, 0xc9, 0x12, 0x3f, 0x7e, 0xad, 0x06, 0x53, 0x60, 0x26, 0x89, 0xd5, 0x80, - 0xb9, 0x2c, 0xa1, 0x61, 0x74, 0xa6, 0xe7, 0x64, 0x39, 0x8e, 0xf3, 0xd4, 0xdb, 0xdb, 0xee, 0x4c, - 0x5e, 0x8c, 0x27, 0xeb, 0xff, 0x1f, 0x80, 0x0b, 0x62, 0x30, 0x5e, 0xe5, 0x88, 0x93, 0x1f, 0xc1, - 0x98, 0x36, 0xc6, 0x42, 0xe8, 0x57, 0x64, 0xe8, 0xcd, 0xbc, 0xb9, 0xc0, 0x4d, 0x1a, 0x1d, 0x04, - 0xd4, 0x13, 0xc3, 0xbd, 0xd2, 0x67, 0xeb, 0x2c, 0x49, 0x0b, 0x26, 0xcd, 0x81, 0x16, 0x56, 0x9d, - 0x6b, 0x99, 0x95, 0x98, 0xa8, 0x32, 0x90, 0x73, 0xb3, 0x9e, 0x39, 0xdc, 0x2b, 0x7d, 0x76, 0x82, - 0x37, 0xf9, 0x06, 0xce, 0xa6, 0x46, 0x59, 0x18, 0xeb, 0xde, 0xc8, 0xac, 0x30, 0x85, 0xcd, 0xcd, - 0xb1, 0x01, 0x82, 0x73, 0xab, 0x4d, 0x57, 0x42, 0x9a, 0x30, 0xae, 0x0f, 0xbc, 0x30, 0x3b, 0x5d, - 0xed, 0x22, 0x4a, 0x8e, 0xc8, 0x95, 0x3b, 0x21, 0x4b, 0x1c, 0xfb, 0xe7, 0xa6, 0x89, 0xd9, 0x40, - 0x1e, 0x81, 0x21, 0xfe, 0x9b, 0x2d, 0x01, 0x5b, 0x01, 0x0d, 0xa9, 0xd7, 0xa0, 0x86, 0x83, 0xf6, - 0x4b, 0x2e, 0x01, 0xff, 0xa6, 0x00, 0xe5, 0x2c, 0xbe, 0x35, 0xea, 0x35, 0xc9, 0x16, 0x94, 0x92, - 0x15, 0x89, 0x59, 0x6d, 0xa9, 0x58, 0xb9, 0xb9, 0x4d, 0x5a, 0xe9, 0xb3, 0x53, 0xd4, 0x64, 0x03, - 0xce, 0x6a, 0x30, 0x61, 0x5c, 0x2d, 0x9e, 0xc4, 0xb8, 0xca, 0x46, 0x21, 0x45, 0xaa, 0xdb, 0xa6, - 0x57, 0x70, 0x67, 0x5c, 0xf2, 0x0f, 0x1d, 0xd7, 0x63, 0x8a, 0xae, 0x16, 0xea, 0x09, 0x62, 0xa8, - 0x90, 0x0d, 0xb7, 0xb6, 0x22, 0x54, 0x3e, 0x28, 0x51, 0x28, 0xd6, 0xc7, 0xb8, 0x82, 0x0b, 0x1b, - 0x1d, 0x7f, 0x9e, 0xaa, 0x98, 0x5d, 0x81, 0xc1, 0xed, 0xb5, 0xda, 0x62, 0x55, 0x3c, 0x76, 0xe5, - 0x21, 0x12, 0x5a, 0x61, 0xbd, 0xe1, 0xd8, 0xbc, 0xc0, 0xfa, 0x08, 0xc8, 0x7d, 0x1a, 0x89, 0x60, - 0xed, 0x8a, 0xee, 0x75, 0x18, 0x16, 0x20, 0x41, 0x89, 0xae, 0x71, 0x2d, 0x81, 0x25, 0xcb, 0xac, - 0x2d, 0x79, 0x4e, 0x68, 0x51, 0x27, 0xd4, 0x36, 0xe6, 0xf7, 0x61, 0x24, 0x10, 0x30, 0xb1, 0x2f, - 0x4f, 0xaa, 0xb4, 0x16, 0x08, 0xe6, 0xf6, 0x6c, 0x89, 0x63, 0xab, 0xbf, 0xac, 0x35, 0x0c, 0x67, - 0xb2, 0xb9, 0xba, 0xb4, 0xc8, 0xa4, 0x2a, 0x84, 0x25, 0x87, 0xe3, 0x16, 0xfa, 0x90, 0x47, 0x54, - 0x7f, 0xea, 0x8a, 0xa2, 0xc1, 0x8f, 0x5c, 0x04, 0xf1, 0xd1, 0x50, 0xac, 0xbb, 0x2a, 0x38, 0x4a, - 0x06, 0xb7, 0xbc, 0xf4, 0x0c, 0x1b, 0x18, 0xf6, 0xe5, 0x3e, 0xba, 0xcb, 0xbc, 0x8a, 0x46, 0x38, - 0x30, 0xc7, 0xb7, 0x79, 0xd6, 0x2b, 0x91, 0x80, 0xce, 0x57, 0x4b, 0xe3, 0x22, 0x8c, 0x2a, 0x98, - 0xba, 0xfb, 0xe2, 0xb2, 0x32, 0xf0, 0x77, 0xef, 0xf2, 0x57, 0xc1, 0x0d, 0xc5, 0x20, 0xa6, 0x63, - 0x55, 0xf0, 0xef, 0xee, 0x5b, 0xae, 0x22, 0xa4, 0x41, 0xf4, 0xad, 0x56, 0x11, 0xc7, 0x05, 0x3a, - 0x4d, 0x15, 0x06, 0xfe, 0xee, 0xfc, 0x49, 0x04, 0xf5, 0x2d, 0x57, 0xc1, 0x04, 0xf5, 0xed, 0x55, - 0x41, 0x65, 0x00, 0x25, 0x3e, 0x49, 0x53, 0x95, 0x2c, 0xa7, 0x2b, 0x91, 0x86, 0xeb, 0x04, 0x45, - 0xd7, 0xf1, 0xa0, 0x70, 0x91, 0x0b, 0xeb, 0x97, 0x50, 0x0d, 0x13, 0xd8, 0xb7, 0x5b, 0xcd, 0xdf, - 0x2b, 0xf0, 0x70, 0x4e, 0xb5, 0x4d, 0x2d, 0xf5, 0xa3, 0xf7, 0xd8, 0xd7, 0xae, 0xe6, 0xb5, 0xaf, - 0xfd, 0xa1, 0xeb, 0x35, 0xf5, 0xab, 0x79, 0xa7, 0x13, 0x1d, 0xa8, 0x70, 0xc7, 0x4f, 0x5c, 0xaf, - 0x69, 0x27, 0xb1, 0xc9, 0x07, 0x30, 0xa1, 0x81, 0x94, 0xb6, 0xc6, 0x73, 0x46, 0xe8, 0xe4, 0x6e, - 0xd3, 0x36, 0x31, 0xad, 0xbf, 0x29, 0xc0, 0x54, 0x46, 0x52, 0x62, 0x34, 0x66, 0xe0, 0x29, 0x48, - 0x2d, 0x54, 0x22, 0x61, 0x12, 0x46, 0x96, 0x30, 0x36, 0x49, 0x85, 0x88, 0xd1, 0xf2, 0xb5, 0x04, - 0xca, 0x45, 0x2d, 0x75, 0x57, 0x76, 0xd2, 0x64, 0x1d, 0x9d, 0x84, 0x00, 0x71, 0x4b, 0x84, 0xd9, - 0xb8, 0xc6, 0x54, 0x5a, 0x2d, 0xfb, 0xf2, 0x2b, 0x49, 0xff, 0xac, 0x55, 0x63, 0xfd, 0x56, 0x11, - 0xce, 0x65, 0xf4, 0xbf, 0x46, 0xa3, 0xbf, 0x0d, 0x11, 0x24, 0x72, 0x60, 0xf7, 0xff, 0x92, 0x72, - 0x60, 0x5b, 0xff, 0xbe, 0x08, 0xe7, 0x76, 0xda, 0x21, 0xbe, 0xb0, 0x5a, 0xf5, 0x9e, 0x52, 0x2f, - 0xf2, 0x83, 0xe7, 0xf8, 0x2a, 0x84, 0xbc, 0x0b, 0x83, 0x2b, 0xb4, 0xd5, 0xf2, 0xc5, 0xfc, 0xbf, - 0x24, 0xbd, 0x23, 0x92, 0xd8, 0x88, 0xb4, 0xd2, 0x67, 0x73, 0x6c, 0xf2, 0x01, 0x8c, 0xae, 0x50, - 0x27, 0x88, 0xf6, 0xa8, 0x23, 0x8f, 0x2c, 0x32, 0x93, 0x85, 0x46, 0x22, 0x10, 0x56, 0xfa, 0xec, - 0x18, 0x9b, 0xcc, 0xb3, 0xd3, 0xbc, 0xb7, 0xaf, 0x5e, 0x93, 0xe7, 0x54, 0xc8, 0x70, 0x56, 0xfa, - 0x6c, 0xc4, 0x25, 0xeb, 0x30, 0x51, 0xdd, 0xa7, 0x5e, 0xb4, 0x4e, 0x23, 0xa7, 0xe9, 0x44, 0x8e, - 0x50, 0x6d, 0x5f, 0xcf, 0x23, 0x36, 0x90, 0x57, 0xfa, 0x6c, 0x93, 0x9a, 0x7c, 0x04, 0xc3, 0xf7, - 0x7d, 0xbf, 0xb9, 0xf7, 0x9c, 0x0a, 0x75, 0xb5, 0x92, 0xc7, 0x48, 0xa0, 0xad, 0xf4, 0xd9, 0x92, - 0x62, 0x61, 0x10, 0xfa, 0xd7, 0xc3, 0x7d, 0xeb, 0xa8, 0x00, 0xe5, 0x25, 0xff, 0x99, 0x97, 0x29, - 0xd5, 0xef, 0x99, 0x52, 0x95, 0xec, 0x33, 0xf0, 0x13, 0x72, 0x7d, 0x07, 0x06, 0xb6, 0x5c, 0x6f, - 0x3f, 0xa1, 0x0a, 0x66, 0xd0, 0x31, 0x2c, 0x14, 0x8f, 0xeb, 0xed, 0x93, 0x35, 0xa9, 0x83, 0x0b, - 0x5b, 0x63, 0xbf, 0xa1, 0xf8, 0x67, 0x50, 0xeb, 0xd8, 0xb1, 0xae, 0xcd, 0x7f, 0xcb, 0x0e, 0xbe, - 0x05, 0xb3, 0x39, 0xf5, 0x8a, 0xe7, 0xe1, 0xac, 0x6f, 0x03, 0xa8, 0xd8, 0xbc, 0x09, 0x33, 0x99, - 0xe3, 0x97, 0x42, 0xfc, 0xa7, 0x59, 0x13, 0x91, 0xf7, 0xbc, 0x0c, 0xc3, 0x32, 0x5b, 0x12, 0xb7, - 0xfd, 0xc8, 0x9f, 0xf8, 0x40, 0x4a, 0x7e, 0xa8, 0x32, 0xb0, 0x87, 0xfc, 0x1e, 0x77, 0xb5, 0x40, - 0x4a, 0xfc, 0x73, 0xfa, 0xf0, 0x25, 0x3e, 0x1a, 0xc5, 0x8b, 0xd5, 0xb9, 0xe2, 0x87, 0x91, 0xa7, - 0x3c, 0x6f, 0x6d, 0xf5, 0x9b, 0xdc, 0x80, 0x92, 0x4c, 0xe7, 0x20, 0xf2, 0xc6, 0x88, 0x8c, 0xdd, - 0x76, 0x0a, 0x4e, 0xde, 0x87, 0xd9, 0x24, 0x4c, 0xf6, 0x92, 0xbf, 0x70, 0xcb, 0x2b, 0xb6, 0xfe, - 0xa2, 0x88, 0xb1, 0xae, 0xbb, 0xcc, 0x6b, 0x26, 0xdd, 0xcd, 0x9a, 0x90, 0x56, 0x71, 0xb3, 0x46, - 0x2e, 0xc2, 0xe8, 0x66, 0xcd, 0x48, 0x39, 0x65, 0xc7, 0x00, 0xd6, 0x6c, 0xd6, 0x85, 0x6a, 0xd0, - 0x38, 0x70, 0x23, 0xda, 0x88, 0x3a, 0x81, 0x58, 0x85, 0xed, 0x14, 0x9c, 0x58, 0x30, 0x7e, 0xbf, - 0xe5, 0xee, 0x35, 0x24, 0x33, 0x2e, 0x02, 0x03, 0x46, 0xde, 0x80, 0xc9, 0x55, 0x2f, 0x8c, 0x9c, - 0x56, 0x6b, 0x9d, 0x46, 0x07, 0x7e, 0x53, 0x24, 0xcd, 0xb4, 0x13, 0x50, 0x56, 0xef, 0xa2, 0xef, - 0x45, 0x8e, 0xeb, 0xd1, 0xc0, 0xee, 0x78, 0x91, 0x7b, 0x48, 0x45, 0xdf, 0x53, 0x70, 0xf2, 0x0e, - 0xcc, 0x28, 0xd8, 0x66, 0xd0, 0x38, 0xa0, 0x61, 0x14, 0x60, 0x22, 0x3a, 0x0c, 0xf8, 0x63, 0x67, - 0x17, 0x62, 0x0d, 0x2d, 0xbf, 0xd3, 0x5c, 0xf6, 0x9e, 0xba, 0x81, 0xef, 0x61, 0x6e, 0x8a, 0x11, - 0x51, 0x43, 0x02, 0x6e, 0xfd, 0xc1, 0x48, 0xe6, 0x67, 0xfb, 0x32, 0x73, 0xf0, 0x4b, 0x18, 0x5f, - 0x74, 0xda, 0xce, 0x9e, 0xdb, 0x72, 0x23, 0x57, 0x65, 0xec, 0x7a, 0xb7, 0xc7, 0x37, 0x2f, 0x13, - 0x7c, 0xd0, 0xa6, 0x4e, 0x6c, 0x1b, 0xac, 0xe6, 0xfe, 0x7a, 0x08, 0x66, 0x32, 0xf1, 0xc8, 0x75, - 0x91, 0xda, 0x4b, 0xad, 0xab, 0x22, 0xd9, 0x95, 0x9d, 0x04, 0xb3, 0xb1, 0x44, 0xd0, 0x62, 0x8b, - 0x3a, 0x5e, 0x47, 0xa4, 0xba, 0xb2, 0x0d, 0x18, 0x1b, 0x4b, 0xa6, 0x37, 0x68, 0xcc, 0xd0, 0x71, - 0xda, 0x4e, 0x40, 0xc9, 0x15, 0x18, 0x63, 0x10, 0xc9, 0x6a, 0x80, 0x3f, 0xf1, 0xd3, 0x40, 0x8c, - 0xd3, 0x86, 0xdf, 0xa4, 0x1a, 0xa7, 0x41, 0xce, 0xc9, 0x84, 0x32, 0x4e, 0x0c, 0x22, 0x39, 0x0d, - 0x71, 0x4e, 0x1a, 0x88, 0xbc, 0x06, 0x13, 0xd5, 0x76, 0x5b, 0x63, 0x84, 0x39, 0xae, 0x6c, 0x13, - 0x48, 0x2e, 0x03, 0x54, 0xdb, 0x6d, 0xc9, 0x06, 0xf3, 0x57, 0xd9, 0x1a, 0x84, 0xdc, 0x8c, 0xc3, - 0x95, 0x69, 0xac, 0xf0, 0x3a, 0xc1, 0xce, 0x28, 0x61, 0x72, 0x55, 0xb1, 0x9d, 0x04, 0x53, 0xe0, - 0x72, 0x4d, 0x80, 0xc9, 0xc7, 0x70, 0x3e, 0xe1, 0x77, 0xa1, 0x55, 0x80, 0xa6, 0x7e, 0x3b, 0x1f, - 0x81, 0xbc, 0x07, 0xe7, 0x12, 0x85, 0xb2, 0x3a, 0xb4, 0xea, 0xdb, 0x39, 0xa5, 0xe4, 0x43, 0x28, - 0x27, 0x9e, 0x6d, 0xc7, 0x95, 0xa2, 0x05, 0xdf, 0xce, 0x2d, 0x67, 0x5f, 0x57, 0xe2, 0xfd, 0x97, - 0xa8, 0x12, 0x2f, 0x2b, 0xed, 0xec, 0x42, 0xb2, 0x02, 0x95, 0x4c, 0x5f, 0x16, 0xad, 0x62, 0xcc, - 0xcb, 0x65, 0xf7, 0x42, 0x23, 0x0b, 0x70, 0x31, 0x13, 0x45, 0x36, 0x03, 0xb3, 0x75, 0xd9, 0x5d, - 0x71, 0xc8, 0x3c, 0x4c, 0xc7, 0x3e, 0x3d, 0x5a, 0x13, 0x30, 0x51, 0x97, 0x9d, 0x59, 0x46, 0xde, - 0x36, 0x1f, 0xe7, 0xf3, 0xca, 0x30, 0x4f, 0x97, 0x9d, 0x2e, 0xb0, 0x8e, 0x0b, 0x70, 0x31, 0x73, - 0xa3, 0x94, 0xfa, 0xfc, 0x5c, 0x52, 0x71, 0xd4, 0xd6, 0x82, 0x1b, 0x30, 0x80, 0x0a, 0x3e, 0xb7, - 0x15, 0x4b, 0x5f, 0x53, 0xa4, 0xe7, 0xac, 0x58, 0xa9, 0x8d, 0x38, 0xe4, 0xbe, 0xba, 0x1b, 0xec, - 0x47, 0x4b, 0xc6, 0xad, 0xa4, 0x02, 0x95, 0x51, 0xb9, 0x7e, 0x47, 0x28, 0x6f, 0x03, 0x5f, 0xe6, - 0x1a, 0xe6, 0x2f, 0x0a, 0x50, 0xe9, 0xa1, 0x1f, 0xa8, 0x3e, 0x15, 0x4e, 0xd0, 0xa7, 0x07, 0xaa, - 0x4f, 0xfc, 0x6d, 0xec, 0xfc, 0xc9, 0x74, 0x90, 0x57, 0xdd, 0xad, 0x0e, 0x90, 0xb4, 0x1a, 0x4a, - 0xbe, 0x0b, 0xa3, 0xb5, 0xda, 0x8a, 0xe1, 0xd0, 0x97, 0xba, 0x1c, 0x8a, 0x31, 0xc8, 0xed, 0x13, - 0x79, 0xf0, 0x69, 0xfe, 0x7b, 0xd6, 0x12, 0x94, 0xf3, 0x34, 0x48, 0x5c, 0x58, 0x78, 0x6c, 0x2d, - 0xed, 0x62, 0x89, 0x2f, 0x2c, 0x26, 0xd8, 0x7a, 0x0f, 0xce, 0x29, 0x6a, 0x9e, 0xb4, 0x43, 0x7b, - 0xf8, 0x2f, 0x8e, 0x9d, 0x2a, 0xc0, 0x40, 0x0c, 0xb0, 0xfe, 0x7c, 0x20, 0x45, 0x58, 0xeb, 0x1c, - 0x1e, 0x3a, 0xc1, 0x73, 0x52, 0x35, 0x09, 0xfb, 0x7b, 0x6a, 0xfa, 0x0b, 0x03, 0x3f, 0x3b, 0xaa, - 0xf4, 0x69, 0xdc, 0xd9, 0x72, 0x8c, 0x1b, 0xbb, 0xd7, 0xa0, 0xfc, 0x4a, 0xaa, 0xc8, 0x83, 0x1b, - 0x19, 0x40, 0xb2, 0x0b, 0x13, 0x62, 0xcb, 0xc4, 0xdf, 0x72, 0x6a, 0xdf, 0x4e, 0x4e, 0x6d, 0xa3, - 0x79, 0x37, 0x0d, 0x12, 0x3e, 0x09, 0x4c, 0x36, 0xe4, 0x4b, 0x98, 0x94, 0x0a, 0x92, 0x60, 0xcc, - 0x9d, 0x88, 0xee, 0x74, 0x67, 0x6c, 0xd2, 0x70, 0xce, 0x09, 0x46, 0xac, 0xc9, 0x72, 0x8d, 0xe1, - 0x9c, 0x07, 0x4f, 0xd2, 0x64, 0x83, 0x44, 0x34, 0xd9, 0x80, 0xcd, 0x7d, 0x06, 0x24, 0xdd, 0xaf, - 0x5e, 0xb3, 0x78, 0x42, 0x9b, 0xc5, 0x73, 0x55, 0x98, 0xca, 0xe8, 0xc0, 0xa9, 0x58, 0x7c, 0x06, - 0x24, 0xdd, 0xd2, 0xd3, 0x70, 0xb0, 0xae, 0xc3, 0x1b, 0x4a, 0x04, 0x6a, 0x36, 0x18, 0x3c, 0xa5, - 0xe1, 0xf9, 0x37, 0x8b, 0x50, 0xe9, 0x81, 0x4a, 0xfe, 0x7e, 0x21, 0x29, 0x6d, 0x3e, 0x1b, 0x3f, - 0x48, 0x4a, 0x3b, 0x9b, 0x3e, 0x43, 0xec, 0x0b, 0x1f, 0xfe, 0xf4, 0xaf, 0x5e, 0x58, 0xe1, 0x4f, - 0x0f, 0xd9, 0xe9, 0xa5, 0x35, 0xa0, 0x4b, 0xcb, 0x86, 0x69, 0xe3, 0xa8, 0x74, 0x92, 0x3d, 0xe3, - 0x32, 0x80, 0x48, 0xf1, 0xb9, 0xe6, 0xef, 0x0b, 0xf5, 0x4c, 0x83, 0x58, 0xf7, 0x60, 0x26, 0xc1, - 0x53, 0x18, 0xc3, 0xbf, 0x0b, 0xea, 0x81, 0x37, 0x32, 0xed, 0x5f, 0x38, 0xfb, 0x8b, 0xa3, 0xca, - 0x04, 0xd3, 0xa4, 0x6f, 0xc6, 0xf1, 0xe3, 0xe5, 0x5f, 0xd6, 0xba, 0x6e, 0xce, 0xaf, 0xb6, 0xf4, - 0xc0, 0x37, 0xe4, 0x0e, 0x0c, 0x71, 0x48, 0x22, 0x4a, 0xb3, 0x8e, 0x2d, 0xd6, 0x04, 0x81, 0x68, - 0xcd, 0xe0, 0x73, 0x54, 0xfc, 0x51, 0x8d, 0xc3, 0x27, 0x58, 0x3b, 0x3c, 0x6b, 0x49, 0x0c, 0x56, - 0x91, 0xa0, 0x07, 0xaa, 0x71, 0x98, 0x07, 0xe9, 0x7b, 0x21, 0xf1, 0x3c, 0xff, 0x59, 0x8b, 0x36, - 0x79, 0x46, 0xb8, 0x85, 0x71, 0xe1, 0x7b, 0x31, 0xe0, 0x30, 0x06, 0x48, 0x66, 0x7d, 0x0a, 0x33, - 0x6c, 0x83, 0x0e, 0x92, 0xf5, 0x61, 0xae, 0x02, 0x06, 0x33, 0x1d, 0xda, 0x1d, 0x06, 0x42, 0x87, - 0x76, 0x51, 0x68, 0xad, 0xc1, 0x79, 0x6e, 0x0c, 0xd4, 0xbb, 0x14, 0x9b, 0xde, 0x07, 0xf1, 0x77, - 0xe2, 0x31, 0x63, 0x46, 0xef, 0x39, 0x9e, 0xf5, 0x09, 0xbe, 0x96, 0x11, 0x93, 0xd4, 0xf5, 0xbd, - 0xd8, 0xf2, 0x77, 0xb2, 0xe7, 0xb5, 0xff, 0x27, 0x5c, 0xac, 0xb6, 0xdb, 0xd4, 0x6b, 0xc6, 0x84, - 0xdb, 0x81, 0x73, 0xc2, 0xe0, 0x07, 0xa4, 0x0a, 0x83, 0x88, 0xad, 0xee, 0x2d, 0x45, 0x73, 0x33, - 0x9a, 0x83, 0x78, 0x22, 0x6c, 0x27, 0x56, 0xc0, 0x29, 0xad, 0x26, 0xcc, 0xd6, 0x3a, 0x7b, 0x87, - 0x6e, 0x84, 0x6e, 0xf0, 0x18, 0x40, 0x44, 0xd6, 0xbd, 0x2a, 0x13, 0x4d, 0x71, 0x61, 0x5c, 0x8f, - 0x5f, 0x55, 0xa0, 0x27, 0xbd, 0x08, 0x2a, 0xf2, 0xf4, 0xce, 0xcd, 0x98, 0x14, 0xad, 0x1e, 0xbc, - 0x16, 0x2c, 0x16, 0xc9, 0xa8, 0xac, 0x29, 0x38, 0xab, 0xdf, 0x01, 0xf1, 0x19, 0x32, 0x03, 0x53, - 0xe6, 0xdd, 0x0e, 0x07, 0x7f, 0x0d, 0xd3, 0xdc, 0xf6, 0xcc, 0xc3, 0x6e, 0xcf, 0xc7, 0x11, 0xa6, - 0x8b, 0xbb, 0xf3, 0x09, 0xff, 0x7b, 0x74, 0xcb, 0x55, 0x09, 0x15, 0x76, 0xe7, 0xf9, 0x8b, 0xc7, - 0xa7, 0xf3, 0xc6, 0x0d, 0x62, 0x71, 0x77, 0x7e, 0x61, 0x58, 0x84, 0x2f, 0x65, 0xdc, 0xf9, 0xf0, - 0x7f, 0x2b, 0xdc, 0xe7, 0xf1, 0x91, 0xfd, 0x0a, 0x75, 0xf0, 0x41, 0x4c, 0xf6, 0x53, 0xe5, 0x49, - 0x28, 0xba, 0x4d, 0x79, 0x5a, 0x77, 0x9b, 0xd6, 0x1f, 0x17, 0xe0, 0x3a, 0xd7, 0x81, 0xb2, 0xe9, - 0xf0, 0xa2, 0x27, 0x87, 0x98, 0xbc, 0x0f, 0x3c, 0x6b, 0xbb, 0x50, 0x34, 0x2d, 0xd1, 0xf2, 0x6e, - 0x9c, 0x38, 0x01, 0xa9, 0xc2, 0xb8, 0xfe, 0xa4, 0xe4, 0x64, 0xe1, 0xe1, 0xec, 0xb1, 0xc3, 0xc7, - 0x8e, 0x7a, 0x66, 0xf2, 0x04, 0x2e, 0x2c, 0x7f, 0xc3, 0x26, 0x84, 0xd8, 0x9d, 0x84, 0xc2, 0x1e, - 0x3f, 0x85, 0x3d, 0xb3, 0x2d, 0x66, 0x8c, 0x79, 0x9a, 0x4e, 0x82, 0xd9, 0xd1, 0x54, 0x6e, 0x70, - 0x4a, 0x6b, 0x1e, 0xb5, 0x0d, 0x98, 0xf5, 0xe7, 0x05, 0xb8, 0x98, 0x5d, 0x9b, 0x58, 0x58, 0x56, - 0xe1, 0xec, 0xa2, 0xe3, 0xf9, 0x9e, 0xdb, 0x70, 0x5a, 0xb5, 0xc6, 0x01, 0x6d, 0x76, 0x54, 0x90, - 0x53, 0xb5, 0xca, 0xec, 0x53, 0x4f, 0x92, 0x4b, 0x14, 0x3b, 0x4d, 0xc5, 0x0e, 0x65, 0xf8, 0x2a, - 0x81, 0xaf, 0xbd, 0x2d, 0x1a, 0x28, 0x7e, 0xbc, 0x65, 0x39, 0xa5, 0xe4, 0xb6, 0x34, 0xb2, 0x37, - 0x77, 0x3c, 0x37, 0x52, 0x44, 0xdc, 0xba, 0x92, 0x55, 0x64, 0xfd, 0xdb, 0x02, 0x9c, 0xc7, 0xbc, - 0x46, 0x46, 0xa6, 0xc4, 0x38, 0xd6, 0xaf, 0x0c, 0x57, 0x5b, 0x30, 0x5e, 0x59, 0x18, 0xd8, 0x66, - 0xdc, 0x5a, 0xf2, 0x36, 0x0c, 0xd4, 0xa4, 0x93, 0xd4, 0x64, 0x22, 0x0d, 0xad, 0x4c, 0xf9, 0xef, - 0x07, 0x91, 0x8d, 0x58, 0x6c, 0xcf, 0x59, 0xa2, 0x61, 0x83, 0x7a, 0x98, 0x2f, 0x98, 0x1f, 0xf6, - 0x35, 0x48, 0x1c, 0xaa, 0x68, 0x20, 0x2f, 0x54, 0xd1, 0xa0, 0x19, 0xaa, 0xc8, 0x7a, 0xca, 0xb3, - 0x1a, 0x25, 0x3b, 0x24, 0x06, 0xe9, 0x93, 0x54, 0x7a, 0x61, 0xbe, 0x0f, 0x9c, 0xcb, 0xea, 0xd9, - 0xee, 0xdd, 0x54, 0xe6, 0xe0, 0xfc, 0xd8, 0xba, 0x5b, 0xf0, 0x9a, 0x81, 0x5b, 0x6d, 0xb5, 0xfc, - 0x67, 0xb4, 0xb9, 0x15, 0xf8, 0x87, 0x7e, 0x64, 0x64, 0x75, 0x11, 0xf9, 0xb5, 0xe3, 0x6b, 0x14, - 0x31, 0x2b, 0x13, 0x60, 0xeb, 0xff, 0x80, 0xd7, 0x7b, 0x70, 0x14, 0x9d, 0xaa, 0xc1, 0x59, 0x27, - 0x51, 0x26, 0xbd, 0x5d, 0x5e, 0xcf, 0xea, 0x57, 0x92, 0x51, 0x68, 0xa7, 0xe9, 0x6f, 0x6c, 0x1b, - 0x29, 0x79, 0x49, 0x19, 0xa6, 0xb7, 0xec, 0xcd, 0xa5, 0x9d, 0xc5, 0xed, 0xfa, 0xf6, 0x97, 0x5b, - 0xcb, 0xf5, 0x9d, 0x8d, 0x87, 0x1b, 0x9b, 0x8f, 0x36, 0x78, 0x70, 0x6a, 0xa3, 0x64, 0x7b, 0xb9, - 0xba, 0x5e, 0x2a, 0x90, 0x69, 0x28, 0x19, 0xe0, 0xe5, 0x9d, 0x85, 0x52, 0xf1, 0xc6, 0xd7, 0x46, - 0xaa, 0x59, 0x72, 0x11, 0xca, 0xb5, 0x9d, 0xad, 0xad, 0x4d, 0x5b, 0x71, 0xd5, 0x43, 0x63, 0xcf, - 0xc0, 0x59, 0xa3, 0xf4, 0x9e, 0xbd, 0xbc, 0x5c, 0x2a, 0xb0, 0xa6, 0x18, 0xe0, 0x2d, 0x7b, 0x79, - 0x7d, 0x75, 0x67, 0xbd, 0x54, 0xbc, 0x51, 0xd7, 0x9f, 0x76, 0x91, 0x0b, 0x30, 0xbb, 0xb4, 0xbc, - 0xbb, 0xba, 0xb8, 0x9c, 0xc5, 0x7b, 0x1a, 0x4a, 0x7a, 0xe1, 0xf6, 0xe6, 0xf6, 0x16, 0x67, 0xad, - 0x43, 0x1f, 0x2d, 0x2f, 0x54, 0x77, 0xb6, 0x57, 0x36, 0x4a, 0xfd, 0xd6, 0xc0, 0x48, 0xb1, 0x54, - 0xbc, 0xf1, 0x23, 0xe3, 0xdd, 0x17, 0x6b, 0xbe, 0x40, 0xdf, 0xa9, 0x55, 0xef, 0xe7, 0x57, 0xc1, - 0x4b, 0xd7, 0xef, 0x55, 0x4b, 0x05, 0x72, 0x09, 0xce, 0x1b, 0xd0, 0xad, 0x6a, 0xad, 0xf6, 0x68, - 0xd3, 0x5e, 0x5a, 0x5b, 0xae, 0xd5, 0x4a, 0xc5, 0x1b, 0xbb, 0x46, 0x78, 0x36, 0x56, 0xc3, 0xfa, - 0xbd, 0x6a, 0xdd, 0x5e, 0xfe, 0x7c, 0x67, 0xd5, 0x5e, 0x5e, 0x4a, 0xd7, 0x60, 0x94, 0x7e, 0xb9, - 0x5c, 0x2b, 0x15, 0xc8, 0x14, 0x9c, 0x31, 0xa0, 0x1b, 0x9b, 0xa5, 0xe2, 0x8d, 0x37, 0x44, 0x04, - 0x2f, 0x32, 0x09, 0xb0, 0xb4, 0x5c, 0x5b, 0x5c, 0xde, 0x58, 0x5a, 0xdd, 0xb8, 0x5f, 0xea, 0x23, - 0x13, 0x30, 0x5a, 0x55, 0x3f, 0x0b, 0x37, 0x3e, 0x84, 0x33, 0x89, 0x13, 0x35, 0xc3, 0x50, 0x87, - 0xd1, 0x52, 0x1f, 0x8a, 0x5f, 0xfe, 0x44, 0xb3, 0x26, 0x3f, 0x1c, 0x97, 0x0a, 0x37, 0x16, 0x64, - 0xea, 0x53, 0xed, 0x3b, 0x27, 0x63, 0x30, 0xbc, 0xb4, 0x7c, 0xaf, 0xba, 0xb3, 0xb6, 0x5d, 0xea, - 0x63, 0x3f, 0x16, 0xed, 0xe5, 0xea, 0xf6, 0xf2, 0x52, 0xa9, 0x40, 0x46, 0x61, 0xb0, 0xb6, 0x5d, - 0xdd, 0x5e, 0x2e, 0x15, 0xc9, 0x08, 0x0c, 0xec, 0xd4, 0x96, 0xed, 0x52, 0xff, 0xfc, 0x9f, 0xfc, - 0x83, 0x02, 0xb7, 0xed, 0xc9, 0x37, 0x44, 0x5f, 0x6b, 0x87, 0x49, 0xb1, 0xe4, 0x89, 0x3c, 0x8f, - 0xb9, 0x27, 0x47, 0xd4, 0x02, 0xe6, 0xba, 0x5c, 0x76, 0x20, 0xc2, 0xf5, 0xc2, 0xed, 0x02, 0xb1, - 0xd1, 0x39, 0x24, 0x71, 0xb6, 0x52, 0x9c, 0xb3, 0x8f, 0xbf, 0x73, 0x97, 0xba, 0x1e, 0xc9, 0xc8, - 0xaf, 0x81, 0xa5, 0xf3, 0xcc, 0x39, 0x81, 0x7c, 0xf7, 0x64, 0x27, 0x0d, 0x59, 0xe7, 0x1b, 0x27, - 0x43, 0x27, 0x0f, 0x60, 0x82, 0xe9, 0xe6, 0x0a, 0x8d, 0x5c, 0x48, 0x12, 0x6a, 0xc7, 0x81, 0xb9, - 0x8b, 0xd9, 0x85, 0x2a, 0x15, 0xcb, 0x38, 0x76, 0x84, 0x1f, 0xac, 0x43, 0x22, 0xa3, 0x3c, 0x48, - 0x08, 0x5f, 0xf1, 0xe7, 0xce, 0x26, 0xc0, 0xbb, 0x77, 0x6e, 0x17, 0x48, 0x0d, 0x43, 0xac, 0x19, - 0x4a, 0x3e, 0x91, 0x8f, 0xda, 0xd2, 0xda, 0x3f, 0x6f, 0x4d, 0x45, 0x25, 0x4e, 0xcc, 0x39, 0x1d, - 0x6c, 0x00, 0x49, 0xeb, 0xce, 0xe4, 0x4a, 0x3c, 0x0f, 0xb2, 0xd5, 0xea, 0xb9, 0x73, 0x29, 0x9f, - 0xbf, 0x65, 0xa6, 0x3d, 0x91, 0x65, 0x98, 0x14, 0x4f, 0xb8, 0x85, 0x36, 0x4f, 0xba, 0x9d, 0x07, - 0x72, 0xd9, 0xdc, 0x47, 0x39, 0xa9, 0x13, 0x01, 0x99, 0x8b, 0xfb, 0x91, 0x3c, 0x26, 0xcc, 0x5d, - 0xc8, 0x2c, 0x13, 0xfd, 0xbb, 0x07, 0x93, 0xe6, 0xe1, 0x82, 0xc8, 0x01, 0xca, 0x3c, 0x73, 0xe4, - 0x36, 0xa8, 0x0e, 0xb3, 0xeb, 0x8e, 0x8b, 0x57, 0x14, 0xc2, 0xb3, 0x4c, 0xfa, 0x85, 0x91, 0x4a, - 0x17, 0x47, 0xb1, 0x1a, 0xf5, 0x9a, 0x6a, 0x10, 0xf2, 0xc2, 0xaa, 0xe3, 0x67, 0x53, 0x93, 0x3a, - 0xb2, 0xe9, 0x57, 0x47, 0x2c, 0x33, 0x19, 0x6e, 0x96, 0xab, 0xe4, 0x5c, 0x9e, 0x77, 0x2f, 0x59, - 0x47, 0x25, 0x3d, 0xc1, 0x51, 0x9b, 0x13, 0xa7, 0x66, 0x57, 0xc6, 0x40, 0x02, 0x5a, 0x12, 0x71, - 0x51, 0x18, 0x92, 0x1c, 0xc1, 0xe5, 0x32, 0xbb, 0x5d, 0x20, 0x5f, 0xe3, 0x57, 0x9d, 0xc9, 0xee, - 0x91, 0x1b, 0x1d, 0x08, 0xed, 0xe7, 0x42, 0x26, 0x03, 0xf1, 0xa1, 0x74, 0xe1, 0x6e, 0xc3, 0x74, - 0x96, 0x43, 0xb1, 0x12, 0x68, 0x17, 0x6f, 0xe3, 0xdc, 0x59, 0x60, 0xb3, 0xa3, 0x46, 0x33, 0x7f, - 0x90, 0xba, 0xf8, 0xb3, 0xe6, 0xf2, 0xfc, 0x18, 0x26, 0xd9, 0x2c, 0x79, 0x48, 0x69, 0xbb, 0xda, - 0x72, 0x9f, 0xd2, 0x90, 0xc8, 0xf8, 0xb8, 0x0a, 0x94, 0x47, 0x7b, 0xbd, 0x40, 0xbe, 0x03, 0x63, - 0x8f, 0x9c, 0xa8, 0x71, 0x20, 0xe2, 0x44, 0xca, 0x30, 0x92, 0x08, 0x9b, 0x93, 0xbf, 0xb0, 0xf0, - 0x76, 0x81, 0x7c, 0x1f, 0x86, 0xef, 0xd3, 0x08, 0x1f, 0x15, 0x5f, 0x55, 0xbe, 0x75, 0xdc, 0x36, - 0xb9, 0xea, 0xa9, 0x97, 0x33, 0xb2, 0xc1, 0x49, 0x03, 0x2a, 0xb9, 0x05, 0xc0, 0x17, 0x04, 0xe4, - 0x90, 0x2c, 0x9e, 0x4b, 0x35, 0x9b, 0xdc, 0x67, 0xca, 0x43, 0x8b, 0x46, 0xf4, 0xa4, 0x55, 0xe6, - 0xc9, 0x68, 0x0d, 0x26, 0x55, 0xf6, 0x9a, 0x0d, 0x0c, 0xe7, 0x61, 0x25, 0x98, 0x85, 0xa7, 0xe0, - 0xf6, 0x21, 0xfb, 0x2a, 0x78, 0xea, 0x56, 0x8c, 0xfb, 0x80, 0x2b, 0xe9, 0xac, 0x1e, 0x3c, 0x42, - 0x5f, 0x42, 0xa5, 0x10, 0x39, 0x9a, 0x46, 0xbb, 0xe2, 0x87, 0x91, 0x49, 0xab, 0x20, 0xd9, 0xb4, - 0xbf, 0x0a, 0x73, 0x7a, 0xbd, 0x66, 0xa0, 0xe2, 0x78, 0xcd, 0xcd, 0x8b, 0x7f, 0x3c, 0x77, 0xb5, - 0x0b, 0x86, 0x38, 0xbf, 0xf5, 0xff, 0x76, 0xb1, 0x80, 0xcb, 0xc9, 0x12, 0x4c, 0xc9, 0xba, 0x36, - 0xdb, 0xd4, 0xab, 0xd5, 0x56, 0x30, 0x53, 0x89, 0xf4, 0xe4, 0xd0, 0x60, 0x92, 0x3b, 0x49, 0x17, - 0xb1, 0xad, 0xcf, 0x88, 0xef, 0x40, 0xba, 0x45, 0x7d, 0x88, 0xb7, 0xbe, 0xcc, 0x08, 0xba, 0x0f, - 0xb9, 0x51, 0xc9, 0x50, 0xfe, 0x77, 0xe7, 0x49, 0x97, 0x03, 0xd0, 0x5c, 0xce, 0x11, 0xe2, 0x76, - 0x81, 0x7c, 0x09, 0x24, 0x7d, 0x24, 0x51, 0x22, 0xcc, 0x3d, 0x7e, 0x29, 0x11, 0x76, 0x39, 0xcf, - 0x2c, 0xc3, 0x94, 0x8a, 0xee, 0x12, 0x97, 0x93, 0x9c, 0xb6, 0x74, 0xd9, 0xc1, 0x66, 0x32, 0xd8, - 0xec, 0xce, 0x77, 0x61, 0x94, 0x09, 0x27, 0x9f, 0xc2, 0x94, 0x98, 0xfb, 0x46, 0x7b, 0x4a, 0x6a, - 0x19, 0x13, 0x87, 0x9b, 0xdc, 0x96, 0x3c, 0x80, 0x99, 0x5a, 0x42, 0xf0, 0xdc, 0x8f, 0xfd, 0xbc, - 0xc9, 0x02, 0x81, 0x35, 0x1a, 0x71, 0xc9, 0x67, 0xf3, 0x7a, 0x08, 0x84, 0xdb, 0x96, 0x24, 0xbb, - 0xa7, 0x2e, 0x7d, 0x46, 0x2e, 0x25, 0x9a, 0xce, 0x80, 0x88, 0x86, 0xeb, 0x60, 0x6e, 0xcf, 0xb6, - 0x79, 0xfe, 0x62, 0x84, 0x1a, 0x37, 0xe0, 0x57, 0x0c, 0x02, 0xe3, 0x12, 0x5d, 0x8c, 0xe3, 0xf9, - 0x5c, 0x0c, 0xf2, 0x1b, 0x18, 0x9d, 0xb5, 0xfb, 0xe9, 0x8c, 0x7c, 0x27, 0xeb, 0x10, 0x9d, 0x73, - 0xbe, 0x9c, 0x7b, 0xfb, 0x64, 0xc8, 0xea, 0x3c, 0x3c, 0x71, 0x9f, 0x46, 0x5b, 0xad, 0xce, 0xbe, - 0x8b, 0x99, 0x2d, 0x89, 0xb2, 0x3d, 0x29, 0x90, 0x98, 0xde, 0x32, 0x28, 0x5a, 0x5c, 0x50, 0xa3, - 0x3f, 0x26, 0xab, 0x50, 0xe2, 0xdb, 0x88, 0xc6, 0xe2, 0x52, 0x8a, 0x85, 0x40, 0x71, 0x02, 0xe7, - 0x30, 0xcc, 0x1d, 0xad, 0x5b, 0xdc, 0xe5, 0x88, 0xc8, 0x4f, 0x5b, 0xd7, 0x53, 0xa7, 0x0c, 0x98, - 0x8a, 0x58, 0xcf, 0x46, 0xc4, 0xa6, 0x21, 0x8d, 0x64, 0x18, 0x18, 0x9e, 0xd7, 0xf4, 0x5a, 0xac, - 0x33, 0xa4, 0x4b, 0xe3, 0x15, 0x24, 0x11, 0xb2, 0x6c, 0xf7, 0x2e, 0x51, 0xb9, 0x5e, 0x33, 0x98, - 0xbe, 0x61, 0xa8, 0x36, 0xa7, 0xe3, 0xfb, 0x0e, 0x6e, 0x65, 0x18, 0xfa, 0x66, 0x26, 0x6e, 0x1b, - 0xfb, 0x2d, 0xa9, 0x26, 0x34, 0xaa, 0xdd, 0x79, 0x5c, 0x19, 0xd9, 0x5e, 0xcb, 0x34, 0xe1, 0x4e, - 0x10, 0x50, 0x8f, 0x13, 0xe7, 0xa9, 0x2d, 0x59, 0xd4, 0x9f, 0xe0, 0x0a, 0xa6, 0x51, 0xf3, 0xe7, - 0x76, 0xbd, 0x58, 0xf0, 0x3c, 0x3c, 0xb7, 0x0b, 0xe4, 0x7d, 0x18, 0x11, 0x6d, 0x64, 0x44, 0x46, - 0xa3, 0xc3, 0x2e, 0xad, 0x46, 0x4a, 0xe0, 0x42, 0xc2, 0x36, 0x9b, 0x38, 0x79, 0xa3, 0xcf, 0xdb, - 0xfc, 0x3e, 0xdb, 0xb3, 0x9b, 0x2f, 0x42, 0xb9, 0x28, 0x37, 0x6f, 0xa4, 0x2c, 0xab, 0x48, 0x2c, - 0x12, 0xd4, 0x63, 0x97, 0xe5, 0x4c, 0x98, 0xfa, 0x8d, 0x31, 0x07, 0x55, 0xe8, 0x30, 0xa5, 0x7e, - 0x1b, 0xe0, 0x5e, 0x5b, 0xf6, 0x2a, 0x94, 0xaa, 0x0d, 0xdc, 0x50, 0x6a, 0xf4, 0xd0, 0x69, 0x1f, - 0xf8, 0x01, 0x55, 0x67, 0x9f, 0x64, 0x81, 0xe4, 0x35, 0xa3, 0x14, 0x14, 0x51, 0xb0, 0x46, 0x1d, - 0x0c, 0xcc, 0x3c, 0xab, 0x34, 0x94, 0x44, 0x51, 0x36, 0x45, 0x97, 0xb3, 0xce, 0xf4, 0x22, 0x3b, - 0x9d, 0xb5, 0x5e, 0x8e, 0xcd, 0x87, 0xb8, 0x60, 0x28, 0xe4, 0x50, 0xed, 0x10, 0x0a, 0xa4, 0x4e, - 0x85, 0xf2, 0xe5, 0x8d, 0x42, 0xad, 0xca, 0xab, 0xe7, 0x58, 0x2c, 0x79, 0xd4, 0x79, 0xd5, 0x7f, - 0x0f, 0x26, 0x97, 0xd9, 0x82, 0xde, 0x69, 0xba, 0x3c, 0x18, 0x3d, 0x31, 0xa3, 0x8b, 0xe7, 0x12, - 0xae, 0xc8, 0xd4, 0x57, 0x48, 0x2a, 0x2c, 0x08, 0x72, 0x4f, 0xd1, 0x60, 0x72, 0x3c, 0xa6, 0x25, - 0x5b, 0x91, 0x0f, 0x00, 0x4f, 0xf8, 0xc2, 0x64, 0x30, 0xcb, 0x15, 0xcb, 0x6a, 0xbb, 0xdd, 0x92, - 0x96, 0x6d, 0x7e, 0x53, 0xff, 0xba, 0x71, 0x12, 0x4d, 0x95, 0x4b, 0xde, 0x69, 0xdd, 0xf3, 0x0b, - 0x2d, 0x15, 0x6d, 0x0e, 0xcf, 0x9c, 0xf2, 0x5e, 0x73, 0x51, 0x85, 0x8f, 0xae, 0xb6, 0x5a, 0x29, - 0xe2, 0x90, 0xbc, 0x65, 0x72, 0xcf, 0xc2, 0xe9, 0x55, 0x03, 0x9e, 0xf4, 0xb9, 0xf2, 0x56, 0x6d, - 0xb7, 0xf9, 0x62, 0x79, 0x59, 0x2d, 0x18, 0x66, 0x41, 0xfa, 0xa4, 0x9f, 0x2c, 0x17, 0x6b, 0xfb, - 0x03, 0x9c, 0x66, 0x71, 0xbe, 0x5a, 0xa2, 0x9f, 0x9b, 0x93, 0xe9, 0x7a, 0x95, 0x2e, 0x97, 0x28, - 0x54, 0xfb, 0xc4, 0x99, 0x44, 0xea, 0x7e, 0x65, 0xe0, 0x49, 0xa5, 0xf4, 0xe7, 0xfc, 0x2e, 0xe7, - 0x15, 0x2b, 0x83, 0x6b, 0x29, 0x99, 0x13, 0x5c, 0x75, 0x39, 0x27, 0xd7, 0xbc, 0xea, 0x72, 0x6e, - 0x32, 0xf1, 0x07, 0x50, 0x4a, 0xa6, 0x23, 0x56, 0x4c, 0x73, 0xf2, 0x14, 0xe7, 0x8e, 0xc9, 0x3d, - 0x98, 0xd6, 0x47, 0x54, 0xf5, 0x3b, 0x6f, 0xf5, 0xcf, 0xe3, 0xb3, 0x0d, 0x33, 0x99, 0xd9, 0x83, - 0xd5, 0x16, 0xdb, 0x2d, 0xb7, 0x70, 0x2e, 0x57, 0x0a, 0xe7, 0xb2, 0x13, 0x88, 0x93, 0xd7, 0x4c, - 0xfb, 0x41, 0x76, 0x3a, 0xe5, 0xb9, 0xd7, 0x7b, 0x60, 0x09, 0x81, 0x7e, 0x8d, 0x3b, 0x60, 0xaa, - 0x8e, 0xab, 0x9a, 0x45, 0x21, 0xa7, 0x02, 0xab, 0x1b, 0x8a, 0x9a, 0x03, 0xd3, 0x19, 0xc5, 0xf9, - 0x22, 0xbe, 0x96, 0xcf, 0x33, 0x9e, 0x58, 0xbb, 0x32, 0x4a, 0x72, 0xae, 0x64, 0xba, 0x26, 0x9a, - 0xee, 0x72, 0x24, 0x9d, 0x53, 0xf3, 0xe1, 0xe4, 0x4d, 0xce, 0x37, 0x2f, 0x4d, 0x67, 0xa5, 0x37, - 0x4f, 0x5a, 0x7f, 0xb2, 0xb2, 0x57, 0x2b, 0x31, 0x74, 0xcd, 0x8f, 0xbe, 0xcb, 0x2d, 0x41, 0x26, - 0x77, 0xdd, 0x12, 0x94, 0xc9, 0xfa, 0x4a, 0x3e, 0x42, 0x3c, 0x23, 0x8c, 0xd8, 0xeb, 0xa2, 0xff, - 0xfa, 0x39, 0x2b, 0x3b, 0xb1, 0xb5, 0x9a, 0x11, 0x99, 0x28, 0x82, 0xbb, 0x2d, 0x3f, 0xba, 0x1c, - 0xb1, 0x74, 0x49, 0xea, 0xdd, 0xe5, 0x38, 0x54, 0x8e, 0x07, 0x2e, 0xd1, 0xec, 0xd3, 0x0e, 0xdb, - 0xd7, 0x70, 0x3e, 0x37, 0x81, 0x37, 0x79, 0x33, 0xf5, 0x41, 0xe7, 0x48, 0x22, 0xbf, 0xa5, 0x13, - 0x46, 0xee, 0x6d, 0x65, 0x0a, 0x4b, 0xa4, 0xf9, 0x4e, 0xad, 0xd8, 0x19, 0x39, 0xc0, 0xef, 0xa3, - 0xe6, 0xab, 0xe5, 0xf1, 0xce, 0xed, 0xeb, 0xa5, 0x2c, 0x3e, 0x61, 0x7a, 0x4d, 0xd5, 0xda, 0x25, - 0x35, 0xb1, 0x64, 0xc1, 0x69, 0xd6, 0xd4, 0x93, 0x34, 0x2d, 0x8f, 0xcf, 0x12, 0x8c, 0x69, 0x09, - 0xc0, 0xc9, 0x79, 0x43, 0x4c, 0xc6, 0x2e, 0x39, 0x67, 0x74, 0xce, 0xdc, 0x20, 0x17, 0xd1, 0xe6, - 0xac, 0xd2, 0x88, 0xe7, 0xb6, 0xe2, 0x42, 0x9a, 0x87, 0x61, 0x6f, 0x56, 0x52, 0xe0, 0xad, 0xb9, - 0x98, 0x14, 0x8e, 0xd1, 0xa0, 0xfc, 0x2e, 0x11, 0x5d, 0x34, 0x3d, 0x9a, 0x94, 0xaf, 0xa1, 0x4e, - 0x89, 0x2c, 0xa3, 0x98, 0x0c, 0x45, 0xc6, 0xe4, 0x3b, 0xa7, 0x8c, 0x67, 0x1a, 0xb4, 0x8b, 0x2d, - 0x63, 0x0b, 0x9f, 0x76, 0x64, 0x64, 0x44, 0x57, 0x6b, 0x68, 0xd7, 0x84, 0xe9, 0x19, 0xda, 0x99, - 0x5a, 0x95, 0x73, 0x39, 0x76, 0x4d, 0x91, 0x9e, 0xdb, 0xd2, 0x1f, 0x6a, 0xab, 0x72, 0x2a, 0xef, - 0x39, 0xb9, 0x9e, 0x54, 0xcd, 0xf2, 0x52, 0xa3, 0x77, 0x59, 0xf5, 0xa7, 0xb3, 0x52, 0xa6, 0x6b, - 0x06, 0xe0, 0xdc, 0x7c, 0xea, 0x19, 0x52, 0x50, 0xcb, 0x5b, 0x0e, 0xb7, 0x2e, 0x09, 0xd4, 0x73, - 0x5b, 0xf8, 0x95, 0xb6, 0xbc, 0x25, 0x12, 0x9d, 0xab, 0x03, 0x77, 0x8f, 0x4c, 0xe8, 0xb9, 0xbc, - 0x37, 0xf0, 0x31, 0x50, 0x3a, 0x4b, 0xb9, 0xd2, 0x5d, 0xba, 0xe5, 0x30, 0xcf, 0xb4, 0x0f, 0xcf, - 0xa4, 0xbb, 0xc8, 0xf8, 0x9d, 0x4b, 0x58, 0x77, 0x7b, 0x35, 0x4c, 0xad, 0xc3, 0x19, 0xd9, 0xcd, - 0x13, 0xeb, 0x70, 0x7e, 0xfe, 0xf3, 0x2e, 0x07, 0x9d, 0x33, 0x35, 0x77, 0xdf, 0xd3, 0x92, 0x93, - 0xab, 0x63, 0x4e, 0x3a, 0x5f, 0xba, 0x5a, 0x62, 0xb2, 0x72, 0x99, 0x6f, 0x32, 0x0d, 0x87, 0xeb, - 0xe7, 0x7a, 0x9a, 0x69, 0x32, 0x97, 0x9f, 0x5d, 0x5b, 0x2d, 0x37, 0x99, 0x79, 0xa9, 0x35, 0x86, - 0x7a, 0x8e, 0x67, 0xc5, 0x30, 0x23, 0xdd, 0xb4, 0x62, 0x98, 0x99, 0x14, 0xfa, 0x16, 0xda, 0x55, - 0x6c, 0xbf, 0x45, 0x75, 0xbb, 0x8a, 0x96, 0x34, 0x38, 0x61, 0xd6, 0x20, 0x1f, 0xa1, 0x51, 0xa3, - 0xbb, 0x25, 0x64, 0xd6, 0xe4, 0xa4, 0xfb, 0x8e, 0x8c, 0xaa, 0x8c, 0xcc, 0xca, 0x8a, 0x9e, 0x4c, - 0x0a, 0x3d, 0x57, 0x4e, 0x17, 0x08, 0xfa, 0x77, 0xa5, 0x5d, 0x04, 0x1b, 0x5c, 0x36, 0xed, 0x49, - 0xf9, 0x6d, 0x7e, 0x57, 0x1a, 0x45, 0x0c, 0xb2, 0x54, 0x3e, 0xe6, 0x24, 0xd9, 0xf7, 0x60, 0x3c, - 0xce, 0xbd, 0xbc, 0x3b, 0xaf, 0x11, 0x26, 0x12, 0x32, 0x27, 0x09, 0xdf, 0x97, 0x17, 0x27, 0x58, - 0x9f, 0x59, 0xd8, 0xdd, 0x7e, 0xf2, 0x89, 0x34, 0xc2, 0x18, 0x2d, 0x4d, 0x65, 0x72, 0xee, 0xb2, - 0x72, 0x8f, 0xeb, 0x09, 0x23, 0xd5, 0xbc, 0xc8, 0x48, 0xf9, 0xaa, 0xe6, 0x45, 0x56, 0xca, 0xd6, - 0xf8, 0x62, 0xe1, 0x4b, 0x69, 0x71, 0x88, 0x99, 0x5e, 0x32, 0x9a, 0x95, 0xe2, 0x7b, 0x39, 0xaf, - 0x38, 0xc9, 0xba, 0x06, 0xa5, 0x64, 0x76, 0x4b, 0x75, 0x5c, 0xcb, 0x49, 0x43, 0xaa, 0xce, 0x80, - 0xb9, 0x69, 0x31, 0xb7, 0xa4, 0xf9, 0xdc, 0xe4, 0x7b, 0x35, 0xbb, 0x51, 0x3a, 0xeb, 0xee, 0x6a, - 0x59, 0x9c, 0xe8, 0x52, 0x3f, 0x48, 0xa7, 0x12, 0x69, 0xea, 0x6a, 0x59, 0x46, 0x6e, 0x4c, 0x57, - 0x86, 0x73, 0xca, 0xce, 0xb7, 0xfd, 0x96, 0x79, 0xc2, 0xed, 0x12, 0x15, 0xbd, 0xe7, 0x25, 0x33, - 0xf9, 0x15, 0x98, 0xcd, 0x09, 0x20, 0x4d, 0x5e, 0x4f, 0x18, 0x62, 0xb3, 0x03, 0x4c, 0xab, 0x09, - 0x92, 0x99, 0x81, 0x7a, 0x1d, 0xbd, 0x13, 0x8c, 0xc0, 0x0d, 0xa9, 0x1b, 0xbf, 0x47, 0x6e, 0x74, - 0xc0, 0x13, 0x2d, 0x6b, 0x6b, 0x6e, 0x66, 0xc4, 0x07, 0x52, 0xc3, 0xf3, 0x8a, 0x01, 0xcd, 0xb8, - 0xf4, 0xcb, 0x60, 0x38, 0x97, 0xcd, 0x90, 0xad, 0x1d, 0x6c, 0x2e, 0x64, 0x44, 0xd5, 0x50, 0x73, - 0x21, 0x3f, 0xe2, 0x46, 0x6e, 0x33, 0xb7, 0xa4, 0x82, 0x95, 0xcd, 0x31, 0x3f, 0xc0, 0x46, 0x2e, - 0xc7, 0x07, 0x8c, 0x63, 0x2a, 0x66, 0x06, 0xc9, 0x41, 0xef, 0xbe, 0x7a, 0xd8, 0x72, 0xbf, 0x36, - 0xa9, 0xe6, 0xb5, 0xf6, 0xe5, 0x45, 0xe7, 0xc8, 0x6d, 0xdf, 0xb2, 0xfc, 0x9e, 0xb2, 0xdb, 0x77, - 0xd2, 0x1d, 0x5b, 0x5d, 0x8f, 0x25, 0xc2, 0xb6, 0x18, 0x1d, 0xd5, 0xe0, 0x73, 0x39, 0x70, 0xb2, - 0x81, 0xee, 0x46, 0x49, 0xa8, 0x76, 0x70, 0xcd, 0x8e, 0x0b, 0x93, 0xcb, 0x8f, 0xcf, 0x63, 0x23, - 0xae, 0xc6, 0x69, 0xe6, 0x71, 0x22, 0x20, 0x87, 0x98, 0xc7, 0x06, 0xf4, 0x74, 0xf3, 0x38, 0xc1, - 0xd0, 0x9c, 0xc7, 0xc9, 0x66, 0x26, 0x0d, 0x01, 0xb9, 0xa3, 0x9a, 0x6c, 0xa6, 0x9a, 0xc7, 0xd9, - 0x1c, 0xf3, 0xe3, 0x9f, 0xe4, 0x72, 0x54, 0xf3, 0xd8, 0xe4, 0x98, 0x83, 0x7e, 0xc2, 0x79, 0x9c, - 0xac, 0xc4, 0x9c, 0xc7, 0xa7, 0x6a, 0x9f, 0x9a, 0xc7, 0xd9, 0xed, 0x3b, 0xf5, 0x3c, 0x4e, 0x04, - 0x0c, 0x32, 0x3a, 0x9a, 0x35, 0x8f, 0x93, 0xf8, 0x7c, 0x1e, 0x27, 0xa1, 0x09, 0x03, 0x4c, 0x97, - 0x79, 0x9c, 0xa4, 0xfc, 0x1c, 0xf9, 0x25, 0x82, 0x9d, 0x9c, 0x64, 0x26, 0xe7, 0xc6, 0x49, 0x21, - 0x8f, 0xd0, 0xfa, 0x97, 0x80, 0x9f, 0x6c, 0x36, 0x5f, 0xcc, 0x63, 0x8a, 0xf3, 0x79, 0x57, 0x0a, - 0x31, 0xd9, 0x5c, 0xd3, 0xb4, 0x95, 0x1d, 0xeb, 0xa5, 0x4b, 0x83, 0x77, 0xd9, 0xbc, 0x69, 0x76, - 0xe1, 0xdb, 0x2d, 0x54, 0x4d, 0x17, 0xbe, 0xea, 0x1c, 0x94, 0xe4, 0x9b, 0x4b, 0xd2, 0x7d, 0x7e, - 0x7f, 0x21, 0xef, 0x3f, 0x92, 0x74, 0xf3, 0x89, 0x93, 0xd5, 0xa9, 0x5b, 0xaa, 0x4e, 0x58, 0xc9, - 0x96, 0x9e, 0x76, 0x9e, 0xaf, 0x4b, 0xed, 0x21, 0x15, 0xe3, 0x2a, 0xd1, 0x69, 0x7d, 0xae, 0xe7, - 0x96, 0x90, 0x6d, 0x34, 0xf5, 0xa6, 0xe1, 0x9a, 0x99, 0x38, 0x2f, 0x98, 0x56, 0x4f, 0xae, 0xa9, - 0x68, 0x3d, 0x3a, 0xd7, 0xbc, 0x50, 0x3e, 0x8a, 0x6b, 0x9a, 0xfa, 0x53, 0x34, 0x9d, 0x89, 0x37, - 0x5d, 0xde, 0x63, 0x3f, 0xff, 0x9c, 0x33, 0x65, 0xb8, 0x44, 0x31, 0x5c, 0xf4, 0x44, 0xfb, 0x58, - 0x5c, 0xf0, 0x49, 0x60, 0xae, 0xf0, 0xb3, 0xe8, 0xc9, 0xa7, 0x50, 0x12, 0xcb, 0x5b, 0xcc, 0x20, - 0x0b, 0x31, 0x77, 0xe8, 0x16, 0xa4, 0xc5, 0xee, 0x04, 0x2d, 0x38, 0x89, 0xa5, 0xee, 0x24, 0x92, - 0xc8, 0x37, 0x6b, 0xb1, 0xed, 0x70, 0x3b, 0xe8, 0x84, 0x11, 0x6d, 0xa6, 0xcd, 0x51, 0x66, 0x63, - 0xa4, 0xe3, 0x84, 0x89, 0xbe, 0x3b, 0x4f, 0x56, 0x71, 0x6d, 0x33, 0xc1, 0xdd, 0xec, 0x75, 0xd9, - 0x6c, 0x70, 0xe9, 0x59, 0x51, 0x8f, 0x87, 0xcc, 0x36, 0xe5, 0xd5, 0x9d, 0xdf, 0x28, 0x25, 0xa2, - 0x13, 0xf6, 0x2e, 0x4f, 0x44, 0xfc, 0x40, 0xcd, 0x6d, 0x87, 0xbd, 0x24, 0x93, 0x7c, 0xce, 0x44, - 0x3e, 0x83, 0x51, 0x49, 0xdc, 0x5b, 0x20, 0x49, 0x6a, 0x14, 0xc8, 0x12, 0x4c, 0x18, 0x6f, 0xb5, - 0xd4, 0xe9, 0x26, 0xeb, 0x05, 0x57, 0x97, 0x71, 0x9e, 0x30, 0xde, 0x64, 0x29, 0x2e, 0x59, 0x2f, - 0xb5, 0x72, 0xb9, 0x7c, 0x1f, 0xc6, 0x84, 0x48, 0xbb, 0x4a, 0x23, 0xdf, 0x58, 0x37, 0xa3, 0xf9, - 0x3d, 0x77, 0x9a, 0x6e, 0xb4, 0xe8, 0x7b, 0x8f, 0xdd, 0xfd, 0x9e, 0x82, 0x49, 0x93, 0xec, 0xce, - 0x93, 0x1f, 0x60, 0x5a, 0x62, 0x99, 0x2c, 0x9a, 0x46, 0xcf, 0xfc, 0xe0, 0x89, 0xeb, 0xed, 0xf7, - 0x60, 0x79, 0xc5, 0x64, 0x99, 0xa4, 0x93, 0xae, 0x25, 0x3f, 0x80, 0xb9, 0x5a, 0x3e, 0xf3, 0x9e, - 0x4c, 0xba, 0x6f, 0x2f, 0x35, 0xb8, 0x88, 0xce, 0x35, 0xa7, 0x6d, 0x7b, 0x57, 0xa6, 0x5f, 0xf2, - 0x30, 0x89, 0xd2, 0xd0, 0xdf, 0xf0, 0x83, 0x66, 0x6f, 0x8e, 0x15, 0xd3, 0x5d, 0x37, 0x41, 0x26, - 0x85, 0xf1, 0x25, 0x9c, 0xaf, 0xe5, 0xb2, 0xee, 0xc5, 0xa2, 0x97, 0x26, 0x79, 0x01, 0x45, 0x71, - 0xca, 0x76, 0x77, 0xe5, 0xb9, 0x8a, 0x6b, 0x1a, 0xdb, 0x87, 0xb6, 0x02, 0xfa, 0x98, 0x06, 0xe8, - 0x14, 0xde, 0xcb, 0x1d, 0xda, 0x44, 0x97, 0x3d, 0x5f, 0x85, 0xb3, 0xb5, 0x14, 0xab, 0x3c, 0x92, - 0xee, 0xad, 0x7a, 0x00, 0x53, 0xd8, 0xd3, 0x13, 0xb6, 0xab, 0x87, 0x13, 0xd1, 0xd8, 0x7d, 0x1a, - 0xed, 0xac, 0xf6, 0x90, 0x92, 0x7c, 0xb5, 0x20, 0x11, 0x77, 0xef, 0x30, 0xca, 0x9a, 0x46, 0x99, - 0xc6, 0xc8, 0xfd, 0x78, 0x3f, 0x93, 0x17, 0x29, 0x3d, 0xab, 0xcd, 0xe3, 0x70, 0x17, 0xd7, 0x42, - 0xe1, 0x18, 0xad, 0x99, 0x20, 0x39, 0x24, 0x36, 0xd5, 0x69, 0x3e, 0xd2, 0x21, 0xa9, 0xf2, 0xe3, - 0x1f, 0x9f, 0x1e, 0x02, 0x76, 0x39, 0xe5, 0x30, 0xdf, 0x95, 0x05, 0x37, 0xa1, 0xae, 0xf9, 0x8d, - 0x27, 0xba, 0x09, 0x55, 0x4b, 0x5c, 0x3f, 0x67, 0xa6, 0x95, 0x17, 0x2b, 0x3e, 0xe6, 0x96, 0xd7, - 0xfd, 0xc2, 0xf4, 0xd4, 0xf5, 0xba, 0x09, 0xd5, 0x4c, 0xb2, 0x7f, 0x57, 0xda, 0x16, 0xb1, 0x42, - 0x93, 0x73, 0xae, 0x68, 0x94, 0x59, 0x11, 0x89, 0x4c, 0xb3, 0xa2, 0xde, 0xd0, 0xfc, 0x8b, 0x00, - 0x92, 0xce, 0xb2, 0xaf, 0x0e, 0x2b, 0xb9, 0x09, 0xf8, 0xbb, 0xb8, 0x77, 0x4d, 0x09, 0xa7, 0x20, - 0x43, 0xf0, 0x2a, 0xd4, 0x70, 0xba, 0x2c, 0x16, 0xa5, 0xee, 0xab, 0x74, 0xbb, 0x40, 0x36, 0xe0, - 0xdc, 0x7d, 0x1a, 0x89, 0x35, 0xce, 0xa6, 0x61, 0x14, 0xb8, 0x8d, 0xa8, 0xeb, 0xad, 0xa2, 0x3c, - 0x9b, 0x64, 0xd0, 0xec, 0xbe, 0xc3, 0xf8, 0xd5, 0xb2, 0xf9, 0x75, 0xa5, 0xeb, 0xe2, 0x41, 0x2b, - 0xae, 0x2a, 0x4e, 0xd3, 0xc4, 0xfc, 0x29, 0x3e, 0xcc, 0x1d, 0x74, 0xf2, 0x49, 0x4b, 0x71, 0x5c, - 0x13, 0x71, 0xda, 0xba, 0x09, 0x43, 0x9c, 0x28, 0x77, 0x43, 0x1d, 0xd7, 0x69, 0xc8, 0x1d, 0x18, - 0x55, 0x1e, 0x36, 0xc4, 0x28, 0xca, 0x6d, 0xd7, 0x1d, 0x18, 0xe5, 0x47, 0xab, 0x93, 0x93, 0x7c, - 0x04, 0xa3, 0xca, 0x25, 0xe7, 0xd4, 0x3b, 0xfd, 0xa7, 0x30, 0xa1, 0x3b, 0xe7, 0x9c, 0x5e, 0x90, - 0xdf, 0xc7, 0xbb, 0x5f, 0x79, 0xc5, 0x92, 0x4f, 0x3f, 0x93, 0xc8, 0xe5, 0x25, 0x44, 0xca, 0x17, - 0x48, 0x09, 0xcc, 0x6d, 0xfe, 0xd9, 0x14, 0x35, 0xf9, 0x48, 0xbe, 0x97, 0x52, 0xc4, 0x69, 0xa4, - 0x2e, 0x32, 0x9b, 0xe4, 0x62, 0x7e, 0x11, 0x62, 0xb5, 0xc0, 0xf6, 0x6c, 0xf6, 0x49, 0xee, 0xa8, - 0x7b, 0x8b, 0x2e, 0x8f, 0xcb, 0x26, 0x6a, 0x69, 0xa9, 0x2c, 0x73, 0xf9, 0x8c, 0x2e, 0xe7, 0x27, - 0xa6, 0xc3, 0xc1, 0x78, 0x80, 0xa7, 0xc0, 0x54, 0x69, 0x6e, 0xf7, 0xba, 0x24, 0xba, 0x8b, 0x8f, - 0xbd, 0x69, 0x76, 0x5d, 0xc8, 0xba, 0x9d, 0xa2, 0xc5, 0x2b, 0xd0, 0x57, 0xc2, 0x6e, 0x55, 0xfa, - 0x38, 0x9e, 0xbc, 0xb3, 0xf9, 0x2d, 0xbb, 0x90, 0x71, 0x2b, 0xde, 0x73, 0x2c, 0xf2, 0xd8, 0xfd, - 0x0a, 0x6a, 0x87, 0x99, 0xe1, 0xbe, 0xf2, 0x99, 0x5d, 0xd7, 0x1c, 0x2b, 0x32, 0x29, 0xd5, 0xa6, - 0xf7, 0x04, 0x1f, 0xa2, 0x65, 0xe7, 0xe1, 0x7b, 0xa3, 0x07, 0x17, 0x29, 0x89, 0x37, 0x7b, 0xe2, - 0xa9, 0x3b, 0xd6, 0x0b, 0x7c, 0x87, 0xcd, 0xae, 0xaf, 0x47, 0x5e, 0xc1, 0x8c, 0x6b, 0x6f, 0xe5, - 0x40, 0x9a, 0xcd, 0xd0, 0x74, 0x20, 0xed, 0xda, 0x87, 0x3c, 0xf1, 0x7f, 0x0e, 0x95, 0xd8, 0x7b, - 0xe4, 0x74, 0x83, 0x90, 0xef, 0xb7, 0x48, 0x52, 0x92, 0x0a, 0x49, 0xb7, 0x44, 0x3b, 0x73, 0x57, - 0xf3, 0x24, 0x1c, 0x6a, 0x6e, 0x49, 0xc2, 0xef, 0x2d, 0x91, 0x91, 0x32, 0x2f, 0xb7, 0x65, 0x17, - 0x3b, 0xac, 0x78, 0x99, 0xf7, 0x4a, 0x18, 0xa5, 0x47, 0xfb, 0xf4, 0x8c, 0x94, 0x73, 0x47, 0x82, - 0x91, 0xd5, 0x65, 0x78, 0x4f, 0xe3, 0xbb, 0x96, 0x1c, 0x8a, 0xd3, 0x0e, 0xa8, 0x13, 0xbf, 0x46, - 0x4b, 0x44, 0x07, 0xd4, 0x5f, 0x00, 0xa7, 0x8b, 0x92, 0x4f, 0xa9, 0xb2, 0x30, 0x94, 0x47, 0x55, - 0x59, 0x56, 0xc1, 0xe0, 0xec, 0x28, 0xe2, 0x07, 0x6e, 0xf4, 0x7c, 0xd1, 0x5e, 0x8b, 0xcd, 0x0a, - 0x7a, 0x81, 0xe4, 0x0d, 0xb2, 0xd0, 0x5e, 0x23, 0x5f, 0xe1, 0x52, 0x22, 0xd8, 0x2f, 0xf8, 0x7e, - 0x14, 0x46, 0x81, 0xd3, 0xae, 0x35, 0x02, 0xb7, 0x1d, 0xe5, 0x76, 0x3a, 0x76, 0xf1, 0xce, 0x22, - 0xd3, 0x3c, 0x4e, 0x45, 0xf4, 0xf8, 0xac, 0xf8, 0x3a, 0xea, 0xd5, 0x4d, 0x56, 0x61, 0x97, 0x93, - 0x4b, 0x4d, 0xc6, 0x8b, 0x7f, 0x95, 0x4c, 0xeb, 0x30, 0x9b, 0x13, 0x95, 0x48, 0xdd, 0xde, 0x76, - 0x8f, 0x5a, 0x34, 0xd7, 0xbd, 0x62, 0xf2, 0x03, 0x98, 0xc9, 0x0c, 0x5b, 0xa4, 0x2c, 0xd0, 0xdd, - 0x82, 0x1a, 0xf5, 0x62, 0xfe, 0x04, 0xca, 0xfc, 0xbd, 0x07, 0xba, 0x35, 0x1b, 0x11, 0x6c, 0xe2, - 0x57, 0x40, 0x39, 0x08, 0xc9, 0xf5, 0x3a, 0x1f, 0x4f, 0x3d, 0x69, 0x9f, 0xc6, 0xd0, 0x25, 0x89, - 0x84, 0xe7, 0xea, 0xc3, 0xcb, 0x2a, 0xec, 0xf6, 0xd4, 0x68, 0x0b, 0x66, 0x76, 0x69, 0xe0, 0x3e, - 0x7e, 0x9e, 0x64, 0x28, 0x25, 0x93, 0x59, 0xda, 0x8d, 0xe3, 0x17, 0x30, 0xbb, 0xe8, 0x1f, 0xb6, - 0xc5, 0xa3, 0x3e, 0x83, 0xa7, 0xba, 0x8a, 0xcf, 0x2e, 0xef, 0xed, 0x08, 0x35, 0x97, 0x9f, 0x9a, - 0x5e, 0xf9, 0xbf, 0xf5, 0xcc, 0x5e, 0xaf, 0x9e, 0xa6, 0x99, 0xf4, 0xdb, 0x38, 0x09, 0xb3, 0x72, - 0xd5, 0xeb, 0x93, 0xb0, 0x4b, 0x2e, 0xfb, 0x9c, 0x27, 0x62, 0xb3, 0x39, 0xe9, 0xe9, 0xbb, 0x70, - 0x3d, 0x41, 0x6b, 0x37, 0xe4, 0xde, 0x62, 0x26, 0xf2, 0x4e, 0xf8, 0x54, 0x67, 0x66, 0xf9, 0xce, - 0x6c, 0xa7, 0x16, 0xbb, 0xa1, 0xd5, 0xea, 0xa2, 0x62, 0x11, 0x3d, 0x78, 0x03, 0xc3, 0x44, 0x23, - 0xfe, 0x84, 0x4e, 0xdb, 0x6d, 0xb5, 0x4e, 0x11, 0xa3, 0x52, 0xfb, 0x21, 0x8c, 0xd7, 0xf4, 0xca, - 0x33, 0x2a, 0xc9, 0x9d, 0x14, 0xea, 0x91, 0x50, 0xef, 0xb6, 0x77, 0x71, 0x24, 0x55, 0x1b, 0xcf, - 0x89, 0x7a, 0x91, 0xeb, 0x3a, 0x63, 0x64, 0x65, 0x53, 0xbb, 0x40, 0x56, 0xd2, 0x44, 0xe5, 0x3a, - 0x93, 0x9d, 0xc8, 0xad, 0xce, 0xf3, 0xc8, 0x24, 0x73, 0x62, 0x12, 0xab, 0x77, 0xf2, 0x59, 0xe5, - 0x32, 0xdf, 0x35, 0xa9, 0x26, 0xf7, 0xf3, 0x89, 0xf3, 0xd0, 0xe9, 0x7e, 0x3e, 0xa9, 0xec, 0x76, - 0xba, 0x9f, 0x4f, 0x46, 0xea, 0xba, 0x65, 0xe4, 0x15, 0x27, 0xe0, 0xe9, 0x62, 0x8c, 0x50, 0x6c, - 0x32, 0xf2, 0xfc, 0x3c, 0xd4, 0x43, 0x80, 0xf0, 0xb4, 0x3d, 0x5d, 0x6c, 0xad, 0xc9, 0xd0, 0x1f, - 0x89, 0x3c, 0x3f, 0xf7, 0xa0, 0xc4, 0x33, 0x18, 0xc4, 0x51, 0x13, 0x63, 0xbf, 0xc1, 0x74, 0x62, - 0x85, 0x2e, 0x83, 0x5a, 0x4a, 0xc6, 0x9b, 0x53, 0x26, 0xb3, 0x9c, 0x40, 0x74, 0x5d, 0xa6, 0x2a, - 0xc4, 0x51, 0xe5, 0x94, 0x61, 0x2a, 0x15, 0x68, 0x6e, 0xee, 0x7c, 0x46, 0x89, 0x52, 0x29, 0xc7, - 0xf5, 0x18, 0x74, 0xaa, 0x4b, 0x19, 0x81, 0xe9, 0xe6, 0x2e, 0x64, 0x96, 0x09, 0x46, 0x11, 0xcf, - 0xbf, 0x9c, 0x9d, 0x35, 0x3a, 0x7e, 0xe7, 0xd5, 0x05, 0x47, 0x56, 0x73, 0xe3, 0x24, 0xa8, 0xa2, - 0x56, 0xaa, 0xd2, 0x0f, 0x65, 0xa4, 0xaa, 0x7e, 0x33, 0xe3, 0x3d, 0x86, 0x81, 0x11, 0x7b, 0x83, - 0x75, 0xcf, 0x9b, 0x4d, 0x1e, 0xc9, 0x74, 0x30, 0x39, 0x35, 0xf5, 0x62, 0x90, 0x3b, 0x82, 0x8f, - 0x64, 0x02, 0x98, 0x57, 0xcd, 0x78, 0x0f, 0x2e, 0x26, 0x9e, 0x7b, 0x98, 0x8c, 0x6f, 0x64, 0xbf, - 0x09, 0xc9, 0x14, 0x4f, 0xbe, 0xce, 0x7e, 0x25, 0xfd, 0x36, 0x24, 0x31, 0xee, 0xa7, 0x5d, 0xf3, - 0xd6, 0x61, 0x12, 0x97, 0x19, 0x99, 0x74, 0x3d, 0x8e, 0x40, 0x63, 0x82, 0x93, 0xa1, 0x90, 0x92, - 0xa5, 0xca, 0x65, 0x76, 0x5c, 0xbc, 0x19, 0xe6, 0x29, 0xdc, 0xe7, 0xcc, 0x87, 0xc4, 0x08, 0xcc, - 0xda, 0xc5, 0x44, 0x66, 0x78, 0xf2, 0x7d, 0x38, 0x13, 0x3f, 0x25, 0xe6, 0x2c, 0x32, 0xd0, 0xba, - 0x18, 0xca, 0xce, 0xc4, 0xef, 0x89, 0x4f, 0x4f, 0xbe, 0x22, 0xb7, 0xa2, 0x98, 0xfc, 0x52, 0xea, - 0x99, 0x8c, 0xd1, 0x87, 0x93, 0xec, 0x48, 0x9a, 0x6c, 0x4f, 0x3b, 0x3a, 0x0d, 0xfc, 0xdc, 0xb2, - 0x83, 0x2b, 0xea, 0x9f, 0x5b, 0xd7, 0x00, 0x90, 0x4a, 0xfd, 0xcd, 0xe1, 0xb3, 0x0e, 0xd7, 0x30, - 0x20, 0xcb, 0x16, 0x0f, 0xc1, 0x97, 0x8d, 0x95, 0xdf, 0xf6, 0x64, 0x18, 0x97, 0x16, 0x5c, 0xed, - 0x19, 0x5d, 0x92, 0xdc, 0x32, 0x5c, 0x5c, 0x7a, 0xc7, 0xa1, 0xec, 0xf6, 0x34, 0x2d, 0x2b, 0x48, - 0xa3, 0xda, 0x67, 0xbb, 0xc4, 0x8b, 0x54, 0xfb, 0x6c, 0xd7, 0x28, 0x8f, 0x5f, 0x60, 0x8e, 0x25, - 0xb1, 0x47, 0x61, 0x90, 0x25, 0xea, 0xf1, 0xb0, 0xd3, 0x5d, 0xaf, 0x7d, 0xae, 0x9a, 0x97, 0xa2, - 0x29, 0xc2, 0xdd, 0x3b, 0x64, 0x57, 0xbf, 0xb2, 0xad, 0x76, 0x22, 0x5f, 0x9d, 0xcb, 0x4e, 0x71, - 0x65, 0x9b, 0xa4, 0xdb, 0xbd, 0x23, 0x2c, 0x8c, 0x71, 0x81, 0x0c, 0x7a, 0x99, 0xc7, 0x71, 0x2e, - 0xbe, 0xc1, 0x33, 0x29, 0xf0, 0xdc, 0x75, 0x59, 0x70, 0xcf, 0x13, 0x40, 0xef, 0x8e, 0x76, 0x71, - 0xff, 0xbe, 0xcc, 0x3f, 0x92, 0x53, 0x4b, 0x37, 0x07, 0xbe, 0xb0, 0xf4, 0xb3, 0xff, 0x74, 0xb9, - 0xf0, 0xb3, 0x9f, 0x5f, 0x2e, 0xfc, 0xbb, 0x9f, 0x5f, 0x2e, 0xfc, 0xc7, 0x9f, 0x5f, 0x2e, 0x7c, - 0x35, 0x7f, 0xb2, 0x00, 0xcd, 0x8d, 0x96, 0x4b, 0xbd, 0xe8, 0x16, 0x67, 0x37, 0x84, 0xff, 0xdd, - 0xfd, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x76, 0x70, 0x29, 0x1d, 0x2a, 0xe9, 0x00, 0x00, + 0xc0, 0x32, 0x64, 0xe8, 0x43, 0x36, 0x60, 0x01, 0x86, 0x01, 0x1b, 0xfa, 0x11, 0xf4, 0x63, 0x7f, + 0xf8, 0xcb, 0x6b, 0x01, 0x82, 0x6d, 0x48, 0xfa, 0xf1, 0x47, 0xcb, 0x5e, 0xc0, 0x3f, 0x0d, 0xfb, + 0x43, 0x30, 0x6c, 0xc0, 0x0b, 0x08, 0x30, 0xe2, 0xc4, 0x23, 0x23, 0xf2, 0x51, 0xd5, 0x4d, 0x72, + 0x56, 0xfe, 0x21, 0xbb, 0x4e, 0x9c, 0x73, 0x22, 0xe2, 0x44, 0x64, 0xc4, 0x89, 0x13, 0x27, 0xce, + 0x81, 0x9b, 0x11, 0x6d, 0xd1, 0xb6, 0x1f, 0x44, 0xb7, 0x5a, 0x74, 0xdf, 0x69, 0x3c, 0xbf, 0xd5, + 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0xb5, 0x03, 0x3f, 0xf2, 0x6f, 0x39, 0x9d, 0xe8, 0x20, 0xa4, 0xc1, + 0x53, 0xb7, 0x41, 0x6f, 0x22, 0x84, 0x0c, 0xe2, 0x7f, 0x73, 0xd3, 0xfb, 0xfe, 0xbe, 0xcf, 0x71, + 0xd8, 0x5f, 0xbc, 0x70, 0xee, 0xc2, 0xbe, 0xef, 0xef, 0xb7, 0x28, 0x27, 0xde, 0xeb, 0x3c, 0xbe, + 0x45, 0x0f, 0xdb, 0xd1, 0x73, 0x51, 0x58, 0x49, 0x16, 0x46, 0xee, 0x21, 0x0d, 0x23, 0xe7, 0xb0, + 0x2d, 0x10, 0xde, 0x52, 0x4d, 0x71, 0xa2, 0x88, 0x95, 0x44, 0xae, 0xef, 0xdd, 0x7a, 0x7a, 0x47, + 0xff, 0x29, 0x50, 0xaf, 0x77, 0x6d, 0x75, 0x83, 0x06, 0x51, 0x78, 0x22, 0x4c, 0xfa, 0x94, 0x7a, + 0x51, 0xaa, 0x7a, 0x81, 0x19, 0x3d, 0x6f, 0xd3, 0x90, 0xa3, 0xc8, 0xff, 0x04, 0xea, 0xd5, 0x6c, + 0x54, 0xfc, 0x57, 0xa0, 0x7c, 0x37, 0x1b, 0xe5, 0x19, 0xdd, 0x63, 0x32, 0xf5, 0xd4, 0x1f, 0x3d, + 0xd0, 0x03, 0xa7, 0xdd, 0xa6, 0x41, 0xfc, 0x87, 0x40, 0x3f, 0xaf, 0xd0, 0x0f, 0x1f, 0x3b, 0x4c, + 0x44, 0x87, 0x8f, 0x9d, 0x54, 0x37, 0x3a, 0xa1, 0xb3, 0x4f, 0x45, 0xf3, 0x9f, 0xde, 0xd1, 0x7f, + 0x72, 0x54, 0xeb, 0x0f, 0x0b, 0x30, 0xf8, 0xc8, 0x89, 0x1a, 0x07, 0xe4, 0x53, 0x18, 0x7c, 0xe8, + 0x7a, 0xcd, 0xb0, 0x5c, 0xb8, 0xd2, 0x7f, 0x7d, 0x6c, 0xbe, 0x74, 0x93, 0x77, 0x05, 0x0b, 0x59, + 0xc1, 0xc2, 0xec, 0xcf, 0x8e, 0x2a, 0x7d, 0xc7, 0x47, 0x95, 0x33, 0x4f, 0x18, 0xda, 0xdb, 0xfe, + 0xa1, 0x1b, 0xe1, 0xd8, 0xda, 0x9c, 0x8e, 0xec, 0xc0, 0x54, 0xb5, 0xd5, 0xf2, 0x9f, 0x6d, 0x39, + 0x41, 0xe4, 0x3a, 0xad, 0x5a, 0xa7, 0xd1, 0xa0, 0x61, 0x58, 0x2e, 0x5e, 0x29, 0x5c, 0x1f, 0x59, + 0xb8, 0x76, 0x7c, 0x54, 0xa9, 0x38, 0xac, 0xb8, 0xde, 0xe6, 0xe5, 0xf5, 0x90, 0x23, 0x68, 0x8c, + 0xb2, 0xe8, 0xad, 0x3f, 0x1b, 0x82, 0xd2, 0x8a, 0x1f, 0x46, 0x8b, 0x6c, 0x44, 0x6d, 0xfa, 0xe3, + 0x0e, 0x0d, 0x23, 0x72, 0x0d, 0x86, 0x18, 0x6c, 0x75, 0xa9, 0x5c, 0xb8, 0x52, 0xb8, 0x3e, 0xba, + 0x30, 0x76, 0x7c, 0x54, 0x19, 0x3e, 0xf0, 0xc3, 0xa8, 0xee, 0x36, 0x6d, 0x51, 0x44, 0xde, 0x82, + 0x91, 0x0d, 0xbf, 0x49, 0x37, 0x9c, 0x43, 0x8a, 0xad, 0x18, 0x5d, 0x98, 0x38, 0x3e, 0xaa, 0x8c, + 0x7a, 0x7e, 0x93, 0xd6, 0x3d, 0xe7, 0x90, 0xda, 0xaa, 0x98, 0xec, 0xc2, 0x80, 0xed, 0xb7, 0x68, + 0xb9, 0x1f, 0xd1, 0x16, 0x8e, 0x8f, 0x2a, 0x03, 0x81, 0xdf, 0xa2, 0xbf, 0x38, 0xaa, 0xbc, 0xb7, + 0xef, 0x46, 0x07, 0x9d, 0xbd, 0x9b, 0x0d, 0xff, 0xf0, 0xd6, 0x7e, 0xe0, 0x3c, 0x75, 0xf9, 0x24, + 0x74, 0x5a, 0xb7, 0xe2, 0xa9, 0xda, 0x76, 0xc5, 0xb8, 0xd7, 0x9e, 0x87, 0x11, 0x3d, 0x64, 0x9c, + 0x6c, 0xe4, 0x47, 0x1e, 0xc1, 0x74, 0xb5, 0xd9, 0x74, 0x39, 0xc5, 0x56, 0xe0, 0x7a, 0x0d, 0xb7, + 0xed, 0xb4, 0xc2, 0xf2, 0xc0, 0x95, 0xfe, 0xeb, 0xa3, 0x42, 0x28, 0xaa, 0xbc, 0xde, 0x56, 0x08, + 0x9a, 0x50, 0x32, 0x19, 0x90, 0xbb, 0x30, 0xb2, 0xb4, 0x51, 0x63, 0x6d, 0x0f, 0xcb, 0x83, 0xc8, + 0x6c, 0xf6, 0xf8, 0xa8, 0x32, 0xd5, 0xf4, 0x42, 0xec, 0x9a, 0xce, 0x40, 0x21, 0x92, 0xf7, 0x60, + 0x7c, 0xab, 0xb3, 0xd7, 0x72, 0x1b, 0xdb, 0x6b, 0xb5, 0x87, 0xf4, 0x79, 0x79, 0xe8, 0x4a, 0xe1, + 0xfa, 0xf8, 0x02, 0x39, 0x3e, 0xaa, 0x4c, 0xb6, 0x11, 0x5e, 0x8f, 0x5a, 0x61, 0xfd, 0x09, 0x7d, + 0x6e, 0x1b, 0x78, 0x31, 0x5d, 0xad, 0xb6, 0xc2, 0xe8, 0x86, 0x53, 0x74, 0x61, 0x78, 0xa0, 0xd3, + 0x71, 0x3c, 0x72, 0x0b, 0xc0, 0xa6, 0x87, 0x7e, 0x44, 0xab, 0xcd, 0x66, 0x50, 0x1e, 0x41, 0xd9, + 0x9e, 0x39, 0x3e, 0xaa, 0x8c, 0x05, 0x08, 0xad, 0x3b, 0xcd, 0x66, 0x60, 0x6b, 0x28, 0x64, 0x11, + 0x46, 0x6c, 0x9f, 0x0b, 0xb8, 0x3c, 0x7a, 0xa5, 0x70, 0x7d, 0x6c, 0xfe, 0x8c, 0x98, 0x86, 0x12, + 0xbc, 0x70, 0xee, 0xf8, 0xa8, 0x42, 0x02, 0xf1, 0x4b, 0xef, 0xa5, 0xc4, 0x20, 0x15, 0x18, 0xde, + 0xf0, 0x17, 0x9d, 0xc6, 0x01, 0x2d, 0x03, 0xce, 0xbd, 0xc1, 0xe3, 0xa3, 0x4a, 0xe1, 0xbb, 0xb6, + 0x84, 0x92, 0xa7, 0x30, 0x16, 0x0f, 0x54, 0x58, 0x1e, 0x43, 0xf1, 0x6d, 0x1f, 0x1f, 0x55, 0xce, + 0x85, 0x08, 0xae, 0xb3, 0xa1, 0xd7, 0x24, 0xf8, 0x12, 0xb3, 0x40, 0xaf, 0x88, 0x7c, 0x0d, 0x33, + 0xf1, 0xcf, 0x6a, 0x18, 0xd2, 0x80, 0xf1, 0x58, 0x5d, 0x2a, 0x4f, 0xa0, 0x64, 0xde, 0x38, 0x3e, + 0xaa, 0x58, 0x5a, 0x0b, 0xea, 0x8e, 0x44, 0xa9, 0xbb, 0x4d, 0xad, 0xa7, 0xd9, 0x4c, 0x1e, 0x0c, + 0x8c, 0x8c, 0x97, 0x26, 0xec, 0x4b, 0x3b, 0x5e, 0x18, 0x39, 0x7b, 0x2d, 0x9a, 0x89, 0x64, 0xfd, + 0x6d, 0x01, 0xc8, 0x66, 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0xfb, 0x9e, 0xe4, 0xe7, 0xf4, 0x36, 0x8c, + 0xf2, 0x81, 0x63, 0xa3, 0x5b, 0xc4, 0xd1, 0x9d, 0x3c, 0x3e, 0xaa, 0x80, 0x18, 0x5d, 0x36, 0xb2, + 0x31, 0x02, 0x79, 0x1d, 0xfa, 0xb7, 0xb7, 0xd7, 0xf0, 0x5b, 0xe9, 0x5f, 0x98, 0x3a, 0x3e, 0xaa, + 0xf4, 0x47, 0x51, 0xeb, 0x17, 0x47, 0x95, 0x91, 0xa5, 0x4e, 0x80, 0x62, 0xb1, 0x59, 0x39, 0x79, + 0x1d, 0x86, 0x17, 0x5b, 0x9d, 0x30, 0xa2, 0x41, 0x79, 0x20, 0xfe, 0x48, 0x1b, 0x1c, 0x64, 0xcb, + 0x32, 0xf2, 0x1d, 0x18, 0xd8, 0x09, 0x69, 0x50, 0x1e, 0xc4, 0xf1, 0x9e, 0x10, 0xe3, 0xcd, 0x40, + 0xbb, 0xf3, 0x0b, 0x23, 0xec, 0x4b, 0xec, 0x84, 0x34, 0xb0, 0x11, 0x89, 0xdc, 0x84, 0x41, 0x3e, + 0x68, 0x43, 0xb8, 0x48, 0x4d, 0xa8, 0xd9, 0xd1, 0xa2, 0xbb, 0xef, 0x2d, 0x8c, 0x1e, 0x1f, 0x55, + 0x06, 0x71, 0xf0, 0x6c, 0x8e, 0xf6, 0x60, 0x60, 0xa4, 0x50, 0x2a, 0xda, 0x23, 0x8c, 0x96, 0x7d, + 0x16, 0xd6, 0x77, 0x60, 0x4c, 0xeb, 0x3e, 0xb9, 0x08, 0x03, 0xec, 0x7f, 0x5c, 0x44, 0xc6, 0x79, + 0x65, 0x6c, 0xe3, 0xb0, 0x11, 0x6a, 0xfd, 0xc3, 0x29, 0x28, 0x31, 0x4a, 0x63, 0xe5, 0xb9, 0xa9, + 0x8b, 0x8a, 0xd3, 0x95, 0x4c, 0x51, 0x95, 0x0b, 0xba, 0xb0, 0xae, 0x83, 0xaa, 0x5d, 0x2c, 0x42, + 0xe3, 0xc7, 0x47, 0x95, 0x91, 0x8e, 0x80, 0xc5, 0x6d, 0x23, 0x35, 0x18, 0x5e, 0xfe, 0xa6, 0xed, + 0x06, 0x34, 0x44, 0xd1, 0x8e, 0xcd, 0xcf, 0xdd, 0xe4, 0xdb, 0xe5, 0x4d, 0xb9, 0x5d, 0xde, 0xdc, + 0x96, 0xdb, 0xe5, 0xc2, 0x25, 0xb1, 0x18, 0x9f, 0xa5, 0x9c, 0x24, 0x9e, 0x1f, 0xbf, 0xf3, 0xd7, + 0x95, 0x82, 0x2d, 0x39, 0x91, 0xb7, 0x61, 0xe8, 0x9e, 0x1f, 0x1c, 0x3a, 0x91, 0x18, 0x83, 0xe9, + 0xe3, 0xa3, 0x4a, 0xe9, 0x31, 0x42, 0xb4, 0x29, 0x25, 0x70, 0xc8, 0x3d, 0x98, 0xb4, 0xfd, 0x4e, + 0x44, 0xb7, 0x7d, 0x39, 0x72, 0x83, 0x48, 0x75, 0xf9, 0xf8, 0xa8, 0x32, 0x17, 0xb0, 0x92, 0x7a, + 0xe4, 0xd7, 0xc5, 0x10, 0x6a, 0xf4, 0x09, 0x2a, 0xb2, 0x0c, 0x93, 0x55, 0x5c, 0xbd, 0x85, 0xd4, + 0xf8, 0x78, 0x8d, 0x2e, 0x5c, 0x3a, 0x3e, 0xaa, 0x9c, 0x77, 0xb0, 0xa4, 0x1e, 0x88, 0x22, 0x9d, + 0x8d, 0x49, 0x44, 0x36, 0xe0, 0xec, 0xc3, 0xce, 0x1e, 0x0d, 0x3c, 0x1a, 0xd1, 0x50, 0xb6, 0x68, + 0x18, 0x5b, 0x74, 0xe5, 0xf8, 0xa8, 0x72, 0xf1, 0x89, 0x2a, 0xcc, 0x68, 0x53, 0x9a, 0x94, 0x50, + 0x38, 0x23, 0x1a, 0xba, 0xe4, 0x44, 0xce, 0x9e, 0x13, 0x52, 0x5c, 0x94, 0xc6, 0xe6, 0xcf, 0x71, + 0x11, 0xdf, 0x4c, 0x94, 0x2e, 0x5c, 0x13, 0x52, 0xbe, 0xa0, 0xfa, 0xde, 0x14, 0x45, 0x5a, 0x45, + 0x49, 0x9e, 0x6c, 0x6d, 0x56, 0xfb, 0xce, 0x28, 0xb6, 0x16, 0xd7, 0x66, 0xb5, 0xef, 0xe8, 0xab, + 0x96, 0xda, 0x81, 0xd6, 0x60, 0x70, 0x87, 0xed, 0xce, 0xb8, 0x66, 0x4d, 0xce, 0x5f, 0x15, 0x2d, + 0x4a, 0xce, 0xbf, 0x9b, 0xec, 0x07, 0x22, 0xe2, 0x97, 0x77, 0x06, 0x77, 0x74, 0x7d, 0x2f, 0xc6, + 0x32, 0xf2, 0x39, 0x80, 0x68, 0x55, 0xb5, 0xdd, 0x2e, 0x8f, 0x61, 0x27, 0xcf, 0x9a, 0x9d, 0xac, + 0xb6, 0xdb, 0x0b, 0x97, 0x45, 0xff, 0xce, 0xa9, 0xfe, 0x39, 0xed, 0xb6, 0xc6, 0x4d, 0x63, 0x42, + 0x3e, 0x85, 0x71, 0x5c, 0xd2, 0xe4, 0x88, 0x8e, 0xe3, 0x88, 0x5e, 0x38, 0x3e, 0xaa, 0xcc, 0xe2, + 0x6a, 0x95, 0x31, 0x9e, 0x06, 0x01, 0xf9, 0x0d, 0x98, 0x11, 0xec, 0x1e, 0xb9, 0x5e, 0xd3, 0x7f, + 0x16, 0x2e, 0xd1, 0xf0, 0x49, 0xe4, 0xb7, 0x71, 0xf9, 0x1b, 0x9b, 0xbf, 0x68, 0x36, 0xcf, 0xc4, + 0x59, 0xb8, 0x21, 0x5a, 0x6a, 0xa9, 0x96, 0x3e, 0xe3, 0x08, 0xf5, 0x26, 0xc7, 0xd0, 0x17, 0xc8, + 0x4c, 0x16, 0x64, 0x15, 0xce, 0xec, 0x84, 0xd4, 0xe8, 0xc3, 0x24, 0xee, 0x0f, 0x15, 0x36, 0xc2, + 0x9d, 0x90, 0xd6, 0xf3, 0xfa, 0x91, 0xa4, 0x23, 0x36, 0x90, 0xa5, 0xc0, 0x6f, 0x27, 0xe6, 0xf8, + 0x19, 0x94, 0x88, 0x75, 0x7c, 0x54, 0xb9, 0xdc, 0x0c, 0xfc, 0x76, 0x3d, 0x7f, 0xa2, 0x67, 0x50, + 0x93, 0x1f, 0xc2, 0xb9, 0x45, 0xdf, 0xf3, 0x68, 0x83, 0xad, 0xa0, 0x4b, 0xae, 0xb3, 0xef, 0xf9, + 0x61, 0xe4, 0x36, 0x56, 0x97, 0xca, 0xa5, 0x78, 0x7b, 0x68, 0x28, 0x8c, 0x7a, 0x53, 0xa1, 0x98, + 0xdb, 0x43, 0x0e, 0x17, 0xf2, 0x03, 0x98, 0x10, 0x75, 0xd1, 0x00, 0xa7, 0xe6, 0xd9, 0xee, 0x13, + 0x4d, 0x21, 0xf3, 0x8d, 0x3e, 0x90, 0x3f, 0xb9, 0xea, 0x64, 0xf2, 0x22, 0x5f, 0xc3, 0xd8, 0xfa, + 0xbd, 0xaa, 0x4d, 0xc3, 0xb6, 0xef, 0x85, 0xb4, 0x4c, 0x70, 0x44, 0x2f, 0x0b, 0xd6, 0xeb, 0xf7, + 0xaa, 0xd5, 0x4e, 0x74, 0x40, 0xbd, 0xc8, 0x6d, 0x38, 0x11, 0x95, 0x58, 0x0b, 0x73, 0x6c, 0xe6, + 0x1d, 0x3e, 0x76, 0xea, 0x81, 0x80, 0x68, 0xbd, 0xd0, 0xd9, 0x91, 0x39, 0x18, 0xa9, 0xd5, 0x56, + 0xd6, 0xfc, 0x7d, 0xd7, 0x2b, 0x4f, 0x31, 0x61, 0xd8, 0xea, 0x37, 0x79, 0x0c, 0x33, 0xda, 0xd9, + 0xa0, 0xce, 0xfe, 0xa7, 0x87, 0xd4, 0x8b, 0xca, 0xd3, 0xd8, 0x86, 0xef, 0xaa, 0xc3, 0xcd, 0x4d, + 0xfd, 0x08, 0xf1, 0xf4, 0xce, 0xcd, 0x6a, 0xfc, 0xb3, 0x26, 0x89, 0x16, 0x8a, 0xe5, 0x82, 0x3d, + 0xed, 0x64, 0x94, 0x90, 0x6d, 0x18, 0xde, 0xea, 0x04, 0x6d, 0x3f, 0xa4, 0xe5, 0x19, 0x14, 0xdc, + 0xb5, 0x6e, 0x5f, 0xa8, 0x40, 0x5d, 0x98, 0x61, 0x4b, 0x74, 0x9b, 0xff, 0xd0, 0x7a, 0x27, 0x59, + 0x91, 0xcf, 0x60, 0xbc, 0x56, 0x5b, 0x89, 0x37, 0x94, 0x73, 0xb8, 0xa1, 0x5c, 0x3c, 0x3e, 0xaa, + 0x94, 0x99, 0x4a, 0x15, 0x6f, 0x2a, 0xfa, 0x57, 0xa5, 0x53, 0x30, 0x0e, 0xdb, 0x6b, 0xb5, 0x98, + 0xc3, 0x6c, 0xcc, 0x81, 0x29, 0x73, 0xd9, 0x1c, 0x74, 0x0a, 0xf2, 0xcf, 0x0a, 0x70, 0x45, 0x67, + 0x99, 0x25, 0x98, 0xf2, 0xf9, 0x17, 0x91, 0xe6, 0xfc, 0xf1, 0x51, 0xe5, 0xa6, 0xd9, 0x8f, 0x7a, + 0xe6, 0x60, 0x69, 0x6d, 0xeb, 0xd9, 0x14, 0x6c, 0xaf, 0xde, 0x81, 0xcc, 0xf6, 0xce, 0xbd, 0x70, + 0x7b, 0x4d, 0xa9, 0xf5, 0x6e, 0x6f, 0xaf, 0xa6, 0x58, 0x5f, 0xc0, 0xa8, 0x5a, 0xb4, 0xc9, 0x30, + 0xf4, 0x57, 0x5b, 0xad, 0x52, 0x1f, 0xfb, 0xa3, 0x56, 0x5b, 0x29, 0x15, 0xc8, 0x24, 0x40, 0xbc, + 0x53, 0x95, 0x8a, 0x64, 0x1c, 0x46, 0xe4, 0x4e, 0x52, 0xea, 0x47, 0xfc, 0x76, 0xbb, 0x34, 0x40, + 0x08, 0x4c, 0x9a, 0xeb, 0x59, 0x69, 0xd0, 0xfa, 0xdd, 0x02, 0x8c, 0xaa, 0xef, 0x90, 0x9c, 0x81, + 0xb1, 0x9d, 0x8d, 0xda, 0xd6, 0xf2, 0xe2, 0xea, 0xbd, 0xd5, 0xe5, 0xa5, 0x52, 0x1f, 0xb9, 0x04, + 0xe7, 0xb7, 0x6b, 0x2b, 0xf5, 0xa5, 0x85, 0xfa, 0xda, 0xe6, 0x62, 0x75, 0xad, 0xbe, 0x65, 0x6f, + 0x7e, 0xf1, 0x65, 0x7d, 0x7b, 0x67, 0x63, 0x63, 0x79, 0xad, 0x54, 0x20, 0x65, 0x98, 0x66, 0xc5, + 0x0f, 0x77, 0x16, 0x96, 0x75, 0x84, 0x52, 0x91, 0x5c, 0x85, 0x4b, 0x59, 0x25, 0xf5, 0x95, 0xe5, + 0xea, 0xd2, 0xda, 0x72, 0xad, 0x56, 0xea, 0x27, 0xb3, 0x30, 0xc5, 0x50, 0xaa, 0x5b, 0x5b, 0x06, + 0xed, 0x80, 0xd5, 0x82, 0x31, 0xed, 0x03, 0x20, 0x17, 0xa1, 0xbc, 0xb8, 0x6c, 0x6f, 0xd7, 0xb7, + 0x76, 0xec, 0xad, 0xcd, 0xda, 0x72, 0xdd, 0x6c, 0x61, 0xb2, 0x74, 0x6d, 0xf3, 0xfe, 0xea, 0x46, + 0x9d, 0x81, 0x6a, 0xa5, 0x02, 0x6b, 0x86, 0x51, 0x5a, 0x5b, 0xdd, 0xb8, 0xbf, 0xb6, 0x5c, 0xdf, + 0xa9, 0x2d, 0x0b, 0x94, 0xa2, 0xf5, 0xd3, 0x62, 0x6a, 0x4b, 0x27, 0xf3, 0x30, 0x56, 0xe3, 0xf6, + 0x0a, 0x5c, 0xe6, 0xf8, 0x01, 0x91, 0xe9, 0x68, 0xe3, 0xc2, 0x8c, 0xc1, 0x57, 0x30, 0x1d, 0x89, + 0x69, 0x69, 0x5b, 0xec, 0x6b, 0x6e, 0xf8, 0x2d, 0x5d, 0x4b, 0x6b, 0x0b, 0x98, 0xad, 0x4a, 0xc9, + 0xbc, 0xa6, 0xcf, 0xf1, 0xd3, 0x22, 0x9e, 0x48, 0xa4, 0x3e, 0xa7, 0xef, 0xed, 0x4a, 0xb3, 0x9b, + 0x8f, 0x87, 0x54, 0xa8, 0x61, 0x48, 0x93, 0xa1, 0x4b, 0x28, 0x3c, 0xf2, 0x96, 0xd4, 0x74, 0xf9, + 0xe9, 0x0e, 0x37, 0xfb, 0xc4, 0xb9, 0x44, 0x28, 0xb9, 0x56, 0x27, 0x67, 0x63, 0x25, 0x1f, 0x25, + 0xe7, 0x8c, 0x10, 0x06, 0x32, 0x4b, 0xec, 0x9f, 0x76, 0x02, 0x95, 0x54, 0x60, 0x90, 0xaf, 0xb8, + 0x5c, 0x1e, 0xa8, 0x5b, 0xb7, 0x18, 0xc0, 0xe6, 0x70, 0xeb, 0x4f, 0xfa, 0x75, 0x25, 0x83, 0xe9, + 0xd2, 0x9a, 0xbc, 0x51, 0x97, 0x46, 0x39, 0x23, 0x94, 0xa9, 0xcd, 0x35, 0x1a, 0x86, 0xfc, 0xbc, + 0x53, 0x54, 0x43, 0x02, 0x21, 0x07, 0xd6, 0xdd, 0x26, 0x53, 0x9b, 0x15, 0x0a, 0x3b, 0x3a, 0xf2, + 0xaf, 0x0a, 0x8f, 0x8e, 0xfd, 0xf1, 0xd1, 0x51, 0x7c, 0x9a, 0xfc, 0xe8, 0x18, 0xa3, 0xb0, 0x51, + 0x17, 0x6a, 0x1e, 0xb6, 0x62, 0x20, 0x1e, 0x75, 0xa1, 0x1a, 0x8a, 0x51, 0xd7, 0x90, 0xc8, 0x87, + 0x00, 0xd5, 0x47, 0x35, 0x3c, 0x23, 0xd9, 0x1b, 0x42, 0xd5, 0xc5, 0x4d, 0xc9, 0x79, 0x16, 0x8a, + 0x23, 0x58, 0xa0, 0x9f, 0x31, 0x35, 0x6c, 0xb2, 0x00, 0x13, 0xd5, 0x9f, 0x74, 0x02, 0xba, 0xda, + 0x64, 0xfb, 0x5a, 0xc4, 0x0f, 0xd3, 0xa3, 0x7c, 0xe1, 0x75, 0x58, 0x41, 0xdd, 0x15, 0x25, 0x1a, + 0x03, 0x93, 0x84, 0x6c, 0xc2, 0xd9, 0xfb, 0x8b, 0x5b, 0x62, 0x1e, 0x56, 0x1b, 0x0d, 0xbf, 0xe3, + 0x45, 0x42, 0xbf, 0xbd, 0x7a, 0x7c, 0x54, 0xb9, 0xb4, 0xdf, 0x68, 0xd7, 0xe5, 0x9c, 0x75, 0x78, + 0xb1, 0xae, 0xe0, 0xa6, 0x68, 0xc9, 0x35, 0xe8, 0xdf, 0xb1, 0x57, 0xc5, 0x49, 0xfb, 0xec, 0xf1, + 0x51, 0x65, 0xa2, 0x13, 0xb8, 0x1a, 0x09, 0x2b, 0xb5, 0x5a, 0x30, 0x79, 0x9f, 0x46, 0x6c, 0x72, + 0xca, 0x33, 0x4d, 0xf7, 0xa1, 0xfb, 0x18, 0xc6, 0x1e, 0xb9, 0xd1, 0x41, 0x8d, 0x36, 0x02, 0x1a, + 0x49, 0x7b, 0x0e, 0x8a, 0xe9, 0x99, 0x1b, 0x1d, 0xd4, 0x43, 0x0e, 0xd7, 0xf7, 0x6e, 0x0d, 0xdd, + 0x5a, 0x86, 0x33, 0xa2, 0x36, 0x75, 0x84, 0x9a, 0x37, 0x19, 0x16, 0x90, 0x21, 0x0e, 0x95, 0xce, + 0xd0, 0x64, 0xf3, 0x27, 0x45, 0x98, 0x59, 0x3c, 0x70, 0xbc, 0x7d, 0xba, 0xe5, 0x84, 0xe1, 0x33, + 0x3f, 0x68, 0x6a, 0x8d, 0xc7, 0xf3, 0x63, 0xaa, 0xf1, 0x78, 0x60, 0x9c, 0x87, 0xb1, 0xcd, 0x56, + 0x53, 0xd2, 0x88, 0xb3, 0x2d, 0xd6, 0xe5, 0xb7, 0x9a, 0xf5, 0xb6, 0xe4, 0xa5, 0x23, 0x31, 0x9a, + 0x0d, 0xfa, 0x4c, 0xd1, 0xf4, 0xc7, 0x34, 0x1e, 0x7d, 0xa6, 0xd1, 0x68, 0x48, 0x64, 0x19, 0xce, + 0xd6, 0x68, 0xc3, 0xf7, 0x9a, 0xf7, 0x9c, 0x46, 0xe4, 0x07, 0xdb, 0xfe, 0x13, 0xea, 0x89, 0x49, + 0x88, 0xca, 0x7f, 0x88, 0x85, 0xf5, 0xc7, 0x58, 0x5a, 0x8f, 0x58, 0xb1, 0x9d, 0xa6, 0x20, 0x9b, + 0x30, 0xf2, 0x48, 0x58, 0x05, 0xc5, 0x81, 0xf8, 0xf5, 0x9b, 0xca, 0x4c, 0xb8, 0x18, 0x50, 0x9c, + 0x39, 0x4e, 0x4b, 0x1d, 0xe9, 0x95, 0x2e, 0x85, 0xcb, 0x95, 0xc4, 0xb4, 0x15, 0x13, 0x6b, 0x07, + 0x26, 0xb6, 0x5a, 0x9d, 0x7d, 0xd7, 0x63, 0x0b, 0x4b, 0x8d, 0xfe, 0x98, 0x2c, 0x01, 0xc4, 0x00, + 0x61, 0xeb, 0x9b, 0x12, 0xc7, 0xe8, 0xb8, 0x60, 0xf7, 0xae, 0xf8, 0xda, 0x10, 0x82, 0xa7, 0x1e, + 0x5b, 0xa3, 0xb3, 0xfe, 0x67, 0x3f, 0x10, 0x31, 0x00, 0xb8, 0xd1, 0xd5, 0x68, 0xc4, 0xb6, 0xa0, + 0x73, 0x50, 0x54, 0x26, 0xb9, 0xa1, 0xe3, 0xa3, 0x4a, 0xd1, 0x6d, 0xda, 0xc5, 0xd5, 0x25, 0xf2, + 0x0e, 0x0c, 0x22, 0x1a, 0xca, 0x7f, 0x52, 0xd5, 0xa7, 0x73, 0xe0, 0x0b, 0x0c, 0xee, 0xb0, 0x36, + 0x47, 0x26, 0xef, 0xc2, 0xe8, 0x12, 0x6d, 0xd1, 0x7d, 0x27, 0xf2, 0xe5, 0x12, 0xc0, 0x8d, 0x5c, + 0x12, 0xa8, 0xcd, 0xb9, 0x18, 0x93, 0x1d, 0x79, 0x6d, 0xea, 0x84, 0xbe, 0xa7, 0x1f, 0x79, 0x03, + 0x84, 0xe8, 0x47, 0x5e, 0x8e, 0x43, 0x7e, 0xaf, 0x00, 0x63, 0x55, 0xcf, 0x13, 0xc6, 0xa3, 0x50, + 0x48, 0x7d, 0xe6, 0xa6, 0xb2, 0xb6, 0xae, 0x39, 0x7b, 0xb4, 0xb5, 0xeb, 0xb4, 0x3a, 0x34, 0x5c, + 0xf8, 0x9a, 0x9d, 0x42, 0xfe, 0xc3, 0x51, 0xe5, 0xa3, 0x53, 0x98, 0x83, 0x62, 0xbb, 0xed, 0x76, + 0xe0, 0xb8, 0x51, 0x78, 0x7c, 0x54, 0x99, 0x71, 0xe2, 0x0a, 0xf5, 0xef, 0x46, 0x6b, 0x47, 0xbc, + 0xfe, 0x0f, 0xf5, 0x5a, 0xff, 0xc9, 0x21, 0x9c, 0xa9, 0x86, 0x61, 0xe7, 0x90, 0xd6, 0x22, 0x27, + 0x88, 0xb6, 0xdd, 0x43, 0x8a, 0x8b, 0x48, 0x77, 0x03, 0xc2, 0x9b, 0x3f, 0x3b, 0xaa, 0x14, 0xd8, + 0xc1, 0xc7, 0x41, 0x52, 0xa6, 0xdb, 0x04, 0x51, 0x3d, 0x72, 0xf5, 0x2d, 0x0c, 0x4d, 0x09, 0x49, + 0xde, 0xd6, 0x35, 0xa5, 0x74, 0xac, 0x2e, 0xe5, 0x8d, 0xb8, 0xb5, 0x08, 0x17, 0xef, 0xd3, 0xc8, + 0xa6, 0x21, 0x8d, 0xe4, 0x37, 0x82, 0x33, 0x3c, 0x36, 0xe0, 0x0e, 0xe3, 0x6f, 0x45, 0x8c, 0xc3, + 0xcf, 0xbf, 0x0b, 0x59, 0x62, 0xfd, 0x5f, 0x05, 0xa8, 0x2c, 0x06, 0x94, 0x9f, 0x19, 0x72, 0x18, + 0x75, 0x5f, 0xbb, 0x2e, 0xc2, 0xc0, 0xf6, 0xf3, 0xb6, 0xb4, 0xbc, 0x60, 0x29, 0x1b, 0x14, 0x1b, + 0xa1, 0x27, 0x34, 0x64, 0x59, 0x8f, 0x61, 0xc6, 0xa6, 0x1e, 0x7d, 0xe6, 0xec, 0xb5, 0xa8, 0x61, + 0x0b, 0xaa, 0xc0, 0x20, 0xff, 0xd0, 0x53, 0x5d, 0xe0, 0xf0, 0xd3, 0xd9, 0xd5, 0xac, 0x09, 0x18, + 0xdb, 0x72, 0xbd, 0x7d, 0xc1, 0xdd, 0xfa, 0xe3, 0x7e, 0x18, 0xe7, 0xbf, 0xc5, 0x31, 0x28, 0xb1, + 0xc5, 0x15, 0x4e, 0xb2, 0xc5, 0xbd, 0x0f, 0x13, 0x6c, 0x8f, 0xa0, 0xc1, 0x2e, 0x0d, 0xd8, 0xd6, + 0x2a, 0x24, 0x81, 0x47, 0xba, 0x10, 0x0b, 0xea, 0x4f, 0x79, 0x89, 0x6d, 0x22, 0x92, 0x35, 0x98, + 0xe4, 0x80, 0x7b, 0xd4, 0x89, 0x3a, 0xb1, 0x55, 0xea, 0x8c, 0x38, 0xf7, 0x48, 0x30, 0x9f, 0x9a, + 0x82, 0xd7, 0x63, 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x53, 0x38, 0xb3, 0x15, 0xf8, 0xdf, 0x3c, 0xd7, + 0x36, 0x75, 0xfe, 0x75, 0xf2, 0x13, 0x12, 0x2b, 0xaa, 0xeb, 0x5b, 0x7b, 0x12, 0x9b, 0xbc, 0x05, + 0x23, 0xab, 0xe1, 0x82, 0x1f, 0xb8, 0xde, 0x3e, 0x7e, 0xa3, 0x23, 0xdc, 0x98, 0xef, 0x86, 0xf5, + 0x3d, 0x04, 0xda, 0xaa, 0x38, 0x61, 0x76, 0x1e, 0xee, 0x6d, 0x76, 0xbe, 0x0d, 0xb0, 0xe6, 0x3b, + 0xcd, 0x6a, 0xab, 0xb5, 0x58, 0x0d, 0x71, 0xf7, 0x14, 0xfb, 0x51, 0xcb, 0x77, 0x9a, 0x75, 0xa7, + 0xd5, 0xaa, 0x37, 0x9c, 0xd0, 0xd6, 0x70, 0x1e, 0x0c, 0x8c, 0x0c, 0x95, 0x86, 0xed, 0x33, 0x6b, + 0x6e, 0x83, 0x7a, 0x21, 0x7d, 0xe4, 0x04, 0x9e, 0xeb, 0xed, 0x87, 0xd6, 0x3f, 0x3f, 0x0b, 0x23, + 0xaa, 0xcb, 0x37, 0x75, 0xc5, 0x5e, 0xec, 0x72, 0x38, 0xfa, 0xb1, 0xd9, 0xca, 0xd6, 0x30, 0xc8, + 0x79, 0x54, 0xf5, 0xc5, 0xfe, 0x3a, 0xcc, 0x66, 0xa3, 0xd3, 0x6e, 0xdb, 0x0c, 0xc6, 0xbe, 0xb2, + 0xa5, 0x05, 0x94, 0xff, 0x08, 0xff, 0xca, 0x9a, 0x7b, 0x76, 0x71, 0x69, 0x81, 0x4d, 0xef, 0xcd, + 0xd5, 0xa5, 0x45, 0x14, 0xe5, 0x08, 0x9f, 0xde, 0xbe, 0xdb, 0x6c, 0xd8, 0x08, 0x65, 0xa5, 0xb5, + 0xea, 0xfa, 0x9a, 0x10, 0x17, 0x96, 0x86, 0xce, 0x61, 0xcb, 0x46, 0x28, 0x53, 0x0e, 0xb9, 0x05, + 0x62, 0xd1, 0xf7, 0xa2, 0xc0, 0x6f, 0x85, 0xa8, 0xc1, 0x8c, 0xf0, 0xe1, 0x14, 0xa6, 0x8b, 0x86, + 0x28, 0xb2, 0x13, 0xa8, 0xe4, 0x11, 0xcc, 0x56, 0x9b, 0x4f, 0x1d, 0xaf, 0x41, 0x9b, 0xbc, 0xe4, + 0x91, 0x1f, 0x3c, 0x79, 0xdc, 0xf2, 0x9f, 0x85, 0x28, 0xef, 0x11, 0x61, 0xe9, 0x13, 0x28, 0xd2, + 0x12, 0xf2, 0x4c, 0x22, 0xd9, 0x79, 0xd4, 0xec, 0x93, 0x5a, 0x6c, 0xf9, 0x9d, 0xa6, 0x18, 0x05, + 0xfc, 0xa4, 0x1a, 0x0c, 0x60, 0x73, 0x38, 0x93, 0xd2, 0x4a, 0x6d, 0x1d, 0xed, 0x6a, 0x42, 0x4a, + 0x07, 0xe1, 0xa1, 0xcd, 0x60, 0xe4, 0x75, 0x18, 0x96, 0x7a, 0x2e, 0x37, 0xfc, 0xa3, 0xc1, 0x59, + 0xea, 0xb7, 0xb2, 0x8c, 0x7d, 0x12, 0x36, 0x6d, 0xf8, 0x4f, 0x69, 0xf0, 0x7c, 0xd1, 0x6f, 0x52, + 0x69, 0x05, 0x12, 0x56, 0x0e, 0x5e, 0x50, 0x6f, 0xb0, 0x12, 0xdb, 0x44, 0x64, 0x15, 0xf0, 0x3d, + 0x30, 0x2c, 0x9f, 0x89, 0x2b, 0xe0, 0x7b, 0x64, 0x68, 0xcb, 0x32, 0xb2, 0x04, 0x67, 0xab, 0x9d, + 0xc8, 0x3f, 0x74, 0x22, 0xb7, 0xb1, 0xd3, 0xde, 0x0f, 0x1c, 0x56, 0x49, 0x09, 0x09, 0x50, 0xef, + 0x77, 0x64, 0x61, 0xbd, 0x23, 0x4a, 0xed, 0x34, 0x01, 0x79, 0x0f, 0xc6, 0x57, 0x43, 0x6e, 0xe9, + 0x73, 0x42, 0xda, 0x44, 0x73, 0x8d, 0x68, 0xa5, 0x1b, 0xd6, 0xd1, 0xee, 0x57, 0x67, 0x27, 0x85, + 0xa6, 0x6d, 0xe0, 0x11, 0x0b, 0x86, 0xaa, 0x61, 0xe8, 0x86, 0x11, 0x5a, 0x61, 0x46, 0x16, 0xe0, + 0xf8, 0xa8, 0x32, 0xe4, 0x20, 0xc4, 0x16, 0x25, 0xe4, 0x11, 0x8c, 0x2d, 0x51, 0xa6, 0x38, 0x6e, + 0x07, 0x9d, 0x30, 0x42, 0x9b, 0xca, 0xd8, 0xfc, 0x79, 0xf1, 0x61, 0x6b, 0x25, 0x62, 0x2e, 0x73, + 0x6d, 0xaf, 0x89, 0xf0, 0x7a, 0xc4, 0x0a, 0xf4, 0x5d, 0x4b, 0xc3, 0x67, 0x5a, 0xb1, 0xa0, 0x59, + 0x71, 0x9b, 0xec, 0x53, 0x9d, 0xc6, 0x36, 0xa0, 0x56, 0x2c, 0xd6, 0x86, 0xfa, 0x01, 0x96, 0xe8, + 0x5a, 0xb1, 0x41, 0x42, 0x1a, 0x29, 0xe3, 0xf1, 0x8c, 0x61, 0x20, 0x34, 0x0b, 0x65, 0x13, 0x4f, + 0x69, 0x5a, 0xfe, 0x18, 0xc6, 0x16, 0x3b, 0x61, 0xe4, 0x1f, 0x6e, 0x1f, 0xd0, 0x43, 0x8a, 0x76, + 0x17, 0xa1, 0xfb, 0x37, 0x10, 0x5c, 0x8f, 0x18, 0x5c, 0xef, 0xa6, 0x86, 0x4e, 0x3e, 0x07, 0x22, + 0x95, 0xf8, 0xfb, 0x6c, 0x7e, 0x78, 0x6c, 0x2e, 0xa3, 0xe9, 0x65, 0x84, 0x6b, 0xee, 0x52, 0xf7, + 0xaf, 0xef, 0xab, 0x62, 0xdd, 0xfc, 0x97, 0x26, 0x66, 0x0d, 0xe2, 0x4d, 0xbc, 0x1f, 0x38, 0xed, + 0x83, 0x72, 0x39, 0xd6, 0xb2, 0x45, 0xa7, 0xf6, 0x19, 0xdc, 0xd0, 0x16, 0x62, 0x74, 0x52, 0x03, + 0xe0, 0x3f, 0xd7, 0xd8, 0xc0, 0x73, 0x63, 0x4d, 0xd9, 0x90, 0x17, 0x2b, 0x90, 0xb2, 0x3a, 0x8f, + 0x3a, 0x08, 0x67, 0xdb, 0x72, 0x8d, 0xd1, 0xd4, 0xd8, 0x90, 0x27, 0x50, 0xe2, 0xbf, 0xd6, 0x7d, + 0xcf, 0x8d, 0xf8, 0xd2, 0x3b, 0x67, 0x58, 0xf6, 0x92, 0xc5, 0xb2, 0x02, 0xb4, 0xa8, 0x8a, 0x0a, + 0x0e, 0x55, 0xa9, 0x56, 0x4d, 0x8a, 0x31, 0xd9, 0x82, 0xb1, 0xad, 0xc0, 0x6f, 0x76, 0x1a, 0x11, + 0x6e, 0xd8, 0x17, 0x50, 0x51, 0x24, 0xa2, 0x1e, 0xad, 0x84, 0xcb, 0xa4, 0xcd, 0x01, 0x75, 0xb6, + 0x99, 0xeb, 0x32, 0xd1, 0x10, 0xc9, 0x02, 0x0c, 0x6d, 0xf9, 0x2d, 0xb7, 0xf1, 0xbc, 0x7c, 0x11, + 0x1b, 0x3d, 0x2d, 0x99, 0x21, 0x50, 0x36, 0x15, 0xb5, 0xc3, 0x36, 0x82, 0x74, 0xed, 0x90, 0x23, + 0x91, 0x2a, 0x4c, 0x7c, 0xce, 0x26, 0x8c, 0xeb, 0x7b, 0x9e, 0xe3, 0x06, 0xb4, 0x7c, 0x09, 0xc7, + 0x05, 0xad, 0xde, 0x3f, 0xd6, 0x0b, 0xf4, 0xe9, 0x6c, 0x50, 0x90, 0x55, 0x38, 0xb3, 0x1a, 0xd6, + 0xa2, 0xc0, 0x6d, 0xd3, 0x75, 0xc7, 0x73, 0xf6, 0x69, 0xb3, 0x7c, 0x39, 0x36, 0x3b, 0xbb, 0x61, + 0x3d, 0xc4, 0xb2, 0xfa, 0x21, 0x2f, 0xd4, 0xcd, 0xce, 0x09, 0x3a, 0xf2, 0x05, 0x4c, 0x2f, 0x7f, + 0x13, 0xb1, 0x19, 0xd3, 0xaa, 0x76, 0x9a, 0x6e, 0x54, 0x8b, 0xfc, 0xc0, 0xd9, 0xa7, 0xe5, 0x0a, + 0xf2, 0x7b, 0xed, 0xf8, 0xa8, 0x72, 0x85, 0x8a, 0xf2, 0xba, 0xc3, 0x10, 0xea, 0x21, 0xc7, 0xd0, + 0xaf, 0x93, 0xb3, 0x38, 0x30, 0xe9, 0xd7, 0x3a, 0x6d, 0xa6, 0xb8, 0xa2, 0xf4, 0xaf, 0x18, 0xd2, + 0xd7, 0x4a, 0xb8, 0xf4, 0x43, 0x0e, 0x48, 0x49, 0x5f, 0x43, 0x24, 0x36, 0x90, 0x07, 0xbe, 0xeb, + 0x55, 0x1b, 0x91, 0xfb, 0x94, 0x8a, 0x73, 0x7d, 0x58, 0xbe, 0x8a, 0x2d, 0x45, 0x13, 0xf9, 0xaf, + 0xfa, 0xae, 0x57, 0x77, 0xb0, 0xb8, 0x2e, 0xac, 0x00, 0x86, 0x89, 0x3c, 0x4d, 0x4d, 0x7e, 0x08, + 0xe7, 0xd6, 0xfd, 0x3d, 0xb7, 0x45, 0xf9, 0x92, 0xc3, 0xc5, 0x82, 0xe6, 0x3e, 0x0b, 0xf9, 0xa2, + 0x89, 0xfc, 0x10, 0x31, 0xea, 0x62, 0xb5, 0x3a, 0x54, 0x38, 0xba, 0x89, 0x3c, 0x9b, 0x0b, 0x59, + 0x86, 0x71, 0xfc, 0x2e, 0x5b, 0xf8, 0x33, 0x2c, 0x5f, 0xc3, 0xd3, 0xd1, 0xd5, 0x84, 0xc2, 0x73, + 0x73, 0x59, 0xc3, 0x59, 0xf6, 0xa2, 0xe0, 0xb9, 0x6d, 0x90, 0x91, 0x4f, 0x60, 0x2e, 0x39, 0xbd, + 0x17, 0x7d, 0xef, 0xb1, 0xbb, 0xdf, 0x09, 0x68, 0xb3, 0xfc, 0x1a, 0x6b, 0xaa, 0xdd, 0x05, 0x63, + 0xee, 0x11, 0x9c, 0x4d, 0x55, 0x41, 0x4a, 0xd0, 0xff, 0x44, 0xdc, 0x38, 0x8e, 0xda, 0xec, 0x4f, + 0xf2, 0x36, 0x0c, 0x3e, 0x65, 0xc7, 0x12, 0xd4, 0x18, 0xe2, 0x3b, 0x2c, 0x8d, 0x74, 0xd5, 0x7b, + 0xec, 0xdb, 0x1c, 0xe9, 0xc3, 0xe2, 0xfb, 0x85, 0x07, 0x03, 0x23, 0x63, 0xa5, 0x71, 0x7e, 0x51, + 0xfc, 0x60, 0x60, 0x64, 0xa2, 0x34, 0x69, 0x55, 0xe1, 0x4c, 0x02, 0x9f, 0x94, 0x61, 0x98, 0x7a, + 0x4c, 0xd5, 0x6d, 0x72, 0x9d, 0xc5, 0x96, 0x3f, 0xc9, 0x34, 0x0c, 0xb6, 0xdc, 0x43, 0x37, 0xc2, + 0x0a, 0x07, 0x6d, 0xfe, 0xc3, 0xfa, 0xfd, 0x02, 0x90, 0xf4, 0x96, 0x41, 0x6e, 0x25, 0xd8, 0x70, + 0x45, 0x4f, 0x80, 0x74, 0x53, 0xb8, 0xe4, 0xfe, 0x39, 0x4c, 0xf1, 0x31, 0x93, 0x9b, 0x9b, 0x56, + 0x17, 0x5f, 0x54, 0x33, 0x8a, 0x75, 0x73, 0x88, 0x28, 0xc6, 0xad, 0x70, 0x0d, 0x9b, 0xd6, 0x81, + 0x99, 0xcc, 0xcd, 0x82, 0xac, 0xc3, 0xcc, 0xa1, 0xef, 0x45, 0x07, 0xad, 0xe7, 0x72, 0xaf, 0x10, + 0xb5, 0x15, 0xb0, 0x36, 0x5c, 0x1f, 0x33, 0x11, 0xec, 0x29, 0x01, 0x16, 0x1c, 0xb1, 0x9e, 0x07, + 0x03, 0x23, 0xc5, 0x52, 0xbf, 0xea, 0x89, 0x65, 0xc3, 0xd9, 0xd4, 0x9a, 0x4b, 0xbe, 0x0f, 0xe3, + 0x0d, 0x3c, 0xca, 0x18, 0x35, 0xf1, 0x1d, 0x47, 0x83, 0xeb, 0x9f, 0x13, 0x87, 0xf3, 0xae, 0xfc, + 0x51, 0x01, 0x66, 0x73, 0x56, 0xdb, 0xd3, 0x8b, 0xfa, 0x4b, 0x38, 0x77, 0xe8, 0x7c, 0x53, 0x0f, + 0xf0, 0xa4, 0x5a, 0x0f, 0x1c, 0x2f, 0x21, 0x6d, 0x5c, 0x49, 0xb2, 0x31, 0x74, 0x6f, 0x9d, 0x43, + 0xe7, 0x1b, 0x1b, 0x11, 0x6c, 0x56, 0xce, 0xdb, 0xf9, 0x19, 0x4c, 0x18, 0xeb, 0xeb, 0xa9, 0x1b, + 0x67, 0xdd, 0x81, 0xb3, 0xec, 0x2c, 0x1f, 0xd1, 0x13, 0x5b, 0xa8, 0xac, 0x2d, 0x80, 0x1a, 0x3d, + 0x74, 0xda, 0x07, 0x3e, 0xd3, 0xbb, 0x17, 0xf4, 0x5f, 0xc2, 0xc2, 0x41, 0x84, 0xc5, 0x41, 0x15, + 0xec, 0xde, 0xe5, 0xba, 0x78, 0xa8, 0x30, 0x6d, 0x8d, 0xca, 0xfa, 0xf3, 0x22, 0x10, 0xb1, 0x40, + 0x06, 0xd4, 0x39, 0x94, 0xcd, 0xf8, 0x00, 0xc6, 0xf9, 0x79, 0x94, 0x83, 0xb1, 0x39, 0x63, 0xf3, + 0x53, 0xe2, 0xcb, 0xd3, 0x8b, 0x56, 0xfa, 0x6c, 0x03, 0x95, 0x91, 0xda, 0x94, 0x1f, 0xa4, 0x91, + 0xb4, 0x68, 0x90, 0xea, 0x45, 0x8c, 0x54, 0xff, 0x4d, 0x3e, 0x85, 0xc9, 0x45, 0xff, 0xb0, 0xcd, + 0x64, 0x22, 0x88, 0xfb, 0x85, 0x91, 0x42, 0xd4, 0x6b, 0x14, 0xae, 0xf4, 0xd9, 0x09, 0x74, 0xb2, + 0x01, 0x53, 0xf7, 0x5a, 0x9d, 0xf0, 0xa0, 0xea, 0x35, 0x17, 0x5b, 0x7e, 0x28, 0xb9, 0x0c, 0x08, + 0x23, 0x81, 0x58, 0xde, 0xd2, 0x18, 0x2b, 0x7d, 0x76, 0x16, 0x21, 0x79, 0x1d, 0x06, 0x97, 0x9f, + 0xb2, 0x65, 0x57, 0xfa, 0x6c, 0x08, 0x97, 0xb2, 0x4d, 0x8f, 0x6e, 0x3e, 0x5e, 0xe9, 0xb3, 0x79, + 0xe9, 0xc2, 0x28, 0x0c, 0xcb, 0xb3, 0xec, 0x2d, 0xa6, 0x12, 0x2b, 0x71, 0xd6, 0x22, 0x27, 0xea, + 0x84, 0x64, 0x0e, 0x46, 0x76, 0xda, 0xec, 0x88, 0x25, 0x8d, 0x00, 0xb6, 0xfa, 0x6d, 0xbd, 0x6d, + 0x4a, 0x9a, 0x5c, 0xd4, 0xed, 0xc7, 0x1c, 0x39, 0x06, 0x58, 0x2b, 0xa6, 0x70, 0xbb, 0x63, 0x1b, + 0xf5, 0x16, 0x13, 0xf5, 0x96, 0x92, 0xb2, 0xb6, 0x66, 0x32, 0x85, 0x67, 0x7d, 0x01, 0x97, 0x77, + 0xda, 0x21, 0x0d, 0xa2, 0x6a, 0xbb, 0xdd, 0x72, 0x1b, 0xfc, 0xce, 0x07, 0xcf, 0xbc, 0x72, 0xb2, + 0xbc, 0x07, 0x43, 0x1c, 0x20, 0xa6, 0x89, 0x9c, 0x83, 0xd5, 0x76, 0x5b, 0x9c, 0xb4, 0xef, 0x72, + 0xe5, 0x9c, 0x9f, 0x9d, 0x6d, 0x81, 0x6d, 0xfd, 0x4e, 0x01, 0x2e, 0xf3, 0x2f, 0x20, 0x97, 0xf5, + 0x77, 0x60, 0x14, 0x3d, 0xba, 0xda, 0x4e, 0x43, 0x7e, 0x13, 0xdc, 0xb5, 0x4d, 0x02, 0xed, 0xb8, + 0x5c, 0xf3, 0x95, 0x2b, 0xe6, 0xfb, 0xca, 0xc9, 0x0f, 0xac, 0x3f, 0xf3, 0x03, 0xfb, 0x1c, 0x2c, + 0xd1, 0xa2, 0x56, 0x2b, 0xd5, 0xa8, 0xf0, 0x45, 0x5a, 0x65, 0xfd, 0xd7, 0x22, 0xcc, 0xde, 0xa7, + 0x1e, 0x0d, 0x1c, 0xec, 0xa7, 0x61, 0xd3, 0xd1, 0x7d, 0x66, 0x0a, 0x5d, 0x7d, 0x66, 0x2a, 0xd2, + 0x4a, 0x56, 0x44, 0x2b, 0x59, 0xca, 0x01, 0x88, 0x1d, 0x17, 0x77, 0xec, 0x55, 0xd1, 0x2d, 0x3c, + 0x2e, 0x76, 0x02, 0x17, 0xed, 0xe0, 0x64, 0x35, 0xf6, 0xb7, 0x19, 0xe8, 0x69, 0x2e, 0x9b, 0x12, + 0xfe, 0x07, 0xc3, 0xc2, 0xdf, 0xc6, 0xf4, 0xb2, 0xd9, 0x80, 0x21, 0x6e, 0xdc, 0xc3, 0xdb, 0x9a, + 0xb1, 0xf9, 0x1b, 0xe2, 0x9b, 0xca, 0xe9, 0xa0, 0xb0, 0x04, 0xe2, 0xc6, 0xce, 0xa7, 0x40, 0x84, + 0x00, 0x5b, 0x70, 0x99, 0xfb, 0x1c, 0xc6, 0x34, 0x94, 0x93, 0xec, 0xfd, 0xca, 0xc8, 0xc8, 0x34, + 0x46, 0x6f, 0x9f, 0xdb, 0x2b, 0xb5, 0xbd, 0xdf, 0xfa, 0x08, 0xca, 0xe9, 0xd6, 0x08, 0xc3, 0x52, + 0x2f, 0x3b, 0x96, 0xb5, 0x04, 0xd3, 0xf7, 0x69, 0x84, 0x13, 0x17, 0x3f, 0x22, 0xcd, 0x6f, 0x2c, + 0xf1, 0x9d, 0xc9, 0x55, 0x55, 0xde, 0xea, 0xe8, 0x5f, 0x69, 0x0d, 0x66, 0x12, 0x5c, 0x44, 0xfd, + 0x1f, 0xc2, 0xb0, 0x00, 0xa9, 0x15, 0x55, 0x38, 0x9f, 0xd2, 0x3d, 0x51, 0xb0, 0x3b, 0xcf, 0xe7, + 0xad, 0xe0, 0x6c, 0x4b, 0x02, 0xeb, 0x00, 0xce, 0xb1, 0x6d, 0x36, 0xe6, 0xaa, 0xa6, 0xe3, 0x05, + 0x18, 0x6d, 0x33, 0x45, 0x21, 0x74, 0x7f, 0xc2, 0xa7, 0xd1, 0xa0, 0x3d, 0xc2, 0x00, 0x35, 0xf7, + 0x27, 0x94, 0x5c, 0x02, 0xc0, 0x42, 0xec, 0xa6, 0x58, 0x05, 0x10, 0x9d, 0x1b, 0xee, 0x08, 0xa0, + 0xd7, 0x19, 0x9f, 0x37, 0x36, 0xfe, 0x6d, 0x05, 0x30, 0x9b, 0xaa, 0x49, 0x74, 0xe0, 0x16, 0x8c, + 0x48, 0x15, 0x36, 0x61, 0x52, 0xd7, 0x7b, 0x60, 0x2b, 0x24, 0xf2, 0x06, 0x9c, 0xf1, 0xe8, 0x37, + 0x51, 0x3d, 0xd5, 0x86, 0x09, 0x06, 0xde, 0x92, 0xed, 0xb0, 0x7e, 0x05, 0xcd, 0xa8, 0x35, 0xcf, + 0x7f, 0xf6, 0xb8, 0xe5, 0x3c, 0xa1, 0xa9, 0x8a, 0xbf, 0x0f, 0x23, 0xb5, 0xde, 0x15, 0xf3, 0xcf, + 0x47, 0x56, 0x6e, 0x2b, 0x12, 0xab, 0x05, 0x73, 0xac, 0x4b, 0xb5, 0xea, 0xfa, 0xda, 0x6a, 0x73, + 0xeb, 0xdb, 0x16, 0xe0, 0x53, 0xb8, 0x90, 0x59, 0xdb, 0xb7, 0x2d, 0xc4, 0x7f, 0x39, 0x00, 0xb3, + 0x7c, 0x33, 0x49, 0xcf, 0xe0, 0x93, 0x2f, 0x35, 0xbf, 0x94, 0x1b, 0xc9, 0xdb, 0x19, 0x37, 0x92, + 0x48, 0xa2, 0xdf, 0x48, 0x1a, 0xf7, 0x90, 0xef, 0x67, 0xdf, 0x43, 0xa2, 0x9d, 0xc8, 0xbc, 0x87, + 0x4c, 0xde, 0x3e, 0x2e, 0xe7, 0xdf, 0x3e, 0xe2, 0x35, 0x4b, 0xc6, 0xed, 0x63, 0xd6, 0x9d, 0x63, + 0xc2, 0xf5, 0x67, 0xe4, 0xd5, 0xba, 0xfe, 0xbc, 0x01, 0xc3, 0xd5, 0x76, 0x5b, 0x73, 0xa5, 0xc3, + 0xe1, 0x71, 0xda, 0x6d, 0x2e, 0x3c, 0x59, 0x28, 0xd7, 0x79, 0xc8, 0x58, 0xe7, 0x3f, 0x00, 0x58, + 0x44, 0x87, 0x7f, 0x1c, 0xb8, 0x31, 0xc4, 0x40, 0x0d, 0x9f, 0x3f, 0x03, 0xc0, 0x81, 0xd3, 0x2d, + 0x20, 0x31, 0x32, 0x57, 0xec, 0xad, 0x5d, 0x28, 0xa7, 0xa7, 0xcf, 0x2b, 0x58, 0xba, 0xfe, 0xb4, + 0x00, 0x97, 0x84, 0x92, 0x93, 0xf8, 0xc0, 0x4f, 0x3f, 0x3b, 0xdf, 0x85, 0x71, 0x41, 0xbb, 0x1d, + 0x7f, 0x08, 0xfc, 0x0a, 0x58, 0x2e, 0xc6, 0x7c, 0x45, 0x37, 0xd0, 0xc8, 0xbb, 0x30, 0x82, 0x7f, + 0xc4, 0xd7, 0x20, 0x4c, 0x32, 0xa3, 0x88, 0x5a, 0x4f, 0x5e, 0x86, 0x28, 0x54, 0xeb, 0x6b, 0xb8, + 0x9c, 0xd7, 0xf0, 0x57, 0x20, 0x97, 0x7f, 0x55, 0x80, 0x0b, 0x82, 0xbd, 0xb1, 0x54, 0xbc, 0xd0, + 0xae, 0x73, 0x0a, 0x07, 0xdc, 0x07, 0x30, 0xc6, 0x2a, 0x94, 0xed, 0xee, 0x17, 0x5b, 0xab, 0x38, + 0x39, 0xc4, 0x25, 0x4b, 0x4e, 0xe4, 0x08, 0x87, 0x12, 0xe7, 0xb0, 0x25, 0x8d, 0x17, 0xb6, 0x4e, + 0x6c, 0x7d, 0x05, 0x17, 0xb3, 0xbb, 0xf0, 0x0a, 0xe4, 0xf3, 0x00, 0xe6, 0x32, 0x36, 0x85, 0x17, + 0xdb, 0x93, 0xbf, 0x84, 0x0b, 0x99, 0xbc, 0x5e, 0x41, 0x33, 0x57, 0x98, 0xc6, 0x11, 0xbd, 0x82, + 0x21, 0xb4, 0x1e, 0xc1, 0xf9, 0x0c, 0x4e, 0xaf, 0xa0, 0x89, 0xf7, 0x61, 0x56, 0x69, 0xda, 0x2f, + 0xd5, 0xc2, 0x75, 0xb8, 0xc4, 0x19, 0xbd, 0x9a, 0x51, 0x79, 0x08, 0x17, 0x04, 0xbb, 0x57, 0x20, + 0xbd, 0x15, 0xb8, 0x18, 0x1f, 0xa8, 0x33, 0xf4, 0xa4, 0x13, 0x2f, 0x32, 0xd6, 0x1a, 0x5c, 0x89, + 0x39, 0xe5, 0x28, 0x0d, 0x27, 0xe7, 0xc6, 0xd5, 0xc1, 0x78, 0x94, 0x5e, 0xc9, 0x88, 0x3e, 0x82, + 0x73, 0x06, 0xd3, 0x57, 0xa6, 0x2a, 0xad, 0xc2, 0x14, 0x67, 0x6c, 0xaa, 0xce, 0xf3, 0xba, 0xea, + 0x3c, 0x36, 0x7f, 0x36, 0x66, 0x89, 0xe0, 0xdd, 0xbb, 0x19, 0xda, 0xf4, 0x3a, 0x6a, 0xd3, 0x12, + 0x25, 0x6e, 0xe1, 0xbb, 0x30, 0xc4, 0x21, 0xa2, 0x7d, 0x19, 0xcc, 0xf8, 0x61, 0x81, 0x93, 0x09, + 0x64, 0xeb, 0x87, 0x70, 0x89, 0x9f, 0x44, 0xe3, 0xbb, 0x44, 0xf3, 0xb4, 0xf8, 0xfd, 0xc4, 0x41, + 0xf4, 0xbc, 0xe0, 0x9b, 0xc4, 0xcf, 0x39, 0x8f, 0xee, 0xc9, 0xb9, 0x9d, 0xc7, 0xff, 0x44, 0x8f, + 0xb1, 0xe4, 0x01, 0xb3, 0x98, 0x79, 0xc0, 0xbc, 0x06, 0x57, 0xd5, 0x01, 0x33, 0x59, 0x8d, 0x9c, + 0x5a, 0xd6, 0x57, 0x70, 0x81, 0x77, 0x54, 0x3a, 0xc9, 0x99, 0xcd, 0xf8, 0x28, 0xd1, 0xcd, 0x59, + 0xd1, 0x4d, 0x13, 0x3b, 0xa7, 0x93, 0xff, 0x6f, 0x41, 0x7e, 0x72, 0xd9, 0xcc, 0x7f, 0xd9, 0x27, + 0xee, 0x0d, 0xa8, 0x28, 0x81, 0x98, 0x2d, 0x7a, 0xb1, 0xe3, 0xf6, 0x3a, 0xcc, 0xe8, 0x6c, 0xdc, + 0x06, 0xdd, 0xbd, 0x83, 0x97, 0x3c, 0xef, 0xb0, 0xcf, 0x02, 0x01, 0x72, 0xda, 0x95, 0x33, 0xe4, + 0x86, 0xf8, 0xb6, 0xc2, 0xb4, 0xea, 0x70, 0x31, 0x3d, 0x14, 0x6e, 0x43, 0x7a, 0xc8, 0x93, 0x4f, + 0xd9, 0x27, 0x8c, 0x10, 0x31, 0x18, 0xb9, 0x4c, 0xe5, 0x77, 0xcc, 0xc9, 0x25, 0x95, 0x65, 0xc9, + 0xa5, 0x26, 0xd1, 0x7f, 0x56, 0xbb, 0x9c, 0x0f, 0xbf, 0x0e, 0x44, 0x16, 0x2d, 0xd6, 0x6c, 0x59, + 0xf5, 0x79, 0xe8, 0x5f, 0xac, 0xd9, 0xe2, 0x69, 0x0e, 0x6a, 0x82, 0x8d, 0x30, 0xb0, 0x19, 0x2c, + 0xa9, 0x91, 0x17, 0x4f, 0xa0, 0x91, 0x3f, 0x18, 0x18, 0xe9, 0x2f, 0x0d, 0xd8, 0xa4, 0xe6, 0xee, + 0x7b, 0x8f, 0xdc, 0xe8, 0x40, 0x55, 0x58, 0xb5, 0x7e, 0x00, 0x53, 0x46, 0xf5, 0xe2, 0x2b, 0xee, + 0xfa, 0xa6, 0x88, 0xe9, 0xb3, 0x8b, 0x55, 0x74, 0x22, 0x41, 0x93, 0xc5, 0x38, 0x5f, 0x6f, 0x1a, + 0x4e, 0x1d, 0x1f, 0xac, 0xda, 0xb2, 0xd0, 0xfa, 0xc7, 0x03, 0x1a, 0x77, 0xed, 0xa5, 0x56, 0x97, + 0xde, 0xdd, 0x01, 0xe0, 0x33, 0x44, 0xeb, 0x1c, 0x53, 0x00, 0xc7, 0x84, 0x6f, 0x06, 0x5f, 0x92, + 0x6d, 0x0d, 0xe9, 0xa4, 0x2f, 0xb9, 0x84, 0x47, 0x2d, 0x27, 0x92, 0x8f, 0x17, 0x95, 0x47, 0xad, + 0x60, 0x1d, 0xda, 0x3a, 0x12, 0xf9, 0x61, 0xf2, 0xb9, 0xc1, 0x20, 0xde, 0x29, 0xbd, 0x26, 0x2f, + 0x99, 0xd3, 0x7d, 0x3b, 0xdd, 0x8b, 0x83, 0x67, 0x30, 0xc3, 0x68, 0xdd, 0xc7, 0x78, 0xb0, 0x58, + 0xfe, 0x26, 0xa2, 0x1e, 0x5f, 0xdb, 0x87, 0xb0, 0x9e, 0xd7, 0xbb, 0xd4, 0x13, 0x23, 0x0b, 0xfb, + 0x7b, 0xcc, 0xa7, 0x4e, 0x55, 0x99, 0x9d, 0xcd, 0x1f, 0x27, 0x91, 0xbd, 0xb6, 0xec, 0x35, 0xdb, + 0xbe, 0xab, 0x0e, 0x4c, 0x7c, 0x12, 0x05, 0xad, 0x3a, 0x15, 0x70, 0x5b, 0x47, 0xb2, 0xde, 0xe8, + 0xea, 0xa7, 0x3d, 0x02, 0x03, 0xdb, 0x8b, 0xdb, 0x6b, 0xa5, 0x82, 0x75, 0x0b, 0x40, 0xab, 0x09, + 0x60, 0x68, 0x63, 0xd3, 0x5e, 0xaf, 0xae, 0x95, 0xfa, 0xc8, 0x0c, 0x9c, 0x7d, 0xb4, 0xba, 0xb1, + 0xb4, 0xf9, 0xa8, 0x56, 0xaf, 0xad, 0x57, 0xed, 0xed, 0xc5, 0xaa, 0xbd, 0x54, 0x2a, 0x58, 0x5f, + 0xc3, 0xb4, 0xd9, 0xc3, 0x57, 0x3a, 0x09, 0x23, 0x98, 0x52, 0xfa, 0xcc, 0x83, 0x47, 0xdb, 0x9a, + 0xff, 0xa6, 0x38, 0xfc, 0x25, 0xfd, 0x90, 0xc4, 0x31, 0x51, 0x7c, 0x46, 0x1a, 0x12, 0x79, 0x8b, + 0xab, 0x05, 0xc9, 0xb7, 0xb8, 0x4c, 0x2d, 0xa8, 0xc7, 0x7a, 0x01, 0x2e, 0x7d, 0xdf, 0x83, 0x69, + 0xb3, 0xd6, 0x93, 0x5a, 0xa9, 0x5e, 0x43, 0xc7, 0x56, 0xed, 0xa1, 0x0e, 0x21, 0xfa, 0xb5, 0x81, + 0x58, 0x59, 0xbf, 0x07, 0x25, 0x81, 0x15, 0xef, 0xbc, 0xd7, 0xa4, 0x19, 0xb1, 0x90, 0xf1, 0xac, + 0x50, 0xba, 0x59, 0xfb, 0x50, 0x62, 0x2b, 0xa6, 0xa0, 0xe4, 0x15, 0x4c, 0xc3, 0xe0, 0x5a, 0x7c, + 0x9d, 0x63, 0xf3, 0x1f, 0xf8, 0x5e, 0x25, 0x72, 0x82, 0x48, 0x7a, 0x7d, 0x8d, 0xda, 0xea, 0x37, + 0x79, 0x0b, 0x86, 0xee, 0xb9, 0xad, 0x48, 0x98, 0x46, 0xe2, 0x4d, 0x9e, 0xb1, 0xe5, 0x05, 0xb6, + 0x40, 0xb0, 0x6c, 0x38, 0xab, 0x55, 0x78, 0x8a, 0xa6, 0x92, 0x32, 0x0c, 0x6f, 0xd0, 0x6f, 0xb4, + 0xfa, 0xe5, 0x4f, 0xeb, 0x3d, 0x38, 0x2b, 0x3c, 0xea, 0x34, 0x31, 0x5d, 0x15, 0xaf, 0x9f, 0x0b, + 0xc6, 0x13, 0x4c, 0xc1, 0x12, 0x8b, 0x18, 0xdd, 0x4e, 0xbb, 0xf9, 0x82, 0x74, 0x6c, 0xa3, 0x38, + 0x25, 0xdd, 0x9b, 0xf2, 0x16, 0xa8, 0xd7, 0x70, 0xfe, 0x79, 0x01, 0xca, 0x09, 0x2b, 0xc3, 0xe2, + 0x81, 0xd3, 0x6a, 0x51, 0x6f, 0x9f, 0x92, 0xeb, 0x30, 0xb0, 0xbd, 0xb9, 0xbd, 0x25, 0xac, 0xa4, + 0xd2, 0x01, 0x80, 0x81, 0x14, 0x8e, 0x8d, 0x18, 0xe4, 0x21, 0x9c, 0x95, 0x3e, 0xb3, 0xaa, 0x48, + 0x8c, 0xd0, 0xa5, 0xee, 0x1e, 0xb8, 0x69, 0x3a, 0xf2, 0x8e, 0x30, 0x89, 0xfc, 0xb8, 0xe3, 0x06, + 0xb4, 0x89, 0x96, 0x9f, 0xf8, 0x36, 0x5d, 0x2b, 0xb1, 0x75, 0x34, 0xfe, 0x56, 0xd5, 0xfa, 0xbd, + 0x02, 0xcc, 0xe6, 0x58, 0x4d, 0xc8, 0x5b, 0x46, 0x77, 0xa6, 0xb4, 0xee, 0x48, 0x94, 0x95, 0x3e, + 0xd1, 0x9f, 0x45, 0xcd, 0x91, 0xb8, 0xff, 0x14, 0x8e, 0xc4, 0x2b, 0x7d, 0xb1, 0xf3, 0xf0, 0x02, + 0xc0, 0x88, 0x84, 0x5b, 0x67, 0x60, 0xc2, 0x90, 0x9b, 0x65, 0xc1, 0xb8, 0x5e, 0x33, 0x1b, 0x9c, + 0x45, 0xbf, 0xa9, 0x06, 0x87, 0xfd, 0x6d, 0xfd, 0x6e, 0x01, 0xa6, 0xb1, 0x8b, 0xfb, 0x2e, 0x5b, + 0xfa, 0x62, 0x09, 0xcd, 0x1b, 0x3d, 0xb9, 0x68, 0xf4, 0x24, 0x81, 0xab, 0xba, 0xf4, 0x61, 0xaa, + 0x4b, 0x17, 0xb3, 0xba, 0x84, 0xd3, 0xdb, 0xf5, 0x3d, 0xa3, 0x27, 0xda, 0x55, 0xd4, 0xef, 0x17, + 0x60, 0x4a, 0x6b, 0x93, 0x6a, 0xff, 0x1d, 0xa3, 0x49, 0x17, 0x32, 0x9a, 0x94, 0x12, 0xf2, 0x42, + 0xaa, 0x45, 0xaf, 0x75, 0x6b, 0x51, 0x4f, 0x19, 0xff, 0xe7, 0x02, 0xcc, 0x64, 0xca, 0x80, 0x9c, + 0x63, 0xba, 0x6d, 0x23, 0xa0, 0x91, 0x10, 0xaf, 0xf8, 0xc5, 0xe0, 0xab, 0x61, 0xd8, 0xa1, 0x81, + 0xf8, 0xce, 0xc5, 0x2f, 0xf2, 0x1a, 0x4c, 0x6c, 0xd1, 0xc0, 0xf5, 0x9b, 0xdc, 0xc5, 0x9c, 0xfb, + 0x6e, 0x4e, 0xd8, 0x26, 0x90, 0x5c, 0x84, 0xd1, 0x6a, 0x6b, 0xdf, 0x0f, 0xdc, 0xe8, 0x80, 0xdf, + 0x06, 0x8e, 0xda, 0x31, 0x80, 0xf1, 0x5e, 0x72, 0xf7, 0xf9, 0xa5, 0x06, 0x23, 0x16, 0xbf, 0xd8, + 0xe2, 0x22, 0xad, 0x85, 0x43, 0x7c, 0x71, 0x91, 0xa6, 0xc0, 0x73, 0x30, 0xf4, 0xb9, 0x8d, 0x93, + 0x00, 0x23, 0x04, 0xd8, 0xe2, 0x17, 0x99, 0x44, 0x27, 0x61, 0x7c, 0x95, 0x80, 0xce, 0xc1, 0x1f, + 0xc2, 0x74, 0x96, 0x5c, 0xb3, 0xa6, 0x90, 0xa0, 0x2d, 0x2a, 0xda, 0xaf, 0x60, 0xaa, 0xda, 0x6c, + 0xae, 0xdf, 0xab, 0x72, 0x9f, 0x03, 0x31, 0xaa, 0xfc, 0xe3, 0xe1, 0xf6, 0x3a, 0xa1, 0xb2, 0x0d, + 0xac, 0x7a, 0x6e, 0x64, 0x4f, 0x2d, 0x7f, 0xe3, 0x86, 0x91, 0xeb, 0xed, 0x6b, 0x46, 0x45, 0xfb, + 0xdc, 0x06, 0x7d, 0x96, 0x31, 0x05, 0xd8, 0x6e, 0x6a, 0xf2, 0xe6, 0xf0, 0x0c, 0xe6, 0xd3, 0x1a, + 0xdb, 0x78, 0x29, 0x99, 0x35, 0xf9, 0xc6, 0x05, 0xfd, 0xd5, 0xc6, 0x13, 0xeb, 0x7b, 0x70, 0x8e, + 0x2f, 0x69, 0xdd, 0x1a, 0x2f, 0x9a, 0xad, 0xdb, 0x40, 0xad, 0xf7, 0xa5, 0x95, 0xa2, 0x6b, 0xcb, + 0xec, 0x71, 0xa3, 0x2d, 0x58, 0xe5, 0x7f, 0x29, 0xc0, 0x5c, 0x82, 0xb4, 0xf6, 0xdc, 0x6b, 0xc8, + 0xf5, 0xf4, 0x8d, 0xa4, 0x13, 0x36, 0xea, 0x01, 0xdc, 0xf8, 0xe7, 0x36, 0x95, 0x1f, 0x36, 0xb9, + 0x05, 0xc0, 0x89, 0xb5, 0xed, 0x1b, 0x4d, 0xdf, 0xc2, 0xc9, 0x06, 0x37, 0x70, 0x0d, 0x85, 0x74, + 0x20, 0x4b, 0xee, 0xe2, 0x1b, 0xe9, 0x65, 0x1b, 0xc6, 0xa8, 0x18, 0x54, 0x90, 0xd7, 0x73, 0x8c, + 0xc4, 0x59, 0xfc, 0xad, 0xff, 0xaf, 0x1f, 0x66, 0xf5, 0x01, 0x7c, 0x91, 0xbe, 0x6e, 0xc1, 0xd8, + 0xa2, 0xef, 0x45, 0xf4, 0x9b, 0x48, 0x8b, 0x4a, 0x40, 0xd4, 0x4d, 0xbb, 0x2a, 0x11, 0xaa, 0x23, + 0x07, 0xd4, 0x99, 0x1e, 0x63, 0x38, 0x0b, 0xc6, 0x88, 0x64, 0x11, 0x26, 0x36, 0xe8, 0xb3, 0x94, + 0x00, 0xd1, 0x61, 0xd1, 0xa3, 0xcf, 0xea, 0x9a, 0x10, 0x75, 0x2f, 0x32, 0x83, 0x86, 0xec, 0xc1, + 0xa4, 0x9c, 0x5c, 0x86, 0x30, 0xe7, 0xf4, 0x5d, 0xc5, 0x9c, 0xce, 0xfc, 0xd5, 0x3e, 0xab, 0x21, + 0x47, 0x86, 0x09, 0x8e, 0xac, 0xeb, 0xbc, 0x46, 0xfe, 0x10, 0xdd, 0xdc, 0xb6, 0xb4, 0x12, 0xc3, + 0x1d, 0x34, 0xf9, 0x00, 0x5d, 0x67, 0x61, 0x6d, 0x41, 0x39, 0x3d, 0x1e, 0xa2, 0xb6, 0x77, 0x60, + 0x88, 0x43, 0x85, 0x1a, 0x20, 0x03, 0xce, 0x28, 0x6c, 0x7e, 0x4e, 0xe7, 0xd5, 0xd8, 0x02, 0xd7, + 0x5a, 0x41, 0xdb, 0x89, 0xc2, 0x51, 0x8a, 0xd8, 0xed, 0xe4, 0xf0, 0xa2, 0xa7, 0xad, 0x1c, 0x5e, + 0xdd, 0xcf, 0x44, 0x3e, 0x2e, 0x58, 0x44, 0xf3, 0x93, 0xce, 0x49, 0x34, 0xec, 0x06, 0x0c, 0x0b, + 0x50, 0x22, 0x14, 0x4e, 0xfc, 0xf9, 0x49, 0x04, 0xeb, 0x43, 0x38, 0x8f, 0xb6, 0x30, 0xd7, 0xdb, + 0x6f, 0xd1, 0x9d, 0xd0, 0x78, 0x1e, 0xd0, 0xeb, 0xb3, 0xfe, 0x18, 0xe6, 0xb2, 0x68, 0x7b, 0x7e, + 0xd9, 0x3c, 0x38, 0xc5, 0x5f, 0x15, 0x61, 0x7a, 0x35, 0xd4, 0x95, 0x09, 0x15, 0xa0, 0x22, 0x23, + 0x68, 0x02, 0xca, 0x64, 0xa5, 0x2f, 0x2b, 0x28, 0xc2, 0x3b, 0xda, 0xe3, 0xc4, 0x62, 0xb7, 0x68, + 0x08, 0x6c, 0xdb, 0x52, 0xcf, 0x13, 0xdf, 0x80, 0x81, 0x0d, 0xb6, 0x54, 0xf7, 0x8b, 0xb1, 0xe3, + 0x14, 0x0c, 0x84, 0x8f, 0x03, 0xd9, 0x16, 0xc9, 0x7e, 0x90, 0x7b, 0xa9, 0x27, 0x88, 0x03, 0xbd, + 0x5f, 0xfb, 0xaf, 0xf4, 0xa5, 0x5e, 0x23, 0xbe, 0x07, 0x63, 0xd5, 0xe6, 0x21, 0xf7, 0x08, 0xf4, + 0xbd, 0xc4, 0x67, 0xa9, 0x95, 0xac, 0xf4, 0xd9, 0x3a, 0x22, 0x3b, 0xe1, 0x56, 0xdb, 0x6d, 0xdc, + 0xa8, 0xb2, 0x22, 0x20, 0xac, 0xf4, 0xa1, 0x83, 0xfd, 0xc2, 0x08, 0x0c, 0x6d, 0x3b, 0xc1, 0x3e, + 0x8d, 0xac, 0xaf, 0x60, 0x4e, 0x38, 0xa9, 0x70, 0xcb, 0x1f, 0xba, 0xb2, 0x84, 0xb1, 0x1f, 0x52, + 0x37, 0xc7, 0x92, 0xcb, 0x00, 0xa8, 0xe7, 0xaf, 0x7a, 0x4d, 0xfa, 0x8d, 0xf0, 0x92, 0xd3, 0x20, + 0xd6, 0xbb, 0x30, 0xaa, 0x24, 0x84, 0xca, 0xac, 0xb6, 0xd9, 0xa1, 0xb4, 0xa6, 0x8d, 0x37, 0x97, + 0xf2, 0xa1, 0xe5, 0x79, 0xa3, 0xef, 0x22, 0xa6, 0x09, 0xd7, 0x7e, 0x5d, 0x98, 0x49, 0x4c, 0x82, + 0xf8, 0xc9, 0xbc, 0xd2, 0x3f, 0xb9, 0x1b, 0x9f, 0xfa, 0x9d, 0x54, 0x4f, 0x8b, 0x27, 0x52, 0x4f, + 0xad, 0x7f, 0x5a, 0xc4, 0x83, 0x53, 0x4a, 0x1e, 0x09, 0x1b, 0x94, 0x6e, 0x07, 0x5b, 0x80, 0x51, + 0xec, 0xfd, 0x92, 0x7c, 0xfa, 0xd5, 0xdd, 0xc7, 0x62, 0xe4, 0x67, 0x47, 0x95, 0x3e, 0x74, 0xac, + 0x88, 0xc9, 0xc8, 0x27, 0x30, 0xbc, 0xec, 0x35, 0x91, 0x43, 0xff, 0x29, 0x38, 0x48, 0x22, 0x36, + 0x26, 0xd8, 0xe4, 0x6d, 0xf6, 0x09, 0x73, 0xd3, 0x85, 0xad, 0x41, 0xe2, 0x13, 0xdc, 0x60, 0xde, + 0x09, 0x6e, 0x28, 0x71, 0x82, 0xb3, 0x60, 0x70, 0x33, 0x68, 0x8a, 0x48, 0x24, 0x93, 0xf3, 0xe3, + 0x42, 0x70, 0x08, 0xb3, 0x79, 0x91, 0xf5, 0xdf, 0x0a, 0x30, 0x7b, 0x9f, 0x46, 0x99, 0x73, 0xc8, + 0x90, 0x4a, 0xe1, 0xa5, 0xa5, 0x52, 0x7c, 0x11, 0xa9, 0xa8, 0x5e, 0xf7, 0xe7, 0xf5, 0x7a, 0x20, + 0xaf, 0xd7, 0x83, 0xf9, 0xbd, 0xbe, 0x0f, 0x43, 0xbc, 0xab, 0xec, 0x94, 0xba, 0x1a, 0xd1, 0xc3, + 0xf8, 0x94, 0xaa, 0x7b, 0x88, 0xd9, 0xbc, 0x8c, 0x29, 0x92, 0x6b, 0x4e, 0xa8, 0x9f, 0x52, 0xc5, + 0x4f, 0xeb, 0x47, 0xf8, 0x68, 0x74, 0xcd, 0x6f, 0x3c, 0xd1, 0xac, 0x9d, 0xc3, 0xfc, 0x0b, 0x4d, + 0x5a, 0xc7, 0x19, 0x16, 0x2f, 0xb1, 0x25, 0x06, 0xb9, 0x02, 0x63, 0xab, 0xde, 0x3d, 0x3f, 0x68, + 0xd0, 0x4d, 0xaf, 0xc5, 0xb9, 0x8f, 0xd8, 0x3a, 0x48, 0x58, 0x01, 0x44, 0x0d, 0xf1, 0xd1, 0x1a, + 0x01, 0x89, 0xa3, 0x35, 0x83, 0xed, 0xce, 0xdb, 0xbc, 0x4c, 0x18, 0x19, 0xd8, 0xdf, 0xdd, 0x4e, + 0xa5, 0xea, 0xf8, 0xda, 0x0b, 0x71, 0x0f, 0xce, 0xdb, 0xb4, 0xdd, 0x72, 0x98, 0x4e, 0x77, 0xe8, + 0x73, 0x7c, 0xd5, 0xe7, 0x2b, 0x19, 0x0f, 0xbe, 0x4c, 0x7f, 0x01, 0xd5, 0xe4, 0x62, 0x97, 0x26, + 0x1f, 0xc2, 0xd5, 0xfb, 0x34, 0x32, 0x17, 0xd4, 0xd8, 0x96, 0x2a, 0x3a, 0xbf, 0x02, 0x23, 0xa1, + 0x69, 0x07, 0xbe, 0x2c, 0xaf, 0x1f, 0xb2, 0x08, 0x77, 0xef, 0xca, 0x9b, 0x12, 0xc1, 0x47, 0xfd, + 0x65, 0x7d, 0x0a, 0x95, 0xbc, 0xea, 0x4e, 0xe6, 0xce, 0xe9, 0xc2, 0x95, 0x7c, 0x06, 0xa2, 0xb9, + 0xcb, 0x20, 0x6d, 0xc6, 0xe2, 0x13, 0xea, 0xd5, 0x5a, 0xd3, 0xcc, 0x2c, 0xfe, 0xb0, 0x16, 0xa4, + 0x63, 0xdb, 0x4b, 0x34, 0xb7, 0x8e, 0xd7, 0xb1, 0x26, 0x83, 0x58, 0xae, 0x55, 0x18, 0x91, 0x30, + 0x21, 0xd7, 0xd9, 0xcc, 0x96, 0x4a, 0x81, 0x36, 0x25, 0x03, 0x45, 0x66, 0xfd, 0x48, 0x5e, 0x4d, + 0x98, 0x14, 0x27, 0x7b, 0x01, 0x79, 0x92, 0xbb, 0x08, 0xcb, 0x87, 0xf3, 0x26, 0x6f, 0xdd, 0xe4, + 0x5c, 0xd2, 0x4c, 0xce, 0xdc, 0xd2, 0x7c, 0xc5, 0x34, 0x81, 0x16, 0xc5, 0xbc, 0x8c, 0x41, 0xe4, + 0xb2, 0x6e, 0x58, 0x1e, 0x4f, 0x3f, 0xa9, 0xbc, 0x0d, 0x73, 0x59, 0x15, 0x6a, 0xe7, 0x40, 0x65, + 0xbd, 0x14, 0xfa, 0xce, 0x12, 0x5c, 0x96, 0xb1, 0x80, 0x7c, 0x3f, 0x0a, 0xa3, 0xc0, 0x69, 0xd7, + 0x1a, 0x81, 0xdb, 0x8e, 0xa9, 0x2c, 0x18, 0xe2, 0x10, 0x21, 0x09, 0x7e, 0xcd, 0xc3, 0x71, 0x44, + 0x89, 0xf5, 0x9b, 0x05, 0xb0, 0x0c, 0x1f, 0x24, 0x1c, 0xe7, 0xad, 0xc0, 0x7f, 0xea, 0x36, 0xb5, + 0xab, 0x95, 0xb7, 0x0c, 0xb3, 0x1e, 0x7f, 0x12, 0x97, 0x74, 0x7f, 0x16, 0x6b, 0xe6, 0xed, 0x84, + 0xa9, 0x8d, 0x2b, 0x9e, 0xe8, 0x97, 0x64, 0x06, 0x5d, 0x51, 0x26, 0xb8, 0xff, 0x51, 0x80, 0x6b, + 0x5d, 0xdb, 0x20, 0xfa, 0xb3, 0x07, 0xa5, 0x64, 0x99, 0x98, 0x41, 0x15, 0xcd, 0x27, 0x21, 0xcd, + 0x61, 0xf7, 0x0e, 0xf7, 0xb1, 0x96, 0xbe, 0x3b, 0x6d, 0xc5, 0x39, 0xc5, 0xef, 0xf4, 0xad, 0x27, + 0x1f, 0x00, 0x6c, 0xfb, 0x91, 0xd3, 0x5a, 0x44, 0x03, 0x40, 0x7f, 0xec, 0x2f, 0x1f, 0x31, 0x68, + 0x3d, 0x19, 0xa4, 0x40, 0x43, 0xb6, 0x3e, 0xc3, 0xef, 0x3a, 0xbb, 0xd1, 0x27, 0xfb, 0xd4, 0x16, + 0xe1, 0x5a, 0xe2, 0x5e, 0xfc, 0x05, 0x98, 0x44, 0x30, 0xc3, 0xc4, 0xcf, 0x74, 0xef, 0xfb, 0x81, + 0xdf, 0x69, 0xff, 0x72, 0x46, 0xfd, 0xcf, 0x0a, 0xdc, 0x51, 0x51, 0xaf, 0x56, 0x0c, 0xf4, 0x22, + 0x40, 0x0c, 0x4d, 0x38, 0xac, 0xab, 0x82, 0xdd, 0x3b, 0xfc, 0xc8, 0x8d, 0x16, 0xf3, 0x7d, 0xce, + 0x40, 0x23, 0xfb, 0xe5, 0x8e, 0xe4, 0x5d, 0xbc, 0x0c, 0x57, 0xb5, 0x9f, 0x4c, 0xee, 0xef, 0x49, + 0xfb, 0xc7, 0x29, 0xe9, 0x0e, 0x60, 0x9a, 0xad, 0x00, 0xd5, 0x4e, 0x74, 0xe0, 0x07, 0x6e, 0x24, + 0x9f, 0x5e, 0x90, 0x2d, 0xf1, 0xb6, 0x9b, 0x53, 0x7d, 0xfc, 0x8b, 0xa3, 0xca, 0xfb, 0xa7, 0x89, + 0xd2, 0x28, 0x79, 0x6e, 0xab, 0xf7, 0xe0, 0xd6, 0x2c, 0xf4, 0x2f, 0xda, 0x6b, 0xb8, 0xe0, 0xd9, + 0x6b, 0x6a, 0xc1, 0xb3, 0xd7, 0xac, 0xbf, 0x29, 0x42, 0x85, 0x47, 0x9f, 0x40, 0x1f, 0x8a, 0xd8, + 0x6a, 0xa1, 0x39, 0x65, 0x9c, 0xd4, 0xc0, 0x90, 0x88, 0x2e, 0x51, 0x3c, 0x49, 0x74, 0x89, 0x5f, + 0x83, 0x1c, 0x93, 0xd5, 0x09, 0xac, 0x00, 0x6f, 0x1e, 0x1f, 0x55, 0xae, 0xc5, 0x56, 0x00, 0x5e, + 0x9a, 0x65, 0x0e, 0xc8, 0xa9, 0x22, 0x6d, 0xbf, 0x18, 0x78, 0x01, 0xfb, 0xc5, 0x6d, 0x18, 0xc6, + 0xc3, 0xcc, 0xea, 0x96, 0xf0, 0x6a, 0xc4, 0xe9, 0x89, 0xf1, 0x64, 0xea, 0xae, 0x1e, 0xbc, 0x4d, + 0xa2, 0x59, 0x7f, 0xbf, 0x08, 0x57, 0xf2, 0x65, 0x2e, 0xda, 0xb6, 0x04, 0x10, 0x7b, 0x6f, 0x74, + 0xf3, 0x16, 0xc1, 0x6f, 0xe7, 0x19, 0xdd, 0x53, 0xde, 0x5a, 0x1a, 0x1d, 0xd3, 0x7d, 0xe4, 0x43, + 0xdf, 0xc4, 0x55, 0x81, 0xf1, 0xfe, 0x57, 0xc4, 0x1e, 0x15, 0x20, 0x23, 0xf6, 0xa8, 0x80, 0x91, + 0x3d, 0x98, 0xdd, 0x0a, 0xdc, 0xa7, 0x4e, 0x44, 0x1f, 0xd2, 0xe7, 0xfc, 0x21, 0xcc, 0xb2, 0x78, + 0xfd, 0xc2, 0x5f, 0x6f, 0x5f, 0x3f, 0x3e, 0xaa, 0xbc, 0xd6, 0xe6, 0x28, 0x18, 0x5f, 0x8a, 0x3f, + 0x3d, 0xac, 0xa7, 0x1f, 0xc4, 0xe4, 0x31, 0xb2, 0xfe, 0x4d, 0x01, 0x2e, 0xa0, 0x5a, 0x2e, 0xcc, + 0xae, 0xb2, 0xf2, 0x17, 0x72, 0x1a, 0xd4, 0x3b, 0x28, 0xe6, 0x22, 0x3a, 0x0d, 0x1a, 0x0f, 0xa1, + 0x6d, 0x03, 0x8d, 0xac, 0xc2, 0x98, 0xf8, 0x8d, 0xdf, 0x5f, 0x3f, 0x1e, 0x08, 0x66, 0xb4, 0x05, + 0x0b, 0xa7, 0x3a, 0x37, 0x15, 0xe1, 0xc4, 0x16, 0xcc, 0xf0, 0xbd, 0xa0, 0xad, 0xd3, 0x5a, 0x3f, + 0x2f, 0xc2, 0xc5, 0x5d, 0x1a, 0xb8, 0x8f, 0x9f, 0xe7, 0x74, 0x66, 0x13, 0xa6, 0x25, 0x88, 0x47, + 0xa0, 0x30, 0x3e, 0x31, 0x1e, 0x7d, 0x50, 0x36, 0x55, 0x84, 0xb0, 0x90, 0x5f, 0x5c, 0x26, 0xe1, + 0x29, 0xdc, 0x01, 0xdf, 0x81, 0x91, 0x44, 0x0c, 0x18, 0x1c, 0x7f, 0xf9, 0x85, 0xc6, 0x43, 0xb5, + 0xd2, 0x67, 0x2b, 0x4c, 0xf2, 0x5b, 0xf9, 0xf7, 0x37, 0xc2, 0xf4, 0xd1, 0xcb, 0xfe, 0x89, 0x1f, + 0x2c, 0xfb, 0x58, 0x1d, 0xad, 0x34, 0xe3, 0x83, 0x5d, 0xe9, 0xb3, 0xf3, 0x6a, 0x5a, 0x18, 0x83, + 0xd1, 0x2a, 0xde, 0x49, 0xb1, 0x93, 0xfb, 0x7f, 0x2f, 0xc2, 0x65, 0xf9, 0xa8, 0x25, 0x47, 0xcc, + 0x5f, 0xc0, 0xac, 0x04, 0x55, 0xdb, 0x4c, 0x61, 0xa0, 0x4d, 0x53, 0xd2, 0x3c, 0x02, 0xa8, 0x94, + 0xb4, 0x23, 0x70, 0x62, 0x61, 0xe7, 0x91, 0xbf, 0x1a, 0xeb, 0xe7, 0x27, 0x59, 0x11, 0x79, 0xd0, + 0x0a, 0xa9, 0xaf, 0x99, 0x86, 0x68, 0x8c, 0xf5, 0xb3, 0x99, 0xb2, 0x9e, 0x0e, 0xbc, 0xac, 0xf5, + 0x74, 0xa5, 0x2f, 0x69, 0x3f, 0x5d, 0x98, 0x84, 0xf1, 0x0d, 0xfa, 0x2c, 0x96, 0xfb, 0xff, 0x5d, + 0x48, 0x44, 0x1a, 0x60, 0x1a, 0x06, 0x0f, 0x39, 0x50, 0x88, 0x83, 0xba, 0x60, 0xa4, 0x01, 0x5d, + 0xc3, 0xe0, 0xa8, 0xab, 0x30, 0xcc, 0x2f, 0x6a, 0x9b, 0x27, 0x38, 0xe1, 0xab, 0xd7, 0x29, 0xfc, + 0xc9, 0x60, 0x93, 0x1f, 0xf6, 0x05, 0xbd, 0xf5, 0x10, 0xae, 0x0a, 0xff, 0x65, 0x73, 0xf0, 0xb1, + 0xa2, 0x53, 0x6e, 0x5f, 0x96, 0x03, 0x97, 0xef, 0xd3, 0xe4, 0xd2, 0x63, 0xbc, 0xde, 0xf9, 0x14, + 0xce, 0x18, 0x70, 0xc5, 0x11, 0xb5, 0x52, 0x35, 0x87, 0x14, 0xeb, 0x24, 0xb6, 0x75, 0x25, 0xab, + 0x0a, 0xbd, 0xb1, 0x16, 0xc5, 0x50, 0x9e, 0x41, 0x7c, 0xc5, 0x16, 0x9e, 0x62, 0xd5, 0xbb, 0xae, + 0x7d, 0xd7, 0x7c, 0xc5, 0xe3, 0xb1, 0xde, 0xe4, 0xce, 0xab, 0x4a, 0xad, 0x09, 0xe3, 0x2e, 0xc0, + 0x9a, 0x84, 0x71, 0x59, 0xd4, 0xa2, 0x61, 0x68, 0xfd, 0x74, 0x10, 0x2c, 0x21, 0xd8, 0xac, 0xdb, + 0x67, 0x29, 0x8f, 0xbd, 0x54, 0x63, 0xc5, 0x46, 0x75, 0x4e, 0x8f, 0x20, 0x19, 0x97, 0xf2, 0x99, + 0x87, 0x7a, 0x5e, 0x23, 0x86, 0x1a, 0x33, 0x2f, 0xd5, 0xfb, 0x1f, 0xe4, 0x2c, 0x93, 0xfc, 0x63, + 0x7b, 0xfd, 0xf8, 0xa8, 0x72, 0x35, 0x67, 0x99, 0x34, 0xf8, 0x66, 0x2f, 0x99, 0xb6, 0x79, 0x25, + 0xd2, 0xff, 0x22, 0x57, 0x22, 0xec, 0x8b, 0xd4, 0x2f, 0x45, 0x76, 0x4c, 0x59, 0x8a, 0xef, 0x51, + 0x5e, 0x69, 0xeb, 0x45, 0xe2, 0xc1, 0xbf, 0x06, 0x31, 0xb8, 0x1a, 0x6c, 0x88, 0x0b, 0x25, 0xcd, + 0x66, 0xb9, 0x78, 0x40, 0x1b, 0x4f, 0x84, 0xad, 0x58, 0x5e, 0xe8, 0x66, 0xd9, 0xcc, 0x79, 0x34, + 0x61, 0xfe, 0x9d, 0xf3, 0x82, 0x7a, 0x83, 0x91, 0xea, 0x01, 0x0b, 0x92, 0x6c, 0xc9, 0x4f, 0x60, + 0x4a, 0x0d, 0x75, 0xc2, 0xfd, 0x68, 0x6c, 0xfe, 0xb5, 0x38, 0xf0, 0xe4, 0xe1, 0x63, 0xe7, 0xe6, + 0xd3, 0x3b, 0x37, 0x33, 0x70, 0xf9, 0x3b, 0xf8, 0x86, 0x2c, 0xd0, 0x7c, 0x8f, 0xf4, 0x8b, 0xae, + 0x2c, 0x42, 0xed, 0x3a, 0xfb, 0xef, 0x29, 0x67, 0x79, 0xa6, 0x2f, 0xb8, 0x2d, 0x2a, 0x5e, 0xbd, + 0xc8, 0xd9, 0x97, 0x73, 0x15, 0x57, 0xf8, 0x96, 0xaf, 0xe2, 0xfe, 0xb8, 0x28, 0x9f, 0x08, 0xa4, + 0x6f, 0x43, 0x4f, 0x7d, 0x23, 0x97, 0xd9, 0x83, 0x13, 0x6d, 0xa6, 0x99, 0x8d, 0x23, 0x0b, 0xf2, + 0x3e, 0x53, 0xc5, 0x86, 0x9a, 0x54, 0x77, 0x03, 0x71, 0x81, 0x71, 0xc5, 0x89, 0xaa, 0x8b, 0x46, + 0x95, 0xbc, 0x2c, 0xeb, 0x7f, 0xf9, 0xcb, 0xb2, 0x7f, 0x31, 0x0a, 0x67, 0xb7, 0x9c, 0x7d, 0xd7, + 0x63, 0x8b, 0xb6, 0x4d, 0x43, 0xbf, 0x13, 0x34, 0x28, 0xa9, 0xc2, 0xa4, 0xe9, 0xff, 0xd9, 0xc3, + 0xbb, 0x95, 0xed, 0x4b, 0x26, 0x8c, 0xcc, 0xc3, 0xa8, 0x7a, 0x73, 0x2a, 0x36, 0x93, 0x8c, 0xb7, + 0xa8, 0x2b, 0x7d, 0x76, 0x8c, 0x46, 0x3e, 0x30, 0xee, 0x77, 0xce, 0xa8, 0xe7, 0xd3, 0x88, 0x3b, + 0xcf, 0x1d, 0xf4, 0x3c, 0xbf, 0x69, 0x6e, 0x88, 0xfc, 0x12, 0xe3, 0x47, 0xa9, 0x2b, 0x9f, 0x41, + 0xa3, 0xc5, 0x29, 0xbb, 0x17, 0xea, 0x02, 0xb9, 0xe1, 0x9c, 0x33, 0x2e, 0x83, 0xbe, 0x82, 0xb1, + 0x87, 0x9d, 0x3d, 0x2a, 0x2f, 0xb7, 0x86, 0xc4, 0xfe, 0x98, 0xf4, 0x6a, 0x16, 0xe5, 0xbb, 0x77, + 0xf9, 0x18, 0x3c, 0xe9, 0xec, 0xd1, 0x74, 0x9c, 0x70, 0xb6, 0x30, 0x69, 0xcc, 0xc8, 0x01, 0x94, + 0x92, 0x0e, 0xc8, 0x22, 0x9a, 0x5a, 0x17, 0xb7, 0x69, 0x0c, 0xe5, 0xa1, 0x45, 0x23, 0xe7, 0x6e, + 0x91, 0x46, 0x25, 0x29, 0xae, 0xe4, 0xd7, 0x61, 0x26, 0xd3, 0xea, 0xa8, 0x9e, 0x50, 0x75, 0x37, + 0x68, 0xe2, 0xa2, 0x9e, 0x90, 0x9a, 0x7c, 0xaf, 0x65, 0xd4, 0x9c, 0x5d, 0x0b, 0x69, 0xc2, 0x99, + 0x84, 0x63, 0xad, 0x48, 0xb9, 0x90, 0xef, 0xaa, 0x8b, 0x1b, 0x93, 0x8c, 0x5a, 0x9a, 0x59, 0x57, + 0x92, 0x25, 0x59, 0x83, 0x51, 0x75, 0xdc, 0xc7, 0xd7, 0x59, 0xd9, 0xa6, 0x8d, 0xf2, 0xf1, 0x51, + 0x65, 0x3a, 0x36, 0x6d, 0x18, 0x3c, 0x63, 0x06, 0xe4, 0x37, 0xe0, 0xaa, 0x9a, 0xa2, 0x9b, 0x41, + 0xb6, 0x11, 0x48, 0x44, 0x3b, 0xbf, 0x91, 0x9c, 0xe1, 0x79, 0xf8, 0xbb, 0x77, 0x16, 0x8a, 0xe5, + 0xc2, 0x4a, 0x9f, 0xdd, 0x9b, 0x35, 0xf9, 0x69, 0x01, 0xce, 0xe5, 0xd4, 0x3a, 0x8e, 0xb5, 0xf6, + 0xb4, 0xcc, 0xa1, 0x72, 0x8f, 0xcf, 0x86, 0xdc, 0x66, 0xfc, 0xbc, 0x4e, 0x9a, 0xe8, 0x8c, 0x7e, + 0xe7, 0xd4, 0x44, 0xde, 0x86, 0x21, 0x3c, 0x23, 0x87, 0xe5, 0x09, 0xd4, 0x22, 0x31, 0x82, 0x0d, + 0x9e, 0xa4, 0xf5, 0x7d, 0x43, 0xe0, 0x90, 0x15, 0xa6, 0x8d, 0xe1, 0xbe, 0x25, 0xb5, 0x27, 0x11, + 0xef, 0x4a, 0x68, 0xf4, 0xbc, 0x48, 0x46, 0xb9, 0x30, 0xc2, 0xda, 0x9b, 0x64, 0x0b, 0x00, 0x23, + 0x81, 0x58, 0x95, 0x1e, 0x0c, 0x8c, 0x0c, 0x94, 0x06, 0xf9, 0x87, 0x23, 0x3d, 0xb6, 0x7f, 0x7b, + 0x84, 0x3f, 0xef, 0xdc, 0xf1, 0xdc, 0xc7, 0x6e, 0xbc, 0x80, 0xe9, 0xd6, 0xb5, 0x38, 0xbf, 0x8c, + 0xd0, 0x7d, 0x73, 0x32, 0xc9, 0x28, 0x43, 0x5c, 0xb1, 0xa7, 0x21, 0xee, 0xae, 0x76, 0x65, 0xa5, + 0x85, 0x88, 0xe4, 0x3a, 0x8e, 0x69, 0xf8, 0x8a, 0xef, 0xb2, 0xbe, 0x86, 0x21, 0x8c, 0xea, 0xc8, + 0xef, 0x03, 0xc7, 0xe6, 0x6f, 0x8a, 0x65, 0xbb, 0x4b, 0xf3, 0x79, 0x18, 0x48, 0xf1, 0x64, 0x9b, + 0x4b, 0x1c, 0x01, 0x86, 0xc4, 0x11, 0x42, 0xb6, 0x61, 0x6a, 0x2b, 0xa0, 0x4d, 0xe1, 0x37, 0xdc, + 0x0e, 0x84, 0x71, 0x82, 0x9b, 0x3d, 0x70, 0xcb, 0x6f, 0xcb, 0xe2, 0x3a, 0x55, 0xe5, 0xfa, 0x86, + 0x9a, 0x41, 0x4e, 0x96, 0x61, 0xb2, 0x46, 0x9d, 0xa0, 0x71, 0xf0, 0x90, 0x3e, 0x67, 0xea, 0x8e, + 0x91, 0x52, 0x21, 0xc4, 0x12, 0xd6, 0x5f, 0x2c, 0xd2, 0x7d, 0x3c, 0x4c, 0x22, 0xf2, 0x19, 0x0c, + 0xd5, 0xfc, 0x20, 0x5a, 0x78, 0x2e, 0x16, 0x35, 0x79, 0x63, 0xc4, 0x81, 0x0b, 0xe7, 0x65, 0x5a, + 0x89, 0xd0, 0x0f, 0xa2, 0xfa, 0x9e, 0x11, 0x12, 0x89, 0xa3, 0x90, 0xe7, 0x30, 0x6d, 0x2e, 0x28, + 0xc2, 0x9d, 0x75, 0x44, 0xa8, 0x59, 0x59, 0xab, 0x16, 0x47, 0x59, 0xb8, 0x2e, 0xb8, 0x5f, 0x49, + 0x2e, 0x5b, 0x8f, 0xb1, 0x5c, 0x8f, 0x52, 0x94, 0x45, 0x4f, 0xd6, 0x31, 0x1f, 0x07, 0xef, 0x51, + 0x35, 0xe4, 0x6e, 0xb0, 0xa3, 0x71, 0xd0, 0xad, 0x0e, 0x2e, 0x4a, 0x28, 0x09, 0x27, 0x4c, 0x26, + 0x71, 0xb1, 0x53, 0xa4, 0x64, 0x0b, 0xce, 0xee, 0x84, 0x74, 0x2b, 0xa0, 0x4f, 0x5d, 0xfa, 0x4c, + 0xf2, 0x83, 0x38, 0x42, 0x11, 0xe3, 0xd7, 0xe6, 0xa5, 0x59, 0x0c, 0xd3, 0xc4, 0xe4, 0x03, 0x80, + 0x2d, 0xd7, 0xf3, 0x68, 0x13, 0xaf, 0x1d, 0xc7, 0x90, 0x15, 0x9a, 0x54, 0xdb, 0x08, 0xad, 0xfb, + 0x5e, 0x4b, 0x17, 0xa9, 0x86, 0x4c, 0x16, 0x60, 0x62, 0xd5, 0x6b, 0xb4, 0x3a, 0xc2, 0x3d, 0x20, + 0xc4, 0x05, 0x45, 0x44, 0x4e, 0x73, 0x79, 0x41, 0x3d, 0xf5, 0x91, 0x9b, 0x24, 0xe4, 0x21, 0x10, + 0x01, 0x10, 0xb3, 0xd6, 0xd9, 0x6b, 0x51, 0xf1, 0xb9, 0xa3, 0xa9, 0x44, 0x32, 0xc2, 0xe9, 0x6e, + 0x04, 0x24, 0x4b, 0x91, 0xcd, 0x7d, 0x00, 0x63, 0xda, 0x9c, 0xcf, 0x88, 0x41, 0x30, 0xad, 0xc7, + 0x20, 0x18, 0xd5, 0x63, 0x0d, 0xfc, 0xa3, 0x02, 0x5c, 0xcc, 0xfe, 0x96, 0x84, 0x02, 0xb6, 0x09, + 0xa3, 0x0a, 0xa8, 0x5e, 0x9d, 0x48, 0xd5, 0x3f, 0xa1, 0x01, 0xf1, 0x0f, 0x5a, 0xae, 0x3c, 0x7a, + 0xef, 0x63, 0x1e, 0x2f, 0x60, 0x8f, 0xff, 0x7f, 0x46, 0x60, 0x1a, 0xbd, 0xab, 0x93, 0xeb, 0xd4, + 0xa7, 0x18, 0x4b, 0x04, 0x61, 0x9a, 0x79, 0x59, 0x58, 0x9a, 0x38, 0x3c, 0x19, 0xf8, 0xca, 0x20, + 0x20, 0xef, 0xea, 0x3e, 0x11, 0x45, 0x2d, 0xff, 0x87, 0x04, 0xea, 0x5d, 0x88, 0x9d, 0x25, 0xde, + 0x32, 0xae, 0xe4, 0x4f, 0xbc, 0xe8, 0x0d, 0x9c, 0x74, 0xd1, 0xdb, 0x51, 0x8b, 0x1e, 0x8f, 0x51, + 0xf1, 0xa6, 0xb6, 0xe8, 0xbd, 0xfa, 0xd5, 0x6e, 0xe8, 0x55, 0xaf, 0x76, 0xc3, 0x2f, 0xb7, 0xda, + 0x8d, 0xbc, 0xe0, 0x6a, 0x77, 0x0f, 0x26, 0x37, 0x28, 0x6d, 0x6a, 0x17, 0x25, 0xa3, 0xf1, 0xee, + 0xe9, 0x51, 0x34, 0x81, 0x65, 0xdd, 0x96, 0x24, 0xa8, 0x72, 0x57, 0x4d, 0xf8, 0xbb, 0x59, 0x35, + 0xc7, 0x5e, 0xf1, 0xaa, 0x39, 0xfe, 0x32, 0xab, 0x66, 0x6a, 0xe9, 0x9b, 0x38, 0xf5, 0xd2, 0xf7, + 0x32, 0xab, 0xd5, 0x27, 0xe8, 0x52, 0x58, 0xab, 0xad, 0x08, 0xef, 0x11, 0xcd, 0x5d, 0x63, 0xc5, + 0x0f, 0xa5, 0xc7, 0x35, 0xfe, 0xcd, 0x60, 0x5b, 0x7e, 0x20, 0xaf, 0xbc, 0xf1, 0x6f, 0x6b, 0x01, + 0x1d, 0x09, 0x75, 0x7a, 0xe5, 0xae, 0x3f, 0x2c, 0x9e, 0xec, 0x89, 0x35, 0x2e, 0x79, 0x8c, 0xb2, + 0x65, 0xb9, 0xf5, 0x57, 0x05, 0x7e, 0x29, 0xf9, 0xbf, 0xe3, 0x52, 0xf9, 0x32, 0x17, 0x85, 0xbf, + 0x15, 0x3f, 0xe5, 0x17, 0x61, 0x07, 0x02, 0xa7, 0xf1, 0x24, 0xbe, 0xa9, 0xfd, 0x21, 0xfb, 0xce, + 0xf5, 0x02, 0x0c, 0xac, 0x1a, 0x9f, 0x15, 0xcd, 0xc2, 0xdd, 0x3b, 0x72, 0x01, 0x10, 0x11, 0x0d, + 0x38, 0xd8, 0x5c, 0x00, 0x74, 0x02, 0xf4, 0x95, 0x3b, 0x63, 0xd9, 0xfc, 0x25, 0x7a, 0x66, 0x0b, + 0xde, 0x4b, 0xbf, 0xa5, 0xc6, 0xc3, 0x48, 0xfc, 0x96, 0x5a, 0x17, 0x63, 0xfc, 0xaa, 0x7a, 0x07, + 0x2e, 0xd8, 0xf4, 0xd0, 0x7f, 0x4a, 0x5f, 0x2d, 0xdb, 0x1f, 0xc0, 0x79, 0x93, 0x21, 0x7f, 0x75, + 0xc3, 0x03, 0xa2, 0x7f, 0x92, 0x1d, 0x46, 0x5d, 0x10, 0xf0, 0x30, 0xea, 0x3c, 0x1a, 0x33, 0xfb, + 0x53, 0xdf, 0x37, 0xb0, 0xcc, 0xf2, 0xe1, 0xa2, 0xc9, 0xbc, 0xda, 0x6c, 0x62, 0xb6, 0xc5, 0x86, + 0xdb, 0x76, 0xbc, 0x88, 0x6c, 0xc2, 0x98, 0xf6, 0x33, 0x61, 0x2a, 0xd0, 0x4a, 0x84, 0x4e, 0x13, + 0x03, 0x8c, 0x10, 0x9c, 0x31, 0xd8, 0xa2, 0x50, 0x49, 0x8a, 0x87, 0x89, 0x4c, 0xaf, 0x73, 0x01, + 0x26, 0xb4, 0x9f, 0xca, 0x64, 0x89, 0x1f, 0xbf, 0x56, 0x83, 0x29, 0x30, 0x93, 0xc4, 0x6a, 0xc0, + 0x5c, 0x96, 0xd0, 0x30, 0x3a, 0xd3, 0x73, 0xb2, 0x1c, 0xc7, 0x79, 0xea, 0xed, 0x6d, 0x77, 0x26, + 0x2f, 0xc6, 0x93, 0xf5, 0xff, 0x0f, 0xc0, 0x05, 0x31, 0x18, 0xaf, 0x72, 0xc4, 0xc9, 0x8f, 0x60, + 0x4c, 0x1b, 0x63, 0x21, 0xf4, 0x2b, 0x32, 0xf4, 0x66, 0xde, 0x5c, 0xe0, 0x26, 0x8d, 0x0e, 0x02, + 0xea, 0x89, 0xe1, 0x5e, 0xe9, 0xb3, 0x75, 0x96, 0xa4, 0x05, 0x93, 0xe6, 0x40, 0x0b, 0xab, 0xce, + 0xb5, 0xcc, 0x4a, 0x4c, 0x54, 0x19, 0xc8, 0xb9, 0x59, 0xcf, 0x1c, 0xee, 0x95, 0x3e, 0x3b, 0xc1, + 0x9b, 0x7c, 0x03, 0x67, 0x53, 0xa3, 0x2c, 0x8c, 0x75, 0x6f, 0x64, 0x56, 0x98, 0xc2, 0xe6, 0xe6, + 0xd8, 0x00, 0xc1, 0xb9, 0xd5, 0xa6, 0x2b, 0x21, 0x4d, 0x18, 0xd7, 0x07, 0x5e, 0x98, 0x9d, 0xae, + 0x76, 0x11, 0x25, 0x47, 0xe4, 0xca, 0x9d, 0x90, 0x25, 0x8e, 0xfd, 0x73, 0xd3, 0xc4, 0x6c, 0x20, + 0x8f, 0xc0, 0x10, 0xff, 0xcd, 0x96, 0x80, 0xad, 0x80, 0x86, 0xd4, 0x6b, 0x50, 0xc3, 0x41, 0xfb, + 0x25, 0x97, 0x80, 0x7f, 0x5d, 0x80, 0x72, 0x16, 0xdf, 0x1a, 0xf5, 0x9a, 0x64, 0x0b, 0x4a, 0xc9, + 0x8a, 0xc4, 0xac, 0xb6, 0x54, 0xac, 0xdc, 0xdc, 0x26, 0xad, 0xf4, 0xd9, 0x29, 0x6a, 0xb2, 0x01, + 0x67, 0x35, 0x98, 0x30, 0xae, 0x16, 0x4f, 0x62, 0x5c, 0x65, 0xa3, 0x90, 0x22, 0xd5, 0x6d, 0xd3, + 0x2b, 0xb8, 0x33, 0x2e, 0xf9, 0x87, 0x8e, 0xeb, 0x31, 0x45, 0x57, 0x0b, 0xf5, 0x04, 0x31, 0x54, + 0xc8, 0x86, 0x5b, 0x5b, 0x11, 0x2a, 0x1f, 0x94, 0x28, 0x14, 0xeb, 0x63, 0x5c, 0xc1, 0x85, 0x8d, + 0x8e, 0x3f, 0x4f, 0x55, 0xcc, 0xae, 0xc0, 0xe0, 0xf6, 0x5a, 0x6d, 0xb1, 0x2a, 0x1e, 0xbb, 0xf2, + 0x10, 0x09, 0xad, 0xb0, 0xde, 0x70, 0x6c, 0x5e, 0x60, 0x7d, 0x04, 0xe4, 0x3e, 0x8d, 0x44, 0xb0, + 0x76, 0x45, 0xf7, 0x3a, 0x0c, 0x0b, 0x90, 0xa0, 0x44, 0xd7, 0xb8, 0x96, 0xc0, 0x92, 0x65, 0xd6, + 0x96, 0x3c, 0x27, 0xb4, 0xa8, 0x13, 0x6a, 0x1b, 0xf3, 0xfb, 0x30, 0x12, 0x08, 0x98, 0xd8, 0x97, + 0x27, 0x55, 0x5a, 0x0b, 0x04, 0x73, 0x7b, 0xb6, 0xc4, 0xb1, 0xd5, 0x5f, 0xd6, 0x1a, 0x86, 0x33, + 0xd9, 0x5c, 0x5d, 0x5a, 0x64, 0x52, 0x15, 0xc2, 0x92, 0xc3, 0x71, 0x0b, 0x7d, 0xc8, 0x23, 0xaa, + 0x3f, 0x75, 0x45, 0xd1, 0xe0, 0x47, 0x2e, 0x82, 0xf8, 0x68, 0x28, 0xd6, 0x5d, 0x15, 0x1c, 0x25, + 0x83, 0x5b, 0x5e, 0x7a, 0x86, 0x0d, 0x0c, 0xfb, 0x72, 0x1f, 0xdd, 0x65, 0x5e, 0x45, 0x23, 0x1c, + 0x98, 0xe3, 0xdb, 0x3c, 0xeb, 0x95, 0x48, 0x40, 0xe7, 0xab, 0xa5, 0x71, 0x11, 0x46, 0x15, 0x4c, + 0xdd, 0x7d, 0x71, 0x59, 0x19, 0xf8, 0xbb, 0x77, 0xf9, 0xab, 0xe0, 0x86, 0x62, 0x10, 0xd3, 0xb1, + 0x2a, 0xf8, 0x77, 0xf7, 0x2d, 0x57, 0x11, 0xd2, 0x20, 0xfa, 0x56, 0xab, 0x88, 0xe3, 0x02, 0x9d, + 0xa6, 0x0a, 0x03, 0x7f, 0x77, 0xfe, 0x24, 0x82, 0xfa, 0x96, 0xab, 0x60, 0x82, 0xfa, 0xf6, 0xaa, + 0xa0, 0x32, 0x80, 0x12, 0x9f, 0xa4, 0xa9, 0x4a, 0x96, 0xd3, 0x95, 0x48, 0xc3, 0x75, 0x82, 0xa2, + 0xeb, 0x78, 0x50, 0xb8, 0xc8, 0x85, 0xf5, 0x4b, 0xa8, 0x86, 0x09, 0xec, 0xdb, 0xad, 0xe6, 0x1f, + 0x14, 0x78, 0x38, 0xa7, 0xda, 0xa6, 0x96, 0xfa, 0xd1, 0x7b, 0xec, 0x6b, 0x57, 0xf3, 0xda, 0xd7, + 0xfe, 0xd0, 0xf5, 0x9a, 0xfa, 0xd5, 0xbc, 0xd3, 0x89, 0x0e, 0x54, 0xb8, 0xe3, 0x27, 0xae, 0xd7, + 0xb4, 0x93, 0xd8, 0xe4, 0x03, 0x98, 0xd0, 0x40, 0x4a, 0x5b, 0xe3, 0x39, 0x23, 0x74, 0x72, 0xb7, + 0x69, 0x9b, 0x98, 0xd6, 0xdf, 0x16, 0x60, 0x2a, 0x23, 0x29, 0x31, 0x1a, 0x33, 0xf0, 0x14, 0xa4, + 0x16, 0x2a, 0x91, 0x30, 0x09, 0x23, 0x4b, 0x18, 0x9b, 0xa4, 0x42, 0xc4, 0x68, 0xf9, 0x5a, 0x02, + 0xe5, 0xa2, 0x96, 0xba, 0x2b, 0x3b, 0x69, 0xb2, 0x8e, 0x4e, 0x42, 0x80, 0xb8, 0x25, 0xc2, 0x6c, + 0x5c, 0x63, 0x2a, 0xad, 0x96, 0x7d, 0xf9, 0x95, 0xa4, 0x7f, 0xd6, 0xaa, 0xb1, 0x7e, 0xab, 0x08, + 0xe7, 0x32, 0xfa, 0x5f, 0xa3, 0xd1, 0xdf, 0x85, 0x08, 0x12, 0x39, 0xb0, 0xfb, 0x7f, 0x49, 0x39, + 0xb0, 0xad, 0x7f, 0x5f, 0x84, 0x73, 0x3b, 0xed, 0x10, 0x5f, 0x58, 0xad, 0x7a, 0x4f, 0xa9, 0x17, + 0xf9, 0xc1, 0x73, 0x7c, 0x15, 0x42, 0xde, 0x85, 0xc1, 0x15, 0xda, 0x6a, 0xf9, 0x62, 0xfe, 0x5f, + 0x92, 0xde, 0x11, 0x49, 0x6c, 0x44, 0x5a, 0xe9, 0xb3, 0x39, 0x36, 0xf9, 0x00, 0x46, 0x57, 0xa8, + 0x13, 0x44, 0x7b, 0xd4, 0x91, 0x47, 0x16, 0x99, 0xc9, 0x42, 0x23, 0x11, 0x08, 0x2b, 0x7d, 0x76, + 0x8c, 0x4d, 0xe6, 0xd9, 0x69, 0xde, 0xdb, 0x57, 0xaf, 0xc9, 0x73, 0x2a, 0x64, 0x38, 0x2b, 0x7d, + 0x36, 0xe2, 0x92, 0x75, 0x98, 0xa8, 0xee, 0x53, 0x2f, 0x5a, 0xa7, 0x91, 0xd3, 0x74, 0x22, 0x47, + 0xa8, 0xb6, 0xaf, 0xe7, 0x11, 0x1b, 0xc8, 0x2b, 0x7d, 0xb6, 0x49, 0x4d, 0x3e, 0x82, 0xe1, 0xfb, + 0xbe, 0xdf, 0xdc, 0x7b, 0x4e, 0x85, 0xba, 0x5a, 0xc9, 0x63, 0x24, 0xd0, 0x56, 0xfa, 0x6c, 0x49, + 0xb1, 0x30, 0x08, 0xfd, 0xeb, 0xe1, 0xbe, 0x75, 0x54, 0x80, 0xf2, 0x92, 0xff, 0xcc, 0xcb, 0x94, + 0xea, 0xf7, 0x4c, 0xa9, 0x4a, 0xf6, 0x19, 0xf8, 0x09, 0xb9, 0xbe, 0x03, 0x03, 0x5b, 0xae, 0xb7, + 0x9f, 0x50, 0x05, 0x33, 0xe8, 0x18, 0x16, 0x8a, 0xc7, 0xf5, 0xf6, 0xc9, 0x9a, 0xd4, 0xc1, 0x85, + 0xad, 0xb1, 0xdf, 0x50, 0xfc, 0x33, 0xa8, 0x75, 0xec, 0x58, 0xd7, 0xe6, 0xbf, 0x65, 0x07, 0xdf, + 0x82, 0xd9, 0x9c, 0x7a, 0xc5, 0xf3, 0x70, 0xd6, 0xb7, 0x01, 0x54, 0x6c, 0xde, 0x84, 0x99, 0xcc, + 0xf1, 0x4b, 0x21, 0xfe, 0x93, 0xac, 0x89, 0xc8, 0x7b, 0x5e, 0x86, 0x61, 0x99, 0x2d, 0x89, 0xdb, + 0x7e, 0xe4, 0x4f, 0x7c, 0x20, 0x25, 0x3f, 0x54, 0x19, 0xd8, 0x43, 0x7e, 0x8f, 0xbb, 0x5a, 0x20, + 0x25, 0xfe, 0x39, 0x7d, 0xf8, 0x12, 0x1f, 0x8d, 0xe2, 0xc5, 0xea, 0x5c, 0xf1, 0xc3, 0xc8, 0x53, + 0x9e, 0xb7, 0xb6, 0xfa, 0x4d, 0x6e, 0x40, 0x49, 0xa6, 0x73, 0x10, 0x79, 0x63, 0x44, 0xc6, 0x6e, + 0x3b, 0x05, 0x27, 0xef, 0xc3, 0x6c, 0x12, 0x26, 0x7b, 0xc9, 0x5f, 0xb8, 0xe5, 0x15, 0x5b, 0x7f, + 0x59, 0xc4, 0x58, 0xd7, 0x5d, 0xe6, 0x35, 0x93, 0xee, 0x66, 0x4d, 0x48, 0xab, 0xb8, 0x59, 0x23, + 0x17, 0x61, 0x74, 0xb3, 0x66, 0xa4, 0x9c, 0xb2, 0x63, 0x00, 0x6b, 0x36, 0xeb, 0x42, 0x35, 0x68, + 0x1c, 0xb8, 0x11, 0x6d, 0x44, 0x9d, 0x40, 0xac, 0xc2, 0x76, 0x0a, 0x4e, 0x2c, 0x18, 0xbf, 0xdf, + 0x72, 0xf7, 0x1a, 0x92, 0x19, 0x17, 0x81, 0x01, 0x23, 0x6f, 0xc0, 0xe4, 0xaa, 0x17, 0x46, 0x4e, + 0xab, 0xb5, 0x4e, 0xa3, 0x03, 0xbf, 0x29, 0x92, 0x66, 0xda, 0x09, 0x28, 0xab, 0x77, 0xd1, 0xf7, + 0x22, 0xc7, 0xf5, 0x68, 0x60, 0x77, 0xbc, 0xc8, 0x3d, 0xa4, 0xa2, 0xef, 0x29, 0x38, 0x79, 0x07, + 0x66, 0x14, 0x6c, 0x33, 0x68, 0x1c, 0xd0, 0x30, 0x0a, 0x30, 0x11, 0x1d, 0x06, 0xfc, 0xb1, 0xb3, + 0x0b, 0xb1, 0x86, 0x96, 0xdf, 0x69, 0x2e, 0x7b, 0x4f, 0xdd, 0xc0, 0xf7, 0x30, 0x37, 0xc5, 0x88, + 0xa8, 0x21, 0x01, 0xb7, 0xfe, 0x70, 0x24, 0xf3, 0xb3, 0x7d, 0x99, 0x39, 0xf8, 0x25, 0x8c, 0x2f, + 0x3a, 0x6d, 0x67, 0xcf, 0x6d, 0xb9, 0x91, 0xab, 0x32, 0x76, 0xbd, 0xdb, 0xe3, 0x9b, 0x97, 0x09, + 0x3e, 0x68, 0x53, 0x27, 0xb6, 0x0d, 0x56, 0x73, 0x7f, 0x33, 0x04, 0x33, 0x99, 0x78, 0xe4, 0xba, + 0x48, 0xed, 0xa5, 0xd6, 0x55, 0x91, 0xec, 0xca, 0x4e, 0x82, 0xd9, 0x58, 0x22, 0x68, 0xb1, 0x45, + 0x1d, 0xaf, 0x23, 0x52, 0x5d, 0xd9, 0x06, 0x8c, 0x8d, 0x25, 0xd3, 0x1b, 0x34, 0x66, 0xe8, 0x38, + 0x6d, 0x27, 0xa0, 0xe4, 0x0a, 0x8c, 0x31, 0x88, 0x64, 0x35, 0xc0, 0x9f, 0xf8, 0x69, 0x20, 0xc6, + 0x69, 0xc3, 0x6f, 0x52, 0x8d, 0xd3, 0x20, 0xe7, 0x64, 0x42, 0x19, 0x27, 0x06, 0x91, 0x9c, 0x86, + 0x38, 0x27, 0x0d, 0x44, 0x5e, 0x83, 0x89, 0x6a, 0xbb, 0xad, 0x31, 0xc2, 0x1c, 0x57, 0xb6, 0x09, + 0x24, 0x97, 0x01, 0xaa, 0xed, 0xb6, 0x64, 0x83, 0xf9, 0xab, 0x6c, 0x0d, 0x42, 0x6e, 0xc6, 0xe1, + 0xca, 0x34, 0x56, 0x78, 0x9d, 0x60, 0x67, 0x94, 0x30, 0xb9, 0xaa, 0xd8, 0x4e, 0x82, 0x29, 0x70, + 0xb9, 0x26, 0xc0, 0xe4, 0x63, 0x38, 0x9f, 0xf0, 0xbb, 0xd0, 0x2a, 0x40, 0x53, 0xbf, 0x9d, 0x8f, + 0x40, 0xde, 0x83, 0x73, 0x89, 0x42, 0x59, 0x1d, 0x5a, 0xf5, 0xed, 0x9c, 0x52, 0xf2, 0x21, 0x94, + 0x13, 0xcf, 0xb6, 0xe3, 0x4a, 0xd1, 0x82, 0x6f, 0xe7, 0x96, 0xb3, 0xaf, 0x2b, 0xf1, 0xfe, 0x4b, + 0x54, 0x89, 0x97, 0x95, 0x76, 0x76, 0x21, 0x59, 0x81, 0x4a, 0xa6, 0x2f, 0x8b, 0x56, 0x31, 0xe6, + 0xe5, 0xb2, 0x7b, 0xa1, 0x91, 0x05, 0xb8, 0x98, 0x89, 0x22, 0x9b, 0x81, 0xd9, 0xba, 0xec, 0xae, + 0x38, 0x64, 0x1e, 0xa6, 0x63, 0x9f, 0x1e, 0xad, 0x09, 0x98, 0xa8, 0xcb, 0xce, 0x2c, 0x23, 0x6f, + 0x9b, 0x8f, 0xf3, 0x79, 0x65, 0x98, 0xa7, 0xcb, 0x4e, 0x17, 0x58, 0xc7, 0x05, 0xb8, 0x98, 0xb9, + 0x51, 0x4a, 0x7d, 0x7e, 0x2e, 0xa9, 0x38, 0x6a, 0x6b, 0xc1, 0x0d, 0x18, 0x40, 0x05, 0x9f, 0xdb, + 0x8a, 0xa5, 0xaf, 0x29, 0xd2, 0x73, 0x56, 0xac, 0xd4, 0x46, 0x1c, 0x72, 0x5f, 0xdd, 0x0d, 0xf6, + 0xa3, 0x25, 0xe3, 0x56, 0x52, 0x81, 0xca, 0xa8, 0x5c, 0xbf, 0x23, 0x94, 0xb7, 0x81, 0x2f, 0x73, + 0x0d, 0xf3, 0x97, 0x05, 0xa8, 0xf4, 0xd0, 0x0f, 0x54, 0x9f, 0x0a, 0x27, 0xe8, 0xd3, 0x03, 0xd5, + 0x27, 0xfe, 0x36, 0x76, 0xfe, 0x64, 0x3a, 0xc8, 0xab, 0xee, 0x56, 0x07, 0x48, 0x5a, 0x0d, 0x25, + 0xdf, 0x85, 0xd1, 0x5a, 0x6d, 0xc5, 0x70, 0xe8, 0x4b, 0x5d, 0x0e, 0xc5, 0x18, 0xe4, 0xf6, 0x89, + 0x3c, 0xf8, 0x34, 0xff, 0x3d, 0x6b, 0x09, 0xca, 0x79, 0x1a, 0x24, 0x2e, 0x2c, 0x3c, 0xb6, 0x96, + 0x76, 0xb1, 0xc4, 0x17, 0x16, 0x13, 0x6c, 0xbd, 0x07, 0xe7, 0x14, 0x35, 0x4f, 0xda, 0xa1, 0x3d, + 0xfc, 0x17, 0xc7, 0x4e, 0x15, 0x60, 0x20, 0x06, 0x58, 0x7f, 0x31, 0x90, 0x22, 0xac, 0x75, 0x0e, + 0x0f, 0x9d, 0xe0, 0x39, 0xa9, 0x9a, 0x84, 0xfd, 0x3d, 0x35, 0xfd, 0x85, 0x81, 0x9f, 0x1d, 0x55, + 0xfa, 0x34, 0xee, 0x6c, 0x39, 0xc6, 0x8d, 0xdd, 0x6b, 0x50, 0x7e, 0x25, 0x55, 0xe4, 0xc1, 0x8d, + 0x0c, 0x20, 0xd9, 0x85, 0x09, 0xb1, 0x65, 0xe2, 0x6f, 0x39, 0xb5, 0x6f, 0x27, 0xa7, 0xb6, 0xd1, + 0xbc, 0x9b, 0x06, 0x09, 0x9f, 0x04, 0x26, 0x1b, 0xf2, 0x25, 0x4c, 0x4a, 0x05, 0x49, 0x30, 0xe6, + 0x4e, 0x44, 0x77, 0xba, 0x33, 0x36, 0x69, 0x38, 0xe7, 0x04, 0x23, 0xd6, 0x64, 0xb9, 0xc6, 0x70, + 0xce, 0x83, 0x27, 0x69, 0xb2, 0x41, 0x22, 0x9a, 0x6c, 0xc0, 0xe6, 0x3e, 0x03, 0x92, 0xee, 0x57, + 0xaf, 0x59, 0x3c, 0xa1, 0xcd, 0xe2, 0xb9, 0x2a, 0x4c, 0x65, 0x74, 0xe0, 0x54, 0x2c, 0x3e, 0x03, + 0x92, 0x6e, 0xe9, 0x69, 0x38, 0x58, 0xd7, 0xe1, 0x0d, 0x25, 0x02, 0x35, 0x1b, 0x0c, 0x9e, 0xd2, + 0xf0, 0xfc, 0x9b, 0x45, 0xa8, 0xf4, 0x40, 0x25, 0x7f, 0x50, 0x48, 0x4a, 0x9b, 0xcf, 0xc6, 0x0f, + 0x92, 0xd2, 0xce, 0xa6, 0xcf, 0x10, 0xfb, 0xc2, 0x87, 0x3f, 0xfd, 0xeb, 0x17, 0x56, 0xf8, 0xd3, + 0x43, 0x76, 0x7a, 0x69, 0x0d, 0xe8, 0xd2, 0xb2, 0x61, 0xda, 0x38, 0x2a, 0x9d, 0x64, 0xcf, 0xb8, + 0x0c, 0x20, 0x52, 0x7c, 0xae, 0xf9, 0xfb, 0x42, 0x3d, 0xd3, 0x20, 0xd6, 0x3d, 0x98, 0x49, 0xf0, + 0x14, 0xc6, 0xf0, 0xef, 0x82, 0x7a, 0xe0, 0x8d, 0x4c, 0xfb, 0x17, 0xce, 0xfe, 0xe2, 0xa8, 0x32, + 0xc1, 0x34, 0xe9, 0x9b, 0x71, 0xfc, 0x78, 0xf9, 0x97, 0xb5, 0xae, 0x9b, 0xf3, 0xab, 0x2d, 0x3d, + 0xf0, 0x0d, 0xb9, 0x03, 0x43, 0x1c, 0x92, 0x88, 0xd2, 0xac, 0x63, 0x8b, 0x35, 0x41, 0x20, 0x5a, + 0x33, 0xf8, 0x1c, 0x15, 0x7f, 0x54, 0xe3, 0xf0, 0x09, 0xd6, 0x0e, 0xcf, 0x5a, 0x12, 0x83, 0x55, + 0x24, 0xe8, 0x81, 0x6a, 0x1c, 0xe6, 0x41, 0xfa, 0x5e, 0x48, 0x3c, 0xcf, 0x7f, 0xd6, 0xa2, 0x4d, + 0x9e, 0x11, 0x6e, 0x61, 0x5c, 0xf8, 0x5e, 0x0c, 0x38, 0x8c, 0x01, 0x92, 0x59, 0x9f, 0xc2, 0x0c, + 0xdb, 0xa0, 0x83, 0x64, 0x7d, 0x98, 0xab, 0x80, 0xc1, 0x4c, 0x87, 0x76, 0x87, 0x81, 0xd0, 0xa1, + 0x5d, 0x14, 0x5a, 0x6b, 0x70, 0x9e, 0x1b, 0x03, 0xf5, 0x2e, 0xc5, 0xa6, 0xf7, 0x41, 0xfc, 0x9d, + 0x78, 0xcc, 0x98, 0xd1, 0x7b, 0x8e, 0x67, 0x7d, 0x82, 0xaf, 0x65, 0xc4, 0x24, 0x75, 0x7d, 0x2f, + 0xb6, 0xfc, 0x9d, 0xec, 0x79, 0xed, 0xff, 0x09, 0x17, 0xab, 0xed, 0x36, 0xf5, 0x9a, 0x31, 0xe1, + 0x76, 0xe0, 0x9c, 0x30, 0xf8, 0x01, 0xa9, 0xc2, 0x20, 0x62, 0xab, 0x7b, 0x4b, 0xd1, 0xdc, 0x8c, + 0xe6, 0x20, 0x9e, 0x08, 0xdb, 0x89, 0x15, 0x70, 0x4a, 0xab, 0x09, 0xb3, 0xb5, 0xce, 0xde, 0xa1, + 0x1b, 0xa1, 0x1b, 0x3c, 0x06, 0x10, 0x91, 0x75, 0xaf, 0xca, 0x44, 0x53, 0x5c, 0x18, 0xd7, 0xe3, + 0x57, 0x15, 0xe8, 0x49, 0x2f, 0x82, 0x8a, 0x3c, 0xbd, 0x73, 0x33, 0x26, 0x45, 0xab, 0x07, 0xaf, + 0x05, 0x8b, 0x45, 0x32, 0x2a, 0x6b, 0x0a, 0xce, 0xea, 0x77, 0x40, 0x7c, 0x86, 0xcc, 0xc0, 0x94, + 0x79, 0xb7, 0xc3, 0xc1, 0x5f, 0xc3, 0x34, 0xb7, 0x3d, 0xf3, 0xb0, 0xdb, 0xf3, 0x71, 0x84, 0xe9, + 0xe2, 0xee, 0x7c, 0xc2, 0xff, 0x1e, 0xdd, 0x72, 0x55, 0x42, 0x85, 0xdd, 0x79, 0xfe, 0xe2, 0xf1, + 0xe9, 0xbc, 0x71, 0x83, 0x58, 0xdc, 0x9d, 0x5f, 0x18, 0x16, 0xe1, 0x4b, 0x19, 0x77, 0x3e, 0xfc, + 0xdf, 0x0a, 0xf7, 0x79, 0x7c, 0x64, 0xbf, 0x42, 0x1d, 0x7c, 0x10, 0x93, 0xfd, 0x54, 0x79, 0x12, + 0x8a, 0x6e, 0x53, 0x9e, 0xd6, 0xdd, 0xa6, 0xf5, 0xa7, 0x05, 0xb8, 0xce, 0x75, 0xa0, 0x6c, 0x3a, + 0xbc, 0xe8, 0xc9, 0x21, 0x26, 0xef, 0x03, 0xcf, 0xda, 0x2e, 0x14, 0x4d, 0x4b, 0xb4, 0xbc, 0x1b, + 0x27, 0x4e, 0x40, 0xaa, 0x30, 0xae, 0x3f, 0x29, 0x39, 0x59, 0x78, 0x38, 0x7b, 0xec, 0xf0, 0xb1, + 0xa3, 0x9e, 0x99, 0x3c, 0x81, 0x0b, 0xcb, 0xdf, 0xb0, 0x09, 0x21, 0x76, 0x27, 0xa1, 0xb0, 0xc7, + 0x4f, 0x61, 0xcf, 0x6c, 0x8b, 0x19, 0x63, 0x9e, 0xa6, 0x93, 0x60, 0x76, 0x34, 0x95, 0x1b, 0x9c, + 0xd2, 0x9a, 0x47, 0x6d, 0x03, 0x66, 0xfd, 0x45, 0x01, 0x2e, 0x66, 0xd7, 0x26, 0x16, 0x96, 0x55, + 0x38, 0xbb, 0xe8, 0x78, 0xbe, 0xe7, 0x36, 0x9c, 0x56, 0xad, 0x71, 0x40, 0x9b, 0x1d, 0x15, 0xe4, + 0x54, 0xad, 0x32, 0xfb, 0xd4, 0x93, 0xe4, 0x12, 0xc5, 0x4e, 0x53, 0xb1, 0x43, 0x19, 0xbe, 0x4a, + 0xe0, 0x6b, 0x6f, 0x8b, 0x06, 0x8a, 0x1f, 0x6f, 0x59, 0x4e, 0x29, 0xb9, 0x2d, 0x8d, 0xec, 0xcd, + 0x1d, 0xcf, 0x8d, 0x14, 0x11, 0xb7, 0xae, 0x64, 0x15, 0x59, 0xff, 0xb6, 0x00, 0xe7, 0x31, 0xaf, + 0x91, 0x91, 0x29, 0x31, 0x8e, 0xf5, 0x2b, 0xc3, 0xd5, 0x16, 0x8c, 0x57, 0x16, 0x06, 0xb6, 0x19, + 0xb7, 0x96, 0xbc, 0x0d, 0x03, 0x35, 0xe9, 0x24, 0x35, 0x99, 0x48, 0x43, 0x2b, 0x53, 0xfe, 0xfb, + 0x41, 0x64, 0x23, 0x16, 0xdb, 0x73, 0x96, 0x68, 0xd8, 0xa0, 0x1e, 0xe6, 0x0b, 0xe6, 0x87, 0x7d, + 0x0d, 0x12, 0x87, 0x2a, 0x1a, 0xc8, 0x0b, 0x55, 0x34, 0x68, 0x86, 0x2a, 0xb2, 0x9e, 0xf2, 0xac, + 0x46, 0xc9, 0x0e, 0x89, 0x41, 0xfa, 0x24, 0x95, 0x5e, 0x98, 0xef, 0x03, 0xe7, 0xb2, 0x7a, 0xb6, + 0x7b, 0x37, 0x95, 0x39, 0x38, 0x3f, 0xb6, 0xee, 0x16, 0xbc, 0x66, 0xe0, 0x56, 0x5b, 0x2d, 0xff, + 0x19, 0x6d, 0x6e, 0x05, 0xfe, 0xa1, 0x1f, 0x19, 0x59, 0x5d, 0x44, 0x7e, 0xed, 0xf8, 0x1a, 0x45, + 0xcc, 0xca, 0x04, 0xd8, 0xfa, 0x3f, 0xe0, 0xf5, 0x1e, 0x1c, 0x45, 0xa7, 0x6a, 0x70, 0xd6, 0x49, + 0x94, 0x49, 0x6f, 0x97, 0xd7, 0xb3, 0xfa, 0x95, 0x64, 0x14, 0xda, 0x69, 0xfa, 0x1b, 0xdb, 0x46, + 0x4a, 0x5e, 0x52, 0x86, 0xe9, 0x2d, 0x7b, 0x73, 0x69, 0x67, 0x71, 0xbb, 0xbe, 0xfd, 0xe5, 0xd6, + 0x72, 0x7d, 0x67, 0xe3, 0xe1, 0xc6, 0xe6, 0xa3, 0x0d, 0x1e, 0x9c, 0xda, 0x28, 0xd9, 0x5e, 0xae, + 0xae, 0x97, 0x0a, 0x64, 0x1a, 0x4a, 0x06, 0x78, 0x79, 0x67, 0xa1, 0x54, 0xbc, 0xf1, 0xb5, 0x91, + 0x6a, 0x96, 0x5c, 0x84, 0x72, 0x6d, 0x67, 0x6b, 0x6b, 0xd3, 0x56, 0x5c, 0xf5, 0xd0, 0xd8, 0x33, + 0x70, 0xd6, 0x28, 0xbd, 0x67, 0x2f, 0x2f, 0x97, 0x0a, 0xac, 0x29, 0x06, 0x78, 0xcb, 0x5e, 0x5e, + 0x5f, 0xdd, 0x59, 0x2f, 0x15, 0x6f, 0xd4, 0xf5, 0xa7, 0x5d, 0xe4, 0x02, 0xcc, 0x2e, 0x2d, 0xef, + 0xae, 0x2e, 0x2e, 0x67, 0xf1, 0x9e, 0x86, 0x92, 0x5e, 0xb8, 0xbd, 0xb9, 0xbd, 0xc5, 0x59, 0xeb, + 0xd0, 0x47, 0xcb, 0x0b, 0xd5, 0x9d, 0xed, 0x95, 0x8d, 0x52, 0xbf, 0x35, 0x30, 0x52, 0x2c, 0x15, + 0x6f, 0xfc, 0xc8, 0x78, 0xf7, 0xc5, 0x9a, 0x2f, 0xd0, 0x77, 0x6a, 0xd5, 0xfb, 0xf9, 0x55, 0xf0, + 0xd2, 0xf5, 0x7b, 0xd5, 0x52, 0x81, 0x5c, 0x82, 0xf3, 0x06, 0x74, 0xab, 0x5a, 0xab, 0x3d, 0xda, + 0xb4, 0x97, 0xd6, 0x96, 0x6b, 0xb5, 0x52, 0xf1, 0xc6, 0xae, 0x11, 0x9e, 0x8d, 0xd5, 0xb0, 0x7e, + 0xaf, 0x5a, 0xb7, 0x97, 0x3f, 0xdf, 0x59, 0xb5, 0x97, 0x97, 0xd2, 0x35, 0x18, 0xa5, 0x5f, 0x2e, + 0xd7, 0x4a, 0x05, 0x32, 0x05, 0x67, 0x0c, 0xe8, 0xc6, 0x66, 0xa9, 0x78, 0xe3, 0x0d, 0x11, 0xc1, + 0x8b, 0x4c, 0x02, 0x2c, 0x2d, 0xd7, 0x16, 0x97, 0x37, 0x96, 0x56, 0x37, 0xee, 0x97, 0xfa, 0xc8, + 0x04, 0x8c, 0x56, 0xd5, 0xcf, 0xc2, 0x8d, 0x0f, 0xe1, 0x4c, 0xe2, 0x44, 0xcd, 0x30, 0xd4, 0x61, + 0xb4, 0xd4, 0x87, 0xe2, 0x97, 0x3f, 0xd1, 0xac, 0xc9, 0x0f, 0xc7, 0xa5, 0xc2, 0x8d, 0x05, 0x99, + 0xfa, 0x54, 0xfb, 0xce, 0xc9, 0x18, 0x0c, 0x2f, 0x2d, 0xdf, 0xab, 0xee, 0xac, 0x6d, 0x97, 0xfa, + 0xd8, 0x8f, 0x45, 0x7b, 0xb9, 0xba, 0xbd, 0xbc, 0x54, 0x2a, 0x90, 0x51, 0x18, 0xac, 0x6d, 0x57, + 0xb7, 0x97, 0x4b, 0x45, 0x32, 0x02, 0x03, 0x3b, 0xb5, 0x65, 0xbb, 0xd4, 0x3f, 0xff, 0x47, 0x7f, + 0x50, 0xe0, 0xb6, 0x3d, 0xf9, 0x86, 0xe8, 0x6b, 0xed, 0x30, 0x29, 0x96, 0x3c, 0x91, 0xe7, 0x31, + 0xf7, 0xe4, 0x88, 0x5a, 0xc0, 0x5c, 0x97, 0xcb, 0x0e, 0x44, 0xb8, 0x5e, 0xb8, 0x5d, 0x20, 0x36, + 0x3a, 0x87, 0x24, 0xce, 0x56, 0x8a, 0x73, 0xf6, 0xf1, 0x77, 0xee, 0x52, 0xd7, 0x23, 0x19, 0xf9, + 0x35, 0xb0, 0x74, 0x9e, 0x39, 0x27, 0x90, 0xef, 0x9e, 0xec, 0xa4, 0x21, 0xeb, 0x7c, 0xe3, 0x64, + 0xe8, 0xe4, 0x01, 0x4c, 0x30, 0xdd, 0x5c, 0xa1, 0x91, 0x0b, 0x49, 0x42, 0xed, 0x38, 0x30, 0x77, + 0x31, 0xbb, 0x50, 0xa5, 0x62, 0x19, 0xc7, 0x8e, 0xf0, 0x83, 0x75, 0x48, 0x64, 0x94, 0x07, 0x09, + 0xe1, 0x2b, 0xfe, 0xdc, 0xd9, 0x04, 0x78, 0xf7, 0xce, 0xed, 0x02, 0xa9, 0x61, 0x88, 0x35, 0x43, + 0xc9, 0x27, 0xf2, 0x51, 0x5b, 0x5a, 0xfb, 0xe7, 0xad, 0xa9, 0xa8, 0xc4, 0x89, 0x39, 0xa7, 0x83, + 0x0d, 0x20, 0x69, 0xdd, 0x99, 0x5c, 0x89, 0xe7, 0x41, 0xb6, 0x5a, 0x3d, 0x77, 0x2e, 0xe5, 0xf3, + 0xb7, 0xcc, 0xb4, 0x27, 0xb2, 0x0c, 0x93, 0xe2, 0x09, 0xb7, 0xd0, 0xe6, 0x49, 0xb7, 0xf3, 0x40, + 0x2e, 0x9b, 0xfb, 0x28, 0x27, 0x75, 0x22, 0x20, 0x73, 0x71, 0x3f, 0x92, 0xc7, 0x84, 0xb9, 0x0b, + 0x99, 0x65, 0xa2, 0x7f, 0xf7, 0x60, 0xd2, 0x3c, 0x5c, 0x10, 0x39, 0x40, 0x99, 0x67, 0x8e, 0xdc, + 0x06, 0xd5, 0x61, 0x76, 0xdd, 0x71, 0xf1, 0x8a, 0x42, 0x78, 0x96, 0x49, 0xbf, 0x30, 0x52, 0xe9, + 0xe2, 0x28, 0x56, 0xa3, 0x5e, 0x53, 0x0d, 0x42, 0x5e, 0x58, 0x75, 0xfc, 0x6c, 0x6a, 0x52, 0x47, + 0x36, 0xfd, 0xea, 0x88, 0x65, 0x26, 0xc3, 0xcd, 0x72, 0x95, 0x9c, 0xcb, 0xf3, 0xee, 0x25, 0xeb, + 0xa8, 0xa4, 0x27, 0x38, 0x6a, 0x73, 0xe2, 0xd4, 0xec, 0xca, 0x18, 0x48, 0x40, 0x4b, 0x22, 0x2e, + 0x0a, 0x43, 0x92, 0x23, 0xb8, 0x5c, 0x66, 0xb7, 0x0b, 0xe4, 0x6b, 0xfc, 0xaa, 0x33, 0xd9, 0x3d, + 0x72, 0xa3, 0x03, 0xa1, 0xfd, 0x5c, 0xc8, 0x64, 0x20, 0x3e, 0x94, 0x2e, 0xdc, 0x6d, 0x98, 0xce, + 0x72, 0x28, 0x56, 0x02, 0xed, 0xe2, 0x6d, 0x9c, 0x3b, 0x0b, 0x6c, 0x76, 0xd4, 0x68, 0xe6, 0x0f, + 0x52, 0x17, 0x7f, 0xd6, 0x5c, 0x9e, 0x1f, 0xc3, 0x24, 0x9b, 0x25, 0x0f, 0x29, 0x6d, 0x57, 0x5b, + 0xee, 0x53, 0x1a, 0x12, 0x19, 0x1f, 0x57, 0x81, 0xf2, 0x68, 0xaf, 0x17, 0xc8, 0x77, 0x60, 0xec, + 0x91, 0x13, 0x35, 0x0e, 0x44, 0x9c, 0x48, 0x19, 0x46, 0x12, 0x61, 0x73, 0xf2, 0x17, 0x16, 0xde, + 0x2e, 0x90, 0xef, 0xc3, 0xf0, 0x7d, 0x1a, 0xe1, 0xa3, 0xe2, 0xab, 0xca, 0xb7, 0x8e, 0xdb, 0x26, + 0x57, 0x3d, 0xf5, 0x72, 0x46, 0x36, 0x38, 0x69, 0x40, 0x25, 0xb7, 0x00, 0xf8, 0x82, 0x80, 0x1c, + 0x92, 0xc5, 0x73, 0xa9, 0x66, 0x93, 0xfb, 0x4c, 0x79, 0x68, 0xd1, 0x88, 0x9e, 0xb4, 0xca, 0x3c, + 0x19, 0xad, 0xc1, 0xa4, 0xca, 0x5e, 0xb3, 0x81, 0xe1, 0x3c, 0xac, 0x04, 0xb3, 0xf0, 0x14, 0xdc, + 0x3e, 0x64, 0x5f, 0x05, 0x4f, 0xdd, 0x8a, 0x71, 0x1f, 0x70, 0x25, 0x9d, 0xd5, 0x83, 0x47, 0xe8, + 0x4b, 0xa8, 0x14, 0x22, 0x47, 0xd3, 0x68, 0x57, 0xfc, 0x30, 0x32, 0x69, 0x15, 0x24, 0x9b, 0xf6, + 0x57, 0x61, 0x4e, 0xaf, 0xd7, 0x0c, 0x54, 0x1c, 0xaf, 0xb9, 0x79, 0xf1, 0x8f, 0xe7, 0xae, 0x76, + 0xc1, 0x10, 0xe7, 0xb7, 0xfe, 0xdf, 0x2e, 0x16, 0x70, 0x39, 0x59, 0x82, 0x29, 0x59, 0xd7, 0x66, + 0x9b, 0x7a, 0xb5, 0xda, 0x0a, 0x66, 0x2a, 0x91, 0x9e, 0x1c, 0x1a, 0x4c, 0x72, 0x27, 0xe9, 0x22, + 0xb6, 0xf5, 0x19, 0xf1, 0x1d, 0x48, 0xb7, 0xa8, 0x0f, 0xf1, 0xd6, 0x97, 0x19, 0x41, 0xf7, 0x21, + 0x37, 0x2a, 0x19, 0xca, 0xff, 0xee, 0x3c, 0xe9, 0x72, 0x00, 0x9a, 0xcb, 0x39, 0x42, 0xdc, 0x2e, + 0x90, 0x2f, 0x81, 0xa4, 0x8f, 0x24, 0x4a, 0x84, 0xb9, 0xc7, 0x2f, 0x25, 0xc2, 0x2e, 0xe7, 0x99, + 0x65, 0x98, 0x52, 0xd1, 0x5d, 0xe2, 0x72, 0x92, 0xd3, 0x96, 0x2e, 0x3b, 0xd8, 0x4c, 0x06, 0x9b, + 0xdd, 0xf9, 0x2e, 0x8c, 0x32, 0xe1, 0xe4, 0x53, 0x98, 0x12, 0x73, 0xdf, 0x68, 0x4f, 0x49, 0x2d, + 0x63, 0xe2, 0x70, 0x93, 0xdb, 0x92, 0x07, 0x30, 0x53, 0x4b, 0x08, 0x9e, 0xfb, 0xb1, 0x9f, 0x37, + 0x59, 0x20, 0xb0, 0x46, 0x23, 0x2e, 0xf9, 0x6c, 0x5e, 0x0f, 0x81, 0x70, 0xdb, 0x92, 0x64, 0xf7, + 0xd4, 0xa5, 0xcf, 0xc8, 0xa5, 0x44, 0xd3, 0x19, 0x10, 0xd1, 0x70, 0x1d, 0xcc, 0xed, 0xd9, 0x36, + 0xcf, 0x5f, 0x8c, 0x50, 0xe3, 0x06, 0xfc, 0x8a, 0x41, 0x60, 0x5c, 0xa2, 0x8b, 0x71, 0x3c, 0x9f, + 0x8b, 0x41, 0x7e, 0x03, 0xa3, 0xb3, 0x76, 0x3f, 0x9d, 0x91, 0xef, 0x64, 0x1d, 0xa2, 0x73, 0xce, + 0x97, 0x73, 0x6f, 0x9f, 0x0c, 0x59, 0x9d, 0x87, 0x27, 0xee, 0xd3, 0x68, 0xab, 0xd5, 0xd9, 0x77, + 0x31, 0xb3, 0x25, 0x51, 0xb6, 0x27, 0x05, 0x12, 0xd3, 0x5b, 0x06, 0x45, 0x8b, 0x0b, 0x6a, 0xf4, + 0xc7, 0x64, 0x15, 0x4a, 0x7c, 0x1b, 0xd1, 0x58, 0x5c, 0x4a, 0xb1, 0x10, 0x28, 0x4e, 0xe0, 0x1c, + 0x86, 0xb9, 0xa3, 0x75, 0x8b, 0xbb, 0x1c, 0x11, 0xf9, 0x69, 0xeb, 0x7a, 0xea, 0x94, 0x01, 0x53, + 0x11, 0xeb, 0xd9, 0x88, 0xd8, 0x34, 0xa4, 0x91, 0x0c, 0x03, 0xc3, 0xf3, 0x9a, 0x5e, 0x8b, 0x75, + 0x86, 0x74, 0x69, 0xbc, 0x82, 0x24, 0x42, 0x96, 0xed, 0xde, 0x25, 0x2a, 0xd7, 0x6b, 0x06, 0xd3, + 0x37, 0x0c, 0xd5, 0xe6, 0x74, 0x7c, 0xdf, 0xc1, 0xad, 0x0c, 0x43, 0xdf, 0xcc, 0xc4, 0x6d, 0x63, + 0xbf, 0x25, 0xd5, 0x84, 0x46, 0xb5, 0x3b, 0x8f, 0x2b, 0x23, 0xdb, 0x6b, 0x99, 0x26, 0xdc, 0x09, + 0x02, 0xea, 0x71, 0xe2, 0x3c, 0xb5, 0x25, 0x8b, 0xfa, 0x13, 0x5c, 0xc1, 0x34, 0x6a, 0xfe, 0xdc, + 0xae, 0x17, 0x0b, 0x9e, 0x87, 0xe7, 0x76, 0x81, 0xbc, 0x0f, 0x23, 0xa2, 0x8d, 0x8c, 0xc8, 0x68, + 0x74, 0xd8, 0xa5, 0xd5, 0x48, 0x09, 0x5c, 0x48, 0xd8, 0x66, 0x13, 0x27, 0x6f, 0xf4, 0x79, 0x9b, + 0xdf, 0x67, 0x7b, 0x76, 0xf3, 0x45, 0x28, 0x17, 0xe5, 0xe6, 0x8d, 0x94, 0x65, 0x15, 0x89, 0x45, + 0x82, 0x7a, 0xec, 0xb2, 0x9c, 0x09, 0x53, 0xbf, 0x31, 0xe6, 0xa0, 0x0a, 0x1d, 0xa6, 0xd4, 0x6f, + 0x03, 0xdc, 0x6b, 0xcb, 0x5e, 0x85, 0x52, 0xb5, 0x81, 0x1b, 0x4a, 0x8d, 0x1e, 0x3a, 0xed, 0x03, + 0x3f, 0xa0, 0xea, 0xec, 0x93, 0x2c, 0x90, 0xbc, 0x66, 0x94, 0x82, 0x22, 0x0a, 0xd6, 0xa8, 0x83, + 0x81, 0x99, 0x67, 0x95, 0x86, 0x92, 0x28, 0xca, 0xa6, 0xe8, 0x72, 0xd6, 0x99, 0x5e, 0x64, 0xa7, + 0xb3, 0xd6, 0xcb, 0xb1, 0xf9, 0x10, 0x17, 0x0c, 0x85, 0x1c, 0xaa, 0x1d, 0x42, 0x81, 0xd4, 0xa9, + 0x50, 0xbe, 0xbc, 0x51, 0xa8, 0x55, 0x79, 0xf5, 0x1c, 0x8b, 0x25, 0x8f, 0x3a, 0xaf, 0xfa, 0xef, + 0xc1, 0xe4, 0x32, 0x5b, 0xd0, 0x3b, 0x4d, 0x97, 0x07, 0xa3, 0x27, 0x66, 0x74, 0xf1, 0x5c, 0xc2, + 0x15, 0x99, 0xfa, 0x0a, 0x49, 0x85, 0x05, 0x41, 0xee, 0x29, 0x1a, 0x4c, 0x8e, 0xc7, 0xb4, 0x64, + 0x2b, 0xf2, 0x01, 0xe0, 0x09, 0x5f, 0x98, 0x0c, 0x66, 0xb9, 0x62, 0x59, 0x6d, 0xb7, 0x5b, 0xd2, + 0xb2, 0xcd, 0x6f, 0xea, 0x5f, 0x37, 0x4e, 0xa2, 0xa9, 0x72, 0xc9, 0x3b, 0xad, 0x7b, 0x7e, 0xa1, + 0xa5, 0xa2, 0xcd, 0xe1, 0x99, 0x53, 0xde, 0x6b, 0x2e, 0xaa, 0xf0, 0xd1, 0xd5, 0x56, 0x2b, 0x45, + 0x1c, 0x92, 0xb7, 0x4c, 0xee, 0x59, 0x38, 0xbd, 0x6a, 0xc0, 0x93, 0x3e, 0x57, 0xde, 0xaa, 0xed, + 0x36, 0x5f, 0x2c, 0x2f, 0xab, 0x05, 0xc3, 0x2c, 0x48, 0x9f, 0xf4, 0x93, 0xe5, 0x62, 0x6d, 0x7f, + 0x80, 0xd3, 0x2c, 0xce, 0x57, 0x4b, 0xf4, 0x73, 0x73, 0x32, 0x5d, 0xaf, 0xd2, 0xe5, 0x12, 0x85, + 0x6a, 0x9f, 0x38, 0x93, 0x48, 0xdd, 0xaf, 0x0c, 0x3c, 0xa9, 0x94, 0xfe, 0x9c, 0xdf, 0xe5, 0xbc, + 0x62, 0x65, 0x70, 0x2d, 0x25, 0x73, 0x82, 0xab, 0x2e, 0xe7, 0xe4, 0x9a, 0x57, 0x5d, 0xce, 0x4d, + 0x26, 0xfe, 0x00, 0x4a, 0xc9, 0x74, 0xc4, 0x8a, 0x69, 0x4e, 0x9e, 0xe2, 0xdc, 0x31, 0xb9, 0x07, + 0xd3, 0xfa, 0x88, 0xaa, 0x7e, 0xe7, 0xad, 0xfe, 0x79, 0x7c, 0xb6, 0x61, 0x26, 0x33, 0x7b, 0xb0, + 0xda, 0x62, 0xbb, 0xe5, 0x16, 0xce, 0xe5, 0x4a, 0xe1, 0x5c, 0x76, 0x02, 0x71, 0xf2, 0x9a, 0x69, + 0x3f, 0xc8, 0x4e, 0xa7, 0x3c, 0xf7, 0x7a, 0x0f, 0x2c, 0x21, 0xd0, 0xaf, 0x71, 0x07, 0x4c, 0xd5, + 0x71, 0x55, 0xb3, 0x28, 0xe4, 0x54, 0x60, 0x75, 0x43, 0x51, 0x73, 0x60, 0x3a, 0xa3, 0x38, 0x5f, + 0xc4, 0xd7, 0xf2, 0x79, 0xc6, 0x13, 0x6b, 0x57, 0x46, 0x49, 0xce, 0x95, 0x4c, 0xd7, 0x44, 0xd3, + 0x5d, 0x8e, 0xa4, 0x73, 0x6a, 0x3e, 0x9c, 0xbc, 0xc9, 0xf9, 0xe6, 0xa5, 0xe9, 0xac, 0xf4, 0xe6, + 0x49, 0xeb, 0x4f, 0x56, 0xf6, 0x6a, 0x25, 0x86, 0xae, 0xf9, 0xd1, 0x77, 0xb9, 0x25, 0xc8, 0xe4, + 0xae, 0x5b, 0x82, 0x32, 0x59, 0x5f, 0xc9, 0x47, 0x88, 0x67, 0x84, 0x11, 0x7b, 0x5d, 0xf4, 0x5f, + 0x3f, 0x67, 0x65, 0x27, 0xb6, 0x56, 0x33, 0x22, 0x13, 0x45, 0x70, 0xb7, 0xe5, 0x47, 0x97, 0x23, + 0x96, 0x2e, 0x49, 0xbd, 0xbb, 0x1c, 0x87, 0xca, 0xf1, 0xc0, 0x25, 0x9a, 0x7d, 0xda, 0x61, 0xfb, + 0x1a, 0xce, 0xe7, 0x26, 0xf0, 0x26, 0x6f, 0xa6, 0x3e, 0xe8, 0x1c, 0x49, 0xe4, 0xb7, 0x74, 0xc2, + 0xc8, 0xbd, 0xad, 0x4c, 0x61, 0x89, 0x34, 0xdf, 0xa9, 0x15, 0x3b, 0x23, 0x07, 0xf8, 0x7d, 0xd4, + 0x7c, 0xb5, 0x3c, 0xde, 0xb9, 0x7d, 0xbd, 0x94, 0xc5, 0x27, 0x4c, 0xaf, 0xa9, 0x5a, 0xbb, 0xa4, + 0x26, 0x96, 0x2c, 0x38, 0xcd, 0x9a, 0x7a, 0x92, 0xa6, 0xe5, 0xf1, 0x59, 0x82, 0x31, 0x2d, 0x01, + 0x38, 0x39, 0x6f, 0x88, 0xc9, 0xd8, 0x25, 0xe7, 0x8c, 0xce, 0x99, 0x1b, 0xe4, 0x22, 0xda, 0x9c, + 0x55, 0x1a, 0xf1, 0xdc, 0x56, 0x5c, 0x48, 0xf3, 0x30, 0xec, 0xcd, 0x4a, 0x0a, 0xbc, 0x35, 0x17, + 0x93, 0xc2, 0x31, 0x1a, 0x94, 0xdf, 0x25, 0xa2, 0x8b, 0xa6, 0x47, 0x93, 0xf2, 0x35, 0xd4, 0x29, + 0x91, 0x65, 0x14, 0x93, 0xa1, 0xc8, 0x98, 0x7c, 0xe7, 0x94, 0xf1, 0x4c, 0x83, 0x76, 0xb1, 0x65, + 0x6c, 0xe1, 0xd3, 0x8e, 0x8c, 0x8c, 0xe8, 0x6a, 0x0d, 0xed, 0x9a, 0x30, 0x3d, 0x43, 0x3b, 0x53, + 0xab, 0x72, 0x2e, 0xc7, 0xae, 0x29, 0xd2, 0x73, 0x5b, 0xfa, 0x43, 0x6d, 0x55, 0x4e, 0xe5, 0x3d, + 0x27, 0xd7, 0x93, 0xaa, 0x59, 0x5e, 0x6a, 0xf4, 0x2e, 0xab, 0xfe, 0x74, 0x56, 0xca, 0x74, 0xcd, + 0x00, 0x9c, 0x9b, 0x4f, 0x3d, 0x43, 0x0a, 0x6a, 0x79, 0xcb, 0xe1, 0xd6, 0x25, 0x81, 0x7a, 0x6e, + 0x0b, 0xbf, 0xd2, 0x96, 0xb7, 0x44, 0xa2, 0x73, 0x75, 0xe0, 0xee, 0x91, 0x09, 0x3d, 0x97, 0xf7, + 0x06, 0x3e, 0x06, 0x4a, 0x67, 0x29, 0x57, 0xba, 0x4b, 0xb7, 0x1c, 0xe6, 0x99, 0xf6, 0xe1, 0x99, + 0x74, 0x17, 0x19, 0xbf, 0x73, 0x09, 0xeb, 0x6e, 0xaf, 0x86, 0xa9, 0x75, 0x38, 0x23, 0xbb, 0x79, + 0x62, 0x1d, 0xce, 0xcf, 0x7f, 0xde, 0xe5, 0xa0, 0x73, 0xa6, 0xe6, 0xee, 0x7b, 0x5a, 0x72, 0x72, + 0x75, 0xcc, 0x49, 0xe7, 0x4b, 0x57, 0x4b, 0x4c, 0x56, 0x2e, 0xf3, 0x4d, 0xa6, 0xe1, 0x70, 0xfd, + 0x5c, 0x4f, 0x33, 0x4d, 0xe6, 0xf2, 0xb3, 0x6b, 0xab, 0xe5, 0x26, 0x33, 0x2f, 0xb5, 0xc6, 0x50, + 0xcf, 0xf1, 0xac, 0x18, 0x66, 0xa4, 0x9b, 0x56, 0x0c, 0x33, 0x93, 0x42, 0xdf, 0x42, 0xbb, 0x8a, + 0xed, 0xb7, 0xa8, 0x6e, 0x57, 0xd1, 0x92, 0x06, 0x27, 0xcc, 0x1a, 0xe4, 0x23, 0x34, 0x6a, 0x74, + 0xb7, 0x84, 0xcc, 0x9a, 0x9c, 0x74, 0xdf, 0x91, 0x51, 0x95, 0x91, 0x59, 0x59, 0xd1, 0x93, 0x49, + 0xa1, 0xe7, 0xca, 0xe9, 0x02, 0x41, 0xff, 0xae, 0xb4, 0x8b, 0x60, 0x83, 0xcb, 0xa6, 0x3d, 0x29, + 0xbf, 0xcd, 0xef, 0x4a, 0xa3, 0x88, 0x41, 0x96, 0xca, 0xc7, 0x9c, 0x24, 0xfb, 0x1e, 0x8c, 0xc7, + 0xb9, 0x97, 0x77, 0xe7, 0x35, 0xc2, 0x44, 0x42, 0xe6, 0x24, 0xe1, 0xfb, 0xf2, 0xe2, 0x04, 0xeb, + 0x33, 0x0b, 0xbb, 0xdb, 0x4f, 0x3e, 0x91, 0x46, 0x18, 0xa3, 0xa5, 0xa9, 0x4c, 0xce, 0x5d, 0x56, + 0xee, 0x71, 0x3d, 0x61, 0xa4, 0x9a, 0x17, 0x19, 0x29, 0x5f, 0xd5, 0xbc, 0xc8, 0x4a, 0xd9, 0x1a, + 0x5f, 0x2c, 0x7c, 0x29, 0x2d, 0x0e, 0x31, 0xd3, 0x4b, 0x46, 0xb3, 0x52, 0x7c, 0x2f, 0xe7, 0x15, + 0x27, 0x59, 0xd7, 0xa0, 0x94, 0xcc, 0x6e, 0xa9, 0x8e, 0x6b, 0x39, 0x69, 0x48, 0xd5, 0x19, 0x30, + 0x37, 0x2d, 0xe6, 0x96, 0x34, 0x9f, 0x9b, 0x7c, 0xaf, 0x66, 0x37, 0x4a, 0x67, 0xdd, 0x5d, 0x2d, + 0x8b, 0x13, 0x5d, 0xea, 0x07, 0xe9, 0x54, 0x22, 0x4d, 0x5d, 0x2d, 0xcb, 0xc8, 0x8d, 0xe9, 0xca, + 0x70, 0x4e, 0xd9, 0xf9, 0xb6, 0xdf, 0x32, 0x4f, 0xb8, 0x5d, 0xa2, 0xa2, 0xf7, 0xbc, 0x64, 0x26, + 0xbf, 0x02, 0xb3, 0x39, 0x01, 0xa4, 0xc9, 0xeb, 0x09, 0x43, 0x6c, 0x76, 0x80, 0x69, 0x35, 0x41, + 0x32, 0x33, 0x50, 0xaf, 0xa3, 0x77, 0x82, 0x11, 0xb8, 0x21, 0x75, 0xe3, 0xf7, 0xc8, 0x8d, 0x0e, + 0x78, 0xa2, 0x65, 0x6d, 0xcd, 0xcd, 0x8c, 0xf8, 0x40, 0x6a, 0x78, 0x5e, 0x31, 0xa0, 0x19, 0x97, + 0x7e, 0x19, 0x0c, 0xe7, 0xb2, 0x19, 0xb2, 0xb5, 0x83, 0xcd, 0x85, 0x8c, 0xa8, 0x1a, 0x6a, 0x2e, + 0xe4, 0x47, 0xdc, 0xc8, 0x6d, 0xe6, 0x96, 0x54, 0xb0, 0xb2, 0x39, 0xe6, 0x07, 0xd8, 0xc8, 0xe5, + 0xf8, 0x80, 0x71, 0x4c, 0xc5, 0xcc, 0x20, 0x39, 0xe8, 0xdd, 0x57, 0x0f, 0x5b, 0xee, 0xd7, 0x26, + 0xd5, 0xbc, 0xd6, 0xbe, 0xbc, 0xe8, 0x1c, 0xb9, 0xed, 0x5b, 0x96, 0xdf, 0x53, 0x76, 0xfb, 0x4e, + 0xba, 0x63, 0xab, 0xeb, 0xb1, 0x44, 0xd8, 0x16, 0xa3, 0xa3, 0x1a, 0x7c, 0x2e, 0x07, 0x4e, 0x36, + 0xd0, 0xdd, 0x28, 0x09, 0xd5, 0x0e, 0xae, 0xd9, 0x71, 0x61, 0x72, 0xf9, 0xf1, 0x79, 0x6c, 0xc4, + 0xd5, 0x38, 0xcd, 0x3c, 0x4e, 0x04, 0xe4, 0x10, 0xf3, 0xd8, 0x80, 0x9e, 0x6e, 0x1e, 0x27, 0x18, + 0x9a, 0xf3, 0x38, 0xd9, 0xcc, 0xa4, 0x21, 0x20, 0x77, 0x54, 0x93, 0xcd, 0x54, 0xf3, 0x38, 0x9b, + 0x63, 0x7e, 0xfc, 0x93, 0x5c, 0x8e, 0x6a, 0x1e, 0x9b, 0x1c, 0x73, 0xd0, 0x4f, 0x38, 0x8f, 0x93, + 0x95, 0x98, 0xf3, 0xf8, 0x54, 0xed, 0x53, 0xf3, 0x38, 0xbb, 0x7d, 0xa7, 0x9e, 0xc7, 0x89, 0x80, + 0x41, 0x46, 0x47, 0xb3, 0xe6, 0x71, 0x12, 0x9f, 0xcf, 0xe3, 0x24, 0x34, 0x61, 0x80, 0xe9, 0x32, + 0x8f, 0x93, 0x94, 0x9f, 0x23, 0xbf, 0x44, 0xb0, 0x93, 0x93, 0xcc, 0xe4, 0xdc, 0x38, 0x29, 0xe4, + 0x11, 0x5a, 0xff, 0x12, 0xf0, 0x93, 0xcd, 0xe6, 0x8b, 0x79, 0x4c, 0x71, 0x3e, 0xef, 0x4a, 0x21, + 0x26, 0x9b, 0x6b, 0x9a, 0xb6, 0xb2, 0x63, 0xbd, 0x74, 0x69, 0xf0, 0x2e, 0x9b, 0x37, 0xcd, 0x2e, + 0x7c, 0xbb, 0x85, 0xaa, 0xe9, 0xc2, 0x57, 0x9d, 0x83, 0x92, 0x7c, 0x73, 0x49, 0xba, 0xcf, 0xef, + 0x2f, 0xe4, 0xfd, 0x47, 0x92, 0x6e, 0x3e, 0x71, 0xb2, 0x3a, 0x75, 0x4b, 0xd5, 0x09, 0x2b, 0xd9, + 0xd2, 0xd3, 0xce, 0xf3, 0x75, 0xa9, 0x3d, 0xa4, 0x62, 0x5c, 0x25, 0x3a, 0xad, 0xcf, 0xf5, 0xdc, + 0x12, 0xb2, 0x8d, 0xa6, 0xde, 0x34, 0x5c, 0x33, 0x13, 0xe7, 0x05, 0xd3, 0xea, 0xc9, 0x35, 0x15, + 0xad, 0x47, 0xe7, 0x9a, 0x17, 0xca, 0x47, 0x71, 0x4d, 0x53, 0x7f, 0x8a, 0xa6, 0x33, 0xf1, 0xa6, + 0xcb, 0x7b, 0xec, 0xe7, 0x9f, 0x73, 0xa6, 0x0c, 0x97, 0x28, 0x86, 0x8b, 0x9e, 0x68, 0x1f, 0x8b, + 0x0b, 0x3e, 0x09, 0xcc, 0x15, 0x7e, 0x16, 0x3d, 0xf9, 0x14, 0x4a, 0x62, 0x79, 0x8b, 0x19, 0x64, + 0x21, 0xe6, 0x0e, 0xdd, 0x82, 0xb4, 0xd8, 0x9d, 0xa0, 0x05, 0x27, 0xb1, 0xd4, 0x9d, 0x44, 0x12, + 0xf9, 0x66, 0x2d, 0xb6, 0x1d, 0x6e, 0x07, 0x9d, 0x30, 0xa2, 0xcd, 0xb4, 0x39, 0xca, 0x6c, 0x8c, + 0x74, 0x9c, 0x30, 0xd1, 0x77, 0xe7, 0xc9, 0x2a, 0xae, 0x6d, 0x26, 0xb8, 0x9b, 0xbd, 0x2e, 0x9b, + 0x0d, 0x2e, 0x3d, 0x2b, 0xea, 0xf1, 0x90, 0xd9, 0xa6, 0xbc, 0xba, 0xf3, 0x1b, 0xa5, 0x44, 0x74, + 0xc2, 0xde, 0xe5, 0x89, 0x88, 0x1f, 0xa8, 0xb9, 0xed, 0xb0, 0x97, 0x64, 0x92, 0xcf, 0x99, 0xc8, + 0x67, 0x30, 0x2a, 0x89, 0x7b, 0x0b, 0x24, 0x49, 0x8d, 0x02, 0x59, 0x82, 0x09, 0xe3, 0xad, 0x96, + 0x3a, 0xdd, 0x64, 0xbd, 0xe0, 0xea, 0x32, 0xce, 0x13, 0xc6, 0x9b, 0x2c, 0xc5, 0x25, 0xeb, 0xa5, + 0x56, 0x2e, 0x97, 0xef, 0xc3, 0x98, 0x10, 0x69, 0x57, 0x69, 0xe4, 0x1b, 0xeb, 0x66, 0x34, 0xbf, + 0xe7, 0x4e, 0xd3, 0x8d, 0x16, 0x7d, 0xef, 0xb1, 0xbb, 0xdf, 0x53, 0x30, 0x69, 0x92, 0xdd, 0x79, + 0xf2, 0x03, 0x4c, 0x4b, 0x2c, 0x93, 0x45, 0xd3, 0xe8, 0x99, 0x1f, 0x3c, 0x71, 0xbd, 0xfd, 0x1e, + 0x2c, 0xaf, 0x98, 0x2c, 0x93, 0x74, 0xd2, 0xb5, 0xe4, 0x07, 0x30, 0x57, 0xcb, 0x67, 0xde, 0x93, + 0x49, 0xf7, 0xed, 0xa5, 0x06, 0x17, 0xd1, 0xb9, 0xe6, 0xb4, 0x6d, 0xef, 0xca, 0xf4, 0x4b, 0x1e, + 0x26, 0x51, 0x1a, 0xfa, 0x1b, 0x7e, 0xd0, 0xec, 0xcd, 0xb1, 0x62, 0xba, 0xeb, 0x26, 0xc8, 0xa4, + 0x30, 0xbe, 0x84, 0xf3, 0xb5, 0x5c, 0xd6, 0xbd, 0x58, 0xf4, 0xd2, 0x24, 0x2f, 0xa0, 0x28, 0x4e, + 0xd9, 0xee, 0xae, 0x3c, 0x57, 0x71, 0x4d, 0x63, 0xfb, 0xd0, 0x56, 0x40, 0x1f, 0xd3, 0x00, 0x9d, + 0xc2, 0x7b, 0xb9, 0x43, 0x9b, 0xe8, 0xb2, 0xe7, 0xab, 0x70, 0xb6, 0x96, 0x62, 0x95, 0x47, 0xd2, + 0xbd, 0x55, 0x0f, 0x60, 0x0a, 0x7b, 0x7a, 0xc2, 0x76, 0xf5, 0x70, 0x22, 0x1a, 0xbb, 0x4f, 0xa3, + 0x9d, 0xd5, 0x1e, 0x52, 0x92, 0xaf, 0x16, 0x24, 0xe2, 0xee, 0x1d, 0x46, 0x59, 0xd3, 0x28, 0xd3, + 0x18, 0xb9, 0x1f, 0xef, 0x67, 0xf2, 0x22, 0xa5, 0x67, 0xb5, 0x79, 0x1c, 0xee, 0xe2, 0x5a, 0x28, + 0x1c, 0xa3, 0x35, 0x13, 0x24, 0x87, 0xc4, 0xa6, 0x3a, 0xcd, 0x47, 0x3a, 0x24, 0x55, 0x7e, 0xfc, + 0xe3, 0xd3, 0x43, 0xc0, 0x2e, 0xa7, 0x1c, 0xe6, 0xbb, 0xb2, 0xe0, 0x26, 0xd4, 0x35, 0xbf, 0xf1, + 0x44, 0x37, 0xa1, 0x6a, 0x89, 0xeb, 0xe7, 0xcc, 0xb4, 0xf2, 0x62, 0xc5, 0xc7, 0xdc, 0xf2, 0xba, + 0x5f, 0x98, 0x9e, 0xba, 0x5e, 0x37, 0xa1, 0x9a, 0x49, 0xf6, 0xef, 0x4a, 0xdb, 0x22, 0x56, 0x68, + 0x72, 0xce, 0x15, 0x8d, 0x32, 0x2b, 0x22, 0x91, 0x69, 0x56, 0xd4, 0x1b, 0x9a, 0x7f, 0x11, 0x40, + 0xd2, 0x59, 0xf6, 0xd5, 0x61, 0x25, 0x37, 0x01, 0x7f, 0x17, 0xf7, 0xae, 0x29, 0xe1, 0x14, 0x64, + 0x08, 0x5e, 0x85, 0x1a, 0x4e, 0x97, 0xc5, 0xa2, 0xd4, 0x7d, 0x95, 0x6e, 0x17, 0xc8, 0x06, 0x9c, + 0xbb, 0x4f, 0x23, 0xb1, 0xc6, 0xd9, 0x34, 0x8c, 0x02, 0xb7, 0x11, 0x75, 0xbd, 0x55, 0x94, 0x67, + 0x93, 0x0c, 0x9a, 0xdd, 0x77, 0x18, 0xbf, 0x5a, 0x36, 0xbf, 0xae, 0x74, 0x5d, 0x3c, 0x68, 0xc5, + 0x55, 0xc5, 0x69, 0x9a, 0x98, 0x3f, 0xc5, 0x87, 0xb9, 0x83, 0x4e, 0x3e, 0x69, 0x29, 0x8e, 0x6b, + 0x22, 0x4e, 0x5b, 0x37, 0x61, 0x88, 0x13, 0xe5, 0x6e, 0xa8, 0xe3, 0x3a, 0x0d, 0xb9, 0x03, 0xa3, + 0xca, 0xc3, 0x86, 0x18, 0x45, 0xb9, 0xed, 0xba, 0x03, 0xa3, 0xfc, 0x68, 0x75, 0x72, 0x92, 0x8f, + 0x60, 0x54, 0xb9, 0xe4, 0x9c, 0x7a, 0xa7, 0xff, 0x14, 0x26, 0x74, 0xe7, 0x9c, 0xd3, 0x0b, 0xf2, + 0xfb, 0x78, 0xf7, 0x2b, 0xaf, 0x58, 0xf2, 0xe9, 0x67, 0x12, 0xb9, 0xbc, 0x84, 0x48, 0xf9, 0x02, + 0x29, 0x81, 0xb9, 0xcd, 0x3f, 0x9b, 0xa2, 0x26, 0x1f, 0xc9, 0xf7, 0x52, 0x8a, 0x38, 0x8d, 0xd4, + 0x45, 0x66, 0x93, 0x5c, 0xcc, 0x2f, 0x42, 0xac, 0x16, 0xd8, 0x9e, 0xcd, 0x3e, 0xc9, 0x1d, 0x75, + 0x6f, 0xd1, 0xe5, 0x71, 0xd9, 0x44, 0x2d, 0x2d, 0x95, 0x65, 0x2e, 0x9f, 0xd1, 0xe5, 0xfc, 0xc4, + 0x74, 0x38, 0x18, 0x0f, 0xf0, 0x14, 0x98, 0x2a, 0xcd, 0xed, 0x5e, 0x97, 0x44, 0x77, 0xf1, 0xb1, + 0x37, 0xcd, 0xae, 0x0b, 0x59, 0xb7, 0x53, 0xb4, 0x78, 0x05, 0xfa, 0x4a, 0xd8, 0xad, 0x4a, 0x1f, + 0xc7, 0x93, 0x77, 0x36, 0xbf, 0x65, 0x17, 0x32, 0x6e, 0xc5, 0x7b, 0x8e, 0x45, 0x1e, 0xbb, 0x5f, + 0x41, 0xed, 0x30, 0x33, 0xdc, 0x57, 0x3e, 0xb3, 0xeb, 0x9a, 0x63, 0x45, 0x26, 0xa5, 0xda, 0xf4, + 0x9e, 0xe0, 0x43, 0xb4, 0xec, 0x3c, 0x7c, 0x6f, 0xf4, 0xe0, 0x22, 0x25, 0xf1, 0x66, 0x4f, 0x3c, + 0x75, 0xc7, 0x7a, 0x81, 0xef, 0xb0, 0xd9, 0xf5, 0xf5, 0xc8, 0x2b, 0x98, 0x71, 0xed, 0xad, 0x1c, + 0x48, 0xb3, 0x19, 0x9a, 0x0e, 0xa4, 0x5d, 0xfb, 0x90, 0x27, 0xfe, 0xcf, 0xa1, 0x12, 0x7b, 0x8f, + 0x9c, 0x6e, 0x10, 0xf2, 0xfd, 0x16, 0x49, 0x4a, 0x52, 0x21, 0xe9, 0x96, 0x68, 0x67, 0xee, 0x6a, + 0x9e, 0x84, 0x43, 0xcd, 0x2d, 0x49, 0xf8, 0xbd, 0x25, 0x32, 0x52, 0xe6, 0xe5, 0xb6, 0xec, 0x62, + 0x87, 0x15, 0x2f, 0xf3, 0x5e, 0x09, 0xa3, 0xf4, 0x68, 0x9f, 0x9e, 0x91, 0x72, 0xee, 0x48, 0x30, + 0xb2, 0xba, 0x0c, 0xef, 0x69, 0x7c, 0xd7, 0x92, 0x43, 0x71, 0xda, 0x01, 0x75, 0xe2, 0xd7, 0x68, + 0x89, 0xe8, 0x80, 0xfa, 0x0b, 0xe0, 0x74, 0x51, 0xf2, 0x29, 0x55, 0x16, 0x86, 0xf2, 0xa8, 0x2a, + 0xcb, 0x2a, 0x18, 0x9c, 0x1d, 0x45, 0xfc, 0xc0, 0x8d, 0x9e, 0x2f, 0xda, 0x6b, 0xb1, 0x59, 0x41, + 0x2f, 0x90, 0xbc, 0x41, 0x16, 0xda, 0x6b, 0xe4, 0x2b, 0x5c, 0x4a, 0x04, 0xfb, 0x05, 0xdf, 0x8f, + 0xc2, 0x28, 0x70, 0xda, 0xb5, 0x46, 0xe0, 0xb6, 0xa3, 0xdc, 0x4e, 0xc7, 0x2e, 0xde, 0x59, 0x64, + 0x9a, 0xc7, 0xa9, 0x88, 0x1e, 0x9f, 0x15, 0x5f, 0x47, 0xbd, 0xba, 0xc9, 0x2a, 0xec, 0x72, 0x72, + 0xa9, 0xc9, 0x78, 0xf1, 0xaf, 0x92, 0x69, 0x1d, 0x66, 0x73, 0xa2, 0x12, 0xa9, 0xdb, 0xdb, 0xee, + 0x51, 0x8b, 0xe6, 0xba, 0x57, 0x4c, 0x7e, 0x00, 0x33, 0x99, 0x61, 0x8b, 0x94, 0x05, 0xba, 0x5b, + 0x50, 0xa3, 0x5e, 0xcc, 0x9f, 0x40, 0x99, 0xbf, 0xf7, 0x40, 0xb7, 0x66, 0x23, 0x82, 0x4d, 0xfc, + 0x0a, 0x28, 0x07, 0x21, 0xb9, 0x5e, 0xe7, 0xe3, 0xa9, 0x27, 0xed, 0xd3, 0x18, 0xba, 0x24, 0x91, + 0xf0, 0x5c, 0x7d, 0x78, 0x59, 0x85, 0xdd, 0x9e, 0x1a, 0x6d, 0xc1, 0xcc, 0x2e, 0x0d, 0xdc, 0xc7, + 0xcf, 0x93, 0x0c, 0xa5, 0x64, 0x32, 0x4b, 0xbb, 0x71, 0xfc, 0x02, 0x66, 0x17, 0xfd, 0xc3, 0xb6, + 0x78, 0xd4, 0x67, 0xf0, 0x54, 0x57, 0xf1, 0xd9, 0xe5, 0xbd, 0x1d, 0xa1, 0xe6, 0xf2, 0x53, 0xd3, + 0x2b, 0xff, 0xb7, 0x9e, 0xd9, 0xeb, 0xd5, 0xd3, 0x34, 0x93, 0x7e, 0x1b, 0x27, 0x61, 0x56, 0xae, + 0x7a, 0x7d, 0x12, 0x76, 0xc9, 0x65, 0x9f, 0xf3, 0x44, 0x6c, 0x36, 0x27, 0x3d, 0x7d, 0x17, 0xae, + 0x27, 0x68, 0xed, 0x86, 0xdc, 0x5b, 0xcc, 0x44, 0xde, 0x09, 0x9f, 0xea, 0xcc, 0x2c, 0xdf, 0x99, + 0xed, 0xd4, 0x62, 0x37, 0xb4, 0x5a, 0x5d, 0x54, 0x2c, 0xa2, 0x07, 0x6f, 0x60, 0x98, 0x68, 0xc4, + 0x9f, 0xd0, 0x69, 0xbb, 0xad, 0xd6, 0x29, 0x62, 0x54, 0x6a, 0x3f, 0x84, 0xf1, 0x9a, 0x5e, 0x79, + 0x46, 0x25, 0xb9, 0x93, 0x42, 0x3d, 0x12, 0xea, 0xdd, 0xf6, 0x2e, 0x8e, 0xa4, 0x6a, 0xe3, 0x39, + 0x51, 0x2f, 0x72, 0x5d, 0x67, 0x8c, 0xac, 0x6c, 0x6a, 0x17, 0xc8, 0x4a, 0x9a, 0xa8, 0x5c, 0x67, + 0xb2, 0x13, 0xb9, 0xd5, 0x79, 0x1e, 0x99, 0x64, 0x4e, 0x4c, 0x62, 0xf5, 0x4e, 0x3e, 0xab, 0x5c, + 0xe6, 0xbb, 0x26, 0xd5, 0xe4, 0x7e, 0x3e, 0x71, 0x1e, 0x3a, 0xdd, 0xcf, 0x27, 0x95, 0xdd, 0x4e, + 0xf7, 0xf3, 0xc9, 0x48, 0x5d, 0xb7, 0x8c, 0xbc, 0xe2, 0x04, 0x3c, 0x5d, 0x8c, 0x11, 0x8a, 0x4d, + 0x46, 0x9e, 0x9f, 0x87, 0x7a, 0x08, 0x10, 0x9e, 0xb6, 0xa7, 0x8b, 0xad, 0x35, 0x19, 0xfa, 0x23, + 0x91, 0xe7, 0xe7, 0x1e, 0x94, 0x78, 0x06, 0x83, 0x38, 0x6a, 0x62, 0xec, 0x37, 0x98, 0x4e, 0xac, + 0xd0, 0x65, 0x50, 0x4b, 0xc9, 0x78, 0x73, 0xca, 0x64, 0x96, 0x13, 0x88, 0xae, 0xcb, 0x54, 0x85, + 0x38, 0xaa, 0x9c, 0x32, 0x4c, 0xa5, 0x02, 0xcd, 0xcd, 0x9d, 0xcf, 0x28, 0x51, 0x2a, 0xe5, 0xb8, + 0x1e, 0x83, 0x4e, 0x75, 0x29, 0x23, 0x30, 0xdd, 0xdc, 0x85, 0xcc, 0x32, 0xc1, 0x28, 0xe2, 0xf9, + 0x97, 0xb3, 0xb3, 0x46, 0xc7, 0xef, 0xbc, 0xba, 0xe0, 0xc8, 0x6a, 0x6e, 0x9c, 0x04, 0x55, 0xd4, + 0x4a, 0x55, 0xfa, 0xa1, 0x8c, 0x54, 0xd5, 0x6f, 0x66, 0xbc, 0xc7, 0x30, 0x30, 0x62, 0x6f, 0xb0, + 0xee, 0x79, 0xb3, 0xc9, 0x23, 0x99, 0x0e, 0x26, 0xa7, 0xa6, 0x5e, 0x0c, 0x72, 0x47, 0xf0, 0x91, + 0x4c, 0x00, 0xf3, 0xaa, 0x19, 0xef, 0xc1, 0xc5, 0xc4, 0x73, 0x0f, 0x93, 0xf1, 0x8d, 0xec, 0x37, + 0x21, 0x99, 0xe2, 0xc9, 0xd7, 0xd9, 0xaf, 0xa4, 0xdf, 0x86, 0x24, 0xc6, 0xfd, 0xb4, 0x6b, 0xde, + 0x3a, 0x4c, 0xe2, 0x32, 0x23, 0x93, 0xae, 0xc7, 0x11, 0x68, 0x4c, 0x70, 0x32, 0x14, 0x52, 0xb2, + 0x54, 0xb9, 0xcc, 0x8e, 0x8b, 0x37, 0xc3, 0x3c, 0x85, 0xfb, 0x9c, 0xf9, 0x90, 0x18, 0x81, 0x59, + 0xbb, 0x98, 0xc8, 0x0c, 0x4f, 0xbe, 0x0f, 0x67, 0xe2, 0xa7, 0xc4, 0x9c, 0x45, 0x06, 0x5a, 0x17, + 0x43, 0xd9, 0x99, 0xf8, 0x3d, 0xf1, 0xe9, 0xc9, 0x57, 0xe4, 0x56, 0x14, 0x93, 0x5f, 0x4a, 0x3d, + 0x93, 0x31, 0xfa, 0x70, 0x92, 0x1d, 0x49, 0x93, 0xed, 0x69, 0x47, 0xa7, 0x81, 0x9f, 0x5b, 0x76, + 0x70, 0x45, 0xfd, 0x73, 0xeb, 0x1a, 0x00, 0x52, 0xa9, 0xbf, 0x39, 0x7c, 0xd6, 0xe1, 0x1a, 0x06, + 0x64, 0xd9, 0xe2, 0x21, 0xf8, 0xb2, 0xb1, 0xf2, 0xdb, 0x9e, 0x0c, 0xe3, 0xd2, 0x82, 0xab, 0x3d, + 0xa3, 0x4b, 0x92, 0x5b, 0x86, 0x8b, 0x4b, 0xef, 0x38, 0x94, 0xdd, 0x9e, 0xa6, 0x65, 0x05, 0x69, + 0x54, 0xfb, 0x6c, 0x97, 0x78, 0x91, 0x6a, 0x9f, 0xed, 0x1a, 0xe5, 0xf1, 0x0b, 0xcc, 0xb1, 0x24, + 0xf6, 0x28, 0x0c, 0xb2, 0x44, 0x3d, 0x1e, 0x76, 0xba, 0xeb, 0xb5, 0xcf, 0x55, 0xf3, 0x52, 0x34, + 0x45, 0x88, 0x67, 0x9a, 0xcb, 0xe2, 0x24, 0x96, 0xc7, 0xbc, 0x37, 0x93, 0x2e, 0xae, 0xd5, 0x97, + 0xf9, 0x04, 0x3c, 0x75, 0xcb, 0x73, 0xe0, 0x0b, 0x4b, 0x3f, 0xfb, 0x4f, 0x97, 0x0b, 0x3f, 0xfb, + 0xf9, 0xe5, 0xc2, 0xbf, 0xfb, 0xf9, 0xe5, 0xc2, 0x7f, 0xfc, 0xf9, 0xe5, 0xc2, 0x57, 0xf3, 0x27, + 0x0b, 0x7e, 0xdc, 0x68, 0xb9, 0xd4, 0x8b, 0x6e, 0x71, 0x76, 0x43, 0xf8, 0xdf, 0xdd, 0xff, 0x15, + 0x00, 0x00, 0xff, 0xff, 0x3a, 0x0f, 0x03, 0x99, 0x86, 0xe8, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -17216,10 +17214,6 @@ type AuthServiceClient interface { ExportUpgradeWindows(ctx context.Context, in *ExportUpgradeWindowsRequest, opts ...grpc.CallOption) (*ExportUpgradeWindowsResponse, error) // GetClusterMaintenanceConfig gets the current maintenance window config singleton. GetClusterMaintenanceConfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.ClusterMaintenanceConfigV1, error) - // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. - GetClusterAutoUpdateConfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.ClusterAutoUpdateConfigV1, error) - // GetAutoUpdateVersion gets the current autoupdate version singleton. - GetAutoUpdateVersion(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.AutoUpdateVersionV1, error) // UpdateClusterMaintenanceConfig updates the current maintenance window config singleton. UpdateClusterMaintenanceConfig(ctx context.Context, in *types.ClusterMaintenanceConfigV1, opts ...grpc.CallOption) (*emptypb.Empty, error) // DeleteClusterMaintenanceConfig deletes the current maintenance window config singleton. @@ -19938,24 +19932,6 @@ func (c *authServiceClient) GetClusterMaintenanceConfig(ctx context.Context, in return out, nil } -func (c *authServiceClient) GetClusterAutoUpdateConfig(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.ClusterAutoUpdateConfigV1, error) { - out := new(types.ClusterAutoUpdateConfigV1) - err := c.cc.Invoke(ctx, "/proto.AuthService/GetClusterAutoUpdateConfig", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *authServiceClient) GetAutoUpdateVersion(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*types.AutoUpdateVersionV1, error) { - out := new(types.AutoUpdateVersionV1) - err := c.cc.Invoke(ctx, "/proto.AuthService/GetAutoUpdateVersion", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *authServiceClient) UpdateClusterMaintenanceConfig(ctx context.Context, in *types.ClusterMaintenanceConfigV1, opts ...grpc.CallOption) (*emptypb.Empty, error) { out := new(emptypb.Empty) err := c.cc.Invoke(ctx, "/proto.AuthService/UpdateClusterMaintenanceConfig", in, out, opts...) @@ -20636,10 +20612,6 @@ type AuthServiceServer interface { ExportUpgradeWindows(context.Context, *ExportUpgradeWindowsRequest) (*ExportUpgradeWindowsResponse, error) // GetClusterMaintenanceConfig gets the current maintenance window config singleton. GetClusterMaintenanceConfig(context.Context, *emptypb.Empty) (*types.ClusterMaintenanceConfigV1, error) - // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. - GetClusterAutoUpdateConfig(context.Context, *emptypb.Empty) (*types.ClusterAutoUpdateConfigV1, error) - // GetAutoUpdateVersion gets the current autoupdate version singleton. - GetAutoUpdateVersion(context.Context, *emptypb.Empty) (*types.AutoUpdateVersionV1, error) // UpdateClusterMaintenanceConfig updates the current maintenance window config singleton. UpdateClusterMaintenanceConfig(context.Context, *types.ClusterMaintenanceConfigV1) (*emptypb.Empty, error) // DeleteClusterMaintenanceConfig deletes the current maintenance window config singleton. @@ -21415,12 +21387,6 @@ func (*UnimplementedAuthServiceServer) ExportUpgradeWindows(ctx context.Context, func (*UnimplementedAuthServiceServer) GetClusterMaintenanceConfig(ctx context.Context, req *emptypb.Empty) (*types.ClusterMaintenanceConfigV1, error) { return nil, status.Errorf(codes.Unimplemented, "method GetClusterMaintenanceConfig not implemented") } -func (*UnimplementedAuthServiceServer) GetClusterAutoUpdateConfig(ctx context.Context, req *emptypb.Empty) (*types.ClusterAutoUpdateConfigV1, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetClusterAutoUpdateConfig not implemented") -} -func (*UnimplementedAuthServiceServer) GetAutoUpdateVersion(ctx context.Context, req *emptypb.Empty) (*types.AutoUpdateVersionV1, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAutoUpdateVersion not implemented") -} func (*UnimplementedAuthServiceServer) UpdateClusterMaintenanceConfig(ctx context.Context, req *types.ClusterMaintenanceConfigV1) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateClusterMaintenanceConfig not implemented") } @@ -26108,42 +26074,6 @@ func _AuthService_GetClusterMaintenanceConfig_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -func _AuthService_GetClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).GetClusterAutoUpdateConfig(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/proto.AuthService/GetClusterAutoUpdateConfig", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).GetClusterAutoUpdateConfig(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _AuthService_GetAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(AuthServiceServer).GetAutoUpdateVersion(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/proto.AuthService/GetAutoUpdateVersion", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AuthServiceServer).GetAutoUpdateVersion(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - func _AuthService_UpdateClusterMaintenanceConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(types.ClusterMaintenanceConfigV1) if err := dec(in); err != nil { @@ -27136,14 +27066,6 @@ var _AuthService_serviceDesc = grpc.ServiceDesc{ MethodName: "GetClusterMaintenanceConfig", Handler: _AuthService_GetClusterMaintenanceConfig_Handler, }, - { - MethodName: "GetClusterAutoUpdateConfig", - Handler: _AuthService_GetClusterAutoUpdateConfig_Handler, - }, - { - MethodName: "GetAutoUpdateVersion", - Handler: _AuthService_GetAutoUpdateVersion_Handler, - }, { MethodName: "UpdateClusterMaintenanceConfig", Handler: _AuthService_UpdateClusterMaintenanceConfig_Handler, diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go new file mode 100644 index 0000000000000..ef3e108cd2e5b --- /dev/null +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -0,0 +1,458 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: teleport/autoupdate/v1/autoupdate.proto + +package autoupdate + +import ( + v1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster +// autoupdate settings. +type ClusterAutoUpdateConfig struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + Spec *ClusterAutoUpdateConfigSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` +} + +func (x *ClusterAutoUpdateConfig) Reset() { + *x = ClusterAutoUpdateConfig{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterAutoUpdateConfig) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterAutoUpdateConfig) ProtoMessage() {} + +func (x *ClusterAutoUpdateConfig) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterAutoUpdateConfig.ProtoReflect.Descriptor instead. +func (*ClusterAutoUpdateConfig) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{0} +} + +func (x *ClusterAutoUpdateConfig) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *ClusterAutoUpdateConfig) GetSubKind() string { + if x != nil { + return x.SubKind + } + return "" +} + +func (x *ClusterAutoUpdateConfig) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *ClusterAutoUpdateConfig) GetMetadata() *v1.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *ClusterAutoUpdateConfig) GetSpec() *ClusterAutoUpdateConfigSpec { + if x != nil { + return x.Spec + } + return nil +} + +// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. +type ClusterAutoUpdateConfigSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. + ToolsAutoUpdate bool `protobuf:"varint,1,opt,name=tools_auto_update,json=toolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` +} + +func (x *ClusterAutoUpdateConfigSpec) Reset() { + *x = ClusterAutoUpdateConfigSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClusterAutoUpdateConfigSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterAutoUpdateConfigSpec) ProtoMessage() {} + +func (x *ClusterAutoUpdateConfigSpec) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterAutoUpdateConfigSpec.ProtoReflect.Descriptor instead. +func (*ClusterAutoUpdateConfigSpec) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{1} +} + +func (x *ClusterAutoUpdateConfigSpec) GetToolsAutoUpdate() bool { + if x != nil { + return x.ToolsAutoUpdate + } + return false +} + +// AutoupdateVersionV1 is a resource singleton with version required for +// tools autoupdate. +type AutoUpdateVersion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + Spec *AutoupdateVersionSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` +} + +func (x *AutoUpdateVersion) Reset() { + *x = AutoUpdateVersion{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AutoUpdateVersion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateVersion) ProtoMessage() {} + +func (x *AutoUpdateVersion) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateVersion.ProtoReflect.Descriptor instead. +func (*AutoUpdateVersion) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{2} +} + +func (x *AutoUpdateVersion) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *AutoUpdateVersion) GetSubKind() string { + if x != nil { + return x.SubKind + } + return "" +} + +func (x *AutoUpdateVersion) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *AutoUpdateVersion) GetMetadata() *v1.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *AutoUpdateVersion) GetSpec() *AutoupdateVersionSpec { + if x != nil { + return x.Spec + } + return nil +} + +// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. +type AutoupdateVersionSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // ToolsVersion is the semantic version required for tools autoupdates. + ToolsVersion string `protobuf:"bytes,1,opt,name=tools_version,json=toolsVersion,proto3" json:"tools_version,omitempty"` +} + +func (x *AutoupdateVersionSpec) Reset() { + *x = AutoupdateVersionSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AutoupdateVersionSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoupdateVersionSpec) ProtoMessage() {} + +func (x *AutoupdateVersionSpec) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoupdateVersionSpec.ProtoReflect.Descriptor instead. +func (*AutoupdateVersionSpec) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{3} +} + +func (x *AutoupdateVersionSpec) GetToolsVersion() string { + if x != nil { + return x.ToolsVersion + } + return "" +} + +var File_teleport_autoupdate_v1_autoupdate_proto protoreflect.FileDescriptor + +var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ + 0x0a, 0x27, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x01, 0x0a, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x49, 0x0a, 0x1b, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x74, + 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x22, 0x3c, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, + 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_teleport_autoupdate_v1_autoupdate_proto_rawDescOnce sync.Once + file_teleport_autoupdate_v1_autoupdate_proto_rawDescData = file_teleport_autoupdate_v1_autoupdate_proto_rawDesc +) + +func file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP() []byte { + file_teleport_autoupdate_v1_autoupdate_proto_rawDescOnce.Do(func() { + file_teleport_autoupdate_v1_autoupdate_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_autoupdate_v1_autoupdate_proto_rawDescData) + }) + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescData +} + +var file_teleport_autoupdate_v1_autoupdate_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_teleport_autoupdate_v1_autoupdate_proto_goTypes = []any{ + (*ClusterAutoUpdateConfig)(nil), // 0: teleport.autoupdate.v1.ClusterAutoUpdateConfig + (*ClusterAutoUpdateConfigSpec)(nil), // 1: teleport.autoupdate.v1.ClusterAutoUpdateConfigSpec + (*AutoUpdateVersion)(nil), // 2: teleport.autoupdate.v1.AutoUpdateVersion + (*AutoupdateVersionSpec)(nil), // 3: teleport.autoupdate.v1.AutoupdateVersionSpec + (*v1.Metadata)(nil), // 4: teleport.header.v1.Metadata +} +var file_teleport_autoupdate_v1_autoupdate_proto_depIdxs = []int32{ + 4, // 0: teleport.autoupdate.v1.ClusterAutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata + 1, // 1: teleport.autoupdate.v1.ClusterAutoUpdateConfig.spec:type_name -> teleport.autoupdate.v1.ClusterAutoUpdateConfigSpec + 4, // 2: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata + 3, // 3: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoupdateVersionSpec + 4, // [4:4] is the sub-list for method output_type + 4, // [4:4] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_teleport_autoupdate_v1_autoupdate_proto_init() } +func file_teleport_autoupdate_v1_autoupdate_proto_init() { + if File_teleport_autoupdate_v1_autoupdate_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*ClusterAutoUpdateConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*ClusterAutoUpdateConfigSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*AutoUpdateVersion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*AutoupdateVersionSpec); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_autoupdate_v1_autoupdate_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_teleport_autoupdate_v1_autoupdate_proto_goTypes, + DependencyIndexes: file_teleport_autoupdate_v1_autoupdate_proto_depIdxs, + MessageInfos: file_teleport_autoupdate_v1_autoupdate_proto_msgTypes, + }.Build() + File_teleport_autoupdate_v1_autoupdate_proto = out.File + file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = nil + file_teleport_autoupdate_v1_autoupdate_proto_goTypes = nil + file_teleport_autoupdate_v1_autoupdate_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go new file mode 100644 index 0000000000000..31c7d8b05a255 --- /dev/null +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go @@ -0,0 +1,525 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc (unknown) +// source: teleport/autoupdate/v1/autoupdate_service.proto + +package autoupdate + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + emptypb "google.golang.org/protobuf/types/known/emptypb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Request for GetClusterAutoUpdateConfig. +type GetClusterAutoUpdateConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetClusterAutoUpdateConfigRequest) Reset() { + *x = GetClusterAutoUpdateConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetClusterAutoUpdateConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetClusterAutoUpdateConfigRequest) ProtoMessage() {} + +func (x *GetClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetClusterAutoUpdateConfigRequest.ProtoReflect.Descriptor instead. +func (*GetClusterAutoUpdateConfigRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{0} +} + +// Request for UpsertClusterAutoUpdateConfig. +type UpsertClusterAutoUpdateConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Config *ClusterAutoUpdateConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` +} + +func (x *UpsertClusterAutoUpdateConfigRequest) Reset() { + *x = UpsertClusterAutoUpdateConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpsertClusterAutoUpdateConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertClusterAutoUpdateConfigRequest) ProtoMessage() {} + +func (x *UpsertClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpsertClusterAutoUpdateConfigRequest.ProtoReflect.Descriptor instead. +func (*UpsertClusterAutoUpdateConfigRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{1} +} + +func (x *UpsertClusterAutoUpdateConfigRequest) GetConfig() *ClusterAutoUpdateConfig { + if x != nil { + return x.Config + } + return nil +} + +// Request for DeleteClusterAutoUpdateConfig. +type DeleteClusterAutoUpdateConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteClusterAutoUpdateConfigRequest) Reset() { + *x = DeleteClusterAutoUpdateConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteClusterAutoUpdateConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteClusterAutoUpdateConfigRequest) ProtoMessage() {} + +func (x *DeleteClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteClusterAutoUpdateConfigRequest.ProtoReflect.Descriptor instead. +func (*DeleteClusterAutoUpdateConfigRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{2} +} + +// Request for GetAutoUpdateVersion. +type GetAutoUpdateVersionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetAutoUpdateVersionRequest) Reset() { + *x = GetAutoUpdateVersionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAutoUpdateVersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAutoUpdateVersionRequest) ProtoMessage() {} + +func (x *GetAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAutoUpdateVersionRequest.ProtoReflect.Descriptor instead. +func (*GetAutoUpdateVersionRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{3} +} + +// Request for UpsertAutoUpdateVersion. +type UpsertAutoUpdateVersionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version *AutoUpdateVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *UpsertAutoUpdateVersionRequest) Reset() { + *x = UpsertAutoUpdateVersionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpsertAutoUpdateVersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertAutoUpdateVersionRequest) ProtoMessage() {} + +func (x *UpsertAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpsertAutoUpdateVersionRequest.ProtoReflect.Descriptor instead. +func (*UpsertAutoUpdateVersionRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{4} +} + +func (x *UpsertAutoUpdateVersionRequest) GetVersion() *AutoUpdateVersion { + if x != nil { + return x.Version + } + return nil +} + +// Request for DeleteAutoUpdateVersion. +type DeleteAutoUpdateVersionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAutoUpdateVersionRequest) Reset() { + *x = DeleteAutoUpdateVersionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeleteAutoUpdateVersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAutoUpdateVersionRequest) ProtoMessage() {} + +func (x *DeleteAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteAutoUpdateVersionRequest.ProtoReflect.Descriptor instead. +func (*DeleteAutoUpdateVersionRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{5} +} + +var File_teleport_autoupdate_v1_autoupdate_service_proto protoreflect.FileDescriptor + +var file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc = []byte{ + 0x0a, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x12, 0x16, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x23, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x6f, 0x0a, 0x24, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x26, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1d, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x1e, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, + 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x87, 0x06, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x1a, + 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, + 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x8e, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x73, 0x65, 0x72, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x75, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x76, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, + 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, + 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, + 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescOnce sync.Once + file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescData = file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc +) + +func file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP() []byte { + file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescOnce.Do(func() { + file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescData) + }) + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescData +} + +var file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_teleport_autoupdate_v1_autoupdate_service_proto_goTypes = []any{ + (*GetClusterAutoUpdateConfigRequest)(nil), // 0: teleport.autoupdate.v1.GetClusterAutoUpdateConfigRequest + (*UpsertClusterAutoUpdateConfigRequest)(nil), // 1: teleport.autoupdate.v1.UpsertClusterAutoUpdateConfigRequest + (*DeleteClusterAutoUpdateConfigRequest)(nil), // 2: teleport.autoupdate.v1.DeleteClusterAutoUpdateConfigRequest + (*GetAutoUpdateVersionRequest)(nil), // 3: teleport.autoupdate.v1.GetAutoUpdateVersionRequest + (*UpsertAutoUpdateVersionRequest)(nil), // 4: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest + (*DeleteAutoUpdateVersionRequest)(nil), // 5: teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest + (*ClusterAutoUpdateConfig)(nil), // 6: teleport.autoupdate.v1.ClusterAutoUpdateConfig + (*AutoUpdateVersion)(nil), // 7: teleport.autoupdate.v1.AutoUpdateVersion + (*emptypb.Empty)(nil), // 8: google.protobuf.Empty +} +var file_teleport_autoupdate_v1_autoupdate_service_proto_depIdxs = []int32{ + 6, // 0: teleport.autoupdate.v1.UpsertClusterAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.ClusterAutoUpdateConfig + 7, // 1: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion + 0, // 2: teleport.autoupdate.v1.AutoUpdateService.GetClusterAutoUpdateConfig:input_type -> teleport.autoupdate.v1.GetClusterAutoUpdateConfigRequest + 1, // 3: teleport.autoupdate.v1.AutoUpdateService.UpsertClusterAutoUpdateConfig:input_type -> teleport.autoupdate.v1.UpsertClusterAutoUpdateConfigRequest + 2, // 4: teleport.autoupdate.v1.AutoUpdateService.DeleteClusterAutoUpdateConfig:input_type -> teleport.autoupdate.v1.DeleteClusterAutoUpdateConfigRequest + 3, // 5: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:input_type -> teleport.autoupdate.v1.GetAutoUpdateVersionRequest + 4, // 6: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:input_type -> teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest + 5, // 7: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:input_type -> teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest + 6, // 8: teleport.autoupdate.v1.AutoUpdateService.GetClusterAutoUpdateConfig:output_type -> teleport.autoupdate.v1.ClusterAutoUpdateConfig + 6, // 9: teleport.autoupdate.v1.AutoUpdateService.UpsertClusterAutoUpdateConfig:output_type -> teleport.autoupdate.v1.ClusterAutoUpdateConfig + 8, // 10: teleport.autoupdate.v1.AutoUpdateService.DeleteClusterAutoUpdateConfig:output_type -> google.protobuf.Empty + 7, // 11: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion + 7, // 12: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion + 8, // 13: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:output_type -> google.protobuf.Empty + 8, // [8:14] is the sub-list for method output_type + 2, // [2:8] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_teleport_autoupdate_v1_autoupdate_service_proto_init() } +func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { + if File_teleport_autoupdate_v1_autoupdate_service_proto != nil { + return + } + file_teleport_autoupdate_v1_autoupdate_proto_init() + if !protoimpl.UnsafeEnabled { + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*GetClusterAutoUpdateConfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*UpsertClusterAutoUpdateConfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*DeleteClusterAutoUpdateConfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*GetAutoUpdateVersionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*UpsertAutoUpdateVersionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*DeleteAutoUpdateVersionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_teleport_autoupdate_v1_autoupdate_service_proto_goTypes, + DependencyIndexes: file_teleport_autoupdate_v1_autoupdate_service_proto_depIdxs, + MessageInfos: file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes, + }.Build() + File_teleport_autoupdate_v1_autoupdate_service_proto = out.File + file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc = nil + file_teleport_autoupdate_v1_autoupdate_service_proto_goTypes = nil + file_teleport_autoupdate_v1_autoupdate_service_proto_depIdxs = nil +} diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go new file mode 100644 index 0000000000000..07e0f751d6e02 --- /dev/null +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go @@ -0,0 +1,342 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.5.1 +// - protoc (unknown) +// source: teleport/autoupdate/v1/autoupdate_service.proto + +package autoupdate + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 + +const ( + AutoUpdateService_GetClusterAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetClusterAutoUpdateConfig" + AutoUpdateService_UpsertClusterAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertClusterAutoUpdateConfig" + AutoUpdateService_DeleteClusterAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteClusterAutoUpdateConfig" + AutoUpdateService_GetAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetAutoUpdateVersion" + AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertAutoUpdateVersion" + AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteAutoUpdateVersion" +) + +// AutoUpdateServiceClient is the client API for AutoUpdateService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// AutoUpdateService provides an API to manage autoupdates. +type AutoUpdateServiceClient interface { + // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. + GetClusterAutoUpdateConfig(ctx context.Context, in *GetClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) + // UpsertClusterAutoUpdateConfig creates a new ClusterAutoUpdateConfig or replaces an existing ClusterAutoUpdateConfig. + UpsertClusterAutoUpdateConfig(ctx context.Context, in *UpsertClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) + // DeleteClusterAutoUpdateConfig hard deletes the specified ClusterAutoUpdateConfig. + DeleteClusterAutoUpdateConfig(ctx context.Context, in *DeleteClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // GetAutoUpdateVersion gets the current autoupdate version singleton. + GetAutoUpdateVersion(ctx context.Context, in *GetAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) + // UpsertAutoUpdateVersion creates a new AutoUpdateVersion or replaces an existing AutoUpdateVersion. + UpsertAutoUpdateVersion(ctx context.Context, in *UpsertAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) + // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. + DeleteAutoUpdateVersion(ctx context.Context, in *DeleteAutoUpdateVersionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) +} + +type autoUpdateServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewAutoUpdateServiceClient(cc grpc.ClientConnInterface) AutoUpdateServiceClient { + return &autoUpdateServiceClient{cc} +} + +func (c *autoUpdateServiceClient) GetClusterAutoUpdateConfig(ctx context.Context, in *GetClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ClusterAutoUpdateConfig) + err := c.cc.Invoke(ctx, AutoUpdateService_GetClusterAutoUpdateConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) UpsertClusterAutoUpdateConfig(ctx context.Context, in *UpsertClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ClusterAutoUpdateConfig) + err := c.cc.Invoke(ctx, AutoUpdateService_UpsertClusterAutoUpdateConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) DeleteClusterAutoUpdateConfig(ctx context.Context, in *DeleteClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, AutoUpdateService_DeleteClusterAutoUpdateConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) GetAutoUpdateVersion(ctx context.Context, in *GetAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoUpdateVersion) + err := c.cc.Invoke(ctx, AutoUpdateService_GetAutoUpdateVersion_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) UpsertAutoUpdateVersion(ctx context.Context, in *UpsertAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoUpdateVersion) + err := c.cc.Invoke(ctx, AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) DeleteAutoUpdateVersion(ctx context.Context, in *DeleteAutoUpdateVersionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// AutoUpdateServiceServer is the server API for AutoUpdateService service. +// All implementations must embed UnimplementedAutoUpdateServiceServer +// for forward compatibility. +// +// AutoUpdateService provides an API to manage autoupdates. +type AutoUpdateServiceServer interface { + // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. + GetClusterAutoUpdateConfig(context.Context, *GetClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) + // UpsertClusterAutoUpdateConfig creates a new ClusterAutoUpdateConfig or replaces an existing ClusterAutoUpdateConfig. + UpsertClusterAutoUpdateConfig(context.Context, *UpsertClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) + // DeleteClusterAutoUpdateConfig hard deletes the specified ClusterAutoUpdateConfig. + DeleteClusterAutoUpdateConfig(context.Context, *DeleteClusterAutoUpdateConfigRequest) (*emptypb.Empty, error) + // GetAutoUpdateVersion gets the current autoupdate version singleton. + GetAutoUpdateVersion(context.Context, *GetAutoUpdateVersionRequest) (*AutoUpdateVersion, error) + // UpsertAutoUpdateVersion creates a new AutoUpdateVersion or replaces an existing AutoUpdateVersion. + UpsertAutoUpdateVersion(context.Context, *UpsertAutoUpdateVersionRequest) (*AutoUpdateVersion, error) + // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. + DeleteAutoUpdateVersion(context.Context, *DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) + mustEmbedUnimplementedAutoUpdateServiceServer() +} + +// UnimplementedAutoUpdateServiceServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedAutoUpdateServiceServer struct{} + +func (UnimplementedAutoUpdateServiceServer) GetClusterAutoUpdateConfig(context.Context, *GetClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetClusterAutoUpdateConfig not implemented") +} +func (UnimplementedAutoUpdateServiceServer) UpsertClusterAutoUpdateConfig(context.Context, *UpsertClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpsertClusterAutoUpdateConfig not implemented") +} +func (UnimplementedAutoUpdateServiceServer) DeleteClusterAutoUpdateConfig(context.Context, *DeleteClusterAutoUpdateConfigRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteClusterAutoUpdateConfig not implemented") +} +func (UnimplementedAutoUpdateServiceServer) GetAutoUpdateVersion(context.Context, *GetAutoUpdateVersionRequest) (*AutoUpdateVersion, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAutoUpdateVersion not implemented") +} +func (UnimplementedAutoUpdateServiceServer) UpsertAutoUpdateVersion(context.Context, *UpsertAutoUpdateVersionRequest) (*AutoUpdateVersion, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpsertAutoUpdateVersion not implemented") +} +func (UnimplementedAutoUpdateServiceServer) DeleteAutoUpdateVersion(context.Context, *DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAutoUpdateVersion not implemented") +} +func (UnimplementedAutoUpdateServiceServer) mustEmbedUnimplementedAutoUpdateServiceServer() {} +func (UnimplementedAutoUpdateServiceServer) testEmbeddedByValue() {} + +// UnsafeAutoUpdateServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AutoUpdateServiceServer will +// result in compilation errors. +type UnsafeAutoUpdateServiceServer interface { + mustEmbedUnimplementedAutoUpdateServiceServer() +} + +func RegisterAutoUpdateServiceServer(s grpc.ServiceRegistrar, srv AutoUpdateServiceServer) { + // If the following call pancis, it indicates UnimplementedAutoUpdateServiceServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } + s.RegisterService(&AutoUpdateService_ServiceDesc, srv) +} + +func _AutoUpdateService_GetClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetClusterAutoUpdateConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).GetClusterAutoUpdateConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_GetClusterAutoUpdateConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).GetClusterAutoUpdateConfig(ctx, req.(*GetClusterAutoUpdateConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_UpsertClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpsertClusterAutoUpdateConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).UpsertClusterAutoUpdateConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_UpsertClusterAutoUpdateConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).UpsertClusterAutoUpdateConfig(ctx, req.(*UpsertClusterAutoUpdateConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_DeleteClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteClusterAutoUpdateConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).DeleteClusterAutoUpdateConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_DeleteClusterAutoUpdateConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).DeleteClusterAutoUpdateConfig(ctx, req.(*DeleteClusterAutoUpdateConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_GetAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAutoUpdateVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).GetAutoUpdateVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_GetAutoUpdateVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).GetAutoUpdateVersion(ctx, req.(*GetAutoUpdateVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_UpsertAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpsertAutoUpdateVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).UpsertAutoUpdateVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).UpsertAutoUpdateVersion(ctx, req.(*UpsertAutoUpdateVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_DeleteAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAutoUpdateVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).DeleteAutoUpdateVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).DeleteAutoUpdateVersion(ctx, req.(*DeleteAutoUpdateVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// AutoUpdateService_ServiceDesc is the grpc.ServiceDesc for AutoUpdateService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var AutoUpdateService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.autoupdate.v1.AutoUpdateService", + HandlerType: (*AutoUpdateServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetClusterAutoUpdateConfig", + Handler: _AutoUpdateService_GetClusterAutoUpdateConfig_Handler, + }, + { + MethodName: "UpsertClusterAutoUpdateConfig", + Handler: _AutoUpdateService_UpsertClusterAutoUpdateConfig_Handler, + }, + { + MethodName: "DeleteClusterAutoUpdateConfig", + Handler: _AutoUpdateService_DeleteClusterAutoUpdateConfig_Handler, + }, + { + MethodName: "GetAutoUpdateVersion", + Handler: _AutoUpdateService_GetAutoUpdateVersion_Handler, + }, + { + MethodName: "UpsertAutoUpdateVersion", + Handler: _AutoUpdateService_UpsertAutoUpdateVersion_Handler, + }, + { + MethodName: "DeleteAutoUpdateVersion", + Handler: _AutoUpdateService_DeleteAutoUpdateVersion_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "teleport/autoupdate/v1/autoupdate_service.proto", +} diff --git a/api/proto/teleport/autoupdate/v1/autoupdate.proto b/api/proto/teleport/autoupdate/v1/autoupdate.proto new file mode 100644 index 0000000000000..a64b0f8b7a614 --- /dev/null +++ b/api/proto/teleport/autoupdate/v1/autoupdate.proto @@ -0,0 +1,55 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package teleport.autoupdate.v1; + +import "teleport/header/v1/metadata.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1;autoupdate"; + +// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster +// autoupdate settings. +message ClusterAutoUpdateConfig { + string kind = 1; + string sub_kind = 2; + string version = 3; + teleport.header.v1.Metadata metadata = 4; + + ClusterAutoUpdateConfigSpec spec = 5; +} + +// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. +message ClusterAutoUpdateConfigSpec { + // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. + bool tools_auto_update = 1; +} + +// AutoupdateVersionV1 is a resource singleton with version required for +// tools autoupdate. +message AutoUpdateVersion { + string kind = 1; + string sub_kind = 2; + string version = 3; + teleport.header.v1.Metadata metadata = 4; + + AutoupdateVersionSpec spec = 5; +} + +// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. +message AutoupdateVersionSpec { + // ToolsVersion is the semantic version required for tools autoupdates. + string tools_version = 1; +} diff --git a/api/proto/teleport/autoupdate/v1/autoupdate_service.proto b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto new file mode 100644 index 0000000000000..d2ccfc61f9dd0 --- /dev/null +++ b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto @@ -0,0 +1,65 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package teleport.autoupdate.v1; + +import "google/protobuf/empty.proto"; +import "teleport/autoupdate/v1/autoupdate.proto"; + +option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1;autoupdate"; + +// AutoUpdateService provides an API to manage autoupdates. +service AutoUpdateService { + // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. + rpc GetClusterAutoUpdateConfig(GetClusterAutoUpdateConfigRequest) returns (ClusterAutoUpdateConfig); + + // UpsertClusterAutoUpdateConfig creates a new ClusterAutoUpdateConfig or replaces an existing ClusterAutoUpdateConfig. + rpc UpsertClusterAutoUpdateConfig(UpsertClusterAutoUpdateConfigRequest) returns (ClusterAutoUpdateConfig); + + // DeleteClusterAutoUpdateConfig hard deletes the specified ClusterAutoUpdateConfig. + rpc DeleteClusterAutoUpdateConfig(DeleteClusterAutoUpdateConfigRequest) returns (google.protobuf.Empty); + + // GetAutoUpdateVersion gets the current autoupdate version singleton. + rpc GetAutoUpdateVersion(GetAutoUpdateVersionRequest) returns (AutoUpdateVersion); + + // UpsertAutoUpdateVersion creates a new AutoUpdateVersion or replaces an existing AutoUpdateVersion. + rpc UpsertAutoUpdateVersion(UpsertAutoUpdateVersionRequest) returns (AutoUpdateVersion); + + // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. + rpc DeleteAutoUpdateVersion(DeleteAutoUpdateVersionRequest) returns (google.protobuf.Empty); +} + +// Request for GetClusterAutoUpdateConfig. +message GetClusterAutoUpdateConfigRequest {} + +// Request for UpsertClusterAutoUpdateConfig. +message UpsertClusterAutoUpdateConfigRequest { + ClusterAutoUpdateConfig config = 1; +} + +// Request for DeleteClusterAutoUpdateConfig. +message DeleteClusterAutoUpdateConfigRequest {} + +// Request for GetAutoUpdateVersion. +message GetAutoUpdateVersionRequest {} + +// Request for UpsertAutoUpdateVersion. +message UpsertAutoUpdateVersionRequest { + AutoUpdateVersion version = 1; +} + +// Request for DeleteAutoUpdateVersion. +message DeleteAutoUpdateVersionRequest {} diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 018852304f76e..80333403685a0 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -3514,12 +3514,6 @@ service AuthService { // GetClusterMaintenanceConfig gets the current maintenance window config singleton. rpc GetClusterMaintenanceConfig(google.protobuf.Empty) returns (types.ClusterMaintenanceConfigV1); - // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. - rpc GetClusterAutoUpdateConfig(google.protobuf.Empty) returns (types.ClusterAutoUpdateConfigV1); - - // GetAutoUpdateVersion gets the current autoupdate version singleton. - rpc GetAutoUpdateVersion(google.protobuf.Empty) returns (types.AutoUpdateVersionV1); - // UpdateClusterMaintenanceConfig updates the current maintenance window config singleton. rpc UpdateClusterMaintenanceConfig(types.ClusterMaintenanceConfigV1) returns (google.protobuf.Empty); diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 05e7ecc842a35..9f93a5bf9ce2e 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -6624,52 +6624,6 @@ message AgentUpgradeWindow { repeated string Weekdays = 2 [(gogoproto.jsontag) = "weekdays,omitempty"]; } -// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster -// autoupdate settings. -message ClusterAutoUpdateConfigV1 { - ResourceHeader Header = 1 [ - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "", - (gogoproto.embed) = true - ]; - ClusterAutoUpdateConfigSpecV1 Spec = 2 [ - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "spec" - ]; - // Nonce is used to protect against concurrent modification of the maintenance - // window. Clients should treat nonces as opaque. - uint64 Nonce = 3 [(gogoproto.jsontag) = "nonce,omitempty"]; -} - -// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. -message ClusterAutoUpdateConfigSpecV1 { - // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - bool ToolsAutoUpdate = 1 [(gogoproto.jsontag) = "tools_auto_update,omitempty"]; -} - -// AutoupdateVersionV1 is a resource singleton with version required for -// tools autoupdate. -message AutoUpdateVersionV1 { - ResourceHeader Header = 1 [ - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "", - (gogoproto.embed) = true - ]; - AutoupdateVersionSpecV1 Spec = 2 [ - (gogoproto.nullable) = false, - (gogoproto.jsontag) = "spec" - ]; - // Nonce is used to protect against concurrent modification of the maintenance - // window. Clients should treat nonces as opaque. - uint64 Nonce = 3 [(gogoproto.jsontag) = "nonce,omitempty"]; -} - -// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. -message AutoupdateVersionSpecV1 { - // ToolsVersion is the semantic version required for tools autoupdates. - string ToolsVersion = 1 [(gogoproto.jsontag) = "tools_version,omitempty"]; -} - // ScheduledAgentUpgradeWindow is a derived value representing a single // upgrade window. Upgraders deal with discrete start/end times, so we use the // agent upgrade window configuration object to generate a sequence of specific diff --git a/api/types/autoupdate_config.go b/api/types/autoupdate_config.go deleted file mode 100644 index 337df71b70e72..0000000000000 --- a/api/types/autoupdate_config.go +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package types - -import ( - "time" - - "github.com/gravitational/teleport/api/utils" - "github.com/gravitational/trace" -) - -// ClusterAutoUpdateConfig defines configuration of auto updates for tools and agents -type ClusterAutoUpdateConfig interface { - // Resource provides common resource properties. - Resource - // SetToolsAutoUpdate enables/disables tools autoupdate in the cluster. - SetToolsAutoUpdate(bool) - // GetToolsAutoUpdate gets feature flag if autoupdate is enabled in the cluster. - GetToolsAutoUpdate() bool - // Clone performs a deep copy. - Clone() ClusterAutoUpdateConfig -} - -// NewClusterAutoUpdateConfig is a convenience wrapper to create a ClusterAutoupdateConfigV1 resource. -func NewClusterAutoUpdateConfig(spec ClusterAutoUpdateConfigSpecV1) (ClusterAutoUpdateConfig, error) { - resource := &ClusterAutoUpdateConfigV1{Spec: spec} - if err := resource.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } - return resource, nil -} - -// GetVersion returns resource version -func (c *ClusterAutoUpdateConfigV1) GetVersion() string { - return c.Version -} - -// GetKind returns resource kind -func (c *ClusterAutoUpdateConfigV1) GetKind() string { - return c.Kind -} - -// GetSubKind returns resource sub kind -func (c *ClusterAutoUpdateConfigV1) GetSubKind() string { - return c.SubKind -} - -// SetSubKind sets resource subkind -func (c *ClusterAutoUpdateConfigV1) SetSubKind(sk string) { - c.SubKind = sk -} - -// GetRevision returns the revision -func (c *ClusterAutoUpdateConfigV1) GetRevision() string { - return c.Metadata.GetRevision() -} - -// SetRevision sets the revision -func (c *ClusterAutoUpdateConfigV1) SetRevision(rev string) { - c.Metadata.SetRevision(rev) -} - -// GetName returns the name of the cluster autoupdate config. -func (c *ClusterAutoUpdateConfigV1) GetName() string { - return c.Metadata.Name -} - -// SetName sets the name of the cluster autoupdate config. -func (c *ClusterAutoUpdateConfigV1) SetName(e string) { - c.Metadata.Name = e -} - -// Expiry returns object expiry setting -func (c *ClusterAutoUpdateConfigV1) Expiry() time.Time { - return c.Metadata.Expiry() -} - -// SetExpiry sets expiry time for the object -func (c *ClusterAutoUpdateConfigV1) SetExpiry(expires time.Time) { - c.Metadata.SetExpiry(expires) -} - -// GetMetadata returns object metadata -func (c *ClusterAutoUpdateConfigV1) GetMetadata() Metadata { - return c.Metadata -} - -// SetToolsAutoUpdate enables/disables tools autoupdate in the cluster. -func (c *ClusterAutoUpdateConfigV1) SetToolsAutoUpdate(flag bool) { - c.Spec.ToolsAutoUpdate = flag -} - -// GetToolsAutoUpdate gets feature flag if autoupdate is enabled in the cluster. -func (c *ClusterAutoUpdateConfigV1) GetToolsAutoUpdate() bool { - return c.Spec.ToolsAutoUpdate -} - -// Clone performs a deep copy. -func (c *ClusterAutoUpdateConfigV1) Clone() ClusterAutoUpdateConfig { - return utils.CloneProtoMsg(c) -} - -// setStaticFields sets static resource header and metadata fields. -func (c *ClusterAutoUpdateConfigV1) setStaticFields() { - c.Kind = KindClusterAutoUpdateConfig - c.Version = V1 - c.Metadata.Name = MetaNameClusterAutoUpdateConfig -} - -// CheckAndSetDefaults checks validity of all parameters and sets defaults. -func (c *ClusterAutoUpdateConfigV1) CheckAndSetDefaults() error { - c.setStaticFields() - if err := c.Metadata.CheckAndSetDefaults(); err != nil { - return trace.Wrap(err) - } - - return nil -} diff --git a/api/types/autoupdate_version.go b/api/types/autoupdate_version.go deleted file mode 100644 index a47ba2300ba1a..0000000000000 --- a/api/types/autoupdate_version.go +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package types - -import ( - "github.com/gravitational/teleport/api/utils" - "time" - - "github.com/gravitational/trace" -) - -// AutoUpdateVersion defines resource for storing semantic version of auto updates. -type AutoUpdateVersion interface { - // Resource provides common resource properties. - Resource - // SetToolsVersion defines required version for tools autoupdate. - SetToolsVersion(string) - // GetToolsVersion gets last known required version for autoupdate. - GetToolsVersion() string - // Clone performs a deep copy. - Clone() AutoUpdateVersion -} - -// NewAutoUpdateVersion is a convenience wrapper to create a AutoupdateVersionV1 resource. -func NewAutoUpdateVersion(spec AutoupdateVersionSpecV1) (AutoUpdateVersion, error) { - resource := &AutoUpdateVersionV1{Spec: spec} - if err := resource.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } - return resource, nil -} - -// GetVersion returns resource version -func (c *AutoUpdateVersionV1) GetVersion() string { - return c.Version -} - -// GetKind returns resource kind -func (c *AutoUpdateVersionV1) GetKind() string { - return c.Kind -} - -// GetSubKind returns resource sub kind -func (c *AutoUpdateVersionV1) GetSubKind() string { - return c.SubKind -} - -// SetSubKind sets resource subkind -func (c *AutoUpdateVersionV1) SetSubKind(sk string) { - c.SubKind = sk -} - -// GetRevision returns the revision -func (c *AutoUpdateVersionV1) GetRevision() string { - return c.Metadata.GetRevision() -} - -// SetRevision sets the revision -func (c *AutoUpdateVersionV1) SetRevision(rev string) { - c.Metadata.SetRevision(rev) -} - -// GetName returns the name of the autoupdate version. -func (c *AutoUpdateVersionV1) GetName() string { - return c.Metadata.Name -} - -// SetName sets the name of the autoupdate version. -func (c *AutoUpdateVersionV1) SetName(e string) { - c.Metadata.Name = e -} - -// Expiry returns object expiry setting -func (c *AutoUpdateVersionV1) Expiry() time.Time { - return c.Metadata.Expiry() -} - -// SetExpiry sets expiry time for the object -func (c *AutoUpdateVersionV1) SetExpiry(expires time.Time) { - c.Metadata.SetExpiry(expires) -} - -// GetMetadata returns object metadata -func (c *AutoUpdateVersionV1) GetMetadata() Metadata { - return c.Metadata -} - -// SetToolsVersion defines required version for tools autoupdate. -func (c *AutoUpdateVersionV1) SetToolsVersion(version string) { - c.Spec.ToolsVersion = version -} - -// GetToolsVersion gets last known required version for autoupdate. -func (c *AutoUpdateVersionV1) GetToolsVersion() string { - return c.Spec.ToolsVersion -} - -// Clone performs a deep copy. -func (c *AutoUpdateVersionV1) Clone() AutoUpdateVersion { - return utils.CloneProtoMsg(c) -} - -// setStaticFields sets static resource header and metadata fields. -func (c *AutoUpdateVersionV1) setStaticFields() { - c.Kind = KindAutoUpdateVersion - c.Version = V1 - c.Metadata.Name = MetaNameAutoUpdateVersion -} - -// CheckAndSetDefaults checks validity of all parameters and sets defaults. -func (c *AutoUpdateVersionV1) CheckAndSetDefaults() error { - c.setStaticFields() - if err := c.Metadata.CheckAndSetDefaults(); err != nil { - return trace.Wrap(err) - } - - if c.Spec.ToolsVersion == "" { - return trace.BadParameter("missing ToolsVersion field") - } - - return nil -} diff --git a/api/types/types.pb.go b/api/types/types.pb.go index a5ea423ab9d23..9699275681cbd 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1090,7 +1090,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318, 0} + return fileDescriptor_9198ee693835762e, []int{314, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1122,7 +1122,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{319, 0} + return fileDescriptor_9198ee693835762e, []int{315, 0} } type KeepAlive struct { @@ -17624,182 +17624,6 @@ func (m *AgentUpgradeWindow) XXX_DiscardUnknown() { var xxx_messageInfo_AgentUpgradeWindow proto.InternalMessageInfo -// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster -// autoupdate settings. -type ClusterAutoUpdateConfigV1 struct { - ResourceHeader `protobuf:"bytes,1,opt,name=Header,proto3,embedded=Header" json:""` - Spec ClusterAutoUpdateConfigSpecV1 `protobuf:"bytes,2,opt,name=Spec,proto3" json:"spec"` - // Nonce is used to protect against concurrent modification of the maintenance - // window. Clients should treat nonces as opaque. - Nonce uint64 `protobuf:"varint,3,opt,name=Nonce,proto3" json:"nonce,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ClusterAutoUpdateConfigV1) Reset() { *m = ClusterAutoUpdateConfigV1{} } -func (m *ClusterAutoUpdateConfigV1) String() string { return proto.CompactTextString(m) } -func (*ClusterAutoUpdateConfigV1) ProtoMessage() {} -func (*ClusterAutoUpdateConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{305} -} -func (m *ClusterAutoUpdateConfigV1) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ClusterAutoUpdateConfigV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ClusterAutoUpdateConfigV1.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 *ClusterAutoUpdateConfigV1) XXX_Merge(src proto.Message) { - xxx_messageInfo_ClusterAutoUpdateConfigV1.Merge(m, src) -} -func (m *ClusterAutoUpdateConfigV1) XXX_Size() int { - return m.Size() -} -func (m *ClusterAutoUpdateConfigV1) XXX_DiscardUnknown() { - xxx_messageInfo_ClusterAutoUpdateConfigV1.DiscardUnknown(m) -} - -var xxx_messageInfo_ClusterAutoUpdateConfigV1 proto.InternalMessageInfo - -// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. -type ClusterAutoUpdateConfigSpecV1 struct { - // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - ToolsAutoUpdate bool `protobuf:"varint,1,opt,name=ToolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ClusterAutoUpdateConfigSpecV1) Reset() { *m = ClusterAutoUpdateConfigSpecV1{} } -func (m *ClusterAutoUpdateConfigSpecV1) String() string { return proto.CompactTextString(m) } -func (*ClusterAutoUpdateConfigSpecV1) ProtoMessage() {} -func (*ClusterAutoUpdateConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{306} -} -func (m *ClusterAutoUpdateConfigSpecV1) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ClusterAutoUpdateConfigSpecV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ClusterAutoUpdateConfigSpecV1.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 *ClusterAutoUpdateConfigSpecV1) XXX_Merge(src proto.Message) { - xxx_messageInfo_ClusterAutoUpdateConfigSpecV1.Merge(m, src) -} -func (m *ClusterAutoUpdateConfigSpecV1) XXX_Size() int { - return m.Size() -} -func (m *ClusterAutoUpdateConfigSpecV1) XXX_DiscardUnknown() { - xxx_messageInfo_ClusterAutoUpdateConfigSpecV1.DiscardUnknown(m) -} - -var xxx_messageInfo_ClusterAutoUpdateConfigSpecV1 proto.InternalMessageInfo - -// AutoupdateVersionV1 is a resource singleton with version required for -// tools autoupdate. -type AutoUpdateVersionV1 struct { - ResourceHeader `protobuf:"bytes,1,opt,name=Header,proto3,embedded=Header" json:""` - Spec AutoupdateVersionSpecV1 `protobuf:"bytes,2,opt,name=Spec,proto3" json:"spec"` - // Nonce is used to protect against concurrent modification of the maintenance - // window. Clients should treat nonces as opaque. - Nonce uint64 `protobuf:"varint,3,opt,name=Nonce,proto3" json:"nonce,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AutoUpdateVersionV1) Reset() { *m = AutoUpdateVersionV1{} } -func (m *AutoUpdateVersionV1) String() string { return proto.CompactTextString(m) } -func (*AutoUpdateVersionV1) ProtoMessage() {} -func (*AutoUpdateVersionV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} -} -func (m *AutoUpdateVersionV1) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AutoUpdateVersionV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AutoUpdateVersionV1.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 *AutoUpdateVersionV1) XXX_Merge(src proto.Message) { - xxx_messageInfo_AutoUpdateVersionV1.Merge(m, src) -} -func (m *AutoUpdateVersionV1) XXX_Size() int { - return m.Size() -} -func (m *AutoUpdateVersionV1) XXX_DiscardUnknown() { - xxx_messageInfo_AutoUpdateVersionV1.DiscardUnknown(m) -} - -var xxx_messageInfo_AutoUpdateVersionV1 proto.InternalMessageInfo - -// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. -type AutoupdateVersionSpecV1 struct { - // ToolsVersion is the semantic version required for tools autoupdates. - ToolsVersion string `protobuf:"bytes,1,opt,name=ToolsVersion,proto3" json:"tools_version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AutoupdateVersionSpecV1) Reset() { *m = AutoupdateVersionSpecV1{} } -func (m *AutoupdateVersionSpecV1) String() string { return proto.CompactTextString(m) } -func (*AutoupdateVersionSpecV1) ProtoMessage() {} -func (*AutoupdateVersionSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{308} -} -func (m *AutoupdateVersionSpecV1) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AutoupdateVersionSpecV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AutoupdateVersionSpecV1.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 *AutoupdateVersionSpecV1) XXX_Merge(src proto.Message) { - xxx_messageInfo_AutoupdateVersionSpecV1.Merge(m, src) -} -func (m *AutoupdateVersionSpecV1) XXX_Size() int { - return m.Size() -} -func (m *AutoupdateVersionSpecV1) XXX_DiscardUnknown() { - xxx_messageInfo_AutoupdateVersionSpecV1.DiscardUnknown(m) -} - -var xxx_messageInfo_AutoupdateVersionSpecV1 proto.InternalMessageInfo - // ScheduledAgentUpgradeWindow is a derived value representing a single // upgrade window. Upgraders deal with discrete start/end times, so we use the // agent upgrade window configuration object to generate a sequence of specific @@ -17818,7 +17642,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{309} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17861,7 +17685,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{310} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17904,7 +17728,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17946,7 +17770,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{312} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17990,7 +17814,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{313} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18034,7 +17858,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{314} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18077,7 +17901,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18125,7 +17949,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{316} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18168,7 +17992,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18222,7 +18046,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{318} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18266,7 +18090,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{319} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18311,7 +18135,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{320} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18356,7 +18180,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{321} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18456,7 +18280,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{322} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18502,7 +18326,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{323} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18554,7 +18378,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{324} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18611,7 +18435,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{325} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18661,7 +18485,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{326} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18702,7 +18526,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{327} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18752,7 +18576,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{328} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18794,7 +18618,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{329} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18871,7 +18695,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{330} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18936,7 +18760,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{331} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18993,7 +18817,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{332} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19057,7 +18881,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{333} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19102,7 +18926,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{334} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19164,7 +18988,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{335} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19207,7 +19031,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{336} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19250,7 +19074,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{337} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19304,7 +19128,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{338} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19359,7 +19183,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{339} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19405,7 +19229,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{340} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19447,7 +19271,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{341} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19489,7 +19313,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{342} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19535,7 +19359,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{343} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19925,10 +19749,6 @@ func init() { proto.RegisterType((*ClusterMaintenanceConfigV1)(nil), "types.ClusterMaintenanceConfigV1") proto.RegisterType((*ClusterMaintenanceConfigSpecV1)(nil), "types.ClusterMaintenanceConfigSpecV1") proto.RegisterType((*AgentUpgradeWindow)(nil), "types.AgentUpgradeWindow") - proto.RegisterType((*ClusterAutoUpdateConfigV1)(nil), "types.ClusterAutoUpdateConfigV1") - proto.RegisterType((*ClusterAutoUpdateConfigSpecV1)(nil), "types.ClusterAutoUpdateConfigSpecV1") - proto.RegisterType((*AutoUpdateVersionV1)(nil), "types.AutoUpdateVersionV1") - proto.RegisterType((*AutoupdateVersionSpecV1)(nil), "types.AutoupdateVersionSpecV1") proto.RegisterType((*ScheduledAgentUpgradeWindow)(nil), "types.ScheduledAgentUpgradeWindow") proto.RegisterType((*AgentUpgradeSchedule)(nil), "types.AgentUpgradeSchedule") proto.RegisterType((*UserGroupV1)(nil), "types.UserGroupV1") @@ -19972,7 +19792,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 27355 bytes of a gzipped FileDescriptorProto + // 27248 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6d, 0x70, 0x1c, 0x49, 0x76, 0x20, 0x36, 0xdd, 0x8d, 0x8f, 0xc6, 0xc3, 0x57, 0x23, 0x01, 0x92, 0x20, 0x66, 0x38, 0xe0, 0x14, 0x67, 0x38, 0xe4, 0x7c, 0x90, 0x4b, 0x70, 0x87, 0xbb, 0xb3, 0xf3, 0xd9, 0x40, 0x83, 0x44, @@ -21452,237 +21272,230 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x9e, 0xa3, 0x81, 0x6d, 0x60, 0x3f, 0xae, 0xe3, 0xdf, 0x64, 0x51, 0x0a, 0xdb, 0x42, 0xea, 0xbd, 0x13, 0xfc, 0xcf, 0x2a, 0x03, 0x54, 0x1b, 0x9b, 0x77, 0x3a, 0x3c, 0x6b, 0xea, 0x55, 0x18, 0x62, 0xcd, 0x4a, 0x4c, 0x46, 0x36, 0x1d, 0xca, 0xb7, 0xd7, 0x05, 0x12, 0x6f, 0x55, 0xe8, 0xb6, 0x9a, - 0x36, 0x22, 0xff, 0x4b, 0xea, 0xae, 0xa5, 0xc7, 0x6d, 0xeb, 0xfa, 0x9b, 0x92, 0x66, 0x3c, 0x73, - 0x34, 0x0f, 0xce, 0xb5, 0x63, 0x4f, 0xc6, 0xf6, 0xc4, 0xd1, 0xdf, 0x76, 0x62, 0x25, 0x71, 0xe2, - 0xf8, 0x9f, 0x87, 0xd3, 0xa6, 0x0e, 0x47, 0xa2, 0x46, 0xcc, 0x48, 0xa4, 0x42, 0x52, 0x33, 0xb1, - 0x93, 0x94, 0x50, 0x46, 0xf4, 0x0c, 0x13, 0x0d, 0xa9, 0x48, 0x54, 0x1c, 0x67, 0xd3, 0x76, 0x93, - 0x45, 0x8b, 0xf4, 0x11, 0x74, 0x51, 0xb4, 0x05, 0x8a, 0x02, 0xf9, 0x16, 0x5d, 0x74, 0x1b, 0x20, - 0x08, 0x90, 0x45, 0x57, 0x2d, 0x10, 0xb4, 0x06, 0xfa, 0x09, 0x8a, 0x6e, 0xb2, 0x2a, 0xee, 0x8b, - 0xbc, 0x24, 0x25, 0x65, 0xfc, 0x48, 0x8b, 0xec, 0xa4, 0x7b, 0xcf, 0xb9, 0xbc, 0xef, 0x7b, 0xce, - 0x3d, 0xf7, 0xfc, 0x4e, 0x69, 0x07, 0x96, 0x92, 0x14, 0x48, 0x4d, 0xe2, 0x6c, 0x15, 0x9f, 0x95, - 0x59, 0x49, 0x1b, 0x41, 0x40, 0x9f, 0x88, 0x6e, 0x3c, 0xfc, 0xd7, 0xaf, 0x1e, 0x01, 0xfc, 0x97, - 0xf2, 0x8c, 0xc3, 0xe1, 0x2a, 0xfd, 0x22, 0x07, 0xc7, 0x63, 0x57, 0x33, 0xbe, 0x24, 0xbe, 0xb3, - 0x7e, 0x0f, 0x4a, 0xe2, 0x5d, 0x3e, 0x97, 0x98, 0xb2, 0x0d, 0x9c, 0xf2, 0x1c, 0x78, 0x13, 0x56, - 0x27, 0xd1, 0xa3, 0x27, 0x32, 0xa1, 0xd8, 0x19, 0x0e, 0x43, 0x14, 0xb3, 0x5d, 0x88, 0xcc, 0xfe, - 0x85, 0x04, 0x6b, 0xec, 0x61, 0x63, 0xb3, 0xe3, 0xf9, 0xa1, 0xeb, 0x77, 0xfc, 0x5d, 0xf7, 0xc1, - 0xf8, 0xed, 0x6c, 0x26, 0xb6, 0xa5, 0xf3, 0xc9, 0xf7, 0xab, 0x99, 0xaf, 0x4d, 0x6e, 0x2d, 0xba, - 0x48, 0x10, 0x37, 0x76, 0xe9, 0xe4, 0x2d, 0x50, 0x3f, 0x49, 0x1f, 0x27, 0x88, 0x7e, 0x92, 0x84, - 0xa2, 0xf4, 0x23, 0x58, 0x9f, 0xfe, 0x01, 0xf4, 0x16, 0x2c, 0x12, 0x94, 0xfa, 0x76, 0x7f, 0x6f, - 0xd0, 0xe9, 0xba, 0xfc, 0x4e, 0x8b, 0x5f, 0x29, 0x8a, 0x79, 0x14, 0x65, 0x84, 0xf9, 0xed, 0xed, - 0x11, 0xfc, 0x7b, 0xc6, 0x94, 0x78, 0x3d, 0x2c, 0x96, 0x56, 0xfa, 0xb1, 0x04, 0x28, 0x5b, 0x06, - 0x7a, 0x1e, 0x16, 0xda, 0x76, 0xc5, 0x0a, 0x3b, 0x83, 0xb0, 0x1e, 0x8c, 0x06, 0x0c, 0xbd, 0x83, - 0xba, 0x71, 0x85, 0xbb, 0x78, 0x67, 0x18, 0x84, 0xce, 0x7e, 0x30, 0x1a, 0x98, 0x09, 0x3a, 0x02, - 0x85, 0xef, 0xba, 0xef, 0x76, 0x3b, 0xb7, 0x93, 0x50, 0xf8, 0x2c, 0x2d, 0x01, 0x85, 0xcf, 0xd2, - 0x4a, 0x9f, 0x4b, 0xf0, 0x30, 0x7f, 0xac, 0x3a, 0x0a, 0x83, 0x76, 0xbf, 0xdb, 0x09, 0x1f, 0xd0, - 0x90, 0xd6, 0xc6, 0xca, 0x41, 0x13, 0x3e, 0xf6, 0x60, 0x46, 0xf4, 0x1d, 0x38, 0x33, 0xb5, 0x7c, - 0xa4, 0xc1, 0xb2, 0x1d, 0x04, 0xbd, 0x61, 0x9c, 0xcd, 0x5c, 0x51, 0x08, 0xd0, 0x64, 0x88, 0xb3, - 0x9c, 0xce, 0x28, 0x0c, 0x9c, 0x11, 0xc9, 0x14, 0xf1, 0x51, 0x53, 0x7c, 0xa5, 0x3f, 0x4b, 0x70, - 0x2c, 0xfe, 0xcb, 0x96, 0xfb, 0xfd, 0xf6, 0xd9, 0x2b, 0x89, 0x3e, 0xe3, 0x6f, 0xb1, 0xf0, 0x67, - 0x46, 0xe2, 0x67, 0x1e, 0x4c, 0x6f, 0xdd, 0x80, 0x93, 0x13, 0x4a, 0x46, 0xd7, 0x60, 0x81, 0xb4, - 0x97, 0xef, 0x70, 0x52, 0xec, 0x07, 0x4b, 0x3b, 0x29, 0xeb, 0x20, 0x99, 0x60, 0x28, 0x7d, 0x2a, - 0xc1, 0x29, 0xfe, 0x92, 0xa6, 0x3b, 0x66, 0x8e, 0x57, 0x88, 0x13, 0xfc, 0x80, 0xa3, 0xe2, 0x4d, - 0xd3, 0x79, 0x56, 0x38, 0x4e, 0x04, 0x99, 0xf8, 0x44, 0xf9, 0xa1, 0xbc, 0xa4, 0xb7, 0xc2, 0xa0, - 0x7f, 0x08, 0xa0, 0x08, 0x39, 0xea, 0xa9, 0x30, 0xe8, 0x93, 0x22, 0x08, 0x67, 0xc9, 0x85, 0xe3, - 0x62, 0xe5, 0x78, 0x8d, 0x51, 0x13, 0x8e, 0x32, 0xd8, 0xa0, 0x94, 0xd5, 0x71, 0x4a, 0x9b, 0x36, - 0x96, 0x39, 0x1a, 0x05, 0x43, 0x65, 0x33, 0x79, 0x19, 0xa5, 0x9f, 0x4b, 0x50, 0xc4, 0x42, 0x29, - 0x51, 0xf3, 0xef, 0x77, 0x8e, 0x24, 0xf5, 0x0b, 0x6e, 0xb4, 0x8e, 0x8a, 0x3f, 0x94, 0xd0, 0xf6, - 0x1c, 0x2c, 0xa7, 0x18, 0x50, 0x89, 0xf8, 0x21, 0xf7, 0xbc, 0xdd, 0x0e, 0x45, 0x6c, 0xa7, 0x16, - 0xdf, 0x44, 0x5a, 0xe9, 0xa7, 0x12, 0x1c, 0x37, 0xde, 0x0d, 0x3b, 0x1a, 0xb1, 0x07, 0x98, 0xa3, - 0x1e, 0x3f, 0x47, 0xb0, 0xa0, 0xcd, 0x9f, 0x64, 0x51, 0x1f, 0x49, 0x2a, 0x68, 0xb3, 0x34, 0x33, - 0xca, 0x45, 0x75, 0x98, 0x63, 0x72, 0xcb, 0x90, 0x81, 0xa9, 0xad, 0x0b, 0xb7, 0x4d, 0x71, 0xc1, - 0x8c, 0x08, 0xb7, 0x84, 0x1c, 0x8d, 0x8c, 0xc7, 0x8c, 0xb8, 0x4b, 0xff, 0x92, 0xe0, 0xe4, 0x04, - 0x1e, 0xf4, 0x32, 0xcc, 0x10, 0x57, 0x0f, 0x36, 0x7a, 0xa7, 0x27, 0x7c, 0x22, 0xdc, 0xdd, 0xdf, - 0xbe, 0x4c, 0x05, 0x9c, 0x03, 0xfc, 0xc7, 0xa4, 0x5c, 0xe8, 0x0d, 0x98, 0x57, 0xba, 0x5d, 0xa6, - 0xef, 0xe6, 0x12, 0xfa, 0xee, 0x84, 0x2f, 0x5e, 0x8a, 0xe8, 0xa9, 0xbe, 0x4b, 0x1f, 0x1d, 0x77, - 0xbb, 0x0e, 0x73, 0x63, 0x89, 0xcb, 0x5b, 0xfb, 0x3e, 0x2c, 0x25, 0x89, 0xef, 0x4a, 0xdf, 0xfd, - 0x8d, 0x04, 0x72, 0xb2, 0x0e, 0xdf, 0x0e, 0x8e, 0xc6, 0xb8, 0x61, 0xfe, 0x86, 0x49, 0xf5, 0xab, - 0x1c, 0x3c, 0x34, 0xb6, 0x87, 0xd1, 0x53, 0x30, 0xab, 0xf4, 0xfb, 0x5a, 0x95, 0xcd, 0x2a, 0x26, - 0x48, 0x13, 0x33, 0x42, 0xe2, 0x3a, 0x80, 0x12, 0xa1, 0x2b, 0x30, 0x47, 0x66, 0x26, 0x66, 0xc8, - 0xc5, 0xb0, 0x66, 0xf4, 0x96, 0x2d, 0x05, 0x6b, 0xc6, 0x09, 0x51, 0x0d, 0x96, 0x98, 0x4b, 0xbd, - 0xe9, 0xee, 0xb9, 0x1f, 0x44, 0xf8, 0xba, 0x04, 0x02, 0x98, 0xdb, 0x26, 0x9c, 0x01, 0xcd, 0x13, - 0x9d, 0xca, 0x93, 0x5c, 0xa8, 0x01, 0x32, 0x29, 0x53, 0x2c, 0x89, 0x62, 0xab, 0x11, 0x90, 0x03, - 0x5a, 0x89, 0x09, 0x65, 0x65, 0x38, 0xa3, 0xe1, 0x52, 0x86, 0x43, 0x6f, 0xcf, 0x3f, 0x70, 0xfd, - 0xf0, 0xdb, 0x1b, 0xae, 0xf8, 0x1b, 0x87, 0x1a, 0xae, 0x5f, 0x17, 0xe8, 0x62, 0x4e, 0xb3, 0x61, - 0x49, 0x59, 0x80, 0xd3, 0x24, 0x92, 0x32, 0x09, 0x91, 0x4a, 0x9d, 0xc6, 0xab, 0x70, 0x94, 0x3a, - 0xf3, 0xf3, 0x95, 0x71, 0x66, 0x6c, 0x15, 0x28, 0xcd, 0xf6, 0x65, 0x2a, 0x16, 0x53, 0x9f, 0x93, - 0xa1, 0xc9, 0x59, 0xd1, 0x36, 0x14, 0x2b, 0x3d, 0xb7, 0xe3, 0x8f, 0xfa, 0xf6, 0xe1, 0xcc, 0xcb, - 0xab, 0xac, 0x2d, 0x0b, 0xbb, 0x94, 0x8d, 0x98, 0xa5, 0xc9, 0x4e, 0x2e, 0x16, 0x84, 0xec, 0xe8, - 0x19, 0x7a, 0x81, 0x5c, 0x65, 0x3f, 0x33, 0xa5, 0x7f, 0xd2, 0x89, 0x84, 0x2f, 0xe9, 0x63, 0xc1, - 0xde, 0xa9, 0x3b, 0xb0, 0xd4, 0xe8, 0x0c, 0x43, 0x7b, 0xd0, 0xf1, 0x87, 0x04, 0x04, 0xec, 0x10, - 0x20, 0x29, 0x3c, 0x98, 0x32, 0xbd, 0xe2, 0x0e, 0x23, 0x56, 0x7a, 0xc5, 0x9d, 0x2c, 0x0e, 0xcb, - 0xe1, 0x35, 0xcf, 0xef, 0xf4, 0xbc, 0x0f, 0xb9, 0xb7, 0x0e, 0x95, 0xc3, 0x6f, 0xf2, 0x44, 0x33, - 0xce, 0x2f, 0xbd, 0x99, 0x19, 0x37, 0x5a, 0xcb, 0x22, 0x1c, 0x65, 0x0e, 0x9a, 0xd4, 0x61, 0xb1, - 0xa5, 0xea, 0x55, 0x4d, 0xdf, 0x94, 0x25, 0xb4, 0x04, 0xd0, 0x32, 0x8d, 0x8a, 0x6a, 0x59, 0xf8, - 0x7f, 0x0e, 0xff, 0x67, 0xde, 0x8c, 0xb5, 0x76, 0x43, 0xce, 0x0b, 0x0e, 0x8d, 0x05, 0x2c, 0x11, - 0x9e, 0x18, 0x3f, 0x94, 0xc8, 0x06, 0xe2, 0xd2, 0xca, 0x1e, 0x1a, 0x3c, 0x3f, 0x75, 0xdc, 0xc7, - 0x26, 0xa7, 0x5d, 0x63, 0x43, 0xea, 0x72, 0x99, 0xe3, 0xd6, 0xc4, 0x38, 0x0c, 0xb0, 0xd7, 0x2d, - 0x55, 0x60, 0x75, 0x52, 0x19, 0xc9, 0xa6, 0x2e, 0x43, 0x51, 0x69, 0xb5, 0x1a, 0x5a, 0x45, 0xb1, - 0x35, 0x43, 0x97, 0x25, 0x34, 0x0f, 0x33, 0x9b, 0xa6, 0xd1, 0x6e, 0xc9, 0xb9, 0xd2, 0x27, 0x12, - 0x2c, 0x6a, 0x7e, 0xe8, 0xee, 0xd1, 0xd7, 0xcf, 0xf7, 0xbb, 0xf8, 0x5e, 0x4a, 0x2c, 0xbe, 0xd5, - 0xc8, 0xf9, 0x3b, 0xfa, 0xc0, 0xa1, 0x56, 0xde, 0x5f, 0x24, 0x58, 0xc9, 0xf0, 0x20, 0x0b, 0x8e, - 0x2a, 0x3b, 0x96, 0xa1, 0x55, 0x2b, 0xac, 0x66, 0x5c, 0xdb, 0x63, 0xa9, 0xd9, 0xaf, 0x50, 0xdf, - 0xaa, 0x5b, 0x43, 0x27, 0xf0, 0xba, 0x42, 0xf0, 0xb1, 0xfa, 0x11, 0x93, 0x97, 0x44, 0x4e, 0xb2, - 0x0f, 0x47, 0x03, 0x97, 0x14, 0x9b, 0x4b, 0xdc, 0x94, 0x47, 0xe9, 0xd9, 0x82, 0xc9, 0x63, 0xdf, - 0x0e, 0xce, 0xcf, 0x16, 0x1d, 0x97, 0xb7, 0xb1, 0x08, 0x45, 0xa6, 0x0d, 0x13, 0x45, 0xf3, 0x63, - 0x09, 0x56, 0x27, 0xd5, 0x15, 0x2b, 0xd8, 0x49, 0x47, 0xcb, 0x13, 0x11, 0x7c, 0x74, 0xd2, 0xc3, - 0x92, 0x93, 0xa1, 0x6b, 0x50, 0xa4, 0xb1, 0xd5, 0xad, 0x2b, 0x6d, 0x53, 0x63, 0x13, 0xe4, 0x0c, - 0x16, 0x41, 0x69, 0x24, 0x76, 0x67, 0x78, 0xc5, 0x19, 0x0d, 0xbc, 0x04, 0xd4, 0xae, 0xc8, 0x51, - 0xfa, 0x48, 0x82, 0xb5, 0xc9, 0x8d, 0xc4, 0xa7, 0x8c, 0x8d, 0x75, 0xbe, 0xd8, 0x57, 0x8d, 0x9c, - 0x32, 0x44, 0x0f, 0x4c, 0x39, 0xab, 0x45, 0x84, 0x98, 0x29, 0x0a, 0xeb, 0x99, 0xcb, 0x44, 0xf3, - 0x4b, 0x32, 0x71, 0xc2, 0xd2, 0xef, 0x72, 0x70, 0x02, 0x4f, 0xa0, 0x9e, 0x3b, 0xc4, 0x1a, 0xc4, - 0xbe, 0xeb, 0x87, 0x4c, 0xa4, 0x42, 0x2f, 0xc0, 0xec, 0xfe, 0xdd, 0xdd, 0x32, 0x53, 0x72, 0x84, - 0x80, 0x6c, 0xca, 0xfc, 0xb1, 0x30, 0xfe, 0x8d, 0xce, 0x80, 0x10, 0x3d, 0x91, 0xec, 0xa9, 0x0b, - 0xe6, 0x7c, 0x3f, 0x8a, 0xa1, 0xf8, 0x22, 0xcc, 0x90, 0x5b, 0x25, 0xb6, 0x35, 0x72, 0x91, 0x76, - 0x7c, 0xcd, 0xc8, 0x9d, 0x93, 0x49, 0x19, 0xd0, 0xd3, 0x00, 0x31, 0x4c, 0x31, 0xdb, 0xfb, 0xf8, - 0xf5, 0x4c, 0x84, 0x54, 0x6c, 0xce, 0x1f, 0xdc, 0xec, 0x30, 0xec, 0xdf, 0x32, 0xac, 0xf0, 0x2e, - 0xe9, 0x73, 0x4c, 0x24, 0x66, 0xf6, 0x5c, 0xa6, 0x19, 0x5a, 0x9f, 0xe1, 0x22, 0x95, 0xfe, 0x99, - 0x83, 0xf9, 0x1d, 0x2c, 0x28, 0x90, 0x6b, 0x95, 0xe9, 0xd7, 0x34, 0xcf, 0x42, 0xb1, 0x11, 0x74, - 0x98, 0x4d, 0x68, 0xc8, 0x60, 0xd9, 0x88, 0xc3, 0x56, 0x2f, 0xe8, 0x70, 0xf3, 0xd2, 0xd0, 0x14, - 0x89, 0xbe, 0xc1, 0xd9, 0xec, 0x55, 0x98, 0xa5, 0x36, 0x3a, 0x76, 0x01, 0xc8, 0x45, 0xc5, 0xa8, - 0x46, 0x97, 0x68, 0xb6, 0x60, 0xc6, 0xa0, 0x76, 0x3e, 0x51, 0x6e, 0x61, 0xa8, 0x6c, 0xc2, 0x25, - 0xd2, 0xcc, 0xe1, 0x2e, 0x91, 0x04, 0xf4, 0x99, 0xd9, 0xc3, 0xa0, 0xcf, 0xac, 0x5d, 0x85, 0xa2, - 0x50, 0x9f, 0xbb, 0x92, 0x1c, 0x7f, 0x92, 0x83, 0x45, 0xd2, 0xaa, 0xe8, 0xc1, 0xce, 0x77, 0xf3, - 0x4a, 0xec, 0xa5, 0xc4, 0x95, 0xd8, 0xaa, 0x38, 0x5e, 0xb4, 0x65, 0x53, 0xee, 0xc2, 0x5e, 0x85, - 0x95, 0x0c, 0x21, 0x7a, 0x0e, 0x66, 0x70, 0xf5, 0xb9, 0xaa, 0x27, 0xa7, 0x67, 0x40, 0x8c, 0x54, - 0x88, 0x1b, 0x3e, 0x34, 0x29, 0x75, 0xe9, 0xdf, 0x12, 0x2c, 0x30, 0xdc, 0x6a, 0xff, 0x66, 0xf0, - 0x8d, 0xdd, 0x79, 0x21, 0xdd, 0x9d, 0xd4, 0x75, 0x9a, 0x75, 0xe7, 0x7f, 0xbb, 0x13, 0xaf, 0x26, - 0x3a, 0xf1, 0x64, 0x84, 0x5b, 0xc4, 0x9b, 0x33, 0xa5, 0x0f, 0xff, 0x44, 0x90, 0xfc, 0x92, 0x84, - 0xe8, 0x87, 0x30, 0xaf, 0xbb, 0xb7, 0x12, 0x1a, 0xd3, 0x85, 0x09, 0x85, 0x5e, 0x8a, 0x08, 0xe9, - 0x9a, 0x22, 0x87, 0x8d, 0xef, 0xde, 0x72, 0x32, 0xe6, 0xc1, 0xb8, 0x48, 0xac, 0x34, 0x25, 0xd9, - 0xee, 0x66, 0xea, 0x33, 0x07, 0x1d, 0x82, 0x06, 0xf0, 0xc7, 0x02, 0x40, 0xec, 0xdb, 0x80, 0x17, - 0x60, 0xe2, 0x65, 0x04, 0xb7, 0x49, 0x90, 0x24, 0x71, 0x8e, 0xf3, 0x07, 0x13, 0x17, 0xd8, 0x65, - 0x7b, 0x6e, 0x32, 0xae, 0x14, 0xb9, 0x76, 0xaf, 0x30, 0xdf, 0x81, 0xae, 0xdb, 0xeb, 0xd0, 0xbd, - 0x38, 0xbf, 0x71, 0x8e, 0xc0, 0x08, 0x46, 0xa9, 0x13, 0x02, 0x10, 0x12, 0x0f, 0x83, 0x2a, 0x26, - 0xc8, 0xf8, 0x0b, 0x15, 0xee, 0xdd, 0x5f, 0x68, 0xe6, 0x1e, 0xfc, 0x85, 0x66, 0x0f, 0xe9, 0x2f, - 0xd4, 0x82, 0x79, 0xcf, 0x7f, 0xdf, 0xf5, 0xc3, 0x60, 0x70, 0x9b, 0xbc, 0x7e, 0x88, 0xaf, 0x48, - 0x71, 0x57, 0x6b, 0x3c, 0x8f, 0x8e, 0x37, 0x39, 0x30, 0x23, 0x7a, 0x71, 0xb8, 0xa3, 0x44, 0xf4, - 0xff, 0x10, 0x5b, 0xd3, 0x18, 0xd8, 0xfc, 0xe4, 0x73, 0x76, 0x97, 0x1b, 0xdb, 0x5e, 0x81, 0xa4, - 0x51, 0x8d, 0x79, 0xdb, 0xd2, 0x60, 0xb9, 0x62, 0x86, 0x78, 0x6d, 0xb5, 0x2b, 0xd8, 0xdd, 0xd8, - 0x73, 0xea, 0xaf, 0x73, 0x80, 0xb2, 0x15, 0x47, 0x2f, 0x41, 0x91, 0x6e, 0xfd, 0xce, 0x60, 0xf8, - 0x1e, 0x73, 0x72, 0xa1, 0x68, 0x0f, 0x42, 0xb2, 0x88, 0xf6, 0x40, 0x93, 0xcd, 0xe1, 0x7b, 0x3d, - 0xf4, 0x16, 0x1c, 0x23, 0x03, 0xdf, 0x77, 0x07, 0x5e, 0xd0, 0x75, 0x08, 0xde, 0x5e, 0xa7, 0xc7, - 0xc2, 0x18, 0x3d, 0x45, 0xe2, 0xed, 0x65, 0xb3, 0x27, 0x4c, 0x10, 0xe2, 0x4b, 0xd2, 0x22, 0x94, - 0x2d, 0x4a, 0x88, 0x6c, 0x90, 0x45, 0xfe, 0x9b, 0xa3, 0x5e, 0x8f, 0xcd, 0xb9, 0x32, 0x56, 0x7f, - 0xd3, 0x79, 0x13, 0x0a, 0x5e, 0x8a, 0x0b, 0xae, 0x8d, 0x7a, 0x3d, 0xf4, 0x02, 0x40, 0xe0, 0x3b, - 0x07, 0xde, 0x70, 0x48, 0x0d, 0x64, 0x91, 0x1f, 0x58, 0x9c, 0x2a, 0x0e, 0x5f, 0xe0, 0x37, 0x69, - 0x22, 0x1e, 0xbe, 0x7e, 0x67, 0xcf, 0x25, 0xde, 0xd3, 0xf4, 0x31, 0x14, 0x03, 0x26, 0xe7, 0x89, - 0xc9, 0x69, 0xb4, 0xe7, 0x5a, 0xde, 0x87, 0xfc, 0x2d, 0xfb, 0x0d, 0x58, 0x61, 0xcf, 0x90, 0x77, - 0xbc, 0x70, 0x9f, 0xc9, 0xdd, 0xf7, 0x23, 0xb4, 0x0b, 0x82, 0xf7, 0xdf, 0x0a, 0x00, 0xca, 0x8e, - 0xc5, 0x81, 0x49, 0x2e, 0xc2, 0x0c, 0xd6, 0x26, 0xf8, 0xad, 0x04, 0xb9, 0x2b, 0x25, 0xe5, 0x8a, - 0x77, 0xa5, 0x84, 0x02, 0xef, 0x13, 0xa6, 0xbb, 0x47, 0x2e, 0xc6, 0x72, 0xf1, 0x15, 0xc6, 0x80, - 0x26, 0x25, 0xa4, 0x57, 0x9a, 0x84, 0x1a, 0x00, 0x31, 0x54, 0x08, 0xd3, 0x6f, 0x57, 0x62, 0x9f, - 0x7b, 0x96, 0xc1, 0x10, 0xa7, 0x63, 0xb8, 0x11, 0x71, 0xfa, 0xc4, 0x64, 0x68, 0x0b, 0x0a, 0x76, - 0x27, 0xf2, 0x72, 0x9a, 0x00, 0xa0, 0x72, 0x96, 0x85, 0x99, 0x8a, 0x41, 0x54, 0x96, 0xc2, 0x4e, - 0x22, 0x1a, 0x1f, 0x29, 0x04, 0xa9, 0x30, 0xcb, 0x42, 0x88, 0x4e, 0x40, 0xd3, 0x62, 0x11, 0x44, - 0x19, 0x86, 0x26, 0x49, 0x14, 0xa5, 0x1d, 0x16, 0x2c, 0xf4, 0x59, 0xc8, 0x5b, 0x56, 0x93, 0xb9, - 0x0d, 0x2f, 0xc6, 0xba, 0x8a, 0x65, 0x35, 0x79, 0xc4, 0xe5, 0x03, 0x81, 0x0d, 0x13, 0xa3, 0xef, - 0x41, 0x51, 0x10, 0xc4, 0x99, 0xc3, 0x3d, 0xe9, 0x03, 0x2f, 0x4e, 0x16, 0xb7, 0x33, 0x81, 0x1a, - 0x35, 0x40, 0xde, 0x1a, 0xbd, 0xed, 0x2a, 0xfd, 0x3e, 0xf1, 0xd0, 0x79, 0xdf, 0x1d, 0x50, 0x34, - 0xec, 0xb9, 0x18, 0x7e, 0xd2, 0xe9, 0xf4, 0xfb, 0x4e, 0x97, 0xe7, 0x8a, 0x37, 0x33, 0x69, 0x4e, - 0xd4, 0x82, 0x15, 0xcb, 0x0d, 0x47, 0x7d, 0xfa, 0xbc, 0xa7, 0x16, 0x0c, 0xb0, 0x6a, 0x42, 0x37, - 0x0c, 0x82, 0xd4, 0x37, 0xc4, 0x99, 0xfc, 0x4d, 0xd5, 0xcd, 0x60, 0x90, 0x52, 0x53, 0xb2, 0xcc, - 0x25, 0x57, 0x1c, 0x72, 0x7c, 0xde, 0x27, 0x15, 0x1e, 0x72, 0xde, 0x73, 0x85, 0x27, 0x56, 0x73, - 0x9e, 0x1e, 0x03, 0x21, 0x43, 0xcc, 0xb3, 0x02, 0x84, 0x4c, 0x02, 0x38, 0xe6, 0xd3, 0x82, 0x00, - 0x4d, 0xc6, 0xc6, 0xe2, 0x65, 0x80, 0x57, 0x03, 0xcf, 0x6f, 0xba, 0xe1, 0x7e, 0xd0, 0x15, 0x90, - 0x6c, 0x8a, 0xef, 0x04, 0x9e, 0xef, 0x1c, 0x90, 0xe4, 0xaf, 0xbf, 0x7a, 0x44, 0x20, 0x32, 0x85, - 0xdf, 0xe8, 0x49, 0x98, 0xc7, 0xff, 0xec, 0xf8, 0x91, 0x12, 0xbd, 0xc0, 0x24, 0xdc, 0x2c, 0x72, - 0x7b, 0x44, 0x80, 0xae, 0x12, 0xc8, 0x7a, 0xaf, 0x1f, 0x0a, 0x62, 0x35, 0xc7, 0xa7, 0xf7, 0xfa, - 0x61, 0x1a, 0x6d, 0x52, 0x20, 0x46, 0xf5, 0xa8, 0xea, 0x3c, 0xe8, 0x01, 0x43, 0xc6, 0x27, 0xb7, - 0x74, 0x6c, 0xae, 0x39, 0x1c, 0xe6, 0x4e, 0x34, 0xbf, 0xa4, 0xd8, 0x48, 0x25, 0xac, 0x7a, 0x95, - 0x5a, 0x77, 0xd8, 0xe9, 0x46, 0x2b, 0x31, 0xdc, 0xef, 0x3a, 0xbb, 0x24, 0x39, 0x51, 0x89, 0x88, - 0x18, 0x6d, 0xc0, 0x32, 0xc5, 0x5b, 0x88, 0x82, 0x27, 0xb1, 0x93, 0x8e, 0xec, 0x6d, 0x71, 0x74, - 0x25, 0xf1, 0xf3, 0x29, 0x06, 0x54, 0x83, 0x19, 0xa2, 0x5a, 0x32, 0x27, 0x83, 0x53, 0xa2, 0x4e, - 0x9d, 0x5e, 0x47, 0x64, 0x5f, 0x21, 0xda, 0xb4, 0xb8, 0xaf, 0x10, 0x52, 0xf4, 0x3a, 0x80, 0xea, - 0x0f, 0x82, 0x5e, 0x8f, 0x00, 0x31, 0xce, 0x11, 0xc5, 0xec, 0x4c, 0x72, 0x3d, 0x92, 0x52, 0x62, - 0x22, 0x86, 0x2f, 0x44, 0xfe, 0x3b, 0x29, 0xb8, 0x46, 0xa1, 0xac, 0x92, 0x06, 0xb3, 0x74, 0x31, - 0x12, 0x50, 0x53, 0x06, 0xd3, 0x2e, 0x40, 0x62, 0x52, 0x50, 0x53, 0x96, 0x9e, 0x05, 0x35, 0x15, - 0x18, 0x4a, 0x5b, 0x70, 0x7c, 0x5c, 0xc3, 0x12, 0xca, 0xb0, 0x74, 0x58, 0x65, 0xf8, 0x0f, 0x79, - 0x58, 0x20, 0xa5, 0xf1, 0x5d, 0x58, 0x81, 0x45, 0x6b, 0xf4, 0x76, 0x04, 0x0e, 0xc2, 0x77, 0x63, - 0x52, 0xbf, 0xa1, 0x98, 0x21, 0x1a, 0x52, 0x13, 0x1c, 0x48, 0x85, 0x25, 0x7e, 0x12, 0x6c, 0x72, - 0xc7, 0x85, 0x08, 0x4f, 0x94, 0xc3, 0x56, 0x65, 0x83, 0xc7, 0xa5, 0x98, 0xe2, 0xf3, 0x20, 0x7f, - 0x37, 0xe7, 0x41, 0xe1, 0x50, 0xe7, 0xc1, 0x1b, 0xb0, 0xc0, 0xbf, 0x46, 0x76, 0xf2, 0x99, 0xfb, - 0xdb, 0xc9, 0x13, 0x85, 0xa1, 0x46, 0xb4, 0xa3, 0xcf, 0x4e, 0xdd, 0xd1, 0x89, 0x75, 0x9a, 0xaf, - 0xb2, 0x4c, 0x3c, 0x68, 0x56, 0x06, 0x89, 0xae, 0xb4, 0x59, 0x69, 0xdd, 0xc3, 0x29, 0xf9, 0x1c, - 0xcc, 0x37, 0x02, 0x6e, 0x40, 0x12, 0x6e, 0xee, 0x7b, 0x3c, 0x51, 0x14, 0x17, 0x22, 0xca, 0xe8, - 0x74, 0xcb, 0x3f, 0x88, 0xd3, 0xed, 0x2a, 0x00, 0xf3, 0x88, 0x89, 0xa3, 0xa2, 0x90, 0x25, 0xc3, - 0x7d, 0xbf, 0x93, 0x06, 0x04, 0x81, 0x18, 0xef, 0x4e, 0xec, 0x09, 0x93, 0xb2, 0xbb, 0x1b, 0x8c, - 0xfc, 0x30, 0x11, 0x46, 0x90, 0xc1, 0x40, 0xe0, 0x23, 0x81, 0xe4, 0x89, 0xdb, 0x43, 0x8a, 0xed, - 0xc1, 0x0e, 0x08, 0x7a, 0x2d, 0x7a, 0x7b, 0x39, 0x35, 0xaa, 0x7a, 0x29, 0xd3, 0x43, 0x13, 0x5f, - 0x5c, 0x96, 0x3e, 0x97, 0x44, 0x30, 0xe7, 0x7b, 0x18, 0xea, 0x17, 0x01, 0xa2, 0x97, 0x21, 0x7c, - 0xac, 0xa9, 0x26, 0x17, 0xa5, 0x8a, 0xbd, 0x1c, 0xd3, 0x0a, 0xad, 0xc9, 0x3f, 0xa8, 0xd6, 0xd8, - 0x50, 0x34, 0xde, 0x0d, 0x3b, 0xf1, 0x53, 0x22, 0xb0, 0x22, 0x49, 0x96, 0xec, 0x4c, 0x3c, 0xfa, - 0x7b, 0x2c, 0x07, 0x4f, 0x8c, 0xfe, 0x1e, 0x31, 0x96, 0x5e, 0x83, 0x65, 0xd1, 0x41, 0xf5, 0xb6, - 0xbf, 0x8b, 0x7e, 0x40, 0x51, 0xe8, 0xa4, 0x84, 0x8e, 0x23, 0x10, 0xe1, 0x1d, 0xf7, 0xb6, 0xbf, - 0x4b, 0xe5, 0x9f, 0xce, 0x2d, 0xb1, 0xae, 0x44, 0xfb, 0xfc, 0x52, 0x02, 0x94, 0x25, 0x17, 0x77, - 0x13, 0xe9, 0x7f, 0x20, 0x5d, 0xa6, 0xa4, 0xb2, 0xc2, 0xdd, 0x48, 0x65, 0xe5, 0x5f, 0x4a, 0xb0, - 0xac, 0x29, 0x4d, 0x86, 0xbc, 0x4c, 0x2d, 0x11, 0x8f, 0xc2, 0x19, 0x4d, 0x69, 0x3a, 0x2d, 0xa3, - 0xa1, 0x55, 0xae, 0x3b, 0x63, 0x01, 0x15, 0xcf, 0xc0, 0xc3, 0x59, 0x92, 0xd8, 0x62, 0x71, 0x1a, - 0x56, 0xb3, 0xd9, 0x1c, 0x74, 0x71, 0x3c, 0x33, 0xc7, 0x67, 0xcc, 0x97, 0xaf, 0xc1, 0x32, 0xc7, - 0x22, 0xb4, 0x1b, 0x16, 0x81, 0x30, 0x5e, 0x86, 0xe2, 0xb6, 0x6a, 0x6a, 0xb5, 0xeb, 0x4e, 0xad, - 0xdd, 0x68, 0xc8, 0x47, 0xd0, 0x22, 0xcc, 0xb3, 0x84, 0x8a, 0x22, 0x4b, 0x68, 0x01, 0xe6, 0x34, - 0xdd, 0x52, 0x2b, 0x6d, 0x53, 0x95, 0x73, 0xe5, 0x6b, 0xb0, 0xd4, 0x1a, 0x78, 0xef, 0x77, 0x42, - 0x77, 0xcb, 0xbd, 0x4d, 0x0c, 0x0e, 0x47, 0x21, 0x6f, 0x2a, 0x3b, 0xf2, 0x11, 0x04, 0x30, 0xdb, - 0xda, 0xaa, 0x58, 0x97, 0x2f, 0xcb, 0x12, 0x2a, 0xc2, 0xd1, 0xcd, 0x4a, 0xcb, 0xd9, 0x6a, 0x5a, - 0x72, 0x0e, 0xff, 0x51, 0x76, 0x2c, 0xf2, 0x27, 0x5f, 0x7e, 0x06, 0x56, 0x88, 0xac, 0xd0, 0xf0, - 0x86, 0xa1, 0xeb, 0xbb, 0x03, 0x52, 0x87, 0x05, 0x98, 0xb3, 0x5c, 0xbc, 0xc8, 0x43, 0x97, 0x56, - 0xa0, 0x39, 0xea, 0x85, 0x5e, 0xbf, 0xe7, 0x7e, 0x20, 0x4b, 0xe5, 0xab, 0xb0, 0x6c, 0x06, 0xa3, - 0xd0, 0xf3, 0xf7, 0xac, 0x10, 0x53, 0xec, 0xdd, 0x46, 0x0f, 0xc1, 0x4a, 0x5b, 0x57, 0x9a, 0x1b, - 0xda, 0x66, 0xdb, 0x68, 0x5b, 0x4e, 0x53, 0xb1, 0x2b, 0x75, 0x6a, 0xee, 0x68, 0x1a, 0x96, 0xed, - 0x98, 0x6a, 0x45, 0xd5, 0x6d, 0x59, 0x2a, 0xff, 0x4c, 0x82, 0xa5, 0xf6, 0x90, 0x3d, 0xfd, 0x6e, - 0x13, 0x07, 0xce, 0xb3, 0x70, 0xba, 0x6d, 0xa9, 0xa6, 0x63, 0x1b, 0x5b, 0xaa, 0xee, 0xb4, 0x2d, - 0x65, 0x33, 0x8d, 0xe6, 0xf9, 0x08, 0x9c, 0x12, 0x28, 0x4c, 0xb5, 0x62, 0x6c, 0xab, 0xa6, 0xd3, - 0x52, 0x2c, 0x6b, 0xc7, 0x30, 0xab, 0xb2, 0x84, 0xd6, 0xe0, 0xc4, 0x18, 0x82, 0x66, 0x4d, 0x91, - 0x73, 0x99, 0x3c, 0x5d, 0xdd, 0x51, 0x1a, 0xce, 0x86, 0x61, 0xcb, 0xf9, 0x72, 0x13, 0x1f, 0x74, - 0x04, 0xf0, 0x8e, 0x86, 0x2b, 0x98, 0x83, 0x82, 0x6e, 0xe8, 0x6a, 0xda, 0x24, 0xb5, 0x00, 0x73, - 0x4a, 0xab, 0x65, 0x1a, 0xdb, 0x64, 0x40, 0x01, 0x66, 0xab, 0xaa, 0x8e, 0x6b, 0x96, 0xc7, 0x39, - 0x2d, 0xd3, 0x68, 0x1a, 0xb6, 0x5a, 0x95, 0x0b, 0x65, 0x93, 0x2f, 0x18, 0x5e, 0xe8, 0x6e, 0x40, - 0xed, 0x3f, 0x55, 0xb5, 0xa6, 0xb4, 0x1b, 0x36, 0xeb, 0x90, 0xeb, 0x8e, 0xa9, 0xbe, 0xd6, 0x56, - 0x2d, 0xdb, 0x92, 0x25, 0x24, 0xc3, 0x82, 0xae, 0xaa, 0x55, 0xcb, 0x31, 0xd5, 0x6d, 0x4d, 0xdd, - 0x91, 0x73, 0xb8, 0x4c, 0xfa, 0x1b, 0x7f, 0xa1, 0xfc, 0xa9, 0x04, 0x88, 0x82, 0x05, 0x72, 0x58, - 0x79, 0x32, 0x3e, 0xeb, 0xb0, 0x56, 0xc7, 0x1d, 0x4b, 0x9a, 0xd6, 0x34, 0xaa, 0xe9, 0x2e, 0x3b, - 0x01, 0x28, 0x95, 0x6f, 0xd4, 0x6a, 0xb2, 0x84, 0x4e, 0xc1, 0xb1, 0x54, 0x7a, 0xd5, 0x34, 0x5a, - 0x72, 0x6e, 0x2d, 0x37, 0x27, 0xa1, 0x93, 0x99, 0xcc, 0x2d, 0x55, 0x6d, 0xc9, 0x79, 0x3c, 0x44, - 0xa9, 0x0c, 0x3e, 0x01, 0x29, 0x7b, 0xa1, 0xfc, 0x91, 0x04, 0x27, 0x68, 0x35, 0xf9, 0x6c, 0x8e, - 0xaa, 0x7a, 0x1a, 0x56, 0x19, 0xae, 0xe9, 0xb8, 0x8a, 0x1e, 0x07, 0x39, 0x91, 0x4b, 0xab, 0xf9, - 0x10, 0xac, 0x24, 0x52, 0x49, 0x3d, 0x72, 0x78, 0xad, 0x26, 0x92, 0x37, 0x54, 0xcb, 0x76, 0xd4, - 0x5a, 0xcd, 0x30, 0x6d, 0x5a, 0x91, 0x7c, 0xb9, 0x04, 0x2b, 0x15, 0x77, 0x10, 0x62, 0x1d, 0xc4, - 0x1f, 0x7a, 0x81, 0x4f, 0xaa, 0xb0, 0x08, 0xf3, 0xea, 0xeb, 0xb6, 0xaa, 0x5b, 0x9a, 0xa1, 0xcb, - 0x47, 0xca, 0xa7, 0x53, 0x34, 0x7c, 0xd5, 0x58, 0x56, 0x5d, 0x3e, 0x52, 0xee, 0xc0, 0x22, 0x7f, - 0x6a, 0x4d, 0x67, 0xc5, 0x3a, 0xac, 0xf1, 0xb9, 0x46, 0xd6, 0x6f, 0xba, 0x09, 0xab, 0x70, 0x3c, - 0x9b, 0xaf, 0xda, 0xb2, 0x84, 0x47, 0x21, 0x95, 0x83, 0xd3, 0x73, 0xe5, 0xdf, 0x4b, 0xb0, 0xca, - 0x02, 0xb8, 0x32, 0x7b, 0x04, 0x85, 0x52, 0x27, 0xb0, 0x84, 0x65, 0xb8, 0x60, 0x9b, 0x6d, 0xcb, - 0x56, 0xab, 0x4e, 0x55, 0xdd, 0xd6, 0x2a, 0x2a, 0x99, 0x2e, 0x9a, 0xa9, 0x36, 0x55, 0xdd, 0x4e, - 0x7d, 0xfa, 0x09, 0x78, 0x6c, 0x0a, 0xad, 0x6e, 0xd8, 0xfc, 0x3f, 0x5e, 0x25, 0x8f, 0xc1, 0xff, - 0x4d, 0x21, 0x8e, 0x08, 0x73, 0xe5, 0x37, 0x61, 0x21, 0x11, 0x1e, 0xe6, 0x24, 0x1c, 0x13, 0xff, - 0xb7, 0x5c, 0xbf, 0xeb, 0xf9, 0x7b, 0xf2, 0x91, 0x74, 0x86, 0x39, 0xf2, 0x7d, 0x9c, 0x41, 0x16, - 0xa4, 0x98, 0x61, 0xbb, 0x83, 0x03, 0xcf, 0xef, 0x84, 0x6e, 0x57, 0xce, 0x95, 0x2f, 0xc1, 0x62, - 0x02, 0xbf, 0x12, 0xf7, 0x7c, 0xc3, 0x60, 0xfb, 0x55, 0x53, 0xad, 0x6a, 0xed, 0xa6, 0x3c, 0x83, - 0x97, 0x62, 0x5d, 0xdb, 0xac, 0xcb, 0x50, 0xfe, 0x44, 0xc2, 0x12, 0x33, 0xe9, 0x9f, 0x66, 0x4d, - 0xe1, 0x63, 0x85, 0xe7, 0x09, 0x85, 0xba, 0x55, 0x2d, 0x8b, 0x9a, 0x52, 0x4f, 0xc3, 0x2a, 0xfb, - 0xe3, 0x28, 0x7a, 0xd5, 0xa9, 0x2b, 0x66, 0x75, 0x47, 0x31, 0xf1, 0xe4, 0xb9, 0x2e, 0xe7, 0xc8, - 0x8a, 0x10, 0x52, 0x1c, 0xdb, 0x68, 0x57, 0xea, 0x72, 0x1e, 0x4f, 0xc0, 0x44, 0x7a, 0x4b, 0xd3, - 0xe5, 0x02, 0x59, 0x5f, 0x19, 0x6a, 0x52, 0x2c, 0xce, 0x9f, 0x29, 0xdf, 0x91, 0xe0, 0xa4, 0xe5, - 0xed, 0xf9, 0x9d, 0x70, 0x34, 0x70, 0x95, 0xde, 0x5e, 0x30, 0xf0, 0xc2, 0xfd, 0x03, 0x6b, 0xe4, - 0x85, 0x2e, 0xba, 0x08, 0xe7, 0x2d, 0x6d, 0x53, 0x57, 0x6c, 0xbc, 0x3e, 0x94, 0xc6, 0xa6, 0x61, - 0x6a, 0x76, 0xbd, 0xe9, 0x58, 0x6d, 0x2d, 0x33, 0x75, 0xce, 0xc1, 0xd9, 0xc9, 0xa4, 0x0d, 0x75, - 0x53, 0xa9, 0x5c, 0x97, 0xa5, 0xe9, 0x05, 0x6e, 0x28, 0x0d, 0x45, 0xaf, 0xa8, 0x55, 0x67, 0xfb, - 0xb2, 0x9c, 0x43, 0xe7, 0xe1, 0xd1, 0xc9, 0xa4, 0x35, 0xad, 0x65, 0x61, 0xb2, 0xfc, 0xf4, 0xef, - 0xd6, 0xad, 0x26, 0xa6, 0x2a, 0x94, 0x3d, 0x90, 0xd3, 0x9e, 0xf9, 0x19, 0xc3, 0xbd, 0xd9, 0xd6, - 0x75, 0xba, 0x4b, 0x2e, 0x43, 0xd1, 0xb0, 0xeb, 0xaa, 0xc9, 0x10, 0x97, 0x09, 0xc4, 0x72, 0x5b, - 0x57, 0xda, 0x76, 0xdd, 0x30, 0xb5, 0x1b, 0x64, 0xbb, 0x5c, 0x85, 0xe3, 0x56, 0x43, 0xa9, 0x6c, - 0x91, 0x99, 0xa9, 0xe9, 0x4e, 0xa5, 0xae, 0xe8, 0xba, 0xda, 0x90, 0xa1, 0xfc, 0x5b, 0x89, 0x5a, - 0xd0, 0xc7, 0xb9, 0xf0, 0xa1, 0x27, 0xe1, 0x71, 0x63, 0xcb, 0x56, 0x9c, 0x56, 0xa3, 0xbd, 0xa9, - 0xe9, 0x8e, 0x75, 0x5d, 0xaf, 0xf0, 0x83, 0xb4, 0x92, 0xdd, 0x51, 0x1e, 0x87, 0x73, 0x53, 0xa9, - 0x63, 0x6c, 0xe4, 0x0b, 0x50, 0x9a, 0x4a, 0xc9, 0x1a, 0x52, 0xfe, 0x42, 0x82, 0x53, 0x53, 0x2c, - 0x8f, 0xe8, 0x29, 0xb8, 0x58, 0x57, 0x95, 0x6a, 0x43, 0xb5, 0x2c, 0x07, 0xb7, 0x57, 0xd5, 0x6d, - 0x66, 0xe0, 0x1f, 0xbb, 0x5f, 0x5c, 0x84, 0xf3, 0xd3, 0xc9, 0xe3, 0x93, 0xe7, 0x71, 0x38, 0x37, - 0x9d, 0x94, 0x9d, 0x44, 0x39, 0xbc, 0x6b, 0x4c, 0xa7, 0x8c, 0x4e, 0xb0, 0x7c, 0xf9, 0x63, 0x09, - 0x4e, 0x8c, 0x57, 0xd8, 0x71, 0xdd, 0x34, 0xdd, 0xb2, 0x95, 0x46, 0xc3, 0x69, 0x29, 0xa6, 0xd2, - 0x74, 0x54, 0xdd, 0x34, 0x1a, 0x8d, 0x71, 0x3b, 0xf7, 0x39, 0x38, 0x3b, 0x99, 0xd4, 0xaa, 0x98, - 0x5a, 0x0b, 0x6f, 0x81, 0x25, 0x58, 0x9f, 0x4c, 0xa5, 0x6a, 0x15, 0x55, 0xce, 0x6d, 0xbc, 0xfc, - 0xd9, 0x3f, 0xd6, 0x8f, 0x7c, 0x76, 0x67, 0x5d, 0xfa, 0xf2, 0xce, 0xba, 0xf4, 0xf7, 0x3b, 0xeb, - 0xd2, 0x8d, 0x27, 0xee, 0x22, 0xfa, 0xfc, 0xdb, 0xb3, 0xe4, 0x45, 0xcb, 0x95, 0xff, 0x04, 0x00, - 0x00, 0xff, 0xff, 0x83, 0x0f, 0x8e, 0x93, 0x9d, 0x94, 0x01, 0x00, + 0x36, 0x22, 0xff, 0x4b, 0xea, 0xae, 0xee, 0xb7, 0x6d, 0xeb, 0x8a, 0x87, 0x94, 0xec, 0xd8, 0x47, + 0xfe, 0xa0, 0x6f, 0xd3, 0xc4, 0x75, 0x12, 0x27, 0xd5, 0x92, 0xb4, 0x51, 0xdb, 0xb4, 0x69, 0xd6, + 0x8f, 0x74, 0xeb, 0x5a, 0x5a, 0xa2, 0x2c, 0xd6, 0x12, 0xa9, 0x92, 0x94, 0xdd, 0xf4, 0x63, 0x84, + 0x6a, 0x31, 0x36, 0x57, 0x99, 0x52, 0x25, 0xaa, 0x69, 0xfa, 0xb2, 0xed, 0xa5, 0x0f, 0x1b, 0xba, + 0x8f, 0x62, 0x0f, 0xc3, 0x36, 0x60, 0x18, 0xd0, 0xff, 0x62, 0xff, 0x40, 0x81, 0xa2, 0x40, 0x1f, + 0xf6, 0xb4, 0x01, 0xc5, 0x16, 0x60, 0x2f, 0x7b, 0x1d, 0xf6, 0xd2, 0xa7, 0xe1, 0x7e, 0x91, 0x97, + 0xa4, 0xa4, 0xda, 0x49, 0xba, 0xa1, 0x6f, 0xd2, 0xbd, 0xe7, 0x5c, 0x5e, 0xf2, 0x7e, 0x9d, 0x73, + 0xcf, 0x39, 0xbf, 0x53, 0xdc, 0x81, 0xa5, 0x24, 0x05, 0xd2, 0x92, 0x38, 0x5b, 0x85, 0xa7, 0x15, + 0xd6, 0xd2, 0x46, 0xaf, 0x47, 0x5d, 0x44, 0x37, 0x1e, 0xfa, 0xeb, 0x97, 0xe7, 0x00, 0xff, 0xa5, + 0x3c, 0xe3, 0x70, 0xb8, 0x8a, 0xbf, 0x94, 0xe1, 0x44, 0x1c, 0x6a, 0xc6, 0x97, 0xc4, 0xb7, 0x36, + 0xee, 0x41, 0x4d, 0xf8, 0xe5, 0x73, 0x89, 0x29, 0xfb, 0x82, 0x53, 0xdc, 0x81, 0x37, 0x61, 0x75, + 0x12, 0x3d, 0x7a, 0x2c, 0x93, 0x8a, 0x9d, 0xe1, 0x30, 0x44, 0x39, 0xdb, 0x85, 0xcc, 0xec, 0x9f, + 0x4b, 0xb0, 0xc6, 0x1c, 0x1b, 0x1b, 0x6d, 0x3f, 0x08, 0xbd, 0xa0, 0x1d, 0xec, 0x7a, 0xf7, 0x27, + 0x6e, 0x67, 0x33, 0xb1, 0x2d, 0x5d, 0x4c, 0xfa, 0xaf, 0x66, 0x9e, 0x36, 0xf9, 0x6d, 0xd1, 0x65, + 0x82, 0xb8, 0xb1, 0x4b, 0x27, 0x6f, 0x9e, 0xc6, 0x49, 0x06, 0xb8, 0x40, 0x8c, 0x93, 0x24, 0x14, + 0xc5, 0x1f, 0xc3, 0xfa, 0xf4, 0x07, 0xa0, 0xb7, 0x60, 0x91, 0xa0, 0xd4, 0xb7, 0xfa, 0x7b, 0x83, + 0x76, 0xc7, 0xe3, 0x77, 0x5a, 0xfc, 0x4a, 0x51, 0xac, 0xa3, 0x28, 0x23, 0x2c, 0x6e, 0x6f, 0x8f, + 0xe0, 0xdf, 0x33, 0xa6, 0x84, 0xf7, 0xb0, 0xd8, 0x5a, 0xf1, 0x27, 0x12, 0xa0, 0x6c, 0x1b, 0xe8, + 0x59, 0x58, 0x68, 0x39, 0x65, 0x3b, 0x6c, 0x0f, 0xc2, 0x5a, 0x6f, 0x34, 0x60, 0xe8, 0x1d, 0x34, + 0x8c, 0x2b, 0xdc, 0xc5, 0x3b, 0xc3, 0x20, 0x74, 0xf7, 0x7b, 0xa3, 0x81, 0x95, 0xa0, 0x23, 0x50, + 0xf8, 0x9e, 0xf7, 0x4e, 0xa7, 0x7d, 0x3b, 0x09, 0x85, 0xcf, 0xca, 0x12, 0x50, 0xf8, 0xac, 0xac, + 0xf8, 0x89, 0x04, 0xa7, 0xb9, 0xc7, 0x43, 0x67, 0x4c, 0x5f, 0xca, 0x24, 0x58, 0x79, 0xc0, 0xd1, + 0xcb, 0xa6, 0xc9, 0xa6, 0x2b, 0x3c, 0x9e, 0x9f, 0x74, 0x90, 0x08, 0xa9, 0x94, 0x17, 0xbd, 0x0c, + 0x79, 0x3b, 0xec, 0xf5, 0x0f, 0x11, 0xd0, 0xaf, 0x44, 0x23, 0x1a, 0xf6, 0xfa, 0xa4, 0x09, 0xc2, + 0x59, 0xf4, 0xe0, 0x84, 0xd8, 0x39, 0xde, 0x63, 0xd4, 0x80, 0xe3, 0x0c, 0xde, 0x25, 0x65, 0x1d, + 0x9a, 0xf2, 0x4e, 0x1b, 0xcb, 0x1c, 0x35, 0x80, 0xa1, 0x67, 0x59, 0xbc, 0x8d, 0xe2, 0x2f, 0x24, + 0x28, 0x60, 0xe1, 0x81, 0xa8, 0x63, 0xf7, 0x3a, 0xa5, 0x93, 0x72, 0x20, 0x37, 0x2e, 0x46, 0xcd, + 0x1f, 0xea, 0x70, 0x7d, 0x06, 0x96, 0x53, 0x0c, 0xa8, 0x48, 0xe2, 0x45, 0xbb, 0xfe, 0x6e, 0x9b, + 0x22, 0x6b, 0x53, 0xcb, 0x5c, 0xa2, 0xac, 0xf8, 0x33, 0x09, 0x4e, 0x60, 0xe5, 0x5d, 0x27, 0xf7, + 0xb6, 0xd6, 0xa8, 0xcb, 0xd7, 0x3b, 0x16, 0x88, 0xb8, 0xeb, 0x0c, 0x8d, 0x65, 0xa3, 0x02, 0x11, + 0x2b, 0xb3, 0xa2, 0x5a, 0x54, 0x83, 0x39, 0x76, 0xbe, 0x0c, 0x19, 0xe8, 0xd5, 0xba, 0x70, 0x2b, + 0x10, 0x37, 0xcc, 0x88, 0xf0, 0x9b, 0x90, 0x2d, 0x8c, 0xf1, 0x58, 0x11, 0x77, 0xf1, 0xdf, 0x12, + 0x9c, 0x9a, 0xc0, 0x83, 0x5e, 0x84, 0x19, 0xe2, 0x92, 0xcf, 0x46, 0xef, 0xcc, 0x84, 0x47, 0x84, + 0xbb, 0xfb, 0xdb, 0x57, 0xe9, 0x41, 0x74, 0x80, 0xff, 0x58, 0x94, 0x0b, 0xbd, 0x01, 0xf3, 0x6a, + 0xa7, 0xc3, 0xf4, 0x12, 0x39, 0xa1, 0x97, 0x4c, 0x78, 0xe2, 0x95, 0x88, 0x9e, 0xea, 0x25, 0xd4, + 0x39, 0xb4, 0xd3, 0x71, 0x59, 0xb8, 0x41, 0xdc, 0xde, 0xda, 0xf7, 0x61, 0x29, 0x49, 0x7c, 0x24, + 0xbd, 0xe4, 0xb7, 0x12, 0x28, 0xc9, 0x3e, 0x7c, 0x33, 0x78, 0x07, 0xe3, 0x86, 0xf9, 0x6b, 0x26, + 0xd5, 0xaf, 0x65, 0x78, 0x70, 0xec, 0x17, 0x46, 0x4f, 0xc0, 0xac, 0xda, 0xef, 0xeb, 0x15, 0x36, + 0xab, 0x98, 0xc0, 0x43, 0xae, 0x7b, 0x13, 0x6a, 0x1b, 0x25, 0x42, 0xd7, 0x60, 0x8e, 0xcc, 0x4c, + 0xcc, 0x20, 0xc7, 0xf0, 0x53, 0xf4, 0x36, 0x24, 0x05, 0x3f, 0xc5, 0x09, 0x51, 0x15, 0x96, 0x58, + 0xe8, 0xb3, 0xe5, 0xed, 0x79, 0xef, 0x47, 0x38, 0xa8, 0x04, 0xaa, 0x95, 0xdf, 0x21, 0xbb, 0x03, + 0x5a, 0x27, 0x06, 0xff, 0x26, 0xb9, 0x50, 0x1d, 0x14, 0xd2, 0xa6, 0xd8, 0x12, 0xc5, 0xc0, 0x22, + 0xc1, 0xe8, 0xb4, 0x13, 0x13, 0xda, 0xca, 0x70, 0x46, 0xc3, 0xa5, 0x0e, 0x87, 0xfe, 0x5e, 0x70, + 0xe0, 0x05, 0xe1, 0x37, 0x37, 0x5c, 0xf1, 0x33, 0x0e, 0x35, 0x5c, 0xbf, 0xc9, 0xd3, 0xc5, 0x9c, + 0x66, 0xc3, 0x12, 0x8d, 0x00, 0x7b, 0x48, 0x24, 0x1a, 0x92, 0xca, 0x92, 0x06, 0xf7, 0x56, 0xe0, + 0x38, 0x0d, 0xba, 0xe6, 0x2b, 0xe3, 0xec, 0xd8, 0x2e, 0x50, 0x9a, 0xed, 0xab, 0x54, 0x7c, 0xa1, + 0xb1, 0x01, 0x43, 0x8b, 0xb3, 0xa2, 0x6d, 0x28, 0x94, 0xbb, 0x5e, 0x3b, 0x18, 0xf5, 0x9d, 0xc3, + 0x99, 0x01, 0x57, 0xd9, 0xbb, 0x2c, 0xec, 0x52, 0x36, 0x62, 0x3e, 0x24, 0x3b, 0xb9, 0xd8, 0x10, + 0x72, 0x22, 0x77, 0xe1, 0x3c, 0xb9, 0x72, 0x7c, 0x6a, 0xca, 0xf7, 0x49, 0x17, 0x12, 0xbe, 0xa4, + 0x2f, 0x3c, 0xf3, 0x27, 0x76, 0x61, 0xa9, 0xde, 0x1e, 0x86, 0xce, 0xa0, 0x1d, 0x0c, 0x09, 0x58, + 0xd3, 0x21, 0xc0, 0x2c, 0x78, 0xd2, 0x5b, 0x7a, 0x15, 0x19, 0x46, 0xac, 0xf4, 0x2a, 0x32, 0xd9, + 0x1c, 0x96, 0x97, 0xaa, 0x7e, 0xd0, 0xee, 0xfa, 0x1f, 0xf0, 0xa8, 0x0a, 0x2a, 0x2f, 0xdd, 0xe4, + 0x85, 0x56, 0x5c, 0x5f, 0x7c, 0x33, 0x33, 0x6e, 0xb4, 0x97, 0x05, 0x38, 0xce, 0x02, 0xe9, 0x68, + 0x60, 0x59, 0x53, 0x33, 0x2a, 0xba, 0xb1, 0xa9, 0x48, 0x68, 0x09, 0xa0, 0x69, 0x99, 0x65, 0xcd, + 0xb6, 0xf1, 0x7f, 0x19, 0xff, 0x67, 0x51, 0x67, 0xd5, 0x56, 0x5d, 0xc9, 0x09, 0x81, 0x67, 0xf9, + 0xe2, 0x67, 0x12, 0x9c, 0x1c, 0x3f, 0x94, 0xc8, 0x01, 0x12, 0x7a, 0xc8, 0x0c, 0xc2, 0xcf, 0x4e, + 0x1d, 0xf7, 0xb1, 0xc5, 0xe9, 0x10, 0xc6, 0x90, 0x86, 0xc6, 0xc9, 0xdc, 0xea, 0x13, 0xa7, 0x6b, + 0xf5, 0x3b, 0xc5, 0x32, 0xac, 0x4e, 0x6a, 0x23, 0xf9, 0xaa, 0xcb, 0x50, 0x50, 0x9b, 0xcd, 0xba, + 0x5e, 0x56, 0x1d, 0xdd, 0x34, 0x14, 0x09, 0xcd, 0xc3, 0xcc, 0xa6, 0x65, 0xb6, 0x9a, 0x8a, 0x5c, + 0xfc, 0x58, 0x82, 0x45, 0x3d, 0x08, 0xbd, 0x3d, 0xea, 0xa5, 0x7a, 0xaf, 0x8b, 0xef, 0x85, 0xc4, + 0xe2, 0x5b, 0x8d, 0x82, 0x74, 0xa3, 0x07, 0x1c, 0x6a, 0xe5, 0xfd, 0x45, 0x82, 0x95, 0x0c, 0x0f, + 0xb2, 0xe1, 0xb8, 0xba, 0x63, 0x9b, 0x7a, 0xa5, 0xcc, 0x7a, 0xc6, 0xa5, 0x72, 0x56, 0x9a, 0x7d, + 0x0a, 0x8d, 0x81, 0xb9, 0x35, 0x74, 0x7b, 0x7e, 0x47, 0x48, 0x12, 0x55, 0x3b, 0x66, 0xf1, 0x96, + 0xc8, 0x49, 0xf6, 0xc1, 0x68, 0xe0, 0x91, 0x66, 0xe5, 0xc4, 0x8d, 0x66, 0x54, 0x9e, 0x6d, 0x98, + 0x38, 0x65, 0xb6, 0x71, 0x7d, 0xb6, 0xe9, 0xb8, 0xbd, 0x8d, 0x45, 0x28, 0x30, 0xad, 0x85, 0x28, + 0x04, 0x1f, 0x49, 0xb0, 0x3a, 0xa9, 0xaf, 0x58, 0x11, 0x4a, 0x06, 0xc4, 0x9d, 0x8c, 0x60, 0x7e, + 0x93, 0x91, 0x70, 0x9c, 0x0c, 0xbd, 0x04, 0x05, 0x9a, 0x03, 0xdb, 0xbe, 0xd6, 0xb2, 0x74, 0x36, + 0x41, 0xce, 0xfe, 0xeb, 0xcb, 0x73, 0xa7, 0x68, 0xc6, 0x6c, 0x77, 0x78, 0xcd, 0x1d, 0x0d, 0xfc, + 0x04, 0x24, 0xaa, 0xc8, 0x51, 0xfc, 0x50, 0x82, 0xb5, 0xc9, 0x2f, 0x89, 0x4f, 0x19, 0x07, 0xcb, + 0xe6, 0x71, 0x4c, 0x11, 0x39, 0x65, 0x88, 0xbc, 0x9e, 0x0a, 0x2a, 0x8a, 0x08, 0x31, 0x53, 0x94, + 0x7e, 0x51, 0xce, 0x64, 0x5d, 0x4b, 0x32, 0x71, 0xc2, 0xe2, 0xef, 0x65, 0x38, 0x89, 0x27, 0x50, + 0xd7, 0x1b, 0x0e, 0xd5, 0x51, 0xb8, 0xef, 0x05, 0x21, 0x13, 0xa9, 0xd0, 0x73, 0x30, 0xbb, 0x7f, + 0xb4, 0xdb, 0x40, 0x4a, 0x8e, 0x10, 0x90, 0x4d, 0x99, 0x3b, 0x75, 0xe2, 0xdf, 0xe8, 0x2c, 0x08, + 0x59, 0xee, 0xc8, 0x9e, 0xba, 0x60, 0xcd, 0xf7, 0xa3, 0x5c, 0x77, 0xcf, 0xc3, 0x0c, 0xd1, 0xfe, + 0xd9, 0xd6, 0xc8, 0x45, 0xda, 0xf1, 0x3d, 0x23, 0x77, 0x03, 0x16, 0x65, 0x40, 0x4f, 0x02, 0xc4, + 0x70, 0xb2, 0x6c, 0xef, 0xe3, 0x6a, 0x74, 0x84, 0x28, 0x6b, 0xcd, 0x1f, 0xdc, 0x6c, 0x33, 0x8c, + 0xd6, 0x12, 0xac, 0xf0, 0x4f, 0xd2, 0xe7, 0xd8, 0x35, 0xcc, 0x3c, 0xb5, 0x4c, 0x2b, 0xf4, 0x3e, + 0xc3, 0xaf, 0x29, 0xfe, 0x53, 0x86, 0xf9, 0x1d, 0x2c, 0x28, 0x10, 0xf5, 0x77, 0xba, 0x3a, 0xfd, + 0x34, 0x14, 0xea, 0xbd, 0x36, 0xbb, 0xbb, 0x1f, 0x32, 0xf8, 0x2c, 0x12, 0x58, 0xd3, 0xed, 0xb5, + 0xb9, 0x19, 0x60, 0x68, 0x89, 0x44, 0x5f, 0x13, 0x14, 0xf4, 0x0a, 0xcc, 0x52, 0x5b, 0x0a, 0xbb, + 0xa8, 0xe1, 0xa2, 0x62, 0xd4, 0xa3, 0x2b, 0xb4, 0x5a, 0xb8, 0x6e, 0xa6, 0xf6, 0x18, 0x51, 0x6e, + 0x61, 0xe8, 0x59, 0x82, 0xb2, 0x3f, 0x73, 0x38, 0x65, 0x5f, 0x40, 0x09, 0x99, 0x3d, 0x0c, 0x4a, + 0xc8, 0xda, 0x75, 0x28, 0x08, 0xfd, 0x39, 0x92, 0xe4, 0xf8, 0x53, 0x19, 0x16, 0xc9, 0x5b, 0x45, + 0x8e, 0x15, 0xdf, 0xce, 0xab, 0x8b, 0x17, 0x12, 0x57, 0x17, 0xab, 0xe2, 0x78, 0xd1, 0x37, 0x9b, + 0x72, 0x67, 0xf1, 0x0a, 0xac, 0x64, 0x08, 0xd1, 0x33, 0x30, 0x83, 0xbb, 0xcf, 0x55, 0x3d, 0x25, + 0x3d, 0x03, 0x62, 0x44, 0x39, 0xfc, 0xe2, 0x43, 0x8b, 0x52, 0x17, 0xff, 0x23, 0xc1, 0x02, 0xc3, + 0x17, 0x0e, 0x6e, 0xf6, 0xbe, 0xf6, 0x73, 0x5e, 0x4a, 0x7f, 0x4e, 0x1a, 0xe2, 0xca, 0x3e, 0xe7, + 0xff, 0xfa, 0x23, 0x5e, 0x4f, 0x7c, 0xc4, 0x53, 0x11, 0xbe, 0x0c, 0x7f, 0x9d, 0x29, 0xdf, 0xf0, + 0xcf, 0x04, 0x71, 0x2d, 0x49, 0x88, 0x7e, 0x08, 0xf3, 0x86, 0x77, 0x2b, 0xa1, 0x31, 0x5d, 0x9a, + 0xd0, 0xe8, 0x95, 0x88, 0x90, 0xae, 0x29, 0x72, 0xd8, 0x04, 0xde, 0x2d, 0x37, 0x63, 0xc6, 0x89, + 0x9b, 0xc4, 0x4a, 0x53, 0x92, 0xed, 0x28, 0x53, 0x9f, 0x05, 0x52, 0x90, 0xa8, 0xed, 0x3f, 0xe5, + 0x01, 0x62, 0x1f, 0x74, 0xbc, 0x00, 0x13, 0x16, 0x6c, 0x7e, 0x77, 0x4c, 0x8a, 0xc4, 0x39, 0xce, + 0x0d, 0xdb, 0x97, 0xd8, 0xa5, 0xa8, 0x3c, 0x19, 0xff, 0x87, 0x5c, 0x8f, 0x96, 0x99, 0x8f, 0x77, + 0xc7, 0xeb, 0xb6, 0xe9, 0x5e, 0x9c, 0xdb, 0xb8, 0x40, 0xe0, 0xde, 0xa2, 0xd2, 0x09, 0x89, 0xe2, + 0x88, 0x27, 0x78, 0x05, 0x13, 0x64, 0xe2, 0x3a, 0xf2, 0x77, 0x1f, 0xd7, 0x31, 0x73, 0x17, 0x71, + 0x1d, 0xb3, 0x87, 0x8c, 0xeb, 0x68, 0xc2, 0xbc, 0x1f, 0xbc, 0xe7, 0x05, 0x61, 0x6f, 0x70, 0x9b, + 0x58, 0xa9, 0xe3, 0xab, 0x2c, 0xfc, 0xa9, 0x75, 0x5e, 0x47, 0xc7, 0x9b, 0x1c, 0x98, 0x11, 0xbd, + 0x38, 0xdc, 0x51, 0x21, 0xfa, 0x2e, 0xc4, 0x56, 0x0f, 0x06, 0x0a, 0x3e, 0xf9, 0x9c, 0xdd, 0xe5, + 0x46, 0x91, 0x97, 0x21, 0x69, 0xfc, 0x60, 0x51, 0x91, 0x34, 0xa9, 0xa9, 0x58, 0x21, 0x42, 0x5e, + 0xed, 0x0a, 0xf6, 0x11, 0xe6, 0xf6, 0xfa, 0x95, 0x0c, 0x28, 0xdb, 0x71, 0xf4, 0x02, 0x14, 0xe8, + 0xd6, 0xef, 0x0e, 0x86, 0xef, 0xb2, 0x60, 0x04, 0x1a, 0x95, 0x2f, 0x14, 0x8b, 0x51, 0xf9, 0xb4, + 0xd8, 0x1a, 0xbe, 0xdb, 0x45, 0x6f, 0xc1, 0x03, 0x64, 0xe0, 0xfb, 0xde, 0xc0, 0xef, 0x75, 0x5c, + 0x82, 0x8b, 0xd6, 0xee, 0xb2, 0x74, 0x33, 0x4f, 0x90, 0xbc, 0x68, 0xd9, 0xea, 0x09, 0x13, 0x84, + 0xf8, 0xfc, 0x37, 0x09, 0x65, 0x93, 0x12, 0x22, 0x07, 0x14, 0x91, 0xff, 0xe6, 0xa8, 0xdb, 0x65, + 0x73, 0xae, 0x84, 0xd5, 0xdf, 0x74, 0xdd, 0x84, 0x86, 0x97, 0xe2, 0x86, 0xab, 0xa3, 0x6e, 0x17, + 0x3d, 0x07, 0xd0, 0x0b, 0xdc, 0x03, 0x7f, 0x38, 0xa4, 0x86, 0x8c, 0x28, 0x5e, 0x27, 0x2e, 0x15, + 0x87, 0xaf, 0x17, 0x34, 0x68, 0x21, 0x1e, 0xbe, 0x7e, 0x7b, 0xcf, 0x23, 0x51, 0xae, 0xd4, 0x69, + 0x85, 0x01, 0x48, 0xf3, 0xc2, 0xe4, 0x34, 0xda, 0xf3, 0x6c, 0xff, 0x03, 0xee, 0x73, 0xfc, 0x3a, + 0xac, 0x30, 0x77, 0xd1, 0x1d, 0x3f, 0xdc, 0x67, 0x72, 0xf7, 0xbd, 0x08, 0xed, 0x82, 0xe0, 0xfd, + 0xb7, 0x3c, 0x80, 0xba, 0x63, 0x73, 0x00, 0x89, 0xcb, 0x30, 0x83, 0xb5, 0x09, 0x7e, 0x2b, 0x41, + 0xee, 0x74, 0x49, 0xbb, 0xe2, 0x9d, 0x2e, 0xa1, 0xc0, 0xfb, 0x84, 0xe5, 0xed, 0x91, 0x8b, 0x31, + 0x39, 0xbe, 0xc2, 0x18, 0xd0, 0xa2, 0x84, 0xf4, 0x4a, 0x8b, 0x50, 0x1d, 0x20, 0x86, 0x74, 0x60, + 0xfa, 0xed, 0x4a, 0x1c, 0x1b, 0xcd, 0x2a, 0x18, 0x32, 0x70, 0x0c, 0x0b, 0x21, 0x4e, 0x9f, 0x98, + 0x0c, 0x6d, 0x41, 0xde, 0x69, 0x47, 0xd1, 0x28, 0x13, 0x80, 0x2e, 0xce, 0xb3, 0x74, 0x40, 0x31, + 0xd8, 0xc5, 0x52, 0xd8, 0x4e, 0x64, 0x4d, 0x23, 0x8d, 0x20, 0x0d, 0x66, 0x59, 0xaa, 0xc7, 0x09, + 0xa8, 0x47, 0x2c, 0xd3, 0x23, 0xc3, 0x3a, 0x24, 0x85, 0xa2, 0xb4, 0xc3, 0x92, 0x3a, 0x3e, 0x0d, + 0x39, 0xdb, 0x6e, 0xb0, 0xf0, 0xce, 0xc5, 0x58, 0x57, 0xb1, 0xed, 0x06, 0xcf, 0x8c, 0x7b, 0x20, + 0xb0, 0x61, 0x62, 0xf4, 0x3d, 0x28, 0x08, 0x82, 0x38, 0x0b, 0x8c, 0x26, 0xdf, 0xc0, 0x8f, 0x8b, + 0xc5, 0xed, 0x4c, 0xa0, 0x46, 0x75, 0x50, 0xb6, 0x46, 0x6f, 0x7b, 0x6a, 0xbf, 0x4f, 0x22, 0x29, + 0xde, 0xf3, 0x06, 0x14, 0xb5, 0x78, 0x2e, 0x86, 0x09, 0x74, 0xdb, 0xfd, 0xbe, 0xdb, 0xe1, 0xb5, + 0xe2, 0xcd, 0x4c, 0x9a, 0x13, 0x35, 0x61, 0xc5, 0xf6, 0xc2, 0x51, 0x9f, 0xba, 0x61, 0x54, 0x7b, + 0x03, 0xac, 0x9a, 0xd0, 0x0d, 0x83, 0x20, 0xaa, 0x0d, 0x71, 0x25, 0xf7, 0x7d, 0xb9, 0xd9, 0x1b, + 0xa4, 0xd4, 0x94, 0x2c, 0x73, 0xd1, 0x13, 0x87, 0x1c, 0x9f, 0xf7, 0x49, 0x85, 0x87, 0x9c, 0xf7, + 0x5c, 0xe1, 0x89, 0xd5, 0x9c, 0x27, 0xc7, 0x40, 0x7d, 0x10, 0x33, 0x9a, 0x00, 0xf5, 0x91, 0x00, + 0xf8, 0xf8, 0x24, 0x2f, 0x40, 0x48, 0xb1, 0xb1, 0x78, 0x11, 0xe0, 0x95, 0x9e, 0x1f, 0x34, 0xbc, + 0x70, 0xbf, 0xd7, 0x11, 0x10, 0x47, 0x0a, 0x3f, 0xea, 0xf9, 0x81, 0x7b, 0x40, 0x8a, 0xbf, 0xfa, + 0xf2, 0x9c, 0x40, 0x64, 0x09, 0xbf, 0xd1, 0xe3, 0x30, 0x8f, 0xff, 0x39, 0xb1, 0x33, 0x09, 0xbd, + 0xc0, 0x24, 0xdc, 0x2c, 0xc3, 0x76, 0x44, 0x80, 0xae, 0x13, 0x68, 0x71, 0xbf, 0x1f, 0x0a, 0x62, + 0x35, 0xc7, 0x11, 0xf7, 0xfb, 0x61, 0x1a, 0x15, 0x50, 0x20, 0x46, 0xb5, 0xa8, 0xeb, 0x1c, 0x9c, + 0x9e, 0x21, 0x98, 0x93, 0x5b, 0x3a, 0x36, 0xd7, 0x5c, 0x0e, 0x47, 0x26, 0xa6, 0x11, 0x4b, 0xb1, + 0x91, 0x4e, 0xd8, 0xb5, 0x0a, 0x35, 0xab, 0xb0, 0xd3, 0x8d, 0x76, 0x62, 0xb8, 0xdf, 0x71, 0x77, + 0x49, 0x71, 0xa2, 0x13, 0x11, 0x31, 0xda, 0x80, 0x65, 0x1a, 0x17, 0x1f, 0x25, 0xb9, 0x61, 0x27, + 0x1d, 0xd9, 0xdb, 0xe2, 0x2c, 0x38, 0xe2, 0xe3, 0x53, 0x0c, 0xa8, 0x0a, 0x33, 0x44, 0xb5, 0x64, + 0xce, 0xe0, 0xa7, 0x45, 0x9d, 0x3a, 0xbd, 0x8e, 0xc8, 0xbe, 0x42, 0xb4, 0x69, 0x71, 0x5f, 0x21, + 0xa4, 0xe8, 0x35, 0x00, 0x2d, 0x18, 0xf4, 0xba, 0x5d, 0x02, 0x98, 0x37, 0x47, 0x14, 0xb3, 0xb3, + 0xc9, 0xf5, 0x48, 0x5a, 0x89, 0x89, 0x18, 0x0e, 0x0c, 0xf9, 0xef, 0xa6, 0x60, 0xf5, 0x84, 0xb6, + 0x8a, 0x3a, 0xcc, 0xd2, 0xc5, 0x48, 0xc0, 0x27, 0x19, 0x9c, 0xb6, 0x00, 0x5d, 0x48, 0xc1, 0x27, + 0x59, 0x79, 0x16, 0x7c, 0x52, 0x60, 0x28, 0x6e, 0xc1, 0x89, 0x71, 0x2f, 0x96, 0x50, 0x86, 0xa5, + 0xc3, 0x2a, 0xc3, 0x7f, 0xcc, 0xc1, 0x02, 0x69, 0x8d, 0xef, 0xc2, 0x2a, 0x2c, 0xda, 0xa3, 0xb7, + 0x23, 0x10, 0x07, 0xbe, 0x1b, 0x93, 0xfe, 0x0d, 0xc5, 0x0a, 0xd1, 0xe0, 0x95, 0xe0, 0x40, 0x1a, + 0x2c, 0xf1, 0x93, 0x60, 0x93, 0x3b, 0x98, 0x47, 0xb8, 0x8f, 0x1c, 0x5e, 0x28, 0x9b, 0xe4, 0x2b, + 0xc5, 0x14, 0x9f, 0x07, 0xb9, 0xa3, 0x9c, 0x07, 0xf9, 0x43, 0x9d, 0x07, 0x6f, 0xc0, 0x02, 0x7f, + 0x1a, 0xd9, 0xc9, 0x67, 0xee, 0x6d, 0x27, 0x4f, 0x34, 0x86, 0xea, 0xd1, 0x8e, 0x3e, 0x3b, 0x75, + 0x47, 0x27, 0x56, 0x44, 0xbe, 0xca, 0x32, 0x79, 0x7b, 0x59, 0x1b, 0x24, 0x0b, 0xce, 0x66, 0xb9, + 0x79, 0x17, 0xa7, 0xe4, 0x33, 0x30, 0x5f, 0xef, 0x71, 0x03, 0x92, 0x70, 0x73, 0xdf, 0xe5, 0x85, + 0xa2, 0xb8, 0x10, 0x51, 0x46, 0xa7, 0x5b, 0xee, 0x7e, 0x9c, 0x6e, 0xd7, 0x01, 0x58, 0xe4, 0x42, + 0x9c, 0xbd, 0x82, 0x2c, 0x19, 0x1e, 0xa3, 0x9b, 0x34, 0x20, 0x08, 0xc4, 0x78, 0x77, 0x62, 0xae, + 0x26, 0xea, 0xee, 0x6e, 0x6f, 0x14, 0x84, 0x89, 0x74, 0x6f, 0x2c, 0x5c, 0x1f, 0x1f, 0x09, 0xa4, + 0x4e, 0xdc, 0x1e, 0x52, 0x6c, 0xf7, 0x77, 0x40, 0xd0, 0xab, 0x91, 0x8f, 0xdc, 0xd4, 0xec, 0xd7, + 0xc5, 0xcc, 0x17, 0x9a, 0xe8, 0x19, 0x57, 0xfc, 0x4c, 0x12, 0x41, 0x77, 0xef, 0x62, 0xa8, 0x9f, + 0x07, 0x88, 0x2c, 0xf8, 0x7c, 0xac, 0xa9, 0x26, 0x17, 0x95, 0x8a, 0x5f, 0x39, 0xa6, 0x15, 0xde, + 0x26, 0x77, 0xbf, 0xde, 0xc6, 0x81, 0x82, 0xf9, 0x4e, 0xd8, 0x8e, 0x5d, 0x3e, 0xc0, 0x8e, 0x24, + 0x59, 0xb2, 0x33, 0xf1, 0x2c, 0xdd, 0xb1, 0x1c, 0x3c, 0x31, 0x4b, 0x77, 0xc4, 0x58, 0x7c, 0x15, + 0x96, 0xc5, 0x40, 0xc2, 0xdb, 0xc1, 0x2e, 0xfa, 0x01, 0x45, 0x0b, 0x93, 0x12, 0x3a, 0x8e, 0x40, + 0x84, 0x77, 0xdc, 0xdb, 0xc1, 0x2e, 0x95, 0x7f, 0xda, 0xb7, 0xc4, 0xbe, 0x12, 0xed, 0xf3, 0x0b, + 0x09, 0x50, 0x96, 0x5c, 0xdc, 0x4d, 0xa4, 0xff, 0x83, 0x74, 0x99, 0x92, 0xca, 0xf2, 0x47, 0x91, + 0xca, 0x4a, 0xbf, 0x92, 0x60, 0x59, 0x57, 0x1b, 0x0c, 0x21, 0x97, 0x5a, 0x22, 0x1e, 0x86, 0xb3, + 0xba, 0xda, 0x70, 0x9b, 0x66, 0x5d, 0x2f, 0xdf, 0x70, 0xc7, 0x02, 0xdf, 0x9d, 0x85, 0x87, 0xb2, + 0x24, 0xb1, 0xc5, 0xe2, 0x0c, 0xac, 0x66, 0xab, 0x39, 0x38, 0xde, 0x78, 0x66, 0x8e, 0xa3, 0x97, + 0x2b, 0xbd, 0x04, 0xcb, 0x1c, 0x33, 0xce, 0xa9, 0xdb, 0x04, 0x6a, 0x76, 0x19, 0x0a, 0xdb, 0x9a, + 0xa5, 0x57, 0x6f, 0xb8, 0xd5, 0x56, 0xbd, 0xae, 0x1c, 0x43, 0x8b, 0x30, 0xcf, 0x0a, 0xca, 0xaa, + 0x22, 0xa1, 0x05, 0x98, 0xd3, 0x0d, 0x5b, 0x2b, 0xb7, 0x2c, 0x4d, 0x91, 0x4b, 0x2f, 0xc1, 0x52, + 0x73, 0xe0, 0xbf, 0xd7, 0x0e, 0xbd, 0x2d, 0xef, 0x36, 0x31, 0x38, 0x1c, 0x87, 0x9c, 0xa5, 0xee, + 0x28, 0xc7, 0x10, 0xc0, 0x6c, 0x73, 0xab, 0x6c, 0x5f, 0xbd, 0xaa, 0x48, 0xa8, 0x00, 0xc7, 0x37, + 0xcb, 0x4d, 0x77, 0xab, 0x61, 0x2b, 0x32, 0xfe, 0xa3, 0xee, 0xd8, 0xe4, 0x4f, 0xae, 0xf4, 0x14, + 0xac, 0x10, 0x59, 0xa1, 0xee, 0x0f, 0x43, 0x2f, 0xf0, 0x06, 0xa4, 0x0f, 0x0b, 0x30, 0x67, 0x7b, + 0x78, 0x91, 0x87, 0x1e, 0xed, 0x40, 0x63, 0xd4, 0x0d, 0xfd, 0x7e, 0xd7, 0x7b, 0x5f, 0x91, 0x4a, + 0xd7, 0x61, 0xd9, 0xea, 0x8d, 0x42, 0x3f, 0xd8, 0xb3, 0x43, 0x4c, 0xb1, 0x77, 0x1b, 0x3d, 0x08, + 0x2b, 0x2d, 0x43, 0x6d, 0x6c, 0xe8, 0x9b, 0x2d, 0xb3, 0x65, 0xbb, 0x0d, 0xd5, 0x29, 0xd7, 0xa8, + 0xb9, 0xa3, 0x61, 0xda, 0x8e, 0x6b, 0x69, 0x65, 0xcd, 0x70, 0x14, 0xa9, 0xf4, 0x73, 0x09, 0x96, + 0x5a, 0x43, 0xe6, 0xa2, 0xdb, 0x22, 0x81, 0x76, 0xe7, 0xe1, 0x4c, 0xcb, 0xd6, 0x2c, 0xd7, 0x31, + 0xb7, 0x34, 0xc3, 0x6d, 0xd9, 0xea, 0x66, 0x1a, 0x75, 0xf1, 0x1c, 0x9c, 0x16, 0x28, 0x2c, 0xad, + 0x6c, 0x6e, 0x6b, 0x96, 0xdb, 0x54, 0x6d, 0x7b, 0xc7, 0xb4, 0x2a, 0x8a, 0x84, 0xd6, 0xe0, 0xe4, + 0x18, 0x82, 0x46, 0x55, 0x55, 0xe4, 0x4c, 0x9d, 0xa1, 0xed, 0xa8, 0x75, 0x77, 0xc3, 0x74, 0x94, + 0x5c, 0xa9, 0x81, 0x0f, 0x3a, 0x02, 0x4c, 0x46, 0x61, 0xe5, 0xe7, 0x20, 0x6f, 0x98, 0x86, 0x96, + 0x36, 0x49, 0x2d, 0xc0, 0x9c, 0xda, 0x6c, 0x5a, 0xe6, 0x36, 0x19, 0x50, 0x80, 0xd9, 0x8a, 0x66, + 0xe0, 0x9e, 0xe5, 0x70, 0x4d, 0xd3, 0x32, 0x1b, 0xa6, 0xa3, 0x55, 0x94, 0x7c, 0xc9, 0xe2, 0x0b, + 0x86, 0x37, 0xba, 0xdb, 0xa3, 0xf6, 0x9f, 0x8a, 0x56, 0x55, 0x5b, 0x75, 0x87, 0x7d, 0x90, 0x1b, + 0xae, 0xa5, 0xbd, 0xda, 0xd2, 0x6c, 0xc7, 0x56, 0x24, 0xa4, 0xc0, 0x82, 0xa1, 0x69, 0x15, 0xdb, + 0xb5, 0xb4, 0x6d, 0x5d, 0xdb, 0x51, 0x64, 0xdc, 0x26, 0xfd, 0x8d, 0x9f, 0x50, 0xfa, 0x44, 0x02, + 0x44, 0x41, 0xdd, 0x38, 0xfc, 0x37, 0x19, 0x9f, 0x75, 0x58, 0xab, 0xe1, 0x0f, 0x4b, 0x5e, 0xad, + 0x61, 0x56, 0xd2, 0x9f, 0xec, 0x24, 0xa0, 0x54, 0xbd, 0x59, 0xad, 0x2a, 0x12, 0x3a, 0x0d, 0x0f, + 0xa4, 0xca, 0x2b, 0x96, 0xd9, 0x54, 0xe4, 0x35, 0x79, 0x4e, 0x42, 0xa7, 0x32, 0x95, 0x5b, 0x9a, + 0xd6, 0x54, 0x72, 0x78, 0x88, 0x52, 0x15, 0x7c, 0x02, 0x52, 0xf6, 0x7c, 0xe9, 0x43, 0x09, 0x4e, + 0xd2, 0x6e, 0xf2, 0xd9, 0x1c, 0x75, 0xf5, 0x0c, 0xac, 0x32, 0xfc, 0xc9, 0x71, 0x1d, 0x3d, 0x01, + 0x4a, 0xa2, 0x96, 0x76, 0xf3, 0x41, 0x58, 0x49, 0x94, 0x92, 0x7e, 0xc8, 0x78, 0xad, 0x26, 0x8a, + 0x37, 0x34, 0xdb, 0x71, 0xb5, 0x6a, 0xd5, 0xb4, 0x1c, 0xda, 0x91, 0x5c, 0xa9, 0x08, 0x2b, 0x65, + 0x6f, 0x10, 0x62, 0x1d, 0x24, 0x18, 0xfa, 0xbd, 0x80, 0x74, 0x61, 0x11, 0xe6, 0xb5, 0xd7, 0x1c, + 0xcd, 0xb0, 0x75, 0xd3, 0x50, 0x8e, 0x95, 0xce, 0xa4, 0x68, 0xf8, 0xaa, 0xb1, 0xed, 0x9a, 0x72, + 0xac, 0xd4, 0x86, 0x45, 0xee, 0x12, 0x4b, 0x67, 0xc5, 0x3a, 0xac, 0xf1, 0xb9, 0x46, 0xd6, 0x6f, + 0xfa, 0x15, 0x56, 0xe1, 0x44, 0xb6, 0x5e, 0x73, 0x14, 0x09, 0x8f, 0x42, 0xaa, 0x06, 0x97, 0xcb, + 0xa5, 0x3f, 0x48, 0xb0, 0xca, 0x12, 0x6d, 0x32, 0x7b, 0x04, 0x85, 0xbc, 0x26, 0xf0, 0x71, 0x25, + 0xb8, 0xe4, 0x58, 0x2d, 0xdb, 0xd1, 0x2a, 0x6e, 0x45, 0xdb, 0xd6, 0xcb, 0x1a, 0x99, 0x2e, 0xba, + 0xa5, 0x35, 0x34, 0xc3, 0x49, 0x3d, 0xfa, 0x31, 0x78, 0x64, 0x0a, 0xad, 0x61, 0x3a, 0xfc, 0x3f, + 0x5e, 0x25, 0x8f, 0xc0, 0x77, 0xa6, 0x10, 0x47, 0x84, 0x72, 0xe9, 0x4d, 0x58, 0x48, 0xa4, 0xf1, + 0x38, 0x05, 0x0f, 0x88, 0xff, 0x9b, 0x5e, 0xd0, 0xf1, 0x83, 0x3d, 0xe5, 0x58, 0xba, 0xc2, 0x1a, + 0x05, 0x01, 0xae, 0x20, 0x0b, 0x52, 0xac, 0x70, 0xbc, 0xc1, 0x81, 0x1f, 0xb4, 0x43, 0xaf, 0xa3, + 0xc8, 0xa5, 0x2b, 0xb0, 0x98, 0xc0, 0x19, 0xc4, 0x5f, 0xbe, 0x6e, 0xb2, 0xfd, 0xaa, 0xa1, 0x55, + 0xf4, 0x56, 0x43, 0x99, 0xc1, 0x4b, 0xb1, 0xa6, 0x6f, 0xd6, 0x14, 0x28, 0x7d, 0x2c, 0x61, 0x89, + 0x99, 0x7c, 0x9f, 0x46, 0x55, 0xe5, 0x63, 0x85, 0xe7, 0x09, 0x85, 0x24, 0xd5, 0x6c, 0x9b, 0x9a, + 0x52, 0xcf, 0xc0, 0x2a, 0xfb, 0xe3, 0xaa, 0x46, 0xc5, 0xad, 0xa9, 0x56, 0x65, 0x47, 0xb5, 0xf0, + 0xe4, 0xb9, 0xa1, 0xc8, 0x64, 0x45, 0x08, 0x25, 0xae, 0x63, 0xb6, 0xca, 0x35, 0x25, 0x87, 0x27, + 0x60, 0xa2, 0xbc, 0xa9, 0x1b, 0x4a, 0x9e, 0xac, 0xaf, 0x0c, 0x35, 0x69, 0x16, 0xd7, 0xcf, 0x94, + 0xee, 0x48, 0x70, 0xca, 0xf6, 0xf7, 0x82, 0x76, 0x38, 0x1a, 0x78, 0x6a, 0x77, 0xaf, 0x37, 0xf0, + 0xc3, 0xfd, 0x03, 0x7b, 0xe4, 0x87, 0x1e, 0xba, 0x0c, 0x17, 0x6d, 0x7d, 0xd3, 0x50, 0x1d, 0xbc, + 0x3e, 0xd4, 0xfa, 0xa6, 0x69, 0xe9, 0x4e, 0xad, 0xe1, 0xda, 0x2d, 0x3d, 0x33, 0x75, 0x2e, 0xc0, + 0xf9, 0xc9, 0xa4, 0x75, 0x6d, 0x53, 0x2d, 0xdf, 0x50, 0xa4, 0xe9, 0x0d, 0x6e, 0xa8, 0x75, 0xd5, + 0x28, 0x6b, 0x15, 0x77, 0xfb, 0xaa, 0x22, 0xa3, 0x8b, 0xf0, 0xf0, 0x64, 0xd2, 0xaa, 0xde, 0xb4, + 0x31, 0x59, 0x6e, 0xfa, 0x73, 0x6b, 0x76, 0x03, 0x53, 0xe5, 0x4b, 0x3e, 0x28, 0xe9, 0x08, 0xea, + 0x8c, 0xe1, 0xde, 0x6a, 0x19, 0x06, 0xdd, 0x25, 0x97, 0xa1, 0x60, 0x3a, 0x35, 0xcd, 0x62, 0xc8, + 0xb8, 0x04, 0x0a, 0xb7, 0x65, 0xa8, 0x2d, 0xa7, 0x66, 0x5a, 0xfa, 0xeb, 0x64, 0xbb, 0x5c, 0x85, + 0x13, 0x76, 0x5d, 0x2d, 0x6f, 0x91, 0x99, 0xa9, 0x1b, 0x6e, 0xb9, 0xa6, 0x1a, 0x86, 0x56, 0x57, + 0xa0, 0xf4, 0x3b, 0x89, 0x5a, 0xd0, 0xc7, 0x85, 0x5a, 0xa1, 0xc7, 0xe1, 0x51, 0x73, 0xcb, 0x51, + 0xdd, 0x66, 0xbd, 0xb5, 0xa9, 0x1b, 0xae, 0x7d, 0xc3, 0x28, 0xf3, 0x83, 0xb4, 0x9c, 0xdd, 0x51, + 0x1e, 0x85, 0x0b, 0x53, 0xa9, 0x63, 0x0c, 0xdb, 0x4b, 0x50, 0x9c, 0x4a, 0xc9, 0x5e, 0xa4, 0xf4, + 0xb9, 0x04, 0xa7, 0xa7, 0x58, 0x1e, 0xd1, 0x13, 0x70, 0xb9, 0xa6, 0xa9, 0x95, 0xba, 0x66, 0xdb, + 0x2e, 0x7e, 0x5f, 0xcd, 0x70, 0x98, 0x81, 0x7f, 0xec, 0x7e, 0x71, 0x19, 0x2e, 0x4e, 0x27, 0x8f, + 0x4f, 0x9e, 0x47, 0xe1, 0xc2, 0x74, 0x52, 0x76, 0x12, 0xc9, 0x78, 0xd7, 0x98, 0x4e, 0x19, 0x9d, + 0x60, 0xb9, 0xd2, 0x47, 0x12, 0x9c, 0x1c, 0xaf, 0xb0, 0xe3, 0xbe, 0xe9, 0x86, 0xed, 0xa8, 0xf5, + 0xba, 0xdb, 0x54, 0x2d, 0xb5, 0xe1, 0x6a, 0x86, 0x65, 0xd6, 0xeb, 0xe3, 0x76, 0xee, 0x0b, 0x70, + 0x7e, 0x32, 0xa9, 0x5d, 0xb6, 0xf4, 0x26, 0xde, 0x02, 0x8b, 0xb0, 0x3e, 0x99, 0x4a, 0xd3, 0xcb, + 0x9a, 0x22, 0x6f, 0xbc, 0xf8, 0xe9, 0x3f, 0xd6, 0x8f, 0x7d, 0x7a, 0x67, 0x5d, 0xfa, 0xe2, 0xce, + 0xba, 0xf4, 0xf7, 0x3b, 0xeb, 0xd2, 0xeb, 0x8f, 0x1d, 0x21, 0x4b, 0xf8, 0xdb, 0xb3, 0xc4, 0xa3, + 0xe5, 0xda, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x82, 0x8e, 0x41, 0x6a, 0x45, 0x92, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -43436,7 +43249,7 @@ func (m *AgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ClusterAutoUpdateConfigV1) Marshal() (dAtA []byte, err error) { +func (m *ScheduledAgentUpgradeWindow) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43446,12 +43259,12 @@ func (m *ClusterAutoUpdateConfigV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ClusterAutoUpdateConfigV1) MarshalTo(dAtA []byte) (int, error) { +func (m *ScheduledAgentUpgradeWindow) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ClusterAutoUpdateConfigV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43460,35 +43273,26 @@ func (m *ClusterAutoUpdateConfigV1) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Nonce != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Nonce)) - i-- - dAtA[i] = 0x18 - } - { - size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + n356, err356 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) + if err356 != nil { + return 0, err356 } + i -= n356 + i = encodeVarintTypes(dAtA, i, uint64(n356)) i-- dAtA[i] = 0x12 - { - size, err := m.ResourceHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) + n357, err357 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) + if err357 != nil { + return 0, err357 } + i -= n357 + i = encodeVarintTypes(dAtA, i, uint64(n357)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *ClusterAutoUpdateConfigSpecV1) Marshal() (dAtA []byte, err error) { +func (m *AgentUpgradeSchedule) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43498,12 +43302,12 @@ func (m *ClusterAutoUpdateConfigSpecV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ClusterAutoUpdateConfigSpecV1) MarshalTo(dAtA []byte) (int, error) { +func (m *AgentUpgradeSchedule) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ClusterAutoUpdateConfigSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *AgentUpgradeSchedule) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43512,20 +43316,24 @@ func (m *ClusterAutoUpdateConfigSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.ToolsAutoUpdate { - i-- - if m.ToolsAutoUpdate { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.Windows) > 0 { + for iNdEx := len(m.Windows) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Windows[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - i-- - dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *AutoUpdateVersionV1) Marshal() (dAtA []byte, err error) { +func (m *UserGroupV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43535,12 +43343,12 @@ func (m *AutoUpdateVersionV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AutoUpdateVersionV1) MarshalTo(dAtA []byte) (int, error) { +func (m *UserGroupV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AutoUpdateVersionV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *UserGroupV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43549,11 +43357,6 @@ func (m *AutoUpdateVersionV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Nonce != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Nonce)) - i-- - dAtA[i] = 0x18 - } { size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -43577,7 +43380,7 @@ func (m *AutoUpdateVersionV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *AutoupdateVersionSpecV1) Marshal() (dAtA []byte, err error) { +func (m *UserGroupSpecV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43587,12 +43390,12 @@ func (m *AutoupdateVersionSpecV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AutoupdateVersionSpecV1) MarshalTo(dAtA []byte) (int, error) { +func (m *UserGroupSpecV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AutoupdateVersionSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *UserGroupSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43601,17 +43404,19 @@ func (m *AutoupdateVersionSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ToolsVersion) > 0 { - i -= len(m.ToolsVersion) - copy(dAtA[i:], m.ToolsVersion) - i = encodeVarintTypes(dAtA, i, uint64(len(m.ToolsVersion))) - i-- - dAtA[i] = 0xa + if len(m.Applications) > 0 { + for iNdEx := len(m.Applications) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Applications[iNdEx]) + copy(dAtA[i:], m.Applications[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Applications[iNdEx]))) + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *ScheduledAgentUpgradeWindow) Marshal() (dAtA []byte, err error) { +func (m *OktaImportRuleSpecV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43621,12 +43426,12 @@ func (m *ScheduledAgentUpgradeWindow) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ScheduledAgentUpgradeWindow) MarshalTo(dAtA []byte) (int, error) { +func (m *OktaImportRuleSpecV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *OktaImportRuleSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43635,26 +43440,29 @@ func (m *ScheduledAgentUpgradeWindow) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n360, err360 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Stop, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Stop):]) - if err360 != nil { - return 0, err360 + if len(m.Mappings) > 0 { + for iNdEx := len(m.Mappings) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Mappings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - i -= n360 - i = encodeVarintTypes(dAtA, i, uint64(n360)) - i-- - dAtA[i] = 0x12 - n361, err361 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Start, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Start):]) - if err361 != nil { - return 0, err361 + if m.Priority != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.Priority)) + i-- + dAtA[i] = 0x8 } - i -= n361 - i = encodeVarintTypes(dAtA, i, uint64(n361)) - i-- - dAtA[i] = 0xa return len(dAtA) - i, nil } -func (m *AgentUpgradeSchedule) Marshal() (dAtA []byte, err error) { +func (m *OktaImportRuleMappingV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43664,12 +43472,12 @@ func (m *AgentUpgradeSchedule) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AgentUpgradeSchedule) MarshalTo(dAtA []byte) (int, error) { +func (m *OktaImportRuleMappingV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AgentUpgradeSchedule) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *OktaImportRuleMappingV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -43678,10 +43486,29 @@ func (m *AgentUpgradeSchedule) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Windows) > 0 { - for iNdEx := len(m.Windows) - 1; iNdEx >= 0; iNdEx-- { + if len(m.AddLabels) > 0 { + for k := range m.AddLabels { + v := m.AddLabels[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintTypes(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintTypes(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintTypes(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Match) > 0 { + for iNdEx := len(m.Match) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Windows[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Match[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -43695,7 +43522,7 @@ func (m *AgentUpgradeSchedule) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *UserGroupV1) Marshal() (dAtA []byte, err error) { +func (m *OktaImportRuleV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -43705,201 +43532,12 @@ func (m *UserGroupV1) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *UserGroupV1) MarshalTo(dAtA []byte) (int, error) { +func (m *OktaImportRuleV1) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *UserGroupV1) 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.Spec.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.ResourceHeader.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *UserGroupSpecV1) 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 *UserGroupSpecV1) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UserGroupSpecV1) 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.Applications) > 0 { - for iNdEx := len(m.Applications) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Applications[iNdEx]) - copy(dAtA[i:], m.Applications[iNdEx]) - i = encodeVarintTypes(dAtA, i, uint64(len(m.Applications[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *OktaImportRuleSpecV1) 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 *OktaImportRuleSpecV1) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *OktaImportRuleSpecV1) 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.Mappings) > 0 { - for iNdEx := len(m.Mappings) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Mappings[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if m.Priority != 0 { - i = encodeVarintTypes(dAtA, i, uint64(m.Priority)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *OktaImportRuleMappingV1) 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 *OktaImportRuleMappingV1) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *OktaImportRuleMappingV1) 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.AddLabels) > 0 { - for k := range m.AddLabels { - v := m.AddLabels[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintTypes(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintTypes(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintTypes(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Match) > 0 { - for iNdEx := len(m.Match) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Match[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintTypes(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *OktaImportRuleV1) 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 *OktaImportRuleV1) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *OktaImportRuleV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *OktaImportRuleV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -44075,12 +43713,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x30 } - n368, err368 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) - if err368 != nil { - return 0, err368 + n364, err364 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastTransition, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastTransition):]) + if err364 != nil { + return 0, err364 } - i -= n368 - i = encodeVarintTypes(dAtA, i, uint64(n368)) + i -= n364 + i = encodeVarintTypes(dAtA, i, uint64(n364)) i-- dAtA[i] = 0x2a if m.Status != 0 { @@ -44088,12 +43726,12 @@ func (m *OktaAssignmentSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x20 } - n369, err369 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) - if err369 != nil { - return 0, err369 + n365, err365 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.CleanupTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.CleanupTime):]) + if err365 != nil { + return 0, err365 } - i -= n369 - i = encodeVarintTypes(dAtA, i, uint64(n369)) + i -= n365 + i = encodeVarintTypes(dAtA, i, uint64(n365)) i-- dAtA[i] = 0x1a if len(m.Targets) > 0 { @@ -55007,75 +54645,6 @@ func (m *AgentUpgradeWindow) Size() (n int) { return n } -func (m *ClusterAutoUpdateConfigV1) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ResourceHeader.Size() - n += 1 + l + sovTypes(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.Nonce != 0 { - n += 1 + sovTypes(uint64(m.Nonce)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ClusterAutoUpdateConfigSpecV1) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ToolsAutoUpdate { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AutoUpdateVersionV1) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.ResourceHeader.Size() - n += 1 + l + sovTypes(uint64(l)) - l = m.Spec.Size() - n += 1 + l + sovTypes(uint64(l)) - if m.Nonce != 0 { - n += 1 + sovTypes(uint64(m.Nonce)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AutoupdateVersionSpecV1) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ToolsVersion) - if l > 0 { - n += 1 + l + sovTypes(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *ScheduledAgentUpgradeWindow) Size() (n int) { if m == nil { return 0 @@ -114363,480 +113932,7 @@ func (m *PluginStaticCredentialsRef) Unmarshal(dAtA []byte) error { } return nil } -func (m *PluginListV1) 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: PluginListV1: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PluginListV1: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Plugins", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Plugins = append(m.Plugins, &PluginV1{}) - if err := m.Plugins[len(m.Plugins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PluginStaticCredentialsV1) 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: PluginStaticCredentialsV1: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsV1: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceHeader", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Spec == nil { - m.Spec = &PluginStaticCredentialsSpecV1{} - } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipTypes(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthTypes - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *PluginStaticCredentialsSpecV1) 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: PluginStaticCredentialsSpecV1: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field APIToken", 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.Credentials = &PluginStaticCredentialsSpecV1_APIToken{string(dAtA[iNdEx:postIndex])} - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field BasicAuth", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PluginStaticCredentialsBasicAuth{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Credentials = &PluginStaticCredentialsSpecV1_BasicAuth{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OAuthClientSecret", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PluginStaticCredentialsOAuthClientSecret{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Credentials = &PluginStaticCredentialsSpecV1_OAuthClientSecret{v} - 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 *PluginStaticCredentialsBasicAuth) 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: PluginStaticCredentialsBasicAuth: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsBasicAuth: 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 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.Username = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Password", 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.Password = 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 *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error { +func (m *PluginListV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114859,17 +113955,17 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: wiretype end group for non-group") + return fmt.Errorf("proto: PluginListV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PluginListV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Plugins", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -114879,55 +113975,25 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.ClientId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", 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.Plugins = append(m.Plugins, &PluginV1{}) + if err := m.Plugins[len(m.Plugins)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.ClientSecret = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -114951,7 +114017,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error } return nil } -func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { +func (m *PluginStaticCredentialsV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -114974,10 +114040,10 @@ func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLIdPServiceProviderV1: wiretype end group for non-group") + return fmt.Errorf("proto: PluginStaticCredentialsV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLIdPServiceProviderV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PluginStaticCredentialsV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -115042,6 +114108,9 @@ func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } + if m.Spec == nil { + m.Spec = &PluginStaticCredentialsSpecV1{} + } if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } @@ -115068,7 +114137,7 @@ func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { +func (m *PluginStaticCredentialsSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115091,15 +114160,15 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: PluginStaticCredentialsSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PluginStaticCredentialsSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptor", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field APIToken", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115127,75 +114196,11 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.EntityDescriptor = string(dAtA[iNdEx:postIndex]) + m.Credentials = &PluginStaticCredentialsSpecV1_APIToken{string(dAtA[iNdEx:postIndex])} iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EntityID", 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.EntityID = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ACSURL", 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.ACSURL = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AttributeMapping", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field BasicAuth", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115222,16 +114227,17 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.AttributeMapping = append(m.AttributeMapping, &SAMLAttributeMapping{}) - if err := m.AttributeMapping[len(m.AttributeMapping)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &PluginStaticCredentialsBasicAuth{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Credentials = &PluginStaticCredentialsSpecV1_BasicAuth{v} iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Preset", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field OAuthClientSecret", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -115241,55 +114247,26 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - m.Preset = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RelayState", 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 + v := &PluginStaticCredentialsOAuthClientSecret{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.RelayState = string(dAtA[iNdEx:postIndex]) + m.Credentials = &PluginStaticCredentialsSpecV1_OAuthClientSecret{v} iNdEx = postIndex default: iNdEx = preIndex @@ -115313,7 +114290,7 @@ func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { +func (m *PluginStaticCredentialsBasicAuth) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115336,15 +114313,15 @@ func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SAMLAttributeMapping: wiretype end group for non-group") + return fmt.Errorf("proto: PluginStaticCredentialsBasicAuth: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SAMLAttributeMapping: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PluginStaticCredentialsBasicAuth: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115372,43 +114349,11 @@ func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Name = string(dAtA[iNdEx:postIndex]) + m.Username = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NameFormat", 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.NameFormat = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Password", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115436,7 +114381,7 @@ func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + m.Password = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -115460,7 +114405,7 @@ func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { } return nil } -func (m *IdPOptions) Unmarshal(dAtA []byte) error { +func (m *PluginStaticCredentialsOAuthClientSecret) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115483,17 +114428,17 @@ func (m *IdPOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: IdPOptions: wiretype end group for non-group") + return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: IdPOptions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PluginStaticCredentialsOAuthClientSecret: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SAML", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ClientId", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -115503,27 +114448,55 @@ func (m *IdPOptions) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if m.SAML == nil { - m.SAML = &IdPSAMLOptions{} + m.ClientId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClientSecret", wireType) } - if err := m.SAML.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + 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.ClientSecret = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -115547,7 +114520,7 @@ func (m *IdPOptions) Unmarshal(dAtA []byte) error { } return nil } -func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { +func (m *SAMLIdPServiceProviderV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115570,15 +114543,15 @@ func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: IdPSAMLOptions: wiretype end group for non-group") + return fmt.Errorf("proto: SAMLIdPServiceProviderV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: IdPSAMLOptions: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SAMLIdPServiceProviderV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceHeader", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115605,10 +114578,40 @@ func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Enabled == nil { - m.Enabled = &BoolOption{} + if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if err := m.Enabled.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -115634,7 +114637,7 @@ func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { } return nil } -func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { +func (m *SAMLIdPServiceProviderSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115657,15 +114660,15 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: KubernetesResourceV1: wiretype end group for non-group") + return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: KubernetesResourceV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SAMLIdPServiceProviderSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EntityDescriptor", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115693,11 +114696,11 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Kind = string(dAtA[iNdEx:postIndex]) + m.EntityDescriptor = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EntityID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115725,11 +114728,11 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.SubKind = string(dAtA[iNdEx:postIndex]) + m.EntityID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ACSURL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115757,11 +114760,11 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) + m.ACSURL = string(dAtA[iNdEx:postIndex]) 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 AttributeMapping", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115788,15 +114791,16 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.AttributeMapping = append(m.AttributeMapping, &SAMLAttributeMapping{}) + if err := m.AttributeMapping[len(m.AttributeMapping)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Preset", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -115806,24 +114810,55 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Preset = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RelayState", 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.RelayState = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -115847,7 +114882,7 @@ func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { +func (m *SAMLAttributeMapping) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115870,15 +114905,15 @@ func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: KubernetesResourceSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: SAMLAttributeMapping: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: KubernetesResourceSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SAMLAttributeMapping: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -115906,7 +114941,71 @@ func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Namespace = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NameFormat", 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.NameFormat = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Value", 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.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -115930,7 +115029,7 @@ func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { +func (m *IdPOptions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -115953,15 +115052,15 @@ func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ClusterMaintenanceConfigV1: wiretype end group for non-group") + return fmt.Errorf("proto: IdPOptions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterMaintenanceConfigV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: IdPOptions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceHeader", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SAML", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -115988,62 +115087,13 @@ func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthTypes - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthTypes - } - if postIndex > l { - return io.ErrUnexpectedEOF + if m.SAML == nil { + m.SAML = &IdPSAMLOptions{} } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SAML.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) - } - m.Nonce = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowTypes - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Nonce |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -116066,7 +115116,7 @@ func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClusterMaintenanceConfigSpecV1) Unmarshal(dAtA []byte) error { +func (m *IdPSAMLOptions) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116089,15 +115139,15 @@ func (m *ClusterMaintenanceConfigSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ClusterMaintenanceConfigSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: IdPSAMLOptions: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterMaintenanceConfigSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: IdPSAMLOptions: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AgentUpgrades", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Enabled", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -116124,10 +115174,10 @@ func (m *ClusterMaintenanceConfigSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.AgentUpgrades == nil { - m.AgentUpgrades = &AgentUpgradeWindow{} + if m.Enabled == nil { + m.Enabled = &BoolOption{} } - if err := m.AgentUpgrades.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Enabled.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -116153,7 +115203,7 @@ func (m *ClusterMaintenanceConfigSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { +func (m *KubernetesResourceV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116176,17 +115226,17 @@ func (m *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AgentUpgradeWindow: wiretype end group for non-group") + return fmt.Errorf("proto: KubernetesResourceV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AgentUpgradeWindow: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: KubernetesResourceV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field UTCStartHour", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Kind", wireType) } - m.UTCStartHour = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -116196,14 +115246,27 @@ func (m *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.UTCStartHour |= uint32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Kind = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Weekdays", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SubKind", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -116231,64 +115294,13 @@ func (m *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Weekdays = append(m.Weekdays, string(dAtA[iNdEx:postIndex])) + m.SubKind = 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 *ClusterAutoUpdateConfigV1) 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: ClusterAutoUpdateConfigV1: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterAutoUpdateConfigV1: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceHeader", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -116298,28 +115310,27 @@ func (m *ClusterAutoUpdateConfigV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthTypes } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthTypes } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceHeader.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Version = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -116346,15 +115357,15 @@ func (m *ClusterAutoUpdateConfigV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Nonce", wireType) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Spec", wireType) } - m.Nonce = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -116364,11 +115375,25 @@ func (m *ClusterAutoUpdateConfigV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Nonce |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Spec.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -116391,7 +115416,7 @@ func (m *ClusterAutoUpdateConfigV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClusterAutoUpdateConfigSpecV1) Unmarshal(dAtA []byte) error { +func (m *KubernetesResourceSpecV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116414,17 +115439,17 @@ func (m *ClusterAutoUpdateConfigSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ClusterAutoUpdateConfigSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: KubernetesResourceSpecV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterAutoUpdateConfigSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: KubernetesResourceSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ToolsAutoUpdate", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Namespace", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowTypes @@ -116434,12 +115459,24 @@ func (m *ClusterAutoUpdateConfigSpecV1) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.ToolsAutoUpdate = bool(v != 0) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Namespace = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) @@ -116462,7 +115499,7 @@ func (m *ClusterAutoUpdateConfigSpecV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionV1) Unmarshal(dAtA []byte) error { +func (m *ClusterMaintenanceConfigV1) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116485,10 +115522,10 @@ func (m *AutoUpdateVersionV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionV1: wiretype end group for non-group") + return fmt.Errorf("proto: ClusterMaintenanceConfigV1: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ClusterMaintenanceConfigV1: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -116598,7 +115635,94 @@ func (m *AutoUpdateVersionV1) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoupdateVersionSpecV1) Unmarshal(dAtA []byte) error { +func (m *ClusterMaintenanceConfigSpecV1) 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: ClusterMaintenanceConfigSpecV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ClusterMaintenanceConfigSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AgentUpgrades", 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.AgentUpgrades == nil { + m.AgentUpgrades = &AgentUpgradeWindow{} + } + if err := m.AgentUpgrades.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 *AgentUpgradeWindow) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -116621,15 +115745,34 @@ func (m *AutoupdateVersionSpecV1) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoupdateVersionSpecV1: wiretype end group for non-group") + return fmt.Errorf("proto: AgentUpgradeWindow: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoupdateVersionSpecV1: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AgentUpgradeWindow: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UTCStartHour", wireType) + } + m.UTCStartHour = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UTCStartHour |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ToolsVersion", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Weekdays", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -116657,7 +115800,7 @@ func (m *AutoupdateVersionSpecV1) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ToolsVersion = string(dAtA[iNdEx:postIndex]) + m.Weekdays = append(m.Weekdays, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index fda8322e9b7eb..ee0a51ed7f6c4 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -101,7 +101,7 @@ type Config struct { WebSession types.WebSessionInterface WebToken types.WebTokenInterface WindowsDesktops services.WindowsDesktops - ClusterAutoUpdate services.ClusterAutoUpdate + ClusterAutoUpdate services.AutoUpdateService } func (c *Config) CheckAndSetDefaults() error { @@ -166,7 +166,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { AppSession: cfg.AppSession, Apps: cfg.Apps, ClusterConfig: cfg.ClusterConfig, - ClusterAutoUpdate: cfg.ClusterAutoUpdate, + AutoUpdateService: cfg.ClusterAutoUpdate, CrownJewels: cfg.CrownJewels, DatabaseObjects: cfg.DatabaseObjects, DatabaseServices: cfg.DatabaseServices, diff --git a/lib/auth/auth.go b/lib/auth/auth.go index bc4611cea607d..ba6f97d4a95af 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -199,8 +199,11 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { } cfg.ClusterConfiguration = clusterConfig } - if cfg.ClusterAutoUpdate == nil { - cfg.ClusterAutoUpdate = local.NewClusterAutoUpdateService(cfg.Backend) + if cfg.AutoUpdateService == nil { + cfg.AutoUpdateService, err = local.NewClusterAutoUpdateService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } } if cfg.Restrictions == nil { cfg.Restrictions = local.NewRestrictionsService(cfg.Backend) @@ -401,7 +404,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { Access: cfg.Access, DynamicAccessExt: cfg.DynamicAccessExt, ClusterConfiguration: cfg.ClusterConfiguration, - ClusterAutoUpdate: cfg.ClusterAutoUpdate, + AutoUpdateService: cfg.AutoUpdateService, Restrictions: cfg.Restrictions, Apps: cfg.Apps, Kubernetes: cfg.Kubernetes, @@ -627,7 +630,7 @@ type Services struct { services.BotInstance services.AccessGraphSecretsGetter services.DevicesGetter - services.ClusterAutoUpdate + services.AutoUpdateService } // GetWebSession returns existing web session described by req. diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 3b5862a0cfc92..2efcd92d7adb1 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -28,6 +28,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" accessmonitoringrules "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" @@ -306,10 +307,10 @@ type ReadProxyAccessPoint interface { GetUserGroup(ctx context.Context, name string) (types.UserGroup, error) // GetClusterAutoUpdateConfig gets the cluster autoupdate config from the backend. - GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) + GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) // GetAutoUpdateVersion gets the autoupdate version from the backend. - GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) + GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) } // SnowflakeSessionWatcher is watcher interface used by Snowflake web session watcher. diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 214a3c502caf6..dc2ea23f8d459 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -38,6 +38,7 @@ import ( "github.com/gravitational/teleport/api/client/secreport" apidefaults "github.com/gravitational/teleport/api/defaults" accessgraphsecretsv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessgraph/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" dbobjectimportrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" @@ -360,12 +361,12 @@ func (c *Client) SearchSessionEvents(ctx context.Context, req events.SearchSessi } // UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. -func (c *Client) UpsertClusterAutoUpdateConfig(ctx context.Context, config types.ClusterAutoUpdateConfig) error { - return trace.NotImplemented(notImplementedMessage) +func (c *Client) UpsertClusterAutoUpdateConfig(ctx context.Context, config *autoupdate.ClusterAutoUpdateConfig) (*autoupdate.ClusterAutoUpdateConfig, error) { + return nil, trace.NotImplemented(notImplementedMessage) } // GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. -func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) { +func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { config, err := c.APIClient.GetClusterAutoUpdateConfig(ctx) if err != nil { return nil, trace.Wrap(err) @@ -379,12 +380,12 @@ func (c *Client) DeleteAutoUpdateVersion(ctx context.Context) error { } // UpsertAutoUpdateVersion sets cluster autoupdate version. -func (c *Client) UpsertAutoUpdateVersion(ctx context.Context, config types.AutoUpdateVersion) error { - return trace.NotImplemented(notImplementedMessage) +func (c *Client) UpsertAutoUpdateVersion(ctx context.Context, config *autoupdate.AutoUpdateVersion) (*autoupdate.AutoUpdateVersion, error) { + return nil, trace.NotImplemented(notImplementedMessage) } // GetAutoUpdateVersion gets the autoupdate version from the backend. -func (c *Client) GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) { +func (c *Client) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { config, err := c.APIClient.GetAutoUpdateVersion(ctx) if err != nil { return nil, trace.Wrap(err) @@ -1504,7 +1505,7 @@ type ClientI interface { WebService services.Status services.ClusterConfiguration - services.ClusterAutoUpdate + services.AutoUpdateService services.SessionTrackerService services.ConnectionsDiagnostic services.SAMLIdPSession @@ -1752,6 +1753,9 @@ type ClientI interface { // will return "not implemented" errors (as per the default gRPC behavior). VnetConfigServiceClient() vnet.VnetConfigServiceClient + // AutoUpdateServiceClient returns a AutoUpdate service client. + AutoUpdateServiceClient() autoupdate.AutoUpdateServiceClient + // CloneHTTPClient creates a new HTTP client with the same configuration. CloneHTTPClient(params ...roundtrip.ClientParam) (*HTTPClient, error) diff --git a/lib/auth/autoupdate/v1/service.go b/lib/auth/autoupdate/v1/service.go new file mode 100644 index 0000000000000..b733af3228ac1 --- /dev/null +++ b/lib/auth/autoupdate/v1/service.go @@ -0,0 +1,148 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package autoupd + +import ( + "context" + + "github.com/gravitational/trace" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/services" +) + +// Service implements the gRPC API layer for the AutoUpdate. +type Service struct { + // Opting out of forward compatibility, this service must implement all service methods. + autoupdate.UnsafeAutoUpdateServiceServer + + storage services.AutoUpdateService + authorizer authz.Authorizer +} + +// NewService returns a new AutoUpdate API service using the given storage layer and authorizer. +func NewService(storage services.AutoUpdateService, authorizer authz.Authorizer) *Service { + return &Service{ + storage: storage, + authorizer: authorizer, + } +} + +// GetClusterAutoUpdateConfig gets the current autoupdate config singleton. +func (s *Service) GetClusterAutoUpdateConfig(ctx context.Context, req *autoupdate.GetClusterAutoUpdateConfigRequest) (*autoupdate.ClusterAutoUpdateConfig, error) { + config, err := s.storage.GetClusterAutoUpdateConfig(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + return config, nil +} + +// UpsertClusterAutoUpdateConfig updates or creates autoupdate config singleton. +func (s *Service) UpsertClusterAutoUpdateConfig(ctx context.Context, req *autoupdate.UpsertClusterAutoUpdateConfigRequest) (*autoupdate.ClusterAutoUpdateConfig, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindClusterAutoUpdateConfig, types.VerbCreate, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + config, err := s.storage.UpsertClusterAutoUpdateConfig(ctx, req.Config) + return config, trace.Wrap(err) +} + +// DeleteClusterAutoUpdateConfig deletes autoupdate config singleton. +func (s *Service) DeleteClusterAutoUpdateConfig(ctx context.Context, req *autoupdate.DeleteClusterAutoUpdateConfigRequest) (*emptypb.Empty, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindClusterAutoUpdateConfig, types.VerbDelete); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + if err := s.storage.DeleteClusterAutoUpdateConfig(ctx); err != nil { + return nil, trace.Wrap(err) + } + return &emptypb.Empty{}, nil +} + +// GetAutoUpdateVersion gets the current autoupdate version singleton. +func (s *Service) GetAutoUpdateVersion(ctx context.Context, req *autoupdate.GetAutoUpdateVersionRequest) (*autoupdate.AutoUpdateVersion, error) { + version, err := s.storage.GetAutoUpdateVersion(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + return version, nil +} + +// UpsertAutoUpdateVersion updates or creates autoupdate version singleton. +func (s *Service) UpsertAutoUpdateVersion(ctx context.Context, req *autoupdate.UpsertAutoUpdateVersionRequest) (*autoupdate.AutoUpdateVersion, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindClusterAutoUpdateConfig, types.VerbCreate, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + autoUpdateVersion, err := s.storage.UpsertAutoUpdateVersion(ctx, req.Version) + return autoUpdateVersion, trace.Wrap(err) +} + +// DeleteAutoUpdateVersion deletes autoupdate version singleton. +func (s *Service) DeleteAutoUpdateVersion(ctx context.Context, req *autoupdate.DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindAutoUpdateVersion, types.VerbDelete); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + if err := s.storage.DeleteAutoUpdateVersion(ctx); err != nil { + return nil, trace.Wrap(err) + } + return &emptypb.Empty{}, nil +} diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 8329dfa4771b9..9a6c5be11df29 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -51,6 +51,7 @@ import ( "github.com/gravitational/teleport/api/constants" accessmonitoringrules "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" auditlogpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/auditlog/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -77,6 +78,7 @@ import ( "github.com/gravitational/teleport/api/types/wrappers" "github.com/gravitational/teleport/lib/accessmonitoringrules/accessmonitoringrulesv1" "github.com/gravitational/teleport/lib/auth/authclient" + autoupd "github.com/gravitational/teleport/lib/auth/autoupdate/v1" "github.com/gravitational/teleport/lib/auth/clusterconfig/clusterconfigv1" "github.com/gravitational/teleport/lib/auth/crownjewel/crownjewelv1" "github.com/gravitational/teleport/lib/auth/dbobject/dbobjectv1" @@ -5049,36 +5051,6 @@ func (g *GRPCServer) DeleteClusterMaintenanceConfig(ctx context.Context, _ *empt return &emptypb.Empty{}, nil } -// GetClusterAutoUpdateConfig gets the current autoupdate config singleton. -func (g *GRPCServer) GetClusterAutoUpdateConfig(ctx context.Context, _ *emptypb.Empty) (*types.ClusterAutoUpdateConfigV1, error) { - config, err := g.AuthServer.GetClusterAutoUpdateConfig(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - - rsp, ok := config.(*types.ClusterAutoUpdateConfigV1) - if !ok { - return nil, trace.BadParameter("unexpected autoupdate config type %T", config) - } - - return rsp, nil -} - -// GetAutoUpdateVersion gets the current autoupdate version singleton. -func (g *GRPCServer) GetAutoUpdateVersion(ctx context.Context, _ *emptypb.Empty) (*types.AutoUpdateVersionV1, error) { - version, err := g.AuthServer.GetAutoUpdateVersion(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - - rsp, ok := version.(*types.AutoUpdateVersionV1) - if !ok { - return nil, trace.BadParameter("unexpected autoupdate version type %T", version) - } - - return rsp, nil -} - // GetBackend returns the backend from the underlying auth server. func (g *GRPCServer) GetBackend() backend.Backend { return g.AuthServer.bk @@ -5433,6 +5405,13 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { vnetConfigServiceServer := vnetconfig.NewService(vnetConfigStorage, cfg.Authorizer) vnet.RegisterVnetConfigServiceServer(server, vnetConfigServiceServer) + autoUpdateStorage, err := local.NewClusterAutoUpdateService(cfg.AuthServer.bk) + if err != nil { + return nil, trace.Wrap(err) + } + autoUpdateServiceServer := autoupd.NewService(autoUpdateStorage, cfg.Authorizer) + autoupdate.RegisterAutoUpdateServiceServer(server, autoUpdateServiceServer) + // Only register the service if this is an open source build. Enterprise builds // register the actual service via an auth plugin, if we register here then all // Enterprise builds would fail with a duplicate service registered error. diff --git a/lib/auth/init.go b/lib/auth/init.go index a92c07ac462a8..d8ac91fd63e10 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -158,8 +158,8 @@ type InitConfig struct { // ClusterConfiguration is a services that holds cluster wide configuration. ClusterConfiguration services.ClusterConfiguration - // ClusterAutoUpdate is a services that holds cluster wide configuration. - ClusterAutoUpdate services.ClusterAutoUpdate + // AutoUpdateService is a service of autoupdate configuration and version. + AutoUpdateService services.AutoUpdateService // Restrictions is a service to access network restrictions, etc Restrictions services.Restrictions diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 31921a54378c8..f21192da4a7a2 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -38,6 +38,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" apidefaults "github.com/gravitational/teleport/api/defaults" accessmonitoringrulesv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -491,7 +492,7 @@ type Cache struct { trustCache services.Trust clusterConfigCache services.ClusterConfiguration - clusterAutoUpdateCache services.ClusterAutoUpdate + autoUpdateCache services.AutoUpdateService provisionerCache services.Provisioner usersCache services.UsersService accessCache services.Access @@ -638,8 +639,8 @@ type Config struct { Trust services.Trust // ClusterConfig is a cluster configuration service ClusterConfig services.ClusterConfiguration - // ClusterAutoUpdate is a cluster autoupdate configuration service - ClusterAutoUpdate services.ClusterAutoUpdate + // AutoUpdateService is a cluster autoupdate service + AutoUpdateService services.AutoUpdateService // Provisioner is a provisioning service Provisioner services.Provisioner // Users is a users service @@ -915,6 +916,12 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } + clusterAutoUpdateCache, err := local.NewClusterAutoUpdateService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + fanout := services.NewFanoutV2(services.FanoutV2Config{}) lowVolumeFanouts := make([]*services.FanoutV2, 0, config.FanoutShards) for i := 0; i < config.FanoutShards; i++ { @@ -941,7 +948,7 @@ func New(config Config) (*Cache, error) { fnCache: fnCache, trustCache: local.NewCAService(config.Backend), clusterConfigCache: clusterConfigCache, - clusterAutoUpdateCache: local.NewClusterAutoUpdateService(config.Backend), + autoUpdateCache: clusterAutoUpdateCache, provisionerCache: local.NewProvisioningService(config.Backend), usersCache: local.NewIdentityService(config.Backend), accessCache: local.NewAccessService(config.Backend), @@ -1866,30 +1873,30 @@ func (c *Cache) GetClusterName(opts ...services.MarshalOption) (types.ClusterNam } // GetClusterAutoUpdateConfig gets the cluster autoupdate config from the backend. -func (c *Cache) GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) { +func (c *Cache) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { ctx, span := c.Tracer.Start(ctx, "cache/GetClusterAutoUpdateConfig") defer span.End() - rg, err := readCollectionCache(c, c.collections.clusterAutoUpdates) + rg, err := readCollectionCache(c, c.collections.autoUpdateConfigs) if err != nil { return nil, trace.Wrap(err) } defer rg.Release() if !rg.IsCacheRead() { - cachedConfig, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (types.ClusterAutoUpdateConfig, error) { - cfg, err := rg.reader.GetClusterAutoUpdateConfig(ctx, opts...) + cachedConfig, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { + cfg, err := rg.reader.GetClusterAutoUpdateConfig(ctx) return cfg, err }) if err != nil { return nil, trace.Wrap(err) } - return cachedConfig.Clone(), nil + return protobuf.Clone(cachedConfig).(*autoupdate.ClusterAutoUpdateConfig), nil } - return rg.reader.GetClusterAutoUpdateConfig(ctx, opts...) + return rg.reader.GetClusterAutoUpdateConfig(ctx) } // GetAutoUpdateVersion gets the autoupdate version from the backend. -func (c *Cache) GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) { +func (c *Cache) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { ctx, span := c.Tracer.Start(ctx, "cache/GetAutoUpdateVersion") defer span.End() @@ -1899,16 +1906,16 @@ func (c *Cache) GetAutoUpdateVersion(ctx context.Context, opts ...services.Marsh } defer rg.Release() if !rg.IsCacheRead() { - cachedVersion, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (types.AutoUpdateVersion, error) { - cfg, err := rg.reader.GetAutoUpdateVersion(ctx, opts...) - return cfg, err + cachedVersion, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { + version, err := rg.reader.GetAutoUpdateVersion(ctx) + return version, err }) if err != nil { return nil, trace.Wrap(err) } - return cachedVersion.Clone(), nil + return protobuf.Clone(cachedVersion).(*autoupdate.AutoUpdateVersion), nil } - return rg.reader.GetAutoUpdateVersion(ctx, opts...) + return rg.reader.GetAutoUpdateVersion(ctx) } func (c *Cache) GetUIConfig(ctx context.Context) (types.UIConfig, error) { diff --git a/lib/cache/collections.go b/lib/cache/collections.go index 1ea2ab30bf2cf..c43ed2fb951cb 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -29,6 +29,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" apidefaults "github.com/gravitational/teleport/api/defaults" accessmonitoringrulesv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -250,7 +251,7 @@ type cacheCollections struct { accessGraphSettings collectionReader[accessGraphSettingsGetter] globalNotifications collectionReader[notificationGetter] accessMonitoringRules collectionReader[accessMonitoringRuleGetter] - clusterAutoUpdates collectionReader[clusterAutoupdateGetter] + autoUpdateConfigs collectionReader[clusterAutoupdateGetter] autoUpdateVersions collectionReader[autoUpdateVersionGetter] } @@ -745,19 +746,19 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e } collections.byKind[resourceKind] = collections.accessGraphSettings case types.KindClusterAutoUpdateConfig: - if c.ClusterAutoUpdate == nil { - return nil, trace.BadParameter("missing parameter ClusterAutoUpdate") + if c.AutoUpdateService == nil { + return nil, trace.BadParameter("missing parameter AutoUpdateService") } - collections.clusterAutoUpdates = &genericCollection[types.ClusterAutoUpdateConfig, clusterAutoupdateGetter, clusterAutoupdateExecutor]{ + collections.autoUpdateConfigs = &genericCollection[*autoupdate.ClusterAutoUpdateConfig, clusterAutoupdateGetter, clusterAutoupdateExecutor]{ cache: c, watch: watch, } - collections.byKind[resourceKind] = collections.clusterAutoUpdates + collections.byKind[resourceKind] = collections.autoUpdateConfigs case types.KindAutoUpdateVersion: - if c.ClusterAutoUpdate == nil { - return nil, trace.BadParameter("missing parameter ClusterAutoUpdate") + if c.AutoUpdateService == nil { + return nil, trace.BadParameter("missing parameter AutoUpdateService") } - collections.autoUpdateVersions = &genericCollection[types.AutoUpdateVersion, autoUpdateVersionGetter, autoUpdateVersionExecutor]{ + collections.autoUpdateVersions = &genericCollection[*autoupdate.AutoUpdateVersion, autoUpdateVersionGetter, autoUpdateVersionExecutor]{ cache: c, watch: watch, } @@ -1269,71 +1270,73 @@ type clusterNameGetter interface { type clusterAutoupdateExecutor struct{} -func (clusterAutoupdateExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.ClusterAutoUpdateConfig, error) { - config, err := cache.ClusterAutoUpdate.GetClusterAutoUpdateConfig(ctx) - return []types.ClusterAutoUpdateConfig{config}, trace.Wrap(err) +func (clusterAutoupdateExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*autoupdate.ClusterAutoUpdateConfig, error) { + config, err := cache.AutoUpdateService.GetClusterAutoUpdateConfig(ctx) + return []*autoupdate.ClusterAutoUpdateConfig{config}, trace.Wrap(err) } -func (clusterAutoupdateExecutor) upsert(ctx context.Context, cache *Cache, resource types.ClusterAutoUpdateConfig) error { - return cache.clusterAutoUpdateCache.UpsertClusterAutoUpdateConfig(ctx, resource) +func (clusterAutoupdateExecutor) upsert(ctx context.Context, cache *Cache, resource *autoupdate.ClusterAutoUpdateConfig) error { + _, err := cache.autoUpdateCache.UpsertClusterAutoUpdateConfig(ctx, resource) + return trace.Wrap(err) } func (clusterAutoupdateExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return cache.clusterAutoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) + return cache.autoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) } func (clusterAutoupdateExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { - return cache.clusterAutoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) + return cache.autoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) } func (clusterAutoupdateExecutor) isSingleton() bool { return true } func (clusterAutoupdateExecutor) getReader(cache *Cache, cacheOK bool) clusterAutoupdateGetter { if cacheOK { - return cache.clusterAutoUpdateCache + return cache.autoUpdateCache } - return cache.Config.ClusterAutoUpdate + return cache.Config.AutoUpdateService } type clusterAutoupdateGetter interface { - GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) + GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) } -var _ executor[types.ClusterAutoUpdateConfig, clusterAutoupdateGetter] = clusterAutoupdateExecutor{} +var _ executor[*autoupdate.ClusterAutoUpdateConfig, clusterAutoupdateGetter] = clusterAutoupdateExecutor{} type autoUpdateVersionExecutor struct{} -func (autoUpdateVersionExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.AutoUpdateVersion, error) { - version, err := cache.ClusterAutoUpdate.GetAutoUpdateVersion(ctx) - return []types.AutoUpdateVersion{version}, trace.Wrap(err) +func (autoUpdateVersionExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*autoupdate.AutoUpdateVersion, error) { + version, err := cache.AutoUpdateService.GetAutoUpdateVersion(ctx) + return []*autoupdate.AutoUpdateVersion{version}, trace.Wrap(err) } -func (autoUpdateVersionExecutor) upsert(ctx context.Context, cache *Cache, resource types.AutoUpdateVersion) error { - return cache.clusterAutoUpdateCache.UpsertAutoUpdateVersion(ctx, resource) +func (autoUpdateVersionExecutor) upsert(ctx context.Context, cache *Cache, resource *autoupdate.AutoUpdateVersion) error { + _, err := cache.autoUpdateCache.UpsertAutoUpdateVersion(ctx, resource) + return trace.Wrap(err) } func (autoUpdateVersionExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return cache.clusterAutoUpdateCache.DeleteAutoUpdateVersion(ctx) + return cache.autoUpdateCache.DeleteAutoUpdateVersion(ctx) } func (autoUpdateVersionExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { - return cache.clusterAutoUpdateCache.DeleteAutoUpdateVersion(ctx) + return cache.autoUpdateCache.DeleteAutoUpdateVersion(ctx) } func (autoUpdateVersionExecutor) isSingleton() bool { return true } func (autoUpdateVersionExecutor) getReader(cache *Cache, cacheOK bool) autoUpdateVersionGetter { if cacheOK { - return cache.clusterAutoUpdateCache + return cache.autoUpdateCache } - return cache.Config.ClusterAutoUpdate + return cache.Config.AutoUpdateService } type autoUpdateVersionGetter interface { - GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) + GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) } -var _ executor[types.AutoUpdateVersion, autoUpdateVersionGetter] = autoUpdateVersionExecutor{} +var _ executor[*autoupdate.AutoUpdateVersion, autoUpdateVersionGetter] = autoUpdateVersionExecutor{} type userExecutor struct{} diff --git a/lib/service/service.go b/lib/service/service.go index 88254c0e24686..948d06a35bbbf 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2138,7 +2138,7 @@ func (process *TeleportProcess) initAuthService() error { VersionStorage: process.storage, Authority: cfg.Keygen, ClusterConfiguration: cfg.ClusterConfiguration, - ClusterAutoUpdate: cfg.ClusterAutoUpdate, + AutoUpdateService: cfg.AutoUpdateService, ClusterAuditConfig: cfg.Auth.AuditConfig, ClusterNetworkingConfig: cfg.Auth.NetworkingConfig, SessionRecordingConfig: cfg.Auth.SessionRecordingConfig, @@ -2605,7 +2605,7 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.WebSession = services.Identity.WebSessions() cfg.WebToken = services.Identity.WebTokens() cfg.WindowsDesktops = services.WindowsDesktops - cfg.ClusterAutoUpdate = services.ClusterAutoUpdate + cfg.ClusterAutoUpdate = services.AutoUpdateService return accesspoint.NewCache(cfg) } diff --git a/lib/service/servicecfg/config.go b/lib/service/servicecfg/config.go index 08262b92da0d2..29015858999bb 100644 --- a/lib/service/servicecfg/config.go +++ b/lib/service/servicecfg/config.go @@ -169,8 +169,8 @@ type Config struct { // ClusterConfiguration is a service that provides cluster configuration ClusterConfiguration services.ClusterConfiguration - // ClusterAutoUpdate is a service that provides cluster autoupdate configuration. - ClusterAutoUpdate services.ClusterAutoUpdate + // AutoUpdateService is a service that provides cluster autoupdate configuration. + AutoUpdateService services.AutoUpdateService // CipherSuites is a list of TLS ciphersuites that Teleport supports. If // omitted, a Teleport selected list of defaults will be used. diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index 49653661eb9d0..e25622b7076c5 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -20,134 +20,30 @@ package services import ( "context" - - "github.com/gravitational/trace" - - "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" ) -// ClusterAutoUpdate stores the cluster autoupdate configuration in the backend. -type ClusterAutoUpdate interface { - // UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. - UpsertClusterAutoUpdateConfig(ctx context.Context, c types.ClusterAutoUpdateConfig) error +type AutoUpdateGetter interface { // GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. - GetClusterAutoUpdateConfig(ctx context.Context, opts ...MarshalOption) (types.ClusterAutoUpdateConfig, error) - // DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. - DeleteClusterAutoUpdateConfig(ctx context.Context) error + GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) - // UpsertAutoUpdateVersion sets autoupdate version. - UpsertAutoUpdateVersion(ctx context.Context, c types.AutoUpdateVersion) error // GetAutoUpdateVersion gets the autoupdate version from the backend. - GetAutoUpdateVersion(ctx context.Context, opts ...MarshalOption) (types.AutoUpdateVersion, error) - // DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. - DeleteAutoUpdateVersion(ctx context.Context) error -} - -// NewClusterAutoUpdateConfig creates a ClusterAutoUpdateConfig with default values. -func NewClusterAutoUpdateConfig(spec types.ClusterAutoUpdateConfigSpecV1) (types.ClusterAutoUpdateConfig, error) { - return types.NewClusterAutoUpdateConfig(spec) -} - -// NewAutoUpdateVersion creates a AutoUpdateVersion with default values. -func NewAutoUpdateVersion(spec types.AutoupdateVersionSpecV1) (types.AutoUpdateVersion, error) { - return types.NewAutoUpdateVersion(spec) -} - -// UnmarshalClusterAutoUpdateConfig unmarshals the ClusterAutoUpdateConfig resource from JSON. -func UnmarshalClusterAutoUpdateConfig(bytes []byte, opts ...MarshalOption) (types.ClusterAutoUpdateConfig, error) { - if len(bytes) == 0 { - return nil, trace.BadParameter("missing resource data") - } - var clusterAutoUpdateConfig types.ClusterAutoUpdateConfigV1 - cfg, err := CollectOptions(opts) - if err != nil { - return nil, trace.Wrap(err) - } - - if err := utils.FastUnmarshal(bytes, &clusterAutoUpdateConfig); err != nil { - return nil, trace.BadParameter(err.Error()) - } - - err = clusterAutoUpdateConfig.CheckAndSetDefaults() - if err != nil { - return nil, trace.Wrap(err) - } - - if cfg.Revision != "" { - clusterAutoUpdateConfig.SetRevision(cfg.Revision) - } - if !cfg.Expires.IsZero() { - clusterAutoUpdateConfig.SetExpiry(cfg.Expires) - } - - return &clusterAutoUpdateConfig, nil -} - -// UnmarshalAutoUpdateVersion unmarshals the AutoUpdateVersion resource from JSON. -func UnmarshalAutoUpdateVersion(bytes []byte, opts ...MarshalOption) (types.AutoUpdateVersion, error) { - if len(bytes) == 0 { - return nil, trace.BadParameter("missing resource data") - } - var autoUpdateVersion types.AutoUpdateVersionV1 - cfg, err := CollectOptions(opts) - if err != nil { - return nil, trace.Wrap(err) - } - - if err := utils.FastUnmarshal(bytes, &autoUpdateVersion); err != nil { - return nil, trace.BadParameter(err.Error()) - } - - err = autoUpdateVersion.CheckAndSetDefaults() - if err != nil { - return nil, trace.Wrap(err) - } - - if cfg.Revision != "" { - autoUpdateVersion.SetRevision(cfg.Revision) - } - if !cfg.Expires.IsZero() { - autoUpdateVersion.SetExpiry(cfg.Expires) - } - - return &autoUpdateVersion, nil + GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) } -// MarshalClusterAutoUpdateConfig marshals the ClusterAutoUpdateConfig resource to JSON. -func MarshalClusterAutoUpdateConfig(config types.ClusterAutoUpdateConfig, opts ...MarshalOption) ([]byte, error) { - cfg, err := CollectOptions(opts) - if err != nil { - return nil, trace.Wrap(err) - } +// AutoUpdateService stores the cluster autoupdate service. +type AutoUpdateService interface { + AutoUpdateGetter - switch autoUpdateConfig := config.(type) { - case *types.ClusterAutoUpdateConfigV1: - if err := autoUpdateConfig.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } - - return utils.FastMarshal(maybeResetProtoRevision(cfg.PreserveRevision, autoUpdateConfig)) - default: - return nil, trace.BadParameter("unrecognized cluster autoupdate config version %T", autoUpdateConfig) - } -} + // UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. + UpsertClusterAutoUpdateConfig(ctx context.Context, c *autoupdate.ClusterAutoUpdateConfig) (*autoupdate.ClusterAutoUpdateConfig, error) -// MarshalAutoUpdateVersion marshals the AutoUpdateVersion resource to JSON. -func MarshalAutoUpdateVersion(config types.AutoUpdateVersion, opts ...MarshalOption) ([]byte, error) { - cfg, err := CollectOptions(opts) - if err != nil { - return nil, trace.Wrap(err) - } + // DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. + DeleteClusterAutoUpdateConfig(ctx context.Context) error - switch autoUpdateVersion := config.(type) { - case *types.AutoUpdateVersionV1: - if err := autoUpdateVersion.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } + // UpsertAutoUpdateVersion sets autoupdate version. + UpsertAutoUpdateVersion(ctx context.Context, c *autoupdate.AutoUpdateVersion) (*autoupdate.AutoUpdateVersion, error) - return utils.FastMarshal(maybeResetProtoRevision(cfg.PreserveRevision, autoUpdateVersion)) - default: - return nil, trace.BadParameter("unrecognized autoupdate version %T", autoUpdateVersion) - } + // DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. + DeleteAutoUpdateVersion(ctx context.Context) error } diff --git a/lib/services/local/autoupdate.go b/lib/services/local/autoupdate.go index e8221b2702f3b..40f7ccf1ca40b 100644 --- a/lib/services/local/autoupdate.go +++ b/lib/services/local/autoupdate.go @@ -20,119 +20,125 @@ package local import ( "context" + "github.com/gravitational/trace" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local/generic" +) + +const ( + autoUpdateConfigPrefix = "autoupdate_config" + autoUpdateConfigSingletonName = "autoupdate-config" + autoUpdateVersionPrefix = "autoupdate_version" + autoUpdateVersionSingletonName = "autoupdate-version" ) // ClusterAutoUpdateService is responsible for managing autoupdate configuration and version management. type ClusterAutoUpdateService struct { - backend.Backend + config *generic.ServiceWrapper[*autoupdate.ClusterAutoUpdateConfig] + version *generic.ServiceWrapper[*autoupdate.AutoUpdateVersion] } // NewClusterAutoUpdateService returns a new AutoUpdateService. -func NewClusterAutoUpdateService(backend backend.Backend) *ClusterAutoUpdateService { - return &ClusterAutoUpdateService{ - Backend: backend, - } -} - -// UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. -func (s *ClusterAutoUpdateService) UpsertClusterAutoUpdateConfig(ctx context.Context, c types.ClusterAutoUpdateConfig) error { - rev := c.GetRevision() - value, err := services.MarshalClusterAutoUpdateConfig(c) +func NewClusterAutoUpdateService(backend backend.Backend) (*ClusterAutoUpdateService, error) { + config, err := generic.NewServiceWrapper( + backend, + types.KindClusterAutoUpdateConfig, + autoUpdateConfigPrefix, + services.MarshalProtoResource[*autoupdate.ClusterAutoUpdateConfig], + services.UnmarshalProtoResource[*autoupdate.ClusterAutoUpdateConfig], + ) if err != nil { - return trace.Wrap(err) + return nil, trace.Wrap(err) } - - _, err = s.Put(ctx, backend.Item{ - Key: backend.Key(clusterAutoupdatePrefix, clusterAutoupdateConfigPrefix), - Value: value, - Expires: c.Expiry(), - Revision: rev, - }) + version, err := generic.NewServiceWrapper( + backend, + types.KindAutoUpdateVersion, + autoUpdateVersionPrefix, + services.MarshalProtoResource[*autoupdate.AutoUpdateVersion], + services.UnmarshalProtoResource[*autoupdate.AutoUpdateVersion], + ) if err != nil { - return trace.Wrap(err) + return nil, trace.Wrap(err) } - return nil + return &ClusterAutoUpdateService{ + config: config, + version: version, + }, nil } -// GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. -func (s *ClusterAutoUpdateService) GetClusterAutoUpdateConfig(ctx context.Context, opts ...services.MarshalOption) (types.ClusterAutoUpdateConfig, error) { - item, err := s.Get(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateConfigPrefix)) - if err != nil { - if trace.IsNotFound(err) { - return nil, trace.NotFound("cluster autoupdate configuration not found") - } +// UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. +func (s *ClusterAutoUpdateService) UpsertClusterAutoUpdateConfig( + ctx context.Context, + c *autoupdate.ClusterAutoUpdateConfig, +) (*autoupdate.ClusterAutoUpdateConfig, error) { + if err := validateClusterAutoUpdateConfig(c); err != nil { return nil, trace.Wrap(err) } - return services.UnmarshalClusterAutoUpdateConfig(item.Value, - services.AddOptions(opts, services.WithRevision(item.Revision))...) + config, err := s.config.UpsertResource(ctx, c) + return config, trace.Wrap(err) +} + +// GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. +func (s *ClusterAutoUpdateService) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { + config, err := s.config.GetResource(ctx, autoUpdateConfigSingletonName) + return config, trace.Wrap(err) } // DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. func (s *ClusterAutoUpdateService) DeleteClusterAutoUpdateConfig(ctx context.Context) error { - err := s.Delete(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateConfigPrefix)) - if err != nil { - if trace.IsNotFound(err) { - return trace.NotFound("cluster autoupdate configuration not found") - } - return trace.Wrap(err) - } - return nil + return trace.Wrap(s.config.DeleteResource(ctx, autoUpdateConfigSingletonName)) } // UpsertAutoUpdateVersion sets cluster autoupdate version resource. -func (s *ClusterAutoUpdateService) UpsertAutoUpdateVersion(ctx context.Context, c types.AutoUpdateVersion) error { - rev := c.GetRevision() - value, err := services.MarshalAutoUpdateVersion(c) - if err != nil { - return trace.Wrap(err) - } - - _, err = s.Put(ctx, backend.Item{ - Key: backend.Key(clusterAutoupdatePrefix, clusterAutoupdateVersionPrefix), - Value: value, - Expires: c.Expiry(), - Revision: rev, - }) - if err != nil { - return trace.Wrap(err) +func (s *ClusterAutoUpdateService) UpsertAutoUpdateVersion(ctx context.Context, v *autoupdate.AutoUpdateVersion) (*autoupdate.AutoUpdateVersion, error) { + if err := validateAutoUpdateVersion(v); err != nil { + return nil, trace.Wrap(err) } - - return nil + version, err := s.version.UpsertResource(ctx, v) + return version, trace.Wrap(err) } // GetAutoUpdateVersion gets the autoupdate version from the backend. -func (s *ClusterAutoUpdateService) GetAutoUpdateVersion(ctx context.Context, opts ...services.MarshalOption) (types.AutoUpdateVersion, error) { - item, err := s.Get(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateVersionPrefix)) - if err != nil { - if trace.IsNotFound(err) { - return nil, trace.NotFound("autoupdate version not found") - } - return nil, trace.Wrap(err) - } - return services.UnmarshalAutoUpdateVersion(item.Value, - services.AddOptions(opts, services.WithRevision(item.Revision))...) +func (s *ClusterAutoUpdateService) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { + version, err := s.version.GetResource(ctx, autoUpdateVersionSingletonName) + return version, trace.Wrap(err) } // DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. func (s *ClusterAutoUpdateService) DeleteAutoUpdateVersion(ctx context.Context) error { - err := s.Delete(ctx, backend.Key(clusterAutoupdatePrefix, clusterAutoupdateVersionPrefix)) - if err != nil { - if trace.IsNotFound(err) { - return trace.NotFound("autoupdate version not found") - } - return trace.Wrap(err) + return trace.Wrap(s.config.DeleteResource(ctx, autoUpdateVersionSingletonName)) +} + +func validateClusterAutoUpdateConfig(config *autoupdate.ClusterAutoUpdateConfig) error { + if config.GetKind() != types.KindClusterAutoUpdateConfig { + return trace.BadParameter("kind must be %q", types.KindClusterAutoUpdateConfig) } + if config.GetVersion() != types.V1 { + return trace.BadParameter("version must be %q", types.V1) + } + if config.GetMetadata().GetName() != autoUpdateConfigSingletonName { + return trace.BadParameter("name must be %q", autoUpdateConfigSingletonName) + } + return nil } -const ( - clusterAutoupdatePrefix = "cluster_autoupdate" - clusterAutoupdateConfigPrefix = "config" - clusterAutoupdateVersionPrefix = "version" -) +func validateAutoUpdateVersion(config *autoupdate.AutoUpdateVersion) error { + if config.GetKind() != types.KindAutoUpdateVersion { + return trace.BadParameter("kind must be %q", types.KindAutoUpdateVersion) + } + if config.GetVersion() != types.V1 { + return trace.BadParameter("version must be %q", types.V1) + } + if config.GetMetadata().GetName() != autoUpdateVersionSingletonName { + return trace.BadParameter("name must be %q", autoUpdateVersionSingletonName) + } + + return nil +} diff --git a/lib/services/local/configuration.go b/lib/services/local/configuration.go index 20925721742d7..38865478326cc 100644 --- a/lib/services/local/configuration.go +++ b/lib/services/local/configuration.go @@ -817,7 +817,6 @@ func (s *ClusterConfigurationService) DeleteAccessGraphSettings(ctx context.Cont const ( clusterConfigPrefix = "cluster_configuration" - clusterAutoUpdatePrefix = "cluster_autoupdate" namePrefix = "name" staticTokensPrefix = "static_tokens" authPrefix = "authentication" @@ -831,6 +830,4 @@ const ( installerPrefix = "installer" maintenancePrefix = "maintenance" accessGraphSettingsPrefix = "access_graph_settings" - autoUpdateConfigPrefix = "config" - autoUpdateVersionPrefix = "version" ) diff --git a/lib/services/local/events.go b/lib/services/local/events.go index 33edbb0b04096..5f4556d71776d 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -30,6 +30,7 @@ import ( "github.com/gravitational/teleport" apidefaults "github.com/gravitational/teleport/api/defaults" accessgraphsecretsv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessgraph/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" kubewaitingcontainerpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" @@ -704,7 +705,7 @@ func (p *clusterNameParser) parse(event backend.Event) (types.Resource, error) { func newClusterAutoUpdateConfigParser() *clusterAutoUpdateConfigParser { return &clusterAutoUpdateConfigParser{ - baseParser: newBaseParser(backend.Key(clusterAutoUpdatePrefix, autoUpdateConfigPrefix)), + baseParser: newBaseParser(backend.Key(autoUpdateConfigPrefix)), } } @@ -722,14 +723,14 @@ func (p *clusterAutoUpdateConfigParser) parse(event backend.Event) (types.Resour h.SetName(types.MetaNameClusterAutoUpdateConfig) return h, nil case types.OpPut: - autoUpdateConfig, err := services.UnmarshalClusterAutoUpdateConfig(event.Item.Value, + autoUpdateConfig, err := services.UnmarshalProtoResource[*autoupdate.ClusterAutoUpdateConfig](event.Item.Value, services.WithExpires(event.Item.Expires), services.WithRevision(event.Item.Revision), ) if err != nil { return nil, trace.Wrap(err) } - return autoUpdateConfig, nil + return types.Resource153ToLegacy(autoUpdateConfig), nil default: return nil, trace.BadParameter("event %v is not supported", event.Type) } @@ -737,7 +738,7 @@ func (p *clusterAutoUpdateConfigParser) parse(event backend.Event) (types.Resour func newAutoUpdateVersionParser() *autoUpdateVersionParser { return &autoUpdateVersionParser{ - baseParser: newBaseParser(backend.Key(clusterAutoUpdatePrefix, autoUpdateVersionPrefix)), + baseParser: newBaseParser(backend.Key(autoUpdateVersionPrefix)), } } @@ -755,14 +756,14 @@ func (p *autoUpdateVersionParser) parse(event backend.Event) (types.Resource, er h.SetName(types.MetaNameAutoUpdateVersion) return h, nil case types.OpPut: - autoUpdateVersion, err := services.UnmarshalAutoUpdateVersion(event.Item.Value, + autoUpdateVersion, err := services.UnmarshalProtoResource[*autoupdate.AutoUpdateVersion](event.Item.Value, services.WithExpires(event.Item.Expires), services.WithRevision(event.Item.Revision), ) if err != nil { return nil, trace.Wrap(err) } - return autoUpdateVersion, nil + return types.Resource153ToLegacy(autoUpdateVersion), nil default: return nil, trace.BadParameter("event %v is not supported", event.Type) } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 80d859799f1b6..f2c390d4b58f0 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1459,14 +1459,14 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para if !trace.IsNotFound(err) && err != nil { return nil, trace.Wrap(err) } else if !trace.IsNotFound(err) { - response.ToolsAutoUpdate = autoUpdateConfig.GetToolsAutoUpdate() + response.ToolsAutoUpdate = autoUpdateConfig.GetSpec().GetToolsAutoUpdate() } autoUpdateVersion, err := h.GetAccessPoint().GetAutoUpdateVersion(r.Context()) if !trace.IsNotFound(err) && err != nil { return nil, trace.Wrap(err) } else if !trace.IsNotFound(err) { - response.ToolsVersion = autoUpdateVersion.GetToolsVersion() + response.ToolsVersion = autoUpdateVersion.GetSpec().GetToolsVersion() } return response, nil @@ -1494,7 +1494,6 @@ func (h *Handler) pingWithConnector(w http.ResponseWriter, r *http.Request, p ht response := &webclient.PingResponse{ Proxy: *proxyConfig, ServerVersion: teleport.Version, - ToolsVersion: teleport.Version, ClusterName: h.auth.clusterName, } From db12db8bfec0a643aa169c893082fc6ef700beb8 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Wed, 21 Aug 2024 13:42:49 -0400 Subject: [PATCH 03/15] Add commands for autoupdate --- api/client/events.go | 15 + api/client/proto/event.pb.go | 672 ++++++++++-------- api/client/webclient/webclient.go | 2 +- .../teleport/autoupdate/v1/autoupdate.pb.go | 40 +- .../teleport/autoupdate/v1/autoupdate.proto | 6 +- .../teleport/legacy/client/proto/event.proto | 5 + api/types/autoupdate/config.go | 60 ++ api/types/autoupdate/version.go | 64 ++ lib/auth/accesspoint/accesspoint.go | 4 +- lib/auth/helpers.go | 1 + lib/cache/cache_test.go | 7 + lib/service/service.go | 4 +- lib/services/autoupdates.go | 1 + lib/services/local/autoupdate.go | 47 +- tool/tctl/common/autoupdate_command.go | 205 ++++++ tool/tctl/common/cmds.go | 1 + 16 files changed, 758 insertions(+), 376 deletions(-) create mode 100644 api/types/autoupdate/config.go create mode 100644 api/types/autoupdate/version.go create mode 100644 tool/tctl/common/autoupdate_command.go diff --git a/api/client/events.go b/api/client/events.go index 70b4eb77be0eb..fab77680142fd 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -19,6 +19,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" accessmonitoringrulesv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -99,6 +100,14 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_StaticHostUser{ StaticHostUser: r, } + case *autoupdate.ClusterAutoUpdateConfig: + out.Resource = &proto.Event_ClusterAutoUpdateConfig{ + ClusterAutoUpdateConfig: r, + } + case *autoupdate.AutoUpdateVersion: + out.Resource = &proto.Event_AutoUpdateVersion{ + AutoUpdateVersion: r, + } default: return nil, trace.BadParameter("resource type %T is not supported", r) } @@ -542,6 +551,12 @@ func EventFromGRPC(in *proto.Event) (*types.Event, error) { } else if r := in.GetStaticHostUser(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil + } else if r := in.GetClusterAutoUpdateConfig(); r != nil { + out.Resource = types.Resource153ToLegacy(r) + return &out, nil + } else if r := in.GetAutoUpdateVersion(); r != nil { + out.Resource = types.Resource153ToLegacy(r) + return &out, nil } else { return nil, trace.BadParameter("received unsupported resource %T", in.Resource) } diff --git a/api/client/proto/event.pb.go b/api/client/proto/event.pb.go index bb626d8da876f..5590cd24dfda2 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -23,6 +23,7 @@ package proto import ( v1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accesslist/v1" v14 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + v112 "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" v110 "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" v17 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" v18 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -173,6 +174,8 @@ type Event struct { // *Event_AccessGraphSettings // *Event_SPIFFEFederation // *Event_StaticHostUser + // *Event_ClusterAutoUpdateConfig + // *Event_AutoUpdateVersion Resource isEvent_Resource `protobuf_oneof:"Resource"` } @@ -642,6 +645,20 @@ func (x *Event) GetStaticHostUser() *v111.StaticHostUser { return nil } +func (x *Event) GetClusterAutoUpdateConfig() *v112.ClusterAutoUpdateConfig { + if x, ok := x.GetResource().(*Event_ClusterAutoUpdateConfig); ok { + return x.ClusterAutoUpdateConfig + } + return nil +} + +func (x *Event) GetAutoUpdateVersion() *v112.AutoUpdateVersion { + if x, ok := x.GetResource().(*Event_AutoUpdateVersion); ok { + return x.AutoUpdateVersion + } + return nil +} + type isEvent_Resource interface { isEvent_Resource() } @@ -949,6 +966,16 @@ type Event_StaticHostUser struct { StaticHostUser *v111.StaticHostUser `protobuf:"bytes,63,opt,name=StaticHostUser,proto3,oneof"` } +type Event_ClusterAutoUpdateConfig struct { + // ClusterAutoUpdateConfig is a resource for cluster autoupdate config. + ClusterAutoUpdateConfig *v112.ClusterAutoUpdateConfig `protobuf:"bytes,64,opt,name=ClusterAutoUpdateConfig,proto3,oneof"` +} + +type Event_AutoUpdateVersion struct { + // AutoUpdateVersion is a resource for autoupdate version. + AutoUpdateVersion *v112.AutoUpdateVersion `protobuf:"bytes,65,opt,name=AutoUpdateVersion,proto3,oneof"` +} + func (*Event_ResourceHeader) isEvent_Resource() {} func (*Event_CertAuthority) isEvent_Resource() {} @@ -1069,6 +1096,10 @@ func (*Event_SPIFFEFederation) isEvent_Resource() {} func (*Event_StaticHostUser) isEvent_Resource() {} +func (*Event_ClusterAutoUpdateConfig) isEvent_Resource() {} + +func (*Event_AutoUpdateVersion) isEvent_Resource() {} + var File_teleport_legacy_client_proto_event_proto protoreflect.FileDescriptor var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ @@ -1081,314 +1112,329 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x5f, - 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x35, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, - 0x61, 0x70, 0x68, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x27, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x72, 0x6f, - 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x72, 0x6f, 0x77, 0x6e, - 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x64, 0x62, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x76, - 0x31, 0x2f, 0x64, 0x62, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x31, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x64, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6b, 0x75, - 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, - 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x63, - 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x28, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x6f, 0x74, 0x5f, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, - 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2d, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, - 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, - 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x73, - 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, - 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, - 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x63, 0x68, 0x6f, 0x73, 0x74, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0xa1, 0x21, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x56, - 0x32, 0x48, 0x00, 0x52, 0x0d, 0x43, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x56, 0x32, 0x48, - 0x00, 0x52, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, - 0x41, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x32, - 0x48, 0x00, 0x52, 0x0e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, - 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x04, - 0x55, 0x73, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x23, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x36, 0x48, 0x00, - 0x52, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x4e, - 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x32, 0x48, 0x00, 0x52, 0x06, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x56, 0x32, 0x48, 0x00, 0x52, 0x0d, 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x10, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x41, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0a, - 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, - 0x00, 0x52, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, - 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x56, 0x33, 0x48, 0x00, 0x52, 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5c, - 0x0a, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, - 0x32, 0x48, 0x00, 0x52, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x16, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, - 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, - 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x41, 0x75, 0x74, 0x68, - 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x6f, 0x63, - 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x50, - 0x0a, 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x56, 0x34, 0x48, 0x00, 0x52, 0x13, 0x4e, 0x65, 0x74, + 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x35, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x2f, + 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x67, 0x72, 0x61, 0x70, 0x68, 0x5f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, + 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x64, + 0x62, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x62, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, + 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6b, + 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x28, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, + 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2d, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, + 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x68, 0x6f, 0x73, 0x74, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe9, 0x22, 0x0a, 0x05, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0d, 0x43, + 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0d, 0x43, 0x65, + 0x72, 0x74, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0c, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0c, 0x53, 0x74, 0x61, 0x74, + 0x69, 0x63, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x50, 0x72, 0x6f, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x43, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x32, 0x48, 0x00, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x04, 0x52, 0x6f, + 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x56, 0x36, 0x48, 0x00, 0x52, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, + 0x30, 0x0a, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x61, 0x6d, 0x65, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x48, 0x00, 0x52, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x12, 0x29, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x56, 0x32, 0x48, 0x00, 0x52, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0d, + 0x52, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0d, 0x52, + 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x10, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x10, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x35, 0x0a, 0x0a, 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, + 0x52, 0x0a, 0x41, 0x70, 0x70, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, + 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0d, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, + 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x35, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0a, 0x57, 0x65, 0x62, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x57, 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x56, 0x33, 0x48, 0x00, 0x52, 0x08, 0x57, + 0x65, 0x62, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x17, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x16, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x41, 0x0a, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, + 0x32, 0x48, 0x00, 0x52, 0x0e, 0x41, 0x75, 0x74, 0x68, 0x50, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x32, 0x48, 0x00, 0x52, 0x12, + 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x64, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x23, 0x0a, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4c, 0x6f, 0x63, 0x6b, 0x56, 0x32, 0x48, + 0x00, 0x52, 0x04, 0x4c, 0x6f, 0x63, 0x6b, 0x12, 0x50, 0x0a, 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x19, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x56, 0x0a, 0x15, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, - 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, - 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x33, 0x48, - 0x00, 0x52, 0x15, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, - 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, - 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x33, - 0x48, 0x00, 0x52, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, - 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x09, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x12, 0x20, 0x0a, 0x03, 0x41, 0x70, 0x70, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, 0x70, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x03, 0x41, - 0x70, 0x70, 0x12, 0x41, 0x0a, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, - 0x32, 0x48, 0x00, 0x52, 0x10, 0x53, 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x10, 0x4b, 0x75, - 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x4a, - 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x56, - 0x31, 0x48, 0x00, 0x52, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x44, - 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, - 0x31, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x59, 0x0a, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x24, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x41, 0x4d, - 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, 0x52, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, - 0x3d, 0x0a, 0x0e, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, - 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, - 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, - 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x26, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x56, 0x31, 0x48, 0x00, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x27, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x49, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x31, 0x48, 0x00, 0x52, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, - 0x6c, 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, - 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, - 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x31, 0x48, 0x00, - 0x52, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x57, 0x0a, - 0x16, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, - 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, - 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x2e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x48, 0x00, 0x52, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, - 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, - 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x58, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x30, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x75, - 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x38, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x48, 0x00, 0x52, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0b, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, - 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, - 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x12, 0x6d, 0x0a, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x37, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x72, 0x75, 0x6c, 0x65, 0x73, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x14, 0x41, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, - 0x12, 0x7e, 0x0a, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, - 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x37, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x1a, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, - 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x12, 0x55, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x5f, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x39, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, + 0x56, 0x34, 0x48, 0x00, 0x52, 0x13, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, + 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x56, 0x0a, 0x15, 0x57, 0x69, 0x6e, + 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, 0x15, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, + 0x74, 0x6f, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, + 0x73, 0x2e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, 0x6b, 0x74, 0x6f, 0x70, + 0x56, 0x33, 0x48, 0x00, 0x52, 0x0e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x44, 0x65, 0x73, + 0x6b, 0x74, 0x6f, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x56, 0x33, 0x48, 0x00, 0x52, 0x08, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x09, + 0x41, 0x70, 0x70, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x03, 0x41, 0x70, 0x70, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x41, + 0x70, 0x70, 0x56, 0x33, 0x48, 0x00, 0x52, 0x03, 0x41, 0x70, 0x70, 0x12, 0x41, 0x0a, 0x10, 0x53, + 0x6e, 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x1f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, + 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x10, 0x53, 0x6e, + 0x6f, 0x77, 0x66, 0x6c, 0x61, 0x6b, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, + 0x0a, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x56, 0x33, 0x48, 0x00, 0x52, 0x10, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, + 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x21, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x56, 0x33, 0x48, 0x00, + 0x52, 0x11, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x43, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x09, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, + 0x18, 0x22, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, 0x52, 0x09, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0f, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x23, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0f, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x59, 0x0a, + 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x56, 0x31, 0x48, 0x00, + 0x52, 0x16, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0e, 0x53, 0x41, 0x4d, 0x4c, + 0x49, 0x64, 0x50, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x65, 0x62, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x48, 0x00, 0x52, 0x0e, 0x53, 0x41, 0x4d, 0x4c, 0x49, 0x64, 0x50, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x18, 0x26, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x74, 0x79, 0x70, + 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x31, 0x48, 0x00, + 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x55, + 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 0x31, + 0x48, 0x00, 0x52, 0x08, 0x55, 0x49, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x41, 0x0a, 0x0e, + 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x28, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4f, 0x6b, 0x74, + 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x56, 0x31, 0x48, 0x00, 0x52, + 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x12, + 0x41, 0x0a, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x31, + 0x48, 0x00, 0x52, 0x0e, 0x4f, 0x6b, 0x74, 0x61, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x31, 0x48, 0x00, 0x52, + 0x0b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0b, + 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x2b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x56, 0x31, 0x48, 0x00, 0x52, 0x0b, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x57, 0x0a, 0x16, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, + 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x16, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, + 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x44, 0x0a, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x2d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x54, 0x0a, 0x0e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x6f, 0x67, + 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, + 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x0e, 0x55, 0x73, 0x65, + 0x72, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x0f, 0x44, 0x69, 0x73, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x30, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x48, 0x00, 0x52, 0x0f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x44, 0x0a, 0x0a, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x0a, 0x41, + 0x75, 0x64, 0x69, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x38, 0x0a, 0x06, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x48, 0x00, 0x52, 0x06, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x12, 0x47, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x73, 0x65, 0x63, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, + 0x0b, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x10, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, + 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x48, 0x00, 0x52, 0x10, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x6d, 0x0a, 0x14, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, + 0x6c, 0x65, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x69, 0x6e, 0x67, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, + 0x65, 0x48, 0x00, 0x52, 0x14, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x7e, 0x0a, 0x1a, 0x4b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6b, 0x75, 0x62, 0x65, 0x77, 0x61, 0x69, + 0x74, 0x69, 0x6e, 0x67, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x76, 0x31, + 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x00, 0x52, 0x1a, 0x4b, + 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x55, 0x0a, 0x10, 0x55, 0x73, 0x65, + 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x38, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x43, 0x72, 0x6f, 0x77, - 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, - 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, - 0x48, 0x00, 0x52, 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x12, 0x4e, - 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x64, 0x62, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0e, - 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x46, - 0x0a, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x3c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x74, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x62, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, + 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x5f, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x44, 0x0a, 0x0a, 0x43, 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x18, + 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x63, 0x72, 0x6f, 0x77, 0x6e, 0x6a, 0x65, 0x77, 0x65, 0x6c, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x6f, 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x48, 0x00, 0x52, 0x0a, 0x43, 0x72, 0x6f, + 0x77, 0x6e, 0x4a, 0x65, 0x77, 0x65, 0x6c, 0x12, 0x4e, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x64, 0x62, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x46, 0x0a, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x48, 0x00, 0x52, 0x0b, 0x42, 0x6f, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, + 0x62, 0x0a, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x13, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x53, 0x50, - 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, - 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, - 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x56, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, 0x10, - 0x32, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, 0x64, - 0x41, 0x75, 0x64, 0x69, 0x74, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, - 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, - 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x67, 0x73, 0x12, 0x55, 0x0a, 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x69, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x10, 0x53, 0x50, 0x49, 0x46, 0x46, 0x45, + 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x56, 0x0a, 0x0e, 0x53, 0x74, + 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x3f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x75, 0x73, + 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x48, 0x00, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x40, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x59, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, + 0x10, 0x32, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, + 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, + 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, + 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1465,6 +1511,8 @@ var file_teleport_legacy_client_proto_event_proto_goTypes = []any{ (*v110.AccessGraphSettings)(nil), // 56: teleport.clusterconfig.v1.AccessGraphSettings (*v19.SPIFFEFederation)(nil), // 57: teleport.machineid.v1.SPIFFEFederation (*v111.StaticHostUser)(nil), // 58: teleport.userprovisioning.v1.StaticHostUser + (*v112.ClusterAutoUpdateConfig)(nil), // 59: teleport.autoupdate.v1.ClusterAutoUpdateConfig + (*v112.AutoUpdateVersion)(nil), // 60: teleport.autoupdate.v1.AutoUpdateVersion } var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 0, // 0: proto.Event.Type:type_name -> proto.Operation @@ -1528,11 +1576,13 @@ var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 56, // 58: proto.Event.AccessGraphSettings:type_name -> teleport.clusterconfig.v1.AccessGraphSettings 57, // 59: proto.Event.SPIFFEFederation:type_name -> teleport.machineid.v1.SPIFFEFederation 58, // 60: proto.Event.StaticHostUser:type_name -> teleport.userprovisioning.v1.StaticHostUser - 61, // [61:61] is the sub-list for method output_type - 61, // [61:61] is the sub-list for method input_type - 61, // [61:61] is the sub-list for extension type_name - 61, // [61:61] is the sub-list for extension extendee - 0, // [0:61] is the sub-list for field type_name + 59, // 61: proto.Event.ClusterAutoUpdateConfig:type_name -> teleport.autoupdate.v1.ClusterAutoUpdateConfig + 60, // 62: proto.Event.AutoUpdateVersion:type_name -> teleport.autoupdate.v1.AutoUpdateVersion + 63, // [63:63] is the sub-list for method output_type + 63, // [63:63] is the sub-list for method input_type + 63, // [63:63] is the sub-list for extension type_name + 63, // [63:63] is the sub-list for extension extendee + 0, // [0:63] is the sub-list for field type_name } func init() { file_teleport_legacy_client_proto_event_proto_init() } @@ -1615,6 +1665,8 @@ func file_teleport_legacy_client_proto_event_proto_init() { (*Event_AccessGraphSettings)(nil), (*Event_SPIFFEFederation)(nil), (*Event_StaticHostUser)(nil), + (*Event_ClusterAutoUpdateConfig)(nil), + (*Event_AutoUpdateVersion)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/api/client/webclient/webclient.go b/api/client/webclient/webclient.go index 9c9ffdbf1f567..df603364497ef 100644 --- a/api/client/webclient/webclient.go +++ b/api/client/webclient/webclient.go @@ -300,7 +300,7 @@ type PingResponse struct { // ToolsVersion defines the version of {tsh, tctl} for client auto-upgrade. ToolsVersion string `json:"tools_version"` // ToolsAutoUpdate enables client autoupdate feature. - ToolsAutoUpdate bool `json:"tools_auto_update"` + ToolsAutoUpdate string `json:"tools_auto_update"` // ClusterName contains the name of the Teleport cluster. ClusterName string `json:"cluster_name"` diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go index ef3e108cd2e5b..83760bb487464 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -123,7 +123,7 @@ type ClusterAutoUpdateConfigSpec struct { unknownFields protoimpl.UnknownFields // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - ToolsAutoUpdate bool `protobuf:"varint,1,opt,name=tools_auto_update,json=toolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` + ToolsAutoUpdate string `protobuf:"bytes,1,opt,name=tools_auto_update,json=toolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` } func (x *ClusterAutoUpdateConfigSpec) Reset() { @@ -158,11 +158,11 @@ func (*ClusterAutoUpdateConfigSpec) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{1} } -func (x *ClusterAutoUpdateConfigSpec) GetToolsAutoUpdate() bool { +func (x *ClusterAutoUpdateConfigSpec) GetToolsAutoUpdate() string { if x != nil { return x.ToolsAutoUpdate } - return false + return "" } // AutoupdateVersionV1 is a resource singleton with version required for @@ -176,7 +176,7 @@ type AutoUpdateVersion struct { SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` - Spec *AutoupdateVersionSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` + Spec *AutoUpdateVersionSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` } func (x *AutoUpdateVersion) Reset() { @@ -239,7 +239,7 @@ func (x *AutoUpdateVersion) GetMetadata() *v1.Metadata { return nil } -func (x *AutoUpdateVersion) GetSpec() *AutoupdateVersionSpec { +func (x *AutoUpdateVersion) GetSpec() *AutoUpdateVersionSpec { if x != nil { return x.Spec } @@ -247,7 +247,7 @@ func (x *AutoUpdateVersion) GetSpec() *AutoupdateVersionSpec { } // AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. -type AutoupdateVersionSpec struct { +type AutoUpdateVersionSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -256,8 +256,8 @@ type AutoupdateVersionSpec struct { ToolsVersion string `protobuf:"bytes,1,opt,name=tools_version,json=toolsVersion,proto3" json:"tools_version,omitempty"` } -func (x *AutoupdateVersionSpec) Reset() { - *x = AutoupdateVersionSpec{} +func (x *AutoUpdateVersionSpec) Reset() { + *x = AutoUpdateVersionSpec{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -265,13 +265,13 @@ func (x *AutoupdateVersionSpec) Reset() { } } -func (x *AutoupdateVersionSpec) String() string { +func (x *AutoUpdateVersionSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoupdateVersionSpec) ProtoMessage() {} +func (*AutoUpdateVersionSpec) ProtoMessage() {} -func (x *AutoupdateVersionSpec) ProtoReflect() protoreflect.Message { +func (x *AutoUpdateVersionSpec) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -283,12 +283,12 @@ func (x *AutoupdateVersionSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoupdateVersionSpec.ProtoReflect.Descriptor instead. -func (*AutoupdateVersionSpec) Descriptor() ([]byte, []int) { +// Deprecated: Use AutoUpdateVersionSpec.ProtoReflect.Descriptor instead. +func (*AutoUpdateVersionSpec) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{3} } -func (x *AutoupdateVersionSpec) GetToolsVersion() string { +func (x *AutoUpdateVersionSpec) GetToolsVersion() string { if x != nil { return x.ToolsVersion } @@ -322,7 +322,7 @@ var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, @@ -335,9 +335,9 @@ var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x22, 0x3c, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x70, 0x65, 0x63, 0x22, 0x3c, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, @@ -367,14 +367,14 @@ var file_teleport_autoupdate_v1_autoupdate_proto_goTypes = []any{ (*ClusterAutoUpdateConfig)(nil), // 0: teleport.autoupdate.v1.ClusterAutoUpdateConfig (*ClusterAutoUpdateConfigSpec)(nil), // 1: teleport.autoupdate.v1.ClusterAutoUpdateConfigSpec (*AutoUpdateVersion)(nil), // 2: teleport.autoupdate.v1.AutoUpdateVersion - (*AutoupdateVersionSpec)(nil), // 3: teleport.autoupdate.v1.AutoupdateVersionSpec + (*AutoUpdateVersionSpec)(nil), // 3: teleport.autoupdate.v1.AutoUpdateVersionSpec (*v1.Metadata)(nil), // 4: teleport.header.v1.Metadata } var file_teleport_autoupdate_v1_autoupdate_proto_depIdxs = []int32{ 4, // 0: teleport.autoupdate.v1.ClusterAutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata 1, // 1: teleport.autoupdate.v1.ClusterAutoUpdateConfig.spec:type_name -> teleport.autoupdate.v1.ClusterAutoUpdateConfigSpec 4, // 2: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata - 3, // 3: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoupdateVersionSpec + 3, // 3: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec 4, // [4:4] is the sub-list for method output_type 4, // [4:4] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name @@ -425,7 +425,7 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*AutoupdateVersionSpec); i { + switch v := v.(*AutoUpdateVersionSpec); i { case 0: return &v.state case 1: diff --git a/api/proto/teleport/autoupdate/v1/autoupdate.proto b/api/proto/teleport/autoupdate/v1/autoupdate.proto index a64b0f8b7a614..fc6ea3c02cede 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate.proto @@ -34,7 +34,7 @@ message ClusterAutoUpdateConfig { // ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. message ClusterAutoUpdateConfigSpec { // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - bool tools_auto_update = 1; + string tools_auto_update = 1; } // AutoupdateVersionV1 is a resource singleton with version required for @@ -45,11 +45,11 @@ message AutoUpdateVersion { string version = 3; teleport.header.v1.Metadata metadata = 4; - AutoupdateVersionSpec spec = 5; + AutoUpdateVersionSpec spec = 5; } // AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. -message AutoupdateVersionSpec { +message AutoUpdateVersionSpec { // ToolsVersion is the semantic version required for tools autoupdates. string tools_version = 1; } diff --git a/api/proto/teleport/legacy/client/proto/event.proto b/api/proto/teleport/legacy/client/proto/event.proto index 0eeb67fd4492e..7d481265e76af 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -18,6 +18,7 @@ package proto; import "teleport/accesslist/v1/accesslist.proto"; import "teleport/accessmonitoringrules/v1/access_monitoring_rules.proto"; +import "teleport/autoupdate/v1/autoupdate.proto"; import "teleport/clusterconfig/v1/access_graph_settings.proto"; import "teleport/crownjewel/v1/crownjewel.proto"; import "teleport/dbobject/v1/dbobject.proto"; @@ -177,5 +178,9 @@ message Event { teleport.machineid.v1.SPIFFEFederation SPIFFEFederation = 62; // StaticHostUser is a resource for static host users. teleport.userprovisioning.v1.StaticHostUser StaticHostUser = 63; + // ClusterAutoUpdateConfig is a resource for cluster autoupdate config. + teleport.autoupdate.v1.ClusterAutoUpdateConfig ClusterAutoUpdateConfig = 64; + // AutoUpdateVersion is a resource for autoupdate version. + teleport.autoupdate.v1.AutoUpdateVersion AutoUpdateVersion = 65; } } diff --git a/api/types/autoupdate/config.go b/api/types/autoupdate/config.go new file mode 100644 index 0000000000000..491b502a1c1b9 --- /dev/null +++ b/api/types/autoupdate/config.go @@ -0,0 +1,60 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package autoupdate + +import ( + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/types" +) + +// NewClusterAutoUpdateConfig creates a new cluster autoupdate configuration resource. +func NewClusterAutoUpdateConfig(spec *autoupdate.ClusterAutoUpdateConfigSpec) (*autoupdate.ClusterAutoUpdateConfig, error) { + config := &autoupdate.ClusterAutoUpdateConfig{ + Kind: types.KindClusterAutoUpdateConfig, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameClusterAutoUpdateConfig, + }, + Spec: spec, + } + if err := ValidateClusterAutoUpdateConfig(config); err != nil { + return nil, trace.Wrap(err) + } + + return config, nil +} + +// ValidateClusterAutoUpdateConfig checks that required parameters are set +// for the specified ClusterAutoUpdateConfig. +func ValidateClusterAutoUpdateConfig(c *autoupdate.ClusterAutoUpdateConfig) error { + if c == nil { + return trace.BadParameter("ClusterAutoUpdateConfig is nil") + } + if c.Metadata == nil { + return trace.BadParameter("Metadata is nil") + } + if c.Spec == nil { + return trace.BadParameter("Spec is nil") + } + + return nil +} diff --git a/api/types/autoupdate/version.go b/api/types/autoupdate/version.go new file mode 100644 index 0000000000000..430c1bdeb795a --- /dev/null +++ b/api/types/autoupdate/version.go @@ -0,0 +1,64 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package autoupdate + +import ( + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/types" +) + +// NewAutoUpdateVersion creates a new autoupdate version resource. +func NewAutoUpdateVersion(spec *autoupdate.AutoUpdateVersionSpec) (*autoupdate.AutoUpdateVersion, error) { + version := &autoupdate.AutoUpdateVersion{ + Kind: types.KindAutoUpdateVersion, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoUpdateVersion, + }, + Spec: spec, + } + if err := ValidateAutoUpdateVersion(version); err != nil { + return nil, trace.Wrap(err) + } + + return version, nil +} + +// ValidateAutoUpdateVersion checks that required parameters are set +// for the specified AutoUpdateVersion. +func ValidateAutoUpdateVersion(v *autoupdate.AutoUpdateVersion) error { + if v == nil { + return trace.BadParameter("AutoUpdateVersion is nil") + } + if v.Metadata == nil { + return trace.BadParameter("Metadata is nil") + } + if v.Spec == nil { + return trace.BadParameter("Spec is nil") + } + + if v.Spec.ToolsVersion == "" { + return trace.BadParameter("ToolsVersion is unset") + } + + return nil +} diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index ed258a7f0f4af..283d097da29a5 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -103,7 +103,7 @@ type Config struct { WebSession types.WebSessionInterface WebToken types.WebTokenInterface WindowsDesktops services.WindowsDesktops - ClusterAutoUpdate services.AutoUpdateService + AutoUpdateService services.AutoUpdateService } func (c *Config) CheckAndSetDefaults() error { @@ -168,7 +168,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { AppSession: cfg.AppSession, Apps: cfg.Apps, ClusterConfig: cfg.ClusterConfig, - AutoUpdateService: cfg.ClusterAutoUpdate, + AutoUpdateService: cfg.AutoUpdateService, CrownJewels: cfg.CrownJewels, DatabaseObjects: cfg.DatabaseObjects, DatabaseServices: cfg.DatabaseServices, diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 5d4605c21dc1c..49ef60fe16914 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -324,6 +324,7 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { AppSession: svces.Identity, Apps: svces.Apps, ClusterConfig: svces.ClusterConfiguration, + AutoUpdateService: svces.AutoUpdateService, CrownJewels: svces.CrownJewels, DatabaseObjects: svces.DatabaseObjects, DatabaseServices: svces.DatabaseServices, diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 9e7a793ad9e36..ed63267770441 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -130,6 +130,7 @@ type testPack struct { databaseObjects services.DatabaseObjects spiffeFederations *local.SPIFFEFederationService staticHostUsers services.StaticHostUser + autoUpdateService services.AutoUpdateService } // testFuncs are functions to support testing an object in a cache. @@ -358,6 +359,11 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) { } p.staticHostUsers = staticHostUserService + p.autoUpdateService, err = local.NewClusterAutoUpdateService(p.backend) + if err != nil { + return nil, trace.Wrap(err) + } + return p, nil } @@ -408,6 +414,7 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) StaticHostUsers: p.staticHostUsers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, + AutoUpdateService: p.autoUpdateService, })) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/service/service.go b/lib/service/service.go index cf05a05c27041..07beab5e4a7dc 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2606,7 +2606,7 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.WebSession = services.Identity.WebSessions() cfg.WebToken = services.Identity.WebTokens() cfg.WindowsDesktops = services.WindowsDesktops - cfg.ClusterAutoUpdate = services.AutoUpdateService + cfg.AutoUpdateService = services.AutoUpdateService return accesspoint.NewCache(cfg) } @@ -2650,7 +2650,7 @@ func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, cfg.WebSession = client.WebSessions() cfg.WebToken = client.WebTokens() cfg.WindowsDesktops = client - cfg.ClusterAutoUpdate = client + cfg.AutoUpdateService = client return accesspoint.NewCache(cfg) } diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index e25622b7076c5..bae727fcdb770 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -20,6 +20,7 @@ package services import ( "context" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" ) diff --git a/lib/services/local/autoupdate.go b/lib/services/local/autoupdate.go index 40f7ccf1ca40b..30e81de48023a 100644 --- a/lib/services/local/autoupdate.go +++ b/lib/services/local/autoupdate.go @@ -25,16 +25,15 @@ import ( "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" "github.com/gravitational/teleport/api/types" + update "github.com/gravitational/teleport/api/types/autoupdate" "github.com/gravitational/teleport/lib/backend" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/local/generic" ) const ( - autoUpdateConfigPrefix = "autoupdate_config" - autoUpdateConfigSingletonName = "autoupdate-config" - autoUpdateVersionPrefix = "autoupdate_version" - autoUpdateVersionSingletonName = "autoupdate-version" + autoUpdateConfigPrefix = "autoupdate_config" + autoUpdateVersionPrefix = "autoupdate_version" ) // ClusterAutoUpdateService is responsible for managing autoupdate configuration and version management. @@ -77,7 +76,7 @@ func (s *ClusterAutoUpdateService) UpsertClusterAutoUpdateConfig( ctx context.Context, c *autoupdate.ClusterAutoUpdateConfig, ) (*autoupdate.ClusterAutoUpdateConfig, error) { - if err := validateClusterAutoUpdateConfig(c); err != nil { + if err := update.ValidateClusterAutoUpdateConfig(c); err != nil { return nil, trace.Wrap(err) } config, err := s.config.UpsertResource(ctx, c) @@ -86,18 +85,18 @@ func (s *ClusterAutoUpdateService) UpsertClusterAutoUpdateConfig( // GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. func (s *ClusterAutoUpdateService) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { - config, err := s.config.GetResource(ctx, autoUpdateConfigSingletonName) + config, err := s.config.GetResource(ctx, types.MetaNameClusterAutoUpdateConfig) return config, trace.Wrap(err) } // DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. func (s *ClusterAutoUpdateService) DeleteClusterAutoUpdateConfig(ctx context.Context) error { - return trace.Wrap(s.config.DeleteResource(ctx, autoUpdateConfigSingletonName)) + return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameClusterAutoUpdateConfig)) } // UpsertAutoUpdateVersion sets cluster autoupdate version resource. func (s *ClusterAutoUpdateService) UpsertAutoUpdateVersion(ctx context.Context, v *autoupdate.AutoUpdateVersion) (*autoupdate.AutoUpdateVersion, error) { - if err := validateAutoUpdateVersion(v); err != nil { + if err := update.ValidateAutoUpdateVersion(v); err != nil { return nil, trace.Wrap(err) } version, err := s.version.UpsertResource(ctx, v) @@ -106,39 +105,11 @@ func (s *ClusterAutoUpdateService) UpsertAutoUpdateVersion(ctx context.Context, // GetAutoUpdateVersion gets the autoupdate version from the backend. func (s *ClusterAutoUpdateService) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { - version, err := s.version.GetResource(ctx, autoUpdateVersionSingletonName) + version, err := s.version.GetResource(ctx, types.MetaNameAutoUpdateVersion) return version, trace.Wrap(err) } // DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. func (s *ClusterAutoUpdateService) DeleteAutoUpdateVersion(ctx context.Context) error { - return trace.Wrap(s.config.DeleteResource(ctx, autoUpdateVersionSingletonName)) -} - -func validateClusterAutoUpdateConfig(config *autoupdate.ClusterAutoUpdateConfig) error { - if config.GetKind() != types.KindClusterAutoUpdateConfig { - return trace.BadParameter("kind must be %q", types.KindClusterAutoUpdateConfig) - } - if config.GetVersion() != types.V1 { - return trace.BadParameter("version must be %q", types.V1) - } - if config.GetMetadata().GetName() != autoUpdateConfigSingletonName { - return trace.BadParameter("name must be %q", autoUpdateConfigSingletonName) - } - - return nil -} - -func validateAutoUpdateVersion(config *autoupdate.AutoUpdateVersion) error { - if config.GetKind() != types.KindAutoUpdateVersion { - return trace.BadParameter("kind must be %q", types.KindAutoUpdateVersion) - } - if config.GetVersion() != types.V1 { - return trace.BadParameter("version must be %q", types.V1) - } - if config.GetMetadata().GetName() != autoUpdateVersionSingletonName { - return trace.BadParameter("name must be %q", autoUpdateVersionSingletonName) - } - - return nil + return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameAutoUpdateVersion)) } diff --git a/tool/tctl/common/autoupdate_command.go b/tool/tctl/common/autoupdate_command.go new file mode 100644 index 0000000000000..fe44fd86018ea --- /dev/null +++ b/tool/tctl/common/autoupdate_command.go @@ -0,0 +1,205 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package common + +import ( + "context" + "fmt" + "os" + "time" + + "github.com/alecthomas/kingpin/v2" + "github.com/coreos/go-semver/semver" + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/client/webclient" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + update "github.com/gravitational/teleport/api/types/autoupdate" + "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/service/servicecfg" + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/interval" +) + +// versionResponse is structure for formatting the autoupdate version response. +type versionResponse struct { + ToolsVersion string `json:"tools_version"` +} + +// AutoUpdateCommand implements the `tctl autoupdate` command for managing +// autoupdate process for tools and agents. +type AutoUpdateCommand struct { + app *kingpin.Application + config *servicecfg.Config + + updateCmd *kingpin.CmdClause + getCmd *kingpin.CmdClause + watchCmd *kingpin.CmdClause + + toolsAutoUpdate string + toolsAutoUpdateVersion string + proxy string +} + +// Initialize allows AutoUpdateCommand to plug itself into the CLI parser. +func (c *AutoUpdateCommand) Initialize(app *kingpin.Application, config *servicecfg.Config) { + c.app = app + c.config = config + autoUpdateCmd := app.Command("autoupdate", "Teleport autoupdate commands.") + + c.updateCmd = autoUpdateCmd.Command("update", "Edit autoupdate configuration.") + c.updateCmd.Flag("set-tools-auto-update", `Enable or disable tools autoupdate in cluster.`).EnumVar(&c.toolsAutoUpdate, "on", "off") + c.updateCmd.Flag("set-tools-version", `Defines client tools version required to be force updated.`).StringVar(&c.toolsAutoUpdateVersion) + + c.getCmd = autoUpdateCmd.Command("get", "Receive tools autoupdate version.") + c.getCmd.Flag("proxy", `URL of the proxy`).StringVar(&c.proxy) + + c.watchCmd = autoUpdateCmd.Command("watch", "Start monitoring autoupdate version updates.") + c.watchCmd.Flag("proxy", `URL of the proxy`).StringVar(&c.proxy) +} + +// TryRun takes the CLI command as an argument and executes it. +func (c *AutoUpdateCommand) TryRun(ctx context.Context, cmd string, client *authclient.Client) (match bool, err error) { + switch cmd { + case c.updateCmd.FullCommand(): + err = c.Upsert(ctx, client) + case c.getCmd.FullCommand(): + err = c.Get(ctx, client) + case c.watchCmd.FullCommand(): + err = c.Watch(ctx, client) + default: + return false, nil + } + return true, trace.Wrap(err) +} + +// Upsert works with cluster_autoupdate_config and autoupdate_version resources to create or update +func (c *AutoUpdateCommand) Upsert(ctx context.Context, client *authclient.Client) error { + serviceClient := client.AutoUpdateServiceClient() + + if c.toolsAutoUpdate != "" { + config, err := serviceClient.GetClusterAutoUpdateConfig(ctx, &autoupdate.GetClusterAutoUpdateConfigRequest{}) + if trace.IsNotFound(err) { + if config, err = update.NewClusterAutoUpdateConfig(&autoupdate.ClusterAutoUpdateConfigSpec{}); err != nil { + return trace.Wrap(err) + } + } else if err != nil { + return trace.Wrap(err) + } + if c.toolsAutoUpdate != config.Spec.ToolsAutoUpdate { + config.Spec.ToolsAutoUpdate = c.toolsAutoUpdate + if _, err := serviceClient.UpsertClusterAutoUpdateConfig(ctx, &autoupdate.UpsertClusterAutoUpdateConfigRequest{ + Config: config, + }); err != nil { + return trace.Wrap(err) + } + fmt.Println("cluster_autoupdate_config has been upserted") + } + } + + version, err := client.AutoUpdateServiceClient().GetAutoUpdateVersion(ctx, &autoupdate.GetAutoUpdateVersionRequest{}) + if trace.IsNotFound(err) { + if version, err = update.NewAutoUpdateVersion(&autoupdate.AutoUpdateVersionSpec{}); err != nil { + return trace.Wrap(err) + } + } else if err != nil { + return trace.Wrap(err) + } + if version.Spec.ToolsVersion != c.toolsAutoUpdateVersion { + version.Spec.ToolsVersion = c.toolsAutoUpdateVersion + if _, err := serviceClient.UpsertAutoUpdateVersion(ctx, &autoupdate.UpsertAutoUpdateVersionRequest{ + Version: version, + }); err != nil { + return trace.Wrap(err) + } + fmt.Println("autoupdate_version has been upserted") + } + + return nil +} + +// Get makes request to fetch tools autoupdate version, if proxy flag is not set +// authorized handler should be used. +func (c *AutoUpdateCommand) Get(ctx context.Context, client *authclient.Client) error { + response, err := c.get(ctx, client) + if err != nil { + return trace.Wrap(err) + } + + if err := utils.WriteJSON(os.Stdout, response); err != nil { + return trace.Wrap(err) + } + + return nil +} + +// Watch launch the watcher of the tools autoupdate version updates. +func (c *AutoUpdateCommand) Watch(ctx context.Context, client *authclient.Client) error { + current := teleport.SemVersion + ticker := interval.New(interval.Config{ + Duration: time.Minute, + FirstDuration: time.Second, + }) + + for { + select { + case <-ctx.Done(): + return nil + case <-ticker.Next(): + response, err := c.get(ctx, client) + if err != nil { + return trace.Wrap(err) + } + if response.ToolsVersion == "" { + continue + } + + semVersion, err := semver.NewVersion(response.ToolsVersion) + if err != nil { + return trace.Wrap(err) + } + if !semVersion.Equal(*current) { + if err := utils.WriteJSON(os.Stdout, response); err != nil { + return trace.Wrap(err) + } + current = semVersion + } + } + } +} + +func (c *AutoUpdateCommand) get(ctx context.Context, client *authclient.Client) (*versionResponse, error) { + var response versionResponse + if c.proxy != "" { + find, err := webclient.Find(&webclient.Config{Context: ctx, ProxyAddr: c.proxy, Insecure: true}) + if err != nil { + return nil, trace.Wrap(err) + } + response.ToolsVersion = find.ToolsVersion + } else { + version, err := client.AutoUpdateServiceClient().GetAutoUpdateVersion(ctx, &autoupdate.GetAutoUpdateVersionRequest{}) + if err != nil { + return nil, trace.Wrap(err) + } + response.ToolsVersion = version.Spec.ToolsVersion + } + + return &response, nil +} diff --git a/tool/tctl/common/cmds.go b/tool/tctl/common/cmds.go index 1c727eba01e25..68f1ad43b74d7 100644 --- a/tool/tctl/common/cmds.go +++ b/tool/tctl/common/cmds.go @@ -64,5 +64,6 @@ func Commands() []CLICommand { &webauthnwinCommand{}, &touchIDCommand{}, &TerraformCommand{}, + &AutoUpdateCommand{}, } } From 1e5760089e16b564879d0deaa84d39a09f5e7fe8 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Thu, 22 Aug 2024 00:53:38 -0400 Subject: [PATCH 04/15] Add test and fix CI --- lib/auth/autoupdate/v1/service.go | 2 +- lib/auth/autoupdate/v1/service_test.go | 228 +++++++++++++++++++++++++ lib/cache/cache_test.go | 28 +++ 3 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 lib/auth/autoupdate/v1/service_test.go diff --git a/lib/auth/autoupdate/v1/service.go b/lib/auth/autoupdate/v1/service.go index b733af3228ac1..ed8680f60449c 100644 --- a/lib/auth/autoupdate/v1/service.go +++ b/lib/auth/autoupdate/v1/service.go @@ -114,7 +114,7 @@ func (s *Service) UpsertAutoUpdateVersion(ctx context.Context, req *autoupdate.U return nil, trace.Wrap(err) } - if err := authCtx.CheckAccessToKind(types.KindClusterAutoUpdateConfig, types.VerbCreate, types.VerbUpdate); err != nil { + if err := authCtx.CheckAccessToKind(types.KindAutoUpdateVersion, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } diff --git a/lib/auth/autoupdate/v1/service_test.go b/lib/auth/autoupdate/v1/service_test.go new file mode 100644 index 0000000000000..54999593bfd1d --- /dev/null +++ b/lib/auth/autoupdate/v1/service_test.go @@ -0,0 +1,228 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package autoupd + +import ( + "context" + "fmt" + "github.com/gravitational/teleport/lib/utils" + "slices" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local" +) + +var allAdminStates = map[authz.AdminActionAuthState]string{ + authz.AdminActionAuthUnauthorized: "Unauthorized", + authz.AdminActionAuthNotRequired: "NotRequired", + authz.AdminActionAuthMFAVerified: "MFAVerified", + authz.AdminActionAuthMFAVerifiedWithReuse: "MFAVerifiedWithReuse", +} + +func stateToString(state authz.AdminActionAuthState) string { + str, ok := allAdminStates[state] + if !ok { + return fmt.Sprintf("unknown(%v)", state) + } + return str +} + +// otherAdminStates returns all admin states except for those passed in +func otherAdminStates(states []authz.AdminActionAuthState) []authz.AdminActionAuthState { + var out []authz.AdminActionAuthState + for state := range allAdminStates { + found := slices.Index(states, state) != -1 + if !found { + out = append(out, state) + } + } + return out +} + +// callMethod calls a method with given name in the DatabaseObjectService service +func callMethod(t *testing.T, service *Service, method string) error { + for _, desc := range autoupdate.AutoUpdateService_ServiceDesc.Methods { + if desc.MethodName == method { + _, err := desc.Handler(service, context.Background(), func(_ any) error { return nil }, nil) + return err + } + } + require.FailNow(t, "method %v not found", method) + panic("this line should never be reached: FailNow() should interrupt the test") +} + +func TestServiceAccess(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + allowedVerbs []string + allowedStates []authz.AdminActionAuthState + disallowedStates []authz.AdminActionAuthState + }{ + { + name: "UpsertClusterAutoUpdateConfig", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbUpdate, types.VerbCreate}, + }, + { + name: "GetClusterAutoUpdateConfig", + allowedStates: []authz.AdminActionAuthState{}, + disallowedStates: []authz.AdminActionAuthState{}, + allowedVerbs: []string{types.VerbRead}, + }, + { + name: "DeleteClusterAutoUpdateConfig", + allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, + allowedVerbs: []string{types.VerbDelete}, + }, + // Autoupdate version check. + { + name: "UpsertAutoUpdateVersion", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbUpdate, types.VerbCreate}, + }, + { + name: "GetAutoUpdateVersion", + allowedStates: []authz.AdminActionAuthState{}, + disallowedStates: []authz.AdminActionAuthState{}, + allowedVerbs: []string{types.VerbRead}, + }, + { + name: "DeleteAutoUpdateVersion", + allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, + allowedVerbs: []string{types.VerbDelete}, + }, + } + + for _, tt := range testCases { + t.Run(tt.name, func(t *testing.T) { + // test the method with allowed admin states, each one separately. + t.Run("allowed admin states", func(t *testing.T) { + for _, state := range tt.allowedStates { + t.Run(stateToString(state), func(t *testing.T) { + for _, verbs := range utils.Combinations(tt.allowedVerbs) { + t.Run(fmt.Sprintf("verbs=%v", verbs), func(t *testing.T) { + service := newService(t, state, fakeChecker{allowedVerbs: verbs}) + err := callMethod(t, service, tt.name) + // expect access denied except with full set of verbs. + if len(verbs) == len(tt.allowedVerbs) { + require.False(t, trace.IsAccessDenied(err)) + } else { + require.True(t, trace.IsAccessDenied(err), "expected access denied for verbs %v, got err=%v", verbs, err) + } + }) + } + }) + } + }) + + // test the method with disallowed admin states; expect failures. + t.Run("disallowed admin states", func(t *testing.T) { + disallowedStates := otherAdminStates(tt.allowedStates) + if tt.disallowedStates != nil { + disallowedStates = tt.disallowedStates + } + for _, state := range disallowedStates { + t.Run(stateToString(state), func(t *testing.T) { + // it is enough to test against tt.allowedVerbs, + // this is the only different data point compared to the test cases above. + service := newService(t, state, fakeChecker{allowedVerbs: tt.allowedVerbs}) + err := callMethod(t, service, tt.name) + require.True(t, trace.IsAccessDenied(err)) + }) + } + }) + }) + } + + // verify that all declared methods have matching test cases + t.Run("verify coverage", func(t *testing.T) { + for _, method := range autoupdate.AutoUpdateService_ServiceDesc.Methods { + t.Run(method.MethodName, func(t *testing.T) { + match := false + for _, testCase := range testCases { + match = match || testCase.name == method.MethodName + } + require.True(t, match, "method %v without coverage, no matching tests", method.MethodName) + }) + } + }) +} + +type fakeChecker struct { + allowedVerbs []string + services.AccessChecker +} + +func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resource string, verb string) error { + if resource == types.KindClusterAutoUpdateConfig || resource == types.KindAutoUpdateVersion { + for _, allowedVerb := range f.allowedVerbs { + if allowedVerb == verb { + return nil + } + } + } + + return trace.AccessDenied("access denied to rule=%v/verb=%v", resource, verb) +} + +func newService(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker) *Service { + t.Helper() + + bk, err := memory.New(memory.Config{}) + require.NoError(t, err) + + storage, err := local.NewClusterAutoUpdateService(bk) + require.NoError(t, err) + + return newServiceWithStorage(t, authState, checker, storage) +} + +func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker, storage services.AutoUpdateService) *Service { + t.Helper() + + authorizer := authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { + user, err := types.NewUser("alice") + if err != nil { + return nil, err + } + return &authz.Context{ + User: user, + Checker: checker, + AdminActionAuthState: authState, + }, nil + }) + + return NewService(storage, authorizer) +} diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index ed63267770441..8b320255fcdfc 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -43,6 +43,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" apidefaults "github.com/gravitational/teleport/api/defaults" accessmonitoringrulesv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -52,6 +53,7 @@ import ( userprovisioningpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/userprovisioning/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/accesslist" + update "github.com/gravitational/teleport/api/types/autoupdate" "github.com/gravitational/teleport/api/types/clusterconfig" "github.com/gravitational/teleport/api/types/discoveryconfig" "github.com/gravitational/teleport/api/types/header" @@ -819,6 +821,7 @@ func TestCompletenessInit(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, + AutoUpdateService: p.autoUpdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -898,6 +901,7 @@ func TestCompletenessReset(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, + AutoUpdateService: p.autoUpdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -1103,6 +1107,7 @@ func TestListResources_NodesTTLVariant(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, + AutoUpdateService: p.autoUpdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, neverOK: true, // ensure reads are never healthy @@ -1193,6 +1198,7 @@ func initStrategy(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, + AutoUpdateService: p.autoUpdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -3298,6 +3304,8 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindAccessGraphSettings: types.Resource153ToLegacy(newAccessGraphSettings(t)), types.KindSPIFFEFederation: types.Resource153ToLegacy(newSPIFFEFederation("test")), types.KindStaticHostUser: types.Resource153ToLegacy(newStaticHostUser(t, "test")), + types.KindClusterAutoUpdateConfig: types.Resource153ToLegacy(newAutoUpdateConfig(t)), + types.KindAutoUpdateVersion: types.Resource153ToLegacy(newAutoUpdateVersion(t)), } for name, cfg := range cases { @@ -3835,6 +3843,26 @@ func newStaticHostUser(t *testing.T, name string) *userprovisioningpb.StaticHost }) } +func newAutoUpdateConfig(t *testing.T) *autoupdate.ClusterAutoUpdateConfig { + t.Helper() + + r, err := update.NewClusterAutoUpdateConfig(&autoupdate.ClusterAutoUpdateConfigSpec{ + ToolsAutoUpdate: "on", + }) + require.NoError(t, err) + return r +} + +func newAutoUpdateVersion(t *testing.T) *autoupdate.AutoUpdateVersion { + t.Helper() + + r, err := update.NewAutoUpdateVersion(&autoupdate.AutoUpdateVersionSpec{ + ToolsVersion: "1.2.3", + }) + require.NoError(t, err) + return r +} + func withKeepalive[T any](fn func(context.Context, T) (*types.KeepAlive, error)) func(context.Context, T) error { return func(ctx context.Context, resource T) error { _, err := fn(ctx, resource) From e1aca135fcf5dec9495cbac5fdf1f0b7b9ee2794 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Thu, 22 Aug 2024 01:46:16 -0400 Subject: [PATCH 05/15] Rename autoupdate config resource --- api/client/client.go | 18 +- api/client/events.go | 16 +- api/client/proto/event.pb.go | 89 +++-- api/client/webclient/webclient.go | 4 +- .../teleport/autoupdate/v1/autoupdate.pb.go | 224 ++++++------- .../autoupdate/v1/autoupdate_service.pb.go | 317 +++++++++--------- .../v1/autoupdate_service_grpc.pb.go | 252 +++++++------- .../teleport/autoupdate/v1/autoupdate.proto | 22 +- .../autoupdate/v1/autoupdate_service.proto | 56 ++-- .../teleport/legacy/client/proto/event.proto | 8 +- api/types/autoupdate/config.go | 20 +- api/types/autoupdate/version.go | 20 +- api/types/constants.go | 16 +- lib/auth/accesspoint/accesspoint.go | 4 +- lib/auth/auth.go | 8 +- lib/auth/authclient/api.go | 8 +- lib/auth/authclient/clt.go | 34 +- lib/auth/autoupdate/v1/service.go | 56 ++-- lib/auth/autoupdate/v1/service_test.go | 24 +- lib/auth/grpcserver.go | 6 +- lib/auth/helpers.go | 2 +- lib/auth/init.go | 4 +- lib/authz/permissions.go | 4 +- lib/cache/cache.go | 50 +-- lib/cache/cache_test.go | 28 +- lib/cache/collections.go | 92 ++--- lib/service/service.go | 6 +- lib/service/servicecfg/config.go | 4 +- lib/services/autoupdates.go | 32 +- lib/services/local/autoupdate.go | 74 ++-- lib/services/local/events.go | 44 +-- lib/web/apiserver.go | 8 +- tool/tctl/common/autoupdate_command.go | 61 ++-- tool/tctl/common/cmds.go | 2 +- 34 files changed, 803 insertions(+), 810 deletions(-) diff --git a/api/client/client.go b/api/client/client.go index 47ad57a793edd..38e0ab16c8331 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -887,9 +887,9 @@ func (c *Client) GetVnetConfig(ctx context.Context) (*vnet.VnetConfig, error) { return c.VnetConfigServiceClient().GetVnetConfig(ctx, &vnet.GetVnetConfigRequest{}) } -// AutoUpdateServiceClient returns an unadorned client for the AutoUpdate service. -func (c *Client) AutoUpdateServiceClient() autoupdate.AutoUpdateServiceClient { - return autoupdate.NewAutoUpdateServiceClient(c.conn) +// AutoupdateServiceClient returns an unadorned client for the Autoupdate service. +func (c *Client) AutoupdateServiceClient() autoupdate.AutoupdateServiceClient { + return autoupdate.NewAutoupdateServiceClient(c.conn) } // Ping gets basic info about the auth server. @@ -2865,18 +2865,18 @@ func (c *Client) GetClusterAuditConfig(ctx context.Context) (types.ClusterAuditC return resp, nil } -// GetClusterAutoUpdateConfig gets cluster autoupdate configuration. -func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { - resp, err := c.AutoUpdateServiceClient().GetClusterAutoUpdateConfig(ctx, &autoupdate.GetClusterAutoUpdateConfigRequest{}) +// GetAutoupdateConfig gets cluster autoupdate configuration. +func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { + resp, err := c.AutoupdateServiceClient().GetAutoupdateConfig(ctx, &autoupdate.GetAutoupdateConfigRequest{}) if err != nil { return nil, trace.Wrap(err) } return resp, nil } -// GetAutoUpdateVersion gets cluster autoupdate version. -func (c *Client) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { - resp, err := c.AutoUpdateServiceClient().GetAutoUpdateVersion(ctx, &autoupdate.GetAutoUpdateVersionRequest{}) +// GetAutoupdateVersion gets cluster autoupdate version. +func (c *Client) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { + resp, err := c.AutoupdateServiceClient().GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) if err != nil { return nil, trace.Wrap(err) } diff --git a/api/client/events.go b/api/client/events.go index fab77680142fd..a972868069bb5 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -100,13 +100,13 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_StaticHostUser{ StaticHostUser: r, } - case *autoupdate.ClusterAutoUpdateConfig: - out.Resource = &proto.Event_ClusterAutoUpdateConfig{ - ClusterAutoUpdateConfig: r, + case *autoupdate.AutoupdateConfig: + out.Resource = &proto.Event_AutoupdateConfig{ + AutoupdateConfig: r, } - case *autoupdate.AutoUpdateVersion: - out.Resource = &proto.Event_AutoUpdateVersion{ - AutoUpdateVersion: r, + case *autoupdate.AutoupdateVersion: + out.Resource = &proto.Event_AutoupdateVersion{ + AutoupdateVersion: r, } default: return nil, trace.BadParameter("resource type %T is not supported", r) @@ -551,10 +551,10 @@ func EventFromGRPC(in *proto.Event) (*types.Event, error) { } else if r := in.GetStaticHostUser(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil - } else if r := in.GetClusterAutoUpdateConfig(); r != nil { + } else if r := in.GetAutoupdateConfig(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil - } else if r := in.GetAutoUpdateVersion(); r != nil { + } else if r := in.GetAutoupdateVersion(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil } else { diff --git a/api/client/proto/event.pb.go b/api/client/proto/event.pb.go index 5590cd24dfda2..6261f07677e3b 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -174,8 +174,8 @@ type Event struct { // *Event_AccessGraphSettings // *Event_SPIFFEFederation // *Event_StaticHostUser - // *Event_ClusterAutoUpdateConfig - // *Event_AutoUpdateVersion + // *Event_AutoupdateConfig + // *Event_AutoupdateVersion Resource isEvent_Resource `protobuf_oneof:"Resource"` } @@ -645,16 +645,16 @@ func (x *Event) GetStaticHostUser() *v111.StaticHostUser { return nil } -func (x *Event) GetClusterAutoUpdateConfig() *v112.ClusterAutoUpdateConfig { - if x, ok := x.GetResource().(*Event_ClusterAutoUpdateConfig); ok { - return x.ClusterAutoUpdateConfig +func (x *Event) GetAutoupdateConfig() *v112.AutoupdateConfig { + if x, ok := x.GetResource().(*Event_AutoupdateConfig); ok { + return x.AutoupdateConfig } return nil } -func (x *Event) GetAutoUpdateVersion() *v112.AutoUpdateVersion { - if x, ok := x.GetResource().(*Event_AutoUpdateVersion); ok { - return x.AutoUpdateVersion +func (x *Event) GetAutoupdateVersion() *v112.AutoupdateVersion { + if x, ok := x.GetResource().(*Event_AutoupdateVersion); ok { + return x.AutoupdateVersion } return nil } @@ -966,14 +966,14 @@ type Event_StaticHostUser struct { StaticHostUser *v111.StaticHostUser `protobuf:"bytes,63,opt,name=StaticHostUser,proto3,oneof"` } -type Event_ClusterAutoUpdateConfig struct { - // ClusterAutoUpdateConfig is a resource for cluster autoupdate config. - ClusterAutoUpdateConfig *v112.ClusterAutoUpdateConfig `protobuf:"bytes,64,opt,name=ClusterAutoUpdateConfig,proto3,oneof"` +type Event_AutoupdateConfig struct { + // AutoupdateConfig is a resource for cluster autoupdate config. + AutoupdateConfig *v112.AutoupdateConfig `protobuf:"bytes,64,opt,name=AutoupdateConfig,proto3,oneof"` } -type Event_AutoUpdateVersion struct { - // AutoUpdateVersion is a resource for autoupdate version. - AutoUpdateVersion *v112.AutoUpdateVersion `protobuf:"bytes,65,opt,name=AutoUpdateVersion,proto3,oneof"` +type Event_AutoupdateVersion struct { + // AutoupdateVersion is a resource for autoupdate version. + AutoupdateVersion *v112.AutoupdateVersion `protobuf:"bytes,65,opt,name=AutoupdateVersion,proto3,oneof"` } func (*Event_ResourceHeader) isEvent_Resource() {} @@ -1096,9 +1096,9 @@ func (*Event_SPIFFEFederation) isEvent_Resource() {} func (*Event_StaticHostUser) isEvent_Resource() {} -func (*Event_ClusterAutoUpdateConfig) isEvent_Resource() {} +func (*Event_AutoupdateConfig) isEvent_Resource() {} -func (*Event_AutoUpdateVersion) isEvent_Resource() {} +func (*Event_AutoupdateVersion) isEvent_Resource() {} var File_teleport_legacy_client_proto_event_proto protoreflect.FileDescriptor @@ -1149,7 +1149,7 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x68, 0x6f, 0x73, 0x74, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe9, 0x22, 0x0a, 0x05, 0x45, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd4, 0x22, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x52, 0x65, @@ -1413,28 +1413,27 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x65, 0x72, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x40, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x59, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, - 0x10, 0x32, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, - 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, - 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, - 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x12, 0x56, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x11, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x41, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, 0x10, 0x32, 0x52, 0x12, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x41, 0x75, 0x64, 0x69, + 0x74, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, + 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, + 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, 0x5a, + 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, + 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1511,8 +1510,8 @@ var file_teleport_legacy_client_proto_event_proto_goTypes = []any{ (*v110.AccessGraphSettings)(nil), // 56: teleport.clusterconfig.v1.AccessGraphSettings (*v19.SPIFFEFederation)(nil), // 57: teleport.machineid.v1.SPIFFEFederation (*v111.StaticHostUser)(nil), // 58: teleport.userprovisioning.v1.StaticHostUser - (*v112.ClusterAutoUpdateConfig)(nil), // 59: teleport.autoupdate.v1.ClusterAutoUpdateConfig - (*v112.AutoUpdateVersion)(nil), // 60: teleport.autoupdate.v1.AutoUpdateVersion + (*v112.AutoupdateConfig)(nil), // 59: teleport.autoupdate.v1.AutoupdateConfig + (*v112.AutoupdateVersion)(nil), // 60: teleport.autoupdate.v1.AutoupdateVersion } var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 0, // 0: proto.Event.Type:type_name -> proto.Operation @@ -1576,8 +1575,8 @@ var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 56, // 58: proto.Event.AccessGraphSettings:type_name -> teleport.clusterconfig.v1.AccessGraphSettings 57, // 59: proto.Event.SPIFFEFederation:type_name -> teleport.machineid.v1.SPIFFEFederation 58, // 60: proto.Event.StaticHostUser:type_name -> teleport.userprovisioning.v1.StaticHostUser - 59, // 61: proto.Event.ClusterAutoUpdateConfig:type_name -> teleport.autoupdate.v1.ClusterAutoUpdateConfig - 60, // 62: proto.Event.AutoUpdateVersion:type_name -> teleport.autoupdate.v1.AutoUpdateVersion + 59, // 61: proto.Event.AutoupdateConfig:type_name -> teleport.autoupdate.v1.AutoupdateConfig + 60, // 62: proto.Event.AutoupdateVersion:type_name -> teleport.autoupdate.v1.AutoupdateVersion 63, // [63:63] is the sub-list for method output_type 63, // [63:63] is the sub-list for method input_type 63, // [63:63] is the sub-list for extension type_name @@ -1665,8 +1664,8 @@ func file_teleport_legacy_client_proto_event_proto_init() { (*Event_AccessGraphSettings)(nil), (*Event_SPIFFEFederation)(nil), (*Event_StaticHostUser)(nil), - (*Event_ClusterAutoUpdateConfig)(nil), - (*Event_AutoUpdateVersion)(nil), + (*Event_AutoupdateConfig)(nil), + (*Event_AutoupdateVersion)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/api/client/webclient/webclient.go b/api/client/webclient/webclient.go index df603364497ef..82557ccc09a33 100644 --- a/api/client/webclient/webclient.go +++ b/api/client/webclient/webclient.go @@ -299,8 +299,8 @@ type PingResponse struct { MinClientVersion string `json:"min_client_version"` // ToolsVersion defines the version of {tsh, tctl} for client auto-upgrade. ToolsVersion string `json:"tools_version"` - // ToolsAutoUpdate enables client autoupdate feature. - ToolsAutoUpdate string `json:"tools_auto_update"` + // ToolsAutoupdate enables client autoupdate feature. + ToolsAutoupdate bool `json:"tools_auto_update"` // ClusterName contains the name of the Teleport cluster. ClusterName string `json:"cluster_name"` diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go index 83760bb487464..90b54ce369b5a 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -35,22 +35,22 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster +// AutoupdateConfig is a config singleton used to configure cluster // autoupdate settings. -type ClusterAutoUpdateConfig struct { +type AutoupdateConfig struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` - SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` - Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` - Spec *ClusterAutoUpdateConfigSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + Spec *AutoupdateConfigSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` } -func (x *ClusterAutoUpdateConfig) Reset() { - *x = ClusterAutoUpdateConfig{} +func (x *AutoupdateConfig) Reset() { + *x = AutoupdateConfig{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -58,13 +58,13 @@ func (x *ClusterAutoUpdateConfig) Reset() { } } -func (x *ClusterAutoUpdateConfig) String() string { +func (x *AutoupdateConfig) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ClusterAutoUpdateConfig) ProtoMessage() {} +func (*AutoupdateConfig) ProtoMessage() {} -func (x *ClusterAutoUpdateConfig) ProtoReflect() protoreflect.Message { +func (x *AutoupdateConfig) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -76,58 +76,58 @@ func (x *ClusterAutoUpdateConfig) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ClusterAutoUpdateConfig.ProtoReflect.Descriptor instead. -func (*ClusterAutoUpdateConfig) Descriptor() ([]byte, []int) { +// Deprecated: Use AutoupdateConfig.ProtoReflect.Descriptor instead. +func (*AutoupdateConfig) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{0} } -func (x *ClusterAutoUpdateConfig) GetKind() string { +func (x *AutoupdateConfig) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *ClusterAutoUpdateConfig) GetSubKind() string { +func (x *AutoupdateConfig) GetSubKind() string { if x != nil { return x.SubKind } return "" } -func (x *ClusterAutoUpdateConfig) GetVersion() string { +func (x *AutoupdateConfig) GetVersion() string { if x != nil { return x.Version } return "" } -func (x *ClusterAutoUpdateConfig) GetMetadata() *v1.Metadata { +func (x *AutoupdateConfig) GetMetadata() *v1.Metadata { if x != nil { return x.Metadata } return nil } -func (x *ClusterAutoUpdateConfig) GetSpec() *ClusterAutoUpdateConfigSpec { +func (x *AutoupdateConfig) GetSpec() *AutoupdateConfigSpec { if x != nil { return x.Spec } return nil } -// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. -type ClusterAutoUpdateConfigSpec struct { +// AutoupdateConfigSpec encodes the parameters of the autoupdate config object. +type AutoupdateConfigSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - ToolsAutoUpdate string `protobuf:"bytes,1,opt,name=tools_auto_update,json=toolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` + ToolsAutoUpdate bool `protobuf:"varint,1,opt,name=tools_auto_update,json=toolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` } -func (x *ClusterAutoUpdateConfigSpec) Reset() { - *x = ClusterAutoUpdateConfigSpec{} +func (x *AutoupdateConfigSpec) Reset() { + *x = AutoupdateConfigSpec{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -135,13 +135,13 @@ func (x *ClusterAutoUpdateConfigSpec) Reset() { } } -func (x *ClusterAutoUpdateConfigSpec) String() string { +func (x *AutoupdateConfigSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ClusterAutoUpdateConfigSpec) ProtoMessage() {} +func (*AutoupdateConfigSpec) ProtoMessage() {} -func (x *ClusterAutoUpdateConfigSpec) ProtoReflect() protoreflect.Message { +func (x *AutoupdateConfigSpec) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -153,21 +153,21 @@ func (x *ClusterAutoUpdateConfigSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ClusterAutoUpdateConfigSpec.ProtoReflect.Descriptor instead. -func (*ClusterAutoUpdateConfigSpec) Descriptor() ([]byte, []int) { +// Deprecated: Use AutoupdateConfigSpec.ProtoReflect.Descriptor instead. +func (*AutoupdateConfigSpec) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{1} } -func (x *ClusterAutoUpdateConfigSpec) GetToolsAutoUpdate() string { +func (x *AutoupdateConfigSpec) GetToolsAutoUpdate() bool { if x != nil { return x.ToolsAutoUpdate } - return "" + return false } -// AutoupdateVersionV1 is a resource singleton with version required for +// AutoupdateVersion is a resource singleton with version required for // tools autoupdate. -type AutoUpdateVersion struct { +type AutoupdateVersion struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -176,11 +176,11 @@ type AutoUpdateVersion struct { SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` - Spec *AutoUpdateVersionSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` + Spec *AutoupdateVersionSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` } -func (x *AutoUpdateVersion) Reset() { - *x = AutoUpdateVersion{} +func (x *AutoupdateVersion) Reset() { + *x = AutoupdateVersion{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -188,13 +188,13 @@ func (x *AutoUpdateVersion) Reset() { } } -func (x *AutoUpdateVersion) String() string { +func (x *AutoupdateVersion) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoUpdateVersion) ProtoMessage() {} +func (*AutoupdateVersion) ProtoMessage() {} -func (x *AutoUpdateVersion) ProtoReflect() protoreflect.Message { +func (x *AutoupdateVersion) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -206,48 +206,48 @@ func (x *AutoUpdateVersion) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoUpdateVersion.ProtoReflect.Descriptor instead. -func (*AutoUpdateVersion) Descriptor() ([]byte, []int) { +// Deprecated: Use AutoupdateVersion.ProtoReflect.Descriptor instead. +func (*AutoupdateVersion) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{2} } -func (x *AutoUpdateVersion) GetKind() string { +func (x *AutoupdateVersion) GetKind() string { if x != nil { return x.Kind } return "" } -func (x *AutoUpdateVersion) GetSubKind() string { +func (x *AutoupdateVersion) GetSubKind() string { if x != nil { return x.SubKind } return "" } -func (x *AutoUpdateVersion) GetVersion() string { +func (x *AutoupdateVersion) GetVersion() string { if x != nil { return x.Version } return "" } -func (x *AutoUpdateVersion) GetMetadata() *v1.Metadata { +func (x *AutoupdateVersion) GetMetadata() *v1.Metadata { if x != nil { return x.Metadata } return nil } -func (x *AutoUpdateVersion) GetSpec() *AutoUpdateVersionSpec { +func (x *AutoupdateVersion) GetSpec() *AutoupdateVersionSpec { if x != nil { return x.Spec } return nil } -// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. -type AutoUpdateVersionSpec struct { +// AutoupdateVersionSpec encodes the parameters of the autoupdate versions. +type AutoupdateVersionSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -256,8 +256,8 @@ type AutoUpdateVersionSpec struct { ToolsVersion string `protobuf:"bytes,1,opt,name=tools_version,json=toolsVersion,proto3" json:"tools_version,omitempty"` } -func (x *AutoUpdateVersionSpec) Reset() { - *x = AutoUpdateVersionSpec{} +func (x *AutoupdateVersionSpec) Reset() { + *x = AutoupdateVersionSpec{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -265,13 +265,13 @@ func (x *AutoUpdateVersionSpec) Reset() { } } -func (x *AutoUpdateVersionSpec) String() string { +func (x *AutoupdateVersionSpec) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AutoUpdateVersionSpec) ProtoMessage() {} +func (*AutoupdateVersionSpec) ProtoMessage() {} -func (x *AutoUpdateVersionSpec) ProtoReflect() protoreflect.Message { +func (x *AutoupdateVersionSpec) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -283,12 +283,12 @@ func (x *AutoUpdateVersionSpec) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AutoUpdateVersionSpec.ProtoReflect.Descriptor instead. -func (*AutoUpdateVersionSpec) Descriptor() ([]byte, []int) { +// Deprecated: Use AutoupdateVersionSpec.ProtoReflect.Descriptor instead. +func (*AutoupdateVersionSpec) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{3} } -func (x *AutoUpdateVersionSpec) GetToolsVersion() string { +func (x *AutoupdateVersionSpec) GetToolsVersion() string { if x != nil { return x.ToolsVersion } @@ -304,50 +304,48 @@ var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe5, 0x01, 0x0a, 0x17, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x49, 0x0a, 0x1b, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x74, - 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x22, 0x3c, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, - 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd7, 0x01, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x04, + 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x42, + 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, + 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x3c, + 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x5a, 0x54, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -364,17 +362,17 @@ func file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP() []byte { var file_teleport_autoupdate_v1_autoupdate_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_teleport_autoupdate_v1_autoupdate_proto_goTypes = []any{ - (*ClusterAutoUpdateConfig)(nil), // 0: teleport.autoupdate.v1.ClusterAutoUpdateConfig - (*ClusterAutoUpdateConfigSpec)(nil), // 1: teleport.autoupdate.v1.ClusterAutoUpdateConfigSpec - (*AutoUpdateVersion)(nil), // 2: teleport.autoupdate.v1.AutoUpdateVersion - (*AutoUpdateVersionSpec)(nil), // 3: teleport.autoupdate.v1.AutoUpdateVersionSpec - (*v1.Metadata)(nil), // 4: teleport.header.v1.Metadata + (*AutoupdateConfig)(nil), // 0: teleport.autoupdate.v1.AutoupdateConfig + (*AutoupdateConfigSpec)(nil), // 1: teleport.autoupdate.v1.AutoupdateConfigSpec + (*AutoupdateVersion)(nil), // 2: teleport.autoupdate.v1.AutoupdateVersion + (*AutoupdateVersionSpec)(nil), // 3: teleport.autoupdate.v1.AutoupdateVersionSpec + (*v1.Metadata)(nil), // 4: teleport.header.v1.Metadata } var file_teleport_autoupdate_v1_autoupdate_proto_depIdxs = []int32{ - 4, // 0: teleport.autoupdate.v1.ClusterAutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata - 1, // 1: teleport.autoupdate.v1.ClusterAutoUpdateConfig.spec:type_name -> teleport.autoupdate.v1.ClusterAutoUpdateConfigSpec - 4, // 2: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata - 3, // 3: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec + 4, // 0: teleport.autoupdate.v1.AutoupdateConfig.metadata:type_name -> teleport.header.v1.Metadata + 1, // 1: teleport.autoupdate.v1.AutoupdateConfig.spec:type_name -> teleport.autoupdate.v1.AutoupdateConfigSpec + 4, // 2: teleport.autoupdate.v1.AutoupdateVersion.metadata:type_name -> teleport.header.v1.Metadata + 3, // 3: teleport.autoupdate.v1.AutoupdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoupdateVersionSpec 4, // [4:4] is the sub-list for method output_type 4, // [4:4] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name @@ -389,7 +387,7 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { } if !protoimpl.UnsafeEnabled { file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*ClusterAutoUpdateConfig); i { + switch v := v.(*AutoupdateConfig); i { case 0: return &v.state case 1: @@ -401,7 +399,7 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*ClusterAutoUpdateConfigSpec); i { + switch v := v.(*AutoupdateConfigSpec); i { case 0: return &v.state case 1: @@ -413,7 +411,7 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*AutoUpdateVersion); i { + switch v := v.(*AutoupdateVersion); i { case 0: return &v.state case 1: @@ -425,7 +423,7 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*AutoUpdateVersionSpec); i { + switch v := v.(*AutoupdateVersionSpec); i { case 0: return &v.state case 1: diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go index 31c7d8b05a255..03d4d4a96665a 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go @@ -35,15 +35,15 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// Request for GetClusterAutoUpdateConfig. -type GetClusterAutoUpdateConfigRequest struct { +// Request for GetAutoupdateConfig. +type GetAutoupdateConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *GetClusterAutoUpdateConfigRequest) Reset() { - *x = GetClusterAutoUpdateConfigRequest{} +func (x *GetAutoupdateConfigRequest) Reset() { + *x = GetAutoupdateConfigRequest{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -51,13 +51,13 @@ func (x *GetClusterAutoUpdateConfigRequest) Reset() { } } -func (x *GetClusterAutoUpdateConfigRequest) String() string { +func (x *GetAutoupdateConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetClusterAutoUpdateConfigRequest) ProtoMessage() {} +func (*GetAutoupdateConfigRequest) ProtoMessage() {} -func (x *GetClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Message { +func (x *GetAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -69,22 +69,22 @@ func (x *GetClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Message return mi.MessageOf(x) } -// Deprecated: Use GetClusterAutoUpdateConfigRequest.ProtoReflect.Descriptor instead. -func (*GetClusterAutoUpdateConfigRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetAutoupdateConfigRequest.ProtoReflect.Descriptor instead. +func (*GetAutoupdateConfigRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{0} } -// Request for UpsertClusterAutoUpdateConfig. -type UpsertClusterAutoUpdateConfigRequest struct { +// Request for UpsertAutoupdateConfig. +type UpsertAutoupdateConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Config *ClusterAutoUpdateConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` + Config *AutoupdateConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` } -func (x *UpsertClusterAutoUpdateConfigRequest) Reset() { - *x = UpsertClusterAutoUpdateConfigRequest{} +func (x *UpsertAutoupdateConfigRequest) Reset() { + *x = UpsertAutoupdateConfigRequest{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -92,13 +92,13 @@ func (x *UpsertClusterAutoUpdateConfigRequest) Reset() { } } -func (x *UpsertClusterAutoUpdateConfigRequest) String() string { +func (x *UpsertAutoupdateConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpsertClusterAutoUpdateConfigRequest) ProtoMessage() {} +func (*UpsertAutoupdateConfigRequest) ProtoMessage() {} -func (x *UpsertClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Message { +func (x *UpsertAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -110,27 +110,27 @@ func (x *UpsertClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use UpsertClusterAutoUpdateConfigRequest.ProtoReflect.Descriptor instead. -func (*UpsertClusterAutoUpdateConfigRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use UpsertAutoupdateConfigRequest.ProtoReflect.Descriptor instead. +func (*UpsertAutoupdateConfigRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{1} } -func (x *UpsertClusterAutoUpdateConfigRequest) GetConfig() *ClusterAutoUpdateConfig { +func (x *UpsertAutoupdateConfigRequest) GetConfig() *AutoupdateConfig { if x != nil { return x.Config } return nil } -// Request for DeleteClusterAutoUpdateConfig. -type DeleteClusterAutoUpdateConfigRequest struct { +// Request for DeleteAutoupdateConfig. +type DeleteAutoupdateConfigRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *DeleteClusterAutoUpdateConfigRequest) Reset() { - *x = DeleteClusterAutoUpdateConfigRequest{} +func (x *DeleteAutoupdateConfigRequest) Reset() { + *x = DeleteAutoupdateConfigRequest{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -138,13 +138,13 @@ func (x *DeleteClusterAutoUpdateConfigRequest) Reset() { } } -func (x *DeleteClusterAutoUpdateConfigRequest) String() string { +func (x *DeleteAutoupdateConfigRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteClusterAutoUpdateConfigRequest) ProtoMessage() {} +func (*DeleteAutoupdateConfigRequest) ProtoMessage() {} -func (x *DeleteClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -156,20 +156,20 @@ func (x *DeleteClusterAutoUpdateConfigRequest) ProtoReflect() protoreflect.Messa return mi.MessageOf(x) } -// Deprecated: Use DeleteClusterAutoUpdateConfigRequest.ProtoReflect.Descriptor instead. -func (*DeleteClusterAutoUpdateConfigRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteAutoupdateConfigRequest.ProtoReflect.Descriptor instead. +func (*DeleteAutoupdateConfigRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{2} } -// Request for GetAutoUpdateVersion. -type GetAutoUpdateVersionRequest struct { +// Request for GetAutoupdateVersion. +type GetAutoupdateVersionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *GetAutoUpdateVersionRequest) Reset() { - *x = GetAutoUpdateVersionRequest{} +func (x *GetAutoupdateVersionRequest) Reset() { + *x = GetAutoupdateVersionRequest{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -177,13 +177,13 @@ func (x *GetAutoUpdateVersionRequest) Reset() { } } -func (x *GetAutoUpdateVersionRequest) String() string { +func (x *GetAutoupdateVersionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetAutoUpdateVersionRequest) ProtoMessage() {} +func (*GetAutoupdateVersionRequest) ProtoMessage() {} -func (x *GetAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { +func (x *GetAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -195,22 +195,22 @@ func (x *GetAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetAutoUpdateVersionRequest.ProtoReflect.Descriptor instead. -func (*GetAutoUpdateVersionRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetAutoupdateVersionRequest.ProtoReflect.Descriptor instead. +func (*GetAutoupdateVersionRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{3} } -// Request for UpsertAutoUpdateVersion. -type UpsertAutoUpdateVersionRequest struct { +// Request for UpsertAutoupdateVersion. +type UpsertAutoupdateVersionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Version *AutoUpdateVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + Version *AutoupdateVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` } -func (x *UpsertAutoUpdateVersionRequest) Reset() { - *x = UpsertAutoUpdateVersionRequest{} +func (x *UpsertAutoupdateVersionRequest) Reset() { + *x = UpsertAutoupdateVersionRequest{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -218,13 +218,13 @@ func (x *UpsertAutoUpdateVersionRequest) Reset() { } } -func (x *UpsertAutoUpdateVersionRequest) String() string { +func (x *UpsertAutoupdateVersionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UpsertAutoUpdateVersionRequest) ProtoMessage() {} +func (*UpsertAutoupdateVersionRequest) ProtoMessage() {} -func (x *UpsertAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { +func (x *UpsertAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -236,27 +236,27 @@ func (x *UpsertAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UpsertAutoUpdateVersionRequest.ProtoReflect.Descriptor instead. -func (*UpsertAutoUpdateVersionRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use UpsertAutoupdateVersionRequest.ProtoReflect.Descriptor instead. +func (*UpsertAutoupdateVersionRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{4} } -func (x *UpsertAutoUpdateVersionRequest) GetVersion() *AutoUpdateVersion { +func (x *UpsertAutoupdateVersionRequest) GetVersion() *AutoupdateVersion { if x != nil { return x.Version } return nil } -// Request for DeleteAutoUpdateVersion. -type DeleteAutoUpdateVersionRequest struct { +// Request for DeleteAutoupdateVersion. +type DeleteAutoupdateVersionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields } -func (x *DeleteAutoUpdateVersionRequest) Reset() { - *x = DeleteAutoUpdateVersionRequest{} +func (x *DeleteAutoupdateVersionRequest) Reset() { + *x = DeleteAutoupdateVersionRequest{} if protoimpl.UnsafeEnabled { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -264,13 +264,13 @@ func (x *DeleteAutoUpdateVersionRequest) Reset() { } } -func (x *DeleteAutoUpdateVersionRequest) String() string { +func (x *DeleteAutoupdateVersionRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteAutoUpdateVersionRequest) ProtoMessage() {} +func (*DeleteAutoupdateVersionRequest) ProtoMessage() {} -func (x *DeleteAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { +func (x *DeleteAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -282,8 +282,8 @@ func (x *DeleteAutoUpdateVersionRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteAutoUpdateVersionRequest.ProtoReflect.Descriptor instead. -func (*DeleteAutoUpdateVersionRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use DeleteAutoupdateVersionRequest.ProtoReflect.Descriptor instead. +func (*DeleteAutoupdateVersionRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{5} } @@ -299,83 +299,78 @@ var file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc = []byte{ 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x27, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x23, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x6f, 0x0a, 0x24, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x26, 0x0a, 0x24, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1d, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x1e, - 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, - 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0x87, 0x06, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x88, 0x01, 0x0a, 0x1a, - 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, - 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x8e, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x73, 0x65, 0x72, - 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x75, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x76, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x1c, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x61, 0x0a, + 0x1d, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x22, 0x1f, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x65, 0x0a, 0x1e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0xcd, 0x05, 0x0a, 0x11, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, + 0x73, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, + 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x67, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x76, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, - 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, - 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x69, + 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, - 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, - 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, - 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -392,31 +387,31 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP() []byte { var file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_teleport_autoupdate_v1_autoupdate_service_proto_goTypes = []any{ - (*GetClusterAutoUpdateConfigRequest)(nil), // 0: teleport.autoupdate.v1.GetClusterAutoUpdateConfigRequest - (*UpsertClusterAutoUpdateConfigRequest)(nil), // 1: teleport.autoupdate.v1.UpsertClusterAutoUpdateConfigRequest - (*DeleteClusterAutoUpdateConfigRequest)(nil), // 2: teleport.autoupdate.v1.DeleteClusterAutoUpdateConfigRequest - (*GetAutoUpdateVersionRequest)(nil), // 3: teleport.autoupdate.v1.GetAutoUpdateVersionRequest - (*UpsertAutoUpdateVersionRequest)(nil), // 4: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest - (*DeleteAutoUpdateVersionRequest)(nil), // 5: teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest - (*ClusterAutoUpdateConfig)(nil), // 6: teleport.autoupdate.v1.ClusterAutoUpdateConfig - (*AutoUpdateVersion)(nil), // 7: teleport.autoupdate.v1.AutoUpdateVersion - (*emptypb.Empty)(nil), // 8: google.protobuf.Empty + (*GetAutoupdateConfigRequest)(nil), // 0: teleport.autoupdate.v1.GetAutoupdateConfigRequest + (*UpsertAutoupdateConfigRequest)(nil), // 1: teleport.autoupdate.v1.UpsertAutoupdateConfigRequest + (*DeleteAutoupdateConfigRequest)(nil), // 2: teleport.autoupdate.v1.DeleteAutoupdateConfigRequest + (*GetAutoupdateVersionRequest)(nil), // 3: teleport.autoupdate.v1.GetAutoupdateVersionRequest + (*UpsertAutoupdateVersionRequest)(nil), // 4: teleport.autoupdate.v1.UpsertAutoupdateVersionRequest + (*DeleteAutoupdateVersionRequest)(nil), // 5: teleport.autoupdate.v1.DeleteAutoupdateVersionRequest + (*AutoupdateConfig)(nil), // 6: teleport.autoupdate.v1.AutoupdateConfig + (*AutoupdateVersion)(nil), // 7: teleport.autoupdate.v1.AutoupdateVersion + (*emptypb.Empty)(nil), // 8: google.protobuf.Empty } var file_teleport_autoupdate_v1_autoupdate_service_proto_depIdxs = []int32{ - 6, // 0: teleport.autoupdate.v1.UpsertClusterAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.ClusterAutoUpdateConfig - 7, // 1: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion - 0, // 2: teleport.autoupdate.v1.AutoUpdateService.GetClusterAutoUpdateConfig:input_type -> teleport.autoupdate.v1.GetClusterAutoUpdateConfigRequest - 1, // 3: teleport.autoupdate.v1.AutoUpdateService.UpsertClusterAutoUpdateConfig:input_type -> teleport.autoupdate.v1.UpsertClusterAutoUpdateConfigRequest - 2, // 4: teleport.autoupdate.v1.AutoUpdateService.DeleteClusterAutoUpdateConfig:input_type -> teleport.autoupdate.v1.DeleteClusterAutoUpdateConfigRequest - 3, // 5: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:input_type -> teleport.autoupdate.v1.GetAutoUpdateVersionRequest - 4, // 6: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:input_type -> teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest - 5, // 7: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:input_type -> teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest - 6, // 8: teleport.autoupdate.v1.AutoUpdateService.GetClusterAutoUpdateConfig:output_type -> teleport.autoupdate.v1.ClusterAutoUpdateConfig - 6, // 9: teleport.autoupdate.v1.AutoUpdateService.UpsertClusterAutoUpdateConfig:output_type -> teleport.autoupdate.v1.ClusterAutoUpdateConfig - 8, // 10: teleport.autoupdate.v1.AutoUpdateService.DeleteClusterAutoUpdateConfig:output_type -> google.protobuf.Empty - 7, // 11: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion - 7, // 12: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion - 8, // 13: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:output_type -> google.protobuf.Empty + 6, // 0: teleport.autoupdate.v1.UpsertAutoupdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoupdateConfig + 7, // 1: teleport.autoupdate.v1.UpsertAutoupdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoupdateVersion + 0, // 2: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateConfig:input_type -> teleport.autoupdate.v1.GetAutoupdateConfigRequest + 1, // 3: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateConfig:input_type -> teleport.autoupdate.v1.UpsertAutoupdateConfigRequest + 2, // 4: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateConfig:input_type -> teleport.autoupdate.v1.DeleteAutoupdateConfigRequest + 3, // 5: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateVersion:input_type -> teleport.autoupdate.v1.GetAutoupdateVersionRequest + 4, // 6: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateVersion:input_type -> teleport.autoupdate.v1.UpsertAutoupdateVersionRequest + 5, // 7: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateVersion:input_type -> teleport.autoupdate.v1.DeleteAutoupdateVersionRequest + 6, // 8: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig + 6, // 9: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig + 8, // 10: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateConfig:output_type -> google.protobuf.Empty + 7, // 11: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion + 7, // 12: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion + 8, // 13: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateVersion:output_type -> google.protobuf.Empty 8, // [8:14] is the sub-list for method output_type 2, // [2:8] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name @@ -432,7 +427,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { file_teleport_autoupdate_v1_autoupdate_proto_init() if !protoimpl.UnsafeEnabled { file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[0].Exporter = func(v any, i int) any { - switch v := v.(*GetClusterAutoUpdateConfigRequest); i { + switch v := v.(*GetAutoupdateConfigRequest); i { case 0: return &v.state case 1: @@ -444,7 +439,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*UpsertClusterAutoUpdateConfigRequest); i { + switch v := v.(*UpsertAutoupdateConfigRequest); i { case 0: return &v.state case 1: @@ -456,7 +451,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*DeleteClusterAutoUpdateConfigRequest); i { + switch v := v.(*DeleteAutoupdateConfigRequest); i { case 0: return &v.state case 1: @@ -468,7 +463,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetAutoUpdateVersionRequest); i { + switch v := v.(*GetAutoupdateVersionRequest); i { case 0: return &v.state case 1: @@ -480,7 +475,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*UpsertAutoUpdateVersionRequest); i { + switch v := v.(*UpsertAutoupdateVersionRequest); i { case 0: return &v.state case 1: @@ -492,7 +487,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5].Exporter = func(v any, i int) any { - switch v := v.(*DeleteAutoUpdateVersionRequest); i { + switch v := v.(*DeleteAutoupdateVersionRequest); i { case 0: return &v.state case 1: diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go index 07e0f751d6e02..082e9ea37facc 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go @@ -34,307 +34,307 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - AutoUpdateService_GetClusterAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetClusterAutoUpdateConfig" - AutoUpdateService_UpsertClusterAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertClusterAutoUpdateConfig" - AutoUpdateService_DeleteClusterAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteClusterAutoUpdateConfig" - AutoUpdateService_GetAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetAutoUpdateVersion" - AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertAutoUpdateVersion" - AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteAutoUpdateVersion" + AutoupdateService_GetAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/GetAutoupdateConfig" + AutoupdateService_UpsertAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/UpsertAutoupdateConfig" + AutoupdateService_DeleteAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/DeleteAutoupdateConfig" + AutoupdateService_GetAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/GetAutoupdateVersion" + AutoupdateService_UpsertAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/UpsertAutoupdateVersion" + AutoupdateService_DeleteAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/DeleteAutoupdateVersion" ) -// AutoUpdateServiceClient is the client API for AutoUpdateService service. +// AutoupdateServiceClient is the client API for AutoupdateService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. // -// AutoUpdateService provides an API to manage autoupdates. -type AutoUpdateServiceClient interface { - // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. - GetClusterAutoUpdateConfig(ctx context.Context, in *GetClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) - // UpsertClusterAutoUpdateConfig creates a new ClusterAutoUpdateConfig or replaces an existing ClusterAutoUpdateConfig. - UpsertClusterAutoUpdateConfig(ctx context.Context, in *UpsertClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) - // DeleteClusterAutoUpdateConfig hard deletes the specified ClusterAutoUpdateConfig. - DeleteClusterAutoUpdateConfig(ctx context.Context, in *DeleteClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) - // GetAutoUpdateVersion gets the current autoupdate version singleton. - GetAutoUpdateVersion(ctx context.Context, in *GetAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) - // UpsertAutoUpdateVersion creates a new AutoUpdateVersion or replaces an existing AutoUpdateVersion. - UpsertAutoUpdateVersion(ctx context.Context, in *UpsertAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) - // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. - DeleteAutoUpdateVersion(ctx context.Context, in *DeleteAutoUpdateVersionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) +// AutoupdateService provides an API to manage autoupdates. +type AutoupdateServiceClient interface { + // GetAutoupdateConfig gets the current autoupdate config singleton. + GetAutoupdateConfig(ctx context.Context, in *GetAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) + // UpsertAutoupdateConfig creates a new AutoupdateConfig or replaces an existing AutoupdateConfig. + UpsertAutoupdateConfig(ctx context.Context, in *UpsertAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) + // DeleteAutoupdateConfig hard deletes the specified AutoupdateConfig. + DeleteAutoupdateConfig(ctx context.Context, in *DeleteAutoupdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // GetAutoupdateVersion gets the current autoupdate version singleton. + GetAutoupdateVersion(ctx context.Context, in *GetAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) + // UpsertAutoupdateVersion creates a new AutoupdateVersion or replaces an existing AutoupdateVersion. + UpsertAutoupdateVersion(ctx context.Context, in *UpsertAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) + // DeleteAutoupdateVersion hard deletes the specified AutoupdateVersionRequest. + DeleteAutoupdateVersion(ctx context.Context, in *DeleteAutoupdateVersionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) } -type autoUpdateServiceClient struct { +type autoupdateServiceClient struct { cc grpc.ClientConnInterface } -func NewAutoUpdateServiceClient(cc grpc.ClientConnInterface) AutoUpdateServiceClient { - return &autoUpdateServiceClient{cc} +func NewAutoupdateServiceClient(cc grpc.ClientConnInterface) AutoupdateServiceClient { + return &autoupdateServiceClient{cc} } -func (c *autoUpdateServiceClient) GetClusterAutoUpdateConfig(ctx context.Context, in *GetClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) { +func (c *autoupdateServiceClient) GetAutoupdateConfig(ctx context.Context, in *GetAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(ClusterAutoUpdateConfig) - err := c.cc.Invoke(ctx, AutoUpdateService_GetClusterAutoUpdateConfig_FullMethodName, in, out, cOpts...) + out := new(AutoupdateConfig) + err := c.cc.Invoke(ctx, AutoupdateService_GetAutoupdateConfig_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *autoUpdateServiceClient) UpsertClusterAutoUpdateConfig(ctx context.Context, in *UpsertClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*ClusterAutoUpdateConfig, error) { +func (c *autoupdateServiceClient) UpsertAutoupdateConfig(ctx context.Context, in *UpsertAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(ClusterAutoUpdateConfig) - err := c.cc.Invoke(ctx, AutoUpdateService_UpsertClusterAutoUpdateConfig_FullMethodName, in, out, cOpts...) + out := new(AutoupdateConfig) + err := c.cc.Invoke(ctx, AutoupdateService_UpsertAutoupdateConfig_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *autoUpdateServiceClient) DeleteClusterAutoUpdateConfig(ctx context.Context, in *DeleteClusterAutoUpdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *autoupdateServiceClient) DeleteAutoupdateConfig(ctx context.Context, in *DeleteAutoupdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, AutoUpdateService_DeleteClusterAutoUpdateConfig_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, AutoupdateService_DeleteAutoupdateConfig_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *autoUpdateServiceClient) GetAutoUpdateVersion(ctx context.Context, in *GetAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) { +func (c *autoupdateServiceClient) GetAutoupdateVersion(ctx context.Context, in *GetAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(AutoUpdateVersion) - err := c.cc.Invoke(ctx, AutoUpdateService_GetAutoUpdateVersion_FullMethodName, in, out, cOpts...) + out := new(AutoupdateVersion) + err := c.cc.Invoke(ctx, AutoupdateService_GetAutoupdateVersion_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *autoUpdateServiceClient) UpsertAutoUpdateVersion(ctx context.Context, in *UpsertAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) { +func (c *autoupdateServiceClient) UpsertAutoupdateVersion(ctx context.Context, in *UpsertAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(AutoUpdateVersion) - err := c.cc.Invoke(ctx, AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName, in, out, cOpts...) + out := new(AutoupdateVersion) + err := c.cc.Invoke(ctx, AutoupdateService_UpsertAutoupdateVersion_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *autoUpdateServiceClient) DeleteAutoUpdateVersion(ctx context.Context, in *DeleteAutoUpdateVersionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *autoupdateServiceClient) DeleteAutoupdateVersion(ctx context.Context, in *DeleteAutoupdateVersionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, AutoupdateService_DeleteAutoupdateVersion_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -// AutoUpdateServiceServer is the server API for AutoUpdateService service. -// All implementations must embed UnimplementedAutoUpdateServiceServer +// AutoupdateServiceServer is the server API for AutoupdateService service. +// All implementations must embed UnimplementedAutoupdateServiceServer // for forward compatibility. // -// AutoUpdateService provides an API to manage autoupdates. -type AutoUpdateServiceServer interface { - // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. - GetClusterAutoUpdateConfig(context.Context, *GetClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) - // UpsertClusterAutoUpdateConfig creates a new ClusterAutoUpdateConfig or replaces an existing ClusterAutoUpdateConfig. - UpsertClusterAutoUpdateConfig(context.Context, *UpsertClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) - // DeleteClusterAutoUpdateConfig hard deletes the specified ClusterAutoUpdateConfig. - DeleteClusterAutoUpdateConfig(context.Context, *DeleteClusterAutoUpdateConfigRequest) (*emptypb.Empty, error) - // GetAutoUpdateVersion gets the current autoupdate version singleton. - GetAutoUpdateVersion(context.Context, *GetAutoUpdateVersionRequest) (*AutoUpdateVersion, error) - // UpsertAutoUpdateVersion creates a new AutoUpdateVersion or replaces an existing AutoUpdateVersion. - UpsertAutoUpdateVersion(context.Context, *UpsertAutoUpdateVersionRequest) (*AutoUpdateVersion, error) - // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. - DeleteAutoUpdateVersion(context.Context, *DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) - mustEmbedUnimplementedAutoUpdateServiceServer() +// AutoupdateService provides an API to manage autoupdates. +type AutoupdateServiceServer interface { + // GetAutoupdateConfig gets the current autoupdate config singleton. + GetAutoupdateConfig(context.Context, *GetAutoupdateConfigRequest) (*AutoupdateConfig, error) + // UpsertAutoupdateConfig creates a new AutoupdateConfig or replaces an existing AutoupdateConfig. + UpsertAutoupdateConfig(context.Context, *UpsertAutoupdateConfigRequest) (*AutoupdateConfig, error) + // DeleteAutoupdateConfig hard deletes the specified AutoupdateConfig. + DeleteAutoupdateConfig(context.Context, *DeleteAutoupdateConfigRequest) (*emptypb.Empty, error) + // GetAutoupdateVersion gets the current autoupdate version singleton. + GetAutoupdateVersion(context.Context, *GetAutoupdateVersionRequest) (*AutoupdateVersion, error) + // UpsertAutoupdateVersion creates a new AutoupdateVersion or replaces an existing AutoupdateVersion. + UpsertAutoupdateVersion(context.Context, *UpsertAutoupdateVersionRequest) (*AutoupdateVersion, error) + // DeleteAutoupdateVersion hard deletes the specified AutoupdateVersionRequest. + DeleteAutoupdateVersion(context.Context, *DeleteAutoupdateVersionRequest) (*emptypb.Empty, error) + mustEmbedUnimplementedAutoupdateServiceServer() } -// UnimplementedAutoUpdateServiceServer must be embedded to have +// UnimplementedAutoupdateServiceServer must be embedded to have // forward compatible implementations. // // NOTE: this should be embedded by value instead of pointer to avoid a nil // pointer dereference when methods are called. -type UnimplementedAutoUpdateServiceServer struct{} +type UnimplementedAutoupdateServiceServer struct{} -func (UnimplementedAutoUpdateServiceServer) GetClusterAutoUpdateConfig(context.Context, *GetClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetClusterAutoUpdateConfig not implemented") +func (UnimplementedAutoupdateServiceServer) GetAutoupdateConfig(context.Context, *GetAutoupdateConfigRequest) (*AutoupdateConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAutoupdateConfig not implemented") } -func (UnimplementedAutoUpdateServiceServer) UpsertClusterAutoUpdateConfig(context.Context, *UpsertClusterAutoUpdateConfigRequest) (*ClusterAutoUpdateConfig, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpsertClusterAutoUpdateConfig not implemented") +func (UnimplementedAutoupdateServiceServer) UpsertAutoupdateConfig(context.Context, *UpsertAutoupdateConfigRequest) (*AutoupdateConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpsertAutoupdateConfig not implemented") } -func (UnimplementedAutoUpdateServiceServer) DeleteClusterAutoUpdateConfig(context.Context, *DeleteClusterAutoUpdateConfigRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteClusterAutoUpdateConfig not implemented") +func (UnimplementedAutoupdateServiceServer) DeleteAutoupdateConfig(context.Context, *DeleteAutoupdateConfigRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAutoupdateConfig not implemented") } -func (UnimplementedAutoUpdateServiceServer) GetAutoUpdateVersion(context.Context, *GetAutoUpdateVersionRequest) (*AutoUpdateVersion, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetAutoUpdateVersion not implemented") +func (UnimplementedAutoupdateServiceServer) GetAutoupdateVersion(context.Context, *GetAutoupdateVersionRequest) (*AutoupdateVersion, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAutoupdateVersion not implemented") } -func (UnimplementedAutoUpdateServiceServer) UpsertAutoUpdateVersion(context.Context, *UpsertAutoUpdateVersionRequest) (*AutoUpdateVersion, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpsertAutoUpdateVersion not implemented") +func (UnimplementedAutoupdateServiceServer) UpsertAutoupdateVersion(context.Context, *UpsertAutoupdateVersionRequest) (*AutoupdateVersion, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpsertAutoupdateVersion not implemented") } -func (UnimplementedAutoUpdateServiceServer) DeleteAutoUpdateVersion(context.Context, *DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteAutoUpdateVersion not implemented") +func (UnimplementedAutoupdateServiceServer) DeleteAutoupdateVersion(context.Context, *DeleteAutoupdateVersionRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAutoupdateVersion not implemented") } -func (UnimplementedAutoUpdateServiceServer) mustEmbedUnimplementedAutoUpdateServiceServer() {} -func (UnimplementedAutoUpdateServiceServer) testEmbeddedByValue() {} +func (UnimplementedAutoupdateServiceServer) mustEmbedUnimplementedAutoupdateServiceServer() {} +func (UnimplementedAutoupdateServiceServer) testEmbeddedByValue() {} -// UnsafeAutoUpdateServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to AutoUpdateServiceServer will +// UnsafeAutoupdateServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to AutoupdateServiceServer will // result in compilation errors. -type UnsafeAutoUpdateServiceServer interface { - mustEmbedUnimplementedAutoUpdateServiceServer() +type UnsafeAutoupdateServiceServer interface { + mustEmbedUnimplementedAutoupdateServiceServer() } -func RegisterAutoUpdateServiceServer(s grpc.ServiceRegistrar, srv AutoUpdateServiceServer) { - // If the following call pancis, it indicates UnimplementedAutoUpdateServiceServer was +func RegisterAutoupdateServiceServer(s grpc.ServiceRegistrar, srv AutoupdateServiceServer) { + // If the following call pancis, it indicates UnimplementedAutoupdateServiceServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { t.testEmbeddedByValue() } - s.RegisterService(&AutoUpdateService_ServiceDesc, srv) + s.RegisterService(&AutoupdateService_ServiceDesc, srv) } -func _AutoUpdateService_GetClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetClusterAutoUpdateConfigRequest) +func _AutoupdateService_GetAutoupdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAutoupdateConfigRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AutoUpdateServiceServer).GetClusterAutoUpdateConfig(ctx, in) + return srv.(AutoupdateServiceServer).GetAutoupdateConfig(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AutoUpdateService_GetClusterAutoUpdateConfig_FullMethodName, + FullMethod: AutoupdateService_GetAutoupdateConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AutoUpdateServiceServer).GetClusterAutoUpdateConfig(ctx, req.(*GetClusterAutoUpdateConfigRequest)) + return srv.(AutoupdateServiceServer).GetAutoupdateConfig(ctx, req.(*GetAutoupdateConfigRequest)) } return interceptor(ctx, in, info, handler) } -func _AutoUpdateService_UpsertClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpsertClusterAutoUpdateConfigRequest) +func _AutoupdateService_UpsertAutoupdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpsertAutoupdateConfigRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AutoUpdateServiceServer).UpsertClusterAutoUpdateConfig(ctx, in) + return srv.(AutoupdateServiceServer).UpsertAutoupdateConfig(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AutoUpdateService_UpsertClusterAutoUpdateConfig_FullMethodName, + FullMethod: AutoupdateService_UpsertAutoupdateConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AutoUpdateServiceServer).UpsertClusterAutoUpdateConfig(ctx, req.(*UpsertClusterAutoUpdateConfigRequest)) + return srv.(AutoupdateServiceServer).UpsertAutoupdateConfig(ctx, req.(*UpsertAutoupdateConfigRequest)) } return interceptor(ctx, in, info, handler) } -func _AutoUpdateService_DeleteClusterAutoUpdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteClusterAutoUpdateConfigRequest) +func _AutoupdateService_DeleteAutoupdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAutoupdateConfigRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AutoUpdateServiceServer).DeleteClusterAutoUpdateConfig(ctx, in) + return srv.(AutoupdateServiceServer).DeleteAutoupdateConfig(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AutoUpdateService_DeleteClusterAutoUpdateConfig_FullMethodName, + FullMethod: AutoupdateService_DeleteAutoupdateConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AutoUpdateServiceServer).DeleteClusterAutoUpdateConfig(ctx, req.(*DeleteClusterAutoUpdateConfigRequest)) + return srv.(AutoupdateServiceServer).DeleteAutoupdateConfig(ctx, req.(*DeleteAutoupdateConfigRequest)) } return interceptor(ctx, in, info, handler) } -func _AutoUpdateService_GetAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetAutoUpdateVersionRequest) +func _AutoupdateService_GetAutoupdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAutoupdateVersionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AutoUpdateServiceServer).GetAutoUpdateVersion(ctx, in) + return srv.(AutoupdateServiceServer).GetAutoupdateVersion(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AutoUpdateService_GetAutoUpdateVersion_FullMethodName, + FullMethod: AutoupdateService_GetAutoupdateVersion_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AutoUpdateServiceServer).GetAutoUpdateVersion(ctx, req.(*GetAutoUpdateVersionRequest)) + return srv.(AutoupdateServiceServer).GetAutoupdateVersion(ctx, req.(*GetAutoupdateVersionRequest)) } return interceptor(ctx, in, info, handler) } -func _AutoUpdateService_UpsertAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpsertAutoUpdateVersionRequest) +func _AutoupdateService_UpsertAutoupdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpsertAutoupdateVersionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AutoUpdateServiceServer).UpsertAutoUpdateVersion(ctx, in) + return srv.(AutoupdateServiceServer).UpsertAutoupdateVersion(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName, + FullMethod: AutoupdateService_UpsertAutoupdateVersion_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AutoUpdateServiceServer).UpsertAutoUpdateVersion(ctx, req.(*UpsertAutoUpdateVersionRequest)) + return srv.(AutoupdateServiceServer).UpsertAutoupdateVersion(ctx, req.(*UpsertAutoupdateVersionRequest)) } return interceptor(ctx, in, info, handler) } -func _AutoUpdateService_DeleteAutoUpdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeleteAutoUpdateVersionRequest) +func _AutoupdateService_DeleteAutoupdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAutoupdateVersionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(AutoUpdateServiceServer).DeleteAutoUpdateVersion(ctx, in) + return srv.(AutoupdateServiceServer).DeleteAutoupdateVersion(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName, + FullMethod: AutoupdateService_DeleteAutoupdateVersion_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(AutoUpdateServiceServer).DeleteAutoUpdateVersion(ctx, req.(*DeleteAutoUpdateVersionRequest)) + return srv.(AutoupdateServiceServer).DeleteAutoupdateVersion(ctx, req.(*DeleteAutoupdateVersionRequest)) } return interceptor(ctx, in, info, handler) } -// AutoUpdateService_ServiceDesc is the grpc.ServiceDesc for AutoUpdateService service. +// AutoupdateService_ServiceDesc is the grpc.ServiceDesc for AutoupdateService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) -var AutoUpdateService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "teleport.autoupdate.v1.AutoUpdateService", - HandlerType: (*AutoUpdateServiceServer)(nil), +var AutoupdateService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "teleport.autoupdate.v1.AutoupdateService", + HandlerType: (*AutoupdateServiceServer)(nil), Methods: []grpc.MethodDesc{ { - MethodName: "GetClusterAutoUpdateConfig", - Handler: _AutoUpdateService_GetClusterAutoUpdateConfig_Handler, + MethodName: "GetAutoupdateConfig", + Handler: _AutoupdateService_GetAutoupdateConfig_Handler, }, { - MethodName: "UpsertClusterAutoUpdateConfig", - Handler: _AutoUpdateService_UpsertClusterAutoUpdateConfig_Handler, + MethodName: "UpsertAutoupdateConfig", + Handler: _AutoupdateService_UpsertAutoupdateConfig_Handler, }, { - MethodName: "DeleteClusterAutoUpdateConfig", - Handler: _AutoUpdateService_DeleteClusterAutoUpdateConfig_Handler, + MethodName: "DeleteAutoupdateConfig", + Handler: _AutoupdateService_DeleteAutoupdateConfig_Handler, }, { - MethodName: "GetAutoUpdateVersion", - Handler: _AutoUpdateService_GetAutoUpdateVersion_Handler, + MethodName: "GetAutoupdateVersion", + Handler: _AutoupdateService_GetAutoupdateVersion_Handler, }, { - MethodName: "UpsertAutoUpdateVersion", - Handler: _AutoUpdateService_UpsertAutoUpdateVersion_Handler, + MethodName: "UpsertAutoupdateVersion", + Handler: _AutoupdateService_UpsertAutoupdateVersion_Handler, }, { - MethodName: "DeleteAutoUpdateVersion", - Handler: _AutoUpdateService_DeleteAutoUpdateVersion_Handler, + MethodName: "DeleteAutoupdateVersion", + Handler: _AutoupdateService_DeleteAutoupdateVersion_Handler, }, }, Streams: []grpc.StreamDesc{}, diff --git a/api/proto/teleport/autoupdate/v1/autoupdate.proto b/api/proto/teleport/autoupdate/v1/autoupdate.proto index fc6ea3c02cede..cce99cc2e3556 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate.proto @@ -20,36 +20,36 @@ import "teleport/header/v1/metadata.proto"; option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1;autoupdate"; -// ClusterAutoupdateConfigV1 is a config singleton used to configure cluster +// AutoupdateConfig is a config singleton used to configure cluster // autoupdate settings. -message ClusterAutoUpdateConfig { +message AutoupdateConfig { string kind = 1; string sub_kind = 2; string version = 3; teleport.header.v1.Metadata metadata = 4; - ClusterAutoUpdateConfigSpec spec = 5; + AutoupdateConfigSpec spec = 5; } -// ClusterAutoupdateConfigSpecV1 encodes the parameters of the autoupdate config object. -message ClusterAutoUpdateConfigSpec { +// AutoupdateConfigSpec encodes the parameters of the autoupdate config object. +message AutoupdateConfigSpec { // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - string tools_auto_update = 1; + bool tools_auto_update = 1; } -// AutoupdateVersionV1 is a resource singleton with version required for +// AutoupdateVersion is a resource singleton with version required for // tools autoupdate. -message AutoUpdateVersion { +message AutoupdateVersion { string kind = 1; string sub_kind = 2; string version = 3; teleport.header.v1.Metadata metadata = 4; - AutoUpdateVersionSpec spec = 5; + AutoupdateVersionSpec spec = 5; } -// AutoupdateVersionSpecV1 encodes the parameters of the autoupdate versions. -message AutoUpdateVersionSpec { +// AutoupdateVersionSpec encodes the parameters of the autoupdate versions. +message AutoupdateVersionSpec { // ToolsVersion is the semantic version required for tools autoupdates. string tools_version = 1; } diff --git a/api/proto/teleport/autoupdate/v1/autoupdate_service.proto b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto index d2ccfc61f9dd0..c400c31cdc193 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate_service.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto @@ -21,45 +21,45 @@ import "teleport/autoupdate/v1/autoupdate.proto"; option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1;autoupdate"; -// AutoUpdateService provides an API to manage autoupdates. -service AutoUpdateService { - // GetClusterAutoUpdateConfig gets the current autoupdate config singleton. - rpc GetClusterAutoUpdateConfig(GetClusterAutoUpdateConfigRequest) returns (ClusterAutoUpdateConfig); +// AutoupdateService provides an API to manage autoupdates. +service AutoupdateService { + // GetAutoupdateConfig gets the current autoupdate config singleton. + rpc GetAutoupdateConfig(GetAutoupdateConfigRequest) returns (AutoupdateConfig); - // UpsertClusterAutoUpdateConfig creates a new ClusterAutoUpdateConfig or replaces an existing ClusterAutoUpdateConfig. - rpc UpsertClusterAutoUpdateConfig(UpsertClusterAutoUpdateConfigRequest) returns (ClusterAutoUpdateConfig); + // UpsertAutoupdateConfig creates a new AutoupdateConfig or replaces an existing AutoupdateConfig. + rpc UpsertAutoupdateConfig(UpsertAutoupdateConfigRequest) returns (AutoupdateConfig); - // DeleteClusterAutoUpdateConfig hard deletes the specified ClusterAutoUpdateConfig. - rpc DeleteClusterAutoUpdateConfig(DeleteClusterAutoUpdateConfigRequest) returns (google.protobuf.Empty); + // DeleteAutoupdateConfig hard deletes the specified AutoupdateConfig. + rpc DeleteAutoupdateConfig(DeleteAutoupdateConfigRequest) returns (google.protobuf.Empty); - // GetAutoUpdateVersion gets the current autoupdate version singleton. - rpc GetAutoUpdateVersion(GetAutoUpdateVersionRequest) returns (AutoUpdateVersion); + // GetAutoupdateVersion gets the current autoupdate version singleton. + rpc GetAutoupdateVersion(GetAutoupdateVersionRequest) returns (AutoupdateVersion); - // UpsertAutoUpdateVersion creates a new AutoUpdateVersion or replaces an existing AutoUpdateVersion. - rpc UpsertAutoUpdateVersion(UpsertAutoUpdateVersionRequest) returns (AutoUpdateVersion); + // UpsertAutoupdateVersion creates a new AutoupdateVersion or replaces an existing AutoupdateVersion. + rpc UpsertAutoupdateVersion(UpsertAutoupdateVersionRequest) returns (AutoupdateVersion); - // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. - rpc DeleteAutoUpdateVersion(DeleteAutoUpdateVersionRequest) returns (google.protobuf.Empty); + // DeleteAutoupdateVersion hard deletes the specified AutoupdateVersionRequest. + rpc DeleteAutoupdateVersion(DeleteAutoupdateVersionRequest) returns (google.protobuf.Empty); } -// Request for GetClusterAutoUpdateConfig. -message GetClusterAutoUpdateConfigRequest {} +// Request for GetAutoupdateConfig. +message GetAutoupdateConfigRequest {} -// Request for UpsertClusterAutoUpdateConfig. -message UpsertClusterAutoUpdateConfigRequest { - ClusterAutoUpdateConfig config = 1; +// Request for UpsertAutoupdateConfig. +message UpsertAutoupdateConfigRequest { + AutoupdateConfig config = 1; } -// Request for DeleteClusterAutoUpdateConfig. -message DeleteClusterAutoUpdateConfigRequest {} +// Request for DeleteAutoupdateConfig. +message DeleteAutoupdateConfigRequest {} -// Request for GetAutoUpdateVersion. -message GetAutoUpdateVersionRequest {} +// Request for GetAutoupdateVersion. +message GetAutoupdateVersionRequest {} -// Request for UpsertAutoUpdateVersion. -message UpsertAutoUpdateVersionRequest { - AutoUpdateVersion version = 1; +// Request for UpsertAutoupdateVersion. +message UpsertAutoupdateVersionRequest { + AutoupdateVersion version = 1; } -// Request for DeleteAutoUpdateVersion. -message DeleteAutoUpdateVersionRequest {} +// Request for DeleteAutoupdateVersion. +message DeleteAutoupdateVersionRequest {} diff --git a/api/proto/teleport/legacy/client/proto/event.proto b/api/proto/teleport/legacy/client/proto/event.proto index 7d481265e76af..20ad652721b10 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -178,9 +178,9 @@ message Event { teleport.machineid.v1.SPIFFEFederation SPIFFEFederation = 62; // StaticHostUser is a resource for static host users. teleport.userprovisioning.v1.StaticHostUser StaticHostUser = 63; - // ClusterAutoUpdateConfig is a resource for cluster autoupdate config. - teleport.autoupdate.v1.ClusterAutoUpdateConfig ClusterAutoUpdateConfig = 64; - // AutoUpdateVersion is a resource for autoupdate version. - teleport.autoupdate.v1.AutoUpdateVersion AutoUpdateVersion = 65; + // AutoupdateConfig is a resource for cluster autoupdate config. + teleport.autoupdate.v1.AutoupdateConfig AutoupdateConfig = 64; + // AutoupdateVersion is a resource for autoupdate version. + teleport.autoupdate.v1.AutoupdateVersion AutoupdateVersion = 65; } } diff --git a/api/types/autoupdate/config.go b/api/types/autoupdate/config.go index 491b502a1c1b9..e056aa5b5cf2a 100644 --- a/api/types/autoupdate/config.go +++ b/api/types/autoupdate/config.go @@ -26,28 +26,28 @@ import ( "github.com/gravitational/teleport/api/types" ) -// NewClusterAutoUpdateConfig creates a new cluster autoupdate configuration resource. -func NewClusterAutoUpdateConfig(spec *autoupdate.ClusterAutoUpdateConfigSpec) (*autoupdate.ClusterAutoUpdateConfig, error) { - config := &autoupdate.ClusterAutoUpdateConfig{ - Kind: types.KindClusterAutoUpdateConfig, +// NewAutoupdateConfig creates a new cluster autoupdate configuration resource. +func NewAutoupdateConfig(spec *autoupdate.AutoupdateConfigSpec) (*autoupdate.AutoupdateConfig, error) { + config := &autoupdate.AutoupdateConfig{ + Kind: types.KindAutoupdateConfig, Version: types.V1, Metadata: &headerv1.Metadata{ - Name: types.MetaNameClusterAutoUpdateConfig, + Name: types.MetaNameAutoupdateConfig, }, Spec: spec, } - if err := ValidateClusterAutoUpdateConfig(config); err != nil { + if err := ValidateAutoupdateConfig(config); err != nil { return nil, trace.Wrap(err) } return config, nil } -// ValidateClusterAutoUpdateConfig checks that required parameters are set -// for the specified ClusterAutoUpdateConfig. -func ValidateClusterAutoUpdateConfig(c *autoupdate.ClusterAutoUpdateConfig) error { +// ValidateAutoupdateConfig checks that required parameters are set +// for the specified AutoupdateConfig. +func ValidateAutoupdateConfig(c *autoupdate.AutoupdateConfig) error { if c == nil { - return trace.BadParameter("ClusterAutoUpdateConfig is nil") + return trace.BadParameter("AutoupdateConfig is nil") } if c.Metadata == nil { return trace.BadParameter("Metadata is nil") diff --git a/api/types/autoupdate/version.go b/api/types/autoupdate/version.go index 430c1bdeb795a..5a9b087a9f432 100644 --- a/api/types/autoupdate/version.go +++ b/api/types/autoupdate/version.go @@ -26,28 +26,28 @@ import ( "github.com/gravitational/teleport/api/types" ) -// NewAutoUpdateVersion creates a new autoupdate version resource. -func NewAutoUpdateVersion(spec *autoupdate.AutoUpdateVersionSpec) (*autoupdate.AutoUpdateVersion, error) { - version := &autoupdate.AutoUpdateVersion{ - Kind: types.KindAutoUpdateVersion, +// NewAutoupdateVersion creates a new autoupdate version resource. +func NewAutoupdateVersion(spec *autoupdate.AutoupdateVersionSpec) (*autoupdate.AutoupdateVersion, error) { + version := &autoupdate.AutoupdateVersion{ + Kind: types.KindAutoupdateVersion, Version: types.V1, Metadata: &headerv1.Metadata{ - Name: types.MetaNameAutoUpdateVersion, + Name: types.MetaNameAutoupdateVersion, }, Spec: spec, } - if err := ValidateAutoUpdateVersion(version); err != nil { + if err := ValidateAutoupdateVersion(version); err != nil { return nil, trace.Wrap(err) } return version, nil } -// ValidateAutoUpdateVersion checks that required parameters are set -// for the specified AutoUpdateVersion. -func ValidateAutoUpdateVersion(v *autoupdate.AutoUpdateVersion) error { +// ValidateAutoupdateVersion checks that required parameters are set +// for the specified AutoupdateVersion. +func ValidateAutoupdateVersion(v *autoupdate.AutoupdateVersion) error { if v == nil { - return trace.BadParameter("AutoUpdateVersion is nil") + return trace.BadParameter("AutoupdateVersion is nil") } if v.Metadata == nil { return trace.BadParameter("Metadata is nil") diff --git a/api/types/constants.go b/api/types/constants.go index 9d23c5a84a5b2..52ee78edcf48d 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -320,17 +320,17 @@ const ( // alternative to their individual resource kinds. KindClusterConfig = "cluster_config" - // KindClusterAutoUpdateConfig is the resource with cluster autoupdate configuration. - KindClusterAutoUpdateConfig = "cluster_autoupdate_config" + // KindAutoupdateConfig is the resource with cluster autoupdate configuration. + KindAutoupdateConfig = "cluster_autoupdate_config" - // KindAutoUpdateVersion is the resource with cluster autoupdate versions. - KindAutoUpdateVersion = "autoupdate_version" + // KindAutoupdateVersion is the resource with autoupdate versions. + KindAutoupdateVersion = "autoupdate_version" - // MetaNameClusterAutoUpdateConfig is the name of a configuration resource for cluster autoupdate config. - MetaNameClusterAutoUpdateConfig = "cluster-autoupdate-config" + // MetaNameAutoupdateConfig is the name of a configuration resource for autoupdate config. + MetaNameAutoupdateConfig = "autoupdate-config" - // MetaNameAutoUpdateVersion is the name of a resource for autoupdate version. - MetaNameAutoUpdateVersion = "autoupdate-version" + // MetaNameAutoupdateVersion is the name of a resource for autoupdate version. + MetaNameAutoupdateVersion = "autoupdate-version" // KindClusterAuditConfig is the resource that holds cluster audit configuration. KindClusterAuditConfig = "cluster_audit_config" diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index 283d097da29a5..b7e805ca584b2 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -103,7 +103,7 @@ type Config struct { WebSession types.WebSessionInterface WebToken types.WebTokenInterface WindowsDesktops services.WindowsDesktops - AutoUpdateService services.AutoUpdateService + AutoupdateService services.AutoupdateService } func (c *Config) CheckAndSetDefaults() error { @@ -168,7 +168,7 @@ func NewCache(cfg Config) (*cache.Cache, error) { AppSession: cfg.AppSession, Apps: cfg.Apps, ClusterConfig: cfg.ClusterConfig, - AutoUpdateService: cfg.AutoUpdateService, + AutoupdateService: cfg.AutoupdateService, CrownJewels: cfg.CrownJewels, DatabaseObjects: cfg.DatabaseObjects, DatabaseServices: cfg.DatabaseServices, diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 699bcfe1efc41..ac1cce5bf5850 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -199,8 +199,8 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { } cfg.ClusterConfiguration = clusterConfig } - if cfg.AutoUpdateService == nil { - cfg.AutoUpdateService, err = local.NewClusterAutoUpdateService(cfg.Backend) + if cfg.AutoupdateService == nil { + cfg.AutoupdateService, err = local.NewAutoupdateService(cfg.Backend) if err != nil { return nil, trace.Wrap(err) } @@ -417,7 +417,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { Access: cfg.Access, DynamicAccessExt: cfg.DynamicAccessExt, ClusterConfiguration: cfg.ClusterConfiguration, - AutoUpdateService: cfg.AutoUpdateService, + AutoupdateService: cfg.AutoupdateService, Restrictions: cfg.Restrictions, Apps: cfg.Apps, Kubernetes: cfg.Kubernetes, @@ -647,7 +647,7 @@ type Services struct { services.DevicesGetter services.SPIFFEFederations services.StaticHostUser - services.AutoUpdateService + services.AutoupdateService } // GetWebSession returns existing web session described by req. diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 7f81a88c34c18..88410e50d5c31 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -308,11 +308,11 @@ type ReadProxyAccessPoint interface { // GetUserGroup returns the specified user group resources. GetUserGroup(ctx context.Context, name string) (types.UserGroup, error) - // GetClusterAutoUpdateConfig gets the cluster autoupdate config from the backend. - GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) + // GetAutoupdateConfig gets the cluster autoupdate config from the backend. + GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) - // GetAutoUpdateVersion gets the autoupdate version from the backend. - GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) + // GetAutoupdateVersion gets the autoupdate version from the backend. + GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) } // SnowflakeSessionWatcher is watcher interface used by Snowflake web session watcher. diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index f44403e381efc..6f05786059f45 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -360,41 +360,41 @@ func (c *Client) SearchSessionEvents(ctx context.Context, req events.SearchSessi return events, lastKey, nil } -// UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. -func (c *Client) UpsertClusterAutoUpdateConfig(ctx context.Context, config *autoupdate.ClusterAutoUpdateConfig) (*autoupdate.ClusterAutoUpdateConfig, error) { +// UpsertAutoupdateConfig sets cluster autoupdate configuration. +func (c *Client) UpsertAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) { return nil, trace.NotImplemented(notImplementedMessage) } -// GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. -func (c *Client) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { - config, err := c.APIClient.GetClusterAutoUpdateConfig(ctx) +// GetAutoupdateConfig gets the autoupdate configuration from the backend. +func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { + config, err := c.APIClient.GetAutoupdateConfig(ctx) if err != nil { return nil, trace.Wrap(err) } return config, nil } -// DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. -func (c *Client) DeleteAutoUpdateVersion(ctx context.Context) error { +// DeleteAutoupdateVersion deletes types.AutoupdateVersion from the backend. +func (c *Client) DeleteAutoupdateVersion(ctx context.Context) error { return trace.NotImplemented(notImplementedMessage) } -// UpsertAutoUpdateVersion sets cluster autoupdate version. -func (c *Client) UpsertAutoUpdateVersion(ctx context.Context, config *autoupdate.AutoUpdateVersion) (*autoupdate.AutoUpdateVersion, error) { +// UpsertAutoupdateVersion sets cluster autoupdate version. +func (c *Client) UpsertAutoupdateVersion(ctx context.Context, config *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { return nil, trace.NotImplemented(notImplementedMessage) } -// GetAutoUpdateVersion gets the autoupdate version from the backend. -func (c *Client) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { - config, err := c.APIClient.GetAutoUpdateVersion(ctx) +// GetAutoupdateVersion gets the autoupdate version from the backend. +func (c *Client) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { + config, err := c.APIClient.GetAutoupdateVersion(ctx) if err != nil { return nil, trace.Wrap(err) } return config, nil } -// DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. -func (c *Client) DeleteClusterAutoUpdateConfig(ctx context.Context) error { +// DeleteAutoupdateConfig deletes types.AutoupdateConfig from the backend. +func (c *Client) DeleteAutoupdateConfig(ctx context.Context) error { return trace.NotImplemented(notImplementedMessage) } @@ -1539,7 +1539,7 @@ type ClientI interface { WebService services.Status services.ClusterConfiguration - services.AutoUpdateService + services.AutoupdateService services.SessionTrackerService services.ConnectionsDiagnostic services.SAMLIdPSession @@ -1792,8 +1792,8 @@ type ClientI interface { // will return "not implemented" errors (as per the default gRPC behavior). StaticHostUserClient() services.StaticHostUser - // AutoUpdateServiceClient returns a AutoUpdate service client. - AutoUpdateServiceClient() autoupdate.AutoUpdateServiceClient + // AutoupdateServiceClient returns a Autoupdate service client. + AutoupdateServiceClient() autoupdate.AutoupdateServiceClient // CloneHTTPClient creates a new HTTP client with the same configuration. CloneHTTPClient(params ...roundtrip.ClientParam) (*HTTPClient, error) diff --git a/lib/auth/autoupdate/v1/service.go b/lib/auth/autoupdate/v1/service.go index ed8680f60449c..625e484c6682b 100644 --- a/lib/auth/autoupdate/v1/service.go +++ b/lib/auth/autoupdate/v1/service.go @@ -30,26 +30,26 @@ import ( "github.com/gravitational/teleport/lib/services" ) -// Service implements the gRPC API layer for the AutoUpdate. +// Service implements the gRPC API layer for the Autoupdate. type Service struct { // Opting out of forward compatibility, this service must implement all service methods. - autoupdate.UnsafeAutoUpdateServiceServer + autoupdate.UnsafeAutoupdateServiceServer - storage services.AutoUpdateService + storage services.AutoupdateService authorizer authz.Authorizer } -// NewService returns a new AutoUpdate API service using the given storage layer and authorizer. -func NewService(storage services.AutoUpdateService, authorizer authz.Authorizer) *Service { +// NewService returns a new Autoupdate API service using the given storage layer and authorizer. +func NewService(storage services.AutoupdateService, authorizer authz.Authorizer) *Service { return &Service{ storage: storage, authorizer: authorizer, } } -// GetClusterAutoUpdateConfig gets the current autoupdate config singleton. -func (s *Service) GetClusterAutoUpdateConfig(ctx context.Context, req *autoupdate.GetClusterAutoUpdateConfigRequest) (*autoupdate.ClusterAutoUpdateConfig, error) { - config, err := s.storage.GetClusterAutoUpdateConfig(ctx) +// GetAutoupdateConfig gets the current autoupdate config singleton. +func (s *Service) GetAutoupdateConfig(ctx context.Context, req *autoupdate.GetAutoupdateConfigRequest) (*autoupdate.AutoupdateConfig, error) { + config, err := s.storage.GetAutoupdateConfig(ctx) if err != nil { return nil, trace.Wrap(err) } @@ -57,14 +57,14 @@ func (s *Service) GetClusterAutoUpdateConfig(ctx context.Context, req *autoupdat return config, nil } -// UpsertClusterAutoUpdateConfig updates or creates autoupdate config singleton. -func (s *Service) UpsertClusterAutoUpdateConfig(ctx context.Context, req *autoupdate.UpsertClusterAutoUpdateConfigRequest) (*autoupdate.ClusterAutoUpdateConfig, error) { +// UpsertAutoupdateConfig updates or creates autoupdate config singleton. +func (s *Service) UpsertAutoupdateConfig(ctx context.Context, req *autoupdate.UpsertAutoupdateConfigRequest) (*autoupdate.AutoupdateConfig, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { return nil, trace.Wrap(err) } - if err := authCtx.CheckAccessToKind(types.KindClusterAutoUpdateConfig, types.VerbCreate, types.VerbUpdate); err != nil { + if err := authCtx.CheckAccessToKind(types.KindAutoupdateConfig, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -72,18 +72,18 @@ func (s *Service) UpsertClusterAutoUpdateConfig(ctx context.Context, req *autoup return nil, trace.Wrap(err) } - config, err := s.storage.UpsertClusterAutoUpdateConfig(ctx, req.Config) + config, err := s.storage.UpsertAutoupdateConfig(ctx, req.Config) return config, trace.Wrap(err) } -// DeleteClusterAutoUpdateConfig deletes autoupdate config singleton. -func (s *Service) DeleteClusterAutoUpdateConfig(ctx context.Context, req *autoupdate.DeleteClusterAutoUpdateConfigRequest) (*emptypb.Empty, error) { +// DeleteAutoupdateConfig deletes autoupdate config singleton. +func (s *Service) DeleteAutoupdateConfig(ctx context.Context, req *autoupdate.DeleteAutoupdateConfigRequest) (*emptypb.Empty, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { return nil, trace.Wrap(err) } - if err := authCtx.CheckAccessToKind(types.KindClusterAutoUpdateConfig, types.VerbDelete); err != nil { + if err := authCtx.CheckAccessToKind(types.KindAutoupdateConfig, types.VerbDelete); err != nil { return nil, trace.Wrap(err) } @@ -91,15 +91,15 @@ func (s *Service) DeleteClusterAutoUpdateConfig(ctx context.Context, req *autoup return nil, trace.Wrap(err) } - if err := s.storage.DeleteClusterAutoUpdateConfig(ctx); err != nil { + if err := s.storage.DeleteAutoupdateConfig(ctx); err != nil { return nil, trace.Wrap(err) } return &emptypb.Empty{}, nil } -// GetAutoUpdateVersion gets the current autoupdate version singleton. -func (s *Service) GetAutoUpdateVersion(ctx context.Context, req *autoupdate.GetAutoUpdateVersionRequest) (*autoupdate.AutoUpdateVersion, error) { - version, err := s.storage.GetAutoUpdateVersion(ctx) +// GetAutoupdateVersion gets the current autoupdate version singleton. +func (s *Service) GetAutoupdateVersion(ctx context.Context, req *autoupdate.GetAutoupdateVersionRequest) (*autoupdate.AutoupdateVersion, error) { + version, err := s.storage.GetAutoupdateVersion(ctx) if err != nil { return nil, trace.Wrap(err) } @@ -107,14 +107,14 @@ func (s *Service) GetAutoUpdateVersion(ctx context.Context, req *autoupdate.GetA return version, nil } -// UpsertAutoUpdateVersion updates or creates autoupdate version singleton. -func (s *Service) UpsertAutoUpdateVersion(ctx context.Context, req *autoupdate.UpsertAutoUpdateVersionRequest) (*autoupdate.AutoUpdateVersion, error) { +// UpsertAutoupdateVersion updates or creates autoupdate version singleton. +func (s *Service) UpsertAutoupdateVersion(ctx context.Context, req *autoupdate.UpsertAutoupdateVersionRequest) (*autoupdate.AutoupdateVersion, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { return nil, trace.Wrap(err) } - if err := authCtx.CheckAccessToKind(types.KindAutoUpdateVersion, types.VerbCreate, types.VerbUpdate); err != nil { + if err := authCtx.CheckAccessToKind(types.KindAutoupdateVersion, types.VerbCreate, types.VerbUpdate); err != nil { return nil, trace.Wrap(err) } @@ -122,18 +122,18 @@ func (s *Service) UpsertAutoUpdateVersion(ctx context.Context, req *autoupdate.U return nil, trace.Wrap(err) } - autoUpdateVersion, err := s.storage.UpsertAutoUpdateVersion(ctx, req.Version) - return autoUpdateVersion, trace.Wrap(err) + autoupdateVersion, err := s.storage.UpsertAutoupdateVersion(ctx, req.Version) + return autoupdateVersion, trace.Wrap(err) } -// DeleteAutoUpdateVersion deletes autoupdate version singleton. -func (s *Service) DeleteAutoUpdateVersion(ctx context.Context, req *autoupdate.DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) { +// DeleteAutoupdateVersion deletes autoupdate version singleton. +func (s *Service) DeleteAutoupdateVersion(ctx context.Context, req *autoupdate.DeleteAutoupdateVersionRequest) (*emptypb.Empty, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { return nil, trace.Wrap(err) } - if err := authCtx.CheckAccessToKind(types.KindAutoUpdateVersion, types.VerbDelete); err != nil { + if err := authCtx.CheckAccessToKind(types.KindAutoupdateVersion, types.VerbDelete); err != nil { return nil, trace.Wrap(err) } @@ -141,7 +141,7 @@ func (s *Service) DeleteAutoUpdateVersion(ctx context.Context, req *autoupdate.D return nil, trace.Wrap(err) } - if err := s.storage.DeleteAutoUpdateVersion(ctx); err != nil { + if err := s.storage.DeleteAutoupdateVersion(ctx); err != nil { return nil, trace.Wrap(err) } return &emptypb.Empty{}, nil diff --git a/lib/auth/autoupdate/v1/service_test.go b/lib/auth/autoupdate/v1/service_test.go index 54999593bfd1d..a9ebe56af0bd3 100644 --- a/lib/auth/autoupdate/v1/service_test.go +++ b/lib/auth/autoupdate/v1/service_test.go @@ -19,7 +19,6 @@ package autoupd import ( "context" "fmt" - "github.com/gravitational/teleport/lib/utils" "slices" "testing" @@ -32,6 +31,7 @@ import ( "github.com/gravitational/teleport/lib/backend/memory" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/services/local" + "github.com/gravitational/teleport/lib/utils" ) var allAdminStates = map[authz.AdminActionAuthState]string{ @@ -63,7 +63,7 @@ func otherAdminStates(states []authz.AdminActionAuthState) []authz.AdminActionAu // callMethod calls a method with given name in the DatabaseObjectService service func callMethod(t *testing.T, service *Service, method string) error { - for _, desc := range autoupdate.AutoUpdateService_ServiceDesc.Methods { + for _, desc := range autoupdate.AutoupdateService_ServiceDesc.Methods { if desc.MethodName == method { _, err := desc.Handler(service, context.Background(), func(_ any) error { return nil }, nil) return err @@ -83,7 +83,7 @@ func TestServiceAccess(t *testing.T) { disallowedStates []authz.AdminActionAuthState }{ { - name: "UpsertClusterAutoUpdateConfig", + name: "UpsertAutoupdateConfig", allowedStates: []authz.AdminActionAuthState{ authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified, @@ -92,19 +92,19 @@ func TestServiceAccess(t *testing.T) { allowedVerbs: []string{types.VerbUpdate, types.VerbCreate}, }, { - name: "GetClusterAutoUpdateConfig", + name: "GetAutoupdateConfig", allowedStates: []authz.AdminActionAuthState{}, disallowedStates: []authz.AdminActionAuthState{}, allowedVerbs: []string{types.VerbRead}, }, { - name: "DeleteClusterAutoUpdateConfig", + name: "DeleteAutoupdateConfig", allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, allowedVerbs: []string{types.VerbDelete}, }, // Autoupdate version check. { - name: "UpsertAutoUpdateVersion", + name: "UpsertAutoupdateVersion", allowedStates: []authz.AdminActionAuthState{ authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified, @@ -113,13 +113,13 @@ func TestServiceAccess(t *testing.T) { allowedVerbs: []string{types.VerbUpdate, types.VerbCreate}, }, { - name: "GetAutoUpdateVersion", + name: "GetAutoupdateVersion", allowedStates: []authz.AdminActionAuthState{}, disallowedStates: []authz.AdminActionAuthState{}, allowedVerbs: []string{types.VerbRead}, }, { - name: "DeleteAutoUpdateVersion", + name: "DeleteAutoupdateVersion", allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, allowedVerbs: []string{types.VerbDelete}, }, @@ -168,7 +168,7 @@ func TestServiceAccess(t *testing.T) { // verify that all declared methods have matching test cases t.Run("verify coverage", func(t *testing.T) { - for _, method := range autoupdate.AutoUpdateService_ServiceDesc.Methods { + for _, method := range autoupdate.AutoupdateService_ServiceDesc.Methods { t.Run(method.MethodName, func(t *testing.T) { match := false for _, testCase := range testCases { @@ -186,7 +186,7 @@ type fakeChecker struct { } func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resource string, verb string) error { - if resource == types.KindClusterAutoUpdateConfig || resource == types.KindAutoUpdateVersion { + if resource == types.KindAutoupdateConfig || resource == types.KindAutoupdateVersion { for _, allowedVerb := range f.allowedVerbs { if allowedVerb == verb { return nil @@ -203,13 +203,13 @@ func newService(t *testing.T, authState authz.AdminActionAuthState, checker serv bk, err := memory.New(memory.Config{}) require.NoError(t, err) - storage, err := local.NewClusterAutoUpdateService(bk) + storage, err := local.NewAutoupdateService(bk) require.NoError(t, err) return newServiceWithStorage(t, authState, checker, storage) } -func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker, storage services.AutoUpdateService) *Service { +func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker, storage services.AutoupdateService) *Service { t.Helper() authorizer := authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 99faab91e38e3..9fb748ee9d124 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5423,12 +5423,12 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { } userprovisioningpb.RegisterStaticHostUsersServiceServer(server, staticHostUserServer) - autoUpdateStorage, err := local.NewClusterAutoUpdateService(cfg.AuthServer.bk) + autoupdateStorage, err := local.NewAutoupdateService(cfg.AuthServer.bk) if err != nil { return nil, trace.Wrap(err) } - autoUpdateServiceServer := autoupd.NewService(autoUpdateStorage, cfg.Authorizer) - autoupdate.RegisterAutoUpdateServiceServer(server, autoUpdateServiceServer) + autoupdateServiceServer := autoupd.NewService(autoupdateStorage, cfg.Authorizer) + autoupdate.RegisterAutoupdateServiceServer(server, autoupdateServiceServer) // Only register the service if this is an open source build. Enterprise builds // register the actual service via an auth plugin, if we register here then all diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 49ef60fe16914..a4d580af61936 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -324,7 +324,7 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { AppSession: svces.Identity, Apps: svces.Apps, ClusterConfig: svces.ClusterConfiguration, - AutoUpdateService: svces.AutoUpdateService, + AutoupdateService: svces.AutoupdateService, CrownJewels: svces.CrownJewels, DatabaseObjects: svces.DatabaseObjects, DatabaseServices: svces.DatabaseServices, diff --git a/lib/auth/init.go b/lib/auth/init.go index e9e1fbeffc6e1..1a06b056b1eb7 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -158,8 +158,8 @@ type InitConfig struct { // ClusterConfiguration is a services that holds cluster wide configuration. ClusterConfiguration services.ClusterConfiguration - // AutoUpdateService is a service of autoupdate configuration and version. - AutoUpdateService services.AutoUpdateService + // AutoupdateService is a service of autoupdate configuration and version. + AutoupdateService services.AutoupdateService // Restrictions is a service to access network restrictions, etc Restrictions services.Restrictions diff --git a/lib/authz/permissions.go b/lib/authz/permissions.go index 38ae2b304126c..2b13e7c0cc7ae 100644 --- a/lib/authz/permissions.go +++ b/lib/authz/permissions.go @@ -913,8 +913,8 @@ func roleSpecForProxy(clusterName string) types.RoleSpecV6 { types.NewRule(types.KindSAMLIdPServiceProvider, services.RO()), types.NewRule(types.KindUserGroup, services.RO()), types.NewRule(types.KindClusterMaintenanceConfig, services.RO()), - types.NewRule(types.KindClusterAutoUpdateConfig, services.RO()), - types.NewRule(types.KindAutoUpdateVersion, services.RO()), + types.NewRule(types.KindAutoupdateConfig, services.RO()), + types.NewRule(types.KindAutoupdateVersion, services.RO()), types.NewRule(types.KindIntegration, append(services.RO(), types.VerbUse)), types.NewRule(types.KindAuditQuery, services.RO()), types.NewRule(types.KindSecurityReport, services.RO()), diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 7bda3c3938484..2f6aaed205303 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -186,8 +186,8 @@ func ForAuth(cfg Config) Config { {Kind: types.KindAccessGraphSettings}, {Kind: types.KindSPIFFEFederation}, {Kind: types.KindStaticHostUser}, - {Kind: types.KindAutoUpdateVersion}, - {Kind: types.KindClusterAutoUpdateConfig}, + {Kind: types.KindAutoupdateVersion}, + {Kind: types.KindAutoupdateConfig}, } cfg.QueueSize = defaults.AuthQueueSize // We don't want to enable partial health for auth cache because auth uses an event stream @@ -240,8 +240,8 @@ func ForProxy(cfg Config) Config { {Kind: types.KindSecurityReport}, {Kind: types.KindSecurityReportState}, {Kind: types.KindKubeWaitingContainer}, - {Kind: types.KindClusterAutoUpdateConfig}, - {Kind: types.KindAutoUpdateVersion}, + {Kind: types.KindAutoupdateConfig}, + {Kind: types.KindAutoupdateVersion}, } cfg.QueueSize = defaults.ProxyQueueSize return cfg @@ -496,7 +496,7 @@ type Cache struct { trustCache services.Trust clusterConfigCache services.ClusterConfiguration - autoUpdateCache services.AutoUpdateService + autoupdateCache services.AutoupdateService provisionerCache services.Provisioner usersCache services.UsersService accessCache services.Access @@ -645,8 +645,8 @@ type Config struct { Trust services.Trust // ClusterConfig is a cluster configuration service ClusterConfig services.ClusterConfiguration - // AutoUpdateService is a cluster autoupdate service - AutoUpdateService services.AutoUpdateService + // AutoupdateService is a cluster autoupdate service + AutoupdateService services.AutoupdateService // Provisioner is a provisioning service Provisioner services.Provisioner // Users is a users service @@ -926,7 +926,7 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } - clusterAutoUpdateCache, err := local.NewClusterAutoUpdateService(config.Backend) + autoupdateCache, err := local.NewAutoupdateService(config.Backend) if err != nil { cancel() return nil, trace.Wrap(err) @@ -970,7 +970,7 @@ func New(config Config) (*Cache, error) { fnCache: fnCache, trustCache: local.NewCAService(config.Backend), clusterConfigCache: clusterConfigCache, - autoUpdateCache: clusterAutoUpdateCache, + autoupdateCache: autoupdateCache, provisionerCache: local.NewProvisioningService(config.Backend), usersCache: local.NewIdentityService(config.Backend), accessCache: local.NewAccessService(config.Backend), @@ -1896,50 +1896,50 @@ func (c *Cache) GetClusterName(opts ...services.MarshalOption) (types.ClusterNam return rg.reader.GetClusterName(opts...) } -// GetClusterAutoUpdateConfig gets the cluster autoupdate config from the backend. -func (c *Cache) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { - ctx, span := c.Tracer.Start(ctx, "cache/GetClusterAutoUpdateConfig") +// GetAutoupdateConfig gets the cluster autoupdate config from the backend. +func (c *Cache) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetAutoupdateConfig") defer span.End() - rg, err := readCollectionCache(c, c.collections.autoUpdateConfigs) + rg, err := readCollectionCache(c, c.collections.autoupdateConfigs) if err != nil { return nil, trace.Wrap(err) } defer rg.Release() if !rg.IsCacheRead() { - cachedConfig, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { - cfg, err := rg.reader.GetClusterAutoUpdateConfig(ctx) + cachedConfig, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { + cfg, err := rg.reader.GetAutoupdateConfig(ctx) return cfg, err }) if err != nil { return nil, trace.Wrap(err) } - return protobuf.Clone(cachedConfig).(*autoupdate.ClusterAutoUpdateConfig), nil + return protobuf.Clone(cachedConfig).(*autoupdate.AutoupdateConfig), nil } - return rg.reader.GetClusterAutoUpdateConfig(ctx) + return rg.reader.GetAutoupdateConfig(ctx) } -// GetAutoUpdateVersion gets the autoupdate version from the backend. -func (c *Cache) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { - ctx, span := c.Tracer.Start(ctx, "cache/GetAutoUpdateVersion") +// GetAutoupdateVersion gets the autoupdate version from the backend. +func (c *Cache) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetAutoupdateVersion") defer span.End() - rg, err := readCollectionCache(c, c.collections.autoUpdateVersions) + rg, err := readCollectionCache(c, c.collections.autoupdateVersions) if err != nil { return nil, trace.Wrap(err) } defer rg.Release() if !rg.IsCacheRead() { - cachedVersion, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { - version, err := rg.reader.GetAutoUpdateVersion(ctx) + cachedVersion, err := utils.FnCacheGet(ctx, c.fnCache, clusterConfigCacheKey{"name"}, func(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { + version, err := rg.reader.GetAutoupdateVersion(ctx) return version, err }) if err != nil { return nil, trace.Wrap(err) } - return protobuf.Clone(cachedVersion).(*autoupdate.AutoUpdateVersion), nil + return protobuf.Clone(cachedVersion).(*autoupdate.AutoupdateVersion), nil } - return rg.reader.GetAutoUpdateVersion(ctx) + return rg.reader.GetAutoupdateVersion(ctx) } func (c *Cache) GetUIConfig(ctx context.Context) (types.UIConfig, error) { diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 8b320255fcdfc..0d965b4cdfde1 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -132,7 +132,7 @@ type testPack struct { databaseObjects services.DatabaseObjects spiffeFederations *local.SPIFFEFederationService staticHostUsers services.StaticHostUser - autoUpdateService services.AutoUpdateService + autoupdateService services.AutoupdateService } // testFuncs are functions to support testing an object in a cache. @@ -361,7 +361,7 @@ func newPackWithoutCache(dir string, opts ...packOption) (*testPack, error) { } p.staticHostUsers = staticHostUserService - p.autoUpdateService, err = local.NewClusterAutoUpdateService(p.backend) + p.autoupdateService, err = local.NewAutoupdateService(p.backend) if err != nil { return nil, trace.Wrap(err) } @@ -416,7 +416,7 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) StaticHostUsers: p.staticHostUsers, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, - AutoUpdateService: p.autoUpdateService, + AutoupdateService: p.autoupdateService, })) if err != nil { return nil, trace.Wrap(err) @@ -821,7 +821,7 @@ func TestCompletenessInit(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, - AutoUpdateService: p.autoUpdateService, + AutoupdateService: p.autoupdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -901,7 +901,7 @@ func TestCompletenessReset(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, - AutoUpdateService: p.autoUpdateService, + AutoupdateService: p.autoupdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -1107,7 +1107,7 @@ func TestListResources_NodesTTLVariant(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, - AutoUpdateService: p.autoUpdateService, + AutoupdateService: p.autoupdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, neverOK: true, // ensure reads are never healthy @@ -1198,7 +1198,7 @@ func initStrategy(t *testing.T) { DatabaseObjects: p.databaseObjects, SPIFFEFederations: p.spiffeFederations, StaticHostUsers: p.staticHostUsers, - AutoUpdateService: p.autoUpdateService, + AutoupdateService: p.autoupdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, })) @@ -3304,8 +3304,8 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindAccessGraphSettings: types.Resource153ToLegacy(newAccessGraphSettings(t)), types.KindSPIFFEFederation: types.Resource153ToLegacy(newSPIFFEFederation("test")), types.KindStaticHostUser: types.Resource153ToLegacy(newStaticHostUser(t, "test")), - types.KindClusterAutoUpdateConfig: types.Resource153ToLegacy(newAutoUpdateConfig(t)), - types.KindAutoUpdateVersion: types.Resource153ToLegacy(newAutoUpdateVersion(t)), + types.KindAutoupdateConfig: types.Resource153ToLegacy(newAutoupdateConfig(t)), + types.KindAutoupdateVersion: types.Resource153ToLegacy(newAutoupdateVersion(t)), } for name, cfg := range cases { @@ -3843,20 +3843,20 @@ func newStaticHostUser(t *testing.T, name string) *userprovisioningpb.StaticHost }) } -func newAutoUpdateConfig(t *testing.T) *autoupdate.ClusterAutoUpdateConfig { +func newAutoupdateConfig(t *testing.T) *autoupdate.AutoupdateConfig { t.Helper() - r, err := update.NewClusterAutoUpdateConfig(&autoupdate.ClusterAutoUpdateConfigSpec{ - ToolsAutoUpdate: "on", + r, err := update.NewAutoupdateConfig(&autoupdate.AutoupdateConfigSpec{ + ToolsAutoUpdate: true, }) require.NoError(t, err) return r } -func newAutoUpdateVersion(t *testing.T) *autoupdate.AutoUpdateVersion { +func newAutoupdateVersion(t *testing.T) *autoupdate.AutoupdateVersion { t.Helper() - r, err := update.NewAutoUpdateVersion(&autoupdate.AutoUpdateVersionSpec{ + r, err := update.NewAutoupdateVersion(&autoupdate.AutoupdateVersionSpec{ ToolsVersion: "1.2.3", }) require.NoError(t, err) diff --git a/lib/cache/collections.go b/lib/cache/collections.go index b3510947bffbc..6670ca2c2dcf4 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -255,8 +255,8 @@ type cacheCollections struct { globalNotifications collectionReader[notificationGetter] accessMonitoringRules collectionReader[accessMonitoringRuleGetter] spiffeFederations collectionReader[SPIFFEFederationReader] - autoUpdateConfigs collectionReader[clusterAutoupdateGetter] - autoUpdateVersions collectionReader[autoUpdateVersionGetter] + autoupdateConfigs collectionReader[autoupdateConfigGetter] + autoupdateVersions collectionReader[autoupdateVersionGetter] } // setupCollections returns a registry of collections. @@ -767,24 +767,24 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e watch: watch, } collections.byKind[resourceKind] = collections.spiffeFederations - case types.KindClusterAutoUpdateConfig: - if c.AutoUpdateService == nil { - return nil, trace.BadParameter("missing parameter AutoUpdateService") + case types.KindAutoupdateConfig: + if c.AutoupdateService == nil { + return nil, trace.BadParameter("missing parameter AutoupdateService") } - collections.autoUpdateConfigs = &genericCollection[*autoupdate.ClusterAutoUpdateConfig, clusterAutoupdateGetter, clusterAutoupdateExecutor]{ + collections.autoupdateConfigs = &genericCollection[*autoupdate.AutoupdateConfig, autoupdateConfigGetter, autoupdateConfigExecutor]{ cache: c, watch: watch, } - collections.byKind[resourceKind] = collections.autoUpdateConfigs - case types.KindAutoUpdateVersion: - if c.AutoUpdateService == nil { - return nil, trace.BadParameter("missing parameter AutoUpdateService") + collections.byKind[resourceKind] = collections.autoupdateConfigs + case types.KindAutoupdateVersion: + if c.AutoupdateService == nil { + return nil, trace.BadParameter("missing parameter AutoupdateService") } - collections.autoUpdateVersions = &genericCollection[*autoupdate.AutoUpdateVersion, autoUpdateVersionGetter, autoUpdateVersionExecutor]{ + collections.autoupdateVersions = &genericCollection[*autoupdate.AutoupdateVersion, autoupdateVersionGetter, autoupdateVersionExecutor]{ cache: c, watch: watch, } - collections.byKind[resourceKind] = collections.autoUpdateVersions + collections.byKind[resourceKind] = collections.autoupdateVersions default: return nil, trace.BadParameter("resource %q is not supported", watch.Kind) } @@ -1290,75 +1290,75 @@ type clusterNameGetter interface { GetClusterName(opts ...services.MarshalOption) (types.ClusterName, error) } -type clusterAutoupdateExecutor struct{} +type autoupdateConfigExecutor struct{} -func (clusterAutoupdateExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*autoupdate.ClusterAutoUpdateConfig, error) { - config, err := cache.AutoUpdateService.GetClusterAutoUpdateConfig(ctx) - return []*autoupdate.ClusterAutoUpdateConfig{config}, trace.Wrap(err) +func (autoupdateConfigExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*autoupdate.AutoupdateConfig, error) { + config, err := cache.AutoupdateService.GetAutoupdateConfig(ctx) + return []*autoupdate.AutoupdateConfig{config}, trace.Wrap(err) } -func (clusterAutoupdateExecutor) upsert(ctx context.Context, cache *Cache, resource *autoupdate.ClusterAutoUpdateConfig) error { - _, err := cache.autoUpdateCache.UpsertClusterAutoUpdateConfig(ctx, resource) +func (autoupdateConfigExecutor) upsert(ctx context.Context, cache *Cache, resource *autoupdate.AutoupdateConfig) error { + _, err := cache.autoupdateCache.UpsertAutoupdateConfig(ctx, resource) return trace.Wrap(err) } -func (clusterAutoupdateExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return cache.autoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) +func (autoupdateConfigExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.autoupdateCache.DeleteAutoupdateConfig(ctx) } -func (clusterAutoupdateExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { - return cache.autoUpdateCache.DeleteClusterAutoUpdateConfig(ctx) +func (autoupdateConfigExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.autoupdateCache.DeleteAutoupdateConfig(ctx) } -func (clusterAutoupdateExecutor) isSingleton() bool { return true } +func (autoupdateConfigExecutor) isSingleton() bool { return true } -func (clusterAutoupdateExecutor) getReader(cache *Cache, cacheOK bool) clusterAutoupdateGetter { +func (autoupdateConfigExecutor) getReader(cache *Cache, cacheOK bool) autoupdateConfigGetter { if cacheOK { - return cache.autoUpdateCache + return cache.autoupdateCache } - return cache.Config.AutoUpdateService + return cache.Config.AutoupdateService } -type clusterAutoupdateGetter interface { - GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) +type autoupdateConfigGetter interface { + GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) } -var _ executor[*autoupdate.ClusterAutoUpdateConfig, clusterAutoupdateGetter] = clusterAutoupdateExecutor{} +var _ executor[*autoupdate.AutoupdateConfig, autoupdateConfigGetter] = autoupdateConfigExecutor{} -type autoUpdateVersionExecutor struct{} +type autoupdateVersionExecutor struct{} -func (autoUpdateVersionExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*autoupdate.AutoUpdateVersion, error) { - version, err := cache.AutoUpdateService.GetAutoUpdateVersion(ctx) - return []*autoupdate.AutoUpdateVersion{version}, trace.Wrap(err) +func (autoupdateVersionExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*autoupdate.AutoupdateVersion, error) { + version, err := cache.AutoupdateService.GetAutoupdateVersion(ctx) + return []*autoupdate.AutoupdateVersion{version}, trace.Wrap(err) } -func (autoUpdateVersionExecutor) upsert(ctx context.Context, cache *Cache, resource *autoupdate.AutoUpdateVersion) error { - _, err := cache.autoUpdateCache.UpsertAutoUpdateVersion(ctx, resource) +func (autoupdateVersionExecutor) upsert(ctx context.Context, cache *Cache, resource *autoupdate.AutoupdateVersion) error { + _, err := cache.autoupdateCache.UpsertAutoupdateVersion(ctx, resource) return trace.Wrap(err) } -func (autoUpdateVersionExecutor) deleteAll(ctx context.Context, cache *Cache) error { - return cache.autoUpdateCache.DeleteAutoUpdateVersion(ctx) +func (autoupdateVersionExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.autoupdateCache.DeleteAutoupdateVersion(ctx) } -func (autoUpdateVersionExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { - return cache.autoUpdateCache.DeleteAutoUpdateVersion(ctx) +func (autoupdateVersionExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.autoupdateCache.DeleteAutoupdateVersion(ctx) } -func (autoUpdateVersionExecutor) isSingleton() bool { return true } +func (autoupdateVersionExecutor) isSingleton() bool { return true } -func (autoUpdateVersionExecutor) getReader(cache *Cache, cacheOK bool) autoUpdateVersionGetter { +func (autoupdateVersionExecutor) getReader(cache *Cache, cacheOK bool) autoupdateVersionGetter { if cacheOK { - return cache.autoUpdateCache + return cache.autoupdateCache } - return cache.Config.AutoUpdateService + return cache.Config.AutoupdateService } -type autoUpdateVersionGetter interface { - GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) +type autoupdateVersionGetter interface { + GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) } -var _ executor[*autoupdate.AutoUpdateVersion, autoUpdateVersionGetter] = autoUpdateVersionExecutor{} +var _ executor[*autoupdate.AutoupdateVersion, autoupdateVersionGetter] = autoupdateVersionExecutor{} type userExecutor struct{} diff --git a/lib/service/service.go b/lib/service/service.go index 07beab5e4a7dc..9eaef96ff3999 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2137,7 +2137,7 @@ func (process *TeleportProcess) initAuthService() error { VersionStorage: process.storage, Authority: cfg.Keygen, ClusterConfiguration: cfg.ClusterConfiguration, - AutoUpdateService: cfg.AutoUpdateService, + AutoupdateService: cfg.AutoupdateService, ClusterAuditConfig: cfg.Auth.AuditConfig, ClusterNetworkingConfig: cfg.Auth.NetworkingConfig, SessionRecordingConfig: cfg.Auth.SessionRecordingConfig, @@ -2606,7 +2606,7 @@ func (process *TeleportProcess) newAccessCacheForServices(cfg accesspoint.Config cfg.WebSession = services.Identity.WebSessions() cfg.WebToken = services.Identity.WebTokens() cfg.WindowsDesktops = services.WindowsDesktops - cfg.AutoUpdateService = services.AutoUpdateService + cfg.AutoupdateService = services.AutoupdateService return accesspoint.NewCache(cfg) } @@ -2650,7 +2650,7 @@ func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, cfg.WebSession = client.WebSessions() cfg.WebToken = client.WebTokens() cfg.WindowsDesktops = client - cfg.AutoUpdateService = client + cfg.AutoupdateService = client return accesspoint.NewCache(cfg) } diff --git a/lib/service/servicecfg/config.go b/lib/service/servicecfg/config.go index e24a2579b1f7f..5201e9c95a796 100644 --- a/lib/service/servicecfg/config.go +++ b/lib/service/servicecfg/config.go @@ -169,8 +169,8 @@ type Config struct { // ClusterConfiguration is a service that provides cluster configuration ClusterConfiguration services.ClusterConfiguration - // AutoUpdateService is a service that provides cluster autoupdate configuration. - AutoUpdateService services.AutoUpdateService + // AutoupdateService is a service that provides cluster autoupdate configuration. + AutoupdateService services.AutoupdateService // CipherSuites is a list of TLS ciphersuites that Teleport supports. If // omitted, a Teleport selected list of defaults will be used. diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index bae727fcdb770..daa2500eab7df 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -24,27 +24,27 @@ import ( "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" ) -type AutoUpdateGetter interface { - // GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. - GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) +type AutoupdateGetter interface { + // GetAutoupdateConfig gets the autoupdate configuration from the backend. + GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) - // GetAutoUpdateVersion gets the autoupdate version from the backend. - GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) + // GetAutoupdateVersion gets the autoupdate version from the backend. + GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) } -// AutoUpdateService stores the cluster autoupdate service. -type AutoUpdateService interface { - AutoUpdateGetter +// AutoupdateService stores the cluster autoupdate service. +type AutoupdateService interface { + AutoupdateGetter - // UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. - UpsertClusterAutoUpdateConfig(ctx context.Context, c *autoupdate.ClusterAutoUpdateConfig) (*autoupdate.ClusterAutoUpdateConfig, error) + // UpsertAutoupdateConfig sets cluster autoupdate configuration. + UpsertAutoupdateConfig(ctx context.Context, c *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) - // DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. - DeleteClusterAutoUpdateConfig(ctx context.Context) error + // DeleteAutoupdateConfig deletes types.AutoupdateConfig from the backend. + DeleteAutoupdateConfig(ctx context.Context) error - // UpsertAutoUpdateVersion sets autoupdate version. - UpsertAutoUpdateVersion(ctx context.Context, c *autoupdate.AutoUpdateVersion) (*autoupdate.AutoUpdateVersion, error) + // UpsertAutoupdateVersion sets autoupdate version. + UpsertAutoupdateVersion(ctx context.Context, c *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) - // DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. - DeleteAutoUpdateVersion(ctx context.Context) error + // DeleteAutoupdateVersion deletes types.AutoupdateVersion from the backend. + DeleteAutoupdateVersion(ctx context.Context) error } diff --git a/lib/services/local/autoupdate.go b/lib/services/local/autoupdate.go index 30e81de48023a..5d68228d4c4f7 100644 --- a/lib/services/local/autoupdate.go +++ b/lib/services/local/autoupdate.go @@ -32,84 +32,84 @@ import ( ) const ( - autoUpdateConfigPrefix = "autoupdate_config" - autoUpdateVersionPrefix = "autoupdate_version" + autoupdateConfigPrefix = "autoupdate_config" + autoupdateVersionPrefix = "autoupdate_version" ) -// ClusterAutoUpdateService is responsible for managing autoupdate configuration and version management. -type ClusterAutoUpdateService struct { - config *generic.ServiceWrapper[*autoupdate.ClusterAutoUpdateConfig] - version *generic.ServiceWrapper[*autoupdate.AutoUpdateVersion] +// AutoupdateService is responsible for managing autoupdate configuration and version management. +type AutoupdateService struct { + config *generic.ServiceWrapper[*autoupdate.AutoupdateConfig] + version *generic.ServiceWrapper[*autoupdate.AutoupdateVersion] } -// NewClusterAutoUpdateService returns a new AutoUpdateService. -func NewClusterAutoUpdateService(backend backend.Backend) (*ClusterAutoUpdateService, error) { +// NewAutoupdateService returns a new AutoupdateService. +func NewAutoupdateService(backend backend.Backend) (*AutoupdateService, error) { config, err := generic.NewServiceWrapper( backend, - types.KindClusterAutoUpdateConfig, - autoUpdateConfigPrefix, - services.MarshalProtoResource[*autoupdate.ClusterAutoUpdateConfig], - services.UnmarshalProtoResource[*autoupdate.ClusterAutoUpdateConfig], + types.KindAutoupdateConfig, + autoupdateConfigPrefix, + services.MarshalProtoResource[*autoupdate.AutoupdateConfig], + services.UnmarshalProtoResource[*autoupdate.AutoupdateConfig], ) if err != nil { return nil, trace.Wrap(err) } version, err := generic.NewServiceWrapper( backend, - types.KindAutoUpdateVersion, - autoUpdateVersionPrefix, - services.MarshalProtoResource[*autoupdate.AutoUpdateVersion], - services.UnmarshalProtoResource[*autoupdate.AutoUpdateVersion], + types.KindAutoupdateVersion, + autoupdateVersionPrefix, + services.MarshalProtoResource[*autoupdate.AutoupdateVersion], + services.UnmarshalProtoResource[*autoupdate.AutoupdateVersion], ) if err != nil { return nil, trace.Wrap(err) } - return &ClusterAutoUpdateService{ + return &AutoupdateService{ config: config, version: version, }, nil } -// UpsertClusterAutoUpdateConfig sets cluster autoupdate configuration. -func (s *ClusterAutoUpdateService) UpsertClusterAutoUpdateConfig( +// UpsertAutoupdateConfig sets cluster autoupdate configuration. +func (s *AutoupdateService) UpsertAutoupdateConfig( ctx context.Context, - c *autoupdate.ClusterAutoUpdateConfig, -) (*autoupdate.ClusterAutoUpdateConfig, error) { - if err := update.ValidateClusterAutoUpdateConfig(c); err != nil { + c *autoupdate.AutoupdateConfig, +) (*autoupdate.AutoupdateConfig, error) { + if err := update.ValidateAutoupdateConfig(c); err != nil { return nil, trace.Wrap(err) } config, err := s.config.UpsertResource(ctx, c) return config, trace.Wrap(err) } -// GetClusterAutoUpdateConfig gets the autoupdate configuration from the backend. -func (s *ClusterAutoUpdateService) GetClusterAutoUpdateConfig(ctx context.Context) (*autoupdate.ClusterAutoUpdateConfig, error) { - config, err := s.config.GetResource(ctx, types.MetaNameClusterAutoUpdateConfig) +// GetAutoupdateConfig gets the autoupdate configuration from the backend. +func (s *AutoupdateService) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { + config, err := s.config.GetResource(ctx, types.MetaNameAutoupdateConfig) return config, trace.Wrap(err) } -// DeleteClusterAutoUpdateConfig deletes types.ClusterAutoUpdateConfig from the backend. -func (s *ClusterAutoUpdateService) DeleteClusterAutoUpdateConfig(ctx context.Context) error { - return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameClusterAutoUpdateConfig)) +// DeleteAutoupdateConfig deletes types.AutoupdateConfig from the backend. +func (s *AutoupdateService) DeleteAutoupdateConfig(ctx context.Context) error { + return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameAutoupdateConfig)) } -// UpsertAutoUpdateVersion sets cluster autoupdate version resource. -func (s *ClusterAutoUpdateService) UpsertAutoUpdateVersion(ctx context.Context, v *autoupdate.AutoUpdateVersion) (*autoupdate.AutoUpdateVersion, error) { - if err := update.ValidateAutoUpdateVersion(v); err != nil { +// UpsertAutoupdateVersion sets cluster autoupdate version resource. +func (s *AutoupdateService) UpsertAutoupdateVersion(ctx context.Context, v *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { + if err := update.ValidateAutoupdateVersion(v); err != nil { return nil, trace.Wrap(err) } version, err := s.version.UpsertResource(ctx, v) return version, trace.Wrap(err) } -// GetAutoUpdateVersion gets the autoupdate version from the backend. -func (s *ClusterAutoUpdateService) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) { - version, err := s.version.GetResource(ctx, types.MetaNameAutoUpdateVersion) +// GetAutoupdateVersion gets the autoupdate version from the backend. +func (s *AutoupdateService) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { + version, err := s.version.GetResource(ctx, types.MetaNameAutoupdateVersion) return version, trace.Wrap(err) } -// DeleteAutoUpdateVersion deletes types.AutoUpdateVersion from the backend. -func (s *ClusterAutoUpdateService) DeleteAutoUpdateVersion(ctx context.Context) error { - return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameAutoUpdateVersion)) +// DeleteAutoupdateVersion deletes types.AutoupdateVersion from the backend. +func (s *AutoupdateService) DeleteAutoupdateVersion(ctx context.Context) error { + return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameAutoupdateVersion)) } diff --git a/lib/services/local/events.go b/lib/services/local/events.go index eb8be1be6d7b1..b622de675795e 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -96,10 +96,10 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newUIConfigParser() case types.KindClusterName: parser = newClusterNameParser() - case types.KindClusterAutoUpdateConfig: - parser = newClusterAutoUpdateConfigParser() - case types.KindAutoUpdateVersion: - parser = newAutoUpdateVersionParser() + case types.KindAutoupdateConfig: + parser = newAutoupdateConfigParser() + case types.KindAutoupdateVersion: + parser = newAutoupdateVersionParser() case types.KindNamespace: parser = newNamespaceParser(kind.Name) case types.KindRole: @@ -708,67 +708,67 @@ func (p *clusterNameParser) parse(event backend.Event) (types.Resource, error) { } } -func newClusterAutoUpdateConfigParser() *clusterAutoUpdateConfigParser { - return &clusterAutoUpdateConfigParser{ - baseParser: newBaseParser(backend.Key(autoUpdateConfigPrefix)), +func newAutoupdateConfigParser() *autoupdateConfigParser { + return &autoupdateConfigParser{ + baseParser: newBaseParser(backend.Key(autoupdateConfigPrefix)), } } -type clusterAutoUpdateConfigParser struct { +type autoupdateConfigParser struct { baseParser } -func (p *clusterAutoUpdateConfigParser) parse(event backend.Event) (types.Resource, error) { +func (p *autoupdateConfigParser) parse(event backend.Event) (types.Resource, error) { switch event.Type { case types.OpDelete: - h, err := resourceHeader(event, types.KindClusterAutoUpdateConfig, types.V1, 0) + h, err := resourceHeader(event, types.KindAutoupdateConfig, types.V1, 0) if err != nil { return nil, trace.Wrap(err) } - h.SetName(types.MetaNameClusterAutoUpdateConfig) + h.SetName(types.MetaNameAutoupdateConfig) return h, nil case types.OpPut: - autoUpdateConfig, err := services.UnmarshalProtoResource[*autoupdate.ClusterAutoUpdateConfig](event.Item.Value, + autoupdateConfig, err := services.UnmarshalProtoResource[*autoupdate.AutoupdateConfig](event.Item.Value, services.WithExpires(event.Item.Expires), services.WithRevision(event.Item.Revision), ) if err != nil { return nil, trace.Wrap(err) } - return types.Resource153ToLegacy(autoUpdateConfig), nil + return types.Resource153ToLegacy(autoupdateConfig), nil default: return nil, trace.BadParameter("event %v is not supported", event.Type) } } -func newAutoUpdateVersionParser() *autoUpdateVersionParser { - return &autoUpdateVersionParser{ - baseParser: newBaseParser(backend.Key(autoUpdateVersionPrefix)), +func newAutoupdateVersionParser() *autoupdateVersionParser { + return &autoupdateVersionParser{ + baseParser: newBaseParser(backend.Key(autoupdateVersionPrefix)), } } -type autoUpdateVersionParser struct { +type autoupdateVersionParser struct { baseParser } -func (p *autoUpdateVersionParser) parse(event backend.Event) (types.Resource, error) { +func (p *autoupdateVersionParser) parse(event backend.Event) (types.Resource, error) { switch event.Type { case types.OpDelete: - h, err := resourceHeader(event, types.KindAutoUpdateVersion, types.V1, 0) + h, err := resourceHeader(event, types.KindAutoupdateVersion, types.V1, 0) if err != nil { return nil, trace.Wrap(err) } - h.SetName(types.MetaNameAutoUpdateVersion) + h.SetName(types.MetaNameAutoupdateVersion) return h, nil case types.OpPut: - autoUpdateVersion, err := services.UnmarshalProtoResource[*autoupdate.AutoUpdateVersion](event.Item.Value, + autoupdateVersion, err := services.UnmarshalProtoResource[*autoupdate.AutoupdateVersion](event.Item.Value, services.WithExpires(event.Item.Expires), services.WithRevision(event.Item.Revision), ) if err != nil { return nil, trace.Wrap(err) } - return types.Resource153ToLegacy(autoUpdateVersion), nil + return types.Resource153ToLegacy(autoupdateVersion), nil default: return nil, trace.BadParameter("event %v is not supported", event.Type) } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 32791db99b2c5..16a6b03221da7 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1454,18 +1454,18 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para ClusterName: h.auth.clusterName, } - autoUpdateConfig, err := h.GetAccessPoint().GetClusterAutoUpdateConfig(r.Context()) + autoupdateConfig, err := h.GetAccessPoint().GetAutoupdateConfig(r.Context()) if !trace.IsNotFound(err) && err != nil { return nil, trace.Wrap(err) } else if !trace.IsNotFound(err) { - response.ToolsAutoUpdate = autoUpdateConfig.GetSpec().GetToolsAutoUpdate() + response.ToolsAutoupdate = autoupdateConfig.GetSpec().GetToolsAutoUpdate() } - autoUpdateVersion, err := h.GetAccessPoint().GetAutoUpdateVersion(r.Context()) + autoupdateVersion, err := h.GetAccessPoint().GetAutoupdateVersion(r.Context()) if !trace.IsNotFound(err) && err != nil { return nil, trace.Wrap(err) } else if !trace.IsNotFound(err) { - response.ToolsVersion = autoUpdateVersion.GetSpec().GetToolsVersion() + response.ToolsVersion = autoupdateVersion.GetSpec().GetToolsVersion() } return response, nil diff --git a/tool/tctl/common/autoupdate_command.go b/tool/tctl/common/autoupdate_command.go index fe44fd86018ea..70f0dedee12d8 100644 --- a/tool/tctl/common/autoupdate_command.go +++ b/tool/tctl/common/autoupdate_command.go @@ -43,9 +43,9 @@ type versionResponse struct { ToolsVersion string `json:"tools_version"` } -// AutoUpdateCommand implements the `tctl autoupdate` command for managing +// AutoupdateCommand implements the `tctl autoupdate` command for managing // autoupdate process for tools and agents. -type AutoUpdateCommand struct { +type AutoupdateCommand struct { app *kingpin.Application config *servicecfg.Config @@ -53,30 +53,30 @@ type AutoUpdateCommand struct { getCmd *kingpin.CmdClause watchCmd *kingpin.CmdClause - toolsAutoUpdate string - toolsAutoUpdateVersion string + toolsAutoupdate string + toolsAutoupdateVersion string proxy string } -// Initialize allows AutoUpdateCommand to plug itself into the CLI parser. -func (c *AutoUpdateCommand) Initialize(app *kingpin.Application, config *servicecfg.Config) { +// Initialize allows AutoupdateCommand to plug itself into the CLI parser. +func (c *AutoupdateCommand) Initialize(app *kingpin.Application, config *servicecfg.Config) { c.app = app c.config = config - autoUpdateCmd := app.Command("autoupdate", "Teleport autoupdate commands.") + autoupdateCmd := app.Command("autoupdate", "Teleport autoupdate commands.") - c.updateCmd = autoUpdateCmd.Command("update", "Edit autoupdate configuration.") - c.updateCmd.Flag("set-tools-auto-update", `Enable or disable tools autoupdate in cluster.`).EnumVar(&c.toolsAutoUpdate, "on", "off") - c.updateCmd.Flag("set-tools-version", `Defines client tools version required to be force updated.`).StringVar(&c.toolsAutoUpdateVersion) + c.updateCmd = autoupdateCmd.Command("update", "Edit autoupdate configuration.") + c.updateCmd.Flag("set-tools-auto-update", `Enable or disable tools autoupdate in cluster.`).EnumVar(&c.toolsAutoupdate, "on", "off") + c.updateCmd.Flag("set-tools-version", `Defines client tools version required to be force updated.`).StringVar(&c.toolsAutoupdateVersion) - c.getCmd = autoUpdateCmd.Command("get", "Receive tools autoupdate version.") + c.getCmd = autoupdateCmd.Command("get", "Receive tools autoupdate version.") c.getCmd.Flag("proxy", `URL of the proxy`).StringVar(&c.proxy) - c.watchCmd = autoUpdateCmd.Command("watch", "Start monitoring autoupdate version updates.") + c.watchCmd = autoupdateCmd.Command("watch", "Start monitoring autoupdate version updates.") c.watchCmd.Flag("proxy", `URL of the proxy`).StringVar(&c.proxy) } // TryRun takes the CLI command as an argument and executes it. -func (c *AutoUpdateCommand) TryRun(ctx context.Context, cmd string, client *authclient.Client) (match bool, err error) { +func (c *AutoupdateCommand) TryRun(ctx context.Context, cmd string, client *authclient.Client) (match bool, err error) { switch cmd { case c.updateCmd.FullCommand(): err = c.Upsert(ctx, client) @@ -91,21 +91,22 @@ func (c *AutoUpdateCommand) TryRun(ctx context.Context, cmd string, client *auth } // Upsert works with cluster_autoupdate_config and autoupdate_version resources to create or update -func (c *AutoUpdateCommand) Upsert(ctx context.Context, client *authclient.Client) error { - serviceClient := client.AutoUpdateServiceClient() +func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Client) error { + serviceClient := client.AutoupdateServiceClient() - if c.toolsAutoUpdate != "" { - config, err := serviceClient.GetClusterAutoUpdateConfig(ctx, &autoupdate.GetClusterAutoUpdateConfigRequest{}) + if c.toolsAutoupdate != "" { + config, err := serviceClient.GetAutoupdateConfig(ctx, &autoupdate.GetAutoupdateConfigRequest{}) if trace.IsNotFound(err) { - if config, err = update.NewClusterAutoUpdateConfig(&autoupdate.ClusterAutoUpdateConfigSpec{}); err != nil { + if config, err = update.NewAutoupdateConfig(&autoupdate.AutoupdateConfigSpec{}); err != nil { return trace.Wrap(err) } } else if err != nil { return trace.Wrap(err) } - if c.toolsAutoUpdate != config.Spec.ToolsAutoUpdate { - config.Spec.ToolsAutoUpdate = c.toolsAutoUpdate - if _, err := serviceClient.UpsertClusterAutoUpdateConfig(ctx, &autoupdate.UpsertClusterAutoUpdateConfigRequest{ + isEnabled := c.toolsAutoupdate == "on" + if isEnabled != config.Spec.ToolsAutoUpdate { + config.Spec.ToolsAutoUpdate = isEnabled + if _, err := serviceClient.UpsertAutoupdateConfig(ctx, &autoupdate.UpsertAutoupdateConfigRequest{ Config: config, }); err != nil { return trace.Wrap(err) @@ -114,17 +115,17 @@ func (c *AutoUpdateCommand) Upsert(ctx context.Context, client *authclient.Clien } } - version, err := client.AutoUpdateServiceClient().GetAutoUpdateVersion(ctx, &autoupdate.GetAutoUpdateVersionRequest{}) + version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) if trace.IsNotFound(err) { - if version, err = update.NewAutoUpdateVersion(&autoupdate.AutoUpdateVersionSpec{}); err != nil { + if version, err = update.NewAutoupdateVersion(&autoupdate.AutoupdateVersionSpec{}); err != nil { return trace.Wrap(err) } } else if err != nil { return trace.Wrap(err) } - if version.Spec.ToolsVersion != c.toolsAutoUpdateVersion { - version.Spec.ToolsVersion = c.toolsAutoUpdateVersion - if _, err := serviceClient.UpsertAutoUpdateVersion(ctx, &autoupdate.UpsertAutoUpdateVersionRequest{ + if version.Spec.ToolsVersion != c.toolsAutoupdateVersion { + version.Spec.ToolsVersion = c.toolsAutoupdateVersion + if _, err := serviceClient.UpsertAutoupdateVersion(ctx, &autoupdate.UpsertAutoupdateVersionRequest{ Version: version, }); err != nil { return trace.Wrap(err) @@ -137,7 +138,7 @@ func (c *AutoUpdateCommand) Upsert(ctx context.Context, client *authclient.Clien // Get makes request to fetch tools autoupdate version, if proxy flag is not set // authorized handler should be used. -func (c *AutoUpdateCommand) Get(ctx context.Context, client *authclient.Client) error { +func (c *AutoupdateCommand) Get(ctx context.Context, client *authclient.Client) error { response, err := c.get(ctx, client) if err != nil { return trace.Wrap(err) @@ -151,7 +152,7 @@ func (c *AutoUpdateCommand) Get(ctx context.Context, client *authclient.Client) } // Watch launch the watcher of the tools autoupdate version updates. -func (c *AutoUpdateCommand) Watch(ctx context.Context, client *authclient.Client) error { +func (c *AutoupdateCommand) Watch(ctx context.Context, client *authclient.Client) error { current := teleport.SemVersion ticker := interval.New(interval.Config{ Duration: time.Minute, @@ -185,7 +186,7 @@ func (c *AutoUpdateCommand) Watch(ctx context.Context, client *authclient.Client } } -func (c *AutoUpdateCommand) get(ctx context.Context, client *authclient.Client) (*versionResponse, error) { +func (c *AutoupdateCommand) get(ctx context.Context, client *authclient.Client) (*versionResponse, error) { var response versionResponse if c.proxy != "" { find, err := webclient.Find(&webclient.Config{Context: ctx, ProxyAddr: c.proxy, Insecure: true}) @@ -194,7 +195,7 @@ func (c *AutoUpdateCommand) get(ctx context.Context, client *authclient.Client) } response.ToolsVersion = find.ToolsVersion } else { - version, err := client.AutoUpdateServiceClient().GetAutoUpdateVersion(ctx, &autoupdate.GetAutoUpdateVersionRequest{}) + version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) if err != nil { return nil, trace.Wrap(err) } diff --git a/tool/tctl/common/cmds.go b/tool/tctl/common/cmds.go index 68f1ad43b74d7..ea294f621aee3 100644 --- a/tool/tctl/common/cmds.go +++ b/tool/tctl/common/cmds.go @@ -64,6 +64,6 @@ func Commands() []CLICommand { &webauthnwinCommand{}, &touchIDCommand{}, &TerraformCommand{}, - &AutoUpdateCommand{}, + &AutoupdateCommand{}, } } From 0e45c8ff2ac922065ad4f065b68b42f55b18bc5f Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Thu, 22 Aug 2024 02:29:18 -0400 Subject: [PATCH 06/15] Add cache test and comment fixes --- api/client/client.go | 4 +- api/client/proto/event.pb.go | 2 +- .../teleport/legacy/client/proto/event.proto | 2 +- api/types/autoupdate/config.go | 2 +- api/types/constants.go | 4 +- lib/auth/authclient/api.go | 2 +- lib/auth/authclient/clt.go | 4 +- lib/auth/autoupdate/v1/service.go | 2 +- lib/auth/autoupdate/v1/service_test.go | 2 +- lib/cache/cache.go | 4 +- lib/cache/cache_test.go | 68 ++++++++++++++++++- lib/service/servicecfg/config.go | 2 +- lib/services/autoupdates.go | 4 +- lib/services/local/autoupdate.go | 6 +- tool/tctl/common/autoupdate_command.go | 4 +- 15 files changed, 89 insertions(+), 23 deletions(-) diff --git a/api/client/client.go b/api/client/client.go index 38e0ab16c8331..74211b12b328a 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -2865,7 +2865,7 @@ func (c *Client) GetClusterAuditConfig(ctx context.Context) (types.ClusterAuditC return resp, nil } -// GetAutoupdateConfig gets cluster autoupdate configuration. +// GetAutoupdateConfig gets autoupdate configuration. func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { resp, err := c.AutoupdateServiceClient().GetAutoupdateConfig(ctx, &autoupdate.GetAutoupdateConfigRequest{}) if err != nil { @@ -2874,7 +2874,7 @@ func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.Autoupdat return resp, nil } -// GetAutoupdateVersion gets cluster autoupdate version. +// GetAutoupdateVersion gets autoupdate version. func (c *Client) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { resp, err := c.AutoupdateServiceClient().GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) if err != nil { diff --git a/api/client/proto/event.pb.go b/api/client/proto/event.pb.go index 6261f07677e3b..e7dd3aa294b68 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -967,7 +967,7 @@ type Event_StaticHostUser struct { } type Event_AutoupdateConfig struct { - // AutoupdateConfig is a resource for cluster autoupdate config. + // AutoupdateConfig is a resource for autoupdate config. AutoupdateConfig *v112.AutoupdateConfig `protobuf:"bytes,64,opt,name=AutoupdateConfig,proto3,oneof"` } diff --git a/api/proto/teleport/legacy/client/proto/event.proto b/api/proto/teleport/legacy/client/proto/event.proto index 20ad652721b10..d7d68a70556f4 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -178,7 +178,7 @@ message Event { teleport.machineid.v1.SPIFFEFederation SPIFFEFederation = 62; // StaticHostUser is a resource for static host users. teleport.userprovisioning.v1.StaticHostUser StaticHostUser = 63; - // AutoupdateConfig is a resource for cluster autoupdate config. + // AutoupdateConfig is a resource for autoupdate config. teleport.autoupdate.v1.AutoupdateConfig AutoupdateConfig = 64; // AutoupdateVersion is a resource for autoupdate version. teleport.autoupdate.v1.AutoupdateVersion AutoupdateVersion = 65; diff --git a/api/types/autoupdate/config.go b/api/types/autoupdate/config.go index e056aa5b5cf2a..16578e419acb1 100644 --- a/api/types/autoupdate/config.go +++ b/api/types/autoupdate/config.go @@ -26,7 +26,7 @@ import ( "github.com/gravitational/teleport/api/types" ) -// NewAutoupdateConfig creates a new cluster autoupdate configuration resource. +// NewAutoupdateConfig creates a new autoupdate configuration resource. func NewAutoupdateConfig(spec *autoupdate.AutoupdateConfigSpec) (*autoupdate.AutoupdateConfig, error) { config := &autoupdate.AutoupdateConfig{ Kind: types.KindAutoupdateConfig, diff --git a/api/types/constants.go b/api/types/constants.go index 52ee78edcf48d..f77fbef18fb73 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -320,8 +320,8 @@ const ( // alternative to their individual resource kinds. KindClusterConfig = "cluster_config" - // KindAutoupdateConfig is the resource with cluster autoupdate configuration. - KindAutoupdateConfig = "cluster_autoupdate_config" + // KindAutoupdateConfig is the resource with autoupdate configuration. + KindAutoupdateConfig = "autoupdate_config" // KindAutoupdateVersion is the resource with autoupdate versions. KindAutoupdateVersion = "autoupdate_version" diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 88410e50d5c31..ca9ec09a81052 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -308,7 +308,7 @@ type ReadProxyAccessPoint interface { // GetUserGroup returns the specified user group resources. GetUserGroup(ctx context.Context, name string) (types.UserGroup, error) - // GetAutoupdateConfig gets the cluster autoupdate config from the backend. + // GetAutoupdateConfig gets the autoupdate config from the backend. GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) // GetAutoupdateVersion gets the autoupdate version from the backend. diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 6f05786059f45..5e5f7610b2901 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -360,7 +360,7 @@ func (c *Client) SearchSessionEvents(ctx context.Context, req events.SearchSessi return events, lastKey, nil } -// UpsertAutoupdateConfig sets cluster autoupdate configuration. +// UpsertAutoupdateConfig sets autoupdate configuration. func (c *Client) UpsertAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) { return nil, trace.NotImplemented(notImplementedMessage) } @@ -379,7 +379,7 @@ func (c *Client) DeleteAutoupdateVersion(ctx context.Context) error { return trace.NotImplemented(notImplementedMessage) } -// UpsertAutoupdateVersion sets cluster autoupdate version. +// UpsertAutoupdateVersion sets autoupdate version. func (c *Client) UpsertAutoupdateVersion(ctx context.Context, config *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { return nil, trace.NotImplemented(notImplementedMessage) } diff --git a/lib/auth/autoupdate/v1/service.go b/lib/auth/autoupdate/v1/service.go index 625e484c6682b..081284e6194b4 100644 --- a/lib/auth/autoupdate/v1/service.go +++ b/lib/auth/autoupdate/v1/service.go @@ -16,7 +16,7 @@ * along with this program. If not, see . */ -package autoupd +package autoupdate import ( "context" diff --git a/lib/auth/autoupdate/v1/service_test.go b/lib/auth/autoupdate/v1/service_test.go index a9ebe56af0bd3..6710a2c8aae39 100644 --- a/lib/auth/autoupdate/v1/service_test.go +++ b/lib/auth/autoupdate/v1/service_test.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -package autoupd +package autoupdate import ( "context" diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 2f6aaed205303..2ccd694c2be6e 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -645,7 +645,7 @@ type Config struct { Trust services.Trust // ClusterConfig is a cluster configuration service ClusterConfig services.ClusterConfiguration - // AutoupdateService is a cluster autoupdate service + // AutoupdateService is a autoupdate service AutoupdateService services.AutoupdateService // Provisioner is a provisioning service Provisioner services.Provisioner @@ -1896,7 +1896,7 @@ func (c *Cache) GetClusterName(opts ...services.MarshalOption) (types.ClusterNam return rg.reader.GetClusterName(opts...) } -// GetAutoupdateConfig gets the cluster autoupdate config from the backend. +// GetAutoupdateConfig gets the autoupdate config from the backend. func (c *Cache) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { ctx, span := c.Tracer.Start(ctx, "cache/GetAutoupdateConfig") defer span.End() diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 0d965b4cdfde1..3b8de42cc9fab 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -414,9 +414,9 @@ func newPack(dir string, setupConfig func(c Config) Config, opts ...packOption) SPIFFEFederations: p.spiffeFederations, DatabaseObjects: p.databaseObjects, StaticHostUsers: p.staticHostUsers, + AutoupdateService: p.autoupdateService, MaxRetryPeriod: 200 * time.Millisecond, EventsC: p.eventsC, - AutoupdateService: p.autoupdateService, })) if err != nil { return nil, trace.Wrap(err) @@ -2672,6 +2672,72 @@ func TestDatabaseObjects(t *testing.T) { }) } +// TestAutoupdateConfig tests that CRUD operations on autoupdate config resource is +// replicated from the backend to the cache. +func TestAutoupdateConfig(t *testing.T) { + t.Parallel() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + testResources153(t, p, testFuncs153[*autoupdate.AutoupdateConfig]{ + newResource: func(name string) (*autoupdate.AutoupdateConfig, error) { + return newAutoupdateConfig(t), nil + }, + create: func(ctx context.Context, item *autoupdate.AutoupdateConfig) error { + _, err := p.autoupdateService.UpsertAutoupdateConfig(ctx, item) + return trace.Wrap(err) + }, + list: func(ctx context.Context) ([]*autoupdate.AutoupdateConfig, error) { + item, err := p.autoupdateService.GetAutoupdateConfig(ctx) + return []*autoupdate.AutoupdateConfig{item}, trace.Wrap(err) + }, + cacheList: func(ctx context.Context) ([]*autoupdate.AutoupdateConfig, error) { + item, err := p.cache.GetAutoupdateConfig(ctx) + if trace.IsNotFound(err) { + return nil, nil + } + return []*autoupdate.AutoupdateConfig{item}, trace.Wrap(err) + }, + deleteAll: func(ctx context.Context) error { + return trace.Wrap(p.autoupdateService.DeleteAutoupdateConfig(ctx)) + }, + }) +} + +// TestAutoupdateVersion tests that CRUD operations on autoupdate version resource is +// replicated from the backend to the cache. +func TestAutoupdateVersion(t *testing.T) { + t.Parallel() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + testResources153(t, p, testFuncs153[*autoupdate.AutoupdateVersion]{ + newResource: func(name string) (*autoupdate.AutoupdateVersion, error) { + return newAutoupdateVersion(t), nil + }, + create: func(ctx context.Context, item *autoupdate.AutoupdateVersion) error { + _, err := p.autoupdateService.UpsertAutoupdateVersion(ctx, item) + return trace.Wrap(err) + }, + list: func(ctx context.Context) ([]*autoupdate.AutoupdateVersion, error) { + item, err := p.autoupdateService.GetAutoupdateVersion(ctx) + return []*autoupdate.AutoupdateVersion{item}, trace.Wrap(err) + }, + cacheList: func(ctx context.Context) ([]*autoupdate.AutoupdateVersion, error) { + item, err := p.cache.GetAutoupdateVersion(ctx) + if trace.IsNotFound(err) { + return nil, nil + } + return []*autoupdate.AutoupdateVersion{item}, trace.Wrap(err) + }, + deleteAll: func(ctx context.Context) error { + return trace.Wrap(p.autoupdateService.DeleteAutoupdateVersion(ctx)) + }, + }) +} + // TestGlobalNotifications tests that CRUD operations on global notification resources are // replicated from the backend to the cache. func TestGlobalNotifications(t *testing.T) { diff --git a/lib/service/servicecfg/config.go b/lib/service/servicecfg/config.go index 5201e9c95a796..9171081374736 100644 --- a/lib/service/servicecfg/config.go +++ b/lib/service/servicecfg/config.go @@ -169,7 +169,7 @@ type Config struct { // ClusterConfiguration is a service that provides cluster configuration ClusterConfiguration services.ClusterConfiguration - // AutoupdateService is a service that provides cluster autoupdate configuration. + // AutoupdateService is a service that provides autoupdate configuration. AutoupdateService services.AutoupdateService // CipherSuites is a list of TLS ciphersuites that Teleport supports. If diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index daa2500eab7df..9e78e63ae7033 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -32,11 +32,11 @@ type AutoupdateGetter interface { GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) } -// AutoupdateService stores the cluster autoupdate service. +// AutoupdateService stores the autoupdate service. type AutoupdateService interface { AutoupdateGetter - // UpsertAutoupdateConfig sets cluster autoupdate configuration. + // UpsertAutoupdateConfig sets autoupdate configuration. UpsertAutoupdateConfig(ctx context.Context, c *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) // DeleteAutoupdateConfig deletes types.AutoupdateConfig from the backend. diff --git a/lib/services/local/autoupdate.go b/lib/services/local/autoupdate.go index 5d68228d4c4f7..d82e6574a46ef 100644 --- a/lib/services/local/autoupdate.go +++ b/lib/services/local/autoupdate.go @@ -71,7 +71,7 @@ func NewAutoupdateService(backend backend.Backend) (*AutoupdateService, error) { }, nil } -// UpsertAutoupdateConfig sets cluster autoupdate configuration. +// UpsertAutoupdateConfig sets autoupdate configuration. func (s *AutoupdateService) UpsertAutoupdateConfig( ctx context.Context, c *autoupdate.AutoupdateConfig, @@ -94,7 +94,7 @@ func (s *AutoupdateService) DeleteAutoupdateConfig(ctx context.Context) error { return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameAutoupdateConfig)) } -// UpsertAutoupdateVersion sets cluster autoupdate version resource. +// UpsertAutoupdateVersion sets autoupdate version resource. func (s *AutoupdateService) UpsertAutoupdateVersion(ctx context.Context, v *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { if err := update.ValidateAutoupdateVersion(v); err != nil { return nil, trace.Wrap(err) @@ -111,5 +111,5 @@ func (s *AutoupdateService) GetAutoupdateVersion(ctx context.Context) (*autoupda // DeleteAutoupdateVersion deletes types.AutoupdateVersion from the backend. func (s *AutoupdateService) DeleteAutoupdateVersion(ctx context.Context) error { - return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameAutoupdateVersion)) + return trace.Wrap(s.version.DeleteResource(ctx, types.MetaNameAutoupdateVersion)) } diff --git a/tool/tctl/common/autoupdate_command.go b/tool/tctl/common/autoupdate_command.go index 70f0dedee12d8..10a0e4f202b5e 100644 --- a/tool/tctl/common/autoupdate_command.go +++ b/tool/tctl/common/autoupdate_command.go @@ -90,7 +90,7 @@ func (c *AutoupdateCommand) TryRun(ctx context.Context, cmd string, client *auth return true, trace.Wrap(err) } -// Upsert works with cluster_autoupdate_config and autoupdate_version resources to create or update +// Upsert works with autoupdate_config and autoupdate_version resources to create or update func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Client) error { serviceClient := client.AutoupdateServiceClient() @@ -111,7 +111,7 @@ func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Clien }); err != nil { return trace.Wrap(err) } - fmt.Println("cluster_autoupdate_config has been upserted") + fmt.Println("autoupdate_config has been upserted") } } From bb0e8060e86b11845baa6a70507925cb665886b1 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Thu, 22 Aug 2024 13:06:33 -0400 Subject: [PATCH 07/15] Rename tools_autoupdate --- api/client/webclient/webclient.go | 2 +- .../teleport/autoupdate/v1/autoupdate.pb.go | 64 +++++++++---------- .../teleport/autoupdate/v1/autoupdate.proto | 4 +- lib/cache/cache_test.go | 2 +- lib/web/apiserver.go | 2 +- tool/tctl/common/autoupdate_command.go | 4 +- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/api/client/webclient/webclient.go b/api/client/webclient/webclient.go index 82557ccc09a33..c501b92fe00d4 100644 --- a/api/client/webclient/webclient.go +++ b/api/client/webclient/webclient.go @@ -300,7 +300,7 @@ type PingResponse struct { // ToolsVersion defines the version of {tsh, tctl} for client auto-upgrade. ToolsVersion string `json:"tools_version"` // ToolsAutoupdate enables client autoupdate feature. - ToolsAutoupdate bool `json:"tools_auto_update"` + ToolsAutoupdate bool `json:"tools_autoupdate"` // ClusterName contains the name of the Teleport cluster. ClusterName string `json:"cluster_name"` diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go index 90b54ce369b5a..655109bc811a3 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -122,8 +122,8 @@ type AutoupdateConfigSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - ToolsAutoUpdate bool `protobuf:"varint,1,opt,name=tools_auto_update,json=toolsAutoUpdate,proto3" json:"tools_auto_update,omitempty"` + // ToolsAutoupdate encodes the feature flag to enable/disable tools autoupdates. + ToolsAutoupdate bool `protobuf:"varint,1,opt,name=tools_autoupdate,json=toolsAutoupdate,proto3" json:"tools_autoupdate,omitempty"` } func (x *AutoupdateConfigSpec) Reset() { @@ -158,9 +158,9 @@ func (*AutoupdateConfigSpec) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{1} } -func (x *AutoupdateConfigSpec) GetToolsAutoUpdate() bool { +func (x *AutoupdateConfigSpec) GetToolsAutoupdate() bool { if x != nil { - return x.ToolsAutoUpdate + return x.ToolsAutoupdate } return false } @@ -317,35 +317,35 @@ var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x42, + 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x41, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, - 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, - 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x3c, - 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x5a, 0x54, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x29, 0x0a, 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, + 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x3c, 0x0a, + 0x15, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, + 0x6f, 0x6f, 0x6c, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x56, 0x5a, 0x54, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, + 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/proto/teleport/autoupdate/v1/autoupdate.proto b/api/proto/teleport/autoupdate/v1/autoupdate.proto index cce99cc2e3556..82619f7b5031a 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate.proto @@ -33,8 +33,8 @@ message AutoupdateConfig { // AutoupdateConfigSpec encodes the parameters of the autoupdate config object. message AutoupdateConfigSpec { - // ToolsAutoUpdate encodes the feature flag to enable/disable tools autoupdates. - bool tools_auto_update = 1; + // ToolsAutoupdate encodes the feature flag to enable/disable tools autoupdates. + bool tools_autoupdate = 1; } // AutoupdateVersion is a resource singleton with version required for diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 3b8de42cc9fab..57354f1513cf2 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -3913,7 +3913,7 @@ func newAutoupdateConfig(t *testing.T) *autoupdate.AutoupdateConfig { t.Helper() r, err := update.NewAutoupdateConfig(&autoupdate.AutoupdateConfigSpec{ - ToolsAutoUpdate: true, + ToolsAutoupdate: true, }) require.NoError(t, err) return r diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 16a6b03221da7..ade82416e9a30 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1458,7 +1458,7 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para if !trace.IsNotFound(err) && err != nil { return nil, trace.Wrap(err) } else if !trace.IsNotFound(err) { - response.ToolsAutoupdate = autoupdateConfig.GetSpec().GetToolsAutoUpdate() + response.ToolsAutoupdate = autoupdateConfig.GetSpec().GetToolsAutoupdate() } autoupdateVersion, err := h.GetAccessPoint().GetAutoupdateVersion(r.Context()) diff --git a/tool/tctl/common/autoupdate_command.go b/tool/tctl/common/autoupdate_command.go index 10a0e4f202b5e..c9c0211e236ea 100644 --- a/tool/tctl/common/autoupdate_command.go +++ b/tool/tctl/common/autoupdate_command.go @@ -104,8 +104,8 @@ func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Clien return trace.Wrap(err) } isEnabled := c.toolsAutoupdate == "on" - if isEnabled != config.Spec.ToolsAutoUpdate { - config.Spec.ToolsAutoUpdate = isEnabled + if isEnabled != config.Spec.ToolsAutoupdate { + config.Spec.ToolsAutoupdate = isEnabled if _, err := serviceClient.UpsertAutoupdateConfig(ctx, &autoupdate.UpsertAutoupdateConfigRequest{ Config: config, }); err != nil { From 70b7c54e61b4f4ff50ef2e5cd828f5370bd9dea6 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Thu, 22 Aug 2024 14:36:10 -0400 Subject: [PATCH 08/15] Fix events from latest change in backend lib --- lib/services/local/events.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/services/local/events.go b/lib/services/local/events.go index 78a07ebe357f1..5018b3aff6946 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -710,7 +710,7 @@ func (p *clusterNameParser) parse(event backend.Event) (types.Resource, error) { func newAutoupdateConfigParser() *autoupdateConfigParser { return &autoupdateConfigParser{ - baseParser: newBaseParser(backend.Key(autoupdateConfigPrefix)), + baseParser: newBaseParser(backend.NewKey(autoupdateConfigPrefix)), } } @@ -743,7 +743,7 @@ func (p *autoupdateConfigParser) parse(event backend.Event) (types.Resource, err func newAutoupdateVersionParser() *autoupdateVersionParser { return &autoupdateVersionParser{ - baseParser: newBaseParser(backend.Key(autoupdateVersionPrefix)), + baseParser: newBaseParser(backend.NewKey(autoupdateVersionPrefix)), } } From 3b03379a4f07b6840c49d1b77ea2098def7f1e9b Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Thu, 22 Aug 2024 15:41:29 -0400 Subject: [PATCH 09/15] Command flag naming adjustment Fix interval first duration --- tool/tctl/common/autoupdate_command.go | 29 +++++++++++++------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/tool/tctl/common/autoupdate_command.go b/tool/tctl/common/autoupdate_command.go index c9c0211e236ea..0c786797e5126 100644 --- a/tool/tctl/common/autoupdate_command.go +++ b/tool/tctl/common/autoupdate_command.go @@ -65,7 +65,7 @@ func (c *AutoupdateCommand) Initialize(app *kingpin.Application, config *service autoupdateCmd := app.Command("autoupdate", "Teleport autoupdate commands.") c.updateCmd = autoupdateCmd.Command("update", "Edit autoupdate configuration.") - c.updateCmd.Flag("set-tools-auto-update", `Enable or disable tools autoupdate in cluster.`).EnumVar(&c.toolsAutoupdate, "on", "off") + c.updateCmd.Flag("set-tools-autoupdate", `Enable or disable tools autoupdate in cluster.`).EnumVar(&c.toolsAutoupdate, "on", "off") c.updateCmd.Flag("set-tools-version", `Defines client tools version required to be force updated.`).StringVar(&c.toolsAutoupdateVersion) c.getCmd = autoupdateCmd.Command("get", "Receive tools autoupdate version.") @@ -155,23 +155,16 @@ func (c *AutoupdateCommand) Get(ctx context.Context, client *authclient.Client) func (c *AutoupdateCommand) Watch(ctx context.Context, client *authclient.Client) error { current := teleport.SemVersion ticker := interval.New(interval.Config{ - Duration: time.Minute, - FirstDuration: time.Second, + Duration: time.Minute, }) + defer ticker.Stop() for { - select { - case <-ctx.Done(): - return nil - case <-ticker.Next(): - response, err := c.get(ctx, client) - if err != nil { - return trace.Wrap(err) - } - if response.ToolsVersion == "" { - continue - } - + response, err := c.get(ctx, client) + if err != nil { + return trace.Wrap(err) + } + if response.ToolsVersion != "" { semVersion, err := semver.NewVersion(response.ToolsVersion) if err != nil { return trace.Wrap(err) @@ -183,6 +176,12 @@ func (c *AutoupdateCommand) Watch(ctx context.Context, client *authclient.Client current = semVersion } } + + select { + case <-ctx.Done(): + return nil + case <-ticker.Next(): + } } } From 9796d4e26c087207d3d995c9e79faf32628a413e Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Fri, 23 Aug 2024 16:10:19 -0400 Subject: [PATCH 10/15] Simplify client implementation for autoupdate --- lib/auth/accesspoint/accesspoint.go | 2 +- lib/auth/authclient/clt.go | 40 +---------------------------- lib/cache/cache.go | 4 +-- lib/services/autoupdates.go | 5 ++-- 4 files changed, 7 insertions(+), 44 deletions(-) diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index b7e805ca584b2..8d93215621f42 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -103,7 +103,7 @@ type Config struct { WebSession types.WebSessionInterface WebToken types.WebTokenInterface WindowsDesktops services.WindowsDesktops - AutoupdateService services.AutoupdateService + AutoupdateService services.AutoupdateServiceGetter } func (c *Config) CheckAndSetDefaults() error { diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index f3a4483428106..f46ec2df4991e 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -361,44 +361,6 @@ func (c *Client) SearchSessionEvents(ctx context.Context, req events.SearchSessi return events, lastKey, nil } -// UpsertAutoupdateConfig sets autoupdate configuration. -func (c *Client) UpsertAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) { - return nil, trace.NotImplemented(notImplementedMessage) -} - -// GetAutoupdateConfig gets the autoupdate configuration from the backend. -func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { - config, err := c.APIClient.GetAutoupdateConfig(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - return config, nil -} - -// DeleteAutoupdateVersion deletes types.AutoupdateVersion from the backend. -func (c *Client) DeleteAutoupdateVersion(ctx context.Context) error { - return trace.NotImplemented(notImplementedMessage) -} - -// UpsertAutoupdateVersion sets autoupdate version. -func (c *Client) UpsertAutoupdateVersion(ctx context.Context, config *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { - return nil, trace.NotImplemented(notImplementedMessage) -} - -// GetAutoupdateVersion gets the autoupdate version from the backend. -func (c *Client) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { - config, err := c.APIClient.GetAutoupdateVersion(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - return config, nil -} - -// DeleteAutoupdateConfig deletes types.AutoupdateConfig from the backend. -func (c *Client) DeleteAutoupdateConfig(ctx context.Context) error { - return trace.NotImplemented(notImplementedMessage) -} - // UpsertClusterName not implemented: can only be called locally. func (c *Client) UpsertClusterName(cn types.ClusterName) error { return trace.NotImplemented(notImplementedMessage) @@ -1564,7 +1526,7 @@ type ClientI interface { WebService services.Status services.ClusterConfiguration - services.AutoupdateService + services.AutoupdateServiceGetter services.SessionTrackerService services.ConnectionsDiagnostic services.SAMLIdPSession diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 2ccd694c2be6e..1736480b261c7 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -645,8 +645,8 @@ type Config struct { Trust services.Trust // ClusterConfig is a cluster configuration service ClusterConfig services.ClusterConfiguration - // AutoupdateService is a autoupdate service - AutoupdateService services.AutoupdateService + // AutoupdateService is an autoupdate service. + AutoupdateService services.AutoupdateServiceGetter // Provisioner is a provisioning service Provisioner services.Provisioner // Users is a users service diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index 9e78e63ae7033..90d1842c8e922 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -24,7 +24,8 @@ import ( "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" ) -type AutoupdateGetter interface { +// AutoupdateServiceGetter defines only read-only service methods. +type AutoupdateServiceGetter interface { // GetAutoupdateConfig gets the autoupdate configuration from the backend. GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) @@ -34,7 +35,7 @@ type AutoupdateGetter interface { // AutoupdateService stores the autoupdate service. type AutoupdateService interface { - AutoupdateGetter + AutoupdateServiceGetter // UpsertAutoupdateConfig sets autoupdate configuration. UpsertAutoupdateConfig(ctx context.Context, c *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) From 187769517a480b738f2db5c2c2d9735d9d5665e5 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Mon, 26 Aug 2024 22:39:06 -0400 Subject: [PATCH 11/15] Add create/update api for autoupdate service Add resource command for autoupdate config and version Limit to getter interface for client and cache part Add client wrapping --- api/client/autoupdate/autoupdate.go | 96 ++++ api/client/client.go | 15 +- .../autoupdate/v1/autoupdate_service.pb.go | 526 ++++++++++++++---- .../v1/autoupdate_service_grpc.pb.go | 160 ++++++ .../autoupdate/v1/autoupdate_service.proto | 32 ++ lib/auth/authclient/clt.go | 4 +- lib/auth/autoupdate/v1/service.go | 76 +++ lib/cache/cache.go | 2 +- lib/service/service.go | 2 +- lib/services/autoupdates.go | 13 +- lib/services/local/autoupdate.go | 53 +- lib/services/resource.go | 4 + lib/web/apiserver.go | 8 +- tool/tctl/common/autoupdate_command.go | 14 +- tool/tctl/common/collection.go | 37 ++ tool/tctl/common/resource_command.go | 80 +++ 16 files changed, 989 insertions(+), 133 deletions(-) create mode 100644 api/client/autoupdate/autoupdate.go diff --git a/api/client/autoupdate/autoupdate.go b/api/client/autoupdate/autoupdate.go new file mode 100644 index 0000000000000..553c0ace23bf6 --- /dev/null +++ b/api/client/autoupdate/autoupdate.go @@ -0,0 +1,96 @@ +// Copyright 2024 Gravitational, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package autoupdate + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" +) + +// Client is an AutoupdateService client that conforms to the following lib/services interfaces: +// - services.AutoupdateService +type Client struct { + grpcClient autoupdate.AutoupdateServiceClient +} + +// NewClient creates a new AutoupdateService client. +func NewClient(grpcClient autoupdate.AutoupdateServiceClient) *Client { + return &Client{ + grpcClient: grpcClient, + } +} + +// GetAutoupdateConfig returns the specified AutoupdateConfig resource. +func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { + resp, err := c.grpcClient.GetAutoupdateConfig(ctx, &autoupdate.GetAutoupdateConfigRequest{}) + return resp, trace.Wrap(err) +} + +// CreateAutoupdateConfig creates a AutoupdateConfig. +func (c *Client) CreateAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) { + resp, err := c.grpcClient.CreateAutoupdateConfig(ctx, &autoupdate.CreateAutoupdateConfigRequest{Config: config}) + return resp, trace.Wrap(err) +} + +// UpdateAutoupdateConfig updates a AutoupdateConfig. +func (c *Client) UpdateAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) { + resp, err := c.grpcClient.UpdateAutoupdateConfig(ctx, &autoupdate.UpdateAutoupdateConfigRequest{Config: config}) + return resp, trace.Wrap(err) +} + +// UpsertAutoupdateConfig creates or updates a AutoupdateConfig. +func (c *Client) UpsertAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) { + resp, err := c.grpcClient.UpsertAutoupdateConfig(ctx, &autoupdate.UpsertAutoupdateConfigRequest{Config: config}) + return resp, trace.Wrap(err) +} + +// DeleteAutoupdateConfig removes the specified AutoupdateConfig resource. +func (c *Client) DeleteAutoupdateConfig(ctx context.Context) error { + _, err := c.grpcClient.DeleteAutoupdateConfig(ctx, &autoupdate.DeleteAutoupdateConfigRequest{}) + return trace.Wrap(err) +} + +// GetAutoupdateVersion returns the specified AutoupdateVersion resource. +func (c *Client) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { + resp, err := c.grpcClient.GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) + return resp, trace.Wrap(err) +} + +// CreateAutoupdateVersion creates a AutoupdateVersion. +func (c *Client) CreateAutoupdateVersion(ctx context.Context, config *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { + resp, err := c.grpcClient.CreateAutoupdateVersion(ctx, &autoupdate.CreateAutoupdateVersionRequest{Version: config}) + return resp, trace.Wrap(err) +} + +// UpdateAutoupdateVersion updates a AutoupdateVersion. +func (c *Client) UpdateAutoupdateVersion(ctx context.Context, config *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { + resp, err := c.grpcClient.UpdateAutoupdateVersion(ctx, &autoupdate.UpdateAutoupdateVersionRequest{Version: config}) + return resp, trace.Wrap(err) +} + +// UpsertAutoupdateVersion creates or updates a AutoupdateVersion. +func (c *Client) UpsertAutoupdateVersion(ctx context.Context, version *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { + resp, err := c.grpcClient.UpsertAutoupdateVersion(ctx, &autoupdate.UpsertAutoupdateVersionRequest{Version: version}) + return resp, trace.Wrap(err) +} + +// DeleteAutoupdateVersion removes the specified AutoupdateVersion resource. +func (c *Client) DeleteAutoupdateVersion(ctx context.Context) error { + _, err := c.grpcClient.DeleteAutoupdateVersion(ctx, &autoupdate.DeleteAutoupdateVersionRequest{}) + return trace.Wrap(err) +} diff --git a/api/client/client.go b/api/client/client.go index ff7554db7ce6b..83300bc225118 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -51,6 +51,7 @@ import ( "github.com/gravitational/teleport/api/breaker" "github.com/gravitational/teleport/api/client/accesslist" "github.com/gravitational/teleport/api/client/accessmonitoringrules" + "github.com/gravitational/teleport/api/client/autoupdate" crownjewelapi "github.com/gravitational/teleport/api/client/crownjewel" "github.com/gravitational/teleport/api/client/discoveryconfig" "github.com/gravitational/teleport/api/client/externalauditstorage" @@ -66,7 +67,7 @@ import ( accesslistv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accesslist/v1" accessmonitoringrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" auditlogpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/auditlog/v1" - "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + autoupdatepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -892,8 +893,8 @@ func (c *Client) GetVnetConfig(ctx context.Context) (*vnet.VnetConfig, error) { } // AutoupdateServiceClient returns an unadorned client for the Autoupdate service. -func (c *Client) AutoupdateServiceClient() autoupdate.AutoupdateServiceClient { - return autoupdate.NewAutoupdateServiceClient(c.conn) +func (c *Client) AutoupdateServiceClient() *autoupdate.Client { + return autoupdate.NewClient(autoupdatepb.NewAutoupdateServiceClient(c.conn)) } // Ping gets basic info about the auth server. @@ -2870,8 +2871,8 @@ func (c *Client) GetClusterAuditConfig(ctx context.Context) (types.ClusterAuditC } // GetAutoupdateConfig gets autoupdate configuration. -func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.AutoupdateConfig, error) { - resp, err := c.AutoupdateServiceClient().GetAutoupdateConfig(ctx, &autoupdate.GetAutoupdateConfigRequest{}) +func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdatepb.AutoupdateConfig, error) { + resp, err := c.AutoupdateServiceClient().GetAutoupdateConfig(ctx) if err != nil { return nil, trace.Wrap(err) } @@ -2879,8 +2880,8 @@ func (c *Client) GetAutoupdateConfig(ctx context.Context) (*autoupdate.Autoupdat } // GetAutoupdateVersion gets autoupdate version. -func (c *Client) GetAutoupdateVersion(ctx context.Context) (*autoupdate.AutoupdateVersion, error) { - resp, err := c.AutoupdateServiceClient().GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) +func (c *Client) GetAutoupdateVersion(ctx context.Context) (*autoupdatepb.AutoupdateVersion, error) { + resp, err := c.AutoupdateServiceClient().GetAutoupdateVersion(ctx) if err != nil { return nil, trace.Wrap(err) } diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go index 03d4d4a96665a..d252b2fde86f7 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go @@ -74,6 +74,102 @@ func (*GetAutoupdateConfigRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{0} } +// Request for CreateAutoupdateConfig. +type CreateAutoupdateConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Config *AutoupdateConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` +} + +func (x *CreateAutoupdateConfigRequest) Reset() { + *x = CreateAutoupdateConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAutoupdateConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAutoupdateConfigRequest) ProtoMessage() {} + +func (x *CreateAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAutoupdateConfigRequest.ProtoReflect.Descriptor instead. +func (*CreateAutoupdateConfigRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{1} +} + +func (x *CreateAutoupdateConfigRequest) GetConfig() *AutoupdateConfig { + if x != nil { + return x.Config + } + return nil +} + +// Request for UpdateAutoupdateConfig. +type UpdateAutoupdateConfigRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Config *AutoupdateConfig `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"` +} + +func (x *UpdateAutoupdateConfigRequest) Reset() { + *x = UpdateAutoupdateConfigRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateAutoupdateConfigRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateAutoupdateConfigRequest) ProtoMessage() {} + +func (x *UpdateAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateAutoupdateConfigRequest.ProtoReflect.Descriptor instead. +func (*UpdateAutoupdateConfigRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateAutoupdateConfigRequest) GetConfig() *AutoupdateConfig { + if x != nil { + return x.Config + } + return nil +} + // Request for UpsertAutoupdateConfig. type UpsertAutoupdateConfigRequest struct { state protoimpl.MessageState @@ -86,7 +182,7 @@ type UpsertAutoupdateConfigRequest struct { func (x *UpsertAutoupdateConfigRequest) Reset() { *x = UpsertAutoupdateConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -99,7 +195,7 @@ func (x *UpsertAutoupdateConfigRequest) String() string { func (*UpsertAutoupdateConfigRequest) ProtoMessage() {} func (x *UpsertAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -112,7 +208,7 @@ func (x *UpsertAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertAutoupdateConfigRequest.ProtoReflect.Descriptor instead. func (*UpsertAutoupdateConfigRequest) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{1} + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{3} } func (x *UpsertAutoupdateConfigRequest) GetConfig() *AutoupdateConfig { @@ -132,7 +228,7 @@ type DeleteAutoupdateConfigRequest struct { func (x *DeleteAutoupdateConfigRequest) Reset() { *x = DeleteAutoupdateConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -145,7 +241,7 @@ func (x *DeleteAutoupdateConfigRequest) String() string { func (*DeleteAutoupdateConfigRequest) ProtoMessage() {} func (x *DeleteAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -158,7 +254,7 @@ func (x *DeleteAutoupdateConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteAutoupdateConfigRequest.ProtoReflect.Descriptor instead. func (*DeleteAutoupdateConfigRequest) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{2} + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{4} } // Request for GetAutoupdateVersion. @@ -171,7 +267,7 @@ type GetAutoupdateVersionRequest struct { func (x *GetAutoupdateVersionRequest) Reset() { *x = GetAutoupdateVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -184,7 +280,7 @@ func (x *GetAutoupdateVersionRequest) String() string { func (*GetAutoupdateVersionRequest) ProtoMessage() {} func (x *GetAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -197,7 +293,103 @@ func (x *GetAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAutoupdateVersionRequest.ProtoReflect.Descriptor instead. func (*GetAutoupdateVersionRequest) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{3} + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{5} +} + +// Request for CreateAutoupdateVersion. +type CreateAutoupdateVersionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version *AutoupdateVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *CreateAutoupdateVersionRequest) Reset() { + *x = CreateAutoupdateVersionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateAutoupdateVersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAutoupdateVersionRequest) ProtoMessage() {} + +func (x *CreateAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAutoupdateVersionRequest.ProtoReflect.Descriptor instead. +func (*CreateAutoupdateVersionRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{6} +} + +func (x *CreateAutoupdateVersionRequest) GetVersion() *AutoupdateVersion { + if x != nil { + return x.Version + } + return nil +} + +// Request for UpdateAutoupdateConfig. +type UpdateAutoupdateVersionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version *AutoupdateVersion `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *UpdateAutoupdateVersionRequest) Reset() { + *x = UpdateAutoupdateVersionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateAutoupdateVersionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateAutoupdateVersionRequest) ProtoMessage() {} + +func (x *UpdateAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateAutoupdateVersionRequest.ProtoReflect.Descriptor instead. +func (*UpdateAutoupdateVersionRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{7} +} + +func (x *UpdateAutoupdateVersionRequest) GetVersion() *AutoupdateVersion { + if x != nil { + return x.Version + } + return nil } // Request for UpsertAutoupdateVersion. @@ -212,7 +404,7 @@ type UpsertAutoupdateVersionRequest struct { func (x *UpsertAutoupdateVersionRequest) Reset() { *x = UpsertAutoupdateVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -225,7 +417,7 @@ func (x *UpsertAutoupdateVersionRequest) String() string { func (*UpsertAutoupdateVersionRequest) ProtoMessage() {} func (x *UpsertAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -238,7 +430,7 @@ func (x *UpsertAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpsertAutoupdateVersionRequest.ProtoReflect.Descriptor instead. func (*UpsertAutoupdateVersionRequest) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{4} + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{8} } func (x *UpsertAutoupdateVersionRequest) GetVersion() *AutoupdateVersion { @@ -258,7 +450,7 @@ type DeleteAutoupdateVersionRequest struct { func (x *DeleteAutoupdateVersionRequest) Reset() { *x = DeleteAutoupdateVersionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -271,7 +463,7 @@ func (x *DeleteAutoupdateVersionRequest) String() string { func (*DeleteAutoupdateVersionRequest) ProtoMessage() {} func (x *DeleteAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5] + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -284,7 +476,7 @@ func (x *DeleteAutoupdateVersionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteAutoupdateVersionRequest.ProtoReflect.Descriptor instead. func (*DeleteAutoupdateVersionRequest) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{5} + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{9} } var File_teleport_autoupdate_v1_autoupdate_service_proto protoreflect.FileDescriptor @@ -301,76 +493,132 @@ var file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc = []byte{ 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x1c, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x61, 0x0a, - 0x1d, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x1d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x22, 0x1f, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x22, 0x61, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x65, 0x0a, 0x1e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0xcd, 0x05, 0x0a, 0x11, 0x41, 0x75, - 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x73, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, + 0x74, 0x12, 0x40, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x22, 0x61, 0x0a, 0x1d, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x1f, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1d, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x65, 0x0a, 0x1e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, + 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x43, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x65, 0x0a, 0x1e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0xbf, 0x09, + 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x73, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, - 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, - 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x67, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x76, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, + 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x67, 0x0a, 0x16, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x76, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x69, - 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, + 0x74, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, + 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, + 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -385,38 +633,54 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP() []byte { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescData } -var file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_teleport_autoupdate_v1_autoupdate_service_proto_goTypes = []any{ (*GetAutoupdateConfigRequest)(nil), // 0: teleport.autoupdate.v1.GetAutoupdateConfigRequest - (*UpsertAutoupdateConfigRequest)(nil), // 1: teleport.autoupdate.v1.UpsertAutoupdateConfigRequest - (*DeleteAutoupdateConfigRequest)(nil), // 2: teleport.autoupdate.v1.DeleteAutoupdateConfigRequest - (*GetAutoupdateVersionRequest)(nil), // 3: teleport.autoupdate.v1.GetAutoupdateVersionRequest - (*UpsertAutoupdateVersionRequest)(nil), // 4: teleport.autoupdate.v1.UpsertAutoupdateVersionRequest - (*DeleteAutoupdateVersionRequest)(nil), // 5: teleport.autoupdate.v1.DeleteAutoupdateVersionRequest - (*AutoupdateConfig)(nil), // 6: teleport.autoupdate.v1.AutoupdateConfig - (*AutoupdateVersion)(nil), // 7: teleport.autoupdate.v1.AutoupdateVersion - (*emptypb.Empty)(nil), // 8: google.protobuf.Empty + (*CreateAutoupdateConfigRequest)(nil), // 1: teleport.autoupdate.v1.CreateAutoupdateConfigRequest + (*UpdateAutoupdateConfigRequest)(nil), // 2: teleport.autoupdate.v1.UpdateAutoupdateConfigRequest + (*UpsertAutoupdateConfigRequest)(nil), // 3: teleport.autoupdate.v1.UpsertAutoupdateConfigRequest + (*DeleteAutoupdateConfigRequest)(nil), // 4: teleport.autoupdate.v1.DeleteAutoupdateConfigRequest + (*GetAutoupdateVersionRequest)(nil), // 5: teleport.autoupdate.v1.GetAutoupdateVersionRequest + (*CreateAutoupdateVersionRequest)(nil), // 6: teleport.autoupdate.v1.CreateAutoupdateVersionRequest + (*UpdateAutoupdateVersionRequest)(nil), // 7: teleport.autoupdate.v1.UpdateAutoupdateVersionRequest + (*UpsertAutoupdateVersionRequest)(nil), // 8: teleport.autoupdate.v1.UpsertAutoupdateVersionRequest + (*DeleteAutoupdateVersionRequest)(nil), // 9: teleport.autoupdate.v1.DeleteAutoupdateVersionRequest + (*AutoupdateConfig)(nil), // 10: teleport.autoupdate.v1.AutoupdateConfig + (*AutoupdateVersion)(nil), // 11: teleport.autoupdate.v1.AutoupdateVersion + (*emptypb.Empty)(nil), // 12: google.protobuf.Empty } var file_teleport_autoupdate_v1_autoupdate_service_proto_depIdxs = []int32{ - 6, // 0: teleport.autoupdate.v1.UpsertAutoupdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoupdateConfig - 7, // 1: teleport.autoupdate.v1.UpsertAutoupdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoupdateVersion - 0, // 2: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateConfig:input_type -> teleport.autoupdate.v1.GetAutoupdateConfigRequest - 1, // 3: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateConfig:input_type -> teleport.autoupdate.v1.UpsertAutoupdateConfigRequest - 2, // 4: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateConfig:input_type -> teleport.autoupdate.v1.DeleteAutoupdateConfigRequest - 3, // 5: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateVersion:input_type -> teleport.autoupdate.v1.GetAutoupdateVersionRequest - 4, // 6: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateVersion:input_type -> teleport.autoupdate.v1.UpsertAutoupdateVersionRequest - 5, // 7: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateVersion:input_type -> teleport.autoupdate.v1.DeleteAutoupdateVersionRequest - 6, // 8: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig - 6, // 9: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig - 8, // 10: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateConfig:output_type -> google.protobuf.Empty - 7, // 11: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion - 7, // 12: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion - 8, // 13: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateVersion:output_type -> google.protobuf.Empty - 8, // [8:14] is the sub-list for method output_type - 2, // [2:8] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 10, // 0: teleport.autoupdate.v1.CreateAutoupdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoupdateConfig + 10, // 1: teleport.autoupdate.v1.UpdateAutoupdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoupdateConfig + 10, // 2: teleport.autoupdate.v1.UpsertAutoupdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoupdateConfig + 11, // 3: teleport.autoupdate.v1.CreateAutoupdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoupdateVersion + 11, // 4: teleport.autoupdate.v1.UpdateAutoupdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoupdateVersion + 11, // 5: teleport.autoupdate.v1.UpsertAutoupdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoupdateVersion + 0, // 6: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateConfig:input_type -> teleport.autoupdate.v1.GetAutoupdateConfigRequest + 1, // 7: teleport.autoupdate.v1.AutoupdateService.CreateAutoupdateConfig:input_type -> teleport.autoupdate.v1.CreateAutoupdateConfigRequest + 2, // 8: teleport.autoupdate.v1.AutoupdateService.UpdateAutoupdateConfig:input_type -> teleport.autoupdate.v1.UpdateAutoupdateConfigRequest + 3, // 9: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateConfig:input_type -> teleport.autoupdate.v1.UpsertAutoupdateConfigRequest + 4, // 10: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateConfig:input_type -> teleport.autoupdate.v1.DeleteAutoupdateConfigRequest + 5, // 11: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateVersion:input_type -> teleport.autoupdate.v1.GetAutoupdateVersionRequest + 6, // 12: teleport.autoupdate.v1.AutoupdateService.CreateAutoupdateVersion:input_type -> teleport.autoupdate.v1.CreateAutoupdateVersionRequest + 7, // 13: teleport.autoupdate.v1.AutoupdateService.UpdateAutoupdateVersion:input_type -> teleport.autoupdate.v1.UpdateAutoupdateVersionRequest + 8, // 14: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateVersion:input_type -> teleport.autoupdate.v1.UpsertAutoupdateVersionRequest + 9, // 15: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateVersion:input_type -> teleport.autoupdate.v1.DeleteAutoupdateVersionRequest + 10, // 16: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig + 10, // 17: teleport.autoupdate.v1.AutoupdateService.CreateAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig + 10, // 18: teleport.autoupdate.v1.AutoupdateService.UpdateAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig + 10, // 19: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateConfig:output_type -> teleport.autoupdate.v1.AutoupdateConfig + 12, // 20: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateConfig:output_type -> google.protobuf.Empty + 11, // 21: teleport.autoupdate.v1.AutoupdateService.GetAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion + 11, // 22: teleport.autoupdate.v1.AutoupdateService.CreateAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion + 11, // 23: teleport.autoupdate.v1.AutoupdateService.UpdateAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion + 11, // 24: teleport.autoupdate.v1.AutoupdateService.UpsertAutoupdateVersion:output_type -> teleport.autoupdate.v1.AutoupdateVersion + 12, // 25: teleport.autoupdate.v1.AutoupdateService.DeleteAutoupdateVersion:output_type -> google.protobuf.Empty + 16, // [16:26] is the sub-list for method output_type + 6, // [6:16] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_teleport_autoupdate_v1_autoupdate_service_proto_init() } @@ -439,7 +703,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[1].Exporter = func(v any, i int) any { - switch v := v.(*UpsertAutoupdateConfigRequest); i { + switch v := v.(*CreateAutoupdateConfigRequest); i { case 0: return &v.state case 1: @@ -451,7 +715,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*DeleteAutoupdateConfigRequest); i { + switch v := v.(*UpdateAutoupdateConfigRequest); i { case 0: return &v.state case 1: @@ -463,7 +727,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*GetAutoupdateVersionRequest); i { + switch v := v.(*UpsertAutoupdateConfigRequest); i { case 0: return &v.state case 1: @@ -475,7 +739,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*UpsertAutoupdateVersionRequest); i { + switch v := v.(*DeleteAutoupdateConfigRequest); i { case 0: return &v.state case 1: @@ -487,6 +751,54 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { } } file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*GetAutoupdateVersionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*CreateAutoupdateVersionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[7].Exporter = func(v any, i int) any { + switch v := v.(*UpdateAutoupdateVersionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[8].Exporter = func(v any, i int) any { + switch v := v.(*UpsertAutoupdateVersionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[9].Exporter = func(v any, i int) any { switch v := v.(*DeleteAutoupdateVersionRequest); i { case 0: return &v.state @@ -505,7 +817,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc, NumEnums: 0, - NumMessages: 6, + NumMessages: 10, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go index 082e9ea37facc..223f5f6c33bc7 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go @@ -35,9 +35,13 @@ const _ = grpc.SupportPackageIsVersion9 const ( AutoupdateService_GetAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/GetAutoupdateConfig" + AutoupdateService_CreateAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/CreateAutoupdateConfig" + AutoupdateService_UpdateAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/UpdateAutoupdateConfig" AutoupdateService_UpsertAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/UpsertAutoupdateConfig" AutoupdateService_DeleteAutoupdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/DeleteAutoupdateConfig" AutoupdateService_GetAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/GetAutoupdateVersion" + AutoupdateService_CreateAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/CreateAutoupdateVersion" + AutoupdateService_UpdateAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/UpdateAutoupdateVersion" AutoupdateService_UpsertAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/UpsertAutoupdateVersion" AutoupdateService_DeleteAutoupdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoupdateService/DeleteAutoupdateVersion" ) @@ -50,12 +54,20 @@ const ( type AutoupdateServiceClient interface { // GetAutoupdateConfig gets the current autoupdate config singleton. GetAutoupdateConfig(ctx context.Context, in *GetAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) + // CreateAutoupdateConfig creates a new AutoupdateConfig. + CreateAutoupdateConfig(ctx context.Context, in *CreateAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) + // CreateAutoupdateConfig updates AutoupdateConfig singleton. + UpdateAutoupdateConfig(ctx context.Context, in *UpdateAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) // UpsertAutoupdateConfig creates a new AutoupdateConfig or replaces an existing AutoupdateConfig. UpsertAutoupdateConfig(ctx context.Context, in *UpsertAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) // DeleteAutoupdateConfig hard deletes the specified AutoupdateConfig. DeleteAutoupdateConfig(ctx context.Context, in *DeleteAutoupdateConfigRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // GetAutoupdateVersion gets the current autoupdate version singleton. GetAutoupdateVersion(ctx context.Context, in *GetAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) + // CreateAutoupdateVersion creates a new AutoupdateVersion. + CreateAutoupdateVersion(ctx context.Context, in *CreateAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) + // UpdateAutoupdateVersion updates AutoupdateVersion singleton. + UpdateAutoupdateVersion(ctx context.Context, in *UpdateAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) // UpsertAutoupdateVersion creates a new AutoupdateVersion or replaces an existing AutoupdateVersion. UpsertAutoupdateVersion(ctx context.Context, in *UpsertAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) // DeleteAutoupdateVersion hard deletes the specified AutoupdateVersionRequest. @@ -80,6 +92,26 @@ func (c *autoupdateServiceClient) GetAutoupdateConfig(ctx context.Context, in *G return out, nil } +func (c *autoupdateServiceClient) CreateAutoupdateConfig(ctx context.Context, in *CreateAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoupdateConfig) + err := c.cc.Invoke(ctx, AutoupdateService_CreateAutoupdateConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoupdateServiceClient) UpdateAutoupdateConfig(ctx context.Context, in *UpdateAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoupdateConfig) + err := c.cc.Invoke(ctx, AutoupdateService_UpdateAutoupdateConfig_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *autoupdateServiceClient) UpsertAutoupdateConfig(ctx context.Context, in *UpsertAutoupdateConfigRequest, opts ...grpc.CallOption) (*AutoupdateConfig, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AutoupdateConfig) @@ -110,6 +142,26 @@ func (c *autoupdateServiceClient) GetAutoupdateVersion(ctx context.Context, in * return out, nil } +func (c *autoupdateServiceClient) CreateAutoupdateVersion(ctx context.Context, in *CreateAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoupdateVersion) + err := c.cc.Invoke(ctx, AutoupdateService_CreateAutoupdateVersion_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoupdateServiceClient) UpdateAutoupdateVersion(ctx context.Context, in *UpdateAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoupdateVersion) + err := c.cc.Invoke(ctx, AutoupdateService_UpdateAutoupdateVersion_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *autoupdateServiceClient) UpsertAutoupdateVersion(ctx context.Context, in *UpsertAutoupdateVersionRequest, opts ...grpc.CallOption) (*AutoupdateVersion, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AutoupdateVersion) @@ -138,12 +190,20 @@ func (c *autoupdateServiceClient) DeleteAutoupdateVersion(ctx context.Context, i type AutoupdateServiceServer interface { // GetAutoupdateConfig gets the current autoupdate config singleton. GetAutoupdateConfig(context.Context, *GetAutoupdateConfigRequest) (*AutoupdateConfig, error) + // CreateAutoupdateConfig creates a new AutoupdateConfig. + CreateAutoupdateConfig(context.Context, *CreateAutoupdateConfigRequest) (*AutoupdateConfig, error) + // CreateAutoupdateConfig updates AutoupdateConfig singleton. + UpdateAutoupdateConfig(context.Context, *UpdateAutoupdateConfigRequest) (*AutoupdateConfig, error) // UpsertAutoupdateConfig creates a new AutoupdateConfig or replaces an existing AutoupdateConfig. UpsertAutoupdateConfig(context.Context, *UpsertAutoupdateConfigRequest) (*AutoupdateConfig, error) // DeleteAutoupdateConfig hard deletes the specified AutoupdateConfig. DeleteAutoupdateConfig(context.Context, *DeleteAutoupdateConfigRequest) (*emptypb.Empty, error) // GetAutoupdateVersion gets the current autoupdate version singleton. GetAutoupdateVersion(context.Context, *GetAutoupdateVersionRequest) (*AutoupdateVersion, error) + // CreateAutoupdateVersion creates a new AutoupdateVersion. + CreateAutoupdateVersion(context.Context, *CreateAutoupdateVersionRequest) (*AutoupdateVersion, error) + // UpdateAutoupdateVersion updates AutoupdateVersion singleton. + UpdateAutoupdateVersion(context.Context, *UpdateAutoupdateVersionRequest) (*AutoupdateVersion, error) // UpsertAutoupdateVersion creates a new AutoupdateVersion or replaces an existing AutoupdateVersion. UpsertAutoupdateVersion(context.Context, *UpsertAutoupdateVersionRequest) (*AutoupdateVersion, error) // DeleteAutoupdateVersion hard deletes the specified AutoupdateVersionRequest. @@ -161,6 +221,12 @@ type UnimplementedAutoupdateServiceServer struct{} func (UnimplementedAutoupdateServiceServer) GetAutoupdateConfig(context.Context, *GetAutoupdateConfigRequest) (*AutoupdateConfig, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAutoupdateConfig not implemented") } +func (UnimplementedAutoupdateServiceServer) CreateAutoupdateConfig(context.Context, *CreateAutoupdateConfigRequest) (*AutoupdateConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAutoupdateConfig not implemented") +} +func (UnimplementedAutoupdateServiceServer) UpdateAutoupdateConfig(context.Context, *UpdateAutoupdateConfigRequest) (*AutoupdateConfig, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateAutoupdateConfig not implemented") +} func (UnimplementedAutoupdateServiceServer) UpsertAutoupdateConfig(context.Context, *UpsertAutoupdateConfigRequest) (*AutoupdateConfig, error) { return nil, status.Errorf(codes.Unimplemented, "method UpsertAutoupdateConfig not implemented") } @@ -170,6 +236,12 @@ func (UnimplementedAutoupdateServiceServer) DeleteAutoupdateConfig(context.Conte func (UnimplementedAutoupdateServiceServer) GetAutoupdateVersion(context.Context, *GetAutoupdateVersionRequest) (*AutoupdateVersion, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAutoupdateVersion not implemented") } +func (UnimplementedAutoupdateServiceServer) CreateAutoupdateVersion(context.Context, *CreateAutoupdateVersionRequest) (*AutoupdateVersion, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAutoupdateVersion not implemented") +} +func (UnimplementedAutoupdateServiceServer) UpdateAutoupdateVersion(context.Context, *UpdateAutoupdateVersionRequest) (*AutoupdateVersion, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateAutoupdateVersion not implemented") +} func (UnimplementedAutoupdateServiceServer) UpsertAutoupdateVersion(context.Context, *UpsertAutoupdateVersionRequest) (*AutoupdateVersion, error) { return nil, status.Errorf(codes.Unimplemented, "method UpsertAutoupdateVersion not implemented") } @@ -215,6 +287,42 @@ func _AutoupdateService_GetAutoupdateConfig_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } +func _AutoupdateService_CreateAutoupdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateAutoupdateConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoupdateServiceServer).CreateAutoupdateConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoupdateService_CreateAutoupdateConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoupdateServiceServer).CreateAutoupdateConfig(ctx, req.(*CreateAutoupdateConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoupdateService_UpdateAutoupdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateAutoupdateConfigRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoupdateServiceServer).UpdateAutoupdateConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoupdateService_UpdateAutoupdateConfig_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoupdateServiceServer).UpdateAutoupdateConfig(ctx, req.(*UpdateAutoupdateConfigRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _AutoupdateService_UpsertAutoupdateConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpsertAutoupdateConfigRequest) if err := dec(in); err != nil { @@ -269,6 +377,42 @@ func _AutoupdateService_GetAutoupdateVersion_Handler(srv interface{}, ctx contex return interceptor(ctx, in, info, handler) } +func _AutoupdateService_CreateAutoupdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateAutoupdateVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoupdateServiceServer).CreateAutoupdateVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoupdateService_CreateAutoupdateVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoupdateServiceServer).CreateAutoupdateVersion(ctx, req.(*CreateAutoupdateVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoupdateService_UpdateAutoupdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateAutoupdateVersionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoupdateServiceServer).UpdateAutoupdateVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoupdateService_UpdateAutoupdateVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoupdateServiceServer).UpdateAutoupdateVersion(ctx, req.(*UpdateAutoupdateVersionRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _AutoupdateService_UpsertAutoupdateVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpsertAutoupdateVersionRequest) if err := dec(in); err != nil { @@ -316,6 +460,14 @@ var AutoupdateService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetAutoupdateConfig", Handler: _AutoupdateService_GetAutoupdateConfig_Handler, }, + { + MethodName: "CreateAutoupdateConfig", + Handler: _AutoupdateService_CreateAutoupdateConfig_Handler, + }, + { + MethodName: "UpdateAutoupdateConfig", + Handler: _AutoupdateService_UpdateAutoupdateConfig_Handler, + }, { MethodName: "UpsertAutoupdateConfig", Handler: _AutoupdateService_UpsertAutoupdateConfig_Handler, @@ -328,6 +480,14 @@ var AutoupdateService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetAutoupdateVersion", Handler: _AutoupdateService_GetAutoupdateVersion_Handler, }, + { + MethodName: "CreateAutoupdateVersion", + Handler: _AutoupdateService_CreateAutoupdateVersion_Handler, + }, + { + MethodName: "UpdateAutoupdateVersion", + Handler: _AutoupdateService_UpdateAutoupdateVersion_Handler, + }, { MethodName: "UpsertAutoupdateVersion", Handler: _AutoupdateService_UpsertAutoupdateVersion_Handler, diff --git a/api/proto/teleport/autoupdate/v1/autoupdate_service.proto b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto index c400c31cdc193..75cabbd4dc973 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate_service.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto @@ -26,6 +26,12 @@ service AutoupdateService { // GetAutoupdateConfig gets the current autoupdate config singleton. rpc GetAutoupdateConfig(GetAutoupdateConfigRequest) returns (AutoupdateConfig); + // CreateAutoupdateConfig creates a new AutoupdateConfig. + rpc CreateAutoupdateConfig(CreateAutoupdateConfigRequest) returns (AutoupdateConfig); + + // CreateAutoupdateConfig updates AutoupdateConfig singleton. + rpc UpdateAutoupdateConfig(UpdateAutoupdateConfigRequest) returns (AutoupdateConfig); + // UpsertAutoupdateConfig creates a new AutoupdateConfig or replaces an existing AutoupdateConfig. rpc UpsertAutoupdateConfig(UpsertAutoupdateConfigRequest) returns (AutoupdateConfig); @@ -35,6 +41,12 @@ service AutoupdateService { // GetAutoupdateVersion gets the current autoupdate version singleton. rpc GetAutoupdateVersion(GetAutoupdateVersionRequest) returns (AutoupdateVersion); + // CreateAutoupdateVersion creates a new AutoupdateVersion. + rpc CreateAutoupdateVersion(CreateAutoupdateVersionRequest) returns (AutoupdateVersion); + + // UpdateAutoupdateVersion updates AutoupdateVersion singleton. + rpc UpdateAutoupdateVersion(UpdateAutoupdateVersionRequest) returns (AutoupdateVersion); + // UpsertAutoupdateVersion creates a new AutoupdateVersion or replaces an existing AutoupdateVersion. rpc UpsertAutoupdateVersion(UpsertAutoupdateVersionRequest) returns (AutoupdateVersion); @@ -45,6 +57,16 @@ service AutoupdateService { // Request for GetAutoupdateConfig. message GetAutoupdateConfigRequest {} +// Request for CreateAutoupdateConfig. +message CreateAutoupdateConfigRequest { + AutoupdateConfig config = 1; +} + +// Request for UpdateAutoupdateConfig. +message UpdateAutoupdateConfigRequest { + AutoupdateConfig config = 1; +} + // Request for UpsertAutoupdateConfig. message UpsertAutoupdateConfigRequest { AutoupdateConfig config = 1; @@ -56,6 +78,16 @@ message DeleteAutoupdateConfigRequest {} // Request for GetAutoupdateVersion. message GetAutoupdateVersionRequest {} +// Request for CreateAutoupdateVersion. +message CreateAutoupdateVersionRequest { + AutoupdateVersion version = 1; +} + +// Request for UpdateAutoupdateConfig. +message UpdateAutoupdateVersionRequest { + AutoupdateVersion version = 1; +} + // Request for UpsertAutoupdateVersion. message UpsertAutoupdateVersionRequest { AutoupdateVersion version = 1; diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index f46ec2df4991e..8ad46f801337f 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -31,6 +31,7 @@ import ( "golang.org/x/crypto/ssh" "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/api/client/autoupdate" "github.com/gravitational/teleport/api/client/crownjewel" "github.com/gravitational/teleport/api/client/databaseobject" "github.com/gravitational/teleport/api/client/externalauditstorage" @@ -38,7 +39,6 @@ import ( "github.com/gravitational/teleport/api/client/secreport" apidefaults "github.com/gravitational/teleport/api/defaults" accessgraphsecretsv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessgraph/v1" - "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" dbobjectimportrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" @@ -1780,7 +1780,7 @@ type ClientI interface { StaticHostUserClient() services.StaticHostUser // AutoupdateServiceClient returns a Autoupdate service client. - AutoupdateServiceClient() autoupdate.AutoupdateServiceClient + AutoupdateServiceClient() *autoupdate.Client // CloneHTTPClient creates a new HTTP client with the same configuration. CloneHTTPClient(params ...roundtrip.ClientParam) (*HTTPClient, error) diff --git a/lib/auth/autoupdate/v1/service.go b/lib/auth/autoupdate/v1/service.go index 081284e6194b4..3ebca70445013 100644 --- a/lib/auth/autoupdate/v1/service.go +++ b/lib/auth/autoupdate/v1/service.go @@ -57,6 +57,44 @@ func (s *Service) GetAutoupdateConfig(ctx context.Context, req *autoupdate.GetAu return config, nil } +// CreateAutoupdateConfig creates autoupdate config singleton. +func (s *Service) CreateAutoupdateConfig(ctx context.Context, req *autoupdate.CreateAutoupdateConfigRequest) (*autoupdate.AutoupdateConfig, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindAutoupdateConfig, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + config, err := s.storage.CreateAutoupdateConfig(ctx, req.Config) + return config, trace.Wrap(err) +} + +// UpdateAutoupdateConfig updates autoupdate config singleton. +func (s *Service) UpdateAutoupdateConfig(ctx context.Context, req *autoupdate.UpdateAutoupdateConfigRequest) (*autoupdate.AutoupdateConfig, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindAutoupdateConfig, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + config, err := s.storage.UpdateAutoupdateConfig(ctx, req.Config) + return config, trace.Wrap(err) +} + // UpsertAutoupdateConfig updates or creates autoupdate config singleton. func (s *Service) UpsertAutoupdateConfig(ctx context.Context, req *autoupdate.UpsertAutoupdateConfigRequest) (*autoupdate.AutoupdateConfig, error) { authCtx, err := s.authorizer.Authorize(ctx) @@ -107,6 +145,44 @@ func (s *Service) GetAutoupdateVersion(ctx context.Context, req *autoupdate.GetA return version, nil } +// CreateAutoupdateVersion creates autoupdate version singleton. +func (s *Service) CreateAutoupdateVersion(ctx context.Context, req *autoupdate.CreateAutoupdateVersionRequest) (*autoupdate.AutoupdateVersion, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindAutoupdateVersion, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + autoupdateVersion, err := s.storage.CreateAutoupdateVersion(ctx, req.Version) + return autoupdateVersion, trace.Wrap(err) +} + +// UpdateAutoupdateVersion updates autoupdate version singleton. +func (s *Service) UpdateAutoupdateVersion(ctx context.Context, req *autoupdate.UpdateAutoupdateVersionRequest) (*autoupdate.AutoupdateVersion, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindAutoupdateVersion, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + autoupdateVersion, err := s.storage.UpdateAutoupdateVersion(ctx, req.Version) + return autoupdateVersion, trace.Wrap(err) +} + // UpsertAutoupdateVersion updates or creates autoupdate version singleton. func (s *Service) UpsertAutoupdateVersion(ctx context.Context, req *autoupdate.UpsertAutoupdateVersionRequest) (*autoupdate.AutoupdateVersion, error) { authCtx, err := s.authorizer.Authorize(ctx) diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 1736480b261c7..f69a7d2881a05 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -496,7 +496,7 @@ type Cache struct { trustCache services.Trust clusterConfigCache services.ClusterConfiguration - autoupdateCache services.AutoupdateService + autoupdateCache *local.AutoupdateService provisionerCache services.Provisioner usersCache services.UsersService accessCache services.Access diff --git a/lib/service/service.go b/lib/service/service.go index 9481bd38e614f..b4f2d387472de 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2650,7 +2650,7 @@ func (process *TeleportProcess) newAccessCacheForClient(cfg accesspoint.Config, cfg.WebSession = client.WebSessions() cfg.WebToken = client.WebTokens() cfg.WindowsDesktops = client - cfg.AutoupdateService = client + cfg.AutoupdateService = client.AutoupdateServiceClient() return accesspoint.NewCache(cfg) } diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index 90d1842c8e922..a236166dd19eb 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -20,7 +20,6 @@ package services import ( "context" - "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" ) @@ -37,12 +36,24 @@ type AutoupdateServiceGetter interface { type AutoupdateService interface { AutoupdateServiceGetter + // CreateAutoupdateConfig creates a AutoupdateConfig. + CreateAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) + + // UpdateAutoupdateConfig updates a AutoupdateConfig. + UpdateAutoupdateConfig(ctx context.Context, config *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) + // UpsertAutoupdateConfig sets autoupdate configuration. UpsertAutoupdateConfig(ctx context.Context, c *autoupdate.AutoupdateConfig) (*autoupdate.AutoupdateConfig, error) // DeleteAutoupdateConfig deletes types.AutoupdateConfig from the backend. DeleteAutoupdateConfig(ctx context.Context) error + // CreateAutoupdateVersion creates a AutoupdateVersion. + CreateAutoupdateVersion(ctx context.Context, config *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) + + // UpdateAutoupdateVersion updates a AutoupdateVersion. + UpdateAutoupdateVersion(ctx context.Context, config *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) + // UpsertAutoupdateVersion sets autoupdate version. UpsertAutoupdateVersion(ctx context.Context, c *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) diff --git a/lib/services/local/autoupdate.go b/lib/services/local/autoupdate.go index d82e6574a46ef..a59cc59b987cc 100644 --- a/lib/services/local/autoupdate.go +++ b/lib/services/local/autoupdate.go @@ -71,6 +71,30 @@ func NewAutoupdateService(backend backend.Backend) (*AutoupdateService, error) { }, nil } +// CreateAutoupdateConfig creates autoupdate configuration singleton. +func (s *AutoupdateService) CreateAutoupdateConfig( + ctx context.Context, + c *autoupdate.AutoupdateConfig, +) (*autoupdate.AutoupdateConfig, error) { + if err := update.ValidateAutoupdateConfig(c); err != nil { + return nil, trace.Wrap(err) + } + config, err := s.config.CreateResource(ctx, c) + return config, trace.Wrap(err) +} + +// UpdateAutoupdateConfig update autoupdate configuration singleton. +func (s *AutoupdateService) UpdateAutoupdateConfig( + ctx context.Context, + c *autoupdate.AutoupdateConfig, +) (*autoupdate.AutoupdateConfig, error) { + if err := update.ValidateAutoupdateConfig(c); err != nil { + return nil, trace.Wrap(err) + } + config, err := s.config.UpdateResource(ctx, c) + return config, trace.Wrap(err) +} + // UpsertAutoupdateConfig sets autoupdate configuration. func (s *AutoupdateService) UpsertAutoupdateConfig( ctx context.Context, @@ -94,8 +118,35 @@ func (s *AutoupdateService) DeleteAutoupdateConfig(ctx context.Context) error { return trace.Wrap(s.config.DeleteResource(ctx, types.MetaNameAutoupdateConfig)) } +// CreateAutoupdateVersion creates autoupdate version resource. +func (s *AutoupdateService) CreateAutoupdateVersion( + ctx context.Context, + v *autoupdate.AutoupdateVersion, +) (*autoupdate.AutoupdateVersion, error) { + if err := update.ValidateAutoupdateVersion(v); err != nil { + return nil, trace.Wrap(err) + } + version, err := s.version.CreateResource(ctx, v) + return version, trace.Wrap(err) +} + +// UpdateAutoupdateVersion updates autoupdate version resource. +func (s *AutoupdateService) UpdateAutoupdateVersion( + ctx context.Context, + v *autoupdate.AutoupdateVersion, +) (*autoupdate.AutoupdateVersion, error) { + if err := update.ValidateAutoupdateVersion(v); err != nil { + return nil, trace.Wrap(err) + } + version, err := s.version.UpdateResource(ctx, v) + return version, trace.Wrap(err) +} + // UpsertAutoupdateVersion sets autoupdate version resource. -func (s *AutoupdateService) UpsertAutoupdateVersion(ctx context.Context, v *autoupdate.AutoupdateVersion) (*autoupdate.AutoupdateVersion, error) { +func (s *AutoupdateService) UpsertAutoupdateVersion( + ctx context.Context, + v *autoupdate.AutoupdateVersion, +) (*autoupdate.AutoupdateVersion, error) { if err := update.ValidateAutoupdateVersion(v); err != nil { return nil, trace.Wrap(err) } diff --git a/lib/services/resource.go b/lib/services/resource.go index bb384b582f9da..82f6ec094c0b3 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -241,6 +241,10 @@ func ParseShortcut(in string) (string, error) { return types.KindPlugin, nil case types.KindAccessGraphSettings, "ags": return types.KindAccessGraphSettings, nil + case types.KindAutoupdateConfig: + return types.KindAutoupdateConfig, nil + case types.KindAutoupdateVersion: + return types.KindAutoupdateVersion, nil } return "", trace.BadParameter("unsupported resource: %q - resources should be expressed as 'type/name', for example 'connector/github'", in) } diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index c5f3deb98f66b..d99863af71bea 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1457,16 +1457,16 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para } autoupdateConfig, err := h.GetAccessPoint().GetAutoupdateConfig(r.Context()) - if !trace.IsNotFound(err) && err != nil { + if err != nil && !trace.IsNotFound(err) { return nil, trace.Wrap(err) - } else if !trace.IsNotFound(err) { + } else if err == nil { response.ToolsAutoupdate = autoupdateConfig.GetSpec().GetToolsAutoupdate() } autoupdateVersion, err := h.GetAccessPoint().GetAutoupdateVersion(r.Context()) - if !trace.IsNotFound(err) && err != nil { + if err != nil && !trace.IsNotFound(err) { return nil, trace.Wrap(err) - } else if !trace.IsNotFound(err) { + } else if err == nil { response.ToolsVersion = autoupdateVersion.GetSpec().GetToolsVersion() } diff --git a/tool/tctl/common/autoupdate_command.go b/tool/tctl/common/autoupdate_command.go index 0c786797e5126..2ca721375c841 100644 --- a/tool/tctl/common/autoupdate_command.go +++ b/tool/tctl/common/autoupdate_command.go @@ -95,7 +95,7 @@ func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Clien serviceClient := client.AutoupdateServiceClient() if c.toolsAutoupdate != "" { - config, err := serviceClient.GetAutoupdateConfig(ctx, &autoupdate.GetAutoupdateConfigRequest{}) + config, err := serviceClient.GetAutoupdateConfig(ctx) if trace.IsNotFound(err) { if config, err = update.NewAutoupdateConfig(&autoupdate.AutoupdateConfigSpec{}); err != nil { return trace.Wrap(err) @@ -106,16 +106,14 @@ func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Clien isEnabled := c.toolsAutoupdate == "on" if isEnabled != config.Spec.ToolsAutoupdate { config.Spec.ToolsAutoupdate = isEnabled - if _, err := serviceClient.UpsertAutoupdateConfig(ctx, &autoupdate.UpsertAutoupdateConfigRequest{ - Config: config, - }); err != nil { + if _, err := serviceClient.UpsertAutoupdateConfig(ctx, config); err != nil { return trace.Wrap(err) } fmt.Println("autoupdate_config has been upserted") } } - version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) + version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx) if trace.IsNotFound(err) { if version, err = update.NewAutoupdateVersion(&autoupdate.AutoupdateVersionSpec{}); err != nil { return trace.Wrap(err) @@ -125,9 +123,7 @@ func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Clien } if version.Spec.ToolsVersion != c.toolsAutoupdateVersion { version.Spec.ToolsVersion = c.toolsAutoupdateVersion - if _, err := serviceClient.UpsertAutoupdateVersion(ctx, &autoupdate.UpsertAutoupdateVersionRequest{ - Version: version, - }); err != nil { + if _, err := serviceClient.UpsertAutoupdateVersion(ctx, version); err != nil { return trace.Wrap(err) } fmt.Println("autoupdate_version has been upserted") @@ -194,7 +190,7 @@ func (c *AutoupdateCommand) get(ctx context.Context, client *authclient.Client) } response.ToolsVersion = find.ToolsVersion } else { - version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx, &autoupdate.GetAutoupdateVersionRequest{}) + version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx) if err != nil { return nil, trace.Wrap(err) } diff --git a/tool/tctl/common/collection.go b/tool/tctl/common/collection.go index d74fcf21cd418..d6b613100cae0 100644 --- a/tool/tctl/common/collection.go +++ b/tool/tctl/common/collection.go @@ -30,6 +30,7 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/constants" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" dbobjectimportrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" @@ -1733,3 +1734,39 @@ func (c *spiffeFederationCollection) writeText(w io.Writer, verbose bool) error _, err := t.AsBuffer().WriteTo(w) return trace.Wrap(err) } + +type autoupdateConfigCollection struct { + config *autoupdate.AutoupdateConfig +} + +func (c *autoupdateConfigCollection) resources() []types.Resource { + return []types.Resource{types.Resource153ToLegacy(c.config)} +} + +func (c *autoupdateConfigCollection) writeText(w io.Writer, verbose bool) error { + t := asciitable.MakeTable([]string{"Name", "Tools Autoupdate Enabled"}) + t.AddRow([]string{ + c.config.GetMetadata().GetName(), + fmt.Sprintf("%v", c.config.GetSpec().GetToolsAutoupdate()), + }) + _, err := t.AsBuffer().WriteTo(w) + return trace.Wrap(err) +} + +type autoupdateVersionCollection struct { + version *autoupdate.AutoupdateVersion +} + +func (c *autoupdateVersionCollection) resources() []types.Resource { + return []types.Resource{types.Resource153ToLegacy(c.version)} +} + +func (c *autoupdateVersionCollection) writeText(w io.Writer, verbose bool) error { + t := asciitable.MakeTable([]string{"Name", "Tools Autoupdate Version"}) + t.AddRow([]string{ + c.version.GetMetadata().GetName(), + fmt.Sprintf("%v", c.version.GetSpec().GetToolsVersion()), + }) + _, err := t.AsBuffer().WriteTo(w) + return trace.Wrap(err) +} diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index 3193cc28902aa..e9d2ed429d139 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -42,6 +42,7 @@ import ( apiclient "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" clusterconfigpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/clusterconfig/v1" crownjewelv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/crownjewel/v1" dbobjectv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" @@ -166,6 +167,8 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, config *servicec types.KindAccessGraphSettings: rc.upsertAccessGraphSettings, types.KindPlugin: rc.createPlugin, types.KindSPIFFEFederation: rc.createSPIFFEFederation, + types.KindAutoupdateConfig: rc.createAutoupdateConfig, + types.KindAutoupdateVersion: rc.createAutoupdateVersion, } rc.UpdateHandlers = map[ResourceKind]ResourceCreateHandler{ types.KindUser: rc.updateUser, @@ -181,6 +184,8 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, config *servicec types.KindVnetConfig: rc.updateVnetConfig, types.KindAccessGraphSettings: rc.updateAccessGraphSettings, types.KindPlugin: rc.updatePlugin, + types.KindAutoupdateConfig: rc.updateAutoupdateConfig, + types.KindAutoupdateVersion: rc.updateAutoupdateVersion, } rc.config = config @@ -2929,7 +2934,20 @@ func (rc *ResourceCommand) getCollection(ctx context.Context, client *authclient } return &botInstanceCollection{items: instances}, nil + case types.KindAutoupdateConfig: + config, err := client.AutoupdateServiceClient().GetAutoupdateConfig(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + return &autoupdateConfigCollection{config}, nil + case types.KindAutoupdateVersion: + version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + return &autoupdateVersionCollection{version}, nil } + return nil, trace.BadParameter("getting %q is not supported", rc.ref.String()) } @@ -3274,3 +3292,65 @@ func (rc *ResourceCommand) updateAccessGraphSettings(ctx context.Context, client fmt.Println("access_graph_settings has been updated") return nil } + +func (rc *ResourceCommand) createAutoupdateConfig(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + config, err := services.UnmarshalProtoResource[*autoupdate.AutoupdateConfig](raw.Raw) + if err != nil { + return trace.Wrap(err) + } + + if rc.IsForced() { + _, err = client.AutoupdateServiceClient().UpsertAutoupdateConfig(ctx, config) + } else { + _, err = client.AutoupdateServiceClient().CreateAutoupdateConfig(ctx, config) + } + if err != nil { + return trace.Wrap(err) + } + + fmt.Println("autoupdate_config has been created") + return nil +} + +func (rc *ResourceCommand) updateAutoupdateConfig(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + config, err := services.UnmarshalProtoResource[*autoupdate.AutoupdateConfig](raw.Raw) + if err != nil { + return trace.Wrap(err) + } + if _, err := client.AutoupdateServiceClient().UpdateAutoupdateConfig(ctx, config); err != nil { + return trace.Wrap(err) + } + fmt.Println("autoupdate_config has been updated") + return nil +} + +func (rc *ResourceCommand) createAutoupdateVersion(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + version, err := services.UnmarshalProtoResource[*autoupdate.AutoupdateVersion](raw.Raw) + if err != nil { + return trace.Wrap(err) + } + + if rc.IsForced() { + _, err = client.AutoupdateServiceClient().UpsertAutoupdateVersion(ctx, version) + } else { + _, err = client.AutoupdateServiceClient().CreateAutoupdateVersion(ctx, version) + } + if err != nil { + return trace.Wrap(err) + } + + fmt.Println("autoupdate_version has been created") + return nil +} + +func (rc *ResourceCommand) updateAutoupdateVersion(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + version, err := services.UnmarshalProtoResource[*autoupdate.AutoupdateVersion](raw.Raw) + if err != nil { + return trace.Wrap(err) + } + if _, err := client.AutoupdateServiceClient().UpdateAutoupdateVersion(ctx, version); err != nil { + return trace.Wrap(err) + } + fmt.Println("autoupdate_version has been updated") + return nil +} From 4e4962bc09dca589885821c2aff591c6c0de46ff Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Mon, 26 Aug 2024 23:45:34 -0400 Subject: [PATCH 12/15] Add tests for service and resource validation --- api/types/autoupdate/config_test.go | 94 +++++++++++++++++ api/types/autoupdate/version.go | 3 + api/types/autoupdate/version_test.go | 93 ++++++++++++++++ lib/services/local/autoupdate_test.go | 146 ++++++++++++++++++++++++++ 4 files changed, 336 insertions(+) create mode 100644 api/types/autoupdate/config_test.go create mode 100644 api/types/autoupdate/version_test.go create mode 100644 lib/services/local/autoupdate_test.go diff --git a/api/types/autoupdate/config_test.go b/api/types/autoupdate/config_test.go new file mode 100644 index 0000000000000..25a5079a3b6c1 --- /dev/null +++ b/api/types/autoupdate/config_test.go @@ -0,0 +1,94 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package autoupdate + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/types" +) + +// TestNewAutoupdateConfig verifies validation for autoupdate config resource. +func TestNewAutoupdateConfig(t *testing.T) { + tests := []struct { + name string + spec *autoupdate.AutoupdateConfigSpec + want *autoupdate.AutoupdateConfig + assertErr func(*testing.T, error, ...any) + }{ + { + name: "success tools autoupdate disabled", + spec: &autoupdate.AutoupdateConfigSpec{ + ToolsAutoupdate: false, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.NoError(t, err) + }, + want: &autoupdate.AutoupdateConfig{ + Kind: types.KindAutoupdateConfig, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoupdateConfig, + }, + Spec: &autoupdate.AutoupdateConfigSpec{ + ToolsAutoupdate: false, + }, + }, + }, + { + name: "success tools autoupdate enabled", + spec: &autoupdate.AutoupdateConfigSpec{ + ToolsAutoupdate: true, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.NoError(t, err) + }, + want: &autoupdate.AutoupdateConfig{ + Kind: types.KindAutoupdateConfig, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoupdateConfig, + }, + Spec: &autoupdate.AutoupdateConfigSpec{ + ToolsAutoupdate: true, + }, + }, + }, + { + name: "invalid spec", + spec: nil, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "Spec is nil") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewAutoupdateConfig(tt.spec) + tt.assertErr(t, err) + require.Empty(t, cmp.Diff(got, tt.want, protocmp.Transform())) + }) + } +} diff --git a/api/types/autoupdate/version.go b/api/types/autoupdate/version.go index 5a9b087a9f432..a9a445c8f3bf8 100644 --- a/api/types/autoupdate/version.go +++ b/api/types/autoupdate/version.go @@ -19,6 +19,7 @@ package autoupdate import ( + "github.com/coreos/go-semver/semver" "github.com/gravitational/trace" "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" @@ -58,6 +59,8 @@ func ValidateAutoupdateVersion(v *autoupdate.AutoupdateVersion) error { if v.Spec.ToolsVersion == "" { return trace.BadParameter("ToolsVersion is unset") + } else if _, err := semver.NewVersion(v.Spec.ToolsVersion); err != nil { + return trace.BadParameter("ToolsVersion is not a valid semantic version") } return nil diff --git a/api/types/autoupdate/version_test.go b/api/types/autoupdate/version_test.go new file mode 100644 index 0000000000000..df21d64abbd98 --- /dev/null +++ b/api/types/autoupdate/version_test.go @@ -0,0 +1,93 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package autoupdate + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/types" +) + +// TestNewAutoupdateVersion verifies validation for autoupdate version resource. +func TestNewAutoupdateVersion(t *testing.T) { + tests := []struct { + name string + spec *autoupdate.AutoupdateVersionSpec + want *autoupdate.AutoupdateVersion + assertErr func(*testing.T, error, ...any) + }{ + { + name: "success tools autoupdate version", + spec: &autoupdate.AutoupdateVersionSpec{ + ToolsVersion: "1.2.3-dev", + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.NoError(t, err) + }, + want: &autoupdate.AutoupdateVersion{ + Kind: types.KindAutoupdateVersion, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoupdateVersion, + }, + Spec: &autoupdate.AutoupdateVersionSpec{ + ToolsVersion: "1.2.3-dev", + }, + }, + }, + { + name: "invalid empty tools version", + spec: &autoupdate.AutoupdateVersionSpec{ + ToolsVersion: "", + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "ToolsVersion is unset") + }, + }, + { + name: "invalid semantic tools version", + spec: &autoupdate.AutoupdateVersionSpec{ + ToolsVersion: "17-0-0", + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "ToolsVersion is not a valid semantic version") + }, + }, + { + name: "invalid spec", + spec: nil, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "Spec is nil") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewAutoupdateVersion(tt.spec) + tt.assertErr(t, err) + require.Empty(t, cmp.Diff(got, tt.want, protocmp.Transform())) + }) + } +} diff --git a/lib/services/local/autoupdate_test.go b/lib/services/local/autoupdate_test.go new file mode 100644 index 0000000000000..6112096339305 --- /dev/null +++ b/lib/services/local/autoupdate_test.go @@ -0,0 +1,146 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package local + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/google/go-cmp/cmp/cmpopts" + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend/memory" +) + +// TestAutoupdateServiceConfigCRUD verifies get/create/update/upsert/delete methods of the backend service +// for autoupdate config resource. +func TestAutoupdateServiceConfigCRUD(t *testing.T) { + t.Parallel() + + bk, err := memory.New(memory.Config{}) + require.NoError(t, err) + + service, err := NewAutoupdateService(bk) + require.NoError(t, err) + + ctx := context.Background() + config := &autoupdate.AutoupdateConfig{ + Kind: types.KindAutoupdateConfig, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: types.MetaNameAutoupdateConfig}, + Spec: &autoupdate.AutoupdateConfigSpec{ToolsAutoupdate: true}, + } + + created, err := service.CreateAutoupdateConfig(ctx, config) + require.NoError(t, err) + diff := cmp.Diff(config, created, + cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"), + cmpopts.IgnoreUnexported(autoupdate.AutoupdateConfig{}, autoupdate.AutoupdateConfigSpec{}, headerv1.Metadata{}), + ) + require.Empty(t, diff) + require.NotEmpty(t, created.GetMetadata().GetRevision()) + + got, err := service.GetAutoupdateConfig(ctx) + require.NoError(t, err) + diff = cmp.Diff(config, got, + cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"), + cmpopts.IgnoreUnexported(autoupdate.AutoupdateConfig{}, autoupdate.AutoupdateConfigSpec{}, headerv1.Metadata{}), + ) + require.Empty(t, diff) + require.Equal(t, created.GetMetadata().GetRevision(), got.GetMetadata().GetRevision()) + + config.Spec.ToolsAutoupdate = false + updated, err := service.UpdateAutoupdateConfig(ctx, config) + require.NoError(t, err) + require.NotEqual(t, got.GetSpec().GetToolsAutoupdate(), updated.GetSpec().GetToolsAutoupdate()) + + _, err = service.UpsertAutoupdateConfig(ctx, config) + require.NoError(t, err) + + err = service.DeleteAutoupdateConfig(ctx) + require.NoError(t, err) + + _, err = service.GetAutoupdateConfig(ctx) + var notFoundError *trace.NotFoundError + require.ErrorAs(t, err, ¬FoundError) + + _, err = service.UpdateAutoupdateConfig(ctx, config) + require.ErrorAs(t, err, ¬FoundError) +} + +// TestAutoupdateServiceVersionCRUD verifies get/create/update/upsert/delete methods of the backend service +// for autoupdate version resource. +func TestAutoupdateServiceVersionCRUD(t *testing.T) { + t.Parallel() + + bk, err := memory.New(memory.Config{}) + require.NoError(t, err) + + service, err := NewAutoupdateService(bk) + require.NoError(t, err) + + ctx := context.Background() + version := &autoupdate.AutoupdateVersion{ + Kind: types.KindAutoupdateVersion, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: types.MetaNameAutoupdateVersion}, + Spec: &autoupdate.AutoupdateVersionSpec{ToolsVersion: "1.2.3"}, + } + + created, err := service.CreateAutoupdateVersion(ctx, version) + require.NoError(t, err) + diff := cmp.Diff(version, created, + cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"), + cmpopts.IgnoreUnexported(autoupdate.AutoupdateVersion{}, autoupdate.AutoupdateVersionSpec{}, headerv1.Metadata{}), + ) + require.Empty(t, diff) + require.NotEmpty(t, created.GetMetadata().GetRevision()) + + got, err := service.GetAutoupdateVersion(ctx) + require.NoError(t, err) + diff = cmp.Diff(version, got, + cmpopts.IgnoreFields(headerv1.Metadata{}, "Revision"), + cmpopts.IgnoreUnexported(autoupdate.AutoupdateVersion{}, autoupdate.AutoupdateVersionSpec{}, headerv1.Metadata{}), + ) + require.Empty(t, diff) + require.Equal(t, created.GetMetadata().GetRevision(), got.GetMetadata().GetRevision()) + + version.Spec.ToolsVersion = "3.2.1" + updated, err := service.UpdateAutoupdateVersion(ctx, version) + require.NoError(t, err) + require.NotEqual(t, got.GetSpec().GetToolsVersion(), updated.GetSpec().GetToolsVersion()) + + _, err = service.UpsertAutoupdateVersion(ctx, version) + require.NoError(t, err) + + err = service.DeleteAutoupdateVersion(ctx) + require.NoError(t, err) + + _, err = service.GetAutoupdateVersion(ctx) + var notFoundError *trace.NotFoundError + require.ErrorAs(t, err, ¬FoundError) + + _, err = service.UpdateAutoupdateVersion(ctx, version) + require.ErrorAs(t, err, ¬FoundError) +} From 12e1b792e8124022976a418f31830d49cc83f62f Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Tue, 27 Aug 2024 00:41:50 -0400 Subject: [PATCH 13/15] Drop autoupdate tctl command and find endpoint changes --- api/client/webclient/webclient.go | 4 - lib/web/apiserver.go | 20 +-- tool/tctl/common/autoupdate_command.go | 201 ------------------------- tool/tctl/common/cmds.go | 1 - 4 files changed, 2 insertions(+), 224 deletions(-) delete mode 100644 tool/tctl/common/autoupdate_command.go diff --git a/api/client/webclient/webclient.go b/api/client/webclient/webclient.go index c501b92fe00d4..2ccb27d0cb72b 100644 --- a/api/client/webclient/webclient.go +++ b/api/client/webclient/webclient.go @@ -297,10 +297,6 @@ type PingResponse struct { ServerVersion string `json:"server_version"` // MinClientVersion is the minimum client version required by the server. MinClientVersion string `json:"min_client_version"` - // ToolsVersion defines the version of {tsh, tctl} for client auto-upgrade. - ToolsVersion string `json:"tools_version"` - // ToolsAutoupdate enables client autoupdate feature. - ToolsAutoupdate bool `json:"tools_autoupdate"` // ClusterName contains the name of the Teleport cluster. ClusterName string `json:"cluster_name"` diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index d99863af71bea..ad87a73f4c5a2 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1449,28 +1449,12 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para return nil, trace.Wrap(err) } - response := webclient.PingResponse{ + return webclient.PingResponse{ Proxy: *proxyConfig, ServerVersion: teleport.Version, MinClientVersion: teleport.MinClientVersion, ClusterName: h.auth.clusterName, - } - - autoupdateConfig, err := h.GetAccessPoint().GetAutoupdateConfig(r.Context()) - if err != nil && !trace.IsNotFound(err) { - return nil, trace.Wrap(err) - } else if err == nil { - response.ToolsAutoupdate = autoupdateConfig.GetSpec().GetToolsAutoupdate() - } - - autoupdateVersion, err := h.GetAccessPoint().GetAutoupdateVersion(r.Context()) - if err != nil && !trace.IsNotFound(err) { - return nil, trace.Wrap(err) - } else if err == nil { - response.ToolsVersion = autoupdateVersion.GetSpec().GetToolsVersion() - } - - return response, nil + }, nil } func (h *Handler) pingWithConnector(w http.ResponseWriter, r *http.Request, p httprouter.Params) (interface{}, error) { diff --git a/tool/tctl/common/autoupdate_command.go b/tool/tctl/common/autoupdate_command.go deleted file mode 100644 index 2ca721375c841..0000000000000 --- a/tool/tctl/common/autoupdate_command.go +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package common - -import ( - "context" - "fmt" - "os" - "time" - - "github.com/alecthomas/kingpin/v2" - "github.com/coreos/go-semver/semver" - "github.com/gravitational/trace" - - "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/client/webclient" - "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" - update "github.com/gravitational/teleport/api/types/autoupdate" - "github.com/gravitational/teleport/lib/auth/authclient" - "github.com/gravitational/teleport/lib/service/servicecfg" - "github.com/gravitational/teleport/lib/utils" - "github.com/gravitational/teleport/lib/utils/interval" -) - -// versionResponse is structure for formatting the autoupdate version response. -type versionResponse struct { - ToolsVersion string `json:"tools_version"` -} - -// AutoupdateCommand implements the `tctl autoupdate` command for managing -// autoupdate process for tools and agents. -type AutoupdateCommand struct { - app *kingpin.Application - config *servicecfg.Config - - updateCmd *kingpin.CmdClause - getCmd *kingpin.CmdClause - watchCmd *kingpin.CmdClause - - toolsAutoupdate string - toolsAutoupdateVersion string - proxy string -} - -// Initialize allows AutoupdateCommand to plug itself into the CLI parser. -func (c *AutoupdateCommand) Initialize(app *kingpin.Application, config *servicecfg.Config) { - c.app = app - c.config = config - autoupdateCmd := app.Command("autoupdate", "Teleport autoupdate commands.") - - c.updateCmd = autoupdateCmd.Command("update", "Edit autoupdate configuration.") - c.updateCmd.Flag("set-tools-autoupdate", `Enable or disable tools autoupdate in cluster.`).EnumVar(&c.toolsAutoupdate, "on", "off") - c.updateCmd.Flag("set-tools-version", `Defines client tools version required to be force updated.`).StringVar(&c.toolsAutoupdateVersion) - - c.getCmd = autoupdateCmd.Command("get", "Receive tools autoupdate version.") - c.getCmd.Flag("proxy", `URL of the proxy`).StringVar(&c.proxy) - - c.watchCmd = autoupdateCmd.Command("watch", "Start monitoring autoupdate version updates.") - c.watchCmd.Flag("proxy", `URL of the proxy`).StringVar(&c.proxy) -} - -// TryRun takes the CLI command as an argument and executes it. -func (c *AutoupdateCommand) TryRun(ctx context.Context, cmd string, client *authclient.Client) (match bool, err error) { - switch cmd { - case c.updateCmd.FullCommand(): - err = c.Upsert(ctx, client) - case c.getCmd.FullCommand(): - err = c.Get(ctx, client) - case c.watchCmd.FullCommand(): - err = c.Watch(ctx, client) - default: - return false, nil - } - return true, trace.Wrap(err) -} - -// Upsert works with autoupdate_config and autoupdate_version resources to create or update -func (c *AutoupdateCommand) Upsert(ctx context.Context, client *authclient.Client) error { - serviceClient := client.AutoupdateServiceClient() - - if c.toolsAutoupdate != "" { - config, err := serviceClient.GetAutoupdateConfig(ctx) - if trace.IsNotFound(err) { - if config, err = update.NewAutoupdateConfig(&autoupdate.AutoupdateConfigSpec{}); err != nil { - return trace.Wrap(err) - } - } else if err != nil { - return trace.Wrap(err) - } - isEnabled := c.toolsAutoupdate == "on" - if isEnabled != config.Spec.ToolsAutoupdate { - config.Spec.ToolsAutoupdate = isEnabled - if _, err := serviceClient.UpsertAutoupdateConfig(ctx, config); err != nil { - return trace.Wrap(err) - } - fmt.Println("autoupdate_config has been upserted") - } - } - - version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx) - if trace.IsNotFound(err) { - if version, err = update.NewAutoupdateVersion(&autoupdate.AutoupdateVersionSpec{}); err != nil { - return trace.Wrap(err) - } - } else if err != nil { - return trace.Wrap(err) - } - if version.Spec.ToolsVersion != c.toolsAutoupdateVersion { - version.Spec.ToolsVersion = c.toolsAutoupdateVersion - if _, err := serviceClient.UpsertAutoupdateVersion(ctx, version); err != nil { - return trace.Wrap(err) - } - fmt.Println("autoupdate_version has been upserted") - } - - return nil -} - -// Get makes request to fetch tools autoupdate version, if proxy flag is not set -// authorized handler should be used. -func (c *AutoupdateCommand) Get(ctx context.Context, client *authclient.Client) error { - response, err := c.get(ctx, client) - if err != nil { - return trace.Wrap(err) - } - - if err := utils.WriteJSON(os.Stdout, response); err != nil { - return trace.Wrap(err) - } - - return nil -} - -// Watch launch the watcher of the tools autoupdate version updates. -func (c *AutoupdateCommand) Watch(ctx context.Context, client *authclient.Client) error { - current := teleport.SemVersion - ticker := interval.New(interval.Config{ - Duration: time.Minute, - }) - defer ticker.Stop() - - for { - response, err := c.get(ctx, client) - if err != nil { - return trace.Wrap(err) - } - if response.ToolsVersion != "" { - semVersion, err := semver.NewVersion(response.ToolsVersion) - if err != nil { - return trace.Wrap(err) - } - if !semVersion.Equal(*current) { - if err := utils.WriteJSON(os.Stdout, response); err != nil { - return trace.Wrap(err) - } - current = semVersion - } - } - - select { - case <-ctx.Done(): - return nil - case <-ticker.Next(): - } - } -} - -func (c *AutoupdateCommand) get(ctx context.Context, client *authclient.Client) (*versionResponse, error) { - var response versionResponse - if c.proxy != "" { - find, err := webclient.Find(&webclient.Config{Context: ctx, ProxyAddr: c.proxy, Insecure: true}) - if err != nil { - return nil, trace.Wrap(err) - } - response.ToolsVersion = find.ToolsVersion - } else { - version, err := client.AutoupdateServiceClient().GetAutoupdateVersion(ctx) - if err != nil { - return nil, trace.Wrap(err) - } - response.ToolsVersion = version.Spec.ToolsVersion - } - - return &response, nil -} diff --git a/tool/tctl/common/cmds.go b/tool/tctl/common/cmds.go index ea294f621aee3..1c727eba01e25 100644 --- a/tool/tctl/common/cmds.go +++ b/tool/tctl/common/cmds.go @@ -64,6 +64,5 @@ func Commands() []CLICommand { &webauthnwinCommand{}, &touchIDCommand{}, &TerraformCommand{}, - &AutoupdateCommand{}, } } From b3a62d71c810cd4f1c51d49468ada80aea661224 Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Tue, 27 Aug 2024 01:08:19 -0400 Subject: [PATCH 14/15] Fix tests --- lib/auth/autoupdate/v1/service_test.go | 36 ++++++++++++++++++++++++++ lib/services/autoupdates.go | 1 + 2 files changed, 37 insertions(+) diff --git a/lib/auth/autoupdate/v1/service_test.go b/lib/auth/autoupdate/v1/service_test.go index 6710a2c8aae39..fb45cb20c6488 100644 --- a/lib/auth/autoupdate/v1/service_test.go +++ b/lib/auth/autoupdate/v1/service_test.go @@ -82,6 +82,24 @@ func TestServiceAccess(t *testing.T) { allowedStates []authz.AdminActionAuthState disallowedStates []authz.AdminActionAuthState }{ + { + name: "CreateAutoupdateConfig", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbCreate}, + }, + { + name: "UpdateAutoupdateConfig", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbUpdate}, + }, { name: "UpsertAutoupdateConfig", allowedStates: []authz.AdminActionAuthState{ @@ -103,6 +121,24 @@ func TestServiceAccess(t *testing.T) { allowedVerbs: []string{types.VerbDelete}, }, // Autoupdate version check. + { + name: "CreateAutoupdateVersion", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbCreate}, + }, + { + name: "UpdateAutoupdateVersion", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbUpdate}, + }, { name: "UpsertAutoupdateVersion", allowedStates: []authz.AdminActionAuthState{ diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index a236166dd19eb..e65a4528719ce 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -20,6 +20,7 @@ package services import ( "context" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" ) From 4cceaac81886888b4a551b45f20ed2a813643f0d Mon Sep 17 00:00:00 2001 From: Vadym Popov Date: Tue, 27 Aug 2024 16:56:26 -0400 Subject: [PATCH 15/15] Re-use cache for autoupdate service Add tests for resources command --- lib/auth/authclient/api.go | 3 + lib/auth/autoupdate/v1/service.go | 50 +++++++++----- lib/auth/autoupdate/v1/service_test.go | 8 ++- lib/auth/grpcserver.go | 9 ++- lib/web/apiserver.go | 1 - tool/tctl/common/edit_command_test.go | 76 +++++++++++++++++++++ tool/tctl/common/resource_command_test.go | 81 +++++++++++++++++++++++ 7 files changed, 208 insertions(+), 20 deletions(-) diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index ca9ec09a81052..38c344f72a323 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -1183,6 +1183,9 @@ type Cache interface { // DatabaseObjectsGetter defines methods for fetching database objects. services.DatabaseObjectsGetter + // AutoupdateServiceGetter defines method for fetching the autoupdate config and version resources. + services.AutoupdateServiceGetter + // GetAccessGraphSettings returns the access graph settings. GetAccessGraphSettings(context.Context) (*clusterconfigpb.AccessGraphSettings, error) diff --git a/lib/auth/autoupdate/v1/service.go b/lib/auth/autoupdate/v1/service.go index 3ebca70445013..5d39baf340f4f 100644 --- a/lib/auth/autoupdate/v1/service.go +++ b/lib/auth/autoupdate/v1/service.go @@ -30,26 +30,46 @@ import ( "github.com/gravitational/teleport/lib/services" ) +// ServiceConfig holds configuration options for the autoupdate gRPC service. +type ServiceConfig struct { + // Authorizer is the authorizer used to check access to resources. + Authorizer authz.Authorizer + // Backend is the backend used to store autoupdate resources. + Backend services.AutoupdateService + // Cache is the cache used to store autoupdate resources. + Cache services.AutoupdateServiceGetter +} + // Service implements the gRPC API layer for the Autoupdate. type Service struct { // Opting out of forward compatibility, this service must implement all service methods. autoupdate.UnsafeAutoupdateServiceServer - storage services.AutoupdateService authorizer authz.Authorizer + backend services.AutoupdateService + cache services.AutoupdateServiceGetter } // NewService returns a new Autoupdate API service using the given storage layer and authorizer. -func NewService(storage services.AutoupdateService, authorizer authz.Authorizer) *Service { - return &Service{ - storage: storage, - authorizer: authorizer, +func NewService(cfg ServiceConfig) (*Service, error) { + switch { + case cfg.Backend == nil: + return nil, trace.BadParameter("backend is required") + case cfg.Authorizer == nil: + return nil, trace.BadParameter("authorizer is required") + case cfg.Cache == nil: + return nil, trace.BadParameter("cache is required") } + return &Service{ + authorizer: cfg.Authorizer, + backend: cfg.Backend, + cache: cfg.Cache, + }, nil } // GetAutoupdateConfig gets the current autoupdate config singleton. func (s *Service) GetAutoupdateConfig(ctx context.Context, req *autoupdate.GetAutoupdateConfigRequest) (*autoupdate.AutoupdateConfig, error) { - config, err := s.storage.GetAutoupdateConfig(ctx) + config, err := s.cache.GetAutoupdateConfig(ctx) if err != nil { return nil, trace.Wrap(err) } @@ -72,7 +92,7 @@ func (s *Service) CreateAutoupdateConfig(ctx context.Context, req *autoupdate.Cr return nil, trace.Wrap(err) } - config, err := s.storage.CreateAutoupdateConfig(ctx, req.Config) + config, err := s.backend.CreateAutoupdateConfig(ctx, req.Config) return config, trace.Wrap(err) } @@ -91,7 +111,7 @@ func (s *Service) UpdateAutoupdateConfig(ctx context.Context, req *autoupdate.Up return nil, trace.Wrap(err) } - config, err := s.storage.UpdateAutoupdateConfig(ctx, req.Config) + config, err := s.backend.UpdateAutoupdateConfig(ctx, req.Config) return config, trace.Wrap(err) } @@ -110,7 +130,7 @@ func (s *Service) UpsertAutoupdateConfig(ctx context.Context, req *autoupdate.Up return nil, trace.Wrap(err) } - config, err := s.storage.UpsertAutoupdateConfig(ctx, req.Config) + config, err := s.backend.UpsertAutoupdateConfig(ctx, req.Config) return config, trace.Wrap(err) } @@ -129,7 +149,7 @@ func (s *Service) DeleteAutoupdateConfig(ctx context.Context, req *autoupdate.De return nil, trace.Wrap(err) } - if err := s.storage.DeleteAutoupdateConfig(ctx); err != nil { + if err := s.backend.DeleteAutoupdateConfig(ctx); err != nil { return nil, trace.Wrap(err) } return &emptypb.Empty{}, nil @@ -137,7 +157,7 @@ func (s *Service) DeleteAutoupdateConfig(ctx context.Context, req *autoupdate.De // GetAutoupdateVersion gets the current autoupdate version singleton. func (s *Service) GetAutoupdateVersion(ctx context.Context, req *autoupdate.GetAutoupdateVersionRequest) (*autoupdate.AutoupdateVersion, error) { - version, err := s.storage.GetAutoupdateVersion(ctx) + version, err := s.cache.GetAutoupdateVersion(ctx) if err != nil { return nil, trace.Wrap(err) } @@ -160,7 +180,7 @@ func (s *Service) CreateAutoupdateVersion(ctx context.Context, req *autoupdate.C return nil, trace.Wrap(err) } - autoupdateVersion, err := s.storage.CreateAutoupdateVersion(ctx, req.Version) + autoupdateVersion, err := s.backend.CreateAutoupdateVersion(ctx, req.Version) return autoupdateVersion, trace.Wrap(err) } @@ -179,7 +199,7 @@ func (s *Service) UpdateAutoupdateVersion(ctx context.Context, req *autoupdate.U return nil, trace.Wrap(err) } - autoupdateVersion, err := s.storage.UpdateAutoupdateVersion(ctx, req.Version) + autoupdateVersion, err := s.backend.UpdateAutoupdateVersion(ctx, req.Version) return autoupdateVersion, trace.Wrap(err) } @@ -198,7 +218,7 @@ func (s *Service) UpsertAutoupdateVersion(ctx context.Context, req *autoupdate.U return nil, trace.Wrap(err) } - autoupdateVersion, err := s.storage.UpsertAutoupdateVersion(ctx, req.Version) + autoupdateVersion, err := s.backend.UpsertAutoupdateVersion(ctx, req.Version) return autoupdateVersion, trace.Wrap(err) } @@ -217,7 +237,7 @@ func (s *Service) DeleteAutoupdateVersion(ctx context.Context, req *autoupdate.D return nil, trace.Wrap(err) } - if err := s.storage.DeleteAutoupdateVersion(ctx); err != nil { + if err := s.backend.DeleteAutoupdateVersion(ctx); err != nil { return nil, trace.Wrap(err) } return &emptypb.Empty{}, nil diff --git a/lib/auth/autoupdate/v1/service_test.go b/lib/auth/autoupdate/v1/service_test.go index fb45cb20c6488..576625e147bb2 100644 --- a/lib/auth/autoupdate/v1/service_test.go +++ b/lib/auth/autoupdate/v1/service_test.go @@ -260,5 +260,11 @@ func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, c }, nil }) - return NewService(storage, authorizer) + service, err := NewService(ServiceConfig{ + Authorizer: authorizer, + Backend: storage, + Cache: storage, + }) + require.NoError(t, err) + return service } diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 3bddd4e91f017..aeb577d931404 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -79,7 +79,7 @@ import ( "github.com/gravitational/teleport/api/types/wrappers" "github.com/gravitational/teleport/lib/accessmonitoringrules/accessmonitoringrulesv1" "github.com/gravitational/teleport/lib/auth/authclient" - autoupd "github.com/gravitational/teleport/lib/auth/autoupdate/v1" + autoupdatev1 "github.com/gravitational/teleport/lib/auth/autoupdate/v1" "github.com/gravitational/teleport/lib/auth/clusterconfig/clusterconfigv1" "github.com/gravitational/teleport/lib/auth/crownjewel/crownjewelv1" "github.com/gravitational/teleport/lib/auth/dbobject/dbobjectv1" @@ -5435,11 +5435,14 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { } userprovisioningpb.RegisterStaticHostUsersServiceServer(server, staticHostUserServer) - autoupdateStorage, err := local.NewAutoupdateService(cfg.AuthServer.bk) + autoupdateServiceServer, err := autoupdatev1.NewService(autoupdatev1.ServiceConfig{ + Authorizer: cfg.Authorizer, + Backend: cfg.AuthServer.Services, + Cache: cfg.AuthServer.Cache, + }) if err != nil { return nil, trace.Wrap(err) } - autoupdateServiceServer := autoupd.NewService(autoupdateStorage, cfg.Authorizer) autoupdate.RegisterAutoupdateServiceServer(server, autoupdateServiceServer) // Only register the service if this is an open source build. Enterprise builds diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index ad87a73f4c5a2..6c7ec85b0e72e 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -1448,7 +1448,6 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para if err != nil { return nil, trace.Wrap(err) } - return webclient.PingResponse{ Proxy: *proxyConfig, ServerVersion: teleport.Version, diff --git a/tool/tctl/common/edit_command_test.go b/tool/tctl/common/edit_command_test.go index b42517ac70382..e374266218d9a 100644 --- a/tool/tctl/common/edit_command_test.go +++ b/tool/tctl/common/edit_command_test.go @@ -30,7 +30,9 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/constants" + autoupdatepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/autoupdate" "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/backend" @@ -73,6 +75,14 @@ func TestEditResources(t *testing.T) { kind: types.KindSessionRecordingConfig, edit: testEditSessionRecordingConfig, }, + { + kind: types.KindAutoupdateConfig, + edit: testEditAutoupdateConfig, + }, + { + kind: types.KindAutoupdateVersion, + edit: testEditAutoupdateVersion, + }, } for _, test := range tests { @@ -485,3 +495,69 @@ func testEditSAMLConnector(t *testing.T, clt *authclient.Client) { assert.Error(t, err, "stale connector was allowed to be updated") require.ErrorIs(t, err, backend.ErrIncorrectRevision, "expected an incorrect revision error, got %T", err) } + +func testEditAutoupdateConfig(t *testing.T, clt *authclient.Client) { + ctx := context.Background() + + expected, err := autoupdate.NewAutoupdateConfig(&autoupdatepb.AutoupdateConfigSpec{ToolsAutoupdate: true}) + require.NoError(t, err) + + initial, err := autoupdate.NewAutoupdateConfig(&autoupdatepb.AutoupdateConfigSpec{ToolsAutoupdate: false}) + require.NoError(t, err) + + _, err = clt.AutoupdateServiceClient().CreateAutoupdateConfig(ctx, initial) + require.NoError(t, err, "creating initial autoupdate config") + + editor := func(name string) error { + f, err := os.Create(name) + if err != nil { + return trace.Wrap(err, "opening file to edit") + } + expected.GetMetadata().Revision = initial.GetMetadata().GetRevision() + collection := &autoupdateConfigCollection{config: expected} + return trace.NewAggregate(writeYAML(collection, f), f.Close()) + } + + // Edit the autoupdate configuration resource. + _, err = runEditCommand(t, clt, []string{"edit", "autoupdate_config"}, withEditor(editor)) + require.NoError(t, err, "expected editing autoupdate config to succeed") + + actual, err := clt.GetAutoupdateConfig(ctx) + require.NoError(t, err, "failed to get autoupdate config after edit") + assert.NotEqual(t, initial.GetSpec().GetToolsAutoupdate(), actual.GetSpec().GetToolsAutoupdate(), + "tools_autoupdate should have been modified by edit") + assert.Equal(t, expected.GetSpec().GetToolsAutoupdate(), actual.GetSpec().GetToolsAutoupdate()) +} + +func testEditAutoupdateVersion(t *testing.T, clt *authclient.Client) { + ctx := context.Background() + + expected, err := autoupdate.NewAutoupdateVersion(&autoupdatepb.AutoupdateVersionSpec{ToolsVersion: "3.2.1"}) + require.NoError(t, err) + + initial, err := autoupdate.NewAutoupdateVersion(&autoupdatepb.AutoupdateVersionSpec{ToolsVersion: "1.2.3"}) + require.NoError(t, err) + + _, err = clt.AutoupdateServiceClient().CreateAutoupdateVersion(ctx, initial) + require.NoError(t, err, "creating initial autoupdate version") + + editor := func(name string) error { + f, err := os.Create(name) + if err != nil { + return trace.Wrap(err, "opening file to edit") + } + expected.GetMetadata().Revision = initial.GetMetadata().GetRevision() + collection := &autoupdateVersionCollection{version: expected} + return trace.NewAggregate(writeYAML(collection, f), f.Close()) + } + + // Edit the autoupdate version resource. + _, err = runEditCommand(t, clt, []string{"edit", "autoupdate_version"}, withEditor(editor)) + require.NoError(t, err, "expected editing autoupdate version to succeed") + + actual, err := clt.GetAutoupdateVersion(ctx) + require.NoError(t, err, "failed to get autoupdate version after edit") + assert.NotEqual(t, initial.GetSpec().GetToolsVersion(), actual.GetSpec().GetToolsVersion(), + "tools_autoupdate should have been modified by edit") + assert.Equal(t, expected.GetSpec().GetToolsVersion(), actual.GetSpec().GetToolsVersion()) +} diff --git a/tool/tctl/common/resource_command_test.go b/tool/tctl/common/resource_command_test.go index 43002008f28d1..d092e731d0acf 100644 --- a/tool/tctl/common/resource_command_test.go +++ b/tool/tctl/common/resource_command_test.go @@ -41,6 +41,7 @@ import ( "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/discoveryconfig" @@ -1405,6 +1406,14 @@ func TestCreateResources(t *testing.T) { kind: types.KindAppServer, create: testCreateAppServer, }, + { + kind: types.KindAutoupdateConfig, + create: testCreateAutoupdateConfig, + }, + { + kind: types.KindAutoupdateVersion, + create: testCreateAutoupdateVersion, + }, } for _, test := range tests { @@ -2205,6 +2214,78 @@ spec: require.NoError(t, err) } +func testCreateAutoupdateConfig(t *testing.T, clt *authclient.Client) { + const resourceYAML = `kind: autoupdate_config +metadata: + name: autoupdate-config + revision: 3a43b44a-201e-4d7f-aef1-ae2f6d9811ed +spec: + tools_autoupdate: true +version: v1 +` + _, err := runResourceCommand(t, clt, []string{"get", types.KindAutoupdateConfig, "--format=json"}) + require.ErrorContains(t, err, "doesn't exist") + + // Create the resource. + resourceYAMLPath := filepath.Join(t.TempDir(), "resource.yaml") + require.NoError(t, os.WriteFile(resourceYAMLPath, []byte(resourceYAML), 0644)) + _, err = runResourceCommand(t, clt, []string{"create", resourceYAMLPath}) + require.NoError(t, err) + + // Get the resource + buf, err := runResourceCommand(t, clt, []string{"get", types.KindAutoupdateConfig, "--format=json"}) + require.NoError(t, err) + resources := mustDecodeJSON[[]autoupdate.AutoupdateConfig](t, buf) + require.Len(t, resources, 1) + + // Compare with baseline + cmpOpts := []cmp.Option{ + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision", "expires"), + protocmp.Transform(), + } + + var expected autoupdate.AutoupdateConfig + require.NoError(t, yaml.Unmarshal([]byte(resourceYAML), &expected)) + + require.Equal(t, "", cmp.Diff(expected, resources[0], cmpOpts...)) +} + +func testCreateAutoupdateVersion(t *testing.T, clt *authclient.Client) { + const resourceYAML = `kind: autoupdate_version +metadata: + name: autoupdate-version + revision: 3a43b44a-201e-4d7f-aef1-ae2f6d9811ed +spec: + tools_version: 1.2.3 +version: v1 +` + _, err := runResourceCommand(t, clt, []string{"get", types.KindAutoupdateVersion, "--format=json"}) + require.ErrorContains(t, err, "doesn't exist") + + // Create the resource. + resourceYAMLPath := filepath.Join(t.TempDir(), "resource.yaml") + require.NoError(t, os.WriteFile(resourceYAMLPath, []byte(resourceYAML), 0644)) + _, err = runResourceCommand(t, clt, []string{"create", resourceYAMLPath}) + require.NoError(t, err) + + // Get the resource + buf, err := runResourceCommand(t, clt, []string{"get", types.KindAutoupdateVersion, "--format=json"}) + require.NoError(t, err) + resources := mustDecodeJSON[[]autoupdate.AutoupdateVersion](t, buf) + require.Len(t, resources, 1) + + // Compare with baseline + cmpOpts := []cmp.Option{ + protocmp.IgnoreFields(&headerv1.Metadata{}, "revision", "expires"), + protocmp.Transform(), + } + + var expected autoupdate.AutoupdateVersion + require.NoError(t, yaml.Unmarshal([]byte(resourceYAML), &expected)) + + require.Equal(t, "", cmp.Diff(expected, resources[0], cmpOpts...)) +} + func TestPluginResourceWrapper(t *testing.T) { tests := []struct { name string